diff --git a/blob/Image b/blob/Image new file mode 100644 index 0000000..e69de29 diff --git a/blob/dtb b/blob/dtb new file mode 100644 index 0000000..e69de29 diff --git a/include/COPYING b/include/COPYING new file mode 100644 index 0000000..623b625 --- /dev/null +++ b/include/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 2 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. diff --git a/include/COPYING3 b/include/COPYING3 new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/include/COPYING3 @@ -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/include/_ansi.h b/include/_ansi.h new file mode 100644 index 0000000..6c7497e --- /dev/null +++ b/include/_ansi.h @@ -0,0 +1,82 @@ +/* Provide support for both ANSI and non-ANSI environments. */ + +/* To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will + "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header + files aren't affected). */ + +#ifndef _ANSIDECL_H_ +#define _ANSIDECL_H_ + +#include +#include + +/* ISO C++. */ + +#ifdef __cplusplus +#if !(defined(_BEGIN_STD_C) && defined(_END_STD_C)) +#ifdef _HAVE_STD_CXX +#define _BEGIN_STD_C namespace std { extern "C" { +#define _END_STD_C } } +#else +#define _BEGIN_STD_C extern "C" { +#define _END_STD_C } +#endif +#if __GNUC_PREREQ (3, 3) +#define _NOTHROW __attribute__ ((__nothrow__)) +#else +#define _NOTHROW throw() +#endif +#endif +#else +#define _BEGIN_STD_C +#define _END_STD_C +#define _NOTHROW +#endif + +#ifndef _LONG_DOUBLE +#define _LONG_DOUBLE long double +#endif + +/* Support gcc's __attribute__ facility. */ + +#ifdef __GNUC__ +#define _ATTRIBUTE(attrs) __attribute__ (attrs) +#else +#define _ATTRIBUTE(attrs) +#endif + +/* The traditional meaning of 'extern inline' for GCC is not + to emit the function body unless the address is explicitly + taken. However this behaviour is changing to match the C99 + standard, which uses 'extern inline' to indicate that the + function body *must* be emitted. Likewise, a function declared + without either 'extern' or 'static' defaults to extern linkage + (C99 6.2.2p5), and the compiler may choose whether to use the + inline version or call the extern linkage version (6.7.4p6). + If we are using GCC, but do not have the new behaviour, we need + to use extern inline; if we are using a new GCC with the + C99-compatible behaviour, or a non-GCC compiler (which we will + have to hope is C99, since there is no other way to achieve the + effect of omitting the function if it isn't referenced) we use + 'static inline', which c99 defines to mean more-or-less the same + as the Gnu C 'extern inline'. */ +#if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) +/* We're using GCC, but without the new C99-compatible behaviour. */ +#define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__)) +#else +/* We're using GCC in C99 mode, or an unknown compiler which + we just have to hope obeys the C99 semantics of inline. */ +#define _ELIDABLE_INLINE static __inline__ +#endif + +#if __GNUC_PREREQ (3, 1) +#define _NOINLINE __attribute__ ((__noinline__)) +#define _NOINLINE_STATIC _NOINLINE static +#else +/* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be + trusted not to inline if it is static. */ +#define _NOINLINE +#define _NOINLINE_STATIC +#endif + +#endif /* _ANSIDECL_H_ */ diff --git a/include/_newlib_version.h b/include/_newlib_version.h new file mode 100644 index 0000000..d4fffb1 --- /dev/null +++ b/include/_newlib_version.h @@ -0,0 +1,2 @@ +/* dummy file for external tools to use. Real file is created by + newlib configuration. */ diff --git a/include/_syslist.h b/include/_syslist.h new file mode 100644 index 0000000..271644e --- /dev/null +++ b/include/_syslist.h @@ -0,0 +1,40 @@ +/* internal use only -- mapping of "system calls" for libraries that lose + and only provide C names, so that we end up in violation of ANSI */ +#ifndef __SYSLIST_H +#define __SYSLIST_H + +#ifdef MISSING_SYSCALL_NAMES +#define _close close +#define _execve execve +#define _fcntl fcntl +#define _fork fork +#define _fstat fstat +#define _getpid getpid +#define _gettimeofday gettimeofday +#define _isatty isatty +#define _kill kill +#define _link link +#define _lseek lseek +#define _mkdir mkdir +#define _open open +#define _read read +#define _sbrk sbrk +#define _stat stat +#define _times times +#define _unlink unlink +#define _wait wait +#define _write write +#endif /* MISSING_SYSCALL_NAMES */ + +#if defined MISSING_SYSCALL_NAMES || !defined HAVE_OPENDIR +/* If the system call interface is missing opendir, readdir, and + closedir, there is an implementation of these functions in + libc/posix that is implemented using open, getdents, and close. + Note, these functions are currently not in the libc/syscalls + directory. */ +#define _opendir opendir +#define _readdir readdir +#define _closedir closedir +#endif /* MISSING_SYSCALL_NAMES || !HAVE_OPENDIR */ + +#endif /* !__SYSLIST_H_ */ diff --git a/include/alloca-conf.h b/include/alloca-conf.h new file mode 100644 index 0000000..0e9e2c3 --- /dev/null +++ b/include/alloca-conf.h @@ -0,0 +1,60 @@ +/* Copyright 2012 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 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 . */ + +#include "config.h" + +/* This is a merge of code recommended in the autoconf-2.61 documentation + with that recommended in the autoconf-2.13 documentation, with added + tweaks to heed C_ALLOCA. */ + +#if defined HAVE_ALLOCA_H && !defined C_ALLOCA +# include +#else +# if defined __GNUC__ && !defined C_ALLOCA +# if !defined alloca +# define alloca __builtin_alloca +# endif +# else +# if defined _AIX +/* Indented so that pre-ansi C compilers will ignore it, rather than + choke on it. Some versions of AIX require this to be the first + thing seen by the compiler except for comments and preprocessor + directives. */ + #pragma alloca +# else +# if defined _MSC_VER && !defined C_ALLOCA +# include +# define alloca _alloca +# else +# if !defined alloca +# if defined __STDC__ || defined __hpux +# if defined HAVE_STDDEF_H +# include +# if defined __cplusplus +extern "C" void *alloca (size_t); +# else +extern void *alloca (size_t); +# endif +# else +extern void *alloca (); +# endif +# else +extern char *alloca (); +# endif +# endif +# endif +# endif +# endif +#endif diff --git a/include/alloca.h b/include/alloca.h new file mode 100644 index 0000000..5d36318 --- /dev/null +++ b/include/alloca.h @@ -0,0 +1,21 @@ +/* libc/include/alloca.h - Allocate memory on stack */ + +/* Written 2000 by Werner Almesberger */ +/* Rearranged for general inclusion by stdlib.h. + 2001, Corinna Vinschen */ + +#ifndef _NEWLIB_ALLOCA_H +#define _NEWLIB_ALLOCA_H + +#include "_ansi.h" +#include + +#undef alloca + +#ifdef __GNUC__ +#define alloca(size) __builtin_alloca(size) +#else +void * alloca (size_t); +#endif + +#endif diff --git a/include/ansidecl.h b/include/ansidecl.h new file mode 100644 index 0000000..6e4bfc2 --- /dev/null +++ b/include/ansidecl.h @@ -0,0 +1,329 @@ +/* ANSI and traditional C compatability macros + Copyright (C) 1991-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + +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 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, write to the Free Software +Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* ANSI and traditional C compatibility macros + + ANSI C is assumed if __STDC__ is #defined. + + Macro ANSI C definition Traditional C definition + ----- ---- - ---------- ----------- - ---------- + PTR `void *' `char *' + const not defined `' + volatile not defined `' + signed not defined `' + + For ease of writing code which uses GCC extensions but needs to be + portable to other compilers, we provide the GCC_VERSION macro that + simplifies testing __GNUC__ and __GNUC_MINOR__ together, and various + wrappers around __attribute__. Also, __extension__ will be #defined + to nothing if it doesn't work. See below. */ + +#ifndef _ANSIDECL_H +#define _ANSIDECL_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Every source file includes this file, + so they will all get the switch for lint. */ +/* LINTLIBRARY */ + +/* Using MACRO(x,y) in cpp #if conditionals does not work with some + older preprocessors. Thus we can't define something like this: + +#define HAVE_GCC_VERSION(MAJOR, MINOR) \ + (__GNUC__ > (MAJOR) || (__GNUC__ == (MAJOR) && __GNUC_MINOR__ >= (MINOR))) + +and then test "#if HAVE_GCC_VERSION(2,7)". + +So instead we use the macro below and test it against specific values. */ + +/* This macro simplifies testing whether we are using gcc, and if it + is of a particular minimum version. (Both major & minor numbers are + significant.) This macro will evaluate to 0 if we are not using + gcc at all. */ +#ifndef GCC_VERSION +#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__) +#endif /* GCC_VERSION */ + +#if defined (__STDC__) || defined(__cplusplus) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) || defined(_WIN32) +/* All known AIX compilers implement these things (but don't always + define __STDC__). The RISC/OS MIPS compiler defines these things + in SVR4 mode, but does not define __STDC__. */ +/* eraxxon@alumni.rice.edu: The Compaq C++ compiler, unlike many other + C++ compilers, does not define __STDC__, though it acts as if this + was so. (Verified versions: 5.7, 6.2, 6.3, 6.5) */ + +#define PTR void * + +#undef const +#undef volatile +#undef signed + +/* inline requires special treatment; it's in C99, and GCC >=2.7 supports + it too, but it's not in C89. */ +#undef inline +#if __STDC_VERSION__ >= 199901L || defined(__cplusplus) || (defined(__SUNPRO_C) && defined(__C99FEATURES__)) +/* it's a keyword */ +#else +# if GCC_VERSION >= 2007 +# define inline __inline__ /* __inline__ prevents -pedantic warnings */ +# else +# define inline /* nothing */ +# endif +#endif + +#else /* Not ANSI C. */ + +#define PTR char * + +/* some systems define these in header files for non-ansi mode */ +#undef const +#undef volatile +#undef signed +#undef inline +#define const +#define volatile +#define signed +#define inline + +#endif /* ANSI C. */ + +/* Define macros for some gcc attributes. This permits us to use the + macros freely, and know that they will come into play for the + version of gcc in which they are supported. */ + +#if (GCC_VERSION < 2007) +# define __attribute__(x) +#endif + +/* Attribute __malloc__ on functions was valid as of gcc 2.96. */ +#ifndef ATTRIBUTE_MALLOC +# if (GCC_VERSION >= 2096) +# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) +# else +# define ATTRIBUTE_MALLOC +# endif /* GNUC >= 2.96 */ +#endif /* ATTRIBUTE_MALLOC */ + +/* Attributes on labels were valid as of gcc 2.93 and g++ 4.5. For + g++ an attribute on a label must be followed by a semicolon. */ +#ifndef ATTRIBUTE_UNUSED_LABEL +# ifndef __cplusplus +# if GCC_VERSION >= 2093 +# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED +# else +# define ATTRIBUTE_UNUSED_LABEL +# endif +# else +# if GCC_VERSION >= 4005 +# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED ; +# else +# define ATTRIBUTE_UNUSED_LABEL +# endif +# endif +#endif + +/* Similarly to ARG_UNUSED below. Prior to GCC 3.4, the C++ frontend + couldn't parse attributes placed after the identifier name, and now + the entire compiler is built with C++. */ +#ifndef ATTRIBUTE_UNUSED +#if GCC_VERSION >= 3004 +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#else +#define ATTRIBUTE_UNUSED +#endif +#endif /* ATTRIBUTE_UNUSED */ + +/* Before GCC 3.4, the C++ frontend couldn't parse attributes placed after the + identifier name. */ +#if ! defined(__cplusplus) || (GCC_VERSION >= 3004) +# define ARG_UNUSED(NAME) NAME ATTRIBUTE_UNUSED +#else /* !__cplusplus || GNUC >= 3.4 */ +# define ARG_UNUSED(NAME) NAME +#endif /* !__cplusplus || GNUC >= 3.4 */ + +#ifndef ATTRIBUTE_NORETURN +#define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#endif /* ATTRIBUTE_NORETURN */ + +/* Attribute `nonnull' was valid as of gcc 3.3. */ +#ifndef ATTRIBUTE_NONNULL +# if (GCC_VERSION >= 3003) +# define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m))) +# else +# define ATTRIBUTE_NONNULL(m) +# endif /* GNUC >= 3.3 */ +#endif /* ATTRIBUTE_NONNULL */ + +/* Attribute `returns_nonnull' was valid as of gcc 4.9. */ +#ifndef ATTRIBUTE_RETURNS_NONNULL +# if (GCC_VERSION >= 4009) +# define ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__)) +# else +# define ATTRIBUTE_RETURNS_NONNULL +# endif /* GNUC >= 4.9 */ +#endif /* ATTRIBUTE_RETURNS_NONNULL */ + +/* Attribute `pure' was valid as of gcc 3.0. */ +#ifndef ATTRIBUTE_PURE +# if (GCC_VERSION >= 3000) +# define ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define ATTRIBUTE_PURE +# endif /* GNUC >= 3.0 */ +#endif /* ATTRIBUTE_PURE */ + +/* Use ATTRIBUTE_PRINTF when the format specifier must not be NULL. + This was the case for the `printf' format attribute by itself + before GCC 3.3, but as of 3.3 we need to add the `nonnull' + attribute to retain this behavior. */ +#ifndef ATTRIBUTE_PRINTF +#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) ATTRIBUTE_NONNULL(m) +#define ATTRIBUTE_PRINTF_1 ATTRIBUTE_PRINTF(1, 2) +#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3) +#define ATTRIBUTE_PRINTF_3 ATTRIBUTE_PRINTF(3, 4) +#define ATTRIBUTE_PRINTF_4 ATTRIBUTE_PRINTF(4, 5) +#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6) +#endif /* ATTRIBUTE_PRINTF */ + +/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on + a function pointer. Format attributes were allowed on function + pointers as of gcc 3.1. */ +#ifndef ATTRIBUTE_FPTR_PRINTF +# if (GCC_VERSION >= 3001) +# define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n) +# else +# define ATTRIBUTE_FPTR_PRINTF(m, n) +# endif /* GNUC >= 3.1 */ +# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2) +# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3) +# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4) +# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5) +# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6) +#endif /* ATTRIBUTE_FPTR_PRINTF */ + +/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL. A + NULL format specifier was allowed as of gcc 3.3. */ +#ifndef ATTRIBUTE_NULL_PRINTF +# if (GCC_VERSION >= 3003) +# define ATTRIBUTE_NULL_PRINTF(m, n) __attribute__ ((__format__ (__printf__, m, n))) +# else +# define ATTRIBUTE_NULL_PRINTF(m, n) +# endif /* GNUC >= 3.3 */ +# define ATTRIBUTE_NULL_PRINTF_1 ATTRIBUTE_NULL_PRINTF(1, 2) +# define ATTRIBUTE_NULL_PRINTF_2 ATTRIBUTE_NULL_PRINTF(2, 3) +# define ATTRIBUTE_NULL_PRINTF_3 ATTRIBUTE_NULL_PRINTF(3, 4) +# define ATTRIBUTE_NULL_PRINTF_4 ATTRIBUTE_NULL_PRINTF(4, 5) +# define ATTRIBUTE_NULL_PRINTF_5 ATTRIBUTE_NULL_PRINTF(5, 6) +#endif /* ATTRIBUTE_NULL_PRINTF */ + +/* Attribute `sentinel' was valid as of gcc 3.5. */ +#ifndef ATTRIBUTE_SENTINEL +# if (GCC_VERSION >= 3005) +# define ATTRIBUTE_SENTINEL __attribute__ ((__sentinel__)) +# else +# define ATTRIBUTE_SENTINEL +# endif /* GNUC >= 3.5 */ +#endif /* ATTRIBUTE_SENTINEL */ + + +#ifndef ATTRIBUTE_ALIGNED_ALIGNOF +# if (GCC_VERSION >= 3000) +# define ATTRIBUTE_ALIGNED_ALIGNOF(m) __attribute__ ((__aligned__ (__alignof__ (m)))) +# else +# define ATTRIBUTE_ALIGNED_ALIGNOF(m) +# endif /* GNUC >= 3.0 */ +#endif /* ATTRIBUTE_ALIGNED_ALIGNOF */ + +/* Useful for structures whose layout must much some binary specification + regardless of the alignment and padding qualities of the compiler. */ +#ifndef ATTRIBUTE_PACKED +# define ATTRIBUTE_PACKED __attribute__ ((packed)) +#endif + +/* Attribute `hot' and `cold' was valid as of gcc 4.3. */ +#ifndef ATTRIBUTE_COLD +# if (GCC_VERSION >= 4003) +# define ATTRIBUTE_COLD __attribute__ ((__cold__)) +# else +# define ATTRIBUTE_COLD +# endif /* GNUC >= 4.3 */ +#endif /* ATTRIBUTE_COLD */ +#ifndef ATTRIBUTE_HOT +# if (GCC_VERSION >= 4003) +# define ATTRIBUTE_HOT __attribute__ ((__hot__)) +# else +# define ATTRIBUTE_HOT +# endif /* GNUC >= 4.3 */ +#endif /* ATTRIBUTE_HOT */ + +/* Attribute 'no_sanitize_undefined' was valid as of gcc 4.9. */ +#ifndef ATTRIBUTE_NO_SANITIZE_UNDEFINED +# if (GCC_VERSION >= 4009) +# define ATTRIBUTE_NO_SANITIZE_UNDEFINED __attribute__ ((no_sanitize_undefined)) +# else +# define ATTRIBUTE_NO_SANITIZE_UNDEFINED +# endif /* GNUC >= 4.9 */ +#endif /* ATTRIBUTE_NO_SANITIZE_UNDEFINED */ + +/* We use __extension__ in some places to suppress -pedantic warnings + about GCC extensions. This feature didn't work properly before + gcc 2.8. */ +#if GCC_VERSION < 2008 +#define __extension__ +#endif + +/* This is used to declare a const variable which should be visible + outside of the current compilation unit. Use it as + EXPORTED_CONST int i = 1; + This is because the semantics of const are different in C and C++. + "extern const" is permitted in C but it looks strange, and gcc + warns about it when -Wc++-compat is not used. */ +#ifdef __cplusplus +#define EXPORTED_CONST extern const +#else +#define EXPORTED_CONST const +#endif + +/* Be conservative and only use enum bitfields with C++ or GCC. + FIXME: provide a complete autoconf test for buggy enum bitfields. */ + +#ifdef __cplusplus +#define ENUM_BITFIELD(TYPE) enum TYPE +#elif (GCC_VERSION > 2000) +#define ENUM_BITFIELD(TYPE) __extension__ enum TYPE +#else +#define ENUM_BITFIELD(TYPE) unsigned int +#endif + + /* This is used to mark a class or virtual function as final. */ +#if __cplusplus >= 201103L +#define GCC_FINAL final +#elif GCC_VERSION >= 4007 +#define GCC_FINAL __final +#else +#define GCC_FINAL +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ansidecl.h */ diff --git a/include/aout/ChangeLog b/include/aout/ChangeLog new file mode 100644 index 0000000..b4d4139 --- /dev/null +++ b/include/aout/ChangeLog @@ -0,0 +1,262 @@ +2010-04-15 Nick Clifton + + * adobe.h: Update copyright notice to use GPLv3. + * aout64.h: Likewise. + * ar.h: Likewise. + * dynix3.h: Likewise. + * encap.h: Likewise. + * host.h: Likewise. + * hp.h: Likewise. + * hp300hpux.h: Likewise. + * ranlib.h: Likewise. + * reloc.h: Likewise. + * stab.def: Likewise. + * stab_gnu.h: Likewise. + * sun4.h: Likewise. + +2009-10-02 Alan Modra + + * aout64.h (N_SHARED_LIB): Define as zero if not already defined. + * sun4.h (N_SHARED_LIB): Define. + * hp300hpux.h (N_SHARED_LIB): Don't define. + +2008-08-28 Tristan Gingold + + * stab.def: Add BNSYM, ENSYM, OSO for darwin. + +2008-03-27 Cary Coutant + + * ar.h (ARMAGT): New magic string for thin archives. + +2005-08-18 Alan Modra + + * encap.h: Remove a29k support. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + adobe.h, aout64.h, ar.h, dynix3.h, encap.h, host.h, hp.h, + ranlib.h, reloc.h, stab.def, stab_gnu.h, sun4.h + +2004-01-06 Mark Kettenis + + * stab.def: Add N_PATCH to DO definition. + +2003-03-06 Elias Athanasopoulos + + * aout64.h (BYTES_IN_WORD): Define if necessary. + +2001-09-18 Alan Modra + + * aout64.h: Formatting fixes. + (N_TXTADDR): Evaluate to a bfd_vma. + (N_DATADDR): Avoid negative unsigned warning. + * hp300hpux.h: Formatting fixes. + (N_DATADDR): Avoid negative unsigned warning. + +2000-04-03 Hans-Peter Nilsson + + * aout64.h (RELOC_EXT_BITS_EXTERN_BIG): Wrap definition in #ifndef. + (RELOC_EXT_BITS_EXTERN_LITTLE): Ditto. + (RELOC_EXT_BITS_TYPE_BIG): Ditto. + (RELOC_EXT_BITS_TYPE_SH_BIG): Ditto. + (RELOC_EXT_BITS_TYPE_LITTLE): Ditto. + (RELOC_EXT_BITS_TYPE_SH_LITTLE): Ditto. + +1999-07-12 Ian Lance Taylor + + * aout64.h (N_SHARED_LIB): Define as 0 if TEXT_START_ADDR is + defined as 0. + +1998-06-28 Peter Schauer + + * stab.def: Add N_ALIAS from SunPro F77. + +1996-03-11 Ian Lance Taylor + + * stab.def: Use __define_stab_duplicate rather than __define_stab + for duplicate entries N_BROWS and N_MOD2. + * stab_gnu.h (__define_stab_duplicate): Define before including + stab.def. + +1995-10-27 Niklas Hallqvist + + * aout64.h, host.h, hp300hpux.h, sun4.h: Changed PAGE_SIZE to + TARGET_PAGE_SIZE. + +1995-09-12 Ian Lance Taylor + + * sun4.h (struct internal_sun4_dynamic_link): Change all fields + from long to unsigned long. + +1995-07-12 Ken Raeburn + + * sun4.h (PAGE_SIZE): Undefine before defining. + +1994-09-04 Richard Earnshaw (rwe@pegasus.esprit.ec.org) + + * aout64.h: Only define QMAGIC if it isn't already defined. + +1994-06-16 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * aout64.h (BMAGIC): Define. + +1994-06-11 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + Add weak symbols as an extension to a.out. + * aout64.h (N_WEAKU, N_WEAKA, N_WEAKT, N_WEAKD, N_WEAKB): Define. + * stab.def: Update symbol value table. + +1994-06-02 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * sun4.h (EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE): Correct from 28 to + 24. Fix up ld_got comment. + +1994-03-30 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * dynix3.h: Cleanup, adapt to current bfd version. + +1994-02-26 Ian Lance Taylor (ian@cygnus.com) + + * aout64.h: Add casts to avoid warnings from SVR4 cc. + +1994-02-11 Stan Shebs (shebs@andros.cygnus.com) + + * ar.h (ARMAG, ARMAGB, ARFMAG): Change '\n' to '\012', for greater + portability. + +1994-01-21 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * sun4.h: Added information about SunOS shared libraries. + +1994-01-07 Jim Kingdon (kingdon@deneb.cygnus.com) + + * aout64.h (N_TXTADDR): Add comment regarding OMAGIC and NMAGIC. + +1993-12-25 Jim Kingdon (kingdon@lioth.cygnus.com) + + * aout64.h (N_DATOFF): Don't pad (revert change of 8 Jul 1993). + +1993-11-16 Jim Kingdon (kingdon@lioth.cygnus.com) + + * aout64.h: New macros ZMAGIC_DISK_BLOCK_SIZE and N_DISK_BLOCK_SIZE + for Linux ZMAGIC. + (N_TXTOFF, N_DATOFF): Use them. + +1993-11-04 Ken Raeburn (raeburn@kr-pc.cygnus.com) + + * aout64.h (RELOC_STD_BITS_RELATIVE_LITTLE): Fixed value to match + sun3 system; used to overlap other fields. + (RELOC_STD_BITS_JMPTABLE_LITTLE): Likewise. + +1993-11-03 David J. Mackenzie (djm@thepub.cygnus.com) + + * aout64.h (RELOC_STD_BITS_BASEREL_LITTLE): Make it 0x10 (Ken's + suggestion) to avoid conflict with RELOC_STD_BITS_EXTERN_LITTLE. + +1993-10-29 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * hp300hpux.h (N_SHARED_LIB): Define to be 0. + +1993-09-13 John Gilmore (gnu@cygnus.com) + + * ar.h (ARMAP_TIME_OFFSET): Add and describe. + +Mon Aug 23 Sean Fagan (sef@cygnus.com) + + * aout64.h [ARCH_SIZE != 64]: Allow N_BADMAG to be overridden. + +1993-08-16 Jim Kingdon (kingdon@lioth.cygnus.com) + + * stab_gnu.h: Include aout/stab.def not just stab.def. + +1993-07-18 Jim Kingdon (kingdon@rtl.cygnus.com) + + * dynix3.h: New, for symmetry running dynix. + +1993-07-08 Jim Kingdon (kingdon@lioth.cygnus.com) + + * aout64.h (N_BADMAG): Recognize QMAGIC. + N_TXTOFF, N_TXTADDR, N_TXTSIZE: Special code for QMAGIC. + N_DATOFF: Pad text size if we need to. + +1993-06-18 Jim Kingdon (kingdon@lioth.cygnus.com) + + * stab.def (N_ECOML): Fix comment. + +1993-05-31 Jim Kingdon (kingdon@cygnus.com) + + * stab.def: Remove Solaris information on N_FUN stabstring grammar; + I've transferred it to gdb/doc/stabs.texinfo, where it belongs. + +1993-05-10 Ken Raeburn (raeburn@kr-pc.cygnus.com) + + * hp300hpux.h: Patch from Glenn Engel for linker problem and + compatibility fix: + (OMAGIC, NMAGIC): New definitions. + (SHAREMAGIC): Deleted. + (HPUX_DOT_O_MAGIC): New macro. + (_N_BADMAG): Adjusted. + (N_HEADER_IN_TEXT, N_DATADDR): New macros. + +1993-04-29 Ken Raeburn (raeburn@deneb.cygnus.com) + + * hp300hpux.h: New file from Glenn Engel, glenne@lsid.hp.com. + +1993-04-27 Ken Raeburn (raeburn@kr-pc.cygnus.com) + + * aout64.h (struct external_exec, *MAGIC, N_BADMAG): Don't define + if `external_exec' is already defined as a macro. + (N_DATOFF, N_TRELOFF, N_DRELOFF, N_SYMOFF, N_STROFF): Don't define + if already defined. + (struct external_nlist, EXTERNAL_NLIST_SIZE): Don't define if + `external_nlist' is already defined as a macro. + +1992-08-15 John Gilmore (gnu@cygnus.com) + + * adobe.h: Add description of a.out.adobe format. + +1992-07-03 John Gilmore (gnu at cygnus.com) + + * stab.def: Update more Solaris definitions. + * stab_gnu.h: Add N_SO language types, and Solaris basic float types. + +1992-06-14 John Gilmore (gnu at cygnus.com) + + * stab.def: Update descriptions of Solaris-2 stabs; add N_UNDF. + +1992-06-11 John Gilmore (gnu at cygnus.com) + + * stab.def: Add N_OBJ and N_OPT from Solaris-2. + +1992-01-30 John Gilmore (gnu at cygnus.com) + + * aout64.h: N_TXTSIZE needs some more parentheses. + I don't trust C precedence. + +1991-12-18 Per Bothner (bothner at cygnus.com) + + * aout64.h: Move common sunos-specific test + to recognize shared libraries into new macro N_SHARED_LIB. + Use it to simplify & reformat N_TXTADDR, N_TXTOFF, N_TXTSIZE. + +1991-11-30 Steve Chamberlain (sac at rtl.cygnus.com) + + * aout64.h, ar.h, encap.h, host.h, hp.h, ranlib.h, reloc.h, + stab.def, stab_gnu.h, sun4.h: All moved from the devo/include + directory. + + +Copyright (C) 1991-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/aout/adobe.h b/include/aout/adobe.h new file mode 100644 index 0000000..ce22552 --- /dev/null +++ b/include/aout/adobe.h @@ -0,0 +1,314 @@ +/* `a.out.adobe' differences from standard a.out files + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef __A_OUT_ADOBE_H__ +#define __A_OUT_ADOBE_H__ + +#define BYTES_IN_WORD 4 + +/* Struct external_exec is the same. */ + +/* This is the layout on disk of the 32-bit or 64-bit exec header. */ + +struct external_exec +{ + bfd_byte e_info[4]; /* magic number and stuff */ + bfd_byte e_text[BYTES_IN_WORD]; /* length of text section in bytes */ + bfd_byte e_data[BYTES_IN_WORD]; /* length of data section in bytes */ + bfd_byte e_bss[BYTES_IN_WORD]; /* length of bss area in bytes */ + bfd_byte e_syms[BYTES_IN_WORD]; /* length of symbol table in bytes */ + bfd_byte e_entry[BYTES_IN_WORD]; /* start address */ + bfd_byte e_trsize[BYTES_IN_WORD]; /* length of text relocation info */ + bfd_byte e_drsize[BYTES_IN_WORD]; /* length of data relocation info */ +}; + +#define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) + +/* Magic numbers for a.out files */ + +#undef ZMAGIC +#define ZMAGIC 0xAD0BE /* Cute, eh? */ +#undef OMAGIC +#undef NMAGIC + +#define N_BADMAG(x) ((x).a_info != ZMAGIC) + +/* By default, segment size is constant. But some machines override this + to be a function of the a.out header (e.g. machine type). */ +#ifndef N_SEGSIZE +#define N_SEGSIZE(x) SEGMENT_SIZE +#endif +#undef N_SEGSIZE /* FIXMEXXXX */ + +/* Segment information for the a.out.Adobe format is specified after the + file header. It contains N segment descriptors, followed by one with + a type of zero. + + The actual text of the segments starts at N_TXTOFF in the file, + regardless of how many or how few segment headers there are. */ + +struct external_segdesc { + unsigned char e_type[1]; + unsigned char e_size[3]; + unsigned char e_virtbase[4]; + unsigned char e_filebase[4]; +}; + +struct internal_segdesc { + unsigned int a_type:8; /* Segment type N_TEXT, N_DATA, 0 */ + unsigned int a_size:24; /* Segment size */ + bfd_vma a_virtbase; /* Virtual address */ + unsigned int a_filebase; /* Base address in object file */ +}; + +#define N_TXTADDR(x) \ + +/* This is documented to be at 1024, but appears to really be at 2048. + FIXME?! */ +#define N_TXTOFF(x) 2048 + +#define N_TXTSIZE(x) ((x).a_text) + +#define N_DATADDR(x) + +#define N_BSSADDR(x) + +/* Offsets of the various portions of the file after the text segment. */ + +#define N_DATOFF(x) ( N_TXTOFF(x) + N_TXTSIZE(x) ) +#define N_TRELOFF(x) ( N_DATOFF(x) + (x).a_data ) +#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) +#define N_SYMOFF(x) ( N_DRELOFF(x) + (x).a_drsize ) +#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) + +/* Symbols */ +struct external_nlist { + bfd_byte e_strx[BYTES_IN_WORD]; /* index into string table of name */ + bfd_byte e_type[1]; /* type of symbol */ + bfd_byte e_other[1]; /* misc info (usually empty) */ + bfd_byte e_desc[2]; /* description field */ + bfd_byte e_value[BYTES_IN_WORD]; /* value of symbol */ +}; + +#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) + +struct internal_nlist { + unsigned long n_strx; /* index into string table of name */ + unsigned char n_type; /* type of symbol */ + unsigned char n_other; /* misc info (usually empty) */ + unsigned short n_desc; /* description field */ + bfd_vma n_value; /* value of symbol */ +}; + +/* The n_type field is the symbol type, containing: */ + +#define N_UNDF 0 /* Undefined symbol */ +#define N_ABS 2 /* Absolute symbol -- defined at particular addr */ +#define N_TEXT 4 /* Text sym -- defined at offset in text seg */ +#define N_DATA 6 /* Data sym -- defined at offset in data seg */ +#define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg */ +#define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink) */ +#define N_FN 0x1f /* File name of .o file */ +#define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh) */ +/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, + N_DATA, or N_BSS. When the low-order bit of other types is set, + (e.g. N_WARNING versus N_FN), they are two different types. */ +#define N_EXT 1 /* External symbol (as opposed to local-to-this-file) */ +#define N_TYPE 0x1e +#define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol */ + +#define N_INDR 0x0a + +/* The following symbols refer to set elements. + All the N_SET[ATDB] symbols with the same name form one set. + Space is allocated for the set in the text section, and each set + elements value is stored into one word of the space. + The first word of the space is the length of the set (number of elements). + + The address of the set is made into an N_SETV symbol + whose name is the same as the name of the set. + This symbol acts like a N_DATA global symbol + in that it can satisfy undefined external references. */ + +/* These appear as input to LD, in a .o file. */ +#define N_SETA 0x14 /* Absolute set element symbol */ +#define N_SETT 0x16 /* Text set element symbol */ +#define N_SETD 0x18 /* Data set element symbol */ +#define N_SETB 0x1A /* Bss set element symbol */ + +/* This is output from LD. */ +#define N_SETV 0x1C /* Pointer to set vector in data area. */ + +/* Warning symbol. The text gives a warning message, the next symbol + in the table will be undefined. When the symbol is referenced, the + message is printed. */ + +#define N_WARNING 0x1e + +/* Relocations + + There are two types of relocation flavours for a.out systems, + standard and extended. The standard form is used on systems where the + instruction has room for all the bits of an offset to the operand, whilst + the extended form is used when an address operand has to be split over n + instructions. Eg, on the 68k, each move instruction can reference + the target with a displacement of 16 or 32 bits. On the sparc, move + instructions use an offset of 14 bits, so the offset is stored in + the reloc field, and the data in the section is ignored. +*/ + +/* This structure describes a single relocation to be performed. + The text-relocation section of the file is a vector of these structures, + all of which apply to the text section. + Likewise, the data-relocation section applies to the data section. */ + +struct reloc_std_external { + bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ + bfd_byte r_index[3]; /* symbol table index of symbol */ + bfd_byte r_type[1]; /* relocation type */ +}; + +#define RELOC_STD_BITS_PCREL_BIG 0x80 +#define RELOC_STD_BITS_PCREL_LITTLE 0x01 + +#define RELOC_STD_BITS_LENGTH_BIG 0x60 +#define RELOC_STD_BITS_LENGTH_SH_BIG 5 /* To shift to units place */ +#define RELOC_STD_BITS_LENGTH_LITTLE 0x06 +#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 + +#define RELOC_STD_BITS_EXTERN_BIG 0x10 +#define RELOC_STD_BITS_EXTERN_LITTLE 0x08 + +#define RELOC_STD_BITS_BASEREL_BIG 0x08 +#define RELOC_STD_BITS_BASEREL_LITTLE 0x08 + +#define RELOC_STD_BITS_JMPTABLE_BIG 0x04 +#define RELOC_STD_BITS_JMPTABLE_LITTLE 0x04 + +#define RELOC_STD_BITS_RELATIVE_BIG 0x02 +#define RELOC_STD_BITS_RELATIVE_LITTLE 0x02 + +#define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry */ + +struct reloc_std_internal +{ + bfd_vma r_address; /* Address (within segment) to be relocated. */ + /* The meaning of r_symbolnum depends on r_extern. */ + unsigned int r_symbolnum:24; + /* Nonzero means value is a pc-relative offset + and it should be relocated for changes in its own address + as well as for changes in the symbol or section specified. */ + unsigned int r_pcrel:1; + /* Length (as exponent of 2) of the field to be relocated. + Thus, a value of 2 indicates 1<<2 bytes. */ + unsigned int r_length:2; + /* 1 => relocate with value of symbol. + r_symbolnum is the index of the symbol + in files the symbol table. + 0 => relocate with the address of a segment. + r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS + (the N_EXT bit may be set also, but signifies nothing). */ + unsigned int r_extern:1; + /* The next three bits are for SunOS shared libraries, and seem to + be undocumented. */ + unsigned int r_baserel:1; /* Linkage table relative */ + unsigned int r_jmptable:1; /* pc-relative to jump table */ + unsigned int r_relative:1; /* "relative relocation" */ + /* unused */ + unsigned int r_pad:1; /* Padding -- set to zero */ +}; + + +/* EXTENDED RELOCS */ + +struct reloc_ext_external { + bfd_byte r_address[BYTES_IN_WORD]; /* offset of of data to relocate */ + bfd_byte r_index[3]; /* symbol table index of symbol */ + bfd_byte r_type[1]; /* relocation type */ + bfd_byte r_addend[BYTES_IN_WORD]; /* datum addend */ +}; + +#define RELOC_EXT_BITS_EXTERN_BIG 0x80 +#define RELOC_EXT_BITS_EXTERN_LITTLE 0x01 + +#define RELOC_EXT_BITS_TYPE_BIG 0x1F +#define RELOC_EXT_BITS_TYPE_SH_BIG 0 +#define RELOC_EXT_BITS_TYPE_LITTLE 0xF8 +#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 + +/* Bytes per relocation entry */ +#define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) + +enum reloc_type +{ + /* simple relocations */ + RELOC_8, /* data[0:7] = addend + sv */ + RELOC_16, /* data[0:15] = addend + sv */ + RELOC_32, /* data[0:31] = addend + sv */ + /* pc-rel displacement */ + RELOC_DISP8, /* data[0:7] = addend - pc + sv */ + RELOC_DISP16, /* data[0:15] = addend - pc + sv */ + RELOC_DISP32, /* data[0:31] = addend - pc + sv */ + /* Special */ + RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ + RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ + RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ + RELOC_22, /* data[0:21] = (addend + sv) */ + RELOC_13, /* data[0:12] = (addend + sv) */ + RELOC_LO10, /* data[0:9] = (addend + sv) */ + RELOC_SFA_BASE, + RELOC_SFA_OFF13, + /* P.I.C. (base-relative) */ + RELOC_BASE10, /* Not sure - maybe we can do this the */ + RELOC_BASE13, /* right way now */ + RELOC_BASE22, + /* for some sort of pc-rel P.I.C. (?) */ + RELOC_PC10, + RELOC_PC22, + /* P.I.C. jump table */ + RELOC_JMP_TBL, + /* reputedly for shared libraries somehow */ + RELOC_SEGOFF16, + RELOC_GLOB_DAT, + RELOC_JMP_SLOT, + RELOC_RELATIVE, + + RELOC_11, + RELOC_WDISP2_14, + RELOC_WDISP19, + RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ + RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ + + /* 29K relocation types */ + RELOC_JUMPTARG, + RELOC_CONST, + RELOC_CONSTH, + + NO_RELOC + }; + + +struct reloc_internal { + bfd_vma r_address; /* offset of of data to relocate */ + long r_index; /* symbol table index of symbol */ + enum reloc_type r_type; /* relocation type */ + bfd_vma r_addend; /* datum addend */ +}; + +#endif /* __A_OUT_ADOBE_H__ */ diff --git a/include/aout/aout64.h b/include/aout/aout64.h new file mode 100644 index 0000000..384909e --- /dev/null +++ b/include/aout/aout64.h @@ -0,0 +1,516 @@ +/* `a.out' object-file definitions, including extensions to 64-bit fields + + Copyright 1999, 2000, 2001, 2003, 2009, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef __A_OUT_64_H__ +#define __A_OUT_64_H__ + +#ifndef BYTES_IN_WORD +#define BYTES_IN_WORD 4 +#endif + +/* This is the layout on disk of the 32-bit or 64-bit exec header. */ + +#ifndef external_exec +struct external_exec +{ + bfd_byte e_info[4]; /* Magic number and stuff. */ + bfd_byte e_text[BYTES_IN_WORD]; /* Length of text section in bytes. */ + bfd_byte e_data[BYTES_IN_WORD]; /* Length of data section in bytes. */ + bfd_byte e_bss[BYTES_IN_WORD]; /* Length of bss area in bytes. */ + bfd_byte e_syms[BYTES_IN_WORD]; /* Length of symbol table in bytes. */ + bfd_byte e_entry[BYTES_IN_WORD]; /* Start address. */ + bfd_byte e_trsize[BYTES_IN_WORD]; /* Length of text relocation info. */ + bfd_byte e_drsize[BYTES_IN_WORD]; /* Length of data relocation info. */ +}; + +#define EXEC_BYTES_SIZE (4 + BYTES_IN_WORD * 7) + +/* Magic numbers for a.out files. */ + +#if ARCH_SIZE==64 +#define OMAGIC 0x1001 /* Code indicating object file. */ +#define ZMAGIC 0x1002 /* Code indicating demand-paged executable. */ +#define NMAGIC 0x1003 /* Code indicating pure executable. */ + +/* There is no 64-bit QMAGIC as far as I know. */ + +#define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ + && N_MAGIC(x) != NMAGIC \ + && N_MAGIC(x) != ZMAGIC) +#else +#define OMAGIC 0407 /* Object file or impure executable. */ +#define NMAGIC 0410 /* Code indicating pure executable. */ +#define ZMAGIC 0413 /* Code indicating demand-paged executable. */ +#define BMAGIC 0415 /* Used by a b.out object. */ + +/* This indicates a demand-paged executable with the header in the text. + It is used by 386BSD (and variants) and Linux, at least. */ +#ifndef QMAGIC +#define QMAGIC 0314 +#endif +# ifndef N_BADMAG +# define N_BADMAG(x) (N_MAGIC(x) != OMAGIC \ + && N_MAGIC(x) != NMAGIC \ + && N_MAGIC(x) != ZMAGIC \ + && N_MAGIC(x) != QMAGIC) +# endif /* N_BADMAG */ +#endif + +#endif + +#ifdef QMAGIC +#define N_IS_QMAGIC(x) (N_MAGIC (x) == QMAGIC) +#else +#define N_IS_QMAGIC(x) (0) +#endif + +/* The difference between TARGET_PAGE_SIZE and N_SEGSIZE is that TARGET_PAGE_SIZE is + the finest granularity at which you can page something, thus it + controls the padding (if any) before the text segment of a ZMAGIC + file. N_SEGSIZE is the resolution at which things can be marked as + read-only versus read/write, so it controls the padding between the + text segment and the data segment (in memory; on disk the padding + between them is TARGET_PAGE_SIZE). TARGET_PAGE_SIZE and N_SEGSIZE are the same + for most machines, but different for sun3. */ + +/* By default, segment size is constant. But some machines override this + to be a function of the a.out header (e.g. machine type). */ + +#ifndef N_SEGSIZE +#define N_SEGSIZE(x) SEGMENT_SIZE +#endif + +/* Virtual memory address of the text section. + This is getting very complicated. A good reason to discard a.out format + for something that specifies these fields explicitly. But til then... + + * OMAGIC and NMAGIC files: + (object files: text for "relocatable addr 0" right after the header) + start at 0, offset is EXEC_BYTES_SIZE, size as stated. + * The text address, offset, and size of ZMAGIC files depend + on the entry point of the file: + * entry point below TEXT_START_ADDR: + (hack for SunOS shared libraries) + start at 0, offset is 0, size as stated. + * If N_HEADER_IN_TEXT(x) is true (which defaults to being the + case when the entry point is EXEC_BYTES_SIZE or further into a page): + no padding is needed; text can start after exec header. Sun + considers the text segment of such files to include the exec header; + for BFD's purposes, we don't, which makes more work for us. + start at TEXT_START_ADDR + EXEC_BYTES_SIZE, offset is EXEC_BYTES_SIZE, + size as stated minus EXEC_BYTES_SIZE. + * If N_HEADER_IN_TEXT(x) is false (which defaults to being the case when + the entry point is less than EXEC_BYTES_SIZE into a page (e.g. page + aligned)): (padding is needed so that text can start at a page boundary) + start at TEXT_START_ADDR, offset TARGET_PAGE_SIZE, size as stated. + + Specific configurations may want to hardwire N_HEADER_IN_TEXT, + for efficiency or to allow people to play games with the entry point. + In that case, you would #define N_HEADER_IN_TEXT(x) as 1 for sunos, + and as 0 for most other hosts (Sony News, Vax Ultrix, etc). + (Do this in the appropriate bfd target file.) + (The default is a heuristic that will break if people try changing + the entry point, perhaps with the ld -e flag.) + + * QMAGIC is always like a ZMAGIC for which N_HEADER_IN_TEXT is true, + and for which the starting address is TARGET_PAGE_SIZE (or should this be + SEGMENT_SIZE?) (TEXT_START_ADDR only applies to ZMAGIC, not to QMAGIC). */ + +/* This macro is only relevant for ZMAGIC files; QMAGIC always has the header + in the text. */ +#ifndef N_HEADER_IN_TEXT +#define N_HEADER_IN_TEXT(x) \ + (((x).a_entry & (TARGET_PAGE_SIZE-1)) >= EXEC_BYTES_SIZE) +#endif + +/* Sun shared libraries, not linux. This macro is only relevant for ZMAGIC + files. */ +#ifndef N_SHARED_LIB +#define N_SHARED_LIB(x) (0) +#endif + +/* Returning 0 not TEXT_START_ADDR for OMAGIC and NMAGIC is based on + the assumption that we are dealing with a .o file, not an + executable. This is necessary for OMAGIC (but means we don't work + right on the output from ld -N); more questionable for NMAGIC. */ + +#ifndef N_TXTADDR +#define N_TXTADDR(x) \ + (/* The address of a QMAGIC file is always one page in, \ + with the header in the text. */ \ + N_IS_QMAGIC (x) \ + ? (bfd_vma) TARGET_PAGE_SIZE + EXEC_BYTES_SIZE \ + : (N_MAGIC (x) != ZMAGIC \ + ? (bfd_vma) 0 /* Object file or NMAGIC. */ \ + : (N_SHARED_LIB (x) \ + ? (bfd_vma) 0 \ + : (N_HEADER_IN_TEXT (x) \ + ? (bfd_vma) TEXT_START_ADDR + EXEC_BYTES_SIZE \ + : (bfd_vma) TEXT_START_ADDR)))) +#endif + +/* If N_HEADER_IN_TEXT is not true for ZMAGIC, there is some padding + to make the text segment start at a certain boundary. For most + systems, this boundary is TARGET_PAGE_SIZE. But for Linux, in the + time-honored tradition of crazy ZMAGIC hacks, it is 1024 which is + not what TARGET_PAGE_SIZE needs to be for QMAGIC. */ + +#ifndef ZMAGIC_DISK_BLOCK_SIZE +#define ZMAGIC_DISK_BLOCK_SIZE TARGET_PAGE_SIZE +#endif + +#define N_DISK_BLOCK_SIZE(x) \ + (N_MAGIC(x) == ZMAGIC ? ZMAGIC_DISK_BLOCK_SIZE : TARGET_PAGE_SIZE) + +/* Offset in an a.out of the start of the text section. */ +#ifndef N_TXTOFF +#define N_TXTOFF(x) \ + (/* For {O,N,Q}MAGIC, no padding. */ \ + N_MAGIC (x) != ZMAGIC \ + ? EXEC_BYTES_SIZE \ + : (N_SHARED_LIB (x) \ + ? 0 \ + : (N_HEADER_IN_TEXT (x) \ + ? EXEC_BYTES_SIZE /* No padding. */ \ + : ZMAGIC_DISK_BLOCK_SIZE /* A page of padding. */))) +#endif +/* Size of the text section. It's always as stated, except that we + offset it to `undo' the adjustment to N_TXTADDR and N_TXTOFF + for ZMAGIC files that nominally include the exec header + as part of the first page of text. (BFD doesn't consider the + exec header to be part of the text segment.) */ +#ifndef N_TXTSIZE +#define N_TXTSIZE(x) \ + (/* For QMAGIC, we don't consider the header part of the text section. */\ + N_IS_QMAGIC (x) \ + ? (x).a_text - EXEC_BYTES_SIZE \ + : ((N_MAGIC (x) != ZMAGIC || N_SHARED_LIB (x)) \ + ? (x).a_text \ + : (N_HEADER_IN_TEXT (x) \ + ? (x).a_text - EXEC_BYTES_SIZE /* No padding. */ \ + : (x).a_text /* A page of padding. */ ))) +#endif +/* The address of the data segment in virtual memory. + It is the text segment address, plus text segment size, rounded + up to a N_SEGSIZE boundary for pure or pageable files. */ +#ifndef N_DATADDR +#define N_DATADDR(x) \ + (N_MAGIC (x) == OMAGIC \ + ? (N_TXTADDR (x) + N_TXTSIZE (x)) \ + : (N_SEGSIZE (x) + ((N_TXTADDR (x) + N_TXTSIZE (x) - 1) \ + & ~ (bfd_vma) (N_SEGSIZE (x) - 1)))) +#endif +/* The address of the BSS segment -- immediately after the data segment. */ + +#define N_BSSADDR(x) (N_DATADDR (x) + (x).a_data) + +/* Offsets of the various portions of the file after the text segment. */ + +/* For {Q,Z}MAGIC, there is padding to make the data segment start on + a page boundary. Most of the time the a_text field (and thus + N_TXTSIZE) already contains this padding. It is possible that for + BSDI and/or 386BSD it sometimes doesn't contain the padding, and + perhaps we should be adding it here. But this seems kind of + questionable and probably should be BSDI/386BSD-specific if we do + do it. + + For NMAGIC (at least for hp300 BSD, probably others), there is + padding in memory only, not on disk, so we must *not* ever pad here + for NMAGIC. */ + +#ifndef N_DATOFF +#define N_DATOFF(x) (N_TXTOFF (x) + N_TXTSIZE (x)) +#endif +#ifndef N_TRELOFF +#define N_TRELOFF(x) (N_DATOFF (x) + (x).a_data) +#endif +#ifndef N_DRELOFF +#define N_DRELOFF(x) (N_TRELOFF (x) + (x).a_trsize) +#endif +#ifndef N_SYMOFF +#define N_SYMOFF(x) (N_DRELOFF (x) + (x).a_drsize) +#endif +#ifndef N_STROFF +#define N_STROFF(x) (N_SYMOFF (x) + (x).a_syms) +#endif + +/* Symbols */ +#ifndef external_nlist +struct external_nlist +{ + bfd_byte e_strx[BYTES_IN_WORD]; /* Index into string table of name. */ + bfd_byte e_type[1]; /* Type of symbol. */ + bfd_byte e_other[1]; /* Misc info (usually empty). */ + bfd_byte e_desc[2]; /* Description field. */ + bfd_byte e_value[BYTES_IN_WORD]; /* Value of symbol. */ +}; +#define EXTERNAL_NLIST_SIZE (BYTES_IN_WORD+4+BYTES_IN_WORD) +#endif + +struct internal_nlist +{ + unsigned long n_strx; /* Index into string table of name. */ + unsigned char n_type; /* Type of symbol. */ + unsigned char n_other; /* Misc info (usually empty). */ + unsigned short n_desc; /* Description field. */ + bfd_vma n_value; /* Value of symbol. */ +}; + +/* The n_type field is the symbol type, containing: */ + +#define N_UNDF 0 /* Undefined symbol. */ +#define N_ABS 2 /* Absolute symbol -- defined at particular addr. */ +#define N_TEXT 4 /* Text sym -- defined at offset in text seg. */ +#define N_DATA 6 /* Data sym -- defined at offset in data seg. */ +#define N_BSS 8 /* BSS sym -- defined at offset in zero'd seg. */ +#define N_COMM 0x12 /* Common symbol (visible after shared lib dynlink). */ +#define N_FN 0x1f /* File name of .o file. */ +#define N_FN_SEQ 0x0C /* N_FN from Sequent compilers (sigh). */ +/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT, + N_DATA, or N_BSS. When the low-order bit of other types is set, + (e.g. N_WARNING versus N_FN), they are two different types. */ +#define N_EXT 1 /* External symbol (as opposed to local-to-this-file). */ +#define N_TYPE 0x1e +#define N_STAB 0xe0 /* If any of these bits are on, it's a debug symbol. */ + +#define N_INDR 0x0a + +/* The following symbols refer to set elements. + All the N_SET[ATDB] symbols with the same name form one set. + Space is allocated for the set in the text section, and each set + elements value is stored into one word of the space. + The first word of the space is the length of the set (number of elements). + + The address of the set is made into an N_SETV symbol + whose name is the same as the name of the set. + This symbol acts like a N_DATA global symbol + in that it can satisfy undefined external references. */ + +/* These appear as input to LD, in a .o file. */ +#define N_SETA 0x14 /* Absolute set element symbol. */ +#define N_SETT 0x16 /* Text set element symbol. */ +#define N_SETD 0x18 /* Data set element symbol. */ +#define N_SETB 0x1A /* Bss set element symbol. */ + +/* This is output from LD. */ +#define N_SETV 0x1C /* Pointer to set vector in data area. */ + +/* Warning symbol. The text gives a warning message, the next symbol + in the table will be undefined. When the symbol is referenced, the + message is printed. */ + +#define N_WARNING 0x1e + +/* Weak symbols. These are a GNU extension to the a.out format. The + semantics are those of ELF weak symbols. Weak symbols are always + externally visible. The N_WEAK? values are squeezed into the + available slots. The value of a N_WEAKU symbol is 0. The values + of the other types are the definitions. */ +#define N_WEAKU 0x0d /* Weak undefined symbol. */ +#define N_WEAKA 0x0e /* Weak absolute symbol. */ +#define N_WEAKT 0x0f /* Weak text symbol. */ +#define N_WEAKD 0x10 /* Weak data symbol. */ +#define N_WEAKB 0x11 /* Weak bss symbol. */ + +/* Relocations + + There are two types of relocation flavours for a.out systems, + standard and extended. The standard form is used on systems where the + instruction has room for all the bits of an offset to the operand, whilst + the extended form is used when an address operand has to be split over n + instructions. Eg, on the 68k, each move instruction can reference + the target with a displacement of 16 or 32 bits. On the sparc, move + instructions use an offset of 14 bits, so the offset is stored in + the reloc field, and the data in the section is ignored. */ + +/* This structure describes a single relocation to be performed. + The text-relocation section of the file is a vector of these structures, + all of which apply to the text section. + Likewise, the data-relocation section applies to the data section. */ + +struct reloc_std_external +{ + bfd_byte r_address[BYTES_IN_WORD]; /* Offset of of data to relocate. */ + bfd_byte r_index[3]; /* Symbol table index of symbol. */ + bfd_byte r_type[1]; /* Relocation type. */ +}; + +#define RELOC_STD_BITS_PCREL_BIG ((unsigned int) 0x80) +#define RELOC_STD_BITS_PCREL_LITTLE ((unsigned int) 0x01) + +#define RELOC_STD_BITS_LENGTH_BIG ((unsigned int) 0x60) +#define RELOC_STD_BITS_LENGTH_SH_BIG 5 +#define RELOC_STD_BITS_LENGTH_LITTLE ((unsigned int) 0x06) +#define RELOC_STD_BITS_LENGTH_SH_LITTLE 1 + +#define RELOC_STD_BITS_EXTERN_BIG ((unsigned int) 0x10) +#define RELOC_STD_BITS_EXTERN_LITTLE ((unsigned int) 0x08) + +#define RELOC_STD_BITS_BASEREL_BIG ((unsigned int) 0x08) +#define RELOC_STD_BITS_BASEREL_LITTLE ((unsigned int) 0x10) + +#define RELOC_STD_BITS_JMPTABLE_BIG ((unsigned int) 0x04) +#define RELOC_STD_BITS_JMPTABLE_LITTLE ((unsigned int) 0x20) + +#define RELOC_STD_BITS_RELATIVE_BIG ((unsigned int) 0x02) +#define RELOC_STD_BITS_RELATIVE_LITTLE ((unsigned int) 0x40) + +#define RELOC_STD_SIZE (BYTES_IN_WORD + 3 + 1) /* Bytes per relocation entry. */ + +struct reloc_std_internal +{ + bfd_vma r_address; /* Address (within segment) to be relocated. */ + /* The meaning of r_symbolnum depends on r_extern. */ + unsigned int r_symbolnum:24; + /* Nonzero means value is a pc-relative offset + and it should be relocated for changes in its own address + as well as for changes in the symbol or section specified. */ + unsigned int r_pcrel:1; + /* Length (as exponent of 2) of the field to be relocated. + Thus, a value of 2 indicates 1<<2 bytes. */ + unsigned int r_length:2; + /* 1 => relocate with value of symbol. + r_symbolnum is the index of the symbol + in files the symbol table. + 0 => relocate with the address of a segment. + r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS + (the N_EXT bit may be set also, but signifies nothing). */ + unsigned int r_extern:1; + /* The next three bits are for SunOS shared libraries, and seem to + be undocumented. */ + unsigned int r_baserel:1; /* Linkage table relative. */ + unsigned int r_jmptable:1; /* pc-relative to jump table. */ + unsigned int r_relative:1; /* "relative relocation". */ + /* unused */ + unsigned int r_pad:1; /* Padding -- set to zero. */ +}; + + +/* EXTENDED RELOCS. */ + +struct reloc_ext_external +{ + bfd_byte r_address[BYTES_IN_WORD]; /* Offset of of data to relocate. */ + bfd_byte r_index[3]; /* Symbol table index of symbol. */ + bfd_byte r_type[1]; /* Relocation type. */ + bfd_byte r_addend[BYTES_IN_WORD]; /* Datum addend. */ +}; + +#ifndef RELOC_EXT_BITS_EXTERN_BIG +#define RELOC_EXT_BITS_EXTERN_BIG ((unsigned int) 0x80) +#endif + +#ifndef RELOC_EXT_BITS_EXTERN_LITTLE +#define RELOC_EXT_BITS_EXTERN_LITTLE ((unsigned int) 0x01) +#endif + +#ifndef RELOC_EXT_BITS_TYPE_BIG +#define RELOC_EXT_BITS_TYPE_BIG ((unsigned int) 0x1F) +#endif + +#ifndef RELOC_EXT_BITS_TYPE_SH_BIG +#define RELOC_EXT_BITS_TYPE_SH_BIG 0 +#endif + +#ifndef RELOC_EXT_BITS_TYPE_LITTLE +#define RELOC_EXT_BITS_TYPE_LITTLE ((unsigned int) 0xF8) +#endif + +#ifndef RELOC_EXT_BITS_TYPE_SH_LITTLE +#define RELOC_EXT_BITS_TYPE_SH_LITTLE 3 +#endif + +/* Bytes per relocation entry. */ +#define RELOC_EXT_SIZE (BYTES_IN_WORD + 3 + 1 + BYTES_IN_WORD) + +enum reloc_type +{ + /* Simple relocations. */ + RELOC_8, /* data[0:7] = addend + sv */ + RELOC_16, /* data[0:15] = addend + sv */ + RELOC_32, /* data[0:31] = addend + sv */ + /* PC-rel displacement. */ + RELOC_DISP8, /* data[0:7] = addend - pc + sv */ + RELOC_DISP16, /* data[0:15] = addend - pc + sv */ + RELOC_DISP32, /* data[0:31] = addend - pc + sv */ + /* Special. */ + RELOC_WDISP30, /* data[0:29] = (addend + sv - pc)>>2 */ + RELOC_WDISP22, /* data[0:21] = (addend + sv - pc)>>2 */ + RELOC_HI22, /* data[0:21] = (addend + sv)>>10 */ + RELOC_22, /* data[0:21] = (addend + sv) */ + RELOC_13, /* data[0:12] = (addend + sv) */ + RELOC_LO10, /* data[0:9] = (addend + sv) */ + RELOC_SFA_BASE, + RELOC_SFA_OFF13, + /* P.I.C. (base-relative). */ + RELOC_BASE10, /* Not sure - maybe we can do this the */ + RELOC_BASE13, /* right way now */ + RELOC_BASE22, + /* For some sort of pc-rel P.I.C. (?) */ + RELOC_PC10, + RELOC_PC22, + /* P.I.C. jump table. */ + RELOC_JMP_TBL, + /* Reputedly for shared libraries somehow. */ + RELOC_SEGOFF16, + RELOC_GLOB_DAT, + RELOC_JMP_SLOT, + RELOC_RELATIVE, + + RELOC_11, + RELOC_WDISP2_14, + RELOC_WDISP19, + RELOC_HHI22, /* data[0:21] = (addend + sv) >> 42 */ + RELOC_HLO10, /* data[0:9] = (addend + sv) >> 32 */ + + /* 29K relocation types. */ + RELOC_JUMPTARG, + RELOC_CONST, + RELOC_CONSTH, + + /* All the new ones I can think of, for sparc v9. */ + RELOC_64, /* data[0:63] = addend + sv */ + RELOC_DISP64, /* data[0:63] = addend - pc + sv */ + RELOC_WDISP21, /* data[0:20] = (addend + sv - pc)>>2 */ + RELOC_DISP21, /* data[0:20] = addend - pc + sv */ + RELOC_DISP14, /* data[0:13] = addend - pc + sv */ + /* Q . + What are the other ones, + Since this is a clean slate, can we throw away the ones we dont + understand ? Should we sort the values ? What about using a + microcode format like the 68k ? */ + NO_RELOC + }; + + +struct reloc_internal +{ + bfd_vma r_address; /* Offset of of data to relocate. */ + long r_index; /* Symbol table index of symbol. */ + enum reloc_type r_type; /* Relocation type. */ + bfd_vma r_addend; /* Datum addend. */ +}; + +/* Q. + Should the length of the string table be 4 bytes or 8 bytes ? + + Q. + What about archive indexes ? */ + +#endif /* __A_OUT_64_H__ */ diff --git a/include/aout/ar.h b/include/aout/ar.h new file mode 100644 index 0000000..de04382 --- /dev/null +++ b/include/aout/ar.h @@ -0,0 +1,55 @@ +/* archive file definition for GNU software + + Copyright 2001, 2008, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* So far this is correct for BSDish archives. Don't forget that + files must begin on an even byte boundary. */ + +#ifndef __GNU_AR_H__ +#define __GNU_AR_H__ + +/* Note that the usual '\n' in magic strings may translate to different + characters, as allowed by ANSI. '\012' has a fixed value, and remains + compatible with existing BSDish archives. */ + +#define ARMAG "!\012" /* For COFF and a.out archives. */ +#define ARMAGB "!\012" /* For b.out archives. */ +#define ARMAGT "!\012" /* For thin archives. */ +#define SARMAG 8 +#define ARFMAG "`\012" + +/* The ar_date field of the armap (__.SYMDEF) member of an archive + must be greater than the modified date of the entire file, or + BSD-derived linkers complain. We originally write the ar_date with + this offset from the real file's mod-time. After finishing the + file, we rewrite ar_date if it's not still greater than the mod date. */ + +#define ARMAP_TIME_OFFSET 60 + +struct ar_hdr +{ + char ar_name[16]; /* Name of this member. */ + char ar_date[12]; /* File mtime. */ + char ar_uid[6]; /* Owner uid; printed as decimal. */ + char ar_gid[6]; /* Owner gid; printed as decimal. */ + char ar_mode[8]; /* File mode, printed as octal. */ + char ar_size[10]; /* File size, printed as decimal. */ + char ar_fmag[2]; /* Should contain ARFMAG. */ +}; + +#endif /* __GNU_AR_H__ */ diff --git a/include/aout/dynix3.h b/include/aout/dynix3.h new file mode 100644 index 0000000..808e53a --- /dev/null +++ b/include/aout/dynix3.h @@ -0,0 +1,87 @@ +/* a.out specifics for Sequent Symmetry running Dynix 3.x + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef A_OUT_DYNIX3_H +#define A_OUT_DYNIX3_H + +#define external_exec dynix_external_exec + +/* struct exec for Dynix 3 + + a_gdtbl and a_bootstrap are only for standalone binaries. + Shared data fields are not supported by the kernel as of Dynix 3.1, + but are supported by Dynix compiler programs. */ +struct dynix_external_exec + { + unsigned char e_info[4]; + unsigned char e_text[4]; + unsigned char e_data[4]; + unsigned char e_bss[4]; + unsigned char e_syms[4]; + unsigned char e_entry[4]; + unsigned char e_trsize[4]; + unsigned char e_drsize[4]; + unsigned char e_g_code[8]; + unsigned char e_g_data[8]; + unsigned char e_g_desc[8]; + unsigned char e_shdata[4]; + unsigned char e_shbss[4]; + unsigned char e_shdrsize[4]; + unsigned char e_bootstrap[44]; + unsigned char e_reserved[12]; + unsigned char e_version[4]; + }; + +#define EXEC_BYTES_SIZE (128) + +/* All executables under Dynix are demand paged with read-only text, + Thus no NMAGIC. + + ZMAGIC has a page of 0s at virtual 0, + XMAGIC has an invalid page at virtual 0. */ +#define OMAGIC 0x12eb /* .o */ +#define ZMAGIC 0x22eb /* zero @ 0, demand load */ +#define XMAGIC 0x32eb /* invalid @ 0, demand load */ +#define SMAGIC 0x42eb /* standalone, not supported here */ + +#define N_BADMAG(x) ((OMAGIC != N_MAGIC(x)) && \ + (ZMAGIC != N_MAGIC(x)) && \ + (XMAGIC != N_MAGIC(x)) && \ + (SMAGIC != N_MAGIC(x))) + +#define N_ADDRADJ(x) ((ZMAGIC == N_MAGIC(x) || XMAGIC == N_MAGIC(x)) ? 0x1000 : 0) + +#define N_TXTOFF(x) (EXEC_BYTES_SIZE) +#define N_DATOFF(x) (N_TXTOFF(x) + N_TXTSIZE(x)) +#define N_SHDATOFF(x) (N_DATOFF(x) + (x).a_data) +#define N_TRELOFF(x) (N_SHDATOFF(x) + (x).a_shdata) +#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) +#define N_SHDRELOFF(x) (N_DRELOFF(x) + (x).a_drsize) +#define N_SYMOFF(x) (N_SHDRELOFF(x) + (x).a_shdrsize) +#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) + +#define N_TXTADDR(x) \ + (((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? 0 \ + : TEXT_START_ADDR + EXEC_BYTES_SIZE) + +#define N_TXTSIZE(x) \ + (((OMAGIC == N_MAGIC(x)) || (SMAGIC == N_MAGIC(x))) ? ((x).a_text) \ + : ((x).a_text - N_ADDRADJ(x) - EXEC_BYTES_SIZE)) + +#endif /* A_OUT_DYNIX3_H */ diff --git a/include/aout/encap.h b/include/aout/encap.h new file mode 100644 index 0000000..7ebec69 --- /dev/null +++ b/include/aout/encap.h @@ -0,0 +1,135 @@ +/* Yet Another Try at encapsulating bfd object files in coff. + Copyright 1988, 1989, 1991, 2010 Free Software Foundation, Inc. + Written by Pace Willisson 12/9/88 + + This file is obsolete. It needs to be converted to just define a bunch + of stuff that BFD can use to do coff-encapsulated files. --gnu@cygnus.com + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* + * We only use the coff headers to tell the kernel + * how to exec the file. Therefore, the only fields that need to + * be filled in are the scnptr and vaddr for the text and data + * sections, and the vaddr for the bss. As far as coff is concerned, + * there is no symbol table, relocation, or line numbers. + * + * A normal bsd header (struct exec) is placed after the coff headers, + * and before the real text. I defined a the new fields 'a_machtype' + * and a_flags. If a_machtype is M_386, and a_flags & A_ENCAP is + * true, then the bsd header is preceeded by a coff header. Macros + * like N_TXTOFF and N_TXTADDR use this field to find the bsd header. + * + * The only problem is to track down the bsd exec header. The + * macros HEADER_OFFSET, etc do this. + */ + +#define N_FLAGS_COFF_ENCAPSULATE 0x20 /* coff header precedes bsd header */ + +/* Describe the COFF header used for encapsulation. */ + +struct coffheader +{ + /* filehdr */ + unsigned short f_magic; + unsigned short f_nscns; + long f_timdat; + long f_symptr; + long f_nsyms; + unsigned short f_opthdr; + unsigned short f_flags; + /* aouthdr */ + short magic; + short vstamp; + long tsize; + long dsize; + long bsize; + long entry; + long text_start; + long data_start; + struct coffscn + { + char s_name[8]; + long s_paddr; + long s_vaddr; + long s_size; + long s_scnptr; + long s_relptr; + long s_lnnoptr; + unsigned short s_nreloc; + unsigned short s_nlnno; + long s_flags; + } scns[3]; +}; + +/* Describe some of the parameters of the encapsulation, + including how to find the encapsulated BSD header. */ + +/* FIXME, this is dumb. The same tools can't handle a.outs for different + architectures, just because COFF_MAGIC is different; so you need a + separate GNU nm for every architecture!!? Unfortunately, it needs to + be this way, since the COFF_MAGIC value is determined by the kernel + we're trying to fool here. */ + +#define COFF_MAGIC_I386 0514 /* I386MAGIC */ +#define COFF_MAGIC_M68K 0520 /* MC68MAGIC */ + +#ifdef COFF_MAGIC +short __header_offset_temp; +#define HEADER_OFFSET(f) \ + (__header_offset_temp = 0, \ + fread ((char *)&__header_offset_temp, sizeof (short), 1, (f)), \ + fseek ((f), -sizeof (short), 1), \ + __header_offset_temp==COFF_MAGIC ? sizeof(struct coffheader) : 0) +#else +#define HEADER_OFFSET(f) 0 +#endif + +#define HEADER_SEEK(f) (fseek ((f), HEADER_OFFSET((f)), 1)) + +/* Describe the characteristics of the BSD header + that appears inside the encapsulation. */ + +/* Encapsulated coff files that are linked ZMAGIC have a text segment + offset just past the header (and a matching TXTADDR), excluding + the headers from the text segment proper but keeping the physical + layout and the virtual memory layout page-aligned. + + Non-encapsulated a.out files that are linked ZMAGIC have a text + segment that starts at 0 and an N_TXTADR similarly offset to 0. + They too are page-aligned with each other, but they include the + a.out header as part of the text. + + The _N_HDROFF gets sizeof struct exec added to it, so we have + to compensate here. See . */ + +#undef _N_HDROFF +#undef N_TXTADDR +#undef N_DATADDR + +#define _N_HDROFF(x) ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ + sizeof (struct coffheader) : 0) + +/* Address of text segment in memory after it is loaded. */ +#define N_TXTADDR(x) \ + ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ + sizeof (struct coffheader) + sizeof (struct exec) : 0) +#define SEGMENT_SIZE 0x400000 + +#define N_DATADDR(x) \ + ((N_FLAGS(x) & N_FLAGS_COFF_ENCAPSULATE) ? \ + (SEGMENT_SIZE + ((N_TXTADDR(x)+(x).a_text-1) & ~(SEGMENT_SIZE-1))) : \ + (N_TXTADDR(x)+(x).a_text)) diff --git a/include/aout/host.h b/include/aout/host.h new file mode 100644 index 0000000..4260cc5 --- /dev/null +++ b/include/aout/host.h @@ -0,0 +1,43 @@ +/* host.h - Parameters about the a.out format, based on the host system + on which the program is compiled. + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Address of data segment in memory after it is loaded. + It is up to you to define SEGMENT_SIZE on machines not listed here. */ +#ifndef SEGMENT_SIZE + +#if defined(hp300) || defined(pyr) +#define SEGMENT_SIZE page_size +#endif + +#ifdef sony +#define SEGMENT_SIZE 0x1000 +#endif /* Sony. */ + +#ifdef is68k +#define SEGMENT_SIZE 0x20000 +#endif + +#if defined(m68k) && defined(PORTAR) +#define TARGET_PAGE_SIZE 0x400 +#define SEGMENT_SIZE TARGET_PAGE_SIZE +#endif + +#endif /*!defined(SEGMENT_SIZE)*/ + diff --git a/include/aout/hp.h b/include/aout/hp.h new file mode 100644 index 0000000..b60741a --- /dev/null +++ b/include/aout/hp.h @@ -0,0 +1,83 @@ +/* Special version of for use under HP-UX. + Copyright 1988, 1991, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* THIS FILE IS OBSOLETE. It needs to be revised as a variant "external" + a.out format for use with BFD. */ + +/* The `exec' structure and overall layout must be close to HP's when + we are running on an HP system, otherwise we will not be able to + execute the resulting file. */ + +/* Allow this file to be included twice. */ +#ifndef __GNU_EXEC_MACROS__ + +struct exec +{ + unsigned short a_machtype; /* machine type */ + unsigned short a_magic; /* magic number */ + unsigned long a_spare1; + unsigned long a_spare2; + unsigned long a_text; /* length of text, in bytes */ + unsigned long a_data; /* length of data, in bytes */ + unsigned long a_bss; /* length of uninitialized data area for file, in bytes */ + unsigned long a_trsize; /* length of relocation info for text, in bytes */ + unsigned long a_drsize; /* length of relocation info for data, in bytes */ + unsigned long a_spare3; /* HP = pascal interface size */ + unsigned long a_spare4; /* HP = symbol table size */ + unsigned long a_spare5; /* HP = debug name table size */ + unsigned long a_entry; /* start address */ + unsigned long a_spare6; /* HP = source line table size */ + unsigned long a_spare7; /* HP = value table size */ + unsigned long a_syms; /* length of symbol table data in file, in bytes */ + unsigned long a_spare8; +}; + +/* Tell a.out.gnu.h not to define `struct exec'. */ +#define __STRUCT_EXEC_OVERRIDE__ + +#include "../a.out.gnu.h" + +#undef N_MAGIC +#undef N_MACHTYPE +#undef N_FLAGS +#undef N_SET_INFO +#undef N_SET_MAGIC +#undef N_SET_MACHTYPE +#undef N_SET_FLAGS + +#define N_MAGIC(exec) ((exec) . a_magic) +#define N_MACHTYPE(exec) ((exec) . a_machtype) +#define N_SET_MAGIC(exec, magic) (((exec) . a_magic) = (magic)) +#define N_SET_MACHTYPE(exec, machtype) (((exec) . a_machtype) = (machtype)) + +#undef N_BADMAG +#define N_BADMAG(x) ((_N_BADMAG (x)) || (_N_BADMACH (x))) + +#define _N_BADMACH(x) \ +(((N_MACHTYPE (x)) != HP9000S200_ID) && \ + ((N_MACHTYPE (x)) != HP98x6_ID)) + +#define HP98x6_ID 0x20A +#define HP9000S200_ID 0x20C + +#undef _N_HDROFF +#define _N_HDROFF(x) (SEGMENT_SIZE - (sizeof (struct exec))) + +#define SEGMENT_SIZE 0x1000 + +#endif /* __GNU_EXEC_MACROS__ */ diff --git a/include/aout/hp300hpux.h b/include/aout/hp300hpux.h new file mode 100644 index 0000000..97a3eb5 --- /dev/null +++ b/include/aout/hp300hpux.h @@ -0,0 +1,132 @@ +/* Special version of for use under HP-UX. + Copyright 1988, 1993, 1995, 2001, 2009, 2010 + 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +struct hp300hpux_exec_bytes +{ + unsigned char e_info[4]; /* a_machtype/a_magic */ + unsigned char e_spare1[4]; + unsigned char e_spare2[4]; + unsigned char e_text[4]; /* length of text, in bytes */ + unsigned char e_data[4]; /* length of data, in bytes */ + unsigned char e_bss[4]; /* length of uninitialized data area , in bytes */ + unsigned char e_trsize[4]; /* length of relocation info for text, in bytes*/ + unsigned char e_drsize[4]; /* length of relocation info for data, in bytes*/ + unsigned char e_passize[4];/* HP = pascal interface size */ + unsigned char e_syms[4]; /* HP = symbol table size */ + unsigned char e_spare5[4]; /* HP = debug name table size */ + unsigned char e_entry[4]; /* start address */ + unsigned char e_spare6[4]; /* HP = source line table size */ + unsigned char e_supsize[4];/* HP = value table size */ + unsigned char e_drelocs[4]; + unsigned char e_extension[4]; /* file offset of extension */ +}; +#define EXEC_BYTES_SIZE 64 + +struct hp300hpux_nlist_bytes + { + unsigned char e_value[4]; + unsigned char e_type[1]; + unsigned char e_length[1]; /* length of ascii symbol name */ + unsigned char e_almod[2]; /* alignment mod */ + unsigned char e_shlib[2]; /* info about dynamic linking */ + }; +#define EXTERNAL_NLIST_SIZE 10 + +struct hp300hpux_reloc + { + unsigned char r_address[4];/* offset of of data to relocate */ + unsigned char r_index[2]; /* symbol table index of symbol */ + unsigned char r_type[1]; /* relocation type */ + unsigned char r_length[1]; /* length of item to reloc */ + }; + +struct hp300hpux_header_extension +{ + unsigned char e_syms[4]; + unsigned char unique_headers[12*4]; + unsigned char e_header[2]; /* type of header */ + unsigned char e_version[2]; /* version */ + unsigned char e_size[4]; /* bytes following*/ + unsigned char e_extension[4];/* file offset of next extension */ +}; +#define EXTERNAL_EXTENSION_HEADER_SIZE (16*4) + +/* hpux separates object files (0x106) and impure executables (0x107) */ +/* but the bfd code does not distinguish between them. Since we want to*/ +/* read hpux .o files, we add an special define and use it below in */ +/* offset and address calculations. */ + +#define HPUX_DOT_O_MAGIC 0x106 +#define OMAGIC 0x107 /* object file or impure executable. */ +#define NMAGIC 0x108 /* Code indicating pure executable. */ +#define ZMAGIC 0x10B /* demand-paged executable. */ + +#define N_HEADER_IN_TEXT(x) 0 + +#if 0 /* libaout.h only uses the lower 8 bits */ +#define HP98x6_ID 0x20A +#define HP9000S200_ID 0x20C +#endif +#define HP98x6_ID 0x0A +#define HP9000S200_ID 0x0C + +#define N_BADMAG(x) ((_N_BADMAG (x)) || (_N_BADMACH (x))) + +#define N_DATADDR(x) \ + ((N_MAGIC (x) == OMAGIC || N_MAGIC (x) == HPUX_DOT_O_MAGIC) \ + ? (N_TXTADDR (x) + N_TXTSIZE (x)) \ + : (N_SEGSIZE (x) + ((N_TXTADDR (x) + N_TXTSIZE (x) - 1) \ + & ~ (bfd_vma) (N_SEGSIZE (x) - 1)))) + +#define _N_BADMACH(x) \ + (((N_MACHTYPE (x)) != HP9000S200_ID) && ((N_MACHTYPE (x)) != HP98x6_ID)) + +#define _N_BADMAG(x) (N_MAGIC(x) != HPUX_DOT_O_MAGIC \ + && N_MAGIC(x) != OMAGIC \ + && N_MAGIC(x) != NMAGIC \ + && N_MAGIC(x) != ZMAGIC ) + +#undef _N_HDROFF +#define _N_HDROFF(x) (SEGMENT_SIZE - (sizeof (struct exec))) + +#undef N_DATOFF +#undef N_PASOFF +#undef N_SYMOFF +#undef N_SUPOFF +#undef N_TRELOFF +#undef N_DRELOFF +#undef N_STROFF + +#define N_DATOFF(x) ( N_TXTOFF(x) + N_TXTSIZE(x) ) +#define N_PASOFF(x) ( N_DATOFF(x) + (x).a_data) +#define N_SYMOFF(x) ( N_PASOFF(x) /* + (x).a_passize*/ ) +#define N_SUPOFF(x) ( N_SYMOFF(x) + (x).a_syms ) +#define N_TRELOFF(x) ( N_SUPOFF(x) /* + 0 (x).a_supsize*/ ) +#define N_DRELOFF(x) ( N_TRELOFF(x) + (x).a_trsize ) +#define N_EXTHOFF(x) ( N_DRELOFF(x) /* + 0 (x).a_drsize */) +#define N_STROFF(x) ( 0 /* no string table */ ) + +/* use these when the file has gnu symbol tables */ +#define N_GNU_TRELOFF(x) (N_DATOFF(x) + (x).a_data) +#define N_GNU_DRELOFF(x) (N_GNU_TRELOFF(x) + (x).a_trsize) +#define N_GNU_SYMOFF(x) (N_GNU_DRELOFF(x) + (x).a_drsize) + +#define TARGET_PAGE_SIZE 0x1000 +#define SEGMENT_SIZE 0x1000 +#define TEXT_START_ADDR 0 diff --git a/include/aout/hppa.h b/include/aout/hppa.h new file mode 100644 index 0000000..24698bb --- /dev/null +++ b/include/aout/hppa.h @@ -0,0 +1,22 @@ +/* Copyright 2012 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "filehdr.h" +#include "aouthdr.h" +#include "scnhdr.h" +#include "spacehdr.h" +#include "syms.h" diff --git a/include/aout/ranlib.h b/include/aout/ranlib.h new file mode 100644 index 0000000..92bec46 --- /dev/null +++ b/include/aout/ranlib.h @@ -0,0 +1,63 @@ +/* ranlib.h -- archive library index member definition for GNU. + Copyright 1990, 1991, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* The Symdef member of an archive contains two things: + a table that maps symbol-string offsets to file offsets, + and a symbol-string table. All the symbol names are + run together (each with trailing null) in the symbol-string + table. There is a single longword bytecount on the front + of each of these tables. Thus if we have two symbols, + "foo" and "_bar", that are in archive members at offsets + 200 and 900, it would look like this: + 16 ; byte count of index table + 0 ; offset of "foo" in string table + 200 ; offset of foo-module in file + 4 ; offset of "bar" in string table + 900 ; offset of bar-module in file + 9 ; byte count of string table + "foo\0_bar\0" ; string table */ + +#define RANLIBMAG "__.SYMDEF" /* Archive file name containing index */ +#define RANLIBSKEW 3 /* Creation time offset */ + +/* Format of __.SYMDEF: + First, a longword containing the size of the 'symdef' data that follows. + Second, zero or more 'symdef' structures. + Third, a longword containing the length of symbol name strings. + Fourth, zero or more symbol name strings (each followed by a null). */ + +struct symdef + { + union + { + unsigned long string_offset; /* In the file */ + char *name; /* In memory, sometimes */ + } s; + /* this points to the front of the file header (AKA member header -- + a struct ar_hdr), not to the front of the file or into the file). + in other words it only tells you which file to read */ + unsigned long file_offset; + }; + +/* Compatability with BSD code */ + +#define ranlib symdef +#define ran_un s +#define ran_strx string_offset +#define ran_name name +#define ran_off file_offset diff --git a/include/aout/reloc.h b/include/aout/reloc.h new file mode 100644 index 0000000..6f1bc52 --- /dev/null +++ b/include/aout/reloc.h @@ -0,0 +1,67 @@ +/* reloc.h -- Header file for relocation information. + Copyright 1989, 1990, 1991, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Relocation types for a.out files using reloc_info_extended + (SPARC and AMD 29000). */ + +#ifndef _RELOC_H_READ_ +#define _RELOC_H_READ_ 1 + +enum reloc_type + { + RELOC_8, RELOC_16, RELOC_32, /* simple relocations */ + RELOC_DISP8, RELOC_DISP16, RELOC_DISP32, /* pc-rel displacement */ + RELOC_WDISP30, RELOC_WDISP22, + RELOC_HI22, RELOC_22, + RELOC_13, RELOC_LO10, + RELOC_SFA_BASE, RELOC_SFA_OFF13, + RELOC_BASE10, RELOC_BASE13, RELOC_BASE22, /* P.I.C. (base-relative) */ + RELOC_PC10, RELOC_PC22, /* for some sort of pc-rel P.I.C. (?) */ + RELOC_JMP_TBL, /* P.I.C. jump table */ + RELOC_SEGOFF16, /* reputedly for shared libraries somehow */ + RELOC_GLOB_DAT, RELOC_JMP_SLOT, RELOC_RELATIVE, + RELOC_11, + RELOC_WDISP2_14, + RELOC_WDISP19, + RELOC_HHI22, + RELOC_HLO10, + + /* 29K relocation types */ + RELOC_JUMPTARG, RELOC_CONST, RELOC_CONSTH, + + RELOC_WDISP14, RELOC_WDISP21, + + NO_RELOC + }; + +#define RELOC_TYPE_NAMES \ +"8", "16", "32", "DISP8", \ +"DISP16", "DISP32", "WDISP30", "WDISP22", \ +"HI22", "22", "13", "LO10", \ +"SFA_BASE", "SFAOFF13", "BASE10", "BASE13", \ +"BASE22", "PC10", "PC22", "JMP_TBL", \ +"SEGOFF16", "GLOB_DAT", "JMP_SLOT", "RELATIVE", \ +"11", "WDISP2_14", "WDISP19", "HHI22", \ +"HLO10", \ +"JUMPTARG", "CONST", "CONSTH", "WDISP14", \ +"WDISP21", \ +"NO_RELOC" + +#endif /* _RELOC_H_READ_ */ + +/* end of reloc.h */ diff --git a/include/aout/stab.def b/include/aout/stab.def new file mode 100644 index 0000000..ad1c62e --- /dev/null +++ b/include/aout/stab.def @@ -0,0 +1,283 @@ +/* Table of DBX symbol codes for the GNU system. + Copyright 1988, 1991, 1992, 1993, 1994, 1996, 1998, 2004, 2010 + 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* New stab from Solaris 2. This uses an n_type of 0, which in a.out files + overlaps the N_UNDF used for ordinary symbols. In ELF files, the + debug information is in a different file section, so there is no conflict. + This symbol's n_value gives the size of the string section associated + with this file. The symbol's n_strx (relative to the just-updated + string section start address) gives the name of the source file, + e.g. "foo.c", without any path information. The symbol's n_desc gives + the count of upcoming symbols associated with this file (not including + this one). */ +/* __define_stab (N_UNDF, 0x00, "UNDF") */ + +/* Global variable. Only the name is significant. + To find the address, look in the corresponding external symbol. */ +__define_stab (N_GSYM, 0x20, "GSYM") + +/* Function name for BSD Fortran. Only the name is significant. + To find the address, look in the corresponding external symbol. */ +__define_stab (N_FNAME, 0x22, "FNAME") + +/* Function name or text-segment variable for C. Value is its address. + Desc is supposedly starting line number, but GCC doesn't set it + and DBX seems not to miss it. */ +__define_stab (N_FUN, 0x24, "FUN") + +/* Data-segment variable with internal linkage. Value is its address. + "Static Sym". */ +__define_stab (N_STSYM, 0x26, "STSYM") + +/* BSS-segment variable with internal linkage. Value is its address. */ +__define_stab (N_LCSYM, 0x28, "LCSYM") + +/* Name of main routine. Only the name is significant. */ +__define_stab (N_MAIN, 0x2a, "MAIN") + +/* Solaris2: Read-only data symbols. */ +__define_stab (N_ROSYM, 0x2c, "ROSYM") + +/* MacOS X: + The beginning of a relocatable function block - including stabs. */ +__define_stab (N_BNSYM, 0x2e, "BNSYM") + +/* Global symbol in Pascal. + Supposedly the value is its line number; I'm skeptical. */ +__define_stab (N_PC, 0x30, "PC") + +/* Number of symbols: 0, files,,funcs,lines according to Ultrix V4.0. */ +__define_stab (N_NSYMS, 0x32, "NSYMS") + +/* "No DST map for sym: name, ,0,type,ignored" according to Ultrix V4.0. */ +__define_stab (N_NOMAP, 0x34, "NOMAP") + +/* New stab from Solaris 2. Like N_SO, but for the object file. Two in + a row provide the build directory and the relative path of the .o from it. + Solaris2 uses this to avoid putting the stabs info into the linked + executable; this stab goes into the ".stab.index" section, and the debugger + reads the real stabs directly from the .o files instead. */ +__define_stab (N_OBJ, 0x38, "OBJ") + +/* New stab from Solaris 2. Options for the debugger, related to the + source language for this module. E.g. whether to use ANSI + integral promotions or traditional integral promotions. */ +__define_stab (N_OPT, 0x3c, "OPT") + +/* Register variable. Value is number of register. */ +__define_stab (N_RSYM, 0x40, "RSYM") + +/* Modula-2 compilation unit. Can someone say what info it contains? */ +__define_stab (N_M2C, 0x42, "M2C") + +/* Line number in text segment. Desc is the line number; + value is corresponding address. On Solaris2, the line number is + relative to the start of the current function. */ +__define_stab (N_SLINE, 0x44, "SLINE") + +/* Similar, for data segment. */ +__define_stab (N_DSLINE, 0x46, "DSLINE") + +/* Similar, for bss segment. */ +__define_stab (N_BSLINE, 0x48, "BSLINE") + +/* Sun's source-code browser stabs. ?? Don't know what the fields are. + Supposedly the field is "path to associated .cb file". THIS VALUE + OVERLAPS WITH N_BSLINE! */ +__define_stab_duplicate (N_BROWS, 0x48, "BROWS") + +/* GNU Modula-2 definition module dependency. Value is the modification time + of the definition file. Other is non-zero if it is imported with the + GNU M2 keyword %INITIALIZE. Perhaps N_M2C can be used if there + are enough empty fields? */ +__define_stab(N_DEFD, 0x4a, "DEFD") + +/* New in Solaris2. Function start/body/end line numbers. */ +__define_stab(N_FLINE, 0x4C, "FLINE") + +/* MacOS X: This tells the end of a relocatable function + debugging info. */ +__define_stab(N_ENSYM, 0x4E, "ENSYM") + +/* THE FOLLOWING TWO STAB VALUES CONFLICT. Happily, one is for Modula-2 + and one is for C++. Still,... */ +/* GNU C++ exception variable. Name is variable name. */ +__define_stab (N_EHDECL, 0x50, "EHDECL") +/* Modula2 info "for imc": name,,0,0,0 according to Ultrix V4.0. */ +__define_stab_duplicate (N_MOD2, 0x50, "MOD2") + +/* GNU C++ `catch' clause. Value is its address. Desc is nonzero if + this entry is immediately followed by a CAUGHT stab saying what exception + was caught. Multiple CAUGHT stabs means that multiple exceptions + can be caught here. If Desc is 0, it means all exceptions are caught + here. */ +__define_stab (N_CATCH, 0x54, "CATCH") + +/* Structure or union element. Value is offset in the structure. */ +__define_stab (N_SSYM, 0x60, "SSYM") + +/* Solaris2: Last stab emitted for module. */ +__define_stab (N_ENDM, 0x62, "ENDM") + +/* Name of main source file. + Value is starting text address of the compilation. + If multiple N_SO's appear, the first to contain a trailing / is the + compilation directory. The first to not contain a trailing / is the + source file name, relative to the compilation directory. Others (perhaps + resulting from cfront) are ignored. + On Solaris2, value is undefined, but desc is a source-language code. */ + +__define_stab (N_SO, 0x64, "SO") + +/* Apple: This is the stab that associated the .o file with the + N_SO stab, in the case where debug info is mostly stored in the .o file. */ +__define_stab (N_OSO, 0x66, "OSO") + +/* SunPro F77: Name of alias. */ +__define_stab (N_ALIAS, 0x6c, "ALIAS") + +/* Automatic variable in the stack. Value is offset from frame pointer. + Also used for type descriptions. */ +__define_stab (N_LSYM, 0x80, "LSYM") + +/* Beginning of an include file. Only Sun uses this. + In an object file, only the name is significant. + The Sun linker puts data into some of the other fields. */ +__define_stab (N_BINCL, 0x82, "BINCL") + +/* Name of sub-source file (#include file). + Value is starting text address of the compilation. */ +__define_stab (N_SOL, 0x84, "SOL") + +/* Parameter variable. Value is offset from argument pointer. + (On most machines the argument pointer is the same as the frame pointer. */ +__define_stab (N_PSYM, 0xa0, "PSYM") + +/* End of an include file. No name. + This and N_BINCL act as brackets around the file's output. + In an object file, there is no significant data in this entry. + The Sun linker puts data into some of the fields. */ +__define_stab (N_EINCL, 0xa2, "EINCL") + +/* Alternate entry point. Value is its address. */ +__define_stab (N_ENTRY, 0xa4, "ENTRY") + +/* Beginning of lexical block. + The desc is the nesting level in lexical blocks. + The value is the address of the start of the text for the block. + The variables declared inside the block *precede* the N_LBRAC symbol. + On Solaris2, the value is relative to the start of the current function. */ +__define_stab (N_LBRAC, 0xc0, "LBRAC") + +/* Place holder for deleted include file. Replaces a N_BINCL and everything + up to the corresponding N_EINCL. The Sun linker generates these when + it finds multiple identical copies of the symbols from an include file. + This appears only in output from the Sun linker. */ +__define_stab (N_EXCL, 0xc2, "EXCL") + +/* Modula-2 scope information. Can someone say what info it contains? */ +__define_stab (N_SCOPE, 0xc4, "SCOPE") + +/* Solaris2: Patch Run Time Checker. */ +__define_stab (N_PATCH, 0xd0, "PATCH") + +/* End of a lexical block. Desc matches the N_LBRAC's desc. + The value is the address of the end of the text for the block. + On Solaris2, the value is relative to the start of the current function. */ +__define_stab (N_RBRAC, 0xe0, "RBRAC") + +/* Begin named common block. Only the name is significant. */ +__define_stab (N_BCOMM, 0xe2, "BCOMM") + +/* End named common block. Only the name is significant + (and it should match the N_BCOMM). */ +__define_stab (N_ECOMM, 0xe4, "ECOMM") + +/* Member of a common block; value is offset within the common block. + This should occur within a BCOMM/ECOMM pair. */ +__define_stab (N_ECOML, 0xe8, "ECOML") + +/* Solaris2: Pascal "with" statement: type,,0,0,offset */ +__define_stab (N_WITH, 0xea, "WITH") + +/* These STAB's are used on Gould systems for Non-Base register symbols + or something like that. FIXME. I have assigned the values at random + since I don't have a Gould here. Fixups from Gould folk welcome... */ +__define_stab (N_NBTEXT, 0xF0, "NBTEXT") +__define_stab (N_NBDATA, 0xF2, "NBDATA") +__define_stab (N_NBBSS, 0xF4, "NBBSS") +__define_stab (N_NBSTS, 0xF6, "NBSTS") +__define_stab (N_NBLCS, 0xF8, "NBLCS") + +/* Second symbol entry containing a length-value for the preceding entry. + The value is the length. */ +__define_stab (N_LENG, 0xfe, "LENG") + +/* The above information, in matrix format. + + STAB MATRIX + _________________________________________________ + | 00 - 1F are not dbx stab symbols | + | In most cases, the low bit is the EXTernal bit| + + | 00 UNDEF | 02 ABS | 04 TEXT | 06 DATA | + | 01 |EXT | 03 |EXT | 05 |EXT | 07 |EXT | + + | 08 BSS | 0A INDR | 0C FN_SEQ | 0E WEAKA | + | 09 |EXT | 0B | 0D WEAKU | 0F WEAKT | + + | 10 WEAKD | 12 COMM | 14 SETA | 16 SETT | + | 11 WEAKB | 13 | 15 | 17 | + + | 18 SETD | 1A SETB | 1C SETV | 1E WARNING| + | 19 | 1B | 1D | 1F FN | + + |_______________________________________________| + | Debug entries with bit 01 set are unused. | + | 20 GSYM | 22 FNAME | 24 FUN | 26 STSYM | + | 28 LCSYM | 2A MAIN | 2C ROSYM | 2E | + | 30 PC | 32 NSYMS | 34 NOMAP | 36 | + | 38 OBJ | 3A | 3C OPT | 3E | + | 40 RSYM | 42 M2C | 44 SLINE | 46 DSLINE | + | 48 BSLINE*| 4A DEFD | 4C FLINE | 4E | + | 50 EHDECL*| 52 | 54 CATCH | 56 | + | 58 | 5A | 5C | 5E | + | 60 SSYM | 62 ENDM | 64 SO | 66 | + | 68 | 6A | 6C ALIAS | 6E | + | 70 | 72 | 74 | 76 | + | 78 | 7A | 7C | 7E | + | 80 LSYM | 82 BINCL | 84 SOL | 86 | + | 88 | 8A | 8C | 8E | + | 90 | 92 | 94 | 96 | + | 98 | 9A | 9C | 9E | + | A0 PSYM | A2 EINCL | A4 ENTRY | A6 | + | A8 | AA | AC | AE | + | B0 | B2 | B4 | B6 | + | B8 | BA | BC | BE | + | C0 LBRAC | C2 EXCL | C4 SCOPE | C6 | + | C8 | CA | CC | CE | + | D0 PATCH | D2 | D4 | D6 | + | D8 | DA | DC | DE | + | E0 RBRAC | E2 BCOMM | E4 ECOMM | E6 | + | E8 ECOML | EA WITH | EC | EE | + | F0 | F2 | F4 | F6 | + | F8 | FA | FC | FE LENG | + +-----------------------------------------------+ + * 50 EHDECL is also MOD2. + * 48 BSLINE is also BROWS. + */ diff --git a/include/aout/stab_gnu.h b/include/aout/stab_gnu.h new file mode 100644 index 0000000..60b5272 --- /dev/null +++ b/include/aout/stab_gnu.h @@ -0,0 +1,55 @@ +/* gnu_stab.h Definitions for GNU extensions to STABS + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ +#ifndef __GNU_STAB__ + +/* Indicate the GNU stab.h is in use. */ + +#define __GNU_STAB__ + +#define __define_stab(NAME, CODE, STRING) NAME=CODE, +#define __define_stab_duplicate(NAME, CODE, STRING) NAME=CODE, + +enum __stab_debug_code +{ +#include "aout/stab.def" +LAST_UNUSED_STAB_CODE +}; + +#undef __define_stab + +/* Definitions of "desc" field for N_SO stabs in Solaris2. */ + +#define N_SO_AS 1 +#define N_SO_C 2 +#define N_SO_ANSI_C 3 +#define N_SO_CC 4 /* C++ */ +#define N_SO_FORTRAN 5 +#define N_SO_PASCAL 6 + +/* Solaris2: Floating point type values in basic types. */ + +#define NF_NONE 0 +#define NF_SINGLE 1 /* IEEE 32-bit */ +#define NF_DOUBLE 2 /* IEEE 64-bit */ +#define NF_COMPLEX 3 /* Fortran complex */ +#define NF_COMPLEX16 4 /* Fortran double complex */ +#define NF_COMPLEX32 5 /* Fortran complex*16 */ +#define NF_LDOUBLE 6 /* Long double (whatever that is) */ + +#endif /* __GNU_STAB_ */ diff --git a/include/aout/sun4.h b/include/aout/sun4.h new file mode 100644 index 0000000..06f7584 --- /dev/null +++ b/include/aout/sun4.h @@ -0,0 +1,239 @@ +/* SPARC-specific values for a.out files + + Copyright 2001, 2009, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Some systems, e.g., AIX, may have defined this in header files already + included. */ +#undef TARGET_PAGE_SIZE +#define TARGET_PAGE_SIZE 0x2000 /* 8K. aka NBPG in */ +/* Note that some SPARCs have 4K pages, some 8K, some others. */ + +#define SEG_SIZE_SPARC TARGET_PAGE_SIZE +#define SEG_SIZE_SUN3 0x20000 /* Resolution of r/w protection hw */ + +#define TEXT_START_ADDR TARGET_PAGE_SIZE /* Location 0 is not accessible */ +#define N_HEADER_IN_TEXT(x) 1 + +/* Non-default definitions of the accessor macros... */ + +/* Segment size varies on Sun-3 versus Sun-4. */ + +#define N_SEGSIZE(x) (N_MACHTYPE(x) == M_SPARC? SEG_SIZE_SPARC: \ + N_MACHTYPE(x) == M_68020? SEG_SIZE_SUN3: \ + /* Guess? */ TARGET_PAGE_SIZE) + +/* Virtual Address of text segment from the a.out file. For OMAGIC, + (almost always "unlinked .o's" these days), should be zero. + Sun added a kludge so that shared libraries linked ZMAGIC get + an address of zero if a_entry (!!!) is lower than the otherwise + expected text address. These kludges have gotta go! + For linked files, should reflect reality if we know it. */ + +#define N_SHARED_LIB(x) ((x).a_entry < TEXT_START_ADDR \ + && (x).a_text >= EXEC_BYTES_SIZE) + +/* This differs from the version in aout64.h (which we override by defining + it here) only for NMAGIC (we return TEXT_START_ADDR+EXEC_BYTES_SIZE; + they return 0). */ + +#define N_TXTADDR(x) \ + (N_MAGIC(x)==OMAGIC? 0 \ + : (N_MAGIC(x) == ZMAGIC && (x).a_entry < TEXT_START_ADDR)? 0 \ + : TEXT_START_ADDR+EXEC_BYTES_SIZE) + +/* When a file is linked against a shared library on SunOS 4, the + dynamic bit in the exec header is set, and the first symbol in the + symbol table is __DYNAMIC. Its value is the address of the + following structure. */ + +struct external_sun4_dynamic +{ + /* The version number of the structure. SunOS 4.1.x creates files + with version number 3, which is what this structure is based on. + According to gdb, version 2 is similar. I believe that version 2 + used a different type of procedure linkage table, and there may + have been other differences. */ + bfd_byte ld_version[4]; + /* The virtual address of a 28 byte structure used in debugging. + The contents are filled in at run time by ld.so. */ + bfd_byte ldd[4]; + /* The virtual address of another structure with information about + how to relocate the executable at run time. */ + bfd_byte ld[4]; +}; + +/* The size of the debugging structure pointed to by the debugger + field of __DYNAMIC. */ +#define EXTERNAL_SUN4_DYNAMIC_DEBUGGER_SIZE (24) + +/* The structure pointed to by the linker field of __DYNAMIC. As far + as I can tell, most of the addresses in this structure are offsets + within the file, but some are actually virtual addresses. */ + +struct internal_sun4_dynamic_link +{ + /* Linked list of loaded objects. This is filled in at runtime by + ld.so and probably by dlopen. */ + unsigned long ld_loaded; + + /* The address of the list of names of shared objects which must be + included at runtime. Each entry in the list is 16 bytes: the 4 + byte address of the string naming the object (e.g., for -lc this + is "c"); 4 bytes of flags--the high bit is whether to search for + the object using the library path; the 2 byte major version + number; the 2 byte minor version number; the 4 byte address of + the next entry in the list (zero if this is the last entry). The + version numbers seem to only be non-zero when doing library + searching. */ + unsigned long ld_need; + + /* The address of the path to search for the shared objects which + must be included. This points to a string in PATH format which + is generated from the -L arguments to the linker. According to + the man page, ld.so implicitly adds ${LD_LIBRARY_PATH} to the + beginning of this string and /lib:/usr/lib:/usr/local/lib to the + end. The string is terminated by a null byte. This field is + zero if there is no additional path. */ + unsigned long ld_rules; + + /* The address of the global offset table. This appears to be a + virtual address, not a file offset. The first entry in the + global offset table seems to be the virtual address of the + sun4_dynamic structure (the same value as the __DYNAMIC symbol). + The global offset table is used for PIC code to hold the + addresses of variables. A dynamically linked file which does not + itself contain PIC code has a four byte global offset table. */ + unsigned long ld_got; + + /* The address of the procedure linkage table. This appears to be a + virtual address, not a file offset. + + On a SPARC, the table is composed of 12 byte entries, each of + which consists of three instructions. The first entry is + sethi %hi(0),%g1 + jmp %g1 + nop + These instructions are changed by ld.so into a jump directly into + ld.so itself. Each subsequent entry is + save %sp, -96, %sp + call
+ + The reloc_number is the number of the reloc to use to resolve + this entry. The reloc will be a JMP_SLOT reloc against some + symbol that is not defined in this object file but should be + defined in a shared object (if it is not, ld.so will report a + runtime error and exit). The constant 0x010000000 turns the + reloc number into a sethi of %g0, which does nothing since %g0 is + hardwired to zero. + + When one of these entries is executed, it winds up calling into + ld.so. ld.so looks at the reloc number, available via the return + address, to determine which entry this is. It then looks at the + reloc and patches up the entry in the table into a sethi and jmp + to the real address followed by a nop. This means that the reloc + lookup only has to happen once, and it also means that the + relocation only needs to be done if the function is actually + called. The relocation is expensive because ld.so must look up + the symbol by name. + + The size of the procedure linkage table is given by the ld_plt_sz + field. */ + unsigned long ld_plt; + + /* The address of the relocs. These are in the same format as + ordinary relocs. Symbol index numbers refer to the symbols + pointed to by ld_stab. I think the only way to determine the + number of relocs is to assume that all the bytes from ld_rel to + ld_hash contain reloc entries. */ + unsigned long ld_rel; + + /* The address of a hash table of symbols. The hash table has + roughly the same number of entries as there are dynamic symbols; + I think the only way to get the exact size is to assume that + every byte from ld_hash to ld_stab is devoted to the hash table. + + Each entry in the hash table is eight bytes. The first four + bytes are a symbol index into the dynamic symbols. The second + four bytes are the index of the next hash table entry in the + bucket. The ld_buckets field gives the number of buckets, say B. + The first B entries in the hash table each start a bucket which + is chained through the second four bytes of each entry. A value + of zero ends the chain. + + The hash function is simply + h = 0; + while (*string != '\0') + h = (h << 1) + *string++; + h &= 0x7fffffff; + + To look up a symbol, compute the hash value of the name. Take + the modulos of hash value and the number of buckets. Start at + that entry in the hash table. See if the symbol (from the first + four bytes of the hash table entry) has the name you are looking + for. If not, use the chain field (the second four bytes of the + hash table entry) to move on to the next entry in this bucket. + If the chain field is zero you have reached the end of the + bucket, and the symbol is not in the hash table. */ + unsigned long ld_hash; + + /* The address of the symbol table. This is a list of + external_nlist structures. The string indices are relative to + the ld_symbols field. I think the only way to determine the + number of symbols is to assume that all the bytes between ld_stab + and ld_symbols are external_nlist structures. */ + unsigned long ld_stab; + + /* I don't know what this is for. It seems to always be zero. */ + unsigned long ld_stab_hash; + + /* The number of buckets in the hash table. */ + unsigned long ld_buckets; + + /* The address of the symbol string table. The first string in this + string table need not be the empty string. */ + unsigned long ld_symbols; + + /* The size in bytes of the symbol string table. */ + unsigned long ld_symb_size; + + /* The size in bytes of the text segment. */ + unsigned long ld_text; + + /* The size in bytes of the procedure linkage table. */ + unsigned long ld_plt_sz; +}; + +/* The external form of the structure. */ + +struct external_sun4_dynamic_link +{ + bfd_byte ld_loaded[4]; + bfd_byte ld_need[4]; + bfd_byte ld_rules[4]; + bfd_byte ld_got[4]; + bfd_byte ld_plt[4]; + bfd_byte ld_rel[4]; + bfd_byte ld_hash[4]; + bfd_byte ld_stab[4]; + bfd_byte ld_stab_hash[4]; + bfd_byte ld_buckets[4]; + bfd_byte ld_symbols[4]; + bfd_byte ld_symb_size[4]; + bfd_byte ld_text[4]; + bfd_byte ld_plt_sz[4]; +}; diff --git a/include/ar.h b/include/ar.h new file mode 100644 index 0000000..4c05813 --- /dev/null +++ b/include/ar.h @@ -0,0 +1,65 @@ +/* $NetBSD: ar.h,v 1.4 1994/10/26 00:55:43 cgd Exp $ */ + +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * This code is derived from software contributed to Berkeley by + * Hugh Smith at The University of Guelph. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ar.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _AR_H_ +#define _AR_H_ + +/* Pre-4BSD archives had these magic numbers in them. */ +#define OARMAG1 0177555 +#define OARMAG2 0177545 + +#define ARMAG "!\n" /* ar "magic number" */ +#define SARMAG 8 /* strlen(ARMAG); */ + +#define AR_EFMT1 "#1/" /* extended format #1 */ + +struct ar_hdr { + char ar_name[16]; /* name */ + char ar_date[12]; /* modification time */ + char ar_uid[6]; /* user id */ + char ar_gid[6]; /* group id */ + char ar_mode[8]; /* octal file permissions */ + char ar_size[10]; /* size in bytes */ +#define ARFMAG "`\n" + char ar_fmag[2]; /* consistency check */ +}; + +#endif /* !_AR_H_ */ diff --git a/include/argz.h b/include/argz.h new file mode 100644 index 0000000..02c9adb --- /dev/null +++ b/include/argz.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _ARGZ_H_ +#define _ARGZ_H_ + +#include +#include + +#include "_ansi.h" + +_BEGIN_STD_C + +/* The newlib implementation of these functions assumes that sizeof(char) == 1. */ +error_t argz_create (char *const argv[], char **argz, size_t *argz_len); +error_t argz_create_sep (const char *string, int sep, char **argz, size_t *argz_len); +size_t argz_count (const char *argz, size_t argz_len); +void argz_extract (char *argz, size_t argz_len, char **argv); +void argz_stringify (char *argz, size_t argz_len, int sep); +error_t argz_add (char **argz, size_t *argz_len, const char *str); +error_t argz_add_sep (char **argz, size_t *argz_len, const char *str, int sep); +error_t argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len); +error_t argz_delete (char **argz, size_t *argz_len, char *entry); +error_t argz_insert (char **argz, size_t *argz_len, char *before, const char *entry); +char * argz_next (char *argz, size_t argz_len, const char *entry); +error_t argz_replace (char **argz, size_t *argz_len, const char *str, const char *with, unsigned *replace_count); + +_END_STD_C + +#endif /* _ARGZ_H_ */ diff --git a/include/arm-acle-compat.h b/include/arm-acle-compat.h new file mode 100644 index 0000000..888ae2e --- /dev/null +++ b/include/arm-acle-compat.h @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __ARM_ARCH + +/* ACLE standardises a set of pre-defines that describe the ARM architecture. + These were mostly implemented in GCC around GCC-4.8; older versions + have no, or only partial support. To provide a level of backwards + compatibility we try to work out what the definitions should be, given + the older pre-defines that GCC did produce. This isn't complete, but + it should be enough for use by routines that depend on this header. */ + +/* No need to handle ARMv8, GCC had ACLE support before that. */ + +# ifdef __ARM_ARCH_7__ +/* The common subset of ARMv7 in all profiles. */ +# define __ARM_ARCH 7 +# define __ARM_ARCH_ISA_THUMB 2 +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_LDREX 7 +# define __ARM_FEATURE_UNALIGNED +# endif + +# if defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7R__) +# define __ARM_ARCH 7 +# define __ARM_ARCH_ISA_THUMB 2 +# define __ARM_ARCH_ISA_ARM +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_SIMD32 +# define __ARM_FEATURE_DSP +# define __ARM_FEATURE_QBIT +# define __ARM_FEATURE_SAT +# define __ARM_FEATURE_LDREX 15 +# define __ARM_FEATURE_UNALIGNED +# ifdef __ARM_ARCH_7A__ +# define __ARM_ARCH_PROFILE 'A' +# else +# define __ARM_ARCH_PROFILE 'R' +# endif +# endif + +# ifdef __ARM_ARCH_7EM__ +# define __ARM_ARCH 7 +# define __ARM_ARCH_ISA_THUMB 2 +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_SIMD32 +# define __ARM_FEATURE_DSP +# define __ARM_FEATURE_QBIT +# define __ARM_FEATURE_SAT +# define __ARM_FEATURE_LDREX 7 +# define __ARM_FEATURE_UNALIGNED +# define __ARM_ARCH_PROFILE 'M' +# endif + +# ifdef __ARM_ARCH_7M__ +# define __ARM_ARCH 7 +# define __ARM_ARCH_ISA_THUMB 2 +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_QBIT +# define __ARM_FEATURE_SAT +# define __ARM_FEATURE_LDREX 7 +# define __ARM_FEATURE_UNALIGNED +# define __ARM_ARCH_PROFILE 'M' +# endif + +# ifdef __ARM_ARCH_6T2__ +# define __ARM_ARCH 6 +# define __ARM_ARCH_ISA_THUMB 2 +# define __ARM_ARCH_ISA_ARM +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_SIMD32 +# define __ARM_FEATURE_DSP +# define __ARM_FEATURE_QBIT +# define __ARM_FEATURE_SAT +# define __ARM_FEATURE_LDREX 4 +# define __ARM_FEATURE_UNALIGNED +# endif + +# ifdef __ARM_ARCH_6M__ +# define __ARM_ARCH 6 +# define __ARM_ARCH_ISA_THUMB 1 +# define __ARM_ARCH_PROFILE 'M' +# endif + +# if defined (__ARM_ARCH_6__) || defined (__ARM_ARCH_6J__) \ + || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6Z__) \ + || defined (__ARM_ARCH_6ZK__) +# define __ARM_ARCH 6 +# define __ARM_ARCH_ISA_THUMB 1 +# define __ARM_ARCH_ISA_ARM +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_SIMD32 +# define __ARM_FEATURE_DSP +# define __ARM_FEATURE_QBIT +# define __ARM_FEATURE_SAT +# define __ARM_FEATURE_UNALIGNED +# ifndef __thumb__ +# if defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__) +# define __ARM_FEATURE_LDREX 15 +# else +# define __ARM_FEATURE_LDREX 4 +# endif +# endif +# endif + +# if defined (__ARM_ARCH_5TE__) || defined (__ARM_ARCH_5E__) +# define __ARM_ARCH 5 +# define __ARM_ARCH_ISA_ARM +# ifdef __ARM_ARCH_5TE__ +# define __ARM_ARCH_ISA_THUMB 1 +# endif +# define __ARM_FEATURE_CLZ +# define __ARM_FEATURE_DSP +# endif + +# if defined (__ARM_ARCH_5T__) || defined (__ARM_ARCH_5__) +# define __ARM_ARCH 5 +# define __ARM_ARCH_ISA_ARM +# ifdef __ARM_ARCH_5TE__ +# define __ARM_ARCH_ISA_THUMB 1 +# endif +# define __ARM_FEATURE_CLZ +# endif + +# ifdef __ARM_ARCH_4T__ +# define __ARM_ARCH 4 +# define __ARM_ARCH_ISA_ARM +# define __ARM_ARCH_ISA_THUMB 1 +# endif + +# ifdef __ARM_ARCH_4__ +# define __ARM_ARCH 4 +# define __ARM_ARCH_ISA_ARM +# endif + +# if defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__) +# define __ARM_ARCH 3 +# define __ARM_ARCH_ISA_ARM +# endif + +# ifdef __ARM_ARCH_2__ +# define __ARM_ARCH 2 +# define __ARM_ARCH_ISA_ARM +# endif + +# ifdef __ARMEB__ +# define __ARM_BIG_ENDIAN +# endif + +/* If we still don't know what the target architecture is, then we're + probably not using GCC. */ +# ifndef __ARM_ARCH +# error Unable to determine architecture version. +# endif + +#endif /* __ARM_ARCH */ + diff --git a/include/assert.h b/include/assert.h new file mode 100644 index 0000000..b9e5e9b --- /dev/null +++ b/include/assert.h @@ -0,0 +1,50 @@ +/* + assert.h +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "_ansi.h" + +#undef assert + +#ifdef NDEBUG /* required by ANSI standard */ +# define assert(__e) ((void)0) +#else +# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ + __ASSERT_FUNC, #__e)) + +# ifndef __ASSERT_FUNC + /* Use g++'s demangled names in C++. */ +# if defined __cplusplus && defined __GNUC__ +# define __ASSERT_FUNC __PRETTY_FUNCTION__ + + /* C99 requires the use of __func__. */ +# elif __STDC_VERSION__ >= 199901L +# define __ASSERT_FUNC __func__ + + /* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ +# elif __GNUC__ >= 2 +# define __ASSERT_FUNC __FUNCTION__ + + /* failed to detect __func__ support. */ +# else +# define __ASSERT_FUNC ((char *) 0) +# endif +# endif /* !__ASSERT_FUNC */ +#endif /* !NDEBUG */ + +void __assert (const char *, int, const char *) + _ATTRIBUTE ((__noreturn__)); +void __assert_func (const char *, int, const char *, const char *) + _ATTRIBUTE ((__noreturn__)); + +#if __STDC_VERSION__ >= 201112L && !defined __cplusplus +# define static_assert _Static_assert +#endif + +#ifdef __cplusplus +} +#endif diff --git a/include/bfdlink.h b/include/bfdlink.h new file mode 100644 index 0000000..1ac0738 --- /dev/null +++ b/include/bfdlink.h @@ -0,0 +1,842 @@ +/* bfdlink.h -- header file for BFD link routines + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. + Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef BFDLINK_H +#define BFDLINK_H + +/* Which symbols to strip during a link. */ +enum bfd_link_strip +{ + strip_none, /* Don't strip any symbols. */ + strip_debugger, /* Strip debugging symbols. */ + strip_some, /* keep_hash is the list of symbols to keep. */ + strip_all /* Strip all symbols. */ +}; + +/* Which local symbols to discard during a link. This is irrelevant + if strip_all is used. */ +enum bfd_link_discard +{ + discard_sec_merge, /* Discard local temporary symbols in SEC_MERGE + sections. */ + discard_none, /* Don't discard any locals. */ + discard_l, /* Discard local temporary symbols. */ + discard_all /* Discard all locals. */ +}; + +/* Describes the type of hash table entry structure being used. + Different hash table structure have different fields and so + support different linking features. */ +enum bfd_link_hash_table_type + { + bfd_link_generic_hash_table, + bfd_link_elf_hash_table + }; + +/* These are the possible types of an entry in the BFD link hash + table. */ + +enum bfd_link_hash_type +{ + bfd_link_hash_new, /* Symbol is new. */ + bfd_link_hash_undefined, /* Symbol seen before, but undefined. */ + bfd_link_hash_undefweak, /* Symbol is weak and undefined. */ + bfd_link_hash_defined, /* Symbol is defined. */ + bfd_link_hash_defweak, /* Symbol is weak and defined. */ + bfd_link_hash_common, /* Symbol is common. */ + bfd_link_hash_indirect, /* Symbol is an indirect link. */ + bfd_link_hash_warning /* Like indirect, but warn if referenced. */ +}; + +enum bfd_link_common_skip_ar_symbols +{ + bfd_link_common_skip_none, + bfd_link_common_skip_text, + bfd_link_common_skip_data, + bfd_link_common_skip_all +}; + +struct bfd_link_hash_common_entry + { + unsigned int alignment_power; /* Alignment. */ + asection *section; /* Symbol section. */ + }; + +/* The linking routines use a hash table which uses this structure for + its elements. */ + +struct bfd_link_hash_entry +{ + /* Base hash table entry structure. */ + struct bfd_hash_entry root; + + /* Type of this entry. */ + ENUM_BITFIELD (bfd_link_hash_type) type : 8; + + unsigned int non_ir_ref : 1; + + /* A union of information depending upon the type. */ + union + { + /* Nothing is kept for bfd_hash_new. */ + /* bfd_link_hash_undefined, bfd_link_hash_undefweak. */ + struct + { + /* Undefined and common symbols are kept in a linked list through + this field. This field is present in all of the union element + so that we don't need to remove entries from the list when we + change their type. Removing entries would either require the + list to be doubly linked, which would waste more memory, or + require a traversal. When an undefined or common symbol is + created, it should be added to this list, the head of which is in + the link hash table itself. As symbols are defined, they need + not be removed from the list; anything which reads the list must + doublecheck the symbol type. + + Weak symbols are not kept on this list. + + Defined and defweak symbols use this field as a reference marker. + If the field is not NULL, or this structure is the tail of the + undefined symbol list, the symbol has been referenced. If the + symbol is undefined and becomes defined, this field will + automatically be non-NULL since the symbol will have been on the + undefined symbol list. */ + struct bfd_link_hash_entry *next; + bfd *abfd; /* BFD symbol was found in. */ + } undef; + /* bfd_link_hash_defined, bfd_link_hash_defweak. */ + struct + { + struct bfd_link_hash_entry *next; + asection *section; /* Symbol section. */ + bfd_vma value; /* Symbol value. */ + } def; + /* bfd_link_hash_indirect, bfd_link_hash_warning. */ + struct + { + struct bfd_link_hash_entry *next; + struct bfd_link_hash_entry *link; /* Real symbol. */ + const char *warning; /* Warning (bfd_link_hash_warning only). */ + } i; + /* bfd_link_hash_common. */ + struct + { + struct bfd_link_hash_entry *next; + /* The linker needs to know three things about common + symbols: the size, the alignment, and the section in + which the symbol should be placed. We store the size + here, and we allocate a small structure to hold the + section and the alignment. The alignment is stored as a + power of two. We don't store all the information + directly because we don't want to increase the size of + the union; this structure is a major space user in the + linker. */ + struct bfd_link_hash_common_entry *p; + bfd_size_type size; /* Common symbol size. */ + } c; + } u; +}; + +/* This is the link hash table. It is a derived class of + bfd_hash_table. */ + +struct bfd_link_hash_table +{ + /* The hash table itself. */ + struct bfd_hash_table table; + /* A linked list of undefined and common symbols, linked through the + next field in the bfd_link_hash_entry structure. */ + struct bfd_link_hash_entry *undefs; + /* Entries are added to the tail of the undefs list. */ + struct bfd_link_hash_entry *undefs_tail; + /* The type of the link hash table. */ + enum bfd_link_hash_table_type type; +}; + +/* Look up an entry in a link hash table. If FOLLOW is TRUE, this + follows bfd_link_hash_indirect and bfd_link_hash_warning links to + the real symbol. */ +extern struct bfd_link_hash_entry *bfd_link_hash_lookup + (struct bfd_link_hash_table *, const char *, bfd_boolean create, + bfd_boolean copy, bfd_boolean follow); + +/* Look up an entry in the main linker hash table if the symbol might + be wrapped. This should only be used for references to an + undefined symbol, not for definitions of a symbol. */ + +extern struct bfd_link_hash_entry *bfd_wrapped_link_hash_lookup + (bfd *, struct bfd_link_info *, const char *, bfd_boolean, + bfd_boolean, bfd_boolean); + +/* Traverse a link hash table. */ +extern void bfd_link_hash_traverse + (struct bfd_link_hash_table *, + bfd_boolean (*) (struct bfd_link_hash_entry *, void *), + void *); + +/* Add an entry to the undefs list. */ +extern void bfd_link_add_undef + (struct bfd_link_hash_table *, struct bfd_link_hash_entry *); + +/* Remove symbols from the undefs list that don't belong there. */ +extern void bfd_link_repair_undef_list + (struct bfd_link_hash_table *table); + +/* Read symbols and cache symbol pointer array in outsymbols. */ +extern bfd_boolean bfd_generic_link_read_symbols (bfd *); + +struct bfd_sym_chain +{ + struct bfd_sym_chain *next; + const char *name; +}; + +/* How to handle unresolved symbols. + There are four possibilities which are enumerated below: */ +enum report_method +{ + /* This is the initial value when then link_info structure is created. + It allows the various stages of the linker to determine whether they + allowed to set the value. */ + RM_NOT_YET_SET = 0, + RM_IGNORE, + RM_GENERATE_WARNING, + RM_GENERATE_ERROR +}; + +typedef enum {with_flags, without_flags} flag_type; + +/* A section flag list. */ +struct flag_info_list +{ + flag_type with; + const char *name; + bfd_boolean valid; + struct flag_info_list *next; +}; + +/* Section flag info. */ +struct flag_info +{ + flagword only_with_flags; + flagword not_with_flags; + struct flag_info_list *flag_list; + bfd_boolean flags_initialized; +}; + +struct bfd_elf_dynamic_list; +struct bfd_elf_version_tree; + +/* This structure holds all the information needed to communicate + between BFD and the linker when doing a link. */ + +struct bfd_link_info +{ + /* TRUE if BFD should generate a shared object (or a pie). */ + unsigned int shared: 1; + + /* TRUE if generating an executable, position independent or not. */ + unsigned int executable : 1; + + /* TRUE if generating a position independent executable. */ + unsigned int pie: 1; + + /* TRUE if BFD should generate a relocatable object file. */ + unsigned int relocatable: 1; + + /* TRUE if BFD should pre-bind symbols in a shared object. */ + unsigned int symbolic: 1; + + /* TRUE if executable should not contain copy relocs. + Setting this true may result in a non-sharable text segment. */ + unsigned int nocopyreloc: 1; + + /* TRUE if BFD should export all symbols in the dynamic symbol table + of an executable, rather than only those used. */ + unsigned int export_dynamic: 1; + + /* TRUE if a default symbol version should be created and used for + exported symbols. */ + unsigned int create_default_symver: 1; + + /* TRUE if unreferenced sections should be removed. */ + unsigned int gc_sections: 1; + + /* TRUE if every symbol should be reported back via the notice + callback. */ + unsigned int notice_all: 1; + + /* TRUE if we are loading LTO outputs. */ + unsigned int loading_lto_outputs: 1; + + /* TRUE if global symbols in discarded sections should be stripped. */ + unsigned int strip_discarded: 1; + + /* TRUE if all data symbols should be dynamic. */ + unsigned int dynamic_data: 1; + + /* Which symbols to strip. */ + ENUM_BITFIELD (bfd_link_strip) strip : 2; + + /* Which local symbols to discard. */ + ENUM_BITFIELD (bfd_link_discard) discard : 2; + + /* Criteria for skipping symbols when determining + whether to include an object from an archive. */ + ENUM_BITFIELD (bfd_link_common_skip_ar_symbols) common_skip_ar_symbols : 2; + + /* What to do with unresolved symbols in an object file. + When producing executables the default is GENERATE_ERROR. + When producing shared libraries the default is IGNORE. The + assumption with shared libraries is that the reference will be + resolved at load/execution time. */ + ENUM_BITFIELD (report_method) unresolved_syms_in_objects : 2; + + /* What to do with unresolved symbols in a shared library. + The same defaults apply. */ + ENUM_BITFIELD (report_method) unresolved_syms_in_shared_libs : 2; + + /* TRUE if shared objects should be linked directly, not shared. */ + unsigned int static_link: 1; + + /* TRUE if symbols should be retained in memory, FALSE if they + should be freed and reread. */ + unsigned int keep_memory: 1; + + /* TRUE if BFD should generate relocation information in the final + executable. */ + unsigned int emitrelocations: 1; + + /* TRUE if PT_GNU_RELRO segment should be created. */ + unsigned int relro: 1; + + /* TRUE if .eh_frame_hdr section and PT_GNU_EH_FRAME ELF segment + should be created. */ + unsigned int eh_frame_hdr: 1; + + /* TRUE if we should warn when adding a DT_TEXTREL to a shared object. */ + unsigned int warn_shared_textrel: 1; + + /* TRUE if we should error when adding a DT_TEXTREL. */ + unsigned int error_textrel: 1; + + /* TRUE if .hash section should be created. */ + unsigned int emit_hash: 1; + + /* TRUE if .gnu.hash section should be created. */ + unsigned int emit_gnu_hash: 1; + + /* If TRUE reduce memory overheads, at the expense of speed. This will + cause map file generation to use an O(N^2) algorithm and disable + caching ELF symbol buffer. */ + unsigned int reduce_memory_overheads: 1; + + /* TRUE if the output file should be in a traditional format. This + is equivalent to the setting of the BFD_TRADITIONAL_FORMAT flag + on the output file, but may be checked when reading the input + files. */ + unsigned int traditional_format: 1; + + /* TRUE if non-PLT relocs should be merged into one reloc section + and sorted so that relocs against the same symbol come together. */ + unsigned int combreloc: 1; + + /* TRUE if a default symbol version should be created and used for + imported symbols. */ + unsigned int default_imported_symver: 1; + + /* TRUE if the new ELF dynamic tags are enabled. */ + unsigned int new_dtags: 1; + + /* FALSE if .eh_frame unwind info should be generated for PLT and other + linker created sections, TRUE if it should be omitted. */ + unsigned int no_ld_generated_unwind_info: 1; + + /* TRUE if BFD should generate a "task linked" object file, + similar to relocatable but also with globals converted to + statics. */ + unsigned int task_link: 1; + + /* TRUE if ok to have multiple definition. */ + unsigned int allow_multiple_definition: 1; + + /* TRUE if ok to have version with no definition. */ + unsigned int allow_undefined_version: 1; + + /* TRUE if some symbols have to be dynamic, controlled by + --dynamic-list command line options. */ + unsigned int dynamic: 1; + + /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W|PF_X + flags. */ + unsigned int execstack: 1; + + /* TRUE if PT_GNU_STACK segment should be created with PF_R|PF_W + flags. */ + unsigned int noexecstack: 1; + + /* TRUE if we want to produced optimized output files. This might + need much more time and therefore must be explicitly selected. */ + unsigned int optimize: 1; + + /* TRUE if user should be informed of removed unreferenced sections. */ + unsigned int print_gc_sections: 1; + + /* TRUE if we should warn alternate ELF machine code. */ + unsigned int warn_alternate_em: 1; + + /* TRUE if the linker script contained an explicit PHDRS command. */ + unsigned int user_phdrs: 1; + + /* Char that may appear as the first char of a symbol, but should be + skipped (like symbol_leading_char) when looking up symbols in + wrap_hash. Used by PowerPC Linux for 'dot' symbols. */ + char wrap_char; + + /* Separator between archive and filename in linker script filespecs. */ + char path_separator; + + /* Default stack size. Zero means default (often zero itself), -1 + means explicitly zero-sized. */ + bfd_signed_vma stacksize; + + /* Enable or disable target specific optimizations. + + Not all targets have optimizations to enable. + + Normally these optimizations are disabled by default but some targets + prefer to enable them by default. So this field is a tri-state variable. + The values are: + + zero: Enable the optimizations (either from --relax being specified on + the command line or the backend's before_allocation emulation function. + + positive: The user has requested that these optimizations be disabled. + (Via the --no-relax command line option). + + negative: The optimizations are disabled. (Set when initializing the + args_type structure in ldmain.c:main. */ + signed int disable_target_specific_optimizations; + + /* Function callbacks. */ + const struct bfd_link_callbacks *callbacks; + + /* Hash table handled by BFD. */ + struct bfd_link_hash_table *hash; + + /* Hash table of symbols to keep. This is NULL unless strip is + strip_some. */ + struct bfd_hash_table *keep_hash; + + /* Hash table of symbols to report back via the notice callback. If + this is NULL, and notice_all is FALSE, then no symbols are + reported back. */ + struct bfd_hash_table *notice_hash; + + /* Hash table of symbols which are being wrapped (the --wrap linker + option). If this is NULL, no symbols are being wrapped. */ + struct bfd_hash_table *wrap_hash; + + /* Hash table of symbols which may be left unresolved during + a link. If this is NULL, no symbols can be left unresolved. */ + struct bfd_hash_table *ignore_hash; + + /* The output BFD. */ + bfd *output_bfd; + + /* The list of input BFD's involved in the link. These are chained + together via the link_next field. */ + bfd *input_bfds; + bfd **input_bfds_tail; + + /* If a symbol should be created for each input BFD, this is section + where those symbols should be placed. It must be a section in + the output BFD. It may be NULL, in which case no such symbols + will be created. This is to support CREATE_OBJECT_SYMBOLS in the + linker command language. */ + asection *create_object_symbols_section; + + /* List of global symbol names that are starting points for marking + sections against garbage collection. */ + struct bfd_sym_chain *gc_sym_list; + + /* If a base output file is wanted, then this points to it */ + void *base_file; + + /* The function to call when the executable or shared object is + loaded. */ + const char *init_function; + + /* The function to call when the executable or shared object is + unloaded. */ + const char *fini_function; + + /* Number of relaxation passes. Usually only one relaxation pass + is needed. But a backend can have as many relaxation passes as + necessary. During bfd_relax_section call, it is set to the + current pass, starting from 0. */ + int relax_pass; + + /* Number of relaxation trips. This number is incremented every + time the relaxation pass is restarted due to a previous + relaxation returning true in *AGAIN. */ + int relax_trip; + + /* Non-zero if auto-import thunks for DATA items in pei386 DLLs + should be generated/linked against. Set to 1 if this feature + is explicitly requested by the user, -1 if enabled by default. */ + int pei386_auto_import; + + /* Non-zero if runtime relocs for DATA items with non-zero addends + in pei386 DLLs should be generated. Set to 1 if this feature + is explicitly requested by the user, -1 if enabled by default. */ + int pei386_runtime_pseudo_reloc; + + /* How many spare .dynamic DT_NULL entries should be added? */ + unsigned int spare_dynamic_tags; + + /* May be used to set DT_FLAGS for ELF. */ + bfd_vma flags; + + /* May be used to set DT_FLAGS_1 for ELF. */ + bfd_vma flags_1; + + /* Start and end of RELRO region. */ + bfd_vma relro_start, relro_end; + + /* List of symbols should be dynamic. */ + struct bfd_elf_dynamic_list *dynamic_list; + + /* The version information. */ + struct bfd_elf_version_tree *version_info; +}; + +/* This structures holds a set of callback functions. These are called + by the BFD linker routines. Except for the info functions, the first + argument to each callback function is the bfd_link_info structure + being used and each function returns a boolean value. If the + function returns FALSE, then the BFD function which called it should + return with a failure indication. */ + +struct bfd_link_callbacks +{ + /* A function which is called when an object is added from an + archive. ABFD is the archive element being added. NAME is the + name of the symbol which caused the archive element to be pulled + in. This function may set *SUBSBFD to point to an alternative + BFD from which symbols should in fact be added in place of the + original BFD's symbols. */ + bfd_boolean (*add_archive_element) + (struct bfd_link_info *, bfd *abfd, const char *name, bfd **subsbfd); + /* A function which is called when a symbol is found with multiple + definitions. H is the symbol which is defined multiple times. + NBFD is the new BFD, NSEC is the new section, and NVAL is the new + value. NSEC may be bfd_com_section or bfd_ind_section. */ + bfd_boolean (*multiple_definition) + (struct bfd_link_info *, struct bfd_link_hash_entry *h, + bfd *nbfd, asection *nsec, bfd_vma nval); + /* A function which is called when a common symbol is defined + multiple times. H is the symbol appearing multiple times. + NBFD is the BFD of the new symbol. NTYPE is the type of the new + symbol, one of bfd_link_hash_defined, bfd_link_hash_common, or + bfd_link_hash_indirect. If NTYPE is bfd_link_hash_common, NSIZE + is the size of the new symbol. */ + bfd_boolean (*multiple_common) + (struct bfd_link_info *, struct bfd_link_hash_entry *h, + bfd *nbfd, enum bfd_link_hash_type ntype, bfd_vma nsize); + /* A function which is called to add a symbol to a set. ENTRY is + the link hash table entry for the set itself (e.g., + __CTOR_LIST__). RELOC is the relocation to use for an entry in + the set when generating a relocatable file, and is also used to + get the size of the entry when generating an executable file. + ABFD, SEC and VALUE identify the value to add to the set. */ + bfd_boolean (*add_to_set) + (struct bfd_link_info *, struct bfd_link_hash_entry *entry, + bfd_reloc_code_real_type reloc, bfd *abfd, asection *sec, bfd_vma value); + /* A function which is called when the name of a g++ constructor or + destructor is found. This is only called by some object file + formats. CONSTRUCTOR is TRUE for a constructor, FALSE for a + destructor. This will use BFD_RELOC_CTOR when generating a + relocatable file. NAME is the name of the symbol found. ABFD, + SECTION and VALUE are the value of the symbol. */ + bfd_boolean (*constructor) + (struct bfd_link_info *, bfd_boolean constructor, const char *name, + bfd *abfd, asection *sec, bfd_vma value); + /* A function which is called to issue a linker warning. For + example, this is called when there is a reference to a warning + symbol. WARNING is the warning to be issued. SYMBOL is the name + of the symbol which triggered the warning; it may be NULL if + there is none. ABFD, SECTION and ADDRESS identify the location + which trigerred the warning; either ABFD or SECTION or both may + be NULL if the location is not known. */ + bfd_boolean (*warning) + (struct bfd_link_info *, const char *warning, const char *symbol, + bfd *abfd, asection *section, bfd_vma address); + /* A function which is called when a relocation is attempted against + an undefined symbol. NAME is the symbol which is undefined. + ABFD, SECTION and ADDRESS identify the location from which the + reference is made. IS_FATAL indicates whether an undefined symbol is + a fatal error or not. In some cases SECTION may be NULL. */ + bfd_boolean (*undefined_symbol) + (struct bfd_link_info *, const char *name, bfd *abfd, + asection *section, bfd_vma address, bfd_boolean is_fatal); + /* A function which is called when a reloc overflow occurs. ENTRY is + the link hash table entry for the symbol the reloc is against. + NAME is the name of the local symbol or section the reloc is + against, RELOC_NAME is the name of the relocation, and ADDEND is + any addend that is used. ABFD, SECTION and ADDRESS identify the + location at which the overflow occurs; if this is the result of a + bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then + ABFD will be NULL. */ + bfd_boolean (*reloc_overflow) + (struct bfd_link_info *, struct bfd_link_hash_entry *entry, + const char *name, const char *reloc_name, bfd_vma addend, + bfd *abfd, asection *section, bfd_vma address); + /* A function which is called when a dangerous reloc is performed. + MESSAGE is an appropriate message. + ABFD, SECTION and ADDRESS identify the location at which the + problem occurred; if this is the result of a + bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then + ABFD will be NULL. */ + bfd_boolean (*reloc_dangerous) + (struct bfd_link_info *, const char *message, + bfd *abfd, asection *section, bfd_vma address); + /* A function which is called when a reloc is found to be attached + to a symbol which is not being written out. NAME is the name of + the symbol. ABFD, SECTION and ADDRESS identify the location of + the reloc; if this is the result of a + bfd_section_reloc_link_order or bfd_symbol_reloc_link_order, then + ABFD will be NULL. */ + bfd_boolean (*unattached_reloc) + (struct bfd_link_info *, const char *name, + bfd *abfd, asection *section, bfd_vma address); + /* A function which is called when a symbol in notice_hash is + defined or referenced. H is the symbol. ABFD, SECTION and + ADDRESS are the (new) value of the symbol. If SECTION is + bfd_und_section, this is a reference. FLAGS are the symbol + BSF_* flags. STRING is the name of the symbol to indirect to if + the sym is indirect, or the warning string if a warning sym. */ + bfd_boolean (*notice) + (struct bfd_link_info *, struct bfd_link_hash_entry *h, + bfd *abfd, asection *section, bfd_vma address, flagword flags, + const char *string); + /* Error or warning link info message. */ + void (*einfo) + (const char *fmt, ...); + /* General link info message. */ + void (*info) + (const char *fmt, ...); + /* Message to be printed in linker map file. */ + void (*minfo) + (const char *fmt, ...); + /* This callback provides a chance for users of the BFD library to + override its decision about whether to place two adjacent sections + into the same segment. */ + bfd_boolean (*override_segment_assignment) + (struct bfd_link_info *, bfd * abfd, + asection * current_section, asection * previous_section, + bfd_boolean new_segment); +}; + +/* The linker builds link_order structures which tell the code how to + include input data in the output file. */ + +/* These are the types of link_order structures. */ + +enum bfd_link_order_type +{ + bfd_undefined_link_order, /* Undefined. */ + bfd_indirect_link_order, /* Built from a section. */ + bfd_data_link_order, /* Set to explicit data. */ + bfd_section_reloc_link_order, /* Relocate against a section. */ + bfd_symbol_reloc_link_order /* Relocate against a symbol. */ +}; + +/* This is the link_order structure itself. These form a chain + attached to the output section whose contents they are describing. */ + +struct bfd_link_order +{ + /* Next link_order in chain. */ + struct bfd_link_order *next; + /* Type of link_order. */ + enum bfd_link_order_type type; + /* Offset within output section. */ + bfd_vma offset; + /* Size within output section. */ + bfd_size_type size; + /* Type specific information. */ + union + { + struct + { + /* Section to include. If this is used, then + section->output_section must be the section the + link_order is attached to, section->output_offset must + equal the link_order offset field, and section->size + must equal the link_order size field. Maybe these + restrictions should be relaxed someday. */ + asection *section; + } indirect; + struct + { + /* Size of contents, or zero when contents should be filled by + the architecture-dependent fill function. + A non-zero value allows filling of the output section + with an arbitrary repeated pattern. */ + unsigned int size; + /* Data to put into file. */ + bfd_byte *contents; + } data; + struct + { + /* Description of reloc to generate. Used for + bfd_section_reloc_link_order and + bfd_symbol_reloc_link_order. */ + struct bfd_link_order_reloc *p; + } reloc; + } u; +}; + +/* A linker order of type bfd_section_reloc_link_order or + bfd_symbol_reloc_link_order means to create a reloc against a + section or symbol, respectively. This is used to implement -Ur to + generate relocs for the constructor tables. The + bfd_link_order_reloc structure describes the reloc that BFD should + create. It is similar to a arelent, but I didn't use arelent + because the linker does not know anything about most symbols, and + any asymbol structure it creates will be partially meaningless. + This information could logically be in the bfd_link_order struct, + but I didn't want to waste the space since these types of relocs + are relatively rare. */ + +struct bfd_link_order_reloc +{ + /* Reloc type. */ + bfd_reloc_code_real_type reloc; + + union + { + /* For type bfd_section_reloc_link_order, this is the section + the reloc should be against. This must be a section in the + output BFD, not any of the input BFDs. */ + asection *section; + /* For type bfd_symbol_reloc_link_order, this is the name of the + symbol the reloc should be against. */ + const char *name; + } u; + + /* Addend to use. The object file should contain zero. The BFD + backend is responsible for filling in the contents of the object + file correctly. For some object file formats (e.g., COFF) the + addend must be stored into in the object file, and for some + (e.g., SPARC a.out) it is kept in the reloc. */ + bfd_vma addend; +}; + +/* Allocate a new link_order for a section. */ +extern struct bfd_link_order *bfd_new_link_order (bfd *, asection *); + +/* These structures are used to describe version information for the + ELF linker. These structures could be manipulated entirely inside + BFD, but it would be a pain. Instead, the regular linker sets up + these structures, and then passes them into BFD. */ + +/* Glob pattern for a version. */ + +struct bfd_elf_version_expr +{ + /* Next glob pattern for this version. */ + struct bfd_elf_version_expr *next; + /* Glob pattern. */ + const char *pattern; + /* Set if pattern is not a glob. */ + unsigned int literal : 1; + /* Defined by ".symver". */ + unsigned int symver : 1; + /* Defined by version script. */ + unsigned int script : 1; + /* Pattern type. */ +#define BFD_ELF_VERSION_C_TYPE 1 +#define BFD_ELF_VERSION_CXX_TYPE 2 +#define BFD_ELF_VERSION_JAVA_TYPE 4 + unsigned int mask : 3; +}; + +struct bfd_elf_version_expr_head +{ + /* List of all patterns, both wildcards and non-wildcards. */ + struct bfd_elf_version_expr *list; + /* Hash table for non-wildcards. */ + void *htab; + /* Remaining patterns. */ + struct bfd_elf_version_expr *remaining; + /* What kind of pattern types are present in list (bitmask). */ + unsigned int mask; +}; + +/* Version dependencies. */ + +struct bfd_elf_version_deps +{ + /* Next dependency for this version. */ + struct bfd_elf_version_deps *next; + /* The version which this version depends upon. */ + struct bfd_elf_version_tree *version_needed; +}; + +/* A node in the version tree. */ + +struct bfd_elf_version_tree +{ + /* Next version. */ + struct bfd_elf_version_tree *next; + /* Name of this version. */ + const char *name; + /* Version number. */ + unsigned int vernum; + /* Regular expressions for global symbols in this version. */ + struct bfd_elf_version_expr_head globals; + /* Regular expressions for local symbols in this version. */ + struct bfd_elf_version_expr_head locals; + /* List of versions which this version depends upon. */ + struct bfd_elf_version_deps *deps; + /* Index of the version name. This is used within BFD. */ + unsigned int name_indx; + /* Whether this version tree was used. This is used within BFD. */ + int used; + /* Matching hook. */ + struct bfd_elf_version_expr *(*match) + (struct bfd_elf_version_expr_head *head, + struct bfd_elf_version_expr *prev, const char *sym); +}; + +struct bfd_elf_dynamic_list +{ + struct bfd_elf_version_expr_head head; + struct bfd_elf_version_expr *(*match) + (struct bfd_elf_version_expr_head *head, + struct bfd_elf_version_expr *prev, const char *sym); +}; + +#endif diff --git a/include/binary-io.h b/include/binary-io.h new file mode 100644 index 0000000..2984271 --- /dev/null +++ b/include/binary-io.h @@ -0,0 +1,62 @@ +/* Binary mode I/O. + Copyright (C) 2001, 2003, 2005, 2008 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 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 . */ + +#ifndef _BINARY_H +#define _BINARY_H + +/* Include this header after and , because + systems that distinguish between text and binary I/O usually + define O_BINARY in , and the MSVC7 doesn't + like to be included after '#define fileno ...' + + We don't include here because not all systems have + that header. */ + +#if !defined O_BINARY && defined _O_BINARY + /* For MSC-compatible compilers. */ +# define O_BINARY _O_BINARY +# define O_TEXT _O_TEXT +#endif +#ifdef __BEOS__ + /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */ +# undef O_BINARY +# undef O_TEXT +#endif +#if O_BINARY +# if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ +# include /* declares setmode() */ +# else +# define setmode _setmode +# undef fileno +# define fileno _fileno +# endif +# ifdef __DJGPP__ +# include /* declares isatty() */ +# /* Avoid putting stdin/stdout in binary mode if it is connected to the +# console, because that would make it impossible for the user to +# interrupt the program through Ctrl-C or Ctrl-Break. */ +# define SET_BINARY(fd) (!isatty (fd) ? (setmode (fd, O_BINARY), 0) : 0) +# else +# define SET_BINARY(fd) setmode (fd, O_BINARY) +# endif +#else + /* On reasonable systems, binary I/O is the default. */ +# undef O_BINARY +# define O_BINARY 0 +# define SET_BINARY(fd) /* nothing */ +#endif + +#endif /* _BINARY_H */ diff --git a/include/bout.h b/include/bout.h new file mode 100644 index 0000000..4a30228 --- /dev/null +++ b/include/bout.h @@ -0,0 +1,192 @@ +/* This file is a modified version of 'a.out.h'. It is to be used in all + GNU tools modified to support the i80960 (or tools that operate on + object files created by such tools). + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* All i80960 development is done in a CROSS-DEVELOPMENT environment. I.e., + object code is generated on, and executed under the direction of a symbolic + debugger running on, a host system. We do not want to be subject to the + vagaries of which host it is or whether it supports COFF or a.out format, + or anything else. We DO want to: + + o always generate the same format object files, regardless of host. + + o have an 'a.out' header that we can modify for our own purposes + (the 80960 is typically an embedded processor and may require + enhanced linker support that the normal a.out.h header can't + accommodate). + + As for byte-ordering, the following rules apply: + + o Text and data that is actually downloaded to the target is always + in i80960 (little-endian) order. + + o All other numbers (in the header, symbols, relocation directives) + are in host byte-order: object files CANNOT be lifted from a + little-end host and used on a big-endian (or vice versa) without + modification. + ==> THIS IS NO LONGER TRUE USING BFD. WE CAN GENERATE ANY BYTE ORDER + FOR THE HEADER, AND READ ANY BYTE ORDER. PREFERENCE WOULD BE TO + USE LITTLE-ENDIAN BYTE ORDER THROUGHOUT, REGARDLESS OF HOST. <== + + o The downloader ('comm960') takes care to generate a pseudo-header + with correct (i80960) byte-ordering before shipping text and data + off to the NINDY monitor in the target systems. Symbols and + relocation info are never sent to the target. */ + +#define BMAGIC 0415 +/* We don't accept the following (see N_BADMAG macro). + They're just here so GNU code will compile. */ +#define OMAGIC 0407 /* old impure format */ +#define NMAGIC 0410 /* read-only text */ +#define ZMAGIC 0413 /* demand load format */ + +/* FILE HEADER + All 'lengths' are given as a number of bytes. + All 'alignments' are for relinkable files only; an alignment of + 'n' indicates the corresponding segment must begin at an + address that is a multiple of (2**n). */ +struct external_exec + { + /* Standard stuff */ + unsigned char e_info[4]; /* Identifies this as a b.out file */ + unsigned char e_text[4]; /* Length of text */ + unsigned char e_data[4]; /* Length of data */ + unsigned char e_bss[4]; /* Length of uninitialized data area */ + unsigned char e_syms[4]; /* Length of symbol table */ + unsigned char e_entry[4]; /* Runtime start address */ + unsigned char e_trsize[4]; /* Length of text relocation info */ + unsigned char e_drsize[4]; /* Length of data relocation info */ + + /* Added for i960 */ + unsigned char e_tload[4]; /* Text runtime load address */ + unsigned char e_dload[4]; /* Data runtime load address */ + unsigned char e_talign[1]; /* Alignment of text segment */ + unsigned char e_dalign[1]; /* Alignment of data segment */ + unsigned char e_balign[1]; /* Alignment of bss segment */ + unsigned char e_relaxable[1];/* Assembled with enough info to allow linker to relax */ + }; + +#define EXEC_BYTES_SIZE (sizeof (struct external_exec)) + +/* These macros use the a_xxx field names, since they operate on the exec + structure after it's been byte-swapped and realigned on the host machine. */ +#define N_BADMAG(x) (((x).a_info)!=BMAGIC) +#define N_TXTOFF(x) EXEC_BYTES_SIZE +#define N_DATOFF(x) ( N_TXTOFF(x) + (x).a_text ) +#define N_TROFF(x) ( N_DATOFF(x) + (x).a_data ) +#define N_TRELOFF N_TROFF +#define N_DROFF(x) ( N_TROFF(x) + (x).a_trsize ) +#define N_DRELOFF N_DROFF +#define N_SYMOFF(x) ( N_DROFF(x) + (x).a_drsize ) +#define N_STROFF(x) ( N_SYMOFF(x) + (x).a_syms ) +#define N_DATADDR(x) ( (x).a_dload ) + +/* Address of text segment in memory after it is loaded. */ +#if !defined (N_TXTADDR) +#define N_TXTADDR(x) 0 +#endif + +/* A single entry in the symbol table. */ +struct nlist + { + union + { + char* n_name; + struct nlist * n_next; + long n_strx; /* Index into string table */ + } n_un; + + unsigned char n_type; /* See below */ + char n_other; /* Used in i80960 support -- see below */ + short n_desc; + unsigned long n_value; + }; + + +/* Legal values of n_type. */ +#define N_UNDF 0 /* Undefined symbol */ +#define N_ABS 2 /* Absolute symbol */ +#define N_TEXT 4 /* Text symbol */ +#define N_DATA 6 /* Data symbol */ +#define N_BSS 8 /* BSS symbol */ +#define N_FN 31 /* Filename symbol */ + +#define N_EXT 1 /* External symbol (OR'd in with one of above) */ +#define N_TYPE 036 /* Mask for all the type bits */ +#define N_STAB 0340 /* Mask for all bits used for SDB entries */ + +/* MEANING OF 'n_other' + + If non-zero, the 'n_other' fields indicates either a leaf procedure or + a system procedure, as follows: + + 1 <= n_other <= 32 : + The symbol is the entry point to a system procedure. + 'n_value' is the address of the entry, as for any other + procedure. The system procedure number (which can be used in + a 'calls' instruction) is (n_other-1). These entries come from + '.sysproc' directives. + + n_other == N_CALLNAME + the symbol is the 'call' entry point to a leaf procedure. + The *next* symbol in the symbol table must be the corresponding + 'bal' entry point to the procedure (see following). These + entries come from '.leafproc' directives in which two different + symbols are specified (the first one is represented here). + + + n_other == N_BALNAME + the symbol is the 'bal' entry point to a leaf procedure. + These entries result from '.leafproc' directives in which only + one symbol is specified, or in which the same symbol is + specified twice. + + Note that an N_CALLNAME entry *must* have a corresponding N_BALNAME entry, + but not every N_BALNAME entry must have an N_CALLNAME entry. */ +#define N_CALLNAME ((char)-1) +#define N_BALNAME ((char)-2) +#define IS_CALLNAME(x) (N_CALLNAME == (x)) +#define IS_BALNAME(x) (N_BALNAME == (x)) +#define IS_OTHER(x) ((x)>0 && (x) <=32) + +#define b_out_relocation_info relocation_info +struct relocation_info + { + int r_address; /* File address of item to be relocated. */ + unsigned +#define r_index r_symbolnum + r_symbolnum:24, /* Index of symbol on which relocation is based, + if r_extern is set. Otherwise set to + either N_TEXT, N_DATA, or N_BSS to + indicate section on which relocation is + based. */ + r_pcrel:1, /* 1 => relocate PC-relative; else absolute + On i960, pc-relative implies 24-bit + address, absolute implies 32-bit. */ + r_length:2, /* Number of bytes to relocate: + 0 => 1 byte + 1 => 2 bytes -- used for 13 bit pcrel + 2 => 4 bytes. */ + r_extern:1, + r_bsr:1, /* Something for the GNU NS32K assembler. */ + r_disp:1, /* Something for the GNU NS32K assembler. */ + r_callj:1, /* 1 if relocation target is an i960 'callj'. */ + r_relaxable:1; /* 1 if enough info is left to relax the data. */ +}; diff --git a/include/cgen/ChangeLog b/include/cgen/ChangeLog new file mode 100644 index 0000000..7692d4e --- /dev/null +++ b/include/cgen/ChangeLog @@ -0,0 +1,32 @@ +2013-07-18 Andrew Neitsch + + PR binutils/15728 + * basic-ops.h: (SUBWORDSIQI) Make declaration static. + * (SUBWORDSIHI): Likewise. + * (SUBWORDDIQI): Likewise. + * (SUBWORDDIHI): Likewise. + * (SUBWORDDISI): Likewise. + +2010-01-05 Doug Evans + + * basic-modes.h (MAKEDI): New macro. + +2009-10-23 Doug Evans + + * basic-modes.h: New file. Moved here from opcodes/cgen-types.h. + * basic-ops.h: New file. Moved here from opcodes/cgen-ops.h. + * bitset.h: New file. Moved here from ../opcode/cgen-bitset.h. + Update license to GPL v3. + +Copyright (C) 2009-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/cgen/basic-modes.h b/include/cgen/basic-modes.h new file mode 100644 index 0000000..bd87f3a --- /dev/null +++ b/include/cgen/basic-modes.h @@ -0,0 +1,52 @@ +/* Basic CGEN modes. + Copyright 2005, 2007, 2009 Free Software Foundation, Inc. + Contributed by Red Hat. + + This file is part of the GNU opcodes library. + + This library 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, or (at your option) + any later version. + + It 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 library; see the file COPYING3. If not, write to the + Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef CGEN_BASIC_MODES_H +#define CGEN_BASIC_MODES_H + +/* This file doesn't contain all modes, + just the basic/portable ones. + It also provides access to stdint.h (*1) so the includer doesn't have + to deal with the portability issues. + (*1): To the extent that bfd_stdint.h does for now. */ + +/* IWBN to avoid unnecessary dependencies on bfd-anything. */ +#include "bfd_stdint.h" + +typedef int8_t QI; +typedef uint8_t UQI; + +typedef int16_t HI; +typedef uint16_t UHI; + +typedef int32_t SI; +typedef uint32_t USI; + +typedef int64_t DI; +typedef uint64_t UDI; + +typedef int INT; +typedef unsigned int UINT; + +/* Cover macro to create a 64-bit integer. */ +#define MAKEDI(hi, lo) ((((DI) (SI) (hi)) << 32) | ((UDI) (USI) (lo))) + +#endif /* CGEN_BASIC_MODES_H */ diff --git a/include/cgen/basic-ops.h b/include/cgen/basic-ops.h new file mode 100644 index 0000000..49883f4 --- /dev/null +++ b/include/cgen/basic-ops.h @@ -0,0 +1,347 @@ +/* Basic semantics ops support for CGEN. + Copyright 2005-2013 Free Software Foundation, Inc. + Contributed by Red Hat. + + This file is part of the GNU opcodes library. + + This library 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, or (at your option) + any later version. + + It 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 library; see the file COPYING3. If not, write to the + Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef CGEN_BASIC_OPS_H +#define CGEN_BASIC_OPS_H + +#include + +#if defined (__GNUC__) && ! defined (SEMOPS_DEFINE_INLINE) +#define SEMOPS_DEFINE_INLINE +#define SEMOPS_INLINE extern inline +#else +#define SEMOPS_INLINE +#endif + +/* These don't really have a mode. */ +#define ANDIF(x, y) ((x) && (y)) +#define ORIF(x, y) ((x) || (y)) + +#define SUBBI(x, y) ((x) - (y)) +#define ANDBI(x, y) ((x) & (y)) +#define ORBI(x, y) ((x) | (y)) +#define XORBI(x, y) ((x) ^ (y)) +#define NEGBI(x) (- (x)) +#define NOTBI(x) (! (BI) (x)) +#define INVBI(x) (~ (x)) +#define EQBI(x, y) ((BI) (x) == (BI) (y)) +#define NEBI(x, y) ((BI) (x) != (BI) (y)) +#define LTBI(x, y) ((BI) (x) < (BI) (y)) +#define LEBI(x, y) ((BI) (x) <= (BI) (y)) +#define GTBI(x, y) ((BI) (x) > (BI) (y)) +#define GEBI(x, y) ((BI) (x) >= (BI) (y)) +#define LTUBI(x, y) ((BI) (x) < (BI) (y)) +#define LEUBI(x, y) ((BI) (x) <= (BI) (y)) +#define GTUBI(x, y) ((BI) (x) > (BI) (y)) +#define GEUBI(x, y) ((BI) (x) >= (BI) (y)) + +#define ADDQI(x, y) ((x) + (y)) +#define SUBQI(x, y) ((x) - (y)) +#define MULQI(x, y) ((x) * (y)) +#define DIVQI(x, y) ((QI) (x) / (QI) (y)) +#define UDIVQI(x, y) ((UQI) (x) / (UQI) (y)) +#define MODQI(x, y) ((QI) (x) % (QI) (y)) +#define UMODQI(x, y) ((UQI) (x) % (UQI) (y)) +#define SRAQI(x, y) ((QI) (x) >> (y)) +#define SRLQI(x, y) ((UQI) (x) >> (y)) +#define SLLQI(x, y) ((UQI) (x) << (y)) +extern QI RORQI (QI, int); +extern QI ROLQI (QI, int); +#define ANDQI(x, y) ((x) & (y)) +#define ORQI(x, y) ((x) | (y)) +#define XORQI(x, y) ((x) ^ (y)) +#define NEGQI(x) (- (x)) +#define NOTQI(x) (! (QI) (x)) +#define INVQI(x) (~ (x)) +#define ABSQI(x) ((x) < 0 ? -(x) : (x)) +#define EQQI(x, y) ((QI) (x) == (QI) (y)) +#define NEQI(x, y) ((QI) (x) != (QI) (y)) +#define LTQI(x, y) ((QI) (x) < (QI) (y)) +#define LEQI(x, y) ((QI) (x) <= (QI) (y)) +#define GTQI(x, y) ((QI) (x) > (QI) (y)) +#define GEQI(x, y) ((QI) (x) >= (QI) (y)) +#define LTUQI(x, y) ((UQI) (x) < (UQI) (y)) +#define LEUQI(x, y) ((UQI) (x) <= (UQI) (y)) +#define GTUQI(x, y) ((UQI) (x) > (UQI) (y)) +#define GEUQI(x, y) ((UQI) (x) >= (UQI) (y)) + +#define ADDHI(x, y) ((x) + (y)) +#define SUBHI(x, y) ((x) - (y)) +#define MULHI(x, y) ((x) * (y)) +#define DIVHI(x, y) ((HI) (x) / (HI) (y)) +#define UDIVHI(x, y) ((UHI) (x) / (UHI) (y)) +#define MODHI(x, y) ((HI) (x) % (HI) (y)) +#define UMODHI(x, y) ((UHI) (x) % (UHI) (y)) +#define SRAHI(x, y) ((HI) (x) >> (y)) +#define SRLHI(x, y) ((UHI) (x) >> (y)) +#define SLLHI(x, y) ((UHI) (x) << (y)) +extern HI RORHI (HI, int); +extern HI ROLHI (HI, int); +#define ANDHI(x, y) ((x) & (y)) +#define ORHI(x, y) ((x) | (y)) +#define XORHI(x, y) ((x) ^ (y)) +#define NEGHI(x) (- (x)) +#define NOTHI(x) (! (HI) (x)) +#define INVHI(x) (~ (x)) +#define ABSHI(x) ((x) < 0 ? -(x) : (x)) +#define EQHI(x, y) ((HI) (x) == (HI) (y)) +#define NEHI(x, y) ((HI) (x) != (HI) (y)) +#define LTHI(x, y) ((HI) (x) < (HI) (y)) +#define LEHI(x, y) ((HI) (x) <= (HI) (y)) +#define GTHI(x, y) ((HI) (x) > (HI) (y)) +#define GEHI(x, y) ((HI) (x) >= (HI) (y)) +#define LTUHI(x, y) ((UHI) (x) < (UHI) (y)) +#define LEUHI(x, y) ((UHI) (x) <= (UHI) (y)) +#define GTUHI(x, y) ((UHI) (x) > (UHI) (y)) +#define GEUHI(x, y) ((UHI) (x) >= (UHI) (y)) + +#define ADDSI(x, y) ((x) + (y)) +#define SUBSI(x, y) ((x) - (y)) +#define MULSI(x, y) ((x) * (y)) +#define DIVSI(x, y) ((SI) (x) / (SI) (y)) +#define UDIVSI(x, y) ((USI) (x) / (USI) (y)) +#define MODSI(x, y) ((SI) (x) % (SI) (y)) +#define UMODSI(x, y) ((USI) (x) % (USI) (y)) +#define SRASI(x, y) ((SI) (x) >> (y)) +#define SRLSI(x, y) ((USI) (x) >> (y)) +#define SLLSI(x, y) ((USI) (x) << (y)) +extern SI RORSI (SI, int); +extern SI ROLSI (SI, int); +#define ANDSI(x, y) ((x) & (y)) +#define ORSI(x, y) ((x) | (y)) +#define XORSI(x, y) ((x) ^ (y)) +#define NEGSI(x) (- (x)) +#define NOTSI(x) (! (SI) (x)) +#define INVSI(x) (~ (x)) +#define ABSSI(x) ((x) < 0 ? -(x) : (x)) +#define EQSI(x, y) ((SI) (x) == (SI) (y)) +#define NESI(x, y) ((SI) (x) != (SI) (y)) +#define LTSI(x, y) ((SI) (x) < (SI) (y)) +#define LESI(x, y) ((SI) (x) <= (SI) (y)) +#define GTSI(x, y) ((SI) (x) > (SI) (y)) +#define GESI(x, y) ((SI) (x) >= (SI) (y)) +#define LTUSI(x, y) ((USI) (x) < (USI) (y)) +#define LEUSI(x, y) ((USI) (x) <= (USI) (y)) +#define GTUSI(x, y) ((USI) (x) > (USI) (y)) +#define GEUSI(x, y) ((USI) (x) >= (USI) (y)) + +#ifdef DI_FN_SUPPORT +extern DI ADDDI (DI, DI); +extern DI SUBDI (DI, DI); +extern DI MULDI (DI, DI); +extern DI DIVDI (DI, DI); +extern DI UDIVDI (DI, DI); +extern DI MODDI (DI, DI); +extern DI UMODDI (DI, DI); +extern DI SRADI (DI, int); +extern UDI SRLDI (UDI, int); +extern UDI SLLDI (UDI, int); +extern DI RORDI (DI, int); +extern DI ROLDI (DI, int); +extern DI ANDDI (DI, DI); +extern DI ORDI (DI, DI); +extern DI XORDI (DI, DI); +extern DI NEGDI (DI); +extern int NOTDI (DI); +extern DI INVDI (DI); +extern int EQDI (DI, DI); +extern int NEDI (DI, DI); +extern int LTDI (DI, DI); +extern int LEDI (DI, DI); +extern int GTDI (DI, DI); +extern int GEDI (DI, DI); +extern int LTUDI (UDI, UDI); +extern int LEUDI (UDI, UDI); +extern int GTUDI (UDI, UDI); +extern int GEUDI (UDI, UDI); +#else /* ! DI_FN_SUPPORT */ +#define ADDDI(x, y) ((x) + (y)) +#define SUBDI(x, y) ((x) - (y)) +#define MULDI(x, y) ((x) * (y)) +#define DIVDI(x, y) ((DI) (x) / (DI) (y)) +#define UDIVDI(x, y) ((UDI) (x) / (UDI) (y)) +#define MODDI(x, y) ((DI) (x) % (DI) (y)) +#define UMODDI(x, y) ((UDI) (x) % (UDI) (y)) +#define SRADI(x, y) ((DI) (x) >> (y)) +#define SRLDI(x, y) ((UDI) (x) >> (y)) +#define SLLDI(x, y) ((UDI) (x) << (y)) +extern DI RORDI (DI, int); +extern DI ROLDI (DI, int); +#define ANDDI(x, y) ((x) & (y)) +#define ORDI(x, y) ((x) | (y)) +#define XORDI(x, y) ((x) ^ (y)) +#define NEGDI(x) (- (x)) +#define NOTDI(x) (! (DI) (x)) +#define INVDI(x) (~ (x)) +#define ABSDI(x) ((x) < 0 ? -(x) : (x)) +#define EQDI(x, y) ((DI) (x) == (DI) (y)) +#define NEDI(x, y) ((DI) (x) != (DI) (y)) +#define LTDI(x, y) ((DI) (x) < (DI) (y)) +#define LEDI(x, y) ((DI) (x) <= (DI) (y)) +#define GTDI(x, y) ((DI) (x) > (DI) (y)) +#define GEDI(x, y) ((DI) (x) >= (DI) (y)) +#define LTUDI(x, y) ((UDI) (x) < (UDI) (y)) +#define LEUDI(x, y) ((UDI) (x) <= (UDI) (y)) +#define GTUDI(x, y) ((UDI) (x) > (UDI) (y)) +#define GEUDI(x, y) ((UDI) (x) >= (UDI) (y)) +#endif /* DI_FN_SUPPORT */ + +#define EXTBIQI(x) ((QI) (BI) (x)) +#define EXTBIHI(x) ((HI) (BI) (x)) +#define EXTBISI(x) ((SI) (BI) (x)) +#if defined (DI_FN_SUPPORT) +extern DI EXTBIDI (BI); +#else +#define EXTBIDI(x) ((DI) (BI) (x)) +#endif +#define EXTQIHI(x) ((HI) (QI) (x)) +#define EXTQISI(x) ((SI) (QI) (x)) +#if defined (DI_FN_SUPPORT) +extern DI EXTQIDI (QI); +#else +#define EXTQIDI(x) ((DI) (QI) (x)) +#endif +#define EXTHIHI(x) ((HI) (HI) (x)) +#define EXTHISI(x) ((SI) (HI) (x)) +#define EXTSISI(x) ((SI) (SI) (x)) +#if defined (DI_FN_SUPPORT) +extern DI EXTHIDI (HI); +#else +#define EXTHIDI(x) ((DI) (HI) (x)) +#endif +#if defined (DI_FN_SUPPORT) +extern DI EXTSIDI (SI); +#else +#define EXTSIDI(x) ((DI) (SI) (x)) +#endif + +#define ZEXTBIQI(x) ((QI) (BI) (x)) +#define ZEXTBIHI(x) ((HI) (BI) (x)) +#define ZEXTBISI(x) ((SI) (BI) (x)) +#if defined (DI_FN_SUPPORT) +extern DI ZEXTBIDI (BI); +#else +#define ZEXTBIDI(x) ((DI) (BI) (x)) +#endif +#define ZEXTQIHI(x) ((HI) (UQI) (x)) +#define ZEXTQISI(x) ((SI) (UQI) (x)) +#if defined (DI_FN_SUPPORT) +extern DI ZEXTQIDI (QI); +#else +#define ZEXTQIDI(x) ((DI) (UQI) (x)) +#endif +#define ZEXTHISI(x) ((SI) (UHI) (x)) +#define ZEXTHIHI(x) ((HI) (UHI) (x)) +#define ZEXTSISI(x) ((SI) (USI) (x)) +#if defined (DI_FN_SUPPORT) +extern DI ZEXTHIDI (HI); +#else +#define ZEXTHIDI(x) ((DI) (UHI) (x)) +#endif +#if defined (DI_FN_SUPPORT) +extern DI ZEXTSIDI (SI); +#else +#define ZEXTSIDI(x) ((DI) (USI) (x)) +#endif + +#define TRUNCQIBI(x) ((BI) (QI) (x)) +#define TRUNCHIBI(x) ((BI) (HI) (x)) +#define TRUNCHIQI(x) ((QI) (HI) (x)) +#define TRUNCSIBI(x) ((BI) (SI) (x)) +#define TRUNCSIQI(x) ((QI) (SI) (x)) +#define TRUNCSIHI(x) ((HI) (SI) (x)) +#define TRUNCSISI(x) ((SI) (SI) (x)) +#if defined (DI_FN_SUPPORT) +extern BI TRUNCDIBI (DI); +#else +#define TRUNCDIBI(x) ((BI) (DI) (x)) +#endif +#if defined (DI_FN_SUPPORT) +extern QI TRUNCDIQI (DI); +#else +#define TRUNCDIQI(x) ((QI) (DI) (x)) +#endif +#if defined (DI_FN_SUPPORT) +extern HI TRUNCDIHI (DI); +#else +#define TRUNCDIHI(x) ((HI) (DI) (x)) +#endif +#if defined (DI_FN_SUPPORT) +extern SI TRUNCDISI (DI); +#else +#define TRUNCDISI(x) ((SI) (DI) (x)) +#endif + +/* Composing/decomposing the various types. + Word ordering is endian-independent. Words are specified most to least + significant and word number 0 is the most significant word. + ??? May also wish an endian-dependent version. Later. */ + +static QI SUBWORDSIQI (SI, int); +static HI SUBWORDSIHI (SI, int); +static QI SUBWORDDIQI (DI, int); +static HI SUBWORDDIHI (DI, int); +static SI SUBWORDDISI (DI, int); + +#ifdef SEMOPS_DEFINE_INLINE + +SEMOPS_INLINE QI +SUBWORDSIQI (SI in, int byte) +{ + assert (byte >= 0 && byte <= 3); + return (UQI) (in >> (8 * (3 - byte))) & 0xFF; +} + +SEMOPS_INLINE HI +SUBWORDSIHI (SI in, int word) +{ + if (word == 0) + return (USI) in >> 16; + else + return in; +} + +SEMOPS_INLINE QI +SUBWORDDIQI (DI in, int byte) +{ + assert (byte >= 0 && byte <= 7); + return (UQI) (in >> (8 * (7 - byte))) & 0xFF; +} + +SEMOPS_INLINE HI +SUBWORDDIHI (DI in, int word) +{ + assert (word >= 0 && word <= 3); + return (UHI) (in >> (16 * (3 - word))) & 0xFFFF; +} + +SEMOPS_INLINE SI +SUBWORDDISI (DI in, int word) +{ + if (word == 0) + return (UDI) in >> 32; + else + return in; +} + +#endif /* SUBWORD,JOIN */ + +#endif /* CGEN_BASIC_OPS_H */ diff --git a/include/cgen/bitset.h b/include/cgen/bitset.h new file mode 100644 index 0000000..7a6a993 --- /dev/null +++ b/include/cgen/bitset.h @@ -0,0 +1,56 @@ +/* Header file the type CGEN_BITSET. + Copyright 2002, 2005, 2009 Free Software Foundation, Inc. + + This file is part of the GNU opcodes library. + + This library 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, or (at your option) + any later version. + + It 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 library; see the file COPYING3. If not, write to the + Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef CGEN_BITSET_H +#define CGEN_BITSET_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* A bitmask represented as a string. + Each member of the set is represented as a bit + in the string. Bytes are indexed from left to right in the string and + bits from most significant to least within each byte. + + For example, the bit representing member number 6 is (set->bits[0] & 0x02). +*/ +typedef struct cgen_bitset +{ + unsigned length; + char *bits; +} CGEN_BITSET; + +extern CGEN_BITSET *cgen_bitset_create PARAMS ((unsigned)); +extern void cgen_bitset_init PARAMS ((CGEN_BITSET *, unsigned)); +extern void cgen_bitset_clear PARAMS ((CGEN_BITSET *)); +extern void cgen_bitset_add PARAMS ((CGEN_BITSET *, unsigned)); +extern void cgen_bitset_set PARAMS ((CGEN_BITSET *, unsigned)); +extern int cgen_bitset_compare PARAMS ((CGEN_BITSET *, CGEN_BITSET *)); +extern void cgen_bitset_union PARAMS ((CGEN_BITSET *, CGEN_BITSET *, CGEN_BITSET *)); +extern int cgen_bitset_intersect_p PARAMS ((CGEN_BITSET *, CGEN_BITSET *)); +extern int cgen_bitset_contains PARAMS ((CGEN_BITSET *, unsigned)); +extern CGEN_BITSET *cgen_bitset_copy PARAMS ((CGEN_BITSET *)); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/include/coff/ChangeLog b/include/coff/ChangeLog new file mode 100644 index 0000000..2a9c0ab --- /dev/null +++ b/include/coff/ChangeLog @@ -0,0 +1,373 @@ +2013-07-10 Tristan Gingold + + * rs6000.h (external_core_dumpx): New structure. + (external_ld_info32): Ditto. + +2013-07-02 Tristan Gingold + + * internal.h (C_STTLS, C_GTLS): Define. + * xcoff.h (XMC_TL, XMC_TU, XMC_TE): Define. + +2013-02-04 Alan Modra + + * ti.h (SWAP_OUT_RELOC_EXTRA): Define. + +2013-01-02 Martin Storsjo + + * arm.h (ARMV7PEMAGIC): Define. + (ARMBADMAG): Update. + +2011-06-02 Nick Clifton + + * i860.h: Fix spelling mistake in comment. + +2011-05-04 Tristan Gingold + + * rs6000.h (union external_auxent): Add x_ftype field. + * rs6k64.h: (struct external_auxent): Remap x_file field. + +2011-05-04 Tristan Gingold + + * rs6000.h (struct external_exceptab): New struct. + (EXCEPTSZ): New macro. + * rs6k64.h: (struct external_exceptab): New struct. + (EXCEPTSZ): New macro. + +2011-05-03 Tristan Gingold + + * rs6000.h (struct external_ldsym): Use E_SYMNMLEN instead of + SYMNMLEN. + +2011-04-27 Tristan Gingold + + * xcoff.h (F_FDPR_PROF, F_FDPR_OPTI, F_DSA, F_VARPG) + (STYP_DWARF, SSUBTYP_DWINFO) + (SSUBTYP_DWLINE, SSUBTYP_DWPBNMS, SSUBTYP_DWPBTYP) + (SSUBTYP_DWARNGE, SSUBTYP_DWABREV, SSUBTYP_DWSTR) + (SSUBTYP_DWRNGES, STYP_TDATA, STYP_TBSS, R_TLS, R_TLS_IE) + (R_TLS_LD, R_TLS_LE, R_TLSM, R_TLSML, R_TOCU, R_TOCL, C_DWARF): + New macros. + +2011-03-31 Tristan Gingold + + * internal.h (C_NULL_VALUE): Define. + +2010-06-29 Alan Modra + + * maxq.h: Delete file. + +2010-04-15 Nick Clifton + + * alpha.h: Update copyright notice to use GPLv3. + * apollo.h: Likewise. + * arm.h: Likewise. + * aux-coff.h: Likewise. + * ecoff.h: Likewise. + * external.h: Likewise. + * go32exe.h: Likewise. + * h8300.h: Likewise. + * h8500.h: Likewise. + * i386.h: Likewise. + * i860.h: Likewise. + * i960.h: Likewise. + * ia64.h: Likewise. + * internal.h: Likewise. + * m68k.h: Likewise. + * m88k.h: Likewise. + * maxq.h: Likewise. + * mcore.h: Likewise. + * mips.h: Likewise. + * mipspe.h: Likewise. + * or32.h: Likewise. + * pe.h: Likewise. + * powerpc.h: Likewise. + * rs6000.h: Likewise. + * rs6k64.h: Likewise. + * sh.h: Likewise. + * sparc.h: Likewise. + * ti.h: Likewise. + * tic30.h: Likewise. + * tic4x.h: Likewise. + * tic54x.h: Likewise. + * tic80.h: Likewise. + * w65.h: Likewise. + * we32k.h: Likewise. + * x86_64.h: Likewise. + * xcoff.h: Likewise. + * z80.h: Likewise. + * z8k.h: Likewise. + +2009-12-02 Jerker Bäck + + PR binutils/11017 + * i386lh (COFF_PAGE_SIZE): Define. + * x86_64.h (COFF_PAGE_SIZE): Define. + +2009-10-17 Arnold Metselaar + + * z80.h: Store alignment requirement in section header, to allow + ld to preserve alignment. Some code was copied from ti.h. + +2009-09-05 Martin Thuresson + + * ti.h (GET_LNSZ_SIZE, PUT_LNSZ_SIZE): Updated name of class + variable to in_class to match changes in function that use this + macro. + +2009-08-10 Jan Kratochvil + + Fix references past allocated memory for i386-*-go32. + * ti.h (COFF_ADJUST_FILEHDR_IN_POST, COFF_ADJUST_FILEHDR_OUT_POST): + Reference F_TARGET_ID only when !COFF0_P. + +2009-08-10 Jan Kratochvil + + Stop using bfd_usrdata in libbfd. + * go32exe.h (struct external_filehdr_go32_exe , FILHSZ): Replace + STUBSIZE by GO32_STUBSIZE. + (STUBSIZE): Move the definition ... + * internal.h (GO32_STUBSIZE): ... here and rename it. + (struct internal_filehdr , F_GO32STUB): New. + +2009-06-03 Ulrich Weigand + + * symconst.h (btLong64, btULong64, btLongLong64, btULongLong64, + btAdr64, btInt64, btUInt64): New defines. + +2009-04-21 Kai Tietz + + * pe.h (pex64_runtime_function): New structure. + (external_pex64_runtime_function): Likewise. + (pex64_unwind_code): Likewise. + (external_pex64_unwind_code): Likewise. + (pex64_unwind_info): Likewise. + (external_pex64_unwind_info): Likewise. + (external_pex64_scope): Likewise. + (pex64_scope): Likewise. + (pex64_scope_entry): Likewise. + (external_pex64_scope_entry): Likewise. + (PEX64_IS_RUNTIME_FUNCTION_CHAINED): New macro. + (PEX64_GET_UNWINDDATA_UNIFIED_RVA): Likewise. + (PEX64_UNWCODE_CODE): Likewise. + (PEX64_UNWCODE_INFO): Likewise. + (UWOP_...): Add defines for unwind code. + (UNW_FLAG_...): Add defined for unwind info flags. + (PEX64_SCOPE_ENTRY_SIZE): New macro. + (PEX64_UWI_VERSION): Likewise. + (PEX64_UWI_FLAGS): Likewise. + (PEX64_UWI_FRAMEREG): Likewise. + (PEX64_UWI_FRAMEOFF): Likewise. + (PEX64_UWI_SIZEOF_UWCODE_ARRAY): Likewise. + (PEX64_OFFSET_TO_UNWIND_CODE): Likewise. + (PEX64_OFFSET_TO_HANDLER_RVA): Likewise. + (PEX64_OFFSET_TO_SCOPE_COUNT): Likewise. + (PEX64_SCOPE_ENTRY): Likewise. + +2009-04-17 H.J. Lu + + * pe.h (IMAGE_SUBSYSTEM_EFI_ROM): Renamed to ... + (IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER): This. + +2009-04-01 Richard Sandiford + + * xcoff.h (xcoff_link_hash_table): Move to bfd/xcofflink.c. + +2009-03-14 Richard Sandiford + + * xcoff.h (XCOFF_EXPALL, XCOFF_EXPFULL): New flags. + (xcoff_loader_info): Add auto_export_flags. + +2009-03-14 Richard Sandiford + + * internal.h (C_AIX_WEAKEXT): New macro. + (C_WEAKEXT): Use the GNU definition in the generic part of the file, + and conditionally reset it to C_AIX_WEAKEXT in the XCOFF part of + the file. + (CSECT_SYM_P): New macro. + * xcoff.h (L_WEAK): Define. + (EXTERN_SYM_P): New macro. + +2009-03-14 Richard Sandiford + + * xcoff.h (XCOFF_ALLOCATED): New flag. + +2009-03-14 Richard Sandiford + + * xcoff.h (XCOFF_CALLED, XCOFF_IMPORT): Update comments. + (XCOFF_WAS_UNDEFINED): New flag. + (xcoff_link_hash_table): Add an "rtld" field. + +2009-03-14 Dave Korn + + * internal.h (struct internal_extra_pe_aouthdr): Correct type + of DllCharacteristics flags field to unsigned. + * pe.h (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, + IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, + IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, + IMAGE_DLLCHARACTERISTICS_NO_ISOLATION, + IMAGE_DLLCHARACTERISTICS_NO_SEH, + IMAGE_DLLCHARACTERISTICS_NO_BIND, + IMAGE_DLLCHARACTERISTICS_WDM_DRIVER, + IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE): New macros to + define flag bit values for DllCharacteristics field of PEAOUTHDR, + PEPAOUTHDR. + +2008-12-23 Johan Olmutz Nielsen + + * ti.h (COFF_ADJUST_SCNHDR_OUT_PRE): Define. + +2008-06-17 Nick Clifton + + * ti.h (GET_SCNHDR_NLNNO): Provide an alternative version of this + macro which does not trigger an array bounds warning in gcc. + (PUT_SCNHDR_NLNNO): Likewise. + (GET_SCNHDR_FLAGS): Likewise. + (PUT_SCNHDR_FLAGS): Likewise. + (GET_SCNHDR_PAGE): Likewise. + (PUT_SCNHDR_PAGE): Likewise. + +2007-11-05 Danny Smith + + * pe.h (COFF_ENCODE_ALIGNMENT) Define. + +2007-08-02 H.J. Lu + + * pe.h (IMAGE_SCN_ALIGN_POWER_BIT_POS): New. + (IMAGE_SCN_ALIGN_POWER_BIT_MASK): Likewise. + (IMAGE_SCN_ALIGN_POWER_NUM): Likewise. + (IMAGE_SCN_ALIGN_POWER_CONST): Likewise. + (IMAGE_SCN_ALIGN_128BYTES): Likewise. + (IMAGE_SCN_ALIGN_256BYTES): Likewise. + (IMAGE_SCN_ALIGN_512BYTES): Likewise. + (IMAGE_SCN_ALIGN_1024BYTES): Likewise. + (IMAGE_SCN_ALIGN_2048BYTES): Likewise. + (IMAGE_SCN_ALIGN_4096BYTES): Likewise. + (IMAGE_SCN_ALIGN_8192BYTES): Likewise. + (IMAGE_SCN_ALIGN_1BYTES): Redefined with + IMAGE_SCN_ALIGN_POWER_CONST. + (IMAGE_SCN_ALIGN_2BYTES): Likewise. + (IMAGE_SCN_ALIGN_4BYTES): Likewise. + (IMAGE_SCN_ALIGN_8BYTES): Likewise. + (IMAGE_SCN_ALIGN_16BYTES): Likewise. + (IMAGE_SCN_ALIGN_32BYTES): Likewise. + (IMAGE_SCN_ALIGN_64BYTES): Likewise. + +2007-07-12 Kai Tietz + + * internal.h (struct internal_syment): Use bfd_hostptr_t for + _n_zeroes and _n_offset fields. + +2007-04-27 Alan Modra + + * rs6000.h: Write Mimi's name in ASCII. + +2007-03-19 H.J. Lu + + * internal.h (internal_extra_pe_aouthdr): Add Magic, + MajorLinkerVersion, MinorLinkerVersion, SizeOfCode, + SizeOfInitializedData, SizeOfUninitializedData, + AddressOfEntryPoint, BaseOfCode and BaseOfData. + +2006-12-05 Michael Tautschnig + Nick Clifton + + * external.h (struct external_aouthdr): Add ATTRIBUTE_PACKED. + (struct external_syment): Likewise. + (union external_auxent): Likewise. + +2006-11-14 Phil Lello + + * pe.h: Added defines for IMAGE_SUBSYSTEM_EFI_ROM and + IMAGE_SUBSYSTEM_XBOX. + * internal.h: Added defines for PE directory entry types. + NB: in internal.h because IMAGE_NUMBEROF_DIRECTORY_ENTRYIES is in + pe.h + +2006-09-20 Kai Tietz + + * external.h: Add proper external_aouthdr64 structure (without + data_start member). + (AOUTHDRSZ64): Set according structure size. + (AOUTHDR64): As typedef of external_aouthdr64 structure. + * internal.h: Add relocation identifiers for coff. + * pe.h: Add define IMAGE_FILE_MACHINE_AMD64 the coff signature. + (PEPAOUTHDR): Adjust structure to have proper size (using AOUTHDR64). + (PEPAOUTSZ): Calculated size of 240. + * x86_64.h: Coff information for x86_64 (AMD64). + +2006-02-05 Arnold Metselaar + + * internal.h: Add relocation number R_IMM24 for Z80. + +2005-10-25 Arnold Metselaar + + * internal.h: Add relocation number for Z80 + * z80.h: New file. + +2005-08-18 Alan Modra + + * a29k.h: Delete. + +2005-07-14 Daniel Marques + + * alpha.h (ALPHA_ECOFF_COMPRESSEDMAG): Define. + * ecoff.h (ALPHA_MAGIC_COMPRESSED): Define. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + a29k.h, alpha.h, apollo.h, arm.h, aux-coff.h, ecoff.h, external.h, + go32exe.h, h8300.h, h8500.h, i386.h, i860.h, i960.h, ia64.h, + internal.h, m68k.h, m88k.h, maxq.h, mcore.h, mips.h, mipspe.h, + or32.h, pe.h, powerpc.h, rs6k64.h, sh.h, sparc.h, ti.h, tic30.h, + tic4x.h, tic54x.h, tic80.h, w65.h, we32k.h, xcoff.h, z8k.h + +2005-02-21 Alan Modra + + * xcoff.h (struct xcoff_loader_info): Warning fix. + +2005-01-10 Inderpreet Singh + + * maxq.h (F_MAXQ10, F_MAXQ20): Define. + +2004-11-08 Inderpreet Singh + Vineet Sharma + + * maxq.h: New file: Defintions for the maxq port. + +2004-11-08 Aaron W. LaFramboise + + * pe.h (IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY): Define. + (IMAGE_WEAK_EXTERN_SEARCH_LIBRARY): Same. + (IMAGE_WEAK_EXTERN_SEARCH_ALIAS): Same. + +2004-08-13 Mark Kettenis + + * symconst.h (langMax): Fix typo in comment. + +2004-04-23 Chris Demetriou + + * mips.h (MIPS_R_RELHI, MIPS_R_RELLO, MIPS_R_SWITCH): Remove + (MIPS_R_PCREL16): Update comment. + * ecoff.h (struct ecoff_value_adjust): Remove structure. + (struct ecoff_debug_info): Remove 'adjust' member. + +2004-04-20 DJ Delorie + + * internal.h (R_SECREL32): Add. + +For older changes see ChangeLog-9103 + +Copyright (C) 2004-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/coff/ChangeLog-9103 b/include/coff/ChangeLog-9103 new file mode 100644 index 0000000..c8a7b10 --- /dev/null +++ b/include/coff/ChangeLog-9103 @@ -0,0 +1,1186 @@ +2005-04-13 H.J. Lu + + Moved from ../ChangeLog + + 2003-04-04 Svein E. Seldal + * tic4x.h: Namespace cleanup. Replace s/c4x/tic4x + and s/c3x/tic3x/ + + 2003-01-20 Svein E. Seldal + * tic4x.h (TICOFF_TARGET_MACHINE_GET): Fixed define bug + * ti.h (TICOFF_TARGET_MACHINE_GET): Added macros + + 2002-08-28 Michael Hayes + * internal.h: Add new relocation types. + * ti.h: Add file-header flags for tic4x code. + * tic4x.h: New file + +2003-12-02 Graham Reed + + * internal.h (C_WEAKEXT): Add alternative value for AIX 5.2 + based targets. + +2003-08-23 Jason Eckhardt + + * coff/i860.h (COFF860_R_PAIR, COFF860_R_LOW0, COFF860_R_LOW1, + COFF860_R_LOW2, COFF860_R_LOW3, COFF860_R_LOW4, COFF860_R_SPLIT0, + COFF860_R_SPLIT1, COFF860_R_SPLIT2, COFF860_R_HIGHADJ, + COFF860_R_BRADDR): Define new relocation constants and document. + Minor formatting adjustments. + +2003-08-07 Alan Modra + + * ti.h (GET_SCNHDR_NRELOC): Rename PTR param to LOC. + (PUT_SCNHDR_NRELOC, GET_SCNHDR_NLNNO, PUT_SCNHDR_NLNNO): Likewise. + (GET_SCNHDR_FLAGS, PUT_SCNHDR_FLAGS): Likewise. + (GET_SCNHDR_PAGE, PUT_SCNHDR_PAGE): Likewise. + +2003-07-17 Jeff Muizelaar + + * pe.h: (IMAGE_FILE_NET_RUN_FROM_SWAP): Define. + (IMAGE_FILE_MACHINE_WCEMIPSV2): Define. + (IMAGE_FILE_MACHINE_SH3DSP): Define. + (IMAGE_FILE_MACHINE_SH3E): Define. + (IMAGE_FILE_MACHINE_SH5): Define. + (IMAGE_FILE_MACHINE_AM33): Define. + (IMAGE_FILE_MACHINE_POWERPCFP): Define. + (IMAGE_FILE_MACHINE_AXP64): Define. + (IMAGE_FILE_MACHINE_TRICORE): Define. + (IMAGE_FILE_MACHINE_CEF): Define. + (IMAGE_FILE_MACHINE_EBC): Define. + (IMAGE_FILE_MACHINE_AMD64): Define. + (IMAGE_FILE_MACHINE_M32R): Define. + (IMAGE_FILE_MACHINE_CEE): Define. + +2003-07-14 Christian Groessler + + * i860.h (AOUTSZ): Define for i860 coff. + +2003-06-29 Andreas Jaeger + + * xcoff.h (struct __rtinit ): Convert to ISO C90 prototypes. + + * ecoff.h: Convert to ISO C90 prototypes. Replace PTR by void *. + +2003-04-24 Dhananjay Deshpande + + * coff/h8300.h (H8300HNMAGIC, H8300SNMAGIC): New. + (H8300HNBADMAG, H8300SNBADMAG): New. + +2003-04-15 Rohit Kumar Srivastava + + * sh.h: Replace occurrances of 'Hitachi' with 'Renesas'. + * h8300.h: Likewise. + * h8500.h: Likewise. + +2003-03-25 Stan Cox + Nick Clifton + + Contribute support for Intel's iWMMXt chip - an ARM variant: + + * arm.h (ARM_NOTE_SECTION): Define. + +2002-11-30 Alan Modra + + * ecoff.h: Replace boolean with bfd_boolean. + * xcoff.h: Likewise. + +2002-03-18 Tom Rix + + * rs6k64.h: Add U64_TOCMAGIC, AIX 5 64 bit magic number. + +2002-02-01 Tom Rix + + * xcoff.h: Conditionally support for pre AIX 4.3. + +2002-01-31 Ivan Guzvinec + + * or32.h: New file. + +2001-12-24 Tom Rix + + * xcoff.h (xcoff_big_format_p): Make the default archive + format. + (XCOFFARMAG_ELEMENT_SIZE, XCOFFARMAGBIG_ELEMENT_SIZE): Define for + archive header ascii elements. + +2001-12-17 Tom Rix + + * xcoff.h : Add .except and .typchk section string and styp flags. + Fix xcoff_big_format_p macro. + +2001-12-16 Tom Rix + + * xcoff.h : Clean up formatting. + +2002-01-15 Richard Earnshaw + + * arm.h (F_VFP_FLOAT): Define. + +2001-11-11 Timothy Wall + + * ti.h: Move arch-specific stuff from here... + (COFF_ADJUST_SYM_IN/OUT): Optionally put page flag into symbol + value. + * tic54x.h: ...to here. + +2001-10-26 Christian Groessler + + * external.h (GET_LINENO_LNNO): Fix usage of H_GET_32/16. + (PUT_LINENO_LNNO): Likewise with H_PUT_32/16. + +2001-09-21 Nick Clifton + + * ti.h (GET_SCNHDR_PAGE): Fix compile time warning. + +2001-09-18 Alan Modra + + * external.h (GET_LINENO_LNNO): Use H_GET_32/16. + (PUT_LINENO_LNNO): Use H_PUT_32/16. + * m88k.h (GET_LNSZ_SIZE, GET_LNSZ_LNNO, GET_SCN_NRELOC, + GET_SCN_NLINNO): Use H_GET_32. + (PUT_LNSZ_LNNO, PUT_LNSZ_SIZE, PUT_SCN_NRELOC, PUT_SCN_NLINNO): + Use H_PUT_32. + * ti.h: Formatting fixes. Make use of H_GET_* and H_PUT_* throughout. + * xcoff.h: White space changes. + +2001-09-05 Tom Rix + + * xcoff.h : Add XCOFF_SYSCALL32 and XCOFF_SYSCALL64 hash table flags. + +2001-08-27 Andreas Jaeger + + * xcoff.h (struct __rtinit): Make proper prototype for rtl. + +Fri Aug 24 01:18:51 2001 J"orn Rennecke + + * internal.h (R_JMP2, R_JMPL2, R_MOVL2): Comment spelling fix. + +2001-04-05 Tom Rix + + * rs6000.h : move xcoff32 external structures from xcofflink. + * rs6k64.h : move xcoff64 external structures from xcofflink. + * internal.h : promote 32 bit structure elements to 64 bit + for xcoff64 support + * xcoff.h : New file. + +2001-03-23 Nick Clifton + + * a29k.h: Fix compile time warning. + * external.h: Fix compile time warning. + * m88k.h: Fix compile time warning. + +2001-03-13 Nick Clifton + + * external.h: New file. Common structure definitions found in + other COFF header files. + + * a29k.h: Use external.h. + * apollo.h: Use external.h. + * arm.h: Use external.h. + * h8300.h: Use external.h. + * h8500.h: Use external.h. + * i386.h: Use external.h. + * i860.h: Use external.h. + * ia64.h: Use external.h. + * m68k.h: Use external.h. + * m88k.h: Use external.h. + * mcore.h: Use external.h. + * mips.h: Use external.h. + * mipspe.h: Use external.h. + * powerpc.h: Use external.h. + * rs6000.h: Use external.h. + * rs6k64.h: Use external.h. + * sh.h: Use external.h. + * sparc.h: Use external.h. + * tic30.h: Use external.h. + * tic80.h: Use external.h. + * w65.h: Use external.h. + * we32k.h: Use external.h. + * z8k.h: Use external.h. + +2001-02-09 David Mosberger + + * pe.h (PEPAOUTSZ): Rename from PEP64AOUTSZ. + Rename from PEPAOUTHDR. + +2001-01-23 H.J. Lu + + * pe.h (struct external_PEI_DOS_hdr): New. + (struct external_PEI_IMAGE_hdr): New. + +2000-12-11 Alan Modra + + * ti.h (OCTETS_PER_BYTE_POWER): Change #warning to #error. + +2000-12-08 Alan Modra + + * ti.h (OCTETS_PER_BYTE_POWER): Change #warn to #warning. + +2000-06-30 DJ Delorie + + * pe.h: Clarify a comment. + +2000-05-05 Clinton Popetz + + * rs6k64.h (U802TOC64MAGIC): Change to U803XTOCMAGIC. + +2000-04-24 Clinton Popetz + + * rs6k64.h: New file. + +2000-04-17 Timothy Wall + + * ti.h: Load page cleanup. + * intental.h: Add load page field. + +Mon Apr 17 16:44:01 2000 David Mosberger + + * pe.h (PEP64AOUTHDR): New header for PE+. + (PEP64AOUTSZ): New macro. + (IMAGE_SUBSYSTEM_UNKNOWN): New macro. + (IMAGE_SUBSYSTEM_NATIVE): Ditto. + (IMAGE_SUBSYSTEM_WINDOWS_GUI): Ditto. + (IMAGE_SUBSYSTEM_WINDOWS_CUI): Ditto. + (IMAGE_SUBSYSTEM_POSIX_CUI): Ditto. + (IMAGE_SUBSYSTEM_WINDOWS_CE_GUI): Ditto. + (IMAGE_SUBSYSTEM_EFI_APPLICATION): Ditto. + (IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER): Ditto. + (IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER): Ditto. + * internal.h (PE_DEF_FILE_ALIGNMENT): Define only if not defined + already. + * ia64.h: New file. + +2000-04-13 Alan Modra + + * ti.h (ADDR_MASK): Don't use ul suffix on constants. + (PG_MASK): Ditto. + +2000-04-11 Timothy Wall + + * ti.h: Remove load page references until load pages are + reimplemented. + * tic54x.h: Ditto. + +2000-04-07 Timothy Wall + + * internal.h: Fix some comments related to TI COFF (instead of tic80). + * ti.h: New. + * tic54x.h: New. + +Wed Apr 5 22:08:41 2000 J"orn Rennecke + + * sh.h (R_SH_LOOP_START, R_SH_LOOP_END): Define. + +2000-03-15 Kazu Hirata + + * internal.h: Fix a typo in the comment for R_MOVL2. + +2000-02-28 Nick Clifton + + * mipspe.h (MIPS_PE_MAGIC): Define. + * sh.h (SH_PE_MAGIC): Define. + +2000-02-22 Nick Clifton DJ Delorie + + * sh.h: Add Windows CE definitions. + * arm.h: Add Windows CE definitions. + * mipspe.h: New file: Windows CE definitions for MIPS. + * pe.h: Add constants for ILF support. + +2000-01-05 Nick Clifton + + * pe.h: Fix formatting of comments. + (IMAGE_FILE_AGGRESSIVE_WS_TRIM): Define. + (IMAGE_FILE_LARGE_ADDRESS_AWARE): Define. + (IMAGE_FILE_16BIT_MACHINE): Define. + (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP): Define. + (IMAGE_FILE_UP_SYSTEM_ONLY): Define. + (IMAGE_FILE_MACHINE_UNKNOWN): Define. + (IMAGE_FILE_MACHINE_ALPHA): Define. + (IMAGE_FILE_MACHINE_ALPHA64): Define. + (IMAGE_FILE_MACHINE_I386): Define. + (IMAGE_FILE_MACHINE_IA64): Define. + (IMAGE_FILE_MACHINE_M68K): Define. + (IMAGE_FILE_MACHINE_MIPS16): Define. + (IMAGE_FILE_MACHINE_MIPSFPU): Define. + (IMAGE_FILE_MACHINE_MIPSFPU16): Define. + (IMAGE_FILE_MACHINE_POWERPC): Define. + (IMAGE_FILE_MACHINE_R3000): Define. + (IMAGE_FILE_MACHINE_R4000): Define. + (IMAGE_FILE_MACHINE_R10000): Define. + (IMAGE_FILE_MACHINE_SH3): Define. + (IMAGE_FILE_MACHINE_SH4): Define. + (IMAGE_FILE_MACHINE_THUMB): Define. + +1999-09-20 Alan Modra + + * internal.h: Delete bogus R_PCLONG, duplicate R_RELBYTE and + R_RELWORD, and rewrite some R_* as decimal. + +1999-09-06 Donn Terry + + * internal.h (DTYPE): Define. + * pe.h (struct external_PEI_filehdr): Rename from + external_PE_filehdr. Define even if COFF_IMAGE_WITH_PE is not + defined. + +1999-07-17 Nick Clifton + + * arm.h (F_SOFT_FLOAT): Rename from F_SOFTFLOAT. + +1999-06-21 Philip Blundell + + * arm.h (F_SOFTFLOAT): Define. + +1999-07-05 Nick Clifton + + * arm.h (F_ARM_5): Define. + +Wed Jun 2 18:08:18 1999 Richard Henderson + + * internal.h (BEOS_EXE_IMAGE_BASE, BEOS_DLL_IMAGE_BASE): New. + +Mon May 17 13:35:35 1999 Stan Cox + + * arm.h (F_PIC, F_ARM_2, F_ARM_2a, F_ARM_3, F_ARM_3M, + F_ARM_4, F_ARM_4T, F_APCS26): Changed values to distinguish + F_ARM_2a, F_ARM_3M, F_ARM_4T. + +1999-05-15 Nick Clifton + + * mcore.h (IMAGE_REL_MCORE_RVA): Define. + +1999-04-21 Nick Clifton + + * mcore.h (GET_LINENO_LNNO): New macro. + (PUT_LINENO_LNNO): New macro. + +1999-04-08 Nick Clifton + + * mcore.h: New header file. Defines for Motorola's MCore + processor. + +Sun Dec 6 21:36:37 1998 Mark Elbrecht + + * internal.h (C_WEAKEXT): Define. + +Wed Jan 27 13:35:35 1999 Stan Cox + + * arm.h (F_PIC_INT, F_ARM_2, F_ARM_3, F_ARM_4, F_APCS26): + Changed values to avoid clashing with IMAGE_FILE_* coff header + flag values. + +Wed Apr 1 16:06:15 1998 Nick Clifton + + * internal.h: Document numbers associated with Thumb symbol + types. + +Fri Mar 27 17:16:57 1998 Ian Lance Taylor + + * internal.h (ISPTR, ISFCN, ISARY): Add casts to unsigned long. + +Mon Feb 2 17:10:38 1998 Steve Haworth + + * tic30.h: New file. + +Fri Dec 12 11:49:07 1997 Fred Fish + + * tic80.h (R_MPPCR15W): New relocation type, for 15 bit PC relative + offsets. + +Tue Dec 2 10:21:40 1997 Nick Clifton + + * arm.h (COFFARM): New define. + +Mon Dec 1 20:24:18 1997 J"orn Rennecke + + * sh.h (R_SH_SWITCH8): New. + +Sat Nov 22 15:10:14 1997 Nick Clifton + + * internal.h (C_THUMBEXTFUNC, C_THUMBSTATFUNC): Constants to + define static and external functions. + + * arm.h: Add bits to support PIC and APCS-FLOAT type binaries, + when implemented. + +Fri Oct 3 14:25:17 1997 Fred Fish + + * tic80.h (R_PPL16B): Make constant uppercase for consistency. + +Tue Jul 22 18:18:58 1997 Robert Hoehne + + * go32exe.h: New file. + +Tue Jul 8 12:23:55 1997 Fred Fish + + * tic80.h (TIC80_TARGET_ID): Add define. + * internal.h (struct internal_filehdr): Add f_target_id field. + +Tue Jun 3 16:44:18 1997 Nick Clifton + + * internal.h: Add storage classes for Thumb symbols + +Mon May 26 14:07:55 1997 Ian Lance Taylor + + * tic80.h (R_PPL16B): Correct value. + +Tue May 13 10:21:14 1997 Nick Clifton + + * arm.h (constants): Added new flag bits F_APCS_26 and + F_APCS_SET for the f_flags field of the filehdr structure. Added new + flags: F_APCS26, F_ARM_2, F_ARM_3, F_ARM_7, F_ARM_7T to store + information in the flags field of the internal_f structure used by BFD + routines. + +Sat May 3 08:24:59 1997 Fred Fish + + * internal.h (C_UEXT, C_STATLAB, C_EXTLAB, C_SYSTEM): + New storage classes for TIc80. + +Fri Apr 18 11:52:55 1997 Niklas Hallqvist + + * alpha.h (ALPHA_ECOFF_BADMAG): Recognize *BSD/alpha magic too. + (ALPHA_R_LITERALSLEAZY): Define. + * ecoff.h (ALPHA_MAGIC_BSD): Define. + +Wed Jan 29 11:31:51 1997 Ian Lance Taylor + + * i960.h (R_IPR13, R_ALIGN): Define. + +Mon Jan 27 13:34:30 1997 Ian Lance Taylor + + * internal.h (R_IPRMED, R_OPTCALL, R_OPTCALLX): Move definitions + from here... + * i960.h (R_IPRMED, R_OPTCALL, R_OPTCALLX): ...to here. + +Wed Jan 22 20:10:47 1997 Fred Fish + + * tic80.h (TIC80MAGIC): Renamed to TIC80_AOUTHDR_MAGIC. + +Fri Dec 27 22:05:45 1996 Fred Fish + + * tic80.h: New file for TIc80 support. + +Thu Dec 19 16:18:11 1996 Ian Lance Taylor + + * arm.h (_LIT): Define. + +Fri Jun 28 12:54:38 1996 Ian Lance Taylor + + * pe.h (FILHSZ): Define. + +Wed Jun 26 16:24:26 1996 Ian Lance Taylor + + * All files: Define FILHSZ, AOUTSZ, AOUTHDRSZ, SCNHSZ, SYMESZ, + AUXESZ, LINESZ, RELSZ as numeric constants rather than uses of + sizeof. Define AOUTHDRSZ in all files. + * pe.h (AOUTSZ): Define by adding to AOUTHDRSZ. + +Fri Jun 21 11:17:46 1996 Richard Henderson + + * alpha.h: Add declarations for relocation types added for Alpha + OSF/1 3.0. + +Tue Jun 18 16:04:29 1996 Jeffrey A. Law + + * h8300.h (H8300SMAGIC): Define. + (H8300SBADMAG): Define. + +Mon Jun 10 11:53:28 1996 Jeffrey A Law (law@cygnus.com) + + * internal.h (R_BCC_INV, R_JMP_DEL): New relocations for + relaxing in the H8/300 series. + +Thu May 16 15:49:22 1996 Ian Lance Taylor + + * sh.h (R_SH_CODE, R_SH_DATA, R_SH_LABEL): Define. + +Tue May 7 00:36:39 1996 Jeffrey A Law (law@cygnus.com) + + * internal.h (R_JMPL2): Renamed from R_JMPL_B8 to be + consistent with other similar relocs. + + * internal.h (H8/300 specific relocs): Add comments better + explaining what each reloc is used for. + (R_MOV16B1, R_MOV16B2): Renamed from R_MOVB1 and R_MOVB2. + (R_MOV24B1, R_MOV24B2): Renamed from R_MOVLB1 and R_MOVLB2. + (R_MOVL1, R_MOVL2): New relocs. + +Fri May 3 13:01:12 1996 Jeffrey A Law (law@cygnus.com) + + * internal.h (R_PCRWORD_B): Define for the h8300 relaxing + linker. + +Wed May 1 19:21:03 1996 Ian Lance Taylor + + * internal.h (SCNNMLEN): Define. + (struct internal_scnhdr): Use SCNNMLEN for s_name field. + +Fri Mar 29 13:41:25 1996 Ian Lance Taylor + + * pe.h: Define IMAGE_COMDAT codes. + +Wed Mar 27 17:29:42 1996 Ian Lance Taylor + + * arm.h (union external_auxent): Add x_checksum, x_associated, and + x_comdat fields to x_scn struct. + * i386.h (union external_auxent): Likewise. + * powerpc.h (union external_auxent): Likewise. + * internal.h (union internal_auxent): Likewise. + +Thu Mar 21 16:25:57 1996 David Mosberger-Tang + + * ecoff.h (struct ecoff_find_line): Add caching fields. + +Thu Mar 14 15:22:44 1996 Jeffrey A Law (law@cygnus.com) + + * internal.h (R_MEM_INDIRECT): New reloc for the h8300. + +Fri Feb 9 10:44:11 1996 Ian Lance Taylor + + * aux-coff.h: Rename from aux.h, to avoid problems on hapless DOS + systems which think that aux is a com port. + +Mon Feb 5 18:35:00 1996 Ian Lance Taylor + + * i960.h (F_I960HX): Define. + +Wed Jan 31 13:11:54 1996 Richard Henderson + + * aux.h: New file. + * internal.h, m68k.h: Protect against multiple inclusion. + +Wed Nov 22 13:48:39 1995 Ian Lance Taylor + + * ecoff.h (_RCONST, STYP_RCONST, RELOC_SECTION_RCONST): Define. + (NUM_RELOC_SECTIONS): Update. + * symconst.h (scRConst): Define. + +Tue Nov 14 18:54:29 1995 Ian Lance Taylor + + * internal.h (C_NT_WEAK): Define. + +Thu Nov 9 14:08:30 1995 Ian Lance Taylor + + * rs6000.h (STYP_OVRFLO): Define. + +Tue Nov 7 14:38:45 1995 Kim Knuttila + + * powerpc.h (IMAGE_NT_OPTIONAL_HDR_MAGIC): Added define. + * pe.h: Added defines for file level flags + +Mon Nov 6 17:28:01 1995 Harry Dolan + + * i860.h: New file, based on i386.h. + +Wed Nov 1 15:25:18 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 + + * m68k.h (PAGEMAGICEXECSWAPPED): Define. + (PAGEMAGICPEXECSWAPPED): Define. + (PAGEMAGICPEXECTSHLIB): Define. + (PAGEMAGICPEXECPAGED): Define. + (_COMMENT): DEFINE. + * m88k.h (_COMMENT): Define. + +Wed Oct 18 18:36:19 1995 Geoffrey Noer + + * sym.h: #if 0'd out runtime_pdr struct because it chokes + Visual C++ and there aren't any references to it elsewhere in gdb. + +Mon Oct 16 11:12:24 1995 Ian Lance Taylor + + * rs6000.h (SMALL_AOUTSZ): Define. + + * internal.h (XMC_TD): Define. + +Tue Oct 10 18:41:03 1995 Ian Lance Taylor + + * internal.h (struct internal_aouthdr): Add o_cputype field. + * rs6000.h (AOUTHDR): Rename o_resv1 to o_cputype. + +Mon Oct 9 14:45:46 1995 Ian Lance Taylor + + * rs6000.h (AOUTHDR): Add o_maxdata field. Add comments. + (_PAD, _LOADER): Define. + (STYP_LOADER): Define. + * internal.h (struct internal_aouthdr): Add o_maxdata field. + +Thu Oct 5 10:02:57 1995 Ian Lance Taylor + + * ecoff.h: Define section name macros and STYP macros for various + Alpha sections: .got, .hash, .dynsym, .dynstr, .rel.dyn, .conflic, + .comment, .liblist, .dynamic. + +Wed Oct 4 10:56:35 1995 Kim Knuttila + + * pe.h: Moved DOSMAGIC and NT_SIGNATURE defines here + * powerpc.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines + Also removed other unused defines (various MAGIC ones) + * i386.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines + * arm.h: removed DOSMAGIC, NT_SIGNATURE, and DEFAULT_* defines + * apollo.h: removed unused DEFAULT_* defines + * alpha.h: removed unused DEFAULT_* defines + * h8500.h: removed unused DEFAULT_* defines + * h8300.h: removed unused DEFAULT_* defines + * i960.h: removed unused DEFAULT_* defines + * m88k.h: removed unused DEFAULT_* defines + * we32k.h: removed unused DEFAULT_* defines + * rs6000.h: removed unused DEFAULT_* defines + * mips.h: removed unused DEFAULT_* defines + * m68k.h: removed unused DEFAULT_* defines + * z8k.h: removed unused DEFAULT_* defines + * w65.h: removed unused DEFAULT_* defines + * sparc.h: removed unused DEFAULT_* defines + * sh.h: removed unused DEFAULT_* defines + +Fri Sep 29 08:40:08 1995 Kim Knuttila + + * powerpc.h: Reformatted to GNU coding conventions. + +Wed Sep 27 06:50:50 1995 Kim Knuttila + + * pe.h: added defines for more section characteristics + * powerpc.h (new file): base coff definitions for ppc PE + +Tue Sep 12 12:08:20 1995 Ian Lance Taylor + + * internal.h (struct internal_syment): Change n_numaux field from + char to unsigned char. + +Fri Sep 1 15:39:36 1995 Kazumoto Kojima + + * mips.h (struct rpdr_ext): Define. + +Thu Aug 31 16:51:50 1995 steve chamberlain + + * internal.h (internal_aouthdr, internal_filehdr): + don't indirect the pe stuff. + +Tue Aug 29 14:16:07 1995 steve chamberlain + + * i386.h (NT_DEF_RESERVE, NT_DEF_COMMIT): Make the same + as 'the other' compiler. + * internal.h (NT_IMAGE_BASE): Deleted. + (NT_EXE_IMAGE_BASE, NT_DLL_IMAGE_BASE): New. + (PE_DEF_SECTION_ALIGNMENT, PE_DEF_FILE_ALIGNMENT): New. + (R_IMAGEBASE): New. + +Mon Aug 21 18:12:19 1995 steve chamberlain + + * internal.h: (internal_filehdr): Moved PE stuff into + internal_extra_pe_filehdr. + (internal_aouthdr): Moved PE stuff into + interanl_extra_pe_aouthdr. + +Mon Jul 24 14:05:39 1995 Ian Lance Taylor + + * internal.h: Move R_SH_* relocs from here... + * sh.h: ...to here. + (R_SH_SWITCH16, R_SH_SWITCH32): Define. + (R_SH_USES, R_SH_COUNT, R_SH_ALIGN): Define. + +Thu Jun 29 00:04:25 1995 Steve Chamberlain + + * internal.h (NT_DEF_RESERVE, NT_DEF_COMMIT): Increase a lot. + +Tue May 16 15:08:20 1995 Ken Raeburn + + * internal.h (NT_subsystem, NT_stack_heap): Delete + +Tue May 16 15:08:20 1995 Ken Raeburn + + * internal.h (NT_subsystem, NT_stack_heap): Now extern. + +Sat May 13 10:14:08 1995 Steve Chamberlain + + * pe.h: New file. + * i386.h (NT_SECTION_ALIGNMENT, NT_FILE_ALIGNMENT, + NT_DEF_RESERVE, NT_DEF_COMMIT): New. + * internal.h (internal_filehdr): New fields for PE. + (IMAGE_DATA_DIRECTORY): New. + (internal_aouthdr): New fields for PE. + +Tue Feb 14 17:59:37 1995 Ian Lance Taylor + + * ecoff.h (struct ecoff_fdrtab_entry): Define. + (struct ecoff_find_line): Define. + +Sat Feb 4 14:38:03 1995 David Mosberger-Tang + + * sym.h (struct pdr): field "prof" added. + + * alpha.h (PDR_BITS1_PROF_*): added, macros for PDR_BITS*_RESERVED_* + updated accordingly. + +Sun Jan 15 18:38:33 1995 Steve Chamberlain + + * w65.h: New file. + +Wed Nov 23 22:43:38 1994 Steve Chamberlain (sac@jonny.cygnus.com) + + * sh.h (SH_ARCH_MAGIC_BIG, SH_ARCH_MAGIC_LITTLE): New. + (SHBADMAG): Changed to suit. + +Tue Jul 26 17:46:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * i960.h (F_I960JX): New macro. + +Wed Jul 6 00:48:57 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * alpha.h: Add definitions for alpha file header flags, encoding + the object type of the file. + +Mon Jun 20 13:47:01 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * ecoff.h (ecoff_swap_tir_in): Remove declaration. + (ecoff_swap_tir_out): Likewise. + (ecoff_swap_rndx_in, ecoff_swap_rndx_out): Likewise. + (struct ecoff_debug_swap): Add new fields: swap_tir_in, + swap_rndx_in, swap_tir_out, swap_rndx_out, read_debug_info. + +Sun Jun 12 03:51:52 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * symconst.h: Pick up SGI define for stIndirect. + +Fri Apr 22 13:05:28 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (REGINFO): Don't define. + (struct ecoff_reginfo): Don't define. + + * sh.h (SH_ARCH_MAGIC): Rename from SHMAGIC. SHMAGIC is used by + several targets to mean a shared library. + (SHBADMAG): Corresponding change. + +Thu Apr 14 13:00:53 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (RELOC_BITS3_TYPE_BIG): Changed from 0x1e to 0x3e. + (RELOC_BITS3_TYPEHI_LITTLE): Define. + (RELOC_BITS3_TYPEHI_SH_LITTLE): Define. + (MIPS_R_PCREL16): Change value from 8 to 12 to match Irix 4. + (MIPS_R_RELHI): Define. + (MIPS_R_RELLO): Define. + (MIPS_R_SWITCH): Change value from 9 to 22. + +Thu Apr 7 14:19:35 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (MIPS_R_SWITCH): Define. + +Thu Mar 31 19:28:33 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * internal.h (internal_aouthdr): Added comments for Apollo fields. + +Thu Mar 31 16:28:02 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (STYP_ECOFF_LIB): Define as used on Irix 4. + +Fri Mar 25 17:16:55 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (struct ecoff_debug_info): Add adjust field. + (struct ecoff_value_adjust): Define. + +Tue Mar 22 13:22:47 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (MIPS_R_PCREL16): Define. + +Sat Feb 26 10:26:38 1994 Ian Lance Taylor (ian@cygnus.com) + + * ecoff.h: Add casts to avoid warnings from SVR4 cc. + +Mon Feb 21 09:48:46 1994 Ian Lance Taylor (ian@lisa.cygnus.com) + + * sym.h (struct runtime_pdr): Make field adr bfd_vma, not unsigned + long. + (SYMR): Make field value bfd_vma, not long. + +Fri Feb 4 23:35:53 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * rs6000.h (STYP_DEBUG): Define. + +Wed Feb 2 14:31:37 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * internal.h (union internal_auxent): Change x_csect.x_scnlen into + a union of a long and a pointer to a symbol. XCOFF sometimes uses + this field as a symbol index. + +Mon Jan 10 23:54:25 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (ecoff_debug_info): Remove fields line_end, + external_dnr_end, external_pdr_end, external_sym_end, + external_opt_end, external_aux_end, ss_end, external_fdr_end. + Replace ifdbase with ifdmap. + +Wed Jan 5 17:05:36 1994 Ken Raeburn (raeburn@deneb.cygnus.com) + + * ecoff.h (STYP_EXTENDESC, STYP_COMMENT, STYP_XDATA, STYP_PDATA): + Define. + +Wed Jan 5 16:58:24 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (NUM_RELOC_SECTIONS): Define. + +Tue Dec 21 09:24:56 1993 Ken Raeburn (raeburn@rtl.cygnus.com) + + * sparc.h (struct external_reloc): Rename field r_addend to + r_offset. + +Sat Dec 11 16:12:32 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h (R_DISP7, R_SH_IMM16): New reloc types. + +Tue Nov 23 14:23:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (struct ecoff_debug_swap): Added *_end fields for all + the symbolic information pointers. + + * sym.h: Named the EXTR structure ecoff_extr. + +Fri Nov 19 08:21:18 1993 Ken Raeburn (raeburn@rover.cygnus.com) + + * sparc.h (RELSZ): Use correct size. + +Wed Nov 17 17:18:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (struct ecoff_debug_info): Define. + +Tue Nov 2 17:56:57 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (struct ecoff_debug_swap): Define. + +Thu Oct 28 17:07:50 1993 Stan Shebs (shebs@rtl.cygnus.com) + + * i386.h (I386LYNXMAGIC): Rename to LYNXCOFFMAGIC. + * m68k.h (LYNXCOFFMAGIC): Define. + * sparc.h: New file. + +Tue Oct 19 15:34:50 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * alpha.h (external_aouthdr): Split four byte padding field into + two byte bldrev field and two byte padding field. + + * ecoff.h (_LITA, _PDATA, _XDATA, STYP_LITA): Defined. + +Wed Oct 13 15:52:34 1993 Ken Raeburn (raeburn@cygnus.com) + + Sun Oct 10 17:27:10 1993 Troy Rollo (troy@cbme.unsw.edu.au) + + * internal.h: Added o_sri, o_inlib and o_vid for Apollos as well + as R_DIR16. + + * apollo.h: New file + +Mon Oct 11 17:16:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (REGINFO, struct ecoff_reginfo): Define. + +Tue Oct 5 10:52:53 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * rs6000.h: Change non-ASCII characters in comment to octal + escapes. + +Tue Sep 28 03:27:04 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * ecoff.h (_FINI, STYP_ECOFF_FINI): Add to support .fini section. + +Fri Sep 24 11:53:53 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (BADMAG): Recognize MIPS_MAGIC_LITTLE3 and MIPS_MAGIC_BIG3. + * ecoff.h: Define MIPS_MAGIC_LITTLE3 and MIPS_MAGIC_BIG3. + +Thu Sep 23 21:07:14 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * mips.h (BADMAG): Recognize MIPS_MAGIC_LITTLE2 and MIPS_MAGIC_BIG2. + * ecoff.h: Define MIPS_MAGIC_LITTLE2 and MIPS_MAGIC_BIG2. + +Thu Sep 16 20:27:21 1993 Jim Kingdon (kingdon@cirdan.cygnus.com) + + * sym.h, symconst.h: Add comment stating these files are not part + of GDB, GAS, etc. In 1991, when we asked rms whether we could + include these files in GDB (although they are copyrighted by + someone besides the FSF), he said it was OK if they were not + considered part of GDB. + +Fri Sep 10 17:40:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (AUX_PUT_ANY): Cast val argument to bfd_vma. + + * alpha.c (external_aouthdr): Need four bytes of padding between + vstamp and tsize. + +Tue Sep 7 14:20:43 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff.h (AUX_GET_ANY, AUX_PUT_ANY): Changed to reflect further + change in bfd swapping routine names. + +Tue Sep 7 10:15:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * ecoff.h (AUX_GET_ANY): Change name of _do_getb32 to reflect bfd + changes. + +Fri Aug 13 14:30:32 1993 Ian Lance Taylor (ian@cygnus.com) + + * ecoff.h (RELOC_SECTION_NONE): Define. + +Thu Aug 12 11:24:42 1993 Ian Lance Taylor (ian@cygnus.com) + + * alpha.h (struct external_reloc): Add r_symndx field. + (RELSZ): Correct. + (RELOC_BITS*): Correct. + (ALPHA_R_*): Define. + * ecoff.h (RELOC_SECTION_{XDATA,PDATA,FINI,LITA,ABS}): Define. + (r_extern): Undefine. + * internal.h (struct internal_reloc): Make r_vaddr bfd_vma rather + than long. Add r_extern field. + + * alpha.h (PDR_BITS*): Define. + * sym.h (PDR): Give correct names to new fields. + + * ecoff.h: Moved MIPS reloc definitions from here... + * mips.h: to here. + +Mon Aug 2 16:37:14 1993 Stu Grossman (grossman at cygnus.com) + + * i386.h: Add Lynx magic number. + +Tue Aug 3 11:17:53 1993 Ian Lance Taylor (ian@cygnus.com) + + * alpha.h: Corrected external symbolic debugging structures to + match actual usage. + * internal.h (internal_filehdr, internal_aouthdr, + internal_scnhdr): Changed type of some fields to bfd_vma so they + can hold 64 bits. + * sym.h (HDRR, FDR, PDR, EXTR): Likewise. + (PDR): Added new fields found on Alpha. + * symconst.h (magicSym2): Define; new value found on Alpha. + + * ecoff.h: New file. + * alpha.h, mips.h: Moved common information into ecoff.h. Moved + external structure definitions in from ecoff-ext.h. + * ecoff-ext.h: Removed; information now in alpha.h and mips.h. + +Sun Jul 18 21:43:59 1993 Jim Kingdon (kingdon@rtl.cygnus.com) + + * i386.h: Recognize I386PTXMAGIC. + +Fri Jul 16 09:54:35 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h (MIPS_AOUT_{OZ}MAGIC): Renamed from {OZ}MAGIC. + +Thu Jul 15 12:23:55 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * m88k.h (union external_auxent): Move x_fcn back inside x_fcnary. + ({GET,PUT}_FCN_{LNNOPTR,ENDNDX}): Adjust accordingly. + +Sun Jul 11 18:00:18 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * m68k.h: Define MC68KBCSMAGIC. + +Thu Jun 10 11:46:28 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h (_INIT, STYP_MIPS_INIT): Define (used on Irix4). + (STYP_OTHER_LOAD): Define as STYP_MIPS_INIT. + +Wed Jun 9 15:09:09 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h (OMAGIC): Define. + +Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) + + Support for H8/300-H + * h8300.h: New magic number. + * internal.h: New relocations. + +Mon Apr 26 18:04:47 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h, sh.h: Support for SH. + +Sat Apr 24 21:34:59 1993 Jim Kingdon (kingdon@cygnus.com) + + * a29k.h: Define _LIT. + +Fri Apr 23 18:41:23 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * alpha.h: New file. + +Thu Apr 8 12:36:34 1993 Ian Lance Taylor (ian@cygnus.com) + + * internal.h (C_SHADOW, C_VERSION): Copied in from m88k.h. + * m88k.h, i386.h, we32k.h: Don't define all the storage classes; + they're already in internal.h. + +Wed Apr 7 11:51:24 1993 Jim Kingdon (kingdon@cygnus.com) + + * internal.h: Change n_sclass to unsigned char. + Change C_EFCN to 0xff, change RS/6000 dbx symbols + to no longer be signed. + +Fri Mar 19 14:52:56 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h: Add H8/500 reloc types. + +Wed Mar 17 09:46:03 1993 Ian Lance Taylor (ian@cygnus.com) + + * ecoff-ext.h (AUX_PUT_ANY): Don't use void values in branches of + conditional expression. + +Thu Mar 4 14:12:06 1993 Ian Lance Taylor (ian@cygnus.com) + + * ecoff-ext.h (AUX_GET_*): Rewrote to use new macro AUX_GET_ANY. + (AUX_PUT_*): New macros corresponding to the AUX_GET macros. + (ecoff_swap_tir_out): Added prototype. + + * mips.h (N_BTMASK, N_TMASK, N_BTSHFT, N_TSHIFT): Define; these + are needed to interpret gcc debugging output. + +Tue Feb 9 07:43:27 1993 Ian Lance Taylor (ian@cygnus.com) + + * we32k.h (BTYPE, ISPTR, ISFCN, ISARY, DECREF): Removed + more definitions duplicated in internal.h. + +Wed Feb 3 09:18:24 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h (RELOC_BITS3_TYPE_*): Correct for big endian machines. + +Mon Jan 25 11:35:51 1993 Ian Lance Taylor (ian@cygnus.com) + + * internal.h (internal_aouthdr): Added additional fields used only + by MIPS ECOFF. + +Thu Jan 21 10:28:38 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h (AOUTHDR): Added additional fields used by ECOFF. + +Tue Jan 19 12:21:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * i386.h, we32k.h (N_*, T_*, DT_*): Removed still more definitions + duplicated in internal.h. + + * mips.h (RELOC_SECTION_*, ECOFF_R_*): Defined constants for ECOFF + relocs. + +Fri Jan 15 18:17:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff-ext.h: Added prototypes for new ECOFF swapping functions. + (opt_ext): New structure. + * mips.h (ZMAGIC): Defined to be 0413. + (_LIB): Defined to be ".lib" + (external_reloc): MIPS ECOFF relocs are only 8 bytes. Added + macros to aid in swapping. + +Fri Jan 8 16:19:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ecoff-ext.h: Added prototypes for ECOFF swapping functions. + * internal.h (internal_scnhdr): Always provide s_align field, not + just on i960. + (internal_reloc): Always provide r_size field, not just on + RS/6000. + * mips.h (_RDATA, _SDATA, _SBSS, _LIT4, _LIT8, STYP_RDATA, + STYP_SDATA, STYP_SBSS, STYP_LIT4, STYP_LIT8): Defined. + (CODE_MASK, MIPS_IS_STAB, MIPS_MARK_STAB, MIPS_UNMARK_STAB, + STABS_SYMBOL): Moved in from gdb/mipsread.c. + +Wed Jan 6 14:01:46 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * i386.h, we32k.h: removed STYP_* defines, since they duplicated + those in internal.h. + +Tue Dec 29 15:40:07 1992 Ian Lance Taylor (ian@cygnus.com) + + * i386.h: define I386AIXMAGIC for Danbury AIX PS/2 compiler. + +Sat Dec 12 16:07:57 1992 Ian Lance Taylor (ian@cygnus.com) + + * i386.h: don't define BTYPE, ISPTR, ISFCN, ISARY, DECREF: they + are defined in internal.h. + +Thu Nov 12 09:52:01 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h: (internal_reloc): r_offset is now a long. + * z8k.h: slight comment enhancement + +Wed Sep 30 07:46:08 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h: changed z8k reloc types + +Fri Aug 28 10:16:31 1992 Brendan Kehoe (brendan@cygnus.com) + + * we32k.h: new file + +Thu Aug 27 13:00:01 1992 Brendan Kehoe (brendan@cygnus.com) + + * symconst.h: comment out cruft at the end of #endif + +Tue Aug 25 15:06:49 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h: added #define for STYP_LIT, removed from a29k and + h8300. + + * z8k.h: added z8000 support + +Thu Jul 16 16:32:00 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * internal.h: added R_RELLONG_NEG reloc type + +Fri Jun 12 20:11:04 1992 John Gilmore (gnu at cygnus.com) + + * symconst.h: Fix unterminated comment. + +Wed Jun 10 07:57:49 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * i386.h: a.out magic numbers from + mohring@informatik.tu-muenchen.de + +Mon Jun 8 20:13:33 1992 John Gilmore (gnu at cygnus.com) + + * ecoff-ext.h, mips.h: Use unsigned chars everywhere. + (Suggested by Antti Miettinen.) + +Tue Apr 14 15:18:44 1992 John Gilmore (gnu at cygnus.com) + + * sym.h: Add comments. + * symconst.h: Merge with Fred's changes. + +Tue Apr 14 14:30:05 1992 Fred Fish (fnf@cygnus.com) + + * symconst.h: Pick up SGI defines for stStruct, stUnion, stEnum, + langCplusplus, and langCplusplusV2. + +Thu Apr 2 19:47:43 1992 John Gilmore (gnu at cygnus.com) + + * sym.h, symconst.h: MIPS has provided redistributable versions + of these files. Thanks! + * ecoff-ext.h: Add weakext bit to match new sym.h. + +Fri Mar 6 00:10:46 1992 John Gilmore (gnu at cygnus.com) + + * ecoff-ext.h: Add relative file descriptors. + +Thu Feb 27 11:53:04 1992 John Gilmore (gnu at cygnus.com) + + * ecoff-ext.h: New file for external (in-file) form of ecoff + symbol structures. + +Thu Feb 6 11:33:32 1992 Steve Chamberlain (sac at rtl.cygnus.com) + + * h8300.h: made the external_lineno l_lnno field 4 bytes wide. + andded GET/PUT_LINENO_LNNO macros + +Sat Nov 30 20:38:35 1991 Steve Chamberlain (sac at rtl.cygnus.com) + + * a29k.h, h8300.h, i386.h, i960.h, internal.h, m68k.h, m88k.h, + mips.h, rs6000.h: Move from above coff-.h. + + +Copyright (C) 1991-2003 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/coff/alpha.h b/include/coff/alpha.h new file mode 100644 index 0000000..8151689 --- /dev/null +++ b/include/coff/alpha.h @@ -0,0 +1,386 @@ +/* ECOFF support on Alpha machines. + coff/ecoff.h must be included before this file. + + Copyright 2001, 2005, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/********************** FILE HEADER **********************/ + +struct external_filehdr +{ + unsigned char f_magic[2]; /* magic number */ + unsigned char f_nscns[2]; /* number of sections */ + unsigned char f_timdat[4]; /* time & date stamp */ + unsigned char f_symptr[8]; /* file pointer to symtab */ + unsigned char f_nsyms[4]; /* number of symtab entries */ + unsigned char f_opthdr[2]; /* sizeof(optional hdr) */ + unsigned char f_flags[2]; /* flags */ +}; + +/* Magic numbers are defined in coff/ecoff.h. */ +#define ALPHA_ECOFF_BADMAG(x) \ + ((x).f_magic != ALPHA_MAGIC && (x).f_magic != ALPHA_MAGIC_BSD) + +#define ALPHA_ECOFF_COMPRESSEDMAG(x) \ + ((x).f_magic == ALPHA_MAGIC_COMPRESSED) + +/* The object type is encoded in the f_flags. */ +#define F_ALPHA_OBJECT_TYPE_MASK 0x3000 +#define F_ALPHA_NO_SHARED 0x1000 +#define F_ALPHA_SHARABLE 0x2000 +#define F_ALPHA_CALL_SHARED 0x3000 + +#define FILHDR struct external_filehdr +#define FILHSZ 24 + +/********************** AOUT "OPTIONAL HEADER" **********************/ + +typedef struct external_aouthdr +{ + unsigned char magic[2]; /* type of file */ + unsigned char vstamp[2]; /* version stamp */ + unsigned char bldrev[2]; /* ?? */ + unsigned char padding[2]; /* pad to quadword boundary */ + unsigned char tsize[8]; /* text size in bytes */ + unsigned char dsize[8]; /* initialized data " " */ + unsigned char bsize[8]; /* uninitialized data " " */ + unsigned char entry[8]; /* entry pt. */ + unsigned char text_start[8]; /* base of text used for this file */ + unsigned char data_start[8]; /* base of data used for this file */ + unsigned char bss_start[8]; /* base of bss used for this file */ + unsigned char gprmask[4]; /* bitmask of general registers used */ + unsigned char fprmask[4]; /* bitmask of floating point registers used */ + unsigned char gp_value[8]; /* value for gp register */ +} AOUTHDR; + +/* compute size of a header */ + +#define AOUTSZ 80 +#define AOUTHDRSZ 80 + +/********************** SECTION HEADER **********************/ + +struct external_scnhdr +{ + unsigned char s_name[8]; /* section name */ + unsigned char s_paddr[8]; /* physical address, aliased s_nlib */ + unsigned char s_vaddr[8]; /* virtual address */ + unsigned char s_size[8]; /* section size */ + unsigned char s_scnptr[8]; /* file ptr to raw data for section */ + unsigned char s_relptr[8]; /* file ptr to relocation */ + unsigned char s_lnnoptr[8]; /* file ptr to line numbers */ + unsigned char s_nreloc[2]; /* number of relocation entries */ + unsigned char s_nlnno[2]; /* number of line number entries*/ + unsigned char s_flags[4]; /* flags */ +}; + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 64 + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + unsigned char r_vaddr[8]; + unsigned char r_symndx[4]; + unsigned char r_bits[4]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + +/* Constants to unpack the r_bits field. The Alpha seems to always be + little endian, so I haven't bothered to define big endian variants + of these. */ + +#define RELOC_BITS0_TYPE_LITTLE 0xff +#define RELOC_BITS0_TYPE_SH_LITTLE 0 + +#define RELOC_BITS1_EXTERN_LITTLE 0x01 + +#define RELOC_BITS1_OFFSET_LITTLE 0x7e +#define RELOC_BITS1_OFFSET_SH_LITTLE 1 + +#define RELOC_BITS1_RESERVED_LITTLE 0x80 +#define RELOC_BITS1_RESERVED_SH_LITTLE 7 +#define RELOC_BITS2_RESERVED_LITTLE 0xff +#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 +#define RELOC_BITS3_RESERVED_LITTLE 0x03 +#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 + +#define RELOC_BITS3_SIZE_LITTLE 0xfc +#define RELOC_BITS3_SIZE_SH_LITTLE 2 + +/* The r_type field in a reloc is one of the following values. */ +#define ALPHA_R_IGNORE 0 +#define ALPHA_R_REFLONG 1 +#define ALPHA_R_REFQUAD 2 +#define ALPHA_R_GPREL32 3 +#define ALPHA_R_LITERAL 4 +#define ALPHA_R_LITUSE 5 +#define ALPHA_R_GPDISP 6 +#define ALPHA_R_BRADDR 7 +#define ALPHA_R_HINT 8 +#define ALPHA_R_SREL16 9 +#define ALPHA_R_SREL32 10 +#define ALPHA_R_SREL64 11 +#define ALPHA_R_OP_PUSH 12 +#define ALPHA_R_OP_STORE 13 +#define ALPHA_R_OP_PSUB 14 +#define ALPHA_R_OP_PRSHIFT 15 +#define ALPHA_R_GPVALUE 16 +#define ALPHA_R_GPRELHIGH 17 +#define ALPHA_R_GPRELLOW 18 +#define ALPHA_R_IMMED 19 + +/* Overloaded reloc value used by Net- and OpenBSD. */ +#define ALPHA_R_LITERALSLEAZY 17 + +/* With ALPHA_R_LITUSE, the r_size field is one of the following values. */ +#define ALPHA_R_LU_BASE 1 +#define ALPHA_R_LU_BYTOFF 2 +#define ALPHA_R_LU_JSR 3 + +/* With ALPHA_R_IMMED, the r_size field is one of the following values. */ +#define ALPHA_R_IMMED_GP_16 1 +#define ALPHA_R_IMMED_GP_HI32 2 +#define ALPHA_R_IMMED_SCN_HI32 3 +#define ALPHA_R_IMMED_BR_HI32 4 +#define ALPHA_R_IMMED_LO32 5 + +/********************** SYMBOLIC INFORMATION **********************/ + +/* Written by John Gilmore. */ + +/* ECOFF uses COFF-like section structures, but its own symbol format. + This file defines the symbol format in fields whose size and alignment + will not vary on different host systems. */ + +/* File header as a set of bytes */ + +struct hdr_ext +{ + unsigned char h_magic[2]; + unsigned char h_vstamp[2]; + unsigned char h_ilineMax[4]; + unsigned char h_idnMax[4]; + unsigned char h_ipdMax[4]; + unsigned char h_isymMax[4]; + unsigned char h_ioptMax[4]; + unsigned char h_iauxMax[4]; + unsigned char h_issMax[4]; + unsigned char h_issExtMax[4]; + unsigned char h_ifdMax[4]; + unsigned char h_crfd[4]; + unsigned char h_iextMax[4]; + unsigned char h_cbLine[8]; + unsigned char h_cbLineOffset[8]; + unsigned char h_cbDnOffset[8]; + unsigned char h_cbPdOffset[8]; + unsigned char h_cbSymOffset[8]; + unsigned char h_cbOptOffset[8]; + unsigned char h_cbAuxOffset[8]; + unsigned char h_cbSsOffset[8]; + unsigned char h_cbSsExtOffset[8]; + unsigned char h_cbFdOffset[8]; + unsigned char h_cbRfdOffset[8]; + unsigned char h_cbExtOffset[8]; +}; + +/* File descriptor external record */ + +struct fdr_ext +{ + unsigned char f_adr[8]; + unsigned char f_cbLineOffset[8]; + unsigned char f_cbLine[8]; + unsigned char f_cbSs[8]; + unsigned char f_rss[4]; + unsigned char f_issBase[4]; + unsigned char f_isymBase[4]; + unsigned char f_csym[4]; + unsigned char f_ilineBase[4]; + unsigned char f_cline[4]; + unsigned char f_ioptBase[4]; + unsigned char f_copt[4]; + unsigned char f_ipdFirst[4]; + unsigned char f_cpd[4]; + unsigned char f_iauxBase[4]; + unsigned char f_caux[4]; + unsigned char f_rfdBase[4]; + unsigned char f_crfd[4]; + unsigned char f_bits1[1]; + unsigned char f_bits2[3]; + unsigned char f_padding[4]; +}; + +#define FDR_BITS1_LANG_BIG 0xF8 +#define FDR_BITS1_LANG_SH_BIG 3 +#define FDR_BITS1_LANG_LITTLE 0x1F +#define FDR_BITS1_LANG_SH_LITTLE 0 + +#define FDR_BITS1_FMERGE_BIG 0x04 +#define FDR_BITS1_FMERGE_LITTLE 0x20 + +#define FDR_BITS1_FREADIN_BIG 0x02 +#define FDR_BITS1_FREADIN_LITTLE 0x40 + +#define FDR_BITS1_FBIGENDIAN_BIG 0x01 +#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 + +#define FDR_BITS2_GLEVEL_BIG 0xC0 +#define FDR_BITS2_GLEVEL_SH_BIG 6 +#define FDR_BITS2_GLEVEL_LITTLE 0x03 +#define FDR_BITS2_GLEVEL_SH_LITTLE 0 + +/* We ignore the `reserved' field in bits2. */ + +/* Procedure descriptor external record */ + +struct pdr_ext { + unsigned char p_adr[8]; + unsigned char p_cbLineOffset[8]; + unsigned char p_isym[4]; + unsigned char p_iline[4]; + unsigned char p_regmask[4]; + unsigned char p_regoffset[4]; + unsigned char p_iopt[4]; + unsigned char p_fregmask[4]; + unsigned char p_fregoffset[4]; + unsigned char p_frameoffset[4]; + unsigned char p_lnLow[4]; + unsigned char p_lnHigh[4]; + unsigned char p_gp_prologue[1]; + unsigned char p_bits1[1]; + unsigned char p_bits2[1]; + unsigned char p_localoff[1]; + unsigned char p_framereg[2]; + unsigned char p_pcreg[2]; +}; + +#define PDR_BITS1_GP_USED_BIG 0x80 +#define PDR_BITS1_REG_FRAME_BIG 0x40 +#define PDR_BITS1_PROF_BIG 0x20 +#define PDR_BITS1_RESERVED_BIG 0x1f +#define PDR_BITS1_RESERVED_SH_LEFT_BIG 8 +#define PDR_BITS2_RESERVED_BIG 0xff +#define PDR_BITS2_RESERVED_SH_BIG 0 + +#define PDR_BITS1_GP_USED_LITTLE 0x01 +#define PDR_BITS1_REG_FRAME_LITTLE 0x02 +#define PDR_BITS1_PROF_LITTLE 0x04 +#define PDR_BITS1_RESERVED_LITTLE 0xf8 +#define PDR_BITS1_RESERVED_SH_LITTLE 3 +#define PDR_BITS2_RESERVED_LITTLE 0xff +#define PDR_BITS2_RESERVED_SH_LEFT_LITTLE 5 + +/* Line numbers */ + +struct line_ext { + unsigned char l_line[4]; +}; + +/* Symbol external record */ + +struct sym_ext { + unsigned char s_value[8]; + unsigned char s_iss[4]; + unsigned char s_bits1[1]; + unsigned char s_bits2[1]; + unsigned char s_bits3[1]; + unsigned char s_bits4[1]; +}; + +#define SYM_BITS1_ST_BIG 0xFC +#define SYM_BITS1_ST_SH_BIG 2 +#define SYM_BITS1_ST_LITTLE 0x3F +#define SYM_BITS1_ST_SH_LITTLE 0 + +#define SYM_BITS1_SC_BIG 0x03 +#define SYM_BITS1_SC_SH_LEFT_BIG 3 +#define SYM_BITS1_SC_LITTLE 0xC0 +#define SYM_BITS1_SC_SH_LITTLE 6 + +#define SYM_BITS2_SC_BIG 0xE0 +#define SYM_BITS2_SC_SH_BIG 5 +#define SYM_BITS2_SC_LITTLE 0x07 +#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 + +#define SYM_BITS2_RESERVED_BIG 0x10 +#define SYM_BITS2_RESERVED_LITTLE 0x08 + +#define SYM_BITS2_INDEX_BIG 0x0F +#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 +#define SYM_BITS2_INDEX_LITTLE 0xF0 +#define SYM_BITS2_INDEX_SH_LITTLE 4 + +#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 +#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 + +#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 +#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 + +/* External symbol external record */ + +struct ext_ext { + struct sym_ext es_asym; + unsigned char es_bits1[1]; + unsigned char es_bits2[3]; + unsigned char es_ifd[4]; +}; + +#define EXT_BITS1_JMPTBL_BIG 0x80 +#define EXT_BITS1_JMPTBL_LITTLE 0x01 + +#define EXT_BITS1_COBOL_MAIN_BIG 0x40 +#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 + +#define EXT_BITS1_WEAKEXT_BIG 0x20 +#define EXT_BITS1_WEAKEXT_LITTLE 0x04 + +/* Dense numbers external record */ + +struct dnr_ext { + unsigned char d_rfd[4]; + unsigned char d_index[4]; +}; + +/* Relative file descriptor */ + +struct rfd_ext { + unsigned char rfd[4]; +}; + +/* Optimizer symbol external record */ + +struct opt_ext { + unsigned char o_bits1[1]; + unsigned char o_bits2[1]; + unsigned char o_bits3[1]; + unsigned char o_bits4[1]; + struct rndx_ext o_rndx; + unsigned char o_offset[4]; +}; + +#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 +#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 + +#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 +#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 + +#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 +#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 diff --git a/include/coff/apollo.h b/include/coff/apollo.h new file mode 100644 index 0000000..1d4802f --- /dev/null +++ b/include/coff/apollo.h @@ -0,0 +1,125 @@ +/* coff information for Apollo M68K + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define DO_NOT_DEFINE_AOUTHDR +#define L_LNNO_SIZE 2 +#include "coff/external.h" + +/* Motorola 68000/68008/68010/68020 */ +#define MC68MAGIC 0520 +#define MC68KWRMAGIC 0520 /* writeable text segments */ +#define MC68TVMAGIC 0521 +#define MC68KROMAGIC 0521 /* readonly shareable text segments */ +#define MC68KPGMAGIC 0522 /* demand paged text segments */ +#define M68MAGIC 0210 +#define M68TVMAGIC 0211 + +/* Apollo 68000-based machines have a different magic number. This comes + * from /usr/include/apollo/filehdr.h + */ +#define APOLLOM68KMAGIC 0627 + +#define OMAGIC M68MAGIC +#define M68KBADMAG(x) (((x).f_magic!=MC68MAGIC) && ((x).f_magic!=MC68KWRMAGIC) && ((x).f_magic!=MC68TVMAGIC) && \ + ((x).f_magic!=MC68KROMAGIC) && ((x).f_magic!=MC68KPGMAGIC) && ((x).f_magic!=M68MAGIC) && ((x).f_magic!=M68TVMAGIC) && \ + ((x).f_magic!=APOLLOM68KMAGIC) ) + +/********************** AOUT "OPTIONAL HEADER" **********************/ + +typedef struct +{ + char magic[2]; /* type of file */ + char vstamp[2]; /* version stamp */ + char tsize[4]; /* text size in bytes, padded to FW bdry*/ + char dsize[4]; /* initialized data " " */ + char bsize[4]; /* uninitialized data " " */ + char entry[4]; /* entry pt. */ + char text_start[4]; /* base of text used for this file */ + char data_start[4]; /* base of data used for this file */ + char o_sri[4]; /* Apollo specific - .sri data pointer */ + char o_inlib[4]; /* Apollo specific - .inlib data pointer */ + char vid[8]; /* Apollo specific - 64 bit version ID */ +} +AOUTHDR; + +#define APOLLO_COFF_VERSION_NUMBER 1 /* the value of the aouthdr magic */ +#define AOUTHDRSZ 44 +#define AOUTSZ 44 + +/* Apollo allowa for larger section names by allowing + them to be in the string table. */ + +/* If s_zeores is all zeroes, s_offset gives the real + location of the name in the string table. */ + +#define s_zeroes section_name.s_name +#define s_offset (section_name.s_name+4) + +/* More names of "special" sections. */ +#define _TV ".tv" +#define _INIT ".init" +#define _FINI ".fini" +#define _LINES ".lines" +#define _BLOCKS ".blocks" +#define _SRI ".sri" /* Static Resource Information (systype, + et al.) */ +#define _MIR ".mir" /* Module Information Records */ +#define _APTV ".aptv" /* Apollo-style transfer vectors. */ +#define _INLIB ".inlib" /* Shared Library information */ +#define _RWDI ".rwdi" /* Read/write data initialization directives for + compressed sections */ +#define _UNWIND ".unwind" /* Stack unwind information */ + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +#ifdef M68K_COFF_OFFSET + char r_offset[4]; +#endif + +}; + +#define RELOC struct external_reloc + +#ifdef M68K_COFF_OFFSET +#define RELSZ 14 +#else +#define RELSZ 10 +#endif + +/* Apollo specific STYP flags */ + +#define STYP_RELOCATED_NOT_LOADED 0x00010000 /* Section is relocated normally during linking, but need + not be loaded during program execution */ +#define STYP_DEBUG 0x00020000 /* debug section */ +#define STYP_OVERLAY 0x00040000 /* Section is overlayed */ +#define STYP_INSTRUCTION 0x00200000 /* Section contains executable code */ + +#define STYP_ZERO 0x00800000 /* Section is initialized to zero */ +#define STYP_INSTALLED 0x02000000 /* Section should be installable in KGT */ +#define STYP_LOOK_INSTALLED 0x04000000 /* Look for section in KGT */ +#define STYP_SECALIGN1 0x08000000 /* Specially aligned section */ +#define STYP_SECALIGN2 0x10000000 /* " " " */ +#define STYP_COMPRESSED 0x20000000 /* No section data per se (s_scnptr = 0), but there are + initialization directives for it in .rwdi section + (used in conjunction with STYP_BSS) */ diff --git a/include/coff/arm.h b/include/coff/arm.h new file mode 100644 index 0000000..4beb121 --- /dev/null +++ b/include/coff/arm.h @@ -0,0 +1,130 @@ +/* ARM COFF support for BFD. + Copyright 1998, 1999, 2000, 2002, 2003, 2010, 2013 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#define COFFARM 1 + +#define L_LNNO_SIZE 2 +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#include "coff/external.h" + +/* Bits for f_flags: + F_RELFLG relocation info stripped from file + F_EXEC file is executable (no unresolved external references) + F_LNNO line numbers stripped from file + F_LSYMS local symbols stripped from file + F_INTERWORK file supports switching between ARM and Thumb instruction sets + F_INTERWORK_SET the F_INTERWORK bit is valid + F_APCS_FLOAT code passes float arguments in float registers + F_PIC code is reentrant/position-independent + F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) + F_APCS_26 file uses 26 bit ARM Procedure Calling Standard + F_APCS_SET the F_APCS_26, F_APCS_FLOAT and F_PIC bits have been initialised + F_SOFT_FLOAT code does not use floating point instructions. */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) +#define F_INTERWORK (0x0010) +#define F_INTERWORK_SET (0x0020) +#define F_APCS_FLOAT (0x0040) +#undef F_AR16WR +#define F_PIC (0x0080) +#define F_AR32WR (0x0100) +#define F_APCS_26 (0x0400) +#define F_APCS_SET (0x0800) +#define F_SOFT_FLOAT (0x2000) +#define F_VFP_FLOAT (0x4000) + +/* Bits stored in flags field of the internal_f structure */ + +#define F_INTERWORK (0x0010) +#define F_APCS_FLOAT (0x0040) +#define F_PIC (0x0080) +#define F_APCS26 (0x1000) +#define F_ARM_ARCHITECTURE_MASK (0x4000+0x0800+0x0400) +#define F_ARM_2 (0x0400) +#define F_ARM_2a (0x0800) +#define F_ARM_3 (0x0c00) +#define F_ARM_3M (0x4000) +#define F_ARM_4 (0x4400) +#define F_ARM_4T (0x4800) +#define F_ARM_5 (0x4c00) + +/* + ARMMAGIC ought to encoded the procesor type, + but it is too late to change it now, instead + the flags field of the internal_f structure + is used as shown above. + + XXX - NC 5/6/97. */ + +#define ARMMAGIC 0xa00 /* I just made this up */ + +#define ARMBADMAG(x) (((x).f_magic != ARMMAGIC)) + +#define ARMPEMAGIC 0x1c0 +#define THUMBPEMAGIC 0x1c2 +#define ARMV7PEMAGIC 0x1c4 + +#undef ARMBADMAG +#define ARMBADMAG(x) (((x).f_magic != ARMMAGIC) && ((x).f_magic != ARMPEMAGIC) && ((x).f_magic != THUMBPEMAGIC) && ((x).f_magic != ARMV7PEMAGIC)) + +#define OMAGIC 0404 /* object files, eg as output */ +#define ZMAGIC 0413 /* demand load format, eg normal ld output */ +#define STMAGIC 0401 /* target shlib */ +#define SHMAGIC 0443 /* host shlib */ + +/* define some NT default values */ +/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +/* We use the .rdata section to hold read only data. */ +#define _LIT ".rdata" + +/********************** RELOCATION DIRECTIVES **********************/ +#ifdef ARM_WINCE +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + +#else +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; + char r_offset[4]; +}; + +#define RELOC struct external_reloc +#define RELSZ 14 +#endif + +#define ARM_NOTE_SECTION ".note" diff --git a/include/coff/aux-coff.h b/include/coff/aux-coff.h new file mode 100644 index 0000000..de7979a --- /dev/null +++ b/include/coff/aux-coff.h @@ -0,0 +1,49 @@ +/* Modifications of internal.h and m68k.h needed by A/UX + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. + + Suggested by Ian Lance Taylor */ + +#ifndef GNU_COFF_AUX_H +#define GNU_COFF_AUX_H 1 + +#include "coff/internal.h" +#include "coff/m68k.h" + +/* Section contains 64-byte padded pathnames of shared libraries */ +#undef STYP_LIB +#define STYP_LIB 0x200 + +/* Section contains shared library initialization code */ +#undef STYP_INIT +#define STYP_INIT 0x400 + +/* Section contains .ident information */ +#undef STYP_IDENT +#define STYP_IDENT 0x800 + +/* Section types used by bfd and gas not defined (directly) by A/UX */ +#undef STYP_OVER +#define STYP_OVER 0 +#undef STYP_INFO +#define STYP_INFO STYP_IDENT + +/* Traditional name of the section tagged with STYP_LIB */ +#define _LIB ".lib" + +#endif /* GNU_COFF_AUX_H */ diff --git a/include/coff/ecoff.h b/include/coff/ecoff.h new file mode 100644 index 0000000..a7991a9 --- /dev/null +++ b/include/coff/ecoff.h @@ -0,0 +1,411 @@ +/* Generic ECOFF support. + This does not include symbol information, found in sym.h and + symconst.h. + + Copyright 2001, 2002, 2003, 2004, 2005, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef ECOFF_H +#define ECOFF_H + +/* Mips magic numbers used in filehdr. MIPS_MAGIC_LITTLE is used on + little endian machines. MIPS_MAGIC_BIG is used on big endian + machines. Where is MIPS_MAGIC_1 from? */ +#define MIPS_MAGIC_1 0x0180 +#define MIPS_MAGIC_LITTLE 0x0162 +#define MIPS_MAGIC_BIG 0x0160 + +/* These are the magic numbers used for MIPS code compiled at ISA + level 2. */ +#define MIPS_MAGIC_LITTLE2 0x0166 +#define MIPS_MAGIC_BIG2 0x0163 + +/* These are the magic numbers used for MIPS code compiled at ISA + level 3. */ +#define MIPS_MAGIC_LITTLE3 0x142 +#define MIPS_MAGIC_BIG3 0x140 + +/* Alpha magic numbers used in filehdr. */ +#define ALPHA_MAGIC 0x183 +#define ALPHA_MAGIC_BSD 0x185 +/* A compressed version of an ALPHA_MAGIC file created by DEC's tools. */ +#define ALPHA_MAGIC_COMPRESSED 0x188 + +/* Magic numbers used in a.out header. */ +#define ECOFF_AOUT_OMAGIC 0407 /* not demand paged (ld -N). */ +#define ECOFF_AOUT_ZMAGIC 0413 /* demand load format, eg normal ld output */ + +/* Names of special sections. */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _RDATA ".rdata" +#define _SDATA ".sdata" +#define _SBSS ".sbss" +#define _LITA ".lita" +#define _LIT4 ".lit4" +#define _LIT8 ".lit8" +#define _LIB ".lib" +#define _INIT ".init" +#define _FINI ".fini" +#define _PDATA ".pdata" +#define _XDATA ".xdata" +#define _GOT ".got" +#define _HASH ".hash" +#define _DYNSYM ".dynsym" +#define _DYNSTR ".dynstr" +#define _RELDYN ".rel.dyn" +#define _CONFLIC ".conflic" +#define _COMMENT ".comment" +#define _LIBLIST ".liblist" +#define _DYNAMIC ".dynamic" +#define _RCONST ".rconst" + +/* ECOFF uses some additional section flags. */ +#define STYP_RDATA 0x100 +#define STYP_SDATA 0x200 +#define STYP_SBSS 0x400 +#define STYP_GOT 0x1000 +#define STYP_DYNAMIC 0x2000 +#define STYP_DYNSYM 0x4000 +#define STYP_RELDYN 0x8000 +#define STYP_DYNSTR 0x10000 +#define STYP_HASH 0x20000 +#define STYP_LIBLIST 0x40000 +#define STYP_CONFLIC 0x100000 +#define STYP_ECOFF_FINI 0x1000000 +#define STYP_EXTENDESC 0x2000000 /* 0x02FFF000 bits => scn type, rest clr */ +#define STYP_LITA 0x4000000 +#define STYP_LIT8 0x8000000 +#define STYP_LIT4 0x10000000 +#define STYP_ECOFF_LIB 0x40000000 +#define STYP_ECOFF_INIT 0x80000000 +#define STYP_OTHER_LOAD (STYP_ECOFF_INIT | STYP_ECOFF_FINI) + +/* extended section types */ +#define STYP_COMMENT 0x2100000 +#define STYP_RCONST 0x2200000 +#define STYP_XDATA 0x2400000 +#define STYP_PDATA 0x2800000 + +/* The linker needs a section to hold small common variables while + linking. There is no convenient way to create it when the linker + needs it, so we always create one for each BFD. We then avoid + writing it out. */ +#define SCOMMON ".scommon" + +/* If the extern bit in a reloc is 1, then r_symndx is an index into + the external symbol table. If the extern bit is 0, then r_symndx + indicates a section, and is one of the following values. */ +#define RELOC_SECTION_NONE 0 +#define RELOC_SECTION_TEXT 1 +#define RELOC_SECTION_RDATA 2 +#define RELOC_SECTION_DATA 3 +#define RELOC_SECTION_SDATA 4 +#define RELOC_SECTION_SBSS 5 +#define RELOC_SECTION_BSS 6 +#define RELOC_SECTION_INIT 7 +#define RELOC_SECTION_LIT8 8 +#define RELOC_SECTION_LIT4 9 +#define RELOC_SECTION_XDATA 10 +#define RELOC_SECTION_PDATA 11 +#define RELOC_SECTION_FINI 12 +#define RELOC_SECTION_LITA 13 +#define RELOC_SECTION_ABS 14 +#define RELOC_SECTION_RCONST 15 + +#define NUM_RELOC_SECTIONS 16 + +/********************** STABS **********************/ + +/* gcc uses mips-tfile to output type information in special stabs + entries. These must match the corresponding definition in + gcc/config/mips.h. At some point, these should probably go into a + shared include file, but currently gcc and gdb do not share any + directories. */ +#define CODE_MASK 0x8F300 +#define ECOFF_IS_STAB(sym) (((sym)->index & 0xFFF00) == CODE_MASK) +#define ECOFF_MARK_STAB(code) ((code)+CODE_MASK) +#define ECOFF_UNMARK_STAB(code) ((code)-CODE_MASK) +#define STABS_SYMBOL "@stabs" + +/********************** COFF **********************/ + +/* gcc also uses mips-tfile to output COFF debugging information. + These are the values it uses when outputting the .type directive. + These should also be in a shared include file. */ +#define N_BTMASK (017) +#define N_TMASK (060) +#define N_BTSHFT (4) +#define N_TSHIFT (2) + +/********************** AUX **********************/ + +/* The auxiliary type information is the same on all known ECOFF + targets. I can't see any reason that it would ever change, so I am + going to gamble and define the external structures here, in the + target independent ECOFF header file. The internal forms are + defined in coff/sym.h, which was originally donated by MIPS + Computer Systems. */ + +/* Type information external record */ + +struct tir_ext { + unsigned char t_bits1[1]; + unsigned char t_tq45[1]; + unsigned char t_tq01[1]; + unsigned char t_tq23[1]; +}; + +#define TIR_BITS1_FBITFIELD_BIG ((unsigned int) 0x80) +#define TIR_BITS1_FBITFIELD_LITTLE ((unsigned int) 0x01) + +#define TIR_BITS1_CONTINUED_BIG ((unsigned int) 0x40) +#define TIR_BITS1_CONTINUED_LITTLE ((unsigned int) 0x02) + +#define TIR_BITS1_BT_BIG ((unsigned int) 0x3F) +#define TIR_BITS1_BT_SH_BIG 0 +#define TIR_BITS1_BT_LITTLE ((unsigned int) 0xFC) +#define TIR_BITS1_BT_SH_LITTLE 2 + +#define TIR_BITS_TQ4_BIG ((unsigned int) 0xF0) +#define TIR_BITS_TQ4_SH_BIG 4 +#define TIR_BITS_TQ5_BIG ((unsigned int) 0x0F) +#define TIR_BITS_TQ5_SH_BIG 0 +#define TIR_BITS_TQ4_LITTLE ((unsigned int) 0x0F) +#define TIR_BITS_TQ4_SH_LITTLE 0 +#define TIR_BITS_TQ5_LITTLE ((unsigned int) 0xF0) +#define TIR_BITS_TQ5_SH_LITTLE 4 + +#define TIR_BITS_TQ0_BIG ((unsigned int) 0xF0) +#define TIR_BITS_TQ0_SH_BIG 4 +#define TIR_BITS_TQ1_BIG ((unsigned int) 0x0F) +#define TIR_BITS_TQ1_SH_BIG 0 +#define TIR_BITS_TQ0_LITTLE ((unsigned int) 0x0F) +#define TIR_BITS_TQ0_SH_LITTLE 0 +#define TIR_BITS_TQ1_LITTLE ((unsigned int) 0xF0) +#define TIR_BITS_TQ1_SH_LITTLE 4 + +#define TIR_BITS_TQ2_BIG ((unsigned int) 0xF0) +#define TIR_BITS_TQ2_SH_BIG 4 +#define TIR_BITS_TQ3_BIG ((unsigned int) 0x0F) +#define TIR_BITS_TQ3_SH_BIG 0 +#define TIR_BITS_TQ2_LITTLE ((unsigned int) 0x0F) +#define TIR_BITS_TQ2_SH_LITTLE 0 +#define TIR_BITS_TQ3_LITTLE ((unsigned int) 0xF0) +#define TIR_BITS_TQ3_SH_LITTLE 4 + +/* Relative symbol external record */ + +struct rndx_ext { + unsigned char r_bits[4]; +}; + +#define RNDX_BITS0_RFD_SH_LEFT_BIG 4 +#define RNDX_BITS1_RFD_BIG ((unsigned int) 0xF0) +#define RNDX_BITS1_RFD_SH_BIG 4 + +#define RNDX_BITS0_RFD_SH_LEFT_LITTLE 0 +#define RNDX_BITS1_RFD_LITTLE ((unsigned int) 0x0F) +#define RNDX_BITS1_RFD_SH_LEFT_LITTLE 8 + +#define RNDX_BITS1_INDEX_BIG ((unsigned int) 0x0F) +#define RNDX_BITS1_INDEX_SH_LEFT_BIG 16 +#define RNDX_BITS2_INDEX_SH_LEFT_BIG 8 +#define RNDX_BITS3_INDEX_SH_LEFT_BIG 0 + +#define RNDX_BITS1_INDEX_LITTLE ((unsigned int) 0xF0) +#define RNDX_BITS1_INDEX_SH_LITTLE 4 +#define RNDX_BITS2_INDEX_SH_LEFT_LITTLE 4 +#define RNDX_BITS3_INDEX_SH_LEFT_LITTLE 12 + +/* Auxiliary symbol information external record */ + +union aux_ext { + struct tir_ext a_ti; + struct rndx_ext a_rndx; + unsigned char a_dnLow[4]; + unsigned char a_dnHigh[4]; + unsigned char a_isym[4]; + unsigned char a_iss[4]; + unsigned char a_width[4]; + unsigned char a_count[4]; +}; + +#define AUX_GET_ANY(bigend, ax, field) \ + ((bigend) ? bfd_getb32 ((ax)->field) : bfd_getl32 ((ax)->field)) + +#define AUX_GET_DNLOW(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_dnLow) +#define AUX_GET_DNHIGH(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_dnHigh) +#define AUX_GET_ISYM(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_isym) +#define AUX_GET_ISS(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_iss) +#define AUX_GET_WIDTH(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_width) +#define AUX_GET_COUNT(bigend, ax) AUX_GET_ANY ((bigend), (ax), a_count) + +#define AUX_PUT_ANY(bigend, val, ax, field) \ + ((bigend) \ + ? (bfd_putb32 ((bfd_vma) (val), (ax)->field), 0) \ + : (bfd_putl32 ((bfd_vma) (val), (ax)->field), 0)) + +#define AUX_PUT_DNLOW(bigend, val, ax) \ + AUX_PUT_ANY ((bigend), (val), (ax), a_dnLow) +#define AUX_PUT_DNHIGH(bigend, val, ax) \ + AUX_PUT_ANY ((bigend), (val), (ax), a_dnHigh) +#define AUX_PUT_ISYM(bigend, val, ax) \ + AUX_PUT_ANY ((bigend), (val), (ax), a_isym) +#define AUX_PUT_ISS(bigend, val, ax) \ + AUX_PUT_ANY ((bigend), (val), (ax), a_iss) +#define AUX_PUT_WIDTH(bigend, val, ax) \ + AUX_PUT_ANY ((bigend), (val), (ax), a_width) +#define AUX_PUT_COUNT(bigend, val, ax) \ + AUX_PUT_ANY ((bigend), (val), (ax), a_count) + +/********************** SYMBOLS **********************/ + +/* For efficiency, gdb deals directly with the unswapped symbolic + information (that way it only takes the time to swap information + that it really needs to read). gdb originally retrieved the + information directly from the BFD backend information, but that + strategy, besides being sort of ugly, does not work for MIPS ELF, + which also uses ECOFF debugging information. This structure holds + pointers to the (mostly) unswapped symbolic information. */ + +struct ecoff_debug_info +{ + /* The swapped ECOFF symbolic header. */ + HDRR symbolic_header; + + /* Pointers to the unswapped symbolic information. Note that the + pointers to external structures point to different sorts of + information on different ECOFF targets. The ecoff_debug_swap + structure provides the sizes of the structures and the functions + needed to swap the information in and out. These pointers are + all pointers to arrays, not single structures. They will be NULL + if there are no instances of the relevant structure. These + fields are also used by the assembler to output ECOFF debugging + information. */ + unsigned char *line; + void *external_dnr; /* struct dnr_ext */ + void *external_pdr; /* struct pdr_ext */ + void *external_sym; /* struct sym_ext */ + void *external_opt; /* struct opt_ext */ + union aux_ext *external_aux; + char *ss; + char *ssext; + void *external_fdr; /* struct fdr_ext */ + void *external_rfd; /* struct rfd_ext */ + void *external_ext; /* struct ext_ext */ + + /* These fields are used when linking. They may disappear at some + point. */ + char *ssext_end; + void *external_ext_end; + + /* When linking, this field holds a mapping from the input FDR + numbers to the output numbers, and is used when writing out the + external symbols. It is NULL if no mapping is required. */ + RFDT *ifdmap; + + /* The swapped FDR information. Currently this is never NULL, but + code using this structure should probably double-check in case + this changes in the future. This is a pointer to an array, not a + single structure. */ + FDR *fdr; +}; + +/* These structures are used by the ECOFF find_nearest_line function. */ + +struct ecoff_fdrtab_entry +{ + /* Base address in .text of this FDR. */ + bfd_vma base_addr; + FDR *fdr; +}; + +struct ecoff_find_line +{ + /* Allocated memory to hold function and file names. */ + char *find_buffer; + + /* FDR table, sorted by address: */ + long fdrtab_len; + struct ecoff_fdrtab_entry *fdrtab; + + /* Cache entry for most recently found line information. The sect + field is NULL if this cache does not contain valid information. */ + struct + { + asection *sect; + bfd_vma start; + bfd_vma stop; + const char *filename; + const char *functionname; + unsigned int line_num; + } cache; +}; + +/********************** SWAPPING **********************/ + +/* The generic ECOFF code needs to be able to swap debugging + information in and out in the specific format used by a particular + ECOFF implementation. This structure provides the information + needed to do this. */ + +struct ecoff_debug_swap +{ + /* Symbol table magic number. */ + int sym_magic; + /* Alignment of debugging information. E.g., 4. */ + bfd_size_type debug_align; + /* Sizes of external symbolic information. */ + bfd_size_type external_hdr_size; + bfd_size_type external_dnr_size; + bfd_size_type external_pdr_size; + bfd_size_type external_sym_size; + bfd_size_type external_opt_size; + bfd_size_type external_fdr_size; + bfd_size_type external_rfd_size; + bfd_size_type external_ext_size; + /* Functions to swap in external symbolic data. */ + void (*swap_hdr_in) (bfd *, void *, HDRR *); + void (*swap_dnr_in) (bfd *, void *, DNR *); + void (*swap_pdr_in) (bfd *, void *, PDR *); + void (*swap_sym_in) (bfd *, void *, SYMR *); + void (*swap_opt_in) (bfd *, void *, OPTR *); + void (*swap_fdr_in) (bfd *, void *, FDR *); + void (*swap_rfd_in) (bfd *, void *, RFDT *); + void (*swap_ext_in) (bfd *, void *, EXTR *); + void (*swap_tir_in) (int, const struct tir_ext *, TIR *); + void (*swap_rndx_in) (int, const struct rndx_ext *, RNDXR *); + /* Functions to swap out external symbolic data. */ + void (*swap_hdr_out) (bfd *, const HDRR *, void *); + void (*swap_dnr_out) (bfd *, const DNR *, void *); + void (*swap_pdr_out) (bfd *, const PDR *, void *); + void (*swap_sym_out) (bfd *, const SYMR *, void *); + void (*swap_opt_out) (bfd *, const OPTR *, void *); + void (*swap_fdr_out) (bfd *, const FDR *, void *); + void (*swap_rfd_out) (bfd *, const RFDT *, void *); + void (*swap_ext_out) (bfd *, const EXTR *, void *); + void (*swap_tir_out) (int, const TIR *, struct tir_ext *); + void (*swap_rndx_out) (int, const RNDXR *, struct rndx_ext *); + /* Function to read symbol data and set up pointers in + ecoff_debug_info structure. The section argument is used for + ELF, not straight ECOFF. */ + bfd_boolean (*read_debug_info) (bfd *, asection *, struct ecoff_debug_info *); +}; + +#endif /* ! defined (ECOFF_H) */ diff --git a/include/coff/external.h b/include/coff/external.h new file mode 100644 index 0000000..4bf594d --- /dev/null +++ b/include/coff/external.h @@ -0,0 +1,269 @@ +/* external.h -- External COFF structures + + Copyright 2001, 2006, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef COFF_EXTERNAL_H +#define COFF_EXTERNAL_H + +#ifndef DO_NOT_DEFINE_FILHDR +/********************** FILE HEADER **********************/ + +struct external_filehdr + { + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ + }; + +#define FILHDR struct external_filehdr +#define FILHSZ 20 +#endif + +#ifndef DO_NOT_DEFINE_AOUTHDR +/********************** AOUT "OPTIONAL HEADER" **********************/ + +typedef struct external_aouthdr + { + char magic[2]; /* type of file */ + char vstamp[2]; /* version stamp */ + char tsize[4]; /* text size in bytes, padded to FW bdry*/ + char dsize[4]; /* initialized data " " */ + char bsize[4]; /* uninitialized data " " */ + char entry[4]; /* entry pt. */ + char text_start[4]; /* base of text used for this file */ + char data_start[4]; /* base of data used for this file */ + } ATTRIBUTE_PACKED +AOUTHDR; + +#define AOUTHDRSZ 28 +#define AOUTSZ 28 + +typedef struct external_aouthdr64 +{ + char magic[2]; /* Type of file. */ + char vstamp[2]; /* Version stamp. */ + char tsize[4]; /* Text size in bytes, padded to FW bdry*/ + char dsize[4]; /* Initialized data " ". */ + char bsize[4]; /* Uninitialized data " ". */ + char entry[4]; /* Entry pt. */ + char text_start[4]; /* Base of text used for this file. */ +} +AOUTHDR64; +#define AOUTHDRSZ64 24 + +#endif /* not DO_NOT_DEFINE_AOUTHDR */ + +#ifndef DO_NOT_DEFINE_SCNHDR +/********************** SECTION HEADER **********************/ + +struct external_scnhdr + { + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[2]; /* number of relocation entries */ + char s_nlnno[2]; /* number of line number entries */ + char s_flags[4]; /* flags */ + }; + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 40 + +/* Names of "special" sections. */ + +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _COMMENT ".comment" +#define _LIB ".lib" +#endif /* not DO_NOT_DEFINE_SCNHDR */ + +#ifndef DO_NOT_DEFINE_LINENO + +/********************** LINE NUMBERS **********************/ + +#ifndef L_LNNO_SIZE +#error L_LNNO_SIZE needs to be defined +#endif + +/* 1 line number entry for every "breakpointable" source line in a section. + Line numbers are grouped on a per function basis; first entry in a function + grouping will have l_lnno = 0 and in place of physical address will be the + symbol table index of the function name. */ +struct external_lineno +{ + union + { + char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ + char l_paddr[4]; /* (physical) address of line number */ + } l_addr; + + char l_lnno[L_LNNO_SIZE]; /* line number */ +}; + +#define LINENO struct external_lineno +#define LINESZ (4 + L_LNNO_SIZE) + +#if L_LNNO_SIZE == 4 +#define GET_LINENO_LNNO(abfd, ext) H_GET_32 (abfd, (ext->l_lnno)) +#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_32 (abfd, val, (ext->l_lnno)) +#endif +#if L_LNNO_SIZE == 2 +#define GET_LINENO_LNNO(abfd, ext) H_GET_16 (abfd, (ext->l_lnno)) +#define PUT_LINENO_LNNO(abfd, val, ext) H_PUT_16 (abfd, val, (ext->l_lnno)) +#endif + +#endif /* not DO_NOT_DEFINE_LINENO */ + +#ifndef DO_NOT_DEFINE_SYMENT +/********************** SYMBOLS **********************/ + +#define E_SYMNMLEN 8 /* # characters in a symbol name */ +#ifndef E_FILNMLEN +#define E_FILNMLEN 14 +#endif +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + union + { + char e_name[E_SYMNMLEN]; + + struct + { + char e_zeroes[4]; + char e_offset[4]; + } e; + } e; + + char e_value[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; +} ATTRIBUTE_PACKED ; + +#define SYMENT struct external_syment +#define SYMESZ 18 + +#ifndef N_BTMASK +#define N_BTMASK 0xf +#endif + +#ifndef N_TMASK +#define N_TMASK 0x30 +#endif + +#ifndef N_BTSHFT +#define N_BTSHFT 4 +#endif + +#ifndef N_TSHIFT +#define N_TSHIFT 2 +#endif + +#endif /* not DO_NOT_DEFINE_SYMENT */ + +#ifndef DO_NOT_DEFINE_AUXENT + +union external_auxent +{ + struct + { + char x_tagndx[4]; /* str, un, or enum tag indx */ + + union + { + struct + { + char x_lnno[2]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } x_lnsz; + + char x_fsize[4]; /* size of function */ + + } x_misc; + + union + { + struct /* if ISFCN, tag, or .bb */ + { + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + + struct /* if ISARY, up to 4 dimen. */ + { + char x_dimen[E_DIMNUM][2]; + } x_ary; + + } x_fcnary; + + char x_tvndx[2]; /* tv index */ + + } x_sym; + + union + { + char x_fname[E_FILNMLEN]; + + struct + { + char x_zeroes[4]; + char x_offset[4]; + } x_n; + + } x_file; + + struct + { + char x_scnlen[4]; /* section length */ + char x_nreloc[2]; /* # relocation entries */ + char x_nlinno[2]; /* # line numbers */ +#ifdef INCLUDE_COMDAT_FIELDS_IN_AUXENT + char x_checksum[4]; /* section COMDAT checksum */ + char x_associated[2]; /* COMDAT associated section index */ + char x_comdat[1]; /* COMDAT selection number */ +#endif + } x_scn; + + struct + { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ +} ATTRIBUTE_PACKED ; + +#define AUXENT union external_auxent +#define AUXESZ 18 + +#define _ETEXT "etext" + +#endif /* not DO_NOT_DEFINE_AUXENT */ + +#endif /* COFF_EXTERNAL_H */ diff --git a/include/coff/go32exe.h b/include/coff/go32exe.h new file mode 100644 index 0000000..a2ca6cd --- /dev/null +++ b/include/coff/go32exe.h @@ -0,0 +1,36 @@ +/* COFF information for PC running go32. + + Copyright 2001, 2005, 2009, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +struct external_filehdr_go32_exe + { + char stub[GO32_STUBSIZE]; /* the stub to load the image */ + /* the standard COFF header */ + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ + }; + +#undef FILHDR +#define FILHDR struct external_filehdr_go32_exe +#undef FILHSZ +#define FILHSZ GO32_STUBSIZE+20 diff --git a/include/coff/h8300.h b/include/coff/h8300.h new file mode 100644 index 0000000..4de6602 --- /dev/null +++ b/include/coff/h8300.h @@ -0,0 +1,55 @@ +/* coff information for Renesas H8/300 and H8/300-H + + Copyright 2001, 2003, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +#define H8300MAGIC 0x8300 +#define H8300HMAGIC 0x8301 +#define H8300SMAGIC 0x8302 +#define H8300HNMAGIC 0x8303 +#define H8300SNMAGIC 0x8304 + +#define H8300BADMAG(x) (((x).f_magic != H8300MAGIC)) +#define H8300HBADMAG(x) (((x).f_magic != H8300HMAGIC)) +#define H8300SBADMAG(x) (((x).f_magic != H8300SMAGIC)) +#define H8300HNBADMAG(x) (((x).f_magic != H8300HNMAGIC)) +#define H8300SNBADMAG(x) (((x).f_magic != H8300SNMAGIC)) + +/* Relocation directives. */ + +/* The external reloc has an offset field, because some of the reloc + types on the h8 don't have room in the instruction for the entire + offset - eg the strange jump and high page addressing modes. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + + + + diff --git a/include/coff/h8500.h b/include/coff/h8500.h new file mode 100644 index 0000000..56097f8 --- /dev/null +++ b/include/coff/h8500.h @@ -0,0 +1,47 @@ +/* coff information for Renesas H8/500 + + Copyright 2001, 2003, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +#define H8500MAGIC 0x8500 + +#define H8500BADMAG(x) ((0xffff && ((x).f_magic) != H8500MAGIC)) + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the h8 don't have room in the instruction for the entire + offset - eg the strange jump and high page addressing modes. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + + + + diff --git a/include/coff/i386.h b/include/coff/i386.h new file mode 100644 index 0000000..61e723a --- /dev/null +++ b/include/coff/i386.h @@ -0,0 +1,74 @@ +/* coff information for Intel 386/486. + + Copyright 2001, 2009, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 2 +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#include "coff/external.h" + +#define COFF_PAGE_SIZE 0x1000 + +/* Bits for f_flags: + F_RELFLG Relocation info stripped from file + F_EXEC File is executable (no unresolved external references) + F_LNNO Line numbers stripped from file + F_LSYMS Local symbols stripped from file + F_AR32WR File has byte ordering of an AR32WR machine (e.g. vax). */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) + +#define I386MAGIC 0x14c +#define I386PTXMAGIC 0x154 +#define I386AIXMAGIC 0x175 + +/* This is Lynx's all-platform magic number for executables. */ + +#define LYNXCOFFMAGIC 0415 + +#define I386BADMAG(x) ( ((x).f_magic != I386MAGIC) \ + && (x).f_magic != I386AIXMAGIC \ + && (x).f_magic != I386PTXMAGIC \ + && (x).f_magic != LYNXCOFFMAGIC) + +#define OMAGIC 0404 /* Object files, eg as output. */ +#define ZMAGIC 0413 /* Demand load format, eg normal ld output. */ +#define STMAGIC 0401 /* Target shlib. */ +#define SHMAGIC 0443 /* Host shlib. */ + +/* Define some NT default values. */ +/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +/* Relocation directives. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + diff --git a/include/coff/i860.h b/include/coff/i860.h new file mode 100644 index 0000000..0767de4 --- /dev/null +++ b/include/coff/i860.h @@ -0,0 +1,87 @@ +/* COFF information for the Intel i860. + + Copyright 2001, 2003, 2010, 2011 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file was hacked from i386.h [dolan@ssd.intel.com] */ + +#define L_LNNO_SIZE 2 +#include "coff/external.h" + +/* Bits for f_flags: + F_RELFLG relocation info stripped from file + F_EXEC file is executable (no unresolved external references) + F_LNNO line numbers stripped from file + F_LSYMS local symbols stripped from file + F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax). */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) + +#define I860MAGIC 0x14d + +#define I860BADMAG(x) ((x).f_magic != I860MAGIC) + +#undef AOUTSZ +#define AOUTSZ 36 + +/* FIXME: What are the a.out magic numbers? */ + +#define _ETEXT "etext" + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + +/* The relocation directory entry types. + PAIR : The low half that follows relates to the preceding HIGH[ADJ]. + HIGH : The high half of a 32-bit constant. + LOWn : The low half, insn bits 15..(n-1), 2^n-byte aligned. + SPLITn : The low half, insn bits 20..16 and 10..(n-1), 2^n-byte aligned. + HIGHADJ: Similar to HIGH, but with adjustment. + BRADDR : 26-bit branch displacement. + + Note: The Intel assembler manual lists LOW4 as one of the + relocation types, but it appears to be useless for the i860. + We will recognize it anyway, just in case it actually appears in + any object files. */ + +enum { + COFF860_R_PAIR = 0x1c, + COFF860_R_HIGH = 0x1e, + COFF860_R_LOW0 = 0x1f, + COFF860_R_LOW1 = 0x20, + COFF860_R_LOW2 = 0x21, + COFF860_R_LOW3 = 0x22, + COFF860_R_LOW4 = 0x23, + COFF860_R_SPLIT0 = 0x24, + COFF860_R_SPLIT1 = 0x25, + COFF860_R_SPLIT2 = 0x26, + COFF860_R_HIGHADJ = 0x27, + COFF860_R_BRADDR = 0x28 +}; + diff --git a/include/coff/i960.h b/include/coff/i960.h new file mode 100644 index 0000000..2bf42ad --- /dev/null +++ b/include/coff/i960.h @@ -0,0 +1,320 @@ +/* coff information for 80960. Origins: Intel corp, natch. + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* NOTE: Tagentries (cf TAGBITS) are no longer used by the 960 */ + +/********************** FILE HEADER **********************/ + +struct external_filehdr +{ + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ +}; + +#define OMAGIC (0407) /* old impure format. data immediately + follows text. both sections are rw. */ +#define NMAGIC (0410) /* split i&d, read-only text */ + +/* +* Intel 80960 (I960) processor flags. +* F_I960TYPE == mask for processor type field. +*/ + +#define F_I960TYPE (0xf000) +#define F_I960CORE (0x1000) +#define F_I960KB (0x2000) +#define F_I960SB (0x2000) +#define F_I960MC (0x3000) +#define F_I960XA (0x4000) +#define F_I960CA (0x5000) +#define F_I960KA (0x6000) +#define F_I960SA (0x6000) +#define F_I960JX (0x7000) +#define F_I960HX (0x8000) + + +/** i80960 Magic Numbers +*/ + +#define I960ROMAGIC (0x160) /* read-only text segments */ +#define I960RWMAGIC (0x161) /* read-write text segments */ + +#define I960BADMAG(x) (((x).f_magic!=I960ROMAGIC) && ((x).f_magic!=I960RWMAGIC)) + +#define FILHDR struct external_filehdr +#define FILHSZ 20 + +/********************** AOUT "OPTIONAL HEADER" **********************/ + +typedef struct +{ + unsigned long phys_addr; + unsigned long bitarray; +} TAGBITS; + +typedef struct +{ + char magic[2]; /* type of file */ + char vstamp[2]; /* version stamp */ + char tsize[4]; /* text size in bytes, padded to FW bdry*/ + char dsize[4]; /* initialized data " " */ + char bsize[4]; /* uninitialized data " " */ + char entry[4]; /* entry pt. */ + char text_start[4]; /* base of text used for this file */ + char data_start[4]; /* base of data used for this file */ + char tagentries[4]; /* number of tag entries to follow */ +} +AOUTHDR; + +/* return a pointer to the tag bits array */ + +#define TAGPTR(aout) ((TAGBITS *) (&(aout.tagentries)+1)) + +/* compute size of a header */ + +/*#define AOUTSZ(aout) (sizeof(AOUTHDR)+(aout.tagentries*sizeof(TAGBITS)))*/ +#define AOUTSZ 32 +#define AOUTHDRSZ 32 + + +/********************** SECTION HEADER **********************/ + +struct external_scnhdr +{ + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[2]; /* number of relocation entries */ + char s_nlnno[2]; /* number of line number entries*/ + char s_flags[4]; /* flags */ + char s_align[4]; /* section alignment */ +}; + + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 44 + +/* + * names of "special" sections + */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" + +/********************** LINE NUMBERS **********************/ + +/* 1 line number entry for every "breakpointable" source line in a section. + * Line numbers are grouped on a per function basis; first entry in a function + * grouping will have l_lnno = 0 and in place of physical address will be the + * symbol table index of the function name. + */ +struct external_lineno +{ + union + { + char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ + char l_paddr[4]; /* (physical) address of line number */ + } l_addr; + + char l_lnno[2]; /* line number */ + char padding[2]; /* force alignment */ +}; + + +#define LINENO struct external_lineno +#define LINESZ 8 + +/********************** SYMBOLS **********************/ + +#define E_SYMNMLEN 8 /* # characters in a symbol name */ +#define E_FILNMLEN 14 /* # characters in a file name */ +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + union + { + char e_name[E_SYMNMLEN]; + + struct + { + char e_zeroes[4]; + char e_offset[4]; + } e; + } e; + + char e_value[4]; + char e_scnum[2]; + char e_flags[2]; + char e_type[4]; + char e_sclass[1]; + char e_numaux[1]; + char pad2[2]; +}; + +#define N_BTMASK (0x1f) +#define N_TMASK (0x60) +#define N_BTSHFT (5) +#define N_TSHIFT (2) + +union external_auxent +{ + struct + { + char x_tagndx[4]; /* str, un, or enum tag indx */ + + union + { + struct + { + char x_lnno[2]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } x_lnsz; + + char x_fsize[4]; /* size of function */ + + } x_misc; + + union + { + struct /* if ISFCN, tag, or .bb */ + { + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + + struct /* if ISARY, up to 4 dimen. */ + { + char x_dimen[E_DIMNUM][2]; + } x_ary; + + } x_fcnary; + + char x_tvndx[2]; /* tv index */ + + } x_sym; + + union + { + char x_fname[E_FILNMLEN]; + + struct + { + char x_zeroes[4]; + char x_offset[4]; + } x_n; + + } x_file; + + struct + { + char x_scnlen[4]; /* section length */ + char x_nreloc[2]; /* # relocation entries */ + char x_nlinno[2]; /* # line numbers */ + + } x_scn; + + struct + { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + + } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ + + /****************************************** + * I960-specific *2nd* aux. entry formats + ******************************************/ + struct + { + /* This is a very old typo that keeps getting propagated. */ +#define x_stdindx x_stindx + char x_stindx[4]; /* sys. table entry */ + } x_sc; /* system call entry */ + + struct + { + char x_balntry[4]; /* BAL entry point */ + } x_bal; /* BAL-callable function */ + + struct + { + char x_timestamp[4]; /* time stamp */ + char x_idstring[20]; /* producer identity string */ + + } x_ident; /* Producer ident info */ +}; + +#define SYMENT struct external_syment +#define SYMESZ 24 +#define AUXENT union external_auxent +#define AUXESZ 24 + +# define _ETEXT "_etext" + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; + char pad[2]; +}; + +/* r_type values for the i960. */ + +/* The i960 uses R_RELLONG, which is defined in internal.h as 0x11. + It is an absolute 32 bit relocation. */ + +#define R_IPRMED (0x19) /* 24-bit ip-relative relocation */ +#define R_OPTCALL (0x1b) /* 32-bit optimizable call (leafproc/sysproc) */ +#define R_OPTCALLX (0x1c) /* 64-bit optimizable call (leafproc/sysproc) */ + +/* The following relocation types are defined use by relaxing linkers, + which convert 32 bit calls (which require a 64 bit instruction) + into 24 bit calls (which require a 32 bit instruction) when + possible. It will be possible whenever the target of the call is + within a 24 bit range of the call instruction. + + It is always safe to ignore these relocations. They only serve to + mark points which the relaxing linker will have to consider. The + assembler must ensure that the correct code is generated even if + the relocations are ignored. In particular, this means that the + R_IPR13 relocation may not appear with an external symbol. */ + +#define R_IPR13 (0x1d) /* 13 bit ip-relative branch */ +#define R_ALIGN (0x1e) /* alignment marker. This has no + associated symbol. Instead, the + r_symndx field indicates the + require alignment at this point in + the file. It must be a power of 2. */ + +#define RELOC struct external_reloc +#define RELSZ 12 + diff --git a/include/coff/ia64.h b/include/coff/ia64.h new file mode 100644 index 0000000..2ee6268 --- /dev/null +++ b/include/coff/ia64.h @@ -0,0 +1,89 @@ +/* coff information for HP/Intel IA-64. + + Copyright 2000, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define DO_NOT_DEFINE_AOUTHDR +#define L_LNNO_SIZE 2 +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#include "coff/external.h" + +#define IA64MAGIC 0x200 + +#define IA64BADMAG(x) (((x).f_magic != IA64MAGIC)) + +/* Bits for f_flags: + * F_RELFLG relocation info stripped from file + * F_EXEC file is executable (no unresolved external references) + * F_LNNO line numbers stripped from file + * F_LSYMS local symbols stripped from file + * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax) + */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) + +/********************** AOUT "OPTIONAL HEADER" **********************/ +typedef struct +{ + char magic[2]; /* type of file */ + char vstamp[2]; /* version stamp */ + char tsize[4]; /* text size in bytes, padded to FW bdry*/ + char dsize[4]; /* initialized data " " */ + char bsize[4]; /* uninitialized data " " */ + char entry[4]; /* entry pt. */ + char text_start[4]; /* base of text used for this file */ +#ifndef BFD64 + char data_start[4]; /* base of data used for this file */ +#endif +} +AOUTHDR; + +#define PE32MAGIC 0x10b /* 32-bit image */ +#define PE32PMAGIC 0x20b /* 32-bit image inside 64-bit address space */ + +#define PE32PBADMAG(x) (((x).f_magic != PE32PMAGIC)) + +#define AOUTSZ 108 +#define AOUTHDRSZ 108 + +#define OMAGIC 0404 /* object files, eg as output */ +#define ZMAGIC 0413 /* demand load format, eg normal ld output */ +#define STMAGIC 0401 /* target shlib */ +#define SHMAGIC 0443 /* host shlib */ + +/* define some NT default values */ +/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + diff --git a/include/coff/internal.h b/include/coff/internal.h new file mode 100644 index 0000000..8b84324 --- /dev/null +++ b/include/coff/internal.h @@ -0,0 +1,830 @@ +/* Internal format of COFF object file data structures, for GNU BFD. + This file is part of BFD, the Binary File Descriptor library. + + Copyright 1999, 2000, 2001, 2002, 2003, 2004. 2005, 2006, 2007, 2009, + 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef GNU_COFF_INTERNAL_H +#define GNU_COFF_INTERNAL_H 1 + +/* First, make "signed char" work, even on old compilers. */ +#ifndef signed +#ifndef __STDC__ +#define signed /**/ +#endif +#endif + +/********************** FILE HEADER **********************/ + +/* extra stuff in a PE header. */ + +struct internal_extra_pe_filehdr +{ + /* DOS header data follows for PE stuff */ + unsigned short e_magic; /* Magic number, 0x5a4d */ + unsigned short e_cblp; /* Bytes on last page of file, 0x90 */ + unsigned short e_cp; /* Pages in file, 0x3 */ + unsigned short e_crlc; /* Relocations, 0x0 */ + unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */ + unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */ + unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */ + unsigned short e_ss; /* Initial (relative) SS value, 0x0 */ + unsigned short e_sp; /* Initial SP value, 0xb8 */ + unsigned short e_csum; /* Checksum, 0x0 */ + unsigned short e_ip; /* Initial IP value, 0x0 */ + unsigned short e_cs; /* Initial (relative) CS value, 0x0 */ + unsigned short e_lfarlc; /* File address of relocation table, 0x40 */ + unsigned short e_ovno; /* Overlay number, 0x0 */ + unsigned short e_res[4]; /* Reserved words, all 0x0 */ + unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */ + unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */ + unsigned short e_res2[10]; /* Reserved words, all 0x0 */ + bfd_vma e_lfanew; /* File address of new exe header, 0x80 */ + unsigned long dos_message[16]; /* text which always follows dos header */ + bfd_vma nt_signature; /* required NT signature, 0x4550 */ +}; + +#define GO32_STUBSIZE 2048 + +struct internal_filehdr +{ + struct internal_extra_pe_filehdr pe; + + /* coff-stgo32 EXE stub header before BFD tdata has been allocated. + Its data is kept in INTERNAL_FILEHDR.GO32STUB afterwards. + + F_GO32STUB is set iff go32stub contains a valid data. Artifical headers + created in BFD have no pre-set go32stub. */ + char go32stub[GO32_STUBSIZE]; + + /* Standard coff internal info. */ + unsigned short f_magic; /* magic number */ + unsigned short f_nscns; /* number of sections */ + long f_timdat; /* time & date stamp */ + bfd_vma f_symptr; /* file pointer to symtab */ + long f_nsyms; /* number of symtab entries */ + unsigned short f_opthdr; /* sizeof(optional hdr) */ + unsigned short f_flags; /* flags */ + unsigned short f_target_id; /* (TI COFF specific) */ +}; + + +/* Bits for f_flags: + F_RELFLG relocation info stripped from file + F_EXEC file is executable (no unresolved external references) + F_LNNO line numbers stripped from file + F_LSYMS local symbols stripped from file + F_AR16WR file is 16-bit little-endian + F_AR32WR file is 32-bit little-endian + F_AR32W file is 32-bit big-endian + F_DYNLOAD rs/6000 aix: dynamically loadable w/imports & exports + F_SHROBJ rs/6000 aix: file is a shared object + F_DLL PE format DLL + F_GO32STUB Field go32stub contains valid data. */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) +#define F_AR16WR (0x0080) +#define F_AR32WR (0x0100) +#define F_AR32W (0x0200) +#define F_DYNLOAD (0x1000) +#define F_SHROBJ (0x2000) +#define F_DLL (0x2000) +#define F_GO32STUB (0x4000) + +/* Extra structure which is used in the optional header. */ +typedef struct _IMAGE_DATA_DIRECTORY +{ + bfd_vma VirtualAddress; + long Size; +} IMAGE_DATA_DIRECTORY; +#define PE_EXPORT_TABLE 0 +#define PE_IMPORT_TABLE 1 +#define PE_RESOURCE_TABLE 2 +#define PE_EXCEPTION_TABLE 3 +#define PE_CERTIFICATE_TABLE 4 +#define PE_BASE_RELOCATION_TABLE 5 +#define PE_DEBUG_DATA 6 +#define PE_ARCHITECTURE 7 +#define PE_GLOBAL_PTR 8 +#define PE_TLS_TABLE 9 +#define PE_LOAD_CONFIG_TABLE 10 +#define PE_BOUND_IMPORT_TABLE 11 +#define PE_IMPORT_ADDRESS_TABLE 12 +#define PE_DELAY_IMPORT_DESCRIPTOR 13 +#define PE_CLR_RUNTIME_HEADER 14 +/* DataDirectory[15] is currently reserved, so no define. */ +#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 + +/* Default image base for NT. */ +#define NT_EXE_IMAGE_BASE 0x400000 +#define NT_DLL_IMAGE_BASE 0x10000000 + +/* Default image base for BeOS. */ +#define BEOS_EXE_IMAGE_BASE 0x80000000 +#define BEOS_DLL_IMAGE_BASE 0x10000000 + +/* Extra stuff in a PE aouthdr */ + +#define PE_DEF_SECTION_ALIGNMENT 0x1000 +#ifndef PE_DEF_FILE_ALIGNMENT +# define PE_DEF_FILE_ALIGNMENT 0x200 +#endif + +struct internal_extra_pe_aouthdr +{ + /* FIXME: The following entries are in AOUTHDR. But they aren't + available internally in bfd. We add them here so that objdump + can dump them. */ + /* The state of the image file */ + short Magic; + /* Linker major version number */ + char MajorLinkerVersion; + /* Linker minor version number */ + char MinorLinkerVersion; + /* Total size of all code sections */ + long SizeOfCode; + /* Total size of all initialized data sections */ + long SizeOfInitializedData; + /* Total size of all uninitialized data sections */ + long SizeOfUninitializedData; + /* Address of entry point relative to image base. */ + bfd_vma AddressOfEntryPoint; + /* Address of the first code section relative to image base. */ + bfd_vma BaseOfCode; + /* Address of the first data section relative to image base. */ + bfd_vma BaseOfData; + + /* PE stuff */ + bfd_vma ImageBase; /* address of specific location in memory that + file is located, NT default 0x10000 */ + + bfd_vma SectionAlignment; /* section alignment default 0x1000 */ + bfd_vma FileAlignment; /* file alignment default 0x200 */ + short MajorOperatingSystemVersion; /* minimum version of the operating */ + short MinorOperatingSystemVersion; /* system req'd for exe, default to 1*/ + short MajorImageVersion; /* user defineable field to store version of */ + short MinorImageVersion; /* exe or dll being created, default to 0 */ + short MajorSubsystemVersion; /* minimum subsystem version required to */ + short MinorSubsystemVersion; /* run exe; default to 3.1 */ + long Reserved1; /* seems to be 0 */ + long SizeOfImage; /* size of memory to allocate for prog */ + long SizeOfHeaders; /* size of PE header and section table */ + long CheckSum; /* set to 0 */ + short Subsystem; + + /* type of subsystem exe uses for user interface, + possible values: + 1 - NATIVE Doesn't require a subsystem + 2 - WINDOWS_GUI runs in Windows GUI subsystem + 3 - WINDOWS_CUI runs in Windows char sub. (console app) + 5 - OS2_CUI runs in OS/2 character subsystem + 7 - POSIX_CUI runs in Posix character subsystem */ + unsigned short DllCharacteristics; /* flags for DLL init */ + bfd_vma SizeOfStackReserve; /* amount of memory to reserve */ + bfd_vma SizeOfStackCommit; /* amount of memory initially committed for + initial thread's stack, default is 0x1000 */ + bfd_vma SizeOfHeapReserve; /* amount of virtual memory to reserve and */ + bfd_vma SizeOfHeapCommit; /* commit, don't know what to defaut it to */ + long LoaderFlags; /* can probably set to 0 */ + long NumberOfRvaAndSizes; /* number of entries in next entry, 16 */ + IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; +}; + +/********************** AOUT "OPTIONAL HEADER" **********************/ +struct internal_aouthdr +{ + short magic; /* type of file */ + short vstamp; /* version stamp */ + bfd_vma tsize; /* text size in bytes, padded to FW bdry*/ + bfd_vma dsize; /* initialized data " " */ + bfd_vma bsize; /* uninitialized data " " */ + bfd_vma entry; /* entry pt. */ + bfd_vma text_start; /* base of text used for this file */ + bfd_vma data_start; /* base of data used for this file */ + + /* i960 stuff */ + unsigned long tagentries; /* number of tag entries to follow */ + + /* RS/6000 stuff */ + bfd_vma o_toc; /* address of TOC */ + short o_snentry; /* section number for entry point */ + short o_sntext; /* section number for text */ + short o_sndata; /* section number for data */ + short o_sntoc; /* section number for toc */ + short o_snloader; /* section number for loader section */ + short o_snbss; /* section number for bss */ + short o_algntext; /* max alignment for text */ + short o_algndata; /* max alignment for data */ + short o_modtype; /* Module type field, 1R,RE,RO */ + short o_cputype; /* Encoded CPU type */ + bfd_vma o_maxstack; /* max stack size allowed. */ + bfd_vma o_maxdata; /* max data size allowed. */ + + /* ECOFF stuff */ + bfd_vma bss_start; /* Base of bss section. */ + bfd_vma gp_value; /* GP register value. */ + unsigned long gprmask; /* General registers used. */ + unsigned long cprmask[4]; /* Coprocessor registers used. */ + unsigned long fprmask; /* Floating pointer registers used. */ + + /* Apollo stuff */ + long o_inlib; /* inlib data */ + long o_sri; /* Static Resource Information */ + long vid[2]; /* Version id */ + + struct internal_extra_pe_aouthdr pe; +}; + +/********************** STORAGE CLASSES **********************/ + +/* This used to be defined as -1, but now n_sclass is unsigned. */ +#define C_EFCN 0xff /* physical end of function */ +#define C_NULL 0 +#define C_AUTO 1 /* automatic variable */ +#define C_EXT 2 /* external symbol */ +#define C_STAT 3 /* static */ +#define C_REG 4 /* register variable */ +#define C_EXTDEF 5 /* external definition */ +#define C_LABEL 6 /* label */ +#define C_ULABEL 7 /* undefined label */ +#define C_MOS 8 /* member of structure */ +#define C_ARG 9 /* function argument */ +#define C_STRTAG 10 /* structure tag */ +#define C_MOU 11 /* member of union */ +#define C_UNTAG 12 /* union tag */ +#define C_TPDEF 13 /* type definition */ +#define C_USTATIC 14 /* undefined static */ +#define C_ENTAG 15 /* enumeration tag */ +#define C_MOE 16 /* member of enumeration */ +#define C_REGPARM 17 /* register parameter */ +#define C_FIELD 18 /* bit field */ +#define C_AUTOARG 19 /* auto argument */ +#define C_LASTENT 20 /* dummy entry (end of block) */ +#define C_BLOCK 100 /* ".bb" or ".eb" */ +#define C_FCN 101 /* ".bf" or ".ef" */ +#define C_EOS 102 /* end of structure */ +#define C_FILE 103 /* file name */ +#define C_LINE 104 /* line # reformatted as symbol table entry */ +#define C_ALIAS 105 /* duplicate tag */ +#define C_HIDDEN 106 /* ext symbol in dmert public lib */ +#define C_WEAKEXT 127 /* weak symbol -- GNU extension. */ + +/* New storage classes for TI COFF */ +#define C_UEXT 19 /* Tentative external definition */ +#define C_STATLAB 20 /* Static load time label */ +#define C_EXTLAB 21 /* External load time label */ +#define C_SYSTEM 23 /* System Wide variable */ + +/* New storage classes for WINDOWS_NT */ +#define C_SECTION 104 /* section name */ +#define C_NT_WEAK 105 /* weak external */ + + /* New storage classes for 80960 */ + +/* C_LEAFPROC is obsolete. Use C_LEAFEXT or C_LEAFSTAT */ +#define C_LEAFPROC 108 /* Leaf procedure, "call" via BAL */ + +#define C_SCALL 107 /* Procedure reachable via system call */ +#define C_LEAFEXT 108 /* External leaf */ +#define C_LEAFSTAT 113 /* Static leaf */ +#define C_OPTVAR 109 /* Optimized variable */ +#define C_DEFINE 110 /* Preprocessor #define */ +#define C_PRAGMA 111 /* Advice to compiler or linker */ +#define C_SEGMENT 112 /* 80960 segment name */ + + /* Storage classes for m88k */ +#define C_SHADOW 107 /* shadow symbol */ +#define C_VERSION 108 /* coff version symbol */ + + /* New storage classes for RS/6000 */ +#define C_HIDEXT 107 /* Un-named external symbol */ +#define C_BINCL 108 /* Marks beginning of include file */ +#define C_EINCL 109 /* Marks ending of include file */ +#define C_AIX_WEAKEXT 111 /* AIX definition of C_WEAKEXT. */ + +#define C_NULL_VALUE 0x00de1e00 /* Value for a C_NULL deleted entry. */ + +#if defined _AIX52 || defined AIX_WEAK_SUPPORT +#undef C_WEAKEXT +#define C_WEAKEXT C_AIX_WEAKEXT +#endif + + /* storage classes for stab symbols for RS/6000 */ +#define C_GSYM (0x80) +#define C_LSYM (0x81) +#define C_PSYM (0x82) +#define C_RSYM (0x83) +#define C_RPSYM (0x84) +#define C_STSYM (0x85) +#define C_TCSYM (0x86) +#define C_BCOMM (0x87) +#define C_ECOML (0x88) +#define C_ECOMM (0x89) +#define C_DECL (0x8c) +#define C_ENTRY (0x8d) +#define C_FUN (0x8e) +#define C_BSTAT (0x8f) +#define C_ESTAT (0x90) +#define C_GTLS (0x97) +#define C_STTLS (0x98) + +/* Storage classes for Thumb symbols */ +#define C_THUMBEXT (128 + C_EXT) /* 130 */ +#define C_THUMBSTAT (128 + C_STAT) /* 131 */ +#define C_THUMBLABEL (128 + C_LABEL) /* 134 */ +#define C_THUMBEXTFUNC (C_THUMBEXT + 20) /* 150 */ +#define C_THUMBSTATFUNC (C_THUMBSTAT + 20) /* 151 */ + +/* True if XCOFF symbols of class CLASS have auxillary csect information. */ +#define CSECT_SYM_P(CLASS) \ + ((CLASS) == C_EXT || (CLASS) == C_AIX_WEAKEXT || (CLASS) == C_HIDEXT) + +/********************** SECTION HEADER **********************/ + +#define SCNNMLEN (8) + +struct internal_scnhdr +{ + char s_name[SCNNMLEN]; /* section name */ + + /* Physical address, aliased s_nlib. + In the pei format, this field is the virtual section size + (the size of the section after being loaded int memory), + NOT the physical address. */ + bfd_vma s_paddr; + + bfd_vma s_vaddr; /* virtual address */ + bfd_vma s_size; /* section size */ + bfd_vma s_scnptr; /* file ptr to raw data for section */ + bfd_vma s_relptr; /* file ptr to relocation */ + bfd_vma s_lnnoptr; /* file ptr to line numbers */ + unsigned long s_nreloc; /* number of relocation entries */ + unsigned long s_nlnno; /* number of line number entries*/ + long s_flags; /* flags */ + long s_align; /* used on I960 */ + unsigned char s_page; /* TI COFF load page */ +}; + +/* s_flags "type". */ +#define STYP_REG (0x0000) /* "regular": allocated, relocated, loaded */ +#define STYP_DSECT (0x0001) /* "dummy": relocated only*/ +#define STYP_NOLOAD (0x0002) /* "noload": allocated, relocated, not loaded */ +#define STYP_GROUP (0x0004) /* "grouped": formed of input sections */ +#define STYP_PAD (0x0008) /* "padding": not allocated, not relocated, loaded */ +#define STYP_COPY (0x0010) /* "copy": for decision function used by field update; not allocated, not relocated, + loaded; reloc & lineno entries processed normally */ +#define STYP_TEXT (0x0020) /* section contains text only */ +#define S_SHRSEG (0x0020) /* In 3b Update files (output of ogen), sections which appear in SHARED segments of the Pfile + will have the S_SHRSEG flag set by ogen, to inform dufr that updating 1 copy of the proc. will + update all process invocations. */ +#define STYP_DATA (0x0040) /* section contains data only */ +#define STYP_BSS (0x0080) /* section contains bss only */ +#define S_NEWFCN (0x0100) /* In a minimal file or an update file, a new function (as compared with a replaced function) */ +#define STYP_INFO (0x0200) /* comment: not allocated not relocated, not loaded */ +#define STYP_OVER (0x0400) /* overlay: relocated not allocated or loaded */ +#define STYP_LIB (0x0800) /* for .lib: same as INFO */ +#define STYP_MERGE (0x2000) /* merge section -- combines with text, data or bss sections only */ +#define STYP_REVERSE_PAD (0x4000) /* section will be padded with no-op instructions + wherever padding is necessary and there is a + word of contiguous bytes beginning on a word + boundary. */ + +#define STYP_LIT 0x8020 /* Literal data (like STYP_TEXT) */ + + +/********************** LINE NUMBERS **********************/ + +/* 1 line number entry for every "breakpointable" source line in a section. + Line numbers are grouped on a per function basis; first entry in a function + grouping will have l_lnno = 0 and in place of physical address will be the + symbol table index of the function name. */ + +struct internal_lineno +{ + union + { + bfd_signed_vma l_symndx; /* function name symbol index, iff l_lnno == 0*/ + bfd_signed_vma l_paddr; /* (physical) address of line number */ + } l_addr; + unsigned long l_lnno; /* line number */ +}; + +/********************** SYMBOLS **********************/ + +#define SYMNMLEN 8 /* # characters in a symbol name */ +#define FILNMLEN 14 /* # characters in a file name */ +#define DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct internal_syment +{ + union + { + char _n_name[SYMNMLEN]; /* old COFF version */ + struct + { + bfd_hostptr_t _n_zeroes; /* new == 0 */ + bfd_hostptr_t _n_offset; /* offset into string table */ + } _n_n; + char *_n_nptr[2]; /* allows for overlaying */ + } _n; + bfd_vma n_value; /* value of symbol */ + short n_scnum; /* section number */ + unsigned short n_flags; /* copy of flags from filhdr */ + unsigned short n_type; /* type and derived type */ + unsigned char n_sclass; /* storage class */ + unsigned char n_numaux; /* number of aux. entries */ +}; + +#define n_name _n._n_name +#define n_zeroes _n._n_n._n_zeroes +#define n_offset _n._n_n._n_offset + +/* Relocatable symbols have number of the section in which they are defined, + or one of the following: */ + +#define N_UNDEF ((short)0) /* undefined symbol */ +#define N_ABS ((short)-1) /* value of symbol is absolute */ +#define N_DEBUG ((short)-2) /* debugging symbol -- value is meaningless */ +#define N_TV ((short)-3) /* indicates symbol needs preload transfer vector */ +#define P_TV ((short)-4) /* indicates symbol needs postload transfer vector*/ + +/* Type of a symbol, in low N bits of the word. */ + +#define T_NULL 0 +#define T_VOID 1 /* function argument (only used by compiler) */ +#define T_CHAR 2 /* character */ +#define T_SHORT 3 /* short integer */ +#define T_INT 4 /* integer */ +#define T_LONG 5 /* long integer */ +#define T_FLOAT 6 /* floating point */ +#define T_DOUBLE 7 /* double word */ +#define T_STRUCT 8 /* structure */ +#define T_UNION 9 /* union */ +#define T_ENUM 10 /* enumeration */ +#define T_MOE 11 /* member of enumeration*/ +#define T_UCHAR 12 /* unsigned character */ +#define T_USHORT 13 /* unsigned short */ +#define T_UINT 14 /* unsigned integer */ +#define T_ULONG 15 /* unsigned long */ +#define T_LNGDBL 16 /* long double */ + +/* Derived types, in n_type. */ + +#define DT_NON (0) /* no derived type */ +#define DT_PTR (1) /* pointer */ +#define DT_FCN (2) /* function */ +#define DT_ARY (3) /* array */ + +#define BTYPE(x) ((x) & N_BTMASK) +#define DTYPE(x) (((x) & N_TMASK) >> N_BTSHFT) + +#define ISPTR(x) \ + (((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_PTR << N_BTSHFT)) +#define ISFCN(x) \ + (((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_FCN << N_BTSHFT)) +#define ISARY(x) \ + (((unsigned long) (x) & N_TMASK) == ((unsigned long) DT_ARY << N_BTSHFT)) +#define ISTAG(x) \ + ((x) == C_STRTAG || (x) == C_UNTAG || (x) == C_ENTAG) +#define DECREF(x) \ + ((((x) >> N_TSHIFT) & ~ N_BTMASK) | ((x) & N_BTMASK)) + +union internal_auxent +{ + struct + { + + union + { + long l; /* str, un, or enum tag indx */ + struct coff_ptr_struct *p; + } x_tagndx; + + union + { + struct + { + unsigned short x_lnno; /* declaration line number */ + unsigned short x_size; /* str/union/array size */ + } x_lnsz; + long x_fsize; /* size of function */ + } x_misc; + + union + { + struct + { /* if ISFCN, tag, or .bb */ + bfd_signed_vma x_lnnoptr; /* ptr to fcn line # */ + union + { /* entry ndx past block end */ + long l; + struct coff_ptr_struct *p; + } x_endndx; + } x_fcn; + + struct + { /* if ISARY, up to 4 dimen. */ + unsigned short x_dimen[DIMNUM]; + } x_ary; + } x_fcnary; + + unsigned short x_tvndx; /* tv index */ + } x_sym; + + union + { + char x_fname[FILNMLEN]; + struct + { + long x_zeroes; + long x_offset; + } x_n; + } x_file; + + struct + { + long x_scnlen; /* section length */ + unsigned short x_nreloc; /* # relocation entries */ + unsigned short x_nlinno; /* # line numbers */ + unsigned long x_checksum; /* section COMDAT checksum for PE */ + unsigned short x_associated; /* COMDAT associated section index for PE */ + unsigned char x_comdat; /* COMDAT selection number for PE */ + } x_scn; + + struct + { + long x_tvfill; /* tv fill value */ + unsigned short x_tvlen; /* length of .tv */ + unsigned short x_tvran[2]; /* tv range */ + } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ + + /****************************************** + * RS/6000-specific auxent - last auxent for every external symbol + ******************************************/ + struct + { + union + { /* csect length or enclosing csect */ + bfd_signed_vma l; + struct coff_ptr_struct *p; + } x_scnlen; + long x_parmhash; /* parm type hash index */ + unsigned short x_snhash; /* sect num with parm hash */ + unsigned char x_smtyp; /* symbol align and type */ + /* 0-4 - Log 2 of alignment */ + /* 5-7 - symbol type */ + unsigned char x_smclas; /* storage mapping class */ + long x_stab; /* dbx stab info index */ + unsigned short x_snstab; /* sect num with dbx stab */ + } x_csect; /* csect definition information */ + +/* x_smtyp values: */ + +#define SMTYP_ALIGN(x) ((x) >> 3) /* log2 of alignment */ +#define SMTYP_SMTYP(x) ((x) & 0x7) /* symbol type */ +/* Symbol type values: */ +#define XTY_ER 0 /* External reference */ +#define XTY_SD 1 /* Csect definition */ +#define XTY_LD 2 /* Label definition */ +#define XTY_CM 3 /* .BSS */ +#define XTY_EM 4 /* Error message */ +#define XTY_US 5 /* "Reserved for internal use" */ + +/* x_smclas values: */ + +#define XMC_PR 0 /* Read-only program code */ +#define XMC_RO 1 /* Read-only constant */ +#define XMC_DB 2 /* Read-only debug dictionary table */ +#define XMC_TC 3 /* Read-write general TOC entry */ +#define XMC_UA 4 /* Read-write unclassified */ +#define XMC_RW 5 /* Read-write data */ +#define XMC_GL 6 /* Read-only global linkage */ +#define XMC_XO 7 /* Read-only extended operation */ +#define XMC_SV 8 /* Read-only supervisor call */ +#define XMC_BS 9 /* Read-write BSS */ +#define XMC_DS 10 /* Read-write descriptor csect */ +#define XMC_UC 11 /* Read-write unnamed Fortran common */ +#define XMC_TI 12 /* Read-only traceback index csect */ +#define XMC_TB 13 /* Read-only traceback table csect */ +/* 14 ??? */ +#define XMC_TC0 15 /* Read-write TOC anchor */ +#define XMC_TD 16 /* Read-write data in TOC */ + + /****************************************** + * I960-specific *2nd* aux. entry formats + ******************************************/ + struct + { + /* This is a very old typo that keeps getting propagated. */ +#define x_stdindx x_stindx + long x_stindx; /* sys. table entry */ + } x_sc; /* system call entry */ + + struct + { + unsigned long x_balntry; /* BAL entry point */ + } x_bal; /* BAL-callable function */ + + struct + { + unsigned long x_timestamp; /* time stamp */ + char x_idstring[20]; /* producer identity string */ + } x_ident; /* Producer ident info */ + +}; + +/********************** RELOCATION DIRECTIVES **********************/ + +struct internal_reloc +{ + bfd_vma r_vaddr; /* Virtual address of reference */ + long r_symndx; /* Index into symbol table */ + unsigned short r_type; /* Relocation type */ + unsigned char r_size; /* Used by RS/6000 and ECOFF */ + unsigned char r_extern; /* Used by ECOFF */ + unsigned long r_offset; /* Used by Alpha ECOFF, SPARC, others */ +}; + +/* X86-64 relocations. */ +#define R_AMD64_ABS 0 /* Reference is absolute, no relocation is necessary. */ +#define R_AMD64_DIR64 1 /* 64-bit address (VA). */ +#define R_AMD64_DIR32 2 /* 32-bit address (VA) R_DIR32. */ +#define R_AMD64_IMAGEBASE 3 /* 32-bit absolute ref w/o base R_IMAGEBASE. */ +#define R_AMD64_PCRLONG 4 /* 32-bit relative address from byte following reloc R_PCRLONG. */ +#define R_AMD64_PCRLONG_1 5 /* 32-bit relative address from byte distance 1 from reloc. */ +#define R_AMD64_PCRLONG_2 6 /* 32-bit relative address from byte distance 2 from reloc. */ +#define R_AMD64_PCRLONG_3 7 /* 32-bit relative address from byte distance 3 from reloc. */ +#define R_AMD64_PCRLONG_4 8 /* 32-bit relative address from byte distance 4 from reloc. */ +#define R_AMD64_PCRLONG_5 9 /* 32-bit relative address from byte distance 5 from reloc. */ +#define R_AMD64_SECTION 10 /* Section index. */ +#define R_AMD64_SECREL 11 /* 32 bit offset from base of section containing target R_SECREL. */ +#define R_AMD64_SECREL7 12 /* 7 bit unsigned offset from base of section containing target. */ +#define R_AMD64_TOKEN 13 /* 32 bit metadata token. */ +#define R_AMD64_PCRQUAD 14 /* Pseude PC64 relocation - Note: not specified by MS/AMD but need for gas pc-relative 64bit wide relocation generated by ELF. */ + +/* i386 Relocations. */ + +#define R_DIR16 1 +#define R_REL24 5 +#define R_DIR32 6 +#define R_IMAGEBASE 7 +#define R_SECREL32 11 +#define R_RELBYTE 15 +#define R_RELWORD 16 +#define R_RELLONG 17 +#define R_PCRBYTE 18 +#define R_PCRWORD 19 +#define R_PCRLONG 20 +#define R_PCR24 21 +#define R_IPRSHORT 24 +#define R_IPRLONG 26 +#define R_GETSEG 29 +#define R_GETPA 30 +#define R_TAGWORD 31 +#define R_JUMPTARG 32 /* strange 29k 00xx00xx reloc */ +#define R_PARTLS16 32 +#define R_PARTMS8 33 + +#define R_PCR16L 128 +#define R_PCR26L 129 +#define R_VRT16 130 +#define R_HVRT16 131 +#define R_LVRT16 132 +#define R_VRT32 133 + + +/* This reloc identifies mov.b instructions with a 16bit absolute + address. The linker tries to turn insns with this reloc into + an absolute 8-bit address. */ +#define R_MOV16B1 0x41 + +/* This reloc identifies mov.b instructions which had a 16bit + absolute address which have been shortened into a 8-bit + absolute address. */ +#define R_MOV16B2 0x42 + +/* This reloc identifies jmp insns with a 16bit target address; + the linker tries to turn these insns into bra insns with + an 8bit pc-relative target. */ +#define R_JMP1 0x43 + +/* This reloc identifies a bra with an 8-bit pc-relative + target that was formerly a jmp insn with a 16bit target. */ +#define R_JMP2 0x44 + +/* ??? */ +#define R_RELLONG_NEG 0x45 + +/* This reloc identifies jmp insns with a 24bit target address; + the linker tries to turn these insns into bra insns with + an 8bit pc-relative target. */ +#define R_JMPL1 0x46 + +/* This reloc identifies a bra with an 8-bit pc-relative + target that was formerly a jmp insn with a 24bit target. */ +#define R_JMPL2 0x47 + +/* This reloc identifies mov.b instructions with a 24bit absolute + address. The linker tries to turn insns with this reloc into + an absolute 8-bit address. */ + +#define R_MOV24B1 0x48 + +/* This reloc identifies mov.b instructions which had a 24bit + absolute address which have been shortened into a 8-bit + absolute address. */ +#define R_MOV24B2 0x49 + +/* An h8300 memory indirect jump/call. Forces the address of the jump/call + target into the function vector (in page zero), and the address of the + vector entry to be placed in the jump/call instruction. */ +#define R_MEM_INDIRECT 0x4a + +/* This reloc identifies a 16bit pc-relative branch target which was + shortened into an 8bit pc-relative branch target. */ +#define R_PCRWORD_B 0x4b + +/* This reloc identifies mov.[wl] instructions with a 32/24 bit + absolute address; the linker may turn this into a mov.[wl] + insn with a 16bit absolute address. */ +#define R_MOVL1 0x4c + +/* This reloc identifies mov.[wl] insns which formerly had + a 32/24bit absolute address and now have a 16bit absolute address. */ +#define R_MOVL2 0x4d + +/* This reloc identifies a bCC:8 which will have it's condition + inverted and its target redirected to the target of the branch + in the following insn. */ +#define R_BCC_INV 0x4e + +/* This reloc identifies a jmp instruction that has been deleted. */ +#define R_JMP_DEL 0x4f + +/* Z8k modes */ +#define R_IMM16 0x01 /* 16 bit abs */ +#define R_JR 0x02 /* jr 8 bit disp */ +#define R_IMM4L 0x23 /* low nibble */ +#define R_IMM8 0x22 /* 8 bit abs */ +#define R_IMM32 R_RELLONG /* 32 bit abs */ +#define R_CALL R_DA /* Absolute address which could be a callr */ +#define R_JP R_DA /* Absolute address which could be a jp */ +#define R_REL16 0x04 /* 16 bit PC rel */ +#define R_CALLR 0x05 /* callr 12 bit disp */ +#define R_SEG 0x10 /* set if in segmented mode */ +#define R_IMM4H 0x24 /* high nibble */ +#define R_DISP7 0x25 /* djnz displacement */ + +/* Z80 modes */ +#define R_OFF8 0x32 /* 8 bit signed abs, for (i[xy]+d) */ +#define R_IMM24 0x33 /* 24 bit abs */ +/* R_JR, R_IMM8, R_IMM16, R_IMM32 - as for Z8k */ + +/* H8500 modes */ + +#define R_H8500_IMM8 1 /* 8 bit immediate */ +#define R_H8500_IMM16 2 /* 16 bit immediate */ +#define R_H8500_PCREL8 3 /* 8 bit pcrel */ +#define R_H8500_PCREL16 4 /* 16 bit pcrel */ +#define R_H8500_HIGH8 5 /* high 8 bits of 24 bit address */ +#define R_H8500_LOW16 7 /* low 16 bits of 24 bit immediate */ +#define R_H8500_IMM24 6 /* 24 bit immediate */ +#define R_H8500_IMM32 8 /* 32 bit immediate */ +#define R_H8500_HIGH16 9 /* high 16 bits of 32 bit immediate */ + +/* W65 modes */ + +#define R_W65_ABS8 1 /* addr & 0xff */ +#define R_W65_ABS16 2 /* addr & 0xffff */ +#define R_W65_ABS24 3 /* addr & 0xffffff */ + +#define R_W65_ABS8S8 4 /* (addr >> 8) & 0xff */ +#define R_W65_ABS8S16 5 /* (addr >> 16) & 0xff */ + +#define R_W65_ABS16S8 6 /* (addr >> 8) & 0ffff */ +#define R_W65_ABS16S16 7 /* (addr >> 16) & 0ffff */ + +#define R_W65_PCR8 8 +#define R_W65_PCR16 9 + +#define R_W65_DP 10 /* direct page 8 bits only */ + +#endif /* GNU_COFF_INTERNAL_H */ diff --git a/include/coff/m68k.h b/include/coff/m68k.h new file mode 100644 index 0000000..c00c5a9 --- /dev/null +++ b/include/coff/m68k.h @@ -0,0 +1,82 @@ +/* coff information for M68K + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef GNU_COFF_M68K_H +#define GNU_COFF_M68K_H 1 + +#define L_LNNO_SIZE 2 +#include "coff/external.h" + +/* Motorola 68000/68008/68010/68020 */ +#define MC68MAGIC 0520 +#define MC68KWRMAGIC 0520 /* writeable text segments */ +#define MC68TVMAGIC 0521 +#define MC68KROMAGIC 0521 /* readonly shareable text segments */ +#define MC68KPGMAGIC 0522 /* demand paged text segments */ +#define M68MAGIC 0210 +#define M68TVMAGIC 0211 + +/* This is the magic of the Bull dpx/2 */ +#define MC68KBCSMAGIC 0526 + +/* This is Lynx's all-platform magic number for executables. */ + +#define LYNXCOFFMAGIC 0415 + +#define OMAGIC M68MAGIC + +/* This intentionally does not include MC68KBCSMAGIC; it only includes + magic numbers which imply that names do not have underscores. */ +#define M68KBADMAG(x) (((x).f_magic != MC68MAGIC) \ + && ((x).f_magic != MC68KWRMAGIC) \ + && ((x).f_magic != MC68TVMAGIC) \ + && ((x).f_magic != MC68KROMAGIC) \ + && ((x).f_magic != MC68KPGMAGIC) \ + && ((x).f_magic != M68MAGIC) \ + && ((x).f_magic != M68TVMAGIC) \ + && ((x).f_magic != LYNXCOFFMAGIC)) + +/* Magic numbers for the a.out header. */ + +#define PAGEMAGICEXECSWAPPED 0407 /* executable (swapped) */ +#define PAGEMAGICPEXECSWAPPED 0410 /* pure executable (swapped) */ +#define PAGEMAGICPEXECTSHLIB 0443 /* pure executable (target shared library) */ +#define PAGEMAGICPEXECPAGED 0413 /* pure executable (paged) */ + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +#ifdef M68K_COFF_OFFSET + char r_offset[4]; +#endif +}; + +#define RELOC struct external_reloc + +#ifdef M68K_COFF_OFFSET +#define RELSZ 14 +#else +#define RELSZ 10 +#endif + +#endif /* GNU_COFF_M68K_H */ diff --git a/include/coff/m88k.h b/include/coff/m88k.h new file mode 100644 index 0000000..8e1b3c9 --- /dev/null +++ b/include/coff/m88k.h @@ -0,0 +1,197 @@ +/* coff information for 88k bcs + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define DO_NOT_DEFINE_SCNHDR +#define L_LNNO_SIZE 4 +#define DO_NOT_DEFINE_SYMENT +#define DO_NOT_DEFINE_AUXENT +#include "coff/external.h" + +#define MC88MAGIC 0540 /* 88k BCS executable */ +#define MC88DMAGIC 0541 /* DG/UX executable */ +#define MC88OMAGIC 0555 /* Object file */ + +#define MC88BADMAG(x) (((x).f_magic != MC88MAGIC) \ + && ((x).f_magic != MC88DMAGIC) \ + && ((x).f_magic != MC88OMAGIC)) + +#define PAGEMAGIC3 0414 /* Split i&d, zero mapped */ +#define PAGEMAGICBCS 0413 + +/********************** SECTION HEADER **********************/ + +struct external_scnhdr +{ + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[4]; /* number of relocation entries */ + char s_nlnno[4]; /* number of line number entries*/ + char s_flags[4]; /* flags */ +}; + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 44 + +/* Names of "special" sections. */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _COMMENT ".comment" + + +/********************** SYMBOLS **********************/ + +#define E_SYMNMLEN 8 /* # characters in a symbol name */ +#define E_FILNMLEN 14 /* # characters in a file name */ +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + union + { + char e_name[E_SYMNMLEN]; + + struct + { + char e_zeroes[4]; + char e_offset[4]; + } e; + + } e; + + char e_value[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; + char pad2[2]; +}; + +#define N_BTMASK 017 +#define N_TMASK 060 +#define N_BTSHFT 4 +#define N_TSHIFT 2 + +/* Note that this isn't the same shape as other coffs */ +union external_auxent +{ + struct + { + char x_tagndx[4]; /* str, un, or enum tag indx */ + /* 4 */ + + union + { + char x_fsize[4]; /* size of function */ + + struct + { + char x_lnno[4]; /* declaration line number */ + char x_size[4]; /* str/union/array size */ + } x_lnsz; + + } x_misc; + + /* 12 */ + union + { + struct /* if ISFCN, tag, or .bb */ + { + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + + struct /* if ISARY, up to 4 dimen. */ + { + char x_dimen[E_DIMNUM][2]; + } x_ary; + + } x_fcnary; + /* 20 */ + + } x_sym; + + union + { + char x_fname[E_FILNMLEN]; + + struct + { + char x_zeroes[4]; + char x_offset[4]; + } x_n; + + } x_file; + + struct + { + char x_scnlen[4]; /* section length */ + char x_nreloc[4]; /* # relocation entries */ + char x_nlinno[4]; /* # line numbers */ + } x_scn; + + struct + { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ +}; + +#define GET_LNSZ_SIZE(abfd, ext) \ + H_GET_32 (abfd, ext->x_sym.x_misc.x_lnsz.x_size) +#define GET_LNSZ_LNNO(abfd, ext) \ + H_GET_32 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno) +#define PUT_LNSZ_LNNO(abfd, in, ext) \ + H_PUT_32 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno) +#define PUT_LNSZ_SIZE(abfd, in, ext) \ + H_PUT_32 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size) +#define GET_SCN_NRELOC(abfd, ext) \ + H_GET_32 (abfd, ext->x_scn.x_nreloc) +#define GET_SCN_NLINNO(abfd, ext) \ + H_GET_32 (abfd, ext->x_scn.x_nlinno) +#define PUT_SCN_NRELOC(abfd, in, ext) \ + H_PUT_32 (abfd, in, ext->x_scn.x_nreloc) +#define PUT_SCN_NLINNO(abfd, in, ext) \ + H_PUT_32 (abfd,in, ext->x_scn.x_nlinno) + +#define SYMENT struct external_syment +#define SYMESZ 20 +#define AUXENT union external_auxent +#define AUXESZ 20 + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; + char r_offset[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 12 + +#define NO_TVNDX diff --git a/include/coff/mcore.h b/include/coff/mcore.h new file mode 100644 index 0000000..60dbfb2 --- /dev/null +++ b/include/coff/mcore.h @@ -0,0 +1,72 @@ +/* Motorola MCore support for BFD. + Copyright 1999, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MCore COFF/PE ABI. */ + +#ifndef _COFF_MORE_H +#define _COFF_MORE_H + +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#define L_LNNO_SIZE 2 +#include "coff/external.h" + +#define MCOREMAGIC 0xb00 /* I just made this up */ + +#define MCOREBADMAG(x) (((x).f_magic != MCOREMAGIC)) + +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +#define IMAGE_REL_MCORE_ABSOLUTE 0x0000 +#define IMAGE_REL_MCORE_ADDR32 0x0001 +#define IMAGE_REL_MCORE_PCREL_IMM8BY4 0x0002 +#define IMAGE_REL_MCORE_PCREL_IMM11BY2 0x0003 +#define IMAGE_REL_MCORE_PCREL_IMM4BY2 0x0004 +#define IMAGE_REL_MCORE_PCREL_32 0x0005 +#define IMAGE_REL_MCORE_PCREL_JSR_IMM11BY2 0x0006 +#define IMAGE_REL_MCORE_RVA 0x0007 + +#define PEMCORE + +#define OMAGIC 0404 /* object files, eg as output */ +#define ZMAGIC 0413 /* demand load format, eg normal ld output */ +#define STMAGIC 0401 /* target shlib */ +#define SHMAGIC 0443 /* host shlib */ + +/* From winnt.h */ +#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b + +/* Define some NT default values. */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +struct external_reloc +{ + char r_vaddr [4]; + char r_symndx [4]; + char r_type [2]; + char r_offset [4]; +}; + +#define RELOC struct external_reloc +#define RELSZ 14 + +#endif /* __COFF_MCORE_H */ diff --git a/include/coff/mips.h b/include/coff/mips.h new file mode 100644 index 0000000..f1c243b --- /dev/null +++ b/include/coff/mips.h @@ -0,0 +1,344 @@ +/* ECOFF support on MIPS machines. + coff/ecoff.h must be included before this file. + + Copyright 1999, 2004, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define DO_NOT_DEFINE_AOUTHDR +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +/* Magic numbers are defined in coff/ecoff.h. */ +#define MIPS_ECOFF_BADMAG(x) (((x).f_magic!=MIPS_MAGIC_1) && \ + ((x).f_magic!=MIPS_MAGIC_LITTLE) &&\ + ((x).f_magic!=MIPS_MAGIC_BIG) && \ + ((x).f_magic!=MIPS_MAGIC_LITTLE2) && \ + ((x).f_magic!=MIPS_MAGIC_BIG2) && \ + ((x).f_magic!=MIPS_MAGIC_LITTLE3) && \ + ((x).f_magic!=MIPS_MAGIC_BIG3)) + + +/********************** AOUT "OPTIONAL HEADER" **********************/ + +typedef struct external_aouthdr +{ + unsigned char magic[2]; /* type of file */ + unsigned char vstamp[2]; /* version stamp */ + unsigned char tsize[4]; /* text size in bytes, padded to FW bdry*/ + unsigned char dsize[4]; /* initialized data " " */ + unsigned char bsize[4]; /* uninitialized data " " */ + unsigned char entry[4]; /* entry pt. */ + unsigned char text_start[4]; /* base of text used for this file */ + unsigned char data_start[4]; /* base of data used for this file */ + unsigned char bss_start[4]; /* base of bss used for this file */ + unsigned char gprmask[4]; /* ?? */ + unsigned char cprmask[4][4]; /* ?? */ + unsigned char gp_value[4]; /* value for gp register */ +} AOUTHDR; + +/* compute size of a header */ + +#define AOUTSZ 56 +#define AOUTHDRSZ 56 + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc + { + unsigned char r_vaddr[4]; + unsigned char r_bits[4]; + }; + +#define RELOC struct external_reloc +#define RELSZ 8 + +/* MIPS ECOFF uses a packed 8 byte format for relocs. These constants + are used to unpack the r_bits field. */ + +#define RELOC_BITS0_SYMNDX_SH_LEFT_BIG 16 +#define RELOC_BITS0_SYMNDX_SH_LEFT_LITTLE 0 + +#define RELOC_BITS1_SYMNDX_SH_LEFT_BIG 8 +#define RELOC_BITS1_SYMNDX_SH_LEFT_LITTLE 8 + +#define RELOC_BITS2_SYMNDX_SH_LEFT_BIG 0 +#define RELOC_BITS2_SYMNDX_SH_LEFT_LITTLE 16 + +/* Originally, ECOFF used four bits for the reloc type and had three + reserved bits. Irix 4 added another bit for the reloc type, which + was easy because it was big endian and one of the spare bits became + the new most significant bit. To make this also work for little + endian ECOFF, we need to wrap one of the reserved bits around to + become the most significant bit of the reloc type. */ +#define RELOC_BITS3_TYPE_BIG 0x3E +#define RELOC_BITS3_TYPE_SH_BIG 1 +#define RELOC_BITS3_TYPE_LITTLE 0x78 +#define RELOC_BITS3_TYPE_SH_LITTLE 3 +#define RELOC_BITS3_TYPEHI_LITTLE 0x04 +#define RELOC_BITS3_TYPEHI_SH_LITTLE 2 + +#define RELOC_BITS3_EXTERN_BIG 0x01 +#define RELOC_BITS3_EXTERN_LITTLE 0x80 + +/* The r_type field in a reloc is one of the following values. I + don't know if any other values can appear. These seem to be all + that occur in the Ultrix 4.2 libraries. */ +#define MIPS_R_IGNORE 0 +#define MIPS_R_REFHALF 1 +#define MIPS_R_REFWORD 2 +#define MIPS_R_JMPADDR 3 +#define MIPS_R_REFHI 4 +#define MIPS_R_REFLO 5 +#define MIPS_R_GPREL 6 +#define MIPS_R_LITERAL 7 + +/* FIXME: This relocation is used (internally only) to represent branches + when assembling. It should never appear in output files, and + be removed. (It used to be used for embedded-PIC support.) */ +#define MIPS_R_PCREL16 12 + +/********************** STABS **********************/ + +#define MIPS_IS_STAB ECOFF_IS_STAB +#define MIPS_MARK_STAB ECOFF_MARK_STAB +#define MIPS_UNMARK_STAB ECOFF_UNMARK_STAB + +/********************** SYMBOLIC INFORMATION **********************/ + +/* Written by John Gilmore. */ + +/* ECOFF uses COFF-like section structures, but its own symbol format. + This file defines the symbol format in fields whose size and alignment + will not vary on different host systems. */ + +/* File header as a set of bytes */ + +struct hdr_ext +{ + unsigned char h_magic[2]; + unsigned char h_vstamp[2]; + unsigned char h_ilineMax[4]; + unsigned char h_cbLine[4]; + unsigned char h_cbLineOffset[4]; + unsigned char h_idnMax[4]; + unsigned char h_cbDnOffset[4]; + unsigned char h_ipdMax[4]; + unsigned char h_cbPdOffset[4]; + unsigned char h_isymMax[4]; + unsigned char h_cbSymOffset[4]; + unsigned char h_ioptMax[4]; + unsigned char h_cbOptOffset[4]; + unsigned char h_iauxMax[4]; + unsigned char h_cbAuxOffset[4]; + unsigned char h_issMax[4]; + unsigned char h_cbSsOffset[4]; + unsigned char h_issExtMax[4]; + unsigned char h_cbSsExtOffset[4]; + unsigned char h_ifdMax[4]; + unsigned char h_cbFdOffset[4]; + unsigned char h_crfd[4]; + unsigned char h_cbRfdOffset[4]; + unsigned char h_iextMax[4]; + unsigned char h_cbExtOffset[4]; +}; + +/* File descriptor external record */ + +struct fdr_ext +{ + unsigned char f_adr[4]; + unsigned char f_rss[4]; + unsigned char f_issBase[4]; + unsigned char f_cbSs[4]; + unsigned char f_isymBase[4]; + unsigned char f_csym[4]; + unsigned char f_ilineBase[4]; + unsigned char f_cline[4]; + unsigned char f_ioptBase[4]; + unsigned char f_copt[4]; + unsigned char f_ipdFirst[2]; + unsigned char f_cpd[2]; + unsigned char f_iauxBase[4]; + unsigned char f_caux[4]; + unsigned char f_rfdBase[4]; + unsigned char f_crfd[4]; + unsigned char f_bits1[1]; + unsigned char f_bits2[3]; + unsigned char f_cbLineOffset[4]; + unsigned char f_cbLine[4]; +}; + +#define FDR_BITS1_LANG_BIG 0xF8 +#define FDR_BITS1_LANG_SH_BIG 3 +#define FDR_BITS1_LANG_LITTLE 0x1F +#define FDR_BITS1_LANG_SH_LITTLE 0 + +#define FDR_BITS1_FMERGE_BIG 0x04 +#define FDR_BITS1_FMERGE_LITTLE 0x20 + +#define FDR_BITS1_FREADIN_BIG 0x02 +#define FDR_BITS1_FREADIN_LITTLE 0x40 + +#define FDR_BITS1_FBIGENDIAN_BIG 0x01 +#define FDR_BITS1_FBIGENDIAN_LITTLE 0x80 + +#define FDR_BITS2_GLEVEL_BIG 0xC0 +#define FDR_BITS2_GLEVEL_SH_BIG 6 +#define FDR_BITS2_GLEVEL_LITTLE 0x03 +#define FDR_BITS2_GLEVEL_SH_LITTLE 0 + +/* We ignore the `reserved' field in bits2. */ + +/* Procedure descriptor external record */ + +struct pdr_ext +{ + unsigned char p_adr[4]; + unsigned char p_isym[4]; + unsigned char p_iline[4]; + unsigned char p_regmask[4]; + unsigned char p_regoffset[4]; + unsigned char p_iopt[4]; + unsigned char p_fregmask[4]; + unsigned char p_fregoffset[4]; + unsigned char p_frameoffset[4]; + unsigned char p_framereg[2]; + unsigned char p_pcreg[2]; + unsigned char p_lnLow[4]; + unsigned char p_lnHigh[4]; + unsigned char p_cbLineOffset[4]; +}; + +/* Runtime procedure table */ + +struct rpdr_ext +{ + unsigned char p_adr[4]; + unsigned char p_regmask[4]; + unsigned char p_regoffset[4]; + unsigned char p_fregmask[4]; + unsigned char p_fregoffset[4]; + unsigned char p_frameoffset[4]; + unsigned char p_framereg[2]; + unsigned char p_pcreg[2]; + unsigned char p_irpss[4]; + unsigned char p_reserved[4]; + unsigned char p_exception_info[4]; +}; + +/* Line numbers */ + +struct line_ext +{ + unsigned char l_line[4]; +}; + +/* Symbol external record */ + +struct sym_ext +{ + unsigned char s_iss[4]; + unsigned char s_value[4]; + unsigned char s_bits1[1]; + unsigned char s_bits2[1]; + unsigned char s_bits3[1]; + unsigned char s_bits4[1]; +}; + +#define SYM_BITS1_ST_BIG 0xFC +#define SYM_BITS1_ST_SH_BIG 2 +#define SYM_BITS1_ST_LITTLE 0x3F +#define SYM_BITS1_ST_SH_LITTLE 0 + +#define SYM_BITS1_SC_BIG 0x03 +#define SYM_BITS1_SC_SH_LEFT_BIG 3 +#define SYM_BITS1_SC_LITTLE 0xC0 +#define SYM_BITS1_SC_SH_LITTLE 6 + +#define SYM_BITS2_SC_BIG 0xE0 +#define SYM_BITS2_SC_SH_BIG 5 +#define SYM_BITS2_SC_LITTLE 0x07 +#define SYM_BITS2_SC_SH_LEFT_LITTLE 2 + +#define SYM_BITS2_RESERVED_BIG 0x10 +#define SYM_BITS2_RESERVED_LITTLE 0x08 + +#define SYM_BITS2_INDEX_BIG 0x0F +#define SYM_BITS2_INDEX_SH_LEFT_BIG 16 +#define SYM_BITS2_INDEX_LITTLE 0xF0 +#define SYM_BITS2_INDEX_SH_LITTLE 4 + +#define SYM_BITS3_INDEX_SH_LEFT_BIG 8 +#define SYM_BITS3_INDEX_SH_LEFT_LITTLE 4 + +#define SYM_BITS4_INDEX_SH_LEFT_BIG 0 +#define SYM_BITS4_INDEX_SH_LEFT_LITTLE 12 + +/* External symbol external record */ + +struct ext_ext +{ + unsigned char es_bits1[1]; + unsigned char es_bits2[1]; + unsigned char es_ifd[2]; + struct sym_ext es_asym; +}; + +#define EXT_BITS1_JMPTBL_BIG 0x80 +#define EXT_BITS1_JMPTBL_LITTLE 0x01 + +#define EXT_BITS1_COBOL_MAIN_BIG 0x40 +#define EXT_BITS1_COBOL_MAIN_LITTLE 0x02 + +#define EXT_BITS1_WEAKEXT_BIG 0x20 +#define EXT_BITS1_WEAKEXT_LITTLE 0x04 + +/* Dense numbers external record */ + +struct dnr_ext +{ + unsigned char d_rfd[4]; + unsigned char d_index[4]; +}; + +/* Relative file descriptor */ + +struct rfd_ext +{ + unsigned char rfd[4]; +}; + +/* Optimizer symbol external record */ + +struct opt_ext +{ + unsigned char o_bits1[1]; + unsigned char o_bits2[1]; + unsigned char o_bits3[1]; + unsigned char o_bits4[1]; + struct rndx_ext o_rndx; + unsigned char o_offset[4]; +}; + +#define OPT_BITS2_VALUE_SH_LEFT_BIG 16 +#define OPT_BITS2_VALUE_SH_LEFT_LITTLE 0 + +#define OPT_BITS3_VALUE_SH_LEFT_BIG 8 +#define OPT_BITS3_VALUE_SH_LEFT_LITTLE 8 + +#define OPT_BITS4_VALUE_SH_LEFT_BIG 0 +#define OPT_BITS4_VALUE_SH_LEFT_LITTLE 16 diff --git a/include/coff/mipspe.h b/include/coff/mipspe.h new file mode 100644 index 0000000..f1a0d43 --- /dev/null +++ b/include/coff/mipspe.h @@ -0,0 +1,67 @@ +/* coff information for Windows CE with MIPS VR4111 + + Copyright 2000, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 2 +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#include "coff/external.h" + +#define MIPS_ARCH_MAGIC_WINCE 0x0166 /* Windows CE - little endian */ +#define MIPS_PE_MAGIC 0x010b + +#define MIPSBADMAG(x) ((x).f_magic != MIPS_ARCH_MAGIC_WINCE) + +/* define some NT default values */ +/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the h8 don't have room in the instruction for the entire + offset - eg the strange jump and high page addressing modes. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + +/* MIPS PE relocation types. */ + +#define MIPS_R_ABSOLUTE 0 /* ignored */ +#define MIPS_R_REFHALF 1 +#define MIPS_R_REFWORD 2 +#define MIPS_R_JMPADDR 3 +#define MIPS_R_REFHI 4 /* PAIR follows */ +#define MIPS_R_REFLO 5 +#define MIPS_R_GPREL 6 +#define MIPS_R_LITERAL 7 /* same as GPREL */ +#define MIPS_R_SECTION 10 +#define MIPS_R_SECREL 11 +#define MIPS_R_SECRELLO 12 +#define MIPS_R_SECRELHI 13 /* PAIR follows */ +#define MIPS_R_RVA 34 /* 0x22 */ +#define MIPS_R_PAIR 37 /* 0x25 - symndx is really a signed 16-bit addend */ diff --git a/include/coff/or32.h b/include/coff/or32.h new file mode 100644 index 0000000..9be7887 --- /dev/null +++ b/include/coff/or32.h @@ -0,0 +1,288 @@ +/* COFF specification for OpenRISC 1000. + Copyright (C) 1993-2000, 2002, 2010 Free Software Foundation, Inc. + Contributed by David Wood @ New York University. + Modified by Johan Rydberg, + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef OR32 +# define OR32 +#endif + +/* File Header and related definitions. */ +struct external_filehdr +{ + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ +}; + +#define FILHDR struct external_filehdr +#define FILHSZ 20 + +/* Magic numbers for OpenRISC 1000. As it is know we use the + numbers for Am29000. + + (AT&T will assign the "real" magic number). */ +#define SIPFBOMAGIC 0572 /* Am29000 (Byte 0 is MSB). */ +#define SIPRBOMAGIC 0573 /* Am29000 (Byte 0 is LSB). */ + +#define OR32_MAGIC_BIG SIPFBOMAGIC +#define OR32_MAGIC_LITTLE SIPRBOMAGIC +#define OR32BADMAG(x) (((x).f_magic!=OR32_MAGIC_BIG) && \ + ((x).f_magic!=OR32_MAGIC_LITTLE)) + +#define OMAGIC OR32_MAGIC_BIG + +/* Optional (a.out) header. */ +typedef struct external_aouthdr +{ + char magic[2]; /* type of file */ + char vstamp[2]; /* version stamp */ + char tsize[4]; /* text size in bytes, padded to FW bdry */ + char dsize[4]; /* initialized data " " */ + char bsize[4]; /* uninitialized data " " */ + char entry[4]; /* entry pt. */ + char text_start[4]; /* base of text used for this file */ + char data_start[4]; /* base of data used for this file */ +} AOUTHDR; + +#define AOUTSZ 28 +#define AOUTHDRSZ 28 + +/* aouthdr magic numbers. */ +#define NMAGIC 0410 /* separate i/d executable. */ +#define SHMAGIC 0406 /* NYU/Ultra3 shared data executable + (writable text). */ + +#define _ETEXT "_etext" + +/* Section header and related definitions. */ +struct external_scnhdr +{ + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[2]; /* number of relocation entries */ + char s_nlnno[2]; /* number of line number entries */ + char s_flags[4]; /* flags */ +}; + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 40 + +/* Names of "special" sections: */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _LIT ".lit" + +/* Section types - with additional section type for global + registers which will be relocatable for the OpenRISC 1000. + + In instances where it is necessary for a linker to produce an + output file which contains text or data not based at virtual + address 0, e.g. for a ROM, then the linker should accept + address base information as command input and use PAD sections + to skip over unused addresses. */ +#define STYP_BSSREG 0x1200 /* Global register area (like STYP_INFO) */ +#define STYP_ENVIR 0x2200 /* Environment (like STYP_INFO) */ +#define STYP_ABS 0x4000 /* Absolute (allocated, not reloc, loaded) */ + +/* Relocation information declaration and related definitions: */ +struct external_reloc +{ + char r_vaddr[4]; /* (virtual) address of reference */ + char r_symndx[4]; /* index into symbol table */ + char r_type[2]; /* relocation type */ +}; + +#define RELOC struct external_reloc +#define RELSZ 10 /* sizeof (RELOC) */ + +/* Relocation types for the OpenRISC 1000: */ + +#define R_ABS 0 /* reference is absolute */ +#define R_IREL 030 /* instruction relative (jmp/call) */ +#define R_IABS 031 /* instruction absolute (jmp/call) */ +#define R_ILOHALF 032 /* instruction low half (const) */ +#define R_IHIHALF 033 /* instruction high half (consth) part 1 */ +#define R_IHCONST 034 /* instruction high half (consth) part 2 */ + /* constant offset of R_IHIHALF relocation */ +#define R_BYTE 035 /* relocatable byte value */ +#define R_HWORD 036 /* relocatable halfword value */ +#define R_WORD 037 /* relocatable word value */ + +#define R_IGLBLRC 040 /* instruction global register RC */ +#define R_IGLBLRA 041 /* instruction global register RA */ +#define R_IGLBLRB 042 /* instruction global register RB */ + +/* + NOTE: + All the "I" forms refer to 29000 instruction formats. The linker is + expected to know how the numeric information is split and/or aligned + within the instruction word(s). R_BYTE works for instructions, too. + + If the parameter to a CONSTH instruction is a relocatable type, two + relocation records are written. The first has an r_type of R_IHIHALF + (33 octal) and a normal r_vaddr and r_symndx. The second relocation + record has an r_type of R_IHCONST (34 octal), a normal r_vaddr (which + is redundant), and an r_symndx containing the 32-bit constant offset + to the relocation instead of the actual symbol table index. This + second record is always written, even if the constant offset is zero. + The constant fields of the instruction are set to zero. */ + +/* Line number entry declaration and related definitions: */ +struct external_lineno +{ + union + { + char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ + char l_paddr[4]; /* (physical) address of line number */ + } + l_addr; + + char l_lnno[2]; /* line number */ +}; + +#define LINENO struct external_lineno +#define LINESZ 6 /* sizeof (LINENO) */ + +/* Symbol entry declaration and related definitions: */ +#define E_SYMNMLEN 8 /* Number of characters in a symbol name */ + +struct external_syment +{ + union + { + char e_name[E_SYMNMLEN]; + struct + { + char e_zeroes[4]; + char e_offset[4]; + } + e; + } + e; + + char e_value[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; +}; + +#define SYMENT struct external_syment +#define SYMESZ 18 + +/* Storage class definitions - new classes for global registers: */ +#define C_GLBLREG 19 /* global register */ +#define C_EXTREG 20 /* external global register */ +#define C_DEFREG 21 /* ext. def. of global register */ + +/* Derived symbol mask/shifts: */ +#define N_BTMASK (0xf) +#define N_BTSHFT (4) +#define N_TMASK (0x30) +#define N_TSHIFT (2) + +/* Auxiliary symbol table entry declaration and related + definitions. */ +#define E_FILNMLEN 14 /* # characters in a file name */ +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +union external_auxent +{ + struct + { + char x_tagndx[4]; /* str, un, or enum tag indx */ + union + { + struct + { + char x_lnno[2]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } + x_lnsz; + + char x_fsize[4]; /* size of function */ + } + x_misc; + + union + { + struct /* if ISFCN, tag, or .bb */ + { + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } + x_fcn; + + struct /* if ISARY, up to 4 dimen. */ + { + char x_dimen[E_DIMNUM][2]; + } + x_ary; + } + x_fcnary; + + char x_tvndx[2]; /* tv index */ + } + x_sym; + + union + { + char x_fname[E_FILNMLEN]; + + struct + { + char x_zeroes[4]; + char x_offset[4]; + } + x_n; + } + x_file; + + struct + { + char x_scnlen[4]; /* section length */ + char x_nreloc[2]; /* # relocation entries */ + char x_nlinno[2]; /* # line numbers */ + } + x_scn; + + struct + { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + } + x_tv; /* info about .tv section + (in auxent of symbol .tv)) */ +}; + +#define AUXENT union external_auxent +#define AUXESZ 18 diff --git a/include/coff/pe.h b/include/coff/pe.h new file mode 100644 index 0000000..601a68e --- /dev/null +++ b/include/coff/pe.h @@ -0,0 +1,512 @@ +/* pe.h - PE COFF header information + + Copyright 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ +#ifndef _PE_H +#define _PE_H + +/* NT specific file attributes. */ +#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 +#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 +#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 +#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 +#define IMAGE_FILE_AGGRESSIVE_WS_TRIM 0x0010 +#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020 +#define IMAGE_FILE_16BIT_MACHINE 0x0040 +#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 +#define IMAGE_FILE_32BIT_MACHINE 0x0100 +#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 +#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400 +#define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800 +#define IMAGE_FILE_SYSTEM 0x1000 +#define IMAGE_FILE_DLL 0x2000 +#define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000 +#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 + +/* DllCharacteristics flag bits. The inconsistent naming may seem + odd, but that is how they are defined in the PE specification. */ +#define IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE 0x0040 +#define IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY 0x0080 +#define IMAGE_DLL_CHARACTERISTICS_NX_COMPAT 0x0100 +#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200 +#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 +#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800 +#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000 +#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000 + +/* Additional flags to be set for section headers to allow the NT loader to + read and write to the section data (to replace the addresses of data in + dlls for one thing); also to execute the section in .text's case. */ +#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 +#define IMAGE_SCN_MEM_EXECUTE 0x20000000 +#define IMAGE_SCN_MEM_READ 0x40000000 +#define IMAGE_SCN_MEM_WRITE 0x80000000 + +/* Section characteristics added for ppc-nt. */ + +#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */ + +#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */ +#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */ +#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */ + +#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */ +#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */ +#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */ +#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */ + +#define IMAGE_SCN_MEM_FARDATA 0x00008000 + +#define IMAGE_SCN_MEM_PURGEABLE 0x00020000 +#define IMAGE_SCN_MEM_16BIT 0x00020000 +#define IMAGE_SCN_MEM_LOCKED 0x00040000 +#define IMAGE_SCN_MEM_PRELOAD 0x00080000 + +/* Bit position in the s_flags field where the alignment values start. */ +#define IMAGE_SCN_ALIGN_POWER_BIT_POS 20 +#define IMAGE_SCN_ALIGN_POWER_BIT_MASK 0x00f00000 +#define IMAGE_SCN_ALIGN_POWER_NUM(val) \ + (((val) >> IMAGE_SCN_ALIGN_POWER_BIT_POS) - 1) +#define IMAGE_SCN_ALIGN_POWER_CONST(val) \ + (((val) + 1) << IMAGE_SCN_ALIGN_POWER_BIT_POS) + +#define IMAGE_SCN_ALIGN_1BYTES IMAGE_SCN_ALIGN_POWER_CONST (0) +#define IMAGE_SCN_ALIGN_2BYTES IMAGE_SCN_ALIGN_POWER_CONST (1) +#define IMAGE_SCN_ALIGN_4BYTES IMAGE_SCN_ALIGN_POWER_CONST (2) +#define IMAGE_SCN_ALIGN_8BYTES IMAGE_SCN_ALIGN_POWER_CONST (3) +/* Default alignment if no others are specified. */ +#define IMAGE_SCN_ALIGN_16BYTES IMAGE_SCN_ALIGN_POWER_CONST (4) +#define IMAGE_SCN_ALIGN_32BYTES IMAGE_SCN_ALIGN_POWER_CONST (5) +#define IMAGE_SCN_ALIGN_64BYTES IMAGE_SCN_ALIGN_POWER_CONST (6) +#define IMAGE_SCN_ALIGN_128BYTES IMAGE_SCN_ALIGN_POWER_CONST (7) +#define IMAGE_SCN_ALIGN_256BYTES IMAGE_SCN_ALIGN_POWER_CONST (8) +#define IMAGE_SCN_ALIGN_512BYTES IMAGE_SCN_ALIGN_POWER_CONST (9) +#define IMAGE_SCN_ALIGN_1024BYTES IMAGE_SCN_ALIGN_POWER_CONST (10) +#define IMAGE_SCN_ALIGN_2048BYTES IMAGE_SCN_ALIGN_POWER_CONST (11) +#define IMAGE_SCN_ALIGN_4096BYTES IMAGE_SCN_ALIGN_POWER_CONST (12) +#define IMAGE_SCN_ALIGN_8192BYTES IMAGE_SCN_ALIGN_POWER_CONST (13) + +/* Encode alignment power into IMAGE_SCN_ALIGN bits of s_flags */ +#define COFF_ENCODE_ALIGNMENT(SECTION, ALIGNMENT_POWER) \ + ((SECTION).s_flags |= IMAGE_SCN_ALIGN_POWER_CONST ((ALIGNMENT_POWER))) + +#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */ +#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */ +#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */ +#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */ + +/* COMDAT selection codes. */ + +#define IMAGE_COMDAT_SELECT_NODUPLICATES (1) /* Warn if duplicates. */ +#define IMAGE_COMDAT_SELECT_ANY (2) /* No warning. */ +#define IMAGE_COMDAT_SELECT_SAME_SIZE (3) /* Warn if different size. */ +#define IMAGE_COMDAT_SELECT_EXACT_MATCH (4) /* Warn if different. */ +#define IMAGE_COMDAT_SELECT_ASSOCIATIVE (5) /* Base on other section. */ + +/* Machine numbers. */ + +#define IMAGE_FILE_MACHINE_UNKNOWN 0x0000 +#define IMAGE_FILE_MACHINE_ALPHA 0x0184 +#define IMAGE_FILE_MACHINE_ALPHA64 0x0284 +#define IMAGE_FILE_MACHINE_AM33 0x01d3 +#define IMAGE_FILE_MACHINE_AMD64 0x8664 +#define IMAGE_FILE_MACHINE_ARM 0x01c0 +#define IMAGE_FILE_MACHINE_AXP64 IMAGE_FILE_MACHINE_ALPHA64 +#define IMAGE_FILE_MACHINE_CEE 0xc0ee +#define IMAGE_FILE_MACHINE_CEF 0x0cef +#define IMAGE_FILE_MACHINE_EBC 0x0ebc +#define IMAGE_FILE_MACHINE_I386 0x014c +#define IMAGE_FILE_MACHINE_IA64 0x0200 +#define IMAGE_FILE_MACHINE_M32R 0x9041 +#define IMAGE_FILE_MACHINE_M68K 0x0268 +#define IMAGE_FILE_MACHINE_MIPS16 0x0266 +#define IMAGE_FILE_MACHINE_MIPSFPU 0x0366 +#define IMAGE_FILE_MACHINE_MIPSFPU16 0x0466 +#define IMAGE_FILE_MACHINE_POWERPC 0x01f0 +#define IMAGE_FILE_MACHINE_POWERPCFP 0x01f1 +#define IMAGE_FILE_MACHINE_R10000 0x0168 +#define IMAGE_FILE_MACHINE_R3000 0x0162 +#define IMAGE_FILE_MACHINE_R4000 0x0166 +#define IMAGE_FILE_MACHINE_SH3 0x01a2 +#define IMAGE_FILE_MACHINE_SH3DSP 0x01a3 +#define IMAGE_FILE_MACHINE_SH3E 0x01a4 +#define IMAGE_FILE_MACHINE_SH4 0x01a6 +#define IMAGE_FILE_MACHINE_SH5 0x01a8 +#define IMAGE_FILE_MACHINE_THUMB 0x01c2 +#define IMAGE_FILE_MACHINE_TRICORE 0x0520 +#define IMAGE_FILE_MACHINE_WCEMIPSV2 0x0169 +#define IMAGE_FILE_MACHINE_AMD64 0x8664 + +#define IMAGE_SUBSYSTEM_UNKNOWN 0 +#define IMAGE_SUBSYSTEM_NATIVE 1 +#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 +#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 +#define IMAGE_SUBSYSTEM_POSIX_CUI 7 +#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9 +#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 +#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 +#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 +#define IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER 13 +#define IMAGE_SUBSYSTEM_XBOX 14 + +/* Magic values that are true for all dos/nt implementations. */ +#define DOSMAGIC 0x5a4d +#define NT_SIGNATURE 0x00004550 + +/* NT allows long filenames, we want to accommodate this. + This may break some of the bfd functions. */ +#undef FILNMLEN +#define FILNMLEN 18 /* # characters in a file name. */ + +struct external_PEI_DOS_hdr +{ + /* DOS header fields - always at offset zero in the EXE file. */ + char e_magic[2]; /* Magic number, 0x5a4d. */ + char e_cblp[2]; /* Bytes on last page of file, 0x90. */ + char e_cp[2]; /* Pages in file, 0x3. */ + char e_crlc[2]; /* Relocations, 0x0. */ + char e_cparhdr[2]; /* Size of header in paragraphs, 0x4. */ + char e_minalloc[2]; /* Minimum extra paragraphs needed, 0x0. */ + char e_maxalloc[2]; /* Maximum extra paragraphs needed, 0xFFFF. */ + char e_ss[2]; /* Initial (relative) SS value, 0x0. */ + char e_sp[2]; /* Initial SP value, 0xb8. */ + char e_csum[2]; /* Checksum, 0x0. */ + char e_ip[2]; /* Initial IP value, 0x0. */ + char e_cs[2]; /* Initial (relative) CS value, 0x0. */ + char e_lfarlc[2]; /* File address of relocation table, 0x40. */ + char e_ovno[2]; /* Overlay number, 0x0. */ + char e_res[4][2]; /* Reserved words, all 0x0. */ + char e_oemid[2]; /* OEM identifier (for e_oeminfo), 0x0. */ + char e_oeminfo[2]; /* OEM information; e_oemid specific, 0x0. */ + char e_res2[10][2]; /* Reserved words, all 0x0. */ + char e_lfanew[4]; /* File address of new exe header, usually 0x80. */ + char dos_message[16][4]; /* Other stuff, always follow DOS header. */ +}; + +struct external_PEI_IMAGE_hdr +{ + char nt_signature[4]; /* required NT signature, 0x4550. */ + + /* From standard header. */ + char f_magic[2]; /* Magic number. */ + char f_nscns[2]; /* Number of sections. */ + char f_timdat[4]; /* Time & date stamp. */ + char f_symptr[4]; /* File pointer to symtab. */ + char f_nsyms[4]; /* Number of symtab entries. */ + char f_opthdr[2]; /* Sizeof(optional hdr). */ + char f_flags[2]; /* Flags. */ +}; + +struct external_PEI_filehdr +{ + /* DOS header fields - always at offset zero in the EXE file. */ + char e_magic[2]; /* Magic number, 0x5a4d. */ + char e_cblp[2]; /* Bytes on last page of file, 0x90. */ + char e_cp[2]; /* Pages in file, 0x3. */ + char e_crlc[2]; /* Relocations, 0x0. */ + char e_cparhdr[2]; /* Size of header in paragraphs, 0x4. */ + char e_minalloc[2]; /* Minimum extra paragraphs needed, 0x0. */ + char e_maxalloc[2]; /* Maximum extra paragraphs needed, 0xFFFF. */ + char e_ss[2]; /* Initial (relative) SS value, 0x0. */ + char e_sp[2]; /* Initial SP value, 0xb8. */ + char e_csum[2]; /* Checksum, 0x0. */ + char e_ip[2]; /* Initial IP value, 0x0. */ + char e_cs[2]; /* Initial (relative) CS value, 0x0. */ + char e_lfarlc[2]; /* File address of relocation table, 0x40. */ + char e_ovno[2]; /* Overlay number, 0x0. */ + char e_res[4][2]; /* Reserved words, all 0x0. */ + char e_oemid[2]; /* OEM identifier (for e_oeminfo), 0x0. */ + char e_oeminfo[2]; /* OEM information; e_oemid specific, 0x0. */ + char e_res2[10][2]; /* Reserved words, all 0x0. */ + char e_lfanew[4]; /* File address of new exe header, usually 0x80. */ + char dos_message[16][4]; /* Other stuff, always follow DOS header. */ + + /* Note: additional bytes may be inserted before the signature. Use + the e_lfanew field to find the actual location of the NT signature. */ + + char nt_signature[4]; /* required NT signature, 0x4550. */ + + /* From standard header. */ + char f_magic[2]; /* Magic number. */ + char f_nscns[2]; /* Number of sections. */ + char f_timdat[4]; /* Time & date stamp. */ + char f_symptr[4]; /* File pointer to symtab. */ + char f_nsyms[4]; /* Number of symtab entries. */ + char f_opthdr[2]; /* Sizeof(optional hdr). */ + char f_flags[2]; /* Flags. */ +}; + +#ifdef COFF_IMAGE_WITH_PE + +/* The filehdr is only weird in images. */ + +#undef FILHDR +#define FILHDR struct external_PEI_filehdr +#undef FILHSZ +#define FILHSZ 152 + +#endif /* COFF_IMAGE_WITH_PE */ + +/* 32-bit PE a.out header: */ + +typedef struct +{ + AOUTHDR standard; + + /* NT extra fields; see internal.h for descriptions. */ + char ImageBase[4]; + char SectionAlignment[4]; + char FileAlignment[4]; + char MajorOperatingSystemVersion[2]; + char MinorOperatingSystemVersion[2]; + char MajorImageVersion[2]; + char MinorImageVersion[2]; + char MajorSubsystemVersion[2]; + char MinorSubsystemVersion[2]; + char Reserved1[4]; + char SizeOfImage[4]; + char SizeOfHeaders[4]; + char CheckSum[4]; + char Subsystem[2]; + char DllCharacteristics[2]; + char SizeOfStackReserve[4]; + char SizeOfStackCommit[4]; + char SizeOfHeapReserve[4]; + char SizeOfHeapCommit[4]; + char LoaderFlags[4]; + char NumberOfRvaAndSizes[4]; + /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ + char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars. */ +} PEAOUTHDR; + +#undef AOUTSZ +#define AOUTSZ (AOUTHDRSZ + 196) + +/* Like PEAOUTHDR, except that the "standard" member has no BaseOfData + (aka data_start) member and that some of the members are 8 instead + of just 4 bytes long. */ +typedef struct +{ +#ifdef AOUTHDRSZ64 + AOUTHDR64 standard; +#else + AOUTHDR standard; +#endif + /* NT extra fields; see internal.h for descriptions. */ + char ImageBase[8]; + char SectionAlignment[4]; + char FileAlignment[4]; + char MajorOperatingSystemVersion[2]; + char MinorOperatingSystemVersion[2]; + char MajorImageVersion[2]; + char MinorImageVersion[2]; + char MajorSubsystemVersion[2]; + char MinorSubsystemVersion[2]; + char Reserved1[4]; + char SizeOfImage[4]; + char SizeOfHeaders[4]; + char CheckSum[4]; + char Subsystem[2]; + char DllCharacteristics[2]; + char SizeOfStackReserve[8]; + char SizeOfStackCommit[8]; + char SizeOfHeapReserve[8]; + char SizeOfHeapCommit[8]; + char LoaderFlags[4]; + char NumberOfRvaAndSizes[4]; + /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */ + char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars. */ +} PEPAOUTHDR; + +#ifdef AOUTHDRSZ64 +#define PEPAOUTSZ (AOUTHDRSZ64 + 196 + 5 * 4) /* = 240 */ +#else +#define PEPAOUTSZ 240 +#endif + +#undef E_FILNMLEN +#define E_FILNMLEN 18 /* # characters in a file name. */ + +/* Import Tyoes fot ILF format object files.. */ +#define IMPORT_CODE 0 +#define IMPORT_DATA 1 +#define IMPORT_CONST 2 + +/* Import Name Tyoes for ILF format object files. */ +#define IMPORT_ORDINAL 0 +#define IMPORT_NAME 1 +#define IMPORT_NAME_NOPREFIX 2 +#define IMPORT_NAME_UNDECORATE 3 + +/* Weak external characteristics. */ +#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 +#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 +#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 + +/* .pdata/.xdata defines and structures for x64 PE+ for exception handling. */ + +/* .pdata in exception directory. */ + +struct pex64_runtime_function +{ + bfd_vma rva_BeginAddress; + bfd_vma rva_EndAddress; + bfd_vma rva_UnwindData; + unsigned int isChained : 1; +}; + +struct external_pex64_runtime_function +{ + bfd_byte rva_BeginAddress[4]; + bfd_byte rva_EndAddress[4]; + bfd_byte rva_UnwindData[4]; +}; + +/* If the lowest significant bit is set for rva_UnwindData RVA, it + means that the unified RVA points to another pex64_runtime_function + that this entry shares the unwind_info block with. */ +#define PEX64_IS_RUNTIME_FUNCTION_CHAINED(PTR_RTF) \ + (((PTR_RTF)->rva_UnwindData & 1) != 0) +#define PEX64_GET_UNWINDDATA_UNIFIED_RVA(PTR_RTF) \ + ((PTR_RTF)->rva_UnwindData & ~1) + +/* The unwind codes. */ +#define UWOP_PUSH_NONVOL 0 +#define UWOP_ALLOC_LARGE 1 +#define UWOP_ALLOC_SMALL 2 +#define UWOP_SET_FPREG 3 +#define UWOP_SAVE_NONVOL 4 +#define UWOP_SAVE_NONVOL_FAR 5 +#define UWOP_SAVE_XMM 6 +#define UWOP_SAVE_XMM_FAR 7 +#define UWOP_SAVE_XMM128 8 +#define UWOP_SAVE_XMM128_FAR 9 +#define UWOP_PUSH_MACHFRAME 10 + +struct pex64_unwind_code +{ + bfd_vma prologue_offset; + /* Contains Frame offset, or frame allocation size. */ + bfd_vma frame_addr; + unsigned int uwop_code : 4; + /* xmm, mm, or standard register from 0 - 15. */ + unsigned int reg : 4; + /* Used for UWOP_PUSH_MACHFRAME to indicate optional errorcode stack + argument. */ + unsigned int has_errorcode : 1; +}; + +struct external_pex64_unwind_code +{ + bfd_byte dta[2]; +}; + +#define PEX64_UNWCODE_CODE(VAL) ((VAL) & 0xf) +#define PEX64_UNWCODE_INFO(VAL) (((VAL) >> 4) & 0xf) + +/* The unwind info. */ +#define UNW_FLAG_NHANDLER 0 +#define UNW_FLAG_EHANDLER 1 +#define UNW_FLAG_UHANDLER 2 +#define UNW_FLAG_FHANDLER 3 +#define UNW_FLAG_CHAININFO 4 + +#define UNW_FLAG_MASK 0x1f + +struct pex64_unwind_info +{ + bfd_vma SizeOfBlock; + bfd_byte Version; /* Values from 0 up to 7 are possible. */ + bfd_byte Flags; /* Values from 0 up to 31 are possible. */ + bfd_vma SizeOfPrologue; + bfd_vma CountOfCodes; /* Amount of pex64_unwind_code elements. */ + /* 0 = CFA, 1..15 are index of integer registers. */ + unsigned int FrameRegister : 4; + bfd_vma FrameOffset; + bfd_vma sizeofUnwindCodes; + bfd_byte *rawUnwindCodes; + /* Valid for UNW_FLAG_EHANDLER and UNW_FLAG_UHANDLER. */ + bfd_vma CountOfScopes; + bfd_byte *rawScopeEntries; + bfd_vma rva_ExceptionHandler; /* UNW_EHANDLER. */ + bfd_vma rva_TerminationHandler; /* UNW_FLAG_UHANDLER. */ + bfd_vma rva_FrameHandler; /* UNW_FLAG_FHANDLER. */ + bfd_vma FrameHandlerArgument; /* UNW_FLAG_FHANDLER. */ + bfd_vma rva_FunctionEntry; /* UNW_FLAG_CHAININFO. */ +}; + +struct external_pex64_unwind_info +{ + bfd_byte Version_Flags; + bfd_byte SizeOfPrologue; + bfd_byte CountOfCodes; + bfd_byte FrameRegisterOffset; + /* external_pex64_unwind_code array. */ + /* bfd_byte handler[4]; */ + /* Optional language specific data. */ +}; + +struct external_pex64_scope +{ + bfd_vma Count; +}; + +struct pex64_scope +{ + bfd_byte Count[4]; +}; + +struct pex64_scope_entry +{ + bfd_vma rva_BeginAddress; + bfd_vma rva_EndAddress; + bfd_vma rva_HandlerAddress; + bfd_vma rva_JumpAddress; +}; +#define PEX64_SCOPE_ENTRY_SIZE 16 + +struct external_pex64_scope_entry +{ + bfd_byte rva_BeginAddress[4]; + bfd_byte rva_EndAddress[4]; + bfd_byte rva_HandlerAddress[4]; + bfd_byte rva_JumpAddress[4]; +}; + +#define PEX64_UWI_VERSION(VAL) ((VAL) & 7) +#define PEX64_UWI_FLAGS(VAL) (((VAL) >> 3) & 0x1f) +#define PEX64_UWI_FRAMEREG(VAL) ((VAL) & 0xf) +#define PEX64_UWI_FRAMEOFF(VAL) (((VAL) >> 4) & 0xf) +#define PEX64_UWI_SIZEOF_UWCODE_ARRAY(VAL) \ + ((((VAL) + 1) & ~1) * 2) + +#define PEX64_OFFSET_TO_UNWIND_CODE 0x4 + +#define PEX64_OFFSET_TO_HANDLER_RVA (COUNTOFUNWINDCODES) \ + (PEX64_OFFSET_TO_UNWIND_CODE + \ + PEX64_UWI_SIZEOF_UWCODE_ARRAY(COUNTOFUNWINDCODES)) + +#define PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) \ + (PEX64_OFFSET_TO_HANDLER_RVA(COUNTOFUNWINDCODES) + 4) + +#define PEX64_SCOPE_ENTRY(COUNTOFUNWINDCODES, IDX) \ + (PEX64_OFFSET_TO_SCOPE_COUNT(COUNTOFUNWINDCODES) + \ + PEX64_SCOPE_ENTRY_SIZE * (IDX)) + +#endif /* _PE_H */ diff --git a/include/coff/powerpc.h b/include/coff/powerpc.h new file mode 100644 index 0000000..eba4730 --- /dev/null +++ b/include/coff/powerpc.h @@ -0,0 +1,59 @@ +/* Basic coff information for the PowerPC + Based on coff/rs6000.h, coff/i386.h and others. + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. + + Initial release: Kim Knuttila (krk@cygnus.com) */ +#define L_LNNO_SIZE 2 +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#include "coff/external.h" + +/* Bits for f_flags: + F_RELFLG relocation info stripped from file + F_EXEC file is executable (no unresolved external references) + F_LNNO line numbers stripped from file + F_LSYMS local symbols stripped from file + F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax). */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) + +/* extra NT defines */ +#define PPCMAGIC 0760 /* peeked on aa PowerPC Windows NT box */ +#define DOSMAGIC 0x5a4d /* from arm.h, i386.h */ +#define NT_SIGNATURE 0x00004550 /* from arm.h, i386.h */ + +/* from winnt.h */ +#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b + +#define PPCBADMAG(x) ((x).f_magic != PPCMAGIC) + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + diff --git a/include/coff/rs6000.h b/include/coff/rs6000.h new file mode 100644 index 0000000..7972d33 --- /dev/null +++ b/include/coff/rs6000.h @@ -0,0 +1,353 @@ +/* IBM RS/6000 "XCOFF" file definitions for BFD. + Copyright (C) 1990, 1991, 2001, 2010 Free Software Foundation, Inc. + Written by Mimi Phuong-Thao Vo of IBM + and John Gilmore of Cygnus Support. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/********************** FILE HEADER **********************/ + +struct external_filehdr { + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ +}; + + /* IBM RS/6000 */ +#define U802WRMAGIC 0730 /* writeable text segments **chh** */ +#define U802ROMAGIC 0735 /* readonly sharable text segments */ +#define U802TOCMAGIC 0737 /* readonly text segments and TOC */ + +#define BADMAG(x) \ + ((x).f_magic != U802ROMAGIC && (x).f_magic != U802WRMAGIC && \ + (x).f_magic != U802TOCMAGIC) + +#define FILHDR struct external_filehdr +#define FILHSZ 20 + + +/********************** AOUT "OPTIONAL HEADER" **********************/ + + +typedef struct +{ + unsigned char magic[2]; /* type of file */ + unsigned char vstamp[2]; /* version stamp */ + unsigned char tsize[4]; /* text size in bytes, padded to FW bdry */ + unsigned char dsize[4]; /* initialized data " " */ + unsigned char bsize[4]; /* uninitialized data " " */ + unsigned char entry[4]; /* entry pt. */ + unsigned char text_start[4]; /* base of text used for this file */ + unsigned char data_start[4]; /* base of data used for this file */ + unsigned char o_toc[4]; /* address of TOC */ + unsigned char o_snentry[2]; /* section number of entry point */ + unsigned char o_sntext[2]; /* section number of .text section */ + unsigned char o_sndata[2]; /* section number of .data section */ + unsigned char o_sntoc[2]; /* section number of TOC */ + unsigned char o_snloader[2]; /* section number of .loader section */ + unsigned char o_snbss[2]; /* section number of .bss section */ + unsigned char o_algntext[2]; /* .text alignment */ + unsigned char o_algndata[2]; /* .data alignment */ + unsigned char o_modtype[2]; /* module type (??) */ + unsigned char o_cputype[2]; /* cpu type */ + unsigned char o_maxstack[4]; /* max stack size (??) */ + unsigned char o_maxdata[4]; /* max data size (??) */ + unsigned char o_resv2[12]; /* reserved */ +} +AOUTHDR; + +#define AOUTSZ 72 +#define SMALL_AOUTSZ (28) +#define AOUTHDRSZ 72 + +/********************** SECTION HEADER **********************/ + + +struct external_scnhdr { + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[2]; /* number of relocation entries */ + char s_nlnno[2]; /* number of line number entries*/ + char s_flags[4]; /* flags */ +}; + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 40 + +/********************** LINE NUMBERS **********************/ + +/* 1 line number entry for every "breakpointable" source line in a section. + * Line numbers are grouped on a per function basis; first entry in a function + * grouping will have l_lnno = 0 and in place of physical address will be the + * symbol table index of the function name. + */ +struct external_lineno { + union { + char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ + char l_paddr[4]; /* (physical) address of line number */ + } l_addr; + char l_lnno[2]; /* line number */ +}; + + +#define LINENO struct external_lineno +#define LINESZ 6 + + +/********************** SYMBOLS **********************/ + +#define E_SYMNMLEN 8 /* # characters in a symbol name */ +#define E_FILNMLEN 14 /* # characters in a file name */ +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + union { + char e_name[E_SYMNMLEN]; + struct { + char e_zeroes[4]; + char e_offset[4]; + } e; + } e; + char e_value[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; +}; + + + +#define N_BTMASK (017) +#define N_TMASK (060) +#define N_BTSHFT (4) +#define N_TSHIFT (2) + + +union external_auxent { + struct { + char x_tagndx[4]; /* str, un, or enum tag indx */ + union { + struct { + char x_lnno[2]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } x_lnsz; + char x_fsize[4]; /* size of function */ + } x_misc; + union { + struct { /* if ISFCN, tag, or .bb */ + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + struct { /* if ISARY, up to 4 dimen. */ + char x_dimen[E_DIMNUM][2]; + } x_ary; + } x_fcnary; + char x_tvndx[2]; /* tv index */ + } x_sym; + + struct { + union { + char x_fname[E_FILNMLEN]; + struct { + char x_zeroes[4]; + char x_offset[4]; + } x_n; + } x_n; + char x_ftype[1]; + } x_file; + + struct { + char x_scnlen[4]; /* section length */ + char x_nreloc[2]; /* # relocation entries */ + char x_nlinno[2]; /* # line numbers */ + } x_scn; + + struct { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ + + struct { + unsigned char x_scnlen[4]; + unsigned char x_parmhash[4]; + unsigned char x_snhash[2]; + unsigned char x_smtyp[1]; + unsigned char x_smclas[1]; + unsigned char x_stab[4]; + unsigned char x_snstab[2]; + } x_csect; + +}; + +#define SYMENT struct external_syment +#define SYMESZ 18 +#define AUXENT union external_auxent +#define AUXESZ 18 +#define DBXMASK 0x80 /* for dbx storage mask */ +#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) + + + +/********************** RELOCATION DIRECTIVES **********************/ + + +struct external_reloc { + char r_vaddr[4]; + char r_symndx[4]; + char r_size[1]; + char r_type[1]; +}; + + +#define RELOC struct external_reloc +#define RELSZ 10 + +#define DEFAULT_DATA_SECTION_ALIGNMENT 4 +#define DEFAULT_BSS_SECTION_ALIGNMENT 4 +#define DEFAULT_TEXT_SECTION_ALIGNMENT 4 +/* For new sections we havn't heard of before */ +#define DEFAULT_SECTION_ALIGNMENT 4 + +/* The ldhdr structure. This appears at the start of the .loader + section. */ + +struct external_ldhdr +{ + bfd_byte l_version[4]; + bfd_byte l_nsyms[4]; + bfd_byte l_nreloc[4]; + bfd_byte l_istlen[4]; + bfd_byte l_nimpid[4]; + bfd_byte l_impoff[4]; + bfd_byte l_stlen[4]; + bfd_byte l_stoff[4]; +}; + +#define LDHDRSZ (8 * 4) + +struct external_ldsym +{ + union + { + bfd_byte _l_name[E_SYMNMLEN]; + struct + { + bfd_byte _l_zeroes[4]; + bfd_byte _l_offset[4]; + } _l_l; + } _l; + bfd_byte l_value[4]; + bfd_byte l_scnum[2]; + bfd_byte l_smtype[1]; + bfd_byte l_smclas[1]; + bfd_byte l_ifile[4]; + bfd_byte l_parm[4]; +}; + +#define LDSYMSZ (8 + 3 * 4 + 2 + 2) + +struct external_ldrel +{ + bfd_byte l_vaddr[4]; + bfd_byte l_symndx[4]; + bfd_byte l_rtype[2]; + bfd_byte l_rsecnm[2]; +}; + +#define LDRELSZ (2 * 4 + 2 * 2) + +struct external_exceptab +{ + union { + bfd_byte e_symndx[4]; + bfd_byte e_paddr[4]; + } e_addr; + bfd_byte e_lang[1]; + bfd_byte e_reason[1]; +}; + +#define EXCEPTSZ (4 + 2) + +/******************** Core files *************************/ + +struct external_core_dumpx +{ + unsigned char c_signo[1]; + unsigned char c_flag[1]; + unsigned char c_entries[2]; + + unsigned char c_version[4]; + + unsigned char c_fdsinfox[8]; + unsigned char c_loader[8]; + unsigned char c_lsize[8]; + + unsigned char c_n_thr[4]; + unsigned char c_reserved0[4]; + unsigned char c_thr[8]; + + unsigned char c_segs[8]; + unsigned char c_segregion[8]; + + unsigned char c_stack[8]; + unsigned char c_stackorg[8]; + unsigned char c_size[8]; + + unsigned char c_data[8]; + unsigned char c_dataorg[8]; + unsigned char c_datasize[8]; + unsigned char c_sdorg[8]; + unsigned char c_sdsize[8]; + + unsigned char c_vmmregions[8]; + unsigned char c_vmm[8]; + + unsigned char c_impl[4]; + unsigned char c_pad[4]; + unsigned char c_cprs[8]; + unsigned char c_reserved[7 * 8]; + + /* Followed by: + - context of the faulting thread. + - user structure. */ +}; + + +/* Core file verion. */ +#define CORE_DUMPX_VERSION 0x0feeddb1 +#define CORE_DUMPXX_VERSION 0x0feeddb2 + +struct external_ld_info32 +{ + unsigned char ldinfo_next[4]; + unsigned char core_offset[4]; + unsigned char ldinfo_textorg[4]; + unsigned char ldinfo_textsize[4]; + unsigned char ldinfo_dataorg[4]; + unsigned char ldinfo_datasize[4]; + unsigned char ldinfo_filename[2]; +}; diff --git a/include/coff/rs6k64.h b/include/coff/rs6k64.h new file mode 100644 index 0000000..453198a --- /dev/null +++ b/include/coff/rs6k64.h @@ -0,0 +1,275 @@ +/* IBM RS/6000 "XCOFF64" file definitions for BFD. + Copyright (C) 2000, 2001, 2002, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/********************** FILE HEADER **********************/ + +struct external_filehdr +{ + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[8]; /* file pointer to symtab */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ + char f_nsyms[4]; /* number of symtab entries */ +}; + +/* IBM RS/6000. */ +#define U803XTOCMAGIC 0757 /* Aix 4.3 64-bit XCOFF */ +#define U64_TOCMAGIC 0767 /* AIX 5+ 64-bit XCOFF */ +#define BADMAG(x) ((x).f_magic != U803XTOCMAGIC && (x).f_magic != U64_TOCMAGIC) + +#define FILHDR struct external_filehdr +#define FILHSZ 24 + +/********************** AOUT "OPTIONAL HEADER" **********************/ + +typedef struct +{ + unsigned char magic[2]; /* type of file */ + unsigned char vstamp[2]; /* version stamp */ + unsigned char o_debugger[4]; /* reserved */ + unsigned char text_start[8]; /* base of text used for this file */ + unsigned char data_start[8]; /* base of data used for this file */ + unsigned char o_toc[8]; /* address of TOC */ + unsigned char o_snentry[2]; /* section number of entry point */ + unsigned char o_sntext[2]; /* section number of .text section */ + unsigned char o_sndata[2]; /* section number of .data section */ + unsigned char o_sntoc[2]; /* section number of TOC */ + unsigned char o_snloader[2]; /* section number of .loader section */ + unsigned char o_snbss[2]; /* section number of .bss section */ + unsigned char o_algntext[2]; /* .text alignment */ + unsigned char o_algndata[2]; /* .data alignment */ + unsigned char o_modtype[2]; /* module type (??) */ + unsigned char o_cputype[2]; /* cpu type */ + unsigned char o_resv2[4]; /* reserved */ + unsigned char tsize[8]; /* text size bytes, padded to FW bdry */ + unsigned char dsize[8]; /* initialized data " " */ + unsigned char bsize[8]; /* uninitialized data " " */ + unsigned char entry[8]; /* entry pt. */ + unsigned char o_maxstack[8]; /* max stack size (??) */ + unsigned char o_maxdata[8]; /* max data size (??) */ + unsigned char o_resv3[16]; /* reserved */ +} +AOUTHDR; + +#define AOUTSZ 120 +#define SMALL_AOUTSZ (0) +#define AOUTHDRSZ 72 + +/********************** SECTION HEADER **********************/ + +struct external_scnhdr +{ + char s_name[8]; /* section name */ + char s_paddr[8]; /* physical address, aliased s_nlib */ + char s_vaddr[8]; /* virtual address */ + char s_size[8]; /* section size */ + char s_scnptr[8]; /* file ptr to raw data for section */ + char s_relptr[8]; /* file ptr to relocation */ + char s_lnnoptr[8]; /* file ptr to line numbers */ + char s_nreloc[4]; /* number of relocation entries */ + char s_nlnno[4]; /* number of line number entries*/ + char s_flags[4]; /* flags */ + char s_pad[4]; /* padding */ +}; + +#define SCNHDR struct external_scnhdr + +#define SCNHSZ 72 + +/********************** LINE NUMBERS **********************/ + +/* 1 line number entry for every "breakpointable" source line in a section. + Line numbers are grouped on a per function basis; first entry in a function + grouping will have l_lnno = 0 and in place of physical address will be the + symbol table index of the function name. */ + +struct external_lineno +{ + union + { + char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ + char l_paddr[8]; /* (physical) address of line number */ + } l_addr; + + char l_lnno[4]; /* line number */ +}; + +#define LINENO struct external_lineno + +#define LINESZ 12 + +/********************** SYMBOLS **********************/ + +#define E_SYMNMLEN 8 /* # characters in a symbol name */ +#define E_FILNMLEN 14 /* # characters in a file name */ +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + char e_value[8]; + char e_offset[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; +}; + +#define N_BTMASK (017) +#define N_TMASK (060) +#define N_BTSHFT (4) +#define N_TSHIFT (2) + +union external_auxent +{ + struct { + union { + struct { + char x_lnno[4]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } x_lnsz; + struct { + char x_lnnoptr[8];/* ptr to fcn line */ + char x_fsize[4]; /* size of function */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + } x_fcnary; + } x_sym; + + struct { + union { + char x_fname[E_FILNMLEN]; + struct { + char x_zeroes[4]; + char x_offset[4]; + char x_pad[6]; + } x_n; + } x_n; + unsigned char x_ftype[1]; + unsigned char x_resv[2]; + } x_file; + + struct { + char x_exptr[8]; + char x_fsize[4]; + char x_endndx[4]; + char x_pad[1]; + } x_except; + + struct { + unsigned char x_scnlen_lo[4]; + unsigned char x_parmhash[4]; + unsigned char x_snhash[2]; + unsigned char x_smtyp[1]; + unsigned char x_smclas[1]; + unsigned char x_scnlen_hi[4]; + unsigned char x_pad[1]; + } x_csect; + + struct { + char x_pad[17]; + char x_auxtype[1]; + } x_auxtype; +}; + +#define SYMENT struct external_syment +#define SYMESZ 18 +#define AUXENT union external_auxent +#define AUXESZ 18 +#define DBXMASK 0x80 /* for dbx storage mask */ +#define SYMNAME_IN_DEBUG(symptr) ((symptr)->n_sclass & DBXMASK) + +/* Values for auxtype field in XCOFF64, taken from AIX 4.3 sym.h. */ +#define _AUX_EXCEPT 255 +#define _AUX_FCN 254 +#define _AUX_SYM 253 +#define _AUX_FILE 252 +#define _AUX_CSECT 251 + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[8]; + char r_symndx[4]; + char r_size[1]; + char r_type[1]; +}; + +#define RELOC struct external_reloc +#define RELSZ 14 + +#define DEFAULT_DATA_SECTION_ALIGNMENT 4 +#define DEFAULT_BSS_SECTION_ALIGNMENT 4 +#define DEFAULT_TEXT_SECTION_ALIGNMENT 4 +/* For new sections we havn't heard of before */ +#define DEFAULT_SECTION_ALIGNMENT 4 + +/* The ldhdr structure. This appears at the start of the .loader + section. */ + +struct external_ldhdr +{ + bfd_byte l_version[4]; + bfd_byte l_nsyms[4]; + bfd_byte l_nreloc[4]; + bfd_byte l_istlen[4]; + bfd_byte l_nimpid[4]; + bfd_byte l_stlen[4]; + bfd_byte l_impoff[8]; + bfd_byte l_stoff[8]; + bfd_byte l_symoff[8]; + bfd_byte l_rldoff[8]; +}; +#define LDHDRSZ (56) + +struct external_ldsym +{ + bfd_byte l_value[8]; + bfd_byte l_offset[4]; + bfd_byte l_scnum[2]; + bfd_byte l_smtype[1]; + bfd_byte l_smclas[1]; + bfd_byte l_ifile[4]; + bfd_byte l_parm[4]; +}; + +#define LDSYMSZ (24) + +struct external_ldrel +{ + bfd_byte l_vaddr[8]; + bfd_byte l_rtype[2]; + bfd_byte l_rsecnm[2]; + bfd_byte l_symndx[4]; +}; + +#define LDRELSZ (16) + +struct external_exceptab +{ + union { + bfd_byte e_symndx[4]; + bfd_byte e_paddr[8]; + } e_addr; + bfd_byte e_lang[1]; + bfd_byte e_reason[1]; +}; + +#define EXCEPTSZ (10) diff --git a/include/coff/sh.h b/include/coff/sh.h new file mode 100644 index 0000000..bf13104 --- /dev/null +++ b/include/coff/sh.h @@ -0,0 +1,148 @@ +/* coff information for Renesas SH + + Copyright 2000, 2003, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifdef COFF_WITH_PE +#define L_LNNO_SIZE 2 +#else +#define L_LNNO_SIZE 4 +#endif +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT +#include "coff/external.h" + +#define SH_ARCH_MAGIC_BIG 0x0500 +#define SH_ARCH_MAGIC_LITTLE 0x0550 /* Little endian SH */ +#define SH_ARCH_MAGIC_WINCE 0x01a2 /* Windows CE - little endian */ +#define SH_PE_MAGIC 0x010b + +#define SHBADMAG(x) \ + (((x).f_magic != SH_ARCH_MAGIC_BIG) && \ + ((x).f_magic != SH_ARCH_MAGIC_WINCE) && \ + ((x).f_magic != SH_ARCH_MAGIC_LITTLE)) + +/* Define some NT default values. */ +/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the h8 don't have room in the instruction for the entire + offset - eg the strange jump and high page addressing modes. */ + +#ifndef COFF_WITH_PE +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; +#else +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; +#endif + +#define RELOC struct external_reloc +#ifdef COFF_WITH_PE +#define RELSZ 10 +#else +#define RELSZ 16 +#endif + +/* SH relocation types. Not all of these are actually used. */ + +#define R_SH_UNUSED 0 /* only used internally */ +#define R_SH_IMM32CE 2 /* 32 bit immediate for WinCE */ +#define R_SH_PCREL8 3 /* 8 bit pcrel */ +#define R_SH_PCREL16 4 /* 16 bit pcrel */ +#define R_SH_HIGH8 5 /* high 8 bits of 24 bit address */ +#define R_SH_LOW16 7 /* low 16 bits of 24 bit immediate */ +#define R_SH_IMM24 6 /* 24 bit immediate */ +#define R_SH_PCDISP8BY4 9 /* PC rel 8 bits *4 +ve */ +#define R_SH_PCDISP8BY2 10 /* PC rel 8 bits *2 +ve */ +#define R_SH_PCDISP8 11 /* 8 bit branch */ +#define R_SH_PCDISP 12 /* 12 bit branch */ +#define R_SH_IMM32 14 /* 32 bit immediate */ +#define R_SH_IMM8 16 /* 8 bit immediate */ +#define R_SH_IMAGEBASE 16 /* Windows CE */ +#define R_SH_IMM8BY2 17 /* 8 bit immediate *2 */ +#define R_SH_IMM8BY4 18 /* 8 bit immediate *4 */ +#define R_SH_IMM4 19 /* 4 bit immediate */ +#define R_SH_IMM4BY2 20 /* 4 bit immediate *2 */ +#define R_SH_IMM4BY4 21 /* 4 bit immediate *4 */ +#define R_SH_PCRELIMM8BY2 22 /* PC rel 8 bits *2 unsigned */ +#define R_SH_PCRELIMM8BY4 23 /* PC rel 8 bits *4 unsigned */ +#define R_SH_IMM16 24 /* 16 bit immediate */ + +/* The switch table reloc types are used for relaxing. They are + generated for expressions such as + .word L1 - L2 + The r_offset field holds the difference between the reloc address + and L2. */ +#define R_SH_SWITCH8 33 /* 8 bit switch table entry */ +#define R_SH_SWITCH16 25 /* 16 bit switch table entry */ +#define R_SH_SWITCH32 26 /* 32 bit switch table entry */ + +/* The USES reloc type is used for relaxing. The compiler will + generate .uses pseudo-ops when it finds a function call which it + can relax. The r_offset field of the USES reloc holds the PC + relative offset to the instruction which loads the register used in + the function call. */ +#define R_SH_USES 27 /* .uses pseudo-op */ + +/* The COUNT reloc type is used for relaxing. The assembler will + generate COUNT relocs for addresses referred to by the register + loads associated with USES relocs. The r_offset field of the COUNT + reloc holds the number of times the address is referenced in the + object file. */ +#define R_SH_COUNT 28 /* Count of constant pool uses */ + +/* The ALIGN reloc type is used for relaxing. The r_offset field is + the power of two to which subsequent portions of the object file + must be aligned. */ +#define R_SH_ALIGN 29 /* .align pseudo-op */ + +/* The CODE and DATA reloc types are used for aligning load and store + instructions. The assembler will generate a CODE reloc before a + block of instructions. It will generate a DATA reloc before data. + A section should be processed assuming it contains data, unless a + CODE reloc is seen. The only relevant pieces of information in the + CODE and DATA relocs are the section and the address. The symbol + and offset are meaningless. */ +#define R_SH_CODE 30 /* start of code */ +#define R_SH_DATA 31 /* start of data */ + +/* The LABEL reloc type is used for aligning load and store + instructions. The assembler will generate a LABEL reloc for each + label within a block of instructions. This permits the linker to + avoid swapping instructions which are the targets of branches. */ +#define R_SH_LABEL 32 /* label */ + +/* NB: R_SH_SWITCH8 is 33 */ + +#define R_SH_LOOP_START 34 +#define R_SH_LOOP_END 35 diff --git a/include/coff/sparc.h b/include/coff/sparc.h new file mode 100644 index 0000000..fa94c5f --- /dev/null +++ b/include/coff/sparc.h @@ -0,0 +1,156 @@ +/* coff information for Sparc. + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is an amalgamation of several standard include files that + define coff format, such as filehdr.h, aouthdr.h, and so forth. In + addition, all datatypes have been translated into character arrays of + (presumed) equivalent size. This is necessary so that this file can + be used with different systems while still yielding the same results. */ + +#define L_LNNO_SIZE 2 +#define DO_NOT_DEFINE_SYMENT +#define DO_NOT_DEFINE_AUXENT +#include "coff/external.h" + +#define F_RELFLG (0x0001) /* relocation info stripped */ +#define F_EXEC (0x0002) /* file is executable */ +#define F_LNNO (0x0004) /* line numbers stripped */ +#define F_LSYMS (0x0008) /* local symbols stripped */ + +#define SPARCMAGIC (0540) + +/* This is Lynx's all-platform magic number for executables. */ + +#define LYNXCOFFMAGIC (0415) + +#define OMAGIC 0404 /* object files, eg as output */ +#define ZMAGIC 0413 /* demand load format, eg normal ld output */ +#define STMAGIC 0401 /* target shlib */ +#define SHMAGIC 0443 /* host shlib */ + +/* More names of "special" sections. */ + +#define _TV ".tv" +#define _INIT ".init" +#define _FINI ".fini" + +/********************** SYMBOLS **********************/ + +#define E_SYMNMLEN (8) /* # characters in a symbol name */ +#define E_FILNMLEN (14) /* # characters in a file name */ +#define E_DIMNUM (4) /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + union { + char e_name[E_SYMNMLEN]; + struct { + char e_zeroes[4]; + char e_offset[4]; + } e; +#if 0 /* of doubtful value */ + char e_nptr[2][4]; + struct { + char e_leading_zero[1]; + char e_dbx_type[1]; + char e_dbx_desc[2]; + } e_dbx; +#endif + } e; + + char e_value[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; + char padding[2]; +}; + +#define N_BTMASK (0xf) +#define N_TMASK (0x30) +#define N_BTSHFT (4) +#define N_TSHIFT (2) + +union external_auxent +{ + struct { + char x_tagndx[4]; /* str, un, or enum tag indx */ + union { + struct { + char x_lnno[2]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } x_lnsz; + char x_fsize[4]; /* size of function */ + } x_misc; + union { + struct { /* if ISFCN, tag, or .bb */ + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + struct { /* if ISARY, up to 4 dimen. */ + char x_dimen[E_DIMNUM][2]; + } x_ary; + } x_fcnary; + char x_tvndx[2]; /* tv index */ + } x_sym; + + union { + char x_fname[E_FILNMLEN]; + struct { + char x_zeroes[4]; + char x_offset[4]; + } x_n; + } x_file; + + struct { + char x_scnlen[4]; /* section length */ + char x_nreloc[2]; /* # relocation entries */ + char x_nlinno[2]; /* # line numbers */ + } x_scn; + + struct { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + } x_tv; /* .tv section info (in auxent of sym .tv)) */ + + char x_fill[20]; /* forces to 20-byte size */ +}; + +#define SYMENT struct external_syment +#define SYMESZ 20 +#define AUXENT union external_auxent +#define AUXESZ 20 + +#define _ETEXT "etext" + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; + char r_spare[2]; + char r_offset[4]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + diff --git a/include/coff/sym.h b/include/coff/sym.h new file mode 100644 index 0000000..76204af --- /dev/null +++ b/include/coff/sym.h @@ -0,0 +1,484 @@ +/* Declarations of internal format of MIPS ECOFF symbols. + Originally contributed by MIPS Computer Systems and Third Eye Software. + Changes contributed by Cygnus Support are in the public domain. + + This file is just aggregated with the files that make up the GNU + release; it is not considered part of GAS, GDB, or other GNU + programs. */ + +/* + * |-----------------------------------------------------------| + * | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.| + * | MIPS Computer Systems, Inc. grants reproduction and use | + * | rights to all parties, PROVIDED that this comment is | + * | maintained in the copy. | + * |-----------------------------------------------------------| + */ +#ifndef _SYM_H +#define _SYM_H + +/* (C) Copyright 1984 by Third Eye Software, Inc. + * + * Third Eye Software, Inc. grants reproduction and use rights to + * all parties, PROVIDED that this comment is maintained in the copy. + * + * Third Eye makes no claims about the applicability of this + * symbol table to a particular use. + */ + +/* + * This file contains the definition of the Third Eye Symbol Table. + * + * Symbols are assumed to be in 'encounter order' - i.e. the order that + * the things they represent were encountered by the compiler/assembler/loader. + * EXCEPT for globals! These are assumed to be bunched together, + * probably right after the last 'normal' symbol. Globals ARE sorted + * in ascending order. + * + * ----------------------------------------------------------------------- + * A brief word about Third Eye naming/use conventions: + * + * All arrays and index's are 0 based. + * All "ifooMax" values are the highest legal value PLUS ONE. This makes + * them good for allocating arrays, etc. All checks are "ifoo < ifooMax". + * + * "isym" Index into the SYMbol table. + * "ipd" Index into the Procedure Descriptor array. + * "ifd" Index into the File Descriptor array. + * "iss" Index into String Space. + * "cb" Count of Bytes. + * "rgPd" array whose domain is "0..ipdMax-1" and RanGe is PDR. + * "rgFd" array whose domain is "0..ifdMax-1" and RanGe is FDR. + */ + + +/* + * Symbolic Header (HDR) structure. + * As long as all the pointers are set correctly, + * we don't care WHAT order the various sections come out in! + * + * A file produced solely for the use of CDB will probably NOT have + * any instructions or data areas in it, as these are available + * in the original. + */ + +typedef struct { + short magic; /* to verify validity of the table */ + short vstamp; /* version stamp */ + long ilineMax; /* number of line number entries */ + bfd_vma cbLine; /* number of bytes for line number entries */ + bfd_vma cbLineOffset; /* offset to start of line number entries*/ + long idnMax; /* max index into dense number table */ + bfd_vma cbDnOffset; /* offset to start dense number table */ + long ipdMax; /* number of procedures */ + bfd_vma cbPdOffset; /* offset to procedure descriptor table */ + long isymMax; /* number of local symbols */ + bfd_vma cbSymOffset; /* offset to start of local symbols*/ + long ioptMax; /* max index into optimization symbol entries */ + bfd_vma cbOptOffset; /* offset to optimization symbol entries */ + long iauxMax; /* number of auxillary symbol entries */ + bfd_vma cbAuxOffset; /* offset to start of auxillary symbol entries*/ + long issMax; /* max index into local strings */ + bfd_vma cbSsOffset; /* offset to start of local strings */ + long issExtMax; /* max index into external strings */ + bfd_vma cbSsExtOffset; /* offset to start of external strings */ + long ifdMax; /* number of file descriptor entries */ + bfd_vma cbFdOffset; /* offset to file descriptor table */ + long crfd; /* number of relative file descriptor entries */ + bfd_vma cbRfdOffset; /* offset to relative file descriptor table */ + long iextMax; /* max index into external symbols */ + bfd_vma cbExtOffset; /* offset to start of external symbol entries*/ + /* If you add machine dependent fields, add them here */ + } HDRR, *pHDRR; +#define cbHDRR sizeof(HDRR) +#define hdrNil ((pHDRR)0) + +/* + * The FDR and PDR structures speed mapping of address <-> name. + * They are sorted in ascending memory order and are kept in + * memory by CDB at runtime. + */ + +/* + * File Descriptor + * + * There is one of these for EVERY FILE, whether compiled with + * full debugging symbols or not. The name of a file should be + * the path name given to the compiler. This allows the user + * to simply specify the names of the directories where the COMPILES + * were done, and we will be able to find their files. + * A field whose comment starts with "R - " indicates that it will be + * setup at runtime. + */ +typedef struct fdr { + bfd_vma adr; /* memory address of beginning of file */ + long rss; /* file name (of source, if known) */ + long issBase; /* file's string space */ + bfd_vma cbSs; /* number of bytes in the ss */ + long isymBase; /* beginning of symbols */ + long csym; /* count file's of symbols */ + long ilineBase; /* file's line symbols */ + long cline; /* count of file's line symbols */ + long ioptBase; /* file's optimization entries */ + long copt; /* count of file's optimization entries */ + unsigned short ipdFirst;/* start of procedures for this file */ + short cpd; /* count of procedures for this file */ + long iauxBase; /* file's auxiliary entries */ + long caux; /* count of file's auxiliary entries */ + long rfdBase; /* index into the file indirect table */ + long crfd; /* count file indirect entries */ + unsigned lang: 5; /* language for this file */ + unsigned fMerge : 1; /* whether this file can be merged */ + unsigned fReadin : 1; /* true if it was read in (not just created) */ + unsigned fBigendian : 1;/* if set, was compiled on big endian machine */ + /* aux's will be in compile host's sex */ + unsigned glevel : 2; /* level this file was compiled with */ + unsigned reserved : 22; /* reserved for future use */ + bfd_vma cbLineOffset; /* byte offset from header for this file ln's */ + bfd_vma cbLine; /* size of lines for this file */ + } FDR, *pFDR; +#define cbFDR sizeof(FDR) +#define fdNil ((pFDR)0) +#define ifdNil -1 +#define ifdTemp 0 +#define ilnNil -1 + + +/* + * Procedure Descriptor + * + * There is one of these for EVERY TEXT LABEL. + * If a procedure is in a file with full symbols, then isym + * will point to the PROC symbols, else it will point to the + * global symbol for the label. + */ + +typedef struct pdr { + bfd_vma adr; /* memory address of start of procedure */ + long isym; /* start of local symbol entries */ + long iline; /* start of line number entries*/ + long regmask; /* save register mask */ + long regoffset; /* save register offset */ + long iopt; /* start of optimization symbol entries*/ + long fregmask; /* save floating point register mask */ + long fregoffset; /* save floating point register offset */ + long frameoffset; /* frame size */ + short framereg; /* frame pointer register */ + short pcreg; /* offset or reg of return pc */ + long lnLow; /* lowest line in the procedure */ + long lnHigh; /* highest line in the procedure */ + bfd_vma cbLineOffset; /* byte offset for this procedure from the fd base */ + /* These fields are new for 64 bit ECOFF. */ + unsigned gp_prologue : 8; /* byte size of GP prologue */ + unsigned gp_used : 1; /* true if the procedure uses GP */ + unsigned reg_frame : 1; /* true if register frame procedure */ + unsigned prof : 1; /* true if compiled with -pg */ + unsigned reserved : 13; /* reserved: must be zero */ + unsigned localoff : 8; /* offset of local variables from vfp */ + } PDR, *pPDR; +#define cbPDR sizeof(PDR) +#define pdNil ((pPDR) 0) +#define ipdNil -1 + +/* + * The structure of the runtime procedure descriptor created by the loader + * for use by the static exception system. + */ +/* + * If 0'd out because exception_info chokes Visual C++ and because there + * don't seem to be any references to this structure elsewhere in gdb. + */ +#if 0 +typedef struct runtime_pdr { + bfd_vma adr; /* memory address of start of procedure */ + long regmask; /* save register mask */ + long regoffset; /* save register offset */ + long fregmask; /* save floating point register mask */ + long fregoffset; /* save floating point register offset */ + long frameoffset; /* frame size */ + short framereg; /* frame pointer register */ + short pcreg; /* offset or reg of return pc */ + long irpss; /* index into the runtime string table */ + long reserved; + struct exception_info *exception_info;/* pointer to exception array */ +} RPDR, *pRPDR; +#define cbRPDR sizeof(RPDR) +#define rpdNil ((pRPDR) 0) +#endif + +/* + * Line Numbers + * + * Line Numbers are segregated from the normal symbols because they + * are [1] smaller , [2] are of no interest to your + * average loader, and [3] are never needed in the middle of normal + * scanning and therefore slow things down. + * + * By definition, the first LINER for any given procedure will have + * the first line of a procedure and represent the first address. + */ + +typedef long LINER, *pLINER; +#define lineNil ((pLINER)0) +#define cbLINER sizeof(LINER) +#define ilineNil -1 + + + +/* + * The Symbol Structure (GFW, to those who Know!) + */ + +typedef struct { + long iss; /* index into String Space of name */ + bfd_vma value; /* value of symbol */ + unsigned st : 6; /* symbol type */ + unsigned sc : 5; /* storage class - text, data, etc */ + unsigned reserved : 1; /* reserved */ + unsigned index : 20; /* index into sym/aux table */ + } SYMR, *pSYMR; +#define symNil ((pSYMR)0) +#define cbSYMR sizeof(SYMR) +#define isymNil -1 +#define indexNil 0xfffff +#define issNil -1 +#define issNull 0 + + +/* The following converts a memory resident string to an iss. + * This hack is recognized in SbFIss, in sym.c of the debugger. + */ +#define IssFSb(sb) (0x80000000 | ((unsigned long)(sb))) + +/* E X T E R N A L S Y M B O L R E C O R D + * + * Same as the SYMR except it contains file context to determine where + * the index is. + */ +typedef struct ecoff_extr { + unsigned jmptbl:1; /* symbol is a jump table entry for shlibs */ + unsigned cobol_main:1; /* symbol is a cobol main procedure */ + unsigned weakext:1; /* symbol is weak external */ + unsigned reserved:13; /* reserved for future use */ + int ifd; /* where the iss and index fields point into */ + SYMR asym; /* symbol for the external */ + } EXTR, *pEXTR; +#define extNil ((pEXTR)0) +#define cbEXTR sizeof(EXTR) + + +/* A U X I L L A R Y T Y P E I N F O R M A T I O N */ + +/* + * Type Information Record + */ +typedef struct { + unsigned fBitfield : 1; /* set if bit width is specified */ + unsigned continued : 1; /* indicates additional TQ info in next AUX */ + unsigned bt : 6; /* basic type */ + unsigned tq4 : 4; + unsigned tq5 : 4; + /* ---- 16 bit boundary ---- */ + unsigned tq0 : 4; + unsigned tq1 : 4; /* 6 type qualifiers - tqPtr, etc. */ + unsigned tq2 : 4; + unsigned tq3 : 4; + } TIR, *pTIR; +#define cbTIR sizeof(TIR) +#define tiNil ((pTIR)0) +#define itqMax 6 + +/* + * Relative symbol record + * + * If the rfd field is 4095, the index field indexes into the global symbol + * table. + */ + +typedef struct { + unsigned rfd : 12; /* index into the file indirect table */ + unsigned index : 20; /* index int sym/aux/iss tables */ + } RNDXR, *pRNDXR; +#define cbRNDXR sizeof(RNDXR) +#define rndxNil ((pRNDXR)0) + +/* dense numbers or sometimes called block numbers are stored in this type, + * a rfd of 0xffffffff is an index into the global table. + */ +typedef struct { + unsigned long rfd; /* index into the file table */ + unsigned long index; /* index int sym/aux/iss tables */ + } DNR, *pDNR; +#define cbDNR sizeof(DNR) +#define dnNil ((pDNR)0) + + + +/* + * Auxillary information occurs only if needed. + * It ALWAYS occurs in this order when present. + + isymMac used by stProc only + TIR type info + TIR additional TQ info (if first TIR was not enough) + rndx if (bt == btStruct,btUnion,btEnum,btSet,btRange, + btTypedef): + rsym.index == iaux for btSet or btRange + else rsym.index == isym + dimLow btRange, btSet + dimMac btRange, btSet + rndx0 As many as there are tq arrays + dimLow0 + dimHigh0 + ... + rndxMax-1 + dimLowMax-1 + dimHighMax-1 + width in bits if (bit field), width in bits. + */ +#define cAuxMax (6 + (idimMax*3)) + +/* a union of all possible info in the AUX universe */ +typedef union { + TIR ti; /* type information record */ + RNDXR rndx; /* relative index into symbol table */ + long dnLow; /* low dimension */ + long dnHigh; /* high dimension */ + long isym; /* symbol table index (end of proc) */ + long iss; /* index into string space (not used) */ + long width; /* width for non-default sized struc fields */ + long count; /* count of ranges for variant arm */ + } AUXU, *pAUXU; +#define cbAUXU sizeof(AUXU) +#define auxNil ((pAUXU)0) +#define iauxNil -1 + + +/* + * Optimization symbols + * + * Optimization symbols contain some overlap information with the normal + * symbol table. In particular, the proc information + * is somewhat redundant but necessary to easily find the other information + * present. + * + * All of the offsets are relative to the beginning of the last otProc + */ + +typedef struct { + unsigned ot: 8; /* optimization type */ + unsigned value: 24; /* address where we are moving it to */ + RNDXR rndx; /* points to a symbol or opt entry */ + unsigned long offset; /* relative offset this occured */ + } OPTR, *pOPTR; +#define optNil ((pOPTR) 0) +#define cbOPTR sizeof(OPTR) +#define ioptNil -1 + +/* + * File Indirect + * + * When a symbol is referenced across files the following procedure is used: + * 1) use the file index to get the File indirect entry. + * 2) use the file indirect entry to get the File descriptor. + * 3) add the sym index to the base of that file's sym table + * + */ + +typedef long RFDT, *pRFDT; +#define cbRFDT sizeof(RFDT) +#define rfdNil -1 + +/* + * The file indirect table in the mips loader is known as an array of FITs. + * This is done to keep the code in the loader readable in the area where + * these tables are merged. Note this is only a name change. + */ +typedef long FIT, *pFIT; +#define cbFIT sizeof(FIT) +#define ifiNil -1 +#define fiNil ((pFIT) 0) + +#ifdef _LANGUAGE_PASCAL +#define ifdNil -1 +#define ilnNil -1 +#define ipdNil -1 +#define ilineNil -1 +#define isymNil -1 +#define indexNil 16#fffff +#define issNil -1 +#define issNull 0 +#define itqMax 6 +#define iauxNil -1 +#define ioptNil -1 +#define rfdNil -1 +#define ifiNil -1 +#endif /* _LANGUAGE_PASCAL */ + + +/* Dense numbers + * + * Rather than use file index, symbol index pairs to represent symbols + * and globals, we use dense number so that they can be easily embeded + * in intermediate code and the programs that process them can + * use direct access tabls instead of hash table (which would be + * necesary otherwise because of the sparse name space caused by + * file index, symbol index pairs. Dense number are represented + * by RNDXRs. + */ + +/* + * The following table defines the meaning of each SYM field as + * a function of the "st". (scD/B == scData OR scBss) + * + * Note: the value "isymMac" is used by symbols that have the concept + * of enclosing a block of related information. This value is the + * isym of the first symbol AFTER the end associated with the primary + * symbol. For example if a procedure was at isym==90 and had an + * isymMac==155, the associated end would be at isym==154, and the + * symbol at 155 would probably (although not necessarily) be the + * symbol for the next procedure. This allows rapid skipping over + * internal information of various sorts. "stEnd"s ALWAYS have the + * isym of the primary symbol that started the block. + * + +ST SC VALUE INDEX +-------- ------ -------- ------ +stFile scText address isymMac +stLabel scText address --- +stGlobal scD/B address iaux +stStatic scD/B address iaux +stParam scAbs offset iaux +stLocal scAbs offset iaux +stProc scText address iaux (isymMac is first AUX) +stStaticProc scText address iaux (isymMac is first AUX) + +stMember scNil ordinal --- (if member of enum) + (mipsread thinks the case below has a bit, not byte, offset.) +stMember scNil byte offset iaux (if member of struct/union) +stMember scBits bit offset iaux (bit field spec) + +stBlock scText address isymMac (text block) + (the code seems to think that rather than scNil, we see scInfo for + the two cases below.) +stBlock scNil cb isymMac (struct/union member define) +stBlock scNil cMembers isymMac (enum member define) + + (New types added by SGI to simplify things:) +stStruct scInfo cb isymMac (struct type define) +stUnion scInfo cb isymMac (union type define) +stEnum scInfo cMembers isymMac (enum type define) + +stEnd scText address isymStart +stEnd scNil ------- isymStart (struct/union/enum) + +stTypedef scNil ------- iaux +stRegReloc sc??? value old register number +stForward sc??? new address isym to original symbol + +stConstant scInfo value --- (scalar) +stConstant scInfo iss --- (complex, e.g. string) + + * + */ +#endif diff --git a/include/coff/symconst.h b/include/coff/symconst.h new file mode 100644 index 0000000..ac62ba2 --- /dev/null +++ b/include/coff/symconst.h @@ -0,0 +1,184 @@ +/* Declarations of constants for internal format of MIPS ECOFF symbols. + Originally contributed by MIPS Computer Systems and Third Eye Software. + Changes contributed by Cygnus Support are in the public domain. + + This file is just aggregated with the files that make up the GNU + release; it is not considered part of GAS, GDB, or other GNU + programs. */ + +/* + * |-----------------------------------------------------------| + * | Copyright (c) 1992, 1991, 1990 MIPS Computer Systems, Inc.| + * | MIPS Computer Systems, Inc. grants reproduction and use | + * | rights to all parties, PROVIDED that this comment is | + * | maintained in the copy. | + * |-----------------------------------------------------------| + */ + +/* (C) Copyright 1984 by Third Eye Software, Inc. + * + * Third Eye Software, Inc. grants reproduction and use rights to + * all parties, PROVIDED that this comment is maintained in the copy. + * + * Third Eye makes no claims about the applicability of this + * symbol table to a particular use. + */ + +/* glevels for field in FDR */ +#define GLEVEL_0 2 +#define GLEVEL_1 1 +#define GLEVEL_2 0 /* for upward compat reasons. */ +#define GLEVEL_3 3 + +/* magic number fo symheader */ +#define magicSym 0x7009 +/* The Alpha uses this value instead, for some reason. */ +#define magicSym2 0x1992 + +/* Language codes */ +#define langC 0 +#define langPascal 1 +#define langFortran 2 +#define langAssembler 3 /* one Assembley inst might map to many mach */ +#define langMachine 4 +#define langNil 5 +#define langAda 6 +#define langPl1 7 +#define langCobol 8 +#define langStdc 9 /* FIXME: Collides with SGI langCplusplus */ +#define langCplusplus 9 /* FIXME: Collides with langStdc */ +#define langCplusplusV2 10 /* SGI addition */ +#define langMax 11 /* maximum allowed 32 -- 5 bits */ + +/* The following are value definitions for the fields in the SYMR */ + +/* + * Storage Classes + */ + +#define scNil 0 +#define scText 1 /* text symbol */ +#define scData 2 /* initialized data symbol */ +#define scBss 3 /* un-initialized data symbol */ +#define scRegister 4 /* value of symbol is register number */ +#define scAbs 5 /* value of symbol is absolute */ +#define scUndefined 6 /* who knows? */ +#define scCdbLocal 7 /* variable's value is IN se->va.?? */ +#define scBits 8 /* this is a bit field */ +#define scCdbSystem 9 /* variable's value is IN CDB's address space */ +#define scDbx 9 /* overlap dbx internal use */ +#define scRegImage 10 /* register value saved on stack */ +#define scInfo 11 /* symbol contains debugger information */ +#define scUserStruct 12 /* address in struct user for current process */ +#define scSData 13 /* load time only small data */ +#define scSBss 14 /* load time only small common */ +#define scRData 15 /* load time only read only data */ +#define scVar 16 /* Var parameter (fortran,pascal) */ +#define scCommon 17 /* common variable */ +#define scSCommon 18 /* small common */ +#define scVarRegister 19 /* Var parameter in a register */ +#define scVariant 20 /* Variant record */ +#define scSUndefined 21 /* small undefined(external) data */ +#define scInit 22 /* .init section symbol */ +#define scBasedVar 23 /* Fortran or PL/1 ptr based var */ +#define scXData 24 /* exception handling data */ +#define scPData 25 /* Procedure section */ +#define scFini 26 /* .fini section */ +#define scRConst 27 /* .rconst section */ +#define scMax 32 + + +/* + * Symbol Types + */ + +#define stNil 0 /* Nuthin' special */ +#define stGlobal 1 /* external symbol */ +#define stStatic 2 /* static */ +#define stParam 3 /* procedure argument */ +#define stLocal 4 /* local variable */ +#define stLabel 5 /* label */ +#define stProc 6 /* " " Procedure */ +#define stBlock 7 /* beginnning of block */ +#define stEnd 8 /* end (of anything) */ +#define stMember 9 /* member (of anything - struct/union/enum */ +#define stTypedef 10 /* type definition */ +#define stFile 11 /* file name */ +#define stRegReloc 12 /* register relocation */ +#define stForward 13 /* forwarding address */ +#define stStaticProc 14 /* load time only static procs */ +#define stConstant 15 /* const */ +#define stStaParam 16 /* Fortran static parameters */ + /* These new symbol types have been recently added to SGI machines. */ +#define stStruct 26 /* Beginning of block defining a struct type */ +#define stUnion 27 /* Beginning of block defining a union type */ +#define stEnum 28 /* Beginning of block defining an enum type */ +#define stIndirect 34 /* Indirect type specification */ + /* Pseudo-symbols - internal to debugger */ +#define stStr 60 /* string */ +#define stNumber 61 /* pure number (ie. 4 NOR 2+2) */ +#define stExpr 62 /* 2+2 vs. 4 */ +#define stType 63 /* post-coersion SER */ +#define stMax 64 + +/* definitions for fields in TIR */ + +/* type qualifiers for ti.tq0 -> ti.(itqMax-1) */ +#define tqNil 0 /* bt is what you see */ +#define tqPtr 1 /* pointer */ +#define tqProc 2 /* procedure */ +#define tqArray 3 /* duh */ +#define tqFar 4 /* longer addressing - 8086/8 land */ +#define tqVol 5 /* volatile */ +#define tqConst 6 /* const */ +#define tqMax 8 + +/* basic types as seen in ti.bt */ +#define btNil 0 /* undefined (also, enum members) */ +#define btAdr 1 /* address - integer same size as pointer */ +#define btChar 2 /* character */ +#define btUChar 3 /* unsigned character */ +#define btShort 4 /* short */ +#define btUShort 5 /* unsigned short */ +#define btInt 6 /* int */ +#define btUInt 7 /* unsigned int */ +#define btLong 8 /* long */ +#define btULong 9 /* unsigned long */ +#define btFloat 10 /* float (real) */ +#define btDouble 11 /* Double (real) */ +#define btStruct 12 /* Structure (Record) */ +#define btUnion 13 /* Union (variant) */ +#define btEnum 14 /* Enumerated */ +#define btTypedef 15 /* defined via a typedef, isymRef points */ +#define btRange 16 /* subrange of int */ +#define btSet 17 /* pascal sets */ +#define btComplex 18 /* fortran complex */ +#define btDComplex 19 /* fortran double complex */ +#define btIndirect 20 /* forward or unnamed typedef */ +#define btFixedDec 21 /* Fixed Decimal */ +#define btFloatDec 22 /* Float Decimal */ +#define btString 23 /* Varying Length Character String */ +#define btBit 24 /* Aligned Bit String */ +#define btPicture 25 /* Picture */ +#define btVoid 26 /* void */ +#define btLongLong 27 /* long long */ +#define btULongLong 28 /* unsigned long long */ +#define btLong64 30 /* long (64-bit) */ +#define btULong64 31 /* unsigned long (64-bit) */ +#define btLongLong64 32 /* long long (64-bit) */ +#define btULongLong64 33 /* unsigned long long (64-bit) */ +#define btAdr64 34 /* address (64-bit) */ +#define btInt64 35 /* int (64-bit) */ +#define btUInt64 36 /* unsigned int (64-bit) */ +#define btMax 64 + +#if (_MFG == _MIPS) +/* optimization type codes */ +#define otNil 0 +#define otReg 1 /* move var to reg */ +#define otBlock 2 /* begin basic block */ +#define otProc 3 /* procedure */ +#define otInline 4 /* inline procedure */ +#define otEnd 5 /* whatever you started */ +#define otMax 6 /* KEEP UP TO DATE */ +#endif /* (_MFG == _MIPS) */ diff --git a/include/coff/ti.h b/include/coff/ti.h new file mode 100644 index 0000000..d54b2ed --- /dev/null +++ b/include/coff/ti.h @@ -0,0 +1,561 @@ +/* COFF information for TI COFF support. Definitions in this file should be + customized in a target-specific file, and then this file included (see + tic54x.h for an example). + + Copyright 2000, 2001, 2002, 2003, 2005, 2008, 2009, 2010 + 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef COFF_TI_H +#define COFF_TI_H + +/* Note "coff/external.h is not used because TI adds extra fields to the structures. */ + +/********************** FILE HEADER **********************/ + +struct external_filehdr + { + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ + char f_target_id[2]; /* magic no. (TI COFF-specific) */ + }; + +/* COFF0 has magic number in f_magic, and omits f_target_id from the file + header; for later versions, f_magic is 0xC1 for COFF1 and 0xC2 for COFF2 + and the target-specific magic number is found in f_target_id */ + +#define TICOFF0MAGIC TI_TARGET_ID +#define TICOFF1MAGIC 0x00C1 +#define TICOFF2MAGIC 0x00C2 +#define TICOFF_AOUT_MAGIC 0x0108 /* magic number in optional header */ +#define TICOFF 1 /* customize coffcode.h */ + +/* The target_id field changes depending on the particular CPU target */ +/* for COFF0, the target id appeared in f_magic, where COFFX magic is now */ +#ifndef TI_TARGET_ID +#error "TI_TARGET_ID needs to be defined for your CPU" +#endif + +/* Which bfd_arch to use... */ +#ifndef TICOFF_TARGET_ARCH +#error "TICOFF_TARGET_ARCH needs to be defined for your CPU" +#endif + +#ifndef TICOFF_TARGET_MACHINE_GET +#define TICOFF_TARGET_MACHINE_GET(FLAGS) 0 +#endif + +#ifndef TICOFF_TARGET_MACHINE_SET +#define TICOFF_TARGET_MACHINE_SET(FLAGSP, MACHINE) +#endif + +/* Default to COFF2 for file output */ +#ifndef TICOFF_DEFAULT_MAGIC +#define TICOFF_DEFAULT_MAGIC TICOFF2MAGIC +#endif + +/* This value is made available in the rare case where a bfd is unavailable */ +#ifndef OCTETS_PER_BYTE_POWER +#error "OCTETS_PER_BYTE_POWER not defined for this CPU" +#else +#define OCTETS_PER_BYTE (1<>8)&0xF) + +#define COFF0_P(ABFD) (bfd_coff_filhsz(ABFD) == FILHSZ_V0) +#define COFF2_P(ABFD) (bfd_coff_scnhsz(ABFD) != SCNHSZ_V01) + +#define COFF0_BADMAG(x) ((x).f_magic != TICOFF0MAGIC) +#define COFF1_BADMAG(x) ((x).f_magic != TICOFF1MAGIC || (x).f_target_id != TI_TARGET_ID) +#define COFF2_BADMAG(x) ((x).f_magic != TICOFF2MAGIC || (x).f_target_id != TI_TARGET_ID) + +/* we need to read/write an extra field in the coff file header */ +#ifndef COFF_ADJUST_FILEHDR_IN_POST +#define COFF_ADJUST_FILEHDR_IN_POST(abfd, src, dst) \ + do \ + { \ + if (!COFF0_P (abfd)) \ + ((struct internal_filehdr *)(dst))->f_target_id = \ + H_GET_16 (abfd, ((FILHDR *)(src))->f_target_id); \ + } \ + while (0) +#endif + +#ifndef COFF_ADJUST_FILEHDR_OUT_POST +#define COFF_ADJUST_FILEHDR_OUT_POST(abfd, src, dst) \ + do \ + { \ + if (!COFF0_P (abfd)) \ + H_PUT_16 (abfd, ((struct internal_filehdr *)(src))->f_target_id, \ + ((FILHDR *)(dst))->f_target_id); \ + } \ + while (0) +#endif + +#define FILHDR struct external_filehdr +#define FILHSZ 22 +#define FILHSZ_V0 20 /* COFF0 omits target_id field */ + +/* File header flags */ +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_VERS (0x0010) /* TMS320C4x code */ +/* F_LSYMS needs to be redefined in your source file */ +#define F_LSYMS_TICOFF (0x0010) /* normal COFF is 0x8 */ + +#define F_10 0x00 /* file built for TMS320C1x devices */ +#define F_20 0x10 /* file built for TMS320C2x devices */ +#define F_25 0x20 /* file built for TMS320C2x/C5x devices */ +#define F_LENDIAN 0x0100 /* 16 bits/word, LSB first */ +#define F_SYMMERGE 0x1000 /* duplicate symbols were removed */ + +/********************** OPTIONAL HEADER **********************/ + + +typedef struct +{ + char magic[2]; /* type of file (0x108) */ + char vstamp[2]; /* version stamp */ + char tsize[4]; /* text size in bytes, padded to FW bdry*/ + char dsize[4]; /* initialized data " " */ + char bsize[4]; /* uninitialized data " " */ + char entry[4]; /* entry pt. */ + char text_start[4]; /* base of text used for this file */ + char data_start[4]; /* base of data used for this file */ +} +AOUTHDR; + + +#define AOUTHDRSZ 28 +#define AOUTSZ 28 + + +/********************** SECTION HEADER **********************/ +/* COFF0, COFF1 */ +struct external_scnhdr_v01 { + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size (in WORDS) */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[2]; /* number of relocation entries */ + char s_nlnno[2]; /* number of line number entries*/ + char s_flags[2]; /* flags */ + char s_reserved[1]; /* reserved */ + char s_page[1]; /* section page number (LOAD) */ +}; + +/* COFF2 */ +struct external_scnhdr { + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size (in WORDS) */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[4]; /* number of relocation entries */ + char s_nlnno[4]; /* number of line number entries*/ + char s_flags[4]; /* flags */ + char s_reserved[2]; /* reserved */ + char s_page[2]; /* section page number (LOAD) */ +}; + +/* + * Special section flags + */ + +/* TI COFF defines these flags; + STYP_CLINK: the section should be excluded from the final + linker output if there are no references found to any symbol in the section + STYP_BLOCK: the section should be blocked, i.e. if the section would cross + a page boundary, it is started at a page boundary instead. + TI COFF puts the section alignment power of two in the section flags + e.g. 2**N is alignment, flags |= (N & 0xF) << 8 +*/ +#define STYP_CLINK (0x4000) +#define STYP_BLOCK (0x1000) +#define STYP_ALIGN (0x0F00) /* TI COFF stores section alignment here */ + +#define SCNHDR_V01 struct external_scnhdr_v01 +#define SCNHDR struct external_scnhdr +#define SCNHSZ_V01 40 /* for v0 and v1 */ +#define SCNHSZ 48 + +/* COFF2 changes the offsets and sizes of these fields + Assume we're dealing with the COFF2 scnhdr structure, and adjust + accordingly. Note: The GNU C versions of some of these macros + are necessary in order to avoid compile time warnings triggered + gcc's array bounds checking. The PUT_SCNHDR_PAGE macro also has + the advantage on not evaluating LOC twice. */ + +#define GET_SCNHDR_NRELOC(ABFD, LOC) \ + (COFF2_P (ABFD) ? H_GET_32 (ABFD, LOC) : H_GET_16 (ABFD, LOC)) +#define PUT_SCNHDR_NRELOC(ABFD, VAL, LOC) \ + (COFF2_P (ABFD) ? H_PUT_32 (ABFD, VAL, LOC) : H_PUT_16 (ABFD, VAL, LOC)) +#ifdef __GNUC__ +#define GET_SCNHDR_NLNNO(ABFD, LOC) \ + ({ \ + int nlnno; \ + char * ptr = (LOC); \ + if (COFF2_P (ABFD)) \ + nlnno = H_GET_32 (ABFD, ptr); \ + else \ + nlnno = H_GET_16 (ABFD, ptr - 2); \ + nlnno; \ + }) +#define PUT_SCNHDR_NLNNO(ABFD, VAL, LOC) \ + do \ + { \ + char * ptr = (LOC); \ + if (COFF2_P (ABFD)) \ + H_PUT_32 (ABFD, VAL, ptr); \ + else \ + H_PUT_16 (ABFD, VAL, ptr - 2); \ + } \ + while (0) +#define GET_SCNHDR_FLAGS(ABFD, LOC) \ + ({ \ + int flags; \ + char * ptr = (LOC); \ + if (COFF2_P (ABFD)) \ + flags = H_GET_32 (ABFD, ptr); \ + else \ + flags = H_GET_16 (ABFD, ptr - 4); \ + flags; \ + }) +#define PUT_SCNHDR_FLAGS(ABFD, VAL, LOC) \ + do \ + { \ + char * ptr = (LOC); \ + if (COFF2_P (ABFD)) \ + H_PUT_32 (ABFD, VAL, ptr); \ + else \ + H_PUT_16 (ABFD, VAL, ptr - 4); \ + } \ + while (0) +#define GET_SCNHDR_PAGE(ABFD, LOC) \ + ({ \ + unsigned page; \ + char * ptr = (LOC); \ + if (COFF2_P (ABFD)) \ + page = H_GET_16 (ABFD, ptr); \ + else \ + page = (unsigned) H_GET_8 (ABFD, ptr - 7); \ + page; \ + }) +/* On output, make sure that the "reserved" field is zero. */ +#define PUT_SCNHDR_PAGE(ABFD, VAL, LOC) \ + do \ + { \ + char * ptr = (LOC); \ + if (COFF2_P (ABFD)) \ + H_PUT_16 (ABFD, VAL, ptr); \ + else \ + { \ + H_PUT_8 (ABFD, VAL, ptr - 7); \ + H_PUT_8 (ABFD, 0, ptr - 8); \ + } \ + } \ + while (0) +#else +#define GET_SCNHDR_NLNNO(ABFD, LOC) \ + (COFF2_P (ABFD) ? H_GET_32 (ABFD, LOC) : H_GET_16 (ABFD, (LOC) - 2)) +#define PUT_SCNHDR_NLNNO(ABFD, VAL, LOC) \ + (COFF2_P (ABFD) ? H_PUT_32 (ABFD, VAL, LOC) : H_PUT_16 (ABFD, VAL, (LOC) - 2)) +#define GET_SCNHDR_FLAGS(ABFD, LOC) \ + (COFF2_P (ABFD) ? H_GET_32 (ABFD, LOC) : H_GET_16 (ABFD, (LOC) - 4)) +#define PUT_SCNHDR_FLAGS(ABFD, VAL, LOC) \ + (COFF2_P (ABFD) ? H_PUT_32 (ABFD, VAL, LOC) : H_PUT_16 (ABFD, VAL, (LOC) - 4)) +#define GET_SCNHDR_PAGE(ABFD, LOC) \ + (COFF2_P (ABFD) ? H_GET_16 (ABFD, LOC) : (unsigned) H_GET_8 (ABFD, (LOC) - 7)) +/* On output, make sure that the "reserved" field is zero. */ +#define PUT_SCNHDR_PAGE(ABFD, VAL, LOC) \ + (COFF2_P (ABFD) \ + ? H_PUT_16 (ABFD, VAL, LOC) \ + : H_PUT_8 (ABFD, VAL, (LOC) - 7), H_PUT_8 (ABFD, 0, (LOC) - 8)) +#endif + + +/* TI COFF stores section size as number of bytes (address units, not octets), + so adjust to be number of octets, which is what BFD expects */ +#define GET_SCNHDR_SIZE(ABFD, SZP) \ + (H_GET_32 (ABFD, SZP) * bfd_octets_per_byte (ABFD)) +#define PUT_SCNHDR_SIZE(ABFD, SZ, SZP) \ + H_PUT_32 (ABFD, (SZ) / bfd_octets_per_byte (ABFD), SZP) + +#define COFF_ADJUST_SCNHDR_IN_POST(ABFD, EXT, INT) \ + do \ + { \ + ((struct internal_scnhdr *)(INT))->s_page = \ + GET_SCNHDR_PAGE (ABFD, ((SCNHDR *)(EXT))->s_page); \ + } \ + while (0) + +/* The entire scnhdr may not be assigned. + Ensure that everything is initialized. */ +#define COFF_ADJUST_SCNHDR_OUT_PRE(ABFD, INT, EXT) \ + do \ + { \ + memset((EXT), 0, sizeof (SCNHDR)); \ + } \ + while (0) + +/* The line number and reloc overflow checking in coff_swap_scnhdr_out in + coffswap.h doesn't use PUT_X for s_nlnno and s_nreloc. + Due to different sized v0/v1/v2 section headers, we have to re-write these + fields. + */ +#define COFF_ADJUST_SCNHDR_OUT_POST(ABFD, INT, EXT) \ + do \ + { \ + PUT_SCNHDR_NLNNO (ABFD, ((struct internal_scnhdr *)(INT))->s_nlnno, \ + ((SCNHDR *)(EXT))->s_nlnno); \ + PUT_SCNHDR_NRELOC (ABFD, ((struct internal_scnhdr *)(INT))->s_nreloc,\ + ((SCNHDR *)(EXT))->s_nreloc); \ + PUT_SCNHDR_FLAGS (ABFD, ((struct internal_scnhdr *)(INT))->s_flags, \ + ((SCNHDR *)(EXT))->s_flags); \ + PUT_SCNHDR_PAGE (ABFD, ((struct internal_scnhdr *)(INT))->s_page, \ + ((SCNHDR *)(EXT))->s_page); \ + } \ + while (0) + +/* + * names of "special" sections + */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _CINIT ".cinit" /* initialized C data */ +#define _SCONST ".const" /* constants */ +#define _SWITCH ".switch" /* switch tables */ +#define _STACK ".stack" /* C stack */ +#define _SYSMEM ".sysmem" /* used for malloc et al. syscalls */ + +/********************** LINE NUMBERS **********************/ + +/* 1 line number entry for every "breakpointable" source line in a section. + * Line numbers are grouped on a per function basis; first entry in a function + * grouping will have l_lnno = 0 and in place of physical address will be the + * symbol table index of the function name. + */ +struct external_lineno { + union { + char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ + char l_paddr[4]; /* (physical) address of line number */ + } l_addr; + char l_lnno[2]; /* line number */ +}; + +#define LINENO struct external_lineno +#define LINESZ 6 + + +/********************** SYMBOLS **********************/ + +/* NOTE: this is what a local label looks like in assembly source; what it + looks like in COFF output is undefined */ +#define TICOFF_LOCAL_LABEL_P(NAME) \ +((NAME[0] == '$' && NAME[1] >= '0' && NAME[1] <= '9' && NAME[2] == '\0') \ + || NAME[strlen(NAME)-1] == '?') + +#define E_SYMNMLEN 8 /* # characters in a symbol name */ +#define E_FILNMLEN 14 /* # characters in a file name */ +#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ + +struct external_syment +{ + union { + char e_name[E_SYMNMLEN]; + struct { + char e_zeroes[4]; + char e_offset[4]; + } e; + } e; + char e_value[4]; + char e_scnum[2]; + char e_type[2]; + char e_sclass[1]; + char e_numaux[1]; +}; + + +#define N_BTMASK (017) +#define N_TMASK (060) +#define N_BTSHFT (4) +#define N_TSHIFT (2) + + +union external_auxent { + struct { + char x_tagndx[4]; /* str, un, or enum tag indx */ + union { + struct { + char x_lnno[2]; /* declaration line number */ + char x_size[2]; /* str/union/array size */ + } x_lnsz; + char x_fsize[4]; /* size of function */ + } x_misc; + union { + struct { /* if ISFCN, tag, or .bb */ + char x_lnnoptr[4]; /* ptr to fcn line # */ + char x_endndx[4]; /* entry ndx past block end */ + } x_fcn; + struct { /* if ISARY, up to 4 dimen. */ + char x_dimen[E_DIMNUM][2]; + } x_ary; + } x_fcnary; + char x_tvndx[2]; /* tv index */ + } x_sym; + + union { + char x_fname[E_FILNMLEN]; + struct { + char x_zeroes[4]; + char x_offset[4]; + } x_n; + } x_file; + + struct { + char x_scnlen[4]; /* section length */ + char x_nreloc[2]; /* # relocation entries */ + char x_nlinno[2]; /* # line numbers */ + } x_scn; + + struct { + char x_tvfill[4]; /* tv fill value */ + char x_tvlen[2]; /* length of .tv */ + char x_tvran[2][2]; /* tv range */ + } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ + + +}; + +#define SYMENT struct external_syment +#define SYMESZ 18 +#define AUXENT union external_auxent +#define AUXESZ 18 + +/* section lengths are in target bytes (not host bytes) */ +#define GET_SCN_SCNLEN(ABFD, EXT) \ + (H_GET_32 (ABFD, (EXT)->x_scn.x_scnlen) * bfd_octets_per_byte (ABFD)) +#define PUT_SCN_SCNLEN(ABFD, INT, EXT) \ + H_PUT_32 (ABFD, (INT) / bfd_octets_per_byte (ABFD), (EXT)->x_scn.x_scnlen) + +/* lnsz size is in bits in COFF file, in bytes in BFD */ +#define GET_LNSZ_SIZE(abfd, ext) \ + (H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size) / (in_class != C_FIELD ? 8 : 1)) + +#define PUT_LNSZ_SIZE(abfd, in, ext) \ + H_PUT_16 (abfd, ((in_class != C_FIELD) ? (in) * 8 : (in)), \ + ext->x_sym.x_misc.x_lnsz.x_size) + +/* TI COFF stores offsets for MOS and MOU in bits; BFD expects bytes + Also put the load page flag of the section into the symbol value if it's an + address. */ +#ifndef NEEDS_PAGE +#define NEEDS_PAGE(X) 0 +#define PAGE_MASK 0 +#endif +#define COFF_ADJUST_SYM_IN_POST(ABFD, EXT, INT) \ + do \ + { \ + struct internal_syment *dst = (struct internal_syment *)(INT); \ + if (dst->n_sclass == C_MOS || dst->n_sclass == C_MOU) \ + dst->n_value /= 8; \ + else if (NEEDS_PAGE (dst->n_sclass)) { \ + asection *scn = coff_section_from_bfd_index (abfd, dst->n_scnum); \ + dst->n_value |= (scn->lma & PAGE_MASK); \ + } \ + } \ + while (0) + +#define COFF_ADJUST_SYM_OUT_POST(ABFD, INT, EXT) \ + do \ + { \ + struct internal_syment *src = (struct internal_syment *)(INT); \ + SYMENT *dst = (SYMENT *)(EXT); \ + if (src->n_sclass == C_MOU || src->n_sclass == C_MOS) \ + H_PUT_32 (abfd, src->n_value * 8, dst->e_value); \ + else if (NEEDS_PAGE (src->n_sclass)) { \ + H_PUT_32 (abfd, src->n_value &= ~PAGE_MASK, dst->e_value); \ + } \ + } \ + while (0) + +/* Detect section-relative absolute symbols so they get flagged with a sym + index of -1. +*/ +#define SECTION_RELATIVE_ABSOLUTE_SYMBOL_P(RELOC, SECT) \ + ((*(RELOC)->sym_ptr_ptr)->section->output_section == (SECT) \ + && (RELOC)->howto->name[0] == 'A') + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc_v0 +{ + char r_vaddr[4]; + char r_symndx[2]; + char r_reserved[2]; + char r_type[2]; +}; + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_reserved[2]; /* extended pmad byte for COFF2 */ + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ_V0 10 /* FIXME -- coffcode.h needs fixing */ +#define RELSZ 12 /* for COFF1/2 */ + +#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) \ + do memset (dst->r_reserved, 0, sizeof (dst->r_reserved)); while (0) + +/* various relocation types. */ +#define R_ABS 0x0000 /* no relocation */ +#define R_REL13 0x002A /* 13-bit direct reference (???) */ +#define R_PARTLS7 0x0028 /* 7 LSBs of an address */ +#define R_PARTMS9 0x0029 /* 9MSBs of an address */ +#define R_EXTWORD 0x002B /* 23-bit direct reference */ +#define R_EXTWORD16 0x002C /* 16-bit direct reference to 23-bit addr*/ +#define R_EXTWORDMS7 0x002D /* upper 7 bits of 23-bit address */ + +#endif /* COFF_TI_H */ diff --git a/include/coff/tic30.h b/include/coff/tic30.h new file mode 100644 index 0000000..4f7776a --- /dev/null +++ b/include/coff/tic30.h @@ -0,0 +1,51 @@ +/* coff information for Texas Instruments TMS320C3X + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +#define TIC30MAGIC 0xC000 + +#define TIC30BADMAG(x) (((x).f_magic != TIC30MAGIC)) + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the z8k don't have room in the instruction for the entire + offset - eg with segments */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + +/* TMS320C30 relocation types. */ + +#define R_TIC30_ABS16 0x100 /* 16 bit absolute. */ +#define R_TIC30_ABS24 0x101 /* 24 bit absolute. */ +#define R_TIC30_ABS32 0x102 /* 32 bit absolute. */ +#define R_TIC30_LDP 0x103 /* LDP bits 23-16 to 7-0. */ +#define R_TIC30_PC16 0x104 /* 16 bit pc relative. */ diff --git a/include/coff/tic4x.h b/include/coff/tic4x.h new file mode 100644 index 0000000..1eb3e26 --- /dev/null +++ b/include/coff/tic4x.h @@ -0,0 +1,47 @@ +/* TI COFF information for Texas Instruments TMS320C4X/C3X. + This file customizes the settings in coff/ti.h. + + Copyright 2002, 2003, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef COFF_TIC4X_H +#define COFF_TIC4X_H + +#define TIC4X_TARGET_ID 0x0093 +/* Octets per byte, as a power of two. */ +#define TI_TARGET_ID TIC4X_TARGET_ID +#define OCTETS_PER_BYTE_POWER 2 +/* Add to howto to get absolute/sect-relative version. */ +#define HOWTO_BANK 6 +#define TICOFF_TARGET_ARCH bfd_arch_tic4x +/* We use COFF2. */ +#define TICOFF_DEFAULT_MAGIC TICOFF2MAGIC + +#define TICOFF_TARGET_MACHINE_GET(FLAGS) \ + (((FLAGS) & F_VERS) ? bfd_mach_tic4x : bfd_mach_tic3x) + +#define TICOFF_TARGET_MACHINE_SET(FLAGSP, MACHINE) \ + do \ + { \ + if ((MACHINE) == bfd_mach_tic4x) \ + *(FLAGSP) |= F_VERS; \ + } \ + while (0) + +#include "coff/ti.h" + +#endif /* COFF_TIC4X_H */ diff --git a/include/coff/tic54x.h b/include/coff/tic54x.h new file mode 100644 index 0000000..c61f1f2 --- /dev/null +++ b/include/coff/tic54x.h @@ -0,0 +1,60 @@ +/* TI COFF information for Texas Instruments TMS320C54X. + This file customizes the settings in coff/ti.h. + + Copyright 2000, 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef COFF_TIC54X_H +#define COFF_TIC54X_H + +#define TIC54X_TARGET_ID 0x98 +#define TIC54XALGMAGIC 0x009B /* c54x algebraic assembler output */ +#define TIC5X_TARGET_ID 0x92 +#define TI_TARGET_ID TIC54X_TARGET_ID +#define OCTETS_PER_BYTE_POWER 1 /* octets per byte, as a power of two */ +#define HOWTO_BANK 6 /* add to howto to get absolute/sect-relative version */ +#define TICOFF_TARGET_ARCH bfd_arch_tic54x +#define TICOFF_DEFAULT_MAGIC TICOFF1MAGIC /* we use COFF1 for compatibility */ + +/* Page macros + + The first GDB port requires flags in its remote memory access commands to + distinguish between data/prog space. Hopefully we can make this go away + eventually. Stuff the page in the upper bits of a 32-bit address, since + the c5x family only uses 16 or 23 bits. + + c2x, c5x and most c54x devices have 16-bit addresses, but the c548 has + 23-bit program addresses. Make sure the page flags don't interfere. + These flags are used by GDB to identify the destination page for + addresses. +*/ + +/* Recognized load pages (by common convention). */ +#define PG_PROG 0x0 /* PROG page */ +#define PG_DATA 0x1 /* DATA page */ +#define PG_IO 0x2 /* I/O page */ + +/** Indicate whether the given storage class requires a page flag. */ +#define NEEDS_PAGE(X) ((X)==C_EXT) +#define PAGE_MASK 0xFF000000 +#define ADDR_MASK 0x00FFFFFF +#define PG_TO_FLAG(p) (((unsigned long)(p) & 0xFF) << 24) +#define FLAG_TO_PG(f) (((f) >> 24) & 0xFF) + +#include "coff/ti.h" + +#endif /* COFF_TIC54X_H */ diff --git a/include/coff/tic80.h b/include/coff/tic80.h new file mode 100644 index 0000000..44f873e --- /dev/null +++ b/include/coff/tic80.h @@ -0,0 +1,123 @@ +/* coff information for TI TMS320C80 (MVP) + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define DO_NOT_DEFINE_FILHDR +#define DO_NOT_DEFINE_SCNHDR +#define L_LNNO_SIZE 2 +#include "coff/external.h" + +/********************** FILE HEADER **********************/ + +struct external_filehdr + { + char f_magic[2]; /* magic number */ + char f_nscns[2]; /* number of sections */ + char f_timdat[4]; /* time & date stamp */ + char f_symptr[4]; /* file pointer to symtab */ + char f_nsyms[4]; /* number of symtab entries */ + char f_opthdr[2]; /* sizeof(optional hdr) */ + char f_flags[2]; /* flags */ + char f_target_id[2];/* target id (TIc80 specific) */ +}; + +#define TIC80_ARCH_MAGIC 0x0C1 /* Goes in the file header magic number field */ +#define TIC80_TARGET_ID 0x95 /* Goes in the target id field */ + +#define TIC80BADMAG(x) ((x).f_magic != TIC80_ARCH_MAGIC) + +#define FILHDR struct external_filehdr +#define FILHSZ 22 + +#define TIC80_AOUTHDR_MAGIC 0x108 /* Goes in the optional file header magic number field */ + +/********************** SECTION HEADER **********************/ + +struct external_scnhdr +{ + char s_name[8]; /* section name */ + char s_paddr[4]; /* physical address, aliased s_nlib */ + char s_vaddr[4]; /* virtual address */ + char s_size[4]; /* section size */ + char s_scnptr[4]; /* file ptr to raw data for section */ + char s_relptr[4]; /* file ptr to relocation */ + char s_lnnoptr[4]; /* file ptr to line numbers */ + char s_nreloc[2]; /* number of relocation entries */ + char s_nlnno[2]; /* number of line number entries*/ + char s_flags[2]; /* flags */ + char s_reserved[1]; /* reserved (TIc80 specific) */ + char s_mempage[1]; /* memory page number (TIc80) */ +}; + +/* Names of "special" sections. */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _CINIT ".cinit" +#define _CONST ".const" +#define _SWITCH ".switch" +#define _STACK ".stack" +#define _SYSMEM ".sysmem" + +#define SCNHDR struct external_scnhdr +#define SCNHSZ 40 + +/* FIXME - need to correlate external_auxent with + TIc80 Code Generation Tools User's Guide, CG:A-25 */ + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the h8 don't have room in the instruction for the entire + offset - eg the strange jump and high page addressing modes. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_reserved[2]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 12 + +/* TIc80 relocation types. */ + +#define R_ABS 0x00 /* Absolute address - no relocation */ +#define R_RELLONGX 0x11 /* PP: 32 bits, direct */ +#define R_PPBASE 0x34 /* PP: Global base address type */ +#define R_PPLBASE 0x35 /* PP: Local base address type */ +#define R_PP15 0x38 /* PP: Global 15 bit offset */ +#define R_PP15W 0x39 /* PP: Global 15 bit offset divided by 4 */ +#define R_PP15H 0x3A /* PP: Global 15 bit offset divided by 2 */ +#define R_PP16B 0x3B /* PP: Global 16 bit offset for bytes */ +#define R_PPL15 0x3C /* PP: Local 15 bit offset */ +#define R_PPL15W 0x3D /* PP: Local 15 bit offset divided by 4 */ +#define R_PPL15H 0x3E /* PP: Local 15 bit offset divided by 2 */ +#define R_PPL16B 0x3F /* PP: Local 16 bit offset for bytes */ +#define R_PPN15 0x40 /* PP: Global 15 bit negative offset */ +#define R_PPN15W 0x41 /* PP: Global 15 bit negative offset divided by 4 */ +#define R_PPN15H 0x42 /* PP: Global 15 bit negative offset divided by 2 */ +#define R_PPN16B 0x43 /* PP: Global 16 bit negative byte offset */ +#define R_PPLN15 0x44 /* PP: Local 15 bit negative offset */ +#define R_PPLN15W 0x45 /* PP: Local 15 bit negative offset divided by 4 */ +#define R_PPLN15H 0x46 /* PP: Local 15 bit negative offset divided by 2 */ +#define R_PPLN16B 0x47 /* PP: Local 16 bit negative byte offset */ +#define R_MPPCR15W 0x4E /* MP: 15 bit PC-relative divided by 4 */ +#define R_MPPCR 0x4F /* MP: 32 bit PC-relative divided by 4 */ diff --git a/include/coff/w65.h b/include/coff/w65.h new file mode 100644 index 0000000..31d9609 --- /dev/null +++ b/include/coff/w65.h @@ -0,0 +1,47 @@ +/* coff information for WDC 65816 + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +#define W65MAGIC 0x6500 + +#define W65BADMAG(x) (((x).f_magic != W65MAGIC)) + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the w65 don't have room in the instruction for the entire + offset - eg the strange jump and high page addressing modes */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + + + + diff --git a/include/coff/we32k.h b/include/coff/we32k.h new file mode 100644 index 0000000..3787dd2 --- /dev/null +++ b/include/coff/we32k.h @@ -0,0 +1,62 @@ +/* coff information for we32k + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 2 +#include "coff/external.h" + +/* Bits for f_flags: + F_RELFLG relocation info stripped from file + F_EXEC file is executable (no unresolved external references) + F_LNNO line numbers stripped from file + F_LSYMS local symbols stripped from file + F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax). */ + +#define F_RELFLG (0x0001) +#define F_EXEC (0x0002) +#define F_LNNO (0x0004) +#define F_LSYMS (0x0008) +#define F_BM32B (0020000) +#define F_BM32MAU (0040000) + +#define WE32KMAGIC 0x170 /* we32k sans transfer vector */ +#define FBOMAGIC 0x170 /* we32k sans transfer vector */ +#define MTVMAGIC 0x171 /* we32k with transfer vector */ +#define RBOMAGIC 0x172 /* reserved */ +#define WE32KBADMAG(x) ( ((x).f_magic != WE32KMAGIC) \ + && ((x).f_magic != FBOMAGIC) \ + && ((x).f_magic != RBOMAGIC) \ + && ((x).f_magic != MTVMAGIC)) + +/* More names of "special" sections. */ +#define _TV ".tv" +#define _INIT ".init" +#define _FINI ".fini" + +/********************** RELOCATION DIRECTIVES **********************/ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 + diff --git a/include/coff/x86_64.h b/include/coff/x86_64.h new file mode 100644 index 0000000..fcd44c8 --- /dev/null +++ b/include/coff/x86_64.h @@ -0,0 +1,57 @@ +/* COFF information for AMD 64. + Copyright 2006, 2009, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. + + Written by Kai Tietz, OneVision Software GmbH&CoKg. */ + +#define L_LNNO_SIZE 2 +#define INCLUDE_COMDAT_FIELDS_IN_AUXENT + +#include "coff/external.h" + +#define COFF_PAGE_SIZE 0x1000 + +#define AMD64MAGIC 0x8664 + +#define AMD64BADMAG(x) ((x).f_magic != AMD64MAGIC) +#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b + +#define OMAGIC 0404 /* Object files, eg as output. */ +#define ZMAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC /* Demand load format, eg normal ld output 0x10b. */ +#define STMAGIC 0401 /* Target shlib. */ +#define SHMAGIC 0443 /* Host shlib. */ + +/* Define some NT default values. */ +/* #define NT_IMAGE_BASE 0x400000 moved to internal.h. */ +#define NT_SECTION_ALIGNMENT 0x1000 +#define NT_FILE_ALIGNMENT 0x200 +#define NT_DEF_RESERVE 0x100000 +#define NT_DEF_COMMIT 0x1000 + +/* Relocation directives. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_type[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 10 diff --git a/include/coff/xcoff.h b/include/coff/xcoff.h new file mode 100644 index 0000000..67502cd --- /dev/null +++ b/include/coff/xcoff.h @@ -0,0 +1,647 @@ +/* Internal format of XCOFF object file data structures for BFD. + + Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, + 2009, 2010 Free Software Foundation, Inc. + Written by Ian Lance Taylor , Cygnus Support. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _INTERNAL_XCOFF_H +#define _INTERNAL_XCOFF_H + +/* XCOFF specific f_flags. */ + +/* File was profiled with fdpr. */ +#define F_FDPR_PROF 0x0010 + +/* File was reordered with fdpr. */ +#define F_FDPR_OPTI 0x0020 + +/* File use very large program support. */ +#define F_DSA 0x0040 + +/* One aux header specifying medium page sizes is non-zero. */ +#define F_VARPG 0x0100 + +/* Read/write sections are non-executable. */ +#define F_NONEXEC 0x8000 + +/* Linker */ + +/* Names of "special" sections. */ +#define _TEXT ".text" +#define _DATA ".data" +#define _BSS ".bss" +#define _PAD ".pad" +#define _LOADER ".loader" +#define _EXCEPT ".except" +#define _TYPCHK ".typchk" + +/* XCOFF uses special .dwXXX sections with the type STYP_DWARF. */ +#define STYP_DWARF 0x0010 + +/* High-order 16-bits dwarf subtypes. */ +#define SSUBTYP_DWINFO 0x10000 +#define SSUBTYP_DWLINE 0x20000 +#define SSUBTYP_DWPBNMS 0x30000 +#define SSUBTYP_DWPBTYP 0x40000 +#define SSUBTYP_DWARNGE 0x50000 +#define SSUBTYP_DWABREV 0x60000 +#define SSUBTYP_DWSTR 0x70000 +#define SSUBTYP_DWRNGES 0x80000 + +/* XCOFF uses a special .loader section with type STYP_LOADER. */ +#define STYP_LOADER 0x1000 + +/* Specifies an exception section. A section of this type provides + information to identify the reason that a trap or ececptin occured within + and executable object program */ +#define STYP_EXCEPT 0x0100 + +/* Specifies an initialized thread-local data section. */ +#define STYP_TDATA 0x0400 + +/* Specifies an uninitialized thread-local data section. */ +#define STYP_TBSS 0x0800 + +/* XCOFF uses a special .debug section with type STYP_DEBUG. */ +#define STYP_DEBUG 0x2000 + +/* Specifies a type check section. A section of this type contains parameter + argument type check strings used by the AIX binder. */ +#define STYP_TYPCHK 0x4000 + +/* XCOFF handles line number or relocation overflow by creating + another section header with STYP_OVRFLO set. */ +#define STYP_OVRFLO 0x8000 + +#define RS6K_AOUTHDR_OMAGIC 0x0107 /* old: text & data writeable */ +#define RS6K_AOUTHDR_NMAGIC 0x0108 /* new: text r/o, data r/w */ +#define RS6K_AOUTHDR_ZMAGIC 0x010B /* paged: text r/o, both page-aligned */ + +/* XCOFF relocation types. + The relocations are described in the function + xcoff[64]_ppc_relocate_section in coff64-rs6000.c and coff-rs6000.c */ + +#define R_POS (0x00) +#define R_NEG (0x01) +#define R_REL (0x02) +#define R_TOC (0x03) +#define R_RTB (0x04) +#define R_GL (0x05) +#define R_TCL (0x06) +#define R_BA (0x08) +#define R_BR (0x0a) +#define R_RL (0x0c) +#define R_RLA (0x0d) +#define R_REF (0x0f) +#define R_TRL (0x12) +#define R_TRLA (0x13) +#define R_RRTBI (0x14) +#define R_RRTBA (0x15) +#define R_CAI (0x16) +#define R_CREL (0x17) +#define R_RBA (0x18) +#define R_RBAC (0x19) +#define R_RBR (0x1a) +#define R_RBRC (0x1b) +#define R_TLS (0x20) +#define R_TLS_IE (0x21) +#define R_TLS_LD (0x22) +#define R_TLS_LE (0x23) +#define R_TLSM (0x24) +#define R_TLSML (0x25) +#define R_TOCU (0x30) +#define R_TOCL (0x31) + +/* Storage class #defines, from /usr/include/storclass.h that are not already + defined in internal.h */ + +/* Comment string in .info section */ +#define C_INFO 110 + +/* Dwarf symbol. */ +#define C_DWARF 112 + +/* Auxillary Symbol Entries */ + +/* x_smtyp values: */ +#define SMTYP_ALIGN(x) ((x) >> 3) /* log2 of alignment */ +#define SMTYP_SMTYP(x) ((x) & 0x7) /* symbol type */ +/* Symbol type values: */ +#define XTY_ER 0 /* External reference */ +#define XTY_SD 1 /* Csect definition */ +#define XTY_LD 2 /* Label definition */ +#define XTY_CM 3 /* .BSS */ +#define XTY_EM 4 /* Error message */ +#define XTY_US 5 /* "Reserved for internal use" */ + +/* x_smclas values: */ +#define XMC_PR 0 /* Read-only program code */ +#define XMC_RO 1 /* Read-only constant */ +#define XMC_DB 2 /* Read-only debug dictionary table */ +#define XMC_TC 3 /* Read-write general TOC entry */ +#define XMC_UA 4 /* Read-write unclassified */ +#define XMC_RW 5 /* Read-write data */ +#define XMC_GL 6 /* Read-only global linkage */ +#define XMC_XO 7 /* Read-only extended operation */ +#define XMC_SV 8 /* Read-only supervisor call */ +#define XMC_BS 9 /* Read-write BSS */ +#define XMC_DS 10 /* Read-write descriptor csect */ +#define XMC_UC 11 /* Read-write unnamed Fortran common */ +#define XMC_TI 12 /* Read-only traceback index csect */ +#define XMC_TB 13 /* Read-only traceback table csect */ +/* 14 ??? */ +#define XMC_TC0 15 /* Read-write TOC anchor */ +#define XMC_TD 16 /* Read-write data in TOC */ +#define XMC_SV64 17 /* Read-only 64 bit supervisor call */ +#define XMC_SV3264 18 /* Read-only 32 or 64 bit supervisor call */ +/* 19 ??? */ +#define XMC_TL 20 /* Read-write initialized TLS data */ +#define XMC_TU 21 /* Read-write uninitialized TLS data */ +#define XMC_TE 22 /* Same as XMC_TC but mapped after it */ + +/* The ldhdr structure. This appears at the start of the .loader + section. */ + +struct internal_ldhdr +{ + /* The version number: + 1 : 32 bit + 2 : 64 bit */ + unsigned long l_version; + + /* The number of symbol table entries. */ + bfd_size_type l_nsyms; + + /* The number of relocation table entries. */ + bfd_size_type l_nreloc; + + /* The length of the import file string table. */ + bfd_size_type l_istlen; + + /* The number of import files. */ + bfd_size_type l_nimpid; + + /* The offset from the start of the .loader section to the first + entry in the import file table. */ + bfd_size_type l_impoff; + + /* The length of the string table. */ + bfd_size_type l_stlen; + + /* The offset from the start of the .loader section to the first + entry in the string table. */ + bfd_size_type l_stoff; + + /* The offset to start of the symbol table, only in XCOFF64 */ + bfd_vma l_symoff; + + /* The offset to the start of the relocation table, only in XCOFF64 */ + bfd_vma l_rldoff; +}; + +/* The ldsym structure. This is used to represent a symbol in the + .loader section. */ + +struct internal_ldsym +{ + union + { + /* The symbol name if <= SYMNMLEN characters. */ + char _l_name[SYMNMLEN]; + struct + { + /* Zero if the symbol name is more than SYMNMLEN characters. */ + long _l_zeroes; + + /* The offset in the string table if the symbol name is more + than SYMNMLEN characters. */ + long _l_offset; + } + _l_l; + } + _l; + + /* The symbol value. */ + bfd_vma l_value; + + /* The symbol section number. */ + short l_scnum; + + /* The symbol type and flags. */ + char l_smtype; + + /* The symbol storage class. */ + char l_smclas; + + /* The import file ID. */ + bfd_size_type l_ifile; + + /* Offset to the parameter type check string. */ + bfd_size_type l_parm; +}; + +/* These flags are for the l_smtype field (the lower three bits are an + XTY_* value). */ + +/* Imported symbol. */ +#define L_IMPORT (0x40) +/* Entry point. */ +#define L_ENTRY (0x20) +/* Exported symbol. */ +#define L_EXPORT (0x10) +/* Weak symbol. */ +#define L_WEAK (0x08) + +/* The ldrel structure. This is used to represent a reloc in the + .loader section. */ + +struct internal_ldrel +{ + /* The reloc address. */ + bfd_vma l_vaddr; + + /* The symbol table index in the .loader section symbol table. */ + bfd_size_type l_symndx; + + /* The relocation type and size. */ + short l_rtype; + + /* The section number this relocation applies to. */ + short l_rsecnm; +}; + +/* An entry in the XCOFF linker hash table. */ +struct xcoff_link_hash_entry +{ + struct bfd_link_hash_entry root; + + /* Symbol index in output file. Set to -1 initially. Set to -2 if + there is a reloc against this symbol. */ + long indx; + + /* If we have created a TOC entry for this symbol, this is the .tc + section which holds it. */ + asection *toc_section; + + union + { + /* If we have created a TOC entry (the XCOFF_SET_TOC flag is + set), this is the offset in toc_section. */ + bfd_vma toc_offset; + + /* If the TOC entry comes from an input file, this is set to the + symbol index of the C_HIDEXT XMC_TC or XMC_TD symbol. */ + long toc_indx; + } + u; + + /* If this symbol is a function entry point which is called, this + field holds a pointer to the function descriptor. If this symbol + is a function descriptor, this field holds a pointer to the + function entry point. */ + struct xcoff_link_hash_entry *descriptor; + + /* The .loader symbol table entry, if there is one. */ + struct internal_ldsym *ldsym; + + /* If XCOFF_BUILT_LDSYM is set, this is the .loader symbol table + index. If XCOFF_BUILD_LDSYM is clear, and XCOFF_IMPORT is set, + this is the l_ifile value. */ + long ldindx; + + /* Some linker flags. */ + unsigned long flags; + + /* The storage mapping class. */ + unsigned char smclas; +}; + +/* Flags for xcoff_link_hash_entry. */ + +/* Symbol is referenced by a regular object. */ +#define XCOFF_REF_REGULAR 0x00000001 +/* Symbol is defined by a regular object. */ +#define XCOFF_DEF_REGULAR 0x00000002 +/* Symbol is defined by a dynamic object. */ +#define XCOFF_DEF_DYNAMIC 0x00000004 +/* Symbol is used in a reloc being copied into the .loader section. */ +#define XCOFF_LDREL 0x00000008 +/* Symbol is the entry point. */ +#define XCOFF_ENTRY 0x00000010 +/* Symbol is for a function and is the target of a relocation. + The relocation may or may not be a branch-type relocation. */ +#define XCOFF_CALLED 0x00000020 +/* Symbol needs the TOC entry filled in. */ +#define XCOFF_SET_TOC 0x00000040 +/* Symbol is implicitly or explicitly imported. */ +#define XCOFF_IMPORT 0x00000080 +/* Symbol is explicitly exported. */ +#define XCOFF_EXPORT 0x00000100 +/* Symbol has been processed by xcoff_build_ldsyms. */ +#define XCOFF_BUILT_LDSYM 0x00000200 +/* Symbol is mentioned by a section which was not garbage collected. */ +#define XCOFF_MARK 0x00000400 +/* Symbol size is recorded in size_list list from hash table. */ +#define XCOFF_HAS_SIZE 0x00000800 +/* Symbol is a function descriptor. */ +#define XCOFF_DESCRIPTOR 0x00001000 +/* Multiple definitions have been for the symbol. */ +#define XCOFF_MULTIPLY_DEFINED 0x00002000 +/* Symbol is the __rtinit symbol. */ +#define XCOFF_RTINIT 0x00004000 +/* Symbol is an imported 32 bit syscall. */ +#define XCOFF_SYSCALL32 0x00008000 +/* Symbol is an imported 64 bit syscall. */ +#define XCOFF_SYSCALL64 0x00010000 +/* Symbol was not explicitly defined by the time it was marked. */ +#define XCOFF_WAS_UNDEFINED 0x00020000 +/* We have assigned an output XCOFF entry to this symbol. */ +#define XCOFF_ALLOCATED 0x00040000 + +/* The XCOFF linker hash table. */ + +#define XCOFF_NUMBER_OF_SPECIAL_SECTIONS 6 +#define XCOFF_SPECIAL_SECTION_TEXT 0 +#define XCOFF_SPECIAL_SECTION_ETEXT 1 +#define XCOFF_SPECIAL_SECTION_DATA 2 +#define XCOFF_SPECIAL_SECTION_EDATA 3 +#define XCOFF_SPECIAL_SECTION_END 4 +#define XCOFF_SPECIAL_SECTION_END2 5 + +/* These flags indicate which of -bexpall and -bexpfull are in effect. */ +#define XCOFF_EXPALL 1 +#define XCOFF_EXPFULL 2 + +/* This structure is used to pass information through + xcoff_link_hash_traverse. */ + +struct xcoff_loader_info +{ + /* Set if a problem occurred. */ + bfd_boolean failed; + + /* Output BFD. */ + bfd *output_bfd; + + /* Link information structure. */ + struct bfd_link_info *info; + + /* A mask of XCOFF_EXPALL and XCOFF_EXPFULL flags. */ + unsigned int auto_export_flags; + + /* Number of ldsym structures. */ + size_t ldsym_count; + + /* Size of string table. */ + size_t string_size; + + /* String table. */ + char *strings; + + /* Allocated size of string table. */ + size_t string_alc; +}; + +/* In case we're on a 32-bit machine, construct a 64-bit "-1" value + from smaller values. Start with zero, widen, *then* decrement. */ +#define MINUS_ONE (((bfd_vma) 0) - 1) + +/* __rtinit, from /usr/include/rtinit.h. */ +struct __rtinit +{ + /* Pointer to runtime linker. + XXX: Is the parameter really void? */ + int (*rtl) (void); + + /* Offset to array of init functions, 0 if none. */ + int init_offset; + + /* Offset to array of fini functions, 0 if none. */ + int fini_offset; + + /* Size of __RTINIT_DESCRIPTOR. This value should be used instead of + sizeof(__RTINIT_DESCRIPTOR). */ + int __rtinit_descriptor_size; +}; + +#define RTINIT_DESCRIPTOR_SIZE (12) + +struct __rtinit_descriptor +{ + /* Init/fini function. */ + int f; + + /* Offset, relative to the start of the __rtinit symbol, to name of the + function. */ + + int name_offset; + + /* Flags */ + unsigned char flags; +}; + +/* Archive */ + +#define XCOFFARMAG "\012" +#define XCOFFARMAGBIG "\012" +#define SXCOFFARMAG 8 + +/* The size of the ascii archive elements */ +#define XCOFFARMAG_ELEMENT_SIZE 12 +#define XCOFFARMAGBIG_ELEMENT_SIZE 20 + +/* This terminates an XCOFF archive member name. */ + +#define XCOFFARFMAG "`\012" +#define SXCOFFARFMAG 2 + +/* XCOFF archives start with this (printable) structure. */ + +struct xcoff_ar_file_hdr +{ + /* Magic string. */ + char magic[SXCOFFARMAG]; + + /* Offset of the member table (decimal ASCII string). */ + char memoff[XCOFFARMAG_ELEMENT_SIZE]; + + /* Offset of the global symbol table (decimal ASCII string). */ + char symoff[XCOFFARMAG_ELEMENT_SIZE]; + + /* Offset of the first member in the archive (decimal ASCII string). */ + char firstmemoff[XCOFFARMAG_ELEMENT_SIZE]; + + /* Offset of the last member in the archive (decimal ASCII string). */ + char lastmemoff[XCOFFARMAG_ELEMENT_SIZE]; + + /* Offset of the first member on the free list (decimal ASCII + string). */ + char freeoff[XCOFFARMAG_ELEMENT_SIZE]; +}; + +#define SIZEOF_AR_FILE_HDR (SXCOFFARMAG + 5 * XCOFFARMAG_ELEMENT_SIZE) + +/* This is the equivalent data structure for the big archive format. */ + +struct xcoff_ar_file_hdr_big +{ + /* Magic string. */ + char magic[SXCOFFARMAG]; + + /* Offset of the member table (decimal ASCII string). */ + char memoff[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* Offset of the global symbol table for 32-bit objects (decimal ASCII + string). */ + char symoff[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* Offset of the global symbol table for 64-bit objects (decimal ASCII + string). */ + char symoff64[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* Offset of the first member in the archive (decimal ASCII string). */ + char firstmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* Offset of the last member in the archive (decimal ASCII string). */ + char lastmemoff[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* Offset of the first member on the free list (decimal ASCII + string). */ + char freeoff[XCOFFARMAGBIG_ELEMENT_SIZE]; +}; + +#define SIZEOF_AR_FILE_HDR_BIG (SXCOFFARMAG + 6 * XCOFFARMAGBIG_ELEMENT_SIZE) + +/* Each XCOFF archive member starts with this (printable) structure. */ + +struct xcoff_ar_hdr +{ + /* File size not including the header (decimal ASCII string). */ + char size[XCOFFARMAG_ELEMENT_SIZE]; + + /* File offset of next archive member (decimal ASCII string). */ + char nextoff[XCOFFARMAG_ELEMENT_SIZE]; + + /* File offset of previous archive member (decimal ASCII string). */ + char prevoff[XCOFFARMAG_ELEMENT_SIZE]; + + /* File mtime (decimal ASCII string). */ + char date[12]; + + /* File UID (decimal ASCII string). */ + char uid[12]; + + /* File GID (decimal ASCII string). */ + char gid[12]; + + /* File mode (octal ASCII string). */ + char mode[12]; + + /* Length of file name (decimal ASCII string). */ + char namlen[4]; + + /* This structure is followed by the file name. The length of the + name is given in the namlen field. If the length of the name is + odd, the name is followed by a null byte. The name and optional + null byte are followed by XCOFFARFMAG, which is not included in + namlen. The contents of the archive member follow; the number of + bytes is given in the size field. */ +}; + +#define SIZEOF_AR_HDR (3 * XCOFFARMAG_ELEMENT_SIZE + 4 * 12 + 4) + +/* The equivalent for the big archive format. */ + +struct xcoff_ar_hdr_big +{ + /* File size not including the header (decimal ASCII string). */ + char size[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* File offset of next archive member (decimal ASCII string). */ + char nextoff[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* File offset of previous archive member (decimal ASCII string). */ + char prevoff[XCOFFARMAGBIG_ELEMENT_SIZE]; + + /* File mtime (decimal ASCII string). */ + char date[12]; + + /* File UID (decimal ASCII string). */ + char uid[12]; + + /* File GID (decimal ASCII string). */ + char gid[12]; + + /* File mode (octal ASCII string). */ + char mode[12]; + + /* Length of file name (decimal ASCII string). */ + char namlen[4]; + + /* This structure is followed by the file name. The length of the + name is given in the namlen field. If the length of the name is + odd, the name is followed by a null byte. The name and optional + null byte are followed by XCOFFARFMAG, which is not included in + namlen. The contents of the archive member follow; the number of + bytes is given in the size field. */ +}; + +#define SIZEOF_AR_HDR_BIG (3 * XCOFFARMAGBIG_ELEMENT_SIZE + 4 * 12 + 4) + +/* We often have to distinguish between the old and big file format. + Make it a bit cleaner. We can use `xcoff_ardata' here because the + `hdr' member has the same size and position in both formats. + is the default format, return TRUE even when xcoff_ardata is + NULL. */ +#ifndef SMALL_ARCHIVE +/* Creates big archives by default */ +#define xcoff_big_format_p(abfd) \ + ((NULL != bfd_ardata (abfd) && NULL == xcoff_ardata (abfd)) || \ + ((NULL != bfd_ardata (abfd)) && \ + (NULL != xcoff_ardata (abfd)) && \ + (xcoff_ardata (abfd)->magic[1] == 'b'))) +#else +/* Creates small archives by default. */ +#define xcoff_big_format_p(abfd) \ + (((NULL != bfd_ardata (abfd)) && \ + (NULL != xcoff_ardata (abfd)) && \ + (xcoff_ardata (abfd)->magic[1] == 'b'))) +#endif + +/* We store a copy of the xcoff_ar_file_hdr in the tdata field of the + artdata structure. Similar for the big archive. */ +#define xcoff_ardata(abfd) \ + ((struct xcoff_ar_file_hdr *) bfd_ardata (abfd)->tdata) +#define xcoff_ardata_big(abfd) \ + ((struct xcoff_ar_file_hdr_big *) bfd_ardata (abfd)->tdata) + +/* We store a copy of the xcoff_ar_hdr in the arelt_data field of an + archive element. Similar for the big archive. */ +#define arch_eltdata(bfd) ((struct areltdata *) ((bfd)->arelt_data)) +#define arch_xhdr(bfd) \ + ((struct xcoff_ar_hdr *) arch_eltdata (bfd)->arch_header) +#define arch_xhdr_big(bfd) \ + ((struct xcoff_ar_hdr_big *) arch_eltdata (bfd)->arch_header) + +/* True if symbols of class CLASS are external. */ +#define EXTERN_SYM_P(CLASS) \ + ((CLASS) == C_EXT || (CLASS) == C_AIX_WEAKEXT) + +#endif /* _INTERNAL_XCOFF_H */ diff --git a/include/coff/z80.h b/include/coff/z80.h new file mode 100644 index 0000000..712af05 --- /dev/null +++ b/include/coff/z80.h @@ -0,0 +1,60 @@ +/* coff information for Zilog Z80 + Copyright 2005, 2010 Free Software Foundation, Inc. + Contributed by Arnold Metselaar + + 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, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +/* z80 backend does not use dots in section names. */ +#undef _TEXT +#define _TEXT "text" +#undef _DATA +#define _DATA "data" +#undef _BSS +#define _BSS "bss" + +/* Type of cpu is stored in flags. */ +#define F_MACHMASK 0xF000 + +/* Z80 COFF encodes the section alignment in the section header flags */ +#define COFF_ALIGN_IN_SECTION_HEADER 1 +#define COFF_ALIGN_IN_S_FLAGS 1 +#define F_ALGNMASK 0x0F00 +/* requires a power-of-two argument */ +#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8)) +/* result is a power of two */ +#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF) + +#define Z80MAGIC 0x805A + +#define Z80BADMAG(x) (((x).f_magic != Z80MAGIC)) + +/* Relocation directives. */ + +/* This format actually has more bits than we need. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 diff --git a/include/coff/z8k.h b/include/coff/z8k.h new file mode 100644 index 0000000..5eef86d --- /dev/null +++ b/include/coff/z8k.h @@ -0,0 +1,49 @@ +/* coff information for Zilog Z800N + + Copyright 2001, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define L_LNNO_SIZE 4 +#include "coff/external.h" + +/* Type of cpu is stored in flags */ +#define F_Z8001 0x1000 +#define F_Z8002 0x2000 +#define F_MACHMASK 0xf000 + +#define Z8KMAGIC 0x8000 + +#define Z8KBADMAG(x) (((x).f_magic != Z8KMAGIC)) + +/********************** RELOCATION DIRECTIVES **********************/ + +/* The external reloc has an offset field, because some of the reloc + types on the z8k don't have room in the instruction for the entire + offset - eg with segments. */ + +struct external_reloc +{ + char r_vaddr[4]; + char r_symndx[4]; + char r_offset[4]; + char r_type[2]; + char r_stuff[2]; +}; + +#define RELOC struct external_reloc +#define RELSZ 16 + diff --git a/include/complex.h b/include/complex.h new file mode 100644 index 0000000..ad3028e --- /dev/null +++ b/include/complex.h @@ -0,0 +1,150 @@ +/* $NetBSD: complex.h,v 1.3 2010/09/15 16:11:30 christos Exp $ */ + +/* + * Written by Matthias Drochner. + * Public domain. + */ + +#ifndef _COMPLEX_H +#define _COMPLEX_H + +#define complex _Complex +#define _Complex_I 1.0fi +#define I _Complex_I + +#include + +__BEGIN_DECLS + +/* 7.3.5 Trigonometric functions */ +/* 7.3.5.1 The cacos functions */ +double complex cacos(double complex); +float complex cacosf(float complex); +long double complex cacosl(long double complex); + +/* 7.3.5.2 The casin functions */ +double complex casin(double complex); +float complex casinf(float complex); +long double complex casinl(long double complex); + +/* 7.3.5.1 The catan functions */ +double complex catan(double complex); +float complex catanf(float complex); +long double complex catanl(long double complex); + +/* 7.3.5.1 The ccos functions */ +double complex ccos(double complex); +float complex ccosf(float complex); +long double complex ccosl(long double complex); + +/* 7.3.5.1 The csin functions */ +double complex csin(double complex); +float complex csinf(float complex); +long double complex csinl(long double complex); + +/* 7.3.5.1 The ctan functions */ +double complex ctan(double complex); +float complex ctanf(float complex); +long double complex ctanl(long double complex); + +/* 7.3.6 Hyperbolic functions */ +/* 7.3.6.1 The cacosh functions */ +double complex cacosh(double complex); +float complex cacoshf(float complex); +long double complex cacoshl(long double complex); + +/* 7.3.6.2 The casinh functions */ +double complex casinh(double complex); +float complex casinhf(float complex); +long double complex casinhl(long double complex); + +/* 7.3.6.3 The catanh functions */ +double complex catanh(double complex); +float complex catanhf(float complex); +long double complex catanhl(long double complex); + +/* 7.3.6.4 The ccosh functions */ +double complex ccosh(double complex); +float complex ccoshf(float complex); +long double complex ccoshl(long double complex); + +/* 7.3.6.5 The csinh functions */ +double complex csinh(double complex); +float complex csinhf(float complex); +long double complex csinhl(long double complex); + +/* 7.3.6.6 The ctanh functions */ +double complex ctanh(double complex); +float complex ctanhf(float complex); +long double complex ctanhl(long double complex); + +/* 7.3.7 Exponential and logarithmic functions */ +/* 7.3.7.1 The cexp functions */ +double complex cexp(double complex); +float complex cexpf(float complex); +long double complex cexpl(long double complex); + +/* 7.3.7.2 The clog functions */ +double complex clog(double complex); +float complex clogf(float complex); +long double complex clogl(long double complex); + +/* 7.3.8 Power and absolute-value functions */ +/* 7.3.8.1 The cabs functions */ +/*#ifndef __LIBM0_SOURCE__ */ +/* avoid conflict with historical cabs(struct complex) */ +/* double cabs(double complex) __RENAME(__c99_cabs); + float cabsf(float complex) __RENAME(__c99_cabsf); + #endif +*/ +long double cabsl(long double complex) ; +double cabs(double complex) ; +float cabsf(float complex) ; + +/* 7.3.8.2 The cpow functions */ +double complex cpow(double complex, double complex); +float complex cpowf(float complex, float complex); +long double complex cpowl(long double complex, long double complex); + +/* 7.3.8.3 The csqrt functions */ +double complex csqrt(double complex); +float complex csqrtf(float complex); +long double complex csqrtl(long double complex); + +/* 7.3.9 Manipulation functions */ +/* 7.3.9.1 The carg functions */ +double carg(double complex); +float cargf(float complex); +long double cargl(long double complex); + +/* 7.3.9.2 The cimag functions */ +double cimag(double complex); +float cimagf(float complex); +long double cimagl(long double complex); + +/* 7.3.9.3 The conj functions */ +double complex conj(double complex); +float complex conjf(float complex); +long double complex conjl(long double complex); + +/* 7.3.9.4 The cproj functions */ +double complex cproj(double complex); +float complex cprojf(float complex); +long double complex cprojl(long double complex); + +/* 7.3.9.5 The creal functions */ +double creal(double complex); +float crealf(float complex); +long double creall(long double complex); + +#if __GNU_VISIBLE +double complex clog10(double complex); +float complex clog10f(float complex); +# if defined(__CYGWIN__) +long double complex clog10l(long double complex); +# endif +#endif + +__END_DECLS + +#endif /* ! _COMPLEX_H */ diff --git a/include/cpio.h b/include/cpio.h new file mode 100644 index 0000000..99860b2 --- /dev/null +++ b/include/cpio.h @@ -0,0 +1,30 @@ +/* POSIX.1 symbolic constants for c_mode field of cpio archive format */ + +#ifndef _CPIO_H +#define _CPIO_H + +#define C_IRUSR 0000400 /* Read by owner */ +#define C_IWUSR 0000200 /* Write by owner */ +#define C_IXUSR 0000100 /* Execute by owner */ +#define C_IRGRP 0000040 /* Read by group */ +#define C_IWGRP 0000020 /* Write by group */ +#define C_IXGRP 0000010 /* Execute by group */ +#define C_IROTH 0000004 /* Read by others */ +#define C_IWOTH 0000002 /* Write by others */ +#define C_IXOTH 0000001 /* Execute by others */ +#define C_ISUID 0004000 /* Set user ID */ +#define C_ISGID 0002000 /* Set group ID */ +#define C_ISVTX 0001000 /* On directories, restricted deletion flag */ + +#define C_ISDIR 0040000 /* Directory */ +#define C_ISFIFO 0010000 /* FIFO */ +#define C_ISREG 0100000 /* Regular file */ +#define C_ISBLK 0060000 /* Block special */ +#define C_ISCHR 0020000 /* Character special */ +#define C_ISCTG 0110000 /* Reserved */ +#define C_ISLNK 0120000 /* Symbolic link */ +#define C_ISSOCK 0140000 /* Socket */ + +#define MAGIC "070707" + +#endif /* _CPIO_H */ diff --git a/include/ctype.h b/include/ctype.h new file mode 100644 index 0000000..b29594a --- /dev/null +++ b/include/ctype.h @@ -0,0 +1,183 @@ +#ifndef _CTYPE_H_ +#define _CTYPE_H_ + +#include "_ansi.h" +#include + +#if __POSIX_VISIBLE >= 200809 || __MISC_VISIBLE || defined (_LIBC) +#include +#endif + +_BEGIN_STD_C + +int isalnum (int __c); +int isalpha (int __c); +int iscntrl (int __c); +int isdigit (int __c); +int isgraph (int __c); +int islower (int __c); +int isprint (int __c); +int ispunct (int __c); +int isspace (int __c); +int isupper (int __c); +int isxdigit (int __c); +int tolower (int __c); +int toupper (int __c); + +#if __ISO_C_VISIBLE >= 1999 +int isblank (int __c); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE +int isascii (int __c); +int toascii (int __c); +#define _tolower(__c) ((unsigned char)(__c) - 'A' + 'a') +#define _toupper(__c) ((unsigned char)(__c) - 'a' + 'A') +#endif + +#if __POSIX_VISIBLE >= 200809 +extern int isalnum_l (int __c, locale_t __l); +extern int isalpha_l (int __c, locale_t __l); +extern int isblank_l (int __c, locale_t __l); +extern int iscntrl_l (int __c, locale_t __l); +extern int isdigit_l (int __c, locale_t __l); +extern int isgraph_l (int __c, locale_t __l); +extern int islower_l (int __c, locale_t __l); +extern int isprint_l (int __c, locale_t __l); +extern int ispunct_l (int __c, locale_t __l); +extern int isspace_l (int __c, locale_t __l); +extern int isupper_l (int __c, locale_t __l); +extern int isxdigit_l(int __c, locale_t __l); +extern int tolower_l (int __c, locale_t __l); +extern int toupper_l (int __c, locale_t __l); +#endif + +#if __MISC_VISIBLE +extern int isascii_l (int __c, locale_t __l); +extern int toascii_l (int __c, locale_t __l); +#endif + +#define _U 01 +#define _L 02 +#define _N 04 +#define _S 010 +#define _P 020 +#define _C 040 +#define _X 0100 +#define _B 0200 + +/* For C++ backward-compatibility only. */ +extern __IMPORT const char _ctype_[]; + +#ifdef __HAVE_LOCALE_INFO__ +const char *__locale_ctype_ptr (void); +#else +#define __locale_ctype_ptr() _ctype_ +#endif + +# define __CTYPE_PTR (__locale_ctype_ptr ()) + +#ifndef __cplusplus +/* These macros are intentionally written in a manner that will trigger + a gcc -Wall warning if the user mistakenly passes a 'char' instead + of an int containing an 'unsigned char'. Note that the sizeof will + always be 1, which is what we want for mapping EOF to __CTYPE_PTR[0]; + the use of a raw index inside the sizeof triggers the gcc warning if + __c was of type char, and sizeof masks side effects of the extra __c. + Meanwhile, the real index to __CTYPE_PTR+1 must be cast to int, + since isalpha(0x100000001LL) must equal isalpha(1), rather than being + an out-of-bounds reference on a 64-bit machine. */ +#define __ctype_lookup(__c) ((__CTYPE_PTR+sizeof(""[__c]))[(int)(__c)]) + +#define isalpha(__c) (__ctype_lookup(__c)&(_U|_L)) +#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U) +#define islower(__c) ((__ctype_lookup(__c)&(_U|_L))==_L) +#define isdigit(__c) (__ctype_lookup(__c)&_N) +#define isxdigit(__c) (__ctype_lookup(__c)&(_X|_N)) +#define isspace(__c) (__ctype_lookup(__c)&_S) +#define ispunct(__c) (__ctype_lookup(__c)&_P) +#define isalnum(__c) (__ctype_lookup(__c)&(_U|_L|_N)) +#define isprint(__c) (__ctype_lookup(__c)&(_P|_U|_L|_N|_B)) +#define isgraph(__c) (__ctype_lookup(__c)&(_P|_U|_L|_N)) +#define iscntrl(__c) (__ctype_lookup(__c)&_C) + +#if defined(__GNUC__) && __ISO_C_VISIBLE >= 1999 +#define isblank(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (__ctype_lookup(__x)&_B) || (int) (__x) == '\t';}) +#endif + +#if __POSIX_VISIBLE >= 200809 +#ifdef __HAVE_LOCALE_INFO__ +const char *__locale_ctype_ptr_l (locale_t); +#else +static __inline const char * +__locale_ctype_ptr_l(locale_t _l) +{ + (void)_l; + return __locale_ctype_ptr(); +} +#endif +#define __ctype_lookup_l(__c,__l) ((__locale_ctype_ptr_l(__l)+sizeof(""[__c]))[(int)(__c)]) + +#define isalpha_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L)) +#define isupper_l(__c,__l) ((__ctype_lookup_l(__c,__l)&(_U|_L))==_U) +#define islower_l(__c,__l) ((__ctype_lookup_l(__c,__l)&(_U|_L))==_L) +#define isdigit_l(__c,__l) (__ctype_lookup_l(__c,__l)&_N) +#define isxdigit_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_X|_N)) +#define isspace_l(__c,__l) (__ctype_lookup_l(__c,__l)&_S) +#define ispunct_l(__c,__l) (__ctype_lookup_l(__c,__l)&_P) +#define isalnum_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L|_N)) +#define isprint_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_P|_U|_L|_N|_B)) +#define isgraph_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_P|_U|_L|_N)) +#define iscntrl_l(__c,__l) (__ctype_lookup_l(__c,__l)&_C) + +#if defined(__GNUC__) +#define isblank_l(__c, __l) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (__ctype_lookup_l(__x,__l)&_B) || (int) (__x) == '\t';}) +#endif + +#endif /* __POSIX_VISIBLE >= 200809 */ + +#if __MISC_VISIBLE || __XSI_VISIBLE +#define isascii(__c) ((unsigned)(__c)<=0177) +#define toascii(__c) ((__c)&0177) +#endif + +#if __MISC_VISIBLE +#define isascii_l(__c,__l) ((__l),(unsigned)(__c)<=0177) +#define toascii_l(__c,__l) ((__l),(__c)&0177) +#endif + +/* Non-gcc versions will get the library versions, and will be + slightly slower. These macros are not NLS-aware so they are + disabled if the system supports the extended character sets. */ +# if defined(__GNUC__) +# if !defined (_MB_EXTENDED_CHARSETS_ISO) && !defined (_MB_EXTENDED_CHARSETS_WINDOWS) +# define toupper(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + islower (__x) ? (int) __x - 'a' + 'A' : (int) __x;}) +# define tolower(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + isupper (__x) ? (int) __x - 'A' + 'a' : (int) __x;}) +# else /* _MB_EXTENDED_CHARSETS* */ +/* Allow a gcc warning if the user passed 'char', but defer to the + function. */ +# define toupper(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (void) __CTYPE_PTR[__x]; (toupper) (__x);}) +# define tolower(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (void) __CTYPE_PTR[__x]; (tolower) (__x);}) +# endif /* _MB_EXTENDED_CHARSETS* */ +# endif /* __GNUC__ */ + +#if __POSIX_VISIBLE >= 200809 +#endif /* __POSIX_VISIBLE >= 200809 */ + +#endif /* !__cplusplus */ + +_END_STD_C + +#endif /* _CTYPE_H_ */ diff --git a/include/demangle.h b/include/demangle.h new file mode 100644 index 0000000..1d7cadf --- /dev/null +++ b/include/demangle.h @@ -0,0 +1,691 @@ +/* Defs for interface to demanglers. + Copyright (C) 1992-2015 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Library Public License restrictions do apply in other + respects; for example, they cover modification of the file, and + distribution when not linked into a combined executable.) + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + + +#if !defined (DEMANGLE_H) +#define DEMANGLE_H + +#include "libiberty.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Options passed to cplus_demangle (in 2nd parameter). */ + +#define DMGL_NO_OPTS 0 /* For readability... */ +#define DMGL_PARAMS (1 << 0) /* Include function args */ +#define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ +#define DMGL_JAVA (1 << 2) /* Demangle as Java rather than C++. */ +#define DMGL_VERBOSE (1 << 3) /* Include implementation details. */ +#define DMGL_TYPES (1 << 4) /* Also try to demangle type encodings. */ +#define DMGL_RET_POSTFIX (1 << 5) /* Print function return types (when + present) after function signature. + It applies only to the toplevel + function type. */ +#define DMGL_RET_DROP (1 << 6) /* Suppress printing function return + types, even if present. It applies + only to the toplevel function type. + */ + +#define DMGL_AUTO (1 << 8) +#define DMGL_GNU (1 << 9) +#define DMGL_LUCID (1 << 10) +#define DMGL_ARM (1 << 11) +#define DMGL_HP (1 << 12) /* For the HP aCC compiler; + same as ARM except for + template arguments, etc. */ +#define DMGL_EDG (1 << 13) +#define DMGL_GNU_V3 (1 << 14) +#define DMGL_GNAT (1 << 15) +#define DMGL_DLANG (1 << 16) + +/* If none of these are set, use 'current_demangling_style' as the default. */ +#define DMGL_STYLE_MASK (DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT|DMGL_DLANG) + +/* Enumeration of possible demangling styles. + + Lucid and ARM styles are still kept logically distinct, even though + they now both behave identically. The resulting style is actual the + union of both. I.E. either style recognizes both "__pt__" and "__rf__" + for operator "->", even though the first is lucid style and the second + is ARM style. (FIXME?) */ + +extern enum demangling_styles +{ + no_demangling = -1, + unknown_demangling = 0, + auto_demangling = DMGL_AUTO, + gnu_demangling = DMGL_GNU, + lucid_demangling = DMGL_LUCID, + arm_demangling = DMGL_ARM, + hp_demangling = DMGL_HP, + edg_demangling = DMGL_EDG, + gnu_v3_demangling = DMGL_GNU_V3, + java_demangling = DMGL_JAVA, + gnat_demangling = DMGL_GNAT, + dlang_demangling = DMGL_DLANG +} current_demangling_style; + +/* Define string names for the various demangling styles. */ + +#define NO_DEMANGLING_STYLE_STRING "none" +#define AUTO_DEMANGLING_STYLE_STRING "auto" +#define GNU_DEMANGLING_STYLE_STRING "gnu" +#define LUCID_DEMANGLING_STYLE_STRING "lucid" +#define ARM_DEMANGLING_STYLE_STRING "arm" +#define HP_DEMANGLING_STYLE_STRING "hp" +#define EDG_DEMANGLING_STYLE_STRING "edg" +#define GNU_V3_DEMANGLING_STYLE_STRING "gnu-v3" +#define JAVA_DEMANGLING_STYLE_STRING "java" +#define GNAT_DEMANGLING_STYLE_STRING "gnat" +#define DLANG_DEMANGLING_STYLE_STRING "dlang" + +/* Some macros to test what demangling style is active. */ + +#define CURRENT_DEMANGLING_STYLE current_demangling_style +#define AUTO_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_AUTO) +#define GNU_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU) +#define LUCID_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_LUCID) +#define ARM_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_ARM) +#define HP_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_HP) +#define EDG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_EDG) +#define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3) +#define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA) +#define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT) +#define DLANG_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_DLANG) + +/* Provide information about the available demangle styles. This code is + pulled from gdb into libiberty because it is useful to binutils also. */ + +extern const struct demangler_engine +{ + const char *const demangling_style_name; + const enum demangling_styles demangling_style; + const char *const demangling_style_doc; +} libiberty_demanglers[]; + +extern char * +cplus_demangle (const char *mangled, int options); + +extern int +cplus_demangle_opname (const char *opname, char *result, int options); + +extern const char * +cplus_mangle_opname (const char *opname, int options); + +/* Note: This sets global state. FIXME if you care about multi-threading. */ + +extern void +set_cplus_marker_for_demangling (int ch); + +extern enum demangling_styles +cplus_demangle_set_style (enum demangling_styles style); + +extern enum demangling_styles +cplus_demangle_name_to_style (const char *name); + +/* Callback typedef for allocation-less demangler interfaces. */ +typedef void (*demangle_callbackref) (const char *, size_t, void *); + +/* V3 ABI demangling entry points, defined in cp-demangle.c. Callback + variants return non-zero on success, zero on error. char* variants + return a string allocated by malloc on success, NULL on error. */ +extern int +cplus_demangle_v3_callback (const char *mangled, int options, + demangle_callbackref callback, void *opaque); + +extern char* +cplus_demangle_v3 (const char *mangled, int options); + +extern int +java_demangle_v3_callback (const char *mangled, + demangle_callbackref callback, void *opaque); + +extern char* +java_demangle_v3 (const char *mangled); + +char * +ada_demangle (const char *mangled, int options); + +extern char * +dlang_demangle (const char *mangled, int options); + +enum gnu_v3_ctor_kinds { + gnu_v3_complete_object_ctor = 1, + gnu_v3_base_object_ctor, + gnu_v3_complete_object_allocating_ctor, + /* These are not part of the V3 ABI. Unified constructors are generated + as a speed-for-space optimization when the -fdeclone-ctor-dtor option + is used, and are always internal symbols. */ + gnu_v3_unified_ctor, + gnu_v3_object_ctor_group +}; + +/* Return non-zero iff NAME is the mangled form of a constructor name + in the G++ V3 ABI demangling style. Specifically, return an `enum + gnu_v3_ctor_kinds' value indicating what kind of constructor + it is. */ +extern enum gnu_v3_ctor_kinds + is_gnu_v3_mangled_ctor (const char *name); + + +enum gnu_v3_dtor_kinds { + gnu_v3_deleting_dtor = 1, + gnu_v3_complete_object_dtor, + gnu_v3_base_object_dtor, + /* These are not part of the V3 ABI. Unified destructors are generated + as a speed-for-space optimization when the -fdeclone-ctor-dtor option + is used, and are always internal symbols. */ + gnu_v3_unified_dtor, + gnu_v3_object_dtor_group +}; + +/* Return non-zero iff NAME is the mangled form of a destructor name + in the G++ V3 ABI demangling style. Specifically, return an `enum + gnu_v3_dtor_kinds' value, indicating what kind of destructor + it is. */ +extern enum gnu_v3_dtor_kinds + is_gnu_v3_mangled_dtor (const char *name); + +/* The V3 demangler works in two passes. The first pass builds a tree + representation of the mangled name, and the second pass turns the + tree representation into a demangled string. Here we define an + interface to permit a caller to build their own tree + representation, which they can pass to the demangler to get a + demangled string. This can be used to canonicalize user input into + something which the demangler might output. It could also be used + by other demanglers in the future. */ + +/* These are the component types which may be found in the tree. Many + component types have one or two subtrees, referred to as left and + right (a component type with only one subtree puts it in the left + subtree). */ + +enum demangle_component_type +{ + /* A name, with a length and a pointer to a string. */ + DEMANGLE_COMPONENT_NAME, + /* A qualified name. The left subtree is a class or namespace or + some such thing, and the right subtree is a name qualified by + that class. */ + DEMANGLE_COMPONENT_QUAL_NAME, + /* A local name. The left subtree describes a function, and the + right subtree is a name which is local to that function. */ + DEMANGLE_COMPONENT_LOCAL_NAME, + /* A typed name. The left subtree is a name, and the right subtree + describes that name as a function. */ + DEMANGLE_COMPONENT_TYPED_NAME, + /* A template. The left subtree is a template name, and the right + subtree is a template argument list. */ + DEMANGLE_COMPONENT_TEMPLATE, + /* A template parameter. This holds a number, which is the template + parameter index. */ + DEMANGLE_COMPONENT_TEMPLATE_PARAM, + /* A function parameter. This holds a number, which is the index. */ + DEMANGLE_COMPONENT_FUNCTION_PARAM, + /* A constructor. This holds a name and the kind of + constructor. */ + DEMANGLE_COMPONENT_CTOR, + /* A destructor. This holds a name and the kind of destructor. */ + DEMANGLE_COMPONENT_DTOR, + /* A vtable. This has one subtree, the type for which this is a + vtable. */ + DEMANGLE_COMPONENT_VTABLE, + /* A VTT structure. This has one subtree, the type for which this + is a VTT. */ + DEMANGLE_COMPONENT_VTT, + /* A construction vtable. The left subtree is the type for which + this is a vtable, and the right subtree is the derived type for + which this vtable is built. */ + DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, + /* A typeinfo structure. This has one subtree, the type for which + this is the tpeinfo structure. */ + DEMANGLE_COMPONENT_TYPEINFO, + /* A typeinfo name. This has one subtree, the type for which this + is the typeinfo name. */ + DEMANGLE_COMPONENT_TYPEINFO_NAME, + /* A typeinfo function. This has one subtree, the type for which + this is the tpyeinfo function. */ + DEMANGLE_COMPONENT_TYPEINFO_FN, + /* A thunk. This has one subtree, the name for which this is a + thunk. */ + DEMANGLE_COMPONENT_THUNK, + /* A virtual thunk. This has one subtree, the name for which this + is a virtual thunk. */ + DEMANGLE_COMPONENT_VIRTUAL_THUNK, + /* A covariant thunk. This has one subtree, the name for which this + is a covariant thunk. */ + DEMANGLE_COMPONENT_COVARIANT_THUNK, + /* A Java class. This has one subtree, the type. */ + DEMANGLE_COMPONENT_JAVA_CLASS, + /* A guard variable. This has one subtree, the name for which this + is a guard variable. */ + DEMANGLE_COMPONENT_GUARD, + /* The init and wrapper functions for C++11 thread_local variables. */ + DEMANGLE_COMPONENT_TLS_INIT, + DEMANGLE_COMPONENT_TLS_WRAPPER, + /* A reference temporary. This has one subtree, the name for which + this is a temporary. */ + DEMANGLE_COMPONENT_REFTEMP, + /* A hidden alias. This has one subtree, the encoding for which it + is providing alternative linkage. */ + DEMANGLE_COMPONENT_HIDDEN_ALIAS, + /* A standard substitution. This holds the name of the + substitution. */ + DEMANGLE_COMPONENT_SUB_STD, + /* The restrict qualifier. The one subtree is the type which is + being qualified. */ + DEMANGLE_COMPONENT_RESTRICT, + /* The volatile qualifier. The one subtree is the type which is + being qualified. */ + DEMANGLE_COMPONENT_VOLATILE, + /* The const qualifier. The one subtree is the type which is being + qualified. */ + DEMANGLE_COMPONENT_CONST, + /* The restrict qualifier modifying a member function. The one + subtree is the type which is being qualified. */ + DEMANGLE_COMPONENT_RESTRICT_THIS, + /* The volatile qualifier modifying a member function. The one + subtree is the type which is being qualified. */ + DEMANGLE_COMPONENT_VOLATILE_THIS, + /* The const qualifier modifying a member function. The one subtree + is the type which is being qualified. */ + DEMANGLE_COMPONENT_CONST_THIS, + /* C++11 A reference modifying a member function. The one subtree is the + type which is being referenced. */ + DEMANGLE_COMPONENT_REFERENCE_THIS, + /* C++11: An rvalue reference modifying a member function. The one + subtree is the type which is being referenced. */ + DEMANGLE_COMPONENT_RVALUE_REFERENCE_THIS, + /* A vendor qualifier. The left subtree is the type which is being + qualified, and the right subtree is the name of the + qualifier. */ + DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL, + /* A pointer. The one subtree is the type which is being pointed + to. */ + DEMANGLE_COMPONENT_POINTER, + /* A reference. The one subtree is the type which is being + referenced. */ + DEMANGLE_COMPONENT_REFERENCE, + /* C++0x: An rvalue reference. The one subtree is the type which is + being referenced. */ + DEMANGLE_COMPONENT_RVALUE_REFERENCE, + /* A complex type. The one subtree is the base type. */ + DEMANGLE_COMPONENT_COMPLEX, + /* An imaginary type. The one subtree is the base type. */ + DEMANGLE_COMPONENT_IMAGINARY, + /* A builtin type. This holds the builtin type information. */ + DEMANGLE_COMPONENT_BUILTIN_TYPE, + /* A vendor's builtin type. This holds the name of the type. */ + DEMANGLE_COMPONENT_VENDOR_TYPE, + /* A function type. The left subtree is the return type. The right + subtree is a list of ARGLIST nodes. Either or both may be + NULL. */ + DEMANGLE_COMPONENT_FUNCTION_TYPE, + /* An array type. The left subtree is the dimension, which may be + NULL, or a string (represented as DEMANGLE_COMPONENT_NAME), or an + expression. The right subtree is the element type. */ + DEMANGLE_COMPONENT_ARRAY_TYPE, + /* A pointer to member type. The left subtree is the class type, + and the right subtree is the member type. CV-qualifiers appear + on the latter. */ + DEMANGLE_COMPONENT_PTRMEM_TYPE, + /* A fixed-point type. */ + DEMANGLE_COMPONENT_FIXED_TYPE, + /* A vector type. The left subtree is the number of elements, + the right subtree is the element type. */ + DEMANGLE_COMPONENT_VECTOR_TYPE, + /* An argument list. The left subtree is the current argument, and + the right subtree is either NULL or another ARGLIST node. */ + DEMANGLE_COMPONENT_ARGLIST, + /* A template argument list. The left subtree is the current + template argument, and the right subtree is either NULL or + another TEMPLATE_ARGLIST node. */ + DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, + /* An initializer list. The left subtree is either an explicit type or + NULL, and the right subtree is a DEMANGLE_COMPONENT_ARGLIST. */ + DEMANGLE_COMPONENT_INITIALIZER_LIST, + /* An operator. This holds information about a standard + operator. */ + DEMANGLE_COMPONENT_OPERATOR, + /* An extended operator. This holds the number of arguments, and + the name of the extended operator. */ + DEMANGLE_COMPONENT_EXTENDED_OPERATOR, + /* A typecast, represented as a unary operator. The one subtree is + the type to which the argument should be cast. */ + DEMANGLE_COMPONENT_CAST, + /* A conversion operator, represented as a unary operator. The one + subtree is the type to which the argument should be converted + to. */ + DEMANGLE_COMPONENT_CONVERSION, + /* A nullary expression. The left subtree is the operator. */ + DEMANGLE_COMPONENT_NULLARY, + /* A unary expression. The left subtree is the operator, and the + right subtree is the single argument. */ + DEMANGLE_COMPONENT_UNARY, + /* A binary expression. The left subtree is the operator, and the + right subtree is a BINARY_ARGS. */ + DEMANGLE_COMPONENT_BINARY, + /* Arguments to a binary expression. The left subtree is the first + argument, and the right subtree is the second argument. */ + DEMANGLE_COMPONENT_BINARY_ARGS, + /* A trinary expression. The left subtree is the operator, and the + right subtree is a TRINARY_ARG1. */ + DEMANGLE_COMPONENT_TRINARY, + /* Arguments to a trinary expression. The left subtree is the first + argument, and the right subtree is a TRINARY_ARG2. */ + DEMANGLE_COMPONENT_TRINARY_ARG1, + /* More arguments to a trinary expression. The left subtree is the + second argument, and the right subtree is the third argument. */ + DEMANGLE_COMPONENT_TRINARY_ARG2, + /* A literal. The left subtree is the type, and the right subtree + is the value, represented as a DEMANGLE_COMPONENT_NAME. */ + DEMANGLE_COMPONENT_LITERAL, + /* A negative literal. Like LITERAL, but the value is negated. + This is a minor hack: the NAME used for LITERAL points directly + to the mangled string, but since negative numbers are mangled + using 'n' instead of '-', we want a way to indicate a negative + number which involves neither modifying the mangled string nor + allocating a new copy of the literal in memory. */ + DEMANGLE_COMPONENT_LITERAL_NEG, + /* A libgcj compiled resource. The left subtree is the name of the + resource. */ + DEMANGLE_COMPONENT_JAVA_RESOURCE, + /* A name formed by the concatenation of two parts. The left + subtree is the first part and the right subtree the second. */ + DEMANGLE_COMPONENT_COMPOUND_NAME, + /* A name formed by a single character. */ + DEMANGLE_COMPONENT_CHARACTER, + /* A number. */ + DEMANGLE_COMPONENT_NUMBER, + /* A decltype type. */ + DEMANGLE_COMPONENT_DECLTYPE, + /* Global constructors keyed to name. */ + DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS, + /* Global destructors keyed to name. */ + DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS, + /* A lambda closure type. */ + DEMANGLE_COMPONENT_LAMBDA, + /* A default argument scope. */ + DEMANGLE_COMPONENT_DEFAULT_ARG, + /* An unnamed type. */ + DEMANGLE_COMPONENT_UNNAMED_TYPE, + /* A transactional clone. This has one subtree, the encoding for + which it is providing alternative linkage. */ + DEMANGLE_COMPONENT_TRANSACTION_CLONE, + /* A non-transactional clone entry point. In the i386/x86_64 abi, + the unmangled symbol of a tm_callable becomes a thunk and the + non-transactional function version is mangled thus. */ + DEMANGLE_COMPONENT_NONTRANSACTION_CLONE, + /* A pack expansion. */ + DEMANGLE_COMPONENT_PACK_EXPANSION, + /* A name with an ABI tag. */ + DEMANGLE_COMPONENT_TAGGED_NAME, + /* A transaction-safe function type. */ + DEMANGLE_COMPONENT_TRANSACTION_SAFE, + /* A cloned function. */ + DEMANGLE_COMPONENT_CLONE +}; + +/* Types which are only used internally. */ + +struct demangle_operator_info; +struct demangle_builtin_type_info; + +/* A node in the tree representation is an instance of a struct + demangle_component. Note that the field names of the struct are + not well protected against macros defined by the file including + this one. We can fix this if it ever becomes a problem. */ + +struct demangle_component +{ + /* The type of this component. */ + enum demangle_component_type type; + + union + { + /* For DEMANGLE_COMPONENT_NAME. */ + struct + { + /* A pointer to the name (which need not NULL terminated) and + its length. */ + const char *s; + int len; + } s_name; + + /* For DEMANGLE_COMPONENT_OPERATOR. */ + struct + { + /* Operator. */ + const struct demangle_operator_info *op; + } s_operator; + + /* For DEMANGLE_COMPONENT_EXTENDED_OPERATOR. */ + struct + { + /* Number of arguments. */ + int args; + /* Name. */ + struct demangle_component *name; + } s_extended_operator; + + /* For DEMANGLE_COMPONENT_FIXED_TYPE. */ + struct + { + /* The length, indicated by a C integer type name. */ + struct demangle_component *length; + /* _Accum or _Fract? */ + short accum; + /* Saturating or not? */ + short sat; + } s_fixed; + + /* For DEMANGLE_COMPONENT_CTOR. */ + struct + { + /* Kind of constructor. */ + enum gnu_v3_ctor_kinds kind; + /* Name. */ + struct demangle_component *name; + } s_ctor; + + /* For DEMANGLE_COMPONENT_DTOR. */ + struct + { + /* Kind of destructor. */ + enum gnu_v3_dtor_kinds kind; + /* Name. */ + struct demangle_component *name; + } s_dtor; + + /* For DEMANGLE_COMPONENT_BUILTIN_TYPE. */ + struct + { + /* Builtin type. */ + const struct demangle_builtin_type_info *type; + } s_builtin; + + /* For DEMANGLE_COMPONENT_SUB_STD. */ + struct + { + /* Standard substitution string. */ + const char* string; + /* Length of string. */ + int len; + } s_string; + + /* For DEMANGLE_COMPONENT_*_PARAM. */ + struct + { + /* Parameter index. */ + long number; + } s_number; + + /* For DEMANGLE_COMPONENT_CHARACTER. */ + struct + { + int character; + } s_character; + + /* For other types. */ + struct + { + /* Left (or only) subtree. */ + struct demangle_component *left; + /* Right subtree. */ + struct demangle_component *right; + } s_binary; + + struct + { + /* subtree, same place as d_left. */ + struct demangle_component *sub; + /* integer. */ + int num; + } s_unary_num; + + } u; +}; + +/* People building mangled trees are expected to allocate instances of + struct demangle_component themselves. They can then call one of + the following functions to fill them in. */ + +/* Fill in most component types with a left subtree and a right + subtree. Returns non-zero on success, zero on failure, such as an + unrecognized or inappropriate component type. */ + +extern int +cplus_demangle_fill_component (struct demangle_component *fill, + enum demangle_component_type, + struct demangle_component *left, + struct demangle_component *right); + +/* Fill in a DEMANGLE_COMPONENT_NAME. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_name (struct demangle_component *fill, + const char *, int); + +/* Fill in a DEMANGLE_COMPONENT_BUILTIN_TYPE, using the name of the + builtin type (e.g., "int", etc.). Returns non-zero on success, + zero if the type is not recognized. */ + +extern int +cplus_demangle_fill_builtin_type (struct demangle_component *fill, + const char *type_name); + +/* Fill in a DEMANGLE_COMPONENT_OPERATOR, using the name of the + operator and the number of arguments which it takes (the latter is + used to disambiguate operators which can be both binary and unary, + such as '-'). Returns non-zero on success, zero if the operator is + not recognized. */ + +extern int +cplus_demangle_fill_operator (struct demangle_component *fill, + const char *opname, int args); + +/* Fill in a DEMANGLE_COMPONENT_EXTENDED_OPERATOR, providing the + number of arguments and the name. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_extended_operator (struct demangle_component *fill, + int numargs, + struct demangle_component *nm); + +/* Fill in a DEMANGLE_COMPONENT_CTOR. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_ctor (struct demangle_component *fill, + enum gnu_v3_ctor_kinds kind, + struct demangle_component *name); + +/* Fill in a DEMANGLE_COMPONENT_DTOR. Returns non-zero on success, + zero for bad arguments. */ + +extern int +cplus_demangle_fill_dtor (struct demangle_component *fill, + enum gnu_v3_dtor_kinds kind, + struct demangle_component *name); + +/* This function translates a mangled name into a struct + demangle_component tree. The first argument is the mangled name. + The second argument is DMGL_* options. This returns a pointer to a + tree on success, or NULL on failure. On success, the third + argument is set to a block of memory allocated by malloc. This + block should be passed to free when the tree is no longer + needed. */ + +extern struct demangle_component * +cplus_demangle_v3_components (const char *mangled, int options, void **mem); + +/* This function takes a struct demangle_component tree and returns + the corresponding demangled string. The first argument is DMGL_* + options. The second is the tree to demangle. The third is a guess + at the length of the demangled string, used to initially allocate + the return buffer. The fourth is a pointer to a size_t. On + success, this function returns a buffer allocated by malloc(), and + sets the size_t pointed to by the fourth argument to the size of + the allocated buffer (not the length of the returned string). On + failure, this function returns NULL, and sets the size_t pointed to + by the fourth argument to 0 for an invalid tree, or to 1 for a + memory allocation error. */ + +extern char * +cplus_demangle_print (int options, + const struct demangle_component *tree, + int estimated_length, + size_t *p_allocated_size); + +/* This function takes a struct demangle_component tree and passes back + a demangled string in one or more calls to a callback function. + The first argument is DMGL_* options. The second is the tree to + demangle. The third is a pointer to a callback function; on each call + this receives an element of the demangled string, its length, and an + opaque value. The fourth is the opaque value passed to the callback. + The callback is called once or more to return the full demangled + string. The demangled element string is always nul-terminated, though + its length is also provided for convenience. In contrast to + cplus_demangle_print(), this function does not allocate heap memory + to grow output strings (except perhaps where alloca() is implemented + by malloc()), and so is normally safe for use where the heap has been + corrupted. On success, this function returns 1; on failure, 0. */ + +extern int +cplus_demangle_print_callback (int options, + const struct demangle_component *tree, + demangle_callbackref callback, void *opaque); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* DEMANGLE_H */ diff --git a/include/devctl.h b/include/devctl.h new file mode 100644 index 0000000..46305cf --- /dev/null +++ b/include/devctl.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016,2019 Joel Sherrill . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _POSIX_DEVCTL_h_ +#define _POSIX_DEVCTL_h_ + +/* + * Nothing in this file should be visible unless _POSIX_26_C_SOURCE is + * defined. + */ +#ifdef _POSIX_26_C_SOURCE + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__rtems__) +/* + * The FACE Technical Standard, Edition 3.0 and later require the + * definition of the subcommand SOCKCLOSE in . + * + * Reference: https://www.opengroup.org/face + * + * Using 'D' should avoid the letters used by other users of + */ +#include + +#define SOCKCLOSE _IO('D', 1) /* socket close */ +#endif + +/* + * The posix_devctl() method is defined by POSIX 1003.26-2003. Aside + * from the single method, it adds the following requirements: + * + * + define _POSIX_26_VERSION to 200312L + * + add _SC_POSIX_26_VERSION in . Return _POSIX_26_VERSION + * + application must define _POSIX_26_C_SOURCE to use posix_devctl(). + * + posix_devctl() is prototyped in + */ +int posix_devctl( + int fd, + int dcmd, + void *__restrict dev_data_ptr, + size_t nbyte, + int *__restrict dev_info_ptr +); + +#ifdef __cplusplus +} +#endif + +#endif /* _POSIX_26_C_SOURCE */ +#endif /*_POSIX_DEVCTL_h_ */ diff --git a/include/dirent.h b/include/dirent.h new file mode 100644 index 0000000..cdfa21f --- /dev/null +++ b/include/dirent.h @@ -0,0 +1,85 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)dirent.h 8.3 (Berkeley) 8/10/94 + * $FreeBSD: head/include/dirent.h 326024 2017-11-20 19:45:28Z pfg $ + */ + +#ifndef _DIRENT_H_ +#define _DIRENT_H_ + +#include +#include + +#if !defined(MAXNAMLEN) && __BSD_VISIBLE +#define MAXNAMLEN 1024 +#endif + +__BEGIN_DECLS +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700 +int alphasort(const struct dirent **, const struct dirent **); +int dirfd(DIR *); +#endif +#if __BSD_VISIBLE +int fdclosedir(DIR *); +#endif +DIR *opendir(const char *); +DIR *fdopendir(int); +struct dirent * + readdir(DIR *); +#if __POSIX_VISIBLE >= 199506 || __XSI_VISIBLE >= 500 +int readdir_r(DIR *__restrict, struct dirent *__restrict, + struct dirent **__restrict); +#endif +void rewinddir(DIR *); +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700 +int scandir(const char *, struct dirent ***, + int (*)(const struct dirent *), int (*)(const struct dirent **, + const struct dirent **)); +#endif +#ifdef _LIBC +void _seekdir(DIR *, long); +#endif +#if __MISC_VISIBLE || __XSI_VISIBLE +#ifndef __INSIDE_CYGWIN__ +void seekdir(DIR *, long); +long telldir(DIR *); +#endif +#endif +int closedir(DIR *); +#if __GNU_VISIBLE +int scandirat(int, const char *, struct dirent ***, + int (*) (const struct dirent *), int (*) (const struct dirent **, + const struct dirent **)); +int versionsort(const struct dirent **, const struct dirent **); +#endif +__END_DECLS + +#endif /*_DIRENT_H_*/ diff --git a/include/dis-asm.h b/include/dis-asm.h new file mode 100644 index 0000000..78e9fc0 --- /dev/null +++ b/include/dis-asm.h @@ -0,0 +1,382 @@ +/* Interface between the opcode library and its callers. + + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, + 2011, 2012 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. + + Written by Cygnus Support, 1993. + + The opcode library (libopcodes.a) provides instruction decoders for + a large variety of instruction sets, callable with an identical + interface, for making instruction-processing programs more independent + of the instruction set being processed. */ + +#ifndef DIS_ASM_H +#define DIS_ASM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "bfd.h" + + typedef int (*fprintf_ftype) (void *, const char*, ...) ATTRIBUTE_FPTR_PRINTF_2; + +enum dis_insn_type +{ + dis_noninsn, /* Not a valid instruction. */ + dis_nonbranch, /* Not a branch instruction. */ + dis_branch, /* Unconditional branch. */ + dis_condbranch, /* Conditional branch. */ + dis_jsr, /* Jump to subroutine. */ + dis_condjsr, /* Conditional jump to subroutine. */ + dis_dref, /* Data reference instruction. */ + dis_dref2 /* Two data references in instruction. */ +}; + +/* This struct is passed into the instruction decoding routine, + and is passed back out into each callback. The various fields are used + for conveying information from your main routine into your callbacks, + for passing information into the instruction decoders (such as the + addresses of the callback functions), or for passing information + back from the instruction decoders to their callers. + + It must be initialized before it is first passed; this can be done + by hand, or using one of the initialization macros below. */ + +typedef struct disassemble_info +{ + fprintf_ftype fprintf_func; + void *stream; + void *application_data; + + /* Target description. We could replace this with a pointer to the bfd, + but that would require one. There currently isn't any such requirement + so to avoid introducing one we record these explicitly. */ + /* The bfd_flavour. This can be bfd_target_unknown_flavour. */ + enum bfd_flavour flavour; + /* The bfd_arch value. */ + enum bfd_architecture arch; + /* The bfd_mach value. */ + unsigned long mach; + /* Endianness (for bi-endian cpus). Mono-endian cpus can ignore this. */ + enum bfd_endian endian; + /* Endianness of code, for mixed-endian situations such as ARM BE8. */ + enum bfd_endian endian_code; + /* An arch/mach-specific bitmask of selected instruction subsets, mainly + for processors with run-time-switchable instruction sets. The default, + zero, means that there is no constraint. CGEN-based opcodes ports + may use ISA_foo masks. */ + void *insn_sets; + + /* Some targets need information about the current section to accurately + display insns. If this is NULL, the target disassembler function + will have to make its best guess. */ + asection *section; + + /* An array of pointers to symbols either at the location being disassembled + or at the start of the function being disassembled. The array is sorted + so that the first symbol is intended to be the one used. The others are + present for any misc. purposes. This is not set reliably, but if it is + not NULL, it is correct. */ + asymbol **symbols; + /* Number of symbols in array. */ + int num_symbols; + + /* Symbol table provided for targets that want to look at it. This is + used on Arm to find mapping symbols and determine Arm/Thumb code. */ + asymbol **symtab; + int symtab_pos; + int symtab_size; + + /* For use by the disassembler. + The top 16 bits are reserved for public use (and are documented here). + The bottom 16 bits are for the internal use of the disassembler. */ + unsigned long flags; + /* Set if the disassembler has determined that there are one or more + relocations associated with the instruction being disassembled. */ +#define INSN_HAS_RELOC (1 << 31) + /* Set if the user has requested the disassembly of data as well as code. */ +#define DISASSEMBLE_DATA (1 << 30) + /* Set if the user has specifically set the machine type encoded in the + mach field of this structure. */ +#define USER_SPECIFIED_MACHINE_TYPE (1 << 29) + + /* Use internally by the target specific disassembly code. */ + void *private_data; + + /* Function used to get bytes to disassemble. MEMADDR is the + address of the stuff to be disassembled, MYADDR is the address to + put the bytes in, and LENGTH is the number of bytes to read. + INFO is a pointer to this struct. + Returns an errno value or 0 for success. */ + int (*read_memory_func) + (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length, + struct disassemble_info *dinfo); + + /* Function which should be called if we get an error that we can't + recover from. STATUS is the errno value from read_memory_func and + MEMADDR is the address that we were trying to read. INFO is a + pointer to this struct. */ + void (*memory_error_func) + (int status, bfd_vma memaddr, struct disassemble_info *dinfo); + + /* Function called to print ADDR. */ + void (*print_address_func) + (bfd_vma addr, struct disassemble_info *dinfo); + + /* Function called to determine if there is a symbol at the given ADDR. + If there is, the function returns 1, otherwise it returns 0. + This is used by ports which support an overlay manager where + the overlay number is held in the top part of an address. In + some circumstances we want to include the overlay number in the + address, (normally because there is a symbol associated with + that address), but sometimes we want to mask out the overlay bits. */ + int (* symbol_at_address_func) + (bfd_vma addr, struct disassemble_info *dinfo); + + /* Function called to check if a SYMBOL is can be displayed to the user. + This is used by some ports that want to hide special symbols when + displaying debugging outout. */ + bfd_boolean (* symbol_is_valid) + (asymbol *, struct disassemble_info *dinfo); + + /* These are for buffer_read_memory. */ + bfd_byte *buffer; + bfd_vma buffer_vma; + unsigned int buffer_length; + + /* This variable may be set by the instruction decoder. It suggests + the number of bytes objdump should display on a single line. If + the instruction decoder sets this, it should always set it to + the same value in order to get reasonable looking output. */ + int bytes_per_line; + + /* The next two variables control the way objdump displays the raw data. */ + /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */ + /* output will look like this: + 00: 00000000 00000000 + with the chunks displayed according to "display_endian". */ + int bytes_per_chunk; + enum bfd_endian display_endian; + + /* Number of octets per incremented target address + Normally one, but some DSPs have byte sizes of 16 or 32 bits. */ + unsigned int octets_per_byte; + + /* The number of zeroes we want to see at the end of a section before we + start skipping them. */ + unsigned int skip_zeroes; + + /* The number of zeroes to skip at the end of a section. If the number + of zeroes at the end is between SKIP_ZEROES_AT_END and SKIP_ZEROES, + they will be disassembled. If there are fewer than + SKIP_ZEROES_AT_END, they will be skipped. This is a heuristic + attempt to avoid disassembling zeroes inserted by section + alignment. */ + unsigned int skip_zeroes_at_end; + + /* Whether the disassembler always needs the relocations. */ + bfd_boolean disassembler_needs_relocs; + + /* Results from instruction decoders. Not all decoders yet support + this information. This info is set each time an instruction is + decoded, and is only valid for the last such instruction. + + To determine whether this decoder supports this information, set + insn_info_valid to 0, decode an instruction, then check it. */ + + char insn_info_valid; /* Branch info has been set. */ + char branch_delay_insns; /* How many sequential insn's will run before + a branch takes effect. (0 = normal) */ + char data_size; /* Size of data reference in insn, in bytes */ + enum dis_insn_type insn_type; /* Type of instruction */ + bfd_vma target; /* Target address of branch or dref, if known; + zero if unknown. */ + bfd_vma target2; /* Second target address for dref2 */ + + /* Command line options specific to the target disassembler. */ + char * disassembler_options; + +} disassemble_info; + + +/* Standard disassemblers. Disassemble one instruction at the given + target address. Return number of octets processed. */ +typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *); + +extern int print_insn_aarch64 (bfd_vma, disassemble_info *); +extern int print_insn_alpha (bfd_vma, disassemble_info *); +extern int print_insn_avr (bfd_vma, disassemble_info *); +extern int print_insn_bfin (bfd_vma, disassemble_info *); +extern int print_insn_big_arm (bfd_vma, disassemble_info *); +extern int print_insn_big_mips (bfd_vma, disassemble_info *); +extern int print_insn_big_nios2 (bfd_vma, disassemble_info *); +extern int print_insn_big_or32 (bfd_vma, disassemble_info *); +extern int print_insn_big_powerpc (bfd_vma, disassemble_info *); +extern int print_insn_big_score (bfd_vma, disassemble_info *); +extern int print_insn_cr16 (bfd_vma, disassemble_info *); +extern int print_insn_crx (bfd_vma, disassemble_info *); +extern int print_insn_d10v (bfd_vma, disassemble_info *); +extern int print_insn_d30v (bfd_vma, disassemble_info *); +extern int print_insn_dlx (bfd_vma, disassemble_info *); +extern int print_insn_epiphany (bfd_vma, disassemble_info *); +extern int print_insn_fr30 (bfd_vma, disassemble_info *); +extern int print_insn_frv (bfd_vma, disassemble_info *); +extern int print_insn_h8300 (bfd_vma, disassemble_info *); +extern int print_insn_h8300h (bfd_vma, disassemble_info *); +extern int print_insn_h8300s (bfd_vma, disassemble_info *); +extern int print_insn_h8500 (bfd_vma, disassemble_info *); +extern int print_insn_hppa (bfd_vma, disassemble_info *); +extern int print_insn_i370 (bfd_vma, disassemble_info *); +extern int print_insn_i386 (bfd_vma, disassemble_info *); +extern int print_insn_i386_att (bfd_vma, disassemble_info *); +extern int print_insn_i386_intel (bfd_vma, disassemble_info *); +extern int print_insn_i860 (bfd_vma, disassemble_info *); +extern int print_insn_i960 (bfd_vma, disassemble_info *); +extern int print_insn_ia64 (bfd_vma, disassemble_info *); +extern int print_insn_ip2k (bfd_vma, disassemble_info *); +extern int print_insn_iq2000 (bfd_vma, disassemble_info *); +extern int print_insn_little_arm (bfd_vma, disassemble_info *); +extern int print_insn_little_mips (bfd_vma, disassemble_info *); +extern int print_insn_little_nios2 (bfd_vma, disassemble_info *); +extern int print_insn_little_or32 (bfd_vma, disassemble_info *); +extern int print_insn_little_powerpc (bfd_vma, disassemble_info *); +extern int print_insn_little_score (bfd_vma, disassemble_info *); +extern int print_insn_lm32 (bfd_vma, disassemble_info *); +extern int print_insn_m32c (bfd_vma, disassemble_info *); +extern int print_insn_m32r (bfd_vma, disassemble_info *); +extern int print_insn_m68hc11 (bfd_vma, disassemble_info *); +extern int print_insn_m68hc12 (bfd_vma, disassemble_info *); +extern int print_insn_m9s12x (bfd_vma, disassemble_info *); +extern int print_insn_m9s12xg (bfd_vma, disassemble_info *); +extern int print_insn_m68k (bfd_vma, disassemble_info *); +extern int print_insn_m88k (bfd_vma, disassemble_info *); +extern int print_insn_mcore (bfd_vma, disassemble_info *); +extern int print_insn_mep (bfd_vma, disassemble_info *); +extern int print_insn_metag (bfd_vma, disassemble_info *); +extern int print_insn_microblaze (bfd_vma, disassemble_info *); +extern int print_insn_mmix (bfd_vma, disassemble_info *); +extern int print_insn_mn10200 (bfd_vma, disassemble_info *); +extern int print_insn_mn10300 (bfd_vma, disassemble_info *); +extern int print_insn_moxie (bfd_vma, disassemble_info *); +extern int print_insn_msp430 (bfd_vma, disassemble_info *); +extern int print_insn_mt (bfd_vma, disassemble_info *); +extern int print_insn_ns32k (bfd_vma, disassemble_info *); +extern int print_insn_openrisc (bfd_vma, disassemble_info *); +extern int print_insn_pdp11 (bfd_vma, disassemble_info *); +extern int print_insn_pj (bfd_vma, disassemble_info *); +extern int print_insn_rs6000 (bfd_vma, disassemble_info *); +extern int print_insn_s390 (bfd_vma, disassemble_info *); +extern int print_insn_sh (bfd_vma, disassemble_info *); +extern int print_insn_sh64 (bfd_vma, disassemble_info *); +extern int print_insn_sh64x_media (bfd_vma, disassemble_info *); +extern int print_insn_sparc (bfd_vma, disassemble_info *); +extern int print_insn_spu (bfd_vma, disassemble_info *); +extern int print_insn_tic30 (bfd_vma, disassemble_info *); +extern int print_insn_tic4x (bfd_vma, disassemble_info *); +extern int print_insn_tic54x (bfd_vma, disassemble_info *); +extern int print_insn_tic6x (bfd_vma, disassemble_info *); +extern int print_insn_tic80 (bfd_vma, disassemble_info *); +extern int print_insn_tilegx (bfd_vma, disassemble_info *); +extern int print_insn_tilepro (bfd_vma, disassemble_info *); +extern int print_insn_v850 (bfd_vma, disassemble_info *); +extern int print_insn_vax (bfd_vma, disassemble_info *); +extern int print_insn_w65 (bfd_vma, disassemble_info *); +extern int print_insn_xc16x (bfd_vma, disassemble_info *); +extern int print_insn_xgate (bfd_vma, disassemble_info *); +extern int print_insn_xstormy16 (bfd_vma, disassemble_info *); +extern int print_insn_xtensa (bfd_vma, disassemble_info *); +extern int print_insn_z80 (bfd_vma, disassemble_info *); +extern int print_insn_z8001 (bfd_vma, disassemble_info *); +extern int print_insn_z8002 (bfd_vma, disassemble_info *); +extern int print_insn_rx (bfd_vma, disassemble_info *); +extern int print_insn_rl78 (bfd_vma, disassemble_info *); + +extern disassembler_ftype arc_get_disassembler (void *); +extern disassembler_ftype cris_get_disassembler (bfd *); + +extern void print_aarch64_disassembler_options (FILE *); +extern void print_i386_disassembler_options (FILE *); +extern void print_mips_disassembler_options (FILE *); +extern void print_ppc_disassembler_options (FILE *); +extern void print_arm_disassembler_options (FILE *); +extern void parse_arm_disassembler_option (char *); +extern void print_s390_disassembler_options (FILE *); +extern int get_arm_regname_num_options (void); +extern int set_arm_regname_option (int); +extern int get_arm_regnames (int, const char **, const char **, const char *const **); +extern bfd_boolean aarch64_symbol_is_valid (asymbol *, struct disassemble_info *); +extern bfd_boolean arm_symbol_is_valid (asymbol *, struct disassemble_info *); +extern void disassemble_init_powerpc (struct disassemble_info *); + +/* Fetch the disassembler for a given BFD, if that support is available. */ +extern disassembler_ftype disassembler (bfd *); + +/* Amend the disassemble_info structure as necessary for the target architecture. + Should only be called after initialising the info->arch field. */ +extern void disassemble_init_for_target (struct disassemble_info * dinfo); + +/* Document any target specific options available from the disassembler. */ +extern void disassembler_usage (FILE *); + + +/* This block of definitions is for particular callers who read instructions + into a buffer before calling the instruction decoder. */ + +/* Here is a function which callers may wish to use for read_memory_func. + It gets bytes from a buffer. */ +extern int buffer_read_memory + (bfd_vma, bfd_byte *, unsigned int, struct disassemble_info *); + +/* This function goes with buffer_read_memory. + It prints a message using info->fprintf_func and info->stream. */ +extern void perror_memory (int, bfd_vma, struct disassemble_info *); + + +/* Just print the address in hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ +extern void generic_print_address + (bfd_vma, struct disassemble_info *); + +/* Always true. */ +extern int generic_symbol_at_address + (bfd_vma, struct disassemble_info *); + +/* Also always true. */ +extern bfd_boolean generic_symbol_is_valid + (asymbol *, struct disassemble_info *); + +/* Method to initialize a disassemble_info struct. This should be + called by all applications creating such a struct. */ +extern void init_disassemble_info (struct disassemble_info *dinfo, void *stream, + fprintf_ftype fprintf_func); + +/* For compatibility with existing code. */ +#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \ + init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC)) +#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \ + init_disassemble_info (&(INFO), (STREAM), (fprintf_ftype) (FPRINTF_FUNC)) + + +#ifdef __cplusplus +} +#endif + +#endif /* ! defined (DIS_ASM_H) */ diff --git a/include/dwarf2.def b/include/dwarf2.def new file mode 100644 index 0000000..2dfee56 --- /dev/null +++ b/include/dwarf2.def @@ -0,0 +1,713 @@ +/* -*- c -*- + Declarations and definitions of codes relating to the DWARF2 and + DWARF3 symbolic debugging information formats. + Copyright (C) 1992-2015 Free Software Foundation, Inc. + + Written by Gary Funck (gary@intrepid.com) The Ada Joint Program + Office (AJPO), Florida State University and Silicon Graphics Inc. + provided support for this effort -- June 21, 1995. + + Derived from the DWARF 1 implementation written by Ron Guilmette + (rfg@netcom.com), November 1990. + + This file is part of GCC. + + GCC 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, or (at your option) any later + version. + + GCC 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. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . */ + +/* This file is derived from the DWARF specification (a public document) + Revision 2.0.0 (July 27, 1993) developed by the UNIX International + Programming Languages Special Interest Group (UI/PLSIG) and distributed + by UNIX International. Copies of this specification are available from + UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. + + This file also now contains definitions from the DWARF 3 specification + published Dec 20, 2005, available from: http://dwarf.freestandards.org. + + This file also now contains definitions from the DWARF 4 + specification, available from: http://dwarfstd.org/ */ + +/* This file declares various DWARF-related constants using a set of + macros which can be redefined by the including file. + + The macros are in sections. Each section corresponds to a single + set of DWARF constants and has a corresponding key. The key is + used in all the macro names. + + The sections are TAG (for DW_TAG_ constants), FORM (DW_FORM_), AT + (DW_AT_), OP (DW_OP_), ATE (DW_ATE_), and CFA (DW_CFA_). + + Using TAG as an example, the following macros may be used for each + key: + + DW_FIRST_TAG(name, value) - Introduce the first DW_TAG constant. + + DW_TAG(name, value) - Define a subsequent constant. + + DW_TAG_DUP(name, value) - Define a subsequent constant whose value + is a duplicate of some other constant. Not all keys use the _DUP + macro form. If more than one name shares a value, then the base + (DW_TAG) form will be the preferred name and DW_TAG_DUP will hold + any alternate names. + + DW_END_TAG - Invoked at the end of the DW_TAG constants. */ + +DW_FIRST_TAG (DW_TAG_padding, 0x00) +DW_TAG (DW_TAG_array_type, 0x01) +DW_TAG (DW_TAG_class_type, 0x02) +DW_TAG (DW_TAG_entry_point, 0x03) +DW_TAG (DW_TAG_enumeration_type, 0x04) +DW_TAG (DW_TAG_formal_parameter, 0x05) +DW_TAG (DW_TAG_imported_declaration, 0x08) +DW_TAG (DW_TAG_label, 0x0a) +DW_TAG (DW_TAG_lexical_block, 0x0b) +DW_TAG (DW_TAG_member, 0x0d) +DW_TAG (DW_TAG_pointer_type, 0x0f) +DW_TAG (DW_TAG_reference_type, 0x10) +DW_TAG (DW_TAG_compile_unit, 0x11) +DW_TAG (DW_TAG_string_type, 0x12) +DW_TAG (DW_TAG_structure_type, 0x13) +DW_TAG (DW_TAG_subroutine_type, 0x15) +DW_TAG (DW_TAG_typedef, 0x16) +DW_TAG (DW_TAG_union_type, 0x17) +DW_TAG (DW_TAG_unspecified_parameters, 0x18) +DW_TAG (DW_TAG_variant, 0x19) +DW_TAG (DW_TAG_common_block, 0x1a) +DW_TAG (DW_TAG_common_inclusion, 0x1b) +DW_TAG (DW_TAG_inheritance, 0x1c) +DW_TAG (DW_TAG_inlined_subroutine, 0x1d) +DW_TAG (DW_TAG_module, 0x1e) +DW_TAG (DW_TAG_ptr_to_member_type, 0x1f) +DW_TAG (DW_TAG_set_type, 0x20) +DW_TAG (DW_TAG_subrange_type, 0x21) +DW_TAG (DW_TAG_with_stmt, 0x22) +DW_TAG (DW_TAG_access_declaration, 0x23) +DW_TAG (DW_TAG_base_type, 0x24) +DW_TAG (DW_TAG_catch_block, 0x25) +DW_TAG (DW_TAG_const_type, 0x26) +DW_TAG (DW_TAG_constant, 0x27) +DW_TAG (DW_TAG_enumerator, 0x28) +DW_TAG (DW_TAG_file_type, 0x29) +DW_TAG (DW_TAG_friend, 0x2a) +DW_TAG (DW_TAG_namelist, 0x2b) +DW_TAG (DW_TAG_namelist_item, 0x2c) +DW_TAG (DW_TAG_packed_type, 0x2d) +DW_TAG (DW_TAG_subprogram, 0x2e) +DW_TAG (DW_TAG_template_type_param, 0x2f) +DW_TAG (DW_TAG_template_value_param, 0x30) +DW_TAG (DW_TAG_thrown_type, 0x31) +DW_TAG (DW_TAG_try_block, 0x32) +DW_TAG (DW_TAG_variant_part, 0x33) +DW_TAG (DW_TAG_variable, 0x34) +DW_TAG (DW_TAG_volatile_type, 0x35) +/* DWARF 3. */ +DW_TAG (DW_TAG_dwarf_procedure, 0x36) +DW_TAG (DW_TAG_restrict_type, 0x37) +DW_TAG (DW_TAG_interface_type, 0x38) +DW_TAG (DW_TAG_namespace, 0x39) +DW_TAG (DW_TAG_imported_module, 0x3a) +DW_TAG (DW_TAG_unspecified_type, 0x3b) +DW_TAG (DW_TAG_partial_unit, 0x3c) +DW_TAG (DW_TAG_imported_unit, 0x3d) +DW_TAG (DW_TAG_condition, 0x3f) +DW_TAG (DW_TAG_shared_type, 0x40) +/* DWARF 4. */ +DW_TAG (DW_TAG_type_unit, 0x41) +DW_TAG (DW_TAG_rvalue_reference_type, 0x42) +DW_TAG (DW_TAG_template_alias, 0x43) +/* DWARF 5. */ +DW_TAG (DW_TAG_atomic_type, 0x47) + +DW_TAG_DUP (DW_TAG_lo_user, 0x4080) +DW_TAG_DUP (DW_TAG_hi_user, 0xffff) + +/* SGI/MIPS Extensions. */ +DW_TAG (DW_TAG_MIPS_loop, 0x4081) + +/* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */ +DW_TAG (DW_TAG_HP_array_descriptor, 0x4090) +DW_TAG (DW_TAG_HP_Bliss_field, 0x4091) +DW_TAG (DW_TAG_HP_Bliss_field_set, 0x4092) + +/* GNU extensions. */ +DW_TAG (DW_TAG_format_label, 0x4101) /* For FORTRAN 77 and Fortran 90. */ +DW_TAG (DW_TAG_function_template, 0x4102) /* For C++. */ +DW_TAG (DW_TAG_class_template, 0x4103) /* For C++. */ +DW_TAG (DW_TAG_GNU_BINCL, 0x4104) +DW_TAG (DW_TAG_GNU_EINCL, 0x4105) +/* Template template parameter. + See http://gcc.gnu.org/wiki/TemplateParmsDwarf . */ +DW_TAG (DW_TAG_GNU_template_template_param, 0x4106) + +/* Template parameter pack extension, specified at + http://wiki.dwarfstd.org/index.php?title=C%2B%2B0x:_Variadic_templates + The values of these two TAGS are in the DW_TAG_GNU_* space until the tags + are properly part of DWARF 5. */ +DW_TAG (DW_TAG_GNU_template_parameter_pack, 0x4107) +DW_TAG (DW_TAG_GNU_formal_parameter_pack, 0x4108) +/* The GNU call site extension, specified at + http://www.dwarfstd.org/ShowIssue.php?issue=100909.2&type=open . + The values of these two TAGS are in the DW_TAG_GNU_* space until the tags + are properly part of DWARF 5. */ +DW_TAG (DW_TAG_GNU_call_site, 0x4109) +DW_TAG (DW_TAG_GNU_call_site_parameter, 0x410a) +/* Extensions for UPC. See: http://dwarfstd.org/doc/DWARF4.pdf. */ +DW_TAG (DW_TAG_upc_shared_type, 0x8765) +DW_TAG (DW_TAG_upc_strict_type, 0x8766) +DW_TAG (DW_TAG_upc_relaxed_type, 0x8767) +/* PGI (STMicroelectronics) extensions. No documentation available. */ +DW_TAG (DW_TAG_PGI_kanji_type, 0xA000) +DW_TAG (DW_TAG_PGI_interface_block, 0xA020) +DW_END_TAG + +DW_FIRST_FORM (DW_FORM_addr, 0x01) +DW_FORM (DW_FORM_block2, 0x03) +DW_FORM (DW_FORM_block4, 0x04) +DW_FORM (DW_FORM_data2, 0x05) +DW_FORM (DW_FORM_data4, 0x06) +DW_FORM (DW_FORM_data8, 0x07) +DW_FORM (DW_FORM_string, 0x08) +DW_FORM (DW_FORM_block, 0x09) +DW_FORM (DW_FORM_block1, 0x0a) +DW_FORM (DW_FORM_data1, 0x0b) +DW_FORM (DW_FORM_flag, 0x0c) +DW_FORM (DW_FORM_sdata, 0x0d) +DW_FORM (DW_FORM_strp, 0x0e) +DW_FORM (DW_FORM_udata, 0x0f) +DW_FORM (DW_FORM_ref_addr, 0x10) +DW_FORM (DW_FORM_ref1, 0x11) +DW_FORM (DW_FORM_ref2, 0x12) +DW_FORM (DW_FORM_ref4, 0x13) +DW_FORM (DW_FORM_ref8, 0x14) +DW_FORM (DW_FORM_ref_udata, 0x15) +DW_FORM (DW_FORM_indirect, 0x16) +/* DWARF 4. */ +DW_FORM (DW_FORM_sec_offset, 0x17) +DW_FORM (DW_FORM_exprloc, 0x18) +DW_FORM (DW_FORM_flag_present, 0x19) +DW_FORM (DW_FORM_ref_sig8, 0x20) +/* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ +DW_FORM (DW_FORM_GNU_addr_index, 0x1f01) +DW_FORM (DW_FORM_GNU_str_index, 0x1f02) +/* Extensions for DWZ multifile. + See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */ +DW_FORM (DW_FORM_GNU_ref_alt, 0x1f20) +DW_FORM (DW_FORM_GNU_strp_alt, 0x1f21) +DW_END_FORM + +DW_FIRST_AT (DW_AT_sibling, 0x01) +DW_AT (DW_AT_location, 0x02) +DW_AT (DW_AT_name, 0x03) +DW_AT (DW_AT_ordering, 0x09) +DW_AT (DW_AT_subscr_data, 0x0a) +DW_AT (DW_AT_byte_size, 0x0b) +DW_AT (DW_AT_bit_offset, 0x0c) +DW_AT (DW_AT_bit_size, 0x0d) +DW_AT (DW_AT_element_list, 0x0f) +DW_AT (DW_AT_stmt_list, 0x10) +DW_AT (DW_AT_low_pc, 0x11) +DW_AT (DW_AT_high_pc, 0x12) +DW_AT (DW_AT_language, 0x13) +DW_AT (DW_AT_member, 0x14) +DW_AT (DW_AT_discr, 0x15) +DW_AT (DW_AT_discr_value, 0x16) +DW_AT (DW_AT_visibility, 0x17) +DW_AT (DW_AT_import, 0x18) +DW_AT (DW_AT_string_length, 0x19) +DW_AT (DW_AT_common_reference, 0x1a) +DW_AT (DW_AT_comp_dir, 0x1b) +DW_AT (DW_AT_const_value, 0x1c) +DW_AT (DW_AT_containing_type, 0x1d) +DW_AT (DW_AT_default_value, 0x1e) +DW_AT (DW_AT_inline, 0x20) +DW_AT (DW_AT_is_optional, 0x21) +DW_AT (DW_AT_lower_bound, 0x22) +DW_AT (DW_AT_producer, 0x25) +DW_AT (DW_AT_prototyped, 0x27) +DW_AT (DW_AT_return_addr, 0x2a) +DW_AT (DW_AT_start_scope, 0x2c) +DW_AT (DW_AT_bit_stride, 0x2e) +DW_AT (DW_AT_upper_bound, 0x2f) +DW_AT (DW_AT_abstract_origin, 0x31) +DW_AT (DW_AT_accessibility, 0x32) +DW_AT (DW_AT_address_class, 0x33) +DW_AT (DW_AT_artificial, 0x34) +DW_AT (DW_AT_base_types, 0x35) +DW_AT (DW_AT_calling_convention, 0x36) +DW_AT (DW_AT_count, 0x37) +DW_AT (DW_AT_data_member_location, 0x38) +DW_AT (DW_AT_decl_column, 0x39) +DW_AT (DW_AT_decl_file, 0x3a) +DW_AT (DW_AT_decl_line, 0x3b) +DW_AT (DW_AT_declaration, 0x3c) +DW_AT (DW_AT_discr_list, 0x3d) +DW_AT (DW_AT_encoding, 0x3e) +DW_AT (DW_AT_external, 0x3f) +DW_AT (DW_AT_frame_base, 0x40) +DW_AT (DW_AT_friend, 0x41) +DW_AT (DW_AT_identifier_case, 0x42) +DW_AT (DW_AT_macro_info, 0x43) +DW_AT (DW_AT_namelist_items, 0x44) +DW_AT (DW_AT_priority, 0x45) +DW_AT (DW_AT_segment, 0x46) +DW_AT (DW_AT_specification, 0x47) +DW_AT (DW_AT_static_link, 0x48) +DW_AT (DW_AT_type, 0x49) +DW_AT (DW_AT_use_location, 0x4a) +DW_AT (DW_AT_variable_parameter, 0x4b) +DW_AT (DW_AT_virtuality, 0x4c) +DW_AT (DW_AT_vtable_elem_location, 0x4d) +/* DWARF 3 values. */ +DW_AT (DW_AT_allocated, 0x4e) +DW_AT (DW_AT_associated, 0x4f) +DW_AT (DW_AT_data_location, 0x50) +DW_AT (DW_AT_byte_stride, 0x51) +DW_AT (DW_AT_entry_pc, 0x52) +DW_AT (DW_AT_use_UTF8, 0x53) +DW_AT (DW_AT_extension, 0x54) +DW_AT (DW_AT_ranges, 0x55) +DW_AT (DW_AT_trampoline, 0x56) +DW_AT (DW_AT_call_column, 0x57) +DW_AT (DW_AT_call_file, 0x58) +DW_AT (DW_AT_call_line, 0x59) +DW_AT (DW_AT_description, 0x5a) +DW_AT (DW_AT_binary_scale, 0x5b) +DW_AT (DW_AT_decimal_scale, 0x5c) +DW_AT (DW_AT_small, 0x5d) +DW_AT (DW_AT_decimal_sign, 0x5e) +DW_AT (DW_AT_digit_count, 0x5f) +DW_AT (DW_AT_picture_string, 0x60) +DW_AT (DW_AT_mutable, 0x61) +DW_AT (DW_AT_threads_scaled, 0x62) +DW_AT (DW_AT_explicit, 0x63) +DW_AT (DW_AT_object_pointer, 0x64) +DW_AT (DW_AT_endianity, 0x65) +DW_AT (DW_AT_elemental, 0x66) +DW_AT (DW_AT_pure, 0x67) +DW_AT (DW_AT_recursive, 0x68) +/* DWARF 4. */ +DW_AT (DW_AT_signature, 0x69) +DW_AT (DW_AT_main_subprogram, 0x6a) +DW_AT (DW_AT_data_bit_offset, 0x6b) +DW_AT (DW_AT_const_expr, 0x6c) +DW_AT (DW_AT_enum_class, 0x6d) +DW_AT (DW_AT_linkage_name, 0x6e) +/* DWARF 5. */ +DW_AT (DW_AT_noreturn, 0x87) + +DW_AT_DUP (DW_AT_lo_user, 0x2000) /* Implementation-defined range start. */ +DW_AT_DUP (DW_AT_hi_user, 0x3fff) /* Implementation-defined range end. */ + +/* SGI/MIPS extensions. */ +DW_AT (DW_AT_MIPS_fde, 0x2001) +DW_AT (DW_AT_MIPS_loop_begin, 0x2002) +DW_AT (DW_AT_MIPS_tail_loop_begin, 0x2003) +DW_AT (DW_AT_MIPS_epilog_begin, 0x2004) +DW_AT (DW_AT_MIPS_loop_unroll_factor, 0x2005) +DW_AT (DW_AT_MIPS_software_pipeline_depth, 0x2006) +DW_AT (DW_AT_MIPS_linkage_name, 0x2007) +DW_AT (DW_AT_MIPS_stride, 0x2008) +DW_AT (DW_AT_MIPS_abstract_name, 0x2009) +DW_AT (DW_AT_MIPS_clone_origin, 0x200a) +DW_AT (DW_AT_MIPS_has_inlines, 0x200b) +/* HP extensions. */ +DW_AT (DW_AT_HP_block_index, 0x2000) +DW_AT_DUP (DW_AT_HP_unmodifiable, 0x2001) /* Same as DW_AT_MIPS_fde. */ +DW_AT_DUP (DW_AT_HP_prologue, 0x2005) /* Same as DW_AT_MIPS_loop_unroll. */ +DW_AT_DUP (DW_AT_HP_epilogue, 0x2008) /* Same as DW_AT_MIPS_stride. */ +DW_AT (DW_AT_HP_actuals_stmt_list, 0x2010) +DW_AT (DW_AT_HP_proc_per_section, 0x2011) +DW_AT (DW_AT_HP_raw_data_ptr, 0x2012) +DW_AT (DW_AT_HP_pass_by_reference, 0x2013) +DW_AT (DW_AT_HP_opt_level, 0x2014) +DW_AT (DW_AT_HP_prof_version_id, 0x2015) +DW_AT (DW_AT_HP_opt_flags, 0x2016) +DW_AT (DW_AT_HP_cold_region_low_pc, 0x2017) +DW_AT (DW_AT_HP_cold_region_high_pc, 0x2018) +DW_AT (DW_AT_HP_all_variables_modifiable, 0x2019) +DW_AT (DW_AT_HP_linkage_name, 0x201a) +DW_AT (DW_AT_HP_prof_flags, 0x201b) /* In comp unit of procs_info for -g. */ +DW_AT (DW_AT_HP_unit_name, 0x201f) +DW_AT (DW_AT_HP_unit_size, 0x2020) +DW_AT (DW_AT_HP_widened_byte_size, 0x2021) +DW_AT (DW_AT_HP_definition_points, 0x2022) +DW_AT (DW_AT_HP_default_location, 0x2023) +DW_AT (DW_AT_HP_is_result_param, 0x2029) + +/* GNU extensions. */ +DW_AT (DW_AT_sf_names, 0x2101) +DW_AT (DW_AT_src_info, 0x2102) +DW_AT (DW_AT_mac_info, 0x2103) +DW_AT (DW_AT_src_coords, 0x2104) +DW_AT (DW_AT_body_begin, 0x2105) +DW_AT (DW_AT_body_end, 0x2106) +DW_AT (DW_AT_GNU_vector, 0x2107) +/* Thread-safety annotations. + See http://gcc.gnu.org/wiki/ThreadSafetyAnnotation . */ +DW_AT (DW_AT_GNU_guarded_by, 0x2108) +DW_AT (DW_AT_GNU_pt_guarded_by, 0x2109) +DW_AT (DW_AT_GNU_guarded, 0x210a) +DW_AT (DW_AT_GNU_pt_guarded, 0x210b) +DW_AT (DW_AT_GNU_locks_excluded, 0x210c) +DW_AT (DW_AT_GNU_exclusive_locks_required, 0x210d) +DW_AT (DW_AT_GNU_shared_locks_required, 0x210e) +/* One-definition rule violation detection. + See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo . */ +DW_AT (DW_AT_GNU_odr_signature, 0x210f) +/* Template template argument name. + See http://gcc.gnu.org/wiki/TemplateParmsDwarf . */ +DW_AT (DW_AT_GNU_template_name, 0x2110) +/* The GNU call site extension. + See http://www.dwarfstd.org/ShowIssue.php?issue=100909.2&type=open . */ +DW_AT (DW_AT_GNU_call_site_value, 0x2111) +DW_AT (DW_AT_GNU_call_site_data_value, 0x2112) +DW_AT (DW_AT_GNU_call_site_target, 0x2113) +DW_AT (DW_AT_GNU_call_site_target_clobbered, 0x2114) +DW_AT (DW_AT_GNU_tail_call, 0x2115) +DW_AT (DW_AT_GNU_all_tail_call_sites, 0x2116) +DW_AT (DW_AT_GNU_all_call_sites, 0x2117) +DW_AT (DW_AT_GNU_all_source_call_sites, 0x2118) +/* Section offset into .debug_macro section. */ +DW_AT (DW_AT_GNU_macros, 0x2119) +/* Attribute for C++ deleted special member functions (= delete;). */ +DW_AT (DW_AT_GNU_deleted, 0x211a) +/* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ +DW_AT (DW_AT_GNU_dwo_name, 0x2130) +DW_AT (DW_AT_GNU_dwo_id, 0x2131) +DW_AT (DW_AT_GNU_ranges_base, 0x2132) +DW_AT (DW_AT_GNU_addr_base, 0x2133) +DW_AT (DW_AT_GNU_pubnames, 0x2134) +DW_AT (DW_AT_GNU_pubtypes, 0x2135) +/* Attribute for discriminator. + See http://gcc.gnu.org/wiki/Discriminator */ +DW_AT (DW_AT_GNU_discriminator, 0x2136) +/* VMS extensions. */ +DW_AT (DW_AT_VMS_rtnbeg_pd_address, 0x2201) +/* GNAT extensions. */ +/* GNAT descriptive type. + See http://gcc.gnu.org/wiki/DW_AT_GNAT_descriptive_type . */ +DW_AT (DW_AT_use_GNAT_descriptive_type, 0x2301) +DW_AT (DW_AT_GNAT_descriptive_type, 0x2302) +/* Rational constant extension. + See https://gcc.gnu.org/wiki/DW_AT_GNU_numerator_denominator . */ +DW_TAG (DW_AT_GNU_numerator, 0x2303) +DW_TAG (DW_AT_GNU_denominator, 0x2304) +/* Biased integer extension. + See https://gcc.gnu.org/wiki/DW_AT_GNU_bias . */ +DW_TAG (DW_AT_GNU_bias, 0x2305) +/* UPC extension. */ +DW_AT (DW_AT_upc_threads_scaled, 0x3210) +/* PGI (STMicroelectronics) extensions. */ +DW_AT (DW_AT_PGI_lbase, 0x3a00) +DW_AT (DW_AT_PGI_soffset, 0x3a01) +DW_AT (DW_AT_PGI_lstride, 0x3a02) +/* Apple extensions. */ +DW_AT (DW_AT_APPLE_optimized, 0x3fe1) +DW_AT (DW_AT_APPLE_flags, 0x3fe2) +DW_AT (DW_AT_APPLE_isa, 0x3fe3) +DW_AT (DW_AT_APPLE_block, 0x3fe4) +DW_AT (DW_AT_APPLE_major_runtime_vers, 0x3fe5) +DW_AT (DW_AT_APPLE_runtime_class, 0x3fe6) +DW_AT (DW_AT_APPLE_omit_frame_ptr, 0x3fe7) +DW_AT (DW_AT_APPLE_property_name, 0x3fe8) +DW_AT (DW_AT_APPLE_property_getter, 0x3fe9) +DW_AT (DW_AT_APPLE_property_setter, 0x3fea) +DW_AT (DW_AT_APPLE_property_attribute, 0x3feb) +DW_AT (DW_AT_APPLE_objc_complete_type, 0x3fec) +DW_AT (DW_AT_APPLE_property, 0x3fed) +DW_END_AT + +DW_FIRST_OP (DW_OP_addr, 0x03) +DW_OP (DW_OP_deref, 0x06) +DW_OP (DW_OP_const1u, 0x08) +DW_OP (DW_OP_const1s, 0x09) +DW_OP (DW_OP_const2u, 0x0a) +DW_OP (DW_OP_const2s, 0x0b) +DW_OP (DW_OP_const4u, 0x0c) +DW_OP (DW_OP_const4s, 0x0d) +DW_OP (DW_OP_const8u, 0x0e) +DW_OP (DW_OP_const8s, 0x0f) +DW_OP (DW_OP_constu, 0x10) +DW_OP (DW_OP_consts, 0x11) +DW_OP (DW_OP_dup, 0x12) +DW_OP (DW_OP_drop, 0x13) +DW_OP (DW_OP_over, 0x14) +DW_OP (DW_OP_pick, 0x15) +DW_OP (DW_OP_swap, 0x16) +DW_OP (DW_OP_rot, 0x17) +DW_OP (DW_OP_xderef, 0x18) +DW_OP (DW_OP_abs, 0x19) +DW_OP (DW_OP_and, 0x1a) +DW_OP (DW_OP_div, 0x1b) +DW_OP (DW_OP_minus, 0x1c) +DW_OP (DW_OP_mod, 0x1d) +DW_OP (DW_OP_mul, 0x1e) +DW_OP (DW_OP_neg, 0x1f) +DW_OP (DW_OP_not, 0x20) +DW_OP (DW_OP_or, 0x21) +DW_OP (DW_OP_plus, 0x22) +DW_OP (DW_OP_plus_uconst, 0x23) +DW_OP (DW_OP_shl, 0x24) +DW_OP (DW_OP_shr, 0x25) +DW_OP (DW_OP_shra, 0x26) +DW_OP (DW_OP_xor, 0x27) +DW_OP (DW_OP_bra, 0x28) +DW_OP (DW_OP_eq, 0x29) +DW_OP (DW_OP_ge, 0x2a) +DW_OP (DW_OP_gt, 0x2b) +DW_OP (DW_OP_le, 0x2c) +DW_OP (DW_OP_lt, 0x2d) +DW_OP (DW_OP_ne, 0x2e) +DW_OP (DW_OP_skip, 0x2f) +DW_OP (DW_OP_lit0, 0x30) +DW_OP (DW_OP_lit1, 0x31) +DW_OP (DW_OP_lit2, 0x32) +DW_OP (DW_OP_lit3, 0x33) +DW_OP (DW_OP_lit4, 0x34) +DW_OP (DW_OP_lit5, 0x35) +DW_OP (DW_OP_lit6, 0x36) +DW_OP (DW_OP_lit7, 0x37) +DW_OP (DW_OP_lit8, 0x38) +DW_OP (DW_OP_lit9, 0x39) +DW_OP (DW_OP_lit10, 0x3a) +DW_OP (DW_OP_lit11, 0x3b) +DW_OP (DW_OP_lit12, 0x3c) +DW_OP (DW_OP_lit13, 0x3d) +DW_OP (DW_OP_lit14, 0x3e) +DW_OP (DW_OP_lit15, 0x3f) +DW_OP (DW_OP_lit16, 0x40) +DW_OP (DW_OP_lit17, 0x41) +DW_OP (DW_OP_lit18, 0x42) +DW_OP (DW_OP_lit19, 0x43) +DW_OP (DW_OP_lit20, 0x44) +DW_OP (DW_OP_lit21, 0x45) +DW_OP (DW_OP_lit22, 0x46) +DW_OP (DW_OP_lit23, 0x47) +DW_OP (DW_OP_lit24, 0x48) +DW_OP (DW_OP_lit25, 0x49) +DW_OP (DW_OP_lit26, 0x4a) +DW_OP (DW_OP_lit27, 0x4b) +DW_OP (DW_OP_lit28, 0x4c) +DW_OP (DW_OP_lit29, 0x4d) +DW_OP (DW_OP_lit30, 0x4e) +DW_OP (DW_OP_lit31, 0x4f) +DW_OP (DW_OP_reg0, 0x50) +DW_OP (DW_OP_reg1, 0x51) +DW_OP (DW_OP_reg2, 0x52) +DW_OP (DW_OP_reg3, 0x53) +DW_OP (DW_OP_reg4, 0x54) +DW_OP (DW_OP_reg5, 0x55) +DW_OP (DW_OP_reg6, 0x56) +DW_OP (DW_OP_reg7, 0x57) +DW_OP (DW_OP_reg8, 0x58) +DW_OP (DW_OP_reg9, 0x59) +DW_OP (DW_OP_reg10, 0x5a) +DW_OP (DW_OP_reg11, 0x5b) +DW_OP (DW_OP_reg12, 0x5c) +DW_OP (DW_OP_reg13, 0x5d) +DW_OP (DW_OP_reg14, 0x5e) +DW_OP (DW_OP_reg15, 0x5f) +DW_OP (DW_OP_reg16, 0x60) +DW_OP (DW_OP_reg17, 0x61) +DW_OP (DW_OP_reg18, 0x62) +DW_OP (DW_OP_reg19, 0x63) +DW_OP (DW_OP_reg20, 0x64) +DW_OP (DW_OP_reg21, 0x65) +DW_OP (DW_OP_reg22, 0x66) +DW_OP (DW_OP_reg23, 0x67) +DW_OP (DW_OP_reg24, 0x68) +DW_OP (DW_OP_reg25, 0x69) +DW_OP (DW_OP_reg26, 0x6a) +DW_OP (DW_OP_reg27, 0x6b) +DW_OP (DW_OP_reg28, 0x6c) +DW_OP (DW_OP_reg29, 0x6d) +DW_OP (DW_OP_reg30, 0x6e) +DW_OP (DW_OP_reg31, 0x6f) +DW_OP (DW_OP_breg0, 0x70) +DW_OP (DW_OP_breg1, 0x71) +DW_OP (DW_OP_breg2, 0x72) +DW_OP (DW_OP_breg3, 0x73) +DW_OP (DW_OP_breg4, 0x74) +DW_OP (DW_OP_breg5, 0x75) +DW_OP (DW_OP_breg6, 0x76) +DW_OP (DW_OP_breg7, 0x77) +DW_OP (DW_OP_breg8, 0x78) +DW_OP (DW_OP_breg9, 0x79) +DW_OP (DW_OP_breg10, 0x7a) +DW_OP (DW_OP_breg11, 0x7b) +DW_OP (DW_OP_breg12, 0x7c) +DW_OP (DW_OP_breg13, 0x7d) +DW_OP (DW_OP_breg14, 0x7e) +DW_OP (DW_OP_breg15, 0x7f) +DW_OP (DW_OP_breg16, 0x80) +DW_OP (DW_OP_breg17, 0x81) +DW_OP (DW_OP_breg18, 0x82) +DW_OP (DW_OP_breg19, 0x83) +DW_OP (DW_OP_breg20, 0x84) +DW_OP (DW_OP_breg21, 0x85) +DW_OP (DW_OP_breg22, 0x86) +DW_OP (DW_OP_breg23, 0x87) +DW_OP (DW_OP_breg24, 0x88) +DW_OP (DW_OP_breg25, 0x89) +DW_OP (DW_OP_breg26, 0x8a) +DW_OP (DW_OP_breg27, 0x8b) +DW_OP (DW_OP_breg28, 0x8c) +DW_OP (DW_OP_breg29, 0x8d) +DW_OP (DW_OP_breg30, 0x8e) +DW_OP (DW_OP_breg31, 0x8f) +DW_OP (DW_OP_regx, 0x90) +DW_OP (DW_OP_fbreg, 0x91) +DW_OP (DW_OP_bregx, 0x92) +DW_OP (DW_OP_piece, 0x93) +DW_OP (DW_OP_deref_size, 0x94) +DW_OP (DW_OP_xderef_size, 0x95) +DW_OP (DW_OP_nop, 0x96) +/* DWARF 3 extensions. */ +DW_OP (DW_OP_push_object_address, 0x97) +DW_OP (DW_OP_call2, 0x98) +DW_OP (DW_OP_call4, 0x99) +DW_OP (DW_OP_call_ref, 0x9a) +DW_OP (DW_OP_form_tls_address, 0x9b) +DW_OP (DW_OP_call_frame_cfa, 0x9c) +DW_OP (DW_OP_bit_piece, 0x9d) + +/* DWARF 4 extensions. */ +DW_OP (DW_OP_implicit_value, 0x9e) +DW_OP (DW_OP_stack_value, 0x9f) + +DW_OP_DUP (DW_OP_lo_user, 0xe0) /* Implementation-defined range start. */ +DW_OP_DUP (DW_OP_hi_user, 0xff) /* Implementation-defined range end. */ + +/* GNU extensions. */ +DW_OP (DW_OP_GNU_push_tls_address, 0xe0) +/* The following is for marking variables that are uninitialized. */ +DW_OP (DW_OP_GNU_uninit, 0xf0) +DW_OP (DW_OP_GNU_encoded_addr, 0xf1) +/* The GNU implicit pointer extension. + See http://www.dwarfstd.org/ShowIssue.php?issue=100831.1&type=open . */ +DW_OP (DW_OP_GNU_implicit_pointer, 0xf2) +/* The GNU entry value extension. + See http://www.dwarfstd.org/ShowIssue.php?issue=100909.1&type=open . */ +DW_OP (DW_OP_GNU_entry_value, 0xf3) +/* The GNU typed stack extension. + See http://www.dwarfstd.org/doc/040408.1.html . */ +DW_OP (DW_OP_GNU_const_type, 0xf4) +DW_OP (DW_OP_GNU_regval_type, 0xf5) +DW_OP (DW_OP_GNU_deref_type, 0xf6) +DW_OP (DW_OP_GNU_convert, 0xf7) +DW_OP (DW_OP_GNU_reinterpret, 0xf9) +/* The GNU parameter ref extension. */ +DW_OP (DW_OP_GNU_parameter_ref, 0xfa) +/* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ +DW_OP (DW_OP_GNU_addr_index, 0xfb) +DW_OP (DW_OP_GNU_const_index, 0xfc) +/* HP extensions. */ +DW_OP_DUP (DW_OP_HP_unknown, 0xe0) /* Ouch, the same as GNU_push_tls_address. */ +DW_OP (DW_OP_HP_is_value, 0xe1) +DW_OP (DW_OP_HP_fltconst4, 0xe2) +DW_OP (DW_OP_HP_fltconst8, 0xe3) +DW_OP (DW_OP_HP_mod_range, 0xe4) +DW_OP (DW_OP_HP_unmod_range, 0xe5) +DW_OP (DW_OP_HP_tls, 0xe6) +/* PGI (STMicroelectronics) extensions. */ +DW_OP (DW_OP_PGI_omp_thread_num, 0xf8) +DW_END_OP + +DW_FIRST_ATE (DW_ATE_void, 0x0) +DW_ATE (DW_ATE_address, 0x1) +DW_ATE (DW_ATE_boolean, 0x2) +DW_ATE (DW_ATE_complex_float, 0x3) +DW_ATE (DW_ATE_float, 0x4) +DW_ATE (DW_ATE_signed, 0x5) +DW_ATE (DW_ATE_signed_char, 0x6) +DW_ATE (DW_ATE_unsigned, 0x7) +DW_ATE (DW_ATE_unsigned_char, 0x8) +/* DWARF 3. */ +DW_ATE (DW_ATE_imaginary_float, 0x9) +DW_ATE (DW_ATE_packed_decimal, 0xa) +DW_ATE (DW_ATE_numeric_string, 0xb) +DW_ATE (DW_ATE_edited, 0xc) +DW_ATE (DW_ATE_signed_fixed, 0xd) +DW_ATE (DW_ATE_unsigned_fixed, 0xe) +DW_ATE (DW_ATE_decimal_float, 0xf) +/* DWARF 4. */ +DW_ATE (DW_ATE_UTF, 0x10) + +DW_ATE_DUP (DW_ATE_lo_user, 0x80) +DW_ATE_DUP (DW_ATE_hi_user, 0xff) + +/* HP extensions. */ +DW_ATE (DW_ATE_HP_float80, 0x80) /* Floating-point (80 bit). */ +DW_ATE (DW_ATE_HP_complex_float80, 0x81) /* Complex floating-point (80 bit). */ +DW_ATE (DW_ATE_HP_float128, 0x82) /* Floating-point (128 bit). */ +DW_ATE (DW_ATE_HP_complex_float128, 0x83) /* Complex fp (128 bit). */ +DW_ATE (DW_ATE_HP_floathpintel, 0x84) /* Floating-point (82 bit IA64). */ +DW_ATE (DW_ATE_HP_imaginary_float80, 0x85) +DW_ATE (DW_ATE_HP_imaginary_float128, 0x86) +DW_ATE (DW_ATE_HP_VAX_float, 0x88) /* F or G floating. */ +DW_ATE (DW_ATE_HP_VAX_float_d, 0x89) /* D floating. */ +DW_ATE (DW_ATE_HP_packed_decimal, 0x8a) /* Cobol. */ +DW_ATE (DW_ATE_HP_zoned_decimal, 0x8b) /* Cobol. */ +DW_ATE (DW_ATE_HP_edited, 0x8c) /* Cobol. */ +DW_ATE (DW_ATE_HP_signed_fixed, 0x8d) /* Cobol. */ +DW_ATE (DW_ATE_HP_unsigned_fixed, 0x8e) /* Cobol. */ +DW_ATE (DW_ATE_HP_VAX_complex_float, 0x8f) /* F or G floating complex. */ +DW_ATE (DW_ATE_HP_VAX_complex_float_d, 0x90) /* D floating complex. */ + +DW_END_ATE + +DW_FIRST_CFA (DW_CFA_advance_loc, 0x40) +DW_CFA (DW_CFA_offset, 0x80) +DW_CFA (DW_CFA_restore, 0xc0) +DW_CFA (DW_CFA_nop, 0x00) +DW_CFA (DW_CFA_set_loc, 0x01) +DW_CFA (DW_CFA_advance_loc1, 0x02) +DW_CFA (DW_CFA_advance_loc2, 0x03) +DW_CFA (DW_CFA_advance_loc4, 0x04) +DW_CFA (DW_CFA_offset_extended, 0x05) +DW_CFA (DW_CFA_restore_extended, 0x06) +DW_CFA (DW_CFA_undefined, 0x07) +DW_CFA (DW_CFA_same_value, 0x08) +DW_CFA (DW_CFA_register, 0x09) +DW_CFA (DW_CFA_remember_state, 0x0a) +DW_CFA (DW_CFA_restore_state, 0x0b) +DW_CFA (DW_CFA_def_cfa, 0x0c) +DW_CFA (DW_CFA_def_cfa_register, 0x0d) +DW_CFA (DW_CFA_def_cfa_offset, 0x0e) +/* DWARF 3. */ +DW_CFA (DW_CFA_def_cfa_expression, 0x0f) +DW_CFA (DW_CFA_expression, 0x10) +DW_CFA (DW_CFA_offset_extended_sf, 0x11) +DW_CFA (DW_CFA_def_cfa_sf, 0x12) +DW_CFA (DW_CFA_def_cfa_offset_sf, 0x13) +DW_CFA (DW_CFA_val_offset, 0x14) +DW_CFA (DW_CFA_val_offset_sf, 0x15) +DW_CFA (DW_CFA_val_expression, 0x16) + +DW_CFA (DW_CFA_lo_user, 0x1c) +DW_CFA (DW_CFA_hi_user, 0x3f) + +/* SGI/MIPS specific. */ +DW_CFA (DW_CFA_MIPS_advance_loc8, 0x1d) +/* GNU extensions. */ +DW_CFA (DW_CFA_GNU_window_save, 0x2d) +DW_CFA (DW_CFA_GNU_args_size, 0x2e) +DW_CFA (DW_CFA_GNU_negative_offset_extended, 0x2f) + +DW_END_CFA diff --git a/include/dwarf2.h b/include/dwarf2.h new file mode 100644 index 0000000..1a145aa --- /dev/null +++ b/include/dwarf2.h @@ -0,0 +1,434 @@ +/* Declarations and definitions of codes relating to the DWARF2 and + DWARF3 symbolic debugging information formats. + Copyright (C) 1992-2016 Free Software Foundation, Inc. + + Written by Gary Funck (gary@intrepid.com) The Ada Joint Program + Office (AJPO), Florida State University and Silicon Graphics Inc. + provided support for this effort -- June 21, 1995. + + Derived from the DWARF 1 implementation written by Ron Guilmette + (rfg@netcom.com), November 1990. + + This file is part of GCC. + + GCC 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, or (at your option) any later + version. + + GCC 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. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . */ + +/* This file is derived from the DWARF specification (a public document) + Revision 2.0.0 (July 27, 1993) developed by the UNIX International + Programming Languages Special Interest Group (UI/PLSIG) and distributed + by UNIX International. Copies of this specification are available from + UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. + + This file also now contains definitions from the DWARF 3 specification + published Dec 20, 2005, available from: http://dwarf.freestandards.org. */ + +#ifndef _DWARF2_H +#define _DWARF2_H + +#define DW_TAG(name, value) , name = value +#define DW_TAG_DUP(name, value) , name = value +#define DW_FORM(name, value) , name = value +#define DW_AT(name, value) , name = value +#define DW_AT_DUP(name, value) , name = value +#define DW_OP(name, value) , name = value +#define DW_OP_DUP(name, value) , name = value +#define DW_ATE(name, value) , name = value +#define DW_ATE_DUP(name, value) , name = value +#define DW_CFA(name, value) , name = value + +#define DW_FIRST_TAG(name, value) enum dwarf_tag { \ + name = value +#define DW_END_TAG }; +#define DW_FIRST_FORM(name, value) enum dwarf_form { \ + name = value +#define DW_END_FORM }; +#define DW_FIRST_AT(name, value) enum dwarf_attribute { \ + name = value +#define DW_END_AT }; +#define DW_FIRST_OP(name, value) enum dwarf_location_atom { \ + name = value +#define DW_END_OP }; +#define DW_FIRST_ATE(name, value) enum dwarf_type { \ + name = value +#define DW_END_ATE }; +#define DW_FIRST_CFA(name, value) enum dwarf_call_frame_info { \ + name = value +#define DW_END_CFA }; + +#include "dwarf2.def" + +#undef DW_FIRST_TAG +#undef DW_END_TAG +#undef DW_FIRST_FORM +#undef DW_END_FORM +#undef DW_FIRST_AT +#undef DW_END_AT +#undef DW_FIRST_OP +#undef DW_END_OP +#undef DW_FIRST_ATE +#undef DW_END_ATE +#undef DW_FIRST_CFA +#undef DW_END_CFA + +#undef DW_TAG +#undef DW_TAG_DUP +#undef DW_FORM +#undef DW_AT +#undef DW_AT_DUP +#undef DW_OP +#undef DW_OP_DUP +#undef DW_ATE +#undef DW_ATE_DUP +#undef DW_CFA + +/* Flag that tells whether entry has a child or not. */ +#define DW_children_no 0 +#define DW_children_yes 1 + +#define DW_AT_stride_size DW_AT_bit_stride /* Note: The use of DW_AT_stride_size is deprecated. */ +#define DW_AT_stride DW_AT_byte_stride /* Note: The use of DW_AT_stride is deprecated. */ + +/* Decimal sign encodings. */ +enum dwarf_decimal_sign_encoding + { + /* DWARF 3. */ + DW_DS_unsigned = 0x01, + DW_DS_leading_overpunch = 0x02, + DW_DS_trailing_overpunch = 0x03, + DW_DS_leading_separate = 0x04, + DW_DS_trailing_separate = 0x05 + }; + +/* Endianity encodings. */ +enum dwarf_endianity_encoding + { + /* DWARF 3. */ + DW_END_default = 0x00, + DW_END_big = 0x01, + DW_END_little = 0x02, + + DW_END_lo_user = 0x40, + DW_END_hi_user = 0xff + }; + +/* Array ordering names and codes. */ +enum dwarf_array_dim_ordering + { + DW_ORD_row_major = 0, + DW_ORD_col_major = 1 + }; + +/* Access attribute. */ +enum dwarf_access_attribute + { + DW_ACCESS_public = 1, + DW_ACCESS_protected = 2, + DW_ACCESS_private = 3 + }; + +/* Visibility. */ +enum dwarf_visibility_attribute + { + DW_VIS_local = 1, + DW_VIS_exported = 2, + DW_VIS_qualified = 3 + }; + +/* Virtuality. */ +enum dwarf_virtuality_attribute + { + DW_VIRTUALITY_none = 0, + DW_VIRTUALITY_virtual = 1, + DW_VIRTUALITY_pure_virtual = 2 + }; + +/* Case sensitivity. */ +enum dwarf_id_case + { + DW_ID_case_sensitive = 0, + DW_ID_up_case = 1, + DW_ID_down_case = 2, + DW_ID_case_insensitive = 3 + }; + +/* Calling convention. */ +enum dwarf_calling_convention + { + DW_CC_normal = 0x1, + DW_CC_program = 0x2, + DW_CC_nocall = 0x3, + + DW_CC_lo_user = 0x40, + DW_CC_hi_user = 0xff, + + DW_CC_GNU_renesas_sh = 0x40, + DW_CC_GNU_borland_fastcall_i386 = 0x41, + + /* This DW_CC_ value is not currently generated by any toolchain. It is + used internally to GDB to indicate OpenCL C functions that have been + compiled with the IBM XL C for OpenCL compiler and use a non-platform + calling convention for passing OpenCL C vector types. This value may + be changed freely as long as it does not conflict with any other DW_CC_ + value defined here. */ + DW_CC_GDB_IBM_OpenCL = 0xff + }; + +/* Inline attribute. */ +enum dwarf_inline_attribute + { + DW_INL_not_inlined = 0, + DW_INL_inlined = 1, + DW_INL_declared_not_inlined = 2, + DW_INL_declared_inlined = 3 + }; + +/* Discriminant lists. */ +enum dwarf_discrim_list + { + DW_DSC_label = 0, + DW_DSC_range = 1 + }; + +/* Line number opcodes. */ +enum dwarf_line_number_ops + { + DW_LNS_extended_op = 0, + DW_LNS_copy = 1, + DW_LNS_advance_pc = 2, + DW_LNS_advance_line = 3, + DW_LNS_set_file = 4, + DW_LNS_set_column = 5, + DW_LNS_negate_stmt = 6, + DW_LNS_set_basic_block = 7, + DW_LNS_const_add_pc = 8, + DW_LNS_fixed_advance_pc = 9, + /* DWARF 3. */ + DW_LNS_set_prologue_end = 10, + DW_LNS_set_epilogue_begin = 11, + DW_LNS_set_isa = 12 + }; + +/* Line number extended opcodes. */ +enum dwarf_line_number_x_ops + { + DW_LNE_end_sequence = 1, + DW_LNE_set_address = 2, + DW_LNE_define_file = 3, + DW_LNE_set_discriminator = 4, + /* HP extensions. */ + DW_LNE_HP_negate_is_UV_update = 0x11, + DW_LNE_HP_push_context = 0x12, + DW_LNE_HP_pop_context = 0x13, + DW_LNE_HP_set_file_line_column = 0x14, + DW_LNE_HP_set_routine_name = 0x15, + DW_LNE_HP_set_sequence = 0x16, + DW_LNE_HP_negate_post_semantics = 0x17, + DW_LNE_HP_negate_function_exit = 0x18, + DW_LNE_HP_negate_front_end_logical = 0x19, + DW_LNE_HP_define_proc = 0x20, + DW_LNE_HP_source_file_correlation = 0x80, + + DW_LNE_lo_user = 0x80, + DW_LNE_hi_user = 0xff + }; + +/* Sub-opcodes for DW_LNE_HP_source_file_correlation. */ +enum dwarf_line_number_hp_sfc_ops + { + DW_LNE_HP_SFC_formfeed = 1, + DW_LNE_HP_SFC_set_listing_line = 2, + DW_LNE_HP_SFC_associate = 3 + }; + +/* Type codes for location list entries. + Extension for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ + +enum dwarf_location_list_entry_type + { + DW_LLE_GNU_end_of_list_entry = 0, + DW_LLE_GNU_base_address_selection_entry = 1, + DW_LLE_GNU_start_end_entry = 2, + DW_LLE_GNU_start_length_entry = 3 + }; + +#define DW_CIE_ID 0xffffffff +#define DW64_CIE_ID 0xffffffffffffffffULL +#define DW_CIE_VERSION 1 + +#define DW_CFA_extended 0 + +#define DW_CHILDREN_no 0x00 +#define DW_CHILDREN_yes 0x01 + +#define DW_ADDR_none 0 + +/* Source language names and codes. */ +enum dwarf_source_language + { + DW_LANG_C89 = 0x0001, + DW_LANG_C = 0x0002, + DW_LANG_Ada83 = 0x0003, + DW_LANG_C_plus_plus = 0x0004, + DW_LANG_Cobol74 = 0x0005, + DW_LANG_Cobol85 = 0x0006, + DW_LANG_Fortran77 = 0x0007, + DW_LANG_Fortran90 = 0x0008, + DW_LANG_Pascal83 = 0x0009, + DW_LANG_Modula2 = 0x000a, + /* DWARF 3. */ + DW_LANG_Java = 0x000b, + DW_LANG_C99 = 0x000c, + DW_LANG_Ada95 = 0x000d, + DW_LANG_Fortran95 = 0x000e, + DW_LANG_PLI = 0x000f, + DW_LANG_ObjC = 0x0010, + DW_LANG_ObjC_plus_plus = 0x0011, + DW_LANG_UPC = 0x0012, + DW_LANG_D = 0x0013, + /* DWARF 4. */ + DW_LANG_Python = 0x0014, + /* DWARF 5. */ + DW_LANG_Go = 0x0016, + + DW_LANG_C_plus_plus_11 = 0x001a, /* dwarf5.20141029.pdf DRAFT */ + DW_LANG_Rust = 0x001c, + DW_LANG_C11 = 0x001d, + DW_LANG_C_plus_plus_14 = 0x0021, + DW_LANG_Fortran03 = 0x0022, + DW_LANG_Fortran08 = 0x0023, + + DW_LANG_lo_user = 0x8000, /* Implementation-defined range start. */ + DW_LANG_hi_user = 0xffff, /* Implementation-defined range start. */ + + /* MIPS. */ + DW_LANG_Mips_Assembler = 0x8001, + /* UPC. */ + DW_LANG_Upc = 0x8765, + /* HP extensions. */ + DW_LANG_HP_Bliss = 0x8003, + DW_LANG_HP_Basic91 = 0x8004, + DW_LANG_HP_Pascal91 = 0x8005, + DW_LANG_HP_IMacro = 0x8006, + DW_LANG_HP_Assembler = 0x8007, + + /* Rust extension, but replaced in DWARF 5. */ + DW_LANG_Rust_old = 0x9000 + }; + +/* Names and codes for macro information. */ +enum dwarf_macinfo_record_type + { + DW_MACINFO_define = 1, + DW_MACINFO_undef = 2, + DW_MACINFO_start_file = 3, + DW_MACINFO_end_file = 4, + DW_MACINFO_vendor_ext = 255 + }; + +/* Names and codes for new style macro information. */ +enum dwarf_macro_record_type + { + DW_MACRO_GNU_define = 1, + DW_MACRO_GNU_undef = 2, + DW_MACRO_GNU_start_file = 3, + DW_MACRO_GNU_end_file = 4, + DW_MACRO_GNU_define_indirect = 5, + DW_MACRO_GNU_undef_indirect = 6, + DW_MACRO_GNU_transparent_include = 7, + /* Extensions for DWZ multifile. + See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */ + DW_MACRO_GNU_define_indirect_alt = 8, + DW_MACRO_GNU_undef_indirect_alt = 9, + DW_MACRO_GNU_transparent_include_alt = 10, + DW_MACRO_GNU_lo_user = 0xe0, + DW_MACRO_GNU_hi_user = 0xff + }; + +/* @@@ For use with GNU frame unwind information. */ + +#define DW_EH_PE_absptr 0x00 +#define DW_EH_PE_omit 0xff + +#define DW_EH_PE_uleb128 0x01 +#define DW_EH_PE_udata2 0x02 +#define DW_EH_PE_udata4 0x03 +#define DW_EH_PE_udata8 0x04 +#define DW_EH_PE_sleb128 0x09 +#define DW_EH_PE_sdata2 0x0A +#define DW_EH_PE_sdata4 0x0B +#define DW_EH_PE_sdata8 0x0C +#define DW_EH_PE_signed 0x08 + +#define DW_EH_PE_pcrel 0x10 +#define DW_EH_PE_textrel 0x20 +#define DW_EH_PE_datarel 0x30 +#define DW_EH_PE_funcrel 0x40 +#define DW_EH_PE_aligned 0x50 + +#define DW_EH_PE_indirect 0x80 + +/* Codes for the debug sections in a dwarf package (.dwp) file. + Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFissionDWP. */ +enum dwarf_sect + { + DW_SECT_INFO = 1, + DW_SECT_TYPES = 2, + DW_SECT_ABBREV = 3, + DW_SECT_LINE = 4, + DW_SECT_LOC = 5, + DW_SECT_STR_OFFSETS = 6, + DW_SECT_MACINFO = 7, + DW_SECT_MACRO = 8, + DW_SECT_MAX = 8 + }; + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Return the name of a DW_TAG_ constant, or NULL if the value is not + recognized. */ +extern const char *get_DW_TAG_name (unsigned int tag); + +/* Return the name of a DW_AT_ constant, or NULL if the value is not + recognized. */ +extern const char *get_DW_AT_name (unsigned int attr); + +/* Return the name of a DW_FORM_ constant, or NULL if the value is not + recognized. */ +extern const char *get_DW_FORM_name (unsigned int form); + +/* Return the name of a DW_OP_ constant, or NULL if the value is not + recognized. */ +extern const char *get_DW_OP_name (unsigned int op); + +/* Return the name of a DW_ATE_ constant, or NULL if the value is not + recognized. */ +extern const char *get_DW_ATE_name (unsigned int enc); + +/* Return the name of a DW_CFA_ constant, or NULL if the value is not + recognized. */ +extern const char *get_DW_CFA_name (unsigned int opc); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _DWARF2_H */ diff --git a/include/dyn-string.h b/include/dyn-string.h new file mode 100644 index 0000000..7c3684b --- /dev/null +++ b/include/dyn-string.h @@ -0,0 +1,72 @@ +/* An abstract string datatype. + Copyright (C) 1998-2015 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + +This file is part of GCC. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef DYN_STRING_H +#define DYN_STRING_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct dyn_string +{ + int allocated; /* The amount of space allocated for the string. */ + int length; /* The actual length of the string. */ + char *s; /* The string itself, NUL-terminated. */ +}* dyn_string_t; + +/* The length STR, in bytes, not including the terminating NUL. */ +#define dyn_string_length(STR) \ + ((STR)->length) + +/* The NTBS in which the contents of STR are stored. */ +#define dyn_string_buf(STR) \ + ((STR)->s) + +/* Compare DS1 to DS2 with strcmp. */ +#define dyn_string_compare(DS1, DS2) \ + (strcmp ((DS1)->s, (DS2)->s)) + + +extern int dyn_string_init (struct dyn_string *, int); +extern dyn_string_t dyn_string_new (int); +extern void dyn_string_delete (dyn_string_t); +extern char *dyn_string_release (dyn_string_t); +extern dyn_string_t dyn_string_resize (dyn_string_t, int); +extern void dyn_string_clear (dyn_string_t); +extern int dyn_string_copy (dyn_string_t, dyn_string_t); +extern int dyn_string_copy_cstr (dyn_string_t, const char *); +extern int dyn_string_prepend (dyn_string_t, dyn_string_t); +extern int dyn_string_prepend_cstr (dyn_string_t, const char *); +extern int dyn_string_insert (dyn_string_t, int, dyn_string_t); +extern int dyn_string_insert_cstr (dyn_string_t, int, const char *); +extern int dyn_string_insert_char (dyn_string_t, int, int); +extern int dyn_string_append (dyn_string_t, dyn_string_t); +extern int dyn_string_append_cstr (dyn_string_t, const char *); +extern int dyn_string_append_char (dyn_string_t, int); +extern int dyn_string_substring (dyn_string_t, dyn_string_t, int, int); +extern int dyn_string_eq (dyn_string_t, dyn_string_t); + +#ifdef __cplusplus +} +#endif + +#endif /* !defined (DYN_STRING_H) */ diff --git a/include/elf.h b/include/elf.h new file mode 100644 index 0000000..79d3b97 --- /dev/null +++ b/include/elf.h @@ -0,0 +1,3147 @@ +/* +From musl include/elf.h + +Copyright © 2005-2014 Rich Felker, et al. + +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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef _ELF_H +#define _ELF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef uint16_t Elf32_Half; +typedef uint16_t Elf64_Half; + +typedef uint32_t Elf32_Word; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf64_Word; +typedef int32_t Elf64_Sword; + +typedef uint64_t Elf32_Xword; +typedef int64_t Elf32_Sxword; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +typedef uint32_t Elf32_Addr; +typedef uint64_t Elf64_Addr; + +typedef uint32_t Elf32_Off; +typedef uint64_t Elf64_Off; + +typedef uint16_t Elf32_Section; +typedef uint16_t Elf64_Section; + +typedef Elf32_Half Elf32_Versym; +typedef Elf64_Half Elf64_Versym; + +#define EI_NIDENT (16) + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +#define EI_MAG0 0 +#define ELFMAG0 0x7f + +#define EI_MAG1 1 +#define ELFMAG1 'E' + +#define EI_MAG2 2 +#define ELFMAG2 'L' + +#define EI_MAG3 3 +#define ELFMAG3 'F' + + +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define EI_CLASS 4 +#define ELFCLASSNONE 0 +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +#define EI_DATA 5 +#define ELFDATANONE 0 +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 +#define ELFDATANUM 3 + +#define EI_VERSION 6 + + +#define EI_OSABI 7 +#define ELFOSABI_NONE 0 +#define ELFOSABI_SYSV 0 +#define ELFOSABI_HPUX 1 +#define ELFOSABI_NETBSD 2 +#define ELFOSABI_LINUX 3 +#define ELFOSABI_GNU 3 +#define ELFOSABI_SOLARIS 6 +#define ELFOSABI_AIX 7 +#define ELFOSABI_IRIX 8 +#define ELFOSABI_FREEBSD 9 +#define ELFOSABI_TRU64 10 +#define ELFOSABI_MODESTO 11 +#define ELFOSABI_OPENBSD 12 +#define ELFOSABI_ARM 97 +#define ELFOSABI_STANDALONE 255 + +#define EI_ABIVERSION 8 + +#define EI_PAD 9 + + + +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_NUM 5 +#define ET_LOOS 0xfe00 +#define ET_HIOS 0xfeff +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + + + +#define EM_NONE 0 +#define EM_M32 1 +#define EM_SPARC 2 +#define EM_386 3 +#define EM_68K 4 +#define EM_88K 5 +#define EM_860 7 +#define EM_MIPS 8 +#define EM_S370 9 +#define EM_MIPS_RS3_LE 10 + +#define EM_PARISC 15 +#define EM_VPP500 17 +#define EM_SPARC32PLUS 18 +#define EM_960 19 +#define EM_PPC 20 +#define EM_PPC64 21 +#define EM_S390 22 + +#define EM_V800 36 +#define EM_FR20 37 +#define EM_RH32 38 +#define EM_RCE 39 +#define EM_ARM 40 +#define EM_FAKE_ALPHA 41 +#define EM_SH 42 +#define EM_SPARCV9 43 +#define EM_TRICORE 44 +#define EM_ARC 45 +#define EM_H8_300 46 +#define EM_H8_300H 47 +#define EM_H8S 48 +#define EM_H8_500 49 +#define EM_IA_64 50 +#define EM_MIPS_X 51 +#define EM_COLDFIRE 52 +#define EM_68HC12 53 +#define EM_MMA 54 +#define EM_PCP 55 +#define EM_NCPU 56 +#define EM_NDR1 57 +#define EM_STARCORE 58 +#define EM_ME16 59 +#define EM_ST100 60 +#define EM_TINYJ 61 +#define EM_X86_64 62 +#define EM_PDSP 63 + +#define EM_FX66 66 +#define EM_ST9PLUS 67 +#define EM_ST7 68 +#define EM_68HC16 69 +#define EM_68HC11 70 +#define EM_68HC08 71 +#define EM_68HC05 72 +#define EM_SVX 73 +#define EM_ST19 74 +#define EM_VAX 75 +#define EM_CRIS 76 +#define EM_JAVELIN 77 +#define EM_FIREPATH 78 +#define EM_ZSP 79 +#define EM_MMIX 80 +#define EM_HUANY 81 +#define EM_PRISM 82 +#define EM_AVR 83 +#define EM_FR30 84 +#define EM_D10V 85 +#define EM_D30V 86 +#define EM_V850 87 +#define EM_M32R 88 +#define EM_MN10300 89 +#define EM_MN10200 90 +#define EM_PJ 91 +#define EM_OR1K 92 +#define EM_OPENRISC 92 +#define EM_ARC_A5 93 +#define EM_ARC_COMPACT 93 +#define EM_XTENSA 94 +#define EM_VIDEOCORE 95 +#define EM_TMM_GPP 96 +#define EM_NS32K 97 +#define EM_TPC 98 +#define EM_SNP1K 99 +#define EM_ST200 100 +#define EM_IP2K 101 +#define EM_MAX 102 +#define EM_CR 103 +#define EM_F2MC16 104 +#define EM_MSP430 105 +#define EM_BLACKFIN 106 +#define EM_SE_C33 107 +#define EM_SEP 108 +#define EM_ARCA 109 +#define EM_UNICORE 110 +#define EM_EXCESS 111 +#define EM_DXP 112 +#define EM_ALTERA_NIOS2 113 +#define EM_CRX 114 +#define EM_XGATE 115 +#define EM_C166 116 +#define EM_M16C 117 +#define EM_DSPIC30F 118 +#define EM_CE 119 +#define EM_M32C 120 +#define EM_TSK3000 131 +#define EM_RS08 132 +#define EM_SHARC 133 +#define EM_ECOG2 134 +#define EM_SCORE7 135 +#define EM_DSP24 136 +#define EM_VIDEOCORE3 137 +#define EM_LATTICEMICO32 138 +#define EM_SE_C17 139 +#define EM_TI_C6000 140 +#define EM_TI_C2000 141 +#define EM_TI_C5500 142 +#define EM_TI_ARP32 143 +#define EM_TI_PRU 144 +#define EM_MMDSP_PLUS 160 +#define EM_CYPRESS_M8C 161 +#define EM_R32C 162 +#define EM_TRIMEDIA 163 +#define EM_QDSP6 164 +#define EM_8051 165 +#define EM_STXP7X 166 +#define EM_NDS32 167 +#define EM_ECOG1X 168 +#define EM_MAXQ30 169 +#define EM_XIMO16 170 +#define EM_MANIK 171 +#define EM_CRAYNV2 172 +#define EM_RX 173 +#define EM_METAG 174 +#define EM_MCST_ELBRUS 175 +#define EM_ECOG16 176 +#define EM_CR16 177 +#define EM_ETPU 178 +#define EM_SLE9X 179 +#define EM_L10M 180 +#define EM_K10M 181 +#define EM_AARCH64 183 +#define EM_AVR32 185 +#define EM_STM8 186 +#define EM_TILE64 187 +#define EM_TILEPRO 188 +#define EM_MICROBLAZE 189 +#define EM_CUDA 190 +#define EM_TILEGX 191 +#define EM_CLOUDSHIELD 192 +#define EM_COREA_1ST 193 +#define EM_COREA_2ND 194 +#define EM_ARC_COMPACT2 195 +#define EM_OPEN8 196 +#define EM_RL78 197 +#define EM_VIDEOCORE5 198 +#define EM_78KOR 199 +#define EM_56800EX 200 +#define EM_BA1 201 +#define EM_BA2 202 +#define EM_XCORE 203 +#define EM_MCHP_PIC 204 +#define EM_KM32 210 +#define EM_KMX32 211 +#define EM_EMX16 212 +#define EM_EMX8 213 +#define EM_KVARC 214 +#define EM_CDP 215 +#define EM_COGE 216 +#define EM_COOL 217 +#define EM_NORC 218 +#define EM_CSR_KALIMBA 219 +#define EM_Z80 220 +#define EM_VISIUM 221 +#define EM_FT32 222 +#define EM_MOXIE 223 +#define EM_AMDGPU 224 +#define EM_RISCV 243 +#define EM_BPF 247 +#define EM_NUM 248 + +#define EM_ALPHA 0x9026 + +#define EV_NONE 0 +#define EV_CURRENT 1 +#define EV_NUM 2 + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + + + +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_BEFORE 0xff00 + +#define SHN_AFTER 0xff01 + +#define SHN_HIPROC 0xff1f +#define SHN_LOOS 0xff20 +#define SHN_HIOS 0xff3f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_XINDEX 0xffff +#define SHN_HIRESERVE 0xffff + + + +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_INIT_ARRAY 14 +#define SHT_FINI_ARRAY 15 +#define SHT_PREINIT_ARRAY 16 +#define SHT_GROUP 17 +#define SHT_SYMTAB_SHNDX 18 +#define SHT_NUM 19 +#define SHT_LOOS 0x60000000 +#define SHT_GNU_ATTRIBUTES 0x6ffffff5 +#define SHT_GNU_HASH 0x6ffffff6 +#define SHT_GNU_LIBLIST 0x6ffffff7 +#define SHT_CHECKSUM 0x6ffffff8 +#define SHT_LOSUNW 0x6ffffffa +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_GNU_verdef 0x6ffffffd +#define SHT_GNU_verneed 0x6ffffffe +#define SHT_GNU_versym 0x6fffffff +#define SHT_HISUNW 0x6fffffff +#define SHT_HIOS 0x6fffffff +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0x8fffffff + +#define SHF_WRITE (1 << 0) +#define SHF_ALLOC (1 << 1) +#define SHF_EXECINSTR (1 << 2) +#define SHF_MERGE (1 << 4) +#define SHF_STRINGS (1 << 5) +#define SHF_INFO_LINK (1 << 6) +#define SHF_LINK_ORDER (1 << 7) +#define SHF_OS_NONCONFORMING (1 << 8) + +#define SHF_GROUP (1 << 9) +#define SHF_TLS (1 << 10) +#define SHF_COMPRESSED (1 << 11) +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 +#define SHF_ORDERED (1 << 30) +#define SHF_EXCLUDE (1U << 31) + +typedef struct { + Elf32_Word ch_type; + Elf32_Word ch_size; + Elf32_Word ch_addralign; +} Elf32_Chdr; + +typedef struct { + Elf64_Word ch_type; + Elf64_Word ch_reserved; + Elf64_Xword ch_size; + Elf64_Xword ch_addralign; +} Elf64_Chdr; + +#define ELFCOMPRESS_ZLIB 1 +#define ELFCOMPRESS_LOOS 0x60000000 +#define ELFCOMPRESS_HIOS 0x6fffffff +#define ELFCOMPRESS_LOPROC 0x70000000 +#define ELFCOMPRESS_HIPROC 0x7fffffff + + +#define GRP_COMDAT 0x1 + +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Section st_shndx; +} Elf32_Sym; + +typedef struct { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Section st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; + +typedef struct { + Elf32_Half si_boundto; + Elf32_Half si_flags; +} Elf32_Syminfo; + +typedef struct { + Elf64_Half si_boundto; + Elf64_Half si_flags; +} Elf64_Syminfo; + +#define SYMINFO_BT_SELF 0xffff +#define SYMINFO_BT_PARENT 0xfffe +#define SYMINFO_BT_LOWRESERVE 0xff00 + +#define SYMINFO_FLG_DIRECT 0x0001 +#define SYMINFO_FLG_PASSTHRU 0x0002 +#define SYMINFO_FLG_COPY 0x0004 +#define SYMINFO_FLG_LAZYLOAD 0x0008 + +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) +#define ELF32_ST_TYPE(val) ((val) & 0xf) +#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) +#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) + +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_NUM 3 +#define STB_LOOS 10 +#define STB_GNU_UNIQUE 10 +#define STB_HIOS 12 +#define STB_LOPROC 13 +#define STB_HIPROC 15 + +#define STT_NOTYPE 0 +#define STT_OBJECT 1 +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 +#define STT_COMMON 5 +#define STT_TLS 6 +#define STT_NUM 7 +#define STT_LOOS 10 +#define STT_GNU_IFUNC 10 +#define STT_HIOS 12 +#define STT_LOPROC 13 +#define STT_HIPROC 15 + +#define STN_UNDEF 0 + +#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) +#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) + +#define STV_DEFAULT 0 +#define STV_INTERNAL 1 +#define STV_HIDDEN 2 +#define STV_PROTECTED 3 + + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; + + + +#define ELF32_R_SYM(val) ((val) >> 8) +#define ELF32_R_TYPE(val) ((val) & 0xff) +#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) + +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) + + + +typedef struct { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +typedef struct { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + + + +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_TLS 7 +#define PT_NUM 8 +#define PT_LOOS 0x60000000 +#define PT_GNU_EH_FRAME 0x6474e550 +#define PT_GNU_STACK 0x6474e551 +#define PT_GNU_RELRO 0x6474e552 +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa +#define PT_SUNWSTACK 0x6ffffffb +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + + +#define PN_XNUM 0xffff + + +#define PF_X (1 << 0) +#define PF_W (1 << 1) +#define PF_R (1 << 2) +#define PF_MASKOS 0x0ff00000 +#define PF_MASKPROC 0xf0000000 + + + +#define NT_PRSTATUS 1 +#define NT_FPREGSET 2 +#define NT_PRPSINFO 3 +#define NT_PRXREG 4 +#define NT_TASKSTRUCT 4 +#define NT_PLATFORM 5 +#define NT_AUXV 6 +#define NT_GWINDOWS 7 +#define NT_ASRS 8 +#define NT_PSTATUS 10 +#define NT_PSINFO 13 +#define NT_PRCRED 14 +#define NT_UTSNAME 15 +#define NT_LWPSTATUS 16 +#define NT_LWPSINFO 17 +#define NT_PRFPXREG 20 +#define NT_SIGINFO 0x53494749 +#define NT_FILE 0x46494c45 +#define NT_PRXFPREG 0x46e62b7f +#define NT_PPC_VMX 0x100 +#define NT_PPC_SPE 0x101 +#define NT_PPC_VSX 0x102 +#define NT_386_TLS 0x200 +#define NT_386_IOPERM 0x201 +#define NT_X86_XSTATE 0x202 +#define NT_S390_HIGH_GPRS 0x300 +#define NT_S390_TIMER 0x301 +#define NT_S390_TODCMP 0x302 +#define NT_S390_TODPREG 0x303 +#define NT_S390_CTRS 0x304 +#define NT_S390_PREFIX 0x305 +#define NT_S390_LAST_BREAK 0x306 +#define NT_S390_SYSTEM_CALL 0x307 +#define NT_S390_TDB 0x308 +#define NT_ARM_VFP 0x400 +#define NT_ARM_TLS 0x401 +#define NT_ARM_HW_BREAK 0x402 +#define NT_ARM_HW_WATCH 0x403 +#define NT_ARM_SYSTEM_CALL 0x404 +#define NT_ARM_SVE 0x405 +#define NT_METAG_CBUF 0x500 +#define NT_METAG_RPIPE 0x501 +#define NT_METAG_TLS 0x502 +#define NT_VERSION 1 + + + + +typedef struct { + Elf32_Sword d_tag; + union { + Elf32_Word d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + + + +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_BIND_NOW 24 +#define DT_INIT_ARRAY 25 +#define DT_FINI_ARRAY 26 +#define DT_INIT_ARRAYSZ 27 +#define DT_FINI_ARRAYSZ 28 +#define DT_RUNPATH 29 +#define DT_FLAGS 30 +#define DT_ENCODING 32 +#define DT_PREINIT_ARRAY 32 +#define DT_PREINIT_ARRAYSZ 33 +#define DT_NUM 34 +#define DT_LOOS 0x6000000d +#define DT_HIOS 0x6ffff000 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff +#define DT_PROCNUM DT_MIPS_NUM + +#define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_PRELINKED 0x6ffffdf5 +#define DT_GNU_CONFLICTSZ 0x6ffffdf6 +#define DT_GNU_LIBLISTSZ 0x6ffffdf7 +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE_1 0x6ffffdfc +#define DT_POSFLAG_1 0x6ffffdfd + +#define DT_SYMINSZ 0x6ffffdfe +#define DT_SYMINENT 0x6ffffdff +#define DT_VALRNGHI 0x6ffffdff +#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) +#define DT_VALNUM 12 + +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_GNU_HASH 0x6ffffef5 +#define DT_TLSDESC_PLT 0x6ffffef6 +#define DT_TLSDESC_GOT 0x6ffffef7 +#define DT_GNU_CONFLICT 0x6ffffef8 +#define DT_GNU_LIBLIST 0x6ffffef9 +#define DT_CONFIG 0x6ffffefa +#define DT_DEPAUDIT 0x6ffffefb +#define DT_AUDIT 0x6ffffefc +#define DT_PLTPAD 0x6ffffefd +#define DT_MOVETAB 0x6ffffefe +#define DT_SYMINFO 0x6ffffeff +#define DT_ADDRRNGHI 0x6ffffeff +#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) +#define DT_ADDRNUM 11 + + + +#define DT_VERSYM 0x6ffffff0 + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa + + +#define DT_FLAGS_1 0x6ffffffb +#define DT_VERDEF 0x6ffffffc + +#define DT_VERDEFNUM 0x6ffffffd +#define DT_VERNEED 0x6ffffffe + +#define DT_VERNEEDNUM 0x6fffffff +#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) +#define DT_VERSIONTAGNUM 16 + + + +#define DT_AUXILIARY 0x7ffffffd +#define DT_FILTER 0x7fffffff +#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) +#define DT_EXTRANUM 3 + + +#define DF_ORIGIN 0x00000001 +#define DF_SYMBOLIC 0x00000002 +#define DF_TEXTREL 0x00000004 +#define DF_BIND_NOW 0x00000008 +#define DF_STATIC_TLS 0x00000010 + + + +#define DF_1_NOW 0x00000001 +#define DF_1_GLOBAL 0x00000002 +#define DF_1_GROUP 0x00000004 +#define DF_1_NODELETE 0x00000008 +#define DF_1_LOADFLTR 0x00000010 +#define DF_1_INITFIRST 0x00000020 +#define DF_1_NOOPEN 0x00000040 +#define DF_1_ORIGIN 0x00000080 +#define DF_1_DIRECT 0x00000100 +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 +#define DF_1_NODEFLIB 0x00000800 +#define DF_1_NODUMP 0x00001000 +#define DF_1_CONFALT 0x00002000 +#define DF_1_ENDFILTEE 0x00004000 +#define DF_1_DISPRELDNE 0x00008000 +#define DF_1_DISPRELPND 0x00010000 +#define DF_1_NODIRECT 0x00020000 +#define DF_1_IGNMULDEF 0x00040000 +#define DF_1_NOKSYMS 0x00080000 +#define DF_1_NOHDR 0x00100000 +#define DF_1_EDITED 0x00200000 +#define DF_1_NORELOC 0x00400000 +#define DF_1_SYMINTPOSE 0x00800000 +#define DF_1_GLOBAUDIT 0x01000000 +#define DF_1_SINGLETON 0x02000000 + +#define DTF_1_PARINIT 0x00000001 +#define DTF_1_CONFEXP 0x00000002 + + +#define DF_P1_LAZYLOAD 0x00000001 +#define DF_P1_GROUPPERM 0x00000002 + + + + +typedef struct { + Elf32_Half vd_version; + Elf32_Half vd_flags; + Elf32_Half vd_ndx; + Elf32_Half vd_cnt; + Elf32_Word vd_hash; + Elf32_Word vd_aux; + Elf32_Word vd_next; +} Elf32_Verdef; + +typedef struct { + Elf64_Half vd_version; + Elf64_Half vd_flags; + Elf64_Half vd_ndx; + Elf64_Half vd_cnt; + Elf64_Word vd_hash; + Elf64_Word vd_aux; + Elf64_Word vd_next; +} Elf64_Verdef; + + + +#define VER_DEF_NONE 0 +#define VER_DEF_CURRENT 1 +#define VER_DEF_NUM 2 + + +#define VER_FLG_BASE 0x1 +#define VER_FLG_WEAK 0x2 + + +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 +#define VER_NDX_LORESERVE 0xff00 +#define VER_NDX_ELIMINATE 0xff01 + + + +typedef struct { + Elf32_Word vda_name; + Elf32_Word vda_next; +} Elf32_Verdaux; + +typedef struct { + Elf64_Word vda_name; + Elf64_Word vda_next; +} Elf64_Verdaux; + + + + +typedef struct { + Elf32_Half vn_version; + Elf32_Half vn_cnt; + Elf32_Word vn_file; + Elf32_Word vn_aux; + Elf32_Word vn_next; +} Elf32_Verneed; + +typedef struct { + Elf64_Half vn_version; + Elf64_Half vn_cnt; + Elf64_Word vn_file; + Elf64_Word vn_aux; + Elf64_Word vn_next; +} Elf64_Verneed; + + + +#define VER_NEED_NONE 0 +#define VER_NEED_CURRENT 1 +#define VER_NEED_NUM 2 + + + +typedef struct { + Elf32_Word vna_hash; + Elf32_Half vna_flags; + Elf32_Half vna_other; + Elf32_Word vna_name; + Elf32_Word vna_next; +} Elf32_Vernaux; + +typedef struct { + Elf64_Word vna_hash; + Elf64_Half vna_flags; + Elf64_Half vna_other; + Elf64_Word vna_name; + Elf64_Word vna_next; +} Elf64_Vernaux; + + + +#define VER_FLG_WEAK 0x2 + + + +typedef struct { + uint32_t a_type; + union { + uint32_t a_val; + } a_un; +} Elf32_auxv_t; + +typedef struct { + uint64_t a_type; + union { + uint64_t a_val; + } a_un; +} Elf64_auxv_t; + + + +#define AT_NULL 0 +#define AT_IGNORE 1 +#define AT_EXECFD 2 +#define AT_PHDR 3 +#define AT_PHENT 4 +#define AT_PHNUM 5 +#define AT_PAGESZ 6 +#define AT_BASE 7 +#define AT_FLAGS 8 +#define AT_ENTRY 9 +#define AT_NOTELF 10 +#define AT_UID 11 +#define AT_EUID 12 +#define AT_GID 13 +#define AT_EGID 14 +#define AT_CLKTCK 17 + + +#define AT_PLATFORM 15 +#define AT_HWCAP 16 + + + + +#define AT_FPUCW 18 + + +#define AT_DCACHEBSIZE 19 +#define AT_ICACHEBSIZE 20 +#define AT_UCACHEBSIZE 21 + + + +#define AT_IGNOREPPC 22 + +#define AT_SECURE 23 + +#define AT_BASE_PLATFORM 24 + +#define AT_RANDOM 25 + +#define AT_HWCAP2 26 + +#define AT_EXECFN 31 + + + +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 + + + +#define AT_L1I_CACHESHAPE 34 +#define AT_L1D_CACHESHAPE 35 +#define AT_L2_CACHESHAPE 36 +#define AT_L3_CACHESHAPE 37 + + + + +typedef struct { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +} Elf32_Nhdr; + +typedef struct { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +} Elf64_Nhdr; + + + + +#define ELF_NOTE_SOLARIS "SUNW Solaris" + + +#define ELF_NOTE_GNU "GNU" + + + + + +#define ELF_NOTE_PAGESIZE_HINT 1 + + +#define NT_GNU_ABI_TAG 1 +#define ELF_NOTE_ABI NT_GNU_ABI_TAG + + + +#define ELF_NOTE_OS_LINUX 0 +#define ELF_NOTE_OS_GNU 1 +#define ELF_NOTE_OS_SOLARIS2 2 +#define ELF_NOTE_OS_FREEBSD 3 + +#define NT_GNU_BUILD_ID 3 +#define NT_GNU_GOLD_VERSION 4 + + + +typedef struct { + Elf32_Xword m_value; + Elf32_Word m_info; + Elf32_Word m_poffset; + Elf32_Half m_repeat; + Elf32_Half m_stride; +} Elf32_Move; + +typedef struct { + Elf64_Xword m_value; + Elf64_Xword m_info; + Elf64_Xword m_poffset; + Elf64_Half m_repeat; + Elf64_Half m_stride; +} Elf64_Move; + + +#define ELF32_M_SYM(info) ((info) >> 8) +#define ELF32_M_SIZE(info) ((unsigned char) (info)) +#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) + +#define ELF64_M_SYM(info) ELF32_M_SYM (info) +#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) +#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) + +#define EF_CPU32 0x00810000 + +#define R_68K_NONE 0 +#define R_68K_32 1 +#define R_68K_16 2 +#define R_68K_8 3 +#define R_68K_PC32 4 +#define R_68K_PC16 5 +#define R_68K_PC8 6 +#define R_68K_GOT32 7 +#define R_68K_GOT16 8 +#define R_68K_GOT8 9 +#define R_68K_GOT32O 10 +#define R_68K_GOT16O 11 +#define R_68K_GOT8O 12 +#define R_68K_PLT32 13 +#define R_68K_PLT16 14 +#define R_68K_PLT8 15 +#define R_68K_PLT32O 16 +#define R_68K_PLT16O 17 +#define R_68K_PLT8O 18 +#define R_68K_COPY 19 +#define R_68K_GLOB_DAT 20 +#define R_68K_JMP_SLOT 21 +#define R_68K_RELATIVE 22 +#define R_68K_NUM 23 + +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 +#define R_386_GOT32 3 +#define R_386_PLT32 4 +#define R_386_COPY 5 +#define R_386_GLOB_DAT 6 +#define R_386_JMP_SLOT 7 +#define R_386_RELATIVE 8 +#define R_386_GOTOFF 9 +#define R_386_GOTPC 10 +#define R_386_32PLT 11 +#define R_386_TLS_TPOFF 14 +#define R_386_TLS_IE 15 +#define R_386_TLS_GOTIE 16 +#define R_386_TLS_LE 17 +#define R_386_TLS_GD 18 +#define R_386_TLS_LDM 19 +#define R_386_16 20 +#define R_386_PC16 21 +#define R_386_8 22 +#define R_386_PC8 23 +#define R_386_TLS_GD_32 24 +#define R_386_TLS_GD_PUSH 25 +#define R_386_TLS_GD_CALL 26 +#define R_386_TLS_GD_POP 27 +#define R_386_TLS_LDM_32 28 +#define R_386_TLS_LDM_PUSH 29 +#define R_386_TLS_LDM_CALL 30 +#define R_386_TLS_LDM_POP 31 +#define R_386_TLS_LDO_32 32 +#define R_386_TLS_IE_32 33 +#define R_386_TLS_LE_32 34 +#define R_386_TLS_DTPMOD32 35 +#define R_386_TLS_DTPOFF32 36 +#define R_386_TLS_TPOFF32 37 +#define R_386_SIZE32 38 +#define R_386_TLS_GOTDESC 39 +#define R_386_TLS_DESC_CALL 40 +#define R_386_TLS_DESC 41 +#define R_386_IRELATIVE 42 +#define R_386_GOT32X 43 +#define R_386_NUM 44 + + + + + +#define STT_SPARC_REGISTER 13 + + + +#define EF_SPARCV9_MM 3 +#define EF_SPARCV9_TSO 0 +#define EF_SPARCV9_PSO 1 +#define EF_SPARCV9_RMO 2 +#define EF_SPARC_LEDATA 0x800000 +#define EF_SPARC_EXT_MASK 0xFFFF00 +#define EF_SPARC_32PLUS 0x000100 +#define EF_SPARC_SUN_US1 0x000200 +#define EF_SPARC_HAL_R1 0x000400 +#define EF_SPARC_SUN_US3 0x000800 + + + +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 + + + +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_64 32 +#define R_SPARC_OLO10 33 +#define R_SPARC_HH22 34 +#define R_SPARC_HM10 35 +#define R_SPARC_LM22 36 +#define R_SPARC_PC_HH22 37 +#define R_SPARC_PC_HM10 38 +#define R_SPARC_PC_LM22 39 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_GLOB_JMP 42 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 +#define R_SPARC_DISP64 46 +#define R_SPARC_PLT64 47 +#define R_SPARC_HIX22 48 +#define R_SPARC_LOX10 49 +#define R_SPARC_H44 50 +#define R_SPARC_M44 51 +#define R_SPARC_L44 52 +#define R_SPARC_REGISTER 53 +#define R_SPARC_UA64 54 +#define R_SPARC_UA16 55 +#define R_SPARC_TLS_GD_HI22 56 +#define R_SPARC_TLS_GD_LO10 57 +#define R_SPARC_TLS_GD_ADD 58 +#define R_SPARC_TLS_GD_CALL 59 +#define R_SPARC_TLS_LDM_HI22 60 +#define R_SPARC_TLS_LDM_LO10 61 +#define R_SPARC_TLS_LDM_ADD 62 +#define R_SPARC_TLS_LDM_CALL 63 +#define R_SPARC_TLS_LDO_HIX22 64 +#define R_SPARC_TLS_LDO_LOX10 65 +#define R_SPARC_TLS_LDO_ADD 66 +#define R_SPARC_TLS_IE_HI22 67 +#define R_SPARC_TLS_IE_LO10 68 +#define R_SPARC_TLS_IE_LD 69 +#define R_SPARC_TLS_IE_LDX 70 +#define R_SPARC_TLS_IE_ADD 71 +#define R_SPARC_TLS_LE_HIX22 72 +#define R_SPARC_TLS_LE_LOX10 73 +#define R_SPARC_TLS_DTPMOD32 74 +#define R_SPARC_TLS_DTPMOD64 75 +#define R_SPARC_TLS_DTPOFF32 76 +#define R_SPARC_TLS_DTPOFF64 77 +#define R_SPARC_TLS_TPOFF32 78 +#define R_SPARC_TLS_TPOFF64 79 +#define R_SPARC_GOTDATA_HIX22 80 +#define R_SPARC_GOTDATA_LOX10 81 +#define R_SPARC_GOTDATA_OP_HIX22 82 +#define R_SPARC_GOTDATA_OP_LOX10 83 +#define R_SPARC_GOTDATA_OP 84 +#define R_SPARC_H34 85 +#define R_SPARC_SIZE32 86 +#define R_SPARC_SIZE64 87 +#define R_SPARC_GNU_VTINHERIT 250 +#define R_SPARC_GNU_VTENTRY 251 +#define R_SPARC_REV32 252 + +#define R_SPARC_NUM 253 + + + +#define DT_SPARC_REGISTER 0x70000001 +#define DT_SPARC_NUM 2 + + +#define EF_MIPS_NOREORDER 1 +#define EF_MIPS_PIC 2 +#define EF_MIPS_CPIC 4 +#define EF_MIPS_XGOT 8 +#define EF_MIPS_64BIT_WHIRL 16 +#define EF_MIPS_ABI2 32 +#define EF_MIPS_ABI_ON32 64 +#define EF_MIPS_FP64 512 +#define EF_MIPS_NAN2008 1024 +#define EF_MIPS_ARCH 0xf0000000 + + + +#define EF_MIPS_ARCH_1 0x00000000 +#define EF_MIPS_ARCH_2 0x10000000 +#define EF_MIPS_ARCH_3 0x20000000 +#define EF_MIPS_ARCH_4 0x30000000 +#define EF_MIPS_ARCH_5 0x40000000 +#define EF_MIPS_ARCH_32 0x50000000 +#define EF_MIPS_ARCH_64 0x60000000 +#define EF_MIPS_ARCH_32R2 0x70000000 +#define EF_MIPS_ARCH_64R2 0x80000000 + + +#define E_MIPS_ARCH_1 0x00000000 +#define E_MIPS_ARCH_2 0x10000000 +#define E_MIPS_ARCH_3 0x20000000 +#define E_MIPS_ARCH_4 0x30000000 +#define E_MIPS_ARCH_5 0x40000000 +#define E_MIPS_ARCH_32 0x50000000 +#define E_MIPS_ARCH_64 0x60000000 + + + +#define SHN_MIPS_ACOMMON 0xff00 +#define SHN_MIPS_TEXT 0xff01 +#define SHN_MIPS_DATA 0xff02 +#define SHN_MIPS_SCOMMON 0xff03 +#define SHN_MIPS_SUNDEFINED 0xff04 + + + +#define SHT_MIPS_LIBLIST 0x70000000 +#define SHT_MIPS_MSYM 0x70000001 +#define SHT_MIPS_CONFLICT 0x70000002 +#define SHT_MIPS_GPTAB 0x70000003 +#define SHT_MIPS_UCODE 0x70000004 +#define SHT_MIPS_DEBUG 0x70000005 +#define SHT_MIPS_REGINFO 0x70000006 +#define SHT_MIPS_PACKAGE 0x70000007 +#define SHT_MIPS_PACKSYM 0x70000008 +#define SHT_MIPS_RELD 0x70000009 +#define SHT_MIPS_IFACE 0x7000000b +#define SHT_MIPS_CONTENT 0x7000000c +#define SHT_MIPS_OPTIONS 0x7000000d +#define SHT_MIPS_SHDR 0x70000010 +#define SHT_MIPS_FDESC 0x70000011 +#define SHT_MIPS_EXTSYM 0x70000012 +#define SHT_MIPS_DENSE 0x70000013 +#define SHT_MIPS_PDESC 0x70000014 +#define SHT_MIPS_LOCSYM 0x70000015 +#define SHT_MIPS_AUXSYM 0x70000016 +#define SHT_MIPS_OPTSYM 0x70000017 +#define SHT_MIPS_LOCSTR 0x70000018 +#define SHT_MIPS_LINE 0x70000019 +#define SHT_MIPS_RFDESC 0x7000001a +#define SHT_MIPS_DELTASYM 0x7000001b +#define SHT_MIPS_DELTAINST 0x7000001c +#define SHT_MIPS_DELTACLASS 0x7000001d +#define SHT_MIPS_DWARF 0x7000001e +#define SHT_MIPS_DELTADECL 0x7000001f +#define SHT_MIPS_SYMBOL_LIB 0x70000020 +#define SHT_MIPS_EVENTS 0x70000021 +#define SHT_MIPS_TRANSLATE 0x70000022 +#define SHT_MIPS_PIXIE 0x70000023 +#define SHT_MIPS_XLATE 0x70000024 +#define SHT_MIPS_XLATE_DEBUG 0x70000025 +#define SHT_MIPS_WHIRL 0x70000026 +#define SHT_MIPS_EH_REGION 0x70000027 +#define SHT_MIPS_XLATE_OLD 0x70000028 +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + + + +#define SHF_MIPS_GPREL 0x10000000 +#define SHF_MIPS_MERGE 0x20000000 +#define SHF_MIPS_ADDR 0x40000000 +#define SHF_MIPS_STRINGS 0x80000000 +#define SHF_MIPS_NOSTRIP 0x08000000 +#define SHF_MIPS_LOCAL 0x04000000 +#define SHF_MIPS_NAMES 0x02000000 +#define SHF_MIPS_NODUPE 0x01000000 + + + + + +#define STO_MIPS_DEFAULT 0x0 +#define STO_MIPS_INTERNAL 0x1 +#define STO_MIPS_HIDDEN 0x2 +#define STO_MIPS_PROTECTED 0x3 +#define STO_MIPS_PLT 0x8 +#define STO_MIPS_SC_ALIGN_UNUSED 0xff + + +#define STB_MIPS_SPLIT_COMMON 13 + + + +typedef union { + struct { + Elf32_Word gt_current_g_value; + Elf32_Word gt_unused; + } gt_header; + struct { + Elf32_Word gt_g_value; + Elf32_Word gt_bytes; + } gt_entry; +} Elf32_gptab; + + + +typedef struct { + Elf32_Word ri_gprmask; + Elf32_Word ri_cprmask[4]; + Elf32_Sword ri_gp_value; +} Elf32_RegInfo; + + + +typedef struct { + unsigned char kind; + + unsigned char size; + Elf32_Section section; + + Elf32_Word info; +} Elf_Options; + + + +#define ODK_NULL 0 +#define ODK_REGINFO 1 +#define ODK_EXCEPTIONS 2 +#define ODK_PAD 3 +#define ODK_HWPATCH 4 +#define ODK_FILL 5 +#define ODK_TAGS 6 +#define ODK_HWAND 7 +#define ODK_HWOR 8 + + + +#define OEX_FPU_MIN 0x1f +#define OEX_FPU_MAX 0x1f00 +#define OEX_PAGE0 0x10000 +#define OEX_SMM 0x20000 +#define OEX_FPDBUG 0x40000 +#define OEX_PRECISEFP OEX_FPDBUG +#define OEX_DISMISS 0x80000 + +#define OEX_FPU_INVAL 0x10 +#define OEX_FPU_DIV0 0x08 +#define OEX_FPU_OFLO 0x04 +#define OEX_FPU_UFLO 0x02 +#define OEX_FPU_INEX 0x01 + + + +#define OHW_R4KEOP 0x1 +#define OHW_R8KPFETCH 0x2 +#define OHW_R5KEOP 0x4 +#define OHW_R5KCVTL 0x8 + +#define OPAD_PREFIX 0x1 +#define OPAD_POSTFIX 0x2 +#define OPAD_SYMBOL 0x4 + + + +typedef struct { + Elf32_Word hwp_flags1; + Elf32_Word hwp_flags2; +} Elf_Options_Hw; + + + +#define OHWA0_R4KEOP_CHECKED 0x00000001 +#define OHWA1_R4KEOP_CLEAN 0x00000002 + + + +#define R_MIPS_NONE 0 +#define R_MIPS_16 1 +#define R_MIPS_32 2 +#define R_MIPS_REL32 3 +#define R_MIPS_26 4 +#define R_MIPS_HI16 5 +#define R_MIPS_LO16 6 +#define R_MIPS_GPREL16 7 +#define R_MIPS_LITERAL 8 +#define R_MIPS_GOT16 9 +#define R_MIPS_PC16 10 +#define R_MIPS_CALL16 11 +#define R_MIPS_GPREL32 12 + +#define R_MIPS_SHIFT5 16 +#define R_MIPS_SHIFT6 17 +#define R_MIPS_64 18 +#define R_MIPS_GOT_DISP 19 +#define R_MIPS_GOT_PAGE 20 +#define R_MIPS_GOT_OFST 21 +#define R_MIPS_GOT_HI16 22 +#define R_MIPS_GOT_LO16 23 +#define R_MIPS_SUB 24 +#define R_MIPS_INSERT_A 25 +#define R_MIPS_INSERT_B 26 +#define R_MIPS_DELETE 27 +#define R_MIPS_HIGHER 28 +#define R_MIPS_HIGHEST 29 +#define R_MIPS_CALL_HI16 30 +#define R_MIPS_CALL_LO16 31 +#define R_MIPS_SCN_DISP 32 +#define R_MIPS_REL16 33 +#define R_MIPS_ADD_IMMEDIATE 34 +#define R_MIPS_PJUMP 35 +#define R_MIPS_RELGOT 36 +#define R_MIPS_JALR 37 +#define R_MIPS_TLS_DTPMOD32 38 +#define R_MIPS_TLS_DTPREL32 39 +#define R_MIPS_TLS_DTPMOD64 40 +#define R_MIPS_TLS_DTPREL64 41 +#define R_MIPS_TLS_GD 42 +#define R_MIPS_TLS_LDM 43 +#define R_MIPS_TLS_DTPREL_HI16 44 +#define R_MIPS_TLS_DTPREL_LO16 45 +#define R_MIPS_TLS_GOTTPREL 46 +#define R_MIPS_TLS_TPREL32 47 +#define R_MIPS_TLS_TPREL64 48 +#define R_MIPS_TLS_TPREL_HI16 49 +#define R_MIPS_TLS_TPREL_LO16 50 +#define R_MIPS_GLOB_DAT 51 +#define R_MIPS_COPY 126 +#define R_MIPS_JUMP_SLOT 127 + +#define R_MIPS_NUM 128 + + + +#define PT_MIPS_REGINFO 0x70000000 +#define PT_MIPS_RTPROC 0x70000001 +#define PT_MIPS_OPTIONS 0x70000002 +#define PT_MIPS_ABIFLAGS 0x70000003 + + + +#define PF_MIPS_LOCAL 0x10000000 + + + +#define DT_MIPS_RLD_VERSION 0x70000001 +#define DT_MIPS_TIME_STAMP 0x70000002 +#define DT_MIPS_ICHECKSUM 0x70000003 +#define DT_MIPS_IVERSION 0x70000004 +#define DT_MIPS_FLAGS 0x70000005 +#define DT_MIPS_BASE_ADDRESS 0x70000006 +#define DT_MIPS_MSYM 0x70000007 +#define DT_MIPS_CONFLICT 0x70000008 +#define DT_MIPS_LIBLIST 0x70000009 +#define DT_MIPS_LOCAL_GOTNO 0x7000000a +#define DT_MIPS_CONFLICTNO 0x7000000b +#define DT_MIPS_LIBLISTNO 0x70000010 +#define DT_MIPS_SYMTABNO 0x70000011 +#define DT_MIPS_UNREFEXTNO 0x70000012 +#define DT_MIPS_GOTSYM 0x70000013 +#define DT_MIPS_HIPAGENO 0x70000014 +#define DT_MIPS_RLD_MAP 0x70000016 +#define DT_MIPS_DELTA_CLASS 0x70000017 +#define DT_MIPS_DELTA_CLASS_NO 0x70000018 + +#define DT_MIPS_DELTA_INSTANCE 0x70000019 +#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a + +#define DT_MIPS_DELTA_RELOC 0x7000001b +#define DT_MIPS_DELTA_RELOC_NO 0x7000001c + +#define DT_MIPS_DELTA_SYM 0x7000001d + +#define DT_MIPS_DELTA_SYM_NO 0x7000001e + +#define DT_MIPS_DELTA_CLASSSYM 0x70000020 + +#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 + +#define DT_MIPS_CXX_FLAGS 0x70000022 +#define DT_MIPS_PIXIE_INIT 0x70000023 +#define DT_MIPS_SYMBOL_LIB 0x70000024 +#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 +#define DT_MIPS_LOCAL_GOTIDX 0x70000026 +#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 +#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 +#define DT_MIPS_OPTIONS 0x70000029 +#define DT_MIPS_INTERFACE 0x7000002a +#define DT_MIPS_DYNSTR_ALIGN 0x7000002b +#define DT_MIPS_INTERFACE_SIZE 0x7000002c +#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d + +#define DT_MIPS_PERF_SUFFIX 0x7000002e + +#define DT_MIPS_COMPACT_SIZE 0x7000002f +#define DT_MIPS_GP_VALUE 0x70000030 +#define DT_MIPS_AUX_DYNAMIC 0x70000031 + +#define DT_MIPS_PLTGOT 0x70000032 + +#define DT_MIPS_RWPLT 0x70000034 +#define DT_MIPS_RLD_MAP_REL 0x70000035 +#define DT_MIPS_NUM 0x36 + + + +#define RHF_NONE 0 +#define RHF_QUICKSTART (1 << 0) +#define RHF_NOTPOT (1 << 1) +#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) +#define RHF_NO_MOVE (1 << 3) +#define RHF_SGI_ONLY (1 << 4) +#define RHF_GUARANTEE_INIT (1 << 5) +#define RHF_DELTA_C_PLUS_PLUS (1 << 6) +#define RHF_GUARANTEE_START_INIT (1 << 7) +#define RHF_PIXIE (1 << 8) +#define RHF_DEFAULT_DELAY_LOAD (1 << 9) +#define RHF_REQUICKSTART (1 << 10) +#define RHF_REQUICKSTARTED (1 << 11) +#define RHF_CORD (1 << 12) +#define RHF_NO_UNRES_UNDEF (1 << 13) +#define RHF_RLD_ORDER_SAFE (1 << 14) + + + +typedef struct { + Elf32_Word l_name; + Elf32_Word l_time_stamp; + Elf32_Word l_checksum; + Elf32_Word l_version; + Elf32_Word l_flags; +} Elf32_Lib; + +typedef struct { + Elf64_Word l_name; + Elf64_Word l_time_stamp; + Elf64_Word l_checksum; + Elf64_Word l_version; + Elf64_Word l_flags; +} Elf64_Lib; + + + + +#define LL_NONE 0 +#define LL_EXACT_MATCH (1 << 0) +#define LL_IGNORE_INT_VER (1 << 1) +#define LL_REQUIRE_MINOR (1 << 2) +#define LL_EXPORTS (1 << 3) +#define LL_DELAY_LOAD (1 << 4) +#define LL_DELTA (1 << 5) + + + +typedef Elf32_Addr Elf32_Conflict; + +typedef struct { + Elf32_Half version; + unsigned char isa_level; + unsigned char isa_rev; + unsigned char gpr_size; + unsigned char cpr1_size; + unsigned char cpr2_size; + unsigned char fp_abi; + Elf32_Word isa_ext; + Elf32_Word ases; + Elf32_Word flags1; + Elf32_Word flags2; +} Elf_MIPS_ABIFlags_v0; + +#define MIPS_AFL_REG_NONE 0x00 +#define MIPS_AFL_REG_32 0x01 +#define MIPS_AFL_REG_64 0x02 +#define MIPS_AFL_REG_128 0x03 + +#define MIPS_AFL_ASE_DSP 0x00000001 +#define MIPS_AFL_ASE_DSPR2 0x00000002 +#define MIPS_AFL_ASE_EVA 0x00000004 +#define MIPS_AFL_ASE_MCU 0x00000008 +#define MIPS_AFL_ASE_MDMX 0x00000010 +#define MIPS_AFL_ASE_MIPS3D 0x00000020 +#define MIPS_AFL_ASE_MT 0x00000040 +#define MIPS_AFL_ASE_SMARTMIPS 0x00000080 +#define MIPS_AFL_ASE_VIRT 0x00000100 +#define MIPS_AFL_ASE_MSA 0x00000200 +#define MIPS_AFL_ASE_MIPS16 0x00000400 +#define MIPS_AFL_ASE_MICROMIPS 0x00000800 +#define MIPS_AFL_ASE_XPA 0x00001000 +#define MIPS_AFL_ASE_MASK 0x00001fff + +#define MIPS_AFL_EXT_XLR 1 +#define MIPS_AFL_EXT_OCTEON2 2 +#define MIPS_AFL_EXT_OCTEONP 3 +#define MIPS_AFL_EXT_LOONGSON_3A 4 +#define MIPS_AFL_EXT_OCTEON 5 +#define MIPS_AFL_EXT_5900 6 +#define MIPS_AFL_EXT_4650 7 +#define MIPS_AFL_EXT_4010 8 +#define MIPS_AFL_EXT_4100 9 +#define MIPS_AFL_EXT_3900 10 +#define MIPS_AFL_EXT_10000 11 +#define MIPS_AFL_EXT_SB1 12 +#define MIPS_AFL_EXT_4111 13 +#define MIPS_AFL_EXT_4120 14 +#define MIPS_AFL_EXT_5400 15 +#define MIPS_AFL_EXT_5500 16 +#define MIPS_AFL_EXT_LOONGSON_2E 17 +#define MIPS_AFL_EXT_LOONGSON_2F 18 + +#define MIPS_AFL_FLAGS1_ODDSPREG 1 + +enum +{ + Val_GNU_MIPS_ABI_FP_ANY = 0, + Val_GNU_MIPS_ABI_FP_DOUBLE = 1, + Val_GNU_MIPS_ABI_FP_SINGLE = 2, + Val_GNU_MIPS_ABI_FP_SOFT = 3, + Val_GNU_MIPS_ABI_FP_OLD_64 = 4, + Val_GNU_MIPS_ABI_FP_XX = 5, + Val_GNU_MIPS_ABI_FP_64 = 6, + Val_GNU_MIPS_ABI_FP_64A = 7, + Val_GNU_MIPS_ABI_FP_MAX = 7 +}; + + + + +#define EF_PARISC_TRAPNIL 0x00010000 +#define EF_PARISC_EXT 0x00020000 +#define EF_PARISC_LSB 0x00040000 +#define EF_PARISC_WIDE 0x00080000 +#define EF_PARISC_NO_KABP 0x00100000 + +#define EF_PARISC_LAZYSWAP 0x00400000 +#define EF_PARISC_ARCH 0x0000ffff + + + +#define EFA_PARISC_1_0 0x020b +#define EFA_PARISC_1_1 0x0210 +#define EFA_PARISC_2_0 0x0214 + + + +#define SHN_PARISC_ANSI_COMMON 0xff00 + +#define SHN_PARISC_HUGE_COMMON 0xff01 + + + +#define SHT_PARISC_EXT 0x70000000 +#define SHT_PARISC_UNWIND 0x70000001 +#define SHT_PARISC_DOC 0x70000002 + + + +#define SHF_PARISC_SHORT 0x20000000 +#define SHF_PARISC_HUGE 0x40000000 +#define SHF_PARISC_SBP 0x80000000 + + + +#define STT_PARISC_MILLICODE 13 + +#define STT_HP_OPAQUE (STT_LOOS + 0x1) +#define STT_HP_STUB (STT_LOOS + 0x2) + + + +#define R_PARISC_NONE 0 +#define R_PARISC_DIR32 1 +#define R_PARISC_DIR21L 2 +#define R_PARISC_DIR17R 3 +#define R_PARISC_DIR17F 4 +#define R_PARISC_DIR14R 6 +#define R_PARISC_PCREL32 9 +#define R_PARISC_PCREL21L 10 +#define R_PARISC_PCREL17R 11 +#define R_PARISC_PCREL17F 12 +#define R_PARISC_PCREL14R 14 +#define R_PARISC_DPREL21L 18 +#define R_PARISC_DPREL14R 22 +#define R_PARISC_GPREL21L 26 +#define R_PARISC_GPREL14R 30 +#define R_PARISC_LTOFF21L 34 +#define R_PARISC_LTOFF14R 38 +#define R_PARISC_SECREL32 41 +#define R_PARISC_SEGBASE 48 +#define R_PARISC_SEGREL32 49 +#define R_PARISC_PLTOFF21L 50 +#define R_PARISC_PLTOFF14R 54 +#define R_PARISC_LTOFF_FPTR32 57 +#define R_PARISC_LTOFF_FPTR21L 58 +#define R_PARISC_LTOFF_FPTR14R 62 +#define R_PARISC_FPTR64 64 +#define R_PARISC_PLABEL32 65 +#define R_PARISC_PLABEL21L 66 +#define R_PARISC_PLABEL14R 70 +#define R_PARISC_PCREL64 72 +#define R_PARISC_PCREL22F 74 +#define R_PARISC_PCREL14WR 75 +#define R_PARISC_PCREL14DR 76 +#define R_PARISC_PCREL16F 77 +#define R_PARISC_PCREL16WF 78 +#define R_PARISC_PCREL16DF 79 +#define R_PARISC_DIR64 80 +#define R_PARISC_DIR14WR 83 +#define R_PARISC_DIR14DR 84 +#define R_PARISC_DIR16F 85 +#define R_PARISC_DIR16WF 86 +#define R_PARISC_DIR16DF 87 +#define R_PARISC_GPREL64 88 +#define R_PARISC_GPREL14WR 91 +#define R_PARISC_GPREL14DR 92 +#define R_PARISC_GPREL16F 93 +#define R_PARISC_GPREL16WF 94 +#define R_PARISC_GPREL16DF 95 +#define R_PARISC_LTOFF64 96 +#define R_PARISC_LTOFF14WR 99 +#define R_PARISC_LTOFF14DR 100 +#define R_PARISC_LTOFF16F 101 +#define R_PARISC_LTOFF16WF 102 +#define R_PARISC_LTOFF16DF 103 +#define R_PARISC_SECREL64 104 +#define R_PARISC_SEGREL64 112 +#define R_PARISC_PLTOFF14WR 115 +#define R_PARISC_PLTOFF14DR 116 +#define R_PARISC_PLTOFF16F 117 +#define R_PARISC_PLTOFF16WF 118 +#define R_PARISC_PLTOFF16DF 119 +#define R_PARISC_LTOFF_FPTR64 120 +#define R_PARISC_LTOFF_FPTR14WR 123 +#define R_PARISC_LTOFF_FPTR14DR 124 +#define R_PARISC_LTOFF_FPTR16F 125 +#define R_PARISC_LTOFF_FPTR16WF 126 +#define R_PARISC_LTOFF_FPTR16DF 127 +#define R_PARISC_LORESERVE 128 +#define R_PARISC_COPY 128 +#define R_PARISC_IPLT 129 +#define R_PARISC_EPLT 130 +#define R_PARISC_TPREL32 153 +#define R_PARISC_TPREL21L 154 +#define R_PARISC_TPREL14R 158 +#define R_PARISC_LTOFF_TP21L 162 +#define R_PARISC_LTOFF_TP14R 166 +#define R_PARISC_LTOFF_TP14F 167 +#define R_PARISC_TPREL64 216 +#define R_PARISC_TPREL14WR 219 +#define R_PARISC_TPREL14DR 220 +#define R_PARISC_TPREL16F 221 +#define R_PARISC_TPREL16WF 222 +#define R_PARISC_TPREL16DF 223 +#define R_PARISC_LTOFF_TP64 224 +#define R_PARISC_LTOFF_TP14WR 227 +#define R_PARISC_LTOFF_TP14DR 228 +#define R_PARISC_LTOFF_TP16F 229 +#define R_PARISC_LTOFF_TP16WF 230 +#define R_PARISC_LTOFF_TP16DF 231 +#define R_PARISC_GNU_VTENTRY 232 +#define R_PARISC_GNU_VTINHERIT 233 +#define R_PARISC_TLS_GD21L 234 +#define R_PARISC_TLS_GD14R 235 +#define R_PARISC_TLS_GDCALL 236 +#define R_PARISC_TLS_LDM21L 237 +#define R_PARISC_TLS_LDM14R 238 +#define R_PARISC_TLS_LDMCALL 239 +#define R_PARISC_TLS_LDO21L 240 +#define R_PARISC_TLS_LDO14R 241 +#define R_PARISC_TLS_DTPMOD32 242 +#define R_PARISC_TLS_DTPMOD64 243 +#define R_PARISC_TLS_DTPOFF32 244 +#define R_PARISC_TLS_DTPOFF64 245 +#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L +#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R +#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L +#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R +#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 +#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 +#define R_PARISC_HIRESERVE 255 + + + +#define PT_HP_TLS (PT_LOOS + 0x0) +#define PT_HP_CORE_NONE (PT_LOOS + 0x1) +#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) +#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) +#define PT_HP_CORE_COMM (PT_LOOS + 0x4) +#define PT_HP_CORE_PROC (PT_LOOS + 0x5) +#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) +#define PT_HP_CORE_STACK (PT_LOOS + 0x7) +#define PT_HP_CORE_SHM (PT_LOOS + 0x8) +#define PT_HP_CORE_MMF (PT_LOOS + 0x9) +#define PT_HP_PARALLEL (PT_LOOS + 0x10) +#define PT_HP_FASTBIND (PT_LOOS + 0x11) +#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) +#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) +#define PT_HP_STACK (PT_LOOS + 0x14) + +#define PT_PARISC_ARCHEXT 0x70000000 +#define PT_PARISC_UNWIND 0x70000001 + + + +#define PF_PARISC_SBP 0x08000000 + +#define PF_HP_PAGE_SIZE 0x00100000 +#define PF_HP_FAR_SHARED 0x00200000 +#define PF_HP_NEAR_SHARED 0x00400000 +#define PF_HP_CODE 0x01000000 +#define PF_HP_MODIFY 0x02000000 +#define PF_HP_LAZYSWAP 0x04000000 +#define PF_HP_SBP 0x08000000 + + + + + + +#define EF_ALPHA_32BIT 1 +#define EF_ALPHA_CANRELAX 2 + + + + +#define SHT_ALPHA_DEBUG 0x70000001 +#define SHT_ALPHA_REGINFO 0x70000002 + + + +#define SHF_ALPHA_GPREL 0x10000000 + + +#define STO_ALPHA_NOPV 0x80 +#define STO_ALPHA_STD_GPLOAD 0x88 + + + +#define R_ALPHA_NONE 0 +#define R_ALPHA_REFLONG 1 +#define R_ALPHA_REFQUAD 2 +#define R_ALPHA_GPREL32 3 +#define R_ALPHA_LITERAL 4 +#define R_ALPHA_LITUSE 5 +#define R_ALPHA_GPDISP 6 +#define R_ALPHA_BRADDR 7 +#define R_ALPHA_HINT 8 +#define R_ALPHA_SREL16 9 +#define R_ALPHA_SREL32 10 +#define R_ALPHA_SREL64 11 +#define R_ALPHA_GPRELHIGH 17 +#define R_ALPHA_GPRELLOW 18 +#define R_ALPHA_GPREL16 19 +#define R_ALPHA_COPY 24 +#define R_ALPHA_GLOB_DAT 25 +#define R_ALPHA_JMP_SLOT 26 +#define R_ALPHA_RELATIVE 27 +#define R_ALPHA_TLS_GD_HI 28 +#define R_ALPHA_TLSGD 29 +#define R_ALPHA_TLS_LDM 30 +#define R_ALPHA_DTPMOD64 31 +#define R_ALPHA_GOTDTPREL 32 +#define R_ALPHA_DTPREL64 33 +#define R_ALPHA_DTPRELHI 34 +#define R_ALPHA_DTPRELLO 35 +#define R_ALPHA_DTPREL16 36 +#define R_ALPHA_GOTTPREL 37 +#define R_ALPHA_TPREL64 38 +#define R_ALPHA_TPRELHI 39 +#define R_ALPHA_TPRELLO 40 +#define R_ALPHA_TPREL16 41 + +#define R_ALPHA_NUM 46 + + +#define LITUSE_ALPHA_ADDR 0 +#define LITUSE_ALPHA_BASE 1 +#define LITUSE_ALPHA_BYTOFF 2 +#define LITUSE_ALPHA_JSR 3 +#define LITUSE_ALPHA_TLS_GD 4 +#define LITUSE_ALPHA_TLS_LDM 5 + + +#define DT_ALPHA_PLTRO (DT_LOPROC + 0) +#define DT_ALPHA_NUM 1 + + + + +#define EF_PPC_EMB 0x80000000 + + +#define EF_PPC_RELOCATABLE 0x00010000 +#define EF_PPC_RELOCATABLE_LIB 0x00008000 + + + +#define R_PPC_NONE 0 +#define R_PPC_ADDR32 1 +#define R_PPC_ADDR24 2 +#define R_PPC_ADDR16 3 +#define R_PPC_ADDR16_LO 4 +#define R_PPC_ADDR16_HI 5 +#define R_PPC_ADDR16_HA 6 +#define R_PPC_ADDR14 7 +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 +#define R_PPC_REL14 11 +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 + + +#define R_PPC_TLS 67 +#define R_PPC_DTPMOD32 68 +#define R_PPC_TPREL16 69 +#define R_PPC_TPREL16_LO 70 +#define R_PPC_TPREL16_HI 71 +#define R_PPC_TPREL16_HA 72 +#define R_PPC_TPREL32 73 +#define R_PPC_DTPREL16 74 +#define R_PPC_DTPREL16_LO 75 +#define R_PPC_DTPREL16_HI 76 +#define R_PPC_DTPREL16_HA 77 +#define R_PPC_DTPREL32 78 +#define R_PPC_GOT_TLSGD16 79 +#define R_PPC_GOT_TLSGD16_LO 80 +#define R_PPC_GOT_TLSGD16_HI 81 +#define R_PPC_GOT_TLSGD16_HA 82 +#define R_PPC_GOT_TLSLD16 83 +#define R_PPC_GOT_TLSLD16_LO 84 +#define R_PPC_GOT_TLSLD16_HI 85 +#define R_PPC_GOT_TLSLD16_HA 86 +#define R_PPC_GOT_TPREL16 87 +#define R_PPC_GOT_TPREL16_LO 88 +#define R_PPC_GOT_TPREL16_HI 89 +#define R_PPC_GOT_TPREL16_HA 90 +#define R_PPC_GOT_DTPREL16 91 +#define R_PPC_GOT_DTPREL16_LO 92 +#define R_PPC_GOT_DTPREL16_HI 93 +#define R_PPC_GOT_DTPREL16_HA 94 +#define R_PPC_TLSGD 95 +#define R_PPC_TLSLD 96 + + +#define R_PPC_EMB_NADDR32 101 +#define R_PPC_EMB_NADDR16 102 +#define R_PPC_EMB_NADDR16_LO 103 +#define R_PPC_EMB_NADDR16_HI 104 +#define R_PPC_EMB_NADDR16_HA 105 +#define R_PPC_EMB_SDAI16 106 +#define R_PPC_EMB_SDA2I16 107 +#define R_PPC_EMB_SDA2REL 108 +#define R_PPC_EMB_SDA21 109 +#define R_PPC_EMB_MRKREF 110 +#define R_PPC_EMB_RELSEC16 111 +#define R_PPC_EMB_RELST_LO 112 +#define R_PPC_EMB_RELST_HI 113 +#define R_PPC_EMB_RELST_HA 114 +#define R_PPC_EMB_BIT_FLD 115 +#define R_PPC_EMB_RELSDA 116 + + +#define R_PPC_DIAB_SDA21_LO 180 +#define R_PPC_DIAB_SDA21_HI 181 +#define R_PPC_DIAB_SDA21_HA 182 +#define R_PPC_DIAB_RELSDA_LO 183 +#define R_PPC_DIAB_RELSDA_HI 184 +#define R_PPC_DIAB_RELSDA_HA 185 + + +#define R_PPC_IRELATIVE 248 + + +#define R_PPC_REL16 249 +#define R_PPC_REL16_LO 250 +#define R_PPC_REL16_HI 251 +#define R_PPC_REL16_HA 252 + + + +#define R_PPC_TOC16 255 + + +#define DT_PPC_GOT (DT_LOPROC + 0) +#define DT_PPC_OPT (DT_LOPROC + 1) +#define DT_PPC_NUM 2 + +#define PPC_OPT_TLS 1 + + +#define R_PPC64_NONE R_PPC_NONE +#define R_PPC64_ADDR32 R_PPC_ADDR32 +#define R_PPC64_ADDR24 R_PPC_ADDR24 +#define R_PPC64_ADDR16 R_PPC_ADDR16 +#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO +#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI +#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA +#define R_PPC64_ADDR14 R_PPC_ADDR14 +#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN +#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN +#define R_PPC64_REL24 R_PPC_REL24 +#define R_PPC64_REL14 R_PPC_REL14 +#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN +#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN +#define R_PPC64_GOT16 R_PPC_GOT16 +#define R_PPC64_GOT16_LO R_PPC_GOT16_LO +#define R_PPC64_GOT16_HI R_PPC_GOT16_HI +#define R_PPC64_GOT16_HA R_PPC_GOT16_HA + +#define R_PPC64_COPY R_PPC_COPY +#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT +#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT +#define R_PPC64_RELATIVE R_PPC_RELATIVE + +#define R_PPC64_UADDR32 R_PPC_UADDR32 +#define R_PPC64_UADDR16 R_PPC_UADDR16 +#define R_PPC64_REL32 R_PPC_REL32 +#define R_PPC64_PLT32 R_PPC_PLT32 +#define R_PPC64_PLTREL32 R_PPC_PLTREL32 +#define R_PPC64_PLT16_LO R_PPC_PLT16_LO +#define R_PPC64_PLT16_HI R_PPC_PLT16_HI +#define R_PPC64_PLT16_HA R_PPC_PLT16_HA + +#define R_PPC64_SECTOFF R_PPC_SECTOFF +#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO +#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI +#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA +#define R_PPC64_ADDR30 37 +#define R_PPC64_ADDR64 38 +#define R_PPC64_ADDR16_HIGHER 39 +#define R_PPC64_ADDR16_HIGHERA 40 +#define R_PPC64_ADDR16_HIGHEST 41 +#define R_PPC64_ADDR16_HIGHESTA 42 +#define R_PPC64_UADDR64 43 +#define R_PPC64_REL64 44 +#define R_PPC64_PLT64 45 +#define R_PPC64_PLTREL64 46 +#define R_PPC64_TOC16 47 +#define R_PPC64_TOC16_LO 48 +#define R_PPC64_TOC16_HI 49 +#define R_PPC64_TOC16_HA 50 +#define R_PPC64_TOC 51 +#define R_PPC64_PLTGOT16 52 +#define R_PPC64_PLTGOT16_LO 53 +#define R_PPC64_PLTGOT16_HI 54 +#define R_PPC64_PLTGOT16_HA 55 + +#define R_PPC64_ADDR16_DS 56 +#define R_PPC64_ADDR16_LO_DS 57 +#define R_PPC64_GOT16_DS 58 +#define R_PPC64_GOT16_LO_DS 59 +#define R_PPC64_PLT16_LO_DS 60 +#define R_PPC64_SECTOFF_DS 61 +#define R_PPC64_SECTOFF_LO_DS 62 +#define R_PPC64_TOC16_DS 63 +#define R_PPC64_TOC16_LO_DS 64 +#define R_PPC64_PLTGOT16_DS 65 +#define R_PPC64_PLTGOT16_LO_DS 66 + + +#define R_PPC64_TLS 67 +#define R_PPC64_DTPMOD64 68 +#define R_PPC64_TPREL16 69 +#define R_PPC64_TPREL16_LO 70 +#define R_PPC64_TPREL16_HI 71 +#define R_PPC64_TPREL16_HA 72 +#define R_PPC64_TPREL64 73 +#define R_PPC64_DTPREL16 74 +#define R_PPC64_DTPREL16_LO 75 +#define R_PPC64_DTPREL16_HI 76 +#define R_PPC64_DTPREL16_HA 77 +#define R_PPC64_DTPREL64 78 +#define R_PPC64_GOT_TLSGD16 79 +#define R_PPC64_GOT_TLSGD16_LO 80 +#define R_PPC64_GOT_TLSGD16_HI 81 +#define R_PPC64_GOT_TLSGD16_HA 82 +#define R_PPC64_GOT_TLSLD16 83 +#define R_PPC64_GOT_TLSLD16_LO 84 +#define R_PPC64_GOT_TLSLD16_HI 85 +#define R_PPC64_GOT_TLSLD16_HA 86 +#define R_PPC64_GOT_TPREL16_DS 87 +#define R_PPC64_GOT_TPREL16_LO_DS 88 +#define R_PPC64_GOT_TPREL16_HI 89 +#define R_PPC64_GOT_TPREL16_HA 90 +#define R_PPC64_GOT_DTPREL16_DS 91 +#define R_PPC64_GOT_DTPREL16_LO_DS 92 +#define R_PPC64_GOT_DTPREL16_HI 93 +#define R_PPC64_GOT_DTPREL16_HA 94 +#define R_PPC64_TPREL16_DS 95 +#define R_PPC64_TPREL16_LO_DS 96 +#define R_PPC64_TPREL16_HIGHER 97 +#define R_PPC64_TPREL16_HIGHERA 98 +#define R_PPC64_TPREL16_HIGHEST 99 +#define R_PPC64_TPREL16_HIGHESTA 100 +#define R_PPC64_DTPREL16_DS 101 +#define R_PPC64_DTPREL16_LO_DS 102 +#define R_PPC64_DTPREL16_HIGHER 103 +#define R_PPC64_DTPREL16_HIGHERA 104 +#define R_PPC64_DTPREL16_HIGHEST 105 +#define R_PPC64_DTPREL16_HIGHESTA 106 +#define R_PPC64_TLSGD 107 +#define R_PPC64_TLSLD 108 +#define R_PPC64_TOCSAVE 109 +#define R_PPC64_ADDR16_HIGH 110 +#define R_PPC64_ADDR16_HIGHA 111 +#define R_PPC64_TPREL16_HIGH 112 +#define R_PPC64_TPREL16_HIGHA 113 +#define R_PPC64_DTPREL16_HIGH 114 +#define R_PPC64_DTPREL16_HIGHA 115 + + +#define R_PPC64_JMP_IREL 247 +#define R_PPC64_IRELATIVE 248 +#define R_PPC64_REL16 249 +#define R_PPC64_REL16_LO 250 +#define R_PPC64_REL16_HI 251 +#define R_PPC64_REL16_HA 252 + +#define EF_PPC64_ABI 3 + +#define DT_PPC64_GLINK (DT_LOPROC + 0) +#define DT_PPC64_OPD (DT_LOPROC + 1) +#define DT_PPC64_OPDSZ (DT_LOPROC + 2) +#define DT_PPC64_OPT (DT_LOPROC + 3) +#define DT_PPC64_NUM 4 + +#define PPC64_OPT_TLS 1 +#define PPC64_OPT_MULTI_TOC 2 + +#define STO_PPC64_LOCAL_BIT 5 +#define STO_PPC64_LOCAL_MASK 0xe0 +#define PPC64_LOCAL_ENTRY_OFFSET(x) (1 << (((x)&0xe0)>>5) & 0xfc) + + +#define EF_ARM_RELEXEC 0x01 +#define EF_ARM_HASENTRY 0x02 +#define EF_ARM_INTERWORK 0x04 +#define EF_ARM_APCS_26 0x08 +#define EF_ARM_APCS_FLOAT 0x10 +#define EF_ARM_PIC 0x20 +#define EF_ARM_ALIGN8 0x40 +#define EF_ARM_NEW_ABI 0x80 +#define EF_ARM_OLD_ABI 0x100 +#define EF_ARM_SOFT_FLOAT 0x200 +#define EF_ARM_VFP_FLOAT 0x400 +#define EF_ARM_MAVERICK_FLOAT 0x800 + +#define EF_ARM_ABI_FLOAT_SOFT 0x200 +#define EF_ARM_ABI_FLOAT_HARD 0x400 + + +#define EF_ARM_SYMSARESORTED 0x04 +#define EF_ARM_DYNSYMSUSESEGIDX 0x08 +#define EF_ARM_MAPSYMSFIRST 0x10 +#define EF_ARM_EABIMASK 0XFF000000 + + +#define EF_ARM_BE8 0x00800000 +#define EF_ARM_LE8 0x00400000 + +#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +#define EF_ARM_EABI_UNKNOWN 0x00000000 +#define EF_ARM_EABI_VER1 0x01000000 +#define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER3 0x03000000 +#define EF_ARM_EABI_VER4 0x04000000 +#define EF_ARM_EABI_VER5 0x05000000 + + +#define STT_ARM_TFUNC STT_LOPROC +#define STT_ARM_16BIT STT_HIPROC + + +#define SHF_ARM_ENTRYSECT 0x10000000 +#define SHF_ARM_COMDEF 0x80000000 + + + +#define PF_ARM_SB 0x10000000 + +#define PF_ARM_PI 0x20000000 +#define PF_ARM_ABS 0x40000000 + + +#define PT_ARM_EXIDX (PT_LOPROC + 1) + + +#define SHT_ARM_EXIDX (SHT_LOPROC + 1) +#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) +#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) + +#define R_AARCH64_NONE 0 +#define R_AARCH64_P32_ABS32 1 +#define R_AARCH64_P32_COPY 180 +#define R_AARCH64_P32_GLOB_DAT 181 +#define R_AARCH64_P32_JUMP_SLOT 182 +#define R_AARCH64_P32_RELATIVE 183 +#define R_AARCH64_P32_TLS_DTPMOD 184 +#define R_AARCH64_P32_TLS_DTPREL 185 +#define R_AARCH64_P32_TLS_TPREL 186 +#define R_AARCH64_P32_TLSDESC 187 +#define R_AARCH64_P32_IRELATIVE 188 +#define R_AARCH64_ABS64 257 +#define R_AARCH64_ABS32 258 +#define R_AARCH64_ABS16 259 +#define R_AARCH64_PREL64 260 +#define R_AARCH64_PREL32 261 +#define R_AARCH64_PREL16 262 +#define R_AARCH64_MOVW_UABS_G0 263 +#define R_AARCH64_MOVW_UABS_G0_NC 264 +#define R_AARCH64_MOVW_UABS_G1 265 +#define R_AARCH64_MOVW_UABS_G1_NC 266 +#define R_AARCH64_MOVW_UABS_G2 267 +#define R_AARCH64_MOVW_UABS_G2_NC 268 +#define R_AARCH64_MOVW_UABS_G3 269 +#define R_AARCH64_MOVW_SABS_G0 270 +#define R_AARCH64_MOVW_SABS_G1 271 +#define R_AARCH64_MOVW_SABS_G2 272 +#define R_AARCH64_LD_PREL_LO19 273 +#define R_AARCH64_ADR_PREL_LO21 274 +#define R_AARCH64_ADR_PREL_PG_HI21 275 +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 +#define R_AARCH64_ADD_ABS_LO12_NC 277 +#define R_AARCH64_LDST8_ABS_LO12_NC 278 +#define R_AARCH64_TSTBR14 279 +#define R_AARCH64_CONDBR19 280 +#define R_AARCH64_JUMP26 282 +#define R_AARCH64_CALL26 283 +#define R_AARCH64_LDST16_ABS_LO12_NC 284 +#define R_AARCH64_LDST32_ABS_LO12_NC 285 +#define R_AARCH64_LDST64_ABS_LO12_NC 286 +#define R_AARCH64_MOVW_PREL_G0 287 +#define R_AARCH64_MOVW_PREL_G0_NC 288 +#define R_AARCH64_MOVW_PREL_G1 289 +#define R_AARCH64_MOVW_PREL_G1_NC 290 +#define R_AARCH64_MOVW_PREL_G2 291 +#define R_AARCH64_MOVW_PREL_G2_NC 292 +#define R_AARCH64_MOVW_PREL_G3 293 +#define R_AARCH64_LDST128_ABS_LO12_NC 299 +#define R_AARCH64_MOVW_GOTOFF_G0 300 +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 +#define R_AARCH64_MOVW_GOTOFF_G1 302 +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 +#define R_AARCH64_MOVW_GOTOFF_G2 304 +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 +#define R_AARCH64_MOVW_GOTOFF_G3 306 +#define R_AARCH64_GOTREL64 307 +#define R_AARCH64_GOTREL32 308 +#define R_AARCH64_GOT_LD_PREL19 309 +#define R_AARCH64_LD64_GOTOFF_LO15 310 +#define R_AARCH64_ADR_GOT_PAGE 311 +#define R_AARCH64_LD64_GOT_LO12_NC 312 +#define R_AARCH64_LD64_GOTPAGE_LO15 313 +#define R_AARCH64_TLSGD_ADR_PREL21 512 +#define R_AARCH64_TLSGD_ADR_PAGE21 513 +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 +#define R_AARCH64_TLSGD_MOVW_G1 515 +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 +#define R_AARCH64_TLSLD_ADR_PREL21 517 +#define R_AARCH64_TLSLD_ADR_PAGE21 518 +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 +#define R_AARCH64_TLSLD_MOVW_G1 520 +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 +#define R_AARCH64_TLSLD_LD_PREL19 522 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 +#define R_AARCH64_TLSDESC_LD_PREL19 560 +#define R_AARCH64_TLSDESC_ADR_PREL21 561 +#define R_AARCH64_TLSDESC_ADR_PAGE21 562 +#define R_AARCH64_TLSDESC_LD64_LO12 563 +#define R_AARCH64_TLSDESC_ADD_LO12 564 +#define R_AARCH64_TLSDESC_OFF_G1 565 +#define R_AARCH64_TLSDESC_OFF_G0_NC 566 +#define R_AARCH64_TLSDESC_LDR 567 +#define R_AARCH64_TLSDESC_ADD 568 +#define R_AARCH64_TLSDESC_CALL 569 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 +#define R_AARCH64_JUMP_SLOT 1026 +#define R_AARCH64_RELATIVE 1027 +#define R_AARCH64_TLS_DTPMOD 1028 +#define R_AARCH64_TLS_DTPMOD64 1028 +#define R_AARCH64_TLS_DTPREL 1029 +#define R_AARCH64_TLS_DTPREL64 1029 +#define R_AARCH64_TLS_TPREL 1030 +#define R_AARCH64_TLS_TPREL64 1030 +#define R_AARCH64_TLSDESC 1031 + + +#define R_ARM_NONE 0 +#define R_ARM_PC24 1 +#define R_ARM_ABS32 2 +#define R_ARM_REL32 3 +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 +#define R_ARM_ABS12 6 +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_TLS_DESC 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_TLS_DTPMOD32 17 +#define R_ARM_TLS_DTPOFF32 18 +#define R_ARM_TLS_TPOFF32 19 +#define R_ARM_COPY 20 +#define R_ARM_GLOB_DAT 21 +#define R_ARM_JUMP_SLOT 22 +#define R_ARM_RELATIVE 23 +#define R_ARM_GOTOFF 24 +#define R_ARM_GOTPC 25 +#define R_ARM_GOT32 26 +#define R_ARM_PLT32 27 +#define R_ARM_CALL 28 +#define R_ARM_JUMP24 29 +#define R_ARM_THM_JUMP24 30 +#define R_ARM_BASE_ABS 31 +#define R_ARM_ALU_PCREL_7_0 32 +#define R_ARM_ALU_PCREL_15_8 33 +#define R_ARM_ALU_PCREL_23_15 34 +#define R_ARM_LDR_SBREL_11_0 35 +#define R_ARM_ALU_SBREL_19_12 36 +#define R_ARM_ALU_SBREL_27_20 37 +#define R_ARM_TARGET1 38 +#define R_ARM_SBREL31 39 +#define R_ARM_V4BX 40 +#define R_ARM_TARGET2 41 +#define R_ARM_PREL31 42 +#define R_ARM_MOVW_ABS_NC 43 +#define R_ARM_MOVT_ABS 44 +#define R_ARM_MOVW_PREL_NC 45 +#define R_ARM_MOVT_PREL 46 +#define R_ARM_THM_MOVW_ABS_NC 47 +#define R_ARM_THM_MOVT_ABS 48 +#define R_ARM_THM_MOVW_PREL_NC 49 +#define R_ARM_THM_MOVT_PREL 50 +#define R_ARM_THM_JUMP19 51 +#define R_ARM_THM_JUMP6 52 +#define R_ARM_THM_ALU_PREL_11_0 53 +#define R_ARM_THM_PC12 54 +#define R_ARM_ABS32_NOI 55 +#define R_ARM_REL32_NOI 56 +#define R_ARM_ALU_PC_G0_NC 57 +#define R_ARM_ALU_PC_G0 58 +#define R_ARM_ALU_PC_G1_NC 59 +#define R_ARM_ALU_PC_G1 60 +#define R_ARM_ALU_PC_G2 61 +#define R_ARM_LDR_PC_G1 62 +#define R_ARM_LDR_PC_G2 63 +#define R_ARM_LDRS_PC_G0 64 +#define R_ARM_LDRS_PC_G1 65 +#define R_ARM_LDRS_PC_G2 66 +#define R_ARM_LDC_PC_G0 67 +#define R_ARM_LDC_PC_G1 68 +#define R_ARM_LDC_PC_G2 69 +#define R_ARM_ALU_SB_G0_NC 70 +#define R_ARM_ALU_SB_G0 71 +#define R_ARM_ALU_SB_G1_NC 72 +#define R_ARM_ALU_SB_G1 73 +#define R_ARM_ALU_SB_G2 74 +#define R_ARM_LDR_SB_G0 75 +#define R_ARM_LDR_SB_G1 76 +#define R_ARM_LDR_SB_G2 77 +#define R_ARM_LDRS_SB_G0 78 +#define R_ARM_LDRS_SB_G1 79 +#define R_ARM_LDRS_SB_G2 80 +#define R_ARM_LDC_SB_G0 81 +#define R_ARM_LDC_SB_G1 82 +#define R_ARM_LDC_SB_G2 83 +#define R_ARM_MOVW_BREL_NC 84 +#define R_ARM_MOVT_BREL 85 +#define R_ARM_MOVW_BREL 86 +#define R_ARM_THM_MOVW_BREL_NC 87 +#define R_ARM_THM_MOVT_BREL 88 +#define R_ARM_THM_MOVW_BREL 89 +#define R_ARM_TLS_GOTDESC 90 +#define R_ARM_TLS_CALL 91 +#define R_ARM_TLS_DESCSEQ 92 +#define R_ARM_THM_TLS_CALL 93 +#define R_ARM_PLT32_ABS 94 +#define R_ARM_GOT_ABS 95 +#define R_ARM_GOT_PREL 96 +#define R_ARM_GOT_BREL12 97 +#define R_ARM_GOTOFF12 98 +#define R_ARM_GOTRELAX 99 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_THM_PC11 102 +#define R_ARM_THM_PC9 103 +#define R_ARM_TLS_GD32 104 + +#define R_ARM_TLS_LDM32 105 + +#define R_ARM_TLS_LDO32 106 + +#define R_ARM_TLS_IE32 107 + +#define R_ARM_TLS_LE32 108 +#define R_ARM_TLS_LDO12 109 +#define R_ARM_TLS_LE12 110 +#define R_ARM_TLS_IE12GP 111 +#define R_ARM_ME_TOO 128 +#define R_ARM_THM_TLS_DESCSEQ 129 +#define R_ARM_THM_TLS_DESCSEQ16 129 +#define R_ARM_THM_TLS_DESCSEQ32 130 +#define R_ARM_THM_GOT_BREL12 131 +#define R_ARM_IRELATIVE 160 +#define R_ARM_RXPC25 249 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS22 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 + +#define R_ARM_NUM 256 + + + + +#define EF_IA_64_MASKOS 0x0000000f +#define EF_IA_64_ABI64 0x00000010 +#define EF_IA_64_ARCH 0xff000000 + + +#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) +#define PT_IA_64_UNWIND (PT_LOPROC + 1) +#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) +#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) +#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) + + +#define PF_IA_64_NORECOV 0x80000000 + + +#define SHT_IA_64_EXT (SHT_LOPROC + 0) +#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) + + +#define SHF_IA_64_SHORT 0x10000000 +#define SHF_IA_64_NORECOV 0x20000000 + + +#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) +#define DT_IA_64_NUM 1 + + +#define R_IA64_NONE 0x00 +#define R_IA64_IMM14 0x21 +#define R_IA64_IMM22 0x22 +#define R_IA64_IMM64 0x23 +#define R_IA64_DIR32MSB 0x24 +#define R_IA64_DIR32LSB 0x25 +#define R_IA64_DIR64MSB 0x26 +#define R_IA64_DIR64LSB 0x27 +#define R_IA64_GPREL22 0x2a +#define R_IA64_GPREL64I 0x2b +#define R_IA64_GPREL32MSB 0x2c +#define R_IA64_GPREL32LSB 0x2d +#define R_IA64_GPREL64MSB 0x2e +#define R_IA64_GPREL64LSB 0x2f +#define R_IA64_LTOFF22 0x32 +#define R_IA64_LTOFF64I 0x33 +#define R_IA64_PLTOFF22 0x3a +#define R_IA64_PLTOFF64I 0x3b +#define R_IA64_PLTOFF64MSB 0x3e +#define R_IA64_PLTOFF64LSB 0x3f +#define R_IA64_FPTR64I 0x43 +#define R_IA64_FPTR32MSB 0x44 +#define R_IA64_FPTR32LSB 0x45 +#define R_IA64_FPTR64MSB 0x46 +#define R_IA64_FPTR64LSB 0x47 +#define R_IA64_PCREL60B 0x48 +#define R_IA64_PCREL21B 0x49 +#define R_IA64_PCREL21M 0x4a +#define R_IA64_PCREL21F 0x4b +#define R_IA64_PCREL32MSB 0x4c +#define R_IA64_PCREL32LSB 0x4d +#define R_IA64_PCREL64MSB 0x4e +#define R_IA64_PCREL64LSB 0x4f +#define R_IA64_LTOFF_FPTR22 0x52 +#define R_IA64_LTOFF_FPTR64I 0x53 +#define R_IA64_LTOFF_FPTR32MSB 0x54 +#define R_IA64_LTOFF_FPTR32LSB 0x55 +#define R_IA64_LTOFF_FPTR64MSB 0x56 +#define R_IA64_LTOFF_FPTR64LSB 0x57 +#define R_IA64_SEGREL32MSB 0x5c +#define R_IA64_SEGREL32LSB 0x5d +#define R_IA64_SEGREL64MSB 0x5e +#define R_IA64_SEGREL64LSB 0x5f +#define R_IA64_SECREL32MSB 0x64 +#define R_IA64_SECREL32LSB 0x65 +#define R_IA64_SECREL64MSB 0x66 +#define R_IA64_SECREL64LSB 0x67 +#define R_IA64_REL32MSB 0x6c +#define R_IA64_REL32LSB 0x6d +#define R_IA64_REL64MSB 0x6e +#define R_IA64_REL64LSB 0x6f +#define R_IA64_LTV32MSB 0x74 +#define R_IA64_LTV32LSB 0x75 +#define R_IA64_LTV64MSB 0x76 +#define R_IA64_LTV64LSB 0x77 +#define R_IA64_PCREL21BI 0x79 +#define R_IA64_PCREL22 0x7a +#define R_IA64_PCREL64I 0x7b +#define R_IA64_IPLTMSB 0x80 +#define R_IA64_IPLTLSB 0x81 +#define R_IA64_COPY 0x84 +#define R_IA64_SUB 0x85 +#define R_IA64_LTOFF22X 0x86 +#define R_IA64_LDXMOV 0x87 +#define R_IA64_TPREL14 0x91 +#define R_IA64_TPREL22 0x92 +#define R_IA64_TPREL64I 0x93 +#define R_IA64_TPREL64MSB 0x96 +#define R_IA64_TPREL64LSB 0x97 +#define R_IA64_LTOFF_TPREL22 0x9a +#define R_IA64_DTPMOD64MSB 0xa6 +#define R_IA64_DTPMOD64LSB 0xa7 +#define R_IA64_LTOFF_DTPMOD22 0xaa +#define R_IA64_DTPREL14 0xb1 +#define R_IA64_DTPREL22 0xb2 +#define R_IA64_DTPREL64I 0xb3 +#define R_IA64_DTPREL32MSB 0xb4 +#define R_IA64_DTPREL32LSB 0xb5 +#define R_IA64_DTPREL64MSB 0xb6 +#define R_IA64_DTPREL64LSB 0xb7 +#define R_IA64_LTOFF_DTPREL22 0xba + + +#define EF_SH_MACH_MASK 0x1f +#define EF_SH_UNKNOWN 0x0 +#define EF_SH1 0x1 +#define EF_SH2 0x2 +#define EF_SH3 0x3 +#define EF_SH_DSP 0x4 +#define EF_SH3_DSP 0x5 +#define EF_SH4AL_DSP 0x6 +#define EF_SH3E 0x8 +#define EF_SH4 0x9 +#define EF_SH2E 0xb +#define EF_SH4A 0xc +#define EF_SH2A 0xd +#define EF_SH4_NOFPU 0x10 +#define EF_SH4A_NOFPU 0x11 +#define EF_SH4_NOMMU_NOFPU 0x12 +#define EF_SH2A_NOFPU 0x13 +#define EF_SH3_NOMMU 0x14 +#define EF_SH2A_SH4_NOFPU 0x15 +#define EF_SH2A_SH3_NOFPU 0x16 +#define EF_SH2A_SH4 0x17 +#define EF_SH2A_SH3E 0x18 + +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_TLS_GD_32 144 +#define R_SH_TLS_LD_32 145 +#define R_SH_TLS_LDO_32 146 +#define R_SH_TLS_IE_32 147 +#define R_SH_TLS_LE_32 148 +#define R_SH_TLS_DTPMOD32 149 +#define R_SH_TLS_DTPOFF32 150 +#define R_SH_TLS_TPOFF32 151 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 +#define R_SH_GOT20 201 +#define R_SH_GOTOFF20 202 +#define R_SH_GOTFUNCDESC 203 +#define R_SH_GOTFUNCDEST20 204 +#define R_SH_GOTOFFFUNCDESC 205 +#define R_SH_GOTOFFFUNCDEST20 206 +#define R_SH_FUNCDESC 207 +#define R_SH_FUNCDESC_VALUE 208 + +#define R_SH_NUM 256 + + + +#define R_390_NONE 0 +#define R_390_8 1 +#define R_390_12 2 +#define R_390_16 3 +#define R_390_32 4 +#define R_390_PC32 5 +#define R_390_GOT12 6 +#define R_390_GOT32 7 +#define R_390_PLT32 8 +#define R_390_COPY 9 +#define R_390_GLOB_DAT 10 +#define R_390_JMP_SLOT 11 +#define R_390_RELATIVE 12 +#define R_390_GOTOFF32 13 +#define R_390_GOTPC 14 +#define R_390_GOT16 15 +#define R_390_PC16 16 +#define R_390_PC16DBL 17 +#define R_390_PLT16DBL 18 +#define R_390_PC32DBL 19 +#define R_390_PLT32DBL 20 +#define R_390_GOTPCDBL 21 +#define R_390_64 22 +#define R_390_PC64 23 +#define R_390_GOT64 24 +#define R_390_PLT64 25 +#define R_390_GOTENT 26 +#define R_390_GOTOFF16 27 +#define R_390_GOTOFF64 28 +#define R_390_GOTPLT12 29 +#define R_390_GOTPLT16 30 +#define R_390_GOTPLT32 31 +#define R_390_GOTPLT64 32 +#define R_390_GOTPLTENT 33 +#define R_390_PLTOFF16 34 +#define R_390_PLTOFF32 35 +#define R_390_PLTOFF64 36 +#define R_390_TLS_LOAD 37 +#define R_390_TLS_GDCALL 38 + +#define R_390_TLS_LDCALL 39 + +#define R_390_TLS_GD32 40 + +#define R_390_TLS_GD64 41 + +#define R_390_TLS_GOTIE12 42 + +#define R_390_TLS_GOTIE32 43 + +#define R_390_TLS_GOTIE64 44 + +#define R_390_TLS_LDM32 45 + +#define R_390_TLS_LDM64 46 + +#define R_390_TLS_IE32 47 + +#define R_390_TLS_IE64 48 + +#define R_390_TLS_IEENT 49 + +#define R_390_TLS_LE32 50 + +#define R_390_TLS_LE64 51 + +#define R_390_TLS_LDO32 52 + +#define R_390_TLS_LDO64 53 + +#define R_390_TLS_DTPMOD 54 +#define R_390_TLS_DTPOFF 55 +#define R_390_TLS_TPOFF 56 + +#define R_390_20 57 +#define R_390_GOT20 58 +#define R_390_GOTPLT20 59 +#define R_390_TLS_GOTIE20 60 + + +#define R_390_NUM 61 + + + +#define R_CRIS_NONE 0 +#define R_CRIS_8 1 +#define R_CRIS_16 2 +#define R_CRIS_32 3 +#define R_CRIS_8_PCREL 4 +#define R_CRIS_16_PCREL 5 +#define R_CRIS_32_PCREL 6 +#define R_CRIS_GNU_VTINHERIT 7 +#define R_CRIS_GNU_VTENTRY 8 +#define R_CRIS_COPY 9 +#define R_CRIS_GLOB_DAT 10 +#define R_CRIS_JUMP_SLOT 11 +#define R_CRIS_RELATIVE 12 +#define R_CRIS_16_GOT 13 +#define R_CRIS_32_GOT 14 +#define R_CRIS_16_GOTPLT 15 +#define R_CRIS_32_GOTPLT 16 +#define R_CRIS_32_GOTREL 17 +#define R_CRIS_32_PLT_GOTREL 18 +#define R_CRIS_32_PLT_PCREL 19 + +#define R_CRIS_NUM 20 + + + +#define R_X86_64_NONE 0 +#define R_X86_64_64 1 +#define R_X86_64_PC32 2 +#define R_X86_64_GOT32 3 +#define R_X86_64_PLT32 4 +#define R_X86_64_COPY 5 +#define R_X86_64_GLOB_DAT 6 +#define R_X86_64_JUMP_SLOT 7 +#define R_X86_64_RELATIVE 8 +#define R_X86_64_GOTPCREL 9 + +#define R_X86_64_32 10 +#define R_X86_64_32S 11 +#define R_X86_64_16 12 +#define R_X86_64_PC16 13 +#define R_X86_64_8 14 +#define R_X86_64_PC8 15 +#define R_X86_64_DTPMOD64 16 +#define R_X86_64_DTPOFF64 17 +#define R_X86_64_TPOFF64 18 +#define R_X86_64_TLSGD 19 + +#define R_X86_64_TLSLD 20 + +#define R_X86_64_DTPOFF32 21 +#define R_X86_64_GOTTPOFF 22 + +#define R_X86_64_TPOFF32 23 +#define R_X86_64_PC64 24 +#define R_X86_64_GOTOFF64 25 +#define R_X86_64_GOTPC32 26 +#define R_X86_64_GOT64 27 +#define R_X86_64_GOTPCREL64 28 +#define R_X86_64_GOTPC64 29 +#define R_X86_64_GOTPLT64 30 +#define R_X86_64_PLTOFF64 31 +#define R_X86_64_SIZE32 32 +#define R_X86_64_SIZE64 33 + +#define R_X86_64_GOTPC32_TLSDESC 34 +#define R_X86_64_TLSDESC_CALL 35 + +#define R_X86_64_TLSDESC 36 +#define R_X86_64_IRELATIVE 37 +#define R_X86_64_RELATIVE64 38 +#define R_X86_64_GOTPCRELX 41 +#define R_X86_64_REX_GOTPCRELX 42 +#define R_X86_64_NUM 43 + + + +#define R_MN10300_NONE 0 +#define R_MN10300_32 1 +#define R_MN10300_16 2 +#define R_MN10300_8 3 +#define R_MN10300_PCREL32 4 +#define R_MN10300_PCREL16 5 +#define R_MN10300_PCREL8 6 +#define R_MN10300_GNU_VTINHERIT 7 +#define R_MN10300_GNU_VTENTRY 8 +#define R_MN10300_24 9 +#define R_MN10300_GOTPC32 10 +#define R_MN10300_GOTPC16 11 +#define R_MN10300_GOTOFF32 12 +#define R_MN10300_GOTOFF24 13 +#define R_MN10300_GOTOFF16 14 +#define R_MN10300_PLT32 15 +#define R_MN10300_PLT16 16 +#define R_MN10300_GOT32 17 +#define R_MN10300_GOT24 18 +#define R_MN10300_GOT16 19 +#define R_MN10300_COPY 20 +#define R_MN10300_GLOB_DAT 21 +#define R_MN10300_JMP_SLOT 22 +#define R_MN10300_RELATIVE 23 + +#define R_MN10300_NUM 24 + + + +#define R_M32R_NONE 0 +#define R_M32R_16 1 +#define R_M32R_32 2 +#define R_M32R_24 3 +#define R_M32R_10_PCREL 4 +#define R_M32R_18_PCREL 5 +#define R_M32R_26_PCREL 6 +#define R_M32R_HI16_ULO 7 +#define R_M32R_HI16_SLO 8 +#define R_M32R_LO16 9 +#define R_M32R_SDA16 10 +#define R_M32R_GNU_VTINHERIT 11 +#define R_M32R_GNU_VTENTRY 12 + +#define R_M32R_16_RELA 33 +#define R_M32R_32_RELA 34 +#define R_M32R_24_RELA 35 +#define R_M32R_10_PCREL_RELA 36 +#define R_M32R_18_PCREL_RELA 37 +#define R_M32R_26_PCREL_RELA 38 +#define R_M32R_HI16_ULO_RELA 39 +#define R_M32R_HI16_SLO_RELA 40 +#define R_M32R_LO16_RELA 41 +#define R_M32R_SDA16_RELA 42 +#define R_M32R_RELA_GNU_VTINHERIT 43 +#define R_M32R_RELA_GNU_VTENTRY 44 +#define R_M32R_REL32 45 + +#define R_M32R_GOT24 48 +#define R_M32R_26_PLTREL 49 +#define R_M32R_COPY 50 +#define R_M32R_GLOB_DAT 51 +#define R_M32R_JMP_SLOT 52 +#define R_M32R_RELATIVE 53 +#define R_M32R_GOTOFF 54 +#define R_M32R_GOTPC24 55 +#define R_M32R_GOT16_HI_ULO 56 + +#define R_M32R_GOT16_HI_SLO 57 + +#define R_M32R_GOT16_LO 58 +#define R_M32R_GOTPC_HI_ULO 59 + +#define R_M32R_GOTPC_HI_SLO 60 + +#define R_M32R_GOTPC_LO 61 + +#define R_M32R_GOTOFF_HI_ULO 62 + +#define R_M32R_GOTOFF_HI_SLO 63 + +#define R_M32R_GOTOFF_LO 64 +#define R_M32R_NUM 256 + +#define R_MICROBLAZE_NONE 0 +#define R_MICROBLAZE_32 1 +#define R_MICROBLAZE_32_PCREL 2 +#define R_MICROBLAZE_64_PCREL 3 +#define R_MICROBLAZE_32_PCREL_LO 4 +#define R_MICROBLAZE_64 5 +#define R_MICROBLAZE_32_LO 6 +#define R_MICROBLAZE_SRO32 7 +#define R_MICROBLAZE_SRW32 8 +#define R_MICROBLAZE_64_NONE 9 +#define R_MICROBLAZE_32_SYM_OP_SYM 10 +#define R_MICROBLAZE_GNU_VTINHERIT 11 +#define R_MICROBLAZE_GNU_VTENTRY 12 +#define R_MICROBLAZE_GOTPC_64 13 +#define R_MICROBLAZE_GOT_64 14 +#define R_MICROBLAZE_PLT_64 15 +#define R_MICROBLAZE_REL 16 +#define R_MICROBLAZE_JUMP_SLOT 17 +#define R_MICROBLAZE_GLOB_DAT 18 +#define R_MICROBLAZE_GOTOFF_64 19 +#define R_MICROBLAZE_GOTOFF_32 20 +#define R_MICROBLAZE_COPY 21 +#define R_MICROBLAZE_TLS 22 +#define R_MICROBLAZE_TLSGD 23 +#define R_MICROBLAZE_TLSLD 24 +#define R_MICROBLAZE_TLSDTPMOD32 25 +#define R_MICROBLAZE_TLSDTPREL32 26 +#define R_MICROBLAZE_TLSDTPREL64 27 +#define R_MICROBLAZE_TLSGOTTPREL32 28 +#define R_MICROBLAZE_TLSTPREL32 29 + +#define DT_NIOS2_GP 0x70000002 + +#define R_NIOS2_NONE 0 +#define R_NIOS2_S16 1 +#define R_NIOS2_U16 2 +#define R_NIOS2_PCREL16 3 +#define R_NIOS2_CALL26 4 +#define R_NIOS2_IMM5 5 +#define R_NIOS2_CACHE_OPX 6 +#define R_NIOS2_IMM6 7 +#define R_NIOS2_IMM8 8 +#define R_NIOS2_HI16 9 +#define R_NIOS2_LO16 10 +#define R_NIOS2_HIADJ16 11 +#define R_NIOS2_BFD_RELOC_32 12 +#define R_NIOS2_BFD_RELOC_16 13 +#define R_NIOS2_BFD_RELOC_8 14 +#define R_NIOS2_GPREL 15 +#define R_NIOS2_GNU_VTINHERIT 16 +#define R_NIOS2_GNU_VTENTRY 17 +#define R_NIOS2_UJMP 18 +#define R_NIOS2_CJMP 19 +#define R_NIOS2_CALLR 20 +#define R_NIOS2_ALIGN 21 +#define R_NIOS2_GOT16 22 +#define R_NIOS2_CALL16 23 +#define R_NIOS2_GOTOFF_LO 24 +#define R_NIOS2_GOTOFF_HA 25 +#define R_NIOS2_PCREL_LO 26 +#define R_NIOS2_PCREL_HA 27 +#define R_NIOS2_TLS_GD16 28 +#define R_NIOS2_TLS_LDM16 29 +#define R_NIOS2_TLS_LDO16 30 +#define R_NIOS2_TLS_IE16 31 +#define R_NIOS2_TLS_LE16 32 +#define R_NIOS2_TLS_DTPMOD 33 +#define R_NIOS2_TLS_DTPREL 34 +#define R_NIOS2_TLS_TPREL 35 +#define R_NIOS2_COPY 36 +#define R_NIOS2_GLOB_DAT 37 +#define R_NIOS2_JUMP_SLOT 38 +#define R_NIOS2_RELATIVE 39 +#define R_NIOS2_GOTOFF 40 +#define R_NIOS2_CALL26_NOAT 41 +#define R_NIOS2_GOT_LO 42 +#define R_NIOS2_GOT_HA 43 +#define R_NIOS2_CALL_LO 44 +#define R_NIOS2_CALL_HA 45 + +#define R_OR1K_NONE 0 +#define R_OR1K_32 1 +#define R_OR1K_16 2 +#define R_OR1K_8 3 +#define R_OR1K_LO_16_IN_INSN 4 +#define R_OR1K_HI_16_IN_INSN 5 +#define R_OR1K_INSN_REL_26 6 +#define R_OR1K_GNU_VTENTRY 7 +#define R_OR1K_GNU_VTINHERIT 8 +#define R_OR1K_32_PCREL 9 +#define R_OR1K_16_PCREL 10 +#define R_OR1K_8_PCREL 11 +#define R_OR1K_GOTPC_HI16 12 +#define R_OR1K_GOTPC_LO16 13 +#define R_OR1K_GOT16 14 +#define R_OR1K_PLT26 15 +#define R_OR1K_GOTOFF_HI16 16 +#define R_OR1K_GOTOFF_LO16 17 +#define R_OR1K_COPY 18 +#define R_OR1K_GLOB_DAT 19 +#define R_OR1K_JMP_SLOT 20 +#define R_OR1K_RELATIVE 21 +#define R_OR1K_TLS_GD_HI16 22 +#define R_OR1K_TLS_GD_LO16 23 +#define R_OR1K_TLS_LDM_HI16 24 +#define R_OR1K_TLS_LDM_LO16 25 +#define R_OR1K_TLS_LDO_HI16 26 +#define R_OR1K_TLS_LDO_LO16 27 +#define R_OR1K_TLS_IE_HI16 28 +#define R_OR1K_TLS_IE_LO16 29 +#define R_OR1K_TLS_LE_HI16 30 +#define R_OR1K_TLS_LE_LO16 31 +#define R_OR1K_TLS_TPOFF 32 +#define R_OR1K_TLS_DTPOFF 33 +#define R_OR1K_TLS_DTPMOD 34 + +#define R_BPF_NONE 0 +#define R_BPF_MAP_FD 1 + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog new file mode 100644 index 0000000..c2577e8 --- /dev/null +++ b/include/elf/ChangeLog @@ -0,0 +1,1892 @@ +2013-10-14 Chao-ying Fu + + * mips.h (enum): Add Tag_GNU_MIPS_ABI_MSA. + (enum): Add Val_GNU_MIPS_ABI_MSA_ANY and Val_GNU_MIPS_ABI_MSA_128. + +2013-09-17 Doug Gilmore + + * mips.h (EF_MIPS_FP64): New e_flags bit. + +2013-08-09 Nick Clifton + + * rl78.c (E_FLAG_RL78_G10): Define. + +2013-07-15 Maciej W. Rozycki + + * mips.h (Tag_GNU_MIPS_ABI_FP): Remove comment. + (Val_GNU_MIPS_ABI_FP_ANY, Val_GNU_MIPS_ABI_FP_DOUBLE, + Val_GNU_MIPS_ABI_FP_SINGLE, Val_GNU_MIPS_ABI_FP_SOFT, + Val_GNU_MIPS_ABI_FP_64): New enum. + +2013-07-12 Maciej W. Rozycki + + * mips.h (EF_MIPS_NAN2008): New macro. + +2013-07-08 Tristan Gingold + + * ia64.h (STB_VMS_WEAK, STB_VMS_SYSTEM): Add. + +2013-07-05 Andreas Krebbel + + * s390.h: Add new relocs R_390_PC12DBL, R_390_PLT12DBL, + R_390_PC24DBL, and R_390_PLT24DBL. + +2013-06-26 Yufeng Zhang + + * aarch64.h: Add ELF32 reloc codes and remove fake ELF64 ones. + +2013-06-24 Maciej W. Rozycki + + * mips.h (ELF_ST_IS_MIPS_PLT): Respect STO_MIPS16 setting. + (ELF_ST_SET_MIPS_PLT): Likewise. + +2013-06-19 Will Newton + + * aarch64.h: Remove R_AARCH64_IRELATIVE. + +2013-06-07 Will Newton + + * aarch64.h: Add R_AARCH64_IRELATIVE reloc. + +2013-06-06 Maciej W. Rozycki + + * mips.h (ELF_ST_SET_MIPS_PIC): Clear any STO_MIPS16 setting. + +2013-05-30 Paul Brook + + * mips.h (R_MIPS_EH): New. + +2013-05-28 Yufeng Zhang + + * aarch64.h (R_AARCH64_TLSDESC_LD64_PREL19): Rename to ... + (R_AARCH64_TLSDESC_LD_PREL19): ... this. + (R_AARCH64_TLSDESC_ADR_PAGE): Rename to ... + (R_AARCH64_TLSDESC_ADR_PAGE21): ... this. + +2013-05-22 H.J. Lu + + * common.h (EM_INTEL205): New. + (EM_INTEL206): Likewise. + (EM_INTEL207): Likewise. + (EM_INTEL208): Likewise. + (EM_INTEL209): Likewise. + +2013-05-02 Nick Clifton + + * msp430.h: Add MSP430X relocs. + Add some more MSP430 machine numbers. + Add values used by .MSP430.attributes section. + +2013-03-21 Michael Schewe + + * h8.h: Add new reloc R_H8_DISP32A16 for relaxation of + mov @(disp:32,ERx) to mov @(disp:16,ERx). + +2013-03-08 Andreas Arnez + + * common.h (NT_S390_TDB): Define. + +2013-02-06 Sandra Loosemore + Andrew Jenner + + Based on patches from Altera Corporation. + + * nios2.h: New file. + +2013-01-24 Nick Clifton + + * v850.h: Add support for e3v5 architecture. + Reorganize processor selection macros. + +2013-01-16 H.J. Lu + + * i386.h (R_386_SIZE32): Fill it. + * x86-64.h (R_X86_64_SIZE32): Likewise. + (R_X86_64_SIZE64): Likewise. + +2013-01-10 Will Newton + + * common.h: Fix case of "Meta". + * metag.h: New file. + +2013-01-08 Yufeng Zhang + + * common.h (NT_ARM_TLS, NT_ARM_HW_BREAK, NT_ARM_HW_WATCH): New macro + definitions. + +2013-01-04 Juergen Urban + + * mips.h: Add MIPS machine variant number for r5900 which is + compatible with old Playstation 2 software. + +2012-11-16 H.J. Lu + + * common.h (DF_1_CONLFAT): Renamed to ... + (DF_1_CONFALT): This. + (DF_1_ENDFILTEE): New. + (DF_1_DISPRELDNE): Likewise. + (DF_1_DISPRELPND): Likewise. + (DF_1_NODIRECT): Likewise. + (DF_1_IGNMULDEF): Likewise. + (DF_1_NOKSYMS): Likewise. + (DF_1_NOHDR): Likewise. + (DF_1_EDITED): Likewise. + (DF_1_NORELOC): Likewise. + (DF_1_SYMINTPOSE): Likewise. + (DF_1_GLOBAUDIT): Likewise. + (DF_1_SINGLETON): Likewise. + +2012-11-09 Nick Clifton + + * rx.h (EF_RX_CPU_RX): Add comment. + (E_FLAG_RX_ABI): Define. + + * v850.h: Add RH850 ABI values. + +2012-11-08 Maciej W. Rozycki + + * mips.h (EF_MIPS_32BITMODE): Move next to lower-order bits. + +2012-11-01 Tom Tromey + + * common.h (NT_386_TLS, NT_386_IOPERM): New defines. + +2012-10-30 Steve McIntyre + + * elf/arm.h (EF_ARM_ABI_FLOAT_SOFT): New define. + (EF_ARM_ABI_FLOAT_HARD): Likewise. + +2012-10-23 Tom Tromey + + * common.h (NT_SIGINFO, NT_FILE): New defines. + +2012-08-27 Walter Lee + + * tilegx.h (R_TILEGX_IMM16_X0_HW0_PLT_PCREL): New relocation. + (R_TILEGX_IMM16_X1_HW0_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X0_HW1_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X1_HW1_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X0_HW2_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X1_HW2_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X0_HW3_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X1_HW3_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL): Ditto. + (R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL ): Ditto. + (R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL): Ditto. + +2012-08-13 Ian Bolton + Laurent Desnogues + Jim MacArthur + Marcus Shawcroft + Nigel Stephens + Ramana Radhakrishnan + Richard Earnshaw + Sofiane Naci + Tejas Belagod + Yufeng Zhang + + * aarch64.h: New file. + * common.h (EM_res183): Rename to EM_AARCH64. + (EM_res184): Rename to EM_ARM184. + +2012-06-28 Iain Sandoe + + * common.h (AT_L1I_CACHESHAPE, AT_L1D_CACHESHAPE, + AT_L2_CACHESHAPE, AT_L3_CACHESHAPE): New defines. + +2012-05-16 Georg-Johann Lay + + PR target/13503 + * avr.h (RELOC_NUMBERS): Rename R_AVR_8_HHI8 to R_AVR_8_HLO8. + +2012-05-15 James Murray + + * m68hc11.h (R_M68HC12_16B, R_M68HC12_PCREL_9, R_M68HC12_PCREL_10) + R_M68HC12_HI8XG, R_M68HC12_LO8XG): New relocations. + (E_M68HC11_XGATE_RAMOFFSET): Define. + +2012-05-14 James Lemke + * ppc.h (SEC_PPC_VLE): Remove. + +2012-05-14 Catherine Moore + James Lemke + + * ppc.h (R_PPC_VLE_REL8): New reloction. + (R_PPC_VLE_REL15): Likewise. + (R_PPC_VLE_REL24): Likewise. + (R_PPC_VLE_LO16A): Likewise. + (R_PPC_VLE_LO16D): Likewise. + (R_PPC_VLE_HI16A): Likewise. + (R_PPC_VLE_HI16D): Likewise. + (R_PPC_VLE_HA16A): Likewise. + (R_PPC_VLE_HA16D): Likewise. + (R_PPC_VLE_SDA21): Likewise. + (R_PPC_VLE_SDA21_LO): Likewise. + (R_PPC_VLE_SDAREL_LO16A): Likewise. + (R_PPC_VLE_SDAREL_LO16D): Likewise. + (R_PPC_VLE_SDAREL_HI16A): Likewise. + (R_PPC_VLE_SDAREL_HI16D): Likewise. + (R_PPC_VLE_SDAREL_HA16A): Likewise. + (R_PPC_VLE_SDAREL_HA16D): Likewise. + (SEC_PPC_VLE): Remove. + (PF_PPC_VLE): New program header flag. + (SHF_PPC_VLE): New section header flag. + (vle_opcodes, vle_num_opcodes): New. + (VLE_OP): New macro. + (VLE_OP_TO_SEG): New macro. + +2012-05-11 Georg-Johann Lay + + * xgate.h: Mininal file to support XGATE relocations. + +2012-04-27 David S. Miller + + * sparc.h: Add new ELF_SPARC_HWCAP_* defines for crypto, + pause, and compare-and-branch instructions. + +2012-03-07 Nick Clifton + + * mn10300.h (elf_mn10300_reloc_type): Add R_MN10300_TLS_GD, + R_MN10300_TLS_LD, R_MN10300_TLS_LDO, R_MN10300_TLS_GOTIE, + R_MN10300_TLS_IE, R_MN10300_TLS_LE, R_MN10300_TLS_DPTMOD, + R_MN10300_TLS_DTPOFF and R_MN10300_TLS_TPOFF. + +2012-02-25 Walter Lee + + * tilegx.h (R_TILEGX_IMM16_X0_HW1_GOT): Delete. + (R_TILEGX_IMM16_X1_HW1_GOT): Ditto. + (R_TILEGX_IMM16_X0_HW2_GOT): Ditto. + (R_TILEGX_IMM16_X1_HW2_GOT): Ditto. + (R_TILEGX_IMM16_X0_HW3_GOT): Ditto. + (R_TILEGX_IMM16_X1_HW3_GOT): Ditto. + (R_TILEGX_IMM16_X0_HW2_LAST_GOT): Ditto. + (R_TILEGX_IMM16_X1_HW2_LAST_GOT): Ditto. + (R_TILEGX_IMM16_X0_HW1_TLS_GD): Ditto. + (R_TILEGX_IMM16_X1_HW1_TLS_GD): Ditto. + (R_TILEGX_IMM16_X0_HW2_TLS_GD): Ditto. + (R_TILEGX_IMM16_X1_HW2_TLS_GD): Ditto. + (R_TILEGX_IMM16_X0_HW3_TLS_GD): Ditto. + (R_TILEGX_IMM16_X1_HW3_TLS_GD): Ditto. + (R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD): Ditto. + (R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD): Ditto. + (R_TILEGX_IMM16_X0_HW1_TLS_IE): Ditto. + (R_TILEGX_IMM16_X1_HW1_TLS_IE): Ditto. + (R_TILEGX_IMM16_X0_HW2_TLS_IE): Ditto. + (R_TILEGX_IMM16_X1_HW2_TLS_IE): Ditto. + (R_TILEGX_IMM16_X0_HW3_TLS_IE): Ditto. + (R_TILEGX_IMM16_X1_HW3_TLS_IE): Ditto. + (R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE): Ditto. + (R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE): Ditto. + (R_TILEGX_IMM16_X0_HW0_TLS_LE): New relocation. + (R_TILEGX_IMM16_X1_HW0_TLS_LE): Ditto. + (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE): Ditto. + (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE): Ditto. + (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE): Ditto. + (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE): Ditto. + (R_TILEGX_TLS_GD_CALL): Ditto. + (R_TILEGX_IMM8_X0_TLS_GD_ADD): Ditto. + (R_TILEGX_IMM8_X1_TLS_GD_ADD): Ditto. + (R_TILEGX_IMM8_Y0_TLS_GD_ADD): Ditto. + (R_TILEGX_IMM8_Y1_TLS_GD_ADD): Ditto. + (R_TILEGX_TLS_IE_LOAD): Ditto. + (R_TILEGX_IMM8_X0_TLS_ADD): Ditto. + (R_TILEGX_IMM8_X1_TLS_ADD): Ditto. + (R_TILEGX_IMM8_Y0_TLS_ADD): Ditto. + (R_TILEGX_IMM8_Y1_TLS_ADD): Ditto. + * tilepro.h (R_TILEPRO_TLS_GD_CALL): New relocation. + (R_TILEPRO_IMM8_X0_TLS_GD_ADD): Ditto. + (R_TILEPRO_IMM8_X1_TLS_GD_ADD): Ditto. + (R_TILEPRO_IMM8_Y0_TLS_GD_ADD): Ditto. + (R_TILEPRO_IMM8_Y1_TLS_GD_ADD): Ditto. + (R_TILEPRO_TLS_IE_LOAD): Ditto. + (R_TILEPRO_IMM16_X0_TLS_LE): Ditto. + (R_TILEPRO_IMM16_X1_TLS_LE): Ditto. + (R_TILEPRO_IMM16_X0_TLS_LE_LO): Ditto. + (R_TILEPRO_IMM16_X1_TLS_LE_LO): Ditto. + (R_TILEPRO_IMM16_X0_TLS_LE_HI): Ditto. + (R_TILEPRO_IMM16_X1_TLS_LE_HI): Ditto. + (R_TILEPRO_IMM16_X0_TLS_LE_HA): Ditto. + (R_TILEPRO_IMM16_X1_TLS_LE_HA): Ditto. + +2011-12-22 DJ Delorie + + * rl78.h (R_RL78_RH_RELAX, R_RL78_RH_SFR, R_RL78_RH_SADDR): New. + (RL78_RELAXA_BRA, RL78_RELAXA_ADDR16: New. + +2011-12-19 Chung-Lin Tang + + * mips.h (elf_mips_reloc_type): Add R_MIPS16_TLS_* entries. + +2011-12-06 Ulrich Weigand + + * common.h (NT_S390_LAST_BREAK): Define. + (NT_S390_SYSTEM_CALL): Likewise. + +2011-11-01 DJ Delorie + + * common.h (EM_RL78, EM_78K0R): New. + * rl78.h: New. + +2011-10-25 Joern Rennecke + + * epiphany.h: New file. + * common.h (EM_ADAPTEVA_EPIPHANY): Define. + +2011-10-10 Alan Modra + + * ppc64.h (R_PPC64_TOCSAVE): Add. + +2011-10-05 DJ Delorie + + * rx.h (E_FLAG_RX_PID): New. + +2011-09-21 David S. Miller + + * sparc.h (Tag_GNU_Sparc_HWCAPS): New object attribute. + (ELF_SPARC_HWCAP_*): New HWCAPS bitmask values. + +2011-08-12 H.J. Lu + + PR ld/13082 + * x86-64.h (R_X86_64_RELATIVE64): New. + +2011-07-24 Chao-ying Fu + Maciej W. Rozycki + + * mips.h (R_MICROMIPS_min): New relocations. + (R_MICROMIPS_26_S1): Likewise. + (R_MICROMIPS_HI16, R_MICROMIPS_LO16): Likewise. + (R_MICROMIPS_GPREL16, R_MICROMIPS_LITERAL): Likewise. + (R_MICROMIPS_GOT16, R_MICROMIPS_PC7_S1): Likewise. + (R_MICROMIPS_PC10_S1, R_MICROMIPS_PC16_S1): Likewise. + (R_MICROMIPS_CALL16, R_MICROMIPS_GOT_DISP): Likewise. + (R_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_OFST): Likewise. + (R_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_LO16): Likewise. + (R_MICROMIPS_SUB, R_MICROMIPS_HIGHER): Likewise. + (R_MICROMIPS_HIGHEST, R_MICROMIPS_CALL_HI16): Likewise. + (R_MICROMIPS_CALL_LO16, R_MICROMIPS_SCN_DISP): Likewise. + (R_MICROMIPS_JALR, R_MICROMIPS_HI0_LO16): Likewise. + (R_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_LDM): Likewise. + (R_MICROMIPS_TLS_DTPREL_HI, R_MICROMIPS_TLS_DTPREL_LO): Likewise. + (R_MICROMIPS_TLS_GOTTPREL): Likewise. + (R_MICROMIPS_TLS_TPREL_HI16): Likewise. + (R_MICROMIPS_TLS_TPREL_LO16): Likewise. + (R_MICROMIPS_GPREL7_S2, R_MICROMIPS_PC23_S2): Likewise. + (R_MICROMIPS_max): Likewise. + (EF_MIPS_ARCH_ASE_MICROMIPS): New macro. + (STO_MIPS_ISA, STO_MIPS_FLAGS): Likewise. + (ELF_ST_IS_MIPS_PLT, ELF_ST_SET_MIPS_PLT): Likewise. + (STO_MICROMIPS): Likewise. + (ELF_ST_IS_MICROMIPS, ELF_ST_SET_MICROMIPS): Likewise. + (ELF_ST_IS_COMPRESSED): Likewise. + (STO_MIPS_PLT, STO_MIPS_PIC): Rework. + (ELF_ST_IS_MIPS_PIC, ELF_ST_SET_MIPS_PIC): Likewise. + (STO_MIPS16, ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): Likewise. + +2011-07-22 H.J. Lu + + * common.h (EM_K1OM): New. + +2011-07-03 Samuel Thibault + Thomas Schwinge + + PR binutils/12913 + * common.h (ELFOSABI_GNU): Define, replaces... + (ELFOSABI_LINUX): ... this, kept as an alias. + (ELFOSABI_HURD): Remove. + +2011-06-15 Ulrich Weigand + + * common.h (NT_ARM_VFP): Define. + +2011-06-13 Walter Lee + + * common.h: Add EM_TILEGX. + * tilegx.h: New file. + * tilepro.h: New file. + +2011-06-09 Tristan Gingold + + * ia64.h (Elf64_External_VMS_ORIG_DYN_Note): New struct. + +2011-06-02 Nick Clifton + + * common.h: Fix spelling mistake in comment. + * reloc-macros.h: Likewise. + +2011-05-31 Paul Brook + + * arm.h (arm_st_branch_type): Add ST_BRANCH_UNKNOWN. + +2011-05-09 Paul Brook + + * tic6x.h (ELF_STRING_C6000_unwind, + ELF_STRING_C6000_unwind_info, ELF_STRING_C6000_unwind_once, + ELF_STRING_C6000_unwind_info_once): Define. + +2011-04-15 Sergio Durigan Junior + + * common.h (NT_STAPSDT): New define. + +2011-03-31 Bernd Schmidt + + * tic6x.h (R_C6000_JUMP_SPLOT, R_C6000_EHTYPE, + R_C6000_PCR_H16, R_C6000_PCR_L16): New relocs. + (SHN_TIC6X_SCOMMON): Define. + +2011-03-31 Tristan Gingold + + * ia64.h (Elf64_External_VMS_Note): New struct. + (NT_VMS_MHD, NT_VMS_LNM, NT_VMS_SRC, NT_VMS_TITLE, NT_VMS_EIDC) + (NT_VMS_FPMODE, NT_VMS_LINKTIME, NT_VMS_IMGNAM, NT_VMS_IMGID) + (NT_VMS_LINKID, NT_VMS_IMGBID, NT_VMS_GSTNAM, NT_VMS_ORIG_DYN) + (NT_VMS_PATCHTIME) New macros. + +2011-03-14 Richard Sandiford + + * arm.h (R_ARM_IRELATIVE): New relocation. + +2011-03-14 Richard Sandiford + + * internal.h (elf_internal_sym): Add st_target_internal. + * arm.h (arm_st_branch_type): New enum. + (ARM_SYM_BRANCH_TYPE): New macro. + +2011-03-10 Nick Clifton + + * common.h (EM_V850): V850s now supplied by Renesas. + +2011-02-25 Alan Modra + + PR 12516 + * internal.h (ELF_SECTION_IN_SEGMENT_1): Don't match zero size + sections at start or end of PT_DYNAMIC. + +2011-01-10 Nathan Sidwell + Glauber de Oliveira Costa + + * arm.h (R_ARM_TLS_DESC, R_ARM_TLS_GOTDESC, R_ARM_TLS_CALL, + R_ARM_TLS_DESCSEQ, T_ARM_THM_TLS_CALL, R_ARM_THM_TLS_DESCSEQ): New + relocations. + +2010-11-16 Jie Zhang + + * bfin.h (EF_BFIN_CODE_IN_L1): Define. + (EF_BFIN_DATA_IN_L1): Define. + +2010-11-11 Mingming Sun + + * mips.h (E_MIPS_MACH_LS3A): Defined. + +2010-11-02 Joseph Myers + + * tic6x-attrs.h (Tag_ABI_wchar_t, Tag_ABI_stack_align_needed, + Tag_ABI_stack_align_preserved, Tag_ABI_PID, Tag_ABI_PIC, + Tag_ABI_array_object_alignment, + Tag_ABI_array_object_align_expected, Tag_ABI_conformance): Define. + +2010-10-29 Joseph Myers + + * tic6x-attrs.h (Tag_ABI_compatibility): Define. + +2010-10-29 Bernd Schmidt + Joseph Myers + + * tic6x-attrs.h (Tag_ABI_DSBT): New. + +2010-10-21 Joseph Myers + + * tic6x-attrs.h (Tag_C6XABI_Tag_CPU_arch): Change to Tag_ISA, + value 4. + * tic6x.h (Values for Tag_C6XABI_Tag_CPU_arch): Rename for + attribute renaming. + +2010-07-23 Naveen.H.S + Ina Pandit + + * v850.h: Add support for V850E2 and V850E2V3. + (v850_reloc_type): Update the newly added relocations + +2010-07-20 Alan Modra + + * internal.h (ELF_TBSS_SPECIAL): New macro, extracted from.. + (ELF_SECTION_SIZE): ..here. + (ELF_SECTION_IN_SEGMENT_1): Add "strict" arg. + (ELF_SECTION_IN_SEGMENT_STRICT): New macro. + +2010-06-25 Alan Modra + + * ppc64.h (R_PPC64_LO_DS_OPT): Define. + +2010-06-15 Joseph Myers + + * tic6x-attrs.h: New. + * tic6x.h: Include elf/tic6x-attrs.h for attribute table. + (C6XABI_Tag_CPU_arch_none, C6XABI_Tag_CPU_arch_C62X, + C6XABI_Tag_CPU_arch_C67X, C6XABI_Tag_CPU_arch_C67XP, + C6XABI_Tag_CPU_arch_C64X, C6XABI_Tag_CPU_arch_C64XP, + C6XABI_Tag_CPU_arch_C674X): Define. + +2010-06-11 Tristan Gingold + + * ia64.h (EF_IA_64_VMS_COMCOD, EF_IA_64_VMS_COMCOD_SUCCESS) + (EF_IA_64_VMS_COMCOD_WARNING, EF_IA_64_VMS_COMCOD_ERROR) + (EF_IA_64_VMS_COMCOD_ABORT, EF_IA_64_VMS_LINKAGES): Define. + (VMS_LF_CALL_DEBUG, VMS_LF_NOP0BUFS, VMS_LF_P0IMAGE) + (VMS_LF_MKTHREADS, VMS_LF_UPCALLS, VMS_LF_IMGSTA) + (VMS_LF_INITIALIZE, VMS_LF_MAIN, VMS_LF_EXE_INIT) + (VMS_LF_TBK_IN_IMG, VMS_LF_DBG_IN_IMG, VMS_LF_TBK_IN_DSF) + (VMS_LF_DBG_IN_DSF, VMS_LF_SIGNATURES, VMS_LF_REL_SEG_OFF): Define. + (VMS_STO_VISIBILITY, VMS_ST_VISIBILITY, VMS_STO_FUNC_TYPE) + (VMS_ST_FUNC_TYPE, VMS_SFT_CODE_ADDR, VMS_SFT_SYMV_IDX) + (VMS_SFT_FD, VMS_SFT_RESERVE, VMS_STO_LINKAGE, VMS_ST_LINKAGE) + (VMS_STL_IGNORE, VMS_STL_RESERVE, VMS_STL_STD, VMS_STL_LNK): Define. + (Elf64_External_VMS_IMAGE_FIXUP): New declaration. + (Elf64_External_VMS_IMAGE_RELA): Ditto. + (R_IA64_VMS_DIR8, R_IA64_VMS_DIR16LSB, R_IA64_VMS_CALL_SIGNATURE) + (R_IA64_VMS_EXECLET_FUNC, R_IA64_VMS_EXECLET_DATA, R_IA64_VMS_FIX8) + (R_IA64_VMS_FIX16, R_IA64_VMS_FIX32, R_IA64_VMS_FIX64) + (R_IA64_VMS_FIXFD, R_IA64_VMS_ACC_LOAD, R_IA64_VMS_ACC_ADD) + (R_IA64_VMS_ACC_SUB, R_IA64_VMS_ACC_MUL, R_IA64_VMS_ACC_DIV) + (R_IA64_VMS_ACC_AND, R_IA64_VMS_ACC_IOR, R_IA64_VMS_ACC_EOR) + (R_IA64_VMS_ACC_ASH, R_IA64_VMS_ACC_STO8, R_IA64_VMS_ACC_STO16LSH) + (R_IA64_VMS_ACC_STO32LSH, R_IA64_VMS_ACC_STO64LSH): New. + +2010-05-25 Daniel Jacobowitz + Joseph Myers + Andrew Stubbs + + * sh.h (EF_SH_PIC, EF_SH_FDPIC): Define. + (R_SH_FIRST_INVALID_RELOC_6, R_SH_LAST_INVALID_RELOC_6): New. Adjust + other invalid ranges. + (R_SH_GOT20, R_SH_GOTOFF20, R_SH_GOTFUNCDESC, R_SH_GOTFUNCDESC20) + (R_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC20, R_SH_FUNCDESC) + (R_SH_FUNCDESC_VALUE): New. + +2010-05-18 H.J. Lu + + PR gas/11600 + * common.h (SHF_EXCLUDE): New. + + * i370.h (SHF_EXCLUDE): Removed. + * or32.h (SHF_EXCLUDE): Likewise. + * ppc.h (SHF_EXCLUDE): Likewise. + * sparc.h (SHF_EXCLUDE): Likewise. + +2010-04-23 Alan Modra + + * internal.h (ELF_SECTION_SIZE): Protect macro args with parentheses. + Invert logic to clarify test for .tbss. + (ELF_IS_SECTION_IN_SEGMENT): Rename to.. + (ELF_SECTION_IN_SEGMENT_1): ..this. Add check_vma param. Protect + macro args with parentheses. + (ELF_SECTION_IN_SEGMENT): Define. + (ELF_IS_SECTION_IN_SEGMENT_FILE): Delete. + (ELF_IS_SECTION_IN_SEGMENT_MEMORY): Delete. + +2010-04-15 Matthew Gretton-Dann + + * arm.h (Tag_FP_arch, Tag_ABI_align_needed, Tag_ABI_align_preserved, + Tag_FP_HP_extension): Add new ABI attribute tags. + +2010-04-15 Nick Clifton + + * alpha.h: Update copyright notice to use GPLv3. + * arc.h: Likewise. + * arm.h: Likewise. + * avr.h: Likewise. + * bfin.h: Likewise. + * common.h: Likewise. + * cr16.h: Likewise. + * cr16c.h: Likewise. + * cris.h: Likewise. + * crx.h: Likewise. + * d10v.h: Likewise. + * d30v.h: Likewise. + * dlx.h: Likewise. + * dwarf.h: Likewise. + * external.h: Likewise. + * fr30.h: Likewise. + * frv.h: Likewise. + * h8.h: Likewise. + * hppa.h: Likewise. + * i370.h: Likewise. + * i386.h: Likewise. + * i860.h: Likewise. + * i960.h: Likewise. + * ia64.h: Likewise. + * internal.h: Likewise. + * ip2k.h: Likewise. + * iq2000.h: Likewise. + * lm32.h: Likewise. + * m32c.h: Likewise. + * m32r.h: Likewise. + * m68hc11.h: Likewise. + * m68k.h: Likewise. + * mcore.h: Likewise. + * mep.h: Likewise. + * microblaze.h: Likewise. + * mips.h: Likewise. + * mmix.h: Likewise. + * mn10200.h: Likewise. + * moxie.h: Likewise. + * msp430.h: Likewise. + * mt.h: Likewise. + * openrisc.h: Likewise. + * or32.h: Likewise. + * pj.h: Likewise. + * ppc.h: Likewise. + * ppc64.h: Likewise. + * reloc-macros.h: Likewise. + * rx.h: Likewise. + * s390.h: Likewise. + * sh.h: Likewise. + * sparc.h: Likewise. + * spu.h: Likewise. + * v850.h: Likewise. + * vax.h: Likewise. + * vxworks.h: Likewise. + * x86-64.h: Likewise. + * xc16x.h: Likewise. + * xstormy16.h: Likewise. + * xtensa.h: Likewise. + +2010-04-08 David Stubbs + + * internal.h (ELF_IS_SECTION_IN_SEGMENT): PT_PHDR program headers + cannot contain any sections. + +2010-03-25 Joseph Myers + + * common.h (ELFOSABI_C6000_ELFABI, ELFOSABI_C6000_LINUX): Define. + * tic6x.h: New. + +2010-03-05 Rainer Orth + + * common.h (VER_FLG_*): Document. + (VER_FLG_INFO): Define. + +2010-02-23 Andrew Zabolotny + + PR binutils/11297 + * avr.h: (R_AVR_8): New relocation number. + +2010-02-18 Matthew Gretton-Dann + + * arm.h (Tag_MPextension_use): Renumber. + (Tag_DIV_use): Add. + (Tag_MPextension_use_legacy): Likewise. + +2010-02-09 Michael Holzheu + + * common.h (NT_S390_TIMER, NT_S390_TODCMP, NT_S390_TODPREG, + NT_S390_CTRS and NT_S390_PREFIX): Define. + +2010-02-08 David S. Miller + + * sparc.h (R_SPARC_JMP_IREL, R_SPARC_IRELATIVE): Define. + +2010-02-02 H.J. Lu + + * common.h (NT_386_XSTATE): New. + +2010-01-21 Andreas Krebbel + + * s390.h (EF_S390_HIGH_GPRS): Added macro definition. + +2010-01-19 Daisuke Hatayama + + * common.h (PN_XNUM): Define. + +2009-12-18 Ulrich Weigand + + * common.h (NT_S390_HIGH_GPRS): Define. + +2009-12-17 Alan Modra + + * ppc.h (R_PPC_RELAX32, R_PPC_RELAX32PC, R_PPC_RELAX32_PLT, + R_PPC_RELAX32PC_PLT): Delete. + (R_PPC_RELAX, R_PPC_RELAX_PLT, R_PPC_RELAX_PLTREL24): Define. + +2009-12-03 David Daney + Adam Nemet + + * mips.h (E_MIPS_MACH_OCTEON2): New machine flag. + +2009-11-28 Joseph Myers + + * common.h (ELFOSABI_FENIXOS, EM_TI_C6000, EM_TI_C2000, + EM_TI_C5500, EM_CUDA): Define. + (EM_res140, EM_res141, EM_res142): Remove. + +2009-11-17 Paul Brook + Daniel Jacobowitz + + * arm.h (TAG_CPU_ARCH_V7E_M): Define. + +2009-09-29 DJ Delorie + + * rx.h: New file. + +2009-09-21 Alan Modra + + * ppc.h (DT_PPC_TLSOPT): Define. + * ppc64.h (DT_PPC64_TLSOPT): Define. + +2009-08-10 Daniel Gutson + + * arm.h: (SHT_ARM_DEBUGOVERLAY): New define. + (SHT_ARM_OVERLAYSECTION): New define. + +2006-08-09 Bernd Schmidt + + From Mike Frysinger + * bfin.h (R_BFIN_UNUSED, R_BFIN_PCREL5M2, R_BFIN_UNUSED1, + R_BFIN_PCREL10, R_BFIN_PCREL12_JUMP, R_BFIN_RIMM16, + R_BFIN_LUIMM16, R_BFIN_HUIMM16, R_BFIN_PCREL12_JUMP_S, + R_BFIN_PCREL24_JUMP_X, R_BFIN_PCREL24, R_BFIN_UNUSEDB, + R_BFIN_UNUSEDC, R_BFIN_PCREL24_JUMP_L, R_BFIN_PCREL24_CALL_X, + R_BFIN_VAR_EQ_SYMB, R_BFIN_BYTE_DATA, R_BFIN_BYTE2_DATA, + R_BFIN_BYTE4_DATA, R_BFIN_PCREL11, R_BFIN_PUSH, R_BFIN_CONST, + R_BFIN_ADD, R_BFIN_SUB, R_BFIN_MULT, R_BFIN_DIV, R_BFIN_MOD, + R_BFIN_LSHIFT, R_BFIN_RSHIFT, R_BFIN_AND, R_BFIN_OR, R_BFIN_XOR, + R_BFIN_LAND, R_BFIN_LOR, R_BFIN_LEN, R_BFIN_NEG, R_BFIN_COMP, + R_BFIN_PAGE, R_BFIN_HWPAGE, R_BFIN_ADDR, R_BFIN_PLTPLC, + R_BFIN_GOT, R_BFIN_MAX): Renamed from R_unused0, R_pcrel5ms, + R_unused1, R_pcrel10, R_pcrel12_jump, R_rimm16, R_luimm16, + R_huimm16, R_pcrel12_jump_s, R_pcrel24_jump_x, R_pcrel24, + R_unusedb, R_unusedc, R_pcrel24_jump_l, R_pcrel24_call_x, + R_var_eq_symb, R_byte_data, R_byte2_data, R_byte4_data, R_pcrel11, + R_push, R_const, R_add, R_sub, R_mult, R_div, R_mod, R_lshift, + R_rshift, R_and, R_or, R_xor, R_land, R_lor, R_len, R_neg, R_comp, + R_page, R_hwpage, R_addr, R_pltpc, R_got. + +2009-08-09 Michael Eager + + * elf/common.h: Define EM_resnnn reserved values. Add EM_AVR32, + EM_STM8, EM_TILE64, EM_TILEPRO. Change EM_MICROBLAZE. + +2009-08-06 Michael Eager + + * elf/common.h: Define EM_MICROBLAZE & EM_MICROBLAZE_OLD. + * elf/microblaze.h: New reloc definitions. + +2009-07-30 Alan Modra + + * ppc64.h: Add R_PPC64_JMP_IREL, R_PPC64_REL16, R_PPC64_REL16_LO, + R_PPC64_REL16_HI, R_PPC64_REL16_HA. + +2009-07-25 H.J. Lu + + * common.h (EM_L1OM): New. + +2009-07-24 Trevor Smigiel + Alan Modra + + * spu.h (R_SPU_ADD_PIC): New. + +2009-07-23 Ulrich Drepper + + * common.h (STB_GNU_UNIQUE): Define. + +2009-07-10 Tom Tromey + + * dwarf2.h: Move to `..'. + +2009-07-10 H.J. Lu + + * dwarf2.h: Just include ../dwarf2.h. + +2009-07-10 Alan Modra + + * ppc.h (R_PPC_IRELATIVE): Add. + (R_PPC_RELAX32, R_PPC_RELAX32PC, + R_PPC_RELAX32_PLT, R_PPC_RELAX32PC_PLT): Renumber. + * ppc64.h (R_PPC64_IRELATIVE): Add. + +2009-07-03 Jakub Jelinek + + * dwarf2.h (enum dwarf_location_atom): Add DW_OP_implicit_value + and DW_OP_stack_value. + +2009-06-22 Alan Modra + + * ppc.h (R_PPC_RELAX*): Define as enum. + +2009-06-11 Anthony Green + + * moxie.h (R_MOXIE_PCREL10): New. + +2009-06-01 H.J. Lu + + PR ld/10205 + * i386.h (R_386_IRELATIVE): New. + * x86-64.h (R_X86_64_IRELATIVE): Likewise. + +2009-05-27 H.J. Lu + + * common.h: Update comments for dynamic tag ranges. + +2009-04-30 DJ Delorie + + * mep.h (EF_MEP_COP_*): New. + (EF_MEP_ALL_FLAGS): Add them. + +2009-04-30 Nick Clifton + + * common.h (STT_GNU_IFUNC): Define. + +2009-04-24 Cary Coutant + + * dwarf2.h (DW_LNE_set_discriminator): New enum value. + +2009-04-15 Anthony Green + + * common.h (EM_MOXIE): Define. + * moxie.h: New file. + +2009-04-07 DJ Delorie + + * mep.h (EF_MEP_CPU_C5): New. + +2009-04-01 H.J. Lu + + * common.h (EM_INTEL178): Removed. + (EM_INTEL179): Likewise. + (EM_ETPU): New. + (EM_SLE9X): Likewise. + (EM_INTEL181): Likewise. + (EM_INTEL182): Likewise. + +2009-03-31 H.J. Lu + + * common.h (EM_INTEL178): New. + (EM_INTEL179): Likewise. + (EM_INTEL180): Likewise. + +2009-03-20 Mikolaj Zalewski + + * common.h (SHT_GNU_INCREMENTAL_INPUTS): Define. + +2009-03-14 Mark Kettenis + + * common.h (NT_OPENBSD_PROCINFO, NT_OPENBSD_AUXV) + (NT_OPENBSD_REGS, NT_OPENBSD_FPREGS, NT_OPENBSD_XFPREGS) + (NT_OPENBSD_WCOOKIE): New defines. + +2009-03-16 Jan Kratochvil + + * common.h (AT_RANDOM): Define. + +2009-03-04 Alan Modra + + * ppc.h (R_PPC_TLSGD, R_PPC_TLSLD): Add new relocs. + * ppc64.h (R_PPC64_TLSGD, R_PPC64_TLSLD): Add new relocs. + +2009-03-02 Qinwei + + * score.h (RELOC_NUMBER): Add R_SCORE_IMM32. + * common.h (EM_SCORE_OLD): Define. + +2009-02-23 H.J. Lu + + * common.h (STB_LOPROC): Replace Application-specific with + Processor-specific in comments. + (STB_HIPROC): Likewise. + (STT_LOPROC): Likewise. + (STT_HIPROC): Likewise. + +2009-02-03 Sandip Matte + + * mips.h (E_MIPS_MACH_XLR): Define. + +2009-02-03 Maxim Kuvyrkov + + * m68k.h: Map TLS relocations to numbers. + +2009-01-15 Andrew Stubbs + Julian Brown + + * arm.h (TAG_CPU_ARCH_V6_M, TAG_CPU_ARCH_V6S_M): New defines. + (MAX_TAG_CPU_ARCH, TAG_CPU_ARCH_V4T_PLUS_V6_M): New defines. + (Tag_NEON_arch): Rename to Tag_Advanced_SIMD_arch to match ARM ABI + version 2.07. + (Tag_undefined39, Tag_nodefaults): New enum values. + (Tag_also_compatible_with, Tag_T2EE_use): Likewise. + (Tag_conformance, Tag_Virtualization_use): Likewise. + (Tag_undefined69, Tag_MPextension_use): Likewise. + +2009-01-15 Douglas B Rupp + + * ia64.h (SHT_IA_64_VMS_DISPLAY_NAME_INFO, EF_IA_64_ARCHVER_1): + New macros. Minor reformatting. + +2008-12-23 Jon Beniston + + * lm32.h: New file. + +2008-12-23 Nick Clifton + + * commmon.h (STT_IFUNC): Delete. + +2008-12-20 Hans-Peter Nilsson + + * cris.h (R_CRIS_32_IE): New relocation. + +2008-12-03 Nick Clifton + + * common.h (STT_IFUNC): Define. + +2008-11-27 M R Swami Reddy + + * cr16.h (R_CR16_GOT_REGREL20, R_CR16_GOTC_REGREL20 and + R_CR16_GLOB_DAT): New relocations. + +2008-11-25 Hans-Peter Nilsson + + * cris.h (R_CRIS_32_TPREL): Correct comment. + (R_CRIS_DTPMOD): Open up for use elsewhere than the fourth GOT entry. + +2008-11-18 Catherine Moore + + * arm.h (Tag_ABI_FP_16bit_format): Define. + +2008-11-14 Nathan Sidwell + + * internal.h (struct elf_segment_map): Add header_size field. + +2008-10-13 Ulrich Weigand + + * common.h (AT_BASE_PLATFORM, AT_EXECFN): Define. + +2008-10-10 Nathan Froyd + + * ppc.h: Add Tag_GNU_Power_ABI_Struct_Return. + +2008-10-04 Hans-Peter Nilsson + + * cris.h (R_CRIS_32_GOT_GD, R_CRIS_16_GOT_GD, R_CRIS_32_GD) + (R_CRIS_DTP, R_CRIS_32_DTPREL, R_CRIS_16_DTPREL, R_CRIS_DTPMOD) + (R_CRIS_32_GOT_TPREL, R_CRIS_16_GOT_TPREL, R_CRIS_32_TPREL) + (R_CRIS_16_TPREL): New relocations. + +2008-08-20 Bob Wilson + + * xtensa.h (R_XTENSA_TLSDESC_FN, R_XTENSA_TLSDESC_ARG) + (R_XTENSA_TLS_DTPOFF, R_XTENSA_TLS_TPOFF, R_XTENSA_TLS_FUNC) + (R_XTENSA_TLS_ARG, R_XTENSA_TLS_CALL): New. + +2008-08-08 Richard Sandiford + Daniel Jacobowitz + Catherine Moore + Mark Shinwell + + * mips.h (STO_MIPS_PLT, ELF_ST_IS_MIPS_PLT, ELF_ST_SET_MIPS_PLT) + (STO_MIPS_PIC, DT_MIPS_PLTGOT, DT_MIPS_RWPLT): New macros. + +2008-08-04 Markus Weiss + + * common.h (ELFOSABI_AROS): Update comment. + +2008-07-26 Michael Eager + + * ppc.h: Add description of single-precision. + +2008-07-21 Luis Machado + + * common.h: Define NT_PPC_VSX. + +2008-07-10 Richard Sandiford + + * mips.h (ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): New macros. + +2008-06-18 M R Swami Reddy + + * common.h (EM_CR16): Correct value. + (EM_CR16): Rename to EM_CR16_OLD. + +2008-06-12 DJ Delorie + + * common.h (EM_M32C_NEW): Rename to EM_M32C. + (EM_M32C): Rename to EM_M32C_OLD. + +2008-06-12 Joseph Myers + + * common.h: Update e_machine table. + +2008-06-09 Takashi Yoshii + + * sh.h (EF_SH_BFD_TABLE): Set bfd_mach_sh for EF_SH_UNKNOWN. + +2008-06-09 Joseph Myers + + * common.h: Change registry@caldera.com to registry@sco.com. + +2008-05-21 Nick Clifton + + * reloc-macros.h: Add a comment about the use of the + END_RELOC_NUMBERS symbol as a sentinel value. + +2008-05-15 Christophe Lyon + + * arm.h (END_RELOC_NUMBERS): Provide a maximum value. + +2008-04-16 David S. Miller + + * elf/sparc.h (R_SPARC_GOTDATA_HIX22, + R_SPARC_GOTDATA_LOX10, R_SPARC_GOTDATA_OP_HIX22, + R_SPARC_GOTDATA_OP_LOX10, R_SPARC_GOTDATA_OP, + R_SPARC_H34, R_SPARC_SIZE32, R_SPARC_SIZE64): New relocs. + +2008-03-24 Ian Lance Taylor + + * common.h (NT_GNU_GOLD_VERSION): Define. + +2008-03-13 Alan Modra + + * internal.h (Elf_Internal_Shdr): Change sh_link and sh_info from + unsigned long to unsigned int. Change sh_addralign to bfd_vma. + Order struct as for external version. + +2008-03-12 Alan Modra + + PR 5900 + * common.h (SHN_BAD): Delete. + (SHN_LORESERVE .. SHN_HIRESERVE): Move to.. + * external.h: ..here. + * internal.h (SHN_LORESERVE, SHN_HIRESERVE): Define. + (SHN_LOPROC, SHN_HIPROC, SHN_LOOS, SHN_HIOS): Define. + (SHN_ABS, SHN_COMMON, SHN_XINDEX, SHN_BAD): Define. + +2008-03-12 Alan Modra + + * cr16c.h (SHN_CR16C_FCOMMON): Define using SHN_LORESERVE. + (SHN_CR16C_NCOMMON): Likewise. + * hppa.h (SHN_PARISC_ANSI_COMMON): Likewise. + (SHN_PARISC_HUGE_COMMON): Likewise. + * ia64.h (SHN_IA_64_ANSI_COMMON): Likewise. + (SHN_IA_64_VMS_SYMVEC): Define using SHN_LOOS. + * m32r.h (SHN_M32R_SCOMMON): Define using SHN_LORESERVE. + * mips.h (SHN_MIPS_ACOMMON, SHN_MIPS_TEXT): Likewise. + (SHN_MIPS_DATA, SHN_MIPS_SCOMMON, SHN_MIPS_SUNDEFINED): Likewise. + * score.h (SHN_SCORE_TEXT, SHN_SCORE_DATA): Likewise. + (SHN_SCORE_SCOMMON): Likewise. + * sparc.h (SHN_BEFORE, SHN_AFTER): Likewise. + * v850.h (SHN_V850_SCOMMON, SHN_V850_TCOMMON): Likewise. + (SHN_V850_ZCOMMON): Likewise. + * x86-64.h (SHN_X86_64_LCOMMON): Likewise. + +2008-03-03 Pallavi Tambay + + * dwarf2.h: (enum dwarf_location_atom): Add new DW_OP: + DW_OP_PGI_omp_thread_num. + +2008-02-04 Adam Nemet + + * mips.h: Update copyright. + (E_MIPS_MACH_OCTEON): New macro. + +2008-01-30 Tristan Gingold + + Add OpenVMS extensions. + * ia64.h (SHF_IA_64_VMS_GLOBAL, SHF_IA_64_VMS_OVERLAID) + (SHF_IA_64_VMS_SHARED, SHF_IA_64_VMS_VECTOR) + (SHF_IA_64_VMS_ALLOC_64BIT, SHF_IA_64_VMS_PROTECTED) + (SHT_IA_64_VMS_TRACE, SHT_IA_64_VMS_TIE_SIGNATURES) + (SHT_IA_64_VMS_DEBUG, SHT_IA_64_VMS_DEBUG_STR) + (SHT_IA_64_VMS_LINKAGES, SHT_IA_64_VMS_SYMBOL_VECTOR) + (SHT_IA_64_VMS_FIXUP, DT_IA_64_VMS_SUBTYPE) + (DT_IA_64_VMS_IMGIOCNT, DT_IA_64_VMS_LNKFLAGS) + (DT_IA_64_VMS_VIR_MEM_BLK_SIZ, DT_IA_64_VMS_IDENT) + (DT_IA_64_VMS_NEEDED_IDENT, DT_IA_64_VMS_IMG_RELA_CNT) + (DT_IA_64_VMS_SEG_RELA_CNT, DT_IA_64_VMS_FIXUP_RELA_CNT) + (DT_IA_64_VMS_FIXUP_NEEDED, DT_IA_64_VMS_SYMVEC_CNT) + (DT_IA_64_VMS_XLATED, DT_IA_64_VMS_STACKSIZE) + (DT_IA_64_VMS_UNWINDSZ, DT_IA_64_VMS_UNWIND_CODSEG) + (DT_IA_64_VMS_UNWIND_INFOSEG, DT_IA_64_VMS_LINKTIME) + (DT_IA_64_VMS_SEG_NO, DT_IA_64_VMS_SYMVEC_OFFSET) + (DT_IA_64_VMS_SYMVEC_SEG, DT_IA_64_VMS_UNWIND_OFFSET) + (DT_IA_64_VMS_UNWIND_SEG, DT_IA_64_VMS_STRTAB_OFFSET) + (DT_IA_64_VMS_SYSVER_OFFSET, DT_IA_64_VMS_IMG_RELA_OFF) + (DT_IA_64_VMS_SEG_RELA_OFF, DT_IA_64_VMS_FIXUP_RELA_OFF) + (DT_IA_64_VMS_PLTGOT_OFFSET, DT_IA_64_VMS_PLTGOT_SEG) + (DT_IA_64_VMS_FPMODE, SHN_IA_64_VMS_SYMVEC): Define + +2008-01-16 Mark Kettenis + + * common.h (AT_SUN_AUXFLAGS): Define. + +2007-12-11 Daniel Jacobowitz + + * dwarf2.h (DW_AT_hi_user): Correct value. + +2007-12-07 Bob Wilson + + * xtensa.h (R_XTENSA_32_PCREL): New. + +2007-11-29 Mark Shinwell + + * mips.h (E_MIPS_MACH_LS2E): New. + (E_MIPS_MACH_LS2F): New. + +2007-11-28 Nathan Sidwell + + * internal.h (ELF_IS_SECTION_IN_SEGMENT): Adjust to cope with + segments at the end of memory. + +2007-11-17 Thiemo Seufer + + * mips.h (Tag_GNU_MIPS_ABI_FP): Mention -mips32r2 -mfp64 variant + in comment. + +2007-11-16 Nick Clifton + + * dwarf2.h: Mention the location of the DWARF3 spec on the web. + (DW_AT_stride_size): Rename to DW_AT_bit_stride. + (DW_AT_stride): Rename to DW_AT_byte_stride. + +2007-11-08 Nathan Sidwell + + * vxworks.h: New. + +2007-10-30 Nick Clifton + + * mn10300.h (R_MN10300_ALIGN): Define. + +2007-10-25 Daniel Jacobowitz + + * ppc.h (Tag_GNU_Power_ABI_Vector): New. + +2007-10-19 Nick Clifton + + * mn10300.h: Add R_MN10300_SYM_DIFF reloc. + +2007-10-18 Roland McGrath + + * common.h (NT_PPC_VMX): New macro. + +2007-10-01 M R Swami Reddy + + * cr16.h: Updated with new relocaction macros. + +2007-09-17 H.J. Lu + + PR binutils/3281 + PR binutils/5037 + * internal.h (elf_segment_map): Add p_size and p_size_valid. + (ELF_IS_SECTION_IN_SEGMENT): Allow SHF_TLS sections in + PT_GNU_RELRO segments. + +2007-09-11 Nathan Sidwell + + * m68k.h (EF_M68K_CF_ISA_C_NODIV): New. + +2007-08-25 Ulrich Weigand + + * common.h (NT_SPU): Define. + +2007-08-16 H.J. Lu + + * common.h: Revert last change. + +2007-08-16 H.J. Lu + + * common.h (PT_GNU_STACK): Renamed to ... + (PT_GNU_ATTR): This. + (PT_GNU_STACK): New. Make an alias of PT_GNU_ATTR. + +2007-07-09 Roland McGrath + + * common.h (NT_GNU_HWCAP, NT_GNU_BUILD_ID): New macros. + +2007-06-29 Joseph Myers + + * ppc.h (Tag_GNU_Power_ABI_FP): Define. + +2007-06-29 Joseph Myers + + * mips.h (Tag_GNU_MIPS_ABI_FP): Define. + +2007-06-29 Joseph Myers + + * arm.h (elf32_arm_add_eabi_attr_int, + elf32_arm_add_eabi_attr_string, elf32_arm_add_eabi_attr_compat, + elf32_arm_get_eabi_attr_int, elf32_arm_set_eabi_attr_contents, + elf32_arm_eabi_attr_size, Tag_NULL, Tag_File, Tag_Section, + Tag_Symbol, Tag_compatibility): Remove. + * common.h (SHT_GNU_ATTRIBUTES): Define. + +2007-06-29 M R Swami Reddy + + * common.h (EM_CR16): New entry for CR16 cpu. + * cr16.h: New file. + +2007-06-11 Sterling Augustine + Bob Wilson + + * xtensa.h (XTENSA_PROP_INSN_NO_TRANSFORM): Renamed to... + (XTENSA_PROP_NO_TRANSFORM): ...this. + +2007-05-18 Caroline Tice + + * dwarf2.h: (enum dwarf_location_atom): Add new DW_OP, + DW_OP_GNU_uninit. + +2007-05-12 Alan Modra + + * spu.h (R_SPU_ADDR16X): Define. + (R_SPU_PPU32, R_SPU_PPU64): Renumber. + +2007-05-11 Alan Modra + + * spu.h (R_SPU_PPU32, R_SPU_PPU64): Define. + +2007-05-02 Alan Modra + + * internal.h (ELF_IS_SECTION_IN_SEGMENT): Check both file offset + and vma for appropriate sections. + +2007-04-26 Jan Beulich + + * common.h (DT_ENCODING): Correct value (back to spec mandated + value). + +2007-03-08 Alan Modra + + * v850.h (V850_OTHER_TDA_BYTE): Delete. + (V850_OTHER_SDA, V850_OTHER_ZDA, V850_OTHER_TDA): Assign bits + that don't clash with visibility bits. + +2007-03-07 Alan Modra + + * common.h (ELF_ST_VISIBILITY): Comment typo fix. + +2007-02-05 Dave Brolley + Richard Sandiford + Richard Henderson + DJ Delorie + Ben Elliston + + * mep.h: New file. + * common.h (EM_CYGNUS_MEP): Define. + +2007-02-15 Dave Brolley + + From Graydon Hoare : + * common.h (STT_RELC, STT_SRELC, R_RELC): New macros. + +2007-01-08 Kazu Hirata + + * m68k.h (EF_M68K_FIDO): New. + (EF_M68K_ARCH_MASK): OR EF_M68K_FIDO. + (EF_M68K_CPU32_FIDO_A, EF_M68K_CPU32_MASK): Remove. + +2006-12-25 Kazu Hirata + + * m68k.h (EF_M68K_CPU32_FIDO_A, EF_M68K_CPU32_MASK): New. + +2006-12-19 Kazu Hirata + + * m68k.h (EF_M68K_ARCH_MASK): New. + +2006-12-19 Nathan Sidwell + + * internal.h (struct elf_segment_map): Add p_vaddr_offset field. + +2006-12-07 Kazu Hirata + + * m68k.h (EF_M68K_ISA_MASK, EF_M68K_ISA_A_NODIV, + EF_M68K_ISA_A, EF_M68K_ISA_A_PLUS, EF_M68K_ISA_B_NOUSP, + EF_M68K_ISA_B, EF_M68K_ISA_C, EF_M68K_MAC_MASK, EF_M68K_MAC, + EF_M68K_EMAC, EF_M68K_EMAC_B, EF_M68K_FLOAT): Rename to + EF_M68K_CF_ISA_MASK, EF_M68K_CF_ISA_A_NODIV, EF_M68K_CF_ISA_A, + EF_M68K_CF_ISA_A_PLUS, EF_M68K_CF_ISA_B_NOUSP, + EF_M68K_CF_ISA_B, EF_M68K_CF_ISA_C, EF_M68K_CF_MAC_MASK, + EF_M68K_CF_MAC, EF_M68K_CF_EMAC, EF_M68K_CF_EMAC_B, + EF_M68K_CF_FLOAT, respectively. + +2006-12-05 Michael Tautschnig + Nick Clifton + + * external.h (struct Elf_External_Versym): Use ATTRIBUTE_PACKED. + +2006-10-28 Richard Sandiford + + * mips.h (R_MIPS_GLOB_DAT): Define + (R_MIPS_max): Bump by 1. + +2006-10-25 Trevor Smigiel + Yukishige Shibata + Nobuhisa Fujinami + Takeaki Fukuoka + Alan Modra + + * common.h (EM_SPU): Define. + * spu.h: New file. + +2006-10-19 Mei Ligang + + * score.h (EF_SCORE_PIC): Redefine EF_SCORE_PIC as 0x80000000. + (EF_SCORE_FIXDEP): Redefine EF_SCORE_FIXDEP as 0x40000000. + (EF_SCORE_HASENTRY): Delete. + +2006-10-17 Mark Shinwell + + * arm.h: Define TAG_CPU_ARCH_* constants. + +2006-09-17 Mei Ligang + + * score.h: New file. + * common.h: Add Score machine number. + +2006-07-10 Jakub Jelinek + + * common.h (SHT_GNU_HASH, DT_GNU_HASH): Define. + +2006-05-31 H.J. Lu + + * internal.h (ELF_SECTION_SIZE): New. + (ELF_IS_SECTION_IN_SEGMENT): Likewise. + (ELF_IS_SECTION_IN_SEGMENT_FILE): Updated. + (ELF_IS_SECTION_IN_SEGMENT_MEMORY): Likewise. + +2006-05-27 H.J. Lu + + * internal.h (struct elf_segment_map): Add p_align and p_align_valid. + +2006-05-24 Carlos O'Donell + Randolph Chung + * hppa.h (R_PARISC_TLS_GD21L, R_PARISC_TLS_GD14R, R_PARISC_TLS_GDCALL, + R_PARISC_TLS_LDM21L, R_PARISC_TLS_LDM14R, R_PARISC_TLS_LDMCALL, + R_PARISC_TLS_LDO21L, R_PARISC_TLS_LDO14R, R_PARISC_TLS_DTPMOD32, + R_PARISC_TLS_DTPMOD64, R_PARISC_TLS_DTPOFF32, R_PARISC_TLS_DTPOFF64): + New TLS relocs. + (R_PARISC_TLS_LE21L, R_PARISC_TLS_LE14R, R_PARISC_TLS_IE21L, + R_PARISC_TLS_IE14R, R_PARISC_TLS_TPREL32, R_PARISC_TLS_TPREL64): + Define TLS relocs using existing equivalents. + +2006-05-24 Bjoern Haase + + * avr.h: Add E_AVR_MACH_AVR6, R_AVR_LO8_LDI_GS and R_AVR_HI8_LDI_GS. + +2006-03-25 Bernd Schmidt + + * bfin.h (R_BFIN_GOT17M4, R_BFIN_GOTHI, R_BFIN_GOTLO, + R_BFIN_FUNCDESC, R_BFIN_FUNCDESC_GOT17M4, R_BFIN_FUNCDESC_GOTHI, + R_BFIN_FUNCDESC_GOTLO, R_BFIN_FUNCDESC_VALUE, + R_BFIN_FUNCDESC_GOTOFF17M4, R_BFIN_FUNCDESC_GOTOFFHI, + R_BFIN_FUNCDESC_GOTOFFLO, R_BFIN_GOTOFF17M4, R_BFIN_GOTOFFHI, + R_BFIN_GOTOFFLO): New relocs. + (EF_BFIN_PIC, EF_BFIN_FDPIC, EF_BFIN_PIC_FLAGS): New macros. + +2006-03-23 Michael Matz + + * x86-64.h: Add the new relocations with their official + numbers. + +2006-03-22 Richard Sandiford + Daniel Jacobowitz + Phil Edwards + Zack Weinberg + Mark Mitchell + Nathan Sidwell + + * mips.h (R_MIPS_COPY, R_MIPS_JUMP_SLOT): New relocs. + +2006-03-19 John David Anglin + + * hppa.h (SHF_HP_TLS, SHF_HP_NEAR_SHARED, SHF_HP_FAR_SHARED, + SHF_HP_COMDAT, SHF_HP_CONST, SHN_TLS_COMMON, SHN_NS_COMMON, + SHN_NS_UNDEF, SHN_FS_UNDEF, SHN_HP_EXTERN, SHN_HP_EXTHINT, + SHN_HP_UNDEF_BIND_IMM, SHT_HP_OVLBITS, SHT_HP_DLKM, SHT_HP_COMDAT, + SHT_HP_OBJDICT, SHT_HP_ANNOT, STB_HP_ALIAS): Define. + +2006-03-10 Paul Brook + + * arm.h (EF_ARM_EABI_VER5): Define. + +2006-03-06 Nathan Sidwell + + * m68k.h (EF_M68K_ISA_MASK, EF_M68K_ISA_A, + EF_M68K_ISA_A_PLUS, EF_M68K_ISA_B, EF_M68K_ISA_C): Adjust. + (EF_M68K_ISA_A_NODIV, EF_M68K_ISA_B_NOUSP): New. + (EF_M68K_HW_DIV, EF_M68K_USP): Remove. + (EF_M68K_MAC, EF_M68K_EMAC, EF_M68K_FLOAT): Adjust. + (EF_M68K_EMAC_B): New. + +2006-03-03 Bjoern Haase + + * avr.h (R_AVR_MS8_LDI,R_AVR_MS8_LDI_NEG): Add. + (EF_AVR_LINKRELAX_PREPARED): Add. + +2006-03-02 Ben Elliston + + Import from the GCC tree: + 2006-03-01 Jakub Jelinek + + * dwarf2.h (DW_TAG_condition, DW_TAG_shared_type): New constants + from DWARF 3. + (DW_AT_description, DW_AT_binary_scale, DW_AT_decimal_scale, + DW_AT_small, DW_AT_decimal_sign, DW_AT_digit_count, + DW_AT_picture_string, DW_AT_mutable, DW_AT_threads_scaled, + DW_AT_explicit, DW_AT_object_pointer, DW_AT_endianity, + DW_AT_elemental, DW_AT_pure, DW_AT_recursive): New. + (DW_OP_form_tls_address, DW_OP_call_frame_cfa, DW_OP_bit_piece): New. + (DW_ATE_packed_decimal, DW_ATE_numeric_string, DW_ATE_edited, + DW_ATE_signed_fixed, DW_ATE_unsigned_fixed): New. + (DW_DS_unsigned, DW_DS_leading_overpunch, DW_DS_trailing_overpunch, + DW_DS_leading_separate, DW_DS_trailing_separate): New. + (DW_END_default, DW_END_big, DW_END_little): New. + (DW_END_lo_user, DW_END_hi_user): Define. + (DW_LNE_lo_user, DW_LNE_hi_user): Define. + (DW_CFA_val_offset, DW_CFA_val_offset_sf, DW_CFA_val_expression): New. + (DW_LANG_PLI, DW_LANG_ObjC, DW_LANG_ObjC_plus_plus, DW_LANG_UPC, + DW_LANG_D): New. + +2006-02-06 Steve Ellcey + + * ia64.h (SHF_IA_64_HP_TLS): New. + +2006-02-24 DJ Delorie + + * m32c.h: Add relax relocs. + +2006-02-17 Shrirang Khisti + Anil Paranjape + Shilin Shakti + + * common.h (EM_XC16X): New entry for xc16x cpu. + Sort other EM_* numbers into numerical order. + * xc16x.h: New file. + +2006-02-10 H.J. Lu + + PR binutils/2258 + * internal.h (ELF_IS_SECTION_IN_SEGMENT_FILE): New. + (ELF_IS_SECTION_IN_SEGMENT_MEMORY): Likewise. + +2006-02-07 Nathan Sidwell + + * m68k.h (EF_CPU32, EF_M68000, EF_CFV4E): Rename to ... + (EF_M68K_CPU32, EF_M68K_M68000, EF_M68K_CFV4E): ... here. + (EF_M68K_ISA_MASK, EF_M68K_ISA_A, EF_M68K_M68K_ISA_A_PLUS, + EF_M68K_ISA_B, EF_M68K_HW_DIV, EF_M68K_MAC_MASK, EF_M68K_MAC, + EF_M68K_EMAC, EF_M68K_USP, EF_M68K_FLOAT): New. + +2006-02-06 Steve Ellcey + + * ia64.h (SHF_IA_64_HP_TLS): New. + +2006-01-18 Alexandre Oliva + + Introduce TLS descriptors for i386 and x86_64. + * common.h (DT_TLSDESC_GOT, DT_TLSDESC_PLT): New. + * i386.h (R_386_TLS_GOTDESC, R_386_TLS_DESC_CALL, R_386_TLS_DESC): + New. + * x86-64.h (R_X86_64_GOTPC32_TLSDESC, R_X86_64_TLSDESC_CALL, + R_X86_64_TLSDESC): New. + +2006-01-09 Mike Frysinger : + + * common.h (EM_ALTERA_NIOS2, EM_NIOS32) Define. + +2005-12-16 Nathan Sidwell + + Second part of ms1 to mt renaming. + * common.h (EM_MT): Renamed. + * mt.h: Rename relocs, cpu & other defines. + +2005-12-12 Nathan Sidwell + + * mt.h: Renamed from ms1.h + +2005-12-12 Paul Brook + + * arm.h (elf32_arm_get_eabi_attr_int): Add prototype. + +2005-11-11 Nick Clifton + + PR 1150 + * mips.h (STO_OPTIONAL): Define. + (ELF_MIPS_IS_OPTIONAL): Define. + +2005-11-07 Nathan Sidwell + + Add ms2. + * ms1.h (EF_MS1_CPU_MS2): New. + +2005-11-06 John David Anglin + + * hppa.h (R_PARISC_DIR64WR, R_PARISC_DIR64DR): Remove relocs. + +2005-09-30 Catherine Moore + + * bfin.h: New file. + * common.h (EM_BLACKFIN): Define. + +2005-10-08 Paul Brook + + * arm.h: Add prototypes for BFD object attribute routines. + +2005-09-09 Richard Earnshaw + + * arm.h (SHT_ARM_PREEMPTMAP, SHT_ARM_ATTRIBUTES): New defines. + +2005-08-09 John David Anglin + + * hppa.h (SHT_PARISC_DLKM, SHF_PARISC_WEAKORDER, PT_PARISC_WEAKORDER): + New defines. + +2005-08-04 John David Anglin + + * hppa.h (PF_HP_CODE, PF_HP_MODIFY, PF_HP_LAZYSWAP): Revise defines. + (PF_HP_CODE_DEPR, PF_HP_MODIFY_DEPR, PF_HP_LAZYSWAP_DEPR): New + deprecated defines. + (DT_HP_EPLTREL, DT_HP_EPLTRELSZ, DT_HP_FILTERED, DT_HP_FILTER_TLS, + DT_HP_COMPAT_FILTERED, DT_HP_LAZYLOAD, DT_HP_BIND_NOW_COUNT, DT_PLT, + DT_PLT_SIZE, DT_DLT, DT_DLT_SIZE, DT_HP_BIND_DEPTH_FIRST, DT_HP_GST, + DT_HP_SHLIB_FIXED, DT_HP_MERGE_SHLIB_SEG, DT_HP_NODELETE, DT_HP_GROUP, + DT_HP_PROTECT_LINKAGE_TABLE, PT_HP_OPT_ANNOT, PT_HP_HSL_ANNOT, + PT_HP_STACK, PT_HP_CORE_UTSNAME, NT_HP_COMPILER, NT_HP_COPYRIGHT, + NT_HP_VERSION, NT_HP_SRCFILE_INFO, NT_HP_LINKER, NT_HP_INSTRUMENTED, + NT_HP_UX_OPTIONS): Define. + +2005-07-25 DJ Delorie + + * m32c.h: Add R_M32C_8, R_M32C_LO16, R_M32C_HI8, and R_M32C_HI16. + +2005-07-25 Jan Hubicka + + * x86-64.h (SHN_X86_64_LCOMMON): New. + (SHF_X86_64_LARGE): New. + +2005-07-20 Kazuhiro Inaoka + + * m32r.h (R_M32R_REL32): Added. + +2005-07-18 Ben Elliston + + * dwarf2.h (enum dwarf_type): Remove DW_AT_GNU_decimal_float. + Replace with DW_ATE_decimal_float (now in DWARF 3). + +2005-07-14 Jim Blandy + + Add support for Renesas M32C and M16C. + * common.h (EM_M32C): New machine number. + * m32c.h: New file. + +2005-06-17 Jakub Jelinek + + * external.h (GRP_ENTRY_SIZE): Define. + +2005-06-17 Jan Beulich + + * x86-64.h (elf_x86_64_reloc_type): Adjust comment for + R_X86_64_GOTPCREL. Add R_X86_64_PC64, R_X86_64_GOTOFF64, and + R_X86_64_GOTPC32. + +2005-06-07 Aldy Hernandez + Michael Snyder + Stan Cox + + * common.h (EM_MS1): Define. + + * ms1.h: New file. + +2005-05-31 Richard Henderson + + * alpha.h (LITUSE_ALPHA_JSRDIRECT): New. + +2005-05-29 Richard Henderson + + * alpha.h (DT_ALPHA_PLTRO): New. + +2005-05-19 Ben Elliston + + * dwarf2.h (enum dwarf_type): Assign DW_ATE_GNU_decimal_float from + the user-defined encoding space pending inclusion in the standard. + +2005-05-18 Zack Weinberg + + * arm.h: Make all #ifndef OLD_ARM_ABI blocks + unconditional, delete all #ifdef OLD_ARM_ABI blocks. + +2005-05-17 Zack Weinberg + + * arm.h: Import complete list of official relocation names + and numbers from AAELF. Define FAKE_RELOCs for old names. + Remove a few old names no longer used anywhere. + +2005-05-14 Alan Modra + + * ppc.h (DT_PPC_GOT): Rename from DT_PPC_GLINK. + +2005-05-11 Alan Modra + + * ppc.h (R_PPC_RELAX32, R_PPC_RELAX32PC, R_PPC_RELAX32_PLT, + R_PPC_RELAX32PC_PLT) Adjust. + (R_PPC_REL16, R_PPC_REL16_LO, R_PPC_REL16_HI, R_PPC_REL16_HA): Define. + (DT_PPC_GLINK): Define. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + alpha.h, arc.h, arm.h, avr.h, common.h, cr16c.h, cris.h, crx.h, + d10v.h, d30v.h, dlx.h, dwarf.h, dwarf2.h, external.h, fr30.h, + frv.h, h8.h, hppa.h, i370.h, i386.h, i860.h, i960.h, ia64.h, + internal.h, ip2k.h, iq2000.h, m32r.h, m68hc11.h, m68k.h, mcore.h, + mips.h, mmix.h, mn10200.h, mn10300.h, msp430.h, openrisc.h, + or32.h, pj.h, ppc.h, ppc64.h, reloc-macros.h, s390.h, sh.h, + sparc.h, v850.h, vax.h, x86-64.h, xstormy16.h, xtensa.h + +2005-04-13 H.J. Lu + + Moved from ../ChangeLog + + 2004-10-27 Richard Earnshaw + * arm.h: Add R_ARM_CALL and R_ARM_JUMP32. + + 2004-10-12 Paul Brook + * arm.h (EF_ARM_EABI_VER4): Define. + + 2004-10-08 Daniel Jacobowitz + + * common.h (PT_SUNW_EH_FRAME): Define. + * x86-64.h (SHT_X86_64_UNWIND): Define. + + 2004-10-07 Bob Wilson + * xtensa.h (R_XTENSA_DIFF8, R_XTENSA_DIFF16, R_XTENSA_DIFF32, + R_XTENSA_SLOT*_OP, R_XTENSA_SLOT*_ALT): New relocations. + (XTENSA_PROP_SEC_NAME): Define. + (property_table_entry): Add flags field. + (XTENSA_PROP_*, GET_XTENSA_PROP_*, SET_XTENSA_PROP_*): Define. + + 2004-09-17 Paul Brook + * arm.h: Remove R_ARM_STKCHK and R_ARM_THM_STKCHK. + Add R_ARM_TARGET2, R_ARM_PREL31, R_ARM_GOT_ABS, R_ARM_GOT_PREL, + R_ARM_GOT_BREL12, R_ARM_GOTOFF12 and R_ARM_GOTRELAX. + + 2004-09-13 Paul Brook + * arm.h: Rename RELABS to TARGET1. + + 2004-05-11 Jakub Jelinek + * common.h (PT_GNU_EH_FRAME, PT_GNU_STACK): Add comments. + (PT_GNU_RELRO): Define. + +2005-03-29 Daniel Jacobowitz + Phil Blundell + + * arm.h: Add TLS relocations. + +2005-03-23 Ben Elliston + + * dwarf.h: Merge with GCC's dwarf.h. + +2005-03-18 C Jaipraash + + * m68k.h (EF_CFV4E): Define. + +2005-03-17 Paul Brook + Dan Jacobowitz + Mark Mitchell + + * arm.h (PT_ARM_EXIDX): Define. + +2005-03-02 Daniel Jacobowitz + Joseph Myers + + * mips.h: Define MIPS TLS relocations. + +2005-02-15 Nigel Stephens + Maciej W. Rozycki + + * mips.h (R_MIPS16_GOT16): New reloc code. + (R_MIPS16_CALL16): Likewise. + (R_MIPS16_HI16): Likewise. + (R_MIPS16_LO16): Likewise. + (R_MIPS16_min): New fake reloc code. + (R_MIPS16_max): Likewise. + +2005-02-11 Maciej W. Rozycki + + * mips.h (R_MIPS_max): Use FAKE_RELOC to define. + +2005-01-25 Alexandre Oliva + + 2004-12-10 Alexandre Oliva + * frv.h: Add R_FRV_TLSMOFF. + 2004-11-10 Alexandre Oliva + * frv.h: Add TLS relocations. + +2005-01-17 Nick Clifton + + * sh.h (EF_SH2A_SH4_NOFPU, EF_SH2A_SH3_NOFPU, EF_SH2A_SH4, + EF_SH2A_SH3E): New flags. + (EF_SH_BFD_TABLE): Add these new flags to the table. + +2005-01-12 Alan Modra + + * ppc.h (R_PPC_RELAX32_PLT, R_PPC_RELAX32PC_PLT): Define. + (R_PPC_RELAX32, R_PPC_RELAX32PC): Adjust value. + +2004-12-22 Klaus Rudolph + + * avr.h (R_AVR_LDI, R_AVR_6, R_AVR_6_ADIW): New relocs. + +2004-12-16 Richard Sandiford + + * v850.h (R_V850_LO16_SPLIT_OFFSET): New reloc. + +2004-12-09 Ian Lance Taylor + + * mips.h (E_MIPS_MACH_9000): Define. + +2004-11-04 Hans-Peter Nilsson + + * cris.h (EF_CRIS_VARIANT_MASK, EF_CRIS_VARIANT_ANY_V0_V10) + (EF_CRIS_VARIANT_V32, EF_CRIS_VARIANT_COMMON_V10_V32): New + macros. + +2004-10-06 Eric Christopher + + * dwarf2.h: Sync with gcc dwarf2.h. Fix typo. + +2004-10-01 Paul Brook + + * arm.h (SHT_ARM_EXIDX): Define. + (ELF_STRING_ARM_unwind, ELF_STRING_ARM_unwind, + ELF_STRING_ARM_unwind_once, ELF_STRING_ARM_unwind_info_once): + Define. + +2004-08-25 Dmitry Diky + + * msp430.h: Add new relocs. + +2004-08-12 H.J. Lu + + * i386.h (R_386_USED_BY_INTEL_200): New. + +2004-07-29 Alexandre Oliva + + Introduce SH2a support. + 2004-02-18 Corinna Vinschen + * sh.h (EF_SH2A_NOFPU): New. + 2003-12-01 Michael Snyder + * sh.h (EF_SH2A): New. + +2004-07-27 Tomer Levi + + * crx.h: Add BFD_RELOC_CRX_SWITCH8, BFD_RELOC_CRX_SWITCH16, + BFD_RELOC_CRX_SWITCH32. + +2004-07-06 Tomer Levi + + * common.h (EM_CRX): Define. + * crx.h: New file. + +2004-06-25 Kazuhiro Inaoka + + * m32r.h: Add defintions of R_M32R_GOTOFF_HI_ULO, + R_M32R_GOTOFF_HI_SLO and R_M32R_GOTOFF_LO. + +2004-06-19 Alan Modra + + * common.h (ELF64_R_INFO): Warning fix. + +2004-06-14 Chris Demetriou + + * mips.h (R_MIPS_PC32): Add back (undoing removal on 2004-04-24), + with an updated comment. + +2004-05-28 Andrew Stubbs + + * sh.h (EF_SH_HAS_DSP): Remove. + (EF_SH_HAS_FP): Remove. + (EF_SH_MERGE_MACH): Remove. + (EF_SH4_NOFPU): Convert to decimal. + (EF_SH4A_NOFPU): Likewise. + (EF_SH4_NOMMU_NOFPU): Likewise. + (EF_SH3_NOMMU): Add new macro. + (EF_SH_BFD_TABLE): Likewise. + (sh_find_elf_flags): Add prototype. + (sh_elf_get_flags_from_mach): Likewise. + +2004-04-24 Chris Demetriou + + * mips.h (R_MIPS_PC32, R_MIPS_PC64, R_MIPS_GNU_REL_LO16) + (R_MIPS_GNU_REL_HI16): Remove. + (R_MIPS_GNU_REL16_S2): Update comment. + +2004-30-30 Galit Heller + Tomer Levi + + * common.h (EM_CR): Define. + * cr16c.h: New file. + +2004-03-23 Paul Brook + + * arm.h (EF_ERM_BE8, EF_ARM_LE8, EF_ARM_EABI_VER3): Add. + +2003-03-03 Andrew Stubbs + + * sh.h: Add EF_SH4_NOMMU_NOFPU. + +2004-03-01 Richard Sandiford + + * frv.h (EF_FRV_CPU_FR405, EF_FRV_CPU_FR450): Define. + +2004-01-28 Roland McGrath + + * common.h (AT_SECURE): New macro. + +2004-01-21 Roland McGrath + + * common.h (AT_SUN_UID, AT_SUN_RUID, AT_SUN_GID): New macros. + (AT_SUN_RGID, AT_SUN_LDELF, AT_SUN_LDSHDR, AT_SUN_LDNAME, + AT_SUN_LPAGESZ, AT_SUN_PLATFORM, AT_SUN_HWCAP, AT_SUN_IFLUSH, + AT_SUN_CPU, AT_SUN_EMUL_ENTRY, AT_SUN_EMUL_EXECFD, + AT_SUN_EXECNAME) AT_SUN_MMU, AT_SUN_LDDATA): Likewise. + +2004-01-17 Mark Kettenis + + * common.h (NT_OPENBSD_IDENT): Define. + +2004-01-06 Alexandre Oliva + + 2003-09-18 Alexandre Oliva + * frv.h (EF_FRV_FDPIC): New macro. + (EF_FRV_PIC_FLAGS): Adjust. + 2003-08-08 Alexandre Oliva + * frv.h (R_FRV_FUNCDESC_VALUE, R_FRV_FUNCDESC_GOTOFF12, + R_FRV_FUNCDESC_GOTOFFLO, R_FRV_FUNCDESC_GOTOFFHI, R_FRV_GOTOFF12, + R_FRV_GOTOFFLO, R_FRV_GOTOFFHI): New. + 2003-08-04 Alexandre Oliva + * frv.h (R_FRV_GOT12, R_FRV_GOTHI, R_FRV_GOTLO, R_FRV_FUNCDESC, + R_FRV_FUNCDESC_GOT12, R_FRV_FUNCDESC_GOTHI, R_FRV_FUNCDESC_GOTLO): + New. + + +For older changes see ChangeLog-9103 + +Copyright (C) 2004-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/elf/ChangeLog-9103 b/include/elf/ChangeLog-9103 new file mode 100644 index 0000000..6746d0a --- /dev/null +++ b/include/elf/ChangeLog-9103 @@ -0,0 +1,1957 @@ +2005-04-13 H.J. Lu + + Moved from ../ChangeLog + + 2003-10-14 Bob Wilson + * xtensa.h: Formatting. Fix comments about property section + names for linkonce sections. + + 2003-05-23 Jakub Jelinek + * common.h (PT_GNU_STACK): Define. + + 2003-01-25 Jakub Jelinek + * sparc.h: Add TLS relocs. Move R_SPARC_REV32 to 252. + + 2002-09-26 Jakub Jelinek + * x86-64.h: Add TLS relocs. + + 2002-09-19 Jakub Jelinek + * i386.h (R_386_TLS_TPOFF, R_386_TLS_IE, R_386_TLS_GOTIE): + Define. + + 2002-07-10 Jakub Jelinek + * common.h (SHT_GNU_LIBLIST, DT_GNU_PRELINKED, + DT_GNU_CONFLICT*, DT_GNU_LIBLIST*): Define. + + 2002-05-31 Michal Ludvig + * dwarf2.h (DW_CFA_low_user, DW_CFA_high_user): Renamed + to DW_CFA_lo_user, DW_CFA_hi_user respectively. + + 2002-05-23 Jakub Jelinek + * common.h (PT_TLS, SHF_TLS, STT_TLS, DF_STATIC_TLS): Define. + * ia64.h (R_IA64_LTOFF_TPREL22): Renamed from R_IA64_LTOFF_TP22. + * i386.h: Add TLS relocs. + +2003-12-19 Kazuhiro Inaoka + + * m32r.h : Added m32r-linux and PIC support. Add new ABI that + uses RELA. + (R_M32R_16_RELA, R_M32R_32_RELA, R_M32R_24_RELA, + R_M32R_10_PCREL_RELA, R_M32R_18_PCREL_RELA, + R_M32R_26_PCREL_RELA, R_M32R_HI16_ULO_RELA, + R_M32R_HI16_SLO_RELA, R_M32R_LO16_RELA, + R_M32R_SDA16_RELA, R_M32R_RELA_GNU_VTINHERIT, + R_M32R_RELA_GNU_VTENTRY, R_M32R_GOT24, + R_M32R_26_PLTREL, R_M32R_COPY, R_M32R_GLOB_DAT, + R_M32R_JMP_SLOT, R_M32R_RELATIVE, R_M32R_GOTOFF, + R_M32R_GOTPC24, R_M32R_GOT16_HI_ULO, + R_M32R_GOT16_HI_SLO, R_M32R_GOT16_LO, + R_M32R_GOTPC_HI_ULO, R_M32R_GOTPC_HI_SLO, + R_M32R_GOTPC_LO): New relocs. + +2003-12-06 Alan Modra + + From Jan Beulich + * common.h (DT_HIOS): Correct value. + +2003-12-03 Kazuhiro Inaoka + + * m32r.h: Add new machine type m32r2 and instruction modes. + +2003-11-06 Alan Modra + + * ppc.h (R_PPC_RELAX32PC): Define. + +2003-10-22 Alexandre Oliva , + Michael Snyder + + * sh.h (EF_SH4A, EF_SH4AL_DSP, EF_SH4_NOFPU, EF_SH4A_NOFPU): New. + (EF_SH_MERGE_MACH): Combine them. + +2003-10-18 Hans-Peter Nilsson + + * mmix.h (R_MMIX_PUSHJ_STUBBABLE): New reloc number. + (_bfd_mmix_before_linker_allocation): Rename from + _bfd_mmix_prepare_linker_allocated_gregs. + (_bfd_mmix_after_linker_allocation): Rename from + _bfd_mmix_finalize_linker_allocated_gregs. + +2003-10-06 Dave Brolley + + * frv.h (EF_FRV_CPU_FR550): New macro. + +2003-09-30 Chris Demetriou + + * mips.h (E_MIPS_ARCH_64R2): New define. + +2003-09-23 DJ Delorie + + * sh.h (R_SH_SWITCH8, R_SH_GNU_VTINHERIT, R_SH_GNU_VTENTRY, + R_SH_LOOP_START,R_SH_LOOP_END): Move to "reserved" spaces. + (R_SH_DIR16, R_SH_DIR8, R_SH_DIR8UL, R_SH_DIR8UW, R_SH_DIR8U, + R_SH_DIR8SW, R_SH_DIR8S, R_SH_DIR4UL, R_SH_DIR4UW, R_SH_DIR4U, + R_SH_PSHA, R_SH_PSHL): New. + +2003-09-11 James Cownie + + * dwarf2.h: Add HP dwarf extensions from their hacked gdb + header files (ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz). + +2003-09-04 Nick Clifton + + * v850.h (E_V850E1_ARCH): Define. + +2003-08-21 James Cownie + + * dwarf2.h: Add PGI dwarf extensions. + +2003-08-08 Dmitry Diky + + * msp430.h: Add xW42 and xE42 parts. Sort MPU list according to + gcc order. + +2003-08-07 Alan Modra + + * reloc-macros.h (START_RELOC_NUMBERS) : Remove PARAMS macro. Use + C90 function definition. Formatting. + (RELOC_NUMBER): Remove !__STDC__ code. + +2003-07-28 Eric Christopher + + * ppc.h (R_PPC_RELAX32): New. Fake relocation. + +2003-07-25 H.J. Lu + + * v850.h (SHF_V850_GPREL): New. + (SHF_V850_EPREL): Likewise. + (SHF_V850_R0REL): Likewise. + +2003-07-09 Alexandre Oliva + + 2001-05-16 Alexandre Oliva + * mn10300.h: Introduce GOTPC16, GOTOFF24, GOTOFF16 and + PLT16, and rename GOTPC to GOTPC32 and GOTOFF to GOTOFF32. + Renumbered all relocs. + 2001-04-12 Alexandre Oliva + * mn10300.h (R_MN10300_GOTPC, R_MN10300_GOTOFF, + R_MN10300_PLT32, R_MN10300_GOT32, R_MN10300_GOT24, + R_MN10300_GOT16, R_MN10300_COPY, R_MN10300_GLOB_DAT, + R_MN10300_JMP_SLOT, R_MN10300_RELATIVE): New relocs. + +2003-07-09 Alexandre Oliva + + 2000-04-01 Alexandre Oliva + * mn10300.h (E_MN10300_MACH_AM33_2): Renamed from + E_MN10300_MACH_AM332. + 2000-03-31 Alexandre Oliva + * mn10300.h (E_MN10300_MACH_AM332): Defined. + +2003-07-01 Martin Schwidefsky + + * s390.h (elf_s390_reloc_type): Add long displacement relocations + R_390_20, R_390_GOT20, R_390_GOTPLT20 and R_390_TLS_GOTIE20. + +2003-06-29 Andreas Jaeger + + * mmix.h: Convert to ISO C90 prototypes. + * mips.h: Likewise. + +2003-06-13 Robert Millan + + * common.h (GNU_ABI_TAG_NETBSD): New tag. + (GNU_ABI_TAG_FREEBSD): New tag. + +2003-06-10 Richard Sandiford + + * h8.h (E_H8_MACH_H8300SXN): New flag. + +2003-06-03 Nick Clifton + + * v850.h (R_V850_32): Rename to R_V850_ABS32. + Add R_V850_REL32. + +2003-05-15 Roland McGrath + + * common.h (NT_AUXV, AT_*): New macros. + * external.h (Elf32_External_Auxv, Elf64_External_Auxv): New types. + * internal.h (Elf_Internal_Auxv): New type. + +2003-05-14 Michael Snyder + From Bernd Schmidt + * h8.h (E_H8_MACH_H8300SX): New. + +2003-04-24 Dhananjay Deshpande + + * h8.h (E_H8_MACH_H8300HN, E_H8_MACH_H8300SN): New + +2003-04-23 J"orn Rennecke + + * common.h (EM_SH): Amend comment to refer to SuperH. + +2003-04-22 Kazuhiro Inaoka + + * common.h: Replace references to Mitsubishi M32R with + references to Renesas M32R. + +2003-04-15 Rohit Kumar Srivastava + + * common.h: Replace occurrances of 'Hitachi' with 'Renesas'. + +2003-04-01 Bob Wilson + + * common.h (EM_XTENSA_OLD): Define. + * xtensa.h: New file. + +2003-04-01 Nick Clifton + + * arm.h (ARM_NOTE_SECTION): Include .gnu in the string. + +2003-03-25 Stan Cox + Nick Clifton + + Contribute support for Intel's iWMMXt chip - an ARM variant: + + * arm.h (ARM_NOTE_SECTION): Define. + +2003-03-03 J"orn Rennecke + + * sh.h (EF_SH_MERGE_MACH): Make sure SH2E & SH3/SH3E merge to SH3E, + and SH2E & SH4 merge to SH4, not SH2E. + +2003-02-21 Ian Wienand + + * ia64.h (SHT_IA_64_LOPSREG, SHT_IA_64_HIPSREG, + SHT_IA_64_PRIORITY_INIT): Define. + +2003-02-18 Alan Modra + + * ppc64.h (IS_PPC64_TLS_RELOC): Rename from IS_TLS_RELOC. + + * ppc.h: Replace DTPMOD64, TPREL64, DTPREL64 with DTPMOD32 etc. + (IS_PPC_TLS_RELOC): Define. + +2003-02-10 Nick Clifton + + * arm.h (EF_ARM_MAVERICK_FLOAT): Define. + +2003-02-05 Alan Modra + + * ppc.h: Add TLS relocs. Format. + * ppc64.h: Likewise. + +2003-01-27 Alexandre Oliva + + * mips.h (EF_MIPS_XGOT): Define. + +2003-01-24 Martin Schwidefsky + + * s390.h: Add s390 TLS relocations. + +2003-01-23 Nick Clifton + + * Add sh2e support: + + 2002-04-02 Alexandre Oliva + + * sh.h (EF_SH_MERGE_MACH): Handle SH2E. + + 2002-04-02 Elena Zannoni + + * sh.h (EF_SH2E): New. + +2003-01-23 Alan Modra + + * sh.h: Split out various bits to bfd/elf32-sh64.h. + +2003-01-20 Martin Schwidefsky + + * s390.h: Rename R_390_GOTOFF to R_390_GOTOFF32. Add new gotoff, + gotplt and pltoff relocations. + +2003-01-17 Alan Modra + + * common.h: Formatting, typo fixes. + (DT_ENCODING): Correct value. + +2003-01-17 Fabio Alemagna + + * common.h (ELFOSABI_AROS): Define. + (ELFOSABI_OPENVMS): Likewise. + (ELFOSABI_NSK): Likewise. + +2003-01-16 Alan Modra + + * ppc.h: Split out ppc64 definitions to.. + * pcc64.h: ..here. New file. + (R_PPC64_REL30): Rename from R_PPC64_ADDR30. + +2003-01-13 Dmitry Diky + + * elf/common.h (EM_MSP430): Change e_machine value to officially + assigned. + +2003-01-02 Ben Elliston + + * common.h (EM_IQ2000): Define. + * iq2000.h: New file. + +2002-12-30 Chris Demetriou + + * mips.h (E_MIPS_ARCH_32R2): New define. + +2002-12-24 Dmitry Diky + + * common.h: Define msp430 machine numbers. + * msp430.h: New file. Define msp430 relocs. + +2002-12-20 DJ Delorie + + * xstormy16.h: Add XSTORMY16_12. + +2002-12-16 Andrew MacLeod + + * xstormy16.h (START_RELOC_NUMBERS) Add relocation numbers + for R_XSTORMY16_LO16 and R_XSTORMY16_HI16. + +2002-12-10 James Cownie + + * dwarf2.h (DW_TAG_upc_shared_type, DW_TAG_upc_strict_type, + DW_TAG_upc_relaxed_type, DW_AT_upc_threads_scaled, DW_LANG_Upc): + Define. + +2002-12-01 Stephane Carrez + + * m68hc11.h (EF_M68HC12_MACH, EF_M68HCS12_MACH): Define. + (EF_M68HC11_MACH_MASK, EF_M68HC11_MACH): Define. + (EF_M68HC11_MERGE_MACH, EF_M68HC11_CAN_MERGE_MACH): Define. + +2002-11-30 Alan Modra + + * mmix.h: Replace boolean with bfd_boolean. + * sh.h: Likewise. + +2002-11-28 Alan Modra + + * internal.h (elf32_internal_ehdr, Elf32_Internal_Ehdr, + elf64_internal_ehdr, Elf64_Internal_Ehdr, elf32_internal_phdr, + Elf32_Internal_Phdr, elf64_internal_phdr, Elf64_Internal_Phdr, + elf32_internal_shdr, Elf32_Internal_Shdr, elf64_internal_shdr, + Elf64_Internal_Shdr, elf32_internal_sym, elf64_internal_sym, + Elf32_Internal_Sym, Elf64_Internal_Sym, Elf32_Internal_Note, + elf32_internal_note, elf32_internal_rel, Elf32_Internal_Rel, + elf64_internal_rel, Elf64_Internal_Rel, elf32_internal_rela, + elf64_internal_rela, Elf32_Internal_Rela, Elf64_Internal_Rela, + elf32_internal_dyn, elf64_internal_dyn, Elf32_Internal_Dyn, + Elf64_Internal_Dyn, elf32_internal_verdef, elf64_internal_verdef, + elf32_internal_verdaux, elf64_internal_verdaux, elf32_internal_verneed, + elf64_internal_verneed, elf32_internal_vernaux, elf64_internal_vernaux, + elf32_internal_versym, elf64_internal_versym, Elf32_Internal_Verdef, + Elf64_Internal_Verdef, Elf32_Internal_Verdaux, Elf64_Internal_Verdaux, + Elf32_Internal_Verneed, Elf64_Internal_Verneed, Elf32_Internal_Vernaux, + Elf64_Internal_Vernaux, Elf32_Internal_Versym, Elf64_Internal_Versym, + Elf32_Internal_Syminfo, Elf64_Internal_Syminfo): Delete. + (Elf_Internal_Rel): Delete. + +2002-10-11 Kaz Kojima + + * sh.h: Add SH TLS relocs. + +2002-09-30 Gavin Romig-Koch + Ken Raeburn + Aldy Hernandez + Eric Christopher + Richard Sandiford + + * mips.h (E_MIPS_MACH_4120, E_MIPS_MACH_5400, E_MIPS_MACH_5500): New. + +2002-09-12 Roland McGrath + + * dwarf2.h: Updates from GCC version of thie file: + (enum dwarf_location_atom): DW_OP_calli -> DW_OP_call_ref. + Add DW_OP_GNU_push_tls_address. + (DW_OP_lo_user): Change to 0xe0. + +2002-08-28 Catherine Moore + + * v850.h (R_V850_LONGCALL, R_V850_ALIGN, + R_V850_LONGJUMP): New relocations. + +2002-08-15 Alan Modra + + * i370.h: Define relocs using reloc-macros.h. + +2002-08-13 Stephane Carrez + + * m68hc11.h (E_M68HC12_BANKS, E_M68HC11_I32, E_M68HC11_F64, + EF_M68HC11_ABI): Define for ABI specification. + (STO_M68HC12_FAR, STO_M68HC12_INTERRUPT): Symbol flags for + linker and debugger. + (R_M68HC11_24, R_M68HC11_LO16, R_M68HC11_PAGE): New relocs. + (R_M68HC11_RL_JUMP, R_M68HC11_RL_GROUP): New reloc for linker + relaxation. + +2002-07-15 Denis Chertykov + Frank Ch. Eigler + Ben Elliston + Alan Lehotsky + John Healy + Graham Stott + Jeff Johnston + + * common.h (EM_IP2K): New macro. + (EM_IP2K_OLD): New macro. + * ip2k.h: New file. + +2002-07-01 Matt Thomas + + * vax.h: Rename EF_* to EF_VAX_*. + +2002-06-18 Dave Brolley + + From Catherine Moore, Michael Meissner, Dave Brolley: + * common.h (EM_CYGNUS_FRV): New macro. + * frv.h: New file. + +2002-06-06 Lars Brinkhoff + + * common.h: Change registry@sco.com to registry@caldera.com. + (EM_PDP10, EM_PDP11): Define. + +2002-06-04 Jason Thorpe + + * sh.h (_bfd_sh64_crange_qsort_cmpb, _bfd_sh64_crange_qsort_cmpl) + (_bfd_sh64_crange_bsearch_cmpb, _bfd_sh64_crange_bsearch_cmpl): New + prototypes. + +2002-06-01 Richard Henderson + + * alpha.h (LITUSE_ALPHA_ADDR, LITUSE_ALPHA_BASE, LITUSE_ALPHA_BYTOFF, + LITUSE_ALPHA_JSR, LITUSE_ALPHA_TLSGD, LITUSE_ALPHA_TLSLDM): New. + +2002-05-30 Richard Henderson + + * alpha.h (R_ALPHA_TLSGD, R_ALPHA_TLSLDM, R_ALPHA_DTPMOD64, + R_ALPHA_GOTDTPREL, R_ALPHA_DTPREL64, R_ALPHA_DTPRELHI, + R_ALPHA_DTPRELLO, R_ALPHA_DTPREL16, R_ALPHA_GOTTPREL, R_ALPHA_TPREL64, + R_ALPHA_TPRELHI, R_ALPHA_TPRELLO, R_ALPHA_TPREL16): New. + +2002-05-29 Matt Thomas + + * vax.h: New file + +2002-05-28 Kuang Hwa Lin + + * common.h (EM_DLX): Define. + * dlx.h: New file. + +2002-05-08 Jason Thorpe + + * common.h (NT_GNU_ABI_TAG): Define. + (GNU_ABI_TAG_LINUX): Define. + (GNU_ABI_TAG_HURD): Define. + (GNU_ABI_TAG_SOLARIS): Define. + (NT_NETBSD_IDENT): Define. + (NT_FREEBSD_ABI_TAG): Define. + +2002-04-24 Elena Zannoni + + * dwarf2.h: Add DW_AT_GNU_vector. + +2002-02-13 Matt Fredette + + * m68k.h (EF_M68000): Define. + +2002-02-12 Alan Modra + + * ppc.h (DT_PPC64_OPD, DT_PPC64_OPDSZ): Define. + +2002-02-09 Richard Henderson + + * alpha.h (R_ALPHA_BRSGP): New. + +2002-02-08 Alexandre Oliva + + Contribute sh64-elf. + 2002-01-23 Alexandre Oliva + * sh.h (R_SH_GOTPLT32, R_SH_GOT_LOW16, R_SH_GOT_MEDLOW16, + R_SH_GOT_MEDHI16, R_SH_GOT_HI16, R_SH_GOTPLT_LOW16, + R_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_HI16, + R_SH_PLT_LOW16, R_SH_PLT_MEDLOW16, R_SH_PLT_MEDHI16, + R_SH_PLT_HI16, R_SH_GOTOFF_LOW16, R_SH_GOTOFF_MEDLOW16, + R_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_HI16, R_SH_GOTPC_LOW16, + R_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDHI16, R_SH_GOTPC_HI16, + R_SH_GOT10BY4, R_SH_GOTPLT10BY4, R_SH_GOT10BY8, + R_SH_GOTPLT10BY8, R_SH_COPY64, R_SH_GLOB_DAT64, R_SH_JMP_SLOT64, + R_SH_RELATIVE64): New relocs. + (R_SH_FIRST_INVALID_RELOC_4): Adjust. + 2001-05-16 Alexandre Oliva + * sh.h: Renumbered and renamed some SH5 relocations to match + official numbers and names; moved unmaching ones to the range + 0xf2-0xff. + 2001-01-06 Hans-Peter Nilsson + * sh.h (sh64_get_contents_type): Declare. + (sh64_address_is_shmedia): Likewise. + 2000-12-30 Hans-Peter Nilsson + * sh.h (sh64_elf_crange): New type. + (struct sh64_section_data): New. + (sh64_elf_section_data): New macro. + (EF_SH5): Rename back from EF_SH64. + 2000-12-18 Hans-Peter Nilsson + * sh.h (SHF_SH5_ISA32_MIXED, SHT_SH5_CR_SORTED, + SH64_CRANGES_SECTION_NAME, SH64_CRANGE_SIZE, + SH64_CRANGE_CR_ADDR_OFFSET, SH64_CRANGE_CR_SIZE_OFFSET, + SH64_CRANGE_CR_TYPE_OFFSET): New macros. + 2000-12-12 Hans-Peter Nilsson + * sh.h (EF_SH64): Don't define EF_SH64_ABI64. + 2000-11-27 Hans-Peter Nilsson + * sh.h (EF_SH64_32BIT_ABI, EF_SH64_64BIT_ABI): Delete. + (EF_SH64_ABI64): New. + 2000-11-23 Hans-Peter Nilsson + * sh.h (EF_SH64): Rename from EF_SH5. + (EF_SH64_32BIT_ABI): New. + (EF_SH64_64BIT_ABI): New. + (R_SH_PT_16, R_SH_SHMEDIA_CODE + R_SH_IMMU5, R_SH_IMMS6, R_SH_IMMU6, R_SH_IMMS10, R_SH_IMMS10BY2, + R_SH_IMMS10BY4, R_SH_IMMS10BY8, R_SH_IMMS16, R_SH_IMMU16, + R_SH_IMM_LOW16, R_SH_IMM_LOW16_PCREL, R_SH_IMM_MEDLOW16, + R_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16_PCREL, + R_SH_IMM_HI16, R_SH_IMM_HI16_PCREL, R_SH_64, R_SH_64_PCREL): New + relocs. + 2000-09-01 Ben Elliston + * sh.h (EF_SH5): Define. + +2002-02-01 Hans-Peter Nilsson + + * mmix.h: Tweak comments. + (MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME): New. + [BFD_ARCH_SIZE] (_bfd_mmix_prepare_linker_allocated_gregs, + _bfd_mmix_finalize_linker_allocated_gregs, + _bfd_mmix_check_all_relocs): Provide prototypes. + +2002-01-31 Ivan Guzvinec + + * or32.h: New file. + * common.h: Add support for or32 targets. + +2002-01-28 Jason Merrill + + * dwarf2.h: Sync with gcc version. + +2002-01-16 Alan Modra + + * ppc.h (DT_PPC64_GLINK): Define. + +2002-01-15 Richard Earnshaw + + * arm.h (F_VFP_FLOAT, EF_ARM_VFP_FLOAT): Define. + +2002-01-09 Jason Thorpe + + * common.h: Update copyright years. + (NT_NETBSDCORE_PROCINFO): Define. + (NT_NETBSDCORE_FIRSTMACH): Define. + +2002-01-06 Steve Ellcey + + * ia64.h (ELF_STRING_ia64_unwind_hdr): New Macro for HP-UX. + (SHT_IA_64_HP_OPT_ANOT): Ditto + (PT_IA_64_HP_OPT_ANOT): Ditto + (PT_IA_64_HP_HSL_ANOT): Ditto + (PT_IA_64_HP_STACK): Ditto + (SHN_IA_64_ANSI_COMMON): Ditto + +2001-12-17 Alan Modra + + * external.h (Elf_External_Sym_Shndx): Declare. + * internal.h (struct elf_internal_sym ): Make it an + unsigned int. + * common.h (SHN_BAD): Define. + +2001-12-13 Jakub Jelinek + + * common.h (PT_GNU_EH_FRAME): Define. + +2001-12-11 Alan Modra + + * common.h (SHN_XINDEX): Comment typo fix. + * internal.h (Elf_Internal_Ehdr): Change existing "unsigned short" + size, count and index fields to "unsigned int". + +2001-12-07 Geoffrey Keating + Richard Henderson + + * common.h (EM_XSTORMY16): Define. + * xstormy16.h: New file. + +2001-11-15 Alan Modra + + * common.h (NT_ARCH): Define. Remove incorrect comment. + +2001-11-11 Geoffrey Keating + + * dwarf2.h (dwarf_line_number_ops): Add DWARF 3 opcodes. + +2001-10-30 Hans-Peter Nilsson + + * mmix.h: New file. + +2001-10-23 Alan Modra + + * internal.h: White space changes to keep lines under 80 chars. + +2001-10-16 Jeff Holcomb + + * internal.h (elf_internal_shdr): Make contents a unsigned char *. + +2001-09-18 Alan Modra + + * internal.h (elf_internal_rela): Make r_addend a bfd_vma. + +2001-09-13 Alexandre Oliva + + * common.h (EM_OPENRISC_OLD): Renamed the old EM_OPENRISC entry. + +2001-09-12 Alexandre Oliva + + * common.h (EM_AVR_OLD): Renamed from... + (EM_AVR): this, redefined as in the current ELF standard. + (EM_PJ_OLD): Renamed from... + (EM_PJ): this, redefined as in the current ELF standard. + (EM_R30, EM_D10V, EM_D30V, EM_V850, EM_M32R, EM_MN10300, + EM_MN10200, EM_OPENRISC, EM_ARC_A5, EM_XTENSA): Defined as in + the current ELF standard. + (EM_CYGNUS_ARC): Removed, unused for a long time. + +2001-09-04 Richard Henderson + + * alpha.h (R_ALPHA_OP*, R_ALPHA_IMMED*, R_ALPHA_GPVALUE): Remove. + (R_ALPHA_GPREL16): Rename from R_ALPHA_IMMED_GP_16. + +2001-08-30 Eric Christopher + + * mips.h: Remove E_MIPS_MACH_MIPS32_4K. + +2001-08-29 Jeff Law + + * h8.h (EF_H8_MACH): New mask for encoded machine type. + (E_H8_MACH_H8300, E_H8_MACH_H8300H, E_H8_MACH_H8300S): New + machine types. + +2001-08-26 J"orn Rennecke + + * h8.h: New file. + +2001-08-27 Staffan Ulfberg + + * ppc.h: Add relocs from the 64-bit PowerPC ELF ABI revision 1.2. + +2001-06-30 Daniel Berlin + + * dwarf2.h: Remerge with gcc version, + including all new DWARF 2.1 extensions. + +2001-06-29 James Cownie + + * dwarf2.h: Add DWARF 2.1 attribues. + +2001-06-15 Per Bothner + + * dwarf2.h: Partial merge with gcc version. + (enum dwarf_descrim_list): Fix typo -> dwarf_discrim_list. + (DW_LANG_Java): Use value from dwarf 2.1 draft (also used in gcc). + +2001-05-15 Ralf Baechle + + * common.h: Remove definition of EM_MIPS_RS4_BE. The constant was + never in active use and is used otherwise by the ABI. + +2001-05-11 Jakub Jelinek + + * ia64.h (ELF_STRING_ia64_unwind_once): Define. + (ELF_STRING_ia64_unwind_info_once): Define. + +2001-05-07 Thiemo Seufer + + * external.h: Fix typo. + * mips.h: Add/Extend many comments with reference to the MIPS ELF64 + spec v. 2.4, available at e.g. + ftp://oss.sgi.com/pub/linux/mips/doc/ABI/ELF64.ps. + (EF_MIPS_UCODE): Define. + (EF_MIPS_OPTIONS_FIRST): Define. + (EF_MIPS_ARCH_ASE): Define. + (EF_MIPS_ARCH_ASE_MDMX): Define. + (EF_MIPS_ARCH_ASE_M16): Define. + (SHF_MIPS_ADDR): Renamed SHF_MIPS_ADDR32. + (SHF_MIPS_STRING): Renamed SHF_MIPS_ADDR64. + (SHF_MIPS_NODUPES): Define. + (ELF64_MIPS_R_SSYM): New MIPS ELF 64 relocation info access macro. + (ELF64_MIPS_R_TYPE3): Likewise. + (ELF64_MIPS_R_TYPE2): Likewise. + (ELF64_MIPS_R_TYPE): Likewise. + (OHW_R10KLDL): Define. + +2001-04-24 Todd Fries + + * sparc.h: Fix typo. + +2001-04-20 Johan Rydberg + + * openrisc.h: New file. + * common.h (EM_OPENRISC): New constant. + +2001-04-23 Bo Thorsen + + * x86-64.h: Add vtable support. + +2001-03-23 Nick Clifton + + * mips.h: Remove extraneous whitespace. + +2001-03-22 Hans-Peter Nilsson + + * cris.h: Add leading comment about PC-relative location. + (R_CRIS_COPY, R_CRIS_GLOB_DAT, R_CRIS_JUMP_SLOT, R_CRIS_RELATIVE, + R_CRIS_16_GOT, R_CRIS_32_GOT, R_CRIS_16_GOTPLT, R_CRIS_32_GOTPLT, + R_CRIS_32_GOTREL, R_CRIS_32_PLT_GOTREL, R_CRIS_32_PLT_PCREL): + New relocs. + +2001-02-27 Philip Blundell + + * arm.h: Add new definitions from ARM document SWS ESPC 0003 B-01. + (EF_PIC, et al.): Rename to EF_ARM_xx. + +2001-02-09 Martin Schwidefsky + + * common.h: Add linux target for S/390. + * s390.h: New file. + +2001-01-11 Peter Targett + + * arc.h (E_ARC_MACH_ARC5, E_ARC_MACH_ARC6, E_ARC_MACH_ARC7, + E_ARC_MACH_ARC8): New definitions for cpu types. + + * common.h (EM_ARC): Change comment. + +2000-12-12 Nick Clifton + + * mips.h: Fix formatting. + +2000-12-11 Jeffrey A Law (law@cygnus.com) + + * hppa.h (DT_HP_*): Define relative to OLD_DT_LOOS for hpux + compatibility. + +2000-10-16 Chris Demetriou + + * mips.h (E_MIPS_ARCH_32): New constant. + (E_MIPS_MACH_MIPS32, E_MIPS_MACH_MIPS32_4K): Replace the + former with the latter. + + * mips.h (E_MIPS_ARCH_5, E_MIPS_ARCH_64): New definitions. + + * mips.h (E_MIPS_MACH_SB1): New constant. + +2000-11-30 Jan Hubicka + + * common.h (EM_X86_64): New macro. + * x86-64.h: New file. + +2000-11-27 Hans-Peter Nilsson + + * common.h (e_machine numbers): Clarify comments to describe how + EM_* constants are assigned. Move EM_PJ from official section to + ad-hoc section. + (EM_CRIS): Correct comment to match official description. + (EM_MMIX): Ditto. + +2000-11-22 Nick Clifton + + * common.h (EM_JAVELIN): New machine number. + (EM_FIREPATH): New machine number. + (EM_ZSP): New machine number. + (EM_MMIX): New machine number. + (EM_HUANY): New machine number. + (EM_PRISM): New machine number. + (SHT_GROUP): New section type. + (SHT_SYMTAB_SHNDX): New section type. + (SHF_GROUP): New section flag. + (SHN_XINDEX): New section index. + (GRP_COMDAT): New section group flag. + +2000-11-20 H.J. Lu + + * common.h (ELFOSABI_MONTEREY): Renamed to ... + (ELFOSABI_AIX): This. + +2000-11-16 Richard Henderson + + Update relocations per August psABI docs. + * ia64.h (R_IA64_SEGBASE): Remove. + (R_IA64_LTV*): Renumber to 0x74 to 0x77. + (R_IA64_EPLTMSB, R_IA64_EPLTLSB): Remove. + (R_IA64_TPREL14, R_IA64_TPREL64I): New. + (R_IA64_DTPMOD*): New. + (R_IA64_DTPREL*): New. + +2000-09-29 Hans-Peter Nilsson + + * cris.h (EF_CRIS_UNDERSCORE): New. + +2000-09-27 Alan Modra + + * hppa.h (R_PARISC_DIR14F): Add. + +2000-09-14 Alexandre Oliva + + * sh.h (R_SH_GOT32, R_SH_PLT32, R_SH_COPY, R_SH_GLOB_DAT, + R_SH_JMP_SLOT, R_SH_RELATIVE, R_SH_GOTOFF, R_SH_GOTPC): Change + numbers to the range from 160 to 167. + (R_SH_FIRST_INVALID_RELOC): Adjust. + (R_SH_FIRST_INVALID_RELOC_2, R_SH_LAST_INVALID_RELOC_2): + New relocs to fill in the gap. + +2000-09-13 Anders Norlander + + * mips.h (E_MIPS_MACH_4K): New define. + +2000-09-05 Alan Modra + + * hppa.h: Fix a comment. + (R_PARISC_PCREL12F): Define. + (R_PARISC_GNU_VTENTRY): Define. + (R_PARISC_GNU_VTINHERIT): Define. + +2000-09-01 Alexandre Oliva + + * sh.h (R_SH_GOT32, R_SH_PLT32, R_SH_COPY, R_SH_GLOB_DAT, + R_SH_JMP_SLOT, R_SH_RELATIVE, R_SH_GOTOFF, R_SH_GOTPC): New relocs. + (R_SH_FIRST_INVALID_RELOC): Adjust. + +2000-08-14 Jim Wilson + + * ia64.h (EF_IA_64_REDUCEDFP, EF_IA_64_CONS_GP, + EF_IA_64_NOFUNCDESC_CONS_GP, EF_IA_64_ABSOLUTE): Define. + +2000-08-07 Nick Clifton + + * ppc.h: Remove spurious CYGNUS LOCAL comments. + * v850.h: Likewise. + +2000-07-22 Jason Eckhardt + + * i860.h: New file. + (elf_i860_reloc_type): Defined ELF32 i860 relocations. + +2000-07-20 Hans-Peter Nilsson + + common.h (EM_CRIS): New machine number. + cris.h: New file. + +2000-07-19 H.J. Lu + + * common.h (DF_1_NODEFLIB): Renamed from DF_1_NODEPLIB. + +2000-07-19 H.J. Lu + + * common.h (DT_CHECKSUM): Set to 0x6ffffdf8. + (DTF_1_CONFEXP): It is 0x00000002 as suspected. + +2000-07-19 H.J. Lu + + * common.h (DT_FEATURE): Renamed from DT_FEATURE_1. + (DT_CONFIG): New. From Solaris 8. + (DT_DEPAUDIT): Likewise. + (DT_AUDIT): Likewise. + (DT_PLTPAD): Likewise. + (DT_MOVETAB): Likewise. + (DF_1_NODEPLIB): Likewise. + (DF_1_NODUMP): Likewise. + (DF_1_CONLFAT): Likewise. + (DT_CHECKSUM): Likewise. FIXME. Check the value on Solaris 8. + (DTF_1_CONFEXP): Likewise. + +2000-07-18 H.J. Lu + + * common.h (DT_FLAGS_1): Renamed from DT_1_FLAGS. + +2000-07-12 Alan Modra + + * internal.h (struct elf_internal_sym): Update comment for st_other. + +2000-07-10 Alan Modra + + * hppa.h: Add comments to all the relocs. + +2000-06-26 Marek Michalkiewicz + + * avr.h (E_AVR_MACH_AVR5): Define. + +2000-06-18 Stephane Carrez + + * m68hc11.h: New file, definitions for the Motorola 68hc11. + +2000-06-06 Alan Modra + + * reloc-macros.h (START_RELOC_NUMBERS): Don't define initial dummy + -1 valued enum. + (RELOC_NUMBER, FAKE_RELOC, EMPTY_RELOC): Append rather than + prepend comma. + (END_RELOC_NUMBERS): Give macro an arg to define as last enum. + + * alpha.h (R_ALPHA_max): Define via END_RELOC_NUMBERS rather than + with EMPTY_RELOC. + * arc.h (R_ARC_max): Likewise. + * avr.h (R_AVR_max): Likewise. + * fr30.h (R_FR30_max): Likewise. + * hppa.h (R_PARISC_UNIMPLEMENTED): Likewise. + * i960.h (R_960_max): Likewise. + * m32r.h (R_M32R_max): Likewise. + * m68k.h (R_68K_max): Likewise. + * mcore.h (R_MCORE_max): Likewise. + * mn10300.h (R_MN10300_MAX): Likewise. + * pj.h (R_PJ_max): Likewise. + * ppc.h (R_PPC_max): Likewise. + * sh.h (R_SH_max): Likewise. + * sparc.h (R_SPARC_max): Likewise. + * v850.h (R_V850_max): Likewise. + + * arm.h (R_ARM_max): Define via END_RELOC_NUMBERS. + * d10v.h (R_D10V_max): Likewise. + * d30v.h (R_D30V_max): Likewise. + * ia64.h (R_IA64_max): Likewise. + * mips.h (R_MIPS_maxext): Likewise. + * mn10200.h (R_MN10200_max): Likewise. + + * i386.h (R_386_max): Remove old RELOC_NUMBER definition, and + define via END_RELOC_NUMBERS. + +2000-06-03 Alan Modra + + * reloc-macros.h (START_RELOC_NUMBERS): Fix name clash for + !__STDC__ case. + (RELOC_NUMBER): Use ansi stringify if ALMOST_STDC defined. + +2000-05-22 Richard Henderson + + * ia64.h (R_IA64_PCREL60B, R_IA64_PCREL21BI): New. + (R_IA64_PCREL22, R_IA64_PCREL64I): New. + +2000-05-02 H.J. Lu + + * common.h (ELFOSABI_NONE): Renamed from ELFOSABI_SYSV. + (ELFOSABI_MODESTO): Defined. + (ELFOSABI_OPENBSD): Likewise. + +2000-04-21 Richard Henderson + David Mosberger + + * ia64.h: New file. + +2000-04-14 H.J. Lu + + * common.h (ELFOSABI_TRUE64): Renamed to ELFOSABI_TRU64. + +2000-04-14 H.J. Lu + + * common.h (ELFOSABI_NETBSD): Defined. + (ELFOSABI_HURD): Likewise. + (ELFOSABI_SOLARIS): Likewise. + (ELFOSABI_MONTEREY): Likewise. + (ELFOSABI_IRIX): Likewise. + (ELFOSABI_FREEBSD): Likewise. + (ELFOSABI_TRUE64): Likewise. + +2000-04-07 Nick Clifton + + * arm-oabi.h: Delete. + * arm.h: Merge in definitions of old reloc numbers from + arm-oabi.h. + +2000-04-06 Nick Clifton + + * arm.h (EF_ARM_SYMSARESORTED): Define. + (EF_ARM_EABIMASK): Define. + (EF_ARM_EABI_VERSION): Define. + (EF_ARM_EABI_UNKNOWN): Define. + (EF_ARM_EABI_VER1): Define. + (PF_ARM_PI): Define. + (PF_ARM_ABS): Define. + +2000-04-05 J"orn Rennecke + + * sh.h (R_SH_LOOP_START, R_SH_LOOP_END): New RELOC_NUMBERs. + +2000-03-27 Denis Chertykov + + * avr.h: New file. AVR ELF support for BFD. + * common.h: Add AVR magic number. + +2000-03-10 Geoffrey Keating + + * mips.h: Add R_MIPS_GNU_REL_HI16, R_MIPS_GNU_REL_LO16, + R_MIPS_GNU_REL16_S2, R_MIPS_PC64 and R_MIPS_PC32 relocation + numbers. + +2000-02-23 Linas Vepstas + + * i370.h: New file. + +2000-02-22 Nick Clifton + + * common.h (ELF_ST_OTHER): Remove definition. + (ELF32_ST_OTHER): Remove definition. + (ELF64_ST_OTHER): Remove definition. + +2000-02-22 H.J. Lu + + * common.h (ELFOSABI_LINUX): Define. + +2000-02-17 J"orn Rennecke + + * sh.h: (EF_SH_MACH_MASK, EF_SH_UNKNOWN, EF_SH1, EF_SH2): New macros. + (EF_SH3, EF_SH_HAS_DSP, EF_SH_DSP, EF_SH3_DSP): Likewise. + (EF_SH_HAS_FP, EF_SH3E, EF_SH4, EF_SH_MERGE_MACH): Likewise. + +2000-02-03 H.J. Lu + + * arm-oabi.h: Duplicate changes made to arm.h on Jan. 27, + 2000 by Thomas de Lellis . + +2000-01-27 Thomas de Lellis + + * arm.h (STT_ARM_TFUNC): Define in terms of STT_LOPROC. + (STT_ARM_16BIT): New flag. Denotes a label that was defined in + Thumb block but was does not identify a function. + +2000-01-20 Nick Clifton + + * common.h (EM_MCORE): Fix spelling of Motorola. + * mcore.h (EM_MCORE): Fix spelling of Motorola. + +2000-01-13 Nick Clifton + + * common.h (EM_S370): Change comment - this is now the IBM + System/370. + (EM_IA_64): Change comment - this is now the IA-64. + +2000-01-11 Nick Clifton + + * common.h (DT_ENCODING): Fix definition of this value. + (DT_LOOS): Fix definition of this value. + (DT_HIOS): Fix definition of this value. + (OLD_DT_LOOS): Value of DT_LOOS before Oct 4, 1999 draft + of ELF spec changed it. + (OLD_DT_HIOS): Value of DT_HIOS before Oct 4, 1999 draft + of ELF spec changed it. + +2000-01-10 Egor Duda + + * common.h (NT_WIN32PSTATUS): Define. (cygwin elf core dumps). + +1999-12-28 Nick Clifton + + * mips.h (STO_*): Redefine in terms of STV_* values now in + common.h. + +1999-12-27 Nick Clifton + + * common.h: Upgrade to match Oct4, 1999 Draft ELF ABI Spec. + (EM_MIPS_RS3_LE): New machine number. + (EM_RCE): New machine number. + (EM_MMA): New machine number. + (EM_PCP): New machine number. + (EM_NCPU): New machine number. + (EM_NDR1): New machine number. + (EM_STARCORE): New machine number. + (EM_ME16): New machine number. + (EM_ST100): New machine number. + (EM_TINYJ): New machine number. + (EM_FX66): New machine number. + (EM_ST9PLUS): New machine number. + (EM_ST7): New machine number. + (EM_68HC16): New machine number. + (EM_68HC11): New machine number. + (EM_68HC08): New machine number. + (EM_68HC05): New machine number. + (EM_SVX): New machine number. + (EM_VAX): New machine number. + (PF_MASKOS): Change value. + (SHT_INIT_ARRAY): New value for sh_type field. + (SHT_FINI_ARRAY): New value for sh_type field. + (SHT_PREINIT_ARRAY): New value for sh_type field. + (SHT_HIUSER): Change value. + (SHF_MERGE): New valye for sh_flags field. + (SHF_STRINGS): New valye for sh_flags field. + (SHF_INFO_LINK): New valye for sh_flags field. + (SHF_OS_NONCONFORMING): New valye for sh_flags field. + (SHF_MASKOS): Change value. + (ELF_ST_VISIBILITY): New macro. + (ELF_ST_OTHER): New macro. + (STT_COMMON): New symbol type. + (STV_DEFAULT): Value for symbol visibility. + (STV_INTERNAL): Value for symbol visibility. + (STV_HIDDEN): Value for symbol visibility. + (STV_PROTECTED): Value for symbol visibility. + (DT_RUNPATH): New dynamic section tag. + (DT_FLAGS): New dynamic section tag. + (DT_ENCODING): New dynamic section tag. + (DT_PREINIT_ARRAY): New dynamic section tag. + (DT_PREINIT_ARRAYSZ): New dynamic section tag. + (DT_LOPROC): New dynamic section tag index. + (DT_HIPROC): New dynamic section tag index. + (DF_ORIGIN): Value for dynamic section flag. + (DF_SYMBOLIC): Value for dynamic section flag. + (DF_TEXTREL): Value for dynamic section flag. + (DF_BIND_NOW): Value for dynamic section flag. + +1999-12-09 Fred Fish + + * i960.h (reloc-macros.h): Include using relative dir elf/. + * i386.h (reloc-macros.h): Include using relative dir elf/. + * hppa.h (reloc-macros.h): Include using relative dir elf/. + +1999-12-07 Jim Blandy + + * common.h (NT_PRXFPREG): New definition. + +Wed Dec 1 03:02:15 1999 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (E_MN10300_MACH_AM33): Define. + +Mon Oct 11 22:42:37 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (PF_HP_PAGE_SIZE): Define. + (PF_HP_FAR_SHARED, PF_HP_NEAR_SHARED, PF_HP_CODE): Likewise. + (PF_HP_MODIFY, PF_HP_LAZYSWAP, PF_HP_SBP): Likewise. + +Mon Oct 4 17:42:38 1999 Doug Evans + + * m32r.h (E_M32RX_ARCH): Define. + +1999-09-15 Ulrich Drepper + + * hppa.h: Add DT_HP_GST_SIZE, DT_HP_GST_VERSION, and DT_HP_GST_HASHVAL. + +1999-09-04 Steve Chamberlain + + * pj.h: New file. + * common.h (EM_PJ): Define. + +1999-09-02 Ulrich Drepper + + * hppa.h: Add HPUX specific symbol type definitions. + + * hppa.h: Add HPUX specific dynamic and program header table + specific definitions. + +1999-08-31 Scott Bambrough + + * common.h (NT_TASKSTRUCT): Define. + +1999-07-16 Jakub Jelinek + + * sparc.h (EF_SPARC_SUN_US3): Define in Cheetah extensions + flag (as per SCD2.4.1). + +1999-07-16 Jakub Jelinek + + * sparc.h (ELF64_R_TYPE_DATA): Only use ELF64_R_TYPE bits, not + ELF64_R_SYM bits. + +1999-06-21 Philip Blundell + + * arm.h (EF_SOFT_FLOAT, F_SOFT_FLOAT): Define. + +1999-07-13 Andreas Schwab + + * m68k.h (EF_CPU32): Move definition inside multiple inclusion + guard. + +1999-07-08 Richard Henderson + + * sparc.h (ELF64_R_TYPE_DATA): Sign extend the value. + (ELF64_R_TYPE_INFO): Mask out all but low 24 bits of data. + (DT_SPARC_PLTFMT): Delete. + Based on a patch from Jakub Jelinek. + +Mon Jun 21 16:36:02 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (elf_hppa_reloc_type): Renamed from elf32_hppa_reloc_type. + +1999-06-10 Jakub Jelinek + + * sparc.h (R_SPARC_max_std): Define. + +Wed Jun 9 15:16:34 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h: Update with various changes from newest PA ELF + specifications. + +1999-06-03 Ian Lance Taylor + + * common.h (EM_PPC64): Define. + +1999-06-02 Stu Grossman + + * dwarf.h: Add LANG_JAVA. + * dwarf2.h: Add DW_LANG_Java. + +1999-05-29 Nick Clifton + + * common.h (ELFOSABI_ARM): Define. + +1999-05-28 Nick Clifton + + * reloc-macros.h: Update comment. + +1999-05-28 Ian Lance Taylor + + * i960.h: New file. + +1999-05-16 Nick Clifton + + * mcore.h (R_MCORE_COPY): Define. + (R_MCORE_GLOB_DAT): Define. + (R_MCORE_JUMP_SLOT): Define. + +1999-05-15 Nick Clifton + + * mcore.h (R_MCORE_RELATIVE): Define. + +1999-05-05 Catherine Moore + + * m68k.h (EF_CPU32): Define. + +1999-04-21 Nick Clifton + + * reloc-macros.h (START_RELOC_NUMBERS): Prepend an underscore to + fake reloc entry name (if possible), in order to avoid conflicts + with typedefs of the same name. + +1999-04-16 Gavin Romig-Koch + + * mips.h (EF_MIPS_32BITMODE): New. + +1999-04-08 Nick Clifton + + * mcore.h: New header file. Defines for Motorola's MCore + processor. + +1999-04-08 Nick Clifton + + * common.h: Add new constants defined in: "System V Application + Binary Interface - DRAFT - April 29, 1998" found at the web site: + http://www.sco.com/developer/gabi/contents.html + + (EM_MMA): Removed. Replaced with EM_MCORE as Motorolla own this + value. + +1999-03-31 Nick Clifton + + * reloc-macros.h: Fixed to not generate an enum with a trailing + comma. + +1999-03-16 Gavin Romig-Koch + + * mips.h (E_MIPS_MACH_5000): New. + +1999-03-10 Ulrich Drepper + + * common.h: Add definitions for a few more Solaris ELF extensions. + +Thu Feb 18 18:58:26 1999 Ian Lance Taylor + + * external.h: Only use attribute if __GNUC__ is defined. + +1999-02-17 Nick Clifton + + Patch submitted by: Scott Bambrough + + * external.h: struct Elf_External_Versym must be packed on + ARM. Code uses sizeof(Elf_External_Versym) and assumes it is + equal to sizeof(char[2]). Reported by Jim Pick + +1999-02-02 Nick Clifton + + * dwarf2.h (DWARF2_External_ARange): New structure. + (DWARF2_Internal_ARange): New structure. + +Mon Feb 1 11:33:56 1999 Catherine Moore + + * arm.h: Renumber relocs to conform to standard. + (EF_NEW_ABI): Define. + (EF_OLD_ABI): Define. + * arm-oabi.h: New file. + +1999-01-28 Nick Clifton + + * fr30.h: Add R_FR30_GNU_VT{INHERIT,ENTRY} relocs. + +1999-01-27 Nick Clifton + + * dwarf2.h: Add typedefs for structures found in dwarf2 sections. + +1998-12-16 Gavin Romig-Koch + + * mips.h (E_MIPS_MACH_4111): New. + +1998-12-15 Gavin Romig-Koch + + * mips.h (EF_MIPS_ABI,E_MIPS_ABI_O32,E_MIPS_ABI_O64, + E_MIPS_ABI_EABI32,E_MIPS_ABI_EABI64): + +1998-12-03 Nick Clifton + + * fr30.h: Add R_FR30_48 reloc. + +1998-12-02 Ulrich Drepper + + * mips.h: Add external data type for conflict section. + + * mips.h: Add more LL_* options from Irix 6.5. + + * mips.h: Add R_MIPS_JALR and adjust R_MIPS_max appropriately. + +Mon Nov 30 15:25:58 1998 J"orn Rennecke + + * sh.h (elf_sh_reloc_type): Add R_SH_FIRST_INVALID_RELOC, + R_SH_LAST_INVALID_RELOC, R_SH_SWITCH8 and R_SH_max. + +Tue Nov 10 15:12:28 1998 Nick Clifton + + * common.h (EM_CYGNUS_FR30): Reduce to a 16 bit value. + +Tue Nov 10 15:17:28 1998 Catherine Moore + + * d10v.h: Add vtable relocs. + +Wed Nov 4 15:56:50 1998 Nick Clifton + + * common.h (EM_CYGNUS_FR30): New machine number. + + * fr30.h: New file: Definitions for the FR30. + +Fri Oct 30 11:54:15 1998 Catherine Moore + + From Philip Blundell : + * arm.h (R_ARM_COPY, et al.): New relocs, used by Linux for PIC. + (EF_ALIGN8): New flag. + +Tue Oct 20 11:19:50 1998 Ian Lance Taylor + + * common.h (NT_LWPSTATUS): Close comment accidentally left open. + +Mon Oct 19 20:24:11 1998 Catherine Moore + + * sh.h: Add vtable relocs. + +Mon Oct 19 01:44:42 1998 Felix Lee + + * common.h (NT_PSTATUS, NT_FPREGS, NT_PSINFO, + NT_LWPSTATUS,NT_LWPSINFO): added. + * internal.h (Elf_Internal_Note): new structure members. + +Fri Oct 16 14:11:25 1998 Catherine Moore + + * m32r.h: Add vtable relocs. + +Tue Oct 6 09:22:22 1998 Catherine Moore + + * sparc.h: Add vtable relocs. + +Mon Oct 5 09:39:22 1998 Catherine Moore + + * v850.h: Add vtable relocs. + +Sun Oct 4 21:17:51 1998 Ian Lance Taylor + + * i386.h (R_386_max): Change from 252 to 24. + +Mon Sep 21 12:24:44 1998 Catherine Moore + + * i386.h: Change vtable reloc numbers. + +Sun Sep 20 00:54:22 1998 Andreas Schwab + + * m68k.h: Add vtable relocs and R_68K_max. + +Tue Sep 15 09:56:49 CDT 1998 Catherine Moore + + * arm.h: Add vtable relocs. + +Mon Aug 31 11:25:27 1998 Catherine Moore + + * arm.h: Define STT_ARM_TFUNC. Remove ST_THUMB_xxxx + definitions. + +Sat Aug 29 22:25:51 1998 Richard Henderson + + * i386.h: Add vtable relocs. + +1998-08-25 16:42 Ulrich Drepper + + * common.h: Add SYMINFO_* macros to access Elf*_Syminfo information. + + * external.h: Add Elf_External_Syminfo definition. + + * internal.h: Add Elf_Internal_Syminfo, Elf32_Internal_Syminfo, + and Elf64_Syminfo definitions. + +Sun Aug 9 20:26:49 CDT 1998 Catherine Moore + + * arm.h: Add ST_THUMB definitions. + +Wed Aug 5 15:52:35 1998 Nick Clifton + + * arm.h: Add ELF header flags to specify compile time optins: + EF_INTERWORK: New flag. + EF_APCS_26: New flag. + EF_APCS_FLOAT: New flag. + EF_PIC: New flag. + +1998-07-31 21:28 Ulrich Drepper + + * mips.h: Add missing RHF_* constants. + +Fri Jul 31 10:01:40 1998 Catherine Moore + + * arm.h: Add R_ARM_THM_PC9 relocation. + +1998-07-30 16:25 Ulrich Drepper + + * common.h: Add new DT_* entries and there flag macros from Solaris. + +Tue Jul 28 18:14:07 1998 Stan Cox + + * sparc.h: (R_SPARC_REV32): Added for little endian data e.g. sparc 86x. + +Fri Jul 24 11:22:06 1998 Jeffrey A Law (law@cygnus.com) + + * mn10300.h: Add R_MN10300_24 relocation. + +1998-07-24 Ulrich Drepper + + * mips.h: Add MIPS64 relocation names and values. + +Wed Jul 22 19:29:00 Catherine Moore + + * arm.h: Rename relocations. + +1998-07-22 Ulrich Drepper + + * ppc.h: Define enum as elf_ppc_reloc_type. + +Wed Jul 22 16:22:11 1998 Nick Clifton + + * reloc-macros.h: New file. Provides relocation macros: + START_RELOC_NUMBERS, RELOC_NUMBER, FAKE_RELOC, EMPTY_RELOC and + END_RELOC_NUMBERS used by other elf header files. + + * alpha.h: Use reloc-macros.h. + * arc.h: Use reloc-macros.h. + * arm.h: Use reloc-macros.h. + * d10v.h: Use reloc-macros.h. + * d30v.h: Use reloc-macros.h. + * hppa.h: Use reloc-macros.h. + * i386.h: Use reloc-macros.h. + * m32r.h: Use reloc-macros.h. + * m68k.h: Use reloc-macros.h. + * mips.h: Use reloc-macros.h. + * mn10200.h: Use reloc-macros.h. + * mn10300.h: Use reloc-macros.h. + * ppc.h: Use reloc-macros.h. + * sh.h: Use reloc-macros.h. + * sparc.h: Use reloc-macros.h. + * v850.h: Use reloc-macros.h. + +1998-07-22 13:07 Ulrich Drepper + + * mn10300.h: Rewrite relocation definition using macros. + * mips.h: Likewise. + * ppc.h: Likewise. + * alpha.h: Likewise. + * arm.h: Likewise. + * d10v.h: Likewise. + * d30v.h: Likewise. + * m32r.h: Likewise. + * m68k.h: Likewise. + * mn10200.h: Likewise. + * sh.h: Likewise. + * sparc.h: Likewise. + +1998-07-21 13:07 Ulrich Drepper + + * arm.h: New file. + * d10v.h: New file. + * d30v.h: New file. + * i386.h: New file. + * m68k.h: New file. + * mn10200.h: New file. + * sh.h: New file. + + * mips.h: Add R_MIPS_* and SHT_MIPS_* entries. + + * mn10300.h: Add R_MN10300_* entries. + + * ppc.h: Add R_PPC_* entries. + +1998-07-20 07:11 Ulrich Drepper + + * mips.h: Add ODK_*, OEX_*, OPAD_*, OHW_*, and OGP_* constants. + Define Elf32_External_Lib. + +1998-07-19 15:24 Ulrich Drepper + + * mips.h (PT_MIPS_OPTIONS): New symbol. + Add lots of DT_MIPS_* symbols. + +Fri Jun 26 10:46:35 1998 Jeffrey A Law (law@cygnus.com) + + * mn10300.h: New file. + +Thu Jun 18 19:27:56 1998 Nick Clifton + + * common.h (EM_960, EM_V800, EM_FR20, EM_RH32, EM_MMA, + EM_OLD_ALPHA): Add these constants. + +Thu Jun 11 17:59:01 1998 Nick Clifton + + * common.h (EM_486, EM_S370): Add these constants. + +Tue Jun 9 09:35:29 1998 Nick Clifton + + * common.h (EM_ARM): Add this constant. + +Wed May 6 09:45:30 1998 Gavin Koch + + * mips.h (EF_MIPS_MACH,E_MIPS_MACH_*): Added. + +Sat Apr 25 18:35:06 1998 Richard Henderson + + * alpha.h (STO_ALPHA_NOPV, STO_ALPHA_STD_GPLOAD): New. + +Wed Apr 15 15:42:45 1998 Richard Henderson + + * common.h (EM_SPARC64): Move and rename to EM_OLD_SPARCV9. + (EM_SPARCV9): New. This is the official ABI name and number. + +Sat Feb 28 17:04:41 1998 Richard Henderson + + * alpha.h (EF_ALPHA_32BIT, EF_ALPHA_CANRELAX): New. + +Mon Dec 15 15:07:49 1997 Nick Clifton + + * m32r.h (EF_M32R_ARCH, E_M32R_ARCH): New flags to + specify machine architecture. + +Fri Dec 5 11:20:08 1997 Nick Clifton + + * v850.h: New constants: SHN_V850_SCOMMON, SHN_V850_TCOMMON, + SHN_V850_ZCOMMON, SHT_V850_SCOMMON, SHT_V850_TCOMMON, + SHT_V850_ZCOMMON to handle v850 common sections. + enum reloc_type renamed to v850_reloc_type to avoid name + conflict. + +Thu Oct 23 13:55:24 1997 Richard Henderson + + * sparc.h (enum elf_sparc_reloc_type): Add UA64 & UA16. + +Thu Oct 23 00:42:04 1997 Richard Henderson + + * sparc.h (DT_SPARC_REGISTER): New macro. + (DT_SPARC_PLTFMT): In support of old sparc64-linux .plts; will + go away soon. + +Tue Sep 30 13:26:58 1997 Doug Evans + + * sparc.h (EF_SPARC_HAL_R1, EF_SPARC_EXT_MASK): New macros. + (EF_SPARCV9_{MM,TSO,PSO,RMO}): New macros. + (SHN_BEFORE,SHN_AFTER): New macros. + (SHF_EXCLUDE,SHF_ORDERED): New macros. + (STT_REGISTER): New macro. + (R_SPARC_GLOB_JMP): Deleted, but slot reserved. + (R_SPARC_{DISP64,PLT64,HIX22,LOX10}): New relocations. + (R_SPARC_{H44,M44,L44,REGISTER}): New relocations. + (ELF64_R_TYPE_{DATA,ID,INFO}): New macros. + +Wed Sep 17 16:41:42 1997 Nick Clifton + + * v850.h: Add R_V850_CALLT_6_7_OFFSET and R_V850_CALLT_16_16_OFFSET. + +Tue Sep 16 14:16:17 1997 Nick Clifton + + * v850.h (reloc_type): Add R_V850_TDA_16_16_OFFSET. + +Wed Sep 3 15:11:14 1997 Richard Henderson + + * mips.h: Correct typo in comment. + +Wed Sep 3 11:25:57 1997 Nick Clifton + + * v850.h (reloc_type): Remove R_V850_16_PCREL. + +Tue Sep 2 17:41:05 1997 Nick Clifton + + * common.h: Remove magic number for V850E. + * common.h: Remove magic number for V850EA. + * v850.h: Add new flags for e_flags field in elf header. + +Mon Aug 25 16:06:47 1997 Nick Clifton + + * common.h (EM_CYGNUS_V850E): backend magic number for v850e. + * common.h (EM_CYGNUS_V850EA): backend magic number for v850ea. + +Mon Aug 18 11:05:23 1997 Nick Clifton + + * v850.h (reloc_type): Add 16 bit PC relative relocation. + +Fri Aug 15 05:10:09 1997 Doug Evans + + * arc.h (enum reloc): Move here from elf32-arc.c. + +Fri Aug 8 17:05:29 1997 Doug Evans + + * arc.h: New file. + * common.h (EM_CYGNUS_ARC): Define. + +Mon Jun 16 14:46:12 1997 Ian Lance Taylor + + * internal.h (Elf_Internal_Ehdr): Change e_phoff and e_shoff from + bfd_signed_vma to bfd_size_type, as they are not signed. + +Wed Mar 5 15:35:26 1997 Doug Evans + + * m32r.h (SHF_M32R_CAN_RELAX): Define. + +Mon Feb 24 17:49:01 1997 Ian Lance Taylor + + * external.h: Dump the 32/64 bit specific forms of the version + structures, and just define them as size independent. + + * common.h (VERSYM_HIDDEN, VERSYM_VERSION): Define. + +Fri Feb 21 13:00:34 1997 Doug Evans + + * m32r.h (enum reloc_type): Add R_M32R_SDA16. + (SHN_M32R_SCOMMON): Define. + +Wed Feb 19 15:35:31 1997 Ian Lance Taylor + + From Eric Youngdale : + * external.h, internal.h, common.h: Added new structures and + definitions for ELF versions. + +Tue Feb 18 17:40:36 1997 Martin M. Hunt + + * common.h (EM_CYGNUS_D30V): Define. + +Mon Jan 27 11:54:44 1997 Doug Evans + + * m32r.h (enum reloc_type): Add R_M32R_HI16_[SU]LO,R_M32R_LO16. + +Fri Jan 3 11:32:51 1997 Michael Meissner + + * v850.h (V850_OTHER_{TDA_BYTE,ERROR}): New bits for the st_other + field. + (SHN_V850_*): Remove v850 specific section indexes, which are not + needed. + (enum reloc_type): Move the v850 relocations here from + elf32-v850.c + +Thu Jan 2 19:30:23 1997 Michael Meissner + + * v850.h: New file, provide V850 specific definitions. + +Tue Dec 31 14:44:32 1996 Ian Lance Taylor + + * common.h (DT_AUXILIARY): Define. + (DT_FILTER): Define. + +Wed Dec 4 05:03:37 1996 Jason Merrill + + * dwarf2.h: Update. + +Tue Nov 26 10:44:47 1996 Ian Lance Taylor + + * mips.h (STO_MIPS16): Define. + +Tue Nov 12 15:45:42 1996 Martin M. Hunt + + * d10v.h: Remove empty file. + +Tue Oct 8 11:31:24 1996 Ian Lance Taylor + + * mips.h (EF_MIPS_ABI2): Define. + +Thu Oct 3 10:01:40 1996 Jeffrey A Law (law@cygnus.com) + + * common.h: Break mn10x00 support into mn10200 and mn10300. + +Wed Oct 2 21:26:43 1996 Jeffrey A Law (law@cygnus.com) + + * common.h (EM_CYGNUS_MN10x00): Define. + +Mon Sep 23 09:18:04 1996 Doug Evans + + * m32r.h: New file. + +Fri Aug 30 17:06:21 1996 Ian Lance Taylor + + * common.h (EM_SH): Define. + +Tue Aug 20 14:47:54 1996 J.T. Conklin + + * common.h (EM_CYGNUS_V850): Define. + +Mon Aug 19 10:59:10 1996 Doug Evans + + * common.h (EM_CYGNUS_M32R): Define. + +Mon Jul 22 18:59:55 1996 Ian Lance Taylor + + * mips.h (SHT_MIPS_IFACE, SHT_MIPS_CONTENT): Define. + (SHT_MIPS_SYMBOL_LIB): Define. + (SHF_MIPS_MERGE, SHF_MIPS_ADDR32, SHF_MIPS_ADDR64): Define. + (SHF_MIPS_NOSTRIP, SHF_MIPS_LOCAL, SHF_MIPS_NAMES): Define. + +Thu Jul 18 19:12:15 1996 Stan Shebs + + * dwarf2.h: New file. + +Jul 18 13:20:39 1996 Martin M. Hunt + + * common.h (EM_CYGNUS_D10V): Define. + * d10v.h: New file. + +Fri Jun 21 12:33:24 1996 Richard Henderson + + * alpha.h: New file. + * common.h (EM_ALPHA): Define. + +Fri May 31 17:28:05 1996 Ian Lance Taylor + + * mips.h (Elf_External_Options, Elf_Internal_Options): Define. + (bfd_mips_elf_swap_options_in): Declare. + (bfd_mips_elf_swap_options_out): Declare. + (ODK_*): Define. + (Elf64_External_RegInfo, Elf64_Internal_RegInfo): Define. + (bfd_mips_elf64_swap_reginfo_in): Declare. + (bfd_mips_elf64_swap_reginfo_out): Declare. + +Thu May 30 12:35:57 1996 Ian Lance Taylor + + * mips.h (E_MIPS_ARCH_4): Define. + +Wed May 29 15:35:33 1996 Ian Lance Taylor + + * mips.h (Elf64_Mips_External_Rel): Define. + (Elf64_Mips_Internal_Rel): Define. + (Elf64_Mips_External_Rela, Elf64_Mips_Internal_Rela): Define. + (RSS_*): Define. + +Mon Apr 22 18:26:30 1996 Doug Evans + + * sparc.h (R_SPARC_[56]): Always define. + +Mon Feb 19 01:55:56 1996 Doug Evans + + * sparc.h (R_SPARC_{PLT32,HIPLT22,LOPLT10,PCPLT32,PCPLT22, + PCPLT10,5,6}): Don't define ifdef SPARC64_OLD_RELOCS. + +Tue Feb 6 11:33:58 1996 Doug Evans + + * sparc.h (enum sparc_elf_reloc_type): Define. + +Wed Jan 17 09:09:16 1996 Doug Evans + + * common.h: Define EM_SPARC32PLUS. + * sparc.h: New file. + +Thu Jan 11 16:27:34 1996 Michael Meissner + + * ppc.h (SHF_EXCLUDE, SHT_ORDERED): New fields from the abi. + +Thu Nov 30 16:47:18 1995 Ian Lance Taylor + + * internal.h (struct elf_segment_map): Add includes_filehdr and + includes_phdrs fields. + +Tue Nov 28 16:58:10 1995 Ian Lance Taylor + + * internal.h (struct elf_segment_map): Define. + +Tue Oct 31 15:19:36 1995 Fred Fish + + * common.h, dwarf.h, external.h, hppa.h, internal.h, + mips.h, ppc.h: Protect against multiple inclusions. + +Thu Sep 21 13:51:58 1995 Michael Meissner + + * ppc.h (EF_PPC_RELOCATABLE_LIB): Add new flag bit. + +Fri Sep 1 15:32:17 1995 Kazumoto Kojima + + * mips.h: Add some definitions used on Irix 5. + +Tue Jun 20 10:18:28 1995 Jeff Law (law@snake.cs.utah.edu) + + * hppa.h (CPU_PA_RISC1_0): Protect from redefinitions. + (CPU_PA_RISC1_1): Likewise. + +Wed Mar 8 18:14:37 1995 Michael Meissner + + * ppc.h: New file for PowerPC support. + +Tue Feb 14 13:59:13 1995 Michael Meissner + + * common.h (EM_PPC): Use offical value of 20, not 17. + (EM_PPC_OLD): Define this to be the old value of EM_PPC. + +Tue Jan 24 09:40:59 1995 Michael Meissner + + * common.h (EM_PPC): New macro, PowerPC machine id. + +Tue Jan 17 10:51:38 1995 Ian Lance Taylor + + * mips.h (SHT_MIPS_MSYM, SHT_MIPS_DWARF, SHT_MIPS_EVENTS): Define. + +Mon Oct 17 13:43:59 1994 Ian Lance Taylor + + * internal.h (Elf_Internal_Shdr): Remove rawdata and size fields. + Add bfd_section field. + +Tue May 24 16:11:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (Elf32_External_gptab): Define. + +Mon May 16 13:22:04 1994 Jeff Law (law@snake.cs.utah.edu) + + * common.h (EM_HPPA): Delete. + (EM_PARISC): Add. + * hppa.h: New file. + +Mon May 9 13:27:03 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * common.h (SHN_LORESERVE): Rename from SHN_LORESERV. + (ELF32_R_TYPE, ELF32_R_INFO): Don't rely on size of unsigned char. + (ELF64_R_TYPE): Don't rely on size of unsigned long. + +Mon Apr 25 15:53:09 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * internal.h (Elf_Internal_Shdr): Use PTR, not void *. + +Fri Mar 11 00:34:59 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * mips.h (SHN_MIPS_TEXT, SHN_MIPS_DATA): Define. + +Sat Mar 5 14:08:54 1994 Peter Schauer (pes@regent.e-technik.tu-muenchen.de) + + * internal.h: Remove Elf32_*, Elf64_* typedefs. These names + cause conflicts with system headers, e.g. link.h in gdb/solib.c. + Combine 32- and 64-bit versions of *_Internal_Dyn. + * common.h: Replace uses of Elf64_Word, Elf64_Xword typedefs + by their expansion. + * mips.h: Replace uses of Elf32_Word, Elf32_Sword, Elf32_Addr + typedefs by their expansion. Add DT_MIPS_RLD_MAP definition. + +Fri Feb 18 10:39:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * common.h (EM_CYGNUS_POWERPC): Define. This may be temporary, + depending upon how quickly I can find a real PowerPC ABI. + +Mon Feb 7 08:27:13 1994 Jim Kingdon (kingdon@lioth.cygnus.com) + + * internal.h: Change HOST_64_BIT to BFD_HOST_64_BIT. + +Wed Feb 2 14:12:18 1994 Jim Kingdon (kingdon@lioth.cygnus.com) + + * common.h: Add comments regarding value of EM_HPPA and how to + pick an unofficial value. + +Wed Nov 17 17:14:26 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (SHT_MIPS_OPTIONS): Define. + +Mon Nov 8 17:57:00 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h: Added some more MIPS ABI macro definitions. + +Wed Nov 3 22:07:17 1993 Ken Raeburn (raeburn@rtl.cygnus.com) + + * common.h (EM_MIPS_RS4_BE): New macro. + +Tue Oct 12 07:28:18 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h: New file. MIPS ABI specific information. + +Mon Jun 21 13:13:43 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) + + * internal.h: Combined 32- and 64-bit versions of all structures + except *_Internal_Dyn. This will simply the assembler interface, + and some bfd code. + +Tue May 25 02:00:16 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * external.h, internal.h, common.h: Added 64-bit versions of some + structures and macros. Renamed old versions to put "32" in the + name. Some are unchanged. + +Thu Apr 29 12:12:20 1993 Ken Raeburn (raeburn@deneb.cygnus.com) + + * common.h (EM_HPPA, NT_VERSION, STN_UNDEF, DT_*): New macros. + * external.h (Elf_External_Dyn): New type. + + * internal.h (Elf_Intenral_Shdr): New field `size'. + (Elf_Internal_Dyn): New type. + +Tue Apr 20 16:03:45 1993 Fred Fish (fnf@cygnus.com) + + * dwarf.h (LANG_CHILL): Change value to one randomly picked in + the user defined range, to reduce probability of collisions. + +Sun Nov 15 09:34:02 1992 Fred Fish (fnf@cygnus.com) + + * dwarf.h (AT_src_coords): Whitespace change only. + * dwarf.h (AT_body_begin, AT_body_end, LANG_MODULA2): + Add from latest gcc. + * dwarf.h (LANG_CHILL): Add as GNU extension. + +Sat Aug 1 13:46:53 1992 Fred Fish (fnf@cygnus.com) + + * dwarf.h: Replace with current version from gcc distribution. + +Fri Jun 19 19:05:09 1992 John Gilmore (gnu at cygnus.com) + + * internal.h: Add real struct tags to all the Type_Defs, so they + can be used in prototypes where the Type_Defs are not known. + +Fri Apr 3 20:58:58 1992 Mark Eichin (eichin at cygnus.com) + + * common.h: added ELF_R_{SYM,TYPE,INFO} for handling relocation + info + added EM_MIPS, and corrected value of EM_860 based on System V ABI + manual. + + * external.h: added Elf_External_{Rel,Rela}. + + * internal.h: added Elf_Internal_{Rel,Rela}. + added rawdata to Elf_Internal_Shdr. + +Sat Nov 30 20:43:59 1991 Steve Chamberlain (sac at rtl.cygnus.com) + + * common.h, dwarf.h, external.h, internal.h, ChangeLog; moved from + ../elf- + + +Copyright (C) 1991-2003 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h new file mode 100644 index 0000000..4101603 --- /dev/null +++ b/include/elf/aarch64.h @@ -0,0 +1,327 @@ +/* AArch64 ELF support for BFD. + + Copyright 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + Contributed by ARM Ltd. + + This file is part of GNU Binutils. + + 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; see the file COPYING3. If not, + see . */ + +#ifndef _ELF_AARCH64_H +#define _ELF_AARCH64_H + +#include "elf/reloc-macros.h" + +/* Processor specific program header types. */ +#define PT_AARCH64_ARCHEXT (PT_LOPROC + 0) + +/* Additional section types. */ +#define SHT_AARCH64_ATTRIBUTES 0x70000003 /* Section holds attributes. */ + +/* AArch64-specific values for sh_flags. */ +#define SHF_ENTRYSECT 0x10000000 /* Section contains an + entry point. */ +#define SHF_COMDEF 0x80000000 /* Section may be multiply defined + in the input to a link step. */ + +/* Relocation types. */ + +START_RELOC_NUMBERS (elf_aarch64_reloc_type) + +/* Null relocations. */ +RELOC_NUMBER (R_AARCH64_NONE, 0) /* No reloc */ + +/* Basic data relocations. */ + +/* .word: (S+A) */ +RELOC_NUMBER (R_AARCH64_P32_ABS32, 1) + +/* .half: (S+A) */ +RELOC_NUMBER (R_AARCH64_P32_ABS16, 2) + +/* .word: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_P32_PREL32, 3) + +/* .half: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_P32_PREL16, 4) + +/* Group relocations to create a 16, 32, 48 or 64 bit + unsigned data or abs address inline. */ + +/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G0, 5) + +/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G0_NC, 6) + +/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_UABS_G1, 7) + +/* Group relocations to create high part of a 16, 32, 48 or 64 bit + signed data or abs address inline. Will change instruction + to MOVN or MOVZ depending on sign of calculated value. */ + +/* MOV[ZN]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_P32_MOVW_SABS_G0, 8) + +/* Relocations to generate 19, 21 and 33 bit PC-relative load/store + addresses: PG(x) is (x & ~0xfff). */ + +/* LD-lit: ((S+A-P) >> 2) & 0x7ffff */ +RELOC_NUMBER (R_AARCH64_P32_LD_PREL_LO19, 9) + +/* ADR: (S+A-P) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_P32_ADR_PREL_LO21, 10) + +/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_P32_ADR_PREL_PG_HI21, 11) + +/* ADD: (S+A) & 0xfff */ +RELOC_NUMBER (R_AARCH64_P32_ADD_ABS_LO12_NC, 12) + +/* LD/ST8: (S+A) & 0xfff */ +RELOC_NUMBER (R_AARCH64_P32_LDST8_ABS_LO12_NC, 13) + +/* LD/ST16: (S+A) & 0xffe */ +RELOC_NUMBER (R_AARCH64_P32_LDST16_ABS_LO12_NC, 14) + +/* LD/ST32: (S+A) & 0xffc */ +RELOC_NUMBER (R_AARCH64_P32_LDST32_ABS_LO12_NC, 15) + +/* LD/ST64: (S+A) & 0xff8 */ +RELOC_NUMBER (R_AARCH64_P32_LDST64_ABS_LO12_NC, 16) + +/* LD/ST128: (S+A) & 0xff0 */ +RELOC_NUMBER (R_AARCH64_P32_LDST128_ABS_LO12_NC, 17) + +/* Relocations for control-flow instructions. */ + +/* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff. */ +RELOC_NUMBER (R_AARCH64_P32_TSTBR14, 18) + +/* B.cond: ((S+A-P) >> 2) & 0x7ffff. */ +RELOC_NUMBER (R_AARCH64_P32_CONDBR19, 19) + +/* B: ((S+A-P) >> 2) & 0x3ffffff. */ +RELOC_NUMBER (R_AARCH64_P32_JUMP26, 20) + +/* BL: ((S+A-P) >> 2) & 0x3ffffff. */ +RELOC_NUMBER (R_AARCH64_P32_CALL26, 21) + + +RELOC_NUMBER (R_AARCH64_P32_GOT_LD_PREL19, 25) +RELOC_NUMBER (R_AARCH64_P32_ADR_GOT_PAGE, 26) +RELOC_NUMBER (R_AARCH64_P32_LD32_GOT_LO12_NC, 27) + + +RELOC_NUMBER (R_AARCH64_P32_TLSGD_ADR_PAGE21, 81) +RELOC_NUMBER (R_AARCH64_P32_TLSGD_ADD_LO12_NC, 82) +RELOC_NUMBER (R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21, 103) +RELOC_NUMBER (R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC, 104) +RELOC_NUMBER (R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19, 105) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G1, 106) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G0, 107) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC, 108) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_HI12, 109) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_LO12, 110) +RELOC_NUMBER (R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC, 111) + +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_LD_PREL19, 122) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADR_PREL21, 123) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADR_PAGE21, 124) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_LD32_LO12_NC, 125) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_ADD_LO12_NC, 126) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC_CALL, 127) + +/* Dynamic relocations */ + +/* Copy symbol at runtime. */ +RELOC_NUMBER (R_AARCH64_P32_COPY, 180) + +/* Create GOT entry. */ +RELOC_NUMBER (R_AARCH64_P32_GLOB_DAT, 181) + + /* Create PLT entry. */ +RELOC_NUMBER (R_AARCH64_P32_JUMP_SLOT, 182) + +/* Adjust by program base. */ +RELOC_NUMBER (R_AARCH64_P32_RELATIVE, 183) +RELOC_NUMBER (R_AARCH64_P32_TLS_DTPMOD, 184) +RELOC_NUMBER (R_AARCH64_P32_TLS_DTPREL, 185) +RELOC_NUMBER (R_AARCH64_P32_TLS_TPREL, 186) +RELOC_NUMBER (R_AARCH64_P32_TLSDESC, 187) +RELOC_NUMBER (R_AARCH64_P32_IRELATIVE, 188) + +RELOC_NUMBER (R_AARCH64_NULL, 256) /* No reloc */ + +/* Basic data relocations. */ + +/* .xword: (S+A) */ +RELOC_NUMBER (R_AARCH64_ABS64, 257) + +/* .word: (S+A) */ +RELOC_NUMBER (R_AARCH64_ABS32, 258) + +/* .half: (S+A) */ +RELOC_NUMBER (R_AARCH64_ABS16, 259) + +/* .xword: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_PREL64, 260) + +/* .word: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_PREL32, 261) + +/* .half: (S+A-P) */ +RELOC_NUMBER (R_AARCH64_PREL16, 262) + +/* Group relocations to create a 16, 32, 48 or 64 bit + unsigned data or abs address inline. */ + +/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G0, 263) + +/* MOV[ZK]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G0_NC, 264) + +/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G1, 265) + +/* MOV[ZK]: ((S+A) >> 16) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G1_NC, 266) + +/* MOV[ZK]: ((S+A) >> 32) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G2, 267) + +/* MOV[ZK]: ((S+A) >> 32) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G2_NC, 268) + +/* MOV[ZK]: ((S+A) >> 48) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_UABS_G3, 269) + +/* Group relocations to create high part of a 16, 32, 48 or 64 bit + signed data or abs address inline. Will change instruction + to MOVN or MOVZ depending on sign of calculated value. */ + +/* MOV[ZN]: ((S+A) >> 0) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_SABS_G0, 270) + +/* MOV[ZN]: ((S+A) >> 16) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_SABS_G1, 271) + +/* MOV[ZN]: ((S+A) >> 32) & 0xffff */ +RELOC_NUMBER (R_AARCH64_MOVW_SABS_G2, 272) + +/* Relocations to generate 19, 21 and 33 bit PC-relative load/store + addresses: PG(x) is (x & ~0xfff). */ + +/* LD-lit: ((S+A-P) >> 2) & 0x7ffff */ +RELOC_NUMBER (R_AARCH64_LD_PREL_LO19, 273) + +/* ADR: (S+A-P) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_ADR_PREL_LO21, 274) + +/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_ADR_PREL_PG_HI21, 275) + +/* ADRH: ((PG(S+A)-PG(P)) >> 12) & 0x1fffff */ +RELOC_NUMBER (R_AARCH64_ADR_PREL_PG_HI21_NC, 276) + +/* ADD: (S+A) & 0xfff */ +RELOC_NUMBER (R_AARCH64_ADD_ABS_LO12_NC, 277) + +/* LD/ST8: (S+A) & 0xfff */ +RELOC_NUMBER (R_AARCH64_LDST8_ABS_LO12_NC, 278) + +/* Relocations for control-flow instructions. */ + +/* TBZ/NZ: ((S+A-P) >> 2) & 0x3fff. */ +RELOC_NUMBER (R_AARCH64_TSTBR14, 279) + +/* B.cond: ((S+A-P) >> 2) & 0x7ffff. */ +RELOC_NUMBER (R_AARCH64_CONDBR19, 280) + +/* 281 unused */ + +/* B: ((S+A-P) >> 2) & 0x3ffffff. */ +RELOC_NUMBER (R_AARCH64_JUMP26, 282) + +/* BL: ((S+A-P) >> 2) & 0x3ffffff. */ +RELOC_NUMBER (R_AARCH64_CALL26, 283) + +/* LD/ST16: (S+A) & 0xffe */ +RELOC_NUMBER (R_AARCH64_LDST16_ABS_LO12_NC, 284) + +/* LD/ST32: (S+A) & 0xffc */ +RELOC_NUMBER (R_AARCH64_LDST32_ABS_LO12_NC, 285) + +/* LD/ST64: (S+A) & 0xff8 */ +RELOC_NUMBER (R_AARCH64_LDST64_ABS_LO12_NC, 286) + +/* LD/ST128: (S+A) & 0xff0 */ +RELOC_NUMBER (R_AARCH64_LDST128_ABS_LO12_NC, 299) + +RELOC_NUMBER (R_AARCH64_GOT_LD_PREL19, 309) +RELOC_NUMBER (R_AARCH64_ADR_GOT_PAGE, 311) +RELOC_NUMBER (R_AARCH64_LD64_GOT_LO12_NC, 312) + +RELOC_NUMBER (R_AARCH64_TLSGD_ADR_PAGE21, 513) +RELOC_NUMBER (R_AARCH64_TLSGD_ADD_LO12_NC, 514) +RELOC_NUMBER (R_AARCH64_TLSIE_MOVW_GOTTPREL_G1, 539) +RELOC_NUMBER (R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC, 540) +RELOC_NUMBER (R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21, 541) +RELOC_NUMBER (R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC, 542) +RELOC_NUMBER (R_AARCH64_TLSIE_LD_GOTTPREL_PREL19, 543) +RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G2, 544) +RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G1, 545) +RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G1_NC, 546) +RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G0, 547) +RELOC_NUMBER (R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, 548) +RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_HI12, 549) +RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_LO12, 550) +RELOC_NUMBER (R_AARCH64_TLSLE_ADD_TPREL_LO12_NC, 551) + +RELOC_NUMBER (R_AARCH64_TLSDESC_LD_PREL19, 560) +RELOC_NUMBER (R_AARCH64_TLSDESC_ADR_PREL21, 561) +RELOC_NUMBER (R_AARCH64_TLSDESC_ADR_PAGE21, 562) +RELOC_NUMBER (R_AARCH64_TLSDESC_LD64_LO12_NC, 563) +RELOC_NUMBER (R_AARCH64_TLSDESC_ADD_LO12_NC, 564) +RELOC_NUMBER (R_AARCH64_TLSDESC_OFF_G1, 565) +RELOC_NUMBER (R_AARCH64_TLSDESC_OFF_G0_NC, 566) +RELOC_NUMBER (R_AARCH64_TLSDESC_LDR, 567) +RELOC_NUMBER (R_AARCH64_TLSDESC_ADD, 568) +RELOC_NUMBER (R_AARCH64_TLSDESC_CALL, 569) + +/* Dynamic relocations */ + +/* Copy symbol at runtime. */ +RELOC_NUMBER (R_AARCH64_COPY, 1024) + +/* Create GOT entry. */ +RELOC_NUMBER (R_AARCH64_GLOB_DAT, 1025) + + /* Create PLT entry. */ +RELOC_NUMBER (R_AARCH64_JUMP_SLOT, 1026) + +/* Adjust by program base. */ +RELOC_NUMBER (R_AARCH64_RELATIVE, 1027) +RELOC_NUMBER (R_AARCH64_TLS_DTPMOD, 1028) +RELOC_NUMBER (R_AARCH64_TLS_DTPREL, 1029) +RELOC_NUMBER (R_AARCH64_TLS_TPREL, 1030) +RELOC_NUMBER (R_AARCH64_TLSDESC, 1031) +RELOC_NUMBER (R_AARCH64_IRELATIVE, 1032) + +END_RELOC_NUMBERS (R_AARCH64_end) + +#endif /* _ELF_AARCH64_H */ diff --git a/include/elf/alpha.h b/include/elf/alpha.h new file mode 100644 index 0000000..f4fe566 --- /dev/null +++ b/include/elf/alpha.h @@ -0,0 +1,131 @@ +/* ALPHA ELF support for BFD. + Copyright 1996, 1998, 2000, 2001, 2002, 2010 Free Software Foundation, Inc. + + By Eric Youngdale, . No processor supplement available + for this platform. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the ALPHA ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_ALPHA_H +#define _ELF_ALPHA_H + +/* Processor specific flags for the ELF header e_flags field. */ + +/* All addresses must be below 2GB. */ +#define EF_ALPHA_32BIT 0x00000001 + +/* All relocations needed for relaxation with code movement are present. */ +#define EF_ALPHA_CANRELAX 0x00000002 + +/* Processor specific section flags. */ + +/* This section must be in the global data area. */ +#define SHF_ALPHA_GPREL 0x10000000 + +/* Section contains some sort of debugging information. The exact + format is unspecified. It's probably ECOFF symbols. */ +#define SHT_ALPHA_DEBUG 0x70000001 + +/* Section contains register usage information. */ +#define SHT_ALPHA_REGINFO 0x70000002 + +/* A section of type SHT_MIPS_REGINFO contains the following + structure. */ +typedef struct +{ + /* Mask of general purpose registers used. */ + unsigned long ri_gprmask; + /* Mask of co-processor registers used. */ + unsigned long ri_cprmask[4]; + /* GP register value for this object file. */ + long ri_gp_value; +} Elf64_RegInfo; + +/* Special values for the st_other field in the symbol table. */ + +#define STO_ALPHA_NOPV 0x80 +#define STO_ALPHA_STD_GPLOAD 0x88 + +/* Special values for Elf64_Dyn tag. */ +#define DT_ALPHA_PLTRO DT_LOPROC + +#include "elf/reloc-macros.h" + +/* Alpha relocs. */ +START_RELOC_NUMBERS (elf_alpha_reloc_type) + RELOC_NUMBER (R_ALPHA_NONE, 0) /* No reloc */ + RELOC_NUMBER (R_ALPHA_REFLONG, 1) /* Direct 32 bit */ + RELOC_NUMBER (R_ALPHA_REFQUAD, 2) /* Direct 64 bit */ + RELOC_NUMBER (R_ALPHA_GPREL32, 3) /* GP relative 32 bit */ + RELOC_NUMBER (R_ALPHA_LITERAL, 4) /* GP relative 16 bit w/optimization */ + RELOC_NUMBER (R_ALPHA_LITUSE, 5) /* Optimization hint for LITERAL */ + RELOC_NUMBER (R_ALPHA_GPDISP, 6) /* Add displacement to GP */ + RELOC_NUMBER (R_ALPHA_BRADDR, 7) /* PC+4 relative 23 bit shifted */ + RELOC_NUMBER (R_ALPHA_HINT, 8) /* PC+4 relative 16 bit shifted */ + RELOC_NUMBER (R_ALPHA_SREL16, 9) /* PC relative 16 bit */ + RELOC_NUMBER (R_ALPHA_SREL32, 10) /* PC relative 32 bit */ + RELOC_NUMBER (R_ALPHA_SREL64, 11) /* PC relative 64 bit */ + + /* Skip 12 - 16; deprecated ECOFF relocs. */ + + RELOC_NUMBER (R_ALPHA_GPRELHIGH, 17) /* GP relative 32 bit, high 16 bits */ + RELOC_NUMBER (R_ALPHA_GPRELLOW, 18) /* GP relative 32 bit, low 16 bits */ + RELOC_NUMBER (R_ALPHA_GPREL16, 19) /* GP relative 16 bit */ + + /* Skip 20 - 23; deprecated ECOFF relocs. */ + + /* These relocations are specific to shared libraries. */ + RELOC_NUMBER (R_ALPHA_COPY, 24) /* Copy symbol at runtime */ + RELOC_NUMBER (R_ALPHA_GLOB_DAT, 25) /* Create GOT entry */ + RELOC_NUMBER (R_ALPHA_JMP_SLOT, 26) /* Create PLT entry */ + RELOC_NUMBER (R_ALPHA_RELATIVE, 27) /* Adjust by program base */ + + /* Like BRADDR, but assert that the source and target object file + share the same GP value, and adjust the target address for + STO_ALPHA_STD_GPLOAD. */ + RELOC_NUMBER (R_ALPHA_BRSGP, 28) + + /* Thread-Local Storage. */ + RELOC_NUMBER (R_ALPHA_TLSGD, 29) + RELOC_NUMBER (R_ALPHA_TLSLDM, 30) + RELOC_NUMBER (R_ALPHA_DTPMOD64, 31) + RELOC_NUMBER (R_ALPHA_GOTDTPREL, 32) + RELOC_NUMBER (R_ALPHA_DTPREL64, 33) + RELOC_NUMBER (R_ALPHA_DTPRELHI, 34) + RELOC_NUMBER (R_ALPHA_DTPRELLO, 35) + RELOC_NUMBER (R_ALPHA_DTPREL16, 36) + RELOC_NUMBER (R_ALPHA_GOTTPREL, 37) + RELOC_NUMBER (R_ALPHA_TPREL64, 38) + RELOC_NUMBER (R_ALPHA_TPRELHI, 39) + RELOC_NUMBER (R_ALPHA_TPRELLO, 40) + RELOC_NUMBER (R_ALPHA_TPREL16, 41) + +END_RELOC_NUMBERS (R_ALPHA_max) + +#define LITUSE_ALPHA_ADDR 0 +#define LITUSE_ALPHA_BASE 1 +#define LITUSE_ALPHA_BYTOFF 2 +#define LITUSE_ALPHA_JSR 3 +#define LITUSE_ALPHA_TLSGD 4 +#define LITUSE_ALPHA_TLSLDM 5 +#define LITUSE_ALPHA_JSRDIRECT 6 + +#endif /* _ELF_ALPHA_H */ diff --git a/include/elf/arc.h b/include/elf/arc.h new file mode 100644 index 0000000..a07ed2e --- /dev/null +++ b/include/elf/arc.h @@ -0,0 +1,57 @@ +/* ARC ELF support for BFD. + Copyright 1995, 1997, 1998, 2000, 2001, 2010 Free Software Foundation, Inc. + Contributed by Doug Evans, (dje@cygnus.com) + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the ARC ELF ABI. */ + +#ifndef _ELF_ARC_H +#define _ELF_ARC_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ + +START_RELOC_NUMBERS (elf_arc_reloc_type) + RELOC_NUMBER (R_ARC_NONE, 0) + RELOC_NUMBER (R_ARC_32, 1) + RELOC_NUMBER (R_ARC_B26, 2) + RELOC_NUMBER (R_ARC_B22_PCREL, 3) +END_RELOC_NUMBERS (R_ARC_max) + +/* Processor specific flags for the ELF header e_flags field. */ + +/* Four bit ARC machine type field. */ + +#define EF_ARC_MACH 0x0000000f + +/* Various CPU types. */ + +#define E_ARC_MACH_ARC5 0 +#define E_ARC_MACH_ARC6 1 +#define E_ARC_MACH_ARC7 2 +#define E_ARC_MACH_ARC8 3 + +/* Leave bits 0xf0 alone in case we ever have more than 16 cpu types. */ + +/* File contains position independent code. */ + +#define EF_ARC_PIC 0x00000100 + +#endif /* _ELF_ARC_H */ diff --git a/include/elf/arm.h b/include/elf/arm.h new file mode 100644 index 0000000..d799303 --- /dev/null +++ b/include/elf/arm.h @@ -0,0 +1,344 @@ +/* ARM ELF support for BFD. + Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_ARM_H +#define _ELF_ARM_H + +#include "elf/reloc-macros.h" + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_ARM_RELEXEC 0x01 +#define EF_ARM_HASENTRY 0x02 +#define EF_ARM_INTERWORK 0x04 +#define EF_ARM_APCS_26 0x08 +#define EF_ARM_APCS_FLOAT 0x10 +#define EF_ARM_PIC 0x20 +#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use. */ +#define EF_ARM_NEW_ABI 0x80 +#define EF_ARM_OLD_ABI 0x100 +#define EF_ARM_SOFT_FLOAT 0x200 +#define EF_ARM_VFP_FLOAT 0x400 +#define EF_ARM_MAVERICK_FLOAT 0x800 + +/* Frame unwind information */ +#define PT_ARM_EXIDX (PT_LOPROC + 1) + +/* Other constants defined in the ARM ELF spec. version B-01. */ +#define EF_ARM_SYMSARESORTED 0x04 /* NB conflicts with EF_INTERWORK. */ +#define EF_ARM_DYNSYMSUSESEGIDX 0x08 /* NB conflicts with EF_APCS26. */ +#define EF_ARM_MAPSYMSFIRST 0x10 /* NB conflicts with EF_APCS_FLOAT. */ +#define EF_ARM_EABIMASK 0xFF000000 + +/* New constants defined in the ARM ELF spec. version XXX. + Only valid in conjunction with EF_ARM_EABI_VER5. */ +#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT. */ +#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT. */ + +/* Constants defined in AAELF. */ +#define EF_ARM_BE8 0x00800000 +#define EF_ARM_LE8 0x00400000 + +#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +#define EF_ARM_EABI_UNKNOWN 0x00000000 +#define EF_ARM_EABI_VER1 0x01000000 +#define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER3 0x03000000 +#define EF_ARM_EABI_VER4 0x04000000 +#define EF_ARM_EABI_VER5 0x05000000 + +/* Local aliases for some flags to match names used by COFF port. */ +#define F_INTERWORK EF_ARM_INTERWORK +#define F_APCS26 EF_ARM_APCS_26 +#define F_APCS_FLOAT EF_ARM_APCS_FLOAT +#define F_PIC EF_ARM_PIC +#define F_SOFT_FLOAT EF_ARM_SOFT_FLOAT +#define F_VFP_FLOAT EF_ARM_VFP_FLOAT + +/* Additional symbol types for Thumb. */ +#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */ +#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ + +/* Additional section types. */ +#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */ +#define SHT_ARM_PREEMPTMAP 0x70000002 /* Section pre-emption details. */ +#define SHT_ARM_ATTRIBUTES 0x70000003 /* Section holds attributes. */ +#define SHT_ARM_DEBUGOVERLAY 0x70000004 /* Section holds overlay debug info. */ +#define SHT_ARM_OVERLAYSECTION 0x70000005 /* Section holds GDB and overlay integration info. */ + +/* ARM-specific values for sh_flags. */ +#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */ +#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step. */ + +/* ARM-specific program header flags. */ +#define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base. */ +#define PF_ARM_PI 0x20000000 /* Segment is position-independent. */ +#define PF_ARM_ABS 0x40000000 /* Segment must be loaded at its base address. */ + +/* Values for the Tag_CPU_arch EABI attribute. */ +#define TAG_CPU_ARCH_PRE_V4 0 +#define TAG_CPU_ARCH_V4 1 +#define TAG_CPU_ARCH_V4T 2 +#define TAG_CPU_ARCH_V5T 3 +#define TAG_CPU_ARCH_V5TE 4 +#define TAG_CPU_ARCH_V5TEJ 5 +#define TAG_CPU_ARCH_V6 6 +#define TAG_CPU_ARCH_V6KZ 7 +#define TAG_CPU_ARCH_V6T2 8 +#define TAG_CPU_ARCH_V6K 9 +#define TAG_CPU_ARCH_V7 10 +#define TAG_CPU_ARCH_V6_M 11 +#define TAG_CPU_ARCH_V6S_M 12 +#define TAG_CPU_ARCH_V7E_M 13 +#define TAG_CPU_ARCH_V8 14 +#define MAX_TAG_CPU_ARCH 14 +/* Pseudo-architecture to allow objects to be compatible with the subset of + armv4t and armv6-m. This value should never be stored in object files. */ +#define TAG_CPU_ARCH_V4T_PLUS_V6_M (MAX_TAG_CPU_ARCH + 1) + +/* Relocation types. */ + +START_RELOC_NUMBERS (elf_arm_reloc_type) +/* AAELF official names and numbers. */ + RELOC_NUMBER (R_ARM_NONE, 0) + RELOC_NUMBER (R_ARM_PC24, 1) /* deprecated */ + RELOC_NUMBER (R_ARM_ABS32, 2) + RELOC_NUMBER (R_ARM_REL32, 3) + RELOC_NUMBER (R_ARM_LDR_PC_G0, 4) + RELOC_NUMBER (R_ARM_ABS16, 5) + RELOC_NUMBER (R_ARM_ABS12, 6) + RELOC_NUMBER (R_ARM_THM_ABS5, 7) + RELOC_NUMBER (R_ARM_ABS8, 8) + RELOC_NUMBER (R_ARM_SBREL32, 9) + RELOC_NUMBER (R_ARM_THM_CALL, 10) + RELOC_NUMBER (R_ARM_THM_PC8, 11) + RELOC_NUMBER (R_ARM_BREL_ADJ, 12) + RELOC_NUMBER (R_ARM_TLS_DESC, 13) + RELOC_NUMBER (R_ARM_THM_SWI8, 14) /* obsolete */ + RELOC_NUMBER (R_ARM_XPC25, 15) /* obsolete */ + RELOC_NUMBER (R_ARM_THM_XPC22, 16) /* obsolete */ + RELOC_NUMBER (R_ARM_TLS_DTPMOD32, 17) + RELOC_NUMBER (R_ARM_TLS_DTPOFF32, 18) + RELOC_NUMBER (R_ARM_TLS_TPOFF32, 19) + RELOC_NUMBER (R_ARM_COPY, 20) /* Copy symbol at runtime. */ + RELOC_NUMBER (R_ARM_GLOB_DAT, 21) /* Create GOT entry. */ + RELOC_NUMBER (R_ARM_JUMP_SLOT, 22) /* Create PLT entry. */ + RELOC_NUMBER (R_ARM_RELATIVE, 23) /* Adjust by program base. */ + RELOC_NUMBER (R_ARM_GOTOFF32, 24) /* 32 bit offset to GOT. */ + RELOC_NUMBER (R_ARM_BASE_PREL, 25) /* 32 bit PC relative offset to GOT. */ + RELOC_NUMBER (R_ARM_GOT_BREL, 26) /* 32 bit GOT entry. */ + RELOC_NUMBER (R_ARM_PLT32, 27) /* deprecated - 32 bit PLT address. */ + RELOC_NUMBER (R_ARM_CALL, 28) + RELOC_NUMBER (R_ARM_JUMP24, 29) + RELOC_NUMBER (R_ARM_THM_JUMP24, 30) + RELOC_NUMBER (R_ARM_BASE_ABS, 31) + RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32) /* obsolete */ + RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33) /* obsolete */ + RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34) /* obsolete */ + RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35) /* deprecated, should have _NC suffix */ + RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36) /* deprecated, should have _NC suffix */ + RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37) /* deprecated, should have _CK suffix */ + RELOC_NUMBER (R_ARM_TARGET1, 38) + RELOC_NUMBER (R_ARM_SBREL31, 39) /* deprecated */ + RELOC_NUMBER (R_ARM_V4BX, 40) + RELOC_NUMBER (R_ARM_TARGET2, 41) + RELOC_NUMBER (R_ARM_PREL31, 42) + RELOC_NUMBER (R_ARM_MOVW_ABS_NC, 43) + RELOC_NUMBER (R_ARM_MOVT_ABS, 44) + RELOC_NUMBER (R_ARM_MOVW_PREL_NC, 45) + RELOC_NUMBER (R_ARM_MOVT_PREL, 46) + RELOC_NUMBER (R_ARM_THM_MOVW_ABS_NC, 47) + RELOC_NUMBER (R_ARM_THM_MOVT_ABS, 48) + RELOC_NUMBER (R_ARM_THM_MOVW_PREL_NC, 49) + RELOC_NUMBER (R_ARM_THM_MOVT_PREL, 50) + RELOC_NUMBER (R_ARM_THM_JUMP19, 51) + RELOC_NUMBER (R_ARM_THM_JUMP6, 52) + RELOC_NUMBER (R_ARM_THM_ALU_PREL_11_0, 53) + RELOC_NUMBER (R_ARM_THM_PC12, 54) + RELOC_NUMBER (R_ARM_ABS32_NOI, 55) + RELOC_NUMBER (R_ARM_REL32_NOI, 56) + RELOC_NUMBER (R_ARM_ALU_PC_G0_NC, 57) + RELOC_NUMBER (R_ARM_ALU_PC_G0, 58) + RELOC_NUMBER (R_ARM_ALU_PC_G1_NC, 59) + RELOC_NUMBER (R_ARM_ALU_PC_G1, 60) + RELOC_NUMBER (R_ARM_ALU_PC_G2, 61) + RELOC_NUMBER (R_ARM_LDR_PC_G1, 62) + RELOC_NUMBER (R_ARM_LDR_PC_G2, 63) + RELOC_NUMBER (R_ARM_LDRS_PC_G0, 64) + RELOC_NUMBER (R_ARM_LDRS_PC_G1, 65) + RELOC_NUMBER (R_ARM_LDRS_PC_G2, 66) + RELOC_NUMBER (R_ARM_LDC_PC_G0, 67) + RELOC_NUMBER (R_ARM_LDC_PC_G1, 68) + RELOC_NUMBER (R_ARM_LDC_PC_G2, 69) + RELOC_NUMBER (R_ARM_ALU_SB_G0_NC, 70) + RELOC_NUMBER (R_ARM_ALU_SB_G0, 71) + RELOC_NUMBER (R_ARM_ALU_SB_G1_NC, 72) + RELOC_NUMBER (R_ARM_ALU_SB_G1, 73) + RELOC_NUMBER (R_ARM_ALU_SB_G2, 74) + RELOC_NUMBER (R_ARM_LDR_SB_G0, 75) + RELOC_NUMBER (R_ARM_LDR_SB_G1, 76) + RELOC_NUMBER (R_ARM_LDR_SB_G2, 77) + RELOC_NUMBER (R_ARM_LDRS_SB_G0, 78) + RELOC_NUMBER (R_ARM_LDRS_SB_G1, 79) + RELOC_NUMBER (R_ARM_LDRS_SB_G2, 80) + RELOC_NUMBER (R_ARM_LDC_SB_G0, 81) + RELOC_NUMBER (R_ARM_LDC_SB_G1, 82) + RELOC_NUMBER (R_ARM_LDC_SB_G2, 83) + RELOC_NUMBER (R_ARM_MOVW_BREL_NC, 84) + RELOC_NUMBER (R_ARM_MOVT_BREL, 85) + RELOC_NUMBER (R_ARM_MOVW_BREL, 86) + RELOC_NUMBER (R_ARM_THM_MOVW_BREL_NC, 87) + RELOC_NUMBER (R_ARM_THM_MOVT_BREL, 88) + RELOC_NUMBER (R_ARM_THM_MOVW_BREL, 89) + RELOC_NUMBER (R_ARM_TLS_GOTDESC, 90) + RELOC_NUMBER (R_ARM_TLS_CALL, 91) + RELOC_NUMBER (R_ARM_TLS_DESCSEQ, 92) + RELOC_NUMBER (R_ARM_THM_TLS_CALL, 93) + RELOC_NUMBER (R_ARM_PLT32_ABS, 94) + RELOC_NUMBER (R_ARM_GOT_ABS, 95) + RELOC_NUMBER (R_ARM_GOT_PREL, 96) + RELOC_NUMBER (R_ARM_GOT_BREL12, 97) + RELOC_NUMBER (R_ARM_GOTOFF12, 98) + RELOC_NUMBER (R_ARM_GOTRELAX, 99) + RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100) /* deprecated - old C++ abi */ + RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101) /* deprecated - old C++ abi */ + RELOC_NUMBER (R_ARM_THM_JUMP11, 102) + RELOC_NUMBER (R_ARM_THM_JUMP8, 103) + RELOC_NUMBER (R_ARM_TLS_GD32, 104) + RELOC_NUMBER (R_ARM_TLS_LDM32, 105) + RELOC_NUMBER (R_ARM_TLS_LDO32, 106) + RELOC_NUMBER (R_ARM_TLS_IE32, 107) + RELOC_NUMBER (R_ARM_TLS_LE32, 108) + RELOC_NUMBER (R_ARM_TLS_LDO12, 109) + RELOC_NUMBER (R_ARM_TLS_LE12, 110) + RELOC_NUMBER (R_ARM_TLS_IE12GP, 111) + /* 112 - 127 private range */ + RELOC_NUMBER (R_ARM_ME_TOO, 128) /* obsolete */ + RELOC_NUMBER (R_ARM_THM_TLS_DESCSEQ ,129) + + RELOC_NUMBER (R_ARM_IRELATIVE, 160) + + /* Extensions? R=read-only? */ + RELOC_NUMBER (R_ARM_RXPC25, 249) + RELOC_NUMBER (R_ARM_RSBREL32, 250) + RELOC_NUMBER (R_ARM_THM_RPC22, 251) + RELOC_NUMBER (R_ARM_RREL32, 252) + RELOC_NUMBER (R_ARM_RABS32, 253) + RELOC_NUMBER (R_ARM_RPC24, 254) + RELOC_NUMBER (R_ARM_RBASE, 255) + + /* Unofficial names for some of the relocs. */ + FAKE_RELOC (R_ARM_GOTOFF, R_ARM_GOTOFF32) /* 32 bit offset to GOT. */ + FAKE_RELOC (R_ARM_THM_PC22, R_ARM_THM_CALL) + FAKE_RELOC (R_ARM_THM_PC11, R_ARM_THM_JUMP11) + FAKE_RELOC (R_ARM_THM_PC9, R_ARM_THM_JUMP8) + + /* Relocs with both a different name, and (apparently) different meaning in + GNU usage. */ + FAKE_RELOC (R_ARM_GOTPC, R_ARM_BASE_PREL) /* 32 bit PC relative offset to GOT. */ + FAKE_RELOC (R_ARM_GOT32, R_ARM_GOT_BREL) /* 32 bit GOT entry. */ + FAKE_RELOC (R_ARM_ROSEGREL32, R_ARM_SBREL31) /* ??? */ + FAKE_RELOC (R_ARM_AMP_VCALL9, R_ARM_BREL_ADJ) /* Thumb-something. Not used. */ + +END_RELOC_NUMBERS (R_ARM_max = 256) + +#ifdef BFD_ARCH_SIZE +/* EABI object attributes. */ + +enum +{ + /* 0-3 are generic. */ + Tag_CPU_raw_name = 4, + Tag_CPU_name, + Tag_CPU_arch, + Tag_CPU_arch_profile, + Tag_ARM_ISA_use, + Tag_THUMB_ISA_use, + Tag_FP_arch, + Tag_WMMX_arch, + Tag_Advanced_SIMD_arch, + Tag_PCS_config, + Tag_ABI_PCS_R9_use, + Tag_ABI_PCS_RW_data, + Tag_ABI_PCS_RO_data, + Tag_ABI_PCS_GOT_use, + Tag_ABI_PCS_wchar_t, + Tag_ABI_FP_rounding, + Tag_ABI_FP_denormal, + Tag_ABI_FP_exceptions, + Tag_ABI_FP_user_exceptions, + Tag_ABI_FP_number_model, + Tag_ABI_align_needed, + Tag_ABI_align_preserved, + Tag_ABI_enum_size, + Tag_ABI_HardFP_use, + Tag_ABI_VFP_args, + Tag_ABI_WMMX_args, + Tag_ABI_optimization_goals, + Tag_ABI_FP_optimization_goals, + /* 32 is generic (Tag_compatibility). */ + Tag_undefined33 = 33, + Tag_CPU_unaligned_access, + Tag_undefined35, + Tag_FP_HP_extension, + Tag_undefined37, + Tag_ABI_FP_16bit_format, + Tag_undefined39, + Tag_undefined40, + Tag_undefined41, + Tag_MPextension_use, + Tag_undefined_43, + Tag_DIV_use, + Tag_nodefaults = 64, + Tag_also_compatible_with, + Tag_T2EE_use, + Tag_conformance, + Tag_Virtualization_use, + Tag_undefined69, + Tag_MPextension_use_legacy, + + /* The following tags are legacy names for other tags. */ + Tag_VFP_arch = Tag_FP_arch, + Tag_ABI_align8_needed = Tag_ABI_align_needed, + Tag_ABI_align8_preserved = Tag_ABI_align_preserved, + Tag_VFP_HP_extension = Tag_FP_HP_extension +}; + +#endif + +/* The name of the note section used to identify arm variants. */ +#define ARM_NOTE_SECTION ".note.gnu.arm.ident" + +/* Special section names. */ +#define ELF_STRING_ARM_unwind ".ARM.exidx" +#define ELF_STRING_ARM_unwind_info ".ARM.extab" +#define ELF_STRING_ARM_unwind_once ".gnu.linkonce.armexidx." +#define ELF_STRING_ARM_unwind_info_once ".gnu.linkonce.armextab." + +enum arm_st_branch_type { + ST_BRANCH_TO_ARM, + ST_BRANCH_TO_THUMB, + ST_BRANCH_LONG, + ST_BRANCH_UNKNOWN +}; + +#define ARM_SYM_BRANCH_TYPE(SYM) \ + ((enum arm_st_branch_type) (SYM)->st_target_internal) + +#endif /* _ELF_ARM_H */ diff --git a/include/elf/avr.h b/include/elf/avr.h new file mode 100644 index 0000000..b45d902 --- /dev/null +++ b/include/elf/avr.h @@ -0,0 +1,86 @@ +/* AVR ELF support for BFD. + Copyright 1999, 2000, 2004, 2006, 2010, 2012 + Free Software Foundation, Inc. + Contributed by Denis Chertykov + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_AVR_H +#define _ELF_AVR_H + +#include "elf/reloc-macros.h" + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_AVR_MACH 0x7F + +/* If bit #7 is set, it is assumed that the elf file uses local symbols + as reference for the relocations so that linker relaxation is possible. */ +#define EF_AVR_LINKRELAX_PREPARED 0x80 + +#define E_AVR_MACH_AVR1 1 +#define E_AVR_MACH_AVR2 2 +#define E_AVR_MACH_AVR25 25 +#define E_AVR_MACH_AVR3 3 +#define E_AVR_MACH_AVR31 31 +#define E_AVR_MACH_AVR35 35 +#define E_AVR_MACH_AVR4 4 +#define E_AVR_MACH_AVR5 5 +#define E_AVR_MACH_AVR51 51 +#define E_AVR_MACH_AVR6 6 +#define E_AVR_MACH_XMEGA1 101 +#define E_AVR_MACH_XMEGA2 102 +#define E_AVR_MACH_XMEGA3 103 +#define E_AVR_MACH_XMEGA4 104 +#define E_AVR_MACH_XMEGA5 105 +#define E_AVR_MACH_XMEGA6 106 +#define E_AVR_MACH_XMEGA7 107 + +/* Relocations. */ +START_RELOC_NUMBERS (elf_avr_reloc_type) + RELOC_NUMBER (R_AVR_NONE, 0) + RELOC_NUMBER (R_AVR_32, 1) + RELOC_NUMBER (R_AVR_7_PCREL, 2) + RELOC_NUMBER (R_AVR_13_PCREL, 3) + RELOC_NUMBER (R_AVR_16, 4) + RELOC_NUMBER (R_AVR_16_PM, 5) + RELOC_NUMBER (R_AVR_LO8_LDI, 6) + RELOC_NUMBER (R_AVR_HI8_LDI, 7) + RELOC_NUMBER (R_AVR_HH8_LDI, 8) + RELOC_NUMBER (R_AVR_LO8_LDI_NEG, 9) + RELOC_NUMBER (R_AVR_HI8_LDI_NEG, 10) + RELOC_NUMBER (R_AVR_HH8_LDI_NEG, 11) + RELOC_NUMBER (R_AVR_LO8_LDI_PM, 12) + RELOC_NUMBER (R_AVR_HI8_LDI_PM, 13) + RELOC_NUMBER (R_AVR_HH8_LDI_PM, 14) + RELOC_NUMBER (R_AVR_LO8_LDI_PM_NEG, 15) + RELOC_NUMBER (R_AVR_HI8_LDI_PM_NEG, 16) + RELOC_NUMBER (R_AVR_HH8_LDI_PM_NEG, 17) + RELOC_NUMBER (R_AVR_CALL, 18) + RELOC_NUMBER (R_AVR_LDI, 19) + RELOC_NUMBER (R_AVR_6, 20) + RELOC_NUMBER (R_AVR_6_ADIW, 21) + RELOC_NUMBER (R_AVR_MS8_LDI, 22) + RELOC_NUMBER (R_AVR_MS8_LDI_NEG, 23) + RELOC_NUMBER (R_AVR_LO8_LDI_GS, 24) + RELOC_NUMBER (R_AVR_HI8_LDI_GS, 25) + RELOC_NUMBER (R_AVR_8, 26) + RELOC_NUMBER (R_AVR_8_LO8, 27) + RELOC_NUMBER (R_AVR_8_HI8, 28) + RELOC_NUMBER (R_AVR_8_HLO8, 29) +END_RELOC_NUMBERS (R_AVR_max) + +#endif /* _ELF_AVR_H */ diff --git a/include/elf/bfin.h b/include/elf/bfin.h new file mode 100644 index 0000000..8d92906 --- /dev/null +++ b/include/elf/bfin.h @@ -0,0 +1,95 @@ +/* Blackfin ELF support for BFD. + Copyright (C) 2005, 2006, 2009, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_BFIN_H +#define _ELF_BFIN_H + +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (elf_bfin_reloc_type) + RELOC_NUMBER (R_BFIN_UNUSED0, 0x00) /* relocation type 0 is not defined */ + RELOC_NUMBER (R_BFIN_PCREL5M2, 0x01) /* LSETUP part a */ + RELOC_NUMBER (R_BFIN_UNUSED1, 0x02) /* relocation type 2 is not defined */ + RELOC_NUMBER (R_BFIN_PCREL10, 0x03) /* type 3, 0x00) if cc jump */ + RELOC_NUMBER (R_BFIN_PCREL12_JUMP, 0x04) /* type 4, 0x00) jump */ + RELOC_NUMBER (R_BFIN_RIMM16, 0x05) /* type 0x5, 0x00) rN = */ + RELOC_NUMBER (R_BFIN_LUIMM16, 0x06) /* # 0x6, 0x00) preg.l= Load imm 16 to lower half */ + RELOC_NUMBER (R_BFIN_HUIMM16, 0x07) /* # 0x7, 0x00) preg.h= Load imm 16 to upper half */ + RELOC_NUMBER (R_BFIN_PCREL12_JUMP_S, 0x08) /* # 0x8 jump.s */ + RELOC_NUMBER (R_BFIN_PCREL24_JUMP_X, 0x09) /* # 0x9 jump.x */ + RELOC_NUMBER (R_BFIN_PCREL24, 0x0a) /* # 0xa call , 0x00) not expandable */ + RELOC_NUMBER (R_BFIN_UNUSEDB, 0x0b) /* # 0xb not generated */ + RELOC_NUMBER (R_BFIN_UNUSEDC, 0x0c) /* # 0xc not used */ + RELOC_NUMBER (R_BFIN_PCREL24_JUMP_L, 0x0d) /* 0xd jump.l */ + RELOC_NUMBER (R_BFIN_PCREL24_CALL_X, 0x0e) /* 0xE, 0x00) call.x if is above 24 bit limit call through P1 */ + RELOC_NUMBER (R_BFIN_VAR_EQ_SYMB, 0x0f) /* 0xf, 0x00) linker should treat it same as 0x12 */ + RELOC_NUMBER (R_BFIN_BYTE_DATA, 0x10) /* 0x10, 0x00) .byte var = symbol */ + RELOC_NUMBER (R_BFIN_BYTE2_DATA, 0x11) /* 0x11, 0x00) .byte2 var = symbol */ + RELOC_NUMBER (R_BFIN_BYTE4_DATA, 0x12) /* 0x12, 0x00) .byte4 var = symbol and .var var=symbol */ + RELOC_NUMBER (R_BFIN_PCREL11, 0x13) /* 0x13, 0x00) lsetup part b */ + RELOC_NUMBER (R_BFIN_GOT17M4, 0x14) + RELOC_NUMBER (R_BFIN_GOTHI, 0x15) + RELOC_NUMBER (R_BFIN_GOTLO, 0x16) + RELOC_NUMBER (R_BFIN_FUNCDESC, 0x17) + RELOC_NUMBER (R_BFIN_FUNCDESC_GOT17M4, 0x18) + RELOC_NUMBER (R_BFIN_FUNCDESC_GOTHI, 0x19) + RELOC_NUMBER (R_BFIN_FUNCDESC_GOTLO, 0x1a) + RELOC_NUMBER (R_BFIN_FUNCDESC_VALUE, 0x1b) + RELOC_NUMBER (R_BFIN_FUNCDESC_GOTOFF17M4, 0x1c) + RELOC_NUMBER (R_BFIN_FUNCDESC_GOTOFFHI, 0x1d) + RELOC_NUMBER (R_BFIN_FUNCDESC_GOTOFFLO, 0x1e) + RELOC_NUMBER (R_BFIN_GOTOFF17M4, 0x1f) + RELOC_NUMBER (R_BFIN_GOTOFFHI, 0x20) + RELOC_NUMBER (R_BFIN_GOTOFFLO, 0x21) + + RELOC_NUMBER (R_BFIN_PUSH, 0xE0) + RELOC_NUMBER (R_BFIN_CONST, 0xE1) + RELOC_NUMBER (R_BFIN_ADD, 0xE2) + RELOC_NUMBER (R_BFIN_SUB, 0xE3) + RELOC_NUMBER (R_BFIN_MULT, 0xE4) + RELOC_NUMBER (R_BFIN_DIV, 0xE5) + RELOC_NUMBER (R_BFIN_MOD, 0xE6) + RELOC_NUMBER (R_BFIN_LSHIFT, 0xE7) + RELOC_NUMBER (R_BFIN_RSHIFT, 0xE8) + RELOC_NUMBER (R_BFIN_AND, 0xE9) + RELOC_NUMBER (R_BFIN_OR, 0xEA) + RELOC_NUMBER (R_BFIN_XOR, 0xEB) + RELOC_NUMBER (R_BFIN_LAND, 0xEC) + RELOC_NUMBER (R_BFIN_LOR, 0xED) + RELOC_NUMBER (R_BFIN_LEN, 0xEE) + RELOC_NUMBER (R_BFIN_NEG, 0xEF) + RELOC_NUMBER (R_BFIN_COMP, 0xF0) + RELOC_NUMBER (R_BFIN_PAGE, 0xF1) + RELOC_NUMBER (R_BFIN_HWPAGE, 0xF2) + RELOC_NUMBER (R_BFIN_ADDR, 0xF3) + RELOC_NUMBER (R_BFIN_PLTPC, 0x40) /* PLT gnu only relocation */ + RELOC_NUMBER (R_BFIN_GOT, 0x41) /* GOT gnu only relocation */ + RELOC_NUMBER (R_BFIN_GNU_VTINHERIT, 0x42) /* C++, gnu only */ + RELOC_NUMBER (R_BFIN_GNU_VTENTRY, 0x43) /* C++, gnu only */ +END_RELOC_NUMBERS (R_BFIN_max) + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_BFIN_PIC 0x00000001 /* -fpic */ +#define EF_BFIN_FDPIC 0x00000002 /* -mfdpic */ + +#define EF_BFIN_CODE_IN_L1 0x00000010 /* --code-in-l1 */ +#define EF_BFIN_DATA_IN_L1 0x00000020 /* --data-in-l1 */ + +#define EF_BFIN_PIC_FLAGS (EF_BFIN_PIC | EF_BFIN_FDPIC) +#endif /* _ELF_BFIN_H */ diff --git a/include/elf/common.h b/include/elf/common.h new file mode 100644 index 0000000..cd3bcdd --- /dev/null +++ b/include/elf/common.h @@ -0,0 +1,1001 @@ +/* ELF support for BFD. + Copyright 1991-2013 Free Software Foundation, Inc. + + Written by Fred Fish @ Cygnus Support, from information published + in "UNIX System V Release 4, Programmers Guide: ANSI C and + Programming Support Tools". + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is part of ELF support for BFD, and contains the portions + that are common to both the internal and external representations. + For example, ELFMAG0 is the byte 0x7F in both the internal (in-memory) + and external (in-file) representations. */ + +#ifndef _ELF_COMMON_H +#define _ELF_COMMON_H + +/* Fields in e_ident[]. */ + +#define EI_MAG0 0 /* File identification byte 0 index */ +#define ELFMAG0 0x7F /* Magic number byte 0 */ + +#define EI_MAG1 1 /* File identification byte 1 index */ +#define ELFMAG1 'E' /* Magic number byte 1 */ + +#define EI_MAG2 2 /* File identification byte 2 index */ +#define ELFMAG2 'L' /* Magic number byte 2 */ + +#define EI_MAG3 3 /* File identification byte 3 index */ +#define ELFMAG3 'F' /* Magic number byte 3 */ + +#define EI_CLASS 4 /* File class */ +#define ELFCLASSNONE 0 /* Invalid class */ +#define ELFCLASS32 1 /* 32-bit objects */ +#define ELFCLASS64 2 /* 64-bit objects */ + +#define EI_DATA 5 /* Data encoding */ +#define ELFDATANONE 0 /* Invalid data encoding */ +#define ELFDATA2LSB 1 /* 2's complement, little endian */ +#define ELFDATA2MSB 2 /* 2's complement, big endian */ + +#define EI_VERSION 6 /* File version */ + +#define EI_OSABI 7 /* Operating System/ABI indication */ +#define ELFOSABI_NONE 0 /* UNIX System V ABI */ +#define ELFOSABI_HPUX 1 /* HP-UX operating system */ +#define ELFOSABI_NETBSD 2 /* NetBSD */ +#define ELFOSABI_GNU 3 /* GNU */ +#define ELFOSABI_LINUX 3 /* Alias for ELFOSABI_GNU */ +#define ELFOSABI_SOLARIS 6 /* Solaris */ +#define ELFOSABI_AIX 7 /* AIX */ +#define ELFOSABI_IRIX 8 /* IRIX */ +#define ELFOSABI_FREEBSD 9 /* FreeBSD */ +#define ELFOSABI_TRU64 10 /* TRU64 UNIX */ +#define ELFOSABI_MODESTO 11 /* Novell Modesto */ +#define ELFOSABI_OPENBSD 12 /* OpenBSD */ +#define ELFOSABI_OPENVMS 13 /* OpenVMS */ +#define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */ +#define ELFOSABI_AROS 15 /* AROS */ +#define ELFOSABI_FENIXOS 16 /* FenixOS */ +#define ELFOSABI_C6000_ELFABI 64 /* Bare-metal TMS320C6000 */ +#define ELFOSABI_C6000_LINUX 65 /* Linux TMS320C6000 */ +#define ELFOSABI_ARM 97 /* ARM */ +#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ + +#define EI_ABIVERSION 8 /* ABI version */ + +#define EI_PAD 9 /* Start of padding bytes */ + + +/* Values for e_type, which identifies the object file type. */ + +#define ET_NONE 0 /* No file type */ +#define ET_REL 1 /* Relocatable file */ +#define ET_EXEC 2 /* Executable file */ +#define ET_DYN 3 /* Shared object file */ +#define ET_CORE 4 /* Core file */ +#define ET_LOOS 0xFE00 /* Operating system-specific */ +#define ET_HIOS 0xFEFF /* Operating system-specific */ +#define ET_LOPROC 0xFF00 /* Processor-specific */ +#define ET_HIPROC 0xFFFF /* Processor-specific */ + +/* Values for e_machine, which identifies the architecture. These numbers + are officially assigned by registry@sco.com. See below for a list of + ad-hoc numbers used during initial development. */ + +#define EM_NONE 0 /* No machine */ +#define EM_M32 1 /* AT&T WE 32100 */ +#define EM_SPARC 2 /* SUN SPARC */ +#define EM_386 3 /* Intel 80386 */ +#define EM_68K 4 /* Motorola m68k family */ +#define EM_88K 5 /* Motorola m88k family */ +#define EM_486 6 /* Intel 80486 *//* Reserved for future use */ +#define EM_860 7 /* Intel 80860 */ +#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */ +#define EM_S370 9 /* IBM System/370 */ +#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian (Oct 4 1999 Draft) Deprecated */ +#define EM_res011 11 /* Reserved */ +#define EM_res012 12 /* Reserved */ +#define EM_res013 13 /* Reserved */ +#define EM_res014 14 /* Reserved */ +#define EM_PARISC 15 /* HPPA */ +#define EM_res016 16 /* Reserved */ +#define EM_VPP550 17 /* Fujitsu VPP500 */ +#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ +#define EM_960 19 /* Intel 80960 */ +#define EM_PPC 20 /* PowerPC */ +#define EM_PPC64 21 /* 64-bit PowerPC */ +#define EM_S390 22 /* IBM S/390 */ +#define EM_SPU 23 /* Sony/Toshiba/IBM SPU */ +#define EM_res024 24 /* Reserved */ +#define EM_res025 25 /* Reserved */ +#define EM_res026 26 /* Reserved */ +#define EM_res027 27 /* Reserved */ +#define EM_res028 28 /* Reserved */ +#define EM_res029 29 /* Reserved */ +#define EM_res030 30 /* Reserved */ +#define EM_res031 31 /* Reserved */ +#define EM_res032 32 /* Reserved */ +#define EM_res033 33 /* Reserved */ +#define EM_res034 34 /* Reserved */ +#define EM_res035 35 /* Reserved */ +#define EM_V800 36 /* NEC V800 series */ +#define EM_FR20 37 /* Fujitsu FR20 */ +#define EM_RH32 38 /* TRW RH32 */ +#define EM_MCORE 39 /* Motorola M*Core */ /* May also be taken by Fujitsu MMA */ +#define EM_RCE 39 /* Old name for MCore */ +#define EM_ARM 40 /* ARM */ +#define EM_OLD_ALPHA 41 /* Digital Alpha */ +#define EM_SH 42 /* Renesas (formerly Hitachi) / SuperH SH */ +#define EM_SPARCV9 43 /* SPARC v9 64-bit */ +#define EM_TRICORE 44 /* Siemens Tricore embedded processor */ +#define EM_ARC 45 /* ARC Cores */ +#define EM_H8_300 46 /* Renesas (formerly Hitachi) H8/300 */ +#define EM_H8_300H 47 /* Renesas (formerly Hitachi) H8/300H */ +#define EM_H8S 48 /* Renesas (formerly Hitachi) H8S */ +#define EM_H8_500 49 /* Renesas (formerly Hitachi) H8/500 */ +#define EM_IA_64 50 /* Intel IA-64 Processor */ +#define EM_MIPS_X 51 /* Stanford MIPS-X */ +#define EM_COLDFIRE 52 /* Motorola Coldfire */ +#define EM_68HC12 53 /* Motorola M68HC12 */ +#define EM_MMA 54 /* Fujitsu Multimedia Accelerator */ +#define EM_PCP 55 /* Siemens PCP */ +#define EM_NCPU 56 /* Sony nCPU embedded RISC processor */ +#define EM_NDR1 57 /* Denso NDR1 microprocessor */ +#define EM_STARCORE 58 /* Motorola Star*Core processor */ +#define EM_ME16 59 /* Toyota ME16 processor */ +#define EM_ST100 60 /* STMicroelectronics ST100 processor */ +#define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor */ +#define EM_X86_64 62 /* Advanced Micro Devices X86-64 processor */ +#define EM_PDSP 63 /* Sony DSP Processor */ +#define EM_PDP10 64 /* Digital Equipment Corp. PDP-10 */ +#define EM_PDP11 65 /* Digital Equipment Corp. PDP-11 */ +#define EM_FX66 66 /* Siemens FX66 microcontroller */ +#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */ +#define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */ +#define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */ +#define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */ +#define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */ +#define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */ +#define EM_SVX 73 /* Silicon Graphics SVx */ +#define EM_ST19 74 /* STMicroelectronics ST19 8-bit cpu */ +#define EM_VAX 75 /* Digital VAX */ +#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ +#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded cpu */ +#define EM_FIREPATH 78 /* Element 14 64-bit DSP processor */ +#define EM_ZSP 79 /* LSI Logic's 16-bit DSP processor */ +#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ +#define EM_HUANY 81 /* Harvard's machine-independent format */ +#define EM_PRISM 82 /* SiTera Prism */ +#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ +#define EM_FR30 84 /* Fujitsu FR30 */ +#define EM_D10V 85 /* Mitsubishi D10V */ +#define EM_D30V 86 /* Mitsubishi D30V */ +#define EM_V850 87 /* Renesas V850 (formerly NEC V850) */ +#define EM_M32R 88 /* Renesas M32R (formerly Mitsubishi M32R) */ +#define EM_MN10300 89 /* Matsushita MN10300 */ +#define EM_MN10200 90 /* Matsushita MN10200 */ +#define EM_PJ 91 /* picoJava */ +#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ +#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ +#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ +#define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */ +#define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */ +#define EM_NS32K 97 /* National Semiconductor 32000 series */ +#define EM_TPC 98 /* Tenor Network TPC processor */ +#define EM_SNP1K 99 /* Trebia SNP 1000 processor */ +#define EM_ST200 100 /* STMicroelectronics ST200 microcontroller */ +#define EM_IP2K 101 /* Ubicom IP2022 micro controller */ +#define EM_MAX 102 /* MAX Processor */ +#define EM_CR 103 /* National Semiconductor CompactRISC */ +#define EM_F2MC16 104 /* Fujitsu F2MC16 */ +#define EM_MSP430 105 /* TI msp430 micro controller */ +#define EM_BLACKFIN 106 /* ADI Blackfin */ +#define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */ +#define EM_SEP 108 /* Sharp embedded microprocessor */ +#define EM_ARCA 109 /* Arca RISC Microprocessor */ +#define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */ +#define EM_EXCESS 111 /* eXcess: 16/32/64-bit configurable embedded CPU */ +#define EM_DXP 112 /* Icera Semiconductor Inc. Deep Execution Processor */ +#define EM_ALTERA_NIOS2 113 /* Altera Nios II soft-core processor */ +#define EM_CRX 114 /* National Semiconductor CRX */ +#define EM_XGATE 115 /* Motorola XGATE embedded processor */ +#define EM_C166 116 /* Infineon C16x/XC16x processor */ +#define EM_M16C 117 /* Renesas M16C series microprocessors */ +#define EM_DSPIC30F 118 /* Microchip Technology dsPIC30F Digital Signal Controller */ +#define EM_CE 119 /* Freescale Communication Engine RISC core */ +#define EM_M32C 120 /* Renesas M32C series microprocessors */ +#define EM_res121 121 /* Reserved */ +#define EM_res122 122 /* Reserved */ +#define EM_res123 123 /* Reserved */ +#define EM_res124 124 /* Reserved */ +#define EM_res125 125 /* Reserved */ +#define EM_res126 126 /* Reserved */ +#define EM_res127 127 /* Reserved */ +#define EM_res128 128 /* Reserved */ +#define EM_res129 129 /* Reserved */ +#define EM_res130 130 /* Reserved */ +#define EM_TSK3000 131 /* Altium TSK3000 core */ +#define EM_RS08 132 /* Freescale RS08 embedded processor */ +#define EM_res133 133 /* Reserved */ +#define EM_ECOG2 134 /* Cyan Technology eCOG2 microprocessor */ +#define EM_SCORE 135 /* Sunplus Score */ +#define EM_SCORE7 135 /* Sunplus S+core7 RISC processor */ +#define EM_DSP24 136 /* New Japan Radio (NJR) 24-bit DSP Processor */ +#define EM_VIDEOCORE3 137 /* Broadcom VideoCore III processor */ +#define EM_LATTICEMICO32 138 /* RISC processor for Lattice FPGA architecture */ +#define EM_SE_C17 139 /* Seiko Epson C17 family */ +#define EM_TI_C6000 140 /* Texas Instruments TMS320C6000 DSP family */ +#define EM_TI_C2000 141 /* Texas Instruments TMS320C2000 DSP family */ +#define EM_TI_C5500 142 /* Texas Instruments TMS320C55x DSP family */ +#define EM_res143 143 /* Reserved */ +#define EM_res144 144 /* Reserved */ +#define EM_res145 145 /* Reserved */ +#define EM_res146 146 /* Reserved */ +#define EM_res147 147 /* Reserved */ +#define EM_res148 148 /* Reserved */ +#define EM_res149 149 /* Reserved */ +#define EM_res150 150 /* Reserved */ +#define EM_res151 151 /* Reserved */ +#define EM_res152 152 /* Reserved */ +#define EM_res153 153 /* Reserved */ +#define EM_res154 154 /* Reserved */ +#define EM_res155 155 /* Reserved */ +#define EM_res156 156 /* Reserved */ +#define EM_res157 157 /* Reserved */ +#define EM_res158 158 /* Reserved */ +#define EM_res159 159 /* Reserved */ +#define EM_MMDSP_PLUS 160 /* STMicroelectronics 64bit VLIW Data Signal Processor */ +#define EM_CYPRESS_M8C 161 /* Cypress M8C microprocessor */ +#define EM_R32C 162 /* Renesas R32C series microprocessors */ +#define EM_TRIMEDIA 163 /* NXP Semiconductors TriMedia architecture family */ +#define EM_QDSP6 164 /* QUALCOMM DSP6 Processor */ +#define EM_8051 165 /* Intel 8051 and variants */ +#define EM_STXP7X 166 /* STMicroelectronics STxP7x family */ +#define EM_NDS32 167 /* Andes Technology compact code size embedded RISC processor family */ +#define EM_ECOG1 168 /* Cyan Technology eCOG1X family */ +#define EM_ECOG1X 168 /* Cyan Technology eCOG1X family */ +#define EM_MAXQ30 169 /* Dallas Semiconductor MAXQ30 Core Micro-controllers */ +#define EM_XIMO16 170 /* New Japan Radio (NJR) 16-bit DSP Processor */ +#define EM_MANIK 171 /* M2000 Reconfigurable RISC Microprocessor */ +#define EM_CRAYNV2 172 /* Cray Inc. NV2 vector architecture */ +#define EM_RX 173 /* Renesas RX family */ +#define EM_METAG 174 /* Imagination Technologies Meta processor architecture */ +#define EM_MCST_ELBRUS 175 /* MCST Elbrus general purpose hardware architecture */ +#define EM_ECOG16 176 /* Cyan Technology eCOG16 family */ +#define EM_CR16 177 /* National Semiconductor CompactRISC 16-bit processor */ +#define EM_ETPU 178 /* Freescale Extended Time Processing Unit */ +#define EM_SLE9X 179 /* Infineon Technologies SLE9X core */ +#define EM_L1OM 180 /* Intel L1OM */ +#define EM_K1OM 181 /* Intel K1OM */ +#define EM_INTEL182 182 /* Reserved by Intel */ +#define EM_AARCH64 183 /* ARM 64-bit architecture */ +#define EM_ARM184 184 /* Reserved by ARM */ +#define EM_AVR32 185 /* Atmel Corporation 32-bit microprocessor family */ +#define EM_STM8 186 /* STMicroeletronics STM8 8-bit microcontroller */ +#define EM_TILE64 187 /* Tilera TILE64 multicore architecture family */ +#define EM_TILEPRO 188 /* Tilera TILEPro multicore architecture family */ +#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze 32-bit RISC soft processor core */ +#define EM_CUDA 190 /* NVIDIA CUDA architecture */ +#define EM_TILEGX 191 /* Tilera TILE-Gx multicore architecture family */ +#define EM_RL78 197 /* Renesas RL78 family. */ +#define EM_78K0R 199 /* Renesas 78K0R. */ +#define EM_INTEL205 205 /* Reserved by Intel */ +#define EM_INTEL206 206 /* Reserved by Intel */ +#define EM_INTEL207 207 /* Reserved by Intel */ +#define EM_INTEL208 208 /* Reserved by Intel */ +#define EM_INTEL209 209 /* Reserved by Intel */ + +/* If it is necessary to assign new unofficial EM_* values, please pick large + random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision + with official or non-GNU unofficial values. + + NOTE: Do not just increment the most recent number by one. + Somebody else somewhere will do exactly the same thing, and you + will have a collision. Instead, pick a random number. + + Normally, each entity or maintainer responsible for a machine with an + unofficial e_machine number should eventually ask registry@sco.com for + an officially blessed number to be added to the list above. */ + +/* Old version of Sparc v9, from before the ABI; + This should be removed shortly. */ +#define EM_OLD_SPARCV9 11 + +/* Old version of PowerPC, this should be removed shortly. */ +#define EM_PPC_OLD 17 + +/* picoJava */ +#define EM_PJ_OLD 99 + +/* Old, unofficial value for National Semiconductor CompactRISC - CR16 */ +#define EM_CR16_OLD 115 + +/* AVR magic number. Written in the absense of an ABI. */ +#define EM_AVR_OLD 0x1057 + +/* MSP430 magic number. Written in the absense of everything. */ +#define EM_MSP430_OLD 0x1059 + +/* Morpho MT. Written in the absense of an ABI. */ +#define EM_MT 0x2530 + +/* FR30 magic number - no EABI available. */ +#define EM_CYGNUS_FR30 0x3330 + +/* OpenRISC magic number. Written in the absense of an ABI. */ +#define EM_OPENRISC_OLD 0x3426 + +/* DLX magic number. Written in the absense of an ABI. */ +#define EM_DLX 0x5aa5 + +/* FRV magic number - no EABI available??. */ +#define EM_CYGNUS_FRV 0x5441 + +/* Infineon Technologies 16-bit microcontroller with C166-V2 core. */ +#define EM_XC16X 0x4688 + +/* D10V backend magic number. Written in the absence of an ABI. */ +#define EM_CYGNUS_D10V 0x7650 + +/* D30V backend magic number. Written in the absence of an ABI. */ +#define EM_CYGNUS_D30V 0x7676 + +/* Ubicom IP2xxx; Written in the absense of an ABI. */ +#define EM_IP2K_OLD 0x8217 + +/* (Deprecated) Temporary number for the OpenRISC processor. */ +#define EM_OR32 0x8472 + +/* Cygnus PowerPC ELF backend. Written in the absence of an ABI. */ +#define EM_CYGNUS_POWERPC 0x9025 + +/* Alpha backend magic number. Written in the absence of an ABI. */ +#define EM_ALPHA 0x9026 + +/* Cygnus M32R ELF backend. Written in the absence of an ABI. */ +#define EM_CYGNUS_M32R 0x9041 + +/* V850 backend magic number. Written in the absense of an ABI. */ +#define EM_CYGNUS_V850 0x9080 + +/* old S/390 backend magic number. Written in the absence of an ABI. */ +#define EM_S390_OLD 0xa390 + +/* Old, unofficial value for Xtensa. */ +#define EM_XTENSA_OLD 0xabc7 + +#define EM_XSTORMY16 0xad45 + +/* mn10200 and mn10300 backend magic numbers. + Written in the absense of an ABI. */ +#define EM_CYGNUS_MN10300 0xbeef +#define EM_CYGNUS_MN10200 0xdead + +/* Renesas M32C and M16C. */ +#define EM_M32C_OLD 0xFEB0 + +/* Vitesse IQ2000. */ +#define EM_IQ2000 0xFEBA + +/* NIOS magic number - no EABI available. */ +#define EM_NIOS32 0xFEBB + +#define EM_CYGNUS_MEP 0xF00D /* Toshiba MeP */ + +#define EM_MOXIE 0xFEED /* Moxie */ + +/* Old Sunplus S+core7 backend magic number. Written in the absence of an ABI. */ +#define EM_SCORE_OLD 95 + +#define EM_MICROBLAZE_OLD 0xbaab /* Old MicroBlaze */ + +#define EM_ADAPTEVA_EPIPHANY 0x1223 /* Adapteva's Epiphany architecture. */ + +/* See the above comment before you add a new EM_* value here. */ + +/* Values for e_version. */ + +#define EV_NONE 0 /* Invalid ELF version */ +#define EV_CURRENT 1 /* Current version */ + +/* Value for e_phnum. */ +#define PN_XNUM 0xffff /* Extended numbering */ + +/* Values for program header, p_type field. */ + +#define PT_NULL 0 /* Program header table entry unused */ +#define PT_LOAD 1 /* Loadable program segment */ +#define PT_DYNAMIC 2 /* Dynamic linking information */ +#define PT_INTERP 3 /* Program interpreter */ +#define PT_NOTE 4 /* Auxiliary information */ +#define PT_SHLIB 5 /* Reserved, unspecified semantics */ +#define PT_PHDR 6 /* Entry for header table itself */ +#define PT_TLS 7 /* Thread local storage segment */ +#define PT_LOOS 0x60000000 /* OS-specific */ +#define PT_HIOS 0x6fffffff /* OS-specific */ +#define PT_LOPROC 0x70000000 /* Processor-specific */ +#define PT_HIPROC 0x7FFFFFFF /* Processor-specific */ + +#define PT_GNU_EH_FRAME (PT_LOOS + 0x474e550) /* Frame unwind information */ +#define PT_SUNW_EH_FRAME PT_GNU_EH_FRAME /* Solaris uses the same value */ +#define PT_GNU_STACK (PT_LOOS + 0x474e551) /* Stack flags */ +#define PT_GNU_RELRO (PT_LOOS + 0x474e552) /* Read-only after relocation */ + +/* Program segment permissions, in program header p_flags field. */ + +#define PF_X (1 << 0) /* Segment is executable */ +#define PF_W (1 << 1) /* Segment is writable */ +#define PF_R (1 << 2) /* Segment is readable */ +/* #define PF_MASKOS 0x0F000000 *//* OS-specific reserved bits */ +#define PF_MASKOS 0x0FF00000 /* New value, Oct 4, 1999 Draft */ +#define PF_MASKPROC 0xF0000000 /* Processor-specific reserved bits */ + +/* Values for section header, sh_type field. */ + +#define SHT_NULL 0 /* Section header table entry unused */ +#define SHT_PROGBITS 1 /* Program specific (private) data */ +#define SHT_SYMTAB 2 /* Link editing symbol table */ +#define SHT_STRTAB 3 /* A string table */ +#define SHT_RELA 4 /* Relocation entries with addends */ +#define SHT_HASH 5 /* A symbol hash table */ +#define SHT_DYNAMIC 6 /* Information for dynamic linking */ +#define SHT_NOTE 7 /* Information that marks file */ +#define SHT_NOBITS 8 /* Section occupies no space in file */ +#define SHT_REL 9 /* Relocation entries, no addends */ +#define SHT_SHLIB 10 /* Reserved, unspecified semantics */ +#define SHT_DYNSYM 11 /* Dynamic linking symbol table */ + +#define SHT_INIT_ARRAY 14 /* Array of ptrs to init functions */ +#define SHT_FINI_ARRAY 15 /* Array of ptrs to finish functions */ +#define SHT_PREINIT_ARRAY 16 /* Array of ptrs to pre-init funcs */ +#define SHT_GROUP 17 /* Section contains a section group */ +#define SHT_SYMTAB_SHNDX 18 /* Indicies for SHN_XINDEX entries */ + +#define SHT_LOOS 0x60000000 /* First of OS specific semantics */ +#define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */ + +#define SHT_GNU_INCREMENTAL_INPUTS 0x6fff4700 /* incremental build data */ +#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes */ +#define SHT_GNU_HASH 0x6ffffff6 /* GNU style symbol hash table */ +#define SHT_GNU_LIBLIST 0x6ffffff7 /* List of prelink dependencies */ + +/* The next three section types are defined by Solaris, and are named + SHT_SUNW*. We use them in GNU code, so we also define SHT_GNU* + versions. */ +#define SHT_SUNW_verdef 0x6ffffffd /* Versions defined by file */ +#define SHT_SUNW_verneed 0x6ffffffe /* Versions needed by file */ +#define SHT_SUNW_versym 0x6fffffff /* Symbol versions */ + +#define SHT_GNU_verdef SHT_SUNW_verdef +#define SHT_GNU_verneed SHT_SUNW_verneed +#define SHT_GNU_versym SHT_SUNW_versym + +#define SHT_LOPROC 0x70000000 /* Processor-specific semantics, lo */ +#define SHT_HIPROC 0x7FFFFFFF /* Processor-specific semantics, hi */ +#define SHT_LOUSER 0x80000000 /* Application-specific semantics */ +/* #define SHT_HIUSER 0x8FFFFFFF *//* Application-specific semantics */ +#define SHT_HIUSER 0xFFFFFFFF /* New value, defined in Oct 4, 1999 Draft */ + +/* Values for section header, sh_flags field. */ + +#define SHF_WRITE (1 << 0) /* Writable data during execution */ +#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ +#define SHF_EXECINSTR (1 << 2) /* Executable machine instructions */ +#define SHF_MERGE (1 << 4) /* Data in this section can be merged */ +#define SHF_STRINGS (1 << 5) /* Contains null terminated character strings */ +#define SHF_INFO_LINK (1 << 6) /* sh_info holds section header table index */ +#define SHF_LINK_ORDER (1 << 7) /* Preserve section ordering when linking */ +#define SHF_OS_NONCONFORMING (1 << 8) /* OS specific processing required */ +#define SHF_GROUP (1 << 9) /* Member of a section group */ +#define SHF_TLS (1 << 10) /* Thread local storage section */ + +/* #define SHF_MASKOS 0x0F000000 *//* OS-specific semantics */ +#define SHF_MASKOS 0x0FF00000 /* New value, Oct 4, 1999 Draft */ +#define SHF_MASKPROC 0xF0000000 /* Processor-specific semantics */ + +/* This used to be implemented as a processor specific section flag. + We just make it generic. */ +#define SHF_EXCLUDE 0x80000000 /* Link editor is to exclude + this section from executable + and shared library that it + builds when those objects + are not to be further + relocated. */ + +/* Values of note segment descriptor types for core files. */ + +#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ +#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ +#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ +#define NT_TASKSTRUCT 4 /* Contains copy of task struct */ +#define NT_AUXV 6 /* Contains copy of Elfxx_auxv_t */ +#define NT_PRXFPREG 0x46e62b7f /* Contains a user_xfpregs_struct; */ + /* note name must be "LINUX". */ +#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ + /* note name must be "LINUX". */ +#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ + /* note name must be "LINUX". */ +#define NT_386_TLS 0x200 /* x86 TLS information */ + /* note name must be "LINUX". */ +#define NT_386_IOPERM 0x201 /* x86 io permissions */ + /* note name must be "LINUX". */ +#define NT_X86_XSTATE 0x202 /* x86 XSAVE extended state */ + /* note name must be "LINUX". */ +#define NT_S390_HIGH_GPRS 0x300 /* S/390 upper halves of GPRs */ + /* note name must be "LINUX". */ +#define NT_S390_TIMER 0x301 /* S390 timer */ + /* note name must be "LINUX". */ +#define NT_S390_TODCMP 0x302 /* S390 TOD clock comparator */ + /* note name must be "LINUX". */ +#define NT_S390_TODPREG 0x303 /* S390 TOD programmable register */ + /* note name must be "LINUX". */ +#define NT_S390_CTRS 0x304 /* S390 control registers */ + /* note name must be "LINUX". */ +#define NT_S390_PREFIX 0x305 /* S390 prefix register */ + /* note name must be "LINUX". */ +#define NT_S390_LAST_BREAK 0x306 /* S390 breaking event address */ + /* note name must be "LINUX". */ +#define NT_S390_SYSTEM_CALL 0x307 /* S390 system call restart data */ + /* note name must be "LINUX". */ +#define NT_S390_TDB 0x308 /* S390 transaction diagnostic block */ + /* note name must be "LINUX". */ +#define NT_ARM_VFP 0x400 /* ARM VFP registers */ +/* The following definitions should really use NT_AARCH_..., but defined + this way for compatibility with Linux. */ +#define NT_ARM_TLS 0x401 /* AArch TLS registers */ + /* note name must be "LINUX". */ +#define NT_ARM_HW_BREAK 0x402 /* AArch hardware breakpoint registers */ + /* note name must be "LINUX". */ +#define NT_ARM_HW_WATCH 0x403 /* AArch hardware watchpoint registers */ + /* note name must be "LINUX". */ +#define NT_SIGINFO 0x53494749 /* Fields of siginfo_t. */ +#define NT_FILE 0x46494c45 /* Description of mapped files. */ + +/* Note segments for core files on dir-style procfs systems. */ + +#define NT_PSTATUS 10 /* Has a struct pstatus */ +#define NT_FPREGS 12 /* Has a struct fpregset */ +#define NT_PSINFO 13 /* Has a struct psinfo */ +#define NT_LWPSTATUS 16 /* Has a struct lwpstatus_t */ +#define NT_LWPSINFO 17 /* Has a struct lwpsinfo_t */ +#define NT_WIN32PSTATUS 18 /* Has a struct win32_pstatus */ + +/* Note segment for SystemTap probes. */ +#define NT_STAPSDT 3 + +/* Note segments for core files on NetBSD systems. Note name + must start with "NetBSD-CORE". */ + +#define NT_NETBSDCORE_PROCINFO 1 /* Has a struct procinfo */ +#define NT_NETBSDCORE_FIRSTMACH 32 /* start of machdep note types */ + + +/* Note segments for core files on OpenBSD systems. Note name is + "OpenBSD". */ + +#define NT_OPENBSD_PROCINFO 10 +#define NT_OPENBSD_AUXV 11 +#define NT_OPENBSD_REGS 20 +#define NT_OPENBSD_FPREGS 21 +#define NT_OPENBSD_XFPREGS 22 +#define NT_OPENBSD_WCOOKIE 23 + + +/* Note segments for core files on SPU systems. Note name + must start with "SPU/". */ + +#define NT_SPU 1 + +/* Values of note segment descriptor types for object files. */ + +#define NT_VERSION 1 /* Contains a version string. */ +#define NT_ARCH 2 /* Contains an architecture string. */ + +/* Values for notes in non-core files using name "GNU". */ + +#define NT_GNU_ABI_TAG 1 +#define NT_GNU_HWCAP 2 /* Used by ld.so and kernel vDSO. */ +#define NT_GNU_BUILD_ID 3 /* Generated by ld --build-id. */ +#define NT_GNU_GOLD_VERSION 4 /* Generated by gold. */ + +/* Values used in GNU .note.ABI-tag notes (NT_GNU_ABI_TAG). */ +#define GNU_ABI_TAG_LINUX 0 +#define GNU_ABI_TAG_HURD 1 +#define GNU_ABI_TAG_SOLARIS 2 +#define GNU_ABI_TAG_FREEBSD 3 +#define GNU_ABI_TAG_NETBSD 4 + +/* Values for NetBSD .note.netbsd.ident notes. Note name is "NetBSD". */ + +#define NT_NETBSD_IDENT 1 + +/* Values for OpenBSD .note.openbsd.ident notes. Note name is "OpenBSD". */ + +#define NT_OPENBSD_IDENT 1 + +/* Values for FreeBSD .note.ABI-tag notes. Note name is "FreeBSD". */ + +#define NT_FREEBSD_ABI_TAG 1 + +/* These three macros disassemble and assemble a symbol table st_info field, + which contains the symbol binding and symbol type. The STB_ and STT_ + defines identify the binding and type. */ + +#define ELF_ST_BIND(val) (((unsigned int)(val)) >> 4) +#define ELF_ST_TYPE(val) ((val) & 0xF) +#define ELF_ST_INFO(bind,type) (((bind) << 4) + ((type) & 0xF)) + +/* The 64bit and 32bit versions of these macros are identical, but + the ELF spec defines them, so here they are. */ +#define ELF32_ST_BIND ELF_ST_BIND +#define ELF32_ST_TYPE ELF_ST_TYPE +#define ELF32_ST_INFO ELF_ST_INFO +#define ELF64_ST_BIND ELF_ST_BIND +#define ELF64_ST_TYPE ELF_ST_TYPE +#define ELF64_ST_INFO ELF_ST_INFO + +/* This macro disassembles and assembles a symbol's visibility into + the st_other field. The STV_ defines specify the actual visibility. */ + +#define ELF_ST_VISIBILITY(v) ((v) & 0x3) +/* The remaining bits in the st_other field are not currently used. + They should be set to zero. */ + +#define ELF32_ST_VISIBILITY ELF_ST_VISIBILITY +#define ELF64_ST_VISIBILITY ELF_ST_VISIBILITY + + +#define STN_UNDEF 0 /* Undefined symbol index */ + +#define STB_LOCAL 0 /* Symbol not visible outside obj */ +#define STB_GLOBAL 1 /* Symbol visible outside obj */ +#define STB_WEAK 2 /* Like globals, lower precedence */ +#define STB_LOOS 10 /* OS-specific semantics */ +#define STB_GNU_UNIQUE 10 /* Symbol is unique in namespace */ +#define STB_HIOS 12 /* OS-specific semantics */ +#define STB_LOPROC 13 /* Processor-specific semantics */ +#define STB_HIPROC 15 /* Processor-specific semantics */ + +#define STT_NOTYPE 0 /* Symbol type is unspecified */ +#define STT_OBJECT 1 /* Symbol is a data object */ +#define STT_FUNC 2 /* Symbol is a code object */ +#define STT_SECTION 3 /* Symbol associated with a section */ +#define STT_FILE 4 /* Symbol gives a file name */ +#define STT_COMMON 5 /* An uninitialised common block */ +#define STT_TLS 6 /* Thread local data object */ +#define STT_RELC 8 /* Complex relocation expression */ +#define STT_SRELC 9 /* Signed Complex relocation expression */ +#define STT_LOOS 10 /* OS-specific semantics */ +#define STT_GNU_IFUNC 10 /* Symbol is an indirect code object */ +#define STT_HIOS 12 /* OS-specific semantics */ +#define STT_LOPROC 13 /* Processor-specific semantics */ +#define STT_HIPROC 15 /* Processor-specific semantics */ + +/* The following constants control how a symbol may be accessed once it has + become part of an executable or shared library. */ + +#define STV_DEFAULT 0 /* Visibility is specified by binding type */ +#define STV_INTERNAL 1 /* OS specific version of STV_HIDDEN */ +#define STV_HIDDEN 2 /* Can only be seen inside currect component */ +#define STV_PROTECTED 3 /* Treat as STB_LOCAL inside current component */ + +/* Relocation info handling macros. */ + +#define ELF32_R_SYM(i) ((i) >> 8) +#define ELF32_R_TYPE(i) ((i) & 0xff) +#define ELF32_R_INFO(s,t) (((s) << 8) + ((t) & 0xff)) + +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define ELF64_R_INFO(s,t) (((bfd_vma) (s) << 31 << 1) + (bfd_vma) (t)) + +/* Dynamic section tags. */ + +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_BIND_NOW 24 +#define DT_INIT_ARRAY 25 +#define DT_FINI_ARRAY 26 +#define DT_INIT_ARRAYSZ 27 +#define DT_FINI_ARRAYSZ 28 +#define DT_RUNPATH 29 +#define DT_FLAGS 30 +#define DT_ENCODING 32 +#define DT_PREINIT_ARRAY 32 +#define DT_PREINIT_ARRAYSZ 33 + +/* Note, the Oct 4, 1999 draft of the ELF ABI changed the values + for DT_LOOS and DT_HIOS. Some implementations however, use + values outside of the new range (see below). */ +#define OLD_DT_LOOS 0x60000000 +#define DT_LOOS 0x6000000d +#define DT_HIOS 0x6ffff000 +#define OLD_DT_HIOS 0x6fffffff + +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff + +/* The next 2 dynamic tag ranges, integer value range (DT_VALRNGLO to + DT_VALRNGHI) and virtual address range (DT_ADDRRNGLO to DT_ADDRRNGHI), + are used on Solaris. We support them everywhere. Note these values + lie outside of the (new) range for OS specific values. This is a + deliberate special case and we maintain it for backwards compatability. + */ +#define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_PRELINKED 0x6ffffdf5 +#define DT_GNU_CONFLICTSZ 0x6ffffdf6 +#define DT_GNU_LIBLISTSZ 0x6ffffdf7 +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE 0x6ffffdfc +#define DT_POSFLAG_1 0x6ffffdfd +#define DT_SYMINSZ 0x6ffffdfe +#define DT_SYMINENT 0x6ffffdff +#define DT_VALRNGHI 0x6ffffdff + +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_GNU_HASH 0x6ffffef5 +#define DT_TLSDESC_PLT 0x6ffffef6 +#define DT_TLSDESC_GOT 0x6ffffef7 +#define DT_GNU_CONFLICT 0x6ffffef8 +#define DT_GNU_LIBLIST 0x6ffffef9 +#define DT_CONFIG 0x6ffffefa +#define DT_DEPAUDIT 0x6ffffefb +#define DT_AUDIT 0x6ffffefc +#define DT_PLTPAD 0x6ffffefd +#define DT_MOVETAB 0x6ffffefe +#define DT_SYMINFO 0x6ffffeff +#define DT_ADDRRNGHI 0x6ffffeff + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa +#define DT_FLAGS_1 0x6ffffffb +#define DT_VERDEF 0x6ffffffc +#define DT_VERDEFNUM 0x6ffffffd +#define DT_VERNEED 0x6ffffffe +#define DT_VERNEEDNUM 0x6fffffff + +/* This tag is a GNU extension to the Solaris version scheme. */ +#define DT_VERSYM 0x6ffffff0 + +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff + +/* These section tags are used on Solaris. We support them + everywhere, and hope they do not conflict. */ + +#define DT_AUXILIARY 0x7ffffffd +#define DT_USED 0x7ffffffe +#define DT_FILTER 0x7fffffff + + +/* Values used in DT_FEATURE .dynamic entry. */ +#define DTF_1_PARINIT 0x00000001 +/* From + + http://docs.sun.com:80/ab2/coll.45.13/LLM/@Ab2PageView/21165?Ab2Lang=C&Ab2Enc=iso-8859-1 + + DTF_1_CONFEXP is the same as DTF_1_PARINIT. It is a typo. The value + defined here is the same as the one in on Solaris 8. */ +#define DTF_1_CONFEXP 0x00000002 + +/* Flag values used in the DT_POSFLAG_1 .dynamic entry. */ +#define DF_P1_LAZYLOAD 0x00000001 +#define DF_P1_GROUPPERM 0x00000002 + +/* Flag value in in the DT_FLAGS_1 .dynamic entry. */ +#define DF_1_NOW 0x00000001 +#define DF_1_GLOBAL 0x00000002 +#define DF_1_GROUP 0x00000004 +#define DF_1_NODELETE 0x00000008 +#define DF_1_LOADFLTR 0x00000010 +#define DF_1_INITFIRST 0x00000020 +#define DF_1_NOOPEN 0x00000040 +#define DF_1_ORIGIN 0x00000080 +#define DF_1_DIRECT 0x00000100 +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 +#define DF_1_NODEFLIB 0x00000800 +#define DF_1_NODUMP 0x00001000 +#define DF_1_CONFALT 0x00002000 +#define DF_1_ENDFILTEE 0x00004000 +#define DF_1_DISPRELDNE 0x00008000 +#define DF_1_DISPRELPND 0x00010000 +#define DF_1_NODIRECT 0x00020000 +#define DF_1_IGNMULDEF 0x00040000 +#define DF_1_NOKSYMS 0x00080000 +#define DF_1_NOHDR 0x00100000 +#define DF_1_EDITED 0x00200000 +#define DF_1_NORELOC 0x00400000 +#define DF_1_SYMINTPOSE 0x00800000 +#define DF_1_GLOBAUDIT 0x01000000 +#define DF_1_SINGLETON 0x02000000 + +/* Flag values for the DT_FLAGS entry. */ +#define DF_ORIGIN (1 << 0) +#define DF_SYMBOLIC (1 << 1) +#define DF_TEXTREL (1 << 2) +#define DF_BIND_NOW (1 << 3) +#define DF_STATIC_TLS (1 << 4) + +/* These constants are used for the version number of a Elf32_Verdef + structure. */ + +#define VER_DEF_NONE 0 +#define VER_DEF_CURRENT 1 + +/* These constants appear in the vd_flags field of a Elf32_Verdef + structure. + + Cf. the Solaris Linker and Libraries Guide, Ch. 7, Object File Format, + Versioning Sections, for a description: + + http://docs.sun.com/app/docs/doc/819-0690/chapter6-93046?l=en&a=view */ + +#define VER_FLG_BASE 0x1 +#define VER_FLG_WEAK 0x2 +#define VER_FLG_INFO 0x4 + +/* These special constants can be found in an Elf32_Versym field. */ + +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 + +/* These constants are used for the version number of a Elf32_Verneed + structure. */ + +#define VER_NEED_NONE 0 +#define VER_NEED_CURRENT 1 + +/* This flag appears in a Versym structure. It means that the symbol + is hidden, and is only visible with an explicit version number. + This is a GNU extension. */ + +#define VERSYM_HIDDEN 0x8000 + +/* This is the mask for the rest of the Versym information. */ + +#define VERSYM_VERSION 0x7fff + +/* This is a special token which appears as part of a symbol name. It + indictes that the rest of the name is actually the name of a + version node, and is not part of the actual name. This is a GNU + extension. For example, the symbol name `stat@ver2' is taken to + mean the symbol `stat' in version `ver2'. */ + +#define ELF_VER_CHR '@' + +/* Possible values for si_boundto. */ + +#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */ +#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */ +#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */ + +/* Possible bitmasks for si_flags. */ + +#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */ +#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */ +#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */ +#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy loaded */ + +/* Syminfo version values. */ + +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +/* Section Group Flags. */ + +#define GRP_COMDAT 0x1 /* A COMDAT group */ + +/* Auxv a_type values. */ + +#define AT_NULL 0 /* End of vector */ +#define AT_IGNORE 1 /* Entry should be ignored */ +#define AT_EXECFD 2 /* File descriptor of program */ +#define AT_PHDR 3 /* Program headers for program */ +#define AT_PHENT 4 /* Size of program header entry */ +#define AT_PHNUM 5 /* Number of program headers */ +#define AT_PAGESZ 6 /* System page size */ +#define AT_BASE 7 /* Base address of interpreter */ +#define AT_FLAGS 8 /* Flags */ +#define AT_ENTRY 9 /* Entry point of program */ +#define AT_NOTELF 10 /* Program is not ELF */ +#define AT_UID 11 /* Real uid */ +#define AT_EUID 12 /* Effective uid */ +#define AT_GID 13 /* Real gid */ +#define AT_EGID 14 /* Effective gid */ +#define AT_CLKTCK 17 /* Frequency of times() */ +#define AT_PLATFORM 15 /* String identifying platform. */ +#define AT_HWCAP 16 /* Machine dependent hints about + processor capabilities. */ +#define AT_FPUCW 18 /* Used FPU control word. */ +#define AT_DCACHEBSIZE 19 /* Data cache block size. */ +#define AT_ICACHEBSIZE 20 /* Instruction cache block size. */ +#define AT_UCACHEBSIZE 21 /* Unified cache block size. */ +#define AT_IGNOREPPC 22 /* Entry should be ignored */ +#define AT_SECURE 23 /* Boolean, was exec setuid-like? */ +#define AT_BASE_PLATFORM 24 /* String identifying real platform, + may differ from AT_PLATFORM. */ +#define AT_RANDOM 25 /* Address of 16 random bytes. */ +#define AT_EXECFN 31 /* Filename of executable. */ +/* Pointer to the global system page used for system calls and other + nice things. */ +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 /* Pointer to ELF header of system-supplied DSO. */ + +/* More complete cache descriptions than AT_[DIU]CACHEBSIZE. If the + value is -1, then the cache doesn't exist. Otherwise: + + bit 0-3: Cache set-associativity; 0 means fully associative. + bit 4-7: Log2 of cacheline size. + bit 8-31: Size of the entire cache >> 8. */ + +#define AT_L1I_CACHESHAPE 34 +#define AT_L1D_CACHESHAPE 35 +#define AT_L2_CACHESHAPE 36 +#define AT_L3_CACHESHAPE 37 + +#define AT_SUN_UID 2000 /* Effective user ID. */ +#define AT_SUN_RUID 2001 /* Real user ID. */ +#define AT_SUN_GID 2002 /* Effective group ID. */ +#define AT_SUN_RGID 2003 /* Real group ID. */ +#define AT_SUN_LDELF 2004 /* Dynamic linker's ELF header. */ +#define AT_SUN_LDSHDR 2005 /* Dynamic linker's section headers. */ +#define AT_SUN_LDNAME 2006 /* String giving name of dynamic linker. */ +#define AT_SUN_LPAGESZ 2007 /* Large pagesize. */ +#define AT_SUN_PLATFORM 2008 /* Platform name string. */ +#define AT_SUN_HWCAP 2009 /* Machine dependent hints about + processor capabilities. */ +#define AT_SUN_IFLUSH 2010 /* Should flush icache? */ +#define AT_SUN_CPU 2011 /* CPU name string. */ +#define AT_SUN_EMUL_ENTRY 2012 /* COFF entry point address. */ +#define AT_SUN_EMUL_EXECFD 2013 /* COFF executable file descriptor. */ +#define AT_SUN_EXECNAME 2014 /* Canonicalized file name given to execve. */ +#define AT_SUN_MMU 2015 /* String for name of MMU module. */ +#define AT_SUN_LDDATA 2016 /* Dynamic linker's data segment address. */ +#define AT_SUN_AUXFLAGS 2017 /* AF_SUN_ flags passed from the kernel. */ + + +#endif /* _ELF_COMMON_H */ diff --git a/include/elf/cr16.h b/include/elf/cr16.h new file mode 100644 index 0000000..3278474 --- /dev/null +++ b/include/elf/cr16.h @@ -0,0 +1,62 @@ +/* CR16 ELF support for BFD. + Copyright 2007, 2010 Free Software Foundation, Inc. + Contributed by M R Swami Reddy. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_CR16_H +#define _ELF_CR16_H + +#include "elf/reloc-macros.h" + +/* Creating indices for reloc_map_index array. */ +START_RELOC_NUMBERS(elf_cr16_reloc_type) + RELOC_NUMBER (R_CR16_NONE, 0) + RELOC_NUMBER (R_CR16_NUM8, 1) + RELOC_NUMBER (R_CR16_NUM16, 2) + RELOC_NUMBER (R_CR16_NUM32, 3) + RELOC_NUMBER (R_CR16_NUM32a, 4) + RELOC_NUMBER (R_CR16_REGREL4, 5) + RELOC_NUMBER (R_CR16_REGREL4a, 6) + RELOC_NUMBER (R_CR16_REGREL14, 7) + RELOC_NUMBER (R_CR16_REGREL14a, 8) + RELOC_NUMBER (R_CR16_REGREL16, 9) + RELOC_NUMBER (R_CR16_REGREL20, 10) + RELOC_NUMBER (R_CR16_REGREL20a, 11) + RELOC_NUMBER (R_CR16_ABS20, 12) + RELOC_NUMBER (R_CR16_ABS24, 13) + RELOC_NUMBER (R_CR16_IMM4, 14) + RELOC_NUMBER (R_CR16_IMM8, 15) + RELOC_NUMBER (R_CR16_IMM16, 16) + RELOC_NUMBER (R_CR16_IMM20, 17) + RELOC_NUMBER (R_CR16_IMM24, 18) + RELOC_NUMBER (R_CR16_IMM32, 19) + RELOC_NUMBER (R_CR16_IMM32a, 20) + RELOC_NUMBER (R_CR16_DISP4, 21) + RELOC_NUMBER (R_CR16_DISP8, 22) + RELOC_NUMBER (R_CR16_DISP16, 23) + RELOC_NUMBER (R_CR16_DISP24, 24) + RELOC_NUMBER (R_CR16_DISP24a, 25) + RELOC_NUMBER (R_CR16_SWITCH8, 26) + RELOC_NUMBER (R_CR16_SWITCH16, 27) + RELOC_NUMBER (R_CR16_SWITCH32, 28) + RELOC_NUMBER (R_CR16_GOT_REGREL20, 29) + RELOC_NUMBER (R_CR16_GOTC_REGREL20, 30) + RELOC_NUMBER (R_CR16_GLOB_DAT, 31) +END_RELOC_NUMBERS(R_CR16_MAX) + +#endif /* _ELF_CR16_H */ diff --git a/include/elf/cr16c.h b/include/elf/cr16c.h new file mode 100644 index 0000000..dbefb0a --- /dev/null +++ b/include/elf/cr16c.h @@ -0,0 +1,258 @@ +/* CR16C ELF support for BFD. + Copyright 2004, 2008, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_CR16C_H +#define _ELF_CR16C_H + +#include "bfd.h" +#include "elf/reloc-macros.h" + +/* Creating indices for reloc_map_index array. */ +START_RELOC_NUMBERS (elf_cr16c_reloc_type) + RELOC_NUMBER (RINDEX_16C_NUM08, 0) + RELOC_NUMBER (RINDEX_16C_NUM08_C, 1) + RELOC_NUMBER (RINDEX_16C_NUM16, 2) + RELOC_NUMBER (RINDEX_16C_NUM16_C, 3) + RELOC_NUMBER (RINDEX_16C_NUM32, 4) + RELOC_NUMBER (RINDEX_16C_NUM32_C, 5) + RELOC_NUMBER (RINDEX_16C_DISP04, 6) + RELOC_NUMBER (RINDEX_16C_DISP04_C, 7) + RELOC_NUMBER (RINDEX_16C_DISP08, 8) + RELOC_NUMBER (RINDEX_16C_DISP08_C, 9) + RELOC_NUMBER (RINDEX_16C_DISP16, 10) + RELOC_NUMBER (RINDEX_16C_DISP16_C, 11) + RELOC_NUMBER (RINDEX_16C_DISP24, 12) + RELOC_NUMBER (RINDEX_16C_DISP24_C, 13) + RELOC_NUMBER (RINDEX_16C_DISP24a, 14) + RELOC_NUMBER (RINDEX_16C_DISP24a_C, 15) + RELOC_NUMBER (RINDEX_16C_REG04, 16) + RELOC_NUMBER (RINDEX_16C_REG04_C, 17) + RELOC_NUMBER (RINDEX_16C_REG04a, 18) + RELOC_NUMBER (RINDEX_16C_REG04a_C, 19) + RELOC_NUMBER (RINDEX_16C_REG14, 20) + RELOC_NUMBER (RINDEX_16C_REG14_C, 21) + RELOC_NUMBER (RINDEX_16C_REG16, 22) + RELOC_NUMBER (RINDEX_16C_REG16_C, 23) + RELOC_NUMBER (RINDEX_16C_REG20, 24) + RELOC_NUMBER (RINDEX_16C_REG20_C, 25) + RELOC_NUMBER (RINDEX_16C_ABS20, 26) + RELOC_NUMBER (RINDEX_16C_ABS20_C, 27) + RELOC_NUMBER (RINDEX_16C_ABS24, 28) + RELOC_NUMBER (RINDEX_16C_ABS24_C, 29) + RELOC_NUMBER (RINDEX_16C_IMM04, 30) + RELOC_NUMBER (RINDEX_16C_IMM04_C, 31) + RELOC_NUMBER (RINDEX_16C_IMM16, 32) + RELOC_NUMBER (RINDEX_16C_IMM16_C, 33) + RELOC_NUMBER (RINDEX_16C_IMM20, 34) + RELOC_NUMBER (RINDEX_16C_IMM20_C, 35) + RELOC_NUMBER (RINDEX_16C_IMM24, 36) + RELOC_NUMBER (RINDEX_16C_IMM24_C, 37) + RELOC_NUMBER (RINDEX_16C_IMM32, 38) + RELOC_NUMBER (RINDEX_16C_IMM32_C, 39) +END_RELOC_NUMBERS (RINDEX_16C_MAX) + +/* CR16C Relocation Types ('cr_reloc_type' entry in the reloc_map structure). + The relocation constant name is determined as follows : + + R_16C_[_C] + + Where : + + is one of the following: + NUM - R_NUMBER mnemonic, + DISP - R_16C_DISPL mnemonic, + REG - R_16C_REGREL mnemonic, + ABS - R_16C_ABS mnemonic, + IMM - R_16C_IMMED mnemonic, + stands for R_S_16C_ + _C means 'code label' and is only added when R_ADDRTYPE subfield + is of type R_CODE_ADDR. */ + +/* The table below shows what the hex digits in the definition of the + relocation type constants correspond to. + ------------------------------------------------------------------ + R_SIZESP R_FORMAT R_RELTO R_ADDRTYPE + ------------------------------------------------------------------ */ +/* R_S_16C_08 R_NUMBER R_ABS R_ADDRESS */ +#define R_16C_NUM08 0X0001 + +/* R_S_16C_08 R_NUMBER R_ABS R_CODE_ADDR */ +#define R_16C_NUM08_C 0X0006 + +/* R_S_16C_16 R_NUMBER R_ABS R_ADDRESS */ +#define R_16C_NUM16 0X1001 + +/* R_S_16C_16 R_NUMBER R_ABS R_CODE_ADDR */ +#define R_16C_NUM16_C 0X1006 + +/* R_S_16C_32 R_NUMBER R_ABS R_ADDRESS */ +#define R_16C_NUM32 0X2001 + +/* R_S_16C_32 R_NUMBER R_ABS R_CODE_ADDR */ +#define R_16C_NUM32_C 0X2006 + +/* R_S_16C_04 R_16C_DISPL R_PCREL R_ADDRESS */ +#define R_16C_DISP04 0X5411 + +/* R_S_16C_04 R_16C_DISPL R_PCREL R_CODE_ADDR */ +#define R_16C_DISP04_C 0X5416 + +/* R_S_16C_08 R_16C_DISPL R_PCREL R_ADDRESS */ +#define R_16C_DISP08 0X0411 + +/* R_S_16C_08 R_16C_DISPL R_PCREL R_CODE_ADDR */ +#define R_16C_DISP08_C 0X0416 + +/* R_S_16C_16 R_16C_DISPL R_PCREL R_ADDRESS */ +#define R_16C_DISP16 0X1411 + +/* R_S_16C_16 R_16C_DISPL R_PCREL R_CODE_ADDR */ +#define R_16C_DISP16_C 0X1416 + +/* R_S_16C_24 R_16C_DISPL R_PCREL R_ADDRESS */ +#define R_16C_DISP24 0X7411 + +/* R_S_16C_24 R_16C_DISPL R_PCREL R_CODE_ADDR */ +#define R_16C_DISP24_C 0X7416 + +/* R_S_16C_24a R_16C_DISPL R_PCREL R_ADDRESS */ +#define R_16C_DISP24a 0X6411 + +/* R_S_16C_24a R_16C_DISPL R_PCREL R_CODE_ADDR */ +#define R_16C_DISP24a_C 0X6416 + +/* R_S_16C_04 R_16C_REGREL R_ABS R_ADDRESS */ +#define R_16C_REG04 0X5201 + +/* R_S_16C_04 R_16C_REGREL R_ABS R_CODE_ADDR */ +#define R_16C_REG04_C 0X5206 + +/* R_S_16C_04_a R_16C_REGREL R_ABS R_ADDRESS */ +#define R_16C_REG04a 0X4201 + +/* R_S_16C_04_a R_16C_REGREL R_ABS R_CODE_ADDR */ +#define R_16C_REG04a_C 0X4206 + +/* R_S_16C_14 R_16C_REGREL R_ABS R_ADDRESS */ +#define R_16C_REG14 0X3201 + +/* R_S_16C_14 R_16C_REGREL R_ABS R_CODE_ADDR */ +#define R_16C_REG14_C 0X3206 + +/* R_S_16C_16 R_16C_REGREL R_ABS R_ADDRESS */ +#define R_16C_REG16 0X1201 + +/* R_S_16C_16 R_16C_REGREL R_ABS R_CODE_ADDR */ +#define R_16C_REG16_C 0X1206 + +/* R_S_16C_20 R_16C_REGREL R_ABS R_ADDRESS */ +#define R_16C_REG20 0X8201 + +/* R_S_16C_20 R_16C_REGREL R_ABS R_CODE_ADDR */ +#define R_16C_REG20_C 0X8206 + +/* R_S_16C_20 R_16C_ABS R_ABS R_ADDRESS */ +#define R_16C_ABS20 0X8101 + +/* R_S_16C_20 R_16C_ABS R_ABS R_CODE_ADDR */ +#define R_16C_ABS20_C 0X8106 + +/* R_S_16C_24 R_16C_ABS R_ABS R_ADDRESS */ +#define R_16C_ABS24 0X7101 + +/* R_S_16C_24 R_16C_ABS R_ABS R_CODE_ADDR */ +#define R_16C_ABS24_C 0X7106 + +/* R_S_16C_04 R_16C_IMMED R_ABS R_ADDRESS */ +#define R_16C_IMM04 0X5301 + +/* R_S_16C_04 R_16C_IMMED R_ABS R_CODE_ADDR */ +#define R_16C_IMM04_C 0X5306 + +/* R_S_16C_16 R_16C_IMMED R_ABS R_ADDRESS */ +#define R_16C_IMM16 0X1301 + +/* R_S_16C_16 R_16C_IMMED R_ABS R_CODE_ADDR */ +#define R_16C_IMM16_C 0X1306 + +/* R_S_16C_20 R_16C_IMMED R_ABS R_ADDRESS */ +#define R_16C_IMM20 0X8301 + +/* R_S_16C_20 R_16C_IMMED R_ABS R_CODE_ADDR */ +#define R_16C_IMM20_C 0X8306 + +/* R_S_16C_24 R_16C_IMMED R_ABS R_ADDRESS */ +#define R_16C_IMM24 0X7301 + +/* R_S_16C_24 R_16C_IMMED R_ABS R_CODE_ADDR */ +#define R_16C_IMM24_C 0X7306 + +/* R_S_16C_32 R_16C_IMMED R_ABS R_ADDRESS */ +#define R_16C_IMM32 0X2301 + +/* R_S_16C_32 R_16C_IMMED R_ABS R_CODE_ADDR */ +#define R_16C_IMM32_C 0X2306 + + +/* Relocation item type. */ +#define R_ADDRTYPE 0x000f +#define R_ADDRESS 0x0001 /* Take address of symbol. */ +#define R_CODE_ADDR 0x0006 /* Take address of symbol divided by 2. */ + +/* Relocation action. */ +#define R_RELTO 0x00f0 +#define R_ABS 0x0000 /* Keep symbol's address as such. */ +#define R_PCREL 0x0010 /* Subtract the pc address of hole. */ + +/* Relocation item data format. */ +#define R_FORMAT 0x0f00 +#define R_NUMBER 0x0000 /* Retain as two's complement value. */ +#define R_16C_DISPL 0x0400 /* CR16C displacement type. */ +#define R_16C_ABS 0x0100 /* CR16C absolute type. */ +#define R_16C_REGREL 0x0200 /* CR16C register-relative type. */ +#define R_16C_IMMED 0x0300 /* CR16C immediate type. */ + +/* Relocation item size. */ +#define R_SIZESP 0xf000 +#define R_S_16C_04 0x5000 +#define R_S_16C_04_a 0x4000 +#define R_S_16C_08 0x0000 +#define R_S_16C_14 0x3000 +#define R_S_16C_16 0x1000 +#define R_S_16C_20 0x8000 +#define R_S_16C_24_a 0x6000 +#define R_S_16C_24 0x7000 +#define R_S_16C_32 0x2000 + + +/* Processor specific section indices. These sections do not actually + exist. Symbols with a st_shndx field corresponding to one of these + values have a special meaning. */ + +/* Far common symbol. */ +#define SHN_CR16C_FCOMMON SHN_LORESERVE +#define SHN_CR16C_NCOMMON (SHN_LORESERVE + 1) + +typedef struct reloc_map +{ + unsigned short cr_reloc_type; /* CR relocation type. */ + bfd_reloc_code_real_type bfd_reloc_enum; /* BFD relocation enum. */ +} RELOC_MAP; + +#endif /* _ELF_CR16C_H */ diff --git a/include/elf/cris.h b/include/elf/cris.h new file mode 100644 index 0000000..5889a90 --- /dev/null +++ b/include/elf/cris.h @@ -0,0 +1,193 @@ +/* CRIS ELF support for BFD. + Copyright 2000, 2001, 2004, 2010 Free Software Foundation, Inc. + Contributed by Axis Communications AB, Lund, Sweden. + Written by Hans-Peter Nilsson. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_CRIS_H +#define _ELF_CRIS_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_cris_reloc_type) + RELOC_NUMBER (R_CRIS_NONE, 0) + RELOC_NUMBER (R_CRIS_8, 1) + RELOC_NUMBER (R_CRIS_16, 2) + RELOC_NUMBER (R_CRIS_32, 3) + + /* The "PC" position is the location right after the relocation. */ + RELOC_NUMBER (R_CRIS_8_PCREL, 4) + RELOC_NUMBER (R_CRIS_16_PCREL, 5) + RELOC_NUMBER (R_CRIS_32_PCREL, 6) + + RELOC_NUMBER (R_CRIS_GNU_VTINHERIT, 7) + RELOC_NUMBER (R_CRIS_GNU_VTENTRY, 8) + + /* Copy contents at dynlinking. Generated by the linker. + The BFD equivalent is BFD_RELOC_CRIS_COPY. */ + RELOC_NUMBER (R_CRIS_COPY, 9) + + /* Create GOT entry. Generated by the linker. + The BFD equivalent is BFD_RELOC_CRIS_GLOB_DAT. */ + RELOC_NUMBER (R_CRIS_GLOB_DAT, 10) + + /* Create PLT entry. Generated by the linker. + The BFD equivalent is BFD_RELOC_CRIS_JUMP_SLOT. */ + RELOC_NUMBER (R_CRIS_JUMP_SLOT, 11) + + /* Adjust by program base. Generated by the linker. + The BFD equivalent is BFD_RELOC_CRIS_RELATIVE. */ + RELOC_NUMBER (R_CRIS_RELATIVE, 12) + + /* A 16-bit offset to entry in GOT and request to create GOT entry for + that symbol. + The BFD equivalent is BFD_RELOC_CRIS_16_GOT. */ + RELOC_NUMBER (R_CRIS_16_GOT, 13) + + /* A 32-bit offset to entry in GOT and request to create GOT entry for + that symbol. + The BFD equivalent is BFD_RELOC_CRIS_32_GOT. */ + RELOC_NUMBER (R_CRIS_32_GOT, 14) + + /* A 16-bit offset to entry in PLT part of GOT and request to create PLT + entry for that symbol. + The BFD equivalent is BFD_RELOC_CRIS_16_GOTPLT. */ + RELOC_NUMBER (R_CRIS_16_GOTPLT, 15) + + /* A 32-bit offset to entry in PLT part of GOT and request to create PLT + entry for that symbol. + The BFD equivalent is BFD_RELOC_CRIS_32_GOTPLT. */ + RELOC_NUMBER (R_CRIS_32_GOTPLT, 16) + + /* A 32-bit offset from GOT to (local) symbol: no GOT entry should be + necessary. + The BFD equivalent is BFD_RELOC_CRIS_32_GOTREL. */ + RELOC_NUMBER (R_CRIS_32_GOTREL, 17) + + /* A 32-bit offset from GOT to entry for this symbol in PLT and request + to create PLT entry for symbol. + The BFD equivalent is BFD_RELOC_CRIS_32_GOTREL. */ + RELOC_NUMBER (R_CRIS_32_PLT_GOTREL, 18) + + /* A 32-bit offset from location after this relocation (addend specifies + offset) to entry for this symbol in PLT and request to create PLT + entry for symbol. + The BFD equivalent is BFD_RELOC_CRIS_32_PLT_PCREL. */ + RELOC_NUMBER (R_CRIS_32_PLT_PCREL, 19) + + /* An assembler-generated-only relocation, instructing the linker to + reserve two GOT slots, carrying the R_CRIS_DTP relocation for the + symbol (pointing to the first slot, the relocation fills in + both). The value is a 32-bit-value, relative to the start of the + GOT. Assembly syntax: "sym:GDGOTREL". */ + RELOC_NUMBER (R_CRIS_32_GOT_GD, 20) + + /* Similar to R_CRIS_32_GOT_GD, but the value is a 16-bit unsigned + number, limiting access to 65536/4 global symbols per module (or + 65536/8 thread variables; loosely speaking G*4+T*8 < 65536, where + T is the number of thread variables and G is the number of other + external global variables and functions). Assembly syntax: + "sym:GDGOTREL16". */ + RELOC_NUMBER (R_CRIS_16_GOT_GD, 21) + + /* Similar to R_CRIS_32_GOT_GD, but the value is the absolute + address of the GOT entry. Disallowed in DSOs created with + -shared. Assembly syntax: "sym:GD". */ + RELOC_NUMBER (R_CRIS_32_GD, 22) + + /* A linker-generated-only relocation, instructing the dynamic + linker to fill in the module ID and module-relative-TLS-block + offset of the symbol in question, used for GOT entries. Note + that this relocation instructs to fill in two 32-bit values. */ + RELOC_NUMBER (R_CRIS_DTP, 23) + + /* An assembler-generated-only relocation, instructing the linker to + reserve the first two GOT slots, and attach the R_CRIS_DTPMOD + relocation(*) for the module to the first slot, the second + containing zero. The value is 32 bits, the offset from the start + of the TLS block of the module to the thread-local symbol + mentioned in the relocation. This relocation must only be applied + to module-local symbols. Assembly syntax: "expr:DTPREL". */ + RELOC_NUMBER (R_CRIS_32_DTPREL, 24) + + /* Similar to R_CRIS_32_DTPREL, but the value is a 16-bit signed + number, limiting the size of thread-variables of the DSO to 32768 + bytes. (Note: matches both model 1 and 2 and allows use of addo.w + as the instruction where this relocation is used.) Assembly + syntax: "expr:DTPREL16". */ + RELOC_NUMBER (R_CRIS_16_DTPREL, 25) + + /* An assembler-generated-only relocation, instructing the linker to + reserve a GOT slot and attach the R_CRIS_32_TPREL relocation for + the symbol in question. The value is 32 bits, which is the + GOT-relative offset of the slot. Assembly syntax: + "sym:TPOFFGOT". */ + RELOC_NUMBER (R_CRIS_32_GOT_TPREL, 26) + + /* Similar to R_CRIS_32_TPREL, but the value is a 16-bit positive + number, limiting the number of thread- and global variables of + the DSO to 32768/4. Assembly syntax: "sym:TPOFFGOT16". */ + RELOC_NUMBER (R_CRIS_16_GOT_TPREL, 27) + + /* An assembler- and linker-generated relocation, instructing to + resolve the symbol in question yielding the TLS offset of the + thread variable, relative to the global TLS block. Not allowed + as input when generating a DSO. Assembly syntax: + "expr:TPOFF". */ + RELOC_NUMBER (R_CRIS_32_TPREL, 28) + + /* Similar to R_CRIS_32_TPREL, but only applicable to executables + compiled with -msmall-tls. Not allowed in a DSO. The value is a + 16-bit signed number, limiting the size of thread-variables of + the executable to 32768 bytes. (Note: being signed makes it match + both model 1 and 2 and allows use of addo.w as the instruction + where this relocation is applied.) Assembly syntax: + "expr:TPOFF16". */ + RELOC_NUMBER (R_CRIS_16_TPREL, 29) + + /* A linker-generated-only relocation, instructing the dynamic + linker to fill in the current module ID, used for GOT entries + (usually the fourth one). */ + RELOC_NUMBER (R_CRIS_DTPMOD, 30) + + /* Similar to R_CRIS_32_GOT_TPREL, but the value is the absolute + address of the GOT entry. Disallowed in DSOs created with + -shared. Assembly syntax: "sym:IE". */ + RELOC_NUMBER (R_CRIS_32_IE, 31) + + /* No other relocs must be visible outside the assembler. */ + +END_RELOC_NUMBERS (R_CRIS_max) + +/* User symbols in this file have a leading underscore. */ +#define EF_CRIS_UNDERSCORE 0x00000001 + +/* This is a mask for different incompatible machine variants. */ +#define EF_CRIS_VARIANT_MASK 0x0000000e + +/* Variant 0; may contain v0..10 object. */ +#define EF_CRIS_VARIANT_ANY_V0_V10 0x00000000 + +/* Variant 1; contains v32 object. */ +#define EF_CRIS_VARIANT_V32 0x00000002 + +/* Variant 2; contains object compatible with v32 and v10. */ +#define EF_CRIS_VARIANT_COMMON_V10_V32 0x00000004 + +#endif /* _ELF_CRIS_H */ diff --git a/include/elf/crx.h b/include/elf/crx.h new file mode 100644 index 0000000..38428f2 --- /dev/null +++ b/include/elf/crx.h @@ -0,0 +1,53 @@ +/* CRX ELF support for BFD. + Copyright 2004, 2010 Free Software Foundation, Inc. + Contributed by Tomer Levi, NSC, Israel. + Originally written for GAS 2.12 by Tomer Levi, NSC, Israel. + Updates, BFDizing, GNUifying and ELF support by Tomer Levi. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_CRX_H +#define _ELF_CRX_H + +#include "elf/reloc-macros.h" + +/* Creating indices for reloc_map_index array. */ +START_RELOC_NUMBERS(elf_crx_reloc_type) + RELOC_NUMBER (R_CRX_NONE, 0) + RELOC_NUMBER (R_CRX_REL4, 1) + RELOC_NUMBER (R_CRX_REL8, 2) + RELOC_NUMBER (R_CRX_REL8_CMP, 3) + RELOC_NUMBER (R_CRX_REL16, 4) + RELOC_NUMBER (R_CRX_REL24, 5) + RELOC_NUMBER (R_CRX_REL32, 6) + RELOC_NUMBER (R_CRX_REGREL12, 7) + RELOC_NUMBER (R_CRX_REGREL22, 8) + RELOC_NUMBER (R_CRX_REGREL28, 9) + RELOC_NUMBER (R_CRX_REGREL32, 10) + RELOC_NUMBER (R_CRX_ABS16, 11) + RELOC_NUMBER (R_CRX_ABS32, 12) + RELOC_NUMBER (R_CRX_NUM8, 13) + RELOC_NUMBER (R_CRX_NUM16, 14) + RELOC_NUMBER (R_CRX_NUM32, 15) + RELOC_NUMBER (R_CRX_IMM16, 16) + RELOC_NUMBER (R_CRX_IMM32, 17) + RELOC_NUMBER (R_CRX_SWITCH8, 18) + RELOC_NUMBER (R_CRX_SWITCH16, 19) + RELOC_NUMBER (R_CRX_SWITCH32, 20) +END_RELOC_NUMBERS(R_CRX_MAX) + +#endif /* _ELF_CRX_H */ diff --git a/include/elf/d10v.h b/include/elf/d10v.h new file mode 100644 index 0000000..5850b37 --- /dev/null +++ b/include/elf/d10v.h @@ -0,0 +1,38 @@ +/* d10v ELF support for BFD. + Copyright 1998, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_D10V_H +#define _ELF_D10V_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_d10v_reloc_type) + RELOC_NUMBER (R_D10V_NONE, 0) + RELOC_NUMBER (R_D10V_10_PCREL_R, 1) + RELOC_NUMBER (R_D10V_10_PCREL_L, 2) + RELOC_NUMBER (R_D10V_16, 3) + RELOC_NUMBER (R_D10V_18, 4) + RELOC_NUMBER (R_D10V_18_PCREL, 5) + RELOC_NUMBER (R_D10V_32, 6) + RELOC_NUMBER (R_D10V_GNU_VTINHERIT, 7) + RELOC_NUMBER (R_D10V_GNU_VTENTRY, 8) +END_RELOC_NUMBERS (R_D10V_max) + +#endif diff --git a/include/elf/d30v.h b/include/elf/d30v.h new file mode 100644 index 0000000..8174a40 --- /dev/null +++ b/include/elf/d30v.h @@ -0,0 +1,42 @@ +/* d30v ELF support for BFD. + Copyright 1998, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_D30V_H +#define _ELF_D30V_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_d30v_reloc_type) + RELOC_NUMBER (R_D30V_NONE, 0) + RELOC_NUMBER (R_D30V_6, 1) + RELOC_NUMBER (R_D30V_9_PCREL, 2) + RELOC_NUMBER (R_D30V_9_PCREL_R, 3) + RELOC_NUMBER (R_D30V_15, 4) + RELOC_NUMBER (R_D30V_15_PCREL, 5) + RELOC_NUMBER (R_D30V_15_PCREL_R, 6) + RELOC_NUMBER (R_D30V_21, 7) + RELOC_NUMBER (R_D30V_21_PCREL, 8) + RELOC_NUMBER (R_D30V_21_PCREL_R, 9) + RELOC_NUMBER (R_D30V_32, 10) + RELOC_NUMBER (R_D30V_32_PCREL, 11) + RELOC_NUMBER (R_D30V_32_NORMAL, 12) +END_RELOC_NUMBERS (R_D30V_max) + +#endif diff --git a/include/elf/dlx.h b/include/elf/dlx.h new file mode 100644 index 0000000..7d61633 --- /dev/null +++ b/include/elf/dlx.h @@ -0,0 +1,53 @@ +/* DLX support for BFD. + Copyright 2002, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_DLX_H +#define _ELF_DLX_H + +#include "elf/reloc-macros.h" + +#if 0 +START_RELOC_NUMBERS (elf_dlx_reloc_type) + RELOC_NUMBER (R_DLX_NONE, 0) + RELOC_NUMBER (R_DLX_RELOC_16, 1) + RELOC_NUMBER (R_DLX_RELOC_26, 2) + RELOC_NUMBER (R_DLX_RELOC_32, 3) + RELOC_NUMBER (R_DLX_GNU_VTINHERIT, 4) + RELOC_NUMBER (R_DLX_GNU_VTENTRY, 5) + RELOC_NUMBER (R_DLX_RELOC_16_HI, 6) + RELOC_NUMBER (R_DLX_RELOC_16_LO, 7) + RELOC_NUMBER (R_DLX_RELOC_16_PCREL, 8) + RELOC_NUMBER (R_DLX_RELOC_26_PCREL, 9) +END_RELOC_NUMBERS (R_DLX_max) +#else +START_RELOC_NUMBERS (elf_dlx_reloc_type) + RELOC_NUMBER (R_DLX_NONE, 0) + RELOC_NUMBER (R_DLX_RELOC_8, 1) + RELOC_NUMBER (R_DLX_RELOC_16, 2) + RELOC_NUMBER (R_DLX_RELOC_32, 3) + RELOC_NUMBER (R_DLX_GNU_VTINHERIT, 4) + RELOC_NUMBER (R_DLX_GNU_VTENTRY, 5) + RELOC_NUMBER (R_DLX_RELOC_16_HI, 6) + RELOC_NUMBER (R_DLX_RELOC_16_LO, 7) + RELOC_NUMBER (R_DLX_RELOC_16_PCREL, 8) + RELOC_NUMBER (R_DLX_RELOC_26_PCREL, 9) +END_RELOC_NUMBERS (R_DLX_max) +#endif /* 0 */ + +#endif /* _ELF_DLX_H */ diff --git a/include/elf/dwarf.h b/include/elf/dwarf.h new file mode 100644 index 0000000..c2e6a67 --- /dev/null +++ b/include/elf/dwarf.h @@ -0,0 +1,323 @@ +/* Declarations and definitions of codes relating to the DWARF symbolic + debugging information format. + + Written by Ron Guilmette (rfg@netcom.com) + + Copyright 1992, 1993, 1995, 1999, 2005, 2010 Free Software Foundation, Inc. + + This file is part of both GCC and the BFD library. + + 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 GCC; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* This file is derived from the DWARF specification (a public document) + Revision 1.0.1 (April 8, 1992) developed by the UNIX International + Programming Languages Special Interest Group (UI/PLSIG) and distributed + by UNIX International. Copies of this specification are available from + UNIX International, 20 Waterview Boulevard, Parsippany, NJ, 07054. */ + +#ifndef _ELF_DWARF_H +#define _ELF_DWARF_H + +/* Tag names and codes. */ + +enum dwarf_tag { + TAG_padding = 0x0000, + TAG_array_type = 0x0001, + TAG_class_type = 0x0002, + TAG_entry_point = 0x0003, + TAG_enumeration_type = 0x0004, + TAG_formal_parameter = 0x0005, + TAG_global_subroutine = 0x0006, + TAG_global_variable = 0x0007, + /* 0x0008 -- reserved */ + /* 0x0009 -- reserved */ + TAG_label = 0x000a, + TAG_lexical_block = 0x000b, + TAG_local_variable = 0x000c, + TAG_member = 0x000d, + /* 0x000e -- reserved */ + TAG_pointer_type = 0x000f, + TAG_reference_type = 0x0010, + TAG_compile_unit = 0x0011, + TAG_string_type = 0x0012, + TAG_structure_type = 0x0013, + TAG_subroutine = 0x0014, + TAG_subroutine_type = 0x0015, + TAG_typedef = 0x0016, + TAG_union_type = 0x0017, + TAG_unspecified_parameters = 0x0018, + TAG_variant = 0x0019, + TAG_common_block = 0x001a, + TAG_common_inclusion = 0x001b, + TAG_inheritance = 0x001c, + TAG_inlined_subroutine = 0x001d, + TAG_module = 0x001e, + TAG_ptr_to_member_type = 0x001f, + TAG_set_type = 0x0020, + TAG_subrange_type = 0x0021, + TAG_with_stmt = 0x0022, + + /* GNU extensions */ + + TAG_format_label = 0x8000, /* for FORTRAN 77 and Fortran 90 */ + TAG_namelist = 0x8001, /* For Fortran 90 */ + TAG_function_template = 0x8002, /* for C++ */ + TAG_class_template = 0x8003 /* for C++ */ +}; + +#define TAG_lo_user 0x8000 /* implementation-defined range start */ +#define TAG_hi_user 0xffff /* implementation-defined range end */ +#define TAG_source_file TAG_compile_unit /* for backward compatibility */ + +/* Form names and codes. */ + +enum dwarf_form { + FORM_ADDR = 0x1, + FORM_REF = 0x2, + FORM_BLOCK2 = 0x3, + FORM_BLOCK4 = 0x4, + FORM_DATA2 = 0x5, + FORM_DATA4 = 0x6, + FORM_DATA8 = 0x7, + FORM_STRING = 0x8 +}; + +/* Attribute names and codes. */ + +enum dwarf_attribute { + AT_sibling = (0x0010|FORM_REF), + AT_location = (0x0020|FORM_BLOCK2), + AT_name = (0x0030|FORM_STRING), + AT_fund_type = (0x0050|FORM_DATA2), + AT_mod_fund_type = (0x0060|FORM_BLOCK2), + AT_user_def_type = (0x0070|FORM_REF), + AT_mod_u_d_type = (0x0080|FORM_BLOCK2), + AT_ordering = (0x0090|FORM_DATA2), + AT_subscr_data = (0x00a0|FORM_BLOCK2), + AT_byte_size = (0x00b0|FORM_DATA4), + AT_bit_offset = (0x00c0|FORM_DATA2), + AT_bit_size = (0x00d0|FORM_DATA4), + /* (0x00e0|FORM_xxxx) -- reserved */ + AT_element_list = (0x00f0|FORM_BLOCK4), + AT_stmt_list = (0x0100|FORM_DATA4), + AT_low_pc = (0x0110|FORM_ADDR), + AT_high_pc = (0x0120|FORM_ADDR), + AT_language = (0x0130|FORM_DATA4), + AT_member = (0x0140|FORM_REF), + AT_discr = (0x0150|FORM_REF), + AT_discr_value = (0x0160|FORM_BLOCK2), + /* (0x0170|FORM_xxxx) -- reserved */ + /* (0x0180|FORM_xxxx) -- reserved */ + AT_string_length = (0x0190|FORM_BLOCK2), + AT_common_reference = (0x01a0|FORM_REF), + AT_comp_dir = (0x01b0|FORM_STRING), + AT_const_value_string = (0x01c0|FORM_STRING), + AT_const_value_data2 = (0x01c0|FORM_DATA2), + AT_const_value_data4 = (0x01c0|FORM_DATA4), + AT_const_value_data8 = (0x01c0|FORM_DATA8), + AT_const_value_block2 = (0x01c0|FORM_BLOCK2), + AT_const_value_block4 = (0x01c0|FORM_BLOCK4), + AT_containing_type = (0x01d0|FORM_REF), + AT_default_value_addr = (0x01e0|FORM_ADDR), + AT_default_value_data2 = (0x01e0|FORM_DATA2), + AT_default_value_data4 = (0x01e0|FORM_DATA4), + AT_default_value_data8 = (0x01e0|FORM_DATA8), + AT_default_value_string = (0x01e0|FORM_STRING), + AT_friends = (0x01f0|FORM_BLOCK2), + AT_inline = (0x0200|FORM_STRING), + AT_is_optional = (0x0210|FORM_STRING), + AT_lower_bound_ref = (0x0220|FORM_REF), + AT_lower_bound_data2 = (0x0220|FORM_DATA2), + AT_lower_bound_data4 = (0x0220|FORM_DATA4), + AT_lower_bound_data8 = (0x0220|FORM_DATA8), + AT_private = (0x0240|FORM_STRING), + AT_producer = (0x0250|FORM_STRING), + AT_program = (0x0230|FORM_STRING), + AT_protected = (0x0260|FORM_STRING), + AT_prototyped = (0x0270|FORM_STRING), + AT_public = (0x0280|FORM_STRING), + AT_pure_virtual = (0x0290|FORM_STRING), + AT_return_addr = (0x02a0|FORM_BLOCK2), + AT_abstract_origin = (0x02b0|FORM_REF), + AT_start_scope = (0x02c0|FORM_DATA4), + AT_stride_size = (0x02e0|FORM_DATA4), + AT_upper_bound_ref = (0x02f0|FORM_REF), + AT_upper_bound_data2 = (0x02f0|FORM_DATA2), + AT_upper_bound_data4 = (0x02f0|FORM_DATA4), + AT_upper_bound_data8 = (0x02f0|FORM_DATA8), + AT_virtual = (0x0300|FORM_STRING), + + /* GNU extensions. */ + + AT_sf_names = (0x8000|FORM_DATA4), + AT_src_info = (0x8010|FORM_DATA4), + AT_mac_info = (0x8020|FORM_DATA4), + AT_src_coords = (0x8030|FORM_DATA4), + AT_body_begin = (0x8040|FORM_ADDR), + AT_body_end = (0x8050|FORM_ADDR) +}; + +#define AT_lo_user 0x2000 /* implementation-defined range start */ +#define AT_hi_user 0x3ff0 /* implementation-defined range end */ + +/* Location atom names and codes. */ + +enum dwarf_location_atom { + OP_REG = 0x01, + OP_BASEREG = 0x02, + OP_ADDR = 0x03, + OP_CONST = 0x04, + OP_DEREF2 = 0x05, + OP_DEREF4 = 0x06, + OP_ADD = 0x07, + + /* GNU extensions. */ + + OP_MULT = 0x80 +}; + +#define OP_LO_USER 0x80 /* implementation-defined range start */ +#define OP_HI_USER 0xff /* implementation-defined range end */ + +/* Fundamental type names and codes. */ + +enum dwarf_fundamental_type { + FT_char = 0x0001, + FT_signed_char = 0x0002, + FT_unsigned_char = 0x0003, + FT_short = 0x0004, + FT_signed_short = 0x0005, + FT_unsigned_short = 0x0006, + FT_integer = 0x0007, + FT_signed_integer = 0x0008, + FT_unsigned_integer = 0x0009, + FT_long = 0x000a, + FT_signed_long = 0x000b, + FT_unsigned_long = 0x000c, + FT_pointer = 0x000d, /* an alias for (void *) */ + FT_float = 0x000e, + FT_dbl_prec_float = 0x000f, + FT_ext_prec_float = 0x0010, /* breaks "classic" svr4 SDB */ + FT_complex = 0x0011, /* breaks "classic" svr4 SDB */ + FT_dbl_prec_complex = 0x0012, /* breaks "classic" svr4 SDB */ + /* 0x0013 -- reserved */ + FT_void = 0x0014, + FT_boolean = 0x0015, /* breaks "classic" svr4 SDB */ + FT_ext_prec_complex = 0x0016, /* breaks "classic" svr4 SDB */ + FT_label = 0x0017, + + /* GNU extensions + The low order byte must indicate the size (in bytes) for the type. + All of these types will probably break "classic" svr4 SDB. */ + + FT_long_long = 0x8008, + FT_signed_long_long = 0x8108, + FT_unsigned_long_long = 0x8208, + + FT_int8 = 0x9001, + FT_signed_int8 = 0x9101, + FT_unsigned_int8 = 0x9201, + FT_int16 = 0x9302, + FT_signed_int16 = 0x9402, + FT_unsigned_int16 = 0x9502, + FT_int32 = 0x9604, + FT_signed_int32 = 0x9704, + FT_unsigned_int32 = 0x9804, + FT_int64 = 0x9908, + FT_signed_int64 = 0x9a08, + FT_unsigned_int64 = 0x9b08, + FT_int128 = 0x9c10, + FT_signed_int128 = 0x9d10, + FT_unsigned_int128 = 0x9e10, + + FT_real32 = 0xa004, + FT_real64 = 0xa108, + FT_real96 = 0xa20c, + FT_real128 = 0xa310 +}; + +#define FT_lo_user 0x8000 /* implementation-defined range start */ +#define FT_hi_user 0xffff /* implementation defined range end */ + +/* Type modifier names and codes. */ + +enum dwarf_type_modifier { + MOD_pointer_to = 0x01, + MOD_reference_to = 0x02, + MOD_const = 0x03, + MOD_volatile = 0x04 +}; + +#define MOD_lo_user 0x80 /* implementation-defined range start */ +#define MOD_hi_user 0xff /* implementation-defined range end */ + +/* Array ordering names and codes. */ + +enum dwarf_array_dim_ordering { + ORD_row_major = 0, + ORD_col_major = 1 +}; + +/* Array subscript format names and codes. */ + +enum dwarf_subscr_data_formats { + FMT_FT_C_C = 0x0, + FMT_FT_C_X = 0x1, + FMT_FT_X_C = 0x2, + FMT_FT_X_X = 0x3, + FMT_UT_C_C = 0x4, + FMT_UT_C_X = 0x5, + FMT_UT_X_C = 0x6, + FMT_UT_X_X = 0x7, + FMT_ET = 0x8 +}; + +/* Derived from above for ease of use. */ + +#define FMT_CODE(_FUNDAMENTAL_TYPE_P, _LB_CONST_P, _UB_CONST_P) \ + (((_FUNDAMENTAL_TYPE_P) ? 0 : 4) \ + | ((_LB_CONST_P) ? 0 : 2) \ + | ((_UB_CONST_P) ? 0 : 1)) + +/* Source language names and codes. */ + +enum dwarf_source_language { + LANG_C89 = 0x00000001, + LANG_C = 0x00000002, + LANG_ADA83 = 0x00000003, + LANG_C_PLUS_PLUS = 0x00000004, + LANG_COBOL74 = 0x00000005, + LANG_COBOL85 = 0x00000006, + LANG_FORTRAN77 = 0x00000007, + LANG_FORTRAN90 = 0x00000008, + LANG_PASCAL83 = 0x00000009, + LANG_MODULA2 = 0x0000000a, + LANG_JAVA = 0x0000000b +}; + +#define LANG_lo_user 0x00008000 /* implementation-defined range start */ +#define LANG_hi_user 0x0000ffff /* implementation-defined range end */ + +/* Names and codes for GNU "macinfo" extension. */ + +enum dwarf_macinfo_record_type { + MACINFO_start = 's', + MACINFO_resume = 'r', + MACINFO_define = 'd', + MACINFO_undef = 'u' +}; + +#endif /* _ELF_DWARF_H */ diff --git a/include/elf/epiphany.h b/include/elf/epiphany.h new file mode 100644 index 0000000..bb2dcff --- /dev/null +++ b/include/elf/epiphany.h @@ -0,0 +1,59 @@ +/* Adapteva EPIPHANY ELF support for BFD. + Copyright (C) 2009, 2011 Free Software Foundation, Inc. + Contributed by Embecosm on behalf of Adapteva, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_EPIPHANY_H +#define _ELF_EPIPHANY_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_epiphany_reloc_type) + RELOC_NUMBER (R_EPIPHANY_NONE, 0) + + /* Absolute address relocations. */ + RELOC_NUMBER (R_EPIPHANY_8, 1) + RELOC_NUMBER (R_EPIPHANY_16, 2) + RELOC_NUMBER (R_EPIPHANY_32, 3) + + /* PC-relative relocations. */ + RELOC_NUMBER (R_EPIPHANY_8_PCREL, 4) + RELOC_NUMBER (R_EPIPHANY_16_PCREL,5) + RELOC_NUMBER (R_EPIPHANY_32_PCREL,6) + + /* special forms for 8/24 bit branch displacements. */ + RELOC_NUMBER (R_EPIPHANY_SIMM8, 7) + RELOC_NUMBER (R_EPIPHANY_SIMM24, 8) + + /* HIGH and LOW relocations taking part of a 32 bit address and + depositing it into the IMM16 field of a destination. */ + RELOC_NUMBER (R_EPIPHANY_HIGH, 9) + RELOC_NUMBER (R_EPIPHANY_LOW,10) + + /* 11 bit signed immediate value. */ + RELOC_NUMBER (R_EPIPHANY_SIMM11, 11) + /* 11 bit magnitude addressing displacement. */ + RELOC_NUMBER (R_EPIPHANY_IMM11, 12) + + /* 8 bit immediate for MOV.S R,IMM8. */ + RELOC_NUMBER (R_EPIPHANY_IMM8, 13) + +END_RELOC_NUMBERS(R_EPIPHANY_max) + +#endif /* _ELF_EPIPHANY_H */ diff --git a/include/elf/external.h b/include/elf/external.h new file mode 100644 index 0000000..ef7724e --- /dev/null +++ b/include/elf/external.h @@ -0,0 +1,288 @@ +/* ELF support for BFD. + Copyright 1991, 1992, 1993, 1995, 1997, 1998, 1999, 2001, 2003, 2005, + 2008, 2010 Free Software Foundation, Inc. + + Written by Fred Fish @ Cygnus Support, from information published + in "UNIX System V Release 4, Programmers Guide: ANSI C and + Programming Support Tools". + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is part of ELF support for BFD, and contains the portions + that describe how ELF is represented externally by the BFD library. + I.E. it describes the in-file representation of ELF. It requires + the elf/common.h file which contains the portions that are common to + both the internal and external representations. */ + +/* The 64-bit stuff is kind of random. Perhaps someone will publish a + spec someday. */ + +#ifndef _ELF_EXTERNAL_H +#define _ELF_EXTERNAL_H + +/* Special section indices, which may show up in st_shndx fields, among + other places. */ + +#define SHN_LORESERVE 0xFF00 /* Begin range of reserved indices */ +#define SHN_LOPROC 0xFF00 /* Begin range of appl-specific */ +#define SHN_HIPROC 0xFF1F /* End range of appl-specific */ +#define SHN_LOOS 0xFF20 /* OS specific semantics, lo */ +#define SHN_HIOS 0xFF3F /* OS specific semantics, hi */ +#define SHN_ABS 0xFFF1 /* Associated symbol is absolute */ +#define SHN_COMMON 0xFFF2 /* Associated symbol is in common */ +#define SHN_XINDEX 0xFFFF /* Section index is held elsewhere */ +#define SHN_HIRESERVE 0xFFFF /* End range of reserved indices */ + +/* ELF Header (32-bit implementations) */ + +typedef struct { + unsigned char e_ident[16]; /* ELF "magic number" */ + unsigned char e_type[2]; /* Identifies object file type */ + unsigned char e_machine[2]; /* Specifies required architecture */ + unsigned char e_version[4]; /* Identifies object file version */ + unsigned char e_entry[4]; /* Entry point virtual address */ + unsigned char e_phoff[4]; /* Program header table file offset */ + unsigned char e_shoff[4]; /* Section header table file offset */ + unsigned char e_flags[4]; /* Processor-specific flags */ + unsigned char e_ehsize[2]; /* ELF header size in bytes */ + unsigned char e_phentsize[2]; /* Program header table entry size */ + unsigned char e_phnum[2]; /* Program header table entry count */ + unsigned char e_shentsize[2]; /* Section header table entry size */ + unsigned char e_shnum[2]; /* Section header table entry count */ + unsigned char e_shstrndx[2]; /* Section header string table index */ +} Elf32_External_Ehdr; + +typedef struct { + unsigned char e_ident[16]; /* ELF "magic number" */ + unsigned char e_type[2]; /* Identifies object file type */ + unsigned char e_machine[2]; /* Specifies required architecture */ + unsigned char e_version[4]; /* Identifies object file version */ + unsigned char e_entry[8]; /* Entry point virtual address */ + unsigned char e_phoff[8]; /* Program header table file offset */ + unsigned char e_shoff[8]; /* Section header table file offset */ + unsigned char e_flags[4]; /* Processor-specific flags */ + unsigned char e_ehsize[2]; /* ELF header size in bytes */ + unsigned char e_phentsize[2]; /* Program header table entry size */ + unsigned char e_phnum[2]; /* Program header table entry count */ + unsigned char e_shentsize[2]; /* Section header table entry size */ + unsigned char e_shnum[2]; /* Section header table entry count */ + unsigned char e_shstrndx[2]; /* Section header string table index */ +} Elf64_External_Ehdr; + +/* Program header */ + +typedef struct { + unsigned char p_type[4]; /* Identifies program segment type */ + unsigned char p_offset[4]; /* Segment file offset */ + unsigned char p_vaddr[4]; /* Segment virtual address */ + unsigned char p_paddr[4]; /* Segment physical address */ + unsigned char p_filesz[4]; /* Segment size in file */ + unsigned char p_memsz[4]; /* Segment size in memory */ + unsigned char p_flags[4]; /* Segment flags */ + unsigned char p_align[4]; /* Segment alignment, file & memory */ +} Elf32_External_Phdr; + +typedef struct { + unsigned char p_type[4]; /* Identifies program segment type */ + unsigned char p_flags[4]; /* Segment flags */ + unsigned char p_offset[8]; /* Segment file offset */ + unsigned char p_vaddr[8]; /* Segment virtual address */ + unsigned char p_paddr[8]; /* Segment physical address */ + unsigned char p_filesz[8]; /* Segment size in file */ + unsigned char p_memsz[8]; /* Segment size in memory */ + unsigned char p_align[8]; /* Segment alignment, file & memory */ +} Elf64_External_Phdr; + +/* Section header */ + +typedef struct { + unsigned char sh_name[4]; /* Section name, index in string tbl */ + unsigned char sh_type[4]; /* Type of section */ + unsigned char sh_flags[4]; /* Miscellaneous section attributes */ + unsigned char sh_addr[4]; /* Section virtual addr at execution */ + unsigned char sh_offset[4]; /* Section file offset */ + unsigned char sh_size[4]; /* Size of section in bytes */ + unsigned char sh_link[4]; /* Index of another section */ + unsigned char sh_info[4]; /* Additional section information */ + unsigned char sh_addralign[4]; /* Section alignment */ + unsigned char sh_entsize[4]; /* Entry size if section holds table */ +} Elf32_External_Shdr; + +typedef struct { + unsigned char sh_name[4]; /* Section name, index in string tbl */ + unsigned char sh_type[4]; /* Type of section */ + unsigned char sh_flags[8]; /* Miscellaneous section attributes */ + unsigned char sh_addr[8]; /* Section virtual addr at execution */ + unsigned char sh_offset[8]; /* Section file offset */ + unsigned char sh_size[8]; /* Size of section in bytes */ + unsigned char sh_link[4]; /* Index of another section */ + unsigned char sh_info[4]; /* Additional section information */ + unsigned char sh_addralign[8]; /* Section alignment */ + unsigned char sh_entsize[8]; /* Entry size if section holds table */ +} Elf64_External_Shdr; + +/* Symbol table entry */ + +typedef struct { + unsigned char st_name[4]; /* Symbol name, index in string tbl */ + unsigned char st_value[4]; /* Value of the symbol */ + unsigned char st_size[4]; /* Associated symbol size */ + unsigned char st_info[1]; /* Type and binding attributes */ + unsigned char st_other[1]; /* No defined meaning, 0 */ + unsigned char st_shndx[2]; /* Associated section index */ +} Elf32_External_Sym; + +typedef struct { + unsigned char st_name[4]; /* Symbol name, index in string tbl */ + unsigned char st_info[1]; /* Type and binding attributes */ + unsigned char st_other[1]; /* No defined meaning, 0 */ + unsigned char st_shndx[2]; /* Associated section index */ + unsigned char st_value[8]; /* Value of the symbol */ + unsigned char st_size[8]; /* Associated symbol size */ +} Elf64_External_Sym; + +typedef struct { + unsigned char est_shndx[4]; /* Section index */ +} Elf_External_Sym_Shndx; + +/* Note segments */ + +typedef struct { + unsigned char namesz[4]; /* Size of entry's owner string */ + unsigned char descsz[4]; /* Size of the note descriptor */ + unsigned char type[4]; /* Interpretation of the descriptor */ + char name[1]; /* Start of the name+desc data */ +} Elf_External_Note; + +/* Relocation Entries */ +typedef struct { + unsigned char r_offset[4]; /* Location at which to apply the action */ + unsigned char r_info[4]; /* index and type of relocation */ +} Elf32_External_Rel; + +typedef struct { + unsigned char r_offset[4]; /* Location at which to apply the action */ + unsigned char r_info[4]; /* index and type of relocation */ + unsigned char r_addend[4]; /* Constant addend used to compute value */ +} Elf32_External_Rela; + +typedef struct { + unsigned char r_offset[8]; /* Location at which to apply the action */ + unsigned char r_info[8]; /* index and type of relocation */ +} Elf64_External_Rel; + +typedef struct { + unsigned char r_offset[8]; /* Location at which to apply the action */ + unsigned char r_info[8]; /* index and type of relocation */ + unsigned char r_addend[8]; /* Constant addend used to compute value */ +} Elf64_External_Rela; + +/* dynamic section structure */ + +typedef struct { + unsigned char d_tag[4]; /* entry tag value */ + union { + unsigned char d_val[4]; + unsigned char d_ptr[4]; + } d_un; +} Elf32_External_Dyn; + +typedef struct { + unsigned char d_tag[8]; /* entry tag value */ + union { + unsigned char d_val[8]; + unsigned char d_ptr[8]; + } d_un; +} Elf64_External_Dyn; + +/* The version structures are currently size independent. They are + named without a 32 or 64. If that ever changes, these structures + will need to be renamed. */ + +/* This structure appears in a SHT_GNU_verdef section. */ + +typedef struct { + unsigned char vd_version[2]; + unsigned char vd_flags[2]; + unsigned char vd_ndx[2]; + unsigned char vd_cnt[2]; + unsigned char vd_hash[4]; + unsigned char vd_aux[4]; + unsigned char vd_next[4]; +} Elf_External_Verdef; + +/* This structure appears in a SHT_GNU_verdef section. */ + +typedef struct { + unsigned char vda_name[4]; + unsigned char vda_next[4]; +} Elf_External_Verdaux; + +/* This structure appears in a SHT_GNU_verneed section. */ + +typedef struct { + unsigned char vn_version[2]; + unsigned char vn_cnt[2]; + unsigned char vn_file[4]; + unsigned char vn_aux[4]; + unsigned char vn_next[4]; +} Elf_External_Verneed; + +/* This structure appears in a SHT_GNU_verneed section. */ + +typedef struct { + unsigned char vna_hash[4]; + unsigned char vna_flags[2]; + unsigned char vna_other[2]; + unsigned char vna_name[4]; + unsigned char vna_next[4]; +} Elf_External_Vernaux; + +/* This structure appears in a SHT_GNU_versym section. This is not a + standard ELF structure; ELF just uses Elf32_Half. */ + +typedef struct { + unsigned char vs_vers[2]; +} ATTRIBUTE_PACKED Elf_External_Versym; + +/* Structure for syminfo section. */ +typedef struct +{ + unsigned char si_boundto[2]; + unsigned char si_flags[2]; +} Elf_External_Syminfo; + + +/* This structure appears on the stack and in NT_AUXV core file notes. */ +typedef struct +{ + unsigned char a_type[4]; + unsigned char a_val[4]; +} Elf32_External_Auxv; + +typedef struct +{ + unsigned char a_type[8]; + unsigned char a_val[8]; +} Elf64_External_Auxv; + +/* Size of SHT_GROUP section entry. */ + +#define GRP_ENTRY_SIZE 4 + +#endif /* _ELF_EXTERNAL_H */ diff --git a/include/elf/fr30.h b/include/elf/fr30.h new file mode 100644 index 0000000..918ac97 --- /dev/null +++ b/include/elf/fr30.h @@ -0,0 +1,42 @@ +/* FR30 ELF support for BFD. + Copyright 1998, 1999, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_FR30_H +#define _ELF_FR30_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_fr30_reloc_type) + RELOC_NUMBER (R_FR30_NONE, 0) + RELOC_NUMBER (R_FR30_8, 1) + RELOC_NUMBER (R_FR30_20, 2) + RELOC_NUMBER (R_FR30_32, 3) + RELOC_NUMBER (R_FR30_48, 4) + RELOC_NUMBER (R_FR30_6_IN_4, 5) + RELOC_NUMBER (R_FR30_8_IN_8, 6) + RELOC_NUMBER (R_FR30_9_IN_8, 7) + RELOC_NUMBER (R_FR30_10_IN_8, 8) + RELOC_NUMBER (R_FR30_9_PCREL, 9) + RELOC_NUMBER (R_FR30_12_PCREL, 10) + RELOC_NUMBER (R_FR30_GNU_VTINHERIT, 11) + RELOC_NUMBER (R_FR30_GNU_VTENTRY, 12) +END_RELOC_NUMBERS (R_FR30_max) + +#endif /* _ELF_FR30_H */ diff --git a/include/elf/frv.h b/include/elf/frv.h new file mode 100644 index 0000000..b79e51d --- /dev/null +++ b/include/elf/frv.h @@ -0,0 +1,130 @@ +/* FRV ELF support for BFD. + Copyright (C) 2002, 2003, 2004, 2005, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_FRV_H +#define _ELF_FRV_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_frv_reloc_type) + RELOC_NUMBER (R_FRV_NONE, 0) + RELOC_NUMBER (R_FRV_32, 1) + RELOC_NUMBER (R_FRV_LABEL16, 2) + RELOC_NUMBER (R_FRV_LABEL24, 3) + RELOC_NUMBER (R_FRV_LO16, 4) + RELOC_NUMBER (R_FRV_HI16, 5) + RELOC_NUMBER (R_FRV_GPREL12, 6) + RELOC_NUMBER (R_FRV_GPRELU12, 7) + RELOC_NUMBER (R_FRV_GPREL32, 8) + RELOC_NUMBER (R_FRV_GPRELHI, 9) + RELOC_NUMBER (R_FRV_GPRELLO, 10) + RELOC_NUMBER (R_FRV_GOT12, 11) + RELOC_NUMBER (R_FRV_GOTHI, 12) + RELOC_NUMBER (R_FRV_GOTLO, 13) + RELOC_NUMBER (R_FRV_FUNCDESC, 14) + RELOC_NUMBER (R_FRV_FUNCDESC_GOT12, 15) + RELOC_NUMBER (R_FRV_FUNCDESC_GOTHI, 16) + RELOC_NUMBER (R_FRV_FUNCDESC_GOTLO, 17) + RELOC_NUMBER (R_FRV_FUNCDESC_VALUE, 18) + RELOC_NUMBER (R_FRV_FUNCDESC_GOTOFF12, 19) + RELOC_NUMBER (R_FRV_FUNCDESC_GOTOFFHI, 20) + RELOC_NUMBER (R_FRV_FUNCDESC_GOTOFFLO, 21) + RELOC_NUMBER (R_FRV_GOTOFF12, 22) + RELOC_NUMBER (R_FRV_GOTOFFHI, 23) + RELOC_NUMBER (R_FRV_GOTOFFLO, 24) + RELOC_NUMBER (R_FRV_GETTLSOFF, 25) + RELOC_NUMBER (R_FRV_TLSDESC_VALUE, 26) + RELOC_NUMBER (R_FRV_GOTTLSDESC12, 27) + RELOC_NUMBER (R_FRV_GOTTLSDESCHI, 28) + RELOC_NUMBER (R_FRV_GOTTLSDESCLO, 29) + RELOC_NUMBER (R_FRV_TLSMOFF12, 30) + RELOC_NUMBER (R_FRV_TLSMOFFHI, 31) + RELOC_NUMBER (R_FRV_TLSMOFFLO, 32) + RELOC_NUMBER (R_FRV_GOTTLSOFF12, 33) + RELOC_NUMBER (R_FRV_GOTTLSOFFHI, 34) + RELOC_NUMBER (R_FRV_GOTTLSOFFLO, 35) + RELOC_NUMBER (R_FRV_TLSOFF, 36) + RELOC_NUMBER (R_FRV_TLSDESC_RELAX, 37) + RELOC_NUMBER (R_FRV_GETTLSOFF_RELAX, 38) + RELOC_NUMBER (R_FRV_TLSOFF_RELAX, 39) + RELOC_NUMBER (R_FRV_TLSMOFF, 40) + RELOC_NUMBER (R_FRV_GNU_VTINHERIT, 200) + RELOC_NUMBER (R_FRV_GNU_VTENTRY, 201) +END_RELOC_NUMBERS(R_FRV_max) + +/* Processor specific flags for the ELF header e_flags field. */ + /* gpr support */ +#define EF_FRV_GPR_MASK 0x00000003 /* mask for # of gprs */ +#define EF_FRV_GPR_32 0x00000001 /* -mgpr-32 */ +#define EF_FRV_GPR_64 0x00000002 /* -mgpr-64 */ + + /* fpr support */ +#define EF_FRV_FPR_MASK 0x0000000c /* mask for # of fprs */ +#define EF_FRV_FPR_32 0x00000004 /* -mfpr-32 */ +#define EF_FRV_FPR_64 0x00000008 /* -mfpr-64 */ +#define EF_FRV_FPR_NONE 0x0000000c /* -msoft-float */ + + /* double word support */ +#define EF_FRV_DWORD_MASK 0x00000030 /* mask for dword support */ +#define EF_FRV_DWORD_YES 0x00000010 /* use double word insns */ +#define EF_FRV_DWORD_NO 0x00000020 /* don't use double word insn*/ + +#define EF_FRV_DOUBLE 0x00000040 /* -mdouble */ +#define EF_FRV_MEDIA 0x00000080 /* -mmedia */ + +#define EF_FRV_PIC 0x00000100 /* -fpic */ +#define EF_FRV_NON_PIC_RELOCS 0x00000200 /* used non pic safe relocs */ + +#define EF_FRV_MULADD 0x00000400 /* -mmuladd */ +#define EF_FRV_BIGPIC 0x00000800 /* -fPIC */ +#define EF_FRV_LIBPIC 0x00001000 /* -mlibrary-pic */ +#define EF_FRV_G0 0x00002000 /* -G 0, no small data ptr */ +#define EF_FRV_NOPACK 0x00004000 /* -mnopack */ +#define EF_FRV_FDPIC 0x00008000 /* -mfdpic */ + +#define EF_FRV_CPU_MASK 0xff000000 /* specific cpu bits */ +#define EF_FRV_CPU_GENERIC 0x00000000 /* generic FRV */ +#define EF_FRV_CPU_FR500 0x01000000 /* FRV500 */ +#define EF_FRV_CPU_FR300 0x02000000 /* FRV300 */ +#define EF_FRV_CPU_SIMPLE 0x03000000 /* SIMPLE */ +#define EF_FRV_CPU_TOMCAT 0x04000000 /* Tomcat, FR500 prototype */ +#define EF_FRV_CPU_FR400 0x05000000 /* FRV400 */ +#define EF_FRV_CPU_FR550 0x06000000 /* FRV550 */ +#define EF_FRV_CPU_FR405 0x07000000 +#define EF_FRV_CPU_FR450 0x08000000 + + /* Mask of PIC related bits */ +#define EF_FRV_PIC_FLAGS (EF_FRV_PIC | EF_FRV_LIBPIC | EF_FRV_BIGPIC \ + | EF_FRV_FDPIC) + + /* Mask of all flags */ +#define EF_FRV_ALL_FLAGS (EF_FRV_GPR_MASK | \ + EF_FRV_FPR_MASK | \ + EF_FRV_DWORD_MASK | \ + EF_FRV_DOUBLE | \ + EF_FRV_MEDIA | \ + EF_FRV_PIC_FLAGS | \ + EF_FRV_NON_PIC_RELOCS | \ + EF_FRV_MULADD | \ + EF_FRV_G0 | \ + EF_FRV_NOPACK | \ + EF_FRV_CPU_MASK) + +#endif /* _ELF_FRV_H */ diff --git a/include/elf/h8.h b/include/elf/h8.h new file mode 100644 index 0000000..2a3d905 --- /dev/null +++ b/include/elf/h8.h @@ -0,0 +1,101 @@ +/* H8300/h8500 ELF support for BFD. + Copyright 2001-2013 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_H8_H +#define _ELF_H8_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +/* Relocations 59..64 are GNU extensions. */ +START_RELOC_NUMBERS (elf_h8_reloc_type) + RELOC_NUMBER (R_H8_NONE, 0) + RELOC_NUMBER (R_H8_DIR32, 1) + RELOC_NUMBER (R_H8_DIR32_28, 2) + RELOC_NUMBER (R_H8_DIR32_24, 3) + RELOC_NUMBER (R_H8_DIR32_16, 4) + RELOC_NUMBER (R_H8_DIR32U, 6) + RELOC_NUMBER (R_H8_DIR32U_28, 7) + RELOC_NUMBER (R_H8_DIR32U_24, 8) + RELOC_NUMBER (R_H8_DIR32U_20, 9) + RELOC_NUMBER (R_H8_DIR32U_16, 10) + RELOC_NUMBER (R_H8_DIR24, 11) + RELOC_NUMBER (R_H8_DIR24_20, 12) + RELOC_NUMBER (R_H8_DIR24_16, 13) + RELOC_NUMBER (R_H8_DIR24U, 14) + RELOC_NUMBER (R_H8_DIR24U_20, 15) + RELOC_NUMBER (R_H8_DIR24U_16, 16) + RELOC_NUMBER (R_H8_DIR16, 17) + RELOC_NUMBER (R_H8_DIR16U, 18) + RELOC_NUMBER (R_H8_DIR16S_32, 19) + RELOC_NUMBER (R_H8_DIR16S_28, 20) + RELOC_NUMBER (R_H8_DIR16S_24, 21) + RELOC_NUMBER (R_H8_DIR16S_20, 22) + RELOC_NUMBER (R_H8_DIR16S, 23) + RELOC_NUMBER (R_H8_DIR8, 24) + RELOC_NUMBER (R_H8_DIR8U, 25) + RELOC_NUMBER (R_H8_DIR8Z_32, 26) + RELOC_NUMBER (R_H8_DIR8Z_28, 27) + RELOC_NUMBER (R_H8_DIR8Z_24, 28) + RELOC_NUMBER (R_H8_DIR8Z_20, 29) + RELOC_NUMBER (R_H8_DIR8Z_16, 30) + RELOC_NUMBER (R_H8_PCREL16, 31) + RELOC_NUMBER (R_H8_PCREL8, 32) + RELOC_NUMBER (R_H8_BPOS, 33) + FAKE_RELOC (R_H8_FIRST_INVALID_DIR_RELOC, 34) + FAKE_RELOC (R_H8_LAST_INVALID_DIR_RELOC, 58) + RELOC_NUMBER (R_H8_DIR16A8, 59) + RELOC_NUMBER (R_H8_DIR16R8, 60) + RELOC_NUMBER (R_H8_DIR24A8, 61) + RELOC_NUMBER (R_H8_DIR24R8, 62) + RELOC_NUMBER (R_H8_DIR32A16, 63) + RELOC_NUMBER (R_H8_DISP32A16, 64) + RELOC_NUMBER (R_H8_ABS32, 65) + RELOC_NUMBER (R_H8_ABS32A16, 127) + RELOC_NUMBER (R_H8_SYM, 128) + RELOC_NUMBER (R_H8_OPneg, 129) + RELOC_NUMBER (R_H8_OPadd, 130) + RELOC_NUMBER (R_H8_OPsub, 131) + RELOC_NUMBER (R_H8_OPmul, 132) + RELOC_NUMBER (R_H8_OPdiv, 133) + RELOC_NUMBER (R_H8_OPshla, 134) + RELOC_NUMBER (R_H8_OPshra, 135) + RELOC_NUMBER (R_H8_OPsctsize, 136) + RELOC_NUMBER (R_H8_OPhword, 137) + RELOC_NUMBER (R_H8_OPlword, 138) + RELOC_NUMBER (R_H8_OPhigh, 139) + RELOC_NUMBER (R_H8_OPlow, 140) + RELOC_NUMBER (R_H8_OPscttop, 141) +END_RELOC_NUMBERS (R_H8_max) + +/* Machine variant if we know it. This field was invented at Cygnus, + but it is hoped that other vendors will adopt it. If some standard + is developed, this code should be changed to follow it. */ + +#define EF_H8_MACH 0x00FF0000 + +#define E_H8_MACH_H8300 0x00800000 +#define E_H8_MACH_H8300H 0x00810000 +#define E_H8_MACH_H8300S 0x00820000 +#define E_H8_MACH_H8300HN 0x00830000 +#define E_H8_MACH_H8300SN 0x00840000 +#define E_H8_MACH_H8300SX 0x00850000 +#define E_H8_MACH_H8300SXN 0x00860000 + +#endif diff --git a/include/elf/hppa.h b/include/elf/hppa.h new file mode 100644 index 0000000..8d3ea45 --- /dev/null +++ b/include/elf/hppa.h @@ -0,0 +1,635 @@ +/* HPPA ELF support for BFD. + Copyright 1993, 1994, 1995, 1998, 1999, 2000, 2005, 2006, 2008, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the HPPA ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_HPPA_H +#define _ELF_HPPA_H + +/* Processor specific flags for the ELF header e_flags field. */ + +/* Trap null address dereferences. */ +#define EF_PARISC_TRAPNIL 0x00010000 + +/* .PARISC.archext section is present. */ +#define EF_PARISC_EXT 0x00020000 + +/* Program expects little-endian mode. */ +#define EF_PARISC_LSB 0x00040000 + +/* Program expects wide mode. */ +#define EF_PARISC_WIDE 0x00080000 + +/* Do not allow kernel-assisted branch prediction. */ +#define EF_PARISC_NO_KABP 0x00100000 + +/* Allow lazy swap for dynamically allocated program segments. */ +#define EF_PARISC_LAZYSWAP 0x00400000 + +/* Architecture version */ +#define EF_PARISC_ARCH 0x0000ffff + +#define EFA_PARISC_1_0 0x020b +#define EFA_PARISC_1_1 0x0210 +#define EFA_PARISC_2_0 0x0214 + +/* Special section indices. */ +/* A symbol that has been declared as a tentative definition in an ANSI C + compilation. */ +#define SHN_PARISC_ANSI_COMMON SHN_LORESERVE + +/* A symbol that has been declared as a common block using the + huge memory model. */ +#define SHN_PARISC_HUGE_COMMON (SHN_LORESERVE + 1) + +/* Processor specific section types. */ + +/* Section contains product specific extension bits. */ +#define SHT_PARISC_EXT 0x70000000 + +/* Section contains unwind table entries. */ +#define SHT_PARISC_UNWIND 0x70000001 + +/* Section contains debug information for optimized code. */ +#define SHT_PARISC_DOC 0x70000002 + +/* Section contains code annotations. */ +#define SHT_PARISC_ANNOT 0x70000003 + +/* DLKM special section. */ +#define SHT_PARISC_DLKM 0x70000004 + +/* These are strictly for compatibility with the older elf32-hppa + implementation. Hopefully we can eliminate them in the future. */ +/* Optional section holding argument location/relocation info. */ +#define SHT_PARISC_SYMEXTN SHT_LOPROC + 8 + +/* Option section for linker stubs. */ +#define SHT_PARISC_STUBS SHT_LOPROC + 9 + +/* Processor specific section flags. */ + +/* Section contains code compiled for static branch prediction. */ +#define SHF_PARISC_SBP 0x80000000 + +/* Section should be allocated from from GP. */ +#define SHF_PARISC_HUGE 0x40000000 + +/* Section should go near GP. */ +#define SHF_PARISC_SHORT 0x20000000 + +/* Section is weak ordered. */ +#define SHF_PARISC_WEAKORDER 0x10000000 + +/* Identifies the entry point of a millicode routine. */ +#define STT_PARISC_MILLI 13 + +/* ELF/HPPA relocation types */ + +/* Note: PA-ELF is defined to use only RELA relocations. */ +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (elf_hppa_reloc_type) +RELOC_NUMBER (R_PARISC_NONE, 0) /* No reloc */ + +/* Data / Inst. Format Relocation Expression */ + +RELOC_NUMBER (R_PARISC_DIR32, 1) +/* 32-bit word symbol + addend */ + +RELOC_NUMBER (R_PARISC_DIR21L, 2) +/* long immediate (7) LR(symbol, addend) */ + +RELOC_NUMBER (R_PARISC_DIR17R, 3) +/* branch external (19) RR(symbol, addend) */ + +RELOC_NUMBER (R_PARISC_DIR17F, 4) +/* branch external (19) symbol + addend */ + +RELOC_NUMBER (R_PARISC_DIR14R, 6) +/* load/store (1) RR(symbol, addend) */ + +RELOC_NUMBER (R_PARISC_DIR14F, 7) +/* load/store (1) symbol, addend */ + +/* PC-relative relocation types + Typically used for calls. + Note PCREL17C and PCREL17F differ only in overflow handling. + PCREL17C never reports a relocation error. + + When supporting argument relocations, function calls must be + accompanied by parameter relocation information. This information is + carried in the ten high-order bits of the addend field. The remaining + 22 bits of of the addend field are sign-extended to form the Addend. + + Note the code to build argument relocations depends on the + addend being zero. A consequence of this limitation is GAS + can not perform relocation reductions for function symbols. */ + +RELOC_NUMBER (R_PARISC_PCREL12F, 8) +/* op & branch (17) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL32, 9) +/* 32-bit word symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL21L, 10) +/* long immediate (7) L(symbol - PC - 8 + addend) */ + +RELOC_NUMBER (R_PARISC_PCREL17R, 11) +/* branch external (19) R(symbol - PC - 8 + addend) */ + +RELOC_NUMBER (R_PARISC_PCREL17F, 12) +/* branch (20) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL17C, 13) +/* branch (20) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL14R, 14) +/* load/store (1) R(symbol - PC - 8 + addend) */ + +RELOC_NUMBER (R_PARISC_PCREL14F, 15) +/* load/store (1) symbol - PC - 8 + addend */ + + +/* DP-relative relocation types. */ +RELOC_NUMBER (R_PARISC_DPREL21L, 18) +/* long immediate (7) LR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DPREL14WR, 19) +/* load/store mod. comp. (2) RR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DPREL14DR, 20) +/* load/store doubleword (3) RR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DPREL14R, 22) +/* load/store (1) RR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DPREL14F, 23) +/* load/store (1) symbol - GP + addend */ + + +/* Data linkage table (DLT) relocation types + + SOM DLT_REL fixup requests are used to for static data references + from position-independent code within shared libraries. They are + similar to the GOT relocation types in some SVR4 implementations. */ + +RELOC_NUMBER (R_PARISC_DLTREL21L, 26) +/* long immediate (7) LR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DLTREL14R, 30) +/* load/store (1) RR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DLTREL14F, 31) +/* load/store (1) symbol - GP + addend */ + + +/* DLT indirect relocation types */ +RELOC_NUMBER (R_PARISC_DLTIND21L, 34) +/* long immediate (7) L(ltoff(symbol + addend)) */ + +RELOC_NUMBER (R_PARISC_DLTIND14R, 38) +/* load/store (1) R(ltoff(symbol + addend)) */ + +RELOC_NUMBER (R_PARISC_DLTIND14F, 39) +/* load/store (1) ltoff(symbol + addend) */ + + +/* Base relative relocation types. Ugh. These imply lots of state */ +RELOC_NUMBER (R_PARISC_SETBASE, 40) +/* none no reloc; base := sym */ + +RELOC_NUMBER (R_PARISC_SECREL32, 41) +/* 32-bit word symbol - SECT + addend */ + +RELOC_NUMBER (R_PARISC_BASEREL21L, 42) +/* long immediate (7) LR(symbol - base, addend) */ + +RELOC_NUMBER (R_PARISC_BASEREL17R, 43) +/* branch external (19) RR(symbol - base, addend) */ + +RELOC_NUMBER (R_PARISC_BASEREL17F, 44) +/* branch external (19) symbol - base + addend */ + +RELOC_NUMBER (R_PARISC_BASEREL14R, 46) +/* load/store (1) RR(symbol - base, addend) */ + +RELOC_NUMBER (R_PARISC_BASEREL14F, 47) +/* load/store (1) symbol - base, addend */ + + +/* Segment relative relocation types. */ +RELOC_NUMBER (R_PARISC_SEGBASE, 48) +/* none no relocation; SB := sym */ + +RELOC_NUMBER (R_PARISC_SEGREL32, 49) +/* 32-bit word symbol - SB + addend */ + + +/* Offsets from the PLT. */ +RELOC_NUMBER (R_PARISC_PLTOFF21L, 50) +/* long immediate (7) LR(pltoff(symbol), addend) */ + +RELOC_NUMBER (R_PARISC_PLTOFF14R, 54) +/* load/store (1) RR(pltoff(symbol), addend) */ + +RELOC_NUMBER (R_PARISC_PLTOFF14F, 55) +/* load/store (1) pltoff(symbol) + addend */ + + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR32, 57) +/* 32-bit word ltoff(fptr(symbol+addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR21L, 58) +/* long immediate (7) L(ltoff(fptr(symbol+addend))) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR14R, 62) +/* load/store (1) R(ltoff(fptr(symbol+addend))) */ + + +RELOC_NUMBER (R_PARISC_FPTR64, 64) +/* 64-bit doubleword fptr(symbol+addend) */ + + +/* Plabel relocation types. */ +RELOC_NUMBER (R_PARISC_PLABEL32, 65) +/* 32-bit word fptr(symbol) */ + +RELOC_NUMBER (R_PARISC_PLABEL21L, 66) +/* long immediate (7) L(fptr(symbol)) */ + +RELOC_NUMBER (R_PARISC_PLABEL14R, 70) +/* load/store (1) R(fptr(symbol)) */ + + +/* PCREL relocations. */ +RELOC_NUMBER (R_PARISC_PCREL64, 72) +/* 64-bit doubleword symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL22C, 73) +/* branch & link (21) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL22F, 74) +/* branch & link (21) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL14WR, 75) +/* load/store mod. comp. (2) R(symbol - PC - 8 + addend) */ + +RELOC_NUMBER (R_PARISC_PCREL14DR, 76) +/* load/store doubleword (3) R(symbol - PC - 8 + addend) */ + +RELOC_NUMBER (R_PARISC_PCREL16F, 77) +/* load/store (1) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL16WF, 78) +/* load/store mod. comp. (2) symbol - PC - 8 + addend */ + +RELOC_NUMBER (R_PARISC_PCREL16DF, 79) +/* load/store doubleword (3) symbol - PC - 8 + addend */ + + +RELOC_NUMBER (R_PARISC_DIR64, 80) +/* 64-bit doubleword symbol + addend */ + +RELOC_NUMBER (R_PARISC_DIR14WR, 83) +/* load/store mod. comp. (2) RR(symbol, addend) */ + +RELOC_NUMBER (R_PARISC_DIR14DR, 84) +/* load/store doubleword (3) RR(symbol, addend) */ + +RELOC_NUMBER (R_PARISC_DIR16F, 85) +/* load/store (1) symbol + addend */ + +RELOC_NUMBER (R_PARISC_DIR16WF, 86) +/* load/store mod. comp. (2) symbol + addend */ + +RELOC_NUMBER (R_PARISC_DIR16DF, 87) +/* load/store doubleword (3) symbol + addend */ + +RELOC_NUMBER (R_PARISC_GPREL64, 88) +/* 64-bit doubleword symbol - GP + addend */ + +RELOC_NUMBER (R_PARISC_DLTREL14WR, 91) +/* load/store mod. comp. (2) RR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_DLTREL14DR, 92) +/* load/store doubleword (3) RR(symbol - GP, addend) */ + +RELOC_NUMBER (R_PARISC_GPREL16F, 93) +/* load/store (1) symbol - GP + addend */ + +RELOC_NUMBER (R_PARISC_GPREL16WF, 94) +/* load/store mod. comp. (2) symbol - GP + addend */ + +RELOC_NUMBER (R_PARISC_GPREL16DF, 95) +/* load/store doubleword (3) symbol - GP + addend */ + + +RELOC_NUMBER (R_PARISC_LTOFF64, 96) +/* 64-bit doubleword ltoff(symbol + addend) */ + +RELOC_NUMBER (R_PARISC_DLTIND14WR, 99) +/* load/store mod. comp. (2) R(ltoff(symbol + addend)) */ + +RELOC_NUMBER (R_PARISC_DLTIND14DR, 100) +/* load/store doubleword (3) R(ltoff(symbol + addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF16F, 101) +/* load/store (1) ltoff(symbol + addend) */ + +RELOC_NUMBER (R_PARISC_LTOFF16WF, 102) +/* load/store mod. comp. (2) ltoff(symbol + addend) */ + +RELOC_NUMBER (R_PARISC_LTOFF16DF, 103) +/* load/store doubleword (3) ltoff(symbol + addend) */ + + +RELOC_NUMBER (R_PARISC_SECREL64, 104) +/* 64-bit doubleword symbol - SECT + addend */ + +RELOC_NUMBER (R_PARISC_BASEREL14WR, 107) +/* load/store mod. comp. (2) RR(symbol - base, addend) */ + +RELOC_NUMBER (R_PARISC_BASEREL14DR, 108) +/* load/store doubleword (3) RR(symbol - base, addend) */ + + +RELOC_NUMBER (R_PARISC_SEGREL64, 112) +/* 64-bit doubleword symbol - SB + addend */ + +RELOC_NUMBER (R_PARISC_PLTOFF14WR, 115) +/* load/store mod. comp. (2) RR(pltoff(symbol), addend) */ + +RELOC_NUMBER (R_PARISC_PLTOFF14DR, 116) +/* load/store doubleword (3) RR(pltoff(symbol), addend) */ + +RELOC_NUMBER (R_PARISC_PLTOFF16F, 117) +/* load/store (1) pltoff(symbol) + addend */ + +RELOC_NUMBER (R_PARISC_PLTOFF16WF, 118) +/* load/store mod. comp. (2) pltoff(symbol) + addend */ + +RELOC_NUMBER (R_PARISC_PLTOFF16DF, 119) +/* load/store doubleword (3) pltoff(symbol) + addend */ + + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR64, 120) +/* 64-bit doubleword ltoff(fptr(symbol+addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR14WR, 123) +/* load/store mod. comp. (2) R(ltoff(fptr(symbol+addend))) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR14DR, 124) +/* load/store doubleword (3) R(ltoff(fptr(symbol+addend))) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR16F, 125) +/* load/store (1) ltoff(fptr(symbol+addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR16WF, 126) +/* load/store mod. comp. (2) ltoff(fptr(symbol+addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_FPTR16DF, 127) +/* load/store doubleword (3) ltoff(fptr(symbol+addend)) */ + + +RELOC_NUMBER (R_PARISC_COPY, 128) +/* data Dynamic relocations only */ + +RELOC_NUMBER (R_PARISC_IPLT, 129) +/* plt */ + +RELOC_NUMBER (R_PARISC_EPLT, 130) +/* plt */ + + +RELOC_NUMBER (R_PARISC_TPREL32, 153) +/* 32-bit word symbol - TP + addend */ + +RELOC_NUMBER (R_PARISC_TPREL21L, 154) +/* long immediate (7) LR(symbol - TP, addend) */ + +RELOC_NUMBER (R_PARISC_TPREL14R, 158) +/* load/store (1) RR(symbol - TP, addend) */ + + +RELOC_NUMBER (R_PARISC_LTOFF_TP21L, 162) +/* long immediate (7) L(ltoff(symbol - TP + addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP14R, 166) +/* load/store (1) R(ltoff(symbol - TP + addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP14F, 167) +/* load/store (1) ltoff(symbol - TP + addend) */ + + +RELOC_NUMBER (R_PARISC_TPREL64, 216) +/* 64-bit word symbol - TP + addend */ + +RELOC_NUMBER (R_PARISC_TPREL14WR, 219) +/* load/store mod. comp. (2) RR(symbol - TP, addend) */ + +RELOC_NUMBER (R_PARISC_TPREL14DR, 220) +/* load/store doubleword (3) RR(symbol - TP, addend) */ + +RELOC_NUMBER (R_PARISC_TPREL16F, 221) +/* load/store (1) symbol - TP + addend */ + +RELOC_NUMBER (R_PARISC_TPREL16WF, 222) +/* load/store mod. comp. (2) symbol - TP + addend */ + +RELOC_NUMBER (R_PARISC_TPREL16DF, 223) +/* load/store doubleword (3) symbol - TP + addend */ + + +RELOC_NUMBER (R_PARISC_LTOFF_TP64, 224) +/* 64-bit doubleword ltoff(symbol - TP + addend) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP14WR, 227) +/* load/store mod. comp. (2) R(ltoff(symbol - TP + addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP14DR, 228) +/* load/store doubleword (3) R(ltoff(symbol - TP + addend)) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP16F, 229) +/* load/store (1) ltoff(symbol - TP + addend) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP16WF, 230) +/* load/store mod. comp. (2) ltoff(symbol - TP + addend) */ + +RELOC_NUMBER (R_PARISC_LTOFF_TP16DF, 231) +/* load/store doubleword (3) ltoff(symbol - TP + addend) */ + +RELOC_NUMBER (R_PARISC_GNU_VTENTRY, 232) +RELOC_NUMBER (R_PARISC_GNU_VTINHERIT, 233) + +RELOC_NUMBER (R_PARISC_TLS_GD21L, 234) +RELOC_NUMBER (R_PARISC_TLS_GD14R, 235) +RELOC_NUMBER (R_PARISC_TLS_GDCALL, 236) +RELOC_NUMBER (R_PARISC_TLS_LDM21L, 237) +RELOC_NUMBER (R_PARISC_TLS_LDM14R, 238) +RELOC_NUMBER (R_PARISC_TLS_LDMCALL, 239) +RELOC_NUMBER (R_PARISC_TLS_LDO21L, 240) +RELOC_NUMBER (R_PARISC_TLS_LDO14R, 241) +RELOC_NUMBER (R_PARISC_TLS_DTPMOD32, 242) +RELOC_NUMBER (R_PARISC_TLS_DTPMOD64, 243) +RELOC_NUMBER (R_PARISC_TLS_DTPOFF32, 244) +RELOC_NUMBER (R_PARISC_TLS_DTPOFF64, 245) + +END_RELOC_NUMBERS (R_PARISC_UNIMPLEMENTED) + +#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L +#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R +#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L +#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R +#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 +#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 + +#ifndef RELOC_MACROS_GEN_FUNC +typedef enum elf_hppa_reloc_type elf_hppa_reloc_type; +#endif + +#define PT_PARISC_ARCHEXT 0x70000000 +#define PT_PARISC_UNWIND 0x70000001 +#define PT_PARISC_WEAKORDER 0x70000002 + +/* Flag bits in sh_flags of ElfXX_Shdr. */ +#define SHF_HP_TLS 0x01000000 +#define SHF_HP_NEAR_SHARED 0x02000000 +#define SHF_HP_FAR_SHARED 0x04000000 +#define SHF_HP_COMDAT 0x08000000 +#define SHF_HP_CONST 0x00800000 + +/* Reserved section header indices. */ +#define SHN_TLS_COMMON (SHN_LOOS + 0x0) +#define SHN_NS_COMMON (SHN_LOOS + 0x1) +#define SHN_FS_COMMON (SHN_LOOS + 0x2) +#define SHN_NS_UNDEF (SHN_LOOS + 0x3) +#define SHN_FS_UNDEF (SHN_LOOS + 0x4) +#define SHN_HP_EXTERN (SHN_LOOS + 0x5) +#define SHN_HP_EXTHINT (SHN_LOOS + 0x6) +#define SHN_HP_UNDEF_BIND_IMM (SHN_LOOS + 0x7) + +/* Values of sh_type in ElfXX_Shdr. */ +#define SHT_HP_OVLBITS (SHT_LOOS + 0x0) +#define SHT_HP_DLKM (SHT_LOOS + 0x1) +#define SHT_HP_COMDAT (SHT_LOOS + 0x2) +#define SHT_HP_OBJDICT (SHT_LOOS + 0x3) +#define SHT_HP_ANNOT (SHT_LOOS + 0x4) + +/* Flag bits in p_flags of ElfXX_Phdr. */ +#define PF_HP_CODE 0x00040000 +#define PF_HP_MODIFY 0x00080000 +#define PF_HP_PAGE_SIZE 0x00100000 +#define PF_HP_FAR_SHARED 0x00200000 +#define PF_HP_NEAR_SHARED 0x00400000 +#define PF_HP_LAZYSWAP 0x00800000 +#define PF_HP_CODE_DEPR 0x01000000 +#define PF_HP_MODIFY_DEPR 0x02000000 +#define PF_HP_LAZYSWAP_DEPR 0x04000000 +#define PF_PARISC_SBP 0x08000000 +#define PF_HP_SBP 0x08000000 + + +/* Processor specific dynamic array tags. */ + +/* Arggh. HP's tools define these symbols based on the + old value of DT_LOOS. So we must do the same to be + compatible. */ +#define DT_HP_LOAD_MAP (OLD_DT_LOOS + 0x0) +#define DT_HP_DLD_FLAGS (OLD_DT_LOOS + 0x1) +#define DT_HP_DLD_HOOK (OLD_DT_LOOS + 0x2) +#define DT_HP_UX10_INIT (OLD_DT_LOOS + 0x3) +#define DT_HP_UX10_INITSZ (OLD_DT_LOOS + 0x4) +#define DT_HP_PREINIT (OLD_DT_LOOS + 0x5) +#define DT_HP_PREINITSZ (OLD_DT_LOOS + 0x6) +#define DT_HP_NEEDED (OLD_DT_LOOS + 0x7) +#define DT_HP_TIME_STAMP (OLD_DT_LOOS + 0x8) +#define DT_HP_CHECKSUM (OLD_DT_LOOS + 0x9) +#define DT_HP_GST_SIZE (OLD_DT_LOOS + 0xa) +#define DT_HP_GST_VERSION (OLD_DT_LOOS + 0xb) +#define DT_HP_GST_HASHVAL (OLD_DT_LOOS + 0xc) +#define DT_HP_EPLTREL (OLD_DT_LOOS + 0xd) +#define DT_HP_EPLTRELSZ (OLD_DT_LOOS + 0xe) +#define DT_HP_FILTERED (OLD_DT_LOOS + 0xf) +#define DT_HP_FILTER_TLS (OLD_DT_LOOS + 0x10) +#define DT_HP_COMPAT_FILTERED (OLD_DT_LOOS + 0x11) +#define DT_HP_LAZYLOAD (OLD_DT_LOOS + 0x12) +#define DT_HP_BIND_NOW_COUNT (OLD_DT_LOOS + 0x13) +#define DT_PLT (OLD_DT_LOOS + 0x14) +#define DT_PLT_SIZE (OLD_DT_LOOS + 0x15) +#define DT_DLT (OLD_DT_LOOS + 0x16) +#define DT_DLT_SIZE (OLD_DT_LOOS + 0x17) + +/* Values for DT_HP_DLD_FLAGS. */ +#define DT_HP_DEBUG_PRIVATE 0x00001 /* Map text private */ +#define DT_HP_DEBUG_CALLBACK 0x00002 /* Callback */ +#define DT_HP_DEBUG_CALLBACK_BOR 0x00004 /* BOR callback */ +#define DT_HP_NO_ENVVAR 0x00008 /* No env var */ +#define DT_HP_BIND_NOW 0x00010 /* Bind now */ +#define DT_HP_BIND_NONFATAL 0x00020 /* Bind non-fatal */ +#define DT_HP_BIND_VERBOSE 0x00040 /* Bind verbose */ +#define DT_HP_BIND_RESTRICTED 0x00080 /* Bind restricted */ +#define DT_HP_BIND_SYMBOLIC 0x00100 /* Bind symbolic */ +#define DT_HP_RPATH_FIRST 0x00200 /* RPATH first */ +#define DT_HP_BIND_DEPTH_FIRST 0x00400 /* Bind depth-first */ +#define DT_HP_GST 0x00800 /* Dld global sym table */ +#define DT_HP_SHLIB_FIXED 0x01000 /* shared vtable support */ +#define DT_HP_MERGE_SHLIB_SEG 0x02000 /* merge shlib data segs */ +#define DT_HP_NODELETE 0x04000 /* never unload */ +#define DT_HP_GROUP 0x08000 /* bind only within group */ +#define DT_HP_PROTECT_LINKAGE_TABLE 0x10000 /* protected linkage table */ + +/* Program header extensions. */ +#define PT_HP_TLS (PT_LOOS + 0x0) +#define PT_HP_CORE_NONE (PT_LOOS + 0x1) +#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) +#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) +#define PT_HP_CORE_COMM (PT_LOOS + 0x4) +#define PT_HP_CORE_PROC (PT_LOOS + 0x5) +#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) +#define PT_HP_CORE_STACK (PT_LOOS + 0x7) +#define PT_HP_CORE_SHM (PT_LOOS + 0x8) +#define PT_HP_CORE_MMF (PT_LOOS + 0x9) +#define PT_HP_PARALLEL (PT_LOOS + 0x10) +#define PT_HP_FASTBIND (PT_LOOS + 0x11) +#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) +#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) +#define PT_HP_STACK (PT_LOOS + 0x14) +#define PT_HP_CORE_UTSNAME (PT_LOOS + 0x15) + +/* Binding information. */ +#define STB_HP_ALIAS (STB_LOOS + 0x0) + +/* Additional symbol types. */ +#define STT_HP_OPAQUE (STT_LOOS + 0x1) +#define STT_HP_STUB (STT_LOOS + 0x2) + +/* Note types. */ +#define NT_HP_COMPILER 1 +#define NT_HP_COPYRIGHT 2 +#define NT_HP_VERSION 3 +#define NT_HP_SRCFILE_INFO 4 +#define NT_HP_LINKER 5 +#define NT_HP_INSTRUMENTED 6 +#define NT_HP_UX_OPTIONS 7 + +#endif /* _ELF_HPPA_H */ diff --git a/include/elf/i370.h b/include/elf/i370.h new file mode 100644 index 0000000..7b451ff --- /dev/null +++ b/include/elf/i370.h @@ -0,0 +1,61 @@ +/* i370 ELF support for BFD. + Copyright 2000, 2002, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the i370 ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_I370_H +#define _ELF_I370_H + +#include "elf/reloc-macros.h" + +/* Processor specific section headers, sh_type field */ + +#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ + entries in this section \ + based on the address \ + specified in the associated \ + symbol table entry. */ + +#define EF_I370_RELOCATABLE 0x00010000 /* i370 -mrelocatable flag */ +#define EF_I370_RELOCATABLE_LIB 0x00008000 /* i370 -mrelocatable-lib flag */ + +/* i370 relocations + Note that there is really just one relocation that we currently + support (and only one that we seem to need, at the moment), and + that is the 31-bit address relocation. Note that the 370/390 + only supports a 31-bit (2GB) address space. */ + +START_RELOC_NUMBERS (i370_reloc_type) + RELOC_NUMBER (R_I370_NONE, 0) + RELOC_NUMBER (R_I370_ADDR31, 1) + RELOC_NUMBER (R_I370_ADDR32, 2) + RELOC_NUMBER (R_I370_ADDR16, 3) + RELOC_NUMBER (R_I370_REL31, 4) + RELOC_NUMBER (R_I370_REL32, 5) + RELOC_NUMBER (R_I370_ADDR12, 6) + RELOC_NUMBER (R_I370_REL12, 7) + RELOC_NUMBER (R_I370_ADDR8, 8) + RELOC_NUMBER (R_I370_REL8, 9) + RELOC_NUMBER (R_I370_COPY, 10) + RELOC_NUMBER (R_I370_RELATIVE, 11) +END_RELOC_NUMBERS (R_I370_max) + +#endif /* _ELF_I370_H */ diff --git a/include/elf/i386.h b/include/elf/i386.h new file mode 100644 index 0000000..c475092 --- /dev/null +++ b/include/elf/i386.h @@ -0,0 +1,79 @@ +/* ix86 ELF support for BFD. + Copyright 1998, 1999, 2000, 2002, 2004, 2005, 2006, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_I386_H +#define _ELF_I386_H + +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (elf_i386_reloc_type) + RELOC_NUMBER (R_386_NONE, 0) /* No reloc */ + RELOC_NUMBER (R_386_32, 1) /* Direct 32 bit */ + RELOC_NUMBER (R_386_PC32, 2) /* PC relative 32 bit */ + RELOC_NUMBER (R_386_GOT32, 3) /* 32 bit GOT entry */ + RELOC_NUMBER (R_386_PLT32, 4) /* 32 bit PLT address */ + RELOC_NUMBER (R_386_COPY, 5) /* Copy symbol at runtime */ + RELOC_NUMBER (R_386_GLOB_DAT, 6) /* Create GOT entry */ + RELOC_NUMBER (R_386_JUMP_SLOT, 7) /* Create PLT entry */ + RELOC_NUMBER (R_386_RELATIVE, 8) /* Adjust by program base */ + RELOC_NUMBER (R_386_GOTOFF, 9) /* 32 bit offset to GOT */ + RELOC_NUMBER (R_386_GOTPC, 10) /* 32 bit PC relative offset to GOT */ + RELOC_NUMBER (R_386_32PLT, 11) /* Used by Sun */ + FAKE_RELOC (FIRST_INVALID_RELOC, 12) + FAKE_RELOC (LAST_INVALID_RELOC, 13) + RELOC_NUMBER (R_386_TLS_TPOFF,14) + RELOC_NUMBER (R_386_TLS_IE, 15) + RELOC_NUMBER (R_386_TLS_GOTIE,16) + RELOC_NUMBER (R_386_TLS_LE, 17) + RELOC_NUMBER (R_386_TLS_GD, 18) + RELOC_NUMBER (R_386_TLS_LDM, 19) + RELOC_NUMBER (R_386_16, 20) + RELOC_NUMBER (R_386_PC16, 21) + RELOC_NUMBER (R_386_8, 22) + RELOC_NUMBER (R_386_PC8, 23) + RELOC_NUMBER (R_386_TLS_GD_32, 24) + RELOC_NUMBER (R_386_TLS_GD_PUSH, 25) + RELOC_NUMBER (R_386_TLS_GD_CALL, 26) + RELOC_NUMBER (R_386_TLS_GD_POP, 27) + RELOC_NUMBER (R_386_TLS_LDM_32, 28) + RELOC_NUMBER (R_386_TLS_LDM_PUSH, 29) + RELOC_NUMBER (R_386_TLS_LDM_CALL, 30) + RELOC_NUMBER (R_386_TLS_LDM_POP, 31) + RELOC_NUMBER (R_386_TLS_LDO_32, 32) + RELOC_NUMBER (R_386_TLS_IE_32, 33) + RELOC_NUMBER (R_386_TLS_LE_32, 34) + RELOC_NUMBER (R_386_TLS_DTPMOD32, 35) + RELOC_NUMBER (R_386_TLS_DTPOFF32, 36) + RELOC_NUMBER (R_386_TLS_TPOFF32, 37) + RELOC_NUMBER (R_386_SIZE32, 38) /* 32-bit symbol size */ + RELOC_NUMBER (R_386_TLS_GOTDESC, 39) + RELOC_NUMBER (R_386_TLS_DESC_CALL,40) + RELOC_NUMBER (R_386_TLS_DESC, 41) + RELOC_NUMBER (R_386_IRELATIVE, 42) /* Adjust indirectly by program base */ + + /* Used by Intel. */ + RELOC_NUMBER (R_386_USED_BY_INTEL_200, 200) + + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_386_GNU_VTINHERIT, 250) + RELOC_NUMBER (R_386_GNU_VTENTRY, 251) +END_RELOC_NUMBERS (R_386_max) + +#endif diff --git a/include/elf/i860.h b/include/elf/i860.h new file mode 100644 index 0000000..834c776 --- /dev/null +++ b/include/elf/i860.h @@ -0,0 +1,66 @@ +/* i860 ELF support for BFD. + Copyright 2000, 2010 Free Software Foundation, Inc. + + Contributed by Jason Eckhardt . + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_I860_H +#define _ELF_I860_H + +/* Note: i860 ELF is defined to use only RELA relocations. */ + +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (elf_i860_reloc_type) + RELOC_NUMBER (R_860_NONE, 0x00) /* No reloc */ + RELOC_NUMBER (R_860_32, 0x01) /* S+A */ + RELOC_NUMBER (R_860_COPY, 0x02) /* No calculation */ + RELOC_NUMBER (R_860_GLOB_DAT, 0x03) /* S, Create GOT entry */ + RELOC_NUMBER (R_860_JUMP_SLOT, 0x04) /* S+A, Create PLT entry */ + RELOC_NUMBER (R_860_RELATIVE, 0x05) /* B+A, Adj by program base */ + RELOC_NUMBER (R_860_PC26, 0x30) /* (S+A-P) >> 2 */ + RELOC_NUMBER (R_860_PLT26, 0x31) /* (L+A-P) >> 2 */ + RELOC_NUMBER (R_860_PC16, 0x32) /* (S+A-P) >> 2 */ + RELOC_NUMBER (R_860_LOW0, 0x40) /* S+A */ + RELOC_NUMBER (R_860_SPLIT0, 0x42) /* S+A */ + RELOC_NUMBER (R_860_LOW1, 0x44) /* S+A */ + RELOC_NUMBER (R_860_SPLIT1, 0x46) /* S+A */ + RELOC_NUMBER (R_860_LOW2, 0x48) /* S+A */ + RELOC_NUMBER (R_860_SPLIT2, 0x4A) /* S+A */ + RELOC_NUMBER (R_860_LOW3, 0x4C) /* S+A */ + RELOC_NUMBER (R_860_LOGOT0, 0x50) /* G */ + RELOC_NUMBER (R_860_SPGOT0, 0x52) /* G */ + RELOC_NUMBER (R_860_LOGOT1, 0x54) /* G */ + RELOC_NUMBER (R_860_SPGOT1, 0x56) /* G */ + RELOC_NUMBER (R_860_LOGOTOFF0, 0x60) /* O */ + RELOC_NUMBER (R_860_SPGOTOFF0, 0x62) /* O */ + RELOC_NUMBER (R_860_LOGOTOFF1, 0x64) /* O */ + RELOC_NUMBER (R_860_SPGOTOFF1, 0x66) /* O */ + RELOC_NUMBER (R_860_LOGOTOFF2, 0x68) /* O */ + RELOC_NUMBER (R_860_LOGOTOFF3, 0x6C) /* O */ + RELOC_NUMBER (R_860_LOPC, 0x70) /* (S+A-P) >> 2 */ + RELOC_NUMBER (R_860_HIGHADJ, 0x80) /* hiadj(S+A) */ + RELOC_NUMBER (R_860_HAGOT, 0x90) /* hiadj(G) */ + RELOC_NUMBER (R_860_HAGOTOFF, 0xA0) /* hiadj(O) */ + RELOC_NUMBER (R_860_HAPC, 0xB0) /* hiadj((S+A-P) >> 2) */ + RELOC_NUMBER (R_860_HIGH, 0xC0) /* (S+A) >> 16 */ + RELOC_NUMBER (R_860_HIGOT, 0xD0) /* G >> 16 */ + RELOC_NUMBER (R_860_HIGOTOFF, 0xE0) /* O */ +END_RELOC_NUMBERS (R_860_max) + +#endif diff --git a/include/elf/i960.h b/include/elf/i960.h new file mode 100644 index 0000000..c319b32 --- /dev/null +++ b/include/elf/i960.h @@ -0,0 +1,37 @@ +/* Intel 960 ELF support for BFD. + Copyright 1999, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_I960_H +#define _ELF_I960_H + +#include "elf/reloc-macros.h" + + +START_RELOC_NUMBERS (elf_i960_reloc_type) + RELOC_NUMBER (R_960_NONE, 0) + RELOC_NUMBER (R_960_12, 1) + RELOC_NUMBER (R_960_32, 2) + RELOC_NUMBER (R_960_IP24, 3) + RELOC_NUMBER (R_960_SUB, 4) + RELOC_NUMBER (R_960_OPTCALL, 5) + RELOC_NUMBER (R_960_OPTCALLX, 6) + RELOC_NUMBER (R_960_OPTCALLXA, 7) +END_RELOC_NUMBERS (R_960_max) + +#endif /* _ELF_I960_H */ diff --git a/include/elf/ia64.h b/include/elf/ia64.h new file mode 100644 index 0000000..7f2453d --- /dev/null +++ b/include/elf/ia64.h @@ -0,0 +1,416 @@ +/* IA-64 ELF support for BFD. + Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2008, 2009, 2010 + Free Software Foundation, Inc. + Contributed by David Mosberger-Tang + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_IA64_H +#define _ELF_IA64_H + +/* Bits in the e_flags field of the Elf64_Ehdr: */ + +#define EF_IA_64_MASKOS 0x0000000f /* OS-specific flags. */ +#define EF_IA_64_ARCH 0xff000000 /* Arch. version mask. */ +#define EF_IA_64_ARCHVER_1 (1 << 24) /* Arch. version level 1 compat. */ + +/* ??? These four definitions are not part of the SVR4 ABI. + They were present in David's initial code drop, so it is probable + that they are used by HP/UX. */ +#define EF_IA_64_TRAPNIL (1 << 0) /* Trap NIL pointer dereferences. */ +#define EF_IA_64_EXT (1 << 2) /* Program uses arch. extensions. */ +#define EF_IA_64_BE (1 << 3) /* PSR BE bit set (big-endian). */ +#define EFA_IA_64_EAS2_3 0x23000000 /* IA64 EAS 2.3. */ + +#define EF_IA_64_ABI64 (1 << 4) /* 64-bit ABI. */ +/* Not used yet. */ +#define EF_IA_64_REDUCEDFP (1 << 5) /* Only FP6-FP11 used. */ +#define EF_IA_64_CONS_GP (1 << 6) /* gp as program wide constant. */ +#define EF_IA_64_NOFUNCDESC_CONS_GP (1 << 7) /* And no function descriptors. */ +/* Not used yet. */ +#define EF_IA_64_ABSOLUTE (1 << 8) /* Load at absolute addresses. */ + +/* OpenVMS speficic. */ +#define EF_IA_64_VMS_COMCOD 0x03 /* Completion code. */ +#define EF_IA_64_VMS_COMCOD_SUCCESS 0 +#define EF_IA_64_VMS_COMCOD_WARNING 1 +#define EF_IA_64_VMS_COMCOD_ERROR 2 +#define EF_IA_64_VMS_COMCOD_ABORT 3 +#define EF_IA_64_VMS_LINKAGES 0x04 /* Contains VMS linkages info. */ + +#define ELF_STRING_ia64_archext ".IA_64.archext" +#define ELF_STRING_ia64_pltoff ".IA_64.pltoff" +#define ELF_STRING_ia64_unwind ".IA_64.unwind" +#define ELF_STRING_ia64_unwind_info ".IA_64.unwind_info" +#define ELF_STRING_ia64_unwind_once ".gnu.linkonce.ia64unw." +#define ELF_STRING_ia64_unwind_info_once ".gnu.linkonce.ia64unwi." +/* .IA_64.unwind_hdr is only used by HP-UX. */ +#define ELF_STRING_ia64_unwind_hdr ".IA_64.unwind_hdr" + +/* Bits in the sh_flags field of Elf64_Shdr: */ + +#define SHF_IA_64_SHORT 0x10000000 /* Section near gp. */ +#define SHF_IA_64_NORECOV 0x20000000 /* Spec insns w/o recovery. */ + +#define SHF_IA_64_HP_TLS 0x01000000 /* HP specific TLS flag. */ + +#define SHF_IA_64_VMS_GLOBAL 0x0100000000ULL /* Global for clustering. */ +#define SHF_IA_64_VMS_OVERLAID 0x0200000000ULL /* To be overlaid. */ +#define SHF_IA_64_VMS_SHARED 0x0400000000ULL /* Shared btw processes. */ +#define SHF_IA_64_VMS_VECTOR 0x0800000000ULL /* Priv change mode vect. */ +#define SHF_IA_64_VMS_ALLOC_64BIT 0x1000000000ULL /* Allocate beyond 2GB. */ +#define SHF_IA_64_VMS_PROTECTED 0x2000000000ULL /* Export from sharable. */ + +/* Possible values for sh_type in Elf64_Shdr: */ + +#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* Extension bits. */ +#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* Unwind bits. */ +#define SHT_IA_64_LOPSREG (SHT_LOPROC + 0x8000000) +/* ABI says (SHT_LOPROC + 0xfffffff) but I think it's a typo -- this makes sense. */ +#define SHT_IA_64_HIPSREG (SHT_LOPROC + 0x8ffffff) +#define SHT_IA_64_PRIORITY_INIT (SHT_LOPROC + 0x9000000) + +/* SHT_IA_64_HP_OPT_ANOT is only generated by HPUX compilers for its + optimization annotation section. GCC does not generate it but we + want readelf to know what they are. Do not use two capital Ns in + annotate or sed will turn it into 32 or 64 during the build. */ +#define SHT_IA_64_HP_OPT_ANOT 0x60000004 + +/* OpenVMS section types. */ +/* The section contains PC-to-source correlation information for use by the + VMS RTL's traceback facility. */ +#define SHT_IA_64_VMS_TRACE 0x60000000 +/* The section contains routine signature information for use by the + translated image executive. */ +#define SHT_IA_64_VMS_TIE_SIGNATURES 0x60000001 +/* The section contains dwarf-3 information. */ +#define SHT_IA_64_VMS_DEBUG 0x60000002 +/* The section contains the dwarf-3 string table. */ +#define SHT_IA_64_VMS_DEBUG_STR 0x60000003 +/* The section contains linkage information to perform consistency checking + accross object modules. */ +#define SHT_IA_64_VMS_LINKAGES 0x60000004 +/* The section allows the symbol vector in an image to be location through + the section table. */ +#define SHT_IA_64_VMS_SYMBOL_VECTOR 0x60000005 +/* The section contains inter-image fixups. */ +#define SHT_IA_64_VMS_FIXUP 0x60000006 +/* The section contains unmangled name info. */ +#define SHT_IA_64_VMS_DISPLAY_NAME_INFO 0x60000007 + +/* Bits in the p_flags field of Elf64_Phdr: */ + +#define PF_IA_64_NORECOV 0x80000000 + +/* Possible values for p_type in Elf64_Phdr: */ + +#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* Arch extension bits, */ +#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* IA64 unwind bits. */ + +/* HP-UX specific values for p_type in Elf64_Phdr. + These values are currently just used to make + readelf more usable on HP-UX. */ + +#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) +#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) +#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) + +/* Possible values for d_tag in Elf64_Dyn: */ + +#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) + +/* VMS specific values for d_tag in Elf64_Dyn: */ + +#define DT_IA_64_VMS_SUBTYPE (DT_LOOS + 0) +#define DT_IA_64_VMS_IMGIOCNT (DT_LOOS + 2) +#define DT_IA_64_VMS_LNKFLAGS (DT_LOOS + 8) +#define DT_IA_64_VMS_VIR_MEM_BLK_SIZ (DT_LOOS + 10) +#define DT_IA_64_VMS_IDENT (DT_LOOS + 12) +#define DT_IA_64_VMS_NEEDED_IDENT (DT_LOOS + 16) +#define DT_IA_64_VMS_IMG_RELA_CNT (DT_LOOS + 18) +#define DT_IA_64_VMS_SEG_RELA_CNT (DT_LOOS + 20) +#define DT_IA_64_VMS_FIXUP_RELA_CNT (DT_LOOS + 22) +#define DT_IA_64_VMS_FIXUP_NEEDED (DT_LOOS + 24) +#define DT_IA_64_VMS_SYMVEC_CNT (DT_LOOS + 26) +#define DT_IA_64_VMS_XLATED (DT_LOOS + 30) +#define DT_IA_64_VMS_STACKSIZE (DT_LOOS + 32) +#define DT_IA_64_VMS_UNWINDSZ (DT_LOOS + 34) +#define DT_IA_64_VMS_UNWIND_CODSEG (DT_LOOS + 36) +#define DT_IA_64_VMS_UNWIND_INFOSEG (DT_LOOS + 38) +#define DT_IA_64_VMS_LINKTIME (DT_LOOS + 40) +#define DT_IA_64_VMS_SEG_NO (DT_LOOS + 42) +#define DT_IA_64_VMS_SYMVEC_OFFSET (DT_LOOS + 44) +#define DT_IA_64_VMS_SYMVEC_SEG (DT_LOOS + 46) +#define DT_IA_64_VMS_UNWIND_OFFSET (DT_LOOS + 48) +#define DT_IA_64_VMS_UNWIND_SEG (DT_LOOS + 50) +#define DT_IA_64_VMS_STRTAB_OFFSET (DT_LOOS + 52) +#define DT_IA_64_VMS_SYSVER_OFFSET (DT_LOOS + 54) +#define DT_IA_64_VMS_IMG_RELA_OFF (DT_LOOS + 56) +#define DT_IA_64_VMS_SEG_RELA_OFF (DT_LOOS + 58) +#define DT_IA_64_VMS_FIXUP_RELA_OFF (DT_LOOS + 60) +#define DT_IA_64_VMS_PLTGOT_OFFSET (DT_LOOS + 62) +#define DT_IA_64_VMS_PLTGOT_SEG (DT_LOOS + 64) +#define DT_IA_64_VMS_FPMODE (DT_LOOS + 66) + +/* Values for DT_IA_64_LNKFLAGS. */ +#define VMS_LF_CALL_DEBUG 0x0001 /* Activate and call the debugger. */ +#define VMS_LF_NOP0BUFS 0x0002 /* RMS use of P0 for i/o disabled. */ +#define VMS_LF_P0IMAGE 0x0004 /* Image in P0 space only. */ +#define VMS_LF_MKTHREADS 0x0008 /* Multiple kernel threads enabled. */ +#define VMS_LF_UPCALLS 0x0010 /* Upcalls enabled. */ +#define VMS_LF_IMGSTA 0x0020 /* Use SYS$IMGSTA. */ +#define VMS_LF_INITIALIZE 0x0040 /* Image uses tfradr2. */ +#define VMS_LF_MAIN 0x0080 /* Image uses tfradr3. */ +#define VMS_LF_EXE_INIT 0x0200 /* Image uses tfradr4. */ +#define VMS_LF_TBK_IN_IMG 0x0400 /* Traceback records in image. */ +#define VMS_LF_DBG_IN_IMG 0x0800 /* Debug records in image. */ +#define VMS_LF_TBK_IN_DSF 0x1000 /* Traceback records in DSF. */ +#define VMS_LF_DBG_IN_DSF 0x2000 /* Debug records in DSF. */ +#define VMS_LF_SIGNATURES 0x4000 /* Signatures present. */ +#define VMS_LF_REL_SEG_OFF 0x8000 /* Maintain relative pos of seg. */ + +/* This section only used by HP-UX, The HP linker gives weak symbols + precedence over regular common symbols. We want common to override + weak. Using this common instead of SHN_COMMON does that. */ +#define SHN_IA_64_ANSI_COMMON SHN_LORESERVE + +/* This section is only used by OpenVMS. Symbol is defined in the symbol + vector (only possible for image files). */ +#define SHN_IA_64_VMS_SYMVEC SHN_LOOS + +/* OpenVMS IA64-specific symbol attributes. */ +#define VMS_STO_VISIBILITY 3 /* Alias of the standard field. */ +#define VMS_ST_VISIBILITY(o) ((o) & VMS_STO_VISIBILITY) +#define VMS_STO_FUNC_TYPE 0x30 /* Function type. */ +#define VMS_ST_FUNC_TYPE(o) (((o) & VMS_STO_FUNC_TYPE) >> 4) +# define VMS_SFT_CODE_ADDR 0 /* Symbol value is a code address. */ +# define VMS_SFT_SYMV_IDX 1 /* Symbol value is a symbol vector index. */ +# define VMS_SFT_FD 2 /* Symbol value is a function descriptor. */ +# define VMS_SFT_RESERVE 3 /* Reserved. */ +#define VMS_STO_LINKAGE 0xc0 +#define VMS_ST_LINKAGE(o) (((o) & VMS_STO_LINKAGE) >> 6) +# define VMS_STL_IGNORE 0 /* No associated linkage. */ +# define VMS_STL_RESERVE 1 +# define VMS_STL_STD 2 /* Standard linkage with return value. */ +# define VMS_STL_LNK 3 /* Explicit represented in .vms_linkages. */ + +/* OpenVMS specific symbol binding values. */ +#define STB_VMS_WEAK 11 /* VMS weak symbol. */ +#define STB_VMS_SYSTEM 12 /* System symbol. */ + +/* OpenVMS specific fixup and relocation structures. */ + +typedef struct +{ + unsigned char fixup_offset[8]; + unsigned char type[4]; + unsigned char fixup_seg[4]; + unsigned char addend[8]; + unsigned char symvec_index[4]; + unsigned char data_type[4]; +} Elf64_External_VMS_IMAGE_FIXUP; + +typedef struct +{ + unsigned char rela_offset[8]; + unsigned char type[4]; + unsigned char rela_seg[4]; + unsigned char addend[8]; + unsigned char sym_offset[8]; + unsigned char sym_seg[4]; + unsigned char fill_1[4]; +} Elf64_External_VMS_IMAGE_RELA; + +/* Note segments. VMS is special as it uses 64-bit entries. */ + +typedef struct { + unsigned char namesz[8]; /* Size of entry's owner string */ + unsigned char descsz[8]; /* Size of the note descriptor */ + unsigned char type[8]; /* Interpretation of the descriptor */ + char name[1]; /* Start of the name+desc data */ +} Elf64_External_VMS_Note; + +#define NT_VMS_MHD 1 /* Object module name, version, and date/time. */ +#define NT_VMS_LNM 2 /* Language processor name. */ +#define NT_VMS_SRC 3 /* Source files. */ +#define NT_VMS_TITLE 4 /* Title text. */ +#define NT_VMS_EIDC 5 /* Entity ident consistency check. */ +#define NT_VMS_FPMODE 6 /* Whole program floating-point mode. */ +#define NT_VMS_LINKTIME 101 /* Date/time image was linked. */ +#define NT_VMS_IMGNAM 102 /* Image name string. */ +#define NT_VMS_IMGID 103 /* Image ident string. */ +#define NT_VMS_LINKID 104 /* Linker ident string. */ +#define NT_VMS_IMGBID 105 /* Image build ident string. */ +#define NT_VMS_GSTNAM 106 /* Global Symbol Table Name. */ +#define NT_VMS_ORIG_DYN 107 /* Original setting of dynamic data. */ +#define NT_VMS_PATCHTIME 108 /* Date/time of last patch. */ + +/* Corresponding data for NT_VMS_ORIG_DYM. */ + +typedef struct { + unsigned char major_id[4]; /* Should be 1. */ + unsigned char minor_id[4]; /* Should be 3. */ + unsigned char manipulation_date[8]; /* Original NT_VMS_LNKTIME. */ + unsigned char link_flags[8]; /* Original NT_VMS_LNKFLAGS. */ + unsigned char elf_flags[4]; /* Original ehdr flags. */ + unsigned char _pad[4]; + unsigned char imgid[1]; /* Original NT_VMS_IMGID. */ +} Elf64_External_VMS_ORIG_DYN_Note; + +/* IA64-specific relocation types: */ + +/* Relocs apply to specific instructions within a bundle. The least + significant 2 bits of the address indicate which instruction in the + bundle the reloc refers to (0=first slot, 1=second slow, 2=third + slot, 3=undefined) and the remaining bits give the address of the + bundle (16 byte aligned). + + The top 5 bits of the reloc code specifies the expression type, the + low 3 bits the format of the data word being relocated. */ + +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (elf_ia64_reloc_type) + RELOC_NUMBER (R_IA64_NONE, 0x00) /* none */ + + RELOC_NUMBER (R_IA64_IMM14, 0x21) /* symbol + addend, add imm14 */ + RELOC_NUMBER (R_IA64_IMM22, 0x22) /* symbol + addend, add imm22 */ + RELOC_NUMBER (R_IA64_IMM64, 0x23) /* symbol + addend, mov imm64 */ + RELOC_NUMBER (R_IA64_DIR32MSB, 0x24) /* symbol + addend, data4 MSB */ + RELOC_NUMBER (R_IA64_DIR32LSB, 0x25) /* symbol + addend, data4 LSB */ + RELOC_NUMBER (R_IA64_DIR64MSB, 0x26) /* symbol + addend, data8 MSB */ + RELOC_NUMBER (R_IA64_DIR64LSB, 0x27) /* symbol + addend, data8 LSB */ + + RELOC_NUMBER (R_IA64_GPREL22, 0x2a) /* @gprel(sym+add), add imm22 */ + RELOC_NUMBER (R_IA64_GPREL64I, 0x2b) /* @gprel(sym+add), mov imm64 */ + RELOC_NUMBER (R_IA64_GPREL32MSB, 0x2c) /* @gprel(sym+add), data4 MSB */ + RELOC_NUMBER (R_IA64_GPREL32LSB, 0x2d) /* @gprel(sym+add), data4 LSB */ + RELOC_NUMBER (R_IA64_GPREL64MSB, 0x2e) /* @gprel(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_GPREL64LSB, 0x2f) /* @gprel(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_LTOFF22, 0x32) /* @ltoff(sym+add), add imm22 */ + RELOC_NUMBER (R_IA64_LTOFF64I, 0x33) /* @ltoff(sym+add), mov imm64 */ + + RELOC_NUMBER (R_IA64_PLTOFF22, 0x3a) /* @pltoff(sym+add), add imm22 */ + RELOC_NUMBER (R_IA64_PLTOFF64I, 0x3b) /* @pltoff(sym+add), mov imm64 */ + RELOC_NUMBER (R_IA64_PLTOFF64MSB, 0x3e) /* @pltoff(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_PLTOFF64LSB, 0x3f) /* @pltoff(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_FPTR64I, 0x43) /* @fptr(sym+add), mov imm64 */ + RELOC_NUMBER (R_IA64_FPTR32MSB, 0x44) /* @fptr(sym+add), data4 MSB */ + RELOC_NUMBER (R_IA64_FPTR32LSB, 0x45) /* @fptr(sym+add), data4 LSB */ + RELOC_NUMBER (R_IA64_FPTR64MSB, 0x46) /* @fptr(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_FPTR64LSB, 0x47) /* @fptr(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_PCREL60B, 0x48) /* @pcrel(sym+add), brl */ + RELOC_NUMBER (R_IA64_PCREL21B, 0x49) /* @pcrel(sym+add), ptb, call */ + RELOC_NUMBER (R_IA64_PCREL21M, 0x4a) /* @pcrel(sym+add), chk.s */ + RELOC_NUMBER (R_IA64_PCREL21F, 0x4b) /* @pcrel(sym+add), fchkf */ + RELOC_NUMBER (R_IA64_PCREL32MSB, 0x4c) /* @pcrel(sym+add), data4 MSB */ + RELOC_NUMBER (R_IA64_PCREL32LSB, 0x4d) /* @pcrel(sym+add), data4 LSB */ + RELOC_NUMBER (R_IA64_PCREL64MSB, 0x4e) /* @pcrel(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_PCREL64LSB, 0x4f) /* @pcrel(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_LTOFF_FPTR22, 0x52) /* @ltoff(@fptr(s+a)), imm22 */ + RELOC_NUMBER (R_IA64_LTOFF_FPTR64I, 0x53) /* @ltoff(@fptr(s+a)), imm64 */ + RELOC_NUMBER (R_IA64_LTOFF_FPTR32MSB, 0x54) /* @ltoff(@fptr(s+a)), 4 MSB */ + RELOC_NUMBER (R_IA64_LTOFF_FPTR32LSB, 0x55) /* @ltoff(@fptr(s+a)), 4 LSB */ + RELOC_NUMBER (R_IA64_LTOFF_FPTR64MSB, 0x56) /* @ltoff(@fptr(s+a)), 8 MSB */ + RELOC_NUMBER (R_IA64_LTOFF_FPTR64LSB, 0x57) /* @ltoff(@fptr(s+a)), 8 LSB */ + + RELOC_NUMBER (R_IA64_SEGREL32MSB, 0x5c) /* @segrel(sym+add), data4 MSB */ + RELOC_NUMBER (R_IA64_SEGREL32LSB, 0x5d) /* @segrel(sym+add), data4 LSB */ + RELOC_NUMBER (R_IA64_SEGREL64MSB, 0x5e) /* @segrel(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_SEGREL64LSB, 0x5f) /* @segrel(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_SECREL32MSB, 0x64) /* @secrel(sym+add), data4 MSB */ + RELOC_NUMBER (R_IA64_SECREL32LSB, 0x65) /* @secrel(sym+add), data4 LSB */ + RELOC_NUMBER (R_IA64_SECREL64MSB, 0x66) /* @secrel(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_SECREL64LSB, 0x67) /* @secrel(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_REL32MSB, 0x6c) /* data 4 + REL */ + RELOC_NUMBER (R_IA64_REL32LSB, 0x6d) /* data 4 + REL */ + RELOC_NUMBER (R_IA64_REL64MSB, 0x6e) /* data 8 + REL */ + RELOC_NUMBER (R_IA64_REL64LSB, 0x6f) /* data 8 + REL */ + + RELOC_NUMBER (R_IA64_LTV32MSB, 0x74) /* symbol + addend, data4 MSB */ + RELOC_NUMBER (R_IA64_LTV32LSB, 0x75) /* symbol + addend, data4 LSB */ + RELOC_NUMBER (R_IA64_LTV64MSB, 0x76) /* symbol + addend, data8 MSB */ + RELOC_NUMBER (R_IA64_LTV64LSB, 0x77) /* symbol + addend, data8 LSB */ + + RELOC_NUMBER (R_IA64_PCREL21BI, 0x79) /* @pcrel(sym+add), ptb, call */ + RELOC_NUMBER (R_IA64_PCREL22, 0x7a) /* @pcrel(sym+add), imm22 */ + RELOC_NUMBER (R_IA64_PCREL64I, 0x7b) /* @pcrel(sym+add), imm64 */ + + RELOC_NUMBER (R_IA64_IPLTMSB, 0x80) /* dynamic reloc, imported PLT, MSB */ + RELOC_NUMBER (R_IA64_IPLTLSB, 0x81) /* dynamic reloc, imported PLT, LSB */ + RELOC_NUMBER (R_IA64_COPY, 0x84) /* dynamic reloc, data copy */ + RELOC_NUMBER (R_IA64_LTOFF22X, 0x86) /* LTOFF22, relaxable. */ + RELOC_NUMBER (R_IA64_LDXMOV, 0x87) /* Use of LTOFF22X. */ + + RELOC_NUMBER (R_IA64_TPREL14, 0x91) /* @tprel(sym+add), add imm14 */ + RELOC_NUMBER (R_IA64_TPREL22, 0x92) /* @tprel(sym+add), add imm22 */ + RELOC_NUMBER (R_IA64_TPREL64I, 0x93) /* @tprel(sym+add), add imm64 */ + RELOC_NUMBER (R_IA64_TPREL64MSB, 0x96) /* @tprel(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_TPREL64LSB, 0x97) /* @tprel(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_LTOFF_TPREL22, 0x9a) /* @ltoff(@tprel(s+a)), add imm22 */ + + RELOC_NUMBER (R_IA64_DTPMOD64MSB, 0xa6) /* @dtpmod(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_DTPMOD64LSB, 0xa7) /* @dtpmod(sym+add), data8 LSB */ + RELOC_NUMBER (R_IA64_LTOFF_DTPMOD22, 0xaa) /* @ltoff(@dtpmod(s+a)), imm22 */ + + RELOC_NUMBER (R_IA64_DTPREL14, 0xb1) /* @dtprel(sym+add), imm14 */ + RELOC_NUMBER (R_IA64_DTPREL22, 0xb2) /* @dtprel(sym+add), imm22 */ + RELOC_NUMBER (R_IA64_DTPREL64I, 0xb3) /* @dtprel(sym+add), imm64 */ + RELOC_NUMBER (R_IA64_DTPREL32MSB, 0xb4) /* @dtprel(sym+add), data4 MSB */ + RELOC_NUMBER (R_IA64_DTPREL32LSB, 0xb5) /* @dtprel(sym+add), data4 LSB */ + RELOC_NUMBER (R_IA64_DTPREL64MSB, 0xb6) /* @dtprel(sym+add), data8 MSB */ + RELOC_NUMBER (R_IA64_DTPREL64LSB, 0xb7) /* @dtprel(sym+add), data8 LSB */ + + RELOC_NUMBER (R_IA64_LTOFF_DTPREL22, 0xba) /* @ltoff(@dtprel(s+a)), imm22 */ + + FAKE_RELOC (R_IA64_MAX_RELOC_CODE, 0xba) + + /* OpenVMS specific relocs. */ + RELOC_NUMBER (R_IA64_VMS_DIR8, 0x70000000) /* S + A */ + RELOC_NUMBER (R_IA64_VMS_DIR16LSB, 0x70000001) /* S + A */ + RELOC_NUMBER (R_IA64_VMS_CALL_SIGNATURE, 0x70000002) + RELOC_NUMBER (R_IA64_VMS_EXECLET_FUNC, 0x70000003) + RELOC_NUMBER (R_IA64_VMS_EXECLET_DATA, 0x70000004) + RELOC_NUMBER (R_IA64_VMS_FIX8, 0x70000005) /* S + A */ + RELOC_NUMBER (R_IA64_VMS_FIX16, 0x70000006) /* S + A */ + RELOC_NUMBER (R_IA64_VMS_FIX32, 0x70000007) /* S + A */ + RELOC_NUMBER (R_IA64_VMS_FIX64, 0x70000008) /* S + A */ + RELOC_NUMBER (R_IA64_VMS_FIXFD, 0x70000009) + RELOC_NUMBER (R_IA64_VMS_ACC_LOAD, 0x7000000a) /* ACC = S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_ADD, 0x7000000b) /* ACC += S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_SUB, 0x7000000c) /* ACC -= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_MUL, 0x7000000d) /* ACC *= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_DIV, 0x7000000e) /* ACC /= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_AND, 0x7000000f) /* ACC &= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_IOR, 0x70000010) /* ACC |= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_EOR, 0x70000011) /* ACC ^= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_ASH, 0x70000012) /* ACC >>= S + A */ + RELOC_NUMBER (R_IA64_VMS_ACC_STO8, 0x70000014) /* ACC */ + RELOC_NUMBER (R_IA64_VMS_ACC_STO16LSH, 0x70000015) /* ACC */ + RELOC_NUMBER (R_IA64_VMS_ACC_STO32LSH, 0x70000016) /* ACC */ + RELOC_NUMBER (R_IA64_VMS_ACC_STO64LSH, 0x70000017) /* ACC */ +END_RELOC_NUMBERS (R_IA64_max) + +#endif /* _ELF_IA64_H */ diff --git a/include/elf/internal.h b/include/elf/internal.h new file mode 100644 index 0000000..4615037 --- /dev/null +++ b/include/elf/internal.h @@ -0,0 +1,360 @@ +/* ELF support for BFD. + Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, + 2003, 2006, 2007, 2008, 2010, 2011 Free Software Foundation, Inc. + + Written by Fred Fish @ Cygnus Support, from information published + in "UNIX System V Release 4, Programmers Guide: ANSI C and + Programming Support Tools". + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is part of ELF support for BFD, and contains the portions + that describe how ELF is represented internally in the BFD library. + I.E. it describes the in-memory representation of ELF. It requires + the elf-common.h file which contains the portions that are common to + both the internal and external representations. */ + +/* NOTE that these structures are not kept in the same order as they appear + in the object file. In some cases they've been reordered for more optimal + packing under various circumstances. */ + +#ifndef _ELF_INTERNAL_H +#define _ELF_INTERNAL_H + +/* Special section indices, which may show up in st_shndx fields, among + other places. */ + +#undef SHN_UNDEF +#undef SHN_LORESERVE +#undef SHN_LOPROC +#undef SHN_HIPROC +#undef SHN_LOOS +#undef SHN_HIOS +#undef SHN_ABS +#undef SHN_COMMON +#undef SHN_XINDEX +#undef SHN_HIRESERVE +#define SHN_UNDEF 0 /* Undefined section reference */ +#define SHN_LORESERVE (-0x100u) /* Begin range of reserved indices */ +#define SHN_LOPROC (-0x100u) /* Begin range of appl-specific */ +#define SHN_HIPROC (-0xE1u) /* End range of appl-specific */ +#define SHN_LOOS (-0xE0u) /* OS specific semantics, lo */ +#define SHN_HIOS (-0xC1u) /* OS specific semantics, hi */ +#define SHN_ABS (-0xFu) /* Associated symbol is absolute */ +#define SHN_COMMON (-0xEu) /* Associated symbol is in common */ +#define SHN_XINDEX (-0x1u) /* Section index is held elsewhere */ +#define SHN_HIRESERVE (-0x1u) /* End range of reserved indices */ +#define SHN_BAD (-0x101u) /* Used internally by bfd */ + +/* ELF Header */ + +#define EI_NIDENT 16 /* Size of e_ident[] */ + +typedef struct elf_internal_ehdr { + unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */ + bfd_vma e_entry; /* Entry point virtual address */ + bfd_size_type e_phoff; /* Program header table file offset */ + bfd_size_type e_shoff; /* Section header table file offset */ + unsigned long e_version; /* Identifies object file version */ + unsigned long e_flags; /* Processor-specific flags */ + unsigned short e_type; /* Identifies object file type */ + unsigned short e_machine; /* Specifies required architecture */ + unsigned int e_ehsize; /* ELF header size in bytes */ + unsigned int e_phentsize; /* Program header table entry size */ + unsigned int e_phnum; /* Program header table entry count */ + unsigned int e_shentsize; /* Section header table entry size */ + unsigned int e_shnum; /* Section header table entry count */ + unsigned int e_shstrndx; /* Section header string table index */ +} Elf_Internal_Ehdr; + +/* Program header */ + +struct elf_internal_phdr { + unsigned long p_type; /* Identifies program segment type */ + unsigned long p_flags; /* Segment flags */ + bfd_vma p_offset; /* Segment file offset */ + bfd_vma p_vaddr; /* Segment virtual address */ + bfd_vma p_paddr; /* Segment physical address */ + bfd_vma p_filesz; /* Segment size in file */ + bfd_vma p_memsz; /* Segment size in memory */ + bfd_vma p_align; /* Segment alignment, file & memory */ +}; + +typedef struct elf_internal_phdr Elf_Internal_Phdr; + +/* Section header */ + +typedef struct elf_internal_shdr { + unsigned int sh_name; /* Section name, index in string tbl */ + unsigned int sh_type; /* Type of section */ + bfd_vma sh_flags; /* Miscellaneous section attributes */ + bfd_vma sh_addr; /* Section virtual addr at execution */ + file_ptr sh_offset; /* Section file offset */ + bfd_size_type sh_size; /* Size of section in bytes */ + unsigned int sh_link; /* Index of another section */ + unsigned int sh_info; /* Additional section information */ + bfd_vma sh_addralign; /* Section alignment */ + bfd_size_type sh_entsize; /* Entry size if section holds table */ + + /* The internal rep also has some cached info associated with it. */ + asection * bfd_section; /* Associated BFD section. */ + unsigned char *contents; /* Section contents. */ +} Elf_Internal_Shdr; + +/* Symbol table entry */ + +struct elf_internal_sym { + bfd_vma st_value; /* Value of the symbol */ + bfd_vma st_size; /* Associated symbol size */ + unsigned long st_name; /* Symbol name, index in string tbl */ + unsigned char st_info; /* Type and binding attributes */ + unsigned char st_other; /* Visibilty, and target specific */ + unsigned char st_target_internal; /* Internal-only information */ + unsigned int st_shndx; /* Associated section index */ +}; + +typedef struct elf_internal_sym Elf_Internal_Sym; + +/* Note segments */ + +typedef struct elf_internal_note { + unsigned long namesz; /* Size of entry's owner string */ + unsigned long descsz; /* Size of the note descriptor */ + unsigned long type; /* Interpretation of the descriptor */ + char * namedata; /* Start of the name+desc data */ + char * descdata; /* Start of the desc data */ + bfd_vma descpos; /* File offset of the descdata */ +} Elf_Internal_Note; + +/* Relocation Entries */ + +typedef struct elf_internal_rela { + bfd_vma r_offset; /* Location at which to apply the action */ + bfd_vma r_info; /* Index and Type of relocation */ + bfd_vma r_addend; /* Constant addend used to compute value */ +} Elf_Internal_Rela; + +/* dynamic section structure */ + +typedef struct elf_internal_dyn { + /* This needs to support 64-bit values in elf64. */ + bfd_vma d_tag; /* entry tag value */ + union { + /* This needs to support 64-bit values in elf64. */ + bfd_vma d_val; + bfd_vma d_ptr; + } d_un; +} Elf_Internal_Dyn; + +/* This structure appears in a SHT_GNU_verdef section. */ + +typedef struct elf_internal_verdef { + unsigned short vd_version; /* Version number of structure. */ + unsigned short vd_flags; /* Flags (VER_FLG_*). */ + unsigned short vd_ndx; /* Version index. */ + unsigned short vd_cnt; /* Number of verdaux entries. */ + unsigned long vd_hash; /* Hash of name. */ + unsigned long vd_aux; /* Offset to verdaux entries. */ + unsigned long vd_next; /* Offset to next verdef. */ + + /* These fields are set up when BFD reads in the structure. FIXME: + It would be cleaner to store these in a different structure. */ + bfd *vd_bfd; /* BFD. */ + const char *vd_nodename; /* Version name. */ + struct elf_internal_verdef *vd_nextdef; /* vd_next as pointer. */ + struct elf_internal_verdaux *vd_auxptr; /* vd_aux as pointer. */ + unsigned int vd_exp_refno; /* Used by the linker. */ +} Elf_Internal_Verdef; + +/* This structure appears in a SHT_GNU_verdef section. */ + +typedef struct elf_internal_verdaux { + unsigned long vda_name; /* String table offset of name. */ + unsigned long vda_next; /* Offset to next verdaux. */ + + /* These fields are set up when BFD reads in the structure. FIXME: + It would be cleaner to store these in a different structure. */ + const char *vda_nodename; /* vda_name as pointer. */ + struct elf_internal_verdaux *vda_nextptr; /* vda_next as pointer. */ +} Elf_Internal_Verdaux; + +/* This structure appears in a SHT_GNU_verneed section. */ + +typedef struct elf_internal_verneed { + unsigned short vn_version; /* Version number of structure. */ + unsigned short vn_cnt; /* Number of vernaux entries. */ + unsigned long vn_file; /* String table offset of library name. */ + unsigned long vn_aux; /* Offset to vernaux entries. */ + unsigned long vn_next; /* Offset to next verneed. */ + + /* These fields are set up when BFD reads in the structure. FIXME: + It would be cleaner to store these in a different structure. */ + bfd *vn_bfd; /* BFD. */ + const char *vn_filename; /* vn_file as pointer. */ + struct elf_internal_vernaux *vn_auxptr; /* vn_aux as pointer. */ + struct elf_internal_verneed *vn_nextref; /* vn_nextref as pointer. */ +} Elf_Internal_Verneed; + +/* This structure appears in a SHT_GNU_verneed section. */ + +typedef struct elf_internal_vernaux { + unsigned long vna_hash; /* Hash of dependency name. */ + unsigned short vna_flags; /* Flags (VER_FLG_*). */ + unsigned short vna_other; /* Unused. */ + unsigned long vna_name; /* String table offset to version name. */ + unsigned long vna_next; /* Offset to next vernaux. */ + + /* These fields are set up when BFD reads in the structure. FIXME: + It would be cleaner to store these in a different structure. */ + const char *vna_nodename; /* vna_name as pointer. */ + struct elf_internal_vernaux *vna_nextptr; /* vna_next as pointer. */ +} Elf_Internal_Vernaux; + +/* This structure appears in a SHT_GNU_versym section. This is not a + standard ELF structure; ELF just uses Elf32_Half. */ + +typedef struct elf_internal_versym { + unsigned short vs_vers; +} Elf_Internal_Versym; + +/* Structure for syminfo section. */ +typedef struct +{ + unsigned short int si_boundto; + unsigned short int si_flags; +} Elf_Internal_Syminfo; + +/* This structure appears on the stack and in NT_AUXV core file notes. */ +typedef struct +{ + bfd_vma a_type; + bfd_vma a_val; +} Elf_Internal_Auxv; + + +/* This structure is used to describe how sections should be assigned + to program segments. */ + +struct elf_segment_map +{ + /* Next program segment. */ + struct elf_segment_map *next; + /* Program segment type. */ + unsigned long p_type; + /* Program segment flags. */ + unsigned long p_flags; + /* Program segment physical address. */ + bfd_vma p_paddr; + /* Program segment virtual address offset from section vma. */ + bfd_vma p_vaddr_offset; + /* Program segment alignment. */ + bfd_vma p_align; + /* Segment size in file and memory */ + bfd_vma p_size; + /* Required size of filehdr + phdrs, if non-zero */ + bfd_vma header_size; + /* Whether the p_flags field is valid; if not, the flags are based + on the section flags. */ + unsigned int p_flags_valid : 1; + /* Whether the p_paddr field is valid; if not, the physical address + is based on the section lma values. */ + unsigned int p_paddr_valid : 1; + /* Whether the p_align field is valid; if not, PT_LOAD segment + alignment is based on the default maximum page size. */ + unsigned int p_align_valid : 1; + /* Whether the p_size field is valid; if not, the size are based + on the section sizes. */ + unsigned int p_size_valid : 1; + /* Whether this segment includes the file header. */ + unsigned int includes_filehdr : 1; + /* Whether this segment includes the program headers. */ + unsigned int includes_phdrs : 1; + /* Number of sections (may be 0). */ + unsigned int count; + /* Sections. Actual number of elements is in count field. */ + asection *sections[1]; +}; + +/* .tbss is special. It doesn't contribute memory space to normal + segments and it doesn't take file space in normal segments. */ +#define ELF_TBSS_SPECIAL(sec_hdr, segment) \ + (((sec_hdr)->sh_flags & SHF_TLS) != 0 \ + && (sec_hdr)->sh_type == SHT_NOBITS \ + && (segment)->p_type != PT_TLS) + +#define ELF_SECTION_SIZE(sec_hdr, segment) \ + (ELF_TBSS_SPECIAL(sec_hdr, segment) ? 0 : (sec_hdr)->sh_size) + +/* Decide if the section SEC_HDR is in SEGMENT. If CHECK_VMA, then + VMAs are checked for alloc sections. If STRICT, then a zero size + section won't match at the end of a segment, unless the segment + is also zero size. Regardless of STRICT and CHECK_VMA, zero size + sections won't match at the start or end of PT_DYNAMIC, unless + PT_DYNAMIC is itself zero sized. */ +#define ELF_SECTION_IN_SEGMENT_1(sec_hdr, segment, check_vma, strict) \ + ((/* Only PT_LOAD, PT_GNU_RELRO and PT_TLS segments can contain \ + SHF_TLS sections. */ \ + ((((sec_hdr)->sh_flags & SHF_TLS) != 0) \ + && ((segment)->p_type == PT_TLS \ + || (segment)->p_type == PT_GNU_RELRO \ + || (segment)->p_type == PT_LOAD)) \ + /* PT_TLS segment contains only SHF_TLS sections, PT_PHDR no \ + sections at all. */ \ + || (((sec_hdr)->sh_flags & SHF_TLS) == 0 \ + && (segment)->p_type != PT_TLS \ + && (segment)->p_type != PT_PHDR)) \ + /* Any section besides one of type SHT_NOBITS must have file \ + offsets within the segment. */ \ + && ((sec_hdr)->sh_type == SHT_NOBITS \ + || ((bfd_vma) (sec_hdr)->sh_offset >= (segment)->p_offset \ + && (!(strict) \ + || ((sec_hdr)->sh_offset - (segment)->p_offset \ + <= (segment)->p_filesz - 1)) \ + && (((sec_hdr)->sh_offset - (segment)->p_offset \ + + ELF_SECTION_SIZE(sec_hdr, segment)) \ + <= (segment)->p_filesz))) \ + /* SHF_ALLOC sections must have VMAs within the segment. */ \ + && (!(check_vma) \ + || ((sec_hdr)->sh_flags & SHF_ALLOC) == 0 \ + || ((sec_hdr)->sh_addr >= (segment)->p_vaddr \ + && (!(strict) \ + || ((sec_hdr)->sh_addr - (segment)->p_vaddr \ + <= (segment)->p_memsz - 1)) \ + && (((sec_hdr)->sh_addr - (segment)->p_vaddr \ + + ELF_SECTION_SIZE(sec_hdr, segment)) \ + <= (segment)->p_memsz))) \ + /* No zero size sections at start or end of PT_DYNAMIC. */ \ + && ((segment)->p_type != PT_DYNAMIC \ + || (sec_hdr)->sh_size != 0 \ + || (segment)->p_memsz == 0 \ + || (((sec_hdr)->sh_type == SHT_NOBITS \ + || ((bfd_vma) (sec_hdr)->sh_offset > (segment)->p_offset \ + && ((sec_hdr)->sh_offset - (segment)->p_offset \ + < (segment)->p_filesz))) \ + && (((sec_hdr)->sh_flags & SHF_ALLOC) == 0 \ + || ((sec_hdr)->sh_addr > (segment)->p_vaddr \ + && ((sec_hdr)->sh_addr - (segment)->p_vaddr \ + < (segment)->p_memsz)))))) + +#define ELF_SECTION_IN_SEGMENT(sec_hdr, segment) \ + (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 0)) + +#define ELF_SECTION_IN_SEGMENT_STRICT(sec_hdr, segment) \ + (ELF_SECTION_IN_SEGMENT_1 (sec_hdr, segment, 1, 1)) + +#endif /* _ELF_INTERNAL_H */ diff --git a/include/elf/ip2k.h b/include/elf/ip2k.h new file mode 100644 index 0000000..8b4f36e --- /dev/null +++ b/include/elf/ip2k.h @@ -0,0 +1,62 @@ +/* IP2xxx ELF support for BFD. + Copyright (C) 2000, 2002, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_IP2K_H +#define _ELF_IP2K_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_ip2k_reloc_type) + RELOC_NUMBER (R_IP2K_NONE, 0) + RELOC_NUMBER (R_IP2K_16, 1) + RELOC_NUMBER (R_IP2K_32, 2) + RELOC_NUMBER (R_IP2K_FR9, 3) + RELOC_NUMBER (R_IP2K_BANK, 4) + RELOC_NUMBER (R_IP2K_ADDR16CJP, 5) + RELOC_NUMBER (R_IP2K_PAGE3, 6) + RELOC_NUMBER (R_IP2K_LO8DATA, 7) + RELOC_NUMBER (R_IP2K_HI8DATA, 8) + RELOC_NUMBER (R_IP2K_LO8INSN, 9) + RELOC_NUMBER (R_IP2K_HI8INSN, 10) + RELOC_NUMBER (R_IP2K_PC_SKIP, 11) + RELOC_NUMBER (R_IP2K_TEXT, 12) + RELOC_NUMBER (R_IP2K_FR_OFFSET, 13) + RELOC_NUMBER (R_IP2K_EX8DATA, 14) +END_RELOC_NUMBERS(R_IP2K_max) + + +/* Define the data & instruction memory discriminator. In a linked + executable, an symbol should be deemed to point to an instruction + if ((address & IP2K_INSN_MASK) == IP2K_INSN_VALUE), and similarly + for the data space. See also `ld/emulparams/elf32ip2k.sh'. */ +/* ??? Consider extending the _MASK values to include all the + intermediate bits that must be zero due to the limited physical + memory size on the IP2K. */ + +#define IP2K_DATA_MASK 0xff000000 +#define IP2K_DATA_VALUE 0x01000000 +#define IP2K_INSN_MASK 0xff000000 +#define IP2K_INSN_VALUE 0x02000000 + +/* The location of the memory mapped hardware stack. */ +#define IP2K_STACK_VALUE 0x0f000000 +#define IP2K_STACK_SIZE 0x20 + +#endif /* _ELF_IP2K_H */ diff --git a/include/elf/iq2000.h b/include/elf/iq2000.h new file mode 100644 index 0000000..0f8e697 --- /dev/null +++ b/include/elf/iq2000.h @@ -0,0 +1,58 @@ +/* IQ2000 ELF support for BFD. + Copyright (C) 2002, 2003, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_IQ2000_H +#define _ELF_IQ2000_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_iq2000_reloc_type) + RELOC_NUMBER (R_IQ2000_NONE, 0) + RELOC_NUMBER (R_IQ2000_16, 1) + RELOC_NUMBER (R_IQ2000_32, 2) + RELOC_NUMBER (R_IQ2000_26, 3) + RELOC_NUMBER (R_IQ2000_PC16, 4) + RELOC_NUMBER (R_IQ2000_HI16, 5) + RELOC_NUMBER (R_IQ2000_LO16, 6) + RELOC_NUMBER (R_IQ2000_OFFSET_16, 7) + RELOC_NUMBER (R_IQ2000_OFFSET_21, 8) + RELOC_NUMBER (R_IQ2000_UHI16, 9) + RELOC_NUMBER (R_IQ2000_32_DEBUG, 10) + RELOC_NUMBER (R_IQ2000_GNU_VTINHERIT, 200) + RELOC_NUMBER (R_IQ2000_GNU_VTENTRY, 201) +END_RELOC_NUMBERS(R_IQ2000_max) + +#define EF_IQ2000_CPU_IQ2000 0x00000001 /* default */ +#define EF_IQ2000_CPU_IQ10 0x00000002 /* IQ10 */ +#define EF_IQ2000_CPU_MASK 0x00000003 /* specific cpu bits */ +#define EF_IQ2000_ALL_FLAGS (EF_IQ2000_CPU_MASK) + +/* Define the data & instruction memory discriminator. In a linked + executable, an symbol should be deemed to point to an instruction + if ((address & IQ2000_INSN_MASK) == IQ2000_INSN_VALUE), and similarly + for the data space. */ + +#define IQ2000_DATA_MASK 0x80000000 +#define IQ2000_DATA_VALUE 0x00000000 +#define IQ2000_INSN_MASK 0x80000000 +#define IQ2000_INSN_VALUE 0x80000000 + + +#endif /* _ELF_IQ2000_H */ diff --git a/include/elf/lm32.h b/include/elf/lm32.h new file mode 100644 index 0000000..6ed34ec --- /dev/null +++ b/include/elf/lm32.h @@ -0,0 +1,56 @@ +/* Lattice Mico32 ELF support for BFD. + Copyright 2008, 2010 Free Software Foundation, Inc. + Contributed by Jon Beniston + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_LM32_H +#define _ELF_LM32_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_lm32_reloc_type) + RELOC_NUMBER (R_LM32_NONE, 0) + RELOC_NUMBER (R_LM32_8, 1) + RELOC_NUMBER (R_LM32_16, 2) + RELOC_NUMBER (R_LM32_32, 3) + RELOC_NUMBER (R_LM32_HI16, 4) + RELOC_NUMBER (R_LM32_LO16, 5) + RELOC_NUMBER (R_LM32_GPREL16, 6) + RELOC_NUMBER (R_LM32_CALL, 7) + RELOC_NUMBER (R_LM32_BRANCH, 8) + RELOC_NUMBER (R_LM32_GNU_VTINHERIT, 9) + RELOC_NUMBER (R_LM32_GNU_VTENTRY, 10) + RELOC_NUMBER (R_LM32_16_GOT, 11) + RELOC_NUMBER (R_LM32_GOTOFF_HI16, 12) + RELOC_NUMBER (R_LM32_GOTOFF_LO16, 13) + RELOC_NUMBER (R_LM32_COPY, 14) + RELOC_NUMBER (R_LM32_GLOB_DAT, 15) + RELOC_NUMBER (R_LM32_JMP_SLOT, 16) + RELOC_NUMBER (R_LM32_RELATIVE, 17) +END_RELOC_NUMBERS (R_LM32_max) + +/* Processor specific flags for the ELF header e_flags field. */ + +#define EF_LM32_MACH 0x00000001 + +/* Various CPU types. */ + +#define E_LM32_MACH 0x1 + +#endif /* _ELF_LM32_H */ diff --git a/include/elf/m32c.h b/include/elf/m32c.h new file mode 100644 index 0000000..29b80a6 --- /dev/null +++ b/include/elf/m32c.h @@ -0,0 +1,67 @@ +/* M32C ELF support for BFD. + Copyright (C) 2004, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_M32C_H +#define _ELF_M32C_H + +#include "elf/reloc-macros.h" + + /* Relocations. */ + START_RELOC_NUMBERS (elf_m32c_reloc_type) + RELOC_NUMBER (R_M32C_NONE, 0) + RELOC_NUMBER (R_M32C_16, 1) + RELOC_NUMBER (R_M32C_24, 2) + RELOC_NUMBER (R_M32C_32, 3) + RELOC_NUMBER (R_M32C_8_PCREL, 4) + RELOC_NUMBER (R_M32C_16_PCREL, 5) + + /* 8 bit unsigned address, used for dsp8[a0] etc */ + RELOC_NUMBER (R_M32C_8, 6) + /* Bits 0..15 of an address, for SMOVF's A0, A1A0, etc. */ + RELOC_NUMBER (R_M32C_LO16, 7) + /* Bits 16..23 of an address, for SMOVF's R1H etc. */ + RELOC_NUMBER (R_M32C_HI8, 8) + /* Bits 16..31 of an address, for LDE's A1A0 etc. */ + RELOC_NUMBER (R_M32C_HI16, 9) + + /* These are relocs we need when relaxing. */ + /* Marks various jump opcodes. */ + RELOC_NUMBER (R_M32C_RL_JUMP, 10) + /* Marks standard one-address form. */ + RELOC_NUMBER (R_M32C_RL_1ADDR, 11) + /* Marks standard two-address form. */ + RELOC_NUMBER (R_M32C_RL_2ADDR, 12) + + END_RELOC_NUMBERS (R_M32C_max) + +#define EF_M32C_CPU_M16C 0x00000075 /* default */ +#define EF_M32C_CPU_M32C 0x00000078 /* m32c */ +#define EF_M32C_CPU_MASK 0x0000007F /* specific cpu bits */ +#define EF_M32C_ALL_FLAGS (EF_M32C_CPU_MASK) + +/* Define the data & instruction memory discriminator. In a linked + executable, an symbol should be deemed to point to an instruction + if ((address & M16C_INSN_MASK) == M16C_INSN_VALUE), and similarly + for the data space. See also `ld/emulparams/elf32m32c.sh'. */ +#define M32C_DATA_MASK 0xffc00000 +#define M32C_DATA_VALUE 0x00000000 +#define M32C_INSN_MASK 0xffc00000 +#define M32C_INSN_VALUE 0x00400000 + +#endif /* _ELF_M32C_H */ diff --git a/include/elf/m32r.h b/include/elf/m32r.h new file mode 100644 index 0000000..7e06e3f --- /dev/null +++ b/include/elf/m32r.h @@ -0,0 +1,123 @@ +/* M32R ELF support for BFD. + Copyright 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2008, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_M32R_H +#define _ELF_M32R_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_m32r_reloc_type) + RELOC_NUMBER (R_M32R_NONE, 0) + /* REL relocations */ + RELOC_NUMBER (R_M32R_16, 1) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_32, 2) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_24, 3) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_10_PCREL, 4) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_18_PCREL, 5) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_26_PCREL, 6) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_HI16_ULO, 7) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_HI16_SLO, 8) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_LO16, 9) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_SDA16, 10) /* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_GNU_VTINHERIT, 11)/* For backwards compatibility. */ + RELOC_NUMBER (R_M32R_GNU_VTENTRY, 12) /* For backwards compatibility. */ + + /* RELA relocations */ + RELOC_NUMBER (R_M32R_16_RELA, 33) + RELOC_NUMBER (R_M32R_32_RELA, 34) + RELOC_NUMBER (R_M32R_24_RELA, 35) + RELOC_NUMBER (R_M32R_10_PCREL_RELA, 36) + RELOC_NUMBER (R_M32R_18_PCREL_RELA, 37) + RELOC_NUMBER (R_M32R_26_PCREL_RELA, 38) + RELOC_NUMBER (R_M32R_HI16_ULO_RELA, 39) + RELOC_NUMBER (R_M32R_HI16_SLO_RELA, 40) + RELOC_NUMBER (R_M32R_LO16_RELA, 41) + RELOC_NUMBER (R_M32R_SDA16_RELA, 42) + RELOC_NUMBER (R_M32R_RELA_GNU_VTINHERIT, 43) + RELOC_NUMBER (R_M32R_RELA_GNU_VTENTRY, 44) + + RELOC_NUMBER (R_M32R_REL32, 45) + + RELOC_NUMBER (R_M32R_GOT24, 48) + RELOC_NUMBER (R_M32R_26_PLTREL, 49) + RELOC_NUMBER (R_M32R_COPY, 50) + RELOC_NUMBER (R_M32R_GLOB_DAT, 51) + RELOC_NUMBER (R_M32R_JMP_SLOT, 52) + RELOC_NUMBER (R_M32R_RELATIVE, 53) + RELOC_NUMBER (R_M32R_GOTOFF, 54) + RELOC_NUMBER (R_M32R_GOTPC24, 55) + RELOC_NUMBER (R_M32R_GOT16_HI_ULO, 56) + RELOC_NUMBER (R_M32R_GOT16_HI_SLO, 57) + RELOC_NUMBER (R_M32R_GOT16_LO, 58) + RELOC_NUMBER (R_M32R_GOTPC_HI_ULO, 59) + RELOC_NUMBER (R_M32R_GOTPC_HI_SLO, 60) + RELOC_NUMBER (R_M32R_GOTPC_LO, 61) + RELOC_NUMBER (R_M32R_GOTOFF_HI_ULO, 62) + RELOC_NUMBER (R_M32R_GOTOFF_HI_SLO, 63) + RELOC_NUMBER (R_M32R_GOTOFF_LO, 64) + +END_RELOC_NUMBERS (R_M32R_max) + +/* Processor specific section indices. These sections do not actually + exist. Symbols with a st_shndx field corresponding to one of these + values have a special meaning. */ + +/* Small common symbol. */ +#define SHN_M32R_SCOMMON SHN_LORESERVE + +/* Processor specific section flags. */ + +/* This section contains sufficient relocs to be relaxed. + When relaxing, even relocs of branch instructions the assembler could + complete must be present because relaxing may cause the branch target to + move. */ +#define SHF_M32R_CAN_RELAX 0x10000000 + +/* Processor specific flags for the ELF header e_flags field. */ + +/* Two bit m32r architecture field. */ +#define EF_M32R_ARCH 0x30000000 + +/* m32r code. */ +#define E_M32R_ARCH 0x00000000 +/* m32rx code. */ +#define E_M32RX_ARCH 0x10000000 +/* m32r2 code. */ +#define E_M32R2_ARCH 0x20000000 + +/* 12 bit m32r new instructions field. */ +#define EF_M32R_INST 0x0FFF0000 +/* Parallel instructions. */ +#define E_M32R_HAS_PARALLEL 0x00010000 +/* Hidden instructions for m32rx: + jc, jnc, macwhi-a, macwlo-a, mulwhi-a, mulwlo-a, sth+, shb+, sat, pcmpbz, + sc, snc. */ +#define E_M32R_HAS_HIDDEN_INST 0x00020000 +/* New bit instructions: + clrpsw, setpsw, bset, bclr, btst. */ +#define E_M32R_HAS_BIT_INST 0x00040000 +/* Floating point instructions. */ +#define E_M32R_HAS_FLOAT_INST 0x00080000 + +/* 4 bit m32r ignore to check field. */ +#define EF_M32R_IGNORE 0x0000000F + +#endif diff --git a/include/elf/m68hc11.h b/include/elf/m68hc11.h new file mode 100644 index 0000000..58d8820 --- /dev/null +++ b/include/elf/m68hc11.h @@ -0,0 +1,107 @@ +/* m68hc11 & m68hc12 ELF support for BFD. + Copyright 1999, 2000, 2001, 2002, 2010, 2012 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_M68HC11_H +#define _ELF_M68HC11_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_m68hc11_reloc_type) + RELOC_NUMBER (R_M68HC11_NONE, 0) + RELOC_NUMBER (R_M68HC11_8, 1) + RELOC_NUMBER (R_M68HC11_HI8, 2) + RELOC_NUMBER (R_M68HC11_LO8, 3) + RELOC_NUMBER (R_M68HC11_PCREL_8, 4) + RELOC_NUMBER (R_M68HC11_16, 5) + RELOC_NUMBER (R_M68HC11_32, 6) + RELOC_NUMBER (R_M68HC11_3B, 7) + RELOC_NUMBER (R_M68HC11_PCREL_16, 8) + + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_M68HC11_GNU_VTINHERIT, 9) + RELOC_NUMBER (R_M68HC11_GNU_VTENTRY, 10) + + RELOC_NUMBER (R_M68HC11_24, 11) + RELOC_NUMBER (R_M68HC11_LO16, 12) + RELOC_NUMBER (R_M68HC11_PAGE, 13) + + RELOC_NUMBER (R_M68HC12_16B, 15) + RELOC_NUMBER (R_M68HC12_PCREL_9, 16) + RELOC_NUMBER (R_M68HC12_PCREL_10, 17) + RELOC_NUMBER (R_M68HC12_HI8XG, 18) + RELOC_NUMBER (R_M68HC12_LO8XG, 19) + + /* GNU extension for linker relaxation. + Mark beginning of a jump instruction (any form). */ + RELOC_NUMBER (R_M68HC11_RL_JUMP, 20) + + /* Mark beginning of Gcc relaxation group instruction. */ + RELOC_NUMBER (R_M68HC11_RL_GROUP, 21) +END_RELOC_NUMBERS (R_M68HC11_max) + +/* Processor specific flags for the ELF header e_flags field. */ + +/* ABI identification. */ +#define EF_M68HC11_ABI 0x00000000F + +/* Integers are 32-bit long. */ +#define E_M68HC11_I32 0x000000001 + +/* Doubles are 64-bit long. */ +#define E_M68HC11_F64 0x000000002 + +/* Uses 68HC12 memory banks. */ +#define E_M68HC12_BANKS 0x000000004 + +/* XGATE ram offsetting. */ +#define E_M68HC11_XGATE_RAMOFFSET 0x000000100 + +/* Suppress warnings */ +#define E_M68HC11_NO_BANK_WARNING 0x000000200 + +#define EF_M68HC11_MACH_MASK 0xF0 +#define EF_M68HC11_GENERIC 0x00 /* Generic 68HC12/backward compatibility. */ +#define EF_M68HC12_MACH 0x10 /* 68HC12 microcontroller. */ +#define EF_M68HCS12_MACH 0x20 /* 68HCS12 microcontroller. */ +#define EF_M68HC11_MACH(mach) ((mach) & EF_M68HC11_MACH_MASK) + +/* True if we can merge machines. A generic HC12 can work on any proc + but once we have specific code, merge is not possible. */ +#define EF_M68HC11_CAN_MERGE_MACH(mach1, mach2) \ + ((EF_M68HC11_MACH (mach1) == EF_M68HC11_MACH (mach2)) \ + || (EF_M68HC11_MACH (mach1) == EF_M68HC11_GENERIC) \ + || (EF_M68HC11_MACH (mach2) == EF_M68HC11_GENERIC)) + +#define EF_M68HC11_MERGE_MACH(mach1, mach2) \ + (((EF_M68HC11_MACH (mach1) == EF_M68HC11_MACH (mach2)) \ + || (EF_M68HC11_MACH (mach1) == EF_M68HC11_GENERIC)) ? \ + EF_M68HC11_MACH (mach2) : EF_M68HC11_MACH (mach1)) + + +/* Special values for the st_other field in the symbol table. These + are used for 68HC12 to identify far functions (must be called with + 'call' and returns with 'rtc'). */ +#define STO_M68HC12_FAR 0x80 + +/* Identify interrupt handlers. This is used by the debugger to + correctly compute the stack frame. */ +#define STO_M68HC12_INTERRUPT 0x40 + +#endif diff --git a/include/elf/m68k.h b/include/elf/m68k.h new file mode 100644 index 0000000..f6f37cc --- /dev/null +++ b/include/elf/m68k.h @@ -0,0 +1,102 @@ +/* MC68k ELF support for BFD. + Copyright 1998, 1999, 2000, 2002, 2005, 2006, 2007, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_M68K_H +#define _ELF_M68K_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_m68k_reloc_type) + RELOC_NUMBER (R_68K_NONE, 0) /* No reloc */ + RELOC_NUMBER (R_68K_32, 1) /* Direct 32 bit */ + RELOC_NUMBER (R_68K_16, 2) /* Direct 16 bit */ + RELOC_NUMBER (R_68K_8, 3) /* Direct 8 bit */ + RELOC_NUMBER (R_68K_PC32, 4) /* PC relative 32 bit */ + RELOC_NUMBER (R_68K_PC16, 5) /* PC relative 16 bit */ + RELOC_NUMBER (R_68K_PC8, 6) /* PC relative 8 bit */ + RELOC_NUMBER (R_68K_GOT32, 7) /* 32 bit PC relative GOT entry */ + RELOC_NUMBER (R_68K_GOT16, 8) /* 16 bit PC relative GOT entry */ + RELOC_NUMBER (R_68K_GOT8, 9) /* 8 bit PC relative GOT entry */ + RELOC_NUMBER (R_68K_GOT32O, 10) /* 32 bit GOT offset */ + RELOC_NUMBER (R_68K_GOT16O, 11) /* 16 bit GOT offset */ + RELOC_NUMBER (R_68K_GOT8O, 12) /* 8 bit GOT offset */ + RELOC_NUMBER (R_68K_PLT32, 13) /* 32 bit PC relative PLT address */ + RELOC_NUMBER (R_68K_PLT16, 14) /* 16 bit PC relative PLT address */ + RELOC_NUMBER (R_68K_PLT8, 15) /* 8 bit PC relative PLT address */ + RELOC_NUMBER (R_68K_PLT32O, 16) /* 32 bit PLT offset */ + RELOC_NUMBER (R_68K_PLT16O, 17) /* 16 bit PLT offset */ + RELOC_NUMBER (R_68K_PLT8O, 18) /* 8 bit PLT offset */ + RELOC_NUMBER (R_68K_COPY, 19) /* Copy symbol at runtime */ + RELOC_NUMBER (R_68K_GLOB_DAT, 20) /* Create GOT entry */ + RELOC_NUMBER (R_68K_JMP_SLOT, 21) /* Create PLT entry */ + RELOC_NUMBER (R_68K_RELATIVE, 22) /* Adjust by program base */ + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_68K_GNU_VTINHERIT, 23) + RELOC_NUMBER (R_68K_GNU_VTENTRY, 24) + /* TLS static relocations. */ + RELOC_NUMBER (R_68K_TLS_GD32, 25) + RELOC_NUMBER (R_68K_TLS_GD16, 26) + RELOC_NUMBER (R_68K_TLS_GD8, 27) + RELOC_NUMBER (R_68K_TLS_LDM32, 28) + RELOC_NUMBER (R_68K_TLS_LDM16, 29) + RELOC_NUMBER (R_68K_TLS_LDM8, 30) + RELOC_NUMBER (R_68K_TLS_LDO32, 31) + RELOC_NUMBER (R_68K_TLS_LDO16, 32) + RELOC_NUMBER (R_68K_TLS_LDO8, 33) + RELOC_NUMBER (R_68K_TLS_IE32, 34) + RELOC_NUMBER (R_68K_TLS_IE16, 35) + RELOC_NUMBER (R_68K_TLS_IE8, 36) + RELOC_NUMBER (R_68K_TLS_LE32, 37) + RELOC_NUMBER (R_68K_TLS_LE16, 38) + RELOC_NUMBER (R_68K_TLS_LE8, 39) + RELOC_NUMBER (R_68K_TLS_DTPMOD32, 40) + RELOC_NUMBER (R_68K_TLS_DTPREL32, 41) + RELOC_NUMBER (R_68K_TLS_TPREL32, 42) +END_RELOC_NUMBERS (R_68K_max) + +/* We use the top 24 bits to encode information about the + architecture variant. */ +#define EF_M68K_CPU32 0x00810000 +#define EF_M68K_M68000 0x01000000 +#define EF_M68K_CFV4E 0x00008000 +#define EF_M68K_FIDO 0x02000000 +#define EF_M68K_ARCH_MASK \ + (EF_M68K_M68000 | EF_M68K_CPU32 | EF_M68K_CFV4E | EF_M68K_FIDO) + +/* We use the bottom 8 bits to encode information about the + coldfire variant. If we use any of these bits, the top 24 bits are + either 0 or EF_M68K_CFV4E. */ +#define EF_M68K_CF_ISA_MASK 0x0F /* Which ISA */ +#define EF_M68K_CF_ISA_A_NODIV 0x01 /* ISA A except for div */ +#define EF_M68K_CF_ISA_A 0x02 +#define EF_M68K_CF_ISA_A_PLUS 0x03 +#define EF_M68K_CF_ISA_B_NOUSP 0x04 /* ISA_B except for USP */ +#define EF_M68K_CF_ISA_B 0x05 +#define EF_M68K_CF_ISA_C 0x06 +#define EF_M68K_CF_ISA_C_NODIV 0x07 /* ISA C except for div */ +#define EF_M68K_CF_MAC_MASK 0x30 +#define EF_M68K_CF_MAC 0x10 /* MAC */ +#define EF_M68K_CF_EMAC 0x20 /* EMAC */ +#define EF_M68K_CF_EMAC_B 0x30 /* EMAC_B */ +#define EF_M68K_CF_FLOAT 0x40 /* Has float insns */ +#define EF_M68K_CF_MASK 0xFF + +#endif diff --git a/include/elf/mcore.h b/include/elf/mcore.h new file mode 100644 index 0000000..2745fee --- /dev/null +++ b/include/elf/mcore.h @@ -0,0 +1,47 @@ +/* Motorola MCore support for BFD. + Copyright 1995, 1999, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MCore ELF ABI. */ +#ifndef _ELF_MORE_H +#define _ELF_MORE_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_mcore_reloc_type) + RELOC_NUMBER (R_MCORE_NONE, 0) + RELOC_NUMBER (R_MCORE_ADDR32, 1) + RELOC_NUMBER (R_MCORE_PCRELIMM8BY4, 2) + RELOC_NUMBER (R_MCORE_PCRELIMM11BY2, 3) + RELOC_NUMBER (R_MCORE_PCRELIMM4BY2, 4) + RELOC_NUMBER (R_MCORE_PCREL32, 5) + RELOC_NUMBER (R_MCORE_PCRELJSR_IMM11BY2, 6) + RELOC_NUMBER (R_MCORE_GNU_VTINHERIT, 7) + RELOC_NUMBER (R_MCORE_GNU_VTENTRY, 8) + RELOC_NUMBER (R_MCORE_RELATIVE, 9) + RELOC_NUMBER (R_MCORE_COPY, 10) + RELOC_NUMBER (R_MCORE_GLOB_DAT, 11) + RELOC_NUMBER (R_MCORE_JUMP_SLOT, 12) +END_RELOC_NUMBERS (R_MCORE_max) + +/* Section Attributes. */ +#define SHF_MCORE_NOREAD 0x80000000 + +#endif /* _ELF_MCORE_H */ diff --git a/include/elf/mep.h b/include/elf/mep.h new file mode 100644 index 0000000..b0e42ad --- /dev/null +++ b/include/elf/mep.h @@ -0,0 +1,95 @@ +/* Toshiba MeP ELF support for BFD. + Copyright (C) 2001, 2004, 2005, 2007, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_MEP_H +#define _ELF_MEP_H + +/* Bits in the sh_flags field of Elf32_Shdr: */ + +#define SHF_MEP_VLIW 0x10000000 /* contains vliw code */ + +/* This bit is reserved by BFD for processor specific stuff. Name + it properly so that we can easily stay consistent elsewhere. */ +#define SEC_MEP_VLIW SEC_TIC54X_BLOCK + +#include "elf/reloc-macros.h" + +/* Note: The comments in this file are used by bfd/mep-relocs.pl to + build parts of bfd/elf32-mep.c. */ + +/* Relocations. */ +START_RELOC_NUMBERS (elf_mep_reloc_type) + + /* These two must appear first so that they are not processed by bfd/mep-relocs.pl. */ + RELOC_NUMBER (R_MEP_NONE, 0) + RELOC_NUMBER (R_RELC, 1) + + RELOC_NUMBER (R_MEP_8, 2) /* 7654 3210 U */ + RELOC_NUMBER (R_MEP_16, 3) /* fedc ba98 7654 3210 U */ + RELOC_NUMBER (R_MEP_32, 4) /* vuts rqpo nmlk jihg fedc ba98 7654 3210 U */ + + RELOC_NUMBER (R_MEP_PCREL8A2, 5) /* ---- ---- 7654 321- S PC-REL */ + RELOC_NUMBER (R_MEP_PCREL12A2, 6) /* ---- ba98 7654 321- S PC-REL */ + RELOC_NUMBER (R_MEP_PCREL17A2, 7) /* ---- ---- ---- ---- gfed cba9 8765 4321 S PC-REL */ + RELOC_NUMBER (R_MEP_PCREL24A2, 8) /* ---- -765 4321 ---- nmlk jihg fedc ba98 S PC-REL */ + RELOC_NUMBER (R_MEP_PCABS24A2, 9) /* ---- -765 4321 ---- nmlk jihg fedc ba98 U */ + + RELOC_NUMBER (R_MEP_LOW16, 10) /* ---- ---- ---- ---- fedc ba98 7654 3210 U no-overflow */ + RELOC_NUMBER (R_MEP_HI16U, 11) /* ---- ---- ---- ---- vuts rqpo nmlk jihg U no-overflow */ + RELOC_NUMBER (R_MEP_HI16S, 12) /* ---- ---- ---- ---- vuts rqpo nmlk jihg S no-overflow */ + RELOC_NUMBER (R_MEP_GPREL, 13) /* ---- ---- ---- ---- fedc ba98 7654 3210 S GP-REL*/ + RELOC_NUMBER (R_MEP_TPREL, 14) /* ---- ---- ---- ---- fedc ba98 7654 3210 S TP-REL*/ + + RELOC_NUMBER (R_MEP_TPREL7, 15) /* ---- ---- -654 3210 U TP-REL */ + RELOC_NUMBER (R_MEP_TPREL7A2, 16) /* ---- ---- -654 321- U TP-REL */ + RELOC_NUMBER (R_MEP_TPREL7A4, 17) /* ---- ---- -654 32-- U TP-REL */ + + RELOC_NUMBER (R_MEP_UIMM24, 18) /* ---- ---- 7654 3210 nmlk jihg fedc ba98 U */ + RELOC_NUMBER (R_MEP_ADDR24A4, 19) /* ---- ---- 7654 32-- nmlk jihg fedc ba98 U */ + + RELOC_NUMBER (R_MEP_GNU_VTINHERIT, 20) /* ---- ---- ---- ---- U no-overflow */ + RELOC_NUMBER (R_MEP_GNU_VTENTRY, 21) /* ---- ---- ---- ---- U no-overflow */ + +END_RELOC_NUMBERS(R_MEP_max) + +#define EF_MEP_CPU_MASK 0xff000000 /* specific cpu bits */ +#define EF_MEP_CPU_MEP 0x00000000 /* generic MEP */ +#define EF_MEP_CPU_C2 0x01000000 /* MEP c2 */ +#define EF_MEP_CPU_C3 0x02000000 /* MEP c3 */ +#define EF_MEP_CPU_C4 0x04000000 /* MEP c4 */ +/* 5..7 are reseved */ +#define EF_MEP_CPU_C5 0x08000000 /* MEP c5 */ +#define EF_MEP_CPU_H1 0x10000000 /* MEP h1 */ + +#define EF_MEP_COP_MASK 0x00ff0000 +#define EF_MEP_COP_NONE 0x00000000 +#define EF_MEP_COP_AVC 0x00010000 +#define EF_MEP_COP_AVC2 0x00020000 +#define EF_MEP_COP_FMAX 0x00030000 +/* 4..5 are reserved. */ +#define EF_MEP_COP_IVC2 0x00060000 + +#define EF_MEP_LIBRARY 0x00000100 /* Built as a library */ + +#define EF_MEP_INDEX_MASK 0x000000ff /* Configuration index */ + +#define EF_MEP_ALL_FLAGS 0xffff01ff + +#endif /* _ELF_MEP_H */ diff --git a/include/elf/metag.h b/include/elf/metag.h new file mode 100644 index 0000000..7ea699d --- /dev/null +++ b/include/elf/metag.h @@ -0,0 +1,91 @@ +/* Meta ELF support for BFD. + Copyright (C) 2013 Free Software Foundation, Inc. + Contributed by Imagination Technologies Ltd. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_METAG_H +#define _ELF_METAG_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ + +START_RELOC_NUMBERS (elf_metag_reloc_type) + RELOC_NUMBER (R_METAG_HIADDR16, 0) + RELOC_NUMBER (R_METAG_LOADDR16, 1) + RELOC_NUMBER (R_METAG_ADDR32, 2) + RELOC_NUMBER (R_METAG_NONE, 3) + RELOC_NUMBER (R_METAG_RELBRANCH, 4) + RELOC_NUMBER (R_METAG_GETSETOFF, 5) + + /* Backward compatability */ + RELOC_NUMBER (R_METAG_REG32OP1, 6) + RELOC_NUMBER (R_METAG_REG32OP2, 7) + RELOC_NUMBER (R_METAG_REG32OP3, 8) + RELOC_NUMBER (R_METAG_REG16OP1, 9) + RELOC_NUMBER (R_METAG_REG16OP2, 10) + RELOC_NUMBER (R_METAG_REG16OP3, 11) + RELOC_NUMBER (R_METAG_REG32OP4, 12) + + RELOC_NUMBER (R_METAG_HIOG, 13) + RELOC_NUMBER (R_METAG_LOOG, 14) + + RELOC_NUMBER (R_METAG_REL8, 15) + RELOC_NUMBER (R_METAG_REL16, 16) + + /* GNU */ + RELOC_NUMBER (R_METAG_GNU_VTINHERIT,30) + RELOC_NUMBER (R_METAG_GNU_VTENTRY, 31) + + /* PIC relocations */ + RELOC_NUMBER (R_METAG_HI16_GOTOFF, 32) + RELOC_NUMBER (R_METAG_LO16_GOTOFF, 33) + RELOC_NUMBER (R_METAG_GETSET_GOTOFF,34) + RELOC_NUMBER (R_METAG_GETSET_GOT, 35) + RELOC_NUMBER (R_METAG_HI16_GOTPC, 36) + RELOC_NUMBER (R_METAG_LO16_GOTPC, 37) + RELOC_NUMBER (R_METAG_HI16_PLT, 38) + RELOC_NUMBER (R_METAG_LO16_PLT, 39) + RELOC_NUMBER (R_METAG_RELBRANCH_PLT,40) + RELOC_NUMBER (R_METAG_GOTOFF, 41) + RELOC_NUMBER (R_METAG_PLT, 42) + RELOC_NUMBER (R_METAG_COPY, 43) + RELOC_NUMBER (R_METAG_JMP_SLOT, 44) + RELOC_NUMBER (R_METAG_RELATIVE, 45) + RELOC_NUMBER (R_METAG_GLOB_DAT, 46) + + /* TLS relocations */ + RELOC_NUMBER (R_METAG_TLS_GD, 47) + RELOC_NUMBER (R_METAG_TLS_LDM, 48) + RELOC_NUMBER (R_METAG_TLS_LDO_HI16, 49) + RELOC_NUMBER (R_METAG_TLS_LDO_LO16, 50) + RELOC_NUMBER (R_METAG_TLS_LDO, 51) + RELOC_NUMBER (R_METAG_TLS_IE, 52) + RELOC_NUMBER (R_METAG_TLS_IENONPIC, 53) + RELOC_NUMBER (R_METAG_TLS_IENONPIC_HI16,54) + RELOC_NUMBER (R_METAG_TLS_IENONPIC_LO16,55) + RELOC_NUMBER (R_METAG_TLS_TPOFF, 56) + RELOC_NUMBER (R_METAG_TLS_DTPMOD, 57) + RELOC_NUMBER (R_METAG_TLS_DTPOFF, 58) + RELOC_NUMBER (R_METAG_TLS_LE, 59) + RELOC_NUMBER (R_METAG_TLS_LE_HI16, 60) + RELOC_NUMBER (R_METAG_TLS_LE_LO16, 61) + +END_RELOC_NUMBERS (R_METAG_MAX) + +#endif /* _ELF_METAG_H */ diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h new file mode 100644 index 0000000..c4d9821 --- /dev/null +++ b/include/elf/microblaze.h @@ -0,0 +1,71 @@ +/* Xilinx MicroBlaze support for BFD. + + Copyright 2009, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* This file holds definitions specific to the MICROBLAZE ELF ABI. */ + +#ifndef _ELF_MICROBLAZE_H +#define _ELF_MICROBLAZE_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_microblaze_reloc_type) + RELOC_NUMBER (R_MICROBLAZE_NONE, 0) + RELOC_NUMBER (R_MICROBLAZE_32, 1) + RELOC_NUMBER (R_MICROBLAZE_32_PCREL, 2) + RELOC_NUMBER (R_MICROBLAZE_64_PCREL, 3) + RELOC_NUMBER (R_MICROBLAZE_32_PCREL_LO, 4) + RELOC_NUMBER (R_MICROBLAZE_64, 5) + RELOC_NUMBER (R_MICROBLAZE_32_LO, 6) + RELOC_NUMBER (R_MICROBLAZE_SRO32, 7) + RELOC_NUMBER (R_MICROBLAZE_SRW32, 8) + RELOC_NUMBER (R_MICROBLAZE_64_NONE, 9) + RELOC_NUMBER (R_MICROBLAZE_32_SYM_OP_SYM, 10) + RELOC_NUMBER (R_MICROBLAZE_GNU_VTINHERIT, 11) + RELOC_NUMBER (R_MICROBLAZE_GNU_VTENTRY, 12) + RELOC_NUMBER (R_MICROBLAZE_GOTPC_64, 13) /* PC-relative GOT offset. */ + RELOC_NUMBER (R_MICROBLAZE_GOT_64, 14) /* GOT entry offset. */ + RELOC_NUMBER (R_MICROBLAZE_PLT_64, 15) /* PLT offset (PC-relative). */ + RELOC_NUMBER (R_MICROBLAZE_REL, 16) /* Adjust by program base. */ + RELOC_NUMBER (R_MICROBLAZE_JUMP_SLOT, 17) /* Create PLT entry. */ + RELOC_NUMBER (R_MICROBLAZE_GLOB_DAT, 18) /* Create GOT entry. */ + RELOC_NUMBER (R_MICROBLAZE_GOTOFF_64, 19) /* Offset relative to GOT. */ + RELOC_NUMBER (R_MICROBLAZE_GOTOFF_32, 20) /* Offset relative to GOT. */ + RELOC_NUMBER (R_MICROBLAZE_COPY, 21) /* Runtime copy. */ + RELOC_NUMBER (R_MICROBLAZE_TLS, 22) /* TLS Reloc */ + RELOC_NUMBER (R_MICROBLAZE_TLSGD, 23) /* TLS General Dynamic */ + RELOC_NUMBER (R_MICROBLAZE_TLSLD, 24) /* TLS Local Dynamic */ + RELOC_NUMBER (R_MICROBLAZE_TLSDTPMOD32, 25) /* TLS Module ID */ + RELOC_NUMBER (R_MICROBLAZE_TLSDTPREL32, 26) /* TLS Offset Within TLS Block */ + RELOC_NUMBER (R_MICROBLAZE_TLSDTPREL64, 27) /* TLS Offset Within TLS Block */ + RELOC_NUMBER (R_MICROBLAZE_TLSGOTTPREL32, 28) /* TLS Offset From Thread Pointer */ + RELOC_NUMBER (R_MICROBLAZE_TLSTPREL32, 29) /* TLS Offset From Thread Pointer */ + +END_RELOC_NUMBERS (R_MICROBLAZE_max) + +/* Global base address names. */ +#define RO_SDA_ANCHOR_NAME "_SDA2_BASE_" +#define RW_SDA_ANCHOR_NAME "_SDA_BASE_" + +/* Section Attributes. */ +#define SHF_MICROBLAZE_NOREAD 0x80000000 + +#endif /* _ELF_MICROBLAZE_H */ diff --git a/include/elf/mips.h b/include/elf/mips.h new file mode 100644 index 0000000..2c5a9a6 --- /dev/null +++ b/include/elf/mips.h @@ -0,0 +1,1172 @@ +/* MIPS ELF support for BFD. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2008, 2009, 2010, 2013 + Free Software Foundation, Inc. + + By Ian Lance Taylor, Cygnus Support, , from + information in the System V Application Binary Interface, MIPS + Processor Supplement. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MIPS ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_MIPS_H +#define _ELF_MIPS_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_mips_reloc_type) + RELOC_NUMBER (R_MIPS_NONE, 0) + RELOC_NUMBER (R_MIPS_16, 1) + RELOC_NUMBER (R_MIPS_32, 2) /* In Elf 64: alias R_MIPS_ADD */ + RELOC_NUMBER (R_MIPS_REL32, 3) /* In Elf 64: alias R_MIPS_REL */ + RELOC_NUMBER (R_MIPS_26, 4) + RELOC_NUMBER (R_MIPS_HI16, 5) + RELOC_NUMBER (R_MIPS_LO16, 6) + RELOC_NUMBER (R_MIPS_GPREL16, 7) /* In Elf 64: alias R_MIPS_GPREL */ + RELOC_NUMBER (R_MIPS_LITERAL, 8) + RELOC_NUMBER (R_MIPS_GOT16, 9) /* In Elf 64: alias R_MIPS_GOT */ + RELOC_NUMBER (R_MIPS_PC16, 10) + RELOC_NUMBER (R_MIPS_CALL16, 11) /* In Elf 64: alias R_MIPS_CALL */ + RELOC_NUMBER (R_MIPS_GPREL32, 12) + /* The remaining relocs are defined on Irix, although they are not + in the MIPS ELF ABI. */ + RELOC_NUMBER (R_MIPS_UNUSED1, 13) + RELOC_NUMBER (R_MIPS_UNUSED2, 14) + RELOC_NUMBER (R_MIPS_UNUSED3, 15) + RELOC_NUMBER (R_MIPS_SHIFT5, 16) + RELOC_NUMBER (R_MIPS_SHIFT6, 17) + RELOC_NUMBER (R_MIPS_64, 18) + RELOC_NUMBER (R_MIPS_GOT_DISP, 19) + RELOC_NUMBER (R_MIPS_GOT_PAGE, 20) + RELOC_NUMBER (R_MIPS_GOT_OFST, 21) + RELOC_NUMBER (R_MIPS_GOT_HI16, 22) + RELOC_NUMBER (R_MIPS_GOT_LO16, 23) + RELOC_NUMBER (R_MIPS_SUB, 24) + RELOC_NUMBER (R_MIPS_INSERT_A, 25) + RELOC_NUMBER (R_MIPS_INSERT_B, 26) + RELOC_NUMBER (R_MIPS_DELETE, 27) + RELOC_NUMBER (R_MIPS_HIGHER, 28) + RELOC_NUMBER (R_MIPS_HIGHEST, 29) + RELOC_NUMBER (R_MIPS_CALL_HI16, 30) + RELOC_NUMBER (R_MIPS_CALL_LO16, 31) + RELOC_NUMBER (R_MIPS_SCN_DISP, 32) + RELOC_NUMBER (R_MIPS_REL16, 33) + RELOC_NUMBER (R_MIPS_ADD_IMMEDIATE, 34) + RELOC_NUMBER (R_MIPS_PJUMP, 35) + RELOC_NUMBER (R_MIPS_RELGOT, 36) + RELOC_NUMBER (R_MIPS_JALR, 37) + /* TLS relocations. */ + RELOC_NUMBER (R_MIPS_TLS_DTPMOD32, 38) + RELOC_NUMBER (R_MIPS_TLS_DTPREL32, 39) + RELOC_NUMBER (R_MIPS_TLS_DTPMOD64, 40) + RELOC_NUMBER (R_MIPS_TLS_DTPREL64, 41) + RELOC_NUMBER (R_MIPS_TLS_GD, 42) + RELOC_NUMBER (R_MIPS_TLS_LDM, 43) + RELOC_NUMBER (R_MIPS_TLS_DTPREL_HI16, 44) + RELOC_NUMBER (R_MIPS_TLS_DTPREL_LO16, 45) + RELOC_NUMBER (R_MIPS_TLS_GOTTPREL, 46) + RELOC_NUMBER (R_MIPS_TLS_TPREL32, 47) + RELOC_NUMBER (R_MIPS_TLS_TPREL64, 48) + RELOC_NUMBER (R_MIPS_TLS_TPREL_HI16, 49) + RELOC_NUMBER (R_MIPS_TLS_TPREL_LO16, 50) + RELOC_NUMBER (R_MIPS_GLOB_DAT, 51) + FAKE_RELOC (R_MIPS_max, 52) + /* These relocs are used for the mips16. */ + FAKE_RELOC (R_MIPS16_min, 100) + RELOC_NUMBER (R_MIPS16_26, 100) + RELOC_NUMBER (R_MIPS16_GPREL, 101) + RELOC_NUMBER (R_MIPS16_GOT16, 102) + RELOC_NUMBER (R_MIPS16_CALL16, 103) + RELOC_NUMBER (R_MIPS16_HI16, 104) + RELOC_NUMBER (R_MIPS16_LO16, 105) + RELOC_NUMBER (R_MIPS16_TLS_GD, 106) + RELOC_NUMBER (R_MIPS16_TLS_LDM, 107) + RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108) + RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109) + RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110) + RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111) + RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112) + FAKE_RELOC (R_MIPS16_max, 113) + /* These relocations are specific to VxWorks. */ + RELOC_NUMBER (R_MIPS_COPY, 126) + RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127) + + /* These relocations are specific to microMIPS. */ + FAKE_RELOC (R_MICROMIPS_min, 130) + RELOC_NUMBER (R_MICROMIPS_26_S1, 133) + RELOC_NUMBER (R_MICROMIPS_HI16, 134) + RELOC_NUMBER (R_MICROMIPS_LO16, 135) + RELOC_NUMBER (R_MICROMIPS_GPREL16, 136) /* In Elf 64: + alias R_MICROMIPS_GPREL */ + RELOC_NUMBER (R_MICROMIPS_LITERAL, 137) + RELOC_NUMBER (R_MICROMIPS_GOT16, 138) /* In Elf 64: + alias R_MICROMIPS_GOT */ + RELOC_NUMBER (R_MICROMIPS_PC7_S1, 139) + RELOC_NUMBER (R_MICROMIPS_PC10_S1, 140) + RELOC_NUMBER (R_MICROMIPS_PC16_S1, 141) + RELOC_NUMBER (R_MICROMIPS_CALL16, 142) /* In Elf 64: + alias R_MICROMIPS_CALL */ + RELOC_NUMBER (R_MICROMIPS_GOT_DISP, 145) + RELOC_NUMBER (R_MICROMIPS_GOT_PAGE, 146) + RELOC_NUMBER (R_MICROMIPS_GOT_OFST, 147) + RELOC_NUMBER (R_MICROMIPS_GOT_HI16, 148) + RELOC_NUMBER (R_MICROMIPS_GOT_LO16, 149) + RELOC_NUMBER (R_MICROMIPS_SUB, 150) + RELOC_NUMBER (R_MICROMIPS_HIGHER, 151) + RELOC_NUMBER (R_MICROMIPS_HIGHEST, 152) + RELOC_NUMBER (R_MICROMIPS_CALL_HI16, 153) + RELOC_NUMBER (R_MICROMIPS_CALL_LO16, 154) + RELOC_NUMBER (R_MICROMIPS_SCN_DISP, 155) + RELOC_NUMBER (R_MICROMIPS_JALR, 156) + RELOC_NUMBER (R_MICROMIPS_HI0_LO16, 157) + /* TLS relocations. */ + RELOC_NUMBER (R_MICROMIPS_TLS_GD, 162) + RELOC_NUMBER (R_MICROMIPS_TLS_LDM, 163) + RELOC_NUMBER (R_MICROMIPS_TLS_DTPREL_HI16, 164) + RELOC_NUMBER (R_MICROMIPS_TLS_DTPREL_LO16, 165) + RELOC_NUMBER (R_MICROMIPS_TLS_GOTTPREL, 166) + RELOC_NUMBER (R_MICROMIPS_TLS_TPREL_HI16, 169) + RELOC_NUMBER (R_MICROMIPS_TLS_TPREL_LO16, 170) + /* microMIPS GP- and PC-relative relocations. */ + RELOC_NUMBER (R_MICROMIPS_GPREL7_S2, 172) + RELOC_NUMBER (R_MICROMIPS_PC23_S2, 173) + FAKE_RELOC (R_MICROMIPS_max, 174) + + /* This was a GNU extension used by embedded-PIC. It was co-opted by + mips-linux for exception-handling data. GCC stopped using it in + May, 2004, then started using it again for compact unwind tables. */ + RELOC_NUMBER (R_MIPS_PC32, 248) + RELOC_NUMBER (R_MIPS_EH, 249) + /* FIXME: this relocation is used internally by gas. */ + RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250) + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253) + RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254) +END_RELOC_NUMBERS (R_MIPS_maxext) + +/* Processor specific flags for the ELF header e_flags field. */ + +/* At least one .noreorder directive appears in the source. */ +#define EF_MIPS_NOREORDER 0x00000001 + +/* File contains position independent code. */ +#define EF_MIPS_PIC 0x00000002 + +/* Code in file uses the standard calling sequence for calling + position independent code. */ +#define EF_MIPS_CPIC 0x00000004 + +/* ??? Unknown flag, set in IRIX 6's BSDdup2.o in libbsd.a. */ +#define EF_MIPS_XGOT 0x00000008 + +/* Code in file uses UCODE (obsolete) */ +#define EF_MIPS_UCODE 0x00000010 + +/* Code in file uses new ABI (-n32 on Irix 6). */ +#define EF_MIPS_ABI2 0x00000020 + +/* Process the .MIPS.options section first by ld */ +#define EF_MIPS_OPTIONS_FIRST 0x00000080 + +/* Indicates code compiled for a 64-bit machine in 32-bit mode + (regs are 32-bits wide). */ +#define EF_MIPS_32BITMODE 0x00000100 + +/* 32-bit machine but FP registers are 64 bit (-mfp64). */ +#define EF_MIPS_FP64 0x00000200 + +/* Code in file uses the IEEE 754-2008 NaN encoding convention. */ +#define EF_MIPS_NAN2008 0x00000400 + +/* Architectural Extensions used by this file */ +#define EF_MIPS_ARCH_ASE 0x0f000000 + +/* Use MDMX multimedia extensions */ +#define EF_MIPS_ARCH_ASE_MDMX 0x08000000 + +/* Use MIPS-16 ISA extensions */ +#define EF_MIPS_ARCH_ASE_M16 0x04000000 + +/* Use MICROMIPS ISA extensions. */ +#define EF_MIPS_ARCH_ASE_MICROMIPS 0x02000000 + +/* Four bit MIPS architecture field. */ +#define EF_MIPS_ARCH 0xf0000000 + +/* -mips1 code. */ +#define E_MIPS_ARCH_1 0x00000000 + +/* -mips2 code. */ +#define E_MIPS_ARCH_2 0x10000000 + +/* -mips3 code. */ +#define E_MIPS_ARCH_3 0x20000000 + +/* -mips4 code. */ +#define E_MIPS_ARCH_4 0x30000000 + +/* -mips5 code. */ +#define E_MIPS_ARCH_5 0x40000000 + +/* -mips32 code. */ +#define E_MIPS_ARCH_32 0x50000000 + +/* -mips64 code. */ +#define E_MIPS_ARCH_64 0x60000000 + +/* -mips32r2 code. */ +#define E_MIPS_ARCH_32R2 0x70000000 + +/* -mips64r2 code. */ +#define E_MIPS_ARCH_64R2 0x80000000 + +/* The ABI of the file. Also see EF_MIPS_ABI2 above. */ +#define EF_MIPS_ABI 0x0000F000 + +/* The original o32 abi. */ +#define E_MIPS_ABI_O32 0x00001000 + +/* O32 extended to work on 64 bit architectures */ +#define E_MIPS_ABI_O64 0x00002000 + +/* EABI in 32 bit mode */ +#define E_MIPS_ABI_EABI32 0x00003000 + +/* EABI in 64 bit mode */ +#define E_MIPS_ABI_EABI64 0x00004000 + + +/* Machine variant if we know it. This field was invented at Cygnus, + but it is hoped that other vendors will adopt it. If some standard + is developed, this code should be changed to follow it. */ + +#define EF_MIPS_MACH 0x00FF0000 + +/* Cygnus is choosing values between 80 and 9F; + 00 - 7F should be left for a future standard; + the rest are open. */ + +#define E_MIPS_MACH_3900 0x00810000 +#define E_MIPS_MACH_4010 0x00820000 +#define E_MIPS_MACH_4100 0x00830000 +#define E_MIPS_MACH_4650 0x00850000 +#define E_MIPS_MACH_4120 0x00870000 +#define E_MIPS_MACH_4111 0x00880000 +#define E_MIPS_MACH_SB1 0x008a0000 +#define E_MIPS_MACH_OCTEON 0x008b0000 +#define E_MIPS_MACH_XLR 0x008c0000 +#define E_MIPS_MACH_OCTEON2 0x008d0000 +#define E_MIPS_MACH_5400 0x00910000 +#define E_MIPS_MACH_5900 0x00920000 +#define E_MIPS_MACH_5500 0x00980000 +#define E_MIPS_MACH_9000 0x00990000 +#define E_MIPS_MACH_LS2E 0x00A00000 +#define E_MIPS_MACH_LS2F 0x00A10000 +#define E_MIPS_MACH_LS3A 0x00A20000 + +/* Processor specific section indices. These sections do not actually + exist. Symbols with a st_shndx field corresponding to one of these + values have a special meaning. */ + +/* Defined and allocated common symbol. Value is virtual address. If + relocated, alignment must be preserved. */ +#define SHN_MIPS_ACOMMON SHN_LORESERVE + +/* Defined and allocated text symbol. Value is virtual address. + Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables. */ +#define SHN_MIPS_TEXT (SHN_LORESERVE + 1) + +/* Defined and allocated data symbol. Value is virtual address. + Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables. */ +#define SHN_MIPS_DATA (SHN_LORESERVE + 2) + +/* Small common symbol. */ +#define SHN_MIPS_SCOMMON (SHN_LORESERVE + 3) + +/* Small undefined symbol. */ +#define SHN_MIPS_SUNDEFINED (SHN_LORESERVE + 4) + +/* Processor specific section types. */ + +/* Section contains the set of dynamic shared objects used when + statically linking. */ +#define SHT_MIPS_LIBLIST 0x70000000 + +/* I'm not sure what this is, but it's used on Irix 5. */ +#define SHT_MIPS_MSYM 0x70000001 + +/* Section contains list of symbols whose definitions conflict with + symbols defined in shared objects. */ +#define SHT_MIPS_CONFLICT 0x70000002 + +/* Section contains the global pointer table. */ +#define SHT_MIPS_GPTAB 0x70000003 + +/* Section contains microcode information. The exact format is + unspecified. */ +#define SHT_MIPS_UCODE 0x70000004 + +/* Section contains some sort of debugging information. The exact + format is unspecified. It's probably ECOFF symbols. */ +#define SHT_MIPS_DEBUG 0x70000005 + +/* Section contains register usage information. */ +#define SHT_MIPS_REGINFO 0x70000006 + +/* ??? */ +#define SHT_MIPS_PACKAGE 0x70000007 + +/* ??? */ +#define SHT_MIPS_PACKSYM 0x70000008 + +/* ??? */ +#define SHT_MIPS_RELD 0x70000009 + +/* Section contains interface information. */ +#define SHT_MIPS_IFACE 0x7000000b + +/* Section contains description of contents of another section. */ +#define SHT_MIPS_CONTENT 0x7000000c + +/* Section contains miscellaneous options. */ +#define SHT_MIPS_OPTIONS 0x7000000d + +/* ??? */ +#define SHT_MIPS_SHDR 0x70000010 + +/* ??? */ +#define SHT_MIPS_FDESC 0x70000011 + +/* ??? */ +#define SHT_MIPS_EXTSYM 0x70000012 + +/* ??? */ +#define SHT_MIPS_DENSE 0x70000013 + +/* ??? */ +#define SHT_MIPS_PDESC 0x70000014 + +/* ??? */ +#define SHT_MIPS_LOCSYM 0x70000015 + +/* ??? */ +#define SHT_MIPS_AUXSYM 0x70000016 + +/* ??? */ +#define SHT_MIPS_OPTSYM 0x70000017 + +/* ??? */ +#define SHT_MIPS_LOCSTR 0x70000018 + +/* ??? */ +#define SHT_MIPS_LINE 0x70000019 + +/* ??? */ +#define SHT_MIPS_RFDESC 0x7000001a + +/* Delta C++: symbol table */ +#define SHT_MIPS_DELTASYM 0x7000001b + +/* Delta C++: instance table */ +#define SHT_MIPS_DELTAINST 0x7000001c + +/* Delta C++: class table */ +#define SHT_MIPS_DELTACLASS 0x7000001d + +/* DWARF debugging section. */ +#define SHT_MIPS_DWARF 0x7000001e + +/* Delta C++: declarations */ +#define SHT_MIPS_DELTADECL 0x7000001f + +/* List of libraries the binary depends on. Includes a time stamp, version + number. */ +#define SHT_MIPS_SYMBOL_LIB 0x70000020 + +/* Events section. */ +#define SHT_MIPS_EVENTS 0x70000021 + +/* ??? */ +#define SHT_MIPS_TRANSLATE 0x70000022 + +/* Special pixie sections */ +#define SHT_MIPS_PIXIE 0x70000023 + +/* Address translation table (for debug info) */ +#define SHT_MIPS_XLATE 0x70000024 + +/* SGI internal address translation table (for debug info) */ +#define SHT_MIPS_XLATE_DEBUG 0x70000025 + +/* Intermediate code */ +#define SHT_MIPS_WHIRL 0x70000026 + +/* C++ exception handling region info */ +#define SHT_MIPS_EH_REGION 0x70000027 + +/* Obsolete address translation table (for debug info) */ +#define SHT_MIPS_XLATE_OLD 0x70000028 + +/* Runtime procedure descriptor table exception information (ucode) ??? */ +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + + +/* A section of type SHT_MIPS_LIBLIST contains an array of the + following structure. The sh_link field is the section index of the + string table. The sh_info field is the number of entries in the + section. */ +typedef struct +{ + /* String table index for name of shared object. */ + unsigned long l_name; + /* Time stamp. */ + unsigned long l_time_stamp; + /* Checksum of symbol names and common sizes. */ + unsigned long l_checksum; + /* String table index for version. */ + unsigned long l_version; + /* Flags. */ + unsigned long l_flags; +} Elf32_Lib; + +/* The external version of Elf32_Lib. */ +typedef struct +{ + unsigned char l_name[4]; + unsigned char l_time_stamp[4]; + unsigned char l_checksum[4]; + unsigned char l_version[4]; + unsigned char l_flags[4]; +} Elf32_External_Lib; + +/* The l_flags field of an Elf32_Lib structure may contain the + following flags. */ + +/* Require an exact match at runtime. */ +#define LL_EXACT_MATCH 0x00000001 + +/* Ignore version incompatibilities at runtime. */ +#define LL_IGNORE_INT_VER 0x00000002 + +/* Require matching minor version number. */ +#define LL_REQUIRE_MINOR 0x00000004 + +/* ??? */ +#define LL_EXPORTS 0x00000008 + +/* Delay loading of this library until really needed. */ +#define LL_DELAY_LOAD 0x00000010 + +/* ??? Delta C++ stuff ??? */ +#define LL_DELTA 0x00000020 + + +/* A section of type SHT_MIPS_CONFLICT is an array of indices into the + .dynsym section. Each element has the following type. */ +typedef unsigned long Elf32_Conflict; +typedef unsigned char Elf32_External_Conflict[4]; + +typedef unsigned long Elf64_Conflict; +typedef unsigned char Elf64_External_Conflict[8]; + +/* A section of type SHT_MIPS_GPTAB contains information about how + much GP space would be required for different -G arguments. This + information is only used so that the linker can provide informative + suggestions as to the best -G value to use. The sh_info field is + the index of the section for which this information applies. The + contents of the section are an array of the following union. The + first element uses the gt_header field. The remaining elements use + the gt_entry field. */ +typedef union +{ + struct + { + /* -G value actually used for this object file. */ + unsigned long gt_current_g_value; + /* Unused. */ + unsigned long gt_unused; + } gt_header; + struct + { + /* If this -G argument has been used... */ + unsigned long gt_g_value; + /* ...this many GP section bytes would be required. */ + unsigned long gt_bytes; + } gt_entry; +} Elf32_gptab; + +/* The external version of Elf32_gptab. */ + +typedef union +{ + struct + { + unsigned char gt_current_g_value[4]; + unsigned char gt_unused[4]; + } gt_header; + struct + { + unsigned char gt_g_value[4]; + unsigned char gt_bytes[4]; + } gt_entry; +} Elf32_External_gptab; + +/* A section of type SHT_MIPS_REGINFO contains the following + structure. */ +typedef struct +{ + /* Mask of general purpose registers used. */ + unsigned long ri_gprmask; + /* Mask of co-processor registers used. */ + unsigned long ri_cprmask[4]; + /* GP register value for this object file. */ + long ri_gp_value; +} Elf32_RegInfo; + +/* The external version of the Elf_RegInfo structure. */ +typedef struct +{ + unsigned char ri_gprmask[4]; + unsigned char ri_cprmask[4][4]; + unsigned char ri_gp_value[4]; +} Elf32_External_RegInfo; + +/* MIPS ELF .reginfo swapping routines. */ +extern void bfd_mips_elf32_swap_reginfo_in + (bfd *, const Elf32_External_RegInfo *, Elf32_RegInfo *); +extern void bfd_mips_elf32_swap_reginfo_out + (bfd *, const Elf32_RegInfo *, Elf32_External_RegInfo *); + +/* Processor specific section flags. */ + +/* This section must be in the global data area. */ +#define SHF_MIPS_GPREL 0x10000000 + +/* This section should be merged. */ +#define SHF_MIPS_MERGE 0x20000000 + +/* This section contains address data of size implied by section + element size. */ +#define SHF_MIPS_ADDR 0x40000000 + +/* This section contains string data. */ +#define SHF_MIPS_STRING 0x80000000 + +/* This section may not be stripped. */ +#define SHF_MIPS_NOSTRIP 0x08000000 + +/* This section is local to threads. */ +#define SHF_MIPS_LOCAL 0x04000000 + +/* Linker should generate implicit weak names for this section. */ +#define SHF_MIPS_NAMES 0x02000000 + +/* Section contais text/data which may be replicated in other sections. + Linker should retain only one copy. */ +#define SHF_MIPS_NODUPES 0x01000000 + +/* Processor specific program header types. */ + +/* Register usage information. Identifies one .reginfo section. */ +#define PT_MIPS_REGINFO 0x70000000 + +/* Runtime procedure table. */ +#define PT_MIPS_RTPROC 0x70000001 + +/* .MIPS.options section. */ +#define PT_MIPS_OPTIONS 0x70000002 + +/* Processor specific dynamic array tags. */ + +/* 32 bit version number for runtime linker interface. */ +#define DT_MIPS_RLD_VERSION 0x70000001 + +/* Time stamp. */ +#define DT_MIPS_TIME_STAMP 0x70000002 + +/* Checksum of external strings and common sizes. */ +#define DT_MIPS_ICHECKSUM 0x70000003 + +/* Index of version string in string table. */ +#define DT_MIPS_IVERSION 0x70000004 + +/* 32 bits of flags. */ +#define DT_MIPS_FLAGS 0x70000005 + +/* Base address of the segment. */ +#define DT_MIPS_BASE_ADDRESS 0x70000006 + +/* ??? */ +#define DT_MIPS_MSYM 0x70000007 + +/* Address of .conflict section. */ +#define DT_MIPS_CONFLICT 0x70000008 + +/* Address of .liblist section. */ +#define DT_MIPS_LIBLIST 0x70000009 + +/* Number of local global offset table entries. */ +#define DT_MIPS_LOCAL_GOTNO 0x7000000a + +/* Number of entries in the .conflict section. */ +#define DT_MIPS_CONFLICTNO 0x7000000b + +/* Number of entries in the .liblist section. */ +#define DT_MIPS_LIBLISTNO 0x70000010 + +/* Number of entries in the .dynsym section. */ +#define DT_MIPS_SYMTABNO 0x70000011 + +/* Index of first external dynamic symbol not referenced locally. */ +#define DT_MIPS_UNREFEXTNO 0x70000012 + +/* Index of first dynamic symbol in global offset table. */ +#define DT_MIPS_GOTSYM 0x70000013 + +/* Number of page table entries in global offset table. */ +#define DT_MIPS_HIPAGENO 0x70000014 + +/* Address of run time loader map, used for debugging. */ +#define DT_MIPS_RLD_MAP 0x70000016 + +/* Delta C++ class definition. */ +#define DT_MIPS_DELTA_CLASS 0x70000017 + +/* Number of entries in DT_MIPS_DELTA_CLASS. */ +#define DT_MIPS_DELTA_CLASS_NO 0x70000018 + +/* Delta C++ class instances. */ +#define DT_MIPS_DELTA_INSTANCE 0x70000019 + +/* Number of entries in DT_MIPS_DELTA_INSTANCE. */ +#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a + +/* Delta relocations. */ +#define DT_MIPS_DELTA_RELOC 0x7000001b + +/* Number of entries in DT_MIPS_DELTA_RELOC. */ +#define DT_MIPS_DELTA_RELOC_NO 0x7000001c + +/* Delta symbols that Delta relocations refer to. */ +#define DT_MIPS_DELTA_SYM 0x7000001d + +/* Number of entries in DT_MIPS_DELTA_SYM. */ +#define DT_MIPS_DELTA_SYM_NO 0x7000001e + +/* Delta symbols that hold class declarations. */ +#define DT_MIPS_DELTA_CLASSSYM 0x70000020 + +/* Number of entries in DT_MIPS_DELTA_CLASSSYM. */ +#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 + +/* Flags indicating information about C++ flavor. */ +#define DT_MIPS_CXX_FLAGS 0x70000022 + +/* Pixie information (???). */ +#define DT_MIPS_PIXIE_INIT 0x70000023 + +/* Address of .MIPS.symlib */ +#define DT_MIPS_SYMBOL_LIB 0x70000024 + +/* The GOT index of the first PTE for a segment */ +#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 + +/* The GOT index of the first PTE for a local symbol */ +#define DT_MIPS_LOCAL_GOTIDX 0x70000026 + +/* The GOT index of the first PTE for a hidden symbol */ +#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 + +/* The GOT index of the first PTE for a protected symbol */ +#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 + +/* Address of `.MIPS.options'. */ +#define DT_MIPS_OPTIONS 0x70000029 + +/* Address of `.interface'. */ +#define DT_MIPS_INTERFACE 0x7000002a + +/* ??? */ +#define DT_MIPS_DYNSTR_ALIGN 0x7000002b + +/* Size of the .interface section. */ +#define DT_MIPS_INTERFACE_SIZE 0x7000002c + +/* Size of rld_text_resolve function stored in the GOT. */ +#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d + +/* Default suffix of DSO to be added by rld on dlopen() calls. */ +#define DT_MIPS_PERF_SUFFIX 0x7000002e + +/* Size of compact relocation section (O32). */ +#define DT_MIPS_COMPACT_SIZE 0x7000002f + +/* GP value for auxiliary GOTs. */ +#define DT_MIPS_GP_VALUE 0x70000030 + +/* Address of auxiliary .dynamic. */ +#define DT_MIPS_AUX_DYNAMIC 0x70000031 + +/* Address of the base of the PLTGOT. */ +#define DT_MIPS_PLTGOT 0x70000032 + +/* Points to the base of a writable PLT. */ +#define DT_MIPS_RWPLT 0x70000034 + +/* Flags which may appear in a DT_MIPS_FLAGS entry. */ + +/* No flags. */ +#define RHF_NONE 0x00000000 + +/* Uses shortcut pointers. */ +#define RHF_QUICKSTART 0x00000001 + +/* Hash size is not a power of two. */ +#define RHF_NOTPOT 0x00000002 + +/* Ignore LD_LIBRARY_PATH. */ +#define RHS_NO_LIBRARY_REPLACEMENT 0x00000004 + +/* DSO address may not be relocated. */ +#define RHF_NO_MOVE 0x00000008 + +/* SGI specific features. */ +#define RHF_SGI_ONLY 0x00000010 + +/* Guarantee that .init will finish executing before any non-init + code in DSO is called. */ +#define RHF_GUARANTEE_INIT 0x00000020 + +/* Contains Delta C++ code. */ +#define RHF_DELTA_C_PLUS_PLUS 0x00000040 + +/* Guarantee that .init will start executing before any non-init + code in DSO is called. */ +#define RHF_GUARANTEE_START_INIT 0x00000080 + +/* Generated by pixie. */ +#define RHF_PIXIE 0x00000100 + +/* Delay-load DSO by default. */ +#define RHF_DEFAULT_DELAY_LOAD 0x00000200 + +/* Object may be requickstarted */ +#define RHF_REQUICKSTART 0x00000400 + +/* Object has been requickstarted */ +#define RHF_REQUICKSTARTED 0x00000800 + +/* Generated by cord. */ +#define RHF_CORD 0x00001000 + +/* Object contains no unresolved undef symbols. */ +#define RHF_NO_UNRES_UNDEF 0x00002000 + +/* Symbol table is in a safe order. */ +#define RHF_RLD_ORDER_SAFE 0x00004000 + +/* Special values for the st_other field in the symbol table. These + are used in an Irix 5 dynamic symbol table. */ + +#define STO_DEFAULT STV_DEFAULT +#define STO_INTERNAL STV_INTERNAL +#define STO_HIDDEN STV_HIDDEN +#define STO_PROTECTED STV_PROTECTED + +/* Two topmost bits denote the MIPS ISA for .text symbols: + + 00 -- standard MIPS code, + + 10 -- microMIPS code, + + 11 -- MIPS16 code; requires the following two bits to be set too. + Note that one of the MIPS16 bits overlaps with STO_MIPS_PIC. See below + for details. */ +#define STO_MIPS_ISA (3 << 6) + +/* The mask spanning the rest of MIPS psABI flags. At most one is expected + to be set except for STO_MIPS16. */ +#define STO_MIPS_FLAGS (~(STO_MIPS_ISA | ELF_ST_VISIBILITY (-1))) + +/* The MIPS psABI was updated in 2008 with support for PLTs and copy + relocs. There are therefore two types of nonzero SHN_UNDEF functions: + PLT entries and traditional MIPS lazy binding stubs. We mark the former + with STO_MIPS_PLT to distinguish them from the latter. */ +#define STO_MIPS_PLT 0x8 +#define ELF_ST_IS_MIPS_PLT(other) \ + ((ELF_ST_IS_MIPS16 (other) \ + ? ((other) & (~STO_MIPS16 & STO_MIPS_FLAGS)) \ + : ((other) & STO_MIPS_FLAGS)) == STO_MIPS_PLT) +#define ELF_ST_SET_MIPS_PLT(other) \ + ((ELF_ST_IS_MIPS16 (other) \ + ? ((other) & (STO_MIPS16 | ~STO_MIPS_FLAGS)) \ + : ((other) & ~STO_MIPS_FLAGS)) | STO_MIPS_PLT) + +/* This value is used to mark PIC functions in an object that mixes + PIC and non-PIC. Note that this bit overlaps with STO_MIPS16, + although MIPS16 symbols are never considered to be MIPS_PIC. */ +#define STO_MIPS_PIC 0x20 +#define ELF_ST_IS_MIPS_PIC(other) (((other) & STO_MIPS_FLAGS) == STO_MIPS_PIC) +#define ELF_ST_SET_MIPS_PIC(other) \ + ((ELF_ST_IS_MIPS16 (other) \ + ? ((other) & ~(STO_MIPS16 | STO_MIPS_FLAGS)) \ + : ((other) & ~STO_MIPS_FLAGS)) | STO_MIPS_PIC) + +/* This value is used for a mips16 .text symbol. */ +#define STO_MIPS16 0xf0 +#define ELF_ST_IS_MIPS16(other) (((other) & STO_MIPS16) == STO_MIPS16) +#define ELF_ST_SET_MIPS16(other) ((other) | STO_MIPS16) + +/* This value is used for a microMIPS .text symbol. To distinguish from + STO_MIPS16, we set top two bits to be 10 to denote STO_MICROMIPS. The + mask is STO_MIPS_ISA. */ +#define STO_MICROMIPS (2 << 6) +#define ELF_ST_IS_MICROMIPS(other) (((other) & STO_MIPS_ISA) == STO_MICROMIPS) +#define ELF_ST_SET_MICROMIPS(other) (((other) & ~STO_MIPS_ISA) | STO_MICROMIPS) + +/* Whether code compression (either of the MIPS16 or the microMIPS ASEs) + has been indicated for a .text symbol. */ +#define ELF_ST_IS_COMPRESSED(other) \ + (ELF_ST_IS_MIPS16 (other) || ELF_ST_IS_MICROMIPS (other)) + +/* This bit is used on Irix to indicate a symbol whose definition + is optional - if, at final link time, it cannot be found, no + error message should be produced. */ +#define STO_OPTIONAL (1 << 2) +/* A macro to examine the STO_OPTIONAL bit. */ +#define ELF_MIPS_IS_OPTIONAL(other) ((other) & STO_OPTIONAL) + +/* The 64-bit MIPS ELF ABI uses an unusual reloc format. Each + relocation entry specifies up to three actual relocations, all at + the same address. The first relocation which required a symbol + uses the symbol in the r_sym field. The second relocation which + requires a symbol uses the symbol in the r_ssym field. If all + three relocations require a symbol, the third one uses a zero + value. */ + +/* An entry in a 64 bit SHT_REL section. */ + +typedef struct +{ + /* Address of relocation. */ + unsigned char r_offset[8]; + /* Symbol index. */ + unsigned char r_sym[4]; + /* Special symbol. */ + unsigned char r_ssym[1]; + /* Third relocation. */ + unsigned char r_type3[1]; + /* Second relocation. */ + unsigned char r_type2[1]; + /* First relocation. */ + unsigned char r_type[1]; +} Elf64_Mips_External_Rel; + +typedef struct +{ + /* Address of relocation. */ + bfd_vma r_offset; + /* Symbol index. */ + unsigned long r_sym; + /* Special symbol. */ + unsigned char r_ssym; + /* Third relocation. */ + unsigned char r_type3; + /* Second relocation. */ + unsigned char r_type2; + /* First relocation. */ + unsigned char r_type; +} Elf64_Mips_Internal_Rel; + +/* An entry in a 64 bit SHT_RELA section. */ + +typedef struct +{ + /* Address of relocation. */ + unsigned char r_offset[8]; + /* Symbol index. */ + unsigned char r_sym[4]; + /* Special symbol. */ + unsigned char r_ssym[1]; + /* Third relocation. */ + unsigned char r_type3[1]; + /* Second relocation. */ + unsigned char r_type2[1]; + /* First relocation. */ + unsigned char r_type[1]; + /* Addend. */ + unsigned char r_addend[8]; +} Elf64_Mips_External_Rela; + +typedef struct +{ + /* Address of relocation. */ + bfd_vma r_offset; + /* Symbol index. */ + unsigned long r_sym; + /* Special symbol. */ + unsigned char r_ssym; + /* Third relocation. */ + unsigned char r_type3; + /* Second relocation. */ + unsigned char r_type2; + /* First relocation. */ + unsigned char r_type; + /* Addend. */ + bfd_signed_vma r_addend; +} Elf64_Mips_Internal_Rela; + +/* MIPS ELF 64 relocation info access macros. */ +#define ELF64_MIPS_R_SSYM(i) (((i) >> 24) & 0xff) +#define ELF64_MIPS_R_TYPE3(i) (((i) >> 16) & 0xff) +#define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff) +#define ELF64_MIPS_R_TYPE(i) ((i) & 0xff) + +/* Values found in the r_ssym field of a relocation entry. */ + +/* No relocation. */ +#define RSS_UNDEF 0 + +/* Value of GP. */ +#define RSS_GP 1 + +/* Value of GP in object being relocated. */ +#define RSS_GP0 2 + +/* Address of location being relocated. */ +#define RSS_LOC 3 + +/* A SHT_MIPS_OPTIONS section contains a series of options, each of + which starts with this header. */ + +typedef struct +{ + /* Type of option. */ + unsigned char kind[1]; + /* Size of option descriptor, including header. */ + unsigned char size[1]; + /* Section index of affected section, or 0 for global option. */ + unsigned char section[2]; + /* Information specific to this kind of option. */ + unsigned char info[4]; +} Elf_External_Options; + +typedef struct +{ + /* Type of option. */ + unsigned char kind; + /* Size of option descriptor, including header. */ + unsigned char size; + /* Section index of affected section, or 0 for global option. */ + unsigned short section; + /* Information specific to this kind of option. */ + unsigned long info; +} Elf_Internal_Options; + +/* MIPS ELF option header swapping routines. */ +extern void bfd_mips_elf_swap_options_in + (bfd *, const Elf_External_Options *, Elf_Internal_Options *); +extern void bfd_mips_elf_swap_options_out + (bfd *, const Elf_Internal_Options *, Elf_External_Options *); + +/* Values which may appear in the kind field of an Elf_Options + structure. */ + +/* Undefined. */ +#define ODK_NULL 0 + +/* Register usage and GP value. */ +#define ODK_REGINFO 1 + +/* Exception processing information. */ +#define ODK_EXCEPTIONS 2 + +/* Section padding information. */ +#define ODK_PAD 3 + +/* Hardware workarounds performed. */ +#define ODK_HWPATCH 4 + +/* Fill value used by the linker. */ +#define ODK_FILL 5 + +/* Reserved space for desktop tools. */ +#define ODK_TAGS 6 + +/* Hardware workarounds, AND bits when merging. */ +#define ODK_HWAND 7 + +/* Hardware workarounds, OR bits when merging. */ +#define ODK_HWOR 8 + +/* GP group to use for text/data sections. */ +#define ODK_GP_GROUP 9 + +/* ID information. */ +#define ODK_IDENT 10 + +/* In the 32 bit ABI, an ODK_REGINFO option is just a Elf32_RegInfo + structure. In the 64 bit ABI, it is the following structure. The + info field of the options header is not used. */ + +typedef struct +{ + /* Mask of general purpose registers used. */ + unsigned char ri_gprmask[4]; + /* Padding. */ + unsigned char ri_pad[4]; + /* Mask of co-processor registers used. */ + unsigned char ri_cprmask[4][4]; + /* GP register value for this object file. */ + unsigned char ri_gp_value[8]; +} Elf64_External_RegInfo; + +typedef struct +{ + /* Mask of general purpose registers used. */ + unsigned long ri_gprmask; + /* Padding. */ + unsigned long ri_pad; + /* Mask of co-processor registers used. */ + unsigned long ri_cprmask[4]; + /* GP register value for this object file. */ + bfd_vma ri_gp_value; +} Elf64_Internal_RegInfo; + +typedef struct +{ + /* The hash value computed from the name of the corresponding + dynamic symbol. */ + unsigned char ms_hash_value[4]; + /* Contains both the dynamic relocation index and the symbol flags + field. The macros ELF32_MS_REL_INDEX and ELF32_MS_FLAGS are used + to access the individual values. The dynamic relocation index + identifies the first entry in the .rel.dyn section that + references the dynamic symbol corresponding to this msym entry. + If the index is 0, no dynamic relocations are associated with the + symbol. The symbol flags field is reserved for future use. */ + unsigned char ms_info[4]; +} Elf32_External_Msym; + +typedef struct +{ + /* The hash value computed from the name of the corresponding + dynamic symbol. */ + unsigned long ms_hash_value; + /* Contains both the dynamic relocation index and the symbol flags + field. The macros ELF32_MS_REL_INDEX and ELF32_MS_FLAGS are used + to access the individual values. The dynamic relocation index + identifies the first entry in the .rel.dyn section that + references the dynamic symbol corresponding to this msym entry. + If the index is 0, no dynamic relocations are associated with the + symbol. The symbol flags field is reserved for future use. */ + unsigned long ms_info; +} Elf32_Internal_Msym; + +#define ELF32_MS_REL_INDEX(i) ((i) >> 8) +#define ELF32_MS_FLAGS(i) (i) & 0xff) +#define ELF32_MS_INFO(r, f) (((r) << 8) + ((f) & 0xff)) + +/* MIPS ELF reginfo swapping routines. */ +extern void bfd_mips_elf64_swap_reginfo_in + (bfd *, const Elf64_External_RegInfo *, Elf64_Internal_RegInfo *); +extern void bfd_mips_elf64_swap_reginfo_out + (bfd *, const Elf64_Internal_RegInfo *, Elf64_External_RegInfo *); + +/* Masks for the info work of an ODK_EXCEPTIONS descriptor. */ +#define OEX_FPU_MIN 0x1f /* FPEs which must be enabled. */ +#define OEX_FPU_MAX 0x1f00 /* FPEs which may be enabled. */ +#define OEX_PAGE0 0x10000 /* Page zero must be mapped. */ +#define OEX_SMM 0x20000 /* Force sequential memory mode. */ +#define OEX_FPDBUG 0x40000 /* Force precise floating-point + exceptions (debug mode). */ +#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults. */ + +/* Masks of the FP exceptions for OEX_FPU_MIN and OEX_FPU_MAX. */ +#define OEX_FPU_INVAL 0x10 /* Invalid operation exception. */ +#define OEX_FPU_DIV0 0x08 /* Division by zero exception. */ +#define OEX_FPU_OFLO 0x04 /* Overflow exception. */ +#define OEX_FPU_UFLO 0x02 /* Underflow exception. */ +#define OEX_FPU_INEX 0x01 /* Inexact exception. */ + +/* Masks for the info word of an ODK_PAD descriptor. */ +#define OPAD_PREFIX 0x01 +#define OPAD_POSTFIX 0x02 +#define OPAD_SYMBOL 0x04 + +/* Masks for the info word of an ODK_HWPATCH descriptor. */ +#define OHW_R4KEOP 0x00000001 /* R4000 end-of-page patch. */ +#define OHW_R8KPFETCH 0x00000002 /* May need R8000 prefetch patch. */ +#define OHW_R5KEOP 0x00000004 /* R5000 end-of-page patch. */ +#define OHW_R5KCVTL 0x00000008 /* R5000 cvt.[ds].l bug + (clean == 1). */ +#define OHW_R10KLDL 0x00000010 /* Needs R10K misaligned + load patch. */ + +/* Masks for the info word of an ODK_IDENT/ODK_GP_GROUP descriptor. */ +#define OGP_GROUP 0x0000ffff /* GP group number. */ +#define OGP_SELF 0xffff0000 /* Self-contained GP groups. */ + +/* Masks for the info word of an ODK_HWAND/ODK_HWOR descriptor. */ +#define OHWA0_R4KEOP_CHECKED 0x00000001 +#define OHWA0_R4KEOP_CLEAN 0x00000002 + + +/* Object attribute tags. */ +enum +{ + /* 0-3 are generic. */ + + /* Floating-point ABI used by this object file. */ + Tag_GNU_MIPS_ABI_FP = 4, + + /* MSA ABI used by this object file. */ + Tag_GNU_MIPS_ABI_MSA = 8, +}; + +/* Object attribute values. */ +enum +{ + /* Values defined for Tag_GNU_MIPS_ABI_FP. */ + + /* Not tagged or not using any ABIs affected by the differences. */ + Val_GNU_MIPS_ABI_FP_ANY = 0, + + /* Using hard-float -mdouble-float. */ + Val_GNU_MIPS_ABI_FP_DOUBLE = 1, + + /* Using hard-float -msingle-float. */ + Val_GNU_MIPS_ABI_FP_SINGLE = 2, + + /* Using soft-float. */ + Val_GNU_MIPS_ABI_FP_SOFT = 3, + + /* Using -mips32r2 -mfp64. */ + Val_GNU_MIPS_ABI_FP_64 = 4, + + /* Values defined for Tag_GNU_MIPS_ABI_MSA. */ + + /* Not tagged or not using any ABIs affected by the differences. */ + Val_GNU_MIPS_ABI_MSA_ANY = 0, + + /* Using 128-bit MSA. */ + Val_GNU_MIPS_ABI_MSA_128 = 1, +}; + +#endif /* _ELF_MIPS_H */ diff --git a/include/elf/mmix.h b/include/elf/mmix.h new file mode 100644 index 0000000..6d15f7a --- /dev/null +++ b/include/elf/mmix.h @@ -0,0 +1,173 @@ +/* MMIX support for BFD. + Copyright 2001, 2002, 2003, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MMIX ELF ABI. */ + +#ifndef ELF_MMIX_H +#define ELF_MMIX_H + +#include "elf/reloc-macros.h" + +/* Relocations. See the reloc table in bfd/elf64-mmix.c for details. */ +START_RELOC_NUMBERS (elf_mmix_reloc_type) + RELOC_NUMBER (R_MMIX_NONE, 0) + + /* Standard absolute relocations. */ + RELOC_NUMBER (R_MMIX_8, 1) + RELOC_NUMBER (R_MMIX_16, 2) + RELOC_NUMBER (R_MMIX_24, 3) + RELOC_NUMBER (R_MMIX_32, 4) + RELOC_NUMBER (R_MMIX_64, 5) + + /* Standard relative relocations. */ + RELOC_NUMBER (R_MMIX_PC_8, 6) + RELOC_NUMBER (R_MMIX_PC_16, 7) + RELOC_NUMBER (R_MMIX_PC_24, 8) + RELOC_NUMBER (R_MMIX_PC_32, 9) + RELOC_NUMBER (R_MMIX_PC_64, 10) + + /* GNU extensions for C++ vtables. */ + RELOC_NUMBER (R_MMIX_GNU_VTINHERIT, 11) + RELOC_NUMBER (R_MMIX_GNU_VTENTRY, 12) + + /* A GETA instruction. */ + RELOC_NUMBER (R_MMIX_GETA, 13) + RELOC_NUMBER (R_MMIX_GETA_1, 14) + RELOC_NUMBER (R_MMIX_GETA_2, 15) + RELOC_NUMBER (R_MMIX_GETA_3, 16) + + /* A conditional branch instruction. */ + RELOC_NUMBER (R_MMIX_CBRANCH, 17) + RELOC_NUMBER (R_MMIX_CBRANCH_J, 18) + RELOC_NUMBER (R_MMIX_CBRANCH_1, 19) + RELOC_NUMBER (R_MMIX_CBRANCH_2, 20) + RELOC_NUMBER (R_MMIX_CBRANCH_3, 21) + + /* A PUSHJ instruction. */ + RELOC_NUMBER (R_MMIX_PUSHJ, 22) + RELOC_NUMBER (R_MMIX_PUSHJ_1, 23) + RELOC_NUMBER (R_MMIX_PUSHJ_2, 24) + RELOC_NUMBER (R_MMIX_PUSHJ_3, 25) + + /* A JMP instruction. */ + RELOC_NUMBER (R_MMIX_JMP, 26) + RELOC_NUMBER (R_MMIX_JMP_1, 27) + RELOC_NUMBER (R_MMIX_JMP_2, 28) + RELOC_NUMBER (R_MMIX_JMP_3, 29) + + /* A relative address such as in a GETA or a branch. */ + RELOC_NUMBER (R_MMIX_ADDR19, 30) + + /* A relative address such as in a JMP (only). */ + RELOC_NUMBER (R_MMIX_ADDR27, 31) + + /* A general register or a number 0..255. */ + RELOC_NUMBER (R_MMIX_REG_OR_BYTE, 32) + + /* A general register. */ + RELOC_NUMBER (R_MMIX_REG, 33) + + /* A global register and an offset, the global register (allocated at + link time) contents plus the offset made equivalent to the relocation + expression at link time. The relocation must point at the Y field of + an instruction. */ + RELOC_NUMBER (R_MMIX_BASE_PLUS_OFFSET, 34) + + /* A LOCAL assertion. */ + RELOC_NUMBER (R_MMIX_LOCAL, 35) + + /* A PUSHJ instruction, generating a stub if it does not reach. */ + RELOC_NUMBER (R_MMIX_PUSHJ_STUBBABLE, 36) +END_RELOC_NUMBERS (R_MMIX_max) + + +/* Section Attributes. */ +/* A section containing necessary information for relaxation. */ +#define SHF_MMIX_CANRELAX 0x80000000 + +/* Symbol attributes. */ +/* A symbol with this section-index is a register. */ +#define SHN_REGISTER SHN_LOPROC + +/* This section holds contents for each initialized register, at VMA + regno*8. A symbol relative to this section will be transformed to an + absolute symbol with the value corresponding to the register number at + final link time. A symbol with a value outside the inclusive range + 32*8 .. 254*8 is an error. It is highly recommended to only use an + upper bound of 253*8 or lower as specified in the (currently + unspecified) ABI. */ +#define MMIX_REG_CONTENTS_SECTION_NAME ".MMIX.reg_contents" + +/* At link time, a section by this name is created, expected to be + included in MMIX_REG_CONTENTS_SECTION_NAME in the output. */ +#define MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME \ + ".MMIX.reg_contents.linker_allocated" + +/* This is a faked section holding symbols with SHN_REGISTER. Don't + confuse it with MMIX_REG_CONTENTS_SECTION_NAME; this one has no + contents, just values. It is an error for a value in this section to + be outside the range 32..255 and it must never become an actual section + in an object file. */ +#define MMIX_REG_SECTION_NAME "*REG*" + +/* Appended with a number N=0..65535, this is a representation of the + mmixal "BSPEC N" ... "ESPEC" directive pair; the contents go into an + ELF section by name ".MMIX.spec_data.N". */ +#define MMIX_OTHER_SPEC_SECTION_PREFIX ".MMIX.spec_data." + +/* A section SECNAME is noted to start at "__.MMIX.start.SECNAME" by the + presence of this symbol. Currently only implemented for ".text" + through the symbol "__.MMIX.start..text". */ +#define MMIX_LOC_SECTION_START_SYMBOL_PREFIX "__.MMIX.start." + +/* This symbol is always a function. */ +#define MMIX_START_SYMBOL_NAME "Main" + + +/* We smuggle in a few MMO specifics here. We don't make a specific MMO + file, since we can't reasonably support MMO without ELF; we have to + include this file anyway. */ + +#define MMO_TEXT_SECTION_NAME ".text" +#define MMO_DATA_SECTION_NAME ".data" + +/* A definition for the flags we put in spec data in files. A copy of our + own of some flags to keep immune to BFD flag changes. See section.c of + 2001-07-18 for flag documentation. */ +#define MMO_SEC_ALLOC 0x001 +#define MMO_SEC_LOAD 0x002 +#define MMO_SEC_RELOC 0x004 +#define MMO_SEC_READONLY 0x010 +#define MMO_SEC_CODE 0x020 +#define MMO_SEC_DATA 0x040 +#define MMO_SEC_NEVER_LOAD 0x400 +#define MMO_SEC_IS_COMMON 0x8000 +#define MMO_SEC_DEBUGGING 0x10000 + +#ifdef BFD_ARCH_SIZE +extern bfd_boolean _bfd_mmix_before_linker_allocation + (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_mmix_after_linker_allocation + (bfd *, struct bfd_link_info *); +extern bfd_boolean _bfd_mmix_check_all_relocs + (bfd *, struct bfd_link_info *); +#endif + +#endif /* ELF_MMIX_H */ diff --git a/include/elf/mn10200.h b/include/elf/mn10200.h new file mode 100644 index 0000000..24972b6 --- /dev/null +++ b/include/elf/mn10200.h @@ -0,0 +1,40 @@ +/* MN10200 ELF support for BFD. + Copyright 1998, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MN10200 ELF ABI. */ + +#ifndef _ELF_MN10200_H +#define _ELF_MN10200_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_mn10200_reloc_type) + RELOC_NUMBER (R_MN10200_NONE, 0) + RELOC_NUMBER (R_MN10200_32, 1) + RELOC_NUMBER (R_MN10200_16, 2) + RELOC_NUMBER (R_MN10200_8, 3) + RELOC_NUMBER (R_MN10200_24, 4) + RELOC_NUMBER (R_MN10200_PCREL8, 5) + RELOC_NUMBER (R_MN10200_PCREL16, 6) + RELOC_NUMBER (R_MN10200_PCREL24, 7) +END_RELOC_NUMBERS (R_MN10200_max) + +#endif /* _ELF_MN10200_H */ diff --git a/include/elf/mn10300.h b/include/elf/mn10300.h new file mode 100644 index 0000000..529b389 --- /dev/null +++ b/include/elf/mn10300.h @@ -0,0 +1,80 @@ +/* MN10300 ELF support for BFD. + Copyright 1998, 1999, 2000, 2003, 2007 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MN10300 ELF ABI. */ + +#ifndef _ELF_MN10300_H +#define _ELF_MN10300_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_mn10300_reloc_type) + RELOC_NUMBER (R_MN10300_NONE, 0) + RELOC_NUMBER (R_MN10300_32, 1) + RELOC_NUMBER (R_MN10300_16, 2) + RELOC_NUMBER (R_MN10300_8, 3) + RELOC_NUMBER (R_MN10300_PCREL32, 4) + RELOC_NUMBER (R_MN10300_PCREL16, 5) + RELOC_NUMBER (R_MN10300_PCREL8, 6) + RELOC_NUMBER (R_MN10300_GNU_VTINHERIT, 7) + RELOC_NUMBER (R_MN10300_GNU_VTENTRY, 8) + RELOC_NUMBER (R_MN10300_24, 9) + RELOC_NUMBER (R_MN10300_GOTPC32, 10) + RELOC_NUMBER (R_MN10300_GOTPC16, 11) + RELOC_NUMBER (R_MN10300_GOTOFF32, 12) + RELOC_NUMBER (R_MN10300_GOTOFF24, 13) + RELOC_NUMBER (R_MN10300_GOTOFF16, 14) + RELOC_NUMBER (R_MN10300_PLT32, 15) + RELOC_NUMBER (R_MN10300_PLT16, 16) + RELOC_NUMBER (R_MN10300_GOT32, 17) + RELOC_NUMBER (R_MN10300_GOT24, 18) + RELOC_NUMBER (R_MN10300_GOT16, 19) + RELOC_NUMBER (R_MN10300_COPY, 20) + RELOC_NUMBER (R_MN10300_GLOB_DAT, 21) + RELOC_NUMBER (R_MN10300_JMP_SLOT, 22) + RELOC_NUMBER (R_MN10300_RELATIVE, 23) + RELOC_NUMBER (R_MN10300_TLS_GD, 24) + RELOC_NUMBER (R_MN10300_TLS_LD, 25) + RELOC_NUMBER (R_MN10300_TLS_LDO, 26) + RELOC_NUMBER (R_MN10300_TLS_GOTIE, 27) + RELOC_NUMBER (R_MN10300_TLS_IE, 28) + RELOC_NUMBER (R_MN10300_TLS_LE, 29) + RELOC_NUMBER (R_MN10300_TLS_DTPMOD, 30) + RELOC_NUMBER (R_MN10300_TLS_DTPOFF, 31) + RELOC_NUMBER (R_MN10300_TLS_TPOFF, 32) + RELOC_NUMBER (R_MN10300_SYM_DIFF, 33) + RELOC_NUMBER (R_MN10300_ALIGN, 34) +END_RELOC_NUMBERS (R_MN10300_MAX) + +/* Machine variant if we know it. This field was invented at Cygnus, + but it is hoped that other vendors will adopt it. If some standard + is developed, this code should be changed to follow it. */ + +#define EF_MN10300_MACH 0x00FF0000 + +/* Cygnus is choosing values between 80 and 9F; + 00 - 7F should be left for a future standard; + the rest are open. */ + +#define E_MN10300_MACH_MN10300 0x00810000 +#define E_MN10300_MACH_AM33 0x00820000 +#define E_MN10300_MACH_AM33_2 0x00830000 +#endif /* _ELF_MN10300_H */ diff --git a/include/elf/moxie.h b/include/elf/moxie.h new file mode 100644 index 0000000..0b3eb38 --- /dev/null +++ b/include/elf/moxie.h @@ -0,0 +1,32 @@ +/* moxie ELF support for BFD. + Copyright 2009, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_MOXIE_H +#define _ELF_MOXIE_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_moxie_reloc_type) + RELOC_NUMBER (R_MOXIE_NONE, 0) + RELOC_NUMBER (R_MOXIE_32, 1) + RELOC_NUMBER (R_MOXIE_PCREL10, 2) +END_RELOC_NUMBERS (R_MOXIE_max) + +#endif /* _ELF_MOXIE_H */ diff --git a/include/elf/msp430.h b/include/elf/msp430.h new file mode 100644 index 0000000..ac8e28c --- /dev/null +++ b/include/elf/msp430.h @@ -0,0 +1,101 @@ +/* MSP430 ELF support for BFD. + Copyright (C) 2002-2013 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_MSP430_H +#define _ELF_MSP430_H + +#include "elf/reloc-macros.h" + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_MSP430_MACH 0xff + +#define E_MSP430_MACH_MSP430x11 11 +#define E_MSP430_MACH_MSP430x11x1 110 +#define E_MSP430_MACH_MSP430x12 12 +#define E_MSP430_MACH_MSP430x13 13 +#define E_MSP430_MACH_MSP430x14 14 +#define E_MSP430_MACH_MSP430x15 15 +#define E_MSP430_MACH_MSP430x16 16 +#define E_MSP430_MACH_MSP430x20 20 +#define E_MSP430_MACH_MSP430x22 22 +#define E_MSP430_MACH_MSP430x23 23 +#define E_MSP430_MACH_MSP430x24 24 +#define E_MSP430_MACH_MSP430x26 26 +#define E_MSP430_MACH_MSP430x31 31 +#define E_MSP430_MACH_MSP430x32 32 +#define E_MSP430_MACH_MSP430x33 33 +#define E_MSP430_MACH_MSP430x41 41 +#define E_MSP430_MACH_MSP430x42 42 +#define E_MSP430_MACH_MSP430x43 43 +#define E_MSP430_MACH_MSP430x44 44 +#define E_MSP430_MACH_MSP430X 45 +#define E_MSP430_MACH_MSP430x46 46 +#define E_MSP430_MACH_MSP430x47 47 +#define E_MSP430_MACH_MSP430x54 54 + +#define SHT_MSP430_ATTRIBUTES 0x70000003 /* Section holds ABI attributes. */ +#define SHT_MSP430_SEC_FLAGS 0x7f000005 /* Holds TI compiler's section flags. */ +#define SHT_MSP430_SYM_ALIASES 0x7f000006 /* Holds TI compiler's symbol aliases. */ + +/* Tag values for an attribute section. */ +#define OFBA_MSPABI_Tag_ISA 4 +#define OFBA_MSPABI_Tag_Code_Model 6 +#define OFBA_MSPABI_Tag_Data_Model 8 + +/* Relocations. */ +START_RELOC_NUMBERS (elf_msp430_reloc_type) + RELOC_NUMBER (R_MSP430_NONE, 0) + RELOC_NUMBER (R_MSP430_32, 1) + RELOC_NUMBER (R_MSP430_10_PCREL, 2) + RELOC_NUMBER (R_MSP430_16, 3) + RELOC_NUMBER (R_MSP430_16_PCREL, 4) + RELOC_NUMBER (R_MSP430_16_BYTE, 5) + RELOC_NUMBER (R_MSP430_16_PCREL_BYTE, 6) + RELOC_NUMBER (R_MSP430_2X_PCREL, 7) + RELOC_NUMBER (R_MSP430_RL_PCREL, 8) + RELOC_NUMBER (R_MSP430_8, 9) + RELOC_NUMBER (R_MSP430_SYM_DIFF, 10) +END_RELOC_NUMBERS (R_MSP430_max) + +START_RELOC_NUMBERS (elf_msp430x_reloc_type) + RELOC_NUMBER (R_MSP430_ABS32, 1) /* aka R_MSP430_32 */ + RELOC_NUMBER (R_MSP430_ABS16, 2) /* aka R_MSP430_16 */ + RELOC_NUMBER (R_MSP430_ABS8, 3) + RELOC_NUMBER (R_MSP430_PCR16, 4) /* aka R_MSP430_16_PCREL */ + RELOC_NUMBER (R_MSP430X_PCR20_EXT_SRC, 5) + RELOC_NUMBER (R_MSP430X_PCR20_EXT_DST, 6) + RELOC_NUMBER (R_MSP430X_PCR20_EXT_ODST, 7) + RELOC_NUMBER (R_MSP430X_ABS20_EXT_SRC, 8) + RELOC_NUMBER (R_MSP430X_ABS20_EXT_DST, 9) + RELOC_NUMBER (R_MSP430X_ABS20_EXT_ODST, 10) + RELOC_NUMBER (R_MSP430X_ABS20_ADR_SRC, 11) + RELOC_NUMBER (R_MSP430X_ABS20_ADR_DST, 12) + RELOC_NUMBER (R_MSP430X_PCR16, 13) /* Like R_MSP430_PCR16 but with overflow checking. */ + RELOC_NUMBER (R_MSP430X_PCR20_CALL, 14) + RELOC_NUMBER (R_MSP430X_ABS16, 15) /* Like R_MSP430_ABS16 but with overflow checking. */ + RELOC_NUMBER (R_MSP430_ABS_HI16, 16) + RELOC_NUMBER (R_MSP430_PREL31, 17) + RELOC_NUMBER (R_MSP430_EHTYPE, 18) /* Mentioned in ABI. */ + RELOC_NUMBER (R_MSP430X_10_PCREL, 19) /* Red Hat invention. Used for Jump instructions. */ + RELOC_NUMBER (R_MSP430X_2X_PCREL, 20) /* Red Hat invention. Used for relaxing jumps. */ + RELOC_NUMBER (R_MSP430X_SYM_DIFF, 21) /* Red Hat invention. Used for relaxing debug info. */ +END_RELOC_NUMBERS (R_MSP430x_max) + +#endif /* _ELF_MSP430_H */ diff --git a/include/elf/mt.h b/include/elf/mt.h new file mode 100644 index 0000000..2bc09f4 --- /dev/null +++ b/include/elf/mt.h @@ -0,0 +1,46 @@ +/* MS1 ELF support for BFD. + Copyright (C) 2000, 2005, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_MT_H +#define _ELF_MT_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_mt_reloc_type) + RELOC_NUMBER (R_MT_NONE, 0) + RELOC_NUMBER (R_MT_16, 1) + RELOC_NUMBER (R_MT_32, 2) + RELOC_NUMBER (R_MT_32_PCREL, 3) + RELOC_NUMBER (R_MT_PC16, 4) + RELOC_NUMBER (R_MT_HI16, 5) + RELOC_NUMBER (R_MT_LO16, 6) +END_RELOC_NUMBERS(R_MT_max) + +#define EF_MT_CPU_MRISC 0x00000001 /* default */ +#define EF_MT_CPU_MRISC2 0x00000002 /* MRISC2 */ +#define EF_MT_CPU_MS2 0x00000003 /* MS2 */ +#define EF_MT_CPU_MASK 0x00000003 /* specific cpu bits */ +#define EF_MT_ALL_FLAGS (EF_MT_CPU_MASK) + +/* The location of the memory mapped hardware stack. */ +#define MT_STACK_VALUE 0x0f000000 +#define MT_STACK_SIZE 0x20 + +#endif /* _ELF_MT_H */ diff --git a/include/elf/nios2.h b/include/elf/nios2.h new file mode 100644 index 0000000..ff5947b --- /dev/null +++ b/include/elf/nios2.h @@ -0,0 +1,91 @@ +/* Altera Nios II ELF support for BFD. + Copyright (C) 2012, 2013 Free Software Foundation, Inc. + Contributed by Nigel Gray (ngray@altera.com). + Contributed by Mentor Graphics, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + + +/* This file holds definitions specific to the Altera Nios II ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_NIOS2_H +#define _ELF_NIOS2_H + +#include "elf/reloc-macros.h" + +/* The order of these numbers must match the order in + the elf_nios2_howto_table_rel table for the lookup + function to work properly. */ + +START_RELOC_NUMBERS (elf_nios2_reloc_type) + RELOC_NUMBER (R_NIOS2_NONE, 0) + RELOC_NUMBER (R_NIOS2_S16, 1) + RELOC_NUMBER (R_NIOS2_U16, 2) + RELOC_NUMBER (R_NIOS2_PCREL16, 3) + RELOC_NUMBER (R_NIOS2_CALL26, 4) + RELOC_NUMBER (R_NIOS2_IMM5, 5) + RELOC_NUMBER (R_NIOS2_CACHE_OPX, 6) + RELOC_NUMBER (R_NIOS2_IMM6, 7) + RELOC_NUMBER (R_NIOS2_IMM8, 8) + RELOC_NUMBER (R_NIOS2_HI16, 9) + RELOC_NUMBER (R_NIOS2_LO16, 10) + RELOC_NUMBER (R_NIOS2_HIADJ16, 11) + RELOC_NUMBER (R_NIOS2_BFD_RELOC_32, 12) + RELOC_NUMBER (R_NIOS2_BFD_RELOC_16, 13) + RELOC_NUMBER (R_NIOS2_BFD_RELOC_8, 14) + RELOC_NUMBER (R_NIOS2_GPREL, 15) + RELOC_NUMBER (R_NIOS2_GNU_VTINHERIT, 16) + RELOC_NUMBER (R_NIOS2_GNU_VTENTRY, 17) + RELOC_NUMBER (R_NIOS2_UJMP, 18) + RELOC_NUMBER (R_NIOS2_CJMP, 19) + RELOC_NUMBER (R_NIOS2_CALLR, 20) + RELOC_NUMBER (R_NIOS2_ALIGN, 21) + RELOC_NUMBER (R_NIOS2_GOT16, 22) + RELOC_NUMBER (R_NIOS2_CALL16, 23) + RELOC_NUMBER (R_NIOS2_GOTOFF_LO, 24) + RELOC_NUMBER (R_NIOS2_GOTOFF_HA, 25) + RELOC_NUMBER (R_NIOS2_PCREL_LO, 26) + RELOC_NUMBER (R_NIOS2_PCREL_HA, 27) + RELOC_NUMBER (R_NIOS2_TLS_GD16, 28) + RELOC_NUMBER (R_NIOS2_TLS_LDM16, 29) + RELOC_NUMBER (R_NIOS2_TLS_LDO16, 30) + RELOC_NUMBER (R_NIOS2_TLS_IE16, 31) + RELOC_NUMBER (R_NIOS2_TLS_LE16, 32) + RELOC_NUMBER (R_NIOS2_TLS_DTPMOD, 33) + RELOC_NUMBER (R_NIOS2_TLS_DTPREL, 34) + RELOC_NUMBER (R_NIOS2_TLS_TPREL, 35) + RELOC_NUMBER (R_NIOS2_COPY, 36) + RELOC_NUMBER (R_NIOS2_GLOB_DAT, 37) + RELOC_NUMBER (R_NIOS2_JUMP_SLOT, 38) + RELOC_NUMBER (R_NIOS2_RELATIVE, 39) + RELOC_NUMBER (R_NIOS2_GOTOFF, 40) + RELOC_NUMBER (R_NIOS2_ILLEGAL, 41) +END_RELOC_NUMBERS (R_NIOS2_maxext) + +/* Processor-specific section flags. */ + +/* This is used to mark gp-relative sections. */ +#define SHF_NIOS2_GPREL 0x10000000 + +/* Processor-specific dynamic array tags. */ + +/* Address of _gp. */ +#define DT_NIOS2_GP 0x70000002 + +#endif /* _ELF_NIOS2_H */ diff --git a/include/elf/openrisc.h b/include/elf/openrisc.h new file mode 100644 index 0000000..87969e8 --- /dev/null +++ b/include/elf/openrisc.h @@ -0,0 +1,39 @@ +/* OpenRISC ELF support for BFD. + Copyright 2001, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_OPENRISC_H +#define _ELF_OPENRISC_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_openrisc_reloc_type) + RELOC_NUMBER (R_OPENRISC_NONE, 0) + RELOC_NUMBER (R_OPENRISC_INSN_REL_26, 1) + RELOC_NUMBER (R_OPENRISC_INSN_ABS_26, 2) + RELOC_NUMBER (R_OPENRISC_LO_16_IN_INSN, 3) + RELOC_NUMBER (R_OPENRISC_HI_16_IN_INSN, 4) + RELOC_NUMBER (R_OPENRISC_8, 5) + RELOC_NUMBER (R_OPENRISC_16, 6) + RELOC_NUMBER (R_OPENRISC_32, 7) + RELOC_NUMBER (R_OPENRISC_GNU_VTINHERIT, 8) + RELOC_NUMBER (R_OPENRISC_GNU_VTENTRY, 9) +END_RELOC_NUMBERS (R_OPENRISC_max) + +#endif /* _ELF_OPENRISC_H */ diff --git a/include/elf/or32.h b/include/elf/or32.h new file mode 100644 index 0000000..9f1c2f3 --- /dev/null +++ b/include/elf/or32.h @@ -0,0 +1,56 @@ +/* OR1K ELF support for BFD. Derived from ppc.h. + Copyright (C) 2002, 2010 Free Software Foundation, Inc. + Contributed by Ivan Guzvinec + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_OR1K_H +#define _ELF_OR1K_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_or32_reloc_type) + RELOC_NUMBER (R_OR32_NONE, 0) + RELOC_NUMBER (R_OR32_32, 1) + RELOC_NUMBER (R_OR32_16, 2) + RELOC_NUMBER (R_OR32_8, 3) + RELOC_NUMBER (R_OR32_CONST, 4) + RELOC_NUMBER (R_OR32_CONSTH, 5) + RELOC_NUMBER (R_OR32_JUMPTARG, 6) + RELOC_NUMBER (R_OR32_GNU_VTENTRY, 7) + RELOC_NUMBER (R_OR32_GNU_VTINHERIT, 8) +END_RELOC_NUMBERS (R_OR32_max) + +/* Four bit OR32 machine type field. */ +#define EF_OR32_MACH 0x0000000f + +/* Various CPU types. */ +#define E_OR32_MACH_BASE 0x00000000 +#define E_OR32_MACH_UNUSED1 0x00000001 +#define E_OR32_MACH_UNUSED2 0x00000002 +#define E_OR32_MACH_UNUSED4 0x00000003 + +/* Processor specific section headers, sh_type field */ +#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ + entries in this section \ + based on the address \ + specified in the associated \ + symbol table entry. */ + +#endif /* _ELF_OR1K_H */ diff --git a/include/elf/pj.h b/include/elf/pj.h new file mode 100644 index 0000000..afd19e8 --- /dev/null +++ b/include/elf/pj.h @@ -0,0 +1,44 @@ +/* picoJava ELF support for BFD. + Copyright 1999, 2000, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_PJ_H +#define _ELF_PJ_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ + +START_RELOC_NUMBERS (elf_pj_reloc_type) + RELOC_NUMBER (R_PJ_NONE, 0) + RELOC_NUMBER (R_PJ_DATA_DIR32, 1) + RELOC_NUMBER (R_PJ_CODE_REL32, 2) + RELOC_NUMBER (R_PJ_CODE_REL16, 3) + RELOC_NUMBER (R_PJ_CODE_DIR32, 6) + RELOC_NUMBER (R_PJ_CODE_DIR16, 7) + RELOC_NUMBER (R_PJ_CODE_LO16, 13) + RELOC_NUMBER (R_PJ_CODE_HI16, 14) + RELOC_NUMBER (R_PJ_GNU_VTINHERIT, 15) + RELOC_NUMBER (R_PJ_GNU_VTENTRY, 16) +END_RELOC_NUMBERS (R_PJ_max) + +#define EF_PICOJAVA_ARCH 0x0000000f +#define EF_PICOJAVA_NEWCALLS 0x00000010 +#define EF_PICOJAVA_GNUCALLS 0x00000020 /* The (currently) non standard GNU calling convention */ + +#endif diff --git a/include/elf/ppc.h b/include/elf/ppc.h new file mode 100644 index 0000000..f80a1e8 --- /dev/null +++ b/include/elf/ppc.h @@ -0,0 +1,223 @@ +/* PPC ELF support for BFD. + Copyright 1995, 1996, 1998, 2000, 2001, 2002, 2003, 2005, 2007, 2008, + 2009, 2010 Free Software Foundation, Inc. + + By Michael Meissner, Cygnus Support, , + from information in the System V Application Binary Interface, + PowerPC Processor Supplement and the PowerPC Embedded Application + Binary Interface (eabi). + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the PPC ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_PPC_H +#define _ELF_PPC_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_ppc_reloc_type) + RELOC_NUMBER (R_PPC_NONE, 0) + RELOC_NUMBER (R_PPC_ADDR32, 1) + RELOC_NUMBER (R_PPC_ADDR24, 2) + RELOC_NUMBER (R_PPC_ADDR16, 3) + RELOC_NUMBER (R_PPC_ADDR16_LO, 4) + RELOC_NUMBER (R_PPC_ADDR16_HI, 5) + RELOC_NUMBER (R_PPC_ADDR16_HA, 6) + RELOC_NUMBER (R_PPC_ADDR14, 7) + RELOC_NUMBER (R_PPC_ADDR14_BRTAKEN, 8) + RELOC_NUMBER (R_PPC_ADDR14_BRNTAKEN, 9) + RELOC_NUMBER (R_PPC_REL24, 10) + RELOC_NUMBER (R_PPC_REL14, 11) + RELOC_NUMBER (R_PPC_REL14_BRTAKEN, 12) + RELOC_NUMBER (R_PPC_REL14_BRNTAKEN, 13) + RELOC_NUMBER (R_PPC_GOT16, 14) + RELOC_NUMBER (R_PPC_GOT16_LO, 15) + RELOC_NUMBER (R_PPC_GOT16_HI, 16) + RELOC_NUMBER (R_PPC_GOT16_HA, 17) + RELOC_NUMBER (R_PPC_PLTREL24, 18) + RELOC_NUMBER (R_PPC_COPY, 19) + RELOC_NUMBER (R_PPC_GLOB_DAT, 20) + RELOC_NUMBER (R_PPC_JMP_SLOT, 21) + RELOC_NUMBER (R_PPC_RELATIVE, 22) + RELOC_NUMBER (R_PPC_LOCAL24PC, 23) + RELOC_NUMBER (R_PPC_UADDR32, 24) + RELOC_NUMBER (R_PPC_UADDR16, 25) + RELOC_NUMBER (R_PPC_REL32, 26) + RELOC_NUMBER (R_PPC_PLT32, 27) + RELOC_NUMBER (R_PPC_PLTREL32, 28) + RELOC_NUMBER (R_PPC_PLT16_LO, 29) + RELOC_NUMBER (R_PPC_PLT16_HI, 30) + RELOC_NUMBER (R_PPC_PLT16_HA, 31) + RELOC_NUMBER (R_PPC_SDAREL16, 32) + RELOC_NUMBER (R_PPC_SECTOFF, 33) + RELOC_NUMBER (R_PPC_SECTOFF_LO, 34) + RELOC_NUMBER (R_PPC_SECTOFF_HI, 35) + RELOC_NUMBER (R_PPC_SECTOFF_HA, 36) + RELOC_NUMBER (R_PPC_ADDR30, 37) + +#ifndef RELOC_MACROS_GEN_FUNC +/* Fake relocations for branch stubs, only used internally by ld. */ + RELOC_NUMBER (R_PPC_RELAX, 48) + RELOC_NUMBER (R_PPC_RELAX_PLT, 49) + RELOC_NUMBER (R_PPC_RELAX_PLTREL24, 50) +#endif + + /* Relocs added to support TLS. */ + RELOC_NUMBER (R_PPC_TLS, 67) + RELOC_NUMBER (R_PPC_DTPMOD32, 68) + RELOC_NUMBER (R_PPC_TPREL16, 69) + RELOC_NUMBER (R_PPC_TPREL16_LO, 70) + RELOC_NUMBER (R_PPC_TPREL16_HI, 71) + RELOC_NUMBER (R_PPC_TPREL16_HA, 72) + RELOC_NUMBER (R_PPC_TPREL32, 73) + RELOC_NUMBER (R_PPC_DTPREL16, 74) + RELOC_NUMBER (R_PPC_DTPREL16_LO, 75) + RELOC_NUMBER (R_PPC_DTPREL16_HI, 76) + RELOC_NUMBER (R_PPC_DTPREL16_HA, 77) + RELOC_NUMBER (R_PPC_DTPREL32, 78) + RELOC_NUMBER (R_PPC_GOT_TLSGD16, 79) + RELOC_NUMBER (R_PPC_GOT_TLSGD16_LO, 80) + RELOC_NUMBER (R_PPC_GOT_TLSGD16_HI, 81) + RELOC_NUMBER (R_PPC_GOT_TLSGD16_HA, 82) + RELOC_NUMBER (R_PPC_GOT_TLSLD16, 83) + RELOC_NUMBER (R_PPC_GOT_TLSLD16_LO, 84) + RELOC_NUMBER (R_PPC_GOT_TLSLD16_HI, 85) + RELOC_NUMBER (R_PPC_GOT_TLSLD16_HA, 86) + RELOC_NUMBER (R_PPC_GOT_TPREL16, 87) + RELOC_NUMBER (R_PPC_GOT_TPREL16_LO, 88) + RELOC_NUMBER (R_PPC_GOT_TPREL16_HI, 89) + RELOC_NUMBER (R_PPC_GOT_TPREL16_HA, 90) + RELOC_NUMBER (R_PPC_GOT_DTPREL16, 91) + RELOC_NUMBER (R_PPC_GOT_DTPREL16_LO, 92) + RELOC_NUMBER (R_PPC_GOT_DTPREL16_HI, 93) + RELOC_NUMBER (R_PPC_GOT_DTPREL16_HA, 94) + RELOC_NUMBER (R_PPC_TLSGD, 95) + RELOC_NUMBER (R_PPC_TLSLD, 96) + +/* The remaining relocs are from the Embedded ELF ABI, and are not + in the SVR4 ELF ABI. */ + RELOC_NUMBER (R_PPC_EMB_NADDR32, 101) + RELOC_NUMBER (R_PPC_EMB_NADDR16, 102) + RELOC_NUMBER (R_PPC_EMB_NADDR16_LO, 103) + RELOC_NUMBER (R_PPC_EMB_NADDR16_HI, 104) + RELOC_NUMBER (R_PPC_EMB_NADDR16_HA, 105) + RELOC_NUMBER (R_PPC_EMB_SDAI16, 106) + RELOC_NUMBER (R_PPC_EMB_SDA2I16, 107) + RELOC_NUMBER (R_PPC_EMB_SDA2REL, 108) + RELOC_NUMBER (R_PPC_EMB_SDA21, 109) + RELOC_NUMBER (R_PPC_EMB_MRKREF, 110) + RELOC_NUMBER (R_PPC_EMB_RELSEC16, 111) + RELOC_NUMBER (R_PPC_EMB_RELST_LO, 112) + RELOC_NUMBER (R_PPC_EMB_RELST_HI, 113) + RELOC_NUMBER (R_PPC_EMB_RELST_HA, 114) + RELOC_NUMBER (R_PPC_EMB_BIT_FLD, 115) + RELOC_NUMBER (R_PPC_EMB_RELSDA, 116) + +/* PowerPC VLE relocations. */ + RELOC_NUMBER (R_PPC_VLE_REL8, 216) + RELOC_NUMBER (R_PPC_VLE_REL15, 217) + RELOC_NUMBER (R_PPC_VLE_REL24, 218) + RELOC_NUMBER (R_PPC_VLE_LO16A, 219) + RELOC_NUMBER (R_PPC_VLE_LO16D, 220) + RELOC_NUMBER (R_PPC_VLE_HI16A, 221) + RELOC_NUMBER (R_PPC_VLE_HI16D, 222) + RELOC_NUMBER (R_PPC_VLE_HA16A, 223) + RELOC_NUMBER (R_PPC_VLE_HA16D, 224) + RELOC_NUMBER (R_PPC_VLE_SDA21, 225) + RELOC_NUMBER (R_PPC_VLE_SDA21_LO, 226) + RELOC_NUMBER (R_PPC_VLE_SDAREL_LO16A, 227) + RELOC_NUMBER (R_PPC_VLE_SDAREL_LO16D, 228) + RELOC_NUMBER (R_PPC_VLE_SDAREL_HI16A, 229) + RELOC_NUMBER (R_PPC_VLE_SDAREL_HI16D, 230) + RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16A, 231) + RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16D, 232) + +/* Support STT_GNU_IFUNC plt calls. */ + RELOC_NUMBER (R_PPC_IRELATIVE, 248) + +/* These are GNU extensions used in PIC code sequences. */ + RELOC_NUMBER (R_PPC_REL16, 249) + RELOC_NUMBER (R_PPC_REL16_LO, 250) + RELOC_NUMBER (R_PPC_REL16_HI, 251) + RELOC_NUMBER (R_PPC_REL16_HA, 252) + +/* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_PPC_GNU_VTINHERIT, 253) + RELOC_NUMBER (R_PPC_GNU_VTENTRY, 254) + +/* This is a phony reloc to handle any old fashioned TOC16 references + that may still be in object files. */ + RELOC_NUMBER (R_PPC_TOC16, 255) + +END_RELOC_NUMBERS (R_PPC_max) + +#define IS_PPC_TLS_RELOC(R) \ + ((R) >= R_PPC_TLS && (R) <= R_PPC_GOT_DTPREL16_HA) + +/* Specify the value of _GLOBAL_OFFSET_TABLE_. */ +#define DT_PPC_GOT (DT_LOPROC) + +/* Specify that tls descriptors should be optimized. */ +#define DT_PPC_TLSOPT (DT_LOPROC + 1) + +/* Processor specific flags for the ELF header e_flags field. */ + +#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag. */ + +#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag. */ +#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib flag. */ + +/* Processor specific program headers, p_flags field. */ +#define PF_PPC_VLE 0x10000000 /* PowerPC VLE. */ + +/* Processor specific section headers, sh_flags field. */ +#define SHF_PPC_VLE 0x10000000 /* PowerPC VLE text section. */ + +/* Processor specific section headers, sh_type field. */ + +#define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ + entries in this section \ + based on the address \ + specified in the associated \ + symbol table entry. */ + +/* Object attribute tags. */ +enum +{ + /* 0-3 are generic. */ + Tag_GNU_Power_ABI_FP = 4, /* Value 1 for hard-float, 2 for + soft-float, 3 for single=precision + hard-float; 0 for not tagged or not + using any ABIs affected by the + differences. */ + + /* Value 1 for general purpose registers only, 2 for AltiVec + registers, 3 for SPE registers; 0 for not tagged or not using any + ABIs affected by the differences. */ + Tag_GNU_Power_ABI_Vector = 8, + + /* Value 1 for ABIs using r3/r4 for returning structures <= 8 bytes, + 2 for ABIs using memory; 0 for not tagged or not using any ABIs + affected by the differences. */ + Tag_GNU_Power_ABI_Struct_Return = 12 +}; + +#endif /* _ELF_PPC_H */ diff --git a/include/elf/ppc64.h b/include/elf/ppc64.h new file mode 100644 index 0000000..f1c80f1 --- /dev/null +++ b/include/elf/ppc64.h @@ -0,0 +1,177 @@ +/* PPC64 ELF support for BFD. + Copyright 2003, 2005, 2009, 2010, 2011 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_PPC64_H +#define _ELF_PPC64_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_ppc64_reloc_type) + RELOC_NUMBER (R_PPC64_NONE, 0) + RELOC_NUMBER (R_PPC64_ADDR32, 1) + RELOC_NUMBER (R_PPC64_ADDR24, 2) + RELOC_NUMBER (R_PPC64_ADDR16, 3) + RELOC_NUMBER (R_PPC64_ADDR16_LO, 4) + RELOC_NUMBER (R_PPC64_ADDR16_HI, 5) + RELOC_NUMBER (R_PPC64_ADDR16_HA, 6) + RELOC_NUMBER (R_PPC64_ADDR14, 7) + RELOC_NUMBER (R_PPC64_ADDR14_BRTAKEN, 8) + RELOC_NUMBER (R_PPC64_ADDR14_BRNTAKEN, 9) + RELOC_NUMBER (R_PPC64_REL24, 10) + RELOC_NUMBER (R_PPC64_REL14, 11) + RELOC_NUMBER (R_PPC64_REL14_BRTAKEN, 12) + RELOC_NUMBER (R_PPC64_REL14_BRNTAKEN, 13) + RELOC_NUMBER (R_PPC64_GOT16, 14) + RELOC_NUMBER (R_PPC64_GOT16_LO, 15) + RELOC_NUMBER (R_PPC64_GOT16_HI, 16) + RELOC_NUMBER (R_PPC64_GOT16_HA, 17) + /* 18 unused. 32-bit reloc is R_PPC_PLTREL24. */ + RELOC_NUMBER (R_PPC64_COPY, 19) + RELOC_NUMBER (R_PPC64_GLOB_DAT, 20) + RELOC_NUMBER (R_PPC64_JMP_SLOT, 21) + RELOC_NUMBER (R_PPC64_RELATIVE, 22) + /* 23 unused. 32-bit reloc is R_PPC_LOCAL24PC. */ + RELOC_NUMBER (R_PPC64_UADDR32, 24) + RELOC_NUMBER (R_PPC64_UADDR16, 25) + RELOC_NUMBER (R_PPC64_REL32, 26) + RELOC_NUMBER (R_PPC64_PLT32, 27) + RELOC_NUMBER (R_PPC64_PLTREL32, 28) + RELOC_NUMBER (R_PPC64_PLT16_LO, 29) + RELOC_NUMBER (R_PPC64_PLT16_HI, 30) + RELOC_NUMBER (R_PPC64_PLT16_HA, 31) + /* 32 unused. 32-bit reloc is R_PPC_SDAREL16. */ + RELOC_NUMBER (R_PPC64_SECTOFF, 33) + RELOC_NUMBER (R_PPC64_SECTOFF_LO, 34) + RELOC_NUMBER (R_PPC64_SECTOFF_HI, 35) + RELOC_NUMBER (R_PPC64_SECTOFF_HA, 36) + RELOC_NUMBER (R_PPC64_REL30, 37) + RELOC_NUMBER (R_PPC64_ADDR64, 38) + RELOC_NUMBER (R_PPC64_ADDR16_HIGHER, 39) + RELOC_NUMBER (R_PPC64_ADDR16_HIGHERA, 40) + RELOC_NUMBER (R_PPC64_ADDR16_HIGHEST, 41) + RELOC_NUMBER (R_PPC64_ADDR16_HIGHESTA, 42) + RELOC_NUMBER (R_PPC64_UADDR64, 43) + RELOC_NUMBER (R_PPC64_REL64, 44) + RELOC_NUMBER (R_PPC64_PLT64, 45) + RELOC_NUMBER (R_PPC64_PLTREL64, 46) + RELOC_NUMBER (R_PPC64_TOC16, 47) + RELOC_NUMBER (R_PPC64_TOC16_LO, 48) + RELOC_NUMBER (R_PPC64_TOC16_HI, 49) + RELOC_NUMBER (R_PPC64_TOC16_HA, 50) + RELOC_NUMBER (R_PPC64_TOC, 51) + RELOC_NUMBER (R_PPC64_PLTGOT16, 52) + RELOC_NUMBER (R_PPC64_PLTGOT16_LO, 53) + RELOC_NUMBER (R_PPC64_PLTGOT16_HI, 54) + RELOC_NUMBER (R_PPC64_PLTGOT16_HA, 55) + + /* The following relocs were added in the 64-bit PowerPC ELF ABI + revision 1.2. */ + RELOC_NUMBER (R_PPC64_ADDR16_DS, 56) + RELOC_NUMBER (R_PPC64_ADDR16_LO_DS, 57) + RELOC_NUMBER (R_PPC64_GOT16_DS, 58) + RELOC_NUMBER (R_PPC64_GOT16_LO_DS, 59) + RELOC_NUMBER (R_PPC64_PLT16_LO_DS, 60) + RELOC_NUMBER (R_PPC64_SECTOFF_DS, 61) + RELOC_NUMBER (R_PPC64_SECTOFF_LO_DS, 62) + RELOC_NUMBER (R_PPC64_TOC16_DS, 63) + RELOC_NUMBER (R_PPC64_TOC16_LO_DS, 64) + RELOC_NUMBER (R_PPC64_PLTGOT16_DS, 65) + RELOC_NUMBER (R_PPC64_PLTGOT16_LO_DS, 66) + + /* Relocs added to support TLS. PowerPC64 ELF ABI revision 1.5. */ + RELOC_NUMBER (R_PPC64_TLS, 67) + RELOC_NUMBER (R_PPC64_DTPMOD64, 68) + RELOC_NUMBER (R_PPC64_TPREL16, 69) + RELOC_NUMBER (R_PPC64_TPREL16_LO, 70) + RELOC_NUMBER (R_PPC64_TPREL16_HI, 71) + RELOC_NUMBER (R_PPC64_TPREL16_HA, 72) + RELOC_NUMBER (R_PPC64_TPREL64, 73) + RELOC_NUMBER (R_PPC64_DTPREL16, 74) + RELOC_NUMBER (R_PPC64_DTPREL16_LO, 75) + RELOC_NUMBER (R_PPC64_DTPREL16_HI, 76) + RELOC_NUMBER (R_PPC64_DTPREL16_HA, 77) + RELOC_NUMBER (R_PPC64_DTPREL64, 78) + RELOC_NUMBER (R_PPC64_GOT_TLSGD16, 79) + RELOC_NUMBER (R_PPC64_GOT_TLSGD16_LO, 80) + RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HI, 81) + RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HA, 82) + RELOC_NUMBER (R_PPC64_GOT_TLSLD16, 83) + RELOC_NUMBER (R_PPC64_GOT_TLSLD16_LO, 84) + RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HI, 85) + RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HA, 86) + RELOC_NUMBER (R_PPC64_GOT_TPREL16_DS, 87) + RELOC_NUMBER (R_PPC64_GOT_TPREL16_LO_DS, 88) + RELOC_NUMBER (R_PPC64_GOT_TPREL16_HI, 89) + RELOC_NUMBER (R_PPC64_GOT_TPREL16_HA, 90) + RELOC_NUMBER (R_PPC64_GOT_DTPREL16_DS, 91) + RELOC_NUMBER (R_PPC64_GOT_DTPREL16_LO_DS, 92) + RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HI, 93) + RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HA, 94) + RELOC_NUMBER (R_PPC64_TPREL16_DS, 95) + RELOC_NUMBER (R_PPC64_TPREL16_LO_DS, 96) + RELOC_NUMBER (R_PPC64_TPREL16_HIGHER, 97) + RELOC_NUMBER (R_PPC64_TPREL16_HIGHERA, 98) + RELOC_NUMBER (R_PPC64_TPREL16_HIGHEST, 99) + RELOC_NUMBER (R_PPC64_TPREL16_HIGHESTA, 100) + RELOC_NUMBER (R_PPC64_DTPREL16_DS, 101) + RELOC_NUMBER (R_PPC64_DTPREL16_LO_DS, 102) + RELOC_NUMBER (R_PPC64_DTPREL16_HIGHER, 103) + RELOC_NUMBER (R_PPC64_DTPREL16_HIGHERA, 104) + RELOC_NUMBER (R_PPC64_DTPREL16_HIGHEST, 105) + RELOC_NUMBER (R_PPC64_DTPREL16_HIGHESTA, 106) + RELOC_NUMBER (R_PPC64_TLSGD, 107) + RELOC_NUMBER (R_PPC64_TLSLD, 108) + RELOC_NUMBER (R_PPC64_TOCSAVE, 109) + +#ifndef RELOC_MACROS_GEN_FUNC +/* Fake relocation only used internally by ld. */ + RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128) +#endif +/* Support STT_GNU_IFUNC plt calls. */ + RELOC_NUMBER (R_PPC64_JMP_IREL, 247) + RELOC_NUMBER (R_PPC64_IRELATIVE, 248) + +/* These are GNU extensions used in PIC code sequences. */ + RELOC_NUMBER (R_PPC64_REL16, 249) + RELOC_NUMBER (R_PPC64_REL16_LO, 250) + RELOC_NUMBER (R_PPC64_REL16_HI, 251) + RELOC_NUMBER (R_PPC64_REL16_HA, 252) + + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253) + RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254) + +END_RELOC_NUMBERS (R_PPC64_max) + +#define IS_PPC64_TLS_RELOC(R) \ + ((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) + +/* Specify the start of the .glink section. */ +#define DT_PPC64_GLINK DT_LOPROC + +/* Specify the start and size of the .opd section. */ +#define DT_PPC64_OPD (DT_LOPROC + 1) +#define DT_PPC64_OPDSZ (DT_LOPROC + 2) + +/* Specify that tls descriptors should be optimized. */ +#define DT_PPC64_TLSOPT (DT_LOPROC + 3) + +#endif /* _ELF_PPC64_H */ diff --git a/include/elf/reloc-macros.h b/include/elf/reloc-macros.h new file mode 100644 index 0000000..92fc9c1 --- /dev/null +++ b/include/elf/reloc-macros.h @@ -0,0 +1,129 @@ +/* Generic relocation support for BFD. + Copyright 1998, 1999, 2000, 2003, 2010, 2011 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* These macros are used by the various *.h target specific header + files to either generate an enum containing all the known relocations + for that target, or if RELOC_MACROS_GEN_FUNC is defined, a recognition + function is generated instead. (This is used by binutils/readelf.c) + + Given a header file like this: + + START_RELOC_NUMBERS (foo) + RELOC_NUMBER (R_foo_NONE, 0) + RELOC_NUMBER (R_foo_32, 1) + EMPTY_RELOC (R_foo_good) + FAKE_RELOC (R_foo_illegal, 9) + END_RELOC_NUMBERS (R_foo_count) + + Then the following will be produced by default (ie if + RELOC_MACROS_GEN_FUNC is *not* defined). + + enum foo + { + R_foo_NONE = 0, + R_foo_32 = 1, + R_foo_good, + R_foo_illegal = 9, + R_foo_count + }; + + Note: The value of the symbol defined in the END_RELOC_NUMBERS + macro (R_foo_count in the case of the example above) will be + set to the value of the whichever *_RELOC macro precedes it plus + one. Therefore if you intend to use the symbol as a sentinel for + the highest valid macro value you should make sure that the + preceding *_RELOC macro is the highest valid number. ie a + declaration like this: + + START_RELOC_NUMBERS (foo) + RELOC_NUMBER (R_foo_NONE, 0) + RELOC_NUMBER (R_foo_32, 1) + FAKE_RELOC (R_foo_illegal, 9) + FAKE_RELOC (R_foo_synonym, 0) + END_RELOC_NUMBERS (R_foo_count) + + will result in R_foo_count having a value of 1 (R_foo_synonym + 1) + rather than 10 or 2 as might be expected. + + Alternatively you can assign a value to END_RELOC_NUMBERS symbol + explicitly, like this: + + START_RELOC_NUMBERS (foo) + RELOC_NUMBER (R_foo_NONE, 0) + RELOC_NUMBER (R_foo_32, 1) + FAKE_RELOC (R_foo_illegal, 9) + FAKE_RELOC (R_foo_synonym, 0) + END_RELOC_NUMBERS (R_foo_count = 2) + + If RELOC_MACROS_GEN_FUNC *is* defined, then instead the + following function will be generated: + + static const char *foo (unsigned long rtype); + static const char * + foo (unsigned long rtype) + { + switch (rtype) + { + case 0: return "R_foo_NONE"; + case 1: return "R_foo_32"; + default: return NULL; + } + } + */ + +#ifndef _RELOC_MACROS_H +#define _RELOC_MACROS_H + +#ifdef RELOC_MACROS_GEN_FUNC + +/* This function takes the relocation number and returns the + string version name of the name of that relocation. If + the relocation is not recognised, NULL is returned. */ + +#define START_RELOC_NUMBERS(name) \ +static const char *name (unsigned long rtype); \ +static const char * \ +name (unsigned long rtype) \ +{ \ + switch (rtype) \ + { + +#define RELOC_NUMBER(name, number) \ + case number: return #name; + +#define FAKE_RELOC(name, number) +#define EMPTY_RELOC(name) + +#define END_RELOC_NUMBERS(name) \ + default: return NULL; \ + } \ +} + + +#else /* Default to generating enum. */ + +#define START_RELOC_NUMBERS(name) enum name { +#define RELOC_NUMBER(name, number) name = number, +#define FAKE_RELOC(name, number) name = number, +#define EMPTY_RELOC(name) name, +#define END_RELOC_NUMBERS(name) name }; + +#endif + +#endif /* _RELOC_MACROS_H */ diff --git a/include/elf/rl78.h b/include/elf/rl78.h new file mode 100644 index 0000000..b281d3a --- /dev/null +++ b/include/elf/rl78.h @@ -0,0 +1,120 @@ +/* RL78 ELF support for BFD. + Copyright (C) 2008-2013 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_RL78_H +#define _ELF_RL78_H + +#include "elf/reloc-macros.h" + +/* Note that there are a few internal relocation types used by the + linker to do link-time relaxation. If you update this file, please + check elf32-rl78.c to see if any of the internal relocations need to + be, er, relocated. */ + +/* Preliminary relocations. */ +START_RELOC_NUMBERS (elf_rl78_reloc_type) + + RELOC_NUMBER (R_RL78_NONE, 0x00) + /* These are for data, and are bi-endian. */ + RELOC_NUMBER (R_RL78_DIR32, 0x01) /* Was: R_RL78_32. */ + RELOC_NUMBER (R_RL78_DIR24S, 0x02) /* Was: R_RL78_24. */ + RELOC_NUMBER (R_RL78_DIR16, 0x03) + RELOC_NUMBER (R_RL78_DIR16U, 0x04) /* Was: R_RL78_16_UNS. */ + RELOC_NUMBER (R_RL78_DIR16S, 0x05) /* Was: R_RL78_16. */ + RELOC_NUMBER (R_RL78_DIR8, 0x06) + RELOC_NUMBER (R_RL78_DIR8U, 0x07) /* Was: R_RL78_8_UNS. */ + RELOC_NUMBER (R_RL78_DIR8S, 0x08) /* Was: R_RL78_8. */ + + /* Signed pc-relative values. */ + RELOC_NUMBER (R_RL78_DIR24S_PCREL, 0x09) /* Was: R_RL78_24_PCREL. */ + RELOC_NUMBER (R_RL78_DIR16S_PCREL, 0x0a) /* Was: R_RL78_16_PCREL. */ + RELOC_NUMBER (R_RL78_DIR8S_PCREL, 0x0b) /* Was: R_RL78_8_PCREL. */ + + /* These are for fields in the instructions. */ + RELOC_NUMBER (R_RL78_DIR16UL, 0x0c) + RELOC_NUMBER (R_RL78_DIR16UW, 0x0d) + RELOC_NUMBER (R_RL78_DIR8UL, 0x0e) + RELOC_NUMBER (R_RL78_DIR8UW, 0x0f) + RELOC_NUMBER (R_RL78_DIR32_REV, 0x10) + RELOC_NUMBER (R_RL78_DIR16_REV, 0x11) + RELOC_NUMBER (R_RL78_DIR3U_PCREL, 0x12) + + /* These are extensions added by Red Hat. */ + RELOC_NUMBER (R_RL78_RH_RELAX, 0x2d) /* Marks opcodes suitable for linker relaxation. */ + RELOC_NUMBER (R_RL78_RH_SFR, 0x2e) /* SFR addresses - internal use only. */ + RELOC_NUMBER (R_RL78_RH_SADDR, 0x2f) /* SADDR addresses - internal use only.. */ + + /* These are for complex relocs. */ + RELOC_NUMBER (R_RL78_ABS32, 0x41) + RELOC_NUMBER (R_RL78_ABS24S, 0x42) + RELOC_NUMBER (R_RL78_ABS16, 0x43) + RELOC_NUMBER (R_RL78_ABS16U, 0x44) + RELOC_NUMBER (R_RL78_ABS16S, 0x45) + RELOC_NUMBER (R_RL78_ABS8, 0x46) + RELOC_NUMBER (R_RL78_ABS8U, 0x47) + RELOC_NUMBER (R_RL78_ABS8S, 0x48) + RELOC_NUMBER (R_RL78_ABS24S_PCREL, 0x49) + RELOC_NUMBER (R_RL78_ABS16S_PCREL, 0x4a) + RELOC_NUMBER (R_RL78_ABS8S_PCREL, 0x4b) + RELOC_NUMBER (R_RL78_ABS16UL, 0x4c) + RELOC_NUMBER (R_RL78_ABS16UW, 0x4d) + RELOC_NUMBER (R_RL78_ABS8UL, 0x4e) + RELOC_NUMBER (R_RL78_ABS8UW, 0x4f) + RELOC_NUMBER (R_RL78_ABS32_REV, 0x50) + RELOC_NUMBER (R_RL78_ABS16_REV, 0x51) + + RELOC_NUMBER (R_RL78_SYM, 0x80) + RELOC_NUMBER (R_RL78_OPneg, 0x81) + RELOC_NUMBER (R_RL78_OPadd, 0x82) + RELOC_NUMBER (R_RL78_OPsub, 0x83) + RELOC_NUMBER (R_RL78_OPmul, 0x84) + RELOC_NUMBER (R_RL78_OPdiv, 0x85) + RELOC_NUMBER (R_RL78_OPshla, 0x86) + RELOC_NUMBER (R_RL78_OPshra, 0x87) + RELOC_NUMBER (R_RL78_OPsctsize, 0x88) + RELOC_NUMBER (R_RL78_OPscttop, 0x8d) + RELOC_NUMBER (R_RL78_OPand, 0x90) + RELOC_NUMBER (R_RL78_OPor, 0x91) + RELOC_NUMBER (R_RL78_OPxor, 0x92) + RELOC_NUMBER (R_RL78_OPnot, 0x93) + RELOC_NUMBER (R_RL78_OPmod, 0x94) + RELOC_NUMBER (R_RL78_OPromtop, 0x95) + RELOC_NUMBER (R_RL78_OPramtop, 0x96) + +END_RELOC_NUMBERS (R_RL78_max) + +#define EF_RL78_CPU_RL78 0x00000079 /* FIXME: correct value? */ +#define EF_RL78_CPU_MASK 0x0000007F /* specific cpu bits. */ +#define EF_RL78_ALL_FLAGS (EF_RL78_CPU_MASK) + +/* Values for the e_flags field in the ELF header. */ +#define E_FLAG_RL78_64BIT_DOUBLES (1 << 0) +#define E_FLAG_RL78_DSP (1 << 1) /* Defined in the RL78 CPU Object file specification, but not explained. */ +#define E_FLAG_RL78_G10 (1 << 2) /* CPU is missing register banks 1-3, so uses different ABI. */ + +/* These define the addend field of R_RL78_RH_RELAX relocations. */ +#define RL78_RELAXA_BRA 0x00000010 /* Any type of branch (must be decoded). */ +#define RL78_RELAXA_ADDR16 0x00000020 /* addr16->sfr/saddr opportunity */ +#define RL78_RELAXA_RNUM 0x0000000f /* Number of associated relocations. */ +/* These mark the place where alignment is requested, and the place where the filler bytes end. */ +#define RL78_RELAXA_ALIGN 0x10000000 /* Start alignment; the remaining bits are the alignment value. */ +#define RL78_RELAXA_ELIGN 0x20000000 /* End alignment; the remaining bits are the alignment value. */ +#define RL78_RELAXA_ANUM 0x00ffffff /* Alignment amount, in bytes (i.e. .balign). */ + +#endif /* _ELF_RL78_H */ diff --git a/include/elf/rx.h b/include/elf/rx.h new file mode 100644 index 0000000..c17128c --- /dev/null +++ b/include/elf/rx.h @@ -0,0 +1,141 @@ +/* RX ELF support for BFD. + Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_RX_H +#define _ELF_RX_H + +#include "elf/reloc-macros.h" + +/* Note that there are a few internal relocation types used by the + linker to do link-time relaxation. If you update this file, please + check elf32-rx.c to see if any of the internal relocations need to + be, er, relocated. */ + +/* Preliminary relocations. */ +START_RELOC_NUMBERS (elf_rx_reloc_type) + + RELOC_NUMBER (R_RX_NONE, 0x00) + /* These are for data, and are bi-endian. */ + RELOC_NUMBER (R_RX_DIR32, 0x01) /* Was: R_RX_32. */ + RELOC_NUMBER (R_RX_DIR24S, 0x02) /* Was: R_RX_24. */ + RELOC_NUMBER (R_RX_DIR16, 0x03) + RELOC_NUMBER (R_RX_DIR16U, 0x04) /* Was: R_RX_16_UNS. */ + RELOC_NUMBER (R_RX_DIR16S, 0x05) /* Was: R_RX_16. */ + RELOC_NUMBER (R_RX_DIR8, 0x06) + RELOC_NUMBER (R_RX_DIR8U, 0x07) /* Was: R_RX_8_UNS. */ + RELOC_NUMBER (R_RX_DIR8S, 0x08) /* Was: R_RX_8. */ + + /* Signed pc-relative values. */ + RELOC_NUMBER (R_RX_DIR24S_PCREL, 0x09) /* Was: R_RX_24_PCREL. */ + RELOC_NUMBER (R_RX_DIR16S_PCREL, 0x0a) /* Was: R_RX_16_PCREL. */ + RELOC_NUMBER (R_RX_DIR8S_PCREL, 0x0b) /* Was: R_RX_8_PCREL. */ + + /* These are for fields in the instructions. */ + RELOC_NUMBER (R_RX_DIR16UL, 0x0c) + RELOC_NUMBER (R_RX_DIR16UW, 0x0d) + RELOC_NUMBER (R_RX_DIR8UL, 0x0e) + RELOC_NUMBER (R_RX_DIR8UW, 0x0f) + RELOC_NUMBER (R_RX_DIR32_REV, 0x10) + RELOC_NUMBER (R_RX_DIR16_REV, 0x11) + RELOC_NUMBER (R_RX_DIR3U_PCREL, 0x12) + + /* These are extensions added by Red Hat. */ + RELOC_NUMBER (R_RX_RH_3_PCREL, 0x20) /* Like R_RX_DIR8S_PCREL but only 3-bits. */ + RELOC_NUMBER (R_RX_RH_16_OP, 0x21) /* Like R_RX_DIR16 but for opcodes - always big endian. */ + RELOC_NUMBER (R_RX_RH_24_OP, 0x22) /* Like R_RX_DIR24S but for opcodes - always big endian. */ + RELOC_NUMBER (R_RX_RH_32_OP, 0x23) /* Like R_RX_DIR32 but for opcodes - always big endian. */ + RELOC_NUMBER (R_RX_RH_24_UNS, 0x24) /* Like R_RX_DIR24S but for unsigned values. */ + RELOC_NUMBER (R_RX_RH_8_NEG, 0x25) /* Like R_RX_DIR8 but -x is stored. */ + RELOC_NUMBER (R_RX_RH_16_NEG, 0x26) /* Like R_RX_DIR16 but -x is stored. */ + RELOC_NUMBER (R_RX_RH_24_NEG, 0x27) /* Like R_RX_DIR24S but -x is stored. */ + RELOC_NUMBER (R_RX_RH_32_NEG, 0x28) /* Like R_RX_DIR32 but -x is stored. */ + RELOC_NUMBER (R_RX_RH_DIFF, 0x29) /* Subtract from a previous relocation. */ + RELOC_NUMBER (R_RX_RH_GPRELB, 0x2a) /* Byte value, relative to __gp. */ + RELOC_NUMBER (R_RX_RH_GPRELW, 0x2b) /* Word value, relative to __gp. */ + RELOC_NUMBER (R_RX_RH_GPRELL, 0x2c) /* Long value, relative to __gp. */ + RELOC_NUMBER (R_RX_RH_RELAX, 0x2d) /* Marks opcodes suitable for linker relaxation. */ + + /* These are for complex relocs. */ + RELOC_NUMBER (R_RX_ABS32, 0x41) + RELOC_NUMBER (R_RX_ABS24S, 0x42) + RELOC_NUMBER (R_RX_ABS16, 0x43) + RELOC_NUMBER (R_RX_ABS16U, 0x44) + RELOC_NUMBER (R_RX_ABS16S, 0x45) + RELOC_NUMBER (R_RX_ABS8, 0x46) + RELOC_NUMBER (R_RX_ABS8U, 0x47) + RELOC_NUMBER (R_RX_ABS8S, 0x48) + RELOC_NUMBER (R_RX_ABS24S_PCREL, 0x49) + RELOC_NUMBER (R_RX_ABS16S_PCREL, 0x4a) + RELOC_NUMBER (R_RX_ABS8S_PCREL, 0x4b) + RELOC_NUMBER (R_RX_ABS16UL, 0x4c) + RELOC_NUMBER (R_RX_ABS16UW, 0x4d) + RELOC_NUMBER (R_RX_ABS8UL, 0x4e) + RELOC_NUMBER (R_RX_ABS8UW, 0x4f) + RELOC_NUMBER (R_RX_ABS32_REV, 0x50) + RELOC_NUMBER (R_RX_ABS16_REV, 0x51) + + RELOC_NUMBER (R_RX_SYM, 0x80) + RELOC_NUMBER (R_RX_OPneg, 0x81) + RELOC_NUMBER (R_RX_OPadd, 0x82) + RELOC_NUMBER (R_RX_OPsub, 0x83) + RELOC_NUMBER (R_RX_OPmul, 0x84) + RELOC_NUMBER (R_RX_OPdiv, 0x85) + RELOC_NUMBER (R_RX_OPshla, 0x86) + RELOC_NUMBER (R_RX_OPshra, 0x87) + RELOC_NUMBER (R_RX_OPsctsize, 0x88) + RELOC_NUMBER (R_RX_OPscttop, 0x8d) + RELOC_NUMBER (R_RX_OPand, 0x90) + RELOC_NUMBER (R_RX_OPor, 0x91) + RELOC_NUMBER (R_RX_OPxor, 0x92) + RELOC_NUMBER (R_RX_OPnot, 0x93) + RELOC_NUMBER (R_RX_OPmod, 0x94) + RELOC_NUMBER (R_RX_OPromtop, 0x95) + RELOC_NUMBER (R_RX_OPramtop, 0x96) + +END_RELOC_NUMBERS (R_RX_max) + +#define EF_RX_CPU_RX 0x00000079 /* FIXME: this collides with the E_FLAG_RX_... values below. */ +#define EF_RX_CPU_MASK 0x0000007F /* specific cpu bits. */ +#define EF_RX_ALL_FLAGS (EF_RX_CPU_MASK) + +/* Values for the e_flags field in the ELF header. */ +#define E_FLAG_RX_64BIT_DOUBLES (1 << 0) +#define E_FLAG_RX_DSP (1 << 1) /* Defined in the RX CPU Object file specification, but not explained. */ +#define E_FLAG_RX_PID (1 << 2) /* Unofficial - DJ */ +#define E_FLAG_RX_ABI (1 << 3) /* Binary passes stacked arguments using natural alignment. Unofficial - NC. */ + +#define E_FLAG_RX_SINSNS_SET (1 << 6) /* Set if bit-5 is significant. */ +#define E_FLAG_RX_SINSNS_YES (1 << 7) /* Set if string instructions are used in the binary. */ +#define E_FLAG_RX_SINSNS_NO 0 /* Bit-5 if this binary must not be linked with a string instruction using binary. */ +#define E_FLAG_RX_SINSNS_MASK (3 << 6) /* Mask of bits used to determine string instruction use. */ + +/* These define the addend field of R_RX_RH_RELAX relocations. */ +#define RX_RELAXA_IMM6 0x00000010 /* Imm8/16/24/32 at bit offset 6. */ +#define RX_RELAXA_IMM12 0x00000020 /* Imm8/16/24/32 at bit offset 12. */ +#define RX_RELAXA_DSP4 0x00000040 /* Dsp0/8/16 at bit offset 4. */ +#define RX_RELAXA_DSP6 0x00000080 /* Dsp0/8/16 at bit offset 6. */ +#define RX_RELAXA_DSP14 0x00000100 /* Dsp0/8/16 at bit offset 14. */ +#define RX_RELAXA_BRA 0x00000200 /* Any type of branch (must be decoded). */ +#define RX_RELAXA_RNUM 0x0000000f /* Number of associated relocations. */ +/* These mark the place where alignment is requested, and the place where the filler bytes end. */ +#define RX_RELAXA_ALIGN 0x10000000 /* Start alignment; the remaining bits are the alignment value. */ +#define RX_RELAXA_ELIGN 0x20000000 /* End alignment; the remaining bits are the alignment value. */ +#define RX_RELAXA_ANUM 0x00ffffff /* Alignment amount, in bytes (i.e. .balign). */ + +#endif /* _ELF_RX_H */ diff --git a/include/elf/s390.h b/include/elf/s390.h new file mode 100644 index 0000000..9128f86 --- /dev/null +++ b/include/elf/s390.h @@ -0,0 +1,134 @@ +/* 390 ELF support for BFD. + Copyright 2000, 2001, 2003, 2010 Free Software Foundation, Inc. + Contributed by Carl B. Pedersen and Martin Schwidefsky. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef _ELF_390_H +#define _ELF_390_H + +/* Processor specific flags for the ELF header e_flags field. */ + +/* Symbol types. */ + +#define STACK_REG 15 /* Global Stack reg */ +#define BACKL_REG 14 /* Global Backlink reg */ +#define BASE_REG 13 /* Global Base reg */ +#define GOT_REG 12 /* Holds addr of GOT */ + +#include "elf/reloc-macros.h" + +/* Processor specific flags for the ELF header e_flags field. */ + +#define EF_S390_HIGH_GPRS 0x00000001 + +/* Relocation types. */ + +START_RELOC_NUMBERS (elf_s390_reloc_type) + RELOC_NUMBER (R_390_NONE, 0) /* No reloc. */ + RELOC_NUMBER (R_390_8, 1) /* Direct 8 bit. */ + RELOC_NUMBER (R_390_12, 2) /* Direct 12 bit. */ + RELOC_NUMBER (R_390_16, 3) /* Direct 16 bit. */ + RELOC_NUMBER (R_390_32, 4) /* Direct 32 bit. */ + RELOC_NUMBER (R_390_PC32, 5) /* PC relative 32 bit. */ + RELOC_NUMBER (R_390_GOT12, 6) /* 12 bit GOT offset. */ + RELOC_NUMBER (R_390_GOT32, 7) /* 32 bit GOT offset. */ + RELOC_NUMBER (R_390_PLT32, 8) /* 32 bit PC relative PLT address. */ + RELOC_NUMBER (R_390_COPY, 9) /* Copy symbol at runtime. */ + RELOC_NUMBER (R_390_GLOB_DAT, 10) /* Create GOT entry. */ + RELOC_NUMBER (R_390_JMP_SLOT, 11) /* Create PLT entry. */ + RELOC_NUMBER (R_390_RELATIVE, 12) /* Adjust by program base. */ + RELOC_NUMBER (R_390_GOTOFF32, 13) /* 32 bit offset to GOT. */ + RELOC_NUMBER (R_390_GOTPC, 14) /* 32 bit PC relative offset to GOT. */ + RELOC_NUMBER (R_390_GOT16, 15) /* 16 bit GOT offset. */ + RELOC_NUMBER (R_390_PC16, 16) /* PC relative 16 bit. */ + RELOC_NUMBER (R_390_PC12DBL, 62) /* PC relative 12 bit shifted by 1. */ + RELOC_NUMBER (R_390_PLT12DBL, 63) /* 12 bit PC rel. PLT shifted by 1. */ + RELOC_NUMBER (R_390_PC16DBL, 17) /* PC relative 16 bit shifted by 1. */ + RELOC_NUMBER (R_390_PLT16DBL, 18) /* 16 bit PC rel. PLT shifted by 1. */ + RELOC_NUMBER (R_390_PC24DBL, 64) /* PC relative 24 bit shifted by 1. */ + RELOC_NUMBER (R_390_PLT24DBL, 65) /* 24 bit PC rel. PLT shifted by 1. */ + RELOC_NUMBER (R_390_PC32DBL, 19) /* PC relative 32 bit shifted by 1. */ + RELOC_NUMBER (R_390_PLT32DBL, 20) /* 32 bit PC rel. PLT shifted by 1. */ + RELOC_NUMBER (R_390_GOTPCDBL, 21) /* 32 bit PC rel. GOT shifted by 1. */ + RELOC_NUMBER (R_390_64, 22) /* Direct 64 bit. */ + RELOC_NUMBER (R_390_PC64, 23) /* PC relative 64 bit. */ + RELOC_NUMBER (R_390_GOT64, 24) /* 64 bit GOT offset. */ + RELOC_NUMBER (R_390_PLT64, 25) /* 64 bit PC relative PLT address. */ + RELOC_NUMBER (R_390_GOTENT, 26) /* 32 bit PC rel. to GOT entry >> 1. */ + RELOC_NUMBER (R_390_GOTOFF16, 27) /* 16 bit offset to GOT. */ + RELOC_NUMBER (R_390_GOTOFF64, 28) /* 64 bit offset to GOT. */ + RELOC_NUMBER (R_390_GOTPLT12, 29) /* 12 bit offset to jump slot. */ + RELOC_NUMBER (R_390_GOTPLT16, 30) /* 16 bit offset to jump slot. */ + RELOC_NUMBER (R_390_GOTPLT32, 31) /* 32 bit offset to jump slot. */ + RELOC_NUMBER (R_390_GOTPLT64, 32) /* 64 bit offset to jump slot. */ + RELOC_NUMBER (R_390_GOTPLTENT, 33) /* 32 bit rel. offset to jump slot. */ + RELOC_NUMBER (R_390_PLTOFF16, 34) /* 16 bit offset from GOT to PLT. */ + RELOC_NUMBER (R_390_PLTOFF32, 35) /* 32 bit offset from GOT to PLT. */ + RELOC_NUMBER (R_390_PLTOFF64, 36) /* 16 bit offset from GOT to PLT. */ + RELOC_NUMBER (R_390_TLS_LOAD, 37) /* Tag for load insn in TLS code. */ + RELOC_NUMBER (R_390_TLS_GDCALL, 38) /* Tag for function call in general + dynamic TLS code. */ + RELOC_NUMBER (R_390_TLS_LDCALL, 39) /* Tag for function call in local + dynamic TLS code. */ + RELOC_NUMBER (R_390_TLS_GD32, 40) /* Direct 32 bit for general dynamic + thread local data. */ + RELOC_NUMBER (R_390_TLS_GD64, 41) /* Direct 64 bit for general dynamic + thread local data. */ + RELOC_NUMBER (R_390_TLS_GOTIE12, 42)/* 12 bit GOT offset for static TLS + block offset. */ + RELOC_NUMBER (R_390_TLS_GOTIE32, 43)/* 32 bit GOT offset for static TLS + block offset. */ + RELOC_NUMBER (R_390_TLS_GOTIE64, 44)/* 64 bit GOT offset for static TLS + block offset. */ + RELOC_NUMBER (R_390_TLS_LDM32, 45) /* Direct 32 bit for local dynamic + thread local data in LD code. */ + RELOC_NUMBER (R_390_TLS_LDM64, 46) /* Direct 64 bit for local dynamic + thread local data in LD code. */ + RELOC_NUMBER (R_390_TLS_IE32, 47) /* 32 bit address of GOT entry for + negated static TLS block offset. */ + RELOC_NUMBER (R_390_TLS_IE64, 48) /* 64 bit address of GOT entry for + negated static TLS block offset. */ + RELOC_NUMBER (R_390_TLS_IEENT, 49) /* 32 bit rel. offset to GOT entry for + negated static TLS block offset. */ + RELOC_NUMBER (R_390_TLS_LE32, 50) /* 32 bit negated offset relative to + static TLS block. */ + RELOC_NUMBER (R_390_TLS_LE64, 51) /* 64 bit negated offset relative to + static TLS block. */ + RELOC_NUMBER (R_390_TLS_LDO32, 52) /* 32 bit offset relative to TLS + block. */ + RELOC_NUMBER (R_390_TLS_LDO64, 53) /* 64 bit offset relative to TLS + block. */ + RELOC_NUMBER (R_390_TLS_DTPMOD, 54) /* ID of module containing symbol. */ + RELOC_NUMBER (R_390_TLS_DTPOFF, 55) /* Offset in TLS block. */ + RELOC_NUMBER (R_390_TLS_TPOFF, 56) /* Negate offset in static TLS + block. */ + RELOC_NUMBER (R_390_20, 57) /* Direct 20 bit. */ + RELOC_NUMBER (R_390_GOT20, 58) /* 20 bit GOT offset. */ + RELOC_NUMBER (R_390_GOTPLT20, 59) /* 20 bit offset to jump slot. */ + RELOC_NUMBER (R_390_TLS_GOTIE20, 60)/* 20 bit GOT offset for statis TLS + block offset. */ + RELOC_NUMBER (R_390_IRELATIVE, 61) /* IFUNC relocation. */ + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_390_GNU_VTINHERIT, 250) + RELOC_NUMBER (R_390_GNU_VTENTRY, 251) +END_RELOC_NUMBERS (R_390_max) + +#endif /* _ELF_390_H */ + + diff --git a/include/elf/score.h b/include/elf/score.h new file mode 100644 index 0000000..8d9c026 --- /dev/null +++ b/include/elf/score.h @@ -0,0 +1,130 @@ +/* Score ELF support for BFD. + Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + Contributed by + Brain.lin (brain.lin@sunplusct.com) + Mei Ligang (ligang@sunnorth.com.cn) + Pei-Lin Tsai (pltsai@sunplus.com) + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_SCORE_H +#define _ELF_SCORE_H + +#include "elf/reloc-macros.h" + +#define SCORE_SIMULATOR_ACTIVE 1 +#define OPC_PTMASK 0xc0000000 /* Parity-bit Mask. */ +#define OPC16_PTMASK 0x00008000 +/* The parity-bit denotes. */ +#define OPC_32 0xc0000000 /* Denotes 32b instruction, (default). */ +#define OPC_16 0x00000000 /* Denotes 16b instruction. */ +#define OPC_PE 0x8000 /* Denotes parallel-execution instructions. */ +#define GP_DISP_LABEL "_gp_disp" + +/* Processor specific flags for the ELF header e_flags field: */ +#define EF_SCORE_MACH 0xffff0000 +#define EF_OMIT_PIC_FIXDD 0x0fff0000 +#define E_SCORE_MACH_SCORE3 0x00030000 +#define E_SCORE_MACH_SCORE7 0x00070000 + +/* File contains position independent code. */ +#define EF_SCORE_PIC 0x80000000 + +/* Fix data dependency. */ +#define EF_SCORE_FIXDEP 0x40000000 + +/* Defined and allocated common symbol. Value is virtual address. If + relocated, alignment must be preserved. */ +#define SHN_SCORE_TEXT (SHN_LORESERVE + 1) +#define SHN_SCORE_DATA (SHN_LORESERVE + 2) +/* Small common symbol. */ +#define SHN_SCORE_SCOMMON (SHN_LORESERVE + 3) + +/* Processor specific section flags. */ + +/* This section must be in the global data area. */ +#define SHF_SCORE_GPREL 0x10000000 + +/* This section should be merged. */ +#define SHF_SCORE_MERGE 0x20000000 + +/* This section contains address data of size implied by section + element size. */ +#define SHF_SCORE_ADDR 0x40000000 + +/* This section contains string data. */ +#define SHF_SCORE_STRING 0x80000000 + +/* This section may not be stripped. */ +#define SHF_SCORE_NOSTRIP 0x08000000 + +/* This section is local to threads. */ +#define SHF_SCORE_LOCAL 0x04000000 + +/* Linker should generate implicit weak names for this section. */ +#define SHF_SCORE_NAMES 0x02000000 + +/* Section contais text/data which may be replicated in other sections. + Linker should retain only one copy. */ +#define SHF_SCORE_NODUPES 0x01000000 + +/* Processor specific dynamic array tags. */ + +/* Base address of the segment. */ +#define DT_SCORE_BASE_ADDRESS 0x70000001 +/* Number of local global offset table entries. */ +#define DT_SCORE_LOCAL_GOTNO 0x70000002 +/* Number of entries in the .dynsym section. */ +#define DT_SCORE_SYMTABNO 0x70000003 +/* Index of first dynamic symbol in global offset table. */ +#define DT_SCORE_GOTSYM 0x70000004 +/* Index of first external dynamic symbol not referenced locally. */ +#define DT_SCORE_UNREFEXTNO 0x70000005 +/* Number of page table entries in global offset table. */ +#define DT_SCORE_HIPAGENO 0x70000006 + + +/* Processor specific section types. */ + + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_score_reloc_type) + RELOC_NUMBER (R_SCORE_NONE, 0) + RELOC_NUMBER (R_SCORE_HI16, 1) + RELOC_NUMBER (R_SCORE_LO16, 2) + RELOC_NUMBER (R_SCORE_BCMP, 3) + RELOC_NUMBER (R_SCORE_24, 4) + RELOC_NUMBER (R_SCORE_PC19, 5) + RELOC_NUMBER (R_SCORE16_11, 6) + RELOC_NUMBER (R_SCORE16_PC8, 7) + RELOC_NUMBER (R_SCORE_ABS32, 8) + RELOC_NUMBER (R_SCORE_ABS16, 9) + RELOC_NUMBER (R_SCORE_DUMMY2, 10) + RELOC_NUMBER (R_SCORE_GP15, 11) + RELOC_NUMBER (R_SCORE_GNU_VTINHERIT, 12) + RELOC_NUMBER (R_SCORE_GNU_VTENTRY, 13) + RELOC_NUMBER (R_SCORE_GOT15, 14) + RELOC_NUMBER (R_SCORE_GOT_LO16, 15) + RELOC_NUMBER (R_SCORE_CALL15, 16) + RELOC_NUMBER (R_SCORE_GPREL32, 17) + RELOC_NUMBER (R_SCORE_REL32, 18) + RELOC_NUMBER (R_SCORE_DUMMY_HI16, 19) + RELOC_NUMBER (R_SCORE_IMM30, 20) + RELOC_NUMBER (R_SCORE_IMM32, 21) +END_RELOC_NUMBERS (R_SCORE_max) + +#endif /* _ELF_SCORE_H */ diff --git a/include/elf/sh.h b/include/elf/sh.h new file mode 100644 index 0000000..c2bd50d --- /dev/null +++ b/include/elf/sh.h @@ -0,0 +1,250 @@ +/* SH ELF support for BFD. + Copyright 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_SH_H +#define _ELF_SH_H + +/* Processor specific flags for the ELF header e_flags field. */ + +#define EF_SH_MACH_MASK 0x1f +#define EF_SH_UNKNOWN 0 /* For backwards compatibility. */ +#define EF_SH1 1 +#define EF_SH2 2 +#define EF_SH3 3 +#define EF_SH_DSP 4 +#define EF_SH3_DSP 5 +#define EF_SH4AL_DSP 6 +#define EF_SH3E 8 +#define EF_SH4 9 +#define EF_SH2E 11 +#define EF_SH4A 12 +#define EF_SH2A 13 + +#define EF_SH4_NOFPU 16 +#define EF_SH4A_NOFPU 17 +#define EF_SH4_NOMMU_NOFPU 18 +#define EF_SH2A_NOFPU 19 +#define EF_SH3_NOMMU 20 + +#define EF_SH2A_SH4_NOFPU 21 +#define EF_SH2A_SH3_NOFPU 22 +#define EF_SH2A_SH4 23 +#define EF_SH2A_SH3E 24 + +/* This one can only mix in objects from other EF_SH5 objects. */ +#define EF_SH5 10 + +/* Define the mapping from ELF to bfd mach numbers. + bfd_mach_* are defined in bfd_in2.h (generated from + archures.c). */ +#define EF_SH_BFD_TABLE \ +/* EF_SH_UNKNOWN */ bfd_mach_sh , \ +/* EF_SH1 */ bfd_mach_sh , \ +/* EF_SH2 */ bfd_mach_sh2 , \ +/* EF_SH3 */ bfd_mach_sh3 , \ +/* EF_SH_DSP */ bfd_mach_sh_dsp , \ +/* EF_SH3_DSP */ bfd_mach_sh3_dsp , \ +/* EF_SHAL_DSP */ bfd_mach_sh4al_dsp , \ +/* 7 */ 0, \ +/* EF_SH3E */ bfd_mach_sh3e , \ +/* EF_SH4 */ bfd_mach_sh4 , \ +/* EF_SH5 */ 0, \ +/* EF_SH2E */ bfd_mach_sh2e , \ +/* EF_SH4A */ bfd_mach_sh4a , \ +/* EF_SH2A */ bfd_mach_sh2a , \ +/* 14, 15 */ 0, 0, \ +/* EF_SH4_NOFPU */ bfd_mach_sh4_nofpu , \ +/* EF_SH4A_NOFPU */ bfd_mach_sh4a_nofpu , \ +/* EF_SH4_NOMMU_NOFPU */ bfd_mach_sh4_nommu_nofpu, \ +/* EF_SH2A_NOFPU */ bfd_mach_sh2a_nofpu , \ +/* EF_SH3_NOMMU */ bfd_mach_sh3_nommu , \ +/* EF_SH2A_SH4_NOFPU */ bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, \ +/* EF_SH2A_SH3_NOFPU */ bfd_mach_sh2a_nofpu_or_sh3_nommu, \ +/* EF_SH2A_SH4 */ bfd_mach_sh2a_or_sh4 , \ +/* EF_SH2A_SH3E */ bfd_mach_sh2a_or_sh3e + +/* Convert arch_sh* into EF_SH*. */ +int sh_find_elf_flags (unsigned int arch_set); + +/* Convert bfd_mach_* into EF_SH*. */ +int sh_elf_get_flags_from_mach (unsigned long mach); + +/* Other e_flags bits. */ + +#define EF_SH_PIC 0x100 /* Segments of an FDPIC binary may + be relocated independently. */ +#define EF_SH_FDPIC 0x8000 /* Uses the FDPIC ABI. */ + +/* Flags for the st_other symbol field. + Keep away from the STV_ visibility flags (bit 0..1). */ + +/* A reference to this symbol should by default add 1. */ +#define STO_SH5_ISA32 (1 << 2) + +/* Section contains only SHmedia code (no SHcompact code). */ +#define SHF_SH5_ISA32 0x40000000 + +/* Section contains both SHmedia and SHcompact code, and possibly also + constants. */ +#define SHF_SH5_ISA32_MIXED 0x20000000 + +/* If applied to a .cranges section, marks that the section is sorted by + increasing cr_addr values. */ +#define SHT_SH5_CR_SORTED 0x80000001 + +/* Symbol should be handled as DataLabel (attached to global SHN_UNDEF + symbols). */ +#define STT_DATALABEL STT_LOPROC + +#include "elf/reloc-macros.h" + +/* Relocations. */ +/* Relocations 10-32 and 128-255 are GNU extensions. + 25..32 and 10 are used for relaxation. */ +START_RELOC_NUMBERS (elf_sh_reloc_type) + RELOC_NUMBER (R_SH_NONE, 0) + RELOC_NUMBER (R_SH_DIR32, 1) + RELOC_NUMBER (R_SH_REL32, 2) + RELOC_NUMBER (R_SH_DIR8WPN, 3) + RELOC_NUMBER (R_SH_IND12W, 4) + RELOC_NUMBER (R_SH_DIR8WPL, 5) + RELOC_NUMBER (R_SH_DIR8WPZ, 6) + RELOC_NUMBER (R_SH_DIR8BP, 7) + RELOC_NUMBER (R_SH_DIR8W, 8) + RELOC_NUMBER (R_SH_DIR8L, 9) + + RELOC_NUMBER (R_SH_LOOP_START, 10) + RELOC_NUMBER (R_SH_LOOP_END, 11) + + FAKE_RELOC (R_SH_FIRST_INVALID_RELOC, 12) + FAKE_RELOC (R_SH_LAST_INVALID_RELOC, 21) + + RELOC_NUMBER (R_SH_GNU_VTINHERIT, 22) + RELOC_NUMBER (R_SH_GNU_VTENTRY, 23) + RELOC_NUMBER (R_SH_SWITCH8, 24) + RELOC_NUMBER (R_SH_SWITCH16, 25) + RELOC_NUMBER (R_SH_SWITCH32, 26) + RELOC_NUMBER (R_SH_USES, 27) + RELOC_NUMBER (R_SH_COUNT, 28) + RELOC_NUMBER (R_SH_ALIGN, 29) + RELOC_NUMBER (R_SH_CODE, 30) + RELOC_NUMBER (R_SH_DATA, 31) + RELOC_NUMBER (R_SH_LABEL, 32) + + RELOC_NUMBER (R_SH_DIR16, 33) + RELOC_NUMBER (R_SH_DIR8, 34) + RELOC_NUMBER (R_SH_DIR8UL, 35) + RELOC_NUMBER (R_SH_DIR8UW, 36) + RELOC_NUMBER (R_SH_DIR8U, 37) + RELOC_NUMBER (R_SH_DIR8SW, 38) + RELOC_NUMBER (R_SH_DIR8S, 39) + RELOC_NUMBER (R_SH_DIR4UL, 40) + RELOC_NUMBER (R_SH_DIR4UW, 41) + RELOC_NUMBER (R_SH_DIR4U, 42) + RELOC_NUMBER (R_SH_PSHA, 43) + RELOC_NUMBER (R_SH_PSHL, 44) + RELOC_NUMBER (R_SH_DIR5U, 45) + RELOC_NUMBER (R_SH_DIR6U, 46) + RELOC_NUMBER (R_SH_DIR6S, 47) + RELOC_NUMBER (R_SH_DIR10S, 48) + RELOC_NUMBER (R_SH_DIR10SW, 49) + RELOC_NUMBER (R_SH_DIR10SL, 50) + RELOC_NUMBER (R_SH_DIR10SQ, 51) + FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_2, 52) + FAKE_RELOC (R_SH_LAST_INVALID_RELOC_2, 52) + RELOC_NUMBER (R_SH_DIR16S, 53) + FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_3, 54) + FAKE_RELOC (R_SH_LAST_INVALID_RELOC_3, 143) + RELOC_NUMBER (R_SH_TLS_GD_32, 144) + RELOC_NUMBER (R_SH_TLS_LD_32, 145) + RELOC_NUMBER (R_SH_TLS_LDO_32, 146) + RELOC_NUMBER (R_SH_TLS_IE_32, 147) + RELOC_NUMBER (R_SH_TLS_LE_32, 148) + RELOC_NUMBER (R_SH_TLS_DTPMOD32, 149) + RELOC_NUMBER (R_SH_TLS_DTPOFF32, 150) + RELOC_NUMBER (R_SH_TLS_TPOFF32, 151) + FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_4, 152) + FAKE_RELOC (R_SH_LAST_INVALID_RELOC_4, 159) + RELOC_NUMBER (R_SH_GOT32, 160) + RELOC_NUMBER (R_SH_PLT32, 161) + RELOC_NUMBER (R_SH_COPY, 162) + RELOC_NUMBER (R_SH_GLOB_DAT, 163) + RELOC_NUMBER (R_SH_JMP_SLOT, 164) + RELOC_NUMBER (R_SH_RELATIVE, 165) + RELOC_NUMBER (R_SH_GOTOFF, 166) + RELOC_NUMBER (R_SH_GOTPC, 167) + RELOC_NUMBER (R_SH_GOTPLT32, 168) + RELOC_NUMBER (R_SH_GOT_LOW16, 169) + RELOC_NUMBER (R_SH_GOT_MEDLOW16, 170) + RELOC_NUMBER (R_SH_GOT_MEDHI16, 171) + RELOC_NUMBER (R_SH_GOT_HI16, 172) + RELOC_NUMBER (R_SH_GOTPLT_LOW16, 173) + RELOC_NUMBER (R_SH_GOTPLT_MEDLOW16, 174) + RELOC_NUMBER (R_SH_GOTPLT_MEDHI16, 175) + RELOC_NUMBER (R_SH_GOTPLT_HI16, 176) + RELOC_NUMBER (R_SH_PLT_LOW16, 177) + RELOC_NUMBER (R_SH_PLT_MEDLOW16, 178) + RELOC_NUMBER (R_SH_PLT_MEDHI16, 179) + RELOC_NUMBER (R_SH_PLT_HI16, 180) + RELOC_NUMBER (R_SH_GOTOFF_LOW16, 181) + RELOC_NUMBER (R_SH_GOTOFF_MEDLOW16, 182) + RELOC_NUMBER (R_SH_GOTOFF_MEDHI16, 183) + RELOC_NUMBER (R_SH_GOTOFF_HI16, 184) + RELOC_NUMBER (R_SH_GOTPC_LOW16, 185) + RELOC_NUMBER (R_SH_GOTPC_MEDLOW16, 186) + RELOC_NUMBER (R_SH_GOTPC_MEDHI16, 187) + RELOC_NUMBER (R_SH_GOTPC_HI16, 188) + RELOC_NUMBER (R_SH_GOT10BY4, 189) + RELOC_NUMBER (R_SH_GOTPLT10BY4, 190) + RELOC_NUMBER (R_SH_GOT10BY8, 191) + RELOC_NUMBER (R_SH_GOTPLT10BY8, 192) + RELOC_NUMBER (R_SH_COPY64, 193) + RELOC_NUMBER (R_SH_GLOB_DAT64, 194) + RELOC_NUMBER (R_SH_JMP_SLOT64, 195) + RELOC_NUMBER (R_SH_RELATIVE64, 196) + FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_5, 197) + FAKE_RELOC (R_SH_LAST_INVALID_RELOC_5, 200) + RELOC_NUMBER (R_SH_GOT20, 201) + RELOC_NUMBER (R_SH_GOTOFF20, 202) + RELOC_NUMBER (R_SH_GOTFUNCDESC, 203) + RELOC_NUMBER (R_SH_GOTFUNCDESC20, 204) + RELOC_NUMBER (R_SH_GOTOFFFUNCDESC, 205) + RELOC_NUMBER (R_SH_GOTOFFFUNCDESC20, 206) + RELOC_NUMBER (R_SH_FUNCDESC, 207) + RELOC_NUMBER (R_SH_FUNCDESC_VALUE, 208) + FAKE_RELOC (R_SH_FIRST_INVALID_RELOC_6, 209) + FAKE_RELOC (R_SH_LAST_INVALID_RELOC_6, 241) + RELOC_NUMBER (R_SH_SHMEDIA_CODE, 242) + RELOC_NUMBER (R_SH_PT_16, 243) + RELOC_NUMBER (R_SH_IMMS16, 244) + RELOC_NUMBER (R_SH_IMMU16, 245) + RELOC_NUMBER (R_SH_IMM_LOW16, 246) + RELOC_NUMBER (R_SH_IMM_LOW16_PCREL, 247) + RELOC_NUMBER (R_SH_IMM_MEDLOW16, 248) + RELOC_NUMBER (R_SH_IMM_MEDLOW16_PCREL, 249) + RELOC_NUMBER (R_SH_IMM_MEDHI16, 250) + RELOC_NUMBER (R_SH_IMM_MEDHI16_PCREL, 251) + RELOC_NUMBER (R_SH_IMM_HI16, 252) + RELOC_NUMBER (R_SH_IMM_HI16_PCREL, 253) + RELOC_NUMBER (R_SH_64, 254) + RELOC_NUMBER (R_SH_64_PCREL, 255) +END_RELOC_NUMBERS (R_SH_max) + +#endif diff --git a/include/elf/sparc.h b/include/elf/sparc.h new file mode 100644 index 0000000..d182f4d --- /dev/null +++ b/include/elf/sparc.h @@ -0,0 +1,231 @@ +/* SPARC ELF support for BFD. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2008, 2010, + 2011 + Free Software Foundation, Inc. + By Doug Evans, Cygnus Support, . + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_SPARC_H +#define _ELF_SPARC_H + +/* Processor specific flags for the ELF header e_flags field. */ + +/* These are defined by Sun. */ + +#define EF_SPARC_32PLUS_MASK 0xffff00 /* bits indicating V8+ type */ +#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ +#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ +#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ +#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ + +#define EF_SPARC_LEDATA 0x800000 /* little endian data */ + +/* This name is used in the V9 ABI. */ +#define EF_SPARC_EXT_MASK 0xffff00 /* reserved for vendor extensions */ + +/* V9 memory models */ +#define EF_SPARCV9_MM 0x3 /* memory model mask */ +#define EF_SPARCV9_TSO 0x0 /* total store ordering */ +#define EF_SPARCV9_PSO 0x1 /* partial store ordering */ +#define EF_SPARCV9_RMO 0x2 /* relaxed store ordering */ + +/* Section indices. */ + +#define SHN_BEFORE SHN_LORESERVE /* Used with SHF_ORDERED and... */ +#define SHN_AFTER (SHN_LORESERVE + 1) /* SHF_LINK_ORDER section flags. */ + +/* Section flags. */ + +#define SHF_ORDERED 0x40000000 /* treat sh_link,sh_info specially */ + +/* Symbol types. */ + +#define STT_REGISTER 13 /* global reg reserved to app. */ + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_sparc_reloc_type) + RELOC_NUMBER (R_SPARC_NONE, 0) + RELOC_NUMBER (R_SPARC_8, 1) + RELOC_NUMBER (R_SPARC_16, 2) + RELOC_NUMBER (R_SPARC_32, 3) + RELOC_NUMBER (R_SPARC_DISP8, 4) + RELOC_NUMBER (R_SPARC_DISP16, 5) + RELOC_NUMBER (R_SPARC_DISP32, 6) + RELOC_NUMBER (R_SPARC_WDISP30, 7) + RELOC_NUMBER (R_SPARC_WDISP22, 8) + RELOC_NUMBER (R_SPARC_HI22, 9) + RELOC_NUMBER (R_SPARC_22, 10) + RELOC_NUMBER (R_SPARC_13, 11) + RELOC_NUMBER (R_SPARC_LO10, 12) + RELOC_NUMBER (R_SPARC_GOT10, 13) + RELOC_NUMBER (R_SPARC_GOT13, 14) + RELOC_NUMBER (R_SPARC_GOT22, 15) + RELOC_NUMBER (R_SPARC_PC10, 16) + RELOC_NUMBER (R_SPARC_PC22, 17) + RELOC_NUMBER (R_SPARC_WPLT30, 18) + RELOC_NUMBER (R_SPARC_COPY, 19) + RELOC_NUMBER (R_SPARC_GLOB_DAT, 20) + RELOC_NUMBER (R_SPARC_JMP_SLOT, 21) + RELOC_NUMBER (R_SPARC_RELATIVE, 22) + RELOC_NUMBER (R_SPARC_UA32, 23) + + /* ??? These 6 relocs are new but not currently used. For binary + compatibility in the sparc64-elf toolchain, we leave them out. + A non-binary upward compatible change is expected for sparc64-elf. */ +#ifndef SPARC64_OLD_RELOCS + /* ??? New relocs on the UltraSPARC. Not sure what they're for yet. */ + RELOC_NUMBER (R_SPARC_PLT32, 24) + RELOC_NUMBER (R_SPARC_HIPLT22, 25) + RELOC_NUMBER (R_SPARC_LOPLT10, 26) + RELOC_NUMBER (R_SPARC_PCPLT32, 27) + RELOC_NUMBER (R_SPARC_PCPLT22, 28) + RELOC_NUMBER (R_SPARC_PCPLT10, 29) +#endif + + /* v9 relocs */ + RELOC_NUMBER (R_SPARC_10, 30) + RELOC_NUMBER (R_SPARC_11, 31) + RELOC_NUMBER (R_SPARC_64, 32) + RELOC_NUMBER (R_SPARC_OLO10, 33) + RELOC_NUMBER (R_SPARC_HH22, 34) + RELOC_NUMBER (R_SPARC_HM10, 35) + RELOC_NUMBER (R_SPARC_LM22, 36) + RELOC_NUMBER (R_SPARC_PC_HH22, 37) + RELOC_NUMBER (R_SPARC_PC_HM10, 38) + RELOC_NUMBER (R_SPARC_PC_LM22, 39) + RELOC_NUMBER (R_SPARC_WDISP16, 40) + RELOC_NUMBER (R_SPARC_WDISP19, 41) + RELOC_NUMBER (R_SPARC_UNUSED_42, 42) + RELOC_NUMBER (R_SPARC_7, 43) + RELOC_NUMBER (R_SPARC_5, 44) + RELOC_NUMBER (R_SPARC_6, 45) + RELOC_NUMBER (R_SPARC_DISP64, 46) + RELOC_NUMBER (R_SPARC_PLT64, 47) + RELOC_NUMBER (R_SPARC_HIX22, 48) + RELOC_NUMBER (R_SPARC_LOX10, 49) + RELOC_NUMBER (R_SPARC_H44, 50) + RELOC_NUMBER (R_SPARC_M44, 51) + RELOC_NUMBER (R_SPARC_L44, 52) + RELOC_NUMBER (R_SPARC_REGISTER, 53) + RELOC_NUMBER (R_SPARC_UA64, 54) + RELOC_NUMBER (R_SPARC_UA16, 55) + + RELOC_NUMBER (R_SPARC_TLS_GD_HI22, 56) + RELOC_NUMBER (R_SPARC_TLS_GD_LO10, 57) + RELOC_NUMBER (R_SPARC_TLS_GD_ADD, 58) + RELOC_NUMBER (R_SPARC_TLS_GD_CALL, 59) + RELOC_NUMBER (R_SPARC_TLS_LDM_HI22, 60) + RELOC_NUMBER (R_SPARC_TLS_LDM_LO10, 61) + RELOC_NUMBER (R_SPARC_TLS_LDM_ADD, 62) + RELOC_NUMBER (R_SPARC_TLS_LDM_CALL, 63) + RELOC_NUMBER (R_SPARC_TLS_LDO_HIX22, 64) + RELOC_NUMBER (R_SPARC_TLS_LDO_LOX10, 65) + RELOC_NUMBER (R_SPARC_TLS_LDO_ADD, 66) + RELOC_NUMBER (R_SPARC_TLS_IE_HI22, 67) + RELOC_NUMBER (R_SPARC_TLS_IE_LO10, 68) + RELOC_NUMBER (R_SPARC_TLS_IE_LD, 69) + RELOC_NUMBER (R_SPARC_TLS_IE_LDX, 70) + RELOC_NUMBER (R_SPARC_TLS_IE_ADD, 71) + RELOC_NUMBER (R_SPARC_TLS_LE_HIX22, 72) + RELOC_NUMBER (R_SPARC_TLS_LE_LOX10, 73) + RELOC_NUMBER (R_SPARC_TLS_DTPMOD32, 74) + RELOC_NUMBER (R_SPARC_TLS_DTPMOD64, 75) + RELOC_NUMBER (R_SPARC_TLS_DTPOFF32, 76) + RELOC_NUMBER (R_SPARC_TLS_DTPOFF64, 77) + RELOC_NUMBER (R_SPARC_TLS_TPOFF32, 78) + RELOC_NUMBER (R_SPARC_TLS_TPOFF64, 79) + + RELOC_NUMBER (R_SPARC_GOTDATA_HIX22, 80) + RELOC_NUMBER (R_SPARC_GOTDATA_LOX10, 81) + RELOC_NUMBER (R_SPARC_GOTDATA_OP_HIX22, 82) + RELOC_NUMBER (R_SPARC_GOTDATA_OP_LOX10, 83) + RELOC_NUMBER (R_SPARC_GOTDATA_OP, 84) + + RELOC_NUMBER (R_SPARC_H34, 85) + RELOC_NUMBER (R_SPARC_SIZE32, 86) + RELOC_NUMBER (R_SPARC_SIZE64, 87) + RELOC_NUMBER (R_SPARC_WDISP10, 88) + + EMPTY_RELOC (R_SPARC_max_std) + + RELOC_NUMBER (R_SPARC_JMP_IREL, 248) + RELOC_NUMBER (R_SPARC_IRELATIVE, 249) + RELOC_NUMBER (R_SPARC_GNU_VTINHERIT, 250) + RELOC_NUMBER (R_SPARC_GNU_VTENTRY, 251) + RELOC_NUMBER (R_SPARC_REV32, 252) + +END_RELOC_NUMBERS (R_SPARC_max) + +/* Relocation macros. */ + +#define ELF64_R_TYPE_DATA(info) \ + (((bfd_signed_vma)(ELF64_R_TYPE(info) >> 8) ^ 0x800000) - 0x800000) +#define ELF64_R_TYPE_ID(info) \ + ((info) & 0xff) +#define ELF64_R_TYPE_INFO(data, type) \ + (((bfd_vma) ((data) & 0xffffff) << 8) | (bfd_vma) (type)) + +/* Values for Elf64_Dyn.d_tag. */ + +#define DT_SPARC_REGISTER 0x70000001 + +/* Object attribute tags. */ +enum +{ + /* 0-3 are generic. */ + Tag_GNU_Sparc_HWCAPS = 4, +}; + +/* These values match the AV_SPARC_* hwcap bits defined under Solaris. */ +#define ELF_SPARC_HWCAP_MUL32 0x00000001 /* umul/umulcc/smul/smulcc insns */ +#define ELF_SPARC_HWCAP_DIV32 0x00000002 /* udiv/udivcc/sdiv/sdivcc insns */ +#define ELF_SPARC_HWCAP_FSMULD 0x00000004 /* 'fsmuld' insn */ +#define ELF_SPARC_HWCAP_V8PLUS 0x00000008 /* v9 insns available to 32bit */ +#define ELF_SPARC_HWCAP_POPC 0x00000010 /* 'popc' insn */ +#define ELF_SPARC_HWCAP_VIS 0x00000020 /* VIS insns */ +#define ELF_SPARC_HWCAP_VIS2 0x00000040 /* VIS2 insns */ +#define ELF_SPARC_HWCAP_ASI_BLK_INIT \ + 0x00000080 /* block init ASIs */ +#define ELF_SPARC_HWCAP_FMAF 0x00000100 /* fused multiply-add */ +#define ELF_SPARC_HWCAP_VIS3 0x00000400 /* VIS3 insns */ +#define ELF_SPARC_HWCAP_HPC 0x00000800 /* HPC insns */ +#define ELF_SPARC_HWCAP_RANDOM 0x00001000 /* 'random' insn */ +#define ELF_SPARC_HWCAP_TRANS 0x00002000 /* transaction insns */ +#define ELF_SPARC_HWCAP_FJFMAU 0x00004000 /* unfused multiply-add */ +#define ELF_SPARC_HWCAP_IMA 0x00008000 /* integer multiply-add */ +#define ELF_SPARC_HWCAP_ASI_CACHE_SPARING \ + 0x00010000 /* cache sparing ASIs */ +#define ELF_SPARC_HWCAP_AES 0x00020000 /* AES crypto insns */ +#define ELF_SPARC_HWCAP_DES 0x00040000 /* DES crypto insns */ +#define ELF_SPARC_HWCAP_KASUMI 0x00080000 /* KASUMI crypto insns */ +#define ELF_SPARC_HWCAP_CAMELLIA \ + 0x00100000 /* CAMELLIA crypto insns */ +#define ELF_SPARC_HWCAP_MD5 0x00200000 /* MD5 hashing insns */ +#define ELF_SPARC_HWCAP_SHA1 0x00400000 /* SHA1 hashing insns */ +#define ELF_SPARC_HWCAP_SHA256 0x00800000 /* SHA256 hashing insns */ +#define ELF_SPARC_HWCAP_SHA512 0x01000000 /* SHA512 hashing insns */ +#define ELF_SPARC_HWCAP_MPMUL 0x02000000 /* Multiple Precision Multiply */ +#define ELF_SPARC_HWCAP_MONT 0x04000000 /* Montgomery Mult/Sqrt */ +#define ELF_SPARC_HWCAP_PAUSE 0x08000000 /* Pause insn */ +#define ELF_SPARC_HWCAP_CBCOND 0x10000000 /* Compare and Branch insns */ +#define ELF_SPARC_HWCAP_CRC32C 0x20000000 /* CRC32C insn */ + +#endif /* _ELF_SPARC_H */ diff --git a/include/elf/spu.h b/include/elf/spu.h new file mode 100644 index 0000000..0618ec8 --- /dev/null +++ b/include/elf/spu.h @@ -0,0 +1,61 @@ +/* SPU ELF support for BFD. + + Copyright 2006, 2007, 2009, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_SPU_H +#define _ELF_SPU_H + +#include "elf/reloc-macros.h" + +/* elf32-spu.c depends on these being consecutive. */ +START_RELOC_NUMBERS (elf_spu_reloc_type) + RELOC_NUMBER (R_SPU_NONE, 0) + RELOC_NUMBER (R_SPU_ADDR10, 1) + RELOC_NUMBER (R_SPU_ADDR16, 2) + RELOC_NUMBER (R_SPU_ADDR16_HI, 3) + RELOC_NUMBER (R_SPU_ADDR16_LO, 4) + RELOC_NUMBER (R_SPU_ADDR18, 5) + RELOC_NUMBER (R_SPU_ADDR32, 6) + RELOC_NUMBER (R_SPU_REL16, 7) + RELOC_NUMBER (R_SPU_ADDR7, 8) + RELOC_NUMBER (R_SPU_REL9, 9) + RELOC_NUMBER (R_SPU_REL9I, 10) + RELOC_NUMBER (R_SPU_ADDR10I, 11) + RELOC_NUMBER (R_SPU_ADDR16I, 12) + RELOC_NUMBER (R_SPU_REL32, 13) + RELOC_NUMBER (R_SPU_ADDR16X, 14) + RELOC_NUMBER (R_SPU_PPU32, 15) + RELOC_NUMBER (R_SPU_PPU64, 16) + RELOC_NUMBER (R_SPU_ADD_PIC, 17) +END_RELOC_NUMBERS (R_SPU_max) + +/* Program header extensions */ + +/* Mark a PT_LOAD segment as containing an overlay which should not + initially be loaded. */ +#define PF_OVERLAY (1 << 27) + +/* SPU Dynamic Object Information. */ +#define PT_SPU_INFO 0x70000000 + +/* SPU plugin information */ +#define SPU_PLUGIN_NAME "SPUNAME" +#define SPU_PTNOTE_SPUNAME ".note.spu_name" + +#endif /* _ELF_SPU_H */ diff --git a/include/elf/tic6x-attrs.h b/include/elf/tic6x-attrs.h new file mode 100644 index 0000000..21ce1e4 --- /dev/null +++ b/include/elf/tic6x-attrs.h @@ -0,0 +1,35 @@ +/* TI C6X ELF attributes. + Copyright 2010 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Define the TAG macro before including this file; it takes a tag + name and value. */ + +TAG(Tag_ISA, 4) +TAG(Tag_ABI_wchar_t, 6) +TAG(Tag_ABI_stack_align_needed, 8) +TAG(Tag_ABI_stack_align_preserved, 10) +TAG(Tag_ABI_DSBT, 12) +TAG(Tag_ABI_PID, 14) +TAG(Tag_ABI_PIC, 16) +TAG(Tag_ABI_array_object_alignment, 18) +TAG(Tag_ABI_array_object_align_expected, 20) +TAG(Tag_ABI_compatibility, 32) +TAG(Tag_ABI_conformance, 67) diff --git a/include/elf/tic6x.h b/include/elf/tic6x.h new file mode 100644 index 0000000..e686cc3 --- /dev/null +++ b/include/elf/tic6x.h @@ -0,0 +1,167 @@ +/* TI C6X ELF support for BFD. + Copyright 2010, 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_TIC6X_H +#define _ELF_TIC6X_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_tic6x_reloc_type) + RELOC_NUMBER (R_C6000_NONE, 0) + RELOC_NUMBER (R_C6000_ABS32, 1) + RELOC_NUMBER (R_C6000_ABS16, 2) + RELOC_NUMBER (R_C6000_ABS8, 3) + RELOC_NUMBER (R_C6000_PCR_S21, 4) + RELOC_NUMBER (R_C6000_PCR_S12, 5) + RELOC_NUMBER (R_C6000_PCR_S10, 6) + RELOC_NUMBER (R_C6000_PCR_S7, 7) + RELOC_NUMBER (R_C6000_ABS_S16, 8) + RELOC_NUMBER (R_C6000_ABS_L16, 9) + RELOC_NUMBER (R_C6000_ABS_H16, 10) + RELOC_NUMBER (R_C6000_SBR_U15_B, 11) + RELOC_NUMBER (R_C6000_SBR_U15_H, 12) + RELOC_NUMBER (R_C6000_SBR_U15_W, 13) + RELOC_NUMBER (R_C6000_SBR_S16, 14) + RELOC_NUMBER (R_C6000_SBR_L16_B, 15) + RELOC_NUMBER (R_C6000_SBR_L16_H, 16) + RELOC_NUMBER (R_C6000_SBR_L16_W, 17) + RELOC_NUMBER (R_C6000_SBR_H16_B, 18) + RELOC_NUMBER (R_C6000_SBR_H16_H, 19) + RELOC_NUMBER (R_C6000_SBR_H16_W, 20) + RELOC_NUMBER (R_C6000_SBR_GOT_U15_W, 21) + RELOC_NUMBER (R_C6000_SBR_GOT_L16_W, 22) + RELOC_NUMBER (R_C6000_SBR_GOT_H16_W, 23) + RELOC_NUMBER (R_C6000_DSBT_INDEX, 24) + RELOC_NUMBER (R_C6000_PREL31, 25) + RELOC_NUMBER (R_C6000_COPY, 26) + RELOC_NUMBER (R_C6000_JUMP_SLOT, 27) + RELOC_NUMBER (R_C6000_EHTYPE, 28) + RELOC_NUMBER (R_C6000_PCR_H16, 29) + RELOC_NUMBER (R_C6000_PCR_L16, 30) + RELOC_NUMBER (R_C6000_ALIGN, 253) + RELOC_NUMBER (R_C6000_FPHEAD, 254) + RELOC_NUMBER (R_C6000_NOCMP, 255) +END_RELOC_NUMBERS (R_TIC6X_max) + +/* Processor-specific flags. */ + +/* File contains static relocation information. */ +#define EF_C6000_REL 0x1 + +/* Processor-specific section types. */ + +/* Unwind function table for stack unwinding. */ +#define SHT_C6000_UNWIND 0x70000001 + +/* DLL dynamic linking pre-emption map. */ +#define SHT_C6000_PREEMPTMAP 0x70000002 + +/* Object file compatibility attributes. */ +#define SHT_C6000_ATTRIBUTES 0x70000003 + +/* Intermediate code for link-time optimization. */ +#define SHT_TI_ICODE 0x7F000000 + +/* Symbolic cross reference information. */ +#define SHT_TI_XREF 0x7F000001 + +/* Reserved. */ +#define SHT_TI_HANDLER 0x7F000002 + +/* Compressed data for initializing C variables. */ +#define SHT_TI_INITINFO 0x7F000003 + +/* Extended program header attributes. */ +#define SHT_TI_PHATTRS 0x7F000004 + +/* Processor specific section indices. These sections do not actually + exist. Symbols with a st_shndx field corresponding to one of these + values have a special meaning. */ + +/* Small data area common symbol. */ +#define SHN_TIC6X_SCOMMON SHN_LORESERVE + +/* Processor-specific segment types. */ + +/* Extended Segment Attributes. */ +#define PT_C6000_PHATTR 0x70000000 + +/* Processor-specific dynamic tags. */ + +/* Undocumented. */ +#define DT_C6000_GSYM_OFFSET 0x6000000D + +/* Undocumented. */ +#define DT_C6000_GSTR_OFFSET 0x6000000F + +/* Statically linked base address of data segment. */ +#define DT_C6000_DSBT_BASE 0x70000000 + +/* Number of entries in this module's DSBT. */ +#define DT_C6000_DSBT_SIZE 0x70000001 + +/* Undocumented. */ +#define DT_C6000_PREEMPTMAP 0x70000002 + +/* The hard-coded DSBT index for this module, if any. */ +#define DT_C6000_DSBT_INDEX 0x70000003 + +/* Extended program header attributes. */ + +/* Terminate a segment. */ +#define PHA_NULL 0x0 + +/* Segment's address bound to the final address. */ +#define PHA_BOUND 0x1 + +/* Segment cannot be further relocated. */ +#define PHA_READONLY 0x2 + +/* Build attributes. */ +enum + { +#define TAG(tag, value) tag = value, +#include "elf/tic6x-attrs.h" +#undef TAG + Tag_C6XABI_last + }; + +/* Values for Tag_ISA. GNU-specific names; the ABI does not specify + names for these values. */ +enum + { + C6XABI_Tag_ISA_none = 0, + C6XABI_Tag_ISA_C62X = 1, + C6XABI_Tag_ISA_C67X = 3, + C6XABI_Tag_ISA_C67XP = 4, + C6XABI_Tag_ISA_C64X = 6, + C6XABI_Tag_ISA_C64XP = 7, + C6XABI_Tag_ISA_C674X = 8 + }; + +/* Special section names. */ +#define ELF_STRING_C6000_unwind ".c6xabi.exidx" +#define ELF_STRING_C6000_unwind_info ".c6xabi.extab" +#define ELF_STRING_C6000_unwind_once ".gnu.linkonce.c6xabi.exidx." +#define ELF_STRING_C6000_unwind_info_once ".gnu.linkonce.c6xabi.extab." + +#endif /* _ELF_TIC6X_H */ diff --git a/include/elf/tilegx.h b/include/elf/tilegx.h new file mode 100644 index 0000000..e838b80 --- /dev/null +++ b/include/elf/tilegx.h @@ -0,0 +1,176 @@ +/* TILE-Gx ELF support for BFD. + Copyright 2011 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_TILEGX_H +#define _ELF_TILEGX_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_tilegx_reloc_type) + RELOC_NUMBER (R_TILEGX_NONE, 0) + + /* Standard relocations */ + RELOC_NUMBER (R_TILEGX_64, 1) + RELOC_NUMBER (R_TILEGX_32, 2) + RELOC_NUMBER (R_TILEGX_16, 3) + RELOC_NUMBER (R_TILEGX_8, 4) + RELOC_NUMBER (R_TILEGX_64_PCREL, 5) + RELOC_NUMBER (R_TILEGX_32_PCREL, 6) + RELOC_NUMBER (R_TILEGX_16_PCREL, 7) + RELOC_NUMBER (R_TILEGX_8_PCREL, 8) + + /* Custom relocations */ + + RELOC_NUMBER (R_TILEGX_HW0, 9) + RELOC_NUMBER (R_TILEGX_HW1, 10) + RELOC_NUMBER (R_TILEGX_HW2, 11) + RELOC_NUMBER (R_TILEGX_HW3, 12) + RELOC_NUMBER (R_TILEGX_HW0_LAST, 13) + RELOC_NUMBER (R_TILEGX_HW1_LAST, 14) + RELOC_NUMBER (R_TILEGX_HW2_LAST, 15) + + RELOC_NUMBER (R_TILEGX_COPY, 16) + RELOC_NUMBER (R_TILEGX_GLOB_DAT, 17) + RELOC_NUMBER (R_TILEGX_JMP_SLOT, 18) + RELOC_NUMBER (R_TILEGX_RELATIVE, 19) + + /* Branch/jump offsets */ + RELOC_NUMBER (R_TILEGX_BROFF_X1, 20) + RELOC_NUMBER (R_TILEGX_JUMPOFF_X1, 21) + RELOC_NUMBER (R_TILEGX_JUMPOFF_X1_PLT, 22) + + /* Immediate operands. */ + RELOC_NUMBER (R_TILEGX_IMM8_X0, 23) + RELOC_NUMBER (R_TILEGX_IMM8_Y0, 24) + RELOC_NUMBER (R_TILEGX_IMM8_X1, 25) + RELOC_NUMBER (R_TILEGX_IMM8_Y1, 26) + RELOC_NUMBER (R_TILEGX_DEST_IMM8_X1, 27) + RELOC_NUMBER (R_TILEGX_MT_IMM14_X1, 28) + RELOC_NUMBER (R_TILEGX_MF_IMM14_X1, 29) + RELOC_NUMBER (R_TILEGX_MMSTART_X0, 30) + RELOC_NUMBER (R_TILEGX_MMEND_X0, 31) + RELOC_NUMBER (R_TILEGX_SHAMT_X0, 32) + RELOC_NUMBER (R_TILEGX_SHAMT_X1, 33) + RELOC_NUMBER (R_TILEGX_SHAMT_Y0, 34) + RELOC_NUMBER (R_TILEGX_SHAMT_Y1, 35) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0, 36) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0, 37) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1, 38) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1, 39) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2, 40) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2, 41) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3, 42) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3, 43) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST, 44) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST, 45) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST, 46) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST, 47) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST, 48) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST, 49) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_PCREL, 50) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_PCREL, 51) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_PCREL, 52) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_PCREL, 53) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_PCREL, 54) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_PCREL, 55) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_PCREL, 56) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_PCREL, 57) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_PCREL, 58) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_PCREL, 59) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_PCREL, 60) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_PCREL, 61) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_PCREL, 62) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_PCREL, 63) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_GOT, 64) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_GOT, 65) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_PLT_PCREL, 66) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_PLT_PCREL, 67) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_PLT_PCREL, 68) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_PLT_PCREL, 69) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_PLT_PCREL, 70) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_PLT_PCREL, 71) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 72) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 73) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 74) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 75) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW3_PLT_PCREL, 76) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW3_PLT_PCREL, 77) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_GD, 78) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_GD, 79) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_LE, 80) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_LE, 81) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE, 82) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE, 83) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE, 84) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE, 85) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 86) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 87) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 88) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 89) + /* Relocs 90-91 are currently not defined. */ + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_TLS_IE, 92) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_TLS_IE, 93) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL, 94) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL, 95) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL, 96) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL, 97) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL, 98) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL, 99) + + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 100) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 101) + RELOC_NUMBER (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 102) + RELOC_NUMBER (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 103) + /* Relocs 104-105 are currently not defined. */ + + RELOC_NUMBER (R_TILEGX_TLS_DTPMOD64, 106) + RELOC_NUMBER (R_TILEGX_TLS_DTPOFF64, 107) + RELOC_NUMBER (R_TILEGX_TLS_TPOFF64, 108) + RELOC_NUMBER (R_TILEGX_TLS_DTPMOD32, 109) + RELOC_NUMBER (R_TILEGX_TLS_DTPOFF32, 110) + RELOC_NUMBER (R_TILEGX_TLS_TPOFF32, 111) + + RELOC_NUMBER (R_TILEGX_TLS_GD_CALL, 112) + RELOC_NUMBER (R_TILEGX_IMM8_X0_TLS_GD_ADD, 113) + RELOC_NUMBER (R_TILEGX_IMM8_X1_TLS_GD_ADD, 114) + RELOC_NUMBER (R_TILEGX_IMM8_Y0_TLS_GD_ADD, 115) + RELOC_NUMBER (R_TILEGX_IMM8_Y1_TLS_GD_ADD, 116) + RELOC_NUMBER (R_TILEGX_TLS_IE_LOAD, 117) + RELOC_NUMBER (R_TILEGX_IMM8_X0_TLS_ADD, 118) + RELOC_NUMBER (R_TILEGX_IMM8_X1_TLS_ADD, 119) + RELOC_NUMBER (R_TILEGX_IMM8_Y0_TLS_ADD, 120) + RELOC_NUMBER (R_TILEGX_IMM8_Y1_TLS_ADD, 121) + +/* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_TILEGX_GNU_VTINHERIT, 128) + RELOC_NUMBER (R_TILEGX_GNU_VTENTRY, 129) +END_RELOC_NUMBERS (R_TILEGX_max) + +#endif /* _ELF_TILEGX_H */ diff --git a/include/elf/tilepro.h b/include/elf/tilepro.h new file mode 100644 index 0000000..0079a2f --- /dev/null +++ b/include/elf/tilepro.h @@ -0,0 +1,144 @@ +/* TILEPro ELF support for BFD. + Copyright 2011 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_TILEPRO_H +#define _ELF_TILEPRO_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_tilepro_reloc_type) + RELOC_NUMBER (R_TILEPRO_NONE, 0) + + /* Standard relocations */ + RELOC_NUMBER (R_TILEPRO_32, 1) + RELOC_NUMBER (R_TILEPRO_16, 2) + RELOC_NUMBER (R_TILEPRO_8, 3) + RELOC_NUMBER (R_TILEPRO_32_PCREL, 4) + RELOC_NUMBER (R_TILEPRO_16_PCREL, 5) + RELOC_NUMBER (R_TILEPRO_8_PCREL, 6) + + RELOC_NUMBER (R_TILEPRO_LO16, 7) + RELOC_NUMBER (R_TILEPRO_HI16, 8) + RELOC_NUMBER (R_TILEPRO_HA16, 9) + + RELOC_NUMBER (R_TILEPRO_COPY, 10) + RELOC_NUMBER (R_TILEPRO_GLOB_DAT, 11) + RELOC_NUMBER (R_TILEPRO_JMP_SLOT, 12) + RELOC_NUMBER (R_TILEPRO_RELATIVE, 13) + + /* Branch/jump offsets */ + RELOC_NUMBER (R_TILEPRO_BROFF_X1, 14) + RELOC_NUMBER (R_TILEPRO_JOFFLONG_X1, 15) + RELOC_NUMBER (R_TILEPRO_JOFFLONG_X1_PLT, 16) + + /* Immediate operands. */ + RELOC_NUMBER (R_TILEPRO_IMM8_X0, 17) + RELOC_NUMBER (R_TILEPRO_IMM8_Y0, 18) + RELOC_NUMBER (R_TILEPRO_IMM8_X1, 19) + RELOC_NUMBER (R_TILEPRO_IMM8_Y1, 20) + RELOC_NUMBER (R_TILEPRO_MT_IMM15_X1, 21) + RELOC_NUMBER (R_TILEPRO_MF_IMM15_X1, 22) + + RELOC_NUMBER (R_TILEPRO_IMM16_X0, 23) + RELOC_NUMBER (R_TILEPRO_IMM16_X1, 24) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_LO, 25) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_LO, 26) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_HI, 27) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_HI, 28) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_HA, 29) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_HA, 30) + + RELOC_NUMBER (R_TILEPRO_IMM16_X0_PCREL, 31) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_PCREL, 32) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_LO_PCREL, 33) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_LO_PCREL, 34) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_HI_PCREL, 35) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_HI_PCREL, 36) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_HA_PCREL, 37) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_HA_PCREL, 38) + + RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT, 39) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT, 40) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT_LO, 41) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT_LO, 42) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT_HI, 43) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT_HI, 44) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_GOT_HA, 45) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_GOT_HA, 46) + + RELOC_NUMBER (R_TILEPRO_MMSTART_X0, 47) + RELOC_NUMBER (R_TILEPRO_MMEND_X0, 48) + RELOC_NUMBER (R_TILEPRO_MMSTART_X1, 49) + RELOC_NUMBER (R_TILEPRO_MMEND_X1, 50) + + RELOC_NUMBER (R_TILEPRO_SHAMT_X0, 51) + RELOC_NUMBER (R_TILEPRO_SHAMT_X1, 52) + RELOC_NUMBER (R_TILEPRO_SHAMT_Y0, 53) + RELOC_NUMBER (R_TILEPRO_SHAMT_Y1, 54) + + RELOC_NUMBER (R_TILEPRO_DEST_IMM8_X1, 55) + + /* Relocs 56-59 are currently not defined. */ + + RELOC_NUMBER (R_TILEPRO_TLS_GD_CALL, 60) + RELOC_NUMBER (R_TILEPRO_IMM8_X0_TLS_GD_ADD, 61) + RELOC_NUMBER (R_TILEPRO_IMM8_X1_TLS_GD_ADD, 62) + RELOC_NUMBER (R_TILEPRO_IMM8_Y0_TLS_GD_ADD, 63) + RELOC_NUMBER (R_TILEPRO_IMM8_Y1_TLS_GD_ADD, 64) + RELOC_NUMBER (R_TILEPRO_TLS_IE_LOAD, 65) + + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD, 66) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD, 67) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD_LO, 68) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD_LO, 69) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD_HI, 70) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD_HI, 71) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_GD_HA, 72) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_GD_HA, 73) + + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE, 74) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE, 75) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE_LO, 76) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE_LO, 77) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE_HI, 78) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE_HI, 79) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_IE_HA, 80) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_IE_HA, 81) + + RELOC_NUMBER (R_TILEPRO_TLS_DTPMOD32, 82) + RELOC_NUMBER (R_TILEPRO_TLS_DTPOFF32, 83) + RELOC_NUMBER (R_TILEPRO_TLS_TPOFF32, 84) + + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE, 85) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE, 86) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_LO, 87) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_LO, 88) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_HI, 89) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_HI, 90) + RELOC_NUMBER (R_TILEPRO_IMM16_X0_TLS_LE_HA, 91) + RELOC_NUMBER (R_TILEPRO_IMM16_X1_TLS_LE_HA, 92) + +/* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_TILEPRO_GNU_VTINHERIT, 128) + RELOC_NUMBER (R_TILEPRO_GNU_VTENTRY, 129) +END_RELOC_NUMBERS (R_TILEPRO_max) + +#endif /* _ELF_TILEPRO_H */ diff --git a/include/elf/v850.h b/include/elf/v850.h new file mode 100644 index 0000000..5a08820 --- /dev/null +++ b/include/elf/v850.h @@ -0,0 +1,283 @@ +/* V850 ELF support for BFD. + Copyright 1997-2013 Free Software Foundation, Inc. + Created by Michael Meissner, Cygnus Support + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file holds definitions specific to the MIPS ELF ABI. Note + that most of this is not actually implemented by BFD. */ + +#ifndef _ELF_V850_H +#define _ELF_V850_H + +/* Processor specific flags for the ELF header e_flags field. */ + +/* Four bit V850 architecture field. */ +#define EF_V850_ARCH 0xf0000000 + +/* v850 code. */ +#define E_V850_ARCH 0x00000000 + +/* v850e code. */ +#define E_V850E_ARCH 0x10000000 + +/* v850e1 code. */ +#define E_V850E1_ARCH 0x20000000 + +/* v850e2 code. */ +#define E_V850E2_ARCH 0x30000000 + +/* v850e2v3 code. */ +#define E_V850E2V3_ARCH 0x40000000 + +/* v850e3v5 code. */ +#define E_V850E3V5_ARCH 0x60000000 + +/* Flags for the st_other field. */ +#define V850_OTHER_SDA 0x10 /* Symbol had SDA relocations. */ +#define V850_OTHER_ZDA 0x20 /* Symbol had ZDA relocations. */ +#define V850_OTHER_TDA 0x40 /* Symbol had TDA relocations. */ +#define V850_OTHER_ERROR 0x80 /* Symbol had an error reported. */ + +/* V850 relocations. */ +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (v850_reloc_type) + RELOC_NUMBER (R_V850_NONE, 0) + RELOC_NUMBER (R_V850_9_PCREL, 1) + RELOC_NUMBER (R_V850_22_PCREL, 2) + RELOC_NUMBER (R_V850_HI16_S, 3) + RELOC_NUMBER (R_V850_HI16, 4) + RELOC_NUMBER (R_V850_LO16, 5) + RELOC_NUMBER (R_V850_ABS32, 6) + RELOC_NUMBER (R_V850_16, 7) + RELOC_NUMBER (R_V850_8, 8) + RELOC_NUMBER( R_V850_SDA_16_16_OFFSET, 9) /* For ld.b, st.b, set1, clr1, not1, tst1, movea, movhi */ + RELOC_NUMBER( R_V850_SDA_15_16_OFFSET, 10) /* For ld.w, ld.h, ld.hu, st.w, st.h */ + RELOC_NUMBER( R_V850_ZDA_16_16_OFFSET, 11) /* For ld.b, st.b, set1, clr1, not1, tst1, movea, movhi */ + RELOC_NUMBER( R_V850_ZDA_15_16_OFFSET, 12) /* For ld.w, ld.h, ld.hu, st.w, st.h */ + RELOC_NUMBER( R_V850_TDA_6_8_OFFSET, 13) /* For sst.w, sld.w */ + RELOC_NUMBER( R_V850_TDA_7_8_OFFSET, 14) /* For sst.h, sld.h */ + RELOC_NUMBER( R_V850_TDA_7_7_OFFSET, 15) /* For sst.b, sld.b */ + RELOC_NUMBER( R_V850_TDA_16_16_OFFSET, 16) /* For set1, clr1, not1, tst1, movea, movhi */ + RELOC_NUMBER( R_V850_TDA_4_5_OFFSET, 17) /* For sld.hu */ + RELOC_NUMBER( R_V850_TDA_4_4_OFFSET, 18) /* For sld.bu */ + RELOC_NUMBER( R_V850_SDA_16_16_SPLIT_OFFSET, 19) /* For ld.bu */ + RELOC_NUMBER( R_V850_ZDA_16_16_SPLIT_OFFSET, 20) /* For ld.bu */ + RELOC_NUMBER( R_V850_CALLT_6_7_OFFSET, 21) /* For callt */ + RELOC_NUMBER( R_V850_CALLT_16_16_OFFSET, 22) /* For callt */ + RELOC_NUMBER (R_V850_GNU_VTINHERIT, 23) + RELOC_NUMBER (R_V850_GNU_VTENTRY, 24) + RELOC_NUMBER (R_V850_LONGCALL, 25) + RELOC_NUMBER (R_V850_LONGJUMP, 26) + RELOC_NUMBER (R_V850_ALIGN, 27) + RELOC_NUMBER (R_V850_REL32, 28) + RELOC_NUMBER (R_V850_LO16_SPLIT_OFFSET, 29) /* For ld.bu */ + RELOC_NUMBER (R_V850_16_PCREL, 30) /* For loop */ + RELOC_NUMBER (R_V850_17_PCREL, 31) /* For br */ + RELOC_NUMBER (R_V850_23, 32) /* For 23bit ld.[w,h,hu,b,bu],st.[w,h,b] */ + RELOC_NUMBER (R_V850_32_PCREL, 33) /* For jr32, jarl32 */ + RELOC_NUMBER (R_V850_32_ABS, 34) /* For jmp32 */ + RELOC_NUMBER (R_V850_16_SPLIT_OFFSET, 35) /* For ld.bu */ + RELOC_NUMBER (R_V850_16_S1, 36) /* For ld.w, ld.h st.w st.h */ + RELOC_NUMBER (R_V850_LO16_S1, 37) /* For ld.w, ld.h st.w st.h */ + RELOC_NUMBER (R_V850_CALLT_15_16_OFFSET, 38) /* For ld.w, ld.h, ld.hu, st.w, st.h */ + RELOC_NUMBER (R_V850_32_GOTPCREL, 39) /* GLOBAL_OFFSET_TABLE from pc */ + RELOC_NUMBER (R_V850_16_GOT, 40) /* GOT ENTRY from gp */ + RELOC_NUMBER (R_V850_32_GOT, 41) + RELOC_NUMBER (R_V850_22_PLT, 42) /* For jr */ + RELOC_NUMBER (R_V850_32_PLT, 43) /* For jr32 */ + RELOC_NUMBER (R_V850_COPY, 44) + RELOC_NUMBER (R_V850_GLOB_DAT, 45) + RELOC_NUMBER (R_V850_JMP_SLOT, 46) + RELOC_NUMBER (R_V850_RELATIVE, 47) + RELOC_NUMBER (R_V850_16_GOTOFF, 48) /* From gp */ + RELOC_NUMBER (R_V850_32_GOTOFF, 49) + RELOC_NUMBER (R_V850_CODE, 50) + RELOC_NUMBER (R_V850_DATA, 51) /* For loop */ + +END_RELOC_NUMBERS (R_V850_max) + + +/* Processor specific section indices. These sections do not actually + exist. Symbols with a st_shndx field corresponding to one of these + values have a special meaning. */ + +/* Small data area common symbol. */ +#define SHN_V850_SCOMMON SHN_LORESERVE + +/* Tiny data area common symbol. */ +#define SHN_V850_TCOMMON (SHN_LORESERVE + 1) + +/* Zero data area common symbol. */ +#define SHN_V850_ZCOMMON (SHN_LORESERVE + 2) + + +/* Processor specific section types. */ + +/* Section contains the .scommon data. */ +#define SHT_V850_SCOMMON 0x70000000 + +/* Section contains the .scommon data. */ +#define SHT_V850_TCOMMON 0x70000001 + +/* Section contains the .scommon data. */ +#define SHT_V850_ZCOMMON 0x70000002 + +/* Processor specific section flags. */ + +/* This section must be in the small data area (pointed to by GP). */ +#define SHF_V850_GPREL 0x10000000 + +/* This section must be in the tiny data area (pointed to by EP). */ +#define SHF_V850_EPREL 0x20000000 + +/* This section must be in the zero data area (pointed to by R0). */ +#define SHF_V850_R0REL 0x40000000 + +/* Alternative versions of the above definitions, as specified by the RH850 ABI. */ + +#define EF_RH850_ABI 0xF0000000 + +#define EF_V800_850E3 0x00100000 + +#define EF_RH850_FPU_DOUBLE 0x00000001 /* sizeof(double) == 8. */ +#define EF_RH850_FPU_SINGLE 0x00000002 /* sizeof(double) == 4. */ +#define EF_RH850_SIMD 0x00000004 +#define EF_RH850_CACHE 0x00000008 +#define EF_RH850_MMU 0x00000010 +#define EF_RH850_REGMODE22 0x00000020 /* Registers r15-r24 (inclusive) are not used. */ +#define EF_RH850_REGMODE32 0x00000040 +#define EF_RH850_DATA_ALIGN8 0x00000080 /* 8-byte alignment supported. */ +#define EF_RH850_GP_FIX 0x00000100 /* r4 is fixed. */ +#define EF_RH850_GP_NOFIX 0x00000200 /* r4 is callee save. */ +#define EF_RH850_EP_FIX 0x00000400 /* r30 is fixed. */ +#define EF_RH850_EP_NOFIX 0x00000800 /* r30 is callee save. */ +#define EF_RH850_TP_FIX 0x00001000 /* r5 is fixed. */ +#define EF_RH850_TP_NOFIX 0x00002000 /* r5 is callee save. */ +#define EF_RH850_REG2_RESERVE 0x00004000 /* r2 is fixed. */ +#define EF_RH850_REG2_NORESERVE 0x00008000 /* r2 is callee saved. */ + +#define SHT_RNESAS_IOP SHT_LOUSER /* Used by Renesas linker. */ + +#define SHF_RENESAS_ABS 0x80000000 /* Absolute section. */ +#define SHF_GHS_ABS 0x00000400 /* Use unknown. */ + +#define STT_RENESAS_ENTRY 14 /* Set for functions called at reset time. */ + +START_RELOC_NUMBERS (v800_reloc_type) + + RELOC_NUMBER (R_V800_NONE, 0x00) + RELOC_NUMBER (R_V810_NONE, 0x30) + RELOC_NUMBER (R_V810_BYTE, 0x31) + RELOC_NUMBER (R_V810_HWORD, 0x32) + RELOC_NUMBER (R_V810_WORD, 0x33) + RELOC_NUMBER (R_V810_WLO, 0x34) + RELOC_NUMBER (R_V810_WHI, 0x35) + RELOC_NUMBER (R_V810_WHI1, 0x36) + RELOC_NUMBER (R_V810_GPBYTE, 0x37) + RELOC_NUMBER (R_V810_GPHWORD, 0x38) + RELOC_NUMBER (R_V810_GPWORD, 0x39) + RELOC_NUMBER (R_V810_GPWLO, 0x3a) + RELOC_NUMBER (R_V810_GPWHI, 0x3b) + RELOC_NUMBER (R_V810_GPWHI1, 0x3c) + RELOC_NUMBER (R_V850_HWLO, 0x3d) + FAKE_RELOC (R_V810_reserved1, 0x3e) + RELOC_NUMBER (R_V850_EP7BIT, 0x3f) + RELOC_NUMBER (R_V850_EPHBYTE, 0x40) + RELOC_NUMBER (R_V850_EPWBYTE, 0x41) + RELOC_NUMBER (R_V850_REGHWLO, 0x42) + FAKE_RELOC (R_V810_reserved2, 0x43) + RELOC_NUMBER (R_V850_GPHWLO, 0x44) + FAKE_RELOC (R_V810_reserved3, 0x45) + RELOC_NUMBER (R_V850_PCR22, 0x46) + RELOC_NUMBER (R_V850_BLO, 0x47) + RELOC_NUMBER (R_V850_EP4BIT, 0x48) + RELOC_NUMBER (R_V850_EP5BIT, 0x49) + RELOC_NUMBER (R_V850_REGBLO, 0x4a) + RELOC_NUMBER (R_V850_GPBLO, 0x4b) + RELOC_NUMBER (R_V810_WLO_1, 0x4c) + RELOC_NUMBER (R_V810_GPWLO_1, 0x4d) + RELOC_NUMBER (R_V850_BLO_1, 0x4e) + RELOC_NUMBER (R_V850_HWLO_1, 0x4f) + FAKE_RELOC (R_V810_reserved4, 0x50) + RELOC_NUMBER (R_V850_GPBLO_1, 0x51) + RELOC_NUMBER (R_V850_GPHWLO_1, 0x52) + FAKE_RELOC (R_V810_reserved5, 0x53) + RELOC_NUMBER (R_V850_EPBLO, 0x54) + RELOC_NUMBER (R_V850_EPHWLO, 0x55) + FAKE_RELOC (R_V810_reserved6, 0x56) + RELOC_NUMBER (R_V850_EPWLO_N, 0x57) + RELOC_NUMBER (R_V850_PC32, 0x58) + RELOC_NUMBER (R_V850_W23BIT, 0x59) + RELOC_NUMBER (R_V850_GPW23BIT, 0x5a) + RELOC_NUMBER (R_V850_EPW23BIT, 0x5b) + RELOC_NUMBER (R_V850_B23BIT, 0x5c) + RELOC_NUMBER (R_V850_GPB23BIT, 0x5d) + RELOC_NUMBER (R_V850_EPB23BIT, 0x5e) + RELOC_NUMBER (R_V850_PC16U, 0x5f) + RELOC_NUMBER (R_V850_PC17, 0x60) + RELOC_NUMBER (R_V850_DW8, 0x61) + RELOC_NUMBER (R_V850_GPDW8, 0x62) + RELOC_NUMBER (R_V850_EPDW8, 0x63) + RELOC_NUMBER (R_V850_PC9, 0x64) + RELOC_NUMBER (R_V810_REGBYTE, 0x65) + RELOC_NUMBER (R_V810_REGHWORD, 0x66) + RELOC_NUMBER (R_V810_REGWORD, 0x67) + RELOC_NUMBER (R_V810_REGWLO, 0x68) + RELOC_NUMBER (R_V810_REGWHI, 0x69) + RELOC_NUMBER (R_V810_REGWHI1, 0x6a) + RELOC_NUMBER (R_V850_REGW23BIT, 0x6b) + RELOC_NUMBER (R_V850_REGB23BIT, 0x6c) + RELOC_NUMBER (R_V850_REGDW8, 0x6d) + RELOC_NUMBER (R_V810_EPBYTE, 0x6e) + RELOC_NUMBER (R_V810_EPHWORD, 0x6f) + RELOC_NUMBER (R_V810_EPWORD, 0x70) + RELOC_NUMBER (R_V850_WLO23, 0x71) + RELOC_NUMBER (R_V850_WORD_E, 0x72) + RELOC_NUMBER (R_V850_REGWORD_E, 0x73) + RELOC_NUMBER (R_V850_WORD, 0x74) + RELOC_NUMBER (R_V850_GPWORD, 0x75) + RELOC_NUMBER (R_V850_REGWORD, 0x76) + RELOC_NUMBER (R_V850_EPWORD, 0x77) + RELOC_NUMBER (R_V810_TPBYTE, 0x78) + RELOC_NUMBER (R_V810_TPHWORD, 0x79) + RELOC_NUMBER (R_V810_TPWORD, 0x7a) + RELOC_NUMBER (R_V810_TPWLO, 0x7b) + RELOC_NUMBER (R_V810_TPWHI, 0x7c) + RELOC_NUMBER (R_V810_TPWHI1, 0x7d) + RELOC_NUMBER (R_V850_TPHWLO, 0x7e) + RELOC_NUMBER (R_V850_TPBLO, 0x7f) + RELOC_NUMBER (R_V810_TPWLO_1, 0x80) + RELOC_NUMBER (R_V850_TPBLO_1, 0x81) + RELOC_NUMBER (R_V850_TPHWLO_1, 0x82) + RELOC_NUMBER (R_V850_TP23BIT, 0x83) + RELOC_NUMBER (R_V850_TPW23BIT, 0x84) + RELOC_NUMBER (R_V850_TPDW8, 0x85) + +/* These are defined by the RH850 ABI, but not used. */ + RELOC_NUMBER (R_V810_ABS32, 0xa0) + RELOC_NUMBER (R_V850_SYM, 0xe0) + RELOC_NUMBER (R_V850_OPadd, 0xe1) + RELOC_NUMBER (R_V850_OPsub, 0xe2) + RELOC_NUMBER (R_V850_OPsctsize, 0xe3) + RELOC_NUMBER (R_V850_OPscttop, 0xe4) + +END_RELOC_NUMBERS (R_V800_max) + +#endif /* _ELF_V850_H */ diff --git a/include/elf/vax.h b/include/elf/vax.h new file mode 100644 index 0000000..e44c48e --- /dev/null +++ b/include/elf/vax.h @@ -0,0 +1,51 @@ +/* VAX ELF support for BFD. + Copyright (C) 2002, 2010 Free Software Foundation, Inc. + Contributed by Matt Thomas . + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_VAX_H +#define _ELF_VAX_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_vax_reloc_type) + RELOC_NUMBER (R_VAX_NONE, 0) /* No reloc */ + RELOC_NUMBER (R_VAX_32, 1) /* Direct 32 bit */ + RELOC_NUMBER (R_VAX_16, 2) /* Direct 16 bit */ + RELOC_NUMBER (R_VAX_8, 3) /* Direct 8 bit */ + RELOC_NUMBER (R_VAX_PC32, 4) /* PC relative 32 bit */ + RELOC_NUMBER (R_VAX_PC16, 5) /* PC relative 16 bit */ + RELOC_NUMBER (R_VAX_PC8, 6) /* PC relative 8 bit */ + RELOC_NUMBER (R_VAX_GOT32, 7) /* 32 bit PC relative GOT entry */ + RELOC_NUMBER (R_VAX_PLT32, 13) /* 32 bit PC relative PLT address */ + RELOC_NUMBER (R_VAX_COPY, 19) /* Copy symbol at runtime */ + RELOC_NUMBER (R_VAX_GLOB_DAT, 20) /* Create GOT entry */ + RELOC_NUMBER (R_VAX_JMP_SLOT, 21) /* Create PLT entry */ + RELOC_NUMBER (R_VAX_RELATIVE, 22) /* Adjust by program base */ + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_VAX_GNU_VTINHERIT, 23) + RELOC_NUMBER (R_VAX_GNU_VTENTRY, 24) +END_RELOC_NUMBERS (R_VAX_max) + +/* Processor specific flags for the ELF header e_flags field. */ +#define EF_VAX_NONPIC 0x0001 /* Object contains non-PIC code */ +#define EF_VAX_DFLOAT 0x0100 /* Object contains D-Float insn. */ +#define EF_VAX_GFLOAT 0x0200 /* Object contains G-Float insn. */ + +#endif diff --git a/include/elf/vxworks.h b/include/elf/vxworks.h new file mode 100644 index 0000000..f25f012 --- /dev/null +++ b/include/elf/vxworks.h @@ -0,0 +1,33 @@ +/* VxWorks ELF support for BFD. + Copyright 2007, 2010 + Free Software Foundation, Inc. + + Contributed by Nathan Sidwell + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _ELF_VXWORKS_H +#define _ELF_VXWORKS_H + +#define DT_VX_WRS_TLS_DATA_START 0x60000010 +#define DT_VX_WRS_TLS_DATA_SIZE 0x60000011 +#define DT_VX_WRS_TLS_DATA_ALIGN 0x60000015 +#define DT_VX_WRS_TLS_VARS_START 0x60000012 +#define DT_VX_WRS_TLS_VARS_SIZE 0x60000013 + +#endif /* _ELF_VXWORKS_H */ diff --git a/include/elf/x86-64.h b/include/elf/x86-64.h new file mode 100644 index 0000000..0ce92cd --- /dev/null +++ b/include/elf/x86-64.h @@ -0,0 +1,90 @@ +/* x86_64 ELF support for BFD. + Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2008, 2009, 2010 + Free Software Foundation, Inc. + Contributed by Jan Hubicka + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_X86_64_H +#define _ELF_X86_64_H + +#include "elf/reloc-macros.h" + +START_RELOC_NUMBERS (elf_x86_64_reloc_type) + RELOC_NUMBER (R_X86_64_NONE, 0) /* No reloc */ + RELOC_NUMBER (R_X86_64_64, 1) /* Direct 64 bit */ + RELOC_NUMBER (R_X86_64_PC32, 2) /* PC relative 32 bit signed */ + RELOC_NUMBER (R_X86_64_GOT32, 3) /* 32 bit GOT entry */ + RELOC_NUMBER (R_X86_64_PLT32, 4) /* 32 bit PLT address */ + RELOC_NUMBER (R_X86_64_COPY, 5) /* Copy symbol at runtime */ + RELOC_NUMBER (R_X86_64_GLOB_DAT, 6) /* Create GOT entry */ + RELOC_NUMBER (R_X86_64_JUMP_SLOT,7) /* Create PLT entry */ + RELOC_NUMBER (R_X86_64_RELATIVE, 8) /* Adjust by program base */ + RELOC_NUMBER (R_X86_64_GOTPCREL, 9) /* 32 bit signed pc relative + offset to GOT entry */ + RELOC_NUMBER (R_X86_64_32, 10) /* Direct 32 bit zero extended */ + RELOC_NUMBER (R_X86_64_32S, 11) /* Direct 32 bit sign extended */ + RELOC_NUMBER (R_X86_64_16, 12) /* Direct 16 bit zero extended */ + RELOC_NUMBER (R_X86_64_PC16, 13) /* 16 bit sign extended pc relative*/ + RELOC_NUMBER (R_X86_64_8, 14) /* Direct 8 bit sign extended */ + RELOC_NUMBER (R_X86_64_PC8, 15) /* 8 bit sign extended pc relative*/ + RELOC_NUMBER (R_X86_64_DTPMOD64, 16) /* ID of module containing symbol */ + RELOC_NUMBER (R_X86_64_DTPOFF64, 17) /* Offset in TLS block */ + RELOC_NUMBER (R_X86_64_TPOFF64, 18) /* Offset in initial TLS block */ + RELOC_NUMBER (R_X86_64_TLSGD, 19) /* PC relative offset to GD GOT block */ + RELOC_NUMBER (R_X86_64_TLSLD, 20) /* PC relative offset to LD GOT block */ + RELOC_NUMBER (R_X86_64_DTPOFF32, 21) /* Offset in TLS block */ + RELOC_NUMBER (R_X86_64_GOTTPOFF, 22) /* PC relative offset to IE GOT entry */ + RELOC_NUMBER (R_X86_64_TPOFF32, 23) /* Offset in initial TLS block */ + RELOC_NUMBER (R_X86_64_PC64, 24) /* PC relative 64 bit */ + RELOC_NUMBER (R_X86_64_GOTOFF64, 25) /* 64 bit offset to GOT */ + RELOC_NUMBER (R_X86_64_GOTPC32, 26) /* 32 bit signed pc relative + offset to GOT */ + RELOC_NUMBER (R_X86_64_GOT64, 27) /* 64 bit GOT entry offset */ + RELOC_NUMBER (R_X86_64_GOTPCREL64, 28) /* 64 bit signed pc relative + offset to GOT entry */ + RELOC_NUMBER (R_X86_64_GOTPC64, 29) /* 64 bit signed pc relative + offset to GOT */ + RELOC_NUMBER (R_X86_64_GOTPLT64, 30) /* like GOT64, but indicates + that PLT entry is needed */ + RELOC_NUMBER (R_X86_64_PLTOFF64, 31) /* 64 bit GOT relative offset + to PLT entry */ + RELOC_NUMBER (R_X86_64_SIZE32, 32) /* 32-bit symbol size */ + RELOC_NUMBER (R_X86_64_SIZE64, 33) /* 64-bit symbol size */ + RELOC_NUMBER (R_X86_64_GOTPC32_TLSDESC, 34) + /* 32 bit signed pc relative + offset to TLS descriptor + in the GOT. */ + RELOC_NUMBER (R_X86_64_TLSDESC_CALL, 35) /* Relaxable call through TLS + descriptor. */ + RELOC_NUMBER (R_X86_64_TLSDESC, 36) /* 2x64-bit TLS descriptor. */ + RELOC_NUMBER (R_X86_64_IRELATIVE, 37) /* Adjust indirectly by program base */ + RELOC_NUMBER (R_X86_64_RELATIVE64, 38) /* 64bit adjust by program base */ + RELOC_NUMBER (R_X86_64_GNU_VTINHERIT, 250) /* GNU C++ hack */ + RELOC_NUMBER (R_X86_64_GNU_VTENTRY, 251) /* GNU C++ hack */ +END_RELOC_NUMBERS (R_X86_64_max) + +/* Processor specific section types. */ + +#define SHT_X86_64_UNWIND 0x70000001 /* unwind information */ + +/* Like SHN_COMMON but the symbol will be allocated in the .lbss + section. */ +#define SHN_X86_64_LCOMMON (SHN_LORESERVE + 2) + +#define SHF_X86_64_LARGE 0x10000000 +#endif diff --git a/include/elf/xc16x.h b/include/elf/xc16x.h new file mode 100644 index 0000000..b46d903 --- /dev/null +++ b/include/elf/xc16x.h @@ -0,0 +1,40 @@ +/* Infineon XC16X ELF support for BFD. + Copyright 2006, 2010 Free Software Foundation, Inc. + Contributed by KPIT Cummins Infosystems + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_XC16X_H +#define _ELF_XC16X_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_xc16x_reloc_type) + RELOC_NUMBER (R_XC16X_NONE, 0) + RELOC_NUMBER (R_XC16X_ABS_8, 1) + RELOC_NUMBER (R_XC16X_ABS_16, 2) + RELOC_NUMBER (R_XC16X_ABS_32, 3) + RELOC_NUMBER (R_XC16X_8_PCREL, 4) + RELOC_NUMBER (R_XC16X_PAG, 5) + RELOC_NUMBER (R_XC16X_POF, 6) + RELOC_NUMBER (R_XC16X_SEG, 7) + RELOC_NUMBER (R_XC16X_SOF, 8) + +END_RELOC_NUMBERS (R_XC16X_max) + +#endif /* _ELF_XC16X_H */ diff --git a/include/elf/xgate.h b/include/elf/xgate.h new file mode 100644 index 0000000..33286a8 --- /dev/null +++ b/include/elf/xgate.h @@ -0,0 +1,77 @@ +/* XGATE ELF support for BFD. + Copyright 2010, 2011, 2012 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_XGATE_H +#define _ELF_XGATE_H + +#include "elf/reloc-macros.h" + +/* Relocation types. */ +START_RELOC_NUMBERS (elf_xgate_reloc_type) + RELOC_NUMBER (R_XGATE_NONE, 0) + RELOC_NUMBER (R_XGATE_8, 1) + RELOC_NUMBER (R_XGATE_PCREL_8, 2) + RELOC_NUMBER (R_XGATE_16, 3) + RELOC_NUMBER (R_XGATE_32, 4) + RELOC_NUMBER (R_XGATE_PCREL_16, 5) + /* These are GNU extensions to enable C++ vtable garbage collection. */ + RELOC_NUMBER (R_XGATE_GNU_VTINHERIT, 6) + RELOC_NUMBER (R_XGATE_GNU_VTENTRY, 7) + + RELOC_NUMBER (R_XGATE_24, 8) + RELOC_NUMBER (R_XGATE_LO16, 9) + RELOC_NUMBER (R_XGATE_GPAGE, 10) + RELOC_NUMBER (R_XGATE_PCREL_9, 11) + RELOC_NUMBER (R_XGATE_PCREL_10, 12) + RELOC_NUMBER (R_XGATE_IMM8_LO, 13) + RELOC_NUMBER (R_XGATE_IMM8_HI, 14) + RELOC_NUMBER (R_XGATE_IMM3, 15) + RELOC_NUMBER (R_XGATE_IMM4, 16) + RELOC_NUMBER (R_XGATE_IMM5, 17) + + /* GNU extension for linker relaxation. + Mark beginning of a jump instruction (any form). */ + RELOC_NUMBER (R_XGATE_RL_JUMP, 18) + + /* Mark beginning of Gcc relaxation group instruction. */ + RELOC_NUMBER (R_XGATE_RL_GROUP, 19) +END_RELOC_NUMBERS (R_XGATE_max) + +/* Processor specific flags for the ELF header e_flags field. */ + +/* ABI identification. */ +#define EF_XGATE_ABI 0x00000000F + +/* Integers are 32-bit long. */ +#define E_XGATE_I32 0x000000001 + +/* Doubles are 64-bit long. */ +#define E_XGATE_F64 0x000000002 + +#define EF_XGATE_MACH_MASK 0xF0 + +#define EF_XGATE_MACH 0x80 /* XGATE microcontroller. */ + +#define E_M68HCS12X_GLOBAL 0x100 + +/* Identify interrupt handlers. This is used by the debugger to + correctly compute the stack frame. */ +#define STO_XGATE_INTERRUPT 0x40 + +#endif diff --git a/include/elf/xstormy16.h b/include/elf/xstormy16.h new file mode 100644 index 0000000..0ae0def --- /dev/null +++ b/include/elf/xstormy16.h @@ -0,0 +1,57 @@ +/* XSTORMY16 ELF support for BFD. + Copyright (C) 2001, 2002, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _ELF_XSTORMY16_H +#define _ELF_XSTORMY16_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_xstormy16_reloc_type) + RELOC_NUMBER (R_XSTORMY16_NONE, 0) + + RELOC_NUMBER (R_XSTORMY16_32, 1) + RELOC_NUMBER (R_XSTORMY16_16, 2) + RELOC_NUMBER (R_XSTORMY16_8, 3) + RELOC_NUMBER (R_XSTORMY16_PC32, 4) + RELOC_NUMBER (R_XSTORMY16_PC16, 5) + RELOC_NUMBER (R_XSTORMY16_PC8, 6) + + RELOC_NUMBER (R_XSTORMY16_REL_12, 7) + RELOC_NUMBER (R_XSTORMY16_24, 8) + RELOC_NUMBER (R_XSTORMY16_FPTR16, 9) + + RELOC_NUMBER (R_XSTORMY16_LO16, 10) + RELOC_NUMBER (R_XSTORMY16_HI16, 11) + RELOC_NUMBER (R_XSTORMY16_12, 12) + + RELOC_NUMBER (R_XSTORMY16_GNU_VTINHERIT, 128) + RELOC_NUMBER (R_XSTORMY16_GNU_VTENTRY, 129) +END_RELOC_NUMBERS (R_XSTORMY16_max) + +/* Define the data & instruction memory discriminator. In a linked + executable, an symbol should be deemed to point to an instruction + if ((address & XSTORMY16_INSN_MASK) == XSTORMY16_INSN_VALUE), and similarly + for the data space. See also `ld/emulparams/elf32xstormy16.sh'. */ +#define XSTORMY16_DATA_MASK 0xffc00000 +#define XSTORMY16_DATA_VALUE 0x00000000 +#define XSTORMY16_INSN_MASK 0xffc00000 +#define XSTORMY16_INSN_VALUE 0x00400000 + +#endif /* _ELF_XSTORMY16_H */ diff --git a/include/elf/xtensa.h b/include/elf/xtensa.h new file mode 100644 index 0000000..0d35f7a --- /dev/null +++ b/include/elf/xtensa.h @@ -0,0 +1,208 @@ +/* Xtensa ELF support for BFD. + Copyright 2003, 2004, 2007, 2008, 2010 Free Software Foundation, Inc. + Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +/* This file holds definitions specific to the Xtensa ELF ABI. */ + +#ifndef _ELF_XTENSA_H +#define _ELF_XTENSA_H + +#include "elf/reloc-macros.h" + +/* Relocations. */ +START_RELOC_NUMBERS (elf_xtensa_reloc_type) + RELOC_NUMBER (R_XTENSA_NONE, 0) + RELOC_NUMBER (R_XTENSA_32, 1) + RELOC_NUMBER (R_XTENSA_RTLD, 2) + RELOC_NUMBER (R_XTENSA_GLOB_DAT, 3) + RELOC_NUMBER (R_XTENSA_JMP_SLOT, 4) + RELOC_NUMBER (R_XTENSA_RELATIVE, 5) + RELOC_NUMBER (R_XTENSA_PLT, 6) + RELOC_NUMBER (R_XTENSA_OP0, 8) + RELOC_NUMBER (R_XTENSA_OP1, 9) + RELOC_NUMBER (R_XTENSA_OP2, 10) + RELOC_NUMBER (R_XTENSA_ASM_EXPAND, 11) + RELOC_NUMBER (R_XTENSA_ASM_SIMPLIFY, 12) + RELOC_NUMBER (R_XTENSA_32_PCREL, 14) + RELOC_NUMBER (R_XTENSA_GNU_VTINHERIT, 15) + RELOC_NUMBER (R_XTENSA_GNU_VTENTRY, 16) + RELOC_NUMBER (R_XTENSA_DIFF8, 17) + RELOC_NUMBER (R_XTENSA_DIFF16, 18) + RELOC_NUMBER (R_XTENSA_DIFF32, 19) + RELOC_NUMBER (R_XTENSA_SLOT0_OP, 20) + RELOC_NUMBER (R_XTENSA_SLOT1_OP, 21) + RELOC_NUMBER (R_XTENSA_SLOT2_OP, 22) + RELOC_NUMBER (R_XTENSA_SLOT3_OP, 23) + RELOC_NUMBER (R_XTENSA_SLOT4_OP, 24) + RELOC_NUMBER (R_XTENSA_SLOT5_OP, 25) + RELOC_NUMBER (R_XTENSA_SLOT6_OP, 26) + RELOC_NUMBER (R_XTENSA_SLOT7_OP, 27) + RELOC_NUMBER (R_XTENSA_SLOT8_OP, 28) + RELOC_NUMBER (R_XTENSA_SLOT9_OP, 29) + RELOC_NUMBER (R_XTENSA_SLOT10_OP, 30) + RELOC_NUMBER (R_XTENSA_SLOT11_OP, 31) + RELOC_NUMBER (R_XTENSA_SLOT12_OP, 32) + RELOC_NUMBER (R_XTENSA_SLOT13_OP, 33) + RELOC_NUMBER (R_XTENSA_SLOT14_OP, 34) + RELOC_NUMBER (R_XTENSA_SLOT0_ALT, 35) + RELOC_NUMBER (R_XTENSA_SLOT1_ALT, 36) + RELOC_NUMBER (R_XTENSA_SLOT2_ALT, 37) + RELOC_NUMBER (R_XTENSA_SLOT3_ALT, 38) + RELOC_NUMBER (R_XTENSA_SLOT4_ALT, 39) + RELOC_NUMBER (R_XTENSA_SLOT5_ALT, 40) + RELOC_NUMBER (R_XTENSA_SLOT6_ALT, 41) + RELOC_NUMBER (R_XTENSA_SLOT7_ALT, 42) + RELOC_NUMBER (R_XTENSA_SLOT8_ALT, 43) + RELOC_NUMBER (R_XTENSA_SLOT9_ALT, 44) + RELOC_NUMBER (R_XTENSA_SLOT10_ALT, 45) + RELOC_NUMBER (R_XTENSA_SLOT11_ALT, 46) + RELOC_NUMBER (R_XTENSA_SLOT12_ALT, 47) + RELOC_NUMBER (R_XTENSA_SLOT13_ALT, 48) + RELOC_NUMBER (R_XTENSA_SLOT14_ALT, 49) + RELOC_NUMBER (R_XTENSA_TLSDESC_FN, 50) + RELOC_NUMBER (R_XTENSA_TLSDESC_ARG, 51) + RELOC_NUMBER (R_XTENSA_TLS_DTPOFF, 52) + RELOC_NUMBER (R_XTENSA_TLS_TPOFF, 53) + RELOC_NUMBER (R_XTENSA_TLS_FUNC, 54) + RELOC_NUMBER (R_XTENSA_TLS_ARG, 55) + RELOC_NUMBER (R_XTENSA_TLS_CALL, 56) +END_RELOC_NUMBERS (R_XTENSA_max) + +/* Processor-specific flags for the ELF header e_flags field. */ + +/* Four-bit Xtensa machine type field. */ +#define EF_XTENSA_MACH 0x0000000f + +/* Various CPU types. */ +#define E_XTENSA_MACH 0x00000000 + +/* Leave bits 0xf0 alone in case we ever have more than 16 cpu types. + Highly unlikely, but what the heck. */ + +#define EF_XTENSA_XT_INSN 0x00000100 +#define EF_XTENSA_XT_LIT 0x00000200 + + +/* Processor-specific dynamic array tags. */ + +/* Offset of the table that records the GOT location(s). */ +#define DT_XTENSA_GOT_LOC_OFF 0x70000000 + +/* Number of entries in the GOT location table. */ +#define DT_XTENSA_GOT_LOC_SZ 0x70000001 + + +/* Definitions for instruction and literal property tables. The + tables for ".gnu.linkonce.*" sections are placed in the following + sections: + + instruction tables: .gnu.linkonce.x.* + literal tables: .gnu.linkonce.p.* +*/ + +#define XTENSA_INSN_SEC_NAME ".xt.insn" +#define XTENSA_LIT_SEC_NAME ".xt.lit" +#define XTENSA_PROP_SEC_NAME ".xt.prop" + +typedef struct property_table_entry_t +{ + bfd_vma address; + bfd_vma size; + flagword flags; +} property_table_entry; + +/* Flags in the property tables to specify whether blocks of memory are + literals, instructions, data, or unreachable. For instructions, + blocks that begin loop targets and branch targets are designated. + Blocks that do not allow density instructions, instruction reordering + or transformation are also specified. Finally, for branch targets, + branch target alignment priority is included. Alignment of the next + block is specified in the current block and the size of the current + block does not include any fill required to align to the next + block. */ + +#define XTENSA_PROP_LITERAL 0x00000001 +#define XTENSA_PROP_INSN 0x00000002 +#define XTENSA_PROP_DATA 0x00000004 +#define XTENSA_PROP_UNREACHABLE 0x00000008 +/* Instruction-only properties at beginning of code. */ +#define XTENSA_PROP_INSN_LOOP_TARGET 0x00000010 +#define XTENSA_PROP_INSN_BRANCH_TARGET 0x00000020 +/* Instruction-only properties about code. */ +#define XTENSA_PROP_INSN_NO_DENSITY 0x00000040 +#define XTENSA_PROP_INSN_NO_REORDER 0x00000080 +/* Historically, NO_TRANSFORM was a property of instructions, + but it should apply to literals under certain circumstances. */ +#define XTENSA_PROP_NO_TRANSFORM 0x00000100 + +/* Branch target alignment information. This transmits information + to the linker optimization about the priority of aligning a + particular block for branch target alignment: None, low priority, + high priority, or required. These only need to be checked in + instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET. + Common usage is: + + switch (GET_XTENSA_PROP_BT_ALIGN(flags)) + case XTENSA_PROP_BT_ALIGN_NONE: + case XTENSA_PROP_BT_ALIGN_LOW: + case XTENSA_PROP_BT_ALIGN_HIGH: + case XTENSA_PROP_BT_ALIGN_REQUIRE: +*/ +#define XTENSA_PROP_BT_ALIGN_MASK 0x00000600 + +/* No branch target alignment. */ +#define XTENSA_PROP_BT_ALIGN_NONE 0x0 +/* Low priority branch target alignment. */ +#define XTENSA_PROP_BT_ALIGN_LOW 0x1 +/* High priority branch target alignment. */ +#define XTENSA_PROP_BT_ALIGN_HIGH 0x2 +/* Required branch target alignment. */ +#define XTENSA_PROP_BT_ALIGN_REQUIRE 0x3 + +#define GET_XTENSA_PROP_BT_ALIGN(flag) \ + (((unsigned)((flag) & (XTENSA_PROP_BT_ALIGN_MASK))) >> 9) +#define SET_XTENSA_PROP_BT_ALIGN(flag, align) \ + (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \ + (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK)) + +/* Alignment is specified in the block BEFORE the one that needs + alignment. Up to 5 bits. Use GET_XTENSA_PROP_ALIGNMENT(flags) to + get the required alignment specified as a power of 2. Use + SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required + alignment. Be careful of side effects since the SET will evaluate + flags twice. Also, note that the SIZE of a block in the property + table does not include the alignment size, so the alignment fill + must be calculated to determine if two blocks are contiguous. + TEXT_ALIGN is not currently implemented but is a placeholder for a + possible future implementation. */ + +#define XTENSA_PROP_ALIGN 0x00000800 + +#define XTENSA_PROP_ALIGNMENT_MASK 0x0001f000 + +#define GET_XTENSA_PROP_ALIGNMENT(flag) \ + (((unsigned)((flag) & (XTENSA_PROP_ALIGNMENT_MASK))) >> 12) +#define SET_XTENSA_PROP_ALIGNMENT(flag, align) \ + (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \ + (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK)) + +#define XTENSA_PROP_INSN_ABSLIT 0x00020000 + +#endif /* _ELF_XTENSA_H */ diff --git a/include/environ.h b/include/environ.h new file mode 100644 index 0000000..c18902b --- /dev/null +++ b/include/environ.h @@ -0,0 +1,33 @@ +/* Declare the environ system variable. + Copyright (C) 2015 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* On OSX, the environ variable can be used directly in the code of an + executable, but cannot be used in the code of a shared library (such as + GCC's liblto_plugin, which links in libiberty code). Instead, the + function _NSGetEnviron can be called to get the address of environ. */ + +#ifndef HAVE_ENVIRON_DECL +# ifdef __APPLE__ +# include +# define environ (*_NSGetEnviron ()) +# else +extern char **environ; +# endif +# define HAVE_ENVIRON_DECL +#endif diff --git a/include/envlock.h b/include/envlock.h new file mode 100644 index 0000000..799cf7f --- /dev/null +++ b/include/envlock.h @@ -0,0 +1,15 @@ +/* envlock.h -- header file for env routines. */ + +#ifndef _INCLUDE_ENVLOCK_H_ +#define _INCLUDE_ENVLOCK_H_ + +#include <_ansi.h> +#include + +#define ENV_LOCK __env_lock(reent_ptr) +#define ENV_UNLOCK __env_unlock(reent_ptr) + +void __env_lock (struct _reent *reent); +void __env_unlock (struct _reent *reent); + +#endif /* _INCLUDE_ENVLOCK_H_ */ diff --git a/include/envz.h b/include/envz.h new file mode 100644 index 0000000..e6a31c3 --- /dev/null +++ b/include/envz.h @@ -0,0 +1,16 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include + +/* The newlib implementation of these functions assumes that sizeof(char) == 1. */ +char * envz_entry (const char *envz, size_t envz_len, const char *name); +char * envz_get (const char *envz, size_t envz_len, const char *name); +error_t envz_add (char **envz, size_t *envz_len, const char *name, const char *value); +error_t envz_merge (char **envz, size_t *envz_len, const char *envz2, size_t envz2_len, int override); +void envz_remove(char **envz, size_t *envz_len, const char *name); +void envz_strip (char **envz, size_t *envz_len); diff --git a/include/errno.h b/include/errno.h new file mode 100644 index 0000000..7cc2ca8 --- /dev/null +++ b/include/errno.h @@ -0,0 +1,11 @@ +#ifndef __ERRNO_H__ +#define __ERRNO_H__ + +#ifndef __error_t_defined +typedef int error_t; +#define __error_t_defined 1 +#endif + +#include + +#endif /* !__ERRNO_H__ */ diff --git a/include/fastmath.h b/include/fastmath.h new file mode 100644 index 0000000..95eea5f --- /dev/null +++ b/include/fastmath.h @@ -0,0 +1,13 @@ +#ifndef _FASTMATH_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _FASTMATH_H_ + +#include +#include + +#ifdef __cplusplus +} +#endif +#endif /* _FASTMATH_H_ */ diff --git a/include/fcntl.h b/include/fcntl.h new file mode 100644 index 0000000..86a9167 --- /dev/null +++ b/include/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/include/fenv.h b/include/fenv.h new file mode 100644 index 0000000..4795cc9 --- /dev/null +++ b/include/fenv.h @@ -0,0 +1,42 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#ifndef _FENV_H +#define _FENV_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exception */ +int feclearexcept(int excepts); +int fegetexceptflag(fexcept_t *flagp, int excepts); +int feraiseexcept(int excepts); +int fesetexceptflag(const fexcept_t *flagp, int excepts); +int fetestexcept(int excepts); + +/* Rounding mode */ +int fegetround(void); +int fesetround(int rounding_mode); + +/* Float environment */ +int fegetenv(fenv_t *envp); +int feholdexcept(fenv_t *envp); +int fesetenv(const fenv_t *envp); +int feupdateenv(const fenv_t *envp); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/fibheap.h b/include/fibheap.h new file mode 100644 index 0000000..85b10c5 --- /dev/null +++ b/include/fibheap.h @@ -0,0 +1,94 @@ +/* A Fibonacci heap datatype. + Copyright (C) 1998-2015 Free Software Foundation, Inc. + Contributed by Daniel Berlin (dan@cgsoftware.com). + +This file is part of GCC. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* Fibonacci heaps are somewhat complex, but, there's an article in + DDJ that explains them pretty well: + + http://www.ddj.com/articles/1997/9701/9701o/9701o.htm?topic=algoritms + + Introduction to algorithms by Corman and Rivest also goes over them. + + The original paper that introduced them is "Fibonacci heaps and their + uses in improved network optimization algorithms" by Tarjan and + Fredman (JACM 34(3), July 1987). + + Amortized and real worst case time for operations: + + ExtractMin: O(lg n) amortized. O(n) worst case. + DecreaseKey: O(1) amortized. O(lg n) worst case. + Insert: O(2) amortized. O(1) actual. + Union: O(1) amortized. O(1) actual. */ + +#ifndef _FIBHEAP_H_ +#define _FIBHEAP_H_ + +#include "ansidecl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef long fibheapkey_t; + +typedef struct fibheap +{ + size_t nodes; + struct fibnode *min; + struct fibnode *root; +} *fibheap_t; + +typedef struct fibnode +{ + struct fibnode *parent; + struct fibnode *child; + struct fibnode *left; + struct fibnode *right; + fibheapkey_t key; + void *data; +#if defined (__GNUC__) && (!defined (SIZEOF_INT) || SIZEOF_INT < 4) + __extension__ unsigned long int degree : 31; + __extension__ unsigned long int mark : 1; +#else + unsigned int degree : 31; + unsigned int mark : 1; +#endif +} *fibnode_t; + +extern fibheap_t fibheap_new (void); +extern fibnode_t fibheap_insert (fibheap_t, fibheapkey_t, void *); +extern int fibheap_empty (fibheap_t); +extern fibheapkey_t fibheap_min_key (fibheap_t); +extern fibheapkey_t fibheap_replace_key (fibheap_t, fibnode_t, + fibheapkey_t); +extern void *fibheap_replace_key_data (fibheap_t, fibnode_t, + fibheapkey_t, void *); +extern void *fibheap_extract_min (fibheap_t); +extern void *fibheap_min (fibheap_t); +extern void *fibheap_replace_data (fibheap_t, fibnode_t, void *); +extern void *fibheap_delete_node (fibheap_t, fibnode_t); +extern void fibheap_delete (fibheap_t); +extern fibheap_t fibheap_union (fibheap_t, fibheap_t); + +#ifdef __cplusplus +} +#endif + +#endif /* _FIBHEAP_H_ */ diff --git a/include/filenames.h b/include/filenames.h new file mode 100644 index 0000000..1161daa --- /dev/null +++ b/include/filenames.h @@ -0,0 +1,99 @@ +/* Macros for taking apart, interpreting and processing file names. + + These are here because some non-Posix (a.k.a. DOSish) systems have + drive letter brain-damage at the beginning of an absolute file name, + use forward- and back-slash in path names interchangeably, and + some of them have case-insensitive file names. + + Copyright (C) 2000-2015 Free Software Foundation, Inc. + +This file is part of BFD, the Binary File Descriptor library. + +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 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, write to the Free Software +Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef FILENAMES_H +#define FILENAMES_H + +#include "hashtab.h" /* for hashval_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__) +# ifndef HAVE_DOS_BASED_FILE_SYSTEM +# define HAVE_DOS_BASED_FILE_SYSTEM 1 +# endif +# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM +# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1 +# endif +# define HAS_DRIVE_SPEC(f) HAS_DOS_DRIVE_SPEC (f) +# define IS_DIR_SEPARATOR(c) IS_DOS_DIR_SEPARATOR (c) +# define IS_ABSOLUTE_PATH(f) IS_DOS_ABSOLUTE_PATH (f) +#else /* not DOSish */ +# if defined(__APPLE__) +# ifndef HAVE_CASE_INSENSITIVE_FILE_SYSTEM +# define HAVE_CASE_INSENSITIVE_FILE_SYSTEM 1 +# endif +# endif /* __APPLE__ */ +# define HAS_DRIVE_SPEC(f) (0) +# define IS_DIR_SEPARATOR(c) IS_UNIX_DIR_SEPARATOR (c) +# define IS_ABSOLUTE_PATH(f) IS_UNIX_ABSOLUTE_PATH (f) +#endif + +#define IS_DIR_SEPARATOR_1(dos_based, c) \ + (((c) == '/') \ + || (((c) == '\\') && (dos_based))) + +#define HAS_DRIVE_SPEC_1(dos_based, f) \ + ((f)[0] && ((f)[1] == ':') && (dos_based)) + +/* Remove the drive spec from F, assuming HAS_DRIVE_SPEC (f). + The result is a pointer to the remainder of F. */ +#define STRIP_DRIVE_SPEC(f) ((f) + 2) + +#define IS_DOS_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (1, c) +#define IS_DOS_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (1, f) +#define HAS_DOS_DRIVE_SPEC(f) HAS_DRIVE_SPEC_1 (1, f) + +#define IS_UNIX_DIR_SEPARATOR(c) IS_DIR_SEPARATOR_1 (0, c) +#define IS_UNIX_ABSOLUTE_PATH(f) IS_ABSOLUTE_PATH_1 (0, f) + +/* Note that when DOS_BASED is true, IS_ABSOLUTE_PATH accepts d:foo as + well, although it is only semi-absolute. This is because the users + of IS_ABSOLUTE_PATH want to know whether to prepend the current + working directory to a file name, which should not be done with a + name like d:foo. */ +#define IS_ABSOLUTE_PATH_1(dos_based, f) \ + (IS_DIR_SEPARATOR_1 (dos_based, (f)[0]) \ + || HAS_DRIVE_SPEC_1 (dos_based, f)) + +extern int filename_cmp (const char *s1, const char *s2); +#define FILENAME_CMP(s1, s2) filename_cmp(s1, s2) + +extern int filename_ncmp (const char *s1, const char *s2, + size_t n); + +extern hashval_t filename_hash (const void *s); + +extern int filename_eq (const void *s1, const void *s2); + +extern int canonical_filename_eq (const char *a, const char *b); + +#ifdef __cplusplus +} +#endif + +#endif /* FILENAMES_H */ diff --git a/include/floatformat.h b/include/floatformat.h new file mode 100644 index 0000000..af4d09c --- /dev/null +++ b/include/floatformat.h @@ -0,0 +1,159 @@ +/* IEEE floating point support declarations, for GDB, the GNU Debugger. + Copyright (C) 1991-2015 Free Software Foundation, Inc. + +This file is part of GDB. + +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 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, write to the Free Software +Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#if !defined (FLOATFORMAT_H) +#define FLOATFORMAT_H 1 + +#include "ansidecl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* A floatformat consists of a sign bit, an exponent and a mantissa. Once the + bytes are concatenated according to the byteorder flag, then each of those + fields is contiguous. We number the bits with 0 being the most significant + (i.e. BITS_BIG_ENDIAN type numbering), and specify which bits each field + contains with the *_start and *_len fields. */ + +/* What is the order of the bytes? */ + +enum floatformat_byteorders { + /* Standard little endian byte order. + EX: 1.2345678e10 => 00 00 80 c5 e0 fe 06 42 */ + floatformat_little, + + /* Standard big endian byte order. + EX: 1.2345678e10 => 42 06 fe e0 c5 80 00 00 */ + floatformat_big, + + /* Little endian byte order but big endian word order. + EX: 1.2345678e10 => e0 fe 06 42 00 00 80 c5 */ + floatformat_littlebyte_bigword, + + /* VAX byte order. Little endian byte order with 16-bit words. The + following example is an illustration of the byte order only; VAX + doesn't have a fully IEEE compliant floating-point format. + EX: 1.2345678e10 => 80 c5 00 00 06 42 e0 fe */ + floatformat_vax +}; + +enum floatformat_intbit { floatformat_intbit_yes, floatformat_intbit_no }; + +struct floatformat +{ + enum floatformat_byteorders byteorder; + unsigned int totalsize; /* Total size of number in bits */ + + /* Sign bit is always one bit long. 1 means negative, 0 means positive. */ + unsigned int sign_start; + + unsigned int exp_start; + unsigned int exp_len; + /* Bias added to a "true" exponent to form the biased exponent. It + is intentionally signed as, otherwize, -exp_bias can turn into a + very large number (e.g., given the exp_bias of 0x3fff and a 64 + bit long, the equation (long)(1 - exp_bias) evaluates to + 4294950914) instead of -16382). */ + int exp_bias; + /* Exponent value which indicates NaN. This is the actual value stored in + the float, not adjusted by the exp_bias. This usually consists of all + one bits. */ + unsigned int exp_nan; + + unsigned int man_start; + unsigned int man_len; + + /* Is the integer bit explicit or implicit? */ + enum floatformat_intbit intbit; + + /* Internal name for debugging. */ + const char *name; + + /* Validator method. */ + int (*is_valid) (const struct floatformat *fmt, const void *from); + + /* Is the format actually the sum of two smaller floating point + formats (IBM long double, as described in + gcc/config/rs6000/darwin-ldouble-format)? If so, this is the + smaller format in question, and the fields sign_start through + intbit describe the first half. If not, this is NULL. */ + const struct floatformat *split_half; +}; + +/* floatformats for IEEE single and double, big and little endian. */ + +extern const struct floatformat floatformat_ieee_half_big; +extern const struct floatformat floatformat_ieee_half_little; +extern const struct floatformat floatformat_ieee_single_big; +extern const struct floatformat floatformat_ieee_single_little; +extern const struct floatformat floatformat_ieee_double_big; +extern const struct floatformat floatformat_ieee_double_little; + +/* floatformat for ARM IEEE double, little endian bytes and big endian words */ + +extern const struct floatformat floatformat_ieee_double_littlebyte_bigword; + +/* floatformats for VAX. */ + +extern const struct floatformat floatformat_vax_f; +extern const struct floatformat floatformat_vax_d; +extern const struct floatformat floatformat_vax_g; + +/* floatformats for various extendeds. */ + +extern const struct floatformat floatformat_i387_ext; +extern const struct floatformat floatformat_m68881_ext; +extern const struct floatformat floatformat_i960_ext; +extern const struct floatformat floatformat_m88110_ext; +extern const struct floatformat floatformat_m88110_harris_ext; +extern const struct floatformat floatformat_arm_ext_big; +extern const struct floatformat floatformat_arm_ext_littlebyte_bigword; +/* IA-64 Floating Point register spilt into memory. */ +extern const struct floatformat floatformat_ia64_spill_big; +extern const struct floatformat floatformat_ia64_spill_little; +extern const struct floatformat floatformat_ia64_quad_big; +extern const struct floatformat floatformat_ia64_quad_little; +/* IBM long double (double+double). */ +extern const struct floatformat floatformat_ibm_long_double_big; +extern const struct floatformat floatformat_ibm_long_double_little; + +/* Convert from FMT to a double. + FROM is the address of the extended float. + Store the double in *TO. */ + +extern void +floatformat_to_double (const struct floatformat *, const void *, double *); + +/* The converse: convert the double *FROM to FMT + and store where TO points. */ + +extern void +floatformat_from_double (const struct floatformat *, const double *, void *); + +/* Return non-zero iff the data at FROM is a valid number in format FMT. */ + +extern int +floatformat_is_valid (const struct floatformat *fmt, const void *from); + +#ifdef __cplusplus +} +#endif + +#endif /* defined (FLOATFORMAT_H) */ diff --git a/include/fnmatch.h b/include/fnmatch.h new file mode 100644 index 0000000..a94e923 --- /dev/null +++ b/include/fnmatch.h @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/include/fnmatch.h,v 1.10 2002/03/23 17:24:53 imp Exp $ + * @(#)fnmatch.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _FNMATCH_H_ +#define _FNMATCH_H_ + +#include + +#define FNM_NOMATCH 1 /* Match failed. */ + +#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ +#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ +#define FNM_PERIOD 0x04 /* Period must be matched by period. */ + +#if __GNU_VISIBLE +#define FNM_LEADING_DIR 0x08 /* Ignore / after Imatch. */ +#define FNM_CASEFOLD 0x10 /* Case insensitive search. */ +#define FNM_IGNORECASE FNM_CASEFOLD +#define FNM_FILE_NAME FNM_PATHNAME +#endif + +__BEGIN_DECLS +int fnmatch(const char *, const char *, int); +__END_DECLS + +#endif /* !_FNMATCH_H_ */ diff --git a/include/fopen-bin.h b/include/fopen-bin.h new file mode 100644 index 0000000..8f5f771 --- /dev/null +++ b/include/fopen-bin.h @@ -0,0 +1,44 @@ +/* Macros for the 'type' part of an fopen, freopen or fdopen. + + [Update] + + This version is for "binary" systems, where text and binary files are + different. An example is Mess-Dose. Many Unix systems could also + cope with a "b" in the string, indicating binary files, but some reject this + (and thereby don't conform to ANSI C, but what else is new?). + + Copyright 1996-2012 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* This file is designed for inclusion by host-dependent .h files. No + user application should include it directly, since that would make + the application unable to be configured for both "same" and "binary" + variant systems. */ + +#define FOPEN_RB "rb" +#define FOPEN_WB "wb" +#define FOPEN_AB "ab" +#define FOPEN_RUB "r+b" +#define FOPEN_WUB "w+b" +#define FOPEN_AUB "a+b" + +#define FOPEN_RT "r" +#define FOPEN_WT "w" +#define FOPEN_AT "a" +#define FOPEN_RUT "r+" +#define FOPEN_WUT "w+" +#define FOPEN_AUT "a+" diff --git a/include/fopen-same.h b/include/fopen-same.h new file mode 100644 index 0000000..d139e02 --- /dev/null +++ b/include/fopen-same.h @@ -0,0 +1,44 @@ +/* Macros for the 'type' part of an fopen, freopen or fdopen. + + [Update] + + This version is for "same" systems, where text and binary files are + the same. An example is Unix. Many Unix systems could also add a + "b" to the string, indicating binary files, but some reject this + (and thereby don't conform to ANSI C, but what else is new?). + + Copyright 1996-2012 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* This file is designed for inclusion by host-dependent .h files. No + user application should include it directly, since that would make + the application unable to be configured for both "same" and "binary" + variant systems. */ + +#define FOPEN_RB "r" +#define FOPEN_WB "w" +#define FOPEN_AB "a" +#define FOPEN_RUB "r+" +#define FOPEN_WUB "w+" +#define FOPEN_AUB "a+" + +#define FOPEN_RT "r" +#define FOPEN_WT "w" +#define FOPEN_AT "a" +#define FOPEN_RUT "r+" +#define FOPEN_WUT "w+" +#define FOPEN_AUT "a+" diff --git a/include/fopen-vms.h b/include/fopen-vms.h new file mode 100644 index 0000000..e2b2dc7 --- /dev/null +++ b/include/fopen-vms.h @@ -0,0 +1,42 @@ +/* Macros for the 'type' part of an fopen, freopen or fdopen. + + [Update] + + This version is for VMS systems, where text and binary files are + different. + + Copyright 1996-2012 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* This file is designed for inclusion by host-dependent .h files. No + user application should include it directly, since that would make + the application unable to be configured for both "same" and "binary" + variant systems. */ + +#define FOPEN_RB "rb,rfm=udf,rat=none" +#define FOPEN_WB "wb,rfm=udf,rat=none" +#define FOPEN_AB "ab,rfm=udf,rat=none" +#define FOPEN_RUB "r+b,rfm=udf,rat=none" +#define FOPEN_WUB "w+b,rfm=udf,rat=none" +#define FOPEN_AUB "a+b,rfm=udf,rat=none" + +#define FOPEN_RT "r" +#define FOPEN_WT "w" +#define FOPEN_AT "a" +#define FOPEN_RUT "r+" +#define FOPEN_WUT "w+" +#define FOPEN_AUT "a+" diff --git a/include/ftw.h b/include/ftw.h new file mode 100644 index 0000000..8de1e1e --- /dev/null +++ b/include/ftw.h @@ -0,0 +1,66 @@ +/* +* Copyright © 2005-2020 Rich Felker, et al. +* +* 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef _FTW_H +#define _FTW_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* + * Valid flags for the 3rd argument to the function that is passed as the + * second argument to ftw(3) and nftw(3). Say it three times fast! + */ +#define FTW_F 0 /* File. */ +#define FTW_D 1 /* Directory. */ +#define FTW_DNR 2 /* Directory without read permission. */ +#define FTW_DP 3 /* Directory with subdirectories visited. */ +#define FTW_NS 4 /* Unknown type; stat() failed. */ +#define FTW_SL 5 /* Symbolic link. */ +#define FTW_SLN 6 /* Sym link that names a nonexistent file. */ + +/* + * Flags for use as the 4th argument to nftw(3). These may be ORed together. + */ +#define FTW_PHYS 0x01 /* Physical walk, don't follow sym links. */ +#define FTW_MOUNT 0x02 /* The walk does not cross a mount point. */ +#define FTW_DEPTH 0x04 /* Subdirs visited before the dir itself. */ +#define FTW_CHDIR 0x08 /* Change to a directory before reading it. */ + +struct FTW { + int base; + int level; +}; + +int ftw(const char *, int (*)(const char *, const struct stat *, int), int); +int nftw(const char *, int (*)(const char *, const struct stat *, int, struct FTW *), int, int); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gcc-c-fe.def b/include/gcc-c-fe.def new file mode 100644 index 0000000..25ace1c --- /dev/null +++ b/include/gcc-c-fe.def @@ -0,0 +1,197 @@ +/* Interface between GCC C FE and GDB -*- c -*- + + Copyright (C) 2014-2015 Free Software Foundation, Inc. + + This file is part of GCC. + + 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 . */ + + + +/* Create a new "decl" in GCC. A decl is a declaration, basically a + kind of symbol. + + NAME is the name of the new symbol. SYM_KIND is the kind of + symbol being requested. SYM_TYPE is the new symbol's C type; + except for labels, where this is not meaningful and should be + zero. If SUBSTITUTION_NAME is not NULL, then a reference to this + decl in the source will later be substituted with a dereference + of a variable of the given name. Otherwise, for symbols having + an address (e.g., functions), ADDRESS is the address. FILENAME + and LINE_NUMBER refer to the symbol's source location. If this + is not known, FILENAME can be NULL and LINE_NUMBER can be 0. + This function returns the new decl. */ + +GCC_METHOD7 (gcc_decl, build_decl, + const char *, /* Argument NAME. */ + enum gcc_c_symbol_kind, /* Argument SYM_KIND. */ + gcc_type, /* Argument SYM_TYPE. */ + const char *, /* Argument SUBSTITUTION_NAME. */ + gcc_address, /* Argument ADDRESS. */ + const char *, /* Argument FILENAME. */ + unsigned int) /* Argument LINE_NUMBER. */ + +/* Insert a GCC decl into the symbol table. DECL is the decl to + insert. IS_GLOBAL is true if this is an outermost binding, and + false if it is a possibly-shadowing binding. */ + +GCC_METHOD2 (int /* bool */, bind, + gcc_decl, /* Argument DECL. */ + int /* bool */) /* Argument IS_GLOBAL. */ + +/* Insert a tagged type into the symbol table. NAME is the tag name + of the type and TAGGED_TYPE is the type itself. TAGGED_TYPE must + be either a struct, union, or enum type, as these are the only + types that have tags. FILENAME and LINE_NUMBER refer to the type's + source location. If this is not known, FILENAME can be NULL and + LINE_NUMBER can be 0. */ + +GCC_METHOD4 (int /* bool */, tagbind, + const char *, /* Argument NAME. */ + gcc_type, /* Argument TAGGED_TYPE. */ + const char *, /* Argument FILENAME. */ + unsigned int) /* Argument LINE_NUMBER. */ + +/* Return the type of a pointer to a given base type. */ + +GCC_METHOD1 (gcc_type, build_pointer_type, + gcc_type) /* Argument BASE_TYPE. */ + +/* Create a new 'struct' type. Initially it has no fields. */ + +GCC_METHOD0 (gcc_type, build_record_type) + +/* Create a new 'union' type. Initially it has no fields. */ + +GCC_METHOD0 (gcc_type, build_union_type) + +/* Add a field to a struct or union type. FIELD_NAME is the field's + name. FIELD_TYPE is the type of the field. BITSIZE and BITPOS + indicate where in the struct the field occurs. */ + +GCC_METHOD5 (int /* bool */, build_add_field, + gcc_type, /* Argument RECORD_OR_UNION_TYPE. */ + const char *, /* Argument FIELD_NAME. */ + gcc_type, /* Argument FIELD_TYPE. */ + unsigned long, /* Argument BITSIZE. */ + unsigned long) /* Argument BITPOS. */ + +/* After all the fields have been added to a struct or union, the + struct or union type must be "finished". This does some final + cleanups in GCC. */ + +GCC_METHOD2 (int /* bool */, finish_record_or_union, + gcc_type, /* Argument RECORD_OR_UNION_TYPE. */ + unsigned long) /* Argument SIZE_IN_BYTES. */ + +/* Create a new 'enum' type. The new type initially has no + associated constants. */ + +GCC_METHOD1 (gcc_type, build_enum_type, + gcc_type) /* Argument UNDERLYING_INT_TYPE. */ + +/* Add a new constant to an enum type. NAME is the constant's + name and VALUE is its value. */ + +GCC_METHOD3 (int /* bool */, build_add_enum_constant, + gcc_type, /* Argument ENUM_TYPE. */ + const char *, /* Argument NAME. */ + unsigned long) /* Argument VALUE. */ + +/* After all the constants have been added to an enum, the type must + be "finished". This does some final cleanups in GCC. */ + +GCC_METHOD1 (int /* bool */, finish_enum_type, + gcc_type) /* Argument ENUM_TYPE. */ + +/* Create a new function type. RETURN_TYPE is the type returned by + the function, and ARGUMENT_TYPES is a vector, of length NARGS, of + the argument types. IS_VARARGS is true if the function is + varargs. */ + +GCC_METHOD3 (gcc_type, build_function_type, + gcc_type, /* Argument RETURN_TYPE. */ + const struct gcc_type_array *, /* Argument ARGUMENT_TYPES. */ + int /* bool */) /* Argument IS_VARARGS. */ + +/* Return an integer type with the given properties. */ + +GCC_METHOD2 (gcc_type, int_type, + int /* bool */, /* Argument IS_UNSIGNED. */ + unsigned long) /* Argument SIZE_IN_BYTES. */ + +/* Return a floating point type with the given properties. */ + +GCC_METHOD1 (gcc_type, float_type, + unsigned long) /* Argument SIZE_IN_BYTES. */ + +/* Return the 'void' type. */ + +GCC_METHOD0 (gcc_type, void_type) + +/* Return the 'bool' type. */ + +GCC_METHOD0 (gcc_type, bool_type) + +/* Create a new array type. If NUM_ELEMENTS is -1, then the array + is assumed to have an unknown length. */ + +GCC_METHOD2 (gcc_type, build_array_type, + gcc_type, /* Argument ELEMENT_TYPE. */ + int) /* Argument NUM_ELEMENTS. */ + +/* Create a new variably-sized array type. UPPER_BOUND_NAME is the + name of a local variable that holds the upper bound of the array; + it is one less than the array size. */ + +GCC_METHOD2 (gcc_type, build_vla_array_type, + gcc_type, /* Argument ELEMENT_TYPE. */ + const char *) /* Argument UPPER_BOUND_NAME. */ + +/* Return a qualified variant of a given base type. QUALIFIERS says + which qualifiers to use; it is composed of or'd together + constants from 'enum gcc_qualifiers'. */ + +GCC_METHOD2 (gcc_type, build_qualified_type, + gcc_type, /* Argument UNQUALIFIED_TYPE. */ + enum gcc_qualifiers) /* Argument QUALIFIERS. */ + +/* Build a complex type given its element type. */ + +GCC_METHOD1 (gcc_type, build_complex_type, + gcc_type) /* Argument ELEMENT_TYPE. */ + +/* Build a vector type given its element type and number of + elements. */ + +GCC_METHOD2 (gcc_type, build_vector_type, + gcc_type, /* Argument ELEMENT_TYPE. */ + int) /* Argument NUM_ELEMENTS. */ + +/* Build a constant. NAME is the constant's name and VALUE is its + value. FILENAME and LINE_NUMBER refer to the type's source + location. If this is not known, FILENAME can be NULL and + LINE_NUMBER can be 0. */ + +GCC_METHOD5 (int /* bool */, build_constant, + gcc_type, /* Argument TYPE. */ + const char *, /* Argument NAME. */ + unsigned long, /* Argument VALUE. */ + const char *, /* Argument FILENAME. */ + unsigned int) /* Argument LINE_NUMBER. */ + +/* Emit an error and return an error type object. */ + +GCC_METHOD1 (gcc_type, error, + const char *) /* Argument MESSAGE. */ diff --git a/include/gcc-c-interface.h b/include/gcc-c-interface.h new file mode 100644 index 0000000..95d0fc9 --- /dev/null +++ b/include/gcc-c-interface.h @@ -0,0 +1,220 @@ +/* Interface between GCC C FE and GDB + + Copyright (C) 2014-2015 Free Software Foundation, Inc. + + This file is part of GCC. + + 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 . */ + +#ifndef GCC_C_INTERFACE_H +#define GCC_C_INTERFACE_H + +#include "gcc-interface.h" + +/* This header defines the interface to the GCC API. It must be both + valid C and valid C++, because it is included by both programs. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declaration. */ + +struct gcc_c_context; + +/* + * Definitions and declarations for the C front end. + */ + +/* Defined versions of the C front-end API. */ + +enum gcc_c_api_version +{ + GCC_C_FE_VERSION_0 = 0 +}; + +/* Qualifiers. */ + +enum gcc_qualifiers +{ + GCC_QUALIFIER_CONST = 1, + GCC_QUALIFIER_VOLATILE = 2, + GCC_QUALIFIER_RESTRICT = 4 +}; + +/* This enumerates the kinds of decls that GDB can create. */ + +enum gcc_c_symbol_kind +{ + /* A function. */ + + GCC_C_SYMBOL_FUNCTION, + + /* A variable. */ + + GCC_C_SYMBOL_VARIABLE, + + /* A typedef. */ + + GCC_C_SYMBOL_TYPEDEF, + + /* A label. */ + + GCC_C_SYMBOL_LABEL +}; + +/* This enumerates the types of symbols that GCC might request from + GDB. */ + +enum gcc_c_oracle_request +{ + /* An ordinary symbol -- a variable, function, typedef, or enum + constant. */ + + GCC_C_ORACLE_SYMBOL, + + /* A struct, union, or enum tag. */ + + GCC_C_ORACLE_TAG, + + /* A label. */ + + GCC_C_ORACLE_LABEL +}; + +/* The type of the function called by GCC to ask GDB for a symbol's + definition. DATUM is an arbitrary value supplied when the oracle + function is registered. CONTEXT is the GCC context in which the + request is being made. REQUEST specifies what sort of symbol is + being requested, and IDENTIFIER is the name of the symbol. */ + +typedef void gcc_c_oracle_function (void *datum, + struct gcc_c_context *context, + enum gcc_c_oracle_request request, + const char *identifier); + +/* The type of the function called by GCC to ask GDB for a symbol's + address. This should return 0 if the address is not known. */ + +typedef gcc_address gcc_c_symbol_address_function (void *datum, + struct gcc_c_context *ctxt, + const char *identifier); + +/* An array of types used for creating a function type. */ + +struct gcc_type_array +{ + /* Number of elements. */ + + int n_elements; + + /* The elements. */ + + gcc_type *elements; +}; + +/* The vtable used by the C front end. */ + +struct gcc_c_fe_vtable +{ + /* The version of the C interface. The value is one of the + gcc_c_api_version constants. */ + + unsigned int c_version; + + /* Set the callbacks for this context. + + The binding oracle is called whenever the C parser needs to look + up a symbol. This gives the caller a chance to lazily + instantiate symbols using other parts of the gcc_c_fe_interface + API. + + The address oracle is called whenever the C parser needs to look + up a symbol. This is only called for symbols not provided by the + symbol oracle -- that is, just built-in functions where GCC + provides the declaration. + + DATUM is an arbitrary piece of data that is passed back verbatim + to the callbakcs in requests. */ + + void (*set_callbacks) (struct gcc_c_context *self, + gcc_c_oracle_function *binding_oracle, + gcc_c_symbol_address_function *address_oracle, + void *datum); + +#define GCC_METHOD0(R, N) \ + R (*N) (struct gcc_c_context *); +#define GCC_METHOD1(R, N, A) \ + R (*N) (struct gcc_c_context *, A); +#define GCC_METHOD2(R, N, A, B) \ + R (*N) (struct gcc_c_context *, A, B); +#define GCC_METHOD3(R, N, A, B, C) \ + R (*N) (struct gcc_c_context *, A, B, C); +#define GCC_METHOD4(R, N, A, B, C, D) \ + R (*N) (struct gcc_c_context *, A, B, C, D); +#define GCC_METHOD5(R, N, A, B, C, D, E) \ + R (*N) (struct gcc_c_context *, A, B, C, D, E); +#define GCC_METHOD7(R, N, A, B, C, D, E, F, G) \ + R (*N) (struct gcc_c_context *, A, B, C, D, E, F, G); + +#include "gcc-c-fe.def" + +#undef GCC_METHOD0 +#undef GCC_METHOD1 +#undef GCC_METHOD2 +#undef GCC_METHOD3 +#undef GCC_METHOD4 +#undef GCC_METHOD5 +#undef GCC_METHOD7 + +}; + +/* The C front end object. */ + +struct gcc_c_context +{ + /* Base class. */ + + struct gcc_base_context base; + + /* Our vtable. This is a separate field because this is simpler + than implementing a vtable inheritance scheme in C. */ + + const struct gcc_c_fe_vtable *c_ops; +}; + +/* The name of the .so that the compiler builds. We dlopen this + later. */ + +#define GCC_C_FE_LIBCC libcc1.so + +/* The compiler exports a single initialization function. This macro + holds its name as a symbol. */ + +#define GCC_C_FE_CONTEXT gcc_c_fe_context + +/* The type of the initialization function. The caller passes in the + desired base version and desired C-specific version. If the + request can be satisfied, a compatible gcc_context object will be + returned. Otherwise, the function returns NULL. */ + +typedef struct gcc_c_context *gcc_c_fe_context_function + (enum gcc_base_api_version, + enum gcc_c_api_version); + +#ifdef __cplusplus +} +#endif + +#endif /* GCC_C_INTERFACE_H */ diff --git a/include/gcc-interface.h b/include/gcc-interface.h new file mode 100644 index 0000000..df7db6e --- /dev/null +++ b/include/gcc-interface.h @@ -0,0 +1,127 @@ +/* Generic interface between GCC and GDB + + Copyright (C) 2014-2015 Free Software Foundation, Inc. + + This file is part of GCC. + + 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 . */ + +#ifndef GCC_INTERFACE_H +#define GCC_INTERFACE_H + +/* This header defines the interface to the GCC API. It must be both + valid C and valid C++, because it is included by both programs. */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Opaque typedefs for objects passed through the interface. */ + +typedef unsigned long long gcc_type; +typedef unsigned long long gcc_decl; + +/* An address in the inferior. */ + +typedef unsigned long long gcc_address; + +/* Forward declaration. */ + +struct gcc_base_context; + +/* Defined versions of the generic API. */ + +enum gcc_base_api_version +{ + GCC_FE_VERSION_0 = 0 +}; + +/* The operations defined by the GCC base API. This is the vtable for + the real context structure which is passed around. + + The "base" API is concerned with basics shared by all compiler + front ends: setting command-line arguments, the file names, etc. + + Front-end-specific interfaces inherit from this one. */ + +struct gcc_base_vtable +{ + /* The actual version implemented in this interface. This field can + be relied on not to move, so users can always check it if they + desire. The value is one of the gcc_base_api_version constants. + */ + + unsigned int version; + + /* Set the compiler's command-line options for the next compilation. + TRIPLET_REGEXP is a regular expression that is used to match the + configury triplet prefix to the compiler. + The arguments are copied by GCC. ARGV need not be + NULL-terminated. The arguments must be set separately for each + compilation; that is, after a compile is requested, the + previously-set arguments cannot be reused. + + This returns NULL on success. On failure, returns a malloc()d + error message. The caller is responsible for freeing it. */ + + char *(*set_arguments) (struct gcc_base_context *self, + const char *triplet_regexp, + int argc, char **argv); + + /* Set the file name of the program to compile. The string is + copied by the method implementation, but the caller must + guarantee that the file exists through the compilation. */ + + void (*set_source_file) (struct gcc_base_context *self, const char *file); + + /* Set a callback to use for printing error messages. DATUM is + passed through to the callback unchanged. */ + + void (*set_print_callback) (struct gcc_base_context *self, + void (*print_function) (void *datum, + const char *message), + void *datum); + + /* Perform the compilation. FILENAME is the name of the resulting + object file. VERBOSE can be set to cause GCC to print some + information as it works. Returns true on success, false on + error. */ + + int /* bool */ (*compile) (struct gcc_base_context *self, + const char *filename, + int /* bool */ verbose); + + /* Destroy this object. */ + + void (*destroy) (struct gcc_base_context *self); +}; + +/* The GCC object. */ + +struct gcc_base_context +{ + /* The virtual table. */ + + const struct gcc_base_vtable *ops; +}; + +/* The name of the dummy wrapper function generated by gdb. */ + +#define GCC_FE_WRAPPER_FUNCTION "_gdb_expr" + +#ifdef __cplusplus +} +#endif + +#endif /* GCC_INTERFACE_H */ diff --git a/include/gdb/ChangeLog b/include/gdb/ChangeLog new file mode 100644 index 0000000..142f87a --- /dev/null +++ b/include/gdb/ChangeLog @@ -0,0 +1,272 @@ +2013-03-15 Steve Ellcey + + * gdb/remote-sim.h (sim_command_completer): Make char arguments const. + +2013-01-01 Joel Brobecker + + Update year range in copyright notice of all files. + +2012-06-23 Doug Evans + + * gdb-index.h: New file. + +2012-05-24 Pedro Alves + + PR gdb/7205 + + Replace TARGET_SIGNAL_ with GDB_SIGNAL_ throughout. + +2012-05-24 Pedro Alves + + PR gdb/7205 + + Replace target_signal with gdb_signal throughout. + +2012-04-12 Mike Frysinger + + * callback.h (CB_SYS_argc, CB_SYS_argnlen, CB_SYS_argn): Define. + +2012-02-03 Kevin Buettner + + * sim-rl78.h: New file. + +2011-12-03 Mike Frysinger + + * callback.h (cb_get_string): New prototype. + +2011-04-14 Mike Frysinger + + * remote-sim.h (sim_complete_command): New prototype. + +2011-03-05 Mike Frysinger + + * sim-bfin.h: New file. + +2011-01-11 Andrew Burgess + + * remote-sim.h (sim_store_register): Update the API + documentation for this function. + +2010-09-06 Pedro Alves + + * signals.def: Replace all ANY uses by SET with specific numbers. + * signals.h (ANY): Remove. + +2010-07-31 Jan Kratochvil + + * signals.h (enum target_signal): Move the content to signals.def. + Include it. + * signals.def: New file. + +2010-06-24 Kevin Buettner + + * sim-rx.h (sim_rx_regnum): Add sim_rx_acc_regnum. Adjust + register order. + +2010-04-13 Mike Frysinger + + * callback.h: Strip PARAMS from prototypes. + * remote-sim.h: Likewise. + +2010-04-13 Mike Frysinger + + * remote-sim.h (sim_write): Add const to buf arg. + +2009-11-24 DJ Delorie + + * sim-rx.h: New. + +2009-05-18 Jon Beniston + + * sim-lm32.h: New file. + +2009-01-07 Hans-Peter Nilsson + + * callback.h (struct host_callback_struct): Mark member error as + pointing to a noreturn function. + +2008-02-12 M Ranga Swami Reddy + + * sim-cr16.h: New file. + +2008-01-01 Daniel Jacobowitz + + Updated copyright notices for most files. + +2007-10-15 Daniel Jacobowitz + + * sim-ppc.h (sim_spr_register_name): New prototype. + +2007-10-11 Jesper Nilsson + + * callback.h (cb_is_stdin, cb_is_stdout, cb_is_stderr): Add prototypes. + +2007-08-23 Joel Brobecker + + Switch the license of all .h files to GPLv3. + +2007-01-09 Daniel Jacobowitz + + Updated copyright notices for most files. + +2005-07-08 Ben Elliston + + * callback.h: Remove ANSI_PROTOTYPES conditional code. + +2005-01-28 Hans-Peter Nilsson + + * callback.h (struct host_callback_struct): New members pipe, + pipe_empty, pipe_nonempty, ispipe, pipe_buffer and + target_sizeof_int. + (CB_SYS_pipe): New macro. + + * callback.h: Include "bfd.h". + (struct host_callback_struct): New member target_endian. + (cb_store_target_endian): Declare. + +2004-12-15 Hans-Peter Nilsson + + * callback.h (CB_SYS_truncate, CB_SYS_ftruncate): New macros. + +2004-12-13 Hans-Peter Nilsson + + * callback.h (struct host_callback_struct): New member lstat. + (CB_SYS_lstat): New macro. + (CB_SYS_rename): New macro. + +2004-09-08 Michael Snyder + + Commited by Corinna Vinschen + * sim-sh.h: Add new sh2a banked registers. + +2004-08-04 Andrew Cagney + + * sim-ppc.h: Add extern "C" wrapper. + (enum sim_ppc_regnum): Add full list of SPRs. + +2004-08-04 Jim Blandy + + * sim-ppc.h: New file. + +2004-06-25 J"orn Rennecke + + * callback.h (host_callback_struct): Replace members fdopen and + alwaysopen with fd_buddy. + [sim/common: * callback.c: Changed all users. ] + +2003-10-31 Kevin Buettner + + * sim-frv.h: New file. + +2003-10-15 J"orn Rennecke + + * callback.h (struct host_callback_struct): New members ftruncate + and truncate. + +2003-06-10 Corinna Vinschen + + * gdb/fileio.h: New file. + +2003-05-07 Andrew Cagney + + * sim-d10v.h (sim_d10v_translate_addr): Add regcache parameter. + (sim_d10v_translate_imap_addr): Add regcache parameter. + (sim_d10v_translate_dmap_addr): Ditto. + +2003-03-27 Nick Clifton + + * sim-arm.h (sim_arm_regs): Add iWMMXt registers. + +2003-03-20 Nick Clifton + + * sim-arm.h (sim_arm_regs): Add Maverick co-processor + registers. + +2003-02-27 Andrew Cagney + + * remote-sim.h (sim_open, sim_load, sim_create_inferior): Rename + _bfd to bfd. + +2003-02-20 Andrew Cagney + + * remote-sim.h (SIM_RC): Delete unused SIM_RC_UNKNOWN_BREAKPOINT, + SIM_RC_INSUFFICIENT_RESOURCES and SIM_RC_DUPLICATE_BREAKPOINT. + (sim_set_breakpoint, sim_clear_breakpoint): Delete declarations. + (sim_clear_all_breakpoints, sim_enable_breakpoint): Ditto. + (sim_enable_all_breakpoints, sim_disable_breakpoint): Ditto. + (sim_disable_all_breakpoints): Ditto. + +2002-12-26 Kazu Hirata + + * sim-h8300.h: Remove ^M. + +2002-07-29 Andrey Volkov + + * sim-h8300.h: Rename all enums from H8300_ to SIM_H8300_ + prefix. + +2002-07-23 Andrey Volkov + + * sim-h8300.h: New file. + +2002-07-17 Andrew Cagney + + * remote-sim.h: Update copyright. + (sim_set_callbacks, sim_size, sim_trace) + (sim_set_trace, sim_set_profile_size, sim_kill): Delete. Moved to + "sim/common/run-sim.h". + +Wed Jul 17 19:36:38 2002 J"orn Rennecke + + * sim-sh.h: Add enum constants for sh[1-4], sh3e, sh3?-dsp, + renumbering the sh-dsp registers to use distinct numbers. + +2002-06-15 Andrew Cagney + + * sim-arm.h (enum sim_arm_regs): Rename sim_arm_regnum. + +2002-06-12 Andrew Cagney + + * sim-arm.h: New file. + +2002-06-08 Andrew Cagney + + * callback.h: Copy to here from directory above. + * remote-sim.h: Copy to here from directory above. + +2002-06-01 Andrew Cagney + + * sim-d10v.h (sim_d10v_regs): Expand to include all registers. + Update copyright. + +2002-05-23 Andrew Cagney + + * sim-d10v.h: New file. Moved from include/sim-d10v.h. + +2002-05-10 Elena Zannoni + + * sim-sh.h: New file, for sh gdb<->sim interface. + +2002-05-09 Daniel Jacobowitz + + * signals.h: Update comments. + (enum target_signal): Remove conditional compilation around + Mach-specific signals. Move them to after TARGET_SIGNAL_DEFAULT. + +2002-03-10 Daniel Jacobowitz + + * signals.h: New file, from gdb/defs.h. + + +Copyright (C) 2002-2013 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/gdb/callback.h b/include/gdb/callback.h new file mode 100644 index 0000000..f830398 --- /dev/null +++ b/include/gdb/callback.h @@ -0,0 +1,338 @@ +/* Remote target system call callback support. + Copyright 1997-2013 Free Software Foundation, Inc. + Contributed by Cygnus Solutions. + + This file is part of GDB. + + 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 . */ + +/* This interface isn't intended to be specific to any particular kind + of remote (hardware, simulator, whatever). As such, support for it + (e.g. sim/common/callback.c) should *not* live in the simulator source + tree, nor should it live in the gdb source tree. */ + +/* There are various ways to handle system calls: + + 1) Have a simulator intercept the appropriate trap instruction and + directly perform the system call on behalf of the target program. + This is the typical way of handling system calls for embedded targets. + [Handling system calls for embedded targets isn't that much of an + oxymoron as running compiler testsuites make use of the capability.] + + This method of system call handling is done when STATE_ENVIRONMENT + is ENVIRONMENT_USER. + + 2) Have a simulator emulate the hardware as much as possible. + If the program running on the real hardware communicates with some sort + of target manager, one would want to be able to run this program on the + simulator as well. + + This method of system call handling is done when STATE_ENVIRONMENT + is ENVIRONMENT_OPERATING. +*/ + +#ifndef CALLBACK_H +#define CALLBACK_H + +/* ??? The reason why we check for va_start here should be documented. */ + +#ifndef va_start +#include +#include +#endif +/* Needed for enum bfd_endian. */ +#include "bfd.h" + +/* Mapping of host/target values. */ +/* ??? For debugging purposes, one might want to add a string of the + name of the symbol. */ + +typedef struct { + int host_val; + int target_val; +} CB_TARGET_DEFS_MAP; + +#define MAX_CALLBACK_FDS 10 + +/* Forward decl for stat/fstat. */ +struct stat; + +typedef struct host_callback_struct host_callback; + +struct host_callback_struct +{ + int (*close) (host_callback *,int); + int (*get_errno) (host_callback *); + int (*isatty) (host_callback *, int); + int (*lseek) (host_callback *, int, long , int); + int (*open) (host_callback *, const char*, int mode); + int (*read) (host_callback *,int, char *, int); + int (*read_stdin) ( host_callback *, char *, int); + int (*rename) (host_callback *, const char *, const char *); + int (*system) (host_callback *, const char *); + long (*time) (host_callback *, long *); + int (*unlink) (host_callback *, const char *); + int (*write) (host_callback *,int, const char *, int); + int (*write_stdout) (host_callback *, const char *, int); + void (*flush_stdout) (host_callback *); + int (*write_stderr) (host_callback *, const char *, int); + void (*flush_stderr) (host_callback *); + int (*stat) (host_callback *, const char *, struct stat *); + int (*fstat) (host_callback *, int, struct stat *); + int (*lstat) (host_callback *, const char *, struct stat *); + int (*ftruncate) (host_callback *, int, long); + int (*truncate) (host_callback *, const char *, long); + int (*pipe) (host_callback *, int *); + + /* Called by the framework when a read call has emptied a pipe buffer. */ + void (*pipe_empty) (host_callback *, int read_fd, int write_fd); + + /* Called by the framework when a write call makes a pipe buffer + non-empty. */ + void (*pipe_nonempty) (host_callback *, int read_fd, int write_fd); + + /* When present, call to the client to give it the oportunity to + poll any io devices for a request to quit (indicated by a nonzero + return value). */ + int (*poll_quit) (host_callback *); + + /* Used when the target has gone away, so we can close open + handles and free memory etc etc. */ + int (*shutdown) (host_callback *); + int (*init) (host_callback *); + + /* depreciated, use vprintf_filtered - Talk to the user on a console. */ + void (*printf_filtered) (host_callback *, const char *, ...); + + /* Talk to the user on a console. */ + void (*vprintf_filtered) (host_callback *, const char *, va_list); + + /* Same as vprintf_filtered but to stderr. */ + void (*evprintf_filtered) (host_callback *, const char *, va_list); + + /* Print an error message and "exit". + In the case of gdb "exiting" means doing a longjmp back to the main + command loop. */ + void (*error) (host_callback *, const char *, ...) +#ifdef __GNUC__ + __attribute__ ((__noreturn__)) +#endif + ; + + int last_errno; /* host format */ + + int fdmap[MAX_CALLBACK_FDS]; + /* fd_buddy is used to contruct circular lists of target fds that point to + the same host fd. A uniquely mapped fd points to itself; for a closed + one, fd_buddy has the value -1. The host file descriptors for stdin / + stdout / stderr are never closed by the simulators, so they are put + in a special fd_buddy circular list which also has MAX_CALLBACK_FDS + as a member. */ + /* ??? We don't have a callback entry for dup, although it is trival to + implement now. */ + short fd_buddy[MAX_CALLBACK_FDS+1]; + + /* 0 = none, >0 = reader (index of writer), + <0 = writer (negative index of reader). + If abs (ispipe[N]) == N, then N is an end of a pipe whose other + end is closed. */ + short ispipe[MAX_CALLBACK_FDS]; + + /* A writer stores the buffer at its index. Consecutive writes + realloc the buffer and add to the size. The reader indicates the + read part in its .size, until it has consumed it all, at which + point it deallocates the buffer and zeroes out both sizes. */ + struct pipe_write_buffer + { + int size; + char *buffer; + } pipe_buffer[MAX_CALLBACK_FDS]; + + /* System call numbers. */ + CB_TARGET_DEFS_MAP *syscall_map; + /* Errno values. */ + CB_TARGET_DEFS_MAP *errno_map; + /* Flags to the open system call. */ + CB_TARGET_DEFS_MAP *open_map; + /* Signal numbers. */ + CB_TARGET_DEFS_MAP *signal_map; + /* Layout of `stat' struct. + The format is a series of "name,length" pairs separated by colons. + Empty space is indicated with a `name' of "space". + All padding must be explicitly mentioned. + Lengths are in bytes. If this needs to be extended to bits, + use "name.bits". + Example: "st_dev,4:st_ino,4:st_mode,4:..." */ + const char *stat_map; + + enum bfd_endian target_endian; + + /* Size of an "int" on the target (for syscalls whose ABI uses "int"). + This must include padding, and only padding-at-higher-address is + supported. For example, a 64-bit target with 32-bit int:s which + are padded to 64 bits when in an array, should supposedly set this + to 8. The default is 4 which matches ILP32 targets and 64-bit + targets with 32-bit ints and no padding. */ + int target_sizeof_int; + + /* Marker for those wanting to do sanity checks. + This should remain the last member of this struct to help catch + miscompilation errors. */ +#define HOST_CALLBACK_MAGIC 4705 /* teds constant */ + int magic; +}; + +extern host_callback default_callback; + +/* Canonical versions of system call numbers. + It's not intended to willy-nilly throw every system call ever heard + of in here. Only include those that have an important use. + ??? One can certainly start a discussion over the ones that are currently + here, but that will always be true. */ + +/* These are used by the ANSI C support of libc. */ +#define CB_SYS_exit 1 +#define CB_SYS_open 2 +#define CB_SYS_close 3 +#define CB_SYS_read 4 +#define CB_SYS_write 5 +#define CB_SYS_lseek 6 +#define CB_SYS_unlink 7 +#define CB_SYS_getpid 8 +#define CB_SYS_kill 9 +#define CB_SYS_fstat 10 +/*#define CB_SYS_sbrk 11 - not currently a system call, but reserved. */ + +/* ARGV support. */ +#define CB_SYS_argvlen 12 +#define CB_SYS_argv 13 + +/* These are extras added for one reason or another. */ +#define CB_SYS_chdir 14 +#define CB_SYS_stat 15 +#define CB_SYS_chmod 16 +#define CB_SYS_utime 17 +#define CB_SYS_time 18 + +/* More standard syscalls. */ +#define CB_SYS_lstat 19 +#define CB_SYS_rename 20 +#define CB_SYS_truncate 21 +#define CB_SYS_ftruncate 22 +#define CB_SYS_pipe 23 + +/* New ARGV support. */ +#define CB_SYS_argc 24 +#define CB_SYS_argnlen 25 +#define CB_SYS_argn 26 + +/* Struct use to pass and return information necessary to perform a + system call. */ +/* FIXME: Need to consider target word size. */ + +typedef struct cb_syscall { + /* The target's value of what system call to perform. */ + int func; + /* The arguments to the syscall. */ + long arg1, arg2, arg3, arg4; + + /* The result. */ + long result; + /* Some system calls have two results. */ + long result2; + /* The target's errno value, or 0 if success. + This is converted to the target's value with host_to_target_errno. */ + int errcode; + + /* Working space to be used by memory read/write callbacks. */ + PTR p1; + PTR p2; + long x1,x2; + + /* Callbacks for reading/writing memory (e.g. for read/write syscalls). + ??? long or unsigned long might be better to use for the `count' + argument here. We mimic sim_{read,write} for now. Be careful to + test any changes with -Wall -Werror, mixed signed comparisons + will get you. */ + int (*read_mem) (host_callback * /*cb*/, struct cb_syscall * /*sc*/, + unsigned long /*taddr*/, char * /*buf*/, + int /*bytes*/); + int (*write_mem) (host_callback * /*cb*/, struct cb_syscall * /*sc*/, + unsigned long /*taddr*/, const char * /*buf*/, + int /*bytes*/); + + /* For sanity checking, should be last entry. */ + int magic; +} CB_SYSCALL; + +/* Magic number sanity checker. */ +#define CB_SYSCALL_MAGIC 0x12344321 + +/* Macro to initialize CB_SYSCALL. Called first, before filling in + any fields. */ +#define CB_SYSCALL_INIT(sc) \ +do { \ + memset ((sc), 0, sizeof (*(sc))); \ + (sc)->magic = CB_SYSCALL_MAGIC; \ +} while (0) + +/* Return codes for various interface routines. */ + +typedef enum { + CB_RC_OK = 0, + /* generic error */ + CB_RC_ERR, + /* either file not found or no read access */ + CB_RC_ACCESS, + CB_RC_NO_MEM +} CB_RC; + +/* Read in target values for system call numbers, errno values, signals. */ +CB_RC cb_read_target_syscall_maps (host_callback *, const char *); + +/* Translate target to host syscall function numbers. */ +int cb_target_to_host_syscall (host_callback *, int); + +/* Translate host to target errno value. */ +int cb_host_to_target_errno (host_callback *, int); + +/* Translate target to host open flags. */ +int cb_target_to_host_open (host_callback *, int); + +/* Translate target signal number to host. */ +int cb_target_to_host_signal (host_callback *, int); + +/* Translate host signal number to target. */ +int cb_host_to_gdb_signal (host_callback *, int); + +/* Translate host stat struct to target. + If stat struct ptr is NULL, just compute target stat struct size. + Result is size of target stat struct or 0 if error. */ +int cb_host_to_target_stat (host_callback *, const struct stat *, PTR); + +/* Translate a value to target endian. */ +void cb_store_target_endian (host_callback *, char *, int, long); + +/* Tests for special fds. */ +int cb_is_stdin (host_callback *, int); +int cb_is_stdout (host_callback *, int); +int cb_is_stderr (host_callback *, int); + +/* Read a string out of the target. */ +int cb_get_string (host_callback *, CB_SYSCALL *, char *, int, unsigned long); + +/* Perform a system call. */ +CB_RC cb_syscall (host_callback *, CB_SYSCALL *); + +#endif diff --git a/include/gdb/fileio.h b/include/gdb/fileio.h new file mode 100644 index 0000000..73275d4 --- /dev/null +++ b/include/gdb/fileio.h @@ -0,0 +1,144 @@ +/* Hosted File I/O interface definitions, for GDB, the GNU Debugger. + + Copyright 2003-2013 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 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 . */ + +#ifndef GDB_FILEIO_H_ +#define GDB_FILEIO_H_ + +/* The following flags are defined to be independent of the host + as well as the target side implementation of these constants. + All constants are defined with a leading FILEIO_ in the name + to allow the usage of these constants together with the + corresponding implementation dependent constants in one module. */ + +/* open(2) flags */ +#define FILEIO_O_RDONLY 0x0 +#define FILEIO_O_WRONLY 0x1 +#define FILEIO_O_RDWR 0x2 +#define FILEIO_O_APPEND 0x8 +#define FILEIO_O_CREAT 0x200 +#define FILEIO_O_TRUNC 0x400 +#define FILEIO_O_EXCL 0x800 +#define FILEIO_O_SUPPORTED (FILEIO_O_RDONLY | FILEIO_O_WRONLY| \ + FILEIO_O_RDWR | FILEIO_O_APPEND| \ + FILEIO_O_CREAT | FILEIO_O_TRUNC| \ + FILEIO_O_EXCL) + +/* mode_t bits */ +#define FILEIO_S_IFREG 0100000 +#define FILEIO_S_IFDIR 040000 +#define FILEIO_S_IFCHR 020000 +#define FILEIO_S_IRUSR 0400 +#define FILEIO_S_IWUSR 0200 +#define FILEIO_S_IXUSR 0100 +#define FILEIO_S_IRWXU 0700 +#define FILEIO_S_IRGRP 040 +#define FILEIO_S_IWGRP 020 +#define FILEIO_S_IXGRP 010 +#define FILEIO_S_IRWXG 070 +#define FILEIO_S_IROTH 04 +#define FILEIO_S_IWOTH 02 +#define FILEIO_S_IXOTH 01 +#define FILEIO_S_IRWXO 07 +#define FILEIO_S_SUPPORTED (FILEIO_S_IFREG|FILEIO_S_IFDIR| \ + FILEIO_S_IRWXU|FILEIO_S_IRWXG| \ + FILEIO_S_IRWXO) + +/* lseek(2) flags */ +#define FILEIO_SEEK_SET 0 +#define FILEIO_SEEK_CUR 1 +#define FILEIO_SEEK_END 2 + +/* errno values */ +#define FILEIO_EPERM 1 +#define FILEIO_ENOENT 2 +#define FILEIO_EINTR 4 +#define FILEIO_EIO 5 +#define FILEIO_EBADF 9 +#define FILEIO_EACCES 13 +#define FILEIO_EFAULT 14 +#define FILEIO_EBUSY 16 +#define FILEIO_EEXIST 17 +#define FILEIO_ENODEV 19 +#define FILEIO_ENOTDIR 20 +#define FILEIO_EISDIR 21 +#define FILEIO_EINVAL 22 +#define FILEIO_ENFILE 23 +#define FILEIO_EMFILE 24 +#define FILEIO_EFBIG 27 +#define FILEIO_ENOSPC 28 +#define FILEIO_ESPIPE 29 +#define FILEIO_EROFS 30 +#define FILEIO_ENOSYS 88 +#define FILEIO_ENAMETOOLONG 91 +#define FILEIO_EUNKNOWN 9999 + +/* limits */ +#define FILEIO_INT_MIN -2147483648L +#define FILEIO_INT_MAX 2147483647L +#define FILEIO_UINT_MAX 4294967295UL +#define FILEIO_LONG_MIN -9223372036854775808LL +#define FILEIO_LONG_MAX 9223372036854775807LL +#define FILEIO_ULONG_MAX 18446744073709551615ULL + +/* Integral types as used in protocol. */ +#if 0 +typedef __int32_t fio_int_t; +typedef __uint32_t fio_uint_t, fio_mode_t, fio_time_t; +typedef __int64_t fio_long_t; +typedef __uint64_t fio_ulong_t; +#endif + +#define FIO_INT_LEN 4 +#define FIO_UINT_LEN 4 +#define FIO_MODE_LEN 4 +#define FIO_TIME_LEN 4 +#define FIO_LONG_LEN 8 +#define FIO_ULONG_LEN 8 + +typedef char fio_int_t[FIO_INT_LEN]; +typedef char fio_uint_t[FIO_UINT_LEN]; +typedef char fio_mode_t[FIO_MODE_LEN]; +typedef char fio_time_t[FIO_TIME_LEN]; +typedef char fio_long_t[FIO_LONG_LEN]; +typedef char fio_ulong_t[FIO_ULONG_LEN]; + +/* Struct stat as used in protocol. For complete independence + of host/target systems, it's defined as an array with offsets + to the members. */ + +struct fio_stat { + fio_uint_t fst_dev; + fio_uint_t fst_ino; + fio_mode_t fst_mode; + fio_uint_t fst_nlink; + fio_uint_t fst_uid; + fio_uint_t fst_gid; + fio_uint_t fst_rdev; + fio_ulong_t fst_size; + fio_ulong_t fst_blksize; + fio_ulong_t fst_blocks; + fio_time_t fst_atime; + fio_time_t fst_mtime; + fio_time_t fst_ctime; +}; + +struct fio_timeval { + fio_time_t ftv_sec; + fio_long_t ftv_usec; +}; + +#endif /* GDB_FILEIO_H_ */ diff --git a/include/gdb/gdb-index.h b/include/gdb/gdb-index.h new file mode 100644 index 0000000..4e3d0a7 --- /dev/null +++ b/include/gdb/gdb-index.h @@ -0,0 +1,99 @@ +/* Public attributes of the .gdb_index section. + Copyright (C) 2012-2015 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +/* This file contains values for understanding the .gdb_index section + needed by more than just GDB, e.g. readelf. */ + +#ifndef GDB_INDEX_H +#define GDB_INDEX_H + +/* Each symbol in .gdb_index refers to a set of CUs that defines the symbol. + Each CU is represented by a 32 bit number that is the index of the CU in + the CU table, plus some attributes of the use of the symbol in that CU. + + The values are defined such that if all the bits are zero, then no + special meaning is assigned to any of them. This is done to preserve + compatibility with older indices. The way this is done is to specify + that if the GDB_INDEX_SYMBOL_KIND value is zero then all other attribute + bits must be zero. + + 0-23 CU index + 24-27 reserved + 28-30 symbol kind + 31 0 == global, 1 == static + + Bits 24-27 are reserved because it's easier to relax restrictions than + it is to impose them after the fact. At present 24 bits to represent + the CU index is plenty. If we need more bits for the CU index or for + attributes then we have them. */ + +/* Whether the symbol is in GLOBAL_BLOCK (== 0) or STATIC_BLOCK (== 1). */ +#define GDB_INDEX_SYMBOL_STATIC_SHIFT 31 +#define GDB_INDEX_SYMBOL_STATIC_MASK 1 +#define GDB_INDEX_SYMBOL_STATIC_VALUE(cu_index) \ + (((cu_index) >> GDB_INDEX_SYMBOL_STATIC_SHIFT) & GDB_INDEX_SYMBOL_STATIC_MASK) +#define GDB_INDEX_SYMBOL_STATIC_SET_VALUE(cu_index, value) \ + do { \ + (cu_index) |= (((value) & GDB_INDEX_SYMBOL_STATIC_MASK) \ + << GDB_INDEX_SYMBOL_STATIC_SHIFT); \ + } while (0) + +/* The kind of the symbol. + We don't use GDB's internal values as these numbers are published + so that other tools can build and read .gdb_index. */ + +typedef enum { + /* Special value to indicate no attributes are present. */ + GDB_INDEX_SYMBOL_KIND_NONE = 0, + GDB_INDEX_SYMBOL_KIND_TYPE = 1, + GDB_INDEX_SYMBOL_KIND_VARIABLE = 2, + GDB_INDEX_SYMBOL_KIND_FUNCTION = 3, + GDB_INDEX_SYMBOL_KIND_OTHER = 4, + /* We currently allocate 3 bits to record the symbol kind. + Give the unused bits a value so gdb will print them sensibly. */ + GDB_INDEX_SYMBOL_KIND_UNUSED5 = 5, + GDB_INDEX_SYMBOL_KIND_UNUSED6 = 6, + GDB_INDEX_SYMBOL_KIND_UNUSED7 = 7 +} gdb_index_symbol_kind; + +#define GDB_INDEX_SYMBOL_KIND_SHIFT 28 +#define GDB_INDEX_SYMBOL_KIND_MASK 7 +#define GDB_INDEX_SYMBOL_KIND_VALUE(cu_index) \ + ((gdb_index_symbol_kind) (((cu_index) >> GDB_INDEX_SYMBOL_KIND_SHIFT) \ + & GDB_INDEX_SYMBOL_KIND_MASK)) +#define GDB_INDEX_SYMBOL_KIND_SET_VALUE(cu_index, value) \ + do { \ + (cu_index) |= (((value) & GDB_INDEX_SYMBOL_KIND_MASK) \ + << GDB_INDEX_SYMBOL_KIND_SHIFT); \ + } while (0) + +#define GDB_INDEX_RESERVED_SHIFT 24 +#define GDB_INDEX_RESERVED_MASK 15 +#define GDB_INDEX_RESERVED_VALUE(cu_index) \ + (((cu_index) >> GDB_INDEX_RESERVED_SHIFT) & GDB_INDEX_RESERVED_MASK) + +/* CU index. */ +#define GDB_INDEX_CU_BITSIZE 24 +#define GDB_INDEX_CU_MASK ((1 << GDB_INDEX_CU_BITSIZE) - 1) +#define GDB_INDEX_CU_VALUE(cu_index) ((cu_index) & GDB_INDEX_CU_MASK) +#define GDB_INDEX_CU_SET_VALUE(cu_index, value) \ + do { \ + (cu_index) |= (value) & GDB_INDEX_CU_MASK; \ + } while (0) + +#endif /* GDB_INDEX_H */ diff --git a/include/gdb/remote-sim.h b/include/gdb/remote-sim.h new file mode 100644 index 0000000..113030c --- /dev/null +++ b/include/gdb/remote-sim.h @@ -0,0 +1,287 @@ +/* This file defines the interface between the simulator and gdb. + + Copyright 1993-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#if !defined (REMOTE_SIM_H) +#define REMOTE_SIM_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* This file is used when building stand-alone simulators, so isolate this + file from gdb. */ + +/* Pick up CORE_ADDR_TYPE if defined (from gdb), otherwise use same value as + gdb does (unsigned int - from defs.h). */ + +#ifndef CORE_ADDR_TYPE +typedef unsigned int SIM_ADDR; +#else +typedef CORE_ADDR_TYPE SIM_ADDR; +#endif + + +/* Semi-opaque type used as result of sim_open and passed back to all + other routines. "desc" is short for "descriptor". + It is up to each simulator to define `sim_state'. */ + +typedef struct sim_state *SIM_DESC; + + +/* Values for `kind' arg to sim_open. */ + +typedef enum { + SIM_OPEN_STANDALONE, /* simulator used standalone (run.c) */ + SIM_OPEN_DEBUG /* simulator used by debugger (gdb) */ +} SIM_OPEN_KIND; + + +/* Return codes from various functions. */ + +typedef enum { + SIM_RC_FAIL = 0, + SIM_RC_OK = 1 +} SIM_RC; + + +/* The bfd struct, as an opaque type. */ + +struct bfd; + + +/* Main simulator entry points. */ + + +/* Create a fully initialized simulator instance. + + (This function is called when the simulator is selected from the + gdb command line.) + + KIND specifies how the simulator shall be used. Currently there + are only two kinds: stand-alone and debug. + + CALLBACK specifies a standard host callback (defined in callback.h). + + ABFD, when non NULL, designates a target program. The program is + not loaded. + + ARGV is a standard ARGV pointer such as that passed from the + command line. The syntax of the argument list is is assumed to be + ``SIM-PROG { SIM-OPTION } [ TARGET-PROGRAM { TARGET-OPTION } ]''. + The trailing TARGET-PROGRAM and args are only valid for a + stand-alone simulator. + + On success, the result is a non NULL descriptor that shall be + passed to the other sim_foo functions. While the simulator + configuration can be parameterized by (in decreasing precedence) + ARGV's SIM-OPTION, ARGV's TARGET-PROGRAM and the ABFD argument, the + successful creation of the simulator shall not dependent on the + presence of any of these arguments/options. + + Hardware simulator: The created simulator shall be sufficiently + initialized to handle, with out restrictions any client requests + (including memory reads/writes, register fetch/stores and a + resume). + + Process simulator: that process is not created until a call to + sim_create_inferior. FIXME: What should the state of the simulator + be? */ + +SIM_DESC sim_open (SIM_OPEN_KIND kind, struct host_callback_struct *callback, struct bfd *abfd, char **argv); + + +/* Destory a simulator instance. + + QUITTING is non-zero if we cannot hang on errors. + + This may involve freeing target memory and closing any open files + and mmap'd areas. You cannot assume sim_kill has already been + called. */ + +void sim_close (SIM_DESC sd, int quitting); + + +/* Load program PROG into the simulators memory. + + If ABFD is non-NULL, the bfd for the file has already been opened. + The result is a return code indicating success. + + Hardware simulator: Normally, each program section is written into + memory according to that sections LMA using physical (direct) + addressing. The exception being systems, such as PPC/CHRP, which + support more complicated program loaders. A call to this function + should not effect the state of the processor registers. Multiple + calls to this function are permitted and have an accumulative + effect. + + Process simulator: Calls to this function may be ignored. + + FIXME: Most hardware simulators load the image at the VMA using + virtual addressing. + + FIXME: For some hardware targets, before a loaded program can be + executed, it requires the manipulation of VM registers and tables. + Such manipulation should probably (?) occure in + sim_create_inferior. */ + +SIM_RC sim_load (SIM_DESC sd, char *prog, struct bfd *abfd, int from_tty); + + +/* Prepare to run the simulated program. + + ABFD, if not NULL, provides initial processor state information. + ARGV and ENV, if non NULL, are NULL terminated lists of pointers. + + Hardware simulator: This function shall initialize the processor + registers to a known value. The program counter and possibly stack + pointer shall be set using information obtained from ABFD (or + hardware reset defaults). ARGV and ENV, dependant on the target + ABI, may be written to memory. + + Process simulator: After a call to this function, a new process + instance shall exist. The TEXT, DATA, BSS and stack regions shall + all be initialized, ARGV and ENV shall be written to process + address space (according to the applicable ABI) and the program + counter and stack pointer set accordingly. */ + +SIM_RC sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env); + + +/* Fetch LENGTH bytes of the simulated program's memory. Start fetch + at virtual address MEM and store in BUF. Result is number of bytes + read, or zero if error. */ + +int sim_read (SIM_DESC sd, SIM_ADDR mem, unsigned char *buf, int length); + + +/* Store LENGTH bytes from BUF into the simulated program's + memory. Store bytes starting at virtual address MEM. Result is + number of bytes write, or zero if error. */ + +int sim_write (SIM_DESC sd, SIM_ADDR mem, const unsigned char *buf, int length); + + +/* Fetch register REGNO storing its raw (target endian) value in the + LENGTH byte buffer BUF. Return the actual size of the register or + zero if REGNO is not applicable. + + Legacy implementations ignore LENGTH and always return -1. + + If LENGTH does not match the size of REGNO no data is transfered + (the actual register size is still returned). */ + +int sim_fetch_register (SIM_DESC sd, int regno, unsigned char *buf, int length); + + +/* Store register REGNO from the raw (target endian) value in BUF. + + Return the actual size of the register, any size not equal to + LENGTH indicates the register was not updated correctly. + + Return a LENGTH of -1 to indicate the register was not updated + and an error has occurred. + + Return a LENGTH of 0 to indicate the register was not updated + but no error has occurred. */ + +int sim_store_register (SIM_DESC sd, int regno, unsigned char *buf, int length); + + +/* Print whatever statistics the simulator has collected. + + VERBOSE is currently unused and must always be zero. */ + +void sim_info (SIM_DESC sd, int verbose); + + +/* Run (or resume) the simulated program. + + STEP, when non-zero indicates that only a single simulator cycle + should be emulated. + + SIGGNAL, if non-zero is a (HOST) SIGRC value indicating the type of + event (hardware interrupt, signal) to be delivered to the simulated + program. + + Hardware simulator: If the SIGRC value returned by + sim_stop_reason() is passed back to the simulator via SIGGNAL then + the hardware simulator shall correctly deliver the hardware event + indicated by that signal. If a value of zero is passed in then the + simulation will continue as if there were no outstanding signal. + The effect of any other SIGGNAL value is is implementation + dependant. + + Process simulator: If SIGRC is non-zero then the corresponding + signal is delivered to the simulated program and execution is then + continued. A zero SIGRC value indicates that the program should + continue as normal. */ + +void sim_resume (SIM_DESC sd, int step, int siggnal); + + +/* Asynchronous request to stop the simulation. + A nonzero return indicates that the simulator is able to handle + the request */ + +int sim_stop (SIM_DESC sd); + + +/* Fetch the REASON why the program stopped. + + SIM_EXITED: The program has terminated. SIGRC indicates the target + dependant exit status. + + SIM_STOPPED: The program has stopped. SIGRC uses the host's signal + numbering as a way of identifying the reaon: program interrupted by + user via a sim_stop request (SIGINT); a breakpoint instruction + (SIGTRAP); a completed single step (SIGTRAP); an internal error + condition (SIGABRT); an illegal instruction (SIGILL); Access to an + undefined memory region (SIGSEGV); Mis-aligned memory access + (SIGBUS). For some signals information in addition to the signal + number may be retained by the simulator (e.g. offending address), + that information is not directly accessable via this interface. + + SIM_SIGNALLED: The program has been terminated by a signal. The + simulator has encountered target code that causes the the program + to exit with signal SIGRC. + + SIM_RUNNING, SIM_POLLING: The return of one of these values + indicates a problem internal to the simulator. */ + +enum sim_stop { sim_running, sim_polling, sim_exited, sim_stopped, sim_signalled }; + +void sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc); + + +/* Passthru for other commands that the simulator might support. + Simulators should be prepared to deal with any combination of NULL + or empty CMD. */ + +void sim_do_command (SIM_DESC sd, char *cmd); + +/* Complete a command based on the available sim commands. Returns an + array of possible matches. */ + +char **sim_complete_command (SIM_DESC sd, const char *text, const char *word); + +#ifdef __cplusplus +} +#endif + +#endif /* !defined (REMOTE_SIM_H) */ diff --git a/include/gdb/signals.def b/include/gdb/signals.def new file mode 100644 index 0000000..637d00d --- /dev/null +++ b/include/gdb/signals.def @@ -0,0 +1,200 @@ +/* Target signal numbers for GDB and the GDB remote protocol. + Copyright 2010-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +/* Used some places (e.g. stop_signal) to record the concept that + there is no signal. */ +SET (GDB_SIGNAL_0, 0, "0", "Signal 0") +#define GDB_SIGNAL_FIRST GDB_SIGNAL_0 +SET (GDB_SIGNAL_HUP, 1, "SIGHUP", "Hangup") +SET (GDB_SIGNAL_INT, 2, "SIGINT", "Interrupt") +SET (GDB_SIGNAL_QUIT, 3, "SIGQUIT", "Quit") +SET (GDB_SIGNAL_ILL, 4, "SIGILL", "Illegal instruction") +SET (GDB_SIGNAL_TRAP, 5, "SIGTRAP", "Trace/breakpoint trap") +SET (GDB_SIGNAL_ABRT, 6, "SIGABRT", "Aborted") +SET (GDB_SIGNAL_EMT, 7, "SIGEMT", "Emulation trap") +SET (GDB_SIGNAL_FPE, 8, "SIGFPE", "Arithmetic exception") +SET (GDB_SIGNAL_KILL, 9, "SIGKILL", "Killed") +SET (GDB_SIGNAL_BUS, 10, "SIGBUS", "Bus error") +SET (GDB_SIGNAL_SEGV, 11, "SIGSEGV", "Segmentation fault") +SET (GDB_SIGNAL_SYS, 12, "SIGSYS", "Bad system call") +SET (GDB_SIGNAL_PIPE, 13, "SIGPIPE", "Broken pipe") +SET (GDB_SIGNAL_ALRM, 14, "SIGALRM", "Alarm clock") +SET (GDB_SIGNAL_TERM, 15, "SIGTERM", "Terminated") +SET (GDB_SIGNAL_URG, 16, "SIGURG", "Urgent I/O condition") +SET (GDB_SIGNAL_STOP, 17, "SIGSTOP", "Stopped (signal)") +SET (GDB_SIGNAL_TSTP, 18, "SIGTSTP", "Stopped (user)") +SET (GDB_SIGNAL_CONT, 19, "SIGCONT", "Continued") +SET (GDB_SIGNAL_CHLD, 20, "SIGCHLD", "Child status changed") +SET (GDB_SIGNAL_TTIN, 21, "SIGTTIN", "Stopped (tty input)") +SET (GDB_SIGNAL_TTOU, 22, "SIGTTOU", "Stopped (tty output)") +SET (GDB_SIGNAL_IO, 23, "SIGIO", "I/O possible") +SET (GDB_SIGNAL_XCPU, 24, "SIGXCPU", "CPU time limit exceeded") +SET (GDB_SIGNAL_XFSZ, 25, "SIGXFSZ", "File size limit exceeded") +SET (GDB_SIGNAL_VTALRM, 26, "SIGVTALRM", "Virtual timer expired") +SET (GDB_SIGNAL_PROF, 27, "SIGPROF", "Profiling timer expired") +SET (GDB_SIGNAL_WINCH, 28, "SIGWINCH", "Window size changed") +SET (GDB_SIGNAL_LOST, 29, "SIGLOST", "Resource lost") +SET (GDB_SIGNAL_USR1, 30, "SIGUSR1", "User defined signal 1") +SET (GDB_SIGNAL_USR2, 31, "SIGUSR2", "User defined signal 2") +SET (GDB_SIGNAL_PWR, 32, "SIGPWR", "Power fail/restart") +/* Similar to SIGIO. Perhaps they should have the same number. */ +SET (GDB_SIGNAL_POLL, 33, "SIGPOLL", "Pollable event occurred") +SET (GDB_SIGNAL_WIND, 34, "SIGWIND", "SIGWIND") +SET (GDB_SIGNAL_PHONE, 35, "SIGPHONE", "SIGPHONE") +SET (GDB_SIGNAL_WAITING, 36, "SIGWAITING", "Process's LWPs are blocked") +SET (GDB_SIGNAL_LWP, 37, "SIGLWP", "Signal LWP") +SET (GDB_SIGNAL_DANGER, 38, "SIGDANGER", "Swap space dangerously low") +SET (GDB_SIGNAL_GRANT, 39, "SIGGRANT", "Monitor mode granted") +SET (GDB_SIGNAL_RETRACT, 40, "SIGRETRACT", + "Need to relinquish monitor mode") +SET (GDB_SIGNAL_MSG, 41, "SIGMSG", "Monitor mode data available") +SET (GDB_SIGNAL_SOUND, 42, "SIGSOUND", "Sound completed") +SET (GDB_SIGNAL_SAK, 43, "SIGSAK", "Secure attention") +SET (GDB_SIGNAL_PRIO, 44, "SIGPRIO", "SIGPRIO") +SET (GDB_SIGNAL_REALTIME_33, 45, "SIG33", "Real-time event 33") +SET (GDB_SIGNAL_REALTIME_34, 46, "SIG34", "Real-time event 34") +SET (GDB_SIGNAL_REALTIME_35, 47, "SIG35", "Real-time event 35") +SET (GDB_SIGNAL_REALTIME_36, 48, "SIG36", "Real-time event 36") +SET (GDB_SIGNAL_REALTIME_37, 49, "SIG37", "Real-time event 37") +SET (GDB_SIGNAL_REALTIME_38, 50, "SIG38", "Real-time event 38") +SET (GDB_SIGNAL_REALTIME_39, 51, "SIG39", "Real-time event 39") +SET (GDB_SIGNAL_REALTIME_40, 52, "SIG40", "Real-time event 40") +SET (GDB_SIGNAL_REALTIME_41, 53, "SIG41", "Real-time event 41") +SET (GDB_SIGNAL_REALTIME_42, 54, "SIG42", "Real-time event 42") +SET (GDB_SIGNAL_REALTIME_43, 55, "SIG43", "Real-time event 43") +SET (GDB_SIGNAL_REALTIME_44, 56, "SIG44", "Real-time event 44") +SET (GDB_SIGNAL_REALTIME_45, 57, "SIG45", "Real-time event 45") +SET (GDB_SIGNAL_REALTIME_46, 58, "SIG46", "Real-time event 46") +SET (GDB_SIGNAL_REALTIME_47, 59, "SIG47", "Real-time event 47") +SET (GDB_SIGNAL_REALTIME_48, 60, "SIG48", "Real-time event 48") +SET (GDB_SIGNAL_REALTIME_49, 61, "SIG49", "Real-time event 49") +SET (GDB_SIGNAL_REALTIME_50, 62, "SIG50", "Real-time event 50") +SET (GDB_SIGNAL_REALTIME_51, 63, "SIG51", "Real-time event 51") +SET (GDB_SIGNAL_REALTIME_52, 64, "SIG52", "Real-time event 52") +SET (GDB_SIGNAL_REALTIME_53, 65, "SIG53", "Real-time event 53") +SET (GDB_SIGNAL_REALTIME_54, 66, "SIG54", "Real-time event 54") +SET (GDB_SIGNAL_REALTIME_55, 67, "SIG55", "Real-time event 55") +SET (GDB_SIGNAL_REALTIME_56, 68, "SIG56", "Real-time event 56") +SET (GDB_SIGNAL_REALTIME_57, 69, "SIG57", "Real-time event 57") +SET (GDB_SIGNAL_REALTIME_58, 70, "SIG58", "Real-time event 58") +SET (GDB_SIGNAL_REALTIME_59, 71, "SIG59", "Real-time event 59") +SET (GDB_SIGNAL_REALTIME_60, 72, "SIG60", "Real-time event 60") +SET (GDB_SIGNAL_REALTIME_61, 73, "SIG61", "Real-time event 61") +SET (GDB_SIGNAL_REALTIME_62, 74, "SIG62", "Real-time event 62") +SET (GDB_SIGNAL_REALTIME_63, 75, "SIG63", "Real-time event 63") + +/* Used internally by Solaris threads. See signal(5) on Solaris. */ +SET (GDB_SIGNAL_CANCEL, 76, "SIGCANCEL", "LWP internal signal") + +/* Yes, this pains me, too. But LynxOS didn't have SIG32, and now + GNU/Linux does, and we can't disturb the numbering, since it's + part of the remote protocol. Note that in some GDB's + GDB_SIGNAL_REALTIME_32 is number 76. */ +SET (GDB_SIGNAL_REALTIME_32, 77, "SIG32", "Real-time event 32") +/* Yet another pain, IRIX 6 has SIG64. */ +SET (GDB_SIGNAL_REALTIME_64, 78, "SIG64", "Real-time event 64") +/* Yet another pain, GNU/Linux MIPS might go up to 128. */ +SET (GDB_SIGNAL_REALTIME_65, 79, "SIG65", "Real-time event 65") +SET (GDB_SIGNAL_REALTIME_66, 80, "SIG66", "Real-time event 66") +SET (GDB_SIGNAL_REALTIME_67, 81, "SIG67", "Real-time event 67") +SET (GDB_SIGNAL_REALTIME_68, 82, "SIG68", "Real-time event 68") +SET (GDB_SIGNAL_REALTIME_69, 83, "SIG69", "Real-time event 69") +SET (GDB_SIGNAL_REALTIME_70, 84, "SIG70", "Real-time event 70") +SET (GDB_SIGNAL_REALTIME_71, 85, "SIG71", "Real-time event 71") +SET (GDB_SIGNAL_REALTIME_72, 86, "SIG72", "Real-time event 72") +SET (GDB_SIGNAL_REALTIME_73, 87, "SIG73", "Real-time event 73") +SET (GDB_SIGNAL_REALTIME_74, 88, "SIG74", "Real-time event 74") +SET (GDB_SIGNAL_REALTIME_75, 89, "SIG75", "Real-time event 75") +SET (GDB_SIGNAL_REALTIME_76, 90, "SIG76", "Real-time event 76") +SET (GDB_SIGNAL_REALTIME_77, 91, "SIG77", "Real-time event 77") +SET (GDB_SIGNAL_REALTIME_78, 92, "SIG78", "Real-time event 78") +SET (GDB_SIGNAL_REALTIME_79, 93, "SIG79", "Real-time event 79") +SET (GDB_SIGNAL_REALTIME_80, 94, "SIG80", "Real-time event 80") +SET (GDB_SIGNAL_REALTIME_81, 95, "SIG81", "Real-time event 81") +SET (GDB_SIGNAL_REALTIME_82, 96, "SIG82", "Real-time event 82") +SET (GDB_SIGNAL_REALTIME_83, 97, "SIG83", "Real-time event 83") +SET (GDB_SIGNAL_REALTIME_84, 98, "SIG84", "Real-time event 84") +SET (GDB_SIGNAL_REALTIME_85, 99, "SIG85", "Real-time event 85") +SET (GDB_SIGNAL_REALTIME_86, 100, "SIG86", "Real-time event 86") +SET (GDB_SIGNAL_REALTIME_87, 101, "SIG87", "Real-time event 87") +SET (GDB_SIGNAL_REALTIME_88, 102, "SIG88", "Real-time event 88") +SET (GDB_SIGNAL_REALTIME_89, 103, "SIG89", "Real-time event 89") +SET (GDB_SIGNAL_REALTIME_90, 104, "SIG90", "Real-time event 90") +SET (GDB_SIGNAL_REALTIME_91, 105, "SIG91", "Real-time event 91") +SET (GDB_SIGNAL_REALTIME_92, 106, "SIG92", "Real-time event 92") +SET (GDB_SIGNAL_REALTIME_93, 107, "SIG93", "Real-time event 93") +SET (GDB_SIGNAL_REALTIME_94, 108, "SIG94", "Real-time event 94") +SET (GDB_SIGNAL_REALTIME_95, 109, "SIG95", "Real-time event 95") +SET (GDB_SIGNAL_REALTIME_96, 110, "SIG96", "Real-time event 96") +SET (GDB_SIGNAL_REALTIME_97, 111, "SIG97", "Real-time event 97") +SET (GDB_SIGNAL_REALTIME_98, 112, "SIG98", "Real-time event 98") +SET (GDB_SIGNAL_REALTIME_99, 113, "SIG99", "Real-time event 99") +SET (GDB_SIGNAL_REALTIME_100, 114, "SIG100", "Real-time event 100") +SET (GDB_SIGNAL_REALTIME_101, 115, "SIG101", "Real-time event 101") +SET (GDB_SIGNAL_REALTIME_102, 116, "SIG102", "Real-time event 102") +SET (GDB_SIGNAL_REALTIME_103, 117, "SIG103", "Real-time event 103") +SET (GDB_SIGNAL_REALTIME_104, 118, "SIG104", "Real-time event 104") +SET (GDB_SIGNAL_REALTIME_105, 119, "SIG105", "Real-time event 105") +SET (GDB_SIGNAL_REALTIME_106, 120, "SIG106", "Real-time event 106") +SET (GDB_SIGNAL_REALTIME_107, 121, "SIG107", "Real-time event 107") +SET (GDB_SIGNAL_REALTIME_108, 122, "SIG108", "Real-time event 108") +SET (GDB_SIGNAL_REALTIME_109, 123, "SIG109", "Real-time event 109") +SET (GDB_SIGNAL_REALTIME_110, 124, "SIG110", "Real-time event 110") +SET (GDB_SIGNAL_REALTIME_111, 125, "SIG111", "Real-time event 111") +SET (GDB_SIGNAL_REALTIME_112, 126, "SIG112", "Real-time event 112") +SET (GDB_SIGNAL_REALTIME_113, 127, "SIG113", "Real-time event 113") +SET (GDB_SIGNAL_REALTIME_114, 128, "SIG114", "Real-time event 114") +SET (GDB_SIGNAL_REALTIME_115, 129, "SIG115", "Real-time event 115") +SET (GDB_SIGNAL_REALTIME_116, 130, "SIG116", "Real-time event 116") +SET (GDB_SIGNAL_REALTIME_117, 131, "SIG117", "Real-time event 117") +SET (GDB_SIGNAL_REALTIME_118, 132, "SIG118", "Real-time event 118") +SET (GDB_SIGNAL_REALTIME_119, 133, "SIG119", "Real-time event 119") +SET (GDB_SIGNAL_REALTIME_120, 134, "SIG120", "Real-time event 120") +SET (GDB_SIGNAL_REALTIME_121, 135, "SIG121", "Real-time event 121") +SET (GDB_SIGNAL_REALTIME_122, 136, "SIG122", "Real-time event 122") +SET (GDB_SIGNAL_REALTIME_123, 137, "SIG123", "Real-time event 123") +SET (GDB_SIGNAL_REALTIME_124, 138, "SIG124", "Real-time event 124") +SET (GDB_SIGNAL_REALTIME_125, 139, "SIG125", "Real-time event 125") +SET (GDB_SIGNAL_REALTIME_126, 140, "SIG126", "Real-time event 126") +SET (GDB_SIGNAL_REALTIME_127, 141, "SIG127", "Real-time event 127") + +SET (GDB_SIGNAL_INFO, 142, "SIGINFO", "Information request") + +/* Some signal we don't know about. */ +SET (GDB_SIGNAL_UNKNOWN, 143, NULL, "Unknown signal") + +/* Use whatever signal we use when one is not specifically specified + (for passing to proceed and so on). */ +SET (GDB_SIGNAL_DEFAULT, 144, NULL, + "Internal error: printing GDB_SIGNAL_DEFAULT") + +/* Mach exceptions. In versions of GDB before 5.2, these were just before + GDB_SIGNAL_INFO if you were compiling on a Mach host (and missing + otherwise). */ +SET (TARGET_EXC_BAD_ACCESS, 145, "EXC_BAD_ACCESS", "Could not access memory") +SET (TARGET_EXC_BAD_INSTRUCTION, 146, "EXC_BAD_INSTRUCTION", + "Illegal instruction/operand") +SET (TARGET_EXC_ARITHMETIC, 147, "EXC_ARITHMETIC", "Arithmetic exception") +SET (TARGET_EXC_EMULATION, 148, "EXC_EMULATION", "Emulation instruction") +SET (TARGET_EXC_SOFTWARE, 149, "EXC_SOFTWARE", "Software generated exception") +SET (TARGET_EXC_BREAKPOINT, 150, "EXC_BREAKPOINT", "Breakpoint") + +/* If you are adding a new signal, add it just above this comment. */ + +/* Last and unused enum value, for sizing arrays, etc. */ +SET (GDB_SIGNAL_LAST, 151, NULL, "GDB_SIGNAL_MAGIC") diff --git a/include/gdb/signals.h b/include/gdb/signals.h new file mode 100644 index 0000000..1ee2c16 --- /dev/null +++ b/include/gdb/signals.h @@ -0,0 +1,58 @@ +/* Target signal numbers for GDB and the GDB remote protocol. + Copyright 1986-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#ifndef GDB_SIGNALS_H +#define GDB_SIGNALS_H + +/* The numbering of these signals is chosen to match traditional unix + signals (insofar as various unices use the same numbers, anyway). + It is also the numbering of the GDB remote protocol. Other remote + protocols, if they use a different numbering, should make sure to + translate appropriately. + + Since these numbers have actually made it out into other software + (stubs, etc.), you mustn't disturb the assigned numbering. If you + need to add new signals here, add them to the end of the explicitly + numbered signals, at the comment marker. Add them unconditionally, + not within any #if or #ifdef. + + This is based strongly on Unix/POSIX signals for several reasons: + (1) This set of signals represents a widely-accepted attempt to + represent events of this sort in a portable fashion, (2) we want a + signal to make it from wait to child_wait to the user intact, (3) many + remote protocols use a similar encoding. However, it is + recognized that this set of signals has limitations (such as not + distinguishing between various kinds of SIGSEGV, or not + distinguishing hitting a breakpoint from finishing a single step). + So in the future we may get around this either by adding additional + signals for breakpoint, single-step, etc., or by adding signal + codes; the latter seems more in the spirit of what BSD, System V, + etc. are doing to address these issues. */ + +/* For an explanation of what each signal means, see + gdb_signal_to_string. */ + +enum gdb_signal + { +#define SET(symbol, constant, name, string) \ + symbol = constant, +#include "gdb/signals.def" +#undef SET + }; + +#endif /* #ifndef GDB_SIGNALS_H */ diff --git a/include/gdb/sim-arm.h b/include/gdb/sim-arm.h new file mode 100644 index 0000000..cae062f --- /dev/null +++ b/include/gdb/sim-arm.h @@ -0,0 +1,112 @@ +/* This file defines the interface between the Arm simulator and GDB. + + Copyright 2002-2013 Free Software Foundation, Inc. + + Contributed by Red Hat. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_ARM_H) +#define SIM_ARM_H + +#ifdef __cplusplus +extern "C" { // } +#endif + +enum sim_arm_regs +{ + SIM_ARM_R0_REGNUM, + SIM_ARM_R1_REGNUM, + SIM_ARM_R2_REGNUM, + SIM_ARM_R3_REGNUM, + SIM_ARM_R4_REGNUM, + SIM_ARM_R5_REGNUM, + SIM_ARM_R6_REGNUM, + SIM_ARM_R7_REGNUM, + SIM_ARM_R8_REGNUM, + SIM_ARM_R9_REGNUM, + SIM_ARM_R10_REGNUM, + SIM_ARM_R11_REGNUM, + SIM_ARM_R12_REGNUM, + SIM_ARM_R13_REGNUM, + SIM_ARM_R14_REGNUM, + SIM_ARM_R15_REGNUM, /* PC */ + SIM_ARM_FP0_REGNUM, + SIM_ARM_FP1_REGNUM, + SIM_ARM_FP2_REGNUM, + SIM_ARM_FP3_REGNUM, + SIM_ARM_FP4_REGNUM, + SIM_ARM_FP5_REGNUM, + SIM_ARM_FP6_REGNUM, + SIM_ARM_FP7_REGNUM, + SIM_ARM_FPS_REGNUM, + SIM_ARM_PS_REGNUM, + SIM_ARM_MAVERIC_COP0R0_REGNUM, + SIM_ARM_MAVERIC_COP0R1_REGNUM, + SIM_ARM_MAVERIC_COP0R2_REGNUM, + SIM_ARM_MAVERIC_COP0R3_REGNUM, + SIM_ARM_MAVERIC_COP0R4_REGNUM, + SIM_ARM_MAVERIC_COP0R5_REGNUM, + SIM_ARM_MAVERIC_COP0R6_REGNUM, + SIM_ARM_MAVERIC_COP0R7_REGNUM, + SIM_ARM_MAVERIC_COP0R8_REGNUM, + SIM_ARM_MAVERIC_COP0R9_REGNUM, + SIM_ARM_MAVERIC_COP0R10_REGNUM, + SIM_ARM_MAVERIC_COP0R11_REGNUM, + SIM_ARM_MAVERIC_COP0R12_REGNUM, + SIM_ARM_MAVERIC_COP0R13_REGNUM, + SIM_ARM_MAVERIC_COP0R14_REGNUM, + SIM_ARM_MAVERIC_COP0R15_REGNUM, + SIM_ARM_MAVERIC_DSPSC_REGNUM, + SIM_ARM_IWMMXT_COP0R0_REGNUM, + SIM_ARM_IWMMXT_COP0R1_REGNUM, + SIM_ARM_IWMMXT_COP0R2_REGNUM, + SIM_ARM_IWMMXT_COP0R3_REGNUM, + SIM_ARM_IWMMXT_COP0R4_REGNUM, + SIM_ARM_IWMMXT_COP0R5_REGNUM, + SIM_ARM_IWMMXT_COP0R6_REGNUM, + SIM_ARM_IWMMXT_COP0R7_REGNUM, + SIM_ARM_IWMMXT_COP0R8_REGNUM, + SIM_ARM_IWMMXT_COP0R9_REGNUM, + SIM_ARM_IWMMXT_COP0R10_REGNUM, + SIM_ARM_IWMMXT_COP0R11_REGNUM, + SIM_ARM_IWMMXT_COP0R12_REGNUM, + SIM_ARM_IWMMXT_COP0R13_REGNUM, + SIM_ARM_IWMMXT_COP0R14_REGNUM, + SIM_ARM_IWMMXT_COP0R15_REGNUM, + SIM_ARM_IWMMXT_COP1R0_REGNUM, + SIM_ARM_IWMMXT_COP1R1_REGNUM, + SIM_ARM_IWMMXT_COP1R2_REGNUM, + SIM_ARM_IWMMXT_COP1R3_REGNUM, + SIM_ARM_IWMMXT_COP1R4_REGNUM, + SIM_ARM_IWMMXT_COP1R5_REGNUM, + SIM_ARM_IWMMXT_COP1R6_REGNUM, + SIM_ARM_IWMMXT_COP1R7_REGNUM, + SIM_ARM_IWMMXT_COP1R8_REGNUM, + SIM_ARM_IWMMXT_COP1R9_REGNUM, + SIM_ARM_IWMMXT_COP1R10_REGNUM, + SIM_ARM_IWMMXT_COP1R11_REGNUM, + SIM_ARM_IWMMXT_COP1R12_REGNUM, + SIM_ARM_IWMMXT_COP1R13_REGNUM, + SIM_ARM_IWMMXT_COP1R14_REGNUM, + SIM_ARM_IWMMXT_COP1R15_REGNUM +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gdb/sim-bfin.h b/include/gdb/sim-bfin.h new file mode 100644 index 0000000..ef2a115 --- /dev/null +++ b/include/gdb/sim-bfin.h @@ -0,0 +1,82 @@ +/* This file defines the interface between the Blackfin simulator and GDB. + + Copyright (C) 2005-2013 Free Software Foundation, Inc. + Contributed by Analog Devices. + + This file is part of GDB. + + 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 . */ + +enum sim_bfin_regnum { + SIM_BFIN_R0_REGNUM = 0, + SIM_BFIN_R1_REGNUM, + SIM_BFIN_R2_REGNUM, + SIM_BFIN_R3_REGNUM, + SIM_BFIN_R4_REGNUM, + SIM_BFIN_R5_REGNUM, + SIM_BFIN_R6_REGNUM, + SIM_BFIN_R7_REGNUM, + SIM_BFIN_P0_REGNUM, + SIM_BFIN_P1_REGNUM, + SIM_BFIN_P2_REGNUM, + SIM_BFIN_P3_REGNUM, + SIM_BFIN_P4_REGNUM, + SIM_BFIN_P5_REGNUM, + SIM_BFIN_SP_REGNUM, + SIM_BFIN_FP_REGNUM, + SIM_BFIN_I0_REGNUM, + SIM_BFIN_I1_REGNUM, + SIM_BFIN_I2_REGNUM, + SIM_BFIN_I3_REGNUM, + SIM_BFIN_M0_REGNUM, + SIM_BFIN_M1_REGNUM, + SIM_BFIN_M2_REGNUM, + SIM_BFIN_M3_REGNUM, + SIM_BFIN_B0_REGNUM, + SIM_BFIN_B1_REGNUM, + SIM_BFIN_B2_REGNUM, + SIM_BFIN_B3_REGNUM, + SIM_BFIN_L0_REGNUM, + SIM_BFIN_L1_REGNUM, + SIM_BFIN_L2_REGNUM, + SIM_BFIN_L3_REGNUM, + SIM_BFIN_A0_DOT_X_REGNUM, + SIM_BFIN_A0_DOT_W_REGNUM, + SIM_BFIN_A1_DOT_X_REGNUM, + SIM_BFIN_A1_DOT_W_REGNUM, + SIM_BFIN_ASTAT_REGNUM, + SIM_BFIN_RETS_REGNUM, + SIM_BFIN_LC0_REGNUM, + SIM_BFIN_LT0_REGNUM, + SIM_BFIN_LB0_REGNUM, + SIM_BFIN_LC1_REGNUM, + SIM_BFIN_LT1_REGNUM, + SIM_BFIN_LB1_REGNUM, + SIM_BFIN_CYCLES_REGNUM, + SIM_BFIN_CYCLES2_REGNUM, + SIM_BFIN_USP_REGNUM, + SIM_BFIN_SEQSTAT_REGNUM, + SIM_BFIN_SYSCFG_REGNUM, + SIM_BFIN_RETI_REGNUM, + SIM_BFIN_RETX_REGNUM, + SIM_BFIN_RETN_REGNUM, + SIM_BFIN_RETE_REGNUM, + SIM_BFIN_PC_REGNUM, + SIM_BFIN_CC_REGNUM, + SIM_BFIN_TEXT_ADDR, + SIM_BFIN_TEXT_END_ADDR, + SIM_BFIN_DATA_ADDR, + SIM_BFIN_IPEND_REGNUM +}; + diff --git a/include/gdb/sim-cr16.h b/include/gdb/sim-cr16.h new file mode 100644 index 0000000..1503657 --- /dev/null +++ b/include/gdb/sim-cr16.h @@ -0,0 +1,106 @@ +/* This file defines the interface between the cr16 simulator and gdb. + + Copyright 2008-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_CR16_H) +#define SIM_CR16_H + +#ifdef __cplusplus +extern "C" { // } +#endif + +enum + { + SIM_CR16_MEMORY_UNIFIED = 0x00000000, + SIM_CR16_MEMORY_INSN = 0x10000000, + SIM_CR16_MEMORY_DATA = 0x10000000, + SIM_CR16_MEMORY_DMAP = 0x10000000, + SIM_CR16_MEMORY_IMAP = 0x10000000 + }; + +extern unsigned long sim_cr16_translate_dmap_addr + (unsigned long offset, + int nr_bytes, + unsigned long *phys, + void *regcache, + unsigned long (*dmap_register) (void *regcache, int reg_nr)); + +extern unsigned long sim_cr16_translate_imap_addr + (unsigned long offset, + int nr_bytes, + unsigned long *phys, + void *regcache, + unsigned long (*imap_register) (void *regcache, int reg_nr)); + +extern unsigned long sim_cr16_translate_addr + (unsigned long vaddr, + int nr_bytes, + unsigned long *phys, + void *regcache, + unsigned long (*dmap_register) (void *regcache, int reg_nr), + unsigned long (*imap_register) (void *regcache, int reg_nr)); + + +/* The simulator makes use of the following register information. */ + +enum sim_cr16_regs +{ + SIM_CR16_R0_REGNUM, + SIM_CR16_R1_REGNUM, + SIM_CR16_R2_REGNUM, + SIM_CR16_R3_REGNUM, + SIM_CR16_R4_REGNUM, + SIM_CR16_R5_REGNUM, + SIM_CR16_R6_REGNUM, + SIM_CR16_R7_REGNUM, + SIM_CR16_R8_REGNUM, + SIM_CR16_R9_REGNUM, + SIM_CR16_R10_REGNUM, + SIM_CR16_R11_REGNUM, + SIM_CR16_R12_REGNUM, + SIM_CR16_R13_REGNUM, + SIM_CR16_R14_REGNUM, + SIM_CR16_R15_REGNUM, + + SIM_CR16_PC_REGNUM, + SIM_CR16_ISP_REGNUM, + SIM_CR16_USP_REGNUM, + SIM_CR16_INTBASE_REGNUM, + SIM_CR16_PSR_REGNUM, + SIM_CR16_CFG_REGNUM, + SIM_CR16_DBS_REGNUM, + SIM_CR16_DCR_REGNUM, + SIM_CR16_DSR_REGNUM, + SIM_CR16_CAR0_REGNUM, + SIM_CR16_CAR1_REGNUM +}; + +enum +{ + SIM_CR16_NR_R_REGS = 16, + SIM_CR16_NR_A_REGS = 2, + SIM_CR16_NR_IMAP_REGS = 2, + SIM_CR16_NR_DMAP_REGS = 4, + SIM_CR16_NR_CR_REGS = 11 +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gdb/sim-d10v.h b/include/gdb/sim-d10v.h new file mode 100644 index 0000000..12eaa63 --- /dev/null +++ b/include/gdb/sim-d10v.h @@ -0,0 +1,141 @@ +/* This file defines the interface between the d10v simulator and gdb. + + Copyright 1999-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_D10V_H) +#define SIM_D10V_H + +#ifdef __cplusplus +extern "C" { // } +#endif + +/* GDB interprets addresses as: + + 0x00xxxxxx: Physical unified memory segment (Unified memory) + 0x01xxxxxx: Physical instruction memory segment (On-chip insn memory) + 0x02xxxxxx: Physical data memory segment (On-chip data memory) + 0x10xxxxxx: Logical data address segment (DMAP translated memory) + 0x11xxxxxx: Logical instruction address segment (IMAP translated memory) + + The remote d10v board interprets addresses as: + + 0x00xxxxxx: Physical unified memory segment (Unified memory) + 0x01xxxxxx: Physical instruction memory segment (On-chip insn memory) + 0x02xxxxxx: Physical data memory segment (On-chip data memory) + + The following translate a virtual DMAP/IMAP offset into a physical + memory segment assigning the translated address to PHYS. Since a + memory access may cross a page boundrary the number of bytes for + which the translation is applicable (or 0 for an invalid virtual + offset) is returned. */ + +enum + { + SIM_D10V_MEMORY_UNIFIED = 0x00000000, + SIM_D10V_MEMORY_INSN = 0x01000000, + SIM_D10V_MEMORY_DATA = 0x02000000, + SIM_D10V_MEMORY_DMAP = 0x10000000, + SIM_D10V_MEMORY_IMAP = 0x11000000 + }; + +extern unsigned long sim_d10v_translate_dmap_addr + (unsigned long offset, + int nr_bytes, + unsigned long *phys, + void *regcache, + unsigned long (*dmap_register) (void *regcache, int reg_nr)); + +extern unsigned long sim_d10v_translate_imap_addr + (unsigned long offset, + int nr_bytes, + unsigned long *phys, + void *regcache, + unsigned long (*imap_register) (void *regcache, int reg_nr)); + +extern unsigned long sim_d10v_translate_addr + (unsigned long vaddr, + int nr_bytes, + unsigned long *phys, + void *regcache, + unsigned long (*dmap_register) (void *regcache, int reg_nr), + unsigned long (*imap_register) (void *regcache, int reg_nr)); + + +/* The simulator makes use of the following register information. */ + +enum sim_d10v_regs +{ + SIM_D10V_R0_REGNUM, + SIM_D10V_R1_REGNUM, + SIM_D10V_R2_REGNUM, + SIM_D10V_R3_REGNUM, + SIM_D10V_R4_REGNUM, + SIM_D10V_R5_REGNUM, + SIM_D10V_R6_REGNUM, + SIM_D10V_R7_REGNUM, + SIM_D10V_R8_REGNUM, + SIM_D10V_R9_REGNUM, + SIM_D10V_R10_REGNUM, + SIM_D10V_R11_REGNUM, + SIM_D10V_R12_REGNUM, + SIM_D10V_R13_REGNUM, + SIM_D10V_R14_REGNUM, + SIM_D10V_R15_REGNUM, + SIM_D10V_CR0_REGNUM, + SIM_D10V_CR1_REGNUM, + SIM_D10V_CR2_REGNUM, + SIM_D10V_CR3_REGNUM, + SIM_D10V_CR4_REGNUM, + SIM_D10V_CR5_REGNUM, + SIM_D10V_CR6_REGNUM, + SIM_D10V_CR7_REGNUM, + SIM_D10V_CR8_REGNUM, + SIM_D10V_CR9_REGNUM, + SIM_D10V_CR10_REGNUM, + SIM_D10V_CR11_REGNUM, + SIM_D10V_CR12_REGNUM, + SIM_D10V_CR13_REGNUM, + SIM_D10V_CR14_REGNUM, + SIM_D10V_CR15_REGNUM, + SIM_D10V_A0_REGNUM, + SIM_D10V_A1_REGNUM, + SIM_D10V_SPI_REGNUM, + SIM_D10V_SPU_REGNUM, + SIM_D10V_IMAP0_REGNUM, + SIM_D10V_IMAP1_REGNUM, + SIM_D10V_DMAP0_REGNUM, + SIM_D10V_DMAP1_REGNUM, + SIM_D10V_DMAP2_REGNUM, + SIM_D10V_DMAP3_REGNUM, + SIM_D10V_TS2_DMAP_REGNUM +}; + +enum +{ + SIM_D10V_NR_R_REGS = 16, + SIM_D10V_NR_A_REGS = 2, + SIM_D10V_NR_IMAP_REGS = 2, + SIM_D10V_NR_DMAP_REGS = 4, + SIM_D10V_NR_CR_REGS = 16 +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gdb/sim-frv.h b/include/gdb/sim-frv.h new file mode 100644 index 0000000..bdb17f8 --- /dev/null +++ b/include/gdb/sim-frv.h @@ -0,0 +1,51 @@ +/* This file defines the interface between the FR-V simulator and GDB. + + Copyright 2003-2013 Free Software Foundation, Inc. + + Contributed by Red Hat. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_FRV_H) +#define SIM_FRV_H + +#ifdef __cplusplus +extern "C" { // } +#endif + +enum sim_frv_regs +{ + SIM_FRV_GR0_REGNUM = 0, + SIM_FRV_GR63_REGNUM = 63, + SIM_FRV_FR0_REGNUM = 64, + SIM_FRV_FR63_REGNUM = 127, + SIM_FRV_PC_REGNUM = 128, + + /* An FR-V architecture may have up to 4096 special purpose registers + (SPRs). In order to determine a specific constant used to access + a particular SPR, one of the H_SPR_ prefixed offsets defined in + opcodes/frv-desc.h should be added to SIM_FRV_SPR0_REGNUM. So, + for example, the number that GDB uses to fetch the link register + from the simulator is (SIM_FRV_SPR0_REGNUM + H_SPR_LR). */ + SIM_FRV_SPR0_REGNUM = 129, + SIM_FRV_SPR4095_REGNUM = SIM_FRV_SPR0_REGNUM + 4095 +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gdb/sim-h8300.h b/include/gdb/sim-h8300.h new file mode 100644 index 0000000..1649b52 --- /dev/null +++ b/include/gdb/sim-h8300.h @@ -0,0 +1,77 @@ +/* This file defines the interface between the h8300 simulator and gdb. + Copyright (C) 2002-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_H8300_H) +#define SIM_H8300_H + +#ifdef __cplusplus +extern "C" { //} +#endif + +/* The simulator makes use of the following register information. */ + + enum sim_h8300_regs + { + /* Registers common to all the H8 variants. */ + /* Start here: */ + SIM_H8300_R0_REGNUM, + SIM_H8300_R1_REGNUM, + SIM_H8300_R2_REGNUM, + SIM_H8300_R3_REGNUM, + SIM_H8300_R4_REGNUM, + SIM_H8300_R5_REGNUM, + SIM_H8300_R6_REGNUM, + SIM_H8300_R7_REGNUM, + + SIM_H8300_CCR_REGNUM, /* Contains processor status */ + SIM_H8300_PC_REGNUM, /* Contains program counter */ + /* End here */ + + SIM_H8300_EXR_REGNUM, /* Contains extended processor status + H8S and higher */ + SIM_H8300_MACL_REGNUM, /* Lower part of MAC register (26xx only)*/ + SIM_H8300_MACH_REGNUM, /* High part of MAC register (26xx only) */ + + SIM_H8300_CYCLE_REGNUM, + SIM_H8300_INST_REGNUM, + SIM_H8300_TICK_REGNUM + }; + + enum + { + SIM_H8300_ARG_FIRST_REGNUM = SIM_H8300_R0_REGNUM, /* first reg in which an arg + may be passed */ + SIM_H8300_ARG_LAST_REGNUM = SIM_H8300_R3_REGNUM, /* last reg in which an arg + may be passed */ + SIM_H8300_FP_REGNUM = SIM_H8300_R6_REGNUM, /* Contain address of executing + stack frame */ + SIM_H8300_SP_REGNUM = SIM_H8300_R7_REGNUM /* Contains address of top of stack */ + }; + + enum + { + SIM_H8300_NUM_COMMON_REGS = 10, + SIM_H8300_S_NUM_REGS = 13, + SIM_H8300_NUM_REGS = 16 + }; + +#ifdef __cplusplus +} +#endif + +#endif /* SIM_H8300_H */ diff --git a/include/gdb/sim-lm32.h b/include/gdb/sim-lm32.h new file mode 100644 index 0000000..b04d8d6 --- /dev/null +++ b/include/gdb/sim-lm32.h @@ -0,0 +1,76 @@ +/* This file defines the interface between the LM32 simulator and GDB. + Contributed by Jon Beniston + + Copyright (C) 2009-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#ifndef SIM_LM32_H +#define SIM_LM32_H + +#ifdef __cplusplus +extern "C" { // } +#endif + +enum sim_lm32_regs +{ + SIM_LM32_R0_REGNUM, + SIM_LM32_R1_REGNUM, + SIM_LM32_R2_REGNUM, + SIM_LM32_R3_REGNUM, + SIM_LM32_R4_REGNUM, + SIM_LM32_R5_REGNUM, + SIM_LM32_R6_REGNUM, + SIM_LM32_R7_REGNUM, + SIM_LM32_R8_REGNUM, + SIM_LM32_R9_REGNUM, + SIM_LM32_R10_REGNUM, + SIM_LM32_R11_REGNUM, + SIM_LM32_R12_REGNUM, + SIM_LM32_R13_REGNUM, + SIM_LM32_R14_REGNUM, + SIM_LM32_R15_REGNUM, + SIM_LM32_R16_REGNUM, + SIM_LM32_R17_REGNUM, + SIM_LM32_R18_REGNUM, + SIM_LM32_R19_REGNUM, + SIM_LM32_R20_REGNUM, + SIM_LM32_R21_REGNUM, + SIM_LM32_R22_REGNUM, + SIM_LM32_R23_REGNUM, + SIM_LM32_R24_REGNUM, + SIM_LM32_R25_REGNUM, + SIM_LM32_GP_REGNUM, + SIM_LM32_FP_REGNUM, + SIM_LM32_SP_REGNUM, + SIM_LM32_RA_REGNUM, + SIM_LM32_BA_REGNUM, + SIM_LM32_EA_REGNUM, + SIM_LM32_PC_REGNUM, + SIM_LM32_EID_REGNUM, + SIM_LM32_EBA_REGNUM, + SIM_LM32_DEBA_REGNUM, + SIM_LM32_IE_REGNUM, + SIM_LM32_IM_REGNUM, + SIM_LM32_IP_REGNUM, + SIM_LM32_NUM_REGS +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gdb/sim-m32c.h b/include/gdb/sim-m32c.h new file mode 100644 index 0000000..963ae04 --- /dev/null +++ b/include/gdb/sim-m32c.h @@ -0,0 +1,62 @@ +/* This file defines the interface between the m32c simulator and gdb. + Copyright (C) 2005-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#ifndef SIM_M32C_H +#define SIM_M32C_H + +enum m32c_sim_reg { + m32c_sim_reg_r0_bank0, + m32c_sim_reg_r1_bank0, + m32c_sim_reg_r2_bank0, + m32c_sim_reg_r3_bank0, + m32c_sim_reg_a0_bank0, + m32c_sim_reg_a1_bank0, + m32c_sim_reg_fb_bank0, + m32c_sim_reg_sb_bank0, + m32c_sim_reg_r0_bank1, + m32c_sim_reg_r1_bank1, + m32c_sim_reg_r2_bank1, + m32c_sim_reg_r3_bank1, + m32c_sim_reg_a0_bank1, + m32c_sim_reg_a1_bank1, + m32c_sim_reg_fb_bank1, + m32c_sim_reg_sb_bank1, + m32c_sim_reg_usp, + m32c_sim_reg_isp, + m32c_sim_reg_pc, + m32c_sim_reg_intb, + m32c_sim_reg_flg, + m32c_sim_reg_svf, + m32c_sim_reg_svp, + m32c_sim_reg_vct, + m32c_sim_reg_dmd0, + m32c_sim_reg_dmd1, + m32c_sim_reg_dct0, + m32c_sim_reg_dct1, + m32c_sim_reg_drc0, + m32c_sim_reg_drc1, + m32c_sim_reg_dma0, + m32c_sim_reg_dma1, + m32c_sim_reg_dsa0, + m32c_sim_reg_dsa1, + m32c_sim_reg_dra0, + m32c_sim_reg_dra1, + m32c_sim_reg_num_regs +}; + +#endif /* SIM_M32C_H */ diff --git a/include/gdb/sim-ppc.h b/include/gdb/sim-ppc.h new file mode 100644 index 0000000..188eb49 --- /dev/null +++ b/include/gdb/sim-ppc.h @@ -0,0 +1,773 @@ +/* sim-ppc.h --- interface between PowerPC simulator and GDB. + + Copyright 2004-2013 Free Software Foundation, Inc. + + Contributed by Red Hat. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_PPC_H) +#define SIM_PPC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* The register access functions, sim_fetch_register and + sim_store_register, use the following numbering for PowerPC + registers. */ + +enum sim_ppc_regnum + { + /* General-purpose registers, r0 -- r31. */ + sim_ppc_r0_regnum, + sim_ppc_r1_regnum, + sim_ppc_r2_regnum, + sim_ppc_r3_regnum, + sim_ppc_r4_regnum, + sim_ppc_r5_regnum, + sim_ppc_r6_regnum, + sim_ppc_r7_regnum, + sim_ppc_r8_regnum, + sim_ppc_r9_regnum, + sim_ppc_r10_regnum, + sim_ppc_r11_regnum, + sim_ppc_r12_regnum, + sim_ppc_r13_regnum, + sim_ppc_r14_regnum, + sim_ppc_r15_regnum, + sim_ppc_r16_regnum, + sim_ppc_r17_regnum, + sim_ppc_r18_regnum, + sim_ppc_r19_regnum, + sim_ppc_r20_regnum, + sim_ppc_r21_regnum, + sim_ppc_r22_regnum, + sim_ppc_r23_regnum, + sim_ppc_r24_regnum, + sim_ppc_r25_regnum, + sim_ppc_r26_regnum, + sim_ppc_r27_regnum, + sim_ppc_r28_regnum, + sim_ppc_r29_regnum, + sim_ppc_r30_regnum, + sim_ppc_r31_regnum, + + /* Floating-point registers, f0 -- f31. */ + sim_ppc_f0_regnum, + sim_ppc_f1_regnum, + sim_ppc_f2_regnum, + sim_ppc_f3_regnum, + sim_ppc_f4_regnum, + sim_ppc_f5_regnum, + sim_ppc_f6_regnum, + sim_ppc_f7_regnum, + sim_ppc_f8_regnum, + sim_ppc_f9_regnum, + sim_ppc_f10_regnum, + sim_ppc_f11_regnum, + sim_ppc_f12_regnum, + sim_ppc_f13_regnum, + sim_ppc_f14_regnum, + sim_ppc_f15_regnum, + sim_ppc_f16_regnum, + sim_ppc_f17_regnum, + sim_ppc_f18_regnum, + sim_ppc_f19_regnum, + sim_ppc_f20_regnum, + sim_ppc_f21_regnum, + sim_ppc_f22_regnum, + sim_ppc_f23_regnum, + sim_ppc_f24_regnum, + sim_ppc_f25_regnum, + sim_ppc_f26_regnum, + sim_ppc_f27_regnum, + sim_ppc_f28_regnum, + sim_ppc_f29_regnum, + sim_ppc_f30_regnum, + sim_ppc_f31_regnum, + + /* Altivec vector registers, vr0 -- vr31. */ + sim_ppc_vr0_regnum, + sim_ppc_vr1_regnum, + sim_ppc_vr2_regnum, + sim_ppc_vr3_regnum, + sim_ppc_vr4_regnum, + sim_ppc_vr5_regnum, + sim_ppc_vr6_regnum, + sim_ppc_vr7_regnum, + sim_ppc_vr8_regnum, + sim_ppc_vr9_regnum, + sim_ppc_vr10_regnum, + sim_ppc_vr11_regnum, + sim_ppc_vr12_regnum, + sim_ppc_vr13_regnum, + sim_ppc_vr14_regnum, + sim_ppc_vr15_regnum, + sim_ppc_vr16_regnum, + sim_ppc_vr17_regnum, + sim_ppc_vr18_regnum, + sim_ppc_vr19_regnum, + sim_ppc_vr20_regnum, + sim_ppc_vr21_regnum, + sim_ppc_vr22_regnum, + sim_ppc_vr23_regnum, + sim_ppc_vr24_regnum, + sim_ppc_vr25_regnum, + sim_ppc_vr26_regnum, + sim_ppc_vr27_regnum, + sim_ppc_vr28_regnum, + sim_ppc_vr29_regnum, + sim_ppc_vr30_regnum, + sim_ppc_vr31_regnum, + + /* SPE APU GPR upper halves. These are the upper 32 bits of the + gprs; there is one upper-half register for each gpr, so it is + appropriate to use sim_ppc_num_gprs for iterating through + these. */ + sim_ppc_rh0_regnum, + sim_ppc_rh1_regnum, + sim_ppc_rh2_regnum, + sim_ppc_rh3_regnum, + sim_ppc_rh4_regnum, + sim_ppc_rh5_regnum, + sim_ppc_rh6_regnum, + sim_ppc_rh7_regnum, + sim_ppc_rh8_regnum, + sim_ppc_rh9_regnum, + sim_ppc_rh10_regnum, + sim_ppc_rh11_regnum, + sim_ppc_rh12_regnum, + sim_ppc_rh13_regnum, + sim_ppc_rh14_regnum, + sim_ppc_rh15_regnum, + sim_ppc_rh16_regnum, + sim_ppc_rh17_regnum, + sim_ppc_rh18_regnum, + sim_ppc_rh19_regnum, + sim_ppc_rh20_regnum, + sim_ppc_rh21_regnum, + sim_ppc_rh22_regnum, + sim_ppc_rh23_regnum, + sim_ppc_rh24_regnum, + sim_ppc_rh25_regnum, + sim_ppc_rh26_regnum, + sim_ppc_rh27_regnum, + sim_ppc_rh28_regnum, + sim_ppc_rh29_regnum, + sim_ppc_rh30_regnum, + sim_ppc_rh31_regnum, + + /* SPE APU GPR full registers. Each of these registers is the + 64-bit concatenation of a 32-bit GPR (providing the lower bits) + and a 32-bit upper-half register (providing the higher bits). + As for the upper-half registers, it is appropriate to use + sim_ppc_num_gprs with these. */ + sim_ppc_ev0_regnum, + sim_ppc_ev1_regnum, + sim_ppc_ev2_regnum, + sim_ppc_ev3_regnum, + sim_ppc_ev4_regnum, + sim_ppc_ev5_regnum, + sim_ppc_ev6_regnum, + sim_ppc_ev7_regnum, + sim_ppc_ev8_regnum, + sim_ppc_ev9_regnum, + sim_ppc_ev10_regnum, + sim_ppc_ev11_regnum, + sim_ppc_ev12_regnum, + sim_ppc_ev13_regnum, + sim_ppc_ev14_regnum, + sim_ppc_ev15_regnum, + sim_ppc_ev16_regnum, + sim_ppc_ev17_regnum, + sim_ppc_ev18_regnum, + sim_ppc_ev19_regnum, + sim_ppc_ev20_regnum, + sim_ppc_ev21_regnum, + sim_ppc_ev22_regnum, + sim_ppc_ev23_regnum, + sim_ppc_ev24_regnum, + sim_ppc_ev25_regnum, + sim_ppc_ev26_regnum, + sim_ppc_ev27_regnum, + sim_ppc_ev28_regnum, + sim_ppc_ev29_regnum, + sim_ppc_ev30_regnum, + sim_ppc_ev31_regnum, + + /* Segment registers, sr0 -- sr15. */ + sim_ppc_sr0_regnum, + sim_ppc_sr1_regnum, + sim_ppc_sr2_regnum, + sim_ppc_sr3_regnum, + sim_ppc_sr4_regnum, + sim_ppc_sr5_regnum, + sim_ppc_sr6_regnum, + sim_ppc_sr7_regnum, + sim_ppc_sr8_regnum, + sim_ppc_sr9_regnum, + sim_ppc_sr10_regnum, + sim_ppc_sr11_regnum, + sim_ppc_sr12_regnum, + sim_ppc_sr13_regnum, + sim_ppc_sr14_regnum, + sim_ppc_sr15_regnum, + + /* Miscellaneous --- but non-SPR --- registers. */ + sim_ppc_pc_regnum, + sim_ppc_ps_regnum, + sim_ppc_cr_regnum, + sim_ppc_fpscr_regnum, + sim_ppc_acc_regnum, + sim_ppc_vscr_regnum, + + /* Special-purpose registers. */ + sim_ppc_spr0_regnum, sim_ppc_spr1_regnum, + sim_ppc_spr2_regnum, sim_ppc_spr3_regnum, + sim_ppc_spr4_regnum, sim_ppc_spr5_regnum, + sim_ppc_spr6_regnum, sim_ppc_spr7_regnum, + sim_ppc_spr8_regnum, sim_ppc_spr9_regnum, + sim_ppc_spr10_regnum, sim_ppc_spr11_regnum, + sim_ppc_spr12_regnum, sim_ppc_spr13_regnum, + sim_ppc_spr14_regnum, sim_ppc_spr15_regnum, + sim_ppc_spr16_regnum, sim_ppc_spr17_regnum, + sim_ppc_spr18_regnum, sim_ppc_spr19_regnum, + sim_ppc_spr20_regnum, sim_ppc_spr21_regnum, + sim_ppc_spr22_regnum, sim_ppc_spr23_regnum, + sim_ppc_spr24_regnum, sim_ppc_spr25_regnum, + sim_ppc_spr26_regnum, sim_ppc_spr27_regnum, + sim_ppc_spr28_regnum, sim_ppc_spr29_regnum, + sim_ppc_spr30_regnum, sim_ppc_spr31_regnum, + sim_ppc_spr32_regnum, sim_ppc_spr33_regnum, + sim_ppc_spr34_regnum, sim_ppc_spr35_regnum, + sim_ppc_spr36_regnum, sim_ppc_spr37_regnum, + sim_ppc_spr38_regnum, sim_ppc_spr39_regnum, + sim_ppc_spr40_regnum, sim_ppc_spr41_regnum, + sim_ppc_spr42_regnum, sim_ppc_spr43_regnum, + sim_ppc_spr44_regnum, sim_ppc_spr45_regnum, + sim_ppc_spr46_regnum, sim_ppc_spr47_regnum, + sim_ppc_spr48_regnum, sim_ppc_spr49_regnum, + sim_ppc_spr50_regnum, sim_ppc_spr51_regnum, + sim_ppc_spr52_regnum, sim_ppc_spr53_regnum, + sim_ppc_spr54_regnum, sim_ppc_spr55_regnum, + sim_ppc_spr56_regnum, sim_ppc_spr57_regnum, + sim_ppc_spr58_regnum, sim_ppc_spr59_regnum, + sim_ppc_spr60_regnum, sim_ppc_spr61_regnum, + sim_ppc_spr62_regnum, sim_ppc_spr63_regnum, + sim_ppc_spr64_regnum, sim_ppc_spr65_regnum, + sim_ppc_spr66_regnum, sim_ppc_spr67_regnum, + sim_ppc_spr68_regnum, sim_ppc_spr69_regnum, + sim_ppc_spr70_regnum, sim_ppc_spr71_regnum, + sim_ppc_spr72_regnum, sim_ppc_spr73_regnum, + sim_ppc_spr74_regnum, sim_ppc_spr75_regnum, + sim_ppc_spr76_regnum, sim_ppc_spr77_regnum, + sim_ppc_spr78_regnum, sim_ppc_spr79_regnum, + sim_ppc_spr80_regnum, sim_ppc_spr81_regnum, + sim_ppc_spr82_regnum, sim_ppc_spr83_regnum, + sim_ppc_spr84_regnum, sim_ppc_spr85_regnum, + sim_ppc_spr86_regnum, sim_ppc_spr87_regnum, + sim_ppc_spr88_regnum, sim_ppc_spr89_regnum, + sim_ppc_spr90_regnum, sim_ppc_spr91_regnum, + sim_ppc_spr92_regnum, sim_ppc_spr93_regnum, + sim_ppc_spr94_regnum, sim_ppc_spr95_regnum, + sim_ppc_spr96_regnum, sim_ppc_spr97_regnum, + sim_ppc_spr98_regnum, sim_ppc_spr99_regnum, + sim_ppc_spr100_regnum, sim_ppc_spr101_regnum, + sim_ppc_spr102_regnum, sim_ppc_spr103_regnum, + sim_ppc_spr104_regnum, sim_ppc_spr105_regnum, + sim_ppc_spr106_regnum, sim_ppc_spr107_regnum, + sim_ppc_spr108_regnum, sim_ppc_spr109_regnum, + sim_ppc_spr110_regnum, sim_ppc_spr111_regnum, + sim_ppc_spr112_regnum, sim_ppc_spr113_regnum, + sim_ppc_spr114_regnum, sim_ppc_spr115_regnum, + sim_ppc_spr116_regnum, sim_ppc_spr117_regnum, + sim_ppc_spr118_regnum, sim_ppc_spr119_regnum, + sim_ppc_spr120_regnum, sim_ppc_spr121_regnum, + sim_ppc_spr122_regnum, sim_ppc_spr123_regnum, + sim_ppc_spr124_regnum, sim_ppc_spr125_regnum, + sim_ppc_spr126_regnum, sim_ppc_spr127_regnum, + sim_ppc_spr128_regnum, sim_ppc_spr129_regnum, + sim_ppc_spr130_regnum, sim_ppc_spr131_regnum, + sim_ppc_spr132_regnum, sim_ppc_spr133_regnum, + sim_ppc_spr134_regnum, sim_ppc_spr135_regnum, + sim_ppc_spr136_regnum, sim_ppc_spr137_regnum, + sim_ppc_spr138_regnum, sim_ppc_spr139_regnum, + sim_ppc_spr140_regnum, sim_ppc_spr141_regnum, + sim_ppc_spr142_regnum, sim_ppc_spr143_regnum, + sim_ppc_spr144_regnum, sim_ppc_spr145_regnum, + sim_ppc_spr146_regnum, sim_ppc_spr147_regnum, + sim_ppc_spr148_regnum, sim_ppc_spr149_regnum, + sim_ppc_spr150_regnum, sim_ppc_spr151_regnum, + sim_ppc_spr152_regnum, sim_ppc_spr153_regnum, + sim_ppc_spr154_regnum, sim_ppc_spr155_regnum, + sim_ppc_spr156_regnum, sim_ppc_spr157_regnum, + sim_ppc_spr158_regnum, sim_ppc_spr159_regnum, + sim_ppc_spr160_regnum, sim_ppc_spr161_regnum, + sim_ppc_spr162_regnum, sim_ppc_spr163_regnum, + sim_ppc_spr164_regnum, sim_ppc_spr165_regnum, + sim_ppc_spr166_regnum, sim_ppc_spr167_regnum, + sim_ppc_spr168_regnum, sim_ppc_spr169_regnum, + sim_ppc_spr170_regnum, sim_ppc_spr171_regnum, + sim_ppc_spr172_regnum, sim_ppc_spr173_regnum, + sim_ppc_spr174_regnum, sim_ppc_spr175_regnum, + sim_ppc_spr176_regnum, sim_ppc_spr177_regnum, + sim_ppc_spr178_regnum, sim_ppc_spr179_regnum, + sim_ppc_spr180_regnum, sim_ppc_spr181_regnum, + sim_ppc_spr182_regnum, sim_ppc_spr183_regnum, + sim_ppc_spr184_regnum, sim_ppc_spr185_regnum, + sim_ppc_spr186_regnum, sim_ppc_spr187_regnum, + sim_ppc_spr188_regnum, sim_ppc_spr189_regnum, + sim_ppc_spr190_regnum, sim_ppc_spr191_regnum, + sim_ppc_spr192_regnum, sim_ppc_spr193_regnum, + sim_ppc_spr194_regnum, sim_ppc_spr195_regnum, + sim_ppc_spr196_regnum, sim_ppc_spr197_regnum, + sim_ppc_spr198_regnum, sim_ppc_spr199_regnum, + sim_ppc_spr200_regnum, sim_ppc_spr201_regnum, + sim_ppc_spr202_regnum, sim_ppc_spr203_regnum, + sim_ppc_spr204_regnum, sim_ppc_spr205_regnum, + sim_ppc_spr206_regnum, sim_ppc_spr207_regnum, + sim_ppc_spr208_regnum, sim_ppc_spr209_regnum, + sim_ppc_spr210_regnum, sim_ppc_spr211_regnum, + sim_ppc_spr212_regnum, sim_ppc_spr213_regnum, + sim_ppc_spr214_regnum, sim_ppc_spr215_regnum, + sim_ppc_spr216_regnum, sim_ppc_spr217_regnum, + sim_ppc_spr218_regnum, sim_ppc_spr219_regnum, + sim_ppc_spr220_regnum, sim_ppc_spr221_regnum, + sim_ppc_spr222_regnum, sim_ppc_spr223_regnum, + sim_ppc_spr224_regnum, sim_ppc_spr225_regnum, + sim_ppc_spr226_regnum, sim_ppc_spr227_regnum, + sim_ppc_spr228_regnum, sim_ppc_spr229_regnum, + sim_ppc_spr230_regnum, sim_ppc_spr231_regnum, + sim_ppc_spr232_regnum, sim_ppc_spr233_regnum, + sim_ppc_spr234_regnum, sim_ppc_spr235_regnum, + sim_ppc_spr236_regnum, sim_ppc_spr237_regnum, + sim_ppc_spr238_regnum, sim_ppc_spr239_regnum, + sim_ppc_spr240_regnum, sim_ppc_spr241_regnum, + sim_ppc_spr242_regnum, sim_ppc_spr243_regnum, + sim_ppc_spr244_regnum, sim_ppc_spr245_regnum, + sim_ppc_spr246_regnum, sim_ppc_spr247_regnum, + sim_ppc_spr248_regnum, sim_ppc_spr249_regnum, + sim_ppc_spr250_regnum, sim_ppc_spr251_regnum, + sim_ppc_spr252_regnum, sim_ppc_spr253_regnum, + sim_ppc_spr254_regnum, sim_ppc_spr255_regnum, + sim_ppc_spr256_regnum, sim_ppc_spr257_regnum, + sim_ppc_spr258_regnum, sim_ppc_spr259_regnum, + sim_ppc_spr260_regnum, sim_ppc_spr261_regnum, + sim_ppc_spr262_regnum, sim_ppc_spr263_regnum, + sim_ppc_spr264_regnum, sim_ppc_spr265_regnum, + sim_ppc_spr266_regnum, sim_ppc_spr267_regnum, + sim_ppc_spr268_regnum, sim_ppc_spr269_regnum, + sim_ppc_spr270_regnum, sim_ppc_spr271_regnum, + sim_ppc_spr272_regnum, sim_ppc_spr273_regnum, + sim_ppc_spr274_regnum, sim_ppc_spr275_regnum, + sim_ppc_spr276_regnum, sim_ppc_spr277_regnum, + sim_ppc_spr278_regnum, sim_ppc_spr279_regnum, + sim_ppc_spr280_regnum, sim_ppc_spr281_regnum, + sim_ppc_spr282_regnum, sim_ppc_spr283_regnum, + sim_ppc_spr284_regnum, sim_ppc_spr285_regnum, + sim_ppc_spr286_regnum, sim_ppc_spr287_regnum, + sim_ppc_spr288_regnum, sim_ppc_spr289_regnum, + sim_ppc_spr290_regnum, sim_ppc_spr291_regnum, + sim_ppc_spr292_regnum, sim_ppc_spr293_regnum, + sim_ppc_spr294_regnum, sim_ppc_spr295_regnum, + sim_ppc_spr296_regnum, sim_ppc_spr297_regnum, + sim_ppc_spr298_regnum, sim_ppc_spr299_regnum, + sim_ppc_spr300_regnum, sim_ppc_spr301_regnum, + sim_ppc_spr302_regnum, sim_ppc_spr303_regnum, + sim_ppc_spr304_regnum, sim_ppc_spr305_regnum, + sim_ppc_spr306_regnum, sim_ppc_spr307_regnum, + sim_ppc_spr308_regnum, sim_ppc_spr309_regnum, + sim_ppc_spr310_regnum, sim_ppc_spr311_regnum, + sim_ppc_spr312_regnum, sim_ppc_spr313_regnum, + sim_ppc_spr314_regnum, sim_ppc_spr315_regnum, + sim_ppc_spr316_regnum, sim_ppc_spr317_regnum, + sim_ppc_spr318_regnum, sim_ppc_spr319_regnum, + sim_ppc_spr320_regnum, sim_ppc_spr321_regnum, + sim_ppc_spr322_regnum, sim_ppc_spr323_regnum, + sim_ppc_spr324_regnum, sim_ppc_spr325_regnum, + sim_ppc_spr326_regnum, sim_ppc_spr327_regnum, + sim_ppc_spr328_regnum, sim_ppc_spr329_regnum, + sim_ppc_spr330_regnum, sim_ppc_spr331_regnum, + sim_ppc_spr332_regnum, sim_ppc_spr333_regnum, + sim_ppc_spr334_regnum, sim_ppc_spr335_regnum, + sim_ppc_spr336_regnum, sim_ppc_spr337_regnum, + sim_ppc_spr338_regnum, sim_ppc_spr339_regnum, + sim_ppc_spr340_regnum, sim_ppc_spr341_regnum, + sim_ppc_spr342_regnum, sim_ppc_spr343_regnum, + sim_ppc_spr344_regnum, sim_ppc_spr345_regnum, + sim_ppc_spr346_regnum, sim_ppc_spr347_regnum, + sim_ppc_spr348_regnum, sim_ppc_spr349_regnum, + sim_ppc_spr350_regnum, sim_ppc_spr351_regnum, + sim_ppc_spr352_regnum, sim_ppc_spr353_regnum, + sim_ppc_spr354_regnum, sim_ppc_spr355_regnum, + sim_ppc_spr356_regnum, sim_ppc_spr357_regnum, + sim_ppc_spr358_regnum, sim_ppc_spr359_regnum, + sim_ppc_spr360_regnum, sim_ppc_spr361_regnum, + sim_ppc_spr362_regnum, sim_ppc_spr363_regnum, + sim_ppc_spr364_regnum, sim_ppc_spr365_regnum, + sim_ppc_spr366_regnum, sim_ppc_spr367_regnum, + sim_ppc_spr368_regnum, sim_ppc_spr369_regnum, + sim_ppc_spr370_regnum, sim_ppc_spr371_regnum, + sim_ppc_spr372_regnum, sim_ppc_spr373_regnum, + sim_ppc_spr374_regnum, sim_ppc_spr375_regnum, + sim_ppc_spr376_regnum, sim_ppc_spr377_regnum, + sim_ppc_spr378_regnum, sim_ppc_spr379_regnum, + sim_ppc_spr380_regnum, sim_ppc_spr381_regnum, + sim_ppc_spr382_regnum, sim_ppc_spr383_regnum, + sim_ppc_spr384_regnum, sim_ppc_spr385_regnum, + sim_ppc_spr386_regnum, sim_ppc_spr387_regnum, + sim_ppc_spr388_regnum, sim_ppc_spr389_regnum, + sim_ppc_spr390_regnum, sim_ppc_spr391_regnum, + sim_ppc_spr392_regnum, sim_ppc_spr393_regnum, + sim_ppc_spr394_regnum, sim_ppc_spr395_regnum, + sim_ppc_spr396_regnum, sim_ppc_spr397_regnum, + sim_ppc_spr398_regnum, sim_ppc_spr399_regnum, + sim_ppc_spr400_regnum, sim_ppc_spr401_regnum, + sim_ppc_spr402_regnum, sim_ppc_spr403_regnum, + sim_ppc_spr404_regnum, sim_ppc_spr405_regnum, + sim_ppc_spr406_regnum, sim_ppc_spr407_regnum, + sim_ppc_spr408_regnum, sim_ppc_spr409_regnum, + sim_ppc_spr410_regnum, sim_ppc_spr411_regnum, + sim_ppc_spr412_regnum, sim_ppc_spr413_regnum, + sim_ppc_spr414_regnum, sim_ppc_spr415_regnum, + sim_ppc_spr416_regnum, sim_ppc_spr417_regnum, + sim_ppc_spr418_regnum, sim_ppc_spr419_regnum, + sim_ppc_spr420_regnum, sim_ppc_spr421_regnum, + sim_ppc_spr422_regnum, sim_ppc_spr423_regnum, + sim_ppc_spr424_regnum, sim_ppc_spr425_regnum, + sim_ppc_spr426_regnum, sim_ppc_spr427_regnum, + sim_ppc_spr428_regnum, sim_ppc_spr429_regnum, + sim_ppc_spr430_regnum, sim_ppc_spr431_regnum, + sim_ppc_spr432_regnum, sim_ppc_spr433_regnum, + sim_ppc_spr434_regnum, sim_ppc_spr435_regnum, + sim_ppc_spr436_regnum, sim_ppc_spr437_regnum, + sim_ppc_spr438_regnum, sim_ppc_spr439_regnum, + sim_ppc_spr440_regnum, sim_ppc_spr441_regnum, + sim_ppc_spr442_regnum, sim_ppc_spr443_regnum, + sim_ppc_spr444_regnum, sim_ppc_spr445_regnum, + sim_ppc_spr446_regnum, sim_ppc_spr447_regnum, + sim_ppc_spr448_regnum, sim_ppc_spr449_regnum, + sim_ppc_spr450_regnum, sim_ppc_spr451_regnum, + sim_ppc_spr452_regnum, sim_ppc_spr453_regnum, + sim_ppc_spr454_regnum, sim_ppc_spr455_regnum, + sim_ppc_spr456_regnum, sim_ppc_spr457_regnum, + sim_ppc_spr458_regnum, sim_ppc_spr459_regnum, + sim_ppc_spr460_regnum, sim_ppc_spr461_regnum, + sim_ppc_spr462_regnum, sim_ppc_spr463_regnum, + sim_ppc_spr464_regnum, sim_ppc_spr465_regnum, + sim_ppc_spr466_regnum, sim_ppc_spr467_regnum, + sim_ppc_spr468_regnum, sim_ppc_spr469_regnum, + sim_ppc_spr470_regnum, sim_ppc_spr471_regnum, + sim_ppc_spr472_regnum, sim_ppc_spr473_regnum, + sim_ppc_spr474_regnum, sim_ppc_spr475_regnum, + sim_ppc_spr476_regnum, sim_ppc_spr477_regnum, + sim_ppc_spr478_regnum, sim_ppc_spr479_regnum, + sim_ppc_spr480_regnum, sim_ppc_spr481_regnum, + sim_ppc_spr482_regnum, sim_ppc_spr483_regnum, + sim_ppc_spr484_regnum, sim_ppc_spr485_regnum, + sim_ppc_spr486_regnum, sim_ppc_spr487_regnum, + sim_ppc_spr488_regnum, sim_ppc_spr489_regnum, + sim_ppc_spr490_regnum, sim_ppc_spr491_regnum, + sim_ppc_spr492_regnum, sim_ppc_spr493_regnum, + sim_ppc_spr494_regnum, sim_ppc_spr495_regnum, + sim_ppc_spr496_regnum, sim_ppc_spr497_regnum, + sim_ppc_spr498_regnum, sim_ppc_spr499_regnum, + sim_ppc_spr500_regnum, sim_ppc_spr501_regnum, + sim_ppc_spr502_regnum, sim_ppc_spr503_regnum, + sim_ppc_spr504_regnum, sim_ppc_spr505_regnum, + sim_ppc_spr506_regnum, sim_ppc_spr507_regnum, + sim_ppc_spr508_regnum, sim_ppc_spr509_regnum, + sim_ppc_spr510_regnum, sim_ppc_spr511_regnum, + sim_ppc_spr512_regnum, sim_ppc_spr513_regnum, + sim_ppc_spr514_regnum, sim_ppc_spr515_regnum, + sim_ppc_spr516_regnum, sim_ppc_spr517_regnum, + sim_ppc_spr518_regnum, sim_ppc_spr519_regnum, + sim_ppc_spr520_regnum, sim_ppc_spr521_regnum, + sim_ppc_spr522_regnum, sim_ppc_spr523_regnum, + sim_ppc_spr524_regnum, sim_ppc_spr525_regnum, + sim_ppc_spr526_regnum, sim_ppc_spr527_regnum, + sim_ppc_spr528_regnum, sim_ppc_spr529_regnum, + sim_ppc_spr530_regnum, sim_ppc_spr531_regnum, + sim_ppc_spr532_regnum, sim_ppc_spr533_regnum, + sim_ppc_spr534_regnum, sim_ppc_spr535_regnum, + sim_ppc_spr536_regnum, sim_ppc_spr537_regnum, + sim_ppc_spr538_regnum, sim_ppc_spr539_regnum, + sim_ppc_spr540_regnum, sim_ppc_spr541_regnum, + sim_ppc_spr542_regnum, sim_ppc_spr543_regnum, + sim_ppc_spr544_regnum, sim_ppc_spr545_regnum, + sim_ppc_spr546_regnum, sim_ppc_spr547_regnum, + sim_ppc_spr548_regnum, sim_ppc_spr549_regnum, + sim_ppc_spr550_regnum, sim_ppc_spr551_regnum, + sim_ppc_spr552_regnum, sim_ppc_spr553_regnum, + sim_ppc_spr554_regnum, sim_ppc_spr555_regnum, + sim_ppc_spr556_regnum, sim_ppc_spr557_regnum, + sim_ppc_spr558_regnum, sim_ppc_spr559_regnum, + sim_ppc_spr560_regnum, sim_ppc_spr561_regnum, + sim_ppc_spr562_regnum, sim_ppc_spr563_regnum, + sim_ppc_spr564_regnum, sim_ppc_spr565_regnum, + sim_ppc_spr566_regnum, sim_ppc_spr567_regnum, + sim_ppc_spr568_regnum, sim_ppc_spr569_regnum, + sim_ppc_spr570_regnum, sim_ppc_spr571_regnum, + sim_ppc_spr572_regnum, sim_ppc_spr573_regnum, + sim_ppc_spr574_regnum, sim_ppc_spr575_regnum, + sim_ppc_spr576_regnum, sim_ppc_spr577_regnum, + sim_ppc_spr578_regnum, sim_ppc_spr579_regnum, + sim_ppc_spr580_regnum, sim_ppc_spr581_regnum, + sim_ppc_spr582_regnum, sim_ppc_spr583_regnum, + sim_ppc_spr584_regnum, sim_ppc_spr585_regnum, + sim_ppc_spr586_regnum, sim_ppc_spr587_regnum, + sim_ppc_spr588_regnum, sim_ppc_spr589_regnum, + sim_ppc_spr590_regnum, sim_ppc_spr591_regnum, + sim_ppc_spr592_regnum, sim_ppc_spr593_regnum, + sim_ppc_spr594_regnum, sim_ppc_spr595_regnum, + sim_ppc_spr596_regnum, sim_ppc_spr597_regnum, + sim_ppc_spr598_regnum, sim_ppc_spr599_regnum, + sim_ppc_spr600_regnum, sim_ppc_spr601_regnum, + sim_ppc_spr602_regnum, sim_ppc_spr603_regnum, + sim_ppc_spr604_regnum, sim_ppc_spr605_regnum, + sim_ppc_spr606_regnum, sim_ppc_spr607_regnum, + sim_ppc_spr608_regnum, sim_ppc_spr609_regnum, + sim_ppc_spr610_regnum, sim_ppc_spr611_regnum, + sim_ppc_spr612_regnum, sim_ppc_spr613_regnum, + sim_ppc_spr614_regnum, sim_ppc_spr615_regnum, + sim_ppc_spr616_regnum, sim_ppc_spr617_regnum, + sim_ppc_spr618_regnum, sim_ppc_spr619_regnum, + sim_ppc_spr620_regnum, sim_ppc_spr621_regnum, + sim_ppc_spr622_regnum, sim_ppc_spr623_regnum, + sim_ppc_spr624_regnum, sim_ppc_spr625_regnum, + sim_ppc_spr626_regnum, sim_ppc_spr627_regnum, + sim_ppc_spr628_regnum, sim_ppc_spr629_regnum, + sim_ppc_spr630_regnum, sim_ppc_spr631_regnum, + sim_ppc_spr632_regnum, sim_ppc_spr633_regnum, + sim_ppc_spr634_regnum, sim_ppc_spr635_regnum, + sim_ppc_spr636_regnum, sim_ppc_spr637_regnum, + sim_ppc_spr638_regnum, sim_ppc_spr639_regnum, + sim_ppc_spr640_regnum, sim_ppc_spr641_regnum, + sim_ppc_spr642_regnum, sim_ppc_spr643_regnum, + sim_ppc_spr644_regnum, sim_ppc_spr645_regnum, + sim_ppc_spr646_regnum, sim_ppc_spr647_regnum, + sim_ppc_spr648_regnum, sim_ppc_spr649_regnum, + sim_ppc_spr650_regnum, sim_ppc_spr651_regnum, + sim_ppc_spr652_regnum, sim_ppc_spr653_regnum, + sim_ppc_spr654_regnum, sim_ppc_spr655_regnum, + sim_ppc_spr656_regnum, sim_ppc_spr657_regnum, + sim_ppc_spr658_regnum, sim_ppc_spr659_regnum, + sim_ppc_spr660_regnum, sim_ppc_spr661_regnum, + sim_ppc_spr662_regnum, sim_ppc_spr663_regnum, + sim_ppc_spr664_regnum, sim_ppc_spr665_regnum, + sim_ppc_spr666_regnum, sim_ppc_spr667_regnum, + sim_ppc_spr668_regnum, sim_ppc_spr669_regnum, + sim_ppc_spr670_regnum, sim_ppc_spr671_regnum, + sim_ppc_spr672_regnum, sim_ppc_spr673_regnum, + sim_ppc_spr674_regnum, sim_ppc_spr675_regnum, + sim_ppc_spr676_regnum, sim_ppc_spr677_regnum, + sim_ppc_spr678_regnum, sim_ppc_spr679_regnum, + sim_ppc_spr680_regnum, sim_ppc_spr681_regnum, + sim_ppc_spr682_regnum, sim_ppc_spr683_regnum, + sim_ppc_spr684_regnum, sim_ppc_spr685_regnum, + sim_ppc_spr686_regnum, sim_ppc_spr687_regnum, + sim_ppc_spr688_regnum, sim_ppc_spr689_regnum, + sim_ppc_spr690_regnum, sim_ppc_spr691_regnum, + sim_ppc_spr692_regnum, sim_ppc_spr693_regnum, + sim_ppc_spr694_regnum, sim_ppc_spr695_regnum, + sim_ppc_spr696_regnum, sim_ppc_spr697_regnum, + sim_ppc_spr698_regnum, sim_ppc_spr699_regnum, + sim_ppc_spr700_regnum, sim_ppc_spr701_regnum, + sim_ppc_spr702_regnum, sim_ppc_spr703_regnum, + sim_ppc_spr704_regnum, sim_ppc_spr705_regnum, + sim_ppc_spr706_regnum, sim_ppc_spr707_regnum, + sim_ppc_spr708_regnum, sim_ppc_spr709_regnum, + sim_ppc_spr710_regnum, sim_ppc_spr711_regnum, + sim_ppc_spr712_regnum, sim_ppc_spr713_regnum, + sim_ppc_spr714_regnum, sim_ppc_spr715_regnum, + sim_ppc_spr716_regnum, sim_ppc_spr717_regnum, + sim_ppc_spr718_regnum, sim_ppc_spr719_regnum, + sim_ppc_spr720_regnum, sim_ppc_spr721_regnum, + sim_ppc_spr722_regnum, sim_ppc_spr723_regnum, + sim_ppc_spr724_regnum, sim_ppc_spr725_regnum, + sim_ppc_spr726_regnum, sim_ppc_spr727_regnum, + sim_ppc_spr728_regnum, sim_ppc_spr729_regnum, + sim_ppc_spr730_regnum, sim_ppc_spr731_regnum, + sim_ppc_spr732_regnum, sim_ppc_spr733_regnum, + sim_ppc_spr734_regnum, sim_ppc_spr735_regnum, + sim_ppc_spr736_regnum, sim_ppc_spr737_regnum, + sim_ppc_spr738_regnum, sim_ppc_spr739_regnum, + sim_ppc_spr740_regnum, sim_ppc_spr741_regnum, + sim_ppc_spr742_regnum, sim_ppc_spr743_regnum, + sim_ppc_spr744_regnum, sim_ppc_spr745_regnum, + sim_ppc_spr746_regnum, sim_ppc_spr747_regnum, + sim_ppc_spr748_regnum, sim_ppc_spr749_regnum, + sim_ppc_spr750_regnum, sim_ppc_spr751_regnum, + sim_ppc_spr752_regnum, sim_ppc_spr753_regnum, + sim_ppc_spr754_regnum, sim_ppc_spr755_regnum, + sim_ppc_spr756_regnum, sim_ppc_spr757_regnum, + sim_ppc_spr758_regnum, sim_ppc_spr759_regnum, + sim_ppc_spr760_regnum, sim_ppc_spr761_regnum, + sim_ppc_spr762_regnum, sim_ppc_spr763_regnum, + sim_ppc_spr764_regnum, sim_ppc_spr765_regnum, + sim_ppc_spr766_regnum, sim_ppc_spr767_regnum, + sim_ppc_spr768_regnum, sim_ppc_spr769_regnum, + sim_ppc_spr770_regnum, sim_ppc_spr771_regnum, + sim_ppc_spr772_regnum, sim_ppc_spr773_regnum, + sim_ppc_spr774_regnum, sim_ppc_spr775_regnum, + sim_ppc_spr776_regnum, sim_ppc_spr777_regnum, + sim_ppc_spr778_regnum, sim_ppc_spr779_regnum, + sim_ppc_spr780_regnum, sim_ppc_spr781_regnum, + sim_ppc_spr782_regnum, sim_ppc_spr783_regnum, + sim_ppc_spr784_regnum, sim_ppc_spr785_regnum, + sim_ppc_spr786_regnum, sim_ppc_spr787_regnum, + sim_ppc_spr788_regnum, sim_ppc_spr789_regnum, + sim_ppc_spr790_regnum, sim_ppc_spr791_regnum, + sim_ppc_spr792_regnum, sim_ppc_spr793_regnum, + sim_ppc_spr794_regnum, sim_ppc_spr795_regnum, + sim_ppc_spr796_regnum, sim_ppc_spr797_regnum, + sim_ppc_spr798_regnum, sim_ppc_spr799_regnum, + sim_ppc_spr800_regnum, sim_ppc_spr801_regnum, + sim_ppc_spr802_regnum, sim_ppc_spr803_regnum, + sim_ppc_spr804_regnum, sim_ppc_spr805_regnum, + sim_ppc_spr806_regnum, sim_ppc_spr807_regnum, + sim_ppc_spr808_regnum, sim_ppc_spr809_regnum, + sim_ppc_spr810_regnum, sim_ppc_spr811_regnum, + sim_ppc_spr812_regnum, sim_ppc_spr813_regnum, + sim_ppc_spr814_regnum, sim_ppc_spr815_regnum, + sim_ppc_spr816_regnum, sim_ppc_spr817_regnum, + sim_ppc_spr818_regnum, sim_ppc_spr819_regnum, + sim_ppc_spr820_regnum, sim_ppc_spr821_regnum, + sim_ppc_spr822_regnum, sim_ppc_spr823_regnum, + sim_ppc_spr824_regnum, sim_ppc_spr825_regnum, + sim_ppc_spr826_regnum, sim_ppc_spr827_regnum, + sim_ppc_spr828_regnum, sim_ppc_spr829_regnum, + sim_ppc_spr830_regnum, sim_ppc_spr831_regnum, + sim_ppc_spr832_regnum, sim_ppc_spr833_regnum, + sim_ppc_spr834_regnum, sim_ppc_spr835_regnum, + sim_ppc_spr836_regnum, sim_ppc_spr837_regnum, + sim_ppc_spr838_regnum, sim_ppc_spr839_regnum, + sim_ppc_spr840_regnum, sim_ppc_spr841_regnum, + sim_ppc_spr842_regnum, sim_ppc_spr843_regnum, + sim_ppc_spr844_regnum, sim_ppc_spr845_regnum, + sim_ppc_spr846_regnum, sim_ppc_spr847_regnum, + sim_ppc_spr848_regnum, sim_ppc_spr849_regnum, + sim_ppc_spr850_regnum, sim_ppc_spr851_regnum, + sim_ppc_spr852_regnum, sim_ppc_spr853_regnum, + sim_ppc_spr854_regnum, sim_ppc_spr855_regnum, + sim_ppc_spr856_regnum, sim_ppc_spr857_regnum, + sim_ppc_spr858_regnum, sim_ppc_spr859_regnum, + sim_ppc_spr860_regnum, sim_ppc_spr861_regnum, + sim_ppc_spr862_regnum, sim_ppc_spr863_regnum, + sim_ppc_spr864_regnum, sim_ppc_spr865_regnum, + sim_ppc_spr866_regnum, sim_ppc_spr867_regnum, + sim_ppc_spr868_regnum, sim_ppc_spr869_regnum, + sim_ppc_spr870_regnum, sim_ppc_spr871_regnum, + sim_ppc_spr872_regnum, sim_ppc_spr873_regnum, + sim_ppc_spr874_regnum, sim_ppc_spr875_regnum, + sim_ppc_spr876_regnum, sim_ppc_spr877_regnum, + sim_ppc_spr878_regnum, sim_ppc_spr879_regnum, + sim_ppc_spr880_regnum, sim_ppc_spr881_regnum, + sim_ppc_spr882_regnum, sim_ppc_spr883_regnum, + sim_ppc_spr884_regnum, sim_ppc_spr885_regnum, + sim_ppc_spr886_regnum, sim_ppc_spr887_regnum, + sim_ppc_spr888_regnum, sim_ppc_spr889_regnum, + sim_ppc_spr890_regnum, sim_ppc_spr891_regnum, + sim_ppc_spr892_regnum, sim_ppc_spr893_regnum, + sim_ppc_spr894_regnum, sim_ppc_spr895_regnum, + sim_ppc_spr896_regnum, sim_ppc_spr897_regnum, + sim_ppc_spr898_regnum, sim_ppc_spr899_regnum, + sim_ppc_spr900_regnum, sim_ppc_spr901_regnum, + sim_ppc_spr902_regnum, sim_ppc_spr903_regnum, + sim_ppc_spr904_regnum, sim_ppc_spr905_regnum, + sim_ppc_spr906_regnum, sim_ppc_spr907_regnum, + sim_ppc_spr908_regnum, sim_ppc_spr909_regnum, + sim_ppc_spr910_regnum, sim_ppc_spr911_regnum, + sim_ppc_spr912_regnum, sim_ppc_spr913_regnum, + sim_ppc_spr914_regnum, sim_ppc_spr915_regnum, + sim_ppc_spr916_regnum, sim_ppc_spr917_regnum, + sim_ppc_spr918_regnum, sim_ppc_spr919_regnum, + sim_ppc_spr920_regnum, sim_ppc_spr921_regnum, + sim_ppc_spr922_regnum, sim_ppc_spr923_regnum, + sim_ppc_spr924_regnum, sim_ppc_spr925_regnum, + sim_ppc_spr926_regnum, sim_ppc_spr927_regnum, + sim_ppc_spr928_regnum, sim_ppc_spr929_regnum, + sim_ppc_spr930_regnum, sim_ppc_spr931_regnum, + sim_ppc_spr932_regnum, sim_ppc_spr933_regnum, + sim_ppc_spr934_regnum, sim_ppc_spr935_regnum, + sim_ppc_spr936_regnum, sim_ppc_spr937_regnum, + sim_ppc_spr938_regnum, sim_ppc_spr939_regnum, + sim_ppc_spr940_regnum, sim_ppc_spr941_regnum, + sim_ppc_spr942_regnum, sim_ppc_spr943_regnum, + sim_ppc_spr944_regnum, sim_ppc_spr945_regnum, + sim_ppc_spr946_regnum, sim_ppc_spr947_regnum, + sim_ppc_spr948_regnum, sim_ppc_spr949_regnum, + sim_ppc_spr950_regnum, sim_ppc_spr951_regnum, + sim_ppc_spr952_regnum, sim_ppc_spr953_regnum, + sim_ppc_spr954_regnum, sim_ppc_spr955_regnum, + sim_ppc_spr956_regnum, sim_ppc_spr957_regnum, + sim_ppc_spr958_regnum, sim_ppc_spr959_regnum, + sim_ppc_spr960_regnum, sim_ppc_spr961_regnum, + sim_ppc_spr962_regnum, sim_ppc_spr963_regnum, + sim_ppc_spr964_regnum, sim_ppc_spr965_regnum, + sim_ppc_spr966_regnum, sim_ppc_spr967_regnum, + sim_ppc_spr968_regnum, sim_ppc_spr969_regnum, + sim_ppc_spr970_regnum, sim_ppc_spr971_regnum, + sim_ppc_spr972_regnum, sim_ppc_spr973_regnum, + sim_ppc_spr974_regnum, sim_ppc_spr975_regnum, + sim_ppc_spr976_regnum, sim_ppc_spr977_regnum, + sim_ppc_spr978_regnum, sim_ppc_spr979_regnum, + sim_ppc_spr980_regnum, sim_ppc_spr981_regnum, + sim_ppc_spr982_regnum, sim_ppc_spr983_regnum, + sim_ppc_spr984_regnum, sim_ppc_spr985_regnum, + sim_ppc_spr986_regnum, sim_ppc_spr987_regnum, + sim_ppc_spr988_regnum, sim_ppc_spr989_regnum, + sim_ppc_spr990_regnum, sim_ppc_spr991_regnum, + sim_ppc_spr992_regnum, sim_ppc_spr993_regnum, + sim_ppc_spr994_regnum, sim_ppc_spr995_regnum, + sim_ppc_spr996_regnum, sim_ppc_spr997_regnum, + sim_ppc_spr998_regnum, sim_ppc_spr999_regnum, + sim_ppc_spr1000_regnum, sim_ppc_spr1001_regnum, + sim_ppc_spr1002_regnum, sim_ppc_spr1003_regnum, + sim_ppc_spr1004_regnum, sim_ppc_spr1005_regnum, + sim_ppc_spr1006_regnum, sim_ppc_spr1007_regnum, + sim_ppc_spr1008_regnum, sim_ppc_spr1009_regnum, + sim_ppc_spr1010_regnum, sim_ppc_spr1011_regnum, + sim_ppc_spr1012_regnum, sim_ppc_spr1013_regnum, + sim_ppc_spr1014_regnum, sim_ppc_spr1015_regnum, + sim_ppc_spr1016_regnum, sim_ppc_spr1017_regnum, + sim_ppc_spr1018_regnum, sim_ppc_spr1019_regnum, + sim_ppc_spr1020_regnum, sim_ppc_spr1021_regnum, + sim_ppc_spr1022_regnum, sim_ppc_spr1023_regnum + }; + + +/* Sizes of various register sets. */ +enum + { + sim_ppc_num_gprs = 32, + sim_ppc_num_fprs = 32, + sim_ppc_num_vrs = 32, + sim_ppc_num_srs = 16, + sim_ppc_num_sprs = 1024, + }; + + +/* Return the register name for the supplied SPR number if any, or + NULL if none. */ +extern const char *sim_spr_register_name (int); + +#ifdef __cplusplus +} +#endif + +#endif /* SIM_PPC_H */ diff --git a/include/gdb/sim-rl78.h b/include/gdb/sim-rl78.h new file mode 100644 index 0000000..c52a2a7 --- /dev/null +++ b/include/gdb/sim-rl78.h @@ -0,0 +1,76 @@ +/* sim-rx.h --- interface between rl78 simulator and GDB. + + Copyright 2011-2013 Free Software Foundation, Inc. + + Contributed by Red Hat. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_RL78_H) +#define SIM_RL78_H + +enum sim_rl78_regnum +{ + sim_rl78_bank0_r0_regnum, + sim_rl78_bank0_r1_regnum, + sim_rl78_bank0_r2_regnum, + sim_rl78_bank0_r3_regnum, + sim_rl78_bank0_r4_regnum, + sim_rl78_bank0_r5_regnum, + sim_rl78_bank0_r6_regnum, + sim_rl78_bank0_r7_regnum, + + sim_rl78_bank1_r0_regnum, + sim_rl78_bank1_r1_regnum, + sim_rl78_bank1_r2_regnum, + sim_rl78_bank1_r3_regnum, + sim_rl78_bank1_r4_regnum, + sim_rl78_bank1_r5_regnum, + sim_rl78_bank1_r6_regnum, + sim_rl78_bank1_r7_regnum, + + sim_rl78_bank2_r0_regnum, + sim_rl78_bank2_r1_regnum, + sim_rl78_bank2_r2_regnum, + sim_rl78_bank2_r3_regnum, + sim_rl78_bank2_r4_regnum, + sim_rl78_bank2_r5_regnum, + sim_rl78_bank2_r6_regnum, + sim_rl78_bank2_r7_regnum, + + sim_rl78_bank3_r0_regnum, + sim_rl78_bank3_r1_regnum, + sim_rl78_bank3_r2_regnum, + sim_rl78_bank3_r3_regnum, + sim_rl78_bank3_r4_regnum, + sim_rl78_bank3_r5_regnum, + sim_rl78_bank3_r6_regnum, + sim_rl78_bank3_r7_regnum, + + sim_rl78_psw_regnum, + sim_rl78_es_regnum, + sim_rl78_cs_regnum, + sim_rl78_pc_regnum, + + sim_rl78_spl_regnum, + sim_rl78_sph_regnum, + sim_rl78_pmc_regnum, + sim_rl78_mem_regnum, + + sim_rl78_num_regs +}; + +#endif /* SIM_RL78_H */ diff --git a/include/gdb/sim-rx.h b/include/gdb/sim-rx.h new file mode 100644 index 0000000..c4d855f --- /dev/null +++ b/include/gdb/sim-rx.h @@ -0,0 +1,56 @@ +/* sim-rx.h --- interface between RX simulator and GDB. + + Copyright 2008-2013 Free Software Foundation, Inc. + + Contributed by Red Hat. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_RX_H) +#define SIM_RX_H + +enum sim_rx_regnum + { + sim_rx_r0_regnum, + sim_rx_r1_regnum, + sim_rx_r2_regnum, + sim_rx_r3_regnum, + sim_rx_r4_regnum, + sim_rx_r5_regnum, + sim_rx_r6_regnum, + sim_rx_r7_regnum, + sim_rx_r8_regnum, + sim_rx_r9_regnum, + sim_rx_r10_regnum, + sim_rx_r11_regnum, + sim_rx_r12_regnum, + sim_rx_r13_regnum, + sim_rx_r14_regnum, + sim_rx_r15_regnum, + sim_rx_usp_regnum, + sim_rx_isp_regnum, + sim_rx_ps_regnum, + sim_rx_pc_regnum, + sim_rx_intb_regnum, + sim_rx_bpsw_regnum, + sim_rx_bpc_regnum, + sim_rx_fintv_regnum, + sim_rx_fpsw_regnum, + sim_rx_acc_regnum, + sim_rx_num_regs + }; + +#endif /* SIM_RX_H */ diff --git a/include/gdb/sim-sh.h b/include/gdb/sim-sh.h new file mode 100644 index 0000000..4e37992 --- /dev/null +++ b/include/gdb/sim-sh.h @@ -0,0 +1,169 @@ +/* This file defines the interface between the sh simulator and gdb. + Copyright (C) 2000-2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#if !defined (SIM_SH_H) +#define SIM_SH_H + +#ifdef __cplusplus +extern "C" { // } +#endif + +/* The simulator makes use of the following register information. */ + +enum +{ + SIM_SH_R0_REGNUM = 0, + SIM_SH_R1_REGNUM, + SIM_SH_R2_REGNUM, + SIM_SH_R3_REGNUM, + SIM_SH_R4_REGNUM, + SIM_SH_R5_REGNUM, + SIM_SH_R6_REGNUM, + SIM_SH_R7_REGNUM, + SIM_SH_R8_REGNUM, + SIM_SH_R9_REGNUM, + SIM_SH_R10_REGNUM, + SIM_SH_R11_REGNUM, + SIM_SH_R12_REGNUM, + SIM_SH_R13_REGNUM, + SIM_SH_R14_REGNUM, + SIM_SH_R15_REGNUM, + SIM_SH_PC_REGNUM, + SIM_SH_PR_REGNUM, + SIM_SH_GBR_REGNUM, + SIM_SH_VBR_REGNUM, + SIM_SH_MACH_REGNUM, + SIM_SH_MACL_REGNUM, + SIM_SH_SR_REGNUM, + SIM_SH_FPUL_REGNUM, + SIM_SH_FPSCR_REGNUM, + SIM_SH_FR0_REGNUM, /* FRn registers: sh3e / sh4 */ + SIM_SH_FR1_REGNUM, + SIM_SH_FR2_REGNUM, + SIM_SH_FR3_REGNUM, + SIM_SH_FR4_REGNUM, + SIM_SH_FR5_REGNUM, + SIM_SH_FR6_REGNUM, + SIM_SH_FR7_REGNUM, + SIM_SH_FR8_REGNUM, + SIM_SH_FR9_REGNUM, + SIM_SH_FR10_REGNUM, + SIM_SH_FR11_REGNUM, + SIM_SH_FR12_REGNUM, + SIM_SH_FR13_REGNUM, + SIM_SH_FR14_REGNUM, + SIM_SH_FR15_REGNUM, + SIM_SH_SSR_REGNUM, /* sh3{,e,-dsp}, sh4 */ + SIM_SH_SPC_REGNUM, /* sh3{,e,-dsp}, sh4 */ + SIM_SH_R0_BANK0_REGNUM, /* SIM_SH_Rn_BANKm_REGNUM: sh3[e] / sh4 */ + SIM_SH_R1_BANK0_REGNUM, + SIM_SH_R2_BANK0_REGNUM, + SIM_SH_R3_BANK0_REGNUM, + SIM_SH_R4_BANK0_REGNUM, + SIM_SH_R5_BANK0_REGNUM, + SIM_SH_R6_BANK0_REGNUM, + SIM_SH_R7_BANK0_REGNUM, + SIM_SH_R0_BANK1_REGNUM, + SIM_SH_R1_BANK1_REGNUM, + SIM_SH_R2_BANK1_REGNUM, + SIM_SH_R3_BANK1_REGNUM, + SIM_SH_R4_BANK1_REGNUM, + SIM_SH_R5_BANK1_REGNUM, + SIM_SH_R6_BANK1_REGNUM, + SIM_SH_R7_BANK1_REGNUM, + SIM_SH_XF0_REGNUM, + SIM_SH_XF1_REGNUM, + SIM_SH_XF2_REGNUM, + SIM_SH_XF3_REGNUM, + SIM_SH_XF4_REGNUM, + SIM_SH_XF5_REGNUM, + SIM_SH_XF6_REGNUM, + SIM_SH_XF7_REGNUM, + SIM_SH_XF8_REGNUM, + SIM_SH_XF9_REGNUM, + SIM_SH_XF10_REGNUM, + SIM_SH_XF11_REGNUM, + SIM_SH_XF12_REGNUM, + SIM_SH_XF13_REGNUM, + SIM_SH_XF14_REGNUM, + SIM_SH_XF15_REGNUM, + SIM_SH_SGR_REGNUM, + SIM_SH_DBR_REGNUM, + SIM_SH4_NUM_REGS, /* 77 */ + + /* sh[3]-dsp */ + SIM_SH_DSR_REGNUM, + SIM_SH_A0G_REGNUM, + SIM_SH_A0_REGNUM, + SIM_SH_A1G_REGNUM, + SIM_SH_A1_REGNUM, + SIM_SH_M0_REGNUM, + SIM_SH_M1_REGNUM, + SIM_SH_X0_REGNUM, + SIM_SH_X1_REGNUM, + SIM_SH_Y0_REGNUM, + SIM_SH_Y1_REGNUM, + SIM_SH_MOD_REGNUM, + SIM_SH_RS_REGNUM, + SIM_SH_RE_REGNUM, + SIM_SH_R0_BANK_REGNUM, + SIM_SH_R1_BANK_REGNUM, + SIM_SH_R2_BANK_REGNUM, + SIM_SH_R3_BANK_REGNUM, + SIM_SH_R4_BANK_REGNUM, + SIM_SH_R5_BANK_REGNUM, + SIM_SH_R6_BANK_REGNUM, + SIM_SH_R7_BANK_REGNUM, + /* 109..127: room for expansion. */ + SIM_SH_TBR_REGNUM, + SIM_SH_IBNR_REGNUM, + SIM_SH_IBCR_REGNUM, + SIM_SH_BANK_REGNUM, + SIM_SH_BANK_MACL_REGNUM, + SIM_SH_BANK_GBR_REGNUM, + SIM_SH_BANK_PR_REGNUM, + SIM_SH_BANK_IVN_REGNUM, + SIM_SH_BANK_MACH_REGNUM +}; + +enum +{ + SIM_SH64_R0_REGNUM = 0, + SIM_SH64_SP_REGNUM = 15, + SIM_SH64_PC_REGNUM = 64, + SIM_SH64_SR_REGNUM = 65, + SIM_SH64_SSR_REGNUM = 66, + SIM_SH64_SPC_REGNUM = 67, + SIM_SH64_TR0_REGNUM = 68, + SIM_SH64_FPCSR_REGNUM = 76, + SIM_SH64_FR0_REGNUM = 77 +}; + +enum +{ + SIM_SH64_NR_REGS = 141, /* total number of architectural registers */ + SIM_SH64_NR_R_REGS = 64, /* number of general registers */ + SIM_SH64_NR_TR_REGS = 8, /* number of target registers */ + SIM_SH64_NR_FP_REGS = 64 /* number of floating point registers */ +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/gdbm.h b/include/gdbm.h new file mode 100644 index 0000000..d2a6006 --- /dev/null +++ b/include/gdbm.h @@ -0,0 +1,91 @@ +/* GNU DBM - DataBase Manager include file + Copyright 1989, 1991 Free Software Foundation, Inc. + Written by Philip A. Nelson. + +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 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, write to the Free Software +Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* You may contact the author by: + e-mail: phil@wwu.edu + us-mail: Philip A. Nelson + Computer Science Department + Western Washington University + Bellingham, WA 98226 + phone: (206) 676-3035 + +*************************************************************************/ + +/* Parameters to gdbm_open for READERS, WRITERS, and WRITERS who + can create the database. */ +#define GDBM_READER 0 +#define GDBM_WRITER 1 +#define GDBM_WRCREAT 2 +#define GDBM_NEWDB 3 + +/* Parameters to gdbm_store for simple insertion or replacement. */ +#define GDBM_INSERT 0 +#define GDBM_REPLACE 1 + + +/* The data and key structure. This structure is defined for compatibility. */ +typedef struct { + char *dptr; + int dsize; + } datum; + + +/* The file information header. This is good enough for most applications. */ +typedef struct {int dummy[10];} *GDBM_FILE; + + +/* These are the routines! */ + +extern GDBM_FILE gdbm_open (); + +extern void gdbm_close (); + +extern datum gdbm_fetch (); + +extern int gdbm_store (); + +extern int gdbm_delete (); + +extern datum gdbm_firstkey (); + +extern datum gdbm_nextkey (); + +extern int gdbm_reorganize (); + + +/* gdbm sends back the following error codes in the variable gdbm_errno. */ +typedef enum { NO_ERROR, + MALLOC_ERROR, + BLOCK_SIZE_ERROR, + FILE_OPEN_ERROR, + FILE_WRITE_ERROR, + FILE_SEEK_ERROR, + FILE_READ_ERROR, + BAD_MAGIC_NUMBER, + EMPTY_DATABASE, + CANT_BE_READER, + CANT_BE_WRITER, + READER_CANT_RECOVER, + READER_CANT_DELETE, + READER_CANT_STORE, + READER_CANT_REORGANIZE, + UNKNOWN_UPDATE, + ITEM_NOT_FOUND, + REORGANIZE_FAILED, + CANNOT_REPLACE} + gdbm_error; diff --git a/include/getopt.h b/include/getopt.h new file mode 100644 index 0000000..ac88524 --- /dev/null +++ b/include/getopt.h @@ -0,0 +1,185 @@ +/**************************************************************************** + +getopt.h - Read command line options + +AUTHOR: Gregory Pietsch +CREATED Thu Jan 09 22:37:00 1997 + +DESCRIPTION: + +The getopt() function parses the command line arguments. Its arguments argc +and argv are the argument count and array as passed to the main() function +on program invocation. The argument optstring is a list of available option +characters. If such a character is followed by a colon (`:'), the option +takes an argument, which is placed in optarg. If such a character is +followed by two colons, the option takes an optional argument, which is +placed in optarg. If the option does not take an argument, optarg is NULL. + +The external variable optind is the index of the next array element of argv +to be processed; it communicates from one call to the next which element to +process. + +The getopt_long() function works like getopt() except that it also accepts +long options started by two dashes `--'. If these take values, it is either +in the form + +--arg=value + + or + +--arg value + +It takes the additional arguments longopts which is a pointer to the first +element of an array of type GETOPT_LONG_OPTION_T, defined below. The last +element of the array has to be filled with NULL for the name field. + +The longind pointer points to the index of the current long option relative +to longopts if it is non-NULL. + +The getopt() function returns the option character if the option was found +successfully, `:' if there was a missing parameter for one of the options, +`?' for an unknown option character, and EOF for the end of the option list. + +The getopt_long() function's return value is described below. + +The function getopt_long_only() is identical to getopt_long(), except that a +plus sign `+' can introduce long options as well as `--'. + +Describe how to deal with options that follow non-option ARGV-elements. + +If the caller did not specify anything, the default is REQUIRE_ORDER if the +environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. + +REQUIRE_ORDER means don't recognize them as options; stop option processing +when the first non-option is seen. This is what Unix does. This mode of +operation is selected by either setting the environment variable +POSIXLY_CORRECT, or using `+' as the first character of the optstring +parameter. + +PERMUTE is the default. We permute the contents of ARGV as we scan, so that +eventually all the non-options are at the end. This allows options to be +given in any order, even with programs that were not written to expect this. + +RETURN_IN_ORDER is an option available to programs that were written to +expect options and other ARGV-elements in any order and that care about the +ordering of the two. We describe each non-option ARGV-element as if it were +the argument of an option with character code 1. Using `-' as the first +character of the optstring parameter selects this mode of operation. + +The special argument `--' forces an end of option-scanning regardless of the +value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause +getopt() and friends to return EOF with optind != argc. + +COPYRIGHT NOTICE AND DISCLAIMER: + +Copyright (C) 1997 Gregory Pietsch + +This file and the accompanying getopt.c implementation file are hereby +placed in the public domain without restrictions. Just give the author +credit, don't claim you wrote it or prevent anyone else from using it. + +Gregory Pietsch's current e-mail address: +gpietsch@comcast.net +****************************************************************************/ + +/* This is a glibc-extension header file. */ + +#ifndef GETOPT_H +#define GETOPT_H + +#include <_ansi.h> + +/* include files needed by this include file */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#ifdef __cplusplus +extern "C" +{ + +#endif /* __cplusplus */ + +/* types defined by this include file */ + struct option + { + const char *name; /* the name of the long option */ + int has_arg; /* one of the above macros */ + int *flag; /* determines if getopt_long() returns a + * value for a long option; if it is + * non-NULL, 0 is returned as a function + * value and the value of val is stored in + * the area pointed to by flag. Otherwise, + * val is returned. */ + int val; /* determines the value to return if flag is + * NULL. */ + + }; + +/* While getopt.h is a glibc extension, the following are newlib extensions. + * They are optionally included via the __need_getopt_newlib flag. */ + +#ifdef __need_getopt_newlib + + /* macros defined by this include file */ + #define NO_ARG no_argument + #define REQUIRED_ARG required_argument + #define OPTIONAL_ARG optional_argument + + /* The GETOPT_DATA_INITIALIZER macro is used to initialize a statically- + allocated variable of type struct getopt_data. */ + #define GETOPT_DATA_INITIALIZER {0,0,0,0,0,0,0} + + /* These #defines are to make accessing the reentrant functions easier. */ + #define getopt_r __getopt_r + #define getopt_long_r __getopt_long_r + #define getopt_long_only_r __getopt_long_only_r + + /* The getopt_data structure is for reentrancy. Its members are similar to + the externally-defined variables. */ + typedef struct getopt_data + { + char *optarg; + int optind, opterr, optopt, optwhere; + int permute_from, num_nonopts; + } getopt_data; + +#endif /* __need_getopt_newlib */ + + /* externally-defined variables */ + extern char *optarg; + extern int optind; + extern int opterr; + extern int optopt; + + /* function prototypes */ + int getopt (int __argc, char *const __argv[], const char *__optstring); + + int getopt_long (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind); + + int getopt_long_only (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind); + +#ifdef __need_getopt_newlib + int __getopt_r (int __argc, char *const __argv[], const char *__optstring, + struct getopt_data * __data); + + int __getopt_long_r (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind, + struct getopt_data * __data); + + int __getopt_long_only_r (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind, + struct getopt_data * __data); +#endif /* __need_getopt_newlib */ + +#ifdef __cplusplus +}; + +#endif /* __cplusplus */ + +#endif /* GETOPT_H */ + +/* END OF FILE getopt.h */ diff --git a/include/glob.h b/include/glob.h new file mode 100644 index 0000000..7a300e6 --- /dev/null +++ b/include/glob.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)glob.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD: src/include/glob.h,v 1.6 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _GLOB_H_ +#define _GLOB_H_ + +#include + +struct stat; +typedef struct { + int gl_pathc; /* Count of total paths so far. */ + int gl_matchc; /* Count of paths matching pattern. */ + int gl_offs; /* Reserved at beginning of gl_pathv. */ + int gl_flags; /* Copy of flags parameter to glob. */ + char **gl_pathv; /* List of paths matching pattern. */ + /* Copy of errfunc parameter to glob. */ + int (*gl_errfunc)(const char *, int); + + /* + * Alternate filesystem access methods for glob; replacement + * versions of closedir(3), readdir(3), opendir(3), stat(2) + * and lstat(2). + */ + void (*gl_closedir)(void *); + struct dirent *(*gl_readdir)(void *); + void *(*gl_opendir)(const char *); + int (*gl_lstat)(const char *, struct stat *); + int (*gl_stat)(const char *, struct stat *); +} glob_t; + +#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ +#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ +#define GLOB_ERR 0x0004 /* Return on error. */ +#define GLOB_MARK 0x0008 /* Append / to matching directories. */ +#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ +#define GLOB_NOSORT 0x0020 /* Don't sort. */ + +#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ +#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ +#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ +#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ +#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ +#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ +#define GLOB_LIMIT 0x1000 /* limit number of returned paths */ + +/* backwards compatibility, this is the old name for this option */ +#define GLOB_MAXPATH GLOB_LIMIT + +#define GLOB_NOSPACE (-1) /* Malloc call failed. */ +#define GLOB_ABEND (-2) /* Unignored error. */ + +__BEGIN_DECLS +int glob(const char *__restrict, int, int (*)(const char *, int), + glob_t *__restrict); +void globfree(glob_t *); +__END_DECLS + +#endif /* !_GLOB_H_ */ diff --git a/include/gomp-constants.h b/include/gomp-constants.h new file mode 100644 index 0000000..9bc9fa5 --- /dev/null +++ b/include/gomp-constants.h @@ -0,0 +1,259 @@ +/* Communication between GCC and libgomp. + + Copyright (C) 2014-2015 Free Software Foundation, Inc. + + Contributed by Mentor Embedded. + + This file is part of the GNU Offloading and Multi Processing Library + (libgomp). + + Libgomp 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, or (at your option) + any later version. + + Libgomp 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. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + . */ + +#ifndef GOMP_CONSTANTS_H +#define GOMP_CONSTANTS_H 1 + +/* Memory mapping types. */ + +/* One byte. */ +#define GOMP_MAP_LAST (1 << 8) + +#define GOMP_MAP_FLAG_TO (1 << 0) +#define GOMP_MAP_FLAG_FROM (1 << 1) +/* Special map kinds, enumerated starting here. */ +#define GOMP_MAP_FLAG_SPECIAL_0 (1 << 2) +#define GOMP_MAP_FLAG_SPECIAL_1 (1 << 3) +#define GOMP_MAP_FLAG_SPECIAL_2 (1 << 4) +#define GOMP_MAP_FLAG_SPECIAL (GOMP_MAP_FLAG_SPECIAL_1 \ + | GOMP_MAP_FLAG_SPECIAL_0) +/* Flag to force a specific behavior (or else, trigger a run-time error). */ +#define GOMP_MAP_FLAG_FORCE (1 << 7) + +enum gomp_map_kind + { + /* If not already present, allocate. */ + GOMP_MAP_ALLOC = 0, + /* ..., and copy to device. */ + GOMP_MAP_TO = (GOMP_MAP_ALLOC | GOMP_MAP_FLAG_TO), + /* ..., and copy from device. */ + GOMP_MAP_FROM = (GOMP_MAP_ALLOC | GOMP_MAP_FLAG_FROM), + /* ..., and copy to and from device. */ + GOMP_MAP_TOFROM = (GOMP_MAP_TO | GOMP_MAP_FROM), + /* The following kind is an internal only map kind, used for pointer based + array sections. OMP_CLAUSE_SIZE for these is not the pointer size, + which is implicitly POINTER_SIZE_UNITS, but the bias. */ + GOMP_MAP_POINTER = (GOMP_MAP_FLAG_SPECIAL_0 | 0), + /* Also internal, behaves like GOMP_MAP_TO, but additionally any + GOMP_MAP_POINTER records consecutive after it which have addresses + falling into that range will not be ignored if GOMP_MAP_TO_PSET wasn't + mapped already. */ + GOMP_MAP_TO_PSET = (GOMP_MAP_FLAG_SPECIAL_0 | 1), + /* Must already be present. */ + GOMP_MAP_FORCE_PRESENT = (GOMP_MAP_FLAG_SPECIAL_0 | 2), + /* Deallocate a mapping, without copying from device. */ + GOMP_MAP_DELETE = (GOMP_MAP_FLAG_SPECIAL_0 | 3), + /* Is a device pointer. OMP_CLAUSE_SIZE for these is unused; is implicitly + POINTER_SIZE_UNITS. */ + GOMP_MAP_FORCE_DEVICEPTR = (GOMP_MAP_FLAG_SPECIAL_1 | 0), + /* Do not map, copy bits for firstprivate instead. */ + /* OpenACC device_resident. */ + GOMP_MAP_DEVICE_RESIDENT = (GOMP_MAP_FLAG_SPECIAL_1 | 1), + /* OpenACC link. */ + GOMP_MAP_LINK = (GOMP_MAP_FLAG_SPECIAL_1 | 2), + /* Allocate. */ + GOMP_MAP_FIRSTPRIVATE = (GOMP_MAP_FLAG_SPECIAL | 0), + /* Similarly, but store the value in the pointer rather than + pointed by the pointer. */ + GOMP_MAP_FIRSTPRIVATE_INT = (GOMP_MAP_FLAG_SPECIAL | 1), + /* Pointer translate host address into device address and copy that + back to host. */ + GOMP_MAP_USE_DEVICE_PTR = (GOMP_MAP_FLAG_SPECIAL | 2), + /* Allocate a zero length array section. Prefer next non-zero length + mapping over previous non-zero length mapping over zero length mapping + at the address. If not already mapped, do nothing (and pointer translate + to NULL). */ + GOMP_MAP_ZERO_LEN_ARRAY_SECTION = (GOMP_MAP_FLAG_SPECIAL | 3), + /* Allocate. */ + GOMP_MAP_FORCE_ALLOC = (GOMP_MAP_FLAG_FORCE | GOMP_MAP_ALLOC), + /* ..., and copy to device. */ + GOMP_MAP_FORCE_TO = (GOMP_MAP_FLAG_FORCE | GOMP_MAP_TO), + /* ..., and copy from device. */ + GOMP_MAP_FORCE_FROM = (GOMP_MAP_FLAG_FORCE | GOMP_MAP_FROM), + /* ..., and copy to and from device. */ + GOMP_MAP_FORCE_TOFROM = (GOMP_MAP_FLAG_FORCE | GOMP_MAP_TOFROM), + /* If not already present, allocate. And unconditionally copy to + device. */ + GOMP_MAP_ALWAYS_TO = (GOMP_MAP_FLAG_SPECIAL_2 | GOMP_MAP_TO), + /* If not already present, allocate. And unconditionally copy from + device. */ + GOMP_MAP_ALWAYS_FROM = (GOMP_MAP_FLAG_SPECIAL_2 + | GOMP_MAP_FROM), + /* If not already present, allocate. And unconditionally copy to and from + device. */ + GOMP_MAP_ALWAYS_TOFROM = (GOMP_MAP_FLAG_SPECIAL_2 + | GOMP_MAP_TOFROM), + /* Map a sparse struct; the address is the base of the structure, alignment + it's required alignment, and size is the number of adjacent entries + that belong to the struct. The adjacent entries should be sorted by + increasing address, so it is easy to determine lowest needed address + (address of the first adjacent entry) and highest needed address + (address of the last adjacent entry plus its size). */ + GOMP_MAP_STRUCT = (GOMP_MAP_FLAG_SPECIAL_2 + | GOMP_MAP_FLAG_SPECIAL | 0), + /* On a location of a pointer/reference that is assumed to be already mapped + earlier, store the translated address of the preceeding mapping. + No refcount is bumped by this, and the store is done unconditionally. */ + GOMP_MAP_ALWAYS_POINTER = (GOMP_MAP_FLAG_SPECIAL_2 + | GOMP_MAP_FLAG_SPECIAL | 1), + /* Forced deallocation of zero length array section. */ + GOMP_MAP_DELETE_ZERO_LEN_ARRAY_SECTION + = (GOMP_MAP_FLAG_SPECIAL_2 + | GOMP_MAP_FLAG_SPECIAL | 3), + /* Decrement usage count and deallocate if zero. */ + GOMP_MAP_RELEASE = (GOMP_MAP_FLAG_SPECIAL_2 + | GOMP_MAP_DELETE), + + /* Internal to GCC, not used in libgomp. */ + /* Do not map, but pointer assign a pointer instead. */ + GOMP_MAP_FIRSTPRIVATE_POINTER = (GOMP_MAP_LAST | 1), + /* Do not map, but pointer assign a reference instead. */ + GOMP_MAP_FIRSTPRIVATE_REFERENCE = (GOMP_MAP_LAST | 2) + }; + +#define GOMP_MAP_COPY_TO_P(X) \ + (!((X) & GOMP_MAP_FLAG_SPECIAL) \ + && ((X) & GOMP_MAP_FLAG_TO)) + +#define GOMP_MAP_COPY_FROM_P(X) \ + (!((X) & GOMP_MAP_FLAG_SPECIAL) \ + && ((X) & GOMP_MAP_FLAG_FROM)) + +#define GOMP_MAP_POINTER_P(X) \ + ((X) == GOMP_MAP_POINTER) + +#define GOMP_MAP_ALWAYS_TO_P(X) \ + (((X) == GOMP_MAP_ALWAYS_TO) || ((X) == GOMP_MAP_ALWAYS_TOFROM)) + +#define GOMP_MAP_ALWAYS_FROM_P(X) \ + (((X) == GOMP_MAP_ALWAYS_FROM) || ((X) == GOMP_MAP_ALWAYS_TOFROM)) + +#define GOMP_MAP_ALWAYS_P(X) \ + (GOMP_MAP_ALWAYS_TO_P (X) || ((X) == GOMP_MAP_ALWAYS_FROM)) + + +/* Asynchronous behavior. Keep in sync with + libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_async_t. */ + +#define GOMP_ASYNC_NOVAL -1 +#define GOMP_ASYNC_SYNC -2 + + +/* Device codes. Keep in sync with + libgomp/{openacc.h,openacc.f90,openacc_lib.h}:acc_device_t as well as + libgomp/libgomp-plugin.h. */ +#define GOMP_DEVICE_NONE 0 +#define GOMP_DEVICE_DEFAULT 1 +#define GOMP_DEVICE_HOST 2 +/* #define GOMP_DEVICE_HOST_NONSHM 3 removed. */ +#define GOMP_DEVICE_NOT_HOST 4 +#define GOMP_DEVICE_NVIDIA_PTX 5 +#define GOMP_DEVICE_INTEL_MIC 6 +#define GOMP_DEVICE_HSA 7 + +#define GOMP_DEVICE_ICV -1 +#define GOMP_DEVICE_HOST_FALLBACK -2 + +/* GOMP_task/GOMP_taskloop* flags argument. */ +#define GOMP_TASK_FLAG_UNTIED (1 << 0) +#define GOMP_TASK_FLAG_FINAL (1 << 1) +#define GOMP_TASK_FLAG_MERGEABLE (1 << 2) +#define GOMP_TASK_FLAG_DEPEND (1 << 3) +#define GOMP_TASK_FLAG_PRIORITY (1 << 4) +#define GOMP_TASK_FLAG_UP (1 << 8) +#define GOMP_TASK_FLAG_GRAINSIZE (1 << 9) +#define GOMP_TASK_FLAG_IF (1 << 10) +#define GOMP_TASK_FLAG_NOGROUP (1 << 11) + +/* GOMP_target{_ext,update_ext,enter_exit_data} flags argument. */ +#define GOMP_TARGET_FLAG_NOWAIT (1 << 0) +#define GOMP_TARGET_FLAG_EXIT_DATA (1 << 1) +/* Internal to libgomp. */ +#define GOMP_TARGET_FLAG_UPDATE (1U << 31) + +/* Versions of libgomp and device-specific plugins. GOMP_VERSION + should be incremented whenever an ABI-incompatible change is introduced + to the plugin interface defined in libgomp/libgomp.h. */ +#define GOMP_VERSION 1 +#define GOMP_VERSION_NVIDIA_PTX 1 +#define GOMP_VERSION_INTEL_MIC 0 +#define GOMP_VERSION_HSA 0 + +#define GOMP_VERSION_PACK(LIB, DEV) (((LIB) << 16) | (DEV)) +#define GOMP_VERSION_LIB(PACK) (((PACK) >> 16) & 0xffff) +#define GOMP_VERSION_DEV(PACK) ((PACK) & 0xffff) + +#define GOMP_DIM_GANG 0 +#define GOMP_DIM_WORKER 1 +#define GOMP_DIM_VECTOR 2 +#define GOMP_DIM_MAX 3 +#define GOMP_DIM_MASK(X) (1u << (X)) + +/* Varadic launch arguments. End of list is marked by a zero. */ +#define GOMP_LAUNCH_DIM 1 /* Launch dimensions, op = mask */ +#define GOMP_LAUNCH_ASYNC 2 /* Async, op = cst val if not MAX */ +#define GOMP_LAUNCH_WAIT 3 /* Waits, op = num waits. */ +#define GOMP_LAUNCH_CODE_SHIFT 28 +#define GOMP_LAUNCH_DEVICE_SHIFT 16 +#define GOMP_LAUNCH_OP_SHIFT 0 +#define GOMP_LAUNCH_PACK(CODE,DEVICE,OP) \ + (((CODE) << GOMP_LAUNCH_CODE_SHIFT) \ + | ((DEVICE) << GOMP_LAUNCH_DEVICE_SHIFT) \ + | ((OP) << GOMP_LAUNCH_OP_SHIFT)) +#define GOMP_LAUNCH_CODE(X) (((X) >> GOMP_LAUNCH_CODE_SHIFT) & 0xf) +#define GOMP_LAUNCH_DEVICE(X) (((X) >> GOMP_LAUNCH_DEVICE_SHIFT) & 0xfff) +#define GOMP_LAUNCH_OP(X) (((X) >> GOMP_LAUNCH_OP_SHIFT) & 0xffff) +#define GOMP_LAUNCH_OP_MAX 0xffff + +/* Bitmask to apply in order to find out the intended device of a target + argument. */ +#define GOMP_TARGET_ARG_DEVICE_MASK ((1 << 7) - 1) +/* The target argument is significant for all devices. */ +#define GOMP_TARGET_ARG_DEVICE_ALL 0 + +/* Flag set when the subsequent element in the device-specific argument + values. */ +#define GOMP_TARGET_ARG_SUBSEQUENT_PARAM (1 << 7) + +/* Bitmask to apply to a target argument to find out the value identifier. */ +#define GOMP_TARGET_ARG_ID_MASK (((1 << 8) - 1) << 8) +/* Target argument index of NUM_TEAMS. */ +#define GOMP_TARGET_ARG_NUM_TEAMS (1 << 8) +/* Target argument index of THREAD_LIMIT. */ +#define GOMP_TARGET_ARG_THREAD_LIMIT (2 << 8) + +/* If the value is directly embeded in target argument, it should be a 16-bit + at most and shifted by this many bits. */ +#define GOMP_TARGET_ARG_VALUE_SHIFT 16 + +/* HSA specific data structures. */ + +/* Identifiers of device-specific target arguments. */ +#define GOMP_TARGET_ARG_HSA_KERNEL_ATTRIBUTES (1 << 8) + +#endif diff --git a/include/grp.h b/include/grp.h new file mode 100644 index 0000000..7296e7a --- /dev/null +++ b/include/grp.h @@ -0,0 +1,86 @@ +/* $NetBSD: grp.h,v 1.7 1995/04/29 05:30:40 cgd Exp $ */ + +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)grp.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _GRP_H_ +#define _GRP_H_ + +#include +#include +#ifdef __CYGWIN__ +#include +#endif + +#if __BSD_VISIBLE +#define _PATH_GROUP "/etc/group" +#endif + +struct group { + char *gr_name; /* group name */ + char *gr_passwd; /* group password */ + gid_t gr_gid; /* group id */ + char **gr_mem; /* group members */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __INSIDE_CYGWIN__ +struct group *getgrgid (gid_t); +struct group *getgrnam (const char *); +#if __MISC_VISIBLE || __POSIX_VISIBLE +int getgrnam_r (const char *, struct group *, + char *, size_t, struct group **); +int getgrgid_r (gid_t, struct group *, + char *, size_t, struct group **); +#endif /* __MISC_VISIBLE || __POSIX_VISIBLE */ +#if __MISC_VISIBLE || __XSI_VISIBLE >= 4 +struct group *getgrent (void); +void setgrent (void); +void endgrent (void); +#endif /* __MISC_VISIBLE || __XSI_VISIBLE >= 4 */ +#if __BSD_VISIBLE +int initgroups (const char *, gid_t); +#endif /* __BSD_VISIBLE */ +#endif /* !__INSIDE_CYGWIN__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* !_GRP_H_ */ diff --git a/include/hashtab.h b/include/hashtab.h new file mode 100644 index 0000000..b1b5877 --- /dev/null +++ b/include/hashtab.h @@ -0,0 +1,204 @@ +/* An expandable hash tables datatype. + Copyright (C) 1999-2015 Free Software Foundation, Inc. + Contributed by Vladimir Makarov (vmakarov@cygnus.com). + +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 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, write to the Free Software +Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* This package implements basic hash table functionality. It is possible + to search for an entry, create an entry and destroy an entry. + + Elements in the table are generic pointers. + + The size of the table is not fixed; if the occupancy of the table + grows too high the hash table will be expanded. + + The abstract data implementation is based on generalized Algorithm D + from Knuth's book "The art of computer programming". Hash table is + expanded by creation of new hash table and transferring elements from + the old table to the new table. */ + +#ifndef __HASHTAB_H__ +#define __HASHTAB_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" + +/* The type for a hash code. */ +typedef unsigned int hashval_t; + +/* Callback function pointer types. */ + +/* Calculate hash of a table entry. */ +typedef hashval_t (*htab_hash) (const void *); + +/* Compare a table entry with a possible entry. The entry already in + the table always comes first, so the second element can be of a + different type (but in this case htab_find and htab_find_slot + cannot be used; instead the variants that accept a hash value + must be used). */ +typedef int (*htab_eq) (const void *, const void *); + +/* Cleanup function called whenever a live element is removed from + the hash table. */ +typedef void (*htab_del) (void *); + +/* Function called by htab_traverse for each live element. The first + arg is the slot of the element (which can be passed to htab_clear_slot + if desired), the second arg is the auxiliary pointer handed to + htab_traverse. Return 1 to continue scan, 0 to stop. */ +typedef int (*htab_trav) (void **, void *); + +/* Memory-allocation function, with the same functionality as calloc(). + Iff it returns NULL, the hash table implementation will pass an error + code back to the user, so if your code doesn't handle errors, + best if you use xcalloc instead. */ +typedef void *(*htab_alloc) (size_t, size_t); + +/* We also need a free() routine. */ +typedef void (*htab_free) (void *); + +/* Memory allocation and deallocation; variants which take an extra + argument. */ +typedef void *(*htab_alloc_with_arg) (void *, size_t, size_t); +typedef void (*htab_free_with_arg) (void *, void *); + +/* This macro defines reserved value for empty table entry. */ + +#define HTAB_EMPTY_ENTRY ((PTR) 0) + +/* This macro defines reserved value for table entry which contained + a deleted element. */ + +#define HTAB_DELETED_ENTRY ((PTR) 1) + +/* Hash tables are of the following type. The structure + (implementation) of this type is not needed for using the hash + tables. All work with hash table should be executed only through + functions mentioned below. The size of this structure is subject to + change. */ + +struct htab { + /* Pointer to hash function. */ + htab_hash hash_f; + + /* Pointer to comparison function. */ + htab_eq eq_f; + + /* Pointer to cleanup function. */ + htab_del del_f; + + /* Table itself. */ + void **entries; + + /* Current size (in entries) of the hash table. */ + size_t size; + + /* Current number of elements including also deleted elements. */ + size_t n_elements; + + /* Current number of deleted elements in the table. */ + size_t n_deleted; + + /* The following member is used for debugging. Its value is number + of all calls of `htab_find_slot' for the hash table. */ + unsigned int searches; + + /* The following member is used for debugging. Its value is number + of collisions fixed for time of work with the hash table. */ + unsigned int collisions; + + /* Pointers to allocate/free functions. */ + htab_alloc alloc_f; + htab_free free_f; + + /* Alternate allocate/free functions, which take an extra argument. */ + void *alloc_arg; + htab_alloc_with_arg alloc_with_arg_f; + htab_free_with_arg free_with_arg_f; + + /* Current size (in entries) of the hash table, as an index into the + table of primes. */ + unsigned int size_prime_index; +}; + +typedef struct htab *htab_t; + +/* An enum saying whether we insert into the hash table or not. */ +enum insert_option {NO_INSERT, INSERT}; + +/* The prototypes of the package functions. */ + +extern htab_t htab_create_alloc (size_t, htab_hash, + htab_eq, htab_del, + htab_alloc, htab_free); + +extern htab_t htab_create_alloc_ex (size_t, htab_hash, + htab_eq, htab_del, + void *, htab_alloc_with_arg, + htab_free_with_arg); + +extern htab_t htab_create_typed_alloc (size_t, htab_hash, htab_eq, htab_del, + htab_alloc, htab_alloc, htab_free); + +/* Backward-compatibility functions. */ +extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del); +extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del); + +extern void htab_set_functions_ex (htab_t, htab_hash, + htab_eq, htab_del, + void *, htab_alloc_with_arg, + htab_free_with_arg); + +extern void htab_delete (htab_t); +extern void htab_empty (htab_t); + +extern void * htab_find (htab_t, const void *); +extern void ** htab_find_slot (htab_t, const void *, enum insert_option); +extern void * htab_find_with_hash (htab_t, const void *, hashval_t); +extern void ** htab_find_slot_with_hash (htab_t, const void *, + hashval_t, enum insert_option); +extern void htab_clear_slot (htab_t, void **); +extern void htab_remove_elt (htab_t, void *); +extern void htab_remove_elt_with_hash (htab_t, void *, hashval_t); + +extern void htab_traverse (htab_t, htab_trav, void *); +extern void htab_traverse_noresize (htab_t, htab_trav, void *); + +extern size_t htab_size (htab_t); +extern size_t htab_elements (htab_t); +extern double htab_collisions (htab_t); + +/* A hash function for pointers. */ +extern htab_hash htab_hash_pointer; + +/* An equality function for pointers. */ +extern htab_eq htab_eq_pointer; + +/* A hash function for null-terminated strings. */ +extern hashval_t htab_hash_string (const void *); + +/* An iterative hash function for arbitrary data. */ +extern hashval_t iterative_hash (const void *, size_t, hashval_t); +/* Shorthand for hashing something with an intrinsic size. */ +#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __HASHTAB_H */ diff --git a/include/hp-symtab.h b/include/hp-symtab.h new file mode 100644 index 0000000..e944e90 --- /dev/null +++ b/include/hp-symtab.h @@ -0,0 +1,1867 @@ +/* Definitions and structures for reading debug symbols from the + native HP C compiler. + + Written by the Center for Software Science at the University of Utah + and by Cygnus Support. + + Copyright 1994, 1995, 1998, 1999, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef HP_SYMTAB_INCLUDED +#define HP_SYMTAB_INCLUDED + +/* General information: + + This header file defines and describes only the data structures + necessary to read debug symbols produced by the HP C compiler, + HP ANSI C++ compiler, and HP FORTRAN 90 compiler using the + SOM object file format. + (For a full description of the debug format, ftp hpux-symtab.h from + jaguar.cs.utah.edu:/dist). + + Additional notes (Rich Title) + This file is a reverse-engineered version of a file called + "symtab.h" which exists internal to HP's Computer Languages Organization + in /CLO/Components/DDE/obj/som/symtab.h. Because HP's version of + the file is copyrighted and not distributed, it is necessary for + GDB to use the reverse-engineered version that follows. + Work was done by Cygnus to reverse-engineer the C subset of symtab.h. + The WDB project has extended this to also contain the C++ + symbol definitions, the F90 symbol definitions, + and the DOC (debugging-optimized-code) symbol definitions. + In some cases (the C++ symbol definitions) + I have added internal documentation here that + goes beyond what is supplied in HP's symtab.h. If we someday + unify these files again, the extra comments should be merged back + into HP's symtab.h. + + ------------------------------------------------------------------- + + Debug symbols are contained entirely within an unloadable space called + $DEBUG$. $DEBUG$ contains several subspaces which group related + debug symbols. + + $GNTT$ contains information for global variables, types and contants. + + $LNTT$ contains information for procedures (including nesting), scoping + information, local variables, types, and constants. + + $SLT$ contains source line information so that code addresses may be + mapped to source lines. + + $VT$ contains various strings and constants for named objects (variables, + typedefs, functions, etc). Strings are stored as null-terminated character + lists. Constants always begin on word boundaries. The first byte of + the VT must be zero (a null string). + + $XT$ is not currently used by GDB. + + Many structures within the subspaces point to other structures within + the same subspace, or to structures within a different subspace. These + pointers are represented as a structure index from the beginning of + the appropriate subspace. */ + +/* Used to describe where a constant is stored. */ +enum location_type +{ + LOCATION_IMMEDIATE, + LOCATION_PTR, + LOCATION_VT, +}; + +/* Languages supported by this debug format. Within the data structures + this type is limited to 4 bits for a maximum of 16 languages. */ +enum hp_language +{ + HP_LANGUAGE_UNKNOWN, + HP_LANGUAGE_C, + HP_LANGUAGE_FORTRAN, + HP_LANGUAGE_F77 = HP_LANGUAGE_FORTRAN, + HP_LANGUAGE_PASCAL, + HP_LANGUAGE_MODCAL, + HP_LANGUAGE_COBOL, + HP_LANGUAGE_BASIC, + HP_LANGUAGE_ADA, + HP_LANGUAGE_CPLUSPLUS, + HP_LANGUAGE_DMPASCAL +}; + + +/* Basic data types available in this debug format. Within the data + structures this type is limited to 5 bits for a maximum of 32 basic + data types. */ +enum hp_type +{ + HP_TYPE_UNDEFINED, /* 0 */ + HP_TYPE_BOOLEAN, /* 1 */ + HP_TYPE_CHAR, /* 2 */ + HP_TYPE_INT, /* 3 */ + HP_TYPE_UNSIGNED_INT, /* 4 */ + HP_TYPE_REAL, /* 5 */ + HP_TYPE_COMPLEX, /* 6 */ + HP_TYPE_STRING200, /* 7 */ + HP_TYPE_LONGSTRING200, /* 8 */ + HP_TYPE_TEXT, /* 9 */ + HP_TYPE_FLABEL, /* 10 */ + HP_TYPE_FTN_STRING_SPEC, /* 11 */ + HP_TYPE_MOD_STRING_SPEC, /* 12 */ + HP_TYPE_PACKED_DECIMAL, /* 13 */ + HP_TYPE_REAL_3000, /* 14 */ + HP_TYPE_MOD_STRING_3000, /* 15 */ + HP_TYPE_ANYPOINTER, /* 16 */ + HP_TYPE_GLOBAL_ANYPOINTER, /* 17 */ + HP_TYPE_LOCAL_ANYPOINTER, /* 18 */ + HP_TYPE_COMPLEXS3000, /* 19 */ + HP_TYPE_FTN_STRING_S300_COMPAT, /* 20 */ + HP_TYPE_FTN_STRING_VAX_COMPAT, /* 21 */ + HP_TYPE_BOOLEAN_S300_COMPAT, /* 22 */ + HP_TYPE_BOOLEAN_VAX_COMPAT, /* 23 */ + HP_TYPE_WIDE_CHAR, /* 24 */ + HP_TYPE_LONG, /* 25 */ + HP_TYPE_UNSIGNED_LONG, /* 26 */ + HP_TYPE_DOUBLE, /* 27 */ + HP_TYPE_TEMPLATE_ARG, /* 28 */ + HP_TYPE_VOID /* 29 */ +}; + +/* An immediate name and type table entry. + + extension and immediate will always be one. + global will always be zero. + hp_type is the basic type this entry describes. + bitlength is the length in bits for the basic type. */ +struct dnttp_immediate +{ + unsigned int extension: 1; + unsigned int immediate: 1; + unsigned int global: 1; + unsigned int type: 5; + unsigned int bitlength: 24; +}; + +/* A nonimmediate name and type table entry. + + extension will always be one. + immediate will always be zero. + if global is zero, this entry points into the LNTT + if global is one, this entry points into the GNTT + index is the index within the GNTT or LNTT for this entry. */ +struct dnttp_nonimmediate +{ + unsigned int extension: 1; + unsigned int immediate: 1; + unsigned int global: 1; + unsigned int index: 29; +}; + +/* A pointer to an entry in the GNTT and LNTT tables. It has two + forms depending on the type being described. + + The immediate form is used for simple entries and is one + word. + + The nonimmediate form is used for complex entries and contains + an index into the LNTT or GNTT which describes the entire type. + + If a dnttpointer is -1, then it is a NIL entry. */ + +#define DNTTNIL (-1) +typedef union dnttpointer +{ + struct dnttp_immediate dntti; + struct dnttp_nonimmediate dnttp; + int word; +} dnttpointer; + +/* An index into the source line table. As with dnttpointers, a sltpointer + of -1 indicates a NIL entry. */ +#define SLTNIL (-1) +typedef int sltpointer; + +/* Index into DOC (= "Debugging Optimized Code") line table. */ +#define LTNIL (-1) +typedef int ltpointer; + +/* Index into context table. */ +#define CTXTNIL (-1) +typedef int ctxtpointer; + +/* Unsigned byte offset into the VT. */ +typedef unsigned int vtpointer; + +/* A DNTT entry (used within the GNTT and LNTT). + + DNTT entries are variable sized objects, but are always a multiple + of 3 words (we call each group of 3 words a "block"). + + The first bit in each block is an extension bit. This bit is zero + for the first block of a DNTT entry. If the entry requires more + than one block, then this bit is set to one in all blocks after + the first one. */ + +/* Each DNTT entry describes a particular debug symbol (beginning of + a source file, a function, variables, structures, etc. + + The type of the DNTT entry is stored in the "kind" field within the + DNTT entry itself. */ + +enum dntt_entry_type +{ + DNTT_TYPE_NIL = -1, + DNTT_TYPE_SRCFILE, + DNTT_TYPE_MODULE, + DNTT_TYPE_FUNCTION, + DNTT_TYPE_ENTRY, + DNTT_TYPE_BEGIN, + DNTT_TYPE_END, + DNTT_TYPE_IMPORT, + DNTT_TYPE_LABEL, + DNTT_TYPE_FPARAM, + DNTT_TYPE_SVAR, + DNTT_TYPE_DVAR, + DNTT_TYPE_HOLE1, + DNTT_TYPE_CONST, + DNTT_TYPE_TYPEDEF, + DNTT_TYPE_TAGDEF, + DNTT_TYPE_POINTER, + DNTT_TYPE_ENUM, + DNTT_TYPE_MEMENUM, + DNTT_TYPE_SET, + DNTT_TYPE_SUBRANGE, + DNTT_TYPE_ARRAY, + DNTT_TYPE_STRUCT, + DNTT_TYPE_UNION, + DNTT_TYPE_FIELD, + DNTT_TYPE_VARIANT, + DNTT_TYPE_FILE, + DNTT_TYPE_FUNCTYPE, + DNTT_TYPE_WITH, + DNTT_TYPE_COMMON, + DNTT_TYPE_COBSTRUCT, + DNTT_TYPE_XREF, + DNTT_TYPE_SA, + DNTT_TYPE_MACRO, + DNTT_TYPE_BLOCKDATA, + DNTT_TYPE_CLASS_SCOPE, + DNTT_TYPE_REFERENCE, + DNTT_TYPE_PTRMEM, + DNTT_TYPE_PTRMEMFUNC, + DNTT_TYPE_CLASS, + DNTT_TYPE_GENFIELD, + DNTT_TYPE_VFUNC, + DNTT_TYPE_MEMACCESS, + DNTT_TYPE_INHERITANCE, + DNTT_TYPE_FRIEND_CLASS, + DNTT_TYPE_FRIEND_FUNC, + DNTT_TYPE_MODIFIER, + DNTT_TYPE_OBJECT_ID, + DNTT_TYPE_MEMFUNC, + DNTT_TYPE_TEMPLATE, + DNTT_TYPE_TEMPLATE_ARG, + DNTT_TYPE_FUNC_TEMPLATE, + DNTT_TYPE_LINK, + DNTT_TYPE_DYN_ARRAY_DESC, + DNTT_TYPE_DESC_SUBRANGE, + DNTT_TYPE_BEGIN_EXT, + DNTT_TYPE_INLN, + DNTT_TYPE_INLN_LIST, + DNTT_TYPE_ALIAS, + DNTT_TYPE_DOC_FUNCTION, + DNTT_TYPE_DOC_MEMFUNC, + DNTT_TYPE_MAX +}; + +/* DNTT_TYPE_SRCFILE: + + One DNTT_TYPE_SRCFILE symbol is output for the start of each source + file and at the begin and end of an included file. A DNTT_TYPE_SRCFILE + entry is also output before each DNTT_TYPE_FUNC symbol so that debuggers + can determine what file a function was defined in. + + LANGUAGE describes the source file's language. + + NAME points to an VT entry providing the source file's name. + + Note the name used for DNTT_TYPE_SRCFILE entries are exactly as seen + by the compiler (ie they may be relative or absolute). C include files + via <> inclusion must use absolute paths. + + ADDRESS points to an SLT entry from which line number and code locations + may be determined. */ + +struct dntt_type_srcfile +{ + unsigned int extension: 1; + unsigned int kind: 10; /* DNTT_TYPE_SRCFILE */ + unsigned int language: 4; + unsigned int unused: 17; + vtpointer name; + sltpointer address; +}; + +/* DNTT_TYPE_MODULE: + + A DNTT_TYPE_MODULE symbol is emitted for the start of a pascal + module or C source file. A module indicates a compilation unit + for name-scoping purposes; in that regard there should be + a 1-1 correspondence between GDB "symtab"'s and MODULE symbol records. + + Each DNTT_TYPE_MODULE must have an associated DNTT_TYPE_END symbol. + + NAME points to a VT entry providing the module's name. Note C + source files are considered nameless modules. + + ALIAS point to a VT entry providing a secondary name. + + ADDRESS points to an SLT entry from which line number and code locations + may be determined. */ + +struct dntt_type_module +{ + unsigned int extension: 1; + unsigned int kind: 10; /* DNTT_TYPE_MODULE */ + unsigned int unused: 21; + vtpointer name; + vtpointer alias; + dnttpointer unused2; + sltpointer address; +}; + +/* DNTT_TYPE_FUNCTION, + DNTT_TYPE_ENTRY, + DNTT_TYPE_BLOCKDATA, + DNTT_TYPE_MEMFUNC: + + A DNTT_TYPE_FUNCTION symbol is emitted for each function definition; + a DNTT_TYPE_ENTRY symbols is used for secondary entry points. Both + symbols used the dntt_type_function structure. + A DNTT_TYPE_BLOCKDATA symbol is emitted ...? + A DNTT_TYPE_MEMFUNC symbol is emitted for inlined member functions (C++). + + Each of DNTT_TYPE_FUNCTION must have a matching DNTT_TYPE_END. + + GLOBAL is nonzero if the function has global scope. + + LANGUAGE describes the function's source language. + + OPT_LEVEL describes the optimization level the function was compiled + with. + + VARARGS is nonzero if the function uses varargs. + + NAME points to a VT entry providing the function's name. + + ALIAS points to a VT entry providing a secondary name for the function. + + FIRSTPARAM points to a LNTT entry which describes the parameter list. + + ADDRESS points to an SLT entry from which line number and code locations + may be determined. + + ENTRYADDR is the memory address corresponding the function's entry point + + RETVAL points to a LNTT entry describing the function's return value. + + LOWADDR is the lowest memory address associated with this function. + + HIADDR is the highest memory address associated with this function. */ + +struct dntt_type_function +{ + unsigned int extension: 1; + unsigned int kind: 10; /* DNTT_TYPE_FUNCTION, + DNTT_TYPE_ENTRY, + DNTT_TYPE_BLOCKDATA + or DNTT_TYPE_MEMFUNC */ + unsigned int global: 1; + unsigned int language: 4; + unsigned int nest_level: 5; + unsigned int opt_level: 2; + unsigned int varargs: 1; + unsigned int lang_info: 4; + unsigned int inlined: 1; + unsigned int localalloc: 1; + unsigned int expansion: 1; + unsigned int unused: 1; + vtpointer name; + vtpointer alias; + dnttpointer firstparam; + sltpointer address; + CORE_ADDR entryaddr; + dnttpointer retval; + CORE_ADDR lowaddr; + CORE_ADDR hiaddr; +}; + +/* DNTT_TYPE_BEGIN: + + A DNTT_TYPE_BEGIN symbol is emitted to begin a new nested scope. + Every DNTT_TYPE_BEGIN symbol must have a matching DNTT_TYPE_END symbol. + + CLASSFLAG is nonzero if this is the beginning of a c++ class definition. + + ADDRESS points to an SLT entry from which line number and code locations + may be determined. */ + +struct dntt_type_begin +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int classflag: 1; + unsigned int unused: 20; + sltpointer address; +}; + +/* DNTT_TYPE_END: + + A DNTT_TYPE_END symbol is emitted when closing a scope started by + a DNTT_TYPE_MODULE, DNTT_TYPE_FUNCTION, DNTT_TYPE_WITH, + DNTT_TYPE_COMMON, DNTT_TYPE_BEGIN, and DNTT_TYPE_CLASS_SCOPE symbols. + + ENDKIND describes what type of scope the DNTT_TYPE_END is closing + (one of the above 6 kinds). + + CLASSFLAG is nonzero if this is the end of a c++ class definition. + + ADDRESS points to an SLT entry from which line number and code locations + may be determined. + + BEGINSCOPE points to the LNTT entry which opened the scope. */ + +struct dntt_type_end +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int endkind: 10; + unsigned int classflag: 1; + unsigned int unused: 10; + sltpointer address; + dnttpointer beginscope; +}; + +/* DNTT_TYPE_IMPORT is unused by GDB. */ +/* DNTT_TYPE_LABEL is unused by GDB. */ + +/* DNTT_TYPE_FPARAM: + + A DNTT_TYPE_FPARAM symbol is emitted for a function argument. When + chained together the symbols represent an argument list for a function. + + REGPARAM is nonzero if this parameter was passed in a register. + + INDIRECT is nonzero if this parameter is a pointer to the parameter + (pass by reference or pass by value for large items). + + LONGADDR is nonzero if the parameter is a 64bit pointer. + + NAME is a pointer into the VT for the parameter's name. + + LOCATION describes where the parameter is stored. Depending on the + parameter type LOCATION could be a register number, or an offset + from the stack pointer. + + TYPE points to a NTT entry describing the type of this parameter. + + NEXTPARAM points to the LNTT entry describing the next parameter. */ + +struct dntt_type_fparam +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int regparam: 1; + unsigned int indirect: 1; + unsigned int longaddr: 1; + unsigned int copyparam: 1; + unsigned int dflt: 1; + unsigned int doc_ranges: 1; + unsigned int misc_kind: 1; + unsigned int unused: 14; + vtpointer name; + CORE_ADDR location; + dnttpointer type; + dnttpointer nextparam; + int misc; +}; + +/* DNTT_TYPE_SVAR: + + A DNTT_TYPE_SVAR is emitted to describe a variable in static storage. + + GLOBAL is nonzero if the variable has global scope. + + INDIRECT is nonzero if the variable is a pointer to an object. + + LONGADDR is nonzero if the variable is in long pointer space. + + STATICMEM is nonzero if the variable is a member of a class. + + A_UNION is nonzero if the variable is an anonymous union member. + + NAME is a pointer into the VT for the variable's name. + + LOCATION provides the memory address for the variable. + + TYPE is a pointer into either the GNTT or LNTT which describes + the type of this variable. */ + +struct dntt_type_svar +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int global: 1; + unsigned int indirect: 1; + unsigned int longaddr: 1; + unsigned int staticmem: 1; + unsigned int a_union: 1; + unsigned int unused1: 1; + unsigned int thread_specific: 1; + unsigned int unused2: 14; + vtpointer name; + CORE_ADDR location; + dnttpointer type; + unsigned int offset; + unsigned int displacement; +}; + +/* DNTT_TYPE_DVAR: + + A DNTT_TYPE_DVAR is emitted to describe automatic variables and variables + held in registers. + + GLOBAL is nonzero if the variable has global scope. + + INDIRECT is nonzero if the variable is a pointer to an object. + + REGVAR is nonzero if the variable is in a register. + + A_UNION is nonzero if the variable is an anonymous union member. + + NAME is a pointer into the VT for the variable's name. + + LOCATION provides the memory address or register number for the variable. + + TYPE is a pointer into either the GNTT or LNTT which describes + the type of this variable. */ + +struct dntt_type_dvar +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int global: 1; + unsigned int indirect: 1; + unsigned int regvar: 1; + unsigned int a_union: 1; + unsigned int unused: 17; + vtpointer name; + int location; + dnttpointer type; + unsigned int offset; +}; + +/* DNTT_TYPE_CONST: + + A DNTT_TYPE_CONST symbol is emitted for program constants. + + GLOBAL is nonzero if the constant has global scope. + + INDIRECT is nonzero if the constant is a pointer to an object. + + LOCATION_TYPE describes where to find the constant's value + (in the VT, memory, or embedded in an instruction). + + CLASSMEM is nonzero if the constant is a member of a class. + + NAME is a pointer into the VT for the constant's name. + + LOCATION provides the memory address, register number or pointer + into the VT for the constant's value. + + TYPE is a pointer into either the GNTT or LNTT which describes + the type of this variable. */ + +struct dntt_type_const +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int global: 1; + unsigned int indirect: 1; + unsigned int location_type: 3; + unsigned int classmem: 1; + unsigned int unused: 15; + vtpointer name; + CORE_ADDR location; + dnttpointer type; + unsigned int offset; + unsigned int displacement; +}; + +/* DNTT_TYPE_TYPEDEF and DNTT_TYPE_TAGDEF: + + The same structure is used to describe typedefs and tagdefs. + + DNTT_TYPE_TYPEDEFS are associated with C "typedefs". + + DNTT_TYPE_TAGDEFs are associated with C "struct", "union", and "enum" + tags, which may have the same name as a typedef in the same scope. + Also they are associated with C++ "class" tags, which implicitly have + the same name as the class type. + + GLOBAL is nonzero if the typedef/tagdef has global scope. + + TYPEINFO is used to determine if full type information is available + for a tag. (usually 1, but can be zero for opaque types in C). + + NAME is a pointer into the VT for the constant's name. + + TYPE points to the underlying type for the typedef/tagdef in the + GNTT or LNTT. */ + +struct dntt_type_type +{ + unsigned int extension: 1; + unsigned int kind: 10; /* DNTT_TYPE_TYPEDEF or + DNTT_TYPE_TAGDEF. */ + unsigned int global: 1; + unsigned int typeinfo: 1; + unsigned int unused: 19; + vtpointer name; + dnttpointer type; /* Underlying type, which for TAGDEF's may be + DNTT_TYPE_STRUCT, DNTT_TYPE_UNION, + DNTT_TYPE_ENUM, or DNTT_TYPE_CLASS. + For TYPEDEF's other underlying types + are also possible. */ +}; + +/* DNTT_TYPE_POINTER: + + Used to describe a pointer to an underlying type. + + POINTSTO is a pointer into the GNTT or LNTT for the type which this + pointer points to. + + BITLENGTH is the length of the pointer (not the underlying type). */ + +struct dntt_type_pointer +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int unused: 21; + dnttpointer pointsto; + unsigned int bitlength; +}; + + +/* DNTT_TYPE_ENUM: + + Used to describe enumerated types. + + FIRSTMEM is a pointer to a DNTT_TYPE_MEMENUM in the GNTT/LNTT which + describes the first member (and contains a pointer to the chain of + members). + + BITLENGTH is the number of bits used to hold the values of the enum's + members. */ + +struct dntt_type_enum +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int unused: 21; + dnttpointer firstmem; + unsigned int bitlength; +}; + +/* DNTT_TYPE_MEMENUM + + Used to describe members of an enumerated type. + + CLASSMEM is nonzero if this member is part of a class. + + NAME points into the VT for the name of this member. + + VALUE is the value of this enumeration member. + + NEXTMEM points to the next DNTT_TYPE_MEMENUM in the chain. */ + +struct dntt_type_memenum +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int classmem: 1; + unsigned int unused: 20; + vtpointer name; + unsigned int value; + dnttpointer nextmem; +}; + +/* DNTT_TYPE_SET + + Used to describe PASCAL "set" type. + + DECLARATION describes the bitpacking of the set. + + SUBTYPE points to a DNTT entry describing the type of the members. + + BITLENGTH is the size of the set. */ + +struct dntt_type_set +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int declaration: 2; + unsigned int unused: 19; + dnttpointer subtype; + unsigned int bitlength; +}; + +/* DNTT_TYPE_SUBRANGE + + Used to describe subrange type. + + DYN_LOW describes the lower bound of the subrange: + + 00 for a constant lower bound (found in LOWBOUND). + + 01 for a dynamic lower bound with the lower bound found in the + memory address pointed to by LOWBOUND. + + 10 for a dynamic lower bound described by an variable found in the + DNTT/LNTT (LOWBOUND would be a pointer into the DNTT/LNTT). + + DYN_HIGH is similar to DYN_LOW, except it describes the upper bound. + + SUBTYPE points to the type of the subrange. + + BITLENGTH is the length in bits needed to describe the subrange's + values. */ + +struct dntt_type_subrange +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int dyn_low: 2; + unsigned int dyn_high: 2; + unsigned int unused: 17; + int lowbound; + int highbound; + dnttpointer subtype; + unsigned int bitlength; +}; + +/* DNTT_TYPE_ARRAY + + Used to describe an array type. + + DECLARATION describes the bit packing used in the array. + + ARRAYISBYTES is nonzero if the field in arraylength describes the + length in bytes rather than in bits. A value of zero is used to + describe an array with size 2**32. + + ELEMISBYTES is nonzero if the length if each element in the array + is describes in bytes rather than bits. A value of zero is used + to an element with size 2**32. + + ELEMORDER is nonzero if the elements are indexed in increasing order. + + JUSTIFIED if the elements are left justified to index zero. + + ARRAYLENGTH is the length of the array. + + INDEXTYPE is a DNTT pointer to the type used to index the array. + + ELEMTYPE is a DNTT pointer to the type for the array elements. + + ELEMLENGTH is the length of each element in the array (including + any padding). + + Multi-dimensional arrays are represented by ELEMTYPE pointing to + another DNTT_TYPE_ARRAY. */ + +struct dntt_type_array +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int declaration: 2; + unsigned int dyn_low: 2; + unsigned int dyn_high: 2; + unsigned int arrayisbytes: 1; + unsigned int elemisbytes: 1; + unsigned int elemorder: 1; + unsigned int justified: 1; + unsigned int unused: 11; + unsigned int arraylength; + dnttpointer indextype; + dnttpointer elemtype; + unsigned int elemlength; +}; + +/* DNTT_TYPE_STRUCT + + DNTT_TYPE_STRUCT is used to describe a C structure. + + DECLARATION describes the bitpacking used. + + FIRSTFIELD is a DNTT pointer to the first field of the structure + (each field contains a pointer to the next field, walk the list + to access all fields of the structure). + + VARTAGFIELD and VARLIST are used for Pascal variant records. + + BITLENGTH is the size of the structure in bits. */ + +struct dntt_type_struct +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int declaration: 2; + unsigned int unused: 19; + dnttpointer firstfield; + dnttpointer vartagfield; + dnttpointer varlist; + unsigned int bitlength; +}; + +/* DNTT_TYPE_UNION + + DNTT_TYPE_UNION is used to describe a C union. + + FIRSTFIELD is a DNTT pointer to the beginning of the field chain. + + BITLENGTH is the size of the union in bits. */ + +struct dntt_type_union +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int unused: 21; + dnttpointer firstfield; + unsigned int bitlength; +}; + +/* DNTT_TYPE_FIELD + + DNTT_TYPE_FIELD describes one field in a structure or union + or C++ class. + + VISIBILITY is used to describe the visibility of the field + (for c++. public = 0, protected = 1, private = 2). + + A_UNION is nonzero if this field is a member of an anonymous union. + + STATICMEM is nonzero if this field is a static member of a template. + + NAME is a pointer into the VT for the name of the field. + + BITOFFSET gives the offset of this field in bits from the beginning + of the structure or union this field is a member of. + + TYPE is a DNTT pointer to the type describing this field. + + BITLENGTH is the size of the entry in bits. + + NEXTFIELD is a DNTT pointer to the next field in the chain. */ + +struct dntt_type_field +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int visibility: 2; + unsigned int a_union: 1; + unsigned int staticmem: 1; + unsigned int unused: 17; + vtpointer name; + unsigned int bitoffset; + dnttpointer type; + unsigned int bitlength; + dnttpointer nextfield; +}; + +/* DNTT_TYPE_VARIANT is unused by GDB. */ +/* DNTT_TYPE_FILE is unused by GDB. */ + +/* DNTT_TYPE_FUNCTYPE + + I think this is used to describe a function type (e.g., would + be emitted as part of a function-pointer description). + + VARARGS is nonzero if this function uses varargs. + + FIRSTPARAM is a DNTT pointer to the first entry in the parameter + chain. + + RETVAL is a DNTT pointer to the type of the return value. */ + +struct dntt_type_functype +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int varargs: 1; + unsigned int info: 4; + unsigned int unused: 16; + unsigned int bitlength; + dnttpointer firstparam; + dnttpointer retval; +}; + +/* DNTT_TYPE_WITH is emitted by C++ to indicate "with" scoping semantics. + (Probably also emitted by PASCAL to support "with"...). + + C++ example: Say "memfunc" is a method of class "c", and say + "m" is a data member of class "c". Then from within "memfunc", + it is legal to reference "m" directly (e.g. you don't have to + say "this->m". The symbol table indicates + this by emitting a DNTT_TYPE_WITH symbol within the function "memfunc", + pointing to the type symbol for class "c". + + In GDB, this symbol record is unnecessary, + because GDB's symbol lookup algorithm + infers the "with" semantics when it sees a "this" argument to the member + function. So GDB can safely ignore the DNTT_TYPE_WITH record. + + A DNTT_TYPE_WITH has a matching DNTT_TYPE_END symbol. */ + +struct dntt_type_with +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_WITH */ + unsigned int addrtype: 2; /* 0 => STATTYPE */ + /* 1 => DYNTYPE */ + /* 2 => REGTYPE */ + unsigned int indirect: 1; /* 1 => pointer to object */ + unsigned int longaddr: 1; /* 1 => in long pointer space */ + unsigned int nestlevel: 6; /* # of nesting levels back */ + unsigned int doc_ranges: 1; /* 1 => location is range list */ + unsigned int unused: 10; + long location; /* where stored (allocated) */ + sltpointer address; + dnttpointer type; /* type of with expression */ + vtpointer name; /* name of with expression */ + unsigned long offset; /* byte offset from location */ +}; + +/* DNTT_TYPE_COMMON is unsupported by GDB. */ +/* A DNTT_TYPE_COMMON symbol must have a matching DNTT_TYPE_END symbol */ + +/* DNTT_TYPE_COBSTRUCT is unsupported by GDB. */ +/* DNTT_TYPE_XREF is unsupported by GDB. */ +/* DNTT_TYPE_SA is unsupported by GDB. */ +/* DNTT_TYPE_MACRO is unsupported by GDB */ + +/* DNTT_TYPE_BLOCKDATA has the same structure as DNTT_TYPE_FUNCTION */ + +/* The following are the C++ specific SOM records */ + +/* The purpose of the DNTT_TYPE_CLASS_SCOPE is to bracket C++ methods + and indicate the method name belongs in the "class scope" rather + than in the module they are being defined in. For example: + + class c { + ... + void memfunc(); // member function + }; + + void c::memfunc() // definition of class c's "memfunc" + { + ... + } + + main() + { + ... + } + + In the above, the name "memfunc" is not directly visible from "main". + I.e., you have to say "break c::memfunc". + If it were a normal function (not a method), it would be visible + via the simple "break memfunc". Since "memfunc" otherwise looks + like a normal FUNCTION in the symbol table, the bracketing + CLASS_SCOPE is what is used to indicate it is really a method. + + + A DNTT_TYPE_CLASS_SCOPE symbol must have a matching DNTT_TYPE_END symbol. */ + +struct dntt_type_class_scope +{ + unsigned int extension: 1; /* Always zero. */ + unsigned int kind: 10; /* Always DNTT_TYPE_CLASS_SCOPE. */ + unsigned int unused: 21; + sltpointer address ; /* Pointer to SLT entry. */ + dnttpointer type ; /* Pointer to class type DNTT. */ +}; + +/* C++ reference parameter. + The structure of this record is the same as DNTT_TYPE_POINTER - + refer to struct dntt_type_pointer. */ + +/* The next two describe C++ pointer-to-data-member type, and + pointer-to-member-function type, respectively. + DNTT_TYPE_PTRMEM and DNTT_TYPE_PTRMEMFUNC have the same structure. */ + +struct dntt_type_ptrmem +{ + unsigned int extension: 1; /* Always zero. */ + unsigned int kind: 10; /* Always DNTT_TYPE_PTRMEM. */ + unsigned int unused: 21; + dnttpointer pointsto ; /* Pointer to class DNTT. */ + dnttpointer memtype ; /* Type of member. */ +}; + +struct dntt_type_ptrmemfunc +{ + unsigned int extension: 1; /* Always zero. */ + unsigned int kind: 10; /* Always DNTT_TYPE_PTRMEMFUNC. */ + unsigned int unused: 21; + dnttpointer pointsto ; /* Pointer to class DNTT. */ + dnttpointer memtype ; /* Type of member. */ +}; + +/* The DNTT_TYPE_CLASS symbol is emitted to describe a class type. + "memberlist" points to a chained list of FIELD or GENFIELD records + indicating the class members. "parentlist" points to a chained list + of INHERITANCE records indicating classes from which we inherit + fields. */ + +struct dntt_type_class +{ + unsigned int extension: 1; /* Always zero. */ + unsigned int kind: 10; /* Always DNTT_TYPE_CLASS. */ + unsigned int abstract: 1; /* Is this an abstract class? */ + unsigned int class_decl: 2; /* 0=class,1=union,2=struct. */ + unsigned int expansion: 1; /* 1=template expansion. */ + unsigned int unused: 17; + dnttpointer memberlist ; /* Ptr to chain of [GEN]FIELDs. */ + unsigned long vtbl_loc ; /* Offset in obj of ptr to vtbl. */ + dnttpointer parentlist ; /* Ptr to K_INHERITANCE list. */ + unsigned long bitlength ; /* Total at this level. */ + dnttpointer identlist ; /* Ptr to chain of class ident's. */ + dnttpointer friendlist ; /* Ptr to K_FRIEND list. */ + dnttpointer templateptr ; /* Ptr to template. */ + dnttpointer nextexp ; /* Ptr to next expansion. */ +}; + +/* Class members are indicated via either the FIELD record (for + data members, same as for C struct fields), or by the GENFIELD record + (for member functions). */ + +struct dntt_type_genfield +{ + unsigned int extension: 1; /* Always zero. */ + unsigned int kind: 10; /* Always DNTT_TYPE_GENFIELD. */ + unsigned int visibility: 2; /* Pub = 0, prot = 1, priv = 2. */ + unsigned int a_union: 1; /* 1 => anonymous union member. */ + unsigned int unused: 18; + dnttpointer field ; /* Pointer to field or qualifier. */ + dnttpointer nextfield ; /* Pointer to next field. */ +}; + +/* C++ virtual functions. */ + +struct dntt_type_vfunc +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_VFUNC */ + unsigned int pure: 1; /* pure virtual function ? */ + unsigned int unused: 20; + dnttpointer funcptr ; /* points to FUNCTION symbol */ + unsigned long vtbl_offset ; /* offset into vtbl for virtual */ +}; + +/* Not precisely sure what this is intended for - DDE ignores it. */ + +struct dntt_type_memaccess +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_MEMACCESS */ + unsigned int unused: 21; + dnttpointer classptr ; /* pointer to base class */ + dnttpointer field ; /* pointer field */ +}; + +/* The DNTT_TYPE_INHERITANCE record describes derived classes. + In particular, the "parentlist" field of the CLASS record points + to a list of INHERITANCE records for classes from which we + inherit members. */ + +struct dntt_type_inheritance +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_INHERITANCE */ + unsigned int Virtual: 1; /* virtual base class ? */ + unsigned int visibility: 2; /* pub = 0, prot = 1, priv = 2 */ + unsigned int unused: 18; + dnttpointer classname ; /* first parent class, if any */ + unsigned long offset ; /* offset to start of base class */ + dnttpointer next ; /* pointer to next K_INHERITANCE */ + unsigned long future[2] ; /* padding to 3-word block end */ +}; + +/* C++ "friend" classes ... */ + +struct dntt_type_friend_class +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_FRIEND_CLASS */ + unsigned int unused: 21; + dnttpointer classptr ; /* pointer to class DNTT */ + dnttpointer next ; /* next DNTT_FRIEND */ +}; + +struct dntt_type_friend_func +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_FRIEND_FUNC */ + unsigned int unused: 21; + dnttpointer funcptr ; /* pointer to function */ + dnttpointer classptr ; /* pointer to class DNTT */ + dnttpointer next ; /* next DNTT_FRIEND */ + unsigned long future[2] ; /* padding to 3-word block end */ +}; + +/* DDE appears to ignore the DNTT_TYPE_MODIFIER record. + It could perhaps be used to give better "ptype" output in GDB; + otherwise it is probably safe for GDB to ignore it also. */ + +struct dntt_type_modifier +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_MODIFIER */ + unsigned int m_const: 1; /* const */ + unsigned int m_static: 1; /* static */ + unsigned int m_void: 1; /* void */ + unsigned int m_volatile: 1; /* volatile */ + unsigned int m_duplicate: 1; /* duplicate */ + unsigned int unused: 16; + dnttpointer type ; /* subtype */ + unsigned long future ; /* padding to 3-word block end */ +}; + +/* I'm not sure what this was intended for - DDE ignores it. */ + +struct dntt_type_object_id +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_OBJECT_ID */ + unsigned int indirect: 1; /* Is object_ident addr of addr? */ + unsigned int unused: 20; + unsigned long object_ident ; /* object identifier */ + unsigned long offset ; /* offset to start of base class */ + dnttpointer next ; /* pointer to next K_OBJECT_ID */ + unsigned long segoffset ; /* for linker fixup */ + unsigned long future ; /* padding to 3-word block end */ +}; + +/* No separate dntt_type_memfunc; same as dntt_type_func */ + +/* Symbol records to support templates. These only get used + in DDE's "describe" output (like GDB's "ptype"). */ + +/* The TEMPLATE record is the header for a template-class. + Like the CLASS record, a TEMPLATE record has a memberlist that + points to a list of template members. It also has an arglist + pointing to a list of TEMPLATE_ARG records. */ + +struct dntt_type_template +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_TEMPLATE */ + unsigned int abstract: 1; /* is this an abstract class? */ + unsigned int class_decl: 2; /* 0=class,1=union,2=struct */ + unsigned int unused: 18; + dnttpointer memberlist ; /* ptr to chain of K_[GEN]FIELDs */ + long unused2 ; /* offset in obj of ptr to vtbl */ + dnttpointer parentlist ; /* ptr to K_INHERITANCE list */ + unsigned long bitlength ; /* total at this level */ + dnttpointer identlist ; /* ptr to chain of class ident's */ + dnttpointer friendlist ; /* ptr to K_FRIEND list */ + dnttpointer arglist ; /* ptr to argument list */ + dnttpointer expansions ; /* ptr to expansion list */ +}; + +/* Template-class arguments are a list of TEMPL_ARG records + chained together. The "name" field is the name of the formal. + E.g.: + + template class q { ... }; + + Then "T" is the name of the formal argument. */ + +struct dntt_type_templ_arg +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_TEMPL_ARG */ + unsigned int usagetype: 1; /* 0 type-name 1 expression */ + unsigned int unused: 20; + vtpointer name ; /* name of argument */ + dnttpointer type ; /* for non type arguments */ + dnttpointer nextarg ; /* Next argument if any */ + long future[2] ; /* padding to 3-word block end */ +}; + +/* FUNC_TEMPLATE records are sort of like FUNCTION, but are emitted + for template member functions. E.g., + + template class q + { + ... + void f(); + ... + }; + + Within the list of FIELDs/GENFIELDs defining the member list + of the template "q", "f" would appear as a FUNC_TEMPLATE. + We'll also see instances of FUNCTION "f" records for each + instantiation of the template. */ + +struct dntt_type_func_template +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_FUNC_TEMPLATE */ + unsigned int public: 1; /* 1 => globally visible */ + unsigned int language: 4; /* type of language */ + unsigned int level: 5; /* nesting level (top level = 0)*/ + unsigned int optimize: 2; /* level of optimization */ + unsigned int varargs: 1; /* ellipses. Pascal/800 later */ + unsigned int info: 4; /* lang-specific stuff; F_xxxx */ + unsigned int inlined: 1; + unsigned int localloc: 1; /* 0 at top, 1 at end of block */ + unsigned int unused: 2; + vtpointer name ; /* name of function */ + vtpointer alias ; /* alternate name, if any */ + dnttpointer firstparam ; /* first FPARAM, if any */ + dnttpointer retval ; /* return type, if any */ + dnttpointer arglist ; /* ptr to argument list */ +}; + +/* LINK is apparently intended to link together function template + definitions with their instantiations. However, it is not clear + why this would be needed, except to provide the information on + a "ptype" command. And as far as I can tell, aCC does not + generate this record. */ + +struct dntt_type_link +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* always DNTT_TYPE_LINK */ + unsigned int linkKind: 4; /* always LINK_UNKNOWN */ + unsigned int unused: 17; + long future1 ; /* expansion */ + dnttpointer ptr1 ; /* link from template */ + dnttpointer ptr2 ; /* to expansion */ + long future[2] ; /* padding to 3-word block end */ +}; + +/* end of C++ specific SOM's. */ + +/* DNTT_TYPE_DYN_ARRAY_DESC is unused by GDB */ +/* DNTT_TYPE_DESC_SUBRANGE is unused by GDB */ +/* DNTT_TYPE_BEGIN_EXT is unused by GDB */ +/* DNTT_TYPE_INLN is unused by GDB */ +/* DNTT_TYPE_INLN_LIST is unused by GDB */ +/* DNTT_TYPE_ALIAS is unused by GDB */ + +struct dntt_type_doc_function +{ + unsigned int extension: 1; /* always zero */ + unsigned int kind: 10; /* K_DOC_FUNCTION or */ + /* K_DOC_MEMFUNC */ + unsigned int global: 1; /* 1 => globally visible */ + unsigned int language: 4; /* type of language */ + unsigned int level: 5; /* nesting level (top level = 0)*/ + unsigned int optimize: 2; /* level of optimization */ + unsigned int varargs: 1; /* ellipses. Pascal/800 later */ + unsigned int info: 4; /* lang-specific stuff; F_xxxx */ + unsigned int inlined: 1; + unsigned int localloc: 1; /* 0 at top, 1 at end of block */ + unsigned int expansion: 1; /* 1 = function expansion */ + unsigned int doc_clone: 1; + vtpointer name; /* name of function */ + vtpointer alias; /* alternate name, if any */ + dnttpointer firstparam; /* first FPARAM, if any */ + sltpointer address; /* code and text locations */ + CORE_ADDR entryaddr; /* address of entry point */ + dnttpointer retval; /* return type, if any */ + CORE_ADDR lowaddr; /* lowest address of function */ + CORE_ADDR hiaddr; /* highest address of function */ + dnttpointer inline_list; /* pointer to first inline */ + ltpointer lt_offset; /* start of frag/cp line table */ + ctxtpointer ctxt_offset; /* start of context table for this routine */ +}; + +/* DNTT_TYPE_DOC_MEMFUNC is unused by GDB */ + +/* DNTT_TYPE_GENERIC and DNTT_TYPE_BLOCK are convience structures + so we can examine a DNTT entry in a generic fashion. */ +struct dntt_type_generic +{ + unsigned int word[9]; +}; + +struct dntt_type_block +{ + unsigned int extension: 1; + unsigned int kind: 10; + unsigned int unused: 21; + unsigned int word[2]; +}; + +/* One entry in a DNTT (either the LNTT or GNTT). + This is a union of the above 60 or so structure definitions. */ + +union dnttentry +{ + struct dntt_type_srcfile dsfile; + struct dntt_type_module dmodule; + struct dntt_type_function dfunc; + struct dntt_type_function dentry; + struct dntt_type_begin dbegin; + struct dntt_type_end dend; + struct dntt_type_fparam dfparam; + struct dntt_type_svar dsvar; + struct dntt_type_dvar ddvar; + struct dntt_type_const dconst; + struct dntt_type_type dtype; + struct dntt_type_type dtag; + struct dntt_type_pointer dptr; + struct dntt_type_enum denum; + struct dntt_type_memenum dmember; + struct dntt_type_set dset; + struct dntt_type_subrange dsubr; + struct dntt_type_array darray; + struct dntt_type_struct dstruct; + struct dntt_type_union dunion; + struct dntt_type_field dfield; + struct dntt_type_functype dfunctype; + struct dntt_type_with dwith; + struct dntt_type_function dblockdata; + struct dntt_type_class_scope dclass_scope; + struct dntt_type_pointer dreference; + struct dntt_type_ptrmem dptrmem; + struct dntt_type_ptrmemfunc dptrmemfunc; + struct dntt_type_class dclass; + struct dntt_type_genfield dgenfield; + struct dntt_type_vfunc dvfunc; + struct dntt_type_memaccess dmemaccess; + struct dntt_type_inheritance dinheritance; + struct dntt_type_friend_class dfriend_class; + struct dntt_type_friend_func dfriend_func; + struct dntt_type_modifier dmodifier; + struct dntt_type_object_id dobject_id; + struct dntt_type_template dtemplate; + struct dntt_type_templ_arg dtempl_arg; + struct dntt_type_func_template dfunc_template; + struct dntt_type_link dlink; + struct dntt_type_doc_function ddocfunc; + struct dntt_type_generic dgeneric; + struct dntt_type_block dblock; +}; + +/* Source line entry types. */ +enum slttype +{ + SLT_NORMAL, + SLT_SRCFILE, + SLT_MODULE, + SLT_FUNCTION, + SLT_ENTRY, + SLT_BEGIN, + SLT_END, + SLT_WITH, + SLT_EXIT, + SLT_ASSIST, + SLT_MARKER, + SLT_CLASS_SCOPE, + SLT_INLN, + SLT_NORMAL_OFFSET, +}; + +/* A normal source line entry. Simply provides a mapping of a source + line number to a code address. + + SLTDESC will always be SLT_NORMAL or SLT_EXIT. */ + +struct slt_normal +{ + unsigned int sltdesc: 4; + unsigned int line: 28; + CORE_ADDR address; +}; + +struct slt_normal_off +{ + unsigned int sltdesc: 4; + unsigned int offset: 6; + unsigned int line: 22; + CORE_ADDR address; +}; + +/* A special source line entry. Provides a mapping of a declaration + to a line number. These entries point back into the DNTT which + references them. */ + +struct slt_special +{ + unsigned int sltdesc: 4; + unsigned int line: 28; + dnttpointer backptr; +}; + +/* Used to describe nesting. + + For nested languages, an slt_assist entry must follow each SLT_FUNC + entry in the SLT. The address field will point forward to the + first slt_normal entry within the function's scope. */ + +struct slt_assist +{ + unsigned int sltdesc: 4; + unsigned int unused: 28; + sltpointer address; +}; + +struct slt_generic +{ + unsigned int word[2]; +}; + +union sltentry +{ + struct slt_normal snorm; + struct slt_normal_off snormoff; + struct slt_special sspec; + struct slt_assist sasst; + struct slt_generic sgeneric; +}; + +/* $LINES$ declarations + This is the line table used for optimized code, which is only present + in the new $PROGRAM_INFO$ debug space. */ + +#define DST_LN_ESCAPE_FLAG1 15 +#define DST_LN_ESCAPE_FLAG2 14 +#define DST_LN_CTX_SPEC1 13 +#define DST_LN_CTX_SPEC2 12 + +/* Escape function codes: */ + +typedef enum +{ + dst_ln_pad, /* pad byte */ + dst_ln_escape_1, /* reserved */ + dst_ln_dpc1_dln1, /* 1 byte line delta, 1 byte pc delta */ + dst_ln_dpc2_dln2, /* 2 bytes line delta, 2 bytes pc delta */ + dst_ln_pc4_ln4, /* 4 bytes ABSOLUTE line number, 4 bytes ABSOLUTE pc */ + dst_ln_dpc0_dln1, /* 1 byte line delta, pc delta = 0 */ + dst_ln_ln_off_1, /* statement escape, stmt # = 1 (2nd stmt on line) */ + dst_ln_ln_off, /* statement escape, stmt # = next byte */ + dst_ln_entry, /* entry escape, next byte is entry number */ + dst_ln_exit, /* exit escape */ + dst_ln_stmt_end, /* gap escape, 4 bytes pc delta */ + dst_ln_stmt_cp, /* current stmt is a critical point */ + dst_ln_escape_12, /* reserved */ + dst_ln_escape_13, /* this is an exception site record */ + dst_ln_nxt_byte, /* next byte contains the real escape code */ + dst_ln_end, /* end escape, final entry follows */ + dst_ln_escape1_END_OF_ENUM +} +dst_ln_escape1_t; + +typedef enum +{ + dst_ln_ctx_1, /* next byte describes context switch with 5-bit */ + /* index into the image table and 3-bit run length. */ + /* If run length is 0, end with another cxt specifier or ctx_end */ + dst_ln_ctx_2, /* next 2 bytes switch context: 13 bit index, 3 bit run length */ + dst_ln_ctx_4, /* next 4 bytes switch context: 29 bit index, 3 bit run length */ + dst_ln_ctx_end, /* end current context */ + dst_ln_col_run_1, /* next byte is column position of start of next statement, */ + /* following byte is length of statement */ + dst_ln_col_run_2, /* next 2 bytes is column position of start of next statement, */ + /* following 2 bytes is length of statement */ + dst_ln_init_base1, /* next 4 bytes are absolute PC, followed by 1 byte of line number */ + dst_ln_init_base2, /* next 4 bytes are absolute PC, followed by 2 bytes of line number */ + dst_ln_init_base3, /* next 4 bytes are absolute PC, followed by 3 bytes of line number */ + dst_ln_escape2_END_OF_ENUM +} +dst_ln_escape2_t; + +typedef union +{ + struct + { + unsigned int pc_delta : 4; /* 4 bit pc delta */ + int ln_delta : 4; /* 4 bit line number delta */ + } + delta; + + struct + { + unsigned int esc_flag : 4; /* alias for pc_delta */ + unsigned int esc_code : 4; /* escape function code (dst_ln_escape1_t, or ...2_t */ + } + esc; + + struct + { + unsigned int esc_flag : 4; /* dst_ln_ctx_spec1, or dst_ln_ctx_spec2 */ + unsigned int run_length : 2; + unsigned int ctx_index : 2; /* ...spec2 contains index; ...spec1, index - 4 */ + } + ctx_spec; + + char sdata; /* signed data byte */ + unsigned char udata; /* unsigned data byte */ +} +dst_ln_entry_t, + * dst_ln_entry_ptr_t; + +/* Warning: although the above union occupies only 1 byte the compiler treats + it as having size 2 (the minimum size of a struct). Therefore a sequence of + dst_ln_entry_t's cannot be described as an array, and walking through such a + sequence requires convoluted code such as + ln_ptr = (dst_ln_entry_ptr_t) (char*) ln_ptr + 1 + We regret the inconvenience. */ + +/* Structure for interpreting the byte following a dst_ln_ctx1 entry. */ +typedef struct +{ + unsigned int ctx1_index : 5; /* 5 bit index into context table */ + unsigned int ctx1_run_length : 3; /* 3 bit run length */ +} dst_ln_ctx1_t, + *dst_ln_ctx1_ptr_t; + +/* Structure for interpreting the bytes following a dst_ln_ctx2 entry. */ +typedef struct +{ + unsigned int ctx2_index : 13; /* 13 bit index into context table */ + unsigned int ctx2_run_length : 3; /* 3 bit run length */ +} dst_ln_ctx2_t, + *dst_ln_ctx2_ptr_t; + +/* Structure for interpreting the bytes following a dst_ln_ctx4 entry. */ +typedef struct +{ + unsigned int ctx4_index : 29; /* 29 bit index into context table */ + unsigned int ctx4_run_length : 3; /* 3 bit run length */ +} dst_ln_ctx4_t, + *dst_ln_ctx4_ptr_t; + + +/* PXDB definitions. + + PXDB is a post-processor which takes the executable file + and massages the debug information so that the debugger may + start up and run more efficiently. Some of the tasks + performed by PXDB are: + + o Remove duplicate global type and variable information + from the GNTT, + + o Append the GNTT onto the end of the LNTT and place both + back in the LNTT section, + + o Build quick look-up tables (description follows) for + files, procedures, modules, and paragraphs (for Cobol), + placing these in the GNTT section, + + o Reconstruct the header appearing in the header section + to access this information. + + The "quick look-up" tables are in the $GNTT$ sub-space, in + the following order: + + Procedures -sorted by address + Source files -sorted by address (of the + generated code from routines) + Modules -sorted by address + Classes - + Address Alias -sorted by index + Object IDs -sorted by object identifier + + Most quick entries have (0-based) indices into the LNTT tables to + the full entries for the item it describes. + + The post-PXDB header is in the $HEADER$ sub-space. Alas, it + occurs in different forms, depending on the optimization level + in the compilation step and whether PXDB was run or not. The + worst part is the forms aren't self-describing, so we'll have + to grovel in the bits to figure out what kind we're looking at + (see hp_get_header in hp-psymtab-read.c). */ + +/* PXDB versions. */ + +#define PXDB_VERSION_CPLUSPLUS 1 +#define PXDB_VERSION_7_4 2 +#define PXDB_VERSION_CPP_30 3 +#define PXDB_VERSION_DDE_3_2A 4 +#define PXDB_VERSION_DDE_3_2 5 +#define PXDB_VERSION_DDE_4_0 6 + +#define PXDB_VERSION_2_1 1 + +/* Header version for the case that there is no DOC info + but the executable has been processed by pxdb (the easy + case, from "cc -g"). */ + +typedef struct PXDB_struct +{ + int pd_entries; /* # of entries in function look-up table */ + int fd_entries; /* # of entries in file look-up table */ + int md_entries; /* # of entries in module look-up table */ + unsigned int pxdbed : 1; /* 1 => file has been preprocessed */ + unsigned int bighdr : 1; /* 1 => this header contains 'time' word */ + unsigned int sa_header : 1;/* 1 => created by SA version of pxdb */ + /* used for version check in xdb */ + unsigned int inlined: 1; /* one or more functions have been inlined */ + unsigned int spare:12; + short version; /* pxdb header version */ + int globals; /* index into the DNTT where GNTT begins */ + unsigned int time; /* modify time of file before being pxdbed */ + int pg_entries; /* # of entries in label look-up table */ + int functions; /* actual number of functions */ + int files; /* actual number of files */ + int cd_entries; /* # of entries in class look-up table */ + int aa_entries; /* # of entries in addr alias look-up table */ + int oi_entries; /* # of entries in object id look-up table */ +} PXDB_header, *PXDB_header_ptr; + +/* Header version for the case that there is no DOC info and the + executable has NOT been processed by pxdb. */ + +typedef struct XDB_header_struct +{ + long gntt_length; + long lntt_length; + long slt_length; + long vt_length; + long xt_length; +} XDB_header; + +/* Header version for the case that there is DOC info and the + executable has been processed by pxdb. */ + +typedef struct DOC_info_PXDB_header_struct +{ + unsigned int xdb_header: 1; /* bit set if this is post-3.1 xdb */ + unsigned int doc_header: 1; /* bit set if this is doc-style header */ + unsigned int version: 8; /* version of pxdb see defines + PXDB_VERSION_* in this file. */ + unsigned int reserved_for_flags: 16;/* for future use; -- must be + set to zero. */ + unsigned int has_aux_pd_table: 1; /* $GNTT$ has aux PD table */ + unsigned int has_expr_table: 1; /* space has $EXPR$ */ + unsigned int has_range_table: 1; /* space has $RANGE$ */ + unsigned int has_context_table: 1; /* space has $SRC_CTXT$ */ + unsigned int has_lines_table: 1; /* space contains a $LINES$ + subspace for line tables. */ + unsigned int has_lt_offset_map: 1; /* space contains an lt_offset + subspace for line table mapping. */ + /* The following fields are the same as those in the PXDB_header in $DEBUG$ */ + int pd_entries; /* # of entries in function look-up table */ + int fd_entries; /* # of entries in file look-up table */ + int md_entries; /* # of entries in module look-up table */ + unsigned int pxdbed : 1; /* 1 => file has been preprocessed */ + unsigned int bighdr : 1; /* 1 => this header contains 'time' word */ + unsigned int sa_header : 1;/* 1 => created by SA version of pxdb */ + /* used for version check in xdb */ + unsigned int inlined: 1; /* one or more functions have been inlined */ + unsigned int spare : 28; + int globals; /* index into the DNTT where GNTT begins */ + unsigned int time; /* modify time of file before being pxdbed */ + int pg_entries; /* # of entries in label look-up table */ + int functions; /* actual number of functions */ + int files; /* actual number of files */ + int cd_entries; /* # of entries in class look-up table */ + int aa_entries; /* # of entries in addr alias look-up table */ + int oi_entries; /* # of entries in object id look-up table */ +} DOC_info_PXDB_header; + +/* Header version for the case that there is DOC info and the + executable has NOT been processed by pxdb. */ + +typedef struct DOC_info_header_struct +{ + unsigned int xdb_header: 1; /* bit set if this is post-3.1 xdb */ + unsigned int doc_header: 1; /* bit set if this is doc-style header*/ + unsigned int version: 8; /* version of debug/header + format. For 10.0 the value + will be 1. For "Davis" the value is 2. */ + unsigned int reserved_for_flags: 18; /* for future use; -- must be set to zero. */ + unsigned int has_range_table: 1; /* space contains a $RANGE$ subspace for variable ranges. */ + unsigned int has_context_table: 1; /* space contains a $CTXT$ subspace for context/inline table. */ + unsigned int has_lines_table: 1; /* space contains a $LINES$ subspace for line tables. */ + unsigned int has_lt_offset_map: 1; /* space contains an lt_offset subspace for line table mapping. */ + + long gntt_length; /* same as old header */ + long lntt_length; /* same as old header */ + long slt_length; /* same as old header */ + long vt_length; /* same as old header */ + long xt_length; /* same as old header */ + long ctxt_length; /* present only if version >= 2 */ + long range_length; /* present only if version >= 2 */ + long expr_length; /* present only if version >= 2 */ + +} DOC_info_header; + +typedef union GenericDebugHeader_union +{ + PXDB_header no_doc; + DOC_info_PXDB_header doc; + XDB_header no_pxdb_no_doc; + DOC_info_header no_pxdb_doc; +} GenericDebugHeader; + + +/* Procedure Descriptor: + An element of the procedure quick look-up table. */ + +typedef struct quick_procedure +{ + long isym; /* 0-based index of first symbol + for procedure in $LNTT$, + i.e. the procedure itself. */ + CORE_ADDR adrStart; /* memory adr of start of proc */ + CORE_ADDR adrEnd; /* memory adr of end of proc */ + char *sbAlias; /* alias name of procedure */ + char *sbProc; /* real name of procedure */ + CORE_ADDR adrBp; /* address of entry breakpoint */ + CORE_ADDR adrExitBp; /* address of exit breakpoint */ + int icd; /* member of this class (index) */ + unsigned int ipd; /* index of template for this */ + /* function (index) */ + unsigned int unused: 5; + unsigned int no_lt_offset: 1;/* no entry in lt_offset table */ + unsigned int fTemplate: 1; /* function template */ + unsigned int fExpansion: 1; /* function expansion */ + unsigned int linked : 1; /* linked with other expansions */ + unsigned int duplicate: 1; /* clone of another procedure */ + unsigned int overloaded:1; /* overloaded function */ + unsigned int member: 1; /* class member function */ + unsigned int constructor:1; /* constructor function */ + unsigned int destructor:1; /* destructor function */ + unsigned int Static: 1; /* static function */ + unsigned int Virtual: 1; /* virtual function */ + unsigned int constant: 1; /* constant function */ + unsigned int pure: 1; /* pure (virtual) function */ + unsigned int language: 4; /* procedure's language */ + unsigned int inlined: 1; /* function has been inlined */ + unsigned int Operator: 1; /* operator function */ + unsigned int stub: 1; /* bodyless function */ + unsigned int optimize: 2; /* optimization level */ + unsigned int level: 5; /* nesting level (top=0) */ +} quick_procedure_entry, *quick_procedure_entry_ptr; + +/* Source File Descriptor: + An element of the source file quick look-up table. */ + +typedef struct quick_source +{ + long isym; /* 0-based index in $LNTT$ of + first symbol for this file. */ + CORE_ADDR adrStart; /* mem adr of start of file's code */ + CORE_ADDR adrEnd; /* mem adr of end of file's code */ + char *sbFile; /* name of source file */ + unsigned int fHasDecl: 1; /* do we have a .d file? */ + unsigned int fWarned: 1; /* have warned about age problems? */ + unsigned int fSrcfile: 1; /* 0 => include 1=> source */ + unsigned short ilnMac; /* lines in file (0 if don't know) */ + int ipd; /* 0-based index of first procedure + in this file, in the quick + look-up table of procedures. */ + unsigned int *rgLn; /* line pointer array, if any */ +} quick_file_entry, *quick_file_entry_ptr; + +/* Module Descriptor: + An element of the module quick reference table. */ + +typedef struct quick_module +{ + long isym; /* 0-based index of first + symbol for module. */ + CORE_ADDR adrStart; /* adr of start of mod. */ + CORE_ADDR adrEnd; /* adr of end of mod. */ + char *sbAlias; /* alias name of module */ + char *sbMod; /* real name of module */ + unsigned int imports: 1; /* module have any imports? */ + unsigned int vars_in_front: 1; /* module globals in front? */ + unsigned int vars_in_gaps: 1; /* module globals in gaps? */ + unsigned int language: 4; /* type of language */ + unsigned int unused : 25; + unsigned int unused2; /* space for future stuff */ +} quick_module_entry, *quick_module_entry_ptr; + +/* Auxiliary Procedure Descriptor: + An element of the auxiliary procedure quick look-up table. */ + +typedef struct quick_aux_procedure +{ + long isym_inln; /* start on inline list for proc */ + long spare; +} quick_aux_procedure_entry, *quick_aux_procedure_entry_ptr; + +/* Paragraph Descriptor: + An element of the paragraph quick look-up table. */ + +typedef struct quick_paragraph +{ + long isym; /* first symbol for label (index) */ + CORE_ADDR adrStart; /* memory adr of start of label */ + CORE_ADDR adrEnd; /* memory adr of end of label */ + char *sbLab; /* name of label */ + unsigned int inst; /* Used in xdb to store inst @ bp */ + unsigned int sect: 1; /* true = section, false = parag. */ + unsigned int unused: 31; /* future use */ +} quick_paragraph_entry, *quick_paragraph_entry_ptr; + +/* Class Descriptor: + An element of the class quick look-up table. */ + +typedef struct quick_class +{ + char *sbClass; /* name of class */ + long isym; /* class symbol (tag) */ + unsigned int type : 2; /* 0=class, 1=union, 2=struct */ + unsigned int fTemplate : 1;/* class template */ + unsigned int expansion : 1;/* template expansion */ + unsigned int unused :28; + sltpointer lowscope; /* beginning of defined scope */ + sltpointer hiscope; /* end of defined scope */ +} quick_class_entry, *quick_class_entry_ptr; + +/* Address Alias Entry + An element of the address alias quick look-up table. */ + +typedef struct quick_alias +{ + CORE_ADDR low; + CORE_ADDR high; + int index; + unsigned int unused : 31; + unsigned int alternate : 1; /* alternate unnamed aliases? */ +} quick_alias_entry, *quick_alias_entry_ptr; + +/* Object Identification Entry + An element of the object identification quick look-up table. */ + +typedef struct quick_obj_ID +{ + CORE_ADDR obj_ident; /* class identifier */ + long isym; /* class symbol */ + long offset; /* offset to object start */ +} quick_obj_ID_entry, *quick_obj_ID_entry_ptr; + +#endif /* HP_SYMTAB_INCLUDED */ diff --git a/include/iconv.h b/include/iconv.h new file mode 100644 index 0000000..37feb88 --- /dev/null +++ b/include/iconv.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy, SoftMine Corporation. + * Rights transferred to Franklin Electronic Publishers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ICONV_H_ +#define _ICONV_H_ + +#include <_ansi.h> +#include +#include +#include + +/* iconv_t: charset conversion descriptor type */ +typedef _iconv_t iconv_t; + +_BEGIN_STD_C + +#ifndef _REENT_ONLY +iconv_t +iconv_open (const char *, const char *); + +size_t +iconv (iconv_t, char **__restrict, size_t *__restrict, + char **__restrict, size_t *__restrict); + +int +iconv_close (iconv_t); +#endif + +iconv_t +_iconv_open_r (struct _reent *, const char *, const char *); + +size_t +_iconv_r (struct _reent *, iconv_t, const char **, + size_t *, char **, size_t *); + +int +_iconv_close_r (struct _reent *, iconv_t); + +_END_STD_C + +#endif /* #ifndef _ICONV_H_ */ diff --git a/include/ieee.h b/include/ieee.h new file mode 100644 index 0000000..72fcad4 --- /dev/null +++ b/include/ieee.h @@ -0,0 +1,165 @@ +/* IEEE Standard 695-1980 "Universal Format for Object Modules" header file + + Copyright 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. + + Contributed by Cygnus Support. */ + +#define N_W_VARIABLES 8 +#define Module_Beginning 0xe0 + +typedef struct ieee_module + { + char *processor; + char *module_name; + } +ieee_module_begin_type; + +#define Address_Descriptor 0xec +typedef struct ieee_address + { + bfd_vma number_of_bits_mau; + bfd_vma number_of_maus_in_address; + + unsigned char byte_order; +#define IEEE_LITTLE 0xcc +#define IEEE_BIG 0xcd + } +ieee_address_descriptor_type; + +typedef union ieee_w_variable + { + file_ptr offset[N_W_VARIABLES]; + + struct + { + file_ptr extension_record; + file_ptr environmental_record; + file_ptr section_part; + file_ptr external_part; + file_ptr debug_information_part; + file_ptr data_part; + file_ptr trailer_part; + file_ptr me_record; + } + r; + } +ieee_w_variable_type; + +typedef enum ieee_record + { + ieee_number_start_enum = 0x00, + ieee_number_end_enum=0x7f, + ieee_number_repeat_start_enum = 0x80, + ieee_number_repeat_end_enum = 0x88, + ieee_number_repeat_4_enum = 0x84, + ieee_number_repeat_3_enum = 0x83, + ieee_number_repeat_2_enum = 0x82, + ieee_number_repeat_1_enum = 0x81, + ieee_module_beginning_enum = 0xe0, + ieee_module_end_enum = 0xe1, + ieee_extension_length_1_enum = 0xde, + ieee_extension_length_2_enum = 0xdf, + ieee_section_type_enum = 0xe6, + ieee_section_alignment_enum = 0xe7, + ieee_external_symbol_enum = 0xe8, + ieee_comma = 0x90, + ieee_external_reference_enum = 0xe9, + ieee_set_current_section_enum = 0xe5, + ieee_address_descriptor_enum = 0xec, + ieee_load_constant_bytes_enum = 0xed, + ieee_load_with_relocation_enum = 0xe4, + + ieee_variable_A_enum = 0xc1, + ieee_variable_B_enum = 0xc2, + ieee_variable_C_enum = 0xc3, + ieee_variable_D_enum = 0xc4, + ieee_variable_E_enum = 0xc5, + ieee_variable_F_enum = 0xc6, + ieee_variable_G_enum = 0xc7, + ieee_variable_H_enum = 0xc8, + ieee_variable_I_enum = 0xc9, + ieee_variable_J_enum = 0xca, + ieee_variable_K_enum = 0xcb, + ieee_variable_L_enum = 0xcc, + ieee_variable_M_enum = 0xcd, + ieee_variable_N_enum = 0xce, + ieee_variable_O_enum = 0xcf, + ieee_variable_P_enum = 0xd0, + ieee_variable_Q_enum = 0xd1, + ieee_variable_R_enum = 0xd2, + ieee_variable_S_enum = 0xd3, + ieee_variable_T_enum = 0xd4, + ieee_variable_U_enum = 0xd5, + ieee_variable_V_enum = 0xd6, + ieee_variable_W_enum = 0xd7, + ieee_variable_X_enum = 0xd8, + ieee_variable_Y_enum = 0xd9, + ieee_variable_Z_enum = 0xda, + ieee_function_plus_enum = 0xa5, + ieee_function_minus_enum = 0xa6, + ieee_function_signed_open_b_enum = 0xba, + ieee_function_signed_close_b_enum = 0xbb, + + ieee_function_unsigned_open_b_enum = 0xbc, + ieee_function_unsigned_close_b_enum = 0xbd, + + ieee_function_either_open_b_enum = 0xbe, + ieee_function_either_close_b_enum = 0xbf, + ieee_record_seperator_enum = 0xdb, + + ieee_e2_first_byte_enum = 0xe2, + ieee_section_size_enum = 0xe2d3, + ieee_physical_region_size_enum = 0xe2c1, + ieee_region_base_address_enum = 0xe2c2, + ieee_mau_size_enum = 0xe2c6, + ieee_m_value_enum = 0xe2cd, + ieee_section_base_address_enum = 0xe2cc, + ieee_asn_record_enum = 0xe2ce, + ieee_section_offset_enum = 0xe2d2, + ieee_value_starting_address_enum = 0xe2c7, + ieee_assign_value_to_variable_enum = 0xe2d7, + ieee_set_current_pc_enum = 0xe2d0, + ieee_value_record_enum = 0xe2c9, + ieee_nn_record = 0xf0, + ieee_at_record_enum = 0xf1, + ieee_ty_record_enum = 0xf2, + ieee_attribute_record_enum = 0xf1c9, + ieee_atn_record_enum = 0xf1ce, + ieee_external_reference_info_record_enum = 0xf1d8, + ieee_weak_external_reference_enum= 0xf4, + ieee_repeat_data_enum = 0xf7, + ieee_bb_record_enum = 0xf8, + ieee_be_record_enum = 0xf9 + } +ieee_record_enum_type; + +typedef struct ieee_section + { + unsigned int section_index; + unsigned int section_type; + char * section_name; + unsigned int parent_section_index; + unsigned int sibling_section_index; + unsigned int context_index; + } +ieee_section_type; + +#define IEEE_REFERENCE_BASE 11 +#define IEEE_PUBLIC_BASE 32 +#define IEEE_SECTION_NUMBER_BASE 1 + diff --git a/include/ieeefp.h b/include/ieeefp.h new file mode 100644 index 0000000..2d6421a --- /dev/null +++ b/include/ieeefp.h @@ -0,0 +1,295 @@ +#ifndef _IEEE_FP_H_ +#define _IEEE_FP_H_ + +#include "_ansi.h" + +#include +#include + +_BEGIN_STD_C + +/* FIXME FIXME FIXME: + Neither of __ieee_{float,double}_shape_type seem to be used anywhere + except in libm/test. If that is the case, please delete these from here. + If that is not the case, please insert documentation here describing why + they're needed. */ + +#ifdef __IEEE_BIG_ENDIAN + +typedef union +{ + double value; + struct + { + unsigned int sign : 1; + unsigned int exponent: 11; + unsigned int fraction0:4; + unsigned int fraction1:16; + unsigned int fraction2:16; + unsigned int fraction3:16; + + } number; + struct + { + unsigned int sign : 1; + unsigned int exponent: 11; + unsigned int quiet:1; + unsigned int function0:3; + unsigned int function1:16; + unsigned int function2:16; + unsigned int function3:16; + } nan; + struct + { + unsigned long msw; + unsigned long lsw; + } parts; + long aslong[2]; +} __ieee_double_shape_type; + +#elif defined __IEEE_LITTLE_ENDIAN + +typedef union +{ + double value; + struct + { +#ifdef __SMALL_BITFIELDS + unsigned int fraction3:16; + unsigned int fraction2:16; + unsigned int fraction1:16; + unsigned int fraction0: 4; +#else + unsigned int fraction1:32; + unsigned int fraction0:20; +#endif + unsigned int exponent :11; + unsigned int sign : 1; + } number; + struct + { +#ifdef __SMALL_BITFIELDS + unsigned int function3:16; + unsigned int function2:16; + unsigned int function1:16; + unsigned int function0:3; +#else + unsigned int function1:32; + unsigned int function0:19; +#endif + unsigned int quiet:1; + unsigned int exponent: 11; + unsigned int sign : 1; + } nan; + struct + { + unsigned long lsw; + unsigned long msw; + } parts; + + long aslong[2]; + +} __ieee_double_shape_type; + +#endif /* __IEEE_LITTLE_ENDIAN */ + +#ifdef __IEEE_BIG_ENDIAN + +typedef union +{ + float value; + struct + { + unsigned int sign : 1; + unsigned int exponent: 8; + unsigned int fraction0: 7; + unsigned int fraction1: 16; + } number; + struct + { + unsigned int sign:1; + unsigned int exponent:8; + unsigned int quiet:1; + unsigned int function0:6; + unsigned int function1:16; + } nan; + long p1; + +} __ieee_float_shape_type; + +#elif defined __IEEE_LITTLE_ENDIAN + +typedef union +{ + float value; + struct + { + unsigned int fraction0: 7; + unsigned int fraction1: 16; + unsigned int exponent: 8; + unsigned int sign : 1; + } number; + struct + { + unsigned int function1:16; + unsigned int function0:6; + unsigned int quiet:1; + unsigned int exponent:8; + unsigned int sign:1; + } nan; + long p1; + +} __ieee_float_shape_type; + +#endif /* __IEEE_LITTLE_ENDIAN */ + +#ifndef _LDBL_EQ_DBL + +#ifndef LDBL_MANT_DIG +#error "LDBL_MANT_DIG not defined - should be found in float.h" + +#elif LDBL_MANT_DIG == DBL_MANT_DIG +#error "double and long double are the same size but LDBL_EQ_DBL is not defined" + +#elif LDBL_MANT_DIG == 53 +/* This happens when doubles are 32-bits and long doubles are 64-bits. */ +#define EXT_EXPBITS 11 +#define EXT_FRACHBITS 20 +#define EXT_FRACLBITS 32 +#define __ieee_ext_field_type unsigned long + +#elif LDBL_MANT_DIG == 64 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 32 +#define EXT_FRACLBITS 32 +#define __ieee_ext_field_type unsigned int + +#elif LDBL_MANT_DIG == 65 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 32 +#define EXT_FRACLBITS 32 +#define __ieee_ext_field_type unsigned int + +#elif LDBL_MANT_DIG == 112 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 48 +#define EXT_FRACLBITS 64 +#define __ieee_ext_field_type unsigned long long + +#elif LDBL_MANT_DIG == 113 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 48 +#define EXT_FRACLBITS 64 +#define __ieee_ext_field_type unsigned long long + +#else +#error Unsupported value for LDBL_MANT_DIG +#endif + +#define EXT_EXP_INFNAN ((1 << EXT_EXPBITS) - 1) /* 32767 */ +#define EXT_EXP_BIAS ((1 << (EXT_EXPBITS - 1)) - 1) /* 16383 */ +#define EXT_FRACBITS (EXT_FRACLBITS + EXT_FRACHBITS) + +typedef struct ieee_ext +{ + __ieee_ext_field_type ext_fracl : EXT_FRACLBITS; + __ieee_ext_field_type ext_frach : EXT_FRACHBITS; + __ieee_ext_field_type ext_exp : EXT_EXPBITS; + __ieee_ext_field_type ext_sign : 1; +} ieee_ext; + +typedef union ieee_ext_u +{ + long double extu_ld; + struct ieee_ext extu_ext; +} ieee_ext_u; + +#endif /* ! _LDBL_EQ_DBL */ + + +/* FLOATING ROUNDING */ + +typedef int fp_rnd; +#define FP_RN 0 /* Round to nearest */ +#define FP_RM 1 /* Round down */ +#define FP_RP 2 /* Round up */ +#define FP_RZ 3 /* Round to zero (trunate) */ + +fp_rnd fpgetround (void); +fp_rnd fpsetround (fp_rnd); + +/* EXCEPTIONS */ + +typedef int fp_except; +#define FP_X_INV 0x10 /* Invalid operation */ +#define FP_X_DX 0x80 /* Divide by zero */ +#define FP_X_OFL 0x04 /* Overflow exception */ +#define FP_X_UFL 0x02 /* Underflow exception */ +#define FP_X_IMP 0x01 /* imprecise exception */ + +fp_except fpgetmask (void); +fp_except fpsetmask (fp_except); +fp_except fpgetsticky (void); +fp_except fpsetsticky (fp_except); + +/* INTEGER ROUNDING */ + +typedef int fp_rdi; +#define FP_RDI_TOZ 0 /* Round to Zero */ +#define FP_RDI_RD 1 /* Follow float mode */ + +fp_rdi fpgetroundtoi (void); +fp_rdi fpsetroundtoi (fp_rdi); + +#define __IEEE_DBL_EXPBIAS 1023 +#define __IEEE_FLT_EXPBIAS 127 + +#define __IEEE_DBL_EXPLEN 11 +#define __IEEE_FLT_EXPLEN 8 + + +#define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1)) +#define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1)) + +#define __IEEE_DBL_MAXPOWTWO ((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1)) +#define __IEEE_FLT_MAXPOWTWO ((float)(1L << (32-8) - 1)) + +#define __IEEE_DBL_NAN_EXP 0x7ff +#define __IEEE_FLT_NAN_EXP 0xff + +#ifdef __ieeefp_isnanf +#define isnanf(x) __ieeefp_isnanf(x) +#endif + +#ifdef __ieeefp_isinff +#define isinff(x) __ieeefp_isinff(x) +#endif + +#ifdef __ieeefp_finitef +#define finitef(x) __ieeefp_finitef(x) +#endif + +#ifdef _DOUBLE_IS_32BITS +#undef __IEEE_DBL_EXPBIAS +#define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS + +#undef __IEEE_DBL_EXPLEN +#define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN + +#undef __IEEE_DBL_FRACLEN +#define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN + +#undef __IEEE_DBL_MAXPOWTWO +#define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO + +#undef __IEEE_DBL_NAN_EXP +#define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP + +#undef __ieee_double_shape_type +#define __ieee_double_shape_type __ieee_float_shape_type + +#endif /* _DOUBLE_IS_32BITS */ + +_END_STD_C + +#endif /* _IEEE_FP_H_ */ diff --git a/include/inttypes.h b/include/inttypes.h new file mode 100644 index 0000000..417ff22 --- /dev/null +++ b/include/inttypes.h @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/** + * @file inttypes.h + */ + +#ifndef _INTTYPES_H +#define _INTTYPES_H + +#include +#include +#include +#include "_ansi.h" +#include +#define __need_wchar_t +#include + +#if __BSD_VISIBLE +#include +#endif + +#define __STRINGIFY(a) #a + +/* 8-bit types */ +#define __PRI8(x) __INT8 __STRINGIFY(x) +#define __PRI8LEAST(x) __LEAST8 __STRINGIFY(x) +#define __PRI8FAST(x) __FAST8 __STRINGIFY(x) + +/* NOTICE: scanning 8-bit types requires use of the hh specifier + * which is only supported on newlib platforms that + * are built with C99 I/O format support enabled. If the flag in + * newlib.h hasn't been set during configuration to indicate this, the 8-bit + * scanning format macros are disabled here as they result in undefined + * behaviour which can include memory overwrite. Overriding the flag after the + * library has been built is not recommended as it will expose the underlying + * undefined behaviour. + */ + +#if defined(_WANT_IO_C99_FORMATS) + #define __SCN8(x) __INT8 __STRINGIFY(x) + #define __SCN8LEAST(x) __LEAST8 __STRINGIFY(x) + #define __SCN8FAST(x) __FAST8 __STRINGIFY(x) +#endif /* _WANT_IO_C99_FORMATS */ + + +#define PRId8 __PRI8(d) +#define PRIi8 __PRI8(i) +#define PRIo8 __PRI8(o) +#define PRIu8 __PRI8(u) +#define PRIx8 __PRI8(x) +#define PRIX8 __PRI8(X) + +/* Macros below are only enabled for a newlib built with C99 I/O format support. */ +#if defined(_WANT_IO_C99_FORMATS) + +#define SCNd8 __SCN8(d) +#define SCNi8 __SCN8(i) +#define SCNo8 __SCN8(o) +#define SCNu8 __SCN8(u) +#define SCNx8 __SCN8(x) + +#endif /* _WANT_IO_C99_FORMATS */ + + +#define PRIdLEAST8 __PRI8LEAST(d) +#define PRIiLEAST8 __PRI8LEAST(i) +#define PRIoLEAST8 __PRI8LEAST(o) +#define PRIuLEAST8 __PRI8LEAST(u) +#define PRIxLEAST8 __PRI8LEAST(x) +#define PRIXLEAST8 __PRI8LEAST(X) + +/* Macros below are only enabled for a newlib built with C99 I/O format support. */ +#if defined(_WANT_IO_C99_FORMATS) + + #define SCNdLEAST8 __SCN8LEAST(d) + #define SCNiLEAST8 __SCN8LEAST(i) + #define SCNoLEAST8 __SCN8LEAST(o) + #define SCNuLEAST8 __SCN8LEAST(u) + #define SCNxLEAST8 __SCN8LEAST(x) + +#endif /* _WANT_IO_C99_FORMATS */ + +#define PRIdFAST8 __PRI8FAST(d) +#define PRIiFAST8 __PRI8FAST(i) +#define PRIoFAST8 __PRI8FAST(o) +#define PRIuFAST8 __PRI8FAST(u) +#define PRIxFAST8 __PRI8FAST(x) +#define PRIXFAST8 __PRI8FAST(X) + +/* Macros below are only enabled for a newlib built with C99 I/O format support. */ +#if defined(_WANT_IO_C99_FORMATS) + + #define SCNdFAST8 __SCN8FAST(d) + #define SCNiFAST8 __SCN8FAST(i) + #define SCNoFAST8 __SCN8FAST(o) + #define SCNuFAST8 __SCN8FAST(u) + #define SCNxFAST8 __SCN8FAST(x) + +#endif /* _WANT_IO_C99_FORMATS */ + +/* 16-bit types */ +#define __PRI16(x) __INT16 __STRINGIFY(x) +#define __PRI16LEAST(x) __LEAST16 __STRINGIFY(x) +#define __PRI16FAST(x) __FAST16 __STRINGIFY(x) +#define __SCN16(x) __INT16 __STRINGIFY(x) +#define __SCN16LEAST(x) __LEAST16 __STRINGIFY(x) +#define __SCN16FAST(x) __FAST16 __STRINGIFY(x) + + +#define PRId16 __PRI16(d) +#define PRIi16 __PRI16(i) +#define PRIo16 __PRI16(o) +#define PRIu16 __PRI16(u) +#define PRIx16 __PRI16(x) +#define PRIX16 __PRI16(X) + +#define SCNd16 __SCN16(d) +#define SCNi16 __SCN16(i) +#define SCNo16 __SCN16(o) +#define SCNu16 __SCN16(u) +#define SCNx16 __SCN16(x) + + +#define PRIdLEAST16 __PRI16LEAST(d) +#define PRIiLEAST16 __PRI16LEAST(i) +#define PRIoLEAST16 __PRI16LEAST(o) +#define PRIuLEAST16 __PRI16LEAST(u) +#define PRIxLEAST16 __PRI16LEAST(x) +#define PRIXLEAST16 __PRI16LEAST(X) + +#define SCNdLEAST16 __SCN16LEAST(d) +#define SCNiLEAST16 __SCN16LEAST(i) +#define SCNoLEAST16 __SCN16LEAST(o) +#define SCNuLEAST16 __SCN16LEAST(u) +#define SCNxLEAST16 __SCN16LEAST(x) + + +#define PRIdFAST16 __PRI16FAST(d) +#define PRIiFAST16 __PRI16FAST(i) +#define PRIoFAST16 __PRI16FAST(o) +#define PRIuFAST16 __PRI16FAST(u) +#define PRIxFAST16 __PRI16FAST(x) +#define PRIXFAST16 __PRI16FAST(X) + +#define SCNdFAST16 __SCN16FAST(d) +#define SCNiFAST16 __SCN16FAST(i) +#define SCNoFAST16 __SCN16FAST(o) +#define SCNuFAST16 __SCN16FAST(u) +#define SCNxFAST16 __SCN16FAST(x) + +/* 32-bit types */ +#define __PRI32(x) __INT32 __STRINGIFY(x) +#define __SCN32(x) __INT32 __STRINGIFY(x) +#define __PRI32LEAST(x) __LEAST32 __STRINGIFY(x) +#define __SCN32LEAST(x) __LEAST32 __STRINGIFY(x) +#define __PRI32FAST(x) __FAST32 __STRINGIFY(x) +#define __SCN32FAST(x) __FAST32 __STRINGIFY(x) + +#define PRId32 __PRI32(d) +#define PRIi32 __PRI32(i) +#define PRIo32 __PRI32(o) +#define PRIu32 __PRI32(u) +#define PRIx32 __PRI32(x) +#define PRIX32 __PRI32(X) + +#define SCNd32 __SCN32(d) +#define SCNi32 __SCN32(i) +#define SCNo32 __SCN32(o) +#define SCNu32 __SCN32(u) +#define SCNx32 __SCN32(x) + + +#define PRIdLEAST32 __PRI32LEAST(d) +#define PRIiLEAST32 __PRI32LEAST(i) +#define PRIoLEAST32 __PRI32LEAST(o) +#define PRIuLEAST32 __PRI32LEAST(u) +#define PRIxLEAST32 __PRI32LEAST(x) +#define PRIXLEAST32 __PRI32LEAST(X) + +#define SCNdLEAST32 __SCN32LEAST(d) +#define SCNiLEAST32 __SCN32LEAST(i) +#define SCNoLEAST32 __SCN32LEAST(o) +#define SCNuLEAST32 __SCN32LEAST(u) +#define SCNxLEAST32 __SCN32LEAST(x) + + +#define PRIdFAST32 __PRI32FAST(d) +#define PRIiFAST32 __PRI32FAST(i) +#define PRIoFAST32 __PRI32FAST(o) +#define PRIuFAST32 __PRI32FAST(u) +#define PRIxFAST32 __PRI32FAST(x) +#define PRIXFAST32 __PRI32FAST(X) + +#define SCNdFAST32 __SCN32FAST(d) +#define SCNiFAST32 __SCN32FAST(i) +#define SCNoFAST32 __SCN32FAST(o) +#define SCNuFAST32 __SCN32FAST(u) +#define SCNxFAST32 __SCN32FAST(x) + + +/* 64-bit types */ +#define __PRI64(x) __INT64 __STRINGIFY(x) +#define __SCN64(x) __INT64 __STRINGIFY(x) + +#define __PRI64LEAST(x) __LEAST64 __STRINGIFY(x) +#define __SCN64LEAST(x) __LEAST64 __STRINGIFY(x) +#define __PRI64FAST(x) __FAST64 __STRINGIFY(x) +#define __SCN64FAST(x) __FAST64 __STRINGIFY(x) + +#if __int64_t_defined +#define PRId64 __PRI64(d) +#define PRIi64 __PRI64(i) +#define PRIo64 __PRI64(o) +#define PRIu64 __PRI64(u) +#define PRIx64 __PRI64(x) +#define PRIX64 __PRI64(X) + +#define SCNd64 __SCN64(d) +#define SCNi64 __SCN64(i) +#define SCNo64 __SCN64(o) +#define SCNu64 __SCN64(u) +#define SCNx64 __SCN64(x) +#endif + +#if __int_least64_t_defined +#define PRIdLEAST64 __PRI64LEAST(d) +#define PRIiLEAST64 __PRI64LEAST(i) +#define PRIoLEAST64 __PRI64LEAST(o) +#define PRIuLEAST64 __PRI64LEAST(u) +#define PRIxLEAST64 __PRI64LEAST(x) +#define PRIXLEAST64 __PRI64LEAST(X) + +#define SCNdLEAST64 __SCN64LEAST(d) +#define SCNiLEAST64 __SCN64LEAST(i) +#define SCNoLEAST64 __SCN64LEAST(o) +#define SCNuLEAST64 __SCN64LEAST(u) +#define SCNxLEAST64 __SCN64LEAST(x) +#endif + +#if __int_fast64_t_defined +#define PRIdFAST64 __PRI64FAST(d) +#define PRIiFAST64 __PRI64FAST(i) +#define PRIoFAST64 __PRI64FAST(o) +#define PRIuFAST64 __PRI64FAST(u) +#define PRIxFAST64 __PRI64FAST(x) +#define PRIXFAST64 __PRI64FAST(X) + +#define SCNdFAST64 __SCN64FAST(d) +#define SCNiFAST64 __SCN64FAST(i) +#define SCNoFAST64 __SCN64FAST(o) +#define SCNuFAST64 __SCN64FAST(u) +#define SCNxFAST64 __SCN64FAST(x) +#endif + +/* max-bit types */ +#if __have_long64 +#define __PRIMAX(x) __STRINGIFY(l##x) +#define __SCNMAX(x) __STRINGIFY(l##x) +#elif __have_longlong64 +#define __PRIMAX(x) __STRINGIFY(ll##x) +#define __SCNMAX(x) __STRINGIFY(ll##x) +#else +#define __PRIMAX(x) __STRINGIFY(x) +#define __SCNMAX(x) __STRINGIFY(x) +#endif + +#define PRIdMAX __PRIMAX(d) +#define PRIiMAX __PRIMAX(i) +#define PRIoMAX __PRIMAX(o) +#define PRIuMAX __PRIMAX(u) +#define PRIxMAX __PRIMAX(x) +#define PRIXMAX __PRIMAX(X) + +#define SCNdMAX __SCNMAX(d) +#define SCNiMAX __SCNMAX(i) +#define SCNoMAX __SCNMAX(o) +#define SCNuMAX __SCNMAX(u) +#define SCNxMAX __SCNMAX(x) + +/* ptr types */ +#if defined (_INTPTR_EQ_LONGLONG) +# define __PRIPTR(x) __STRINGIFY(ll##x) +# define __SCNPTR(x) __STRINGIFY(ll##x) +#elif defined (_INTPTR_EQ_LONG) +# define __PRIPTR(x) __STRINGIFY(l##x) +# define __SCNPTR(x) __STRINGIFY(l##x) +#else +# define __PRIPTR(x) __STRINGIFY(x) +# define __SCNPTR(x) __STRINGIFY(x) +#endif + +#define PRIdPTR __PRIPTR(d) +#define PRIiPTR __PRIPTR(i) +#define PRIoPTR __PRIPTR(o) +#define PRIuPTR __PRIPTR(u) +#define PRIxPTR __PRIPTR(x) +#define PRIXPTR __PRIPTR(X) + +#define SCNdPTR __SCNPTR(d) +#define SCNiPTR __SCNPTR(i) +#define SCNoPTR __SCNPTR(o) +#define SCNuPTR __SCNPTR(u) +#define SCNxPTR __SCNPTR(x) + + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +struct _reent; + +#ifdef __cplusplus +extern "C" { +#endif + +extern intmax_t imaxabs(intmax_t); +extern imaxdiv_t imaxdiv(intmax_t __numer, intmax_t __denomer); +extern intmax_t strtoimax(const char *__restrict, char **__restrict, int); +extern intmax_t _strtoimax_r(struct _reent *, const char *__restrict, char **__restrict, int); +extern uintmax_t strtoumax(const char *__restrict, char **__restrict, int); +extern uintmax_t _strtoumax_r(struct _reent *, const char *__restrict, char **__restrict, int); +extern intmax_t wcstoimax(const wchar_t *__restrict, wchar_t **__restrict, int); +extern intmax_t _wcstoimax_r(struct _reent *, const wchar_t *__restrict, wchar_t **__restrict, int); +extern uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int); +extern uintmax_t _wcstoumax_r(struct _reent *, const wchar_t *__restrict, wchar_t **__restrict, int); + +#if __BSD_VISIBLE +extern intmax_t strtoimax_l(const char *__restrict, char **_restrict, int, locale_t); +extern uintmax_t strtoumax_l(const char *__restrict, char **_restrict, int, locale_t); +extern intmax_t wcstoimax_l(const wchar_t *__restrict, wchar_t **_restrict, int, locale_t); +extern uintmax_t wcstoumax_l(const wchar_t *__restrict, wchar_t **_restrict, int, locale_t); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/langinfo.h b/include/langinfo.h new file mode 100644 index 0000000..fcf986c --- /dev/null +++ b/include/langinfo.h @@ -0,0 +1,332 @@ +/*- + * Copyright (c) 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/include/langinfo.h,v 1.5 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _LANGINFO_H_ +#define _LANGINFO_H_ + +#include +#include +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#ifndef _NL_ITEM_DECLARED +typedef __nl_item nl_item; +#define _NL_ITEM_DECLARED +#endif + +enum +{ + /* POSIX and BSD defined items have to stick to the original values + to maintain backward compatibility. */ + _NL_CTYPE_CODESET_NAME = 0, /* codeset name */ +#define CODESET _NL_CTYPE_CODESET_NAME + D_T_FMT, /* string for formatting date and time */ +#define D_T_FMT D_T_FMT + D_FMT, /* date format string */ +#define D_FMT D_FMT + T_FMT, /* time format string */ +#define T_FMT T_FMT + T_FMT_AMPM, /* a.m. or p.m. time formatting string */ +#define T_FMT_AMPM T_FMT_AMPM + AM_STR, /* Ante Meridian affix */ +#define AM_STR AM_STR + PM_STR, /* Post Meridian affix */ +#define PM_STR PM_STR + +/* week day names */ + DAY_1, +#define DAY_1 DAY_1 + DAY_2, +#define DAY_2 DAY_2 + DAY_3, +#define DAY_3 DAY_3 + DAY_4, +#define DAY_4 DAY_4 + DAY_5, +#define DAY_5 DAY_5 + DAY_6, +#define DAY_6 DAY_6 + DAY_7, +#define DAY_7 DAY_7 + +/* abbreviated week day names */ + ABDAY_1, +#define ABDAY_1 ABDAY_1 + ABDAY_2, +#define ABDAY_2 ABDAY_2 + ABDAY_3, +#define ABDAY_3 ABDAY_3 + ABDAY_4, +#define ABDAY_4 ABDAY_4 + ABDAY_5, +#define ABDAY_5 ABDAY_5 + ABDAY_6, +#define ABDAY_6 ABDAY_6 + ABDAY_7, +#define ABDAY_7 ABDAY_7 + +/* month names */ + MON_1, +#define MON_1 MON_1 + MON_2, +#define MON_2 MON_2 + MON_3, +#define MON_3 MON_3 + MON_4, +#define MON_4 MON_4 + MON_5, +#define MON_5 MON_5 + MON_6, +#define MON_6 MON_6 + MON_7, +#define MON_7 MON_7 + MON_8, +#define MON_8 MON_8 + MON_9, +#define MON_9 MON_9 + MON_10, +#define MON_10 MON_10 + MON_11, +#define MON_11 MON_11 + MON_12, +#define MON_12 MON_12 + +/* abbreviated month names */ + ABMON_1, +#define ABMON_1 ABMON_1 + ABMON_2, +#define ABMON_2 ABMON_2 + ABMON_3, +#define ABMON_3 ABMON_3 + ABMON_4, +#define ABMON_4 ABMON_4 + ABMON_5, +#define ABMON_5 ABMON_5 + ABMON_6, +#define ABMON_6 ABMON_6 + ABMON_7, +#define ABMON_7 ABMON_7 + ABMON_8, +#define ABMON_8 ABMON_8 + ABMON_9, +#define ABMON_9 ABMON_9 + ABMON_10, +#define ABMON_10 ABMON_10 + ABMON_11, +#define ABMON_11 ABMON_11 + ABMON_12, +#define ABMON_12 ABMON_12 + + ERA, /* era description segments */ +#define ERA ERA + ERA_D_FMT, /* era date format string */ +#define ERA_D_FMT ERA_D_FMT + ERA_D_T_FMT, /* era date and time format string */ +#define ERA_D_T_FMT ERA_D_T_FMT + ERA_T_FMT, /* era time format string */ +#define ERA_T_FMT ERA_T_FMT + ALT_DIGITS, /* alternative symbols for digits */ +#define ALT_DIGITS ALT_DIGITS + + RADIXCHAR, /* radix char */ +#define RADIXCHAR RADIXCHAR + THOUSEP, /* separator for thousands */ +#define THOUSEP THOUSEP + + YESEXPR, /* affirmative response expression */ +#define YESEXPR YESEXPR + NOEXPR, /* negative response expression */ +#define NOEXPR NOEXPR + YESSTR, /* affirmative response for yes/no queries */ +#define YESSTR YESSTR + NOSTR, /* negative response for yes/no queries */ +#define NOSTR NOSTR + + CRNCYSTR, /* currency symbol */ +#define CRNCYSTR CRNCYSTR + + D_MD_ORDER, /* month/day order (BSD extension) */ +#define D_MD_ORDER D_MD_ORDER + + _NL_TIME_DATE_FMT = 84, /* date fmt used by date(1) (GNU extension) */ +#define _DATE_FMT _NL_TIME_DATE_FMT + +#ifdef __HAVE_LOCALE_INFO__ + _NL_CTYPE_MB_CUR_MAX, + _NL_MESSAGES_CODESET, + +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + + /* NOTE: + + Always maintain the order and position of existing entries! + Always append new entry to the list, prior to the definition + of _NL_LOCALE_EXTENDED_LAST_ENTRY. */ + + _NL_LOCALE_EXTENDED_FIRST_ENTRY, + + _NL_CTYPE_OUTDIGITS0_MB, + _NL_CTYPE_OUTDIGITS1_MB, + _NL_CTYPE_OUTDIGITS2_MB, + _NL_CTYPE_OUTDIGITS3_MB, + _NL_CTYPE_OUTDIGITS4_MB, + _NL_CTYPE_OUTDIGITS5_MB, + _NL_CTYPE_OUTDIGITS6_MB, + _NL_CTYPE_OUTDIGITS7_MB, + _NL_CTYPE_OUTDIGITS8_MB, + _NL_CTYPE_OUTDIGITS9_MB, + _NL_CTYPE_OUTDIGITS0_WC, + _NL_CTYPE_OUTDIGITS1_WC, + _NL_CTYPE_OUTDIGITS2_WC, + _NL_CTYPE_OUTDIGITS3_WC, + _NL_CTYPE_OUTDIGITS4_WC, + _NL_CTYPE_OUTDIGITS5_WC, + _NL_CTYPE_OUTDIGITS6_WC, + _NL_CTYPE_OUTDIGITS7_WC, + _NL_CTYPE_OUTDIGITS8_WC, + _NL_CTYPE_OUTDIGITS9_WC, + + _NL_TIME_CODESET, + _NL_TIME_WMON_1, + _NL_TIME_WMON_2, + _NL_TIME_WMON_3, + _NL_TIME_WMON_4, + _NL_TIME_WMON_5, + _NL_TIME_WMON_6, + _NL_TIME_WMON_7, + _NL_TIME_WMON_8, + _NL_TIME_WMON_9, + _NL_TIME_WMON_10, + _NL_TIME_WMON_11, + _NL_TIME_WMON_12, + _NL_TIME_WMONTH_1, + _NL_TIME_WMONTH_2, + _NL_TIME_WMONTH_3, + _NL_TIME_WMONTH_4, + _NL_TIME_WMONTH_5, + _NL_TIME_WMONTH_6, + _NL_TIME_WMONTH_7, + _NL_TIME_WMONTH_8, + _NL_TIME_WMONTH_9, + _NL_TIME_WMONTH_10, + _NL_TIME_WMONTH_11, + _NL_TIME_WMONTH_12, + _NL_TIME_WWDAY_1, + _NL_TIME_WWDAY_2, + _NL_TIME_WWDAY_3, + _NL_TIME_WWDAY_4, + _NL_TIME_WWDAY_5, + _NL_TIME_WWDAY_6, + _NL_TIME_WWDAY_7, + _NL_TIME_WWEEKDAY_1, + _NL_TIME_WWEEKDAY_2, + _NL_TIME_WWEEKDAY_3, + _NL_TIME_WWEEKDAY_4, + _NL_TIME_WWEEKDAY_5, + _NL_TIME_WWEEKDAY_6, + _NL_TIME_WWEEKDAY_7, + _NL_TIME_WT_FMT, + _NL_TIME_WD_FMT, + _NL_TIME_WD_T_FMT, + _NL_TIME_WAM_STR, + _NL_TIME_WPM_STR, + _NL_TIME_WDATE_FMT, + _NL_TIME_WT_FMT_AMPM, + _NL_TIME_WERA, + _NL_TIME_WERA_D_FMT, + _NL_TIME_WERA_D_T_FMT, + _NL_TIME_WERA_T_FMT, + _NL_TIME_WALT_DIGITS, + + _NL_NUMERIC_CODESET, + _NL_NUMERIC_GROUPING, + _NL_NUMERIC_DECIMAL_POINT_WC, + _NL_NUMERIC_THOUSANDS_SEP_WC, + + _NL_MONETARY_INT_CURR_SYMBOL, + _NL_MONETARY_CURRENCY_SYMBOL, + _NL_MONETARY_MON_DECIMAL_POINT, + _NL_MONETARY_MON_THOUSANDS_SEP, + _NL_MONETARY_MON_GROUPING, + _NL_MONETARY_POSITIVE_SIGN, + _NL_MONETARY_NEGATIVE_SIGN, + _NL_MONETARY_INT_FRAC_DIGITS, + _NL_MONETARY_FRAC_DIGITS, + _NL_MONETARY_P_CS_PRECEDES, + _NL_MONETARY_P_SEP_BY_SPACE, + _NL_MONETARY_N_CS_PRECEDES, + _NL_MONETARY_N_SEP_BY_SPACE, + _NL_MONETARY_P_SIGN_POSN, + _NL_MONETARY_N_SIGN_POSN, + _NL_MONETARY_INT_P_CS_PRECEDES, + _NL_MONETARY_INT_P_SEP_BY_SPACE, + _NL_MONETARY_INT_N_CS_PRECEDES, + _NL_MONETARY_INT_N_SEP_BY_SPACE, + _NL_MONETARY_INT_P_SIGN_POSN, + _NL_MONETARY_INT_N_SIGN_POSN, + _NL_MONETARY_CODESET, + _NL_MONETARY_WINT_CURR_SYMBOL, + _NL_MONETARY_WCURRENCY_SYMBOL, + _NL_MONETARY_WMON_DECIMAL_POINT, + _NL_MONETARY_WMON_THOUSANDS_SEP, + _NL_MONETARY_WPOSITIVE_SIGN, + _NL_MONETARY_WNEGATIVE_SIGN, + + _NL_MESSAGES_WYESEXPR, + _NL_MESSAGES_WNOEXPR, + _NL_MESSAGES_WYESSTR, + _NL_MESSAGES_WNOSTR, + + _NL_COLLATE_CODESET, + + /* This MUST be the last entry since it's used to check for an array + index in nl_langinfo(). It also must not exceed _NL_LOCALE_NAME_BASE. */ + _NL_LOCALE_EXTENDED_LAST_ENTRY + +#endif /* __HAVE_LOCALE_INFO_EXTENDED__ */ +#endif /* __HAVE_LOCALE_INFO__ */ + +}; + +/* As an extension, nl_langinfo can retrive the name of a locale + category, with this mapping from setlocale() category (other than + LC_ALL) to nl_item. */ +#define _NL_LOCALE_NAME_BASE 100000 +#if __GNU_VISIBLE +#define NL_LOCALE_NAME(category) (_NL_LOCALE_NAME_BASE + (category)) +#endif + +__BEGIN_DECLS +char *nl_langinfo (nl_item); +#if __POSIX_VISIBLE >= 200809 +char *nl_langinfo_l (nl_item, locale_t); +#endif +__END_DECLS + +#endif /* !_LANGINFO_H_ */ diff --git a/include/leb128.h b/include/leb128.h new file mode 100644 index 0000000..56016b0 --- /dev/null +++ b/include/leb128.h @@ -0,0 +1,136 @@ +/* Utilities for reading leb128 values. + Copyright (C) 2012-2015 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, write +to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* The functions defined here can be speed critical. + Since they are all pretty small we keep things simple and just define + them all as "static inline". + + WARNING: This file is used by GDB which is stuck at C90. :-( + Though it can use stdint.h, inttypes.h. + Therefore if you want to add support for "long long" you need + to wrap it in #ifdef CC_HAS_LONG_LONG. */ + +#ifndef LEB128_H +#define LEB128_H + +/* Get a definition for inline. */ +#include "ansidecl.h" + +/* Get a definition for NULL, size_t. */ +#include + +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* Decode the unsigned LEB128 constant at BUF into the variable pointed to + by R, and return the number of bytes read. + If we read off the end of the buffer, zero is returned, + and nothing is stored in R. + + Note: The result is an int instead of a pointer to the next byte to be + read to avoid const-vs-non-const problems. */ + +static inline size_t +read_uleb128_to_uint64 (const unsigned char *buf, const unsigned char *buf_end, + uint64_t *r) +{ + const unsigned char *p = buf; + unsigned int shift = 0; + uint64_t result = 0; + unsigned char byte; + + while (1) + { + if (p >= buf_end) + return 0; + + byte = *p++; + result |= ((uint64_t) (byte & 0x7f)) << shift; + if ((byte & 0x80) == 0) + break; + shift += 7; + } + + *r = result; + return p - buf; +} + +/* Decode the signed LEB128 constant at BUF into the variable pointed to + by R, and return the number of bytes read. + If we read off the end of the buffer, zero is returned, + and nothing is stored in R. + + Note: The result is an int instead of a pointer to the next byte to be + read to avoid const-vs-non-const problems. */ + +static inline size_t +read_sleb128_to_int64 (const unsigned char *buf, const unsigned char *buf_end, + int64_t *r) +{ + const unsigned char *p = buf; + unsigned int shift = 0; + int64_t result = 0; + unsigned char byte; + + while (1) + { + if (p >= buf_end) + return 0; + + byte = *p++; + result |= ((uint64_t) (byte & 0x7f)) << shift; + shift += 7; + if ((byte & 0x80) == 0) + break; + } + if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0) + result |= -(((uint64_t) 1) << shift); + + *r = result; + return p - buf; +} + +/* Return the number of bytes to read to skip past an LEB128 number in BUF. + If the end isn't found before reaching BUF_END, return zero. + + Note: The result is an int instead of a pointer to the next byte to be + read to avoid const-vs-non-const problems. */ + +static inline size_t +skip_leb128 (const unsigned char *buf, const unsigned char *buf_end) +{ + const unsigned char *p = buf; + unsigned char byte; + + while (1) + { + if (p == buf_end) + return 0; + + byte = *p++; + if ((byte & 0x80) == 0) + return p - buf; + } +} + +#endif /* LEB128_H */ diff --git a/include/libgen.h b/include/libgen.h new file mode 100644 index 0000000..414b5aa --- /dev/null +++ b/include/libgen.h @@ -0,0 +1,37 @@ +/* + * libgen.h - defined by XPG4 + */ + +#ifndef _LIBGEN_H_ +#define _LIBGEN_H_ + +#include "_ansi.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* There are two common basename variants. If you do NOT #include + and you do + + #define _GNU_SOURCE + #include + + you get the GNU version. Otherwise you get the POSIX versionfor which you + should #include i for the function prototype. POSIX requires that + #undef basename will still let you invoke the underlying function. However, + this also implies that the POSIX version is used in this case. That's made + sure here. */ +#undef basename +#define basename __xpg_basename +char *basename (char *) __asm__(__ASMNAME("basename")); +char *dirname (char *); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBGEN_H_ */ + diff --git a/include/libiberty.h b/include/libiberty.h new file mode 100644 index 0000000..a9c885f --- /dev/null +++ b/include/libiberty.h @@ -0,0 +1,739 @@ +/* Function declarations for libiberty. + + Copyright (C) 1997-2015 Free Software Foundation, Inc. + + Note - certain prototypes declared in this header file are for + functions whoes implementation copyright does not belong to the + FSF. Those prototypes are present in this file for reference + purposes only and their presence in this file should not construed + as an indication of ownership by the FSF of the implementation of + those functions in any way or form whatsoever. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. + + Written by Cygnus Support, 1994. + + The libiberty library provides a number of functions which are + missing on some operating systems. We do not declare those here, + to avoid conflicts with the system header files on operating + systems that do support those functions. In this file we only + declare those functions which are specific to libiberty. */ + +#ifndef LIBIBERTY_H +#define LIBIBERTY_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ansidecl.h" + +/* Get a definition for size_t. */ +#include +/* Get a definition for va_list. */ +#include + +#include + +/* If the OS supports it, ensure that the supplied stream is setup to + avoid any multi-threaded locking. Otherwise leave the FILE pointer + unchanged. If the stream is NULL do nothing. */ + +extern void unlock_stream (FILE *); + +/* If the OS supports it, ensure that the standard I/O streams, stdin, + stdout and stderr are setup to avoid any multi-threaded locking. + Otherwise do nothing. */ + +extern void unlock_std_streams (void); + +/* Open and return a FILE pointer. If the OS supports it, ensure that + the stream is setup to avoid any multi-threaded locking. Otherwise + return the FILE pointer unchanged. */ + +extern FILE *fopen_unlocked (const char *, const char *); +extern FILE *fdopen_unlocked (int, const char *); +extern FILE *freopen_unlocked (const char *, const char *, FILE *); + +/* Build an argument vector from a string. Allocates memory using + malloc. Use freeargv to free the vector. */ + +extern char **buildargv (const char *) ATTRIBUTE_MALLOC; + +/* Free a vector returned by buildargv. */ + +extern void freeargv (char **); + +/* Duplicate an argument vector. Allocates memory using malloc. Use + freeargv to free the vector. */ + +extern char **dupargv (char * const *) ATTRIBUTE_MALLOC; + +/* Expand "@file" arguments in argv. */ + +extern void expandargv (int *, char ***); + +/* Write argv to an @-file, inserting necessary quoting. */ + +extern int writeargv (char * const *, FILE *); + +/* Return the number of elements in argv. */ + +extern int countargv (char * const *); + +/* Return the last component of a path name. Note that we can't use a + prototype here because the parameter is declared inconsistently + across different systems, sometimes as "char *" and sometimes as + "const char *" */ + +/* HAVE_DECL_* is a three-state macro: undefined, 0 or 1. If it is + undefined, we haven't run the autoconf check so provide the + declaration without arguments. If it is 0, we checked and failed + to find the declaration so provide a fully prototyped one. If it + is 1, we found it so don't provide any declaration at all. */ +#if !HAVE_DECL_BASENAME +#if defined (__GNU_LIBRARY__ ) || defined (__linux__) \ + || defined (__FreeBSD__) || defined (__OpenBSD__) || defined (__NetBSD__) \ + || defined (__CYGWIN__) || defined (__CYGWIN32__) || defined (__MINGW32__) \ + || defined (__DragonFly__) || defined (HAVE_DECL_BASENAME) +extern char *basename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1); +#else +/* Do not allow basename to be used if there is no prototype seen. We + either need to use the above prototype or have one from + autoconf which would result in HAVE_DECL_BASENAME being set. */ +#define basename basename_cannot_be_used_without_a_prototype +#endif +#endif + +/* A well-defined basename () that is always compiled in. */ + +extern const char *lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1); + +/* Same, but assumes DOS semantics (drive name, backslash is also a + dir separator) regardless of host. */ + +extern const char *dos_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1); + +/* Same, but assumes Unix semantics (absolute paths always start with + a slash, only forward slash is accepted as dir separator) + regardless of host. */ + +extern const char *unix_lbasename (const char *) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1); + +/* A well-defined realpath () that is always compiled in. */ + +extern char *lrealpath (const char *); + +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using xmalloc. */ + +extern char *concat (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL; + +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using xmalloc. The first argument is + not one of the strings to be concatenated, but if not NULL is a + pointer to be freed after the new string is created, similar to the + way xrealloc works. */ + +extern char *reconcat (char *, const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL; + +/* Determine the length of concatenating an arbitrary number of + strings. You must pass NULL as the last argument of this function, + to terminate the list of strings. */ + +extern unsigned long concat_length (const char *, ...) ATTRIBUTE_SENTINEL; + +/* Concatenate an arbitrary number of strings into a SUPPLIED area of + memory. You must pass NULL as the last argument of this function, + to terminate the list of strings. The supplied memory is assumed + to be large enough. */ + +extern char *concat_copy (char *, const char *, ...) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_NONNULL(1) ATTRIBUTE_SENTINEL; + +/* Concatenate an arbitrary number of strings into a GLOBAL area of + memory. You must pass NULL as the last argument of this function, + to terminate the list of strings. The supplied memory is assumed + to be large enough. */ + +extern char *concat_copy2 (const char *, ...) ATTRIBUTE_RETURNS_NONNULL ATTRIBUTE_SENTINEL; + +/* This is the global area used by concat_copy2. */ + +extern char *libiberty_concat_ptr; + +/* Concatenate an arbitrary number of strings. You must pass NULL as + the last argument of this function, to terminate the list of + strings. Allocates memory using alloca. The arguments are + evaluated twice! */ +#define ACONCAT(ACONCAT_PARAMS) \ + (libiberty_concat_ptr = (char *) alloca (concat_length ACONCAT_PARAMS + 1), \ + concat_copy2 ACONCAT_PARAMS) + +/* Check whether two file descriptors refer to the same file. */ + +extern int fdmatch (int fd1, int fd2); + +/* Return the position of the first bit set in the argument. */ +/* Prototypes vary from system to system, so we only provide a + prototype on systems where we know that we need it. */ +#if defined (HAVE_DECL_FFS) && !HAVE_DECL_FFS +extern int ffs(int); +#endif + +/* Get the working directory. The result is cached, so don't call + chdir() between calls to getpwd(). */ + +extern char * getpwd (void); + +/* Get the current time. */ +/* Prototypes vary from system to system, so we only provide a + prototype on systems where we know that we need it. */ +#ifdef __MINGW32__ +/* Forward declaration to avoid #include . */ +struct timeval; +extern int gettimeofday (struct timeval *, void *); +#endif + +/* Get the amount of time the process has run, in microseconds. */ + +extern long get_run_time (void); + +/* Generate a relocated path to some installation directory. Allocates + return value using malloc. */ + +extern char *make_relative_prefix (const char *, const char *, + const char *) ATTRIBUTE_MALLOC; + +/* Generate a relocated path to some installation directory without + attempting to follow any soft links. Allocates + return value using malloc. */ + +extern char *make_relative_prefix_ignore_links (const char *, const char *, + const char *) ATTRIBUTE_MALLOC; + +/* Returns a pointer to a directory path suitable for creating temporary + files in. */ + +extern const char *choose_tmpdir (void) ATTRIBUTE_RETURNS_NONNULL; + +/* Choose a temporary directory to use for scratch files. */ + +extern char *choose_temp_base (void) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL; + +/* Return a temporary file name or NULL if unable to create one. */ + +extern char *make_temp_file (const char *) ATTRIBUTE_MALLOC; + +/* Remove a link to a file unless it is special. */ + +extern int unlink_if_ordinary (const char *); + +/* Allocate memory filled with spaces. Allocates using malloc. */ + +extern const char *spaces (int count); + +/* Return the maximum error number for which strerror will return a + string. */ + +extern int errno_max (void); + +/* Return the name of an errno value (e.g., strerrno (EINVAL) returns + "EINVAL"). */ + +extern const char *strerrno (int); + +/* Given the name of an errno value, return the value. */ + +extern int strtoerrno (const char *); + +/* ANSI's strerror(), but more robust. */ + +extern char *xstrerror (int) ATTRIBUTE_RETURNS_NONNULL; + +/* Return the maximum signal number for which strsignal will return a + string. */ + +extern int signo_max (void); + +/* Return a signal message string for a signal number + (e.g., strsignal (SIGHUP) returns something like "Hangup"). */ +/* This is commented out as it can conflict with one in system headers. + We still document its existence though. */ + +/*extern const char *strsignal (int);*/ + +/* Return the name of a signal number (e.g., strsigno (SIGHUP) returns + "SIGHUP"). */ + +extern const char *strsigno (int); + +/* Given the name of a signal, return its number. */ + +extern int strtosigno (const char *); + +/* Register a function to be run by xexit. Returns 0 on success. */ + +extern int xatexit (void (*fn) (void)); + +/* Exit, calling all the functions registered with xatexit. */ + +extern void xexit (int status) ATTRIBUTE_NORETURN; + +/* Set the program name used by xmalloc. */ + +extern void xmalloc_set_program_name (const char *); + +/* Report an allocation failure. */ +extern void xmalloc_failed (size_t) ATTRIBUTE_NORETURN; + +/* Allocate memory without fail. If malloc fails, this will print a + message to stderr (using the name set by xmalloc_set_program_name, + if any) and then call xexit. */ + +extern void *xmalloc (size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL; + +/* Reallocate memory without fail. This works like xmalloc. Note, + realloc type functions are not suitable for attribute malloc since + they may return the same address across multiple calls. */ + +extern void *xrealloc (void *, size_t) ATTRIBUTE_RETURNS_NONNULL; + +/* Allocate memory without fail and set it to zero. This works like + xmalloc. */ + +extern void *xcalloc (size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL; + +/* Copy a string into a memory buffer without fail. */ + +extern char *xstrdup (const char *) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL; + +/* Copy at most N characters from string into a buffer without fail. */ + +extern char *xstrndup (const char *, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL; + +/* Copy an existing memory buffer to a new memory buffer without fail. */ + +extern void *xmemdup (const void *, size_t, size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL; + +/* Physical memory routines. Return values are in BYTES. */ +extern double physmem_total (void); +extern double physmem_available (void); + +/* Compute the 32-bit CRC of a block of memory. */ +extern unsigned int xcrc32 (const unsigned char *, int, unsigned int); + +/* These macros provide a K&R/C89/C++-friendly way of allocating structures + with nice encapsulation. The XDELETE*() macros are technically + superfluous, but provided here for symmetry. Using them consistently + makes it easier to update client code to use different allocators such + as new/delete and new[]/delete[]. */ + +/* Scalar allocators. */ + +#define XALLOCA(T) ((T *) alloca (sizeof (T))) +#define XNEW(T) ((T *) xmalloc (sizeof (T))) +#define XCNEW(T) ((T *) xcalloc (1, sizeof (T))) +#define XDUP(T, P) ((T *) xmemdup ((P), sizeof (T), sizeof (T))) +#define XDELETE(P) free ((void*) (P)) + +/* Array allocators. */ + +#define XALLOCAVEC(T, N) ((T *) alloca (sizeof (T) * (N))) +#define XNEWVEC(T, N) ((T *) xmalloc (sizeof (T) * (N))) +#define XCNEWVEC(T, N) ((T *) xcalloc ((N), sizeof (T))) +#define XDUPVEC(T, P, N) ((T *) xmemdup ((P), sizeof (T) * (N), sizeof (T) * (N))) +#define XRESIZEVEC(T, P, N) ((T *) xrealloc ((void *) (P), sizeof (T) * (N))) +#define XDELETEVEC(P) free ((void*) (P)) + +/* Allocators for variable-sized structures and raw buffers. */ + +#define XALLOCAVAR(T, S) ((T *) alloca ((S))) +#define XNEWVAR(T, S) ((T *) xmalloc ((S))) +#define XCNEWVAR(T, S) ((T *) xcalloc (1, (S))) +#define XDUPVAR(T, P, S1, S2) ((T *) xmemdup ((P), (S1), (S2))) +#define XRESIZEVAR(T, P, S) ((T *) xrealloc ((P), (S))) + +/* Type-safe obstack allocator. */ + +#define XOBNEW(O, T) ((T *) obstack_alloc ((O), sizeof (T))) +#define XOBNEWVEC(O, T, N) ((T *) obstack_alloc ((O), sizeof (T) * (N))) +#define XOBNEWVAR(O, T, S) ((T *) obstack_alloc ((O), (S))) +#define XOBFINISH(O, T) ((T) obstack_finish ((O))) + +/* hex character manipulation routines */ + +#define _hex_array_size 256 +#define _hex_bad 99 +extern const unsigned char _hex_value[_hex_array_size]; +extern void hex_init (void); +#define hex_p(c) (hex_value (c) != _hex_bad) +/* If you change this, note well: Some code relies on side effects in + the argument being performed exactly once. */ +#define hex_value(c) ((unsigned int) _hex_value[(unsigned char) (c)]) + +/* Flags for pex_init. These are bits to be or'ed together. */ + +/* Record subprocess times, if possible. */ +#define PEX_RECORD_TIMES 0x1 + +/* Use pipes for communication between processes, if possible. */ +#define PEX_USE_PIPES 0x2 + +/* Save files used for communication between processes. */ +#define PEX_SAVE_TEMPS 0x4 + +/* Prepare to execute one or more programs, with standard output of + each program fed to standard input of the next. + FLAGS As above. + PNAME The name of the program to report in error messages. + TEMPBASE A base name to use for temporary files; may be NULL to + use a random name. + Returns NULL on error. */ + +extern struct pex_obj *pex_init (int flags, const char *pname, + const char *tempbase) ATTRIBUTE_RETURNS_NONNULL; + +/* Flags for pex_run. These are bits to be or'ed together. */ + +/* Last program in pipeline. Standard output of program goes to + OUTNAME, or, if OUTNAME is NULL, to standard output of caller. Do + not set this if you want to call pex_read_output. After this is + set, pex_run may no longer be called with the same struct + pex_obj. */ +#define PEX_LAST 0x1 + +/* Search for program in executable search path. */ +#define PEX_SEARCH 0x2 + +/* OUTNAME is a suffix. */ +#define PEX_SUFFIX 0x4 + +/* Send program's standard error to standard output. */ +#define PEX_STDERR_TO_STDOUT 0x8 + +/* Input file should be opened in binary mode. This flag is ignored + on Unix. */ +#define PEX_BINARY_INPUT 0x10 + +/* Output file should be opened in binary mode. This flag is ignored + on Unix. For proper behaviour PEX_BINARY_INPUT and + PEX_BINARY_OUTPUT have to match appropriately--i.e., a call using + PEX_BINARY_OUTPUT should be followed by a call using + PEX_BINARY_INPUT. */ +#define PEX_BINARY_OUTPUT 0x20 + +/* Capture stderr to a pipe. The output can be read by + calling pex_read_err and reading from the returned + FILE object. This flag may be specified only for + the last program in a pipeline. + + This flag is supported only on Unix and Windows. */ +#define PEX_STDERR_TO_PIPE 0x40 + +/* Capture stderr in binary mode. This flag is ignored + on Unix. */ +#define PEX_BINARY_ERROR 0x80 + +/* Append stdout to existing file instead of truncating it. */ +#define PEX_STDOUT_APPEND 0x100 + +/* Thes same as PEX_STDOUT_APPEND, but for STDERR. */ +#define PEX_STDERR_APPEND 0x200 + +/* Execute one program. Returns NULL on success. On error returns an + error string (typically just the name of a system call); the error + string is statically allocated. + + OBJ Returned by pex_init. + + FLAGS As above. + + EXECUTABLE The program to execute. + + ARGV NULL terminated array of arguments to pass to the program. + + OUTNAME Sets the output file name as follows: + + PEX_SUFFIX set (OUTNAME may not be NULL): + TEMPBASE parameter to pex_init not NULL: + Output file name is the concatenation of TEMPBASE + and OUTNAME. + TEMPBASE is NULL: + Output file name is a random file name ending in + OUTNAME. + PEX_SUFFIX not set: + OUTNAME not NULL: + Output file name is OUTNAME. + OUTNAME NULL, TEMPBASE not NULL: + Output file name is randomly chosen using + TEMPBASE. + OUTNAME NULL, TEMPBASE NULL: + Output file name is randomly chosen. + + If PEX_LAST is not set, the output file name is the + name to use for a temporary file holding stdout, if + any (there will not be a file if PEX_USE_PIPES is set + and the system supports pipes). If a file is used, it + will be removed when no longer needed unless + PEX_SAVE_TEMPS is set. + + If PEX_LAST is set, and OUTNAME is not NULL, standard + output is written to the output file name. The file + will not be removed. If PEX_LAST and PEX_SUFFIX are + both set, TEMPBASE may not be NULL. + + ERRNAME If not NULL, this is the name of a file to which + standard error is written. If NULL, standard error of + the program is standard error of the caller. + + ERR On an error return, *ERR is set to an errno value, or + to 0 if there is no relevant errno. +*/ + +extern const char *pex_run (struct pex_obj *obj, int flags, + const char *executable, char * const *argv, + const char *outname, const char *errname, + int *err); + +/* As for pex_run (), but takes an extra parameter to enable the + environment for the child process to be specified. + + ENV The environment for the child process, specified as + an array of character pointers. Each element of the + array should point to a string of the form VAR=VALUE, + with the exception of the last element which must be + a null pointer. +*/ + +extern const char *pex_run_in_environment (struct pex_obj *obj, int flags, + const char *executable, + char * const *argv, + char * const *env, + const char *outname, + const char *errname, int *err); + +/* Return a stream for a temporary file to pass to the first program + in the pipeline as input. The file name is chosen as for pex_run. + pex_run closes the file automatically; don't close it yourself. */ + +extern FILE *pex_input_file (struct pex_obj *obj, int flags, + const char *in_name); + +/* Return a stream for a pipe connected to the standard input of the + first program in the pipeline. You must have passed + `PEX_USE_PIPES' to `pex_init'. Close the returned stream + yourself. */ + +extern FILE *pex_input_pipe (struct pex_obj *obj, int binary); + +/* Read the standard output of the last program to be executed. + pex_run can not be called after this. BINARY should be non-zero if + the file should be opened in binary mode; this is ignored on Unix. + Returns NULL on error. Don't call fclose on the returned FILE; it + will be closed by pex_free. */ + +extern FILE *pex_read_output (struct pex_obj *, int binary); + +/* Read the standard error of the last program to be executed. + pex_run can not be called after this. BINARY should be non-zero if + the file should be opened in binary mode; this is ignored on Unix. + Returns NULL on error. Don't call fclose on the returned FILE; it + will be closed by pex_free. */ + +extern FILE *pex_read_err (struct pex_obj *, int binary); + +/* Return exit status of all programs in VECTOR. COUNT indicates the + size of VECTOR. The status codes in the vector are in the order of + the calls to pex_run. Returns 0 on error, 1 on success. */ + +extern int pex_get_status (struct pex_obj *, int count, int *vector); + +/* Return times of all programs in VECTOR. COUNT indicates the size + of VECTOR. struct pex_time is really just struct timeval, but that + is not portable to all systems. Returns 0 on error, 1 on + success. */ + +struct pex_time +{ + unsigned long user_seconds; + unsigned long user_microseconds; + unsigned long system_seconds; + unsigned long system_microseconds; +}; + +extern int pex_get_times (struct pex_obj *, int count, + struct pex_time *vector); + +/* Clean up a pex_obj. If you have not called pex_get_times or + pex_get_status, this will try to kill the subprocesses. */ + +extern void pex_free (struct pex_obj *); + +/* Just execute one program. Return value is as for pex_run. + FLAGS Combination of PEX_SEARCH and PEX_STDERR_TO_STDOUT. + EXECUTABLE As for pex_run. + ARGV As for pex_run. + PNAME As for pex_init. + OUTNAME As for pex_run when PEX_LAST is set. + ERRNAME As for pex_run. + STATUS Set to exit status on success. + ERR As for pex_run. +*/ + +extern const char *pex_one (int flags, const char *executable, + char * const *argv, const char *pname, + const char *outname, const char *errname, + int *status, int *err); + +/* pexecute and pwait are the old pexecute interface, still here for + backward compatibility. Don't use these for new code. Instead, + use pex_init/pex_run/pex_get_status/pex_free, or pex_one. */ + +/* Definitions used by the pexecute routine. */ + +#define PEXECUTE_FIRST 1 +#define PEXECUTE_LAST 2 +#define PEXECUTE_ONE (PEXECUTE_FIRST + PEXECUTE_LAST) +#define PEXECUTE_SEARCH 4 +#define PEXECUTE_VERBOSE 8 + +/* Execute a program. */ + +extern int pexecute (const char *, char * const *, const char *, + const char *, char **, char **, int); + +/* Wait for pexecute to finish. */ + +extern int pwait (int, int *, int); + +#if defined(HAVE_DECL_ASPRINTF) && !HAVE_DECL_ASPRINTF +/* Like sprintf but provides a pointer to malloc'd storage, which must + be freed by the caller. */ + +extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2; +#endif + +/* Like asprintf but allocates memory without fail. This works like + xmalloc. */ + +extern char *xasprintf (const char *, ...) ATTRIBUTE_MALLOC ATTRIBUTE_PRINTF_1; + +#if !HAVE_DECL_VASPRINTF +/* Like vsprintf but provides a pointer to malloc'd storage, which + must be freed by the caller. */ + +extern int vasprintf (char **, const char *, va_list) ATTRIBUTE_PRINTF(2,0); +#endif + +/* Like vasprintf but allocates memory without fail. This works like + xmalloc. */ + +extern char *xvasprintf (const char *, va_list) ATTRIBUTE_MALLOC ATTRIBUTE_PRINTF(1,0); + +#if defined(HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF +/* Like sprintf but prints at most N characters. */ +extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3; +#endif + +#if defined(HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF +/* Like vsprintf but prints at most N characters. */ +extern int vsnprintf (char *, size_t, const char *, va_list) ATTRIBUTE_PRINTF(3,0); +#endif + +#if defined (HAVE_DECL_STRNLEN) && !HAVE_DECL_STRNLEN +extern size_t strnlen (const char *, size_t); +#endif + +#if defined(HAVE_DECL_STRVERSCMP) && !HAVE_DECL_STRVERSCMP +/* Compare version strings. */ +extern int strverscmp (const char *, const char *); +#endif + +#if defined(HAVE_DECL_STRTOL) && !HAVE_DECL_STRTOL +extern long int strtol (const char *nptr, + char **endptr, int base); +#endif + +#if defined(HAVE_DECL_STRTOUL) && !HAVE_DECL_STRTOUL +extern unsigned long int strtoul (const char *nptr, + char **endptr, int base); +#endif + +#if defined(HAVE_LONG_LONG) && defined(HAVE_DECL_STRTOLL) && !HAVE_DECL_STRTOLL +__extension__ +extern long long int strtoll (const char *nptr, + char **endptr, int base); +#endif + +#if defined(HAVE_LONG_LONG) && defined(HAVE_DECL_STRTOULL) && !HAVE_DECL_STRTOULL +__extension__ +extern unsigned long long int strtoull (const char *nptr, + char **endptr, int base); +#endif + +#if defined(HAVE_DECL_STRVERSCMP) && !HAVE_DECL_STRVERSCMP +/* Compare version strings. */ +extern int strverscmp (const char *, const char *); +#endif + +/* Set the title of a process */ +extern void setproctitle (const char *name, ...); + +/* Increase stack limit if possible. */ +extern void stack_limit_increase (unsigned long); + +#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0])) + +/* Drastically simplified alloca configurator. If we're using GCC, + we use __builtin_alloca; otherwise we use the C alloca. The C + alloca is always available. You can override GCC by defining + USE_C_ALLOCA yourself. The canonical autoconf macro C_ALLOCA is + also set/unset as it is often used to indicate whether code needs + to call alloca(0). */ +extern void *C_alloca (size_t) ATTRIBUTE_MALLOC; +#undef alloca +#if GCC_VERSION >= 2000 && !defined USE_C_ALLOCA +# define alloca(x) __builtin_alloca(x) +# undef C_ALLOCA +# define ASTRDUP(X) \ + (__extension__ ({ const char *const libiberty_optr = (X); \ + const unsigned long libiberty_len = strlen (libiberty_optr) + 1; \ + char *const libiberty_nptr = (char *const) alloca (libiberty_len); \ + (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len); })) +#else +# define alloca(x) C_alloca(x) +# undef USE_C_ALLOCA +# define USE_C_ALLOCA 1 +# undef C_ALLOCA +# define C_ALLOCA 1 +extern const char *libiberty_optr; +extern char *libiberty_nptr; +extern unsigned long libiberty_len; +# define ASTRDUP(X) \ + (libiberty_optr = (X), \ + libiberty_len = strlen (libiberty_optr) + 1, \ + libiberty_nptr = (char *) alloca (libiberty_len), \ + (char *) memcpy (libiberty_nptr, libiberty_optr, libiberty_len)) +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* ! defined (LIBIBERTY_H) */ diff --git a/include/limits.h b/include/limits.h new file mode 100644 index 0000000..893f108 --- /dev/null +++ b/include/limits.h @@ -0,0 +1,147 @@ +#ifndef _LIBC_LIMITS_H_ +# define _LIBC_LIMITS_H_ 1 + +#include +#include +#include + +# ifdef _MB_LEN_MAX +# define MB_LEN_MAX _MB_LEN_MAX +# else +# define MB_LEN_MAX 1 +# endif + +/* Maximum number of positional arguments, if _WANT_IO_POS_ARGS. */ +# ifndef NL_ARGMAX +# define NL_ARGMAX 32 +# endif + +/* if do not have #include_next support, then we + have to define the limits here. */ +# if !defined __GNUC__ || __GNUC__ < 2 + +# ifndef _LIMITS_H +# define _LIMITS_H 1 + +# include + +/* Number of bits in a `char'. */ +# undef CHAR_BIT +# define CHAR_BIT 8 + +/* Minimum and maximum values a `signed char' can hold. */ +# undef SCHAR_MIN +# define SCHAR_MIN (-128) +# undef SCHAR_MAX +# define SCHAR_MAX 127 + +/* Maximum value an `unsigned char' can hold. (Minimum is 0). */ +# undef UCHAR_MAX +# define UCHAR_MAX 255 + +/* Minimum and maximum values a `char' can hold. */ +# ifdef __CHAR_UNSIGNED__ +# undef CHAR_MIN +# define CHAR_MIN 0 +# undef CHAR_MAX +# define CHAR_MAX 255 +# else +# undef CHAR_MIN +# define CHAR_MIN (-128) +# undef CHAR_MAX +# define CHAR_MAX 127 +# endif + +/* Minimum and maximum values a `signed short int' can hold. */ +# undef SHRT_MIN +/* For the sake of 16 bit hosts, we may not use -32768 */ +# define SHRT_MIN (-32767-1) +# undef SHRT_MAX +# define SHRT_MAX 32767 + +/* Maximum value an `unsigned short int' can hold. (Minimum is 0). */ +# undef USHRT_MAX +# define USHRT_MAX 65535 + +/* Minimum and maximum values a `signed int' can hold. */ +# ifndef __INT_MAX__ +# define __INT_MAX__ 2147483647 +# endif +# undef INT_MIN +# define INT_MIN (-INT_MAX-1) +# undef INT_MAX +# define INT_MAX __INT_MAX__ + +/* Maximum value an `unsigned int' can hold. (Minimum is 0). */ +# undef UINT_MAX +# define UINT_MAX (INT_MAX * 2U + 1) + +/* Minimum and maximum values a `signed long int' can hold. + (Same as `int'). */ +# ifndef __LONG_MAX__ +# if defined (__alpha__) || (defined (__sparc__) && defined(__arch64__)) || defined (__sparcv9) +# define __LONG_MAX__ 9223372036854775807L +# else +# define __LONG_MAX__ 2147483647L +# endif /* __alpha__ || sparc64 */ +# endif +# undef LONG_MIN +# define LONG_MIN (-LONG_MAX-1) +# undef LONG_MAX +# define LONG_MAX __LONG_MAX__ + +/* Maximum value an `unsigned long int' can hold. (Minimum is 0). */ +# undef ULONG_MAX +# define ULONG_MAX (LONG_MAX * 2UL + 1) + +# ifndef __LONG_LONG_MAX__ +# define __LONG_LONG_MAX__ 9223372036854775807LL +# endif + +# if __ISO_C_VISIBLE >= 1999 +/* Minimum and maximum values a `signed long long int' can hold. */ +# undef LLONG_MIN +# define LLONG_MIN (-LLONG_MAX-1) +# undef LLONG_MAX +# define LLONG_MAX __LONG_LONG_MAX__ + +/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ +# undef ULLONG_MAX +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1) +# endif + +# if __GNU_VISIBLE +/* Minimum and maximum values a `signed long long int' can hold. */ +# undef LONG_LONG_MIN +# define LONG_LONG_MIN (-LONG_LONG_MAX-1) +# undef LONG_LONG_MAX +# define LONG_LONG_MAX __LONG_LONG_MAX__ + +/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ +# undef ULONG_LONG_MAX +# define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1) +# endif + +# endif /* _LIMITS_H */ +# endif /* GCC 2. */ + +#endif /* !_LIBC_LIMITS_H_ */ + +#if defined __GNUC__ && !defined _GCC_LIMITS_H_ +/* `_GCC_LIMITS_H_' is what GCC's file defines. */ +# include_next +#endif /* __GNUC__ && !_GCC_LIMITS_H_ */ + +#ifndef _POSIX2_RE_DUP_MAX +/* The maximum number of repeated occurrences of a regular expression + * permitted when using the interval notation `\{M,N\}'. */ +#define _POSIX2_RE_DUP_MAX 255 +#endif /* _POSIX2_RE_DUP_MAX */ + +#ifndef ARG_MAX +#define ARG_MAX 4096 +#endif + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif diff --git a/include/locale.h b/include/locale.h new file mode 100644 index 0000000..ec7f861 --- /dev/null +++ b/include/locale.h @@ -0,0 +1,96 @@ +/* + locale.h + Values appropriate for the formatting of monetary and other + numberic quantities. +*/ + +#ifndef _LOCALE_H_ +#define _LOCALE_H_ + +#include "_ansi.h" +#include + +#define __need_NULL +#include + +#define LC_ALL 0 +#define LC_COLLATE 1 +#define LC_CTYPE 2 +#define LC_MONETARY 3 +#define LC_NUMERIC 4 +#define LC_TIME 5 +#define LC_MESSAGES 6 + +#if __POSIX_VISIBLE >= 200809 || defined (_LIBC) + +#include + +#define LC_ALL_MASK (1 << LC_ALL) +#define LC_COLLATE_MASK (1 << LC_COLLATE) +#define LC_CTYPE_MASK (1 << LC_CTYPE) +#define LC_MONETARY_MASK (1 << LC_MONETARY) +#define LC_NUMERIC_MASK (1 << LC_NUMERIC) +#define LC_TIME_MASK (1 << LC_TIME) +#define LC_MESSAGES_MASK (1 << LC_MESSAGES) + +#define LC_GLOBAL_LOCALE ((struct __locale_t *) -1) + +#endif /* __POSIX_VISIBLE >= 200809 */ + +_BEGIN_STD_C + +struct lconv +{ + char *decimal_point; + char *thousands_sep; + char *grouping; + char *int_curr_symbol; + char *currency_symbol; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + char int_n_cs_precedes; + char int_n_sep_by_space; + char int_n_sign_posn; + char int_p_cs_precedes; + char int_p_sep_by_space; + char int_p_sign_posn; +}; + +struct _reent; +char *_setlocale_r (struct _reent *, int, const char *); +struct lconv *_localeconv_r (struct _reent *); + +struct __locale_t *_newlocale_r (struct _reent *, int, const char *, + struct __locale_t *); +void _freelocale_r (struct _reent *, struct __locale_t *); +struct __locale_t *_duplocale_r (struct _reent *, struct __locale_t *); +struct __locale_t *_uselocale_r (struct _reent *, struct __locale_t *); + +#ifndef _REENT_ONLY + +char *setlocale (int, const char *); +struct lconv *localeconv (void); + +#if __POSIX_VISIBLE >= 200809 +locale_t newlocale (int, const char *, locale_t); +void freelocale (locale_t); +locale_t duplocale (locale_t); +locale_t uselocale (locale_t); +#endif /* __POSIX_VISIBLE >= 200809 */ + +#endif /* _REENT_ONLY */ + +_END_STD_C + +#endif /* _LOCALE_H_ */ diff --git a/include/longlong.h b/include/longlong.h new file mode 100644 index 0000000..b25a594 --- /dev/null +++ b/include/longlong.h @@ -0,0 +1,1758 @@ +/* longlong.h -- definitions for mixed size 32/64 bit arithmetic. + Copyright (C) 1991-2015 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* You have to define the following before including this file: + + UWtype -- An unsigned type, default type for operations (typically a "word") + UHWtype -- An unsigned type, at least half the size of UWtype. + UDWtype -- An unsigned type, at least twice as large a UWtype + W_TYPE_SIZE -- size in bits of UWtype + + UQItype -- Unsigned 8 bit type. + SItype, USItype -- Signed and unsigned 32 bit types. + DItype, UDItype -- Signed and unsigned 64 bit types. + + On a 32 bit machine UWtype should typically be USItype; + on a 64 bit machine, UWtype should typically be UDItype. */ + +#define __BITS4 (W_TYPE_SIZE / 4) +#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) +#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) +#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) + +#ifndef W_TYPE_SIZE +#define W_TYPE_SIZE 32 +#define UWtype USItype +#define UHWtype USItype +#define UDWtype UDItype +#endif + +/* Used in glibc only. */ +#ifndef attribute_hidden +#define attribute_hidden +#endif + +extern const UQItype __clz_tab[256] attribute_hidden; + +/* Define auxiliary asm macros. + + 1) umul_ppmm(high_prod, low_prod, multiplier, multiplicand) multiplies two + UWtype integers MULTIPLIER and MULTIPLICAND, and generates a two UWtype + word product in HIGH_PROD and LOW_PROD. + + 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a + UDWtype product. This is just a variant of umul_ppmm. + + 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, + denominator) divides a UDWtype, composed by the UWtype integers + HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient + in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less + than DENOMINATOR for correct operation. If, in addition, the most + significant bit of DENOMINATOR must be 1, then the pre-processor symbol + UDIV_NEEDS_NORMALIZATION is defined to 1. + + 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator, + denominator). Like udiv_qrnnd but the numbers are signed. The quotient + is rounded towards 0. + + 5) count_leading_zeros(count, x) counts the number of zero-bits from the + msb to the first nonzero bit in the UWtype X. This is the number of + steps X needs to be shifted left to set the msb. Undefined for X == 0, + unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value. + + 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts + from the least significant end. + + 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, + high_addend_2, low_addend_2) adds two UWtype integers, composed by + HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2 + respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow + (i.e. carry out) is not stored anywhere, and is lost. + + 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend, + high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers, + composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and + LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE + and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, + and is lost. + + If any of these macros are left undefined for a particular CPU, + C macros are used. */ + +/* The CPUs come in alphabetical order below. + + Please add support for more CPUs here, or improve the current support + for the CPUs below! + (E.g. WE32100, IBM360.) */ + +#if defined (__GNUC__) && !defined (NO_ASM) + +/* We sometimes need to clobber "cc" with gcc2, but that would not be + understood by gcc1. Use cpp to avoid major code duplication. */ +#if __GNUC__ < 2 +#define __CLOBBER_CC +#define __AND_CLOBBER_CC +#else /* __GNUC__ >= 2 */ +#define __CLOBBER_CC : "cc" +#define __AND_CLOBBER_CC , "cc" +#endif /* __GNUC__ < 2 */ + +#if defined (__aarch64__) + +#if W_TYPE_SIZE == 32 +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* W_TYPE_SIZE == 32 */ + +#if W_TYPE_SIZE == 64 +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clzll (X)) +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctzll (X)) +#define COUNT_LEADING_ZEROS_0 64 +#endif /* W_TYPE_SIZE == 64 */ + +#endif /* __aarch64__ */ + +#if defined (__alpha) && W_TYPE_SIZE == 64 +/* There is a bug in g++ before version 5 that + errors on __builtin_alpha_umulh. */ +#if !defined(__cplusplus) || __GNUC__ >= 5 +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + UDItype __m0 = (m0), __m1 = (m1); \ + (ph) = __builtin_alpha_umulh (__m0, __m1); \ + (pl) = __m0 * __m1; \ + } while (0) +#define UMUL_TIME 46 +#endif /* !c++ */ +#ifndef LONGLONG_STANDALONE +#define udiv_qrnnd(q, r, n1, n0, d) \ + do { UDItype __r; \ + (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ + (r) = __r; \ + } while (0) +extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); +#define UDIV_TIME 220 +#endif /* LONGLONG_STANDALONE */ +#ifdef __alpha_cix__ +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzl (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X)) +#define COUNT_LEADING_ZEROS_0 64 +#else +#define count_leading_zeros(COUNT,X) \ + do { \ + UDItype __xr = (X), __t, __a; \ + __t = __builtin_alpha_cmpbge (0, __xr); \ + __a = __clz_tab[__t ^ 0xff] - 1; \ + __t = __builtin_alpha_extbl (__xr, __a); \ + (COUNT) = 64 - (__clz_tab[__t] + __a*8); \ + } while (0) +#define count_trailing_zeros(COUNT,X) \ + do { \ + UDItype __xr = (X), __t, __a; \ + __t = __builtin_alpha_cmpbge (0, __xr); \ + __t = ~__t & -~__t; \ + __a = ((__t & 0xCC) != 0) * 2; \ + __a += ((__t & 0xF0) != 0) * 4; \ + __a += ((__t & 0xAA) != 0); \ + __t = __builtin_alpha_extbl (__xr, __a); \ + __a <<= 3; \ + __t &= -__t; \ + __a += ((__t & 0xCC) != 0) * 2; \ + __a += ((__t & 0xF0) != 0) * 4; \ + __a += ((__t & 0xAA) != 0); \ + (COUNT) = __a; \ + } while (0) +#endif /* __alpha_cix__ */ +#endif /* __alpha */ + +#if defined (__arc__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add.f %1, %4, %5\n\tadc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ + "rICal" ((USItype) (bh)), \ + "%r" ((USItype) (al)), \ + "rICal" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ + "rICal" ((USItype) (bh)), \ + "r" ((USItype) (al)), \ + "rICal" ((USItype) (bl))) + +#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) +#ifdef __ARC_NORM__ +#define count_leading_zeros(count, x) \ + do \ + { \ + SItype c_; \ + \ + __asm__ ("norm.f\t%0,%1\n\tmov.mi\t%0,-1" : "=r" (c_) : "r" (x) : "cc");\ + (count) = c_ + 1; \ + } \ + while (0) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* __ARC_NORM__ */ +#endif /* __arc__ */ + +#if defined (__arm__) && (defined (__thumb2__) || !defined (__thumb__)) \ + && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("adds %1, %4, %5\n\tadc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "%r" ((USItype) (al)), \ + "rI" ((USItype) (bl)) __CLOBBER_CC) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subs %1, %4, %5\n\tsbc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "r" ((USItype) (al)), \ + "rI" ((USItype) (bl)) __CLOBBER_CC) +# if defined(__ARM_ARCH_2__) || defined(__ARM_ARCH_2A__) \ + || defined(__ARM_ARCH_3__) +# define umul_ppmm(xh, xl, a, b) \ + do { \ + register USItype __t0, __t1, __t2; \ + __asm__ ("%@ Inlined umul_ppmm\n" \ + " mov %2, %5, lsr #16\n" \ + " mov %0, %6, lsr #16\n" \ + " bic %3, %5, %2, lsl #16\n" \ + " bic %4, %6, %0, lsl #16\n" \ + " mul %1, %3, %4\n" \ + " mul %4, %2, %4\n" \ + " mul %3, %0, %3\n" \ + " mul %0, %2, %0\n" \ + " adds %3, %4, %3\n" \ + " addcs %0, %0, #65536\n" \ + " adds %1, %1, %3, lsl #16\n" \ + " adc %0, %0, %3, lsr #16" \ + : "=&r" ((USItype) (xh)), \ + "=r" ((USItype) (xl)), \ + "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \ + : "r" ((USItype) (a)), \ + "r" ((USItype) (b)) __CLOBBER_CC ); \ + } while (0) +# define UMUL_TIME 20 +# else +# define umul_ppmm(xh, xl, a, b) \ + do { \ + /* Generate umull, under compiler control. */ \ + register UDItype __t0 = (UDItype)(USItype)(a) * (USItype)(b); \ + (xl) = (USItype)__t0; \ + (xh) = (USItype)(__t0 >> 32); \ + } while (0) +# define UMUL_TIME 3 +# endif +# define UDIV_TIME 100 +#endif /* __arm__ */ + +#if defined(__arm__) +/* Let gcc decide how best to implement count_leading_zeros. */ +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif + +#if defined (__AVR__) + +#if W_TYPE_SIZE == 16 +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctz (X)) +#define COUNT_LEADING_ZEROS_0 16 +#endif /* W_TYPE_SIZE == 16 */ + +#if W_TYPE_SIZE == 32 +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzl (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* W_TYPE_SIZE == 32 */ + +#if W_TYPE_SIZE == 64 +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzll (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzll (X)) +#define COUNT_LEADING_ZEROS_0 64 +#endif /* W_TYPE_SIZE == 64 */ + +#endif /* defined (__AVR__) */ + +#if defined (__CRIS__) + +#if __CRIS_arch_version >= 3 +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* __CRIS_arch_version >= 3 */ + +#if __CRIS_arch_version >= 8 +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#endif /* __CRIS_arch_version >= 8 */ + +#if __CRIS_arch_version >= 10 +#define __umulsidi3(u,v) ((UDItype)(USItype) (u) * (UDItype)(USItype) (v)) +#else +#define __umulsidi3 __umulsidi3 +extern UDItype __umulsidi3 (USItype, USItype); +#endif /* __CRIS_arch_version >= 10 */ + +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __x = __umulsidi3 (u, v); \ + (w0) = (USItype) (__x); \ + (w1) = (USItype) (__x >> 32); \ + } while (0) + +/* FIXME: defining add_ssaaaa and sub_ddmmss should be advantageous for + DFmode ("double" intrinsics, avoiding two of the three insns handling + carry), but defining them as open-code C composing and doing the + operation in DImode (UDImode) shows that the DImode needs work: + register pressure from requiring neighboring registers and the + traffic to and from them come to dominate, in the 4.7 series. */ + +#endif /* defined (__CRIS__) */ + +#if defined (__hppa) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rM" ((USItype) (ah)), \ + "rM" ((USItype) (bh)), \ + "%rM" ((USItype) (al)), \ + "rM" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rM" ((USItype) (ah)), \ + "rM" ((USItype) (bh)), \ + "rM" ((USItype) (al)), \ + "rM" ((USItype) (bl))) +#if defined (_PA_RISC1_1) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + union \ + { \ + UDItype __f; \ + struct {USItype __w1, __w0;} __w1w0; \ + } __t; \ + __asm__ ("xmpyu %1,%2,%0" \ + : "=x" (__t.__f) \ + : "x" ((USItype) (u)), \ + "x" ((USItype) (v))); \ + (w1) = __t.__w1w0.__w1; \ + (w0) = __t.__w1w0.__w0; \ + } while (0) +#define UMUL_TIME 8 +#else +#define UMUL_TIME 30 +#endif +#define UDIV_TIME 40 +#define count_leading_zeros(count, x) \ + do { \ + USItype __tmp; \ + __asm__ ( \ + "ldi 1,%0\n" \ +" extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \ +" extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n"\ +" ldo 16(%0),%0 ; Yes. Perform add.\n" \ +" extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \ +" extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n"\ +" ldo 8(%0),%0 ; Yes. Perform add.\n" \ +" extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \ +" extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n"\ +" ldo 4(%0),%0 ; Yes. Perform add.\n" \ +" extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \ +" extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\ +" ldo 2(%0),%0 ; Yes. Perform add.\n" \ +" extru %1,30,1,%1 ; Extract bit 1.\n" \ +" sub %0,%1,%0 ; Subtract it.\n" \ + : "=r" (count), "=r" (__tmp) : "1" (x)); \ + } while (0) +#endif + +#if (defined (__i370__) || defined (__s390__) || defined (__mvs__)) && W_TYPE_SIZE == 32 +#if !defined (__zarch__) +#define smul_ppmm(xh, xl, m0, m1) \ + do { \ + union {DItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __x; \ + __asm__ ("lr %N0,%1\n\tmr %0,%2" \ + : "=&r" (__x.__ll) \ + : "r" (m0), "r" (m1)); \ + (xh) = __x.__i.__h; (xl) = __x.__i.__l; \ + } while (0) +#define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + union {DItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __x; \ + __x.__i.__h = n1; __x.__i.__l = n0; \ + __asm__ ("dr %0,%2" \ + : "=r" (__x.__ll) \ + : "0" (__x.__ll), "r" (d)); \ + (q) = __x.__i.__l; (r) = __x.__i.__h; \ + } while (0) +#else +#define smul_ppmm(xh, xl, m0, m1) \ + do { \ + register SItype __r0 __asm__ ("0"); \ + register SItype __r1 __asm__ ("1") = (m0); \ + \ + __asm__ ("mr\t%%r0,%3" \ + : "=r" (__r0), "=r" (__r1) \ + : "r" (__r1), "r" (m1)); \ + (xh) = __r0; (xl) = __r1; \ + } while (0) + +#define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + register SItype __r0 __asm__ ("0") = (n1); \ + register SItype __r1 __asm__ ("1") = (n0); \ + \ + __asm__ ("dr\t%%r0,%4" \ + : "=r" (__r0), "=r" (__r1) \ + : "r" (__r0), "r" (__r1), "r" (d)); \ + (q) = __r1; (r) = __r0; \ + } while (0) +#endif /* __zarch__ */ +#endif + +#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mul{l} %3" \ + : "=a" ((USItype) (w0)), \ + "=d" ((USItype) (w1)) \ + : "%0" ((USItype) (u)), \ + "rm" ((USItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, dv) \ + __asm__ ("div{l} %4" \ + : "=a" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "rm" ((USItype) (dv))) +#define count_leading_zeros(count, x) ((count) = __builtin_clz (x)) +#define count_trailing_zeros(count, x) ((count) = __builtin_ctz (x)) +#define UMUL_TIME 40 +#define UDIV_TIME 40 +#endif /* 80x86 */ + +#if defined (__x86_64__) && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}" \ + : "=r" ((UDItype) (sh)), \ + "=&r" ((UDItype) (sl)) \ + : "%0" ((UDItype) (ah)), \ + "rme" ((UDItype) (bh)), \ + "%1" ((UDItype) (al)), \ + "rme" ((UDItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}" \ + : "=r" ((UDItype) (sh)), \ + "=&r" ((UDItype) (sl)) \ + : "0" ((UDItype) (ah)), \ + "rme" ((UDItype) (bh)), \ + "1" ((UDItype) (al)), \ + "rme" ((UDItype) (bl))) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mul{q} %3" \ + : "=a" ((UDItype) (w0)), \ + "=d" ((UDItype) (w1)) \ + : "%0" ((UDItype) (u)), \ + "rm" ((UDItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, dv) \ + __asm__ ("div{q} %4" \ + : "=a" ((UDItype) (q)), \ + "=d" ((UDItype) (r)) \ + : "0" ((UDItype) (n0)), \ + "1" ((UDItype) (n1)), \ + "rm" ((UDItype) (dv))) +#define count_leading_zeros(count, x) ((count) = __builtin_clzll (x)) +#define count_trailing_zeros(count, x) ((count) = __builtin_ctzll (x)) +#define UMUL_TIME 40 +#define UDIV_TIME 40 +#endif /* x86_64 */ + +#if defined (__i960__) && W_TYPE_SIZE == 32 +#define umul_ppmm(w1, w0, u, v) \ + ({union {UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + __asm__ ("emul %2,%1,%0" \ + : "=d" (__xx.__ll) \ + : "%dI" ((USItype) (u)), \ + "dI" ((USItype) (v))); \ + (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) +#define __umulsidi3(u, v) \ + ({UDItype __w; \ + __asm__ ("emul %2,%1,%0" \ + : "=d" (__w) \ + : "%dI" ((USItype) (u)), \ + "dI" ((USItype) (v))); \ + __w; }) +#endif /* __i960__ */ + +#if defined (__ia64) && W_TYPE_SIZE == 64 +/* This form encourages gcc (pre-release 3.4 at least) to emit predicated + "sub r=r,r" and "sub r=r,r,1", giving a 2 cycle latency. The generic + code using "al>= _c; \ + if (_x >= 1 << 4) \ + _x >>= 4, _c += 4; \ + if (_x >= 1 << 2) \ + _x >>= 2, _c += 2; \ + _c += _x >> 1; \ + (count) = W_TYPE_SIZE - 1 - _c; \ + } while (0) +/* similar to what gcc does for __builtin_ffs, but 0 based rather than 1 + based, and we don't need a special case for x==0 here */ +#define count_trailing_zeros(count, x) \ + do { \ + UWtype __ctz_x = (x); \ + __asm__ ("popcnt %0 = %1" \ + : "=r" (count) \ + : "r" ((__ctz_x-1) & ~__ctz_x)); \ + } while (0) +#define UMUL_TIME 14 +#endif + +#if defined (__M32R__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + /* The cmp clears the condition bit. */ \ + __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "r" ((USItype) (bl)) \ + : "cbit") +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + /* The cmp clears the condition bit. */ \ + __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "r" ((USItype) (bl)) \ + : "cbit") +#endif /* __M32R__ */ + +#if defined (__mc68000__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \ + : "=d" ((USItype) (sh)), \ + "=&d" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "d" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \ + : "=d" ((USItype) (sh)), \ + "=&d" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "d" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + +/* The '020, '030, '040, '060 and CPU32 have 32x32->64 and 64/32->32q-32r. */ +#if (defined (__mc68020__) && !defined (__mc68060__)) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mulu%.l %3,%1:%0" \ + : "=d" ((USItype) (w0)), \ + "=d" ((USItype) (w1)) \ + : "%0" ((USItype) (u)), \ + "dmi" ((USItype) (v))) +#define UMUL_TIME 45 +#define udiv_qrnnd(q, r, n1, n0, d) \ + __asm__ ("divu%.l %4,%1:%0" \ + : "=d" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "dmi" ((USItype) (d))) +#define UDIV_TIME 90 +#define sdiv_qrnnd(q, r, n1, n0, d) \ + __asm__ ("divs%.l %4,%1:%0" \ + : "=d" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "dmi" ((USItype) (d))) + +#elif defined (__mcoldfire__) /* not mc68020 */ + +#define umul_ppmm(xh, xl, a, b) \ + __asm__ ("| Inlined umul_ppmm\n" \ + " move%.l %2,%/d0\n" \ + " move%.l %3,%/d1\n" \ + " move%.l %/d0,%/d2\n" \ + " swap %/d0\n" \ + " move%.l %/d1,%/d3\n" \ + " swap %/d1\n" \ + " move%.w %/d2,%/d4\n" \ + " mulu %/d3,%/d4\n" \ + " mulu %/d1,%/d2\n" \ + " mulu %/d0,%/d3\n" \ + " mulu %/d0,%/d1\n" \ + " move%.l %/d4,%/d0\n" \ + " clr%.w %/d0\n" \ + " swap %/d0\n" \ + " add%.l %/d0,%/d2\n" \ + " add%.l %/d3,%/d2\n" \ + " jcc 1f\n" \ + " add%.l %#65536,%/d1\n" \ + "1: swap %/d2\n" \ + " moveq %#0,%/d0\n" \ + " move%.w %/d2,%/d0\n" \ + " move%.w %/d4,%/d2\n" \ + " move%.l %/d2,%1\n" \ + " add%.l %/d1,%/d0\n" \ + " move%.l %/d0,%0" \ + : "=g" ((USItype) (xh)), \ + "=g" ((USItype) (xl)) \ + : "g" ((USItype) (a)), \ + "g" ((USItype) (b)) \ + : "d0", "d1", "d2", "d3", "d4") +#define UMUL_TIME 100 +#define UDIV_TIME 400 +#else /* not ColdFire */ +/* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX. */ +#define umul_ppmm(xh, xl, a, b) \ + __asm__ ("| Inlined umul_ppmm\n" \ + " move%.l %2,%/d0\n" \ + " move%.l %3,%/d1\n" \ + " move%.l %/d0,%/d2\n" \ + " swap %/d0\n" \ + " move%.l %/d1,%/d3\n" \ + " swap %/d1\n" \ + " move%.w %/d2,%/d4\n" \ + " mulu %/d3,%/d4\n" \ + " mulu %/d1,%/d2\n" \ + " mulu %/d0,%/d3\n" \ + " mulu %/d0,%/d1\n" \ + " move%.l %/d4,%/d0\n" \ + " eor%.w %/d0,%/d0\n" \ + " swap %/d0\n" \ + " add%.l %/d0,%/d2\n" \ + " add%.l %/d3,%/d2\n" \ + " jcc 1f\n" \ + " add%.l %#65536,%/d1\n" \ + "1: swap %/d2\n" \ + " moveq %#0,%/d0\n" \ + " move%.w %/d2,%/d0\n" \ + " move%.w %/d4,%/d2\n" \ + " move%.l %/d2,%1\n" \ + " add%.l %/d1,%/d0\n" \ + " move%.l %/d0,%0" \ + : "=g" ((USItype) (xh)), \ + "=g" ((USItype) (xl)) \ + : "g" ((USItype) (a)), \ + "g" ((USItype) (b)) \ + : "d0", "d1", "d2", "d3", "d4") +#define UMUL_TIME 100 +#define UDIV_TIME 400 + +#endif /* not mc68020 */ + +/* The '020, '030, '040 and '060 have bitfield insns. + cpu32 disguises as a 68020, but lacks them. */ +#if defined (__mc68020__) && !defined (__mcpu32__) +#define count_leading_zeros(count, x) \ + __asm__ ("bfffo %1{%b2:%b2},%0" \ + : "=d" ((USItype) (count)) \ + : "od" ((USItype) (x)), "n" (0)) +/* Some ColdFire architectures have a ff1 instruction supported via + __builtin_clz. */ +#elif defined (__mcfisaaplus__) || defined (__mcfisac__) +#define count_leading_zeros(count,x) ((count) = __builtin_clz (x)) +#define COUNT_LEADING_ZEROS_0 32 +#endif +#endif /* mc68000 */ + +#if defined (__m88000__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rJ" ((USItype) (ah)), \ + "rJ" ((USItype) (bh)), \ + "%rJ" ((USItype) (al)), \ + "rJ" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rJ" ((USItype) (ah)), \ + "rJ" ((USItype) (bh)), \ + "rJ" ((USItype) (al)), \ + "rJ" ((USItype) (bl))) +#define count_leading_zeros(count, x) \ + do { \ + USItype __cbtmp; \ + __asm__ ("ff1 %0,%1" \ + : "=r" (__cbtmp) \ + : "r" ((USItype) (x))); \ + (count) = __cbtmp ^ 31; \ + } while (0) +#define COUNT_LEADING_ZEROS_0 63 /* sic */ +#if defined (__mc88110__) +#define umul_ppmm(wh, wl, u, v) \ + do { \ + union {UDItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __xx; \ + __asm__ ("mulu.d %0,%1,%2" \ + : "=r" (__xx.__ll) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))); \ + (wh) = __xx.__i.__h; \ + (wl) = __xx.__i.__l; \ + } while (0) +#define udiv_qrnnd(q, r, n1, n0, d) \ + ({union {UDItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __xx; \ + USItype __q; \ + __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ + __asm__ ("divu.d %0,%1,%2" \ + : "=r" (__q) \ + : "r" (__xx.__ll), \ + "r" ((USItype) (d))); \ + (r) = (n0) - __q * (d); (q) = __q; }) +#define UMUL_TIME 5 +#define UDIV_TIME 25 +#else +#define UMUL_TIME 17 +#define UDIV_TIME 150 +#endif /* __mc88110__ */ +#endif /* __m88000__ */ + +#if defined (__mn10300__) +# if defined (__AM33__) +# define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +# define umul_ppmm(w1, w0, u, v) \ + asm("mulu %3,%2,%1,%0" : "=r"(w0), "=r"(w1) : "r"(u), "r"(v)) +# define smul_ppmm(w1, w0, u, v) \ + asm("mul %3,%2,%1,%0" : "=r"(w0), "=r"(w1) : "r"(u), "r"(v)) +# else +# define umul_ppmm(w1, w0, u, v) \ + asm("nop; nop; mulu %3,%0" : "=d"(w0), "=z"(w1) : "%0"(u), "d"(v)) +# define smul_ppmm(w1, w0, u, v) \ + asm("nop; nop; mul %3,%0" : "=d"(w0), "=z"(w1) : "%0"(u), "d"(v)) +# endif +# define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + DWunion __s, __a, __b; \ + __a.s.low = (al); __a.s.high = (ah); \ + __b.s.low = (bl); __b.s.high = (bh); \ + __s.ll = __a.ll + __b.ll; \ + (sl) = __s.s.low; (sh) = __s.s.high; \ + } while (0) +# define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + DWunion __s, __a, __b; \ + __a.s.low = (al); __a.s.high = (ah); \ + __b.s.low = (bl); __b.s.high = (bh); \ + __s.ll = __a.ll - __b.ll; \ + (sl) = __s.s.low; (sh) = __s.s.high; \ + } while (0) +# define udiv_qrnnd(q, r, nh, nl, d) \ + asm("divu %2,%0" : "=D"(q), "=z"(r) : "D"(d), "0"(nl), "1"(nh)) +# define sdiv_qrnnd(q, r, nh, nl, d) \ + asm("div %2,%0" : "=D"(q), "=z"(r) : "D"(d), "0"(nl), "1"(nh)) +# define UMUL_TIME 3 +# define UDIV_TIME 38 +#endif + +#if defined (__mips__) && W_TYPE_SIZE == 32 +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __x = (UDItype) (USItype) (u) * (USItype) (v); \ + (w1) = (USItype) (__x >> 32); \ + (w0) = (USItype) (__x); \ + } while (0) +#define UMUL_TIME 10 +#define UDIV_TIME 100 + +#if (__mips == 32 || __mips == 64) && ! defined (__mips16) +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif +#endif /* __mips__ */ + +#if defined (__ns32000__) && W_TYPE_SIZE == 32 +#define umul_ppmm(w1, w0, u, v) \ + ({union {UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + __asm__ ("meid %2,%0" \ + : "=g" (__xx.__ll) \ + : "%0" ((USItype) (u)), \ + "g" ((USItype) (v))); \ + (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) +#define __umulsidi3(u, v) \ + ({UDItype __w; \ + __asm__ ("meid %2,%0" \ + : "=g" (__w) \ + : "%0" ((USItype) (u)), \ + "g" ((USItype) (v))); \ + __w; }) +#define udiv_qrnnd(q, r, n1, n0, d) \ + ({union {UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ + __asm__ ("deid %2,%0" \ + : "=g" (__xx.__ll) \ + : "0" (__xx.__ll), \ + "g" ((USItype) (d))); \ + (r) = __xx.__i.__l; (q) = __xx.__i.__h; }) +#define count_trailing_zeros(count,x) \ + do { \ + __asm__ ("ffsd %2,%0" \ + : "=r" ((USItype) (count)) \ + : "0" ((USItype) 0), \ + "r" ((USItype) (x))); \ + } while (0) +#endif /* __ns32000__ */ + +/* FIXME: We should test _IBMR2 here when we add assembly support for the + system vendor compilers. + FIXME: What's needed for gcc PowerPC VxWorks? __vxworks__ is not good + enough, since that hits ARM and m68k too. */ +#if (defined (_ARCH_PPC) /* AIX */ \ + || defined (__powerpc__) /* gcc */ \ + || defined (__POWERPC__) /* BEOS */ \ + || defined (__ppc__) /* Darwin */ \ + || (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \ + || (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \ + && CPU_FAMILY == PPC) \ + ) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else \ + __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ + : "=r" (sh), "=&r" (sl) \ + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ + } while (0) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (ah) && (ah) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else \ + __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ + } while (0) +#define count_leading_zeros(count, x) \ + __asm__ ("cntlzw %0,%1" : "=r" (count) : "r" (x)) +#define COUNT_LEADING_ZEROS_0 32 +#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \ + || defined (__ppc__) \ + || (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \ + || (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \ + && CPU_FAMILY == PPC) +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define UMUL_TIME 15 +#define smul_ppmm(ph, pl, m0, m1) \ + do { \ + SItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define SMUL_TIME 14 +#define UDIV_TIME 120 +#endif +#endif /* 32-bit POWER architecture variants. */ + +/* We should test _IBMR2 here when we add assembly support for the system + vendor compilers. */ +#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else \ + __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ + : "=r" (sh), "=&r" (sl) \ + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ + } while (0) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (ah) && (ah) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else \ + __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ + } while (0) +#define count_leading_zeros(count, x) \ + __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x)) +#define COUNT_LEADING_ZEROS_0 64 +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + UDItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define UMUL_TIME 15 +#define smul_ppmm(ph, pl, m0, m1) \ + do { \ + DItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define SMUL_TIME 14 /* ??? */ +#define UDIV_TIME 120 /* ??? */ +#endif /* 64-bit PowerPC. */ + +#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("a %1,%5\n\tae %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "r" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("s %1,%5\n\tse %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "r" ((USItype) (bl))) +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ( \ + "s r2,r2\n" \ +" mts r10,%2\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" cas %0,r2,r0\n" \ +" mfs r10,%1" \ + : "=r" ((USItype) (ph)), \ + "=r" ((USItype) (pl)) \ + : "%r" (__m0), \ + "r" (__m1) \ + : "r2"); \ + (ph) += ((((SItype) __m0 >> 31) & __m1) \ + + (((SItype) __m1 >> 31) & __m0)); \ + } while (0) +#define UMUL_TIME 20 +#define UDIV_TIME 200 +#define count_leading_zeros(count, x) \ + do { \ + if ((x) >= 0x10000) \ + __asm__ ("clz %0,%1" \ + : "=r" ((USItype) (count)) \ + : "r" ((USItype) (x) >> 16)); \ + else \ + { \ + __asm__ ("clz %0,%1" \ + : "=r" ((USItype) (count)) \ + : "r" ((USItype) (x))); \ + (count) += 16; \ + } \ + } while (0) +#endif + +#if defined(__sh__) && W_TYPE_SIZE == 32 +#ifndef __sh1__ +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ( \ + "dmulu.l %2,%3\n\tsts%M1 macl,%1\n\tsts%M0 mach,%0" \ + : "=r<" ((USItype)(w1)), \ + "=r<" ((USItype)(w0)) \ + : "r" ((USItype)(u)), \ + "r" ((USItype)(v)) \ + : "macl", "mach") +#define UMUL_TIME 5 +#endif + +/* This is the same algorithm as __udiv_qrnnd_c. */ +#define UDIV_NEEDS_NORMALIZATION 1 + +#ifdef __FDPIC__ +/* FDPIC needs a special version of the asm fragment to extract the + code address from the function descriptor. __udiv_qrnnd_16 is + assumed to be local and not to use the GOT, so loading r12 is + not needed. */ +#define udiv_qrnnd(q, r, n1, n0, d) \ + do { \ + extern UWtype __udiv_qrnnd_16 (UWtype, UWtype) \ + __attribute__ ((visibility ("hidden"))); \ + /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ \ + __asm__ ( \ + "mov%M4 %4,r5\n" \ +" swap.w %3,r4\n" \ +" swap.w r5,r6\n" \ +" mov.l @%5,r2\n" \ +" jsr @r2\n" \ +" shll16 r6\n" \ +" swap.w r4,r4\n" \ +" mov.l @%5,r2\n" \ +" jsr @r2\n" \ +" swap.w r1,%0\n" \ +" or r1,%0" \ + : "=r" (q), "=&z" (r) \ + : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \ + : "r1", "r2", "r4", "r5", "r6", "pr", "t"); \ + } while (0) +#else +#define udiv_qrnnd(q, r, n1, n0, d) \ + do { \ + extern UWtype __udiv_qrnnd_16 (UWtype, UWtype) \ + __attribute__ ((visibility ("hidden"))); \ + /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ \ + __asm__ ( \ + "mov%M4 %4,r5\n" \ +" swap.w %3,r4\n" \ +" swap.w r5,r6\n" \ +" jsr @%5\n" \ +" shll16 r6\n" \ +" swap.w r4,r4\n" \ +" jsr @%5\n" \ +" swap.w r1,%0\n" \ +" or r1,%0" \ + : "=r" (q), "=&z" (r) \ + : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \ + : "r1", "r2", "r4", "r5", "r6", "pr", "t"); \ + } while (0) +#endif /* __FDPIC__ */ + +#define UDIV_TIME 80 + +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("clrt;subc %5,%1; subc %4,%0" \ + : "=r" (sh), "=r" (sl) \ + : "0" (ah), "1" (al), "r" (bh), "r" (bl) : "t") + +#endif /* __sh__ */ + +#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \ + && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rJ" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "%rJ" ((USItype) (al)), \ + "rI" ((USItype) (bl)) \ + __CLOBBER_CC) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rJ" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "rJ" ((USItype) (al)), \ + "rI" ((USItype) (bl)) \ + __CLOBBER_CC) +#if defined (__sparc_v9__) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + register USItype __g1 asm ("g1"); \ + __asm__ ("umul\t%2,%3,%1\n\t" \ + "srlx\t%1, 32, %0" \ + : "=r" ((USItype) (w1)), \ + "=r" (__g1) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))); \ + (w0) = __g1; \ + } while (0) +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("mov\t%2,%%y\n\t" \ + "udiv\t%3,%4,%0\n\t" \ + "umul\t%0,%4,%1\n\t" \ + "sub\t%3,%1,%1" \ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__n1)), \ + "r" ((USItype) (__n0)), \ + "r" ((USItype) (__d))) +#else +#if defined (__sparc_v8__) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("umul %2,%3,%1;rd %%y,%0" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))) +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__n1)), \ + "r" ((USItype) (__n0)), \ + "r" ((USItype) (__d))) +#else +#if defined (__sparclite__) +/* This has hardware multiply but not divide. It also has two additional + instructions scan (ffs from high bit) and divscc. */ +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("umul %2,%3,%1;rd %%y,%0" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, d) \ + __asm__ ("! Inlined udiv_qrnnd\n" \ +" wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \ +" tst %%g0\n" \ +" divscc %3,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%0\n" \ +" rd %%y,%1\n" \ +" bl,a 1f\n" \ +" add %1,%4,%1\n" \ +"1: ! End of inline udiv_qrnnd" \ + : "=r" ((USItype) (q)), \ + "=r" ((USItype) (r)) \ + : "r" ((USItype) (n1)), \ + "r" ((USItype) (n0)), \ + "rI" ((USItype) (d)) \ + : "g1" __AND_CLOBBER_CC) +#define UDIV_TIME 37 +#define count_leading_zeros(count, x) \ + do { \ + __asm__ ("scan %1,1,%0" \ + : "=r" ((USItype) (count)) \ + : "r" ((USItype) (x))); \ + } while (0) +/* Early sparclites return 63 for an argument of 0, but they warn that future + implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0 + undefined. */ +#else +/* SPARC without integer multiplication and divide instructions. + (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */ +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("! Inlined umul_ppmm\n" \ +" wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n"\ +" sra %3,31,%%o5 ! Don't move this insn\n" \ +" and %2,%%o5,%%o5 ! Don't move this insn\n" \ +" andcc %%g0,0,%%g1 ! Don't move this insn\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,0,%%g1\n" \ +" add %%g1,%%o5,%0\n" \ +" rd %%y,%1" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "%rI" ((USItype) (u)), \ + "r" ((USItype) (v)) \ + : "g1", "o5" __AND_CLOBBER_CC) +#define UMUL_TIME 39 /* 39 instructions */ +/* It's quite necessary to add this much assembler for the sparc. + The default udiv_qrnnd (in C) is more than 10 times slower! */ +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("! Inlined udiv_qrnnd\n" \ +" mov 32,%%g1\n" \ +" subcc %1,%2,%%g0\n" \ +"1: bcs 5f\n" \ +" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ +" sub %1,%2,%1 ! this kills msb of n\n" \ +" addx %1,%1,%1 ! so this can't give carry\n" \ +" subcc %%g1,1,%%g1\n" \ +"2: bne 1b\n" \ +" subcc %1,%2,%%g0\n" \ +" bcs 3f\n" \ +" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ +" b 3f\n" \ +" sub %1,%2,%1 ! this kills msb of n\n" \ +"4: sub %1,%2,%1\n" \ +"5: addxcc %1,%1,%1\n" \ +" bcc 2b\n" \ +" subcc %%g1,1,%%g1\n" \ +"! Got carry from n. Subtract next step to cancel this carry.\n" \ +" bne 4b\n" \ +" addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \ +" sub %1,%2,%1\n" \ +"3: xnor %0,0,%0\n" \ +" ! End of inline udiv_qrnnd" \ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__d)), \ + "1" ((USItype) (__n1)), \ + "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC) +#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ +#endif /* __sparclite__ */ +#endif /* __sparc_v8__ */ +#endif /* __sparc_v9__ */ +#endif /* sparc32 */ + +#if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \ + && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + UDItype __carry = 0; \ + __asm__ ("addcc\t%r5,%6,%1\n\t" \ + "add\t%r3,%4,%0\n\t" \ + "movcs\t%%xcc, 1, %2\n\t" \ + "add\t%0, %2, %0" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)), \ + "+r" (__carry) \ + : "%rJ" ((UDItype)(ah)), \ + "rI" ((UDItype)(bh)), \ + "%rJ" ((UDItype)(al)), \ + "rI" ((UDItype)(bl)) \ + __CLOBBER_CC); \ + } while (0) + +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + UDItype __carry = 0; \ + __asm__ ("subcc\t%r5,%6,%1\n\t" \ + "sub\t%r3,%4,%0\n\t" \ + "movcs\t%%xcc, 1, %2\n\t" \ + "sub\t%0, %2, %0" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)), \ + "+r" (__carry) \ + : "%rJ" ((UDItype)(ah)), \ + "rI" ((UDItype)(bh)), \ + "%rJ" ((UDItype)(al)), \ + "rI" ((UDItype)(bl)) \ + __CLOBBER_CC); \ + } while (0) + +#define umul_ppmm(wh, wl, u, v) \ + do { \ + UDItype tmp1, tmp2, tmp3, tmp4; \ + __asm__ __volatile__ ( \ + "srl %7,0,%3\n\t" \ + "mulx %3,%6,%1\n\t" \ + "srlx %6,32,%2\n\t" \ + "mulx %2,%3,%4\n\t" \ + "sllx %4,32,%5\n\t" \ + "srl %6,0,%3\n\t" \ + "sub %1,%5,%5\n\t" \ + "srlx %5,32,%5\n\t" \ + "addcc %4,%5,%4\n\t" \ + "srlx %7,32,%5\n\t" \ + "mulx %3,%5,%3\n\t" \ + "mulx %2,%5,%5\n\t" \ + "sethi %%hi(0x80000000),%2\n\t" \ + "addcc %4,%3,%4\n\t" \ + "srlx %4,32,%4\n\t" \ + "add %2,%2,%2\n\t" \ + "movcc %%xcc,%%g0,%2\n\t" \ + "addcc %5,%4,%5\n\t" \ + "sllx %3,32,%3\n\t" \ + "add %1,%3,%1\n\t" \ + "add %5,%2,%0" \ + : "=r" ((UDItype)(wh)), \ + "=&r" ((UDItype)(wl)), \ + "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ + : "r" ((UDItype)(u)), \ + "r" ((UDItype)(v)) \ + __CLOBBER_CC); \ + } while (0) +#define UMUL_TIME 96 +#define UDIV_TIME 230 +#endif /* sparc64 */ + +#if defined (__vax__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define umul_ppmm(xh, xl, m0, m1) \ + do { \ + union { \ + UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("emul %1,%2,$0,%0" \ + : "=r" (__xx.__ll) \ + : "g" (__m0), \ + "g" (__m1)); \ + (xh) = __xx.__i.__h; \ + (xl) = __xx.__i.__l; \ + (xh) += ((((SItype) __m0 >> 31) & __m1) \ + + (((SItype) __m1 >> 31) & __m0)); \ + } while (0) +#define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + union {DItype __ll; \ + struct {SItype __l, __h;} __i; \ + } __xx; \ + __xx.__i.__h = n1; __xx.__i.__l = n0; \ + __asm__ ("ediv %3,%2,%0,%1" \ + : "=g" (q), "=g" (r) \ + : "g" (__xx.__ll), "g" (d)); \ + } while (0) +#endif /* __vax__ */ + +#ifdef _TMS320C6X +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do \ + { \ + UDItype __ll; \ + __asm__ ("addu .l1 %1, %2, %0" \ + : "=a" (__ll) : "a" (al), "a" (bl)); \ + (sl) = (USItype)__ll; \ + (sh) = ((USItype)(__ll >> 32)) + (ah) + (bh); \ + } \ + while (0) + +#ifdef _TMS320C6400_PLUS +#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __x = (UDItype) (USItype) (u) * (USItype) (v); \ + (w1) = (USItype) (__x >> 32); \ + (w0) = (USItype) (__x); \ + } while (0) +#endif /* _TMS320C6400_PLUS */ + +#define count_leading_zeros(count, x) ((count) = __builtin_clz (x)) +#ifdef _TMS320C6400 +#define count_trailing_zeros(count, x) ((count) = __builtin_ctz (x)) +#endif +#define UMUL_TIME 4 +#define UDIV_TIME 40 +#endif /* _TMS320C6X */ + +#if defined (__xtensa__) && W_TYPE_SIZE == 32 +/* This code is not Xtensa-configuration-specific, so rely on the compiler + to expand builtin functions depending on what configuration features + are available. This avoids library calls when the operation can be + performed in-line. */ +#define umul_ppmm(w1, w0, u, v) \ + do { \ + DWunion __w; \ + __w.ll = __builtin_umulsidi3 (u, v); \ + w1 = __w.s.high; \ + w0 = __w.s.low; \ + } while (0) +#define __umulsidi3(u, v) __builtin_umulsidi3 (u, v) +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#endif /* __xtensa__ */ + +#if defined xstormy16 +extern UHItype __stormy16_count_leading_zeros (UHItype); +#define count_leading_zeros(count, x) \ + do \ + { \ + UHItype size; \ + \ + /* We assume that W_TYPE_SIZE is a multiple of 16... */ \ + for ((count) = 0, size = W_TYPE_SIZE; size; size -= 16) \ + { \ + UHItype c; \ + \ + c = __clzhi2 ((x) >> (size - 16)); \ + (count) += c; \ + if (c != 16) \ + break; \ + } \ + } \ + while (0) +#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE +#endif + +#if defined (__z8000__) && W_TYPE_SIZE == 16 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \ + : "=r" ((unsigned int)(sh)), \ + "=&r" ((unsigned int)(sl)) \ + : "%0" ((unsigned int)(ah)), \ + "r" ((unsigned int)(bh)), \ + "%1" ((unsigned int)(al)), \ + "rQR" ((unsigned int)(bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \ + : "=r" ((unsigned int)(sh)), \ + "=&r" ((unsigned int)(sl)) \ + : "0" ((unsigned int)(ah)), \ + "r" ((unsigned int)(bh)), \ + "1" ((unsigned int)(al)), \ + "rQR" ((unsigned int)(bl))) +#define umul_ppmm(xh, xl, m0, m1) \ + do { \ + union {long int __ll; \ + struct {unsigned int __h, __l;} __i; \ + } __xx; \ + unsigned int __m0 = (m0), __m1 = (m1); \ + __asm__ ("mult %S0,%H3" \ + : "=r" (__xx.__i.__h), \ + "=r" (__xx.__i.__l) \ + : "%1" (__m0), \ + "rQR" (__m1)); \ + (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ + (xh) += ((((signed int) __m0 >> 15) & __m1) \ + + (((signed int) __m1 >> 15) & __m0)); \ + } while (0) +#endif /* __z8000__ */ + +#endif /* __GNUC__ */ + +/* If this machine has no inline assembler, use C macros. */ + +#if !defined (add_ssaaaa) +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + UWtype __x; \ + __x = (al) + (bl); \ + (sh) = (ah) + (bh) + (__x < (al)); \ + (sl) = __x; \ + } while (0) +#endif + +#if !defined (sub_ddmmss) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + UWtype __x; \ + __x = (al) - (bl); \ + (sh) = (ah) - (bh) - (__x > (al)); \ + (sl) = __x; \ + } while (0) +#endif + +/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of + smul_ppmm. */ +#if !defined (umul_ppmm) && defined (smul_ppmm) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UWtype __w1; \ + UWtype __xm0 = (u), __xm1 = (v); \ + smul_ppmm (__w1, w0, __xm0, __xm1); \ + (w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \ + + (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \ + } while (0) +#endif + +/* If we still don't have umul_ppmm, define it using plain C. */ +#if !defined (umul_ppmm) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UWtype __x0, __x1, __x2, __x3; \ + UHWtype __ul, __vl, __uh, __vh; \ + \ + __ul = __ll_lowpart (u); \ + __uh = __ll_highpart (u); \ + __vl = __ll_lowpart (v); \ + __vh = __ll_highpart (v); \ + \ + __x0 = (UWtype) __ul * __vl; \ + __x1 = (UWtype) __ul * __vh; \ + __x2 = (UWtype) __uh * __vl; \ + __x3 = (UWtype) __uh * __vh; \ + \ + __x1 += __ll_highpart (__x0);/* this can't give carry */ \ + __x1 += __x2; /* but this indeed can */ \ + if (__x1 < __x2) /* did we get it? */ \ + __x3 += __ll_B; /* yes, add it in the proper pos. */ \ + \ + (w1) = __x3 + __ll_highpart (__x1); \ + (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \ + } while (0) +#endif + +#if !defined (__umulsidi3) +#define __umulsidi3(u, v) \ + ({DWunion __w; \ + umul_ppmm (__w.s.high, __w.s.low, u, v); \ + __w.ll; }) +#endif + +/* Define this unconditionally, so it can be used for debugging. */ +#define __udiv_qrnnd_c(q, r, n1, n0, d) \ + do { \ + UWtype __d1, __d0, __q1, __q0; \ + UWtype __r1, __r0, __m; \ + __d1 = __ll_highpart (d); \ + __d0 = __ll_lowpart (d); \ + \ + __r1 = (n1) % __d1; \ + __q1 = (n1) / __d1; \ + __m = (UWtype) __q1 * __d0; \ + __r1 = __r1 * __ll_B | __ll_highpart (n0); \ + if (__r1 < __m) \ + { \ + __q1--, __r1 += (d); \ + if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ + if (__r1 < __m) \ + __q1--, __r1 += (d); \ + } \ + __r1 -= __m; \ + \ + __r0 = __r1 % __d1; \ + __q0 = __r1 / __d1; \ + __m = (UWtype) __q0 * __d0; \ + __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ + if (__r0 < __m) \ + { \ + __q0--, __r0 += (d); \ + if (__r0 >= (d)) \ + if (__r0 < __m) \ + __q0--, __r0 += (d); \ + } \ + __r0 -= __m; \ + \ + (q) = (UWtype) __q1 * __ll_B | __q0; \ + (r) = __r0; \ + } while (0) + +/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through + __udiv_w_sdiv (defined in libgcc or elsewhere). */ +#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd) +#define udiv_qrnnd(q, r, nh, nl, d) \ + do { \ + extern UWtype __udiv_w_sdiv (UWtype *, UWtype, UWtype, UWtype); \ + UWtype __r; \ + (q) = __udiv_w_sdiv (&__r, nh, nl, d); \ + (r) = __r; \ + } while (0) +#endif + +/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ +#if !defined (udiv_qrnnd) +#define UDIV_NEEDS_NORMALIZATION 1 +#define udiv_qrnnd __udiv_qrnnd_c +#endif + +#if !defined (count_leading_zeros) +#define count_leading_zeros(count, x) \ + do { \ + UWtype __xr = (x); \ + UWtype __a; \ + \ + if (W_TYPE_SIZE <= 32) \ + { \ + __a = __xr < ((UWtype)1<<2*__BITS4) \ + ? (__xr < ((UWtype)1<<__BITS4) ? 0 : __BITS4) \ + : (__xr < ((UWtype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \ + } \ + else \ + { \ + for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \ + if (((__xr >> __a) & 0xff) != 0) \ + break; \ + } \ + \ + (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \ + } while (0) +#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE +#endif + +#if !defined (count_trailing_zeros) +/* Define count_trailing_zeros using count_leading_zeros. The latter might be + defined in asm, but if it is not, the C version above is good enough. */ +#define count_trailing_zeros(count, x) \ + do { \ + UWtype __ctz_x = (x); \ + UWtype __ctz_c; \ + count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \ + (count) = W_TYPE_SIZE - 1 - __ctz_c; \ + } while (0) +#endif + +#ifndef UDIV_NEEDS_NORMALIZATION +#define UDIV_NEEDS_NORMALIZATION 0 +#endif diff --git a/include/lto-symtab.h b/include/lto-symtab.h new file mode 100644 index 0000000..878d050 --- /dev/null +++ b/include/lto-symtab.h @@ -0,0 +1,41 @@ +/* Data types used in the IL symbol table. + Copyright (C) 2009-2015 Free Software Foundation, Inc. + Contributed by Rafael Espindola + +This file is part of GCC. + +GCC 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, or (at your option) any later +version. + +GCC 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 GCC; see the file COPYING3. If not see +. */ + +#ifndef GCC_LTO_SYMTAB_H +#define GCC_LTO_SYMTAB_H + +enum gcc_plugin_symbol_kind + { + GCCPK_DEF, + GCCPK_WEAKDEF, + GCCPK_UNDEF, + GCCPK_WEAKUNDEF, + GCCPK_COMMON + }; + +enum gcc_plugin_symbol_visibility + { + GCCPV_DEFAULT, + GCCPV_PROTECTED, + GCCPV_INTERNAL, + GCCPV_HIDDEN + }; + +#endif /* GCC_LTO_SYMTAB_H */ diff --git a/include/mach-o/ChangeLog b/include/mach-o/ChangeLog new file mode 100644 index 0000000..a36c546 --- /dev/null +++ b/include/mach-o/ChangeLog @@ -0,0 +1,81 @@ +2012-11-14 Tristan Gingold + + * external.h (mach_o_entry_point_command_external) + (mach_o_source_version_command_external) + (mach_o_data_in_code_entry_external): New structures. + + * loader.h (bfd_mach_o_load_command_type): Add + BFD_MACH_O_LC_MAIN, BFD_MACH_O_LC_DATA_IN_CODE, + BFD_MACH_O_LC_SOURCE_VERSION and BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS. + (BFD_MACH_O_REFERENCE_MASK): Adjust value. + (BFD_MACH_O_N_REF_TO_WEAK): New definition. + (BFD_MACH_O_N_ARM_THUMB_DEF, BFD_MACH_O_N_SYMBOL_RESOLVER): Likewise. + (bfd_mach_o_data_in_code_entry_kind): New enum. + +2012-11-14 Tristan Gingold + + * arm.h: New file. + +2012-02-23 Iain Sandoe + + * external.h: Add comments about relocations fields. Add macros + for non-scattered relocations. Move scattered relocation macros to + here. + * reloc.h: Remove macros related to external representation of reloc + fields. + +2012-01-12 Iain Sandoe + + * loader.h (BFD_MACH_O_INDIRECT_SYM_LOCAL): New. + (BFD_MACH_O_INDIRECT_SYM_ABS): New + +2012-01-04 Tristan Gingold + + * external.h (mach_o_fvmlib_command_external): New structure. + +2012-01-04 Tristan Gingold + + * loader.h: Update copyright year. + (bfd_mach_o_cpu_subtype): Add ARM subtypes. + +2012-01-04 Tristan Gingold + + * external.h: Update copyright year. + (mach_o_symtab_command_external): Add comments. + (mach_o_encryption_info_command_external): New structure. + +2011-12-16 Tristan Gingold + + * codesign.h: New file. + +2011-08-08 Tristan Gingold + + * loader.h (bfd_mach_o_load_command_type): Add + BFD_MACH_O_LC_LOAD_UPWARD_DYLIB, BFD_MACH_O_LC_VERSION_MIN_MACOSX, + BFD_MACH_O_LC_VERSION_MIN_IPHONEOS, BFD_MACH_O_LC_FUNCTION_STARTS, + and BFD_MACH_O_LC_DYLD_ENVIRONMENT. + * external.h (mach_o_version_min_command_external): New structure. + +2011-08-08 Tristan Gingold + + * loader.h: Reorder declarations. + * x86-64.h: New file. + * external.h: New file. + * reloc.h: New file. + +2011-07-06 Tristan Gingold + + * loader.h: New file. + +Copyright (C) 2011-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/mach-o/arm.h b/include/mach-o/arm.h new file mode 100644 index 0000000..f37ff77 --- /dev/null +++ b/include/mach-o/arm.h @@ -0,0 +1,37 @@ +/* Mach-O arm declarations for BFD. + Copyright 2012 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_ARM_H +#define _MACH_O_ARM_H + +/* ARM relocations. */ +#define BFD_MACH_O_ARM_RELOC_VANILLA 0 /* Generic relocation. */ +#define BFD_MACH_O_ARM_RELOC_PAIR 1 /* Second entry in a pair. */ +#define BFD_MACH_O_ARM_RELOC_SECTDIFF 2 /* Substract with a PAIR. */ +#define BFD_MACH_O_ARM_RELOC_LOCAL_SECTDIFF 3 /* Like above, but local ref. */ +#define BFD_MACH_O_ARM_RELOC_PB_LA_PTR 4 /* Prebound lazy pointer. */ +#define BFD_MACH_O_ARM_RELOC_BR24 5 /* 24bit branch. */ +#define BFD_MACH_O_THUMB_RELOC_BR22 6 /* 22bit branch. */ +#define BFD_MACH_O_THUMB_32BIT_BRANCH 7 /* Obselete. */ +#define BFD_MACH_O_ARM_RELOC_HALF 8 +#define BFD_MACH_O_ARM_RELOC_HALF_SECTDIFF 9 + +#endif /* _MACH_O_ARM_H */ diff --git a/include/mach-o/codesign.h b/include/mach-o/codesign.h new file mode 100644 index 0000000..ee2f792 --- /dev/null +++ b/include/mach-o/codesign.h @@ -0,0 +1,85 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_CODESIGN_H +#define _MACH_O_CODESIGN_H + +/* Codesign blob magics. */ + +/* Superblob containing all the components. */ +#define BFD_MACH_O_CS_MAGIC_EMBEDDED_SIGNATURE 0xfade0cc0 + +/* Individual code requirement. */ +#define BFD_MACH_O_CS_MAGIC_REQUIREMENT 0xfade0c00 + +/* Collection of code requirements, indexed by type. */ +#define BFD_MACH_O_CS_MAGIC_REQUIREMENTS 0xfade0c01 + +/* Directory. */ +#define BFD_MACH_O_CS_MAGIC_CODEDIRECTORY 0xfade0c02 + +/* Entitlements blob. */ +#define BFD_MACH_O_CS_MAGIC_EMBEDDED_ENTITLEMENTS 0xfade7171 + +/* Blob container. */ +#define BFD_MACH_O_CS_MAGIC_BLOB_WRAPPER 0xfade0b01 + +struct mach_o_codesign_codedirectory_external_v1 +{ + /* All the fields are in network byte order (big endian). */ + unsigned char version[4]; + unsigned char flags[4]; + unsigned char hash_offset[4]; + unsigned char ident_offset[4]; + unsigned char nbr_special_slots[4]; + unsigned char nbr_code_slots[4]; + unsigned char code_limit[4]; + unsigned char hash_size[1]; + unsigned char hash_type[1]; + unsigned char spare1[1]; + unsigned char page_size[1]; + unsigned char spare2[4]; +}; + +struct mach_o_codesign_codedirectory_v1 +{ + unsigned int version; + unsigned int flags; + unsigned int hash_offset; + unsigned int ident_offset; + unsigned int nbr_special_slots; + unsigned int nbr_code_slots; + unsigned int code_limit; + unsigned char hash_size; + unsigned char hash_type; + unsigned char spare1; + unsigned char page_size; + unsigned int spare2; +}; + +/* Value for hash_type. */ +#define BFD_MACH_O_CS_NO_HASH 0 +#define BFD_MACH_O_CS_HASH_SHA1 1 +#define BFD_MACH_O_CS_HASH_SHA256 2 +#define BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_160x256 32 /* Skein, 160 bits */ +#define BFD_MACH_O_CS_HASH_PRESTANDARD_SKEIN_256x512 33 /* Skein, 256 bits */ + +#endif /* _MACH_O_CODESIGN_H */ diff --git a/include/mach-o/external.h b/include/mach-o/external.h new file mode 100644 index 0000000..4b0a83e --- /dev/null +++ b/include/mach-o/external.h @@ -0,0 +1,348 @@ +/* Mach-O support for BFD. + Copyright 2011, 2012 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_EXTERNAL_H +#define _MACH_O_EXTERNAL_H + +struct mach_o_header_external +{ + unsigned char magic[4]; /* Magic number. */ + unsigned char cputype[4]; /* CPU that this object is for. */ + unsigned char cpusubtype[4]; /* CPU subtype. */ + unsigned char filetype[4]; /* Type of file. */ + unsigned char ncmds[4]; /* Number of load commands. */ + unsigned char sizeofcmds[4]; /* Total size of load commands. */ + unsigned char flags[4]; /* Flags. */ + unsigned char reserved[4]; /* Reserved (on 64-bit version only). */ +}; + +#define BFD_MACH_O_HEADER_SIZE 28 +#define BFD_MACH_O_HEADER_64_SIZE 32 + +/* 32-bit section header. */ + +struct mach_o_section_32_external +{ + unsigned char sectname[16]; /* Section name. */ + unsigned char segname[16]; /* Segment that the section belongs to. */ + unsigned char addr[4]; /* Address of this section in memory. */ + unsigned char size[4]; /* Size in bytes of this section. */ + unsigned char offset[4]; /* File offset of this section. */ + unsigned char align[4]; /* log2 of this section's alignment. */ + unsigned char reloff[4]; /* File offset of this section's relocs. */ + unsigned char nreloc[4]; /* Number of relocs for this section. */ + unsigned char flags[4]; /* Section flags/attributes. */ + unsigned char reserved1[4]; + unsigned char reserved2[4]; +}; +#define BFD_MACH_O_SECTION_SIZE 68 + +/* 64-bit section header. */ + +struct mach_o_section_64_external +{ + unsigned char sectname[16]; /* Section name. */ + unsigned char segname[16]; /* Segment that the section belongs to. */ + unsigned char addr[8]; /* Address of this section in memory. */ + unsigned char size[8]; /* Size in bytes of this section. */ + unsigned char offset[4]; /* File offset of this section. */ + unsigned char align[4]; /* log2 of this section's alignment. */ + unsigned char reloff[4]; /* File offset of this section's relocs. */ + unsigned char nreloc[4]; /* Number of relocs for this section. */ + unsigned char flags[4]; /* Section flags/attributes. */ + unsigned char reserved1[4]; + unsigned char reserved2[4]; + unsigned char reserved3[4]; +}; +#define BFD_MACH_O_SECTION_64_SIZE 80 + +struct mach_o_load_command_external +{ + unsigned char cmd[4]; /* The type of load command. */ + unsigned char cmdsize[4]; /* Size in bytes of entire command. */ +}; +#define BFD_MACH_O_LC_SIZE 8 + +struct mach_o_segment_command_32_external +{ + unsigned char segname[16]; /* Name of this segment. */ + unsigned char vmaddr[4]; /* Virtual memory address of this segment. */ + unsigned char vmsize[4]; /* Size there, in bytes. */ + unsigned char fileoff[4]; /* Offset in bytes of the data to be mapped. */ + unsigned char filesize[4]; /* Size in bytes on disk. */ + unsigned char maxprot[4]; /* Maximum permitted vm protection. */ + unsigned char initprot[4]; /* Initial vm protection. */ + unsigned char nsects[4]; /* Number of sections in this segment. */ + unsigned char flags[4]; /* Flags that affect the loading. */ +}; +#define BFD_MACH_O_LC_SEGMENT_SIZE 56 /* Include the header. */ + +struct mach_o_segment_command_64_external +{ + unsigned char segname[16]; /* Name of this segment. */ + unsigned char vmaddr[8]; /* Virtual memory address of this segment. */ + unsigned char vmsize[8]; /* Size there, in bytes. */ + unsigned char fileoff[8]; /* Offset in bytes of the data to be mapped. */ + unsigned char filesize[8]; /* Size in bytes on disk. */ + unsigned char maxprot[4]; /* Maximum permitted vm protection. */ + unsigned char initprot[4]; /* Initial vm protection. */ + unsigned char nsects[4]; /* Number of sections in this segment. */ + unsigned char flags[4]; /* Flags that affect the loading. */ +}; +#define BFD_MACH_O_LC_SEGMENT_64_SIZE 72 /* Include the header. */ + +struct mach_o_reloc_info_external +{ + unsigned char r_address[4]; + unsigned char r_symbolnum[4]; +}; +#define BFD_MACH_O_RELENT_SIZE 8 + +/* Relocations are based on 'address' being a section offset and an assumption + that sections are never more than 2^24-1 bytes in size. Relocation data + also carry information on type/size/PC-relative/extern and whether scattered + or not [stored in the MSB of the r_address]. */ + +#define BFD_MACH_O_SR_SCATTERED 0x80000000 + +/* For a non-scattered reloc, the relocation info is found in r_symbolnum. + Bytes 1 to 3 contain the symbol number (0xffffff, in a non-scattered PAIR). + Byte 4 contains the relocation info - but with differing bit-positions + dependent on target endian-ness - as below. */ + +#define BFD_MACH_O_LE_PCREL 0x01 +#define BFD_MACH_O_LE_LENGTH_SHIFT 1 +#define BFD_MACH_O_LE_EXTERN 0x08 +#define BFD_MACH_O_LE_TYPE_SHIFT 4 + +#define BFD_MACH_O_BE_PCREL 0x80 +#define BFD_MACH_O_BE_LENGTH_SHIFT 5 +#define BFD_MACH_O_BE_EXTERN 0x10 +#define BFD_MACH_O_BE_TYPE_SHIFT 0 + +/* The field sizes are the same for both BE and LE. */ +#define BFD_MACH_O_LENGTH_MASK 0x03 +#define BFD_MACH_O_TYPE_MASK 0x0f + +/* For a scattered reloc entry the info is contained in r_address. There + is no need to discriminate on target endian-ness, since the design was + arranged to produce the same layout on both. Scattered relocations are + only used for local items, therefore there is no 'extern' field. */ + +#define BFD_MACH_O_SR_PCREL 0x40000000 +#define BFD_MACH_O_GET_SR_LENGTH(s) (((s) >> 28) & 0x3) +#define BFD_MACH_O_GET_SR_TYPE(s) (((s) >> 24) & 0x0f) +#define BFD_MACH_O_GET_SR_ADDRESS(s) ((s) & 0x00ffffff) +#define BFD_MACH_O_SET_SR_LENGTH(l) (((l) & 0x3) << 28) +#define BFD_MACH_O_SET_SR_TYPE(t) (((t) & 0xf) << 24) +#define BFD_MACH_O_SET_SR_ADDRESS(s) ((s) & 0x00ffffff) + +struct mach_o_symtab_command_external +{ + unsigned char symoff[4]; /* File offset of the symbol table. */ + unsigned char nsyms[4]; /* Number of symbols. */ + unsigned char stroff[4]; /* File offset of the string table. */ + unsigned char strsize[4]; /* String table size. */ +}; + +struct mach_o_nlist_external +{ + unsigned char n_strx[4]; + unsigned char n_type[1]; + unsigned char n_sect[1]; + unsigned char n_desc[2]; + unsigned char n_value[4]; +}; +#define BFD_MACH_O_NLIST_SIZE 12 + +struct mach_o_nlist_64_external +{ + unsigned char n_strx[4]; + unsigned char n_type[1]; + unsigned char n_sect[1]; + unsigned char n_desc[2]; + unsigned char n_value[8]; +}; +#define BFD_MACH_O_NLIST_64_SIZE 16 + +struct mach_o_thread_command_external +{ + unsigned char flavour[4]; + unsigned char count[4]; +}; + +/* For commands that just have a string or a path. */ +struct mach_o_str_command_external +{ + unsigned char str[4]; +}; + +struct mach_o_dylib_command_external +{ + unsigned char name[4]; + unsigned char timestamp[4]; + unsigned char current_version[4]; + unsigned char compatibility_version[4]; +}; + +struct mach_o_dysymtab_command_external +{ + unsigned char ilocalsym[4]; /* Index of. */ + unsigned char nlocalsym[4]; /* Number of. */ + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char iundefsym[4]; + unsigned char nundefsym[4]; + unsigned char tocoff[4]; + unsigned char ntoc[4]; + unsigned char modtaboff[4]; + unsigned char nmodtab[4]; + unsigned char extrefsymoff[4]; + unsigned char nextrefsyms[4]; + unsigned char indirectsymoff[4]; + unsigned char nindirectsyms[4]; + unsigned char extreloff[4]; + unsigned char nextrel[4]; + unsigned char locreloff[4]; + unsigned char nlocrel[4]; +}; + +struct mach_o_dylib_module_external +{ + unsigned char module_name[4]; + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char irefsym[4]; + unsigned char nrefsym[4]; + unsigned char ilocalsym[4]; + unsigned char nlocalsym[4]; + unsigned char iextrel[4]; + unsigned char nextrel[4]; + unsigned char iinit_iterm[4]; + unsigned char ninit_nterm[4]; + unsigned char objc_module_info_addr[4]; + unsigned char objc_module_info_size[4]; +}; +#define BFD_MACH_O_DYLIB_MODULE_SIZE 52 + +struct mach_o_dylib_module_64_external +{ + unsigned char module_name[4]; + unsigned char iextdefsym[4]; + unsigned char nextdefsym[4]; + unsigned char irefsym[4]; + unsigned char nrefsym[4]; + unsigned char ilocalsym[4]; + unsigned char nlocalsym[4]; + unsigned char iextrel[4]; + unsigned char nextrel[4]; + unsigned char iinit_iterm[4]; + unsigned char ninit_nterm[4]; + unsigned char objc_module_info_size[4]; + unsigned char objc_module_info_addr[8]; +}; +#define BFD_MACH_O_DYLIB_MODULE_64_SIZE 56 + +struct mach_o_dylib_table_of_contents_external +{ + unsigned char symbol_index[4]; + unsigned char module_index[4]; +}; +#define BFD_MACH_O_TABLE_OF_CONTENT_SIZE 8 + +struct mach_o_linkedit_data_command_external +{ + unsigned char dataoff[4]; + unsigned char datasize[4]; +}; + +struct mach_o_dyld_info_command_external +{ + unsigned char rebase_off[4]; + unsigned char rebase_size[4]; + unsigned char bind_off[4]; + unsigned char bind_size[4]; + unsigned char weak_bind_off[4]; + unsigned char weak_bind_size[4]; + unsigned char lazy_bind_off[4]; + unsigned char lazy_bind_size[4]; + unsigned char export_off[4]; + unsigned char export_size[4]; +}; + +struct mach_o_version_min_command_external +{ + unsigned char version[4]; + unsigned char reserved[4]; +}; + +struct mach_o_encryption_info_command_external +{ + unsigned char cryptoff[4]; /* File offset of the encrypted area. */ + unsigned char cryptsize[4]; /* Size of the encrypted area. */ + unsigned char cryptid[4]; /* Encryption method. */ +}; + +struct mach_o_fvmlib_command_external +{ + unsigned char name[4]; /* Offset of the name. */ + unsigned char minor_version[4]; + unsigned char header_addr[4]; +}; + +struct mach_o_entry_point_command_external +{ + unsigned char entryoff[8]; /* File offset of the entry point. */ + unsigned char stacksize[8]; /* Initial stack size, if no null. */ +}; + +struct mach_o_source_version_command_external +{ + unsigned char version[8]; /* Version A.B.C.D.E, with 10 bits for B-E, + and 24 bits for A. */ +}; + +/* The LD_DATA_IN_CODE command use a linkedit_data_command that points to + a table of entries. */ + +struct mach_o_data_in_code_entry_external +{ + unsigned char offset[4]; /* Offset from the mach_header. */ + unsigned char length[2]; /* Number of bytes. */ + unsigned char kind[2]; /* Kind. See BFD_MACH_O_DICE_ values. */ +}; + +struct mach_o_fat_header_external +{ + unsigned char magic[4]; + unsigned char nfat_arch[4]; /* Number of components. */ +}; + +struct mach_o_fat_arch_external +{ + unsigned char cputype[4]; + unsigned char cpusubtype[4]; + unsigned char offset[4]; /* File offset of the member. */ + unsigned char size[4]; /* Size of the member. */ + unsigned char align[4]; /* Power of 2. */ +}; + +#endif /* _MACH_O_EXTERNAL_H */ diff --git a/include/mach-o/loader.h b/include/mach-o/loader.h new file mode 100644 index 0000000..952bc8f --- /dev/null +++ b/include/mach-o/loader.h @@ -0,0 +1,378 @@ +/* Mach-O support for BFD. + Copyright 2011, 2012 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_LOADER_H +#define _MACH_O_LOADER_H + +/* Constants for header. */ + +typedef enum bfd_mach_o_mach_header_magic +{ + BFD_MACH_O_MH_MAGIC = 0xfeedface, + BFD_MACH_O_MH_CIGAM = 0xcefaedfe, + BFD_MACH_O_MH_MAGIC_64 = 0xfeedfacf, + BFD_MACH_O_MH_CIGAM_64 = 0xcffaedfe +} +bfd_mach_o_mach_header_magic; + +#define BFD_MACH_O_CPU_IS64BIT 0x1000000 + +typedef enum bfd_mach_o_cpu_type +{ + BFD_MACH_O_CPU_TYPE_VAX = 1, + BFD_MACH_O_CPU_TYPE_MC680x0 = 6, + BFD_MACH_O_CPU_TYPE_I386 = 7, + BFD_MACH_O_CPU_TYPE_MIPS = 8, + BFD_MACH_O_CPU_TYPE_MC98000 = 10, + BFD_MACH_O_CPU_TYPE_HPPA = 11, + BFD_MACH_O_CPU_TYPE_ARM = 12, + BFD_MACH_O_CPU_TYPE_MC88000 = 13, + BFD_MACH_O_CPU_TYPE_SPARC = 14, + BFD_MACH_O_CPU_TYPE_I860 = 15, + BFD_MACH_O_CPU_TYPE_ALPHA = 16, + BFD_MACH_O_CPU_TYPE_POWERPC = 18, + BFD_MACH_O_CPU_TYPE_POWERPC_64 = (BFD_MACH_O_CPU_TYPE_POWERPC | BFD_MACH_O_CPU_IS64BIT), + BFD_MACH_O_CPU_TYPE_X86_64 = (BFD_MACH_O_CPU_TYPE_I386 | BFD_MACH_O_CPU_IS64BIT) +} +bfd_mach_o_cpu_type; + +typedef enum bfd_mach_o_cpu_subtype +{ + /* i386. */ + BFD_MACH_O_CPU_SUBTYPE_X86_ALL = 3, + + /* arm. */ + BFD_MACH_O_CPU_SUBTYPE_ARM_ALL = 0, + BFD_MACH_O_CPU_SUBTYPE_ARM_V4T = 5, + BFD_MACH_O_CPU_SUBTYPE_ARM_V6 = 6, + BFD_MACH_O_CPU_SUBTYPE_ARM_V5TEJ = 7, + BFD_MACH_O_CPU_SUBTYPE_ARM_XSCALE = 8, + BFD_MACH_O_CPU_SUBTYPE_ARM_V7 = 9 +} +bfd_mach_o_cpu_subtype; + +typedef enum bfd_mach_o_filetype +{ + BFD_MACH_O_MH_OBJECT = 0x01, + BFD_MACH_O_MH_EXECUTE = 0x02, + BFD_MACH_O_MH_FVMLIB = 0x03, + BFD_MACH_O_MH_CORE = 0x04, + BFD_MACH_O_MH_PRELOAD = 0x05, + BFD_MACH_O_MH_DYLIB = 0x06, + BFD_MACH_O_MH_DYLINKER = 0x07, + BFD_MACH_O_MH_BUNDLE = 0x08, + BFD_MACH_O_MH_DYLIB_STUB = 0x09, + BFD_MACH_O_MH_DSYM = 0x0a, + BFD_MACH_O_MH_KEXT_BUNDLE = 0x0b +} +bfd_mach_o_filetype; + +typedef enum bfd_mach_o_header_flags +{ + BFD_MACH_O_MH_NOUNDEFS = 0x0000001, + BFD_MACH_O_MH_INCRLINK = 0x0000002, + BFD_MACH_O_MH_DYLDLINK = 0x0000004, + BFD_MACH_O_MH_BINDATLOAD = 0x0000008, + BFD_MACH_O_MH_PREBOUND = 0x0000010, + BFD_MACH_O_MH_SPLIT_SEGS = 0x0000020, + BFD_MACH_O_MH_LAZY_INIT = 0x0000040, + BFD_MACH_O_MH_TWOLEVEL = 0x0000080, + BFD_MACH_O_MH_FORCE_FLAT = 0x0000100, + BFD_MACH_O_MH_NOMULTIDEFS = 0x0000200, + BFD_MACH_O_MH_NOFIXPREBINDING = 0x0000400, + BFD_MACH_O_MH_PREBINDABLE = 0x0000800, + BFD_MACH_O_MH_ALLMODSBOUND = 0x0001000, + BFD_MACH_O_MH_SUBSECTIONS_VIA_SYMBOLS = 0x0002000, + BFD_MACH_O_MH_CANONICAL = 0x0004000, + BFD_MACH_O_MH_WEAK_DEFINES = 0x0008000, + BFD_MACH_O_MH_BINDS_TO_WEAK = 0x0010000, + BFD_MACH_O_MH_ALLOW_STACK_EXECUTION = 0x0020000, + BFD_MACH_O_MH_ROOT_SAFE = 0x0040000, + BFD_MACH_O_MH_SETUID_SAFE = 0x0080000, + BFD_MACH_O_MH_NO_REEXPORTED_DYLIBS = 0x0100000, + BFD_MACH_O_MH_PIE = 0x0200000, + BFD_MACH_O_MH_DEAD_STRIPPABLE_DYLIB = 0x0400000, + BFD_MACH_O_MH_HAS_TLV_DESCRIPTORS = 0x0800000, + BFD_MACH_O_MH_NO_HEAP_EXECUTION = 0x1000000 +} +bfd_mach_o_header_flags; + +/* Load command constants. */ +#define BFD_MACH_O_LC_REQ_DYLD 0x80000000 + +typedef enum bfd_mach_o_load_command_type +{ + BFD_MACH_O_LC_SEGMENT = 0x1, /* File segment to be mapped. */ + BFD_MACH_O_LC_SYMTAB = 0x2, /* Link-edit stab symbol table info (obsolete). */ + BFD_MACH_O_LC_SYMSEG = 0x3, /* Link-edit gdb symbol table info. */ + BFD_MACH_O_LC_THREAD = 0x4, /* Thread. */ + BFD_MACH_O_LC_UNIXTHREAD = 0x5, /* UNIX thread (includes a stack). */ + BFD_MACH_O_LC_LOADFVMLIB = 0x6, /* Load a fixed VM shared library. */ + BFD_MACH_O_LC_IDFVMLIB = 0x7, /* Fixed VM shared library id. */ + BFD_MACH_O_LC_IDENT = 0x8, /* Object identification information (obsolete). */ + BFD_MACH_O_LC_FVMFILE = 0x9, /* Fixed VM file inclusion. */ + BFD_MACH_O_LC_PREPAGE = 0xa, /* Prepage command (internal use). */ + BFD_MACH_O_LC_DYSYMTAB = 0xb, /* Dynamic link-edit symbol table info. */ + BFD_MACH_O_LC_LOAD_DYLIB = 0xc, /* Load a dynamically linked shared library. */ + BFD_MACH_O_LC_ID_DYLIB = 0xd, /* Dynamically linked shared lib identification. */ + BFD_MACH_O_LC_LOAD_DYLINKER = 0xe, /* Load a dynamic linker. */ + BFD_MACH_O_LC_ID_DYLINKER = 0xf, /* Dynamic linker identification. */ + BFD_MACH_O_LC_PREBOUND_DYLIB = 0x10, /* Modules prebound for a dynamically. */ + BFD_MACH_O_LC_ROUTINES = 0x11, /* Image routines. */ + BFD_MACH_O_LC_SUB_FRAMEWORK = 0x12, /* Sub framework. */ + BFD_MACH_O_LC_SUB_UMBRELLA = 0x13, /* Sub umbrella. */ + BFD_MACH_O_LC_SUB_CLIENT = 0x14, /* Sub client. */ + BFD_MACH_O_LC_SUB_LIBRARY = 0x15, /* Sub library. */ + BFD_MACH_O_LC_TWOLEVEL_HINTS = 0x16, /* Two-level namespace lookup hints. */ + BFD_MACH_O_LC_PREBIND_CKSUM = 0x17, /* Prebind checksum. */ + /* Load a dynamically linked shared library that is allowed to be + missing (weak). */ + BFD_MACH_O_LC_LOAD_WEAK_DYLIB = 0x18, + BFD_MACH_O_LC_SEGMENT_64 = 0x19, /* 64-bit segment of this file to be + mapped. */ + BFD_MACH_O_LC_ROUTINES_64 = 0x1a, /* Address of the dyld init routine + in a dylib. */ + BFD_MACH_O_LC_UUID = 0x1b, /* 128-bit UUID of the executable. */ + BFD_MACH_O_LC_RPATH = 0x1c, /* Run path addiions. */ + BFD_MACH_O_LC_CODE_SIGNATURE = 0x1d, /* Local of code signature. */ + BFD_MACH_O_LC_SEGMENT_SPLIT_INFO = 0x1e, /* Local of info to split seg. */ + BFD_MACH_O_LC_REEXPORT_DYLIB = 0x1f, /* Load and re-export lib. */ + BFD_MACH_O_LC_LAZY_LOAD_DYLIB = 0x20, /* Delay load of lib until use. */ + BFD_MACH_O_LC_ENCRYPTION_INFO = 0x21, /* Encrypted segment info. */ + BFD_MACH_O_LC_DYLD_INFO = 0x22, /* Compressed dyld information. */ + BFD_MACH_O_LC_LOAD_UPWARD_DYLIB = 0x23, /* Load upward dylib. */ + BFD_MACH_O_LC_VERSION_MIN_MACOSX = 0x24, /* Minimal MacOSX version. */ + BFD_MACH_O_LC_VERSION_MIN_IPHONEOS = 0x25, /* Minimal IOS version. */ + BFD_MACH_O_LC_FUNCTION_STARTS = 0x26, /* Compressed table of func start. */ + BFD_MACH_O_LC_DYLD_ENVIRONMENT = 0x27, /* Env variable string for dyld. */ + BFD_MACH_O_LC_MAIN = 0x28, /* Entry point. */ + BFD_MACH_O_LC_DATA_IN_CODE = 0x29, /* Table of non-instructions. */ + BFD_MACH_O_LC_SOURCE_VERSION = 0x2a, /* Source version. */ + BFD_MACH_O_LC_DYLIB_CODE_SIGN_DRS = 0x2b /* DRs from dylibs. */ +} +bfd_mach_o_load_command_type; + +/* Section constants. */ +/* Constants for the type of a section. */ + +typedef enum bfd_mach_o_section_type +{ + /* Regular section. */ + BFD_MACH_O_S_REGULAR = 0x0, + + /* Zero fill on demand section. */ + BFD_MACH_O_S_ZEROFILL = 0x1, + + /* Section with only literal C strings. */ + BFD_MACH_O_S_CSTRING_LITERALS = 0x2, + + /* Section with only 4 byte literals. */ + BFD_MACH_O_S_4BYTE_LITERALS = 0x3, + + /* Section with only 8 byte literals. */ + BFD_MACH_O_S_8BYTE_LITERALS = 0x4, + + /* Section with only pointers to literals. */ + BFD_MACH_O_S_LITERAL_POINTERS = 0x5, + + /* For the two types of symbol pointers sections and the symbol stubs + section they have indirect symbol table entries. For each of the + entries in the section the indirect symbol table entries, in + corresponding order in the indirect symbol table, start at the index + stored in the reserved1 field of the section structure. Since the + indirect symbol table entries correspond to the entries in the + section the number of indirect symbol table entries is inferred from + the size of the section divided by the size of the entries in the + section. For symbol pointers sections the size of the entries in + the section is 4 bytes and for symbol stubs sections the byte size + of the stubs is stored in the reserved2 field of the section + structure. */ + + /* Section with only non-lazy symbol pointers. */ + BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS = 0x6, + + /* Section with only lazy symbol pointers. */ + BFD_MACH_O_S_LAZY_SYMBOL_POINTERS = 0x7, + + /* Section with only symbol stubs, byte size of stub in the reserved2 + field. */ + BFD_MACH_O_S_SYMBOL_STUBS = 0x8, + + /* Section with only function pointers for initialization. */ + BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS = 0x9, + + /* Section with only function pointers for termination. */ + BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS = 0xa, + + /* Section contains symbols that are coalesced by the linkers. */ + BFD_MACH_O_S_COALESCED = 0xb, + + /* Zero fill on demand section (possibly larger than 4 GB). */ + BFD_MACH_O_S_GB_ZEROFILL = 0xc, + + /* Section with only pairs of function pointers for interposing. */ + BFD_MACH_O_S_INTERPOSING = 0xd, + + /* Section with only 16 byte literals. */ + BFD_MACH_O_S_16BYTE_LITERALS = 0xe, + + /* Section contains DTrace Object Format. */ + BFD_MACH_O_S_DTRACE_DOF = 0xf, + + /* Section with only lazy symbol pointers to lazy loaded dylibs. */ + BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS = 0x10 +} +bfd_mach_o_section_type; + +/* The flags field of a section structure is separated into two parts a section + type and section attributes. The section types are mutually exclusive (it + can only have one type) but the section attributes are not (it may have more + than one attribute). */ + +#define BFD_MACH_O_SECTION_TYPE_MASK 0x000000ff + +/* Constants for the section attributes part of the flags field of a section + structure. */ +#define BFD_MACH_O_SECTION_ATTRIBUTES_MASK 0xffffff00 +/* System setable attributes. */ +#define BFD_MACH_O_SECTION_ATTRIBUTES_SYS 0x00ffff00 +/* User attributes. */ +#define BFD_MACH_O_SECTION_ATTRIBUTES_USR 0xff000000 + +typedef enum bfd_mach_o_section_attribute +{ + /* Section has no specified attibutes. */ + BFD_MACH_O_S_ATTR_NONE = 0, + + /* Section has local relocation entries. */ + BFD_MACH_O_S_ATTR_LOC_RELOC = 0x00000100, + + /* Section has external relocation entries. */ + BFD_MACH_O_S_ATTR_EXT_RELOC = 0x00000200, + + /* Section contains some machine instructions. */ + BFD_MACH_O_S_ATTR_SOME_INSTRUCTIONS = 0x00000400, + + /* A debug section. */ + BFD_MACH_O_S_ATTR_DEBUG = 0x02000000, + + /* Used with i386 stubs. */ + BFD_MACH_O_S_SELF_MODIFYING_CODE = 0x04000000, + + /* Blocks are live if they reference live blocks. */ + BFD_MACH_O_S_ATTR_LIVE_SUPPORT = 0x08000000, + + /* No dead stripping. */ + BFD_MACH_O_S_ATTR_NO_DEAD_STRIP = 0x10000000, + + /* Section symbols can be stripped in files with MH_DYLDLINK flag. */ + BFD_MACH_O_S_ATTR_STRIP_STATIC_SYMS = 0x20000000, + + /* Section contains coalesced symbols that are not to be in the TOC of an + archive. */ + BFD_MACH_O_S_ATTR_NO_TOC = 0x40000000, + + /* Section contains only true machine instructions. */ + BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS = 0x80000000 +} +bfd_mach_o_section_attribute; + +/* Symbol constants. */ + +/* Symbol n_type values. */ +#define BFD_MACH_O_N_STAB 0xe0 /* If any of these bits set, a symbolic debugging entry. */ +#define BFD_MACH_O_N_PEXT 0x10 /* Private external symbol bit. */ +#define BFD_MACH_O_N_TYPE 0x0e /* Mask for the type bits. */ +#define BFD_MACH_O_N_EXT 0x01 /* External symbol bit, set for external symbols. */ +#define BFD_MACH_O_N_UNDF 0x00 /* Undefined, n_sect == NO_SECT. */ +#define BFD_MACH_O_N_ABS 0x02 /* Absolute, n_sect == NO_SECT. */ +#define BFD_MACH_O_N_INDR 0x0a /* Indirect. */ +#define BFD_MACH_O_N_PBUD 0x0c /* Prebound undefined (defined in a dylib). */ +#define BFD_MACH_O_N_SECT 0x0e /* Defined in section number n_sect. */ + +#define BFD_MACH_O_NO_SECT 0 /* Symbol not in any section of the image. */ + +/* Symbol n_desc reference flags. */ +#define BFD_MACH_O_REFERENCE_MASK 0x07 +#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_NON_LAZY 0x00 +#define BFD_MACH_O_REFERENCE_FLAG_UNDEFINED_LAZY 0x01 +#define BFD_MACH_O_REFERENCE_FLAG_DEFINED 0x02 +#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_DEFINED 0x03 +#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY 0x04 +#define BFD_MACH_O_REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY 0x05 + +#define BFD_MACH_O_REFERENCED_DYNAMICALLY 0x10 +#define BFD_MACH_O_N_DESC_DISCARDED 0x20 +#define BFD_MACH_O_N_NO_DEAD_STRIP 0x20 +#define BFD_MACH_O_N_WEAK_REF 0x40 +#define BFD_MACH_O_N_WEAK_DEF 0x80 +#define BFD_MACH_O_N_REF_TO_WEAK 0x80 + +#define BFD_MACH_O_N_ARM_THUMB_DEF 0x08 +#define BFD_MACH_O_N_SYMBOL_RESOLVER 0x100 + +#define BFD_MACH_O_INDIRECT_SYM_LOCAL 0x80000000 +#define BFD_MACH_O_INDIRECT_SYM_ABS 0x40000000 + +/* Constants for DATA_IN_CODE entries. */ +typedef enum bfd_mach_o_data_in_code_entry_kind +{ + BFD_MACH_O_DICE_KIND_DATA = 0x0001, /* Data */ + BFD_MACH_O_DICE_JUMP_TABLES8 = 0x0002, /* 1 byte jump tables. */ + BFD_MACH_O_DICE_JUMP_TABLES16 = 0x0003, /* 2 bytes. */ + BFD_MACH_O_DICE_JUMP_TABLES32 = 0x0004, /* 4 bytes. */ + BFD_MACH_O_DICE_ABS_JUMP_TABLES32 = 0x0005 /* Absolute jump table. */ +} bfd_mach_o_data_in_code_entry_kind; + +/* Thread constants. */ + +typedef enum bfd_mach_o_ppc_thread_flavour +{ + BFD_MACH_O_PPC_THREAD_STATE = 1, + BFD_MACH_O_PPC_FLOAT_STATE = 2, + BFD_MACH_O_PPC_EXCEPTION_STATE = 3, + BFD_MACH_O_PPC_VECTOR_STATE = 4, + BFD_MACH_O_PPC_THREAD_STATE64 = 5, + BFD_MACH_O_PPC_EXCEPTION_STATE64 = 6, + BFD_MACH_O_PPC_THREAD_STATE_NONE = 7 +} +bfd_mach_o_ppc_thread_flavour; + +/* Defined in */ +typedef enum bfd_mach_o_i386_thread_flavour +{ + BFD_MACH_O_x86_THREAD_STATE32 = 1, + BFD_MACH_O_x86_FLOAT_STATE32 = 2, + BFD_MACH_O_x86_EXCEPTION_STATE32 = 3, + BFD_MACH_O_x86_THREAD_STATE64 = 4, + BFD_MACH_O_x86_FLOAT_STATE64 = 5, + BFD_MACH_O_x86_EXCEPTION_STATE64 = 6, + BFD_MACH_O_x86_THREAD_STATE = 7, + BFD_MACH_O_x86_FLOAT_STATE = 8, + BFD_MACH_O_x86_EXCEPTION_STATE = 9, + BFD_MACH_O_x86_DEBUG_STATE32 = 10, + BFD_MACH_O_x86_DEBUG_STATE64 = 11, + BFD_MACH_O_x86_DEBUG_STATE = 12, + BFD_MACH_O_x86_THREAD_STATE_NONE = 13 +} +bfd_mach_o_i386_thread_flavour; + +#endif /* _MACH_O_LOADER_H */ diff --git a/include/mach-o/reloc.h b/include/mach-o/reloc.h new file mode 100644 index 0000000..bab31ef --- /dev/null +++ b/include/mach-o/reloc.h @@ -0,0 +1,33 @@ +/* Mach-O support for BFD. + Copyright 2011, 2012 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_RELOC_H +#define _MACH_O_RELOC_H + +/* Generic relocation types (used by i386). */ +#define BFD_MACH_O_GENERIC_RELOC_VANILLA 0 +#define BFD_MACH_O_GENERIC_RELOC_PAIR 1 +#define BFD_MACH_O_GENERIC_RELOC_SECTDIFF 2 +#define BFD_MACH_O_GENERIC_RELOC_PB_LA_PTR 3 +#define BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF 4 +#define BFD_MACH_O_GENERIC_RELOC_TLV 5 + +#endif /* _MACH_O_RELOC_H */ diff --git a/include/mach-o/x86-64.h b/include/mach-o/x86-64.h new file mode 100644 index 0000000..d06bc26 --- /dev/null +++ b/include/mach-o/x86-64.h @@ -0,0 +1,37 @@ +/* Mach-O support for BFD. + Copyright 2011 + Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MACH_O_X86_64_H +#define _MACH_O_X86_64_H + +/* X86-64 relocations. */ +#define BFD_MACH_O_X86_64_RELOC_UNSIGNED 0 /* Absolute addresses. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED 1 /* 32-bit disp. */ +#define BFD_MACH_O_X86_64_RELOC_BRANCH 2 /* 32-bit pcrel disp. */ +#define BFD_MACH_O_X86_64_RELOC_GOT_LOAD 3 /* Movq load of a GOT entry. */ +#define BFD_MACH_O_X86_64_RELOC_GOT 4 /* GOT reference. */ +#define BFD_MACH_O_X86_64_RELOC_SUBTRACTOR 5 /* Symbol difference. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED_1 6 /* 32-bit signed disp -1. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED_2 7 /* 32-bit signed disp -2. */ +#define BFD_MACH_O_X86_64_RELOC_SIGNED_4 8 /* 32-bit signed disp -4. */ +#define BFD_MACH_O_X86_64_RELOC_TLV 9 /* Thread local variables. */ + +#endif /* _MACH_O_X86_64_H */ diff --git a/include/machine/_arc4random.h b/include/machine/_arc4random.h new file mode 100644 index 0000000..52808d7 --- /dev/null +++ b/include/machine/_arc4random.h @@ -0,0 +1 @@ +/* Use default implementation, see arc4random.h */ diff --git a/include/machine/_default_types.h b/include/machine/_default_types.h new file mode 100644 index 0000000..6137493 --- /dev/null +++ b/include/machine/_default_types.h @@ -0,0 +1,250 @@ +/* + * $Id$ + */ + +#ifndef _MACHINE__DEFAULT_TYPES_H +#define _MACHINE__DEFAULT_TYPES_H + +#include + +/* + * Guess on types by examining *_MIN / *_MAX defines. + */ +#if __GNUC_PREREQ (3, 3) +/* GCC >= 3.3.0 has ____ implicitly defined. */ +#define __EXP(x) __##x##__ +#else +/* Fall back to POSIX versions from */ +#define __EXP(x) x +#include +#endif + +/* Check if "long long" is 64bit wide */ +/* Modern GCCs provide __LONG_LONG_MAX__, SUSv3 wants LLONG_MAX */ +#if ( defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) ) \ + || ( defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) ) +#define __have_longlong64 1 +#endif + +/* Check if "long" is 64bit or 32bit wide */ +#if __EXP(LONG_MAX) > 0x7fffffff +#define __have_long64 1 +#elif __EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__) +#define __have_long32 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __INT8_TYPE__ +typedef __INT8_TYPE__ __int8_t; +#ifdef __UINT8_TYPE__ +typedef __UINT8_TYPE__ __uint8_t; +#else +typedef unsigned __INT8_TYPE__ __uint8_t; +#endif +#define ___int8_t_defined 1 +#elif __EXP(SCHAR_MAX) == 0x7f +typedef signed char __int8_t ; +typedef unsigned char __uint8_t ; +#define ___int8_t_defined 1 +#endif + +#ifdef __INT16_TYPE__ +typedef __INT16_TYPE__ __int16_t; +#ifdef __UINT16_TYPE__ +typedef __UINT16_TYPE__ __uint16_t; +#else +typedef unsigned __INT16_TYPE__ __uint16_t; +#endif +#define ___int16_t_defined 1 +#elif __EXP(INT_MAX) == 0x7fff +typedef signed int __int16_t; +typedef unsigned int __uint16_t; +#define ___int16_t_defined 1 +#elif __EXP(SHRT_MAX) == 0x7fff +typedef signed short __int16_t; +typedef unsigned short __uint16_t; +#define ___int16_t_defined 1 +#elif __EXP(SCHAR_MAX) == 0x7fff +typedef signed char __int16_t; +typedef unsigned char __uint16_t; +#define ___int16_t_defined 1 +#endif + +#ifdef __INT32_TYPE__ +typedef __INT32_TYPE__ __int32_t; +#ifdef __UINT32_TYPE__ +typedef __UINT32_TYPE__ __uint32_t; +#else +typedef unsigned __INT32_TYPE__ __uint32_t; +#endif +#define ___int32_t_defined 1 +#elif __EXP(INT_MAX) == 0x7fffffffL +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +#define ___int32_t_defined 1 +#elif __EXP(LONG_MAX) == 0x7fffffffL +typedef signed long __int32_t; +typedef unsigned long __uint32_t; +#define ___int32_t_defined 1 +#elif __EXP(SHRT_MAX) == 0x7fffffffL +typedef signed short __int32_t; +typedef unsigned short __uint32_t; +#define ___int32_t_defined 1 +#elif __EXP(SCHAR_MAX) == 0x7fffffffL +typedef signed char __int32_t; +typedef unsigned char __uint32_t; +#define ___int32_t_defined 1 +#endif + +#ifdef __INT64_TYPE__ +typedef __INT64_TYPE__ __int64_t; +#ifdef __UINT64_TYPE__ +typedef __UINT64_TYPE__ __uint64_t; +#else +typedef unsigned __INT64_TYPE__ __uint64_t; +#endif +#define ___int64_t_defined 1 +#elif __EXP(LONG_MAX) > 0x7fffffff +typedef signed long __int64_t; +typedef unsigned long __uint64_t; +#define ___int64_t_defined 1 + +/* GCC has __LONG_LONG_MAX__ */ +#elif defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) +typedef signed long long __int64_t; +typedef unsigned long long __uint64_t; +#define ___int64_t_defined 1 + +/* POSIX mandates LLONG_MAX in */ +#elif defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) +typedef signed long long __int64_t; +typedef unsigned long long __uint64_t; +#define ___int64_t_defined 1 + +#elif __EXP(INT_MAX) > 0x7fffffff +typedef signed int __int64_t; +typedef unsigned int __uint64_t; +#define ___int64_t_defined 1 +#endif + +#ifdef __INT_LEAST8_TYPE__ +typedef __INT_LEAST8_TYPE__ __int_least8_t; +#ifdef __UINT_LEAST8_TYPE__ +typedef __UINT_LEAST8_TYPE__ __uint_least8_t; +#else +typedef unsigned __INT_LEAST8_TYPE__ __uint_least8_t; +#endif +#define ___int_least8_t_defined 1 +#elif defined(___int8_t_defined) +typedef __int8_t __int_least8_t; +typedef __uint8_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#elif defined(___int16_t_defined) +typedef __int16_t __int_least8_t; +typedef __uint16_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#elif defined(___int32_t_defined) +typedef __int32_t __int_least8_t; +typedef __uint32_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least8_t; +typedef __uint64_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#endif + +#ifdef __INT_LEAST16_TYPE__ +typedef __INT_LEAST16_TYPE__ __int_least16_t; +#ifdef __UINT_LEAST16_TYPE__ +typedef __UINT_LEAST16_TYPE__ __uint_least16_t; +#else +typedef unsigned __INT_LEAST16_TYPE__ __uint_least16_t; +#endif +#define ___int_least16_t_defined 1 +#elif defined(___int16_t_defined) +typedef __int16_t __int_least16_t; +typedef __uint16_t __uint_least16_t; +#define ___int_least16_t_defined 1 +#elif defined(___int32_t_defined) +typedef __int32_t __int_least16_t; +typedef __uint32_t __uint_least16_t; +#define ___int_least16_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least16_t; +typedef __uint64_t __uint_least16_t; +#define ___int_least16_t_defined 1 +#endif + +#ifdef __INT_LEAST32_TYPE__ +typedef __INT_LEAST32_TYPE__ __int_least32_t; +#ifdef __UINT_LEAST32_TYPE__ +typedef __UINT_LEAST32_TYPE__ __uint_least32_t; +#else +typedef unsigned __INT_LEAST32_TYPE__ __uint_least32_t; +#endif +#define ___int_least32_t_defined 1 +#elif defined(___int32_t_defined) +typedef __int32_t __int_least32_t; +typedef __uint32_t __uint_least32_t; +#define ___int_least32_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least32_t; +typedef __uint64_t __uint_least32_t; +#define ___int_least32_t_defined 1 +#endif + +#ifdef __INT_LEAST64_TYPE__ +typedef __INT_LEAST64_TYPE__ __int_least64_t; +#ifdef __UINT_LEAST64_TYPE__ +typedef __UINT_LEAST64_TYPE__ __uint_least64_t; +#else +typedef unsigned __INT_LEAST64_TYPE__ __uint_least64_t; +#endif +#define ___int_least64_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least64_t; +typedef __uint64_t __uint_least64_t; +#define ___int_least64_t_defined 1 +#endif + +#if defined(__INTMAX_TYPE__) +typedef __INTMAX_TYPE__ __intmax_t; +#elif __have_longlong64 +typedef signed long long __intmax_t; +#else +typedef signed long __intmax_t; +#endif + +#if defined(__UINTMAX_TYPE__) +typedef __UINTMAX_TYPE__ __uintmax_t; +#elif __have_longlong64 +typedef unsigned long long __uintmax_t; +#else +typedef unsigned long __uintmax_t; +#endif + +#ifdef __INTPTR_TYPE__ +typedef __INTPTR_TYPE__ __intptr_t; +#ifdef __UINTPTR_TYPE__ +typedef __UINTPTR_TYPE__ __uintptr_t; +#else +typedef unsigned __INTPTR_TYPE__ __uintptr_t; +#endif +#elif defined(__PTRDIFF_TYPE__) +typedef __PTRDIFF_TYPE__ __intptr_t; +typedef unsigned __PTRDIFF_TYPE__ __uintptr_t; +#else +typedef long __intptr_t; +typedef unsigned long __uintptr_t; +#endif + +#undef __EXP + +#ifdef __cplusplus +} +#endif + +#endif /* _MACHINE__DEFAULT_TYPES_H */ diff --git a/include/machine/_endian.h b/include/machine/_endian.h new file mode 100644 index 0000000..92a14dc --- /dev/null +++ b/include/machine/_endian.h @@ -0,0 +1,35 @@ +#ifndef __MACHINE_ENDIAN_H__ +#error "must be included via " +#endif /* !__MACHINE_ENDIAN_H__ */ + +#include + +#ifdef __PPC__ +/* Get rid of GCC builtin defines on PowerPC */ +#ifdef _BIG_ENDIAN +#undef _BIG_ENDIAN +#endif +#ifdef _LITTLE_ENDIAN +#undef _LITTLE_ENDIAN +#endif +#endif /* __PPC__ */ + +#ifndef _LITTLE_ENDIAN +#define _LITTLE_ENDIAN 1234 +#endif + +#ifndef _BIG_ENDIAN +#define _BIG_ENDIAN 4321 +#endif + +#ifndef _PDP_ENDIAN +#define _PDP_ENDIAN 3412 +#endif + +#ifndef _BYTE_ORDER +#if defined(__IEEE_LITTLE_ENDIAN) || defined(__IEEE_BYTES_LITTLE_ENDIAN) +#define _BYTE_ORDER _LITTLE_ENDIAN +#else +#define _BYTE_ORDER _BIG_ENDIAN +#endif +#endif diff --git a/include/machine/_time.h b/include/machine/_time.h new file mode 100644 index 0000000..476760c --- /dev/null +++ b/include/machine/_time.h @@ -0,0 +1,3 @@ +#ifndef _SYS_TIME_H_ +#error "must be included via " +#endif /* !_SYS_TIME_H_ */ diff --git a/include/machine/_types.h b/include/machine/_types.h new file mode 100644 index 0000000..17e6d51 --- /dev/null +++ b/include/machine/_types.h @@ -0,0 +1,8 @@ +/* + * $Id$ + */ + +#ifndef _MACHINE__TYPES_H +#define _MACHINE__TYPES_H +#include +#endif diff --git a/include/machine/ansi.h b/include/machine/ansi.h new file mode 100644 index 0000000..737b6d0 --- /dev/null +++ b/include/machine/ansi.h @@ -0,0 +1 @@ +/* dummy header file to support BSD compiler */ diff --git a/include/machine/endian.h b/include/machine/endian.h new file mode 100644 index 0000000..34a5726 --- /dev/null +++ b/include/machine/endian.h @@ -0,0 +1,69 @@ +#ifndef __MACHINE_ENDIAN_H__ +#define __MACHINE_ENDIAN_H__ + +#include +#include +#include + +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define _QUAD_HIGHWORD 1 +#define _QUAD_LOWWORD 0 +#else +#define _QUAD_HIGHWORD 0 +#define _QUAD_LOWWORD 1 +#endif + +#if __BSD_VISIBLE +#define LITTLE_ENDIAN _LITTLE_ENDIAN +#define BIG_ENDIAN _BIG_ENDIAN +#define PDP_ENDIAN _PDP_ENDIAN +#define BYTE_ORDER _BYTE_ORDER +#endif + +#ifdef __GNUC__ +#define __bswap16(_x) __builtin_bswap16(_x) +#define __bswap32(_x) __builtin_bswap32(_x) +#define __bswap64(_x) __builtin_bswap64(_x) +#else /* __GNUC__ */ +static __inline __uint16_t +__bswap16(__uint16_t _x) +{ + + return ((__uint16_t)((_x >> 8) | ((_x << 8) & 0xff00))); +} + +static __inline __uint32_t +__bswap32(__uint32_t _x) +{ + + return ((__uint32_t)((_x >> 24) | ((_x >> 8) & 0xff00) | + ((_x << 8) & 0xff0000) | ((_x << 24) & 0xff000000))); +} + +static __inline __uint64_t +__bswap64(__uint64_t _x) +{ + + return ((__uint64_t)((_x >> 56) | ((_x >> 40) & 0xff00) | + ((_x >> 24) & 0xff0000) | ((_x >> 8) & 0xff000000) | + ((_x << 8) & ((__uint64_t)0xff << 32)) | + ((_x << 24) & ((__uint64_t)0xff << 40)) | + ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56)))); +} +#endif /* !__GNUC__ */ + +#ifndef __machine_host_to_from_network_defined +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define __htonl(_x) __bswap32(_x) +#define __htons(_x) __bswap16(_x) +#define __ntohl(_x) __bswap32(_x) +#define __ntohs(_x) __bswap16(_x) +#else +#define __htonl(_x) ((__uint32_t)(_x)) +#define __htons(_x) ((__uint16_t)(_x)) +#define __ntohl(_x) ((__uint32_t)(_x)) +#define __ntohs(_x) ((__uint16_t)(_x)) +#endif +#endif /* __machine_host_to_from_network_defined */ + +#endif /* __MACHINE_ENDIAN_H__ */ diff --git a/include/machine/fastmath.h b/include/machine/fastmath.h new file mode 100644 index 0000000..d13ab3b --- /dev/null +++ b/include/machine/fastmath.h @@ -0,0 +1,98 @@ +#ifdef __sysvnecv70_target +double EXFUN(fast_sin,(double)); +double EXFUN(fast_cos,(double)); +double EXFUN(fast_tan,(double)); + +double EXFUN(fast_asin,(double)); +double EXFUN(fast_acos,(double)); +double EXFUN(fast_atan,(double)); + +double EXFUN(fast_sinh,(double)); +double EXFUN(fast_cosh,(double)); +double EXFUN(fast_tanh,(double)); + +double EXFUN(fast_asinh,(double)); +double EXFUN(fast_acosh,(double)); +double EXFUN(fast_atanh,(double)); + +double EXFUN(fast_abs,(double)); +double EXFUN(fast_sqrt,(double)); +double EXFUN(fast_exp2,(double)); +double EXFUN(fast_exp10,(double)); +double EXFUN(fast_expe,(double)); +double EXFUN(fast_log10,(double)); +double EXFUN(fast_log2,(double)); +double EXFUN(fast_loge,(double)); + + +#define sin(x) fast_sin(x) +#define cos(x) fast_cos(x) +#define tan(x) fast_tan(x) +#define asin(x) fast_asin(x) +#define acos(x) fast_acos(x) +#define atan(x) fast_atan(x) +#define sinh(x) fast_sinh(x) +#define cosh(x) fast_cosh(x) +#define tanh(x) fast_tanh(x) +#define asinh(x) fast_asinh(x) +#define acosh(x) fast_acosh(x) +#define atanh(x) fast_atanh(x) +#define abs(x) fast_abs(x) +#define sqrt(x) fast_sqrt(x) +#define exp2(x) fast_exp2(x) +#define exp10(x) fast_exp10(x) +#define expe(x) fast_expe(x) +#define log10(x) fast_log10(x) +#define log2(x) fast_log2(x) +#define loge(x) fast_loge(x) + +/* These functions are in assembler, they really do take floats. This + can only be used with a real ANSI compiler */ + +float EXFUN(fast_sinf,(float)); +float EXFUN(fast_cosf,(float)); +float EXFUN(fast_tanf,(float)); + +float EXFUN(fast_asinf,(float)); +float EXFUN(fast_acosf,(float)); +float EXFUN(fast_atanf,(float)); + +float EXFUN(fast_sinhf,(float)); +float EXFUN(fast_coshf,(float)); +float EXFUN(fast_tanhf,(float)); + +float EXFUN(fast_asinhf,(float)); +float EXFUN(fast_acoshf,(float)); +float EXFUN(fast_atanhf,(float)); + +float EXFUN(fast_absf,(float)); +float EXFUN(fast_sqrtf,(float)); +float EXFUN(fast_exp2f,(float)); +float EXFUN(fast_exp10f,(float)); +float EXFUN(fast_expef,(float)); +float EXFUN(fast_log10f,(float)); +float EXFUN(fast_log2f,(float)); +float EXFUN(fast_logef,(float)); +#define sinf(x) fast_sinf(x) +#define cosf(x) fast_cosf(x) +#define tanf(x) fast_tanf(x) +#define asinf(x) fast_asinf(x) +#define acosf(x) fast_acosf(x) +#define atanf(x) fast_atanf(x) +#define sinhf(x) fast_sinhf(x) +#define coshf(x) fast_coshf(x) +#define tanhf(x) fast_tanhf(x) +#define asinhf(x) fast_asinhf(x) +#define acoshf(x) fast_acoshf(x) +#define atanhf(x) fast_atanhf(x) +#define absf(x) fast_absf(x) +#define sqrtf(x) fast_sqrtf(x) +#define exp2f(x) fast_exp2f(x) +#define exp10f(x) fast_exp10f(x) +#define expef(x) fast_expef(x) +#define log10f(x) fast_log10f(x) +#define log2f(x) fast_log2f(x) +#define logef(x) fast_logef(x) +/* Override the functions defined in math.h */ +#endif /* __sysvnecv70_target */ + diff --git a/include/machine/ieee.h b/include/machine/ieee.h new file mode 100644 index 0000000..0656909 --- /dev/null +++ b/include/machine/ieee.h @@ -0,0 +1,127 @@ +#ifndef _MACHINE_IEEE_H_ +#define _MACHINE_IEEE_H_ +#include +#include +#include +#include + +#if LDBL_MANT_DIG == 24 +#define EXT_IMPLICIT_NBIT +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_frac; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN +struct ieee_ext { + uint32_t ext_frac:23; + uint32_t ext_exp:8; + uint32_t ext_sign:1; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN + uint32_t ext_sign:1; + uint32_t ext_exp:8; + uint32_t ext_frac:23; +#else /* ARMEL without __VFP_FP__ */ + uint32_t ext_frac:23; + uint32_t ext_exp:8; + uint32_t ext_sign:1; +#endif +}; +#endif +#elif LDBL_MANT_DIG == 53 +#define EXT_IMPLICIT_NBIT +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_fracl; \ + (a)[1] = (p)->ext_frach; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN +struct ieee_ext { + uint32_t ext_fracl; + uint32_t ext_frach:20; + uint32_t ext_exp:11; + uint32_t ext_sign:1; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN + uint32_t ext_sign:1; + uint32_t ext_exp:11; + uint32_t ext_frach:20; +#else /* ARMEL without __VFP_FP__ */ + uint32_t ext_frach:20; + uint32_t ext_exp:11; + uint32_t ext_sign:1; +#endif + uint32_t ext_fracl; +}; +#endif +#elif LDBL_MANT_DIG == 64 +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_fracl; \ + (a)[1] = (p)->ext_frach; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN /* for Intel CPU */ +struct ieee_ext { + uint32_t ext_fracl; + uint32_t ext_frach; + uint32_t ext_exp:15; + uint32_t ext_sign:1; + uint32_t ext_padl:16; + uint32_t ext_padh; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN /* for m68k */ + uint32_t ext_sign:1; + uint32_t ext_exp:15; + uint32_t ext_pad:16; +#else /* ARM FPA10 math coprocessor */ + uint32_t ext_exp:15; + uint32_t ext_pad:16; + uint32_t ext_sign:1; +#endif + uint32_t ext_frach; + uint32_t ext_fracl; +}; +#endif +#elif LDBL_MANT_DIG == 113 +#define EXT_IMPLICIT_NBIT +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_fracl; \ + (a)[1] = (p)->ext_fraclm; \ + (a)[2] = (p)->ext_frachm; \ + (a)[3] = (p)->ext_frach; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN +struct ieee_ext { + uint32_t ext_fracl; + uint32_t ext_fraclm; + uint32_t ext_frachm; + uint32_t ext_frach:16; + uint32_t ext_exp:15; + uint32_t ext_sign:1; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN + uint32_t ext_sign:1; + uint32_t ext_exp:15; + uint32_t ext_frach:16; +#else /* ARMEL without __VFP_FP__ */ + uint32_t ext_frach:16; + uint32_t ext_exp:15; + uint32_t ext_sign:1; +#endif + uint32_t ext_frachm; + uint32_t ext_fraclm; + uint32_t ext_fracl; +}; +#endif +#endif + +#endif /* _MACHINE_IEEE_H_ */ diff --git a/include/machine/ieeefp.h b/include/machine/ieeefp.h new file mode 100644 index 0000000..a29557a --- /dev/null +++ b/include/machine/ieeefp.h @@ -0,0 +1,529 @@ +#ifndef __IEEE_BIG_ENDIAN +#ifndef __IEEE_LITTLE_ENDIAN + +/* This file can define macros to choose variations of the IEEE float + format: + + _FLT_LARGEST_EXPONENT_IS_NORMAL + + Defined if the float format uses the largest exponent for finite + numbers rather than NaN and infinity representations. Such a + format cannot represent NaNs or infinities at all, but it's FLT_MAX + is twice the IEEE value. + + _FLT_NO_DENORMALS + + Defined if the float format does not support IEEE denormals. Every + float with a zero exponent is taken to be a zero representation. + + ??? At the moment, there are no equivalent macros above for doubles and + the macros are not fully supported by --enable-newlib-hw-fp. + + __IEEE_BIG_ENDIAN + + Defined if the float format is big endian. This is mutually exclusive + with __IEEE_LITTLE_ENDIAN. + + __IEEE_LITTLE_ENDIAN + + Defined if the float format is little endian. This is mutually exclusive + with __IEEE_BIG_ENDIAN. + + Note that one of __IEEE_BIG_ENDIAN or __IEEE_LITTLE_ENDIAN must be specified for a + platform or error will occur. + + __IEEE_BYTES_LITTLE_ENDIAN + + This flag is used in conjunction with __IEEE_BIG_ENDIAN to describe a situation + whereby multiple words of an IEEE floating point are in big endian order, but the + words themselves are little endian with respect to the bytes. + + _DOUBLE_IS_32BITS + + This is used on platforms that support double by using the 32-bit IEEE + float type. + + _FLOAT_ARG + + This represents what type a float arg is passed as. It is used when the type is + not promoted to double. + + + __OBSOLETE_MATH_DEFAULT + + Default value for __OBSOLETE_MATH if that's not set by the user. + It should be set here based on predefined feature macros. + + __OBSOLETE_MATH + + If set to 1 then some new math code will be disabled and older libm + code will be used instead. This is necessary because the new math + code does not support all targets, it assumes that the toolchain has + ISO C99 support (hexfloat literals, standard fenv semantics), the + target has IEEE-754 conforming binary32 float and binary64 double + (not mixed endian) representation, standard SNaN representation, + double and single precision arithmetics has similar latency and it + has no legacy SVID matherr support, only POSIX errno and fenv + exception based error handling. +*/ + +#if (defined(__arm__) || defined(__thumb__)) && !defined(__MAVERICK__) +/* ARM traditionally used big-endian words; and within those words the + byte ordering was big or little endian depending upon the target. + Modern floating-point formats are naturally ordered; in this case + __VFP_FP__ will be defined, even if soft-float. */ +#ifdef __VFP_FP__ +# ifdef __ARMEL__ +# define __IEEE_LITTLE_ENDIAN +# else +# define __IEEE_BIG_ENDIAN +# endif +# if __ARM_FP & 0x8 +# define __OBSOLETE_MATH_DEFAULT 0 +# endif +#else +# define __IEEE_BIG_ENDIAN +# ifdef __ARMEL__ +# define __IEEE_BYTES_LITTLE_ENDIAN +# endif +#endif +#ifndef __SOFTFP__ +# define _SUPPORTS_ERREXCEPT +#endif +/* As per ISO/IEC TS 18661 '__FLT_EVAL_METHOD__' will be defined to 16 + (if compiling with +fp16 support) so it can't be used by math.h to + define float_t and double_t. For values of '__FLT_EVAL_METHOD__' + other than 0, 1, 2 the definition of float_t and double_t is + implementation-defined. */ +#define __DOUBLE_TYPE double +#define __FLOAT_TYPE float +#endif + +#if defined (__aarch64__) +#if defined (__AARCH64EL__) +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#define __OBSOLETE_MATH_DEFAULT 0 +#ifdef __ARM_FP +# define _SUPPORTS_ERREXCEPT +#endif +/* As per ISO/IEC TS 18661 '__FLT_EVAL_METHOD__' will be defined to 16 + (if compiling with +fp16 support) so it can't be used by math.h to + define float_t and double_t. For values of '__FLT_EVAL_METHOD__' + other than 0, 1, 2 the definition of float_t and double_t is + implementation-defined. */ +#define __DOUBLE_TYPE double +#define __FLOAT_TYPE float +#endif + +#ifdef __epiphany__ +#define __IEEE_LITTLE_ENDIAN +#define Sudden_Underflow 1 +#endif + +#ifdef __hppa__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __nds32__ +#ifdef __big_endian__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __SPU__ +#define __IEEE_BIG_ENDIAN + +#define isfinite(__y) \ + (__extension__ ({int __cy; \ + (sizeof (__y) == sizeof (float)) ? (1) : \ + (__cy = fpclassify(__y)) != FP_INFINITE && __cy != FP_NAN;})) + +#define isinf(__x) ((sizeof (__x) == sizeof (float)) ? (0) : __isinfd(__x)) +#define isnan(__x) ((sizeof (__x) == sizeof (float)) ? (0) : __isnand(__x)) + +/* + * Macros for use in ieeefp.h. We can't just define the real ones here + * (like those above) as we have name space issues when this is *not* + * included via generic the ieeefp.h. + */ +#define __ieeefp_isnanf(x) 0 +#define __ieeefp_isinff(x) 0 +#define __ieeefp_finitef(x) 1 +#endif + +#ifdef __sparc__ +#ifdef __LITTLE_ENDIAN_DATA__ +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#endif + +#if defined(__m68k__) || defined(__mc68000__) +#define __IEEE_BIG_ENDIAN +#endif + +#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) +#define __IEEE_BIG_ENDIAN +#ifdef __HAVE_SHORT_DOUBLE__ +# define _DOUBLE_IS_32BITS +#endif +#endif + +#if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__) || defined (__H8500__) || defined (__H8300SX__) +#define __IEEE_BIG_ENDIAN +#define _FLOAT_ARG float +#define _DOUBLE_IS_32BITS +#endif + +#if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__) +#define __IEEE_LITTLE_ENDIAN +#define _FLOAT_ARG float +#define _DOUBLE_IS_32BITS +#endif + + +#ifdef __sh__ +#ifdef __LITTLE_ENDIAN__ +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#if defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH2A_SINGLE_ONLY__) +#define _DOUBLE_IS_32BITS +#endif +#endif + +#ifdef _AM29K +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef _WIN32 +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __i386__ +#define __IEEE_LITTLE_ENDIAN +# define _SUPPORTS_ERREXCEPT +#endif + +#ifdef __riscv +#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#ifdef __riscv_flen +# define _SUPPORTS_ERREXCEPT +#endif +#if __riscv_flen == 64 +# define __OBSOLETE_MATH_DEFAULT 0 +#else +# define __OBSOLETE_MATH_DEFAULT 1 +#endif +#endif + +#ifdef __i960__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __lm32__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __M32R__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __nvptx__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#if defined(_C4x) || defined(_C3x) +#define __IEEE_BIG_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __TMS320C6X__ +#ifdef _BIG_ENDIAN +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __TIC80__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __MIPSEL__ +#define __IEEE_LITTLE_ENDIAN +#endif +#ifdef __MIPSEB__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __MMIX__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __D30V__ +#define __IEEE_BIG_ENDIAN +#endif + +/* necv70 was __IEEE_LITTLE_ENDIAN. */ + +#ifdef __W65__ +#define __IEEE_LITTLE_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#if defined(__Z8001__) || defined(__Z8002__) +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __m88k__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __mn10300__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __mn10200__ +#define __IEEE_LITTLE_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __v800 +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __v850 +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __D10V__ +#define __IEEE_BIG_ENDIAN +#if __DOUBLE__ == 32 +#define _DOUBLE_IS_32BITS +#endif +#endif + +#ifdef __PPC__ +#if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX) +#define __IEEE_BIG_ENDIAN +#else +#if (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN) || (defined(__sun__) && __sun__) || (defined(_WIN32) && _WIN32) +#define __IEEE_LITTLE_ENDIAN +#endif +#endif +#endif + +#ifdef __xstormy16__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __arc__ +#ifdef __big_endian__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __CRX__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __CSKY__ +#ifdef __CSKYBE__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __fr30__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __FT32__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __mcore__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __mt__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __frv__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __moxie__ +#ifdef __MOXIE_BIG_ENDIAN__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __ia64__ +#ifdef __BIG_ENDIAN__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __AVR__ +#define __IEEE_LITTLE_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#if defined(__or1k__) || defined(__OR1K__) || defined(__OR1KND__) +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __IP2K__ +#define __IEEE_BIG_ENDIAN +#define __SMALL_BITFIELDS +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __iq2000__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __MAVERICK__ +#ifdef __ARMEL__ +# define __IEEE_LITTLE_ENDIAN +#else /* must be __ARMEB__ */ +# define __IEEE_BIG_ENDIAN +#endif /* __ARMEL__ */ +#endif /* __MAVERICK__ */ + +#ifdef __m32c__ +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS +#endif + +#ifdef __CRIS__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __BFIN__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __x86_64__ +#define __IEEE_LITTLE_ENDIAN +# define _SUPPORTS_ERREXCEPT +#endif + +#ifdef __mep__ +#ifdef __LITTLE_ENDIAN__ +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#endif + +#ifdef __MICROBLAZE__ +#ifndef __MICROBLAZEEL__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __MSP430__ +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS /* 16 Bit INT */ +#endif + +#ifdef __PRU__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __RL78__ +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS /* 16 Bit INT */ +#ifndef __RL78_64BIT_DOUBLES__ +#define _DOUBLE_IS_32BITS +#endif +#endif + +#ifdef __RX__ + +#ifdef __RX_BIG_ENDIAN__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifndef __RX_64BIT_DOUBLES__ +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __RX_16BIT_INTS__ +#define __SMALL_BITFIELDS +#endif + +#endif + +#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS /* 16 Bit INT */ +#endif + +#ifdef __NIOS2__ +# ifdef __nios2_big_endian__ +# define __IEEE_BIG_ENDIAN +# else +# define __IEEE_LITTLE_ENDIAN +# endif +#endif + +#ifdef __VISIUM__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __AMDGCN__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __XTENSA_EL__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __CYGWIN__ +#define __OBSOLETE_MATH_DEFAULT 0 +#endif + +#ifndef __OBSOLETE_MATH_DEFAULT +/* Use old math code by default. */ +#define __OBSOLETE_MATH_DEFAULT 1 +#endif +#ifndef __OBSOLETE_MATH +#define __OBSOLETE_MATH __OBSOLETE_MATH_DEFAULT +#endif + +#ifndef __IEEE_BIG_ENDIAN +#ifndef __IEEE_LITTLE_ENDIAN +#error Endianess not declared!! +#endif /* not __IEEE_LITTLE_ENDIAN */ +#endif /* not __IEEE_BIG_ENDIAN */ + +#endif /* not __IEEE_LITTLE_ENDIAN */ +#endif /* not __IEEE_BIG_ENDIAN */ + diff --git a/include/machine/malloc.h b/include/machine/malloc.h new file mode 100644 index 0000000..fdada9e --- /dev/null +++ b/include/machine/malloc.h @@ -0,0 +1,8 @@ +#ifndef _MACHMALLOC_H_ +#define _MACHMALLOC_H_ + +/* place holder so platforms may add malloc.h extensions */ + +#endif /* _MACHMALLOC_H_ */ + + diff --git a/include/machine/param.h b/include/machine/param.h new file mode 100644 index 0000000..bdf8bf7 --- /dev/null +++ b/include/machine/param.h @@ -0,0 +1 @@ +/* Place holder for machine-specific param.h. */ diff --git a/include/machine/setjmp-dj.h b/include/machine/setjmp-dj.h new file mode 100644 index 0000000..6ca5e65 --- /dev/null +++ b/include/machine/setjmp-dj.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1991 DJ Delorie + * All rights reserved. + * + * Redistribution, modification, and use in source and binary forms is permitted + * provided that the above copyright notice and following paragraph are + * duplicated in all such forms. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Modified to use SETJMP_DJ_H rather than SETJMP_H to avoid + conflicting with setjmp.h. Ian Taylor, Cygnus support, April, + 1993. */ + +#ifndef _SETJMP_DJ_H_ +#define _SETJMP_DJ_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned long eax; + unsigned long ebx; + unsigned long ecx; + unsigned long edx; + unsigned long esi; + unsigned long edi; + unsigned long ebp; + unsigned long esp; + unsigned long eip; +} jmp_buf[1]; + +extern int setjmp(jmp_buf); +extern void longjmp(jmp_buf, int); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/machine/setjmp.h b/include/machine/setjmp.h new file mode 100644 index 0000000..29b76ce --- /dev/null +++ b/include/machine/setjmp.h @@ -0,0 +1,495 @@ + +_BEGIN_STD_C + +#if defined(__or1k__) || defined(__or1knd__) +/* + * r1, r2, r9, r14, r16 .. r30, SR. + */ +#define _JBLEN 13 +#define _JBTYPE unsigned long +#endif + +#if defined(__arm__) || defined(__thumb__) +/* + * All callee preserved registers: + * core registers: + * r4 - r10, fp, sp, lr + * VFP registers (architectural support dependent): + * d8 - d15 + */ +#define _JBLEN 20 +#define _JBTYPE long long +#endif + +#if defined(__aarch64__) +#define _JBLEN 22 +#define _JBTYPE long long +#endif + +#if defined(__AVR__) +#define _JBLEN 24 +#endif + +#ifdef __sparc__ +/* + * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). + * All else recovered by under/over(flow) handling. + */ +#define _JBLEN 13 +#endif + +#ifdef __BFIN__ +#define _JBLEN 40 +#endif + +#ifdef __epiphany__ +/* All callee preserved registers: r4-r10,fp, sp, lr,r15, r32-r39 */ +#define _JBTYPE long long +#define _JBLEN 10 +#endif + +/* necv70 was 9 as well. */ + +#if defined(__m68k__) || defined(__mc68000__) +/* + * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6, + * fp2-fp7 for 68881. + * All else recovered by under/over(flow) handling. + */ +#define _JBLEN 34 +#endif + +#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) +/* + * D, X, Y are not saved. + * Only take into account the pseudo soft registers (max 32). + */ +#define _JBLEN 32 +#endif + +#ifdef __nds32__ +/* 17 words for GPRs, + 1 word for $fpcfg.freg and 30 words for FPUs + Reserved 2 words for aligement-adjustment. When storeing double-precision + floating-point register into memory, the address has to be + double-word-aligned. + Check libc/machine/nds32/setjmp.S for more information. */ +#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__ +#define _JBLEN 50 +#else +#define _JBLEN 18 +#endif +#endif + +#if defined(__Z8001__) || defined(__Z8002__) +/* 16 regs + pc */ +#define _JBLEN 20 +#endif + +#ifdef _AM29K +/* + * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). + * All else recovered by under/over(flow) handling. + */ +#define _JBLEN 9 +#endif + +#ifdef __i386__ +# if defined(__CYGWIN__) && !defined (_JBLEN) +# define _JBLEN (13 * 4) +# elif defined(__unix__) || defined(__rtems__) +# define _JBLEN 9 +# elif defined(__iamcu__) +/* Intel MCU jmp_buf only covers callee-saved registers. */ +# define _JBLEN 6 +# else +# include "setjmp-dj.h" +# endif +#endif + +#ifdef __x86_64__ +# ifdef __CYGWIN__ +# define _JBTYPE long +# define _JBLEN 32 +# else +# define _JBTYPE long long +# define _JBLEN 8 +# endif +#endif + +#ifdef __i960__ +#define _JBLEN 35 +#endif + +#ifdef __M32R__ +/* Only 8 words are currently needed. 10 gives us some slop if we need + to expand. */ +#define _JBLEN 10 +#endif + +#ifdef __mips__ +# if defined(__mips64) +# define _JBTYPE long long +# endif +# ifdef __mips_soft_float +# define _JBLEN 11 +# else +# define _JBLEN 23 +# endif +#endif + +#ifdef __m88000__ +#define _JBLEN 21 +#endif + +#ifdef __H8300__ +#define _JBLEN 5 +#define _JBTYPE int +#endif + +#ifdef __H8300H__ +/* same as H8/300 but registers are twice as big */ +#define _JBLEN 5 +#define _JBTYPE long +#endif + +#if defined (__H8300S__) || defined (__H8300SX__) +/* same as H8/300 but registers are twice as big */ +#define _JBLEN 5 +#define _JBTYPE long +#endif + +#ifdef __H8500__ +#define _JBLEN 4 +#endif + +#ifdef __sh__ +#if __SH5__ +#define _JBLEN 50 +#define _JBTYPE long long +#else +#define _JBLEN 20 +#endif /* __SH5__ */ +#endif + +#ifdef __v800 +#define _JBLEN 28 +#endif + +#ifdef __PPC__ +#ifdef __powerpc64__ +#ifdef __ALTIVEC__ +#define _JBLEN 70 +#else +#define _JBLEN 43 +#endif +#else +#ifdef __ALTIVEC__ +#define _JBLEN 64 +#else +#define _JBLEN 32 +#endif +#endif +#define _JBTYPE double +#endif + +#ifdef __MICROBLAZE__ +#define _JBLEN 20 +#define _JBTYPE unsigned int +#endif + +#ifdef __hppa__ +/* %r30, %r2-%r18, %r27, pad, %fr12-%fr15. + Note space exists for the FP registers, but they are not + saved. */ +#define _JBLEN 28 +#endif + +#if defined(__mn10300__) || defined(__mn10200__) +#ifdef __AM33_2__ +#define _JBLEN 26 +#else +/* A guess */ +#define _JBLEN 10 +#endif +#endif + +#ifdef __v850 +/* I think our setjmp is saving 15 regs at the moment. Gives us one word + slop if we need to expand. */ +#define _JBLEN 16 +#endif + +#if defined(_C4x) +#define _JBLEN 10 +#endif +#if defined(_C3x) +#define _JBLEN 9 +#endif + +#ifdef __TMS320C6X__ +#define _JBLEN 13 +#endif + +#ifdef __TIC80__ +#define _JBLEN 13 +#endif + +#ifdef __D10V__ +#define _JBLEN 8 +#endif + +#ifdef __D30V__ +#define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2) +#define _JBTYPE double +#endif + +#ifdef __frv__ +#define _JBLEN (68/2) /* room for 68 32-bit regs */ +#define _JBTYPE double +#endif + +#ifdef __moxie__ +#define _JBLEN 10 +#endif + +#ifdef __CRX__ +#define _JBLEN 9 +#endif + +#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) +/* r6, r7, r8, r9, r10, r11, r12 (r12L, r12H), + * r13 (r13L, r13H), ra(raL, raH), sp(spL, spH) */ +#define _JBLEN 14 +#define _JBTYPE unsigned short +#endif + +#ifdef __fr30__ +#define _JBLEN 10 +#endif + +#ifdef __FT32__ +#define _JBLEN 27 +#endif + +#ifdef __iq2000__ +#define _JBLEN 32 +#endif + +#ifdef __mcore__ +#define _JBLEN 16 +#endif + +#ifdef __arc__ +#define _JBLEN 25 /* r13-r30,blink,lp_count,lp_start,lp_end,mlo,mhi,status32 */ +#endif + +#ifdef __MMIX__ +/* Using a layout compatible with GCC's built-in. */ +#define _JBLEN 5 +#define _JBTYPE unsigned long +#endif + +#ifdef __mt__ +#define _JBLEN 16 +#endif + +#ifdef __SPU__ +#define _JBLEN 50 +#define _JBTYPE __vector signed int +#endif + +#ifdef __xstormy16__ +/* 4 GPRs plus SP plus PC. */ +#define _JBLEN 8 +#endif + +#ifdef __mep__ +/* 16 GPRs, pc, hi, lo */ +#define _JBLEN 19 +#endif + +#ifdef __CRIS__ +#define _JBLEN 18 +#endif + +#ifdef __ia64 +#define _JBLEN 64 +#endif + +#ifdef __lm32__ +#define _JBLEN 19 +#endif + +#ifdef __m32c__ +#if defined(__r8c_cpu__) || defined(__m16c_cpu__) +#define _JBLEN (22/2) +#else +#define _JBLEN (34/2) +#endif +#define _JBTYPE unsigned short +#endif /* __m32c__ */ + +#ifdef __MSP430__ +#define _JBLEN 9 + +#ifdef __MSP430X_LARGE__ +#define _JBTYPE unsigned long +#else +#define _JBTYPE unsigned short +#endif +#endif + +#ifdef __RL78__ +/* Three banks of registers, SP, CS, ES, PC */ +#define _JBLEN (8*3+8) +#define _JBTYPE unsigned char +#endif + +/* + * There are two versions of setjmp()/longjmp(): + * 1) Compiler (gcc) built-in versions. + * 2) Function-call versions. + * + * The built-in versions are used most of the time. When used, gcc replaces + * calls to setjmp()/longjmp() with inline assembly code. The built-in + * versions save/restore a variable number of registers. + + * _JBLEN is set to 40 to be ultra-safe with the built-in versions. + * It only needs to be 12 for the function-call versions + * but this data structure is used by both versions. + */ +#ifdef __NIOS2__ +#define _JBLEN 40 +#define _JBTYPE unsigned long +#endif + +#ifdef __PRU__ +#define _JBLEN 48 +#define _JBTYPE unsigned int +#endif + +#ifdef __RX__ +#define _JBLEN 0x44 +#endif + +#ifdef __VISIUM__ +/* All call-saved GP registers: r11-r19,r21,r22,r23. */ +#define _JBLEN 12 +#endif + +#ifdef __riscv +/* _JBTYPE using long long to make sure the alignment is align to 8 byte, + otherwise in rv32imafd, store/restore FPR may mis-align. */ +#define _JBTYPE long long +#ifdef __riscv_32e +#define _JBLEN ((4*sizeof(long))/sizeof(long)) +#else +#define _JBLEN ((14*sizeof(long) + 12*sizeof(double))/sizeof(long)) +#endif +#endif + +#ifdef __CSKYABIV2__ +#define _JBTYPE unsigned long +#if defined(__CK801__) +#define _JBLEN 7 +#elif defined(__CK802__) +#define _JBLEN 10 +#else +#define _JBLEN 18 +#endif +#endif + +#ifdef _JBLEN +#ifdef _JBTYPE +typedef _JBTYPE jmp_buf[_JBLEN]; +#else +typedef int jmp_buf[_JBLEN]; +#endif +#endif + +_END_STD_C + +#if (defined(__CYGWIN__) || defined(__rtems__)) && __POSIX_VISIBLE +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* POSIX sigsetjmp/siglongjmp macros */ +#ifdef _JBTYPE +typedef _JBTYPE sigjmp_buf[_JBLEN+1+((sizeof (_JBTYPE) + sizeof (sigset_t) - 1) + /sizeof (_JBTYPE))]; +#else +typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))]; +#endif + +#define _SAVEMASK _JBLEN +#define _SIGMASK (_JBLEN+1) + +#ifdef __CYGWIN__ +# define _CYGWIN_WORKING_SIGSETJMP +#endif + +#ifdef _POSIX_THREADS +#define __SIGMASK_FUNC pthread_sigmask +#else +#define __SIGMASK_FUNC sigprocmask +#endif + +#ifdef __CYGWIN__ +/* Per POSIX, siglongjmp has to be implemented as function. Cygwin + provides functions for both, siglongjmp and sigsetjmp since 2.2.0. */ +extern void siglongjmp (sigjmp_buf, int) __attribute__ ((__noreturn__)); +extern int sigsetjmp (sigjmp_buf, int); +#endif + +#if defined(__GNUC__) + +#define sigsetjmp(env, savemask) \ + __extension__ \ + ({ \ + sigjmp_buf *_sjbuf = &(env); \ + ((*_sjbuf)[_SAVEMASK] = savemask,\ + __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\ + setjmp (*_sjbuf)); \ + }) + +#define siglongjmp(env, val) \ + __extension__ \ + ({ \ + sigjmp_buf *_sjbuf = &(env); \ + ((((*_sjbuf)[_SAVEMASK]) ? \ + __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\ + : 0), \ + longjmp (*_sjbuf, val)); \ + }) + +#else /* !__GNUC__ */ + +#define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\ + __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\ + setjmp (env)) + +#define siglongjmp(env, val) ((((env)[_SAVEMASK])?\ + __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\ + longjmp (env, val)) + +#endif + +/* POSIX _setjmp/_longjmp, maintained for XSI compatibility. These + are equivalent to sigsetjmp/siglongjmp when not saving the signal mask. + New applications should use sigsetjmp/siglongjmp instead. */ +#ifdef __CYGWIN__ +extern void _longjmp (jmp_buf, int) __attribute__ ((__noreturn__)); +extern int _setjmp (jmp_buf); +#else +#define _setjmp(env) sigsetjmp ((env), 0) +#define _longjmp(env, val) siglongjmp ((env), (val)) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* (__CYGWIN__ or __rtems__) and __POSIX_VISIBLE */ diff --git a/include/machine/stdlib.h b/include/machine/stdlib.h new file mode 100644 index 0000000..fa3f3a1 --- /dev/null +++ b/include/machine/stdlib.h @@ -0,0 +1,8 @@ +#ifndef _MACHSTDLIB_H_ +#define _MACHSTDLIB_H_ + +/* place holder so platforms may add stdlib.h extensions */ + +#endif /* _MACHSTDLIB_H_ */ + + diff --git a/include/machine/termios.h b/include/machine/termios.h new file mode 100644 index 0000000..41fd459 --- /dev/null +++ b/include/machine/termios.h @@ -0,0 +1 @@ +#define __MAX_BAUD B4000000 diff --git a/include/machine/time.h b/include/machine/time.h new file mode 100644 index 0000000..c75edaf --- /dev/null +++ b/include/machine/time.h @@ -0,0 +1,15 @@ +#ifndef _MACHTIME_H_ +#define _MACHTIME_H_ + +#if defined(__rtems__) || defined(__VISIUM__) || defined(__riscv) +#define _CLOCKS_PER_SEC_ 1000000 +#elif defined(__aarch64__) || defined(__arm__) || defined(__thumb__) +#define _CLOCKS_PER_SEC_ 100 +#endif + +#ifdef __SPU__ +#include +int nanosleep (const struct timespec *, struct timespec *); +#endif + +#endif /* _MACHTIME_H_ */ diff --git a/include/machine/types.h b/include/machine/types.h new file mode 100644 index 0000000..19d0e85 --- /dev/null +++ b/include/machine/types.h @@ -0,0 +1,13 @@ +/* + * Newlib targets may provide an own version of this file in their machine + * directory to add custom user types for . + */ +#ifndef _SYS_TYPES_H +#error "must be included via " +#endif /* !_SYS_TYPES_H */ + +#if defined(__XMK__) && defined(___int64_t_defined) +typedef __uint64_t u_quad_t; +typedef __int64_t quad_t; +typedef quad_t * qaddr_t; +#endif diff --git a/include/malloc.h b/include/malloc.h new file mode 100644 index 0000000..a9dc5bc --- /dev/null +++ b/include/malloc.h @@ -0,0 +1,173 @@ +/* malloc.h -- header file for memory routines. */ + +#ifndef _INCLUDE_MALLOC_H_ +#define _INCLUDE_MALLOC_H_ + +#include <_ansi.h> +#include + +#define __need_size_t +#include + +/* include any machine-specific extensions */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This version of struct mallinfo must match the one in + libc/stdlib/mallocr.c. */ + +struct mallinfo { + size_t arena; /* total space allocated from system */ + size_t ordblks; /* number of non-inuse chunks */ + size_t smblks; /* unused -- always zero */ + size_t hblks; /* number of mmapped regions */ + size_t hblkhd; /* total space in mmapped regions */ + size_t usmblks; /* unused -- always zero */ + size_t fsmblks; /* unused -- always zero */ + size_t uordblks; /* total allocated space */ + size_t fordblks; /* total non-inuse space */ + size_t keepcost; /* top-most, releasable (via malloc_trim) space */ +}; + +/* The routines. */ + +extern void *malloc (size_t); +#ifdef __CYGWIN__ +#undef _malloc_r +#define _malloc_r(r, s) malloc (s) +#else +extern void *_malloc_r (struct _reent *, size_t); +#endif + +extern void free (void *); +#ifdef __CYGWIN__ +#undef _free_r +#define _free_r(r, p) free (p) +#else +extern void _free_r (struct _reent *, void *); +#endif + +extern void *realloc (void *, size_t); +#ifdef __CYGWIN__ +#undef _realloc_r +#define _realloc_r(r, p, s) realloc (p, s) +#else +extern void *_realloc_r (struct _reent *, void *, size_t); +#endif + +extern void *calloc (size_t, size_t); +#ifdef __CYGWIN__ +#undef _calloc_r +#define _calloc_r(r, s1, s2) calloc (s1, s2); +#else +extern void *_calloc_r (struct _reent *, size_t, size_t); +#endif + +extern void *memalign (size_t, size_t); +#ifdef __CYGWIN__ +#undef _memalign_r +#define _memalign_r(r, s1, s2) memalign (s1, s2); +#else +extern void *_memalign_r (struct _reent *, size_t, size_t); +#endif + +extern struct mallinfo mallinfo (void); +#ifdef __CYGWIN__ +#undef _mallinfo_r +#define _mallinfo_r(r) mallinfo () +#else +extern struct mallinfo _mallinfo_r (struct _reent *); +#endif + +extern void malloc_stats (void); +#ifdef __CYGWIN__ +#undef _malloc_stats_r +#define _malloc_stats_r(r) malloc_stats () +#else +extern void _malloc_stats_r (struct _reent *); +#endif + +extern int mallopt (int, int); +#ifdef __CYGWIN__ +#undef _mallopt_r +#define _mallopt_r(i1, i2) mallopt (i1, i2) +#else +extern int _mallopt_r (struct _reent *, int, int); +#endif + +extern size_t malloc_usable_size (void *); +#ifdef __CYGWIN__ +#undef _malloc_usable_size_r +#define _malloc_usable_size_r(r, p) malloc_usable_size (p) +#else +extern size_t _malloc_usable_size_r (struct _reent *, void *); +#endif + +/* These aren't too useful on an embedded system, but we define them + anyhow. */ + +extern void *valloc (size_t); +#ifdef __CYGWIN__ +#undef _valloc_r +#define _valloc_r(r, s) valloc (s) +#else +extern void *_valloc_r (struct _reent *, size_t); +#endif + +extern void *pvalloc (size_t); +#ifdef __CYGWIN__ +#undef _pvalloc_r +#define _pvalloc_r(r, s) pvalloc (s) +#else +extern void *_pvalloc_r (struct _reent *, size_t); +#endif + +extern int malloc_trim (size_t); +#ifdef __CYGWIN__ +#undef _malloc_trim_r +#define _malloc_trim_r(r, s) malloc_trim (s) +#else +extern int _malloc_trim_r (struct _reent *, size_t); +#endif + +extern void __malloc_lock(struct _reent *); + +extern void __malloc_unlock(struct _reent *); + +/* A compatibility routine for an earlier version of the allocator. */ + +extern void mstats (char *); +#ifdef __CYGWIN__ +#undef _mstats_r +#define _mstats_r(r, p) mstats (p) +#else +extern void _mstats_r (struct _reent *, char *); +#endif + +/* SVID2/XPG mallopt options */ + +#define M_MXFAST 1 /* UNUSED in this malloc */ +#define M_NLBLKS 2 /* UNUSED in this malloc */ +#define M_GRAIN 3 /* UNUSED in this malloc */ +#define M_KEEP 4 /* UNUSED in this malloc */ + +/* mallopt options that actually do something */ + +#define M_TRIM_THRESHOLD -1 +#define M_TOP_PAD -2 +#define M_MMAP_THRESHOLD -3 +#define M_MMAP_MAX -4 + +#ifndef __CYGWIN__ +/* Some systems provide this, so do too for compatibility. */ +extern void cfree (void *); +#endif /* __CYGWIN__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _INCLUDE_MALLOC_H_ */ diff --git a/include/math.h b/include/math.h new file mode 100644 index 0000000..87f5133 --- /dev/null +++ b/include/math.h @@ -0,0 +1,644 @@ +#ifndef _MATH_H_ + +#define _MATH_H_ + +#include +#include +#include +#include "_ansi.h" + +_BEGIN_STD_C + +/* Natural log of 2 */ +#define _M_LN2 0.693147180559945309417 + +#if __GNUC_PREREQ (3, 3) + /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values. */ + +# ifndef HUGE_VAL +# define HUGE_VAL (__builtin_huge_val()) +# endif + +# ifndef HUGE_VALF +# define HUGE_VALF (__builtin_huge_valf()) +# endif + +# ifndef HUGE_VALL +# define HUGE_VALL (__builtin_huge_vall()) +# endif + +# ifndef INFINITY +# define INFINITY (__builtin_inff()) +# endif + +# ifndef NAN +# define NAN (__builtin_nanf("")) +# endif + +#else /* !gcc >= 3.3 */ + + /* No builtins. Use fixed defines instead. (All 3 HUGE plus the INFINITY + * and NAN macros are required to be constant expressions. Using a variable-- + * even a static const--does not meet this requirement, as it cannot be + * evaluated at translation time.) + * The infinities are done using numbers that are far in excess of + * something that would be expected to be encountered in a floating-point + * implementation. (A more certain way uses values from float.h, but that is + * avoided because system includes are not supposed to include each other.) + * This method might produce warnings from some compilers. (It does in + * newer GCCs, but not for ones that would hit this #else.) If this happens, + * please report details to the Newlib mailing list. */ + + #ifndef HUGE_VAL + #define HUGE_VAL (1.0e999999999) + #endif + + #ifndef HUGE_VALF + #define HUGE_VALF (1.0e999999999F) + #endif + + #if !defined(HUGE_VALL) && defined(_HAVE_LONG_DOUBLE) + #define HUGE_VALL (1.0e999999999L) + #endif + + #if !defined(INFINITY) + #define INFINITY (HUGE_VALF) + #endif + + #if !defined(NAN) + #if defined(__GNUC__) && defined(__cplusplus) + /* Exception: older g++ versions warn about the divide by 0 used in the + * normal case (even though older gccs do not). This trick suppresses the + * warning, but causes errors for plain gcc, so is only used in the one + * special case. */ + static const union { __ULong __i[1]; float __d; } __Nanf = {0x7FC00000}; + #define NAN (__Nanf.__d) + #else + #define NAN (0.0F/0.0F) + #endif + #endif + +#endif /* !gcc >= 3.3 */ + +/* Reentrant ANSI C functions. */ + +#ifndef __math_68881 +extern double atan (double); +extern double cos (double); +extern double sin (double); +extern double tan (double); +extern double tanh (double); +extern double frexp (double, int *); +extern double modf (double, double *); +extern double ceil (double); +extern double fabs (double); +extern double floor (double); +#endif /* ! defined (__math_68881) */ + +/* Non reentrant ANSI C functions. */ + +#ifndef _REENT_ONLY +#ifndef __math_68881 +extern double acos (double); +extern double asin (double); +extern double atan2 (double, double); +extern double cosh (double); +extern double sinh (double); +extern double exp (double); +extern double ldexp (double, int); +extern double log (double); +extern double log10 (double); +extern double pow (double, double); +extern double sqrt (double); +extern double fmod (double, double); +#endif /* ! defined (__math_68881) */ +#endif /* ! defined (_REENT_ONLY) */ + +#if __MISC_VISIBLE +extern int finite (double); +extern int finitef (float); +extern int finitel (long double); +extern int isinff (float); +extern int isnanf (float); +#ifdef __CYGWIN__ /* not implemented in newlib yet */ +extern int isinfl (long double); +extern int isnanl (long double); +#endif +#if !defined(__cplusplus) || __cplusplus < 201103L +extern int isinf (double); +#endif +#endif /* __MISC_VISIBLE */ +#if (__MISC_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 600)) \ + && (!defined(__cplusplus) || __cplusplus < 201103L) +extern int isnan (double); +#endif + +#if __ISO_C_VISIBLE >= 1999 +/* ISO C99 types and macros. */ + +/* FIXME: FLT_EVAL_METHOD should somehow be gotten from float.h (which is hard, + * considering that the standard says the includes it defines should not + * include other includes that it defines) and that value used. (This can be + * solved, but autoconf has a bug which makes the solution more difficult, so + * it has been skipped for now.) */ +#if !defined(FLT_EVAL_METHOD) && defined(__FLT_EVAL_METHOD__) + #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ + #define __TMP_FLT_EVAL_METHOD +#endif /* FLT_EVAL_METHOD */ +#if defined FLT_EVAL_METHOD +/* FLT_EVAL_METHOD == 16 has meaning as defined in ISO/IEC TS 18661-3, + * which provides non-compliant extensions to C and POSIX (by adding + * additional positive values for FLT_EVAL_METHOD). It effectively has + * same meaning as the C99 and C11 definitions for value 0, while also + * serving as a flag that the _Float16 (float16_t) type exists. + * + * FLT_EVAL_METHOD could be any number of bits of supported floating point + * format (e.g. 32, 64, 128), but currently only AArch64 and few other targets + * might define that as 16. */ + #if (FLT_EVAL_METHOD == 0) \ + || (FLT_EVAL_METHOD == 16) + typedef float float_t; + typedef double double_t; + #elif FLT_EVAL_METHOD == 1 + typedef double float_t; + typedef double double_t; + #elif FLT_EVAL_METHOD == 2 + typedef long double float_t; + typedef long double double_t; + #else + /* Implementation-defined. Assume float_t and double_t have been + * defined previously for this configuration (e.g. config.h). */ + + /* If __DOUBLE_TYPE is defined (__FLOAT_TYPE is then supposed to be + defined as well) float_t and double_t definition is suggested by + an arch specific header. */ + #ifdef __DOUBLE_TYPE + typedef __DOUBLE_TYPE double_t; + typedef __FLOAT_TYPE float_t; + #endif + /* Assume config.h has provided these types. */ + #endif +#else + /* Assume basic definitions. */ + typedef float float_t; + typedef double double_t; +#endif +#if defined(__TMP_FLT_EVAL_METHOD) + #undef FLT_EVAL_METHOD +#endif + +#define FP_NAN 0 +#define FP_INFINITE 1 +#define FP_ZERO 2 +#define FP_SUBNORMAL 3 +#define FP_NORMAL 4 + +#ifndef FP_ILOGB0 +# define FP_ILOGB0 (-__INT_MAX__) +#endif +#ifndef FP_ILOGBNAN +# define FP_ILOGBNAN __INT_MAX__ +#endif + +#ifndef MATH_ERRNO +# define MATH_ERRNO 1 +#endif +#ifndef MATH_ERREXCEPT +# define MATH_ERREXCEPT 2 +#endif +#ifndef math_errhandling +# ifdef _IEEE_LIBM +# define _MATH_ERRHANDLING_ERRNO 0 +# else +# define _MATH_ERRHANDLING_ERRNO MATH_ERRNO +# endif +# ifdef _SUPPORTS_ERREXCEPT +# define _MATH_ERRHANDLING_ERREXCEPT MATH_ERREXCEPT +# else +# define _MATH_ERRHANDLING_ERREXCEPT 0 +# endif +# define math_errhandling (_MATH_ERRHANDLING_ERRNO | _MATH_ERRHANDLING_ERREXCEPT) +#endif + +extern int __isinff (float); +extern int __isinfd (double); +extern int __isnanf (float); +extern int __isnand (double); +extern int __fpclassifyf (float); +extern int __fpclassifyd (double); +extern int __signbitf (float); +extern int __signbitd (double); + +/* Note: isinf and isnan were once functions in newlib that took double + * arguments. C99 specifies that these names are reserved for macros + * supporting multiple floating point types. Thus, they are + * now defined as macros. Implementations of the old functions + * taking double arguments still exist for compatibility purposes + * (prototypes for them are earlier in this header). */ + +#if __GNUC_PREREQ (4, 4) + #define fpclassify(__x) (__builtin_fpclassify (FP_NAN, FP_INFINITE, \ + FP_NORMAL, FP_SUBNORMAL, \ + FP_ZERO, __x)) + #ifndef isfinite + #define isfinite(__x) (__builtin_isfinite (__x)) + #endif + #ifndef isinf + #define isinf(__x) (__builtin_isinf_sign (__x)) + #endif + #ifndef isnan + #define isnan(__x) (__builtin_isnan (__x)) + #endif + #define isnormal(__x) (__builtin_isnormal (__x)) +#else + #define fpclassify(__x) \ + ((sizeof(__x) == sizeof(float)) ? __fpclassifyf(__x) : \ + __fpclassifyd(__x)) + #ifndef isfinite + #define isfinite(__y) \ + (__extension__ ({int __cy = fpclassify(__y); \ + __cy != FP_INFINITE && __cy != FP_NAN;})) + #endif + #ifndef isinf + #define isinf(__x) (fpclassify(__x) == FP_INFINITE) + #endif + #ifndef isnan + #define isnan(__x) (fpclassify(__x) == FP_NAN) + #endif + #define isnormal(__x) (fpclassify(__x) == FP_NORMAL) +#endif + +#if __GNUC_PREREQ (4, 0) + #if defined(_HAVE_LONG_DOUBLE) + #define signbit(__x) \ + ((sizeof(__x) == sizeof(float)) ? __builtin_signbitf(__x) : \ + (sizeof(__x) == sizeof(double)) ? __builtin_signbit (__x) : \ + __builtin_signbitl(__x)) + #else + #define signbit(__x) \ + ((sizeof(__x) == sizeof(float)) ? __builtin_signbitf(__x) : \ + __builtin_signbit (__x)) + #endif +#else + #define signbit(__x) \ + ((sizeof(__x) == sizeof(float)) ? __signbitf(__x) : \ + __signbitd(__x)) +#endif + +#if __GNUC_PREREQ (2, 97) +#define isgreater(__x,__y) (__builtin_isgreater (__x, __y)) +#define isgreaterequal(__x,__y) (__builtin_isgreaterequal (__x, __y)) +#define isless(__x,__y) (__builtin_isless (__x, __y)) +#define islessequal(__x,__y) (__builtin_islessequal (__x, __y)) +#define islessgreater(__x,__y) (__builtin_islessgreater (__x, __y)) +#define isunordered(__x,__y) (__builtin_isunordered (__x, __y)) +#else +#define isgreater(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x > __y);})) +#define isgreaterequal(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x >= __y);})) +#define isless(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x < __y);})) +#define islessequal(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x <= __y);})) +#define islessgreater(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x < __y || __x > __y);})) + +#define isunordered(a,b) \ + (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \ + fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;})) +#endif + +/* Non ANSI double precision functions. */ + +extern double infinity (void); +extern double nan (const char *); +extern double copysign (double, double); +extern double logb (double); +extern int ilogb (double); + +extern double asinh (double); +extern double cbrt (double); +extern double nextafter (double, double); +extern double rint (double); +extern double scalbn (double, int); + +extern double exp2 (double); +extern double scalbln (double, long int); +extern double tgamma (double); +extern double nearbyint (double); +extern long int lrint (double); +extern long long int llrint (double); +extern double round (double); +extern long int lround (double); +extern long long int llround (double); +extern double trunc (double); +extern double remquo (double, double, int *); +extern double fdim (double, double); +extern double fmax (double, double); +extern double fmin (double, double); +extern double fma (double, double, double); + +#ifndef __math_68881 +extern double log1p (double); +extern double expm1 (double); +#endif /* ! defined (__math_68881) */ + +#ifndef _REENT_ONLY +extern double acosh (double); +extern double atanh (double); +extern double remainder (double, double); +extern double gamma (double); +extern double lgamma (double); +extern double erf (double); +extern double erfc (double); +extern double log2 (double); +#if !defined(__cplusplus) +#define log2(x) (log (x) / _M_LN2) +#endif + +#ifndef __math_68881 +extern double hypot (double, double); +#endif + +#endif /* ! defined (_REENT_ONLY) */ + +/* Single precision versions of ANSI functions. */ + +extern float atanf (float); +extern float cosf (float); +extern float sinf (float); +extern float tanf (float); +extern float tanhf (float); +extern float frexpf (float, int *); +extern float modff (float, float *); +extern float ceilf (float); +extern float fabsf (float); +extern float floorf (float); + +#ifndef _REENT_ONLY +extern float acosf (float); +extern float asinf (float); +extern float atan2f (float, float); +extern float coshf (float); +extern float sinhf (float); +extern float expf (float); +extern float ldexpf (float, int); +extern float logf (float); +extern float log10f (float); +extern float powf (float, float); +extern float sqrtf (float); +extern float fmodf (float, float); +#endif /* ! defined (_REENT_ONLY) */ + +/* Other single precision functions. */ + +extern float exp2f (float); +extern float scalblnf (float, long int); +extern float tgammaf (float); +extern float nearbyintf (float); +extern long int lrintf (float); +extern long long int llrintf (float); +extern float roundf (float); +extern long int lroundf (float); +extern long long int llroundf (float); +extern float truncf (float); +extern float remquof (float, float, int *); +extern float fdimf (float, float); +extern float fmaxf (float, float); +extern float fminf (float, float); +extern float fmaf (float, float, float); + +extern float infinityf (void); +extern float nanf (const char *); +extern float copysignf (float, float); +extern float logbf (float); +extern int ilogbf (float); + +extern float asinhf (float); +extern float cbrtf (float); +extern float nextafterf (float, float); +extern float rintf (float); +extern float scalbnf (float, int); +extern float log1pf (float); +extern float expm1f (float); + +#ifndef _REENT_ONLY +extern float acoshf (float); +extern float atanhf (float); +extern float remainderf (float, float); +extern float gammaf (float); +extern float lgammaf (float); +extern float erff (float); +extern float erfcf (float); +extern float log2f (float); +extern float hypotf (float, float); +#endif /* ! defined (_REENT_ONLY) */ + +/* Newlib doesn't fully support long double math functions so far. + On platforms where long double equals double the long double functions + simply call the double functions. On Cygwin the long double functions + are implemented independently from newlib to be able to use optimized + assembler functions despite using the Microsoft x86_64 ABI. */ +#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) || \ + defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) +/* Reentrant ANSI C functions. */ +#ifndef __math_68881 +extern long double atanl (long double); +extern long double cosl (long double); +extern long double sinl (long double); +extern long double tanl (long double); +extern long double tanhl (long double); +extern long double frexpl (long double, int *); +extern long double modfl (long double, long double *); +extern long double ceill (long double); +extern long double fabsl (long double); +extern long double floorl (long double); +extern long double log1pl (long double); +extern long double expm1l (long double); +#endif /* ! defined (__math_68881) */ +/* Non reentrant ANSI C functions. */ +#ifndef _REENT_ONLY +#ifndef __math_68881 +extern long double acosl (long double); +extern long double asinl (long double); +extern long double atan2l (long double, long double); +extern long double coshl (long double); +extern long double sinhl (long double); +extern long double expl (long double); +extern long double ldexpl (long double, int); +extern long double logl (long double); +extern long double log10l (long double); +extern long double powl (long double, long double); +extern long double sqrtl (long double); +extern long double fmodl (long double, long double); +extern long double hypotl (long double, long double); +#endif /* ! defined (__math_68881) */ +#endif /* ! defined (_REENT_ONLY) */ +extern long double copysignl (long double, long double); +extern long double nanl (const char *); +extern int ilogbl (long double); +extern long double asinhl (long double); +extern long double cbrtl (long double); +extern long double nextafterl (long double, long double); +extern float nexttowardf (float, long double); +extern double nexttoward (double, long double); +extern long double nexttowardl (long double, long double); +extern long double logbl (long double); +extern long double log2l (long double); +extern long double rintl (long double); +extern long double scalbnl (long double, int); +extern long double exp2l (long double); +extern long double scalblnl (long double, long); +extern long double tgammal (long double); +extern long double nearbyintl (long double); +extern long int lrintl (long double); +extern long long int llrintl (long double); +extern long double roundl (long double); +extern long lroundl (long double); +extern long long int llroundl (long double); +extern long double truncl (long double); +extern long double remquol (long double, long double, int *); +extern long double fdiml (long double, long double); +extern long double fmaxl (long double, long double); +extern long double fminl (long double, long double); +extern long double fmal (long double, long double, long double); +#ifndef _REENT_ONLY +extern long double acoshl (long double); +extern long double atanhl (long double); +extern long double remainderl (long double, long double); +extern long double lgammal (long double); +extern long double erfl (long double); +extern long double erfcl (long double); +#endif /* ! defined (_REENT_ONLY) */ +#else /* !_LDBL_EQ_DBL && !__CYGWIN__ */ +extern long double hypotl (long double, long double); +extern long double sqrtl (long double); +extern long double frexpl (long double, int *); +#ifdef __i386__ +/* Other long double precision functions. */ +extern _LONG_DOUBLE rintl (_LONG_DOUBLE); +extern long int lrintl (_LONG_DOUBLE); +extern long long int llrintl (_LONG_DOUBLE); +#endif /* __i386__ */ +#endif /* !_LDBL_EQ_DBL && !__CYGWIN__ */ + +#endif /* __ISO_C_VISIBLE >= 1999 */ + +#if __MISC_VISIBLE +extern double drem (double, double); +extern float dremf (float, float); +#ifdef __CYGWIN__ +extern float dreml (long double, long double); +#endif /* __CYGWIN__ */ +extern double gamma_r (double, int *); +extern double lgamma_r (double, int *); +extern float gammaf_r (float, int *); +extern float lgammaf_r (float, int *); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE +extern double y0 (double); +extern double y1 (double); +extern double yn (int, double); +extern double j0 (double); +extern double j1 (double); +extern double jn (int, double); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE >= 600 +extern float y0f (float); +extern float y1f (float); +extern float ynf (int, float); +extern float j0f (float); +extern float j1f (float); +extern float jnf (int, float); +#endif + +/* GNU extensions */ +#if __GNU_VISIBLE +extern void sincos (double, double *, double *); +extern void sincosf (float, float *, float *); +#ifdef __CYGWIN__ +extern void sincosl (long double, long double *, long double *); +#endif /* __CYGWIN__ */ +# ifndef exp10 +extern double exp10 (double); +# endif +# ifndef pow10 +extern double pow10 (double); +# endif +# ifndef exp10f +extern float exp10f (float); +# endif +# ifndef pow10f +extern float pow10f (float); +# endif +#ifdef __CYGWIN__ +# ifndef exp10l +extern float exp10l (float); +# endif +# ifndef pow10l +extern float pow10l (float); +# endif +#endif /* __CYGWIN__ */ +#endif /* __GNU_VISIBLE */ + +#if __MISC_VISIBLE || __XSI_VISIBLE +/* The gamma functions use a global variable, signgam. */ +#ifndef _REENT_ONLY +#define signgam (*__signgam()) +extern int *__signgam (void); +#endif /* ! defined (_REENT_ONLY) */ + +#define __signgam_r(ptr) _REENT_SIGNGAM(ptr) +#endif /* __MISC_VISIBLE || __XSI_VISIBLE */ + +/* Useful constants. */ + +#if __BSD_VISIBLE || __XSI_VISIBLE + +#define MAXFLOAT 3.40282347e+38F + +#define M_E 2.7182818284590452354 +#define M_LOG2E 1.4426950408889634074 +#define M_LOG10E 0.43429448190325182765 +#define M_LN2 _M_LN2 +#define M_LN10 2.30258509299404568402 +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#define M_PI_4 0.78539816339744830962 +#define M_1_PI 0.31830988618379067154 +#define M_2_PI 0.63661977236758134308 +#define M_2_SQRTPI 1.12837916709551257390 +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT1_2 0.70710678118654752440 + +#endif + +#if __BSD_VISIBLE + +#define M_TWOPI (M_PI * 2.0) +#define M_3PI_4 2.3561944901923448370E0 +#define M_SQRTPI 1.77245385090551602792981 +#define M_LN2LO 1.9082149292705877000E-10 +#define M_LN2HI 6.9314718036912381649E-1 +#define M_SQRT3 1.73205080756887719000 +#define M_IVLN10 0.43429448190325182765 /* 1 / log(10) */ +#define M_LOG2_E _M_LN2 +#define M_INVLN2 1.4426950408889633870E0 /* 1 / log(2) */ + +#endif /* __BSD_VISIBLE */ + +_END_STD_C + +#ifdef __FAST_MATH__ +#include +#endif + +#endif /* _MATH_H_ */ diff --git a/include/md5.h b/include/md5.h new file mode 100644 index 0000000..909f7b4 --- /dev/null +++ b/include/md5.h @@ -0,0 +1,154 @@ +/* md5.h - Declaration of functions and data types used for MD5 sum + computing library functions. + Copyright (C) 1995-2015 Free Software Foundation, Inc. + NOTE: The canonical source of this file is maintained with the GNU C + Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _MD5_H +#define _MD5_H 1 + +#include + +#if defined HAVE_LIMITS_H || _LIBC +# include +#endif + +#include "ansidecl.h" + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#ifdef _LIBC +# include +typedef u_int32_t md5_uint32; +typedef uintptr_t md5_uintptr; +#elif defined (HAVE_SYS_TYPES_H) && defined (HAVE_STDINT_H) +#include +#include +typedef uint32_t md5_uint32; +typedef uintptr_t md5_uintptr; +#else +# define INT_MAX_32_BITS 2147483647 + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +# ifndef INT_MAX +# define INT_MAX INT_MAX_32_BITS +# endif + +# if INT_MAX == INT_MAX_32_BITS + typedef unsigned int md5_uint32; +# else +# if SHRT_MAX == INT_MAX_32_BITS + typedef unsigned short md5_uint32; +# else +# if LONG_MAX == INT_MAX_32_BITS + typedef unsigned long md5_uint32; +# else + /* The following line is intended to evoke an error. + Using #error is not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +# endif +/* We have to make a guess about the integer type equivalent in size + to pointers which should always be correct. */ +typedef unsigned long int md5_uintptr; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure to save state of computation between the single steps. */ +struct md5_ctx +{ + md5_uint32 A; + md5_uint32 B; + md5_uint32 C; + md5_uint32 D; + + md5_uint32 total[2]; + md5_uint32 buflen; + char buffer[128] ATTRIBUTE_ALIGNED_ALIGNOF(md5_uint32); +}; + +/* + * The following three functions are build up the low level used in + * the functions `md5_stream' and `md5_buffer'. + */ + +/* Initialize structure containing state of computation. + (RFC 1321, 3.3: Step 3) */ +extern void md5_init_ctx (struct md5_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is necessary that LEN is a multiple of 64!!! */ +extern void md5_process_block (const void *buffer, size_t len, + struct md5_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is NOT required that LEN is a multiple of 64. */ +extern void md5_process_bytes (const void *buffer, size_t len, + struct md5_ctx *ctx); + +/* Process the remaining bytes in the buffer and put result from CTX + in first 16 bytes following RESBUF. The result is always in little + endian byte order, so that a byte-wise output yields to the wanted + ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *md5_finish_ctx (struct md5_ctx *ctx, void *resbuf); + + +/* Put result from CTX in first 16 bytes following RESBUF. The result is + always in little endian byte order, so that a byte-wise output yields + to the wanted ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *md5_read_ctx (const struct md5_ctx *ctx, void *resbuf); + + +/* Compute MD5 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +extern int md5_stream (FILE *stream, void *resblock); + +/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +extern void *md5_buffer (const char *buffer, size_t len, void *resblock); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/memory.h b/include/memory.h new file mode 100644 index 0000000..f4a14fc --- /dev/null +++ b/include/memory.h @@ -0,0 +1,4 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +#include +#endif /* !_MEMORY_H */ diff --git a/include/ndbm.h b/include/ndbm.h new file mode 100644 index 0000000..1e5072c --- /dev/null +++ b/include/ndbm.h @@ -0,0 +1,91 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ndbm.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD$ : src/include/ndbm.h + * Nov 20 19:45:28 2017 UTC by pfg + * SVN Revision 326024 + */ + +#ifndef _NDBM_H_ +#define _NDBM_H_ + +#include /* For mode_t. */ +/* #include */ + +/* + * The above header-file is directly included in `newlib/libc/search/ndbm.c` + * as `db.h` is present in form of `db_local.h`, inside `newlib/libc/search` + * directory and not in `newlib/libc/include`. + * Necessary data-types are mentioned in form of forward-declarations + */ + +/* Map dbm interface onto db(3). */ +#define DBM_RDONLY O_RDONLY + +/* Flags to dbm_store(). */ +#define DBM_INSERT 0 +#define DBM_REPLACE 1 + +/* + * The db(3) support for ndbm always appends this suffix to the + * file name to avoid overwriting the user's original database. + */ +#define DBM_SUFFIX ".db" + +typedef struct { + void *dptr; + int dsize; /* XXX Should be size_t according to 1003.1-2008. */ +} datum; + +struct __db; /* Forward-declaration */ +typedef struct __db DB; /* Forward-declaration */ +typedef DB DBM; +#define dbm_pagfno(a) DBM_PAGFNO_NOT_AVAILABLE + +__BEGIN_DECLS +int dbm_clearerr(DBM *); +void dbm_close(DBM *); +int dbm_delete(DBM *, datum); +int dbm_error(DBM *); +datum dbm_fetch(DBM *, datum); +datum dbm_firstkey(DBM *); +datum dbm_nextkey(DBM *); +DBM *dbm_open(const char *, int, mode_t); +int dbm_store(DBM *, datum, datum, int); +#if __BSD_VISIBLE +int dbm_dirfno(DBM *); +#endif +__END_DECLS + +#endif /* !_NDBM_H_ */ diff --git a/include/newlib.h b/include/newlib.h new file mode 100644 index 0000000..d4fffb1 --- /dev/null +++ b/include/newlib.h @@ -0,0 +1,2 @@ +/* dummy file for external tools to use. Real file is created by + newlib configuration. */ diff --git a/include/nlm/ChangeLog b/include/nlm/ChangeLog new file mode 100644 index 0000000..9d5f54b --- /dev/null +++ b/include/nlm/ChangeLog @@ -0,0 +1,119 @@ +2010-04-15 Nick Clifton + + * alpha-ext.h: Update copyright notice to use GPLv3. + * common.h: Likewise. + * external.h: Likewise. + * i386-ext.h: Likewise. + * internal.h: Likewise. + * ppc-ext.h: Likewise. + * sparc32-ext.h: Likewise. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + alpha-ext.h, common.h, external.h, i386-ext.h, internal.h, + ppc-ext.h, sparc32-ext.h + +2003-08-07 Alan Modra + + * internal.h (Nlm_Internal_Custom_Header): Replace PTR with void *. + +2001-10-02 Alan Modra + + * common.h (NLM_CAT, NLM_CAT3): Don't define. + (NLM_CAT4): Update conditions under which this is defined. Document + why CONCAT4 can't be used. + +1994-05-06 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * external.h (nlmNAME(External_Custom_Header)): Add length, + dataOffset, and dataStamp field. + (nlmNAME(External_Cygnus_Ext_Header)): Remove. + * internal.h (Nlm_Internal_Custom_Header): Add hdrLength, + dataOffset, dataStamp and hdr fields. + +1994-04-22 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * external.h (struct nlmNAME(external_cygnus_ext_header)): Rename + from nlmNAME(external_cygnus_section_header). Change stamp field + to 8 bytes. Add bytes field. + * internal.h (nlm_internal_cygnus_ext_header): Rename from + nlm_internal_cygnus_section_header. Change stamp field to 8 + bytes. + +1994-04-21 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * internal.h (struct nlm_internal_cygnus_section_header): Define. + * external.h (struct nlmNAME(external_cygnus_section_header): + Define. + +1994-04-20 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * internal.h (struct nlm_internal_custom_header): Remove + debugRecOffset and debugRecLength fields. Add data field. + * external.h (struct nlmNAME(external_custom_header)): Remove + debugRecOffset and debugRecLength fields. + +1994-02-07 Jim Kingdon (kingdon@lioth.cygnus.com) + + * internal.h: Change HOST_64_BIT to BFD_HOST_64_BIT. + +1993-12-02 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * alpha-ext.h: New file describing formats of information in Alpha + NetWare files. + * common.h: Define some non-external Alpha information. + +1993-11-17 Sean Eric Fagan (sef@cygnus.com) + + * external.h: Don't define external_fixed_header here. + * i386-ext.h, sparc32-ext.h: New header files to define + external_fixed_header for particular CPU's. + +1993-10-27 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * internal.h (Nlm_Internal_Extended_Header): Added fields + sharedDebugRecordOffset and sharedDebugRecordCount. + * external.h (NlmNAME(External_Extended_Header)): Likewise. + + * common.h (NLM_SIGNATURE): Do not define (it's different for each + backend). + +1993-08-31 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * internal.h: Change length fields of type char to type unsigned + char. + +1993-07-31 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * common.h (NLM_HIBIT, NLM_HEADER_VERSION): Define. + +1993-07-22 Fred Fish (fnf@deneb.cygnus.com) + + * common.h (NLM_CAT*, NLM_ARCH_SIZE, NLM_TARGET_LONG_SIZE, + NLM_TARGET_ADDRESS_SIZE, NLM_NAME, NlmNAME, nlmNAME): New + macros. + * external.h (TARGET_LONG_SIZE, TARGET_ADDRESS_SIZE): Remove + macros, convert usages to NLM_ equivalents. + * external.h: Use nlmNAME and NlmNAME macros to derive both + 32 and 64 bit versions. + +1993-07-20 Fred Fish (fnf@deneb.cygnus.com) + + * (common.h, external.h, internal.h): New files for NLM/NetWare + support. + + +Copyright (C) 1993-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/nlm/alpha-ext.h b/include/nlm/alpha-ext.h new file mode 100644 index 0000000..7dc6568 --- /dev/null +++ b/include/nlm/alpha-ext.h @@ -0,0 +1,167 @@ +/* Alpha NLM (NetWare Loadable Module) support for BFD. + Copyright 1993, 2005, 2010 Free Software Foundation, Inc. + By Ian Lance Taylor, Cygnus Support + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* An Alpha NLM starts with an instance of this structure. */ + +struct nlm32_alpha_external_prefix_header +{ + /* Magic number. Must be NLM32_ALPHA_MAGIC. */ + unsigned char magic[4]; + /* Format descriptor. Current value is 2. */ + unsigned char format[4]; + /* Size of prefix header. */ + unsigned char size[4]; + /* Padding. */ + unsigned char pad1[4]; + /* More fields may be added later, supposedly. */ +}; + +/* The external format of an Alpha NLM reloc. This is the same as an + Alpha ECOFF reloc. */ + +struct nlm32_alpha_external_reloc +{ + unsigned char r_vaddr[8]; + unsigned char r_symndx[4]; + unsigned char r_bits[4]; +}; + +/* Constants to unpack the r_bits field of a reloc. */ + +#define RELOC_BITS0_TYPE_LITTLE 0xff +#define RELOC_BITS0_TYPE_SH_LITTLE 0 + +#define RELOC_BITS1_EXTERN_LITTLE 0x01 + +#define RELOC_BITS1_OFFSET_LITTLE 0x7e +#define RELOC_BITS1_OFFSET_SH_LITTLE 1 + +#define RELOC_BITS1_RESERVED_LITTLE 0x80 +#define RELOC_BITS1_RESERVED_SH_LITTLE 7 +#define RELOC_BITS2_RESERVED_LITTLE 0xff +#define RELOC_BITS2_RESERVED_SH_LEFT_LITTLE 1 +#define RELOC_BITS3_RESERVED_LITTLE 0x03 +#define RELOC_BITS3_RESERVED_SH_LEFT_LITTLE 9 + +#define RELOC_BITS3_SIZE_LITTLE 0xfc +#define RELOC_BITS3_SIZE_SH_LITTLE 2 + +/* The external format of the fixed header. */ + +typedef struct nlm32_alpha_external_fixed_header +{ + + /* The signature field identifies the file as an NLM. It must contain + the signature string, which depends upon the NLM target. */ + + unsigned char signature[24]; + + /* The version of the header. At this time, the highest version number + is 4. */ + + unsigned char version[4]; + + /* The name of the module, which must be a DOS name (1-8 characters followed + by a period and a 1-3 character extension). The first byte is the byte + length of the name and the last byte is a null terminator byte. This + field is fixed length, and any unused bytes should be null bytes. The + value is set by the OUTPUT keyword to NLMLINK. */ + + unsigned char moduleName[14]; + + /* Padding to make it come out correct. */ + + unsigned char pad1[2]; + + /* The byte offset of the code image from the start of the file. */ + + unsigned char codeImageOffset[4]; + + /* The size of the code image, in bytes. */ + + unsigned char codeImageSize[4]; + + /* The byte offset of the data image from the start of the file. */ + + unsigned char dataImageOffset[4]; + + /* The size of the data image, in bytes. */ + + unsigned char dataImageSize[4]; + + /* The size of the uninitialized data region that the loader is to be + allocated at load time. Uninitialized data follows the initialized + data in the NLM address space. */ + + unsigned char uninitializedDataSize[4]; + + /* The byte offset of the custom data from the start of the file. The + custom data is set by the CUSTOM keyword to NLMLINK. It is possible + for this to be EOF if there is no custom data. */ + + unsigned char customDataOffset[4]; + + /* The size of the custom data, in bytes. */ + + unsigned char customDataSize[4]; + + /* The byte offset of the module dependencies from the start of the file. + The module dependencies are determined by the MODULE keyword in + NLMLINK. */ + + unsigned char moduleDependencyOffset[4]; + + /* The number of module dependencies at the moduleDependencyOffset. */ + + unsigned char numberOfModuleDependencies[4]; + + /* The byte offset of the relocation fixup data from the start of the file */ + + unsigned char relocationFixupOffset[4]; + + unsigned char numberOfRelocationFixups[4]; + + unsigned char externalReferencesOffset[4]; + + unsigned char numberOfExternalReferences[4]; + + unsigned char publicsOffset[4]; + + unsigned char numberOfPublics[4]; + + /* The byte offset of the internal debug info from the start of the file. + It is possible for this to be EOF if there is no debug info. */ + + unsigned char debugInfoOffset[4]; + + unsigned char numberOfDebugRecords[4]; + + unsigned char codeStartOffset[4]; + + unsigned char exitProcedureOffset[4]; + + unsigned char checkUnloadProcedureOffset[4]; + + unsigned char moduleType[4]; + + unsigned char flags[4]; + +} Nlm32_alpha_External_Fixed_Header; diff --git a/include/nlm/common.h b/include/nlm/common.h new file mode 100644 index 0000000..fcd290e --- /dev/null +++ b/include/nlm/common.h @@ -0,0 +1,123 @@ +/* NLM (NetWare Loadable Module) support for BFD. + Copyright 1993, 2001, 2005, 2010 Free Software Foundation, Inc. + + Written by Fred Fish @ Cygnus Support + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is part of NLM support for BFD, and contains the portions + that are common to both the internal and external representations. */ + +/* If NLM_ARCH_SIZE is not defined, default to 32. NLM_ARCH_SIZE is + optionally defined by the application. */ + +#ifndef NLM_ARCH_SIZE +# define NLM_ARCH_SIZE 32 +#endif + +/* Due to horrible details of ANSI macro expansion, we can't use CONCAT4 + for NLM_NAME. CONCAT2 is used in BFD_JUMP_TABLE macros, and some of + them will expand to tokens that themselves are macros defined in terms + of NLM_NAME. If NLM_NAME were defined using CONCAT4 (which is itself + defined in bfd-in.h using CONCAT2), ANSI preprocessor rules say that + the CONCAT2 within NLM_NAME should not be expanded. + So use another name. */ +#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE) +#ifdef SABER +#define NLM_CAT4(a,b,c,d) a##b##c##d +#else +/* This hack is to avoid a problem with some strict ANSI C preprocessors. + The problem is, "32_" is not a valid preprocessing token, and we don't + want extra underscores (e.g., "nlm_32_"). The NLM_XCAT2 macro will + cause the inner CAT2 macros to be evaluated first, producing + still-valid pp-tokens. Then the final concatenation can be done. */ +#define NLM_CAT2(a,b) a##b +#define NLM_XCAT2(a,b) NLM_CAT2(a,b) +#define NLM_CAT4(a,b,c,d) NLM_XCAT2(NLM_CAT2(a,b),NLM_CAT2(c,d)) +#endif +#else +#define NLM_CAT4(a,b,c,d) a/**/b/**/c/**/d +#endif + +#if NLM_ARCH_SIZE == 32 +# define NLM_TARGET_LONG_SIZE 4 +# define NLM_TARGET_ADDRESS_SIZE 4 +# define NLM_NAME(x,y) NLM_CAT4(x,32,_,y) +# define NLM_HIBIT (((bfd_vma) 1) << 31) +#endif +#if NLM_ARCH_SIZE == 64 +# define NLM_TARGET_LONG_SIZE 8 +# define NLM_TARGET_ADDRESS_SIZE 8 +# define NLM_NAME(x,y) NLM_CAT4(x,64,_,y) +# define NLM_HIBIT (((bfd_vma) 1) << 63) +#endif + +#define NlmNAME(X) NLM_NAME(Nlm,X) +#define nlmNAME(X) NLM_NAME(nlm,X) + +/* Give names to things that should not change. */ + +#define NLM_MAX_DESCRIPTION_LENGTH 127 +#define NLM_MAX_SCREEN_NAME_LENGTH 71 +#define NLM_MAX_THREAD_NAME_LENGTH 71 +#define NLM_MAX_COPYRIGHT_MESSAGE_LENGTH 255 +#define NLM_OTHER_DATA_LENGTH 400 /* FIXME */ +#define NLM_OLD_THREAD_NAME_LENGTH 5 +#define NLM_SIGNATURE_SIZE 24 +#define NLM_HEADER_VERSION 4 +#define NLM_MODULE_NAME_SIZE 14 +#define NLM_DEFAULT_STACKSIZE (8 * 1024) + +/* Alpha information. This should probably be in a separate Alpha + header file, but it can't go in alpha-ext.h because some of it is + needed by nlmconv.c. */ + +/* Magic number in Alpha prefix header. */ +#define NLM32_ALPHA_MAGIC (0x83561840) + +/* The r_type field in an Alpha reloc is one of the following values. */ +#define ALPHA_R_IGNORE 0 +#define ALPHA_R_REFLONG 1 +#define ALPHA_R_REFQUAD 2 +#define ALPHA_R_GPREL32 3 +#define ALPHA_R_LITERAL 4 +#define ALPHA_R_LITUSE 5 +#define ALPHA_R_GPDISP 6 +#define ALPHA_R_BRADDR 7 +#define ALPHA_R_HINT 8 +#define ALPHA_R_SREL16 9 +#define ALPHA_R_SREL32 10 +#define ALPHA_R_SREL64 11 +#define ALPHA_R_OP_PUSH 12 +#define ALPHA_R_OP_STORE 13 +#define ALPHA_R_OP_PSUB 14 +#define ALPHA_R_OP_PRSHIFT 15 +#define ALPHA_R_GPVALUE 16 +#define ALPHA_R_NW_RELOC 250 + +/* A local reloc, other than ALPHA_R_GPDISP or ALPHA_R_IGNORE, must be + against one of these symbol indices. */ +#define ALPHA_RELOC_SECTION_TEXT 1 +#define ALPHA_RELOC_SECTION_DATA 3 + +/* An ALPHA_R_NW_RELOC has one of these values in the size field. If + it is SETGP, the r_vaddr field holds the GP value to use. If it is + LITA, the r_vaddr field holds the address of the .lita section and + the r_symndx field holds the size of the .lita section. */ +#define ALPHA_R_NW_RELOC_SETGP 1 +#define ALPHA_R_NW_RELOC_LITA 2 diff --git a/include/nlm/external.h b/include/nlm/external.h new file mode 100644 index 0000000..eebd1cc --- /dev/null +++ b/include/nlm/external.h @@ -0,0 +1,172 @@ +/* NLM (NetWare Loadable Module) support for BFD. + Copyright 1993, 1994, 2005, 2010 Free Software Foundation, Inc. + + Written by Fred Fish @ Cygnus Support + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is part of NLM support for BFD, and contains the portions + that describe how NLM is represented externally by the BFD library. + I.E. it describes the in-file representation of NLM. It requires + the nlm/common.h file which contains the portions that are common to + both the internal and external representations. + + Note that an NLM header consists of three parts: + + (1) A fixed length header that has specific fields of known length, + at specific offsets in the file. + + (2) A variable length header that has specific fields in a specific + order, but some fields may be variable length. + + (3) A auxiliary header that has various optional fields in no specific + order. There is no way to identify the end of the auxiliary headers + except by finding a header without a recognized 'stamp'. + + The exact format of the fixed length header unfortunately varies + from one NLM target to another, due to padding. Each target + defines the correct external format in a separate header file. */ + +/* NLM Header. */ + +/* The version header is one of the optional auxiliary headers and + follows the fixed length and variable length NLM headers. */ + +typedef struct nlmNAME(external_version_header) +{ + + /* The header is recognized by "VeRsIoN#" in the stamp field. */ + char stamp[8]; + + unsigned char majorVersion[NLM_TARGET_LONG_SIZE]; + + unsigned char minorVersion[NLM_TARGET_LONG_SIZE]; + + unsigned char revision[NLM_TARGET_LONG_SIZE]; + + unsigned char year[NLM_TARGET_LONG_SIZE]; + + unsigned char month[NLM_TARGET_LONG_SIZE]; + + unsigned char day[NLM_TARGET_LONG_SIZE]; + +} NlmNAME(External_Version_Header); + + +typedef struct nlmNAME(external_copyright_header) +{ + + /* The header is recognized by "CoPyRiGhT=" in the stamp field. */ + + char stamp[10]; + + unsigned char copyrightMessageLength[1]; + + /* There is a variable length field here called 'copyrightMessage' + that is the length specified by copyrightMessageLength. */ + +} NlmNAME(External_Copyright_Header); + + +typedef struct nlmNAME(external_extended_header) +{ + + /* The header is recognized by "MeSsAgEs" in the stamp field. */ + + char stamp[8]; + + unsigned char languageID[NLM_TARGET_LONG_SIZE]; + + unsigned char messageFileOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char messageFileLength[NLM_TARGET_LONG_SIZE]; + + unsigned char messageCount[NLM_TARGET_LONG_SIZE]; + + unsigned char helpFileOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char helpFileLength[NLM_TARGET_LONG_SIZE]; + + unsigned char RPCDataOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char RPCDataLength[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedCodeOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedCodeLength[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedDataOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedDataLength[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedRelocationFixupOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedRelocationFixupCount[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedExternalReferenceOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedExternalReferenceCount[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedPublicsOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedPublicsCount[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedDebugRecordOffset[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedDebugRecordCount[NLM_TARGET_LONG_SIZE]; + + unsigned char sharedInitializationOffset[NLM_TARGET_ADDRESS_SIZE]; + + unsigned char SharedExitProcedureOffset[NLM_TARGET_ADDRESS_SIZE]; + + unsigned char productID[NLM_TARGET_LONG_SIZE]; + + unsigned char reserved0[NLM_TARGET_LONG_SIZE]; + + unsigned char reserved1[NLM_TARGET_LONG_SIZE]; + + unsigned char reserved2[NLM_TARGET_LONG_SIZE]; + + unsigned char reserved3[NLM_TARGET_LONG_SIZE]; + + unsigned char reserved4[NLM_TARGET_LONG_SIZE]; + + unsigned char reserved5[NLM_TARGET_LONG_SIZE]; + +} NlmNAME(External_Extended_Header); + + +typedef struct nlmNAME(external_custom_header) +{ + + /* The header is recognized by "CuStHeAd" in the stamp field. */ + char stamp[8]; + + /* Length of this header. */ + unsigned char length[NLM_TARGET_LONG_SIZE]; + + /* Offset to data. */ + unsigned char dataOffset[NLM_TARGET_LONG_SIZE]; + + /* Length of data. */ + unsigned char dataLength[NLM_TARGET_LONG_SIZE]; + + /* Stamp for this customer header--we recognize "CyGnUsEx". */ + char dataStamp[8]; + +} NlmNAME(External_Custom_Header); diff --git a/include/nlm/i386-ext.h b/include/nlm/i386-ext.h new file mode 100644 index 0000000..4de8b34 --- /dev/null +++ b/include/nlm/i386-ext.h @@ -0,0 +1,117 @@ +/* i386 NLM (NetWare Loadable Module) support for BFD. + Copyright 1993, 2005, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* The external format of the fixed header. */ + +typedef struct nlm32_i386_external_fixed_header +{ + + /* The signature field identifies the file as an NLM. It must contain + the signature string, which depends upon the NLM target. */ + + unsigned char signature[24]; + + /* The version of the header. At this time, the highest version number + is 4. */ + + unsigned char version[4]; + + /* The name of the module, which must be a DOS name (1-8 characters followed + by a period and a 1-3 character extension). The first byte is the byte + length of the name and the last byte is a null terminator byte. This + field is fixed length, and any unused bytes should be null bytes. The + value is set by the OUTPUT keyword to NLMLINK. */ + + unsigned char moduleName[14]; + + /* The byte offset of the code image from the start of the file. */ + + unsigned char codeImageOffset[4]; + + /* The size of the code image, in bytes. */ + + unsigned char codeImageSize[4]; + + /* The byte offset of the data image from the start of the file. */ + + unsigned char dataImageOffset[4]; + + /* The size of the data image, in bytes. */ + + unsigned char dataImageSize[4]; + + /* The size of the uninitialized data region that the loader is to be + allocated at load time. Uninitialized data follows the initialized + data in the NLM address space. */ + + unsigned char uninitializedDataSize[4]; + + /* The byte offset of the custom data from the start of the file. The + custom data is set by the CUSTOM keyword to NLMLINK. It is possible + for this to be EOF if there is no custom data. */ + + unsigned char customDataOffset[4]; + + /* The size of the custom data, in bytes. */ + + unsigned char customDataSize[4]; + + /* The byte offset of the module dependencies from the start of the file. + The module dependencies are determined by the MODULE keyword in + NLMLINK. */ + + unsigned char moduleDependencyOffset[4]; + + /* The number of module dependencies at the moduleDependencyOffset. */ + + unsigned char numberOfModuleDependencies[4]; + + /* The byte offset of the relocation fixup data from the start of the file */ + + unsigned char relocationFixupOffset[4]; + + unsigned char numberOfRelocationFixups[4]; + + unsigned char externalReferencesOffset[4]; + + unsigned char numberOfExternalReferences[4]; + + unsigned char publicsOffset[4]; + + unsigned char numberOfPublics[4]; + + /* The byte offset of the internal debug info from the start of the file. + It is possible for this to be EOF if there is no debug info. */ + + unsigned char debugInfoOffset[4]; + + unsigned char numberOfDebugRecords[4]; + + unsigned char codeStartOffset[4]; + + unsigned char exitProcedureOffset[4]; + + unsigned char checkUnloadProcedureOffset[4]; + + unsigned char moduleType[4]; + + unsigned char flags[4]; + +} Nlm32_i386_External_Fixed_Header; diff --git a/include/nlm/internal.h b/include/nlm/internal.h new file mode 100644 index 0000000..51e1f00 --- /dev/null +++ b/include/nlm/internal.h @@ -0,0 +1,309 @@ +/* NLM (NetWare Loadable Module) support for BFD. + Copyright 1993, 1994, 2003, 2005, 2010 Free Software Foundation, Inc. + + Written by Fred Fish @ Cygnus Support. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file is part of NLM support for BFD, and contains the portions + that describe how NLM is represented internally in the BFD library. + I.E. it describes the in-memory representation of NLM. It requires + the nlm/common.h file which contains the portions that are common to + both the internal and external representations. */ + +#if 0 + +/* Types used by various structures, functions, etc. */ + +typedef unsigned long Nlm32_Addr; /* Unsigned program address */ +typedef unsigned long Nlm32_Off; /* Unsigned file offset */ +typedef long Nlm32_Sword; /* Signed large integer */ +typedef unsigned long Nlm32_Word; /* Unsigned large integer */ +typedef unsigned short Nlm32_Half; /* Unsigned medium integer */ +typedef unsigned char Nlm32_Char; /* Unsigned tiny integer */ + +#ifdef BFD_HOST_64_BIT +typedef unsigned BFD_HOST_64_BIT Nlm64_Addr; +typedef unsigned BFD_HOST_64_BIT Nlm64_Off; +typedef BFD_HOST_64_BIT Nlm64_Sxword; +typedef unsigned BFD_HOST_64_BIT Nlm64_Xword; +#endif +typedef long Nlm64_Sword; +typedef unsigned long Nlm64_Word; +typedef unsigned short Nlm64_Half; + +#endif /* 0 */ + +/* This structure contains the internal form of the portion of the NLM + header that is fixed length. */ + +typedef struct nlm_internal_fixed_header +{ + /* The signature field identifies the file as an NLM. It must contain + the signature string, which depends upon the NLM target. */ + + char signature[NLM_SIGNATURE_SIZE]; + + /* The version of the header. At this time, the highest version number + is 4. */ + + long version; + + /* The name of the module, which must be a DOS name (1-8 characters followed + by a period and a 1-3 character extension. The first byte is the byte + length of the name and the last byte is a null terminator byte. This + field is fixed length, and any unused bytes should be null bytes. The + value is set by the OUTPUT keyword to NLMLINK. */ + + char moduleName[NLM_MODULE_NAME_SIZE]; + + /* The byte offset of the code image from the start of the file. */ + + file_ptr codeImageOffset; + + /* The size of the code image, in bytes. */ + + bfd_size_type codeImageSize; + + /* The byte offset of the data image from the start of the file. */ + + file_ptr dataImageOffset; + + /* The size of the data image, in bytes. */ + + bfd_size_type dataImageSize; + + /* The size of the uninitialized data region that the loader is to be + allocated at load time. Uninitialized data follows the initialized + data in the NLM address space. */ + + bfd_size_type uninitializedDataSize; + + /* The byte offset of the custom data from the start of the file. The + custom data is set by the CUSTOM keyword to NLMLINK. */ + + file_ptr customDataOffset; + + /* The size of the custom data, in bytes. */ + + bfd_size_type customDataSize; + + /* The byte offset of the module dependencies from the start of the file. + The module dependencies are determined by the MODULE keyword in + NLMLINK. */ + + file_ptr moduleDependencyOffset; + + /* The number of module dependencies at the moduleDependencyOffset. */ + + long numberOfModuleDependencies; + + /* The byte offset of the relocation fixup data from the start of the file */ + + file_ptr relocationFixupOffset; + long numberOfRelocationFixups; + file_ptr externalReferencesOffset; + long numberOfExternalReferences; + file_ptr publicsOffset; + long numberOfPublics; + file_ptr debugInfoOffset; + long numberOfDebugRecords; + file_ptr codeStartOffset; + file_ptr exitProcedureOffset; + file_ptr checkUnloadProcedureOffset; + long moduleType; + long flags; +} Nlm_Internal_Fixed_Header; + +#define nlm32_internal_fixed_header nlm_internal_fixed_header +#define Nlm32_Internal_Fixed_Header Nlm_Internal_Fixed_Header +#define nlm64_internal_fixed_header nlm_internal_fixed_header +#define Nlm64_Internal_Fixed_Header Nlm_Internal_Fixed_Header + +/* This structure contains the portions of the NLM header that are either + variable in size in the external representation, or else are not at a + fixed offset relative to the start of the NLM header due to preceding + variable sized fields. + + Note that all the fields must exist in the external header, and in + the order used here (the same order is used in the internal form + for consistency, not out of necessity). */ + +typedef struct nlm_internal_variable_header +{ + + /* The descriptionLength field contains the length of the text in + descriptionText, excluding the null terminator. The descriptionText + field contains the NLM description obtained from the DESCRIPTION + keyword in NLMLINK plus the null byte terminator. The descriptionText + can be up to NLM_MAX_DESCRIPTION_LENGTH characters. */ + + unsigned char descriptionLength; + char descriptionText[NLM_MAX_DESCRIPTION_LENGTH + 1]; + + /* The stackSize field contains the size of the stack in bytes, as + specified by the STACK or STACKSIZE keyword in NLMLINK. If no size + is specified, the default is NLM_DEFAULT_STACKSIZE. */ + + long stackSize; + + /* The reserved field is included only for completeness. It should contain + zero. */ + + long reserved; + + /* This field is fixed length, should contain " LONG" (note leading + space), and is unused. */ + + char oldThreadName[NLM_OLD_THREAD_NAME_LENGTH]; + + /* The screenNameLength field contains the length of the actual text stored + in the screenName field, excluding the null byte terminator. The + screenName field contains the screen name as specified by the SCREENNAME + keyword in NLMLINK, and can be up to NLM_MAX_SCREEN_NAME_LENGTH + characters. */ + + unsigned char screenNameLength; + char screenName[NLM_MAX_SCREEN_NAME_LENGTH + 1]; + + /* The threadNameLength field contains the length of the actual text stored + in the threadName field, excluding the null byte terminator. The + threadName field contains the thread name as specified by the THREADNAME + keyword in NLMLINK, and can be up to NLM_MAX_THREAD_NAME_LENGTH + characters. */ + + unsigned char threadNameLength; + char threadName[NLM_MAX_THREAD_NAME_LENGTH + 1]; + +} Nlm_Internal_Variable_Header; + +#define nlm32_internal_variable_header nlm_internal_variable_header +#define Nlm32_Internal_Variable_Header Nlm_Internal_Variable_Header +#define nlm64_internal_variable_header nlm_internal_variable_header +#define Nlm64_Internal_Variable_Header Nlm_Internal_Variable_Header + +/* The version header is one of the optional auxiliary headers and + follows the fixed length and variable length NLM headers. */ + +typedef struct nlm_internal_version_header +{ + /* The header is recognized by "VeRsIoN#" in the stamp field. */ + char stamp[8]; + long majorVersion; + long minorVersion; + long revision; + long year; + long month; + long day; +} Nlm_Internal_Version_Header; + +#define nlm32_internal_version_header nlm_internal_version_header +#define Nlm32_Internal_Version_Header Nlm_Internal_Version_Header +#define nlm64_internal_version_header nlm_internal_version_header +#define Nlm64_Internal_Version_Header Nlm_Internal_Version_Header + +typedef struct nlm_internal_copyright_header +{ + /* The header is recognized by "CoPyRiGhT=" in the stamp field. */ + char stamp[10]; + unsigned char copyrightMessageLength; + char copyrightMessage[NLM_MAX_COPYRIGHT_MESSAGE_LENGTH]; +} Nlm_Internal_Copyright_Header; + +#define nlm32_internal_copyright_header nlm_internal_copyright_header +#define Nlm32_Internal_Copyright_Header Nlm_Internal_Copyright_Header +#define nlm64_internal_copyright_header nlm_internal_copyright_header +#define Nlm64_Internal_Copyright_Header Nlm_Internal_Copyright_Header + +typedef struct nlm_internal_extended_header +{ + /* The header is recognized by "MeSsAgEs" in the stamp field. */ + char stamp[8]; + long languageID; + file_ptr messageFileOffset; + bfd_size_type messageFileLength; + long messageCount; + file_ptr helpFileOffset; + bfd_size_type helpFileLength; + file_ptr RPCDataOffset; + bfd_size_type RPCDataLength; + file_ptr sharedCodeOffset; + bfd_size_type sharedCodeLength; + file_ptr sharedDataOffset; + bfd_size_type sharedDataLength; + file_ptr sharedRelocationFixupOffset; + long sharedRelocationFixupCount; + file_ptr sharedExternalReferenceOffset; + long sharedExternalReferenceCount; + file_ptr sharedPublicsOffset; + long sharedPublicsCount; + file_ptr sharedDebugRecordOffset; + long sharedDebugRecordCount; + bfd_vma SharedInitializationOffset; + bfd_vma SharedExitProcedureOffset; + long productID; + long reserved0; + long reserved1; + long reserved2; + long reserved3; + long reserved4; + long reserved5; +} Nlm_Internal_Extended_Header; + +#define nlm32_internal_extended_header nlm_internal_extended_header +#define Nlm32_Internal_Extended_Header Nlm_Internal_Extended_Header +#define nlm64_internal_extended_header nlm_internal_extended_header +#define Nlm64_Internal_Extended_Header Nlm_Internal_Extended_Header + +/* The format of a custom header as stored internally is different + from the external format. This is how we store a custom header + which we do not recognize. */ + +typedef struct nlm_internal_custom_header +{ + /* The header is recognized by "CuStHeAd" in the stamp field. */ + char stamp[8]; + bfd_size_type hdrLength; + file_ptr dataOffset; + bfd_size_type dataLength; + char dataStamp[8]; + void *hdr; +} Nlm_Internal_Custom_Header; + +#define nlm32_internal_custom_header nlm_internal_custom_header +#define Nlm32_Internal_Custom_Header Nlm_Internal_Custom_Header +#define nlm64_internal_custom_header nlm_internal_custom_header +#define Nlm64_Internal_Custom_Header Nlm_Internal_Custom_Header + +/* The internal Cygnus header is written out externally as a custom + header. We don't try to replicate that structure here. */ + +typedef struct nlm_internal_cygnus_ext_header +{ + /* The header is recognized by "CyGnUsEx" in the stamp field. */ + char stamp[8]; + /* File location of debugging information. */ + file_ptr offset; + /* Length of debugging information. */ + bfd_size_type length; +} Nlm_Internal_Cygnus_Ext_Header; + +#define nlm32_internal_cygnus_ext_header nlm_internal_cygnus_ext_header +#define Nlm32_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header +#define nlm64_internal_cygnus_ext_header nlm_internal_cygnus_ext_header +#define Nlm64_Internal_Cygnus_Ext_Header Nlm_Internal_Cygnus_Ext_Header diff --git a/include/nlm/ppc-ext.h b/include/nlm/ppc-ext.h new file mode 100644 index 0000000..026984b --- /dev/null +++ b/include/nlm/ppc-ext.h @@ -0,0 +1,164 @@ +/* PowerPC NLM (NetWare Loadable Module) support for BFD. + Copyright (C) 1994, 2005, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifdef OLDFORMAT + +/* The format of a PowerPC NLM changed. These structures are only + used in the old format. */ + +/* A PowerPC NLM starts with an instance of this structure. */ + +struct nlm32_powerpc_external_prefix_header +{ + /* Signature. Must be "AppleNLM". */ + char signature[8]; + /* Version number. Current value is 1. */ + unsigned char headerVersion[4]; + /* ??. Should be set to 0. */ + unsigned char origins[4]; + /* File creation date in standard Unix time format (seconds since + 1/1/70). */ + unsigned char date[4]; +}; + +#define NLM32_POWERPC_SIGNATURE "AppleNLM" +#define NLM32_POWERPC_HEADER_VERSION 1 + +/* The external format of a PowerPC NLM reloc. This is the same as an + XCOFF dynamic reloc. */ + +struct nlm32_powerpc_external_reloc +{ + /* Address. */ + unsigned char l_vaddr[4]; + /* Symbol table index. This is 0 for .text and 1 for .data. 2 + means .bss, but I don't know if it is used. In XCOFF, larger + numbers are indices into the dynamic symbol table, but they are + presumably not used in an NLM. */ + unsigned char l_symndx[4]; + /* Relocation type. */ + unsigned char l_rtype[2]; + /* Section number being relocated. */ + unsigned char l_rsecnm[2]; +}; + +#endif /* OLDFORMAT */ + +/* The external format of the fixed header. */ + +typedef struct nlm32_powerpc_external_fixed_header +{ + + /* The signature field identifies the file as an NLM. It must contain + the signature string, which depends upon the NLM target. */ + + unsigned char signature[24]; + + /* The version of the header. At this time, the highest version number + is 4. */ + + unsigned char version[4]; + + /* The name of the module, which must be a DOS name (1-8 characters followed + by a period and a 1-3 character extension). The first byte is the byte + length of the name and the last byte is a null terminator byte. This + field is fixed length, and any unused bytes should be null bytes. The + value is set by the OUTPUT keyword to NLMLINK. */ + + unsigned char moduleName[14]; + + /* Padding to make it come out correct. */ + + unsigned char pad1[2]; + + /* The byte offset of the code image from the start of the file. */ + + unsigned char codeImageOffset[4]; + + /* The size of the code image, in bytes. */ + + unsigned char codeImageSize[4]; + + /* The byte offset of the data image from the start of the file. */ + + unsigned char dataImageOffset[4]; + + /* The size of the data image, in bytes. */ + + unsigned char dataImageSize[4]; + + /* The size of the uninitialized data region that the loader is to be + allocated at load time. Uninitialized data follows the initialized + data in the NLM address space. */ + + unsigned char uninitializedDataSize[4]; + + /* The byte offset of the custom data from the start of the file. The + custom data is set by the CUSTOM keyword to NLMLINK. It is possible + for this to be EOF if there is no custom data. */ + + unsigned char customDataOffset[4]; + + /* The size of the custom data, in bytes. */ + + unsigned char customDataSize[4]; + + /* The byte offset of the module dependencies from the start of the file. + The module dependencies are determined by the MODULE keyword in + NLMLINK. */ + + unsigned char moduleDependencyOffset[4]; + + /* The number of module dependencies at the moduleDependencyOffset. */ + + unsigned char numberOfModuleDependencies[4]; + + /* The byte offset of the relocation fixup data from the start of the file */ + + unsigned char relocationFixupOffset[4]; + + unsigned char numberOfRelocationFixups[4]; + + unsigned char externalReferencesOffset[4]; + + unsigned char numberOfExternalReferences[4]; + + unsigned char publicsOffset[4]; + + unsigned char numberOfPublics[4]; + + /* The byte offset of the internal debug info from the start of the file. + It is possible for this to be EOF if there is no debug info. */ + + unsigned char debugInfoOffset[4]; + + unsigned char numberOfDebugRecords[4]; + + unsigned char codeStartOffset[4]; + + unsigned char exitProcedureOffset[4]; + + unsigned char checkUnloadProcedureOffset[4]; + + unsigned char moduleType[4]; + + unsigned char flags[4]; + +} Nlm32_powerpc_External_Fixed_Header; diff --git a/include/nlm/sparc32-ext.h b/include/nlm/sparc32-ext.h new file mode 100644 index 0000000..a5c78e3 --- /dev/null +++ b/include/nlm/sparc32-ext.h @@ -0,0 +1,121 @@ +/* SPARC NLM (NetWare Loadable Module) support for BFD. + Copyright 1993, 2005, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* The external format of the fixed header. */ + +typedef struct nlm32_sparc_external_fixed_header +{ + + /* The signature field identifies the file as an NLM. It must contain + the signature string, which depends upon the NLM target. */ + + unsigned char signature[24]; + + /* The version of the header. At this time, the highest version number + is 4. */ + + unsigned char version[4]; + + /* The name of the module, which must be a DOS name (1-8 characters followed + by a period and a 1-3 character extension). The first byte is the byte + length of the name and the last byte is a null terminator byte. This + field is fixed length, and any unused bytes should be null bytes. The + value is set by the OUTPUT keyword to NLMLINK. */ + + unsigned char moduleName[14]; + + /* Padding to make it come out correct. */ + + unsigned char pad1[2]; + + /* The byte offset of the code image from the start of the file. */ + + unsigned char codeImageOffset[4]; + + /* The size of the code image, in bytes. */ + + unsigned char codeImageSize[4]; + + /* The byte offset of the data image from the start of the file. */ + + unsigned char dataImageOffset[4]; + + /* The size of the data image, in bytes. */ + + unsigned char dataImageSize[4]; + + /* The size of the uninitialized data region that the loader is to be + allocated at load time. Uninitialized data follows the initialized + data in the NLM address space. */ + + unsigned char uninitializedDataSize[4]; + + /* The byte offset of the custom data from the start of the file. The + custom data is set by the CUSTOM keyword to NLMLINK. It is possible + for this to be EOF if there is no custom data. */ + + unsigned char customDataOffset[4]; + + /* The size of the custom data, in bytes. */ + + unsigned char customDataSize[4]; + + /* The byte offset of the module dependencies from the start of the file. + The module dependencies are determined by the MODULE keyword in + NLMLINK. */ + + unsigned char moduleDependencyOffset[4]; + + /* The number of module dependencies at the moduleDependencyOffset. */ + + unsigned char numberOfModuleDependencies[4]; + + /* The byte offset of the relocation fixup data from the start of the file */ + + unsigned char relocationFixupOffset[4]; + + unsigned char numberOfRelocationFixups[4]; + + unsigned char externalReferencesOffset[4]; + + unsigned char numberOfExternalReferences[4]; + + unsigned char publicsOffset[4]; + + unsigned char numberOfPublics[4]; + + /* The byte offset of the internal debug info from the start of the file. + It is possible for this to be EOF if there is no debug info. */ + + unsigned char debugInfoOffset[4]; + + unsigned char numberOfDebugRecords[4]; + + unsigned char codeStartOffset[4]; + + unsigned char exitProcedureOffset[4]; + + unsigned char checkUnloadProcedureOffset[4]; + + unsigned char moduleType[4]; + + unsigned char flags[4]; + +} Nlm32_sparc_External_Fixed_Header; diff --git a/include/oasys.h b/include/oasys.h new file mode 100644 index 0000000..92d5c26 --- /dev/null +++ b/include/oasys.h @@ -0,0 +1,192 @@ +/* Oasys object format header file for BFD. + + Copyright 2001, 2010 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. + + Contributed by Cygnus Support. */ + +#define OASYS_MAX_SEC_COUNT 16 +/* **** */ + +typedef struct oasys_archive_header + { + unsigned int version; + char create_date[12]; + char revision_date[12]; + unsigned int mod_count; + file_ptr mod_tbl_offset; + unsigned int sym_tbl_size; + unsigned int sym_count; + file_ptr sym_tbl_offset; + unsigned int xref_count; + file_ptr xref_lst_offset; + } +oasys_archive_header_type; + +typedef struct oasys_extarchive_header + { + bfd_byte version[4]; + bfd_byte create_date[12]; + bfd_byte revision_date[12]; + bfd_byte mod_count[4]; + bfd_byte mod_tbl_offset[4]; + bfd_byte sym_tbl_size[4]; + bfd_byte sym_count[4]; + bfd_byte sym_tbl_offset[4]; + bfd_byte xref_count[4]; + bfd_byte xref_lst_offset[4]; + } +oasys_extarchive_header_type; + +typedef struct oasys_module_table + { + int mod_number; + char mod_date[12]; + unsigned int mod_size; + unsigned int dep_count; + unsigned int depee_count; + file_ptr file_offset; + unsigned int sect_count; + char *module_name; + unsigned int module_name_size; + } +oasys_module_table_type; + +typedef struct oasys_extmodule_table_a + { + bfd_byte mod_number[4]; + bfd_byte mod_date[12]; + bfd_byte mod_size[4]; + bfd_byte dep_count[4]; + bfd_byte depee_count[4]; + bfd_byte sect_count[4]; + bfd_byte file_offset[4]; + bfd_byte mod_name[32]; + } +oasys_extmodule_table_type_a_type; + +typedef struct oasys_extmodule_table_b + { + bfd_byte mod_number[4]; + bfd_byte mod_date[12]; + bfd_byte mod_size[4]; + bfd_byte dep_count[4]; + bfd_byte depee_count[4]; + bfd_byte sect_count[4]; + bfd_byte file_offset[4]; + bfd_byte mod_name_length[4]; + } +oasys_extmodule_table_type_b_type; + +typedef enum oasys_record + { + oasys_record_is_end_enum = 0, + oasys_record_is_data_enum = 1, + oasys_record_is_symbol_enum = 2, + oasys_record_is_header_enum = 3, + oasys_record_is_named_section_enum = 4, + oasys_record_is_com_enum = 5, + oasys_record_is_debug_enum = 6, + oasys_record_is_section_enum = 7, + oasys_record_is_debug_file_enum = 8, + oasys_record_is_module_enum = 9, + oasys_record_is_local_enum = 10 + } +oasys_record_enum_type; + +typedef struct oasys_record_header + { + unsigned char length; + unsigned char check_sum; + unsigned char type; + unsigned char fill; + } +oasys_record_header_type; + +typedef struct oasys_data_record + { + oasys_record_header_type header; + unsigned char relb; + bfd_byte addr[4]; + /* maximum total size of data record is 255 bytes */ + bfd_byte data[246]; + } +oasys_data_record_type; + +typedef struct oasys_header_record + { + oasys_record_header_type header; + unsigned char version_number; + unsigned char rev_number; + char module_name[26-6]; + char description[64-26]; + } +oasys_header_record_type; + +#define OASYS_VERSION_NUMBER 0 +#define OASYS_REV_NUMBER 0 + +typedef struct oasys_symbol_record + { + oasys_record_header_type header; + unsigned char relb; + bfd_byte value[4]; + bfd_byte refno[2]; + char name[64]; + } +oasys_symbol_record_type; + +#define RELOCATION_PCREL_BIT 0x80 +#define RELOCATION_32BIT_BIT 0x40 +#define RELOCATION_TYPE_BITS 0x30 +#define RELOCATION_TYPE_ABS 0x00 +#define RELOCATION_TYPE_REL 0x10 +#define RELOCATION_TYPE_UND 0x20 +#define RELOCATION_TYPE_COM 0x30 +#define RELOCATION_SECT_BITS 0x0f + +typedef struct oasys_section_record + { + oasys_record_header_type header; + unsigned char relb; + bfd_byte value[4]; + bfd_byte vma[4]; + bfd_byte fill[3]; + } +oasys_section_record_type; + +typedef struct oasys_end_record + { + oasys_record_header_type header; + unsigned char relb; + bfd_byte entry[4]; + bfd_byte fill[2]; + bfd_byte zero; + } +oasys_end_record_type; + +typedef union oasys_record_union + { + oasys_record_header_type header; + oasys_data_record_type data; + oasys_section_record_type section; + oasys_symbol_record_type symbol; + oasys_header_record_type first; + oasys_end_record_type end; + bfd_byte pad[256]; + } +oasys_record_union_type; diff --git a/include/objalloc.h b/include/objalloc.h new file mode 100644 index 0000000..2c06350 --- /dev/null +++ b/include/objalloc.h @@ -0,0 +1,115 @@ +/* objalloc.h -- routines to allocate memory for objects + Copyright (C) 1997-2015 Free Software Foundation, Inc. + Written by Ian Lance Taylor, Cygnus Solutions. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef OBJALLOC_H +#define OBJALLOC_H + +#include "ansidecl.h" + +/* These routines allocate space for an object. The assumption is + that the object will want to allocate space as it goes along, but + will never want to free any particular block. There is a function + to free a block, which also frees all more recently allocated + blocks. There is also a function to free all the allocated space. + + This is essentially a specialization of obstacks. The main + difference is that a block may not be allocated a bit at a time. + Another difference is that these routines are always built on top + of malloc, and always pass an malloc failure back to the caller, + unlike more recent versions of obstacks. */ + +/* This is what an objalloc structure looks like. Callers should not + refer to these fields, nor should they allocate these structure + themselves. Instead, they should only create them via + objalloc_init, and only access them via the functions and macros + listed below. The structure is only defined here so that we can + access it via macros. */ + +struct objalloc +{ + char *current_ptr; + unsigned int current_space; + void *chunks; +}; + +/* Work out the required alignment. */ + +struct objalloc_align { char x; double d; }; + +#if defined (__STDC__) && __STDC__ +#ifndef offsetof +#include +#endif +#endif +#ifndef offsetof +#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) +#endif +#define OBJALLOC_ALIGN offsetof (struct objalloc_align, d) + +/* Create an objalloc structure. Returns NULL if malloc fails. */ + +extern struct objalloc *objalloc_create (void); + +/* Allocate space from an objalloc structure. Returns NULL if malloc + fails. */ + +extern void *_objalloc_alloc (struct objalloc *, unsigned long); + +/* The macro version of objalloc_alloc. We only define this if using + gcc, because otherwise we would have to evaluate the arguments + multiple times, or use a temporary field as obstack.h does. */ + +#if defined (__GNUC__) && defined (__STDC__) && __STDC__ + +/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and + does not implement __extension__. But that compiler doesn't define + __GNUC_MINOR__. */ +#if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) +#define __extension__ +#endif + +#define objalloc_alloc(o, l) \ + __extension__ \ + ({ struct objalloc *__o = (o); \ + unsigned long __len = (l); \ + if (__len == 0) \ + __len = 1; \ + __len = (__len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1); \ + (__len != 0 && __len <= __o->current_space \ + ? (__o->current_ptr += __len, \ + __o->current_space -= __len, \ + (void *) (__o->current_ptr - __len)) \ + : _objalloc_alloc (__o, __len)); }) + +#else /* ! __GNUC__ */ + +#define objalloc_alloc(o, l) _objalloc_alloc ((o), (l)) + +#endif /* ! __GNUC__ */ + +/* Free an entire objalloc structure. */ + +extern void objalloc_free (struct objalloc *); + +/* Free a block allocated by objalloc_alloc. This also frees all more + recently allocated blocks. */ + +extern void objalloc_free_block (struct objalloc *, void *); + +#endif /* OBJALLOC_H */ diff --git a/include/obstack.h b/include/obstack.h new file mode 100644 index 0000000..0d13c72 --- /dev/null +++ b/include/obstack.h @@ -0,0 +1,535 @@ +/* obstack.h - object stack macros + Copyright (C) 1988-2015 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +/* Summary: + + All the apparent functions defined here are macros. The idea + is that you would use these pre-tested macros to solve a + very specific set of problems, and they would run fast. + Caution: no side-effects in arguments please!! They may be + evaluated MANY times!! + + These macros operate a stack of objects. Each object starts life + small, and may grow to maturity. (Consider building a word syllable + by syllable.) An object can move while it is growing. Once it has + been "finished" it never changes address again. So the "top of the + stack" is typically an immature growing object, while the rest of the + stack is of mature, fixed size and fixed address objects. + + These routines grab large chunks of memory, using a function you + supply, called 'obstack_chunk_alloc'. On occasion, they free chunks, + by calling 'obstack_chunk_free'. You must define them and declare + them before using any obstack macros. + + Each independent stack is represented by a 'struct obstack'. + Each of the obstack macros expects a pointer to such a structure + as the first argument. + + One motivation for this package is the problem of growing char strings + in symbol tables. Unless you are "fascist pig with a read-only mind" + --Gosper's immortal quote from HAKMEM item 154, out of context--you + would not like to put any arbitrary upper limit on the length of your + symbols. + + In practice this often means you will build many short symbols and a + few long symbols. At the time you are reading a symbol you don't know + how long it is. One traditional method is to read a symbol into a + buffer, realloc()ating the buffer every time you try to read a symbol + that is longer than the buffer. This is beaut, but you still will + want to copy the symbol from the buffer to a more permanent + symbol-table entry say about half the time. + + With obstacks, you can work differently. Use one obstack for all symbol + names. As you read a symbol, grow the name in the obstack gradually. + When the name is complete, finalize it. Then, if the symbol exists already, + free the newly read name. + + The way we do this is to take a large chunk, allocating memory from + low addresses. When you want to build a symbol in the chunk you just + add chars above the current "high water mark" in the chunk. When you + have finished adding chars, because you got to the end of the symbol, + you know how long the chars are, and you can create a new object. + Mostly the chars will not burst over the highest address of the chunk, + because you would typically expect a chunk to be (say) 100 times as + long as an average object. + + In case that isn't clear, when we have enough chars to make up + the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) + so we just point to it where it lies. No moving of chars is + needed and this is the second win: potentially long strings need + never be explicitly shuffled. Once an object is formed, it does not + change its address during its lifetime. + + When the chars burst over a chunk boundary, we allocate a larger + chunk, and then copy the partly formed object from the end of the old + chunk to the beginning of the new larger chunk. We then carry on + accreting characters to the end of the object as we normally would. + + A special macro is provided to add a single char at a time to a + growing object. This allows the use of register variables, which + break the ordinary 'growth' macro. + + Summary: + We allocate large chunks. + We carve out one object at a time from the current chunk. + Once carved, an object never moves. + We are free to append data of any size to the currently + growing object. + Exactly one object is growing in an obstack at any one time. + You can run one obstack per control block. + You may have as many control blocks as you dare. + Because of the way we do it, you can "unwind" an obstack + back to a previous state. (You may remove objects much + as you would with a stack.) + */ + + +/* Don't do the contents of this file more than once. */ + +#ifndef _OBSTACK_H +#define _OBSTACK_H 1 + +#ifndef _OBSTACK_INTERFACE_VERSION +# define _OBSTACK_INTERFACE_VERSION 2 +#endif + +#include /* For size_t and ptrdiff_t. */ +#include /* For __GNU_LIBRARY__, and memcpy. */ + +#if _OBSTACK_INTERFACE_VERSION == 1 +/* For binary compatibility with obstack version 1, which used "int" + and "long" for these two types. */ +# define _OBSTACK_SIZE_T unsigned int +# define _CHUNK_SIZE_T unsigned long +# define _OBSTACK_CAST(type, expr) ((type) (expr)) +#else +/* Version 2 with sane types, especially for 64-bit hosts. */ +# define _OBSTACK_SIZE_T size_t +# define _CHUNK_SIZE_T size_t +# define _OBSTACK_CAST(type, expr) (expr) +#endif + +/* If B is the base of an object addressed by P, return the result of + aligning P to the next multiple of A + 1. B and P must be of type + char *. A + 1 must be a power of 2. */ + +#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A))) + +/* Similar to __BPTR_ALIGN (B, P, A), except optimize the common case + where pointers can be converted to integers, aligned as integers, + and converted back again. If ptrdiff_t is narrower than a + pointer (e.g., the AS/400), play it safe and compute the alignment + relative to B. Otherwise, use the faster strategy of computing the + alignment relative to 0. */ + +#define __PTR_ALIGN(B, P, A) \ + __BPTR_ALIGN (sizeof (ptrdiff_t) < sizeof (void *) ? (B) : (char *) 0, \ + P, A) + +#ifndef __attribute_pure__ +# if defined __GNUC_MINOR__ && __GNUC__ * 1000 + __GNUC_MINOR__ >= 2096 +# define __attribute_pure__ __attribute__ ((__pure__)) +# else +# define __attribute_pure__ +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +struct _obstack_chunk /* Lives at front of each chunk. */ +{ + char *limit; /* 1 past end of this chunk */ + struct _obstack_chunk *prev; /* address of prior chunk or NULL */ + char contents[4]; /* objects begin here */ +}; + +struct obstack /* control current object in current chunk */ +{ + _CHUNK_SIZE_T chunk_size; /* preferred size to allocate chunks in */ + struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ + char *object_base; /* address of object we are building */ + char *next_free; /* where to add next char to current object */ + char *chunk_limit; /* address of char after current chunk */ + union + { + _OBSTACK_SIZE_T i; + void *p; + } temp; /* Temporary for some macros. */ + _OBSTACK_SIZE_T alignment_mask; /* Mask of alignment for each object. */ + + /* These prototypes vary based on 'use_extra_arg'. */ + union + { + void *(*plain) (size_t); + void *(*extra) (void *, size_t); + } chunkfun; + union + { + void (*plain) (void *); + void (*extra) (void *, void *); + } freefun; + + void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ + unsigned use_extra_arg : 1; /* chunk alloc/dealloc funcs take extra arg */ + unsigned maybe_empty_object : 1; /* There is a possibility that the current + chunk contains a zero-length object. This + prevents freeing the chunk if we allocate + a bigger chunk to replace it. */ + unsigned alloc_failed : 1; /* No longer used, as we now call the failed + handler on error, but retained for binary + compatibility. */ +}; + +/* Declare the external functions we use; they are in obstack.c. */ + +extern void _obstack_newchunk (struct obstack *, _OBSTACK_SIZE_T); +extern void _obstack_free (struct obstack *, void *); +extern int _obstack_begin (struct obstack *, + _OBSTACK_SIZE_T, _OBSTACK_SIZE_T, + void *(*) (size_t), void (*) (void *)); +extern int _obstack_begin_1 (struct obstack *, + _OBSTACK_SIZE_T, _OBSTACK_SIZE_T, + void *(*) (void *, size_t), + void (*) (void *, void *), void *); +extern _OBSTACK_SIZE_T _obstack_memory_used (struct obstack *) + __attribute_pure__; + + +/* Error handler called when 'obstack_chunk_alloc' failed to allocate + more memory. This can be set to a user defined function which + should either abort gracefully or use longjump - but shouldn't + return. The default action is to print a message and abort. */ +extern void (*obstack_alloc_failed_handler) (void); + +/* Exit value used when 'print_and_abort' is used. */ +extern int obstack_exit_failure; + +/* Pointer to beginning of object being allocated or to be allocated next. + Note that this might not be the final address of the object + because a new chunk might be needed to hold the final size. */ + +#define obstack_base(h) ((void *) (h)->object_base) + +/* Size for allocating ordinary chunks. */ + +#define obstack_chunk_size(h) ((h)->chunk_size) + +/* Pointer to next byte not yet allocated in current chunk. */ + +#define obstack_next_free(h) ((void *) (h)->next_free) + +/* Mask specifying low bits that should be clear in address of an object. */ + +#define obstack_alignment_mask(h) ((h)->alignment_mask) + +/* To prevent prototype warnings provide complete argument list. */ +#define obstack_init(h) \ + _obstack_begin ((h), 0, 0, \ + _OBSTACK_CAST (void *(*) (size_t), obstack_chunk_alloc), \ + _OBSTACK_CAST (void (*) (void *), obstack_chunk_free)) + +#define obstack_begin(h, size) \ + _obstack_begin ((h), (size), 0, \ + _OBSTACK_CAST (void *(*) (size_t), obstack_chunk_alloc), \ + _OBSTACK_CAST (void (*) (void *), obstack_chunk_free)) + +#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ + _obstack_begin ((h), (size), (alignment), \ + _OBSTACK_CAST (void *(*) (size_t), chunkfun), \ + _OBSTACK_CAST (void (*) (void *), freefun)) + +#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ + _obstack_begin_1 ((h), (size), (alignment), \ + _OBSTACK_CAST (void *(*) (void *, size_t), chunkfun), \ + _OBSTACK_CAST (void (*) (void *, void *), freefun), arg) + +#define obstack_chunkfun(h, newchunkfun) \ + ((void) ((h)->chunkfun.extra = (void *(*) (void *, size_t)) (newchunkfun))) + +#define obstack_freefun(h, newfreefun) \ + ((void) ((h)->freefun.extra = (void *(*) (void *, void *)) (newfreefun))) + +#define obstack_1grow_fast(h, achar) ((void) (*((h)->next_free)++ = (achar))) + +#define obstack_blank_fast(h, n) ((void) ((h)->next_free += (n))) + +#define obstack_memory_used(h) _obstack_memory_used (h) + +#if defined __GNUC__ +# if !defined __GNUC_MINOR__ || __GNUC__ * 1000 + __GNUC_MINOR__ < 2008 +# define __extension__ +# endif + +/* For GNU C, if not -traditional, + we can define these macros to compute all args only once + without using a global variable. + Also, we can avoid using the 'temp' slot, to make faster code. */ + +# define obstack_object_size(OBSTACK) \ + __extension__ \ + ({ struct obstack const *__o = (OBSTACK); \ + (_OBSTACK_SIZE_T) (__o->next_free - __o->object_base); }) + +/* The local variable is named __o1 to avoid a shadowed variable + warning when invoked from other obstack macros. */ +# define obstack_room(OBSTACK) \ + __extension__ \ + ({ struct obstack const *__o1 = (OBSTACK); \ + (_OBSTACK_SIZE_T) (__o1->chunk_limit - __o1->next_free); }) + +# define obstack_make_room(OBSTACK, length) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + _OBSTACK_SIZE_T __len = (length); \ + if (obstack_room (__o) < __len) \ + _obstack_newchunk (__o, __len); \ + (void) 0; }) + +# define obstack_empty_p(OBSTACK) \ + __extension__ \ + ({ struct obstack const *__o = (OBSTACK); \ + (__o->chunk->prev == 0 \ + && __o->next_free == __PTR_ALIGN ((char *) __o->chunk, \ + __o->chunk->contents, \ + __o->alignment_mask)); }) + +# define obstack_grow(OBSTACK, where, length) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + _OBSTACK_SIZE_T __len = (length); \ + if (obstack_room (__o) < __len) \ + _obstack_newchunk (__o, __len); \ + memcpy (__o->next_free, where, __len); \ + __o->next_free += __len; \ + (void) 0; }) + +# define obstack_grow0(OBSTACK, where, length) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + _OBSTACK_SIZE_T __len = (length); \ + if (obstack_room (__o) < __len + 1) \ + _obstack_newchunk (__o, __len + 1); \ + memcpy (__o->next_free, where, __len); \ + __o->next_free += __len; \ + *(__o->next_free)++ = 0; \ + (void) 0; }) + +# define obstack_1grow(OBSTACK, datum) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + if (obstack_room (__o) < 1) \ + _obstack_newchunk (__o, 1); \ + obstack_1grow_fast (__o, datum); }) + +/* These assume that the obstack alignment is good enough for pointers + or ints, and that the data added so far to the current object + shares that much alignment. */ + +# define obstack_ptr_grow(OBSTACK, datum) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + if (obstack_room (__o) < sizeof (void *)) \ + _obstack_newchunk (__o, sizeof (void *)); \ + obstack_ptr_grow_fast (__o, datum); }) + +# define obstack_int_grow(OBSTACK, datum) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + if (obstack_room (__o) < sizeof (int)) \ + _obstack_newchunk (__o, sizeof (int)); \ + obstack_int_grow_fast (__o, datum); }) + +# define obstack_ptr_grow_fast(OBSTACK, aptr) \ + __extension__ \ + ({ struct obstack *__o1 = (OBSTACK); \ + void *__p1 = __o1->next_free; \ + *(const void **) __p1 = (aptr); \ + __o1->next_free += sizeof (const void *); \ + (void) 0; }) + +# define obstack_int_grow_fast(OBSTACK, aint) \ + __extension__ \ + ({ struct obstack *__o1 = (OBSTACK); \ + void *__p1 = __o1->next_free; \ + *(int *) __p1 = (aint); \ + __o1->next_free += sizeof (int); \ + (void) 0; }) + +# define obstack_blank(OBSTACK, length) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + _OBSTACK_SIZE_T __len = (length); \ + if (obstack_room (__o) < __len) \ + _obstack_newchunk (__o, __len); \ + obstack_blank_fast (__o, __len); }) + +# define obstack_alloc(OBSTACK, length) \ + __extension__ \ + ({ struct obstack *__h = (OBSTACK); \ + obstack_blank (__h, (length)); \ + obstack_finish (__h); }) + +# define obstack_copy(OBSTACK, where, length) \ + __extension__ \ + ({ struct obstack *__h = (OBSTACK); \ + obstack_grow (__h, (where), (length)); \ + obstack_finish (__h); }) + +# define obstack_copy0(OBSTACK, where, length) \ + __extension__ \ + ({ struct obstack *__h = (OBSTACK); \ + obstack_grow0 (__h, (where), (length)); \ + obstack_finish (__h); }) + +/* The local variable is named __o1 to avoid a shadowed variable + warning when invoked from other obstack macros, typically obstack_free. */ +# define obstack_finish(OBSTACK) \ + __extension__ \ + ({ struct obstack *__o1 = (OBSTACK); \ + void *__value = (void *) __o1->object_base; \ + if (__o1->next_free == __value) \ + __o1->maybe_empty_object = 1; \ + __o1->next_free \ + = __PTR_ALIGN (__o1->object_base, __o1->next_free, \ + __o1->alignment_mask); \ + if ((size_t) (__o1->next_free - (char *) __o1->chunk) \ + > (size_t) (__o1->chunk_limit - (char *) __o1->chunk)) \ + __o1->next_free = __o1->chunk_limit; \ + __o1->object_base = __o1->next_free; \ + __value; }) + +# define obstack_free(OBSTACK, OBJ) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + void *__obj = (void *) (OBJ); \ + if (__obj > (void *) __o->chunk && __obj < (void *) __o->chunk_limit) \ + __o->next_free = __o->object_base = (char *) __obj; \ + else \ + _obstack_free (__o, __obj); }) + +#else /* not __GNUC__ */ + +# define obstack_object_size(h) \ + ((_OBSTACK_SIZE_T) ((h)->next_free - (h)->object_base)) + +# define obstack_room(h) \ + ((_OBSTACK_SIZE_T) ((h)->chunk_limit - (h)->next_free)) + +# define obstack_empty_p(h) \ + ((h)->chunk->prev == 0 \ + && (h)->next_free == __PTR_ALIGN ((char *) (h)->chunk, \ + (h)->chunk->contents, \ + (h)->alignment_mask)) + +/* Note that the call to _obstack_newchunk is enclosed in (..., 0) + so that we can avoid having void expressions + in the arms of the conditional expression. + Casting the third operand to void was tried before, + but some compilers won't accept it. */ + +# define obstack_make_room(h, length) \ + ((h)->temp.i = (length), \ + ((obstack_room (h) < (h)->temp.i) \ + ? (_obstack_newchunk (h, (h)->temp.i), 0) : 0), \ + (void) 0) + +# define obstack_grow(h, where, length) \ + ((h)->temp.i = (length), \ + ((obstack_room (h) < (h)->temp.i) \ + ? (_obstack_newchunk ((h), (h)->temp.i), 0) : 0), \ + memcpy ((h)->next_free, where, (h)->temp.i), \ + (h)->next_free += (h)->temp.i, \ + (void) 0) + +# define obstack_grow0(h, where, length) \ + ((h)->temp.i = (length), \ + ((obstack_room (h) < (h)->temp.i + 1) \ + ? (_obstack_newchunk ((h), (h)->temp.i + 1), 0) : 0), \ + memcpy ((h)->next_free, where, (h)->temp.i), \ + (h)->next_free += (h)->temp.i, \ + *((h)->next_free)++ = 0, \ + (void) 0) + +# define obstack_1grow(h, datum) \ + (((obstack_room (h) < 1) \ + ? (_obstack_newchunk ((h), 1), 0) : 0), \ + obstack_1grow_fast (h, datum)) + +# define obstack_ptr_grow(h, datum) \ + (((obstack_room (h) < sizeof (char *)) \ + ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ + obstack_ptr_grow_fast (h, datum)) + +# define obstack_int_grow(h, datum) \ + (((obstack_room (h) < sizeof (int)) \ + ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ + obstack_int_grow_fast (h, datum)) + +# define obstack_ptr_grow_fast(h, aptr) \ + (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr), \ + (void) 0) + +# define obstack_int_grow_fast(h, aint) \ + (((int *) ((h)->next_free += sizeof (int)))[-1] = (aint), \ + (void) 0) + +# define obstack_blank(h, length) \ + ((h)->temp.i = (length), \ + ((obstack_room (h) < (h)->temp.i) \ + ? (_obstack_newchunk ((h), (h)->temp.i), 0) : 0), \ + obstack_blank_fast (h, (h)->temp.i)) + +# define obstack_alloc(h, length) \ + (obstack_blank ((h), (length)), obstack_finish ((h))) + +# define obstack_copy(h, where, length) \ + (obstack_grow ((h), (where), (length)), obstack_finish ((h))) + +# define obstack_copy0(h, where, length) \ + (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) + +# define obstack_finish(h) \ + (((h)->next_free == (h)->object_base \ + ? (((h)->maybe_empty_object = 1), 0) \ + : 0), \ + (h)->temp.p = (h)->object_base, \ + (h)->next_free \ + = __PTR_ALIGN ((h)->object_base, (h)->next_free, \ + (h)->alignment_mask), \ + (((size_t) ((h)->next_free - (char *) (h)->chunk) \ + > (size_t) ((h)->chunk_limit - (char *) (h)->chunk)) \ + ? ((h)->next_free = (h)->chunk_limit) : 0), \ + (h)->object_base = (h)->next_free, \ + (h)->temp.p) + +# define obstack_free(h, obj) \ + ((h)->temp.p = (void *) (obj), \ + (((h)->temp.p > (void *) (h)->chunk \ + && (h)->temp.p < (void *) (h)->chunk_limit) \ + ? (void) ((h)->next_free = (h)->object_base = (char *) (h)->temp.p) \ + : _obstack_free ((h), (h)->temp.p))) + +#endif /* not __GNUC__ */ + +#ifdef __cplusplus +} /* C++ */ +#endif + +#endif /* _OBSTACK_H */ diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog new file mode 100644 index 0000000..f645a7e --- /dev/null +++ b/include/opcode/ChangeLog @@ -0,0 +1,1916 @@ +2013-10-14 Chao-ying Fu + + * mips.h (mips_operand_type): Add OP_IMM_INDEX and OP_REG_INDEX. + (mips_reg_operand_type): Add OP_REG_MSA and OP_REG_MSA_CTRL. + For MIPS, add comments for +d, +e, +h, +k, +l, +n, +o, +u, +v, +w, + +T, +U, +V, +W, +~, +!, +@, +#, +$, +%, +^, +&, +*, +|. + For MIPS, update extension character sequences after +. + (ASE_MSA): New define. + (ASE_MSA64): New define. + For microMIPS, add comments for +d, +e, +h, +k, +l, +n, +o, +u, +v, +w, + +x, +T, +U, +V, +W, +~, +!, +@, +#, +$, +%, +^, +&, +*, +|. + For microMIPS, update extension character sequences after +. + +2013-08-23 Yuri Chornoivan + + PR binutils/15834 + * i960.h: Fix typos. + +2013-08-19 Richard Sandiford + + * mips.h: Remove references to "+I" and imm2_expr. + +2013-08-19 Richard Sandiford + + * mips.h (M_DEXT, M_DINS): Delete. + +2013-08-19 Richard Sandiford + + * mips.h (OP_OPTIONAL_REG): New mips_operand_type. + (mips_optional_operand_p): New function. + +2013-08-04 Jürgen Urban + Richard Sandiford + + * mips.h: Document new VU0 operand characters. + (OP_VU0_SUFFIX, OP_VU0_MATCH_SUFFIX): New mips_operand_types. + (OP_REG_VF, OP_REG_VI, OP_REG_R5900_I, OP_REG_R5900_Q, OP_REG_R5900_R) + (OP_REG_R5900_ACC): New mips_reg_operand_types. + (INSN2_VU0_CHANNEL_SUFFIX): New macro. + (mips_vu0_channel_mask): Declare. + +2013-08-03 Richard Sandiford + + * mips.h (mips_pcrel_operand): Inherit from mips_int_operand. + (mips_int_operand_min, mips_int_operand_max): New functions. + (mips_decode_pcrel_operand): Use mips_decode_int_operand. + +2013-08-01 Richard Sandiford + + * mips.h (mips_decode_reg_operand): New function. + (INSN_WRITE_SHIFT, INSN_WRITE_1, INSN_WRITE_2, INSN_WRITE_ALL) + (INSN_READ_SHIFT, INSN_READ_1, INSN_READ_2, INSN_READ_3, INSN_READ_4) + (INSN_READ_ALL, INSN_READ_GPR_24, INSN_WRITE_GPR_24, INSN_UDI): + New macros. + (INSN_WRITE_GPR_D, INSN_WRITE_GPR_T, INSN_WRITE_FPR_D) + (INSN_WRITE_FPR_S, INSN_WRITE_FPR_T, INSN_READ_GPR_S, INSN_READ_GPR_T) + (INSN_READ_FPR_S, INSN_READ_FPR_T, INSN_READ_FPR_R, INSN_WRITE_GPR_S) + (INSN2_WRITE_GPR_Z, INSN2_WRITE_FPR_Z, INSN2_READ_GPR_Z) + (INSN2_READ_FPR_Z, INSN2_READ_GPR_D, INSN2_READ_FPR_D) + (INSN2_WRITE_GPR_MB, INSN2_READ_GPR_MC, INSN2_MOD_GPR_MD) + (INSN2_READ_GPR_ME, INSN2_MOD_GPR_MF, INSN2_READ_GPR_MG) + (INSN2_READ_GPR_MJ, INSN2_WRITE_GPR_MJ, INSN2_READ_GPR_MP) + (INSN2_WRITE_GPR_MP, INSN2_READ_GPR_MQ, INSN2_READ_GP) + (INSN2_WRITE_GPR_MH, INSN2_READ_GPR_MMN): Delete. Renumber other + macros to cover the gaps. + (INSN2_MOD_SP): Replace with... + (INSN2_WRITE_SP, INSN2_READ_SP): ...these new macros. + (MIPS16_INSN_WRITE_X, MIPS16_INSN_WRITE_Y, MIPS16_INSN_WRITE_Z) + (MIPS16_INSN_WRITE_T, MIPS16_INSN_WRITE_31, MIPS16_INSN_WRITE_GPR_Y) + (MIPS16_INSN_READ_X, MIPS16_INSN_READ_Y, MIPS16_INSN_READ_Z) + (MIPS16_INSN_READ_T, MIPS16_INSN_READ_SP, MIPS16_INSN_READ_GPR_X): + Delete. + +2013-08-01 Richard Sandiford + + * mips.h (MIPS16_INSN_WRITE_SP, MIPS16_INSN_READ_31) + (MIPS16_INSN_READ_PC, MIPS16_INSN_UNCOND_BRANCH) + (MIPS16_INSN_COND_BRANCH): Delete. + +2013-07-24 Anna Tikhonova + Kirill Yukhin + Michael Zolotukhin + + * i386.h (BND_PREFIX_OPCODE): New. + +2013-07-14 Richard Sandiford + + * mips.h (mips_operand_type): Add OP_ENTRY_EXIT_LIST and + OP_SAVE_RESTORE_LIST. + (decode_mips16_operand): Declare. + +2013-07-14 Richard Sandiford + + * mips.h (mips_operand_type, mips_reg_operand_type): New enums. + (mips_operand, mips_int_operand, mips_mapped_int_operand) + (mips_msb_operand, mips_reg_operand, mips_reg_pair_operand) + (mips_pcrel_operand): New structures. + (mips_insert_operand, mips_extract_operand, mips_signed_operand) + (mips_decode_int_operand, mips_decode_pcrel_operand): New functions. + (decode_mips_operand, decode_micromips_operand): Declare. + +2013-07-14 Richard Sandiford + + * mips.h: Document MIPS16 "I" opcode. + +2013-07-07 Richard Sandiford + + * mips.h (M_ACLR_OB, M_ASET_OB, M_CACHE_OB, M_CACHEE_OB, M_L_DOB) + (M_LB_A, M_LBE_OB, M_LBU_A, M_LBUE_OB, M_LD_A, M_LD_OB, M_LDC2_OB) + (M_LDL_OB, M_LDM_OB, M_LDP_OB, M_LDR_OB, M_LH_A, M_LHE_OB, M_LHU_A) + (M_LHUE_OB, M_LL_OB, M_LLD_OB, M_LLE_OB, M_LS_A, M_LW_A, M_LWE_OB) + (M_LWC0_A, M_LWC1_A, M_LWC2_A, M_LWC2_OB, M_LWC3_A, M_LWL_A, M_LWL_OB) + (M_LWLE_OB, M_LWM_OB, M_LWP_OB, M_LWR_A, M_LWR_OB, M_LWRE_OB, M_LWU_OB) + (M_PREF_OB, M_PREFE_OB, M_S_DOB, M_SAA_OB, M_SAAD_OB, M_SC_OB) + (M_SCD_OB, M_SCE_OB, M_SD_A, M_SD_OB, M_SDC2_OB, M_SDL_OB, M_SDM_OB) + (M_SDP_OB, M_SDR_OB, M_SB_A, M_SBE_OB, M_SH_A, M_SHE_OB, M_SW_A) + (M_SWE_OB, M_SWC0_A, M_SWC1_A, M_SWC2_A, M_SWC2_OB, M_SWC3_A, M_SWL_A) + (M_SWL_OB, M_SWLE_OB, M_SWM_OB, M_SWP_OB, M_SWR_A, M_SWR_OB, M_SWRE_OB) + (M_ULD, M_ULH, M_ULHU, M_ULW, M_USH, M_USW, M_USD): Delete. + (M_ULD_A, M_ULH_A, M_ULHU_A, M_ULW_A, M_USH_A, M_USW_A, M_USD_A): + Rename to... + (M_ULD_AB, M_ULH_AB, M_ULHU_AB, M_ULW_AB, M_USH_AB, M_USW_AB) + (M_USD_AB): ...these. + +2013-07-07 Richard Sandiford + + * mips.h: Remove documentation of "[" and "]". Update documentation + of "k" and the MDMX formats. + +2013-07-07 Richard Sandiford + + * mips.h: Update documentation of "+s" and "+S". + +2013-07-07 Richard Sandiford + + * mips.h: Document "+i". + +2013-07-07 Richard Sandiford + + * mips.h: Remove "mi" documentation. Update "mh" documentation. + (OP_MASK_MI, OP_SH_MI, MICROMIPSOP_MASK_MI, MICROMIPSOP_MASK_MI): + Delete. + (INSN2_WRITE_GPR_MHI): Rename to... + (INSN2_WRITE_GPR_MH): ...this. + +2013-07-07 Richard Sandiford + + * mips.h: Remove documentation of "+D" and "+T". + +2013-06-26 Richard Sandiford + + * mips.h: Fix comment for "1": it is now STYPE rather than SHAMT. + Use "source" rather than "destination" for microMIPS "G". + +2013-06-25 Maciej W. Rozycki + + * mips.h: Add M_JRADDIUSP, M_JRC and M_MOVEP anonymous enum + values. + +2013-06-23 Richard Sandiford + + * mips.h: Fix comment typo: "G" is _RS rather than _RD for microMIPS. + +2013-06-17 Catherine Moore + Maciej W. Rozycki + Chao-Ying Fu + + * mips.h (OP_SH_EVAOFFSET): Define. + (OP_MASK_EVAOFFSET): Define. + (INSN_ASE_MASK): Delete. + (ASE_EVA): Define. + (M_CACHEE_AB, M_CACHEE_OB): New. + (M_LBE_OB, M_LBE_AB): New. + (M_LBUE_OB, M_LBUE_AB): New. + (M_LHE_OB, M_LHE_AB): New. + (M_LHUE_OB, M_LHUE_AB): New. + (M_LLE_AB, M_LLE_OB): New. + (M_LWE_OB, M_LWE_AB): New. + (M_LWLE_AB, M_LWLE_OB): New. + (M_LWRE_AB, M_LWRE_OB): New. + (M_PREFE_AB, M_PREFE_OB): New. + (M_SCE_AB, M_SCE_OB): New. + (M_SBE_OB, M_SBE_AB): New. + (M_SHE_OB, M_SHE_AB): New. + (M_SWE_OB, M_SWE_AB): New. + (M_SWLE_AB, M_SWLE_OB): New. + (M_SWRE_AB, M_SWRE_OB): New. + (MICROMIPSOP_SH_EVAOFFSET): Define. + (MICROMIPSOP_MASK_EVAOFFSET): Define. + +2013-06-12 Sandra Loosemore + + * nios2.h (OP_MATCH_ERET): Correct eret encoding. + +2013-05-22 Jürgen Urban + + * mips.h (M_LQC2_AB, M_SQC2_AB): New macros. + +2013-05-09 Andrew Pinski + + * mips.h (OP_MASK_CODE10): Correct definition. + (OP_SH_CODE10): Likewise. + Add a comment that "+J" is used now for OP_*CODE10. + (INSN_ASE_MASK): Update. + (INSN_VIRT): New macro. + (INSN_VIRT64): New macro + +2013-05-02 Nick Clifton + + * msp430.h: Add patterns for MSP430X instructions. + +2013-04-06 David S. Miller + + * sparc.h (F_PREFERRED): Define. + (F_PREF_ALIAS): Define. + +2013-04-03 Nick Clifton + + * v850.h (V850_INVERSE_PCREL): Define. + +2013-03-27 Alexis Deruelle + + PR binutils/15068 + * tic6x-opcode-table.h: Fix patterns for add, ldnw and xor. + +2013-03-27 Alexis Deruelle + + PR binutils/15068 + * tic6xc-insn-formats.h (FLD): Add use of bitfield array. + Add 16-bit opcodes. + * tic6xc-opcode-table.h: Add 16-bit insns. + * tic6x.h: Add support for 16-bit insns. + +2013-03-21 Michael Schewe + + * h8300.h: Add MEMRELAX flag for mov.b/w/l @(d:32,ERs),Rd + and mov.b/w/l Rs,@(d:32,ERd). + +2013-03-20 Alexis Deruelle + + PR gas/15082 + * tic6x-opcode-table.h: Rename mpydp's specific operand type macro + from ORREGD1324 to ORXREGD1324 and make it cross-path-able through + tic6x_operand_xregpair operand coding type. + Make mpydp instruction cross-path-able, ie: remove the FIXed 'x' + opcode field, usu ORXREGD1324 for the src2 operand and remove the + TIC6X_FLAG_NO_CROSS. + +2013-03-20 Alexis Deruelle + + PR gas/15095 + * tic6x.h (enum tic6x_coding_method): Add + tic6x_coding_dreg_(msb|lsb) field coding type in order to encode + separately the msb and lsb of a register pair. This is needed to + encode the opcodes in the same way as TI assembler does. + * tic6x-opcode-table.h: Modify absdp, dpint, dpsp, dptrunc, rcpdp + and rsqrdp opcodes to use the new field coding types. + +2013-03-11 Kyrylo Tkachov + + * arm.h (CRC_EXT_ARMV8): New constant. + (ARCH_CRC_ARMV8): New macro. + +2013-02-28 Yufeng Zhang + + * aarch64.h (AARCH64_FEATURE_CRC): New macro. + +2013-02-06 Sandra Loosemore + Andrew Jenner + + Based on patches from Altera Corporation. + + * nios2.h: New file. + +2013-01-30 Yufeng Zhang + + * aarch64.h (aarch64_op): Add OP_SXTL, OP_SXTL2, OP_UXTL and OP_UXTL2. + +2013-01-28 Alexis Deruelle + + PR gas/15069 + * tic6x-opcode-table.h: Fix encoding of BNOP instruction. + +2013-01-24 Nick Clifton + + * v850.h: Add e3v5 support. + +2013-01-17 Yufeng Zhang + + * aarch64.h (aarch64_op): Remove OP_V_MOVI_B. + +2013-01-10 Peter Bergner + + * ppc.h (PPC_OPCODE_POWER8): New define. + (PPC_OPCODE_HTM): Likewise. + +2013-01-10 Will Newton + + * metag.h: New file. + +2013-01-07 Kaushik Phatak + + * cr16.h (make_instruction): Rename to cr16_make_instruction. + (match_opcode): Rename to cr16_match_opcode. + +2013-01-04 Juergen Urban + + * mips.h: Add support for r5900 instructions including lq and sq. + +2013-01-02 Kaushik Phatak + + * cr16.h (dwordU,wordU): Moved typedefs from cr16-dis.c + (make_instruction,match_opcode): Added function prototypes. + (cr16_words,cr16_allWords,cr16_currInsn): Declare as extern. + +2012-11-23 Alan Modra + + * ppc.h (ppc_parse_cpu): Update prototype. + +2012-10-14 John David Anglin + + * hppa.h (pa_opcodes): Use "cX" completer instead of "cx" in fstqx + opcodes. Likewise, use "cM" instead of "cm" in fstqs opcodes. + +2012-10-04 Andreas Krebbel + + * s390.h (s390_opcode_cpu_val): Add S390_OPCODE_ZEC12. + +2012-09-04 Sergey A. Guriev + + * ia64.h (ia64_opnd): Add new operand types. + +2012-08-21 David S. Miller + + * sparc.h (F3F4): New macro. + +2012-08-13 Ian Bolton + Laurent Desnogues + Jim MacArthur + Marcus Shawcroft + Nigel Stephens + Ramana Radhakrishnan + Richard Earnshaw + Sofiane Naci + Tejas Belagod + Yufeng Zhang + + * aarch64.h: New file. + +2012-08-13 Richard Sandiford + Maciej W. Rozycki + + * mips.h (mips_opcode): Add the exclusions field. + (OPCODE_IS_MEMBER): Remove macro. + (cpu_is_member): New inline function. + (opcode_is_member): Likewise. + +2012-07-31 Chao-Ying Fu + Catherine Moore + Maciej W. Rozycki + + * mips.h: Document microMIPS DSP ASE usage. + (MICROMIPSOP_MASK_DSPACC, MICROMIPSOP_SH_DSPACC): Update for + microMIPS DSP ASE support. + (MICROMIPSOP_MASK_DSPSFT, MICROMIPSOP_SH_DSPSFT): Likewise. + (MICROMIPSOP_MASK_SA3, MICROMIPSOP_SH_SA3): Likewise. + (MICROMIPSOP_MASK_SA4, MICROMIPSOP_SH_SA4): Likewise. + (MICROMIPSOP_MASK_IMM8, MICROMIPSOP_SH_IMM8): Likewise. + (MICROMIPSOP_MASK_IMM10, MICROMIPSOP_SH_IMM10): Likewise. + (MICROMIPSOP_MASK_WRDSP, MICROMIPSOP_SH_WRDSP): Likewise. + (MICROMIPSOP_MASK_BP, MICROMIPSOP_SH_BP): Likewise. + +2012-07-06 Maciej W. Rozycki + + * mips.h: Fix a typo in description. + +2012-06-07 Georg-Johann Lay + + * avr.h: (AVR_ISA_XCH): New define. + (AVR_ISA_XMEGA): Use it. + (XCH, LAS, LAT, LAC): New XMEGA opcodes. + +2012-05-15 James Murray + + * m68hc11.h: Add XGate definitions. + (struct m68hc11_opcode): Add xg_mask field. + +2012-05-14 Catherine Moore + Maciej W. Rozycki + Rhonda Wittels + + * ppc.h (PPC_OPCODE_VLE): New definition. + (PPC_OP_SA): New macro. + (PPC_OP_SE_VLE): New macro. + (PPC_OP): Use a variable shift amount. + (powerpc_operand): Update comments. + (PPC_OPSHIFT_INV): New macro. + (PPC_OPERAND_CR): Replace with... + (PPC_OPERAND_CR_BIT): ...this and + (PPC_OPERAND_CR_REG): ...this. + + +2012-05-03 Sean Keys + + * xgate.h: Header file for XGATE assembler. + +2012-04-27 David S. Miller + + * sparc.h: Document new arg code' )' for crypto RS3 + immediates. + + * sparc.h (struct sparc_opcode): New field 'hwcaps'. + F_MUL32, F_DIV32, F_FDMULD, F_V8PLUS, F_POPC, F_VIS, F_VIS2, + F_ASI_BLK_INIT, F_FMAF, F_VIS3, F_HPC, F_RANDOM, F_TRANS, + F_FJFMAU, F_IMA, F_ASI_CACHE_SPARING, F_HWCAP_MASK): Delete. + (HWCAP_MUL32, HWCAP_DIV32, HWCAP_FSMULD, HWCAP_V8PLUS, HWCAP_POPC, + HWCAP_VIS, HWCAP_VIS2, HWCAP_ASI_BLK_INIT, HWCAP_FMAF, + HWCAP_VIS3, HWCAP_HPC, HWCAP_RANDOM, HWCAP_TRANS, HWCAP_FJFMAU, + HWCAP_IMA, HWCAP_ASI_CACHE_SPARING, HWCAP_AES, HWCAP_DES, + HWCAP_KASUMI, HWCAP_CAMELLIA, HWCAP_MD5, HWCAP_SHA1, + HWCAP_SHA256, HWCAP_SHA512, HWCAP_MPMUL, HWCAP_MONT, HWCAP_PAUSE, + HWCAP_CBCOND, HWCAP_CRC32): New defines. + +2012-03-10 Edmar Wienskoski + + * ppc.h: Add PPC_OPCODE_ALTIVEC2, PPC_OPCODE_E6500, PPC_OPCODE_TMR. + +2012-02-27 Alan Modra + + * crx.h (cst4_map): Update declaration. + +2012-02-25 Walter Lee + + * tilegx.h (tilegx_mnemonic): Add TILEGX_OPC_LD4S_TLS, + TILEGX_OPC_LD_TLS. + * tilepro.h (tilepro_mnemonic): Add TILEPRO_OPC_LW_TLS, + TILEPRO_OPC_LW_TLS_SN. + +2012-02-08 H.J. Lu + + * i386.h (XACQUIRE_PREFIX_OPCODE): New. + (XRELEASE_PREFIX_OPCODE): Likewise. + +2011-12-08 Andrew Pinski + Adam Nemet + + * mips.h (INSN_CHIP_MASK): Update according to INSN_OCTEON2. + (INSN_OCTEON2): New macro. + (CPU_OCTEON2): New macro. + (OPCODE_IS_MEMBER): Add Octeon2. + +2011-11-29 Andrew Pinski + + * mips.h (INSN_CHIP_MASK): Update according to INSN_OCTEONP. + (INSN_OCTEONP): New macro. + (CPU_OCTEONP): New macro. + (OPCODE_IS_MEMBER): Add Octeon+. + (M_SAA_AB, M_SAAD_AB, M_SAA_OB, M_SAAD_OB): New enum values. + +2011-11-01 DJ Delorie + + * rl78.h: New file. + +2011-10-24 Maciej W. Rozycki + + * mips.h: Fix a typo in description. + +2011-09-21 David S. Miller + + * sparc.h (struct sparc_opcode): Expand 'flags' to unsigned int. + (F_MUL32, F_DIV32, F_FSMULD, F_V8PLUS, F_POPC, F_VIS, F_VIS2, + F_ASI_BLK_INIT, F_FMAF, F_VIS3, F_HPC, F_RANDOM, F_TRANS, + F_FJFMAU, F_IMA, F_ASI_CACHE_SPARING): New flag bits. + +2011-08-09 Chao-ying Fu + Maciej W. Rozycki + + * mips.h (OP_MASK_3BITPOS, OP_SH_3BITPOS): New macros. + (OP_MASK_OFFSET12, OP_SH_OFFSET12): Redefine. + (INSN_ASE_MASK): Add the MCU bit. + (INSN_MCU): New macro. + (M_ACLR_AB, M_ACLR_OB, M_ASET_AB, M_ASET_OB): New enum values. + (MICROMIPSOP_MASK_3BITPOS, MICROMIPSOP_SH_3BITPOS): New macros. + +2011-08-09 Maciej W. Rozycki + + * mips.h (INSN_WRITE_GPR_S, INSN2_WRITE_GPR_MB): New macros. + (INSN2_READ_GPR_MC, INSN2_READ_GPR_ME): Likewise. + (INSN2_WRITE_GPR_MF, INSN2_READ_GPR_MG): Likewise. + (INSN2_READ_GPR_MJ, INSN2_WRITE_GPR_MJ): Likewise. + (INSN2_READ_GPR_MP, INSN2_WRITE_GPR_MP): Likewise. + (INSN2_READ_GPR_MQ, INSN2_WRITE_GPR_MHI): Likewise. + (INSN2_READ_GPR_MMN): Likewise. + (INSN2_READ_FPR_D): Change the bit used. + (INSN2_MOD_GPR_MD, INSN2_MOD_GPR_MF): Likewise. + (INSN2_MOD_SP, INSN2_READ_GPR_31, INSN2_READ_GP): Likewise. + (INSN2_READ_PC, INSN2_UNCOND_BRANCH): Likewise. + (INSN2_COND_BRANCH): Likewise. + (INSN2_WRITE_GPR_S, INSN2_MOD_GPR_MB): Remove macros. + (INSN2_MOD_GPR_MC, INSN2_MOD_GPR_ME, INSN2_MOD_GPR_MG): Likewise. + (INSN2_MOD_GPR_MJ, INSN2_MOD_GPR_MP, INSN2_MOD_GPR_MQ): Likewise. + (INSN2_MOD_GPR_MHI, INSN2_MOD_GPR_MM): Likewise. + (INSN2_MOD_GPR_MN): Likewise. + +2011-08-05 David S. Miller + + * sparc.h: Document new format codes '4', '5', and '('. + (OPF_LOW4, RS3): New macros. + +2011-08-03 Maciej W. Rozycki + + * mips.h: Document the use of FP_D in MIPS16 mode. Adjust the + order of flags documented. + +2011-07-29 Maciej W. Rozycki + + * mips.h: Clarify the description of microMIPS instruction + manipulation macros. + (MICROMIPSOP_MASK_MAJOR, MICROMIPSOP_SH_MAJOR): Remove macros. + +2011-07-24 Chao-ying Fu + Maciej W. Rozycki + + * mips.h (OP_MASK_EXTLSB, OP_SH_EXTLSB): New macros. + (OP_MASK_STYPE, OP_SH_STYPE): Likewise. + (OP_MASK_CODE10, OP_SH_CODE10): Likewise. + (OP_MASK_TRAP, OP_SH_TRAP): Likewise. + (OP_MASK_OFFSET12, OP_SH_OFFSET12): Likewise. + (OP_MASK_OFFSET10, OP_SH_OFFSET10): Likewise. + (OP_MASK_RS3, OP_SH_RS3): Likewise. + (OP_MASK_MB, OP_SH_MB, OP_MASK_MC, OP_SH_MC): Likewise. + (OP_MASK_MD, OP_SH_MD, OP_MASK_ME, OP_SH_ME): Likewise. + (OP_MASK_MF, OP_SH_MF, OP_MASK_MG, OP_SH_MG): Likewise. + (OP_MASK_MJ, OP_SH_MJ, OP_MASK_ML, OP_SH_ML): Likewise. + (OP_MASK_MP, OP_SH_MP, OP_MASK_MQ, OP_SH_MQ): Likewise. + (OP_MASK_IMMA, OP_SH_IMMA, OP_MASK_IMMB, OP_SH_IMMB): Likewise. + (OP_MASK_IMMC, OP_SH_IMMC, OP_MASK_IMMF, OP_SH_IMMF): Likewise. + (OP_MASK_IMMG, OP_SH_IMMG, OP_MASK_IMMH, OP_SH_IMMH): Likewise. + (OP_MASK_IMMI, OP_SH_IMMI, OP_MASK_IMMJ, OP_SH_IMMJ): Likewise. + (OP_MASK_IMML, OP_SH_IMML, OP_MASK_IMMM, OP_SH_IMMM): Likewise. + (OP_MASK_IMMN, OP_SH_IMMN, OP_MASK_IMMO, OP_SH_IMMO): Likewise. + (OP_MASK_IMMP, OP_SH_IMMP, OP_MASK_IMMQ, OP_SH_IMMQ): Likewise. + (OP_MASK_IMMU, OP_SH_IMMU, OP_MASK_IMMW, OP_SH_IMMW): Likewise. + (OP_MASK_IMMX, OP_SH_IMMX, OP_MASK_IMMY, OP_SH_IMMY): Likewise. + (INSN_WRITE_GPR_S): New macro. + (INSN2_BRANCH_DELAY_16BIT, INSN2_BRANCH_DELAY_32BIT): Likewise. + (INSN2_READ_FPR_D): Likewise. + (INSN2_MOD_GPR_MB, INSN2_MOD_GPR_MC): Likewise. + (INSN2_MOD_GPR_MD, INSN2_MOD_GPR_ME): Likewise. + (INSN2_MOD_GPR_MF, INSN2_MOD_GPR_MG): Likewise. + (INSN2_MOD_GPR_MJ, INSN2_MOD_GPR_MP): Likewise. + (INSN2_MOD_GPR_MQ, INSN2_MOD_SP): Likewise. + (INSN2_READ_GPR_31, INSN2_READ_GP, INSN2_READ_PC): Likewise. + (INSN2_UNCOND_BRANCH, INSN2_COND_BRANCH): Likewise. + (INSN2_MOD_GPR_MHI, INSN2_MOD_GPR_MM, INSN2_MOD_GPR_MN): Likewise. + (CPU_MICROMIPS): New macro. + (M_BC1FL, M_BC1TL, M_BC2FL, M_BC2TL): New enum values. + (M_BEQL, M_BGEZ, M_BGEZL, M_BGEZALL, M_BGTZ, M_BGTZL): Likewise. + (M_BLEZ, M_BLEZL, M_BLTZ, M_BLTZL, M_BLTZALL, M_BNEL): Likewise. + (M_CACHE_OB, M_JALS_1, M_JALS_2, M_JALS_A): Likewise. + (M_LDC2_OB, M_LDL_OB, M_LDM_AB, M_LDM_OB): Likewise. + (M_LDP_AB, M_LDP_OB, M_LDR_OB, M_LL_OB, M_LLD_OB): Likewise. + (M_LWC2_OB, M_LWL_OB, M_LWM_AB, M_LWM_OB): Likewise. + (M_LWP_AB, M_LWP_OB, M_LWR_OB): Likewise. + (M_LWU_OB, M_PREF_OB, M_SC_OB, M_SCD_OB): Likewise. + (M_SDC2_OB, M_SDL_OB, M_SDM_AB, M_SDM_OB): Likewise. + (M_SDP_AB, M_SDP_OB, M_SDR_OB): Likewise. + (M_SWC2_OB, M_SWL_OB, M_SWM_AB, M_SWM_OB): Likewise. + (M_SWP_AB, M_SWP_OB, M_SWR_OB): Likewise. + (MICROMIPSOP_MASK_MAJOR, MICROMIPSOP_SH_MAJOR): New macros. + (MICROMIPSOP_MASK_IMMEDIATE, MICROMIPSOP_SH_IMMEDIATE): Likewise. + (MICROMIPSOP_MASK_DELTA, MICROMIPSOP_SH_DELTA): Likewise. + (MICROMIPSOP_MASK_CODE10, MICROMIPSOP_SH_CODE10): Likewise. + (MICROMIPSOP_MASK_TRAP, MICROMIPSOP_SH_TRAP): Likewise. + (MICROMIPSOP_MASK_SHAMT, MICROMIPSOP_SH_SHAMT): Likewise. + (MICROMIPSOP_MASK_TARGET, MICROMIPSOP_SH_TARGET): Likewise. + (MICROMIPSOP_MASK_EXTLSB, MICROMIPSOP_SH_EXTLSB): Likewise. + (MICROMIPSOP_MASK_EXTMSBD, MICROMIPSOP_SH_EXTMSBD): Likewise. + (MICROMIPSOP_MASK_INSMSB, MICROMIPSOP_SH_INSMSB): Likewise. + (MICROMIPSOP_MASK_CODE, MICROMIPSOP_SH_CODE): Likewise. + (MICROMIPSOP_MASK_CODE2, MICROMIPSOP_SH_CODE2): Likewise. + (MICROMIPSOP_MASK_CACHE, MICROMIPSOP_SH_CACHE): Likewise. + (MICROMIPSOP_MASK_SEL, MICROMIPSOP_SH_SEL): Likewise. + (MICROMIPSOP_MASK_OFFSET12, MICROMIPSOP_SH_OFFSET12): Likewise. + (MICROMIPSOP_MASK_3BITPOS, MICROMIPSOP_SH_3BITPOS): Likewise. + (MICROMIPSOP_MASK_STYPE, MICROMIPSOP_SH_STYPE): Likewise. + (MICROMIPSOP_MASK_OFFSET10, MICROMIPSOP_SH_OFFSET10): Likewise. + (MICROMIPSOP_MASK_RS, MICROMIPSOP_SH_RS): Likewise. + (MICROMIPSOP_MASK_RT, MICROMIPSOP_SH_RT): Likewise. + (MICROMIPSOP_MASK_RD, MICROMIPSOP_SH_RD): Likewise. + (MICROMIPSOP_MASK_FS, MICROMIPSOP_SH_FS): Likewise. + (MICROMIPSOP_MASK_FT, MICROMIPSOP_SH_FT): Likewise. + (MICROMIPSOP_MASK_FD, MICROMIPSOP_SH_FD): Likewise. + (MICROMIPSOP_MASK_FR, MICROMIPSOP_SH_FR): Likewise. + (MICROMIPSOP_MASK_RS3, MICROMIPSOP_SH_RS3): Likewise. + (MICROMIPSOP_MASK_PREFX, MICROMIPSOP_SH_PREFX): Likewise. + (MICROMIPSOP_MASK_BCC, MICROMIPSOP_SH_BCC): Likewise. + (MICROMIPSOP_MASK_CCC, MICROMIPSOP_SH_CCC): Likewise. + (MICROMIPSOP_MASK_COPZ, MICROMIPSOP_SH_COPZ): Likewise. + (MICROMIPSOP_MASK_MB, MICROMIPSOP_SH_MB): Likewise. + (MICROMIPSOP_MASK_MC, MICROMIPSOP_SH_MC): Likewise. + (MICROMIPSOP_MASK_MD, MICROMIPSOP_SH_MD): Likewise. + (MICROMIPSOP_MASK_ME, MICROMIPSOP_SH_ME): Likewise. + (MICROMIPSOP_MASK_MF, MICROMIPSOP_SH_MF): Likewise. + (MICROMIPSOP_MASK_MG, MICROMIPSOP_SH_MG): Likewise. + (MICROMIPSOP_MASK_MH, MICROMIPSOP_SH_MH): Likewise. + (MICROMIPSOP_MASK_MI, MICROMIPSOP_SH_MI): Likewise. + (MICROMIPSOP_MASK_MJ, MICROMIPSOP_SH_MJ): Likewise. + (MICROMIPSOP_MASK_ML, MICROMIPSOP_SH_ML): Likewise. + (MICROMIPSOP_MASK_MM, MICROMIPSOP_SH_MM): Likewise. + (MICROMIPSOP_MASK_MN, MICROMIPSOP_SH_MN): Likewise. + (MICROMIPSOP_MASK_MP, MICROMIPSOP_SH_MP): Likewise. + (MICROMIPSOP_MASK_MQ, MICROMIPSOP_SH_MQ): Likewise. + (MICROMIPSOP_MASK_IMMA, MICROMIPSOP_SH_IMMA): Likewise. + (MICROMIPSOP_MASK_IMMB, MICROMIPSOP_SH_IMMB): Likewise. + (MICROMIPSOP_MASK_IMMC, MICROMIPSOP_SH_IMMC): Likewise. + (MICROMIPSOP_MASK_IMMD, MICROMIPSOP_SH_IMMD): Likewise. + (MICROMIPSOP_MASK_IMME, MICROMIPSOP_SH_IMME): Likewise. + (MICROMIPSOP_MASK_IMMF, MICROMIPSOP_SH_IMMF): Likewise. + (MICROMIPSOP_MASK_IMMG, MICROMIPSOP_SH_IMMG): Likewise. + (MICROMIPSOP_MASK_IMMH, MICROMIPSOP_SH_IMMH): Likewise. + (MICROMIPSOP_MASK_IMMI, MICROMIPSOP_SH_IMMI): Likewise. + (MICROMIPSOP_MASK_IMMJ, MICROMIPSOP_SH_IMMJ): Likewise. + (MICROMIPSOP_MASK_IMML, MICROMIPSOP_SH_IMML): Likewise. + (MICROMIPSOP_MASK_IMMM, MICROMIPSOP_SH_IMMM): Likewise. + (MICROMIPSOP_MASK_IMMN, MICROMIPSOP_SH_IMMN): Likewise. + (MICROMIPSOP_MASK_IMMO, MICROMIPSOP_SH_IMMO): Likewise. + (MICROMIPSOP_MASK_IMMP, MICROMIPSOP_SH_IMMP): Likewise. + (MICROMIPSOP_MASK_IMMQ, MICROMIPSOP_SH_IMMQ): Likewise. + (MICROMIPSOP_MASK_IMMU, MICROMIPSOP_SH_IMMU): Likewise. + (MICROMIPSOP_MASK_IMMW, MICROMIPSOP_SH_IMMW): Likewise. + (MICROMIPSOP_MASK_IMMX, MICROMIPSOP_SH_IMMX): Likewise. + (MICROMIPSOP_MASK_IMMY, MICROMIPSOP_SH_IMMY): Likewise. + (MICROMIPSOP_MASK_CODE, MICROMIPSOP_SH_CODE): Likewise. + (MICROMIPSOP_MASK_CODE2, MICROMIPSOP_SH_CODE2): Likewise. + (MICROMIPSOP_MASK_CACHE, MICROMIPSOP_SH_CACHE): Likewise. + (MICROMIPSOP_MASK_CODE20, MICROMIPSOP_SH_CODE20): Likewise. + (MICROMIPSOP_MASK_PERFREG, MICROMIPSOP_SH_PERFREG): Likewise. + (MICROMIPSOP_MASK_CODE19, MICROMIPSOP_SH_CODE19): Likewise. + (MICROMIPSOP_MASK_ALN, MICROMIPSOP_SH_ALN): Likewise. + (MICROMIPSOP_MASK_VECBYTE, MICROMIPSOP_SH_VECBYTE): Likewise. + (MICROMIPSOP_MASK_VECALIGN, MICROMIPSOP_SH_VECALIGN): Likewise. + (MICROMIPSOP_MASK_DSPACC, MICROMIPSOP_SH_DSPACC): Likewise. + (MICROMIPSOP_MASK_DSPACC_S, MICROMIPSOP_SH_DSPACC_S): Likewise. + (MICROMIPSOP_MASK_DSPSFT, MICROMIPSOP_SH_DSPSFT): Likewise. + (MICROMIPSOP_MASK_DSPSFT_7, MICROMIPSOP_SH_DSPSFT_7): Likewise. + (MICROMIPSOP_MASK_SA3, MICROMIPSOP_SH_SA3): Likewise. + (MICROMIPSOP_MASK_SA4, MICROMIPSOP_SH_SA4): Likewise. + (MICROMIPSOP_MASK_IMM8, MICROMIPSOP_SH_IMM8): Likewise. + (MICROMIPSOP_MASK_IMM10, MICROMIPSOP_SH_IMM10): Likewise. + (MICROMIPSOP_MASK_WRDSP, MICROMIPSOP_SH_WRDSP): Likewise. + (MICROMIPSOP_MASK_RDDSP, MICROMIPSOP_SH_RDDSP): Likewise. + (MICROMIPSOP_MASK_BP, MICROMIPSOP_SH_BP): Likewise. + (MICROMIPSOP_MASK_MT_U, MICROMIPSOP_SH_MT_U): Likewise. + (MICROMIPSOP_MASK_MT_H, MICROMIPSOP_SH_MT_H): Likewise. + (MICROMIPSOP_MASK_MTACC_T, MICROMIPSOP_SH_MTACC_T): Likewise. + (MICROMIPSOP_MASK_MTACC_D, MICROMIPSOP_SH_MTACC_D): Likewise. + (MICROMIPSOP_MASK_BBITIND, MICROMIPSOP_SH_BBITIND): Likewise. + (MICROMIPSOP_MASK_CINSPOS, MICROMIPSOP_SH_CINSPOS): Likewise. + (MICROMIPSOP_MASK_CINSLM1, MICROMIPSOP_SH_CINSLM1): Likewise. + (MICROMIPSOP_MASK_SEQI, MICROMIPSOP_SH_SEQI): Likewise. + (micromips_opcodes): New declaration. + (bfd_micromips_num_opcodes): Likewise. + +2011-07-24 Maciej W. Rozycki + + * mips.h (INSN_TRAP): Rename to... + (INSN_NO_DELAY_SLOT): ... this. + (INSN_SYNC): Remove macro. + +2011-07-01 Eric B. Weddington + + * avr.h (AVR_ISA_AVR6): Remove AVR_ISA_SPMX as it was actually + a duplicate of AVR_ISA_SPM. + +2011-07-01 Nick Clifton + + * avr.h (AVR_ISA_AVR6): Fix typo, adding AVR_ISA_SPMX. + +2011-06-18 Robin Getz + + * bfin.h (is_macmod_signed): New func + +2011-06-18 Mike Frysinger + + * bfin.h (is_macmod_pmove): Add missing space before func args. + (is_macmod_hmove): Likewise. + +2011-06-13 Walter Lee + + * tilegx.h: New file. + * tilepro.h: New file. + +2011-05-31 Paul Brook + + * arm.h (ARM_ARCH_V7R_IDIV): Define. + +2011-05-24 Andreas Krebbel + + * s390.h: Replace S390_OPERAND_REG_EVEN with + S390_OPERAND_REG_PAIR. + +2011-05-24 Andreas Krebbel + + * s390.h: Add S390_OPCODE_REG_EVEN flag. + +2011-04-18 Julian Brown + + * arm.h (ARM_AEXT_V7_ARM): Remove ARM_EXT_OS from bitmask. + +2011-04-11 Dan McDonald + + PR gas/12296 + * arm.h (ARM_AEXT_V7_ARM): Add ARM_EXT_OS. + +2011-03-22 Eric B. Weddington + + * avr.h (AVR_ISA_SPMX,AVR_ISA_DES,AVR_ISA_M256,AVR_ISA_XMEGA): + New instruction set flags. + (AVR_INSN): Add new instructions for SPM Z+, DES for XMEGA. + +2011-02-28 Maciej W. Rozycki + + * mips.h (M_PREF_AB): New enum value. + +2011-02-12 Mike Frysinger + + * bfin.h (M_S2RND, M_T, M_W32, M_FU, M_TFU, M_IS, M_ISS2, M_IH, + M_IU): Define. + (is_macmod_pmove, is_macmod_hmove): New functions. + +2011-02-11 Mike Frysinger + + * bfin.h: Add OPCODE_BFIN_H ifdef multiple include protection. + +2011-02-04 Bernd Schmidt + + * tic6x-opcode-table.h (cmtl, ll, sl): Available on C64XP. + * tic6x.h (TIC6X_INSN_ATOMIC): Remove. + +2010-12-31 John David Anglin + + PR gas/11395 + * hppa.h (pa_opcodes): Revert last change. Exchange 32 and 64-bit + "bb" entries. + +2010-12-26 John David Anglin + + PR gas/11395 + * hppa.h: Clear "d" bit in "add" and "sub" patterns. + +2010-12-18 Richard Sandiford + + * mips.h: Update commentary after last commit. + +2010-12-18 Mingjie Xing + + * mips.h (OP_*_OFFSET_A, OP_*_OFFSET_B, OP_*_OFFSET_C) + (OP_*_RZ, OP_*_FZ, INSN2_M_FP_D, INSN2_WRITE_GPR_Z, INSN2_WRITE_FPR_Z) + (INSN2_READ_GPR_Z, INSN2_READ_FPR_Z, INSN2_READ_GPR_D): Define. + +2010-11-25 Andreas Krebbel + + * s390.h (enum s390_opcode_cpu_val): Add S390_OPCODE_MAXCPU. + +2010-11-23 Richard Sandiford + + * mips.h: Fix previous commit. + +2010-11-23 Maciej W. Rozycki + + * mips.h (INSN_CHIP_MASK): Update according to INSN_LOONGSON_3A. + (INSN_LOONGSON_3A): Clear bit 31. + +2010-11-15 Matthew Gretton-Dann + + PR gas/12198 + * arm.h (ARM_AEXT_V6M_ONLY): New define. + (ARM_AEXT_V6M): Rewrite in terms of ARM_AEXT_V6M_ONLY. + (ARM_ARCH_V6M_ONLY): New define. + +2010-11-11 Mingming Sun + + * mips.h (INSN_LOONGSON_3A): Defined. + (CPU_LOONGSON_3A): Defined. + (OPCODE_IS_MEMBER): Add LOONGSON_3A. + +2010-10-09 Matt Rice + + * cgen.h (CGEN_ATTR, CGEN_ATTR_TYPE): Rename bool attribute to bool_. + (CGEN_ATTR_BOOLS, CGEN_ATTR_CGEN_INSN_ALIAS_VALUE): Likewise. + +2010-09-23 Matthew Gretton-Dann + + * arm.h (ARM_EXT_VIRT): New define. + (ARM_ARCH_V7A_IDIV_MP_SEC): Rename... + (ARM_ARCH_V7A_IDIV_MP_SEC_VIRT): ...to this and include Virtualization + Extensions. + +2010-09-23 Matthew Gretton-Dann + + * arm.h (ARM_AEXT_ADIV): New define. + (ARM_ARCH_V7A_IDIV_MP_SEC): Likewise. + +2010-09-23 Matthew Gretton-Dann + + * arm.h (ARM_EXT_OS): New define. + (ARM_AEXT_V6SM): Likewise. + (ARM_ARCH_V6SM): Likewise. + +2010-09-23 Matthew Gretton-Dann + + * arm.h (ARM_EXT_MP): Add. + (ARM_ARCH_V7A_MP): Likewise. + +2010-09-22 Mike Frysinger + + * bfin.h: Declare pseudoChr structs/defines. + +2010-09-21 Mike Frysinger + + * bfin.h: Strip trailing whitespace. + +2010-07-29 DJ Delorie + + * rx.h (RX_Operand_Type): Add TwoReg. + (RX_Opcode_ID): Remove ediv and ediv2. + +2010-07-27 DJ Delorie + + * rx.h (RX_Opcode_ID): Add nop2 and nop3 for statistics. + +2010-07-23 Naveen.H.S + Ina Pandit + + * v850.h: Define PROCESSOR_MASK, PROCESSOR_OPTION_EXTENSION, + PROCESSOR_OPTION_ALIAS, PROCESSOR_V850E2, PROCESSOR_V850E2V3 and + PROCESSOR_V850E2_ALL. + Remove PROCESSOR_V850EA support. + (v850_operand): Define V850_OPERAND_EP, V850_OPERAND_FLOAT_CC, + V850_OPERAND_VREG, V850E_IMMEDIATE16, V850E_IMMEDIATE16HI, + V850E_IMMEDIATE23, V850E_IMMEDIATE32, V850_OPERAND_SIGNED, + V850_OPERAND_DISP, V850_PCREL, V850_REG_EVEN, V850E_PUSH_POP, + V850_NOT_IMM0, V850_NOT_SA, V850_OPERAND_BANG and + V850_OPERAND_PERCENT. + Update V850_OPERAND_SRG, V850_OPERAND_CC, V850_OPERAND_RELAX and + V850_NOT_R0. + Remove V850_OPERAND_SIGNED, V850_OPERAND_EP, V850_OPERAND_DISP + and V850E_PUSH_POP + +2010-07-06 Maciej W. Rozycki + + * mips.h (MIPS16_INSN_UNCOND_BRANCH): New macro. + (MIPS16_INSN_BRANCH): Rename to... + (MIPS16_INSN_COND_BRANCH): ... this. + +2010-07-03 Alan Modra + + * ppc.h (PPC_OPCODE_32, PPC_OPCODE_BOOKE64, PPC_OPCODE_CLASSIC): Delete. + Renumber other PPC_OPCODE defines. + +2010-07-03 Alan Modra + + * ppc.h (PPC_OPCODE_COMMON): Expand comment. + +2010-06-29 Alan Modra + + * maxq.h: Delete file. + +2010-06-14 Sebastian Andrzej Siewior + + * ppc.h (PPC_OPCODE_E500): Define. + +2010-05-26 Catherine Moore + + * opcode/mips.h (INSN_MIPS16): Remove. + +2010-04-21 Joseph Myers + + * tic6x-insn-formats.h (s_branch): Correct typo in bitmask. + +2010-04-15 Nick Clifton + + * alpha.h: Update copyright notice to use GPLv3. + * arc.h: Likewise. + * arm.h: Likewise. + * avr.h: Likewise. + * bfin.h: Likewise. + * cgen.h: Likewise. + * convex.h: Likewise. + * cr16.h: Likewise. + * cris.h: Likewise. + * crx.h: Likewise. + * d10v.h: Likewise. + * d30v.h: Likewise. + * dlx.h: Likewise. + * h8300.h: Likewise. + * hppa.h: Likewise. + * i370.h: Likewise. + * i386.h: Likewise. + * i860.h: Likewise. + * i960.h: Likewise. + * ia64.h: Likewise. + * m68hc11.h: Likewise. + * m68k.h: Likewise. + * m88k.h: Likewise. + * maxq.h: Likewise. + * mips.h: Likewise. + * mmix.h: Likewise. + * mn10200.h: Likewise. + * mn10300.h: Likewise. + * msp430.h: Likewise. + * np1.h: Likewise. + * ns32k.h: Likewise. + * or32.h: Likewise. + * pdp11.h: Likewise. + * pj.h: Likewise. + * pn.h: Likewise. + * ppc.h: Likewise. + * pyr.h: Likewise. + * rx.h: Likewise. + * s390.h: Likewise. + * score-datadep.h: Likewise. + * score-inst.h: Likewise. + * sparc.h: Likewise. + * spu-insns.h: Likewise. + * spu.h: Likewise. + * tic30.h: Likewise. + * tic4x.h: Likewise. + * tic54x.h: Likewise. + * tic80.h: Likewise. + * v850.h: Likewise. + * vax.h: Likewise. + +2010-03-25 Joseph Myers + + * tic6x-control-registers.h, tic6x-insn-formats.h, + tic6x-opcode-table.h, tic6x.h: New. + +2010-02-25 Wu Zhangjin + + * mips.h: (LOONGSON2F_NOP_INSN): New macro. + +2010-02-08 Philipp Tomsich + + * opcode/ppc.h (PPC_OPCODE_TITAN): Define. + +2010-01-14 H.J. Lu + + * ia64.h (ia64_find_opcode): Remove argument name. + (ia64_find_next_opcode): Likewise. + (ia64_dis_opcode): Likewise. + (ia64_free_opcode): Likewise. + (ia64_find_dependency): Likewise. + +2009-11-22 Doug Evans + + * cgen.h: Include bfd_stdint.h. + (CGEN_INSN_LGSINT, CGEN_INSN_LGUINT): New types. + +2009-11-18 Paul Brook + + * arm.h (FPU_VFP_V4_SP_D16, FPU_ARCH_VFP_V4_SP_D16): Define. + +2009-11-17 Paul Brook + Daniel Jacobowitz + + * arm.h (ARM_EXT_V6_DSP): Define. + (ARM_AEXT_V6T2, ARM_AEXT_NOTM): Include ARM_EXT_V6_DSP. + (ARM_AEXT_V7EM, ARM_ARCH_V7EM): Define. + +2009-11-04 DJ Delorie + + * rx.h (rx_decode_opcode) (mvtipl): Add. + (mvtcp, mvfcp, opecp): Remove. + +2009-11-02 Paul Brook + + * arm.h (FPU_VFP_EXT_V3xD, FPU_VFP_EXT_FP16, FPU_NEON_EXT_FMA, + FPU_VFP_EXT_FMA, FPU_VFP_V3xD, FPU_VFP_V4D16, FPU_VFP_V4): Define. + (FPU_ARCH_VFP_V3D16_FP16, FPU_ARCH_VFP_V3_FP16, FPU_ARCH_VFP_V3xD, + FPU_ARCH_VFP_V3xD_FP16, FPU_ARCH_VFP_V4, FPU_ARCH_VFP_V4D16, + FPU_ARCH_NEON_VFP_V4): Define. + +2009-10-23 Doug Evans + + * cgen-bitset.h: Delete, moved to ../cgen/bitset.h. + * cgen.h: Update. Improve multi-inclusion macro name. + +2009-10-02 Peter Bergner + + * ppc.h (PPC_OPCODE_476): Define. + +2009-10-01 Peter Bergner + + * ppc.h (PPC_OPCODE_A2): Rename from PPC_OPCODE_PPCA2. + +2009-09-29 DJ Delorie + + * rx.h: New file. + +2009-09-22 Peter Bergner + + * ppc.h (ppc_cpu_t): Typedef to uint64_t. + +2009-09-21 Ben Elliston + + * ppc.h (PPC_OPCODE_PPCA2): New. + +2009-09-05 Martin Thuresson + + * ia64.h (struct ia64_operand): Renamed member class to op_class. + +2009-08-29 Martin Thuresson + + * tic30.h (template): Rename type template to + insn_template. Updated code to use new name. + * tic54x.h (template): Rename type template to + insn_template. + +2009-08-20 Nick Hudson + + * hppa.h (pa_opcodes): Add a pa10 bb without FLAG_STRICT. + +2009-06-11 Anthony Green + + * moxie.h (MOXIE_F3_PCREL): Define. + (moxie_form3_opc_info): Grow. + +2009-06-06 Anthony Green + + * moxie.h (MOXIE_F1_M): Define. + +2009-04-15 Anthony Green + + * moxie.h: Created. + +2009-04-06 DJ Delorie + + * h8300.h: Add relaxation attributes to MOVA opcodes. + +2009-03-10 Alan Modra + + * ppc.h (ppc_parse_cpu): Declare. + +2009-03-02 Qinwei + + * score-inst.h (score_insn_type, score_data_type): Add Ra_I9_I5 + and _IMM11 for mbitclr and mbitset. + * score-datadep.h: Update dependency information. + +2009-02-26 Peter Bergner + + * ppc.h (PPC_OPCODE_POWER7): New. + +2009-02-06 Doug Evans + + * i386.h: Add comment regarding sse* insns and prefixes. + +2009-02-03 Sandip Matte + + * mips.h (INSN_XLR): Define. + (INSN_CHIP_MASK): Update. + (CPU_XLR): Define. + (OPCODE_IS_MEMBER): Update. + (M_MSGSND, M_MSGLD, M_MSGLD_T, M_MSGWAIT, M_MSGWAIT_T): Define. + +2009-01-28 Doug Evans + + * opcode/i386.h: Add multiple inclusion protection. + (EAX_REG_NUM,ECX_REG_NUM,EDX_REGNUM,EBX_REG_NUM,ESI_REG_NUM) + (EDI_REG_NUM): New macros. + (MODRM_MOD_FIELD,MODRM_REG_FIELD,MODRM_RM_FIELD): New macros. + (SIB_SCALE_FIELD,SIB_INDEX_FIELD,SIB_BASE_FIELD): New macros. + (REX_PREFIX_P): New macro. + +2009-01-09 Peter Bergner + + * ppc.h (struct powerpc_opcode): New field "deprecated". + (PPC_OPCODE_NOPOWER4): Delete. + +2008-11-28 Joshua Kinard + + * mips.h: Define CPU_R14000, CPU_R16000. + (OPCODE_IS_MEMBER): Include R14000, R16000 in test. + +2008-11-18 Catherine Moore + + * arm.h (FPU_NEON_FP16): New. + (FPU_ARCH_NEON_FP16): New. + +2008-11-06 Chao-ying Fu + + * mips.h: Doucument '1' for 5-bit sync type. + +2008-08-28 H.J. Lu + + * ia64.h (ia64_resource_specifier): Add IA64_RS_CR_IIB. Update + IA64_RS_CR. + +2008-08-01 Peter Bergner + + * ppc.h (PPC_OPCODE_VSX, PPC_OPERAND_VSR): New. + +2008-07-30 Michael J. Eager + + * ppc.h (PPC_OPCODE_405): Define. + (PPC_OPERAND_FSL, PPC_OPERAND_FCR, PPC_OPERAND_UDI): Define. + +2008-06-13 Peter Bergner + + * ppc.h (ppc_cpu_t): New typedef. + (struct powerpc_opcode ): Use it. + (struct powerpc_operand ): Likewise. + (struct powerpc_macro ): Likewise. + +2008-06-12 Adam Nemet + + * mips.h: Document new field descriptors +x, +X, +p, +P, +s, +S. + Update comment before MIPS16 field descriptors to mention MIPS16. + (OP_SH_BBITIND, OP_MASK_BBITIND): New bit mask and shift count for + BBIT. + (OP_SH_CINSPOS, OP_MASK_CINSPOS, OP_SH_CINSLM1, OP_MASK_CINSLM1): + New bit masks and shift counts for cins and exts. + + * mips.h: Document new field descriptors +Q. + (OP_SH_SEQI, OP_MASK_SEQI): New bit mask and shift count for SEQI. + +2008-04-28 Adam Nemet + + * mips.h (INSN_MACRO): Move it up to the pinfo macros. + (INSN2_M_FP_S, INSN2_M_FP_D): New pinfo2 macros. + +2008-04-14 Edmar Wienskoski + + * ppc.h: (PPC_OPCODE_E500MC): New. + +2008-04-03 H.J. Lu + + * i386.h (MAX_OPERANDS): Set to 5. + (MAX_MNEM_SIZE): Changed to 20. + +2008-03-28 Eric B. Weddington + + * avr.h (AVR_ISA_TINY3): Define new opcode set for attiny167. + +2008-03-09 Paul Brook + + * arm.h (FPU_VFP_EXT_D32, FPU_VFP_V3D16, FPU_ARCH_VFP_V3D16): Define. + +2008-03-04 Paul Brook + + * arm.h (ARM_EXT_V6M, ARM_EXT_BARRIER, ARM_EXT_THUMB_MSR): Define. + (ARM_AEXT_V6T2, ARM_AEXT_V7_ARM, ARM_AEXT_V7M): Use new flags. + (ARM_AEXT_V6M, ARM_ARCH_V6M): Define. + +2008-02-27 Denis Vlasenko + Nick Clifton + + PR 3134 + * h8300.h (h8_opcodes): Add an encoding for a mov.l instruction + with a 32-bit displacement but without the top bit of the 4th byte + set. + +2008-02-18 M R Swami Reddy + + * cr16.h (cr16_num_optab): Declared. + +2008-02-14 Hakan Ardo + + PR gas/2626 + * avr.h (AVR_ISA_2xxe): Define. + +2008-02-04 Adam Nemet + + * mips.h: Update copyright. + (INSN_CHIP_MASK): New macro. + (INSN_OCTEON): New macro. + (CPU_OCTEON): New macro. + (OPCODE_IS_MEMBER): Handle Octeon instructions. + +2008-01-23 Eric B. Weddington + + * avr.h (AVR_ISA_RF401): Add new opcode set for at86rf401. + +2008-01-03 Eric B. Weddington + + * avr.h (AVR_ISA_USB162): Add new opcode set. + (AVR_ISA_AVR3): Likewise. + +2007-11-29 Mark Shinwell + + * mips.h (INSN_LOONGSON_2E): New. + (INSN_LOONGSON_2F): New. + (CPU_LOONGSON_2E): New. + (CPU_LOONGSON_2F): New. + (OPCODE_IS_MEMBER): Update for Loongson-2E and -2F flags. + +2007-11-29 Mark Shinwell + + * mips.h (INSN_ISA*): Redefine certain values as an + enumeration. Update comments. + (mips_isa_table): New. + (ISA_MIPS*): Redefine to match enumeration. + (OPCODE_IS_MEMBER): Modify to correctly test new INSN_ISA* + values. + +2007-08-08 Ben Elliston + + * ppc.h (PPC_OPCODE_PPCPS): New. + +2007-07-03 Nathan Sidwell + + * m68k.h: Document j K & E. + +2007-06-29 M R Swami Reddy + + * cr16.h: New file for CR16 target. + +2007-05-02 Alan Modra + + * ppc.h (PPC_OPERAND_PLUS1): Update comment. + +2007-04-23 Nathan Sidwell + + * m68k.h (mcfisa_c): New. + (mcfusp, mcf_mask): Adjust. + +2007-04-20 Alan Modra + + * ppc.h (struct powerpc_operand): Replace "bits" with "bitm". + (num_powerpc_operands): Declare. + (PPC_OPERAND_SIGNED et al): Redefine as hex. + (PPC_OPERAND_PLUS1): Define. + +2007-03-21 H.J. Lu + + * i386.h (REX_MODE64): Renamed to ... + (REX_W): This. + (REX_EXTX): Renamed to ... + (REX_R): This. + (REX_EXTY): Renamed to ... + (REX_X): This. + (REX_EXTZ): Renamed to ... + (REX_B): This. + +2007-03-15 H.J. Lu + + * i386.h: Add entries from config/tc-i386.h and move tables + to opcodes/i386-opc.h. + +2007-03-13 H.J. Lu + + * i386.h (FloatDR): Removed. + (i386_optab): Use FloatD and FloatD|FloatR instead of FloatDR. + +2007-03-01 Alan Modra + + * spu-insns.h: Add soma double-float insns. + +2007-02-20 Thiemo Seufer + Chao-Ying Fu + + * mips.h (OP_SH_BP, OP_MASK_BP): Add support for balign instruction. + (INSN_DSPR2): Add flag for DSP R2 instructions. + (M_BALIGN): New macro. + +2007-02-14 Alan Modra + + * i386.h (i386_optab): Replace all occurrences of Seg2ShortForm + and Seg3ShortFrom with Shortform. + +2007-02-11 H.J. Lu + + PR gas/4027 + * i386.h (i386_optab): Put the real "test" before the pseudo + one. + +2007-01-08 Kazu Hirata + + * m68k.h (m68010up): OR fido_a. + +2006-12-25 Kazu Hirata + + * m68k.h (fido_a): New. + +2006-12-24 Kazu Hirata + + * m68k.h (mcfmac, mcfemac, cfloat, mcfhwdiv, mcfisa_a, + mcfisa_aa, mcfisa_b, mcfusp, mcf_mask): Double the defined + values. + +2006-11-08 H.J. Lu + + * i386.h (i386_optab): Replace CpuPNI with CpuSSE3. + +2006-10-31 Mei Ligang + + * score-inst.h (enum score_insn_type): Add Insn_internal. + +2006-10-25 Trevor Smigiel + Yukishige Shibata + Nobuhisa Fujinami + Takeaki Fukuoka + Alan Modra + + * spu-insns.h: New file. + * spu.h: New file. + +2006-10-24 Andrew Pinski + + * ppc.h (PPC_OPCODE_CELL): Define. + +2006-10-23 Dwarakanath Rajagopal + + * i386.h : Modify opcode to support for the change in POPCNT opcode + in amdfam10 architecture. + +2006-09-28 H.J. Lu + + * i386.h: Replace CpuMNI with CpuSSSE3. + +2006-09-26 Mark Shinwell + Joseph Myers + Ian Lance Taylor + Ben Elliston + + * arm.h (ARM_CEXT_IWMMXT2, ARM_ARCH_IWMMXT2): Define. + +2006-09-17 Mei Ligang + + * score-datadep.h: New file. + * score-inst.h: New file. + +2006-07-14 H.J. Lu + + * i386.h (i386_optab): Remove InvMem from maskmovq, movhlps, + movlhps, movmskps, pextrw, pmovmskb, movmskpd, maskmovdqu, + movdq2q and movq2dq. + +2006-07-10 Dwarakanath Rajagopal + Michael Meissner + + * i386.h: Add amdfam10 new instructions (SSE4a and ABM instructions). + +2006-06-12 H.J. Lu + + * i386.h (i386_optab): Add "nop" with memory reference. + +2006-06-12 H.J. Lu + + * i386.h (i386_optab): Update comment for 64bit NOP. + +2006-06-06 Ben Elliston + Anton Blanchard + + * ppc.h (PPC_OPCODE_POWER6): Define. + Adjust whitespace. + +2006-06-05 Thiemo Seufer + + * mips.h: Improve description of MT flags. + +2006-05-25 Richard Sandiford + + * m68k.h (mcf_mask): Define. + +2006-05-05 Thiemo Seufer + David Ung + + * mips.h (enum): Add macro M_CACHE_AB. + +2006-05-04 Thiemo Seufer + Nigel Stephens + David Ung + + * mips.h: Add INSN_SMARTMIPS define. + +2006-04-30 Thiemo Seufer + David Ung + + * mips.h: Defines udi bits and masks. Add description of + characters which may appear in the args field of udi + instructions. + +2006-04-26 Thiemo Seufer + + * mips.h: Improve comments describing the bitfield instruction + fields. + +2006-04-26 Julian Brown + + * arm.h (FPU_VFP_EXT_V3): Define constant. + (FPU_NEON_EXT_V1): Likewise. + (FPU_VFP_HARD): Update. + (FPU_VFP_V3): Define macro. + (FPU_ARCH_VFP_V3, FPU_ARCH_VFP_V3_PLUS_NEON_V1): Define macros. + +2006-04-07 Joerg Wunsch + + * avr.h (AVR_ISA_PWMx): New. + +2006-03-28 Nathan Sidwell + + * m68k.h (cpu_m68k, cpu_cf, cpu_m68000, cpu_m68008, cpu_m68010, + cpu_m68020, cpu_m68ec030, cpu_m68040, cpu_m68060, cpu_m68851, + cpu_m68881, cpu_m68882, cpu_cpu32, cpu_cf5200, cpu_cf5206e, + cpu_cf5208, cpu_cf521x, cpu_cf5213, cpu_cf5249, cpu_cf528x, + cpu_cf5307, cpu_cf5329, cpu_cf5407, cpu_cf547x, cpu_cf548x): Remove. + +2006-03-10 Paul Brook + + * arm.h (ARM_AEXT_V7_ARM): Include v6ZK extensions. + +2006-03-04 John David Anglin + + * hppa.h (pa_opcodes): Reorder bb opcodes so that pa10 opcodes come + first. Correct mask of bb "B" opcode. + +2006-02-27 H.J. Lu + + * i386.h (i386_optab): Support Intel Merom New Instructions. + +2006-02-24 Paul Brook + + * arm.h: Add V7 feature bits. + +2006-02-23 H.J. Lu + + * ia64.h (ia64_opnd): Add IA64_OPND_IMMU5b. + +2006-01-31 Paul Brook + Richard Earnshaw + + * arm.h: Use ARM_CPU_FEATURE. + (ARM_AEXT_*, FPU_ENDIAN_PURE, FPU_VFP_HARD): New. + (arm_feature_set): Change to a structure. + (ARM_CPU_HAS_FEATURE, ARM_MERGE_FEATURE_SETS, ARM_CLEAR_FEATURE, + ARM_FEATURE): New macros. + +2005-12-07 Hans-Peter Nilsson + + * cris.h (MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS) + (MOVE_PC_INCR_OPCODE_PREFIX, MOVE_PC_INCR_OPCODE_SUFFIX): New macros. + (ADD_PC_INCR_OPCODE): Don't define. + +2005-12-06 H.J. Lu + + PR gas/1874 + * i386.h (i386_optab): Add 64bit support for monitor and mwait. + +2005-11-14 David Ung + + * mips.h: Assign 'm'/'M' codes to MIPS16e save/restore + instructions. Define MIPS16_ALL_ARGS and MIPS16_ALL_STATICS for + save/restore encoding of the args field. + +2005-10-28 Dave Brolley + + Contribute the following changes: + 2005-02-16 Dave Brolley + + * cgen-bitset.h: Rename CGEN_ISA_MASK to CGEN_BITSET. Rename + cgen_isa_mask_* to cgen_bitset_*. + * cgen.h: Likewise. + + 2003-10-21 Richard Sandiford + + * cgen.h (CGEN_BITSET_ATTR_VALUE): Fix definition. + (CGEN_ATTR_ENTRY): Change "value" to type "unsigned". + (CGEN_CPU_TABLE): Make isas a ponter. + + 2003-09-29 Dave Brolley + + * cgen.h (CGEN_ATTR_VALUE_BITSET_TYPE): New typedef. + (CGEN_ATTR_VALUE_ENUM_TYPE): Ditto. + (CGEN_ATTR_VALUE_TYPE): Use these new typedefs. + + 2002-12-13 Dave Brolley + + * cgen.h (symcat.h): #include it. + (cgen-bitset.h): #include it. + (CGEN_ATTR_VALUE_TYPE): Now a union. + (CGEN_ATTR_VALUE): Reference macros generated in opcodes/-desc.h. + (CGEN_ATTR_ENTRY): 'value' now unsigned. + (cgen_cpu_desc): 'isas' now (CGEN_ISA_MASK*). + * cgen-bitset.h: New file. + +2005-09-30 Catherine Moore + + * bfin.h: New file. + +2005-10-24 Jan Beulich + + * ia64.h (enum ia64_opnd): Move memory operand out of set of + indirect operands. + +2005-10-16 John David Anglin + + * hppa.h (pa_opcodes): Add two fcmp opcodes. Reorder ftest opcodes. + Add FLAG_STRICT to pa10 ftest opcode. + +2005-10-12 John David Anglin + + * hppa.h (pa_opcodes): Remove lha entries. + +2005-10-08 John David Anglin + + * hppa.h (FLAG_STRICT): Revise comment. + (pa_opcode): Revise ordering rules. Add/move strict pa10 variants + before corresponding pa11 opcodes. Add strict pa10 register-immediate + entries for "fdc". + +2005-09-30 Catherine Moore + + * bfin.h: New file. + +2005-09-24 John David Anglin + + * hppa.h (pa_opcodes): Add new "fdc" and "fic" opcode entries. + +2005-09-06 Chao-ying Fu + + * mips.h (OP_SH_MT_U, OP_MASK_MT_U, OP_SH_MT_H, OP_MASK_MT_H, + OP_SH_MTACC_T, OP_MASK_MTACC_T, OP_SH_MTACC_D, OP_MASK_MTACC_D): New + define. + Document !, $, *, &, g, +t, +T operand formats for MT instructions. + (INSN_ASE_MASK): Update to include INSN_MT. + (INSN_MT): New define for MT ASE. + +2005-08-25 Chao-ying Fu + + * mips.h (OP_SH_DSPACC, OP_MASK_DSPACC, OP_SH_DSPACC_S, + OP_MASK_DSPACC_S, OP_SH_DSPSFT, OP_MASK_DSPSFT, OP_SH_DSPSFT_7, + OP_MASK_DSPSFT_7, OP_SH_SA3, OP_MASK_SA3, OP_SH_SA4, OP_MASK_SA4, + OP_SH_IMM8, OP_MASK_IMM8, OP_SH_IMM10, OP_MASK_IMM10, OP_SH_WRDSP, + OP_MASK_WRDSP, OP_SH_RDDSP, OP_MASK_RDDSP): New define. + Document 3, 4, 5, 6, 7, 8, 9, 0, :, ', @ operand formats for DSP + instructions. + (INSN_DSP): New define for DSP ASE. + +2005-08-18 Alan Modra + + * a29k.h: Delete. + +2005-08-15 Daniel Jacobowitz + + * ppc.h (PPC_OPCODE_E300): Define. + +2005-08-12 Martin Schwidefsky + + * s390.h (s390_opcode_cpu_val): Add enum for cpu type z9-109. + +2005-07-28 John David Anglin + + PR gas/336 + * hppa.h (pa_opcodes): Allow 0 immediates in PA 2.0 variants of pdtlb + and pitlb. + +2005-07-27 Jan Beulich + + * i386.h (i386_optab): Add comment to movd. Use LongMem for all + movd-s. Add NoRex64 to movq-s dealing only with mmx or xmm registers. + Add movq-s as 64-bit variants of movd-s. + +2005-07-18 John David Anglin + + * hppa.h: Fix punctuation in comment. + + * hppa.h (pa_opcode): Add rules for opcode ordering. Check first for + implicit space-register addressing. Set space-register bits on opcodes + using implicit space-register addressing. Add various missing pa20 + long-immediate opcodes. Remove various opcodes using implicit 3-bit + space-register addressing. Use "fE" instead of "fe" in various + fstw opcodes. + +2005-07-18 Jan Beulich + + * i386.h (i386_optab): Operands of aam and aad are unsigned. + +2007-07-15 H.J. Lu + + * i386.h (i386_optab): Support Intel VMX Instructions. + +2005-07-10 John David Anglin + + * hppa.h (pa_opcode): Don't set FLAG_STRICT in pa10 loads and stores. + +2005-07-05 Jan Beulich + + * i386.h (i386_optab): Add new insns. + +2005-07-01 Nick Clifton + + * sparc.h: Add typedefs to structure declarations. + +2005-06-20 H.J. Lu + + PR 1013 + * i386.h (i386_optab): Update comments for 64bit addressing on + mov. Allow 64bit addressing for mov and movq. + +2005-06-11 John David Anglin + + * hppa.h (pa_opcodes): Use cM and cX instead of cm and cx, + respectively, in various floating-point load and store patterns. + +2005-05-23 John David Anglin + + * hppa.h (FLAG_STRICT): Correct comment. + (pa_opcodes): Update load and store entries to allow both PA 1.X and + PA 2.0 mneumonics when equivalent. Entries with cache control + completers now require PA 1.1. Adjust whitespace. + +2005-05-19 Anton Blanchard + + * ppc.h (PPC_OPCODE_POWER5): Define. + +2005-05-10 Nick Clifton + + * Update the address and phone number of the FSF organization in + the GPL notices in the following files: + a29k.h, alpha.h, arc.h, arm.h, avr.h, cgen.h, convex.h, cris.h, + crx.h, d10v.h, d30v.h, dlx.h, h8300.h, hppa.h, i370.h, i386.h, + i860.h, i960.h, m68hc11.h, m68k.h, m88k.h, maxq.h, mips.h, mmix.h, + mn10200.h, mn10300.h, msp430.h, np1.h, ns32k.h, or32.h, pdp11.h, + pj.h, pn.h, ppc.h, pyr.h, s390.h, sparc.h, tic30.h, tic4x.h, + tic54x.h, tic80.h, v850.h, vax.h + +2005-05-09 Jan Beulich + + * i386.h (i386_optab): Add ht and hnt. + +2005-04-18 Mark Kettenis + + * i386.h: Insert hyphens into selected VIA PadLock extensions. + Add xcrypt-ctr. Provide aliases without hyphens. + +2005-04-13 H.J. Lu + + Moved from ../ChangeLog + + 2005-04-12 Paul Brook + * m88k.h: Rename psr macros to avoid conflicts. + + 2005-03-12 Zack Weinberg + * arm.h: Adjust comments for ARM_EXT_V4T and ARM_EXT_V5T. + Add ARM_EXT_V6T2, ARM_ARCH_V6T2, ARM_ARCH_V6KT2, ARM_ARCH_V6ZT2, + and ARM_ARCH_V6ZKT2. + + 2004-11-29 Tomer Levi + * crx.h (enum operand_type): Rename rbase_cst4 to rbase_dispu4. + Remove redundant instruction types. + (struct argument): X_op - new field. + (struct cst4_entry): Remove. + (no_op_insn): Declare. + + 2004-11-05 Tomer Levi + * crx.h (enum argtype): Rename types, remove unused types. + + 2004-10-27 Tomer Levi + * crx.h (enum reg): Rearrange registers, remove 'ccfg' and `'pc'. + (enum reg_type): Remove CRX_PC_REGTYPE, CRX_MTPR_REGTYPE. + (enum operand_type): Rearrange operands, edit comments. + replace us with ui for unsigned immediate. + replace d with disps/dispu/dispe for signed/unsigned/escaped + displacements (respectively). + replace rbase_ridx_scl2_dispu with rindex_disps for register index. + (instruction type): Add NO_TYPE_INS. + (instruction flags): Add USER_REG, CST4MAP, NO_SP, NO_RPTR. + (operand_entry): New field - 'flags'. + (operand flags): New. + + 2004-10-21 Tomer Levi + * crx.h (operand_type): Remove redundant types i3, i4, + i5, i8, i12. + Add new unsigned immediate types us3, us4, us5, us16. + +2005-04-12 Mark Kettenis + + * i386.h (i386_optab): Mark VIA PadLock instructions as ImmExt and + adjust them accordingly. + +2005-04-01 Jan Beulich + + * i386.h (i386_optab): Add rdtscp. + +2005-03-29 H.J. Lu + + * i386.h (i386_optab): Don't allow the `l' suffix for moving + between memory and segment register. Allow movq for moving between + general-purpose register and segment register. + +2005-02-09 Jan Beulich + + PR gas/707 + * i386.h (i386_optab): Add x_Suf to fbld and fbstp. Add w_Suf and + FloatMF to fldcw, fstcw, fnstcw, and the memory formas of fstsw and + fnstsw. + +2006-02-07 Nathan Sidwell + + * m68k.h (m68008, m68ec030, m68882): Remove. + (m68k_mask): New. + (cpu_m68k, cpu_cf): New. + (mcf5200, mcf5206e, mcf521x, mcf5249, mcf528x, mcf5307, mcf5407, + mcf5470, mcf5480): Rename to cpu_. Add m680x0 variants. + +2005-01-25 Alexandre Oliva + + 2004-11-10 Alexandre Oliva + * cgen.h (enum cgen_parse_operand_type): Add + CGEN_PARSE_OPERAND_SYMBOLIC. + +2005-01-21 Fred Fish + + * mips.h: Change INSN_ALIAS to INSN2_ALIAS. + Change INSN_WRITE_MDMX_ACC to INSN2_WRITE_MDMX_ACC. + Change INSN_READ_MDMX_ACC to INSN2_READ_MDMX_ACC. + +2005-01-19 Fred Fish + + * mips.h (struct mips_opcode): Add new pinfo2 member. + (INSN_ALIAS): New define for opcode table entries that are + specific instances of another entry, such as 'move' for an 'or' + with a zero operand. + (INSN_READ_MDMX_ACC): Redefine from 0 to 0x2. + (INSN_WRITE_MDMX_ACC): Redefine from 0 to 0x4. + +2004-12-09 Ian Lance Taylor + + * mips.h (CPU_RM9000): Define. + (OPCODE_IS_MEMBER): Handle CPU_RM9000. + +2004-11-25 Jan Beulich + + * i386.h: CpuNo64 mov can't reasonably have a 'q' suffix. Moves + to/from test registers are illegal in 64-bit mode. Add missing + NoRex64 to sidt. fxsave/fxrstor now allow for a 'q' suffix + (previously one had to explicitly encode a rex64 prefix). Re-enable + lahf/sahf in 64-bit mode as at least some Athlon64/Opteron steppings + support it there. Add cmpxchg16b as per Intel's 64-bit documentation. + +2004-11-23 Jan Beulich + + * i386.h (i386_optab): paddq and psubq, even in their MMX form, are + available only with SSE2. Change the MMX additions introduced by SSE + and 3DNow!A to CpuMMX2 (rather than CpuMMX). Indicate the 3DNow!A + instructions by their now designated identifier (since combining i686 + and 3DNow! does not really imply 3DNow!A). + +2004-11-19 Alan Modra + + * msp430.h (struct rcodes_s, MSP430_RLC, msp430_rcodes, + struct hcodes_s, msp430_hcodes): Move to gas/config/tc-msp430.c. + +2004-11-08 Inderpreet Singh + Vineet Sharma + + * maxq.h: New file: Disassembly information for the maxq port. + +2004-11-05 H.J. Lu + + * i386.h (i386_optab): Put back "movzb". + +2004-11-04 Hans-Peter Nilsson + + * cris.h (enum cris_insn_version_usage): Tweak formatting and + comments. Remove member cris_ver_sim. Add members + cris_ver_sim_v0_10, cris_ver_v0_10, cris_ver_v3_10, + cris_ver_v8_10, cris_ver_v10, cris_ver_v10p. + (struct cris_support_reg, struct cris_cond15): New types. + (cris_conds15): Declare. + (JUMP_PC_INCR_OPCODE_V32, BA_DWORD_OPCODE, NOP_OPCODE_COMMON) + (NOP_OPCODE_ZBITS_COMMON, LAPC_DWORD_OPCODE, LAPC_DWORD_Z_BITS) + (NOP_OPCODE_V32, NOP_Z_BITS_V32): New macros. + (NOP_Z_BITS): Define in terms of NOP_OPCODE. + (cris_imm_oprnd_size_type): New members SIZE_FIELD_SIGNED and + SIZE_FIELD_UNSIGNED. + +2004-11-04 Jan Beulich + + * i386.h (sldx_Suf): Remove. + (FP, l_FP, sl_FP, x_FP): Don't imply IgnoreSize. + (q_FP): Define, implying no REX64. + (x_FP, sl_FP): Imply FloatMF. + (i386_optab): Split reg and mem forms of moving from segment registers + so that the memory forms can ignore the 16-/32-bit operand size + distinction. Adjust a few others for Intel mode. Remove *FP uses from + all non-floating-point instructions. Unite 32- and 64-bit forms of + movsx, movzx, and movd. Adjust floating point operations for the above + changes to the *FP macros. Add DefaultSize to floating point control + insns operating on larger memory ranges. Remove left over comments + hinting at certain insns being Intel-syntax ones where the ones + actually meant are already gone. + +2004-10-07 Tomer Levi + + * crx.h: Add COPS_REG_INS - Coprocessor Special register + instruction type. + +2004-09-30 Paul Brook + + * arm.h (ARM_EXT_V6K, ARM_EXT_V6Z): Define. + (ARM_ARCH_V6K, ARM_ARCH_V6Z, ARM_ARCH_V6ZK): Define. + +2004-09-11 Theodore A. Roth + + * avr.h: Add support for + atmega48, atmega88, atmega168, attiny13, attiny2313, at90can128. + +2004-09-09 Segher Boessenkool + + * ppc.h (PPC_OPERAND_OPTIONAL): Fix comment. + +2004-08-24 Dmitry Diky + + * msp430.h (msp430_opc): Add new instructions. + (msp430_rcodes): Declare new instructions. + (msp430_hcodes): Likewise.. + +2004-08-13 Nick Clifton + + PR/301 + * h8300.h (O_JSR): Do not allow VECIND addressing for non-SX + processors. + +2004-08-30 Michal Ludvig + + * i386.h (i386_optab): Added montmul/xsha1/xsha256 insns. + +2004-07-22 H.J. Lu + + * i386.h (i386_optab): Allow cs/ds in 64bit for branch hints. + +2004-07-21 Jan Beulich + + * i386.h: Adjust instruction descriptions to better match the + specification. + +2004-07-16 Richard Earnshaw + + * arm.h: Remove all old content. Replace with architecture defines + from gas/config/tc-arm.c. + +2004-07-09 Andreas Schwab + + * m68k.h: Fix comment. + +2004-07-07 Tomer Levi + + * crx.h: New file. + +2004-06-24 Alan Modra + + * i386.h (i386_optab): Remove fildd, fistpd and fisttpd. + +2004-05-24 Peter Barada + + * m68k.h: Add 'size' to m68k_opcode. + +2004-05-05 Peter Barada + + * m68k.h: Switch from ColdFire chip name to core variant. + +2004-04-22 Peter Barada + + * m68k.h: Add mcfmac/mcfemac definitions. Update operand + descriptions for new EMAC cases. + Remove ColdFire macmw/macml/msacmw/msacmw hacks and properly + handle Motorola MAC syntax. + Allow disassembly of ColdFire V4e object files. + +2004-03-16 Alan Modra + + * ppc.h (PPC_OPERAND_GPR_0): Define. Bump other operand defines. + +2004-03-12 Jakub Jelinek + + * i386.h (i386_optab): Remove CpuNo64 from sysenter and sysexit. + +2004-03-12 Michal Ludvig + + * i386.h (i386_optab): Added xstore as an alias for xstorerng. + +2004-03-12 Michal Ludvig + + * i386.h (i386_optab): Added xstore/xcrypt insns. + +2004-02-09 Anil Paranjpe + + * h8300.h (32bit ldc/stc): Add relaxing support. + +2004-01-12 Anil Paranjpe + + * h8300.h (BITOP): Pass MEMRELAX flag. + +2004-01-09 Anil Paranjpe + + * h8300.h (BITOP): Dissallow operations on @aa:16 and @aa:32 + except for the H8S. + +For older changes see ChangeLog-9103 + +Copyright (C) 2004-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/opcode/ChangeLog-9103 b/include/opcode/ChangeLog-9103 new file mode 100644 index 0000000..b56e7d5 --- /dev/null +++ b/include/opcode/ChangeLog-9103 @@ -0,0 +1,3131 @@ +2005-04-13 H.J. Lu + + 2003-11-18 Maciej W. Rozycki + * mips.h: Define new enum members, M_LCA_AB and M_DLCA_AB. + + 2003-04-04 Svein E. Seldal + * tic4x.h: Namespace cleanup. Replace s/c4x/tic4x + + 2002-11-16 Klee Dienes + * m88k.h (INSTAB): Remove 'next' field. + (instruction): Remove definition; replace with extern declaration + and mark as const. + + 2002-08-28 Michael Hayes + * tic4x.h: New file. + + 2002-07-25 Richard Sandiford + * mips.h (CPU_R2000): Remove. + +2003-10-21 Peter Barada + Bernardo Innocenti + + * m68k.h: Add MCFv4/MCF5528x support. + +2003-10-19 Hans-Peter Nilsson + + * mmix.h (JMP_INSN_BYTE): Define. + +2003-09-30 Chris Demetriou + + * mips.h: Document +E, +F, +G, +H, and +I operand types. + Update documentation of I, +B and +C operand types. + (INSN_ISA64R2, ISA_MIPS64R2, CPU_MIPS64R2): New defines. + (M_DEXT, M_DINS): New enum values. + +2003-09-04 Nick Clifton + + * v850.h (PROCESSOR_V850E1): Define. + +2003-08-19 Alan Modra + + * ppc.h (PPC_OPCODE_440): Define. Formatting. Use hex for other + PPC_OPCODE_* defines. + +2003-08-16 Jason Eckhardt + + * i860.h (fmov.ds): Expand as famov.ds. + (fmov.sd): Expand as famov.sd. + (pfmov.ds): Expand as pfamov.ds. + +2003-08-07 Michael Meissner + + * cgen.h: Remove PARAM macro usage in all prototypes. + (CGEN_EXTRACT_INFO): Use void * instead of PTR. + (cgen_print_fn): Ditto. + (CGEN_HW_ENTRY): Ditto. + (CGEN_MAYBE_MULTI_IFLD): Ditto. + (struct cgen_insn): Ditto. + (CGEN_CPU_TABLE): Ditto. + +2003-08-07 Alan Modra + + * alpha.h: Remove PARAMS macro. + * arc.h: Likewise. + * d10v.h: Likewise. + * d30v.h: Likewise. + * i370.h: Likewise. + * or32.h: Likewise. + * pj.h: Likewise. + * ppc.h: Likewise. + * sparc.h: Likewise. + * tic80.h: Likewise. + * v850.h: Likewise. + +2003-07-18 Michael Snyder + + * include/opcode/h8sx.h (DO_MOVA1, DO_MOVA2): Reformatting. + +2003-07-15 Richard Sandiford + + * mips.h (CPU_RM7000): New macro. + (OPCODE_IS_MEMBER): Match CPU_RM7000 against 4650 insns. + +2003-07-09 Alexandre Oliva + + 2000-04-01 Alexandre Oliva + * mn10300.h (AM33_2): Renamed from AM33. + 2000-03-31 Alexandre Oliva + * mn10300.h (AM332, FMT_D3): Defined. + (MN10300_OPERAND_FSREG, MN10300_OPERAND_FDREG): Likewise. + (MN10300_OPERAND_FPCR): Likewise. + +2003-07-01 Martin Schwidefsky + + * s390.h (s390_opcode_cpu_val): Add enum for cpu type z990. + +2003-06-25 Richard Sandiford + + * h8300.h (IMM2_NS, IMM8_NS, IMM16_NS): Remove. + (IMM8U, IMM8U_NS): Define. + (h8_opcodes): Use IMM8U_NS for mov.[wl] #xx:8,@yy. + +2003-06-25 Richard Sandiford + + * h8300.h (h8_opcodes): Fix the mov.l @(dd:32,ERs),ERd and + mov.l ERs,@(dd:32,ERd) entries. + +2003-06-23 H.J. Lu + + * i386.h (i386_optab): Support Intel Precott New Instructions. + +2003-06-10 Gary Hade + + * ppc.h (PPC_OPERAND_DQ): Define. + +2003-06-10 Richard Sandiford + + * h8300.h (IMM4_NS, IMM8_NS): New. + (h8_opcodes): Replace IMM4 with IMM4_NS in mov.b and mov.w entries. + Likewise IMM8 for mov.w and mov.l. Likewise IMM16U for mov.l. + +2003-06-03 Michael Snyder + + * h8300.h (enum h8_model): Add AV_H8S to distinguish from H8H. + (ldc): Split ccr ops from exr ops (which are only available + on H8S or H8SX). + (stc): Ditto. + (andc, orc, xorc): Ditto. + (ldmac, stmac, clrmac, mac): Change access to AV_H8S. + +2003-06-03 Michael Snyder + and Bernd Schmidt + and Alexandre Oliva + * h8300.h: Add support for h8300sx instruction set. + +2003-05-23 Jason Eckhardt + + * i860.h (expand_type): Add XP_ONLY. + (scyc.b): New XP instruction. + (ldio.l): Likewise. + (ldio.s): Likewise. + (ldio.b): Likewise. + (ldint.l): Likewise. + (ldint.s): Likewise. + (ldint.b): Likewise. + (stio.l): Likewise. + (stio.s): Likewise. + (stio.b): Likewise. + (pfld.q): Likewise. + +2003-05-20 Jason Eckhardt + + * i860.h (flush): Set lower 3 bits properly and use 'L' + for the immediate operand type instead of 'i'. + +2003-05-20 Jason Eckhardt + + * i860.h (fzchks): Both S and R bits must be set. + (pfzchks): Likewise. + (faddp): Likewise. + (pfaddp): Likewise. + (fix.ss): Remove (invalid instruction). + (pfix.ss): Likewise. + (ftrunc.ss): Likewise. + (pftrunc.ss): Likewise. + +2003-05-18 Jason Eckhardt + + * i860.h (form, pform): Add missing .dd suffix. + +2003-05-13 Stephane Carrez + + * m68hc11.h (M68HC12_BANK_VIRT): Define to 0x010000 + +2003-04-07 Michael Snyder + + * h8300.h (ldc/stc): Fix up src/dst swaps. + +2003-04-09 J. Grant + + * mips.h: Correct comment typo. + +2003-03-21 Martin Schwidefsky + + * s390.h (s390_opcode_arch_val): Rename to s390_opcode_mode_val. + (S390_OPCODE_ESAME): Rename to S390_OPCODE_ZARCH. + (s390_opcode): Remove architecture. Add modes and min_cpu. + +2003-03-17 D.Venkatasubramanian + + * h8300.h (O_SYS_CMDLINE): New pseudo opcode for command line + processing. + +2003-02-21 Noida D.Venkatasubramanian + + * h8300.h (ldmac, stmac): Replace MACREG with MS32 and MD32. + +2003-01-23 Alan Modra + + * m68hc11.h (cpu6812s): Define. + +2003-01-07 Chris Demetriou + + * mips.h: Fix missing space in comment. + (INSN_ISA1, INSN_ISA2, INSN_ISA3, INSN_ISA4, INSN_ISA5) + (INSN_ISA32, INSN_ISA32R2, INSN_ISA64): Shift values right + by four bits. + +2003-01-02 Chris Demetriou + + * mips.h: Update copyright years to include 2002 (which had + been missed previously) and 2003. Make comments about "+A", + "+B", and "+C" operand types more descriptive. + +2002-12-31 Chris Demetriou + + * mips.h: Note that the "+D" operand type name is now used. + +2002-12-30 Chris Demetriou + + * mips.h: Document "+" as the start of two-character operand + type names, and add new "K", "+A", "+B", and "+C" operand types. + (OP_MASK_INSMSB, OP_SH_INSMSB, OP_MASK_EXTMSB) + (OP_SH_EXTMSB, INSN_ISA32R2, ISA_MIPS32R2, CPU_MIPS32R2): New + defines. + +2002-12-24 Dmitry Diky + + * msp430.h: New file. Defines msp430 opcodes. + +2002-12-30 D.Venkatasubramanian + + * h8300.h: Added some more pseudo opcodes for system call + processing. + +2002-12-19 Chris Demetriou + + * mips.h (OP_OP_COP0, OP_OP_COP1, OP_OP_COP2, OP_OP_COP3) + (OP_OP_LWC1, OP_OP_LWC2, OP_OP_LWC3, OP_OP_LDC1, OP_OP_LDC2) + (OP_OP_LDC3, OP_OP_SWC1, OP_OP_SWC2, OP_OP_SWC3, OP_OP_SDC1) + (OP_OP_SDC2, OP_OP_SDC3): Define. + +2002-12-16 Alan Modra + + * hppa.h (completer_chars): #if 0 out. + + * ns32k.h (struct ns32k_opcode): Constify "name", "operands" and + "default_args". + (struct not_wot): Constify "args". + (struct not): Constify "name". + (numopcodes): Delete. + (endop): Delete. + +2002-12-13 Alan Modra + + * pj.h (pj_opc_info_t): Add union. + +2002-12-04 David Mosberger + + * ia64.h: Fix copyright message. + (IA64_OPND_AR_CSD): New operand kind. + +2002-12-03 Richard Henderson + + * ia64.h (enum ia64_opnd): Add IA64_OPND_LDXMOV. + +2002-12-03 Alan Modra + + * cgen.h (struct cgen_maybe_multi_ifield): Add "const PTR p" to union. + Constify "leaf" and "multi". + +2002-11-19 Klee Dienes + + * h8300.h (h8_opcode): Remove 'noperands', 'idx', and 'size' + fields. + (h8_opcodes). Modify initializer and initializer macros to no + longer initialize the removed fields. + +2002-11-19 Svein E. Seldal + + * tic4x.h (c4x_insts): Fixed LDHI constraint + +2002-11-18 Klee Dienes + + * h8300.h (h8_opcode): Remove 'length' field. + (h8_opcodes): Mark as 'const' (both the declaration and + definition). Modify initializer and initializer macros to no + longer initialize the length field. + +2002-11-18 Klee Dienes + + * arc.h (arc_ext_opcodes): Declare as extern. + (arc_ext_operands): Declare as extern. + * i860.h (i860_opcodes): Declare as const. + +2002-11-18 Svein E. Seldal + + * tic4x.h: File reordering. Added enhanced opcodes. + +2002-11-16 Svein E. Seldal + + * tic4x.h: Major rewrite of entire file. Define instruction + classes, and put each instruction into a class. + +2002-11-11 Svein E. Seldal + + * tic4x.h: Added new opcodes and corrected some bugs. Add support + for new DSP types. + +2002-10-14 Alan Modra + + * cgen.h: Test __BFD_H_SEEN__ rather than BFD_VERSION_DATE. + +2002-09-30 Gavin Romig-Koch + Ken Raeburn + Aldy Hernandez + Eric Christopher + Richard Sandiford + + * mips.h: Update comment for new opcodes. + (OP_MASK_VECBYTE, OP_SH_VECBYTE): New. + (OP_MASK_VECALIGN, OP_SH_VECALIGN): New. + (INSN_4111, INSN_4120, INSN_5400, INSN_5500): New. + (CPU_VR4120, CPU_VR5400, CPU_VR5500): New. + (OPCODE_IS_MEMBER): Handle the new CPU_* values and INSN_* flags. + Don't match CPU_R4111 with INSN_4100. + +2002-08-19 Elena Zannoni + + From matthew green + + * ppc.h (PPC_OPCODE_SPE): New opcode flag for Powerpc e500 + instructions. + (PPC_OPCODE_ISEL, PPC_OPCODE_BRLOCK, PPC_OPCODE_PMR, + PPC_OPCODE_CACHELCK, PPC_OPCODE_RFMCI): New opcode flags for the + e500x2 Integer select, branch locking, performance monitor, + cache locking and machine check APUs, respectively. + (PPC_OPCODE_EFS): New opcode type for efs* instructions. + (PPC_OPCODE_CLASSIC): New opcode type for Classic PowerPC instructions. + +2002-08-13 Stephane Carrez + + * m68hc11.h (M6812_OP_PAGE): Define to identify call operand. + (M68HC12_BANK_VIRT, M68HC12_BANK_MASK, M68HC12_BANK_BASE, + M68HC12_BANK_SHIFT, M68HC12_BANK_PAGE_MASK): Define for 68HC12 + memory banks. + (M6811_OC1M5, M6811_OC1M4, M6811_MODF): Fix value. + +2002-07-09 Thiemo Seufer + + * mips.h (INSN_MIPS16): New define. + +2002-07-08 Alan Modra + + * i386.h: Remove IgnoreSize from movsx and movzx. + +2002-06-08 Alan Modra + + * a29k.h: Replace CONST with const. + (CONST): Don't define. + * convex.h: Replace CONST with const. + (CONST): Don't define. + * dlx.h: Replace CONST with const. + * or32.h (CONST): Don't define. + +2002-05-30 Chris G. Demetriou + + * mips.h (OP_SH_ALN, OP_MASK_ALN, OP_SH_VSEL, OP_MASK_VSEL) + (MDMX_FMTSEL_IMM_QH, MDMX_FMTSEL_IMM_OB, MDMX_FMTSEL_VEC_QH) + (MDMX_FMTSEL_VEC_OB, INSN_READ_MDMX_ACC, INSN_WRITE_MDMX_ACC) + (INSN_MDMX): New constants, for MDMX support. + (opcode character list): Add "O", "Q", "X", "Y", and "Z" for MDMX. + +2002-05-28 Kuang Hwa Lin + + * dlx.h: New file. + +2002-05-25 Alan Modra + + * ia64.h: Use #include "" instead of <> for local header files. + * sparc.h: Likewise. + +2002-05-22 Thiemo Seufer + + * mips.h: Add M_DROL, M_DROL_I, M_DROR, M_DROR_I macro cases. + +2002-05-17 Andrey Volkov + + * h8300.h: Corrected defs of all control regs + and eepmov instr. + +2002-04-11 Alan Modra + + * i386.h: Add intel mode cmpsd and movsd. + Put them before SSE2 insns, so that rep prefix works. + +2002-03-15 Chris G. Demetriou + + * mips.h (INSN_MIPS3D): New definition used to mark MIPS-3D + instructions. + (OPCODE_IS_MEMBER): Adjust comments to indicate that ASE bit masks + may be passed along with the ISA bitmask. + +2002-03-05 Paul Koning + + * pdp11.h: Add format codes for float instruction formats. + +2002-02-25 Alan Modra + + * ppc.h (PPC_OPCODE_POWER4, PPC_OPCODE_NOPOWER4): Define. + +Mon Feb 18 17:31:48 CET 2002 Jan Hubicka + + * i386.h (push,pop): Fix Reg64 to WordReg to allow 16bit operands. + +Mon Feb 11 12:53:19 CET 2002 Jan Hubicka + + * i386.h (push,pop): Allow 16bit operands in 64bit mode. + (xchg): Fix. + (in, out): Disable 64bit operands. + (call, jmp): Avoid REX prefixes. + (jcxz): Prohibit in 64bit mode + (jrcxz, loop): Add 64bit variants. + (movq): Fix patterns. + (movmskps, pextrw, pinstrw): Add 64bit variants. + +2002-01-31 Ivan Guzvinec + + * or32.h: New file. + +2002-01-22 Graydon Hoare + + * cgen.h (CGEN_MAYBE_MULTI_IFLD): New structure. + (CGEN_OPERAND): Add CGEN_MAYBE_MULTI_IFLD field. + +2002-01-21 Thomas Klausner + + * h8300.h: Comment typo fix. + +2002-01-03 matthew green + + * ppc.h (PPC_OPCODE_BOOKE): BookE is not Motorola specific. + (PPC_OPCODE_BOOKE64): Likewise. + +Mon Dec 31 16:45:41 2001 Jeffrey A Law (law@cygnus.com) + + * hppa.h (call, ret): Move to end of table. + (addb, addib): PA2.0 variants should have been PA2.0W. + (ldw, ldh, ldb, stw, sth, stb, stwa): Reorder to keep disassembler + happy. + (fldw, fldd, fstw, fstd, bb): Likewise. + (short loads/stores): Tweak format specifier slightly to keep + disassembler happy. + (indexed loads/stores): Likewise. + (absolute loads/stores): Likewise. + +2001-12-04 Alexandre Oliva + + * d10v.h (OPERAND_NOSP): New macro. + +2001-11-29 Alexandre Oliva + + * d10v.h (OPERAND_SP): New macro. + +2001-11-15 Alan Modra + + * ppc.h (struct powerpc_operand ): Add dialect param. + +2001-11-11 Timothy Wall + + * tic54x.h: Revise opcode layout; don't really need a separate + structure for parallel opcodes. + +2001-11-13 Zack Weinberg + Alan Modra + + * i386.h (i386_optab): Add entries for "sldr", "smsw" and "str" to + accept WordReg. + +2001-11-04 Chris Demetriou + + * mips.h (OPCODE_IS_MEMBER): Remove extra space. + +2001-10-30 Hans-Peter Nilsson + + * mmix.h: New file. + +2001-10-18 Chris Demetriou + + * mips.h (OPCODE_IS_MEMBER): Add a no-op term to the end + of the expression, to make source code merging easier. + +2001-10-17 Chris Demetriou + + * mips.h: Sort coprocessor instruction argument characters + in comment, add a few more words of description for "H". + +2001-10-17 Chris Demetriou + + * mips.h (INSN_SB1): New cpu-specific instruction bit. + (OPCODE_IS_MEMBER): Allow instructions matching INSN_SB1 + if cpu is CPU_SB1. + +2001-10-17 matthew green + + * ppc.h (PPC_OPCODE_BOOKE64): Fix typo. + +2001-10-12 matthew green + + * ppc.h (PPC_OPCODE_BOOKE, PPC_OPCODE_BOOKE64, PPC_OPCODE_403): New + opcode flags for BookE 32-bit, BookE 64-bit and PowerPC 403 + instructions, respectively. + +2001-09-27 Nick Clifton + + * v850.h: Remove spurious comment. + +2001-09-21 Nick Clifton + + * h8300.h: Fix compile time warning messages + +2001-09-04 Richard Henderson + + * alpha.h (struct alpha_operand): Pack elements into bitfields. + +2001-08-31 Eric Christopher + + * mips.h: Remove CPU_MIPS32_4K. + +2001-08-27 Torbjorn Granlund + + * ppc.h (PPC_OPERAND_DS): Define. + +2001-08-25 Andreas Jaeger + + * d30v.h: Fix declaration of reg_name_cnt. + + * d10v.h: Fix declaration of d10v_reg_name_cnt. + + * arc.h: Add prototypes from opcodes/arc-opc.c. + +2001-08-16 Thiemo Seufer + + * mips.h (INSN_10000): Define. + (OPCODE_IS_MEMBER): Check for INSN_10000. + +2001-08-10 Alan Modra + + * ppc.h: Revert 2001-08-08. + +2001-08-10 Richard Sandiford + + * mips.h (INSN_GP32): Remove. + (OPCODE_IS_MEMBER): Remove gp32 parameter. + (M_MOVE): New macro identifier. + +2001-08-08 Alan Modra + + 1999-10-25 Torbjorn Granlund + * ppc.h (struct powerpc_operand): New field `reloc'. + +2001-08-01 Aldy Hernandez + + * mips.h (INSN_ISA_MASK): Nuke bits 12-15. + +2001-07-12 Jeff Johnston + + * cgen.h (CGEN_INSN): Add regex support. + (build_insn_regex): Declare. + +2001-07-11 Frank Ch. Eigler + + * cgen.h (CGEN_MACH): Add insn_chunk_bitsize field. + (cgen_cpu_desc): Ditto. + +2001-07-07 Ben Elliston + + * m88k.h: Clean up and reformat. Remove unused code. + +2001-06-14 Geoffrey Keating + + * cgen.h (cgen_keyword): Add nonalpha_chars field. + +2001-05-23 Thiemo Seufer + + * mips.h (CPU_R12000): Define. + +2001-05-23 John Healy + + * cgen.h: Increased CGEN_MAX_SYNTAX_ELEMENTS to 48. + +2001-05-15 Thiemo Seufer + + * mips.h (INSN_ISA_MASK): Define. + +2001-05-12 Alan Modra + + * i386.h (i386_optab): Second operand of cvtps2dq is an xmm reg, + not an mmx reg. Swap xmm/mmx regs on both movdq2q and movq2dq, + and use InvMem as these insns must have register operands. + +2001-05-04 Alan Modra + + * i386.h (i386_optab): Move InvMem to first operand of pmovmskb + and pextrw to swap reg/rm assignments. + +2001-04-05 Hans-Peter Nilsson + + * cris.h (enum cris_insn_version_usage): Correct comment for + cris_ver_v3p. + +2001-03-24 Alan Modra + + * i386.h (i386_optab): Correct entry for "movntdq". Add "punpcklqdq". + Add InvMem to first operand of "maskmovdqu". + +2001-03-22 Hans-Peter Nilsson + + * cris.h (ADD_PC_INCR_OPCODE): New macro. + +2001-03-21 Kazu Hirata + + * h8300.h: Fix formatting. + +2001-03-22 Alan Modra + + * i386.h (i386_optab): Add paddq, psubq. + +2001-03-19 Alan Modra + + * i386.h (REGNAM_AL, REGNAM_AX, REGNAM_EAX): Define. + +2001-02-28 Igor Shevlyakov + + * m68k.h: new defines for Coldfire V4. Update mcf to know + about mcf5407. + +2001-02-18 lars brinkhoff + + * pdp11.h: New file. + +2001-02-12 Jan Hubicka + + * i386.h (i386_optab): SSE integer converison instructions have + 64bit versions on x86-64. + +2001-02-10 Nick Clifton + + * mips.h: Remove extraneous whitespace. Formating change to allow + for future contribution. + +2001-02-09 Martin Schwidefsky + + * s390.h: New file. + +2001-02-02 Patrick Macdonald + + * cgen.h (CGEN_SYNTAX_CHAR_TYPE): Typedef as unsigned short. + (CGEN_MAX_SYNTAX_ELEMENTS): Rename from CGEN_MAX_SYNTAX_BYTES. + (CGEN_SYNTAX): Define using CGEN_MAX_SYNTAX_ELEMENTS. + +2001-01-24 Karsten Keil + + * i386.h (i386_optab): Fix swapgs + +2001-01-14 Alan Modra + + * hppa.h: Describe new '<' and '>' operand types, and tidy + existing comments. + (pa_opcodes): Add entries for missing wide mode ldi,ldo,ldw,stw. + Remove duplicate "ldw j(s,b),x". Sort some entries. + +2001-01-13 Jan Hubicka + + * i386.h (i386_optab): Fix pusha and ret templates. + +2001-01-11 Peter Targett + + * arc.h (ARC_MACH_5, ARC_MACH_6, ARC_MACH_7, ARC_MACH_8): New + definitions for masking cpu type. + (arc_ext_operand_value) New structure for storing extended + operands. + (ARC_OPERAND_*) Flags for operand values. + +2001-01-10 Jan Hubicka + + * i386.h (pinsrw): Add. + (pshufw): Remove. + (cvttpd2dq): Fix operands. + (cvttps2dq): Likewise. + (movq2q): Rename to movdq2q. + +2001-01-10 Richard Schaal + + * i386.h: Correct movnti instruction. + +2001-01-09 Jeff Johnston + + * cgen.h (CGEN_SYNTAX_CHAR_TYPE): New typedef based on max number + of operands (unsigned char or unsigned short). + (CGEN_SYNTAX): Changed to make array CGEN_SYNTAX_CHAR_TYPE. + (CGEN_SYNTAX_CHAR): Changed to cast to unsigned char. + +2001-01-05 Jan Hubicka + + * i386.h (i386_optab): Make [sml]fence template to use immext field. + +2001-01-03 Jan Hubicka + + * i386.h (i386_optab): Fix 64bit pushf template; Add instructions + introduced by Pentium4 + +2000-12-30 Jan Hubicka + + * i386.h (i386_optab): Add "rex*" instructions; + add swapgs; disable jmp/call far direct instructions for + 64bit mode; add syscall and sysret; disable registers for 0xc6 + template. Add 'q' suffixes to extendable instructions, disable + obsolete instructions, add new sign/zero extension ones. + (i386_regtab): Add extended registers. + (*Suf): Add No_qSuf. + (q_Suf, wlq_Suf, bwlq_Suf): New. + +2000-12-20 Jan Hubicka + + * i386.h (i386_optab): Replace "Imm" with "EncImm". + (i386_regtab): Add flags field. + +2000-12-12 Nick Clifton + + * mips.h: Fix formatting. + +2000-12-01 Chris Demetriou + + mips.h (OP_MASK_SYSCALL, OP_SH_SYSCALL): Delete. + (OP_MASK_CODE20, OP_SH_CODE20): Define, with values of old + OP_*_SYSCALL definitions. + (OP_SH_CODE19, OP_MASK_CODE19): Define, for use as + 19 bit wait codes. + (MIPS operand specifier comments): Remove 'm', add 'U' and + 'J', and update the meaning of 'B' so that it's more general. + + * mips.h (INSN_ISA1, INSN_ISA2, INSN_ISA3, INSN_ISA4, + INSN_ISA5): Renumber, redefine to mean the ISA at which the + instruction was added. + (INSN_ISA32): New constant. + (INSN_4650, INSN_4010, INSN_4100, INSN_3900, INSN_GP32): + Renumber to avoid new and/or renumbered INSN_* constants. + (INSN_MIPS32): Delete. + (ISA_UNKNOWN): New constant to indicate unknown ISA. + (ISA_MIPS1, ISA_MIPS2, ISA_MIPS3, ISA_MIPS4, ISA_MIPS5, + ISA_MIPS32): New constants, defined to be the mask of INSN_* + constants available at that ISA level. + (CPU_UNKNOWN): New constant to indicate unknown CPU. + (CPU_4K, CPU_MIPS32_4K): Rename the former to the latter, + define it with a unique value. + (OPCODE_IS_MEMBER): Update for new ISA membership-related + constant meanings. + + * mips.h (INSN_ISA64, ISA_MIPS5, ISA_MIPS64): New + definitions. + + * mips.h (CPU_SB1): New constant. + +2000-10-20 Jakub Jelinek + + * sparc.h (enum sparc_opcode_arch_val): Add SPARC_OPCODE_ARCH_V9B. + Note that '3' is used for siam operand. + +2000-09-22 Jim Wilson + + * ia64.h (enum ia64_dependency_semantics): Add IA64_DVS_STOP. + +2000-09-13 Anders Norlander + + * mips.h: Use defines instead of hard-coded processor numbers. + (CPU_R2000, CPU_R3000, CPU_R3900, CPU_R4000, CPU_R4010, + CPU_VR4100, CPU_R4111, CPU_R4300, CPU_R4400, CPU_R4600, CPU_R4650, + CPU_R5000, CPU_R6000, CPU_R8000, CPU_R10000, CPU_MIPS32, CPU_4K, + CPU_4KC, CPU_4KM, CPU_4KP): Define.. + (OPCODE_IS_MEMBER): Use new defines. + (OP_MASK_SEL, OP_SH_SEL): Define. + (OP_MASK_CODE20, OP_SH_CODE20): Define. + Add 'P' to used characters. + Use 'H' for coprocessor select field. + Use 'm' for 20 bit breakpoint code. + Document new arg characters and add to used characters. + (INSN_MIPS32): New define for MIPS32 extensions. + (OPCODE_IS_MEMBER): Recognize MIPS32 instructions. + +2000-09-05 Alan Modra + + * hppa.h: Mention cz completer. + +2000-08-16 Jim Wilson + + * ia64.h (IA64_OPCODE_POSTINC): New. + +2000-08-15 H.J. Lu + + * i386.h: Swap the Intel syntax "movsx"/"movzx" due to the + IgnoreSize change. + +2000-08-08 Jason Eckhardt + + * i860.h: Small formatting adjustments. + +2000-07-29 Marek Michalkiewicz + + * avr.h (AVR_UNDEF_P, AVR_SKIP_P, AVR_DISP0_P): New macros. + Move related opcodes closer to each other. + Minor changes in comments, list undefined opcodes. + +2000-07-26 Dave Brolley + + * cgen.h (cgen_hw_lookup_by_num): Second parameter is unsigned. + +2000-07-22 Jason Eckhardt + + * i860.h (btne, bte, bla): Changed these opcodes + to use sbroff ('r') instead of split16 ('s'). + (J, K, L, M): New operand types for 16-bit aligned fields. + (ld.x, {p}fld.x, fst.x, pst.d): Changed these opcodes to + use I, J, K, L, M instead of just I. + (T, U): New operand types for split 16-bit aligned fields. + (st.x): Changed these opcodes to use S, T, U instead of just S. + (andh, andnoth, orh, xorh): Deleted 3-register forms as they do not + exist on the i860. + (pfgt.sd, pfle.sd): Deleted these as they do not exist on the i860. + (pfeq.ss, pfeq.dd): New opcodes. + (st.s): Fixed incorrect mask bits. + (fmlow): Fixed incorrect mask bits. + (fzchkl, pfzchkl): Fixed incorrect mask bits. + (faddz, pfaddz): Fixed incorrect mask bits. + (form, pform): Fixed incorrect mask bits. + (pfld.l): Fixed incorrect mask bits. + (fst.q): Fixed incorrect mask bits. + (all floating point opcodes): Fixed incorrect mask bits for + handling of dual bit. + +2000-07-20 Hans-Peter Nilsson + + cris.h: New file. + +2000-06-26 Marek Michalkiewicz + + * avr.h (AVR_ISA_WRAP): Remove, now assumed if not AVR_ISA_MEGA. + (AVR_ISA_ESPM): Remove, because ESPM removed in databook update. + (AVR_ISA_85xx): Remove, all uses changed back to AVR_ISA_2xxx. + (AVR_ISA_M83): Define for ATmega83, ATmega85. + (espm): Remove, because ESPM removed in databook update. + (eicall, eijmp): Move to the end of opcode table. + +2000-06-18 Stephane Carrez + + * m68hc11.h: New file for support of Motorola 68hc11. + +Fri Jun 9 21:51:50 2000 Denis Chertykov + + * avr.h: clr,lsl,rol, ... moved after add,adc, ... + +Wed Jun 7 21:39:54 2000 Denis Chertykov + + * avr.h: New file with AVR opcodes. + +Wed Apr 12 17:11:20 2000 Donald Lindsay + + * d10v.h: added ALONE attribute for d10v_opcode.exec_type. + +2000-05-23 Maciej W. Rozycki + + * i386.h: Allow d suffix on iret, and add DefaultSize modifier. + +2000-05-17 Maciej W. Rozycki + + * i386.h: Use sl_FP, not sl_Suf for fild. + +2000-05-16 Frank Ch. Eigler + + * cgen.h (CGEN_MAX_SYNTAX_BYTES): Increase to 32. Check that + it exceeds CGEN_ACTUAL_MAX_SYNTAX_BYTES, if set. + (CGEN_MAX_IFMT_OPERANDS): Increase to 16. Check that it exceeds + CGEN_ACTUAL_MAX_IFMT_OPERANDS, if set. + +2000-05-13 Alan Modra , + + * i386.h (i386_optab): Cpu686 for sysenter,sysexit,fxsave,fxrestore. + +2000-05-13 Alan Modra , + Alexander Sokolov + + * i386.h (i386_optab): Add cpu_flags for all instructions. + +2000-05-13 Alan Modra + + From Gavin Romig-Koch + * i386.h (wld_Suf): Define. Use on pushf, popf, pusha, popa. + +2000-05-04 Timothy Wall + + * tic54x.h: New. + +2000-05-03 J.T. Conklin + + * ppc.h (PPC_OPCODE_ALTIVEC): New opcode flag for vector unit. + (PPC_OPERAND_VR): New operand flag for vector registers. + +2000-05-01 Kazu Hirata + + * h8300.h (EOP): Add missing initializer. + +Fri Apr 21 15:03:37 2000 Jason Eckhardt + + * hppa.h (pa_opcodes): New opcodes for PA2.0 wide mode + forms of ld/st{b,h,w,d} and fld/fst{w,d} (16-bit displacements). + New operand types l,y,&,fe,fE,fx added to support above forms. + (pa_opcodes): Replaced usage of 'x' as source/target for + floating point double-word loads/stores with 'fx'. + +Fri Apr 21 13:20:53 2000 Richard Henderson + David Mosberger + Timothy Wall + Jim Wilson + + * ia64.h: New file. + +2000-03-27 Nick Clifton + + * d30v.h (SHORT_A1): Fix value. + (SHORT_AR): Renumber so that it is at the end of the list of short + instructions, not the end of the list of long instructions. + +2000-03-26 Alan Modra + + * i386.h: (UNIXWARE_COMPAT): Rename to SYSV386_COMPAT as the + problem isn't really specific to Unixware. + (OLDGCC_COMPAT): Define. + (i386_optab): If !OLDGCC_COMPAT, don't handle fsubp etc. with + destination %st(0). + Fix lots of comments. + +2000-03-02 J"orn Rennecke + + * d30v.h: + (SHORT_B2r, SHORT_B3, SHORT_B3r, SHORT_B3b, SHORT_B3br): Updated. + (SHORT_D1r, SHORT_D2, SHORT_D2r, SHORT_D2Br, SHORT_U): Updated. + (SHORT_F, SHORT_AF, SHORT_T, SHORT_A5, SHORT_CMP, SHORT_CMPU): Updated. + (SHORT_A1, SHORT_AA, SHORT_RA, SHORT_MODINC, SHORT_MODDEC): Updated. + (SHORT_C1, SHORT_C2, SHORT_UF, SHORT_A2, SHORT_NONE, LONG): Updated. + (LONG_U, LONG_Ur, LONG_CMP, LONG_M, LONG_M2, LONG_2, LONG_2r): Updated. + (LONG_2b, LONG_2br, LONG_D, LONG_Dr, LONG_Dbr): Updated. + +2000-02-25 Alan Modra + + * i386.h (fild, fistp): Change intel d_Suf form to fildd and + fistpd without suffix. + +2000-02-24 Nick Clifton + + * cgen.h (cgen_cpu_desc): Rename field 'flags' to + 'signed_overflow_ok_p'. + Delete prototypes for cgen_set_flags() and cgen_get_flags(). + +2000-02-24 Andrew Haley + + * cgen.h (CGEN_INSN_MACH_HAS_P): New macro. + (CGEN_CPU_TABLE): flags: new field. + Add prototypes for new functions. + +2000-02-24 Alan Modra + + * i386.h: Add some more UNIXWARE_COMPAT comments. + +2000-02-23 Linas Vepstas + + * i370.h: New file. + +2000-02-22 Chandra Chavva + + * d30v.h (FLAG_NOT_WITH_ADDSUBppp): Redefined as operation + cannot be combined in parallel with ADD/SUBppp. + +2000-02-22 Andrew Haley + + * mips.h: (OPCODE_IS_MEMBER): Add comment. + +1999-12-30 Andrew Haley + + * mips.h (OPCODE_IS_MEMBER): Add gp32 arg, which determines + whether synthetic opcodes (e.g. move) generate 32-bit or 64-bit + insns. + +2000-01-15 Alan Modra + + * i386.h: Qualify intel mode far call and jmp with x_Suf. + +1999-12-27 Alan Modra + + * i386.h: Add JumpAbsolute qualifier to all non-intel mode + indirect jumps and calls. Add FF/3 call for intel mode. + +Wed Dec 1 03:05:25 1999 Jeffrey A Law (law@cygnus.com) + + * mn10300.h: Add new operand types. Add new instruction formats. + +Wed Nov 24 20:28:58 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Correctly handle immediate for PA2.0 "bb" + instruction. + +1999-11-18 Gavin Romig-Koch + + * mips.h (INSN_ISA5): New. + +1999-11-01 Gavin Romig-Koch + + * mips.h (OPCODE_IS_MEMBER): New. + +1999-10-29 Nick Clifton + + * d30v.h (SHORT_AR): Define. + +1999-10-18 Michael Meissner + + * alpha.h (alpha_num_opcodes): Convert to unsigned. + (alpha_num_operands): Ditto. + +Sun Oct 10 01:46:56 1999 Jerry Quinn + + * hppa.h (pa_opcodes): Add load and store cache control to + instructions. Add ordered access load and store. + + * hppa.h (pa_opcode): Add new entries for addb and addib. + + * hppa.h (pa_opcodes): Fix cmpb and cmpib entries. + + * hppa.h (pa_opcodes): Add entries for cmpb and cmpib. + +Thu Oct 7 00:12:25 MDT 1999 Diego Novillo + + * d10v.h: Add flag RESTRICTED_NUM3 for imm3 operands. + +Thu Sep 23 07:08:38 1999 Jerry Quinn + + * hppa.h (pa_opcodes): Add "call" and "ret". Clean up "b", "bve" + and "be" using completer prefixes. + + * hppa.h (pa_opcodes): Add initializers to silence compiler. + + * hppa.h: Update comments about character usage. + +Mon Sep 20 03:55:31 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Fix minor thinkos introduced while cleaning + up the new fstw & bve instructions. + +Sun Sep 19 10:40:59 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Add remaining PA2.0 integer load/store + instructions. + + * hppa.h (pa_opcodes): Add remaining PA2.0 FP load/store instructions. + + * hppa.h (pa_opcodes): Add long offset double word load/store + instructions. + + * hppa.h (pa_opcodes): Add FLAG_STRICT variants of FP loads and + stores. + + * hppa.h (pa_opcodes): Handle PA2.0 fcnv, fcmp and ftest insns. + + * hppa.h (pa_opcodes): Finish support for PA2.0 "b" instructions. + + * hppa.h (pa_opcodes): Handle PA2.0 "bve" instructions. + + * hppa.h (pa_opcodes): Add new syntax "be" instructions. + + * hppa.h (pa_opcodes): Note use of 'M' and 'L'. + + * hppa.h (pa_opcodes): Add support for "b,l". + + * hppa.h (pa_opcodes): Add support for "b,gate". + +Sat Sep 18 11:41:16 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Use 'fX' for first register operand + in xmpyu. + + * hppa.h (pa_opcodes): Fix mask for probe and probei. + + * hppa.h (pa_opcodes): Fix mask for depwi. + +Tue Sep 7 13:44:25 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Add "addil" variant which has the %r1 as + an explicit output argument. + +Mon Sep 6 04:41:42 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h: Add strict variants of PA1.0/PA1.1 loads and stores. + Add a few PA2.0 loads and store variants. + +1999-09-04 Steve Chamberlain + + * pj.h: New file. + +1999-08-29 Alan Modra + + * i386.h (i386_regtab): Move %st to top of table, and split off + other fp reg entries. + (i386_float_regtab): To here. + +Sat Aug 28 00:25:25 1999 Jerry Quinn + + * hppa.h (pa_opcodes): Replace 'f' by 'v'. Prefix float register args + by 'f'. + + * hppa.h (pa_opcodes): Add extrd, extrw, depd, depdi, depw, depwi. + Add supporting args. + + * hppa.h: Document new completers and args. + * hppa.h (pa_opcodes): Add 64 bit patterns and pa2.0 syntax for uxor, + uaddcm, dcor, addi, add, sub, subi, shladd, rfi, and probe. Add pa2.0 + extensions for ssm, rsm, pdtlb, pitlb. Add performance instructions + pmenb and pmdis. + + * hppa.h (pa_opcodes): Add pa2.0 instructions hadd, hshl, + hshr, hsub, mixh, mixw, permh. + + * hppa.h (pa_opcodes): Change completers in instructions to + use 'c' prefix. + + * hppa.h (pa_opcodes): Add popbts, new forms of bb, havg, + hshladd, hshradd, shrpd, and shrpw instructions. Update arg comments. + + * hppa.h (pa_opcodes): Change fmpyfadd, fmpynfadd, fneg, + fnegabs to use 'I' instead of 'F'. + +1999-08-21 Alan Modra + + * i386.h: Add AMD athlon instructions, pfnacc, pfpnacc, pswapd. + Document pf2iw and pi2fw as athlon insns. Remove pswapw. + Alphabetically sort PIII insns. + +Wed Aug 18 18:14:40 1999 Doug Evans + + * cgen.h (CGEN_INSN_MACH_HAS_P): New macro. + +Fri Aug 6 09:46:35 1999 Jerry Quinn + + * hppa.h (pa_opcodes): Add 64 bit versions of or, xor, and, + and andcm. Add 32 and 64 bit version of cmpclr, cmpiclr. + + * hppa.h: Document 64 bit condition completers. + +Thu Aug 5 16:56:07 1999 Jerry Quinn + + * hppa.h (pa_opcodes): Change condition args to use '?' prefix. + +1999-08-04 Alan Modra + + * i386.h (i386_optab): Add DefaultSize modifier to all insns + that implicitly modify %esp. #undef d_Suf, x_suf, sld_suf, + sldx_suf, bwld_Suf, d_FP, x_FP, sld_FP, sldx_FP at end of table. + +Wed Jul 28 02:04:24 1999 Jerry Quinn + Jeff Law + + * hppa.h (pa_opcodes): Add "pushnom" and "pushbts". + + * hppa.h (pa_opcodes): Mark all PA2.0 opcodes with FLAG_STRICT. + + * hppa.h (pa_opcodes): Change xmpyu, fmpyfadd, + and fmpynfadd to use 'J' and 'K' instead of 'E' and 'X'. + +1999-07-13 Alan Modra + + * i386.h: Add "undocumented" AMD 3DNow! pf2iw, pi2fw, pswapw insns. + +Thu Jul 1 00:17:24 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (struct pa_opcode): Add new field "flags". + (FLAGS_STRICT): Define. + +Fri Jun 25 04:22:04 1999 Jerry Quinn + Jeff Law + + * hppa.h (pa_opcodes): Add pa2.0 clrbts instruction. + + * hppa.h (pa_opcodes): Add entries for mfia and mtsarcm instructions. + +1999-06-23 Alan Modra + + * i386.h: Allow `l' suffix on bswap. Allow `w' suffix on arpl, + lldt, lmsw, ltr, str, verr, verw. Add FP flag to fcmov*. Add FP + flag to fcomi and friends. + +Fri May 28 15:26:11 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Move integer arithmetic instructions after + integer logical instructions. + +1999-05-28 Linus Nordberg + + * m68k.h: Document new formats `E', `G', `H' and new places `N', + `n', `o'. + + * m68k.h: Define mcf5206e, mcf5307, mcf. Document new format `u' + and new places `m', `M', `h'. + +Thu May 27 04:13:54 1999 Joel Sherrill (joel@OARcorp.com + + * hppa.h (pa_opcodes): Add several processor specific system + instructions. + +Wed May 26 16:57:44 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pa_opcodes): Add second entry for "comb", "comib", + "addb", and "addib" to be used by the disassembler. + +1999-05-12 Alan Modra + + * i386.h (ReverseModrm): Remove all occurences. + (InvMem): Add to control/debug/test mov insns, movhlps, movlhps, + movmskps, pextrw, pmovmskb, maskmovq. + Change NoSuf to FP on all MMX, XMM and AMD insns as these all + ignore the data size prefix. + + * i386.h (i386_optab, i386_regtab): Add support for PIII SIMD. + Mostly stolen from Doug Ledford + +Sat May 8 23:27:35 1999 Richard Henderson + + * ppc.h (PPC_OPCODE_64_BRIDGE): New. + +1999-04-14 Doug Evans + + * cgen.h (CGEN_ATTR): Delete member num_nonbools. + (CGEN_ATTR_TYPE): Update. + (CGEN_ATTR_MASK): Number booleans starting at 0. + (CGEN_ATTR_VALUE): Update. + (CGEN_INSN_ATTR): Update. + +Mon Apr 12 23:43:27 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (fmpyfadd, fmpynfadd, fneg, fnegabs): New PA2.0 + instructions. + +Tue Mar 23 11:24:38 1999 Jeffrey A Law (law@cygnus.com) + + * hppa.h (bb, bvb): Tweak opcode/mask. + + +1999-03-22 Doug Evans + + * cgen.h (CGEN_ISA,CGEN_MACH): New typedefs. + (struct cgen_cpu_desc): Rename member mach to machs. New member isas. + New members word_bitsize,default_insn_bitsize,base_insn-bitsize, + min_insn_bitsize,max_insn_bitsize,isa_table,mach_table,rebuild_tables. + Delete member max_insn_size. + (enum cgen_cpu_open_arg): New enum. + (cpu_open): Update prototype. + (cpu_open_1): Declare. + (cgen_set_cpu): Delete. + +1999-03-11 Doug Evans + + * cgen.h (CGEN_HW_TABLE): Delete `num_init_entries' member. + (CGEN_OPERAND_NIL): New macro. + (CGEN_OPERAND): New member `type'. + (@arch@_cgen_operand_table): Delete decl. + (CGEN_OPERAND_INDEX,CGEN_OPERAND_TYPE,CGEN_OPERAND_ENTRY): Delete. + (CGEN_OPERAND_TABLE): New struct. + (cgen_operand_lookup_by_name,cgen_operand_lookup_by_num): Declare. + (CGEN_OPINST): Pointer to operand table entry replaced with enum. + (CGEN_CPU_TABLE): New member `isa'. Change member `operand_table', + now a CGEN_OPERAND_TABLE. Add CGEN_CPU_DESC arg to + {get,set}_{int,vma}_operand. + (@arch@_cgen_cpu_open): New arg `isa'. + (cgen_set_cpu): Ditto. + +Fri Feb 26 02:36:45 1999 Richard Henderson + + * i386.h: Fill in cmov and fcmov alternates. Add fcomi short forms. + +1999-02-25 Doug Evans + + * cgen.h (enum cgen_asm_type): Add CGEN_ASM_NONE. + (CGEN_HW_ENTRY): Delete member `next'. Change type of `type' to + enum cgen_hw_type. + (CGEN_HW_TABLE): New struct. + (hw_table): Delete declaration. + (CGEN_OPERAND): Change member hw to hw_type, change type from pointer + to table entry to enum. + (CGEN_OPINST): Ditto. + (CGEN_CPU_TABLE): Change member hw_list to hw_table. + +Sat Feb 13 14:13:44 1999 Richard Henderson + + * alpha.h (AXP_OPCODE_EV6): New. + (AXP_OPCODE_NOPAL): Include it. + +1999-02-09 Doug Evans + + * cgen.h (CGEN_CPU_DESC): Renamed from CGEN_OPCODE_DESC. + All uses updated. New members int_insn_p, max_insn_size, + parse_operand,insert_operand,extract_operand,print_operand, + sizeof_fields,set_fields_bitsize,get_int_operand,set_int_operand, + get_vma_operand,set_vma_operand,parse_handlers,insert_handlers, + extract_handlers,print_handlers. + (CGEN_ATTR): Change type of num_nonbools to unsigned int. + (CGEN_ATTR_BOOL_OFFSET): New macro. + (CGEN_ATTR_MASK): Subtract it to compute bit number. + (CGEN_ATTR_VALUE): Redo bool/nonbool attr calculation. + (cgen_opcode_handler): Renamed from cgen_base. + (CGEN_HW_ATTR_VALUE): Renamed from CGEN_HW_ATTR, all uses updated. + (CGEN_OPERAND_ATTR_VALUE): Renamed from CGEN_OPERAND_ATTR, + all uses updated. + (CGEN_OPERAND_INDEX): Rewrite to use table entry, not global. + (enum cgen_opinst_type): Renamed from cgen_operand_instance_type. + (CGEN_IFLD_ATTR_VALUE): Renamed from CGEN_IFLD_ATTR, all uses updated. + (CGEN_OPCODE,CGEN_IBASE): New types. + (CGEN_INSN): Rewrite. + (CGEN_{ASM,DIS}_HASH*): Delete. + (init_opcode_table,init_ibld_table): Declare. + (CGEN_INSN_ATTR): New type. + +Mon Feb 1 21:09:14 1999 Catherine Moore + + * i386.h (d_Suf, x_Suf, sld_Suf, sldx_Suf, bwld_Suf): Define. + (x_FP, d_FP, dls_FP, sldx_FP): Define. + Change *Suf definitions to include x and d suffixes. + (movsx): Use w_Suf and b_Suf. + (movzx): Likewise. + (movs): Use bwld_Suf. + (fld): Change ordering. Use sld_FP. + (fild): Add Intel Syntax equivalent of fildq. + (fst): Use sld_FP. + (fist): Use sld_FP. + (fstp): Use sld_FP. Add x_FP version. + (fistp): LLongMem version for Intel Syntax. + (fcom, fcomp): Use sld_FP. + (fadd, fiadd, fsub): Use sld_FP. + (fsubr): Use sld_FP. + (fmul, fimul, fdvi, fidiv, fdivr): Use sld_FP. + +1999-01-27 Doug Evans + + * cgen.h (enum cgen_mode): Add CGEN_MODE_TARGET_MAX, CGEN_MODE_INT, + CGEN_MODE_UINT. + +1999-01-16 Jeffrey A Law (law@cygnus.com) + + * hppa.h (bv): Fix mask. + +1999-01-05 Doug Evans + + * cgen.h (CGEN_ATTR_VALUE_TYPE): New typedef. + (CGEN_ATTR): Use it. + (CGEN_ATTR_TYPE,CGEN_ATTR_ENTRY): Ditto. + (CGEN_ATTR_TABLE): New member dfault. + +1998-12-30 Gavin Romig-Koch + + * mips.h (MIPS16_INSN_BRANCH): New. + +Wed Dec 9 10:38:48 1998 David Taylor + + The following is part of a change made by Edith Epstein + as part of a project to merge in + changes by HP; HP did not create ChangeLog entries. + + * hppa.h (completer_chars): list of chars to not put a space + after. + +Sun Dec 6 13:21:34 1998 Ian Lance Taylor + + * i386.h (i386_optab): Permit w suffix on processor control and + status word instructions. + +1998-11-30 Doug Evans + + * cgen.h (struct cgen_hw_entry): Delete const on attrs member. + (struct cgen_keyword_entry): Ditto. + (struct cgen_operand): Ditto. + (CGEN_IFLD): New typedef, with associated access macros. + (CGEN_IFMT): New typedef, with associated access macros. + (CGEN_IFMT): Renamed from CGEN_FORMAT. New member `iflds'. + (CGEN_IVALUE): New typedef. + (struct cgen_insn): Delete const on syntax,attrs members. + `format' now points to format data. Type of `value' is now + CGEN_IVALUE. + (struct cgen_opcode_table): New member ifld_table. + +1998-11-18 Doug Evans + + * cgen.h (cgen_extract_fn): Update type of `base_insn' arg. + (CGEN_OPERAND_INSTANCE): New member `attrs'. + (CGEN_OPERAND_INSTANCE_{ATTRS,ATTR}): New macros. + (cgen_dis_lookup_insn): Update type of `base_insn' arg. + (cgen_opcode_table): Update type of dis_hash fn. + (extract_operand): Update type of `insn_value' arg. + +Thu Oct 29 11:38:36 1998 Doug Evans + + * cgen.h (CGEN_VERSION_{MAJOR,MINOR,FIXLEVEL}): Delete. + +Tue Oct 27 08:57:59 1998 Gavin Romig-Koch + + * mips.h (INSN_MULT): Added. + +Tue Oct 20 11:31:34 1998 Alan Modra + + * i386.h (MAX_MNEM_SIZE): Rename from MAX_OPCODE_SIZE. + +Mon Oct 19 12:50:00 1998 Doug Evans + + * cgen.h (CGEN_INSN_INT): New typedef. + (CGEN_INT_INSN_P): Renamed from CGEN_INT_INSN. + (CGEN_INSN_BYTES): Renamed from cgen_insn_t. + (CGEN_INSN_BYTES_PTR): New typedef. + (CGEN_EXTRACT_INFO): New typedef. + (cgen_insert_fn,cgen_extract_fn): Update. + (cgen_opcode_table): New member `insn_endian'. + (assemble_insn,lookup_insn,lookup_get_insn_operands): Update. + (insert_operand,extract_operand): Update. + (cgen_get_insn_value,cgen_put_insn_value): Add prototypes. + +Fri Oct 9 13:38:13 1998 Doug Evans + + * cgen.h (CGEN_ATTR_BOOLS): New macro. + (struct CGEN_HW_ENTRY): New member `attrs'. + (CGEN_HW_ATTR): New macro. + (struct CGEN_OPERAND_INSTANCE): New member `name'. + (CGEN_INSN_INVALID_P): New macro. + +Mon Oct 5 00:21:07 1998 Jeffrey A Law (law@cygnus.com) + + * hppa.h: Add "fid". + +Sun Oct 4 21:00:00 1998 Alan Modra + + From Robert Andrew Dale + * i386.h (i386_optab): Add AMD 3DNow! instructions. + (AMD_3DNOW_OPCODE): Define. + +Tue Sep 22 17:53:47 1998 Nick Clifton + + * d30v.h (EITHER_BUT_PREFER_MU): Define. + +Mon Aug 10 14:09:38 1998 Doug Evans + + * cgen.h (cgen_insn): #if 0 out element `cdx'. + +Mon Aug 3 12:21:57 1998 Doug Evans + + Move all global state data into opcode table struct, and treat + opcode table as something that is "opened/closed". + * cgen.h (CGEN_OPCODE_DESC): New type. + (all fns): New first arg of opcode table descriptor. + (cgen_set_parse_operand_fn): Add prototype. + (cgen_current_machine,cgen_current_endian): Delete. + (CGEN_OPCODE_TABLE): New members mach,endian,operand_table, + parse_operand_fn,asm_hash_table,asm_hash_table_entries, + dis_hash_table,dis_hash_table_entries. + (opcode_open,opcode_close): Add prototypes. + + * cgen.h (cgen_insn): New element `cdx'. + +Thu Jul 30 21:44:25 1998 Frank Ch. Eigler + + * d30v.h (FLAG_LKR): New flag for "left-kills-right" instructions. + +Tue Jul 28 10:59:07 1998 Jeffrey A Law (law@cygnus.com) + + * mn10300.h: Add "no_match_operands" field for instructions. + (MN10300_MAX_OPERANDS): Define. + +Fri Jul 24 11:44:24 1998 Doug Evans + + * cgen.h (cgen_macro_insn_count): Declare. + +Tue Jul 21 13:12:13 1998 Doug Evans + + * cgen.h (CGEN_VERSION_{MAJOR,MINOR,FIXLEVEL}): Define. + (cgen_insert_fn,cgen_extract_fn): New arg `pc'. + (get_operand,put_operand): Replaced with get_{int,vma}_operand, + set_{int,vma}_operand. + +Fri Jun 26 11:09:06 1998 Jeffrey A Law (law@cygnus.com) + + * mn10300.h: Add "machine" field for instructions. + (MN103, AM30): Define machine types. + +Fri Jun 19 16:09:09 1998 Alan Modra + + * i386.h: Use FP, not sl_Suf, for fxsave and fxrstor. + +1998-06-18 Ulrich Drepper + + * i386.h: Add support for fxsave, fxrstor, sysenter and sysexit. + +Sat Jun 13 11:31:35 1998 Alan Modra + + * i386.h (i386_optab): Add general form of aad and aam. Add ud2a + and ud2b. + (i386_regtab): Allow cr0..7, db0..7, dr0..7, tr0..7, not just + those that happen to be implemented on pentiums. + +Tue Jun 9 12:16:01 1998 Alan Modra + + * i386.h: Change occurences of Data16 to Size16, Data32 to Size32, + IgnoreDataSize to IgnoreSize. Flag address and data size prefixes + with Size16|IgnoreSize or Size32|IgnoreSize. + +Mon Jun 8 12:15:52 1998 Alan Modra + + * i386.h (REPNE): Rename to REPNE_PREFIX_OPCODE. + (REPE): Rename to REPE_PREFIX_OPCODE. + (i386_regtab_end): Remove. + (i386_prefixtab, i386_prefixtab_end): Remove. + (i386_optab): Use NULL as sentinel rather than "" to suit rewrite + of md_begin. + (MAX_OPCODE_SIZE): Define. + (i386_optab_end): Remove. + (sl_Suf): Define. + (sl_FP): Use sl_Suf. + + * i386.h (i386_optab): Allow 16 bit displacement for `mov + mem,acc'. Combine 16 and 32 bit forms of various insns. Allow 16 + bit form of ljmp. Add IsPrefix modifier to prefixes. Add addr32, + data32, dword, and adword prefixes. + (i386_regtab): Add BaseIndex modifier to valid 16 bit base/index + regs. + +Fri Jun 5 23:42:43 1998 Alan Modra + + * i386.h (i386_regtab): Remove BaseIndex modifier from esp. + + * i386.h: Allow `l' suffix on fld, fst, fstp, fcom, fcomp with + register operands, because this is a common idiom. Flag them with + a warning. Allow illegal faddp, fsubp, fsubrp, fmulp, fdivp, + fdivrp because gcc erroneously generates them. Also flag with a + warning. + + * i386.h: Add suffix modifiers to most insns, and tighter operand + checks in some cases. Fix a number of UnixWare compatibility + issues with float insns. Merge some floating point opcodes, using + new FloatMF modifier. + (WORD_PREFIX_OPCODE): Rename to DATA_PREFIX_OPCODE for + consistency. + + * i386.h: Change occurence of ShortformW to W|ShortForm. Add + IgnoreDataSize where appropriate. + +Wed Jun 3 18:28:45 1998 Alan Modra + + * i386.h: (one_byte_segment_defaults): Remove. + (two_byte_segment_defaults): Remove. + (i386_regtab): Add BaseIndex to 32 bit regs reg_type. + +Fri May 15 15:59:04 1998 Doug Evans + + * cgen.h (cgen_hw_lookup_by_name): Renamed from cgen_hw_lookup. + (cgen_hw_lookup_by_num): Declare. + +Thu May 7 09:27:58 1998 Frank Ch. Eigler + + * mips.h (OP_{SH,MASK}_CODE2): Added "q" operand format for lower + ten bits of MIPS ISA1 "break" instruction, and for "sdbbp" + +Thu May 7 02:14:08 1998 Doug Evans + + * cgen.h (cgen_asm_init_parse): Delete. + (cgen_save_fixups,cgen_restore_fixups,cgen_swap_fixups): Delete. + (cgen_asm_record_register,cgen_asm_finish_insn): Delete. + +Mon Apr 27 10:13:11 1998 Doug Evans + + * cgen.h (CGEN_ATTR_TYPE): Delete `const', moved to uses. + (cgen_asm_finish_insn): Update prototype. + (cgen_insn): New members num, data. + (CGEN_INSN_TABLE): Members asm_hash, asm_hash_table_size, + dis_hash, dis_hash_table_size moved to ... + (CGEN_OPCODE_TABLE). Here. Renamed from CGEN_OPCODE_DATA. + All uses updated. New members asm_hash_p, dis_hash_p. + (CGEN_MINSN_EXPANSION): New struct. + (cgen_expand_macro_insn): Declare. + (cgen_macro_insn_count): Declare. + (get_insn_operands): Update prototype. + (lookup_get_insn_operands): Declare. + +Tue Apr 21 17:11:32 1998 Alan Modra + + * i386.h (i386_optab): Change iclrKludge and imulKludge to + regKludge. Add operands types for string instructions. + +Mon Apr 20 14:40:29 1998 Tom Tromey + + * i386.h (X): Renamed from `Z_' to preserve formatting of opcode + table. + +Sun Apr 19 13:54:06 1998 Tom Tromey + + * i386.h (Z_): Renamed from `_' to avoid clash with common alias + for `gettext'. + +Fri Apr 3 12:04:48 1998 Alan Modra + + * i386.h: Remove NoModrm flag from all insns: it's never checked. + Add IsString flag to string instructions. + (IS_STRING): Don't define. + (LOCK_PREFIX_OPCODE, CS_PREFIX_OPCODE, DS_PREFIX_OPCODE): Define. + (ES_PREFIX_OPCODE, FS_PREFIX_OPCODE, GS_PREFIX_OPCODE): Define. + (SS_PREFIX_OPCODE): Define. + +Mon Mar 30 21:31:56 1998 Ian Lance Taylor + + * i386.h: Revert March 24 patch; no more LinearAddress. + +Mon Mar 30 10:25:54 1998 Alan Modra + + * i386.h (i386_optab): Remove fwait (9b) from all floating point + instructions, and instead add FWait opcode modifier. Add short + form of fldenv and fstenv. + (FWAIT_OPCODE): Define. + + * i386.h (i386_optab): Change second operand constraint of `mov + sreg,reg|mem' instruction from Reg16|Mem to WordReg|WordMem to + allow legal instructions such as `movl %gs,%esi' + +Fri Mar 27 18:30:52 1998 Ian Lance Taylor + + * h8300.h: Various changes to fully bracket initializers. + +Tue Mar 24 18:32:47 1998 H.J. Lu + + * i386.h: Set LinearAddress for lidt and lgdt. + +Mon Mar 2 10:44:07 1998 Doug Evans + + * cgen.h (CGEN_BOOL_ATTR): New macro. + +Thu Feb 26 15:54:31 1998 Michael Meissner + + * d30v.h (FLAG_DELAY): New flag for delayed branches/jumps. + +Mon Feb 23 10:38:21 1998 Doug Evans + + * cgen.h (CGEN_CAT3): Delete. Use CONCAT3 now. + (cgen_insn): Record syntax and format entries here, rather than + separately. + +Tue Feb 17 21:42:56 1998 Nick Clifton + + * cgen.h (CGEN_SYNTAX_MAKE_FIELD): New macro. + +Tue Feb 17 16:00:56 1998 Doug Evans + + * cgen.h (cgen_insert_fn): Change type of result to const char *. + (cgen_parse_{signed,unsigned}_integer): Delete min,max arguments. + (CGEN_{INSN,KEYWORD,OPERAND}_NBOOL_ATTRS): Renamed from ..._MAX_ATTRS. + +Thu Feb 12 18:30:41 1998 Doug Evans + + * cgen.h (lookup_insn): New argument alias_p. + +Thu Feb 12 03:41:00 1998 J"orn Rennecke + +Fix rac to accept only a0: + * d10v.h (OPERAND_ACC): Split into: + (OPERAND_ACC0, OPERAND_ACC1) . + (OPERAND_GPR): Define. + +Wed Feb 11 17:31:53 1998 Doug Evans + + * cgen.h (CGEN_FIELDS): Define here. + (CGEN_HW_ENTRY): New member `type'. + (hw_list): Delete decl. + (enum cgen_mode): Declare. + (CGEN_OPERAND): New member `hw'. + (enum cgen_operand_instance_type): Declare. + (CGEN_OPERAND_INSTANCE): New type. + (CGEN_INSN): New member `operands'. + (CGEN_OPCODE_DATA): Make hw_list const. + (get_insn_operands,lookup_insn): Add prototypes for. + +Tue Feb 3 17:11:23 1998 Doug Evans + + * cgen.h (CGEN_INSN_MAX_ATTRS): Renamed from CGEN_MAX_INSN_ATTRS. + (CGEN_HW_ENTRY): Move `next' entry to end of struct. + (CGEN_KEYWORD_MAX_ATTRS): Renamed from CGEN_MAX_KEYWORD_ATTRS. + (CGEN_OPERAND_MAX_ATTRS): Renamed from CGEN_MAX_OPERAND_ATTRS. + +Mon Feb 2 19:19:15 1998 Ian Lance Taylor + + * cgen.h: Correct typo in comment end marker. + +Mon Feb 2 17:10:38 1998 Steve Haworth + + * tic30.h: New file. + +Thu Jan 22 17:54:56 1998 Nick Clifton + + * cgen.h: Add prototypes for cgen_save_fixups(), + cgen_restore_fixups(), and cgen_swap_fixups(). Change prototype + of cgen_asm_finish_insn() to return a char *. + +Wed Jan 14 17:21:43 1998 Nick Clifton + + * cgen.h: Formatting changes to improve readability. + +Mon Jan 12 11:37:36 1998 Doug Evans + + * cgen.h (*): Clean up pass over `struct foo' usage. + (CGEN_ATTR): Make unsigned char. + (CGEN_ATTR_TYPE): Update. + (CGEN_ATTR_{ENTRY,TABLE}): New types. + (cgen_base): Move member `attrs' to cgen_insn. + (CGEN_KEYWORD): New member `null_entry'. + (CGEN_{SYNTAX,FORMAT}): New types. + (cgen_insn): Format and syntax separated from each other. + +Tue Dec 16 15:15:52 1997 Michael Meissner + + * d30v.h (d30v_opcode): Reorder flags somewhat, add new flags for + 2 word load/store, ADDppp/SUBppp, 16/32 bit multiply. Make + flags_{used,set} long. + (d30v_operand): Make flags field long. + +Mon Dec 1 12:24:44 1997 Andreas Schwab + + * m68k.h: Fix comment describing operand types. + +Sun Nov 23 22:31:27 1997 Michael Meissner + + * d30v.h (SHORT_CMPU): Add case for cmpu instruction, and move + everything else after down. + +Tue Nov 18 18:45:14 1997 J"orn Rennecke + + * d10v.h (OPERAND_FLAG): Split into: + (OPERAND_FFLAG, OPERAND_CFLAG) . + +Thu Nov 13 11:04:24 1997 Gavin Koch + + * mips.h (struct mips_opcode): Changed comments to reflect new + field usage. + +Fri Oct 24 22:36:20 1997 Ken Raeburn + + * mips.h: Added to comments a quick-ref list of all assigned + operand type characters. + (OP_{MASK,SH}_PERFREG): New macros. + +Wed Oct 22 17:28:33 1997 Richard Henderson + + * sparc.h: Add '_' and '/' for v9a asr's. + Patch from David Miller + +Tue Oct 14 13:22:29 1997 Jeffrey A Law (law@cygnus.com) + + * h8300.h: Bit ops with absolute addresses not in the 8 bit + area are not available in the base model (H8/300). + +Thu Sep 25 13:03:41 1997 Ian Lance Taylor + + * m68k.h: Remove documentation of ` operand specifier. + +Wed Sep 24 19:00:34 1997 Ian Lance Taylor + + * m68k.h: Document q and v operand specifiers. + +Mon Sep 15 18:28:37 1997 Nick Clifton + + * v850.h (struct v850_opcode): Add processors field. + (PROCESSOR_V850, PROCESSOR_ALL): New bit constants. + (PROCESSOR_V850E, PROCESSOR_NOT_V850): New bit constants. + (PROCESSOR_V850EA): New bit constants. + +Mon Sep 15 11:29:43 1997 Ken Raeburn + + Merge changes from Martin Hunt: + + * d30v.h: Allow up to 64 control registers. Add + SHORT_A5S format. + + * d30v.h (LONG_Db): New form for delayed branches. + + * d30v.h: (LONG_Db): New form for repeati. + + * d30v.h (SHORT_D2B): New form. + + * d30v.h (SHORT_A2): New form. + + * d30v.h (OPERAND_2REG): Add new operand to indicate 2 + registers are used. Needed for VLIW optimization. + +Mon Sep 8 14:05:45 1997 Doug Evans + + * cgen.h: Move assembler interface section + up so cgen_parse_operand_result is defined for cgen_parse_address. + (cgen_parse_address): Update prototype. + +Tue Sep 2 15:32:32 1997 Nick Clifton + + * v850.h (V850_OPREAND_ADJUST_SHORT_MEMORY): Removed. + +Tue Aug 26 12:21:52 1997 Ian Lance Taylor + + * i386.h (two_byte_segment_defaults): Correct base register 5 in + modes 1 and 2 to be ss rather than ds. From Gabriel Paubert + . + + * i386.h: Set ud2 to 0x0f0b. From Gabriel Paubert + . + + * i386.h: Comment fixes for ficom[p]?{s,l} from Gabriel Paubert + . + + * i386.h (JUMP_ON_CX_ZERO): Uncomment (define again). + (JUMP_ON_ECX_ZERO): Remove commented out macro. + +Fri Aug 22 10:38:29 1997 Nick Clifton + + * v850.h (V850_NOT_R0): New flag. + +Mon Aug 18 11:05:58 1997 Nick Clifton + + * v850.h (struct v850_opcode): Remove flags field. + +Wed Aug 13 18:45:48 1997 Nick Clifton + + * v850.h (struct v850_opcode): Add flags field. + (struct v850_operand): Extend meaning of 'bits' and 'shift' + fields. + (V850E_INSTRUCTION, V850EA_INSTRUCTION): New flags. + (V850E_PUSH_POP, V850E_IMMEDIATE16, V850E_IMMEDIATE32): New flags. + +Fri Aug 8 16:58:42 1997 Doug Evans + + * arc.h: New file. + +Thu Jul 24 21:16:58 1997 Doug Evans + + * sparc.h (sparc_opcodes): Declare as const. + +Thu Jul 10 12:53:25 1997 Jeffrey A Law (law@cygnus.com) + + * mips.h (FP_S, FP_D): Define. Bitmasks indicating if an insn + uses single or double precision floating point resources. + (INSN_NO_ISA, INSN_ISA1): Define. + (cpu specific INSN macros): Tweak into bitmasks outside the range + of INSN_ISA field. + +Mon Jun 16 14:10:00 1997 H.J. Lu + + * i386.h: Fix pand opcode. + +Mon Jun 2 11:35:09 1997 Gavin Koch + + * mips.h: Widen INSN_ISA and move it to a more convenient + bit position. Add INSN_3900. + +Tue May 20 11:25:29 1997 Gavin Koch + + * mips.h (struct mips_opcode): added new field membership. + +Mon May 12 16:26:50 1997 H.J. Lu + + * i386.h (movd): only Reg32 is allowed. + + * i386.h: add fcomp and ud2. From Wayne Scott + . + +Mon May 5 17:16:21 1997 Ian Lance Taylor + + * i386.h: Add MMX instructions. + +Mon May 5 12:45:19 1997 H.J. Lu + + * i386.h: Remove W modifier from conditional move instructions. + +Mon Apr 14 14:56:58 1997 Ian Lance Taylor + + * i386.h: Change the opcodes for fsubp, fsubrp, fdivp, and fdivrp + with no arguments to match that generated by the UnixWare + assembler. + +Thu Apr 10 14:35:00 1997 Doug Evans + + * cgen.h (_cgen_assemble_insn): New arg for errmsg. + (cgen_parse_operand_fn): Declare. + (cgen_init_parse_operand): Declare. + (cgen_parse_operand): Renamed from cgen_asm_parse_operand, + new argument `want'. + (enum cgen_parse_operand_result): Renamed from cgen_asm_result. + (enum cgen_parse_operand_type): New enum. + +Sat Apr 5 13:14:05 1997 Ian Lance Taylor + + * i386.h: Revert last patch for the NON_BROKEN_OPCODES cases. + +Fri Apr 4 11:46:11 1997 Doug Evans + + * cgen.h: New file. + +Fri Apr 4 14:02:32 1997 Ian Lance Taylor + + * i386.h: Correct opcode values for fsubp, fsubrp, fdivp, and + fdivrp. + +Tue Mar 25 22:57:26 1997 Stu Grossman (grossman@critters.cygnus.com) + + * v850.h (extract): Make unsigned. + +Mon Mar 24 14:38:15 1997 Ian Lance Taylor + + * i386.h: Add iclr. + +Thu Mar 20 19:49:10 1997 Ian Lance Taylor + + * i386.h: Change DW to W for cmpxchg and xadd, since they don't + take a direction bit. + +Sat Mar 15 19:03:29 1997 H.J. Lu + + * sparc.h (sparc_opcode_lookup_arch): Use full prototype. + +Fri Mar 14 15:22:01 1997 Ian Lance Taylor + + * sparc.h: Include . Update function declarations to + use prototypes, and to use const when appropriate. + +Thu Mar 6 14:18:30 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_RELAX): Define. + +Mon Feb 24 15:15:56 1997 Martin M. Hunt + + * d10v.h: Change pre_defined_registers to + d10v_predefined_registers and reg_name_cnt to d10v_reg_name_cnt. + +Sat Feb 22 21:25:00 1997 Dawn Perchik + + * mips.h: Add macros for cop0, cop1 cop2 and cop3. + Change mips_opcodes from const array to a pointer, + and change bfd_mips_num_opcodes from const int to int, + so that we can increase the size of the mips opcodes table + dynamically. + +Fri Feb 21 16:34:18 1997 Martin M. Hunt + + * d30v.h (FLAG_X): Remove unused flag. + +Tue Feb 18 17:37:20 1997 Martin M. Hunt + + * d30v.h: New file. + +Fri Feb 14 13:16:15 1997 Fred Fish + + * tic80.h (PDS_NAME): Macro to access name field of predefined symbols. + (PDS_VALUE): Macro to access value field of predefined symbols. + (tic80_next_predefined_symbol): Add prototype. + +Mon Feb 10 10:32:17 1997 Fred Fish + + * tic80.h (tic80_symbol_to_value): Change prototype to match + change in function, added class parameter. + +Thu Feb 6 17:30:15 1997 Fred Fish + + * tic80.h (TIC80_OPERAND_ENDMASK): Add for flagging TIc80 + endmask fields, which are somewhat weird in that 0 and 32 are + treated exactly the same. + +Thu Jan 30 13:46:18 1997 Fred Fish + + * tic80.h: Change all the OPERAND defines to use the form (1 << X) + rather than a constant that is 2**X. Reorder them to put bits for + operands that have symbolic names in the upper bits, so they can + be packed into an int where the lower bits contain the value that + corresponds to that symbolic name. + (predefined_symbo): Add struct. + (tic80_predefined_symbols): Declare array of translations. + (tic80_num_predefined_symbols): Declare size of that array. + (tic80_value_to_symbol): Declare function. + (tic80_symbol_to_value): Declare function. + +Wed Jan 29 09:37:25 1997 Jeffrey A Law (law@cygnus.com) + + * mn10200.h (MN10200_OPERAND_RELAX): Define. + +Sat Jan 18 15:18:59 1997 Fred Fish + + * tic80.h (TIC80_NO_R0_DEST): Add for opcodes where r0 cannot + be the destination register. + +Thu Jan 16 20:48:55 1997 Fred Fish + + * tic80.h (struct tic80_opcode): Change "format" field to "flags". + (FMT_UNUSED, FMT_SI, FMT_LI, FMT_REG): Delete. + (TIC80_VECTOR): Define a flag bit for the flags. This one means + that the opcode can have two vector instructions in a single + 32 bit word and we have to encode/decode both. + +Tue Jan 14 19:37:09 1997 Fred Fish + + * tic80.h (TIC80_OPERAND_PCREL): Renamed from + TIC80_OPERAND_RELATIVE for PC relative. + (TIC80_OPERAND_BASEREL): New flag bit for register + base relative. + +Mon Jan 13 15:56:38 1997 Fred Fish + + * tic80.h (TIC80_OPERAND_FLOAT): Add for floating point operands. + +Mon Jan 6 10:51:15 1997 Fred Fish + + * tic80.h (TIC80_OPERAND_SCALED): Operand may have optional + ":s" modifier for scaling. + +Sun Jan 5 12:12:19 1997 Fred Fish + + * tic80.h (TIC80_OPERAND_M_SI): Add operand modifier for ":m". + (TIC80_OPERAND_M_LI): Ditto + +Sat Jan 4 19:02:44 1997 Fred Fish + + * tic80.h (TIC80_OPERAND_BITNUM): Renamed from TIC80_OPERAND_CC_SZ. + (TIC80_OPERAND_CC): New define for condition code operand. + (TIC80_OPERAND_CR): New define for control register operand. + +Fri Jan 3 16:22:23 1997 Fred Fish + + * tic80.h (struct tic80_opcode): Name changed. + (struct tic80_opcode): Remove format field. + (struct tic80_operand): Add insertion and extraction functions. + (TIC80_OPERAND_*): Remove old bogus values, start adding new + correct ones. + (FMT_*): Ditto. + +Tue Dec 31 15:05:41 1996 Michael Meissner + + * v850.h (V850_OPERAND_ADJUST_SHORT_MEMORY): New flag to adjust + type IV instruction offsets. + +Fri Dec 27 22:23:10 1996 Fred Fish + + * tic80.h: New file. + +Wed Dec 18 10:06:31 1996 Jeffrey A Law (law@cygnus.com) + + * mn10200.h (MN10200_OPERAND_NOCHECK): Define. + +Sat Dec 14 10:48:31 1996 Fred Fish + + * mn10200.h: Fix comment, mn10200_operand not powerpc_operand. + * mn10300.h: Fix comment, mn10300_operand not powerpc_operand. + * v850.h: Fix comment, v850_operand not powerpc_operand. + +Mon Dec 9 16:45:39 1996 Jeffrey A Law (law@cygnus.com) + + * mn10200.h: Flesh out structures and definitions needed by + the mn10200 assembler & disassembler. + +Tue Nov 26 10:46:56 1996 Ian Lance Taylor + + * mips.h: Add mips16 definitions. + +Mon Nov 25 17:56:54 1996 J.T. Conklin + + * m68k.h: Document new <, >, m, n, o and p operand specifiers. + +Wed Nov 20 10:59:41 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_PCREL): Define. + (MN10300_OPERAND_MEMADDR): Define. + +Tue Nov 19 13:30:40 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_REG_LIST): Define. + +Wed Nov 6 13:41:08 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_SPLIT): Define. + +Tue Nov 5 13:26:12 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_EXTENDED): Define. + +Mon Nov 4 12:52:48 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_REPEATED): Define. + +Fri Nov 1 10:31:02 1996 Richard Henderson + + * alpha.h: Don't include "bfd.h"; private relocation types are now + negative to minimize problems with shared libraries. Organize + instruction subsets by AMASK extensions and PALcode + implementation. + (struct alpha_operand): Move flags slot for better packing. + +Tue Oct 29 12:19:10 1996 Jeffrey A Law (law@cygnus.com) + + * v850.h (V850_OPERAND_RELAX): New operand flag. + +Thu Oct 10 14:29:11 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (FMT_*): Move operand format definitions + here. + +Tue Oct 8 14:48:07 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (MN10300_OPERAND_PAREN): Define. + +Mon Oct 7 16:52:11 1996 Jeffrey A Law (law@cygnus.com) + + * mn10300.h (mn10300_opcode): Add "format" field. + (MN10300_OPERAND_*): Define. + +Thu Oct 3 10:33:46 1996 Jeffrey A Law (law@cygnus.com) + + * mn10x00.h: Delete. + * mn10200.h, mn10300.h: New files. + +Wed Oct 2 21:31:26 1996 Jeffrey A Law (law@cygnus.com) + + * mn10x00.h: New file. + +Fri Sep 27 18:26:46 1996 Stu Grossman (grossman@critters.cygnus.com) + + * v850.h: Add new flag to indicate this instruction uses a PC + displacement. + +Fri Sep 13 14:58:13 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (stmac): Add missing instruction. + +Sat Aug 31 16:02:03 1996 Jeffrey A Law (law@cygnus.com) + + * v850.h (v850_opcode): Remove "size" field. Add "memop" + field. + +Fri Aug 23 10:39:08 1996 Jeffrey A Law (law@cygnus.com) + + * v850.h (V850_OPERAND_EP): Define. + + * v850.h (v850_opcode): Add size field. + +Thu Aug 22 16:51:25 1996 J.T. Conklin + + * v850.h (v850_operands): Add insert and extract fields, pointers + to functions used to handle unusual operand encoding. + (V850_OPERAND_REG, V850_OPERAND_SRG, V850_OPERAND_CC, + V850_OPERAND_SIGNED): Defined. + +Wed Aug 21 17:45:10 1996 J.T. Conklin + + * v850.h (v850_operands): Add flags field. + (OPERAND_REG, OPERAND_NUM): Defined. + +Tue Aug 20 14:52:02 1996 J.T. Conklin + + * v850.h: New file. + +Fri Aug 16 14:44:15 1996 James G. Smith + + * mips.h (OP_SH_LOCC, OP_SH_HICC, OP_MASK_CC, OP_SH_COP1NORM, + OP_MASK_COP1NORM, OP_SH_COP1SPEC, OP_MASK_COP1SPEC, + OP_MASK_COP1SCLR, OP_MASK_COP1CMP, OP_SH_COP1CMP, OP_SH_FORMAT, + OP_MASK_FORMAT, OP_SH_TRUE, OP_MASK_TRUE, OP_SH_GE, OP_MASK_GE, + OP_SH_UNSIGNED, OP_MASK_UNSIGNED, OP_SH_HINT, OP_MASK_HINT): + Defined. + +Fri Aug 16 00:15:15 1996 Jeffrey A Law (law@cygnus.com) + + * hppa.h (pitlb, pitlbe, iitlba, iitlbp, fic, fice): Accept + a 3 bit space id instead of a 2 bit space id. + +Thu Aug 15 13:11:46 1996 Martin M. Hunt + + * d10v.h: Add some additional defines to support the + assembler in determining which operations can be done in parallel. + +Tue Aug 6 11:13:22 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (SN): Define. + (eepmov.b): Renamed from "eepmov" + (nop, bpt, rte, rts, sleep, clrmac): These have no size associated + with them. + +Fri Jul 26 11:47:10 1996 Martin M. Hunt + + * d10v.h (OPERAND_SHIFT): New operand flag. + +Thu Jul 25 12:06:22 1996 Martin M. Hunt + + * d10v.h: Changes for divs, parallel-only instructions, and + signed numbers. + +Mon Jul 22 11:21:15 1996 Martin M. Hunt + + * d10v.h (pd_reg): Define. Putting the definition here allows + the assembler and disassembler to share the same struct. + +Mon Jul 22 12:15:25 1996 Ian Lance Taylor + + * i960.h (i960_opcodes): "halt" takes an argument. From Stephen + Williams . + +Wed Jul 17 14:46:38 1996 Martin M. Hunt + + * d10v.h: New file. + +Thu Jul 11 12:09:15 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (band, bclr): Force high bit of immediate nibble to zero. + +Wed Jul 3 14:30:12 1996 J.T. Conklin + + * m68k.h (mcf5200): New macro. + Document names of coldfire control registers. + +Tue Jul 2 23:05:45 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (SRC_IN_DST): Define. + + * h8300.h (UNOP3): Mark the register operand in this insn + as a source operand, not a destination operand. + (SHIFT_2, SHIFT_IMM): Remove. Eliminate all references. + (UNOP3): Change SHIFT_IMM to IMM for H8/S bitops. Mark + register operand with SRC_IN_DST. + +Fri Jun 21 13:52:17 1996 Richard Henderson + + * alpha.h: New file. + +Thu Jun 20 15:02:57 1996 Ian Lance Taylor + + * rs6k.h: Remove obsolete file. + +Wed Jun 19 15:29:38 1996 Ian Lance Taylor + + * i386.h: Correct opcode values for faddp, fsubp, fsubrp, fmulp, + fdivp, and fdivrp. Add ffreep. + +Tue Jun 18 16:06:00 1996 Jeffrey A. Law + + * h8300.h: Reorder various #defines for readability. + (ABS32SRC, ABS32DST, DSP32LIST, ABS32LIST, A32LIST): Define. + (BITOP): Accept additional (unused) argument. All callers changed. + (EBITOP): Likewise. + (O_LAST): Bump. + (ldc, stc, movb, movw, movl): Use 32bit offsets and absolutes. + + * h8300.h (EXR, SHIFT_2, MACREG, SHIFT_IMM, RDINC): Define. + (O_TAS, O_CLRMAC, O_LDMAC, O_MAC, O_LDM, O_STM): Define. + (BITOP, EBITOP): Handle new H8/S addressing modes for + bit insns. + (UNOP3): Handle new shift/rotate insns on the H8/S. + (insns using exr): New instructions. + (tas, mac, ldmac, clrmac, ldm, stm): New instructions. + +Thu May 23 16:56:48 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (add.l): Undo Apr 5th change. The manual I had + was incorrect. + +Mon May 6 23:38:22 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (START): Remove. + (MEMRELAX): Define. Mark absolute memory operands in mov.b, mov.w + and mov.l insns that can be relaxed. + +Tue Apr 30 18:30:58 1996 Ian Lance Taylor + + * i386.h: Remove Abs32 from lcall. + +Mon Apr 22 17:09:23 1996 Doug Evans + + * sparc.h (SPARC_OPCODE_ARCH_V9_P): New macro. + (SLCPOP): New macro. + Mark X,Y opcode letters as in use. + +Thu Apr 11 17:28:18 1996 Ian Lance Taylor + + * sparc.h (F_FLOAT, F_FBR): Define. + +Fri Apr 5 16:55:34 1996 Jeffrey A Law (law@cygnus.com) + + * h8300.h (ABS8MEM): Renamed from ABSMOV. Remove ABSMOV + from all insns. + (ABS8SRC,ABS8DST): Add ABS8MEM. + (add.l): Fix reg+reg variant. + (eepmov.w): Renamed from eepmovw. + (ldc,stc): Fix many cases. + +Sun Mar 31 13:30:03 1996 Doug Evans + + * sparc.h (SPARC_OPCODE_ARCH_MASK): New macro. + +Thu Mar 7 15:08:23 1996 Doug Evans + + * sparc.h (O): Mark operand letter as in use. + +Tue Feb 20 20:46:21 1996 Doug Evans + + * sparc.h (sparc_{encode,decode}_sparclet_cpreg): Declare. + Mark operand letters uU as in use. + +Mon Feb 19 01:59:08 1996 Doug Evans + + * sparc.h (sparc_opcode_arch_val): Add SPARC_OPCODE_ARCH_SPARCLET. + (sparc_opcode_arch): Delete member `conflicts'. Add `supported'. + (SPARC_OPCODE_SUPPORTED): New macro. + (SPARC_OPCODE_CONFLICT_P): Rewrite. + (F_NOTV9): Delete. + +Fri Feb 16 12:23:34 1996 Jeffrey A Law (law@cygnus.com) + + * sparc.h (sparc_opcode_lookup_arch) Make return type in + declaration consistent with return type in definition. + +Wed Feb 14 18:14:11 1996 Alan Modra + + * i386.h (i386_optab): Remove Data32 from pushf and popf. + +Thu Feb 8 14:27:21 1996 James Carlson + + * i386.h (i386_regtab): Add 80486 test registers. + +Mon Feb 5 18:35:46 1996 Ian Lance Taylor + + * i960.h (I_HX): Define. + (i960_opcodes): Add HX instruction. + +Mon Jan 29 12:43:39 1996 Ken Raeburn + + * i386.h: Fix waiting forms of finit, fstenv, fsave, fstsw, fstcw, + and fclex. + +Wed Jan 24 22:36:59 1996 Doug Evans + + * sparc.h (enum sparc_opcode_arch_val): Replaces sparc_architecture. + (SPARC_OPCODE_CONFLICT_P): Renamed from ARCHITECTURES_CONFLICT_P. + (bfd_* defines): Delete. + (sparc_opcode_archs): Replaces architecture_pname. + (sparc_opcode_lookup_arch): Declare. + (NUMOPCODES): Delete. + +Mon Jan 22 08:24:32 1996 Doug Evans + + * sparc.h (enum sparc_architecture): Add v9a. + (ARCHITECTURES_CONFLICT_P): Update. + +Thu Dec 28 13:27:53 1995 John Hassey + + * i386.h: Added Pentium Pro instructions. + +Thu Nov 2 22:59:22 1995 Ian Lance Taylor + + * m68k.h: Document new 'W' operand place. + +Tue Oct 24 10:49:10 1995 Jeffrey A Law (law@cygnus.com) + + * hppa.h: Add lci and syncdma instructions. + +Mon Oct 23 11:09:16 1995 James G. Smith + + * mips.h: Added INSN_4100 flag to mark NEC VR4100 specific + instructions. + +Mon Oct 16 10:28:15 1995 Michael Meissner + + * ppc.h (PPC_OPCODE_{COMMON,ANY}): New opcode flags for + assembler's -mcom and -many switches. + +Wed Oct 11 16:56:33 1995 Ken Raeburn + + * i386.h: Fix cmpxchg8b extension opcode description. + +Thu Oct 5 18:03:36 1995 Ken Raeburn + + * i386.h: Add Pentium instructions wrmsr, rdtsc, rdmsr, cmpxchg8b, + and register cr4. + +Tue Sep 19 15:26:43 1995 Ian Lance Taylor + + * m68k.h: Change comment: split type P into types 0, 1 and 2. + +Wed Aug 30 13:50:55 1995 Doug Evans + + * sparc.h (sparc_{encode,decode}_prefetch): Declare. + +Tue Aug 29 15:34:58 1995 Doug Evans + + * sparc.h (sparc_{encode,decode}_{asi,membar}): Declare. + +Wed Aug 2 18:32:19 1995 Ian Lance Taylor + + * m68kmri.h: Remove. + + * m68k.h: Move tables into opcodes/m68k-opc.c, leaving just the + declarations. Remove F_ALIAS and flag field of struct + m68k_opcode. Change arch field of struct m68k_opcode to unsigned + int. Make name and args fields of struct m68k_opcode const. + +Wed Aug 2 08:16:46 1995 Doug Evans + + * sparc.h (F_NOTV9): Define. + +Tue Jul 11 14:20:42 1995 Jeff Spiegel + + * mips.h (INSN_4010): Define. + +Wed Jun 21 18:49:51 1995 Ken Raeburn + + * m68k.h (TBL1): Reverse sense of "round" argument in result. + + Changes from Andreas Schwab : + * m68k.h: Fix argument descriptions of coprocessor + instructions to allow only alterable operands where appropriate. + [!NO_DEFAULT_SIZES]: An omitted size defaults to `w'. + (m68k_opcode_aliases): Add more aliases. + +Fri Apr 14 22:15:34 1995 Ken Raeburn + + * m68k.h: Added explcitly short-sized conditional branches, and a + bunch of aliases (fmov*, ftest*, tdivul) to support gcc's + svr4-based configurations. + +Mon Mar 13 21:30:01 1995 Ken Raeburn + + Mon Feb 27 08:36:39 1995 Bryan Ford + * i386.h: added missing Data16/Data32 flags to a few instructions. + +Wed Mar 8 15:19:53 1995 Ian Lance Taylor + + * mips.h (OP_MASK_FR, OP_SH_FR): Define. + (OP_MASK_BCC, OP_SH_BCC): Define. + (OP_MASK_PREFX, OP_SH_PREFX): Define. + (OP_MASK_CCC, OP_SH_CCC): Define. + (INSN_READ_FPR_R): Define. + (INSN_RFE): Delete. + +Wed Mar 8 03:13:23 1995 Ken Raeburn + + * m68k.h (enum m68k_architecture): Deleted. + (struct m68k_opcode_alias): New type. + (m68k_opcodes): Now const. Deleted opcode aliases with exactly + matching constraints, values and flags. As a side effect of this, + the MOTOROLA_SYNTAX_ONLY and MIT_SYNTAX_ONLY macros, which so far + as I know were never used, now may need re-examining. + (numopcodes): Now const. + (m68k_opcode_aliases, numaliases): New variables. + (endop): Deleted. + [DONT_DEFINE_TABLE]: Declare numopcodes, numaliases, and + m68k_opcode_aliases; update declaration of m68k_opcodes. + +Mon Mar 6 10:02:00 1995 Jeff Law (law@snake.cs.utah.edu) + + * hppa.h (delay_type): Delete unused enumeration. + (pa_opcode): Replace unused delayed field with an architecture + field. + (pa_opcodes): Mark each instruction as either PA1.0 or PA1.1. + +Fri Mar 3 16:10:24 1995 Ian Lance Taylor + + * mips.h (INSN_ISA4): Define. + +Fri Feb 24 19:13:37 1995 Ian Lance Taylor + + * mips.h (M_DLA_AB, M_DLI): Define. + +Thu Feb 23 17:33:09 1995 Jeff Law (law@snake.cs.utah.edu) + + * hppa.h (fstwx): Fix single-bit error. + +Wed Feb 15 12:19:52 1995 Ian Lance Taylor + + * mips.h (M_ULD, M_ULD_A, M_USD, M_USD_A): Define. + +Mon Feb 6 10:35:23 1995 J.T. Conklin + + * i386.h: added cpuid instruction , and dr[0-7] aliases for the + debug registers. From Charles Hannum (mycroft@netbsd.org). + +Mon Feb 6 03:31:54 1995 Ken Raeburn + + Changes from Bryan Ford for 16-bit + i386 support: + * i386.h (MOV_AX_DISP32): New macro. + (i386_optab): Added Data16 and Data32 as needed. Added "w" forms + of several call/return instructions. + (ADDR_PREFIX_OPCODE): New macro. + +Mon Jan 23 16:45:43 1995 Ken Raeburn + + Sat Jan 21 17:50:38 1995 Pat Rankin (rankin@eql.caltech.edu) + + * vax.h (struct vot_wot, field `args'): Make it pointer to const + char. + (struct vot, field `name'): ditto. + +Thu Jan 19 14:47:53 1995 Ken Raeburn + + * vax.h: Supply and properly group all values in end sentinel. + +Tue Jan 17 10:55:30 1995 Ian Lance Taylor + + * mips.h (INSN_ISA, INSN_4650): Define. + +Wed Oct 19 13:34:17 1994 Ian Lance Taylor + + * a29k.h: Add operand type 'I' for `inv' and `iretinv'. On + systems with a separate instruction and data cache, such as the + 29040, these instructions take an optional argument. + +Wed Sep 14 17:44:20 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * mips.h (INSN_STORE_MEMORY): Correct value to not conflict with + INSN_TRAP. + +Tue Sep 6 11:39:08 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) + + * mips.h (INSN_STORE_MEMORY): Define. + +Thu Jul 28 19:28:07 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * sparc.h: Document new operand type 'x'. + +Tue Jul 26 17:48:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * i960.h (I_CX2): New instruction category. It includes + instructions available on Cx and Jx processors. + (I_JX): New instruction category, for JX-only instructions. + (i960_opcodes): Put eshro and sysctl in I_CX2 category. Added + Jx-only instructions, in I_JX category. + +Wed Jul 13 18:43:47 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * ns32k.h (endop): Made pointer const too. + +Sun Jul 10 11:01:09 1994 Ian Dall (dall@hfrd.dsto.gov.au) + + * ns32k.h: Drop Q operand type as there is no correct use + for it. Add I and Z operand types which allow better checking. + +Thu Jul 7 12:34:48 1994 Steve Chamberlain (sac@jonny.cygnus.com) + + * h8300.h (xor.l) :fix bit pattern. + (L_2): New size of operand. + (trapa): Use it. + +Fri Jun 10 16:38:11 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * m68k.h: Move "trap" before "tpcc" to change disassembly. + +Fri Jun 3 15:57:36 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * sparc.h: Include v9 definitions. + +Thu Jun 2 12:23:17 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * m68k.h (m68060): Defined. + (m68040up, mfloat, mmmu): Include it. + (struct m68k_opcode): Widen `arch' field. + (m68k_opcodes): Updated for M68060. Removed comments that were + instructions commented out by "JF" years ago. + +Thu Apr 28 18:31:14 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * m68k.h (struct m68k_opcode): Shorten `arch' field to 8 bits, and + add a one-bit `flags' field. + (F_ALIAS): New macro. + +Wed Apr 27 11:29:52 1994 Steve Chamberlain (sac@cygnus.com) + + * h8300.h (dec, inc): Get encoding right. + +Mon Apr 4 13:12:43 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ppc.h (struct powerpc_operand): Removed signedp field; just use + a flag instead. + (PPC_OPERAND_SIGNED): Define. + (PPC_OPERAND_SIGNOPT): Define. + +Thu Mar 31 19:34:08 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * i386.h (IS_JUMP_ON_ECX_ZERO, "jcxz" pattern): Operand size + prefix is 0x66, not 0x67. Patch from H.J. Lu (hlu@nynexst.com). + +Thu Mar 3 15:51:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * i386.h: Reverse last change. It'll be handled in gas instead. + +Thu Feb 24 15:29:05 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * i386.h (sar): Disabled the two-operand Imm1 form, since it was + slower on the 486 and used the implicit shift count despite the + explicit operand. The one-operand form is still available to get + the shorter form with the implicit shift count. + +Thu Feb 17 12:27:52 1994 Torbjorn Granlund (tege@mexican.cygnus.com) + + * hppa.h: Fix typo in fstws arg string. + +Wed Feb 9 21:23:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ppc.h (struct powerpc_opcode): Make operands field unsigned. + +Mon Feb 7 19:14:58 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ppc.h (PPC_OPCODE_601): Define. + +Fri Feb 4 23:43:50 1994 Jeffrey A. Law (law@snake.cs.utah.edu) + + * hppa.h (addb): Use '@' for addb and addib pseudo ops. + (so we can determine valid completers for both addb and addb[tf].) + + * hppa.h (xmpyu): No floating point format specifier for the + xmpyu instruction. + +Fri Feb 4 23:36:52 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ppc.h (PPC_OPERAND_NEXT): Define. + (PPC_OPERAND_NEGATIVE): Change value to make room for above. + (struct powerpc_macro): Define. + (powerpc_macros, powerpc_num_macros): Declare. + +Fri Jan 21 19:13:50 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * ppc.h: New file. Header file for PowerPC opcode table. + +Mon Jan 17 00:14:23 1994 Jeffrey A. Law (law@snake.cs.utah.edu) + + * hppa.h: More minor template fixes for sfu and copr (to allow + for easier disassembly). + + * hppa.h: Fix templates for all the sfu and copr instructions. + +Wed Dec 15 15:12:42 1993 Ken Raeburn (raeburn@cujo.cygnus.com) + + * i386.h (push): Permit Imm16 operand too. + +Sat Dec 11 16:14:06 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * h8300.h (andc): Exists in base arch. + +Wed Dec 1 12:15:32 1993 Jeffrey A. Law (law@snake.cs.utah.edu) + + * From Hisashi MINAMINO + * hppa.h: #undef NONE to avoid conflict with hiux include files. + +Sun Nov 21 22:06:57 1993 Jeffrey A. Law (law@snake.cs.utah.edu) + + * hppa.h: Add FP quadword store instructions. + +Wed Nov 17 17:13:16 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h: (M_J_A): Added. + (M_LA): Removed. + +Mon Nov 8 12:12:47 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (OP_MASK_CACHE, OP_SH_CACHE): Define. From Ted Lemon + . + +Sun Nov 7 00:30:11 1993 Jeffrey A. Law (law@snake.cs.utah.edu) + + * hppa.h: Immediate field in probei instructions is unsigned, + not low-sign extended. + +Wed Nov 3 10:30:00 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * m88k.h (RRI10MASK): Change from 0xfc00ffe0 to 0xfc00fc00. + +Tue Nov 2 12:41:30 1993 Ken Raeburn (raeburn@rover.cygnus.com) + + * i386.h: Add "fxch" without operand. + +Mon Nov 1 18:13:03 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (M_JAL_1, M_JAL_2, M_JAL_A): Added. + +Sat Oct 2 22:26:11 1993 Jeffrey A Law (law@snake.cs.utah.edu) + + * hppa.h: Add gfw and gfr to the opcode table. + +Wed Sep 29 16:23:00 1993 K. Richard Pixley (rich@sendai.cygnus.com) + + * m88k.h: extended to handle m88110. + +Tue Sep 28 19:19:08 1993 Jeffrey A Law (law@snake.cs.utah.edu) + + * hppa.h (be, ble): Use operand type 'z' to denote absolute branch + addresses. + +Tue Sep 14 14:04:35 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * i960.h (i960_opcodes): Properly bracket initializers. + +Mon Sep 13 12:50:52 1993 K. Richard Pixley (rich@sendai.cygnus.com) + + * m88k.h (BOFLAG): rewrite to avoid nested comment. + +Mon Sep 13 15:46:06 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * m68k.h (two): Protect second argument with parentheses. + +Fri Sep 10 16:29:47 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * i386.h (i386_optab): Added new instruction "rsm" (for i386sl). + Deleted old in/out instructions in "#if 0" section. + +Thu Sep 9 17:42:19 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * i386.h (i386_optab): Properly bracket initializers. + +Wed Aug 25 13:50:56 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * hppa.h (pa_opcode): Use '|' for movb and movib insns. (From + Jeff Law, law@cs.utah.edu). + +Mon Aug 23 16:55:03 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * i386.h (lcall): Accept Imm32 operand also. + +Mon Aug 23 12:43:11 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (M_ABSU): Removed (absolute value of unsigned number??). + (M_DABS): Added. + +Thu Aug 19 15:08:37 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h (INSN_*): Changed values. Removed unused definitions. + Added INSN_COND_BRANCH_LIKELY, INSN_ISA2 and INSN_ISA3. Split + INSN_LOAD_DELAY into INSN_LOAD_MEMORY_DELAY and + INSN_LOAD_COPROC_DELAY. Split INSN_COPROC_DELAY into + INSN_COPROC_MOVE_DELAY and INSN_COPROC_MEMORY_DELAY. + (M_*): Added new values for r6000 and r4000 macros. + (ANY_DELAY): Removed. + +Wed Aug 18 15:37:48 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h: Added M_LI_S and M_LI_SS. + +Tue Aug 17 07:08:08 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) + + * h8300.h: Get some rare mov.bs correct. + +Thu Aug 5 09:15:17 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + + * sparc.h: Don't define const ourself; rely on ansidecl.h having + been included. + +Fri Jul 30 18:41:11 1993 John Gilmore (gnu@cygnus.com) + + * sparc.h (F_JSR, F_UNBR, F_CONDBR): Add new flags to mark + jump instructions, for use in disassemblers. + +Thu Jul 22 07:25:27 1993 Ian Lance Taylor (ian@cygnus.com) + + * m88k.h: Make bitfields just unsigned, not unsigned long or + unsigned short. + +Wed Jul 21 11:55:31 1993 Jim Kingdon (kingdon@deneb.cygnus.com) + + * hppa.h: New argument type 'y'. Use in various float instructions. + +Mon Jul 19 17:17:03 1993 Jim Kingdon (kingdon@deneb.cygnus.com) + + * hppa.h (break): First immediate field is unsigned. + + * hppa.h: Add rfir instruction. + +Sun Jul 18 16:28:08 1993 Jim Kingdon (kingdon@rtl.cygnus.com) + + * mips.h: Split the actual table out into ../../opcodes/mips-opc.c. + +Fri Jul 16 09:59:29 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h: Reworked the hazard information somewhat, and fixed some + bugs in the instruction hazard descriptions. + +Thu Jul 15 12:42:01 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * m88k.h: Corrected a couple of opcodes. + +Tue Jul 6 15:17:35 1993 Ian Lance Taylor (ian@cygnus.com) + + * mips.h: Replaced with version from Ralph Campbell and OSF. The + new version includes instruction hazard information, but is + otherwise reasonably similar. + +Thu Jul 1 20:36:17 1993 Doug Evans (dje@canuck.cygnus.com) + + * h8300.h: Fix typo in UNOP3 (affected sh[al][lr].l). + +Fri Jun 11 18:38:44 1993 Ken Raeburn (raeburn@cygnus.com) + + Patches from Jeff Law, law@cs.utah.edu: + * hppa.h: Clean up some of the OLD_TABLE, non-OLD_TABLE braindamage. + Make the tables be the same for the following instructions: + "bb", "addb[tf]", "addib[tf]", "add", "add[loc]", "addco", + "sh[123]add", "sh[123]add[lo]", "sub", "sub[obt]", "sub[bt]o", + "ds", "comclr", "addi", "addi[ot]", "addito", "subi", "subio", + "comiclr", "fadd", "fsub", "fmpy", "fdiv", "fsqrt", "fabs", + "frnd", "fcpy", "fcnvff", "fcnvxf", "fcnvfx", "fcnvfxt", + "fcmp", and "ftest". + + * hppa.h: Make new and old tables the same for "break", "mtctl", + "mfctl", "bb", "ssm", "rsm", "xmpyu", "fmpyadd", "fmpysub". + Fix typo in last patch. Collapse several #ifdefs into a + single #ifdef. + + * hppa.h: Delete remaining OLD_TABLE code. Bring some + of the comments up-to-date. + + * hppa.h: Update "free list" of letters and update + comments describing each letter's function. + +Thu Jul 8 09:05:26 1993 Doug Evans (dje@canuck.cygnus.com) + + * h8300.h: Lots of little fixes for the h8/300h. + +Tue Jun 8 12:16:03 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) + + Support for H8/300-H + * h8300.h: Lots of new opcodes. + +Fri Jun 4 15:41:37 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) + + * h8300.h: checkpoint, includes H8/300-H opcodes. + +Thu Jun 3 15:42:59 1993 Stu Grossman (grossman@cygnus.com) + + * Patches from Jeffrey Law . + * hppa.h: Rework single precision FP + instructions so that they correctly disassemble code + PA1.1 code. + +Thu May 27 19:21:22 1993 Bruce Bauman (boot@osf.org) + + * i386.h (i386_optab, mov pattern): Remove Mem16 restriction from + mov to allow instructions like mov ss,xyz(ecx) to assemble. + +Tue May 25 00:39:40 1993 Ken Raeburn (raeburn@cygnus.com) + + * hppa.h: Use new version from Utah if OLD_TABLE isn't defined; + gdb will define it for now. + +Mon May 24 15:20:06 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * sparc.h: Don't end enumerator list with comma. + +Fri May 14 15:15:50 1993 Ian Lance Taylor (ian@cygnus.com) + + * Based on patches from davidj@ICSI.Berkeley.EDU (David Johnson): + * mips.h (OP_MASK_COPZ, OP_SH_COPZ): Define. + ("bc2t"): Correct typo. + ("[ls]wc[023]"): Use T rather than t. + ("c[0123]"): Define general coprocessor instructions. + +Mon May 10 06:02:25 1993 Ken Raeburn (raeburn@kr-pc.cygnus.com) + + * m68k.h: Move split point for gcc compilation more towards + middle. + +Fri Apr 9 13:26:16 1993 Jim Kingdon (kingdon@cygnus.com) + + * rs6k.h: Clean up instructions for primary opcode 19 (many were + simply wrong, ics, rfi, & rfsvc were missing). + Add "a" to opr_ext for "bb". Doc fix. + +Thu Mar 18 13:45:31 1993 Per Bothner (bothner@rtl.cygnus.com) + + * i386.h: 486 extensions from John Hassey (hassey@dg-rtp.dg.com). + * mips.h: Add casts, to suppress warnings about shifting too much. + * m68k.h: Document the placement code '9'. + +Thu Feb 18 02:03:14 1993 John Gilmore (gnu@cygnus.com) + + * m68k.h (BREAK_UP_BIG_DECL, AND_OTHER_PART): Add kludge which + allows callers to break up the large initialized struct full of + opcodes into two half-sized ones. This permits GCC to compile + this module, since it takes exponential space for initializers. + (numopcodes, endop): Revise to use AND_OTHER_PART in size calcs. + +Thu Feb 4 02:06:56 1993 John Gilmore (gnu@cygnus.com) + + * a29k.h: Remove RCS crud, update GPL to v2, update copyrights. + * convex.h: Added, from GDB's convx-opcode.h. Added CONST to all + initialized structs in it. + +Thu Jan 28 21:32:22 1993 John Gilmore (gnu@cygnus.com) + + Delta 88 changes inspired by Carl Greco, : + * m88k.h (PMEM): Avoid previous definition from . + (AND): Change to AND_ to avoid ansidecl.h `AND' conflict. + +Sat Jan 23 18:10:49 PST 1993 Ralph Campbell (ralphc@pyramid.com) + + * mips.h: document "i" and "j" operands correctly. + +Thu Jan 7 15:58:13 1993 Ian Lance Taylor (ian@tweedledumb.cygnus.com) + + * mips.h: Removed endianness dependency. + +Sun Jan 3 14:13:35 1993 Steve Chamberlain (sac@thepub.cygnus.com) + + * h8300.h: include info on number of cycles per instruction. + +Mon Dec 21 21:29:08 1992 Stu Grossman (grossman at cygnus.com) + + * hppa.h: Move handy aliases to the front. Fix masks for extract + and deposit instructions. + +Sat Dec 12 16:09:48 1992 Ian Lance Taylor (ian@cygnus.com) + + * i386.h: accept shld and shrd both with and without the shift + count argument, which is always %cl. + +Fri Nov 27 17:13:18 1992 Ken Raeburn (raeburn at cygnus.com) + + * i386.h (i386_optab_end, i386_regtab_end): Now const. + (one_byte_segment_defaults, two_byte_segment_defaults, + i386_prefixtab_end): Ditto. + +Mon Nov 23 10:47:25 1992 Ken Raeburn (raeburn@cygnus.com) + + * vax.h (bb*): Use "v" (bitfield type), not "a" (address operand) + for operand 2; from John Carr, jfc@dsg.dec.com. + +Wed Nov 4 07:36:49 1992 Ken Raeburn (raeburn@cygnus.com) + + * m68k.h: Define FIXED_SIZE_BRANCH, so bsr and bra instructions + always use 16-bit offsets. Makes calculated-size jump tables + feasible. + +Fri Oct 16 22:52:43 1992 Ken Raeburn (raeburn@cygnus.com) + + * i386.h: Fix one-operand forms of in* and out* patterns. + +Tue Sep 22 14:08:14 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * m68k.h: Added CPU32 support. + +Tue Sep 22 00:38:41 1992 John Gilmore (gnu@cygnus.com) + + * mips.h (break): Disassemble the argument. Patch from + jonathan@cs.stanford.edu (Jonathan Stone). + +Wed Sep 9 11:25:28 1992 Ian Lance Taylor (ian@cygnus.com) + + * m68k.h: merged Motorola and MIT syntax. + +Thu Sep 3 09:33:22 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * m68k.h (pmove): make the tests less strict, the 68k book is + wrong. + +Tue Aug 25 23:25:19 1992 Ken Raeburn (raeburn@cambridge.cygnus.com) + + * m68k.h (m68ec030): Defined as alias for 68030. + (m68k_opcodes): New type characters "3" for 68030 MMU regs and "t" + for immediate 0-7 added. Set up some opcodes (ptest, bkpt) to use + them. Tightened description of "fmovex" to distinguish it from + some "pmove" encodings. Added "pmove" for 68030 MMU regs, cleaned + up descriptions that claimed versions were available for chips not + supporting them. Added "pmovefd". + +Mon Aug 24 12:04:51 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * m68k.h: fix where the . goes in divull + +Wed Aug 19 11:22:24 1992 Ian Lance Taylor (ian@cygnus.com) + + * m68k.h: the cas2 instruction is supposed to be written with + indirection on the last two operands, which can be either data or + address registers. Added a new operand type 'r' which accepts + either register type. Added new cases for cas2l and cas2w which + use them. Corrected masks for cas2 which failed to recognize use + of address register. + +Fri Aug 14 14:20:38 1992 Per Bothner (bothner@cygnus.com) + + * m68k.h: Merged in patches (mostly m68040-specific) from + Colin Smith . + + * m68k.h: Merged m68kmri.h and m68k.h (using the former as a + base). Also cleaned up duplicates, re-ordered instructions for + the sake of dis-assembling (so aliases come after standard names). + * m68kmri.h: Now just defines some macros, and #includes m68k.h. + +Wed Aug 12 16:38:15 1992 Steve Chamberlain (sac@thepub.cygnus.com) + + * m68kmri.h: added various opcodes. Moved jbxx to bxxes. Filled in + all missing .s + +Mon Aug 10 23:22:33 1992 Ken Raeburn (raeburn@cygnus.com) + + * sparc.h: Moved tables to BFD library. + + * i386.h (i386_optab): Add fildq, fistpq aliases used by gcc. + +Sun Jun 28 13:29:03 1992 Fred Fish (fnf@cygnus.com) + + * h8300.h: Finish filling in all the holes in the opcode table, + so that the Lucid C compiler can digest this as well... + +Fri Jun 26 21:27:17 1992 John Gilmore (gnu at cygnus.com) + + * i386.h: Add setc, setnc, addr16, data16, repz, repnz aliases. + Fix opcodes on various sizes of fild/fist instructions + (16bit=no suffix, 32bit="l" suffix, 64bit="ll" suffix). + Use tabs to indent for comments. Fixes suggested by Minh Tran-Le. + +Thu Jun 25 16:13:26 1992 Stu Grossman (grossman at cygnus.com) + + * h8300.h: Fill in all the holes in the opcode table so that the + losing HPUX C compiler can digest this... + +Thu Jun 11 12:15:25 1992 John Gilmore (gnu at cygnus.com) + + * mips.h: Fix decoding of coprocessor instructions, somewhat. + (Fix by Eric Anderson, 3jean@maas-neotek.arc.nasa.gov.) + +Thu May 28 11:17:44 1992 Jim Wilson (wilson@sphagnum.cygnus.com) + + * sparc.h: Add new architecture variant sparclite; add its scan + and divscc opcodes. Define ARCHITECTURES_CONFLICT_P macro. + +Tue May 5 14:23:27 1992 Per Bothner (bothner@rtl.cygnus.com) + + * mips.h: Add some more opcode synonyms (from Frank Yellin, + fy@lucid.com). + +Thu Apr 16 18:25:26 1992 Per Bothner (bothner@cygnus.com) + + * rs6k.h: New version from IBM (Metin). + +Thu Apr 9 00:31:19 1992 Per Bothner (bothner@rtl.cygnus.com) + + * rs6k.h: Fix incorrect extended opcode for instructions `fm' + and `fd'. (From metin@ibmpa.awdpa.ibm.com (Metin G. Ozisik).) + +Tue Apr 7 13:38:47 1992 Stu Grossman (grossman at cygnus.com) + + * rs6k.h: Move from ../../gdb/rs6k-opcode.h. + +Fri Apr 3 11:30:20 1992 Fred Fish (fnf@cygnus.com) + + * m68k.h (one, two): Cast macro args to unsigned to suppress + complaints from compiler and lint about integer overflow during + shift. + +Sun Mar 29 12:22:08 1992 John Gilmore (gnu at cygnus.com) + + * sparc.h (OP): Avoid signed overflow when shifting to high order bit. + +Fri Mar 6 00:22:38 1992 John Gilmore (gnu at cygnus.com) + + * mips.h: Make bitfield layout depend on the HOST compiler, + not on the TARGET system. + +Fri Feb 21 01:29:51 1992 K. Richard Pixley (rich@cygnus.com) + + * i386.h: added inb, inw, outb, outw opcodes, added att syntax for + scmp, slod, smov, ssca, ssto. Curtesy Minh Tran-Le + . + +Thu Jan 30 07:31:44 1992 Steve Chamberlain (sac at rtl.cygnus.com) + + * h8300.h: turned op_type enum into #define list + +Thu Jan 30 01:07:24 1992 John Gilmore (gnu at cygnus.com) + + * sparc.h: Remove "cypress" architecture. Remove "fitox" and + similar instructions -- they've been renamed to "fitoq", etc. + REALLY fix tsubcctv. Fix "fcmpeq" and "fcmpq" which had wrong + number of arguments. + * h8300.h: Remove extra ; which produces compiler warning. + +Tue Jan 28 22:59:22 1992 Stu Grossman (grossman at cygnus.com) + + * sparc.h: fix opcode for tsubcctv. + +Tue Jan 7 17:19:39 1992 K. Richard Pixley (rich at cygnus.com) + + * sparc.h: fba and cba are now aliases for fb and cb respectively. + +Fri Dec 27 10:55:50 1991 Per Bothner (bothner at cygnus.com) + + * sparc.h (nop): Made the 'lose' field be even tighter, + so only a standard 'nop' is disassembled as a nop. + +Sun Dec 22 12:18:18 1991 Michael Tiemann (tiemann at cygnus.com) + + * sparc.h (nop): Add RD_GO to `lose' so that only %g0 in dest is + disassembled as a nop. + +Wed Dec 18 17:19:44 1991 Stu Grossman (grossman at cygnus.com) + + * m68k.h, sparc.h: ANSIfy enums. + +Tue Dec 10 00:22:20 1991 K. Richard Pixley (rich at rtl.cygnus.com) + + * sparc.h: fix a typo. + +Sat Nov 30 20:40:51 1991 Steve Chamberlain (sac at rtl.cygnus.com) + + * a29k.h, arm.h, h8300.h, i386.h, i860.h, i960.h , m68k.h, + m88k.h, mips.h , np1.h, ns32k.h, pn.h, pyr.h, sparc.h, tahoe.h, + vax.h: Renamed from ../-opcode.h. + + +Copyright (C) 1991-2003 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: + diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h new file mode 100644 index 0000000..eaf3cda --- /dev/null +++ b/include/opcode/aarch64.h @@ -0,0 +1,932 @@ +/* AArch64 assembler/disassembler support. + + Copyright 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. + Contributed by ARM Ltd. + + This file is part of GNU Binutils. + + 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; see the file COPYING3. If not, + see . */ + +#ifndef OPCODE_AARCH64_H +#define OPCODE_AARCH64_H + +#include "bfd.h" +#include "bfd_stdint.h" +#include +#include + +/* The offset for pc-relative addressing is currently defined to be 0. */ +#define AARCH64_PCREL_OFFSET 0 + +typedef uint32_t aarch64_insn; + +/* The following bitmasks control CPU features. */ +#define AARCH64_FEATURE_V8 0x00000001 /* All processors. */ +#define AARCH64_FEATURE_CRYPTO 0x00010000 /* Crypto instructions. */ +#define AARCH64_FEATURE_FP 0x00020000 /* FP instructions. */ +#define AARCH64_FEATURE_SIMD 0x00040000 /* SIMD instructions. */ +#define AARCH64_FEATURE_CRC 0x00080000 /* CRC instructions. */ + +/* Architectures are the sum of the base and extensions. */ +#define AARCH64_ARCH_V8 AARCH64_FEATURE (AARCH64_FEATURE_V8, \ + AARCH64_FEATURE_FP \ + | AARCH64_FEATURE_SIMD) +#define AARCH64_ARCH_NONE AARCH64_FEATURE (0, 0) +#define AARCH64_ANY AARCH64_FEATURE (-1, 0) /* Any basic core. */ + +/* CPU-specific features. */ +typedef unsigned long aarch64_feature_set; + +#define AARCH64_CPU_HAS_FEATURE(CPU,FEAT) \ + (((CPU) & (FEAT)) != 0) + +#define AARCH64_MERGE_FEATURE_SETS(TARG,F1,F2) \ + do \ + { \ + (TARG) = (F1) | (F2); \ + } \ + while (0) + +#define AARCH64_CLEAR_FEATURE(TARG,F1,F2) \ + do \ + { \ + (TARG) = (F1) &~ (F2); \ + } \ + while (0) + +#define AARCH64_FEATURE(core,coproc) ((core) | (coproc)) + +#define AARCH64_OPCODE_HAS_FEATURE(OPC,FEAT) \ + (((OPC) & (FEAT)) != 0) + +enum aarch64_operand_class +{ + AARCH64_OPND_CLASS_NIL, + AARCH64_OPND_CLASS_INT_REG, + AARCH64_OPND_CLASS_MODIFIED_REG, + AARCH64_OPND_CLASS_FP_REG, + AARCH64_OPND_CLASS_SIMD_REG, + AARCH64_OPND_CLASS_SIMD_ELEMENT, + AARCH64_OPND_CLASS_SISD_REG, + AARCH64_OPND_CLASS_SIMD_REGLIST, + AARCH64_OPND_CLASS_CP_REG, + AARCH64_OPND_CLASS_ADDRESS, + AARCH64_OPND_CLASS_IMMEDIATE, + AARCH64_OPND_CLASS_SYSTEM, +}; + +/* Operand code that helps both parsing and coding. + Keep AARCH64_OPERANDS synced. */ + +enum aarch64_opnd +{ + AARCH64_OPND_NIL, /* no operand---MUST BE FIRST!*/ + + AARCH64_OPND_Rd, /* Integer register as destination. */ + AARCH64_OPND_Rn, /* Integer register as source. */ + AARCH64_OPND_Rm, /* Integer register as source. */ + AARCH64_OPND_Rt, /* Integer register used in ld/st instructions. */ + AARCH64_OPND_Rt2, /* Integer register used in ld/st pair instructions. */ + AARCH64_OPND_Rs, /* Integer register used in ld/st exclusive. */ + AARCH64_OPND_Ra, /* Integer register used in ddp_3src instructions. */ + AARCH64_OPND_Rt_SYS, /* Integer register used in system instructions. */ + + AARCH64_OPND_Rd_SP, /* Integer Rd or SP. */ + AARCH64_OPND_Rn_SP, /* Integer Rn or SP. */ + AARCH64_OPND_Rm_EXT, /* Integer Rm extended. */ + AARCH64_OPND_Rm_SFT, /* Integer Rm shifted. */ + + AARCH64_OPND_Fd, /* Floating-point Fd. */ + AARCH64_OPND_Fn, /* Floating-point Fn. */ + AARCH64_OPND_Fm, /* Floating-point Fm. */ + AARCH64_OPND_Fa, /* Floating-point Fa. */ + AARCH64_OPND_Ft, /* Floating-point Ft. */ + AARCH64_OPND_Ft2, /* Floating-point Ft2. */ + + AARCH64_OPND_Sd, /* AdvSIMD Scalar Sd. */ + AARCH64_OPND_Sn, /* AdvSIMD Scalar Sn. */ + AARCH64_OPND_Sm, /* AdvSIMD Scalar Sm. */ + + AARCH64_OPND_Vd, /* AdvSIMD Vector Vd. */ + AARCH64_OPND_Vn, /* AdvSIMD Vector Vn. */ + AARCH64_OPND_Vm, /* AdvSIMD Vector Vm. */ + AARCH64_OPND_VdD1, /* AdvSIMD .D[1]; for FMOV only. */ + AARCH64_OPND_VnD1, /* AdvSIMD .D[1]; for FMOV only. */ + AARCH64_OPND_Ed, /* AdvSIMD Vector Element Vd. */ + AARCH64_OPND_En, /* AdvSIMD Vector Element Vn. */ + AARCH64_OPND_Em, /* AdvSIMD Vector Element Vm. */ + AARCH64_OPND_LVn, /* AdvSIMD Vector register list used in e.g. TBL. */ + AARCH64_OPND_LVt, /* AdvSIMD Vector register list used in ld/st. */ + AARCH64_OPND_LVt_AL, /* AdvSIMD Vector register list for loading single + structure to all lanes. */ + AARCH64_OPND_LEt, /* AdvSIMD Vector Element list. */ + + AARCH64_OPND_Cn, /* Co-processor register in CRn field. */ + AARCH64_OPND_Cm, /* Co-processor register in CRm field. */ + + AARCH64_OPND_IDX, /* AdvSIMD EXT index operand. */ + AARCH64_OPND_IMM_VLSL,/* Immediate for shifting vector registers left. */ + AARCH64_OPND_IMM_VLSR,/* Immediate for shifting vector registers right. */ + AARCH64_OPND_SIMD_IMM,/* AdvSIMD modified immediate without shift. */ + AARCH64_OPND_SIMD_IMM_SFT, /* AdvSIMD modified immediate with shift. */ + AARCH64_OPND_SIMD_FPIMM,/* AdvSIMD 8-bit fp immediate. */ + AARCH64_OPND_SHLL_IMM,/* Immediate shift for AdvSIMD SHLL instruction + (no encoding). */ + AARCH64_OPND_IMM0, /* Immediate for #0. */ + AARCH64_OPND_FPIMM0, /* Immediate for #0.0. */ + AARCH64_OPND_FPIMM, /* Floating-point Immediate. */ + AARCH64_OPND_IMMR, /* Immediate # in e.g. BFM. */ + AARCH64_OPND_IMMS, /* Immediate # in e.g. BFM. */ + AARCH64_OPND_WIDTH, /* Immediate # in e.g. BFI. */ + AARCH64_OPND_IMM, /* Immediate. */ + AARCH64_OPND_UIMM3_OP1,/* Unsigned 3-bit immediate in the op1 field. */ + AARCH64_OPND_UIMM3_OP2,/* Unsigned 3-bit immediate in the op2 field. */ + AARCH64_OPND_UIMM4, /* Unsigned 4-bit immediate in the CRm field. */ + AARCH64_OPND_UIMM7, /* Unsigned 7-bit immediate in the CRm:op2 fields. */ + AARCH64_OPND_BIT_NUM, /* Immediate. */ + AARCH64_OPND_EXCEPTION,/* imm16 operand in exception instructions. */ + AARCH64_OPND_CCMP_IMM,/* Immediate in conditional compare instructions. */ + AARCH64_OPND_NZCV, /* Flag bit specifier giving an alternative value for + each condition flag. */ + + AARCH64_OPND_LIMM, /* Logical Immediate. */ + AARCH64_OPND_AIMM, /* Arithmetic immediate. */ + AARCH64_OPND_HALF, /* #{, LSL #} operand in move wide. */ + AARCH64_OPND_FBITS, /* FP # operand in e.g. SCVTF */ + AARCH64_OPND_IMM_MOV, /* Immediate operand for the MOV alias. */ + + AARCH64_OPND_COND, /* Standard condition as the last operand. */ + + AARCH64_OPND_ADDR_ADRP, /* Memory address for ADRP */ + AARCH64_OPND_ADDR_PCREL14, /* 14-bit PC-relative address for e.g. TBZ. */ + AARCH64_OPND_ADDR_PCREL19, /* 19-bit PC-relative address for e.g. LDR. */ + AARCH64_OPND_ADDR_PCREL21, /* 21-bit PC-relative address for e.g. ADR. */ + AARCH64_OPND_ADDR_PCREL26, /* 26-bit PC-relative address for e.g. BL. */ + + AARCH64_OPND_ADDR_SIMPLE, /* Address of ld/st exclusive. */ + AARCH64_OPND_ADDR_REGOFF, /* Address of register offset. */ + AARCH64_OPND_ADDR_SIMM7, /* Address of signed 7-bit immediate. */ + AARCH64_OPND_ADDR_SIMM9, /* Address of signed 9-bit immediate. */ + AARCH64_OPND_ADDR_SIMM9_2, /* Same as the above, but the immediate is + negative or unaligned and there is + no writeback allowed. This operand code + is only used to support the programmer- + friendly feature of using LDR/STR as the + the mnemonic name for LDUR/STUR instructions + wherever there is no ambiguity. */ + AARCH64_OPND_ADDR_UIMM12, /* Address of unsigned 12-bit immediate. */ + AARCH64_OPND_SIMD_ADDR_SIMPLE,/* Address of ld/st multiple structures. */ + AARCH64_OPND_SIMD_ADDR_POST, /* Address of ld/st multiple post-indexed. */ + + AARCH64_OPND_SYSREG, /* System register operand. */ + AARCH64_OPND_PSTATEFIELD, /* PSTATE field name operand. */ + AARCH64_OPND_SYSREG_AT, /* System register operand. */ + AARCH64_OPND_SYSREG_DC, /* System register operand. */ + AARCH64_OPND_SYSREG_IC, /* System register operand. */ + AARCH64_OPND_SYSREG_TLBI, /* System register operand. */ + AARCH64_OPND_BARRIER, /* Barrier operand. */ + AARCH64_OPND_BARRIER_ISB, /* Barrier operand for ISB. */ + AARCH64_OPND_PRFOP, /* Prefetch operation. */ +}; + +/* Qualifier constrains an operand. It either specifies a variant of an + operand type or limits values available to an operand type. + + N.B. Order is important; keep aarch64_opnd_qualifiers synced. */ + +enum aarch64_opnd_qualifier +{ + /* Indicating no further qualification on an operand. */ + AARCH64_OPND_QLF_NIL, + + /* Qualifying an operand which is a general purpose (integer) register; + indicating the operand data size or a specific register. */ + AARCH64_OPND_QLF_W, /* Wn, WZR or WSP. */ + AARCH64_OPND_QLF_X, /* Xn, XZR or XSP. */ + AARCH64_OPND_QLF_WSP, /* WSP. */ + AARCH64_OPND_QLF_SP, /* SP. */ + + /* Qualifying an operand which is a floating-point register, a SIMD + vector element or a SIMD vector element list; indicating operand data + size or the size of each SIMD vector element in the case of a SIMD + vector element list. + These qualifiers are also used to qualify an address operand to + indicate the size of data element a load/store instruction is + accessing. + They are also used for the immediate shift operand in e.g. SSHR. Such + a use is only for the ease of operand encoding/decoding and qualifier + sequence matching; such a use should not be applied widely; use the value + constraint qualifiers for immediate operands wherever possible. */ + AARCH64_OPND_QLF_S_B, + AARCH64_OPND_QLF_S_H, + AARCH64_OPND_QLF_S_S, + AARCH64_OPND_QLF_S_D, + AARCH64_OPND_QLF_S_Q, + + /* Qualifying an operand which is a SIMD vector register or a SIMD vector + register list; indicating register shape. + They are also used for the immediate shift operand in e.g. SSHR. Such + a use is only for the ease of operand encoding/decoding and qualifier + sequence matching; such a use should not be applied widely; use the value + constraint qualifiers for immediate operands wherever possible. */ + AARCH64_OPND_QLF_V_8B, + AARCH64_OPND_QLF_V_16B, + AARCH64_OPND_QLF_V_4H, + AARCH64_OPND_QLF_V_8H, + AARCH64_OPND_QLF_V_2S, + AARCH64_OPND_QLF_V_4S, + AARCH64_OPND_QLF_V_1D, + AARCH64_OPND_QLF_V_2D, + AARCH64_OPND_QLF_V_1Q, + + /* Constraint on value. */ + AARCH64_OPND_QLF_imm_0_7, + AARCH64_OPND_QLF_imm_0_15, + AARCH64_OPND_QLF_imm_0_31, + AARCH64_OPND_QLF_imm_0_63, + AARCH64_OPND_QLF_imm_1_32, + AARCH64_OPND_QLF_imm_1_64, + + /* Indicate whether an AdvSIMD modified immediate operand is shift-zeros + or shift-ones. */ + AARCH64_OPND_QLF_LSL, + AARCH64_OPND_QLF_MSL, + + /* Special qualifier helping retrieve qualifier information during the + decoding time (currently not in use). */ + AARCH64_OPND_QLF_RETRIEVE, +}; + +/* Instruction class. */ + +enum aarch64_insn_class +{ + addsub_carry, + addsub_ext, + addsub_imm, + addsub_shift, + asimdall, + asimddiff, + asimdelem, + asimdext, + asimdimm, + asimdins, + asimdmisc, + asimdperm, + asimdsame, + asimdshf, + asimdtbl, + asisddiff, + asisdelem, + asisdlse, + asisdlsep, + asisdlso, + asisdlsop, + asisdmisc, + asisdone, + asisdpair, + asisdsame, + asisdshf, + bitfield, + branch_imm, + branch_reg, + compbranch, + condbranch, + condcmp_imm, + condcmp_reg, + condsel, + cryptoaes, + cryptosha2, + cryptosha3, + dp_1src, + dp_2src, + dp_3src, + exception, + extract, + float2fix, + float2int, + floatccmp, + floatcmp, + floatdp1, + floatdp2, + floatdp3, + floatimm, + floatsel, + ldst_immpost, + ldst_immpre, + ldst_imm9, /* immpost or immpre */ + ldst_pos, + ldst_regoff, + ldst_unpriv, + ldst_unscaled, + ldstexcl, + ldstnapair_offs, + ldstpair_off, + ldstpair_indexed, + loadlit, + log_imm, + log_shift, + movewide, + pcreladdr, + ic_system, + testbranch, +}; + +/* Opcode enumerators. */ + +enum aarch64_op +{ + OP_NIL, + OP_STRB_POS, + OP_LDRB_POS, + OP_LDRSB_POS, + OP_STRH_POS, + OP_LDRH_POS, + OP_LDRSH_POS, + OP_STR_POS, + OP_LDR_POS, + OP_STRF_POS, + OP_LDRF_POS, + OP_LDRSW_POS, + OP_PRFM_POS, + + OP_STURB, + OP_LDURB, + OP_LDURSB, + OP_STURH, + OP_LDURH, + OP_LDURSH, + OP_STUR, + OP_LDUR, + OP_STURV, + OP_LDURV, + OP_LDURSW, + OP_PRFUM, + + OP_LDR_LIT, + OP_LDRV_LIT, + OP_LDRSW_LIT, + OP_PRFM_LIT, + + OP_ADD, + OP_B, + OP_BL, + + OP_MOVN, + OP_MOVZ, + OP_MOVK, + + OP_MOV_IMM_LOG, /* MOV alias for moving bitmask immediate. */ + OP_MOV_IMM_WIDE, /* MOV alias for moving wide immediate. */ + OP_MOV_IMM_WIDEN, /* MOV alias for moving wide immediate (negated). */ + + OP_MOV_V, /* MOV alias for moving vector register. */ + + OP_ASR_IMM, + OP_LSR_IMM, + OP_LSL_IMM, + + OP_BIC, + + OP_UBFX, + OP_BFXIL, + OP_SBFX, + OP_SBFIZ, + OP_BFI, + OP_UBFIZ, + OP_UXTB, + OP_UXTH, + OP_UXTW, + + OP_CINC, + OP_CINV, + OP_CNEG, + OP_CSET, + OP_CSETM, + + OP_FCVT, + OP_FCVTN, + OP_FCVTN2, + OP_FCVTL, + OP_FCVTL2, + OP_FCVTXN_S, /* Scalar version. */ + + OP_ROR_IMM, + + OP_SXTL, + OP_SXTL2, + OP_UXTL, + OP_UXTL2, + + OP_TOTAL_NUM, /* Pseudo. */ +}; + +/* Maximum number of operands an instruction can have. */ +#define AARCH64_MAX_OPND_NUM 6 +/* Maximum number of qualifier sequences an instruction can have. */ +#define AARCH64_MAX_QLF_SEQ_NUM 10 +/* Operand qualifier typedef; optimized for the size. */ +typedef unsigned char aarch64_opnd_qualifier_t; +/* Operand qualifier sequence typedef. */ +typedef aarch64_opnd_qualifier_t \ + aarch64_opnd_qualifier_seq_t [AARCH64_MAX_OPND_NUM]; + +/* FIXME: improve the efficiency. */ +static inline bfd_boolean +empty_qualifier_sequence_p (const aarch64_opnd_qualifier_t *qualifiers) +{ + int i; + for (i = 0; i < AARCH64_MAX_OPND_NUM; ++i) + if (qualifiers[i] != AARCH64_OPND_QLF_NIL) + return FALSE; + return TRUE; +} + +/* This structure holds information for a particular opcode. */ + +struct aarch64_opcode +{ + /* The name of the mnemonic. */ + const char *name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + aarch64_insn opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + aarch64_insn mask; + + /* Instruction class. */ + enum aarch64_insn_class iclass; + + /* Enumerator identifier. */ + enum aarch64_op op; + + /* Which architecture variant provides this instruction. */ + const aarch64_feature_set *avariant; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM]; + + /* A list of operand qualifier code sequence. Each operand qualifier + code qualifies the corresponding operand code. Each operand + qualifier sequence specifies a valid opcode variant and related + constraint on operands. */ + aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM]; + + /* Flags providing information about this instruction */ + uint32_t flags; +}; + +typedef struct aarch64_opcode aarch64_opcode; + +/* Table describing all the AArch64 opcodes. */ +extern aarch64_opcode aarch64_opcode_table[]; + +/* Opcode flags. */ +#define F_ALIAS (1 << 0) +#define F_HAS_ALIAS (1 << 1) +/* Disassembly preference priority 1-3 (the larger the higher). If nothing + is specified, it is the priority 0 by default, i.e. the lowest priority. */ +#define F_P1 (1 << 2) +#define F_P2 (2 << 2) +#define F_P3 (3 << 2) +/* Flag an instruction that is truly conditional executed, e.g. b.cond. */ +#define F_COND (1 << 4) +/* Instruction has the field of 'sf'. */ +#define F_SF (1 << 5) +/* Instruction has the field of 'size:Q'. */ +#define F_SIZEQ (1 << 6) +/* Floating-point instruction has the field of 'type'. */ +#define F_FPTYPE (1 << 7) +/* AdvSIMD scalar instruction has the field of 'size'. */ +#define F_SSIZE (1 << 8) +/* AdvSIMD vector register arrangement specifier encoded in "imm5<3:0>:Q". */ +#define F_T (1 << 9) +/* Size of GPR operand in AdvSIMD instructions encoded in Q. */ +#define F_GPRSIZE_IN_Q (1 << 10) +/* Size of Rt load signed instruction encoded in opc[0], i.e. bit 22. */ +#define F_LDS_SIZE (1 << 11) +/* Optional operand; assume maximum of 1 operand can be optional. */ +#define F_OPD0_OPT (1 << 12) +#define F_OPD1_OPT (2 << 12) +#define F_OPD2_OPT (3 << 12) +#define F_OPD3_OPT (4 << 12) +#define F_OPD4_OPT (5 << 12) +/* Default value for the optional operand when omitted from the assembly. */ +#define F_DEFAULT(X) (((X) & 0x1f) << 15) +/* Instruction that is an alias of another instruction needs to be + encoded/decoded by converting it to/from the real form, followed by + the encoding/decoding according to the rules of the real opcode. + This compares to the direct coding using the alias's information. + N.B. this flag requires F_ALIAS to be used together. */ +#define F_CONV (1 << 20) +/* Use together with F_ALIAS to indicate an alias opcode is a programmer + friendly pseudo instruction available only in the assembly code (thus will + not show up in the disassembly). */ +#define F_PSEUDO (1 << 21) +/* Instruction has miscellaneous encoding/decoding rules. */ +#define F_MISC (1 << 22) +/* Instruction has the field of 'N'; used in conjunction with F_SF. */ +#define F_N (1 << 23) +/* Opcode dependent field. */ +#define F_OD(X) (((X) & 0x7) << 24) +/* Next bit is 27. */ + +static inline bfd_boolean +alias_opcode_p (const aarch64_opcode *opcode) +{ + return (opcode->flags & F_ALIAS) ? TRUE : FALSE; +} + +static inline bfd_boolean +opcode_has_alias (const aarch64_opcode *opcode) +{ + return (opcode->flags & F_HAS_ALIAS) ? TRUE : FALSE; +} + +/* Priority for disassembling preference. */ +static inline int +opcode_priority (const aarch64_opcode *opcode) +{ + return (opcode->flags >> 2) & 0x3; +} + +static inline bfd_boolean +pseudo_opcode_p (const aarch64_opcode *opcode) +{ + return (opcode->flags & F_PSEUDO) != 0lu ? TRUE : FALSE; +} + +static inline bfd_boolean +optional_operand_p (const aarch64_opcode *opcode, unsigned int idx) +{ + return (((opcode->flags >> 12) & 0x7) == idx + 1) + ? TRUE : FALSE; +} + +static inline aarch64_insn +get_optional_operand_default_value (const aarch64_opcode *opcode) +{ + return (opcode->flags >> 15) & 0x1f; +} + +static inline unsigned int +get_opcode_dependent_value (const aarch64_opcode *opcode) +{ + return (opcode->flags >> 24) & 0x7; +} + +static inline bfd_boolean +opcode_has_special_coder (const aarch64_opcode *opcode) +{ + return (opcode->flags & (F_SF | F_SIZEQ | F_FPTYPE | F_SSIZE | F_T + | F_GPRSIZE_IN_Q | F_LDS_SIZE | F_MISC | F_N | F_COND)) ? TRUE + : FALSE; +} + +struct aarch64_name_value_pair +{ + const char * name; + aarch64_insn value; +}; + +extern const struct aarch64_name_value_pair aarch64_operand_modifiers []; +extern const struct aarch64_name_value_pair aarch64_sys_regs []; +extern const struct aarch64_name_value_pair aarch64_pstatefields []; +extern const struct aarch64_name_value_pair aarch64_barrier_options [16]; +extern const struct aarch64_name_value_pair aarch64_prfops [32]; + +typedef struct +{ + const char *template; + uint32_t value; + int has_xt; +} aarch64_sys_ins_reg; + +extern const aarch64_sys_ins_reg aarch64_sys_regs_ic []; +extern const aarch64_sys_ins_reg aarch64_sys_regs_dc []; +extern const aarch64_sys_ins_reg aarch64_sys_regs_at []; +extern const aarch64_sys_ins_reg aarch64_sys_regs_tlbi []; + +/* Shift/extending operator kinds. + N.B. order is important; keep aarch64_operand_modifiers synced. */ +enum aarch64_modifier_kind +{ + AARCH64_MOD_NONE, + AARCH64_MOD_MSL, + AARCH64_MOD_ROR, + AARCH64_MOD_ASR, + AARCH64_MOD_LSR, + AARCH64_MOD_LSL, + AARCH64_MOD_UXTB, + AARCH64_MOD_UXTH, + AARCH64_MOD_UXTW, + AARCH64_MOD_UXTX, + AARCH64_MOD_SXTB, + AARCH64_MOD_SXTH, + AARCH64_MOD_SXTW, + AARCH64_MOD_SXTX, +}; + +bfd_boolean +aarch64_extend_operator_p (enum aarch64_modifier_kind); + +enum aarch64_modifier_kind +aarch64_get_operand_modifier (const struct aarch64_name_value_pair *); +/* Condition. */ + +typedef struct +{ + /* A list of names with the first one as the disassembly preference; + terminated by NULL if fewer than 3. */ + const char *names[3]; + aarch64_insn value; +} aarch64_cond; + +extern const aarch64_cond aarch64_conds[16]; + +const aarch64_cond* get_cond_from_value (aarch64_insn value); +const aarch64_cond* get_inverted_cond (const aarch64_cond *cond); + +/* Structure representing an operand. */ + +struct aarch64_opnd_info +{ + enum aarch64_opnd type; + aarch64_opnd_qualifier_t qualifier; + int idx; + + union + { + struct + { + unsigned regno; + } reg; + struct + { + unsigned regno : 5; + unsigned index : 4; + } reglane; + /* e.g. LVn. */ + struct + { + unsigned first_regno : 5; + unsigned num_regs : 3; + /* 1 if it is a list of reg element. */ + unsigned has_index : 1; + /* Lane index; valid only when has_index is 1. */ + unsigned index : 4; + } reglist; + /* e.g. immediate or pc relative address offset. */ + struct + { + int64_t value; + unsigned is_fp : 1; + } imm; + /* e.g. address in STR (register offset). */ + struct + { + unsigned base_regno; + struct + { + union + { + int imm; + unsigned regno; + }; + unsigned is_reg; + } offset; + unsigned pcrel : 1; /* PC-relative. */ + unsigned writeback : 1; + unsigned preind : 1; /* Pre-indexed. */ + unsigned postind : 1; /* Post-indexed. */ + } addr; + const aarch64_cond *cond; + /* The encoding of the system register. */ + aarch64_insn sysreg; + /* The encoding of the PSTATE field. */ + aarch64_insn pstatefield; + const aarch64_sys_ins_reg *sysins_op; + const struct aarch64_name_value_pair *barrier; + const struct aarch64_name_value_pair *prfop; + }; + + /* Operand shifter; in use when the operand is a register offset address, + add/sub extended reg, etc. e.g. {, {#}}. */ + struct + { + enum aarch64_modifier_kind kind; + int amount; + unsigned operator_present: 1; /* Only valid during encoding. */ + /* Value of the 'S' field in ld/st reg offset; used only in decoding. */ + unsigned amount_present: 1; + } shifter; + + unsigned skip:1; /* Operand is not completed if there is a fixup needed + to be done on it. In some (but not all) of these + cases, we need to tell libopcodes to skip the + constraint checking and the encoding for this + operand, so that the libopcodes can pick up the + right opcode before the operand is fixed-up. This + flag should only be used during the + assembling/encoding. */ + unsigned present:1; /* Whether this operand is present in the assembly + line; not used during the disassembly. */ +}; + +typedef struct aarch64_opnd_info aarch64_opnd_info; + +/* Structure representing an instruction. + + It is used during both the assembling and disassembling. The assembler + fills an aarch64_inst after a successful parsing and then passes it to the + encoding routine to do the encoding. During the disassembling, the + disassembler calls the decoding routine to decode a binary instruction; on a + successful return, such a structure will be filled with information of the + instruction; then the disassembler uses the information to print out the + instruction. */ + +struct aarch64_inst +{ + /* The value of the binary instruction. */ + aarch64_insn value; + + /* Corresponding opcode entry. */ + const aarch64_opcode *opcode; + + /* Condition for a truly conditional-executed instrutions, e.g. b.cond. */ + const aarch64_cond *cond; + + /* Operands information. */ + aarch64_opnd_info operands[AARCH64_MAX_OPND_NUM]; +}; + +typedef struct aarch64_inst aarch64_inst; + +/* Diagnosis related declaration and interface. */ + +/* Operand error kind enumerators. + + AARCH64_OPDE_RECOVERABLE + Less severe error found during the parsing, very possibly because that + GAS has picked up a wrong instruction template for the parsing. + + AARCH64_OPDE_SYNTAX_ERROR + General syntax error; it can be either a user error, or simply because + that GAS is trying a wrong instruction template. + + AARCH64_OPDE_FATAL_SYNTAX_ERROR + Definitely a user syntax error. + + AARCH64_OPDE_INVALID_VARIANT + No syntax error, but the operands are not a valid combination, e.g. + FMOV D0,S0 + + AARCH64_OPDE_OUT_OF_RANGE + Error about some immediate value out of a valid range. + + AARCH64_OPDE_UNALIGNED + Error about some immediate value not properly aligned (i.e. not being a + multiple times of a certain value). + + AARCH64_OPDE_REG_LIST + Error about the register list operand having unexpected number of + registers. + + AARCH64_OPDE_OTHER_ERROR + Error of the highest severity and used for any severe issue that does not + fall into any of the above categories. + + The enumerators are only interesting to GAS. They are declared here (in + libopcodes) because that some errors are detected (and then notified to GAS) + by libopcodes (rather than by GAS solely). + + The first three errors are only deteced by GAS while the + AARCH64_OPDE_INVALID_VARIANT error can only be spotted by libopcodes as + only libopcodes has the information about the valid variants of each + instruction. + + The enumerators have an increasing severity. This is helpful when there are + multiple instruction templates available for a given mnemonic name (e.g. + FMOV); this mechanism will help choose the most suitable template from which + the generated diagnostics can most closely describe the issues, if any. */ + +enum aarch64_operand_error_kind +{ + AARCH64_OPDE_NIL, + AARCH64_OPDE_RECOVERABLE, + AARCH64_OPDE_SYNTAX_ERROR, + AARCH64_OPDE_FATAL_SYNTAX_ERROR, + AARCH64_OPDE_INVALID_VARIANT, + AARCH64_OPDE_OUT_OF_RANGE, + AARCH64_OPDE_UNALIGNED, + AARCH64_OPDE_REG_LIST, + AARCH64_OPDE_OTHER_ERROR +}; + +/* N.B. GAS assumes that this structure work well with shallow copy. */ +struct aarch64_operand_error +{ + enum aarch64_operand_error_kind kind; + int index; + const char *error; + int data[3]; /* Some data for extra information. */ +}; + +typedef struct aarch64_operand_error aarch64_operand_error; + +/* Encoding entrypoint. */ + +extern int +aarch64_opcode_encode (const aarch64_opcode *, const aarch64_inst *, + aarch64_insn *, aarch64_opnd_qualifier_t *, + aarch64_operand_error *); + +extern const aarch64_opcode * +aarch64_replace_opcode (struct aarch64_inst *, + const aarch64_opcode *); + +/* Given the opcode enumerator OP, return the pointer to the corresponding + opcode entry. */ + +extern const aarch64_opcode * +aarch64_get_opcode (enum aarch64_op); + +/* Generate the string representation of an operand. */ +extern void +aarch64_print_operand (char *, size_t, bfd_vma, const aarch64_opcode *, + const aarch64_opnd_info *, int, int *, bfd_vma *); + +/* Miscellaneous interface. */ + +extern int +aarch64_operand_index (const enum aarch64_opnd *, enum aarch64_opnd); + +extern aarch64_opnd_qualifier_t +aarch64_get_expected_qualifier (const aarch64_opnd_qualifier_seq_t *, int, + const aarch64_opnd_qualifier_t, int); + +extern int +aarch64_num_of_operands (const aarch64_opcode *); + +extern int +aarch64_stack_pointer_p (const aarch64_opnd_info *); + +extern +int aarch64_zero_register_p (const aarch64_opnd_info *); + +/* Given an operand qualifier, return the expected data element size + of a qualified operand. */ +extern unsigned char +aarch64_get_qualifier_esize (aarch64_opnd_qualifier_t); + +extern enum aarch64_operand_class +aarch64_get_operand_class (enum aarch64_opnd); + +extern const char * +aarch64_get_operand_name (enum aarch64_opnd); + +extern const char * +aarch64_get_operand_desc (enum aarch64_opnd); + +#ifdef DEBUG_AARCH64 +extern int debug_dump; + +extern void +aarch64_verbose (const char *, ...) __attribute__ ((format (printf, 1, 2))); + +#define DEBUG_TRACE(M, ...) \ + { \ + if (debug_dump) \ + aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__); \ + } + +#define DEBUG_TRACE_IF(C, M, ...) \ + { \ + if (debug_dump && (C)) \ + aarch64_verbose ("%s: " M ".", __func__, ##__VA_ARGS__); \ + } +#else /* !DEBUG_AARCH64 */ +#define DEBUG_TRACE(M, ...) ; +#define DEBUG_TRACE_IF(C, M, ...) ; +#endif /* DEBUG_AARCH64 */ + +#endif /* OPCODE_AARCH64_H */ diff --git a/include/opcode/alpha.h b/include/opcode/alpha.h new file mode 100644 index 0000000..2c0d4f6 --- /dev/null +++ b/include/opcode/alpha.h @@ -0,0 +1,238 @@ +/* alpha.h -- Header file for Alpha opcode table + Copyright 1996, 1999, 2001, 2003, 2010 Free Software Foundation, Inc. + Contributed by Richard Henderson , + patterned after the PPC opcode table written by Ian Lance Taylor. + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef OPCODE_ALPHA_H +#define OPCODE_ALPHA_H + +/* The opcode table is an array of struct alpha_opcode. */ + +struct alpha_opcode +{ + /* The opcode name. */ + const char *name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + unsigned opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + unsigned mask; + + /* One bit flags for the opcode. These are primarily used to + indicate specific processors and environments support the + instructions. The defined values are listed below. */ + unsigned flags; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[4]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct alpha_opcode alpha_opcodes[]; +extern const unsigned alpha_num_opcodes; + +/* Values defined for the flags field of a struct alpha_opcode. */ + +/* CPU Availability */ +#define AXP_OPCODE_BASE 0x0001 /* Base architecture -- all cpus. */ +#define AXP_OPCODE_EV4 0x0002 /* EV4 specific PALcode insns. */ +#define AXP_OPCODE_EV5 0x0004 /* EV5 specific PALcode insns. */ +#define AXP_OPCODE_EV6 0x0008 /* EV6 specific PALcode insns. */ +#define AXP_OPCODE_BWX 0x0100 /* Byte/word extension (amask bit 0). */ +#define AXP_OPCODE_CIX 0x0200 /* "Count" extension (amask bit 1). */ +#define AXP_OPCODE_MAX 0x0400 /* Multimedia extension (amask bit 8). */ + +#define AXP_OPCODE_NOPAL (~(AXP_OPCODE_EV4|AXP_OPCODE_EV5|AXP_OPCODE_EV6)) + +/* A macro to extract the major opcode from an instruction. */ +#define AXP_OP(i) (((i) >> 26) & 0x3F) + +/* The total number of major opcodes. */ +#define AXP_NOPS 0x40 + + +/* The operands table is an array of struct alpha_operand. */ + +struct alpha_operand +{ + /* The number of bits in the operand. */ + unsigned int bits : 5; + + /* How far the operand is left shifted in the instruction. */ + unsigned int shift : 5; + + /* The default relocation type for this operand. */ + signed int default_reloc : 16; + + /* One bit syntax flags. */ + unsigned int flags : 16; + + /* Insertion function. This is used by the assembler. To insert an + operand value into an instruction, check this field. + + If it is NULL, execute + i |= (op & ((1 << o->bits) - 1)) << o->shift; + (i is the instruction which we are filling in, o is a pointer to + this structure, and op is the opcode value; this assumes twos + complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction and the operand value. It will return the new value + of the instruction. If the ERRMSG argument is not NULL, then if + the operand value is illegal, *ERRMSG will be set to a warning + string (the operand will be inserted in any case). If the + operand value is legal, *ERRMSG will be unchanged (most operands + can accept any value). */ + unsigned (*insert) (unsigned instruction, int op, const char **errmsg); + + /* Extraction function. This is used by the disassembler. To + extract this operand type from an instruction, check this field. + + If it is NULL, compute + op = ((i) >> o->shift) & ((1 << o->bits) - 1); + if ((o->flags & AXP_OPERAND_SIGNED) != 0 + && (op & (1 << (o->bits - 1))) != 0) + op -= 1 << o->bits; + (i is the instruction, o is a pointer to this structure, and op + is the result; this assumes twos complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction value. It will return the value of the operand. If + the INVALID argument is not NULL, *INVALID will be set to + non-zero if this operand type can not actually be extracted from + this operand (i.e., the instruction does not match). If the + operand is valid, *INVALID will not be changed. */ + int (*extract) (unsigned instruction, int *invalid); +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the alpha_opcodes table. */ + +extern const struct alpha_operand alpha_operands[]; +extern const unsigned alpha_num_operands; + +/* Values defined for the flags field of a struct alpha_operand. */ + +/* Mask for selecting the type for typecheck purposes */ +#define AXP_OPERAND_TYPECHECK_MASK \ + (AXP_OPERAND_PARENS | AXP_OPERAND_COMMA | AXP_OPERAND_IR | \ + AXP_OPERAND_FPR | AXP_OPERAND_RELATIVE | AXP_OPERAND_SIGNED | \ + AXP_OPERAND_UNSIGNED) + +/* This operand does not actually exist in the assembler input. This + is used to support extended mnemonics, for which two operands fields + are identical. The assembler should call the insert function with + any op value. The disassembler should call the extract function, + ignore the return value, and check the value placed in the invalid + argument. */ +#define AXP_OPERAND_FAKE 01 + +/* The operand should be wrapped in parentheses rather than separated + from the previous by a comma. This is used for the load and store + instructions which want their operands to look like "Ra,disp(Rb)". */ +#define AXP_OPERAND_PARENS 02 + +/* Used in combination with PARENS, this supresses the supression of + the comma. This is used for "jmp Ra,(Rb),hint". */ +#define AXP_OPERAND_COMMA 04 + +/* This operand names an integer register. */ +#define AXP_OPERAND_IR 010 + +/* This operand names a floating point register. */ +#define AXP_OPERAND_FPR 020 + +/* This operand is a relative branch displacement. The disassembler + prints these symbolically if possible. */ +#define AXP_OPERAND_RELATIVE 040 + +/* This operand takes signed values. */ +#define AXP_OPERAND_SIGNED 0100 + +/* This operand takes unsigned values. This exists primarily so that + a flags value of 0 can be treated as end-of-arguments. */ +#define AXP_OPERAND_UNSIGNED 0200 + +/* Supress overflow detection on this field. This is used for hints. */ +#define AXP_OPERAND_NOOVERFLOW 0400 + +/* Mask for optional argument default value. */ +#define AXP_OPERAND_OPTIONAL_MASK 07000 + +/* This operand defaults to zero. This is used for jump hints. */ +#define AXP_OPERAND_DEFAULT_ZERO 01000 + +/* This operand should default to the first (real) operand and is used + in conjunction with AXP_OPERAND_OPTIONAL. This allows + "and $0,3,$0" to be written as "and $0,3", etc. I don't like + it, but it's what DEC does. */ +#define AXP_OPERAND_DEFAULT_FIRST 02000 + +/* Similarly, this operand should default to the second (real) operand. + This allows "negl $0" instead of "negl $0,$0". */ +#define AXP_OPERAND_DEFAULT_SECOND 04000 + + +/* Register common names */ + +#define AXP_REG_V0 0 +#define AXP_REG_T0 1 +#define AXP_REG_T1 2 +#define AXP_REG_T2 3 +#define AXP_REG_T3 4 +#define AXP_REG_T4 5 +#define AXP_REG_T5 6 +#define AXP_REG_T6 7 +#define AXP_REG_T7 8 +#define AXP_REG_S0 9 +#define AXP_REG_S1 10 +#define AXP_REG_S2 11 +#define AXP_REG_S3 12 +#define AXP_REG_S4 13 +#define AXP_REG_S5 14 +#define AXP_REG_FP 15 +#define AXP_REG_A0 16 +#define AXP_REG_A1 17 +#define AXP_REG_A2 18 +#define AXP_REG_A3 19 +#define AXP_REG_A4 20 +#define AXP_REG_A5 21 +#define AXP_REG_T8 22 +#define AXP_REG_T9 23 +#define AXP_REG_T10 24 +#define AXP_REG_T11 25 +#define AXP_REG_RA 26 +#define AXP_REG_PV 27 +#define AXP_REG_T12 27 +#define AXP_REG_AT 28 +#define AXP_REG_GP 29 +#define AXP_REG_SP 30 +#define AXP_REG_ZERO 31 + +#endif /* OPCODE_ALPHA_H */ diff --git a/include/opcode/arc.h b/include/opcode/arc.h new file mode 100644 index 0000000..695fec1 --- /dev/null +++ b/include/opcode/arc.h @@ -0,0 +1,322 @@ +/* Opcode table for the ARC. + Copyright 1994, 1995, 1997, 2001, 2002, 2003, 2010 + Free Software Foundation, Inc. + Contributed by Doug Evans (dje@cygnus.com). + + This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and + the GNU Binutils. + + GAS/GDB 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, or (at your option) + any later version. + + GAS/GDB 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 GAS or GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* List of the various cpu types. + The tables currently use bit masks to say whether the instruction or + whatever is supported by a particular cpu. This lets us have one entry + apply to several cpus. + + The `base' cpu must be 0. The cpu type is treated independently of + endianness. The complete `mach' number includes endianness. + These values are internal to opcodes/bfd/binutils/gas. */ +#define ARC_MACH_5 0 +#define ARC_MACH_6 1 +#define ARC_MACH_7 2 +#define ARC_MACH_8 4 + +/* Additional cpu values can be inserted here and ARC_MACH_BIG moved down. */ +#define ARC_MACH_BIG 16 + +/* Mask of number of bits necessary to record cpu type. */ +#define ARC_MACH_CPU_MASK (ARC_MACH_BIG - 1) + +/* Mask of number of bits necessary to record cpu type + endianness. */ +#define ARC_MACH_MASK ((ARC_MACH_BIG << 1) - 1) + +/* Type to denote an ARC instruction (at least a 32 bit unsigned int). */ + +typedef unsigned int arc_insn; + +struct arc_opcode { + char *syntax; /* syntax of insn */ + unsigned long mask, value; /* recognize insn if (op&mask) == value */ + int flags; /* various flag bits */ + +/* Values for `flags'. */ + +/* Return CPU number, given flag bits. */ +#define ARC_OPCODE_CPU(bits) ((bits) & ARC_MACH_CPU_MASK) + +/* Return MACH number, given flag bits. */ +#define ARC_OPCODE_MACH(bits) ((bits) & ARC_MACH_MASK) + +/* First opcode flag bit available after machine mask. */ +#define ARC_OPCODE_FLAG_START (ARC_MACH_MASK + 1) + +/* This insn is a conditional branch. */ +#define ARC_OPCODE_COND_BRANCH (ARC_OPCODE_FLAG_START) +#define SYNTAX_3OP (ARC_OPCODE_COND_BRANCH << 1) +#define SYNTAX_LENGTH (SYNTAX_3OP ) +#define SYNTAX_2OP (SYNTAX_3OP << 1) +#define OP1_MUST_BE_IMM (SYNTAX_2OP << 1) +#define OP1_IMM_IMPLIED (OP1_MUST_BE_IMM << 1) +#define SYNTAX_VALID (OP1_IMM_IMPLIED << 1) + +#define I(x) (((x) & 31) << 27) +#define A(x) (((x) & ARC_MASK_REG) << ARC_SHIFT_REGA) +#define B(x) (((x) & ARC_MASK_REG) << ARC_SHIFT_REGB) +#define C(x) (((x) & ARC_MASK_REG) << ARC_SHIFT_REGC) +#define R(x,b,m) (((x) & (m)) << (b)) /* value X, mask M, at bit B */ + +/* These values are used to optimize assembly and disassembly. Each insn + is on a list of related insns (same first letter for assembly, same + insn code for disassembly). */ + + struct arc_opcode *next_asm; /* Next instr to try during assembly. */ + struct arc_opcode *next_dis; /* Next instr to try during disassembly. */ + +/* Macros to create the hash values for the lists. */ +#define ARC_HASH_OPCODE(string) \ + ((string)[0] >= 'a' && (string)[0] <= 'z' ? (string)[0] - 'a' : 26) +#define ARC_HASH_ICODE(insn) \ + ((unsigned int) (insn) >> 27) + + /* Macros to access `next_asm', `next_dis' so users needn't care about the + underlying mechanism. */ +#define ARC_OPCODE_NEXT_ASM(op) ((op)->next_asm) +#define ARC_OPCODE_NEXT_DIS(op) ((op)->next_dis) +}; + +/* this is an "insert at front" linked list per Metaware spec + that new definitions override older ones. */ +extern struct arc_opcode *arc_ext_opcodes; + +struct arc_operand_value { + char *name; /* eg: "eq" */ + short value; /* eg: 1 */ + unsigned char type; /* index into `arc_operands' */ + unsigned char flags; /* various flag bits */ + +/* Values for `flags'. */ + +/* Return CPU number, given flag bits. */ +#define ARC_OPVAL_CPU(bits) ((bits) & ARC_MACH_CPU_MASK) +/* Return MACH number, given flag bits. */ +#define ARC_OPVAL_MACH(bits) ((bits) & ARC_MACH_MASK) +}; + +struct arc_ext_operand_value { + struct arc_ext_operand_value *next; + struct arc_operand_value operand; +}; + +extern struct arc_ext_operand_value *arc_ext_operands; + +struct arc_operand { +/* One of the insn format chars. */ + unsigned char fmt; + +/* The number of bits in the operand (may be unused for a modifier). */ + unsigned char bits; + +/* How far the operand is left shifted in the instruction, or + the modifier's flag bit (may be unused for a modifier. */ + unsigned char shift; + +/* Various flag bits. */ + int flags; + +/* Values for `flags'. */ + +/* This operand is a suffix to the opcode. */ +#define ARC_OPERAND_SUFFIX 1 + +/* This operand is a relative branch displacement. The disassembler + prints these symbolically if possible. */ +#define ARC_OPERAND_RELATIVE_BRANCH 2 + +/* This operand is an absolute branch address. The disassembler + prints these symbolically if possible. */ +#define ARC_OPERAND_ABSOLUTE_BRANCH 4 + +/* This operand is an address. The disassembler + prints these symbolically if possible. */ +#define ARC_OPERAND_ADDRESS 8 + +/* This operand is a long immediate value. */ +#define ARC_OPERAND_LIMM 0x10 + +/* This operand takes signed values. */ +#define ARC_OPERAND_SIGNED 0x20 + +/* This operand takes signed values, but also accepts a full positive + range of values. That is, if bits is 16, it takes any value from + -0x8000 to 0xffff. */ +#define ARC_OPERAND_SIGNOPT 0x40 + +/* This operand should be regarded as a negative number for the + purposes of overflow checking (i.e., the normal most negative + number is disallowed and one more than the normal most positive + number is allowed). This flag will only be set for a signed + operand. */ +#define ARC_OPERAND_NEGATIVE 0x80 + +/* This operand doesn't really exist. The program uses these operands + in special ways. */ +#define ARC_OPERAND_FAKE 0x100 + +/* separate flags operand for j and jl instructions */ +#define ARC_OPERAND_JUMPFLAGS 0x200 + +/* allow warnings and errors to be issued after call to insert_xxxxxx */ +#define ARC_OPERAND_WARN 0x400 +#define ARC_OPERAND_ERROR 0x800 + +/* this is a load operand */ +#define ARC_OPERAND_LOAD 0x8000 + +/* this is a store operand */ +#define ARC_OPERAND_STORE 0x10000 + +/* Modifier values. */ +/* A dot is required before a suffix. Eg: .le */ +#define ARC_MOD_DOT 0x1000 + +/* A normal register is allowed (not used, but here for completeness). */ +#define ARC_MOD_REG 0x2000 + +/* An auxiliary register name is expected. */ +#define ARC_MOD_AUXREG 0x4000 + +/* Sum of all ARC_MOD_XXX bits. */ +#define ARC_MOD_BITS 0x7000 + +/* Non-zero if the operand type is really a modifier. */ +#define ARC_MOD_P(X) ((X) & ARC_MOD_BITS) + +/* enforce read/write only register restrictions */ +#define ARC_REGISTER_READONLY 0x01 +#define ARC_REGISTER_WRITEONLY 0x02 +#define ARC_REGISTER_NOSHORT_CUT 0x04 + +/* Insertion function. This is used by the assembler. To insert an + operand value into an instruction, check this field. + + If it is NULL, execute + i |= (p & ((1 << o->bits) - 1)) << o->shift; + (I is the instruction which we are filling in, O is a pointer to + this structure, and OP is the opcode value; this assumes twos + complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction and the operand value. It will return the new value + of the instruction. If the ERRMSG argument is not NULL, then if + the operand value is illegal, *ERRMSG will be set to a warning + string (the operand will be inserted in any case). If the + operand value is legal, *ERRMSG will be unchanged. + + REG is non-NULL when inserting a register value. */ + + arc_insn (*insert) + (arc_insn insn, const struct arc_operand *operand, int mods, + const struct arc_operand_value *reg, long value, const char **errmsg); + +/* Extraction function. This is used by the disassembler. To + extract this operand type from an instruction, check this field. + + If it is NULL, compute + op = ((i) >> o->shift) & ((1 << o->bits) - 1); + if ((o->flags & ARC_OPERAND_SIGNED) != 0 + && (op & (1 << (o->bits - 1))) != 0) + op -= 1 << o->bits; + (I is the instruction, O is a pointer to this structure, and OP + is the result; this assumes twos complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction value. It will return the value of the operand. If + the INVALID argument is not NULL, *INVALID will be set to + non-zero if this operand type can not actually be extracted from + this operand (i.e., the instruction does not match). If the + operand is valid, *INVALID will not be changed. + + INSN is a pointer to an array of two `arc_insn's. The first element is + the insn, the second is the limm if present. + + Operands that have a printable form like registers and suffixes have + their struct arc_operand_value pointer stored in OPVAL. */ + + long (*extract) + (arc_insn *insn, const struct arc_operand *operand, int mods, + const struct arc_operand_value **opval, int *invalid); +}; + +/* Bits that say what version of cpu we have. These should be passed to + arc_init_opcode_tables. At present, all there is is the cpu type. */ + +/* CPU number, given value passed to `arc_init_opcode_tables'. */ +#define ARC_HAVE_CPU(bits) ((bits) & ARC_MACH_CPU_MASK) +/* MACH number, given value passed to `arc_init_opcode_tables'. */ +#define ARC_HAVE_MACH(bits) ((bits) & ARC_MACH_MASK) + +/* Special register values: */ +#define ARC_REG_SHIMM_UPDATE 61 +#define ARC_REG_SHIMM 63 +#define ARC_REG_LIMM 62 + +/* Non-zero if REG is a constant marker. */ +#define ARC_REG_CONSTANT_P(REG) ((REG) >= 61) + +/* Positions and masks of various fields: */ +#define ARC_SHIFT_REGA 21 +#define ARC_SHIFT_REGB 15 +#define ARC_SHIFT_REGC 9 +#define ARC_MASK_REG 63 + +/* Delay slot types. */ +#define ARC_DELAY_NONE 0 /* no delay slot */ +#define ARC_DELAY_NORMAL 1 /* delay slot in both cases */ +#define ARC_DELAY_JUMP 2 /* delay slot only if branch taken */ + +/* Non-zero if X will fit in a signed 9 bit field. */ +#define ARC_SHIMM_CONST_P(x) ((long) (x) >= -256 && (long) (x) <= 255) + +extern const struct arc_operand arc_operands[]; +extern const int arc_operand_count; +extern struct arc_opcode arc_opcodes[]; +extern const int arc_opcodes_count; +extern const struct arc_operand_value arc_suffixes[]; +extern const int arc_suffixes_count; +extern const struct arc_operand_value arc_reg_names[]; +extern const int arc_reg_names_count; +extern unsigned char arc_operand_map[]; + +/* Utility fns in arc-opc.c. */ +int arc_get_opcode_mach (int, int); + +/* `arc_opcode_init_tables' must be called before `arc_xxx_supported'. */ +void arc_opcode_init_tables (int); +void arc_opcode_init_insert (void); +void arc_opcode_init_extract (void); +const struct arc_opcode *arc_opcode_lookup_asm (const char *); +const struct arc_opcode *arc_opcode_lookup_dis (unsigned int); +int arc_opcode_limm_p (long *); +const struct arc_operand_value *arc_opcode_lookup_suffix + (const struct arc_operand *type, int value); +int arc_opcode_supported (const struct arc_opcode *); +int arc_opval_supported (const struct arc_operand_value *); +int arc_limm_fixup_adjust (arc_insn); +int arc_insn_is_j (arc_insn); +int arc_insn_not_jl (arc_insn); +int arc_operand_type (int); +struct arc_operand_value *get_ext_suffix (char *); +int arc_get_noshortcut_flag (void); diff --git a/include/opcode/arm.h b/include/opcode/arm.h new file mode 100644 index 0000000..851fd3c --- /dev/null +++ b/include/opcode/arm.h @@ -0,0 +1,289 @@ +/* ARM assembler/disassembler support. + Copyright 2004, 2010, 2011 Free Software Foundation, Inc. + + This file is part of GDB and GAS. + + GDB and GAS are 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, or (at + your option) any later version. + + GDB and GAS are 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 GDB or GAS; see the file COPYING3. If not, write to the + Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* The following bitmasks control CPU extensions: */ +#define ARM_EXT_V1 0x00000001 /* All processors (core set). */ +#define ARM_EXT_V2 0x00000002 /* Multiply instructions. */ +#define ARM_EXT_V2S 0x00000004 /* SWP instructions. */ +#define ARM_EXT_V3 0x00000008 /* MSR MRS. */ +#define ARM_EXT_V3M 0x00000010 /* Allow long multiplies. */ +#define ARM_EXT_V4 0x00000020 /* Allow half word loads. */ +#define ARM_EXT_V4T 0x00000040 /* Thumb. */ +#define ARM_EXT_V5 0x00000080 /* Allow CLZ, etc. */ +#define ARM_EXT_V5T 0x00000100 /* Improved interworking. */ +#define ARM_EXT_V5ExP 0x00000200 /* DSP core set. */ +#define ARM_EXT_V5E 0x00000400 /* DSP Double transfers. */ +#define ARM_EXT_V5J 0x00000800 /* Jazelle extension. */ +#define ARM_EXT_V6 0x00001000 /* ARM V6. */ +#define ARM_EXT_V6K 0x00002000 /* ARM V6K. */ +/* 0x00004000 Was ARM V6Z. */ +#define ARM_EXT_V8 0x00004000 /* is now ARMv8. */ +#define ARM_EXT_V6T2 0x00008000 /* Thumb-2. */ +#define ARM_EXT_DIV 0x00010000 /* Integer division. */ +/* The 'M' in Arm V7M stands for Microcontroller. + On earlier architecture variants it stands for Multiply. */ +#define ARM_EXT_V5E_NOTM 0x00020000 /* Arm V5E but not Arm V7M. */ +#define ARM_EXT_V6_NOTM 0x00040000 /* Arm V6 but not Arm V7M. */ +#define ARM_EXT_V7 0x00080000 /* Arm V7. */ +#define ARM_EXT_V7A 0x00100000 /* Arm V7A. */ +#define ARM_EXT_V7R 0x00200000 /* Arm V7R. */ +#define ARM_EXT_V7M 0x00400000 /* Arm V7M. */ +#define ARM_EXT_V6M 0x00800000 /* ARM V6M. */ +#define ARM_EXT_BARRIER 0x01000000 /* DSB/DMB/ISB. */ +#define ARM_EXT_THUMB_MSR 0x02000000 /* Thumb MSR/MRS. */ +#define ARM_EXT_V6_DSP 0x04000000 /* ARM v6 (DSP-related), + not in v7-M. */ +#define ARM_EXT_MP 0x08000000 /* Multiprocessing Extensions. */ +#define ARM_EXT_SEC 0x10000000 /* Security extensions. */ +#define ARM_EXT_OS 0x20000000 /* OS Extensions. */ +#define ARM_EXT_ADIV 0x40000000 /* Integer divide extensions in ARM + state. */ +#define ARM_EXT_VIRT 0x80000000 /* Virtualization extensions. */ + +/* Co-processor space extensions. */ +#define ARM_CEXT_XSCALE 0x00000001 /* Allow MIA etc. */ +#define ARM_CEXT_MAVERICK 0x00000002 /* Use Cirrus/DSP coprocessor. */ +#define ARM_CEXT_IWMMXT 0x00000004 /* Intel Wireless MMX technology coprocessor. */ +#define ARM_CEXT_IWMMXT2 0x00000008 /* Intel Wireless MMX technology coprocessor version 2. */ + +#define FPU_ENDIAN_PURE 0x80000000 /* Pure-endian doubles. */ +#define FPU_ENDIAN_BIG 0 /* Double words-big-endian. */ +#define FPU_FPA_EXT_V1 0x40000000 /* Base FPA instruction set. */ +#define FPU_FPA_EXT_V2 0x20000000 /* LFM/SFM. */ +#define FPU_MAVERICK 0x10000000 /* Cirrus Maverick. */ +#define FPU_VFP_EXT_V1xD 0x08000000 /* Base VFP instruction set. */ +#define FPU_VFP_EXT_V1 0x04000000 /* Double-precision insns. */ +#define FPU_VFP_EXT_V2 0x02000000 /* ARM10E VFPr1. */ +#define FPU_VFP_EXT_V3xD 0x01000000 /* VFPv3 single-precision. */ +#define FPU_VFP_EXT_V3 0x00800000 /* VFPv3 double-precision. */ +#define FPU_NEON_EXT_V1 0x00400000 /* Neon (SIMD) insns. */ +#define FPU_VFP_EXT_D32 0x00200000 /* Registers D16-D31. */ +#define FPU_VFP_EXT_FP16 0x00100000 /* Half-precision extensions. */ +#define FPU_NEON_EXT_FMA 0x00080000 /* Neon fused multiply-add */ +#define FPU_VFP_EXT_FMA 0x00040000 /* VFP fused multiply-add */ +#define FPU_VFP_EXT_ARMV8 0x00020000 /* FP for ARMv8. */ +#define FPU_NEON_EXT_ARMV8 0x00010000 /* Neon for ARMv8. */ +#define FPU_CRYPTO_EXT_ARMV8 0x00008000 /* Crypto for ARMv8. */ +#define CRC_EXT_ARMV8 0x00004000 /* CRC32 for ARMv8. */ + +/* Architectures are the sum of the base and extensions. The ARM ARM (rev E) + defines the following: ARMv3, ARMv3M, ARMv4xM, ARMv4, ARMv4TxM, ARMv4T, + ARMv5xM, ARMv5, ARMv5TxM, ARMv5T, ARMv5TExP, ARMv5TE. To these we add + three more to cover cores prior to ARM6. Finally, there are cores which + implement further extensions in the co-processor space. */ +#define ARM_AEXT_V1 ARM_EXT_V1 +#define ARM_AEXT_V2 (ARM_AEXT_V1 | ARM_EXT_V2) +#define ARM_AEXT_V2S (ARM_AEXT_V2 | ARM_EXT_V2S) +#define ARM_AEXT_V3 (ARM_AEXT_V2S | ARM_EXT_V3) +#define ARM_AEXT_V3M (ARM_AEXT_V3 | ARM_EXT_V3M) +#define ARM_AEXT_V4xM (ARM_AEXT_V3 | ARM_EXT_V4) +#define ARM_AEXT_V4 (ARM_AEXT_V3M | ARM_EXT_V4) +#define ARM_AEXT_V4TxM (ARM_AEXT_V4xM | ARM_EXT_V4T) +#define ARM_AEXT_V4T (ARM_AEXT_V4 | ARM_EXT_V4T) +#define ARM_AEXT_V5xM (ARM_AEXT_V4xM | ARM_EXT_V5) +#define ARM_AEXT_V5 (ARM_AEXT_V4 | ARM_EXT_V5) +#define ARM_AEXT_V5TxM (ARM_AEXT_V5xM | ARM_EXT_V4T | ARM_EXT_V5T) +#define ARM_AEXT_V5T (ARM_AEXT_V5 | ARM_EXT_V4T | ARM_EXT_V5T) +#define ARM_AEXT_V5TExP (ARM_AEXT_V5T | ARM_EXT_V5ExP) +#define ARM_AEXT_V5TE (ARM_AEXT_V5TExP | ARM_EXT_V5E) +#define ARM_AEXT_V5TEJ (ARM_AEXT_V5TE | ARM_EXT_V5J) +#define ARM_AEXT_V6 (ARM_AEXT_V5TEJ | ARM_EXT_V6) +#define ARM_AEXT_V6K (ARM_AEXT_V6 | ARM_EXT_V6K) +#define ARM_AEXT_V6Z (ARM_AEXT_V6K | ARM_EXT_SEC) +#define ARM_AEXT_V6ZK (ARM_AEXT_V6K | ARM_EXT_SEC) +#define ARM_AEXT_V6T2 (ARM_AEXT_V6 \ + | ARM_EXT_V6T2 | ARM_EXT_V6_NOTM | ARM_EXT_THUMB_MSR \ + | ARM_EXT_V6_DSP ) +#define ARM_AEXT_V6KT2 (ARM_AEXT_V6T2 | ARM_EXT_V6K) +#define ARM_AEXT_V6ZT2 (ARM_AEXT_V6T2 | ARM_EXT_SEC) +#define ARM_AEXT_V6ZKT2 (ARM_AEXT_V6T2 | ARM_EXT_V6K | ARM_EXT_SEC) +#define ARM_AEXT_V7_ARM (ARM_AEXT_V6KT2 | ARM_EXT_V7 | ARM_EXT_BARRIER) +#define ARM_AEXT_V7A (ARM_AEXT_V7_ARM | ARM_EXT_V7A) +#define ARM_AEXT_V7R (ARM_AEXT_V7_ARM | ARM_EXT_V7R | ARM_EXT_DIV) +#define ARM_AEXT_NOTM \ + (ARM_AEXT_V4 | ARM_EXT_V5ExP | ARM_EXT_V5J | ARM_EXT_V6_NOTM \ + | ARM_EXT_V6_DSP ) +#define ARM_AEXT_V6M_ONLY \ + ((ARM_EXT_BARRIER | ARM_EXT_V6M | ARM_EXT_THUMB_MSR) & ~(ARM_AEXT_NOTM)) +#define ARM_AEXT_V6M \ + ((ARM_AEXT_V6K | ARM_AEXT_V6M_ONLY) & ~(ARM_AEXT_NOTM)) +#define ARM_AEXT_V6SM (ARM_AEXT_V6M | ARM_EXT_OS) +#define ARM_AEXT_V7M \ + ((ARM_AEXT_V7_ARM | ARM_EXT_V6M | ARM_EXT_V7M | ARM_EXT_DIV) \ + & ~(ARM_AEXT_NOTM)) +#define ARM_AEXT_V7 (ARM_AEXT_V7A & ARM_AEXT_V7R & ARM_AEXT_V7M) +#define ARM_AEXT_V7EM \ + (ARM_AEXT_V7M | ARM_EXT_V5ExP | ARM_EXT_V6_DSP) +#define ARM_AEXT_V8A \ + (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC | ARM_EXT_DIV | ARM_EXT_ADIV \ + | ARM_EXT_VIRT | ARM_EXT_V8) + +/* Processors with specific extensions in the co-processor space. */ +#define ARM_ARCH_XSCALE ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE) +#define ARM_ARCH_IWMMXT \ + ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT) +#define ARM_ARCH_IWMMXT2 \ + ARM_FEATURE (ARM_AEXT_V5TE, ARM_CEXT_XSCALE | ARM_CEXT_IWMMXT | ARM_CEXT_IWMMXT2) + +#define FPU_VFP_V1xD (FPU_VFP_EXT_V1xD | FPU_ENDIAN_PURE) +#define FPU_VFP_V1 (FPU_VFP_V1xD | FPU_VFP_EXT_V1) +#define FPU_VFP_V2 (FPU_VFP_V1 | FPU_VFP_EXT_V2) +#define FPU_VFP_V3D16 (FPU_VFP_V2 | FPU_VFP_EXT_V3xD | FPU_VFP_EXT_V3) +#define FPU_VFP_V3 (FPU_VFP_V3D16 | FPU_VFP_EXT_D32) +#define FPU_VFP_V3xD (FPU_VFP_V1xD | FPU_VFP_EXT_V2 | FPU_VFP_EXT_V3xD) +#define FPU_VFP_V4D16 (FPU_VFP_V3D16 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA) +#define FPU_VFP_V4 (FPU_VFP_V3 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA) +#define FPU_VFP_V4_SP_D16 (FPU_VFP_V3xD | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA) +#define FPU_VFP_ARMV8 (FPU_VFP_V4 | FPU_VFP_EXT_ARMV8) +#define FPU_NEON_ARMV8 (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA | FPU_NEON_EXT_ARMV8) +#define FPU_CRYPTO_ARMV8 (FPU_CRYPTO_EXT_ARMV8) +#define FPU_VFP_HARD (FPU_VFP_EXT_V1xD | FPU_VFP_EXT_V1 | FPU_VFP_EXT_V2 \ + | FPU_VFP_EXT_V3xD | FPU_VFP_EXT_FMA | FPU_NEON_EXT_FMA \ + | FPU_VFP_EXT_V3 | FPU_NEON_EXT_V1 | FPU_VFP_EXT_D32) +#define FPU_FPA (FPU_FPA_EXT_V1 | FPU_FPA_EXT_V2) + +/* Deprecated. */ +#define FPU_ARCH_VFP ARM_FEATURE (0, FPU_ENDIAN_PURE) + +#define FPU_ARCH_FPE ARM_FEATURE (0, FPU_FPA_EXT_V1) +#define FPU_ARCH_FPA ARM_FEATURE (0, FPU_FPA) + +#define FPU_ARCH_VFP_V1xD ARM_FEATURE (0, FPU_VFP_V1xD) +#define FPU_ARCH_VFP_V1 ARM_FEATURE (0, FPU_VFP_V1) +#define FPU_ARCH_VFP_V2 ARM_FEATURE (0, FPU_VFP_V2) +#define FPU_ARCH_VFP_V3D16 ARM_FEATURE (0, FPU_VFP_V3D16) +#define FPU_ARCH_VFP_V3D16_FP16 \ + ARM_FEATURE (0, FPU_VFP_V3D16 | FPU_VFP_EXT_FP16) +#define FPU_ARCH_VFP_V3 ARM_FEATURE (0, FPU_VFP_V3) +#define FPU_ARCH_VFP_V3_FP16 ARM_FEATURE (0, FPU_VFP_V3 | FPU_VFP_EXT_FP16) +#define FPU_ARCH_VFP_V3xD ARM_FEATURE (0, FPU_VFP_V3xD) +#define FPU_ARCH_VFP_V3xD_FP16 ARM_FEATURE (0, FPU_VFP_V3xD | FPU_VFP_EXT_FP16) +#define FPU_ARCH_NEON_V1 ARM_FEATURE (0, FPU_NEON_EXT_V1) +#define FPU_ARCH_VFP_V3_PLUS_NEON_V1 \ + ARM_FEATURE (0, FPU_VFP_V3 | FPU_NEON_EXT_V1) +#define FPU_ARCH_NEON_FP16 \ + ARM_FEATURE (0, FPU_VFP_V3 | FPU_NEON_EXT_V1 | FPU_VFP_EXT_FP16) +#define FPU_ARCH_VFP_HARD ARM_FEATURE (0, FPU_VFP_HARD) +#define FPU_ARCH_VFP_V4 ARM_FEATURE(0, FPU_VFP_V4) +#define FPU_ARCH_VFP_V4D16 ARM_FEATURE(0, FPU_VFP_V4D16) +#define FPU_ARCH_VFP_V4_SP_D16 ARM_FEATURE(0, FPU_VFP_V4_SP_D16) +#define FPU_ARCH_NEON_VFP_V4 \ + ARM_FEATURE(0, FPU_VFP_V4 | FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA) +#define FPU_ARCH_VFP_ARMV8 ARM_FEATURE(0, FPU_VFP_ARMV8) +#define FPU_ARCH_NEON_VFP_ARMV8 ARM_FEATURE(0, FPU_NEON_ARMV8 | FPU_VFP_ARMV8) +#define FPU_ARCH_CRYPTO_NEON_VFP_ARMV8 \ + ARM_FEATURE(0, FPU_CRYPTO_ARMV8 | FPU_NEON_ARMV8 | FPU_VFP_ARMV8) +#define ARCH_CRC_ARMV8 ARM_FEATURE(0, CRC_EXT_ARMV8) + +#define FPU_ARCH_ENDIAN_PURE ARM_FEATURE (0, FPU_ENDIAN_PURE) + +#define FPU_ARCH_MAVERICK ARM_FEATURE (0, FPU_MAVERICK) + +#define ARM_ARCH_V1 ARM_FEATURE (ARM_AEXT_V1, 0) +#define ARM_ARCH_V2 ARM_FEATURE (ARM_AEXT_V2, 0) +#define ARM_ARCH_V2S ARM_FEATURE (ARM_AEXT_V2S, 0) +#define ARM_ARCH_V3 ARM_FEATURE (ARM_AEXT_V3, 0) +#define ARM_ARCH_V3M ARM_FEATURE (ARM_AEXT_V3M, 0) +#define ARM_ARCH_V4xM ARM_FEATURE (ARM_AEXT_V4xM, 0) +#define ARM_ARCH_V4 ARM_FEATURE (ARM_AEXT_V4, 0) +#define ARM_ARCH_V4TxM ARM_FEATURE (ARM_AEXT_V4TxM, 0) +#define ARM_ARCH_V4T ARM_FEATURE (ARM_AEXT_V4T, 0) +#define ARM_ARCH_V5xM ARM_FEATURE (ARM_AEXT_V5xM, 0) +#define ARM_ARCH_V5 ARM_FEATURE (ARM_AEXT_V5, 0) +#define ARM_ARCH_V5TxM ARM_FEATURE (ARM_AEXT_V5TxM, 0) +#define ARM_ARCH_V5T ARM_FEATURE (ARM_AEXT_V5T, 0) +#define ARM_ARCH_V5TExP ARM_FEATURE (ARM_AEXT_V5TExP, 0) +#define ARM_ARCH_V5TE ARM_FEATURE (ARM_AEXT_V5TE, 0) +#define ARM_ARCH_V5TEJ ARM_FEATURE (ARM_AEXT_V5TEJ, 0) +#define ARM_ARCH_V6 ARM_FEATURE (ARM_AEXT_V6, 0) +#define ARM_ARCH_V6K ARM_FEATURE (ARM_AEXT_V6K, 0) +#define ARM_ARCH_V6Z ARM_FEATURE (ARM_AEXT_V6Z, 0) +#define ARM_ARCH_V6ZK ARM_FEATURE (ARM_AEXT_V6ZK, 0) +#define ARM_ARCH_V6T2 ARM_FEATURE (ARM_AEXT_V6T2, 0) +#define ARM_ARCH_V6KT2 ARM_FEATURE (ARM_AEXT_V6KT2, 0) +#define ARM_ARCH_V6ZT2 ARM_FEATURE (ARM_AEXT_V6ZT2, 0) +#define ARM_ARCH_V6ZKT2 ARM_FEATURE (ARM_AEXT_V6ZKT2, 0) +#define ARM_ARCH_V6M ARM_FEATURE (ARM_AEXT_V6M, 0) +#define ARM_ARCH_V6SM ARM_FEATURE (ARM_AEXT_V6SM, 0) +#define ARM_ARCH_V7 ARM_FEATURE (ARM_AEXT_V7, 0) +#define ARM_ARCH_V7A ARM_FEATURE (ARM_AEXT_V7A, 0) +#define ARM_ARCH_V7R ARM_FEATURE (ARM_AEXT_V7R, 0) +#define ARM_ARCH_V7M ARM_FEATURE (ARM_AEXT_V7M, 0) +#define ARM_ARCH_V7EM ARM_FEATURE (ARM_AEXT_V7EM, 0) +#define ARM_ARCH_V8A ARM_FEATURE (ARM_AEXT_V8A, 0) + +/* Some useful combinations: */ +#define ARM_ARCH_NONE ARM_FEATURE (0, 0) +#define FPU_NONE ARM_FEATURE (0, 0) +#define ARM_ANY ARM_FEATURE (-1, 0) /* Any basic core. */ +#define FPU_ANY_HARD ARM_FEATURE (0, FPU_FPA | FPU_VFP_HARD | FPU_MAVERICK) +#define ARM_ARCH_THUMB2 ARM_FEATURE (ARM_EXT_V6T2 | ARM_EXT_V7 | ARM_EXT_V7A | ARM_EXT_V7R | ARM_EXT_V7M | ARM_EXT_DIV, 0) +/* v7-a+sec. */ +#define ARM_ARCH_V7A_SEC ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_SEC, 0) +/* v7-a+mp+sec. */ +#define ARM_ARCH_V7A_MP_SEC \ + ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC, \ + 0) +/* v7-a+idiv+mp+sec+virt. */ +#define ARM_ARCH_V7A_IDIV_MP_SEC_VIRT \ + ARM_FEATURE (ARM_AEXT_V7A | ARM_EXT_MP | ARM_EXT_SEC \ + | ARM_EXT_DIV | ARM_EXT_ADIV \ + | ARM_EXT_VIRT, 0) +/* v7-r+idiv. */ +#define ARM_ARCH_V7R_IDIV ARM_FEATURE (ARM_AEXT_V7R | ARM_EXT_ADIV, 0) +/* Features that are present in v6M and v6S-M but not other v6 cores. */ +#define ARM_ARCH_V6M_ONLY ARM_FEATURE (ARM_AEXT_V6M_ONLY, 0) +/* v8-a+fp. */ +#define ARM_ARCH_V8A_FP ARM_FEATURE (ARM_AEXT_V8A, FPU_ARCH_VFP_ARMV8) +/* v8-a+simd (implies fp). */ +#define ARM_ARCH_V8A_SIMD ARM_FEATURE (ARM_AEXT_V8A, \ + FPU_ARCH_NEON_VFP_ARMV8) +/* v8-a+crypto (implies simd+fp). */ +#define ARM_ARCH_V8A_CRYPTOV1 ARM_FEATURE (ARM_AEXT_V8A, \ + FPU_ARCH_CRYPTO_NEON_VFP_ARMV8) + +/* There are too many feature bits to fit in a single word, so use a + structure. For simplicity we put all core features in one word and + everything else in the other. */ +typedef struct +{ + unsigned long core; + unsigned long coproc; +} arm_feature_set; + +#define ARM_CPU_HAS_FEATURE(CPU,FEAT) \ + (((CPU).core & (FEAT).core) != 0 || ((CPU).coproc & (FEAT).coproc) != 0) + +#define ARM_CPU_IS_ANY(CPU) \ + ((CPU).core == ((arm_feature_set)ARM_ANY).core) + +#define ARM_MERGE_FEATURE_SETS(TARG,F1,F2) \ + do { \ + (TARG).core = (F1).core | (F2).core; \ + (TARG).coproc = (F1).coproc | (F2).coproc; \ + } while (0) + +#define ARM_CLEAR_FEATURE(TARG,F1,F2) \ + do { \ + (TARG).core = (F1).core &~ (F2).core; \ + (TARG).coproc = (F1).coproc &~ (F2).coproc; \ + } while (0) + +#define ARM_FEATURE(core, coproc) {(core), (coproc)} diff --git a/include/opcode/avr.h b/include/opcode/avr.h new file mode 100644 index 0000000..f1d73ad --- /dev/null +++ b/include/opcode/avr.h @@ -0,0 +1,300 @@ +/* Opcode table for the Atmel AVR micro controllers. + + Copyright 2000, 2001, 2004, 2006, 2008, 2010, 2012 Free Software Foundation, Inc. + Contributed by Denis Chertykov + + 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define AVR_ISA_1200 0x0001 /* In the beginning there was ... */ +#define AVR_ISA_LPM 0x0002 /* device has LPM */ +#define AVR_ISA_LPMX 0x0004 /* device has LPM Rd,Z[+] */ +#define AVR_ISA_SRAM 0x0008 /* device has SRAM (LD, ST, PUSH, POP, ...) */ +#define AVR_ISA_MEGA 0x0020 /* device has >8K program memory (JMP and CALL + supported, no 8K wrap on RJMP and RCALL) */ +#define AVR_ISA_MUL 0x0040 /* device has new core (MUL, FMUL, ...) */ +#define AVR_ISA_ELPM 0x0080 /* device has >64K program memory (ELPM) */ +#define AVR_ISA_ELPMX 0x0100 /* device has ELPM Rd,Z[+] */ +#define AVR_ISA_SPM 0x0200 /* device can program itself */ +#define AVR_ISA_BRK 0x0400 /* device has BREAK (on-chip debug) */ +#define AVR_ISA_EIND 0x0800 /* device has >128K program memory (none yet) */ +#define AVR_ISA_MOVW 0x1000 /* device has MOVW */ +#define AVR_ISA_SPMX 0x2000 /* device has SPM Z[+] */ +#define AVR_ISA_DES 0x4000 /* device has DES */ +#define AVR_ISA_RMW 0x8000 /* device has RMW instructions XCH,LAC,LAS,LAT */ + +#define AVR_ISA_TINY1 (AVR_ISA_1200 | AVR_ISA_LPM) +#define AVR_ISA_2xxx (AVR_ISA_TINY1 | AVR_ISA_SRAM) +/* For the attiny26 which is missing LPM Rd,Z+. */ +#define AVR_ISA_2xxe (AVR_ISA_2xxx | AVR_ISA_LPMX) +#define AVR_ISA_RF401 (AVR_ISA_2xxx | AVR_ISA_MOVW | AVR_ISA_LPMX) +#define AVR_ISA_TINY2 (AVR_ISA_2xxx | AVR_ISA_MOVW | AVR_ISA_LPMX | \ + AVR_ISA_SPM | AVR_ISA_BRK) +#define AVR_ISA_M603 (AVR_ISA_2xxx | AVR_ISA_MEGA) +#define AVR_ISA_M103 (AVR_ISA_M603 | AVR_ISA_ELPM) +#define AVR_ISA_M8 (AVR_ISA_2xxx | AVR_ISA_MUL | AVR_ISA_MOVW | \ + AVR_ISA_LPMX | AVR_ISA_SPM) +#define AVR_ISA_PWMx (AVR_ISA_M8 | AVR_ISA_BRK) +#define AVR_ISA_M161 (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | \ + AVR_ISA_LPMX | AVR_ISA_SPM) +#define AVR_ISA_94K (AVR_ISA_M603 | AVR_ISA_MUL | AVR_ISA_MOVW | AVR_ISA_LPMX) +#define AVR_ISA_M323 (AVR_ISA_M161 | AVR_ISA_BRK) +#define AVR_ISA_M128 (AVR_ISA_M323 | AVR_ISA_ELPM | AVR_ISA_ELPMX) +#define AVR_ISA_M256 (AVR_ISA_M128 | AVR_ISA_EIND) +#define AVR_ISA_XMEGA (AVR_ISA_M256 | AVR_ISA_SPMX | AVR_ISA_DES) +#define AVR_ISA_XMEGAU (AVR_ISA_XMEGA | AVR_ISA_RMW) + +#define AVR_ISA_AVR1 AVR_ISA_TINY1 +#define AVR_ISA_AVR2 AVR_ISA_2xxx +#define AVR_ISA_AVR25 AVR_ISA_TINY2 +#define AVR_ISA_AVR3 AVR_ISA_M603 +#define AVR_ISA_AVR31 AVR_ISA_M103 +#define AVR_ISA_AVR35 (AVR_ISA_AVR3 | AVR_ISA_MOVW | \ + AVR_ISA_LPMX | AVR_ISA_SPM | AVR_ISA_BRK) +#define AVR_ISA_AVR3_ALL (AVR_ISA_AVR3 | AVR_ISA_AVR31 | AVR_ISA_AVR35) +#define AVR_ISA_AVR4 AVR_ISA_PWMx +#define AVR_ISA_AVR5 AVR_ISA_M323 +#define AVR_ISA_AVR51 AVR_ISA_M128 +#define AVR_ISA_AVR6 (AVR_ISA_1200 | AVR_ISA_LPM | AVR_ISA_LPMX | \ + AVR_ISA_SRAM | AVR_ISA_MEGA | AVR_ISA_MUL | \ + AVR_ISA_ELPM | AVR_ISA_ELPMX | AVR_ISA_SPM | \ + AVR_ISA_BRK | AVR_ISA_EIND | AVR_ISA_MOVW) + +#define REGISTER_P(x) ((x) == 'r' \ + || (x) == 'd' \ + || (x) == 'w' \ + || (x) == 'a' \ + || (x) == 'v') + +/* Undefined combination of operands - does the register + operand overlap with pre-decremented or post-incremented + pointer register (like ld r31,Z+)? */ +#define AVR_UNDEF_P(x) (((x) & 0xFFED) == 0x91E5 || \ + ((x) & 0xFDEF) == 0x91AD || ((x) & 0xFDEF) == 0x91AE || \ + ((x) & 0xFDEF) == 0x91C9 || ((x) & 0xFDEF) == 0x91CA || \ + ((x) & 0xFDEF) == 0x91E1 || ((x) & 0xFDEF) == 0x91E2) + +/* Is this a skip instruction {cpse,sbic,sbis,sbrc,sbrs}? */ +#define AVR_SKIP_P(x) (((x) & 0xFC00) == 0x1000 || \ + ((x) & 0xFD00) == 0x9900 || ((x) & 0xFC08) == 0xFC00) + +/* Is this `ldd r,b+0' or `std b+0,r' (b={Y,Z}, disassembled as + `ld r,b' or `st b,r' respectively - next opcode entry)? */ +#define AVR_DISP0_P(x) (((x) & 0xFC07) == 0x8000) + +/* constraint letters + r - any register + d - `ldi' register (r16-r31) + v - `movw' even register (r0, r2, ..., r28, r30) + a - `fmul' register (r16-r23) + w - `adiw' register (r24,r26,r28,r30) + e - pointer registers (X,Y,Z) + b - base pointer register and displacement ([YZ]+disp) + z - Z pointer register (for [e]lpm Rd,Z[+]) + M - immediate value from 0 to 255 + n - immediate value from 0 to 255 ( n = ~M ). Relocation impossible + s - immediate value from 0 to 7 + P - Port address value from 0 to 63. (in, out) + p - Port address value from 0 to 31. (cbi, sbi, sbic, sbis) + K - immediate value from 0 to 63 (used in `adiw', `sbiw') + i - immediate value + l - signed pc relative offset from -64 to 63 + L - signed pc relative offset from -2048 to 2047 + h - absolute code address (call, jmp) + S - immediate value from 0 to 7 (S = s << 4) + E - immediate value from 0 to 15, shifted left by 4 (des) + ? - use this opcode entry if no parameters, else use next opcode entry + + Order is important - some binary opcodes have more than one name, + the disassembler will only see the first match. + + Remaining undefined opcodes (1699 total - some of them might work + as normal instructions if not all of the bits are decoded): + + 0x0001...0x00ff (255) (known to be decoded as `nop' by the old core) + "100100xxxxxxx011" (128) 0x9[0-3][0-9a-f][3b] + "100100xxxxxx1000" (64) 0x9[0-3][0-9a-f]8 + "1001010xxxxx0100" (32) 0x9[45][0-9a-f]4 + "1001010x001x1001" (4) 0x9[45][23]9 + "1001010x01xx1001" (8) 0x9[45][4-7]9 + "1001010x1xxx1001" (16) 0x9[45][8-9a-f]9 + "1001010xxxxx1011" (32) 0x9[45][0-9a-f]b + "10010101001x1000" (2) 0x95[23]8 + "1001010101xx1000" (4) 0x95[4-7]8 + "1001010110111000" (1) 0x95b8 + "1001010111111000" (1) 0x95f8 (`espm' removed in databook update) + "11111xxxxxxx1xxx" (1024) 0xf[8-9a-f][0-9a-f][8-9a-f] + */ + +AVR_INSN (clc, "", "1001010010001000", 1, AVR_ISA_1200, 0x9488) +AVR_INSN (clh, "", "1001010011011000", 1, AVR_ISA_1200, 0x94d8) +AVR_INSN (cli, "", "1001010011111000", 1, AVR_ISA_1200, 0x94f8) +AVR_INSN (cln, "", "1001010010101000", 1, AVR_ISA_1200, 0x94a8) +AVR_INSN (cls, "", "1001010011001000", 1, AVR_ISA_1200, 0x94c8) +AVR_INSN (clt, "", "1001010011101000", 1, AVR_ISA_1200, 0x94e8) +AVR_INSN (clv, "", "1001010010111000", 1, AVR_ISA_1200, 0x94b8) +AVR_INSN (clz, "", "1001010010011000", 1, AVR_ISA_1200, 0x9498) + +AVR_INSN (sec, "", "1001010000001000", 1, AVR_ISA_1200, 0x9408) +AVR_INSN (seh, "", "1001010001011000", 1, AVR_ISA_1200, 0x9458) +AVR_INSN (sei, "", "1001010001111000", 1, AVR_ISA_1200, 0x9478) +AVR_INSN (sen, "", "1001010000101000", 1, AVR_ISA_1200, 0x9428) +AVR_INSN (ses, "", "1001010001001000", 1, AVR_ISA_1200, 0x9448) +AVR_INSN (set, "", "1001010001101000", 1, AVR_ISA_1200, 0x9468) +AVR_INSN (sev, "", "1001010000111000", 1, AVR_ISA_1200, 0x9438) +AVR_INSN (sez, "", "1001010000011000", 1, AVR_ISA_1200, 0x9418) + + /* Same as {cl,se}[chinstvz] above. */ +AVR_INSN (bclr, "S", "100101001SSS1000", 1, AVR_ISA_1200, 0x9488) +AVR_INSN (bset, "S", "100101000SSS1000", 1, AVR_ISA_1200, 0x9408) + +AVR_INSN (icall,"", "1001010100001001", 1, AVR_ISA_2xxx, 0x9509) +AVR_INSN (ijmp, "", "1001010000001001", 1, AVR_ISA_2xxx, 0x9409) + +AVR_INSN (lpm, "?", "1001010111001000", 1, AVR_ISA_TINY1,0x95c8) +AVR_INSN (lpm, "r,z", "1001000ddddd010+", 1, AVR_ISA_LPMX, 0x9004) +AVR_INSN (elpm, "?", "1001010111011000", 1, AVR_ISA_ELPM, 0x95d8) +AVR_INSN (elpm, "r,z", "1001000ddddd011+", 1, AVR_ISA_ELPMX,0x9006) + +AVR_INSN (nop, "", "0000000000000000", 1, AVR_ISA_1200, 0x0000) +AVR_INSN (ret, "", "1001010100001000", 1, AVR_ISA_1200, 0x9508) +AVR_INSN (reti, "", "1001010100011000", 1, AVR_ISA_1200, 0x9518) +AVR_INSN (sleep,"", "1001010110001000", 1, AVR_ISA_1200, 0x9588) +AVR_INSN (break,"", "1001010110011000", 1, AVR_ISA_BRK, 0x9598) +AVR_INSN (wdr, "", "1001010110101000", 1, AVR_ISA_1200, 0x95a8) +AVR_INSN (spm, "?", "1001010111101000", 1, AVR_ISA_SPM, 0x95e8) +AVR_INSN (spm, "z", "10010101111+1000", 1, AVR_ISA_SPMX, 0x95e8) + +AVR_INSN (adc, "r,r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00) +AVR_INSN (add, "r,r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00) +AVR_INSN (and, "r,r", "001000rdddddrrrr", 1, AVR_ISA_1200, 0x2000) +AVR_INSN (cp, "r,r", "000101rdddddrrrr", 1, AVR_ISA_1200, 0x1400) +AVR_INSN (cpc, "r,r", "000001rdddddrrrr", 1, AVR_ISA_1200, 0x0400) +AVR_INSN (cpse, "r,r", "000100rdddddrrrr", 1, AVR_ISA_1200, 0x1000) +AVR_INSN (eor, "r,r", "001001rdddddrrrr", 1, AVR_ISA_1200, 0x2400) +AVR_INSN (mov, "r,r", "001011rdddddrrrr", 1, AVR_ISA_1200, 0x2c00) +AVR_INSN (mul, "r,r", "100111rdddddrrrr", 1, AVR_ISA_MUL, 0x9c00) +AVR_INSN (or, "r,r", "001010rdddddrrrr", 1, AVR_ISA_1200, 0x2800) +AVR_INSN (sbc, "r,r", "000010rdddddrrrr", 1, AVR_ISA_1200, 0x0800) +AVR_INSN (sub, "r,r", "000110rdddddrrrr", 1, AVR_ISA_1200, 0x1800) + + /* Shorthand for {eor,add,adc,and} r,r above. */ +AVR_INSN (clr, "r=r", "001001rdddddrrrr", 1, AVR_ISA_1200, 0x2400) +AVR_INSN (lsl, "r=r", "000011rdddddrrrr", 1, AVR_ISA_1200, 0x0c00) +AVR_INSN (rol, "r=r", "000111rdddddrrrr", 1, AVR_ISA_1200, 0x1c00) +AVR_INSN (tst, "r=r", "001000rdddddrrrr", 1, AVR_ISA_1200, 0x2000) + +AVR_INSN (andi, "d,M", "0111KKKKddddKKKK", 1, AVR_ISA_1200, 0x7000) + /*XXX special case*/ +AVR_INSN (cbr, "d,n", "0111KKKKddddKKKK", 1, AVR_ISA_1200, 0x7000) + +AVR_INSN (ldi, "d,M", "1110KKKKddddKKKK", 1, AVR_ISA_1200, 0xe000) +AVR_INSN (ser, "d", "11101111dddd1111", 1, AVR_ISA_1200, 0xef0f) + +AVR_INSN (ori, "d,M", "0110KKKKddddKKKK", 1, AVR_ISA_1200, 0x6000) +AVR_INSN (sbr, "d,M", "0110KKKKddddKKKK", 1, AVR_ISA_1200, 0x6000) + +AVR_INSN (cpi, "d,M", "0011KKKKddddKKKK", 1, AVR_ISA_1200, 0x3000) +AVR_INSN (sbci, "d,M", "0100KKKKddddKKKK", 1, AVR_ISA_1200, 0x4000) +AVR_INSN (subi, "d,M", "0101KKKKddddKKKK", 1, AVR_ISA_1200, 0x5000) + +AVR_INSN (sbrc, "r,s", "1111110rrrrr0sss", 1, AVR_ISA_1200, 0xfc00) +AVR_INSN (sbrs, "r,s", "1111111rrrrr0sss", 1, AVR_ISA_1200, 0xfe00) +AVR_INSN (bld, "r,s", "1111100ddddd0sss", 1, AVR_ISA_1200, 0xf800) +AVR_INSN (bst, "r,s", "1111101ddddd0sss", 1, AVR_ISA_1200, 0xfa00) + +AVR_INSN (in, "r,P", "10110PPdddddPPPP", 1, AVR_ISA_1200, 0xb000) +AVR_INSN (out, "P,r", "10111PPrrrrrPPPP", 1, AVR_ISA_1200, 0xb800) + +AVR_INSN (adiw, "w,K", "10010110KKddKKKK", 1, AVR_ISA_2xxx, 0x9600) +AVR_INSN (sbiw, "w,K", "10010111KKddKKKK", 1, AVR_ISA_2xxx, 0x9700) + +AVR_INSN (cbi, "p,s", "10011000pppppsss", 1, AVR_ISA_1200, 0x9800) +AVR_INSN (sbi, "p,s", "10011010pppppsss", 1, AVR_ISA_1200, 0x9a00) +AVR_INSN (sbic, "p,s", "10011001pppppsss", 1, AVR_ISA_1200, 0x9900) +AVR_INSN (sbis, "p,s", "10011011pppppsss", 1, AVR_ISA_1200, 0x9b00) + +AVR_INSN (brcc, "l", "111101lllllll000", 1, AVR_ISA_1200, 0xf400) +AVR_INSN (brcs, "l", "111100lllllll000", 1, AVR_ISA_1200, 0xf000) +AVR_INSN (breq, "l", "111100lllllll001", 1, AVR_ISA_1200, 0xf001) +AVR_INSN (brge, "l", "111101lllllll100", 1, AVR_ISA_1200, 0xf404) +AVR_INSN (brhc, "l", "111101lllllll101", 1, AVR_ISA_1200, 0xf405) +AVR_INSN (brhs, "l", "111100lllllll101", 1, AVR_ISA_1200, 0xf005) +AVR_INSN (brid, "l", "111101lllllll111", 1, AVR_ISA_1200, 0xf407) +AVR_INSN (brie, "l", "111100lllllll111", 1, AVR_ISA_1200, 0xf007) +AVR_INSN (brlo, "l", "111100lllllll000", 1, AVR_ISA_1200, 0xf000) +AVR_INSN (brlt, "l", "111100lllllll100", 1, AVR_ISA_1200, 0xf004) +AVR_INSN (brmi, "l", "111100lllllll010", 1, AVR_ISA_1200, 0xf002) +AVR_INSN (brne, "l", "111101lllllll001", 1, AVR_ISA_1200, 0xf401) +AVR_INSN (brpl, "l", "111101lllllll010", 1, AVR_ISA_1200, 0xf402) +AVR_INSN (brsh, "l", "111101lllllll000", 1, AVR_ISA_1200, 0xf400) +AVR_INSN (brtc, "l", "111101lllllll110", 1, AVR_ISA_1200, 0xf406) +AVR_INSN (brts, "l", "111100lllllll110", 1, AVR_ISA_1200, 0xf006) +AVR_INSN (brvc, "l", "111101lllllll011", 1, AVR_ISA_1200, 0xf403) +AVR_INSN (brvs, "l", "111100lllllll011", 1, AVR_ISA_1200, 0xf003) + + /* Same as br?? above. */ +AVR_INSN (brbc, "s,l", "111101lllllllsss", 1, AVR_ISA_1200, 0xf400) +AVR_INSN (brbs, "s,l", "111100lllllllsss", 1, AVR_ISA_1200, 0xf000) + +AVR_INSN (rcall, "L", "1101LLLLLLLLLLLL", 1, AVR_ISA_1200, 0xd000) +AVR_INSN (rjmp, "L", "1100LLLLLLLLLLLL", 1, AVR_ISA_1200, 0xc000) + +AVR_INSN (call, "h", "1001010hhhhh111h", 2, AVR_ISA_MEGA, 0x940e) +AVR_INSN (jmp, "h", "1001010hhhhh110h", 2, AVR_ISA_MEGA, 0x940c) + +AVR_INSN (asr, "r", "1001010rrrrr0101", 1, AVR_ISA_1200, 0x9405) +AVR_INSN (com, "r", "1001010rrrrr0000", 1, AVR_ISA_1200, 0x9400) +AVR_INSN (dec, "r", "1001010rrrrr1010", 1, AVR_ISA_1200, 0x940a) +AVR_INSN (inc, "r", "1001010rrrrr0011", 1, AVR_ISA_1200, 0x9403) +AVR_INSN (lsr, "r", "1001010rrrrr0110", 1, AVR_ISA_1200, 0x9406) +AVR_INSN (neg, "r", "1001010rrrrr0001", 1, AVR_ISA_1200, 0x9401) +AVR_INSN (pop, "r", "1001000rrrrr1111", 1, AVR_ISA_2xxx, 0x900f) +AVR_INSN (push, "r", "1001001rrrrr1111", 1, AVR_ISA_2xxx, 0x920f) +AVR_INSN (ror, "r", "1001010rrrrr0111", 1, AVR_ISA_1200, 0x9407) +AVR_INSN (swap, "r", "1001010rrrrr0010", 1, AVR_ISA_1200, 0x9402) + + /* Atomic memory operations for XMEGA. List before `sts'. */ +AVR_INSN (xch, "z,r", "1001001rrrrr0100", 1, AVR_ISA_RMW, 0x9204) +AVR_INSN (las, "z,r", "1001001rrrrr0101", 1, AVR_ISA_RMW, 0x9205) +AVR_INSN (lac, "z,r", "1001001rrrrr0110", 1, AVR_ISA_RMW, 0x9206) +AVR_INSN (lat, "z,r", "1001001rrrrr0111", 1, AVR_ISA_RMW, 0x9207) + + /* Known to be decoded as `nop' by the old core. */ +AVR_INSN (movw, "v,v", "00000001ddddrrrr", 1, AVR_ISA_MOVW, 0x0100) +AVR_INSN (muls, "d,d", "00000010ddddrrrr", 1, AVR_ISA_MUL, 0x0200) +AVR_INSN (mulsu,"a,a", "000000110ddd0rrr", 1, AVR_ISA_MUL, 0x0300) +AVR_INSN (fmul, "a,a", "000000110ddd1rrr", 1, AVR_ISA_MUL, 0x0308) +AVR_INSN (fmuls,"a,a", "000000111ddd0rrr", 1, AVR_ISA_MUL, 0x0380) +AVR_INSN (fmulsu,"a,a","000000111ddd1rrr", 1, AVR_ISA_MUL, 0x0388) + +AVR_INSN (sts, "i,r", "1001001ddddd0000", 2, AVR_ISA_2xxx, 0x9200) +AVR_INSN (lds, "r,i", "1001000ddddd0000", 2, AVR_ISA_2xxx, 0x9000) + + /* Special case for b+0, `e' must be next entry after `b', + b={Y=1,Z=0}, ee={X=11,Y=10,Z=00}, !=1 if -e or e+ or X. */ +AVR_INSN (ldd, "r,b", "10o0oo0dddddbooo", 1, AVR_ISA_2xxx, 0x8000) +AVR_INSN (ld, "r,e", "100!000dddddee-+", 1, AVR_ISA_1200, 0x8000) +AVR_INSN (std, "b,r", "10o0oo1rrrrrbooo", 1, AVR_ISA_2xxx, 0x8200) +AVR_INSN (st, "e,r", "100!001rrrrree-+", 1, AVR_ISA_1200, 0x8200) + + /* These are for devices that don't exist yet + (>128K program memory, PC = EIND:Z). */ +AVR_INSN (eicall, "", "1001010100011001", 1, AVR_ISA_EIND, 0x9519) +AVR_INSN (eijmp, "", "1001010000011001", 1, AVR_ISA_EIND, 0x9419) + +/* DES instruction for encryption and decryption */ +AVR_INSN (des, "E", "10010100EEEE1011", 1, AVR_ISA_DES, 0x940B) + diff --git a/include/opcode/bfin.h b/include/opcode/bfin.h new file mode 100644 index 0000000..26f0193 --- /dev/null +++ b/include/opcode/bfin.h @@ -0,0 +1,1761 @@ +/* bfin.h -- Header file for ADI Blackfin opcode table + Copyright 2005, 2010, 2011 Free Software Foundation, Inc. + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef OPCODE_BFIN_H +#define OPCODE_BFIN_H + +/* Common to all DSP32 instructions. */ +#define BIT_MULTI_INS 0x0800 + +/* This just sets the multi instruction bit of a DSP32 instruction. */ +#define SET_MULTI_INSTRUCTION_BIT(x) x->value |= BIT_MULTI_INS; + + +/* DSP instructions (32 bit) */ + +/* mmod field. */ +#define M_S2RND 1 +#define M_T 2 +#define M_W32 3 +#define M_FU 4 +#define M_TFU 6 +#define M_IS 8 +#define M_ISS2 9 +#define M_IH 11 +#define M_IU 12 + +static inline int is_macmod_pmove (int x) +{ + return (x == 0) || (x == M_IS) || (x == M_FU) || (x == M_S2RND) + || (x == M_ISS2) || (x == M_IU); +} + +static inline int is_macmod_hmove (int x) +{ + return (x == 0) || (x == M_IS) || (x == M_FU) || (x == M_IU) || (x == M_T) + || (x == M_TFU) || (x == M_S2RND) || (x == M_ISS2) || (x == M_IH); +} + +static inline int is_macmod_signed (int x) +{ + return (x == 0) || (x == M_IS) || (x == M_T) || (x == M_S2RND) + || (x == M_ISS2) || (x == M_IH) || (x == M_W32); +} + +/* dsp32mac ++----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...| +|.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1......| ++----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_src1; + int mask_src1; + int bits_src0; + int mask_src0; + int bits_dst; + int mask_dst; + int bits_h10; + int mask_h10; + int bits_h00; + int mask_h00; + int bits_op0; + int mask_op0; + int bits_w0; + int mask_w0; + int bits_h11; + int mask_h11; + int bits_h01; + int mask_h01; + int bits_op1; + int mask_op1; + int bits_w1; + int mask_w1; + int bits_P; + int mask_P; + int bits_MM; + int mask_MM; + int bits_mmod; + int mask_mmod; + int bits_code2; + int mask_code2; + int bits_M; + int mask_M; + int bits_code; + int mask_code; +} DSP32Mac; + +#define DSP32Mac_opcode 0xc0000000 +#define DSP32Mac_src1_bits 0 +#define DSP32Mac_src1_mask 0x7 +#define DSP32Mac_src0_bits 3 +#define DSP32Mac_src0_mask 0x7 +#define DSP32Mac_dst_bits 6 +#define DSP32Mac_dst_mask 0x7 +#define DSP32Mac_h10_bits 9 +#define DSP32Mac_h10_mask 0x1 +#define DSP32Mac_h00_bits 10 +#define DSP32Mac_h00_mask 0x1 +#define DSP32Mac_op0_bits 11 +#define DSP32Mac_op0_mask 0x3 +#define DSP32Mac_w0_bits 13 +#define DSP32Mac_w0_mask 0x1 +#define DSP32Mac_h11_bits 14 +#define DSP32Mac_h11_mask 0x1 +#define DSP32Mac_h01_bits 15 +#define DSP32Mac_h01_mask 0x1 +#define DSP32Mac_op1_bits 16 +#define DSP32Mac_op1_mask 0x3 +#define DSP32Mac_w1_bits 18 +#define DSP32Mac_w1_mask 0x1 +#define DSP32Mac_p_bits 19 +#define DSP32Mac_p_mask 0x1 +#define DSP32Mac_MM_bits 20 +#define DSP32Mac_MM_mask 0x1 +#define DSP32Mac_mmod_bits 21 +#define DSP32Mac_mmod_mask 0xf +#define DSP32Mac_code2_bits 25 +#define DSP32Mac_code2_mask 0x3 +#define DSP32Mac_M_bits 27 +#define DSP32Mac_M_mask 0x1 +#define DSP32Mac_code_bits 28 +#define DSP32Mac_code_mask 0xf + +#define init_DSP32Mac \ +{ \ + DSP32Mac_opcode, \ + DSP32Mac_src1_bits, DSP32Mac_src1_mask, \ + DSP32Mac_src0_bits, DSP32Mac_src0_mask, \ + DSP32Mac_dst_bits, DSP32Mac_dst_mask, \ + DSP32Mac_h10_bits, DSP32Mac_h10_mask, \ + DSP32Mac_h00_bits, DSP32Mac_h00_mask, \ + DSP32Mac_op0_bits, DSP32Mac_op0_mask, \ + DSP32Mac_w0_bits, DSP32Mac_w0_mask, \ + DSP32Mac_h11_bits, DSP32Mac_h11_mask, \ + DSP32Mac_h01_bits, DSP32Mac_h01_mask, \ + DSP32Mac_op1_bits, DSP32Mac_op1_mask, \ + DSP32Mac_w1_bits, DSP32Mac_w1_mask, \ + DSP32Mac_p_bits, DSP32Mac_p_mask, \ + DSP32Mac_MM_bits, DSP32Mac_MM_mask, \ + DSP32Mac_mmod_bits, DSP32Mac_mmod_mask, \ + DSP32Mac_code2_bits, DSP32Mac_code2_mask, \ + DSP32Mac_M_bits, DSP32Mac_M_mask, \ + DSP32Mac_code_bits, DSP32Mac_code_mask \ +}; + +/* dsp32mult ++----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...| +|.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1......| ++----+----+---+---|---+----+----+---|---+---+---+---|---+---+---+---+ +*/ + +typedef DSP32Mac DSP32Mult; +#define DSP32Mult_opcode 0xc2000000 + +#define init_DSP32Mult \ +{ \ + DSP32Mult_opcode, \ + DSP32Mac_src1_bits, DSP32Mac_src1_mask, \ + DSP32Mac_src0_bits, DSP32Mac_src0_mask, \ + DSP32Mac_dst_bits, DSP32Mac_dst_mask, \ + DSP32Mac_h10_bits, DSP32Mac_h10_mask, \ + DSP32Mac_h00_bits, DSP32Mac_h00_mask, \ + DSP32Mac_op0_bits, DSP32Mac_op0_mask, \ + DSP32Mac_w0_bits, DSP32Mac_w0_mask, \ + DSP32Mac_h11_bits, DSP32Mac_h11_mask, \ + DSP32Mac_h01_bits, DSP32Mac_h01_mask, \ + DSP32Mac_op1_bits, DSP32Mac_op1_mask, \ + DSP32Mac_w1_bits, DSP32Mac_w1_mask, \ + DSP32Mac_p_bits, DSP32Mac_p_mask, \ + DSP32Mac_MM_bits, DSP32Mac_MM_mask, \ + DSP32Mac_mmod_bits, DSP32Mac_mmod_mask, \ + DSP32Mac_code2_bits, DSP32Mac_code2_mask, \ + DSP32Mac_M_bits, DSP32Mac_M_mask, \ + DSP32Mac_code_bits, DSP32Mac_code_mask \ +}; + +/* dsp32alu ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............| +|.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_src1; + int mask_src1; + int bits_src0; + int mask_src0; + int bits_dst1; + int mask_dst1; + int bits_dst0; + int mask_dst0; + int bits_x; + int mask_x; + int bits_s; + int mask_s; + int bits_aop; + int mask_aop; + int bits_aopcde; + int mask_aopcde; + int bits_HL; + int mask_HL; + int bits_dontcare; + int mask_dontcare; + int bits_code2; + int mask_code2; + int bits_M; + int mask_M; + int bits_code; + int mask_code; +} DSP32Alu; + +#define DSP32Alu_opcode 0xc4000000 +#define DSP32Alu_src1_bits 0 +#define DSP32Alu_src1_mask 0x7 +#define DSP32Alu_src0_bits 3 +#define DSP32Alu_src0_mask 0x7 +#define DSP32Alu_dst1_bits 6 +#define DSP32Alu_dst1_mask 0x7 +#define DSP32Alu_dst0_bits 9 +#define DSP32Alu_dst0_mask 0x7 +#define DSP32Alu_x_bits 12 +#define DSP32Alu_x_mask 0x1 +#define DSP32Alu_s_bits 13 +#define DSP32Alu_s_mask 0x1 +#define DSP32Alu_aop_bits 14 +#define DSP32Alu_aop_mask 0x3 +#define DSP32Alu_aopcde_bits 16 +#define DSP32Alu_aopcde_mask 0x1f +#define DSP32Alu_HL_bits 21 +#define DSP32Alu_HL_mask 0x1 +#define DSP32Alu_dontcare_bits 22 +#define DSP32Alu_dontcare_mask 0x7 +#define DSP32Alu_code2_bits 25 +#define DSP32Alu_code2_mask 0x3 +#define DSP32Alu_M_bits 27 +#define DSP32Alu_M_mask 0x1 +#define DSP32Alu_code_bits 28 +#define DSP32Alu_code_mask 0xf + +#define init_DSP32Alu \ +{ \ + DSP32Alu_opcode, \ + DSP32Alu_src1_bits, DSP32Alu_src1_mask, \ + DSP32Alu_src0_bits, DSP32Alu_src0_mask, \ + DSP32Alu_dst1_bits, DSP32Alu_dst1_mask, \ + DSP32Alu_dst0_bits, DSP32Alu_dst0_mask, \ + DSP32Alu_x_bits, DSP32Alu_x_mask, \ + DSP32Alu_s_bits, DSP32Alu_s_mask, \ + DSP32Alu_aop_bits, DSP32Alu_aop_mask, \ + DSP32Alu_aopcde_bits, DSP32Alu_aopcde_mask, \ + DSP32Alu_HL_bits, DSP32Alu_HL_mask, \ + DSP32Alu_dontcare_bits, DSP32Alu_dontcare_mask, \ + DSP32Alu_code2_bits, DSP32Alu_code2_mask, \ + DSP32Alu_M_bits, DSP32Alu_M_mask, \ + DSP32Alu_code_bits, DSP32Alu_code_mask \ +}; + +/* dsp32shift ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............| +|.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_src1; + int mask_src1; + int bits_src0; + int mask_src0; + int bits_dst1; + int mask_dst1; + int bits_dst0; + int mask_dst0; + int bits_HLs; + int mask_HLs; + int bits_sop; + int mask_sop; + int bits_sopcde; + int mask_sopcde; + int bits_dontcare; + int mask_dontcare; + int bits_code2; + int mask_code2; + int bits_M; + int mask_M; + int bits_code; + int mask_code; +} DSP32Shift; + +#define DSP32Shift_opcode 0xc6000000 +#define DSP32Shift_src1_bits 0 +#define DSP32Shift_src1_mask 0x7 +#define DSP32Shift_src0_bits 3 +#define DSP32Shift_src0_mask 0x7 +#define DSP32Shift_dst1_bits 6 +#define DSP32Shift_dst1_mask 0x7 +#define DSP32Shift_dst0_bits 9 +#define DSP32Shift_dst0_mask 0x7 +#define DSP32Shift_HLs_bits 12 +#define DSP32Shift_HLs_mask 0x3 +#define DSP32Shift_sop_bits 14 +#define DSP32Shift_sop_mask 0x3 +#define DSP32Shift_sopcde_bits 16 +#define DSP32Shift_sopcde_mask 0x1f +#define DSP32Shift_dontcare_bits 21 +#define DSP32Shift_dontcare_mask 0x3 +#define DSP32Shift_code2_bits 23 +#define DSP32Shift_code2_mask 0xf +#define DSP32Shift_M_bits 27 +#define DSP32Shift_M_mask 0x1 +#define DSP32Shift_code_bits 28 +#define DSP32Shift_code_mask 0xf + +#define init_DSP32Shift \ +{ \ + DSP32Shift_opcode, \ + DSP32Shift_src1_bits, DSP32Shift_src1_mask, \ + DSP32Shift_src0_bits, DSP32Shift_src0_mask, \ + DSP32Shift_dst1_bits, DSP32Shift_dst1_mask, \ + DSP32Shift_dst0_bits, DSP32Shift_dst0_mask, \ + DSP32Shift_HLs_bits, DSP32Shift_HLs_mask, \ + DSP32Shift_sop_bits, DSP32Shift_sop_mask, \ + DSP32Shift_sopcde_bits, DSP32Shift_sopcde_mask, \ + DSP32Shift_dontcare_bits, DSP32Shift_dontcare_mask, \ + DSP32Shift_code2_bits, DSP32Shift_code2_mask, \ + DSP32Shift_M_bits, DSP32Shift_M_mask, \ + DSP32Shift_code_bits, DSP32Shift_code_mask \ +}; + +/* dsp32shiftimm ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............| +|.sop...|.HLs...|.dst0......|.immag.................|.src1......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_src1; + int mask_src1; + int bits_immag; + int mask_immag; + int bits_dst0; + int mask_dst0; + int bits_HLs; + int mask_HLs; + int bits_sop; + int mask_sop; + int bits_sopcde; + int mask_sopcde; + int bits_dontcare; + int mask_dontcare; + int bits_code2; + int mask_code2; + int bits_M; + int mask_M; + int bits_code; + int mask_code; +} DSP32ShiftImm; + +#define DSP32ShiftImm_opcode 0xc6800000 +#define DSP32ShiftImm_src1_bits 0 +#define DSP32ShiftImm_src1_mask 0x7 +#define DSP32ShiftImm_immag_bits 3 +#define DSP32ShiftImm_immag_mask 0x3f +#define DSP32ShiftImm_dst0_bits 9 +#define DSP32ShiftImm_dst0_mask 0x7 +#define DSP32ShiftImm_HLs_bits 12 +#define DSP32ShiftImm_HLs_mask 0x3 +#define DSP32ShiftImm_sop_bits 14 +#define DSP32ShiftImm_sop_mask 0x3 +#define DSP32ShiftImm_sopcde_bits 16 +#define DSP32ShiftImm_sopcde_mask 0x1f +#define DSP32ShiftImm_dontcare_bits 21 +#define DSP32ShiftImm_dontcare_mask 0x3 +#define DSP32ShiftImm_code2_bits 23 +#define DSP32ShiftImm_code2_mask 0xf +#define DSP32ShiftImm_M_bits 27 +#define DSP32ShiftImm_M_mask 0x1 +#define DSP32ShiftImm_code_bits 28 +#define DSP32ShiftImm_code_mask 0xf + +#define init_DSP32ShiftImm \ +{ \ + DSP32ShiftImm_opcode, \ + DSP32ShiftImm_src1_bits, DSP32ShiftImm_src1_mask, \ + DSP32ShiftImm_immag_bits, DSP32ShiftImm_immag_mask, \ + DSP32ShiftImm_dst0_bits, DSP32ShiftImm_dst0_mask, \ + DSP32ShiftImm_HLs_bits, DSP32ShiftImm_HLs_mask, \ + DSP32ShiftImm_sop_bits, DSP32ShiftImm_sop_mask, \ + DSP32ShiftImm_sopcde_bits, DSP32ShiftImm_sopcde_mask, \ + DSP32ShiftImm_dontcare_bits, DSP32ShiftImm_dontcare_mask, \ + DSP32ShiftImm_code2_bits, DSP32ShiftImm_code2_mask, \ + DSP32ShiftImm_M_bits, DSP32ShiftImm_M_mask, \ + DSP32ShiftImm_code_bits, DSP32ShiftImm_code_mask \ +}; + +/* LOAD / STORE */ + +/* LDSTidxI ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 0 | 0 | 1 |.W.|.Z.|.sz....|.ptr.......|.reg.......| +|.offset........................................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_offset; + int mask_offset; + int bits_reg; + int mask_reg; + int bits_ptr; + int mask_ptr; + int bits_sz; + int mask_sz; + int bits_Z; + int mask_Z; + int bits_W; + int mask_W; + int bits_code; + int mask_code; +} LDSTidxI; + +#define LDSTidxI_opcode 0xe4000000 +#define LDSTidxI_offset_bits 0 +#define LDSTidxI_offset_mask 0xffff +#define LDSTidxI_reg_bits 16 +#define LDSTidxI_reg_mask 0x7 +#define LDSTidxI_ptr_bits 19 +#define LDSTidxI_ptr_mask 0x7 +#define LDSTidxI_sz_bits 22 +#define LDSTidxI_sz_mask 0x3 +#define LDSTidxI_Z_bits 24 +#define LDSTidxI_Z_mask 0x1 +#define LDSTidxI_W_bits 25 +#define LDSTidxI_W_mask 0x1 +#define LDSTidxI_code_bits 26 +#define LDSTidxI_code_mask 0x3f + +#define init_LDSTidxI \ +{ \ + LDSTidxI_opcode, \ + LDSTidxI_offset_bits, LDSTidxI_offset_mask, \ + LDSTidxI_reg_bits, LDSTidxI_reg_mask, \ + LDSTidxI_ptr_bits, LDSTidxI_ptr_mask, \ + LDSTidxI_sz_bits, LDSTidxI_sz_mask, \ + LDSTidxI_Z_bits, LDSTidxI_Z_mask, \ + LDSTidxI_W_bits, LDSTidxI_W_mask, \ + LDSTidxI_code_bits, LDSTidxI_code_mask \ +}; + + +/* LDST ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_ptr; + int mask_ptr; + int bits_Z; + int mask_Z; + int bits_aop; + int mask_aop; + int bits_W; + int mask_W; + int bits_sz; + int mask_sz; + int bits_code; + int mask_code; +} LDST; + +#define LDST_opcode 0x9000 +#define LDST_reg_bits 0 +#define LDST_reg_mask 0x7 +#define LDST_ptr_bits 3 +#define LDST_ptr_mask 0x7 +#define LDST_Z_bits 6 +#define LDST_Z_mask 0x1 +#define LDST_aop_bits 7 +#define LDST_aop_mask 0x3 +#define LDST_W_bits 9 +#define LDST_W_mask 0x1 +#define LDST_sz_bits 10 +#define LDST_sz_mask 0x3 +#define LDST_code_bits 12 +#define LDST_code_mask 0xf + +#define init_LDST \ +{ \ + LDST_opcode, \ + LDST_reg_bits, LDST_reg_mask, \ + LDST_ptr_bits, LDST_ptr_mask, \ + LDST_Z_bits, LDST_Z_mask, \ + LDST_aop_bits, LDST_aop_mask, \ + LDST_W_bits, LDST_W_mask, \ + LDST_sz_bits, LDST_sz_mask, \ + LDST_code_bits, LDST_code_mask \ +}; + +/* LDSTii ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_ptr; + int mask_ptr; + int bits_offset; + int mask_offset; + int bits_op; + int mask_op; + int bits_W; + int mask_W; + int bits_code; + int mask_code; +} LDSTii; + +#define LDSTii_opcode 0xa000 +#define LDSTii_reg_bit 0 +#define LDSTii_reg_mask 0x7 +#define LDSTii_ptr_bit 3 +#define LDSTii_ptr_mask 0x7 +#define LDSTii_offset_bit 6 +#define LDSTii_offset_mask 0xf +#define LDSTii_op_bit 10 +#define LDSTii_op_mask 0x3 +#define LDSTii_W_bit 12 +#define LDSTii_W_mask 0x1 +#define LDSTii_code_bit 13 +#define LDSTii_code_mask 0x7 + +#define init_LDSTii \ +{ \ + LDSTii_opcode, \ + LDSTii_reg_bit, LDSTii_reg_mask, \ + LDSTii_ptr_bit, LDSTii_ptr_mask, \ + LDSTii_offset_bit, LDSTii_offset_mask, \ + LDSTii_op_bit, LDSTii_op_mask, \ + LDSTii_W_bit, LDSTii_W_mask, \ + LDSTii_code_bit, LDSTii_code_mask \ +}; + + +/* LDSTiiFP ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_offset; + int mask_offset; + int bits_W; + int mask_W; + int bits_code; + int mask_code; +} LDSTiiFP; + +#define LDSTiiFP_opcode 0xb800 +#define LDSTiiFP_reg_bits 0 +#define LDSTiiFP_reg_mask 0xf +#define LDSTiiFP_offset_bits 4 +#define LDSTiiFP_offset_mask 0x1f +#define LDSTiiFP_W_bits 9 +#define LDSTiiFP_W_mask 0x1 +#define LDSTiiFP_code_bits 10 +#define LDSTiiFP_code_mask 0x3f + +#define init_LDSTiiFP \ +{ \ + LDSTiiFP_opcode, \ + LDSTiiFP_reg_bits, LDSTiiFP_reg_mask, \ + LDSTiiFP_offset_bits, LDSTiiFP_offset_mask, \ + LDSTiiFP_W_bits, LDSTiiFP_W_mask, \ + LDSTiiFP_code_bits, LDSTiiFP_code_mask \ +}; + +/* dspLDST ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_i; + int mask_i; + int bits_m; + int mask_m; + int bits_aop; + int mask_aop; + int bits_W; + int mask_W; + int bits_code; + int mask_code; +} DspLDST; + +#define DspLDST_opcode 0x9c00 +#define DspLDST_reg_bits 0 +#define DspLDST_reg_mask 0x7 +#define DspLDST_i_bits 3 +#define DspLDST_i_mask 0x3 +#define DspLDST_m_bits 5 +#define DspLDST_m_mask 0x3 +#define DspLDST_aop_bits 7 +#define DspLDST_aop_mask 0x3 +#define DspLDST_W_bits 9 +#define DspLDST_W_mask 0x1 +#define DspLDST_code_bits 10 +#define DspLDST_code_mask 0x3f + +#define init_DspLDST \ +{ \ + DspLDST_opcode, \ + DspLDST_reg_bits, DspLDST_reg_mask, \ + DspLDST_i_bits, DspLDST_i_mask, \ + DspLDST_m_bits, DspLDST_m_mask, \ + DspLDST_aop_bits, DspLDST_aop_mask, \ + DspLDST_W_bits, DspLDST_W_mask, \ + DspLDST_code_bits, DspLDST_code_mask \ +}; + + +/* LDSTpmod ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_ptr; + int mask_ptr; + int bits_idx; + int mask_idx; + int bits_reg; + int mask_reg; + int bits_aop; + int mask_aop; + int bits_W; + int mask_W; + int bits_code; + int mask_code; +} LDSTpmod; + +#define LDSTpmod_opcode 0x8000 +#define LDSTpmod_ptr_bits 0 +#define LDSTpmod_ptr_mask 0x7 +#define LDSTpmod_idx_bits 3 +#define LDSTpmod_idx_mask 0x7 +#define LDSTpmod_reg_bits 6 +#define LDSTpmod_reg_mask 0x7 +#define LDSTpmod_aop_bits 9 +#define LDSTpmod_aop_mask 0x3 +#define LDSTpmod_W_bits 11 +#define LDSTpmod_W_mask 0x1 +#define LDSTpmod_code_bits 12 +#define LDSTpmod_code_mask 0xf + +#define init_LDSTpmod \ +{ \ + LDSTpmod_opcode, \ + LDSTpmod_ptr_bits, LDSTpmod_ptr_mask, \ + LDSTpmod_idx_bits, LDSTpmod_idx_mask, \ + LDSTpmod_reg_bits, LDSTpmod_reg_mask, \ + LDSTpmod_aop_bits, LDSTpmod_aop_mask, \ + LDSTpmod_W_bits, LDSTpmod_W_mask, \ + LDSTpmod_code_bits, LDSTpmod_code_mask \ +}; + + +/* LOGI2op ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 1 | 0 | 0 | 1 |.opc.......|.src...............|.dst.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_dst; + int mask_dst; + int bits_src; + int mask_src; + int bits_opc; + int mask_opc; + int bits_code; + int mask_code; +} LOGI2op; + +#define LOGI2op_opcode 0x4800 +#define LOGI2op_dst_bits 0 +#define LOGI2op_dst_mask 0x7 +#define LOGI2op_src_bits 3 +#define LOGI2op_src_mask 0x1f +#define LOGI2op_opc_bits 8 +#define LOGI2op_opc_mask 0x7 +#define LOGI2op_code_bits 11 +#define LOGI2op_code_mask 0x1f + +#define init_LOGI2op \ +{ \ + LOGI2op_opcode, \ + LOGI2op_dst_bits, LOGI2op_dst_mask, \ + LOGI2op_src_bits, LOGI2op_src_mask, \ + LOGI2op_opc_bits, LOGI2op_opc_mask, \ + LOGI2op_code_bits, LOGI2op_code_mask \ +}; + + +/* ALU2op ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 1 | 0 | 0 | 0 | 0 |.opc...........|.src.......|.dst.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_dst; + int mask_dst; + int bits_src; + int mask_src; + int bits_opc; + int mask_opc; + int bits_code; + int mask_code; +} ALU2op; + +#define ALU2op_opcode 0x4000 +#define ALU2op_dst_bits 0 +#define ALU2op_dst_mask 0x7 +#define ALU2op_src_bits 3 +#define ALU2op_src_mask 0x7 +#define ALU2op_opc_bits 6 +#define ALU2op_opc_mask 0xf +#define ALU2op_code_bits 10 +#define ALU2op_code_mask 0x3f + +#define init_ALU2op \ +{ \ + ALU2op_opcode, \ + ALU2op_dst_bits, ALU2op_dst_mask, \ + ALU2op_src_bits, ALU2op_src_mask, \ + ALU2op_opc_bits, ALU2op_opc_mask, \ + ALU2op_code_bits, ALU2op_code_mask \ +}; + + +/* BRCC ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 1 |.T.|.B.|.offset................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_offset; + int mask_offset; + int bits_B; + int mask_B; + int bits_T; + int mask_T; + int bits_code; + int mask_code; +} BRCC; + +#define BRCC_opcode 0x1000 +#define BRCC_offset_bits 0 +#define BRCC_offset_mask 0x3ff +#define BRCC_B_bits 10 +#define BRCC_B_mask 0x1 +#define BRCC_T_bits 11 +#define BRCC_T_mask 0x1 +#define BRCC_code_bits 12 +#define BRCC_code_mask 0xf + +#define init_BRCC \ +{ \ + BRCC_opcode, \ + BRCC_offset_bits, BRCC_offset_mask, \ + BRCC_B_bits, BRCC_B_mask, \ + BRCC_T_bits, BRCC_T_mask, \ + BRCC_code_bits, BRCC_code_mask \ +}; + + +/* UJUMP ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 1 | 0 |.offset........................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_offset; + int mask_offset; + int bits_code; + int mask_code; +} UJump; + +#define UJump_opcode 0x2000 +#define UJump_offset_bits 0 +#define UJump_offset_mask 0xfff +#define UJump_code_bits 12 +#define UJump_code_mask 0xf + +#define init_UJump \ +{ \ + UJump_opcode, \ + UJump_offset_bits, UJump_offset_mask, \ + UJump_code_bits, UJump_code_mask \ +}; + + +/* ProgCtrl ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.prgfunc.......|.poprnd........| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_poprnd; + int mask_poprnd; + int bits_prgfunc; + int mask_prgfunc; + int bits_code; + int mask_code; +} ProgCtrl; + +#define ProgCtrl_opcode 0x0000 +#define ProgCtrl_poprnd_bits 0 +#define ProgCtrl_poprnd_mask 0xf +#define ProgCtrl_prgfunc_bits 4 +#define ProgCtrl_prgfunc_mask 0xf +#define ProgCtrl_code_bits 8 +#define ProgCtrl_code_mask 0xff + +#define init_ProgCtrl \ +{ \ + ProgCtrl_opcode, \ + ProgCtrl_poprnd_bits, ProgCtrl_poprnd_mask, \ + ProgCtrl_prgfunc_bits, ProgCtrl_prgfunc_mask, \ + ProgCtrl_code_bits, ProgCtrl_code_mask \ +}; + +/* CALLa ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 0 | 0 | 0 | 1 |.S.|.msw...........................| +|.lsw...........................................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + + +typedef struct +{ + unsigned long opcode; + int bits_addr; + int mask_addr; + int bits_S; + int mask_S; + int bits_code; + int mask_code; +} CALLa; + +#define CALLa_opcode 0xe2000000 +#define CALLa_addr_bits 0 +#define CALLa_addr_mask 0xffffff +#define CALLa_S_bits 24 +#define CALLa_S_mask 0x1 +#define CALLa_code_bits 25 +#define CALLa_code_mask 0x7f + +#define init_CALLa \ +{ \ + CALLa_opcode, \ + CALLa_addr_bits, CALLa_addr_mask, \ + CALLa_S_bits, CALLa_S_mask, \ + CALLa_code_bits, CALLa_code_mask \ +}; + + +/* pseudoDEBUG ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |.fn....|.grp.......|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_grp; + int mask_grp; + int bits_fn; + int mask_fn; + int bits_code; + int mask_code; +} PseudoDbg; + +#define PseudoDbg_opcode 0xf800 +#define PseudoDbg_reg_bits 0 +#define PseudoDbg_reg_mask 0x7 +#define PseudoDbg_grp_bits 3 +#define PseudoDbg_grp_mask 0x7 +#define PseudoDbg_fn_bits 6 +#define PseudoDbg_fn_mask 0x3 +#define PseudoDbg_code_bits 8 +#define PseudoDbg_code_mask 0xff + +#define init_PseudoDbg \ +{ \ + PseudoDbg_opcode, \ + PseudoDbg_reg_bits, PseudoDbg_reg_mask, \ + PseudoDbg_grp_bits, PseudoDbg_grp_mask, \ + PseudoDbg_fn_bits, PseudoDbg_fn_mask, \ + PseudoDbg_code_bits, PseudoDbg_code_mask \ +}; + +/* PseudoDbg_assert ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 1 | 0 | - | - | - | dbgop |.grp.......|.regtest...| +|.expected......................................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_expected; + int mask_expected; + int bits_regtest; + int mask_regtest; + int bits_grp; + int mask_grp; + int bits_dbgop; + int mask_dbgop; + int bits_dontcare; + int mask_dontcare; + int bits_code; + int mask_code; +} PseudoDbg_Assert; + +#define PseudoDbg_Assert_opcode 0xf0000000 +#define PseudoDbg_Assert_expected_bits 0 +#define PseudoDbg_Assert_expected_mask 0xffff +#define PseudoDbg_Assert_regtest_bits 16 +#define PseudoDbg_Assert_regtest_mask 0x7 +#define PseudoDbg_Assert_grp_bits 19 +#define PseudoDbg_Assert_grp_mask 0x7 +#define PseudoDbg_Assert_dbgop_bits 22 +#define PseudoDbg_Assert_dbgop_mask 0x3 +#define PseudoDbg_Assert_dontcare_bits 24 +#define PseudoDbg_Assert_dontcare_mask 0x7 +#define PseudoDbg_Assert_code_bits 27 +#define PseudoDbg_Assert_code_mask 0x1f + +#define init_PseudoDbg_Assert \ +{ \ + PseudoDbg_Assert_opcode, \ + PseudoDbg_Assert_expected_bits, PseudoDbg_Assert_expected_mask, \ + PseudoDbg_Assert_regtest_bits, PseudoDbg_Assert_regtest_mask, \ + PseudoDbg_Assert_grp_bits, PseudoDbg_Assert_grp_mask, \ + PseudoDbg_Assert_dbgop_bits, PseudoDbg_Assert_dbgop_mask, \ + PseudoDbg_Assert_dontcare_bits, PseudoDbg_Assert_dontcare_mask, \ + PseudoDbg_Assert_code_bits, PseudoDbg_Assert_code_mask \ +}; + +/* pseudoChr ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_ch; + int mask_ch; + int bits_code; + int mask_code; +} PseudoChr; + +#define PseudoChr_opcode 0xf900 +#define PseudoChr_ch_bits 0 +#define PseudoChr_ch_mask 0xff +#define PseudoChr_code_bits 8 +#define PseudoChr_code_mask 0xff + +#define init_PseudoChr \ +{ \ + PseudoChr_opcode, \ + PseudoChr_ch_bits, PseudoChr_ch_mask, \ + PseudoChr_code_bits, PseudoChr_code_mask \ +}; + +/* CaCTRL ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |.a.|.op....|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_op; + int mask_op; + int bits_a; + int mask_a; + int bits_code; + int mask_code; +} CaCTRL; + +#define CaCTRL_opcode 0x0240 +#define CaCTRL_reg_bits 0 +#define CaCTRL_reg_mask 0x7 +#define CaCTRL_op_bits 3 +#define CaCTRL_op_mask 0x3 +#define CaCTRL_a_bits 5 +#define CaCTRL_a_mask 0x1 +#define CaCTRL_code_bits 6 +#define CaCTRL_code_mask 0x3fff + +#define init_CaCTRL \ +{ \ + CaCTRL_opcode, \ + CaCTRL_reg_bits, CaCTRL_reg_mask, \ + CaCTRL_op_bits, CaCTRL_op_mask, \ + CaCTRL_a_bits, CaCTRL_a_mask, \ + CaCTRL_code_bits, CaCTRL_code_mask \ +}; + +/* PushPopMultiple ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 1 | 0 |.d.|.p.|.W.|.dr........|.pr........| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_pr; + int mask_pr; + int bits_dr; + int mask_dr; + int bits_W; + int mask_W; + int bits_p; + int mask_p; + int bits_d; + int mask_d; + int bits_code; + int mask_code; +} PushPopMultiple; + +#define PushPopMultiple_opcode 0x0400 +#define PushPopMultiple_pr_bits 0 +#define PushPopMultiple_pr_mask 0x7 +#define PushPopMultiple_dr_bits 3 +#define PushPopMultiple_dr_mask 0x7 +#define PushPopMultiple_W_bits 6 +#define PushPopMultiple_W_mask 0x1 +#define PushPopMultiple_p_bits 7 +#define PushPopMultiple_p_mask 0x1 +#define PushPopMultiple_d_bits 8 +#define PushPopMultiple_d_mask 0x1 +#define PushPopMultiple_code_bits 8 +#define PushPopMultiple_code_mask 0x1 + +#define init_PushPopMultiple \ +{ \ + PushPopMultiple_opcode, \ + PushPopMultiple_pr_bits, PushPopMultiple_pr_mask, \ + PushPopMultiple_dr_bits, PushPopMultiple_dr_mask, \ + PushPopMultiple_W_bits, PushPopMultiple_W_mask, \ + PushPopMultiple_p_bits, PushPopMultiple_p_mask, \ + PushPopMultiple_d_bits, PushPopMultiple_d_mask, \ + PushPopMultiple_code_bits, PushPopMultiple_code_mask \ +}; + +/* PushPopReg ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.W.|.grp.......|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_grp; + int mask_grp; + int bits_W; + int mask_W; + int bits_code; + int mask_code; +} PushPopReg; + +#define PushPopReg_opcode 0x0100 +#define PushPopReg_reg_bits 0 +#define PushPopReg_reg_mask 0x7 +#define PushPopReg_grp_bits 3 +#define PushPopReg_grp_mask 0x7 +#define PushPopReg_W_bits 6 +#define PushPopReg_W_mask 0x1 +#define PushPopReg_code_bits 7 +#define PushPopReg_code_mask 0x1ff + +#define init_PushPopReg \ +{ \ + PushPopReg_opcode, \ + PushPopReg_reg_bits, PushPopReg_reg_mask, \ + PushPopReg_grp_bits, PushPopReg_grp_mask, \ + PushPopReg_W_bits, PushPopReg_W_mask, \ + PushPopReg_code_bits, PushPopReg_code_mask, \ +}; + +/* linkage ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.R.| +|.framesize.....................................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_framesize; + int mask_framesize; + int bits_R; + int mask_R; + int bits_code; + int mask_code; +} Linkage; + +#define Linkage_opcode 0xe8000000 +#define Linkage_framesize_bits 0 +#define Linkage_framesize_mask 0xffff +#define Linkage_R_bits 16 +#define Linkage_R_mask 0x1 +#define Linkage_code_bits 17 +#define Linkage_code_mask 0x7fff + +#define init_Linkage \ +{ \ + Linkage_opcode, \ + Linkage_framesize_bits, Linkage_framesize_mask, \ + Linkage_R_bits, Linkage_R_mask, \ + Linkage_code_bits, Linkage_code_mask \ +}; + +/* LoopSetup ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |.rop...|.c.|.soffset.......| +|.reg...........| - | - |.eoffset...............................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_eoffset; + int mask_eoffset; + int bits_dontcare; + int mask_dontcare; + int bits_reg; + int mask_reg; + int bits_soffset; + int mask_soffset; + int bits_c; + int mask_c; + int bits_rop; + int mask_rop; + int bits_code; + int mask_code; +} LoopSetup; + +#define LoopSetup_opcode 0xe0800000 +#define LoopSetup_eoffset_bits 0 +#define LoopSetup_eoffset_mask 0x3ff +#define LoopSetup_dontcare_bits 10 +#define LoopSetup_dontcare_mask 0x3 +#define LoopSetup_reg_bits 12 +#define LoopSetup_reg_mask 0xf +#define LoopSetup_soffset_bits 16 +#define LoopSetup_soffset_mask 0xf +#define LoopSetup_c_bits 20 +#define LoopSetup_c_mask 0x1 +#define LoopSetup_rop_bits 21 +#define LoopSetup_rop_mask 0x3 +#define LoopSetup_code_bits 23 +#define LoopSetup_code_mask 0x1ff + +#define init_LoopSetup \ +{ \ + LoopSetup_opcode, \ + LoopSetup_eoffset_bits, LoopSetup_eoffset_mask, \ + LoopSetup_dontcare_bits, LoopSetup_dontcare_mask, \ + LoopSetup_reg_bits, LoopSetup_reg_mask, \ + LoopSetup_soffset_bits, LoopSetup_soffset_mask, \ + LoopSetup_c_bits, LoopSetup_c_mask, \ + LoopSetup_rop_bits, LoopSetup_rop_mask, \ + LoopSetup_code_bits, LoopSetup_code_mask \ +}; + +/* LDIMMhalf ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |.Z.|.H.|.S.|.grp...|.reg.......| +|.hword.........................................................| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned long opcode; + int bits_hword; + int mask_hword; + int bits_reg; + int mask_reg; + int bits_grp; + int mask_grp; + int bits_S; + int mask_S; + int bits_H; + int mask_H; + int bits_Z; + int mask_Z; + int bits_code; + int mask_code; +} LDIMMhalf; + +#define LDIMMhalf_opcode 0xe1000000 +#define LDIMMhalf_hword_bits 0 +#define LDIMMhalf_hword_mask 0xffff +#define LDIMMhalf_reg_bits 16 +#define LDIMMhalf_reg_mask 0x7 +#define LDIMMhalf_grp_bits 19 +#define LDIMMhalf_grp_mask 0x3 +#define LDIMMhalf_S_bits 21 +#define LDIMMhalf_S_mask 0x1 +#define LDIMMhalf_H_bits 22 +#define LDIMMhalf_H_mask 0x1 +#define LDIMMhalf_Z_bits 23 +#define LDIMMhalf_Z_mask 0x1 +#define LDIMMhalf_code_bits 24 +#define LDIMMhalf_code_mask 0xff + +#define init_LDIMMhalf \ +{ \ + LDIMMhalf_opcode, \ + LDIMMhalf_hword_bits, LDIMMhalf_hword_mask, \ + LDIMMhalf_reg_bits, LDIMMhalf_reg_mask, \ + LDIMMhalf_grp_bits, LDIMMhalf_grp_mask, \ + LDIMMhalf_S_bits, LDIMMhalf_S_mask, \ + LDIMMhalf_H_bits, LDIMMhalf_H_mask, \ + LDIMMhalf_Z_bits, LDIMMhalf_Z_mask, \ + LDIMMhalf_code_bits, LDIMMhalf_code_mask \ +}; + + +/* CC2dreg ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |.op....|.reg.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_reg; + int mask_reg; + int bits_op; + int mask_op; + int bits_code; + int mask_code; +} CC2dreg; + +#define CC2dreg_opcode 0x0200 +#define CC2dreg_reg_bits 0 +#define CC2dreg_reg_mask 0x7 +#define CC2dreg_op_bits 3 +#define CC2dreg_op_mask 0x3 +#define CC2dreg_code_bits 5 +#define CC2dreg_code_mask 0x7fff + +#define init_CC2dreg \ +{ \ + CC2dreg_opcode, \ + CC2dreg_reg_bits, CC2dreg_reg_mask, \ + CC2dreg_op_bits, CC2dreg_op_mask, \ + CC2dreg_code_bits, CC2dreg_code_mask \ +}; + + +/* PTR2op ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 1 | 0 | 0 | 0 | 1 | 0 |.opc.......|.src.......|.dst.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_dst; + int mask_dst; + int bits_src; + int mask_src; + int bits_opc; + int mask_opc; + int bits_code; + int mask_code; +} PTR2op; + +#define PTR2op_opcode 0x4400 +#define PTR2op_dst_bits 0 +#define PTR2op_dst_mask 0x7 +#define PTR2op_src_bits 3 +#define PTR2op_src_mask 0x7 +#define PTR2op_opc_bits 6 +#define PTR2op_opc_mask 0x7 +#define PTR2op_code_bits 9 +#define PTR2op_code_mask 0x7f + +#define init_PTR2op \ +{ \ + PTR2op_opcode, \ + PTR2op_dst_bits, PTR2op_dst_mask, \ + PTR2op_src_bits, PTR2op_src_mask, \ + PTR2op_opc_bits, PTR2op_opc_mask, \ + PTR2op_code_bits, PTR2op_code_mask \ +}; + + +/* COMP3op ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 1 | 0 | 1 |.opc.......|.dst.......|.src1......|.src0......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_src0; + int mask_src0; + int bits_src1; + int mask_src1; + int bits_dst; + int mask_dst; + int bits_opc; + int mask_opc; + int bits_code; + int mask_code; +} COMP3op; + +#define COMP3op_opcode 0x5000 +#define COMP3op_src0_bits 0 +#define COMP3op_src0_mask 0x7 +#define COMP3op_src1_bits 3 +#define COMP3op_src1_mask 0x7 +#define COMP3op_dst_bits 6 +#define COMP3op_dst_mask 0x7 +#define COMP3op_opc_bits 9 +#define COMP3op_opc_mask 0x7 +#define COMP3op_code_bits 12 +#define COMP3op_code_mask 0xf + +#define init_COMP3op \ +{ \ + COMP3op_opcode, \ + COMP3op_src0_bits, COMP3op_src0_mask, \ + COMP3op_src1_bits, COMP3op_src1_mask, \ + COMP3op_dst_bits, COMP3op_dst_mask, \ + COMP3op_opc_bits, COMP3op_opc_mask, \ + COMP3op_code_bits, COMP3op_code_mask \ +}; + +/* ccMV ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 1 | 1 |.T.|.d.|.s.|.dst.......|.src.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_src; + int mask_src; + int bits_dst; + int mask_dst; + int bits_s; + int mask_s; + int bits_d; + int mask_d; + int bits_T; + int mask_T; + int bits_code; + int mask_code; +} CCmv; + +#define CCmv_opcode 0x0600 +#define CCmv_src_bits 0 +#define CCmv_src_mask 0x7 +#define CCmv_dst_bits 3 +#define CCmv_dst_mask 0x7 +#define CCmv_s_bits 6 +#define CCmv_s_mask 0x1 +#define CCmv_d_bits 7 +#define CCmv_d_mask 0x1 +#define CCmv_T_bits 8 +#define CCmv_T_mask 0x1 +#define CCmv_code_bits 9 +#define CCmv_code_mask 0x7f + +#define init_CCmv \ +{ \ + CCmv_opcode, \ + CCmv_src_bits, CCmv_src_mask, \ + CCmv_dst_bits, CCmv_dst_mask, \ + CCmv_s_bits, CCmv_s_mask, \ + CCmv_d_bits, CCmv_d_mask, \ + CCmv_T_bits, CCmv_T_mask, \ + CCmv_code_bits, CCmv_code_mask \ +}; + + +/* CCflag ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 1 |.I.|.opc.......|.G.|.y.........|.x.........| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_x; + int mask_x; + int bits_y; + int mask_y; + int bits_G; + int mask_G; + int bits_opc; + int mask_opc; + int bits_I; + int mask_I; + int bits_code; + int mask_code; +} CCflag; + +#define CCflag_opcode 0x0800 +#define CCflag_x_bits 0 +#define CCflag_x_mask 0x7 +#define CCflag_y_bits 3 +#define CCflag_y_mask 0x7 +#define CCflag_G_bits 6 +#define CCflag_G_mask 0x1 +#define CCflag_opc_bits 7 +#define CCflag_opc_mask 0x7 +#define CCflag_I_bits 10 +#define CCflag_I_mask 0x1 +#define CCflag_code_bits 11 +#define CCflag_code_mask 0x1f + +#define init_CCflag \ +{ \ + CCflag_opcode, \ + CCflag_x_bits, CCflag_x_mask, \ + CCflag_y_bits, CCflag_y_mask, \ + CCflag_G_bits, CCflag_G_mask, \ + CCflag_opc_bits, CCflag_opc_mask, \ + CCflag_I_bits, CCflag_I_mask, \ + CCflag_code_bits, CCflag_code_mask, \ +}; + + +/* CC2stat ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.D.|.op....|.cbit..............| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_cbit; + int mask_cbit; + int bits_op; + int mask_op; + int bits_D; + int mask_D; + int bits_code; + int mask_code; +} CC2stat; + +#define CC2stat_opcode 0x0300 +#define CC2stat_cbit_bits 0 +#define CC2stat_cbit_mask 0x1f +#define CC2stat_op_bits 5 +#define CC2stat_op_mask 0x3 +#define CC2stat_D_bits 7 +#define CC2stat_D_mask 0x1 +#define CC2stat_code_bits 8 +#define CC2stat_code_mask 0xff + +#define init_CC2stat \ +{ \ + CC2stat_opcode, \ + CC2stat_cbit_bits, CC2stat_cbit_mask, \ + CC2stat_op_bits, CC2stat_op_mask, \ + CC2stat_D_bits, CC2stat_D_mask, \ + CC2stat_code_bits, CC2stat_code_mask \ +}; + + +/* REGMV ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 0 | 1 | 1 |.gd........|.gs........|.dst.......|.src.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_src; + int mask_src; + int bits_dst; + int mask_dst; + int bits_gs; + int mask_gs; + int bits_gd; + int mask_gd; + int bits_code; + int mask_code; +} RegMv; + +#define RegMv_opcode 0x3000 +#define RegMv_src_bits 0 +#define RegMv_src_mask 0x7 +#define RegMv_dst_bits 3 +#define RegMv_dst_mask 0x7 +#define RegMv_gs_bits 6 +#define RegMv_gs_mask 0x7 +#define RegMv_gd_bits 9 +#define RegMv_gd_mask 0x7 +#define RegMv_code_bits 12 +#define RegMv_code_mask 0xf + +#define init_RegMv \ +{ \ + RegMv_opcode, \ + RegMv_src_bits, RegMv_src_mask, \ + RegMv_dst_bits, RegMv_dst_mask, \ + RegMv_gs_bits, RegMv_gs_mask, \ + RegMv_gd_bits, RegMv_gd_mask, \ + RegMv_code_bits, RegMv_code_mask \ +}; + + +/* COMPI2opD ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 1 | 1 | 0 | 0 |.op|.isrc......................|.dst.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_dst; + int mask_dst; + int bits_src; + int mask_src; + int bits_op; + int mask_op; + int bits_code; + int mask_code; +} COMPI2opD; + +#define COMPI2opD_opcode 0x6000 +#define COMPI2opD_dst_bits 0 +#define COMPI2opD_dst_mask 0x7 +#define COMPI2opD_src_bits 3 +#define COMPI2opD_src_mask 0x7f +#define COMPI2opD_op_bits 10 +#define COMPI2opD_op_mask 0x1 +#define COMPI2opD_code_bits 11 +#define COMPI2opD_code_mask 0x1f + +#define init_COMPI2opD \ +{ \ + COMPI2opD_opcode, \ + COMPI2opD_dst_bits, COMPI2opD_dst_mask, \ + COMPI2opD_src_bits, COMPI2opD_src_mask, \ + COMPI2opD_op_bits, COMPI2opD_op_mask, \ + COMPI2opD_code_bits, COMPI2opD_code_mask \ +}; + +/* COMPI2opP ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 0 | 1 | 1 | 0 | 1 |.op|.src.......................|.dst.......| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef COMPI2opD COMPI2opP; + +#define COMPI2opP_opcode 0x6800 +#define COMPI2opP_dst_bits 0 +#define COMPI2opP_dst_mask 0x7 +#define COMPI2opP_src_bits 3 +#define COMPI2opP_src_mask 0x7f +#define COMPI2opP_op_bits 10 +#define COMPI2opP_op_mask 0x1 +#define COMPI2opP_code_bits 11 +#define COMPI2opP_code_mask 0x1f + +#define init_COMPI2opP \ +{ \ + COMPI2opP_opcode, \ + COMPI2opP_dst_bits, COMPI2opP_dst_mask, \ + COMPI2opP_src_bits, COMPI2opP_src_mask, \ + COMPI2opP_op_bits, COMPI2opP_op_mask, \ + COMPI2opP_code_bits, COMPI2opP_code_mask \ +}; + + +/* dagMODim ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_i; + int mask_i; + int bits_m; + int mask_m; + int bits_op; + int mask_op; + int bits_code2; + int mask_code2; + int bits_br; + int mask_br; + int bits_code; + int mask_code; +} DagMODim; + +#define DagMODim_opcode 0x9e60 +#define DagMODim_i_bits 0 +#define DagMODim_i_mask 0x3 +#define DagMODim_m_bits 2 +#define DagMODim_m_mask 0x3 +#define DagMODim_op_bits 4 +#define DagMODim_op_mask 0x1 +#define DagMODim_code2_bits 5 +#define DagMODim_code2_mask 0x3 +#define DagMODim_br_bits 7 +#define DagMODim_br_mask 0x1 +#define DagMODim_code_bits 8 +#define DagMODim_code_mask 0xff + +#define init_DagMODim \ +{ \ + DagMODim_opcode, \ + DagMODim_i_bits, DagMODim_i_mask, \ + DagMODim_m_bits, DagMODim_m_mask, \ + DagMODim_op_bits, DagMODim_op_mask, \ + DagMODim_code2_bits, DagMODim_code2_mask, \ + DagMODim_br_bits, DagMODim_br_mask, \ + DagMODim_code_bits, DagMODim_code_mask \ +}; + +/* dagMODik ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....| ++---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ +*/ + +typedef struct +{ + unsigned short opcode; + int bits_i; + int mask_i; + int bits_op; + int mask_op; + int bits_code; + int mask_code; +} DagMODik; + +#define DagMODik_opcode 0x9f60 +#define DagMODik_i_bits 0 +#define DagMODik_i_mask 0x3 +#define DagMODik_op_bits 2 +#define DagMODik_op_mask 0x3 +#define DagMODik_code_bits 3 +#define DagMODik_code_mask 0xfff + +#define init_DagMODik \ +{ \ + DagMODik_opcode, \ + DagMODik_i_bits, DagMODik_i_mask, \ + DagMODik_op_bits, DagMODik_op_mask, \ + DagMODik_code_bits, DagMODik_code_mask \ +}; + +#endif diff --git a/include/opcode/cgen.h b/include/opcode/cgen.h new file mode 100644 index 0000000..b7e82d4 --- /dev/null +++ b/include/opcode/cgen.h @@ -0,0 +1,1480 @@ +/* Header file for targets using CGEN: Cpu tools GENerator. + + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of GDB, the GNU debugger, and the GNU Binutils. + + 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, write to the Free Software Foundation, Inc., + 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef OPCODE_CGEN_H +#define OPCODE_CGEN_H + +#include "symcat.h" +#include "cgen/bitset.h" + +/* ??? IWBN to replace bfd in the name. */ +#include "bfd_stdint.h" + +/* ??? This file requires bfd.h but only to get bfd_vma. + Seems like an awful lot to require just to get such a fundamental type. + Perhaps the definition of bfd_vma can be moved outside of bfd.h. + Or perhaps one could duplicate its definition in another file. + Until such time, this file conditionally compiles definitions that require + bfd_vma using __BFD_H_SEEN__. */ + +/* Enums must be defined before they can be used. + Allow them to be used in struct definitions, even though the enum must + be defined elsewhere. + If CGEN_ARCH isn't defined, this file is being included by something other + than -desc.h. */ + +/* Prepend the arch name, defined in -desc.h, and _cgen_ to symbol S. + The lack of spaces in the arg list is important for non-stdc systems. + This file is included by -desc.h. + It can be included independently of -desc.h, in which case the arch + dependent portions will be declared as "unknown_cgen_foo". */ + +#ifndef CGEN_SYM +#define CGEN_SYM(s) CONCAT3 (unknown,_cgen_,s) +#endif + +/* This file contains the static (unchanging) pieces and as much other stuff + as we can reasonably put here. It's generally cleaner to put stuff here + rather than having it machine generated if possible. */ + +/* The assembler syntax is made up of expressions (duh...). + At the lowest level the values are mnemonics, register names, numbers, etc. + Above that are subexpressions, if any (an example might be the + "effective address" in m68k cpus). Subexpressions are wip. + At the second highest level are the insns themselves. Above that are + pseudo-insns, synthetic insns, and macros, if any. */ + +/* Lots of cpu's have a fixed insn size, or one which rarely changes, + and it's generally easier to handle these by treating the insn as an + integer type, rather than an array of characters. So we allow targets + to control this. When an integer type the value is in host byte order, + when an array of characters the value is in target byte order. */ + +typedef unsigned int CGEN_INSN_INT; +typedef int64_t CGEN_INSN_LGSINT; /* large/long SINT */ +typedef uint64_t CGEN_INSN_LGUINT; /* large/long UINT */ + +#if CGEN_INT_INSN_P +typedef CGEN_INSN_INT CGEN_INSN_BYTES; +typedef CGEN_INSN_INT *CGEN_INSN_BYTES_PTR; +#else +typedef unsigned char *CGEN_INSN_BYTES; +typedef unsigned char *CGEN_INSN_BYTES_PTR; +#endif + +#ifdef __GNUC__ +#define CGEN_INLINE __inline__ +#else +#define CGEN_INLINE +#endif + +enum cgen_endian +{ + CGEN_ENDIAN_UNKNOWN, + CGEN_ENDIAN_LITTLE, + CGEN_ENDIAN_BIG +}; + +/* Forward decl. */ + +typedef struct cgen_insn CGEN_INSN; + +/* Opaque pointer version for use by external world. */ + +typedef struct cgen_cpu_desc *CGEN_CPU_DESC; + +/* Attributes. + Attributes are used to describe various random things associated with + an object (ifield, hardware, operand, insn, whatever) and are specified + as name/value pairs. + Integer attributes computed at compile time are currently all that's + supported, though adding string attributes and run-time computation is + straightforward. Integer attribute values are always host int's + (signed or unsigned). For portability, this means 32 bits. + Integer attributes are further categorized as boolean, bitset, integer, + and enum types. Boolean attributes appear frequently enough that they're + recorded in one host int. This limits the maximum number of boolean + attributes to 32, though that's a *lot* of attributes. */ + +/* Type of attribute values. */ + +typedef CGEN_BITSET CGEN_ATTR_VALUE_BITSET_TYPE; +typedef int CGEN_ATTR_VALUE_ENUM_TYPE; +typedef union +{ + CGEN_ATTR_VALUE_BITSET_TYPE bitset; + CGEN_ATTR_VALUE_ENUM_TYPE nonbitset; +} CGEN_ATTR_VALUE_TYPE; + +/* Struct to record attribute information. */ + +typedef struct +{ + /* Boolean attributes. */ + unsigned int bool_; + /* Non-boolean integer attributes. */ + CGEN_ATTR_VALUE_TYPE nonbool[1]; +} CGEN_ATTR; + +/* Define a structure member for attributes with N non-boolean entries. + There is no maximum number of non-boolean attributes. + There is a maximum of 32 boolean attributes (since they are all recorded + in one host int). */ + +#define CGEN_ATTR_TYPE(n) \ +struct { unsigned int bool_; \ + CGEN_ATTR_VALUE_TYPE nonbool[(n) ? (n) : 1]; } + +/* Return the boolean attributes. */ + +#define CGEN_ATTR_BOOLS(a) ((a)->bool_) + +/* Non-boolean attribute numbers are offset by this much. */ + +#define CGEN_ATTR_NBOOL_OFFSET 32 + +/* Given a boolean attribute number, return its mask. */ + +#define CGEN_ATTR_MASK(attr) (1 << (attr)) + +/* Return the value of boolean attribute ATTR in ATTRS. */ + +#define CGEN_BOOL_ATTR(attrs, attr) ((CGEN_ATTR_MASK (attr) & (attrs)) != 0) + +/* Return value of attribute ATTR in ATTR_TABLE for OBJ. + OBJ is a pointer to the entity that has the attributes + (??? not used at present but is reserved for future purposes - eventually + the goal is to allow recording attributes in source form and computing + them lazily at runtime, not sure of the details yet). */ + +#define CGEN_ATTR_VALUE(obj, attr_table, attr) \ +((unsigned int) (attr) < CGEN_ATTR_NBOOL_OFFSET \ + ? ((CGEN_ATTR_BOOLS (attr_table) & CGEN_ATTR_MASK (attr)) != 0) \ + : ((attr_table)->nonbool[(attr) - CGEN_ATTR_NBOOL_OFFSET].nonbitset)) +#define CGEN_BITSET_ATTR_VALUE(obj, attr_table, attr) \ + ((attr_table)->nonbool[(attr) - CGEN_ATTR_NBOOL_OFFSET].bitset) + +/* Attribute name/value tables. + These are used to assist parsing of descriptions at run-time. */ + +typedef struct +{ + const char * name; + unsigned value; +} CGEN_ATTR_ENTRY; + +/* For each domain (ifld,hw,operand,insn), list of attributes. */ + +typedef struct +{ + const char * name; + const CGEN_ATTR_ENTRY * dfault; + const CGEN_ATTR_ENTRY * vals; +} CGEN_ATTR_TABLE; + +/* Instruction set variants. */ + +typedef struct { + const char *name; + + /* Default instruction size (in bits). + This is used by the assembler when it encounters an unknown insn. */ + unsigned int default_insn_bitsize; + + /* Base instruction size (in bits). + For non-LIW cpus this is generally the length of the smallest insn. + For LIW cpus its wip (work-in-progress). For the m32r its 32. */ + unsigned int base_insn_bitsize; + + /* Minimum/maximum instruction size (in bits). */ + unsigned int min_insn_bitsize; + unsigned int max_insn_bitsize; +} CGEN_ISA; + +/* Machine variants. */ + +typedef struct { + const char *name; + /* The argument to bfd_arch_info->scan. */ + const char *bfd_name; + /* one of enum mach_attr */ + int num; + /* parameter from mach->cpu */ + unsigned int insn_chunk_bitsize; +} CGEN_MACH; + +/* Parse result (also extraction result). + + The result of parsing an insn is stored here. + To generate the actual insn, this is passed to the insert handler. + When printing an insn, the result of extraction is stored here. + To print the insn, this is passed to the print handler. + + It is machine generated so we don't define it here, + but we do need a forward decl for the handler fns. + + There is one member for each possible field in the insn. + The type depends on the field. + Also recorded here is the computed length of the insn for architectures + where it varies. +*/ + +typedef struct cgen_fields CGEN_FIELDS; + +/* Total length of the insn, as recorded in the `fields' struct. */ +/* ??? The field insert handler has lots of opportunities for optimization + if it ever gets inlined. On architectures where insns all have the same + size, may wish to detect that and make this macro a constant - to allow + further optimizations. */ + +#define CGEN_FIELDS_BITSIZE(fields) ((fields)->length) + +/* Extraction support for variable length insn sets. */ + +/* When disassembling we don't know the number of bytes to read at the start. + So the first CGEN_BASE_INSN_SIZE bytes are read at the start and the rest + are read when needed. This struct controls this. It is basically the + disassemble_info stuff, except that we provide a cache for values already + read (since bytes can typically be read several times to fetch multiple + operands that may be in them), and that extraction of fields is needed + in contexts other than disassembly. */ + +typedef struct { + /* A pointer to the disassemble_info struct. + We don't require dis-asm.h so we use void * for the type here. + If NULL, BYTES is full of valid data (VALID == -1). */ + void *dis_info; + /* Points to a working buffer of sufficient size. */ + unsigned char *insn_bytes; + /* Mask of bytes that are valid in INSN_BYTES. */ + unsigned int valid; +} CGEN_EXTRACT_INFO; + +/* Associated with each insn or expression is a set of "handlers" for + performing operations like parsing, printing, etc. These require a bfd_vma + value to be passed around but we don't want all applications to need bfd.h. + So this stuff is only provided if bfd.h has been included. */ + +/* Parse handler. + CD is a cpu table descriptor. + INSN is a pointer to a struct describing the insn being parsed. + STRP is a pointer to a pointer to the text being parsed. + FIELDS is a pointer to a cgen_fields struct in which the results are placed. + If the expression is successfully parsed, *STRP is updated. + If not it is left alone. + The result is NULL if success or an error message. */ +typedef const char * (cgen_parse_fn) + (CGEN_CPU_DESC, const CGEN_INSN *insn_, + const char **strp_, CGEN_FIELDS *fields_); + +/* Insert handler. + CD is a cpu table descriptor. + INSN is a pointer to a struct describing the insn being parsed. + FIELDS is a pointer to a cgen_fields struct from which the values + are fetched. + INSNP is a pointer to a buffer in which to place the insn. + PC is the pc value of the insn. + The result is an error message or NULL if success. */ + +#ifdef __BFD_H_SEEN__ +typedef const char * (cgen_insert_fn) + (CGEN_CPU_DESC, const CGEN_INSN *insn_, + CGEN_FIELDS *fields_, CGEN_INSN_BYTES_PTR insnp_, + bfd_vma pc_); +#else +typedef const char * (cgen_insert_fn) (); +#endif + +/* Extract handler. + CD is a cpu table descriptor. + INSN is a pointer to a struct describing the insn being parsed. + The second argument is a pointer to a struct controlling extraction + (only used for variable length insns). + EX_INFO is a pointer to a struct for controlling reading of further + bytes for the insn. + BASE_INSN is the first CGEN_BASE_INSN_SIZE bytes (host order). + FIELDS is a pointer to a cgen_fields struct in which the results are placed. + PC is the pc value of the insn. + The result is the length of the insn in bits or zero if not recognized. */ + +#ifdef __BFD_H_SEEN__ +typedef int (cgen_extract_fn) + (CGEN_CPU_DESC, const CGEN_INSN *insn_, + CGEN_EXTRACT_INFO *ex_info_, CGEN_INSN_INT base_insn_, + CGEN_FIELDS *fields_, bfd_vma pc_); +#else +typedef int (cgen_extract_fn) (); +#endif + +/* Print handler. + CD is a cpu table descriptor. + INFO is a pointer to the disassembly info. + Eg: disassemble_info. It's defined as `PTR' so this file can be included + without dis-asm.h. + INSN is a pointer to a struct describing the insn being printed. + FIELDS is a pointer to a cgen_fields struct. + PC is the pc value of the insn. + LEN is the length of the insn, in bits. */ + +#ifdef __BFD_H_SEEN__ +typedef void (cgen_print_fn) + (CGEN_CPU_DESC, void * info_, const CGEN_INSN *insn_, + CGEN_FIELDS *fields_, bfd_vma pc_, int len_); +#else +typedef void (cgen_print_fn) (); +#endif + +/* Parse/insert/extract/print handlers. + + Indices into the handler tables. + We could use pointers here instead, but 90% of them are generally identical + and that's a lot of redundant data. Making these unsigned char indices + into tables of pointers saves a bit of space. + Using indices also keeps assembler code out of the disassembler and + vice versa. */ + +struct cgen_opcode_handler +{ + unsigned char parse, insert, extract, print; +}; + +/* Assembler interface. + + The interface to the assembler is intended to be clean in the sense that + libopcodes.a is a standalone entity and could be used with any assembler. + Not that one would necessarily want to do that but rather that it helps + keep a clean interface. The interface will obviously be slanted towards + GAS, but at least it's a start. + ??? Note that one possible user of the assembler besides GAS is GDB. + + Parsing is controlled by the assembler which calls + CGEN_SYM (assemble_insn). If it can parse and build the entire insn + it doesn't call back to the assembler. If it needs/wants to call back + to the assembler, cgen_parse_operand_fn is called which can either + + - return a number to be inserted in the insn + - return a "register" value to be inserted + (the register might not be a register per pe) + - queue the argument and return a marker saying the expression has been + queued (eg: a fix-up) + - return an error message indicating the expression wasn't recognizable + + The result is an error message or NULL for success. + The parsed value is stored in the bfd_vma *. */ + +/* Values for indicating what the caller wants. */ + +enum cgen_parse_operand_type +{ + CGEN_PARSE_OPERAND_INIT, + CGEN_PARSE_OPERAND_INTEGER, + CGEN_PARSE_OPERAND_ADDRESS, + CGEN_PARSE_OPERAND_SYMBOLIC +}; + +/* Values for indicating what was parsed. */ + +enum cgen_parse_operand_result +{ + CGEN_PARSE_OPERAND_RESULT_NUMBER, + CGEN_PARSE_OPERAND_RESULT_REGISTER, + CGEN_PARSE_OPERAND_RESULT_QUEUED, + CGEN_PARSE_OPERAND_RESULT_ERROR +}; + +#ifdef __BFD_H_SEEN__ /* Don't require bfd.h unnecessarily. */ +typedef const char * (cgen_parse_operand_fn) + (CGEN_CPU_DESC, + enum cgen_parse_operand_type, const char **, int, int, + enum cgen_parse_operand_result *, bfd_vma *); +#else +typedef const char * (cgen_parse_operand_fn) (); +#endif + +/* Set the cgen_parse_operand_fn callback. */ + +extern void cgen_set_parse_operand_fn + (CGEN_CPU_DESC, cgen_parse_operand_fn); + +/* Called before trying to match a table entry with the insn. */ + +extern void cgen_init_parse_operand (CGEN_CPU_DESC); + +/* Operand values (keywords, integers, symbols, etc.) */ + +/* Types of assembler elements. */ + +enum cgen_asm_type +{ + CGEN_ASM_NONE, CGEN_ASM_KEYWORD, CGEN_ASM_MAX +}; + +#ifndef CGEN_ARCH +enum cgen_hw_type { CGEN_HW_MAX }; +#endif + +/* List of hardware elements. */ + +typedef struct +{ + char *name; + enum cgen_hw_type type; + /* There is currently no example where both index specs and value specs + are required, so for now both are clumped under "asm_data". */ + enum cgen_asm_type asm_type; + void *asm_data; +#ifndef CGEN_HW_NBOOL_ATTRS +#define CGEN_HW_NBOOL_ATTRS 1 +#endif + CGEN_ATTR_TYPE (CGEN_HW_NBOOL_ATTRS) attrs; +#define CGEN_HW_ATTRS(hw) (&(hw)->attrs) +} CGEN_HW_ENTRY; + +/* Return value of attribute ATTR in HW. */ + +#define CGEN_HW_ATTR_VALUE(hw, attr) \ +CGEN_ATTR_VALUE ((hw), CGEN_HW_ATTRS (hw), (attr)) + +/* Table of hardware elements for selected mach, computed at runtime. + enum cgen_hw_type is an index into this table (specifically `entries'). */ + +typedef struct { + /* Pointer to null terminated table of all compiled in entries. */ + const CGEN_HW_ENTRY *init_entries; + unsigned int entry_size; /* since the attribute member is variable sized */ + /* Array of all entries, initial and run-time added. */ + const CGEN_HW_ENTRY **entries; + /* Number of elements in `entries'. */ + unsigned int num_entries; + /* For now, xrealloc is called each time a new entry is added at runtime. + ??? May wish to keep track of some slop to reduce the number of calls to + xrealloc, except that there's unlikely to be many and not expected to be + in speed critical code. */ +} CGEN_HW_TABLE; + +extern const CGEN_HW_ENTRY * cgen_hw_lookup_by_name + (CGEN_CPU_DESC, const char *); +extern const CGEN_HW_ENTRY * cgen_hw_lookup_by_num + (CGEN_CPU_DESC, unsigned int); + +/* This struct is used to describe things like register names, etc. */ + +typedef struct cgen_keyword_entry +{ + /* Name (as in register name). */ + char * name; + + /* Value (as in register number). + The value cannot be -1 as that is used to indicate "not found". + IDEA: Have "FUNCTION" attribute? [function is called to fetch value]. */ + int value; + + /* Attributes. + This should, but technically needn't, appear last. It is a variable sized + array in that one architecture may have 1 nonbool attribute and another + may have more. Having this last means the non-architecture specific code + needn't care. The goal is to eventually record + attributes in their raw form, evaluate them at run-time, and cache the + values, so this worry will go away anyway. */ + /* ??? Moving this last should be done by treating keywords like insn lists + and moving the `next' fields into a CGEN_KEYWORD_LIST struct. */ + /* FIXME: Not used yet. */ +#ifndef CGEN_KEYWORD_NBOOL_ATTRS +#define CGEN_KEYWORD_NBOOL_ATTRS 1 +#endif + CGEN_ATTR_TYPE (CGEN_KEYWORD_NBOOL_ATTRS) attrs; + + /* ??? Putting these here means compiled in entries can't be const. + Not a really big deal, but something to consider. */ + /* Next name hash table entry. */ + struct cgen_keyword_entry *next_name; + /* Next value hash table entry. */ + struct cgen_keyword_entry *next_value; +} CGEN_KEYWORD_ENTRY; + +/* Top level struct for describing a set of related keywords + (e.g. register names). + + This struct supports run-time entry of new values, and hashed lookups. */ + +typedef struct cgen_keyword +{ + /* Pointer to initial [compiled in] values. */ + CGEN_KEYWORD_ENTRY *init_entries; + + /* Number of entries in `init_entries'. */ + unsigned int num_init_entries; + + /* Hash table used for name lookup. */ + CGEN_KEYWORD_ENTRY **name_hash_table; + + /* Hash table used for value lookup. */ + CGEN_KEYWORD_ENTRY **value_hash_table; + + /* Number of entries in the hash_tables. */ + unsigned int hash_table_size; + + /* Pointer to null keyword "" entry if present. */ + const CGEN_KEYWORD_ENTRY *null_entry; + + /* String containing non-alphanumeric characters used + in keywords. + At present, the highest number of entries used is 1. */ + char nonalpha_chars[8]; +} CGEN_KEYWORD; + +/* Structure used for searching. */ + +typedef struct +{ + /* Table being searched. */ + const CGEN_KEYWORD *table; + + /* Specification of what is being searched for. */ + const char *spec; + + /* Current index in hash table. */ + unsigned int current_hash; + + /* Current element in current hash chain. */ + CGEN_KEYWORD_ENTRY *current_entry; +} CGEN_KEYWORD_SEARCH; + +/* Lookup a keyword from its name. */ + +const CGEN_KEYWORD_ENTRY *cgen_keyword_lookup_name + (CGEN_KEYWORD *, const char *); + +/* Lookup a keyword from its value. */ + +const CGEN_KEYWORD_ENTRY *cgen_keyword_lookup_value + (CGEN_KEYWORD *, int); + +/* Add a keyword. */ + +void cgen_keyword_add (CGEN_KEYWORD *, CGEN_KEYWORD_ENTRY *); + +/* Keyword searching. + This can be used to retrieve every keyword, or a subset. */ + +CGEN_KEYWORD_SEARCH cgen_keyword_search_init + (CGEN_KEYWORD *, const char *); +const CGEN_KEYWORD_ENTRY *cgen_keyword_search_next + (CGEN_KEYWORD_SEARCH *); + +/* Operand value support routines. */ + +extern const char *cgen_parse_keyword + (CGEN_CPU_DESC, const char **, CGEN_KEYWORD *, long *); +#ifdef __BFD_H_SEEN__ /* Don't require bfd.h unnecessarily. */ +extern const char *cgen_parse_signed_integer + (CGEN_CPU_DESC, const char **, int, long *); +extern const char *cgen_parse_unsigned_integer + (CGEN_CPU_DESC, const char **, int, unsigned long *); +extern const char *cgen_parse_address + (CGEN_CPU_DESC, const char **, int, int, + enum cgen_parse_operand_result *, bfd_vma *); +extern const char *cgen_validate_signed_integer + (long, long, long); +extern const char *cgen_validate_unsigned_integer + (unsigned long, unsigned long, unsigned long); +#endif + +/* Operand modes. */ + +/* ??? This duplicates the values in arch.h. Revisit. + These however need the CGEN_ prefix [as does everything in this file]. */ +/* ??? Targets may need to add their own modes so we may wish to move this + to -opc.h, or add a hook. */ + +enum cgen_mode { + CGEN_MODE_VOID, /* ??? rename simulator's VM to VOID? */ + CGEN_MODE_BI, CGEN_MODE_QI, CGEN_MODE_HI, CGEN_MODE_SI, CGEN_MODE_DI, + CGEN_MODE_UBI, CGEN_MODE_UQI, CGEN_MODE_UHI, CGEN_MODE_USI, CGEN_MODE_UDI, + CGEN_MODE_SF, CGEN_MODE_DF, CGEN_MODE_XF, CGEN_MODE_TF, + CGEN_MODE_TARGET_MAX, + CGEN_MODE_INT, CGEN_MODE_UINT, + CGEN_MODE_MAX +}; + +/* FIXME: Until simulator is updated. */ + +#define CGEN_MODE_VM CGEN_MODE_VOID + +/* Operands. */ + +#ifndef CGEN_ARCH +enum cgen_operand_type { CGEN_OPERAND_MAX }; +#endif + +/* "nil" indicator for the operand instance table */ +#define CGEN_OPERAND_NIL CGEN_OPERAND_MAX + +/* A tree of these structs represents the multi-ifield + structure of an operand's hw-index value, if it exists. */ + +struct cgen_ifld; + +typedef struct cgen_maybe_multi_ifield +{ + int count; /* 0: indexed by single cgen_ifld (possibly null: dead entry); + n: indexed by array of more cgen_maybe_multi_ifields. */ + union + { + const void *p; + const struct cgen_maybe_multi_ifield * multi; + const struct cgen_ifld * leaf; + } val; +} +CGEN_MAYBE_MULTI_IFLD; + +/* This struct defines each entry in the operand table. */ + +typedef struct +{ + /* Name as it appears in the syntax string. */ + char *name; + + /* Operand type. */ + enum cgen_operand_type type; + + /* The hardware element associated with this operand. */ + enum cgen_hw_type hw_type; + + /* FIXME: We don't yet record ifield definitions, which we should. + When we do it might make sense to delete start/length (since they will + be duplicated in the ifield's definition) and replace them with a + pointer to the ifield entry. */ + + /* Bit position. + This is just a hint, and may be unused in more complex operands. + May be unused for a modifier. */ + unsigned char start; + + /* The number of bits in the operand. + This is just a hint, and may be unused in more complex operands. + May be unused for a modifier. */ + unsigned char length; + + /* The (possibly-multi) ifield used as an index for this operand, if it + is indexed by a field at all. This substitutes / extends the start and + length fields above, but unsure at this time whether they are used + anywhere. */ + CGEN_MAYBE_MULTI_IFLD index_fields; +#if 0 /* ??? Interesting idea but relocs tend to get too complicated, + and ABI dependent, for simple table lookups to work. */ + /* Ideally this would be the internal (external?) reloc type. */ + int reloc_type; +#endif + + /* Attributes. + This should, but technically needn't, appear last. It is a variable sized + array in that one architecture may have 1 nonbool attribute and another + may have more. Having this last means the non-architecture specific code + needn't care, now or tomorrow. The goal is to eventually record + attributes in their raw form, evaluate them at run-time, and cache the + values, so this worry will go away anyway. */ +#ifndef CGEN_OPERAND_NBOOL_ATTRS +#define CGEN_OPERAND_NBOOL_ATTRS 1 +#endif + CGEN_ATTR_TYPE (CGEN_OPERAND_NBOOL_ATTRS) attrs; +#define CGEN_OPERAND_ATTRS(operand) (&(operand)->attrs) +} CGEN_OPERAND; + +/* Return value of attribute ATTR in OPERAND. */ + +#define CGEN_OPERAND_ATTR_VALUE(operand, attr) \ +CGEN_ATTR_VALUE ((operand), CGEN_OPERAND_ATTRS (operand), (attr)) + +/* Table of operands for selected mach/isa, computed at runtime. + enum cgen_operand_type is an index into this table (specifically + `entries'). */ + +typedef struct { + /* Pointer to null terminated table of all compiled in entries. */ + const CGEN_OPERAND *init_entries; + unsigned int entry_size; /* since the attribute member is variable sized */ + /* Array of all entries, initial and run-time added. */ + const CGEN_OPERAND **entries; + /* Number of elements in `entries'. */ + unsigned int num_entries; + /* For now, xrealloc is called each time a new entry is added at runtime. + ??? May wish to keep track of some slop to reduce the number of calls to + xrealloc, except that there's unlikely to be many and not expected to be + in speed critical code. */ +} CGEN_OPERAND_TABLE; + +extern const CGEN_OPERAND * cgen_operand_lookup_by_name + (CGEN_CPU_DESC, const char *); +extern const CGEN_OPERAND * cgen_operand_lookup_by_num + (CGEN_CPU_DESC, int); + +/* Instruction operand instances. + + For each instruction, a list of the hardware elements that are read and + written are recorded. */ + +/* The type of the instance. */ + +enum cgen_opinst_type { + /* End of table marker. */ + CGEN_OPINST_END = 0, + CGEN_OPINST_INPUT, CGEN_OPINST_OUTPUT +}; + +typedef struct +{ + /* Input or output indicator. */ + enum cgen_opinst_type type; + + /* Name of operand. */ + const char *name; + + /* The hardware element referenced. */ + enum cgen_hw_type hw_type; + + /* The mode in which the operand is being used. */ + enum cgen_mode mode; + + /* The operand table entry CGEN_OPERAND_NIL if there is none + (i.e. an explicit hardware reference). */ + enum cgen_operand_type op_type; + + /* If `operand' is "nil", the index (e.g. into array of registers). */ + int index; + + /* Attributes. + ??? This perhaps should be a real attribute struct but there's + no current need, so we save a bit of space and just have a set of + flags. The interface is such that this can easily be made attributes + should it prove useful. */ + unsigned int attrs; +#define CGEN_OPINST_ATTRS(opinst) ((opinst)->attrs) +/* Return value of attribute ATTR in OPINST. */ +#define CGEN_OPINST_ATTR(opinst, attr) \ +((CGEN_OPINST_ATTRS (opinst) & (attr)) != 0) +/* Operand is conditionally referenced (read/written). */ +#define CGEN_OPINST_COND_REF 1 +} CGEN_OPINST; + +/* Syntax string. + + Each insn format and subexpression has one of these. + + The syntax "string" consists of characters (n > 0 && n < 128), and operand + values (n >= 128), and is terminated by 0. Operand values are 128 + index + into the operand table. The operand table doesn't exist in C, per se, as + the data is recorded in the parse/insert/extract/print switch statements. */ + +/* This should be at least as large as necessary for any target. */ +#define CGEN_MAX_SYNTAX_ELEMENTS 48 + +/* A target may know its own precise maximum. Assert that it falls below + the above limit. */ +#ifdef CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS +#if CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS > CGEN_MAX_SYNTAX_ELEMENTS +#error "CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS too high - enlarge CGEN_MAX_SYNTAX_ELEMENTS" +#endif +#endif + +typedef unsigned short CGEN_SYNTAX_CHAR_TYPE; + +typedef struct +{ + CGEN_SYNTAX_CHAR_TYPE syntax[CGEN_MAX_SYNTAX_ELEMENTS]; +} CGEN_SYNTAX; + +#define CGEN_SYNTAX_STRING(syn) (syn->syntax) +#define CGEN_SYNTAX_CHAR_P(c) ((c) < 128) +#define CGEN_SYNTAX_CHAR(c) ((unsigned char)c) +#define CGEN_SYNTAX_FIELD(c) ((c) - 128) +#define CGEN_SYNTAX_MAKE_FIELD(c) ((c) + 128) + +/* ??? I can't currently think of any case where the mnemonic doesn't come + first [and if one ever doesn't building the hash tables will be tricky]. + However, we treat mnemonics as just another operand of the instruction. + A value of 1 means "this is where the mnemonic appears". 1 isn't + special other than it's a non-printable ASCII char. */ + +#define CGEN_SYNTAX_MNEMONIC 1 +#define CGEN_SYNTAX_MNEMONIC_P(ch) ((ch) == CGEN_SYNTAX_MNEMONIC) + +/* Instruction fields. + + ??? We currently don't allow adding fields at run-time. + Easy to fix when needed. */ + +typedef struct cgen_ifld { + /* Enum of ifield. */ + int num; +#define CGEN_IFLD_NUM(f) ((f)->num) + + /* Name of the field, distinguishes it from all other fields. */ + const char *name; +#define CGEN_IFLD_NAME(f) ((f)->name) + + /* Default offset, in bits, from the start of the insn to the word + containing the field. */ + int word_offset; +#define CGEN_IFLD_WORD_OFFSET(f) ((f)->word_offset) + + /* Default length of the word containing the field. */ + int word_size; +#define CGEN_IFLD_WORD_SIZE(f) ((f)->word_size) + + /* Default starting bit number. + Whether lsb=0 or msb=0 is determined by CGEN_INSN_LSB0_P. */ + int start; +#define CGEN_IFLD_START(f) ((f)->start) + + /* Length of the field, in bits. */ + int length; +#define CGEN_IFLD_LENGTH(f) ((f)->length) + +#ifndef CGEN_IFLD_NBOOL_ATTRS +#define CGEN_IFLD_NBOOL_ATTRS 1 +#endif + CGEN_ATTR_TYPE (CGEN_IFLD_NBOOL_ATTRS) attrs; +#define CGEN_IFLD_ATTRS(f) (&(f)->attrs) +} CGEN_IFLD; + +/* Return value of attribute ATTR in IFLD. */ +#define CGEN_IFLD_ATTR_VALUE(ifld, attr) \ +CGEN_ATTR_VALUE ((ifld), CGEN_IFLD_ATTRS (ifld), (attr)) + +/* Instruction data. */ + +/* Instruction formats. + + Instructions are grouped by format. Associated with an instruction is its + format. Each insn's opcode table entry contains a format table entry. + ??? There is usually very few formats compared with the number of insns, + so one can reduce the size of the opcode table by recording the format table + as a separate entity. Given that we currently don't, format table entries + are also distinguished by their operands. This increases the size of the + table, but reduces the number of tables. It's all minutiae anyway so it + doesn't really matter [at this point in time]. + + ??? Support for variable length ISA's is wip. */ + +/* Accompanying each iformat description is a list of its fields. */ + +typedef struct { + const CGEN_IFLD *ifld; +#define CGEN_IFMT_IFLD_IFLD(ii) ((ii)->ifld) +} CGEN_IFMT_IFLD; + +/* This should be at least as large as necessary for any target. */ +#define CGEN_MAX_IFMT_OPERANDS 16 + +/* A target may know its own precise maximum. Assert that it falls below + the above limit. */ +#ifdef CGEN_ACTUAL_MAX_IFMT_OPERANDS +#if CGEN_ACTUAL_MAX_IFMT_OPERANDS > CGEN_MAX_IFMT_OPERANDS +#error "CGEN_ACTUAL_MAX_IFMT_OPERANDS too high - enlarge CGEN_MAX_IFMT_OPERANDS" +#endif +#endif + + +typedef struct +{ + /* Length that MASK and VALUE have been calculated to + [VALUE is recorded elsewhere]. + Normally it is base_insn_bitsize. On [V]LIW architectures where the base + insn size may be larger than the size of an insn, this field is less than + base_insn_bitsize. */ + unsigned char mask_length; +#define CGEN_IFMT_MASK_LENGTH(ifmt) ((ifmt)->mask_length) + + /* Total length of instruction, in bits. */ + unsigned char length; +#define CGEN_IFMT_LENGTH(ifmt) ((ifmt)->length) + + /* Mask to apply to the first MASK_LENGTH bits. + Each insn's value is stored with the insn. + The first step in recognizing an insn for disassembly is + (opcode & mask) == value. */ + CGEN_INSN_INT mask; +#define CGEN_IFMT_MASK(ifmt) ((ifmt)->mask) + + /* Instruction fields. + +1 for trailing NULL. */ + CGEN_IFMT_IFLD iflds[CGEN_MAX_IFMT_OPERANDS + 1]; +#define CGEN_IFMT_IFLDS(ifmt) ((ifmt)->iflds) +} CGEN_IFMT; + +/* Instruction values. */ + +typedef struct +{ + /* The opcode portion of the base insn. */ + CGEN_INSN_INT base_value; + +#ifdef CGEN_MAX_EXTRA_OPCODE_OPERANDS + /* Extra opcode values beyond base_value. */ + unsigned long ifield_values[CGEN_MAX_EXTRA_OPCODE_OPERANDS]; +#endif +} CGEN_IVALUE; + +/* Instruction opcode table. + This contains the syntax and format data of an instruction. */ + +/* ??? Some ports already have an opcode table yet still need to use the rest + of what cgen_insn has. Plus keeping the opcode data with the operand + instance data can create a pretty big file. So we keep them separately. + Not sure this is a good idea in the long run. */ + +typedef struct +{ + /* Indices into parse/insert/extract/print handler tables. */ + struct cgen_opcode_handler handlers; +#define CGEN_OPCODE_HANDLERS(opc) (& (opc)->handlers) + + /* Syntax string. */ + CGEN_SYNTAX syntax; +#define CGEN_OPCODE_SYNTAX(opc) (& (opc)->syntax) + + /* Format entry. */ + const CGEN_IFMT *format; +#define CGEN_OPCODE_FORMAT(opc) ((opc)->format) +#define CGEN_OPCODE_MASK_BITSIZE(opc) CGEN_IFMT_MASK_LENGTH (CGEN_OPCODE_FORMAT (opc)) +#define CGEN_OPCODE_BITSIZE(opc) CGEN_IFMT_LENGTH (CGEN_OPCODE_FORMAT (opc)) +#define CGEN_OPCODE_IFLDS(opc) CGEN_IFMT_IFLDS (CGEN_OPCODE_FORMAT (opc)) + + /* Instruction opcode value. */ + CGEN_IVALUE value; +#define CGEN_OPCODE_VALUE(opc) (& (opc)->value) +#define CGEN_OPCODE_BASE_VALUE(opc) (CGEN_OPCODE_VALUE (opc)->base_value) +#define CGEN_OPCODE_BASE_MASK(opc) CGEN_IFMT_MASK (CGEN_OPCODE_FORMAT (opc)) +} CGEN_OPCODE; + +/* Instruction attributes. + This is made a published type as applications can cache a pointer to + the attributes for speed. */ + +#ifndef CGEN_INSN_NBOOL_ATTRS +#define CGEN_INSN_NBOOL_ATTRS 1 +#endif +typedef CGEN_ATTR_TYPE (CGEN_INSN_NBOOL_ATTRS) CGEN_INSN_ATTR_TYPE; + +/* Enum of architecture independent attributes. */ + +#ifndef CGEN_ARCH +/* ??? Numbers here are recorded in two places. */ +typedef enum cgen_insn_attr { + CGEN_INSN_ALIAS = 0 +} CGEN_INSN_ATTR; +#define CGEN_ATTR_CGEN_INSN_ALIAS_VALUE(attrs) ((attrs)->bool_ & (1 << CGEN_INSN_ALIAS)) +#endif + +/* This struct defines each entry in the instruction table. */ + +typedef struct +{ + /* Each real instruction is enumerated. */ + /* ??? This may go away in time. */ + int num; +#define CGEN_INSN_NUM(insn) ((insn)->base->num) + + /* Name of entry (that distinguishes it from all other entries). */ + /* ??? If mnemonics have operands, try to print full mnemonic. */ + const char *name; +#define CGEN_INSN_NAME(insn) ((insn)->base->name) + + /* Mnemonic. This is used when parsing and printing the insn. + In the case of insns that have operands on the mnemonics, this is + only the constant part. E.g. for conditional execution of an `add' insn, + where the full mnemonic is addeq, addne, etc., and the condition is + treated as an operand, this is only "add". */ + const char *mnemonic; +#define CGEN_INSN_MNEMONIC(insn) ((insn)->base->mnemonic) + + /* Total length of instruction, in bits. */ + int bitsize; +#define CGEN_INSN_BITSIZE(insn) ((insn)->base->bitsize) + +#if 0 /* ??? Disabled for now as there is a problem with embedded newlines + and the table is already pretty big. Should perhaps be moved + to a file of its own. */ + /* Semantics, as RTL. */ + /* ??? Plain text or bytecodes? */ + /* ??? Note that the operand instance table could be computed at run-time + if we parse this and cache the results. Something to eventually do. */ + const char *rtx; +#define CGEN_INSN_RTX(insn) ((insn)->base->rtx) +#endif + + /* Attributes. + This must appear last. It is a variable sized array in that one + architecture may have 1 nonbool attribute and another may have more. + Having this last means the non-architecture specific code needn't + care. The goal is to eventually record attributes in their raw form, + evaluate them at run-time, and cache the values, so this worry will go + away anyway. */ + CGEN_INSN_ATTR_TYPE attrs; +#define CGEN_INSN_ATTRS(insn) (&(insn)->base->attrs) +/* Return value of attribute ATTR in INSN. */ +#define CGEN_INSN_ATTR_VALUE(insn, attr) \ +CGEN_ATTR_VALUE ((insn), CGEN_INSN_ATTRS (insn), (attr)) +#define CGEN_INSN_BITSET_ATTR_VALUE(insn, attr) \ + CGEN_BITSET_ATTR_VALUE ((insn), CGEN_INSN_ATTRS (insn), (attr)) +} CGEN_IBASE; + +/* Return non-zero if INSN is the "invalid" insn marker. */ + +#define CGEN_INSN_INVALID_P(insn) (CGEN_INSN_MNEMONIC (insn) == 0) + +/* Main struct contain instruction information. + BASE is always present, the rest is present only if asked for. */ + +struct cgen_insn +{ + /* ??? May be of use to put a type indicator here. + Then this struct could different info for different classes of insns. */ + /* ??? A speedup can be had by moving `base' into this struct. + Maybe later. */ + const CGEN_IBASE *base; + const CGEN_OPCODE *opcode; + const CGEN_OPINST *opinst; + + /* Regex to disambiguate overloaded opcodes */ + void *rx; +#define CGEN_INSN_RX(insn) ((insn)->rx) +#define CGEN_MAX_RX_ELEMENTS (CGEN_MAX_SYNTAX_ELEMENTS * 5) +}; + +/* Instruction lists. + This is used for adding new entries and for creating the hash lists. */ + +typedef struct cgen_insn_list +{ + struct cgen_insn_list *next; + const CGEN_INSN *insn; +} CGEN_INSN_LIST; + +/* Table of instructions. */ + +typedef struct +{ + const CGEN_INSN *init_entries; + unsigned int entry_size; /* since the attribute member is variable sized */ + unsigned int num_init_entries; + CGEN_INSN_LIST *new_entries; +} CGEN_INSN_TABLE; + +/* Return number of instructions. This includes any added at run-time. */ + +extern int cgen_insn_count (CGEN_CPU_DESC); +extern int cgen_macro_insn_count (CGEN_CPU_DESC); + +/* Macros to access the other insn elements not recorded in CGEN_IBASE. */ + +/* Fetch INSN's operand instance table. */ +/* ??? Doesn't handle insns added at runtime. */ +#define CGEN_INSN_OPERANDS(insn) ((insn)->opinst) + +/* Return INSN's opcode table entry. */ +#define CGEN_INSN_OPCODE(insn) ((insn)->opcode) + +/* Return INSN's handler data. */ +#define CGEN_INSN_HANDLERS(insn) CGEN_OPCODE_HANDLERS (CGEN_INSN_OPCODE (insn)) + +/* Return INSN's syntax. */ +#define CGEN_INSN_SYNTAX(insn) CGEN_OPCODE_SYNTAX (CGEN_INSN_OPCODE (insn)) + +/* Return size of base mask in bits. */ +#define CGEN_INSN_MASK_BITSIZE(insn) \ + CGEN_OPCODE_MASK_BITSIZE (CGEN_INSN_OPCODE (insn)) + +/* Return mask of base part of INSN. */ +#define CGEN_INSN_BASE_MASK(insn) \ + CGEN_OPCODE_BASE_MASK (CGEN_INSN_OPCODE (insn)) + +/* Return value of base part of INSN. */ +#define CGEN_INSN_BASE_VALUE(insn) \ + CGEN_OPCODE_BASE_VALUE (CGEN_INSN_OPCODE (insn)) + +/* Standard way to test whether INSN is supported by MACH. + MACH is one of enum mach_attr. + The "|1" is because the base mach is always selected. */ +#define CGEN_INSN_MACH_HAS_P(insn, mach) \ +((CGEN_INSN_ATTR_VALUE ((insn), CGEN_INSN_MACH) & ((1 << (mach)) | 1)) != 0) + +/* Macro instructions. + Macro insns aren't real insns, they map to one or more real insns. + E.g. An architecture's "nop" insn may actually be an "mv r0,r0" or + some such. + + Macro insns can expand to nothing (e.g. a nop that is optimized away). + This is useful in multi-insn macros that build a constant in a register. + Of course this isn't the default behaviour and must be explicitly enabled. + + Assembly of macro-insns is relatively straightforward. Disassembly isn't. + However, disassembly of at least some kinds of macro insns is important + in order that the disassembled code preserve the readability of the original + insn. What is attempted here is to disassemble all "simple" macro-insns, + where "simple" is currently defined to mean "expands to one real insn". + + Simple macro-insns are handled specially. They are emitted as ALIAS's + of real insns. This simplifies their handling since there's usually more + of them than any other kind of macro-insn, and proper disassembly of them + falls out for free. */ + +/* For each macro-insn there may be multiple expansion possibilities, + depending on the arguments. This structure is accessed via the `data' + member of CGEN_INSN. */ + +typedef struct cgen_minsn_expansion { + /* Function to do the expansion. + If the expansion fails (e.g. "no match") NULL is returned. + Space for the expansion is obtained with malloc. + It is up to the caller to free it. */ + const char * (* fn) + (const struct cgen_minsn_expansion *, + const char *, const char **, int *, + CGEN_OPERAND **); +#define CGEN_MIEXPN_FN(ex) ((ex)->fn) + + /* Instruction(s) the macro expands to. + The format of STR is defined by FN. + It is typically the assembly code of the real insn, but it could also be + the original Scheme expression or a tokenized form of it (with FN being + an appropriate interpreter). */ + const char * str; +#define CGEN_MIEXPN_STR(ex) ((ex)->str) +} CGEN_MINSN_EXPANSION; + +/* Normal expander. + When supported, this function will convert the input string to another + string and the parser will be invoked recursively. The output string + may contain further macro invocations. */ + +extern const char * cgen_expand_macro_insn + (CGEN_CPU_DESC, const struct cgen_minsn_expansion *, + const char *, const char **, int *, CGEN_OPERAND **); + +/* The assembler insn table is hashed based on some function of the mnemonic + (the actually hashing done is up to the target, but we provide a few + examples like the first letter or a function of the entire mnemonic). */ + +extern CGEN_INSN_LIST * cgen_asm_lookup_insn + (CGEN_CPU_DESC, const char *); +#define CGEN_ASM_LOOKUP_INSN(cd, string) cgen_asm_lookup_insn ((cd), (string)) +#define CGEN_ASM_NEXT_INSN(insn) ((insn)->next) + +/* The disassembler insn table is hashed based on some function of machine + instruction (the actually hashing done is up to the target). */ + +extern CGEN_INSN_LIST * cgen_dis_lookup_insn + (CGEN_CPU_DESC, const char *, CGEN_INSN_INT); +/* FIXME: delete these two */ +#define CGEN_DIS_LOOKUP_INSN(cd, buf, value) cgen_dis_lookup_insn ((cd), (buf), (value)) +#define CGEN_DIS_NEXT_INSN(insn) ((insn)->next) + +/* The CPU description. + A copy of this is created when the cpu table is "opened". + All global state information is recorded here. + Access macros are provided for "public" members. */ + +typedef struct cgen_cpu_desc +{ + /* Bitmap of selected machine(s) (a la BFD machine number). */ + int machs; + + /* Bitmap of selected isa(s). */ + CGEN_BITSET *isas; +#define CGEN_CPU_ISAS(cd) ((cd)->isas) + + /* Current endian. */ + enum cgen_endian endian; +#define CGEN_CPU_ENDIAN(cd) ((cd)->endian) + + /* Current insn endian. */ + enum cgen_endian insn_endian; +#define CGEN_CPU_INSN_ENDIAN(cd) ((cd)->insn_endian) + + /* Word size (in bits). */ + /* ??? Or maybe maximum word size - might we ever need to allow a cpu table + to be opened for both sparc32/sparc64? + ??? Another alternative is to create a table of selected machs and + lazily fetch the data from there. */ + unsigned int word_bitsize; + + /* Instruction chunk size (in bits), for purposes of endianness + conversion. */ + unsigned int insn_chunk_bitsize; + + /* Indicator if sizes are unknown. + This is used by default_insn_bitsize,base_insn_bitsize if there is a + difference between the selected isa's. */ +#define CGEN_SIZE_UNKNOWN 65535 + + /* Default instruction size (in bits). + This is used by the assembler when it encounters an unknown insn. */ + unsigned int default_insn_bitsize; + + /* Base instruction size (in bits). + For non-LIW cpus this is generally the length of the smallest insn. + For LIW cpus its wip (work-in-progress). For the m32r its 32. */ + unsigned int base_insn_bitsize; + + /* Minimum/maximum instruction size (in bits). */ + unsigned int min_insn_bitsize; + unsigned int max_insn_bitsize; + + /* Instruction set variants. */ + const CGEN_ISA *isa_table; + + /* Machine variants. */ + const CGEN_MACH *mach_table; + + /* Hardware elements. */ + CGEN_HW_TABLE hw_table; + + /* Instruction fields. */ + const CGEN_IFLD *ifld_table; + + /* Operands. */ + CGEN_OPERAND_TABLE operand_table; + + /* Main instruction table. */ + CGEN_INSN_TABLE insn_table; +#define CGEN_CPU_INSN_TABLE(cd) (& (cd)->insn_table) + + /* Macro instructions are defined separately and are combined with real + insns during hash table computation. */ + CGEN_INSN_TABLE macro_insn_table; + + /* Copy of CGEN_INT_INSN_P. */ + int int_insn_p; + + /* Called to rebuild the tables after something has changed. */ + void (*rebuild_tables) (CGEN_CPU_DESC); + + /* Operand parser callback. */ + cgen_parse_operand_fn * parse_operand_fn; + + /* Parse/insert/extract/print cover fns for operands. */ + const char * (*parse_operand) + (CGEN_CPU_DESC, int opindex_, const char **, CGEN_FIELDS *fields_); +#ifdef __BFD_H_SEEN__ + const char * (*insert_operand) + (CGEN_CPU_DESC, int opindex_, CGEN_FIELDS *fields_, + CGEN_INSN_BYTES_PTR, bfd_vma pc_); + int (*extract_operand) + (CGEN_CPU_DESC, int opindex_, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, + CGEN_FIELDS *fields_, bfd_vma pc_); + void (*print_operand) + (CGEN_CPU_DESC, int opindex_, void * info_, CGEN_FIELDS * fields_, + void const *attrs_, bfd_vma pc_, int length_); +#else + const char * (*insert_operand) (); + int (*extract_operand) (); + void (*print_operand) (); +#endif +#define CGEN_CPU_PARSE_OPERAND(cd) ((cd)->parse_operand) +#define CGEN_CPU_INSERT_OPERAND(cd) ((cd)->insert_operand) +#define CGEN_CPU_EXTRACT_OPERAND(cd) ((cd)->extract_operand) +#define CGEN_CPU_PRINT_OPERAND(cd) ((cd)->print_operand) + + /* Size of CGEN_FIELDS struct. */ + unsigned int sizeof_fields; +#define CGEN_CPU_SIZEOF_FIELDS(cd) ((cd)->sizeof_fields) + + /* Set the bitsize field. */ + void (*set_fields_bitsize) (CGEN_FIELDS *fields_, int size_); +#define CGEN_CPU_SET_FIELDS_BITSIZE(cd) ((cd)->set_fields_bitsize) + + /* CGEN_FIELDS accessors. */ + int (*get_int_operand) + (CGEN_CPU_DESC, int opindex_, const CGEN_FIELDS *fields_); + void (*set_int_operand) + (CGEN_CPU_DESC, int opindex_, CGEN_FIELDS *fields_, int value_); +#ifdef __BFD_H_SEEN__ + bfd_vma (*get_vma_operand) + (CGEN_CPU_DESC, int opindex_, const CGEN_FIELDS *fields_); + void (*set_vma_operand) + (CGEN_CPU_DESC, int opindex_, CGEN_FIELDS *fields_, bfd_vma value_); +#else + long (*get_vma_operand) (); + void (*set_vma_operand) (); +#endif +#define CGEN_CPU_GET_INT_OPERAND(cd) ((cd)->get_int_operand) +#define CGEN_CPU_SET_INT_OPERAND(cd) ((cd)->set_int_operand) +#define CGEN_CPU_GET_VMA_OPERAND(cd) ((cd)->get_vma_operand) +#define CGEN_CPU_SET_VMA_OPERAND(cd) ((cd)->set_vma_operand) + + /* Instruction parse/insert/extract/print handlers. */ + /* FIXME: make these types uppercase. */ + cgen_parse_fn * const *parse_handlers; + cgen_insert_fn * const *insert_handlers; + cgen_extract_fn * const *extract_handlers; + cgen_print_fn * const *print_handlers; +#define CGEN_PARSE_FN(cd, insn) (cd->parse_handlers[(insn)->opcode->handlers.parse]) +#define CGEN_INSERT_FN(cd, insn) (cd->insert_handlers[(insn)->opcode->handlers.insert]) +#define CGEN_EXTRACT_FN(cd, insn) (cd->extract_handlers[(insn)->opcode->handlers.extract]) +#define CGEN_PRINT_FN(cd, insn) (cd->print_handlers[(insn)->opcode->handlers.print]) + + /* Return non-zero if insn should be added to hash table. */ + int (* asm_hash_p) (const CGEN_INSN *); + + /* Assembler hash function. */ + unsigned int (* asm_hash) (const char *); + + /* Number of entries in assembler hash table. */ + unsigned int asm_hash_size; + + /* Return non-zero if insn should be added to hash table. */ + int (* dis_hash_p) (const CGEN_INSN *); + + /* Disassembler hash function. */ + unsigned int (* dis_hash) (const char *, CGEN_INSN_INT); + + /* Number of entries in disassembler hash table. */ + unsigned int dis_hash_size; + + /* Assembler instruction hash table. */ + CGEN_INSN_LIST **asm_hash_table; + CGEN_INSN_LIST *asm_hash_table_entries; + + /* Disassembler instruction hash table. */ + CGEN_INSN_LIST **dis_hash_table; + CGEN_INSN_LIST *dis_hash_table_entries; + + /* This field could be turned into a bitfield if room for other flags is needed. */ + unsigned int signed_overflow_ok_p; + +} CGEN_CPU_TABLE; + +/* wip */ +#ifndef CGEN_WORD_ENDIAN +#define CGEN_WORD_ENDIAN(cd) CGEN_CPU_ENDIAN (cd) +#endif +#ifndef CGEN_INSN_WORD_ENDIAN +#define CGEN_INSN_WORD_ENDIAN(cd) CGEN_CPU_INSN_ENDIAN (cd) +#endif + +/* Prototypes of major functions. */ +/* FIXME: Move more CGEN_SYM-defined functions into CGEN_CPU_DESC. + Not the init fns though, as that would drag in things that mightn't be + used and might not even exist. */ + +/* Argument types to cpu_open. */ + +enum cgen_cpu_open_arg { + CGEN_CPU_OPEN_END, + /* Select instruction set(s), arg is bitmap or 0 meaning "unspecified". */ + CGEN_CPU_OPEN_ISAS, + /* Select machine(s), arg is bitmap or 0 meaning "unspecified". */ + CGEN_CPU_OPEN_MACHS, + /* Select machine, arg is mach's bfd name. + Multiple machines can be specified by repeated use. */ + CGEN_CPU_OPEN_BFDMACH, + /* Select endian, arg is CGEN_ENDIAN_*. */ + CGEN_CPU_OPEN_ENDIAN +}; + +/* Open a cpu descriptor table for use. + ??? We only support ISO C stdargs here, not K&R. + Laziness, plus experiment to see if anything requires K&R - eventually + K&R will no longer be supported - e.g. GDB is currently trying this. */ + +extern CGEN_CPU_DESC CGEN_SYM (cpu_open) (enum cgen_cpu_open_arg, ...); + +/* Cover fn to handle simple case. */ + +extern CGEN_CPU_DESC CGEN_SYM (cpu_open_1) + (const char *mach_name_, enum cgen_endian endian_); + +/* Close it. */ + +extern void CGEN_SYM (cpu_close) (CGEN_CPU_DESC); + +/* Initialize the opcode table for use. + Called by init_asm/init_dis. */ + +extern void CGEN_SYM (init_opcode_table) (CGEN_CPU_DESC cd_); + +/* build the insn selection regex. + called by init_opcode_table */ + +extern char * CGEN_SYM(build_insn_regex) (CGEN_INSN *insn_); + +/* Initialize the ibld table for use. + Called by init_asm/init_dis. */ + +extern void CGEN_SYM (init_ibld_table) (CGEN_CPU_DESC cd_); + +/* Initialize an cpu table for assembler or disassembler use. + These must be called immediately after cpu_open. */ + +extern void CGEN_SYM (init_asm) (CGEN_CPU_DESC); +extern void CGEN_SYM (init_dis) (CGEN_CPU_DESC); + +/* Initialize the operand instance table for use. */ + +extern void CGEN_SYM (init_opinst_table) (CGEN_CPU_DESC cd_); + +/* Assemble an instruction. */ + +extern const CGEN_INSN * CGEN_SYM (assemble_insn) + (CGEN_CPU_DESC, const char *, CGEN_FIELDS *, + CGEN_INSN_BYTES_PTR, char **); + +extern const CGEN_KEYWORD CGEN_SYM (operand_mach); +extern int CGEN_SYM (get_mach) (const char *); + +/* Operand index computation. */ +extern const CGEN_INSN * cgen_lookup_insn + (CGEN_CPU_DESC, const CGEN_INSN * insn_, + CGEN_INSN_INT int_value_, unsigned char *bytes_value_, + int length_, CGEN_FIELDS *fields_, int alias_p_); +extern void cgen_get_insn_operands + (CGEN_CPU_DESC, const CGEN_INSN * insn_, + const CGEN_FIELDS *fields_, int *indices_); +extern const CGEN_INSN * cgen_lookup_get_insn_operands + (CGEN_CPU_DESC, const CGEN_INSN *insn_, + CGEN_INSN_INT int_value_, unsigned char *bytes_value_, + int length_, int *indices_, CGEN_FIELDS *fields_); + +/* Cover fns to bfd_get/set. */ + +extern CGEN_INSN_INT cgen_get_insn_value + (CGEN_CPU_DESC, unsigned char *, int); +extern void cgen_put_insn_value + (CGEN_CPU_DESC, unsigned char *, int, CGEN_INSN_INT); + +/* Read in a cpu description file. + ??? For future concerns, including adding instructions to the assembler/ + disassembler at run-time. */ + +extern const char * cgen_read_cpu_file (CGEN_CPU_DESC, const char * filename_); + +/* Allow signed overflow of instruction fields. */ +extern void cgen_set_signed_overflow_ok (CGEN_CPU_DESC); + +/* Generate an error message if a signed field in an instruction overflows. */ +extern void cgen_clear_signed_overflow_ok (CGEN_CPU_DESC); + +/* Will an error message be generated if a signed field in an instruction overflows ? */ +extern unsigned int cgen_signed_overflow_ok_p (CGEN_CPU_DESC); + +#endif /* OPCODE_CGEN_H */ diff --git a/include/opcode/convex.h b/include/opcode/convex.h new file mode 100644 index 0000000..4643f5e --- /dev/null +++ b/include/opcode/convex.h @@ -0,0 +1,1708 @@ +/* Information for instruction disassembly on the Convex. + Copyright 1989, 1993, 2002, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define xxx 0 +#define rrr 1 +#define rr 2 +#define rxr 3 +#define r 4 +#define nops 5 +#define nr 6 +#define pcrel 7 +#define lr 8 +#define rxl 9 +#define rlr 10 +#define rrl 11 +#define iml 12 +#define imr 13 +#define a1r 14 +#define a1l 15 +#define a2r 16 +#define a2l 17 +#define a3 18 +#define a4 19 +#define a5 20 +#define V 1 +#define S 2 +#define VM 3 +#define A 4 +#define VL 5 +#define VS 6 +#define VLS 7 +#define PSW 8 +/* Prevent an error during "make depend". */ +#if !defined (PC) +#define PC 9 +#endif +#define ITR 10 +#define VV 11 +#define ITSR 12 +#define TOC 13 +#define CIR 14 +#define TTR 15 +#define VMU 16 +#define VML 17 +#define ICR 18 +#define TCPU 19 +#define CPUID 20 +#define TID 21 + +const char *op[] = { + "", + "v0\0v1\0v2\0v3\0v4\0v5\0v6\0v7", + "s0\0s1\0s2\0s3\0s4\0s5\0s6\0s7", + "vm", + "sp\0a1\0a2\0a3\0a4\0a5\0ap\0fp", + "vl", + "vs", + "vls", + "psw", + "pc", + "itr", + "vv", + "itsr", + "toc", + "cir", + "ttr", + "vmu", + "vml", + "icr", + "tcpu", + "cpuid", + "tid", +}; + +const struct formstr format0[] = { + {0,0,rrr,V,S,S}, /* mov */ + {0,0,rrr,S,S,V}, /* mov */ + {1,1,rrr,V,V,V}, /* merg.t */ + {2,1,rrr,V,V,V}, /* mask.t */ + {1,2,rrr,V,S,V}, /* merg.f */ + {2,2,rrr,V,S,V}, /* mask.f */ + {1,1,rrr,V,S,V}, /* merg.t */ + {2,1,rrr,V,S,V}, /* mask.t */ + {3,3,rrr,V,V,V}, /* mul.s */ + {3,4,rrr,V,V,V}, /* mul.d */ + {4,3,rrr,V,V,V}, /* div.s */ + {4,4,rrr,V,V,V}, /* div.d */ + {3,3,rrr,V,S,V}, /* mul.s */ + {3,4,rrr,V,S,V}, /* mul.d */ + {4,3,rrr,V,S,V}, /* div.s */ + {4,4,rrr,V,S,V}, /* div.d */ + {5,0,rrr,V,V,V}, /* and */ + {6,0,rrr,V,V,V}, /* or */ + {7,0,rrr,V,V,V}, /* xor */ + {8,0,rrr,V,V,V}, /* shf */ + {5,0,rrr,V,S,V}, /* and */ + {6,0,rrr,V,S,V}, /* or */ + {7,0,rrr,V,S,V}, /* xor */ + {8,0,rrr,V,S,V}, /* shf */ + {9,3,rrr,V,V,V}, /* add.s */ + {9,4,rrr,V,V,V}, /* add.d */ + {10,3,rrr,V,V,V}, /* sub.s */ + {10,4,rrr,V,V,V}, /* sub.d */ + {9,3,rrr,V,S,V}, /* add.s */ + {9,4,rrr,V,S,V}, /* add.d */ + {10,3,rrr,V,S,V}, /* sub.s */ + {10,4,rrr,V,S,V}, /* sub.d */ + {9,5,rrr,V,V,V}, /* add.b */ + {9,6,rrr,V,V,V}, /* add.h */ + {9,7,rrr,V,V,V}, /* add.w */ + {9,8,rrr,V,V,V}, /* add.l */ + {9,5,rrr,V,S,V}, /* add.b */ + {9,6,rrr,V,S,V}, /* add.h */ + {9,7,rrr,V,S,V}, /* add.w */ + {9,8,rrr,V,S,V}, /* add.l */ + {10,5,rrr,V,V,V}, /* sub.b */ + {10,6,rrr,V,V,V}, /* sub.h */ + {10,7,rrr,V,V,V}, /* sub.w */ + {10,8,rrr,V,V,V}, /* sub.l */ + {10,5,rrr,V,S,V}, /* sub.b */ + {10,6,rrr,V,S,V}, /* sub.h */ + {10,7,rrr,V,S,V}, /* sub.w */ + {10,8,rrr,V,S,V}, /* sub.l */ + {3,5,rrr,V,V,V}, /* mul.b */ + {3,6,rrr,V,V,V}, /* mul.h */ + {3,7,rrr,V,V,V}, /* mul.w */ + {3,8,rrr,V,V,V}, /* mul.l */ + {3,5,rrr,V,S,V}, /* mul.b */ + {3,6,rrr,V,S,V}, /* mul.h */ + {3,7,rrr,V,S,V}, /* mul.w */ + {3,8,rrr,V,S,V}, /* mul.l */ + {4,5,rrr,V,V,V}, /* div.b */ + {4,6,rrr,V,V,V}, /* div.h */ + {4,7,rrr,V,V,V}, /* div.w */ + {4,8,rrr,V,V,V}, /* div.l */ + {4,5,rrr,V,S,V}, /* div.b */ + {4,6,rrr,V,S,V}, /* div.h */ + {4,7,rrr,V,S,V}, /* div.w */ + {4,8,rrr,V,S,V}, /* div.l */ +}; + +const struct formstr format1[] = { + {11,0,xxx,0,0,0}, /* exit */ + {12,0,a3,0,0,0}, /* jmp */ + {13,2,a3,0,0,0}, /* jmpi.f */ + {13,1,a3,0,0,0}, /* jmpi.t */ + {14,2,a3,0,0,0}, /* jmpa.f */ + {14,1,a3,0,0,0}, /* jmpa.t */ + {15,2,a3,0,0,0}, /* jmps.f */ + {15,1,a3,0,0,0}, /* jmps.t */ + {16,0,a3,0,0,0}, /* tac */ + {17,0,a1r,A,0,0}, /* ldea */ + {18,8,a1l,VLS,0,0}, /* ld.l */ + {18,9,a1l,VM,0,0}, /* ld.x */ + {19,0,a3,0,0,0}, /* tas */ + {20,0,a3,0,0,0}, /* pshea */ + {21,8,a2l,VLS,0,0}, /* st.l */ + {21,9,a2l,VM,0,0}, /* st.x */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {22,0,a3,0,0,0}, /* call */ + {23,0,a3,0,0,0}, /* calls */ + {24,0,a3,0,0,0}, /* callq */ + {25,0,a1r,A,0,0}, /* pfork */ + {26,5,a2r,S,0,0}, /* ste.b */ + {26,6,a2r,S,0,0}, /* ste.h */ + {26,7,a2r,S,0,0}, /* ste.w */ + {26,8,a2r,S,0,0}, /* ste.l */ + {18,5,a1r,A,0,0}, /* ld.b */ + {18,6,a1r,A,0,0}, /* ld.h */ + {18,7,a1r,A,0,0}, /* ld.w */ + {27,7,a1r,A,0,0}, /* incr.w */ + {21,5,a2r,A,0,0}, /* st.b */ + {21,6,a2r,A,0,0}, /* st.h */ + {21,7,a2r,A,0,0}, /* st.w */ + {27,8,a1r,S,0,0}, /* incr.l */ + {18,5,a1r,S,0,0}, /* ld.b */ + {18,6,a1r,S,0,0}, /* ld.h */ + {18,7,a1r,S,0,0}, /* ld.w */ + {18,8,a1r,S,0,0}, /* ld.l */ + {21,5,a2r,S,0,0}, /* st.b */ + {21,6,a2r,S,0,0}, /* st.h */ + {21,7,a2r,S,0,0}, /* st.w */ + {21,8,a2r,S,0,0}, /* st.l */ + {18,5,a1r,V,0,0}, /* ld.b */ + {18,6,a1r,V,0,0}, /* ld.h */ + {18,7,a1r,V,0,0}, /* ld.w */ + {18,8,a1r,V,0,0}, /* ld.l */ + {21,5,a2r,V,0,0}, /* st.b */ + {21,6,a2r,V,0,0}, /* st.h */ + {21,7,a2r,V,0,0}, /* st.w */ + {21,8,a2r,V,0,0}, /* st.l */ +}; + +const struct formstr format2[] = { + {28,5,rr,A,A,0}, /* cvtw.b */ + {28,6,rr,A,A,0}, /* cvtw.h */ + {29,7,rr,A,A,0}, /* cvtb.w */ + {30,7,rr,A,A,0}, /* cvth.w */ + {28,5,rr,S,S,0}, /* cvtw.b */ + {28,6,rr,S,S,0}, /* cvtw.h */ + {29,7,rr,S,S,0}, /* cvtb.w */ + {30,7,rr,S,S,0}, /* cvth.w */ + {28,3,rr,S,S,0}, /* cvtw.s */ + {31,7,rr,S,S,0}, /* cvts.w */ + {32,3,rr,S,S,0}, /* cvtd.s */ + {31,4,rr,S,S,0}, /* cvts.d */ + {31,8,rr,S,S,0}, /* cvts.l */ + {32,8,rr,S,S,0}, /* cvtd.l */ + {33,3,rr,S,S,0}, /* cvtl.s */ + {33,4,rr,S,S,0}, /* cvtl.d */ + {34,0,rr,A,A,0}, /* ldpa */ + {8,0,nr,A,0,0}, /* shf */ + {18,6,nr,A,0,0}, /* ld.h */ + {18,7,nr,A,0,0}, /* ld.w */ + {33,7,rr,S,S,0}, /* cvtl.w */ + {28,8,rr,S,S,0}, /* cvtw.l */ + {35,1,rr,S,S,0}, /* plc.t */ + {36,0,rr,S,S,0}, /* tzc */ + {37,6,rr,A,A,0}, /* eq.h */ + {37,7,rr,A,A,0}, /* eq.w */ + {37,6,nr,A,0,0}, /* eq.h */ + {37,7,nr,A,0,0}, /* eq.w */ + {37,5,rr,S,S,0}, /* eq.b */ + {37,6,rr,S,S,0}, /* eq.h */ + {37,7,rr,S,S,0}, /* eq.w */ + {37,8,rr,S,S,0}, /* eq.l */ + {38,6,rr,A,A,0}, /* leu.h */ + {38,7,rr,A,A,0}, /* leu.w */ + {38,6,nr,A,0,0}, /* leu.h */ + {38,7,nr,A,0,0}, /* leu.w */ + {38,5,rr,S,S,0}, /* leu.b */ + {38,6,rr,S,S,0}, /* leu.h */ + {38,7,rr,S,S,0}, /* leu.w */ + {38,8,rr,S,S,0}, /* leu.l */ + {39,6,rr,A,A,0}, /* ltu.h */ + {39,7,rr,A,A,0}, /* ltu.w */ + {39,6,nr,A,0,0}, /* ltu.h */ + {39,7,nr,A,0,0}, /* ltu.w */ + {39,5,rr,S,S,0}, /* ltu.b */ + {39,6,rr,S,S,0}, /* ltu.h */ + {39,7,rr,S,S,0}, /* ltu.w */ + {39,8,rr,S,S,0}, /* ltu.l */ + {40,6,rr,A,A,0}, /* le.h */ + {40,7,rr,A,A,0}, /* le.w */ + {40,6,nr,A,0,0}, /* le.h */ + {40,7,nr,A,0,0}, /* le.w */ + {40,5,rr,S,S,0}, /* le.b */ + {40,6,rr,S,S,0}, /* le.h */ + {40,7,rr,S,S,0}, /* le.w */ + {40,8,rr,S,S,0}, /* le.l */ + {41,6,rr,A,A,0}, /* lt.h */ + {41,7,rr,A,A,0}, /* lt.w */ + {41,6,nr,A,0,0}, /* lt.h */ + {41,7,nr,A,0,0}, /* lt.w */ + {41,5,rr,S,S,0}, /* lt.b */ + {41,6,rr,S,S,0}, /* lt.h */ + {41,7,rr,S,S,0}, /* lt.w */ + {41,8,rr,S,S,0}, /* lt.l */ + {9,7,rr,S,A,0}, /* add.w */ + {8,0,rr,A,A,0}, /* shf */ + {0,0,rr,A,A,0}, /* mov */ + {0,0,rr,S,A,0}, /* mov */ + {0,7,rr,S,S,0}, /* mov.w */ + {8,0,rr,S,S,0}, /* shf */ + {0,0,rr,S,S,0}, /* mov */ + {0,0,rr,A,S,0}, /* mov */ + {5,0,rr,A,A,0}, /* and */ + {6,0,rr,A,A,0}, /* or */ + {7,0,rr,A,A,0}, /* xor */ + {42,0,rr,A,A,0}, /* not */ + {5,0,rr,S,S,0}, /* and */ + {6,0,rr,S,S,0}, /* or */ + {7,0,rr,S,S,0}, /* xor */ + {42,0,rr,S,S,0}, /* not */ + {40,3,rr,S,S,0}, /* le.s */ + {40,4,rr,S,S,0}, /* le.d */ + {41,3,rr,S,S,0}, /* lt.s */ + {41,4,rr,S,S,0}, /* lt.d */ + {9,3,rr,S,S,0}, /* add.s */ + {9,4,rr,S,S,0}, /* add.d */ + {10,3,rr,S,S,0}, /* sub.s */ + {10,4,rr,S,S,0}, /* sub.d */ + {37,3,rr,S,S,0}, /* eq.s */ + {37,4,rr,S,S,0}, /* eq.d */ + {43,6,rr,A,A,0}, /* neg.h */ + {43,7,rr,A,A,0}, /* neg.w */ + {3,3,rr,S,S,0}, /* mul.s */ + {3,4,rr,S,S,0}, /* mul.d */ + {4,3,rr,S,S,0}, /* div.s */ + {4,4,rr,S,S,0}, /* div.d */ + {9,6,rr,A,A,0}, /* add.h */ + {9,7,rr,A,A,0}, /* add.w */ + {9,6,nr,A,0,0}, /* add.h */ + {9,7,nr,A,0,0}, /* add.w */ + {9,5,rr,S,S,0}, /* add.b */ + {9,6,rr,S,S,0}, /* add.h */ + {9,7,rr,S,S,0}, /* add.w */ + {9,8,rr,S,S,0}, /* add.l */ + {10,6,rr,A,A,0}, /* sub.h */ + {10,7,rr,A,A,0}, /* sub.w */ + {10,6,nr,A,0,0}, /* sub.h */ + {10,7,nr,A,0,0}, /* sub.w */ + {10,5,rr,S,S,0}, /* sub.b */ + {10,6,rr,S,S,0}, /* sub.h */ + {10,7,rr,S,S,0}, /* sub.w */ + {10,8,rr,S,S,0}, /* sub.l */ + {3,6,rr,A,A,0}, /* mul.h */ + {3,7,rr,A,A,0}, /* mul.w */ + {3,6,nr,A,0,0}, /* mul.h */ + {3,7,nr,A,0,0}, /* mul.w */ + {3,5,rr,S,S,0}, /* mul.b */ + {3,6,rr,S,S,0}, /* mul.h */ + {3,7,rr,S,S,0}, /* mul.w */ + {3,8,rr,S,S,0}, /* mul.l */ + {4,6,rr,A,A,0}, /* div.h */ + {4,7,rr,A,A,0}, /* div.w */ + {4,6,nr,A,0,0}, /* div.h */ + {4,7,nr,A,0,0}, /* div.w */ + {4,5,rr,S,S,0}, /* div.b */ + {4,6,rr,S,S,0}, /* div.h */ + {4,7,rr,S,S,0}, /* div.w */ + {4,8,rr,S,S,0}, /* div.l */ +}; + +const struct formstr format3[] = { + {32,3,rr,V,V,0}, /* cvtd.s */ + {31,4,rr,V,V,0}, /* cvts.d */ + {33,4,rr,V,V,0}, /* cvtl.d */ + {32,8,rr,V,V,0}, /* cvtd.l */ + {0,0,rrl,S,S,VM}, /* mov */ + {0,0,rlr,S,VM,S}, /* mov */ + {0,0,0,0,0,0}, + {44,0,rr,S,S,0}, /* lop */ + {36,0,rr,V,V,0}, /* tzc */ + {44,0,rr,V,V,0}, /* lop */ + {0,0,0,0,0,0}, + {42,0,rr,V,V,0}, /* not */ + {8,0,rr,S,V,0}, /* shf */ + {35,1,rr,V,V,0}, /* plc.t */ + {45,2,rr,V,V,0}, /* cprs.f */ + {45,1,rr,V,V,0}, /* cprs.t */ + {37,3,rr,V,V,0}, /* eq.s */ + {37,4,rr,V,V,0}, /* eq.d */ + {43,3,rr,V,V,0}, /* neg.s */ + {43,4,rr,V,V,0}, /* neg.d */ + {37,3,rr,S,V,0}, /* eq.s */ + {37,4,rr,S,V,0}, /* eq.d */ + {43,3,rr,S,S,0}, /* neg.s */ + {43,4,rr,S,S,0}, /* neg.d */ + {40,3,rr,V,V,0}, /* le.s */ + {40,4,rr,V,V,0}, /* le.d */ + {41,3,rr,V,V,0}, /* lt.s */ + {41,4,rr,V,V,0}, /* lt.d */ + {40,3,rr,S,V,0}, /* le.s */ + {40,4,rr,S,V,0}, /* le.d */ + {41,3,rr,S,V,0}, /* lt.s */ + {41,4,rr,S,V,0}, /* lt.d */ + {37,5,rr,V,V,0}, /* eq.b */ + {37,6,rr,V,V,0}, /* eq.h */ + {37,7,rr,V,V,0}, /* eq.w */ + {37,8,rr,V,V,0}, /* eq.l */ + {37,5,rr,S,V,0}, /* eq.b */ + {37,6,rr,S,V,0}, /* eq.h */ + {37,7,rr,S,V,0}, /* eq.w */ + {37,8,rr,S,V,0}, /* eq.l */ + {40,5,rr,V,V,0}, /* le.b */ + {40,6,rr,V,V,0}, /* le.h */ + {40,7,rr,V,V,0}, /* le.w */ + {40,8,rr,V,V,0}, /* le.l */ + {40,5,rr,S,V,0}, /* le.b */ + {40,6,rr,S,V,0}, /* le.h */ + {40,7,rr,S,V,0}, /* le.w */ + {40,8,rr,S,V,0}, /* le.l */ + {41,5,rr,V,V,0}, /* lt.b */ + {41,6,rr,V,V,0}, /* lt.h */ + {41,7,rr,V,V,0}, /* lt.w */ + {41,8,rr,V,V,0}, /* lt.l */ + {41,5,rr,S,V,0}, /* lt.b */ + {41,6,rr,S,V,0}, /* lt.h */ + {41,7,rr,S,V,0}, /* lt.w */ + {41,8,rr,S,V,0}, /* lt.l */ + {43,5,rr,V,V,0}, /* neg.b */ + {43,6,rr,V,V,0}, /* neg.h */ + {43,7,rr,V,V,0}, /* neg.w */ + {43,8,rr,V,V,0}, /* neg.l */ + {43,5,rr,S,S,0}, /* neg.b */ + {43,6,rr,S,S,0}, /* neg.h */ + {43,7,rr,S,S,0}, /* neg.w */ + {43,8,rr,S,S,0}, /* neg.l */ +}; + +const struct formstr format4[] = { + {46,0,nops,0,0,0}, /* nop */ + {47,0,pcrel,0,0,0}, /* br */ + {48,2,pcrel,0,0,0}, /* bri.f */ + {48,1,pcrel,0,0,0}, /* bri.t */ + {49,2,pcrel,0,0,0}, /* bra.f */ + {49,1,pcrel,0,0,0}, /* bra.t */ + {50,2,pcrel,0,0,0}, /* brs.f */ + {50,1,pcrel,0,0,0}, /* brs.t */ +}; + +const struct formstr format5[] = { + {51,5,rr,V,V,0}, /* ldvi.b */ + {51,6,rr,V,V,0}, /* ldvi.h */ + {51,7,rr,V,V,0}, /* ldvi.w */ + {51,8,rr,V,V,0}, /* ldvi.l */ + {28,3,rr,V,V,0}, /* cvtw.s */ + {31,7,rr,V,V,0}, /* cvts.w */ + {28,8,rr,V,V,0}, /* cvtw.l */ + {33,7,rr,V,V,0}, /* cvtl.w */ + {52,5,rxr,V,V,0}, /* stvi.b */ + {52,6,rxr,V,V,0}, /* stvi.h */ + {52,7,rxr,V,V,0}, /* stvi.w */ + {52,8,rxr,V,V,0}, /* stvi.l */ + {52,5,rxr,S,V,0}, /* stvi.b */ + {52,6,rxr,S,V,0}, /* stvi.h */ + {52,7,rxr,S,V,0}, /* stvi.w */ + {52,8,rxr,S,V,0}, /* stvi.l */ +}; + +const struct formstr format6[] = { + {53,0,r,A,0,0}, /* ldsdr */ + {54,0,r,A,0,0}, /* ldkdr */ + {55,3,r,S,0,0}, /* ln.s */ + {55,4,r,S,0,0}, /* ln.d */ + {56,0,nops,0,0,0}, /* patu */ + {57,0,r,A,0,0}, /* pate */ + {58,0,nops,0,0,0}, /* pich */ + {59,0,nops,0,0,0}, /* plch */ + {0,0,lr,PSW,A,0}, /* mov */ + {0,0,rxl,A,PSW,0}, /* mov */ + {0,0,lr,PC,A,0}, /* mov */ + {60,0,r,S,0,0}, /* idle */ + {0,0,lr,ITR,S,0}, /* mov */ + {0,0,rxl,S,ITR,0}, /* mov */ + {0,0,0,0,0,0}, + {0,0,rxl,S,ITSR,0}, /* mov */ + {61,0,nops,0,0,0}, /* rtnq */ + {62,0,nops,0,0,0}, /* cfork */ + {63,0,nops,0,0,0}, /* rtn */ + {64,0,nops,0,0,0}, /* wfork */ + {65,0,nops,0,0,0}, /* join */ + {66,0,nops,0,0,0}, /* rtnc */ + {67,3,r,S,0,0}, /* exp.s */ + {67,4,r,S,0,0}, /* exp.d */ + {68,3,r,S,0,0}, /* sin.s */ + {68,4,r,S,0,0}, /* sin.d */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {69,3,r,S,0,0}, /* cos.s */ + {69,4,r,S,0,0}, /* cos.d */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {70,7,r,A,0,0}, /* psh.w */ + {0,0,0,0,0,0}, + {71,7,r,A,0,0}, /* pop.w */ + {0,0,0,0,0,0}, + {70,7,r,S,0,0}, /* psh.w */ + {70,8,r,S,0,0}, /* psh.l */ + {71,7,r,S,0,0}, /* pop.w */ + {71,8,r,S,0,0}, /* pop.l */ + {72,0,nops,0,0,0}, /* eni */ + {73,0,nops,0,0,0}, /* dsi */ + {74,0,nops,0,0,0}, /* bkpt */ + {75,0,nops,0,0,0}, /* msync */ + {76,0,r,S,0,0}, /* mski */ + {77,0,r,S,0,0}, /* xmti */ + {0,0,rxl,S,VV,0}, /* mov */ + {78,0,nops,0,0,0}, /* tstvv */ + {0,0,lr,VS,A,0}, /* mov */ + {0,0,rxl,A,VS,0}, /* mov */ + {0,0,lr,VL,A,0}, /* mov */ + {0,0,rxl,A,VL,0}, /* mov */ + {0,7,lr,VS,S,0}, /* mov.w */ + {0,7,rxl,S,VS,0}, /* mov.w */ + {0,7,lr,VL,S,0}, /* mov.w */ + {0,7,rxl,S,VL,0}, /* mov.w */ + {79,0,r,A,0,0}, /* diag */ + {80,0,nops,0,0,0}, /* pbkpt */ + {81,3,r,S,0,0}, /* sqrt.s */ + {81,4,r,S,0,0}, /* sqrt.d */ + {82,0,nops,0,0,0}, /* casr */ + {0,0,0,0,0,0}, + {83,3,r,S,0,0}, /* atan.s */ + {83,4,r,S,0,0}, /* atan.d */ +}; + +const struct formstr format7[] = { + {84,5,r,V,0,0}, /* sum.b */ + {84,6,r,V,0,0}, /* sum.h */ + {84,7,r,V,0,0}, /* sum.w */ + {84,8,r,V,0,0}, /* sum.l */ + {85,0,r,V,0,0}, /* all */ + {86,0,r,V,0,0}, /* any */ + {87,0,r,V,0,0}, /* parity */ + {0,0,0,0,0,0}, + {88,5,r,V,0,0}, /* max.b */ + {88,6,r,V,0,0}, /* max.h */ + {88,7,r,V,0,0}, /* max.w */ + {88,8,r,V,0,0}, /* max.l */ + {89,5,r,V,0,0}, /* min.b */ + {89,6,r,V,0,0}, /* min.h */ + {89,7,r,V,0,0}, /* min.w */ + {89,8,r,V,0,0}, /* min.l */ + {84,3,r,V,0,0}, /* sum.s */ + {84,4,r,V,0,0}, /* sum.d */ + {90,3,r,V,0,0}, /* prod.s */ + {90,4,r,V,0,0}, /* prod.d */ + {88,3,r,V,0,0}, /* max.s */ + {88,4,r,V,0,0}, /* max.d */ + {89,3,r,V,0,0}, /* min.s */ + {89,4,r,V,0,0}, /* min.d */ + {90,5,r,V,0,0}, /* prod.b */ + {90,6,r,V,0,0}, /* prod.h */ + {90,7,r,V,0,0}, /* prod.w */ + {90,8,r,V,0,0}, /* prod.l */ + {35,2,lr,VM,S,0}, /* plc.f */ + {35,1,lr,VM,S,0}, /* plc.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr formatx[] = { + {0,0,0,0,0,0}, +}; + +const struct formstr format1a[] = { + {91,0,imr,A,0,0}, /* halt */ + {92,0,a4,0,0,0}, /* sysc */ + {18,6,imr,A,0,0}, /* ld.h */ + {18,7,imr,A,0,0}, /* ld.w */ + {5,0,imr,A,0,0}, /* and */ + {6,0,imr,A,0,0}, /* or */ + {7,0,imr,A,0,0}, /* xor */ + {8,0,imr,A,0,0}, /* shf */ + {9,6,imr,A,0,0}, /* add.h */ + {9,7,imr,A,0,0}, /* add.w */ + {10,6,imr,A,0,0}, /* sub.h */ + {10,7,imr,A,0,0}, /* sub.w */ + {3,6,imr,A,0,0}, /* mul.h */ + {3,7,imr,A,0,0}, /* mul.w */ + {4,6,imr,A,0,0}, /* div.h */ + {4,7,imr,A,0,0}, /* div.w */ + {18,7,iml,VL,0,0}, /* ld.w */ + {18,7,iml,VS,0,0}, /* ld.w */ + {0,0,0,0,0,0}, + {8,7,imr,S,0,0}, /* shf.w */ + {93,0,a5,0,0,0}, /* trap */ + {0,0,0,0,0,0}, + {37,6,imr,A,0,0}, /* eq.h */ + {37,7,imr,A,0,0}, /* eq.w */ + {38,6,imr,A,0,0}, /* leu.h */ + {38,7,imr,A,0,0}, /* leu.w */ + {39,6,imr,A,0,0}, /* ltu.h */ + {39,7,imr,A,0,0}, /* ltu.w */ + {40,6,imr,A,0,0}, /* le.h */ + {40,7,imr,A,0,0}, /* le.w */ + {41,6,imr,A,0,0}, /* lt.h */ + {41,7,imr,A,0,0}, /* lt.w */ +}; + +const struct formstr format1b[] = { + {18,4,imr,S,0,0}, /* ld.d */ + {18,10,imr,S,0,0}, /* ld.u */ + {18,8,imr,S,0,0}, /* ld.l */ + {18,7,imr,S,0,0}, /* ld.w */ + {5,0,imr,S,0,0}, /* and */ + {6,0,imr,S,0,0}, /* or */ + {7,0,imr,S,0,0}, /* xor */ + {8,0,imr,S,0,0}, /* shf */ + {9,6,imr,S,0,0}, /* add.h */ + {9,7,imr,S,0,0}, /* add.w */ + {10,6,imr,S,0,0}, /* sub.h */ + {10,7,imr,S,0,0}, /* sub.w */ + {3,6,imr,S,0,0}, /* mul.h */ + {3,7,imr,S,0,0}, /* mul.w */ + {4,6,imr,S,0,0}, /* div.h */ + {4,7,imr,S,0,0}, /* div.w */ + {9,3,imr,S,0,0}, /* add.s */ + {10,3,imr,S,0,0}, /* sub.s */ + {3,3,imr,S,0,0}, /* mul.s */ + {4,3,imr,S,0,0}, /* div.s */ + {40,3,imr,S,0,0}, /* le.s */ + {41,3,imr,S,0,0}, /* lt.s */ + {37,6,imr,S,0,0}, /* eq.h */ + {37,7,imr,S,0,0}, /* eq.w */ + {38,6,imr,S,0,0}, /* leu.h */ + {38,7,imr,S,0,0}, /* leu.w */ + {39,6,imr,S,0,0}, /* ltu.h */ + {39,7,imr,S,0,0}, /* ltu.w */ + {40,6,imr,S,0,0}, /* le.h */ + {40,7,imr,S,0,0}, /* le.w */ + {41,6,imr,S,0,0}, /* lt.h */ + {41,7,imr,S,0,0}, /* lt.w */ +}; + +const struct formstr e0_format0[] = { + {10,3,rrr,S,V,V}, /* sub.s */ + {10,4,rrr,S,V,V}, /* sub.d */ + {4,3,rrr,S,V,V}, /* div.s */ + {4,4,rrr,S,V,V}, /* div.d */ + {10,11,rrr,S,V,V}, /* sub.s.f */ + {10,12,rrr,S,V,V}, /* sub.d.f */ + {4,11,rrr,S,V,V}, /* div.s.f */ + {4,12,rrr,S,V,V}, /* div.d.f */ + {3,11,rrr,V,V,V}, /* mul.s.f */ + {3,12,rrr,V,V,V}, /* mul.d.f */ + {4,11,rrr,V,V,V}, /* div.s.f */ + {4,12,rrr,V,V,V}, /* div.d.f */ + {3,11,rrr,V,S,V}, /* mul.s.f */ + {3,12,rrr,V,S,V}, /* mul.d.f */ + {4,11,rrr,V,S,V}, /* div.s.f */ + {4,12,rrr,V,S,V}, /* div.d.f */ + {5,2,rrr,V,V,V}, /* and.f */ + {6,2,rrr,V,V,V}, /* or.f */ + {7,2,rrr,V,V,V}, /* xor.f */ + {8,2,rrr,V,V,V}, /* shf.f */ + {5,2,rrr,V,S,V}, /* and.f */ + {6,2,rrr,V,S,V}, /* or.f */ + {7,2,rrr,V,S,V}, /* xor.f */ + {8,2,rrr,V,S,V}, /* shf.f */ + {9,11,rrr,V,V,V}, /* add.s.f */ + {9,12,rrr,V,V,V}, /* add.d.f */ + {10,11,rrr,V,V,V}, /* sub.s.f */ + {10,12,rrr,V,V,V}, /* sub.d.f */ + {9,11,rrr,V,S,V}, /* add.s.f */ + {9,12,rrr,V,S,V}, /* add.d.f */ + {10,11,rrr,V,S,V}, /* sub.s.f */ + {10,12,rrr,V,S,V}, /* sub.d.f */ + {9,13,rrr,V,V,V}, /* add.b.f */ + {9,14,rrr,V,V,V}, /* add.h.f */ + {9,15,rrr,V,V,V}, /* add.w.f */ + {9,16,rrr,V,V,V}, /* add.l.f */ + {9,13,rrr,V,S,V}, /* add.b.f */ + {9,14,rrr,V,S,V}, /* add.h.f */ + {9,15,rrr,V,S,V}, /* add.w.f */ + {9,16,rrr,V,S,V}, /* add.l.f */ + {10,13,rrr,V,V,V}, /* sub.b.f */ + {10,14,rrr,V,V,V}, /* sub.h.f */ + {10,15,rrr,V,V,V}, /* sub.w.f */ + {10,16,rrr,V,V,V}, /* sub.l.f */ + {10,13,rrr,V,S,V}, /* sub.b.f */ + {10,14,rrr,V,S,V}, /* sub.h.f */ + {10,15,rrr,V,S,V}, /* sub.w.f */ + {10,16,rrr,V,S,V}, /* sub.l.f */ + {3,13,rrr,V,V,V}, /* mul.b.f */ + {3,14,rrr,V,V,V}, /* mul.h.f */ + {3,15,rrr,V,V,V}, /* mul.w.f */ + {3,16,rrr,V,V,V}, /* mul.l.f */ + {3,13,rrr,V,S,V}, /* mul.b.f */ + {3,14,rrr,V,S,V}, /* mul.h.f */ + {3,15,rrr,V,S,V}, /* mul.w.f */ + {3,16,rrr,V,S,V}, /* mul.l.f */ + {4,13,rrr,V,V,V}, /* div.b.f */ + {4,14,rrr,V,V,V}, /* div.h.f */ + {4,15,rrr,V,V,V}, /* div.w.f */ + {4,16,rrr,V,V,V}, /* div.l.f */ + {4,13,rrr,V,S,V}, /* div.b.f */ + {4,14,rrr,V,S,V}, /* div.h.f */ + {4,15,rrr,V,S,V}, /* div.w.f */ + {4,16,rrr,V,S,V}, /* div.l.f */ +}; + +const struct formstr e0_format1[] = { + {0,0,0,0,0,0}, + {94,0,a3,0,0,0}, /* tst */ + {95,0,a3,0,0,0}, /* lck */ + {96,0,a3,0,0,0}, /* ulk */ + {17,0,a1r,S,0,0}, /* ldea */ + {97,0,a1r,A,0,0}, /* spawn */ + {98,0,a1r,A,0,0}, /* ldcmr */ + {99,0,a2r,A,0,0}, /* stcmr */ + {100,0,a1r,A,0,0}, /* popr */ + {101,0,a2r,A,0,0}, /* pshr */ + {102,7,a1r,A,0,0}, /* rcvr.w */ + {103,7,a2r,A,0,0}, /* matm.w */ + {104,7,a2r,A,0,0}, /* sndr.w */ + {104,8,a2r,S,0,0}, /* sndr.l */ + {102,8,a1r,S,0,0}, /* rcvr.l */ + {103,8,a2r,S,0,0}, /* matm.l */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {105,7,a2r,A,0,0}, /* putr.w */ + {105,8,a2r,S,0,0}, /* putr.l */ + {106,7,a1r,A,0,0}, /* getr.w */ + {106,8,a1r,S,0,0}, /* getr.l */ + {26,13,a2r,S,0,0}, /* ste.b.f */ + {26,14,a2r,S,0,0}, /* ste.h.f */ + {26,15,a2r,S,0,0}, /* ste.w.f */ + {26,16,a2r,S,0,0}, /* ste.l.f */ + {107,7,a2r,A,0,0}, /* matr.w */ + {108,7,a2r,A,0,0}, /* mat.w */ + {109,7,a1r,A,0,0}, /* get.w */ + {110,7,a1r,A,0,0}, /* rcv.w */ + {0,0,0,0,0,0}, + {111,7,a1r,A,0,0}, /* inc.w */ + {112,7,a2r,A,0,0}, /* put.w */ + {113,7,a2r,A,0,0}, /* snd.w */ + {107,8,a2r,S,0,0}, /* matr.l */ + {108,8,a2r,S,0,0}, /* mat.l */ + {109,8,a1r,S,0,0}, /* get.l */ + {110,8,a1r,S,0,0}, /* rcv.l */ + {0,0,0,0,0,0}, + {111,8,a1r,S,0,0}, /* inc.l */ + {112,8,a2r,S,0,0}, /* put.l */ + {113,8,a2r,S,0,0}, /* snd.l */ + {18,13,a1r,V,0,0}, /* ld.b.f */ + {18,14,a1r,V,0,0}, /* ld.h.f */ + {18,15,a1r,V,0,0}, /* ld.w.f */ + {18,16,a1r,V,0,0}, /* ld.l.f */ + {21,13,a2r,V,0,0}, /* st.b.f */ + {21,14,a2r,V,0,0}, /* st.h.f */ + {21,15,a2r,V,0,0}, /* st.w.f */ + {21,16,a2r,V,0,0}, /* st.l.f */ +}; + +const struct formstr e0_format2[] = { + {28,5,rr,V,V,0}, /* cvtw.b */ + {28,6,rr,V,V,0}, /* cvtw.h */ + {29,7,rr,V,V,0}, /* cvtb.w */ + {30,7,rr,V,V,0}, /* cvth.w */ + {28,13,rr,V,V,0}, /* cvtw.b.f */ + {28,14,rr,V,V,0}, /* cvtw.h.f */ + {29,15,rr,V,V,0}, /* cvtb.w.f */ + {30,15,rr,V,V,0}, /* cvth.w.f */ + {31,8,rr,V,V,0}, /* cvts.l */ + {32,7,rr,V,V,0}, /* cvtd.w */ + {33,3,rr,V,V,0}, /* cvtl.s */ + {28,4,rr,V,V,0}, /* cvtw.d */ + {31,16,rr,V,V,0}, /* cvts.l.f */ + {32,15,rr,V,V,0}, /* cvtd.w.f */ + {33,11,rr,V,V,0}, /* cvtl.s.f */ + {28,12,rr,V,V,0}, /* cvtw.d.f */ + {114,0,rr,S,S,0}, /* enal */ + {8,7,rr,S,S,0}, /* shf.w */ + {115,0,rr,S,S,0}, /* enag */ + {0,0,0,0,0,0}, + {28,4,rr,S,S,0}, /* cvtw.d */ + {32,7,rr,S,S,0}, /* cvtd.w */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {116,3,rr,S,S,0}, /* frint.s */ + {116,4,rr,S,S,0}, /* frint.d */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {116,3,rr,V,V,0}, /* frint.s */ + {116,4,rr,V,V,0}, /* frint.d */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {116,11,rr,V,V,0}, /* frint.s.f */ + {116,12,rr,V,V,0}, /* frint.d.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {81,3,rr,V,V,0}, /* sqrt.s */ + {81,4,rr,V,V,0}, /* sqrt.d */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {81,11,rr,V,V,0}, /* sqrt.s.f */ + {81,12,rr,V,V,0}, /* sqrt.d.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e0_format3[] = { + {32,11,rr,V,V,0}, /* cvtd.s.f */ + {31,12,rr,V,V,0}, /* cvts.d.f */ + {33,12,rr,V,V,0}, /* cvtl.d.f */ + {32,16,rr,V,V,0}, /* cvtd.l.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {36,2,rr,V,V,0}, /* tzc.f */ + {44,2,rr,V,V,0}, /* lop.f */ + {117,2,rr,V,V,0}, /* xpnd.f */ + {42,2,rr,V,V,0}, /* not.f */ + {8,2,rr,S,V,0}, /* shf.f */ + {35,17,rr,V,V,0}, /* plc.t.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {37,11,rr,V,V,0}, /* eq.s.f */ + {37,12,rr,V,V,0}, /* eq.d.f */ + {43,11,rr,V,V,0}, /* neg.s.f */ + {43,12,rr,V,V,0}, /* neg.d.f */ + {37,11,rr,S,V,0}, /* eq.s.f */ + {37,12,rr,S,V,0}, /* eq.d.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {40,11,rr,V,V,0}, /* le.s.f */ + {40,12,rr,V,V,0}, /* le.d.f */ + {41,11,rr,V,V,0}, /* lt.s.f */ + {41,12,rr,V,V,0}, /* lt.d.f */ + {40,11,rr,S,V,0}, /* le.s.f */ + {40,12,rr,S,V,0}, /* le.d.f */ + {41,11,rr,S,V,0}, /* lt.s.f */ + {41,12,rr,S,V,0}, /* lt.d.f */ + {37,13,rr,V,V,0}, /* eq.b.f */ + {37,14,rr,V,V,0}, /* eq.h.f */ + {37,15,rr,V,V,0}, /* eq.w.f */ + {37,16,rr,V,V,0}, /* eq.l.f */ + {37,13,rr,S,V,0}, /* eq.b.f */ + {37,14,rr,S,V,0}, /* eq.h.f */ + {37,15,rr,S,V,0}, /* eq.w.f */ + {37,16,rr,S,V,0}, /* eq.l.f */ + {40,13,rr,V,V,0}, /* le.b.f */ + {40,14,rr,V,V,0}, /* le.h.f */ + {40,15,rr,V,V,0}, /* le.w.f */ + {40,16,rr,V,V,0}, /* le.l.f */ + {40,13,rr,S,V,0}, /* le.b.f */ + {40,14,rr,S,V,0}, /* le.h.f */ + {40,15,rr,S,V,0}, /* le.w.f */ + {40,16,rr,S,V,0}, /* le.l.f */ + {41,13,rr,V,V,0}, /* lt.b.f */ + {41,14,rr,V,V,0}, /* lt.h.f */ + {41,15,rr,V,V,0}, /* lt.w.f */ + {41,16,rr,V,V,0}, /* lt.l.f */ + {41,13,rr,S,V,0}, /* lt.b.f */ + {41,14,rr,S,V,0}, /* lt.h.f */ + {41,15,rr,S,V,0}, /* lt.w.f */ + {41,16,rr,S,V,0}, /* lt.l.f */ + {43,13,rr,V,V,0}, /* neg.b.f */ + {43,14,rr,V,V,0}, /* neg.h.f */ + {43,15,rr,V,V,0}, /* neg.w.f */ + {43,16,rr,V,V,0}, /* neg.l.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e0_format4[] = { + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e0_format5[] = { + {51,13,rr,V,V,0}, /* ldvi.b.f */ + {51,14,rr,V,V,0}, /* ldvi.h.f */ + {51,15,rr,V,V,0}, /* ldvi.w.f */ + {51,16,rr,V,V,0}, /* ldvi.l.f */ + {28,11,rr,V,V,0}, /* cvtw.s.f */ + {31,15,rr,V,V,0}, /* cvts.w.f */ + {28,16,rr,V,V,0}, /* cvtw.l.f */ + {33,15,rr,V,V,0}, /* cvtl.w.f */ + {52,13,rxr,V,V,0}, /* stvi.b.f */ + {52,14,rxr,V,V,0}, /* stvi.h.f */ + {52,15,rxr,V,V,0}, /* stvi.w.f */ + {52,16,rxr,V,V,0}, /* stvi.l.f */ + {52,13,rxr,S,V,0}, /* stvi.b.f */ + {52,14,rxr,S,V,0}, /* stvi.h.f */ + {52,15,rxr,S,V,0}, /* stvi.w.f */ + {52,16,rxr,S,V,0}, /* stvi.l.f */ +}; + +const struct formstr e0_format6[] = { + {0,0,rxl,S,CIR,0}, /* mov */ + {0,0,lr,CIR,S,0}, /* mov */ + {0,0,lr,TOC,S,0}, /* mov */ + {0,0,lr,CPUID,S,0}, /* mov */ + {0,0,rxl,S,TTR,0}, /* mov */ + {0,0,lr,TTR,S,0}, /* mov */ + {118,0,nops,0,0,0}, /* ctrsl */ + {119,0,nops,0,0,0}, /* ctrsg */ + {0,0,rxl,S,VMU,0}, /* mov */ + {0,0,lr,VMU,S,0}, /* mov */ + {0,0,rxl,S,VML,0}, /* mov */ + {0,0,lr,VML,S,0}, /* mov */ + {0,0,rxl,S,ICR,0}, /* mov */ + {0,0,lr,ICR,S,0}, /* mov */ + {0,0,rxl,S,TCPU,0}, /* mov */ + {0,0,lr,TCPU,S,0}, /* mov */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {120,0,nops,0,0,0}, /* stop */ + {0,0,0,0,0,0}, + {0,0,rxl,S,TID,0}, /* mov */ + {0,0,lr,TID,S,0}, /* mov */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e0_format7[] = { + {84,13,r,V,0,0}, /* sum.b.f */ + {84,14,r,V,0,0}, /* sum.h.f */ + {84,15,r,V,0,0}, /* sum.w.f */ + {84,16,r,V,0,0}, /* sum.l.f */ + {85,2,r,V,0,0}, /* all.f */ + {86,2,r,V,0,0}, /* any.f */ + {87,2,r,V,0,0}, /* parity.f */ + {0,0,0,0,0,0}, + {88,13,r,V,0,0}, /* max.b.f */ + {88,14,r,V,0,0}, /* max.h.f */ + {88,15,r,V,0,0}, /* max.w.f */ + {88,16,r,V,0,0}, /* max.l.f */ + {89,13,r,V,0,0}, /* min.b.f */ + {89,14,r,V,0,0}, /* min.h.f */ + {89,15,r,V,0,0}, /* min.w.f */ + {89,16,r,V,0,0}, /* min.l.f */ + {84,11,r,V,0,0}, /* sum.s.f */ + {84,12,r,V,0,0}, /* sum.d.f */ + {90,11,r,V,0,0}, /* prod.s.f */ + {90,12,r,V,0,0}, /* prod.d.f */ + {88,11,r,V,0,0}, /* max.s.f */ + {88,12,r,V,0,0}, /* max.d.f */ + {89,11,r,V,0,0}, /* min.s.f */ + {89,12,r,V,0,0}, /* min.d.f */ + {90,13,r,V,0,0}, /* prod.b.f */ + {90,14,r,V,0,0}, /* prod.h.f */ + {90,15,r,V,0,0}, /* prod.w.f */ + {90,16,r,V,0,0}, /* prod.l.f */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e1_format0[] = { + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {10,18,rrr,S,V,V}, /* sub.s.t */ + {10,19,rrr,S,V,V}, /* sub.d.t */ + {4,18,rrr,S,V,V}, /* div.s.t */ + {4,19,rrr,S,V,V}, /* div.d.t */ + {3,18,rrr,V,V,V}, /* mul.s.t */ + {3,19,rrr,V,V,V}, /* mul.d.t */ + {4,18,rrr,V,V,V}, /* div.s.t */ + {4,19,rrr,V,V,V}, /* div.d.t */ + {3,18,rrr,V,S,V}, /* mul.s.t */ + {3,19,rrr,V,S,V}, /* mul.d.t */ + {4,18,rrr,V,S,V}, /* div.s.t */ + {4,19,rrr,V,S,V}, /* div.d.t */ + {5,1,rrr,V,V,V}, /* and.t */ + {6,1,rrr,V,V,V}, /* or.t */ + {7,1,rrr,V,V,V}, /* xor.t */ + {8,1,rrr,V,V,V}, /* shf.t */ + {5,1,rrr,V,S,V}, /* and.t */ + {6,1,rrr,V,S,V}, /* or.t */ + {7,1,rrr,V,S,V}, /* xor.t */ + {8,1,rrr,V,S,V}, /* shf.t */ + {9,18,rrr,V,V,V}, /* add.s.t */ + {9,19,rrr,V,V,V}, /* add.d.t */ + {10,18,rrr,V,V,V}, /* sub.s.t */ + {10,19,rrr,V,V,V}, /* sub.d.t */ + {9,18,rrr,V,S,V}, /* add.s.t */ + {9,19,rrr,V,S,V}, /* add.d.t */ + {10,18,rrr,V,S,V}, /* sub.s.t */ + {10,19,rrr,V,S,V}, /* sub.d.t */ + {9,20,rrr,V,V,V}, /* add.b.t */ + {9,21,rrr,V,V,V}, /* add.h.t */ + {9,22,rrr,V,V,V}, /* add.w.t */ + {9,23,rrr,V,V,V}, /* add.l.t */ + {9,20,rrr,V,S,V}, /* add.b.t */ + {9,21,rrr,V,S,V}, /* add.h.t */ + {9,22,rrr,V,S,V}, /* add.w.t */ + {9,23,rrr,V,S,V}, /* add.l.t */ + {10,20,rrr,V,V,V}, /* sub.b.t */ + {10,21,rrr,V,V,V}, /* sub.h.t */ + {10,22,rrr,V,V,V}, /* sub.w.t */ + {10,23,rrr,V,V,V}, /* sub.l.t */ + {10,20,rrr,V,S,V}, /* sub.b.t */ + {10,21,rrr,V,S,V}, /* sub.h.t */ + {10,22,rrr,V,S,V}, /* sub.w.t */ + {10,23,rrr,V,S,V}, /* sub.l.t */ + {3,20,rrr,V,V,V}, /* mul.b.t */ + {3,21,rrr,V,V,V}, /* mul.h.t */ + {3,22,rrr,V,V,V}, /* mul.w.t */ + {3,23,rrr,V,V,V}, /* mul.l.t */ + {3,20,rrr,V,S,V}, /* mul.b.t */ + {3,21,rrr,V,S,V}, /* mul.h.t */ + {3,22,rrr,V,S,V}, /* mul.w.t */ + {3,23,rrr,V,S,V}, /* mul.l.t */ + {4,20,rrr,V,V,V}, /* div.b.t */ + {4,21,rrr,V,V,V}, /* div.h.t */ + {4,22,rrr,V,V,V}, /* div.w.t */ + {4,23,rrr,V,V,V}, /* div.l.t */ + {4,20,rrr,V,S,V}, /* div.b.t */ + {4,21,rrr,V,S,V}, /* div.h.t */ + {4,22,rrr,V,S,V}, /* div.w.t */ + {4,23,rrr,V,S,V}, /* div.l.t */ +}; + +const struct formstr e1_format1[] = { + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {26,20,a2r,S,0,0}, /* ste.b.t */ + {26,21,a2r,S,0,0}, /* ste.h.t */ + {26,22,a2r,S,0,0}, /* ste.w.t */ + {26,23,a2r,S,0,0}, /* ste.l.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {18,20,a1r,V,0,0}, /* ld.b.t */ + {18,21,a1r,V,0,0}, /* ld.h.t */ + {18,22,a1r,V,0,0}, /* ld.w.t */ + {18,23,a1r,V,0,0}, /* ld.l.t */ + {21,20,a2r,V,0,0}, /* st.b.t */ + {21,21,a2r,V,0,0}, /* st.h.t */ + {21,22,a2r,V,0,0}, /* st.w.t */ + {21,23,a2r,V,0,0}, /* st.l.t */ +}; + +const struct formstr e1_format2[] = { + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {28,20,rr,V,V,0}, /* cvtw.b.t */ + {28,21,rr,V,V,0}, /* cvtw.h.t */ + {29,22,rr,V,V,0}, /* cvtb.w.t */ + {30,22,rr,V,V,0}, /* cvth.w.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {31,23,rr,V,V,0}, /* cvts.l.t */ + {32,22,rr,V,V,0}, /* cvtd.w.t */ + {33,18,rr,V,V,0}, /* cvtl.s.t */ + {28,19,rr,V,V,0}, /* cvtw.d.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {116,18,rr,V,V,0}, /* frint.s.t */ + {116,19,rr,V,V,0}, /* frint.d.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {81,18,rr,V,V,0}, /* sqrt.s.t */ + {81,19,rr,V,V,0}, /* sqrt.d.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e1_format3[] = { + {32,18,rr,V,V,0}, /* cvtd.s.t */ + {31,19,rr,V,V,0}, /* cvts.d.t */ + {33,19,rr,V,V,0}, /* cvtl.d.t */ + {32,23,rr,V,V,0}, /* cvtd.l.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {36,1,rr,V,V,0}, /* tzc.t */ + {44,1,rr,V,V,0}, /* lop.t */ + {117,1,rr,V,V,0}, /* xpnd.t */ + {42,1,rr,V,V,0}, /* not.t */ + {8,1,rr,S,V,0}, /* shf.t */ + {35,24,rr,V,V,0}, /* plc.t.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {37,18,rr,V,V,0}, /* eq.s.t */ + {37,19,rr,V,V,0}, /* eq.d.t */ + {43,18,rr,V,V,0}, /* neg.s.t */ + {43,19,rr,V,V,0}, /* neg.d.t */ + {37,18,rr,S,V,0}, /* eq.s.t */ + {37,19,rr,S,V,0}, /* eq.d.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {40,18,rr,V,V,0}, /* le.s.t */ + {40,19,rr,V,V,0}, /* le.d.t */ + {41,18,rr,V,V,0}, /* lt.s.t */ + {41,19,rr,V,V,0}, /* lt.d.t */ + {40,18,rr,S,V,0}, /* le.s.t */ + {40,19,rr,S,V,0}, /* le.d.t */ + {41,18,rr,S,V,0}, /* lt.s.t */ + {41,19,rr,S,V,0}, /* lt.d.t */ + {37,20,rr,V,V,0}, /* eq.b.t */ + {37,21,rr,V,V,0}, /* eq.h.t */ + {37,22,rr,V,V,0}, /* eq.w.t */ + {37,23,rr,V,V,0}, /* eq.l.t */ + {37,20,rr,S,V,0}, /* eq.b.t */ + {37,21,rr,S,V,0}, /* eq.h.t */ + {37,22,rr,S,V,0}, /* eq.w.t */ + {37,23,rr,S,V,0}, /* eq.l.t */ + {40,20,rr,V,V,0}, /* le.b.t */ + {40,21,rr,V,V,0}, /* le.h.t */ + {40,22,rr,V,V,0}, /* le.w.t */ + {40,23,rr,V,V,0}, /* le.l.t */ + {40,20,rr,S,V,0}, /* le.b.t */ + {40,21,rr,S,V,0}, /* le.h.t */ + {40,22,rr,S,V,0}, /* le.w.t */ + {40,23,rr,S,V,0}, /* le.l.t */ + {41,20,rr,V,V,0}, /* lt.b.t */ + {41,21,rr,V,V,0}, /* lt.h.t */ + {41,22,rr,V,V,0}, /* lt.w.t */ + {41,23,rr,V,V,0}, /* lt.l.t */ + {41,20,rr,S,V,0}, /* lt.b.t */ + {41,21,rr,S,V,0}, /* lt.h.t */ + {41,22,rr,S,V,0}, /* lt.w.t */ + {41,23,rr,S,V,0}, /* lt.l.t */ + {43,20,rr,V,V,0}, /* neg.b.t */ + {43,21,rr,V,V,0}, /* neg.h.t */ + {43,22,rr,V,V,0}, /* neg.w.t */ + {43,23,rr,V,V,0}, /* neg.l.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e1_format4[] = { + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e1_format5[] = { + {51,20,rr,V,V,0}, /* ldvi.b.t */ + {51,21,rr,V,V,0}, /* ldvi.h.t */ + {51,22,rr,V,V,0}, /* ldvi.w.t */ + {51,23,rr,V,V,0}, /* ldvi.l.t */ + {28,18,rr,V,V,0}, /* cvtw.s.t */ + {31,22,rr,V,V,0}, /* cvts.w.t */ + {28,23,rr,V,V,0}, /* cvtw.l.t */ + {33,22,rr,V,V,0}, /* cvtl.w.t */ + {52,20,rxr,V,V,0}, /* stvi.b.t */ + {52,21,rxr,V,V,0}, /* stvi.h.t */ + {52,22,rxr,V,V,0}, /* stvi.w.t */ + {52,23,rxr,V,V,0}, /* stvi.l.t */ + {52,20,rxr,S,V,0}, /* stvi.b.t */ + {52,21,rxr,S,V,0}, /* stvi.h.t */ + {52,22,rxr,S,V,0}, /* stvi.w.t */ + {52,23,rxr,S,V,0}, /* stvi.l.t */ +}; + +const struct formstr e1_format6[] = { + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +const struct formstr e1_format7[] = { + {84,20,r,V,0,0}, /* sum.b.t */ + {84,21,r,V,0,0}, /* sum.h.t */ + {84,22,r,V,0,0}, /* sum.w.t */ + {84,23,r,V,0,0}, /* sum.l.t */ + {85,1,r,V,0,0}, /* all.t */ + {86,1,r,V,0,0}, /* any.t */ + {87,1,r,V,0,0}, /* parity.t */ + {0,0,0,0,0,0}, + {88,20,r,V,0,0}, /* max.b.t */ + {88,21,r,V,0,0}, /* max.h.t */ + {88,22,r,V,0,0}, /* max.w.t */ + {88,23,r,V,0,0}, /* max.l.t */ + {89,20,r,V,0,0}, /* min.b.t */ + {89,21,r,V,0,0}, /* min.h.t */ + {89,22,r,V,0,0}, /* min.w.t */ + {89,23,r,V,0,0}, /* min.l.t */ + {84,18,r,V,0,0}, /* sum.s.t */ + {84,19,r,V,0,0}, /* sum.d.t */ + {90,18,r,V,0,0}, /* prod.s.t */ + {90,19,r,V,0,0}, /* prod.d.t */ + {88,18,r,V,0,0}, /* max.s.t */ + {88,19,r,V,0,0}, /* max.d.t */ + {89,18,r,V,0,0}, /* min.s.t */ + {89,19,r,V,0,0}, /* min.d.t */ + {90,20,r,V,0,0}, /* prod.b.t */ + {90,21,r,V,0,0}, /* prod.h.t */ + {90,22,r,V,0,0}, /* prod.w.t */ + {90,23,r,V,0,0}, /* prod.l.t */ + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, + {0,0,0,0,0,0}, +}; + +char *lop[] = { + "mov", /* 0 */ + "merg", /* 1 */ + "mask", /* 2 */ + "mul", /* 3 */ + "div", /* 4 */ + "and", /* 5 */ + "or", /* 6 */ + "xor", /* 7 */ + "shf", /* 8 */ + "add", /* 9 */ + "sub", /* 10 */ + "exit", /* 11 */ + "jmp", /* 12 */ + "jmpi", /* 13 */ + "jmpa", /* 14 */ + "jmps", /* 15 */ + "tac", /* 16 */ + "ldea", /* 17 */ + "ld", /* 18 */ + "tas", /* 19 */ + "pshea", /* 20 */ + "st", /* 21 */ + "call", /* 22 */ + "calls", /* 23 */ + "callq", /* 24 */ + "pfork", /* 25 */ + "ste", /* 26 */ + "incr", /* 27 */ + "cvtw", /* 28 */ + "cvtb", /* 29 */ + "cvth", /* 30 */ + "cvts", /* 31 */ + "cvtd", /* 32 */ + "cvtl", /* 33 */ + "ldpa", /* 34 */ + "plc", /* 35 */ + "tzc", /* 36 */ + "eq", /* 37 */ + "leu", /* 38 */ + "ltu", /* 39 */ + "le", /* 40 */ + "lt", /* 41 */ + "not", /* 42 */ + "neg", /* 43 */ + "lop", /* 44 */ + "cprs", /* 45 */ + "nop", /* 46 */ + "br", /* 47 */ + "bri", /* 48 */ + "bra", /* 49 */ + "brs", /* 50 */ + "ldvi", /* 51 */ + "stvi", /* 52 */ + "ldsdr", /* 53 */ + "ldkdr", /* 54 */ + "ln", /* 55 */ + "patu", /* 56 */ + "pate", /* 57 */ + "pich", /* 58 */ + "plch", /* 59 */ + "idle", /* 60 */ + "rtnq", /* 61 */ + "cfork", /* 62 */ + "rtn", /* 63 */ + "wfork", /* 64 */ + "join", /* 65 */ + "rtnc", /* 66 */ + "exp", /* 67 */ + "sin", /* 68 */ + "cos", /* 69 */ + "psh", /* 70 */ + "pop", /* 71 */ + "eni", /* 72 */ + "dsi", /* 73 */ + "bkpt", /* 74 */ + "msync", /* 75 */ + "mski", /* 76 */ + "xmti", /* 77 */ + "tstvv", /* 78 */ + "diag", /* 79 */ + "pbkpt", /* 80 */ + "sqrt", /* 81 */ + "casr", /* 82 */ + "atan", /* 83 */ + "sum", /* 84 */ + "all", /* 85 */ + "any", /* 86 */ + "parity", /* 87 */ + "max", /* 88 */ + "min", /* 89 */ + "prod", /* 90 */ + "halt", /* 91 */ + "sysc", /* 92 */ + "trap", /* 93 */ + "tst", /* 94 */ + "lck", /* 95 */ + "ulk", /* 96 */ + "spawn", /* 97 */ + "ldcmr", /* 98 */ + "stcmr", /* 99 */ + "popr", /* 100 */ + "pshr", /* 101 */ + "rcvr", /* 102 */ + "matm", /* 103 */ + "sndr", /* 104 */ + "putr", /* 105 */ + "getr", /* 106 */ + "matr", /* 107 */ + "mat", /* 108 */ + "get", /* 109 */ + "rcv", /* 110 */ + "inc", /* 111 */ + "put", /* 112 */ + "snd", /* 113 */ + "enal", /* 114 */ + "enag", /* 115 */ + "frint", /* 116 */ + "xpnd", /* 117 */ + "ctrsl", /* 118 */ + "ctrsg", /* 119 */ + "stop", /* 120 */ +}; + +char *rop[] = { + "", /* 0 */ + ".t", /* 1 */ + ".f", /* 2 */ + ".s", /* 3 */ + ".d", /* 4 */ + ".b", /* 5 */ + ".h", /* 6 */ + ".w", /* 7 */ + ".l", /* 8 */ + ".x", /* 9 */ + ".u", /* 10 */ + ".s.f", /* 11 */ + ".d.f", /* 12 */ + ".b.f", /* 13 */ + ".h.f", /* 14 */ + ".w.f", /* 15 */ + ".l.f", /* 16 */ + ".t.f", /* 17 */ + ".s.t", /* 18 */ + ".d.t", /* 19 */ + ".b.t", /* 20 */ + ".h.t", /* 21 */ + ".w.t", /* 22 */ + ".l.t", /* 23 */ + ".t.t", /* 24 */ +}; diff --git a/include/opcode/cr16.h b/include/opcode/cr16.h new file mode 100644 index 0000000..1f1191d --- /dev/null +++ b/include/opcode/cr16.h @@ -0,0 +1,451 @@ +/* cr16.h -- Header file for CR16 opcode and register tables. + Copyright 2007, 2008, 2010, 2013 Free Software Foundation, Inc. + Contributed by M R Swami Reddy + + This file is part of GAS, GDB and the GNU binutils. + + GAS, GDB, and GNU binutils 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, or (at your + option) any later version. + + GAS, GDB, and GNU binutils are distributed in the hope that they will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _CR16_H_ +#define _CR16_H_ + +/* CR16 core Registers : + The enums are used as indices to CR16 registers table (cr16_regtab). + Therefore, order MUST be preserved. */ + +typedef enum +{ + /* 16-bit general purpose registers. */ + r0, r1, r2, r3, + r4, r5, r6, r7, + r8, r9, r10, r11, + r12_L = 12, r13_L = 13, ra = 14, sp_L = 15, + + /* 32-bit general purpose registers. */ + r12 = 12, r13 = 13, r14 = 14, r15 = 15, + era = 14, sp = 15, RA, + + /* Not a register. */ + nullregister, + MAX_REG +} +reg; + +/* CR16 processor registers and special registers : + The enums are used as indices to CR16 processor registers table + (cr16_pregtab). Therefore, order MUST be preserved. */ + +typedef enum +{ + /* processor registers. */ + dbs = MAX_REG, + dsr, dcrl, dcrh, + car0l, car0h, car1l, car1h, + cfg, psr, intbasel, intbaseh, + ispl, isph, uspl, usph, + dcr = dcrl, + car0 = car0l, + car1 = car1l, + intbase = intbasel, + isp = ispl, + usp = uspl, + /* Not a processor register. */ + nullpregister = usph + 1, + MAX_PREG +} +preg; + +/* CR16 Register types. */ + +typedef enum +{ + CR16_R_REGTYPE, /* r */ + CR16_RP_REGTYPE, /* reg pair */ + CR16_P_REGTYPE /* Processor register */ +} +reg_type; + +/* CR16 argument types : + The argument types correspond to instructions operands + + Argument types : + r - register + rp - register pair + c - constant + i - immediate + idxr - index with register + idxrp - index with register pair + rbase - register base + rpbase - register pair base + pr - processor register. */ + +typedef enum +{ + arg_r, + arg_c, + arg_cr, + arg_crp, + arg_ic, + arg_icr, + arg_idxr, + arg_idxrp, + arg_rbase, + arg_rpbase, + arg_rp, + arg_pr, + arg_prp, + arg_cc, + arg_ra, + /* Not an argument. */ + nullargs +} +argtype; + +/* CR16 operand types:The operand types correspond to instructions operands. */ + +typedef enum +{ + dummy, + /* N-bit signed immediate. */ + imm3, imm4, imm5, imm6, imm16, imm20, imm32, + /* N-bit unsigned immediate. */ + uimm3, uimm3_1, uimm4, uimm4_1, uimm5, uimm16, uimm20, uimm32, + /* N-bit signed displacement. */ + disps5, disps17, disps25, + /* N-bit unsigned displacement. */ + dispe9, + /* N-bit absolute address. */ + abs20, abs24, + /* Register relative. */ + rra, rbase, rbase_disps20, rbase_dispe20, + /* Register pair relative. */ + rpbase_disps0, rpbase_dispe4, rpbase_disps4, rpbase_disps16, + rpbase_disps20, rpbase_dispe20, + /* Register index. */ + rindex7_abs20, rindex8_abs20, + /* Register pair index. */ + rpindex_disps0, rpindex_disps14, rpindex_disps20, + /* register. */ + regr, + /* register pair. */ + regp, + /* processor register. */ + pregr, + /* processor register 32 bit. */ + pregrp, + /* condition code - 4 bit. */ + cc, + /* Not an operand. */ + nulloperand, + /* Maximum supported operand. */ + MAX_OPRD +} +operand_type; + +/* CR16 instruction types. */ + +#define NO_TYPE_INS 0 +#define ARITH_INS 1 +#define LD_STOR_INS 2 +#define BRANCH_INS 3 +#define ARITH_BYTE_INS 4 +#define SHIFT_INS 5 +#define BRANCH_NEQ_INS 6 +#define LD_STOR_INS_INC 7 +#define STOR_IMM_INS 8 +#define CSTBIT_INS 9 + +/* Maximum value supported for instruction types. */ +#define CR16_INS_MAX (1 << 4) +/* Mask to record an instruction type. */ +#define CR16_INS_MASK (CR16_INS_MAX - 1) +/* Return instruction type, given instruction's attributes. */ +#define CR16_INS_TYPE(attr) ((attr) & CR16_INS_MASK) + +/* Indicates whether this instruction has a register list as parameter. */ +#define REG_LIST CR16_INS_MAX + +/* The operands in binary and assembly are placed in reverse order. + load - (REVERSE_MATCH)/store - (! REVERSE_MATCH). */ +#define REVERSE_MATCH (1 << 5) + +/* Printing formats, where the instruction prefix isn't consecutive. */ +#define FMT_1 (1 << 9) /* 0xF0F00000 */ +#define FMT_2 (1 << 10) /* 0xFFF0FF00 */ +#define FMT_3 (1 << 11) /* 0xFFF00F00 */ +#define FMT_4 (1 << 12) /* 0xFFF0F000 */ +#define FMT_5 (1 << 13) /* 0xFFF0FFF0 */ +#define FMT_CR16 (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5) + +/* Indicates whether this instruction can be relaxed. */ +#define RELAXABLE (1 << 14) + +/* Indicates that instruction uses user registers (and not + general-purpose registers) as operands. */ +#define USER_REG (1 << 15) + + +/* Instruction shouldn't allow 'sp' usage. */ +#define NO_SP (1 << 17) + +/* Instruction shouldn't allow to push a register which is used as a rptr. */ +#define NO_RPTR (1 << 18) + +/* Maximum operands per instruction. */ +#define MAX_OPERANDS 5 +/* Maximum register name length. */ +#define MAX_REGNAME_LEN 10 +/* Maximum instruction length. */ +#define MAX_INST_LEN 256 + + +/* Values defined for the flags field of a struct operand_entry. */ + +/* Operand must be an unsigned number. */ +#define OP_UNSIGNED (1 << 0) +/* Operand must be a signed number. */ +#define OP_SIGNED (1 << 1) +/* Operand must be a negative number. */ +#define OP_NEG (1 << 2) +/* A special load/stor 4-bit unsigned displacement operand. */ +#define OP_DEC (1 << 3) +/* Operand must be an even number. */ +#define OP_EVEN (1 << 4) +/* Operand is shifted right. */ +#define OP_SHIFT (1 << 5) +/* Operand is shifted right and decremented. */ +#define OP_SHIFT_DEC (1 << 6) +/* Operand has reserved escape sequences. */ +#define OP_ESC (1 << 7) +/* Operand must be a ABS20 number. */ +#define OP_ABS20 (1 << 8) +/* Operand must be a ABS24 number. */ +#define OP_ABS24 (1 << 9) +/* Operand has reserved escape sequences type 1. */ +#define OP_ESC1 (1 << 10) + +/* Single operand description. */ + +typedef struct +{ + /* Operand type. */ + operand_type op_type; + /* Operand location within the opcode. */ + unsigned int shift; +} +operand_desc; + +/* Instruction data structure used in instruction table. */ + +typedef struct +{ + /* Name. */ + const char *mnemonic; + /* Size (in words). */ + unsigned int size; + /* Constant prefix (matched by the disassembler). */ + unsigned long match; /* ie opcode */ + /* Match size (in bits). */ + /* MASK: if( (i & match_bits) == match ) then match */ + int match_bits; + /* Attributes. */ + unsigned int flags; + /* Operands (always last, so unreferenced operands are initialized). */ + operand_desc operands[MAX_OPERANDS]; +} +inst; + +/* Data structure for a single instruction's arguments (Operands). */ + +typedef struct +{ + /* Register or base register. */ + reg r; + /* Register pair register. */ + reg rp; + /* Index register. */ + reg i_r; + /* Processor register. */ + preg pr; + /* Processor register. 32 bit */ + preg prp; + /* Constant/immediate/absolute value. */ + long constant; + /* CC code. */ + unsigned int cc; + /* Scaled index mode. */ + unsigned int scale; + /* Argument type. */ + argtype type; + /* Size of the argument (in bits) required to represent. */ + int size; + /* The type of the expression. */ + unsigned char X_op; +} +argument; + +/* Internal structure to hold the various entities + corresponding to the current assembling instruction. */ + +typedef struct +{ + /* Number of arguments. */ + int nargs; + /* The argument data structure for storing args (operands). */ + argument arg[MAX_OPERANDS]; +/* The following fields are required only by CR16-assembler. */ +#ifdef TC_CR16 + /* Expression used for setting the fixups (if any). */ + expressionS exp; + bfd_reloc_code_real_type rtype; +#endif /* TC_CR16 */ + /* Instruction size (in bytes). */ + int size; +} +ins; + +/* Structure to hold information about predefined operands. */ + +typedef struct +{ + /* Size (in bits). */ + unsigned int bit_size; + /* Argument type. */ + argtype arg_type; + /* One bit syntax flags. */ + int flags; +} +operand_entry; + +/* Structure to hold trap handler information. */ + +typedef struct +{ + /* Trap name. */ + char *name; + /* Index in dispatch table. */ + unsigned int entry; +} +trap_entry; + +/* Structure to hold information about predefined registers. */ + +typedef struct +{ + /* Name (string representation). */ + char *name; + /* Value (enum representation). */ + union + { + /* Register. */ + reg reg_val; + /* processor register. */ + preg preg_val; + } value; + /* Register image. */ + int image; + /* Register type. */ + reg_type type; +} +reg_entry; + +/* CR16 opcode table. */ +extern const inst cr16_instruction[]; +extern const unsigned int cr16_num_opcodes; +#define NUMOPCODES cr16_num_opcodes + +/* CR16 operands table. */ +extern const operand_entry cr16_optab[]; +extern const unsigned int cr16_num_optab; + +/* CR16 registers table. */ +extern const reg_entry cr16_regtab[]; +extern const unsigned int cr16_num_regs; +#define NUMREGS cr16_num_regs + +/* CR16 register pair table. */ +extern const reg_entry cr16_regptab[]; +extern const unsigned int cr16_num_regps; +#define NUMREGPS cr16_num_regps + +/* CR16 processor registers table. */ +extern const reg_entry cr16_pregtab[]; +extern const unsigned int cr16_num_pregs; +#define NUMPREGS cr16_num_pregs + +/* CR16 processor registers - 32 bit table. */ +extern const reg_entry cr16_pregptab[]; +extern const unsigned int cr16_num_pregps; +#define NUMPREGPS cr16_num_pregps + +/* CR16 trap/interrupt table. */ +extern const trap_entry cr16_traps[]; +extern const unsigned int cr16_num_traps; +#define NUMTRAPS cr16_num_traps + +/* CR16 CC - codes bit table. */ +extern const char * cr16_b_cond_tab[]; +extern const unsigned int cr16_num_cc; +#define NUMCC cr16_num_cc; + + +/* Table of instructions with no operands. */ +extern const char * cr16_no_op_insn[]; + +/* Current instruction we're assembling. */ +extern const inst *instruction; + +/* A macro for representing the instruction "constant" opcode, that is, + the FIXED part of the instruction. The "constant" opcode is represented + as a 32-bit unsigned long, where OPC is expanded (by a left SHIFT) + over that range. */ +#define BIN(OPC,SHIFT) (OPC << SHIFT) + +/* Is the current instruction type is TYPE ? */ +#define IS_INSN_TYPE(TYPE) \ + (CR16_INS_TYPE (instruction->flags) == TYPE) + +/* Is the current instruction mnemonic is MNEMONIC ? */ +#define IS_INSN_MNEMONIC(MNEMONIC) \ + (strcmp (instruction->mnemonic, MNEMONIC) == 0) + +/* Does the current instruction has register list ? */ +#define INST_HAS_REG_LIST \ + (instruction->flags & REG_LIST) + + +/* Utility macros for string comparison. */ +#define streq(a, b) (strcmp (a, b) == 0) +#define strneq(a, b, c) (strncmp (a, b, c) == 0) + +/* Long long type handling. */ +/* Replace all appearances of 'long long int' with LONGLONG. */ +typedef long long int LONGLONG; +typedef unsigned long long ULONGLONG; + +/* Data types for opcode handling. */ +typedef unsigned long dwordU; +typedef unsigned short wordU; + +/* Globals to store opcode data and build the instruction. */ +extern wordU cr16_words[3]; +extern ULONGLONG cr16_allWords; +extern ins cr16_currInsn; + +/* Prototypes for function in cr16-dis.c. */ +extern void cr16_make_instruction (void); +extern int cr16_match_opcode (void); + +#endif /* _CR16_H_ */ diff --git a/include/opcode/cris.h b/include/opcode/cris.h new file mode 100644 index 0000000..e57a882 --- /dev/null +++ b/include/opcode/cris.h @@ -0,0 +1,367 @@ +/* cris.h -- Header file for CRIS opcode and register tables. + Copyright (C) 2000, 2001, 2004, 2010 Free Software Foundation, Inc. + Contributed by Axis Communications AB, Lund, Sweden. + Originally written for GAS 1.38.1 by Mikael Asker. + Updated, BFDized and GNUified by Hans-Peter Nilsson. + + This file is part of GAS, GDB and the GNU binutils. + + GAS, GDB, and GNU binutils 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, or (at your + option) any later version. + + GAS, GDB, and GNU binutils are distributed in the hope that they will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef __CRIS_H_INCLUDED_ +#define __CRIS_H_INCLUDED_ + +#if !defined(__STDC__) && !defined(const) +#define const +#endif + + +/* Registers. */ +#define MAX_REG (15) +#define REG_SP (14) +#define REG_PC (15) + +/* CPU version control of disassembly and assembly of instructions. + May affect how the instruction is assembled, at least the size of + immediate operands. */ +enum cris_insn_version_usage +{ + /* Any version. */ + cris_ver_version_all=0, + + /* Indeterminate (intended for disassembly only, or obsolete). */ + cris_ver_warning, + + /* Only for v0..3 (Etrax 1..4). */ + cris_ver_v0_3, + + /* Only for v3 or higher (ETRAX 4 and beyond). */ + cris_ver_v3p, + + /* Only for v8 (Etrax 100). */ + cris_ver_v8, + + /* Only for v8 or higher (ETRAX 100, ETRAX 100 LX). */ + cris_ver_v8p, + + /* Only for v0..10. FIXME: Not sure what to do with this. */ + cris_ver_sim_v0_10, + + /* Only for v0..10. */ + cris_ver_v0_10, + + /* Only for v3..10. (ETRAX 4, ETRAX 100 and ETRAX 100 LX). */ + cris_ver_v3_10, + + /* Only for v8..10 (ETRAX 100 and ETRAX 100 LX). */ + cris_ver_v8_10, + + /* Only for v10 (ETRAX 100 LX) and same series. */ + cris_ver_v10, + + /* Only for v10 (ETRAX 100 LX) and same series. */ + cris_ver_v10p, + + /* Only for v32 or higher (codename GUINNESS). + Of course some or all these of may change to cris_ver_v32p if/when + there's a new revision. */ + cris_ver_v32p +}; + + +/* Special registers. */ +struct cris_spec_reg +{ + const char *const name; + unsigned int number; + + /* The size of the register. */ + unsigned int reg_size; + + /* What CPU version the special register of that name is implemented + in. If cris_ver_warning, emit an unimplemented-warning. */ + enum cris_insn_version_usage applicable_version; + + /* There might be a specific warning for using a special register + here. */ + const char *const warning; +}; +extern const struct cris_spec_reg cris_spec_regs[]; + + +/* Support registers (kind of special too, but not named as such). */ +struct cris_support_reg +{ + const char *const name; + unsigned int number; +}; +extern const struct cris_support_reg cris_support_regs[]; + +struct cris_cond15 +{ + /* The name of the condition. */ + const char *const name; + + /* What CPU version this condition name applies to. */ + enum cris_insn_version_usage applicable_version; +}; +extern const struct cris_cond15 cris_conds15[]; + +/* Opcode-dependent constants. */ +#define AUTOINCR_BIT (0x04) + +/* Prefixes. */ +#define BDAP_QUICK_OPCODE (0x0100) +#define BDAP_QUICK_Z_BITS (0x0e00) + +#define BIAP_OPCODE (0x0540) +#define BIAP_Z_BITS (0x0a80) + +#define DIP_OPCODE (0x0970) +#define DIP_Z_BITS (0xf280) + +#define BDAP_INDIR_LOW (0x40) +#define BDAP_INDIR_LOW_Z (0x80) +#define BDAP_INDIR_HIGH (0x09) +#define BDAP_INDIR_HIGH_Z (0x02) + +#define BDAP_INDIR_OPCODE (BDAP_INDIR_HIGH * 0x0100 + BDAP_INDIR_LOW) +#define BDAP_INDIR_Z_BITS (BDAP_INDIR_HIGH_Z * 0x100 + BDAP_INDIR_LOW_Z) +#define BDAP_PC_LOW (BDAP_INDIR_LOW + REG_PC) +#define BDAP_INCR_HIGH (BDAP_INDIR_HIGH + AUTOINCR_BIT) + +/* No prefix must have this code for its "match" bits in the + opcode-table. "BCC .+2" will do nicely. */ +#define NO_CRIS_PREFIX 0 + +/* Definitions for condition codes. */ +#define CC_CC 0x0 +#define CC_HS 0x0 +#define CC_CS 0x1 +#define CC_LO 0x1 +#define CC_NE 0x2 +#define CC_EQ 0x3 +#define CC_VC 0x4 +#define CC_VS 0x5 +#define CC_PL 0x6 +#define CC_MI 0x7 +#define CC_LS 0x8 +#define CC_HI 0x9 +#define CC_GE 0xA +#define CC_LT 0xB +#define CC_GT 0xC +#define CC_LE 0xD +#define CC_A 0xE +#define CC_EXT 0xF + +/* A table of strings "cc", "cs"... indexed with condition code + values as above. */ +extern const char *const cris_cc_strings[]; + +/* Bcc quick. */ +#define BRANCH_QUICK_LOW (0) +#define BRANCH_QUICK_HIGH (0) +#define BRANCH_QUICK_OPCODE (BRANCH_QUICK_HIGH * 0x0100 + BRANCH_QUICK_LOW) +#define BRANCH_QUICK_Z_BITS (0x0F00) + +/* BA quick. */ +#define BA_QUICK_HIGH (BRANCH_QUICK_HIGH + CC_A * 0x10) +#define BA_QUICK_OPCODE (BA_QUICK_HIGH * 0x100 + BRANCH_QUICK_LOW) + +/* Bcc [PC+]. */ +#define BRANCH_PC_LOW (0xFF) +#define BRANCH_INCR_HIGH (0x0D) +#define BA_PC_INCR_OPCODE \ + ((BRANCH_INCR_HIGH + CC_A * 0x10) * 0x0100 + BRANCH_PC_LOW) + +/* Jump. */ +/* Note that old versions generated special register 8 (in high bits) + and not-that-old versions recognized it as a jump-instruction. + That opcode now belongs to JUMPU. */ +#define JUMP_INDIR_OPCODE (0x0930) +#define JUMP_INDIR_Z_BITS (0xf2c0) +#define JUMP_PC_INCR_OPCODE \ + (JUMP_INDIR_OPCODE + AUTOINCR_BIT * 0x0100 + REG_PC) + +#define MOVE_M_TO_PREG_OPCODE 0x0a30 +#define MOVE_M_TO_PREG_ZBITS 0x01c0 + +/* BDAP.D N,PC. */ +#define MOVE_PC_INCR_OPCODE_PREFIX \ + (((BDAP_INCR_HIGH | (REG_PC << 4)) << 8) | BDAP_PC_LOW | (2 << 4)) +#define MOVE_PC_INCR_OPCODE_SUFFIX \ + (MOVE_M_TO_PREG_OPCODE | REG_PC | (AUTOINCR_BIT << 8)) + +#define JUMP_PC_INCR_OPCODE_V32 (0x0DBF) + +/* BA DWORD (V32). */ +#define BA_DWORD_OPCODE (0x0EBF) + +/* Nop. */ +#define NOP_OPCODE (0x050F) +#define NOP_Z_BITS (0xFFFF ^ NOP_OPCODE) + +#define NOP_OPCODE_V32 (0x05B0) +#define NOP_Z_BITS_V32 (0xFFFF ^ NOP_OPCODE_V32) + +/* For the compatibility mode, let's use "MOVE R0,P0". Doesn't affect + registers or flags. Unfortunately shuts off interrupts for one cycle + for < v32, but there doesn't seem to be any alternative without that + effect. */ +#define NOP_OPCODE_COMMON (0x630) +#define NOP_OPCODE_ZBITS_COMMON (0xffff & ~NOP_OPCODE_COMMON) + +/* LAPC.D */ +#define LAPC_DWORD_OPCODE (0x0D7F) +#define LAPC_DWORD_Z_BITS (0x0fff & ~LAPC_DWORD_OPCODE) + +/* Structure of an opcode table entry. */ +enum cris_imm_oprnd_size_type +{ + /* No size is applicable. */ + SIZE_NONE, + + /* Always 32 bits. */ + SIZE_FIX_32, + + /* Indicated by size of special register. */ + SIZE_SPEC_REG, + + /* Indicated by size field, signed. */ + SIZE_FIELD_SIGNED, + + /* Indicated by size field, unsigned. */ + SIZE_FIELD_UNSIGNED, + + /* Indicated by size field, no sign implied. */ + SIZE_FIELD +}; + +/* For GDB. FIXME: Is this the best way to handle opcode + interpretation? */ +enum cris_op_type +{ + cris_not_implemented_op = 0, + cris_abs_op, + cris_addi_op, + cris_asr_op, + cris_asrq_op, + cris_ax_ei_setf_op, + cris_bdap_prefix, + cris_biap_prefix, + cris_break_op, + cris_btst_nop_op, + cris_clearf_di_op, + cris_dip_prefix, + cris_dstep_logshift_mstep_neg_not_op, + cris_eight_bit_offset_branch_op, + cris_move_mem_to_reg_movem_op, + cris_move_reg_to_mem_movem_op, + cris_move_to_preg_op, + cris_muls_op, + cris_mulu_op, + cris_none_reg_mode_add_sub_cmp_and_or_move_op, + cris_none_reg_mode_clear_test_op, + cris_none_reg_mode_jump_op, + cris_none_reg_mode_move_from_preg_op, + cris_quick_mode_add_sub_op, + cris_quick_mode_and_cmp_move_or_op, + cris_quick_mode_bdap_prefix, + cris_reg_mode_add_sub_cmp_and_or_move_op, + cris_reg_mode_clear_op, + cris_reg_mode_jump_op, + cris_reg_mode_move_from_preg_op, + cris_reg_mode_test_op, + cris_scc_op, + cris_sixteen_bit_offset_branch_op, + cris_three_operand_add_sub_cmp_and_or_op, + cris_three_operand_bound_op, + cris_two_operand_bound_op, + cris_xor_op +}; + +struct cris_opcode +{ + /* The name of the insn. */ + const char *name; + + /* Bits that must be 1 for a match. */ + unsigned int match; + + /* Bits that must be 0 for a match. */ + unsigned int lose; + + /* See the table in "opcodes/cris-opc.c". */ + const char *args; + + /* Nonzero if this is a delayed branch instruction. */ + char delayed; + + /* Size of immediate operands. */ + enum cris_imm_oprnd_size_type imm_oprnd_size; + + /* Indicates which version this insn was first implemented in. */ + enum cris_insn_version_usage applicable_version; + + /* What kind of operation this is. */ + enum cris_op_type op; +}; +extern const struct cris_opcode cris_opcodes[]; + + +/* These macros are for the target-specific flags in disassemble_info + used at disassembly. */ + +/* This insn accesses memory. This flag is more trustworthy than + checking insn_type for "dis_dref" which does not work for + e.g. "JSR [foo]". */ +#define CRIS_DIS_FLAG_MEMREF (1 << 0) + +/* The "target" field holds a register number. */ +#define CRIS_DIS_FLAG_MEM_TARGET_IS_REG (1 << 1) + +/* The "target2" field holds a register number; add it to "target". */ +#define CRIS_DIS_FLAG_MEM_TARGET2_IS_REG (1 << 2) + +/* Yet another add-on: the register in "target2" must be multiplied + by 2 before adding to "target". */ +#define CRIS_DIS_FLAG_MEM_TARGET2_MULT2 (1 << 3) + +/* Yet another add-on: the register in "target2" must be multiplied + by 4 (mutually exclusive with .._MULT2). */ +#define CRIS_DIS_FLAG_MEM_TARGET2_MULT4 (1 << 4) + +/* The register in "target2" is an indirect memory reference (of the + register there), add to "target". Assumed size is dword (mutually + exclusive with .._MULT[24]). */ +#define CRIS_DIS_FLAG_MEM_TARGET2_MEM (1 << 5) + +/* Add-on to CRIS_DIS_FLAG_MEM_TARGET2_MEM; the memory access is "byte"; + sign-extended before adding to "target". */ +#define CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE (1 << 6) + +/* Add-on to CRIS_DIS_FLAG_MEM_TARGET2_MEM; the memory access is "word"; + sign-extended before adding to "target". */ +#define CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD (1 << 7) + +#endif /* __CRIS_H_INCLUDED_ */ + +/* + * Local variables: + * eval: (c-set-style "gnu") + * indent-tabs-mode: t + * End: + */ diff --git a/include/opcode/crx.h b/include/opcode/crx.h new file mode 100644 index 0000000..6081ea3 --- /dev/null +++ b/include/opcode/crx.h @@ -0,0 +1,419 @@ +/* crx.h -- Header file for CRX opcode and register tables. + Copyright 2004, 2010, 2012 Free Software Foundation, Inc. + Contributed by Tomer Levi, NSC, Israel. + Originally written for GAS 2.12 by Tomer Levi, NSC, Israel. + Updates, BFDizing, GNUifying and ELF support by Tomer Levi. + + This file is part of GAS, GDB and the GNU binutils. + + GAS, GDB, and GNU binutils 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, or (at your + option) any later version. + + GAS, GDB, and GNU binutils are distributed in the hope that they will be + useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _CRX_H_ +#define _CRX_H_ + +/* CRX core/debug Registers : + The enums are used as indices to CRX registers table (crx_regtab). + Therefore, order MUST be preserved. */ + +typedef enum + { + /* 32-bit general purpose registers. */ + r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, + r10, r11, r12, r13, r14, r15, ra, sp, + /* 32-bit user registers. */ + u0, u1, u2, u3, u4, u5, u6, u7, u8, u9, + u10, u11, u12, u13, u14, u15, ura, usp, + /* hi and lo registers. */ + hi, lo, + /* hi and lo user registers. */ + uhi, ulo, + /* Processor Status Register. */ + psr, + /* Interrupt Base Register. */ + intbase, + /* Interrupt Stack Pointer Register. */ + isp, + /* Configuration Register. */ + cfg, + /* Coprocessor Configuration Register. */ + cpcfg, + /* Coprocessor Enable Register. */ + cen, + /* Not a register. */ + nullregister, + MAX_REG + } +reg; + +/* CRX Coprocessor registers and special registers : + The enums are used as indices to CRX coprocessor registers table + (crx_copregtab). Therefore, order MUST be preserved. */ + +typedef enum + { + /* Coprocessor registers. */ + c0 = MAX_REG, c1, c2, c3, c4, c5, c6, c7, c8, + c9, c10, c11, c12, c13, c14, c15, + /* Coprocessor special registers. */ + cs0, cs1 ,cs2, cs3, cs4, cs5, cs6, cs7, cs8, + cs9, cs10, cs11, cs12, cs13, cs14, cs15, + /* Not a Coprocessor register. */ + nullcopregister, + MAX_COPREG + } +copreg; + +/* CRX Register types. */ + +typedef enum + { + CRX_R_REGTYPE, /* r */ + CRX_U_REGTYPE, /* u */ + CRX_C_REGTYPE, /* c */ + CRX_CS_REGTYPE, /* cs */ + CRX_CFG_REGTYPE /* configuration register */ + } +reg_type; + +/* CRX argument types : + The argument types correspond to instructions operands + + Argument types : + r - register + c - constant + i - immediate + idxr - index register + rbase - register base + s - star ('*') + copr - coprocessor register + copsr - coprocessor special register. */ + +typedef enum + { + arg_r, arg_c, arg_cr, arg_ic, arg_icr, arg_sc, + arg_idxr, arg_rbase, arg_copr, arg_copsr, + /* Not an argument. */ + nullargs + } +argtype; + +/* CRX operand types : + The operand types correspond to instructions operands. */ + +typedef enum + { + dummy, + /* 4-bit encoded constant. */ + cst4, + /* N-bit immediate. */ + i16, i32, + /* N-bit unsigned immediate. */ + ui3, ui4, ui5, ui16, + /* N-bit signed displacement. */ + disps9, disps17, disps25, disps32, + /* N-bit unsigned displacement. */ + dispu5, + /* N-bit escaped displacement. */ + dispe9, + /* N-bit absolute address. */ + abs16, abs32, + /* Register relative. */ + rbase, rbase_dispu4, + rbase_disps12, rbase_disps16, rbase_disps28, rbase_disps32, + /* Register index. */ + rindex_disps6, rindex_disps22, + /* 4-bit genaral-purpose register specifier. */ + regr, + /* 8-bit register address space. */ + regr8, + /* coprocessor register. */ + copregr, + /* coprocessor special register. */ + copsregr, + /* Not an operand. */ + nulloperand, + /* Maximum supported operand. */ + MAX_OPRD + } +operand_type; + +/* CRX instruction types. */ + +#define NO_TYPE_INS 0 +#define ARITH_INS 1 +#define LD_STOR_INS 2 +#define BRANCH_INS 3 +#define ARITH_BYTE_INS 4 +#define CMPBR_INS 5 +#define SHIFT_INS 6 +#define BRANCH_NEQ_INS 7 +#define LD_STOR_INS_INC 8 +#define STOR_IMM_INS 9 +#define CSTBIT_INS 10 +#define COP_BRANCH_INS 11 +#define COP_REG_INS 12 +#define COPS_REG_INS 13 +#define DCR_BRANCH_INS 14 + +/* Maximum value supported for instruction types. */ +#define CRX_INS_MAX (1 << 4) +/* Mask to record an instruction type. */ +#define CRX_INS_MASK (CRX_INS_MAX - 1) +/* Return instruction type, given instruction's attributes. */ +#define CRX_INS_TYPE(attr) ((attr) & CRX_INS_MASK) + +/* Indicates whether this instruction has a register list as parameter. */ +#define REG_LIST CRX_INS_MAX +/* The operands in binary and assembly are placed in reverse order. + load - (REVERSE_MATCH)/store - (! REVERSE_MATCH). */ +#define REVERSE_MATCH (1 << 5) + +/* Kind of displacement map used DISPU[BWD]4. */ +#define DISPUB4 (1 << 6) +#define DISPUW4 (1 << 7) +#define DISPUD4 (1 << 8) +#define DISPU4MAP (DISPUB4 | DISPUW4 | DISPUD4) + +/* Printing formats, where the instruction prefix isn't consecutive. */ +#define FMT_1 (1 << 9) /* 0xF0F00000 */ +#define FMT_2 (1 << 10) /* 0xFFF0FF00 */ +#define FMT_3 (1 << 11) /* 0xFFF00F00 */ +#define FMT_4 (1 << 12) /* 0xFFF0F000 */ +#define FMT_5 (1 << 13) /* 0xFFF0FFF0 */ +#define FMT_CRX (FMT_1 | FMT_2 | FMT_3 | FMT_4 | FMT_5) + +/* Indicates whether this instruction can be relaxed. */ +#define RELAXABLE (1 << 14) + +/* Indicates that instruction uses user registers (and not + general-purpose registers) as operands. */ +#define USER_REG (1 << 15) + +/* Indicates that instruction can perfom a cst4 mapping. */ +#define CST4MAP (1 << 16) + +/* Instruction shouldn't allow 'sp' usage. */ +#define NO_SP (1 << 17) + +/* Instruction shouldn't allow to push a register which is used as a rptr. */ +#define NO_RPTR (1 << 18) + +/* Maximum operands per instruction. */ +#define MAX_OPERANDS 5 +/* Maximum register name length. */ +#define MAX_REGNAME_LEN 10 +/* Maximum instruction length. */ +#define MAX_INST_LEN 256 + + +/* Values defined for the flags field of a struct operand_entry. */ + +/* Operand must be an unsigned number. */ +#define OP_UNSIGNED (1 << 0) +/* Operand must be a signed number. */ +#define OP_SIGNED (1 << 1) +/* A special arithmetic 4-bit constant operand. */ +#define OP_CST4 (1 << 2) +/* A special load/stor 4-bit unsigned displacement operand. */ +#define OP_DISPU4 (1 << 3) +/* Operand must be an even number. */ +#define OP_EVEN (1 << 4) +/* Operand is shifted right. */ +#define OP_SHIFT (1 << 5) +/* Operand is shifted right and decremented. */ +#define OP_SHIFT_DEC (1 << 6) +/* Operand has reserved escape sequences. */ +#define OP_ESC (1 << 7) +/* Operand is used only for the upper 64 KB (FFFF0000 to FFFFFFFF). */ +#define OP_UPPER_64KB (1 << 8) + +/* Single operand description. */ + +typedef struct + { + /* Operand type. */ + operand_type op_type; + /* Operand location within the opcode. */ + unsigned int shift; + } +operand_desc; + +/* Instruction data structure used in instruction table. */ + +typedef struct + { + /* Name. */ + const char *mnemonic; + /* Size (in words). */ + unsigned int size; + /* Constant prefix (matched by the disassembler). */ + unsigned long match; + /* Match size (in bits). */ + int match_bits; + /* Attributes. */ + unsigned int flags; + /* Operands (always last, so unreferenced operands are initialized). */ + operand_desc operands[MAX_OPERANDS]; + } +inst; + +/* Data structure for a single instruction's arguments (Operands). */ + +typedef struct + { + /* Register or base register. */ + reg r; + /* Index register. */ + reg i_r; + /* Coprocessor register. */ + copreg cr; + /* Constant/immediate/absolute value. */ + long constant; + /* Scaled index mode. */ + unsigned int scale; + /* Argument type. */ + argtype type; + /* Size of the argument (in bits) required to represent. */ + int size; + /* The type of the expression. */ + unsigned char X_op; + } +argument; + +/* Internal structure to hold the various entities + corresponding to the current assembling instruction. */ + +typedef struct + { + /* Number of arguments. */ + int nargs; + /* The argument data structure for storing args (operands). */ + argument arg[MAX_OPERANDS]; +/* The following fields are required only by CRX-assembler. */ +#ifdef TC_CRX + /* Expression used for setting the fixups (if any). */ + expressionS exp; + bfd_reloc_code_real_type rtype; +#endif /* TC_CRX */ + /* Instruction size (in bytes). */ + int size; + } +ins; + +/* Structure to hold information about predefined operands. */ + +typedef struct + { + /* Size (in bits). */ + unsigned int bit_size; + /* Argument type. */ + argtype arg_type; + /* One bit syntax flags. */ + int flags; + } +operand_entry; + +/* Structure to hold trap handler information. */ + +typedef struct + { + /* Trap name. */ + char *name; + /* Index in dispatch table. */ + unsigned int entry; + } +trap_entry; + +/* Structure to hold information about predefined registers. */ + +typedef struct + { + /* Name (string representation). */ + char *name; + /* Value (enum representation). */ + union + { + /* Register. */ + reg reg_val; + /* Coprocessor register. */ + copreg copreg_val; + } value; + /* Register image. */ + int image; + /* Register type. */ + reg_type type; + } +reg_entry; + +/* Structure to hold a cst4 operand mapping. */ + +/* CRX opcode table. */ +extern const inst crx_instruction[]; +extern const int crx_num_opcodes; +#define NUMOPCODES crx_num_opcodes + +/* CRX operands table. */ +extern const operand_entry crx_optab[]; + +/* CRX registers table. */ +extern const reg_entry crx_regtab[]; +extern const int crx_num_regs; +#define NUMREGS crx_num_regs + +/* CRX coprocessor registers table. */ +extern const reg_entry crx_copregtab[]; +extern const int crx_num_copregs; +#define NUMCOPREGS crx_num_copregs + +/* CRX trap/interrupt table. */ +extern const trap_entry crx_traps[]; +extern const int crx_num_traps; +#define NUMTRAPS crx_num_traps + +/* cst4 operand mapping. */ +extern const int cst4_map[]; +extern const int cst4_maps; + +/* Table of instructions with no operands. */ +extern const char* no_op_insn[]; + +/* Current instruction we're assembling. */ +extern const inst *instruction; + +/* A macro for representing the instruction "constant" opcode, that is, + the FIXED part of the instruction. The "constant" opcode is represented + as a 32-bit unsigned long, where OPC is expanded (by a left SHIFT) + over that range. */ +#define BIN(OPC,SHIFT) (OPC << SHIFT) + +/* Is the current instruction type is TYPE ? */ +#define IS_INSN_TYPE(TYPE) \ + (CRX_INS_TYPE(instruction->flags) == TYPE) + +/* Is the current instruction mnemonic is MNEMONIC ? */ +#define IS_INSN_MNEMONIC(MNEMONIC) \ + (strcmp(instruction->mnemonic,MNEMONIC) == 0) + +/* Does the current instruction has register list ? */ +#define INST_HAS_REG_LIST \ + (instruction->flags & REG_LIST) + +/* Long long type handling. */ +/* Replace all appearances of 'long long int' with LONGLONG. */ +typedef long long int LONGLONG; +typedef unsigned long long ULONGLONG; + +#endif /* _CRX_H_ */ diff --git a/include/opcode/d10v.h b/include/opcode/d10v.h new file mode 100644 index 0000000..d0e115f --- /dev/null +++ b/include/opcode/d10v.h @@ -0,0 +1,209 @@ +/* d10v.h -- Header file for D10V opcode table + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2010 + Free Software Foundation, Inc. + Written by Martin Hunt (hunt@cygnus.com), Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef D10V_H +#define D10V_H + +/* Format Specifier */ +#define FM00 0 +#define FM01 0x40000000 +#define FM10 0x80000000 +#define FM11 0xC0000000 + +#define NOP 0x5e00 +#define OPCODE_DIVS 0x14002800 + +/* The opcode table is an array of struct d10v_opcode. */ + +struct d10v_opcode +{ + /* The opcode name. */ + const char *name; + + /* the opcode format */ + int format; + + /* These numbers were picked so we can do if( i & SHORT_OPCODE) */ +#define SHORT_OPCODE 1 +#define LONG_OPCODE 8 +#define SHORT_2 1 /* short with 2 operands */ +#define SHORT_B 3 /* short with 8-bit branch */ +#define LONG_B 8 /* long with 16-bit branch */ +#define LONG_L 10 /* long with 3 operands */ +#define LONG_R 12 /* reserved */ + + /* just a placeholder for variable-length instructions */ + /* for example, "bra" will be a fake for "bra.s" and bra.l" */ + /* which will immediately follow in the opcode table. */ +#define OPCODE_FAKE 32 + + /* the number of cycles */ + int cycles; + + /* the execution unit(s) used */ + int unit; +#define EITHER 0 +#define IU 1 +#define MU 2 +#define BOTH 3 + + /* execution type; parallel or sequential */ + /* this field is used to decide if two instructions */ + /* can be executed in parallel */ + int exec_type; +#define PARONLY 1 /* parallel only */ +#define SEQ 2 /* must be sequential */ +#define PAR 4 /* may be parallel */ +#define BRANCH_LINK 8 /* subroutine call. must be aligned */ +#define RMEM 16 /* reads memory */ +#define WMEM 32 /* writes memory */ +#define RF0 64 /* reads f0 */ +#define WF0 128 /* modifies f0 */ +#define WCAR 256 /* write Carry */ +#define BRANCH 512 /* branch, no link */ +#define ALONE 1024 /* short but pack with a NOP if on asm line alone */ + + /* the opcode */ + long opcode; + + /* mask. if( (i & mask) == opcode ) then match */ + long mask; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[6]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct d10v_opcode d10v_opcodes[]; +extern const int d10v_num_opcodes; + +/* The operands table is an array of struct d10v_operand. */ +struct d10v_operand +{ + /* The number of bits in the operand. */ + int bits; + + /* How far the operand is left shifted in the instruction. */ + int shift; + + /* One bit syntax flags. */ + int flags; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the d10v_opcodes table. */ + +extern const struct d10v_operand d10v_operands[]; + +/* Values defined for the flags field of a struct d10v_operand. */ + +/* the operand must be an even number */ +#define OPERAND_EVEN (1) + +/* the operand must be an odd number */ +#define OPERAND_ODD (2) + +/* this is the destination register; it will be modified */ +/* this is used by the optimizer */ +#define OPERAND_DEST (4) + +/* number or symbol */ +#define OPERAND_NUM (8) + +/* address or label */ +#define OPERAND_ADDR (0x10) + +/* register */ +#define OPERAND_REG (0x20) + +/* postincrement + */ +#define OPERAND_PLUS (0x40) + +/* postdecrement - */ +#define OPERAND_MINUS (0x80) + +/* @ */ +#define OPERAND_ATSIGN (0x100) + +/* @( */ +#define OPERAND_ATPAR (0x200) + +/* accumulator 0 */ +#define OPERAND_ACC0 (0x400) + +/* accumulator 1 */ +#define OPERAND_ACC1 (0x800) + +/* f0 / f1 flag register */ +#define OPERAND_FFLAG (0x1000) + +/* c flag register */ +#define OPERAND_CFLAG (0x2000) + +/* control register */ +#define OPERAND_CONTROL (0x4000) + +/* predecrement mode '@-sp' */ +#define OPERAND_ATMINUS (0x8000) + +/* signed number */ +#define OPERAND_SIGNED (0x10000) + +/* special accumulator shifts need a 4-bit number */ +/* 1 <= x <= 16 */ +#define OPERAND_SHIFT (0x20000) + +/* general purpose register */ +#define OPERAND_GPR (0x40000) + +/* special imm3 values with range restricted to -2 <= imm3 <= 3 */ +/* needed for rac/rachi */ +#define RESTRICTED_NUM3 (0x80000) + +/* Pre-decrement is only supported for SP. */ +#define OPERAND_SP (0x100000) + +/* Post-decrement is not supported for SP. Like OPERAND_EVEN, and + unlike OPERAND_SP, this flag doesn't prevent the instruction from + matching, it only fails validation later on. */ +#define OPERAND_NOSP (0x200000) + +/* Structure to hold information about predefined registers. */ +struct pd_reg +{ + char *name; /* name to recognize */ + char *pname; /* name to print for this register */ + int value; +}; + +extern const struct pd_reg d10v_predefined_registers[]; +int d10v_reg_name_cnt (void); + +/* an expressionS only has one register type, so we fake it */ +/* by setting high bits to indicate type */ +#define REGISTER_MASK 0xFF + +#endif /* D10V_H */ diff --git a/include/opcode/d30v.h b/include/opcode/d30v.h new file mode 100644 index 0000000..62c041d --- /dev/null +++ b/include/opcode/d30v.h @@ -0,0 +1,288 @@ +/* d30v.h -- Header file for D30V opcode table + Copyright 1997, 1998, 1999, 2000, 2001, 2003, 2010 + Free Software Foundation, Inc. + Written by Martin Hunt (hunt@cygnus.com), Cygnus Solutions + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef D30V_H +#define D30V_H + +#define NOP 0x00F00000 + +/* Structure to hold information about predefined registers. */ +struct pd_reg +{ + char *name; /* name to recognize */ + char *pname; /* name to print for this register */ + int value; +}; + +extern const struct pd_reg pre_defined_registers[]; +int reg_name_cnt (void); + +/* the number of control registers */ +#define MAX_CONTROL_REG 64 + +/* define the format specifiers */ +#define FM00 0 +#define FM01 0x80000000 +#define FM10 0x8000000000000000LL +#define FM11 0x8000000080000000LL + +/* define the opcode classes */ +#define BRA 0 +#define LOGIC 1 +#define IMEM 2 +#define IALU1 4 +#define IALU2 5 + +/* define the execution condition codes */ +#define ECC_AL 0 /* ALways (default) */ +#define ECC_TX 1 /* F0=True, F1=Don't care */ +#define ECC_FX 2 /* F0=False, F1=Don't care */ +#define ECC_XT 3 /* F0=Don't care, F1=True */ +#define ECC_XF 4 /* F0=Don't care, F1=False */ +#define ECC_TT 5 /* F0=True, F1=True */ +#define ECC_TF 6 /* F0=True, F1=False */ +#define ECC_RESERVED 7 /* reserved */ +#define ECC_MAX ECC_RESERVED + +extern const char *d30v_ecc_names[]; + +/* condition code table for CMP and CMPU */ +extern const char *d30v_cc_names[]; + +/* The opcode table is an array of struct d30v_opcode. */ +struct d30v_opcode +{ + /* The opcode name. */ + const char *name; + + /* the opcode */ + int op1; /* first part, "IALU1" for example */ + int op2; /* the rest of the opcode */ + + /* opcode format(s). These numbers correspond to entries */ + /* in the d30v_format_table */ + unsigned char format[4]; + +#define SHORT_M 1 +#define SHORT_M2 5 /* for ld2w and st2w */ +#define SHORT_A 9 +#define SHORT_B1 11 +#define SHORT_B2 12 +#define SHORT_B2r 13 +#define SHORT_B3 14 +#define SHORT_B3r 16 +#define SHORT_B3b 18 +#define SHORT_B3br 20 +#define SHORT_D1r 22 +#define SHORT_D2 24 +#define SHORT_D2r 26 +#define SHORT_D2Br 28 +#define SHORT_U 30 /* unary SHORT_A. ABS for example */ +#define SHORT_F 31 /* SHORT_A with flag registers */ +#define SHORT_AF 33 /* SHORT_A with only the first register a flag register */ +#define SHORT_T 35 /* for trap instruction */ +#define SHORT_A5 36 /* SHORT_A with a 5-bit immediate instead of 6 */ +#define SHORT_CMP 38 /* special form for CMPcc */ +#define SHORT_CMPU 40 /* special form for CMPUcc */ +#define SHORT_A1 42 /* special form of SHORT_A for MACa opcodes where a=1 */ +#define SHORT_AA 44 /* SHORT_A with the first register an accumulator */ +#define SHORT_RA 46 /* SHORT_A with the second register an accumulator */ +#define SHORT_MODINC 48 +#define SHORT_MODDEC 49 +#define SHORT_C1 50 +#define SHORT_C2 51 +#define SHORT_UF 52 +#define SHORT_A2 53 +#define SHORT_NONE 55 /* no operands */ +#define SHORT_AR 56 /* like SHORT_AA but only accept register as third parameter */ +#define LONG 57 +#define LONG_U 58 /* unary LONG */ +#define LONG_Ur 59 /* LONG pc-relative */ +#define LONG_CMP 60 /* special form for CMPcc and CMPUcc */ +#define LONG_M 61 /* Memory long for ldb, stb */ +#define LONG_M2 62 /* Memory long for ld2w, st2w */ +#define LONG_2 63 /* LONG with 2 operands; jmptnz */ +#define LONG_2r 64 /* LONG with 2 operands; bratnz */ +#define LONG_2b 65 /* LONG_2 with modifier of 3 */ +#define LONG_2br 66 /* LONG_2r with modifier of 3 */ +#define LONG_D 67 /* for DJMPI */ +#define LONG_Dr 68 /* for DBRAI */ +#define LONG_Dbr 69 /* for repeati */ + + /* the execution unit(s) used */ + int unit; +#define EITHER 0 +#define IU 1 +#define MU 2 +#define EITHER_BUT_PREFER_MU 3 + + /* this field is used to decide if two instructions */ + /* can be executed in parallel */ + long flags_used; + long flags_set; +#define FLAG_0 (1L<<0) +#define FLAG_1 (1L<<1) +#define FLAG_2 (1L<<2) +#define FLAG_3 (1L<<3) +#define FLAG_4 (1L<<4) /* S (saturation) */ +#define FLAG_5 (1L<<5) /* V (overflow) */ +#define FLAG_6 (1L<<6) /* VA (accumulated overflow) */ +#define FLAG_7 (1L<<7) /* C (carry/borrow) */ +#define FLAG_SM (1L<<8) /* SM (stack mode) */ +#define FLAG_RP (1L<<9) /* RP (repeat enable) */ +#define FLAG_CONTROL (1L<<10) /* control registers */ +#define FLAG_A0 (1L<<11) /* A0 */ +#define FLAG_A1 (1L<<12) /* A1 */ +#define FLAG_JMP (1L<<13) /* instruction is a branch */ +#define FLAG_JSR (1L<<14) /* subroutine call. must be aligned */ +#define FLAG_MEM (1L<<15) /* reads/writes memory */ +#define FLAG_NOT_WITH_ADDSUBppp (1L<<16) /* Old meaning: a 2 word 4 byter operation + New meaning: operation cannot be + combined in parallel with ADD/SUBppp. */ +#define FLAG_MUL16 (1L<<17) /* 16 bit multiply */ +#define FLAG_MUL32 (1L<<18) /* 32 bit multiply */ +#define FLAG_ADDSUBppp (1L<<19) /* ADDppp or SUBppp */ +#define FLAG_DELAY (1L<<20) /* This is a delayed branch or jump */ +#define FLAG_LKR (1L<<21) /* insn in left slot kills right slot */ +#define FLAG_CVVA (FLAG_5|FLAG_6|FLAG_7) +#define FLAG_C FLAG_7 +#define FLAG_ALL (FLAG_0 | \ + FLAG_1 | \ + FLAG_2 | \ + FLAG_3 | \ + FLAG_4 | \ + FLAG_5 | \ + FLAG_6 | \ + FLAG_7 | \ + FLAG_SM | \ + FLAG_RP | \ + FLAG_CONTROL) + + int reloc_flag; +#define RELOC_PCREL 1 +#define RELOC_ABS 2 +}; + +extern const struct d30v_opcode d30v_opcode_table[]; +extern const int d30v_num_opcodes; + +/* The operands table is an array of struct d30v_operand. */ +struct d30v_operand +{ + /* the length of the field */ + int length; + + /* The number of significant bits in the operand. */ + int bits; + + /* position relative to Ra */ + int position; + + /* syntax flags. */ + long flags; +}; +extern const struct d30v_operand d30v_operand_table[]; + +/* Values defined for the flags field of a struct d30v_operand. */ + +/* this is the destination register; it will be modified */ +/* this is used by the optimizer */ +#define OPERAND_DEST (1) + +/* number or symbol */ +#define OPERAND_NUM (2) + +/* address or label */ +#define OPERAND_ADDR (4) + +/* register */ +#define OPERAND_REG (8) + +/* postincrement + */ +#define OPERAND_PLUS (0x10) + +/* postdecrement - */ +#define OPERAND_MINUS (0x20) + +/* signed number */ +#define OPERAND_SIGNED (0x40) + +/* this operand must be shifted left by 3 */ +#define OPERAND_SHIFT (0x80) + +/* flag register */ +#define OPERAND_FLAG (0x100) + +/* control register */ +#define OPERAND_CONTROL (0x200) + +/* accumulator */ +#define OPERAND_ACC (0x400) + +/* @ */ +#define OPERAND_ATSIGN (0x800) + +/* @( */ +#define OPERAND_ATPAR (0x1000) + +/* predecrement mode '@-sp' */ +#define OPERAND_ATMINUS (0x2000) + +/* this operand changes the instruction name */ +/* for example, CPMcc, CMPUcc */ +#define OPERAND_NAME (0x4000) + +/* fake operand for mvtsys and mvfsys */ +#define OPERAND_SPECIAL (0x8000) + +/* let the optimizer know that two registers are affected */ +#define OPERAND_2REG (0x10000) + +/* This operand is pc-relative. Note that repeati can have two immediate + operands, one of which is pcrel, the other (the IMM6U one) is not. */ +#define OPERAND_PCREL (0x20000) + +/* The format table is an array of struct d30v_format. */ +struct d30v_format +{ + int form; /* SHORT_A, LONG, etc */ + int modifier; /* two bit modifier following opcode */ + unsigned char operands[5]; +}; +extern const struct d30v_format d30v_format_table[]; + + +/* an instruction is defined by an opcode and a format */ +/* for example, "add" has one opcode, but three different */ +/* formats, 2 SHORT_A forms and a LONG form. */ +struct d30v_insn +{ + struct d30v_opcode *op; /* pointer to an entry in the opcode table */ + struct d30v_format *form; /* pointer to an entry in the format table */ + int ecc; /* execution condition code */ +}; + +/* an expressionS only has one register type, so we fake it */ +/* by setting high bits to indicate type */ +#define REGISTER_MASK 0xFF + +#endif /* D30V_H */ diff --git a/include/opcode/dlx.h b/include/opcode/dlx.h new file mode 100644 index 0000000..54dadd0 --- /dev/null +++ b/include/opcode/dlx.h @@ -0,0 +1,283 @@ +/* Table of opcodes for the DLX microprocess. + Copyright 2002, 2010 Free Software Foundation, Inc. + + This file is part of GDB and GAS. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. + + Initially created by Kuang Hwa Lin, 2002. */ + +/* Following are the function codes for the Special OP (ALU). */ +#define ALUOP 0x00000000 +#define SPECIALOP 0x00000000 + +#define NOPF 0x00000000 +#define SLLF 0x00000004 +#define SRLF 0x00000006 +#define SRAF 0x00000007 + +#define SEQUF 0x00000010 +#define SNEUF 0x00000011 +#define SLTUF 0x00000012 +#define SGTUF 0x00000013 +#define SLEUF 0x00000014 +#define SGEUF 0x00000015 + +#define ADDF 0x00000020 +#define ADDUF 0x00000021 +#define SUBF 0x00000022 +#define SUBUF 0x00000023 +#define ANDF 0x00000024 +#define ORF 0x00000025 +#define XORF 0x00000026 + +#define SEQF 0x00000028 +#define SNEF 0x00000029 +#define SLTF 0x0000002A +#define SGTF 0x0000002B +#define SLEF 0x0000002C +#define SGEF 0x0000002D + /* Following special functions was not mentioned in the + Hennessy's book but was implemented in the RTL. */ +#define MVTSF 0x00000030 +#define MVFSF 0x00000031 +#define BSWAPF 0x00000032 +#define LUTF 0x00000033 +/* Following special functions was mentioned in the + Hennessy's book but was not implemented in the RTL. */ +#define MULTF 0x00000005 +#define MULTUF 0x00000006 +#define DIVF 0x00000007 +#define DIVUF 0x00000008 + + +/* Following are the rest of the OPcodes: + JOP = (0x002 << 26), JALOP = (0x003 << 26), BEQOP = (0x004 << 26), BNEOP = (0x005 << 26) + ADDIOP = (0x008 << 26), ADDUIOP= (0x009 << 26), SUBIOP = (0x00A << 26), SUBUIOP= (0x00B << 26) + ANDIOP = (0x00C << 26), ORIOP = (0x00D << 26), XORIOP = (0x00E << 26), LHIOP = (0x00F << 26) + RFEOP = (0x010 << 26), TRAPOP = (0x011 << 26), JROP = (0x012 << 26), JALROP = (0x013 << 26) + BREAKOP= (0x014 << 26) + SEQIOP = (0x018 << 26), SNEIOP = (0x019 << 26), SLTIOP = (0x01A << 26), SGTIOP = (0x01B << 26) + SLEIOP = (0x01C << 26), SGEIOP = (0x01D << 26) + LBOP = (0x020 << 26), LHOP = (0x021 << 26), LWOP = (0x023 << 26), LBUOP = (0x024 << 26) + LHUOP = (0x025 << 26), SBOP = (0x028 << 26), SHOP = (0x029 << 26), SWOP = (0x02B << 26) + LSBUOP = (0x026 << 26), LSHU = (0x027 << 26), LSW = (0x02C << 26), + SEQUIOP= (0x030 << 26), SNEUIOP= (0x031 << 26), SLTUIOP= (0x032 << 26), SGTUIOP= (0x033 << 26) + SLEUIOP= (0x034 << 26), SGEUIOP= (0x035 << 26) + SLLIOP = (0x036 << 26), SRLIOP = (0x037 << 26), SRAIOP = (0x038 << 26). */ +#define JOP 0x08000000 +#define JALOP 0x0c000000 +#define BEQOP 0x10000000 +#define BNEOP 0x14000000 + +#define ADDIOP 0x20000000 +#define ADDUIOP 0x24000000 +#define SUBIOP 0x28000000 +#define SUBUIOP 0x2c000000 +#define ANDIOP 0x30000000 +#define ORIOP 0x34000000 +#define XORIOP 0x38000000 +#define LHIOP 0x3c000000 +#define RFEOP 0x40000000 +#define TRAPOP 0x44000000 +#define JROP 0x48000000 +#define JALROP 0x4c000000 +#define BREAKOP 0x50000000 + +#define SEQIOP 0x60000000 +#define SNEIOP 0x64000000 +#define SLTIOP 0x68000000 +#define SGTIOP 0x6c000000 +#define SLEIOP 0x70000000 +#define SGEIOP 0x74000000 + +#define LBOP 0x80000000 +#define LHOP 0x84000000 +#define LWOP 0x8c000000 +#define LBUOP 0x90000000 +#define LHUOP 0x94000000 +#define LDSTBU +#define LDSTHU +#define SBOP 0xa0000000 +#define SHOP 0xa4000000 +#define SWOP 0xac000000 +#define LDST + +#define SEQUIOP 0xc0000000 +#define SNEUIOP 0xc4000000 +#define SLTUIOP 0xc8000000 +#define SGTUIOP 0xcc000000 +#define SLEUIOP 0xd0000000 +#define SGEUIOP 0xd4000000 + +#define SLLIOP 0xd8000000 +#define SRLIOP 0xdc000000 +#define SRAIOP 0xe0000000 + +/* Following 3 ops was added to provide the MP atonmic operation. */ +#define LSBUOP 0x98000000 +#define LSHUOP 0x9c000000 +#define LSWOP 0xb0000000 + +/* Following opcode was defined in the Hennessy's book as + "normal" opcode but was implemented in the RTL as special + functions. */ +#if 0 +#define MVTSOP 0x50000000 +#define MVFSOP 0x54000000 +#endif + +struct dlx_opcode +{ + /* Name of the instruction. */ + char *name; + + /* Opcode word. */ + unsigned long opcode; + + /* A string of characters which describe the operands. + Valid characters are: + , Itself. The character appears in the assembly code. + a rs1 The register number is in bits 21-25 of the instruction. + b rs2/rd The register number is in bits 16-20 of the instruction. + c rd. The register number is in bits 11-15 of the instruction. + f FUNC bits 0-10 of the instruction. + i An immediate operand is in bits 0-16 of the instruction. 0 extended + I An immediate operand is in bits 0-16 of the instruction. sign extended + d An 16 bit PC relative displacement. + D An immediate operand is in bits 0-25 of the instruction. + N No opperands needed, for nops. + P it can be a register or a 16 bit operand. */ + char *args; +}; + +static const struct dlx_opcode dlx_opcodes[] = + { + /* Arithmetic and Logic R-TYPE instructions. */ + { "nop", (ALUOP|NOPF), "N" }, /* NOP */ + { "add", (ALUOP|ADDF), "c,a,b" }, /* Add */ + { "addu", (ALUOP|ADDUF), "c,a,b" }, /* Add Unsigned */ + { "sub", (ALUOP|SUBF), "c,a,b" }, /* SUB */ + { "subu", (ALUOP|SUBUF), "c,a,b" }, /* Sub Unsigned */ + { "mult", (ALUOP|MULTF), "c,a,b" }, /* MULTIPLY */ + { "multu", (ALUOP|MULTUF), "c,a,b" }, /* MULTIPLY Unsigned */ + { "div", (ALUOP|DIVF), "c,a,b" }, /* DIVIDE */ + { "divu", (ALUOP|DIVUF), "c,a,b" }, /* DIVIDE Unsigned */ + { "and", (ALUOP|ANDF), "c,a,b" }, /* AND */ + { "or", (ALUOP|ORF), "c,a,b" }, /* OR */ + { "xor", (ALUOP|XORF), "c,a,b" }, /* Exclusive OR */ + { "sll", (ALUOP|SLLF), "c,a,b" }, /* SHIFT LEFT LOGICAL */ + { "sra", (ALUOP|SRAF), "c,a,b" }, /* SHIFT RIGHT ARITHMETIC */ + { "srl", (ALUOP|SRLF), "c,a,b" }, /* SHIFT RIGHT LOGICAL */ + { "seq", (ALUOP|SEQF), "c,a,b" }, /* Set if equal */ + { "sne", (ALUOP|SNEF), "c,a,b" }, /* Set if not equal */ + { "slt", (ALUOP|SLTF), "c,a,b" }, /* Set if less */ + { "sgt", (ALUOP|SGTF), "c,a,b" }, /* Set if greater */ + { "sle", (ALUOP|SLEF), "c,a,b" }, /* Set if less or equal */ + { "sge", (ALUOP|SGEF), "c,a,b" }, /* Set if greater or equal */ + { "sequ", (ALUOP|SEQUF), "c,a,b" }, /* Set if equal unsigned */ + { "sneu", (ALUOP|SNEUF), "c,a,b" }, /* Set if not equal unsigned */ + { "sltu", (ALUOP|SLTUF), "c,a,b" }, /* Set if less unsigned */ + { "sgtu", (ALUOP|SGTUF), "c,a,b" }, /* Set if greater unsigned */ + { "sleu", (ALUOP|SLEUF), "c,a,b" }, /* Set if less or equal unsigned*/ + { "sgeu", (ALUOP|SGEUF), "c,a,b" }, /* Set if greater or equal */ + { "mvts", (ALUOP|MVTSF), "c,a" }, /* Move to special register */ + { "mvfs", (ALUOP|MVFSF), "c,a" }, /* Move from special register */ + { "bswap", (ALUOP|BSWAPF), "c,a,b" }, /* ??? Was not documented */ + { "lut", (ALUOP|LUTF), "c,a,b" }, /* ????? same as above */ + + /* Arithmetic and Logical Immediate I-TYPE instructions. */ + { "addi", ADDIOP, "b,a,I" }, /* Add Immediate */ + { "addui", ADDUIOP, "b,a,i" }, /* Add Usigned Immediate */ + { "subi", SUBIOP, "b,a,I" }, /* Sub Immediate */ + { "subui", SUBUIOP, "b,a,i" }, /* Sub Unsigned Immedated */ + { "andi", ANDIOP, "b,a,i" }, /* AND Immediate */ + { "ori", ORIOP, "b,a,i" }, /* OR Immediate */ + { "xori", XORIOP, "b,a,i" }, /* Exclusive OR Immediate */ + { "slli", SLLIOP, "b,a,i" }, /* SHIFT LEFT LOCICAL Immediate */ + { "srai", SRAIOP, "b,a,i" }, /* SHIFT RIGHT ARITH. Immediate */ + { "srli", SRLIOP, "b,a,i" }, /* SHIFT RIGHT LOGICAL Immediate*/ + { "seqi", SEQIOP, "b,a,i" }, /* Set if equal */ + { "snei", SNEIOP, "b,a,i" }, /* Set if not equal */ + { "slti", SLTIOP, "b,a,i" }, /* Set if less */ + { "sgti", SGTIOP, "b,a,i" }, /* Set if greater */ + { "slei", SLEIOP, "b,a,i" }, /* Set if less or equal */ + { "sgei", SGEIOP, "b,a,i" }, /* Set if greater or equal */ + { "sequi", SEQUIOP, "b,a,i" }, /* Set if equal */ + { "sneui", SNEUIOP, "b,a,i" }, /* Set if not equal */ + { "sltui", SLTUIOP, "b,a,i" }, /* Set if less */ + { "sgtui", SGTUIOP, "b,a,i" }, /* Set if greater */ + { "sleui", SLEUIOP, "b,a,i" }, /* Set if less or equal */ + { "sgeui", SGEUIOP, "b,a,i" }, /* Set if greater or equal */ + /* Macros for I type instructions. */ + { "mov", ADDIOP, "b,P" }, /* a move macro */ + { "movu", ADDUIOP, "b,P" }, /* a move macro, unsigned */ + +#if 0 + /* Move special. */ + { "mvts", MVTSOP, "b,a" }, /* Move From Integer to Special */ + { "mvfs", MVFSOP, "b,a" }, /* Move From Special to Integer */ +#endif + + /* Load high Immediate I-TYPE instruction. */ + { "lhi", LHIOP, "b,i" }, /* Load High Immediate */ + { "lui", LHIOP, "b,i" }, /* Load High Immediate */ + { "sethi", LHIOP, "b,i" }, /* Load High Immediate */ + + /* LOAD/STORE BYTE 8 bits I-TYPE. */ + { "lb", LBOP, "b,a,I" }, /* Load Byte */ + { "lbu", LBUOP, "b,a,I" }, /* Load Byte Unsigned */ + { "ldstbu", LSBUOP, "b,a,I" }, /* Load store Byte Unsigned */ + { "sb", SBOP, "b,a,I" }, /* Store Byte */ + + /* LOAD/STORE HALFWORD 16 bits. */ + { "lh", LHOP, "b,a,I" }, /* Load Halfword */ + { "lhu", LHUOP, "b,a,I" }, /* Load Halfword Unsigned */ + { "ldsthu", LSHUOP, "b,a,I" }, /* Load Store Halfword Unsigned */ + { "sh", SHOP, "b,a,I" }, /* Store Halfword */ + + /* LOAD/STORE WORD 32 bits. */ + { "lw", LWOP, "b,a,I" }, /* Load Word */ + { "sw", SWOP, "b,a,I" }, /* Store Word */ + { "ldstw", LSWOP, "b,a,I" }, /* Load Store Word */ + + /* Branch PC-relative, 16 bits offset. */ + { "beqz", BEQOP, "a,d" }, /* Branch if a == 0 */ + { "bnez", BNEOP, "a,d" }, /* Branch if a != 0 */ + { "beq", BEQOP, "a,d" }, /* Branch if a == 0 */ + { "bne", BNEOP, "a,d" }, /* Branch if a != 0 */ + + /* Jumps Trap and RFE J-TYPE. */ + { "j", JOP, "D" }, /* Jump, PC-relative 26 bits */ + { "jal", JALOP, "D" }, /* JAL, PC-relative 26 bits */ + { "break", BREAKOP, "D" }, /* break to OS */ + { "trap" , TRAPOP, "D" }, /* TRAP to OS */ + { "rfe", RFEOP, "N" }, /* Return From Exception */ + /* Macros. */ + { "call", JOP, "D" }, /* Jump, PC-relative 26 bits */ + + /* Jumps Trap and RFE I-TYPE. */ + { "jr", JROP, "a" }, /* Jump Register, Abs (32 bits) */ + { "jalr", JALROP, "a" }, /* JALR, Abs (32 bits) */ + /* Macros. */ + { "retr", JROP, "a" }, /* Jump Register, Abs (32 bits) */ + + { "", 0x0, "" } /* Dummy entry, not included in NUM_OPCODES. + This lets code examine entry i + 1 without + checking if we've run off the end of the table. */ + }; + +const unsigned int num_dlx_opcodes = (((sizeof dlx_opcodes) / (sizeof dlx_opcodes[0])) - 1); diff --git a/include/opcode/h8300.h b/include/opcode/h8300.h new file mode 100644 index 0000000..3296deb --- /dev/null +++ b/include/opcode/h8300.h @@ -0,0 +1,1892 @@ +/* Opcode table for the H8/300 + Copyright 1991-2013 Free Software Foundation, Inc. + Written by Steve Chamberlain . + + This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* Instructions are stored as a sequence of nibbles. + If the nibble has value 15 or less than the representation is complete. + Otherwise, we record what it contains with several flags. */ + +typedef int op_type; + +enum h8_flags +{ + L_2 = 0x10, + L_3 = 0x20, + /* 3 bit constant, zero not accepted. */ + L_3NZ = 0x30, + L_4 = 0x40, + L_5 = 0x50, + L_8 = 0x60, + L_8U = 0x70, + L_16 = 0x80, + L_16U = 0x90, + L_24 = 0xA0, + L_32 = 0xB0, + L_P = 0xC0, + + /* Mask to isolate the L_x size bits. */ + SIZE = 0xF0, + + REG = 0x0100, + ABS = 0x0200, + MEMIND = 0x0300, + IMM = 0x0400, + DISP = 0x0500, + IND = 0x0600, + POSTINC = 0x0700, + POSTDEC = 0x0800, + PREINC = 0x0900, + PREDEC = 0x0A00, + PCREL = 0x0B00, + KBIT = 0x0C00, + DBIT = 0x0D00, + CONST_2 = 0x0E00, + CONST_4 = 0x0F00, + CONST_8 = 0x1000, + CONST_16 = 0x1100, + INDEXB = 0x1200, + INDEXW = 0x1300, + INDEXL = 0x1400, + PCIDXB = 0x1500, + PCIDXW = 0x1600, + PCIDXL = 0x1700, + VECIND = 0x1800, + LOWREG = 0x1900, + DATA = 0x2000, + + /* Synonyms. */ + INC = POSTINC, + DEC = PREDEC, + /* Control Registers. */ + CCR = 0x4000, + EXR = 0x4100, + MACH = 0x4200, + MACL = 0x4300, + RESERV1 = 0x4400, + RESERV2 = 0x4500, + VBR = 0x4600, + SBR = 0x4700, + MACREG = 0x4800, + CCR_EXR = 0x4900, + VBR_SBR = 0x4A00, + CC_EX_VB_SB = 0x4B00, + RESERV3 = 0x4C00, + RESERV4 = 0x4D00, + RESERV5 = 0x4E00, + RESERV6 = 0x4F00, + + /* Mask to isolate the addressing mode bits (REG .. PREDEC). */ + MODE = 0x7F00, + + CTRL = 0x4000, + + NO_SYMBOLS = 0x8000, + SRC = 0x10000, + DST = 0x20000, + OP3 = 0x40000, + MEMRELAX = 0x80000, /* Move insn which may relax. */ + + DISPREG = 0x100000, + IGNORE = 0x200000, + ABSJMP = 0x400000, + + B00 = 0x800000, /* Bit 0 must be low. */ + B01 = 0x1000000, /* Bit 0 must be high. */ + B10 = 0x2000000, /* Bit 1 must be low. */ + B11 = 0x4000000, /* Bit 1 must be high. */ + B20 = 0x8000000, /* Bit 2 must be low. */ + B21 = 0x10000000, /* Bit 2 must be high. */ + B30 = 0x20000000, /* Bit 3 must be low. */ + B31 = 0x40000000, /* Bit 3 must be high. */ + E = 0x80000000, /* End of nibble sequence. */ + + /* Immediates smaller than 8 bits are always unsigned. */ + IMM3 = IMM | L_3, + IMM4 = IMM | L_4, + IMM5 = IMM | L_5, + IMM3NZ = IMM | L_3NZ, + IMM2 = IMM | L_2, + + IMM8 = IMM | SRC | L_8, + IMM8U = IMM | SRC | L_8U, + IMM16 = IMM | SRC | L_16, + IMM16U = IMM | SRC | L_16U, + IMM32 = IMM | SRC | L_32, + + IMM3NZ_NS = IMM3NZ | NO_SYMBOLS, + IMM4_NS = IMM4 | NO_SYMBOLS, + IMM8U_NS = IMM8U | NO_SYMBOLS, + IMM16U_NS = IMM16U | NO_SYMBOLS, + + RD8 = DST | L_8 | REG, + RD16 = DST | L_16 | REG, + RD32 = DST | L_32 | REG, + R3_8 = OP3 | L_8 | REG, + R3_16 = OP3 | L_16 | REG, + R3_32 = OP3 | L_32 | REG, + RS8 = SRC | L_8 | REG, + RS16 = SRC | L_16 | REG, + RS32 = SRC | L_32 | REG, + + RSP = SRC | L_P | REG, + RDP = DST | L_P | REG, + + PCREL8 = PCREL | L_8, + PCREL16 = PCREL | L_16, + + OP3PCREL8 = OP3 | PCREL | L_8, + OP3PCREL16 = OP3 | PCREL | L_16, + + INDEXB16 = INDEXB | L_16, + INDEXW16 = INDEXW | L_16, + INDEXL16 = INDEXL | L_16, + INDEXB16D = INDEXB | L_16 | DST, + INDEXW16D = INDEXW | L_16 | DST, + INDEXL16D = INDEXL | L_16 | DST, + + INDEXB32 = INDEXB | L_32, + INDEXW32 = INDEXW | L_32, + INDEXL32 = INDEXL | L_32, + INDEXB32D = INDEXB | L_32 | DST, + INDEXW32D = INDEXW | L_32 | DST, + INDEXL32D = INDEXL | L_32 | DST, + + DISP2SRC = DISP | L_2 | SRC, + DISP16SRC = DISP | L_16 | SRC, + DISP32SRC = DISP | L_32 | SRC, + + DISP2DST = DISP | L_2 | DST, + DISP16DST = DISP | L_16 | DST, + DISP32DST = DISP | L_32 | DST, + + DSTDISPREG = DST | DISPREG, + SRCDISPREG = SRC | DISPREG, + + ABS8SRC = SRC | ABS | L_8, + ABS16SRC = SRC | ABS | L_16U, + ABS24SRC = SRC | ABS | L_24, + ABS32SRC = SRC | ABS | L_32, + + ABS8DST = DST | ABS | L_8, + ABS16DST = DST | ABS | L_16U, + ABS24DST = DST | ABS | L_24, + ABS32DST = DST | ABS | L_32, + + ABS8OP3 = OP3 | ABS | L_8, + ABS16OP3 = OP3 | ABS | L_16U, + ABS24OP3 = OP3 | ABS | L_24, + ABS32OP3 = OP3 | ABS | L_32, + + RDDEC = DST | DEC, + RSINC = SRC | INC, + RDINC = DST | INC, + + RSPOSTINC = SRC | POSTINC, + RDPOSTINC = DST | POSTINC, + RSPREINC = SRC | PREINC, + RDPREINC = DST | PREINC, + RSPOSTDEC = SRC | POSTDEC, + RDPOSTDEC = DST | POSTDEC, + RSPREDEC = SRC | PREDEC, + RDPREDEC = DST | PREDEC, + + RSIND = SRC | IND, + RDIND = DST | IND, + R3_IND = OP3 | IND, + +#define MS32 (SRC | L_32 | MACREG) +#define MD32 (DST | L_32 | MACREG) + +#if 1 + OR8 = RS8, /* ??? OR as in One Register. */ + OR16 = RS16, + OR32 = RS32, +#else + OR8 = RD8, + OR16 = RD16, + OR32 = RD32 +#endif +}; + +enum ctrlreg +{ + C_CCR = 0, + C_EXR = 1, + C_MACH = 2, + C_MACL = 3, + C_VBR = 6, + C_SBR = 7 +}; + +enum {MAX_CODE_NIBBLES = 33}; + +struct code +{ + op_type nib[MAX_CODE_NIBBLES]; +}; + +struct arg +{ + op_type nib[3]; +}; + +/* Availability of instructions on processor models. */ +enum h8_model +{ + AV_H8, + AV_H8H, + AV_H8S, + AV_H8SX +}; + +struct h8_opcode +{ + int how; + enum h8_model available; + int time; + char *name; + struct arg args; + struct code data; +}; + +#ifdef DEFINE_TABLE + +#define DATA2 DATA, DATA +#define DATA3 DATA, DATA, DATA +#define DATA5 DATA, DATA, DATA, DATA, DATA +#define DATA7 DATA, DATA, DATA, DATA, DATA, DATA, DATA + +#define IMM8LIST IMM8, DATA +#define IMM16LIST IMM16, DATA3 +#define IMM16ULIST IMM16U, DATA3 +#define IMM24LIST IMM24, DATA5 +#define IMM32LIST IMM32, DATA7 + +#define DISP16LIST DISP | L_16, DATA3 +#define DISP24LIST DISP | L_24, DATA5 +#define DISP32LIST DISP | L_32, DATA7 + +#define ABS8LIST ABS | L_8, DATA +#define ABS16LIST ABS | L_16U, DATA3 +#define ABS24LIST ABS | L_24, DATA5 +#define ABS32LIST ABS | L_32, DATA7 + +#define DSTABS8LIST DST | ABS | L_8, DATA +#define DSTABS16LIST DST | ABS | L_16U, DATA3 +#define DSTABS24LIST DST | ABS | L_24, DATA5 +#define DSTABS32LIST DST | ABS | L_32, DATA7 + +#define OP3ABS8LIST OP3 | ABS | L_8, DATA +#define OP3ABS16LIST OP3 | ABS | L_16, DATA3 +#define OP3ABS24LIST OP3 | ABS | L_24, DATA5 +#define OP3ABS32LIST OP3 | ABS | L_32, DATA7 + +#define DSTDISP16LIST DST | DISP | L_16, DATA3 +#define DSTDISP24LIST DST | DISP | L_24, DATA5 +#define DSTDISP32LIST DST | DISP | L_32, DATA7 + +#define A16LIST L_16, DATA3 +#define A24LIST L_24, DATA5 +#define A32LIST L_32, DATA7 + +/* Extended Operand Prefixes: */ + +#define PREFIX_010 0x0, 0x1, 0x0 +#define PREFIX_015 0x0, 0x1, 0x5 +#define PREFIX_017 0x0, 0x1, 0x7 + +#define PREFIX_0100 0x0, 0x1, 0x0, 0x0 +#define PREFIX_010_D2 0x0, 0x1, 0x0, B30 | B21 | DISP2SRC +#define PREFIX_0101 0x0, 0x1, 0x0, 0x1 +#define PREFIX_0102 0x0, 0x1, 0x0, 0x2 +#define PREFIX_0103 0x0, 0x1, 0x0, 0x3 +#define PREFIX_0104 0x0, 0x1, 0x0, 0x4 +#define PREFIX_0105 0x0, 0x1, 0x0, 0x5 +#define PREFIX_0106 0x0, 0x1, 0x0, 0x6 +#define PREFIX_0107 0x0, 0x1, 0x0, 0x7 +#define PREFIX_0108 0x0, 0x1, 0x0, 0x8 +#define PREFIX_0109 0x0, 0x1, 0x0, 0x9 +#define PREFIX_010A 0x0, 0x1, 0x0, 0xa +#define PREFIX_010D 0x0, 0x1, 0x0, 0xd +#define PREFIX_010E 0x0, 0x1, 0x0, 0xe + +#define PREFIX_0150 0x0, 0x1, 0x5, 0x0 +#define PREFIX_015_D2 0x0, 0x1, 0x5, B30 | B21 | DISP2SRC +#define PREFIX_0151 0x0, 0x1, 0x5, 0x1 +#define PREFIX_0152 0x0, 0x1, 0x5, 0x2 +#define PREFIX_0153 0x0, 0x1, 0x5, 0x3 +#define PREFIX_0154 0x0, 0x1, 0x5, 0x4 +#define PREFIX_0155 0x0, 0x1, 0x5, 0x5 +#define PREFIX_0156 0x0, 0x1, 0x5, 0x6 +#define PREFIX_0157 0x0, 0x1, 0x5, 0x7 +#define PREFIX_0158 0x0, 0x1, 0x5, 0x8 +#define PREFIX_0159 0x0, 0x1, 0x5, 0x9 +#define PREFIX_015A 0x0, 0x1, 0x5, 0xa +#define PREFIX_015D 0x0, 0x1, 0x5, 0xd +#define PREFIX_015E 0x0, 0x1, 0x5, 0xe +#define PREFIX_015F 0x0, 0x1, 0x5, 0xf + +#define PREFIX_0170 0x0, 0x1, 0x7, 0x0 +#define PREFIX_017_D2S 0x0, 0x1, 0x7, B30 | B21 | DISP2SRC +#define PREFIX_017_D2D 0x0, 0x1, 0x7, B30 | B21 | DISP2DST +#define PREFIX_0171 0x0, 0x1, 0x7, 0x1 +#define PREFIX_0172 0x0, 0x1, 0x7, 0x2 +#define PREFIX_0173 0x0, 0x1, 0x7, 0x3 +#define PREFIX_0174 0x0, 0x1, 0x7, 0x4 +#define PREFIX_0175 0x0, 0x1, 0x7, 0x5 +#define PREFIX_0176 0x0, 0x1, 0x7, 0x6 +#define PREFIX_0177 0x0, 0x1, 0x7, 0x7 +#define PREFIX_0178 0x0, 0x1, 0x7, 0x8 +#define PREFIX_0179 0x0, 0x1, 0x7, 0x9 +#define PREFIX_017A 0x0, 0x1, 0x7, 0xa +#define PREFIX_017D 0x0, 0x1, 0x7, 0xd +#define PREFIX_017E 0x0, 0x1, 0x7, 0xe +#define PREFIX_017F 0x0, 0x1, 0x7, 0xf + +#define PREFIX_6A15 0x6, 0xa, 0x1, 0x5 +#define PREFIX_6A35 0x6, 0xa, 0x3, 0x5 +#define PREFIX_6B15 0x6, 0xb, 0x1, 0x5 +#define PREFIX_6B35 0x6, 0xb, 0x3, 0x5 + +#define PREFIX_78R4 0x7, 0x8, B31 | DISPREG, 0x4 +#define PREFIX_78R5 0x7, 0x8, B31 | DISPREG, 0x5 +#define PREFIX_78R6 0x7, 0x8, B31 | DISPREG, 0x6 +#define PREFIX_78R7 0x7, 0x8, B31 | DISPREG, 0x7 + +#define PREFIX_78R4W 0x7, 0x8, B30 | DISPREG, 0x4 +#define PREFIX_78R5W 0x7, 0x8, B30 | DISPREG, 0x5 +#define PREFIX_78R6W 0x7, 0x8, B30 | DISPREG, 0x6 +#define PREFIX_78R7W 0x7, 0x8, B30 | DISPREG, 0x7 + +#define PREFIX_78R4WD 0x7, 0x8, B30 | DSTDISPREG, 0x4 +#define PREFIX_78R5WD 0x7, 0x8, B30 | DSTDISPREG, 0x5 +#define PREFIX_78R6WD 0x7, 0x8, B30 | DSTDISPREG, 0x6 +#define PREFIX_78R7WD 0x7, 0x8, B30 | DSTDISPREG, 0x7 + +#define PREFIX_7974 0x7, 0x9, 0x7, 0x4 +#define PREFIX_7A74 0x7, 0xa, 0x7, 0x4 +#define PREFIX_7A7C 0x7, 0xa, 0x7, 0xc + + +/* Source standard fragment: */ +#define FROM_IND 0, RSIND +#define FROM_POSTINC 8, RSPOSTINC +#define FROM_POSTDEC 10, RSPOSTDEC +#define FROM_PREINC 9, RSPREINC +#define FROM_PREDEC 11, RSPREDEC +#define FROM_DISP2 B30 | B20 | DISP2SRC, DISPREG +#define FROM_DISP16 12, B30 | DISPREG +#define FROM_DISP32 12, B31 | DISPREG +#define FROM_DISP16B 13, B30 | DISPREG +#define FROM_DISP16W 14, B30 | DISPREG +#define FROM_DISP16L 15, B30 | DISPREG +#define FROM_DISP32B 13, B31 | DISPREG +#define FROM_DISP32W 14, B31 | DISPREG +#define FROM_DISP32L 15, B31 | DISPREG +#define FROM_ABS16 4, B30 | IGNORE +#define FROM_ABS32 4, B31 | IGNORE + +/* Destination standard fragment: */ +#define TO_IND 0, RDIND +#define TO_IND_MOV 0, RDIND | B30 +#define TO_POSTINC 8, RDPOSTINC +#define TO_POSTINC_MOV 8, RDPOSTINC | B30 +#define TO_POSTDEC 10, RDPOSTDEC +#define TO_POSTDEC_MOV 10, RDPOSTDEC | B30 +#define TO_PREINC 9, RDPREINC +#define TO_PREINC_MOV 9, RDPREINC | B30 +#define TO_PREDEC 11, RDPREDEC +#define TO_PREDEC_MOV 11, RDPREDEC | B30 +#define TO_DISP2 B30 | B20 | DISP2DST, DSTDISPREG +#define TO_DISP2_MOV B30 | B20 | DISP2DST, DSTDISPREG | B30 +#define TO_DISP16 12, B30 | DSTDISPREG +#define TO_DISP32 12, B31 | DSTDISPREG +#define TO_DISP16B 13, B30 | DSTDISPREG +#define TO_DISP16W 14, B30 | DSTDISPREG +#define TO_DISP16L 15, B30 | DSTDISPREG +#define TO_DISP32B 13, B31 | DSTDISPREG +#define TO_DISP32W 14, B31 | DSTDISPREG +#define TO_DISP32L 15, B31 | DSTDISPREG +#define TO_ABS16 4, B30 | IGNORE +#define TO_ABS32 4, B31 | IGNORE + +/* Source fragment for three-word instruction: */ +#define TFROM_IND 6, 9, B30 | RSIND, 12 +#define TFROM_DISP2 6, 9, B30 | DISPREG, 12 +#define TFROM_ABS16 6, 11, B30 | B20 | B10 | IGNORE, 12, ABS16LIST +#define TFROM_ABS32 6, 11, B30 | B20 | B11 | IGNORE, 12, ABS32LIST +#define TFROM_POSTINC 6, 13, B30 | RSPOSTINC, 12 +#define TFROM_PREINC 6, 13, B30 | RSPREINC, 12 +#define TFROM_POSTDEC 6, 13, B30 | RSPOSTDEC, 12 +#define TFROM_PREDEC 6, 13, B30 | RSPREDEC, 12 +#define TFROM_DISP16 6, 15, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP32 6, 11, 2, 12, DISP32LIST +#define TFROM_DISP16B 6, 15, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP16W 6, 15, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP16L 6, 15, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP32B 6, 11, 2, 12, DISP32LIST +#define TFROM_DISP32W 6, 11, 2, 12, DISP32LIST +#define TFROM_DISP32L 6, 11, 2, 12, DISP32LIST +#define TFROM_ABS16W 6, 11, 1, 12, ABS16LIST +#define TFROM_ABS32W 6, 11, 3, 12, ABS32LIST + +/* Source fragment for three-word instruction: */ +#define TFROM_IND_B 6, 8, B30 | RSIND, 12 +#define TFROM_ABS16_B 6, 10, B30 | B20 | B10 | IGNORE, 12, ABS16LIST +#define TFROM_ABS32_B 6, 10, B30 | B20 | B11 | IGNORE, 12, ABS32LIST + +#define TFROM_DISP2_B 6, 8, B30 | DISPREG, 12 +#define TFROM_POSTINC_B 6, 12, B30 | RSPOSTINC, 12 +#define TFROM_PREINC_B 6, 12, B30 | RSPREINC, 12 +#define TFROM_POSTDEC_B 6, 12, B30 | RSPOSTDEC, 12 +#define TFROM_PREDEC_B 6, 12, B30 | RSPREDEC, 12 +#define TFROM_DISP16_B 6, 14, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP32_B 6, 10, 2, 12, DISP32LIST +#define TFROM_DISP16B_B 6, 14, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP16W_B 6, 14, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP16L_B 6, 14, B30 | DISPREG, 12, DISP16LIST +#define TFROM_DISP32B_B 6, 10, 2, 12, DISP32LIST +#define TFROM_DISP32W_B 6, 10, 2, 12, DISP32LIST +#define TFROM_DISP32L_B 6, 10, 2, 12, DISP32LIST + +#define TFROM_ABS16W_B 6, 10, 1, 12, ABS16LIST +#define TFROM_ABS32W_B 6, 10, 3, 12, ABS32LIST + +/* Extended Operand Class Expanders: */ + +#define MOVFROM_STD(CODE, PREFIX, NAME, SRC, SRC_INFIX) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, SRC_INFIX, TO_IND_MOV, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, SRC_INFIX, TO_POSTINC_MOV, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, SRC_INFIX, TO_POSTDEC_MOV, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, SRC_INFIX, TO_PREINC_MOV, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, SRC_INFIX, TO_PREDEC_MOV, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP2_MOV, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP16, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP32, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16B, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16W, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16L, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32B, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32W, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32L, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS16, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS32, DSTABS32LIST, E}}} + +#define MOVFROM_AD(CODE, PREFIX, NAME, SRC, SRC_INFIX, SRC_SUFFIX) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, SRC_INFIX, TO_IND_MOV, SRC_SUFFIX, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, SRC_INFIX, TO_POSTINC_MOV, SRC_SUFFIX, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, SRC_INFIX, TO_POSTDEC_MOV, SRC_SUFFIX, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, SRC_INFIX, TO_PREINC_MOV, SRC_SUFFIX, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, SRC_INFIX, TO_PREDEC_MOV, SRC_SUFFIX, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP2_MOV, SRC_SUFFIX, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP16, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, SRC_INFIX, TO_DISP32, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16B, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16W, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, SRC_INFIX, TO_DISP16L, SRC_SUFFIX, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32B, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32W, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, SRC_INFIX, TO_DISP32L, SRC_SUFFIX, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS16, SRC_SUFFIX, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, SRC_INFIX, TO_ABS32, SRC_SUFFIX, DSTABS32LIST, E}}} + +#define MOVFROM_IMM8(CODE, PREFIX, NAME, SRC) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, 0, RDIND, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, 8, RDPOSTINC, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, 10, RDPOSTDEC, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, 9, RDPREINC, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, 11, RDPREDEC, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, B30 | B20 | DISP2DST, DSTDISPREG, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, 12, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, 12, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, 13, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, 14, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, 15, B30 | DSTDISPREG, IMM8LIST, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, 13, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, 14, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, 15, B31 | DSTDISPREG, IMM8LIST, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, 4, B30 | IGNORE, IMM8LIST, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, 4, B31 | IGNORE, IMM8LIST, DSTABS32LIST, E}}} + +#define MOVFROM_IMM(CODE, PREFIX, NAME, SRC, LIST) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, LIST, 0, RDIND, DATA2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, LIST, 8, RDPOSTINC, DATA2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, LIST, 10, RDPOSTDEC, DATA2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, LIST, 9, RDPREINC, DATA2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, LIST, 11, RDPREDEC, DATA2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, LIST, B30 | B20 | DISP2DST, DSTDISPREG, DATA2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, LIST, 12, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, LIST, 12, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, LIST, 13, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, LIST, 14, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, LIST, 15, B30 | DSTDISPREG, DATA2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, LIST, 13, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, LIST, 14, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, LIST, 15, B31 | DSTDISPREG, DATA2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, LIST, 4, B30 | IGNORE, DATA2, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, LIST, 4, B31 | IGNORE, DATA2, DSTABS32LIST, E}}} + +#define MOVFROM_REG_BW(CODE, NAME, SRC, PREFIX, OP1, OP2, OP3, OP4, RELAX16) \ + {CODE, AV_H8, 4, NAME, {{SRC, RDIND, E}}, {{ 6, OP1, B31 | RDIND, SRC, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, 3, 6, OP3, B31 | RDPOSTINC, SRC, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, 1, 6, OP3, B31 | RDPOSTDEC, SRC, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, 2, 6, OP3, B31 | RDPREINC, SRC, E}}}, \ + {CODE, AV_H8, 6, NAME, {{SRC, RDPREDEC, E}}, {{ 6, OP3, B31 | RDPREDEC, SRC, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, B30 | B20 | DISP2DST, 6, OP1, B31 | DSTDISPREG, SRC, E}}}, \ + {CODE, AV_H8, 6, NAME, {{SRC, DISP16DST, E}}, {{ 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8, 6, NAME, {{SRC, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 0, 6, OP2, 10, SRC, MEMRELAX | DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, 1, 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, 2, 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, 3, 6, OP4, B31 | DSTDISPREG, SRC, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{7, 8, B30 | DSTDISPREG, 1, 6, OP2, 10, SRC, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{7, 8, B30 | DSTDISPREG, 2, 6, OP2, 10, SRC, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{7, 8, B30 | DSTDISPREG, 3, 6, OP2, 10, SRC, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8, 4, NAME, {{SRC, ABS16DST, E}}, {{ 6, OP2, 8, SRC, RELAX16 | DSTABS16LIST, E}}}, \ + {CODE, AV_H8, 6, NAME, {{SRC, ABS32DST, E}}, {{ 6, OP2, 10, SRC, MEMRELAX | DSTABS32LIST, E}}} + +#define MOVTO_REG_BW(CODE, NAME, DST, PREFIX, OP1, OP2, OP3, OP4, RELAX16) \ + {CODE, AV_H8, 4, NAME, {{RSIND, DST, E}}, {{ 6, OP1, B30 | RSIND, DST, E}}}, \ + {CODE, AV_H8, 6, NAME, {{RSPOSTINC, DST, E}}, {{ 6, OP3, B30 | RSPOSTINC, DST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, DST, E}}, {{PREFIX, 2, 6, OP3, B30 | RSPOSTDEC, DST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREINC, DST, E}}, {{PREFIX, 1, 6, OP3, B30 | RSPREINC, DST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREDEC, DST, E}}, {{PREFIX, 3, 6, OP3, B30 | RSPREDEC, DST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP2SRC, DST, E}}, {{PREFIX, B30 | B20 | DISP2SRC, 6, OP1, B30 | DISPREG, DST, E}}}, \ + {CODE, AV_H8, 6, NAME, {{DISP16SRC, DST, E}}, {{ 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ + {CODE, AV_H8, 6, NAME, {{DISP32SRC, DST, E}}, {{7, 8, B30 | DISPREG, 0, 6, OP2, 2, DST, MEMRELAX | DISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB16, DST, E}}, {{PREFIX, 1, 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW16, DST, E}}, {{PREFIX, 2, 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL16, DST, E}}, {{PREFIX, 3, 6, OP4, B30 | DISPREG, DST, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB32, DST, E}}, {{7, 8, B30 | DISPREG, 1, 6, OP2, 2, DST, DISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW32, DST, E}}, {{7, 8, B30 | DISPREG, 2, 6, OP2, 2, DST, DISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL32, DST, E}}, {{7, 8, B30 | DISPREG, 3, 6, OP2, 2, DST, DISP32LIST, E}}}, \ + {CODE, AV_H8, 4, NAME, {{ABS16SRC, DST, E}}, {{ 6, OP2, 0, DST, RELAX16 | ABS16LIST, E}}}, \ + {CODE, AV_H8, 6, NAME, {{ABS32SRC, DST, E}}, {{ 6, OP2, 2, DST, MEMRELAX | ABS32LIST, E}}} + +/* Expansion macros for two-word (plus data) instructions. */ + +/* Expansion from one source to "standard" destinations. */ +#define EXPAND2_STD_SRC(CODE, WEIGHT, NAME, SRC, PREFIX, NIB1, NIB2) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, TO_POSTINC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, TO_POSTDEC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, TO_PREINC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, TO_PREDEC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, TO_DISP2, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, TO_DISP16, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, TO_DISP32, NIB1, NIB2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, TO_DISP16B, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, TO_DISP16W, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, TO_DISP16L, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, TO_DISP32B, NIB1, NIB2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, TO_DISP32W, NIB1, NIB2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, TO_DISP32L, NIB1, NIB2, DSTDISP32LIST, E}}} + +/* Expansion from one destination to "standard" sources. */ +#define EXPAND2_STD_DST(CODE, WEIGHT, NAME, DST, PREFIX, NIB1, NIB2) \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, DST, E}}, {{PREFIX, FROM_POSTINC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, DST, E}}, {{PREFIX, FROM_POSTDEC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREINC, DST, E}}, {{PREFIX, FROM_PREINC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREDEC, DST, E}}, {{PREFIX, FROM_PREDEC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP2SRC, DST, E}}, {{PREFIX, FROM_DISP2, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP16SRC, DST, E}}, {{PREFIX, FROM_DISP16, NIB1, NIB2, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP32SRC, DST, E}}, {{PREFIX, FROM_DISP32, NIB1, NIB2, DISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB16, DST, E}}, {{PREFIX, FROM_DISP16B, NIB1, NIB2, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW16, DST, E}}, {{PREFIX, FROM_DISP16W, NIB1, NIB2, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL16, DST, E}}, {{PREFIX, FROM_DISP16L, NIB1, NIB2, DISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB32, DST, E}}, {{PREFIX, FROM_DISP32B, NIB1, NIB2, DISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW32, DST, E}}, {{PREFIX, FROM_DISP32W, NIB1, NIB2, DISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL32, DST, E}}, {{PREFIX, FROM_DISP32L, NIB1, NIB2, DISP32LIST, E}}} + +/* Expansion from immediate source to "standard" destinations. */ +#define EXPAND2_STD_IMM(CODE, WEIGHT, NAME, SRC, PREFIX, OPCODE, IGN, IMMLIST) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, TO_POSTINC, OPCODE, IGN, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, TO_POSTDEC, OPCODE, IGN, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, TO_PREINC, OPCODE, IGN, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, TO_PREDEC, OPCODE, IGN, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, TO_DISP2, OPCODE, IGN, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, TO_DISP16, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, TO_DISP32, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, TO_DISP16B, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, TO_DISP16W, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, TO_DISP16L, OPCODE, IGN, DSTDISP16LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, TO_DISP32B, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, TO_DISP32W, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, TO_DISP32L, OPCODE, IGN, DSTDISP32LIST, IMMLIST, E}}} + +/* Expansion from abs/disp source to "standard" destinations. */ +#define EXPAND2_STD_ABSDISP(CODE, WEIGHT, NAME, SRC, PREFIX, DSTLIST, NIB1, NIB2) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, DSTLIST, TO_POSTINC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, DSTLIST, TO_POSTDEC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, DSTLIST, TO_PREINC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, DSTLIST, TO_PREDEC, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, DSTLIST, TO_DISP2, NIB1, NIB2, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, DSTLIST, TO_DISP16, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, DSTLIST, TO_DISP32, NIB1, NIB2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, DSTLIST, TO_DISP16B, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, DSTLIST, TO_DISP16W, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, DSTLIST, TO_DISP16L, NIB1, NIB2, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, DSTLIST, TO_DISP32B, NIB1, NIB2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, DSTLIST, TO_DISP32W, NIB1, NIB2, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, DSTLIST, TO_DISP32L, NIB1, NIB2, DSTDISP32LIST, E}}} + +/* Expansion from ind source to "standard" destinations. */ +#define EXPAND2_STD_IND(CODE, WEIGHT, NAME, OPCODE, BIT) \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RDPOSTINC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_POSTINC, OPCODE, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RDPOSTDEC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_POSTDEC, OPCODE, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RDPREINC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_PREINC, OPCODE, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RDPREDEC, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_PREDEC, OPCODE, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, DISP2DST, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP2, OPCODE, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, DISP16DST, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, DISP32DST, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32, OPCODE, IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXB16D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16B, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXW16D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16W, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXL16D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP16L, OPCODE, IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXB32D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32B, OPCODE, IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXW32D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32W, OPCODE, IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, INDEXL32D, E}}, {{0x7, 0xc, BIT | RSIND, 0x5, TO_DISP32L, OPCODE, IGNORE, DSTDISP32LIST, E}}} + +/* Expansion macros for three word (plus data) instructions. */ + +#define EXPAND3_STD_SRC(CODE, WEIGHT, NAME, SRC, PREFIX, INFIX, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, INFIX, 8, RDPOSTINC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, INFIX, 10, RDPOSTDEC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, INFIX, 9, RDPREINC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, INFIX, 11, RDPREDEC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, INFIX, B30 | B20 | DISP2DST, DSTDISPREG, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, INFIX, 12, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, INFIX, 12, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, INFIX, 13, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, INFIX, 14, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, INFIX, 15, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, INFIX, 13, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, INFIX, 14, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, INFIX, 15, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}} + +#define EXPAND3_L_SRC(CODE, WEIGHT, NAME, SRC, PREFIX, INFIX, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDIND, E}}, {{PREFIX, INFIX, 0, RDIND, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTINC, E}}, {{PREFIX, INFIX, 8, RDPOSTINC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPOSTDEC, E}}, {{PREFIX, INFIX, 10, RDPOSTDEC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREINC, E}}, {{PREFIX, INFIX, 9, RDPREINC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, RDPREDEC, E}}, {{PREFIX, INFIX, 11, RDPREDEC, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP2DST, E}}, {{PREFIX, INFIX, B30 | B20 | DISP2DST, DSTDISPREG, OPCODE, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP16DST, E}}, {{PREFIX, INFIX, 12, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, DISP32DST, E}}, {{PREFIX, INFIX, 12, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB16D, E}}, {{PREFIX, INFIX, 13, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW16D, E}}, {{PREFIX, INFIX, 14, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL16D, E}}, {{PREFIX, INFIX, 15, B30 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXB32D, E}}, {{PREFIX, INFIX, 13, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXW32D, E}}, {{PREFIX, INFIX, 14, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, INDEXL32D, E}}, {{PREFIX, INFIX, 15, B31 | DSTDISPREG, OPCODE, B30 | IGNORE, DSTDISP32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS16DST, E}}, {{PREFIX, INFIX, 4, B30 | IGNORE, OPCODE, B30 | IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{SRC, ABS32DST, E}}, {{PREFIX, INFIX, 4, B31 | IGNORE, OPCODE, B30 | IGNORE, DSTABS32LIST, E}}} + + +#define EXPAND_STD_MATRIX_L(CODE, NAME, OPCODE) \ + EXPAND3_L_SRC (CODE, 6, NAME, RSIND, PREFIX_0104, TFROM_IND, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, RSPOSTINC, PREFIX_0104, TFROM_POSTINC, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, RSPOSTDEC, PREFIX_0106, TFROM_POSTDEC, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, RSPREINC, PREFIX_0105, TFROM_PREINC, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, RSPREDEC, PREFIX_0107, TFROM_PREDEC, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, DISP2SRC, PREFIX_010_D2, TFROM_DISP2, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, DISP16SRC, PREFIX_0104, TFROM_DISP16, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, DISP32SRC, PREFIX_78R4, TFROM_DISP32, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, INDEXB16, PREFIX_0105, TFROM_DISP16B, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, INDEXW16, PREFIX_0106, TFROM_DISP16W, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, INDEXL16, PREFIX_0107, TFROM_DISP16L, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, INDEXB32, PREFIX_78R5, TFROM_DISP32B, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, INDEXW32, PREFIX_78R6, TFROM_DISP32W, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, INDEXL32, PREFIX_78R7, TFROM_DISP32L, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, ABS16SRC, PREFIX_0104, TFROM_ABS16, OPCODE), \ + EXPAND3_L_SRC (CODE, 6, NAME, ABS32SRC, PREFIX_0104, TFROM_ABS32, OPCODE) + + +#define EXPAND_STD_MATRIX_W(CODE, NAME, OPCODE) \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTINC, PREFIX_0154, TFROM_POSTINC, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTDEC, PREFIX_0156, TFROM_POSTDEC, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPREINC, PREFIX_0155, TFROM_PREINC, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPREDEC, PREFIX_0157, TFROM_PREDEC, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, DISP2SRC, PREFIX_015_D2, TFROM_DISP2, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, DISP16SRC, PREFIX_0154, TFROM_DISP16, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, DISP32SRC, PREFIX_78R4W, TFROM_DISP32, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXB16, PREFIX_0155, TFROM_DISP16B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXW16, PREFIX_0156, TFROM_DISP16W, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXL16, PREFIX_0157, TFROM_DISP16L, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXB32, PREFIX_78R5W, TFROM_DISP32B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXW32, PREFIX_78R6W, TFROM_DISP32W, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXL32, PREFIX_78R7W, TFROM_DISP32L, OPCODE) + +#define EXPAND_STD_MATRIX_B(CODE, NAME, OPCODE) \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTINC, PREFIX_0174, TFROM_POSTINC_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPOSTDEC, PREFIX_0176, TFROM_POSTDEC_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPREINC, PREFIX_0175, TFROM_PREINC_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, RSPREDEC, PREFIX_0177, TFROM_PREDEC_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, DISP2SRC, PREFIX_017_D2S, TFROM_DISP2_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, DISP16SRC, PREFIX_0174, TFROM_DISP16_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, DISP32SRC, PREFIX_78R4W, TFROM_DISP32_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXB16, PREFIX_0175, TFROM_DISP16B_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXW16, PREFIX_0176, TFROM_DISP16W_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXL16, PREFIX_0177, TFROM_DISP16L_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXB32, PREFIX_78R5W, TFROM_DISP32B_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXW32, PREFIX_78R6W, TFROM_DISP32W_B, OPCODE), \ + EXPAND3_L_SRC (CODE, 4, NAME, INDEXL32, PREFIX_78R7W, TFROM_DISP32L_B, OPCODE) + + +/* Use the expansion macros to fill out the opcode table. */ + +#define EXPAND_FROM_REG8(CODE, NAME, OP1, OP2, OP3) \ + {CODE, AV_H8SX, 0, NAME, {{RS8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, OP1, OP2, RS8, IGNORE, E}}}, \ + EXPAND2_STD_SRC (CODE, 2, NAME, RS8, PREFIX_0179, OP3, RS8), \ + {CODE, AV_H8SX, 0, NAME, {{RS8, ABS8DST, E}}, {{0x7, 0xf, DSTABS8LIST, OP1, OP2, RS8, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RS8, ABS16DST, E}}, {{0x6, 0xa, 0x1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, RS8, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RS8, ABS32DST, E}}, {{0x6, 0xa, 0x3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, RS8, IGNORE, E}}} + +#define EXPAND_TO_REG8(CODE, NAME, OP1, OP2, OP3) \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RD8, E}}, {{0x7, 0xc, B30 | RSIND, IGNORE, OP1, OP2, IGNORE, RD8, E}}}, \ + EXPAND2_STD_DST (CODE, 2, NAME, RD8, PREFIX_017A, OP3, RD8), \ + {CODE, AV_H8SX, 0, NAME, {{ABS8SRC, RD8, E}}, {{0x7, 0xe, ABS8LIST, OP1, OP2, IGNORE, RD8, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RD8, E}}, {{0x6, 0xa, 0x1, B30 | IGNORE, ABS16LIST, OP1, OP2, IGNORE, RD8, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RD8, E}}, {{0x6, 0xa, 0x3, B30 | IGNORE, ABS32LIST, OP1, OP2, IGNORE, RD8, E}}} + +#define EXPAND_FROM_IND8(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RDIND, E}}, {{0x7, 0xc, B30 | RSIND, 0x5, TO_IND, OPCODE, IGNORE, E}}}, \ + EXPAND2_STD_IND (CODE, 2, NAME, OPCODE, B30), \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, ABS16DST, E}}, {{0x7, 0xc, B30 | RSIND, 0x5, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, ABS32DST, E}}, {{0x7, 0xc, B30 | RSIND, 0x5, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} + +#define EXPAND_FROM_ABS16_B(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RDIND, E}}, {{PREFIX_6A15, ABS16LIST, TO_IND, OPCODE, IGNORE, E}}}, \ + EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS16SRC, PREFIX_6A15, ABS16LIST, OPCODE, IGNORE), \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS16DST, E}}, {{PREFIX_6A15, ABS16LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS32DST, E}}, {{PREFIX_6A15, ABS16LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} + +#define EXPAND_FROM_ABS32_B(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RDIND, E}}, {{PREFIX_6A35, ABS32LIST, TO_IND, OPCODE, IGNORE, E}}}, \ + EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS32SRC, PREFIX_6A35, ABS32LIST, OPCODE, IGNORE), \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS16DST, E}}, {{PREFIX_6A35, ABS32LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS32DST, E}}, {{PREFIX_6A35, ABS32LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} + +#define EXPAND_FROM_IMM16_W(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{IMM16, RDIND, E}}, {{PREFIX_015E, TO_IND, OPCODE, IGNORE, IMM16LIST, E}}}, \ + EXPAND2_STD_IMM (CODE, 2, NAME, IMM16, PREFIX_015E, OPCODE, IGNORE, IMM16LIST), \ + {CODE, AV_H8SX, 0, NAME, {{IMM16, ABS16DST, E}}, {{PREFIX_015E, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, IMM16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM16, ABS32DST, E}}, {{PREFIX_015E, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, IMM16LIST, E}}} + +#define EXPAND_FROM_REG16(CODE, NAME, OP1, OP2, OP3) \ + {CODE, AV_H8, 2, NAME, {{RS16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, OP1, OP2, RS16, IGNORE, E}}}, \ + EXPAND2_STD_SRC (CODE, 2, NAME, RS16, PREFIX_0159, OP3, RS16), \ + {CODE, AV_H8SX, 0, NAME, {{RS16, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, RS16, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RS16, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, RS16, IGNORE, E}}} + +#define EXPAND_TO_REG16(CODE, NAME, OP1, OP2, OP3) \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RD16, E}}, {{0x7, 0xc, B31 | RSIND, IGNORE, OP1, OP2, IGNORE, RD16, E}}}, \ + EXPAND2_STD_DST (CODE, 2, NAME, RD16, PREFIX_015A, OP3, RD16), \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RD16, E}}, {{0x6, 0xb, 0x1, B30 | IGNORE, ABS16LIST, OP1, OP2, IGNORE, RD16, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RD16, E}}, {{0x6, 0xb, 0x3, B30 | IGNORE, ABS32LIST, OP1, OP2, IGNORE, RD16, E}}} + +#define EXPAND_FROM_IND16(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RDIND, E}}, {{0x7, 0xc, B31 | RSIND, 0x5, TO_IND, OPCODE, IGNORE, E}}}, \ + EXPAND2_STD_IND (CODE, 2, NAME, OPCODE, B31), \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, ABS16DST, E}}, {{0x7, 0xc, B31 | RSIND, 0x5, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, ABS32DST, E}}, {{0x7, 0xc, B31 | RSIND, 0x5, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} + +#define EXPAND_FROM_ABS16_W(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RDIND, E}}, {{PREFIX_6B15, ABS16LIST, TO_IND, OPCODE, IGNORE, E}}}, \ + EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS16SRC, PREFIX_6B15, ABS16LIST, OPCODE, IGNORE), \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS16DST, E}}, {{PREFIX_6B15, ABS16LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, ABS32DST, E}}, {{PREFIX_6B15, ABS16LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} + +#define EXPAND_FROM_ABS32_W(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RDIND, E}}, {{PREFIX_6B35, ABS32LIST, TO_IND, OPCODE, IGNORE, E}}}, \ + EXPAND2_STD_ABSDISP (CODE, 2, NAME, ABS32SRC, PREFIX_6B35, ABS32LIST, OPCODE, IGNORE), \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS16DST, E}}, {{PREFIX_6B35, ABS32LIST, TO_ABS16, OPCODE, IGNORE, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, ABS32DST, E}}, {{PREFIX_6B35, ABS32LIST, TO_ABS32, OPCODE, IGNORE, DSTABS32LIST, E}}} + +#define EXPAND_FROM_IMM16_L(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, RDIND, E}}, {{PREFIX_010E, TO_IND, OPCODE, B30 | IGNORE, IMM16ULIST, E}}}, \ + EXPAND2_STD_IMM (CODE, 2, NAME, IMM16U_NS, PREFIX_010E, OPCODE, B30 | IGNORE, IMM16ULIST), \ + {CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, ABS16DST, E}}, {{PREFIX_010E, TO_ABS16, OPCODE, B30 | IGNORE, DSTABS16LIST, IMM16ULIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, ABS32DST, E}}, {{PREFIX_010E, TO_ABS32, OPCODE, B30 | IGNORE, DSTABS32LIST, IMM16ULIST, E}}} + +#define EXPAND_FROM_IMM32_L(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{IMM32, RDIND, E}}, {{PREFIX_010E, TO_IND, OPCODE, B31 | IGNORE, IMM32LIST, E}}}, \ + EXPAND2_STD_IMM (CODE, 2, NAME, IMM32, PREFIX_010E, OPCODE, B31 | IGNORE, IMM32LIST), \ + {CODE, AV_H8SX, 0, NAME, {{IMM32, ABS16DST, E}}, {{PREFIX_010E, TO_ABS16, OPCODE, B31 | IGNORE, DSTABS16LIST, IMM32LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM32, ABS32DST, E}}, {{PREFIX_010E, TO_ABS32, OPCODE, B31 | IGNORE, DSTABS32LIST, IMM32LIST, E}}} + +#define EXPAND_FROM_REG32(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{RS32, RDIND, E}}, {{PREFIX_0109, TO_IND, OPCODE, B30 | RS32, E}}}, \ + EXPAND2_STD_SRC (CODE, 2, NAME, RS32, PREFIX_0109, OPCODE, B30 | RS32), \ + {CODE, AV_H8SX, 0, NAME, {{RS32, ABS16DST, E}}, {{PREFIX_0109, TO_ABS16, OPCODE, B30 | RS32, DSTABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RS32, ABS32DST, E}}, {{PREFIX_0109, TO_ABS32, OPCODE, B30 | RS32, DSTABS32LIST, E}}} + +#define EXPAND_TO_REG32(CODE, NAME, OPCODE) \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, RD32, E}}, {{PREFIX_010A, FROM_IND, OPCODE, B30 | RD32, E}}}, \ + EXPAND2_STD_DST (CODE, 2, NAME, RD32, PREFIX_010A, OPCODE, B30 | RD32), \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, RD32, E}}, {{PREFIX_010A, FROM_ABS16, OPCODE, B30 | RD32, ABS16LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, RD32, E}}, {{PREFIX_010A, FROM_ABS32, OPCODE, B30 | RD32, ABS32LIST, E}}} + + +#define EXPAND_TWOOP_B(CODE, NAME, OP1, OP2, OP3, OP4, BIT) \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, RDPOSTINC, E}}, {{PREFIX_0174, 0x6, 0xc, B30 | RDPOSTINC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, RDPREINC, E}}, {{PREFIX_0175, 0x6, 0xc, B30 | RDPREINC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, RDPREDEC, E}}, {{PREFIX_0177, 0x6, 0xc, B30 | RDPREDEC, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, DISP2DST, E}}, {{PREFIX_017_D2D, 0x6, 0x8, B30 | DSTDISPREG, B31 | B20 | IGNORE, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, DISP16DST, E}}, {{PREFIX_0174, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, DISP32DST, E}}, {{PREFIX_78R4WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXB16D, E}}, {{PREFIX_0175, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXW16D, E}}, {{PREFIX_0176, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXL16D, E}}, {{PREFIX_0177, 0x6, 0xe, B30 | DSTDISPREG, B31 | B20 | IGNORE, DSTDISP16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXB32D, E}}, {{PREFIX_78R5WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXW32D, E}}, {{PREFIX_78R6WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, INDEXL32D, E}}, {{PREFIX_78R7WD, 0x6, 0xa, 2, B31 | B20 | IGNORE, DSTDISP32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, ABS8DST, E}}, {{0x7, 0xf, DSTABS8LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, ABS16DST, E}}, {{0x6, 0xa, 0x1, B31 | B20 | IGNORE, DSTABS16LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{IMM8, ABS32DST, E}}, {{0x6, 0xa, 0x3, B31 | B20 | IGNORE, DSTABS32LIST, OP1, BIT | IGNORE, IMM8LIST, E}}}, \ + {CODE, AV_H8, 2, NAME, {{RS8, RD8, E}}, {{OP2, OP3, RS8, RD8, E}}}, \ + EXPAND_FROM_REG8 (CODE, NAME, OP2, OP3, OP4), \ + EXPAND_TO_REG8 (CODE, NAME, OP2, OP3, OP4), \ + EXPAND_FROM_IND8 (CODE, NAME, OP4), \ + EXPAND_STD_MATRIX_B (CODE, NAME, OP4), \ + EXPAND_FROM_ABS16_B (CODE, NAME, OP4), \ + EXPAND_FROM_ABS32_B (CODE, NAME, OP4) + +#define EXPAND_TWOOP_W(CODE, NAME, OP1, OP2, OP3) \ + {CODE, AV_H8H, 6, NAME, {{IMM16, RD16, E}}, {{0x7, 0x9, OP3, RD16, IMM16LIST, E}}}, \ + EXPAND_FROM_IMM16_W (CODE, NAME, OP3), \ + EXPAND_FROM_REG16 (CODE, NAME, OP1, OP2, OP3), \ + EXPAND_TO_REG16 (CODE, NAME, OP1, OP2, OP3), \ + EXPAND_FROM_IND16 (CODE, NAME, OP3), \ + EXPAND_STD_MATRIX_W (CODE, NAME, OP3), \ + EXPAND_FROM_ABS16_W (CODE, NAME, OP3), \ + EXPAND_FROM_ABS32_W (CODE, NAME, OP3) + +#define EXPAND_TWOOP_L(CODE, NAME, OP1) \ + {CODE, AV_H8SX, 0, NAME, {{IMM16U_NS, RD32, E}}, {{0x7, 0xa, OP1, B31 | RD32, IMM16ULIST, E}}}, \ + {CODE, AV_H8H, 6, NAME, {{IMM32, RD32, E}}, {{0x7, 0xa, OP1, B30 | RD32, IMM32LIST, E}}}, \ + EXPAND_FROM_IMM16_L (CODE, NAME, OP1), \ + EXPAND_FROM_IMM32_L (CODE, NAME, OP1), \ + EXPAND_FROM_REG32 (CODE, NAME, OP1), \ + EXPAND_TO_REG32 (CODE, NAME, OP1), \ + EXPAND_STD_MATRIX_L (CODE, NAME, OP1) + + +/* Old expanders: */ + +#define BITOP(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ + {code, AV_H8, 2, name, {{imm, RD8, E}}, {{op00, op01, imm, RD8, E}}}, \ + {code, AV_H8, 6, name, {{imm, RDIND, E}}, {{op10, op11, B30 | RDIND, 0, op00, op01, imm, 0, E}}}, \ + {code, AV_H8, 6, name, {{imm, ABS8DST, E}}, {{op20, op21, DSTABS8LIST, op00, op01, imm, 0, E}}}, \ + {code, AV_H8S, 6, name, {{imm, ABS16DST, E}}, {{0x6, 0xa, 0x1, op30, DST | MEMRELAX | ABS16LIST , op00, op01, imm, op4, E}}}, \ + {code, AV_H8S, 6, name, {{imm, ABS32DST, E}}, {{0x6, 0xa, 0x3, op30, DST | MEMRELAX | ABS32LIST , op00, op01, imm, op4, E}}} + +#define BITOP_B(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ + {code, AV_H8SX, 0, name, {{imm, RDIND, E}}, {{op10, op11, B30 | RDIND, 0, op00, op01, imm, op4, E}}}, \ + {code, AV_H8SX, 0, name, {{imm, ABS8DST, E}}, {{op20, op21, DSTABS8LIST, op00, op01, imm, op4, E}}}, \ + {code, AV_H8SX, 0, name, {{imm, ABS16DST, E}}, {{0x6, 0xa, 0x1, op30, DST | ABS16LIST, op00, op01, imm, op4, E}}}, \ + {code, AV_H8SX, 0, name, {{imm, ABS32DST, E}}, {{0x6, 0xa, 0x3, op30, DST | ABS32LIST, op00, op01, imm, op4, E}}} + +#define EBITOP(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ + BITOP(code, imm, name, op00+1, op01, op10, op11, op20, op21, op30, op4), \ + BITOP(code, RS8, name, op00, op01, op10, op11, op20, op21, op30, op4) + +#define EBITOP_B(code, imm, name, op00, op01, op10, op11, op20, op21, op30, op4) \ + BITOP_B(code, imm, name, op00+1, op01, op10, op11, op20, op21, op30, op4), \ + BITOP_B(code, RS8, name, op00, op01, op10, op11, op20, op21, op30, op4) + +#define WTWOP(code, name, op1, op2) \ + {code, AV_H8, 2, name, {{RS16, RD16, E}}, {{op1, op2, RS16, RD16, E}}} + +#define BRANCH(code, name, op) \ + {code, AV_H8H, 6, name, {{PCREL16, E}}, {{0x5, 0x8, op, 0x0, PCREL16, DATA3 | B00, E}}}, \ + {code, AV_H8, 4, name, {{PCREL8, E}}, {{0x4, op, PCREL8, DATA | B00, E}}} + + +#define UNOP(code, name, op1, op2) \ + {code, AV_H8, 2, name, {{OR8, E}}, {{op1, op2, 0, OR8, E}}} + +#define EXPAND_UNOP_STD_B(CODE, NAME, PREFIX, OP1, OP2, OP3) \ + {CODE, AV_H8, 2, NAME, {{OR8, E}}, {{ OP1, OP2, OP3, OR8, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, E}}, {{ 7, 13, B30 | RSIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, E}}, {{PREFIX, 4, 6, 12, B30 | RSPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, E}}, {{PREFIX, 6, 6, 12, B30 | RSPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREINC, E}}, {{PREFIX, 5, 6, 12, B30 | RSPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREDEC, E}}, {{PREFIX, 7, 6, 12, B30 | RSPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP2SRC, E}}, {{PREFIX, B30 | B21 | DISP2SRC, 6, 8, B30 | DISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP16SRC, E}}, {{PREFIX, 4, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP32SRC, E}}, {{7, 8, B30 | DISPREG, 4, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB16, E}}, {{PREFIX, 5, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW16, E}}, {{PREFIX, 6, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL16, E}}, {{PREFIX, 7, 6, 14, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB32, E}}, {{7, 8, B30 | DISPREG, 5, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW32, E}}, {{7, 8, B30 | DISPREG, 6, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL32, E}}, {{7, 8, B30 | DISPREG, 7, 6, 10, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS8SRC, E}}, {{ 7, 15, ABS8LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, E}}, {{ 6, 10, 1, B31 | IGNORE, ABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, E}}, {{ 6, 10, 3, B31 | IGNORE, ABS32LIST, OP1, OP2, OP3, IGNORE, E}}} + +#define EXPAND_UNOP_STD_W(CODE, NAME, PREFIX, OP1, OP2, OP3) \ + {CODE, AV_H8H, 2, NAME, {{OR16, E}}, {{ OP1, OP2, OP3, OR16, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, E}}, {{ 7, 13, B31 | RSIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RSPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RSPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RSPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RSPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP2SRC, E}}, {{PREFIX, B30 | B21 | DISP2SRC, 6, 9, B30 | DISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP16SRC, E}}, {{PREFIX, 4, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP32SRC, E}}, {{7, 8, B30 | DISPREG, 4, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB16, E}}, {{PREFIX, 5, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW16, E}}, {{PREFIX, 6, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL16, E}}, {{PREFIX, 7, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB32, E}}, {{7, 8, B30 | DISPREG, 5, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW32, E}}, {{7, 8, B30 | DISPREG, 6, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL32, E}}, {{7, 8, B30 | DISPREG, 7, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, E}}, {{ 6, 11, 1, B31 | IGNORE, ABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, E}}, {{ 6, 11, 3, B31 | IGNORE, ABS32LIST, OP1, OP2, OP3, IGNORE, E}}} + +#define EXPAND_UNOP_STD_L(CODE, NAME, PREFIX, OP1, OP2, OP3) \ + {CODE, AV_H8H, 2, NAME, {{OR32, E}}, {{ OP1, OP2, OP3, B30 | OR32, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSIND, E}}, {{PREFIX, 4, 6, 9, B30 | RSIND, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RSPOSTINC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RSPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RSPREINC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{RSPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RSPREDEC, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP2SRC, E}}, {{PREFIX, B30 | B21 | DISP2SRC, 6, 9, B30 | DISPREG, B31 | IGNORE, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP16SRC, E}}, {{PREFIX, 4, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{DISP32SRC, E}}, {{7, 8, B31 | DISPREG, 4, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB16, E}}, {{PREFIX, 5, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW16, E}}, {{PREFIX, 6, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL16, E}}, {{PREFIX, 7, 6, 15, B30 | DISPREG, B31 | IGNORE, DISP16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXB32, E}}, {{7, 8, B31 | DISPREG, 5, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXW32, E}}, {{7, 8, B31 | DISPREG, 6, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{INDEXL32, E}}, {{7, 8, B31 | DISPREG, 7, 6, 11, 2, B31 | IGNORE, DISP32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS16SRC, E}}, {{PREFIX, 4, 6, 11, 0, B31 | IGNORE, ABS16LIST, OP1, OP2, OP3, B30 | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{ABS32SRC, E}}, {{PREFIX, 4, 6, 11, 2, B31 | IGNORE, ABS32LIST, OP1, OP2, OP3, B30 | IGNORE, E}}} + +#define EXPAND_UNOP_EXTENDED_B(CODE, NAME, CONST, PREFIX, OP1, OP2, OP3) \ + {CODE, AV_H8, 2, NAME, {{CONST, RD8, E}}, {{ OP1, OP2, OP3, RD8, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDIND, E}}, {{ 7, 13, B30 | RDIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTINC, E}}, {{PREFIX, 4, 6, 12, B30 | RDPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTDEC, E}}, {{PREFIX, 6, 6, 12, B30 | RDPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPREINC, E}}, {{PREFIX, 5, 6, 12, B30 | RDPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPREDEC, E}}, {{PREFIX, 7, 6, 12, B30 | RDPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP2DST, E}}, {{PREFIX, B30 | B21 | DISP2DST, 6, 8, B30 | DSTDISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP16DST, E}}, {{PREFIX, 4, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 4, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB16D, E}}, {{PREFIX, 5, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW16D, E}}, {{PREFIX, 6, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL16D, E}}, {{PREFIX, 7, 6, 14, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB32D, E}}, {{7, 8, B30 | DSTDISPREG, 5, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW32D, E}}, {{7, 8, B30 | DSTDISPREG, 6, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL32D, E}}, {{7, 8, B30 | DSTDISPREG, 7, 6, 10, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS8DST, E}}, {{ 7, 15, DSTABS8LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS16DST, E}}, {{ 6, 10, 1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS32DST, E}}, {{ 6, 10, 3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, OP3, IGNORE, E}}} + +#define EXPAND_UNOP_EXTENDED_W(CODE, NAME, CONST, PREFIX, OP1, OP2, OP3) \ + {CODE, AV_H8, 2, NAME, {{CONST, RD16, E}}, {{ OP1, OP2, OP3, RD16, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDIND, E}}, {{ 7, 13, B31 | RDIND, IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RDPOSTINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RDPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RDPREINC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RDPREDEC, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP2DST, E}}, {{PREFIX, B30 | B21 | DISP2DST, 6, 9, B30 | DSTDISPREG, B31 | IGNORE, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP16DST, E}}, {{PREFIX, 4, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP32DST, E}}, {{7, 8, B30 | DSTDISPREG, 4, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB16D, E}}, {{PREFIX, 5, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW16D, E}}, {{PREFIX, 6, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL16D, E}}, {{PREFIX, 7, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB32D, E}}, {{7, 8, B30 | DSTDISPREG, 5, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW32D, E}}, {{7, 8, B30 | DSTDISPREG, 6, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL32D, E}}, {{7, 8, B30 | DSTDISPREG, 7, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS16DST, E}}, {{ 6, 11, 1, B31 | IGNORE, DSTABS16LIST, OP1, OP2, OP3, IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS32DST, E}}, {{ 6, 11, 3, B31 | IGNORE, DSTABS32LIST, OP1, OP2, OP3, IGNORE, E}}} + +#define EXPAND_UNOP_EXTENDED_L(CODE, NAME, CONST, PREFIX, OP1, OP2, OP3, BIT) \ + {CODE, AV_H8, 2, NAME, {{CONST, RD32, E}}, {{ OP1, OP2, OP3, BIT | RD32, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDIND, E}}, {{PREFIX, 4, 6, 9, B30 | RDIND, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTINC, E}}, {{PREFIX, 4, 6, 13, B30 | RDPOSTINC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPOSTDEC, E}}, {{PREFIX, 6, 6, 13, B30 | RDPOSTDEC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPREINC, E}}, {{PREFIX, 5, 6, 13, B30 | RDPREINC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, RDPREDEC, E}}, {{PREFIX, 7, 6, 13, B30 | RDPREDEC, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP2DST, E}}, {{PREFIX, B30 | B21 | DISP2DST, 6, 9, B30 | DSTDISPREG, B31 | IGNORE, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP16DST, E}}, {{PREFIX, 4, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, DISP32DST, E}}, {{7, 8, B31 | DSTDISPREG, 4, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB16D, E}}, {{PREFIX, 5, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW16D, E}}, {{PREFIX, 6, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL16D, E}}, {{PREFIX, 7, 6, 15, B30 | DSTDISPREG, B31 | IGNORE, DSTDISP16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXB32D, E}}, {{7, 8, B31 | DSTDISPREG, 5, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXW32D, E}}, {{7, 8, B31 | DSTDISPREG, 6, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, INDEXL32D, E}}, {{7, 8, B31 | DSTDISPREG, 7, 6, 11, 2, B31 | IGNORE, DSTDISP32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS16DST, E}}, {{PREFIX, 4, 6, 11, 0, B31 | IGNORE, DSTABS16LIST, OP1, OP2, OP3, BIT | IGNORE, E}}}, \ + {CODE, AV_H8SX, 0, NAME, {{CONST, ABS32DST, E}}, {{PREFIX, 4, 6, 11, 2, B31 | IGNORE, DSTABS32LIST, OP1, OP2, OP3, BIT | IGNORE, E}}} + +#define PREFIXLDC 0x0, 0x1, 0x4, B30 | CCR_EXR | DST +#define PREFIXSTC 0x0, 0x1, 0x4, B30 | CCR_EXR | SRC + +#define O(op, size) (op * 4 + size) +#define OP_SIZE(HOW) (HOW % 4) +#define OP_KIND(HOW) (HOW / 4) + +enum h8_asm_codes +{ + O_RECOMPILE = 0, + O_ADD, + O_ADDX, + O_AND, + O_BAND, + O_BRA, + O_BRAB, + O_BRAW, + O_BRAL, + O_BRAS, + O_BRABC, + O_BRABS, + O_BSRBC, + O_BSRBS, + O_BRN, + O_BHI, + O_BLS, + O_BCC, + O_BCS, + O_BNE, + O_BVC, + O_BVS, + O_BPL, + O_BMI, + O_BGE, + O_BLT, + O_BGT, + O_BLE, + O_ANDC, + O_BEQ, + O_BCLR, + O_BCLREQ, + O_BCLRNE, + O_BSETEQ, + O_BSETNE, + O_BFLD, + O_BFST, + O_BIAND, + O_BILD, + O_BIOR, + O_BIXOR, + O_BIST, + O_BISTZ, + O_BLD, + O_BNOT, + O_BOR, + O_BSET, + O_BSR, + O_BXOR, + O_CMP, + O_DAA, + O_DAS, + O_DEC, + O_DIVU, + O_DIVS, + O_DIVXU, + O_DIVXS, + O_INC, + O_LDC, + O_MOV, + O_MOVAB, + O_MOVAW, + O_MOVAL, + O_MOVMD, + O_MOVSD, + O_OR, + O_ROTL, + O_ROTR, + O_ROTXL, + O_ROTXR, + O_BPT, + O_SHAL, + O_SHAR, + O_SHLL, + O_SHLR, + O_SUB, + O_SUBS, + O_TRAPA, + O_XOR, + O_XORC, + O_BST, + O_BSTZ, + O_BTST, + O_EEPMOV, + O_EXTS, + O_EXTU, + O_JMP, + O_JSR, + O_MULU, + O_MULUU, + O_MULS, + O_MULSU, + O_MULXU, + O_MULXS, + O_NOP, + O_NOT, + O_ORC, + O_RTE, + O_RTEL, + O_STC, + O_SUBX, + O_NEG, + O_RTS, + O_RTSL, + O_SLEEP, + O_ILL, + O_ADDS, + O_SYSCALL, + O_TAS, + O_CLRMAC, + O_LDMAC, + O_MAC, + O_LDM, + O_STM, + O_STMAC, + O_LAST, + /* Change made for System Call processing. */ + O_SYS_CREAT, + O_SYS_OPEN, + O_SYS_READ, + O_SYS_WRITE, + O_SYS_LSEEK, + O_SYS_CLOSE, + O_SYS_STAT, + O_SYS_FSTAT, +/* Space reserved for future file I/O system calls. */ + O_SYS_CMDLINE + /* End of System Call specific Changes. */ +}; + +enum h8_size +{ + SB = 0, + SW = 1, + SL = 2, + SN = 3 +}; + + +/* FIXME: Lots of insns have "E, 0, 0, 0, 0" in the nibble code sequences. + Methinks the zeroes aren't necessary. Once confirmed, nuke 'em. */ + +struct h8_opcode h8_opcodes[] = +{ + {O (O_ADD, SB), AV_H8, 2, "add.b", {{IMM8, RD8, E}}, {{0x8, RD8, IMM8LIST, E}}}, + EXPAND_TWOOP_B (O (O_ADD, SB), "add.b", 0x8, 0x0, 0x8, 0x1, 0), + + {O (O_ADD, SW), AV_H8, 6, "add.w", {{RS16, RD16, E}}, {{0x0, 0x9, RS16, RD16, E}}}, + {O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, RD16, E}}, {{0x0, 0xa, B30 | IMM3NZ, RD16, E}}}, + {O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, 0x0, 0xa, B30 | IMM3NZ, IGNORE, E}}}, + {O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, 0x0, 0xa, B30 | IMM3NZ, IGNORE, E}}}, + {O (O_ADD, SW), AV_H8SX, 0, "add.w", {{IMM3NZ_NS, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, 0x0, 0xa, B30 | IMM3NZ, IGNORE, E}}}, + EXPAND_TWOOP_W (O (O_ADD, SW), "add.w", 0x0, 0x9, 0x1), + + {O (O_ADD, SL), AV_H8H, 6, "add.l", {{RS32, RD32, E}}, {{0x0, 0xa, B31 | RS32, B30 | RD32, E}}}, + {O (O_ADD, SL), AV_H8SX, 0, "add.l", {{IMM3NZ_NS, RD32, E}}, {{0x0, 0xa, B31 | IMM3NZ, B31 | RD32, E}}}, + EXPAND_TWOOP_L (O (O_ADD, SL), "add.l", 0x1), + + {O (O_ADDS, SL), AV_H8, 2, "adds", {{KBIT, RDP, E}}, {{0x0, 0xB,KBIT, RDP, E}}}, + + {O (O_ADDX, SB), AV_H8, 2, "addx", {{IMM8, RD8, E}}, {{0x9, RD8, IMM8LIST, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{IMM8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0x9, IGNORE, IMM8LIST, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{IMM8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0x9, IGNORE, IMM8LIST, E}}}, + {O (O_ADDX, SB), AV_H8, 2, "addx", {{RS8, RD8, E}}, {{0x0, 0xe, RS8, RD8, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RS8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0x0, 0xe, RS8, IGNORE, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RS8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0x0, 0xe, RS8, IGNORE, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSIND, RD8, E}}, {{0x7, 0xc, B30 | RSIND, IGNORE, 0x0, 0xe, IGNORE, RD8, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSPOSTDEC, RD8, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, B30 | B20 | IGNORE, 0x0, 0xe, IGNORE, RD8, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSIND, RDIND, E}}, {{PREFIX_0174, 0x6, 0x8, B30 | RSIND, 0xd, 0x0, RDIND, 0x1, IGNORE, E}}}, + {O (O_ADDX, SB), AV_H8SX, 0, "addx.b", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x1, IGNORE, E}}}, + + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{IMM16, RD16, E}}, {{PREFIX_0151, 0x7, 0x9, 0x1, RD16, IMM16LIST, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{IMM16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x7, 0x9, 0x1, IGNORE, IMM16LIST, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{IMM16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0x9, 0x1, IGNORE, IMM16LIST, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RS16, RD16, E}}, {{PREFIX_0151, 0x0, 0x9, RS16, RD16, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RS16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x0, 0x9, RS16, IGNORE, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RS16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x0, 0x9, RS16, IGNORE, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSIND, RD16, E}}, {{0x7, 0xc, B31 | RSIND, B01 | IGNORE, 0x0, 0x9, IGNORE, RD16, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSPOSTDEC, RD16, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x0, 0x9, IGNORE, RD16, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSIND, RDIND, E}}, {{PREFIX_0154, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x1, IGNORE, E}}}, + {O (O_ADDX, SW), AV_H8SX, 0, "addx.w", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x1, IGNORE, E}}}, + + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{IMM32, RD32, E}}, {{PREFIX_0101, 0x7, 0xa, 0x1, RD32, IMM32LIST, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{IMM32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x1, IGNORE, IMM32LIST, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{IMM32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x1, IGNORE, IMM32LIST, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RS32, RD32, E}}, {{PREFIX_0101, 0x0, 0xa, B31 | RS32, B30 | RD32, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RS32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | RS32, B30 | IGNORE, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RS32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | RS32, B30 | IGNORE, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSIND, RD32, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, B30 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | IGNORE, B30 | RD32, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSPOSTDEC, RD32, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x0, 0xa, B31 | IGNORE, B30 | RD32, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSIND, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x1, IGNORE, E}}}, + {O (O_ADDX, SL), AV_H8SX, 0, "addx.l", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x1, IGNORE, E}}}, + + {O (O_AND, SB), AV_H8, 2, "and.b", {{IMM8, RD8, E}}, {{0xe, RD8, IMM8LIST, E}}}, + EXPAND_TWOOP_B (O (O_AND, SB), "and.b", 0xe, 0x1, 0x6, 0x6, 0), + + {O (O_AND, SW), AV_H8, 2, "and.w", {{RS16, RD16, E}}, {{0x6, 0x6, RS16, RD16, E}}}, + EXPAND_TWOOP_W (O (O_AND, SW), "and.w", 0x6, 0x6, 0x6), + + {O (O_AND, SL), AV_H8H, 2, "and.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xF, 0x0, 0x6, 0x6, B30 | RS32, B30 | RD32, E}}}, + EXPAND_TWOOP_L (O (O_AND, SL), "and.l", 0x6), + + {O (O_ANDC, SB), AV_H8, 2, "andc", {{IMM8, CCR | DST, E}}, {{0x0, 0x6, IMM8LIST, E}}}, + {O (O_ANDC, SB), AV_H8S, 2, "andc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x6, IMM8LIST, E}}}, + + BRANCH (O (O_BRA, SB), "bra", 0x0), + + {O (O_BRAB, SB), AV_H8SX, 0, "bra", {{LOWREG | L_8, E}}, {{0x5, 0x9, LOWREG | L_8 | B30, 0x5, E}}}, + {O (O_BRAW, SW), AV_H8SX, 0, "bra", {{LOWREG | L_16, E}}, {{0x5, 0x9, LOWREG | L_16 | B30, 0x6, E}}}, + {O (O_BRAL, SL), AV_H8SX, 0, "bra", {{RS32, E}}, {{0x5, 0x9, RS32 | B30, 0x7, E}}}, + + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, RDIND, OP3PCREL8}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS8DST, OP3PCREL8}}, {{0x7, 0xE, DSTABS8LIST, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS16DST, OP3PCREL8}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS32DST, OP3PCREL8}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x4, B30 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, RDIND, OP3PCREL8}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS8DST, OP3PCREL8}}, {{0x7, 0xE, DSTABS8LIST, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS16DST, OP3PCREL8}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS32DST, OP3PCREL8}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x4, B31 | IMM3, OP3PCREL8, DATA, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABC, SB), AV_H8SX, 0, "bra/bc", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0x8, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BRABS, SB), AV_H8SX, 0, "bra/bs", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0x8, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + + {O (O_BRAS, SB), AV_H8SX, 0, "bra/s", {{PCREL8, E}}, {{0x4, 0x0, PCREL8, DATA | B01, E}}}, + + {O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBC, SB), AV_H8SX, 0, "bsr/bc", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0xC, B30 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, RDIND, OP3PCREL16}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, ABS8DST, OP3PCREL16}}, {{0x7, 0xE, DSTABS8LIST, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, ABS16DST, OP3PCREL16}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + {O (O_BSRBS, SB), AV_H8SX, 0, "bsr/bs", {{IMM3, ABS32DST, OP3PCREL16}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0x5, 0xC, B31 | IMM3, 0x0, OP3PCREL16, DATA3, E}}}, + + BRANCH (O (O_BRA, SB), "bt", 0x0), + BRANCH (O (O_BRN, SB), "brn", 0x1), + BRANCH (O (O_BRN, SB), "bf", 0x1), + BRANCH (O (O_BHI, SB), "bhi", 0x2), + BRANCH (O (O_BLS, SB), "bls", 0x3), + BRANCH (O (O_BCC, SB), "bcc", 0x4), + BRANCH (O (O_BCC, SB), "bhs", 0x4), + BRANCH (O (O_BCS, SB), "bcs", 0x5), + BRANCH (O (O_BCS, SB), "blo", 0x5), + BRANCH (O (O_BNE, SB), "bne", 0x6), + BRANCH (O (O_BEQ, SB), "beq", 0x7), + BRANCH (O (O_BVC, SB), "bvc", 0x8), + BRANCH (O (O_BVS, SB), "bvs", 0x9), + BRANCH (O (O_BPL, SB), "bpl", 0xA), + BRANCH (O (O_BMI, SB), "bmi", 0xB), + BRANCH (O (O_BGE, SB), "bge", 0xC), + BRANCH (O (O_BLT, SB), "blt", 0xD), + BRANCH (O (O_BGT, SB), "bgt", 0xE), + BRANCH (O (O_BLE, SB), "ble", 0xF), + + EBITOP (O (O_BCLR, SB), IMM3 | B30, "bclr", 0x6, 0x2, 0x7, 0xD, 0x7, 0xF, 0x8, 0), + BITOP (O (O_BAND, SB), IMM3 | B30, "band", 0x7, 0x6, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + BITOP (O (O_BIAND, SB), IMM3 | B31, "biand", 0x7, 0x6, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + BITOP (O (O_BILD, SB), IMM3 | B31, "bild", 0x7, 0x7, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + BITOP (O (O_BIOR, SB), IMM3 | B31, "bior", 0x7, 0x4, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + BITOP (O (O_BIST, SB), IMM3 | B31, "bist", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0), + BITOP (O (O_BIXOR, SB), IMM3 | B31, "bixor", 0x7, 0x5, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + BITOP (O (O_BLD, SB), IMM3 | B30, "bld", 0x7, 0x7, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + EBITOP (O (O_BNOT, SB), IMM3 | B30, "bnot", 0x6, 0x1, 0x7, 0xD, 0x7, 0xF, 0x8, 0), + BITOP (O (O_BOR, SB), IMM3 | B30, "bor", 0x7, 0x4, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + EBITOP (O (O_BSET, SB), IMM3 | B30, "bset", 0x6, 0x0, 0x7, 0xD, 0x7, 0xF, 0x8, 0), + BITOP (O (O_BST, SB), IMM3 | B30, "bst", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0), + EBITOP (O (O_BTST, SB), IMM3 | B30, "btst", 0x6, 0x3, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + BITOP (O (O_BXOR, SB), IMM3 | B30, "bxor", 0x7, 0x5, 0x7, 0xC, 0x7, 0xE, 0x0, 0), + + EBITOP_B (O (O_BCLREQ, SB), IMM3 | B30, "bclr/eq", 0x6, 0x2, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), + EBITOP_B (O (O_BCLRNE, SB), IMM3 | B30, "bclr/ne", 0x6, 0x2, 0x7, 0xD, 0x7, 0xF, 0x8, 0x6), + EBITOP_B (O (O_BSETEQ, SB), IMM3 | B30, "bset/eq", 0x6, 0x0, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), + EBITOP_B (O (O_BSETNE, SB), IMM3 | B30, "bset/ne", 0x6, 0x0, 0x7, 0xD, 0x7, 0xF, 0x8, 0x6), + BITOP_B (O (O_BISTZ, SB), IMM3 | B31, "bistz", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), + BITOP_B (O (O_BSTZ, SB), IMM3 | B30, "bstz", 0x6, 0x7, 0x7, 0xD, 0x7, 0xF, 0x8, 0x7), + + {O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, RDIND, R3_8}}, {{0x7, 0xC, B30 | RDIND, 0x0, 0xF, R3_8, IMM8LIST, E}}}, + {O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, ABS8DST, R3_8}}, {{0x7, 0xE, DSTABS8LIST, 0xF, R3_8, IMM8LIST, E}}}, + {O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, ABS16DST, R3_8}}, {{0x6, 0xA, 0x1, 0x0, DSTABS16LIST, 0xF, R3_8, IMM8LIST, E}}}, + {O (O_BFLD, SB), AV_H8SX, 0, "bfld", {{IMM8, ABS32DST, R3_8}}, {{0x6, 0xA, 0x3, 0x0, DSTABS32LIST, 0xF, R3_8, IMM8LIST, E}}}, + + /* Because the assembler treats SRC, DST and OP3 as ordinals, + I must designate the second argument, an immediate value, as DST. + May God have mercy on my soul. */ + {O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, R3_IND}}, {{0x7, 0xD, B30 | R3_IND, 0x0, 0xF, RS8, DST | IMM8LIST, E}}}, + {O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, ABS8OP3}}, {{0x7, 0xF, OP3ABS8LIST, 0xF, RS8, DST | IMM8LIST, E}}}, + {O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, ABS16OP3}}, {{0x6, 0xA, 0x1, 0x8, OP3ABS16LIST, 0xF, RS8, DST | IMM8LIST, E}}}, + {O (O_BFST, SB), AV_H8SX, 0, "bfst", {{RS8, DST | IMM8, ABS32OP3}}, {{0x6, 0xA, 0x3, 0x8, OP3ABS32LIST, 0xF, RS8, DST | IMM8LIST, E}}}, + + {O (O_BSR, SB), AV_H8, 6, "bsr", {{PCREL8, E}}, {{0x5, 0x5, PCREL8, DATA, E}}}, + {O (O_BSR, SB), AV_H8, 6, "bsr", {{PCREL16, E}}, {{0x5, 0xC, 0x0, 0x0, PCREL16, DATA3, E}}}, + {O (O_BSR, SB), AV_H8SX, 0, "bsr", {{LOWREG | L_8, E}}, {{0x5, 0xd, B30 | LOWREG | L_8, 0x5, E}}}, + {O (O_BSR, SW), AV_H8SX, 0, "bsr", {{LOWREG | L_16, E}}, {{0x5, 0xd, B30 | LOWREG | L_16, 0x6, E}}}, + {O (O_BSR, SL), AV_H8SX, 0, "bsr", {{OR32, E}}, {{0x5, 0xd, B30 | OR32, 0x7, E}}}, + + {O (O_CMP, SB), AV_H8, 2, "cmp.b", {{IMM8, RD8, E}}, {{0xa, RD8, IMM8LIST, E}}}, + EXPAND_TWOOP_B (O (O_CMP, SB), "cmp.b", 0xa, 0x1, 0xc, 0x2, B00), + + {O (O_CMP, SW), AV_H8, 2, "cmp.w", {{RS16, RD16, E}}, {{0x1, 0xd, RS16, RD16, E}}}, + {O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, RD16, E}}, {{0x1, 0xf, B30 | IMM3NZ, RD16, E}}}, + {O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, 0x1, 0xf, B30 | IMM3NZ, IGNORE, E}}}, + {O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, 0x1, 0xf, B30 | IMM3NZ, IGNORE, E}}}, + {O (O_CMP, SW), AV_H8SX, 0, "cmp.w", {{IMM3NZ_NS, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, 0x1, 0xf, B30 | IMM3NZ, IGNORE, E}}}, + EXPAND_TWOOP_W (O (O_CMP, SW), "cmp.w", 0x1, 0xd, 0x2), + + {O (O_CMP, SL), AV_H8H, 6, "cmp.l", {{RS32, RD32, E}}, {{0x1, 0xf, B31 | RS32, B30 | RD32, E}}}, + {O (O_CMP, SL), AV_H8SX, 0, "cmp.l", {{IMM3NZ_NS, RD32, E}}, {{0x1, 0xf, B31 | IMM3NZ, B31 | RD32, E}}}, + EXPAND_TWOOP_L (O (O_CMP, SL), "cmp.l", 0x2), + + UNOP (O (O_DAA, SB), "daa", 0x0, 0xF), + UNOP (O (O_DAS, SB), "das", 0x1, 0xF), + UNOP (O (O_DEC, SB), "dec.b", 0x1, 0xA), + + {O (O_DEC, SW), AV_H8H, 2, "dec.w", {{DBIT, RD16, E}}, {{0x1, 0xB, 0x5 | DBIT, RD16, E}}}, + {O (O_DEC, SL), AV_H8H, 2, "dec.l", {{DBIT, RD32, E}}, {{0x1, 0xB, 0x7 | DBIT, RD32 | B30, E}}}, + + {O (O_DIVS, SW), AV_H8SX, 0, "divs.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xd, 0x6, 0x5, 0x1, IMM4, RD16, E}}}, + {O (O_DIVS, SW), AV_H8SX, 0, "divs.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xd, 0x2, 0x5, 0x1, RS16, RD16, E}}}, + {O (O_DIVS, SL), AV_H8SX, 0, "divs.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xd, 0x6, 0x5, 0x3, IMM4, B30 | RD32, E}}}, + {O (O_DIVS, SL), AV_H8SX, 0, "divs.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xd, 0x2, 0x5, 0x3, B30 | RS32, B30 | RD32, E}}}, + + {O (O_DIVU, SW), AV_H8SX, 0, "divu.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xd, 0xe, 0x5, 0x1, IMM4, RD16, E}}}, + {O (O_DIVU, SW), AV_H8SX, 0, "divu.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xd, 0xa, 0x5, 0x1, RS16, RD16, E}}}, + {O (O_DIVU, SL), AV_H8SX, 0, "divu.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xd, 0xe, 0x5, 0x3, IMM4, B30 | RD32, E}}}, + {O (O_DIVU, SL), AV_H8SX, 0, "divu.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xd, 0xa, 0x5, 0x3, B30 | RS32, B30 | RD32, E}}}, + + {O (O_DIVXS, SB), AV_H8SX, 0, "divxs.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xD, 0x4, 0x5, 0x1, IMM4, RD16, E}}}, + {O (O_DIVXS, SB), AV_H8H, 13, "divxs.b", {{RS8, RD16, E}}, {{0x0, 0x1, 0xD, 0x0, 0x5, 0x1, RS8, RD16, E}}}, + {O (O_DIVXS, SW), AV_H8SX, 0, "divxs.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xD, 0x4, 0x5, 0x3, IMM4, B30 | RD32, E}}}, + {O (O_DIVXS, SW), AV_H8H, 21, "divxs.w", {{RS16, RD32, E}}, {{0x0, 0x1, 0xD, 0x0, 0x5, 0x3, RS16, B30 | RD32, E}}}, + + {O (O_DIVXU, SB), AV_H8SX, 0, "divxu.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xD, 0xC, 0x5, 0x1, IMM4, RD16, E}}}, + {O (O_DIVXU, SB), AV_H8, 13, "divxu.b", {{RS8, RD16, E}}, {{0x5, 0x1, RS8, RD16, E}}}, + {O (O_DIVXU, SW), AV_H8SX, 0, "divxu.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xD, 0xC, 0x5, 0x3, IMM4, B30 | RD32, E}}}, + {O (O_DIVXU, SW), AV_H8H, 21, "divxu.w", {{RS16, RD32, E}}, {{0x5, 0x3, RS16, B30 | RD32, E}}}, + + {O (O_EEPMOV, SB), AV_H8, 4, "eepmov.b", {{E}}, {{0x7, 0xB, 0x5, 0xC, 0x5, 0x9, 0x8, 0xF, E}}}, + {O (O_EEPMOV, SW), AV_H8H, 4, "eepmov.w", {{E}}, {{0x7, 0xB, 0xD, 0x4, 0x5, 0x9, 0x8, 0xF, E}}}, + + EXPAND_UNOP_STD_W (O (O_EXTS, SW), "exts.w", PREFIX_015, 0x1, 0x7, 0xd), + EXPAND_UNOP_STD_L (O (O_EXTS, SL), "exts.l", PREFIX_010, 0x1, 0x7, 0xf), + EXPAND_UNOP_EXTENDED_L (O (O_EXTS, SL), "exts.l", CONST_2, PREFIX_010, 0x1, 0x7, 0xe, 0), + EXPAND_UNOP_STD_W (O (O_EXTU, SW), "extu.w", PREFIX_015, 0x1, 0x7, 0x5), + EXPAND_UNOP_STD_L (O (O_EXTU, SL), "extu.l", PREFIX_010, 0x1, 0x7, 0x7), + EXPAND_UNOP_EXTENDED_L (O (O_EXTU, SL), "extu.l", CONST_2, PREFIX_010, 0x1, 0x7, 0x6, 0), + + UNOP (O (O_INC, SB), "inc", 0x0, 0xA), + + {O (O_INC, SW), AV_H8H, 2, "inc.w", {{DBIT, RD16, E}}, {{0x0, 0xB, 0x5 | DBIT, RD16, E}}}, + {O (O_INC, SL), AV_H8H, 2, "inc.l", {{DBIT, RD32, E}}, {{0x0, 0xB, 0x7 | DBIT, RD32 | B30, E}}}, + + {O (O_JMP, SN), AV_H8, 4, "jmp", {{RSIND, E}}, {{0x5, 0x9, B30 | RSIND, 0x0, E}}}, + {O (O_JMP, SN), AV_H8, 6, "jmp", {{ABSJMP | L_24, E}}, {{0x5, 0xA, SRC | ABSJMP | L_24, DATA5, E}}}, + + {O (O_JMP, SN), AV_H8SX, 0, "jmp", {{ABSJMP | L_32, E}}, {{0x5, 0x9, 0x0, 0x8, ABSJMP | L_32, DATA7, E}}}, + + {O (O_JMP, SN), AV_H8, 8, "jmp", {{MEMIND, E}}, {{0x5, 0xB, SRC | MEMIND, DATA, E}}}, + {O (O_JMP, SN), AV_H8SX, 0, "jmp", {{VECIND, E}}, {{0x5, 0x9, B31 | SRC | VECIND, DATA, E}}}, + + {O (O_JSR, SN), AV_H8, 6, "jsr", {{RSIND, E}}, {{0x5, 0xD, B30 | RSIND, 0x0, E}}}, + {O (O_JSR, SN), AV_H8, 8, "jsr", {{ABSJMP | L_24, E}}, {{0x5, 0xE, SRC | ABSJMP | L_24, DATA5, E}}}, + + {O (O_JSR, SN), AV_H8SX, 0, "jsr", {{ABSJMP | L_32, E}}, {{0x5, 0xD, 0x0, 0x8, ABSJMP | L_32, DATA7, E}}}, + + {O (O_JSR, SN), AV_H8, 8, "jsr", {{MEMIND, E}}, {{0x5, 0xF, SRC | MEMIND, DATA, E}}}, + {O (O_JSR, SN), AV_H8SX, 8, "jsr", {{VECIND, E}}, {{0x5, 0xD, SRC | VECIND, DATA, E}}}, + + {O (O_LDC, SB), AV_H8, 2, "ldc", {{IMM8, CCR | DST, E}}, {{ 0x0, 0x7, IMM8LIST, E}}}, + {O (O_LDC, SB), AV_H8S, 2, "ldc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x7, IMM8LIST, E}}}, + {O (O_LDC, SB), AV_H8, 2, "ldc", {{RS8, CCR | DST, E}}, {{0x0, 0x3, B30 | CCR | DST, RS8, E}}}, + {O (O_LDC, SB), AV_H8S, 2, "ldc", {{RS8, EXR | DST, E}}, {{0x0, 0x3, B30 | EXR | DST, RS8, E}}}, + {O (O_LDC, SW), AV_H8H, 2, "ldc", {{RSIND, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0x9, B30 | RSIND, IGNORE, E}}}, + {O (O_LDC, SW), AV_H8S, 2, "ldc", {{RSIND, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0x9, B30 | RSIND, IGNORE, E}}}, + {O (O_LDC, SW), AV_H8H, 2, "ldc", {{RSPOSTINC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xD, B30 | RSPOSTINC, IGNORE, E}}}, + {O (O_LDC, SW), AV_H8S, 2, "ldc", {{RSPOSTINC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xD, B30 | RSPOSTINC, IGNORE, E}}}, + {O (O_LDC, SW), AV_H8H, 2, "ldc", {{DISP16SRC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xF, B30 | DISPREG, IGNORE, SRC | DISP16LIST, E}}}, + {O (O_LDC, SW), AV_H8S, 2, "ldc", {{DISP16SRC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xF, B30 | DISPREG, IGNORE, SRC | DISP16LIST, E}}}, + {O (O_LDC, SW), AV_H8H, 2, "ldc", {{DISP32SRC, CCR | DST, E}}, {{PREFIXLDC, 0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xB, 0x2, IGNORE, SRC | DISP32LIST, E}}}, + {O (O_LDC, SW), AV_H8S, 2, "ldc", {{DISP32SRC, EXR | DST, E}}, {{PREFIXLDC, 0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xB, 0x2, IGNORE, SRC | DISP32LIST, E}}}, + {O (O_LDC, SW), AV_H8H, 2, "ldc", {{ABS16SRC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x0, IGNORE, SRC | ABS16LIST, E}}}, + {O (O_LDC, SW), AV_H8S, 2, "ldc", {{ABS16SRC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x0, IGNORE, SRC | ABS16LIST, E}}}, + {O (O_LDC, SW), AV_H8H, 2, "ldc", {{ABS32SRC, CCR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x2, IGNORE, SRC | MEMRELAX | ABS32LIST, E}}}, + {O (O_LDC, SW), AV_H8S, 2, "ldc", {{ABS32SRC, EXR | DST, E}}, {{PREFIXLDC, 0x6, 0xB, 0x2, IGNORE, SRC | MEMRELAX | ABS32LIST, E}}}, + + {O (O_LDC, SL), AV_H8SX, 0, "ldc", {{RS32, B30 | VBR_SBR | DST, E}}, {{0x0, 0x3, B30 | VBR_SBR | DST, RS32, E}}}, + + + {O (O_MOV, SB), AV_H8, 2, "mov.b", {{IMM8, RD8, E}}, {{0xF, RD8, IMM8LIST, E}}}, + {O (O_MOV, SB), AV_H8SX, 0, "mov.b", {{IMM4_NS, ABS16DST, E}}, {{0x6, 0xa, 0xd, IMM4, DSTABS16LIST, E}}}, + {O (O_MOV, SB), AV_H8SX, 0, "mov.b", {{IMM4_NS, ABS32DST, E}}, {{0x6, 0xa, 0xf, IMM4, DSTABS32LIST, E}}}, + MOVFROM_IMM8 (O (O_MOV, SB), PREFIX_017D, "mov.b", IMM8), + + {O (O_MOV, SB), AV_H8, 2, "mov.b", {{RS8, RD8, E}}, {{0x0, 0xC, RS8, RD8, E}}}, + MOVFROM_REG_BW (O (O_MOV, SB), "mov.b", RS8, PREFIX_017, 8, 10, 12, 14, MEMRELAX), + {O (O_MOV, SB), AV_H8, 4, "mov.b", {{RS8, ABS8DST, E}}, {{0x3, RS8, DSTABS8LIST, E}}}, + MOVTO_REG_BW (O (O_MOV, SB), "mov.b", RD8, PREFIX_017, 8, 10, 12, 14, MEMRELAX), + {O (O_MOV, SB), AV_H8, 4, "mov.b", {{ABS8SRC, RD8, E}}, {{0x2, RD8, ABS8LIST, E}}}, + + MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSIND, FROM_IND), + MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPOSTINC, FROM_POSTINC), + MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPOSTDEC, FROM_POSTDEC), + MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPREINC, FROM_PREINC), + MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", RSPREDEC, FROM_PREDEC), + MOVFROM_STD (O (O_MOV, SB), PREFIX_0178, "mov.b", DISP2SRC, FROM_DISP2), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", DISP16SRC, FROM_DISP16, DISP16LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", DISP32SRC, FROM_DISP32, DISP32LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXB16, FROM_DISP16B, DISP16LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXW16, FROM_DISP16W, DISP16LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXL16, FROM_DISP16L, DISP16LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXB32, FROM_DISP32B, DISP32LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXW32, FROM_DISP32W, DISP32LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", INDEXL32, FROM_DISP32L, DISP32LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", ABS16SRC, FROM_ABS16, ABS16LIST), + MOVFROM_AD (O (O_MOV, SB), PREFIX_0178, "mov.b", ABS32SRC, FROM_ABS32, ABS32LIST), + + {O (O_MOV, SW), AV_H8SX, 0, "mov.w", {{IMM3NZ_NS, RD16, E}}, {{0x0, 0xf, B30 | IMM3NZ, RD16, E}}}, + {O (O_MOV, SW), AV_H8, 4, "mov.w", {{IMM16, RD16, E}}, {{0x7, 0x9, 0x0, RD16, IMM16LIST, E}}}, + {O (O_MOV, SW), AV_H8SX, 0, "mov.w", {{IMM4_NS, ABS16DST, E}}, {{0x6, 0xb, 0xd, IMM4, DSTABS16LIST, E}}}, + {O (O_MOV, SW), AV_H8SX, 0, "mov.w", {{IMM4_NS, ABS32DST, E}}, {{0x6, 0xb, 0xf, IMM4, DSTABS32LIST, E}}}, + + MOVFROM_IMM8 (O (O_MOV, SW), PREFIX_015D, "mov.w", IMM8U_NS), + MOVFROM_IMM (O (O_MOV, SW), PREFIX_7974, "mov.w", IMM16, IMM16LIST), + + {O (O_MOV, SW), AV_H8, 2, "mov.w", {{RS16, RD16, E}}, {{0x0, 0xD, RS16, RD16, E}}}, + MOVFROM_REG_BW (O (O_MOV, SW), "mov.w", RS16, PREFIX_015, 9, 11, 13, 15, 0), + MOVTO_REG_BW (O (O_MOV, SW), "mov.w", RD16, PREFIX_015, 9, 11, 13, 15, 0), + + MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSIND, FROM_IND), + MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPOSTINC, FROM_POSTINC), + MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPOSTDEC, FROM_POSTDEC), + MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPREINC, FROM_PREINC), + MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", RSPREDEC, FROM_PREDEC), + MOVFROM_STD (O (O_MOV, SW), PREFIX_0158, "mov.w", DISP2SRC, FROM_DISP2), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", DISP16SRC, FROM_DISP16, DISP16LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", DISP32SRC, FROM_DISP32, DISP32LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXB16, FROM_DISP16B, DISP16LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXW16, FROM_DISP16W, DISP16LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXL16, FROM_DISP16L, DISP16LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXB32, FROM_DISP32B, DISP32LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXW32, FROM_DISP32W, DISP32LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", INDEXL32, FROM_DISP32L, DISP32LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", ABS16SRC, FROM_ABS16, ABS16LIST), + MOVFROM_AD (O (O_MOV, SW), PREFIX_0158, "mov.w", ABS32SRC, FROM_ABS32, ABS32LIST), + + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{IMM3NZ_NS, RD32, E}}, {{0x0, 0xf, B31 | IMM3NZ, B31 | RD32, E}}}, + + MOVFROM_IMM8 (O (O_MOV, SL), PREFIX_010D, "mov.l", IMM8U_NS), + MOVFROM_IMM (O (O_MOV, SL), PREFIX_7A7C, "mov.l", IMM16U_NS, IMM16ULIST), + + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{IMM16U_NS, RD32, E}}, {{0x7, 0xa, 0x0, B31 | RD32, IMM16ULIST, E}}}, + {O (O_MOV, SL), AV_H8H, 4, "mov.l", {{IMM32, RD32, E}}, {{0x7, 0xa, 0x0, B30 | RD32, IMM32LIST, E}}}, + + MOVFROM_IMM (O (O_MOV, SL), PREFIX_7A74, "mov.l", IMM32, IMM32LIST), + + {O (O_MOV, SL), AV_H8H, 2, "mov.l", {{RS32, RD32, E}}, {{0x0, 0xf, B31 | RS32, B30 | RD32, E}}}, + + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, RDIND, E}}, {{PREFIX_0100, 0x6, 0x9, B31 | RDIND, B30 | RS32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, RDPOSTINC, E}}, {{PREFIX_0103, 0x6, 0xd, B31 | RDPOSTINC, RS32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, RDPOSTDEC, E}}, {{PREFIX_0101, 0x6, 0xd, B31 | RDPOSTDEC, RS32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, RDPREINC, E}}, {{PREFIX_0102, 0x6, 0xd, B31 | RDPREINC, RS32, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, RDPREDEC, E}}, {{PREFIX_0100, 0x6, 0xd, B31 | RDPREDEC, RS32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, DISP2DST, E}}, {{PREFIX_010, B30 | B20 | DISP2DST, 0x6, 0x9, B31 | DSTDISPREG, RS32, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, DISP16DST, E}}, {{PREFIX_0100, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 6, "mov.l", {{RS32, DISP32DST, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x0, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100, 0x7, 0x8, B31 | DSTDISPREG, 0x0, 0x6, 0xb, 0xa, RS32, MEMRELAX | DSTDISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, DISP32DST, E}}, {{PREFIX_0100, 0x7, 0x8, DSTDISPREG, 0x0, 0x6, 0xb, 0xa, RS32, MEMRELAX | DSTDISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXB16D, E}}, {{PREFIX_0101, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXW16D, E}}, {{PREFIX_0102, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXL16D, E}}, {{PREFIX_0103, 0x6, 0xf, B31 | DSTDISPREG, RS32, DSTDISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXB32D, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x1, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXW32D, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x2, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RS32, INDEXL32D, E}}, {{0x7, 0x8, B31 | DSTDISPREG, 0x3, 0x6, 0xb, 0xa, RS32, DSTDISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, ABS16DST, E}}, {{PREFIX_0100, 0x6, 0xb, 0x8, RS32, DSTABS16LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RS32, ABS32DST, E}}, {{PREFIX_0100, 0x6, 0xb, 0xa, RS32, MEMRELAX | DSTABS32LIST, E}}}, + + {O (O_MOV, SL), AV_H8H, 4, "mov.l", {{RSIND, RD32, E}}, {{PREFIX_0100, 0x6, 0x9, B30 | RSIND, RD32, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{RSPOSTINC, RD32, E}}, {{PREFIX_0100, 0x6, 0xd, B30 | RSPOSTINC, RD32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RSPOSTDEC, RD32, E}}, {{PREFIX_0102, 0x6, 0xd, B30 | RSPOSTDEC, RD32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RSPREINC, RD32, E}}, {{PREFIX_0101, 0x6, 0xd, B30 | RSPREINC, RD32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{RSPREDEC, RD32, E}}, {{PREFIX_0103, 0x6, 0xd, B30 | RSPREDEC, RD32, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{DISP2SRC, RD32, E}}, {{PREFIX_010, B30 | B20 | DISP2SRC, 0x6, 0x9, B30 | DISPREG, RD32, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{DISP16SRC, RD32, E}}, {{PREFIX_0100, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 6, "mov.l", {{DISP32SRC, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x0, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{DISP32SRC, RD32, E}}, {{PREFIX_0100, 0x7, 0x8, B30 | DISPREG, 0x0, 0x6, 0xb, 0x2, RD32, MEMRELAX | SRC | DISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXB16, RD32, E}}, {{PREFIX_0101, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXW16, RD32, E}}, {{PREFIX_0102, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXL16, RD32, E}}, {{PREFIX_0103, 0x6, 0xf, B30 | DISPREG, RD32, SRC | DISP16LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXB32, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x1, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXW32, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x2, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8SX, 0, "mov.l", {{INDEXL32, RD32, E}}, {{0x7, 0x8, B31 | DISPREG, 0x3, 0x6, 0xb, 0x2, RD32, SRC | DISP32LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{ABS16SRC, RD32, E}}, {{PREFIX_0100, 0x6, 0xb, 0x0, RD32, SRC | ABS16LIST, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "mov.l", {{ABS32SRC, RD32, E}}, {{PREFIX_0100, 0x6, 0xb, 0x2, RD32, SRC | MEMRELAX | ABS32LIST, E}}}, + + MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSIND, FROM_IND), + MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPOSTINC, FROM_POSTINC), + MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPOSTDEC, FROM_POSTDEC), + MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPREINC, FROM_PREINC), + MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", RSPREDEC, FROM_PREDEC), + MOVFROM_STD (O (O_MOV, SL), PREFIX_0108, "mov.l", DISP2SRC, FROM_DISP2), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", DISP16SRC, FROM_DISP16, DISP16LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", DISP32SRC, FROM_DISP32, DISP32LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXB16, FROM_DISP16B, DISP16LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXW16, FROM_DISP16W, DISP16LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXL16, FROM_DISP16L, DISP16LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXB32, FROM_DISP32B, DISP32LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXW32, FROM_DISP32W, DISP32LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", INDEXL32, FROM_DISP32L, DISP32LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", ABS16SRC, FROM_ABS16, ABS16LIST), + MOVFROM_AD (O (O_MOV, SL), PREFIX_0108, "mov.l", ABS32SRC, FROM_ABS32, ABS32LIST), + +#define DO_MOVA1(TYPE, OP0, OP1) \ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B30 | R3_32, MEMRELAX | DISP16LIST, E}}}, \ +\ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B31 | R3_32, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B31 | R3_32, MEMRELAX | DISP32LIST, E}}} + +#define DO_MOVA2(TYPE, OP0, OP1, OP2) \ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B30 | R3_32, OP2, MEMRELAX | DISP16LIST, E}}}, \ +\ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0x8, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0x9, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xA, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xB, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, TYPE, R3_32}}, {{PREFIX_017F, OP0, OP1, 0xC, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}}, \ + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, TYPE, R3_32}}, {{PREFIX_015F, OP0, OP1, 0xD, B31 | R3_32, OP2, MEMRELAX | DISP32LIST, E}}} + + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, E}}, {{0x7, 0xA, 0x8, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, E}}, {{0x7, 0xA, 0x9, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, E}}, {{0x7, 0xA, 0xA, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, E}}, {{0x7, 0xA, 0xB, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, E}}, {{0x7, 0xA, 0xC, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, E}}, {{0x7, 0xA, 0xD, B31 | DISPREG, MEMRELAX | DISP16LIST, E}}}, + + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, E}}, {{0x7, 0xA, 0x8, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, E}}, {{0x7, 0xA, 0x9, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, E}}, {{0x7, 0xA, 0xA, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, E}}, {{0x7, 0xA, 0xB, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, E}}, {{0x7, 0xA, 0xC, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, E}}, {{0x7, 0xA, 0xD, B30 | DISPREG, MEMRELAX | DISP32LIST, E}}}, + + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB16, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0x8, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW16, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0x9, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB16, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xA, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW16, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xB, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB16, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xC, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW16, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xD, B31 | R3_32, MEMRELAX | DISP16LIST, E}}}, + + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXB32, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0x8, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAB, SL), AV_H8SX, 0, "mova/b.l", {{INDEXW32, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0x9, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXB32, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xA, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAW, SL), AV_H8SX, 0, "mova/w.l", {{INDEXW32, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xB, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXB32, RD8, R3_32}}, {{0x7, 0x8, RD8, 0x8, 0x7, 0xA, 0xC, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, + {O (O_MOVAL, SL), AV_H8SX, 0, "mova/l.l", {{INDEXW32, RD16, R3_32}}, {{0x7, 0x8, RD16, 0x9, 0x7, 0xA, 0xD, B30 | R3_32, MEMRELAX | DISP32LIST, E}}}, + + DO_MOVA1 (RDIND, 0x0, B30 | RDIND), + DO_MOVA1 (RDPOSTINC, 0x8, B30 | RDPOSTINC), + DO_MOVA1 (RDPOSTDEC, 0xA, B30 | RDPOSTDEC), + DO_MOVA1 (RDPREINC, 0x9, B30 | RDPREINC), + DO_MOVA1 (RDPREDEC, 0xB, B30 | RDPREDEC), + DO_MOVA1 (DISP2DST, B30 | B20 | DISP2DST, B30 | DSTDISPREG), + DO_MOVA2 (DISP16DST, 0xC, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), + DO_MOVA2 (DISP32DST, 0xC, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), + DO_MOVA2 (INDEXB16D, 0xD, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), + DO_MOVA2 (INDEXW16D, 0xE, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), + DO_MOVA2 (INDEXL16D, 0xF, B30 | DSTDISPREG, MEMRELAX | DSTDISP16LIST), + DO_MOVA2 (INDEXB32D, 0xD, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), + DO_MOVA2 (INDEXW32D, 0xE, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), + DO_MOVA2 (INDEXL32D, 0xF, B31 | DSTDISPREG, MEMRELAX | DSTDISP32LIST), + DO_MOVA2 (ABS16DST, 0x4, 0x0, MEMRELAX | DSTABS16LIST), + DO_MOVA2 (ABS32DST, 0x4, 0x8, MEMRELAX | DSTABS32LIST), + + {O (O_MOV, SB), AV_H8, 10, "movfpe", {{ABS16SRC, RD8, E}}, {{0x6, 0xA, 0x4, RD8, ABS16SRC, DATA3, E}}}, + {O (O_MOV, SB), AV_H8, 10, "movtpe", {{RS8, ABS16DST, E}}, {{0x6, 0xA, 0xC, RS8, ABS16DST, DATA3, E}}}, + + {O (O_MOVMD, SB), AV_H8SX, 0, "movmd.b", {{E}}, {{0x7, 0xb, 0x9, 0x4, E}}}, + {O (O_MOVMD, SW), AV_H8SX, 0, "movmd.w", {{E}}, {{0x7, 0xb, 0xa, 0x4, E}}}, + {O (O_MOVMD, SL), AV_H8SX, 0, "movmd.l", {{E}}, {{0x7, 0xb, 0xb, 0x4, E}}}, + {O (O_MOVSD, SB), AV_H8SX, 0, "movsd.b", {{PCREL16, E}}, {{0x7, 0xb, 0x8, 0x4, PCREL16, DATA3, E}}}, + + {O (O_MULS, SW), AV_H8SX, 0, "muls.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0x6, 0x5, 0x0, IMM4, RD16, E}}}, + {O (O_MULS, SW), AV_H8SX, 0, "muls.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xc, 0x2, 0x5, 0x0, RS16, RD16, E}}}, + {O (O_MULS, SL), AV_H8SX, 0, "muls.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0x6, 0x5, 0x2, IMM4, B30 | RD32, E}}}, + {O (O_MULS, SL), AV_H8SX, 0, "muls.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0x2, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, + + {O (O_MULU, SW), AV_H8SX, 0, "mulu.w", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0xe, 0x5, 0x0, IMM4, RD16, E}}}, + {O (O_MULU, SW), AV_H8SX, 0, "mulu.w", {{RS16, RD16, E}}, {{0x0, 0x1, 0xc, 0xa, 0x5, 0x0, RS16, RD16, E}}}, + {O (O_MULU, SL), AV_H8SX, 0, "mulu.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0xe, 0x5, 0x2, IMM4, B30 | RD32, E}}}, + {O (O_MULU, SL), AV_H8SX, 0, "mulu.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0xa, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, + + {O (O_MULSU, SL), AV_H8SX, 0, "muls/u.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0x7, 0x5, 0x2, IMM4, B30 | RD32, E}}}, + {O (O_MULSU, SL), AV_H8SX, 0, "muls/u.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0x3, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, + {O (O_MULUU, SL), AV_H8SX, 0, "mulu/u.l", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0xf, 0x5, 0x2, IMM4, B30 | RD32, E}}}, + {O (O_MULUU, SL), AV_H8SX, 0, "mulu/u.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xc, 0xb, 0x5, 0x2, B30 | RS32, B30 | RD32, E}}}, + + {O (O_MULXS, SB), AV_H8SX, 0, "mulxs.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0x4, 0x5, 0x0, IMM4, RD16, E}}}, + {O (O_MULXS, SB), AV_H8H, 20, "mulxs.b", {{RS8, RD16, E}}, {{0x0, 0x1, 0xc, 0x0, 0x5, 0x0, RS8, RD16, E}}}, + {O (O_MULXS, SW), AV_H8SX, 0, "mulxs.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0x4, 0x5, 0x2, IMM4, B30 | RD32, E}}}, + {O (O_MULXS, SW), AV_H8H, 20, "mulxs.w", {{RS16, RD32, E}}, {{0x0, 0x1, 0xc, 0x0, 0x5, 0x2, RS16, B30 | RD32, E}}}, + + {O (O_MULXU, SB), AV_H8SX, 0, "mulxu.b", {{IMM4, RD16, E}}, {{0x0, 0x1, 0xc, 0xc, 0x5, 0x0, IMM4, RD16, E}}}, + {O (O_MULXU, SB), AV_H8, 14, "mulxu.b", {{RS8, RD16, E}}, {{0x5, 0x0, RS8, RD16, E}}}, + {O (O_MULXU, SW), AV_H8SX, 0, "mulxu.w", {{IMM4, RD32, E}}, {{0x0, 0x1, 0xc, 0xc, 0x5, 0x2, IMM4, B30 | RD32, E}}}, + {O (O_MULXU, SW), AV_H8H, 14, "mulxu.w", {{RS16, RD32, E}}, {{0x5, 0x2, RS16, B30 | RD32, E}}}, + + EXPAND_UNOP_STD_B (O (O_NEG, SB), "neg.b", PREFIX_017, 0x1, 0x7, 0x8), + EXPAND_UNOP_STD_W (O (O_NEG, SW), "neg.w", PREFIX_015, 0x1, 0x7, 0x9), + EXPAND_UNOP_STD_L (O (O_NEG, SL), "neg.l", PREFIX_010, 0x1, 0x7, 0xb), + + {O (O_NOP, SN), AV_H8, 2, "nop", {{E}}, {{0x0, 0x0, 0x0, 0x0, E}}}, + + EXPAND_UNOP_STD_B (O (O_NOT, SB), "not.b", PREFIX_017, 0x1, 0x7, 0x0), + EXPAND_UNOP_STD_W (O (O_NOT, SW), "not.w", PREFIX_015, 0x1, 0x7, 0x1), + EXPAND_UNOP_STD_L (O (O_NOT, SL), "not.l", PREFIX_010, 0x1, 0x7, 0x3), + + {O (O_OR, SB), AV_H8, 2, "or.b", {{IMM8, RD8, E}}, {{0xc, RD8, IMM8LIST, E}}}, + EXPAND_TWOOP_B (O (O_OR, SB), "or.b", 0xc, 0x1, 0x4, 0x4, 0), + + {O (O_OR, SW), AV_H8, 2, "or.w", {{RS16, RD16, E}}, {{0x6, 0x4, RS16, RD16, E}}}, + EXPAND_TWOOP_W (O (O_OR, SW), "or.w", 0x6, 0x4, 0x4), + + {O (O_OR, SL), AV_H8H, 2, "or.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xF, 0x0, 0x6, 0x4, B30 | RS32, B30 | RD32, E}}}, + EXPAND_TWOOP_L (O (O_OR, SL), "or.l", 0x4), + + {O (O_ORC, SB), AV_H8, 2, "orc", {{IMM8, CCR | DST, E}}, {{0x0, 0x4, IMM8LIST, E}}}, + {O (O_ORC, SB), AV_H8S, 2, "orc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x4, IMM8LIST, E}}}, + + {O (O_MOV, SW), AV_H8, 6, "pop.w", {{OR16, E}}, {{0x6, 0xD, 0x7, OR16, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "pop.l", {{OR32, E}}, {{PREFIX_0100, 0x6, 0xD, 0x7, OR32 | B30, E}}}, + {O (O_MOV, SW), AV_H8, 6, "push.w", {{OR16, E}}, {{0x6, 0xD, 0xF, OR16, E}}}, + {O (O_MOV, SL), AV_H8H, 6, "push.l", {{OR32, E}}, {{PREFIX_0100, 0x6, 0xD, 0xF, OR32 | B30, E}}}, + + EXPAND_UNOP_STD_B (O (O_ROTL, SB), "rotl.b", PREFIX_017, 0x1, 0x2, 0x8), + EXPAND_UNOP_EXTENDED_B (O (O_ROTL, SB), "rotl.b", CONST_2, PREFIX_017, 0x1, 0x2, 0xc), + EXPAND_UNOP_STD_W (O (O_ROTL, SW), "rotl.w", PREFIX_015, 0x1, 0x2, 0x9), + EXPAND_UNOP_EXTENDED_W (O (O_ROTL, SW), "rotl.w", CONST_2, PREFIX_015, 0x1, 0x2, 0xd), + EXPAND_UNOP_STD_L (O (O_ROTL, SL), "rotl.l", PREFIX_010, 0x1, 0x2, 0xb), + EXPAND_UNOP_EXTENDED_L (O (O_ROTL, SL), "rotl.l", CONST_2, PREFIX_010, 0x1, 0x2, 0xf, B30), + EXPAND_UNOP_STD_B (O (O_ROTR, SB), "rotr.b", PREFIX_017, 0x1, 0x3, 0x8), + EXPAND_UNOP_EXTENDED_B (O (O_ROTR, SB), "rotr.b", CONST_2, PREFIX_017, 0x1, 0x3, 0xc), + EXPAND_UNOP_STD_W (O (O_ROTR, SW), "rotr.w", PREFIX_015, 0x1, 0x3, 0x9), + EXPAND_UNOP_EXTENDED_W (O (O_ROTR, SW), "rotr.w", CONST_2, PREFIX_015, 0x1, 0x3, 0xd), + EXPAND_UNOP_STD_L (O (O_ROTR, SL), "rotr.l", PREFIX_010, 0x1, 0x3, 0xb), + EXPAND_UNOP_EXTENDED_L (O (O_ROTR, SL), "rotr.l", CONST_2, PREFIX_010, 0x1, 0x3, 0xf, B30), + EXPAND_UNOP_STD_B (O (O_ROTXL, SB), "rotxl.b", PREFIX_017, 0x1, 0x2, 0x0), + EXPAND_UNOP_EXTENDED_B (O (O_ROTXL, SB), "rotxl.b", CONST_2, PREFIX_017, 0x1, 0x2, 0x4), + EXPAND_UNOP_STD_W (O (O_ROTXL, SW), "rotxl.w", PREFIX_015, 0x1, 0x2, 0x1), + EXPAND_UNOP_EXTENDED_W (O (O_ROTXL, SW), "rotxl.w", CONST_2, PREFIX_015, 0x1, 0x2, 0x5), + EXPAND_UNOP_STD_L (O (O_ROTXL, SL), "rotxl.l", PREFIX_010, 0x1, 0x2, 0x3), + EXPAND_UNOP_EXTENDED_L (O (O_ROTXL, SL), "rotxl.l", CONST_2, PREFIX_010, 0x1, 0x2, 0x7, B30), + EXPAND_UNOP_STD_B (O (O_ROTXR, SB), "rotxr.b", PREFIX_017, 0x1, 0x3, 0x0), + EXPAND_UNOP_EXTENDED_B (O (O_ROTXR, SB), "rotxr.b", CONST_2, PREFIX_017, 0x1, 0x3, 0x4), + EXPAND_UNOP_STD_W (O (O_ROTXR, SW), "rotxr.w", PREFIX_015, 0x1, 0x3, 0x1), + EXPAND_UNOP_EXTENDED_W (O (O_ROTXR, SW), "rotxr.w", CONST_2, PREFIX_015, 0x1, 0x3, 0x5), + EXPAND_UNOP_STD_L (O (O_ROTXR, SL), "rotxr.l", PREFIX_010, 0x1, 0x3, 0x3), + EXPAND_UNOP_EXTENDED_L (O (O_ROTXR, SL), "rotxr.l", CONST_2, PREFIX_010, 0x1, 0x3, 0x7, B30), + + + {O (O_BPT, SN), AV_H8, 10, "bpt", {{E}}, {{0x7, 0xA, 0xF, 0xF, E}}}, + {O (O_RTE, SN), AV_H8, 10, "rte", {{E}}, {{0x5, 0x6, 0x7, 0x0, E}}}, + {O (O_RTS, SN), AV_H8, 8, "rts", {{E}}, {{0x5, 0x4, 0x7, 0x0, E}}}, + {O (O_RTEL, SN), AV_H8SX, 0, "rte/l", {{RS32, RD32, E}}, {{0x5, 0x6, RS32 | B30, RD32 | B30, E}}}, + {O (O_RTSL, SN), AV_H8SX, 0, "rts/l", {{RS32, RD32, E}}, {{0x5, 0x4, RS32 | B30, RD32 | B30, E}}}, + + EXPAND_UNOP_STD_B (O (O_SHAL, SB), "shal.b", PREFIX_017, 0x1, 0x0, 0x8), + EXPAND_UNOP_EXTENDED_B (O (O_SHAL, SB), "shal.b", CONST_2, PREFIX_017, 0x1, 0x0, 0xc), + EXPAND_UNOP_STD_W (O (O_SHAL, SW), "shal.w", PREFIX_015, 0x1, 0x0, 0x9), + EXPAND_UNOP_EXTENDED_W (O (O_SHAL, SW), "shal.w", CONST_2, PREFIX_015, 0x1, 0x0, 0xd), + EXPAND_UNOP_STD_L (O (O_SHAL, SL), "shal.l", PREFIX_010, 0x1, 0x0, 0xb), + EXPAND_UNOP_EXTENDED_L (O (O_SHAL, SL), "shal.l", CONST_2, PREFIX_010, 0x1, 0x0, 0xf, B30), + EXPAND_UNOP_STD_B (O (O_SHAR, SB), "shar.b", PREFIX_017, 0x1, 0x1, 0x8), + EXPAND_UNOP_EXTENDED_B (O (O_SHAR, SB), "shar.b", CONST_2, PREFIX_017, 0x1, 0x1, 0xc), + EXPAND_UNOP_STD_W (O (O_SHAR, SW), "shar.w", PREFIX_015, 0x1, 0x1, 0x9), + EXPAND_UNOP_EXTENDED_W (O (O_SHAR, SW), "shar.w", CONST_2, PREFIX_015, 0x1, 0x1, 0xd), + EXPAND_UNOP_STD_L (O (O_SHAR, SL), "shar.l", PREFIX_010, 0x1, 0x1, 0xb), + EXPAND_UNOP_EXTENDED_L (O (O_SHAR, SL), "shar.l", CONST_2, PREFIX_010, 0x1, 0x1, 0xf, B30), + + EXPAND_UNOP_STD_B (O (O_SHLL, SB), "shll.b", PREFIX_017, 0x1, 0x0, 0x0), + + {O (O_SHLL, SB), AV_H8SX, 0, "shll.b", {{RS8, RD8, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x0, 0x0, RD8, E}}}, + + EXPAND_UNOP_EXTENDED_B (O (O_SHLL, SB), "shll.b", CONST_2, PREFIX_017, 0x1, 0x0, 0x4), + EXPAND_UNOP_EXTENDED_B (O (O_SHLL, SB), "shll.b", CONST_4, PREFIX_017, 0x1, 0x0, 0xa), + {O (O_SHLL, SB), AV_H8SX, 0, "shll.b", {{IMM5, RD8, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x0, 0x0, RD8, E}}}, + + EXPAND_UNOP_STD_W (O (O_SHLL, SW), "shll.w", PREFIX_015, 0x1, 0x0, 0x1), + + {O (O_SHLL, SW), AV_H8SX, 0, "shll.w", {{RS8, RD16, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x0, 0x1, RD16, E}}}, + + EXPAND_UNOP_EXTENDED_W (O (O_SHLL, SW), "shll.w", CONST_2, PREFIX_015, 0x1, 0x0, 0x5), + EXPAND_UNOP_EXTENDED_W (O (O_SHLL, SW), "shll.w", CONST_4, PREFIX_015, 0x1, 0x0, 0x2), + EXPAND_UNOP_EXTENDED_W (O (O_SHLL, SW), "shll.w", CONST_8, PREFIX_015, 0x1, 0x0, 0x6), + {O (O_SHLL, SW), AV_H8SX, 0, "shll.w", {{IMM5, RD16, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x0, 0x1, RD16, E}}}, + + EXPAND_UNOP_STD_L (O (O_SHLL, SL), "shll.l", PREFIX_010, 0x1, 0x0, 0x3), + + {O (O_SHLL, SL), AV_H8SX, 0, "shll.l", {{RS8, RD32, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x0, 0x3, B30 | RD32, E}}}, + + EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_2, PREFIX_010, 0x1, 0x0, 0x7, B30), + EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_4, PREFIX_010, 0x1, 0x0, 0x3, B31), + EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_8, PREFIX_010, 0x1, 0x0, 0x7, B31), + EXPAND_UNOP_EXTENDED_L (O (O_SHLL, SL), "shll.l", CONST_16, PREFIX_010, 0x1, 0x0, 0xf, B31), + {O (O_SHLL, SL), AV_H8SX, 0, "shll.l", {{IMM5, RD32, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x0, 0x3, B30 | RD32, E}}}, + + EXPAND_UNOP_STD_B (O (O_SHLR, SB), "shlr.b", PREFIX_017, 0x1, 0x1, 0x0), + + {O (O_SHLR, SB), AV_H8SX, 0, "shlr.b", {{RS8, RD8, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x1, 0x0, RD8, E}}}, + + EXPAND_UNOP_EXTENDED_B (O (O_SHLR, SB), "shlr.b", CONST_2, PREFIX_017, 0x1, 0x1, 0x4), + EXPAND_UNOP_EXTENDED_B (O (O_SHLR, SB), "shlr.b", CONST_4, PREFIX_017, 0x1, 0x1, 0xa), + {O (O_SHLR, SB), AV_H8SX, 0, "shlr.b", {{IMM5, RD8, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x1, 0x0, RD8, E}}}, + + EXPAND_UNOP_STD_W (O (O_SHLR, SW), "shlr.w", PREFIX_015, 0x1, 0x1, 0x1), + + {O (O_SHLR, SW), AV_H8SX, 0, "shlr.w", {{RS8, RD16, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x1, 0x1, RD16, E}}}, + + EXPAND_UNOP_EXTENDED_W (O (O_SHLR, SW), "shlr.w", CONST_2, PREFIX_015, 0x1, 0x1, 0x5), + EXPAND_UNOP_EXTENDED_W (O (O_SHLR, SW), "shlr.w", CONST_4, PREFIX_015, 0x1, 0x1, 0x2), + EXPAND_UNOP_EXTENDED_W (O (O_SHLR, SW), "shlr.w", CONST_8, PREFIX_015, 0x1, 0x1, 0x6), + {O (O_SHLR, SW), AV_H8SX, 0, "shlr.w", {{IMM5, RD16, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x1, 0x1, RD16, E}}}, + + EXPAND_UNOP_STD_L (O (O_SHLR, SL), "shlr.l", PREFIX_010, 0x1, 0x1, 0x3), + + {O (O_SHLR, SL), AV_H8SX, 0, "shlr.l", {{RS8, RD32, E}}, {{0x7, 0x8, RS8, 0x8, 0x1, 0x1, 0x3, B30 | RD32, E}}}, + + EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_2, PREFIX_010, 0x1, 0x1, 0x7, B30), + EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_4, PREFIX_010, 0x1, 0x1, 0x3, B31), + EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_8, PREFIX_010, 0x1, 0x1, 0x7, B31), + EXPAND_UNOP_EXTENDED_L (O (O_SHLR, SL), "shlr.l", CONST_16, PREFIX_010, 0x1, 0x1, 0xf, B31), + {O (O_SHLR, SL), AV_H8SX, 0, "shlr.l", {{IMM5, RD32, E}}, {{0x0, 0x3, B31 | IMM5, DATA, 0x1, 0x1, 0x3, B30 | RD32, E}}}, + + {O (O_SLEEP, SN), AV_H8, 2, "sleep", {{E}}, {{0x0, 0x1, 0x8, 0x0, E}}}, + + {O (O_STC, SB), AV_H8, 2, "stc", {{CCR | SRC, RD8, E}}, {{0x0, 0x2, B30 | CCR | SRC, RD8, E}}}, + {O (O_STC, SB), AV_H8S, 2, "stc", {{EXR | SRC, RD8, E}}, {{0x0, 0x2, B30 | EXR | SRC, RD8, E}}}, + {O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, RDIND, E}}, {{PREFIXSTC, 0x6, 0x9, B31 | RDIND, IGNORE, E}}}, + {O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, RDIND, E}}, {{PREFIXSTC, 0x6, 0x9, B31 | RDIND, IGNORE, E}}}, + {O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, RDPREDEC, E}}, {{PREFIXSTC, 0x6, 0xD, B31 | RDPREDEC, IGNORE, E}}}, + {O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, RDPREDEC, E}}, {{PREFIXSTC, 0x6, 0xD, B31 | RDPREDEC, IGNORE, E}}}, + {O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, DISP16DST, E}}, {{PREFIXSTC, 0x6, 0xF, B31 | DSTDISPREG, IGNORE, DSTDISP16LIST, E}}}, + {O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, DISP16DST, E}}, {{PREFIXSTC, 0x6, 0xF, B31 | DSTDISPREG, IGNORE, DSTDISP16LIST, E}}}, + {O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, DISP32DST, E}}, {{PREFIXSTC, 0x7, 0x8, B30 | DSTDISPREG, 0, 0x6, 0xB, 0xA, IGNORE, DSTDISP32LIST, E}}}, + {O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, DISP32DST, E}}, {{PREFIXSTC, 0x7, 0x8, B30 | DSTDISPREG, 0, 0x6, 0xB, 0xA, IGNORE, DSTDISP32LIST, E}}}, + {O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, ABS16DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0x8, IGNORE, DST | ABS16LIST, E}}}, + {O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, ABS16DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0x8, IGNORE, DST | ABS16LIST, E}}}, + {O (O_STC, SW), AV_H8H, 2, "stc", {{CCR | SRC, ABS32DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0xA, IGNORE, DST | MEMRELAX | ABS32LIST, E}}}, + {O (O_STC, SW), AV_H8S, 2, "stc", {{EXR | SRC, ABS32DST, E}}, {{PREFIXSTC, 0x6, 0xB, 0xA, IGNORE, DST | MEMRELAX | ABS32LIST, E}}}, + {O (O_STC, SL), AV_H8SX, 0, "stc", {{B30 | VBR_SBR | SRC, RD32, E}}, {{0x0, 0x2, B30 | VBR_SBR | SRC, RD32, E}}}, + + + EXPAND_TWOOP_B (O (O_SUB, SB), "sub.b", 0xa, 0x1, 0x8, 0x3, B01), + + {O (O_SUB, SW), AV_H8, 2, "sub.w", {{RS16, RD16, E}}, {{0x1, 0x9, RS16, RD16, E}}}, + {O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, RD16, E}}, {{0x1, 0xa, B30 | IMM3NZ, RD16, E}}}, + {O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, IGNORE, 0x1, 0xa, B30 | IMM3NZ, IGNORE, E}}}, + {O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, ABS16DST, E}}, {{0x6, 0xb, 0x1, B31 | IGNORE, DSTABS16LIST, 0x1, 0xa, B30 | IMM3NZ, IGNORE, E}}}, + {O (O_SUB, SW), AV_H8SX, 0, "sub.w", {{IMM3NZ_NS, ABS32DST, E}}, {{0x6, 0xb, 0x3, B31 | IGNORE, DSTABS32LIST, 0x1, 0xa, B30 | IMM3NZ, IGNORE, E}}}, + EXPAND_TWOOP_W (O (O_SUB, SW), "sub.w", 0x1, 0x9, 0x3), + + {O (O_SUB, SL), AV_H8H, 6, "sub.l", {{RS32, RD32, E}}, {{0x1, 0xa, B31 | RS32, B30 | RD32, E}}}, + {O (O_SUB, SL), AV_H8SX, 0, "sub.l", {{IMM3NZ_NS, RD32, E}}, {{0x1, 0xa, B31 | IMM3NZ, B31 | RD32, E}}}, + EXPAND_TWOOP_L (O (O_SUB, SL), "sub.l", 0x3), + + {O (O_SUBS, SL), AV_H8, 2, "subs", {{KBIT, RDP, E}}, {{0x1, 0xB,KBIT, RDP, E}}}, + + {O (O_SUBX, SB), AV_H8, 2, "subx", {{IMM8, RD8, E}}, {{0xb, RD8, IMM8LIST, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{IMM8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0xb, IGNORE, IMM8LIST, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{IMM8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0xb, IGNORE, IMM8LIST, E}}}, + {O (O_SUBX, SB), AV_H8, 2, "subx", {{RS8, RD8, E}}, {{0x1, 0xe, RS8, RD8, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RS8, RDIND, E}}, {{0x7, 0xd, B30 | RDIND, IGNORE, 0x1, 0xe, RS8, IGNORE, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RS8, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RDPOSTDEC, B31 | IGNORE, 0x1, 0xe, RS8, IGNORE, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSIND, RD8, E}}, {{0x7, 0xc, B30 | RSIND, IGNORE, 0x1, 0xe, IGNORE, RD8, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSPOSTDEC, RD8, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, B30 | B20 | IGNORE, 0x1, 0xe, IGNORE, RD8, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSIND, RDIND, E}}, {{PREFIX_0174, 0x6, 0x8, B30 | RSIND, 0xd, 0x0, RDIND, 0x3, IGNORE, E}}}, + {O (O_SUBX, SB), AV_H8SX, 0, "subx.b", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0176, 0x6, 0xc, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x3, IGNORE, E}}}, + + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{IMM16, RD16, E}}, {{PREFIX_0151, 0x7, 0x9, 0x3, RD16, IMM16LIST, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{IMM16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x7, 0x9, 0x3, IGNORE, IMM16LIST, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{IMM16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0x9, 0x3, IGNORE, IMM16LIST, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RS16, RD16, E}}, {{PREFIX_0151, 0x1, 0x9, RS16, RD16, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RS16, RDIND, E}}, {{0x7, 0xd, B31 | RDIND, B01 | IGNORE, 0x1, 0x9, RS16, IGNORE, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RS16, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x1, 0x9, RS16, IGNORE, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSIND, RD16, E}}, {{0x7, 0xc, B31 | RSIND, B01 | IGNORE, 0x1, 0x9, IGNORE, RD16, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSPOSTDEC, RD16, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x1, 0x9, IGNORE, RD16, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSIND, RDIND, E}}, {{PREFIX_0154, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x3, IGNORE, E}}}, + {O (O_SUBX, SW), AV_H8SX, 0, "subx.w", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0156, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x3, IGNORE, E}}}, + + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{IMM32, RD32, E}}, {{PREFIX_0101, 0x7, 0xa, 0x3, RD32, IMM32LIST, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{IMM32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x3, IGNORE, IMM32LIST, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{IMM32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x7, 0xa, 0x3, IGNORE, IMM32LIST, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RS32, RD32, E}}, {{PREFIX_0101, 0x1, 0xa, B31 | RS32, B30 | RD32, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RS32, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RDIND, B31 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | RS32, B30 | IGNORE, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RS32, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RDPOSTDEC, B31 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | RS32, B30 | IGNORE, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSIND, RD32, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, B30 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | IGNORE, B30 | RD32, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSPOSTDEC, RD32, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, B30 | B20 | B01 | IGNORE, 0x1, 0xa, B31 | IGNORE, B30 | RD32, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSIND, RDIND, E}}, {{PREFIX_0104, 0x6, 0x9, B30 | RSIND, 0xd, 0x0, RDIND, 0x3, IGNORE, E}}}, + {O (O_SUBX, SL), AV_H8SX, 0, "subx.l", {{RSPOSTDEC, RDPOSTDEC, E}}, {{PREFIX_0106, 0x6, 0xd, B30 | RSPOSTDEC, 0xd, 0xa, RDPOSTDEC, 0x3, IGNORE, E}}}, + + {O (O_TRAPA, SB), AV_H8H, 2, "trapa", {{IMM2, E}}, {{0x5, 0x7, IMM2, IGNORE, E}}}, + {O (O_TAS, SB), AV_H8H, 2, "tas", {{RSIND, E}}, {{0x0, 0x1, 0xe, 0x0, 0x7, 0xb, B30 | RSIND, 0xc, E}}}, + + {O (O_XOR, SB), AV_H8, 2, "xor.b", {{IMM8, RD8, E}}, {{0xd, RD8, IMM8LIST, E}}}, + EXPAND_TWOOP_B (O (O_XOR, SB), "xor.b", 0xd, 0x1, 0x5, 0x5, 0), + + {O (O_XOR, SW), AV_H8, 2, "xor.w", {{RS16, RD16, E}}, {{0x6, 0x5, RS16, RD16, E}}}, + EXPAND_TWOOP_W (O (O_XOR, SW), "xor.w", 0x6, 0x5, 0x5), + + {O (O_XOR, SL), AV_H8H, 2, "xor.l", {{RS32, RD32, E}}, {{0x0, 0x1, 0xF, 0x0, 0x6, 0x5, B30 | RS32, B30 | RD32, E}}}, + EXPAND_TWOOP_L (O (O_XOR, SL), "xor.l", 0x5), + + {O (O_XORC, SB), AV_H8, 2, "xorc", {{IMM8, CCR | DST, E}}, {{0x0, 0x5, IMM8LIST, E}}}, + {O (O_XORC, SB), AV_H8S, 2, "xorc", {{IMM8, EXR | DST, E}}, {{0x0, 0x1, 0x4, EXR | DST, 0x0, 0x5, IMM8LIST, E}}}, + + {O (O_CLRMAC, SN), AV_H8S, 2, "clrmac", {{E}}, {{0x0, 0x1, 0xa, 0x0, E}}}, + {O (O_MAC, SW), AV_H8S, 2, "mac", {{RSPOSTINC, RDPOSTINC, E}}, {{0x0, 0x1, 0x6, 0x0, 0x6, 0xd, B30 | RSPOSTINC, B30 | RDPOSTINC, E}}}, + {O (O_LDMAC, SL), AV_H8S, 2, "ldmac", {{RS32, MD32, E}}, {{0x0, 0x3, MD32, RS32, E}}}, + {O (O_STMAC, SL), AV_H8S, 2, "stmac", {{MS32, RD32, E}}, {{0x0, 0x2, MS32, RD32, E}}}, + {O (O_LDM, SL), AV_H8H, 6, "ldm.l", {{RSPOSTINC, RD32, E}}, {{0x0, 0x1, DATA, 0x0, 0x6, 0xD, 0x7, B30 | RD32, E}}}, + {O (O_STM, SL), AV_H8H, 6, "stm.l", {{RS32, RDPREDEC, E}}, {{0x0, 0x1, DATA, 0x0, 0x6, 0xD, 0xF, B30 | RS32, E}}}, + {0, 0, 0, NULL, {{0, 0, 0}}, {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}} +}; +#else +extern const struct h8_opcode h8_opcodes[]; +#endif + diff --git a/include/opcode/hppa.h b/include/opcode/hppa.h new file mode 100644 index 0000000..489ca55 --- /dev/null +++ b/include/opcode/hppa.h @@ -0,0 +1,1092 @@ +/* Table of opcodes for the PA-RISC. + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, + 2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010 + Free Software Foundation, Inc. + + Contributed by the Center for Software Science at the + University of Utah (pa-gdb-bugs@cs.utah.edu). + + This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. + + GAS/GDB 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, or (at your option) + any later version. + + GAS/GDB 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 GAS or GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#if !defined(__STDC__) && !defined(const) +#define const +#endif + +/* + * Structure of an opcode table entry. + */ + +/* There are two kinds of delay slot nullification: normal which is + * controled by the nullification bit, and conditional, which depends + * on the direction of the branch and its success or failure. + * + * NONE is unfortunately #defined in the hiux system include files. + * #undef it away. + */ +#undef NONE +struct pa_opcode +{ + const char *name; + unsigned long int match; /* Bits that must be set... */ + unsigned long int mask; /* ... in these bits. */ + char *args; + enum pa_arch arch; + char flags; +}; + +/* Enables strict matching. Opcodes with match errors are skipped + when this bit is set. */ +#define FLAG_STRICT 0x1 + +/* + All hppa opcodes are 32 bits. + + The match component is a mask saying which bits must match a + particular opcode in order for an instruction to be an instance + of that opcode. + + The args component is a string containing one character for each operand of + the instruction. Characters used as a prefix allow any second character to + be used without conflicting with the main operand characters. + + Bit positions in this description follow HP usage of lsb = 31, + "at" is lsb of field. + + In the args field, the following characters must match exactly: + + '+,() ' + + In the args field, the following characters are unused: + + ' " - / 34 6789:; ' + '@ C M [\] ' + '` e g } ' + + Here are all the characters: + + ' !"#$%&'()*+-,./0123456789:;<=>?' + '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_' + '`abcdefghijklmnopqrstuvwxyz{|}~ ' + +Kinds of operands: + x integer register field at 15. + b integer register field at 10. + t integer register field at 31. + a integer register field at 10 and 15 (for PERMH) + 5 5 bit immediate at 15. + s 2 bit space specifier at 17. + S 3 bit space specifier at 18. + V 5 bit immediate value at 31 + i 11 bit immediate value at 31 + j 14 bit immediate value at 31 + k 21 bit immediate value at 31 + l 16 bit immediate value at 31 (wide mode only, unusual encoding). + n nullification for branch instructions + N nullification for spop and copr instructions + w 12 bit branch displacement + W 17 bit branch displacement (PC relative) + X 22 bit branch displacement (PC relative) + z 17 bit branch displacement (just a number, not an address) + +Also these: + + . 2 bit shift amount at 25 + * 4 bit shift amount at 25 + p 5 bit shift count at 26 (to support the SHD instruction) encoded as + 31-p + ~ 6 bit shift count at 20,22:26 encoded as 63-~. + P 5 bit bit position at 26 + q 6 bit bit position at 20,22:26 + T 5 bit field length at 31 (encoded as 32-T) + % 6 bit field length at 23,27:31 (variable extract/deposit) + | 6 bit field length at 19,27:31 (fixed extract/deposit) + A 13 bit immediate at 18 (to support the BREAK instruction) + ^ like b, but describes a control register + ! sar (cr11) register + D 26 bit immediate at 31 (to support the DIAG instruction) + $ 9 bit immediate at 28 (to support POPBTS) + + v 3 bit Special Function Unit identifier at 25 + O 20 bit Special Function Unit operation split between 15 bits at 20 + and 5 bits at 31 + o 15 bit Special Function Unit operation at 20 + 2 22 bit Special Function Unit operation split between 17 bits at 20 + and 5 bits at 31 + 1 15 bit Special Function Unit operation split between 10 bits at 20 + and 5 bits at 31 + 0 10 bit Special Function Unit operation split between 5 bits at 20 + and 5 bits at 31 + u 3 bit coprocessor unit identifier at 25 + F Source Floating Point Operand Format Completer encoded 2 bits at 20 + I Source Floating Point Operand Format Completer encoded 1 bits at 20 + (for 0xe format FP instructions) + G Destination Floating Point Operand Format Completer encoded 2 bits at 18 + H Floating Point Operand Format at 26 for 'fmpyadd' and 'fmpysub' + (very similar to 'F') + + r 5 bit immediate value at 31 (for the break instruction) + (very similar to V above, except the value is unsigned instead of + low_sign_ext) + R 5 bit immediate value at 15 (for the ssm, rsm, probei instructions) + (same as r above, except the value is in a different location) + U 10 bit immediate value at 15 (for SSM, RSM on pa2.0) + Q 5 bit immediate value at 10 (a bit position specified in + the bb instruction. It's the same as r above, except the + value is in a different location) + B 5 bit immediate value at 10 (a bit position specified in + the bb instruction. Similar to Q, but 64 bit handling is + different. + Z %r1 -- implicit target of addil instruction. + L ,%r2 completer for new syntax branch + { Source format completer for fcnv + _ Destination format completer for fcnv + h cbit for fcmp + = gfx tests for ftest + d 14 bit offset for single precision FP long load/store. + # 14 bit offset for double precision FP load long/store. + J Yet another 14 bit offset for load/store with ma,mb completers. + K Yet another 14 bit offset for load/store with ma,mb completers. + y 16 bit offset for word aligned load/store (PA2.0 wide). + & 16 bit offset for dword aligned load/store (PA2.0 wide). + < 16 bit offset for load/store with ma,mb completers (PA2.0 wide). + > 16 bit offset for load/store with ma,mb completers (PA2.0 wide). + Y %sr0,%r31 -- implicit target of be,l instruction. + @ implicit immediate value of 0 + +Completer operands all have 'c' as the prefix: + + cx indexed load and store completer. + cX indexed load and store completer. Like cx, but emits a space + after in disassembler. + cm short load and store completer. + cM short load and store completer. Like cm, but emits a space + after in disassembler. + cq long load and store completer (like cm, but inserted into a + different location in the target instruction). + cs store bytes short completer. + cA store bytes short completer. Like cs, but emits a space + after in disassembler. + ce long load/store completer for LDW/STW with a different encoding + than the others + cc load cache control hint + cd load and clear cache control hint + cC store cache control hint + co ordered access + + cp branch link and push completer + cP branch pop completer + cl branch link completer + cg branch gate completer + + cw read/write completer for PROBE + cW wide completer for MFCTL + cL local processor completer for cache control + cZ System Control Completer (to support LPA, LHA, etc.) + + ci correction completer for DCOR + ca add completer + cy 32 bit add carry completer + cY 64 bit add carry completer + cv signed overflow trap completer + ct trap on condition completer for ADDI, SUB + cT trap on condition completer for UADDCM + cb 32 bit borrow completer for SUB + cB 64 bit borrow completer for SUB + + ch left/right half completer + cH signed/unsigned saturation completer + cS signed/unsigned completer at 21 + cz zero/sign extension completer. + c* permutation completer + +Condition operands all have '?' as the prefix: + + ?f Floating point compare conditions (encoded as 5 bits at 31) + + ?a add conditions + ?A 64 bit add conditions + ?@ add branch conditions followed by nullify + ?d non-negated add branch conditions + ?D negated add branch conditions + ?w wide mode non-negated add branch conditions + ?W wide mode negated add branch conditions + + ?s compare/subtract conditions + ?S 64 bit compare/subtract conditions + ?t non-negated compare and branch conditions + ?n 32 bit compare and branch conditions followed by nullify + ?N 64 bit compare and branch conditions followed by nullify + ?Q 64 bit compare and branch conditions for CMPIB instruction + + ?l logical conditions + ?L 64 bit logical conditions + + ?b branch on bit conditions + ?B 64 bit branch on bit conditions + + ?x shift/extract/deposit conditions + ?X 64 bit shift/extract/deposit conditions + ?y shift/extract/deposit conditions followed by nullify for conditional + branches + + ?u unit conditions + ?U 64 bit unit conditions + +Floating point registers all have 'f' as a prefix: + + ft target register at 31 + fT target register with L/R halves at 31 + fa operand 1 register at 10 + fA operand 1 register with L/R halves at 10 + fX Same as fA, except prints a space before register during disasm + fb operand 2 register at 15 + fB operand 2 register with L/R halves at 15 + fC operand 3 register with L/R halves at 16:18,21:23 + fe Like fT, but encoding is different. + fE Same as fe, except prints a space before register during disasm. + fx target register at 15 (only for PA 2.0 long format FLDD/FSTD). + +Float registers for fmpyadd and fmpysub: + + fi mult operand 1 register at 10 + fj mult operand 2 register at 15 + fk mult target register at 20 + fl add/sub operand register at 25 + fm add/sub target register at 31 + +*/ + + +#if 0 +/* List of characters not to put a space after. Note that + "," is included, as the "spopN" operations use literal + commas in their completer sections. */ +static const char *const completer_chars = ",CcY<>?!@+&U~FfGHINnOoZMadu|/=0123%e$m}"; +#endif + +/* The order of the opcodes in this table is significant: + + * The assembler requires that all instances of the same mnemonic be + consecutive. If they aren't, the assembler will bomb at runtime. + + * Immediate fields use pa_get_absolute_expression to parse the + string. It will generate a "bad expression" error if passed + a register name. Thus, register index variants of an opcode + need to precede immediate variants. + + * The disassembler does not care about the order of the opcodes + except in cases where implicit addressing is used. + + Here are the rules for ordering the opcodes of a mnemonic: + + 1) Opcodes with FLAG_STRICT should precede opcodes without + FLAG_STRICT. + + 2) Opcodes with FLAG_STRICT should be ordered as follows: + register index opcodes, short immediate opcodes, and finally + long immediate opcodes. When both pa10 and pa11 variants + of the same opcode are available, the pa10 opcode should + come first for correct architectural promotion. + + 3) When implicit addressing is available for an opcode, the + implicit opcode should precede the explicit opcode. + + 4) Opcodes without FLAG_STRICT should be ordered as follows: + register index opcodes, long immediate opcodes, and finally + short immediate opcodes. */ + +static const struct pa_opcode pa_opcodes[] = +{ + +/* Pseudo-instructions. */ + +{ "ldi", 0x34000000, 0xffe00000, "l,x", pa20w, 0},/* ldo val(r0),r */ +{ "ldi", 0x34000000, 0xffe0c000, "j,x", pa10, 0},/* ldo val(r0),r */ + +{ "cmpib", 0xec000000, 0xfc000000, "?Qn5,b,w", pa20, FLAG_STRICT}, +{ "cmpib", 0x84000000, 0xf4000000, "?nn5,b,w", pa10, FLAG_STRICT}, +{ "comib", 0x84000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/ +/* This entry is for the disassembler only. It will never be used by + assembler. */ +{ "comib", 0x8c000000, 0xfc000000, "?nn5,b,w", pa10, 0}, /* comib{tf}*/ +{ "cmpb", 0x9c000000, 0xdc000000, "?Nnx,b,w", pa20, FLAG_STRICT}, +{ "cmpb", 0x80000000, 0xf4000000, "?nnx,b,w", pa10, FLAG_STRICT}, +{ "comb", 0x80000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */ +/* This entry is for the disassembler only. It will never be used by + assembler. */ +{ "comb", 0x88000000, 0xfc000000, "?nnx,b,w", pa10, 0}, /* comb{tf} */ +{ "addb", 0xa0000000, 0xf4000000, "?Wnx,b,w", pa20w, FLAG_STRICT}, +{ "addb", 0xa0000000, 0xfc000000, "?@nx,b,w", pa10, 0}, /* addb{tf} */ +/* This entry is for the disassembler only. It will never be used by + assembler. */ +{ "addb", 0xa8000000, 0xfc000000, "?@nx,b,w", pa10, 0}, +{ "addib", 0xa4000000, 0xf4000000, "?Wn5,b,w", pa20w, FLAG_STRICT}, +{ "addib", 0xa4000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/ +/* This entry is for the disassembler only. It will never be used by + assembler. */ +{ "addib", 0xac000000, 0xfc000000, "?@n5,b,w", pa10, 0}, /* addib{tf}*/ +{ "nop", 0x08000240, 0xffffffff, "", pa10, 0}, /* or 0,0,0 */ +{ "copy", 0x08000240, 0xffe0ffe0, "x,t", pa10, 0}, /* or r,0,t */ +{ "mtsar", 0x01601840, 0xffe0ffff, "x", pa10, 0}, /* mtctl r,cr11 */ + +/* Loads and Stores for integer registers. */ + +{ "ldd", 0x0c0000c0, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT}, +{ "ldd", 0x0c0000c0, 0xfc0013c0, "cxccx(s,b),t", pa20, FLAG_STRICT}, +{ "ldd", 0x0c0010e0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, +{ "ldd", 0x0c0010e0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, +{ "ldd", 0x0c0010c0, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT}, +{ "ldd", 0x0c0010c0, 0xfc0013c0, "cmcc5(s,b),t", pa20, FLAG_STRICT}, +{ "ldd", 0x50000000, 0xfc000002, "cq&(b),x", pa20w, FLAG_STRICT}, +{ "ldd", 0x50000000, 0xfc00c002, "cq#(b),x", pa20, FLAG_STRICT}, +{ "ldd", 0x50000000, 0xfc000002, "cq#(s,b),x", pa20, FLAG_STRICT}, +{ "ldw", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldw", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldw", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldw", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, +{ "ldw", 0x0c0010a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, +{ "ldw", 0x0c0010a0, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, +{ "ldw", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldw", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldw", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldw", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "ldw", 0x4c000000, 0xfc000000, "ce<(b),x", pa20w, FLAG_STRICT}, +{ "ldw", 0x5c000004, 0xfc000006, "ce>(b),x", pa20w, FLAG_STRICT}, +{ "ldw", 0x48000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, +{ "ldw", 0x5c000004, 0xfc00c006, "ceK(b),x", pa20, FLAG_STRICT}, +{ "ldw", 0x5c000004, 0xfc000006, "ceK(s,b),x", pa20, FLAG_STRICT}, +{ "ldw", 0x4c000000, 0xfc00c000, "ceJ(b),x", pa10, FLAG_STRICT}, +{ "ldw", 0x4c000000, 0xfc000000, "ceJ(s,b),x", pa10, FLAG_STRICT}, +{ "ldw", 0x48000000, 0xfc00c000, "j(b),x", pa10, 0}, +{ "ldw", 0x48000000, 0xfc000000, "j(s,b),x", pa10, 0}, +{ "ldh", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldh", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldh", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldh", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, +{ "ldh", 0x0c001060, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, +{ "ldh", 0x0c001060, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, +{ "ldh", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldh", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldh", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldh", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "ldh", 0x44000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, +{ "ldh", 0x44000000, 0xfc00c000, "j(b),x", pa10, 0}, +{ "ldh", 0x44000000, 0xfc000000, "j(s,b),x", pa10, 0}, +{ "ldb", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldb", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldb", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldb", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, +{ "ldb", 0x0c001020, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, +{ "ldb", 0x0c001020, 0xfc1f33e0, "cocc@(s,b),t", pa20, FLAG_STRICT}, +{ "ldb", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldb", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldb", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldb", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "ldb", 0x40000000, 0xfc000000, "l(b),x", pa20w, FLAG_STRICT}, +{ "ldb", 0x40000000, 0xfc00c000, "j(b),x", pa10, 0}, +{ "ldb", 0x40000000, 0xfc000000, "j(s,b),x", pa10, 0}, +{ "std", 0x0c0012e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, +{ "std", 0x0c0012e0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, +{ "std", 0x0c0012c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT}, +{ "std", 0x0c0012c0, 0xfc0013c0, "cmcCx,V(s,b)", pa20, FLAG_STRICT}, +{ "std", 0x70000000, 0xfc000002, "cqx,&(b)", pa20w, FLAG_STRICT}, +{ "std", 0x70000000, 0xfc00c002, "cqx,#(b)", pa20, FLAG_STRICT}, +{ "std", 0x70000000, 0xfc000002, "cqx,#(s,b)", pa20, FLAG_STRICT}, +{ "stw", 0x0c0012a0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, +{ "stw", 0x0c0012a0, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, +{ "stw", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "stw", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, +{ "stw", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "stw", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, +{ "stw", 0x6c000000, 0xfc000000, "cex,<(b)", pa20w, FLAG_STRICT}, +{ "stw", 0x7c000004, 0xfc000006, "cex,>(b)", pa20w, FLAG_STRICT}, +{ "stw", 0x68000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, +{ "stw", 0x7c000004, 0xfc00c006, "cex,K(b)", pa20, FLAG_STRICT}, +{ "stw", 0x7c000004, 0xfc000006, "cex,K(s,b)", pa20, FLAG_STRICT}, +{ "stw", 0x6c000000, 0xfc00c000, "cex,J(b)", pa10, FLAG_STRICT}, +{ "stw", 0x6c000000, 0xfc000000, "cex,J(s,b)", pa10, FLAG_STRICT}, +{ "stw", 0x68000000, 0xfc00c000, "x,j(b)", pa10, 0}, +{ "stw", 0x68000000, 0xfc000000, "x,j(s,b)", pa10, 0}, +{ "sth", 0x0c001260, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, +{ "sth", 0x0c001260, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, +{ "sth", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "sth", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, +{ "sth", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "sth", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, +{ "sth", 0x64000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, +{ "sth", 0x64000000, 0xfc00c000, "x,j(b)", pa10, 0}, +{ "sth", 0x64000000, 0xfc000000, "x,j(s,b)", pa10, 0}, +{ "stb", 0x0c001220, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, +{ "stb", 0x0c001220, 0xfc0033ff, "cocCx,@(s,b)", pa20, FLAG_STRICT}, +{ "stb", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "stb", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, +{ "stb", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "stb", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, +{ "stb", 0x60000000, 0xfc000000, "x,l(b)", pa20w, FLAG_STRICT}, +{ "stb", 0x60000000, 0xfc00c000, "x,j(b)", pa10, 0}, +{ "stb", 0x60000000, 0xfc000000, "x,j(s,b)", pa10, 0}, +{ "ldwm", 0x4c000000, 0xfc00c000, "j(b),x", pa10, 0}, +{ "ldwm", 0x4c000000, 0xfc000000, "j(s,b),x", pa10, 0}, +{ "stwm", 0x6c000000, 0xfc00c000, "x,j(b)", pa10, 0}, +{ "stwm", 0x6c000000, 0xfc000000, "x,j(s,b)", pa10, 0}, +{ "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldwx", 0x0c000080, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldwx", 0x0c000080, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, +{ "ldwx", 0x0c000080, 0xfc00dfc0, "cXx(b),t", pa10, 0}, +{ "ldwx", 0x0c000080, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, +{ "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldhx", 0x0c000040, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldhx", 0x0c000040, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, +{ "ldhx", 0x0c000040, 0xfc00dfc0, "cXx(b),t", pa10, 0}, +{ "ldhx", 0x0c000040, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, +{ "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldbx", 0x0c000000, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldbx", 0x0c000000, 0xfc0013c0, "cxccx(s,b),t", pa11, FLAG_STRICT}, +{ "ldbx", 0x0c000000, 0xfc00dfc0, "cXx(b),t", pa10, 0}, +{ "ldbx", 0x0c000000, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, +{ "ldwa", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldwa", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldwa", 0x0c0011a0, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, +{ "ldwa", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldwa", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldcw", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldcw", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldcw", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT}, +{ "ldcw", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT}, +{ "ldcw", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldcw", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldcw", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT}, +{ "ldcw", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT}, +{ "stwa", 0x0c0013a0, 0xfc00d3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, +{ "stwa", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "stwa", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "stby", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT}, +{ "stby", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT}, +{ "stby", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT}, +{ "stby", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT}, +{ "ldda", 0x0c000100, 0xfc00d3c0, "cxccx(b),t", pa20, FLAG_STRICT}, +{ "ldda", 0x0c001120, 0xfc1ff3e0, "cocc@(b),t", pa20, FLAG_STRICT}, +{ "ldda", 0x0c001100, 0xfc00d3c0, "cmcc5(b),t", pa20, FLAG_STRICT}, +{ "ldcd", 0x0c000140, 0xfc00d3c0, "cxcdx(b),t", pa20, FLAG_STRICT}, +{ "ldcd", 0x0c000140, 0xfc0013c0, "cxcdx(s,b),t", pa20, FLAG_STRICT}, +{ "ldcd", 0x0c001140, 0xfc00d3c0, "cmcd5(b),t", pa20, FLAG_STRICT}, +{ "ldcd", 0x0c001140, 0xfc0013c0, "cmcd5(s,b),t", pa20, FLAG_STRICT}, +{ "stda", 0x0c0013e0, 0xfc00f3ff, "cocCx,@(b)", pa20, FLAG_STRICT}, +{ "stda", 0x0c0013c0, 0xfc00d3c0, "cmcCx,V(b)", pa20, FLAG_STRICT}, +{ "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldwax", 0x0c000180, 0xfc00d3c0, "cxccx(b),t", pa11, FLAG_STRICT}, +{ "ldwax", 0x0c000180, 0xfc00dfc0, "cXx(b),t", pa10, 0}, +{ "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, FLAG_STRICT}, +{ "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, FLAG_STRICT}, +{ "ldcwx", 0x0c0001c0, 0xfc00d3c0, "cxcdx(b),t", pa11, FLAG_STRICT}, +{ "ldcwx", 0x0c0001c0, 0xfc0013c0, "cxcdx(s,b),t", pa11, FLAG_STRICT}, +{ "ldcwx", 0x0c0001c0, 0xfc00dfc0, "cXx(b),t", pa10, 0}, +{ "ldcwx", 0x0c0001c0, 0xfc001fc0, "cXx(s,b),t", pa10, 0}, +{ "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldws", 0x0c001080, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldws", 0x0c001080, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "ldws", 0x0c001080, 0xfc00dfc0, "cM5(b),t", pa10, 0}, +{ "ldws", 0x0c001080, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, +{ "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldhs", 0x0c001040, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldhs", 0x0c001040, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "ldhs", 0x0c001040, 0xfc00dfc0, "cM5(b),t", pa10, 0}, +{ "ldhs", 0x0c001040, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, +{ "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldbs", 0x0c001000, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldbs", 0x0c001000, 0xfc0013c0, "cmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "ldbs", 0x0c001000, 0xfc00dfc0, "cM5(b),t", pa10, 0}, +{ "ldbs", 0x0c001000, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, +{ "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldwas", 0x0c001180, 0xfc00d3c0, "cmcc5(b),t", pa11, FLAG_STRICT}, +{ "ldwas", 0x0c001180, 0xfc00dfc0, "cM5(b),t", pa10, 0}, +{ "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, FLAG_STRICT}, +{ "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, FLAG_STRICT}, +{ "ldcws", 0x0c0011c0, 0xfc00d3c0, "cmcd5(b),t", pa11, FLAG_STRICT}, +{ "ldcws", 0x0c0011c0, 0xfc0013c0, "cmcd5(s,b),t", pa11, FLAG_STRICT}, +{ "ldcws", 0x0c0011c0, 0xfc00dfc0, "cM5(b),t", pa10, 0}, +{ "ldcws", 0x0c0011c0, 0xfc001fc0, "cM5(s,b),t", pa10, 0}, +{ "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, +{ "stws", 0x0c001280, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "stws", 0x0c001280, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, +{ "stws", 0x0c001280, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, +{ "stws", 0x0c001280, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, +{ "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, +{ "sths", 0x0c001240, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "sths", 0x0c001240, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, +{ "sths", 0x0c001240, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, +{ "sths", 0x0c001240, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, +{ "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, FLAG_STRICT}, +{ "stbs", 0x0c001200, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "stbs", 0x0c001200, 0xfc0013c0, "cmcCx,V(s,b)", pa11, FLAG_STRICT}, +{ "stbs", 0x0c001200, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, +{ "stbs", 0x0c001200, 0xfc001fc0, "cMx,V(s,b)", pa10, 0}, +{ "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, FLAG_STRICT}, +{ "stwas", 0x0c001380, 0xfc00d3c0, "cmcCx,V(b)", pa11, FLAG_STRICT}, +{ "stwas", 0x0c001380, 0xfc00dfc0, "cMx,V(b)", pa10, 0}, +{ "stdby", 0x0c001340, 0xfc00d3c0, "cscCx,V(b)", pa20, FLAG_STRICT}, +{ "stdby", 0x0c001340, 0xfc0013c0, "cscCx,V(s,b)", pa20, FLAG_STRICT}, +{ "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, FLAG_STRICT}, +{ "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, FLAG_STRICT}, +{ "stbys", 0x0c001300, 0xfc00d3c0, "cscCx,V(b)", pa11, FLAG_STRICT}, +{ "stbys", 0x0c001300, 0xfc0013c0, "cscCx,V(s,b)", pa11, FLAG_STRICT}, +{ "stbys", 0x0c001300, 0xfc00dfc0, "cAx,V(b)", pa10, 0}, +{ "stbys", 0x0c001300, 0xfc001fc0, "cAx,V(s,b)", pa10, 0}, + +/* Immediate instructions. */ +{ "ldo", 0x34000000, 0xfc000000, "l(b),x", pa20w, 0}, +{ "ldo", 0x34000000, 0xfc00c000, "j(b),x", pa10, 0}, +{ "ldil", 0x20000000, 0xfc000000, "k,b", pa10, 0}, +{ "addil", 0x28000000, 0xfc000000, "k,b,Z", pa10, 0}, +{ "addil", 0x28000000, 0xfc000000, "k,b", pa10, 0}, + +/* Branching instructions. */ +{ "b", 0xe8008000, 0xfc00e000, "cpnXL", pa20, FLAG_STRICT}, +{ "b", 0xe800a000, 0xfc00e000, "clnXL", pa20, FLAG_STRICT}, +{ "b", 0xe8000000, 0xfc00e000, "clnW,b", pa10, FLAG_STRICT}, +{ "b", 0xe8002000, 0xfc00e000, "cgnW,b", pa10, FLAG_STRICT}, +{ "b", 0xe8000000, 0xffe0e000, "nW", pa10, 0}, /* b,l foo,r0 */ +{ "bl", 0xe8000000, 0xfc00e000, "nW,b", pa10, 0}, +{ "gate", 0xe8002000, 0xfc00e000, "nW,b", pa10, 0}, +{ "blr", 0xe8004000, 0xfc00e001, "nx,b", pa10, 0}, +{ "bv", 0xe800c000, 0xfc00fffd, "nx(b)", pa10, 0}, +{ "bv", 0xe800c000, 0xfc00fffd, "n(b)", pa10, 0}, +{ "bve", 0xe800f001, 0xfc1ffffd, "cpn(b)L", pa20, FLAG_STRICT}, +{ "bve", 0xe800f000, 0xfc1ffffd, "cln(b)L", pa20, FLAG_STRICT}, +{ "bve", 0xe800d001, 0xfc1ffffd, "cPn(b)", pa20, FLAG_STRICT}, +{ "bve", 0xe800d000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT}, +{ "be", 0xe4000000, 0xfc000000, "clnz(S,b),Y", pa10, FLAG_STRICT}, +{ "be", 0xe4000000, 0xfc000000, "clnz(b),Y", pa10, FLAG_STRICT}, +{ "be", 0xe0000000, 0xfc000000, "nz(S,b)", pa10, 0}, +{ "be", 0xe0000000, 0xfc000000, "nz(b)", pa10, 0}, +{ "ble", 0xe4000000, 0xfc000000, "nz(S,b)", pa10, 0}, +{ "movb", 0xc8000000, 0xfc000000, "?ynx,b,w", pa10, 0}, +{ "movib", 0xcc000000, 0xfc000000, "?yn5,b,w", pa10, 0}, +{ "combt", 0x80000000, 0xfc000000, "?tnx,b,w", pa10, 0}, +{ "combf", 0x88000000, 0xfc000000, "?tnx,b,w", pa10, 0}, +{ "comibt", 0x84000000, 0xfc000000, "?tn5,b,w", pa10, 0}, +{ "comibf", 0x8c000000, 0xfc000000, "?tn5,b,w", pa10, 0}, +{ "addbt", 0xa0000000, 0xfc000000, "?dnx,b,w", pa10, 0}, +{ "addbf", 0xa8000000, 0xfc000000, "?dnx,b,w", pa10, 0}, +{ "addibt", 0xa4000000, 0xfc000000, "?dn5,b,w", pa10, 0}, +{ "addibf", 0xac000000, 0xfc000000, "?dn5,b,w", pa10, 0}, +{ "bb", 0xc0006000, 0xffe06000, "?Bnx,!,w", pa20, FLAG_STRICT}, +{ "bb", 0xc0004000, 0xffe06000, "?bnx,!,w", pa10, FLAG_STRICT}, +{ "bb", 0xc4004000, 0xfc004000, "?Bnx,B,w", pa20, FLAG_STRICT}, +{ "bb", 0xc4004000, 0xfc006000, "?bnx,Q,w", pa10, FLAG_STRICT}, +{ "bb", 0xc4004000, 0xfc006000, "?bnx,Q,w", pa10, 0}, +{ "bvb", 0xc0004000, 0xffe04000, "?bnx,w", pa10, 0}, +{ "clrbts", 0xe8004005, 0xffffffff, "", pa20, FLAG_STRICT}, +{ "popbts", 0xe8004005, 0xfffff007, "$", pa20, FLAG_STRICT}, +{ "pushnom", 0xe8004001, 0xffffffff, "", pa20, FLAG_STRICT}, +{ "pushbts", 0xe8004001, 0xffe0ffff, "x", pa20, FLAG_STRICT}, + +/* Computation Instructions. */ + +{ "cmpclr", 0x080008a0, 0xfc000fe0, "?Sx,b,t", pa20, FLAG_STRICT}, +{ "cmpclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, FLAG_STRICT}, +{ "comclr", 0x08000880, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "or", 0x08000260, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, +{ "or", 0x08000240, 0xfc000fe0, "?lx,b,t", pa10, 0}, +{ "xor", 0x080002a0, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, +{ "xor", 0x08000280, 0xfc000fe0, "?lx,b,t", pa10, 0}, +{ "and", 0x08000220, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, +{ "and", 0x08000200, 0xfc000fe0, "?lx,b,t", pa10, 0}, +{ "andcm", 0x08000020, 0xfc000fe0, "?Lx,b,t", pa20, FLAG_STRICT}, +{ "andcm", 0x08000000, 0xfc000fe0, "?lx,b,t", pa10, 0}, +{ "uxor", 0x080003a0, 0xfc000fe0, "?Ux,b,t", pa20, FLAG_STRICT}, +{ "uxor", 0x08000380, 0xfc000fe0, "?ux,b,t", pa10, 0}, +{ "uaddcm", 0x080009a0, 0xfc000fa0, "cT?Ux,b,t", pa20, FLAG_STRICT}, +{ "uaddcm", 0x08000980, 0xfc000fa0, "cT?ux,b,t", pa10, FLAG_STRICT}, +{ "uaddcm", 0x08000980, 0xfc000fe0, "?ux,b,t", pa10, 0}, +{ "uaddcmt", 0x080009c0, 0xfc000fe0, "?ux,b,t", pa10, 0}, +{ "dcor", 0x08000ba0, 0xfc1f0fa0, "ci?Ub,t", pa20, FLAG_STRICT}, +{ "dcor", 0x08000b80, 0xfc1f0fa0, "ci?ub,t", pa10, FLAG_STRICT}, +{ "dcor", 0x08000b80, 0xfc1f0fe0, "?ub,t", pa10, 0}, +{ "idcor", 0x08000bc0, 0xfc1f0fe0, "?ub,t", pa10, 0}, +{ "addi", 0xb0000000, 0xfc000000, "ct?ai,b,x", pa10, FLAG_STRICT}, +{ "addi", 0xb4000000, 0xfc000000, "cv?ai,b,x", pa10, FLAG_STRICT}, +{ "addi", 0xb4000000, 0xfc000800, "?ai,b,x", pa10, 0}, +{ "addio", 0xb4000800, 0xfc000800, "?ai,b,x", pa10, 0}, +{ "addit", 0xb0000000, 0xfc000800, "?ai,b,x", pa10, 0}, +{ "addito", 0xb0000800, 0xfc000800, "?ai,b,x", pa10, 0}, +{ "add", 0x08000720, 0xfc0007e0, "cY?Ax,b,t", pa20, FLAG_STRICT}, +{ "add", 0x08000700, 0xfc0007e0, "cy?ax,b,t", pa10, FLAG_STRICT}, +{ "add", 0x08000220, 0xfc0003e0, "ca?Ax,b,t", pa20, FLAG_STRICT}, +{ "add", 0x08000200, 0xfc0003e0, "ca?ax,b,t", pa10, FLAG_STRICT}, +{ "add", 0x08000600, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "addl", 0x08000a00, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "addo", 0x08000e00, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "addc", 0x08000700, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "addco", 0x08000f00, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sub", 0x080004e0, 0xfc0007e0, "ct?Sx,b,t", pa20, FLAG_STRICT}, +{ "sub", 0x080004c0, 0xfc0007e0, "ct?sx,b,t", pa10, FLAG_STRICT}, +{ "sub", 0x08000520, 0xfc0007e0, "cB?Sx,b,t", pa20, FLAG_STRICT}, +{ "sub", 0x08000500, 0xfc0007e0, "cb?sx,b,t", pa10, FLAG_STRICT}, +{ "sub", 0x08000420, 0xfc0007e0, "cv?Sx,b,t", pa20, FLAG_STRICT}, +{ "sub", 0x08000400, 0xfc0007e0, "cv?sx,b,t", pa10, FLAG_STRICT}, +{ "sub", 0x08000400, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "subo", 0x08000c00, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "subb", 0x08000500, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "subbo", 0x08000d00, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "subt", 0x080004c0, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "subto", 0x08000cc0, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "ds", 0x08000440, 0xfc000fe0, "?sx,b,t", pa10, 0}, +{ "subi", 0x94000000, 0xfc000000, "cv?si,b,x", pa10, FLAG_STRICT}, +{ "subi", 0x94000000, 0xfc000800, "?si,b,x", pa10, 0}, +{ "subio", 0x94000800, 0xfc000800, "?si,b,x", pa10, 0}, +{ "cmpiclr", 0x90000800, 0xfc000800, "?Si,b,x", pa20, FLAG_STRICT}, +{ "cmpiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, FLAG_STRICT}, +{ "comiclr", 0x90000000, 0xfc000800, "?si,b,x", pa10, 0}, +{ "shladd", 0x08000220, 0xfc000320, "ca?Ax,.,b,t", pa20, FLAG_STRICT}, +{ "shladd", 0x08000200, 0xfc000320, "ca?ax,.,b,t", pa10, FLAG_STRICT}, +{ "sh1add", 0x08000640, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh1addl", 0x08000a40, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh1addo", 0x08000e40, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh2add", 0x08000680, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh2addl", 0x08000a80, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh2addo", 0x08000e80, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh3add", 0x080006c0, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh3addl", 0x08000ac0, 0xfc000fe0, "?ax,b,t", pa10, 0}, +{ "sh3addo", 0x08000ec0, 0xfc000fe0, "?ax,b,t", pa10, 0}, + +/* Subword Operation Instructions. */ + +{ "hadd", 0x08000300, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT}, +{ "havg", 0x080002c0, 0xfc00ffe0, "x,b,t", pa20, FLAG_STRICT}, +{ "hshl", 0xf8008800, 0xffe0fc20, "x,*,t", pa20, FLAG_STRICT}, +{ "hshladd", 0x08000700, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT}, +{ "hshr", 0xf800c800, 0xfc1ff820, "cSb,*,t", pa20, FLAG_STRICT}, +{ "hshradd", 0x08000500, 0xfc00ff20, "x,.,b,t", pa20, FLAG_STRICT}, +{ "hsub", 0x08000100, 0xfc00ff20, "cHx,b,t", pa20, FLAG_STRICT}, +{ "mixh", 0xf8008400, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT}, +{ "mixw", 0xf8008000, 0xfc009fe0, "chx,b,t", pa20, FLAG_STRICT}, +{ "permh", 0xf8000000, 0xfc009020, "c*a,t", pa20, FLAG_STRICT}, + + +/* Extract and Deposit Instructions. */ + +{ "shrpd", 0xd0000200, 0xfc001fe0, "?Xx,b,!,t", pa20, FLAG_STRICT}, +{ "shrpd", 0xd0000400, 0xfc001400, "?Xx,b,~,t", pa20, FLAG_STRICT}, +{ "shrpw", 0xd0000000, 0xfc001fe0, "?xx,b,!,t", pa10, FLAG_STRICT}, +{ "shrpw", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, FLAG_STRICT}, +{ "vshd", 0xd0000000, 0xfc001fe0, "?xx,b,t", pa10, 0}, +{ "shd", 0xd0000800, 0xfc001c00, "?xx,b,p,t", pa10, 0}, +{ "extrd", 0xd0001200, 0xfc001ae0, "cS?Xb,!,%,x", pa20, FLAG_STRICT}, +{ "extrd", 0xd8000000, 0xfc000000, "cS?Xb,q,|,x", pa20, FLAG_STRICT}, +{ "extrw", 0xd0001000, 0xfc001be0, "cS?xb,!,T,x", pa10, FLAG_STRICT}, +{ "extrw", 0xd0001800, 0xfc001800, "cS?xb,P,T,x", pa10, FLAG_STRICT}, +{ "vextru", 0xd0001000, 0xfc001fe0, "?xb,T,x", pa10, 0}, +{ "vextrs", 0xd0001400, 0xfc001fe0, "?xb,T,x", pa10, 0}, +{ "extru", 0xd0001800, 0xfc001c00, "?xb,P,T,x", pa10, 0}, +{ "extrs", 0xd0001c00, 0xfc001c00, "?xb,P,T,x", pa10, 0}, +{ "depd", 0xd4000200, 0xfc001ae0, "cz?Xx,!,%,b", pa20, FLAG_STRICT}, +{ "depd", 0xf0000000, 0xfc000000, "cz?Xx,~,|,b", pa20, FLAG_STRICT}, +{ "depdi", 0xd4001200, 0xfc001ae0, "cz?X5,!,%,b", pa20, FLAG_STRICT}, +{ "depdi", 0xf4000000, 0xfc000000, "cz?X5,~,|,b", pa20, FLAG_STRICT}, +{ "depw", 0xd4000000, 0xfc001be0, "cz?xx,!,T,b", pa10, FLAG_STRICT}, +{ "depw", 0xd4000800, 0xfc001800, "cz?xx,p,T,b", pa10, FLAG_STRICT}, +{ "depwi", 0xd4001000, 0xfc001be0, "cz?x5,!,T,b", pa10, FLAG_STRICT}, +{ "depwi", 0xd4001800, 0xfc001800, "cz?x5,p,T,b", pa10, FLAG_STRICT}, +{ "zvdep", 0xd4000000, 0xfc001fe0, "?xx,T,b", pa10, 0}, +{ "vdep", 0xd4000400, 0xfc001fe0, "?xx,T,b", pa10, 0}, +{ "zdep", 0xd4000800, 0xfc001c00, "?xx,p,T,b", pa10, 0}, +{ "dep", 0xd4000c00, 0xfc001c00, "?xx,p,T,b", pa10, 0}, +{ "zvdepi", 0xd4001000, 0xfc001fe0, "?x5,T,b", pa10, 0}, +{ "vdepi", 0xd4001400, 0xfc001fe0, "?x5,T,b", pa10, 0}, +{ "zdepi", 0xd4001800, 0xfc001c00, "?x5,p,T,b", pa10, 0}, +{ "depi", 0xd4001c00, 0xfc001c00, "?x5,p,T,b", pa10, 0}, + +/* System Control Instructions. */ + +{ "break", 0x00000000, 0xfc001fe0, "r,A", pa10, 0}, +{ "rfi", 0x00000c00, 0xffffff1f, "cr", pa10, FLAG_STRICT}, +{ "rfi", 0x00000c00, 0xffffffff, "", pa10, 0}, +{ "rfir", 0x00000ca0, 0xffffffff, "", pa11, 0}, +{ "ssm", 0x00000d60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT}, +{ "ssm", 0x00000d60, 0xffe0ffe0, "R,t", pa10, 0}, +{ "rsm", 0x00000e60, 0xfc00ffe0, "U,t", pa20, FLAG_STRICT}, +{ "rsm", 0x00000e60, 0xffe0ffe0, "R,t", pa10, 0}, +{ "mtsm", 0x00001860, 0xffe0ffff, "x", pa10, 0}, +{ "ldsid", 0x000010a0, 0xfc1fffe0, "(b),t", pa10, 0}, +{ "ldsid", 0x000010a0, 0xfc1f3fe0, "(s,b),t", pa10, 0}, +{ "mtsp", 0x00001820, 0xffe01fff, "x,S", pa10, 0}, +{ "mtctl", 0x00001840, 0xfc00ffff, "x,^", pa10, 0}, +{ "mtsarcm", 0x016018C0, 0xffe0ffff, "x", pa20, FLAG_STRICT}, +{ "mfia", 0x000014A0, 0xffffffe0, "t", pa20, FLAG_STRICT}, +{ "mfsp", 0x000004a0, 0xffff1fe0, "S,t", pa10, 0}, +{ "mfctl", 0x016048a0, 0xffffffe0, "cW!,t", pa20, FLAG_STRICT}, +{ "mfctl", 0x000008a0, 0xfc1fffe0, "^,t", pa10, 0}, +{ "sync", 0x00000400, 0xffffffff, "", pa10, 0}, +{ "syncdma", 0x00100400, 0xffffffff, "", pa10, 0}, +{ "probe", 0x04001180, 0xfc00ffa0, "cw(b),x,t", pa10, FLAG_STRICT}, +{ "probe", 0x04001180, 0xfc003fa0, "cw(s,b),x,t", pa10, FLAG_STRICT}, +{ "probei", 0x04003180, 0xfc00ffa0, "cw(b),R,t", pa10, FLAG_STRICT}, +{ "probei", 0x04003180, 0xfc003fa0, "cw(s,b),R,t", pa10, FLAG_STRICT}, +{ "prober", 0x04001180, 0xfc00ffe0, "(b),x,t", pa10, 0}, +{ "prober", 0x04001180, 0xfc003fe0, "(s,b),x,t", pa10, 0}, +{ "proberi", 0x04003180, 0xfc00ffe0, "(b),R,t", pa10, 0}, +{ "proberi", 0x04003180, 0xfc003fe0, "(s,b),R,t", pa10, 0}, +{ "probew", 0x040011c0, 0xfc00ffe0, "(b),x,t", pa10, 0}, +{ "probew", 0x040011c0, 0xfc003fe0, "(s,b),x,t", pa10, 0}, +{ "probewi", 0x040031c0, 0xfc00ffe0, "(b),R,t", pa10, 0}, +{ "probewi", 0x040031c0, 0xfc003fe0, "(s,b),R,t", pa10, 0}, +{ "lpa", 0x04001340, 0xfc00ffc0, "cZx(b),t", pa10, 0}, +{ "lpa", 0x04001340, 0xfc003fc0, "cZx(s,b),t", pa10, 0}, +{ "lci", 0x04001300, 0xfc00ffe0, "x(b),t", pa11, 0}, +{ "lci", 0x04001300, 0xfc003fe0, "x(s,b),t", pa11, 0}, +{ "pdtlb", 0x04001600, 0xfc00ffdf, "cLcZx(b)", pa20, FLAG_STRICT}, +{ "pdtlb", 0x04001600, 0xfc003fdf, "cLcZx(s,b)", pa20, FLAG_STRICT}, +{ "pdtlb", 0x04001600, 0xfc1fffdf, "cLcZ@(b)", pa20, FLAG_STRICT}, +{ "pdtlb", 0x04001600, 0xfc1f3fdf, "cLcZ@(s,b)", pa20, FLAG_STRICT}, +{ "pdtlb", 0x04001200, 0xfc00ffdf, "cZx(b)", pa10, 0}, +{ "pdtlb", 0x04001200, 0xfc003fdf, "cZx(s,b)", pa10, 0}, +{ "pitlb", 0x04000600, 0xfc001fdf, "cLcZx(S,b)", pa20, FLAG_STRICT}, +{ "pitlb", 0x04000600, 0xfc1f1fdf, "cLcZ@(S,b)", pa20, FLAG_STRICT}, +{ "pitlb", 0x04000200, 0xfc001fdf, "cZx(S,b)", pa10, 0}, +{ "pdtlbe", 0x04001240, 0xfc00ffdf, "cZx(b)", pa10, 0}, +{ "pdtlbe", 0x04001240, 0xfc003fdf, "cZx(s,b)", pa10, 0}, +{ "pitlbe", 0x04000240, 0xfc001fdf, "cZx(S,b)", pa10, 0}, +{ "idtlba", 0x04001040, 0xfc00ffff, "x,(b)", pa10, 0}, +{ "idtlba", 0x04001040, 0xfc003fff, "x,(s,b)", pa10, 0}, +{ "iitlba", 0x04000040, 0xfc001fff, "x,(S,b)", pa10, 0}, +{ "idtlbp", 0x04001000, 0xfc00ffff, "x,(b)", pa10, 0}, +{ "idtlbp", 0x04001000, 0xfc003fff, "x,(s,b)", pa10, 0}, +{ "iitlbp", 0x04000000, 0xfc001fff, "x,(S,b)", pa10, 0}, +{ "pdc", 0x04001380, 0xfc00ffdf, "cZx(b)", pa10, 0}, +{ "pdc", 0x04001380, 0xfc003fdf, "cZx(s,b)", pa10, 0}, +{ "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, FLAG_STRICT}, +{ "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, FLAG_STRICT}, +{ "fdc", 0x04003280, 0xfc00ffff, "5(b)", pa20, FLAG_STRICT}, +{ "fdc", 0x04003280, 0xfc003fff, "5(s,b)", pa20, FLAG_STRICT}, +{ "fdc", 0x04001280, 0xfc00ffdf, "cZx(b)", pa10, 0}, +{ "fdc", 0x04001280, 0xfc003fdf, "cZx(s,b)", pa10, 0}, +{ "fic", 0x040013c0, 0xfc00dfdf, "cZx(b)", pa20, FLAG_STRICT}, +{ "fic", 0x04000280, 0xfc001fdf, "cZx(S,b)", pa10, 0}, +{ "fdce", 0x040012c0, 0xfc00ffdf, "cZx(b)", pa10, 0}, +{ "fdce", 0x040012c0, 0xfc003fdf, "cZx(s,b)", pa10, 0}, +{ "fice", 0x040002c0, 0xfc001fdf, "cZx(S,b)", pa10, 0}, +{ "diag", 0x14000000, 0xfc000000, "D", pa10, 0}, +{ "idtlbt", 0x04001800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT}, +{ "iitlbt", 0x04000800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT}, + +/* These may be specific to certain versions of the PA. Joel claimed + they were 72000 (7200?) specific. However, I'm almost certain the + mtcpu/mfcpu were undocumented, but available in the older 700 machines. */ +{ "mtcpu", 0x14001600, 0xfc00ffff, "x,^", pa10, 0}, +{ "mfcpu", 0x14001A00, 0xfc00ffff, "^,x", pa10, 0}, +{ "tocen", 0x14403600, 0xffffffff, "", pa10, 0}, +{ "tocdis", 0x14401620, 0xffffffff, "", pa10, 0}, +{ "shdwgr", 0x14402600, 0xffffffff, "", pa10, 0}, +{ "grshdw", 0x14400620, 0xffffffff, "", pa10, 0}, + +/* gfw and gfr are not in the HP PA 1.1 manual, but they are in either + the Timex FPU or the Mustang ERS (not sure which) manual. */ +{ "gfw", 0x04001680, 0xfc00ffdf, "cZx(b)", pa11, 0}, +{ "gfw", 0x04001680, 0xfc003fdf, "cZx(s,b)", pa11, 0}, +{ "gfr", 0x04001a80, 0xfc00ffdf, "cZx(b)", pa11, 0}, +{ "gfr", 0x04001a80, 0xfc003fdf, "cZx(s,b)", pa11, 0}, + +/* Floating Point Coprocessor Instructions. */ + +{ "fldw", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT}, +{ "fldw", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT}, +{ "fldw", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT}, +{ "fldw", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT}, +{ "fldw", 0x24001020, 0xfc1ff3a0, "cocc@(b),fT", pa20, FLAG_STRICT}, +{ "fldw", 0x24001020, 0xfc1f33a0, "cocc@(s,b),fT", pa20, FLAG_STRICT}, +{ "fldw", 0x24001000, 0xfc00df80, "cM5(b),fT", pa10, FLAG_STRICT}, +{ "fldw", 0x24001000, 0xfc001f80, "cM5(s,b),fT", pa10, FLAG_STRICT}, +{ "fldw", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT}, +{ "fldw", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT}, +{ "fldw", 0x5c000000, 0xfc000004, "y(b),fe", pa20w, FLAG_STRICT}, +{ "fldw", 0x58000000, 0xfc000000, "cJy(b),fe", pa20w, FLAG_STRICT}, +{ "fldw", 0x5c000000, 0xfc00c004, "d(b),fe", pa20, FLAG_STRICT}, +{ "fldw", 0x5c000000, 0xfc000004, "d(s,b),fe", pa20, FLAG_STRICT}, +{ "fldw", 0x58000000, 0xfc00c000, "cJd(b),fe", pa20, FLAG_STRICT}, +{ "fldw", 0x58000000, 0xfc000000, "cJd(s,b),fe", pa20, FLAG_STRICT}, +{ "fldd", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT}, +{ "fldd", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT}, +{ "fldd", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT}, +{ "fldd", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT}, +{ "fldd", 0x2c001020, 0xfc1ff3e0, "cocc@(b),ft", pa20, FLAG_STRICT}, +{ "fldd", 0x2c001020, 0xfc1f33e0, "cocc@(s,b),ft", pa20, FLAG_STRICT}, +{ "fldd", 0x2c001000, 0xfc00dfc0, "cM5(b),ft", pa10, FLAG_STRICT}, +{ "fldd", 0x2c001000, 0xfc001fc0, "cM5(s,b),ft", pa10, FLAG_STRICT}, +{ "fldd", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT}, +{ "fldd", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT}, +{ "fldd", 0x50000002, 0xfc000002, "cq&(b),fx", pa20w, FLAG_STRICT}, +{ "fldd", 0x50000002, 0xfc00c002, "cq#(b),fx", pa20, FLAG_STRICT}, +{ "fldd", 0x50000002, 0xfc000002, "cq#(s,b),fx", pa20, FLAG_STRICT}, +{ "fstw", 0x24000200, 0xfc00df80, "cXfT,x(b)", pa10, FLAG_STRICT}, +{ "fstw", 0x24000200, 0xfc001f80, "cXfT,x(s,b)", pa10, FLAG_STRICT}, +{ "fstw", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT}, +{ "fstw", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT}, +{ "fstw", 0x24001220, 0xfc1ff3a0, "cocCfT,@(b)", pa20, FLAG_STRICT}, +{ "fstw", 0x24001220, 0xfc1f33a0, "cocCfT,@(s,b)", pa20, FLAG_STRICT}, +{ "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT}, +{ "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT}, +{ "fstw", 0x24001200, 0xfc00df80, "cMfT,5(b)", pa10, FLAG_STRICT}, +{ "fstw", 0x24001200, 0xfc001f80, "cMfT,5(s,b)", pa10, FLAG_STRICT}, +{ "fstw", 0x7c000000, 0xfc000004, "fE,y(b)", pa20w, FLAG_STRICT}, +{ "fstw", 0x78000000, 0xfc000000, "cJfE,y(b)", pa20w, FLAG_STRICT}, +{ "fstw", 0x7c000000, 0xfc00c004, "fE,d(b)", pa20, FLAG_STRICT}, +{ "fstw", 0x7c000000, 0xfc000004, "fE,d(s,b)", pa20, FLAG_STRICT}, +{ "fstw", 0x78000000, 0xfc00c000, "cJfE,d(b)", pa20, FLAG_STRICT}, +{ "fstw", 0x78000000, 0xfc000000, "cJfE,d(s,b)", pa20, FLAG_STRICT}, +{ "fstd", 0x2c000200, 0xfc00dfc0, "cXft,x(b)", pa10, FLAG_STRICT}, +{ "fstd", 0x2c000200, 0xfc001fc0, "cXft,x(s,b)", pa10, FLAG_STRICT}, +{ "fstd", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT}, +{ "fstd", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT}, +{ "fstd", 0x2c001220, 0xfc1ff3e0, "cocCft,@(b)", pa20, FLAG_STRICT}, +{ "fstd", 0x2c001220, 0xfc1f33e0, "cocCft,@(s,b)", pa20, FLAG_STRICT}, +{ "fstd", 0x2c001200, 0xfc00dfc0, "cMft,5(b)", pa10, FLAG_STRICT}, +{ "fstd", 0x2c001200, 0xfc001fc0, "cMft,5(s,b)", pa10, FLAG_STRICT}, +{ "fstd", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT}, +{ "fstd", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT}, +{ "fstd", 0x70000002, 0xfc000002, "cqfx,&(b)", pa20w, FLAG_STRICT}, +{ "fstd", 0x70000002, 0xfc00c002, "cqfx,#(b)", pa20, FLAG_STRICT}, +{ "fstd", 0x70000002, 0xfc000002, "cqfx,#(s,b)", pa20, FLAG_STRICT}, +{ "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, FLAG_STRICT}, +{ "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, FLAG_STRICT}, +{ "fldwx", 0x24000000, 0xfc00d380, "cxccx(b),fT", pa11, FLAG_STRICT}, +{ "fldwx", 0x24000000, 0xfc001380, "cxccx(s,b),fT", pa11, FLAG_STRICT}, +{ "fldwx", 0x24000000, 0xfc00df80, "cXx(b),fT", pa10, 0}, +{ "fldwx", 0x24000000, 0xfc001f80, "cXx(s,b),fT", pa10, 0}, +{ "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, FLAG_STRICT}, +{ "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, FLAG_STRICT}, +{ "flddx", 0x2c000000, 0xfc00d3c0, "cxccx(b),ft", pa11, FLAG_STRICT}, +{ "flddx", 0x2c000000, 0xfc0013c0, "cxccx(s,b),ft", pa11, FLAG_STRICT}, +{ "flddx", 0x2c000000, 0xfc00dfc0, "cXx(b),ft", pa10, 0}, +{ "flddx", 0x2c000000, 0xfc001fc0, "cXx(s,b),ft", pa10, 0}, +{ "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, FLAG_STRICT}, +{ "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, FLAG_STRICT}, +{ "fstwx", 0x24000200, 0xfc00d380, "cxcCfT,x(b)", pa11, FLAG_STRICT}, +{ "fstwx", 0x24000200, 0xfc001380, "cxcCfT,x(s,b)", pa11, FLAG_STRICT}, +{ "fstwx", 0x24000200, 0xfc00df80, "cxfT,x(b)", pa10, 0}, +{ "fstwx", 0x24000200, 0xfc001f80, "cxfT,x(s,b)", pa10, 0}, +{ "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, FLAG_STRICT}, +{ "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, FLAG_STRICT}, +{ "fstdx", 0x2c000200, 0xfc00d3c0, "cxcCft,x(b)", pa11, FLAG_STRICT}, +{ "fstdx", 0x2c000200, 0xfc0013c0, "cxcCft,x(s,b)", pa11, FLAG_STRICT}, +{ "fstdx", 0x2c000200, 0xfc00dfc0, "cxft,x(b)", pa10, 0}, +{ "fstdx", 0x2c000200, 0xfc001fc0, "cxft,x(s,b)", pa10, 0}, +{ "fstqx", 0x3c000200, 0xfc00dfc0, "cXft,x(b)", pa10, 0}, +{ "fstqx", 0x3c000200, 0xfc001fc0, "cXft,x(s,b)", pa10, 0}, +{ "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, FLAG_STRICT}, +{ "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, FLAG_STRICT}, +{ "fldws", 0x24001000, 0xfc00d380, "cmcc5(b),fT", pa11, FLAG_STRICT}, +{ "fldws", 0x24001000, 0xfc001380, "cmcc5(s,b),fT", pa11, FLAG_STRICT}, +{ "fldws", 0x24001000, 0xfc00df80, "cm5(b),fT", pa10, 0}, +{ "fldws", 0x24001000, 0xfc001f80, "cm5(s,b),fT", pa10, 0}, +{ "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, FLAG_STRICT}, +{ "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, FLAG_STRICT}, +{ "fldds", 0x2c001000, 0xfc00d3c0, "cmcc5(b),ft", pa11, FLAG_STRICT}, +{ "fldds", 0x2c001000, 0xfc0013c0, "cmcc5(s,b),ft", pa11, FLAG_STRICT}, +{ "fldds", 0x2c001000, 0xfc00dfc0, "cm5(b),ft", pa10, 0}, +{ "fldds", 0x2c001000, 0xfc001fc0, "cm5(s,b),ft", pa10, 0}, +{ "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, FLAG_STRICT}, +{ "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, FLAG_STRICT}, +{ "fstws", 0x24001200, 0xfc00d380, "cmcCfT,5(b)", pa11, FLAG_STRICT}, +{ "fstws", 0x24001200, 0xfc001380, "cmcCfT,5(s,b)", pa11, FLAG_STRICT}, +{ "fstws", 0x24001200, 0xfc00df80, "cmfT,5(b)", pa10, 0}, +{ "fstws", 0x24001200, 0xfc001f80, "cmfT,5(s,b)", pa10, 0}, +{ "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, FLAG_STRICT}, +{ "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, FLAG_STRICT}, +{ "fstds", 0x2c001200, 0xfc00d3c0, "cmcCft,5(b)", pa11, FLAG_STRICT}, +{ "fstds", 0x2c001200, 0xfc0013c0, "cmcCft,5(s,b)", pa11, FLAG_STRICT}, +{ "fstds", 0x2c001200, 0xfc00dfc0, "cmft,5(b)", pa10, 0}, +{ "fstds", 0x2c001200, 0xfc001fc0, "cmft,5(s,b)", pa10, 0}, +{ "fstqs", 0x3c001200, 0xfc00dfc0, "cMft,5(b)", pa10, 0}, +{ "fstqs", 0x3c001200, 0xfc001fc0, "cMft,5(s,b)", pa10, 0}, +{ "fadd", 0x30000600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, +{ "fadd", 0x38000600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, +{ "fsub", 0x30002600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, +{ "fsub", 0x38002600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, +{ "fmpy", 0x30004600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, +{ "fmpy", 0x38004600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, +{ "fdiv", 0x30006600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, +{ "fdiv", 0x38006600, 0xfc00e720, "IfA,fB,fT", pa10, 0}, +{ "fsqrt", 0x30008000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, +{ "fsqrt", 0x38008000, 0xfc1fe720, "FfA,fT", pa10, 0}, +{ "fabs", 0x30006000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, +{ "fabs", 0x38006000, 0xfc1fe720, "FfA,fT", pa10, 0}, +{ "frem", 0x30008600, 0xfc00e7e0, "Ffa,fb,fT", pa10, 0}, +{ "frem", 0x38008600, 0xfc00e720, "FfA,fB,fT", pa10, 0}, +{ "frnd", 0x3000a000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, +{ "frnd", 0x3800a000, 0xfc1fe720, "FfA,fT", pa10, 0}, +{ "fcpy", 0x30004000, 0xfc1fe7e0, "Ffa,fT", pa10, 0}, +{ "fcpy", 0x38004000, 0xfc1fe720, "FfA,fT", pa10, 0}, +{ "fcnvff", 0x30000200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, +{ "fcnvff", 0x38000200, 0xfc1f8720, "FGfA,fT", pa10, 0}, +{ "fcnvxf", 0x30008200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, +{ "fcnvxf", 0x38008200, 0xfc1f8720, "FGfA,fT", pa10, 0}, +{ "fcnvfx", 0x30010200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, +{ "fcnvfx", 0x38010200, 0xfc1f8720, "FGfA,fT", pa10, 0}, +{ "fcnvfxt", 0x30018200, 0xfc1f87e0, "FGfa,fT", pa10, 0}, +{ "fcnvfxt", 0x38018200, 0xfc1f8720, "FGfA,fT", pa10, 0}, +{ "fmpyfadd", 0xb8000000, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT}, +{ "fmpynfadd", 0xb8000020, 0xfc000020, "IfA,fB,fC,fT", pa20, FLAG_STRICT}, +{ "fneg", 0x3000c000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT}, +{ "fneg", 0x3800c000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT}, +{ "fnegabs", 0x3000e000, 0xfc1fe7e0, "Ffa,fT", pa20, FLAG_STRICT}, +{ "fnegabs", 0x3800e000, 0xfc1fe720, "IfA,fT", pa20, FLAG_STRICT}, +{ "fcnv", 0x30000200, 0xfc1c0720, "{_fa,fT", pa20, FLAG_STRICT}, +{ "fcnv", 0x38000200, 0xfc1c0720, "FGfA,fT", pa20, FLAG_STRICT}, +{ "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, FLAG_STRICT}, +{ "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, FLAG_STRICT}, +{ "fcmp", 0x30000400, 0xfc0007e0, "F?ffa,fb,h", pa20, FLAG_STRICT}, +{ "fcmp", 0x38000400, 0xfc000720, "I?ffA,fB,h", pa20, FLAG_STRICT}, +{ "fcmp", 0x30000400, 0xfc00e7e0, "F?ffa,fb", pa10, 0}, +{ "fcmp", 0x38000400, 0xfc00e720, "I?ffA,fB", pa10, 0}, +{ "xmpyu", 0x38004700, 0xfc00e720, "fX,fB,fT", pa11, 0}, +{ "fmpyadd", 0x18000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0}, +{ "fmpysub", 0x98000000, 0xfc000000, "Hfi,fj,fk,fl,fm", pa11, 0}, +{ "ftest", 0x30002420, 0xffffffff, "", pa10, FLAG_STRICT}, +{ "ftest", 0x30002420, 0xffffffe0, ",=", pa20, FLAG_STRICT}, +{ "ftest", 0x30000420, 0xffff1fff, "m", pa20, FLAG_STRICT}, +{ "fid", 0x30000000, 0xffffffff, "", pa11, 0}, + +/* Performance Monitor Instructions. */ + +{ "pmdis", 0x30000280, 0xffffffdf, "N", pa20, FLAG_STRICT}, +{ "pmenb", 0x30000680, 0xffffffff, "", pa20, FLAG_STRICT}, + +/* Assist Instructions. */ + +{ "spop0", 0x10000000, 0xfc000600, "v,ON", pa10, 0}, +{ "spop1", 0x10000200, 0xfc000600, "v,oNt", pa10, 0}, +{ "spop2", 0x10000400, 0xfc000600, "v,1Nb", pa10, 0}, +{ "spop3", 0x10000600, 0xfc000600, "v,0Nx,b", pa10, 0}, +{ "copr", 0x30000000, 0xfc000000, "u,2N", pa10, 0}, +{ "cldw", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, +{ "cldw", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, +{ "cldw", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, +{ "cldw", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, +{ "cldw", 0x24001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT}, +{ "cldw", 0x24001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT}, +{ "cldw", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, +{ "cldw", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, +{ "cldw", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, +{ "cldw", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "cldd", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, +{ "cldd", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, +{ "cldd", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, +{ "cldd", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, +{ "cldd", 0x2c001000, 0xfc00d200, "ucocc@(b),t", pa20, FLAG_STRICT}, +{ "cldd", 0x2c001000, 0xfc001200, "ucocc@(s,b),t", pa20, FLAG_STRICT}, +{ "cldd", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, +{ "cldd", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, +{ "cldd", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, +{ "cldd", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "cstw", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, +{ "cstw", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, +{ "cstw", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, +{ "cstw", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, +{ "cstw", 0x24001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT}, +{ "cstw", 0x24001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT}, +{ "cstw", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, +{ "cstw", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, +{ "cstw", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, +{ "cstw", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, +{ "cstd", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, +{ "cstd", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, +{ "cstd", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, +{ "cstd", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, +{ "cstd", 0x2c001200, 0xfc00d200, "ucocCt,@(b)", pa20, FLAG_STRICT}, +{ "cstd", 0x2c001200, 0xfc001200, "ucocCt,@(s,b)", pa20, FLAG_STRICT}, +{ "cstd", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, +{ "cstd", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, +{ "cstd", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, +{ "cstd", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, +{ "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, +{ "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, +{ "cldwx", 0x24000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, +{ "cldwx", 0x24000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, +{ "cldwx", 0x24000000, 0xfc00de00, "ucXx(b),t", pa10, 0}, +{ "cldwx", 0x24000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0}, +{ "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, FLAG_STRICT}, +{ "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, FLAG_STRICT}, +{ "clddx", 0x2c000000, 0xfc00d200, "ucxccx(b),t", pa11, FLAG_STRICT}, +{ "clddx", 0x2c000000, 0xfc001200, "ucxccx(s,b),t", pa11, FLAG_STRICT}, +{ "clddx", 0x2c000000, 0xfc00de00, "ucXx(b),t", pa10, 0}, +{ "clddx", 0x2c000000, 0xfc001e00, "ucXx(s,b),t", pa10, 0}, +{ "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, +{ "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, +{ "cstwx", 0x24000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, +{ "cstwx", 0x24000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, +{ "cstwx", 0x24000200, 0xfc00de00, "ucXt,x(b)", pa10, 0}, +{ "cstwx", 0x24000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0}, +{ "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, FLAG_STRICT}, +{ "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, FLAG_STRICT}, +{ "cstdx", 0x2c000200, 0xfc00d200, "ucxcCt,x(b)", pa11, FLAG_STRICT}, +{ "cstdx", 0x2c000200, 0xfc001200, "ucxcCt,x(s,b)", pa11, FLAG_STRICT}, +{ "cstdx", 0x2c000200, 0xfc00de00, "ucXt,x(b)", pa10, 0}, +{ "cstdx", 0x2c000200, 0xfc001e00, "ucXt,x(s,b)", pa10, 0}, +{ "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, +{ "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, +{ "cldws", 0x24001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, +{ "cldws", 0x24001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "cldws", 0x24001000, 0xfc00de00, "ucM5(b),t", pa10, 0}, +{ "cldws", 0x24001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0}, +{ "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, FLAG_STRICT}, +{ "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, FLAG_STRICT}, +{ "cldds", 0x2c001000, 0xfc00d200, "ucmcc5(b),t", pa11, FLAG_STRICT}, +{ "cldds", 0x2c001000, 0xfc001200, "ucmcc5(s,b),t", pa11, FLAG_STRICT}, +{ "cldds", 0x2c001000, 0xfc00de00, "ucM5(b),t", pa10, 0}, +{ "cldds", 0x2c001000, 0xfc001e00, "ucM5(s,b),t", pa10, 0}, +{ "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, +{ "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, +{ "cstws", 0x24001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, +{ "cstws", 0x24001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, +{ "cstws", 0x24001200, 0xfc00de00, "ucMt,5(b)", pa10, 0}, +{ "cstws", 0x24001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0}, +{ "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, FLAG_STRICT}, +{ "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, FLAG_STRICT}, +{ "cstds", 0x2c001200, 0xfc00d200, "ucmcCt,5(b)", pa11, FLAG_STRICT}, +{ "cstds", 0x2c001200, 0xfc001200, "ucmcCt,5(s,b)", pa11, FLAG_STRICT}, +{ "cstds", 0x2c001200, 0xfc00de00, "ucMt,5(b)", pa10, 0}, +{ "cstds", 0x2c001200, 0xfc001e00, "ucMt,5(s,b)", pa10, 0}, + +/* More pseudo instructions which must follow the main table. */ +{ "call", 0xe800f000, 0xfc1ffffd, "n(b)", pa20, FLAG_STRICT}, +{ "call", 0xe800a000, 0xffe0e000, "nW", pa10, FLAG_STRICT}, +{ "ret", 0xe840d000, 0xfffffffd, "n", pa20, FLAG_STRICT}, + +}; + +#define NUMOPCODES ((sizeof pa_opcodes)/(sizeof pa_opcodes[0])) + +/* SKV 12/18/92. Added some denotations for various operands. */ + +#define PA_IMM11_AT_31 'i' +#define PA_IMM14_AT_31 'j' +#define PA_IMM21_AT_31 'k' +#define PA_DISP12 'w' +#define PA_DISP17 'W' + +#define N_HPPA_OPERAND_FORMATS 5 diff --git a/include/opcode/i370.h b/include/opcode/i370.h new file mode 100644 index 0000000..e3b7166 --- /dev/null +++ b/include/opcode/i370.h @@ -0,0 +1,267 @@ +/* i370.h -- Header file for S/390 opcode table + Copyright 1994, 1995, 1998, 1999, 2000, 2003, 2010 + Free Software Foundation, Inc. + PowerPC version written by Ian Lance Taylor, Cygnus Support + Rewritten for i370 ESA/390 support, Linas Vepstas + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef I370_H +#define I370_H + +/* The opcode table is an array of struct i370_opcode. */ +typedef union +{ + unsigned int i[2]; + unsigned short s[4]; + unsigned char b[8]; +} i370_insn_t; + +struct i370_opcode +{ + /* The opcode name. */ + const char *name; + + /* the length of the instruction */ + char len; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + i370_insn_t opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + i370_insn_t mask; + + /* One bit flags for the opcode. These are used to indicate which + specific processors support the instructions. The defined values + are listed below. */ + unsigned long flags; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[8]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct i370_opcode i370_opcodes[]; +extern const int i370_num_opcodes; + +/* Values defined for the flags field of a struct i370_opcode. */ + +/* Opcode is defined for the original 360 architecture. */ +#define I370_OPCODE_360 (0x01) + +/* Opcode is defined for the 370 architecture. */ +#define I370_OPCODE_370 (0x02) + +/* Opcode is defined for the 370-XA architecture. */ +#define I370_OPCODE_370_XA (0x04) + +/* Opcode is defined for the ESA/370 architecture. */ +#define I370_OPCODE_ESA370 (0x08) + +/* Opcode is defined for the ESA/390 architecture. */ +#define I370_OPCODE_ESA390 (0x10) + +/* Opcode is defined for the ESA/390 w/ BFP facility. */ +#define I370_OPCODE_ESA390_BF (0x20) + +/* Opcode is defined for the ESA/390 w/ branch & set authority facility. */ +#define I370_OPCODE_ESA390_BS (0x40) + +/* Opcode is defined for the ESA/390 w/ checksum facility. */ +#define I370_OPCODE_ESA390_CK (0x80) + +/* Opcode is defined for the ESA/390 w/ compare & move extended facility. */ +#define I370_OPCODE_ESA390_CM (0x100) + +/* Opcode is defined for the ESA/390 w/ flt.pt. support extensions facility. */ +#define I370_OPCODE_ESA390_FX (0x200) + +/* Opcode is defined for the ESA/390 w/ HFP facility. */ +#define I370_OPCODE_ESA390_HX (0x400) + +/* Opcode is defined for the ESA/390 w/ immediate & relative facility. */ +#define I370_OPCODE_ESA390_IR (0x800) + +/* Opcode is defined for the ESA/390 w/ move-inverse facility. */ +#define I370_OPCODE_ESA390_MI (0x1000) + +/* Opcode is defined for the ESA/390 w/ program-call-fast facility. */ +#define I370_OPCODE_ESA390_PC (0x2000) + +/* Opcode is defined for the ESA/390 w/ perform-locked-op facility. */ +#define I370_OPCODE_ESA390_PL (0x4000) + +/* Opcode is defined for the ESA/390 w/ square-root facility. */ +#define I370_OPCODE_ESA390_QR (0x8000) + +/* Opcode is defined for the ESA/390 w/ resume-program facility. */ +#define I370_OPCODE_ESA390_RP (0x10000) + +/* Opcode is defined for the ESA/390 w/ set-address-space-fast facility. */ +#define I370_OPCODE_ESA390_SA (0x20000) + +/* Opcode is defined for the ESA/390 w/ subspace group facility. */ +#define I370_OPCODE_ESA390_SG (0x40000) + +/* Opcode is defined for the ESA/390 w/ string facility. */ +#define I370_OPCODE_ESA390_SR (0x80000) + +/* Opcode is defined for the ESA/390 w/ trap facility. */ +#define I370_OPCODE_ESA390_TR (0x100000) + +#define I370_OPCODE_ESA390_SUPERSET (0x1fffff) + + +/* The operands table is an array of struct i370_operand. */ + +struct i370_operand +{ + /* The number of bits in the operand. */ + int bits; + + /* How far the operand is left shifted in the instruction. */ + int shift; + + /* Insertion function. This is used by the assembler. To insert an + operand value into an instruction, check this field. + + If it is NULL, execute + i |= (op & ((1 << o->bits) - 1)) << o->shift; + (i is the instruction which we are filling in, o is a pointer to + this structure, and op is the opcode value; this assumes twos + complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction and the operand value. It will return the new value + of the instruction. If the ERRMSG argument is not NULL, then if + the operand value is illegal, *ERRMSG will be set to a warning + string (the operand will be inserted in any case). If the + operand value is legal, *ERRMSG will be unchanged (most operands + can accept any value). */ + i370_insn_t (*insert) + (i370_insn_t instruction, long op, const char **errmsg); + + /* Extraction function. This is used by the disassembler. To + extract this operand type from an instruction, check this field. + + If it is NULL, compute + op = ((i) >> o->shift) & ((1 << o->bits) - 1); + if ((o->flags & I370_OPERAND_SIGNED) != 0 + && (op & (1 << (o->bits - 1))) != 0) + op -= 1 << o->bits; + (i is the instruction, o is a pointer to this structure, and op + is the result; this assumes twos complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction value. It will return the value of the operand. If + the INVALID argument is not NULL, *INVALID will be set to + non-zero if this operand type can not actually be extracted from + this operand (i.e., the instruction does not match). If the + operand is valid, *INVALID will not be changed. */ + long (*extract) (i370_insn_t instruction, int *invalid); + + /* One bit syntax flags. */ + unsigned long flags; + + /* name -- handy for debugging, otherwise pointless */ + char * name; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the i370_opcodes table. */ + +extern const struct i370_operand i370_operands[]; + +/* Values defined for the flags field of a struct i370_operand. */ + +/* This operand should be wrapped in parentheses rather than + separated from the previous by a comma. This is used for S, RS and + SS form instructions which want their operands to look like + reg,displacement(basereg) */ +#define I370_OPERAND_SBASE (0x01) + +/* This operand is a base register. It may or may not appear next + to an index register, i.e. either of the two forms + reg,displacement(basereg) + reg,displacement(index,basereg) */ +#define I370_OPERAND_BASE (0x02) + +/* This pair of operands should be wrapped in parentheses rather than + separated from the last by a comma. This is used for the RX form + instructions which want their operands to look like + reg,displacement(index,basereg) */ +#define I370_OPERAND_INDEX (0x04) + +/* This operand names a register. The disassembler uses this to print + register names with a leading 'r'. */ +#define I370_OPERAND_GPR (0x08) + +/* This operand names a floating point register. The disassembler + prints these with a leading 'f'. */ +#define I370_OPERAND_FPR (0x10) + +/* This operand is a displacement. */ +#define I370_OPERAND_RELATIVE (0x20) + +/* This operand is a length, such as that in SS form instructions. */ +#define I370_OPERAND_LENGTH (0x40) + +/* This operand is optional, and is zero if omitted. This is used for + the optional B2 field in the shift-left, shift-right instructions. The + assembler must count the number of operands remaining on the line, + and the number of operands remaining for the opcode, and decide + whether this operand is present or not. The disassembler should + print this operand out only if it is not zero. */ +#define I370_OPERAND_OPTIONAL (0x80) + + +/* Define some misc macros. We keep them with the operands table + for simplicity. The macro table is an array of struct i370_macro. */ + +struct i370_macro +{ + /* The macro name. */ + const char *name; + + /* The number of operands the macro takes. */ + unsigned int operands; + + /* One bit flags for the opcode. These are used to indicate which + specific processors support the instructions. The values are the + same as those for the struct i370_opcode flags field. */ + unsigned long flags; + + /* A format string to turn the macro into a normal instruction. + Each %N in the string is replaced with operand number N (zero + based). */ + const char *format; +}; + +extern const struct i370_macro i370_macros[]; +extern const int i370_num_macros; + + +#endif /* I370_H */ diff --git a/include/opcode/i386.h b/include/opcode/i386.h new file mode 100644 index 0000000..6021002 --- /dev/null +++ b/include/opcode/i386.h @@ -0,0 +1,148 @@ +/* opcode/i386.h -- Intel 80386 opcode macros + Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* The SystemV/386 SVR3.2 assembler, and probably all AT&T derived + ix86 Unix assemblers, generate floating point instructions with + reversed source and destination registers in certain cases. + Unfortunately, gcc and possibly many other programs use this + reversed syntax, so we're stuck with it. + + eg. `fsub %st(3),%st' results in st = st - st(3) as expected, but + `fsub %st,%st(3)' results in st(3) = st - st(3), rather than + the expected st(3) = st(3) - st + + This happens with all the non-commutative arithmetic floating point + operations with two register operands, where the source register is + %st, and destination register is %st(i). + + The affected opcode map is dceX, dcfX, deeX, defX. */ + +#ifndef OPCODE_I386_H +#define OPCODE_I386_H + +#ifndef SYSV386_COMPAT +/* Set non-zero for broken, compatible instructions. Set to zero for + non-broken opcodes at your peril. gcc generates SystemV/386 + compatible instructions. */ +#define SYSV386_COMPAT 1 +#endif +#ifndef OLDGCC_COMPAT +/* Set non-zero to cater for old (<= 2.8.1) versions of gcc that could + generate nonsense fsubp, fsubrp, fdivp and fdivrp with operands + reversed. */ +#define OLDGCC_COMPAT SYSV386_COMPAT +#endif + +#define MOV_AX_DISP32 0xa0 +#define POP_SEG_SHORT 0x07 +#define JUMP_PC_RELATIVE 0xeb +#define INT_OPCODE 0xcd +#define INT3_OPCODE 0xcc +/* The opcode for the fwait instruction, which disassembler treats as a + prefix when it can. */ +#define FWAIT_OPCODE 0x9b + +/* Instruction prefixes. + NOTE: For certain SSE* instructions, 0x66,0xf2,0xf3 are treated as + part of the opcode. Other prefixes may still appear between them + and the 0x0f part of the opcode. */ +#define ADDR_PREFIX_OPCODE 0x67 +#define DATA_PREFIX_OPCODE 0x66 +#define LOCK_PREFIX_OPCODE 0xf0 +#define CS_PREFIX_OPCODE 0x2e +#define DS_PREFIX_OPCODE 0x3e +#define ES_PREFIX_OPCODE 0x26 +#define FS_PREFIX_OPCODE 0x64 +#define GS_PREFIX_OPCODE 0x65 +#define SS_PREFIX_OPCODE 0x36 +#define REPNE_PREFIX_OPCODE 0xf2 +#define REPE_PREFIX_OPCODE 0xf3 +#define XACQUIRE_PREFIX_OPCODE 0xf2 +#define XRELEASE_PREFIX_OPCODE 0xf3 +#define BND_PREFIX_OPCODE 0xf2 + +#define TWO_BYTE_OPCODE_ESCAPE 0x0f +#define NOP_OPCODE (char) 0x90 + +/* register numbers */ +#define EAX_REG_NUM 0 +#define ECX_REG_NUM 1 +#define EDX_REG_NUM 2 +#define EBX_REG_NUM 3 +#define ESP_REG_NUM 4 +#define EBP_REG_NUM 5 +#define ESI_REG_NUM 6 +#define EDI_REG_NUM 7 + +/* modrm_byte.regmem for twobyte escape */ +#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM +/* index_base_byte.index for no index register addressing */ +#define NO_INDEX_REGISTER ESP_REG_NUM +/* index_base_byte.base for no base register addressing */ +#define NO_BASE_REGISTER EBP_REG_NUM +#define NO_BASE_REGISTER_16 6 + +/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */ +#define REGMEM_FIELD_HAS_REG 0x3/* always = 0x3 */ +#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG) + +/* Extract fields from the mod/rm byte. */ +#define MODRM_MOD_FIELD(modrm) (((modrm) >> 6) & 3) +#define MODRM_REG_FIELD(modrm) (((modrm) >> 3) & 7) +#define MODRM_RM_FIELD(modrm) (((modrm) >> 0) & 7) + +/* Extract fields from the sib byte. */ +#define SIB_SCALE_FIELD(sib) (((sib) >> 6) & 3) +#define SIB_INDEX_FIELD(sib) (((sib) >> 3) & 7) +#define SIB_BASE_FIELD(sib) (((sib) >> 0) & 7) + +/* x86-64 extension prefix. */ +#define REX_OPCODE 0x40 + +/* Non-zero if OPCODE is the rex prefix. */ +#define REX_PREFIX_P(opcode) (((opcode) & 0xf0) == REX_OPCODE) + +/* Indicates 64 bit operand size. */ +#define REX_W 8 +/* High extension to reg field of modrm byte. */ +#define REX_R 4 +/* High extension to SIB index field. */ +#define REX_X 2 +/* High extension to base field of modrm or SIB, or reg field of opcode. */ +#define REX_B 1 + +/* max operands per insn */ +#define MAX_OPERANDS 5 + +/* max immediates per insn (lcall, ljmp, insertq, extrq) */ +#define MAX_IMMEDIATE_OPERANDS 2 + +/* max memory refs per insn (string ops) */ +#define MAX_MEMORY_OPERANDS 2 + +/* max size of insn mnemonics. */ +#define MAX_MNEM_SIZE 20 + +/* max size of register name in insn mnemonics. */ +#define MAX_REG_NAME_SIZE 8 + +#endif /* OPCODE_I386_H */ diff --git a/include/opcode/i860.h b/include/opcode/i860.h new file mode 100644 index 0000000..7f4aafd --- /dev/null +++ b/include/opcode/i860.h @@ -0,0 +1,507 @@ +/* Table of opcodes for the i860. + Copyright 1989, 1991, 2000, 2002, 2003, 2010 + Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. + + GAS/GDB 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, or (at your option) + any later version. + + GAS/GDB 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 GAS or GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* Structure of an opcode table entry. */ +struct i860_opcode +{ + /* The opcode name. */ + const char *name; + + /* Bits that must be set. */ + unsigned long match; + + /* Bits that must not be set. */ + unsigned long lose; + + const char *args; + + /* Nonzero if this is a possible expand-instruction. */ + char expand; +}; + + +enum expand_type +{ + E_MOV = 1, E_ADDR, E_U32, E_AND, E_S32, E_DELAY, XP_ONLY +}; + + +/* All i860 opcodes are 32 bits, except for the pseudo-instructions + and the operations utilizing a 32-bit address expression, an + unsigned 32-bit constant, or a signed 32-bit constant. + These opcodes are expanded into a two-instruction sequence for + any situation where the immediate operand does not fit in 32 bits. + In the case of the add and subtract operations the expansion is + to a three-instruction sequence (ex: orh, or, adds). In cases + where the address is to be relocated, the instruction is + expanded to handle the worse case, this could be optimized at + the final link if the actual address were known. + + The pseudoinstructions are: mov, fmov, pmov, nop, and fnop. + These instructions are implemented as a one or two instruction + sequence of other operations. + + The match component is a mask saying which bits must match a + particular opcode in order for an instruction to be an instance + of that opcode. + + The args component is a string containing one character + for each operand of the instruction. + +Kinds of operands: + # Number used by optimizer. It is ignored. + 1 src1 integer register. + 2 src2 integer register. + d dest register. + c ctrlreg control register. + i 16 bit immediate. + I 16 bit immediate, aligned 2^0. (ld.b) + J 16 bit immediate, aligned 2^1. (ld.s) + K 16 bit immediate, aligned 2^2. (ld.l, {p}fld.l, fst.l) + L 16 bit immediate, aligned 2^3. ({p}fld.d, fst.d) + M 16 bit immediate, aligned 2^4. ({p}fld.q, fst.q) + 5 5 bit immediate. + l lbroff 26 bit PC relative immediate. + r sbroff 16 bit PC relative immediate. + s split 16 bit immediate. + S split 16 bit immediate, aligned 2^0. (st.b) + T split 16 bit immediate, aligned 2^1. (st.s) + U split 16 bit immediate, aligned 2^2. (st.l) + e src1 floating point register. + f src2 floating point register. + g dest floating point register. */ + + +/* The order of the opcodes in this table is significant. The assembler + requires that all instances of the same mnemonic must be consecutive. + If they aren't, the assembler will not function properly. + + The order of opcodes does not affect the disassembler. */ + +static const struct i860_opcode i860_opcodes[] = +{ +/* REG-Format Instructions. */ +{ "ld.c", 0x30000000, 0xcc000000, "c,d", 0 }, /* ld.c csrc2,idest */ +{ "ld.b", 0x00000000, 0xfc000000, "1(2),d", 0 }, /* ld.b isrc1(isrc2),idest */ +{ "ld.b", 0x04000000, 0xf8000000, "I(2),d", E_ADDR }, /* ld.b #const(isrc2),idest */ +{ "ld.s", 0x10000000, 0xec000001, "1(2),d", 0 }, /* ld.s isrc1(isrc2),idest */ +{ "ld.s", 0x14000000, 0xe8000001, "J(2),d", E_ADDR }, /* ld.s #const(isrc2),idest */ +{ "ld.l", 0x10000001, 0xec000000, "1(2),d", 0 }, /* ld.l isrc1(isrc2),idest */ +{ "ld.l", 0x14000001, 0xe8000000, "K(2),d", E_ADDR }, /* ld.l #const(isrc2),idest */ + +{ "st.c", 0x38000000, 0xc4000000, "1,c", 0 }, /* st.c isrc1ni,csrc2 */ +{ "st.b", 0x0c000000, 0xf0000000, "1,S(2)", E_ADDR }, /* st.b isrc1ni,#const(isrc2) */ +{ "st.s", 0x1c000000, 0xe0000001, "1,T(2)", E_ADDR }, /* st.s isrc1ni,#const(isrc2) */ +{ "st.l", 0x1c000001, 0xe0000000, "1,U(2)", E_ADDR }, /* st.l isrc1ni,#const(isrc2) */ + +{ "ixfr", 0x08000000, 0xf4000000, "1,g", 0 }, /* ixfr isrc1ni,fdest */ + +{ "fld.l", 0x20000002, 0xdc000001, "1(2),g", 0 }, /* fld.l isrc1(isrc2),fdest */ +{ "fld.l", 0x24000002, 0xd8000001, "K(2),g", E_ADDR }, /* fld.l #const(isrc2),fdest */ +{ "fld.l", 0x20000003, 0xdc000000, "1(2)++,g", 0 }, /* fld.l isrc1(isrc2)++,fdest */ +{ "fld.l", 0x24000003, 0xd8000000, "K(2)++,g", E_ADDR }, /* fld.l #const(isrc2)++,fdest */ +{ "fld.d", 0x20000000, 0xdc000007, "1(2),g", 0 }, /* fld.d isrc1(isrc2),fdest */ +{ "fld.d", 0x24000000, 0xd8000007, "L(2),g", E_ADDR }, /* fld.d #const(isrc2),fdest */ +{ "fld.d", 0x20000001, 0xdc000006, "1(2)++,g", 0 }, /* fld.d isrc1(isrc2)++,fdest */ +{ "fld.d", 0x24000001, 0xd8000006, "L(2)++,g", E_ADDR }, /* fld.d #const(isrc2)++,fdest */ +{ "fld.q", 0x20000004, 0xdc000003, "1(2),g", 0 }, /* fld.q isrc1(isrc2),fdest */ +{ "fld.q", 0x24000004, 0xd8000003, "M(2),g", E_ADDR }, /* fld.q #const(isrc2),fdest */ +{ "fld.q", 0x20000005, 0xdc000002, "1(2)++,g", 0 }, /* fld.q isrc1(isrc2)++,fdest */ +{ "fld.q", 0x24000005, 0xd8000002, "M(2)++,g", E_ADDR }, /* fld.q #const(isrc2)++,fdest */ + +{ "pfld.l", 0x60000002, 0x9c000001, "1(2),g", 0 }, /* pfld.l isrc1(isrc2),fdest */ +{ "pfld.l", 0x64000002, 0x98000001, "K(2),g", E_ADDR }, /* pfld.l #const(isrc2),fdest */ +{ "pfld.l", 0x60000003, 0x9c000000, "1(2)++,g", 0 }, /* pfld.l isrc1(isrc2)++,fdest */ +{ "pfld.l", 0x64000003, 0x98000000, "K(2)++,g", E_ADDR }, /* pfld.l #const(isrc2)++,fdest */ +{ "pfld.d", 0x60000000, 0x9c000007, "1(2),g", 0 }, /* pfld.d isrc1(isrc2),fdest */ +{ "pfld.d", 0x64000000, 0x98000007, "L(2),g", E_ADDR }, /* pfld.d #const(isrc2),fdest */ +{ "pfld.d", 0x60000001, 0x9c000006, "1(2)++,g", 0 }, /* pfld.d isrc1(isrc2)++,fdest */ +{ "pfld.d", 0x64000001, 0x98000006, "L(2)++,g", E_ADDR }, /* pfld.d #const(isrc2)++,fdest */ +{ "pfld.q", 0x60000004, 0x9c000003, "1(2),g", XP_ONLY }, /* pfld.q isrc1(isrc2),fdest */ +{ "pfld.q", 0x64000004, 0x98000003, "L(2),g", XP_ONLY }, /* pfld.q #const(isrc2),fdest */ +{ "pfld.q", 0x60000005, 0x9c000002, "1(2)++,g", XP_ONLY }, /* pfld.q isrc1(isrc2)++,fdest */ +{ "pfld.q", 0x64000005, 0x98000002, "L(2)++,g", XP_ONLY }, /* pfld.q #const(isrc2)++,fdest */ + +{ "fst.l", 0x28000002, 0xd4000001, "g,1(2)", 0 }, /* fst.l fdest,isrc1(isrc2) */ +{ "fst.l", 0x2c000002, 0xd0000001, "g,K(2)", E_ADDR }, /* fst.l fdest,#const(isrc2) */ +{ "fst.l", 0x28000003, 0xd4000000, "g,1(2)++", 0 }, /* fst.l fdest,isrc1(isrc2)++ */ +{ "fst.l", 0x2c000003, 0xd0000000, "g,K(2)++", E_ADDR }, /* fst.l fdest,#const(isrc2)++ */ +{ "fst.d", 0x28000000, 0xd4000007, "g,1(2)", 0 }, /* fst.d fdest,isrc1(isrc2) */ +{ "fst.d", 0x2c000000, 0xd0000007, "g,L(2)", E_ADDR }, /* fst.d fdest,#const(isrc2) */ +{ "fst.d", 0x28000001, 0xd4000006, "g,1(2)++", 0 }, /* fst.d fdest,isrc1(isrc2)++ */ +{ "fst.d", 0x2c000001, 0xd0000006, "g,L(2)++", E_ADDR }, /* fst.d fdest,#const(isrc2)++ */ +{ "fst.q", 0x28000004, 0xd4000003, "g,1(2)", 0 }, /* fst.d fdest,isrc1(isrc2) */ +{ "fst.q", 0x2c000004, 0xd0000003, "g,M(2)", E_ADDR }, /* fst.d fdest,#const(isrc2) */ +{ "fst.q", 0x28000005, 0xd4000002, "g,1(2)++", 0 }, /* fst.d fdest,isrc1(isrc2)++ */ +{ "fst.q", 0x2c000005, 0xd0000002, "g,M(2)++", E_ADDR }, /* fst.d fdest,#const(isrc2)++ */ + +{ "pst.d", 0x3c000000, 0xc0000007, "g,L(2)", E_ADDR }, /* pst.d fdest,#const(isrc2) */ +{ "pst.d", 0x3c000001, 0xc0000006, "g,L(2)++", E_ADDR }, /* pst.d fdest,#const(isrc2)++ */ + +{ "addu", 0x80000000, 0x7c000000, "1,2,d", 0 }, /* addu isrc1,isrc2,idest */ +{ "addu", 0x84000000, 0x78000000, "i,2,d", E_S32 }, /* addu #const,isrc2,idest */ +{ "adds", 0x90000000, 0x6c000000, "1,2,d", 0 }, /* adds isrc1,isrc2,idest */ +{ "adds", 0x94000000, 0x68000000, "i,2,d", E_S32 }, /* adds #const,isrc2,idest */ +{ "subu", 0x88000000, 0x74000000, "1,2,d", 0 }, /* subu isrc1,isrc2,idest */ +{ "subu", 0x8c000000, 0x70000000, "i,2,d", E_S32 }, /* subu #const,isrc2,idest */ +{ "subs", 0x98000000, 0x64000000, "1,2,d", 0 }, /* subs isrc1,isrc2,idest */ +{ "subs", 0x9c000000, 0x60000000, "i,2,d", E_S32 }, /* subs #const,isrc2,idest */ + +{ "shl", 0xa0000000, 0x5c000000, "1,2,d", 0 }, /* shl isrc1,isrc2,idest */ +{ "shl", 0xa4000000, 0x58000000, "i,2,d", 0 }, /* shl #const,isrc2,idest */ +{ "shr", 0xa8000000, 0x54000000, "1,2,d", 0 }, /* shr isrc1,isrc2,idest */ +{ "shr", 0xac000000, 0x50000000, "i,2,d", 0 }, /* shr #const,isrc2,idest */ +{ "shrd", 0xb0000000, 0x4c000000, "1,2,d", 0 }, /* shrd isrc1,isrc2,idest */ +{ "shra", 0xb8000000, 0x44000000, "1,2,d", 0 }, /* shra isrc1,isrc2,idest */ +{ "shra", 0xbc000000, 0x40000000, "i,2,d", 0 }, /* shra #const,isrc2,idest */ + +{ "mov", 0xa0000000, 0x5c00f800, "2,d", 0 }, /* shl r0,isrc2,idest */ +{ "mov", 0x94000000, 0x69e00000, "i,d", E_MOV }, /* adds #const,r0,idest */ +{ "nop", 0xa0000000, 0x5ffff800, "", 0 }, /* shl r0,r0,r0 */ +{ "fnop", 0xb0000000, 0x4ffff800, "", 0 }, /* shrd r0,r0,r0 */ + +{ "trap", 0x44000000, 0xb8000000, "1,2,d", 0 }, /* trap isrc1ni,isrc2,idest */ + +{ "flush", 0x34000004, 0xc81f0003, "L(2)", E_ADDR }, /* flush #const(isrc2) */ +{ "flush", 0x34000005, 0xc81f0002, "L(2)++", E_ADDR }, /* flush #const(isrc2)++ */ + +{ "and", 0xc0000000, 0x3c000000, "1,2,d", 0 }, /* and isrc1,isrc2,idest */ +{ "and", 0xc4000000, 0x38000000, "i,2,d", E_AND }, /* and #const,isrc2,idest */ +{ "andh", 0xcc000000, 0x30000000, "i,2,d", 0 }, /* andh #const,isrc2,idest */ +{ "andnot", 0xd0000000, 0x2c000000, "1,2,d", 0 }, /* andnot isrc1,isrc2,idest */ +{ "andnot", 0xd4000000, 0x28000000, "i,2,d", E_U32 }, /* andnot #const,isrc2,idest */ +{ "andnoth", 0xdc000000, 0x20000000, "i,2,d", 0 }, /* andnoth #const,isrc2,idest */ +{ "or", 0xe0000000, 0x1c000000, "1,2,d", 0 }, /* or isrc1,isrc2,idest */ +{ "or", 0xe4000000, 0x18000000, "i,2,d", E_U32 }, /* or #const,isrc2,idest */ +{ "orh", 0xec000000, 0x10000000, "i,2,d", 0 }, /* orh #const,isrc2,idest */ +{ "xor", 0xf0000000, 0x0c000000, "1,2,d", 0 }, /* xor isrc1,isrc2,idest */ +{ "xor", 0xf4000000, 0x08000000, "i,2,d", E_U32 }, /* xor #const,isrc2,idest */ +{ "xorh", 0xfc000000, 0x00000000, "i,2,d", 0 }, /* xorh #const,isrc2,idest */ + +{ "bte", 0x58000000, 0xa4000000, "1,2,r", 0 }, /* bte isrc1s,isrc2,sbroff */ +{ "bte", 0x5c000000, 0xa0000000, "5,2,r", 0 }, /* bte #const5,isrc2,sbroff */ +{ "btne", 0x50000000, 0xac000000, "1,2,r", 0 }, /* btne isrc1s,isrc2,sbroff */ +{ "btne", 0x54000000, 0xa8000000, "5,2,r", 0 }, /* btne #const5,isrc2,sbroff */ +{ "bla", 0xb4000000, 0x48000000, "1,2,r", E_DELAY }, /* bla isrc1s,isrc2,sbroff */ +{ "bri", 0x40000000, 0xbc000000, "1", E_DELAY }, /* bri isrc1ni */ + +/* Core Escape Instruction Format */ +{ "lock", 0x4c000001, 0xb000001e, "", 0 }, /* lock set BL in dirbase */ +{ "calli", 0x4c000002, 0xb000001d, "1", E_DELAY }, /* calli isrc1ni */ +{ "intovr", 0x4c000004, 0xb000001b, "", 0 }, /* intovr trap on integer overflow */ +{ "unlock", 0x4c000007, 0xb0000018, "", 0 }, /* unlock clear BL in dirbase */ +{ "ldio.l", 0x4c000408, 0xb00003f7, "2,d", XP_ONLY }, /* ldio.l isrc2,idest */ +{ "ldio.s", 0x4c000208, 0xb00005f7, "2,d", XP_ONLY }, /* ldio.s isrc2,idest */ +{ "ldio.b", 0x4c000008, 0xb00007f7, "2,d", XP_ONLY }, /* ldio.b isrc2,idest */ +{ "stio.l", 0x4c000409, 0xb00003f6, "1,2", XP_ONLY }, /* stio.l isrc1ni,isrc2 */ +{ "stio.s", 0x4c000209, 0xb00005f6, "1,2", XP_ONLY }, /* stio.s isrc1ni,isrc2 */ +{ "stio.b", 0x4c000009, 0xb00007f6, "1,2", XP_ONLY }, /* stio.b isrc1ni,isrc2 */ +{ "ldint.l", 0x4c00040a, 0xb00003f5, "2,d", XP_ONLY }, /* ldint.l isrc2,idest */ +{ "ldint.s", 0x4c00020a, 0xb00005f5, "2,d", XP_ONLY }, /* ldint.s isrc2,idest */ +{ "ldint.b", 0x4c00000a, 0xb00007f5, "2,d", XP_ONLY }, /* ldint.b isrc2,idest */ +{ "scyc.b", 0x4c00000b, 0xb00007f4, "2", XP_ONLY }, /* scyc.b isrc2 */ + +/* CTRL-Format Instructions */ +{ "br", 0x68000000, 0x94000000, "l", E_DELAY }, /* br lbroff */ +{ "call", 0x6c000000, 0x90000000, "l", E_DELAY }, /* call lbroff */ +{ "bc", 0x70000000, 0x8c000000, "l", 0 }, /* bc lbroff */ +{ "bc.t", 0x74000000, 0x88000000, "l", E_DELAY }, /* bc.t lbroff */ +{ "bnc", 0x78000000, 0x84000000, "l", 0 }, /* bnc lbroff */ +{ "bnc.t", 0x7c000000, 0x80000000, "l", E_DELAY }, /* bnc.t lbroff */ + +/* Floating Point Escape Instruction Format - pfam.p fsrc1,fsrc2,fdest. */ +{ "r2p1.ss", 0x48000400, 0xb40001ff, "e,f,g", 0 }, +{ "r2p1.sd", 0x48000480, 0xb400017f, "e,f,g", 0 }, +{ "r2p1.dd", 0x48000580, 0xb400007f, "e,f,g", 0 }, +{ "r2pt.ss", 0x48000401, 0xb40001fe, "e,f,g", 0 }, +{ "r2pt.sd", 0x48000481, 0xb400017e, "e,f,g", 0 }, +{ "r2pt.dd", 0x48000581, 0xb400007e, "e,f,g", 0 }, +{ "r2ap1.ss", 0x48000402, 0xb40001fd, "e,f,g", 0 }, +{ "r2ap1.sd", 0x48000482, 0xb400017d, "e,f,g", 0 }, +{ "r2ap1.dd", 0x48000582, 0xb400007d, "e,f,g", 0 }, +{ "r2apt.ss", 0x48000403, 0xb40001fc, "e,f,g", 0 }, +{ "r2apt.sd", 0x48000483, 0xb400017c, "e,f,g", 0 }, +{ "r2apt.dd", 0x48000583, 0xb400007c, "e,f,g", 0 }, +{ "i2p1.ss", 0x48000404, 0xb40001fb, "e,f,g", 0 }, +{ "i2p1.sd", 0x48000484, 0xb400017b, "e,f,g", 0 }, +{ "i2p1.dd", 0x48000584, 0xb400007b, "e,f,g", 0 }, +{ "i2pt.ss", 0x48000405, 0xb40001fa, "e,f,g", 0 }, +{ "i2pt.sd", 0x48000485, 0xb400017a, "e,f,g", 0 }, +{ "i2pt.dd", 0x48000585, 0xb400007a, "e,f,g", 0 }, +{ "i2ap1.ss", 0x48000406, 0xb40001f9, "e,f,g", 0 }, +{ "i2ap1.sd", 0x48000486, 0xb4000179, "e,f,g", 0 }, +{ "i2ap1.dd", 0x48000586, 0xb4000079, "e,f,g", 0 }, +{ "i2apt.ss", 0x48000407, 0xb40001f8, "e,f,g", 0 }, +{ "i2apt.sd", 0x48000487, 0xb4000178, "e,f,g", 0 }, +{ "i2apt.dd", 0x48000587, 0xb4000078, "e,f,g", 0 }, +{ "rat1p2.ss", 0x48000408, 0xb40001f7, "e,f,g", 0 }, +{ "rat1p2.sd", 0x48000488, 0xb4000177, "e,f,g", 0 }, +{ "rat1p2.dd", 0x48000588, 0xb4000077, "e,f,g", 0 }, +{ "m12apm.ss", 0x48000409, 0xb40001f6, "e,f,g", 0 }, +{ "m12apm.sd", 0x48000489, 0xb4000176, "e,f,g", 0 }, +{ "m12apm.dd", 0x48000589, 0xb4000076, "e,f,g", 0 }, +{ "ra1p2.ss", 0x4800040a, 0xb40001f5, "e,f,g", 0 }, +{ "ra1p2.sd", 0x4800048a, 0xb4000175, "e,f,g", 0 }, +{ "ra1p2.dd", 0x4800058a, 0xb4000075, "e,f,g", 0 }, +{ "m12ttpa.ss", 0x4800040b, 0xb40001f4, "e,f,g", 0 }, +{ "m12ttpa.sd", 0x4800048b, 0xb4000174, "e,f,g", 0 }, +{ "m12ttpa.dd", 0x4800058b, 0xb4000074, "e,f,g", 0 }, +{ "iat1p2.ss", 0x4800040c, 0xb40001f3, "e,f,g", 0 }, +{ "iat1p2.sd", 0x4800048c, 0xb4000173, "e,f,g", 0 }, +{ "iat1p2.dd", 0x4800058c, 0xb4000073, "e,f,g", 0 }, +{ "m12tpm.ss", 0x4800040d, 0xb40001f2, "e,f,g", 0 }, +{ "m12tpm.sd", 0x4800048d, 0xb4000172, "e,f,g", 0 }, +{ "m12tpm.dd", 0x4800058d, 0xb4000072, "e,f,g", 0 }, +{ "ia1p2.ss", 0x4800040e, 0xb40001f1, "e,f,g", 0 }, +{ "ia1p2.sd", 0x4800048e, 0xb4000171, "e,f,g", 0 }, +{ "ia1p2.dd", 0x4800058e, 0xb4000071, "e,f,g", 0 }, +{ "m12tpa.ss", 0x4800040f, 0xb40001f0, "e,f,g", 0 }, +{ "m12tpa.sd", 0x4800048f, 0xb4000170, "e,f,g", 0 }, +{ "m12tpa.dd", 0x4800058f, 0xb4000070, "e,f,g", 0 }, + +/* Floating Point Escape Instruction Format - pfsm.p fsrc1,fsrc2,fdest. */ +{ "r2s1.ss", 0x48000410, 0xb40001ef, "e,f,g", 0 }, +{ "r2s1.sd", 0x48000490, 0xb400016f, "e,f,g", 0 }, +{ "r2s1.dd", 0x48000590, 0xb400006f, "e,f,g", 0 }, +{ "r2st.ss", 0x48000411, 0xb40001ee, "e,f,g", 0 }, +{ "r2st.sd", 0x48000491, 0xb400016e, "e,f,g", 0 }, +{ "r2st.dd", 0x48000591, 0xb400006e, "e,f,g", 0 }, +{ "r2as1.ss", 0x48000412, 0xb40001ed, "e,f,g", 0 }, +{ "r2as1.sd", 0x48000492, 0xb400016d, "e,f,g", 0 }, +{ "r2as1.dd", 0x48000592, 0xb400006d, "e,f,g", 0 }, +{ "r2ast.ss", 0x48000413, 0xb40001ec, "e,f,g", 0 }, +{ "r2ast.sd", 0x48000493, 0xb400016c, "e,f,g", 0 }, +{ "r2ast.dd", 0x48000593, 0xb400006c, "e,f,g", 0 }, +{ "i2s1.ss", 0x48000414, 0xb40001eb, "e,f,g", 0 }, +{ "i2s1.sd", 0x48000494, 0xb400016b, "e,f,g", 0 }, +{ "i2s1.dd", 0x48000594, 0xb400006b, "e,f,g", 0 }, +{ "i2st.ss", 0x48000415, 0xb40001ea, "e,f,g", 0 }, +{ "i2st.sd", 0x48000495, 0xb400016a, "e,f,g", 0 }, +{ "i2st.dd", 0x48000595, 0xb400006a, "e,f,g", 0 }, +{ "i2as1.ss", 0x48000416, 0xb40001e9, "e,f,g", 0 }, +{ "i2as1.sd", 0x48000496, 0xb4000169, "e,f,g", 0 }, +{ "i2as1.dd", 0x48000596, 0xb4000069, "e,f,g", 0 }, +{ "i2ast.ss", 0x48000417, 0xb40001e8, "e,f,g", 0 }, +{ "i2ast.sd", 0x48000497, 0xb4000168, "e,f,g", 0 }, +{ "i2ast.dd", 0x48000597, 0xb4000068, "e,f,g", 0 }, +{ "rat1s2.ss", 0x48000418, 0xb40001e7, "e,f,g", 0 }, +{ "rat1s2.sd", 0x48000498, 0xb4000167, "e,f,g", 0 }, +{ "rat1s2.dd", 0x48000598, 0xb4000067, "e,f,g", 0 }, +{ "m12asm.ss", 0x48000419, 0xb40001e6, "e,f,g", 0 }, +{ "m12asm.sd", 0x48000499, 0xb4000166, "e,f,g", 0 }, +{ "m12asm.dd", 0x48000599, 0xb4000066, "e,f,g", 0 }, +{ "ra1s2.ss", 0x4800041a, 0xb40001e5, "e,f,g", 0 }, +{ "ra1s2.sd", 0x4800049a, 0xb4000165, "e,f,g", 0 }, +{ "ra1s2.dd", 0x4800059a, 0xb4000065, "e,f,g", 0 }, +{ "m12ttsa.ss", 0x4800041b, 0xb40001e4, "e,f,g", 0 }, +{ "m12ttsa.sd", 0x4800049b, 0xb4000164, "e,f,g", 0 }, +{ "m12ttsa.dd", 0x4800059b, 0xb4000064, "e,f,g", 0 }, +{ "iat1s2.ss", 0x4800041c, 0xb40001e3, "e,f,g", 0 }, +{ "iat1s2.sd", 0x4800049c, 0xb4000163, "e,f,g", 0 }, +{ "iat1s2.dd", 0x4800059c, 0xb4000063, "e,f,g", 0 }, +{ "m12tsm.ss", 0x4800041d, 0xb40001e2, "e,f,g", 0 }, +{ "m12tsm.sd", 0x4800049d, 0xb4000162, "e,f,g", 0 }, +{ "m12tsm.dd", 0x4800059d, 0xb4000062, "e,f,g", 0 }, +{ "ia1s2.ss", 0x4800041e, 0xb40001e1, "e,f,g", 0 }, +{ "ia1s2.sd", 0x4800049e, 0xb4000161, "e,f,g", 0 }, +{ "ia1s2.dd", 0x4800059e, 0xb4000061, "e,f,g", 0 }, +{ "m12tsa.ss", 0x4800041f, 0xb40001e0, "e,f,g", 0 }, +{ "m12tsa.sd", 0x4800049f, 0xb4000160, "e,f,g", 0 }, +{ "m12tsa.dd", 0x4800059f, 0xb4000060, "e,f,g", 0 }, + +/* Floating Point Escape Instruction Format - pfmam.p fsrc1,fsrc2,fdest. */ +{ "mr2p1.ss", 0x48000000, 0xb40005ff, "e,f,g", 0 }, +{ "mr2p1.sd", 0x48000080, 0xb400057f, "e,f,g", 0 }, +{ "mr2p1.dd", 0x48000180, 0xb400047f, "e,f,g", 0 }, +{ "mr2pt.ss", 0x48000001, 0xb40005fe, "e,f,g", 0 }, +{ "mr2pt.sd", 0x48000081, 0xb400057e, "e,f,g", 0 }, +{ "mr2pt.dd", 0x48000181, 0xb400047e, "e,f,g", 0 }, +{ "mr2mp1.ss", 0x48000002, 0xb40005fd, "e,f,g", 0 }, +{ "mr2mp1.sd", 0x48000082, 0xb400057d, "e,f,g", 0 }, +{ "mr2mp1.dd", 0x48000182, 0xb400047d, "e,f,g", 0 }, +{ "mr2mpt.ss", 0x48000003, 0xb40005fc, "e,f,g", 0 }, +{ "mr2mpt.sd", 0x48000083, 0xb400057c, "e,f,g", 0 }, +{ "mr2mpt.dd", 0x48000183, 0xb400047c, "e,f,g", 0 }, +{ "mi2p1.ss", 0x48000004, 0xb40005fb, "e,f,g", 0 }, +{ "mi2p1.sd", 0x48000084, 0xb400057b, "e,f,g", 0 }, +{ "mi2p1.dd", 0x48000184, 0xb400047b, "e,f,g", 0 }, +{ "mi2pt.ss", 0x48000005, 0xb40005fa, "e,f,g", 0 }, +{ "mi2pt.sd", 0x48000085, 0xb400057a, "e,f,g", 0 }, +{ "mi2pt.dd", 0x48000185, 0xb400047a, "e,f,g", 0 }, +{ "mi2mp1.ss", 0x48000006, 0xb40005f9, "e,f,g", 0 }, +{ "mi2mp1.sd", 0x48000086, 0xb4000579, "e,f,g", 0 }, +{ "mi2mp1.dd", 0x48000186, 0xb4000479, "e,f,g", 0 }, +{ "mi2mpt.ss", 0x48000007, 0xb40005f8, "e,f,g", 0 }, +{ "mi2mpt.sd", 0x48000087, 0xb4000578, "e,f,g", 0 }, +{ "mi2mpt.dd", 0x48000187, 0xb4000478, "e,f,g", 0 }, +{ "mrmt1p2.ss", 0x48000008, 0xb40005f7, "e,f,g", 0 }, +{ "mrmt1p2.sd", 0x48000088, 0xb4000577, "e,f,g", 0 }, +{ "mrmt1p2.dd", 0x48000188, 0xb4000477, "e,f,g", 0 }, +{ "mm12mpm.ss", 0x48000009, 0xb40005f6, "e,f,g", 0 }, +{ "mm12mpm.sd", 0x48000089, 0xb4000576, "e,f,g", 0 }, +{ "mm12mpm.dd", 0x48000189, 0xb4000476, "e,f,g", 0 }, +{ "mrm1p2.ss", 0x4800000a, 0xb40005f5, "e,f,g", 0 }, +{ "mrm1p2.sd", 0x4800008a, 0xb4000575, "e,f,g", 0 }, +{ "mrm1p2.dd", 0x4800018a, 0xb4000475, "e,f,g", 0 }, +{ "mm12ttpm.ss",0x4800000b, 0xb40005f4, "e,f,g", 0 }, +{ "mm12ttpm.sd",0x4800008b, 0xb4000574, "e,f,g", 0 }, +{ "mm12ttpm.dd",0x4800018b, 0xb4000474, "e,f,g", 0 }, +{ "mimt1p2.ss", 0x4800000c, 0xb40005f3, "e,f,g", 0 }, +{ "mimt1p2.sd", 0x4800008c, 0xb4000573, "e,f,g", 0 }, +{ "mimt1p2.dd", 0x4800018c, 0xb4000473, "e,f,g", 0 }, +{ "mm12tpm.ss", 0x4800000d, 0xb40005f2, "e,f,g", 0 }, +{ "mm12tpm.sd", 0x4800008d, 0xb4000572, "e,f,g", 0 }, +{ "mm12tpm.dd", 0x4800018d, 0xb4000472, "e,f,g", 0 }, +{ "mim1p2.ss", 0x4800000e, 0xb40005f1, "e,f,g", 0 }, +{ "mim1p2.sd", 0x4800008e, 0xb4000571, "e,f,g", 0 }, +{ "mim1p2.dd", 0x4800018e, 0xb4000471, "e,f,g", 0 }, + +/* Floating Point Escape Instruction Format - pfmsm.p fsrc1,fsrc2,fdest. */ +{ "mr2s1.ss", 0x48000010, 0xb40005ef, "e,f,g", 0 }, +{ "mr2s1.sd", 0x48000090, 0xb400056f, "e,f,g", 0 }, +{ "mr2s1.dd", 0x48000190, 0xb400046f, "e,f,g", 0 }, +{ "mr2st.ss", 0x48000011, 0xb40005ee, "e,f,g", 0 }, +{ "mr2st.sd", 0x48000091, 0xb400056e, "e,f,g", 0 }, +{ "mr2st.dd", 0x48000191, 0xb400046e, "e,f,g", 0 }, +{ "mr2ms1.ss", 0x48000012, 0xb40005ed, "e,f,g", 0 }, +{ "mr2ms1.sd", 0x48000092, 0xb400056d, "e,f,g", 0 }, +{ "mr2ms1.dd", 0x48000192, 0xb400046d, "e,f,g", 0 }, +{ "mr2mst.ss", 0x48000013, 0xb40005ec, "e,f,g", 0 }, +{ "mr2mst.sd", 0x48000093, 0xb400056c, "e,f,g", 0 }, +{ "mr2mst.dd", 0x48000193, 0xb400046c, "e,f,g", 0 }, +{ "mi2s1.ss", 0x48000014, 0xb40005eb, "e,f,g", 0 }, +{ "mi2s1.sd", 0x48000094, 0xb400056b, "e,f,g", 0 }, +{ "mi2s1.dd", 0x48000194, 0xb400046b, "e,f,g", 0 }, +{ "mi2st.ss", 0x48000015, 0xb40005ea, "e,f,g", 0 }, +{ "mi2st.sd", 0x48000095, 0xb400056a, "e,f,g", 0 }, +{ "mi2st.dd", 0x48000195, 0xb400046a, "e,f,g", 0 }, +{ "mi2ms1.ss", 0x48000016, 0xb40005e9, "e,f,g", 0 }, +{ "mi2ms1.sd", 0x48000096, 0xb4000569, "e,f,g", 0 }, +{ "mi2ms1.dd", 0x48000196, 0xb4000469, "e,f,g", 0 }, +{ "mi2mst.ss", 0x48000017, 0xb40005e8, "e,f,g", 0 }, +{ "mi2mst.sd", 0x48000097, 0xb4000568, "e,f,g", 0 }, +{ "mi2mst.dd", 0x48000197, 0xb4000468, "e,f,g", 0 }, +{ "mrmt1s2.ss", 0x48000018, 0xb40005e7, "e,f,g", 0 }, +{ "mrmt1s2.sd", 0x48000098, 0xb4000567, "e,f,g", 0 }, +{ "mrmt1s2.dd", 0x48000198, 0xb4000467, "e,f,g", 0 }, +{ "mm12msm.ss", 0x48000019, 0xb40005e6, "e,f,g", 0 }, +{ "mm12msm.sd", 0x48000099, 0xb4000566, "e,f,g", 0 }, +{ "mm12msm.dd", 0x48000199, 0xb4000466, "e,f,g", 0 }, +{ "mrm1s2.ss", 0x4800001a, 0xb40005e5, "e,f,g", 0 }, +{ "mrm1s2.sd", 0x4800009a, 0xb4000565, "e,f,g", 0 }, +{ "mrm1s2.dd", 0x4800019a, 0xb4000465, "e,f,g", 0 }, +{ "mm12ttsm.ss",0x4800001b, 0xb40005e4, "e,f,g", 0 }, +{ "mm12ttsm.sd",0x4800009b, 0xb4000564, "e,f,g", 0 }, +{ "mm12ttsm.dd",0x4800019b, 0xb4000464, "e,f,g", 0 }, +{ "mimt1s2.ss", 0x4800001c, 0xb40005e3, "e,f,g", 0 }, +{ "mimt1s2.sd", 0x4800009c, 0xb4000563, "e,f,g", 0 }, +{ "mimt1s2.dd", 0x4800019c, 0xb4000463, "e,f,g", 0 }, +{ "mm12tsm.ss", 0x4800001d, 0xb40005e2, "e,f,g", 0 }, +{ "mm12tsm.sd", 0x4800009d, 0xb4000562, "e,f,g", 0 }, +{ "mm12tsm.dd", 0x4800019d, 0xb4000462, "e,f,g", 0 }, +{ "mim1s2.ss", 0x4800001e, 0xb40005e1, "e,f,g", 0 }, +{ "mim1s2.sd", 0x4800009e, 0xb4000561, "e,f,g", 0 }, +{ "mim1s2.dd", 0x4800019e, 0xb4000461, "e,f,g", 0 }, + +{ "fmul.ss", 0x48000020, 0xb40005df, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ +{ "fmul.sd", 0x480000a0, 0xb400055f, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ +{ "fmul.dd", 0x480001a0, 0xb400045f, "e,f,g", 0 }, /* fmul.p fsrc1,fsrc2,fdest */ +{ "pfmul.ss", 0x48000420, 0xb40001df, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ +{ "pfmul.sd", 0x480004a0, 0xb400015f, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ +{ "pfmul.dd", 0x480005a0, 0xb400005f, "e,f,g", 0 }, /* pfmul.p fsrc1,fsrc2,fdest */ +{ "pfmul3.dd", 0x480005a4, 0xb400005b, "e,f,g", 0 }, /* pfmul3.p fsrc1,fsrc2,fdest */ +{ "fmlow.dd", 0x480001a1, 0xb400045e, "e,f,g", 0 }, /* fmlow.dd fsrc1,fsrc2,fdest */ +{ "frcp.ss", 0x48000022, 0xb40005dd, "f,g", 0 }, /* frcp.p fsrc2,fdest */ +{ "frcp.sd", 0x480000a2, 0xb400055d, "f,g", 0 }, /* frcp.p fsrc2,fdest */ +{ "frcp.dd", 0x480001a2, 0xb400045d, "f,g", 0 }, /* frcp.p fsrc2,fdest */ +{ "frsqr.ss", 0x48000023, 0xb40005dc, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ +{ "frsqr.sd", 0x480000a3, 0xb400055c, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ +{ "frsqr.dd", 0x480001a3, 0xb400045c, "f,g", 0 }, /* frsqr.p fsrc2,fdest */ +{ "fadd.ss", 0x48000030, 0xb40005cf, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ +{ "fadd.sd", 0x480000b0, 0xb400054f, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ +{ "fadd.dd", 0x480001b0, 0xb400044f, "e,f,g", 0 }, /* fadd.p fsrc1,fsrc2,fdest */ +{ "pfadd.ss", 0x48000430, 0xb40001cf, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ +{ "pfadd.sd", 0x480004b0, 0xb400014f, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ +{ "pfadd.dd", 0x480005b0, 0xb400004f, "e,f,g", 0 }, /* pfadd.p fsrc1,fsrc2,fdest */ +{ "fsub.ss", 0x48000031, 0xb40005ce, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ +{ "fsub.sd", 0x480000b1, 0xb400054e, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ +{ "fsub.dd", 0x480001b1, 0xb400044e, "e,f,g", 0 }, /* fsub.p fsrc1,fsrc2,fdest */ +{ "pfsub.ss", 0x48000431, 0xb40001ce, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ +{ "pfsub.sd", 0x480004b1, 0xb400014e, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ +{ "pfsub.dd", 0x480005b1, 0xb400004e, "e,f,g", 0 }, /* pfsub.p fsrc1,fsrc2,fdest */ +{ "fix.sd", 0x480000b2, 0xb400054d, "e,g", 0 }, /* fix.p fsrc1,fdest */ +{ "fix.dd", 0x480001b2, 0xb400044d, "e,g", 0 }, /* fix.p fsrc1,fdest */ +{ "pfix.sd", 0x480004b2, 0xb400014d, "e,g", 0 }, /* pfix.p fsrc1,fdest */ +{ "pfix.dd", 0x480005b2, 0xb400004d, "e,g", 0 }, /* pfix.p fsrc1,fdest */ +{ "famov.ss", 0x48000033, 0xb40005cc, "e,g", 0 }, /* famov.p fsrc1,fdest */ +{ "famov.ds", 0x48000133, 0xb40004cc, "e,g", 0 }, /* famov.p fsrc1,fdest */ +{ "famov.sd", 0x480000b3, 0xb400054c, "e,g", 0 }, /* famov.p fsrc1,fdest */ +{ "famov.dd", 0x480001b3, 0xb400044c, "e,g", 0 }, /* famov.p fsrc1,fdest */ +{ "pfamov.ss", 0x48000433, 0xb40001cc, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ +{ "pfamov.ds", 0x48000533, 0xb40000cc, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ +{ "pfamov.sd", 0x480004b3, 0xb400014c, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ +{ "pfamov.dd", 0x480005b3, 0xb400004c, "e,g", 0 }, /* pfamov.p fsrc1,fdest */ +/* Opcode pfgt has R bit cleared; pfle has R bit set. */ +{ "pfgt.ss", 0x48000434, 0xb40001cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ +{ "pfgt.dd", 0x48000534, 0xb40000cb, "e,f,g", 0 }, /* pfgt.p fsrc1,fsrc2,fdest */ +/* Opcode pfgt has R bit cleared; pfle has R bit set. */ +{ "pfle.ss", 0x480004b4, 0xb400014b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ +{ "pfle.dd", 0x480005b4, 0xb400004b, "e,f,g", 0 }, /* pfle.p fsrc1,fsrc2,fdest */ +{ "pfeq.ss", 0x48000435, 0xb40001ca, "e,f,g", 0 }, /* pfeq.p fsrc1,fsrc2,fdest */ +{ "pfeq.dd", 0x48000535, 0xb40000ca, "e,f,g", 0 }, /* pfeq.p fsrc1,fsrc2,fdest */ +{ "ftrunc.sd", 0x480000ba, 0xb4000545, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ +{ "ftrunc.dd", 0x480001ba, 0xb4000445, "e,g", 0 }, /* ftrunc.p fsrc1,fdest */ +{ "pftrunc.sd", 0x480004ba, 0xb4000145, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ +{ "pftrunc.dd", 0x480005ba, 0xb4000045, "e,g", 0 }, /* pftrunc.p fsrc1,fdest */ +{ "fxfr", 0x48000040, 0xb40005bf, "e,d", 0 }, /* fxfr fsrc1,idest */ +{ "fiadd.ss", 0x48000049, 0xb40005b6, "e,f,g", 0 }, /* fiadd.w fsrc1,fsrc2,fdest */ +{ "fiadd.dd", 0x480001c9, 0xb4000436, "e,f,g", 0 }, /* fiadd.w fsrc1,fsrc2,fdest */ +{ "pfiadd.ss", 0x48000449, 0xb40001b6, "e,f,g", 0 }, /* pfiadd.w fsrc1,fsrc2,fdest */ +{ "pfiadd.dd", 0x480005c9, 0xb4000036, "e,f,g", 0 }, /* pfiadd.w fsrc1,fsrc2,fdest */ +{ "fisub.ss", 0x4800004d, 0xb40005b2, "e,f,g", 0 }, /* fisub.w fsrc1,fsrc2,fdest */ +{ "fisub.dd", 0x480001cd, 0xb4000432, "e,f,g", 0 }, /* fisub.w fsrc1,fsrc2,fdest */ +{ "pfisub.ss", 0x4800044d, 0xb40001b2, "e,f,g", 0 }, /* pfisub.w fsrc1,fsrc2,fdest */ +{ "pfisub.dd", 0x480005cd, 0xb4000032, "e,f,g", 0 }, /* pfisub.w fsrc1,fsrc2,fdest */ +{ "fzchkl", 0x480001d7, 0xb4000428, "e,f,g", 0 }, /* fzchkl fsrc1,fsrc2,fdest */ +{ "pfzchkl", 0x480005d7, 0xb4000028, "e,f,g", 0 }, /* pfzchkl fsrc1,fsrc2,fdest */ +{ "fzchks", 0x480001df, 0xb4000420, "e,f,g", 0 }, /* fzchks fsrc1,fsrc2,fdest */ +{ "pfzchks", 0x480005df, 0xb4000020, "e,f,g", 0 }, /* pfzchks fsrc1,fsrc2,fdest */ +{ "faddp", 0x480001d0, 0xb400042f, "e,f,g", 0 }, /* faddp fsrc1,fsrc2,fdest */ +{ "pfaddp", 0x480005d0, 0xb400002f, "e,f,g", 0 }, /* pfaddp fsrc1,fsrc2,fdest */ +{ "faddz", 0x480001d1, 0xb400042e, "e,f,g", 0 }, /* faddz fsrc1,fsrc2,fdest */ +{ "pfaddz", 0x480005d1, 0xb400002e, "e,f,g", 0 }, /* pfaddz fsrc1,fsrc2,fdest */ +{ "form", 0x480001da, 0xb4000425, "e,g", 0 }, /* form fsrc1,fdest */ +{ "pform", 0x480005da, 0xb4000025, "e,g", 0 }, /* pform fsrc1,fdest */ + +/* Floating point pseudo-instructions. */ +{ "fmov.ss", 0x48000049, 0xb7e005b6, "e,g", 0 }, /* fiadd.ss fsrc1,f0,fdest */ +{ "fmov.dd", 0x480001c9, 0xb7e00436, "e,g", 0 }, /* fiadd.dd fsrc1,f0,fdest */ +{ "fmov.sd", 0x480000b3, 0xb400054c, "e,g", 0 }, /* famov.sd fsrc1,fdest */ +{ "fmov.ds", 0x48000133, 0xb40004cc, "e,g", 0 }, /* famov.ds fsrc1,fdest */ +{ "pfmov.ds", 0x48000533, 0xb40000cc, "e,g", 0 }, /* pfamov.ds fsrc1,fdest */ +{ "pfmov.dd", 0x480005c9, 0xb7e00036, "e,g", 0 }, /* pfiadd.dd fsrc1,f0,fdest */ +{ 0, 0, 0, 0, 0 }, + +}; + +#define NUMOPCODES ((sizeof i860_opcodes)/(sizeof i860_opcodes[0])) + + diff --git a/include/opcode/i960.h b/include/opcode/i960.h new file mode 100644 index 0000000..7b8e1f5 --- /dev/null +++ b/include/opcode/i960.h @@ -0,0 +1,525 @@ +/* Basic 80960 instruction formats. + + Copyright 2001-2013 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* The 'COJ' instructions are actually COBR instructions with the 'b' in + the mnemonic replaced by a 'j'; they are ALWAYS "de-optimized" if + necessary: if the displacement will not fit in 13 bits, the assembler will + replace them with the corresponding compare and branch instructions. + + All of the 'MEMn' instructions are the same format; the 'n' in the name + indicates the default index scale factor (the size of the datum operated on). + + The FBRA formats are not actually an instruction format. They are the + "convenience directives" for branching on floating-point comparisons, + each of which generates 2 instructions (a 'bno' and one other branch). + + The CALLJ format is not actually an instruction format. It indicates that + the instruction generated (a CTRL-format 'call') should have its relocation + specially flagged for link-time replacement with a 'bal' or 'calls' if + appropriate. */ + +#define CTRL 0 +#define COBR 1 +#define COJ 2 +#define REG 3 +#define MEM1 4 +#define MEM2 5 +#define MEM4 6 +#define MEM8 7 +#define MEM12 8 +#define MEM16 9 +#define FBRA 10 +#define CALLJ 11 + +/* Masks for the mode bits in REG format instructions */ +#define M1 0x0800 +#define M2 0x1000 +#define M3 0x2000 + +/* Generate the 12-bit opcode for a REG format instruction by placing the + * high 8 bits in instruction bits 24-31, the low 4 bits in instruction bits + * 7-10. + */ + +#define REG_OPC(opc) ((opc & 0xff0) << 20) | ((opc & 0xf) << 7) + +/* Generate a template for a REG format instruction: place the opcode bits + * in the appropriate fields and OR in mode bits for the operands that will not + * be used. I.e., + * set m1=1, if src1 will not be used + * set m2=1, if src2 will not be used + * set m3=1, if dst will not be used + * + * Setting the "unused" mode bits to 1 speeds up instruction execution(!). + * The information is also useful to us because some 1-operand REG instructions + * use the src1 field, others the dst field; and some 2-operand REG instructions + * use src1/src2, others src1/dst. The set mode bits enable us to distinguish. + */ +#define R_0(opc) ( REG_OPC(opc) | M1 | M2 | M3 ) /* No operands */ +#define R_1(opc) ( REG_OPC(opc) | M2 | M3 ) /* 1 operand: src1 */ +#define R_1D(opc) ( REG_OPC(opc) | M1 | M2 ) /* 1 operand: dst */ +#define R_2(opc) ( REG_OPC(opc) | M3 ) /* 2 ops: src1/src2 */ +#define R_2D(opc) ( REG_OPC(opc) | M2 ) /* 2 ops: src1/dst */ +#define R_3(opc) ( REG_OPC(opc) ) /* 3 operands */ + +/* DESCRIPTOR BYTES FOR REGISTER OPERANDS + * + * Interpret names as follows: + * R: global or local register only + * RS: global, local, or (if target allows) special-function register only + * RL: global or local register, or integer literal + * RSL: global, local, or (if target allows) special-function register; + * or integer literal + * F: global, local, or floating-point register + * FL: global, local, or floating-point register; or literal (including + * floating point) + * + * A number appended to a name indicates that registers must be aligned, + * as follows: + * 2: register number must be multiple of 2 + * 4: register number must be multiple of 4 + */ + +#define SFR 0x10 /* Mask for the "sfr-OK" bit */ +#define LIT 0x08 /* Mask for the "literal-OK" bit */ +#define FP 0x04 /* Mask for "floating-point-OK" bit */ + +/* This macro ors the bits together. Note that 'align' is a mask + * for the low 0, 1, or 2 bits of the register number, as appropriate. + */ +#define OP(align,lit,fp,sfr) ( align | lit | fp | sfr ) + +#define R OP( 0, 0, 0, 0 ) +#define RS OP( 0, 0, 0, SFR ) +#define RL OP( 0, LIT, 0, 0 ) +#define RSL OP( 0, LIT, 0, SFR ) +#define F OP( 0, 0, FP, 0 ) +#define FL OP( 0, LIT, FP, 0 ) +#define R2 OP( 1, 0, 0, 0 ) +#define RL2 OP( 1, LIT, 0, 0 ) +#define F2 OP( 1, 0, FP, 0 ) +#define FL2 OP( 1, LIT, FP, 0 ) +#define R4 OP( 3, 0, 0, 0 ) +#define RL4 OP( 3, LIT, 0, 0 ) +#define F4 OP( 3, 0, FP, 0 ) +#define FL4 OP( 3, LIT, FP, 0 ) + +#define M 0x7f /* Memory operand (MEMA & MEMB format instructions) */ + +/* Macros to extract info from the register operand descriptor byte 'od'. + */ +#define SFR_OK(od) (od & SFR) /* TRUE if sfr operand allowed */ +#define LIT_OK(od) (od & LIT) /* TRUE if literal operand allowed */ +#define FP_OK(od) (od & FP) /* TRUE if floating-point op allowed */ +#define REG_ALIGN(od,n) ((od & 0x3 & n) == 0) + /* TRUE if reg #n is properly aligned */ +#define MEMOP(od) (od == M) /* TRUE if operand is a memory operand*/ + +/* Description of a single i80960 instruction */ +struct i960_opcode { + long opcode; /* 32 bits, constant fields filled in, rest zeroed */ + char *name; /* Assembler mnemonic */ + short iclass; /* Class: see #defines below */ + char format; /* REG, COBR, CTRL, MEMn, COJ, FBRA, or CALLJ */ + char num_ops; /* Number of operands */ + char operand[3];/* Operand descriptors; same order as assembler instr */ +}; + +/* Classes of 960 instructions: + * - each instruction falls into one class. + * - each target architecture supports one or more classes. + * + * EACH CONSTANT MUST CONTAIN 1 AND ONLY 1 SET BIT!: see targ_has_iclass(). + */ +#define I_BASE 0x01 /* 80960 base instruction set */ +#define I_CX 0x02 /* 80960Cx instruction */ +#define I_DEC 0x04 /* Decimal instruction */ +#define I_FP 0x08 /* Floating point instruction */ +#define I_KX 0x10 /* 80960Kx instruction */ +#define I_MIL 0x20 /* Military instruction */ +#define I_CASIM 0x40 /* CA simulator instruction */ +#define I_CX2 0x80 /* Cx/Jx/Hx instructions */ +#define I_JX 0x100 /* Jx/Hx instruction */ +#define I_HX 0x200 /* Hx instructions */ + +/****************************************************************************** + * + * TABLE OF i960 INSTRUCTION DESCRIPTIONS + * + ******************************************************************************/ + +const struct i960_opcode i960_opcodes[] = { + + /* if a CTRL instruction has an operand, it's always a displacement */ + + /* callj default=='call' */ + { 0x09000000, "callj", I_BASE, CALLJ, 1, { 0, 0, 0 } }, + { 0x08000000, "b", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x09000000, "call", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x0a000000, "ret", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x0b000000, "bal", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x10000000, "bno", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* bf same as bno */ + { 0x10000000, "bf", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* bru same as bno */ + { 0x10000000, "bru", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x11000000, "bg", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* brg same as bg */ + { 0x11000000, "brg", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x12000000, "be", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* bre same as be */ + { 0x12000000, "bre", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x13000000, "bge", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* brge same as bge */ + { 0x13000000, "brge", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x14000000, "bl", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* brl same as bl */ + { 0x14000000, "brl", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x15000000, "bne", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* brlg same as bne */ + { 0x15000000, "brlg", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x16000000, "ble", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* brle same as ble */ + { 0x16000000, "brle", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x17000000, "bo", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* bt same as bo */ + { 0x17000000, "bt", I_BASE, CTRL, 1, { 0, 0, 0 } }, + /* bro same as bo */ + { 0x17000000, "bro", I_BASE, CTRL, 1, { 0, 0, 0 } }, + { 0x18000000, "faultno", I_BASE, CTRL, 0, { 0, 0, 0 } }, + /* faultf same as faultno */ + { 0x18000000, "faultf", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x19000000, "faultg", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x1a000000, "faulte", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x1b000000, "faultge", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x1c000000, "faultl", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x1d000000, "faultne", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x1e000000, "faultle", I_BASE, CTRL, 0, { 0, 0, 0 } }, + { 0x1f000000, "faulto", I_BASE, CTRL, 0, { 0, 0, 0 } }, + /* faultt syn for faulto */ + { 0x1f000000, "faultt", I_BASE, CTRL, 0, { 0, 0, 0 } }, + + { 0x01000000, "syscall", I_CASIM,CTRL, 0, { 0, 0, 0 } }, + + /* If a COBR (or COJ) has 3 operands, the last one is always a + * displacement and does not appear explicitly in the table. + */ + + { 0x20000000, "testno", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x21000000, "testg", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x22000000, "teste", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x23000000, "testge", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x24000000, "testl", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x25000000, "testne", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x26000000, "testle", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x27000000, "testo", I_BASE, COBR, 1, { R, 0, 0 } }, + { 0x30000000, "bbc", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x31000000, "cmpobg", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x32000000, "cmpobe", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x33000000, "cmpobge", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x34000000, "cmpobl", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x35000000, "cmpobne", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x36000000, "cmpoble", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x37000000, "bbs", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x38000000, "cmpibno", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x39000000, "cmpibg", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x3a000000, "cmpibe", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x3b000000, "cmpibge", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x3c000000, "cmpibl", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x3d000000, "cmpibne", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x3e000000, "cmpible", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x3f000000, "cmpibo", I_BASE, COBR, 3, { RL, RS, 0 } }, + { 0x31000000, "cmpojg", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x32000000, "cmpoje", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x33000000, "cmpojge", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x34000000, "cmpojl", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x35000000, "cmpojne", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x36000000, "cmpojle", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x38000000, "cmpijno", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x39000000, "cmpijg", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x3a000000, "cmpije", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x3b000000, "cmpijge", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x3c000000, "cmpijl", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x3d000000, "cmpijne", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x3e000000, "cmpijle", I_BASE, COJ, 3, { RL, RS, 0 } }, + { 0x3f000000, "cmpijo", I_BASE, COJ, 3, { RL, RS, 0 } }, + + { 0x80000000, "ldob", I_BASE, MEM1, 2, { M, R, 0 } }, + { 0x82000000, "stob", I_BASE, MEM1, 2, { R, M, 0 } }, + { 0x84000000, "bx", I_BASE, MEM1, 1, { M, 0, 0 } }, + { 0x85000000, "balx", I_BASE, MEM1, 2, { M, R, 0 } }, + { 0x86000000, "callx", I_BASE, MEM1, 1, { M, 0, 0 } }, + { 0x88000000, "ldos", I_BASE, MEM2, 2, { M, R, 0 } }, + { 0x8a000000, "stos", I_BASE, MEM2, 2, { R, M, 0 } }, + { 0x8c000000, "lda", I_BASE, MEM1, 2, { M, R, 0 } }, + { 0x90000000, "ld", I_BASE, MEM4, 2, { M, R, 0 } }, + { 0x92000000, "st", I_BASE, MEM4, 2, { R, M, 0 } }, + { 0x98000000, "ldl", I_BASE, MEM8, 2, { M, R2, 0 } }, + { 0x9a000000, "stl", I_BASE, MEM8, 2, { R2, M, 0 } }, + { 0xa0000000, "ldt", I_BASE, MEM12, 2, { M, R4, 0 } }, + { 0xa2000000, "stt", I_BASE, MEM12, 2, { R4, M, 0 } }, + { 0xb0000000, "ldq", I_BASE, MEM16, 2, { M, R4, 0 } }, + { 0xb2000000, "stq", I_BASE, MEM16, 2, { R4, M, 0 } }, + { 0xc0000000, "ldib", I_BASE, MEM1, 2, { M, R, 0 } }, + { 0xc2000000, "stib", I_BASE, MEM1, 2, { R, M, 0 } }, + { 0xc8000000, "ldis", I_BASE, MEM2, 2, { M, R, 0 } }, + { 0xca000000, "stis", I_BASE, MEM2, 2, { R, M, 0 } }, + + { R_3(0x580), "notbit", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x581), "and", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x582), "andnot", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x583), "setbit", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x584), "notand", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x586), "xor", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x587), "or", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x588), "nor", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x589), "xnor", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_2D(0x58a), "not", I_BASE, REG, 2, { RSL,RS, 0 } }, + { R_3(0x58b), "ornot", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x58c), "clrbit", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x58d), "notor", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x58e), "nand", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x58f), "alterbit", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x590), "addo", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x591), "addi", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x592), "subo", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x593), "subi", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x598), "shro", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x59a), "shrdi", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x59b), "shri", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x59c), "shlo", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x59d), "rotate", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x59e), "shli", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_2(0x5a0), "cmpo", I_BASE, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x5a1), "cmpi", I_BASE, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x5a2), "concmpo", I_BASE, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x5a3), "concmpi", I_BASE, REG, 2, { RSL,RSL, 0 } }, + { R_3(0x5a4), "cmpinco", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x5a5), "cmpinci", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x5a6), "cmpdeco", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x5a7), "cmpdeci", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_2(0x5ac), "scanbyte", I_BASE, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x5ae), "chkbit", I_BASE, REG, 2, { RSL,RSL, 0 } }, + { R_3(0x5b0), "addc", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x5b2), "subc", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_2D(0x5cc), "mov", I_BASE, REG, 2, { RSL,RS, 0 } }, + { R_2D(0x5dc), "movl", I_BASE, REG, 2, { RL2,R2, 0 } }, + { R_2D(0x5ec), "movt", I_BASE, REG, 2, { RL4,R4, 0 } }, + { R_2D(0x5fc), "movq", I_BASE, REG, 2, { RL4,R4, 0 } }, + { R_3(0x610), "atmod", I_BASE, REG, 3, { RS, RSL,R } }, + { R_3(0x612), "atadd", I_BASE, REG, 3, { RS, RSL,RS } }, + { R_2D(0x640), "spanbit", I_BASE, REG, 2, { RSL,RS, 0 } }, + { R_2D(0x641), "scanbit", I_BASE, REG, 2, { RSL,RS, 0 } }, + { R_3(0x645), "modac", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x650), "modify", I_BASE, REG, 3, { RSL,RSL,R } }, + { R_3(0x651), "extract", I_BASE, REG, 3, { RSL,RSL,R } }, + { R_3(0x654), "modtc", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x655), "modpc", I_BASE, REG, 3, { RSL,RSL,R } }, + { R_1(0x660), "calls", I_BASE, REG, 1, { RSL, 0, 0 } }, + { R_0(0x66b), "mark", I_BASE, REG, 0, { 0, 0, 0 } }, + { R_0(0x66c), "fmark", I_BASE, REG, 0, { 0, 0, 0 } }, + { R_0(0x66d), "flushreg", I_BASE, REG, 0, { 0, 0, 0 } }, + { R_0(0x66f), "syncf", I_BASE, REG, 0, { 0, 0, 0 } }, + { R_3(0x670), "emul", I_BASE, REG, 3, { RSL,RSL,R2 } }, + { R_3(0x671), "ediv", I_BASE, REG, 3, { RSL,RL2,RS } }, + { R_2D(0x672), "cvtadr", I_CASIM,REG, 2, { RL, R2, 0 } }, + { R_3(0x701), "mulo", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x708), "remo", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x70b), "divo", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x741), "muli", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x748), "remi", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x749), "modi", I_BASE, REG, 3, { RSL,RSL,RS } }, + { R_3(0x74b), "divi", I_BASE, REG, 3, { RSL,RSL,RS } }, + + /* Floating-point instructions */ + + { R_2D(0x674), "cvtir", I_FP, REG, 2, { RL, F, 0 } }, + { R_2D(0x675), "cvtilr", I_FP, REG, 2, { RL, F, 0 } }, + { R_3(0x676), "scalerl", I_FP, REG, 3, { RL, FL2,F2 } }, + { R_3(0x677), "scaler", I_FP, REG, 3, { RL, FL, F } }, + { R_3(0x680), "atanr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x681), "logepr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x682), "logr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x683), "remr", I_FP, REG, 3, { FL, FL, F } }, + { R_2(0x684), "cmpor", I_FP, REG, 2, { FL, FL, 0 } }, + { R_2(0x685), "cmpr", I_FP, REG, 2, { FL, FL, 0 } }, + { R_2D(0x688), "sqrtr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x689), "expr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x68a), "logbnr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x68b), "roundr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x68c), "sinr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x68d), "cosr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x68e), "tanr", I_FP, REG, 2, { FL, F, 0 } }, + { R_1(0x68f), "classr", I_FP, REG, 1, { FL, 0, 0 } }, + { R_3(0x690), "atanrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_3(0x691), "logeprl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_3(0x692), "logrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_3(0x693), "remrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_2(0x694), "cmporl", I_FP, REG, 2, { FL2,FL2, 0 } }, + { R_2(0x695), "cmprl", I_FP, REG, 2, { FL2,FL2, 0 } }, + { R_2D(0x698), "sqrtrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x699), "exprl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x69a), "logbnrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x69b), "roundrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x69c), "sinrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x69d), "cosrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x69e), "tanrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_1(0x69f), "classrl", I_FP, REG, 1, { FL2, 0, 0 } }, + { R_2D(0x6c0), "cvtri", I_FP, REG, 2, { FL, R, 0 } }, + { R_2D(0x6c1), "cvtril", I_FP, REG, 2, { FL, R2, 0 } }, + { R_2D(0x6c2), "cvtzri", I_FP, REG, 2, { FL, R, 0 } }, + { R_2D(0x6c3), "cvtzril", I_FP, REG, 2, { FL, R2, 0 } }, + { R_2D(0x6c9), "movr", I_FP, REG, 2, { FL, F, 0 } }, + { R_2D(0x6d9), "movrl", I_FP, REG, 2, { FL2,F2, 0 } }, + { R_2D(0x6e1), "movre", I_FP, REG, 2, { FL4,F4, 0 } }, + { R_3(0x6e2), "cpysre", I_FP, REG, 3, { FL4,FL4,F4 } }, + { R_3(0x6e3), "cpyrsre", I_FP, REG, 3, { FL4,FL4,F4 } }, + { R_3(0x78b), "divr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x78c), "mulr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x78d), "subr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x78f), "addr", I_FP, REG, 3, { FL, FL, F } }, + { R_3(0x79b), "divrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_3(0x79c), "mulrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_3(0x79d), "subrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + { R_3(0x79f), "addrl", I_FP, REG, 3, { FL2,FL2,F2 } }, + + /* These are the floating point branch instructions. Each actually + * generates 2 branch instructions: the first a CTRL instruction with + * the indicated opcode, and the second a 'bno'. + */ + + { 0x12000000, "brue", I_FP, FBRA, 1, { 0, 0, 0 } }, + { 0x11000000, "brug", I_FP, FBRA, 1, { 0, 0, 0 } }, + { 0x13000000, "bruge", I_FP, FBRA, 1, { 0, 0, 0 } }, + { 0x14000000, "brul", I_FP, FBRA, 1, { 0, 0, 0 } }, + { 0x16000000, "brule", I_FP, FBRA, 1, { 0, 0, 0 } }, + { 0x15000000, "brulg", I_FP, FBRA, 1, { 0, 0, 0 } }, + + + /* Decimal instructions */ + + { R_3(0x642), "daddc", I_DEC, REG, 3, { RSL,RSL,RS } }, + { R_3(0x643), "dsubc", I_DEC, REG, 3, { RSL,RSL,RS } }, + { R_2D(0x644), "dmovt", I_DEC, REG, 2, { RSL,RS, 0 } }, + + + /* KX extensions */ + + { R_2(0x600), "synmov", I_KX, REG, 2, { R, R, 0 } }, + { R_2(0x601), "synmovl", I_KX, REG, 2, { R, R, 0 } }, + { R_2(0x602), "synmovq", I_KX, REG, 2, { R, R, 0 } }, + { R_2D(0x615), "synld", I_KX, REG, 2, { R, R, 0 } }, + + + /* MC extensions */ + + { R_3(0x603), "cmpstr", I_MIL, REG, 3, { R, R, RL } }, + { R_3(0x604), "movqstr", I_MIL, REG, 3, { R, R, RL } }, + { R_3(0x605), "movstr", I_MIL, REG, 3, { R, R, RL } }, + { R_2D(0x613), "inspacc", I_MIL, REG, 2, { R, R, 0 } }, + { R_2D(0x614), "ldphy", I_MIL, REG, 2, { R, R, 0 } }, + { R_3(0x617), "fill", I_MIL, REG, 3, { R, RL, RL } }, + { R_2D(0x646), "condrec", I_MIL, REG, 2, { R, R, 0 } }, + { R_2D(0x656), "receive", I_MIL, REG, 2, { R, R, 0 } }, + { R_3(0x662), "send", I_MIL, REG, 3, { R, RL, R } }, + { R_1(0x663), "sendserv", I_MIL, REG, 1, { R, 0, 0 } }, + { R_1(0x664), "resumprcs", I_MIL, REG, 1, { R, 0, 0 } }, + { R_1(0x665), "schedprcs", I_MIL, REG, 1, { R, 0, 0 } }, + { R_0(0x666), "saveprcs", I_MIL, REG, 0, { 0, 0, 0 } }, + { R_1(0x668), "condwait", I_MIL, REG, 1, { R, 0, 0 } }, + { R_1(0x669), "wait", I_MIL, REG, 1, { R, 0, 0 } }, + { R_1(0x66a), "signal", I_MIL, REG, 1, { R, 0, 0 } }, + { R_1D(0x673), "ldtime", I_MIL, REG, 1, { R2, 0, 0 } }, + + + /* CX extensions */ + + { R_3(0x5d8), "eshro", I_CX2, REG, 3, { RSL,RSL,RS } }, + { R_3(0x630), "sdma", I_CX, REG, 3, { RSL,RSL,RL } }, + { R_3(0x631), "udma", I_CX, REG, 0, { 0, 0, 0 } }, + { R_3(0x659), "sysctl", I_CX2, REG, 3, { RSL,RSL,RL } }, + + + /* Jx extensions. */ + { R_3(0x780), "addono", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x790), "addog", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7a0), "addoe", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7b0), "addoge", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7c0), "addol", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7d0), "addone", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7e0), "addole", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7f0), "addoo", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x781), "addino", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x791), "addig", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7a1), "addie", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7b1), "addige", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7c1), "addil", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7d1), "addine", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7e1), "addile", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7f1), "addio", I_JX, REG, 3, { RSL,RSL,RS } }, + + { R_2D(0x5ad), "bswap", I_JX, REG, 2, { RSL, RS, 0 } }, + + { R_2(0x594), "cmpob", I_JX, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x595), "cmpib", I_JX, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x596), "cmpos", I_JX, REG, 2, { RSL,RSL, 0 } }, + { R_2(0x597), "cmpis", I_JX, REG, 2, { RSL,RSL, 0 } }, + + { R_3(0x784), "selno", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x794), "selg", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7a4), "sele", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7b4), "selge", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7c4), "sell", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7d4), "selne", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7e4), "selle", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7f4), "selo", I_JX, REG, 3, { RSL,RSL,RS } }, + + { R_3(0x782), "subono", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x792), "subog", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7a2), "suboe", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7b2), "suboge", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7c2), "subol", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7d2), "subone", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7e2), "subole", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7f2), "suboo", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x783), "subino", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x793), "subig", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7a3), "subie", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7b3), "subige", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7c3), "subil", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7d3), "subine", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7e3), "subile", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_3(0x7f3), "subio", I_JX, REG, 3, { RSL,RSL,RS } }, + + { R_3(0x65c), "dcctl", I_JX, REG, 3, { RSL,RSL,RL } }, + { R_3(0x65b), "icctl", I_JX, REG, 3, { RSL,RSL,RS } }, + { R_2D(0x658), "intctl", I_JX, REG, 2, { RSL, RS, 0 } }, + { R_0(0x5b4), "intdis", I_JX, REG, 0, { 0, 0, 0 } }, + { R_0(0x5b5), "inten", I_JX, REG, 0, { 0, 0, 0 } }, + { R_0(0x65d), "halt", I_JX, REG, 1, { RSL, 0, 0 } }, + + /* Hx extensions. */ + { 0xac000000, "dcinva", I_HX, MEM1, 1, { M, 0, 0 } }, + + /* END OF TABLE */ + + { 0, NULL, 0, 0, 0, { 0, 0, 0 } } +}; + + /* end of i960-opcode.h */ diff --git a/include/opcode/ia64.h b/include/opcode/ia64.h new file mode 100644 index 0000000..433c505 --- /dev/null +++ b/include/opcode/ia64.h @@ -0,0 +1,422 @@ +/* ia64.h -- Header file for ia64 opcode table + Copyright (C) 1998, 1999, 2000, 2002, 2005, 2006, 2010 + Free Software Foundation, Inc. + Contributed by David Mosberger-Tang + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef opcode_ia64_h +#define opcode_ia64_h + +#include + +#include "bfd.h" + + +typedef BFD_HOST_U_64_BIT ia64_insn; + +enum ia64_insn_type + { + IA64_TYPE_NIL = 0, /* illegal type */ + IA64_TYPE_A, /* integer alu (I- or M-unit) */ + IA64_TYPE_I, /* non-alu integer (I-unit) */ + IA64_TYPE_M, /* memory (M-unit) */ + IA64_TYPE_B, /* branch (B-unit) */ + IA64_TYPE_F, /* floating-point (F-unit) */ + IA64_TYPE_X, /* long encoding (X-unit) */ + IA64_TYPE_DYN, /* Dynamic opcode */ + IA64_NUM_TYPES + }; + +enum ia64_unit + { + IA64_UNIT_NIL = 0, /* illegal unit */ + IA64_UNIT_I, /* integer unit */ + IA64_UNIT_M, /* memory unit */ + IA64_UNIT_B, /* branching unit */ + IA64_UNIT_F, /* floating-point unit */ + IA64_UNIT_L, /* long "unit" */ + IA64_UNIT_X, /* may be integer or branch unit */ + IA64_NUM_UNITS + }; + +/* Changes to this enumeration must be propagated to the operand table in + bfd/cpu-ia64-opc.c + */ +enum ia64_opnd + { + IA64_OPND_NIL, /* no operand---MUST BE FIRST!*/ + + /* constants */ + IA64_OPND_AR_CSD, /* application register csd (ar.csd) */ + IA64_OPND_AR_CCV, /* application register ccv (ar.ccv) */ + IA64_OPND_AR_PFS, /* application register pfs (ar.pfs) */ + IA64_OPND_C1, /* the constant 1 */ + IA64_OPND_C8, /* the constant 8 */ + IA64_OPND_C16, /* the constant 16 */ + IA64_OPND_GR0, /* gr0 */ + IA64_OPND_IP, /* instruction pointer (ip) */ + IA64_OPND_PR, /* predicate register (pr) */ + IA64_OPND_PR_ROT, /* rotating predicate register (pr.rot) */ + IA64_OPND_PSR, /* processor status register (psr) */ + IA64_OPND_PSR_L, /* processor status register L (psr.l) */ + IA64_OPND_PSR_UM, /* processor status register UM (psr.um) */ + + /* register operands: */ + IA64_OPND_AR3, /* third application register # (bits 20-26) */ + IA64_OPND_B1, /* branch register # (bits 6-8) */ + IA64_OPND_B2, /* branch register # (bits 13-15) */ + IA64_OPND_CR3, /* third control register # (bits 20-26) */ + IA64_OPND_F1, /* first floating-point register # */ + IA64_OPND_F2, /* second floating-point register # */ + IA64_OPND_F3, /* third floating-point register # */ + IA64_OPND_F4, /* fourth floating-point register # */ + IA64_OPND_P1, /* first predicate # */ + IA64_OPND_P2, /* second predicate # */ + IA64_OPND_R1, /* first register # */ + IA64_OPND_R2, /* second register # */ + IA64_OPND_R3, /* third register # */ + IA64_OPND_R3_2, /* third register # (limited to gr0-gr3) */ + IA64_OPND_DAHR3, /* dahr reg # ( bits 23-25) */ + + /* memory operands: */ + IA64_OPND_MR3, /* memory at addr of third register # */ + + /* indirect operands: */ + IA64_OPND_CPUID_R3, /* cpuid[reg] */ + IA64_OPND_DBR_R3, /* dbr[reg] */ + IA64_OPND_DTR_R3, /* dtr[reg] */ + IA64_OPND_ITR_R3, /* itr[reg] */ + IA64_OPND_IBR_R3, /* ibr[reg] */ + IA64_OPND_MSR_R3, /* msr[reg] */ + IA64_OPND_PKR_R3, /* pkr[reg] */ + IA64_OPND_PMC_R3, /* pmc[reg] */ + IA64_OPND_PMD_R3, /* pmd[reg] */ + IA64_OPND_DAHR_R3, /* dahr[reg] */ + IA64_OPND_RR_R3, /* rr[reg] */ + + /* immediate operands: */ + IA64_OPND_CCNT5, /* 5-bit count (31 - bits 20-24) */ + IA64_OPND_CNT2a, /* 2-bit count (1 + bits 27-28) */ + IA64_OPND_CNT2b, /* 2-bit count (bits 27-28): 1, 2, 3 */ + IA64_OPND_CNT2c, /* 2-bit count (bits 30-31): 0, 7, 15, or 16 */ + IA64_OPND_CNT5, /* 5-bit count (bits 14-18) */ + IA64_OPND_CNT6, /* 6-bit count (bits 27-32) */ + IA64_OPND_CPOS6a, /* 6-bit count (63 - bits 20-25) */ + IA64_OPND_CPOS6b, /* 6-bit count (63 - bits 14-19) */ + IA64_OPND_CPOS6c, /* 6-bit count (63 - bits 31-36) */ + IA64_OPND_IMM1, /* signed 1-bit immediate (bit 36) */ + IA64_OPND_IMMU2, /* unsigned 2-bit immediate (bits 13-14) */ + IA64_OPND_IMMU5b, /* unsigned 5-bit immediate (32 + bits 14-18) */ + IA64_OPND_IMMU7a, /* unsigned 7-bit immediate (bits 13-19) */ + IA64_OPND_IMMU7b, /* unsigned 7-bit immediate (bits 20-26) */ + IA64_OPND_SOF, /* 8-bit stack frame size */ + IA64_OPND_SOL, /* 8-bit size of locals */ + IA64_OPND_SOR, /* 6-bit number of rotating registers (scaled by 8) */ + IA64_OPND_IMM8, /* signed 8-bit immediate (bits 13-19 & 36) */ + IA64_OPND_IMM8U4, /* cmp4*u signed 8-bit immediate (bits 13-19 & 36) */ + IA64_OPND_IMM8M1, /* signed 8-bit immediate -1 (bits 13-19 & 36) */ + IA64_OPND_IMM8M1U4, /* cmp4*u signed 8-bit immediate -1 (bits 13-19 & 36)*/ + IA64_OPND_IMM8M1U8, /* cmp*u signed 8-bit immediate -1 (bits 13-19 & 36) */ + IA64_OPND_IMMU9, /* unsigned 9-bit immediate (bits 33-34, 20-26) */ + IA64_OPND_IMM9a, /* signed 9-bit immediate (bits 6-12, 27, 36) */ + IA64_OPND_IMM9b, /* signed 9-bit immediate (bits 13-19, 27, 36) */ + IA64_OPND_IMM14, /* signed 14-bit immediate (bits 13-19, 27-32, 36) */ + IA64_OPND_IMMU16, /* unsigned 16-bit immediate (bits 6-9, 12-22, 36) */ + IA64_OPND_IMM17, /* signed 17-bit immediate (2*bits 6-12, 24-31, 36) */ + IA64_OPND_IMMU19, /* unsigned 19-bit immediate (bits 6-9, 12-25, 36) */ + IA64_OPND_IMMU21, /* unsigned 21-bit immediate (bits 6-25, 36) */ + IA64_OPND_IMM22, /* signed 22-bit immediate (bits 13-19, 22-36) */ + IA64_OPND_IMMU24, /* unsigned 24-bit immediate (bits 6-26, 31-32, 36) */ + IA64_OPND_IMM44, /* signed 44-bit immediate (2^16*bits 6-32, 36) */ + IA64_OPND_IMMU62, /* unsigned 62-bit immediate */ + IA64_OPND_IMMU64, /* unsigned 64-bit immediate (lotsa bits...) */ + IA64_OPND_INC3, /* signed 3-bit (bits 13-15): +/-1, 4, 8, 16 */ + IA64_OPND_LEN4, /* 4-bit count (bits 27-30 + 1) */ + IA64_OPND_LEN6, /* 6-bit count (bits 27-32 + 1) */ + IA64_OPND_MBTYPE4, /* 4-bit mux type (bits 20-23) */ + IA64_OPND_MHTYPE8, /* 8-bit mux type (bits 20-27) */ + IA64_OPND_POS6, /* 6-bit count (bits 14-19) */ + IA64_OPND_TAG13, /* signed 13-bit tag (ip + 16*bits 6-12, 33-34) */ + IA64_OPND_TAG13b, /* signed 13-bit tag (ip + 16*bits 24-32) */ + IA64_OPND_TGT25, /* signed 25-bit (ip + 16*bits 6-25, 36) */ + IA64_OPND_TGT25b, /* signed 25-bit (ip + 16*bits 6-12, 20-32, 36) */ + IA64_OPND_TGT25c, /* signed 25-bit (ip + 16*bits 13-32, 36) */ + IA64_OPND_TGT64, /* 64-bit (ip + 16*bits 13-32, 36, 2-40(L)) */ + IA64_OPND_LDXMOV, /* any symbol, generates R_IA64_LDXMOV. */ + + IA64_OPND_CNT6a, /* 6-bit count (bits 6-11) */ + IA64_OPND_STRD5b, /* 5-bit stride (bits 13-17) */ + + IA64_OPND_COUNT /* # of operand types (MUST BE LAST!) */ + }; + +enum ia64_dependency_mode +{ + IA64_DV_RAW, + IA64_DV_WAW, + IA64_DV_WAR, +}; + +enum ia64_dependency_semantics +{ + IA64_DVS_NONE, + IA64_DVS_IMPLIED, + IA64_DVS_IMPLIEDF, + IA64_DVS_DATA, + IA64_DVS_INSTR, + IA64_DVS_SPECIFIC, + IA64_DVS_STOP, + IA64_DVS_OTHER, +}; + +enum ia64_resource_specifier +{ + IA64_RS_ANY, + IA64_RS_AR_K, + IA64_RS_AR_UNAT, + IA64_RS_AR, /* 8-15, 20, 22-23, 31, 33-35, 37-39, 41-43, 45-47, 67-111 */ + IA64_RS_ARb, /* 48-63, 112-127 */ + IA64_RS_BR, + IA64_RS_CFM, + IA64_RS_CPUID, + IA64_RS_CR_IIB, + IA64_RS_CR_IRR, + IA64_RS_CR_LRR, + IA64_RS_CR, /* 3-7,10-15,18,28-63,75-79,82-127 */ + IA64_RS_DAHR, + IA64_RS_DBR, + IA64_RS_FR, + IA64_RS_FRb, + IA64_RS_GR0, + IA64_RS_GR, + IA64_RS_IBR, + IA64_RS_INSERVICE, /* CR[EOI] or CR[IVR] */ + IA64_RS_MSR, + IA64_RS_PKR, + IA64_RS_PMC, + IA64_RS_PMD, + IA64_RS_PR, /* non-rotating, 1-15 */ + IA64_RS_PRr, /* rotating, 16-62 */ + IA64_RS_PR63, + IA64_RS_RR, + + IA64_RS_ARX, /* ARs not in RS_AR or RS_ARb */ + IA64_RS_CRX, /* CRs not in RS_CR */ + IA64_RS_PSR, /* PSR bits */ + IA64_RS_RSE, /* implementation-specific RSE resources */ + IA64_RS_AR_FPSR, + +}; + +enum ia64_rse_resource +{ + IA64_RSE_N_STACKED_PHYS, + IA64_RSE_BOF, + IA64_RSE_STORE_REG, + IA64_RSE_LOAD_REG, + IA64_RSE_BSPLOAD, + IA64_RSE_RNATBITINDEX, + IA64_RSE_CFLE, + IA64_RSE_NDIRTY, +}; + +/* Information about a given resource dependency */ +struct ia64_dependency +{ + /* Name of the resource */ + const char *name; + /* Does this dependency need further specification? */ + enum ia64_resource_specifier specifier; + /* Mode of dependency */ + enum ia64_dependency_mode mode; + /* Dependency semantics */ + enum ia64_dependency_semantics semantics; + /* Register index, if applicable (distinguishes AR, CR, and PSR deps) */ +#define REG_NONE (-1) + int regindex; + /* Special info on semantics */ + const char *info; +}; + +/* Two arrays of indexes into the ia64_dependency table. + chks are dependencies to check for conflicts when an opcode is + encountered; regs are dependencies to register (mark as used) when an + opcode is used. chks correspond to readers (RAW) or writers (WAW or + WAR) of a resource, while regs correspond to writers (RAW or WAW) and + readers (WAR) of a resource. */ +struct ia64_opcode_dependency +{ + int nchks; + const unsigned short *chks; + int nregs; + const unsigned short *regs; +}; + +/* encode/extract the note/index for a dependency */ +#define RDEP(N,X) (((N)<<11)|(X)) +#define NOTE(X) (((X)>>11)&0x1F) +#define DEP(X) ((X)&0x7FF) + +/* A template descriptor describes the execution units that are active + for each of the three slots. It also specifies the location of + instruction group boundaries that may be present between two slots. */ +struct ia64_templ_desc + { + int group_boundary; /* 0=no boundary, 1=between slot 0 & 1, etc. */ + enum ia64_unit exec_unit[3]; + const char *name; + }; + +/* The opcode table is an array of struct ia64_opcode. */ + +struct ia64_opcode + { + /* The opcode name. */ + const char *name; + + /* The type of the instruction: */ + enum ia64_insn_type type; + + /* Number of output operands: */ + int num_outputs; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + ia64_insn opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + ia64_insn mask; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + enum ia64_opnd operands[5]; + + /* One bit flags for the opcode. These are primarily used to + indicate specific processors and environments support the + instructions. The defined values are listed below. */ + unsigned int flags; + + /* Used by ia64_find_next_opcode (). */ + short ent_index; + + /* Opcode dependencies. */ + const struct ia64_opcode_dependency *dependencies; + }; + +/* Values defined for the flags field of a struct ia64_opcode. */ + +#define IA64_OPCODE_FIRST (1<<0) /* must be first in an insn group */ +#define IA64_OPCODE_X_IN_MLX (1<<1) /* insn is allowed in X slot of MLX */ +#define IA64_OPCODE_LAST (1<<2) /* must be last in an insn group */ +#define IA64_OPCODE_PRIV (1<<3) /* privileged instruct */ +#define IA64_OPCODE_SLOT2 (1<<4) /* insn allowed in slot 2 only */ +#define IA64_OPCODE_NO_PRED (1<<5) /* insn cannot be predicated */ +#define IA64_OPCODE_PSEUDO (1<<6) /* insn is a pseudo-op */ +#define IA64_OPCODE_F2_EQ_F3 (1<<7) /* constraint: F2 == F3 */ +#define IA64_OPCODE_LEN_EQ_64MCNT (1<<8) /* constraint: LEN == 64-CNT */ +#define IA64_OPCODE_MOD_RRBS (1<<9) /* modifies all rrbs in CFM */ +#define IA64_OPCODE_POSTINC (1<<10) /* postincrement MR3 operand */ + +/* A macro to extract the major opcode from an instruction. */ +#define IA64_OP(i) (((i) >> 37) & 0xf) + +enum ia64_operand_class + { + IA64_OPND_CLASS_CST, /* constant */ + IA64_OPND_CLASS_REG, /* register */ + IA64_OPND_CLASS_IND, /* indirect register */ + IA64_OPND_CLASS_ABS, /* absolute value */ + IA64_OPND_CLASS_REL, /* IP-relative value */ + }; + +/* The operands table is an array of struct ia64_operand. */ + +struct ia64_operand +{ + enum ia64_operand_class op_class; + + /* Set VALUE as the operand bits for the operand of type SELF in the + instruction pointed to by CODE. If an error occurs, *CODE is not + modified and the returned string describes the cause of the + error. If no error occurs, NULL is returned. */ + const char *(*insert) (const struct ia64_operand *self, ia64_insn value, + ia64_insn *code); + + /* Extract the operand bits for an operand of type SELF from + instruction CODE store them in *VALUE. If an error occurs, the + cause of the error is described by the string returned. If no + error occurs, NULL is returned. */ + const char *(*extract) (const struct ia64_operand *self, ia64_insn code, + ia64_insn *value); + + /* A string whose meaning depends on the operand class. */ + + const char *str; + + struct bit_field + { + /* The number of bits in the operand. */ + int bits; + + /* How far the operand is left shifted in the instruction. */ + int shift; + } + field[4]; /* no operand has more than this many bit-fields */ + + unsigned int flags; + + const char *desc; /* brief description */ +}; + +/* Values defined for the flags field of a struct ia64_operand. */ + +/* Disassemble as signed decimal (instead of hex): */ +#define IA64_OPND_FLAG_DECIMAL_SIGNED (1<<0) +/* Disassemble as unsigned decimal (instead of hex): */ +#define IA64_OPND_FLAG_DECIMAL_UNSIGNED (1<<1) + +extern const struct ia64_templ_desc ia64_templ_desc[16]; + +/* The tables are sorted by major opcode number and are otherwise in + the order in which the disassembler should consider instructions. */ +extern struct ia64_opcode ia64_opcodes_a[]; +extern struct ia64_opcode ia64_opcodes_i[]; +extern struct ia64_opcode ia64_opcodes_m[]; +extern struct ia64_opcode ia64_opcodes_b[]; +extern struct ia64_opcode ia64_opcodes_f[]; +extern struct ia64_opcode ia64_opcodes_d[]; + + +extern struct ia64_opcode *ia64_find_opcode (const char *); +extern struct ia64_opcode *ia64_find_next_opcode (struct ia64_opcode *); + +extern struct ia64_opcode *ia64_dis_opcode (ia64_insn, + enum ia64_insn_type); + +extern void ia64_free_opcode (struct ia64_opcode *); +extern const struct ia64_dependency *ia64_find_dependency (int); + +/* To avoid circular library dependencies, this array is implemented + in bfd/cpu-ia64-opc.c: */ +extern const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT]; + +#endif /* opcode_ia64_h */ diff --git a/include/opcode/m68hc11.h b/include/opcode/m68hc11.h new file mode 100644 index 0000000..1a00200 --- /dev/null +++ b/include/opcode/m68hc11.h @@ -0,0 +1,456 @@ +/* m68hc11.h -- Header file for Motorola 68HC11 & 68HC12 opcode table + Copyright 1999, 2000, 2002, 2003, 2010, 2012 + Free Software Foundation, Inc. + Written by Stephane Carrez (stcarrez@nerim.fr) + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _OPCODE_M68HC11_H +#define _OPCODE_M68HC11_H + +/* Flags for the definition of the 68HC11 & 68HC12 CCR. */ +#define M6811_S_BIT 0x80 /* Stop disable */ +#define M6811_X_BIT 0x40 /* X-interrupt mask */ +#define M6811_H_BIT 0x20 /* Half carry flag */ +#define M6811_I_BIT 0x10 /* I-interrupt mask */ +#define M6811_N_BIT 0x08 /* Negative */ +#define M6811_Z_BIT 0x04 /* Zero */ +#define M6811_V_BIT 0x02 /* Overflow */ +#define M6811_C_BIT 0x01 /* Carry */ + +/* 68HC11 register address offsets (range 0..0x3F or 0..64). + The absolute address of the I/O register depends on the setting + of the M6811_INIT register. At init time, the I/O registers are + mapped at 0x1000. Address of registers is then: + + 0x1000 + M6811_xxx. */ +#define M6811_PORTA 0x00 /* Port A register */ +#define M6811__RES1 0x01 /* Unused/Reserved */ +#define M6811_PIOC 0x02 /* Parallel I/O Control register */ +#define M6811_PORTC 0x03 /* Port C register */ +#define M6811_PORTB 0x04 /* Port B register */ +#define M6811_PORTCL 0x05 /* Alternate latched port C */ +#define M6811__RES6 0x06 /* Unused/Reserved */ +#define M6811_DDRC 0x07 /* Data direction register for port C */ +#define M6811_PORTD 0x08 /* Port D register */ +#define M6811_DDRD 0x09 /* Data direction register for port D */ +#define M6811_PORTE 0x0A /* Port E input register */ +#define M6811_CFORC 0x0B /* Compare Force Register */ +#define M6811_OC1M 0x0C /* OC1 Action Mask register */ +#define M6811_OC1D 0x0D /* OC1 Action Data register */ +#define M6811_TCTN 0x0E /* Timer Counter Register */ +#define M6811_TCTN_H 0x0E /* " " " High part */ +#define M6811_TCTN_L 0x0F /* " " " Low part */ +#define M6811_TIC1 0x10 /* Input capture 1 register */ +#define M6811_TIC1_H 0x10 /* " " " High part */ +#define M6811_TIC1_L 0x11 /* " " " Low part */ +#define M6811_TIC2 0x12 /* Input capture 2 register */ +#define M6811_TIC2_H 0x12 /* " " " High part */ +#define M6811_TIC2_L 0x13 /* " " " Low part */ +#define M6811_TIC3 0x14 /* Input capture 3 register */ +#define M6811_TIC3_H 0x14 /* " " " High part */ +#define M6811_TIC3_L 0x15 /* " " " Low part */ +#define M6811_TOC1 0x16 /* Output Compare 1 register */ +#define M6811_TOC1_H 0x16 /* " " " High part */ +#define M6811_TOC1_L 0x17 /* " " " Low part */ +#define M6811_TOC2 0x18 /* Output Compare 2 register */ +#define M6811_TOC2_H 0x18 /* " " " High part */ +#define M6811_TOC2_L 0x19 /* " " " Low part */ +#define M6811_TOC3 0x1A /* Output Compare 3 register */ +#define M6811_TOC3_H 0x1A /* " " " High part */ +#define M6811_TOC3_L 0x1B /* " " " Low part */ +#define M6811_TOC4 0x1C /* Output Compare 4 register */ +#define M6811_TOC4_H 0x1C /* " " " High part */ +#define M6811_TOC4_L 0x1D /* " " " Low part */ +#define M6811_TOC5 0x1E /* Output Compare 5 register */ +#define M6811_TOC5_H 0x1E /* " " " High part */ +#define M6811_TOC5_L 0x1F /* " " " Low part */ +#define M6811_TCTL1 0x20 /* Timer Control register 1 */ +#define M6811_TCTL2 0x21 /* Timer Control register 2 */ +#define M6811_TMSK1 0x22 /* Timer Interrupt Mask Register 1 */ +#define M6811_TFLG1 0x23 /* Timer Interrupt Flag Register 1 */ +#define M6811_TMSK2 0x24 /* Timer Interrupt Mask Register 2 */ +#define M6811_TFLG2 0x25 /* Timer Interrupt Flag Register 2 */ +#define M6811_PACTL 0x26 /* Pulse Accumulator Control Register */ +#define M6811_PACNT 0x27 /* Pulse Accumulator Count Register */ +#define M6811_SPCR 0x28 /* SPI Control register */ +#define M6811_SPSR 0x29 /* SPI Status register */ +#define M6811_SPDR 0x2A /* SPI Data register */ +#define M6811_BAUD 0x2B /* SCI Baud register */ +#define M6811_SCCR1 0x2C /* SCI Control register 1 */ +#define M6811_SCCR2 0x2D /* SCI Control register 2 */ +#define M6811_SCSR 0x2E /* SCI Status register */ +#define M6811_SCDR 0x2F /* SCI Data (Read => RDR, Write => TDR) */ +#define M6811_ADCTL 0x30 /* A/D Control register */ +#define M6811_ADR1 0x31 /* A/D, Analog Result register 1 */ +#define M6811_ADR2 0x32 /* A/D, Analog Result register 2 */ +#define M6811_ADR3 0x33 /* A/D, Analog Result register 3 */ +#define M6811_ADR4 0x34 /* A/D, Analog Result register 4 */ +#define M6811__RES35 0x35 +#define M6811__RES36 0x36 +#define M6811__RES37 0x37 +#define M6811__RES38 0x38 +#define M6811_OPTION 0x39 /* System Configuration Options */ +#define M6811_COPRST 0x3A /* Arm/Reset COP Timer Circuitry */ +#define M6811_PPROG 0x3B /* EEPROM Programming Control Register */ +#define M6811_HPRIO 0x3C /* Highest priority I-Bit int and misc */ +#define M6811_INIT 0x3D /* Ram and I/O mapping register */ +#define M6811_TEST1 0x3E /* Factory test control register */ +#define M6811_CONFIG 0x3F /* COP, ROM and EEPROM enables */ + + +/* Flags of the CONFIG register (in EEPROM). */ +#define M6811_NOSEC 0x08 /* Security mode disable */ +#define M6811_NOCOP 0x04 /* COP system disable */ +#define M6811_ROMON 0x02 /* Enable on-chip rom */ +#define M6811_EEON 0x01 /* Enable on-chip eeprom */ + +/* Flags of the PPROG register. */ +#define M6811_BYTE 0x10 /* Byte mode */ +#define M6811_ROW 0x08 /* Row mode */ +#define M6811_ERASE 0x04 /* Erase mode select (1 = erase, 0 = read) */ +#define M6811_EELAT 0x02 /* EEPROM Latch Control */ +#define M6811_EEPGM 0x01 /* EEPROM Programming Voltage Enable */ + +/* Flags of the PIOC register. */ +#define M6811_STAF 0x80 /* Strobe A Interrupt Status Flag */ +#define M6811_STAI 0x40 /* Strobe A Interrupt Enable Mask */ +#define M6811_CWOM 0x20 /* Port C Wire OR mode */ +#define M6811_HNDS 0x10 /* Handshake mode */ +#define M6811_OIN 0x08 /* Output or Input handshaking */ +#define M6811_PLS 0x04 /* Pulse/Interlocked Handshake Operation */ +#define M6811_EGA 0x02 /* Active Edge for Strobe A */ +#define M6811_INVB 0x01 /* Invert Strobe B */ + +/* Flags of the SCCR1 register. */ +#define M6811_R8 0x80 /* Receive Data bit 8 */ +#define M6811_T8 0x40 /* Transmit data bit 8 */ +#define M6811__SCCR1_5 0x20 /* Unused */ +#define M6811_M 0x10 /* SCI Character length */ +#define M6811_WAKE 0x08 /* Wake up method select (0=idle, 1=addr mark) */ + +/* Flags of the SCCR2 register. */ +#define M6811_TIE 0x80 /* Transmit Interrupt enable */ +#define M6811_TCIE 0x40 /* Transmit Complete Interrupt Enable */ +#define M6811_RIE 0x20 /* Receive Interrupt Enable */ +#define M6811_ILIE 0x10 /* Idle Line Interrupt Enable */ +#define M6811_TE 0x08 /* Transmit Enable */ +#define M6811_RE 0x04 /* Receive Enable */ +#define M6811_RWU 0x02 /* Receiver Wake Up */ +#define M6811_SBK 0x01 /* Send Break */ + +/* Flags of the SCSR register. */ +#define M6811_TDRE 0x80 /* Transmit Data Register Empty */ +#define M6811_TC 0x40 /* Transmit Complete */ +#define M6811_RDRF 0x20 /* Receive Data Register Full */ +#define M6811_IDLE 0x10 /* Idle Line Detect */ +#define M6811_OR 0x08 /* Overrun Error */ +#define M6811_NF 0x04 /* Noise Flag */ +#define M6811_FE 0x02 /* Framing Error */ +#define M6811__SCSR_0 0x01 /* Unused */ + +/* Flags of the BAUD register. */ +#define M6811_TCLR 0x80 /* Clear Baud Rate (TEST mode) */ +#define M6811__BAUD_6 0x40 /* Not used */ +#define M6811_SCP1 0x20 /* SCI Baud rate prescaler select */ +#define M6811_SCP0 0x10 +#define M6811_RCKB 0x08 /* Baud Rate Clock Check (TEST mode) */ +#define M6811_SCR2 0x04 /* SCI Baud rate select */ +#define M6811_SCR1 0x02 +#define M6811_SCR0 0x01 + +#define M6811_BAUD_DIV_1 (0) +#define M6811_BAUD_DIV_3 (M6811_SCP0) +#define M6811_BAUD_DIV_4 (M6811_SCP1) +#define M6811_BAUD_DIV_13 (M6811_SCP1|M6811_SCP0) + +/* Flags of the SPCR register. */ +#define M6811_SPIE 0x80 /* Serial Peripheral Interrupt Enable */ +#define M6811_SPE 0x40 /* Serial Peripheral System Enable */ +#define M6811_DWOM 0x20 /* Port D Wire-OR mode option */ +#define M6811_MSTR 0x10 /* Master Mode Select */ +#define M6811_CPOL 0x08 /* Clock Polarity */ +#define M6811_CPHA 0x04 /* Clock Phase */ +#define M6811_SPR1 0x02 /* SPI Clock Rate Select */ +#define M6811_SPR0 0x01 + +/* Flags of the SPSR register. */ +#define M6811_SPIF 0x80 /* SPI Transfer Complete flag */ +#define M6811_WCOL 0x40 /* Write Collision */ +#define M6811_MODF 0x10 /* Mode Fault */ + +/* Flags of the ADCTL register. */ +#define M6811_CCF 0x80 /* Conversions Complete Flag */ +#define M6811_SCAN 0x20 /* Continuous Scan Control */ +#define M6811_MULT 0x10 /* Multiple Channel/Single Channel Control */ +#define M6811_CD 0x08 /* Channel Select D */ +#define M6811_CC 0x04 /* C */ +#define M6811_CB 0x02 /* B */ +#define M6811_CA 0x01 /* A */ + +/* Flags of the CFORC register. */ +#define M6811_FOC1 0x80 /* Force Output Compare 1 */ +#define M6811_FOC2 0x40 /* 2 */ +#define M6811_FOC3 0x20 /* 3 */ +#define M6811_FOC4 0x10 /* 4 */ +#define M6811_FOC5 0x08 /* 5 */ + +/* Flags of the OC1M register. */ +#define M6811_OC1M7 0x80 /* Output Compare 7 */ +#define M6811_OC1M6 0x40 /* 6 */ +#define M6811_OC1M5 0x20 /* 5 */ +#define M6811_OC1M4 0x10 /* 4 */ +#define M6811_OC1M3 0x08 /* 3 */ + +/* Flags of the OC1D register. */ +#define M6811_OC1D7 0x80 +#define M6811_OC1D6 0x40 +#define M6811_OC1D5 0x20 +#define M6811_OC1D4 0x10 +#define M6811_OC1D3 0x08 + +/* Flags of the TCTL1 register. */ +#define M6811_OM2 0x80 /* Output Mode 2 */ +#define M6811_OL2 0x40 /* Output Level 2 */ +#define M6811_OM3 0x20 +#define M6811_OL3 0x10 +#define M6811_OM4 0x08 +#define M6811_OL4 0x04 +#define M6811_OM5 0x02 +#define M6811_OL5 0x01 + +/* Flags of the TCTL2 register. */ +#define M6811_EDG1B 0x20 /* Input Edge Capture Control 1 */ +#define M6811_EDG1A 0x10 +#define M6811_EDG2B 0x08 /* Input 2 */ +#define M6811_EDG2A 0x04 +#define M6811_EDG3B 0x02 /* Input 3 */ +#define M6811_EDG3A 0x01 + +/* Flags of the TMSK1 register. */ +#define M6811_OC1I 0x80 /* Output Compare 1 Interrupt */ +#define M6811_OC2I 0x40 /* 2 */ +#define M6811_OC3I 0x20 /* 3 */ +#define M6811_OC4I 0x10 /* 4 */ +#define M6811_OC5I 0x08 /* 5 */ +#define M6811_IC1I 0x04 /* Input Capture 1 Interrupt */ +#define M6811_IC2I 0x02 /* 2 */ +#define M6811_IC3I 0x01 /* 3 */ + +/* Flags of the TFLG1 register. */ +#define M6811_OC1F 0x80 /* Output Compare 1 Flag */ +#define M6811_OC2F 0x40 /* 2 */ +#define M6811_OC3F 0x20 /* 3 */ +#define M6811_OC4F 0x10 /* 4 */ +#define M6811_OC5F 0x08 /* 5 */ +#define M6811_IC1F 0x04 /* Input Capture 1 Flag */ +#define M6811_IC2F 0x02 /* 2 */ +#define M6811_IC3F 0x01 /* 3 */ + +/* Flags of Timer Interrupt Mask Register 2 (TMSK2). */ +#define M6811_TOI 0x80 /* Timer Overflow Interrupt Enable */ +#define M6811_RTII 0x40 /* RTI Interrupt Enable */ +#define M6811_PAOVI 0x20 /* Pulse Accumulator Overflow Interrupt En. */ +#define M6811_PAII 0x10 /* Pulse Accumulator Interrupt Enable */ +#define M6811_PR1 0x02 /* Timer prescaler */ +#define M6811_PR0 0x01 /* Timer prescaler */ +#define M6811_TPR_1 0x00 /* " " prescale div 1 */ +#define M6811_TPR_4 0x01 /* " " prescale div 4 */ +#define M6811_TPR_8 0x02 /* " " prescale div 8 */ +#define M6811_TPR_16 0x03 /* " " prescale div 16 */ + +/* Flags of Timer Interrupt Flag Register 2 (M6811_TFLG2). */ +#define M6811_TOF 0x80 /* Timer overflow bit */ +#define M6811_RTIF 0x40 /* Read time interrupt flag */ +#define M6811_PAOVF 0x20 /* Pulse accumulator overflow Interrupt flag */ +#define M6811_PAIF 0x10 /* Pulse accumulator Input Edge " " " */ + +/* Flags of Pulse Accumulator Control Register (PACTL). */ +#define M6811_DDRA7 0x80 /* Data direction for port A bit 7 */ +#define M6811_PAEN 0x40 /* Pulse accumulator system enable */ +#define M6811_PAMOD 0x20 /* Pulse accumulator mode */ +#define M6811_PEDGE 0x10 /* Pulse accumulator edge control */ +#define M6811_RTR1 0x02 /* RTI Interrupt rates select */ +#define M6811_RTR0 0x01 /* " " " " */ + +/* Flags of the Options register. */ +#define M6811_ADPU 0x80 /* A/D Powerup */ +#define M6811_CSEL 0x40 /* A/D/EE Charge pump clock source select */ +#define M6811_IRQE 0x20 /* IRQ Edge/Level sensitive */ +#define M6811_DLY 0x10 /* Stop exit turn on delay */ +#define M6811_CME 0x08 /* Clock Monitor enable */ +#define M6811_CR1 0x02 /* COP timer rate select */ +#define M6811_CR0 0x01 /* COP timer rate select */ + +/* Flags of the HPRIO register. */ +#define M6811_RBOOT 0x80 /* Read Bootstrap ROM */ +#define M6811_SMOD 0x40 /* Special Mode */ +#define M6811_MDA 0x20 /* Mode Select A */ +#define M6811_IRV 0x10 /* Internal Read Visibility */ +#define M6811_PSEL3 0x08 /* Priority Select */ +#define M6811_PSEL2 0x04 +#define M6811_PSEL1 0x02 +#define M6811_PSEL0 0x01 + +/* Some insns used by gas to turn relative branches into absolute ones. */ +#define M6811_BRA 0x20 +#define M6811_JMP 0x7e +#define M6811_BSR 0x8d +#define M6811_JSR 0xbd +#define M6812_JMP 0x06 +#define M6812_BSR 0x07 +#define M6812_JSR 0x16 + +/* Instruction code pages. Code page 1 is the default. */ +/*#define M6811_OPCODE_PAGE1 0x00*/ +#define M6811_OPCODE_PAGE2 0x18 +#define M6811_OPCODE_PAGE3 0x1A +#define M6811_OPCODE_PAGE4 0xCD + + +/* 68HC11 operands formats as stored in the m6811_opcode table. These + flags do not correspond to anything in the 68HC11 or 68HC12. + They are only used by GAS to recognize operands. */ +#define M6811_OP_NONE 0 /* No operand */ +#define M6811_OP_DIRECT 0x0001 /* Page 0 addressing: * */ +#define M6811_OP_IMM8 0x0002 /* 8 bits immediat: # */ +#define M6811_OP_IMM16 0x0004 /* 16 bits immediat: # */ +#define M6811_OP_IND16 0x0008 /* Indirect abs: */ +#define M6812_OP_IND16_P2 0x0010 /* Second parameter indirect abs. */ +#define M6812_OP_REG 0x0020 /* Register operand 1 */ +#define M6812_OP_REG_2 0x0040 /* Register operand 2 */ + +#define M6811_OP_IX 0x0080 /* Indirect IX: ,x */ +#define M6811_OP_IY 0x0100 /* Indirect IY: ,y */ +#define M6812_OP_IDX 0x0200 /* Indirect: N,r N,[+-]r[+-] N:5-bits */ +#define M6812_OP_IDX_1 0x0400 /* N,r N:9-bits */ +#define M6812_OP_IDX_2 0x0800 /* N,r N:16-bits */ +#define M6812_OP_D_IDX 0x1000 /* Indirect indexed: [D,r] */ +#define M6812_OP_D_IDX_2 0x2000 /* [N,r] N:16-bits */ +#define M6812_OP_PAGE 0x4000 /* Page number */ +#define M6811_OP_MASK 0x07FFF +#define M6811_OP_BRANCH 0x00008000 /* Branch, jsr, call */ +#define M6811_OP_BITMASK 0x00010000 /* Bitmask: # */ +#define M6811_OP_JUMP_REL 0x00020000 /* Pc-Relative: */ +#define M6812_OP_JUMP_REL16 0x00040000 /* Pc-relative: */ +#define M6811_OP_PAGE1 0x0000 +#define M6811_OP_PAGE2 0x00080000 /* Need a page2 opcode before */ +#define M6811_OP_PAGE3 0x00100000 /* Need a page3 opcode before */ +#define M6811_OP_PAGE4 0x00200000 /* Need a page4 opcode before */ +#define M6811_MAX_OPERANDS 3 /* Max operands: brset */ + +#define M6812_ACC_OFFSET 0x00400000 /* A,r B,r D,r */ +#define M6812_ACC_IND 0x00800000 /* [D,r] */ +#define M6812_PRE_INC 0x01000000 /* n,+r n = -8..8 */ +#define M6812_PRE_DEC 0x02000000 /* n,-r */ +#define M6812_POST_INC 0x04000000 /* n,r+ */ +#define M6812_POST_DEC 0x08000000 /* n,r- */ +#define M6812_INDEXED_IND 0x10000000 /* [n,r] n = 16-bits */ +#define M6812_INDEXED 0x20000000 /* n,r n = 5, 9 or 16-bits */ +#define M6812_OP_IDX_P2 0x40000000 + +/* XGATE defines. + These overlap with HC11/12 as above but not used at the same time. */ +#define M68XG_OP_NONE 0x0001 +#define M68XG_OP_IMM3 0x0002 +#define M68XG_OP_R 0x0004 +#define M68XG_OP_R_R 0x0008 +#define M68XG_OP_R_IMM4 0x0010 +#define M68XG_OP_R_R_R 0x0020 +#define M68XG_OP_REL9 0x0040 +#define M68XG_OP_REL10 0x0080 +#define M68XG_OP_R_R_OFFS5 0x0100 +#define M68XG_OP_RD_RB_RI 0x0200 +#define M68XG_OP_RD_RB_RIp 0x0400 +#define M68XG_OP_RD_RB_mRI 0x0800 +#define M68XG_OP_R_IMM8 0x1000 +#define M68XG_OP_R_IMM16 0x2000 +#define M68XG_OP_REG 0x4000 /* Register operand 1. */ +#define M68XG_OP_REG_2 0x8000 /* Register operand 2. */ +#define M68XG_MAX_OPERANDS 3 /* Max operands of triadic r1, r2, r3. */ + +/* Markers to identify some instructions. */ +#define M6812_OP_EXG_MARKER 0x01000000 /* exg r1,r2 */ +#define M6812_OP_TFR_MARKER 0x02000000 /* tfr r1,r2 */ +#define M6812_OP_SEX_MARKER 0x04000000 /* sex r1,r2 */ + +#define M6812_OP_EQ_MARKER 0x80000000 /* dbeq/ibeq/tbeq */ +#define M6812_OP_DBCC_MARKER 0x04000000 /* dbeq/dbne */ +#define M6812_OP_IBCC_MARKER 0x02000000 /* ibeq/ibne */ +#define M6812_OP_TBCC_MARKER 0x01000000 + +/* XGATE markers. */ +#define M68XG_OP_B_MARKER 0x04000000 /* bXX rel9 */ +#define M68XG_OP_BRA_MARKER 0x02000000 /* bra rel10 */ + +#define M6812_OP_TRAP_ID 0x80000000 /* trap #N */ + +#define M6811_OP_HIGH_ADDR 0x01000000 /* Used internally by gas. */ +#define M6811_OP_LOW_ADDR 0x02000000 + +#define M68HC12_BANK_VIRT 0x010000 +#define M68HC12_BANK_MASK 0x00003fff +#define M68HC12_BANK_BASE 0x00008000 +#define M68HC12_BANK_SHIFT 14 +#define M68HC12_BANK_PAGE_MASK 0x0ff + + +/* CPU identification. */ +#define cpu6811 0x01 +#define cpu6812 0x02 +#define cpu6812s 0x04 +#define cpu9s12x 0x08 /* 9S12X main cpu. */ +#define cpuxgate 0x10 /* The XGATE module itself. */ + +/* The opcode table is an array of struct m68hc11_opcode. */ +struct m68hc11_opcode +{ + const char * name; /* Op-code name. */ + long format; + unsigned char size; + unsigned int opcode; + unsigned char cycles_low; + unsigned char cycles_high; + unsigned char set_flags_mask; + unsigned char clr_flags_mask; + unsigned char chg_flags_mask; + unsigned char arch; + unsigned int xg_mask; /* Mask with zero in register place for xgate. */ +}; + +/* Alias definition for 68HC12. */ +struct m68hc12_opcode_alias +{ + const char* name; + const char* translation; + unsigned char size; + unsigned char code1; + unsigned char code2; +}; + +/* The opcode table. The table contains all the opcodes (all pages). + You can't rely on the order. */ +extern const struct m68hc11_opcode m68hc11_opcodes[]; +extern const int m68hc11_num_opcodes; + +/* Alias table for 68HC12. It translates some 68HC11 insn which are not + implemented in 68HC12 but have equivalent translations. */ +extern const struct m68hc12_opcode_alias m68hc12_alias[]; +extern const int m68hc12_num_alias; + +#endif /* _OPCODE_M68HC11_H */ diff --git a/include/opcode/m68k.h b/include/opcode/m68k.h new file mode 100644 index 0000000..f7bd8b4 --- /dev/null +++ b/include/opcode/m68k.h @@ -0,0 +1,378 @@ +/* Opcode table header for m680[01234]0/m6888[12]/m68851. + Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2001, + 2003, 2004, 2006, 2010 Free Software Foundation, Inc. + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* These are used as bit flags for the arch field in the m68k_opcode + structure. */ +#define _m68k_undef 0 +#define m68000 0x001 +#define m68010 0x002 +#define m68020 0x004 +#define m68030 0x008 +#define m68040 0x010 +#define m68060 0x020 +#define m68881 0x040 +#define m68851 0x080 +#define cpu32 0x100 /* e.g., 68332 */ +#define fido_a 0x200 +#define m68k_mask 0x3ff + +#define mcfmac 0x400 /* ColdFire MAC. */ +#define mcfemac 0x800 /* ColdFire EMAC. */ +#define cfloat 0x1000 /* ColdFire FPU. */ +#define mcfhwdiv 0x2000 /* ColdFire hardware divide. */ + +#define mcfisa_a 0x4000 /* ColdFire ISA_A. */ +#define mcfisa_aa 0x8000 /* ColdFire ISA_A+. */ +#define mcfisa_b 0x10000 /* ColdFire ISA_B. */ +#define mcfisa_c 0x20000 /* ColdFire ISA_C. */ +#define mcfusp 0x40000 /* ColdFire USP instructions. */ +#define mcf_mask 0x7e400 + +/* Handy aliases. */ +#define m68040up (m68040 | m68060) +#define m68030up (m68030 | m68040up) +#define m68020up (m68020 | m68030up) +#define m68010up (m68010 | cpu32 | fido_a | m68020up) +#define m68000up (m68000 | m68010up) + +#define mfloat (m68881 | m68040 | m68060) +#define mmmu (m68851 | m68030 | m68040 | m68060) + +/* The structure used to hold information for an opcode. */ + +struct m68k_opcode +{ + /* The opcode name. */ + const char *name; + /* The pseudo-size of the instruction(in bytes). Used to determine + number of bytes necessary to disassemble the instruction. */ + unsigned int size; + /* The opcode itself. */ + unsigned long opcode; + /* The mask used by the disassembler. */ + unsigned long match; + /* The arguments. */ + const char *args; + /* The architectures which support this opcode. */ + unsigned int arch; +}; + +/* The structure used to hold information for an opcode alias. */ + +struct m68k_opcode_alias +{ + /* The alias name. */ + const char *alias; + /* The instruction for which this is an alias. */ + const char *primary; +}; + +/* We store four bytes of opcode for all opcodes because that is the + most any of them need. The actual length of an instruction is + always at least 2 bytes, and is as much longer as necessary to hold + the operands it has. + + The match field is a mask saying which bits must match particular + opcode in order for an instruction to be an instance of that + opcode. + + The args field is a string containing two characters for each + operand of the instruction. The first specifies the kind of + operand; the second, the place it is stored. + + If the first char of args is '.', it indicates that the opcode is + two words. This is only necessary when the match field does not + have any bits set in the second opcode word. Such a '.' is skipped + for operand processing. */ + +/* Kinds of operands: + Characters used: AaBbCcDdEeFfGgHIiJjKkLlMmnOopQqRrSsTtUuVvWwXxYyZz01234|*~%;@!&$?/<>#^+- + + D data register only. Stored as 3 bits. + A address register only. Stored as 3 bits. + a address register indirect only. Stored as 3 bits. + R either kind of register. Stored as 4 bits. + r either kind of register indirect only. Stored as 4 bits. + At the moment, used only for cas2 instruction. + F floating point coprocessor register only. Stored as 3 bits. + O an offset (or width): immediate data 0-31 or data register. + Stored as 6 bits in special format for BF... insns. + + autoincrement only. Stored as 3 bits (number of the address register). + - autodecrement only. Stored as 3 bits (number of the address register). + Q quick immediate data. Stored as 3 bits. + This matches an immediate operand only when value is in range 1 .. 8. + M moveq immediate data. Stored as 8 bits. + This matches an immediate operand only when value is in range -128..127 + T trap vector immediate data. Stored as 4 bits. + + k K-factor for fmove.p instruction. Stored as a 7-bit constant or + a three bit register offset, depending on the field type. + + # immediate data. Stored in special places (b, w or l) + which say how many bits to store. + ^ immediate data for floating point instructions. Special places + are offset by 2 bytes from '#'... + B pc-relative address, converted to an offset + that is treated as immediate data. + d displacement and register. Stores the register as 3 bits + and stores the displacement in the entire second word. + + C the CCR. No need to store it; this is just for filtering validity. + S the SR. No need to store, just as with CCR. + U the USP. No need to store, just as with CCR. + E the MAC ACC. No need to store, just as with CCR. + e the EMAC ACC[0123]. + G the MAC/EMAC MACSR. No need to store, just as with CCR. + g the EMAC ACCEXT{01,23}. + H the MASK. No need to store, just as with CCR. + i the MAC/EMAC scale factor. + + I Coprocessor ID. Not printed if 1. The Coprocessor ID is always + extracted from the 'd' field of word one, which means that an extended + coprocessor opcode can be skipped using the 'i' place, if needed. + + s System Control register for the floating point coprocessor. + + J Misc register for movec instruction, stored in 'j' format. + Possible values: + 0x000 SFC Source Function Code reg [60, 40, 30, 20, 10] + 0x001 DFC Data Function Code reg [60, 40, 30, 20, 10] + 0x002 CACR Cache Control Register [60, 40, 30, 20, mcf] + 0x003 TC MMU Translation Control [60, 40] + 0x004 ITT0 Instruction Transparent + Translation reg 0 [60, 40] + 0x005 ITT1 Instruction Transparent + Translation reg 1 [60, 40] + 0x006 DTT0 Data Transparent + Translation reg 0 [60, 40] + 0x007 DTT1 Data Transparent + Translation reg 1 [60, 40] + 0x008 BUSCR Bus Control Register [60] + 0x800 USP User Stack Pointer [60, 40, 30, 20, 10] + 0x801 VBR Vector Base reg [60, 40, 30, 20, 10, mcf] + 0x802 CAAR Cache Address Register [ 30, 20] + 0x803 MSP Master Stack Pointer [ 40, 30, 20] + 0x804 ISP Interrupt Stack Pointer [ 40, 30, 20] + 0x805 MMUSR MMU Status reg [ 40] + 0x806 URP User Root Pointer [60, 40] + 0x807 SRP Supervisor Root Pointer [60, 40] + 0x808 PCR Processor Configuration reg [60] + 0xC00 ROMBAR ROM Base Address Register [520X] + 0xC04 RAMBAR0 RAM Base Address Register 0 [520X] + 0xC05 RAMBAR1 RAM Base Address Register 0 [520X] + 0xC0F MBAR0 RAM Base Address Register 0 [520X] + 0xC04 FLASHBAR FLASH Base Address Register [mcf528x] + 0xC05 RAMBAR Static RAM Base Address Register [mcf528x] + + L Register list of the type d0-d7/a0-a7 etc. + (New! Improved! Can also hold fp0-fp7, as well!) + The assembler tries to see if the registers match the insn by + looking at where the insn wants them stored. + + l Register list like L, but with all the bits reversed. + Used for going the other way. . . + + c cache identifier which may be "nc" for no cache, "ic" + for instruction cache, "dc" for data cache, or "bc" + for both caches. Used in cinv and cpush. Always + stored in position "d". + + u Any register, with ``upper'' or ``lower'' specification. Used + in the mac instructions with size word. + + The remainder are all stored as 6 bits using an address mode and a + register number; they differ in which addressing modes they match. + + * all (modes 0-6,7.0-4) + ~ alterable memory (modes 2-6,7.0,7.1) + (not 0,1,7.2-4) + % alterable (modes 0-6,7.0,7.1) + (not 7.2-4) + ; data (modes 0,2-6,7.0-4) + (not 1) + @ data, but not immediate (modes 0,2-6,7.0-3) + (not 1,7.4) + ! control (modes 2,5,6,7.0-3) + (not 0,1,3,4,7.4) + & alterable control (modes 2,5,6,7.0,7.1) + (not 0,1,3,4,7.2-4) + $ alterable data (modes 0,2-6,7.0,7.1) + (not 1,7.2-4) + ? alterable control, or data register (modes 0,2,5,6,7.0,7.1) + (not 1,3,4,7.2-4) + / control, or data register (modes 0,2,5,6,7.0-3) + (not 1,3,4,7.4) + > *save operands (modes 2,4,5,6,7.0,7.1) + (not 0,1,3,7.2-4) + < *restore operands (modes 2,3,5,6,7.0-3) + (not 0,1,4,7.4) + + coldfire move operands: + m (modes 0-4) + n (modes 5,7.2) + o (modes 6,7.0,7.1,7.3,7.4) + p (modes 0-5) + + coldfire bset/bclr/btst/mulsl/mulul operands: + q (modes 0,2-5) + v (modes 0,2-5,7.0,7.1) + b (modes 0,2-5,7.2) + w (modes 2-5,7.2) + y (modes 2,5) + z (modes 2,5,7.2) + x mov3q immediate operand. + j coprocessor ET operand. + K coprocessor command number. + 4 (modes 2,3,4,5) + */ + +/* For the 68851: */ +/* I didn't use much imagination in choosing the + following codes, so many of them aren't very + mnemonic. -rab + + 0 32 bit pmmu register + Possible values: + 000 TC Translation Control Register (68030, 68851) + + 1 16 bit pmmu register + 111 AC Access Control (68851) + + 2 8 bit pmmu register + 100 CAL Current Access Level (68851) + 101 VAL Validate Access Level (68851) + 110 SCC Stack Change Control (68851) + + 3 68030-only pmmu registers (32 bit) + 010 TT0 Transparent Translation reg 0 + (aka Access Control reg 0 -- AC0 -- on 68ec030) + 011 TT1 Transparent Translation reg 1 + (aka Access Control reg 1 -- AC1 -- on 68ec030) + + W wide pmmu registers + Possible values: + 001 DRP Dma Root Pointer (68851) + 010 SRP Supervisor Root Pointer (68030, 68851) + 011 CRP Cpu Root Pointer (68030, 68851) + + f function code register (68030, 68851) + 0 SFC + 1 DFC + + V VAL register only (68851) + + X BADx, BACx (16 bit) + 100 BAD Breakpoint Acknowledge Data (68851) + 101 BAC Breakpoint Acknowledge Control (68851) + + Y PSR (68851) (MMUSR on 68030) (ACUSR on 68ec030) + Z PCSR (68851) + + | memory (modes 2-6, 7.*) + + t address test level (68030 only) + Stored as 3 bits, range 0-7. + Also used for breakpoint instruction now. + +*/ + +/* Places to put an operand, for non-general operands: + Characters used: BbCcDdFfGgHhIijkLlMmNnostWw123456789/ + + s source, low bits of first word. + d dest, shifted 9 in first word + 1 second word, shifted 12 + 2 second word, shifted 6 + 3 second word, shifted 0 + 4 third word, shifted 12 + 5 third word, shifted 6 + 6 third word, shifted 0 + 7 second word, shifted 7 + 8 second word, shifted 10 + 9 second word, shifted 5 + E second word, shifted 9 + D store in both place 1 and place 3; for divul and divsl. + B first word, low byte, for branch displacements + W second word (entire), for branch displacements + L second and third words (entire), for branch displacements + (also overloaded for move16) + b second word, low byte + w second word (entire) [variable word/long branch offset for dbra] + W second word (entire) (must be signed 16 bit value) + l second and third word (entire) + g variable branch offset for bra and similar instructions. + The place to store depends on the magnitude of offset. + t store in both place 7 and place 8; for floating point operations + c branch offset for cpBcc operations. + The place to store is word two if bit six of word one is zero, + and words two and three if bit six of word one is one. + i Increment by two, to skip over coprocessor extended operands. Only + works with the 'I' format. + k Dynamic K-factor field. Bits 6-4 of word 2, used as a register number. + Also used for dynamic fmovem instruction. + C floating point coprocessor constant - 7 bits. Also used for static + K-factors... + j Movec register #, stored in 12 low bits of second word. + m For M[S]ACx; 4 bits split with MSB shifted 6 bits in first word + and remaining 3 bits of register shifted 9 bits in first word. + Indicate upper/lower in 1 bit shifted 7 bits in second word. + Use with `R' or `u' format. + n `m' withouth upper/lower indication. (For M[S]ACx; 4 bits split + with MSB shifted 6 bits in first word and remaining 3 bits of + register shifted 9 bits in first word. No upper/lower + indication is done.) Use with `R' or `u' format. + o For M[S]ACw; 4 bits shifted 12 in second word (like `1'). + Indicate upper/lower in 1 bit shifted 7 bits in second word. + Use with `R' or `u' format. + M For M[S]ACw; 4 bits in low bits of first word. Indicate + upper/lower in 1 bit shifted 6 bits in second word. Use with + `R' or `u' format. + N For M[S]ACw; 4 bits in low bits of second word. Indicate + upper/lower in 1 bit shifted 6 bits in second word. Use with + `R' or `u' format. + h shift indicator (scale factor), 1 bit shifted 10 in second word + + Places to put operand, for general operands: + d destination, shifted 6 bits in first word + b source, at low bit of first word, and immediate uses one byte + w source, at low bit of first word, and immediate uses two bytes + l source, at low bit of first word, and immediate uses four bytes + s source, at low bit of first word. + Used sometimes in contexts where immediate is not allowed anyway. + f single precision float, low bit of 1st word, immediate uses 4 bytes + F double precision float, low bit of 1st word, immediate uses 8 bytes + x extended precision float, low bit of 1st word, immediate uses 12 bytes + p packed float, low bit of 1st word, immediate uses 12 bytes + G EMAC accumulator, load (bit 4 2nd word, !bit8 first word) + H EMAC accumulator, non load (bit 4 2nd word, bit 8 first word) + F EMAC ACCx + f EMAC ACCy + I MAC/EMAC scale factor + / Like 's', but set 2nd word, bit 5 if trailing_ampersand set + ] first word, bit 10 +*/ + +extern const struct m68k_opcode m68k_opcodes[]; +extern const struct m68k_opcode_alias m68k_opcode_aliases[]; + +extern const int m68k_numopcodes, m68k_numaliases; + +/* end of m68k-opcode.h */ diff --git a/include/opcode/m88k.h b/include/opcode/m88k.h new file mode 100644 index 0000000..739c0e9 --- /dev/null +++ b/include/opcode/m88k.h @@ -0,0 +1,455 @@ +/* Table of opcodes for the Motorola M88k family. + Copyright 1989, 1990, 1991, 1993, 2001, 2002, 2010 + Free Software Foundation, Inc. + + This file is part of GDB and GAS. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* + * Disassembler Instruction Table + * + * The first field of the table is the opcode field. If an opcode + * is specified which has any non-opcode bits on, a system error + * will occur when the system attempts the install it into the + * instruction table. The second parameter is a pointer to the + * instruction mnemonic. Each operand is specified by offset, width, + * and type. The offset is the bit number of the least significant + * bit of the operand with bit 0 being the least significant bit of + * the instruction. The width is the number of bits used to specify + * the operand. The type specifies the output format to be used for + * the operand. The valid formats are: register, register indirect, + * hex constant, and bit field specification. The last field is a + * pointer to the next instruction in the linked list. These pointers + * are initialized by init_disasm(). + * + * Revision History + * + * Revision 1.0 11/08/85 Creation date + * 1.1 02/05/86 Updated instruction mnemonic table MD + * 1.2 06/16/86 Updated SIM_FLAGS for floating point + * 1.3 09/20/86 Updated for new encoding + * 05/11/89 R. Trawick adapted from Motorola disassembler + */ + +#include + +/* Define the number of bits in the primary opcode field of the instruction, + the destination field, the source 1 and source 2 fields. */ + +/* Size of opcode field. */ +#define OP 8 + +/* Size of destination. */ +#define DEST 6 + +/* Size of source1. */ +#define SOURCE1 6 + +/* Size of source2. */ +#define SOURCE2 6 + +/* Number of registers. */ +#define REGs 32 + +/* Type definitions. */ + +typedef unsigned int UINT; +#define WORD long +#define FLAG unsigned +#define STATE short + +/* The next four equates define the priorities that the various classes + * of instructions have regarding writing results back into registers and + * signalling exceptions. */ + +/* PMEM is also defined in on Delta 88's. Sigh! */ +#undef PMEM + +/* Integer priority. */ +#define PINT 0 + +/* Floating point priority. */ +#define PFLT 1 + +/* Memory priority. */ +#define PMEM 2 + +/* Not applicable, instruction doesn't write to regs. */ +#define NA 3 + +/* Highest of these priorities. */ +#define HIPRI 3 + +/* The instruction registers are an artificial mechanism to speed up + * simulator execution. In the real processor, an instruction register + * is 32 bits wide. In the simulator, the 32 bit instruction is kept in + * a structure field called rawop, and the instruction is partially decoded, + * and split into various fields and flags which make up the other fields + * of the structure. + * The partial decode is done when the instructions are initially loaded + * into simulator memory. The simulator code memory is not an array of + * 32 bit words, but is an array of instruction register structures. + * Yes this wastes memory, but it executes much quicker. + */ + +struct IR_FIELDS +{ + unsigned op:OP, + dest: DEST, + src1: SOURCE1, + src2: SOURCE2; + int ltncy, + extime, + /* Writeback priority. */ + wb_pri; + /* Immediate size. */ + unsigned imm_flags:2, + /* Register source 1 used. */ + rs1_used:1, + /* Register source 2 used. */ + rs2_used:1, + /* Register source/dest. used. */ + rsd_used:1, + /* Complement. */ + c_flag:1, + /* Upper half word. */ + u_flag:1, + /* Execute next. */ + n_flag:1, + /* Uses writeback slot. */ + wb_flag:1, + /* Dest size. */ + dest_64:1, + /* Source 1 size. */ + s1_64:1, + /* Source 2 size. */ + s2_64:1, + scale_flag:1, + /* Scaled register. */ + brk_flg:1; +}; + +struct mem_segs +{ + /* Pointer (returned by calloc) to segment. */ + struct mem_wrd *seg; + + /* Base load address from file headers. */ + unsigned long baseaddr; + + /* Ending address of segment. */ + unsigned long endaddr; + + /* Segment control flags (none defined). */ + int flags; +}; + +#define MAXSEGS (10) /* max number of segment allowed */ +#define MEMSEGSIZE (sizeof(struct mem_segs))/* size of mem_segs structure */ + +#if 0 +#define BRK_RD (0x01) /* break on memory read */ +#define BRK_WR (0x02) /* break on memory write */ +#define BRK_EXEC (0x04) /* break on execution */ +#define BRK_CNT (0x08) /* break on terminal count */ +#endif + +struct mem_wrd +{ + /* Simulator instruction break down. */ + struct IR_FIELDS opcode; + union { + /* Memory element break down. */ + unsigned long l; + unsigned short s[2]; + unsigned char c[4]; + } mem; +}; + +/* Size of each 32 bit memory model. */ +#define MEMWRDSIZE (sizeof (struct mem_wrd)) + +extern struct mem_segs memory[]; +extern struct PROCESSOR m78000; + +struct PROCESSOR +{ + unsigned WORD + /* Execute instruction pointer. */ + ip, + /* Vector base register. */ + vbr, + /* Processor status register. */ + psr; + + /* Source 1. */ + WORD S1bus, + /* Source 2. */ + S2bus, + /* Destination. */ + Dbus, + /* Data address bus. */ + DAbus, + ALU, + /* Data registers. */ + Regs[REGs], + /* Max clocks before reg is available. */ + time_left[REGs], + /* Writeback priority of reg. */ + wb_pri[REGs], + /* Integer unit control regs. */ + SFU0_regs[REGs], + /* Floating point control regs. */ + SFU1_regs[REGs], + Scoreboard[REGs], + Vbr; + unsigned WORD scoreboard, + Psw, + Tpsw; + /* Waiting for a jump instruction. */ + FLAG jump_pending:1; +}; + +/* Size of immediate field. */ + +#define i26bit 1 +#define i16bit 2 +#define i10bit 3 + +/* Definitions for fields in psr. */ + +#define psr_mode 31 +#define psr_rbo 30 +#define psr_ser 29 +#define psr_carry 28 +#define psr_sf7m 11 +#define psr_sf6m 10 +#define psr_sf5m 9 +#define psr_sf4m 8 +#define psr_sf3m 7 +#define psr_sf2m 6 +#define psr_sf1m 5 +#define psr_mam 4 +#define psr_inm 3 +#define psr_exm 2 +#define psr_trm 1 +#define psr_ovfm 0 + +/* The 1 clock operations. */ + +#define ADDU 1 +#define ADDC 2 +#define ADDUC 3 +#define ADD 4 + +#define SUBU ADD+1 +#define SUBB ADD+2 +#define SUBUB ADD+3 +#define SUB ADD+4 + +#define AND_ ADD+5 +#define OR ADD+6 +#define XOR ADD+7 +#define CMP ADD+8 + +/* Loads. */ + +#define LDAB CMP+1 +#define LDAH CMP+2 +#define LDA CMP+3 +#define LDAD CMP+4 + +#define LDB LDAD+1 +#define LDH LDAD+2 +#define LD LDAD+3 +#define LDD LDAD+4 +#define LDBU LDAD+5 +#define LDHU LDAD+6 + +/* Stores. */ + +#define STB LDHU+1 +#define STH LDHU+2 +#define ST LDHU+3 +#define STD LDHU+4 + +/* Exchange. */ + +#define XMEMBU LDHU+5 +#define XMEM LDHU+6 + +/* Branches. */ + +#define JSR STD+1 +#define BSR STD+2 +#define BR STD+3 +#define JMP STD+4 +#define BB1 STD+5 +#define BB0 STD+6 +#define RTN STD+7 +#define BCND STD+8 + +/* Traps. */ + +#define TB1 BCND+1 +#define TB0 BCND+2 +#define TCND BCND+3 +#define RTE BCND+4 +#define TBND BCND+5 + +/* Misc. */ + +#define MUL TBND + 1 +#define DIV MUL +2 +#define DIVU MUL +3 +#define MASK MUL +4 +#define FF0 MUL +5 +#define FF1 MUL +6 +#define CLR MUL +7 +#define SET MUL +8 +#define EXT MUL +9 +#define EXTU MUL +10 +#define MAK MUL +11 +#define ROT MUL +12 + +/* Control register manipulations. */ + +#define LDCR ROT +1 +#define STCR ROT +2 +#define XCR ROT +3 + +#define FLDCR ROT +4 +#define FSTCR ROT +5 +#define FXCR ROT +6 + +#define NOP XCR +1 + +/* Floating point instructions. */ + +#define FADD NOP +1 +#define FSUB NOP +2 +#define FMUL NOP +3 +#define FDIV NOP +4 +#define FSQRT NOP +5 +#define FCMP NOP +6 +#define FIP NOP +7 +#define FLT NOP +8 +#define INT NOP +9 +#define NINT NOP +10 +#define TRNC NOP +11 +#define FLDC NOP +12 +#define FSTC NOP +13 +#define FXC NOP +14 + +#define UEXT(src,off,wid) \ + ((((unsigned int)(src)) >> (off)) & ((1 << (wid)) - 1)) + +#define SEXT(src,off,wid) \ + (((((int)(src))<<(32 - ((off) + (wid)))) >>(32 - (wid))) ) + +#define MAKE(src,off,wid) \ + ((((unsigned int)(src)) & ((1 << (wid)) - 1)) << (off)) + +#define opword(n) (unsigned long) (memaddr->mem.l) + +/* Constants and masks. */ + +#define SFU0 0x80000000 +#define SFU1 0x84000000 +#define SFU7 0x9c000000 +#define RRI10 0xf0000000 +#define RRR 0xf4000000 +#define SFUMASK 0xfc00ffe0 +#define RRRMASK 0xfc00ffe0 +#define RRI10MASK 0xfc00fc00 +#define DEFMASK 0xfc000000 +#define CTRL 0x0000f000 +#define CTRLMASK 0xfc00f800 + +/* Operands types. */ + +enum operand_type +{ + HEX = 1, + REG = 2, + CONT = 3, + IND = 3, + BF = 4, + /* Scaled register. */ + REGSC = 5, + /* Control register. */ + CRREG = 6, + /* Floating point control register. */ + FCRREG = 7, + PCREL = 8, + CONDMASK = 9, + /* Extended register. */ + XREG = 10, + /* Decimal. */ + DEC = 11 +}; + +/* Hashing specification. */ + +#define HASHVAL 79 + +/* Structure templates. */ + +typedef struct +{ + unsigned int offset; + unsigned int width; + enum operand_type type; +} OPSPEC; + +struct SIM_FLAGS +{ + int ltncy, /* latency (max number of clocks needed to execute). */ + extime, /* execution time (min number of clocks needed to execute). */ + wb_pri; /* writeback slot priority. */ + unsigned op:OP, /* simulator version of opcode. */ + imm_flags:2, /* 10,16 or 26 bit immediate flags. */ + rs1_used:1, /* register source 1 used. */ + rs2_used:1, /* register source 2 used. */ + rsd_used:1, /* register source/dest used. */ + c_flag:1, /* complement. */ + u_flag:1, /* upper half word. */ + n_flag:1, /* execute next. */ + wb_flag:1, /* uses writeback slot. */ + dest_64:1, /* double precision dest. */ + s1_64:1, /* double precision source 1. */ + s2_64:1, /* double precision source 2. */ + scale_flag:1; /* register is scaled. */ +}; + +typedef struct INSTRUCTAB { + unsigned int opcode; + char *mnemonic; + OPSPEC op1,op2,op3; + struct SIM_FLAGS flgs; +} INSTAB; + + +#define NO_OPERAND {0,0,0} + +extern const INSTAB instructions[]; + +/* + * Local Variables: + * fill-column: 131 + * End: + */ diff --git a/include/opcode/metag.h b/include/opcode/metag.h new file mode 100644 index 0000000..c9bb668 --- /dev/null +++ b/include/opcode/metag.h @@ -0,0 +1,2079 @@ +/* Imagination Technologies Meta opcode table. + Copyright (C) 2013 Free Software Foundation, Inc. + Contributed by Imagination Technologies Ltd. + + This file is part of GDB and GAS. + + GDB and GAS are 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, or (at + your option) any later version. + + GDB and GAS are 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 GDB or GAS; see the file COPYING3. If not, write to the + Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +enum metag_unit +{ + UNIT_CT, + UNIT_D0, + UNIT_D1, + UNIT_A0, + UNIT_A1, + UNIT_PC, + UNIT_RD, + UNIT_TR, + UNIT_TT, + UNIT_FX, + UNIT_DT, /* DSP Template Table */ + UNIT_ACC_D0, + UNIT_ACC_D1, + UNIT_RAM_D0, + UNIT_RAM_D1, +}; + +typedef struct +{ + const char * name; + enum metag_unit unit; + unsigned int no; +} metag_reg; + +static const metag_reg metag_regtab[] = + { + { "TXENABLE", UNIT_CT, 0 }, + { "CT.0", UNIT_CT, 0 }, + { "TXMODE", UNIT_CT, 1 }, + { "CT.1", UNIT_CT, 1 }, + { "TXSTATUS", UNIT_CT, 2 }, + { "CT.2", UNIT_CT, 2 }, + { "TXRPT", UNIT_CT, 3 }, + { "CT.3", UNIT_CT, 3 }, + { "TXTIMER", UNIT_CT, 4 }, + { "CT.4", UNIT_CT, 4 }, + { "TXL1START", UNIT_CT, 5 }, + { "CT.5", UNIT_CT, 5 }, + { "TXL1END", UNIT_CT, 6 }, + { "CT.6", UNIT_CT, 6 }, + { "TXL1COUNT", UNIT_CT, 7 }, + { "CT.7", UNIT_CT, 7 }, + { "TXL2START", UNIT_CT, 8 }, + { "CT.8", UNIT_CT, 8 }, + { "TXL2END", UNIT_CT, 9 }, + { "CT.9", UNIT_CT, 9 }, + { "TXL2COUNT", UNIT_CT, 10 }, + { "CT.10", UNIT_CT, 10 }, + { "TXBPOBITS", UNIT_CT, 11 }, + { "CT.11", UNIT_CT, 11 }, + { "TXMRSIZE", UNIT_CT, 12 }, + { "CT.12", UNIT_CT, 12 }, + { "TXTIMERI", UNIT_CT, 13 }, + { "CT.13", UNIT_CT, 13 }, + { "TXDRCTRL", UNIT_CT, 14 }, + { "CT.14", UNIT_CT, 14 }, + { "TXDRSIZE", UNIT_CT, 15 }, + { "CT.15", UNIT_CT, 15 }, + { "TXCATCH0", UNIT_CT, 16 }, + { "CT.16", UNIT_CT, 16 }, + { "TXCATCH1", UNIT_CT, 17 }, + { "CT.17", UNIT_CT, 17 }, + { "TXCATCH2", UNIT_CT, 18 }, + { "CT.18", UNIT_CT, 18 }, + { "TXCATCH3", UNIT_CT, 19 }, + { "CT.19", UNIT_CT, 19 }, + { "TXDEFR", UNIT_CT, 20 }, + { "CT.20", UNIT_CT, 20 }, + { "TXCPRS", UNIT_CT, 21 }, + { "CT.21", UNIT_CT, 21 }, + { "TXCLKCTRL", UNIT_CT, 22 }, + { "CT.22", UNIT_CT, 22 }, + { "TXINTERN0", UNIT_CT, 23 }, + { "TXSTATE", UNIT_CT, 23 }, + { "CT.23", UNIT_CT, 23 }, + { "TXAMAREG0", UNIT_CT, 24 }, + { "CT.24", UNIT_CT, 24 }, + { "TXAMAREG1", UNIT_CT, 25 }, + { "CT.25", UNIT_CT, 25 }, + { "TXAMAREG2", UNIT_CT, 26 }, + { "CT.26", UNIT_CT, 26 }, + { "TXAMAREG3", UNIT_CT, 27 }, + { "CT.27", UNIT_CT, 27 }, + { "TXDIVTIME", UNIT_CT, 28 }, + { "CT.28", UNIT_CT, 28 }, + { "TXPRIVEXT", UNIT_CT, 29 }, + { "CT.29", UNIT_CT, 29 }, + { "TXTACTCYC", UNIT_CT, 30 }, + { "TXACTCYC", UNIT_CT, 30 }, + { "CT.30", UNIT_CT, 30 }, + { "TXIDLECYC", UNIT_CT, 31 }, + { "CT.31", UNIT_CT, 31 }, + + { "D0Re0", UNIT_D0, 0 }, + { "D0.0", UNIT_D0, 0 }, + { "D0Ar6", UNIT_D0, 1 }, + { "D0.1", UNIT_D0, 1 }, + { "D0Ar4", UNIT_D0, 2 }, + { "D0.2", UNIT_D0, 2 }, + { "D0Ar2", UNIT_D0, 3 }, + { "D0.3", UNIT_D0, 3 }, + { "D0FrT", UNIT_D0, 4 }, + { "D0.4", UNIT_D0, 4 }, + { "D0.5", UNIT_D0, 5 }, + { "D0.6", UNIT_D0, 6 }, + { "D0.7", UNIT_D0, 7 }, + { "D0.8", UNIT_D0, 8 }, + { "D0.9", UNIT_D0, 9 }, + { "D0.10", UNIT_D0, 10 }, + { "D0.11", UNIT_D0, 11 }, + { "D0.12", UNIT_D0, 12 }, + { "D0.13", UNIT_D0, 13 }, + { "D0.14", UNIT_D0, 14 }, + { "D0.15", UNIT_D0, 15 }, + { "D0.16", UNIT_D0, 16 }, + { "D0.17", UNIT_D0, 17 }, + { "D0.18", UNIT_D0, 18 }, + { "D0.19", UNIT_D0, 19 }, + { "D0.20", UNIT_D0, 20 }, + { "D0.21", UNIT_D0, 21 }, + { "D0.22", UNIT_D0, 22 }, + { "D0.23", UNIT_D0, 23 }, + { "D0.24", UNIT_D0, 24 }, + { "D0.25", UNIT_D0, 25 }, + { "D0.26", UNIT_D0, 26 }, + { "D0.27", UNIT_D0, 27 }, + { "D0.28", UNIT_D0, 28 }, + { "D0.29", UNIT_D0, 29 }, + { "D0.30", UNIT_D0, 30 }, + { "D0.31", UNIT_D0, 31 }, + + { "D1Re0", UNIT_D1, 0 }, + { "D1.0", UNIT_D1, 0 }, + { "D1Ar5", UNIT_D1, 1 }, + { "D1.1", UNIT_D1, 1 }, + { "D1Ar3", UNIT_D1, 2 }, + { "D1.2", UNIT_D1, 2 }, + { "D1Ar1", UNIT_D1, 3 }, + { "D1.3", UNIT_D1, 3 }, + { "D1RtP", UNIT_D1, 4 }, + { "D1.4", UNIT_D1, 4 }, + { "D1.5", UNIT_D1, 5 }, + { "D1.6", UNIT_D1, 6 }, + { "D1.7", UNIT_D1, 7 }, + { "D1.8", UNIT_D1, 8 }, + { "D1.9", UNIT_D1, 9 }, + { "D1.10", UNIT_D1, 10 }, + { "D1.11", UNIT_D1, 11 }, + { "D1.12", UNIT_D1, 12 }, + { "D1.13", UNIT_D1, 13 }, + { "D1.14", UNIT_D1, 14 }, + { "D1.15", UNIT_D1, 15 }, + { "D1.16", UNIT_D1, 16 }, + { "D1.17", UNIT_D1, 17 }, + { "D1.18", UNIT_D1, 18 }, + { "D1.19", UNIT_D1, 19 }, + { "D1.20", UNIT_D1, 20 }, + { "D1.21", UNIT_D1, 21 }, + { "D1.22", UNIT_D1, 22 }, + { "D1.23", UNIT_D1, 23 }, + { "D1.24", UNIT_D1, 24 }, + { "D1.25", UNIT_D1, 25 }, + { "D1.26", UNIT_D1, 26 }, + { "D1.27", UNIT_D1, 27 }, + { "D1.28", UNIT_D1, 28 }, + { "D1.29", UNIT_D1, 29 }, + { "D1.30", UNIT_D1, 30 }, + { "D1.31", UNIT_D1, 31 }, + + { "A0StP", UNIT_A0, 0 }, + { "A0.0", UNIT_A0, 0 }, + { "A0FrP", UNIT_A0, 1 }, + { "A0.1", UNIT_A0, 1 }, + { "A0.2", UNIT_A0, 2 }, + { "A0.3", UNIT_A0, 3 }, + { "A0.4", UNIT_A0, 4 }, + { "A0.5", UNIT_A0, 5 }, + { "A0.6", UNIT_A0, 6 }, + { "A0.7", UNIT_A0, 7 }, + { "A0.8", UNIT_A0, 8 }, + { "A0.9", UNIT_A0, 9 }, + { "A0.10", UNIT_A0, 10 }, + { "A0.11", UNIT_A0, 11 }, + { "A0.12", UNIT_A0, 12 }, + { "A0.13", UNIT_A0, 13 }, + { "A0.14", UNIT_A0, 14 }, + { "A0.15", UNIT_A0, 15 }, + { "CPC0", UNIT_A0, 16 }, + + { "A1GbP", UNIT_A1, 0 }, + { "A1.0", UNIT_A1, 0 }, + { "A1LbP", UNIT_A1, 1 }, + { "A1.1", UNIT_A1, 1 }, + { "A1.2", UNIT_A1, 2 }, + { "A1.3", UNIT_A1, 3 }, + { "A1.4", UNIT_A1, 4 }, + { "A1.5", UNIT_A1, 5 }, + { "A1.6", UNIT_A1, 6 }, + { "A1.7", UNIT_A1, 7 }, + { "A1.8", UNIT_A1, 8 }, + { "A1.9", UNIT_A1, 9 }, + { "A1.10", UNIT_A1, 10 }, + { "A1.11", UNIT_A1, 11 }, + { "A1.12", UNIT_A1, 12 }, + { "A1.13", UNIT_A1, 13 }, + { "A1.14", UNIT_A1, 14 }, + { "A1.15", UNIT_A1, 15 }, + { "CPC1", UNIT_A1, 16 }, + + { "PC", UNIT_PC, 0 }, + { "PCX", UNIT_PC, 1 }, + + { "RD", UNIT_RD, 0 }, + { "RA", UNIT_RD, 16 }, + { "RD", UNIT_RD, 16 }, + { "RAPF", UNIT_RD, 17 }, + { "RAM8X32", UNIT_RD, 22 }, + { "RAM8X", UNIT_RD, 23 }, + { "RABZ", UNIT_RD, 24 }, + { "RAWZ", UNIT_RD, 25 }, + { "RADZ", UNIT_RD, 26 }, + { "RABX", UNIT_RD, 28 }, + { "RAWX", UNIT_RD, 29 }, + { "RADX", UNIT_RD, 30 }, + { "RAMX", UNIT_RD, 31 }, + { "RAM16X", UNIT_RD, 31 }, + + { "TXSTAT", UNIT_TR, 0 }, + { "TR.0", UNIT_TR, 0 }, + { "TXMASK", UNIT_TR, 1 }, + { "TR.1", UNIT_TR, 1 }, + { "TXSTATI", UNIT_TR, 2 }, + { "TR.2", UNIT_TR, 2 }, + { "TXMASKI", UNIT_TR, 3 }, + { "TR.3", UNIT_TR, 3 }, + { "TXPOLL", UNIT_TR, 4 }, + { "TR.4", UNIT_TR, 4 }, + { "TXGPIOI", UNIT_TR, 5 }, + { "TR.5", UNIT_TR, 5 }, + { "TXPOLLI", UNIT_TR, 6 }, + { "TR.6", UNIT_TR, 6 }, + { "TXGPIOO", UNIT_TR, 7 }, + { "TR.7", UNIT_TR, 7 }, + + { "TTEXEC", UNIT_TT, 0 }, + { "TT.0", UNIT_TT, 0 }, + { "TTCTRL", UNIT_TT, 1 }, + { "TT.1", UNIT_TT, 1 }, + { "TTMARK", UNIT_TT, 2 }, + { "TT.2", UNIT_TT, 2 }, + { "TTREC", UNIT_TT, 3 }, + { "TT.3", UNIT_TT, 3 }, + { "GTEXEC", UNIT_TT, 4 }, + { "TT.4", UNIT_TT, 4 }, + + { "FX.0", UNIT_FX, 0 }, + { "FX.1", UNIT_FX, 1 }, + { "FX.2", UNIT_FX, 2 }, + { "FX.3", UNIT_FX, 3 }, + { "FX.4", UNIT_FX, 4 }, + { "FX.5", UNIT_FX, 5 }, + { "FX.6", UNIT_FX, 6 }, + { "FX.7", UNIT_FX, 7 }, + { "FX.8", UNIT_FX, 8 }, + { "FX.9", UNIT_FX, 9 }, + { "FX.10", UNIT_FX, 10 }, + { "FX.11", UNIT_FX, 11 }, + { "FX.12", UNIT_FX, 12 }, + { "FX.13", UNIT_FX, 13 }, + { "FX.14", UNIT_FX, 14 }, + { "FX.15", UNIT_FX, 15 }, + }; + +static const metag_reg metag_dsp_regtab[] = + { + { "D0AR.0", UNIT_RAM_D0, 0 }, + { "D0AR.1", UNIT_RAM_D0, 1 }, + { "D0AW.0", UNIT_RAM_D0, 2 }, + { "D0AW.1", UNIT_RAM_D0, 3 }, + { "D0BR.0", UNIT_RAM_D0, 4 }, + { "D0BR.1", UNIT_RAM_D0, 5 }, + { "D0BW.0", UNIT_RAM_D0, 6 }, + { "D0BW.1", UNIT_RAM_D0, 7 }, + { "D0ARI.0", UNIT_RAM_D0, 8 }, + { "D0ARI.1", UNIT_RAM_D0, 9 }, + { "D0AWI.0", UNIT_RAM_D0, 10 }, + { "D0AWI.1", UNIT_RAM_D0, 11 }, + { "D0BRI.0", UNIT_RAM_D0, 12 }, + { "D0BRI.1", UNIT_RAM_D0, 13 }, + { "D0BWI.0", UNIT_RAM_D0, 14 }, + { "D0BWI.1", UNIT_RAM_D0, 15 }, + + { "AC0.0", UNIT_ACC_D0, 16 }, + { "AC0.1", UNIT_ACC_D0, 17 }, + { "AC0.2", UNIT_ACC_D0, 18 }, + { "AC0.3", UNIT_ACC_D0, 19 }, + + { "D1AR.0", UNIT_RAM_D1, 0 }, + { "D1AR.1", UNIT_RAM_D1, 1 }, + { "D1AW.0", UNIT_RAM_D1, 2 }, + { "D1AW.1", UNIT_RAM_D1, 3 }, + { "D1BR.0", UNIT_RAM_D1, 4 }, + { "D1BR.1", UNIT_RAM_D1, 5 }, + { "D1BW.0", UNIT_RAM_D1, 6 }, + { "D1BW.1", UNIT_RAM_D1, 7 }, + { "D1ARI.0", UNIT_RAM_D1, 8 }, + { "D1ARI.1", UNIT_RAM_D1, 9 }, + { "D1AWI.0", UNIT_RAM_D1, 10 }, + { "D1AWI.1", UNIT_RAM_D1, 11 }, + { "D1BRI.0", UNIT_RAM_D1, 12 }, + { "D1BRI.1", UNIT_RAM_D1, 13 }, + { "D1BWI.0", UNIT_RAM_D1, 14 }, + { "D1BWI.1", UNIT_RAM_D1, 15 }, + + { "AC1.0", UNIT_ACC_D1, 16 }, + { "AC1.1", UNIT_ACC_D1, 17 }, + { "AC1.2", UNIT_ACC_D1, 18 }, + { "AC1.3", UNIT_ACC_D1, 19 }, + + { "T0", UNIT_DT, 0 }, + { "T1", UNIT_DT, 1 }, + { "T2", UNIT_DT, 2 }, + { "T3", UNIT_DT, 3 }, + { "T4", UNIT_DT, 4 }, + { "T5", UNIT_DT, 5 }, + { "T6", UNIT_DT, 6 }, + { "T7", UNIT_DT, 7 }, + { "T8", UNIT_DT, 8 }, + { "T9", UNIT_DT, 9 }, + { "TA", UNIT_DT, 10 }, + { "TB", UNIT_DT, 11 }, + { "TC", UNIT_DT, 12 }, + { "TD", UNIT_DT, 13 }, + { "TE", UNIT_DT, 14 }, + { "TF", UNIT_DT, 15 }, + }; + +/* This table differs from 'metag_dsp_regtab' in that the number + fields in this table are suitable for insertion into DSPRAM + template definition instruction encodings. + + The table is indexed by "load". The main benefit of this is that we + can implicitly check that the correct DSPRAM register has been used + when parsing, e.g. the read pointer only appears in the load table + and the write pointer only exists in the store table. + + The ordering of the table entries might look a bit weird but it is + based on matching the longest register string. */ +static const metag_reg metag_dsp_tmpl_regtab[2][56] = + { + { + { "D0AW.0+D0AWI.0++", UNIT_RAM_D0, 18 }, + { "D0AW.0+D0AWI.0", UNIT_RAM_D0, 18 }, + { "D0AW.0+D0AWI.1++", UNIT_RAM_D0, 19 }, + { "D0AW.0+D0AWI.1", UNIT_RAM_D0, 19 }, + { "D0AW.0++", UNIT_RAM_D0, 17 }, + { "D0AW.0", UNIT_RAM_D0, 16 }, + { "D0AWI.0", UNIT_RAM_D0, 18 }, + { "D0AWI.1", UNIT_RAM_D0, 19 }, + { "D0AW.1+D0AWI.0++", UNIT_RAM_D0, 22 }, + { "D0AW.1+D0AWI.0", UNIT_RAM_D0, 22 }, + { "D0AW.1+D0AWI.1++", UNIT_RAM_D0, 23 }, + { "D0AW.1+D0AWI.1", UNIT_RAM_D0, 23 }, + { "D0AW.1++", UNIT_RAM_D0, 21 }, + { "D0AW.1", UNIT_RAM_D0, 20 }, + { "D0BW.0+D0BWI.0++", UNIT_RAM_D0, 26 }, + { "D0BW.0+D0BWI.0", UNIT_RAM_D0, 26 }, + { "D0BW.0+D0BWI.1++", UNIT_RAM_D0, 27 }, + { "D0BW.0+D0BWI.1", UNIT_RAM_D0, 27 }, + { "D0BW.0++", UNIT_RAM_D0, 25 }, + { "D0BW.0", UNIT_RAM_D0, 24 }, + { "D0BWI.0", UNIT_RAM_D0, 18 }, + { "D0BWI.1", UNIT_RAM_D0, 19 }, + { "D0BW.1+D0BWI.0++", UNIT_RAM_D0, 30 }, + { "D0BW.1+D0BWI.0", UNIT_RAM_D0, 30 }, + { "D0BW.1+D0BWI.1++", UNIT_RAM_D0, 31 }, + { "D0BW.1+D0BWI.1", UNIT_RAM_D0, 31 }, + { "D0BW.1++", UNIT_RAM_D0, 29 }, + { "D0BW.1", UNIT_RAM_D0, 28 }, + + { "D1AW.0+D1AWI.0++", UNIT_RAM_D1, 18 }, + { "D1AW.0+D1AWI.0", UNIT_RAM_D1, 18 }, + { "D1AW.0+D1AWI.1++", UNIT_RAM_D1, 19 }, + { "D1AW.0+D1AWI.1", UNIT_RAM_D1, 19 }, + { "D1AW.0++", UNIT_RAM_D1, 17 }, + { "D1AW.0", UNIT_RAM_D1, 16 }, + { "D1AWI.0", UNIT_RAM_D1, 18 }, + { "D1AWI.1", UNIT_RAM_D1, 19 }, + { "D1AW.1+D1AWI.0++", UNIT_RAM_D1, 22 }, + { "D1AW.1+D1AWI.0", UNIT_RAM_D1, 22 }, + { "D1AW.1+D1AWI.1++", UNIT_RAM_D1, 23 }, + { "D1AW.1+D1AWI.1", UNIT_RAM_D1, 23 }, + { "D1AW.1++", UNIT_RAM_D1, 21 }, + { "D1AW.1", UNIT_RAM_D1, 20 }, + { "D1BW.0+D1BWI.0++", UNIT_RAM_D1, 26 }, + { "D1BW.0+D1BWI.0", UNIT_RAM_D1, 26 }, + { "D1BW.0+D1BWI.1++", UNIT_RAM_D1, 27 }, + { "D1BW.0+D1BWI.1", UNIT_RAM_D1, 27 }, + { "D1BW.0++", UNIT_RAM_D1, 25 }, + { "D1BW.0", UNIT_RAM_D1, 24 }, + { "D1BWI.0", UNIT_RAM_D1, 18 }, + { "D1BWI.1", UNIT_RAM_D1, 19 }, + { "D1BW.1+D1BWI.0++", UNIT_RAM_D1, 30 }, + { "D1BW.1+D1BWI.0", UNIT_RAM_D1, 30 }, + { "D1BW.1+D1BWI.1++", UNIT_RAM_D1, 31 }, + { "D1BW.1+D1BWI.1", UNIT_RAM_D1, 31 }, + { "D1BW.1++", UNIT_RAM_D1, 29 }, + { "D1BW.1", UNIT_RAM_D1, 28 }, + }, + + { + { "D0AR.0+D0ARI.0++", UNIT_RAM_D0, 18 }, + { "D0AR.0+D0ARI.0", UNIT_RAM_D0, 18 }, + { "D0AR.0+D0ARI.1++", UNIT_RAM_D0, 19 }, + { "D0AR.0+D0ARI.1", UNIT_RAM_D0, 19 }, + { "D0AR.0++", UNIT_RAM_D0, 17 }, + { "D0AR.0", UNIT_RAM_D0, 16 }, + { "D0ARI.0", UNIT_RAM_D0, 18 }, + { "D0ARI.1", UNIT_RAM_D0, 19 }, + { "D0AR.1+D0ARI.0++", UNIT_RAM_D0, 22 }, + { "D0AR.1+D0ARI.0", UNIT_RAM_D0, 22 }, + { "D0AR.1+D0ARI.1++", UNIT_RAM_D0, 23 }, + { "D0AR.1+D0ARI.1", UNIT_RAM_D0, 23 }, + { "D0AR.1++", UNIT_RAM_D0, 21 }, + { "D0AR.1", UNIT_RAM_D0, 20 }, + { "D0BR.0+D0BRI.0++", UNIT_RAM_D0, 26 }, + { "D0BR.0+D0BRI.0", UNIT_RAM_D0, 26 }, + { "D0BR.0+D0BRI.1++", UNIT_RAM_D0, 27 }, + { "D0BR.0+D0BRI.1", UNIT_RAM_D0, 27 }, + { "D0BR.0++", UNIT_RAM_D0, 25 }, + { "D0BR.0", UNIT_RAM_D0, 24 }, + { "D0BRI.0", UNIT_RAM_D0, 18 }, + { "D0BRI.1", UNIT_RAM_D0, 19 }, + { "D0BR.1+D0BRI.0++", UNIT_RAM_D0, 30 }, + { "D0BR.1+D0BRI.0", UNIT_RAM_D0, 30 }, + { "D0BR.1+D0BRI.1++", UNIT_RAM_D0, 31 }, + { "D0BR.1+D0BRI.1", UNIT_RAM_D0, 31 }, + { "D0BR.1++", UNIT_RAM_D0, 29 }, + { "D0BR.1", UNIT_RAM_D0, 28 }, + + { "D1AR.0+D1ARI.0++", UNIT_RAM_D1, 18 }, + { "D1AR.0+D1ARI.0", UNIT_RAM_D1, 18 }, + { "D1AR.0+D1ARI.1++", UNIT_RAM_D1, 19 }, + { "D1AR.0+D1ARI.1", UNIT_RAM_D1, 19 }, + { "D1AR.0++", UNIT_RAM_D1, 17 }, + { "D1AR.0", UNIT_RAM_D1, 16 }, + { "D1ARI.0", UNIT_RAM_D1, 18 }, + { "D1ARI.1", UNIT_RAM_D1, 19 }, + { "D1AR.1+D1ARI.0++", UNIT_RAM_D1, 22 }, + { "D1AR.1+D1ARI.0", UNIT_RAM_D1, 22 }, + { "D1AR.1+D1ARI.1++", UNIT_RAM_D1, 23 }, + { "D1AR.1+D1ARI.1", UNIT_RAM_D1, 23 }, + { "D1AR.1++", UNIT_RAM_D1, 21 }, + { "D1AR.1", UNIT_RAM_D1, 20 }, + { "D1BR.0+D1BRI.0++", UNIT_RAM_D1, 26 }, + { "D1BR.0+D1BRI.0", UNIT_RAM_D1, 26 }, + { "D1BR.0+D1BRI.1++", UNIT_RAM_D1, 27 }, + { "D1BR.0+D1BRI.1", UNIT_RAM_D1, 27 }, + { "D1BR.0++", UNIT_RAM_D1, 25 }, + { "D1BR.0", UNIT_RAM_D1, 24 }, + { "D1BR.1+D1BRI.0++", UNIT_RAM_D1, 30 }, + { "D1BR.1+D1BRI.0", UNIT_RAM_D1, 30 }, + { "D1BR.1+D1BRI.1++", UNIT_RAM_D1, 31 }, + { "D1BR.1+D1BRI.1", UNIT_RAM_D1, 31 }, + { "D1BR.1++", UNIT_RAM_D1, 29 }, + { "D1BR.1", UNIT_RAM_D1, 28 }, + { "D1BRI.0", UNIT_RAM_D1, 18 }, + { "D1BRI.1", UNIT_RAM_D1, 19 }, + }, + }; + +typedef struct +{ + const char * name; + unsigned int part; +} metag_acf; + +static const metag_acf metag_acftab[] = + { + { "ACF.0", 0}, + { "ACF.1", 1}, + { "ACF.2", 2}, + { "ACF.3", 3}, + }; + +enum insn_encoding +{ + ENC_NONE, + ENC_MOV_U2U, + ENC_MOV_PORT, + ENC_MMOV, + ENC_MDRD, + ENC_MOVL_TTREC, + ENC_GET_SET, + ENC_GET_SET_EXT, + ENC_MGET_MSET, + ENC_COND_SET, + ENC_XFR, + ENC_MOV_CT, + ENC_SWAP, + ENC_JUMP, + ENC_CALLR, + ENC_ALU, + ENC_SHIFT, + ENC_MIN_MAX, + ENC_BITOP, + ENC_CMP, + ENC_BRANCH, + ENC_KICK, + ENC_SWITCH, + ENC_CACHER, + ENC_CACHEW, + ENC_ICACHE, + ENC_LNKGET, + ENC_FMOV, + ENC_FMMOV, + ENC_FMOV_DATA, + ENC_FMOV_I, + ENC_FPACK, + ENC_FSWAP, + ENC_FCMP, + ENC_FMINMAX, + ENC_FCONV, + ENC_FCONVX, + ENC_FBARITH, + ENC_FEARITH, + ENC_FREC, + ENC_FSIMD, + ENC_FGET_SET_ACF, + ENC_DGET_SET, + ENC_DTEMPLATE, + ENC_DALU, + ENC_MAX, +}; + +enum insn_type +{ + INSN_GP, + INSN_FPU, + INSN_DSP, + INSN_DSP_FPU, +}; + +typedef struct +{ + const char *name; + + unsigned int core_flags; +#define CoreMeta11 0x1 /* The earliest Meta core we support */ +#define CoreMeta12 0x2 +#define CoreMeta21 0x4 + +#define FpuMeta21 0x21 + +#define DspMeta21 0x100 + + unsigned int meta_opcode; + unsigned int meta_mask; + + enum insn_type insn_type; + + enum insn_encoding encoding; + +#define DSP_ARGS_1 0x0000001 /* De.r,Dx.r,De.r (3 register operands) */ +#define DSP_ARGS_ACC2 0x0000002 /* Accumulator source operand 2 */ +#define DSP_ARGS_QR 0x0000004 /* QUICKRoT */ +#define DSP_ARGS_XACC 0x0000008 /* Cross-unit accumulator op */ +#define DSP_ARGS_DACC 0x0000010 /* Target accumulator as destination */ +#define DSP_ARGS_SRD 0x0000020 /* Source the RD port */ +#define DSP_ARGS_2 0x0000040 /* De.r,Dx.r (2 register operands) */ +#define DSP_ARGS_DSP_SRC1 0x0000080 /* Source a DSP register */ +#define DSP_ARGS_DSP_SRC2 0x0000100 /* Source a DSP register */ +#define DSP_ARGS_IMM 0x0000200 /* Immediate value for src 2 */ +#define DSP_ARGS_SPLIT8 0x0000400 /* Data unit split 8 operations */ +#define DSP_ARGS_12 0x0000800 /* De.r,Dx.r */ +#define DSP_ARGS_13 0x0001000 /* Dx.r,Rx.r */ +#define DSP_ARGS_14 0x0002000 /* DSPe.r,Dx.r */ +#define DSP_ARGS_15 0x0004000 /* DSPx.r,#I16 */ +#define DSP_ARGS_16 0x0008000 /* De.r,DSPx.r */ +#define DSP_ARGS_17 0x0010000 /* De.r|ACe.r,Dx.r,Rx.r|RD */ +#define DSP_ARGS_18 0x0020000 /* De.r,Dx.r|ACx.r */ +#define DSP_ARGS_20 0x0080000 /* De.r,Dx.r|ACx.r,De.r */ +#define DSP_ARGS_21 0x0100000 /* De.r,Dx.r|ACx.r,#I5 */ +#define DSP_ARGS_22 0x0200000 /* De.r,Dx.r|ACx.r,De.r|#I5 */ +#define DSP_ARGS_23 0x0400000 /* Ux.r,Dx.r|ACx.r,De.r|#I5 */ +#define GP_ARGS_QR 0x0000001 /* QUICKRoT */ + unsigned int arg_type; +} insn_template; + +enum major_opcode +{ + OPC_ADD, + OPC_SUB, + OPC_AND, + OPC_OR, + OPC_XOR, + OPC_SHIFT, + OPC_MUL, + OPC_CMP, + OPC_ADDR, + OPC_9, + OPC_MISC, + OPC_SET, + OPC_GET, + OPC_XFR, + OPC_CPR, + OPC_FPU, +}; + +#define GET_EXT_MINOR 0x7 +#define MOV_EXT_MINOR 0x6 +#define MOVL_MINOR 0x2 + +#define MAJOR_OPCODE(opcode) (((opcode) >> 28) & 0xf) +#define MINOR_OPCODE(opcode) (((opcode) >> 24) & 0xf) + +enum cond_code +{ + COND_A, + COND_EQ, + COND_NE, + COND_CS, + COND_CC, + COND_MI, + COND_PL, + COND_VS, + COND_VC, + COND_HI, + COND_LS, + COND_GE, + COND_LT, + COND_GT, + COND_LE, + COND_NV, +}; + +enum scond_code +{ + SCOND_A, + SCOND_LEQ, + SCOND_LNE, + SCOND_LLO, + SCOND_LHS, + SCOND_HEQ, + SCOND_HNE, + SCOND_HLO, + SCOND_HHS, + SCOND_LGR, + SCOND_LLE, + SCOND_HGR, + SCOND_HLE, + SCOND_EEQ, + SCOND_ELO, + SCOND_NV, +}; + +typedef struct +{ + const char *name; + enum scond_code code; +} split_condition; + +static const split_condition metag_scondtab[] = + { + { "LEQ", SCOND_LEQ }, + { "LEZ", SCOND_LEQ }, + { "LNE", SCOND_LNE }, + { "LNZ", SCOND_LNE }, + { "LLO", SCOND_LLO }, + { "LCS", SCOND_LLO }, + { "LHS", SCOND_LHS }, + { "LCC", SCOND_LHS }, + { "HEQ", SCOND_HEQ }, + { "HEZ", SCOND_HEQ }, + { "HNE", SCOND_HNE }, + { "HNZ", SCOND_HNE }, + { "HLO", SCOND_HLO }, + { "HCS", SCOND_HLO }, + { "HHS", SCOND_HHS }, + { "HCC", SCOND_HHS }, + { "LGR", SCOND_LGR }, + { "LHI", SCOND_LGR }, + { "LLE", SCOND_LLE }, + { "LLS", SCOND_LLE }, + { "HGR", SCOND_HGR }, + { "HHI", SCOND_HGR }, + { "HLE", SCOND_HLE }, + { "HLS", SCOND_HLE }, + { "EEQ", SCOND_EEQ }, + { "EEZ", SCOND_EEQ }, + { "ELO", SCOND_ELO }, + { "ECS", SCOND_ELO }, + }; + +static const split_condition metag_dsp_scondtab[] = + { + { "LEQ", SCOND_LEQ }, + { "LEZ", SCOND_LEQ }, + { "LNE", SCOND_LNE }, + { "LNZ", SCOND_LNE }, + { "LCS", SCOND_LLO }, + { "LLO", SCOND_LLO }, + { "LCC", SCOND_LHS }, + { "LHS", SCOND_LHS }, + { "HEQ", SCOND_HEQ }, + { "HEZ", SCOND_HEQ }, + { "HNE", SCOND_HNE }, + { "HNZ", SCOND_HNE }, + { "HCS", SCOND_HLO }, + { "HLO", SCOND_HLO }, + { "HCC", SCOND_HHS }, + { "HHS", SCOND_HHS }, + { "LHI", SCOND_LGR }, + { "LGR", SCOND_LGR }, + { "LLS", SCOND_LLE }, + { "LLE", SCOND_LLE }, + { "HHI", SCOND_HGR }, + { "HGR", SCOND_HGR }, + { "HLS", SCOND_HLE }, + { "HLE", SCOND_HLE }, + { "EEQ", SCOND_EEQ }, + { "EEZ", SCOND_EEQ }, + { "ECS", SCOND_ELO }, + { "ELO", SCOND_ELO }, + }; + +static const split_condition metag_fpu_scondtab[] = + { + { "LEQ", SCOND_LEQ }, + { "LEZ", SCOND_LEQ }, + { "LNE", SCOND_LNE }, + { "LNZ", SCOND_LNE }, + { "LLO", SCOND_LLO }, + { "LCS", SCOND_LLO }, + { "LHS", SCOND_LHS }, + { "LCC", SCOND_LHS }, + { "HEQ", SCOND_HEQ }, + { "HEZ", SCOND_HEQ }, + { "HNE", SCOND_HNE }, + { "HNZ", SCOND_HNE }, + { "HLO", SCOND_HLO }, + { "HCS", SCOND_HLO }, + { "HHS", SCOND_HHS }, + { "HCC", SCOND_HHS }, + { "LGR", SCOND_LGR }, + { "LHI", SCOND_LGR }, + { "LLE", SCOND_LLE }, + { "LLS", SCOND_LLE }, + { "HGR", SCOND_HGR }, + { "HHI", SCOND_HGR }, + { "HLE", SCOND_HLE }, + { "HLS", SCOND_HLE }, + { "EEQ", SCOND_EEQ }, + { "EEZ", SCOND_EEQ }, + { "ELO", SCOND_ELO }, + { "ECS", SCOND_ELO }, + }; + +enum fcond_code +{ + FCOND_A, + FCOND_FEQ, + FCOND_UNE, + FCOND_FLT, + FCOND_UGE, + + FCOND_UVS = 7, + FCOND_FVC, + FCOND_UGT, + FCOND_FLE, + FCOND_FGE, + FCOND_ULT, + FCOND_FGT, + FCOND_ULE, + FCOND_NV, +}; + +#define COND_INSN(mnemonic, suffix, field_shift, flags, meta_opcode, \ + meta_mask, insn_type, encoding, args) \ + { mnemonic suffix, flags, meta_opcode, meta_mask, \ + insn_type, encoding, args }, \ + { mnemonic "A" suffix, flags, meta_opcode, meta_mask, \ + insn_type, encoding, args }, \ + { mnemonic "EQ" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "Z" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NE" suffix, flags, meta_opcode | (COND_NE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NZ" suffix, flags, meta_opcode | (COND_NE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "CS" suffix, flags, meta_opcode | (COND_CS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LO" suffix, flags, meta_opcode | (COND_CS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "CC" suffix, flags, meta_opcode | (COND_CC << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "HS" suffix, flags, meta_opcode | (COND_CC << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "MI" suffix, flags, meta_opcode | (COND_MI << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "N" suffix, flags, meta_opcode | (COND_MI << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "PL" suffix, flags, meta_opcode | (COND_PL << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NC" suffix, flags, meta_opcode | (COND_PL << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "VS" suffix, flags, meta_opcode | (COND_VS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "VC" suffix, flags, meta_opcode | (COND_VC << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "HI" suffix, flags, meta_opcode | (COND_HI << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LS" suffix, flags, meta_opcode | (COND_LS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "GE" suffix, flags, meta_opcode | (COND_GE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LT" suffix, flags, meta_opcode | (COND_LT << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "GT" suffix, flags, meta_opcode | (COND_GT << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LE" suffix, flags, meta_opcode | (COND_LE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NV" suffix, flags, meta_opcode | (COND_NV << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "FEQ" suffix, flags, meta_opcode | \ + (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FZ" suffix, flags, meta_opcode | \ + (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UNE" suffix, flags, meta_opcode | \ + (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UNZ" suffix, flags, meta_opcode | \ + (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FLT" suffix, flags, meta_opcode | \ + (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FLO" suffix, flags, meta_opcode | \ + (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UGE" suffix, flags, meta_opcode | \ + (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UHS" suffix, flags, meta_opcode | \ + (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UVS" suffix, flags, meta_opcode | \ + (FCOND_UVS << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FVC" suffix, flags, meta_opcode | \ + (FCOND_FVC << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UGT" suffix, flags, meta_opcode | \ + (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UHI" suffix, flags, meta_opcode | \ + (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FLE" suffix, flags, meta_opcode | \ + (FCOND_FLE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FGE" suffix, flags, meta_opcode | \ + (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FHS" suffix, flags, meta_opcode | \ + (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "ULT" suffix, flags, meta_opcode | \ + (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "ULO" suffix, flags, meta_opcode | \ + (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FGT" suffix, flags, meta_opcode | \ + (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FHI" suffix, flags, meta_opcode | \ + (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "ULE" suffix, flags, meta_opcode | \ + (FCOND_ULE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "NV" suffix, flags, meta_opcode | \ + (FCOND_NV << field_shift), meta_mask, INSN_FPU, encoding, args } + +#define FCOND_INSN(mnemonic, suffix, field_shift, flags, meta_opcode, \ + meta_mask, insn_type, encoding, args) \ + { mnemonic suffix, flags, meta_opcode, meta_mask, \ + insn_type, encoding, args }, \ + { mnemonic "A" suffix, flags, meta_opcode, meta_mask, \ + insn_type, encoding, args }, \ + { mnemonic "FEQ" suffix, flags, meta_opcode | \ + (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FZ" suffix, flags, meta_opcode | \ + (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UNE" suffix, flags, meta_opcode | \ + (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UNZ" suffix, flags, meta_opcode | \ + (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FLO" suffix, flags, meta_opcode | \ + (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FLT" suffix, flags, meta_opcode | \ + (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UHS" suffix, flags, meta_opcode | \ + (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UGE" suffix, flags, meta_opcode | \ + (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UVS" suffix, flags, meta_opcode | \ + (FCOND_UVS << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FVC" suffix, flags, meta_opcode | \ + (FCOND_FVC << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UHI" suffix, flags, meta_opcode | \ + (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "UGT" suffix, flags, meta_opcode | \ + (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FLE" suffix, flags, meta_opcode | \ + (FCOND_FLE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FGE" suffix, flags, meta_opcode | \ + (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FHS" suffix, flags, meta_opcode | \ + (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "ULT" suffix, flags, meta_opcode | \ + (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "ULO" suffix, flags, meta_opcode | \ + (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FGT" suffix, flags, meta_opcode | \ + (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "FHI" suffix, flags, meta_opcode | \ + (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "ULE" suffix, flags, meta_opcode | \ + (FCOND_ULE << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "NV" suffix, flags, meta_opcode | \ + (FCOND_NV << field_shift), meta_mask, INSN_FPU, encoding, args }, \ + { mnemonic "EQ" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "Z" suffix, flags, meta_opcode | (COND_EQ << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NE" suffix, flags, meta_opcode | (COND_NE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NZ" suffix, flags, meta_opcode | (COND_NE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "CS" suffix, flags, meta_opcode | (COND_CS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LO" suffix, flags, meta_opcode | (COND_CS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "CC" suffix, flags, meta_opcode | (COND_CC << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "HS" suffix, flags, meta_opcode | (COND_CC << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "MI" suffix, flags, meta_opcode | (COND_MI << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "N" suffix, flags, meta_opcode | (COND_MI << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "PL" suffix, flags, meta_opcode | (COND_PL << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NC" suffix, flags, meta_opcode | (COND_PL << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "VS" suffix, flags, meta_opcode | (COND_VS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "VC" suffix, flags, meta_opcode | (COND_VC << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "HI" suffix, flags, meta_opcode | (COND_HI << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LS" suffix, flags, meta_opcode | (COND_LS << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "GE" suffix, flags, meta_opcode | (COND_GE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LT" suffix, flags, meta_opcode | (COND_LT << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "GT" suffix, flags, meta_opcode | (COND_GT << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "LE" suffix, flags, meta_opcode | (COND_LE << field_shift), \ + meta_mask, insn_type, encoding, args }, \ + { mnemonic "NV" suffix, flags, meta_opcode | (COND_NV << field_shift), \ + meta_mask, insn_type, encoding, args } + +#define TEMPLATE_INSN(flags, meta_opcode, meta_mask, insn_type) \ + { "T0", flags, meta_opcode | 0x0, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T1", flags, meta_opcode | 0x1, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T2", flags, meta_opcode | 0x2, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T3", flags, meta_opcode | 0x3, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T4", flags, meta_opcode | 0x4, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T5", flags, meta_opcode | 0x5, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T6", flags, meta_opcode | 0x6, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T7", flags, meta_opcode | 0x7, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T8", flags, meta_opcode | 0x8, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "T9", flags, meta_opcode | 0x9, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "TA", flags, meta_opcode | 0xa, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "TB", flags, meta_opcode | 0xb, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "TC", flags, meta_opcode | 0xc, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "TD", flags, meta_opcode | 0xd, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "TE", flags, meta_opcode | 0xe, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \ + { "TF", flags, meta_opcode | 0xf, meta_mask, insn_type, ENC_DTEMPLATE, 0 } + + +/* Unimplemented GP instructions: + CPR - coprocessor read + CPW - coprocessor write + MORT - morton order operation + VPACK, VADD, VSUB - vector instructions + + The order of the entries in this table is extremely important. DO + NOT modify it unless you know what you're doing. If you do modify + it, be sure to run the entire testsuite to make sure you haven't + caused a regression. */ + +static const insn_template metag_optab[] = + { + /* Port-to-unit MOV */ + COND_INSN ("MOVB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa1800000, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0), + COND_INSN ("MOVW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa1800001, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0), + COND_INSN ("MOVD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa1800200, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0), + COND_INSN ("MOVL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa2800000, 0xfff8019f, INSN_GP, ENC_MOV_PORT, 0), + + /* Read pipeline prime/drain */ + { "MMOVD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xca000000, 0xff00001f, INSN_GP, ENC_MMOV, 0 }, + { "MMOVL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xcb000000, 0xff00001f, INSN_GP, ENC_MMOV, 0 }, + { "MMOVD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xcc000000, 0xff07c067, INSN_GP, ENC_MMOV, 0 }, + { "MMOVL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xcd000000, 0xff07c067, INSN_GP, ENC_MMOV, 0 }, + + /* Read pipeline flush */ + { "MDRD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xcc000002, 0xffffc07f, INSN_GP, ENC_MDRD, 0 }, + + /* Unit-to-TTREC MOVL */ + COND_INSN ("MOVL", "", 1, CoreMeta12|CoreMeta21, + 0xa2002001, 0xff003e7f, INSN_GP, ENC_MOVL_TTREC, 0), + + /* MOV to RA (extended) */ + { "MOVB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa6000000, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "MOVW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa6000002, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "MOVD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa6000004, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "MOVL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa6000006, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 }, + + /* Extended GET */ + { "GETB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa7000000, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "GETW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa7000002, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "GETD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa7000004, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "GETL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa7000006, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + + /* Extended SET */ + { "SETB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa5000000, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "SETW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa5000002, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "SETD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa5000004, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + { "SETL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa5000006, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 }, + + /* MOV to RA */ + { "MOVB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc000000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, + { "MOVW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc100000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, + { "MOVD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc400000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, + { "MOVL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc500000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 }, + + /* Standard GET */ + { "GETB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc0000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + { "GETW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc1000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + { "GETD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + /* GET is a synonym for GETD. */ + { "GET", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + { "GETL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc5000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + + /* Standard SET */ + { "SETB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb0000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + { "SETW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb1000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + { "SETD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + /* SET is a synonym for SETD. */ + { "SET", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + { "SETL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb5000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 }, + + /* Multiple GET */ + { "MGETD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc8000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, + { "MGETL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xc9000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, + + /* Multiple SET */ + { "MSETD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb8000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, + { "MSETL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xb9000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 }, + + /* Conditional SET */ + COND_INSN ("SETB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa4000000, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + COND_INSN ("SETW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa4000001, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + COND_INSN ("SETD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa4000200, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + COND_INSN ("SETL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa4000201, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + { "XFRD", CoreMeta11|CoreMeta12|CoreMeta21, + 0xd0000000, 0xf2000000, INSN_GP, ENC_XFR, 0 }, + { "XFRL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xd2000000, 0xf2000000, INSN_GP, ENC_XFR, 0 }, + + /* Fast control register setup */ + { "MOV", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa9000000, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, + { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa9000001, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, + { "MOV", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa9000004, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, + { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa9000005, 0xff000005, INSN_GP, ENC_MOV_CT, 0 }, + + /* Internal transfer operations */ + { "JUMP", CoreMeta11|CoreMeta12|CoreMeta21, + 0xac000000, 0xff000004, INSN_GP, ENC_JUMP, 0 }, + { "CALL", CoreMeta11|CoreMeta12|CoreMeta21, + 0xac000004, 0xff000004, INSN_GP, ENC_JUMP, 0 }, + { "CALLR", CoreMeta11|CoreMeta12|CoreMeta21, + 0xab000000, 0xff000000, INSN_GP, ENC_CALLR, 0 }, + + /* Address unit ALU operations */ + { "MOV", CoreMeta11|CoreMeta12|CoreMeta21, + 0x80000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "MOV", CoreMeta11|CoreMeta12|CoreMeta21, + 0x82000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x82000005, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x80000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "ADD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x82000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADDT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x82000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x86000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x84000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x86000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + { "NEG", CoreMeta11|CoreMeta12|CoreMeta21, + 0x88000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "NEG", CoreMeta11|CoreMeta12|CoreMeta21, + 0x8a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "NEGT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x8a000005, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x88000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "SUB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x8a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUBT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x8a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x8e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x8c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x8e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + + /* Data unit ALU operations */ + { "MOV", CoreMeta11|CoreMeta12|CoreMeta21, + 0x00000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "MOVS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x08000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "MOV", CoreMeta11|CoreMeta12|CoreMeta21, + 0x02000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "MOVS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x0a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x02000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "MOVST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x0a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ADD", DspMeta21, + 0x00000100, 0xfe000104, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_ACC2|DSP_ARGS_XACC|DSP_ARGS_IMM }, + { "ADD", DspMeta21, + 0x02000003, 0xfe000003, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_IMM }, + COND_INSN ("ADD", "", 1, DspMeta21, + 0x040001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), + { "ADD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x00000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "ADDS", DspMeta21, + 0x08000100, 0xfe000104, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_ACC2 }, + { "ADDS", DspMeta21, + 0x0a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "ADDS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x08000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "ADD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x02000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADDS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x0a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADDT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x02000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADDST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x0a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ADD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x06000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + COND_INSN ("ADDS", "", 1, DspMeta21, + 0x0c0001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), + { "ADDS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x0e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x04000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("ADDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x0c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x06000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("ADDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x0e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + { "NEG", CoreMeta11|CoreMeta12|CoreMeta21, + 0x10000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "NEGS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x18000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "NEG", CoreMeta11|CoreMeta12|CoreMeta21, + 0x12000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "NEGS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x1a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "NEGT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x12000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "NEGST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x1a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "SUB", DspMeta21, + 0x10000100, 0xfe000104, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_ACC2|DSP_ARGS_XACC }, + { "SUB", DspMeta21, + 0x12000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "SUB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x10000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "SUBS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x18000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 }, + { "SUB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x12000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUBS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x1a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUBT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x12000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUBS", DspMeta21, + 0x18000100, 0xfe000104, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_ACC2 }, + { "SUBS", DspMeta21, + 0x1a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "SUBST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x1a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "SUB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x16000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "SUBS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x1e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + COND_INSN ("SUBS", "", 1, DspMeta21, + 0x1c0001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), + COND_INSN ("SUB", "", 1, DspMeta21, + 0x140001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1), + COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x14000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("SUBS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x1c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x16000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("SUBS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x1e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + { "AND", CoreMeta11|CoreMeta12|CoreMeta21, + 0x20000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "ANDS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x28000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "ANDQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x20000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "ANDSQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x28000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "AND", CoreMeta11|CoreMeta12|CoreMeta21, + 0x22000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ANDMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x22000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ANDS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x2a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ANDSMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x2a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ANDT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x22000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ANDMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x22000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ANDST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x2a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ANDSMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x2a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "AND", DspMeta21, + 0x20000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "AND", CoreMeta11|CoreMeta12|CoreMeta21, + 0x26000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "ANDS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x2e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "ANDQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x26000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "ANDSQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x2e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "ANDQ", DspMeta21, + 0x20000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, + COND_INSN ("ANDQ", "", 1, DspMeta21, + 0x240001c0, 0xfe0001de, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_QR), + COND_INSN ("AND", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x24000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + { "ANDSQ", DspMeta21, + 0x28000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, + COND_INSN ("ANDSQ", "", 1, DspMeta21, + 0x2c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_QR), + COND_INSN ("ANDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x2c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("AND", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x26000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("ANDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x2e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("ANDQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x26000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), + COND_INSN ("ANDSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x2e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), + { "OR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x30000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "ORS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x38000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "ORQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x30000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "ORSQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x38000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "OR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x32000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ORMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x32000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ORS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x3a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ORSMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x3a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "ORT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x32000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ORMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x32000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ORST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x3a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "ORSMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x3a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "OR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x36000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "ORS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x3e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "ORQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x36000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "ORSQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x3e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "ORQ", DspMeta21, + 0x30000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, + COND_INSN ("ORQ", "", 1, DspMeta21, + 0x340001c0, 0xfe0001de, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_QR), + COND_INSN ("OR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x34000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + { "ORSQ", DspMeta21, + 0x38000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, + COND_INSN ("ORSQ", "", 1, DspMeta21, + 0x3c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_QR), + COND_INSN ("ORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x3c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("OR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x36000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("ORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x3e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("ORQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x36000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), + COND_INSN ("ORSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x3e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), + { "XOR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x40000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "XORS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x48000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "XORQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x40000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "XORSQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x48000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "XOR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x42000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "XORMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x42000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "XORS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x4a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "XORSMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x4a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "XORT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x42000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "XORMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x42000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "XORST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x4a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "XORSMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x4a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "XOR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x46000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "XORS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x4e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "XORQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x46000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "XORSQ", CoreMeta11|CoreMeta12|CoreMeta21, + 0x4e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR }, + { "XORQ", DspMeta21, + 0x40000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, + COND_INSN ("XORQ", "", 1, DspMeta21, + 0x440001c0, 0xfe0001de, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_QR), + COND_INSN ("XOR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x44000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + { "XORSQ", DspMeta21, + 0x48000140, 0xfe000140, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR }, + COND_INSN ("XORSQ", "", 1, DspMeta21, + 0x4c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_QR), + COND_INSN ("XORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x4c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0), + COND_INSN ("XOR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x46000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("XORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x4e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("XORQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x46000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), + COND_INSN ("XORSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x4e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR), + { "LSL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x50000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "LSL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x54000020, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("LSL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x54000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "LSLS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x58000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "LSLS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c000020, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("LSLS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "LSR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x50000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "LSR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x54000060, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("LSR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x54000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "LSRS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x58000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "LSRS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c000060, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("LSRS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "ASL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x50000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "ASL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x540000a0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("ASL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x54000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "ASLS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x58000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "ASLS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c0000a0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("ASLS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "ASR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x500000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "ASR", CoreMeta11|CoreMeta12|CoreMeta21, + 0x540000e0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("ASR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x540000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "ASRS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x580000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 }, + { "ASRS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c0000e0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 }, + COND_INSN ("ASRS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x5c0000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0), + { "MULW", CoreMeta11|CoreMeta12|CoreMeta21, + 0x60000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "MULD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x60000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + /* MUL is a synonym from MULD. */ + { "MUL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x60000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0 }, + { "MULW", CoreMeta11|CoreMeta12|CoreMeta21, + 0x62000000, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "MULD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x62000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "MUL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x62000004, 0xfe000005, INSN_GP, ENC_ALU, 0 }, + { "MULWT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x62000001, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "MULDT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x62000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "MULT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x62000005, 0xfe000007, INSN_GP, ENC_ALU, 0 }, + { "MULW", CoreMeta11|CoreMeta12|CoreMeta21, + 0x64000020, 0xfe0001e0, INSN_GP, ENC_ALU, 0 }, + { "MULD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x64000060, 0xfe0001e0, INSN_GP, ENC_ALU, 0 }, + { "MUL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x64000060, 0xfe0001e0, INSN_GP, ENC_ALU, 0 }, + { "MULW", CoreMeta11|CoreMeta12|CoreMeta21, + 0x66000020, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "MULD", CoreMeta11|CoreMeta12|CoreMeta21, + 0x66000021, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + { "MUL", CoreMeta11|CoreMeta12|CoreMeta21, + 0x66000021, 0xfe000021, INSN_GP, ENC_ALU, 0 }, + COND_INSN ("MULW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x64000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0), + COND_INSN ("MULD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x64000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0), + COND_INSN ("MUL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x64000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0), + COND_INSN ("MULW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x66000000, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("MULD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x66000001, 0xfe00003f, INSN_GP, ENC_ALU, 0), + COND_INSN ("MUL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x66000001, 0xfe00003f, INSN_GP, ENC_ALU, 0), + { "MIN", CoreMeta11|CoreMeta12|CoreMeta21, + 0x70000020, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 }, + { "MAX", CoreMeta11|CoreMeta12|CoreMeta21, + 0x70000024, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 }, + { "FFB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x70000004, 0xfe003fff, INSN_GP, ENC_BITOP, 0 }, + { "NORM", CoreMeta11|CoreMeta12|CoreMeta21, + 0x70000008, 0xfe003fff, INSN_GP, ENC_BITOP, 0 }, + { "ABS", CoreMeta11|CoreMeta12|CoreMeta21, + 0x70000028, 0xfe003fff, INSN_GP, ENC_BITOP, 0 }, + { "XSDB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaa000000, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "XSDSB", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaa000008, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "XSDW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaa000002, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "XSDSW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaa00000a, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "RTDW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaa000006, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "RTDSW", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaa00000e, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "NMIN", CoreMeta11|CoreMeta12|CoreMeta21, + 0x7000002c, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 }, + + /* Condition setting operations */ + { "CMP", CoreMeta11|CoreMeta12|CoreMeta21, + 0x70000000, 0xfef801fe, INSN_GP, ENC_CMP, 0 }, + { "TST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x78000000, 0xfef801fe, INSN_GP, ENC_CMP, 0 }, + { "CMP", CoreMeta11|CoreMeta12|CoreMeta21, + 0x72000000, 0xfe000005, INSN_GP, ENC_CMP, 0 }, + { "CMPMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x72000004, 0xfe000005, INSN_GP, ENC_CMP, 0 }, + { "TST", CoreMeta11|CoreMeta12|CoreMeta21, + 0x7a000000, 0xfe000005, INSN_GP, ENC_CMP, 0 }, + { "TSTMB", CoreMeta11|CoreMeta12|CoreMeta21, + 0x7a000004, 0xfe000005, INSN_GP, ENC_CMP, 0 }, + { "CMPT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x72000001, 0xfe000007, INSN_GP, ENC_CMP, 0 }, + { "CMPMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x72000005, 0xfe000007, INSN_GP, ENC_CMP, 0 }, + { "TSTT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x7a000001, 0xfe000007, INSN_GP, ENC_CMP, 0 }, + { "TSTMT", CoreMeta11|CoreMeta12|CoreMeta21, + 0x7a000005, 0xfe000007, INSN_GP, ENC_CMP, 0 }, + COND_INSN ("CMP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x74000000, 0xfef801fe, INSN_GP, ENC_CMP, 0), + COND_INSN ("TST", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x7c000000, 0xfef801fe, INSN_GP, ENC_CMP, 0), + COND_INSN ("CMP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x76000000, 0xfef8003e, INSN_GP, ENC_CMP, 0), + COND_INSN ("TST", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0x7e000000, 0xfef8003e, INSN_GP, ENC_CMP, 0), + + /* No-op (BNV) */ + { "NOP", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa0fffffe, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + + /* Branch */ + COND_INSN ("B", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa0000000, 0xff00001f, INSN_GP, ENC_BRANCH, 0), + COND_INSN ("B", "R", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa0000001, 0xff00001f, INSN_GP, ENC_BRANCH, 0), + + /* System operations */ + { "LOCK0", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa8000000, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + { "LOCK1", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa8000001, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + { "LOCK2", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa8000003, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + { "RTI", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa3ffffff, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + { "RTH", CoreMeta11|CoreMeta12|CoreMeta21, + 0xa37fffff, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + COND_INSN ("KICK", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa3000001, 0xff003e1f, INSN_GP, ENC_KICK, 0), + { "SWITCH", CoreMeta11|CoreMeta12|CoreMeta21, + 0xaf000000, 0xff000000, INSN_GP, ENC_SWITCH, 0 }, + { "DCACHE", CoreMeta11|CoreMeta12|CoreMeta21, + 0xad000000, 0xff000087, INSN_GP, ENC_CACHEW, 0 }, + { "ICACHEEXIT", CoreMeta12|CoreMeta21, + 0xae000000, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + { "ICACHEEXITR", CoreMeta12|CoreMeta21, + 0xae000001, 0xffffffff, INSN_GP, ENC_NONE, 0 }, + { "ICACHE", CoreMeta12|CoreMeta21, + 0xae000000, 0xff0001e1, INSN_GP, ENC_ICACHE, 0 }, + { "ICACHER", CoreMeta12|CoreMeta21, + 0xae000001, 0xff0001e1, INSN_GP, ENC_ICACHE, 0 }, + + /* Meta 2 instructions */ + { "CACHERD", CoreMeta21, + 0xad000081, 0xff000087, INSN_GP, ENC_CACHER, 0 }, + { "CACHERL", CoreMeta21, + 0xad000083, 0xff000087, INSN_GP, ENC_CACHER, 0 }, + { "CACHEWD", CoreMeta21, + 0xad000001, 0xff000087, INSN_GP, ENC_CACHEW, 0 }, + { "CACHEWL", CoreMeta21, + 0xad000003, 0xff000087, INSN_GP, ENC_CACHEW, 0 }, + COND_INSN ("DEFR", "", 1, CoreMeta21, + 0xa3002001, 0xff003e1f, INSN_GP, ENC_KICK, 0), + { "BEXD", CoreMeta21, + 0xaa000004, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "BEXSD", CoreMeta21, + 0xaa00000c, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "BEXL", CoreMeta21, + 0xaa000014, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "BEXSL", CoreMeta21, + 0xaa00001c, 0xff003ffe, INSN_GP, ENC_BITOP, 0 }, + { "LNKGETB", CoreMeta21, + 0xad000080, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, + { "LNKGETW", CoreMeta21, + 0xad000082, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, + { "LNKGETD", CoreMeta21, + 0xad000084, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, + { "LNKGETL", CoreMeta21, + 0xad000086, 0xff000087, INSN_GP, ENC_LNKGET, 0 }, + COND_INSN ("LNKSETB", "", 1, CoreMeta21, + 0xa4000080, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + COND_INSN ("LNKSETW", "", 1, CoreMeta21, + 0xa4000081, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + COND_INSN ("LNKSETD", "", 1, CoreMeta21, + 0xa4000280, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + COND_INSN ("LNKSETL", "", 1, CoreMeta21, + 0xa4000281, 0xff00039f, INSN_GP, ENC_COND_SET, 0), + + /* Meta 2 FPU instructions */ + + /* Port-to-unit MOV */ + COND_INSN ("MOVL", "", 1, FpuMeta21, + 0xa1800201, 0xfff83e1f, INSN_FPU, ENC_MOV_PORT, 0), + + /* Read pipeline drain */ + { "MMOVD", FpuMeta21, + 0xce000006, 0xfffc007f, INSN_FPU, ENC_MMOV, 0 }, + { "MMOVL", FpuMeta21, + 0xcf000006, 0xfffc007f, INSN_FPU, ENC_MMOV, 0 }, + + /* FP data movement instructions */ + FCOND_INSN ("ABS", "", 1, FpuMeta21, + 0xf0000080, 0xff843f9f, INSN_FPU, ENC_FMOV, 0), + { "MMOVD", FpuMeta21, + 0xbe000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, + { "MMOVL", FpuMeta21, + 0xbf000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, + { "MMOVD", FpuMeta21, + 0xce000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, + { "MMOVL", FpuMeta21, + 0xcf000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 }, + { "MOVD", FpuMeta21, + 0x08000144, 0xfe03e1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, + { "MOVD", FpuMeta21, + 0x080001c4, 0xfe83c1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, + { "MOVL", FpuMeta21, + 0x08000154, 0xfe03e1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, + { "MOVL", FpuMeta21, + 0x080001d4, 0xfe83c1ff, INSN_FPU, ENC_FMOV_DATA, 0 }, + FCOND_INSN ("MOV", "", 1, FpuMeta21, + 0xf0000000, 0xff843f9f, INSN_FPU, ENC_FMOV, 0), + { "MOV", FpuMeta21, + 0xf0000001, 0xff800001, INSN_FPU, ENC_FMOV_I, 0 }, + FCOND_INSN ("NEG", "", 1, FpuMeta21, + 0xf0000100, 0xff843f9f, INSN_FPU, ENC_FMOV, 0), + { "PACK", FpuMeta21, + 0xf0000180, 0xff8c21ff, INSN_FPU, ENC_FPACK, 0 }, + { "SWAP", FpuMeta21, + 0xf00001c0, 0xff8c7fff, INSN_FPU, ENC_FSWAP, 0 }, + + /* FP comparison instructions */ + FCOND_INSN ("CMP", "", 1, FpuMeta21, + 0xf3000000, 0xfff4201f, INSN_FPU, ENC_FCMP, 0), + FCOND_INSN ("MAX", "", 1, FpuMeta21, + 0xf3000081, 0xff84219f, INSN_FPU, ENC_FMINMAX, 0), + FCOND_INSN ("MIN", "", 1, FpuMeta21, + 0xf3000001, 0xff84219f, INSN_FPU, ENC_FMINMAX, 0), + + /* FP data conversion instructions */ + FCOND_INSN ("DTOF", "", 1, FpuMeta21, + 0xf2000121, 0xff843fff, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("FTOD", "", 1, FpuMeta21, + 0xf2000101, 0xff843fff, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("DTOH", "", 1, FpuMeta21, + 0xf2000320, 0xff843fff, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("FTOH", "", 1, FpuMeta21, + 0xf2000300, 0xff843fbf, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("DTOI", "", 1, FpuMeta21, + 0xf2002120, 0xff842fff, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("FTOI", "", 1, FpuMeta21, + 0xf2002100, 0xff842fbf, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("DTOL", "", 1, FpuMeta21, + 0xf2002320, 0xff8c6fff, INSN_FPU, ENC_FCONV, 0), + + FCOND_INSN ("DTOX", "", 1, FpuMeta21, + 0xf2000020, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), + FCOND_INSN ("FTOX", "", 1, FpuMeta21, + 0xf2000000, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), + FCOND_INSN ("DTOXL", "", 1, FpuMeta21, + 0xf20000a0, 0xff8c40ff, INSN_FPU, ENC_FCONVX, 0), + + FCOND_INSN ("HTOD", "", 1, FpuMeta21, + 0xf2000321, 0xff843fff, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("HTOF", "", 1, FpuMeta21, + 0xf2000301, 0xff843fbf, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("ITOD", "", 1, FpuMeta21, + 0xf2002121, 0xff843fff, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("ITOF", "", 1, FpuMeta21, + 0xf2002101, 0xff843fbf, INSN_FPU, ENC_FCONV, 0), + FCOND_INSN ("LTOD", "", 1, FpuMeta21, + 0xf2002321, 0xff8c7fff, INSN_FPU, ENC_FCONV, 0), + + FCOND_INSN ("XTOD", "", 1, FpuMeta21, + 0xf2000021, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), + FCOND_INSN ("XTOF", "", 1, FpuMeta21, + 0xf2000001, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0), + FCOND_INSN ("XLTOD", "", 1, FpuMeta21, + 0xf20000a1, 0xff8c40ff, INSN_FPU, ENC_FCONVX, 0), + + /* FP basic arithmetic instructions */ + FCOND_INSN ("ADD", "", 1, FpuMeta21, + 0xf1000001, 0xff84211f, INSN_FPU, ENC_FBARITH, 0), + FCOND_INSN ("MUL", "", 1, FpuMeta21, + 0xf1000100, 0xff84211f, INSN_FPU, ENC_FBARITH, 0), + FCOND_INSN ("SUB", "", 1, FpuMeta21, + 0xf1000101, 0xff84211f, INSN_FPU, ENC_FBARITH, 0), + + /* FP extended arithmetic instructions */ + { "MAC", FpuMeta21, + 0xf6000000, 0xfffc219f, INSN_FPU, ENC_FEARITH, 0 }, + { "MACS", FpuMeta21, + 0xf6000100, 0xfffc219f, INSN_FPU, ENC_FEARITH, 0 }, + + { "MAR", FpuMeta21, + 0xf6000004, 0xff84211f, INSN_FPU, ENC_FEARITH, 0 }, + { "MARS", FpuMeta21, + 0xf6000104, 0xff84211f, INSN_FPU, ENC_FEARITH, 0 }, + + { "MAW", FpuMeta21, + 0xf6000008, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, + { "MAWS", FpuMeta21, + 0xf6000108, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, + { "MAW1", FpuMeta21, + 0xf6000009, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, + { "MAWS1", FpuMeta21, + 0xf6000109, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 }, + + FCOND_INSN ("MXA", "", 1, FpuMeta21, + 0xf5000000, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), + FCOND_INSN ("MXAS", "", 1, FpuMeta21, + 0xf5000100, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), + FCOND_INSN ("MXA1", "", 1, FpuMeta21, + 0xf5000001, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), + FCOND_INSN ("MXAS1", "", 1, FpuMeta21, + 0xf5000101, 0xff84211f, INSN_FPU, ENC_FEARITH, 0), + + { "MUZ", FpuMeta21, + 0xf6000010, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, + { "MUZS", FpuMeta21, + 0xf6000110, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, + { "MUZ1", FpuMeta21, + 0xf6000011, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, + { "MUZS1", FpuMeta21, + 0xf6000111, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 }, + + { "RCP", FpuMeta21, + 0xf7000000, 0xff84391f, INSN_FPU, ENC_FREC, 0 }, + { "RSQ", FpuMeta21, + 0xf7000100, 0xff84391f, INSN_FPU, ENC_FREC, 0 }, + + /* FP SIMD arithmetic instructions */ + { "ADDRE", FpuMeta21, + 0xf4000000, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 }, + { "MULRE", FpuMeta21, + 0xf4000001, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 }, + { "SUBRE", FpuMeta21, + 0xf4000100, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 }, + + /* FP memory instructions */ + { "MGETD", FpuMeta21, + 0xce000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, + { "MGET", FpuMeta21, + 0xce000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, + { "MGETL", FpuMeta21, + 0xcf000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, + + { "MSETD", FpuMeta21, + 0xbe000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, + { "MSET", FpuMeta21, + 0xbe000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, + { "MSETL", FpuMeta21, + 0xbf000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 }, + + /* FP accumulator memory instructions */ + { "GETL", FpuMeta21, + 0xcf000004, 0xffe03f9f, INSN_FPU, ENC_FGET_SET_ACF, 0 }, + { "SETL", FpuMeta21, + 0xbf000004, 0xffe03f9f, INSN_FPU, ENC_FGET_SET_ACF, 0 }, + + /* DSP FPU data movement */ + { "MOV", DspMeta21|FpuMeta21, + 0x08000146, 0xfe0001ee, INSN_DSP_FPU, ENC_DALU, + DSP_ARGS_2|DSP_ARGS_DSP_SRC1 }, + { "MOV", DspMeta21|FpuMeta21, + 0x080001c6, 0xfe0001ee, INSN_DSP_FPU, ENC_DALU, + DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, + + /* Unit-to-unit MOV */ + COND_INSN ("MOV", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa3000000, 0xff00021f, INSN_GP, ENC_MOV_U2U, 0), + COND_INSN ("TTMOV", "", 1, CoreMeta12|CoreMeta21, + 0xa3000201, 0xff00021f, INSN_GP, ENC_MOV_U2U, 0), + COND_INSN ("SWAP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21, + 0xa3000200, 0xff00021f, INSN_GP, ENC_SWAP, 0), + + /* DSP memory instructions */ + { "GETD", DspMeta21, + 0x94000100, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, + { "SETD", DspMeta21, + 0x94000000, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, + { "GETL", DspMeta21, + 0x94000104, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, + { "SETL", DspMeta21, + 0x94000004, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 }, + + /* DSP read pipeline prime/drain */ + { "MMOVD", DspMeta21, + 0xca000001, 0xff00001f, INSN_DSP, ENC_MMOV, 0 }, + { "MMOVL", DspMeta21, + 0xcb000001, 0xff00001f, INSN_DSP, ENC_MMOV, 0 }, + { "MMOVD", DspMeta21, + 0xcc000001, 0xff07c067, INSN_DSP, ENC_MMOV, 0 }, + { "MMOVL", DspMeta21, + 0xcd000001, 0xff07c067, INSN_DSP, ENC_MMOV, 0 }, + + /* DSP Template instantiation */ + TEMPLATE_INSN (DspMeta21, 0x90000000, 0xff00000f, INSN_DSP), + TEMPLATE_INSN (DspMeta21, 0x93000000, 0xff0001ff, INSN_DSP), + TEMPLATE_INSN (DspMeta21, 0x95000000, 0xff00000f, INSN_DSP), + + { "AND", DspMeta21, + 0x22000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "ANDS", DspMeta21, + 0x28000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "ANDS", DspMeta21, + 0x2a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "MAX", DspMeta21, + 0x70000124, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "MIN", DspMeta21, + 0x70000120, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "NMIN", DspMeta21, + 0x7000012c, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "OR", DspMeta21, + 0x30000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "OR", DspMeta21, + 0x32000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "ORS", DspMeta21, + 0x38000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "ORS", DspMeta21, + 0x3a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "XOR", DspMeta21, + 0x40000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "XOR", DspMeta21, + 0x42000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "XORS", DspMeta21, + 0x48000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 }, + { "XORS", DspMeta21, + 0x4a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "ADDB8", DspMeta21, + 0x20000108, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "ADDT8", DspMeta21, + 0x2000010c, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "ADDSB8", DspMeta21, + 0x28000108, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "ADDST8", DspMeta21, + 0x2800010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "MULB8", DspMeta21, + 0x40000108, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "MULT8", DspMeta21, + 0x4000010c, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "MULSB8", DspMeta21, + 0x48000108, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "MULST8", DspMeta21, + 0x4800010c, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "SUBB8", DspMeta21, + 0x30000108, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "SUBT8", DspMeta21, + 0x3000010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "SUBSB8", DspMeta21, + 0x38000108, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "SUBST8", DspMeta21, + 0x3800010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 }, + { "MUL", DspMeta21, + 0x60000100, 0xfe000100, INSN_DSP, ENC_DALU, + DSP_ARGS_1|DSP_ARGS_DACC }, + { "MUL", DspMeta21, + 0x62000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM }, + { "ABS", DspMeta21, + 0x70000128, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "FFB", DspMeta21, + 0x70000104, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "NORM", DspMeta21, + 0x70000108, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "CMP", DspMeta21, + 0x70000000, 0xfe0000ec, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, + { "CMP", DspMeta21, + 0x72000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, + { "TST", DspMeta21, + 0x78000100, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, + { "TST", DspMeta21, + 0x7a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM }, + { "MOV", DspMeta21, + 0x00000104, 0xfe078146, INSN_DSP, ENC_DALU, + DSP_ARGS_2|DSP_ARGS_DSP_SRC1|DSP_ARGS_DSP_SRC2|DSP_ARGS_IMM }, + { "MOVS", DspMeta21, + 0x08000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, + { "MOV", DspMeta21, + 0x91000000, 0xff000000, INSN_DSP, ENC_DALU, + DSP_ARGS_2|DSP_ARGS_DSP_SRC1|DSP_ARGS_IMM }, + { "MOV", DspMeta21, + 0x92000000, 0xff000000, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, + { "NEG", DspMeta21, + 0x10000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, + { "NEGS", DspMeta21, + 0x18000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 }, + { "XSDB", DspMeta21, + 0xaa000100, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "XSD", DspMeta21, + 0xaa000100, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "XSDW", DspMeta21, + 0xaa000102, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "XSDSB", DspMeta21, + 0xaa000108, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "XSDS", DspMeta21, + 0xaa000108, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "XSDSW", DspMeta21, + 0xaa00010a, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "LSL", DspMeta21, + 0x50000100, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "LSR", DspMeta21, + 0x50000140, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "ASL", DspMeta21, + 0x50000180, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "ASR", DspMeta21, + 0x500001c0, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "LSL", DspMeta21, + 0x54000120, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, + { "LSR", DspMeta21, + 0x54000160, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, + { "ASL", DspMeta21, + 0x540001a0, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, + { "ASR", DspMeta21, + 0x540001e0, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM }, + COND_INSN ("LSL", "", 1, DspMeta21, + 0x54000100, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + COND_INSN ("LSR", "", 1, DspMeta21, + 0x54000140, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + COND_INSN ("ASL", "", 1, DspMeta21, + 0x54000180, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + COND_INSN ("ASR", "", 1, DspMeta21, + 0x540001c0, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + { "LSLS", DspMeta21, + 0x58000100, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "LSRS", DspMeta21, + 0x58000140, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "ASLS", DspMeta21, + 0x58000180, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + { "ASRS", DspMeta21, + 0x580001c0, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 }, + COND_INSN ("LSLS", "", 1, DspMeta21, + 0x5c000100, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + COND_INSN ("LSRS", "", 1, DspMeta21, + 0x5c000140, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + COND_INSN ("ASLS", "", 1, DspMeta21, + 0x5c000180, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + COND_INSN ("ASRS", "", 1, DspMeta21, + 0x5c0001c0, 0xfc0001fe, INSN_DSP, ENC_DALU, 0), + { "LSLS", DspMeta21, + 0x5c000120, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, + { "LSRS", DspMeta21, + 0x5c000160, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, + { "ASLS", DspMeta21, + 0x5c0001a0, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, + { "ASRS", DspMeta21, + 0x5c0001e0, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 }, + { "RTDW", DspMeta21, + 0xaa000106, 0xff00010e, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + { "RTDSW", DspMeta21, + 0xaa00010e, 0xff00010e, INSN_DSP, ENC_DALU, DSP_ARGS_2 }, + }; + +#define UNIT_MASK 0xf +#define SHORT_UNIT_MASK 0x3 +#define EXT_BASE_REG_MASK 0x1 +#define REG_MASK 0x1f +#define CC_MASK 0xf +#define RMASK_MASK 0x7f +#define GET_SET_IMM_MASK 0x3f +#define GET_SET_IMM_BITS 6 +#define GET_SET_EXT_IMM_MASK 0xfff +#define GET_SET_EXT_IMM_BITS 12 +#define DGET_SET_IMM_MASK 0x3 +#define DGET_SET_IMM_BITS 2 +#define MGET_MSET_MAX_REGS 8 +#define MMOV_MAX_REGS 8 +#define IMM16_MASK 0xffff +#define IMM16_BITS 16 +#define IMM19_MASK 0x7ffff +#define IMM19_BITS 19 +#define IMM8_MASK 0xff +#define IMM8_BITS 8 +#define IMM24_MASK 0xffffff +#define IMM24_BITS 24 +#define IMM5_MASK 0x1f +#define IMM5_BITS 5 +#define IMM6_MASK 0x3f +#define IMM6_BITS 6 +#define IMM15_MASK 0x7fff +#define IMM15_BITS 15 +#define IMM4_MASK 0x1f +#define IMM4_BITS 4 +#define CALLR_REG_MASK 0x7 +#define CPC_REG_MASK 0xf +#define O2R_REG_MASK 0x7 +#define ACF_PART_MASK 0x3 +#define DSP_REG_MASK 0xf +#define DSP_PART_MASK 0x17 +#define TEMPLATE_NUM_REGS 4 +#define TEMPLATE_REGS_MASK 0xf + +#define IS_TEMPLATE_DEF(insn) (insn->dsp_daoppame_flags & DSP_DAOPPAME_TEMP) + +unsigned int metag_get_set_size_bytes (unsigned int opcode); +unsigned int metag_get_set_ext_size_bytes (unsigned int opcode); +unsigned int metag_cond_set_size_bytes (unsigned int opcode); diff --git a/include/opcode/mips.h b/include/opcode/mips.h new file mode 100644 index 0000000..cb16d2a --- /dev/null +++ b/include/opcode/mips.h @@ -0,0 +1,2151 @@ +/* mips.h. Mips opcode list for GDB, the GNU debugger. + Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2008, 2009, 2010, 2013 + Free Software Foundation, Inc. + Contributed by Ralph Campbell and OSF + Commented and modified by Ian Lance Taylor, Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _MIPS_H_ +#define _MIPS_H_ + +#include "bfd.h" + +/* These are bit masks and shift counts to use to access the various + fields of an instruction. To retrieve the X field of an + instruction, use the expression + (i >> OP_SH_X) & OP_MASK_X + To set the same field (to j), use + i = (i &~ (OP_MASK_X << OP_SH_X)) | (j << OP_SH_X) + + Make sure you use fields that are appropriate for the instruction, + of course. + + The 'i' format uses OP, RS, RT and IMMEDIATE. + + The 'j' format uses OP and TARGET. + + The 'r' format uses OP, RS, RT, RD, SHAMT and FUNCT. + + The 'b' format uses OP, RS, RT and DELTA. + + The floating point 'i' format uses OP, RS, RT and IMMEDIATE. + + The floating point 'r' format uses OP, FMT, FT, FS, FD and FUNCT. + + A breakpoint instruction uses OP, CODE and SPEC (10 bits of the + breakpoint instruction are not defined; Kane says the breakpoint + code field in BREAK is 20 bits; yet MIPS assemblers and debuggers + only use ten bits). An optional two-operand form of break/sdbbp + allows the lower ten bits to be set too, and MIPS32 and later + architectures allow 20 bits to be set with a signal operand + (using CODE20). + + The syscall instruction uses CODE20. + + The general coprocessor instructions use COPZ. */ + +#define OP_MASK_OP 0x3f +#define OP_SH_OP 26 +#define OP_MASK_RS 0x1f +#define OP_SH_RS 21 +#define OP_MASK_FR 0x1f +#define OP_SH_FR 21 +#define OP_MASK_FMT 0x1f +#define OP_SH_FMT 21 +#define OP_MASK_BCC 0x7 +#define OP_SH_BCC 18 +#define OP_MASK_CODE 0x3ff +#define OP_SH_CODE 16 +#define OP_MASK_CODE2 0x3ff +#define OP_SH_CODE2 6 +#define OP_MASK_RT 0x1f +#define OP_SH_RT 16 +#define OP_MASK_FT 0x1f +#define OP_SH_FT 16 +#define OP_MASK_CACHE 0x1f +#define OP_SH_CACHE 16 +#define OP_MASK_RD 0x1f +#define OP_SH_RD 11 +#define OP_MASK_FS 0x1f +#define OP_SH_FS 11 +#define OP_MASK_PREFX 0x1f +#define OP_SH_PREFX 11 +#define OP_MASK_CCC 0x7 +#define OP_SH_CCC 8 +#define OP_MASK_CODE20 0xfffff /* 20 bit syscall/breakpoint code. */ +#define OP_SH_CODE20 6 +#define OP_MASK_SHAMT 0x1f +#define OP_SH_SHAMT 6 +#define OP_MASK_EXTLSB OP_MASK_SHAMT +#define OP_SH_EXTLSB OP_SH_SHAMT +#define OP_MASK_STYPE OP_MASK_SHAMT +#define OP_SH_STYPE OP_SH_SHAMT +#define OP_MASK_FD 0x1f +#define OP_SH_FD 6 +#define OP_MASK_TARGET 0x3ffffff +#define OP_SH_TARGET 0 +#define OP_MASK_COPZ 0x1ffffff +#define OP_SH_COPZ 0 +#define OP_MASK_IMMEDIATE 0xffff +#define OP_SH_IMMEDIATE 0 +#define OP_MASK_DELTA 0xffff +#define OP_SH_DELTA 0 +#define OP_MASK_FUNCT 0x3f +#define OP_SH_FUNCT 0 +#define OP_MASK_SPEC 0x3f +#define OP_SH_SPEC 0 +#define OP_SH_LOCC 8 /* FP condition code. */ +#define OP_SH_HICC 18 /* FP condition code. */ +#define OP_MASK_CC 0x7 +#define OP_SH_COP1NORM 25 /* Normal COP1 encoding. */ +#define OP_MASK_COP1NORM 0x1 /* a single bit. */ +#define OP_SH_COP1SPEC 21 /* COP1 encodings. */ +#define OP_MASK_COP1SPEC 0xf +#define OP_MASK_COP1SCLR 0x4 +#define OP_MASK_COP1CMP 0x3 +#define OP_SH_COP1CMP 4 +#define OP_SH_FORMAT 21 /* FP short format field. */ +#define OP_MASK_FORMAT 0x7 +#define OP_SH_TRUE 16 +#define OP_MASK_TRUE 0x1 +#define OP_SH_GE 17 +#define OP_MASK_GE 0x01 +#define OP_SH_UNSIGNED 16 +#define OP_MASK_UNSIGNED 0x1 +#define OP_SH_HINT 16 +#define OP_MASK_HINT 0x1f +#define OP_SH_MMI 0 /* Multimedia (parallel) op. */ +#define OP_MASK_MMI 0x3f +#define OP_SH_MMISUB 6 +#define OP_MASK_MMISUB 0x1f +#define OP_MASK_PERFREG 0x1f /* Performance monitoring. */ +#define OP_SH_PERFREG 1 +#define OP_SH_SEL 0 /* Coprocessor select field. */ +#define OP_MASK_SEL 0x7 /* The sel field of mfcZ and mtcZ. */ +#define OP_SH_CODE19 6 /* 19 bit wait code. */ +#define OP_MASK_CODE19 0x7ffff +#define OP_SH_ALN 21 +#define OP_MASK_ALN 0x7 +#define OP_SH_VSEL 21 +#define OP_MASK_VSEL 0x1f +#define OP_MASK_VECBYTE 0x7 /* Selector field is really 4 bits, + but 0x8-0xf don't select bytes. */ +#define OP_SH_VECBYTE 22 +#define OP_MASK_VECALIGN 0x7 /* Vector byte-align (alni.ob) op. */ +#define OP_SH_VECALIGN 21 +#define OP_MASK_INSMSB 0x1f /* "ins" MSB. */ +#define OP_SH_INSMSB 11 +#define OP_MASK_EXTMSBD 0x1f /* "ext" MSBD. */ +#define OP_SH_EXTMSBD 11 + +/* MIPS DSP ASE */ +#define OP_SH_DSPACC 11 +#define OP_MASK_DSPACC 0x3 +#define OP_SH_DSPACC_S 21 +#define OP_MASK_DSPACC_S 0x3 +#define OP_SH_DSPSFT 20 +#define OP_MASK_DSPSFT 0x3f +#define OP_SH_DSPSFT_7 19 +#define OP_MASK_DSPSFT_7 0x7f +#define OP_SH_SA3 21 +#define OP_MASK_SA3 0x7 +#define OP_SH_SA4 21 +#define OP_MASK_SA4 0xf +#define OP_SH_IMM8 16 +#define OP_MASK_IMM8 0xff +#define OP_SH_IMM10 16 +#define OP_MASK_IMM10 0x3ff +#define OP_SH_WRDSP 11 +#define OP_MASK_WRDSP 0x3f +#define OP_SH_RDDSP 16 +#define OP_MASK_RDDSP 0x3f +#define OP_SH_BP 11 +#define OP_MASK_BP 0x3 + +/* MIPS MT ASE */ +#define OP_SH_MT_U 5 +#define OP_MASK_MT_U 0x1 +#define OP_SH_MT_H 4 +#define OP_MASK_MT_H 0x1 +#define OP_SH_MTACC_T 18 +#define OP_MASK_MTACC_T 0x3 +#define OP_SH_MTACC_D 13 +#define OP_MASK_MTACC_D 0x3 + +/* MIPS MCU ASE */ +#define OP_MASK_3BITPOS 0x7 +#define OP_SH_3BITPOS 12 +#define OP_MASK_OFFSET12 0xfff +#define OP_SH_OFFSET12 0 + +#define OP_OP_COP0 0x10 +#define OP_OP_COP1 0x11 +#define OP_OP_COP2 0x12 +#define OP_OP_COP3 0x13 +#define OP_OP_LWC1 0x31 +#define OP_OP_LWC2 0x32 +#define OP_OP_LWC3 0x33 /* a.k.a. pref */ +#define OP_OP_LDC1 0x35 +#define OP_OP_LDC2 0x36 +#define OP_OP_LDC3 0x37 /* a.k.a. ld */ +#define OP_OP_SWC1 0x39 +#define OP_OP_SWC2 0x3a +#define OP_OP_SWC3 0x3b +#define OP_OP_SDC1 0x3d +#define OP_OP_SDC2 0x3e +#define OP_OP_SDC3 0x3f /* a.k.a. sd */ + +/* MIPS VIRT ASE */ +#define OP_MASK_CODE10 0x3ff +#define OP_SH_CODE10 11 + +/* Values in the 'VSEL' field. */ +#define MDMX_FMTSEL_IMM_QH 0x1d +#define MDMX_FMTSEL_IMM_OB 0x1e +#define MDMX_FMTSEL_VEC_QH 0x15 +#define MDMX_FMTSEL_VEC_OB 0x16 + +/* UDI */ +#define OP_SH_UDI1 6 +#define OP_MASK_UDI1 0x1f +#define OP_SH_UDI2 6 +#define OP_MASK_UDI2 0x3ff +#define OP_SH_UDI3 6 +#define OP_MASK_UDI3 0x7fff +#define OP_SH_UDI4 6 +#define OP_MASK_UDI4 0xfffff + +/* Octeon */ +#define OP_SH_BBITIND 16 +#define OP_MASK_BBITIND 0x1f +#define OP_SH_CINSPOS 6 +#define OP_MASK_CINSPOS 0x1f +#define OP_SH_CINSLM1 11 +#define OP_MASK_CINSLM1 0x1f +#define OP_SH_SEQI 6 +#define OP_MASK_SEQI 0x3ff + +/* Loongson */ +#define OP_SH_OFFSET_A 6 +#define OP_MASK_OFFSET_A 0xff +#define OP_SH_OFFSET_B 3 +#define OP_MASK_OFFSET_B 0xff +#define OP_SH_OFFSET_C 6 +#define OP_MASK_OFFSET_C 0x1ff +#define OP_SH_RZ 0 +#define OP_MASK_RZ 0x1f +#define OP_SH_FZ 0 +#define OP_MASK_FZ 0x1f + +/* Every MICROMIPSOP_X definition requires a corresponding OP_X + definition, and vice versa. This simplifies various parts + of the operand handling in GAS. The fields below only exist + in the microMIPS encoding, so define each one to have an empty + range. */ +#define OP_MASK_TRAP 0 +#define OP_SH_TRAP 0 +#define OP_MASK_OFFSET10 0 +#define OP_SH_OFFSET10 0 +#define OP_MASK_RS3 0 +#define OP_SH_RS3 0 +#define OP_MASK_MB 0 +#define OP_SH_MB 0 +#define OP_MASK_MC 0 +#define OP_SH_MC 0 +#define OP_MASK_MD 0 +#define OP_SH_MD 0 +#define OP_MASK_ME 0 +#define OP_SH_ME 0 +#define OP_MASK_MF 0 +#define OP_SH_MF 0 +#define OP_MASK_MG 0 +#define OP_SH_MG 0 +#define OP_MASK_MH 0 +#define OP_SH_MH 0 +#define OP_MASK_MJ 0 +#define OP_SH_MJ 0 +#define OP_MASK_ML 0 +#define OP_SH_ML 0 +#define OP_MASK_MM 0 +#define OP_SH_MM 0 +#define OP_MASK_MN 0 +#define OP_SH_MN 0 +#define OP_MASK_MP 0 +#define OP_SH_MP 0 +#define OP_MASK_MQ 0 +#define OP_SH_MQ 0 +#define OP_MASK_IMMA 0 +#define OP_SH_IMMA 0 +#define OP_MASK_IMMB 0 +#define OP_SH_IMMB 0 +#define OP_MASK_IMMC 0 +#define OP_SH_IMMC 0 +#define OP_MASK_IMMF 0 +#define OP_SH_IMMF 0 +#define OP_MASK_IMMG 0 +#define OP_SH_IMMG 0 +#define OP_MASK_IMMH 0 +#define OP_SH_IMMH 0 +#define OP_MASK_IMMI 0 +#define OP_SH_IMMI 0 +#define OP_MASK_IMMJ 0 +#define OP_SH_IMMJ 0 +#define OP_MASK_IMML 0 +#define OP_SH_IMML 0 +#define OP_MASK_IMMM 0 +#define OP_SH_IMMM 0 +#define OP_MASK_IMMN 0 +#define OP_SH_IMMN 0 +#define OP_MASK_IMMO 0 +#define OP_SH_IMMO 0 +#define OP_MASK_IMMP 0 +#define OP_SH_IMMP 0 +#define OP_MASK_IMMQ 0 +#define OP_SH_IMMQ 0 +#define OP_MASK_IMMU 0 +#define OP_SH_IMMU 0 +#define OP_MASK_IMMW 0 +#define OP_SH_IMMW 0 +#define OP_MASK_IMMX 0 +#define OP_SH_IMMX 0 +#define OP_MASK_IMMY 0 +#define OP_SH_IMMY 0 + +/* Enhanced VA Scheme */ +#define OP_SH_EVAOFFSET 7 +#define OP_MASK_EVAOFFSET 0x1ff + +/* Enumerates the various types of MIPS operand. */ +enum mips_operand_type { + /* Described by mips_int_operand. */ + OP_INT, + + /* Described by mips_mapped_int_operand. */ + OP_MAPPED_INT, + + /* Described by mips_msb_operand. */ + OP_MSB, + + /* Described by mips_reg_operand. */ + OP_REG, + + /* Like OP_REG, but can be omitted if the register is the same as the + previous operand. */ + OP_OPTIONAL_REG, + + /* Described by mips_reg_pair_operand. */ + OP_REG_PAIR, + + /* Described by mips_pcrel_operand. */ + OP_PCREL, + + /* A performance register. The field is 5 bits in size, but the supported + values are much more restricted. */ + OP_PERF_REG, + + /* The final operand in a microMIPS ADDIUSP instruction. It mostly acts + as a normal 9-bit signed offset that is multiplied by four, but there + are four special cases: + + -2 * 4 => -258 * 4 + -1 * 4 => -257 * 4 + 0 * 4 => 256 * 4 + 1 * 4 => 257 * 4. */ + OP_ADDIUSP_INT, + + /* The target of a (D)CLO or (D)CLZ instruction. The operand spans two + 5-bit register fields, both of which must be set to the destination + register. */ + OP_CLO_CLZ_DEST, + + /* A register list for a microMIPS LWM or SWM instruction. The operand + size determines whether the 16-bit or 32-bit encoding is required. */ + OP_LWM_SWM_LIST, + + /* The register list for an emulated MIPS16 ENTRY or EXIT instruction. */ + OP_ENTRY_EXIT_LIST, + + /* The register list and frame size for a MIPS16 SAVE or RESTORE + instruction. */ + OP_SAVE_RESTORE_LIST, + + /* A 10-bit field VVVVVNNNNN used for octobyte and quadhalf instructions: + + V Meaning + ----- ------- + 0EEE0 8 copies of $vN[E], OB format + 0EE01 4 copies of $vN[E], QH format + 10110 all 8 elements of $vN, OB format + 10101 all 4 elements of $vN, QH format + 11110 8 copies of immediate N, OB format + 11101 4 copies of immediate N, QH format. */ + OP_MDMX_IMM_REG, + + /* A register operand that must match the destination register. */ + OP_REPEAT_DEST_REG, + + /* A register operand that must match the previous register. */ + OP_REPEAT_PREV_REG, + + /* $pc, which has no encoding in the architectural instruction. */ + OP_PC, + + /* A 4-bit XYZW channel mask or 2-bit XYZW index; the size determines + which. */ + OP_VU0_SUFFIX, + + /* Like OP_VU0_SUFFIX, but used when the operand's value has already + been set. Any suffix used here must match the previous value. */ + OP_VU0_MATCH_SUFFIX, + + /* An index selected by an integer, e.g. [1]. */ + OP_IMM_INDEX, + + /* An index selected by a register, e.g. [$2]. */ + OP_REG_INDEX +}; + +/* Enumerates the types of MIPS register. */ +enum mips_reg_operand_type { + /* General registers $0-$31. Software names like $at can also be used. */ + OP_REG_GP, + + /* Floating-point registers $f0-$f31. */ + OP_REG_FP, + + /* Coprocessor condition code registers $cc0-$cc7. FPU condition codes + can also be written $fcc0-$fcc7. */ + OP_REG_CCC, + + /* FPRs used in a vector capacity. They can be written $f0-$f31 + or $v0-$v31, although the latter form is not used for the VR5400 + vector instructions. */ + OP_REG_VEC, + + /* DSP accumulator registers $ac0-$ac3. */ + OP_REG_ACC, + + /* Coprocessor registers $0-$31. Mnemonic names like c0_cause can + also be used in some contexts. */ + OP_REG_COPRO, + + /* Hardware registers $0-$31. Mnemonic names like hwr_cpunum can + also be used in some contexts. */ + OP_REG_HW, + + /* Floating-point registers $vf0-$vf31. */ + OP_REG_VF, + + /* Integer registers $vi0-$vi31. */ + OP_REG_VI, + + /* R5900 VU0 registers $I, $Q, $R and $ACC. */ + OP_REG_R5900_I, + OP_REG_R5900_Q, + OP_REG_R5900_R, + OP_REG_R5900_ACC, + + /* MSA registers $w0-$w31. */ + OP_REG_MSA, + + /* MSA control registers $0-$31. */ + OP_REG_MSA_CTRL +}; + +/* Base class for all operands. */ +struct mips_operand +{ + /* The type of the operand. */ + enum mips_operand_type type; + + /* The operand occupies SIZE bits of the instruction, starting at LSB. */ + unsigned short size; + unsigned short lsb; +}; + +/* Describes an integer operand with a regular encoding pattern. */ +struct mips_int_operand +{ + struct mips_operand root; + + /* The low ROOT.SIZE bits of MAX_VAL encodes (MAX_VAL + BIAS) << SHIFT. + The cyclically previous field value encodes 1 << SHIFT less than that, + and so on. E.g. + + - for { { T, 4, L }, 14, 0, 0 }, field values 0...14 encode themselves, + but 15 encodes -1. + + - { { T, 8, L }, 127, 0, 2 } is a normal signed 8-bit operand that is + shifted left two places. + + - { { T, 3, L }, 8, 0, 0 } is a normal unsigned 3-bit operand except + that 0 encodes 8. + + - { { ... }, 0, 1, 3 } means that N encodes (N + 1) << 3. */ + unsigned int max_val; + int bias; + unsigned int shift; + + /* True if the operand should be printed as hex rather than decimal. */ + bfd_boolean print_hex; +}; + +/* Uses a lookup table to describe a small integer operand. */ +struct mips_mapped_int_operand +{ + struct mips_operand root; + + /* Maps each encoding value to the integer that it represents. */ + const int *int_map; + + /* True if the operand should be printed as hex rather than decimal. */ + bfd_boolean print_hex; +}; + +/* An operand that encodes the most significant bit position of a bitfield. + Given a bitfield that spans bits [MSB, LSB], some operands of this type + encode MSB directly while others encode MSB - LSB. Each operand of this + type is preceded by an integer operand that specifies LSB. + + The assembly form varies between instructions. For some instructions, + such as EXT, the operand is written as the bitfield size. For others, + such as EXTS, it is written in raw MSB - LSB form. */ +struct mips_msb_operand +{ + struct mips_operand root; + + /* The assembly-level operand encoded by a field value of 0. */ + int bias; + + /* True if the operand encodes MSB directly, false if it encodes + MSB - LSB. */ + bfd_boolean add_lsb; + + /* The maximum value of MSB + 1. */ + unsigned int opsize; +}; + +/* Describes a single register operand. */ +struct mips_reg_operand +{ + struct mips_operand root; + + /* The type of register. */ + enum mips_reg_operand_type reg_type; + + /* If nonnull, REG_MAP[N] gives the register associated with encoding N, + otherwise the encoding is the same as the register number. */ + const unsigned char *reg_map; +}; + +/* Describes an operand that encodes a pair of registers. */ +struct mips_reg_pair_operand +{ + struct mips_operand root; + + /* The type of register. */ + enum mips_reg_operand_type reg_type; + + /* Encoding N represents REG1_MAP[N], REG2_MAP[N]. */ + unsigned char *reg1_map; + unsigned char *reg2_map; +}; + +/* Describes an operand that is calculated relative to a base PC. + The base PC is usually the address of the following instruction, + but the rules for MIPS16 instructions like ADDIUPC are more complicated. */ +struct mips_pcrel_operand +{ + /* Encodes the offset. */ + struct mips_int_operand root; + + /* The low ALIGN_LOG2 bits of the base PC are cleared to give PC', + which is then added to the offset encoded by ROOT. */ + unsigned int align_log2 : 8; + + /* If INCLUDE_ISA_BIT, the ISA bit of the original base PC is then + reinstated. This is true for jumps and branches and false for + PC-relative data instructions. */ + unsigned int include_isa_bit : 1; + + /* If FLIP_ISA_BIT, the ISA bit of the result is inverted. + This is true for JALX and false otherwise. */ + unsigned int flip_isa_bit : 1; +}; + +/* Return true if the assembly syntax allows OPERAND to be omitted. */ + +static inline bfd_boolean +mips_optional_operand_p (const struct mips_operand *operand) +{ + return (operand->type == OP_OPTIONAL_REG + || operand->type == OP_REPEAT_PREV_REG); +} + +/* Return a version of INSN in which the field specified by OPERAND + has value UVAL. */ + +static inline unsigned int +mips_insert_operand (const struct mips_operand *operand, unsigned int insn, + unsigned int uval) +{ + unsigned int mask; + + mask = (1 << operand->size) - 1; + insn &= ~(mask << operand->lsb); + insn |= (uval & mask) << operand->lsb; + return insn; +} + +/* Extract OPERAND from instruction INSN. */ + +static inline unsigned int +mips_extract_operand (const struct mips_operand *operand, unsigned int insn) +{ + return (insn >> operand->lsb) & ((1 << operand->size) - 1); +} + +/* UVAL is the value encoded by OPERAND. Return it in signed form. */ + +static inline int +mips_signed_operand (const struct mips_operand *operand, unsigned int uval) +{ + unsigned int sign_bit, mask; + + mask = (1 << operand->size) - 1; + sign_bit = 1 << (operand->size - 1); + return ((uval + sign_bit) & mask) - sign_bit; +} + +/* Return the integer that OPERAND encodes as UVAL. */ + +static inline int +mips_decode_int_operand (const struct mips_int_operand *operand, + unsigned int uval) +{ + uval |= (operand->max_val - uval) & -(1 << operand->root.size); + uval += operand->bias; + uval <<= operand->shift; + return uval; +} + +/* Return the maximum value that can be encoded by OPERAND. */ + +static inline int +mips_int_operand_max (const struct mips_int_operand *operand) +{ + return (operand->max_val + operand->bias) << operand->shift; +} + +/* Return the minimum value that can be encoded by OPERAND. */ + +static inline int +mips_int_operand_min (const struct mips_int_operand *operand) +{ + unsigned int mask; + + mask = (1 << operand->root.size) - 1; + return mips_int_operand_max (operand) - (mask << operand->shift); +} + +/* Return the register that OPERAND encodes as UVAL. */ + +static inline int +mips_decode_reg_operand (const struct mips_reg_operand *operand, + unsigned int uval) +{ + if (operand->reg_map) + uval = operand->reg_map[uval]; + return uval; +} + +/* PC-relative operand OPERAND has value UVAL and is relative to BASE_PC. + Return the address that it encodes. */ + +static inline bfd_vma +mips_decode_pcrel_operand (const struct mips_pcrel_operand *operand, + bfd_vma base_pc, unsigned int uval) +{ + bfd_vma addr; + + addr = base_pc & -(1 << operand->align_log2); + addr += mips_decode_int_operand (&operand->root, uval); + if (operand->include_isa_bit) + addr |= base_pc & 1; + if (operand->flip_isa_bit) + addr ^= 1; + return addr; +} + +/* This structure holds information for a particular instruction. */ + +struct mips_opcode +{ + /* The name of the instruction. */ + const char *name; + /* A string describing the arguments for this instruction. */ + const char *args; + /* The basic opcode for the instruction. When assembling, this + opcode is modified by the arguments to produce the actual opcode + that is used. If pinfo is INSN_MACRO, then this is 0. */ + unsigned long match; + /* If pinfo is not INSN_MACRO, then this is a bit mask for the + relevant portions of the opcode when disassembling. If the + actual opcode anded with the match field equals the opcode field, + then we have found the correct instruction. If pinfo is + INSN_MACRO, then this field is the macro identifier. */ + unsigned long mask; + /* For a macro, this is INSN_MACRO. Otherwise, it is a collection + of bits describing the instruction, notably any relevant hazard + information. */ + unsigned long pinfo; + /* A collection of additional bits describing the instruction. */ + unsigned long pinfo2; + /* A collection of bits describing the instruction sets of which this + instruction or macro is a member. */ + unsigned long membership; + /* A collection of bits describing the ASE of which this instruction + or macro is a member. */ + unsigned long ase; + /* A collection of bits describing the instruction sets of which this + instruction or macro is not a member. */ + unsigned long exclusions; +}; + +/* These are the characters which may appear in the args field of an + instruction. They appear in the order in which the fields appear + when the instruction is used. Commas and parentheses in the args + string are ignored when assembling, and written into the output + when disassembling. + + Each of these characters corresponds to a mask field defined above. + + "1" 5 bit sync type (OP_*_STYPE) + "<" 5 bit shift amount (OP_*_SHAMT) + ">" shift amount between 32 and 63, stored after subtracting 32 (OP_*_SHAMT) + "a" 26 bit target address (OP_*_TARGET) + "+i" likewise, but flips bit 0 + "b" 5 bit base register (OP_*_RS) + "c" 10 bit breakpoint code (OP_*_CODE) + "d" 5 bit destination register specifier (OP_*_RD) + "h" 5 bit prefx hint (OP_*_PREFX) + "i" 16 bit unsigned immediate (OP_*_IMMEDIATE) + "j" 16 bit signed immediate (OP_*_DELTA) + "k" 5 bit cache opcode in target register position (OP_*_CACHE) + "o" 16 bit signed offset (OP_*_DELTA) + "p" 16 bit PC relative branch target address (OP_*_DELTA) + "q" 10 bit extra breakpoint code (OP_*_CODE2) + "r" 5 bit same register used as both source and target (OP_*_RS) + "s" 5 bit source register specifier (OP_*_RS) + "t" 5 bit target register (OP_*_RT) + "u" 16 bit upper 16 bits of address (OP_*_IMMEDIATE) + "v" 5 bit same register used as both source and destination (OP_*_RS) + "w" 5 bit same register used as both target and destination (OP_*_RT) + "U" 5 bit same destination register in both OP_*_RD and OP_*_RT + (used by clo and clz) + "C" 25 bit coprocessor function code (OP_*_COPZ) + "B" 20 bit syscall/breakpoint function code (OP_*_CODE20) + "J" 19 bit wait function code (OP_*_CODE19) + "x" accept and ignore register name + "z" must be zero register + "K" 5 bit Hardware Register (rdhwr instruction) (OP_*_RD) + "+A" 5 bit ins/ext/dins/dext/dinsm/dextm position, which becomes + LSB (OP_*_SHAMT; OP_*_EXTLSB or OP_*_STYPE may be used for + microMIPS compatibility). + Enforces: 0 <= pos < 32. + "+B" 5 bit ins/dins size, which becomes MSB (OP_*_INSMSB). + Requires that "+A" or "+E" occur first to set position. + Enforces: 0 < (pos+size) <= 32. + "+C" 5 bit ext/dext size, which becomes MSBD (OP_*_EXTMSBD). + Requires that "+A" or "+E" occur first to set position. + Enforces: 0 < (pos+size) <= 32. + (Also used by "dext" w/ different limits, but limits for + that are checked by the M_DEXT macro.) + "+E" 5 bit dinsu/dextu position, which becomes LSB-32 (OP_*_SHAMT). + Enforces: 32 <= pos < 64. + "+F" 5 bit "dinsm/dinsu" size, which becomes MSB-32 (OP_*_INSMSB). + Requires that "+A" or "+E" occur first to set position. + Enforces: 32 < (pos+size) <= 64. + "+G" 5 bit "dextm" size, which becomes MSBD-32 (OP_*_EXTMSBD). + Requires that "+A" or "+E" occur first to set position. + Enforces: 32 < (pos+size) <= 64. + "+H" 5 bit "dextu" size, which becomes MSBD (OP_*_EXTMSBD). + Requires that "+A" or "+E" occur first to set position. + Enforces: 32 < (pos+size) <= 64. + + Floating point instructions: + "D" 5 bit destination register (OP_*_FD) + "M" 3 bit compare condition code (OP_*_CCC) (only used for mips4 and up) + "N" 3 bit branch condition code (OP_*_BCC) (only used for mips4 and up) + "S" 5 bit fs source 1 register (OP_*_FS) + "T" 5 bit ft source 2 register (OP_*_FT) + "R" 5 bit fr source 3 register (OP_*_FR) + "V" 5 bit same register used as floating source and destination (OP_*_FS) + "W" 5 bit same register used as floating target and destination (OP_*_FT) + + Coprocessor instructions: + "E" 5 bit target register (OP_*_RT) + "G" 5 bit destination register (OP_*_RD) + "H" 3 bit sel field for (d)mtc* and (d)mfc* (OP_*_SEL) + "P" 5 bit performance-monitor register (OP_*_PERFREG) + "e" 5 bit vector register byte specifier (OP_*_VECBYTE) + "%" 3 bit immediate vr5400 vector alignment operand (OP_*_VECALIGN) + + Macro instructions: + "A" General 32 bit expression + "I" 32 bit immediate (value placed in imm_expr). + "F" 64 bit floating point constant in .rdata + "L" 64 bit floating point constant in .lit8 + "f" 32 bit floating point constant + "l" 32 bit floating point constant in .lit4 + + MDMX and VR5400 instruction operands (note that while these use the + FP register fields, the MDMX instructions accept both $fN and $vN names + for the registers): + "O" alignment offset (OP_*_ALN) + "Q" vector/scalar/immediate source (OP_*_VSEL and OP_*_FT) + "X" destination register (OP_*_FD) + "Y" source register (OP_*_FS) + "Z" source register (OP_*_FT) + + R5900 VU0 Macromode instructions: + "+5" 5 bit floating point register (FD) + "+6" 5 bit floating point register (FS) + "+7" 5 bit floating point register (FT) + "+8" 5 bit integer register (FD) + "+9" 5 bit integer register (FS) + "+0" 5 bit integer register (FT) + "+K" match an existing 4-bit channel mask starting at bit 21 + "+L" 2-bit channel index starting at bit 21 + "+M" 2-bit channel index starting at bit 23 + "+N" match an existing 2-bit channel index starting at bit 0 + "+f" 15 bit immediate for VCALLMS + "+g" 5 bit signed immediate for VIADDI + "+m" $ACC register (syntax only) + "+q" $Q register (syntax only) + "+r" $R register (syntax only) + "+y" $I register (syntax only) + "#+" "++" decorator in ($reg++) sequence + "#-" "--" decorator in (--$reg) sequence + + DSP ASE usage: + "2" 2 bit unsigned immediate for byte align (OP_*_BP) + "3" 3 bit unsigned immediate (OP_*_SA3) + "4" 4 bit unsigned immediate (OP_*_SA4) + "5" 8 bit unsigned immediate (OP_*_IMM8) + "6" 5 bit unsigned immediate (OP_*_RS) + "7" 2 bit dsp accumulator register (OP_*_DSPACC) + "8" 6 bit unsigned immediate (OP_*_WRDSP) + "9" 2 bit dsp accumulator register (OP_*_DSPACC_S) + "0" 6 bit signed immediate (OP_*_DSPSFT) + ":" 7 bit signed immediate (OP_*_DSPSFT_7) + "'" 6 bit unsigned immediate (OP_*_RDDSP) + "@" 10 bit signed immediate (OP_*_IMM10) + + MT ASE usage: + "!" 1 bit usermode flag (OP_*_MT_U) + "$" 1 bit load high flag (OP_*_MT_H) + "*" 2 bit dsp/smartmips accumulator register (OP_*_MTACC_T) + "&" 2 bit dsp/smartmips accumulator register (OP_*_MTACC_D) + "g" 5 bit coprocessor 1 and 2 destination register (OP_*_RD) + "+t" 5 bit coprocessor 0 destination register (OP_*_RT) + + MCU ASE usage: + "~" 12 bit offset (OP_*_OFFSET12) + "\" 3 bit position for aset and aclr (OP_*_3BITPOS) + + VIRT ASE usage: + "+J" 10-bit hypcall code (OP_*CODE10) + + UDI immediates: + "+1" UDI immediate bits 6-10 + "+2" UDI immediate bits 6-15 + "+3" UDI immediate bits 6-20 + "+4" UDI immediate bits 6-25 + + Octeon: + "+x" Bit index field of bbit. Enforces: 0 <= index < 32. + "+X" Bit index field of bbit aliasing bbit32. Matches if 32 <= index < 64, + otherwise skips to next candidate. + "+p" Position field of cins/cins32/exts/exts32. Enforces 0 <= pos < 32. + "+P" Position field of cins/exts aliasing cins32/exts32. Matches if + 32 <= pos < 64, otherwise skips to next candidate. + "+Q" Immediate field of seqi/snei. Enforces -512 <= imm < 512. + "+s" Length-minus-one field of cins32/exts32. Requires msb position + of the field to be <= 31. + "+S" Length-minus-one field of cins/exts. Requires msb position + of the field to be <= 63. + + Loongson-3A: + "+a" 8-bit signed offset in bit 6 (OP_*_OFFSET_A) + "+b" 8-bit signed offset in bit 3 (OP_*_OFFSET_B) + "+c" 9-bit signed offset in bit 6 (OP_*_OFFSET_C) + "+z" 5-bit rz register (OP_*_RZ) + "+Z" 5-bit fz register (OP_*_FZ) + + Enhanced VA Scheme: + "+j" 9-bit signed offset in bit 7 (OP_*_EVAOFFSET) + + MSA Extension: + "+d" 5-bit MSA register (FD) + "+e" 5-bit MSA register (FS) + "+h" 5-bit MSA register (FT) + "+k" 5-bit GPR at bit 6 + "+l" 5-bit MSA control register at bit 6 + "+n" 5-bit MSA control register at bit 11 + "+o" 5-bit vector element index at bit 16 + "+u" 4-bit vector element index at bit 16 + "+v" 3-bit vector element index at bit 16 + "+w" 2-bit vector element index at bit 16 + "+T" (-512 .. 511) << 0 at bit 16 + "+U" (-512 .. 511) << 1 at bit 16 + "+V" (-512 .. 511) << 2 at bit 16 + "+W" (-512 .. 511) << 3 at bit 16 + "+~" 2 bit LSA/DLSA shift amount from 1 to 4 at bit 6 + "+!" 3 bit unsigned bit position at bit 16 + "+@" 4 bit unsigned bit position at bit 16 + "+#" 6 bit unsigned bit position at bit 16 + "+$" 5 bit unsigned immediate at bit 16 + "+%" 5 bit signed immediate at bit 16 + "+^" 10 bit signed immediate at bit 11 + "+&" 0 vector element index + "+*" 5-bit register vector element index at bit 16 + "+|" 8-bit mask at bit 16 + + Other: + "()" parens surrounding optional value + "," separates operands + "+" Start of extension sequence. + + Characters used so far, for quick reference when adding more: + "1234567890" + "%[]<>(),+:'@!#$*&\~" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklopqrstuvwxz" + + Extension character sequences used so far ("+" followed by the + following), for quick reference when adding more: + "1234567890" + "~!@#$%^&*|" + "ABCEFGHJKLMNPQSTUVWXZ" + "abcdefghijklmnopqrstuvwxyz" +*/ + +/* These are the bits which may be set in the pinfo field of an + instructions, if it is not equal to INSN_MACRO. */ + +/* Writes to operand number N. */ +#define INSN_WRITE_SHIFT 0 +#define INSN_WRITE_1 0x00000001 +#define INSN_WRITE_2 0x00000002 +#define INSN_WRITE_ALL 0x00000003 +/* Reads from operand number N. */ +#define INSN_READ_SHIFT 2 +#define INSN_READ_1 0x00000004 +#define INSN_READ_2 0x00000008 +#define INSN_READ_3 0x00000010 +#define INSN_READ_4 0x00000020 +#define INSN_READ_ALL 0x0000003c +/* Modifies general purpose register 31. */ +#define INSN_WRITE_GPR_31 0x00000040 +/* Modifies coprocessor condition code. */ +#define INSN_WRITE_COND_CODE 0x00000080 +/* Reads coprocessor condition code. */ +#define INSN_READ_COND_CODE 0x00000100 +/* TLB operation. */ +#define INSN_TLB 0x00000200 +/* Reads coprocessor register other than floating point register. */ +#define INSN_COP 0x00000400 +/* Instruction loads value from memory, requiring delay. */ +#define INSN_LOAD_MEMORY_DELAY 0x00000800 +/* Instruction loads value from coprocessor, requiring delay. */ +#define INSN_LOAD_COPROC_DELAY 0x00001000 +/* Instruction has unconditional branch delay slot. */ +#define INSN_UNCOND_BRANCH_DELAY 0x00002000 +/* Instruction has conditional branch delay slot. */ +#define INSN_COND_BRANCH_DELAY 0x00004000 +/* Conditional branch likely: if branch not taken, insn nullified. */ +#define INSN_COND_BRANCH_LIKELY 0x00008000 +/* Moves to coprocessor register, requiring delay. */ +#define INSN_COPROC_MOVE_DELAY 0x00010000 +/* Loads coprocessor register from memory, requiring delay. */ +#define INSN_COPROC_MEMORY_DELAY 0x00020000 +/* Reads the HI register. */ +#define INSN_READ_HI 0x00040000 +/* Reads the LO register. */ +#define INSN_READ_LO 0x00080000 +/* Modifies the HI register. */ +#define INSN_WRITE_HI 0x00100000 +/* Modifies the LO register. */ +#define INSN_WRITE_LO 0x00200000 +/* Not to be placed in a branch delay slot, either architecturally + or for ease of handling (such as with instructions that take a trap). */ +#define INSN_NO_DELAY_SLOT 0x00400000 +/* Instruction stores value into memory. */ +#define INSN_STORE_MEMORY 0x00800000 +/* Instruction uses single precision floating point. */ +#define FP_S 0x01000000 +/* Instruction uses double precision floating point. */ +#define FP_D 0x02000000 +/* Instruction is part of the tx39's integer multiply family. */ +#define INSN_MULT 0x04000000 +/* Reads general purpose register 24. */ +#define INSN_READ_GPR_24 0x08000000 +/* Writes to general purpose register 24. */ +#define INSN_WRITE_GPR_24 0x10000000 +/* A user-defined instruction. */ +#define INSN_UDI 0x20000000 +/* Instruction is actually a macro. It should be ignored by the + disassembler, and requires special treatment by the assembler. */ +#define INSN_MACRO 0xffffffff + +/* These are the bits which may be set in the pinfo2 field of an + instruction. */ + +/* Instruction is a simple alias (I.E. "move" for daddu/addu/or) */ +#define INSN2_ALIAS 0x00000001 +/* Instruction reads MDMX accumulator. */ +#define INSN2_READ_MDMX_ACC 0x00000002 +/* Instruction writes MDMX accumulator. */ +#define INSN2_WRITE_MDMX_ACC 0x00000004 +/* Macro uses single-precision floating-point instructions. This should + only be set for macros. For instructions, FP_S in pinfo carries the + same information. */ +#define INSN2_M_FP_S 0x00000008 +/* Macro uses double-precision floating-point instructions. This should + only be set for macros. For instructions, FP_D in pinfo carries the + same information. */ +#define INSN2_M_FP_D 0x00000010 +/* Instruction has a branch delay slot that requires a 16-bit instruction. */ +#define INSN2_BRANCH_DELAY_16BIT 0x00000020 +/* Instruction has a branch delay slot that requires a 32-bit instruction. */ +#define INSN2_BRANCH_DELAY_32BIT 0x00000040 +/* Writes to the stack pointer ($29). */ +#define INSN2_WRITE_SP 0x00000080 +/* Reads from the stack pointer ($29). */ +#define INSN2_READ_SP 0x00000100 +/* Reads the RA ($31) register. */ +#define INSN2_READ_GPR_31 0x00000200 +/* Reads the program counter ($pc). */ +#define INSN2_READ_PC 0x00000400 +/* Is an unconditional branch insn. */ +#define INSN2_UNCOND_BRANCH 0x00000800 +/* Is a conditional branch insn. */ +#define INSN2_COND_BRANCH 0x00001000 +/* Reads from $16. This is true of the MIPS16 0x6500 nop. */ +#define INSN2_READ_GPR_16 0x00002000 +/* Has an "\.x?y?z?w?" suffix based on mips_vu0_channel_mask. */ +#define INSN2_VU0_CHANNEL_SUFFIX 0x00004000 + +/* Masks used to mark instructions to indicate which MIPS ISA level + they were introduced in. INSN_ISA_MASK masks an enumeration that + specifies the base ISA level(s). The remainder of a 32-bit + word constructed using these macros is a bitmask of the remaining + INSN_* values below. */ + +#define INSN_ISA_MASK 0x0000000ful + +/* We cannot start at zero due to ISA_UNKNOWN below. */ +#define INSN_ISA1 1 +#define INSN_ISA2 2 +#define INSN_ISA3 3 +#define INSN_ISA4 4 +#define INSN_ISA5 5 +#define INSN_ISA32 6 +#define INSN_ISA32R2 7 +#define INSN_ISA64 8 +#define INSN_ISA64R2 9 +/* Below this point the INSN_* values correspond to combinations of ISAs. + They are only for use in the opcodes table to indicate membership of + a combination of ISAs that cannot be expressed using the usual inclusion + ordering on the above INSN_* values. */ +#define INSN_ISA3_32 10 +#define INSN_ISA3_32R2 11 +#define INSN_ISA4_32 12 +#define INSN_ISA4_32R2 13 +#define INSN_ISA5_32R2 14 + +/* Given INSN_ISA* values X and Y, where X ranges over INSN_ISA1 through + INSN_ISA5_32R2 and Y ranges over INSN_ISA1 through INSN_ISA64R2, + this table describes whether at least one of the ISAs described by X + is/are implemented by ISA Y. (Think of Y as the ISA level supported by + a particular core and X as the ISA level(s) at which a certain instruction + is defined.) The ISA(s) described by X is/are implemented by Y iff + (mips_isa_table[(Y & INSN_ISA_MASK) - 1] >> ((X & INSN_ISA_MASK) - 1)) & 1 + is non-zero. */ +static const unsigned int mips_isa_table[] = + { 0x0001, 0x0003, 0x0607, 0x1e0f, 0x3e1f, 0x0a23, 0x3e63, 0x3ebf, 0x3fff }; + +/* Masks used for Chip specific instructions. */ +#define INSN_CHIP_MASK 0xc3ff0f20 + +/* Cavium Networks Octeon instructions. */ +#define INSN_OCTEON 0x00000800 +#define INSN_OCTEONP 0x00000200 +#define INSN_OCTEON2 0x00000100 + +/* MIPS R5900 instruction */ +#define INSN_5900 0x00004000 + +/* MIPS R4650 instruction. */ +#define INSN_4650 0x00010000 +/* LSI R4010 instruction. */ +#define INSN_4010 0x00020000 +/* NEC VR4100 instruction. */ +#define INSN_4100 0x00040000 +/* Toshiba R3900 instruction. */ +#define INSN_3900 0x00080000 +/* MIPS R10000 instruction. */ +#define INSN_10000 0x00100000 +/* Broadcom SB-1 instruction. */ +#define INSN_SB1 0x00200000 +/* NEC VR4111/VR4181 instruction. */ +#define INSN_4111 0x00400000 +/* NEC VR4120 instruction. */ +#define INSN_4120 0x00800000 +/* NEC VR5400 instruction. */ +#define INSN_5400 0x01000000 +/* NEC VR5500 instruction. */ +#define INSN_5500 0x02000000 + +/* ST Microelectronics Loongson 2E. */ +#define INSN_LOONGSON_2E 0x40000000 +/* ST Microelectronics Loongson 2F. */ +#define INSN_LOONGSON_2F 0x80000000 +/* Loongson 3A. */ +#define INSN_LOONGSON_3A 0x00000400 +/* RMI Xlr instruction */ +#define INSN_XLR 0x00000020 + +/* DSP ASE */ +#define ASE_DSP 0x00000001 +#define ASE_DSP64 0x00000002 +/* DSP R2 ASE */ +#define ASE_DSPR2 0x00000004 +/* Enhanced VA Scheme */ +#define ASE_EVA 0x00000008 +/* MCU (MicroController) ASE */ +#define ASE_MCU 0x00000010 +/* MDMX ASE */ +#define ASE_MDMX 0x00000020 +/* MIPS-3D ASE */ +#define ASE_MIPS3D 0x00000040 +/* MT ASE */ +#define ASE_MT 0x00000080 +/* SmartMIPS ASE */ +#define ASE_SMARTMIPS 0x00000100 +/* Virtualization ASE */ +#define ASE_VIRT 0x00000200 +#define ASE_VIRT64 0x00000400 +/* MSA Extension */ +#define ASE_MSA 0x00000800 +#define ASE_MSA64 0x00001000 + +/* MIPS ISA defines, use instead of hardcoding ISA level. */ + +#define ISA_UNKNOWN 0 /* Gas internal use. */ +#define ISA_MIPS1 INSN_ISA1 +#define ISA_MIPS2 INSN_ISA2 +#define ISA_MIPS3 INSN_ISA3 +#define ISA_MIPS4 INSN_ISA4 +#define ISA_MIPS5 INSN_ISA5 + +#define ISA_MIPS32 INSN_ISA32 +#define ISA_MIPS64 INSN_ISA64 + +#define ISA_MIPS32R2 INSN_ISA32R2 +#define ISA_MIPS64R2 INSN_ISA64R2 + + +/* CPU defines, use instead of hardcoding processor number. Keep this + in sync with bfd/archures.c in order for machine selection to work. */ +#define CPU_UNKNOWN 0 /* Gas internal use. */ +#define CPU_R3000 3000 +#define CPU_R3900 3900 +#define CPU_R4000 4000 +#define CPU_R4010 4010 +#define CPU_VR4100 4100 +#define CPU_R4111 4111 +#define CPU_VR4120 4120 +#define CPU_R4300 4300 +#define CPU_R4400 4400 +#define CPU_R4600 4600 +#define CPU_R4650 4650 +#define CPU_R5000 5000 +#define CPU_VR5400 5400 +#define CPU_VR5500 5500 +#define CPU_R5900 5900 +#define CPU_R6000 6000 +#define CPU_RM7000 7000 +#define CPU_R8000 8000 +#define CPU_RM9000 9000 +#define CPU_R10000 10000 +#define CPU_R12000 12000 +#define CPU_R14000 14000 +#define CPU_R16000 16000 +#define CPU_MIPS16 16 +#define CPU_MIPS32 32 +#define CPU_MIPS32R2 33 +#define CPU_MIPS5 5 +#define CPU_MIPS64 64 +#define CPU_MIPS64R2 65 +#define CPU_SB1 12310201 /* octal 'SB', 01. */ +#define CPU_LOONGSON_2E 3001 +#define CPU_LOONGSON_2F 3002 +#define CPU_LOONGSON_3A 3003 +#define CPU_OCTEON 6501 +#define CPU_OCTEONP 6601 +#define CPU_OCTEON2 6502 +#define CPU_XLR 887682 /* decimal 'XLR' */ + +/* Return true if the given CPU is included in INSN_* mask MASK. */ + +static inline bfd_boolean +cpu_is_member (int cpu, unsigned int mask) +{ + switch (cpu) + { + case CPU_R4650: + case CPU_RM7000: + case CPU_RM9000: + return (mask & INSN_4650) != 0; + + case CPU_R4010: + return (mask & INSN_4010) != 0; + + case CPU_VR4100: + return (mask & INSN_4100) != 0; + + case CPU_R3900: + return (mask & INSN_3900) != 0; + + case CPU_R10000: + case CPU_R12000: + case CPU_R14000: + case CPU_R16000: + return (mask & INSN_10000) != 0; + + case CPU_SB1: + return (mask & INSN_SB1) != 0; + + case CPU_R4111: + return (mask & INSN_4111) != 0; + + case CPU_VR4120: + return (mask & INSN_4120) != 0; + + case CPU_VR5400: + return (mask & INSN_5400) != 0; + + case CPU_VR5500: + return (mask & INSN_5500) != 0; + + case CPU_R5900: + return (mask & INSN_5900) != 0; + + case CPU_LOONGSON_2E: + return (mask & INSN_LOONGSON_2E) != 0; + + case CPU_LOONGSON_2F: + return (mask & INSN_LOONGSON_2F) != 0; + + case CPU_LOONGSON_3A: + return (mask & INSN_LOONGSON_3A) != 0; + + case CPU_OCTEON: + return (mask & INSN_OCTEON) != 0; + + case CPU_OCTEONP: + return (mask & INSN_OCTEONP) != 0; + + case CPU_OCTEON2: + return (mask & INSN_OCTEON2) != 0; + + case CPU_XLR: + return (mask & INSN_XLR) != 0; + + default: + return FALSE; + } +} + +/* Test for membership in an ISA including chip specific ISAs. INSN + is pointer to an element of the opcode table; ISA is the specified + ISA/ASE bitmask to test against; and CPU is the CPU specific ISA to + test, or zero if no CPU specific ISA test is desired. Return true + if instruction INSN is available to the given ISA and CPU. */ + +static inline bfd_boolean +opcode_is_member (const struct mips_opcode *insn, int isa, int ase, int cpu) +{ + if (!cpu_is_member (cpu, insn->exclusions)) + { + /* Test for ISA level compatibility. */ + if ((isa & INSN_ISA_MASK) != 0 + && (insn->membership & INSN_ISA_MASK) != 0 + && ((mips_isa_table[(isa & INSN_ISA_MASK) - 1] + >> ((insn->membership & INSN_ISA_MASK) - 1)) & 1) != 0) + return TRUE; + + /* Test for ASE compatibility. */ + if ((ase & insn->ase) != 0) + return TRUE; + + /* Test for processor-specific extensions. */ + if (cpu_is_member (cpu, insn->membership)) + return TRUE; + } + return FALSE; +} + +/* This is a list of macro expanded instructions. + + _I appended means immediate + _A appended means target address of a jump + _AB appended means address with (possibly zero) base register + _D appended means 64 bit floating point constant + _S appended means 32 bit floating point constant. */ + +enum +{ + M_ABS, + M_ACLR_AB, + M_ADD_I, + M_ADDU_I, + M_AND_I, + M_ASET_AB, + M_BALIGN, + M_BC1FL, + M_BC1TL, + M_BC2FL, + M_BC2TL, + M_BEQ, + M_BEQ_I, + M_BEQL, + M_BEQL_I, + M_BGE, + M_BGEL, + M_BGE_I, + M_BGEL_I, + M_BGEU, + M_BGEUL, + M_BGEU_I, + M_BGEUL_I, + M_BGEZ, + M_BGEZL, + M_BGEZALL, + M_BGT, + M_BGTL, + M_BGT_I, + M_BGTL_I, + M_BGTU, + M_BGTUL, + M_BGTU_I, + M_BGTUL_I, + M_BGTZ, + M_BGTZL, + M_BLE, + M_BLEL, + M_BLE_I, + M_BLEL_I, + M_BLEU, + M_BLEUL, + M_BLEU_I, + M_BLEUL_I, + M_BLEZ, + M_BLEZL, + M_BLT, + M_BLTL, + M_BLT_I, + M_BLTL_I, + M_BLTU, + M_BLTUL, + M_BLTU_I, + M_BLTUL_I, + M_BLTZ, + M_BLTZL, + M_BLTZALL, + M_BNE, + M_BNEL, + M_BNE_I, + M_BNEL_I, + M_CACHE_AB, + M_CACHEE_AB, + M_DABS, + M_DADD_I, + M_DADDU_I, + M_DDIV_3, + M_DDIV_3I, + M_DDIVU_3, + M_DDIVU_3I, + M_DIV_3, + M_DIV_3I, + M_DIVU_3, + M_DIVU_3I, + M_DLA_AB, + M_DLCA_AB, + M_DLI, + M_DMUL, + M_DMUL_I, + M_DMULO, + M_DMULO_I, + M_DMULOU, + M_DMULOU_I, + M_DREM_3, + M_DREM_3I, + M_DREMU_3, + M_DREMU_3I, + M_DSUB_I, + M_DSUBU_I, + M_DSUBU_I_2, + M_J_A, + M_JAL_1, + M_JAL_2, + M_JAL_A, + M_JALS_1, + M_JALS_2, + M_JALS_A, + M_JRADDIUSP, + M_JRC, + M_L_DAB, + M_LA_AB, + M_LB_AB, + M_LBE_AB, + M_LBU_AB, + M_LBUE_AB, + M_LCA_AB, + M_LD_AB, + M_LDC1_AB, + M_LDC2_AB, + M_LQC2_AB, + M_LDC3_AB, + M_LDL_AB, + M_LDM_AB, + M_LDP_AB, + M_LDR_AB, + M_LH_AB, + M_LHE_AB, + M_LHU_AB, + M_LHUE_AB, + M_LI, + M_LI_D, + M_LI_DD, + M_LI_S, + M_LI_SS, + M_LL_AB, + M_LLD_AB, + M_LLE_AB, + M_LQ_AB, + M_LW_AB, + M_LWE_AB, + M_LWC0_AB, + M_LWC1_AB, + M_LWC2_AB, + M_LWC3_AB, + M_LWL_AB, + M_LWLE_AB, + M_LWM_AB, + M_LWP_AB, + M_LWR_AB, + M_LWRE_AB, + M_LWU_AB, + M_MSGSND, + M_MSGLD, + M_MSGLD_T, + M_MSGWAIT, + M_MSGWAIT_T, + M_MOVE, + M_MOVEP, + M_MUL, + M_MUL_I, + M_MULO, + M_MULO_I, + M_MULOU, + M_MULOU_I, + M_NOR_I, + M_OR_I, + M_PREF_AB, + M_PREFE_AB, + M_REM_3, + M_REM_3I, + M_REMU_3, + M_REMU_3I, + M_DROL, + M_ROL, + M_DROL_I, + M_ROL_I, + M_DROR, + M_ROR, + M_DROR_I, + M_ROR_I, + M_S_DA, + M_S_DAB, + M_S_S, + M_SAA_AB, + M_SAAD_AB, + M_SC_AB, + M_SCD_AB, + M_SCE_AB, + M_SD_AB, + M_SDC1_AB, + M_SDC2_AB, + M_SQC2_AB, + M_SDC3_AB, + M_SDL_AB, + M_SDM_AB, + M_SDP_AB, + M_SDR_AB, + M_SEQ, + M_SEQ_I, + M_SGE, + M_SGE_I, + M_SGEU, + M_SGEU_I, + M_SGT, + M_SGT_I, + M_SGTU, + M_SGTU_I, + M_SLE, + M_SLE_I, + M_SLEU, + M_SLEU_I, + M_SLT_I, + M_SLTU_I, + M_SNE, + M_SNE_I, + M_SB_AB, + M_SBE_AB, + M_SH_AB, + M_SHE_AB, + M_SQ_AB, + M_SW_AB, + M_SWE_AB, + M_SWC0_AB, + M_SWC1_AB, + M_SWC2_AB, + M_SWC3_AB, + M_SWL_AB, + M_SWLE_AB, + M_SWM_AB, + M_SWP_AB, + M_SWR_AB, + M_SWRE_AB, + M_SUB_I, + M_SUBU_I, + M_SUBU_I_2, + M_TEQ_I, + M_TGE_I, + M_TGEU_I, + M_TLT_I, + M_TLTU_I, + M_TNE_I, + M_TRUNCWD, + M_TRUNCWS, + M_ULD_AB, + M_ULH_AB, + M_ULHU_AB, + M_ULW_AB, + M_USH_AB, + M_USW_AB, + M_USD_AB, + M_XOR_I, + M_COP0, + M_COP1, + M_COP2, + M_COP3, + M_NUM_MACROS +}; + + +/* The order of overloaded instructions matters. Label arguments and + register arguments look the same. Instructions that can have either + for arguments must apear in the correct order in this table for the + assembler to pick the right one. In other words, entries with + immediate operands must apear after the same instruction with + registers. + + Many instructions are short hand for other instructions (i.e., The + jal instruction is short for jalr ). */ + +extern const struct mips_operand mips_vu0_channel_mask; +extern const struct mips_operand *decode_mips_operand (const char *); +extern const struct mips_opcode mips_builtin_opcodes[]; +extern const int bfd_mips_num_builtin_opcodes; +extern struct mips_opcode *mips_opcodes; +extern int bfd_mips_num_opcodes; +#define NUMOPCODES bfd_mips_num_opcodes + + +/* The rest of this file adds definitions for the mips16 TinyRISC + processor. */ + +/* These are the bitmasks and shift counts used for the different + fields in the instruction formats. Other than OP, no masks are + provided for the fixed portions of an instruction, since they are + not needed. + + The I format uses IMM11. + + The RI format uses RX and IMM8. + + The RR format uses RX, and RY. + + The RRI format uses RX, RY, and IMM5. + + The RRR format uses RX, RY, and RZ. + + The RRI_A format uses RX, RY, and IMM4. + + The SHIFT format uses RX, RY, and SHAMT. + + The I8 format uses IMM8. + + The I8_MOVR32 format uses RY and REGR32. + + The IR_MOV32R format uses REG32R and MOV32Z. + + The I64 format uses IMM8. + + The RI64 format uses RY and IMM5. + */ + +#define MIPS16OP_MASK_OP 0x1f +#define MIPS16OP_SH_OP 11 +#define MIPS16OP_MASK_IMM11 0x7ff +#define MIPS16OP_SH_IMM11 0 +#define MIPS16OP_MASK_RX 0x7 +#define MIPS16OP_SH_RX 8 +#define MIPS16OP_MASK_IMM8 0xff +#define MIPS16OP_SH_IMM8 0 +#define MIPS16OP_MASK_RY 0x7 +#define MIPS16OP_SH_RY 5 +#define MIPS16OP_MASK_IMM5 0x1f +#define MIPS16OP_SH_IMM5 0 +#define MIPS16OP_MASK_RZ 0x7 +#define MIPS16OP_SH_RZ 2 +#define MIPS16OP_MASK_IMM4 0xf +#define MIPS16OP_SH_IMM4 0 +#define MIPS16OP_MASK_REGR32 0x1f +#define MIPS16OP_SH_REGR32 0 +#define MIPS16OP_MASK_REG32R 0x1f +#define MIPS16OP_SH_REG32R 3 +#define MIPS16OP_EXTRACT_REG32R(i) ((((i) >> 5) & 7) | ((i) & 0x18)) +#define MIPS16OP_MASK_MOVE32Z 0x7 +#define MIPS16OP_SH_MOVE32Z 0 +#define MIPS16OP_MASK_IMM6 0x3f +#define MIPS16OP_SH_IMM6 5 + +/* These are the characters which may appears in the args field of a MIPS16 + instruction. They appear in the order in which the fields appear when the + instruction is used. Commas and parentheses in the args string are ignored + when assembling, and written into the output when disassembling. + + "y" 3 bit register (MIPS16OP_*_RY) + "x" 3 bit register (MIPS16OP_*_RX) + "z" 3 bit register (MIPS16OP_*_RZ) + "Z" 3 bit register (MIPS16OP_*_MOVE32Z) + "v" 3 bit same register as source and destination (MIPS16OP_*_RX) + "w" 3 bit same register as source and destination (MIPS16OP_*_RY) + "0" zero register ($0) + "S" stack pointer ($sp or $29) + "P" program counter + "R" return address register ($ra or $31) + "X" 5 bit MIPS register (MIPS16OP_*_REGR32) + "Y" 5 bit MIPS register (MIPS16OP_*_REG32R) + "6" 6 bit unsigned break code (MIPS16OP_*_IMM6) + "a" 26 bit jump address + "i" likewise, but flips bit 0 + "e" 11 bit extension value + "l" register list for entry instruction + "L" register list for exit instruction + + "I" an immediate value used for macros + + The remaining codes may be extended. Except as otherwise noted, + the full extended operand is a 16 bit signed value. + "<" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 5 bit unsigned) + ">" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 5 bit unsigned) + "[" 3 bit unsigned shift count * 0 (MIPS16OP_*_RZ) (full 6 bit unsigned) + "]" 3 bit unsigned shift count * 0 (MIPS16OP_*_RX) (full 6 bit unsigned) + "4" 4 bit signed immediate * 0 (MIPS16OP_*_IMM4) (full 15 bit signed) + "5" 5 bit unsigned immediate * 0 (MIPS16OP_*_IMM5) + "H" 5 bit unsigned immediate * 2 (MIPS16OP_*_IMM5) + "W" 5 bit unsigned immediate * 4 (MIPS16OP_*_IMM5) + "D" 5 bit unsigned immediate * 8 (MIPS16OP_*_IMM5) + "j" 5 bit signed immediate * 0 (MIPS16OP_*_IMM5) + "8" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) + "V" 8 bit unsigned immediate * 4 (MIPS16OP_*_IMM8) + "C" 8 bit unsigned immediate * 8 (MIPS16OP_*_IMM8) + "U" 8 bit unsigned immediate * 0 (MIPS16OP_*_IMM8) (full 16 bit unsigned) + "k" 8 bit signed immediate * 0 (MIPS16OP_*_IMM8) + "K" 8 bit signed immediate * 8 (MIPS16OP_*_IMM8) + "p" 8 bit conditional branch address (MIPS16OP_*_IMM8) + "q" 11 bit branch address (MIPS16OP_*_IMM11) + "A" 8 bit PC relative address * 4 (MIPS16OP_*_IMM8) + "B" 5 bit PC relative address * 8 (MIPS16OP_*_IMM5) + "E" 5 bit PC relative address * 4 (MIPS16OP_*_IMM5) + "m" 7 bit register list for save instruction (18 bit extended) + "M" 7 bit register list for restore instruction (18 bit extended) + */ + +/* Save/restore encoding for the args field when all 4 registers are + either saved as arguments or saved/restored as statics. */ +#define MIPS16_ALL_ARGS 0xe +#define MIPS16_ALL_STATICS 0xb + +/* The following flags have the same value for the mips16 opcode + table: + + INSN_ISA3 + + INSN_UNCOND_BRANCH_DELAY + INSN_COND_BRANCH_DELAY + INSN_COND_BRANCH_LIKELY (never used) + INSN_READ_HI + INSN_READ_LO + INSN_WRITE_HI + INSN_WRITE_LO + INSN_TRAP + FP_D (never used) + */ + +extern const struct mips_operand *decode_mips16_operand (char, bfd_boolean); +extern const struct mips_opcode mips16_opcodes[]; +extern const int bfd_mips16_num_opcodes; + +/* These are the bit masks and shift counts used for the different fields + in the microMIPS instruction formats. No masks are provided for the + fixed portions of an instruction, since they are not needed. */ + +#define MICROMIPSOP_MASK_IMMEDIATE 0xffff +#define MICROMIPSOP_SH_IMMEDIATE 0 +#define MICROMIPSOP_MASK_DELTA 0xffff +#define MICROMIPSOP_SH_DELTA 0 +#define MICROMIPSOP_MASK_CODE10 0x3ff +#define MICROMIPSOP_SH_CODE10 16 /* 10-bit wait code. */ +#define MICROMIPSOP_MASK_TRAP 0xf +#define MICROMIPSOP_SH_TRAP 12 /* 4-bit trap code. */ +#define MICROMIPSOP_MASK_SHAMT 0x1f +#define MICROMIPSOP_SH_SHAMT 11 +#define MICROMIPSOP_MASK_TARGET 0x3ffffff +#define MICROMIPSOP_SH_TARGET 0 +#define MICROMIPSOP_MASK_EXTLSB 0x1f /* "ext" LSB. */ +#define MICROMIPSOP_SH_EXTLSB 6 +#define MICROMIPSOP_MASK_EXTMSBD 0x1f /* "ext" MSBD. */ +#define MICROMIPSOP_SH_EXTMSBD 11 +#define MICROMIPSOP_MASK_INSMSB 0x1f /* "ins" MSB. */ +#define MICROMIPSOP_SH_INSMSB 11 +#define MICROMIPSOP_MASK_CODE 0x3ff +#define MICROMIPSOP_SH_CODE 16 /* 10-bit higher break code. */ +#define MICROMIPSOP_MASK_CODE2 0x3ff +#define MICROMIPSOP_SH_CODE2 6 /* 10-bit lower break code. */ +#define MICROMIPSOP_MASK_CACHE 0x1f +#define MICROMIPSOP_SH_CACHE 21 /* 5-bit cache op. */ +#define MICROMIPSOP_MASK_SEL 0x7 +#define MICROMIPSOP_SH_SEL 11 +#define MICROMIPSOP_MASK_OFFSET12 0xfff +#define MICROMIPSOP_SH_OFFSET12 0 +#define MICROMIPSOP_MASK_3BITPOS 0x7 +#define MICROMIPSOP_SH_3BITPOS 21 +#define MICROMIPSOP_MASK_STYPE 0x1f +#define MICROMIPSOP_SH_STYPE 16 +#define MICROMIPSOP_MASK_OFFSET10 0x3ff +#define MICROMIPSOP_SH_OFFSET10 6 +#define MICROMIPSOP_MASK_RS 0x1f +#define MICROMIPSOP_SH_RS 16 +#define MICROMIPSOP_MASK_RT 0x1f +#define MICROMIPSOP_SH_RT 21 +#define MICROMIPSOP_MASK_RD 0x1f +#define MICROMIPSOP_SH_RD 11 +#define MICROMIPSOP_MASK_FS 0x1f +#define MICROMIPSOP_SH_FS 16 +#define MICROMIPSOP_MASK_FT 0x1f +#define MICROMIPSOP_SH_FT 21 +#define MICROMIPSOP_MASK_FD 0x1f +#define MICROMIPSOP_SH_FD 11 +#define MICROMIPSOP_MASK_FR 0x1f +#define MICROMIPSOP_SH_FR 6 +#define MICROMIPSOP_MASK_RS3 0x1f +#define MICROMIPSOP_SH_RS3 6 +#define MICROMIPSOP_MASK_PREFX 0x1f +#define MICROMIPSOP_SH_PREFX 11 +#define MICROMIPSOP_MASK_BCC 0x7 +#define MICROMIPSOP_SH_BCC 18 +#define MICROMIPSOP_MASK_CCC 0x7 +#define MICROMIPSOP_SH_CCC 13 +#define MICROMIPSOP_MASK_COPZ 0x7fffff +#define MICROMIPSOP_SH_COPZ 3 + +#define MICROMIPSOP_MASK_MB 0x7 +#define MICROMIPSOP_SH_MB 23 +#define MICROMIPSOP_MASK_MC 0x7 +#define MICROMIPSOP_SH_MC 4 +#define MICROMIPSOP_MASK_MD 0x7 +#define MICROMIPSOP_SH_MD 7 +#define MICROMIPSOP_MASK_ME 0x7 +#define MICROMIPSOP_SH_ME 1 +#define MICROMIPSOP_MASK_MF 0x7 +#define MICROMIPSOP_SH_MF 3 +#define MICROMIPSOP_MASK_MG 0x7 +#define MICROMIPSOP_SH_MG 0 +#define MICROMIPSOP_MASK_MH 0x7 +#define MICROMIPSOP_SH_MH 7 +#define MICROMIPSOP_MASK_MJ 0x1f +#define MICROMIPSOP_SH_MJ 0 +#define MICROMIPSOP_MASK_ML 0x7 +#define MICROMIPSOP_SH_ML 4 +#define MICROMIPSOP_MASK_MM 0x7 +#define MICROMIPSOP_SH_MM 1 +#define MICROMIPSOP_MASK_MN 0x7 +#define MICROMIPSOP_SH_MN 4 +#define MICROMIPSOP_MASK_MP 0x1f +#define MICROMIPSOP_SH_MP 5 +#define MICROMIPSOP_MASK_MQ 0x7 +#define MICROMIPSOP_SH_MQ 7 + +#define MICROMIPSOP_MASK_IMMA 0x7f +#define MICROMIPSOP_SH_IMMA 0 +#define MICROMIPSOP_MASK_IMMB 0x7 +#define MICROMIPSOP_SH_IMMB 1 +#define MICROMIPSOP_MASK_IMMC 0xf +#define MICROMIPSOP_SH_IMMC 0 +#define MICROMIPSOP_MASK_IMMD 0x3ff +#define MICROMIPSOP_SH_IMMD 0 +#define MICROMIPSOP_MASK_IMME 0x7f +#define MICROMIPSOP_SH_IMME 0 +#define MICROMIPSOP_MASK_IMMF 0xf +#define MICROMIPSOP_SH_IMMF 0 +#define MICROMIPSOP_MASK_IMMG 0xf +#define MICROMIPSOP_SH_IMMG 0 +#define MICROMIPSOP_MASK_IMMH 0xf +#define MICROMIPSOP_SH_IMMH 0 +#define MICROMIPSOP_MASK_IMMI 0x7f +#define MICROMIPSOP_SH_IMMI 0 +#define MICROMIPSOP_MASK_IMMJ 0xf +#define MICROMIPSOP_SH_IMMJ 0 +#define MICROMIPSOP_MASK_IMML 0xf +#define MICROMIPSOP_SH_IMML 0 +#define MICROMIPSOP_MASK_IMMM 0x7 +#define MICROMIPSOP_SH_IMMM 1 +#define MICROMIPSOP_MASK_IMMN 0x3 +#define MICROMIPSOP_SH_IMMN 4 +#define MICROMIPSOP_MASK_IMMO 0xf +#define MICROMIPSOP_SH_IMMO 0 +#define MICROMIPSOP_MASK_IMMP 0x1f +#define MICROMIPSOP_SH_IMMP 0 +#define MICROMIPSOP_MASK_IMMQ 0x7fffff +#define MICROMIPSOP_SH_IMMQ 0 +#define MICROMIPSOP_MASK_IMMU 0x1f +#define MICROMIPSOP_SH_IMMU 0 +#define MICROMIPSOP_MASK_IMMW 0x3f +#define MICROMIPSOP_SH_IMMW 1 +#define MICROMIPSOP_MASK_IMMX 0xf +#define MICROMIPSOP_SH_IMMX 1 +#define MICROMIPSOP_MASK_IMMY 0x1ff +#define MICROMIPSOP_SH_IMMY 1 + +/* MIPS DSP ASE */ +#define MICROMIPSOP_MASK_DSPACC 0x3 +#define MICROMIPSOP_SH_DSPACC 14 +#define MICROMIPSOP_MASK_DSPSFT 0x3f +#define MICROMIPSOP_SH_DSPSFT 16 +#define MICROMIPSOP_MASK_SA3 0x7 +#define MICROMIPSOP_SH_SA3 13 +#define MICROMIPSOP_MASK_SA4 0xf +#define MICROMIPSOP_SH_SA4 12 +#define MICROMIPSOP_MASK_IMM8 0xff +#define MICROMIPSOP_SH_IMM8 13 +#define MICROMIPSOP_MASK_IMM10 0x3ff +#define MICROMIPSOP_SH_IMM10 16 +#define MICROMIPSOP_MASK_WRDSP 0x3f +#define MICROMIPSOP_SH_WRDSP 14 +#define MICROMIPSOP_MASK_BP 0x3 +#define MICROMIPSOP_SH_BP 14 + +/* Placeholders for fields that only exist in the traditional 32-bit + instruction encoding; see the comment above for details. */ +#define MICROMIPSOP_MASK_CODE20 0 +#define MICROMIPSOP_SH_CODE20 0 +#define MICROMIPSOP_MASK_PERFREG 0 +#define MICROMIPSOP_SH_PERFREG 0 +#define MICROMIPSOP_MASK_CODE19 0 +#define MICROMIPSOP_SH_CODE19 0 +#define MICROMIPSOP_MASK_ALN 0 +#define MICROMIPSOP_SH_ALN 0 +#define MICROMIPSOP_MASK_VECBYTE 0 +#define MICROMIPSOP_SH_VECBYTE 0 +#define MICROMIPSOP_MASK_VECALIGN 0 +#define MICROMIPSOP_SH_VECALIGN 0 +#define MICROMIPSOP_MASK_DSPACC_S 0 +#define MICROMIPSOP_SH_DSPACC_S 0 +#define MICROMIPSOP_MASK_DSPSFT_7 0 +#define MICROMIPSOP_SH_DSPSFT_7 0 +#define MICROMIPSOP_MASK_RDDSP 0 +#define MICROMIPSOP_SH_RDDSP 0 +#define MICROMIPSOP_MASK_MT_U 0 +#define MICROMIPSOP_SH_MT_U 0 +#define MICROMIPSOP_MASK_MT_H 0 +#define MICROMIPSOP_SH_MT_H 0 +#define MICROMIPSOP_MASK_MTACC_T 0 +#define MICROMIPSOP_SH_MTACC_T 0 +#define MICROMIPSOP_MASK_MTACC_D 0 +#define MICROMIPSOP_SH_MTACC_D 0 +#define MICROMIPSOP_MASK_BBITIND 0 +#define MICROMIPSOP_SH_BBITIND 0 +#define MICROMIPSOP_MASK_CINSPOS 0 +#define MICROMIPSOP_SH_CINSPOS 0 +#define MICROMIPSOP_MASK_CINSLM1 0 +#define MICROMIPSOP_SH_CINSLM1 0 +#define MICROMIPSOP_MASK_SEQI 0 +#define MICROMIPSOP_SH_SEQI 0 +#define MICROMIPSOP_SH_OFFSET_A 0 +#define MICROMIPSOP_MASK_OFFSET_A 0 +#define MICROMIPSOP_SH_OFFSET_B 0 +#define MICROMIPSOP_MASK_OFFSET_B 0 +#define MICROMIPSOP_SH_OFFSET_C 0 +#define MICROMIPSOP_MASK_OFFSET_C 0 +#define MICROMIPSOP_SH_RZ 0 +#define MICROMIPSOP_MASK_RZ 0 +#define MICROMIPSOP_SH_FZ 0 +#define MICROMIPSOP_MASK_FZ 0 + +/* microMIPS Enhanced VA Scheme */ +#define MICROMIPSOP_SH_EVAOFFSET 0 +#define MICROMIPSOP_MASK_EVAOFFSET 0x1ff + +/* These are the characters which may appears in the args field of a microMIPS + instruction. They appear in the order in which the fields appear + when the instruction is used. Commas and parentheses in the args + string are ignored when assembling, and written into the output + when disassembling. + + The followings are for 16-bit microMIPS instructions. + + "ma" must be $28 + "mc" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MC) at bit 4 + The same register used as both source and target. + "md" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MD) at bit 7 + "me" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_ME) at bit 1 + The same register used as both source and target. + "mf" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MF) at bit 3 + "mg" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MG) at bit 0 + "mh" 3-bit MIPS register pair (MICROMIPSOP_*_MH) at bit 7 + "mj" 5-bit MIPS registers (MICROMIPSOP_*_MJ) at bit 0 + "ml" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_ML) at bit 4 + "mm" 3-bit MIPS registers 0, 2, 3, 16-20 (MICROMIPSOP_*_MM) at bit 1 + "mn" 3-bit MIPS registers 0, 2, 3, 16-20 (MICROMIPSOP_*_MN) at bit 4 + "mp" 5-bit MIPS registers (MICROMIPSOP_*_MP) at bit 5 + "mq" 3-bit MIPS registers 0, 2-7, 17 (MICROMIPSOP_*_MQ) at bit 7 + "mr" must be program counter + "ms" must be $29 + "mt" must be the same as the previous register + "mx" must be the same as the destination register + "my" must be $31 + "mz" must be $0 + + "mA" 7-bit immediate (-64 .. 63) << 2 (MICROMIPSOP_*_IMMA) + "mB" 3-bit immediate (-1, 1, 4, 8, 12, 16, 20, 24) (MICROMIPSOP_*_IMMB) + "mC" 4-bit immediate (1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 128, 255, + 32768, 65535) (MICROMIPSOP_*_IMMC) + "mD" 10-bit branch address (-512 .. 511) << 1 (MICROMIPSOP_*_IMMD) + "mE" 7-bit branch address (-64 .. 63) << 1 (MICROMIPSOP_*_IMME) + "mF" 4-bit immediate (0 .. 15) (MICROMIPSOP_*_IMMF) + "mG" 4-bit immediate (-1 .. 14) (MICROMIPSOP_*_IMMG) + "mH" 4-bit immediate (0 .. 15) << 1 (MICROMIPSOP_*_IMMH) + "mI" 7-bit immediate (-1 .. 126) (MICROMIPSOP_*_IMMI) + "mJ" 4-bit immediate (0 .. 15) << 2 (MICROMIPSOP_*_IMMJ) + "mL" 4-bit immediate (0 .. 15) (MICROMIPSOP_*_IMML) + "mM" 3-bit immediate (1 .. 8) (MICROMIPSOP_*_IMMM) + "mN" 2-bit immediate (0 .. 3) for register list (MICROMIPSOP_*_IMMN) + "mO" 4-bit immediate (0 .. 15) (MICROMIPSOP_*_IMML) + "mP" 5-bit immediate (0 .. 31) << 2 (MICROMIPSOP_*_IMMP) + "mU" 5-bit immediate (0 .. 31) << 2 (MICROMIPSOP_*_IMMU) + "mW" 6-bit immediate (0 .. 63) << 2 (MICROMIPSOP_*_IMMW) + "mX" 4-bit immediate (-8 .. 7) (MICROMIPSOP_*_IMMX) + "mY" 9-bit immediate (-258 .. -3, 2 .. 257) << 2 (MICROMIPSOP_*_IMMY) + "mZ" must be zero + + In most cases 32-bit microMIPS instructions use the same characters + as MIPS (with ADDIUPC being a notable exception, but there are some + others too). + + "." 10-bit signed offset/number (MICROMIPSOP_*_OFFSET10) + "1" 5-bit sync type (MICROMIPSOP_*_STYPE) + "<" 5-bit shift amount (MICROMIPSOP_*_SHAMT) + ">" shift amount between 32 and 63, stored after subtracting 32 + (MICROMIPSOP_*_SHAMT) + "\" 3-bit position for ASET and ACLR (MICROMIPSOP_*_3BITPOS) + "|" 4-bit trap code (MICROMIPSOP_*_TRAP) + "~" 12-bit signed offset (MICROMIPSOP_*_OFFSET12) + "a" 26-bit target address (MICROMIPSOP_*_TARGET) + "+i" likewise, but flips bit 0 + "b" 5-bit base register (MICROMIPSOP_*_RS) + "c" 10-bit higher breakpoint code (MICROMIPSOP_*_CODE) + "d" 5-bit destination register specifier (MICROMIPSOP_*_RD) + "h" 5-bit PREFX hint (MICROMIPSOP_*_PREFX) + "i" 16-bit unsigned immediate (MICROMIPSOP_*_IMMEDIATE) + "j" 16-bit signed immediate (MICROMIPSOP_*_DELTA) + "k" 5-bit cache opcode in target register position (MICROMIPSOP_*_CACHE) + "n" register list for 32-bit LWM/SWM instruction (MICROMIPSOP_*_RT) + "o" 16-bit signed offset (MICROMIPSOP_*_DELTA) + "p" 16-bit PC-relative branch target address (MICROMIPSOP_*_DELTA) + "q" 10-bit lower breakpoint code (MICROMIPSOP_*_CODE2) + "r" 5-bit same register used as both source and target (MICROMIPSOP_*_RS) + "s" 5-bit source register specifier (MICROMIPSOP_*_RS) + "t" 5-bit target register (MICROMIPSOP_*_RT) + "u" 16-bit upper 16 bits of address (MICROMIPSOP_*_IMMEDIATE) + "v" 5-bit same register used as both source and destination + (MICROMIPSOP_*_RS) + "w" 5-bit same register used as both target and destination + (MICROMIPSOP_*_RT) + "y" 5-bit source 3 register for ALNV.PS (MICROMIPSOP_*_RS3) + "z" must be zero register + "C" 23-bit coprocessor function code (MICROMIPSOP_*_COPZ) + "B" 10-bit syscall/wait function code (MICROMIPSOP_*_CODE10) + "K" 5-bit Hardware Register (RDHWR instruction) (MICROMIPSOP_*_RS) + + "+A" 5-bit INS/EXT/DINS/DEXT/DINSM/DEXTM position, which becomes + LSB (MICROMIPSOP_*_EXTLSB). + Enforces: 0 <= pos < 32. + "+B" 5-bit INS/DINS size, which becomes MSB (MICROMIPSOP_*_INSMSB). + Requires that "+A" or "+E" occur first to set position. + Enforces: 0 < (pos+size) <= 32. + "+C" 5-bit EXT/DEXT size, which becomes MSBD (MICROMIPSOP_*_EXTMSBD). + Requires that "+A" or "+E" occur first to set position. + Enforces: 0 < (pos+size) <= 32. + (Also used by DEXT w/ different limits, but limits for + that are checked by the M_DEXT macro.) + "+E" 5-bit DINSU/DEXTU position, which becomes LSB-32 (MICROMIPSOP_*_EXTLSB). + Enforces: 32 <= pos < 64. + "+F" 5-bit DINSM/DINSU size, which becomes MSB-32 (MICROMIPSOP_*_INSMSB). + Requires that "+A" or "+E" occur first to set position. + Enforces: 32 < (pos+size) <= 64. + "+G" 5-bit DEXTM size, which becomes MSBD-32 (MICROMIPSOP_*_EXTMSBD). + Requires that "+A" or "+E" occur first to set position. + Enforces: 32 < (pos+size) <= 64. + "+H" 5-bit DEXTU size, which becomes MSBD (MICROMIPSOP_*_EXTMSBD). + Requires that "+A" or "+E" occur first to set position. + Enforces: 32 < (pos+size) <= 64. + + PC-relative addition (ADDIUPC) instruction: + "mQ" 23-bit offset (-4194304 .. 4194303) << 2 (MICROMIPSOP_*_IMMQ) + "mb" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MB) at bit 23 + + Floating point instructions: + "D" 5-bit destination register (MICROMIPSOP_*_FD) + "M" 3-bit compare condition code (MICROMIPSOP_*_CCC) + "N" 3-bit branch condition code (MICROMIPSOP_*_BCC) + "R" 5-bit fr source 3 register (MICROMIPSOP_*_FR) + "S" 5-bit fs source 1 register (MICROMIPSOP_*_FS) + "T" 5-bit ft source 2 register (MICROMIPSOP_*_FT) + "V" 5-bit same register used as floating source and destination or target + (MICROMIPSOP_*_FS) + + Coprocessor instructions: + "E" 5-bit target register (MICROMIPSOP_*_RT) + "G" 5-bit source register (MICROMIPSOP_*_RS) + "H" 3-bit sel field for (D)MTC* and (D)MFC* (MICROMIPSOP_*_SEL) + + Macro instructions: + "A" general 32 bit expression + "I" 32-bit immediate (value placed in imm_expr). + "F" 64-bit floating point constant in .rdata + "L" 64-bit floating point constant in .lit8 + "f" 32-bit floating point constant + "l" 32-bit floating point constant in .lit4 + + DSP ASE usage: + "2" 2-bit unsigned immediate for byte align (MICROMIPSOP_*_BP) + "3" 3-bit unsigned immediate (MICROMIPSOP_*_SA3) + "4" 4-bit unsigned immediate (MICROMIPSOP_*_SA4) + "5" 8-bit unsigned immediate (MICROMIPSOP_*_IMM8) + "6" 5-bit unsigned immediate (MICROMIPSOP_*_RS) + "7" 2-bit DSP accumulator register (MICROMIPSOP_*_DSPACC) + "8" 6-bit unsigned immediate (MICROMIPSOP_*_WRDSP) + "0" 6-bit signed immediate (MICROMIPSOP_*_DSPSFT) + "@" 10-bit signed immediate (MICROMIPSOP_*_IMM10) + "^" 5-bit unsigned immediate (MICROMIPSOP_*_RD) + + microMIPS Enhanced VA Scheme: + "+j" 9-bit signed offset in bit 0 (OP_*_EVAOFFSET) + + MSA Extension: + "+d" 5-bit MSA register (FD) + "+e" 5-bit MSA register (FS) + "+h" 5-bit MSA register (FT) + "+k" 5-bit GPR at bit 6 + "+l" 5-bit MSA control register at bit 6 + "+n" 5-bit MSA control register at bit 11 + "+o" 5-bit vector element index at bit 16 + "+u" 4-bit vector element index at bit 16 + "+v" 3-bit vector element index at bit 16 + "+w" 2-bit vector element index at bit 16 + "+x" 5-bit shift amount at bit 16 + "+T" (-512 .. 511) << 0 at bit 16 + "+U" (-512 .. 511) << 1 at bit 16 + "+V" (-512 .. 511) << 2 at bit 16 + "+W" (-512 .. 511) << 3 at bit 16 + "+~" 2 bit LSA/DLSA shift amount from 1 to 4 at bit 6 + "+!" 3 bit unsigned bit position at bit 16 + "+@" 4 bit unsigned bit position at bit 16 + "+#" 6 bit unsigned bit position at bit 16 + "+$" 5 bit unsigned immediate at bit 16 + "+%" 5 bit signed immediate at bit 16 + "+^" 10 bit signed immediate at bit 11 + "+&" 0 vector element index + "+*" 5-bit register vector element index at bit 16 + "+|" 8-bit mask at bit 16 + + Other: + "()" parens surrounding optional value + "," separates operands + "+" start of extension sequence + "m" start of microMIPS extension sequence + + Characters used so far, for quick reference when adding more: + "12345678 0" + "<>(),+.@\^|~" + "ABCDEFGHI KLMN RST V " + "abcd f hijklmnopqrstuvw yz" + + Extension character sequences used so far ("+" followed by the + following), for quick reference when adding more: + "" + "~!@#$%^&*|" + "ABCEFGHTUVW" + "dehijklnouvwx" + + Extension character sequences used so far ("m" followed by the + following), for quick reference when adding more: + "" + "" + " BCDEFGHIJ LMNOPQ U WXYZ" + " bcdefghij lmn pq st xyz" +*/ + +extern const struct mips_operand *decode_micromips_operand (const char *); +extern const struct mips_opcode micromips_opcodes[]; +extern const int bfd_micromips_num_opcodes; + +/* A NOP insn impemented as "or at,at,zero". + Used to implement -mfix-loongson2f. */ +#define LOONGSON2F_NOP_INSN 0x00200825 + +#endif /* _MIPS_H_ */ diff --git a/include/opcode/mmix.h b/include/opcode/mmix.h new file mode 100644 index 0000000..f931545 --- /dev/null +++ b/include/opcode/mmix.h @@ -0,0 +1,187 @@ +/* mmix.h -- Header file for MMIX opcode table + Copyright (C) 2001, 2003, 2010 Free Software Foundation, Inc. + Written by Hans-Peter Nilsson (hp@bitrange.com) + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* We could have just a char*[] table indexed by the register number, but + that would not allow for synonyms. The table is terminated with an + entry with a NULL name. */ +struct mmix_spec_reg +{ + const char *name; + unsigned int number; +}; + +/* General indication of the type of instruction. */ +enum mmix_insn_type + { + mmix_type_pseudo, + mmix_type_normal, + mmix_type_branch, + mmix_type_condbranch, + mmix_type_memaccess_octa, + mmix_type_memaccess_tetra, + mmix_type_memaccess_wyde, + mmix_type_memaccess_byte, + mmix_type_memaccess_block, + mmix_type_jsr + }; + +/* Type of operands an instruction takes. Use when parsing assembly code + and disassembling. */ +enum mmix_operands_type + { + mmix_operands_none = 0, + + /* All operands are registers: "$X,$Y,$Z". */ + mmix_operands_regs, + + /* "$X,YZ", like SETH. */ + mmix_operands_reg_yz, + + /* The regular "$X,$Y,$Z|Z". + The Z is optional; if only "$X,$Y" is given, then "$X,$Y,0" is + assumed. */ + mmix_operands_regs_z_opt, + + /* The regular "$X,$Y,$Z|Z". */ + mmix_operands_regs_z, + + /* "Address"; only JMP. Zero operands allowed unless GNU syntax. */ + mmix_operands_jmp, + + /* "$X|X,$Y,$Z|Z": PUSHGO; like "3", but X can be expressed as an + integer. */ + mmix_operands_pushgo, + + /* Two registers or a register and a byte, like FLOT, possibly with + rounding: "$X,$Z|Z" or "$X,ROUND_MODE,$Z|Z". */ + mmix_operands_roundregs_z, + + /* "X,YZ", POP. Unless GNU syntax, zero or one operand is allowed. */ + mmix_operands_pop, + + /* Two registers, possibly with rounding: "$X,$Z" or + "$X,ROUND_MODE,$Z". */ + mmix_operands_roundregs, + + /* "XYZ", like SYNC. */ + mmix_operands_sync, + + /* "X,$Y,$Z|Z", like SYNCD. */ + mmix_operands_x_regs_z, + + /* "$X,Y,$Z|Z", like NEG and NEGU. The Y field is optional, default 0. */ + mmix_operands_neg, + + /* "$X,Address, like GETA or branches. */ + mmix_operands_regaddr, + + /* "$X|X,Address, like PUSHJ. */ + mmix_operands_pushj, + + /* "$X,spec_reg"; GET. */ + mmix_operands_get, + + /* "spec_reg,$Z|Z"; PUT. */ + mmix_operands_put, + + /* Two registers, "$X,$Y". */ + mmix_operands_set, + + /* "$X,0"; SAVE. */ + mmix_operands_save, + + /* "0,$Z"; UNSAVE. */ + mmix_operands_unsave, + + /* "X,Y,Z"; like SWYM or TRAP. Zero (or 1 if GNU syntax) to three + operands, interpreted as 0; XYZ; X, YZ and X, Y, Z. */ + mmix_operands_xyz_opt, + + /* Just "Z", like RESUME. Unless GNU syntax, the operand can be omitted + and will then be assumed zero. */ + mmix_operands_resume, + + /* These are specials to handle that pseudo-directives are specified + like ordinary insns when being mmixal-compatible. They signify the + specific pseudo-directive rather than the operands type. */ + + /* LOC. */ + mmix_operands_loc, + + /* PREFIX. */ + mmix_operands_prefix, + + /* BYTE. */ + mmix_operands_byte, + + /* WYDE. */ + mmix_operands_wyde, + + /* TETRA. */ + mmix_operands_tetra, + + /* OCTA. */ + mmix_operands_octa, + + /* LOCAL. */ + mmix_operands_local, + + /* BSPEC. */ + mmix_operands_bspec, + + /* ESPEC. */ + mmix_operands_espec, + }; + +struct mmix_opcode + { + const char *name; + unsigned long match; + unsigned long lose; + enum mmix_operands_type operands; + + /* This is used by the disassembly function. */ + enum mmix_insn_type type; + }; + +/* Declare the actual tables. */ +extern const struct mmix_opcode mmix_opcodes[]; + +/* This one is terminated with an entry with a NULL name. */ +extern const struct mmix_spec_reg mmix_spec_regs[]; + +/* Some insn values we use when padding and synthesizing address loads. */ +#define IMM_OFFSET_BIT 1 +#define COND_INV_BIT 0x8 +#define PRED_INV_BIT 0x10 + +#define PUSHGO_INSN_BYTE 0xbe +#define GO_INSN_BYTE 0x9e +#define SETL_INSN_BYTE 0xe3 +#define INCML_INSN_BYTE 0xe6 +#define INCMH_INSN_BYTE 0xe5 +#define INCH_INSN_BYTE 0xe4 +#define SWYM_INSN_BYTE 0xfd +#define JMP_INSN_BYTE 0xf0 + +/* We can have 256 - 32 (local registers) - 1 ($255 is not allocatable) + global registers. */ +#define MAX_GREGS 223 diff --git a/include/opcode/mn10200.h b/include/opcode/mn10200.h new file mode 100644 index 0000000..b597d7b --- /dev/null +++ b/include/opcode/mn10200.h @@ -0,0 +1,111 @@ +/* mn10200.h -- Header file for Matsushita 10200 opcode table + Copyright 1996, 1997, 2010 Free Software Foundation, Inc. + Written by Jeff Law, Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef MN10200_H +#define MN10200_H + +/* The opcode table is an array of struct mn10200_opcode. */ + +struct mn10200_opcode +{ + /* The opcode name. */ + const char *name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + unsigned long opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + unsigned long mask; + + /* The format of this opcode. */ + unsigned char format; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[8]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct mn10200_opcode mn10200_opcodes[]; +extern const int mn10200_num_opcodes; + + +/* The operands table is an array of struct mn10200_operand. */ + +struct mn10200_operand +{ + /* The number of bits in the operand. */ + int bits; + + /* How far the operand is left shifted in the instruction. */ + int shift; + + /* One bit syntax flags. */ + int flags; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the mn10200_opcodes table. */ + +extern const struct mn10200_operand mn10200_operands[]; + +/* Values defined for the flags field of a struct mn10200_operand. */ +#define MN10200_OPERAND_DREG 0x1 + +#define MN10200_OPERAND_AREG 0x2 + +#define MN10200_OPERAND_PSW 0x4 + +#define MN10200_OPERAND_MDR 0x8 + +#define MN10200_OPERAND_SIGNED 0x10 + +#define MN10200_OPERAND_PROMOTE 0x20 + +#define MN10200_OPERAND_PAREN 0x40 + +#define MN10200_OPERAND_REPEATED 0x80 + +#define MN10200_OPERAND_EXTENDED 0x100 + +#define MN10200_OPERAND_NOCHECK 0x200 + +#define MN10200_OPERAND_PCREL 0x400 + +#define MN10200_OPERAND_MEMADDR 0x800 + +#define MN10200_OPERAND_RELAX 0x1000 + +#define FMT_1 1 +#define FMT_2 2 +#define FMT_3 3 +#define FMT_4 4 +#define FMT_5 5 +#define FMT_6 6 +#define FMT_7 7 +#endif /* MN10200_H */ diff --git a/include/opcode/mn10300.h b/include/opcode/mn10300.h new file mode 100644 index 0000000..16a139b --- /dev/null +++ b/include/opcode/mn10300.h @@ -0,0 +1,170 @@ +/* mn10300.h -- Header file for Matsushita 10300 opcode table + Copyright 1996, 1997, 1998, 1999, 2003, 2010 Free Software Foundation, Inc. + Written by Jeff Law, Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef MN10300_H +#define MN10300_H + +/* The opcode table is an array of struct mn10300_opcode. */ + +#define MN10300_MAX_OPERANDS 8 +struct mn10300_opcode +{ + /* The opcode name. */ + const char *name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + unsigned long opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + unsigned long mask; + + /* A bitmask. For each operand, nonzero if it must not have the same + register specification as all other operands with a nonzero bit in + this flag. ie 0x81 would indicate that operands 7 and 0 must not + match. Note that we count operands from left to right as they appear + in the operands specification below. */ + unsigned int no_match_operands; + + /* The format of this opcode. */ + unsigned char format; + + /* Bitmask indicating what cpu variants this opcode is available on. + We assume mn10300 base opcodes are available everywhere, so we only + have to note opcodes which are available on other variants. */ + unsigned int machine; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[MN10300_MAX_OPERANDS]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct mn10300_opcode mn10300_opcodes[]; +extern const int mn10300_num_opcodes; + + +/* The operands table is an array of struct mn10300_operand. */ + +struct mn10300_operand +{ + /* The number of bits in the operand. */ + int bits; + + /* How far the operand is left shifted in the instruction. */ + int shift; + + /* One bit syntax flags. */ + int flags; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the mn10300_opcodes table. */ + +extern const struct mn10300_operand mn10300_operands[]; + +/* Values defined for the flags field of a struct mn10300_operand. */ +#define MN10300_OPERAND_DREG 0x1 + +#define MN10300_OPERAND_AREG 0x2 + +#define MN10300_OPERAND_SP 0x4 + +#define MN10300_OPERAND_PSW 0x8 + +#define MN10300_OPERAND_MDR 0x10 + +#define MN10300_OPERAND_SIGNED 0x20 + +#define MN10300_OPERAND_PROMOTE 0x40 + +#define MN10300_OPERAND_PAREN 0x80 + +#define MN10300_OPERAND_REPEATED 0x100 + +#define MN10300_OPERAND_EXTENDED 0x200 + +#define MN10300_OPERAND_SPLIT 0x400 + +#define MN10300_OPERAND_REG_LIST 0x800 + +#define MN10300_OPERAND_PCREL 0x1000 + +#define MN10300_OPERAND_MEMADDR 0x2000 + +#define MN10300_OPERAND_RELAX 0x4000 + +#define MN10300_OPERAND_USP 0x8000 + +#define MN10300_OPERAND_SSP 0x10000 + +#define MN10300_OPERAND_MSP 0x20000 + +#define MN10300_OPERAND_PC 0x40000 + +#define MN10300_OPERAND_EPSW 0x80000 + +#define MN10300_OPERAND_RREG 0x100000 + +#define MN10300_OPERAND_XRREG 0x200000 + +#define MN10300_OPERAND_PLUS 0x400000 + +#define MN10300_OPERAND_24BIT 0x800000 + +#define MN10300_OPERAND_FSREG 0x1000000 + +#define MN10300_OPERAND_FDREG 0x2000000 + +#define MN10300_OPERAND_FPCR 0x4000000 + +/* Opcode Formats. */ +#define FMT_S0 1 +#define FMT_S1 2 +#define FMT_S2 3 +#define FMT_S4 4 +#define FMT_S6 5 +#define FMT_D0 6 +#define FMT_D1 7 +#define FMT_D2 8 +#define FMT_D4 9 +#define FMT_D5 10 +#define FMT_D6 11 +#define FMT_D7 12 +#define FMT_D8 13 +#define FMT_D9 14 +#define FMT_D10 15 +#define FMT_D3 16 + +/* Variants of the mn10300 which have additional opcodes. */ +#define MN103 300 +#define AM30 300 + +#define AM33 330 +#define AM33_2 332 + +#endif /* MN10300_H */ diff --git a/include/opcode/moxie.h b/include/opcode/moxie.h new file mode 100644 index 0000000..dae40c8 --- /dev/null +++ b/include/opcode/moxie.h @@ -0,0 +1,74 @@ +/* Definitions for decoding the moxie opcode table. + Copyright 2009 Free Software Foundation, Inc. + Contributed by Anthony Green (green@moxielogic.com). + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* Form 1 instructions come in different flavors: + + Some have no arguments (MOXIE_F1_NARG) + Some only use the A operand (MOXIE_F1_A) + Some use A and B registers (MOXIE_F1_AB) + Some use A and consume a 4 byte immediate value (MOXIE_F1_A4) + Some use just a 4 byte immediate value (MOXIE_F1_4) + Some use just a 4 byte memory address (MOXIE_F1_M) + Some use B and an indirect A (MOXIE_F1_AiB) + Some use A and an indirect B (MOXIE_F1_ABi) + Some consume a 4 byte immediate value and use X (MOXIE_F1_4A) + Some use B and an indirect A plus 4 bytes (MOXIE_F1_AiB4) + Some use A and an indirect B plus 4 bytes (MOXIE_F1_ABi4) + + Form 2 instructions also come in different flavors: + + Some have no arguments (MOXIE_F2_NARG) + Some use the A register and an 8-bit value (MOXIE_F2_A8V) + + Form 3 instructions also come in different flavors: + + Some have no arguments (MOXIE_F3_NARG) + Some have a 10-bit PC relative operand (MOXIE_F3_PCREL). */ + +#define MOXIE_F1_NARG 0x100 +#define MOXIE_F1_A 0x101 +#define MOXIE_F1_AB 0x102 +/* #define MOXIE_F1_ABC 0x103 */ +#define MOXIE_F1_A4 0x104 +#define MOXIE_F1_4 0x105 +#define MOXIE_F1_AiB 0x106 +#define MOXIE_F1_ABi 0x107 +#define MOXIE_F1_4A 0x108 +#define MOXIE_F1_AiB4 0x109 +#define MOXIE_F1_ABi4 0x10a +#define MOXIE_F1_M 0x10b + +#define MOXIE_F2_NARG 0x200 +#define MOXIE_F2_A8V 0x201 + +#define MOXIE_F3_NARG 0x300 +#define MOXIE_F3_PCREL 0x301 + +#define MOXIE_BAD 0x400 + +typedef struct moxie_opc_info_t +{ + short opcode; + unsigned itype; + const char * name; +} moxie_opc_info_t; + +extern const moxie_opc_info_t moxie_form1_opc_info[128]; +extern const moxie_opc_info_t moxie_form2_opc_info[4]; +extern const moxie_opc_info_t moxie_form3_opc_info[16]; diff --git a/include/opcode/msp430-decode.h b/include/opcode/msp430-decode.h new file mode 100644 index 0000000..0653ade --- /dev/null +++ b/include/opcode/msp430-decode.h @@ -0,0 +1,130 @@ +/* Opcode decoder for the TI MSP430 + Copyright 2012-2013 Free Software Foundation, Inc. + Written by DJ Delorie + + This file is part of GDB, the GNU Debugger. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +typedef enum +{ + MSO_unknown, + /* Double-operand instructions - all repeat .REPEATS times. */ + MSO_mov, /* dest = src */ + MSO_add, /* dest += src */ + MSO_addc, /* dest += src + carry */ + MSO_subc, /* dest -= (src-1) + carry */ + MSO_sub, /* dest -= src */ + MSO_cmp, /* dest - src -> status */ + MSO_dadd, /* dest += src (as BCD) */ + MSO_bit, /* dest & src -> status */ + MSO_bic, /* dest &= ~src (bit clear) */ + MSO_bis, /* dest |= src (bit set, OR) */ + MSO_xor, /* dest ^= src */ + MSO_and, /* dest &= src */ + + /* Single-operand instructions. */ + MSO_rrc, /* Rotate through carry, dest >>= .REPEATS. */ + MSO_swpb, /* Swap lower bytes of operand. */ + MSO_rra, /* Signed shift dest >>= .REPEATS. */ + MSO_sxt, /* Sign extend lower byte. */ + MSO_push, /* Push .REPEATS registers (or other op) starting at SRC going towards R0. */ + MSO_pop, /* Pop .REPEATS registers starting at DEST going towards R15. */ + MSO_call, + MSO_reti, + + /* Jumps. */ + MSO_jmp, /* PC = SRC if .COND true. */ + + /* Extended single-operand instructions. */ + MSO_rru, /* Unsigned shift right, dest >>= .REPEATS. */ + +} MSP430_Opcode_ID; + +typedef enum +{ + MSP430_Operand_None, + MSP430_Operand_Immediate, + MSP430_Operand_Register, + MSP430_Operand_Indirect, + MSP430_Operand_Indirect_Postinc +} MSP430_Operand_Type; + +typedef enum +{ + MSR_0 = 0, + MSR_PC = 0, + MSR_SP = 1, + MSR_SR = 2, + MSR_CG = 3, + MSR_None = 16, +} MSP430_Register; + +typedef struct +{ + MSP430_Operand_Type type; + int addend; + MSP430_Register reg : 8; + MSP430_Register reg2 : 8; + unsigned char bit_number : 4; + unsigned char condition : 3; +} MSP430_Opcode_Operand; + +typedef enum +{ + MSP430_Byte = 0, + MSP430_Word, + MSP430_Addr +} MSP430_Size; + +/* These numerically match the bit encoding. */ +typedef enum +{ + MSC_nz = 0, + MSC_z, + MSC_nc, + MSC_c, + MSC_n, + MSC_ge, + MSC_l, + MSC_true, +} MSP430_Condition; + +#define MSP430_FLAG_C 0x01 +#define MSP430_FLAG_Z 0x02 +#define MSP430_FLAG_N 0x04 +#define MSP430_FLAG_V 0x80 + +typedef struct +{ + int lineno; + MSP430_Opcode_ID id; + unsigned flags_1:8; /* These flags are set to '1' by the insn. */ + unsigned flags_0:8; /* These flags are set to '0' by the insn. */ + unsigned flags_set:8; /* These flags are set appropriately by the insn. */ + unsigned zc:1; /* If set, pretend the carry bit is zero. */ + unsigned repeat_reg:1; /* If set, count is in REG[repeats]. */ + unsigned ofs_430x:1; /* If set, the offset in any operand is 430x (else use 430 compatibility mode). */ + unsigned repeats:5; /* Contains COUNT-1, or register number. */ + int n_bytes; /* Opcode size in BYTES. */ + char * syntax; + MSP430_Size size; /* Operand size in BITS. */ + MSP430_Condition cond; + /* By convention, these are [0]destination, [1]source. */ + MSP430_Opcode_Operand op[2]; +} MSP430_Opcode_Decoded; + +int msp430_decode_opcode (unsigned long, MSP430_Opcode_Decoded *, int (*)(void *), void *); diff --git a/include/opcode/msp430.h b/include/opcode/msp430.h new file mode 100644 index 0000000..caddc42 --- /dev/null +++ b/include/opcode/msp430.h @@ -0,0 +1,194 @@ +/* Opcode table for the TI MSP430 microcontrollers + + Copyright 2002-2013 Free Software Foundation, Inc. + Contributed by Dmitry Diky + + 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, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef __MSP430_H_ +#define __MSP430_H_ + +struct msp430_operand_s +{ + int ol; /* Operand length words. */ + int am; /* Addr mode. */ + int reg; /* Register. */ + int mode; /* Pperand mode. */ +#define OP_REG 0 +#define OP_EXP 1 +#ifndef DASM_SECTION + expressionS exp; +#endif +}; + +#define BYTE_OPERATION (1 << 6) /* Byte operation flag for all instructions. */ + +struct msp430_opcode_s +{ + char *name; + int fmt; + int insn_opnumb; + int bin_opcode; + int bin_mask; +}; + +#define MSP_INSN(name, size, numb, bin, mask) { #name, size, numb, bin, mask } + +static struct msp430_opcode_s msp430_opcodes[] = +{ + MSP_INSN (and, 1, 2, 0xf000, 0xf000), + MSP_INSN (inv, 0, 1, 0xe330, 0xfff0), + MSP_INSN (xor, 1, 2, 0xe000, 0xf000), + MSP_INSN (setz, 0, 0, 0xd322, 0xffff), + MSP_INSN (setc, 0, 0, 0xd312, 0xffff), + MSP_INSN (eint, 0, 0, 0xd232, 0xffff), + MSP_INSN (setn, 0, 0, 0xd222, 0xffff), + MSP_INSN (bis, 1, 2, 0xd000, 0xf000), + MSP_INSN (clrz, 0, 0, 0xc322, 0xffff), + MSP_INSN (clrc, 0, 0, 0xc312, 0xffff), + MSP_INSN (dint, 0, 0, 0xc232, 0xffff), + MSP_INSN (clrn, 0, 0, 0xc222, 0xffff), + MSP_INSN (bic, 1, 2, 0xc000, 0xf000), + MSP_INSN (bit, 1, 2, 0xb000, 0xf000), + MSP_INSN (dadc, 0, 1, 0xa300, 0xff30), + MSP_INSN (dadd, 1, 2, 0xa000, 0xf000), + MSP_INSN (tst, 0, 1, 0x9300, 0xff30), + MSP_INSN (cmp, 1, 2, 0x9000, 0xf000), + MSP_INSN (decd, 0, 1, 0x8320, 0xff30), + MSP_INSN (dec, 0, 1, 0x8310, 0xff30), + MSP_INSN (sub, 1, 2, 0x8000, 0xf000), + MSP_INSN (sbc, 0, 1, 0x7300, 0xff30), + MSP_INSN (subc, 1, 2, 0x7000, 0xf000), + MSP_INSN (adc, 0, 1, 0x6300, 0xff30), + MSP_INSN (rlc, 0, 2, 0x6000, 0xf000), + MSP_INSN (addc, 1, 2, 0x6000, 0xf000), + MSP_INSN (incd, 0, 1, 0x5320, 0xff30), + MSP_INSN (inc, 0, 1, 0x5310, 0xff30), + MSP_INSN (rla, 0, 2, 0x5000, 0xf000), + MSP_INSN (add, 1, 2, 0x5000, 0xf000), + MSP_INSN (nop, 0, 0, 0x4303, 0xffff), + MSP_INSN (clr, 0, 1, 0x4300, 0xff30), + MSP_INSN (ret, 0, 0, 0x4130, 0xff30), + MSP_INSN (pop, 0, 1, 0x4130, 0xff30), + MSP_INSN (br, 0, 3, 0x4000, 0xf000), + MSP_INSN (mov, 1, 2, 0x4000, 0xf000), + MSP_INSN (jmp, 3, 1, 0x3c00, 0xfc00), + MSP_INSN (jl, 3, 1, 0x3800, 0xfc00), + MSP_INSN (jge, 3, 1, 0x3400, 0xfc00), + MSP_INSN (jn, 3, 1, 0x3000, 0xfc00), + MSP_INSN (jc, 3, 1, 0x2c00, 0xfc00), + MSP_INSN (jhs, 3, 1, 0x2c00, 0xfc00), + MSP_INSN (jnc, 3, 1, 0x2800, 0xfc00), + MSP_INSN (jlo, 3, 1, 0x2800, 0xfc00), + MSP_INSN (jz, 3, 1, 0x2400, 0xfc00), + MSP_INSN (jeq, 3, 1, 0x2400, 0xfc00), + MSP_INSN (jnz, 3, 1, 0x2000, 0xfc00), + MSP_INSN (jne, 3, 1, 0x2000, 0xfc00), + MSP_INSN (reti, 2, 0, 0x1300, 0xffc0), + MSP_INSN (call, 2, 1, 0x1280, 0xffc0), + MSP_INSN (push, 2, 1, 0x1200, 0xff80), + MSP_INSN (sxt, 2, 1, 0x1180, 0xffc0), + MSP_INSN (rra, 2, 1, 0x1100, 0xff80), + MSP_INSN (swpb, 2, 1, 0x1080, 0xffc0), + MSP_INSN (rrc, 2, 1, 0x1000, 0xff80), + /* Simple polymorphs. */ + MSP_INSN (beq, 4, 0, 0, 0xffff), + MSP_INSN (bne, 4, 1, 0, 0xffff), + MSP_INSN (blt, 4, 2, 0, 0xffff), + MSP_INSN (bltu, 4, 3, 0, 0xffff), + MSP_INSN (bge, 4, 4, 0, 0xffff), + MSP_INSN (bgeu, 4, 5, 0, 0xffff), + MSP_INSN (bltn, 4, 6, 0, 0xffff), + MSP_INSN (jump, 4, 7, 0, 0xffff), + /* Long polymorphs. */ + MSP_INSN (bgt, 5, 0, 0, 0xffff), + MSP_INSN (bgtu, 5, 1, 0, 0xffff), + MSP_INSN (bleu, 5, 2, 0, 0xffff), + MSP_INSN (ble, 5, 3, 0, 0xffff), + + /* MSP430X instructions - these ones use an extension word. + A negative format indicates an MSP430X instruction. */ + MSP_INSN (addcx, -2, 2, 0x6000, 0xf000), + MSP_INSN (addx, -2, 2, 0x5000, 0xf000), + MSP_INSN (andx, -2, 2, 0xf000, 0xf000), + MSP_INSN (bicx, -2, 2, 0xc000, 0xf000), + MSP_INSN (bisx, -2, 2, 0xd000, 0xf000), + MSP_INSN (bitx, -2, 2, 0xb000, 0xf000), + MSP_INSN (cmpx, -2, 2, 0x9000, 0xf000), + MSP_INSN (daddx, -2, 2, 0xa000, 0xf000), + MSP_INSN (movx, -2, 2, 0x4000, 0xf000), + MSP_INSN (subcx, -2, 2, 0x7000, 0xf000), + MSP_INSN (subx, -2, 2, 0x8000, 0xf000), + MSP_INSN (xorx, -2, 2, 0xe000, 0xf000), + + /* MSP430X Synthetic instructions. */ + MSP_INSN (adcx, -1, 1, 0x6300, 0xff30), + MSP_INSN (clra, -1, 1, 0x4300, 0xff30), + MSP_INSN (clrx, -1, 1, 0x4300, 0xff30), + MSP_INSN (dadcx, -1, 1, 0xa300, 0xff30), + MSP_INSN (decx, -1, 1, 0x8310, 0xff30), + MSP_INSN (decda, -1, 1, 0x8320, 0xff30), + MSP_INSN (decdx, -1, 1, 0x8320, 0xff30), + MSP_INSN (incx, -1, 1, 0x5310, 0xff30), + MSP_INSN (incda, -1, 1, 0x5320, 0xff30), + MSP_INSN (incdx, -1, 1, 0x5320, 0xff30), + MSP_INSN (invx, -1, 1, 0xe330, 0xfff0), + MSP_INSN (popx, -1, 1, 0x4130, 0xff30), + MSP_INSN (rlax, -1, 2, 0x5000, 0xf000), + MSP_INSN (rlcx, -1, 2, 0x6000, 0xf000), + MSP_INSN (sbcx, -1, 1, 0x7300, 0xff30), + MSP_INSN (tsta, -1, 1, 0x9300, 0xff30), + MSP_INSN (tstx, -1, 1, 0x9300, 0xff30), + + MSP_INSN (pushx, -3, 1, 0x1200, 0xff80), + MSP_INSN (rrax, -3, 1, 0x1100, 0xff80), + MSP_INSN (rrcx, -3, 1, 0x1000, 0xff80), + MSP_INSN (swpbx, -3, 1, 0x1080, 0xffc0), + MSP_INSN (sxtx, -3, 1, 0x1180, 0xffc0), + + /* MSP430X Address instructions - no extension word needed. + The insn_opnumb field is used to encode the nature of the + instruction for assembly and disassembly purposes. */ + MSP_INSN (calla, -1, 4, 0x1300, 0xff00), + + MSP_INSN (popm, -1, 5, 0x1600, 0xfe00), + MSP_INSN (pushm, -1, 5, 0x1400, 0xfe00), + + MSP_INSN (rrcm, -1, 6, 0x0040, 0xf3e0), + MSP_INSN (rram, -1, 6, 0x0140, 0xf3e0), + MSP_INSN (rlam, -1, 6, 0x0240, 0xf3e0), + MSP_INSN (rrum, -1, 6, 0x0340, 0xf3e0), + + MSP_INSN (rrux, -1, 7, 0x0340, 0xffe0), /* Synthesized in terms of RRUM. */ + + MSP_INSN (adda, -1, 8, 0x00a0, 0xf0b0), + MSP_INSN (cmpa, -1, 8, 0x0090, 0xf0b0), + MSP_INSN (suba, -1, 8, 0x00b0, 0xf0b0), + + MSP_INSN (reta, -1, 9, 0x0110, 0xffff), + MSP_INSN (bra, -1, 9, 0x0000, 0xf0cf), + MSP_INSN (mova, -1, 9, 0x0000, 0xf080), + MSP_INSN (mova, -1, 9, 0x0080, 0xf0b0), + MSP_INSN (mova, -1, 9, 0x00c0, 0xf0f0), + + /* Pseudo instruction to set the repeat field in the extension word. */ + MSP_INSN (rpt, -1, 10, 0x0000, 0x0000), + + /* End of instruction set. */ + { NULL, 0, 0, 0, 0 } +}; + +#endif diff --git a/include/opcode/nios2.h b/include/opcode/nios2.h new file mode 100644 index 0000000..aa67098 --- /dev/null +++ b/include/opcode/nios2.h @@ -0,0 +1,522 @@ +/* Nios II opcode list for GAS, the GNU assembler. + Copyright (C) 2012, 2013 Free Software Foundation, Inc. + Contributed by Nigel Gray (ngray@altera.com). + Contributed by Mentor Graphics, Inc. + + This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler. + + GAS/GDB 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, or (at your option) + any later version. + + GAS/GDB 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 GAS or GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#ifndef _NIOS2_H_ +#define _NIOS2_H_ + +#include "bfd.h" + +/**************************************************************************** + * This file contains structures, bit masks and shift counts used + * by the GNU toolchain to define the Nios II instruction set and + * access various opcode fields. + ****************************************************************************/ + +/* Identify different overflow situations for error messages. */ +enum overflow_type +{ + call_target_overflow = 0, + branch_target_overflow, + address_offset_overflow, + signed_immed16_overflow, + unsigned_immed16_overflow, + unsigned_immed5_overflow, + custom_opcode_overflow, + no_overflow +}; + +/* This structure holds information for a particular instruction. + + The args field is a string describing the operands. The following + letters can appear in the args: + c - a 5-bit control register index + d - a 5-bit destination register index + s - a 5-bit left source register index + t - a 5-bit right source register index + i - a 16-bit signed immediate + u - a 16-bit unsigned immediate + o - a 16-bit signed program counter relative offset + j - a 5-bit unsigned immediate + b - a 5-bit break instruction constant + l - a 8-bit custom instruction constant + m - a 26-bit unsigned immediate + Literal ',', '(', and ')' characters may also appear in the args as + delimiters. + + The pinfo field is INSN_MACRO for a macro. Otherwise, it is a collection + of bits describing the instruction, notably any relevant hazard + information. + + When assembling, the match field contains the opcode template, which + is modified by the arguments to produce the actual opcode + that is emitted. If pinfo is INSN_MACRO, then this is 0. + + If pinfo is INSN_MACRO, the mask field stores the macro identifier. + Otherwise this is a bit mask for the relevant portions of the opcode + when disassembling. If the actual opcode anded with the match field + equals the opcode field, then we have found the correct instruction. */ + +struct nios2_opcode +{ + const char *name; /* The name of the instruction. */ + const char *args; /* A string describing the arguments for this + instruction. */ + const char *args_test; /* Like args, but with an extra argument for + the expected opcode. */ + unsigned long num_args; /* The number of arguments the instruction + takes. */ + unsigned long match; /* The basic opcode for the instruction. */ + unsigned long mask; /* Mask for the opcode field of the + instruction. */ + unsigned long pinfo; /* Is this a real instruction or instruction + macro? */ + enum overflow_type overflow_msg; /* Used to generate informative + message when fixup overflows. */ +}; + +/* This value is used in the nios2_opcode.pinfo field to indicate that the + instruction is a macro or pseudo-op. This requires special treatment by + the assembler, and is used by the disassembler to determine whether to + check for a nop. */ +#define NIOS2_INSN_MACRO 0x80000000 +#define NIOS2_INSN_MACRO_MOV 0x80000001 +#define NIOS2_INSN_MACRO_MOVI 0x80000002 +#define NIOS2_INSN_MACRO_MOVIA 0x80000004 + +#define NIOS2_INSN_RELAXABLE 0x40000000 +#define NIOS2_INSN_UBRANCH 0x00000010 +#define NIOS2_INSN_CBRANCH 0x00000020 +#define NIOS2_INSN_CALL 0x00000040 + +#define NIOS2_INSN_ADDI 0x00000080 +#define NIOS2_INSN_ANDI 0x00000100 +#define NIOS2_INSN_ORI 0x00000200 +#define NIOS2_INSN_XORI 0x00000400 + + +/* Associates a register name ($6) with a 5-bit index (eg 6). */ +struct nios2_reg +{ + const char *name; + const int index; +}; + + +/* These are bit masks and shift counts for accessing the various + fields of a Nios II instruction. */ + +/* Macros for getting and setting an instruction field. */ +#define GET_INSN_FIELD(X, i) \ + (((i) & OP_MASK_##X) >> OP_SH_##X) +#define SET_INSN_FIELD(X, i, j) \ + ((i) = (((i) & ~OP_MASK_##X) | (((j) << OP_SH_##X) & OP_MASK_##X))) + +/* Instruction field definitions. */ +#define IW_A_LSB 27 +#define IW_A_MSB 31 +#define IW_A_SZ 5 +#define IW_A_MASK 0x1f + +#define IW_B_LSB 22 +#define IW_B_MSB 26 +#define IW_B_SZ 5 +#define IW_B_MASK 0x1f + +#define IW_C_LSB 17 +#define IW_C_MSB 21 +#define IW_C_SZ 5 +#define IW_C_MASK 0x1f + +#define IW_IMM16_LSB 6 +#define IW_IMM16_MSB 21 +#define IW_IMM16_SZ 16 +#define IW_IMM16_MASK 0xffff + +#define IW_IMM26_LSB 6 +#define IW_IMM26_MSB 31 +#define IW_IMM26_SZ 26 +#define IW_IMM26_MASK 0x3ffffff + +#define IW_OP_LSB 0 +#define IW_OP_MSB 5 +#define IW_OP_SZ 6 +#define IW_OP_MASK 0x3f + +#define IW_OPX_LSB 11 +#define IW_OPX_MSB 16 +#define IW_OPX_SZ 6 +#define IW_OPX_MASK 0x3f + +#define IW_SHIFT_IMM5_LSB 6 +#define IW_SHIFT_IMM5_MSB 10 +#define IW_SHIFT_IMM5_SZ 5 +#define IW_SHIFT_IMM5_MASK 0x1f + +#define IW_CONTROL_REGNUM_LSB 6 +#define IW_CONTROL_REGNUM_MSB 9 +#define IW_CONTROL_REGNUM_SZ 4 +#define IW_CONTROL_REGNUM_MASK 0xf + +/* Operator mask and shift. */ +#define OP_MASK_OP (IW_OP_MASK << IW_OP_LSB) +#define OP_SH_OP IW_OP_LSB + +/* Masks and shifts for I-type instructions. */ +#define OP_MASK_IOP (IW_OP_MASK << IW_OP_LSB) +#define OP_SH_IOP IW_OP_LSB + +#define OP_MASK_IMM16 (IW_IMM16_MASK << IW_IMM16_LSB) +#define OP_SH_IMM16 IW_IMM16_LSB + +#define OP_MASK_IRD (IW_B_MASK << IW_B_LSB) +#define OP_SH_IRD IW_B_LSB /* The same as T for I-type. */ + +#define OP_MASK_IRT (IW_B_MASK << IW_B_LSB) +#define OP_SH_IRT IW_B_LSB + +#define OP_MASK_IRS (IW_A_MASK << IW_A_LSB) +#define OP_SH_IRS IW_A_LSB + +/* Masks and shifts for R-type instructions. */ +#define OP_MASK_ROP (IW_OP_MASK << IW_OP_LSB) +#define OP_SH_ROP IW_OP_LSB + +#define OP_MASK_ROPX (IW_OPX_MASK << IW_OPX_LSB) +#define OP_SH_ROPX IW_OPX_LSB + +#define OP_MASK_RRD (IW_C_MASK << IW_C_LSB) +#define OP_SH_RRD IW_C_LSB + +#define OP_MASK_RRT (IW_B_MASK << IW_B_LSB) +#define OP_SH_RRT IW_B_LSB + +#define OP_MASK_RRS (IW_A_MASK << IW_A_LSB) +#define OP_SH_RRS IW_A_LSB + +/* Masks and shifts for J-type instructions. */ +#define OP_MASK_JOP (IW_OP_MASK << IW_OP_LSB) +#define OP_SH_JOP IW_OP_LSB + +#define OP_MASK_IMM26 (IW_IMM26_MASK << IW_IMM26_LSB) +#define OP_SH_IMM26 IW_IMM26_LSB + +/* Masks and shifts for CTL instructions. */ +#define OP_MASK_RCTL 0x000007c0 +#define OP_SH_RCTL 6 + +/* Break instruction imm5 field. */ +#define OP_MASK_TRAP_IMM5 0x000007c0 +#define OP_SH_TRAP_IMM5 6 + +/* Instruction imm5 field. */ +#define OP_MASK_IMM5 (IW_SHIFT_IMM5_MASK << IW_SHIFT_IMM5_LSB) +#define OP_SH_IMM5 IW_SHIFT_IMM5_LSB + +/* Cache operation fields (type j,i(s)). */ +#define OP_MASK_CACHE_OPX (IW_B_MASK << IW_B_LSB) +#define OP_SH_CACHE_OPX IW_B_LSB +#define OP_MASK_CACHE_RRS (IW_A_MASK << IW_A_LSB) +#define OP_SH_CACHE_RRS IW_A_LSB + +/* Custom instruction masks. */ +#define OP_MASK_CUSTOM_A 0x00010000 +#define OP_SH_CUSTOM_A 16 + +#define OP_MASK_CUSTOM_B 0x00008000 +#define OP_SH_CUSTOM_B 15 + +#define OP_MASK_CUSTOM_C 0x00004000 +#define OP_SH_CUSTOM_C 14 + +#define OP_MASK_CUSTOM_N 0x00003fc0 +#define OP_SH_CUSTOM_N 6 +#define OP_MAX_CUSTOM_N 255 + +/* OP instruction values. */ +#define OP_ADDI 4 +#define OP_ANDHI 44 +#define OP_ANDI 12 +#define OP_BEQ 38 +#define OP_BGE 14 +#define OP_BGEU 46 +#define OP_BLT 22 +#define OP_BLTU 54 +#define OP_BNE 30 +#define OP_BR 6 +#define OP_CALL 0 +#define OP_CMPEQI 32 +#define OP_CMPGEI 8 +#define OP_CMPGEUI 40 +#define OP_CMPLTI 16 +#define OP_CMPLTUI 48 +#define OP_CMPNEI 24 +#define OP_CUSTOM 50 +#define OP_FLUSHD 59 +#define OP_FLUSHDA 27 +#define OP_INITD 51 +#define OP_INITDA 19 +#define OP_JMPI 1 +#define OP_LDB 7 +#define OP_LDBIO 39 +#define OP_LDBU 3 +#define OP_LDBUIO 35 +#define OP_LDH 15 +#define OP_LDHIO 47 +#define OP_LDHU 11 +#define OP_LDHUIO 43 +#define OP_LDL 31 +#define OP_LDW 23 +#define OP_LDWIO 55 +#define OP_MULI 36 +#define OP_OPX 58 +#define OP_ORHI 52 +#define OP_ORI 20 +#define OP_RDPRS 56 +#define OP_STB 5 +#define OP_STBIO 37 +#define OP_STC 29 +#define OP_STH 13 +#define OP_STHIO 45 +#define OP_STW 21 +#define OP_STWIO 53 +#define OP_XORHI 60 +#define OP_XORI 28 + +/* OPX instruction values. */ +#define OPX_ADD 49 +#define OPX_AND 14 +#define OPX_BREAK 52 +#define OPX_BRET 9 +#define OPX_CALLR 29 +#define OPX_CMPEQ 32 +#define OPX_CMPGE 8 +#define OPX_CMPGEU 40 +#define OPX_CMPLT 16 +#define OPX_CMPLTU 48 +#define OPX_CMPNE 24 +#define OPX_CRST 62 +#define OPX_DIV 37 +#define OPX_DIVU 36 +#define OPX_ERET 1 +#define OPX_FLUSHI 12 +#define OPX_FLUSHP 4 +#define OPX_HBREAK 53 +#define OPX_INITI 41 +#define OPX_INTR 61 +#define OPX_JMP 13 +#define OPX_MUL 39 +#define OPX_MULXSS 31 +#define OPX_MULXSU 23 +#define OPX_MULXUU 7 +#define OPX_NEXTPC 28 +#define OPX_NOR 6 +#define OPX_OR 22 +#define OPX_RDCTL 38 +#define OPX_RET 5 +#define OPX_ROL 3 +#define OPX_ROLI 2 +#define OPX_ROR 11 +#define OPX_SLL 19 +#define OPX_SLLI 18 +#define OPX_SRA 59 +#define OPX_SRAI 58 +#define OPX_SRL 27 +#define OPX_SRLI 26 +#define OPX_SUB 57 +#define OPX_SYNC 54 +#define OPX_TRAP 45 +#define OPX_WRCTL 46 +#define OPX_WRPRS 20 +#define OPX_XOR 30 + +/* The following macros define the opcode matches for each + instruction code & OP_MASK_INST == OP_MATCH_INST. */ + +/* OP instruction matches. */ +#define OP_MATCH_ADDI OP_ADDI +#define OP_MATCH_ANDHI OP_ANDHI +#define OP_MATCH_ANDI OP_ANDI +#define OP_MATCH_BEQ OP_BEQ +#define OP_MATCH_BGE OP_BGE +#define OP_MATCH_BGEU OP_BGEU +#define OP_MATCH_BLT OP_BLT +#define OP_MATCH_BLTU OP_BLTU +#define OP_MATCH_BNE OP_BNE +#define OP_MATCH_BR OP_BR +#define OP_MATCH_FLUSHD OP_FLUSHD +#define OP_MATCH_FLUSHDA OP_FLUSHDA +#define OP_MATCH_INITD OP_INITD +#define OP_MATCH_INITDA OP_INITDA +#define OP_MATCH_CALL OP_CALL +#define OP_MATCH_CMPEQI OP_CMPEQI +#define OP_MATCH_CMPGEI OP_CMPGEI +#define OP_MATCH_CMPGEUI OP_CMPGEUI +#define OP_MATCH_CMPLTI OP_CMPLTI +#define OP_MATCH_CMPLTUI OP_CMPLTUI +#define OP_MATCH_CMPNEI OP_CMPNEI +#define OP_MATCH_JMPI OP_JMPI +#define OP_MATCH_LDB OP_LDB +#define OP_MATCH_LDBIO OP_LDBIO +#define OP_MATCH_LDBU OP_LDBU +#define OP_MATCH_LDBUIO OP_LDBUIO +#define OP_MATCH_LDH OP_LDH +#define OP_MATCH_LDHIO OP_LDHIO +#define OP_MATCH_LDHU OP_LDHU +#define OP_MATCH_LDHUIO OP_LDHUIO +#define OP_MATCH_LDL OP_LDL +#define OP_MATCH_LDW OP_LDW +#define OP_MATCH_LDWIO OP_LDWIO +#define OP_MATCH_MULI OP_MULI +#define OP_MATCH_OPX OP_OPX +#define OP_MATCH_ORHI OP_ORHI +#define OP_MATCH_ORI OP_ORI +#define OP_MATCH_RDPRS OP_RDPRS +#define OP_MATCH_STB OP_STB +#define OP_MATCH_STBIO OP_STBIO +#define OP_MATCH_STC OP_STC +#define OP_MATCH_STH OP_STH +#define OP_MATCH_STHIO OP_STHIO +#define OP_MATCH_STW OP_STW +#define OP_MATCH_STWIO OP_STWIO +#define OP_MATCH_CUSTOM OP_CUSTOM +#define OP_MATCH_XORHI OP_XORHI +#define OP_MATCH_XORI OP_XORI +#define OP_MATCH_OPX OP_OPX + +/* OPX instruction values. */ +#define OPX_MATCH(code) ((code << IW_OPX_LSB) | OP_OPX) + +#define OP_MATCH_ADD OPX_MATCH (OPX_ADD) +#define OP_MATCH_AND OPX_MATCH (OPX_AND) +#define OP_MATCH_BREAK ((0x1e << 17) | OPX_MATCH (OPX_BREAK)) +#define OP_MATCH_BRET (0xf0000000 | OPX_MATCH (OPX_BRET)) +#define OP_MATCH_CALLR ((0x1f << 17) | OPX_MATCH (OPX_CALLR)) +#define OP_MATCH_CMPEQ OPX_MATCH (OPX_CMPEQ) +#define OP_MATCH_CMPGE OPX_MATCH (OPX_CMPGE) +#define OP_MATCH_CMPGEU OPX_MATCH (OPX_CMPGEU) +#define OP_MATCH_CMPLT OPX_MATCH (OPX_CMPLT) +#define OP_MATCH_CMPLTU OPX_MATCH (OPX_CMPLTU) +#define OP_MATCH_CMPNE OPX_MATCH (OPX_CMPNE) +#define OP_MATCH_DIV OPX_MATCH (OPX_DIV) +#define OP_MATCH_DIVU OPX_MATCH (OPX_DIVU) +#define OP_MATCH_JMP OPX_MATCH (OPX_JMP) +#define OP_MATCH_MUL OPX_MATCH (OPX_MUL) +#define OP_MATCH_MULXSS OPX_MATCH (OPX_MULXSS) +#define OP_MATCH_MULXSU OPX_MATCH (OPX_MULXSU) +#define OP_MATCH_MULXUU OPX_MATCH (OPX_MULXUU) +#define OP_MATCH_NEXTPC OPX_MATCH (OPX_NEXTPC) +#define OP_MATCH_NOR OPX_MATCH (OPX_NOR) +#define OP_MATCH_OR OPX_MATCH (OPX_OR) +#define OP_MATCH_RDCTL OPX_MATCH (OPX_RDCTL) +#define OP_MATCH_RET (0xf8000000 | OPX_MATCH (OPX_RET)) +#define OP_MATCH_ROL OPX_MATCH (OPX_ROL) +#define OP_MATCH_ROLI OPX_MATCH (OPX_ROLI) +#define OP_MATCH_ROR OPX_MATCH (OPX_ROR) +#define OP_MATCH_SLL OPX_MATCH (OPX_SLL) +#define OP_MATCH_SLLI OPX_MATCH (OPX_SLLI) +#define OP_MATCH_SRA OPX_MATCH (OPX_SRA) +#define OP_MATCH_SRAI OPX_MATCH (OPX_SRAI) +#define OP_MATCH_SRL OPX_MATCH (OPX_SRL) +#define OP_MATCH_SRLI OPX_MATCH (OPX_SRLI) +#define OP_MATCH_SUB OPX_MATCH (OPX_SUB) +#define OP_MATCH_SYNC OPX_MATCH (OPX_SYNC) +#define OP_MATCH_TRAP ((0x1d << 17) | OPX_MATCH (OPX_TRAP)) +#define OP_MATCH_ERET (0xef800000 | OPX_MATCH (OPX_ERET)) +#define OP_MATCH_WRCTL OPX_MATCH (OPX_WRCTL) +#define OP_MATCH_WRPRS OPX_MATCH (OPX_WRPRS) +#define OP_MATCH_XOR OPX_MATCH (OPX_XOR) +#define OP_MATCH_FLUSHI OPX_MATCH (OPX_FLUSHI) +#define OP_MATCH_FLUSHP OPX_MATCH (OPX_FLUSHP) +#define OP_MATCH_INITI OPX_MATCH (OPX_INITI) + +/* Some unusual op masks. */ +#define OP_MASK_BREAK ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_RRD \ + | OP_MASK_ROPX | OP_MASK_OP) \ + & 0xfffff03f) +#define OP_MASK_CALLR ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ + | OP_MASK_OP)) +#define OP_MASK_JMP ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ + | OP_MASK_OP)) +#define OP_MASK_SYNC ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ + | OP_MASK_OP)) +#define OP_MASK_TRAP ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_RRD \ + | OP_MASK_ROPX | OP_MASK_OP) \ + & 0xfffff83f) +#define OP_MASK_WRCTL ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ + | OP_MASK_OP)) /*& 0xfffff83f */ +#define OP_MASK_NEXTPC ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_ROPX \ + | OP_MASK_OP)) +#define OP_MASK_FLUSHI ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ + | OP_MASK_OP)) +#define OP_MASK_INITI ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \ + | OP_MASK_OP)) + +#define OP_MASK_ROLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) +#define OP_MASK_SLLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) +#define OP_MASK_SRAI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) +#define OP_MASK_SRLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP)) +#define OP_MASK_RDCTL ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_ROPX \ + | OP_MASK_OP)) /*& 0xfffff83f */ + +#ifndef OP_MASK +#define OP_MASK 0xffffffff +#endif + +/* These convenience macros to extract instruction fields are used by GDB. */ +#define GET_IW_A(Iw) \ + (((Iw) >> IW_A_LSB) & IW_A_MASK) +#define GET_IW_B(Iw) \ + (((Iw) >> IW_B_LSB) & IW_B_MASK) +#define GET_IW_C(Iw) \ + (((Iw) >> IW_C_LSB) & IW_C_MASK) +#define GET_IW_CONTROL_REGNUM(Iw) \ + (((Iw) >> IW_CONTROL_REGNUM_LSB) & IW_CONTROL_REGNUM_MASK) +#define GET_IW_IMM16(Iw) \ + (((Iw) >> IW_IMM16_LSB) & IW_IMM16_MASK) +#define GET_IW_IMM26(Iw) \ + (((Iw) >> IW_IMM26_LSB) & IW_IMM26_MASK) +#define GET_IW_OP(Iw) \ + (((Iw) >> IW_OP_LSB) & IW_OP_MASK) +#define GET_IW_OPX(Iw) \ + (((Iw) >> IW_OPX_LSB) & IW_OPX_MASK) + +/* These are the data structures we use to hold the instruction information. */ +extern const struct nios2_opcode nios2_builtin_opcodes[]; +extern const int bfd_nios2_num_builtin_opcodes; +extern struct nios2_opcode *nios2_opcodes; +extern int bfd_nios2_num_opcodes; + +/* These are the data structures used to hold the register information. */ +extern const struct nios2_reg nios2_builtin_regs[]; +extern struct nios2_reg *nios2_regs; +extern const int nios2_num_builtin_regs; +extern int nios2_num_regs; + +/* Machine-independent macro for number of opcodes. */ +#define NUMOPCODES bfd_nios2_num_opcodes +#define NUMREGISTERS nios2_num_regs; + +/* This is made extern so that the assembler can use it to find out + what instruction caused an error. */ +extern const struct nios2_opcode *nios2_find_opcode_hash (unsigned long); + +#endif /* _NIOS2_H */ diff --git a/include/opcode/np1.h b/include/opcode/np1.h new file mode 100644 index 0000000..6dadafd --- /dev/null +++ b/include/opcode/np1.h @@ -0,0 +1,421 @@ +/* Print GOULD NPL instructions for GDB, the GNU debugger. + Copyright 1986, 1987, 1989, 1991, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + GDB 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, or (at your option) + any later version. + + GDB 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 GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +struct gld_opcode +{ + char *name; + unsigned long opcode; + unsigned long mask; + char *args; + int length; +}; + +/* We store four bytes of opcode for all opcodes because that + is the most any of them need. The actual length of an instruction + is always at least 2 bytes, and at most four. The length of the + instruction is based on the opcode. + + The mask component is a mask saying which bits must match + particular opcode in order for an instruction to be an instance + of that opcode. + + The args component is a string containing characters + that are used to format the arguments to the instruction. */ + +/* Kinds of operands: + r Register in first field + R Register in second field + b Base register in first field + B Base register in second field + v Vector register in first field + V Vector register in first field + A Optional address register (base register) + X Optional index register + I Immediate data (16bits signed) + O Offset field (16bits signed) + h Offset field (15bits signed) + d Offset field (14bits signed) + S Shift count field + + any other characters are printed as is... */ + +/* The assembler requires that this array be sorted as follows: + all instances of the same mnemonic must be consecutive. + All instances of the same mnemonic with the same number of operands + must be consecutive. */ +struct gld_opcode gld_opcodes[] = +{ +{ "lb", 0xb4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lnb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lbs", 0xec080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lh", 0xb4000001, 0xfc080001, "r,xOA,X", 4 }, +{ "lnh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "lw", 0xb4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lnw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "ld", 0xb4000002, 0xfc080002, "r,xOA,X", 4 }, +{ "lnd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "li", 0xf8000000, 0xfc7f0000, "r,I", 4 }, +{ "lpa", 0x50080000, 0xfc080000, "r,xOA,X", 4 }, +{ "la", 0x50000000, 0xfc080000, "r,xOA,X", 4 }, +{ "labr", 0x58080000, 0xfc080000, "b,xOA,X", 4 }, +{ "lbp", 0x90080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lhp", 0x90000001, 0xfc080001, "r,xOA,X", 4 }, +{ "lwp", 0x90000000, 0xfc080000, "r,xOA,X", 4 }, +{ "ldp", 0x90000002, 0xfc080002, "r,xOA,X", 4 }, +{ "suabr", 0x58000000, 0xfc080000, "b,xOA,X", 4 }, +{ "lf", 0xbc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lfbr", 0xbc080000, 0xfc080000, "b,xOA,X", 4 }, +{ "lwbr", 0x5c000000, 0xfc080000, "b,xOA,X", 4 }, +{ "stb", 0xd4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "sth", 0xd4000001, 0xfc080001, "r,xOA,X", 4 }, +{ "stw", 0xd4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "std", 0xd4000002, 0xfc080002, "r,xOA,X", 4 }, +{ "stf", 0xdc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "stfbr", 0xdc080000, 0xfc080000, "b,xOA,X", 4 }, +{ "stwbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, +{ "zmb", 0xd8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "zmh", 0xd8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "zmw", 0xd8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "zmd", 0xd8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "stbp", 0x94080000, 0xfc080000, "r,xOA,X", 4 }, +{ "sthp", 0x94000001, 0xfc080001, "r,xOA,X", 4 }, +{ "stwp", 0x94000000, 0xfc080000, "r,xOA,X", 4 }, +{ "stdp", 0x94000002, 0xfc080002, "r,xOA,X", 4 }, +{ "lil", 0xf80b0000, 0xfc7f0000, "r,D", 4 }, +{ "lwsl1", 0xec000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lwsl2", 0xfc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lwsl3", 0xfc080000, 0xfc080000, "r,xOA,X", 4 }, + +{ "lvb", 0xb0080000, 0xfc080000, "v,xOA,X", 4 }, +{ "lvh", 0xb0000001, 0xfc080001, "v,xOA,X", 4 }, +{ "lvw", 0xb0000000, 0xfc080000, "v,xOA,X", 4 }, +{ "lvd", 0xb0000002, 0xfc080002, "v,xOA,X", 4 }, +{ "liv", 0x3c040000, 0xfc0f0000, "v,R", 2 }, +{ "livf", 0x3c080000, 0xfc0f0000, "v,R", 2 }, +{ "stvb", 0xd0080000, 0xfc080000, "v,xOA,X", 4 }, +{ "stvh", 0xd0000001, 0xfc080001, "v,xOA,X", 4 }, +{ "stvw", 0xd0000000, 0xfc080000, "v,xOA,X", 4 }, +{ "stvd", 0xd0000002, 0xfc080002, "v,xOA,X", 4 }, + +{ "trr", 0x2c000000, 0xfc0f0000, "r,R", 2 }, +{ "trn", 0x2c040000, 0xfc0f0000, "r,R", 2 }, +{ "trnd", 0x2c0c0000, 0xfc0f0000, "r,R", 2 }, +{ "trabs", 0x2c010000, 0xfc0f0000, "r,R", 2 }, +{ "trabsd", 0x2c090000, 0xfc0f0000, "r,R", 2 }, +{ "trc", 0x2c030000, 0xfc0f0000, "r,R", 2 }, +{ "xcr", 0x28040000, 0xfc0f0000, "r,R", 2 }, +{ "cxcr", 0x2c060000, 0xfc0f0000, "r,R", 2 }, +{ "cxcrd", 0x2c0e0000, 0xfc0f0000, "r,R", 2 }, +{ "tbrr", 0x2c020000, 0xfc0f0000, "r,B", 2 }, +{ "trbr", 0x28030000, 0xfc0f0000, "b,R", 2 }, +{ "xcbr", 0x28020000, 0xfc0f0000, "b,B", 2 }, +{ "tbrbr", 0x28010000, 0xfc0f0000, "b,B", 2 }, + +{ "trvv", 0x28050000, 0xfc0f0000, "v,V", 2 }, +{ "trvvn", 0x2c050000, 0xfc0f0000, "v,V", 2 }, +{ "trvvnd", 0x2c0d0000, 0xfc0f0000, "v,V", 2 }, +{ "trvab", 0x2c070000, 0xfc0f0000, "v,V", 2 }, +{ "trvabd", 0x2c0f0000, 0xfc0f0000, "v,V", 2 }, +{ "cmpv", 0x14060000, 0xfc0f0000, "v,V", 2 }, +{ "expv", 0x14070000, 0xfc0f0000, "v,V", 2 }, +{ "mrvvlt", 0x10030000, 0xfc0f0000, "v,V", 2 }, +{ "mrvvle", 0x10040000, 0xfc0f0000, "v,V", 2 }, +{ "mrvvgt", 0x14030000, 0xfc0f0000, "v,V", 2 }, +{ "mrvvge", 0x14040000, 0xfc0f0000, "v,V", 2 }, +{ "mrvveq", 0x10050000, 0xfc0f0000, "v,V", 2 }, +{ "mrvvne", 0x10050000, 0xfc0f0000, "v,V", 2 }, +{ "mrvrlt", 0x100d0000, 0xfc0f0000, "v,R", 2 }, +{ "mrvrle", 0x100e0000, 0xfc0f0000, "v,R", 2 }, +{ "mrvrgt", 0x140d0000, 0xfc0f0000, "v,R", 2 }, +{ "mrvrge", 0x140e0000, 0xfc0f0000, "v,R", 2 }, +{ "mrvreq", 0x100f0000, 0xfc0f0000, "v,R", 2 }, +{ "mrvrne", 0x140f0000, 0xfc0f0000, "v,R", 2 }, +{ "trvr", 0x140b0000, 0xfc0f0000, "r,V", 2 }, +{ "trrv", 0x140c0000, 0xfc0f0000, "v,R", 2 }, + +{ "bu", 0x40000000, 0xff880000, "xOA,X", 4 }, +{ "bns", 0x70080000, 0xff880000, "xOA,X", 4 }, +{ "bnco", 0x70880000, 0xff880000, "xOA,X", 4 }, +{ "bge", 0x71080000, 0xff880000, "xOA,X", 4 }, +{ "bne", 0x71880000, 0xff880000, "xOA,X", 4 }, +{ "bunge", 0x72080000, 0xff880000, "xOA,X", 4 }, +{ "bunle", 0x72880000, 0xff880000, "xOA,X", 4 }, +{ "bgt", 0x73080000, 0xff880000, "xOA,X", 4 }, +{ "bnany", 0x73880000, 0xff880000, "xOA,X", 4 }, +{ "bs" , 0x70000000, 0xff880000, "xOA,X", 4 }, +{ "bco", 0x70800000, 0xff880000, "xOA,X", 4 }, +{ "blt", 0x71000000, 0xff880000, "xOA,X", 4 }, +{ "beq", 0x71800000, 0xff880000, "xOA,X", 4 }, +{ "buge", 0x72000000, 0xff880000, "xOA,X", 4 }, +{ "bult", 0x72800000, 0xff880000, "xOA,X", 4 }, +{ "ble", 0x73000000, 0xff880000, "xOA,X", 4 }, +{ "bany", 0x73800000, 0xff880000, "xOA,X", 4 }, +{ "brlnk", 0x44000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bib", 0x48000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bih", 0x48080000, 0xfc080000, "r,xOA,X", 4 }, +{ "biw", 0x4c000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bid", 0x4c080000, 0xfc080000, "r,xOA,X", 4 }, +{ "bivb", 0x60000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bivh", 0x60080000, 0xfc080000, "r,xOA,X", 4 }, +{ "bivw", 0x64000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bivd", 0x64080000, 0xfc080000, "r,xOA,X", 4 }, +{ "bvsb", 0x68000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bvsh", 0x68080000, 0xfc080000, "r,xOA,X", 4 }, +{ "bvsw", 0x6c000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bvsd", 0x6c080000, 0xfc080000, "r,xOA,X", 4 }, + +{ "camb", 0x80080000, 0xfc080000, "r,xOA,X", 4 }, +{ "camh", 0x80000001, 0xfc080001, "r,xOA,X", 4 }, +{ "camw", 0x80000000, 0xfc080000, "r,xOA,X", 4 }, +{ "camd", 0x80000002, 0xfc080002, "r,xOA,X", 4 }, +{ "car", 0x10000000, 0xfc0f0000, "r,R", 2 }, +{ "card", 0x14000000, 0xfc0f0000, "r,R", 2 }, +{ "ci", 0xf8050000, 0xfc7f0000, "r,I", 4 }, +{ "chkbnd", 0x5c080000, 0xfc080000, "r,xOA,X", 4 }, + +{ "cavv", 0x10010000, 0xfc0f0000, "v,V", 2 }, +{ "cavr", 0x10020000, 0xfc0f0000, "v,R", 2 }, +{ "cavvd", 0x10090000, 0xfc0f0000, "v,V", 2 }, +{ "cavrd", 0x100b0000, 0xfc0f0000, "v,R", 2 }, + +{ "anmb", 0x84080000, 0xfc080000, "r,xOA,X", 4 }, +{ "anmh", 0x84000001, 0xfc080001, "r,xOA,X", 4 }, +{ "anmw", 0x84000000, 0xfc080000, "r,xOA,X", 4 }, +{ "anmd", 0x84000002, 0xfc080002, "r,xOA,X", 4 }, +{ "anr", 0x04000000, 0xfc0f0000, "r,R", 2 }, +{ "ani", 0xf8080000, 0xfc7f0000, "r,I", 4 }, +{ "ormb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "ormh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "ormw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "ormd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "orr", 0x08000000, 0xfc0f0000, "r,R", 2 }, +{ "oi", 0xf8090000, 0xfc7f0000, "r,I", 4 }, +{ "eomb", 0x8c080000, 0xfc080000, "r,xOA,X", 4 }, +{ "eomh", 0x8c000001, 0xfc080001, "r,xOA,X", 4 }, +{ "eomw", 0x8c000000, 0xfc080000, "r,xOA,X", 4 }, +{ "eomd", 0x8c000002, 0xfc080002, "r,xOA,X", 4 }, +{ "eor", 0x0c000000, 0xfc0f0000, "r,R", 2 }, +{ "eoi", 0xf80a0000, 0xfc7f0000, "r,I", 4 }, + +{ "anvv", 0x04010000, 0xfc0f0000, "v,V", 2 }, +{ "anvr", 0x04020000, 0xfc0f0000, "v,R", 2 }, +{ "orvv", 0x08010000, 0xfc0f0000, "v,V", 2 }, +{ "orvr", 0x08020000, 0xfc0f0000, "v,R", 2 }, +{ "eovv", 0x0c010000, 0xfc0f0000, "v,V", 2 }, +{ "eovr", 0x0c020000, 0xfc0f0000, "v,R", 2 }, + +{ "sacz", 0x100c0000, 0xfc0f0000, "r,R", 2 }, +{ "sla", 0x1c400000, 0xfc600000, "r,S", 2 }, +{ "sll", 0x1c600000, 0xfc600000, "r,S", 2 }, +{ "slc", 0x24400000, 0xfc600000, "r,S", 2 }, +{ "slad", 0x20400000, 0xfc600000, "r,S", 2 }, +{ "slld", 0x20600000, 0xfc600000, "r,S", 2 }, +{ "sra", 0x1c000000, 0xfc600000, "r,S", 2 }, +{ "srl", 0x1c200000, 0xfc600000, "r,S", 2 }, +{ "src", 0x24000000, 0xfc600000, "r,S", 2 }, +{ "srad", 0x20000000, 0xfc600000, "r,S", 2 }, +{ "srld", 0x20200000, 0xfc600000, "r,S", 2 }, +{ "sda", 0x3c030000, 0xfc0f0000, "r,R", 2 }, +{ "sdl", 0x3c020000, 0xfc0f0000, "r,R", 2 }, +{ "sdc", 0x3c010000, 0xfc0f0000, "r,R", 2 }, +{ "sdad", 0x3c0b0000, 0xfc0f0000, "r,R", 2 }, +{ "sdld", 0x3c0a0000, 0xfc0f0000, "r,R", 2 }, + +{ "svda", 0x3c070000, 0xfc0f0000, "v,R", 2 }, +{ "svdl", 0x3c060000, 0xfc0f0000, "v,R", 2 }, +{ "svdc", 0x3c050000, 0xfc0f0000, "v,R", 2 }, +{ "svdad", 0x3c0e0000, 0xfc0f0000, "v,R", 2 }, +{ "svdld", 0x3c0d0000, 0xfc0f0000, "v,R", 2 }, + +{ "sbm", 0xac080000, 0xfc080000, "f,xOA,X", 4 }, +{ "zbm", 0xac000000, 0xfc080000, "f,xOA,X", 4 }, +{ "tbm", 0xa8080000, 0xfc080000, "f,xOA,X", 4 }, +{ "incmb", 0xa0000000, 0xfc080000, "xOA,X", 4 }, +{ "incmh", 0xa0080000, 0xfc080000, "xOA,X", 4 }, +{ "incmw", 0xa4000000, 0xfc080000, "xOA,X", 4 }, +{ "incmd", 0xa4080000, 0xfc080000, "xOA,X", 4 }, +{ "sbmd", 0x7c080000, 0xfc080000, "r,xOA,X", 4 }, +{ "zbmd", 0x7c000000, 0xfc080000, "r,xOA,X", 4 }, +{ "tbmd", 0x78080000, 0xfc080000, "r,xOA,X", 4 }, + +{ "ssm", 0x9c080000, 0xfc080000, "f,xOA,X", 4 }, +{ "zsm", 0x9c000000, 0xfc080000, "f,xOA,X", 4 }, +{ "tsm", 0x98080000, 0xfc080000, "f,xOA,X", 4 }, + +{ "admb", 0xc8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "admh", 0xc8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "admw", 0xc8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "admd", 0xc8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "adr", 0x38000000, 0xfc0f0000, "r,R", 2 }, +{ "armb", 0xe8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "armh", 0xe8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "armw", 0xe8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "armd", 0xe8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "adi", 0xf8010000, 0xfc0f0000, "r,I", 4 }, +{ "sumb", 0xcc080000, 0xfc080000, "r,xOA,X", 4 }, +{ "sumh", 0xcc000001, 0xfc080001, "r,xOA,X", 4 }, +{ "sumw", 0xcc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "sumd", 0xcc000002, 0xfc080002, "r,xOA,X", 4 }, +{ "sur", 0x3c000000, 0xfc0f0000, "r,R", 2 }, +{ "sui", 0xf8020000, 0xfc0f0000, "r,I", 4 }, +{ "mpmb", 0xc0080000, 0xfc080000, "r,xOA,X", 4 }, +{ "mpmh", 0xc0000001, 0xfc080001, "r,xOA,X", 4 }, +{ "mpmw", 0xc0000000, 0xfc080000, "r,xOA,X", 4 }, +{ "mpr", 0x38020000, 0xfc0f0000, "r,R", 2 }, +{ "mprd", 0x3c0f0000, 0xfc0f0000, "r,R", 2 }, +{ "mpi", 0xf8030000, 0xfc0f0000, "r,I", 4 }, +{ "dvmb", 0xc4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "dvmh", 0xc4000001, 0xfc080001, "r,xOA,X", 4 }, +{ "dvmw", 0xc4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "dvr", 0x380a0000, 0xfc0f0000, "r,R", 2 }, +{ "dvi", 0xf8040000, 0xfc0f0000, "r,I", 4 }, +{ "exs", 0x38080000, 0xfc0f0000, "r,R", 2 }, + +{ "advv", 0x30000000, 0xfc0f0000, "v,V", 2 }, +{ "advvd", 0x30080000, 0xfc0f0000, "v,V", 2 }, +{ "adrv", 0x34000000, 0xfc0f0000, "v,R", 2 }, +{ "adrvd", 0x34080000, 0xfc0f0000, "v,R", 2 }, +{ "suvv", 0x30010000, 0xfc0f0000, "v,V", 2 }, +{ "suvvd", 0x30090000, 0xfc0f0000, "v,V", 2 }, +{ "surv", 0x34010000, 0xfc0f0000, "v,R", 2 }, +{ "survd", 0x34090000, 0xfc0f0000, "v,R", 2 }, +{ "mpvv", 0x30020000, 0xfc0f0000, "v,V", 2 }, +{ "mprv", 0x34020000, 0xfc0f0000, "v,R", 2 }, + +{ "adfw", 0xe0080000, 0xfc080000, "r,xOA,X", 4 }, +{ "adfd", 0xe0080002, 0xfc080002, "r,xOA,X", 4 }, +{ "adrfw", 0x38010000, 0xfc0f0000, "r,R", 2 }, +{ "adrfd", 0x38090000, 0xfc0f0000, "r,R", 2 }, +{ "surfw", 0xe0000000, 0xfc080000, "r,xOA,X", 4 }, +{ "surfd", 0xe0000002, 0xfc080002, "r,xOA,X", 4 }, +{ "surfw", 0x38030000, 0xfc0f0000, "r,R", 2 }, +{ "surfd", 0x380b0000, 0xfc0f0000, "r,R", 2 }, +{ "mpfw", 0xe4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "mpfd", 0xe4080002, 0xfc080002, "r,xOA,X", 4 }, +{ "mprfw", 0x38060000, 0xfc0f0000, "r,R", 2 }, +{ "mprfd", 0x380e0000, 0xfc0f0000, "r,R", 2 }, +{ "rfw", 0xe4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "rfd", 0xe4000002, 0xfc080002, "r,xOA,X", 4 }, +{ "rrfw", 0x0c0e0000, 0xfc0f0000, "r", 2 }, +{ "rrfd", 0x0c0f0000, 0xfc0f0000, "r", 2 }, + +{ "advvfw", 0x30040000, 0xfc0f0000, "v,V", 2 }, +{ "advvfd", 0x300c0000, 0xfc0f0000, "v,V", 2 }, +{ "adrvfw", 0x34040000, 0xfc0f0000, "v,R", 2 }, +{ "adrvfd", 0x340c0000, 0xfc0f0000, "v,R", 2 }, +{ "suvvfw", 0x30050000, 0xfc0f0000, "v,V", 2 }, +{ "suvvfd", 0x300d0000, 0xfc0f0000, "v,V", 2 }, +{ "survfw", 0x34050000, 0xfc0f0000, "v,R", 2 }, +{ "survfd", 0x340d0000, 0xfc0f0000, "v,R", 2 }, +{ "mpvvfw", 0x30060000, 0xfc0f0000, "v,V", 2 }, +{ "mpvvfd", 0x300e0000, 0xfc0f0000, "v,V", 2 }, +{ "mprvfw", 0x34060000, 0xfc0f0000, "v,R", 2 }, +{ "mprvfd", 0x340e0000, 0xfc0f0000, "v,R", 2 }, +{ "rvfw", 0x30070000, 0xfc0f0000, "v", 2 }, +{ "rvfd", 0x300f0000, 0xfc0f0000, "v", 2 }, + +{ "fltw", 0x38070000, 0xfc0f0000, "r,R", 2 }, +{ "fltd", 0x380f0000, 0xfc0f0000, "r,R", 2 }, +{ "fixw", 0x38050000, 0xfc0f0000, "r,R", 2 }, +{ "fixd", 0x380d0000, 0xfc0f0000, "r,R", 2 }, +{ "cfpds", 0x3c090000, 0xfc0f0000, "r,R", 2 }, + +{ "fltvw", 0x080d0000, 0xfc0f0000, "v,V", 2 }, +{ "fltvd", 0x080f0000, 0xfc0f0000, "v,V", 2 }, +{ "fixvw", 0x080c0000, 0xfc0f0000, "v,V", 2 }, +{ "fixvd", 0x080e0000, 0xfc0f0000, "v,V", 2 }, +{ "cfpvds", 0x0c0d0000, 0xfc0f0000, "v,V", 2 }, + +{ "orvrn", 0x000a0000, 0xfc0f0000, "r,V", 2 }, +{ "andvrn", 0x00080000, 0xfc0f0000, "r,V", 2 }, +{ "frsteq", 0x04090000, 0xfc0f0000, "r,V", 2 }, +{ "sigma", 0x0c080000, 0xfc0f0000, "r,V", 2 }, +{ "sigmad", 0x0c0a0000, 0xfc0f0000, "r,V", 2 }, +{ "sigmf", 0x08080000, 0xfc0f0000, "r,V", 2 }, +{ "sigmfd", 0x080a0000, 0xfc0f0000, "r,V", 2 }, +{ "prodf", 0x04080000, 0xfc0f0000, "r,V", 2 }, +{ "prodfd", 0x040a0000, 0xfc0f0000, "r,V", 2 }, +{ "maxv", 0x10080000, 0xfc0f0000, "r,V", 2 }, +{ "maxvd", 0x100a0000, 0xfc0f0000, "r,V", 2 }, +{ "minv", 0x14080000, 0xfc0f0000, "r,V", 2 }, +{ "minvd", 0x140a0000, 0xfc0f0000, "r,V", 2 }, + +{ "lpsd", 0xf0000000, 0xfc080000, "xOA,X", 4 }, +{ "ldc", 0xf0080000, 0xfc080000, "xOA,X", 4 }, +{ "spm", 0x040c0000, 0xfc0f0000, "r", 2 }, +{ "rpm", 0x040d0000, 0xfc0f0000, "r", 2 }, +{ "tritr", 0x00070000, 0xfc0f0000, "r", 2 }, +{ "trrit", 0x00060000, 0xfc0f0000, "r", 2 }, +{ "rpswt", 0x04080000, 0xfc0f0000, "r", 2 }, +{ "exr", 0xf8070000, 0xfc0f0000, "", 4 }, +{ "halt", 0x00000000, 0xfc0f0000, "", 2 }, +{ "wait", 0x00010000, 0xfc0f0000, "", 2 }, +{ "nop", 0x00020000, 0xfc0f0000, "", 2 }, +{ "eiae", 0x00030000, 0xfc0f0000, "", 2 }, +{ "efae", 0x000d0000, 0xfc0f0000, "", 2 }, +{ "diae", 0x000e0000, 0xfc0f0000, "", 2 }, +{ "dfae", 0x000f0000, 0xfc0f0000, "", 2 }, +{ "spvc", 0xf8060000, 0xfc0f0000, "r,T,N", 4 }, +{ "rdsts", 0x00090000, 0xfc0f0000, "r", 2 }, +{ "setcpu", 0x000c0000, 0xfc0f0000, "r", 2 }, +{ "cmc", 0x000b0000, 0xfc0f0000, "r", 2 }, +{ "trrcu", 0x00040000, 0xfc0f0000, "r", 2 }, +{ "attnio", 0x00050000, 0xfc0f0000, "", 2 }, +{ "fudit", 0x28080000, 0xfc0f0000, "", 2 }, +{ "break", 0x28090000, 0xfc0f0000, "", 2 }, +{ "frzss", 0x280a0000, 0xfc0f0000, "", 2 }, +{ "ripi", 0x04040000, 0xfc0f0000, "r,R", 2 }, +{ "xcp", 0x04050000, 0xfc0f0000, "r", 2 }, +{ "block", 0x04060000, 0xfc0f0000, "", 2 }, +{ "unblock", 0x04070000, 0xfc0f0000, "", 2 }, +{ "trsc", 0x08060000, 0xfc0f0000, "r,R", 2 }, +{ "tscr", 0x08070000, 0xfc0f0000, "r,R", 2 }, +{ "fq", 0x04080000, 0xfc0f0000, "r", 2 }, +{ "flupte", 0x2c080000, 0xfc0f0000, "r", 2 }, +{ "rviu", 0x040f0000, 0xfc0f0000, "", 2 }, +{ "ldel", 0x280c0000, 0xfc0f0000, "r,R", 2 }, +{ "ldu", 0x280d0000, 0xfc0f0000, "r,R", 2 }, +{ "stdecc", 0x280b0000, 0xfc0f0000, "r,R", 2 }, +{ "trpc", 0x08040000, 0xfc0f0000, "r", 2 }, +{ "tpcr", 0x08050000, 0xfc0f0000, "r", 2 }, +{ "ghalt", 0x0c050000, 0xfc0f0000, "r", 2 }, +{ "grun", 0x0c040000, 0xfc0f0000, "", 2 }, +{ "tmpr", 0x2c0a0000, 0xfc0f0000, "r,R", 2 }, +{ "trmp", 0x2c0b0000, 0xfc0f0000, "r,R", 2 }, + +{ "trrve", 0x28060000, 0xfc0f0000, "r", 2 }, +{ "trver", 0x28070000, 0xfc0f0000, "r", 2 }, +{ "trvlr", 0x280f0000, 0xfc0f0000, "r", 2 }, + +{ "linkfl", 0x18000000, 0xfc0f0000, "r,R", 2 }, +{ "linkbl", 0x18020000, 0xfc0f0000, "r,R", 2 }, +{ "linkfp", 0x18010000, 0xfc0f0000, "r,R", 2 }, +{ "linkbp", 0x18030000, 0xfc0f0000, "r,R", 2 }, +{ "linkpl", 0x18040000, 0xfc0f0000, "r,R", 2 }, +{ "ulinkl", 0x18080000, 0xfc0f0000, "r,R", 2 }, +{ "ulinkp", 0x18090000, 0xfc0f0000, "r,R", 2 }, +{ "ulinktl", 0x180a0000, 0xfc0f0000, "r,R", 2 }, +{ "ulinktp", 0x180b0000, 0xfc0f0000, "r,R", 2 }, +}; + +int numopcodes = sizeof(gld_opcodes) / sizeof(gld_opcodes[0]); + +struct gld_opcode *endop = gld_opcodes + sizeof(gld_opcodes) / + sizeof(gld_opcodes[0]); diff --git a/include/opcode/ns32k.h b/include/opcode/ns32k.h new file mode 100644 index 0000000..34c42f8 --- /dev/null +++ b/include/opcode/ns32k.h @@ -0,0 +1,487 @@ +/* ns32k-opcode.h -- Opcode table for National Semi 32k processor + Copyright 1987, 1991, 1994, 2002, 2010 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + + GAS 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, or (at your option) + any later version. + + GAS 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 GAS; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#ifdef SEQUENT_COMPATABILITY +#define DEF_MODEC 20 +#define DEF_MODEL 21 +#endif + +#ifndef DEF_MODEC +#define DEF_MODEC 20 +#endif + +#ifndef DEF_MODEL +#define DEF_MODEL 20 +#endif +/* + After deciding the instruction entry (via hash.c) the instruction parser + will try to match the operands after the instruction to the required set + given in the entry operandfield. Every operand will result in a change in + the opcode or the addition of data to the opcode. + The operands in the source instruction are checked for inconsistent + semantics. + + F : 32 bit float general form + L : 64 bit float " + B : byte " + W : word " + D : double-word " + A : double-word gen-address-form ie no regs, no immediate + I : integer writeable gen int except immediate (A + reg) + Z : floating writeable gen float except immediate (Z + freg) + d : displacement + b : displacement - pc relative addressing acb + p : displacement - pc relative addressing br bcond bsr cxp + q : quick + i : immediate (8 bits) + This is not a standard ns32k operandtype, it is used to build + instructions like svc arg1,arg2 + Svc is the instruction SuperVisorCall and is sometimes used to + call OS-routines from usermode. Some args might be handy! + r : register number (3 bits) + O : setcfg instruction optionslist + C : cinv instruction optionslist + S : stringinstruction optionslist + U : registerlist save,enter + u : registerlist restore,exit + M : mmu register + P : cpu register + g : 3:rd operand of inss or exts instruction + G : 4:th operand of inss or exts instruction + Those operands are encoded in the same byte. + This byte is placed last in the instruction. + f : operand of sfsr + H : sequent-hack for bsr (Warning) + +column 1 instructions + 2 number of bits in opcode. + 3 number of bits in opcode explicitly + determined by the instruction type. + 4 opcodeseed, the number we build our opcode + from. + 5 operandtypes, used by operandparser. + 6 size in bytes of immediate +*/ +struct ns32k_opcode { + const char *name; + unsigned char opcode_id_size; /* not used by the assembler */ + unsigned char opcode_size; + unsigned long opcode_seed; + const char *operands; + unsigned char im_size; /* not used by dissassembler */ + const char *default_args; /* default to those args when none given */ + char default_modec; /* default to this addr-mode when ambigous + ie when the argument of a general addr-mode + is a plain constant */ + char default_model; /* is a plain label */ +}; + +#ifdef comment +/* This section was from the gdb version of this file. */ + +#ifndef ns32k_opcodeT +#define ns32k_opcodeT int +#endif /* no ns32k_opcodeT */ + +struct not_wot /* ns32k opcode table: wot to do with this */ + /* particular opcode */ +{ + int obits; /* number of opcode bits */ + int ibits; /* number of instruction bits */ + ns32k_opcodeT code; /* op-code (may be > 8 bits!) */ + const char *args; /* how to compile said opcode */ +}; + +struct not /* ns32k opcode text */ +{ + const char *name; /* opcode name: lowercase string [key] */ + struct not_wot detail; /* rest of opcode table [datum] */ +}; + +/* Instructions look like this: + + basic instruction--1, 2, or 3 bytes + index byte for operand A, if operand A is indexed--1 byte + index byte for operand B, if operand B is indexed--1 byte + addressing extension for operand A + addressing extension for operand B + implied operands + + Operand A is the operand listed first in the following opcode table. + Operand B is the operand listed second in the following opcode table. + All instructions have at most 2 general operands, so this is enough. + The implied operands are associated with operands other than A and B. + + Each operand has a digit and a letter. + + The digit gives the position in the assembly language. The letter, + one of the following, tells us what kind of operand it is. */ + +/* F : 32 bit float + * L : 64 bit float + * B : byte + * W : word + * D : double-word + * I : integer not immediate + * Z : floating not immediate + * d : displacement + * q : quick + * i : immediate (8 bits) + * r : register number (3 bits) + * p : displacement - pc relative addressing +*/ + + +#endif /* comment */ + +static const struct ns32k_opcode ns32k_opcodes[]= +{ + { "absf", 14,24, 0x35be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "absl", 14,24, 0x34be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "absb", 14,24, 0x304e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "absw", 14,24, 0x314e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "absd", 14,24, 0x334e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "acbb", 7,16, 0x4c, "2I1q3p", 1, "", DEF_MODEC,DEF_MODEL }, + { "acbw", 7,16, 0x4d, "2I1q3p", 2, "", DEF_MODEC,DEF_MODEL }, + { "acbd", 7,16, 0x4f, "2I1q3p", 4, "", DEF_MODEC,DEF_MODEL }, + { "addf", 14,24, 0x01be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "addl", 14,24, 0x00be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "addb", 6,16, 0x00, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "addw", 6,16, 0x01, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "addd", 6,16, 0x03, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "addcb", 6,16, 0x10, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "addcw", 6,16, 0x11, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "addcd", 6,16, 0x13, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "addpb", 14,24, 0x3c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "addpw", 14,24, 0x3d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "addpd", 14,24, 0x3f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "addqb", 7,16, 0x0c, "2I1q", 1, "", DEF_MODEC,DEF_MODEL }, + { "addqw", 7,16, 0x0d, "2I1q", 2, "", DEF_MODEC,DEF_MODEL }, + { "addqd", 7,16, 0x0f, "2I1q", 4, "", DEF_MODEC,DEF_MODEL }, + { "addr", 6,16, 0x27, "1A2I", 4, "", 21,21 }, + { "adjspb", 11,16, 0x057c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, + { "adjspw", 11,16, 0x057d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, + { "adjspd", 11,16, 0x057f, "1D", 4, "", DEF_MODEC,DEF_MODEL }, + { "andb", 6,16, 0x28, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "andw", 6,16, 0x29, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "andd", 6,16, 0x2b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "ashb", 14,24, 0x044e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "ashw", 14,24, 0x054e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "ashd", 14,24, 0x074e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "beq", 8,8, 0x0a, "1p", 0, "", 21,21 }, + { "bne", 8,8, 0x1a, "1p", 0, "", 21,21 }, + { "bcs", 8,8, 0x2a, "1p", 0, "", 21,21 }, + { "bcc", 8,8, 0x3a, "1p", 0, "", 21,21 }, + { "bhi", 8,8, 0x4a, "1p", 0, "", 21,21 }, + { "bls", 8,8, 0x5a, "1p", 0, "", 21,21 }, + { "bgt", 8,8, 0x6a, "1p", 0, "", 21,21 }, + { "ble", 8,8, 0x7a, "1p", 0, "", 21,21 }, + { "bfs", 8,8, 0x8a, "1p", 0, "", 21,21 }, + { "bfc", 8,8, 0x9a, "1p", 0, "", 21,21 }, + { "blo", 8,8, 0xaa, "1p", 0, "", 21,21 }, + { "bhs", 8,8, 0xba, "1p", 0, "", 21,21 }, + { "blt", 8,8, 0xca, "1p", 0, "", 21,21 }, + { "bge", 8,8, 0xda, "1p", 0, "", 21,21 }, + { "but", 8,8, 0xea, "1p", 0, "", 21,21 }, + { "buf", 8,8, 0xfa, "1p", 0, "", 21,21 }, + { "bicb", 6,16, 0x08, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "bicw", 6,16, 0x09, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "bicd", 6,16, 0x0b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "bicpsrb", 11,16, 0x17c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, + { "bicpsrw", 11,16, 0x17d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, + { "bispsrb", 11,16, 0x37c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, + { "bispsrw", 11,16, 0x37d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, + { "bpt", 8,8, 0xf2, "", 0, "", DEF_MODEC,DEF_MODEL }, + { "br", 8,8, 0xea, "1p", 0, "", 21,21 }, +#ifdef SEQUENT_COMPATABILITY + { "bsr", 8,8, 0x02, "1H", 0, "", 21,21 }, +#else + { "bsr", 8,8, 0x02, "1p", 0, "", 21,21 }, +#endif + { "caseb", 11,16, 0x77c, "1B", 1, "", DEF_MODEC,DEF_MODEL }, + { "casew", 11,16, 0x77d, "1W", 2, "", DEF_MODEC,DEF_MODEL }, + { "cased", 11,16, 0x77f, "1D", 4, "", DEF_MODEC,DEF_MODEL }, + { "cbitb", 14,24, 0x084e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "cbitw", 14,24, 0x094e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "cbitd", 14,24, 0x0b4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "cbitib", 14,24, 0x0c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "cbitiw", 14,24, 0x0d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "cbitid", 14,24, 0x0f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "checkb", 11,24, 0x0ee, "2A3B1r", 1, "", DEF_MODEC,DEF_MODEL }, + { "checkw", 11,24, 0x1ee, "2A3W1r", 2, "", DEF_MODEC,DEF_MODEL }, + { "checkd", 11,24, 0x3ee, "2A3D1r", 4, "", DEF_MODEC,DEF_MODEL }, + { "cinv", 14,24, 0x271e, "2D1C", 4, "", DEF_MODEC,DEF_MODEL }, + { "cmpf", 14,24, 0x09be, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, + { "cmpl", 14,24, 0x08be, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, + { "cmpb", 6,16, 0x04, "1B2B", 1, "", DEF_MODEC,DEF_MODEL }, + { "cmpw", 6,16, 0x05, "1W2W", 2, "", DEF_MODEC,DEF_MODEL }, + { "cmpd", 6,16, 0x07, "1D2D", 4, "", DEF_MODEC,DEF_MODEL }, + { "cmpmb", 14,24, 0x04ce, "1A2A3b", 1, "", DEF_MODEC,DEF_MODEL }, + { "cmpmw", 14,24, 0x05ce, "1A2A3b", 2, "", DEF_MODEC,DEF_MODEL }, + { "cmpmd", 14,24, 0x07ce, "1A2A3b", 4, "", DEF_MODEC,DEF_MODEL }, + { "cmpqb", 7,16, 0x1c, "2B1q", 1, "", DEF_MODEC,DEF_MODEL }, + { "cmpqw", 7,16, 0x1d, "2W1q", 2, "", DEF_MODEC,DEF_MODEL }, + { "cmpqd", 7,16, 0x1f, "2D1q", 4, "", DEF_MODEC,DEF_MODEL }, + { "cmpsb", 16,24, 0x040e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "cmpsw", 16,24, 0x050e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "cmpsd", 16,24, 0x070e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "cmpst", 16,24, 0x840e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "comb", 14,24, 0x344e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "comw", 14,24, 0x354e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "comd", 14,24, 0x374e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "cvtp", 11,24, 0x036e, "2A3D1r", 4, "", DEF_MODEC,DEF_MODEL }, + { "cxp", 8,8, 0x22, "1p", 0, "", 21,21 }, + { "cxpd", 11,16, 0x07f, "1A", 4, "", DEF_MODEC,DEF_MODEL }, + { "deib", 14,24, 0x2cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "deiw", 14,24, 0x2dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "deid", 14,24, 0x2fce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "dia", 8,8, 0xc2, "", 1, "", DEF_MODEC,DEF_MODEL }, + { "divf", 14,24, 0x21be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "divl", 14,24, 0x20be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "divb", 14,24, 0x3cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "divw", 14,24, 0x3dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "divd", 14,24, 0x3fce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "enter", 8,8, 0x82, "1U2d", 0, "", DEF_MODEC,DEF_MODEL }, + { "exit", 8,8, 0x92, "1u", 0, "", DEF_MODEC,DEF_MODEL }, + { "extb", 11,24, 0x02e, "2I3B1r4d", 1, "", DEF_MODEC,DEF_MODEL }, + { "extw", 11,24, 0x12e, "2I3W1r4d", 2, "", DEF_MODEC,DEF_MODEL }, + { "extd", 11,24, 0x32e, "2I3D1r4d", 4, "", DEF_MODEC,DEF_MODEL }, + { "extsb", 14,24, 0x0cce, "1I2I4G3g", 1, "", DEF_MODEC,DEF_MODEL }, + { "extsw", 14,24, 0x0dce, "1I2I4G3g", 2, "", DEF_MODEC,DEF_MODEL }, + { "extsd", 14,24, 0x0fce, "1I2I4G3g", 4, "", DEF_MODEC,DEF_MODEL }, + { "ffsb", 14,24, 0x046e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "ffsw", 14,24, 0x056e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "ffsd", 14,24, 0x076e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "flag", 8,8, 0xd2, "", 0, "", DEF_MODEC,DEF_MODEL }, + { "floorfb", 14,24, 0x3c3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "floorfw", 14,24, 0x3d3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "floorfd", 14,24, 0x3f3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "floorlb", 14,24, 0x383e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "floorlw", 14,24, 0x393e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "floorld", 14,24, 0x3b3e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "ibitb", 14,24, 0x384e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "ibitw", 14,24, 0x394e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "ibitd", 14,24, 0x3b4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "indexb", 11,24, 0x42e, "2B3B1r", 1, "", DEF_MODEC,DEF_MODEL }, + { "indexw", 11,24, 0x52e, "2W3W1r", 2, "", DEF_MODEC,DEF_MODEL }, + { "indexd", 11,24, 0x72e, "2D3D1r", 4, "", DEF_MODEC,DEF_MODEL }, + { "insb", 11,24, 0x0ae, "2B3I1r4d", 1, "", DEF_MODEC,DEF_MODEL }, + { "insw", 11,24, 0x1ae, "2W3I1r4d", 2, "", DEF_MODEC,DEF_MODEL }, + { "insd", 11,24, 0x3ae, "2D3I1r4d", 4, "", DEF_MODEC,DEF_MODEL }, + { "inssb", 14,24, 0x08ce, "1B2I4G3g", 1, "", DEF_MODEC,DEF_MODEL }, + { "inssw", 14,24, 0x09ce, "1W2I4G3g", 2, "", DEF_MODEC,DEF_MODEL }, + { "inssd", 14,24, 0x0bce, "1D2I4G3g", 4, "", DEF_MODEC,DEF_MODEL }, + { "jsr", 11,16, 0x67f, "1A", 4, "", 21,21 }, + { "jump", 11,16, 0x27f, "1A", 4, "", 21,21 }, + { "lfsr", 19,24, 0x00f3e,"1D", 4, "", DEF_MODEC,DEF_MODEL }, + { "lmr", 15,24, 0x0b1e, "2D1M", 4, "", DEF_MODEC,DEF_MODEL }, + { "lprb", 7,16, 0x6c, "2B1P", 1, "", DEF_MODEC,DEF_MODEL }, + { "lprw", 7,16, 0x6d, "2W1P", 2, "", DEF_MODEC,DEF_MODEL }, + { "lprd", 7,16, 0x6f, "2D1P", 4, "", DEF_MODEC,DEF_MODEL }, + { "lshb", 14,24, 0x144e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "lshw", 14,24, 0x154e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "lshd", 14,24, 0x174e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "meib", 14,24, 0x24ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "meiw", 14,24, 0x25ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "meid", 14,24, 0x27ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "modb", 14,24, 0x38ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "modw", 14,24, 0x39ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "modd", 14,24, 0x3bce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "movf", 14,24, 0x05be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "movl", 14,24, 0x04be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "movb", 6,16, 0x14, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "movw", 6,16, 0x15, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "movd", 6,16, 0x17, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "movbf", 14,24, 0x043e, "1B2Z", 1, "", DEF_MODEC,DEF_MODEL }, + { "movwf", 14,24, 0x053e, "1W2Z", 2, "", DEF_MODEC,DEF_MODEL }, + { "movdf", 14,24, 0x073e, "1D2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "movbl", 14,24, 0x003e, "1B2Z", 1, "", DEF_MODEC,DEF_MODEL }, + { "movwl", 14,24, 0x013e, "1W2Z", 2, "", DEF_MODEC,DEF_MODEL }, + { "movdl", 14,24, 0x033e, "1D2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "movfl", 14,24, 0x1b3e, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "movlf", 14,24, 0x163e, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "movmb", 14,24, 0x00ce, "1A2A3b", 1, "", DEF_MODEC,DEF_MODEL }, + { "movmw", 14,24, 0x01ce, "1A2A3b", 2, "", DEF_MODEC,DEF_MODEL }, + { "movmd", 14,24, 0x03ce, "1A2A3b", 4, "", DEF_MODEC,DEF_MODEL }, + { "movqb", 7,16, 0x5c, "2I1q", 1, "", DEF_MODEC,DEF_MODEL }, + { "movqw", 7,16, 0x5d, "2I1q", 2, "", DEF_MODEC,DEF_MODEL }, + { "movqd", 7,16, 0x5f, "2I1q", 4, "", DEF_MODEC,DEF_MODEL }, + { "movsb", 16,24, 0x000e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "movsw", 16,24, 0x010e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "movsd", 16,24, 0x030e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "movst", 16,24, 0x800e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "movsub", 14,24, 0x0cae, "1A2A", 1, "", DEF_MODEC,DEF_MODEL }, + { "movsuw", 14,24, 0x0dae, "1A2A", 2, "", DEF_MODEC,DEF_MODEL }, + { "movsud", 14,24, 0x0fae, "1A2A", 4, "", DEF_MODEC,DEF_MODEL }, + { "movusb", 14,24, 0x1cae, "1A2A", 1, "", DEF_MODEC,DEF_MODEL }, + { "movusw", 14,24, 0x1dae, "1A2A", 2, "", DEF_MODEC,DEF_MODEL }, + { "movusd", 14,24, 0x1fae, "1A2A", 4, "", DEF_MODEC,DEF_MODEL }, + { "movxbd", 14,24, 0x1cce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "movxwd", 14,24, 0x1dce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "movxbw", 14,24, 0x10ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "movzbd", 14,24, 0x18ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "movzwd", 14,24, 0x19ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "movzbw", 14,24, 0x14ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "mulf", 14,24, 0x31be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "mull", 14,24, 0x30be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "mulb", 14,24, 0x20ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "mulw", 14,24, 0x21ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "muld", 14,24, 0x23ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "negf", 14,24, 0x15be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "negl", 14,24, 0x14be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "negb", 14,24, 0x204e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "negw", 14,24, 0x214e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "negd", 14,24, 0x234e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "nop", 8,8, 0xa2, "", 0, "", DEF_MODEC,DEF_MODEL }, + { "notb", 14,24, 0x244e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "notw", 14,24, 0x254e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "notd", 14,24, 0x274e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "orb", 6,16, 0x18, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "orw", 6,16, 0x19, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "ord", 6,16, 0x1b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "quob", 14,24, 0x30ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "quow", 14,24, 0x31ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "quod", 14,24, 0x33ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "rdval", 19,24, 0x0031e,"1A", 4, "", DEF_MODEC,DEF_MODEL }, + { "remb", 14,24, 0x34ce, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "remw", 14,24, 0x35ce, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "remd", 14,24, 0x37ce, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "restore", 8,8, 0x72, "1u", 0, "", DEF_MODEC,DEF_MODEL }, + { "ret", 8,8, 0x12, "1d", 0, "", DEF_MODEC,DEF_MODEL }, + { "reti", 8,8, 0x52, "", 0, "", DEF_MODEC,DEF_MODEL }, + { "rett", 8,8, 0x42, "1d", 0, "", DEF_MODEC,DEF_MODEL }, + { "rotb", 14,24, 0x004e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "rotw", 14,24, 0x014e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "rotd", 14,24, 0x034e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "roundfb", 14,24, 0x243e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "roundfw", 14,24, 0x253e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "roundfd", 14,24, 0x273e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "roundlb", 14,24, 0x203e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "roundlw", 14,24, 0x213e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "roundld", 14,24, 0x233e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "rxp", 8,8, 0x32, "1d", 0, "", DEF_MODEC,DEF_MODEL }, + { "seqb", 11,16, 0x3c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "seqw", 11,16, 0x3d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "seqd", 11,16, 0x3f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sneb", 11,16, 0xbc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "snew", 11,16, 0xbd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sned", 11,16, 0xbf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "scsb", 11,16, 0x13c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "scsw", 11,16, 0x13d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "scsd", 11,16, 0x13f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sccb", 11,16, 0x1bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sccw", 11,16, 0x1bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sccd", 11,16, 0x1bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "shib", 11,16, 0x23c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "shiw", 11,16, 0x23d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "shid", 11,16, 0x23f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "slsb", 11,16, 0x2bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "slsw", 11,16, 0x2bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "slsd", 11,16, 0x2bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sgtb", 11,16, 0x33c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sgtw", 11,16, 0x33d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sgtd", 11,16, 0x33f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sleb", 11,16, 0x3bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "slew", 11,16, 0x3bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sled", 11,16, 0x3bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfsb", 11,16, 0x43c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfsw", 11,16, 0x43d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfsd", 11,16, 0x43f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfcb", 11,16, 0x4bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfcw", 11,16, 0x4bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfcd", 11,16, 0x4bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "slob", 11,16, 0x53c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "slow", 11,16, 0x53d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "slod", 11,16, 0x53f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "shsb", 11,16, 0x5bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "shsw", 11,16, 0x5bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "shsd", 11,16, 0x5bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sltb", 11,16, 0x63c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sltw", 11,16, 0x63d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sltd", 11,16, 0x63f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sgeb", 11,16, 0x6bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sgew", 11,16, 0x6bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sged", 11,16, 0x6bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sutb", 11,16, 0x73c, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sutw", 11,16, 0x73d, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sutd", 11,16, 0x73f, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "sufb", 11,16, 0x7bc, "1B", 0, "", DEF_MODEC,DEF_MODEL }, + { "sufw", 11,16, 0x7bd, "1W", 0, "", DEF_MODEC,DEF_MODEL }, + { "sufd", 11,16, 0x7bf, "1D", 0, "", DEF_MODEC,DEF_MODEL }, + { "save", 8,8, 0x62, "1U", 0, "", DEF_MODEC,DEF_MODEL }, + { "sbitb", 14,24, 0x184e, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, + { "sbitw", 14,24, 0x194e, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, + { "sbitd", 14,24, 0x1b4e, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, + { "sbitib", 14,24, 0x1c4e, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, + { "sbitiw", 14,24, 0x1d4e, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, + { "sbitid", 14,24, 0x1f4e, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, + { "setcfg", 15,24, 0x0b0e, "1O", 0, "", DEF_MODEC,DEF_MODEL }, + { "sfsr", 14,24, 0x373e, "1f", 0, "", DEF_MODEC,DEF_MODEL }, + { "skpsb", 16,24, 0x0c0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "skpsw", 16,24, 0x0d0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "skpsd", 16,24, 0x0f0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "skpst", 16,24, 0x8c0e, "1S", 0, "[]", DEF_MODEC,DEF_MODEL }, + { "smr", 15,24, 0x0f1e, "2I1M", 4, "", DEF_MODEC,DEF_MODEL }, + { "sprb", 7,16, 0x2c, "2I1P", 1, "", DEF_MODEC,DEF_MODEL }, + { "sprw", 7,16, 0x2d, "2I1P", 2, "", DEF_MODEC,DEF_MODEL }, + { "sprd", 7,16, 0x2f, "2I1P", 4, "", DEF_MODEC,DEF_MODEL }, + { "subf", 14,24, 0x11be, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "subl", 14,24, 0x10be, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "subb", 6,16, 0x20, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "subw", 6,16, 0x21, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "subd", 6,16, 0x23, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "subcb", 6,16, 0x30, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "subcw", 6,16, 0x31, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "subcd", 6,16, 0x33, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "subpb", 14,24, 0x2c4e, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "subpw", 14,24, 0x2d4e, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "subpd", 14,24, 0x2f4e, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, +#ifdef NS32K_SVC_IMMED_OPERANDS + { "svc", 8,8, 0xe2, "2i1i", 1, "", DEF_MODEC,DEF_MODEL }, /* not really, but some unix uses it */ +#else + { "svc", 8,8, 0xe2, "", 0, "", DEF_MODEC,DEF_MODEL }, +#endif + { "tbitb", 6,16, 0x34, "1B2A", 1, "", DEF_MODEC,DEF_MODEL }, + { "tbitw", 6,16, 0x35, "1W2A", 2, "", DEF_MODEC,DEF_MODEL }, + { "tbitd", 6,16, 0x37, "1D2A", 4, "", DEF_MODEC,DEF_MODEL }, + { "truncfb", 14,24, 0x2c3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "truncfw", 14,24, 0x2d3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "truncfd", 14,24, 0x2f3e, "1F2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "trunclb", 14,24, 0x283e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "trunclw", 14,24, 0x293e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "truncld", 14,24, 0x2b3e, "1L2I", 8, "", DEF_MODEC,DEF_MODEL }, + { "wait", 8,8, 0xb2, "", 0, "", DEF_MODEC,DEF_MODEL }, + { "wrval", 19,24, 0x0071e,"1A", 0, "", DEF_MODEC,DEF_MODEL }, + { "xorb", 6,16, 0x38, "1B2I", 1, "", DEF_MODEC,DEF_MODEL }, + { "xorw", 6,16, 0x39, "1W2I", 2, "", DEF_MODEC,DEF_MODEL }, + { "xord", 6,16, 0x3b, "1D2I", 4, "", DEF_MODEC,DEF_MODEL }, + { "dotf", 14,24, 0x0dfe, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, + { "dotl", 14,24, 0x0cfe, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, + { "logbf", 14,24, 0x15fe, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "logbl", 14,24, 0x14fe, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, + { "polyf", 14,24, 0x09fe, "1F2F", 4, "", DEF_MODEC,DEF_MODEL }, + { "polyl", 14,24, 0x08fe, "1L2L", 8, "", DEF_MODEC,DEF_MODEL }, + { "scalbf", 14,24, 0x11fe, "1F2Z", 4, "", DEF_MODEC,DEF_MODEL }, + { "scalbl", 14,24, 0x10fe, "1L2Z", 8, "", DEF_MODEC,DEF_MODEL }, +}; + +#define MAX_ARGS 4 +#define ARG_LEN 50 + diff --git a/include/opcode/or32.h b/include/opcode/or32.h new file mode 100644 index 0000000..153d91e --- /dev/null +++ b/include/opcode/or32.h @@ -0,0 +1,181 @@ +/* Table of opcodes for the OpenRISC 1000 ISA. + Copyright 2002, 2003, 2010 Free Software Foundation, Inc. + Contributed by Damjan Lampret (lampret@opencores.org). + + This file is part of or1k_gen_isa, or1ksim, GDB and GAS. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* We treat all letters the same in encode/decode routines so + we need to assign some characteristics to them like signess etc. */ + +#ifndef OR32_H_ISA +#define OR32_H_ISA + +#define NUM_UNSIGNED (0) +#define NUM_SIGNED (1) + +#define MAX_GPRS 32 +#define PAGE_SIZE 4096 +#undef __HALF_WORD_INSN__ + +#define OPERAND_DELIM (',') + +#define OR32_IF_DELAY (1) +#define OR32_W_FLAG (2) +#define OR32_R_FLAG (4) + +struct or32_letter +{ + char letter; + int sign; + /* int reloc; relocation per letter ?? */ +}; + +/* Main instruction specification array. */ +struct or32_opcode +{ + /* Name of the instruction. */ + char *name; + + /* A string of characters which describe the operands. + Valid characters are: + ,() Itself. Characters appears in the assembly code. + rA Register operand. + rB Register operand. + rD Register operand. + I An immediate operand, range -32768 to 32767. + J An immediate operand, range . (unused) + K An immediate operand, range 0 to 65535. + L An immediate operand, range 0 to 63. + M An immediate operand, range . (unused) + N An immediate operand, range -33554432 to 33554431. + O An immediate operand, range . (unused). */ + char *args; + + /* Opcode and operand encoding. */ + char *encoding; + void (*exec) (void); + unsigned int flags; +}; + +#define OPTYPE_LAST (0x80000000) +#define OPTYPE_OP (0x40000000) +#define OPTYPE_REG (0x20000000) +#define OPTYPE_SIG (0x10000000) +#define OPTYPE_DIS (0x08000000) +#define OPTYPE_DST (0x04000000) +#define OPTYPE_SBIT (0x00001F00) +#define OPTYPE_SHR (0x0000001F) +#define OPTYPE_SBIT_SHR (8) + +/* MM: Data how to decode operands. */ +extern struct insn_op_struct +{ + unsigned long type; + unsigned long data; +} **op_start; + +#ifdef HAS_EXECUTION +extern void l_invalid (void); +extern void l_sfne (void); +extern void l_bf (void); +extern void l_add (void); +extern void l_sw (void); +extern void l_sb (void); +extern void l_sh (void); +extern void l_lwz (void); +extern void l_lbs (void); +extern void l_lbz (void); +extern void l_lhs (void); +extern void l_lhz (void); +extern void l_movhi (void); +extern void l_and (void); +extern void l_or (void); +extern void l_xor (void); +extern void l_sub (void); +extern void l_mul (void); +extern void l_div (void); +extern void l_divu (void); +extern void l_sll (void); +extern void l_sra (void); +extern void l_srl (void); +extern void l_j (void); +extern void l_jal (void); +extern void l_jalr (void); +extern void l_jr (void); +extern void l_rfe (void); +extern void l_nop (void); +extern void l_bnf (void); +extern void l_sfeq (void); +extern void l_sfgts (void); +extern void l_sfges (void); +extern void l_sflts (void); +extern void l_sfles (void); +extern void l_sfgtu (void); +extern void l_sfgeu (void); +extern void l_sfltu (void); +extern void l_sfleu (void); +extern void l_mtspr (void); +extern void l_mfspr (void); +extern void l_sys (void); +extern void l_trap (void); /* CZ 21/06/01. */ +extern void l_macrc (void); +extern void l_mac (void); +extern void l_msb (void); +extern void l_invalid (void); +extern void l_cust1 (void); +extern void l_cust2 (void); +extern void l_cust3 (void); +extern void l_cust4 (void); +#endif +extern void l_none (void); + +extern const struct or32_letter or32_letters[]; + +extern const struct or32_opcode or32_opcodes[]; + +extern const unsigned int or32_num_opcodes; + +/* Calculates instruction length in bytes. Always 4 for OR32. */ +extern int insn_len (int); + +/* Is individual insn's operand signed or unsigned? */ +extern int letter_signed (char); + +/* Number of letters in the individual lettered operand. */ +extern int letter_range (char); + +/* MM: Returns index of given instruction name. */ +extern int insn_index (char *); + +/* MM: Returns instruction name from index. */ +extern const char *insn_name (int); + +/* MM: Constructs new FSM, based on or32_opcodes. */ +extern void build_automata (void); + +/* MM: Destructs FSM. */ +extern void destruct_automata (void); + +/* MM: Decodes instruction using FSM. Call build_automata first. */ +extern int insn_decode (unsigned int); + +/* Disassemble one instruction from insn to disassemble. + Return the size of the instruction. */ +int disassemble_insn (unsigned long); + +#endif diff --git a/include/opcode/pdp11.h b/include/opcode/pdp11.h new file mode 100644 index 0000000..24e13b2 --- /dev/null +++ b/include/opcode/pdp11.h @@ -0,0 +1,84 @@ +/* PDP-11 opcde list. + Copyright 2001, 2002, 2010 Free Software Foundation, Inc. + + This file is part of GDB and GAS. + + GDB and GAS are 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, or (at your option) + any later version. + + GDB and GAS are 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 GDB or GAS; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* PDP-11 opcode types. */ + +#define PDP11_OPCODE_NO_OPS 0 +#define PDP11_OPCODE_REG 1 /* register */ +#define PDP11_OPCODE_OP 2 /* generic operand */ +#define PDP11_OPCODE_REG_OP 3 /* register and generic operand */ +#define PDP11_OPCODE_REG_OP_REV 4 /* register and generic operand, + reversed syntax */ +#define PDP11_OPCODE_AC_FOP 5 /* fpu accumulator and generic float + operand */ +#define PDP11_OPCODE_OP_OP 6 /* two generic operands */ +#define PDP11_OPCODE_DISPL 7 /* pc-relative displacement */ +#define PDP11_OPCODE_REG_DISPL 8 /* redister and pc-relative + displacement */ +#define PDP11_OPCODE_IMM8 9 /* 8-bit immediate */ +#define PDP11_OPCODE_IMM6 10 /* 6-bit immediate */ +#define PDP11_OPCODE_IMM3 11 /* 3-bit immediate */ +#define PDP11_OPCODE_ILLEGAL 12 /* illegal instruction */ +#define PDP11_OPCODE_FOP_AC 13 /* generic float argument, then fpu + accumulator */ +#define PDP11_OPCODE_FOP 14 /* generic float operand */ +#define PDP11_OPCODE_AC_OP 15 /* fpu accumulator and generic int + operand */ +#define PDP11_OPCODE_OP_AC 16 /* generic int argument, then fpu + accumulator */ + +/* + * PDP-11 instruction set extensions. + * + * Please keep the numbers low, as they are used as indices into + * an array. + */ + +#define PDP11_NONE 0 /* not in instruction set */ +#define PDP11_BASIC 1 /* basic instruction set (11/20 etc) */ +#define PDP11_CSM 2 /* commercial instruction set */ +#define PDP11_CIS 3 /* commercial instruction set */ +#define PDP11_EIS 4 /* extended instruction set (11/45 etc) */ +#define PDP11_FIS 5 /* KEV11 floating-point instructions */ +#define PDP11_FPP 6 /* FP-11 floating-point instructions */ +#define PDP11_LEIS 7 /* limited extended instruction set + (11/40 etc) */ +#define PDP11_MFPT 8 /* move from processor type */ +#define PDP11_MPROC 9 /* multiprocessor instructions: tstset, + wrtlck */ +#define PDP11_MXPS 10 /* move from/to processor status */ +#define PDP11_SPL 11 /* set priority level */ +#define PDP11_UCODE 12 /* microcode instructions: ldub, med, xfc */ +#define PDP11_EXT_NUM 13 /* total number of extension types */ + +struct pdp11_opcode +{ + const char *name; + int opcode; + int mask; + int type; + int extension; +}; + +extern const struct pdp11_opcode pdp11_opcodes[]; +extern const struct pdp11_opcode pdp11_aliases[]; +extern const int pdp11_num_opcodes, pdp11_num_aliases; + +/* end of pdp11.h */ diff --git a/include/opcode/pj.h b/include/opcode/pj.h new file mode 100644 index 0000000..e6ffacc --- /dev/null +++ b/include/opcode/pj.h @@ -0,0 +1,49 @@ +/* Definitions for decoding the picoJava opcode table. + Copyright 1999, 2002, 2003, 2010 Free Software Foundation, Inc. + Contributed by Steve Chamberlain of Transmeta (sac@pobox.com). + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Names used to describe the type of instruction arguments, used by + the assembler and disassembler. Attributes are encoded in various fields. */ + +/* reloc size pcrel uns */ +#define O_N 0 +#define O_16 (1<<4 | 2 | (0<<6) | (0<<3)) +#define O_U16 (1<<4 | 2 | (0<<6) | (1<<3)) +#define O_R16 (2<<4 | 2 | (1<<6) | (0<<3)) +#define O_8 (3<<4 | 1 | (0<<6) | (0<<3)) +#define O_U8 (3<<4 | 1 | (0<<6) | (1<<3)) +#define O_R8 (4<<4 | 1 | (0<<6) | (0<<3)) +#define O_R32 (5<<4 | 4 | (1<<6) | (0<<3)) +#define O_32 (6<<4 | 4 | (0<<6) | (0<<3)) + +#define ASIZE(x) ((x) & 0x7) +#define PCREL(x) (!!((x) & (1<<6))) +#define UNS(x) (!!((x) & (1<<3))) + + +typedef struct pj_opc_info_t +{ + short opcode; + short opcode_next; + char len; + unsigned char arg[2]; + union { + const char *name; + void (*func) (struct pj_opc_info_t *, char *); + } u; +} pj_opc_info_t; diff --git a/include/opcode/pn.h b/include/opcode/pn.h new file mode 100644 index 0000000..6674030 --- /dev/null +++ b/include/opcode/pn.h @@ -0,0 +1,283 @@ +/* Print GOULD PN (PowerNode) instructions for GDB, the GNU debugger. + Copyright 1986, 1987, 1989, 1991, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + + GDB 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, or (at your option) + any later version. + + GDB 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 GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +struct gld_opcode +{ + char *name; + unsigned long opcode; + unsigned long mask; + char *args; + int length; +}; + +/* We store four bytes of opcode for all opcodes because that + is the most any of them need. The actual length of an instruction + is always at least 2 bytes, and at most four. The length of the + instruction is based on the opcode. + + The mask component is a mask saying which bits must match + particular opcode in order for an instruction to be an instance + of that opcode. + + The args component is a string containing characters + that are used to format the arguments to the instruction. */ + +/* Kinds of operands: + r Register in first field + R Register in second field + b Base register in first field + B Base register in second field + v Vector register in first field + V Vector register in first field + A Optional address register (base register) + X Optional index register + I Immediate data (16bits signed) + O Offset field (16bits signed) + h Offset field (15bits signed) + d Offset field (14bits signed) + S Shift count field + + any other characters are printed as is... +*/ + +/* The assembler requires that this array be sorted as follows: + all instances of the same mnemonic must be consecutive. + All instances of the same mnemonic with the same number of operands + must be consecutive. + */ +struct gld_opcode gld_opcodes[] = +{ +{ "abm", 0xa0080000, 0xfc080000, "f,xOA,X", 4 }, +{ "abr", 0x18080000, 0xfc0c0000, "r,f", 2 }, +{ "aci", 0xfc770000, 0xfc7f8000, "r,I", 4 }, +{ "adfd", 0xe0080002, 0xfc080002, "r,xOA,X", 4 }, +{ "adfw", 0xe0080000, 0xfc080000, "r,xOA,X", 4 }, +{ "adi", 0xc8010000, 0xfc7f0000, "r,I", 4 }, +{ "admb", 0xb8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "admd", 0xb8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "admh", 0xb8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "admw", 0xb8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "adr", 0x38000000, 0xfc0f0000, "r,R", 2 }, +{ "adrfd", 0x38090000, 0xfc0f0000, "r,R", 2 }, +{ "adrfw", 0x38010000, 0xfc0f0000, "r,R", 2 }, +{ "adrm", 0x38080000, 0xfc0f0000, "r,R", 2 }, +{ "ai", 0xfc030000, 0xfc07ffff, "I", 4 }, +{ "anmb", 0x84080000, 0xfc080000, "r,xOA,X", 4 }, +{ "anmd", 0x84000002, 0xfc080002, "r,xOA,X", 4 }, +{ "anmh", 0x84000001, 0xfc080001, "r,xOA,X", 4 }, +{ "anmw", 0x84000000, 0xfc080000, "r,xOA,X", 4 }, +{ "anr", 0x04000000, 0xfc0f0000, "r,R", 2 }, +{ "armb", 0xe8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "armd", 0xe8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "armh", 0xe8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "armw", 0xe8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "bcf", 0xf0000000, 0xfc080000, "I,xOA,X", 4 }, +{ "bct", 0xec000000, 0xfc080000, "I,xOA,X", 4 }, +{ "bei", 0x00060000, 0xffff0000, "", 2 }, +{ "bft", 0xf0000000, 0xff880000, "xOA,X", 4 }, +{ "bib", 0xf4000000, 0xfc780000, "r,xOA", 4 }, +{ "bid", 0xf4600000, 0xfc780000, "r,xOA", 4 }, +{ "bih", 0xf4200000, 0xfc780000, "r,xOA", 4 }, +{ "biw", 0xf4400000, 0xfc780000, "r,xOA", 4 }, +{ "bl", 0xf8800000, 0xff880000, "xOA,X", 4 }, +{ "bsub", 0x5c080000, 0xff8f0000, "", 2 }, +{ "bsubm", 0x28080000, 0xfc080000, "", 4 }, +{ "bu", 0xec000000, 0xff880000, "xOA,X", 4 }, +{ "call", 0x28080000, 0xfc0f0000, "", 2 }, +{ "callm", 0x5c080000, 0xff880000, "", 4 }, +{ "camb", 0x90080000, 0xfc080000, "r,xOA,X", 4 }, +{ "camd", 0x90000002, 0xfc080002, "r,xOA,X", 4 }, +{ "camh", 0x90000001, 0xfc080001, "r,xOA,X", 4 }, +{ "camw", 0x90000000, 0xfc080000, "r.xOA,X", 4 }, +{ "car", 0x10000000, 0xfc0f0000, "r,R", 2 }, +{ "cd", 0xfc060000, 0xfc070000, "r,f", 4 }, +{ "cea", 0x000f0000, 0xffff0000, "", 2 }, +{ "ci", 0xc8050000, 0xfc7f0000, "r,I", 4 }, +{ "cmc", 0x040a0000, 0xfc7f0000, "r", 2 }, +{ "cmmb", 0x94080000, 0xfc080000, "r,xOA,X", 4 }, +{ "cmmd", 0x94000002, 0xfc080002, "r,xOA,X", 4 }, +{ "cmmh", 0x94000001, 0xfc080001, "r,xOA,X", 4 }, +{ "cmmw", 0x94000000, 0xfc080000, "r,xOA,X", 4 }, +{ "cmr", 0x14000000, 0xfc0f0000, "r,R", 2 }, +{ "daci", 0xfc7f0000, 0xfc7f8000, "r,I", 4 }, +{ "dae", 0x000e0000, 0xffff0000, "", 2 }, +{ "dai", 0xfc040000, 0xfc07ffff, "I", 4 }, +{ "dci", 0xfc6f0000, 0xfc7f8000, "r,I", 4 }, +{ "di", 0xfc010000, 0xfc07ffff, "I", 4 }, +{ "dvfd", 0xe4000002, 0xfc080002, "r,xOA,X", 4 }, +{ "dvfw", 0xe4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "dvi", 0xc8040000, 0xfc7f0000, "r,I", 4 }, +{ "dvmb", 0xc4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "dvmh", 0xc4000001, 0xfc080001, "r,xOA,X", 4 }, +{ "dvmw", 0xc4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "dvr", 0x380a0000, 0xfc0f0000, "r,R", 2 }, +{ "dvrfd", 0x380c0000, 0xfc0f0000, "r,R", 4 }, +{ "dvrfw", 0x38040000, 0xfc0f0000, "r,xOA,X", 4 }, +{ "eae", 0x00080000, 0xffff0000, "", 2 }, +{ "eci", 0xfc670000, 0xfc7f8080, "r,I", 4 }, +{ "ecwcs", 0xfc4f0000, 0xfc7f8000, "", 4 }, +{ "ei", 0xfc000000, 0xfc07ffff, "I", 4 }, +{ "eomb", 0x8c080000, 0xfc080000, "r,xOA,X", 4 }, +{ "eomd", 0x8c000002, 0xfc080002, "r,xOA,X", 4 }, +{ "eomh", 0x8c000001, 0xfc080001, "r,xOA,X", 4 }, +{ "eomw", 0x8c000000, 0xfc080000, "r,xOA,X", 4 }, +{ "eor", 0x0c000000, 0xfc0f0000, "r,R", 2 }, +{ "eorm", 0x0c080000, 0xfc0f0000, "r,R", 2 }, +{ "es", 0x00040000, 0xfc7f0000, "r", 2 }, +{ "exm", 0xa8000000, 0xff880000, "xOA,X", 4 }, +{ "exr", 0xc8070000, 0xfc7f0000, "r", 2 }, +{ "exrr", 0xc8070002, 0xfc7f0002, "r", 2 }, +{ "fixd", 0x380d0000, 0xfc0f0000, "r,R", 2 }, +{ "fixw", 0x38050000, 0xfc0f0000, "r,R", 2 }, +{ "fltd", 0x380f0000, 0xfc0f0000, "r,R", 2 }, +{ "fltw", 0x38070000, 0xfc0f0000, "r,R", 2 }, +{ "grio", 0xfc3f0000, 0xfc7f8000, "r,I", 4 }, +{ "halt", 0x00000000, 0xffff0000, "", 2 }, +{ "hio", 0xfc370000, 0xfc7f8000, "r,I", 4 }, +{ "jwcs", 0xfa080000, 0xff880000, "xOA,X", 4 }, +{ "la", 0x50000000, 0xfc000000, "r,xOA,X", 4 }, +{ "labr", 0x58080000, 0xfc080000, "b,xOA,X", 4 }, +{ "lb", 0xac080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lcs", 0x00030000, 0xfc7f0000, "r", 2 }, +{ "ld", 0xac000002, 0xfc080002, "r,xOA,X", 4 }, +{ "lear", 0x80000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lf", 0xcc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lfbr", 0xcc080000, 0xfc080000, "b,xOA,X", 4 }, +{ "lh", 0xac000001, 0xfc080001, "r,xOA,X", 4 }, +{ "li", 0xc8000000, 0xfc7f0000, "r,I", 4 }, +{ "lmap", 0x2c070000, 0xfc7f0000, "r", 2 }, +{ "lmb", 0xb0080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lmd", 0xb0000002, 0xfc080002, "r,xOA,X", 4 }, +{ "lmh", 0xb0000001, 0xfc080001, "r,xOA,X", 4 }, +{ "lmw", 0xb0000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lnb", 0xb4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "lnd", 0xb4000002, 0xfc080002, "r,xOA,X", 4 }, +{ "lnh", 0xb4000001, 0xfc080001, "r,xOA,X", 4 }, +{ "lnw", 0xb4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lpsd", 0xf9800000, 0xff880000, "r,xOA,X", 4 }, +{ "lpsdcm", 0xfa800000, 0xff880000, "r,xOA,X", 4 }, +{ "lw", 0xac000000, 0xfc080000, "r,xOA,X", 4 }, +{ "lwbr", 0x5c000000, 0xfc080000, "b,xOA,X", 4 }, +{ "mpfd", 0xe4080002, 0xfc080002, "r,xOA,X", 4 }, +{ "mpfw", 0xe4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "mpi", 0xc8030000, 0xfc7f0000, "r,I", 4 }, +{ "mpmb", 0xc0080000, 0xfc080000, "r,xOA,X", 4 }, +{ "mpmh", 0xc0000001, 0xfc080001, "r,xOA,X", 4 }, +{ "mpmw", 0xc0000000, 0xfc080000, "r,xOA,X", 4 }, +{ "mpr", 0x38020000, 0xfc0f0000, "r,R", 2 }, +{ "mprfd", 0x380e0000, 0xfc0f0000, "r,R", 2 }, +{ "mprfw", 0x38060000, 0xfc0f0000, "r,R", 2 }, +{ "nop", 0x00020000, 0xffff0000, "", 2 }, +{ "ormb", 0x88080000, 0xfc080000, "r,xOA,X", 4 }, +{ "ormd", 0x88000002, 0xfc080002, "r,xOA,X", 4 }, +{ "ormh", 0x88000001, 0xfc080001, "r,xOA,X", 4 }, +{ "ormw", 0x88000000, 0xfc080000, "r,xOA,X", 4 }, +{ "orr", 0x08000000, 0xfc0f0000, "r,R", 2 }, +{ "orrm", 0x08080000, 0xfc0f0000, "r,R", 2 }, +{ "rdsts", 0x00090000, 0xfc7f0000, "r", 2 }, +{ "return", 0x280e0000, 0xfc7f0000, "", 2 }, +{ "ri", 0xfc020000, 0xfc07ffff, "I", 4 }, +{ "rnd", 0x00050000, 0xfc7f0000, "r", 2 }, +{ "rpswt", 0x040b0000, 0xfc7f0000, "r", 2 }, +{ "rschnl", 0xfc2f0000, 0xfc7f8000, "r,I", 4 }, +{ "rsctl", 0xfc470000, 0xfc7f8000, "r,I", 4 }, +{ "rwcs", 0x000b0000, 0xfc0f0000, "r,R", 2 }, +{ "sacz", 0x10080000, 0xfc0f0000, "r,R", 2 }, +{ "sbm", 0x98080000, 0xfc080000, "f,xOA,X", 4 }, +{ "sbr", 0x18000000, 0xfc0c0000, "r,f", 4 }, +{ "sea", 0x000d0000, 0xffff0000, "", 2 }, +{ "setcpu", 0x2c090000, 0xfc7f0000, "r", 2 }, +{ "sio", 0xfc170000, 0xfc7f8000, "r,I", 4 }, +{ "sipu", 0x000a0000, 0xffff0000, "", 2 }, +{ "sla", 0x1c400000, 0xfc600000, "r,S", 2 }, +{ "slad", 0x20400000, 0xfc600000, "r,S", 2 }, +{ "slc", 0x24400000, 0xfc600000, "r,S", 2 }, +{ "sll", 0x1c600000, 0xfc600000, "r,S", 2 }, +{ "slld", 0x20600000, 0xfc600000, "r,S", 2 }, +{ "smc", 0x04070000, 0xfc070000, "", 2 }, +{ "sra", 0x1c000000, 0xfc600000, "r,S", 2 }, +{ "srad", 0x20000000, 0xfc600000, "r,S", 2 }, +{ "src", 0x24000000, 0xfc600000, "r,S", 2 }, +{ "srl", 0x1c200000, 0xfc600000, "r,S", 2 }, +{ "srld", 0x20200000, 0xfc600000, "r,S", 2 }, +{ "stb", 0xd4080000, 0xfc080000, "r,xOA,X", 4 }, +{ "std", 0xd4000002, 0xfc080002, "r,xOA,X", 4 }, +{ "stf", 0xdc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "stfbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, +{ "sth", 0xd4000001, 0xfc080001, "r,xOA,X", 4 }, +{ "stmb", 0xd8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "stmd", 0xd8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "stmh", 0xd8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "stmw", 0xd8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "stpio", 0xfc270000, 0xfc7f8000, "r,I", 4 }, +{ "stw", 0xd4000000, 0xfc080000, "r,xOA,X", 4 }, +{ "stwbr", 0x54000000, 0xfc080000, "b,xOA,X", 4 }, +{ "suabr", 0x58000000, 0xfc080000, "b,xOA,X", 4 }, +{ "sufd", 0xe0000002, 0xfc080002, "r,xOA,X", 4 }, +{ "sufw", 0xe0000000, 0xfc080000, "r,xOA,X", 4 }, +{ "sui", 0xc8020000, 0xfc7f0000, "r,I", 4 }, +{ "sumb", 0xbc080000, 0xfc080000, "r,xOA,X", 4 }, +{ "sumd", 0xbc000002, 0xfc080002, "r,xOA,X", 4 }, +{ "sumh", 0xbc000001, 0xfc080001, "r,xOA,X", 4 }, +{ "sumw", 0xbc000000, 0xfc080000, "r,xOA,X", 4 }, +{ "sur", 0x3c000000, 0xfc0f0000, "r,R", 2 }, +{ "surfd", 0x380b0000, 0xfc0f0000, "r,xOA,X", 4 }, +{ "surfw", 0x38030000, 0xfc0f0000, "r,R", 2 }, +{ "surm", 0x3c080000, 0xfc0f0000, "r,R", 2 }, +{ "svc", 0xc8060000, 0xffff0000, "", 4 }, +{ "tbm", 0xa4080000, 0xfc080000, "f,xOA,X", 4 }, +{ "tbr", 0x180c0000, 0xfc0c0000, "r,f", 2 }, +{ "tbrr", 0x2c020000, 0xfc0f0000, "r,B", 2 }, +{ "tccr", 0x28040000, 0xfc7f0000, "", 2 }, +{ "td", 0xfc050000, 0xfc070000, "r,f", 4 }, +{ "tio", 0xfc1f0000, 0xfc7f8000, "r,I", 4 }, +{ "tmapr", 0x2c0a0000, 0xfc0f0000, "r,R", 2 }, +{ "tpcbr", 0x280c0000, 0xfc7f0000, "r", 2 }, +{ "trbr", 0x2c010000, 0xfc0f0000, "b,R", 2 }, +{ "trc", 0x2c030000, 0xfc0f0000, "r,R", 2 }, +{ "trcc", 0x28050000, 0xfc7f0000, "", 2 }, +{ "trcm", 0x2c0b0000, 0xfc0f0000, "r,R", 2 }, +{ "trn", 0x2c040000, 0xfc0f0000, "r,R", 2 }, +{ "trnm", 0x2c0c0000, 0xfc0f0000, "r,R", 2 }, +{ "trr", 0x2c000000, 0xfc0f0000, "r,R", 2 }, +{ "trrm", 0x2c080000, 0xfc0f0000, "r,R", 2 }, +{ "trsc", 0x2c0e0000, 0xfc0f0000, "r,R", 2 }, +{ "trsw", 0x28000000, 0xfc7f0000, "r", 2 }, +{ "tscr", 0x2c0f0000, 0xfc0f0000, "r,R", 2 }, +{ "uei", 0x00070000, 0xffff0000, "", 2 }, +{ "wait", 0x00010000, 0xffff0000, "", 2 }, +{ "wcwcs", 0xfc5f0000, 0xfc7f8000, "", 4 }, +{ "wwcs", 0x000c0000, 0xfc0f0000, "r,R", 2 }, +{ "xcbr", 0x28020000, 0xfc0f0000, "b,B", 2 }, +{ "xcr", 0x2c050000, 0xfc0f0000, "r,R", 2 }, +{ "xcrm", 0x2c0d0000, 0xfc0f0000, "r,R", 2 }, +{ "zbm", 0x9c080000, 0xfc080000, "f,xOA,X", 4 }, +{ "zbr", 0x18040000, 0xfc0c0000, "r,f", 2 }, +{ "zmb", 0xf8080000, 0xfc080000, "r,xOA,X", 4 }, +{ "zmd", 0xf8000002, 0xfc080002, "r,xOA,X", 4 }, +{ "zmh", 0xf8000001, 0xfc080001, "r,xOA,X", 4 }, +{ "zmw", 0xf8000000, 0xfc080000, "r,xOA,X", 4 }, +{ "zr", 0x0c000000, 0xfc0f0000, "r", 2 }, +}; + +int numopcodes = sizeof(gld_opcodes) / sizeof(gld_opcodes[0]); + +struct gld_opcode *endop = gld_opcodes + sizeof(gld_opcodes) / + sizeof(gld_opcodes[0]); diff --git a/include/opcode/ppc.h b/include/opcode/ppc.h new file mode 100644 index 0000000..df97130 --- /dev/null +++ b/include/opcode/ppc.h @@ -0,0 +1,413 @@ +/* ppc.h -- Header file for PowerPC opcode table + Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, + 2007, 2008, 2009, 2010, 2012 Free Software Foundation, Inc. + Written by Ian Lance Taylor, Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef PPC_H +#define PPC_H + +#include "bfd_stdint.h" + +typedef uint64_t ppc_cpu_t; + +/* The opcode table is an array of struct powerpc_opcode. */ + +struct powerpc_opcode +{ + /* The opcode name. */ + const char *name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + unsigned long opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + unsigned long mask; + + /* One bit flags for the opcode. These are used to indicate which + specific processors support the instructions. The defined values + are listed below. */ + ppc_cpu_t flags; + + /* One bit flags for the opcode. These are used to indicate which + specific processors no longer support the instructions. The defined + values are listed below. */ + ppc_cpu_t deprecated; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[8]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct powerpc_opcode powerpc_opcodes[]; +extern const int powerpc_num_opcodes; +extern const struct powerpc_opcode vle_opcodes[]; +extern const int vle_num_opcodes; + +/* Values defined for the flags field of a struct powerpc_opcode. */ + +/* Opcode is defined for the PowerPC architecture. */ +#define PPC_OPCODE_PPC 1 + +/* Opcode is defined for the POWER (RS/6000) architecture. */ +#define PPC_OPCODE_POWER 2 + +/* Opcode is defined for the POWER2 (Rios 2) architecture. */ +#define PPC_OPCODE_POWER2 4 + +/* Opcode is supported by the Motorola PowerPC 601 processor. The 601 + is assumed to support all PowerPC (PPC_OPCODE_PPC) instructions, + but it also supports many additional POWER instructions. */ +#define PPC_OPCODE_601 8 + +/* Opcode is supported in both the Power and PowerPC architectures + (ie, compiler's -mcpu=common or assembler's -mcom). More than just + the intersection of PPC_OPCODE_PPC with the union of PPC_OPCODE_POWER + and PPC_OPCODE_POWER2 because many instructions changed mnemonics + between POWER and POWERPC. */ +#define PPC_OPCODE_COMMON 0x10 + +/* Opcode is supported for any Power or PowerPC platform (this is + for the assembler's -many option, and it eliminates duplicates). */ +#define PPC_OPCODE_ANY 0x20 + +/* Opcode is only defined on 64 bit architectures. */ +#define PPC_OPCODE_64 0x40 + +/* Opcode is supported as part of the 64-bit bridge. */ +#define PPC_OPCODE_64_BRIDGE 0x80 + +/* Opcode is supported by Altivec Vector Unit */ +#define PPC_OPCODE_ALTIVEC 0x100 + +/* Opcode is supported by PowerPC 403 processor. */ +#define PPC_OPCODE_403 0x200 + +/* Opcode is supported by PowerPC BookE processor. */ +#define PPC_OPCODE_BOOKE 0x400 + +/* Opcode is supported by PowerPC 440 processor. */ +#define PPC_OPCODE_440 0x800 + +/* Opcode is only supported by Power4 architecture. */ +#define PPC_OPCODE_POWER4 0x1000 + +/* Opcode is only supported by Power7 architecture. */ +#define PPC_OPCODE_POWER7 0x2000 + +/* Opcode is only supported by e500x2 Core. */ +#define PPC_OPCODE_SPE 0x4000 + +/* Opcode is supported by e500x2 Integer select APU. */ +#define PPC_OPCODE_ISEL 0x8000 + +/* Opcode is an e500 SPE floating point instruction. */ +#define PPC_OPCODE_EFS 0x10000 + +/* Opcode is supported by branch locking APU. */ +#define PPC_OPCODE_BRLOCK 0x20000 + +/* Opcode is supported by performance monitor APU. */ +#define PPC_OPCODE_PMR 0x40000 + +/* Opcode is supported by cache locking APU. */ +#define PPC_OPCODE_CACHELCK 0x80000 + +/* Opcode is supported by machine check APU. */ +#define PPC_OPCODE_RFMCI 0x100000 + +/* Opcode is only supported by Power5 architecture. */ +#define PPC_OPCODE_POWER5 0x200000 + +/* Opcode is supported by PowerPC e300 family. */ +#define PPC_OPCODE_E300 0x400000 + +/* Opcode is only supported by Power6 architecture. */ +#define PPC_OPCODE_POWER6 0x800000 + +/* Opcode is only supported by PowerPC Cell family. */ +#define PPC_OPCODE_CELL 0x1000000 + +/* Opcode is supported by CPUs with paired singles support. */ +#define PPC_OPCODE_PPCPS 0x2000000 + +/* Opcode is supported by Power E500MC */ +#define PPC_OPCODE_E500MC 0x4000000 + +/* Opcode is supported by PowerPC 405 processor. */ +#define PPC_OPCODE_405 0x8000000 + +/* Opcode is supported by Vector-Scalar (VSX) Unit */ +#define PPC_OPCODE_VSX 0x10000000 + +/* Opcode is supported by A2. */ +#define PPC_OPCODE_A2 0x20000000 + +/* Opcode is supported by PowerPC 476 processor. */ +#define PPC_OPCODE_476 0x40000000 + +/* Opcode is supported by AppliedMicro Titan core */ +#define PPC_OPCODE_TITAN 0x80000000 + +/* Opcode which is supported by the e500 family */ +#define PPC_OPCODE_E500 0x100000000ull + +/* Opcode is supported by Extended Altivec Vector Unit */ +#define PPC_OPCODE_ALTIVEC2 0x200000000ull + +/* Opcode is supported by Power E6500 */ +#define PPC_OPCODE_E6500 0x400000000ull + +/* Opcode is supported by Thread management APU */ +#define PPC_OPCODE_TMR 0x800000000ull + +/* Opcode which is supported by the VLE extension. */ +#define PPC_OPCODE_VLE 0x1000000000ull + +/* Opcode is only supported by Power8 architecture. */ +#define PPC_OPCODE_POWER8 0x2000000000ull + +/* Opcode which is supported by the Hardware Transactional Memory extension. */ +/* Currently, this is the same as the POWER8 mask. If another cpu comes out + that isn't a superset of POWER8, we can define this to its own mask. */ +#define PPC_OPCODE_HTM PPC_OPCODE_POWER8 + +/* A macro to extract the major opcode from an instruction. */ +#define PPC_OP(i) (((i) >> 26) & 0x3f) + +/* A macro to determine if the instruction is a 2-byte VLE insn. */ +#define PPC_OP_SE_VLE(m) ((m) <= 0xffff) + +/* A macro to extract the major opcode from a VLE instruction. */ +#define VLE_OP(i,m) (((i) >> ((m) <= 0xffff ? 10 : 26)) & 0x3f) + +/* A macro to convert a VLE opcode to a VLE opcode segment. */ +#define VLE_OP_TO_SEG(i) ((i) >> 1) + +/* The operands table is an array of struct powerpc_operand. */ + +struct powerpc_operand +{ + /* A bitmask of bits in the operand. */ + unsigned int bitm; + + /* The shift operation to be applied to the operand. No shift + is made if this is zero. For positive values, the operand + is shifted left by SHIFT. For negative values, the operand + is shifted right by -SHIFT. Use PPC_OPSHIFT_INV to indicate + that BITM and SHIFT cannot be used to determine where the + operand goes in the insn. */ + int shift; + + /* Insertion function. This is used by the assembler. To insert an + operand value into an instruction, check this field. + + If it is NULL, execute + if (o->shift >= 0) + i |= (op & o->bitm) << o->shift; + else + i |= (op & o->bitm) >> -o->shift; + (i is the instruction which we are filling in, o is a pointer to + this structure, and op is the operand value). + + If this field is not NULL, then simply call it with the + instruction and the operand value. It will return the new value + of the instruction. If the ERRMSG argument is not NULL, then if + the operand value is illegal, *ERRMSG will be set to a warning + string (the operand will be inserted in any case). If the + operand value is legal, *ERRMSG will be unchanged (most operands + can accept any value). */ + unsigned long (*insert) + (unsigned long instruction, long op, ppc_cpu_t dialect, const char **errmsg); + + /* Extraction function. This is used by the disassembler. To + extract this operand type from an instruction, check this field. + + If it is NULL, compute + if (o->shift >= 0) + op = (i >> o->shift) & o->bitm; + else + op = (i << -o->shift) & o->bitm; + if ((o->flags & PPC_OPERAND_SIGNED) != 0) + sign_extend (op); + (i is the instruction, o is a pointer to this structure, and op + is the result). + + If this field is not NULL, then simply call it with the + instruction value. It will return the value of the operand. If + the INVALID argument is not NULL, *INVALID will be set to + non-zero if this operand type can not actually be extracted from + this operand (i.e., the instruction does not match). If the + operand is valid, *INVALID will not be changed. */ + long (*extract) (unsigned long instruction, ppc_cpu_t dialect, int *invalid); + + /* One bit syntax flags. */ + unsigned long flags; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the powerpc_opcodes table. */ + +extern const struct powerpc_operand powerpc_operands[]; +extern const unsigned int num_powerpc_operands; + +/* Use with the shift field of a struct powerpc_operand to indicate + that BITM and SHIFT cannot be used to determine where the operand + goes in the insn. */ +#define PPC_OPSHIFT_INV (-1 << 31) + +/* Values defined for the flags field of a struct powerpc_operand. */ + +/* This operand takes signed values. */ +#define PPC_OPERAND_SIGNED (0x1) + +/* This operand takes signed values, but also accepts a full positive + range of values when running in 32 bit mode. That is, if bits is + 16, it takes any value from -0x8000 to 0xffff. In 64 bit mode, + this flag is ignored. */ +#define PPC_OPERAND_SIGNOPT (0x2) + +/* This operand does not actually exist in the assembler input. This + is used to support extended mnemonics such as mr, for which two + operands fields are identical. The assembler should call the + insert function with any op value. The disassembler should call + the extract function, ignore the return value, and check the value + placed in the valid argument. */ +#define PPC_OPERAND_FAKE (0x4) + +/* The next operand should be wrapped in parentheses rather than + separated from this one by a comma. This is used for the load and + store instructions which want their operands to look like + reg,displacement(reg) + */ +#define PPC_OPERAND_PARENS (0x8) + +/* This operand may use the symbolic names for the CR fields, which + are + lt 0 gt 1 eq 2 so 3 un 3 + cr0 0 cr1 1 cr2 2 cr3 3 + cr4 4 cr5 5 cr6 6 cr7 7 + These may be combined arithmetically, as in cr2*4+gt. These are + only supported on the PowerPC, not the POWER. */ +#define PPC_OPERAND_CR_BIT (0x10) + +/* This operand names a register. The disassembler uses this to print + register names with a leading 'r'. */ +#define PPC_OPERAND_GPR (0x20) + +/* Like PPC_OPERAND_GPR, but don't print a leading 'r' for r0. */ +#define PPC_OPERAND_GPR_0 (0x40) + +/* This operand names a floating point register. The disassembler + prints these with a leading 'f'. */ +#define PPC_OPERAND_FPR (0x80) + +/* This operand is a relative branch displacement. The disassembler + prints these symbolically if possible. */ +#define PPC_OPERAND_RELATIVE (0x100) + +/* This operand is an absolute branch address. The disassembler + prints these symbolically if possible. */ +#define PPC_OPERAND_ABSOLUTE (0x200) + +/* This operand is optional, and is zero if omitted. This is used for + example, in the optional BF field in the comparison instructions. The + assembler must count the number of operands remaining on the line, + and the number of operands remaining for the opcode, and decide + whether this operand is present or not. The disassembler should + print this operand out only if it is not zero. */ +#define PPC_OPERAND_OPTIONAL (0x400) + +/* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand + is omitted, then for the next operand use this operand value plus + 1, ignoring the next operand field for the opcode. This wretched + hack is needed because the Power rotate instructions can take + either 4 or 5 operands. The disassembler should print this operand + out regardless of the PPC_OPERAND_OPTIONAL field. */ +#define PPC_OPERAND_NEXT (0x800) + +/* This operand should be regarded as a negative number for the + purposes of overflow checking (i.e., the normal most negative + number is disallowed and one more than the normal most positive + number is allowed). This flag will only be set for a signed + operand. */ +#define PPC_OPERAND_NEGATIVE (0x1000) + +/* This operand names a vector unit register. The disassembler + prints these with a leading 'v'. */ +#define PPC_OPERAND_VR (0x2000) + +/* This operand is for the DS field in a DS form instruction. */ +#define PPC_OPERAND_DS (0x4000) + +/* This operand is for the DQ field in a DQ form instruction. */ +#define PPC_OPERAND_DQ (0x8000) + +/* Valid range of operand is 0..n rather than 0..n-1. */ +#define PPC_OPERAND_PLUS1 (0x10000) + +/* Xilinx APU and FSL related operands */ +#define PPC_OPERAND_FSL (0x20000) +#define PPC_OPERAND_FCR (0x40000) +#define PPC_OPERAND_UDI (0x80000) + +/* This operand names a vector-scalar unit register. The disassembler + prints these with a leading 'vs'. */ +#define PPC_OPERAND_VSR (0x100000) + +/* This is a CR FIELD that does not use symbolic names. */ +#define PPC_OPERAND_CR_REG (0x200000) + +/* The POWER and PowerPC assemblers use a few macros. We keep them + with the operands table for simplicity. The macro table is an + array of struct powerpc_macro. */ + +struct powerpc_macro +{ + /* The macro name. */ + const char *name; + + /* The number of operands the macro takes. */ + unsigned int operands; + + /* One bit flags for the opcode. These are used to indicate which + specific processors support the instructions. The values are the + same as those for the struct powerpc_opcode flags field. */ + ppc_cpu_t flags; + + /* A format string to turn the macro into a normal instruction. + Each %N in the string is replaced with operand number N (zero + based). */ + const char *format; +}; + +extern const struct powerpc_macro powerpc_macros[]; +extern const int powerpc_num_macros; + +extern ppc_cpu_t ppc_parse_cpu (ppc_cpu_t, ppc_cpu_t *, const char *); + +#endif /* PPC_H */ diff --git a/include/opcode/pyr.h b/include/opcode/pyr.h new file mode 100644 index 0000000..2fffd94 --- /dev/null +++ b/include/opcode/pyr.h @@ -0,0 +1,305 @@ +/* pyramid.opcode.h -- gdb initial attempt. + + Copyright 2001, 2010 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 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* pyramid opcode table: wot to do with this + particular opcode */ + +struct pyr_datum +{ + char nargs; + char * args; /* how to compile said opcode */ + unsigned long mask; /* Bit vector: which operand modes are valid + for this opcode */ + unsigned char code; /* op-code (always 6(?) bits */ +}; + +typedef struct pyr_insn_format +{ + unsigned int mode :4; + unsigned int operator :8; + unsigned int index_scale :2; + unsigned int index_reg :6; + unsigned int operand_1 :6; + unsigned int operand_2:6; +} pyr_insn_format; + + +/* We store four bytes of opcode for all opcodes. + Pyramid is sufficiently RISCy that: + - insns are always an integral number of words; + - the length of any insn can be told from the first word of + the insn. (ie, if there are zero, one, or two words of + immediate operand/offset). + + + The args component is a string containing two characters for each + operand of the instruction. The first specifies the kind of operand; + the second, the place it is stored. */ + +/* Kinds of operands: + mask assembler syntax description + 0x0001: movw Rn,Rn register to register + 0x0002: movw K,Rn quick immediate to register + 0x0004: movw I,Rn long immediate to register + 0x0008: movw (Rn),Rn register indirect to register + movw (Rn)[x],Rn register indirect to register + 0x0010: movw I(Rn),Rn offset register indirect to register + movw I(Rn)[x],Rn offset register indirect, indexed, to register + + 0x0020: movw Rn,(Rn) register to register indirect + 0x0040: movw K,(Rn) quick immediate to register indirect + 0x0080: movw I,(Rn) long immediate to register indirect + 0x0100: movw (Rn),(Rn) register indirect to-register indirect + 0x0100: movw (Rn),(Rn) register indirect to-register indirect + 0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect + 0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect + + 0x0400: movw Rn,I(Rn) register to register indirect+offset + 0x0800: movw K,I(Rn) quick immediate to register indirect+offset + 0x1000: movw I,I(Rn) long immediate to register indirect+offset + 0x1000: movw (Rn),I(Rn) register indirect to-register indirect+offset + 0x1000: movw I(Rn),I(Rn) register indirect+offset to register indirect + +offset + 0x0000: (irregular) ??? + + + Each insn has a four-bit field encoding the type(s) of its operands. +*/ + +/* Some common combinations + */ + +/* the first 5,(0x1|0x2|0x4|0x8|0x10) ie (1|2|4|8|16), ie ( 32 -1)*/ +#define GEN_TO_REG (31) + +#define UNKNOWN ((unsigned long)-1) +#define ANY (GEN_TO_REG | (GEN_TO_REG << 5) | (GEN_TO_REG << 15)) + +#define CONVERT (1|8|0x10|0x20|0x200) + +#define K_TO_REG (2) +#define I_TO_REG (4) +#define NOTK_TO_REG (GEN_TO_REG & ~K_TO_REG) +#define NOTI_TO_REG (GEN_TO_REG & ~I_TO_REG) + +/* The assembler requires that this array be sorted as follows: + all instances of the same mnemonic must be consecutive. + All instances of the same mnemonic with the same number of operands + must be consecutive. + */ + +struct pyr_opcode /* pyr opcode text */ +{ + char * name; /* opcode name: lowercase string [key] */ + struct pyr_datum datum; /* rest of opcode table [datum] */ +}; + +#define pyr_how args +#define pyr_nargs nargs +#define pyr_mask mask +#define pyr_name name + +struct pyr_opcode pyr_opcodes[] = +{ + {"movb", { 2, "", UNKNOWN, 0x11}, }, + {"movh", { 2, "", UNKNOWN, 0x12} }, + {"movw", { 2, "", ANY, 0x10} }, + {"movl", { 2, "", ANY, 0x13} }, + {"mnegw", { 2, "", (0x1|0x8|0x10), 0x14} }, + {"mnegf", { 2, "", 0x1, 0x15} }, + {"mnegd", { 2, "", 0x1, 0x16} }, + {"mcomw", { 2, "", (0x1|0x8|0x10), 0x17} }, + {"mabsw", { 2, "", (0x1|0x8|0x10), 0x18} }, + {"mabsf", { 2, "", 0x1, 0x19} }, + {"mabsd", { 2, "", 0x1, 0x1a} }, + {"mtstw", { 2, "", (0x1|0x8|0x10), 0x1c} }, + {"mtstf", { 2, "", 0x1, 0x1d} }, + {"mtstd", { 2, "", 0x1, 0x1e} }, + {"mova", { 2, "", 0x8|0x10, 0x1f} }, + {"movzbw", { 2, "", (0x1|0x8|0x10), 0x20} }, + {"movzhw", { 2, "", (0x1|0x8|0x10), 0x21} }, + /* 2 insns out of order here */ + {"movbl", { 2, "", 1, 0x4f} }, + {"filbl", { 2, "", 1, 0x4e} }, + + {"cvtbw", { 2, "", CONVERT, 0x22} }, + {"cvthw", { 2, "", CONVERT, 0x23} }, + {"cvtwb", { 2, "", CONVERT, 0x24} }, + {"cvtwh", { 2, "", CONVERT, 0x25} }, + {"cvtwf", { 2, "", CONVERT, 0x26} }, + {"cvtwd", { 2, "", CONVERT, 0x27} }, + {"cvtfw", { 2, "", CONVERT, 0x28} }, + {"cvtfd", { 2, "", CONVERT, 0x29} }, + {"cvtdw", { 2, "", CONVERT, 0x2a} }, + {"cvtdf", { 2, "", CONVERT, 0x2b} }, + + {"addw", { 2, "", GEN_TO_REG, 0x40} }, + {"addwc", { 2, "", GEN_TO_REG, 0x41} }, + {"subw", { 2, "", GEN_TO_REG, 0x42} }, + {"subwb", { 2, "", GEN_TO_REG, 0x43} }, + {"rsubw", { 2, "", GEN_TO_REG, 0x44} }, + {"mulw", { 2, "", GEN_TO_REG, 0x45} }, + {"emul", { 2, "", GEN_TO_REG, 0x47} }, + {"umulw", { 2, "", GEN_TO_REG, 0x46} }, + {"divw", { 2, "", GEN_TO_REG, 0x48} }, + {"ediv", { 2, "", GEN_TO_REG, 0x4a} }, + {"rdivw", { 2, "", GEN_TO_REG, 0x4b} }, + {"udivw", { 2, "", GEN_TO_REG, 0x49} }, + {"modw", { 2, "", GEN_TO_REG, 0x4c} }, + {"umodw", { 2, "", GEN_TO_REG, 0x4d} }, + + + {"addf", { 2, "", 1, 0x50} }, + {"addd", { 2, "", 1, 0x51} }, + {"subf", { 2, "", 1, 0x52} }, + {"subd", { 2, "", 1, 0x53} }, + {"mulf", { 2, "", 1, 0x56} }, + {"muld", { 2, "", 1, 0x57} }, + {"divf", { 2, "", 1, 0x58} }, + {"divd", { 2, "", 1, 0x59} }, + + + {"cmpb", { 2, "", UNKNOWN, 0x61} }, + {"cmph", { 2, "", UNKNOWN, 0x62} }, + {"cmpw", { 2, "", UNKNOWN, 0x60} }, + {"ucmpb", { 2, "", UNKNOWN, 0x66} }, + /* WHY no "ucmph"??? */ + {"ucmpw", { 2, "", UNKNOWN, 0x65} }, + {"xchw", { 2, "", UNKNOWN, 0x0f} }, + + + {"andw", { 2, "", GEN_TO_REG, 0x30} }, + {"orw", { 2, "", GEN_TO_REG, 0x31} }, + {"xorw", { 2, "", GEN_TO_REG, 0x32} }, + {"bicw", { 2, "", GEN_TO_REG, 0x33} }, + {"lshlw", { 2, "", GEN_TO_REG, 0x38} }, + {"ashlw", { 2, "", GEN_TO_REG, 0x3a} }, + {"ashll", { 2, "", GEN_TO_REG, 0x3c} }, + {"ashrw", { 2, "", GEN_TO_REG, 0x3b} }, + {"ashrl", { 2, "", GEN_TO_REG, 0x3d} }, + {"rotlw", { 2, "", GEN_TO_REG, 0x3e} }, + {"rotrw", { 2, "", GEN_TO_REG, 0x3f} }, + + /* push and pop insns are "going away next release". */ + {"pushw", { 2, "", GEN_TO_REG, 0x0c} }, + {"popw", { 2, "", (0x1|0x8|0x10), 0x0d} }, + {"pusha", { 2, "", (0x8|0x10), 0x0e} }, + + {"bitsw", { 2, "", UNKNOWN, 0x35} }, + {"bitcw", { 2, "", UNKNOWN, 0x36} }, + /* some kind of ibra/dbra insns??*/ + {"icmpw", { 2, "", UNKNOWN, 0x67} }, + {"dcmpw", { 2, "", (1|4|0x20|0x80|0x400|0x1000), 0x69} },/*FIXME*/ + {"acmpw", { 2, "", 1, 0x6b} }, + + /* Call is written as a 1-op insn, but is always (dis)assembled as a 2-op + insn with a 2nd op of tr14. The assembler will have to grok this. */ + {"call", { 2, "", GEN_TO_REG, 0x04} }, + {"call", { 1, "", GEN_TO_REG, 0x04} }, + + {"callk", { 1, "", UNKNOWN, 0x06} },/* system call?*/ + /* Ret is usually written as a 0-op insn, but gets disassembled as a + 1-op insn. The operand is always tr15. */ + {"ret", { 0, "", UNKNOWN, 0x09} }, + {"ret", { 1, "", UNKNOWN, 0x09} }, + {"adsf", { 2, "", (1|2|4), 0x08} }, + {"retd", { 2, "", UNKNOWN, 0x0a} }, + {"btc", { 2, "", UNKNOWN, 0x01} }, + {"bfc", { 2, "", UNKNOWN, 0x02} }, + /* Careful: halt is 0x00000000. Jump must have some other (mode?)bit set?? */ + {"jump", { 1, "", UNKNOWN, 0x00} }, + {"btp", { 2, "", UNKNOWN, 0xf00} }, + /* read control-stack pointer is another 1-or-2 operand insn. */ + {"rcsp", { 2, "", UNKNOWN, 0x01f} }, + {"rcsp", { 1, "", UNKNOWN, 0x01f} } +}; + +/* end: pyramid.opcode.h */ +/* One day I will have to take the time to find out what operands + are valid for these insns, and guess at what they mean. + + I can't imagine what the "I???" insns (iglob, etc) do. + + the arithmetic-sounding insns ending in "p" sound awfully like BCD + arithmetic insns: + dshlp -> Decimal SHift Left Packed + dshrp -> Decimal SHift Right Packed + and cvtlp would be convert long to packed. + I have no idea how the operands are interpreted; but having them be + a long register with (address, length) of an in-memory packed BCD operand + would not be surprising. + They are unlikely to be a packed bcd string: 64 bits of long give + is only 15 digits+sign, which isn't enough for COBOL. + */ +#if 0 + {"wcsp", { 2, "", UNKNOWN, 0x00} }, /*write csp?*/ + /* The OSx Operating System Porting Guide claims SSL does things + with tr12 (a register reserved to it) to do with static block-structure + references. SSL=Set Static Link? It's "Going away next release". */ + {"ssl", { 2, "", UNKNOWN, 0x00} }, + {"ccmps", { 2, "", UNKNOWN, 0x00} }, + {"lcd", { 2, "", UNKNOWN, 0x00} }, + {"uemul", { 2, "", UNKNOWN, 0x00} }, /*unsigned emul*/ + {"srf", { 2, "", UNKNOWN, 0x00} }, /*Gidget time???*/ + {"mnegp", { 2, "", UNKNOWN, 0x00} }, /move-neg phys?*/ + {"ldp", { 2, "", UNKNOWN, 0x00} }, /*load phys?*/ + {"ldti", { 2, "", UNKNOWN, 0x00} }, + {"ldb", { 2, "", UNKNOWN, 0x00} }, + {"stp", { 2, "", UNKNOWN, 0x00} }, + {"stti", { 2, "", UNKNOWN, 0x00} }, + {"stb", { 2, "", UNKNOWN, 0x00} }, + {"stu", { 2, "", UNKNOWN, 0x00} }, + {"addp", { 2, "", UNKNOWN, 0x00} }, + {"subp", { 2, "", UNKNOWN, 0x00} }, + {"mulp", { 2, "", UNKNOWN, 0x00} }, + {"divp", { 2, "", UNKNOWN, 0x00} }, + {"dshlp", { 2, "", UNKNOWN, 0x00} }, /* dec shl packed? */ + {"dshrp", { 2, "", UNKNOWN, 0x00} }, /* dec shr packed? */ + {"movs", { 2, "", UNKNOWN, 0x00} }, /*move (string?)?*/ + {"cmpp", { 2, "", UNKNOWN, 0x00} }, /* cmp phys?*/ + {"cmps", { 2, "", UNKNOWN, 0x00} }, /* cmp (string?)?*/ + {"cvtlp", { 2, "", UNKNOWN, 0x00} }, /* cvt long to p??*/ + {"cvtpl", { 2, "", UNKNOWN, 0x00} }, /* cvt p to l??*/ + {"dintr", { 2, "", UNKNOWN, 0x00} }, /* ?? intr ?*/ + {"rphysw", { 2, "", UNKNOWN, 0x00} }, /* read phys word?*/ + {"wphysw", { 2, "", UNKNOWN, 0x00} }, /* write phys word?*/ + {"cmovs", { 2, "", UNKNOWN, 0x00} }, + {"rsubw", { 2, "", UNKNOWN, 0x00} }, + {"bicpsw", { 2, "", UNKNOWN, 0x00} }, /* clr bit in psw? */ + {"bispsw", { 2, "", UNKNOWN, 0x00} }, /* set bit in psw? */ + {"eio", { 2, "", UNKNOWN, 0x00} }, /* ?? ?io ? */ + {"callp", { 2, "", UNKNOWN, 0x00} }, /* call phys?*/ + {"callr", { 2, "", UNKNOWN, 0x00} }, + {"lpcxt", { 2, "", UNKNOWN, 0x00} }, /*load proc context*/ + {"rei", { 2, "", UNKNOWN, 0x00} }, /*ret from intrpt*/ + {"rport", { 2, "", UNKNOWN, 0x00} }, /*read-port?*/ + {"rtod", { 2, "", UNKNOWN, 0x00} }, /*read-time-of-day?*/ + {"ssi", { 2, "", UNKNOWN, 0x00} }, + {"vtpa", { 2, "", UNKNOWN, 0x00} }, /*virt-to-phys-addr?*/ + {"wicl", { 2, "", UNKNOWN, 0x00} }, /* write icl ? */ + {"wport", { 2, "", UNKNOWN, 0x00} }, /*write-port?*/ + {"wtod", { 2, "", UNKNOWN, 0x00} }, /*write-time-of-day?*/ + {"flic", { 2, "", UNKNOWN, 0x00} }, + {"iglob", { 2, "", UNKNOWN, 0x00} }, /* I global? */ + {"iphys", { 2, "", UNKNOWN, 0x00} }, /* I physical? */ + {"ipid", { 2, "", UNKNOWN, 0x00} }, /* I pid? */ + {"ivect", { 2, "", UNKNOWN, 0x00} }, /* I vector? */ + {"lamst", { 2, "", UNKNOWN, 0x00} }, + {"tio", { 2, "", UNKNOWN, 0x00} }, +#endif diff --git a/include/opcode/rl78.h b/include/opcode/rl78.h new file mode 100644 index 0000000..0f3c64d --- /dev/null +++ b/include/opcode/rl78.h @@ -0,0 +1,168 @@ +/* Opcode decoder for the Renesas RL78 + Copyright 2011 + Free Software Foundation, Inc. + Written by DJ Delorie + + This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* The RL78 decoder in libopcodes is used by the simulator, gdb's + analyzer, and the disassembler. Given an opcode data source, it + decodes the next opcode into the following structures. */ + +#ifndef RL78_OPCODES_H_INCLUDED +#define RL78_OPCODES_H_INCLUDED + +/* For the purposes of these structures, the RL78 registers are as + follows, despite most of these being memory-mapped and + bank-switched: */ +typedef enum { + RL78_Reg_None, + /* The order of these matches the encodings. */ + RL78_Reg_X, + RL78_Reg_A, + RL78_Reg_C, + RL78_Reg_B, + RL78_Reg_E, + RL78_Reg_D, + RL78_Reg_L, + RL78_Reg_H, + /* The order of these matches the encodings. */ + RL78_Reg_AX, + RL78_Reg_BC, + RL78_Reg_DE, + RL78_Reg_HL, + /* Unordered. */ + RL78_Reg_SP, + RL78_Reg_PSW, + RL78_Reg_CS, + RL78_Reg_ES, + RL78_Reg_PMC, + RL78_Reg_MEM +} RL78_Register; + +typedef enum +{ + RL78_Byte = 0, + RL78_Word +} RL78_Size; + +typedef enum { + RL78_Condition_T, + RL78_Condition_F, + RL78_Condition_C, + RL78_Condition_NC, + RL78_Condition_H, + RL78_Condition_NH, + RL78_Condition_Z, + RL78_Condition_NZ +} RL78_Condition; + +typedef enum { + RL78_Operand_None = 0, + RL78_Operand_Immediate, /* #addend */ + RL78_Operand_Register, /* reg */ + RL78_Operand_Indirect, /* [reg + reg2 + addend] */ + RL78_Operand_Bit, /* reg.bit */ + RL78_Operand_BitIndirect, /* [reg+reg2+addend].bit */ + RL78_Operand_PreDec, /* [--reg] = push */ + RL78_Operand_PostInc /* [reg++] = pop */ +} RL78_Operand_Type; + +typedef enum +{ + RLO_unknown, + RLO_add, /* d += s */ + RLO_addc, /* d += s + CY */ + RLO_and, /* d &= s (byte, word, bit) */ + RLO_branch, /* pc = d */ + RLO_branch_cond, /* pc = d if cond(src) */ + RLO_branch_cond_clear, /* pc = d if cond(src), and clear(src) */ + RLO_break, /* BRK */ + RLO_call, /* call */ + RLO_cmp, /* cmp d, s */ + RLO_divhu, /* DIVHU */ + RLO_divwu, /* DIVWU */ + RLO_halt, /* HALT */ + RLO_mov, /* d = s */ + RLO_mach, /* MACH */ + RLO_machu, /* MACHU */ + RLO_mulu, /* MULU */ + RLO_mulh, /* MULH */ + RLO_mulhu, /* MULHU */ + RLO_nop, /* NOP */ + RLO_or, /* d |= s */ + RLO_ret, /* RET */ + RLO_reti, /* RETI */ + RLO_rol, /* d <<= s, MSB to LSB and CY */ + RLO_rolc, /* d <<= s, MSB to CY, CY, to LSB */ + RLO_ror, /* d >>= s, LSB to MSB and CY */ + RLO_rorc, /* d >>= s, LSB to CY, CY, to MSB */ + RLO_sar, /* d >>= s, signed */ + RLO_sel, /* rb = s */ + RLO_shr, /* d >>= s, unsigned */ + RLO_shl, /* d <<= s */ + RLO_skip, /* skip next insn is cond(s) */ + RLO_stop, /* STOP */ + RLO_sub, /* d -= s */ + RLO_subc, /* d -= s - CY */ + RLO_xch, /* swap d, s */ + RLO_xor, /* d ^= s */ +} RL78_Opcode_ID; + +typedef struct { + RL78_Operand_Type type; + int addend; + RL78_Register reg : 8; + RL78_Register reg2 : 8; + unsigned char bit_number : 4; + unsigned char condition : 3; + unsigned char use_es : 1; +} RL78_Opcode_Operand; + +/* PSW flag bits */ +#define RL78_PSW_IE 0x80 +#define RL78_PSW_Z 0x40 +#define RL78_PSW_RBS1 0x20 +#define RL78_PSW_AC 0x10 +#define RL78_PSW_RBS0 0x08 +#define RL78_PSW_ISP1 0x04 +#define RL78_PSW_ISP0 0x02 +#define RL78_PSW_CY 0x01 + +#define RL78_SFR_SP 0xffff8 +#define RL78_SFR_PSW 0xffffa +#define RL78_SFR_CS 0xffffc +#define RL78_SFR_ES 0xffffd +#define RL78_SFR_PMC 0xffffe +#define RL78_SFR_MEM 0xfffff + +typedef struct +{ + int lineno; + RL78_Opcode_ID id:24; + unsigned flags:8; /* PSW mask, for side effects only */ + int n_bytes; + char * syntax; + RL78_Size size; + /* By convention, these are destination, source. */ + RL78_Opcode_Operand op[2]; +} RL78_Opcode_Decoded; + +int rl78_decode_opcode (unsigned long, RL78_Opcode_Decoded *, int (*)(void *), void *); + +#endif diff --git a/include/opcode/rx.h b/include/opcode/rx.h new file mode 100644 index 0000000..aa85fe4 --- /dev/null +++ b/include/opcode/rx.h @@ -0,0 +1,215 @@ +/* Opcode decoder for the Renesas RX + Copyright 2008, 2009, 2010 + Free Software Foundation, Inc. + Written by DJ Delorie + + This file is part of GDB, the GNU Debugger and GAS, the GNU Assembler. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* The RX decoder in libopcodes is used by the simulator, gdb's + analyzer, and the disassembler. Given an opcode data source, + it decodes the next opcode into the following structures. */ + +typedef enum +{ + RX_AnySize = 0, + RX_Byte, /* undefined extension */ + RX_UByte, + RX_SByte, + RX_Word, /* undefined extension */ + RX_UWord, + RX_SWord, + RX_3Byte, + RX_Long, +} RX_Size; + +typedef enum +{ + RX_Operand_None, + RX_Operand_Immediate, /* #addend */ + RX_Operand_Register, /* Rn */ + RX_Operand_Indirect, /* [Rn + addend] */ + RX_Operand_Postinc, /* [Rn+] */ + RX_Operand_Predec, /* [-Rn] */ + RX_Operand_Condition, /* eq, gtu, etc */ + RX_Operand_Flag, /* [UIOSZC] */ + RX_Operand_TwoReg, /* [Rn + scale*R2] */ +} RX_Operand_Type; + +typedef enum +{ + RXO_unknown, + RXO_mov, /* d = s (signed) */ + RXO_movbi, /* d = [s,s2] (signed) */ + RXO_movbir, /* [s,s2] = d (signed) */ + RXO_pushm, /* s..s2 */ + RXO_popm, /* s..s2 */ + RXO_xchg, /* s <-> d */ + RXO_stcc, /* d = s if cond(s2) */ + RXO_rtsd, /* rtsd, 1=imm, 2-0 = reg if reg type */ + + /* These are all either d OP= s or, if s2 is set, d = s OP s2. Note + that d may be "None". */ + RXO_and, + RXO_or, + RXO_xor, + RXO_add, + RXO_sub, + RXO_mul, + RXO_div, + RXO_divu, + RXO_shll, + RXO_shar, + RXO_shlr, + + RXO_adc, /* d = d + s + carry */ + RXO_sbb, /* d = d - s - ~carry */ + RXO_abs, /* d = |s| */ + RXO_max, /* d = max(d,s) */ + RXO_min, /* d = min(d,s) */ + RXO_emul, /* d:64 = d:32 * s */ + RXO_emulu, /* d:64 = d:32 * s (unsigned) */ + + RXO_rolc, /* d <<= 1 through carry */ + RXO_rorc, /* d >>= 1 through carry*/ + RXO_rotl, /* d <<= #s without carry */ + RXO_rotr, /* d >>= #s without carry*/ + RXO_revw, /* d = revw(s) */ + RXO_revl, /* d = revl(s) */ + RXO_branch, /* pc = d if cond(s) */ + RXO_branchrel,/* pc += d if cond(s) */ + RXO_jsr, /* pc = d */ + RXO_jsrrel, /* pc += d */ + RXO_rts, + RXO_nop, + RXO_nop2, + RXO_nop3, + + RXO_scmpu, + RXO_smovu, + RXO_smovb, + RXO_suntil, + RXO_swhile, + RXO_smovf, + RXO_sstr, + + RXO_rmpa, + RXO_mulhi, + RXO_mullo, + RXO_machi, + RXO_maclo, + RXO_mvtachi, + RXO_mvtaclo, + RXO_mvfachi, + RXO_mvfacmi, + RXO_mvfaclo, + RXO_racw, + + RXO_sat, /* sat(d) */ + RXO_satr, + + RXO_fadd, /* d op= s */ + RXO_fcmp, + RXO_fsub, + RXO_ftoi, + RXO_fmul, + RXO_fdiv, + RXO_round, + RXO_itof, + + RXO_bset, /* d |= (1< = cond(s2) */ + + RXO_clrpsw, /* flag index in d */ + RXO_setpsw, /* flag index in d */ + RXO_mvtipl, /* new IPL in s */ + + RXO_rtfi, + RXO_rte, + RXO_rtd, /* undocumented */ + RXO_brk, + RXO_dbt, /* undocumented */ + RXO_int, /* vector id in s */ + RXO_stop, + RXO_wait, + + RXO_sccnd, /* d = cond(s) ? 1 : 0 */ +} RX_Opcode_ID; + +/* Condition bitpatterns, as registers. */ +#define RXC_eq 0 +#define RXC_z 0 +#define RXC_ne 1 +#define RXC_nz 1 +#define RXC_c 2 +#define RXC_nc 3 +#define RXC_gtu 4 +#define RXC_leu 5 +#define RXC_pz 6 +#define RXC_n 7 +#define RXC_ge 8 +#define RXC_lt 9 +#define RXC_gt 10 +#define RXC_le 11 +#define RXC_o 12 +#define RXC_no 13 +#define RXC_always 14 +#define RXC_never 15 + +typedef struct +{ + RX_Operand_Type type; + int reg; + int addend; + RX_Size size; +} RX_Opcode_Operand; + +typedef struct +{ + RX_Opcode_ID id; + int n_bytes; + int prefix; + char * syntax; + RX_Size size; + /* By convention, these are destination, source1, source2. */ + RX_Opcode_Operand op[3]; + + /* The logic here is: + newflags = (oldflags & ~(int)flags_0) | flags_1 | (op_flags & flags_s) + Only the O, S, Z, and C flags are affected. */ + char flags_0; /* This also clears out flags-to-be-set. */ + char flags_1; + char flags_s; +} RX_Opcode_Decoded; + +/* Within the syntax, %c-style format specifiers are as follows: + + %% = '%' character + %0 = operand[0] (destination) + %1 = operand[1] (source) + %2 = operand[2] (2nd source) + %s = operation size (b/w/l) + %SN = operand size [N] (N=0,1,2) + %aN = op[N] as an address (N=0,1,2) + + Register numbers 0..15 are general registers. 16..31 are control + registers. 32..47 are condition codes. */ + +int rx_decode_opcode (unsigned long, RX_Opcode_Decoded *, int (*)(void *), void *); diff --git a/include/opcode/s390.h b/include/opcode/s390.h new file mode 100644 index 0000000..531011e --- /dev/null +++ b/include/opcode/s390.h @@ -0,0 +1,154 @@ +/* s390.h -- Header file for S390 opcode table + Copyright 2000, 2001, 2003, 2010 Free Software Foundation, Inc. + Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef S390_H +#define S390_H + +/* List of instruction sets variations. */ + +enum s390_opcode_mode_val + { + S390_OPCODE_ESA = 0, + S390_OPCODE_ZARCH + }; + +enum s390_opcode_cpu_val + { + S390_OPCODE_G5 = 0, + S390_OPCODE_G6, + S390_OPCODE_Z900, + S390_OPCODE_Z990, + S390_OPCODE_Z9_109, + S390_OPCODE_Z9_EC, + S390_OPCODE_Z10, + S390_OPCODE_Z196, + S390_OPCODE_ZEC12, + S390_OPCODE_MAXCPU + }; + +/* The opcode table is an array of struct s390_opcode. */ + +struct s390_opcode + { + /* The opcode name. */ + const char * name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + unsigned char opcode[6]; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + unsigned char mask[6]; + + /* The opcode length in bytes. */ + int oplen; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[6]; + + /* Bitmask of execution modes this opcode is available for. */ + unsigned int modes; + + /* First cpu this opcode is available for. */ + enum s390_opcode_cpu_val min_cpu; + }; + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct s390_opcode s390_opcodes[]; +extern const int s390_num_opcodes; + +/* A opcode format table for the .insn pseudo mnemonic. */ +extern const struct s390_opcode s390_opformats[]; +extern const int s390_num_opformats; + +/* Values defined for the flags field of a struct powerpc_opcode. */ + +/* The operands table is an array of struct s390_operand. */ + +struct s390_operand + { + /* The number of bits in the operand. */ + int bits; + + /* How far the operand is left shifted in the instruction. */ + int shift; + + /* One bit syntax flags. */ + unsigned long flags; + }; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the powerpc_opcodes table. */ + +extern const struct s390_operand s390_operands[]; + +/* Values defined for the flags field of a struct s390_operand. */ + +/* This operand names a register. The disassembler uses this to print + register names with a leading 'r'. */ +#define S390_OPERAND_GPR 0x1 + +/* This operand names a floating point register. The disassembler + prints these with a leading 'f'. */ +#define S390_OPERAND_FPR 0x2 + +/* This operand names an access register. The disassembler + prints these with a leading 'a'. */ +#define S390_OPERAND_AR 0x4 + +/* This operand names a control register. The disassembler + prints these with a leading 'c'. */ +#define S390_OPERAND_CR 0x8 + +/* This operand is a displacement. */ +#define S390_OPERAND_DISP 0x10 + +/* This operand names a base register. */ +#define S390_OPERAND_BASE 0x20 + +/* This operand names an index register, it can be skipped. */ +#define S390_OPERAND_INDEX 0x40 + +/* This operand is a relative branch displacement. The disassembler + prints these symbolically if possible. */ +#define S390_OPERAND_PCREL 0x80 + +/* This operand takes signed values. */ +#define S390_OPERAND_SIGNED 0x100 + +/* This operand is a length. */ +#define S390_OPERAND_LENGTH 0x200 + +/* This operand is optional. Only a single operand at the end of + the instruction may be optional. */ +#define S390_OPERAND_OPTIONAL 0x400 + +/* The operand needs to be a valid GP or FP register pair. */ +#define S390_OPERAND_REG_PAIR 0x800 + + #endif /* S390_H */ diff --git a/include/opcode/score-datadep.h b/include/opcode/score-datadep.h new file mode 100644 index 0000000..10ddf32 --- /dev/null +++ b/include/opcode/score-datadep.h @@ -0,0 +1,65 @@ +/* score-datadep.h -- Score Instructions data dependency table + Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Contributed by: + Brain.lin (brain.lin@sunplusct.com) + Mei Ligang (ligang@sunnorth.com.cn) + Pei-Lin Tsai (pltsai@sunplus.com) + + This file is part of GAS, the GNU Assembler. + + GAS 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, or (at your option) + any later version. + + GAS 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 GAS; see the file COPYING3. If not, write to the Free + Software Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#ifndef SCORE_DATA_DEPENDENCY_H +#define SCORE_DATA_DEPENDENCY_H + +#define INSN_NAME_LEN 16 + +enum insn_type_for_dependency +{ + D_mtcr, + D_all_insn +}; + +struct insn_to_dependency +{ + char *insn_name; + enum insn_type_for_dependency type; +}; + +struct data_dependency +{ + enum insn_type_for_dependency pre_insn_type; + char pre_reg[6]; + enum insn_type_for_dependency cur_insn_type; + char cur_reg[6]; + int bubblenum_7; + int bubblenum_3; + int warn_or_error; /* warning - 0; error - 1 */ +}; + +static const struct insn_to_dependency insn_to_dependency_table[] = +{ + /* move spectial instruction. */ + {"mtcr", D_mtcr}, +}; + +static const struct data_dependency data_dependency_table[] = +{ + /* Status regiser. */ + {D_mtcr, "cr0", D_all_insn, "", 5, 1, 0}, +}; + +#endif diff --git a/include/opcode/score-inst.h b/include/opcode/score-inst.h new file mode 100644 index 0000000..ecb18da --- /dev/null +++ b/include/opcode/score-inst.h @@ -0,0 +1,236 @@ +/* score-inst.h -- Score Instructions Table + Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Contributed by: + Brain.lin (brain.lin@sunplusct.com) + Mei Ligang (ligang@sunnorth.com.cn) + Pei-Lin Tsai (pltsai@sunplus.com) + + This file is part of GAS, the GNU Assembler. + + GAS 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, or (at your option) + any later version. + + GAS 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 GAS; see the file COPYING3. If not, write to the Free + Software Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef SCORE_INST_H +#define SCORE_INST_H + +#define LDST_UNALIGN_MASK 0x0000007f +#define UA_LCB 0x00000060 +#define UA_LCW 0x00000062 +#define UA_LCE 0x00000066 +#define UA_SCB 0x00000068 +#define UA_SCW 0x0000006a +#define UA_SCE 0x0000006e +#define UA_LL 0x0000000c +#define UA_SC 0x0000000e +#define LDST16_RR_MASK 0x0000000f +#define N16_LW 8 +#define N16_LH 9 +#define N16_POP 10 +#define N16_LBU 11 +#define N16_SW 12 +#define N16_SH 13 +#define N16_PUSH 14 +#define N16_SB 15 +#define LDST16_RI_MASK 0x7007 +#define N16_LWP 0x7000 +#define N16_LHP 0x7001 +#define N16_LBUP 0x7003 +#define N16_SWP 0x7004 +#define N16_SHP 0x7005 +#define N16_SBP 0x7007 +#define N16_LIU 0x5000 + +#define OPC_PSEUDOLDST_MASK 0x00000007 + +enum +{ + INSN_LW = 0, + INSN_LH = 1, + INSN_LHU = 2, + INSN_LB = 3, + INSN_SW = 4, + INSN_SH = 5, + INSN_LBU = 6, + INSN_SB = 7, +}; + +/* Sub opcdoe opcode. */ +enum +{ + INSN16_LBU = 11, + INSN16_LH = 9, + INSN16_LW = 8, + INSN16_SB = 15, + INSN16_SH = 13, + INSN16_SW = 12, +}; + +enum +{ + LDST_NOUPDATE = 0, + LDST_PRE = 1, + LDST_POST = 2, +}; + +enum score_insn_type +{ + Rd_I4, + Rd_I5, + Rd_rvalueBP_I5, + Rd_lvalueBP_I5, + Rd_Rs_I5, + x_Rs_I5, + x_I5_x, + Rd_I8, + Rd_Rs_I14, + I15, + Rd_I16, + Rd_I30, + Rd_I32, + Rd_rvalueRs_SI10, + Rd_lvalueRs_SI10, + Rd_rvalueRs_preSI12, + Rd_rvalueRs_postSI12, + Rd_lvalueRs_preSI12, + Rd_lvalueRs_postSI12, + Rd_Rs_SI14, + Rd_rvalueRs_SI15, + Rd_lvalueRs_SI15, + Rd_SI5, + Rd_SI6, + Rd_SI16, + PC_DISP8div2, + PC_DISP11div2, + PC_DISP19div2, + PC_DISP24div2, + Rd_Rs_Rs, + x_Rs_x, + x_Rs_Rs, + Rd_Rs_x, + Rd_x_Rs, + Rd_x_x, + Rd_Rs, + Rd_HighRs, + Rd_lvalueRs, + Rd_rvalueRs, + Rd_lvalue32Rs, + Rd_rvalue32Rs, + x_Rs, + NO_OPD, + NO16_OPD, + OP5_rvalueRs_SI15, + I5_Rs_Rs_I5_OP5, + x_rvalueRs_post4, + Rd_rvalueRs_post4, + Rd_x_I5, + Rd_lvalueRs_post4, + x_lvalueRs_post4, + Rd_LowRs, + Rd_Rs_Rs_imm, + Insn_Type_PCE, + Insn_Type_SYN, + Insn_GP, + Insn_PIC, + Insn_internal, + Insn_BCMP, + Ra_I9_I5, +}; + +enum score_data_type +{ + _IMM4 = 0, + _IMM5, + _IMM8, + _IMM14, + _IMM15, + _IMM16, + _SIMM10 = 6, + _SIMM12, + _SIMM14, + _SIMM15, + _SIMM16, + _SIMM14_NEG = 11, + _IMM16_NEG, + _SIMM16_NEG, + _IMM20, + _IMM25, + _DISP8div2 = 16, + _DISP11div2, + _DISP19div2, + _DISP24div2, + _VALUE, + _VALUE_HI16, + _VALUE_LO16, + _VALUE_LDST_LO16 = 23, + _SIMM16_LA, + _IMM5_RSHIFT_1, + _IMM5_RSHIFT_2, + _SIMM16_LA_POS, + _IMM5_RANGE_8_31, + _IMM10_RSHIFT_2, + _GP_IMM15 = 30, + _GP_IMM14 = 31, + _SIMM16_pic = 42, /* Index in score_df_range. */ + _IMM16_LO16_pic = 43, + _IMM16_pic = 44, + + _SIMM5 = 45, + _SIMM6 = 46, + _IMM32 = 47, + _SIMM32 = 48, + _IMM11 = 49, + _IMM5_MULTI_LOAD = 50, +}; + +#define REG_TMP 1 + +#define OP_REG_TYPE (1 << 6) +#define OP_IMM_TYPE (1 << 7) +#define OP_SH_REGD (OP_REG_TYPE |20) +#define OP_SH_REGS1 (OP_REG_TYPE |15) +#define OP_SH_REGS2 (OP_REG_TYPE |10) +#define OP_SH_I (OP_IMM_TYPE | 1) +#define OP_SH_RI15 (OP_IMM_TYPE | 0) +#define OP_SH_I12 (OP_IMM_TYPE | 3) +#define OP_SH_DISP24 (OP_IMM_TYPE | 1) +#define OP_SH_DISP19_p1 (OP_IMM_TYPE |15) +#define OP_SH_DISP19_p2 (OP_IMM_TYPE | 1) +#define OP_SH_I5 (OP_IMM_TYPE |10) +#define OP_SH_I10 (OP_IMM_TYPE | 5) +#define OP_SH_COPID (OP_IMM_TYPE | 5) +#define OP_SH_TRAPI5 (OP_IMM_TYPE |15) +#define OP_SH_I15 (OP_IMM_TYPE |10) + +#define OP16_SH_REGD (OP_REG_TYPE | 8) +#define OP16_SH_REGS1 (OP_REG_TYPE | 4) +#define OP16_SH_I45 (OP_IMM_TYPE | 3) +#define OP16_SH_I8 (OP_IMM_TYPE | 0) +#define OP16_SH_DISP8 (OP_IMM_TYPE | 0) +#define OP16_SH_DISP11 (OP_IMM_TYPE | 1) + +enum insn_class +{ + INSN_CLASS_16, + INSN_CLASS_32, + INSN_CLASS_48, + INSN_CLASS_PCE, + INSN_CLASS_SYN +}; + +/* s3_s7: Globals for both tc-score.c and elf32-score.c. */ +extern int score3; +extern int score7; + +#endif diff --git a/include/opcode/sparc.h b/include/opcode/sparc.h new file mode 100644 index 0000000..f05909f --- /dev/null +++ b/include/opcode/sparc.h @@ -0,0 +1,280 @@ +/* Definitions for opcode table for the sparc. + Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2002, + 2003, 2005, 2010, 2011 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler, GDB, the GNU debugger, and + the GNU Binutils. + + GAS/GDB 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, or (at your option) + any later version. + + GAS/GDB 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 GAS or GDB; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#include "ansidecl.h" + +/* The SPARC opcode table (and other related data) is defined in + the opcodes library in sparc-opc.c. If you change anything here, make + sure you fix up that file, and vice versa. */ + + /* FIXME-someday: perhaps the ,a's and such should be embedded in the + instruction's name rather than the args. This would make gas faster, pinsn + slower, but would mess up some macros a bit. xoxorich. */ + +/* List of instruction sets variations. + These values are such that each element is either a superset of a + preceding each one or they conflict in which case SPARC_OPCODE_CONFLICT_P + returns non-zero. + The values are indices into `sparc_opcode_archs' defined in sparc-opc.c. + Don't change this without updating sparc-opc.c. */ + +enum sparc_opcode_arch_val +{ + SPARC_OPCODE_ARCH_V6 = 0, + SPARC_OPCODE_ARCH_V7, + SPARC_OPCODE_ARCH_V8, + SPARC_OPCODE_ARCH_LEON, + SPARC_OPCODE_ARCH_SPARCLET, + SPARC_OPCODE_ARCH_SPARCLITE, + /* V9 variants must appear last. */ + SPARC_OPCODE_ARCH_V9, + SPARC_OPCODE_ARCH_V9A, /* V9 with ultrasparc additions. */ + SPARC_OPCODE_ARCH_V9B, /* V9 with ultrasparc and cheetah additions. */ + SPARC_OPCODE_ARCH_BAD /* Error return from sparc_opcode_lookup_arch. */ +}; + +/* The highest architecture in the table. */ +#define SPARC_OPCODE_ARCH_MAX (SPARC_OPCODE_ARCH_BAD - 1) + +/* Given an enum sparc_opcode_arch_val, return the bitmask to use in + insn encoding/decoding. */ +#define SPARC_OPCODE_ARCH_MASK(arch) (1 << (arch)) + +/* Given a valid sparc_opcode_arch_val, return non-zero if it's v9. */ +#define SPARC_OPCODE_ARCH_V9_P(arch) ((arch) >= SPARC_OPCODE_ARCH_V9) + +/* Table of cpu variants. */ + +typedef struct sparc_opcode_arch +{ + const char *name; + /* Mask of sparc_opcode_arch_val's supported. + EG: For v7 this would be + (SPARC_OPCODE_ARCH_MASK (..._V6) | SPARC_OPCODE_ARCH_MASK (..._V7)). + These are short's because sparc_opcode.architecture is. */ + short supported; +} sparc_opcode_arch; + +extern const struct sparc_opcode_arch sparc_opcode_archs[]; + +/* Given architecture name, look up it's sparc_opcode_arch_val value. */ +extern enum sparc_opcode_arch_val sparc_opcode_lookup_arch (const char *); + +/* Return the bitmask of supported architectures for ARCH. */ +#define SPARC_OPCODE_SUPPORTED(ARCH) (sparc_opcode_archs[ARCH].supported) + +/* Non-zero if ARCH1 conflicts with ARCH2. + IE: ARCH1 as a supported bit set that ARCH2 doesn't, and vice versa. */ +#define SPARC_OPCODE_CONFLICT_P(ARCH1, ARCH2) \ + (((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \ + != SPARC_OPCODE_SUPPORTED (ARCH1)) \ + && ((SPARC_OPCODE_SUPPORTED (ARCH1) & SPARC_OPCODE_SUPPORTED (ARCH2)) \ + != SPARC_OPCODE_SUPPORTED (ARCH2))) + +/* Structure of an opcode table entry. */ + +typedef struct sparc_opcode +{ + const char *name; + unsigned long match; /* Bits that must be set. */ + unsigned long lose; /* Bits that must not be set. */ + const char *args; + /* This was called "delayed" in versions before the flags. */ + unsigned int flags; + unsigned int hwcaps; + short architecture; /* Bitmask of sparc_opcode_arch_val's. */ +} sparc_opcode; + +/* FIXME: Add F_ANACHRONISTIC flag for v9. */ +#define F_DELAYED 0x00000001 /* Delayed branch. */ +#define F_ALIAS 0x00000002 /* Alias for a "real" instruction. */ +#define F_UNBR 0x00000004 /* Unconditional branch. */ +#define F_CONDBR 0x00000008 /* Conditional branch. */ +#define F_JSR 0x00000010 /* Subroutine call. */ +#define F_FLOAT 0x00000020 /* Floating point instruction (not a branch). */ +#define F_FBR 0x00000040 /* Floating point branch. */ +#define F_PREFERRED 0x00000080 /* A preferred alias. */ + +#define F_PREF_ALIAS (F_ALIAS|F_PREFERRED) + +/* These must match the HWCAP_* values precisely. */ +#define HWCAP_MUL32 0x00000001 /* umul/umulcc/smul/smulcc insns */ +#define HWCAP_DIV32 0x00000002 /* udiv/udivcc/sdiv/sdivcc insns */ +#define HWCAP_FSMULD 0x00000004 /* 'fsmuld' insn */ +#define HWCAP_V8PLUS 0x00000008 /* v9 insns available to 32bit */ +#define HWCAP_POPC 0x00000010 /* 'popc' insn */ +#define HWCAP_VIS 0x00000020 /* VIS insns */ +#define HWCAP_VIS2 0x00000040 /* VIS2 insns */ +#define HWCAP_ASI_BLK_INIT \ + 0x00000080 /* block init ASIs */ +#define HWCAP_FMAF 0x00000100 /* fused multiply-add */ +#define HWCAP_VIS3 0x00000400 /* VIS3 insns */ +#define HWCAP_HPC 0x00000800 /* HPC insns */ +#define HWCAP_RANDOM 0x00001000 /* 'random' insn */ +#define HWCAP_TRANS 0x00002000 /* transaction insns */ +#define HWCAP_FJFMAU 0x00004000 /* unfused multiply-add */ +#define HWCAP_IMA 0x00008000 /* integer multiply-add */ +#define HWCAP_ASI_CACHE_SPARING \ + 0x00010000 /* cache sparing ASIs */ +#define HWCAP_AES 0x00020000 /* AES crypto insns */ +#define HWCAP_DES 0x00040000 /* DES crypto insns */ +#define HWCAP_KASUMI 0x00080000 /* KASUMI crypto insns */ +#define HWCAP_CAMELLIA 0x00100000 /* CAMELLIA crypto insns */ +#define HWCAP_MD5 0x00200000 /* MD5 hashing insns */ +#define HWCAP_SHA1 0x00400000 /* SHA1 hashing insns */ +#define HWCAP_SHA256 0x00800000 /* SHA256 hashing insns */ +#define HWCAP_SHA512 0x01000000 /* SHA512 hashing insns */ +#define HWCAP_MPMUL 0x02000000 /* Multiple Precision Multiply */ +#define HWCAP_MONT 0x04000000 /* Montgomery Mult/Sqrt */ +#define HWCAP_PAUSE 0x08000000 /* Pause insn */ +#define HWCAP_CBCOND 0x10000000 /* Compare and Branch insns */ +#define HWCAP_CRC32C 0x20000000 /* CRC32C insn */ + +/* All sparc opcodes are 32 bits, except for the `set' instruction (really a + macro), which is 64 bits. It is handled as a special case. + + The match component is a mask saying which bits must match a particular + opcode in order for an instruction to be an instance of that opcode. + + The args component is a string containing one character for each operand of the + instruction. + + Kinds of operands: + # Number used by optimizer. It is ignored. + 1 rs1 register. + 2 rs2 register. + d rd register. + e frs1 floating point register. + v frs1 floating point register (double/even). + V frs1 floating point register (quad/multiple of 4). + f frs2 floating point register. + B frs2 floating point register (double/even). + R frs2 floating point register (quad/multiple of 4). + 4 frs3 floating point register. + 5 frs3 floating point register (doube/even). + g frsd floating point register. + H frsd floating point register (double/even). + J frsd floating point register (quad/multiple of 4). + b crs1 coprocessor register + c crs2 coprocessor register + D crsd coprocessor register + m alternate space register (asr) in rd + M alternate space register (asr) in rs1 + h 22 high bits. + X 5 bit unsigned immediate + Y 6 bit unsigned immediate + 3 SIAM mode (3 bits). (v9b) + K MEMBAR mask (7 bits). (v9) + j 10 bit Immediate. (v9) + I 11 bit Immediate. (v9) + i 13 bit Immediate. + n 22 bit immediate. + k 2+14 bit PC relative immediate. (v9) + G 19 bit PC relative immediate. (v9) + l 22 bit PC relative immediate. + L 30 bit PC relative immediate. + a Annul. The annul bit is set. + A Alternate address space. Stored as 8 bits. + C Coprocessor state register. + F floating point state register. + p Processor state register. + N Branch predict clear ",pn" (v9) + T Branch predict set ",pt" (v9) + z %icc. (v9) + Z %xcc. (v9) + q Floating point queue. + r Single register that is both rs1 and rd. + O Single register that is both rs2 and rd. + Q Coprocessor queue. + S Special case. + t Trap base register. + w Window invalid mask register. + y Y register. + u sparclet coprocessor registers in rd position + U sparclet coprocessor registers in rs1 position + E %ccr. (v9) + s %fprs. (v9) + P %pc. (v9) + W %tick. (v9) + o %asi. (v9) + 6 %fcc0. (v9) + 7 %fcc1. (v9) + 8 %fcc2. (v9) + 9 %fcc3. (v9) + ! Privileged Register in rd (v9) + ? Privileged Register in rs1 (v9) + * Prefetch function constant. (v9) + x OPF field (v9 impdep). + 0 32/64 bit immediate for set or setx (v9) insns + _ Ancillary state register in rd (v9a) + / Ancillary state register in rs1 (v9a) + ( entire floating point state register (%efsr) + ) 5 bit immediate placed in RS3 field + = 2+8 bit PC relative immediate. (v9) */ + +#define OP2(x) (((x) & 0x7) << 22) /* Op2 field of format2 insns. */ +#define OP3(x) (((x) & 0x3f) << 19) /* Op3 field of format3 insns. */ +#define OP(x) ((unsigned) ((x) & 0x3) << 30) /* Op field of all insns. */ +#define OPF(x) (((x) & 0x1ff) << 5) /* Opf field of float insns. */ +#define OPF_LOW5(x) OPF ((x) & 0x1f) /* V9. */ +#define OPF_LOW4(x) OPF ((x) & 0xf) /* V9. */ +#define F3F(x, y, z) (OP (x) | OP3 (y) | OPF (z)) /* Format3 float insns. */ +#define F3F4(x, y, z) (OP (x) | OP3 (y) | OPF_LOW4 (z)) +#define F3I(x) (((x) & 0x1) << 13) /* Immediate field of format 3 insns. */ +#define F2(x, y) (OP (x) | OP2(y)) /* Format 2 insns. */ +#define F3(x, y, z) (OP (x) | OP3(y) | F3I(z)) /* Format3 insns. */ +#define F1(x) (OP (x)) +#define DISP30(x) ((x) & 0x3fffffff) +#define ASI(x) (((x) & 0xff) << 5) /* Asi field of format3 insns. */ +#define RS2(x) ((x) & 0x1f) /* Rs2 field. */ +#define SIMM13(x) ((x) & 0x1fff) /* Simm13 field. */ +#define RD(x) (((x) & 0x1f) << 25) /* Destination register field. */ +#define RS1(x) (((x) & 0x1f) << 14) /* Rs1 field. */ +#define RS3(x) (((x) & 0x1f) << 9) /* Rs3 field. */ +#define ASI_RS2(x) (SIMM13 (x)) +#define MEMBAR(x) ((x) & 0x7f) +#define SLCPOP(x) (((x) & 0x7f) << 6) /* Sparclet cpop. */ + +#define ANNUL (1 << 29) +#define BPRED (1 << 19) /* V9. */ +#define IMMED F3I (1) +#define RD_G0 RD (~0) +#define RS1_G0 RS1 (~0) +#define RS2_G0 RS2 (~0) + +extern const struct sparc_opcode sparc_opcodes[]; +extern const int sparc_num_opcodes; + +extern int sparc_encode_asi (const char *); +extern const char *sparc_decode_asi (int); +extern int sparc_encode_membar (const char *); +extern const char *sparc_decode_membar (int); +extern int sparc_encode_prefetch (const char *); +extern const char *sparc_decode_prefetch (int); +extern int sparc_encode_sparclet_cpreg (const char *); +extern const char *sparc_decode_sparclet_cpreg (int); + +/* Local Variables: + fill-column: 131 + comment-column: 0 + End: */ + diff --git a/include/opcode/spu-insns.h b/include/opcode/spu-insns.h new file mode 100644 index 0000000..d6c260a --- /dev/null +++ b/include/opcode/spu-insns.h @@ -0,0 +1,417 @@ +/* SPU ELF support for BFD. + + Copyright 2006, 2007, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* SPU Opcode Table + +-=-=-= FORMAT =-=-=- + + +----+-------+-------+-------+-------+ +------------+-------+-------+-------+ +RRR | op | RC | RB | RA | RT | RI7 | op | I7 | RA | RT | + +----+-------+-------+-------+-------+ +------------+-------+-------+-------+ + 0 3 1 1 2 3 0 1 1 2 3 + 0 7 4 1 0 7 4 1 + + +-----------+--------+-------+-------+ +---------+----------+-------+-------+ +RI8 | op | I8 | RA | RT | RI10 | op | I10 | RA | RT | + +-----------+--------+-------+-------+ +---------+----------+-------+-------+ + 0 9 1 2 3 0 7 1 2 3 + 7 4 1 7 4 1 + + +----------+-----------------+-------+ +--------+-------------------+-------+ +RI16 | op | I16 | RT | RI18 | op | I18 | RT | + +----------+-----------------+-------+ +--------+-------------------+-------+ + 0 8 2 3 0 6 2 3 + 4 1 4 1 + + +------------+-------+-------+-------+ +-------+--+-----------------+-------+ +RR | op | RB | RA | RT | LBT | op |RO| I16 | RO | + +------------+-------+-------+-------+ +-------+--+-----------------+-------+ + 0 1 1 2 3 0 6 8 2 3 + 0 7 4 1 4 1 + + +------------+----+--+-------+-------+ + LBTI | op | // |RO| RA | RO | + +------------+----+--+-------+-------+ + 0 1 1 1 2 3 + 0 5 7 4 1 + +-=-=-= OPCODE =-=-=- + +OPCODE field specifies the most significant 11bit of the instruction. Some formats don't have 11bits for opcode field, and in this +case, bit field other than op are defined as 0s. For example, opcode of fma instruction which is RRR format is defined as 0x700, +since 0x700 -> 11'b11100000000, this means opcode is 4'b1110, and other 7bits are defined as 7'b0000000. + +-=-=-= ASM_FORMAT =-=-=- + +RRR category RI7 category + ASM_RRR mnemonic RC, RA, RB, RT ASM_RI4 mnemonic RT, RA, I4 + ASM_RI7 mnemonic RT, RA, I7 + +RI8 category RI10 category + ASM_RUI8 mnemonic RT, RA, UI8 ASM_AI10 mnemonic RA, I10 + ASM_RI10 mnemonic RT, RA, R10 + ASM_RI10IDX mnemonic RT, I10(RA) + +RI16 category RI18 category + ASM_I16W mnemonic I16W ASM_RI18 mnemonic RT, I18 + ASM_RI16 mnemonic RT, I16 + ASM_RI16W mnemonic RT, I16W + +RR category LBT category + ASM_MFSPR mnemonic RT, SA ASM_LBT mnemonic brinst, brtarg + ASM_MTSPR mnemonic SA, RT + ASM_NOOP mnemonic LBTI category + ASM_RA mnemonic RA ASM_LBTI mnemonic brinst, RA + ASM_RAB mnemonic RA, RB + ASM_RDCH mnemonic RT, CA + ASM_RR mnemonic RT, RA, RB + ASM_RT mnemonic RT + ASM_RTA mnemonic RT, RA + ASM_WRCH mnemonic CA, RT + +Note that RRR instructions have the names for RC and RT reversed from +what's in the ISA, in order to put RT in the same position it appears +for other formats. + +-=-=-= DEPENDENCY =-=-=- + +DEPENDENCY filed consists of 5 digits. This represents which register is used as source and which register is used as target. +The first(most significant) digit is always 0. Then it is followd by RC, RB, RA and RT digits. +If the digit is 0, this means the corresponding register is not used in the instruction. +If the digit is 1, this means the corresponding register is used as a source in the instruction. +If the digit is 2, this means the corresponding register is used as a target in the instruction. +If the digit is 3, this means the corresponding register is used as both source and target in the instruction. +For example, fms instruction has 00113 as the DEPENDENCY field. This means RC is not used in this operation, RB and RA are +used as sources and RT is the target. + +-=-=-= PIPE =-=-=- + +This field shows which execution pipe is used for the instruction + +pipe0 execution pipelines: + FP6 SP floating pipeline + FP7 integer operations executed in SP floating pipeline + FPD DP floating pipeline + FX2 FXU pipeline + FX3 Rotate/Shift pipeline + FXB Byte pipeline + NOP No pipeline + +pipe1 execution pipelines: + BR Branch pipeline + LNOP No pipeline + LS Load/Store pipeline + SHUF Shuffle pipeline + SPR SPR/CH pipeline + +*/ + +#define _A0() {0} +#define _A1(a) {1,a} +#define _A2(a,b) {2,a,b} +#define _A3(a,b,c) {3,a,b,c} +#define _A4(a,b,c,d) {4,a,b,c,d} + +/* TAG FORMAT OPCODE MNEMONIC ASM_FORMAT DEPENDENCY PIPE COMMENT */ +/* 0[RC][RB][RA][RT] */ +/* 1:src, 2:target */ + +APUOP(M_BR, RI16, 0x190, "br", _A1(A_R18), 00000, BR) /* BRel IP<-IP+I16 */ +APUOP(M_BRSL, RI16, 0x198, "brsl", _A2(A_T,A_R18), 00002, BR) /* BRelSetLink RT,IP<-IP,IP+I16 */ +APUOP(M_BRA, RI16, 0x180, "bra", _A1(A_S18), 00000, BR) /* BRAbs IP<-I16 */ +APUOP(M_BRASL, RI16, 0x188, "brasl", _A2(A_T,A_S18), 00002, BR) /* BRAbsSetLink RT,IP<-IP,I16 */ +APUOP(M_FSMBI, RI16, 0x194, "fsmbi", _A2(A_T,A_X16), 00002, SHUF) /* FormSelMask%I RT<-fsm(I16) */ +APUOP(M_LQA, RI16, 0x184, "lqa", _A2(A_T,A_S18), 00002, LS) /* LoadQAbs RT<-M[I16] */ +APUOP(M_LQR, RI16, 0x19C, "lqr", _A2(A_T,A_R18), 00002, LS) /* LoadQRel RT<-M[IP+I16] */ +APUOP(M_STOP, RR, 0x000, "stop", _A0(), 00000, BR) /* STOP stop */ +APUOP(M_STOP2, RR, 0x000, "stop", _A1(A_U14), 00000, BR) /* STOP stop */ +APUOP(M_STOPD, RR, 0x140, "stopd", _A3(A_T,A_A,A_B), 00111, BR) /* STOPD stop (with register dependencies) */ +APUOP(M_LNOP, RR, 0x001, "lnop", _A0(), 00000, LNOP) /* LNOP no_operation */ +APUOP(M_SYNC, RR, 0x002, "sync", _A0(), 00000, BR) /* SYNC flush_pipe */ +APUOP(M_DSYNC, RR, 0x003, "dsync", _A0(), 00000, BR) /* DSYNC flush_store_queue */ +APUOP(M_MFSPR, RR, 0x00c, "mfspr", _A2(A_T,A_S), 00002, SPR) /* MFSPR RT<-SA */ +APUOP(M_RDCH, RR, 0x00d, "rdch", _A2(A_T,A_H), 00002, SPR) /* ReaDCHannel RT<-CA:data */ +APUOP(M_RCHCNT, RR, 0x00f, "rchcnt", _A2(A_T,A_H), 00002, SPR) /* ReaDCHanCouNT RT<-CA:count */ +APUOP(M_HBRA, LBT, 0x080, "hbra", _A2(A_S11,A_S18), 00000, LS) /* HBRA BTB[B9]<-M[I16] */ +APUOP(M_HBRR, LBT, 0x090, "hbrr", _A2(A_S11,A_R18), 00000, LS) /* HBRR BTB[B9]<-M[IP+I16] */ +APUOP(M_BRZ, RI16, 0x100, "brz", _A2(A_T,A_R18), 00001, BR) /* BRZ IP<-IP+I16_if(RT) */ +APUOP(M_BRNZ, RI16, 0x108, "brnz", _A2(A_T,A_R18), 00001, BR) /* BRNZ IP<-IP+I16_if(RT) */ +APUOP(M_BRHZ, RI16, 0x110, "brhz", _A2(A_T,A_R18), 00001, BR) /* BRHZ IP<-IP+I16_if(RT) */ +APUOP(M_BRHNZ, RI16, 0x118, "brhnz", _A2(A_T,A_R18), 00001, BR) /* BRHNZ IP<-IP+I16_if(RT) */ +APUOP(M_STQA, RI16, 0x104, "stqa", _A2(A_T,A_S18), 00001, LS) /* SToreQAbs M[I16]<-RT */ +APUOP(M_STQR, RI16, 0x11C, "stqr", _A2(A_T,A_R18), 00001, LS) /* SToreQRel M[IP+I16]<-RT */ +APUOP(M_MTSPR, RR, 0x10c, "mtspr", _A2(A_S,A_T), 00001, SPR) /* MTSPR SA<-RT */ +APUOP(M_WRCH, RR, 0x10d, "wrch", _A2(A_H,A_T), 00001, SPR) /* ChanWRite CA<-RT */ +APUOP(M_LQD, RI10, 0x1a0, "lqd", _A4(A_T,A_S14,A_P,A_A), 00012, LS) /* LoadQDisp RT<-M[Ra+I10] */ +APUOP(M_BI, RR, 0x1a8, "bi", _A1(A_A), 00010, BR) /* BI IP<-RA */ +APUOP(M_BISL, RR, 0x1a9, "bisl", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ +APUOP(M_IRET, RR, 0x1aa, "iret", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ +APUOP(M_IRET2, RR, 0x1aa, "iret", _A0(), 00010, BR) /* IRET IP<-SRR0 */ +APUOP(M_BISLED, RR, 0x1ab, "bisled", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ +APUOP(M_HBR, LBTI, 0x1ac, "hbr", _A2(A_S11I,A_A), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ +APUOP(M_FREST, RR, 0x1b8, "frest", _A2(A_T,A_A), 00012, SHUF) /* FREST RT<-recip(RA) */ +APUOP(M_FRSQEST, RR, 0x1b9, "frsqest", _A2(A_T,A_A), 00012, SHUF) /* FRSQEST RT<-rsqrt(RA) */ +APUOP(M_FSM, RR, 0x1b4, "fsm", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ +APUOP(M_FSMH, RR, 0x1b5, "fsmh", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ +APUOP(M_FSMB, RR, 0x1b6, "fsmb", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ +APUOP(M_GB, RR, 0x1b0, "gb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ +APUOP(M_GBH, RR, 0x1b1, "gbh", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ +APUOP(M_GBB, RR, 0x1b2, "gbb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ +APUOP(M_CBD, RI7, 0x1f4, "cbd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ +APUOP(M_CHD, RI7, 0x1f5, "chd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ +APUOP(M_CWD, RI7, 0x1f6, "cwd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ +APUOP(M_CDD, RI7, 0x1f7, "cdd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ +APUOP(M_ROTQBII, RI7, 0x1f8, "rotqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* ROTQBII RT<-RA<<I10) */ +APUOP(M_CGTHI, RI10, 0x268, "cgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ +APUOP(M_CGTI, RI10, 0x260, "cgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ +APUOP(M_CLGTBI, RI10, 0x2f0, "clgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ +APUOP(M_CLGTHI, RI10, 0x2e8, "clgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ +APUOP(M_CLGTI, RI10, 0x2e0, "clgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ +APUOP(M_CEQBI, RI10, 0x3f0, "ceqbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ +APUOP(M_CEQHI, RI10, 0x3e8, "ceqhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ +APUOP(M_CEQI, RI10, 0x3e0, "ceqi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ +APUOP(M_HGTI, RI10, 0x278, "hgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ +APUOP(M_HGTI2, RI10, 0x278, "hgti", _A2(A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ +APUOP(M_HLGTI, RI10, 0x2f8, "hlgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ +APUOP(M_HLGTI2, RI10, 0x2f8, "hlgti", _A2(A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ +APUOP(M_HEQI, RI10, 0x3f8, "heqi", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ +APUOP(M_HEQI2, RI10, 0x3f8, "heqi", _A2(A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ +APUOP(M_MPYI, RI10, 0x3a0, "mpyi", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYI RT<-RA*I10 */ +APUOP(M_MPYUI, RI10, 0x3a8, "mpyui", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYUI RT<-RA*I10 */ +APUOP(M_CFLTS, RI8, 0x3b0, "cflts", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTS RT<-int(RA,I8) */ +APUOP(M_CFLTU, RI8, 0x3b2, "cfltu", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTU RT<-int(RA,I8) */ +APUOP(M_CSFLT, RI8, 0x3b4, "csflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CSFLT RT<-flt(RA,I8) */ +APUOP(M_CUFLT, RI8, 0x3b6, "cuflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CUFLT RT<-flt(RA,I8) */ +APUOP(M_FESD, RR, 0x3b8, "fesd", _A2(A_T,A_A), 00012, FPD) /* FESD RT<-double(RA) */ +APUOP(M_FRDS, RR, 0x3b9, "frds", _A2(A_T,A_A), 00012, FPD) /* FRDS RT<-single(RA) */ +APUOP(M_FSCRRD, RR, 0x398, "fscrrd", _A1(A_T), 00002, FPD) /* FSCRRD RT<-FP_status */ +APUOP(M_FSCRWR, RR, 0x3ba, "fscrwr", _A2(A_T,A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ +APUOP(M_FSCRWR2, RR, 0x3ba, "fscrwr", _A1(A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ +APUOP(M_CLZ, RR, 0x2a5, "clz", _A2(A_T,A_A), 00012, FX2) /* CLZ RT<-clz(RA) */ +APUOP(M_CNTB, RR, 0x2b4, "cntb", _A2(A_T,A_A), 00012, FXB) /* CNT RT<-pop(RA) */ +APUOP(M_XSBH, RR, 0x2b6, "xsbh", _A2(A_T,A_A), 00012, FX2) /* eXtSignBtoH RT<-sign_ext(RA) */ +APUOP(M_XSHW, RR, 0x2ae, "xshw", _A2(A_T,A_A), 00012, FX2) /* eXtSignHtoW RT<-sign_ext(RA) */ +APUOP(M_XSWD, RR, 0x2a6, "xswd", _A2(A_T,A_A), 00012, FX2) /* eXtSignWtoD RT<-sign_ext(RA) */ +APUOP(M_ROTI, RI7, 0x078, "roti", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<RB) */ +APUOP(M_CGTB, RR, 0x250, "cgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ +APUOP(M_CGTH, RR, 0x248, "cgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ +APUOP(M_CLGT, RR, 0x2c0, "clgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ +APUOP(M_CLGTB, RR, 0x2d0, "clgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ +APUOP(M_CLGTH, RR, 0x2c8, "clgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ +APUOP(M_CEQ, RR, 0x3c0, "ceq", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ +APUOP(M_CEQB, RR, 0x3d0, "ceqb", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ +APUOP(M_CEQH, RR, 0x3c8, "ceqh", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ +APUOP(M_HGT, RR, 0x258, "hgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ +APUOP(M_HGT2, RR, 0x258, "hgt", _A2(A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ +APUOP(M_HLGT, RR, 0x2d8, "hlgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ +APUOP(M_HLGT2, RR, 0x2d8, "hlgt", _A2(A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ +APUOP(M_HEQ, RR, 0x3d8, "heq", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ +APUOP(M_HEQ2, RR, 0x3d8, "heq", _A2(A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ +APUOP(M_FCEQ, RR, 0x3c2, "fceq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCEQ RT<-(RA=RB) */ +APUOP(M_FCMEQ, RR, 0x3ca, "fcmeq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMEQ RT<-(|RA|=|RB|) */ +APUOP(M_FCGT, RR, 0x2c2, "fcgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCGT RT<-(RA>16 */ +APUOP(M_MPYU, RR, 0x3cc, "mpyu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYU RT<-RA*RB */ +APUOP(M_FI, RR, 0x3d4, "fi", _A3(A_T,A_A,A_B), 00112, FP7) /* FInterpolate RT<-f(RA,RB) */ +APUOP(M_ROT, RR, 0x058, "rot", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<RB) */ +APUOP(M_DFCMGT, RR, 0x2cb, "dfcmgt", _A3(A_T,A_A,A_B), 00112, FX2) /* DFCMGT RT<-(|RA|>|RB|) */ +APUOP(M_DFTSV, RI7, 0x3bf, "dftsv", _A3(A_T,A_A,A_U7), 00012, FX2) /* DFTSV RT<-testspecial(RA,I7) */ + +#undef _A0 +#undef _A1 +#undef _A2 +#undef _A3 +#undef _A4 diff --git a/include/opcode/spu.h b/include/opcode/spu.h new file mode 100644 index 0000000..c646830 --- /dev/null +++ b/include/opcode/spu.h @@ -0,0 +1,125 @@ +/* SPU ELF support for BFD. + + Copyright 2006, 2010 Free Software Foundation, Inc. + + This file is part of GDB, GAS, and the GNU binutils. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* These two enums are from rel_apu/common/spu_asm_format.h */ +/* definition of instruction format */ +typedef enum { + RRR, + RI18, + RI16, + RI10, + RI8, + RI7, + RR, + LBT, + LBTI, + IDATA, + UNKNOWN_IFORMAT +} spu_iformat; + +/* These values describe assembly instruction arguments. They indicate + * how to encode, range checking and which relocation to use. */ +typedef enum { + A_T, /* register at pos 0 */ + A_A, /* register at pos 7 */ + A_B, /* register at pos 14 */ + A_C, /* register at pos 21 */ + A_S, /* special purpose register at pos 7 */ + A_H, /* channel register at pos 7 */ + A_P, /* parenthesis, this has to separate regs from immediates */ + A_S3, + A_S6, + A_S7N, + A_S7, + A_U7A, + A_U7B, + A_S10B, + A_S10, + A_S11, + A_S11I, + A_S14, + A_S16, + A_S18, + A_R18, + A_U3, + A_U5, + A_U6, + A_U7, + A_U14, + A_X16, + A_U18, + A_MAX +} spu_aformat; + +enum spu_insns { +#define APUOP(TAG,MACFORMAT,OPCODE,MNEMONIC,ASMFORMAT,DEP,PIPE) \ + TAG, +#define APUOPFB(TAG,MACFORMAT,OPCODE,FB,MNEMONIC,ASMFORMAT,DEP,PIPE) \ + TAG, +#include "opcode/spu-insns.h" +#undef APUOP +#undef APUOPFB + M_SPU_MAX +}; + +struct spu_opcode +{ + spu_iformat insn_type; + unsigned int opcode; + char *mnemonic; + int arg[5]; +}; + +#define SIGNED_EXTRACT(insn,size,pos) (((int)((insn) << (32-size-pos))) >> (32-size)) +#define UNSIGNED_EXTRACT(insn,size,pos) (((insn) >> pos) & ((1 << size)-1)) + +#define DECODE_INSN_RT(insn) (insn & 0x7f) +#define DECODE_INSN_RA(insn) ((insn >> 7) & 0x7f) +#define DECODE_INSN_RB(insn) ((insn >> 14) & 0x7f) +#define DECODE_INSN_RC(insn) ((insn >> 21) & 0x7f) + +#define DECODE_INSN_I10(insn) SIGNED_EXTRACT(insn,10,14) +#define DECODE_INSN_U10(insn) UNSIGNED_EXTRACT(insn,10,14) + +/* For branching, immediate loads, hbr and lqa/stqa. */ +#define DECODE_INSN_I16(insn) SIGNED_EXTRACT(insn,16,7) +#define DECODE_INSN_U16(insn) UNSIGNED_EXTRACT(insn,16,7) + +/* for stop */ +#define DECODE_INSN_U14(insn) UNSIGNED_EXTRACT(insn,14,0) + +/* For ila */ +#define DECODE_INSN_I18(insn) SIGNED_EXTRACT(insn,18,7) +#define DECODE_INSN_U18(insn) UNSIGNED_EXTRACT(insn,18,7) + +/* For rotate and shift and generate control mask */ +#define DECODE_INSN_I7(insn) SIGNED_EXTRACT(insn,7,14) +#define DECODE_INSN_U7(insn) UNSIGNED_EXTRACT(insn,7,14) + +/* For float <-> int conversion */ +#define DECODE_INSN_I8(insn) SIGNED_EXTRACT(insn,8,14) +#define DECODE_INSN_U8(insn) UNSIGNED_EXTRACT(insn,8,14) + +/* For hbr */ +#define DECODE_INSN_I9a(insn) ((SIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) +#define DECODE_INSN_I9b(insn) ((SIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) +#define DECODE_INSN_U9a(insn) ((UNSIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) +#define DECODE_INSN_U9b(insn) ((UNSIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) + diff --git a/include/opcode/tahoe.h b/include/opcode/tahoe.h new file mode 100644 index 0000000..70fcf62 --- /dev/null +++ b/include/opcode/tahoe.h @@ -0,0 +1,232 @@ +/* + * Ported by the State University of New York at Buffalo by the Distributed + * Computer Systems Lab, Department of Computer Science, 1991. + */ +/* Copyright 2012 Free Software Foundation, Inc. + + This file is part of GDB and BINUTILS. + + GDB and BINUTILS are free software; you can redistribute them and/or + modify them under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 3, or (at + your option) any later version. + + GDB and BINUTILS are 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 GDB or BINUTILS; see the file COPYING3. If not, write + to the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + + +#ifndef tahoe_opcodeT +#define tahoe_opcodeT int +#endif /* no tahoe_opcodeT */ + +struct vot_wot /* tahoe opcode table: wot to do with this */ + /* particular opcode */ +{ + char * args; /* how to compile said opcode */ + tahoe_opcodeT code; /* op-code (may be > 8 bits!) */ +}; + +struct vot /* tahoe opcode text */ +{ + char * name; /* opcode name: lowercase string [key] */ + struct vot_wot detail; /* rest of opcode table [datum] */ +}; + +#define vot_how args +#define vot_code code +#define vot_detail detail +#define vot_name name + +static struct vot +votstrs[] = +{ +{ "halt", {"", 0x00 } }, +{ "sinf", {"", 0x05 } }, +{ "ldf", {"rl", 0x06 } }, +{ "ldd", {"rq", 0x07 } }, +{ "addb2", {"rbmb", 0x08 } }, +{ "movb", {"rbwb", 0x09 } }, +{ "addw2", {"rwmw", 0x0a } }, +{ "movw", {"rwww", 0x0b } }, +{ "addl2", {"rlml", 0x0c } }, +{ "movl", {"rlwl", 0x0d } }, +{ "bbs", {"rlvlbw", 0x0e } }, +{ "nop", {"", 0x10 } }, +{ "brb", {"bb", 0x11 } }, +{ "brw", {"bw", 0x13 } }, +{ "cosf", {"", 0x15 } }, +{ "lnf", {"rl", 0x16 } }, +{ "lnd", {"rq", 0x17 } }, +{ "addb3", {"rbrbwb", 0x18 } }, +{ "cmpb", {"rbwb", 0x19 } }, +{ "addw3", {"rwrwww", 0x1a } }, +{ "cmpw", {"rwww", 0x1b } }, +{ "addl3", {"rlrlwl", 0x1c } }, +{ "cmpl", {"rlwl", 0x1d } }, +{ "bbc", {"rlvlbw", 0x1e } }, +{ "rei", {"", 0x20 } }, +{ "bneq", {"bb", 0x21 } }, +{ "bnequ", {"bb", 0x21 } }, +{ "cvtwl", {"rwwl", 0x23 } }, +{ "stf", {"wl", 0x26 } }, +{ "std", {"wq", 0x27 } }, +{ "subb2", {"rbmb", 0x28 } }, +{ "mcomb", {"rbwb", 0x29 } }, +{ "subw2", {"rwmw", 0x2a } }, +{ "mcomw", {"rwww", 0x2b } }, +{ "subl2", {"rlml", 0x2c } }, +{ "mcoml", {"rlwl", 0x2d } }, +{ "emul", {"rlrlrlwq", 0x2e } }, +{ "aoblss", {"rlmlbw", 0x2f } }, +{ "bpt", {"", 0x30 } }, +{ "beql", {"bb", 0x31 } }, +{ "beqlu", {"bb", 0x31 } }, +{ "cvtwb", {"rwwb", 0x33 } }, +{ "logf", {"", 0x35 } }, +{ "cmpf", {"rl", 0x36 } }, +{ "cmpd", {"rq", 0x37 } }, +{ "subb3", {"rbrbwb", 0x38 } }, +{ "bitb", {"rbrb", 0x39 } }, +{ "subw3", {"rwrwww", 0x3a } }, +{ "bitw", {"rwrw", 0x3b } }, +{ "subl3", {"rlrlwl", 0x3c } }, +{ "bitl", {"rlrl", 0x3d } }, +{ "ediv", {"rlrqwlwl", 0x3e } }, +{ "aobleq", {"rlmlbw", 0x3f } }, +{ "ret", {"", 0x40 } }, +{ "bgtr", {"bb", 0x41 } }, +{ "sqrtf", {"", 0x45 } }, +{ "cmpf2", {"rl", 0x46 } }, +{ "cmpd2", {"rqrq", 0x47 } }, +{ "shll", {"rbrlwl", 0x48 } }, +{ "clrb", {"wb", 0x49 } }, +{ "shlq", {"rbrqwq", 0x4a } }, +{ "clrw", {"ww", 0x4b } }, +{ "mull2", {"rlml", 0x4c } }, +{ "clrl", {"wl", 0x4d } }, +{ "shal", {"rbrlwl", 0x4e } }, +{ "bleq", {"bb", 0x51 } }, +{ "expf", {"", 0x55 } }, +{ "tstf", {"", 0x56 } }, +{ "tstd", {"", 0x57 } }, +{ "shrl", {"rbrlwl", 0x58 } }, +{ "tstb", {"rb", 0x59 } }, +{ "shrq", {"rbrqwq", 0x5a } }, +{ "tstw", {"rw", 0x5b } }, +{ "mull3", {"rlrlwl", 0x5c } }, +{ "tstl", {"rl", 0x5d } }, +{ "shar", {"rbrlwl", 0x5e } }, +{ "bbssi", {"rlmlbw", 0x5f } }, +{ "ldpctx", {"", 0x60 } }, +{ "pushd", {"", 0x67 } }, +{ "incb", {"mb", 0x69 } }, +{ "incw", {"mw", 0x6b } }, +{ "divl2", {"rlml", 0x6c } }, +{ "incl", {"ml", 0x6d } }, +{ "cvtlb", {"rlwb", 0x6f } }, +{ "svpctx", {"", 0x70 } }, +{ "jmp", {"ab", 0x71 } }, +{ "cvlf", {"rl", 0x76 } }, +{ "cvld", {"rl", 0x77 } }, +{ "decb", {"mb", 0x79 } }, +{ "decw", {"mw", 0x7b } }, +{ "divl3", {"rlrlwl", 0x7c } }, +{ "decl", {"ml", 0x7d } }, +{ "cvtlw", {"rlww", 0x7f } }, +{ "bgeq", {"bb", 0x81 } }, +{ "movs2", {"abab", 0x82 } }, +{ "cvfl", {"wl", 0x86 } }, +{ "cvdl", {"wl", 0x87 } }, +{ "orb2", {"rbmb", 0x88 } }, +{ "cvtbl", {"rbwl", 0x89 } }, +{ "orw2", {"rwmw", 0x8a } }, +{ "bispsw", {"rw", 0x8b } }, +{ "orl2", {"rlml", 0x8c } }, +{ "adwc", {"rlml", 0x8d } }, +{ "adda", {"rlml", 0x8e } }, +{ "blss", {"bb", 0x91 } }, +{ "cmps2", {"abab", 0x92 } }, +{ "ldfd", {"rl", 0x97 } }, +{ "orb3", {"rbrbwb", 0x98 } }, +{ "cvtbw", {"rbww", 0x99 } }, +{ "orw3", {"rwrwww", 0x9a } }, +{ "bicpsw", {"rw", 0x9b } }, +{ "orl3", {"rlrlwl", 0x9c } }, +{ "sbwc", {"rlml", 0x9d } }, +{ "suba", {"rlml", 0x9e } }, +{ "bgtru", {"bb", 0xa1 } }, +{ "cvdf", {"", 0xa6 } }, +{ "andb2", {"rbmb", 0xa8 } }, +{ "movzbl", {"rbwl", 0xa9 } }, +{ "andw2", {"rwmw", 0xaa } }, +{ "loadr", {"rwal", 0xab } }, +{ "andl2", {"rlml", 0xac } }, +{ "mtpr", {"rlrl", 0xad } }, +{ "ffs", {"rlwl", 0xae } }, +{ "blequ", {"bb", 0xb1 } }, +{ "negf", {"", 0xb6 } }, +{ "negd", {"", 0xb7 } }, +{ "andb3", {"rbrbwb", 0xb8 } }, +{ "movzbw", {"rbww", 0xb9 } }, +{ "andw3", {"rwrwww", 0xba } }, +{ "storer", {"rwal", 0xbb } }, +{ "andl3", {"rlrlwl", 0xbc } }, +{ "mfpr", {"rlwl", 0xbd } }, +{ "ffc", {"rlwl", 0xbe } }, +{ "calls", {"rbab", 0xbf } }, +{ "prober", {"rbabrl", 0xc0 } }, +{ "bvc", {"bb", 0xc1 } }, +{ "movs3", {"ababrw", 0xc2 } }, +{ "movzwl", {"rwwl", 0xc3 } }, +{ "addf", {"rl", 0xc6 } }, +{ "addd", {"rq", 0xc7 } }, +{ "xorb2", {"rbmb", 0xc8 } }, +{ "movob", {"rbwb", 0xc9 } }, +{ "xorw2", {"rwmw", 0xca } }, +{ "movow", {"rwww", 0xcb } }, +{ "xorl2", {"rlml", 0xcc } }, +{ "movpsl", {"wl", 0xcd } }, +{ "kcall", {"rw", 0xcf } }, +{ "probew", {"rbabrl", 0xd0 } }, +{ "bvs", {"bb", 0xd1 } }, +{ "cmps3", {"ababrw", 0xd2 } }, +{ "subf", {"rq", 0xd6 } }, +{ "subd", {"rq", 0xd7 } }, +{ "xorb3", {"rbrbwb", 0xd8 } }, +{ "pushb", {"rb", 0xd9 } }, +{ "xorw3", {"rwrwww", 0xda } }, +{ "pushw", {"rw", 0xdb } }, +{ "xorl3", {"rlrlwl", 0xdc } }, +{ "pushl", {"rl", 0xdd } }, +{ "insque", {"abab", 0xe0 } }, +{ "bcs", {"bb", 0xe1 } }, +{ "bgequ", {"bb", 0xe1 } }, +{ "mulf", {"rq", 0xe6 } }, +{ "muld", {"rq", 0xe7 } }, +{ "mnegb", {"rbwb", 0xe8 } }, +{ "movab", {"abwl", 0xe9 } }, +{ "mnegw", {"rwww", 0xea } }, +{ "movaw", {"awwl", 0xeb } }, +{ "mnegl", {"rlwl", 0xec } }, +{ "moval", {"alwl", 0xed } }, +{ "remque", {"ab", 0xf0 } }, +{ "bcc", {"bb", 0xf1 } }, +{ "blssu", {"bb", 0xf1 } }, +{ "divf", {"rq", 0xf6 } }, +{ "divd", {"rq", 0xf7 } }, +{ "movblk", {"alalrw", 0xf8 } }, +{ "pushab", {"ab", 0xf9 } }, +{ "pushaw", {"aw", 0xfb } }, +{ "casel", {"rlrlrl", 0xfc } }, +{ "pushal", {"al", 0xfd } }, +{ "callf", {"rbab", 0xfe } }, +{ "" , "" } /* empty is end sentinel */ + +}; diff --git a/include/opcode/tic30.h b/include/opcode/tic30.h new file mode 100644 index 0000000..3f4d307 --- /dev/null +++ b/include/opcode/tic30.h @@ -0,0 +1,691 @@ +/* tic30.h -- Header file for TI TMS320C30 opcode table + Copyright 1998, 2005, 2009, 2010 Free Software Foundation, Inc. + Contributed by Steven Haworth (steve@pm.cse.rmit.edu.au) + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* FIXME: The opcode table should be in opcodes/tic30-opc.c, not in a + header file. */ + +#ifndef _TMS320_H_ +#define _TMS320_H_ + +struct _register +{ + char *name; + unsigned char opcode; + unsigned char regtype; +}; + +typedef struct _register reg; + +#define REG_Rn 0x01 +#define REG_ARn 0x02 +#define REG_DP 0x03 +#define REG_OTHER 0x04 + +static const reg tic30_regtab[] = { + { "r0", 0x00, REG_Rn }, + { "r1", 0x01, REG_Rn }, + { "r2", 0x02, REG_Rn }, + { "r3", 0x03, REG_Rn }, + { "r4", 0x04, REG_Rn }, + { "r5", 0x05, REG_Rn }, + { "r6", 0x06, REG_Rn }, + { "r7", 0x07, REG_Rn }, + { "ar0",0x08, REG_ARn }, + { "ar1",0x09, REG_ARn }, + { "ar2",0x0A, REG_ARn }, + { "ar3",0x0B, REG_ARn }, + { "ar4",0x0C, REG_ARn }, + { "ar5",0x0D, REG_ARn }, + { "ar6",0x0E, REG_ARn }, + { "ar7",0x0F, REG_ARn }, + { "dp", 0x10, REG_DP }, + { "ir0",0x11, REG_OTHER }, + { "ir1",0x12, REG_OTHER }, + { "bk", 0x13, REG_OTHER }, + { "sp", 0x14, REG_OTHER }, + { "st", 0x15, REG_OTHER }, + { "ie", 0x16, REG_OTHER }, + { "if", 0x17, REG_OTHER }, + { "iof",0x18, REG_OTHER }, + { "rs", 0x19, REG_OTHER }, + { "re", 0x1A, REG_OTHER }, + { "rc", 0x1B, REG_OTHER }, + { "R0", 0x00, REG_Rn }, + { "R1", 0x01, REG_Rn }, + { "R2", 0x02, REG_Rn }, + { "R3", 0x03, REG_Rn }, + { "R4", 0x04, REG_Rn }, + { "R5", 0x05, REG_Rn }, + { "R6", 0x06, REG_Rn }, + { "R7", 0x07, REG_Rn }, + { "AR0",0x08, REG_ARn }, + { "AR1",0x09, REG_ARn }, + { "AR2",0x0A, REG_ARn }, + { "AR3",0x0B, REG_ARn }, + { "AR4",0x0C, REG_ARn }, + { "AR5",0x0D, REG_ARn }, + { "AR6",0x0E, REG_ARn }, + { "AR7",0x0F, REG_ARn }, + { "DP", 0x10, REG_DP }, + { "IR0",0x11, REG_OTHER }, + { "IR1",0x12, REG_OTHER }, + { "BK", 0x13, REG_OTHER }, + { "SP", 0x14, REG_OTHER }, + { "ST", 0x15, REG_OTHER }, + { "IE", 0x16, REG_OTHER }, + { "IF", 0x17, REG_OTHER }, + { "IOF",0x18, REG_OTHER }, + { "RS", 0x19, REG_OTHER }, + { "RE", 0x1A, REG_OTHER }, + { "RC", 0x1B, REG_OTHER }, + { "", 0, 0 } +}; + +static const reg *const tic30_regtab_end + = tic30_regtab + sizeof(tic30_regtab)/sizeof(tic30_regtab[0]); + +/* Indirect Addressing Modes Modification Fields */ +/* Indirect Addressing with Displacement */ +#define PreDisp_Add 0x00 +#define PreDisp_Sub 0x01 +#define PreDisp_Add_Mod 0x02 +#define PreDisp_Sub_Mod 0x03 +#define PostDisp_Add_Mod 0x04 +#define PostDisp_Sub_Mod 0x05 +#define PostDisp_Add_Circ 0x06 +#define PostDisp_Sub_Circ 0x07 +/* Indirect Addressing with Index Register IR0 */ +#define PreIR0_Add 0x08 +#define PreIR0_Sub 0x09 +#define PreIR0_Add_Mod 0x0A +#define PreIR0_Sub_Mod 0x0B +#define PostIR0_Add_Mod 0x0C +#define PostIR0_Sub_Mod 0x0D +#define PostIR0_Add_Circ 0x0E +#define PostIR0_Sub_Circ 0x0F +/* Indirect Addressing with Index Register IR1 */ +#define PreIR1_Add 0x10 +#define PreIR1_Sub 0x11 +#define PreIR1_Add_Mod 0x12 +#define PreIR1_Sub_Mod 0x13 +#define PostIR1_Add_Mod 0x14 +#define PostIR1_Sub_Mod 0x15 +#define PostIR1_Add_Circ 0x16 +#define PostIR1_Sub_Circ 0x17 +/* Indirect Addressing (Special Cases) */ +#define IndirectOnly 0x18 +#define PostIR0_Add_BitRev 0x19 + +typedef struct { + char *syntax; + unsigned char modfield; + unsigned char displacement; +} ind_addr_type; + +#define IMPLIED_DISP 0x01 +#define DISP_REQUIRED 0x02 +#define NO_DISP 0x03 + +static const ind_addr_type tic30_indaddr_tab[] = { + { "*+ar", PreDisp_Add, IMPLIED_DISP }, + { "*-ar", PreDisp_Sub, IMPLIED_DISP }, + { "*++ar", PreDisp_Add_Mod, IMPLIED_DISP }, + { "*--ar", PreDisp_Sub_Mod, IMPLIED_DISP }, + { "*ar++", PostDisp_Add_Mod, IMPLIED_DISP }, + { "*ar--", PostDisp_Sub_Mod, IMPLIED_DISP }, + { "*ar++%", PostDisp_Add_Circ, IMPLIED_DISP }, + { "*ar--%", PostDisp_Sub_Circ, IMPLIED_DISP }, + { "*+ar()", PreDisp_Add, DISP_REQUIRED }, + { "*-ar()", PreDisp_Sub, DISP_REQUIRED }, + { "*++ar()", PreDisp_Add_Mod, DISP_REQUIRED }, + { "*--ar()", PreDisp_Sub_Mod, DISP_REQUIRED }, + { "*ar++()", PostDisp_Add_Mod, DISP_REQUIRED }, + { "*ar--()", PostDisp_Sub_Mod, DISP_REQUIRED }, + { "*ar++()%", PostDisp_Add_Circ, DISP_REQUIRED }, + { "*ar--()%", PostDisp_Sub_Circ, DISP_REQUIRED }, + { "*+ar(ir0)", PreIR0_Add, NO_DISP }, + { "*-ar(ir0)", PreIR0_Sub, NO_DISP }, + { "*++ar(ir0)", PreIR0_Add_Mod, NO_DISP }, + { "*--ar(ir0)", PreIR0_Sub_Mod, NO_DISP }, + { "*ar++(ir0)", PostIR0_Add_Mod, NO_DISP }, + { "*ar--(ir0)", PostIR0_Sub_Mod, NO_DISP }, + { "*ar++(ir0)%",PostIR0_Add_Circ, NO_DISP }, + { "*ar--(ir0)%",PostIR0_Sub_Circ, NO_DISP }, + { "*+ar(ir1)", PreIR1_Add, NO_DISP }, + { "*-ar(ir1)", PreIR1_Sub, NO_DISP }, + { "*++ar(ir1)", PreIR1_Add_Mod, NO_DISP }, + { "*--ar(ir1)", PreIR1_Sub_Mod, NO_DISP }, + { "*ar++(ir1)", PostIR1_Add_Mod, NO_DISP }, + { "*ar--(ir1)", PostIR1_Sub_Mod, NO_DISP }, + { "*ar++(ir1)%",PostIR1_Add_Circ, NO_DISP }, + { "*ar--(ir1)%",PostIR1_Sub_Circ, NO_DISP }, + { "*ar", IndirectOnly, NO_DISP }, + { "*ar++(ir0)b",PostIR0_Add_BitRev, NO_DISP }, + { "", 0,0 } +}; + +static const ind_addr_type *const tic30_indaddrtab_end + = tic30_indaddr_tab + sizeof(tic30_indaddr_tab)/sizeof(tic30_indaddr_tab[0]); + +/* Possible operand types */ +/* Register types */ +#define Rn 0x0001 +#define ARn 0x0002 +#define DPReg 0x0004 +#define OtherReg 0x0008 +/* Addressing mode types */ +#define Direct 0x0010 +#define Indirect 0x0020 +#define Imm16 0x0040 +#define Disp 0x0080 +#define Imm24 0x0100 +#define Abs24 0x0200 +/* 3 operand addressing mode types */ +#define op3T1 0x0400 +#define op3T2 0x0800 +/* Interrupt vector */ +#define IVector 0x1000 +/* Not required */ +#define NotReq 0x2000 + +#define GAddr1 Rn | Direct | Indirect | Imm16 +#define GAddr2 GAddr1 | AllReg +#define TAddr1 op3T1 | Rn | Indirect +#define TAddr2 op3T2 | Rn | Indirect +#define Reg Rn | ARn +#define AllReg Reg | DPReg | OtherReg + +typedef struct _template +{ + char *name; + unsigned int operands; /* how many operands */ + unsigned int base_opcode; /* base_opcode is the fundamental opcode byte */ + /* the bits in opcode_modifier are used to generate the final opcode from + the base_opcode. These bits also are used to detect alternate forms of + the same instruction */ + unsigned int opcode_modifier; + + /* opcode_modifier bits: */ +#define AddressMode 0x00600000 +#define PCRel 0x02000000 +#define StackOp 0x001F0000 +#define Rotate StackOp + + /* operand_types[i] describes the type of operand i. This is made + by OR'ing together all of the possible type masks. (e.g. + 'operand_types[i] = Reg|Imm' specifies that operand i can be + either a register or an immediate operand */ + unsigned int operand_types[3]; + /* This defines the number type of an immediate argument to an instruction. */ + int imm_arg_type; +#define Imm_None 0 +#define Imm_Float 1 +#define Imm_SInt 2 +#define Imm_UInt 3 +} +insn_template; + +static const insn_template tic30_optab[] = { + { "absf" ,2,0x00000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "absi" ,2,0x00800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "addc" ,2,0x01000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "addc3" ,3,0x20000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "addf" ,2,0x01800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "addf3" ,3,0x20800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None }, + { "addi" ,2,0x02000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "addi3" ,3,0x21000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "and" ,2,0x02800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "and3" ,3,0x21800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "andn" ,2,0x03000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "andn3" ,3,0x22000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "ash" ,2,0x03800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ash3" ,3,0x22800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "b" ,1,0x68000000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bu" ,1,0x68000000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blo" ,1,0x68010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bls" ,1,0x68020000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bhi" ,1,0x68030000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bhs" ,1,0x68040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "beq" ,1,0x68050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bne" ,1,0x68060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blt" ,1,0x68070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "ble" ,1,0x68080000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bgt" ,1,0x68090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bge" ,1,0x680A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bz" ,1,0x68050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnz" ,1,0x68060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bp" ,1,0x68090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bn" ,1,0x68070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnn" ,1,0x680A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnv" ,1,0x680C0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bv" ,1,0x680D0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnuf" ,1,0x680E0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "buf" ,1,0x680F0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnc" ,1,0x68040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bc" ,1,0x68010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnlv" ,1,0x68100000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blv" ,1,0x68110000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnluf" ,1,0x68120000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bluf" ,1,0x68130000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bzuf" ,1,0x68140000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bd" ,1,0x68200000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bud" ,1,0x68200000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blod" ,1,0x68210000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blsd" ,1,0x68220000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bhid" ,1,0x68230000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bhsd" ,1,0x68240000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "beqd" ,1,0x68250000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bned" ,1,0x68260000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bltd" ,1,0x68270000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bled" ,1,0x68280000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bgtd" ,1,0x68290000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bged" ,1,0x682A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bzd" ,1,0x68250000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnzd" ,1,0x68260000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bpd" ,1,0x68290000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnd" ,1,0x68270000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnnd" ,1,0x682A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnvd" ,1,0x682C0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bvd" ,1,0x682D0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnufd" ,1,0x682E0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bufd" ,1,0x682F0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bncd" ,1,0x68240000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bcd" ,1,0x68210000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnlvd" ,1,0x68300000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blvd" ,1,0x68310000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bnlufd" ,1,0x68320000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "blufd" ,1,0x68330000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "bzufd" ,1,0x68340000,PCRel, { AllReg|Disp, 0, 0 }, Imm_None }, + { "br" ,1,0x60000000,0, { Imm24, 0, 0 }, Imm_UInt }, + { "brd" ,1,0x61000000,0, { Imm24, 0, 0 }, Imm_UInt }, + { "call" ,1,0x62000000,0, { Imm24, 0, 0 }, Imm_UInt }, + { "callu" ,1,0x70000000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "calllo" ,1,0x70010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callls" ,1,0x70020000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callhi" ,1,0x70030000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callhs" ,1,0x70040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "calleq" ,1,0x70050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callne" ,1,0x70060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "calllt" ,1,0x70070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callle" ,1,0x70080000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callgt" ,1,0x70090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callge" ,1,0x700A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callz" ,1,0x70050000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnz" ,1,0x70060000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callp" ,1,0x70090000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "calln" ,1,0x70070000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnn" ,1,0x700A0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnv" ,1,0x700C0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callv" ,1,0x700D0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnuf",1,0x700E0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "calluf" ,1,0x700F0000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnc" ,1,0x70040000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callc" ,1,0x70010000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnlv",1,0x70100000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "calllv" ,1,0x70110000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callnluf",1,0x70120000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callluf",1,0x70130000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "callzuf",1,0x70140000,PCRel, { AllReg|Disp, 0, 0 }, Imm_UInt }, + { "cmpf" ,2,0x04000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "cmpf3" ,2,0x23000000,AddressMode, { TAddr1, TAddr2, 0 }, Imm_None }, + { "cmpi" ,2,0x04800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "cmpi3" ,2,0x23800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, 0 }, Imm_None }, + { "db" ,2,0x6C000000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbu" ,2,0x6C000000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblo" ,2,0x6C010000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbls" ,2,0x6C020000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbhi" ,2,0x6C030000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbhs" ,2,0x6C040000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbeq" ,2,0x6C050000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbne" ,2,0x6C060000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblt" ,2,0x6C070000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dble" ,2,0x6C080000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbgt" ,2,0x6C090000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbge" ,2,0x6C0A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbz" ,2,0x6C050000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnz" ,2,0x6C060000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbp" ,2,0x6C090000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbn" ,2,0x6C070000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnn" ,2,0x6C0A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnv" ,2,0x6C0C0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbv" ,2,0x6C0D0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnuf" ,2,0x6C0E0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbuf" ,2,0x6C0F0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnc" ,2,0x6C040000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbc" ,2,0x6C010000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnlv" ,2,0x6C100000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblv" ,2,0x6C110000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnluf" ,2,0x6C120000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbluf" ,2,0x6C130000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbzuf" ,2,0x6C140000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbd" ,2,0x6C200000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbud" ,2,0x6C200000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblod" ,2,0x6C210000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblsd" ,2,0x6C220000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbhid" ,2,0x6C230000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbhsd" ,2,0x6C240000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbeqd" ,2,0x6C250000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbned" ,2,0x6C260000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbltd" ,2,0x6C270000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbled" ,2,0x6C280000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbgtd" ,2,0x6C290000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbged" ,2,0x6C2A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbzd" ,2,0x6C250000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnzd" ,2,0x6C260000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbpd" ,2,0x6C290000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnd" ,2,0x6C270000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnnd" ,2,0x6C2A0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnvd" ,2,0x6C2C0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbvd" ,2,0x6C2D0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnufd" ,2,0x6C2E0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbufd" ,2,0x6C2F0000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbncd" ,2,0x6C240000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbcd" ,2,0x6C210000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnlvd" ,2,0x6C300000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblvd" ,2,0x6C310000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbnlufd",2,0x6C320000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dblufd" ,2,0x6C330000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "dbzufd" ,2,0x6C340000,PCRel, { ARn, AllReg|Disp, 0 }, Imm_None }, + { "fix" ,2,0x05000000,AddressMode, { GAddr1, AllReg, 0 }, Imm_Float }, + { "float" ,2,0x05800000,AddressMode, { GAddr2, Rn, 0 }, Imm_SInt }, + { "iack" ,1,0x1B000000,AddressMode, { Direct|Indirect, 0, 0 }, Imm_None }, + { "idle" ,0,0x06000000,0, { 0, 0, 0 }, Imm_None }, + { "idle2" ,0,0x06000001,0, { 0, 0, 0 }, Imm_None }, /* LC31 Only */ + { "lde" ,2,0x06800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldf" ,2,0x07000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfu" ,2,0x40000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldflo" ,2,0x40800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfls" ,2,0x41000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfhi" ,2,0x41800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfhs" ,2,0x42000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfeq" ,2,0x42800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfne" ,2,0x43000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldflt" ,2,0x43800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfle" ,2,0x44000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfgt" ,2,0x44800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfge" ,2,0x45000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfz" ,2,0x42800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnz" ,2,0x43000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfp" ,2,0x44800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfn" ,2,0x43800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnn" ,2,0x45000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnv" ,2,0x46000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfv" ,2,0x46800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnuf" ,2,0x47000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfuf" ,2,0x47800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnc" ,2,0x42000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfc" ,2,0x40800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnlv" ,2,0x48000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldflv" ,2,0x48800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfnluf",2,0x49000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfluf" ,2,0x49800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfzuf" ,2,0x4A000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldfi" ,2,0x07800000,AddressMode, { Direct|Indirect, Rn, 0 }, Imm_None }, + { "ldi" ,2,0x08000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldiu" ,2,0x50000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldilo" ,2,0x50800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldils" ,2,0x51000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldihi" ,2,0x51800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldihs" ,2,0x52000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldieq" ,2,0x52800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldine" ,2,0x53000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldilt" ,2,0x53800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldile" ,2,0x54000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldigt" ,2,0x54800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldige" ,2,0x55000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldiz" ,2,0x52800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinz" ,2,0x53000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldip" ,2,0x54800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldin" ,2,0x53800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinn" ,2,0x55000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinv" ,2,0x56000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldiv" ,2,0x56800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinuf" ,2,0x57000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldiuf" ,2,0x57800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinc" ,2,0x52000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldic" ,2,0x50800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinlv" ,2,0x58000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldilv" ,2,0x58800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldinluf",2,0x59000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldiluf" ,2,0x59800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldizuf" ,2,0x5A000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "ldii" ,2,0x08800000,AddressMode, { Direct|Indirect, AllReg, 0 }, Imm_None }, + { "ldm" ,2,0x09000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "ldp" ,2,0x08700000,0, { Abs24|Direct, DPReg|NotReq, 0 }, Imm_UInt }, + { "lopower",0,0x10800001,0, { 0, 0, 0 }, Imm_None }, /* LC31 Only */ + { "lsh" ,2,0x09800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "lsh3" ,3,0x24000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "maxspeed",0,0x10800000,0, { 0, 0, 0 }, Imm_None }, /* LC31 Only */ + { "mpyf" ,2,0x0A000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "mpyf3" ,3,0x24800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None }, + { "mpyi" ,2,0x0A800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "mpyi3" ,3,0x25000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "negb" ,2,0x0B000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "negf" ,2,0x0B800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "negi" ,2,0x0C000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "nop" ,1,0x0C800000,AddressMode, { AllReg|Indirect|NotReq, 0, 0 }, Imm_None }, + { "norm" ,2,0x0D000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, /*Check another source*/ + { "not" ,2,0x0D800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "or" ,2,0x10000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "or3" ,3,0x25800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "pop" ,1,0x0E200000,StackOp, { AllReg, 0, 0 }, Imm_None }, + { "popf" ,1,0x0EA00000,StackOp, { Rn, 0, 0 }, Imm_None }, + { "push" ,1,0x0F200000,StackOp, { AllReg, 0, 0 }, Imm_None }, + { "pushf" ,1,0x0FA00000,StackOp, { Rn, 0, 0 }, Imm_None }, + { "reti" ,0,0x78000000,0, { 0, 0, 0 }, Imm_None }, + { "retiu" ,0,0x78000000,0, { 0, 0, 0 }, Imm_None }, + { "retilo" ,0,0x78010000,0, { 0, 0, 0 }, Imm_None }, + { "retils" ,0,0x78020000,0, { 0, 0, 0 }, Imm_None }, + { "retihi" ,0,0x78030000,0, { 0, 0, 0 }, Imm_None }, + { "retihs" ,0,0x78040000,0, { 0, 0, 0 }, Imm_None }, + { "retieq" ,0,0x78050000,0, { 0, 0, 0 }, Imm_None }, + { "retine" ,0,0x78060000,0, { 0, 0, 0 }, Imm_None }, + { "retilt" ,0,0x78070000,0, { 0, 0, 0 }, Imm_None }, + { "retile" ,0,0x78080000,0, { 0, 0, 0 }, Imm_None }, + { "retigt" ,0,0x78090000,0, { 0, 0, 0 }, Imm_None }, + { "retige" ,0,0x780A0000,0, { 0, 0, 0 }, Imm_None }, + { "retiz" ,0,0x78050000,0, { 0, 0, 0 }, Imm_None }, + { "retinz" ,0,0x78060000,0, { 0, 0, 0 }, Imm_None }, + { "retip" ,0,0x78090000,0, { 0, 0, 0 }, Imm_None }, + { "retin" ,0,0x78070000,0, { 0, 0, 0 }, Imm_None }, + { "retinn" ,0,0x780A0000,0, { 0, 0, 0 }, Imm_None }, + { "retinv" ,0,0x780C0000,0, { 0, 0, 0 }, Imm_None }, + { "retiv" ,0,0x780D0000,0, { 0, 0, 0 }, Imm_None }, + { "retinuf",0,0x780E0000,0, { 0, 0, 0 }, Imm_None }, + { "retiuf" ,0,0x780F0000,0, { 0, 0, 0 }, Imm_None }, + { "retinc" ,0,0x78040000,0, { 0, 0, 0 }, Imm_None }, + { "retic" ,0,0x78010000,0, { 0, 0, 0 }, Imm_None }, + { "retinlv",0,0x78100000,0, { 0, 0, 0 }, Imm_None }, + { "retilv" ,0,0x78110000,0, { 0, 0, 0 }, Imm_None }, + { "retinluf",0,0x78120000,0, { 0, 0, 0 }, Imm_None }, + { "retiluf",0,0x78130000,0, { 0, 0, 0 }, Imm_None }, + { "retizuf",0,0x78140000,0, { 0, 0, 0 }, Imm_None }, + { "rets" ,0,0x78800000,0, { 0, 0, 0 }, Imm_None }, + { "retsu" ,0,0x78800000,0, { 0, 0, 0 }, Imm_None }, + { "retslo" ,0,0x78810000,0, { 0, 0, 0 }, Imm_None }, + { "retsls" ,0,0x78820000,0, { 0, 0, 0 }, Imm_None }, + { "retshi" ,0,0x78830000,0, { 0, 0, 0 }, Imm_None }, + { "retshs" ,0,0x78840000,0, { 0, 0, 0 }, Imm_None }, + { "retseq" ,0,0x78850000,0, { 0, 0, 0 }, Imm_None }, + { "retsne" ,0,0x78860000,0, { 0, 0, 0 }, Imm_None }, + { "retslt" ,0,0x78870000,0, { 0, 0, 0 }, Imm_None }, + { "retsle" ,0,0x78880000,0, { 0, 0, 0 }, Imm_None }, + { "retsgt" ,0,0x78890000,0, { 0, 0, 0 }, Imm_None }, + { "retsge" ,0,0x788A0000,0, { 0, 0, 0 }, Imm_None }, + { "retsz" ,0,0x78850000,0, { 0, 0, 0 }, Imm_None }, + { "retsnz" ,0,0x78860000,0, { 0, 0, 0 }, Imm_None }, + { "retsp" ,0,0x78890000,0, { 0, 0, 0 }, Imm_None }, + { "retsn" ,0,0x78870000,0, { 0, 0, 0 }, Imm_None }, + { "retsnn" ,0,0x788A0000,0, { 0, 0, 0 }, Imm_None }, + { "retsnv" ,0,0x788C0000,0, { 0, 0, 0 }, Imm_None }, + { "retsv" ,0,0x788D0000,0, { 0, 0, 0 }, Imm_None }, + { "retsnuf",0,0x788E0000,0, { 0, 0, 0 }, Imm_None }, + { "retsuf" ,0,0x788F0000,0, { 0, 0, 0 }, Imm_None }, + { "retsnc" ,0,0x78840000,0, { 0, 0, 0 }, Imm_None }, + { "retsc" ,0,0x78810000,0, { 0, 0, 0 }, Imm_None }, + { "retsnlv",0,0x78900000,0, { 0, 0, 0 }, Imm_None }, + { "retslv" ,0,0x78910000,0, { 0, 0, 0 }, Imm_None }, + { "retsnluf",0,0x78920000,0, { 0, 0, 0 }, Imm_None }, + { "retsluf",0,0x78930000,0, { 0, 0, 0 }, Imm_None }, + { "retszuf",0,0x78940000,0, { 0, 0, 0 }, Imm_None }, + { "rnd" ,2,0x11000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "rol" ,1,0x11E00001,Rotate, { AllReg, 0, 0 }, Imm_None }, + { "rolc" ,1,0x12600001,Rotate, { AllReg, 0, 0 }, Imm_None }, + { "ror" ,1,0x12E0FFFF,Rotate, { AllReg, 0, 0 }, Imm_None }, + { "rorc" ,1,0x1360FFFF,Rotate, { AllReg, 0, 0 }, Imm_None }, + { "rptb" ,1,0x64000000,0, { Imm24, 0, 0 }, Imm_UInt }, + { "rpts" ,1,0x139B0000,AddressMode, { GAddr2, 0, 0 }, Imm_UInt }, + { "sigi" ,0,0x16000000,0, { 0, 0, 0 }, Imm_None }, + { "stf" ,2,0x14000000,AddressMode, { Rn, Direct|Indirect, 0 }, Imm_Float }, + { "stfi" ,2,0x14800000,AddressMode, { Rn, Direct|Indirect, 0 }, Imm_Float }, + { "sti" ,2,0x15000000,AddressMode, { AllReg, Direct|Indirect, 0 }, Imm_SInt }, + { "stii" ,2,0x15800000,AddressMode, { AllReg, Direct|Indirect, 0 }, Imm_SInt }, + { "subb" ,2,0x16800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "subb3" ,3,0x26000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "subc" ,2,0x17000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "subf" ,2,0x17800000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "subf3" ,3,0x26800000,AddressMode, { TAddr1, TAddr2, Rn }, Imm_None }, + { "subi" ,2,0x18000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "subi3" ,3,0x27000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "subrb" ,2,0x18800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "subrf" ,2,0x19000000,AddressMode, { GAddr1, Rn, 0 }, Imm_Float }, + { "subri" ,2,0x19800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_SInt }, + { "swi" ,0,0x66000000,0, { 0, 0, 0 }, Imm_None }, + { "trap" ,1,0x74800020,0, { IVector, 0, 0 }, Imm_None }, + { "trapu" ,1,0x74800020,0, { IVector, 0, 0 }, Imm_None }, + { "traplo" ,1,0x74810020,0, { IVector, 0, 0 }, Imm_None }, + { "trapls" ,1,0x74820020,0, { IVector, 0, 0 }, Imm_None }, + { "traphi" ,1,0x74830020,0, { IVector, 0, 0 }, Imm_None }, + { "traphs" ,1,0x74840020,0, { IVector, 0, 0 }, Imm_None }, + { "trapeq" ,1,0x74850020,0, { IVector, 0, 0 }, Imm_None }, + { "trapne" ,1,0x74860020,0, { IVector, 0, 0 }, Imm_None }, + { "traplt" ,1,0x74870020,0, { IVector, 0, 0 }, Imm_None }, + { "traple" ,1,0x74880020,0, { IVector, 0, 0 }, Imm_None }, + { "trapgt" ,1,0x74890020,0, { IVector, 0, 0 }, Imm_None }, + { "trapge" ,1,0x748A0020,0, { IVector, 0, 0 }, Imm_None }, + { "trapz" ,1,0x74850020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnz" ,1,0x74860020,0, { IVector, 0, 0 }, Imm_None }, + { "trapp" ,1,0x74890020,0, { IVector, 0, 0 }, Imm_None }, + { "trapn" ,1,0x74870020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnn" ,1,0x748A0020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnv" ,1,0x748C0020,0, { IVector, 0, 0 }, Imm_None }, + { "trapv" ,1,0x748D0020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnuf",1,0x748E0020,0, { IVector, 0, 0 }, Imm_None }, + { "trapuf" ,1,0x748F0020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnc" ,1,0x74840020,0, { IVector, 0, 0 }, Imm_None }, + { "trapc" ,1,0x74810020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnlv",1,0x74900020,0, { IVector, 0, 0 }, Imm_None }, + { "traplv" ,1,0x74910020,0, { IVector, 0, 0 }, Imm_None }, + { "trapnluf",1,0x74920020,0, { IVector, 0, 0 }, Imm_None }, + { "trapluf",1,0x74930020,0, { IVector, 0, 0 }, Imm_None }, + { "trapzuf",1,0x74940020,0, { IVector, 0, 0 }, Imm_None }, + { "tstb" ,2,0x1A000000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "tstb3" ,2,0x27800000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, 0 }, Imm_None }, + { "xor" ,2,0x1A800000,AddressMode, { GAddr2, AllReg, 0 }, Imm_UInt }, + { "xor3" ,3,0x28000000,AddressMode, { TAddr1|AllReg, TAddr2|AllReg, AllReg }, Imm_None }, + { "" ,0,0x00000000,0, { 0, 0, 0 }, 0 } +}; + +static const insn_template *const tic30_optab_end = + tic30_optab + sizeof(tic30_optab)/sizeof(tic30_optab[0]); + +typedef struct { + char *name; + unsigned int operands_1; + unsigned int operands_2; + unsigned int base_opcode; + unsigned int operand_types[2][3]; + /* Which operand fits into which part of the final opcode word. */ + int oporder; +} partemplate; + +/* oporder defines - not very descriptive. */ +#define OO_4op1 0 +#define OO_4op2 1 +#define OO_4op3 2 +#define OO_5op1 3 +#define OO_5op2 4 +#define OO_PField 5 + +static const partemplate tic30_paroptab[] = { + { "q_absf_stf", 2,2,0xC8000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_absi_sti", 2,2,0xCA000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_addf3_stf", 3,2,0xCC000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "q_addi3_sti", 3,2,0xCE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "q_and3_sti", 3,2,0xD0000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "q_ash3_sti", 3,2,0xD2000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, + OO_5op2 }, + { "q_fix_sti", 2,2,0xD4000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_float_stf", 2,2,0xD6000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_ldf_ldf", 2,2,0xC4000000, { { Indirect, Rn, 0 }, { Indirect, Rn, 0 } }, + OO_4op2 }, + { "q_ldf_stf", 2,2,0xD8000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_ldi_ldi", 2,2,0xC6000000, { { Indirect, Rn, 0 }, { Indirect, Rn, 0 } }, + OO_4op2 }, + { "q_ldi_sti", 2,2,0xDA000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_lsh3_sti", 3,2,0xDC000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, + OO_5op2 }, + { "q_mpyf3_addf3",3,3,0x80000000, { { Rn | Indirect, Rn | Indirect, Rn }, + { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, + { "q_mpyf3_stf", 3,2,0xDE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "q_mpyf3_subf3",3,3,0x84000000, { { Rn | Indirect, Rn | Indirect, Rn }, + { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, + { "q_mpyi3_addi3",3,3,0x88000000, { { Rn | Indirect, Rn | Indirect, Rn }, + { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, + { "q_mpyi3_sti", 3,2,0xE0000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "q_mpyi3_subi3",3,3,0x8C000000, { { Rn | Indirect, Rn | Indirect, Rn }, + { Rn | Indirect, Rn | Indirect, Rn } }, OO_PField }, + { "q_negf_stf", 2,2,0xE2000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_negi_sti", 2,2,0xE4000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_not_sti", 2,2,0xE6000000, { { Indirect, Rn, 0 }, { Rn, Indirect, 0 } }, + OO_4op1 }, + { "q_or3_sti", 3,2,0xE8000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "q_stf_stf", 2,2,0xC0000000, { { Rn, Indirect, 0 }, { Rn, Indirect, 0 } }, + OO_4op3 }, + { "q_sti_sti", 2,2,0xC2000000, { { Rn, Indirect, 0 }, { Rn, Indirect, 0 } }, + OO_4op3 }, + { "q_subf3_stf", 3,2,0xEA000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, + OO_5op2 }, + { "q_subi3_sti", 3,2,0xEC000000, { { Rn, Indirect, Rn }, { Rn, Indirect, 0 } }, + OO_5op2 }, + { "q_xor3_sti", 3,2,0xEE000000, { { Indirect, Rn, Rn }, { Rn, Indirect, 0 } }, + OO_5op1 }, + { "", 0,0,0x00000000, { { 0, 0, 0 }, { 0, 0, 0 } }, 0 } +}; + +static const partemplate *const tic30_paroptab_end = + tic30_paroptab + sizeof(tic30_paroptab)/sizeof(tic30_paroptab[0]); + +#endif diff --git a/include/opcode/tic4x.h b/include/opcode/tic4x.h new file mode 100644 index 0000000..6f16fcb --- /dev/null +++ b/include/opcode/tic4x.h @@ -0,0 +1,1079 @@ +/* Table of opcodes for the Texas Instruments TMS320C[34]X family. + + Copyright (C) 2002, 2003, 2010 Free Software Foundation. + + Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz) + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#define IS_CPU_TIC3X(v) ((v) == 30 || (v) == 31 || (v) == 32 || (v) == 33) +#define IS_CPU_TIC4X(v) ((v) == 0 || (v) == 40 || (v) == 44) + +/* Define some bitfield extraction/insertion macros. */ +#define EXTR(inst, m, l) ((inst) << (31 - (m)) >> (31 - ((m) - (l)))) +#define EXTRU(inst, m, l) EXTR ((unsigned long)(inst), (m), (l)) +#define EXTRS(inst, m, l) EXTR ((long)(inst), (m), (l)) +#define INSERTU(inst, val, m, l) (inst |= ((val) << (l))) +#define INSERTS(inst, val, m, l) INSERTU (inst, ((val) & ((1 << ((m) - (l) + 1)) - 1)), m, l) + +/* Define register numbers. */ +typedef enum + { + REG_R0, REG_R1, REG_R2, REG_R3, + REG_R4, REG_R5, REG_R6, REG_R7, + REG_AR0, REG_AR1, REG_AR2, REG_AR3, + REG_AR4, REG_AR5, REG_AR6, REG_AR7, + REG_DP, REG_IR0, REG_IR1, REG_BK, + REG_SP, REG_ST, REG_DIE, REG_IIE, + REG_IIF, REG_RS, REG_RE, REG_RC, + REG_R8, REG_R9, REG_R10, REG_R11, + REG_IVTP, REG_TVTP + } +c4x_reg_t; + +/* Note that the actual register numbers for IVTP is 0 and TVTP is 1. */ + +#define REG_IE REG_DIE /* C3x only */ +#define REG_IF REG_IIE /* C3x only */ +#define REG_IOF REG_IIF /* C3x only */ + +#define TIC3X_REG_MAX REG_RC +#define TIC4X_REG_MAX REG_TVTP + +/* Register table size including C4x expansion regs. */ +#define REG_TABLE_SIZE (TIC4X_REG_MAX + 1) + +struct tic4x_register +{ + char * name; + unsigned long regno; +}; + +typedef struct tic4x_register tic4x_register_t; + +/* We could store register synonyms here. */ +static const tic4x_register_t tic3x_registers[] = +{ + {"f0", REG_R0}, + {"r0", REG_R0}, + {"f1", REG_R1}, + {"r1", REG_R1}, + {"f2", REG_R2}, + {"r2", REG_R2}, + {"f3", REG_R3}, + {"r3", REG_R3}, + {"f4", REG_R4}, + {"r4", REG_R4}, + {"f5", REG_R5}, + {"r5", REG_R5}, + {"f6", REG_R6}, + {"r6", REG_R6}, + {"f7", REG_R7}, + {"r7", REG_R7}, + {"ar0", REG_AR0}, + {"ar1", REG_AR1}, + {"ar2", REG_AR2}, + {"ar3", REG_AR3}, + {"ar4", REG_AR4}, + {"ar5", REG_AR5}, + {"ar6", REG_AR6}, + {"ar7", REG_AR7}, + {"dp", REG_DP}, + {"ir0", REG_IR0}, + {"ir1", REG_IR1}, + {"bk", REG_BK}, + {"sp", REG_SP}, + {"st", REG_ST}, + {"ie", REG_IE}, + {"if", REG_IF}, + {"iof", REG_IOF}, + {"rs", REG_RS}, + {"re", REG_RE}, + {"rc", REG_RC}, + {"", 0} +}; + +const unsigned int tic3x_num_registers = (((sizeof tic3x_registers) / (sizeof tic3x_registers[0])) - 1); + +/* Define C4x registers in addition to C3x registers. */ +static const tic4x_register_t tic4x_registers[] = +{ + {"die", REG_DIE}, /* Clobbers C3x REG_IE */ + {"iie", REG_IIE}, /* Clobbers C3x REG_IF */ + {"iif", REG_IIF}, /* Clobbers C3x REG_IOF */ + {"f8", REG_R8}, + {"r8", REG_R8}, + {"f9", REG_R9}, + {"r9", REG_R9}, + {"f10", REG_R10}, + {"r10", REG_R10}, + {"f11", REG_R11}, + {"r11", REG_R11}, + {"ivtp", REG_IVTP}, + {"tvtp", REG_TVTP}, + {"", 0} +}; + +const unsigned int tic4x_num_registers = (((sizeof tic4x_registers) / (sizeof tic4x_registers[0])) - 1); + +struct tic4x_cond +{ + char * name; + unsigned long cond; +}; + +typedef struct tic4x_cond tic4x_cond_t; + +/* Define conditional branch/load suffixes. Put desired form for + disassembler last. */ +static const tic4x_cond_t tic4x_conds[] = +{ + { "u", 0x00 }, + { "c", 0x01 }, { "lo", 0x01 }, + { "ls", 0x02 }, + { "hi", 0x03 }, + { "nc", 0x04 }, { "hs", 0x04 }, + { "z", 0x05 }, { "eq", 0x05 }, + { "nz", 0x06 }, { "ne", 0x06 }, + { "n", 0x07 }, { "l", 0x07 }, { "lt", 0x07 }, + { "le", 0x08 }, + { "p", 0x09 }, { "gt", 0x09 }, + { "nn", 0x0a }, { "ge", 0x0a }, + { "nv", 0x0c }, + { "v", 0x0d }, + { "nuf", 0x0e }, + { "uf", 0x0f }, + { "nlv", 0x10 }, + { "lv", 0x11 }, + { "nluf", 0x12 }, + { "luf", 0x13 }, + { "zuf", 0x14 }, + /* Dummy entry, not included in num_conds. This + lets code examine entry i+1 without checking + if we've run off the end of the table. */ + { "", 0x0} +}; + +const unsigned int tic4x_num_conds = (((sizeof tic4x_conds) / (sizeof tic4x_conds[0])) - 1); + +struct tic4x_indirect +{ + char * name; + unsigned long modn; +}; + +typedef struct tic4x_indirect tic4x_indirect_t; + +/* Define indirect addressing modes where: + d displacement (signed) + y ir0 + z ir1 */ + +static const tic4x_indirect_t tic4x_indirects[] = +{ + { "*+a(d)", 0x00 }, + { "*-a(d)", 0x01 }, + { "*++a(d)", 0x02 }, + { "*--a(d)", 0x03 }, + { "*a++(d)", 0x04 }, + { "*a--(d)", 0x05 }, + { "*a++(d)%", 0x06 }, + { "*a--(d)%", 0x07 }, + { "*+a(y)", 0x08 }, + { "*-a(y)", 0x09 }, + { "*++a(y)", 0x0a }, + { "*--a(y)", 0x0b }, + { "*a++(y)", 0x0c }, + { "*a--(y)", 0x0d }, + { "*a++(y)%", 0x0e }, + { "*a--(y)%", 0x0f }, + { "*+a(z)", 0x10 }, + { "*-a(z)", 0x11 }, + { "*++a(z)", 0x12 }, + { "*--a(z)", 0x13 }, + { "*a++(z)", 0x14 }, + { "*a--(z)", 0x15 }, + { "*a++(z)%", 0x16 }, + { "*a--(z)%", 0x17 }, + { "*a", 0x18 }, + { "*a++(y)b", 0x19 }, + /* Dummy entry, not included in num_indirects. This + lets code examine entry i+1 without checking + if we've run off the end of the table. */ + { "", 0x0} +}; + +#define TIC3X_MODN_MAX 0x19 + +const unsigned int tic4x_num_indirects = (((sizeof tic4x_indirects) / (sizeof tic4x_indirects[0])) - 1); + +/* Instruction template. */ +struct tic4x_inst +{ + char * name; + unsigned long opcode; + unsigned long opmask; + char * args; + unsigned long oplevel; +}; + +typedef struct tic4x_inst tic4x_inst_t; + +/* Opcode infix + B condition 16--20 U,C,Z,LO,HI, etc. + C condition 23--27 U,C,Z,LO,HI, etc. + + Arguments + , required arg follows + ; optional arg follows + + Argument types bits [classes] - example + ----------------------------------------------------------- + * indirect (all) 0--15 [A,AB,AU,AF,A2,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - *+AR0(5), *++AR0(IR0) + # direct (for LDP) 0--15 [Z] - @start, start + @ direct 0--15 [A,AB,AU,AF,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - @start, start + A address register 22--24 [D] - AR0, AR7 + B unsigned integer 0--23 [I,I2] - @start, start (absolute on C3x, relative on C4x) + C indirect (disp - C4x) 0--7 [S,SC,S2,T,TC,T2,T2C] - *+AR0(5) + E register (all) 0--7 [T,TC,T2,T2C] - R0, R7, R11, AR0, DP + e register (0-11) 0--7 [S,SC,S2] - R0, R7, R11 + F short float immediate 0--15 [AF,B,BA,BB] - 3.5, 0e-3.5e-1 + G register (all) 8--15 [T,TC,T2,T2C] - R0, R7, R11, AR0, DP + g register (0-11) 0--7 [S,SC,S2] - R0, R7, R11 + H register (0-7) 18--16 [LS,M,P,Q] - R0, R7 + I indirect (no disp) 0--7 [S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0) + i indirect (enhanced) 0--7 [LL,LS,M,P,Q,QC] - *+AR0(1), R5 + J indirect (no disp) 8--15 [LL,LS,P,Q,QC,S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0) + j indirect (enhanced) 8--15 [M] - *+AR0(1), R5 + K register 19--21 [LL,M,Q,QC] - R0, R7 + L register 22--24 [LL,LS,P,Q,QC] - R0, R7 + M register (R2,R3) 22--22 [M] R2, R3 + N register (R0,R1) 23--23 [M] R0, R1 + O indirect(disp - C4x) 8--15 [S,SC,S2,T,TC,T2] - *+AR0(5) + P displacement (PC Rel) 0--15 [D,J,JS] - @start, start + Q register (all) 0--15 [A,AB,AU,A2,A3,AY,BA,BI,D,I2,J,JS] - R0, AR0, DP, SP + q register (0-11) 0--15 [AF,B,BB] - R0, R7, R11 + R register (all) 16--20 [A,AB,AU,AF,A6,A7,R,T,TC] - R0, AR0, DP, SP + r register (0-11) 16--20 [B,BA,BB,BI,B6,B7,RF,S,SC] - R0, R1, R11 + S short int immediate 0--15 [A,AB,AY,BI] - -5, 5 + T integer (C4x) 16--20 [Z] - -5, 12 + U unsigned integer 0--15 [AU,A3] - 0, 65535 + V vector (C4x: 0--8) 0--4 [Z] - 25, 7 + W short int (C4x) 0--7 [T,TC,T2,T2C] - -3, 5 + X expansion reg (C4x) 0--4 [Z] - IVTP, TVTP + Y address reg (C4x) 16--20 [Z] - AR0, DP, SP, IR0 + Z expansion reg (C4x) 16--20 [Z] - IVTP, TVTP +*/ + +#define TIC4X_OPERANDS_MAX 7 /* Max number of operands for an inst. */ +#define TIC4X_NAME_MAX 16 /* Max number of chars in parallel name. */ + +/* Define the instruction level */ +#define OP_C3X 0x1 /* C30 support - supported by all */ +#define OP_C4X 0x2 /* C40 support - C40, C44 */ +#define OP_ENH 0x4 /* Class LL,LS,M,P,Q,QC enhancements. Argument type + I and J is enhanced in these classes - C31>=6.0, + C32>=2.0, C33 */ +#define OP_LPWR 0x8 /* Low power support (LOPOWER, MAXSPEED) - C30>=7.0, + LC31, C31>=5.0, C32 */ +#define OP_IDLE2 0x10 /* Idle2 support (IDLE2) - C30>=7.0, LC31, C31>=5.0, + C32, C33, C40>=5.0, C44 */ + +/* The following class definition is a classification scheme for + putting instructions with similar type of arguments together. It + simplifies the op-code definitions significantly, as we then only + need to use the class macroes for 95% of the DSP's opcodes. +*/ + +/* A: General 2-operand integer operations + Syntax: src, dst + src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) + dst = Register (R) + Instr: 15/8 - ABSI, ADDC, ADDI, ASH, CMPI, LDI, LSH, MPYI, NEGB, NEGI, + SUBB, SUBC, SUBI, SUBRB, SUBRI, C4x: LBn, LHn, LWLn, LWRn, + MBn, MHn, MPYSHI, MPYUHI +*/ +#define A_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \ + { name, opcode|0x00600000, 0xffe00000, "S,R", level } + +/* AB: General 2-operand integer operation with condition + Syntax: c src, dst + c = Condition + src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) + dst = Register (R) + Instr: 1/0 - LDIc +*/ +#define AB_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x40000000, 0xf0600000, "Q;R", level }, \ + { name, opcode|0x40200000, 0xf0600000, "@,R", level }, \ + { name, opcode|0x40400000, 0xf0600000, "*,R", level }, \ + { name, opcode|0x40600000, 0xf0600000, "S,R", level } + +/* AU: General 2-operand unsigned integer operation + Syntax: src, dst + src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U) + dst = Register (R) + Instr: 6/2 - AND, ANDN, NOT, OR, TSTB, XOR, C4x: LBUn, LHUn +*/ +#define AU_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \ + { name, opcode|0x00600000, 0xffe00000, "U,R", level } + +/* AF: General 2-operand float to integer operation + Syntax: src, dst + src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F) + dst = Register (R) + Instr: 1/0 - FIX +*/ +#define AF_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "q;R", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \ + { name, opcode|0x00600000, 0xffe00000, "F,R", level } + +/* A2: Limited 1-operand (integer) operation + Syntax: src + src = Register (Q), Indirect (*), None + Instr: 1/0 - NOP +*/ +#define A2_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "Q", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*", level }, \ + { name, opcode|0x00000000, 0xffe00000, "" , level } + +/* A3: General 1-operand unsigned integer operation + Syntax: src + src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U) + Instr: 1/0 - RPTS +*/ +#define A3_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffff0000, "Q", level }, \ + { name, opcode|0x00200000, 0xffff0000, "@", level }, \ + { name, opcode|0x00400000, 0xffff0000, "*", level }, \ + { name, opcode|0x00600000, 0xffff0000, "U", level } + +/* A6: Limited 2-operand integer operation + Syntax: src, dst + src = Direct (@), Indirect (*) + dst = Register (R) + Instr: 1/1 - LDII, C4x: SIGI +*/ +#define A6_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,R", level } + +/* A7: Limited 2-operand integer store operation + Syntax: src, dst + src = Register (R) + dst = Direct (@), Indirect (*) + Instr: 2/0 - STI, STII +*/ +#define A7_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00200000, 0xffe00000, "R,@", level }, \ + { name, opcode|0x00400000, 0xffe00000, "R,*", level } + +/* AY: General 2-operand signed address load operation + Syntax: src, dst + src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) + dst = Address register - ARx, IRx, DP, BK, SP (Y) + Instr: 0/1 - C4x: LDA + Note: Q and Y should *never* be the same register +*/ +#define AY_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "Q,Y", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,Y", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,Y", level }, \ + { name, opcode|0x00600000, 0xffe00000, "S,Y", level } + +/* B: General 2-operand float operation + Syntax: src, dst + src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F) + dst = Register 0-11 (r) + Instr: 12/2 - ABSF, ADDF, CMPF, LDE, LDF, LDM, MPYF, NEGF, NORM, RND, + SUBF, SUBRF, C4x: RSQRF, TOIEEE +*/ +#define B_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "q;r", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \ + { name, opcode|0x00600000, 0xffe00000, "F,r", level } + +/* BA: General 2-operand integer to float operation + Syntax: src, dst + src = Register (Q), Direct (@), Indirect (*), Float immediate (F) + dst = Register 0-11 (r) + Instr: 0/1 - C4x: CRCPF +*/ +#define BA_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \ + { name, opcode|0x00600000, 0xffe00000, "F,r", level } + +/* BB: General 2-operand conditional float operation + Syntax: c src, dst + c = Condition + src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F) + dst = Register 0-11 (r) + Instr: 1/0 - LDFc +*/ +#define BB_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x40000000, 0xf0600000, "q;r", level }, \ + { name, opcode|0x40200000, 0xf0600000, "@,r", level }, \ + { name, opcode|0x40400000, 0xf0600000, "*,r", level }, \ + { name, opcode|0x40600000, 0xf0600000, "F,r", level } + +/* BI: General 2-operand integer to float operation (yet different to BA) + Syntax: src, dst + src = Register (Q), Direct (@), Indirect (*), Signed immediate (S) + dst = Register 0-11 (r) + Instr: 1/0 - FLOAT +*/ +#define BI_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \ + { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \ + { name, opcode|0x00600000, 0xffe00000, "S,r", level } + +/* B6: Limited 2-operand float operation + Syntax: src, dst + src = Direct (@), Indirect (*) + dst = Register 0-11 (r) + Instr: 1/1 - LDFI, C4x: FRIEEE +*/ +#define B6_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \ + { name, opcode|0x00400000, 0xffe00000, "*,r", level } + +/* B7: Limited 2-operand float store operation + Syntax: src, dst + src = Register 0-11 (r) + dst = Direct (@), Indirect (*) + Instr: 2/0 - STF, STFI +*/ +#define B7_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x00200000, 0xffe00000, "r,@", level }, \ + { name, opcode|0x00400000, 0xffe00000, "r,*", level } + +/* D: Decrement and brach operations + Syntax: c ARn, dst + c = condition + ARn = AR register 0-7 (A) + dst = Register (Q), PC-relative (P) + Instr: 2/0 - DBc, DBcD + Alias: +*/ +#define D_CLASS_INSN(name1, name2, opcode, level) \ + { name1, opcode|0x00000000, 0xfe200000, "A,Q", level }, \ + { name1, opcode|0x02000000, 0xfe200000, "A,P", level }, \ + { name2, opcode|0x00000000, 0xfe200000, "A,Q", level }, \ + { name2, opcode|0x02000000, 0xfe200000, "A,P", level } + +/* I: General branch operations + Syntax: dst + dst = Address (B) + Instr: 3/1 - BR, BRD, CALL, C4x: LAJ +*/ + +/* I2: General branch operations (C4x addition) + Syntax: dst + dst = Address (B), C4x: Register (Q) + Instr: 2/0 - RPTB, RPTBD +*/ + +/* J: General conditional branch operations + Syntax: c dst + c = Condition + dst = Register (Q), PC-relative (P) + Instr: 2/3 - Bc, BcD, C4x: BcAF, BcAT, LAJc + Alias: +*/ +#define J_CLASS_INSN(name1, name2, opcode, level) \ + { name1, opcode|0x00000000, 0xffe00000, "Q", level }, \ + { name1, opcode|0x02000000, 0xffe00000, "P", level }, \ + { name2, opcode|0x00000000, 0xffe00000, "Q", level }, \ + { name2, opcode|0x02000000, 0xffe00000, "P", level } + +/* JS: General conditional branch operations + Syntax: c dst + c = Condition + dst = Register (Q), PC-relative (P) + Instr: 1/1 - CALLc, C4X: LAJc +*/ + +/* LL: Load-load parallell operation + Syntax: src2, dst2 || src1, dst1 + src1 = Indirect 0,1,IR0,IR1 (J) + dst1 = Register 0-7 (K) + src2 = Indirect 0,1,IR0,IR1, ENH: Register (i) + dst2 = Register 0-7 (L) + Instr: 2/0 - LDF||LDF, LDI||LDI + Alias: i||i, i1||i2, i2||i1 +*/ +#define LL_CLASS_INSN(name, opcode, level) \ + { name "_" name , opcode, 0xfe000000, "i;L|J,K", level }, \ + { name "2_" name "1", opcode, 0xfe000000, "i;L|J,K", level }, \ + { name "1_" name "2", opcode, 0xfe000000, "J,K|i;L", level } + +/* LS: Store-store parallell operation + Syntax: src2, dst2 || src1, dst1 + src1 = Register 0-7 (H) + dst1 = Indirect 0,1,IR0,IR1 (J) + src2 = Register 0-7 (L) + dst2 = Indirect 0,1,IR0,IR1, ENH: register (i) + Instr: 2/0 - STF||STF, STI||STI + Alias: i||i, i1||i2, i2||i1. +*/ +#define LS_CLASS_INSN(name, opcode, level) \ + { name "_" name , opcode, 0xfe000000, "L;i|H,J", level }, \ + { name "2_" name "1", opcode, 0xfe000000, "L;i|H,J", level }, \ + { name "1_" name "2", opcode, 0xfe000000, "H,J|L;i", level } + +/* M: General multiply and add/sub operations + Syntax: src3,src4,dst1 || src2,src1,dst2 [00] - Manual + src3,src1,dst1 || src2,src4,dst2 [01] - Manual + src1,src3,dst1 || src2,src4,dst2 [01] + src1,src2,dst1 || src4,src3,dst2 [02] - Manual + src3,src1,dst1 || src4,src2,dst2 [03] - Manual + src1,src3,dst1 || src4,src2,dst2 [03] + src1 = Register 0-7 (K) + src2 = Register 0-7 (H) + src3 = Indirect 0,1,IR0,IR1, ENH: register (j) + src4 = Indirect 0,1,IR0,IR1, ENH: register (i) + dst1 = Register 0-1 (N) + dst2 = Register 2-3 (M) + Instr: 4/0 - MPYF3||ADDF3, MPYF3||SUBF3, MPYI3||ADDI3, MPYI3||SUBI3 + Alias: a||b, a3||n, a||b3, a3||b3, b||a, b3||a, b||a3, b3||a3 +*/ +#define M_CLASS_INSN(namea, nameb, opcode, level) \ + { namea "_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ + { namea "_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ + { namea "_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ + { namea "_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ + { namea "_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ + { namea "_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ + { namea "3_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ + { namea "3_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ + { namea "3_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ + { namea "3_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ + { namea "3_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ + { namea "3_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ + { namea "_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ + { namea "_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ + { namea "_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ + { namea "_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ + { namea "_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ + { namea "_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ + { namea "3_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \ + { namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \ + { namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \ + { namea "3_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \ + { namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \ + { namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \ + { nameb "_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ + { nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ + { nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ + { nameb "_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ + { nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ + { nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \ + { nameb "3_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ + { nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ + { nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ + { nameb "3_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ + { nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ + { nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \ + { nameb "_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ + { nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ + { nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ + { nameb "_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ + { nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ + { nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \ + { nameb "3_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \ + { nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \ + { nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \ + { nameb "3_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \ + { nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \ + { nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level } + +/* P: General 2-operand operation with parallell store + Syntax: src2, dst1 || src3, dst2 + src2 = Indirect 0,1,IR0,IR1, ENH: register (i) + dst1 = Register 0-7 (L) + src3 = Register 0-7 (H) + dst2 = Indirect 0,1,IR0,IR1 (J) + Instr: 9/2 - ABSF||STF, ABSI||STI, FIX||STI, FLOAT||STF, LDF||STF, + LDI||STI, NEGF||STF, NEGI||STI, NOT||STI, C4x: FRIEEE||STF, + TOIEEE||STF + Alias: a||b, b||a +*/ +#define P_CLASS_INSN(namea, nameb, opcode, level) \ + { namea "_" nameb, opcode, 0xfe000000, "i;L|H,J", level }, \ + { nameb "_" namea, opcode, 0xfe000000, "H,J|i;L", level } + +/* Q: General 3-operand operation with parallell store + Syntax: src1, src2, dst1 || src3, dst2 + src1 = Register 0-7 (K) + src2 = Indirect 0,1,IR0,IR1, ENH: register (i) + dst1 = Register 0-7 (L) + src3 = Register 0-7 (H) + dst2 = Indirect 0,1,IR0,IR1 (J) + Instr: 4/0 - ASH3||STI, LSH3||STI, SUBF3||STF, SUBI3||STI + Alias: a||b, b||a, a3||b, b||a3 +*/ +#define Q_CLASS_INSN(namea, nameb, opcode, level) \ + { namea "_" nameb , opcode, 0xfe000000, "K,i;L|H,J", level }, \ + { nameb "_" namea , opcode, 0xfe000000, "H,J|K,i;L", level }, \ + { namea "3_" nameb , opcode, 0xfe000000, "K,i;L|H,J", level }, \ + { nameb "_" namea "3", opcode, 0xfe000000, "H,J|K,i;L", level } + +/* QC: General commutative 3-operand operation with parallell store + Syntax: src2, src1, dst1 || src3, dst2 + src1, src2, dst1 || src3, dst2 - Manual + src1 = Register 0-7 (K) + src2 = Indirect 0,1,IR0,IR1, ENH: register (i) + dst1 = Register 0-7 (L) + src3 = Register 0-7 (H) + dst2 = Indirect 0,1,IR0,IR1 (J) + Instr: 7/0 - ADDF3||STF, ADDI3||STI, AND3||STI, MPYF3||STF, MPYI3||STI, + OR3||STI, XOR3||STI + Alias: a||b, b||a, a3||b, b||a3 +*/ +#define QC_CLASS_INSN(namea, nameb, opcode, level) \ + { namea "_" nameb , opcode, 0xfe000000, "i;K;L|H,J", level }, \ + { namea "_" nameb , opcode, 0xfe000000, "K;i;L|H,J", level }, \ + { nameb "_" namea , opcode, 0xfe000000, "H,J|i;K;L", level }, \ + { nameb "_" namea , opcode, 0xfe000000, "H,J|K;i;L", level }, \ + { namea "3_" nameb , opcode, 0xfe000000, "i;K;L|H,J", level }, \ + { namea "3_" nameb , opcode, 0xfe000000, "K;i;L|H,J", level }, \ + { nameb "_" namea "3", opcode, 0xfe000000, "H,J|i;K;L", level }, \ + { nameb "_" namea "3", opcode, 0xfe000000, "H,J|K;i;L", level } + +/* R: General register integer operation + Syntax: dst + dst = Register (R) + Instr: 6/0 - POP, PUSH, ROL, ROLC, ROR, RORC +*/ +#define R_CLASS_INSN(name, opcode, level) \ + { name, opcode, 0xffe0ffff, "R", level } + +/* RF: General register float operation + Syntax: dst + dst = Register 0-11 (r) + Instr: 2/0 - POPF, PUSHF +*/ +#define RF_CLASS_INSN(name, opcode, level) \ + { name, opcode, 0xffe0ffff, "r", level } + +/* S: General 3-operand float operation + Syntax: src2, src1, dst + src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C) + src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) + dst = Register 0-11 (r) + Instr: 1/0 - SUBF3 + Alias: i, i3 +*/ +#define S_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ + { name, opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ + { name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X } + +/* SC: General commutative 3-operand float operation + Syntax: src2, src1, dst - Manual + src1, src2, dst + src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C) + src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) + dst = Register 0-11 (r) + Instr: 2/0 - ADDF3, MPYF3 + Alias: i, i3 +*/ +#define SC_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ + { name, opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ + { name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level }, \ + { name "3", opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X } + +/* S2: General 3-operand float operation with 2 args + Syntax: src2, src1 + src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C) + src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) + Instr: 1/0 - CMPF3 + Alias: i, i3 +*/ +#define S2_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "e,g", level }, \ + { name, opcode|0x20200000, 0xffe00000, "e,J", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,g", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J", level }, \ + { name, opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "e,g", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "e,J", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,g", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X } + +/* T: General 3-operand integer operand + Syntax: src2, src1, dst + src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) + src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) + dst = Register (R) + Instr: 5/0 - ANDN3, ASH3, LSH3, SUBB3, SUBI3 + Alias: i, i3 +*/ +#define T_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ + { name, opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ + { name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ + { name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ + { name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ + { name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X } + +/* TC: General commutative 3-operand integer operation + Syntax: src2, src1, dst + src1, src2, dst + src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) + src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) + dst = Register (R) + Instr: 6/2 - ADDC3, ADDI3, AND3, MPYI3, OR3, XOR3, C4x: MPYSHI, MPYUHI + Alias: i, i3 +*/ +#define TC_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ + { name, opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ + { name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ + { name, opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \ + { name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ + { name, opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level }, \ + { name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \ + { name "3", opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \ + { name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \ + { name "3", opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X } + +/* T2: General 3-operand integer operation with 2 args + Syntax: src2, src1 + src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) + src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O) + Instr: 1/0 - CMPI3 + Alias: i, i3 +*/ +#define T2_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "E,G", level }, \ + { name, opcode|0x20200000, 0xffe00000, "E,J", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,G", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J", level }, \ + { name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ + { name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "E,G", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "E,J", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,G", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \ + { name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ + { name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X } + +/* T2C: General commutative 3-operand integer operation with 2 args + Syntax: src2, src1 - Manual + src1, src2 + src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W) + src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (0) + Instr: 1/0 - TSTB3 + Alias: i, i3 +*/ +#define T2C_CLASS_INSN(name, opcode, level) \ + { name, opcode|0x20000000, 0xffe00000, "E,G", level }, \ + { name, opcode|0x20200000, 0xffe00000, "E,J", level }, \ + { name, opcode|0x20400000, 0xffe00000, "I,G", level }, \ + { name, opcode|0x20600000, 0xffe00000, "I,J", level }, \ + { name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ + { name, opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ + { name, opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \ + { name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ + { name, opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \ + { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \ + { name "3", opcode|0x20000000, 0xffe00000, "E,G", level }, \ + { name "3", opcode|0x20200000, 0xffe00000, "E,J", level }, \ + { name "3", opcode|0x20400000, 0xffe00000, "I,G", level }, \ + { name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \ + { name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \ + { name "3", opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \ + { name "3", opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \ + { name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \ + { name "3", opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \ + { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X } + +/* Z: Misc operations with or without arguments + Syntax: ,... + Instr: 16 - RETIc, RETSc, SIGI(c3X), SWI, IDLE, IDLE2, RETIcD, + TRAPc, LATc, LDEP, LDEHI, LDEPE, LDPK, STIK, LDP, IACK +*/ + + +/* Define tic4x opcodes for assembler and disassembler. */ +static const tic4x_inst_t tic4x_insts[] = +{ + /* Put synonyms after the desired forms in table so that they get + overwritten in the lookup table. The disassembler will thus + print the `proper' mnemonics. Note that the disassembler + only decodes the 11 MSBs, so instructions like ldp @0x500 will + be printed as ldiu 5, dp. Note that with parallel instructions, + the second part is executed before the first part, unless + the sti1||sti2 form is used. We also allow sti2||sti1 + which is equivalent to the default sti||sti form. + */ + B_CLASS_INSN( "absf", 0x00000000, OP_C3X ), + P_CLASS_INSN( "absf", "stf", 0xc8000000, OP_C3X ), + A_CLASS_INSN( "absi", 0x00800000, OP_C3X ), + P_CLASS_INSN( "absi", "sti", 0xca000000, OP_C3X ), + A_CLASS_INSN( "addc", 0x01000000, OP_C3X ), + TC_CLASS_INSN( "addc", 0x00000000, OP_C3X ), + B_CLASS_INSN( "addf", 0x01800000, OP_C3X ), + SC_CLASS_INSN( "addf", 0x00800000, OP_C3X ), + QC_CLASS_INSN( "addf", "stf", 0xcc000000, OP_C3X ), + A_CLASS_INSN( "addi", 0x02000000, OP_C3X ), + TC_CLASS_INSN( "addi", 0x01000000, OP_C3X ), + QC_CLASS_INSN( "addi", "sti", 0xce000000, OP_C3X ), + AU_CLASS_INSN( "and", 0x02800000, OP_C3X ), + TC_CLASS_INSN( "and", 0x01800000, OP_C3X ), + QC_CLASS_INSN( "and", "sti", 0xd0000000, OP_C3X ), + AU_CLASS_INSN( "andn", 0x03000000, OP_C3X ), + T_CLASS_INSN( "andn", 0x02000000, OP_C3X ), + A_CLASS_INSN( "ash", 0x03800000, OP_C3X ), + T_CLASS_INSN( "ash", 0x02800000, OP_C3X ), + Q_CLASS_INSN( "ash", "sti", 0xd2000000, OP_C3X ), + J_CLASS_INSN( "bB", "b", 0x68000000, OP_C3X ), + J_CLASS_INSN( "bBd", "bd", 0x68200000, OP_C3X ), + J_CLASS_INSN( "bBaf", "baf", 0x68a00000, OP_C4X ), + J_CLASS_INSN( "bBat", "bat", 0x68600000, OP_C4X ), + { "br", 0x60000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */ + { "brd", 0x61000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */ + { "call", 0x62000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */ + { "callB", 0x70000000, 0xffe00000, "Q" , OP_C3X }, /* JS_CLASS */ + { "callB", 0x72000000, 0xffe00000, "P" , OP_C3X }, /* JS_CLASS */ + B_CLASS_INSN( "cmpf", 0x04000000, OP_C3X ), + S2_CLASS_INSN( "cmpf", 0x03000000, OP_C3X ), + A_CLASS_INSN( "cmpi", 0x04800000, OP_C3X ), + T2_CLASS_INSN( "cmpi", 0x03800000, OP_C3X ), + D_CLASS_INSN( "dbB", "db", 0x6c000000, OP_C3X ), + D_CLASS_INSN( "dbBd", "dbd", 0x6c200000, OP_C3X ), + AF_CLASS_INSN( "fix", 0x05000000, OP_C3X ), + P_CLASS_INSN( "fix", "sti", 0xd4000000, OP_C3X ), + BI_CLASS_INSN( "float", 0x05800000, OP_C3X ), + P_CLASS_INSN( "float", "stf", 0xd6000000, OP_C3X ), + B6_CLASS_INSN( "frieee", 0x1c000000, OP_C4X ), + P_CLASS_INSN( "frieee","stf", 0xf2000000, OP_C4X ), + { "iack", 0x1b200000, 0xffe00000, "@" , OP_C3X }, /* Z_CLASS */ + { "iack", 0x1b400000, 0xffe00000, "*" , OP_C3X }, /* Z_CLASS */ + { "idle", 0x06000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */ + { "idlez", 0x06000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */ + { "idle2", 0x06000001, 0xffffffff, "" , OP_IDLE2 }, /* Z_CLASS */ + { "laj", 0x63000000, 0xff000000, "B" , OP_C4X }, /* I_CLASS */ + { "lajB", 0x70200000, 0xffe00000, "Q" , OP_C4X }, /* JS_CLASS */ + { "lajB", 0x72200000, 0xffe00000, "P" , OP_C4X }, /* JS_CLASS */ + { "latB", 0x74800000, 0xffe00000, "V" , OP_C4X }, /* Z_CLASS */ + A_CLASS_INSN( "lb0", 0xb0000000, OP_C4X ), + A_CLASS_INSN( "lb1", 0xb0800000, OP_C4X ), + A_CLASS_INSN( "lb2", 0xb1000000, OP_C4X ), + A_CLASS_INSN( "lb3", 0xb1800000, OP_C4X ), + AU_CLASS_INSN( "lbu0", 0xb2000000, OP_C4X ), + AU_CLASS_INSN( "lbu1", 0xb2800000, OP_C4X ), + AU_CLASS_INSN( "lbu2", 0xb3000000, OP_C4X ), + AU_CLASS_INSN( "lbu3", 0xb3800000, OP_C4X ), + AY_CLASS_INSN( "lda", 0x1e800000, OP_C4X ), + B_CLASS_INSN( "lde", 0x06800000, OP_C3X ), + { "ldep", 0x76000000, 0xffe00000, "X,R" , OP_C4X }, /* Z_CLASS */ + B_CLASS_INSN( "ldf", 0x07000000, OP_C3X ), + LL_CLASS_INSN( "ldf", 0xc4000000, OP_C3X ), + P_CLASS_INSN( "ldf", "stf", 0xd8000000, OP_C3X ), + BB_CLASS_INSN( "ldfC", 0x00000000, OP_C3X ), + B6_CLASS_INSN( "ldfi", 0x07800000, OP_C3X ), + { "ldhi", 0x1fe00000, 0xffe00000, "U,R" , OP_C4X }, /* Z_CLASS */ + { "ldhi", 0x1fe00000, 0xffe00000, "#,R" , OP_C4X }, /* Z_CLASS */ + A_CLASS_INSN( "ldi", 0x08000000, OP_C3X ), + LL_CLASS_INSN( "ldi", 0xc6000000, OP_C3X ), + P_CLASS_INSN( "ldi", "sti", 0xda000000, OP_C3X ), + AB_CLASS_INSN( "ldiC", 0x10000000, OP_C3X ), + A6_CLASS_INSN( "ldii", 0x08800000, OP_C3X ), + { "ldp", 0x50700000, 0xffff0000, "#" , OP_C3X }, /* Z_CLASS - synonym for ldiu #,dp */ + B_CLASS_INSN( "ldm", 0x09000000, OP_C3X ), + { "ldpe", 0x76800000, 0xffe00000, "Q,Z" , OP_C4X }, /* Z_CLASS */ + { "ldpk", 0x1F700000, 0xffff0000, "#" , OP_C4X }, /* Z_CLASS */ + A_CLASS_INSN( "lh0", 0xba000000, OP_C4X ), + A_CLASS_INSN( "lh1", 0xba800000, OP_C4X ), + AU_CLASS_INSN( "lhu0", 0xbb000000, OP_C4X ), + AU_CLASS_INSN( "lhu1", 0xbb800000, OP_C4X ), + { "lopower", 0x10800001,0xffffffff, "" , OP_LPWR }, /* Z_CLASS */ + A_CLASS_INSN( "lsh", 0x09800000, OP_C3X ), + T_CLASS_INSN( "lsh", 0x04000000, OP_C3X ), + Q_CLASS_INSN( "lsh", "sti", 0xdc000000, OP_C3X ), + A_CLASS_INSN( "lwl0", 0xb4000000, OP_C4X ), + A_CLASS_INSN( "lwl1", 0xb4800000, OP_C4X ), + A_CLASS_INSN( "lwl2", 0xb5000000, OP_C4X ), + A_CLASS_INSN( "lwl3", 0xb5800000, OP_C4X ), + A_CLASS_INSN( "lwr0", 0xb6000000, OP_C4X ), + A_CLASS_INSN( "lwr1", 0xb6800000, OP_C4X ), + A_CLASS_INSN( "lwr2", 0xb7000000, OP_C4X ), + A_CLASS_INSN( "lwr3", 0xb7800000, OP_C4X ), + { "maxspeed",0x10800000,0xffffffff, "" , OP_LPWR }, /* Z_CLASS */ + A_CLASS_INSN( "mb0", 0xb8000000, OP_C4X ), + A_CLASS_INSN( "mb1", 0xb8800000, OP_C4X ), + A_CLASS_INSN( "mb2", 0xb9000000, OP_C4X ), + A_CLASS_INSN( "mb3", 0xb9800000, OP_C4X ), + A_CLASS_INSN( "mh0", 0xbc000000, OP_C4X ), + A_CLASS_INSN( "mh1", 0xbc800000, OP_C4X ), + A_CLASS_INSN( "mh2", 0xbd000000, OP_C4X ), + A_CLASS_INSN( "mh3", 0xbd800000, OP_C4X ), + B_CLASS_INSN( "mpyf", 0x0a000000, OP_C3X ), + SC_CLASS_INSN( "mpyf", 0x04800000, OP_C3X ), + M_CLASS_INSN( "mpyf", "addf", 0x80000000, OP_C3X ), + QC_CLASS_INSN( "mpyf", "stf", 0xde000000, OP_C3X ), + M_CLASS_INSN( "mpyf", "subf", 0x84000000, OP_C3X ), + A_CLASS_INSN( "mpyi", 0x0a800000, OP_C3X ), + TC_CLASS_INSN( "mpyi", 0x05000000, OP_C3X ), + M_CLASS_INSN( "mpyi", "addi", 0x88000000, OP_C3X ), + QC_CLASS_INSN( "mpyi", "sti", 0xe0000000, OP_C3X ), + M_CLASS_INSN( "mpyi", "subi", 0x8c000000, OP_C3X ), + A_CLASS_INSN( "mpyshi", 0x1d800000, OP_C4X ), + TC_CLASS_INSN( "mpyshi", 0x28800000, OP_C4X ), + A_CLASS_INSN( "mpyuhi", 0x1e000000, OP_C4X ), + TC_CLASS_INSN( "mpyuhi", 0x29000000, OP_C4X ), + A_CLASS_INSN( "negb", 0x0b000000, OP_C3X ), + B_CLASS_INSN( "negf", 0x0b800000, OP_C3X ), + P_CLASS_INSN( "negf", "stf", 0xe2000000, OP_C3X ), + A_CLASS_INSN( "negi", 0x0c000000, OP_C3X ), + P_CLASS_INSN( "negi", "sti", 0xe4000000, OP_C3X ), + A2_CLASS_INSN( "nop", 0x0c800000, OP_C3X ), + B_CLASS_INSN( "norm", 0x0d000000, OP_C3X ), + AU_CLASS_INSN( "not", 0x0d800000, OP_C3X ), + P_CLASS_INSN( "not", "sti", 0xe6000000, OP_C3X ), + AU_CLASS_INSN( "or", 0x10000000, OP_C3X ), + TC_CLASS_INSN( "or", 0x05800000, OP_C3X ), + QC_CLASS_INSN( "or", "sti", 0xe8000000, OP_C3X ), + R_CLASS_INSN( "pop", 0x0e200000, OP_C3X ), + RF_CLASS_INSN( "popf", 0x0ea00000, OP_C3X ), + R_CLASS_INSN( "push", 0x0f200000, OP_C3X ), + RF_CLASS_INSN( "pushf", 0x0fa00000, OP_C3X ), + BA_CLASS_INSN( "rcpf", 0x1d000000, OP_C4X ), + { "retiB", 0x78000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */ + { "reti", 0x78000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS - Alias for retiu */ + { "retiBd", 0x78200000, 0xffe00000, "" , OP_C4X }, /* Z_CLASS */ + { "retid", 0x78200000, 0xffe00000, "" , OP_C4X }, /* Z_CLASS - Alias for retiud */ + { "retsB", 0x78800000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */ + { "rets", 0x78800000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS - Alias for retsu */ + B_CLASS_INSN( "rnd", 0x11000000, OP_C3X ), + R_CLASS_INSN( "rol", 0x11e00001, OP_C3X ), + R_CLASS_INSN( "rolc", 0x12600001, OP_C3X ), + R_CLASS_INSN( "ror", 0x12e0ffff, OP_C3X ), + R_CLASS_INSN( "rorc", 0x1360ffff, OP_C3X ), + { "rptb", 0x64000000, 0xff000000, "B" , OP_C3X }, /* I2_CLASS */ + { "rptb", 0x79000000, 0xff000000, "Q" , OP_C4X }, /* I2_CLASS */ + { "rptbd", 0x65000000, 0xff000000, "B" , OP_C4X }, /* I2_CLASS */ + { "rptbd", 0x79800000, 0xff000000, "Q" , OP_C4X }, /* I2_CLASS */ + A3_CLASS_INSN( "rpts", 0x139b0000, OP_C3X ), + B_CLASS_INSN( "rsqrf", 0x1c800000, OP_C4X ), + { "sigi", 0x16000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */ + A6_CLASS_INSN( "sigi", 0x16000000, OP_C4X ), + B7_CLASS_INSN( "stf", 0x14000000, OP_C3X ), + LS_CLASS_INSN( "stf", 0xc0000000, OP_C3X ), + B7_CLASS_INSN( "stfi", 0x14800000, OP_C3X ), + A7_CLASS_INSN( "sti", 0x15000000, OP_C3X ), + { "sti", 0x15000000, 0xffe00000, "T,@" , OP_C4X }, /* Class A7 - Alias for stik */ + { "sti", 0x15600000, 0xffe00000, "T,*" , OP_C4X }, /* Class A7 */ + LS_CLASS_INSN( "sti", 0xc2000000, OP_C3X ), + A7_CLASS_INSN( "stii", 0x15800000, OP_C3X ), + { "stik", 0x15000000, 0xffe00000, "T,@" , OP_C4X }, /* Z_CLASS */ + { "stik", 0x15600000, 0xffe00000, "T,*" , OP_C4X }, /* Z_CLASS */ + A_CLASS_INSN( "subb", 0x16800000, OP_C3X ), + T_CLASS_INSN( "subb", 0x06000000, OP_C3X ), + A_CLASS_INSN( "subc", 0x17000000, OP_C3X ), + B_CLASS_INSN( "subf", 0x17800000, OP_C3X ), + S_CLASS_INSN( "subf", 0x06800000, OP_C3X ), + Q_CLASS_INSN( "subf", "stf", 0xea000000, OP_C3X ), + A_CLASS_INSN( "subi", 0x18000000, OP_C3X ), + T_CLASS_INSN( "subi", 0x07000000, OP_C3X ), + Q_CLASS_INSN( "subi", "sti", 0xec000000, OP_C3X ), + A_CLASS_INSN( "subrb", 0x18800000, OP_C3X ), + B_CLASS_INSN( "subrf", 0x19000000, OP_C3X ), + A_CLASS_INSN( "subri", 0x19800000, OP_C3X ), + { "swi", 0x66000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */ + B_CLASS_INSN( "toieee", 0x1b800000, OP_C4X ), + P_CLASS_INSN( "toieee","stf", 0xf0000000, OP_C4X ), + { "trapB", 0x74000000, 0xffe00000, "V" , OP_C3X }, /* Z_CLASS */ + { "trap", 0x74000000, 0xffe00000, "V" , OP_C3X }, /* Z_CLASS - Alias for trapu */ + AU_CLASS_INSN( "tstb", 0x1a000000, OP_C3X ), + T2C_CLASS_INSN("tstb", 0x07800000, OP_C3X ), + AU_CLASS_INSN( "xor", 0x1a800000, OP_C3X ), + TC_CLASS_INSN( "xor", 0x08000000, OP_C3X ), + QC_CLASS_INSN( "xor", "sti", 0xee000000, OP_C3X ), + + /* Dummy entry, not included in tic4x_num_insts. This + lets code examine entry i + 1 without checking + if we've run off the end of the table. */ + { "", 0x0, 0x00, "", 0 } +}; + +const unsigned int tic4x_num_insts = (((sizeof tic4x_insts) / (sizeof tic4x_insts[0])) - 1); diff --git a/include/opcode/tic54x.h b/include/opcode/tic54x.h new file mode 100644 index 0000000..f468714 --- /dev/null +++ b/include/opcode/tic54x.h @@ -0,0 +1,163 @@ +/* tic54x.h -- Header file for TI TMS320C54X opcode table + Copyright 1999, 2000, 2001, 2005, 2009, 2010 Free Software Foundation, Inc. + Written by Timothy Wall (twall@cygnus.com) + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#ifndef _opcode_tic54x_h_ +#define _opcode_tic54x_h_ + +typedef struct _symbol +{ + const char *name; + unsigned short value; +} symbol; + +enum optype { + OPT = 0x8000, + OP_None = 0x0, + + OP_Xmem, /* AR3 or AR4, indirect */ + OP_Ymem, /* AR3 or AR4, indirect */ + OP_pmad, /* PROG mem, direct */ + OP_dmad, /* DATA mem, direct */ + OP_Smem, + OP_Lmem, /* 32-bit single-addressed (direct/indirect) */ + OP_MMR, + OP_PA, + OP_Sind, + OP_xpmad, + OP_xpmad_ms7, + OP_MMRX, + OP_MMRY, + + OP_SRC1, /* src accumulator in bit 8 */ + OP_SRC, /* src accumulator in bit 9 */ + OP_RND, /* rounded result dst accumulator, opposite of bit 8 */ + OP_DST, /* dst accumulator in bit 8 */ + OP_ARX, /* arX in bits 0-3 */ + OP_SHIFT, /* -16 to 15 (SHIFT), bits 0-4 */ + OP_SHFT, /* 0 to 15 (SHIFT1 in summary), bits 0-3 */ + OP_B, /* ACC B only */ + OP_A, /* ACC A only */ + + OP_lk, /* 16-bit immediate, '#' optional */ + OP_TS, + OP_k8, /* -128 <= k <= 128 */ + OP_16, /* literal "16" */ + OP_BITC, /* 0 to 16 */ + OP_CC, /* condition code */ + OP_CC2, /* 4-bit condition code */ + OP_CC3, /* 2-bit condition code */ + OP_123, /* 1, 2, or 3 */ + OP_031, /* 0-31, numeric */ + OP_k5, /* 0 to 31 */ + OP_k8u, /* 0 to 255 */ + OP_ASM, /* "ASM" */ + OP_T, /* "T" */ + OP_DP, /* "DP" */ + OP_ARP, /* "ARP" */ + OP_k3, /* 0-7 */ + OP_lku, /* 0 to 65535 */ + OP_N, /* 0/1 or ST0/ST1 */ + OP_SBIT, /* status bit or 0-15 */ + OP_12, /* one or two */ + OP_k9, /* 9 bits of data page (DP) address */ + OP_TRN, /* "TRN" */ + +}; + +typedef struct _template +{ + /* The opcode mnemonic */ + const char *name; + unsigned int words; /* insn size in words */ + int minops, maxops; /* min/max operand count */ + /* The significant bits in the opcode. Other bits are zero. + Instructions with more than 16 bits of opcode store the rest in the upper + 16 bits. + */ + unsigned short opcode; +#define INDIRECT(OP) ((OP)&0x80) +#define MOD(OP) (((OP)>>3)&0xF) +#define ARF(OP) ((OP)&0x7) +#define IS_LKADDR(OP) (INDIRECT(OP) && MOD(OP)>=12) +#define SRC(OP) ((OP)&0x200) +#define DST(OP) ((OP)&0x100) +#define SRC1(OP) ((OP)&0x100) +#define SHIFT(OP) (((OP)&0x10)?(((OP)&0x1F)-32):((OP)&0x1F)) +#define SHFT(OP) ((OP)&0xF) +#define ARX(OP) ((OP)&0x7) +#define XMEM(OP) (((OP)&0x00F0)>>4) +#define YMEM(OP) ((OP)&0x000F) +#define XMOD(C) (((C)&0xC)>>2) +#define XARX(C) (((C)&0x3)+2) +#define CC3(OP) (((OP)>>8)&0x3) +#define SBIT(OP) ((OP)&0xF) +#define MMR(OP) ((OP)&0x7F) +#define MMRX(OP) ((((OP)>>4)&0xF)+16) +#define MMRY(OP) (((OP)&0xF)+16) + +#define OPTYPE(X) ((X)&~OPT) + + /* Ones in this mask indicate which bits must match the opcode field. + Zeroes indicate don't care bits (operands and/or opcode options) */ + unsigned short mask; + + /* An array of operand codes (at most 4 operands) */ +#define MAX_OPERANDS 4 + enum optype operand_types[MAX_OPERANDS]; + + /* Special purpose flags (e.g. branch type, parallel, delay, etc) + */ + unsigned short flags; +#define B_NEXT 0 /* normal execution, next insn is next address */ +#define B_BRANCH 1 /* next insn is in opcode */ +#define B_RET 2 /* next insn is on stack */ +#define B_BACC 3 /* next insn is in acc */ +#define B_REPEAT 4 /* next insn repeats */ +#define FL_BMASK 0x07 + +#define FL_DELAY 0x10 /* instruction uses delay slots */ +#define FL_EXT 0x20 /* instruction takes two words */ +#define FL_FAR 0x40 /* far mode addressing */ +#define FL_LP 0x80 /* LP-only instruction */ +#define FL_NR 0x100 /* no repeat allowed */ +#define FL_SMR 0x200 /* Smem read (for flagging write-only *+ARx */ + +#define FL_PAR 0x400 /* Parallel instruction. */ + + unsigned short opcode2, mask2; /* some insns have an extended opcode */ + + const char* parname; + enum optype paroperand_types[MAX_OPERANDS]; + +} insn_template; + +extern const insn_template tic54x_unknown_opcode; +extern const insn_template tic54x_optab[]; +extern const insn_template tic54x_paroptab[]; +extern const symbol mmregs[], regs[]; +extern const symbol condition_codes[], cc2_codes[], status_bits[]; +extern const symbol cc3_codes[]; +extern const char *misc_symbols[]; +struct disassemble_info; +extern const insn_template* tic54x_get_insn (struct disassemble_info *, + bfd_vma, unsigned short, int *); + +#endif /* _opcode_tic54x_h_ */ diff --git a/include/opcode/tic6x-control-registers.h b/include/opcode/tic6x-control-registers.h new file mode 100644 index 0000000..b438777 --- /dev/null +++ b/include/opcode/tic6x-control-registers.h @@ -0,0 +1,56 @@ +/* TI C6X control register information. + Copyright 2010 + 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Define the CTRL macro before including this file; it takes as + arguments the fields from tic6x_ctrl (defined in tic6x.h). The + control register name is given as an identifier; the isa_variants + field without the leading TIC6X_INSN_; the rw field without the + leading tic6x_rw_. */ + +CTRL(amr, C62X, read_write, 0x0, 0x10) +CTRL(csr, C62X, read_write, 0x1, 0x10) +CTRL(dnum, C64XP, read, 0x11, 0x1f) +CTRL(ecr, C64XP, write, 0x1d, 0x1f) +CTRL(efr, C64XP, read, 0x1d, 0x1f) +CTRL(fadcr, C67X, read_write, 0x12, 0x1f) +CTRL(faucr, C67X, read_write, 0x13, 0x1f) +CTRL(fmcr, C67X, read_write, 0x14, 0x1f) +CTRL(gfpgfr, C64X, read_write, 0x18, 0x1f) +CTRL(gplya, C64XP, read_write, 0x16, 0x1f) +CTRL(gplyb, C64XP, read_write, 0x17, 0x1f) +CTRL(icr, C62X, write, 0x3, 0x10) +CTRL(ier, C62X, read_write, 0x4, 0x10) +CTRL(ierr, C64XP, read_write, 0x1f, 0x1f) +CTRL(ifr, C62X, read, 0x2, 0x1d) +CTRL(ilc, C64XP, read_write, 0xd, 0x1f) +CTRL(irp, C62X, read_write, 0x6, 0x10) +CTRL(isr, C62X, write, 0x2, 0x10) +CTRL(istp, C62X, read_write, 0x5, 0x10) +CTRL(itsr, C64XP, read_write, 0x1b, 0x1f) +CTRL(nrp, C62X, read_write, 0x7, 0x10) +CTRL(ntsr, C64XP, read_write, 0x1c, 0x1f) +CTRL(pce1, C62X, read, 0x10, 0xf) +CTRL(rep, C64XP, read_write, 0xf, 0x1f) +CTRL(rilc, C64XP, read_write, 0xe, 0x1f) +CTRL(ssr, C64XP, read_write, 0x15, 0x1f) +CTRL(tsch, C64XP, read, 0xb, 0x1f) +/* Contrary to Table 3-26 in SPRUFE8, this register is read-write, as + documented in section 2.9.13. */ +CTRL(tscl, C64XP, read_write, 0xa, 0x1f) +CTRL(tsr, C64XP, read_write, 0x1a, 0x1f) diff --git a/include/opcode/tic6x-insn-formats.h b/include/opcode/tic6x-insn-formats.h new file mode 100644 index 0000000..80bc9fa --- /dev/null +++ b/include/opcode/tic6x-insn-formats.h @@ -0,0 +1,616 @@ +/* TI C6X instruction format information. + Copyright 2010-2013 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Define the FMT macro before including this file; it takes a name + and the fields from tic6x_insn_format (defined in tic6x.h). */ + +/* Expansion fields values for 16 bits insn. */ +#define SAT(a) (((a) & 1) << TIC6X_COMPACT_SAT_POS) +#define BR(a) (((a) & 1) << TIC6X_COMPACT_BR_POS) +#define DSZ(a) (((a) & 7) << TIC6X_COMPACT_DSZ_POS) +/* Composite fields for 16 bits insn. */ +#define BFLD(low_pos, width, pos) { (low_pos), (width), (pos) } +#define BFLD1(a) 1, { a } +#define BFLD2(a, b) 2, { a, b } +#define BFLD3(a, b, c) 3, { a, b, c } +#define BFLD4(a, b, c, d) 4, { a, b, c, d } +#define COMPFLD(name, bitfields) { CONCAT2(tic6x_field_,name), bitfields } +/**/ +#define FLD(name, pos, width) { CONCAT2(tic6x_field_,name), BFLD1(BFLD(pos, width, 0)) } +#define CFLDS FLD(p, 0, 1), FLD(creg, 29, 3), FLD(z, 28, 1) +#define CFLDS2(a, b) 5, { CFLDS, a, b } +#define CFLDS3(a, b, c) 6, { CFLDS, a, b, c } +#define CFLDS4(a, b, c, d) 7, { CFLDS, a, b, c, d } +#define CFLDS5(a, b, c, d, e) 8, { CFLDS, a, b, c, d, e } +#define CFLDS6(a, b, c, d, e, f) 9, { CFLDS, a, b, c, d, e, f } +#define CFLDS7(a, b, c, d, e, f, g) 10, { CFLDS, a, b, c, d, e, f, g } +#define CFLDS8(a, b, c, d, e, f, g, h) 11, { CFLDS, a, b, c, d, e, f, g, h } +#define NFLDS FLD(p, 0, 1) +#define NFLDS1(a) 2, { NFLDS, a } +#define NFLDS2(a, b) 3, { NFLDS, a, b } +#define NFLDS3(a, b, c) 4, { NFLDS, a, b, c } +#define NFLDS5(a, b, c, d, e) 6, { NFLDS, a, b, c, d, e } +#define NFLDS6(a, b, c, d, e, f) 7, { NFLDS, a, b, c, d, e, f } +#define NFLDS7(a, b, c, d, e, f, g) 8, { NFLDS, a, b, c, d, e, f, g } +/* 16 bits insn */ +#define FLDS1(a) 1, { a } +#define FLDS2(a, b) 2, { a, b } +#define FLDS3(a, b, c) 3, { a, b, c } +#define FLDS4(a, b, c, d) 4, { a, b, c, d } +#define FLDS5(a, b, c, d, e) 5, { a, b, c, d, e } +#define SFLDS FLD(s, 0, 1) +#define SFLDS1(a) 2, { SFLDS, a } +#define SFLDS2(a, b) 3, { SFLDS, a, b } +#define SFLDS3(a, b, c) 4, { SFLDS, a, b, c } +#define SFLDS4(a, b, c, d) 5, { SFLDS, a, b, c, d } +#define SFLDS5(a, b, c, d, e) 6, { SFLDS, a, b, c, d, e } +#define SFLDS6(a, b, c, d, e, f) 7, { SFLDS, a, b, c, d, e, f } +#define SFLDS7(a, b, c, d, e, f, g) 8, { SFLDS, a, b, c, d, e, f, g } +/**/ + +/* These are in the order from SPRUFE8, appendices C-H. */ + +/* Appendix C 32-bit formats. */ + +FMT(d_1_or_2_src, 32, 0x40, 0x7c, + CFLDS5(FLD(s, 1, 1), FLD(op, 7, 6), FLD(src1, 13, 5), FLD(src2, 18, 5), + FLD(dst, 23, 5))) +FMT(d_ext_1_or_2_src, 32, 0x830, 0xc3c, + CFLDS6(FLD(s, 1, 1), FLD(op, 6, 4), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) +FMT(d_load_store, 32, 0x4, 0xc, + CFLDS8(FLD(s, 1, 1), FLD(op, 4, 3), FLD(y, 7, 1), FLD(r, 8, 1), + FLD(mode, 9, 4), FLD(offsetR, 13, 5), FLD(baseR, 18, 5), + FLD(srcdst, 23, 5))) +/* The nonaligned loads and stores have the formats shown in the + individual instruction descriptions; the appendix is incorrect. */ +FMT(d_load_nonaligned, 32, 0x124, 0x17c, + CFLDS7(FLD(s, 1, 1), FLD(y, 7, 1), FLD(mode, 9, 4), FLD(offsetR, 13, 5), + FLD(baseR, 18, 5), FLD(sc, 23, 1), FLD(dst, 24, 4))) +FMT(d_store_nonaligned, 32, 0x174, 0x17c, + CFLDS7(FLD(s, 1, 1), FLD(y, 7, 1), FLD(mode, 9, 4), FLD(offsetR, 13, 5), + FLD(baseR, 18, 5), FLD(sc, 23, 1), FLD(src, 24, 4))) +FMT(d_load_store_long, 32, 0xc, 0xc, + CFLDS5(FLD(s, 1, 1), FLD(op, 4, 3), FLD(y, 7, 1), FLD(offsetR, 8, 15), + FLD(dst, 23, 5))) +FMT(d_adda_long, 32, 0x1000000c, 0xf000000c, + NFLDS5(FLD(s, 1, 1), FLD(op, 4, 3), FLD(y, 7, 1), FLD(offsetR, 8, 15), + FLD(dst, 23, 5))) + +/* Appendix C 16-bit formats will go here. */ + +/* C-8 */ +FMT(d_doff4_dsz_0xx, 16, DSZ(0) | 0x0004, DSZ(0x4) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_100, 16, DSZ(4) | 0x0004, DSZ(0x7) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_000, 16, DSZ(0) | 0x0004, DSZ(0x7) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_x01, 16, DSZ(1) | 0x0004, DSZ(0x3) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_01x, 16, DSZ(2) | 0x0004, DSZ(0x6) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_111, 16, DSZ(7) | 0x0004, DSZ(0x7) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_x11, 16, DSZ(3) | 0x0004, DSZ(0x3) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_010, 16, DSZ(2) | 0x0004, DSZ(0x7) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) +FMT(d_doff4_dsz_110, 16, DSZ(6) | 0x0004, DSZ(0x7) | 0x0406, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) + +/* C-9 */ +FMT(d_doff4dw, 16, DSZ(4) | 0x0004, DSZ(0x4) | 0x0406, + SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), FLD(sz, 9, 1), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) + +/* C-10 */ +FMT(d_dind_dsz_0xx, 16, DSZ(0) | 0x0404, DSZ(0x4) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_x01, 16, DSZ(1) | 0x0404, DSZ(0x3) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_x11, 16, DSZ(3) | 0x0404, DSZ(0x3) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_01x, 16, DSZ(2) | 0x0404, DSZ(0x6) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_000, 16, DSZ(0) | 0x0404, DSZ(0x7) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_010, 16, DSZ(2) | 0x0404, DSZ(0x7) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_100, 16, DSZ(4) | 0x0404, DSZ(0x7) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_110, 16, DSZ(6) | 0x0404, DSZ(0x7) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +FMT(d_dind_dsz_111, 16, DSZ(7) | 0x0404, DSZ(0x7) | 0x0c06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(src1, 13, 3))) + +/* C-11 */ +FMT(d_dinddw, 16, DSZ(4) | 0x0404, DSZ(0x4) | 0x0c06, + SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), + FLD(sz, 9, 1), FLD(t, 12, 1), FLD(src1, 13, 3))) + +/* C-12 */ +FMT(d_dinc_dsz_x01, 16, DSZ(1) | 0x0c04, DSZ(0x3) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_0xx, 16, DSZ(0) | 0x0c04, DSZ(0x4) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_01x, 16, DSZ(2) | 0x0c04, DSZ(0x6) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_x11,16, DSZ(3) | 0x0c04, DSZ(0x3) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_000, 16, DSZ(0) | 0x0c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_010, 16, DSZ(2) | 0x0c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_100, 16, DSZ(4) | 0x0c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_110, 16, DSZ(6) | 0x0c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_dinc_dsz_111, 16, DSZ(7) | 0x0c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +/* C-13*/ +FMT(d_dincdw, 16, DSZ(4) | 0x0c04, DSZ(0x4) | 0xcc06, + SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), + FLD(sz, 9, 1), FLD(t, 12, 1), FLD(cst, 13, 1))) + +/* C-14 */ +FMT(d_ddec_dsz_01x, 16, DSZ(2) | 0x4c04, DSZ(0x6) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_0xx, 16, DSZ(0) | 0x4c04, DSZ(0x4) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_x01, 16, DSZ(1) | 0x4c04, DSZ(0x3) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_x11, 16, DSZ(3) | 0x4c04, DSZ(0x3) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_000, 16, DSZ(0) | 0x4c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_010, 16, DSZ(2) | 0x4c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_100, 16, DSZ(4) | 0x4c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_110, 16, DSZ(6) | 0x4c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +FMT(d_ddec_dsz_111, 16, DSZ(7) | 0x4c04, DSZ(0x7) | 0xcc06, + SFLDS6(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(ptr, 7, 2), FLD(sz, 9, 1), + FLD(t, 12, 1), FLD(cst, 13, 1))) + +/* C-15 */ +FMT(d_ddecdw, 16, DSZ(4) | 0x4c04, DSZ(0x4) | 0xcc06, + SFLDS7(FLD(op, 3, 1), FLD(na, 4, 1), FLD(srcdst, 5, 2), FLD(ptr, 7, 2), + FLD(sz, 9, 1), FLD(t, 12, 1), FLD(cst, 13, 1))) + +/* C-16 */ +FMT(d_dstk, 16, 0x8c04, 0x8c06, + SFLDS4(FLD(op, 3, 1), FLD(srcdst, 4, 3), FLD(t, 12, 1), + COMPFLD(cst, BFLD2(BFLD(7, 3, 2), BFLD(13, 2, 0))))) + +/* C-17 */ +FMT(d_dx2op, 16, 0x0036, 0x047e, + SFLDS4(FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), FLD(srcdst, 13, 3))) + +/* C-18 */ +FMT(d_dx5, 16, 0x0436, 0x047e, + SFLDS2(FLD(dst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) + +/* C-19 */ +FMT(d_dx5p, 16, 0x0c76, 0x1c7e, + SFLDS2(FLD(op, 7, 1), + COMPFLD(cst, BFLD2(BFLD(8, 2, 3), BFLD(13, 3, 0))))) + +/* C-20 */ +FMT(d_dx1, 16, 0x1876, 0x1c7e, + SFLDS2(FLD(srcdst, 7, 3), FLD(op, 13, 3))) + +/* C-21 */ +FMT(d_dpp, 16, 0x0077, 0x087f, + SFLDS5(FLD(srcdst, 7, 4), FLD(t, 12, 1), FLD(cst, 13, 1), FLD(op, 14, 1), + FLD(dw, 15, 1))) + +/* Appendix D 32-bit formats. */ + +FMT(l_1_or_2_src, 32, 0x18, 0x1c, + CFLDS6(FLD(s, 1, 1), FLD(op, 5, 7), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) +FMT(l_1_or_2_src_noncond, 32, 0x10000018, 0xf000001c, + NFLDS6(FLD(s, 1, 1), FLD(op, 5, 7), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) +FMT(l_unary, 32, 0x358, 0xffc, + CFLDS5(FLD(s, 1, 1), FLD(x, 12, 1), FLD(op, 13, 5), FLD(src2, 18, 5), + FLD(dst, 23, 5))) + +/* Appendix D 16-bit formats will go here. */ + +/* D-4 */ +FMT(l_l3_sat_0, 16, SAT(0) | 0x0000, SAT(1) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(src1, 13, 3))) + +FMT(l_l3_sat_1, 16, SAT(1) | 0x0000, SAT(1) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(src1, 13, 3))) + +/* D-5 - combine cst3 and n fields into a single field cst */ +FMT(l_l3i, 16, 0x0400, 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(sn, 11, 1), FLD(x, 12, 1), + COMPFLD(cst, BFLD2(BFLD(13, 3, 0), BFLD(11, 1, 3))))) + +/* D-6 Mtbd ? */ + +/* D-7 */ +FMT(l_l2c, 16, 0x0408, 0x040e, + SFLDS5(FLD(dst, 4, 1), FLD(src2, 7, 3), FLD(x, 12, 1), FLD(src1, 13, 3), + COMPFLD(op, BFLD2(BFLD(5, 2, 0), BFLD(11, 1, 2))))) + +/* D-8 */ +FMT(l_lx5, 16, 0x0426, 0x047e, + SFLDS2(FLD(dst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) + +/* D-9 */ +FMT(l_lx3c, 16, 0x0026, 0x147e, + SFLDS3(FLD(src2, 7, 3), FLD(dst, 11, 1), FLD(cst, 13, 3))) + +/* D-10 */ +FMT(l_lx1c, 16, 0x1026, 0x147e, + SFLDS4(FLD(src2, 7, 3), FLD(dst, 11, 1), FLD(cst, 13, 1), FLD(op, 14, 2))) + +/* D-11 */ +FMT(l_lx1, 16, 0x1866, 0x1c7e, + SFLDS2(FLD(srcdst, 7, 3), FLD(op, 13, 3))) + +/* Appendix E 32-bit formats. */ + +FMT(m_compound, 32, 0x30, 0x83c, + CFLDS6(FLD(s, 1, 1), FLD(op, 6, 5), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) +FMT(m_1_or_2_src, 32, 0x10000030, 0xf000083c, + NFLDS6(FLD(s, 1, 1), FLD(op, 6, 5), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) +/* Contrary to SPRUFE8, this does have predicate fields. */ +FMT(m_unary, 32, 0xf0, 0xffc, + CFLDS5(FLD(s, 1, 1), FLD(x, 12, 1), FLD(op, 13, 5), FLD(src2, 18, 5), + FLD(dst, 23, 5))) + +/* M-unit formats missing from Appendix E. */ +FMT(m_mpy, 32, 0x0, 0x7c, + CFLDS6(FLD(s, 1, 1), FLD(op, 7, 5), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) + +/* Appendix E 16-bit formats will go here. */ +FMT(m_m3_sat_0, 16, SAT(0) | 0x001e, SAT(1) | 0x001e, + SFLDS5(FLD(op, 5, 2), FLD(src2, 7, 3), FLD(dst, 10, 2), + FLD(x, 12, 1), FLD(src1, 13, 3))) +FMT(m_m3_sat_1, 16, SAT(1) | 0x001e, SAT(1) | 0x001e, + SFLDS5(FLD(op, 5, 2), FLD(src2, 7, 3), FLD(dst, 10, 2), + FLD(x, 12, 1), FLD(src1, 13, 3))) + +/* Appendix F 32-bit formats. */ + +FMT(s_1_or_2_src, 32, 0x20, 0x3c, + CFLDS6(FLD(s, 1, 1), FLD(op, 6, 6), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23 ,5))) +FMT(s_ext_1_or_2_src, 32, 0xc30, 0xc3c, + CFLDS6(FLD(s, 1, 1), FLD(op, 6, 4), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) +FMT(s_ext_1_or_2_src_noncond, 32, 0xc30, 0xe0000c3c, + NFLDS7(FLD(s, 1, 1), FLD(op, 6, 4), FLD(x, 12, 1), FLD(src1, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5), FLD(z, 28, 1))) +FMT(s_unary, 32, 0xf20, 0xffc, + CFLDS5(FLD(s, 1, 1), FLD(x, 12, 1), FLD(op, 13, 5), FLD(src2, 18, 5), + FLD(dst, 23, 5))) +FMT(s_ext_branch_cond_imm, 32, 0x10, 0x7c, + CFLDS2(FLD(s, 1, 1), FLD(cst, 7, 21))) +FMT(s_call_imm_nop, 32, 0x10, 0xe000007c, + NFLDS3(FLD(s, 1, 1), FLD(cst, 7, 21), FLD(z, 28, 1))) +FMT(s_branch_nop_cst, 32, 0x120, 0x1ffc, + CFLDS3(FLD(s, 1, 1), FLD(src1, 13, 3), FLD(src2, 16, 12))) +FMT(s_branch_nop_reg, 32, 0x800360, 0xf830ffc, + CFLDS4(FLD(s, 1, 1), FLD(x, 12, 1), FLD(src1, 13, 3), FLD(src2, 18, 5))) +FMT(s_branch, 32, 0x360, 0xf83effc, + CFLDS3(FLD(s, 1, 1), FLD(x, 12, 1), FLD(src2, 18, 5))) +FMT(s_mvk, 32, 0x28, 0x3c, + CFLDS4(FLD(s, 1, 1), FLD(h, 6, 1), FLD(cst, 7, 16), FLD(dst, 23, 5))) +FMT(s_field, 32, 0x8, 0x3c, + CFLDS6(FLD(s, 1, 1), FLD(op, 6, 2), FLD(cstb, 8, 5), FLD(csta, 13, 5), + FLD(src2, 18, 5), FLD(dst, 23, 5))) + +/* S-unit formats missing from Appendix F. */ +FMT(s_addk, 32, 0x50, 0x7c, + CFLDS3(FLD(s, 1, 1), FLD(cst, 7, 16), FLD(dst, 23, 5))) +FMT(s_addkpc, 32, 0x160, 0x1ffc, + CFLDS4(FLD(s, 1, 1), FLD(src2, 13, 3), FLD(src1, 16, 7), FLD(dst, 23, 5))) +FMT(s_b_irp, 32, 0x1800e0, 0x7feffc, + CFLDS3(FLD(s, 1, 1), FLD(x, 12, 1), FLD(dst, 23, 5))) +FMT(s_b_nrp, 32, 0x1c00e0, 0x7feffc, + CFLDS3(FLD(s, 1, 1), FLD(x, 12, 1), FLD(dst, 23, 5))) +FMT(s_bdec, 32, 0x1020, 0x1ffc, + CFLDS3(FLD(s, 1, 1), FLD(src, 13, 10), FLD(dst, 23, 5))) +FMT(s_bpos, 32, 0x20, 0x1ffc, + CFLDS3(FLD(s, 1, 1), FLD(src, 13, 10), FLD(dst, 23, 5))) + +/* Appendix F 16-bit formats will go here. */ + +/* F-17 Sbs7 Instruction Format */ +FMT(s_sbs7, 16, BR(1) | 0x000a, BR(1) | 0x003e, + SFLDS2(FLD(cst, 6, 7), FLD(n, 13, 3))) + +/* F-18 Sbu8 Instruction Format */ +FMT(s_sbu8, 16, BR(1) | 0xc00a, BR(1) | 0xc03e, + SFLDS1(FLD(cst, 6, 8))) + +/* F-19 Scs10 Instruction Format */ +FMT(s_scs10, 16, BR(1) | 0x001a, BR(1) | 0x003e, + SFLDS1(FLD(cst, 6, 10))) + +/* F-20 Sbs7c Instruction Format */ +FMT(s_sbs7c, 16, BR(1) | 0x002a, BR(1) | 0x002e, + SFLDS3(FLD(z, 4, 1), FLD(cst, 6, 7), FLD(n, 13, 3))) + +/* F-21 Sbu8c Instruction Format */ +FMT(s_sbu8c, 16, BR(1) | 0xc02a, BR(1) | 0xc02e, + SFLDS2(FLD(z, 4, 1), FLD(cst, 6, 8))) + +/* F-22 S3 Instruction Format */ +FMT(s_s3, 16, BR(0) | 0x000a, BR(1) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(src1, 13, 3))) + +FMT(s_s3_sat_x, 16, BR(0) | SAT(0) | 0x000a, BR(1) | SAT(0) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(src1, 13, 3))) + +FMT(s_s3_sat_0, 16, BR(0) | SAT(0) | 0x000a, BR(1) | SAT(1) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(src1, 13, 3))) + +FMT(s_s3_sat_1, 16, BR(0) | SAT(1) | 0x000a, BR(1) | SAT(1) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(src1, 13, 3))) + +/* F-23 S3i Instruction Format */ +FMT(s_s3i, 16, BR(0) | 0x040a, BR(1) | 0x040e, + SFLDS5(FLD(dst, 4, 3), FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(cst, 13, 3))) + +/* F-24 Smvk8 Instruction Format */ +FMT(s_smvk8, 16, 0x0012, 0x001e, + SFLDS2(FLD(dst, 7, 3), + COMPFLD(cst, BFLD4(BFLD(10, 1, 7), BFLD(5, 2, 5), BFLD(11, 2, 3), BFLD(13, 3, 0))))) + +/* F-25 Ssh5 Instruction Format */ +FMT(s_ssh5_sat_x, 16, SAT(0) | 0x0402, SAT(0) | 0x041e, + SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) +FMT(s_ssh5_sat_0, 16, SAT(0) | 0x0402, SAT(1) | 0x041e, + SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) +FMT(s_ssh5_sat_1, 16, SAT(1) | 0x0402, SAT(1) | 0x041e, + SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) + +/* F-26 S2sh Instruction Format */ +FMT(s_s2sh, 16, 0x0462, 0x047e, + SFLDS3(FLD(srcdst, 7, 3), FLD(op, 11, 2), FLD(src1, 13, 3))) + +/* F-27 Sc5 Instruction Format */ +FMT(s_sc5, 16, 0x0002, 0x041e, + SFLDS3(FLD(op, 5, 2), FLD(srcdst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) + +/* F-28 S2ext Instruction Format */ +FMT(s_s2ext, 16, 0x0062, 0x047e, + SFLDS3(FLD(src, 7, 3), FLD(op, 11, 2), FLD(dst, 13, 3))) + +/* F-29 Sx2op Instruction Format */ +FMT(s_sx2op, 16, 0x002e, 0x047e, + SFLDS4(FLD(src2, 7, 3), FLD(op, 11, 1), FLD(x, 12, 1), + FLD(srcdst, 13, 3))) + +/* F-30 Sx5 Instruction Format */ +FMT(s_sx5, 16, 0x042e, 0x047e, + SFLDS2(FLD(dst, 7, 3), + COMPFLD(cst, BFLD2(BFLD(11, 2, 3), BFLD(13, 3, 0))))) + +/* F-31 Sx1 Instruction Format */ +FMT(s_sx1, 16, 0x186e, 0x1c7e, + SFLDS2(FLD(srcdst, 7, 3), FLD(op, 13, 3))) + +/* F-32 Sx1b Instruction Format */ +FMT(s_sx1b, 16, 0x006e, 0x187e, + SFLDS2(FLD(src2, 7, 4), FLD(n, 13, 3))) + +/* Appendix G 16-bit formats will go here. */ +FMT(lsdmvto, 16, 0x0006, 0x0066, + SFLDS4(FLD(unit, 3, 2), + FLD(x, 12, 1), FLD(dst, 13, 3), + COMPFLD(src2, BFLD2(BFLD(10, 2, 3), BFLD(7, 3, 0))))) + +FMT(lsdmvfr, 16, 0x0046, 0x0066, + SFLDS4(FLD(unit, 3, 2), FLD(src2, 7, 3), FLD(x, 12, 1), + COMPFLD(dst, BFLD2(BFLD(10, 2, 3), BFLD(13, 3, 0))))) + +/* G-3 */ +FMT(lsdx1c, 16, 0x0866, 0x1c66, + SFLDS4(FLD(unit, 3, 2), FLD(dst, 7, 3), FLD(cst, 13, 1), + FLD(cc, 14, 2))) + +/* G-4 */ +FMT(lsdx1, 16, 0x1866, 0x1c66, + SFLDS3(FLD(unit, 3, 2), FLD(srcdst, 7, 3), FLD(op, 13, 3))) + +/* Appendix H 32-bit formats. */ + +FMT(nfu_loop_buffer, 32, 0x00020000, 0x00021ffc, + CFLDS4(FLD(s, 1, 1), FLD(op, 13, 4), FLD(csta, 18, 5), FLD(cstb, 23, 5))) +/* Corrected relative to Appendix H. */ +FMT(nfu_nop_idle, 32, 0x00000000, 0xfffe1ffc, + NFLDS2(FLD(s, 1, 1), FLD(op, 13, 4))) + +/* No-unit formats missing from Appendix H (given the NOP and IDLE + correction). */ +FMT(nfu_dint, 32, 0x10004000, 0xfffffffc, + NFLDS1(FLD(s, 1, 1))) +FMT(nfu_rint, 32, 0x10006000, 0xfffffffc, + NFLDS1(FLD(s, 1, 1))) +FMT(nfu_swe, 32, 0x10000000, 0xfffffffc, + NFLDS1(FLD(s, 1, 1))) +FMT(nfu_swenr, 32, 0x10002000, 0xfffffffc, + NFLDS1(FLD(s, 1, 1))) +/* Although formally covered by the loop buffer format, the fields in + that format are not useful for all such instructions and not all + instructions can be predicated. */ +FMT(nfu_spkernel, 32, 0x00034000, 0xf03ffffc, + NFLDS2(FLD(s, 1, 1), FLD(fstgfcyc, 22, 6))) +FMT(nfu_spkernelr, 32, 0x00036000, 0xfffffffc, + NFLDS1(FLD(s, 1, 1))) +FMT(nfu_spmask, 32, 0x00020000, 0xfc021ffc, + NFLDS3(FLD(s, 1, 1), FLD(op, 13, 4), FLD(mask, 18, 8))) + +/* Appendix H 16-bit formats will go here. */ + +/* H-5 */ +FMT(nfu_uspl, 16, 0x0c66, 0xbc7e, + FLDS2(FLD(op, 0, 1), COMPFLD(ii, BFLD2(BFLD(7, 3, 0), BFLD(14, 1, 3))))) + +/* H-6 */ +/* make up some fields to pretend to have s and z fields s for this format + so as to fit in other predicated compact instruction to avoid special- + casing this instruction in tic6x-dis.c + use op field as a predicate adress register selector (s field) + use the first zeroed bit as a z value as this insn only supports [a0] + and [b0] predicate forms. +*/ +FMT(nfu_uspldr, 16, 0x8c66, 0xbc7e, + FLDS4(FLD(op, 0, 1), FLD(s, 0, 1), FLD(z, 3, 1), + COMPFLD(ii, BFLD2(BFLD(7, 3, 0), BFLD(14, 1, 3))))) + +/* H-7 */ +FMT(nfu_uspk, 16, 0x1c66, 0x3c7e, + FLDS1(COMPFLD(fstgfcyc, BFLD3(BFLD(0, 1, 0), BFLD(7, 3, 1), BFLD(14, 2, 4))))) + +/* H-8a */ +FMT(nfu_uspma, 16, 0x2c66, 0x3c7e, + FLDS1(COMPFLD(mask, BFLD3(BFLD(0, 1, 0), BFLD(7, 3, 1), BFLD(14, 2, 4))))) + +/* H-8b */ +FMT(nfu_uspmb, 16, 0x3c66, 0x3c7e, + FLDS1(COMPFLD(mask, BFLD3(BFLD(0, 1, 0), BFLD(7, 3, 1), BFLD(14, 2, 4))))) + +/* H-9 */ +FMT(nfu_unop, 16, 0x0c6e, 0x1fff, + FLDS1(FLD(n, 13, 3))) + +#undef FLD +#undef CFLDS +#undef CFLDS2 +#undef CFLDS3 +#undef CFLDS4 +#undef CFLDS5 +#undef CFLDS6 +#undef CFLDS7 +#undef CFLDS8 +#undef NFLDS +#undef NFLDS1 +#undef NFLDS2 +#undef NFLDS3 +#undef NFLDS5 +#undef NFLDS6 +#undef NFLDS7 +#undef SFLDS +#undef SFLDS1 +#undef SFLDS2 +#undef SFLDS3 +#undef SFLDS4 +#undef SFLDS5 +#undef SFLDS6 +#undef SFLDS7 +#undef BFLD +#undef BFLD1 +#undef BFLD2 +#undef BFLD3 +#undef BFLD4 +#undef FLDS1 +#undef FLDS2 +#undef FLDS3 +#undef FLDS4 +#undef FLDS5 +#undef COMPFLD +#undef DSZ +#undef BR +#undef SAT diff --git a/include/opcode/tic6x-opcode-table.h b/include/opcode/tic6x-opcode-table.h new file mode 100644 index 0000000..d876c56 --- /dev/null +++ b/include/opcode/tic6x-opcode-table.h @@ -0,0 +1,3677 @@ +/* TI C6X opcode table. + Copyright 2010-2013 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* Define the INSN macro before including this file; it takes as + arguments the fields from tic6x_opcode (defined in tic6x.h). The + name is given as an identifier; the subsequent four operands should + have "tic6x_func_unit_", "tic6x_insn_format_", "tic6x_pipeline_" + and "TIC6X_INSN_", respectively, prepended to them by the macro + definition. Also define INSNE, which has a second argument that + goes after tic6x_opcode_NAME_ to form the enumeration value for + this instruction, where the value otherwise formed from the name, + functional unit and format is ambiguous, but otherwise has the same + arguments as INSN. */ + +#define TIC6X_INSN_C64X_AND_C67X TIC6X_INSN_C64X|TIC6X_INSN_C67X +#define tic6x_insn_format_nfu_s_branch_nop_cst \ + tic6x_insn_format_s_branch_nop_cst +#define tic6x_insn_format_s_l_1_or_2_src tic6x_insn_format_l_1_or_2_src +#define RAN(id, min, max) { CONCAT2(tic6x_field_,id), (min), (max) } +#define FIX(id, val) RAN(id, val, val) +#define FIX0() 0, { { 0, 0, 0 } } +#define FIX1(a) 1, { a } +#define FIX2(a, b) 2, { a, b } +#define FIX3(a, b, c) 3, { a, b, c } +#define FIX4(a, b, c, d) 4, { a, b, c, d } +#define OP0() 0, { { 0, 0, FALSE, 0, 0, 0, 0 } } +#define OP1(a) 1, { a } +#define OP2(a, b) 2, { a, b } +#define OP3(a, b, c) 3, { a, b, c } +#define OP4(a, b, c, d) 4, { a, b, c, d } +#define OACST { tic6x_operand_asm_const, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OLCST { tic6x_operand_link_const, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCSTM1 { tic6x_operand_hw_const_minus_1, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCST0 { tic6x_operand_hw_const_0, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCST1 { tic6x_operand_hw_const_1, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCST5 { tic6x_operand_hw_const_5, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCST16 { tic6x_operand_hw_const_16, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCST24 { tic6x_operand_hw_const_24, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OHWCST31 { tic6x_operand_hw_const_31, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define OFULIST { tic6x_operand_func_unit, 0, tic6x_rw_none, 0, 0, 0, 0 } +#define ORIRP1 { tic6x_operand_irp, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define ORNRP1 { tic6x_operand_nrp, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define OWREG1 { tic6x_operand_reg, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define OWREG1Z { tic6x_operand_zreg, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define OWREG1NORS { tic6x_operand_reg_nors, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define ORREG1B { tic6x_operand_reg_bside, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define ORREG1BNORS { tic6x_operand_reg_bside_nors, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define OWRETREG1 { tic6x_operand_retreg, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define ORREG1 { tic6x_operand_reg, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define ORDREG1 { tic6x_operand_dreg, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define ORTREG1 { tic6x_operand_treg, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define ORWREG1 { tic6x_operand_reg, 4, tic6x_rw_read_write, 1, 1, 0, 0 } +#define ORB15REG1 { tic6x_operand_b15reg, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define OWB15REG1 { tic6x_operand_b15reg, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define ORAREG1 { tic6x_operand_areg, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define ORXREG1 { tic6x_operand_xreg, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define ORREG12 { tic6x_operand_reg, 4, tic6x_rw_read, 1, 2, 0, 0 } +#define ORREG14 { tic6x_operand_reg, 4, tic6x_rw_read, 1, 4, 0, 0 } +#define ORXREG14 { tic6x_operand_xreg, 4, tic6x_rw_read, 1, 4, 0, 0 } +#define OWREG2 { tic6x_operand_reg, 4, tic6x_rw_write, 2, 2, 0, 0 } +#define OWREG4 { tic6x_operand_reg, 4, tic6x_rw_write, 4, 4, 0, 0 } +#define OWREG9 { tic6x_operand_reg, 4, tic6x_rw_write, 9, 9, 0, 0 } +#define OWDREG5 { tic6x_operand_dreg, 4, tic6x_rw_write, 5, 5, 0, 0 } +#define OWTREG5 { tic6x_operand_treg, 4, tic6x_rw_write, 5, 5, 0, 0 } +#define OWREGL1 { tic6x_operand_regpair, 5, tic6x_rw_write, 1, 1, 1, 1 } +#define ORREGL1 { tic6x_operand_regpair, 5, tic6x_rw_read, 1, 1, 1, 1 } +#define OWREGD1 { tic6x_operand_regpair, 8, tic6x_rw_write, 1, 1, 1, 1 } +#define OWREGD12 { tic6x_operand_regpair, 8, tic6x_rw_write, 1, 1, 2, 2 } +#define OWREGD4 { tic6x_operand_regpair, 8, tic6x_rw_write, 4, 4, 4, 4 } +#define ORREGD1 { tic6x_operand_regpair, 8, tic6x_rw_read, 1, 1, 1, 1 } +#define OWREGD45 { tic6x_operand_regpair, 8, tic6x_rw_write, 4, 4, 5, 5 } +#define OWREGD67 { tic6x_operand_regpair, 8, tic6x_rw_write, 6, 6, 7, 7 } +#define ORDREGD1 { tic6x_operand_dregpair, 8, tic6x_rw_read, 1, 1, 1, 1 } +#define ORTREGD1 { tic6x_operand_tregpair, 8, tic6x_rw_read, 1, 1, 1, 1 } +#define OWDREGD5 { tic6x_operand_dregpair, 8, tic6x_rw_write, 5, 5, 5, 5 } +#define OWTREGD5 { tic6x_operand_tregpair, 8, tic6x_rw_write, 5, 5, 5, 5 } +#define ORREGD12 { tic6x_operand_regpair, 8, tic6x_rw_read, 1, 1, 2, 2 } +#define ORXREGD12 { tic6x_operand_xregpair, 8, tic6x_rw_read, 1, 1, 2, 2 } +#define ORREGD1234 { tic6x_operand_regpair, 8, tic6x_rw_read, 1, 2, 3, 4 } +#define ORXREGD1324 { tic6x_operand_xregpair, 8, tic6x_rw_read, 1, 3, 2, 4 } +#define OWREGD910 { tic6x_operand_regpair, 8, tic6x_rw_write, 9, 9, 10, 10 } +#define ORCREG1 { tic6x_operand_ctrl, 4, tic6x_rw_read, 1, 1, 0, 0 } +#define OWCREG1 { tic6x_operand_ctrl, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define OWILC1 { tic6x_operand_ilc, 4, tic6x_rw_write, 1, 1, 0, 0 } +#define ORMEMDW { tic6x_operand_mem_deref, 4, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMDW { tic6x_operand_mem_deref, 4, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMSB { tic6x_operand_mem_short, 1, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMSB { tic6x_operand_mem_short, 1, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMLB { tic6x_operand_mem_long, 1, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMLB { tic6x_operand_mem_long, 1, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMSH { tic6x_operand_mem_short, 2, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMSH { tic6x_operand_mem_short, 2, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMLH { tic6x_operand_mem_long, 2, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMLH { tic6x_operand_mem_long, 2, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMSW { tic6x_operand_mem_short, 4, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMSW { tic6x_operand_mem_short, 4, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMLW { tic6x_operand_mem_long, 4, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMLW { tic6x_operand_mem_long, 4, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMSD { tic6x_operand_mem_short, 8, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMSD { tic6x_operand_mem_short, 8, tic6x_rw_write, 3, 3, 0, 0 } +#define ORMEMND { tic6x_operand_mem_ndw, 8, tic6x_rw_read, 3, 3, 0, 0 } +#define OWMEMND { tic6x_operand_mem_ndw, 8, tic6x_rw_write, 3, 3, 0, 0 } +#define ENC(id, meth, op) { \ + CONCAT2(tic6x_field_,id), \ + CONCAT2(tic6x_coding_,meth), \ + op \ + } +#define ENC0() 0, { { 0, 0, 0 } } +#define ENC1(a) 1, { a } +#define ENC2(a, b) 2, { a, b } +#define ENC3(a, b, c) 3, { a, b, c } +#define ENC4(a, b, c, d) 4, { a, b, c, d } +#define ENC5(a, b, c, d, e) 5, { a, b, c, d, e } +#define ENC6(a, b, c, d, e, f) 6, { a, b, c, d, e, f } +#define ENC7(a, b, c, d, e, f, g) 7, { a, b, c, d, e, f, g } + +INSN(abs, l, unary, 1cycle, C62X, 0, + FIX1(FIX(op, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSN(abs, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX3(FIX(op, 0x38), FIX(x, 0), FIX(src1, 0)), + OP2(ORREGL1, OWREGL1), + ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) + +INSN(abs2, l, unary, 1cycle, C64X, 0, + FIX1(FIX(op, 0x4)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(absdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x2c), FIX(x, 0)), + OP2(ORREGD1, OWREGD12), + ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), + ENC(dst, reg, 1))) + +INSN(abssp, s, unary, 1cycle, C67X, 0, + FIX1(FIX(op, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSNE(add, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x3)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, l_si_xsi_sl, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x23)), + OP3(ORREG1, ORXREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, l_xsi_sl_sl, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x21)), + OP3(ORXREG1, ORREGL1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x2)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x20), FIX(x, 0)), + OP3(OACST, ORREGL1, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSNE(add, s_si_xsi_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x7)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, s_s5_xsi_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x6)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x10)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(add, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x12)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) +INSNE(add, d_si_xsi_si, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0xa)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(add, d_xsi_s5_si, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0xb)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, scst, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(add, l, l3_sat_0, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(add, l, l3i, 1cycle, C64XP, 0, + FIX0(), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(cst, scst_l3i, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(add, l, lx1, 1cycle, C64XP, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3)), + OP3(OHWCSTM1, ORREG1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) +INSN(add, s, s3_sat_0, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(add, s, sx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3)), + OP3(OHWCSTM1, ORREG1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) +INSN(add, s, sx2op, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2), + ENC(src2, reg, 1), ENC(x, xpath, 1))) +INSN(add, d, dx2op, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 1), ENC(srcdst, reg, 0), + ENC(src2, reg, 1), ENC(srcdst, reg, 2))) +INSNU(add, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x5), FIX(unit, 0x0)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +INSNU(add, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x5), FIX(unit, 0x1)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +INSNU(add, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x5), FIX(unit, 0x2)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +/**/ + +INSNE(addab, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x30)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(addab, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x32)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) +INSN(addab, d, adda_long, 1cycle, C64XP, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 3)), + OP3(ORAREG1, OLCST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_byte, 1), + ENC(dst, reg, 2))) + +INSNE(addad, d_si_si_si, d, 1_or_2_src, 1cycle, C64X_AND_C67X, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3c)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(addad, d_si_u5_si, d, 1_or_2_src, 1cycle, C64X_AND_C67X, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3d)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) + +INSNE(addah, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x34)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(addah, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x36)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) +INSN(addah, d, adda_long, 1cycle, C64XP, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 5)), + OP3(ORAREG1, OLCST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_half, 1), + ENC(dst, reg, 2))) + +INSNE(addaw, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x38)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(addaw, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x3a)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) +INSN(addaw, d, adda_long, 1cycle, C64XP, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 7)), + OP3(ORAREG1, OLCST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_word, 1), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(addaw, d, dx5, 1cycle, C64XP, TIC6X_FLAG_INSN16_BSIDE, + FIX0(), + OP3(ORB15REG1, OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, ucst, 1), ENC(dst, reg, 2))) +INSN(addaw, d, dx5p, 1cycle, C64XP, TIC6X_FLAG_INSN16_BSIDE, + FIX1(FIX(op, 0)), + OP3(ORB15REG1, OACST, OWB15REG1), + ENC2(ENC(s, fu, 0), ENC(cst, ucst, 1))) +/**/ + +INSN(adddp, l, 1_or_2_src, addsubdp, C67X, 0, + FIX1(FIX(op, 0x18)), + OP3(ORREGD12, ORXREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(adddp, s, l_1_or_2_src, addsubdp, C67XP, 0, + FIX1(FIX(op, 0x72)), + OP3(ORREGD12, ORXREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(addk, s, addk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, scst, 0), ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(addk, s, sx5, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP2(OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) +/**/ + +INSN(addkpc, s, addkpc, 1cycle, C64X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_SIDE_B_ONLY, + FIX1(FIX(s, 1)), + OP3(OLCST, OWREG1, OACST), + ENC3(ENC(src1, pcrel, 0), ENC(dst, reg, 1), ENC(src2, ucst, 2))) + +INSN(addsp, l, 1_or_2_src, 4cycle, C67X, 0, + FIX1(FIX(op, 0x10)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(addsp, s, l_1_or_2_src, 4cycle, C67XP, 0, + FIX1(FIX(op, 0x70)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(addsub, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0xc)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(addsub2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0xd)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(addu, l_ui_xui_ul, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x2b)), + OP3(ORREG1, ORXREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(addu, l_xui_ul_ul, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x29)), + OP3(ORXREG1, ORREGL1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(add2, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(add2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x5)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(add2, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x4)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(add4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x65)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(and, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x7b)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(and, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x7a)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(and, s_ui_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x1f)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(and, s_s5_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x1e)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(and, d_ui_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x6)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(and, d_s5_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x7)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(and, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 0)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(andn, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x7c)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(andn, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x6)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(andn, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(avg2, m, compound, 1616_m, C64X, 0, + FIX1(FIX(op, 0x13)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(avgu4, m, compound, 1616_m, C64X, 0, + FIX1(FIX(op, 0x12)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(b, s, ext_branch_cond_imm, branch, C62X, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP1(OLCST), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) +INSN(b, s, branch, branch, C62X, TIC6X_FLAG_SIDE_B_ONLY, + FIX1(FIX(s, 1)), + OP1(ORXREG1), + ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) +INSN(b, s, b_irp, branch, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORIRP1), + ENC0()) +INSN(b, s, b_nrp, branch, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORNRP1), + ENC0()) + +INSN(bdec, s, bdec, branch, C64X, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP2(OLCST, ORWREG1), + ENC3(ENC(s, fu, 0), ENC(src, pcrel, 0), ENC(dst, reg, 1))) + +INSN(bitc4, m, unary, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1e)), + OP2(ORXREG1, OWREG2), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(bitr, m, unary, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1f)), + OP2(ORXREG1, OWREG2), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(bnop, s, branch_nop_cst, branch, C64X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, + FIX0(), + OP2(OLCST, OACST), + ENC3(ENC(s, fu, 0), ENC(src2, pcrel_half, 0), ENC(src1, ucst, 1))) +INSN(bnop, nfu, s_branch_nop_cst, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_MCNOP, + FIX1(FIX(s, 0)), + OP2(OLCST, OACST), + ENC2(ENC(src2, pcrel, 0), ENC(src1, ucst, 1))) +INSN(bnop, s, branch_nop_reg, branch, C64X, + TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MCNOP, + FIX1(FIX(s, 1)), + OP2(ORXREG1, OACST), + ENC3(ENC(x, xpath, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1))) + +/* 16 bits insn format */ +INSN(bnop, s, sbu8, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, + FIX0(), + OP2(OLCST, OHWCST5), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel_half_unsigned, 0))) +INSN(bnop, s, sbs7, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, + FIX0(), + OP2(OLCST, OACST), + ENC3(ENC(s, fu, 0), ENC(cst, pcrel_half, 0), ENC(n, ucst, 1))) +INSN(bnop, s, sbu8c, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_INSN16_SPRED, + FIX0(), + OP2(OLCST, OHWCST5), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel_half_unsigned, 0))) +INSN(bnop, s, sbs7c, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_INSN16_SPRED, + FIX0(), + OP2(OLCST, OACST), + ENC3(ENC(s, fu, 0), ENC(cst, pcrel_half, 0), ENC(n, ucst, 1))) +INSN(bnop, s, sx1b, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, + FIX0(), + OP2(ORREG1BNORS, OACST), + ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(n, ucst, 1))) +/**/ + +INSN(bpos, s, bpos, branch, C64X, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP2(OLCST, ORREG1), + ENC3(ENC(s, fu, 0), ENC(src, pcrel, 0), ENC(dst, reg, 1))) + +INSN(call, s, ext_branch_cond_imm, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, + FIX0(), + OP1(OLCST), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) +INSN(call, s, branch, branch, C62X, + TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, + FIX1(FIX(s, 1)), + OP1(ORXREG1), + ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) +INSN(call, s, b_irp, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORIRP1), + ENC0()) +INSN(call, s, b_nrp, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORNRP1), + ENC0()) + +INSN(callnop, s, branch_nop_cst, branch, C64X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_MCNOP|TIC6X_FLAG_CALL, + FIX0(), + OP2(OLCST, OACST), + ENC3(ENC(s, fu, 0), ENC(src2, pcrel, 0), ENC(src1, ucst, 1))) +INSN(callnop, nfu, s_branch_nop_cst, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_MCNOP|TIC6X_FLAG_CALL, + FIX1(FIX(s, 0)), + OP2(OLCST, OACST), + ENC2(ENC(src2, pcrel, 0), ENC(src1, ucst, 1))) +INSN(callnop, s, branch_nop_reg, branch, C64X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MCNOP|TIC6X_FLAG_CALL, + FIX1(FIX(s, 1)), + OP2(ORXREG1, OACST), + ENC3(ENC(x, xpath, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1))) + + +INSN(callp, s, call_imm_nop, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, + FIX1(FIX(z, 1)), + OP2(OLCST, OWRETREG1), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) + +/* 16 bits insn format */ +INSN(callp, s, scs10, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP, + FIX0(), + OP2(OLCST, OWRETREG1), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) +/**/ + +INSN(callret, s, ext_branch_cond_imm, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, + FIX0(), + OP1(OLCST), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) +INSN(callret, s, branch, branch, C62X, + TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, + FIX1(FIX(s, 1)), + OP1(ORXREG1), + ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) +INSN(callret, s, b_irp, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORIRP1), + ENC0()) +INSN(callret, s, b_nrp, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_CALL|TIC6X_FLAG_RETURN, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORNRP1), + ENC0()) + +INSN(clr, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3)), + OP4(ORREG1, OACST, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), + ENC(cstb, ucst, 2), ENC(dst, reg, 3))) +INSN(clr, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x3f)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(clr, s, sc5, 1cycle, C64XP, 0, + FIX1(FIX(op, 2)), + OP4(ORREG1, OACST, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(cst, ucst, 1), + ENC(cst, ucst, 2), ENC(srcdst, reg, 3))) +/**/ + +INSNE(cmpeq, l_si_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x53)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpeq, l_s5_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x52)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpeq, l_xsi_sl_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x51)), + OP3(ORXREG1, ORREGL1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpeq, l_s5_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x50), FIX(x, 0)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(cmpeq, l, lx3c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP3(OACST, ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) + +INSN(cmpeq, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 3)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(cmpeq2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1d)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpeq4, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1c)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpeqdp, s, 1_or_2_src, dpcmp, C67X, 0, + FIX1(FIX(op, 0x28)), + OP3(ORREGD12, ORXREGD12, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpeqsp, s, 1_or_2_src, 1cycle, C67X, 0, + FIX1(FIX(op, 0x38)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(cmpgt, l_si_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x47)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpgt, l_s5_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x46)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpgt, l_xsi_sl_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x45)), + OP3(ORXREG1, ORREGL1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpgt, l_s5_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x44), FIX(x, 0)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSNE(cmpgt, l_xsi_si_ui, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x57)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(cmpgt, l_xsi_s5_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x56)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(cmpgt, l_sl_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x55)), + OP3(ORREGL1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(cmpgt, l_sl_s5_ui, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x54), FIX(x, 0)), + OP3(ORREGL1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, scst, 1), ENC(src2, reg, 0), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(cmpgt, l, lx1c, 1cycle, C64XP, 0, + FIX1(FIX(op, 1)), + OP3(OACST, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSN(cmpgt, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 5)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(cmpgt2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x14)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpgtdp, s, 1_or_2_src, dpcmp, C67X, 0, + FIX1(FIX(op, 0x29)), + OP3(ORREGD12, ORXREGD12, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpgtsp, s, 1_or_2_src, 1cycle, C67X, 0, + FIX1(FIX(op, 0x39)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(cmpgtu, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x4f)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpgtu, l_u4_xui_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 0x4e), RAN(src1, 0, 15)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/* Although not mentioned in SPRUFE8, CMPGTU and CMPLTU support a + 5-bit unsigned constant operand on C64X and above. */ +INSNE(cmpgtu, l_u5_xui_ui, l, 1_or_2_src, 1cycle, C64X, 0, + FIX2(FIX(op, 0x4e), RAN(src1, 16, 31)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpgtu, l_xui_ul_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x4d)), + OP3(ORXREG1, ORREGL1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpgtu, l_u4_ul_ui, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX3(FIX(op, 0x4c), FIX(x, 0), RAN(src1, 0, 15)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSNE(cmpgtu, l_u5_ul_ui, l, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, + FIX3(FIX(op, 0x4c), FIX(x, 0), RAN(src1, 16, 31)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(cmpgtu, l, lx1c, 1cycle, C64XP, 0, + FIX1(FIX(op, 3)), + OP3(OACST, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSN(cmpgtu, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 7)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(cmpgtu4, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x15)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(cmplt, l_si_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x57)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmplt, l_s5_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x56)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmplt, l_xsi_sl_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x55)), + OP3(ORXREG1, ORREGL1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmplt, l_s5_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x54), FIX(x, 0)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSNE(cmplt, l_xsi_si_ui, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x47)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(cmplt, l_xsi_s5_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x46)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(cmplt, l_sl_xsi_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x45)), + OP3(ORREGL1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(cmplt, l_sl_s5_ui, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x44), FIX(x, 0)), + OP3(ORREGL1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, scst, 1), ENC(src2, reg, 0), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(cmplt, l, lx1c, 1cycle, C64XP, 0, + FIX1(FIX(op, 0)), + OP3(OACST, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSN(cmplt, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 4)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(cmplt2, s, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x14)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpltdp, s, 1_or_2_src, dpcmp, C67X, 0, + FIX1(FIX(op, 0x2a)), + OP3(ORREGD12, ORXREGD12, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpltsp, s, 1_or_2_src, 1cycle, C67X, 0, + FIX1(FIX(op, 0x3a)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(cmpltu, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x5f)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpltu, l_u4_xui_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 0x5e), RAN(src1, 0, 15)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpltu, l_u5_xui_ui, l, 1_or_2_src, 1cycle, C64X, 0, + FIX2(FIX(op, 0x5e), RAN(src1, 16, 31)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, ucst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpltu, l_xui_ul_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x5d)), + OP3(ORXREG1, ORREGL1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(cmpltu, l_u4_ul_ui, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX3(FIX(op, 0x5c), FIX(x, 0), RAN(src1, 0, 15)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSNE(cmpltu, l_u5_ul_ui, l, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, + FIX3(FIX(op, 0x5c), FIX(x, 0), RAN(src1, 16, 31)), + OP3(OACST, ORREGL1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(cmpltu, l, lx1c, 1cycle, C64XP, 0, + FIX1(FIX(op, 2)), + OP3(OACST, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) +INSN(cmpltu, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 6)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(cmpltu4, s, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x15)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpy, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0xa)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpyr, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0xb)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmpyr1, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0xc)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(cmtl, d, 1_or_2_src, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_SIDE_T2_ONLY|TIC6X_FLAG_NO_CROSS, + FIX3(FIX(s, 1), FIX(op, 0xe), FIX(src1, 0)), + OP2(ORMEMDW, OWDREG5), + ENC2(ENC(src2, reg, 0), ENC(dst, reg, 1))) + +INSN(ddotp4, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x18)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(ddotph2, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x17)), + OP3(ORREGD1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(ddotph2r, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x15)), + OP3(ORREGD1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(ddotpl2, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x16)), + OP3(ORREGD1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(ddotpl2r, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x14)), + OP3(ORREGD1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(deal, m, unary, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1d)), + OP2(ORXREG1, OWREG2), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(dint, nfu, dint, 1cycle, C64XP, 0, + FIX1(FIX(s, 0)), + OP0(), + ENC0()) + +INSN(dmv, s, ext_1_or_2_src, 1cycle, C64XP, 0, + FIX1(FIX(op, 0xb)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(dotp2, m_s2_xs2_si, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0xc)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(dotp2, m_s2_xs2_sll, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0xb)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dotpn2, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x9)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dotpnrsu2, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x7)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dotpnrus2, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x7)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(dotprsu2, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0xd)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dotprus2, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0xd)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(dotpsu4, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dotpus4, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x2)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(dotpu4, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x6)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dpack2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x34)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dpackx2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x33)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(dpint, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x8), FIX(x, 0)), + OP2(ORREGD1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), + ENC(dst, reg, 1))) + +INSN(dpsp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x9), FIX(x, 0)), + OP2(ORREGD1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), + ENC(dst, reg, 1))) + +INSN(dptrunc, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x1), FIX(x, 0)), + OP2(ORREGD1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), + ENC(dst, reg, 1))) + +INSN(ext, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x1)), + OP4(ORREG1, OACST, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), + ENC(cstb, ucst, 2), ENC(dst, reg, 3))) +INSN(ext, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x2f)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSNE(ext, hwcst16, s, s2ext, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP4(ORREG1, OHWCST16, OHWCST16, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) +INSNE(ext, hwcst24, s, s2ext, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP4(ORREG1, OHWCST24, OHWCST24, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) +/**/ + +INSN(extu, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x0)), + OP4(ORREG1, OACST, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), + ENC(cstb, ucst, 2), ENC(dst, reg, 3))) +INSN(extu, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x2b)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSNE(extu, hwcst16, s, s2ext, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x2)), + OP4(ORREG1, OHWCST16, OHWCST16, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) +INSNE(extu, hwcst24, s, s2ext, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x3)), + OP4(ORREG1, OHWCST24, OHWCST24, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src, reg, 0), ENC(dst, reg, 3))) +INSN(extu, s, sc5, 1cycle, C64XP, 0, + FIX1(FIX(op, 0)), + OP4(ORREG1, OACST, OHWCST31, OWREG1Z), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(cst, ucst, 1))) +/**/ + +INSN(gmpy, m, 1_or_2_src, 4cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x1f), FIX(x, 0)), + OP3(ORREG1, ORREG1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(src1, reg, 0), ENC(src2, reg, 1), + ENC(dst, reg, 2))) + +/* This instruction can be predicated as usual; SPRUFE8 is incorrect + where it shows the "z" field as fixed to 1. */ +INSN(gmpy4, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x11)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(idle, nfu, nop_idle, nop, C62X, TIC6X_FLAG_MCNOP, + FIX2(FIX(s, 0), FIX(op, 0xf)), + OP0(), + ENC0()) + +INSN(intdp, l, 1_or_2_src, intdp, C67X, 0, + FIX2(FIX(op, 0x39), FIX(src1, 0)), + OP2(ORXREG1, OWREGD45), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(intdpu, l, 1_or_2_src, intdp, C67X, 0, + FIX2(FIX(op, 0x3b), FIX(src1, 0)), + OP2(ORXREG1, OWREGD45), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(intsp, l, 1_or_2_src, 4cycle, C67X, 0, + FIX2(FIX(op, 0x4a), FIX(src1, 0)), + OP2(ORXREG1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(intspu, l, 1_or_2_src, 4cycle, C67X, 0, + FIX2(FIX(op, 0x49), FIX(src1, 0)), + OP2(ORXREG1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(ldb, d, load_store, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 2), FIX(r, 0)), + OP2(ORMEMSB, OWDREG5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) +INSN(ldb, d, load_store_long, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 2)), + OP2(ORMEMLB, OWDREG5), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_byte, 0), + ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(ldb, d, doff4_dsz_x01, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) +INSN(ldb, d, dind_dsz_x01, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) +INSN(ldb, d, dinc_dsz_x01, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldb, d, ddec_dsz_x01, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +/**/ + +INSN(ldbu, d, load_store, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 1), FIX(r, 0)), + OP2(ORMEMSB, OWDREG5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) +INSN(ldbu, d, load_store_long, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 1)), + OP2(ORMEMLB, OWDREG5), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_byte, 0), + ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(ldbu, d, dinc_dsz_000, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_minus_one, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) +INSN(ldbu, d, dind_dsz_000, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) +INSN(ldbu, d, doff4_dsz_000, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) +INSN(ldbu, d, ddec_dsz_000, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSB, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_minus_one, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) +/**/ + +INSN(lddw, d, load_store, load, C64X_AND_C67X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 6), FIX(r, 1)), + OP2(ORMEMSD, OWDREGD5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) + +/* 16 bits insn */ +INSN(lddw, d, dpp, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREINCR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, + FIX2(FIX(op, 1), FIX(dw, 1)), + OP2(ORMEMSD, OWDREGD5), + ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(cst, mem_offset_minus_one, 0))) +INSN(lddw, d, ddecdw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), + OP2(ORMEMSD, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(lddw, d, dincdw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), + OP2(ORMEMSD, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(lddw, d, dinddw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), + OP2(ORMEMSD, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) +INSN(lddw, d, doff4dw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX3(FIX(op, 1), FIX(na, 0), FIX(sz, 0)), + OP2(ORMEMSD, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) +/**/ + +INSN(ldh, d, load_store, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 4), FIX(r, 0)), + OP2(ORMEMSH, OWDREG5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) +INSN(ldh, d, load_store_long, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 4)), + OP2(ORMEMLH, OWDREG5), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_half, 0), + ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(ldh, d, doff4_dsz_x11, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) +INSN(ldh, d, dind_dsz_x11, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) +INSN(ldh, d, dinc_dsz_x11, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldh, d, ddec_dsz_x11, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +/**/ + +INSN(ldhu, d, load_store, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 0), FIX(r, 0)), + OP2(ORMEMSH, OWDREG5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) +INSN(ldhu, d, load_store_long, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0)), + OP2(ORMEMLH, OWDREG5), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_half, 0), + ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(ldhu, d, doff4_dsz_010, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg, 1))) +INSN(ldhu, d, dind_dsz_010, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) +INSN(ldhu, d, dinc_dsz_010, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldhu, d, ddec_dsz_010, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSH, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +/**/ + +INSN(ldndw, d, load_nonaligned, load, C64X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, + FIX0(), + OP2(ORMEMND, OWDREGD5), + ENC7(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset_noscale, 0), ENC(baseR, reg, 0), + ENC(sc, scaled, 0), ENC(dst, reg_shift, 1))) + +/* 16 bits insn */ +INSN(ldndw, d, ddecdw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), + OP2(ORMEMND, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one_noscale, 0))) +INSN(ldndw, d, dincdw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), + OP2(ORMEMND, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one_noscale, 0))) +INSN(ldndw, d, dinddw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), + OP2(ORMEMND, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset_noscale, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) +INSN(ldndw, d, doff4dw, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX3(FIX(op, 1), FIX(na, 1), FIX(sz, 0)), + OP2(ORMEMND, OWTREGD5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_noscale, 0), + ENC(ptr, reg_ptr, 0), ENC(srcdst, reg_shift, 1))) +/**/ + +INSN(ldnw, d, load_store, load, C64X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, + FIX2(FIX(op, 3), FIX(r, 1)), + OP2(ORMEMSW, OWDREG5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) + +/* 16 bits insn */ +INSN(ldnw, d, doff4_dsz_110, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) +INSN(ldnw, d, dind_dsz_110, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) +INSN(ldnw, d, dinc_dsz_110, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldnw, d, ddec_dsz_110, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +/**/ + +INSN(ldw, d, load_store, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 6), FIX(r, 0)), + OP2(ORMEMSW, OWDREG5), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 0), + ENC(offsetR, mem_offset, 0), ENC(baseR, reg, 0), + ENC(srcdst, reg, 1))) +INSN(ldw, d, load_store_long, load, C62X, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 6)), + OP2(ORMEMLW, OWDREG5), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 0), ENC(offsetR, ulcst_dpr_word, 0), + ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(ldw, d, doff4_dsz_0xx, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 0)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) +INSN(ldw, d, doff4_dsz_100, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset, 0))) +INSN(ldw, d, dind_dsz_0xx, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 0)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) +INSN(ldw, d, dind_dsz_100, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(src1, mem_offset, 0))) +INSN(ldw, d, dinc_dsz_0xx, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 0)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldw, d, dinc_dsz_100, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldw, d, ddec_dsz_0xx, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 0)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldw, d, ddec_dsz_100, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 1), FIX(sz, 1)), + OP2(ORMEMSW, OWTREG5), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(ptr, reg_ptr, 0), ENC(cst, mem_offset_minus_one, 0))) +INSN(ldw, d, dpp, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREINCR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, + FIX2(FIX(op, 1), FIX(dw, 0)), + OP2(ORMEMSW, OWTREG5), + ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(cst, mem_offset_minus_one, 0))) +INSN(ldw, d, dstk, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE)|TIC6X_FLAG_INSN16_B15PTR, + FIX2(FIX(op, 0x1), FIX(s, 1)), + OP2(ORMEMSW, OWTREG5), + ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 1), + ENC(cst, mem_offset, 0))) +/**/ + +INSN(ll, d, 1_or_2_src, load, C64XP, + TIC6X_FLAG_LOAD|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_SIDE_T2_ONLY|TIC6X_FLAG_NO_CROSS, + FIX3(FIX(s, 1), FIX(op, 0xc), FIX(src1, 0)), + OP2(ORMEMDW, OWDREG5), + ENC2(ENC(src2, reg, 0), ENC(dst, reg, 1))) + +INSNE(lmbd, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x6b)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(lmbd, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x6a)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(max2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x42)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(max2, s, ext_1_or_2_src, 1cycle, C64XP, 0, + FIX1(FIX(op, 0xd)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(maxu4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x43)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(min2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x41)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(min2, s, ext_1_or_2_src, 1cycle, C64XP, 0, + FIX1(FIX(op, 0xc)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(minu4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x48)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(mpy, m_sl16_xsl16_si, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x19)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(mpy, m_s5_xsl16_si, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x18)), + OP3(OACST, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16-bit insn. */ +INSN(mpy, m, m3_sat_0, 1616_m, C67X, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) + +INSN(mpydp, m, mpy, mpydp, C67X, 0, + FIX1(FIX(op, 0x0e)), + OP3(ORREGD1234, ORXREGD1324, OWREGD910), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyh, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x01)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(mpyh, m, m3_sat_0, 1616_m, C67X, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(mpyhi, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x14)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhir, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x10)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhl, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x09)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(mpyhl, m, m3_sat_0, 1616_m, C67X, 0, + FIX1(FIX(op, 0x3)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(mpyhlu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x0f)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhslu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x0b)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhsu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x03)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x07)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhuls, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x0d)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyhus, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x05)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(mpyi, m_si_xsi_si, m, mpy, mpyi, C67X, 0, + FIX1(FIX(op, 0x04)), + OP3(ORREG14, ORXREG14, OWREG9), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(mpyi, m_s5_xsi_si, m, mpy, mpyi, C67X, 0, + FIX1(FIX(op, 0x06)), + OP3(OACST, ORXREG14, OWREG9), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(mpyid, m_si_xsi_sll, m, mpy, mpyid, C67X, 0, + FIX1(FIX(op, 0x08)), + OP3(ORREG14, ORXREG14, OWREGD910), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(mpyid, m_s5_xsi_sll, m, mpy, mpyid, C67X, 0, + FIX1(FIX(op, 0x0c)), + OP3(OACST, ORXREG14, OWREGD910), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyih, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x14)), + OP3(ORXREG1, ORREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyihr, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x10)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyil, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x15)), + OP3(ORXREG1, ORREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyilr, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x0e)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(mpylh, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x11)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(mpylh, m, m3_sat_0, 1616_m, C67X, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(mpylhu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x17)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyli, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x15)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpylir, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x0e)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpylshu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x13)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyluhs, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x15)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpysp, m, mpy, 4cycle, C67X, 0, + FIX1(FIX(op, 0x1c)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* Contrary to SPRU733A, MPYSPDP and MPYSP2DP are on both C67X and + C67X+. */ +INSN(mpyspdp, m, compound, mpyspdp, C67X, 0, + FIX1(FIX(op, 0x16)), + OP3(ORREG12, ORXREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpysp2dp, m, compound, mpyspdp, C67X, 0, + FIX1(FIX(op, 0x17)), + OP3(ORREG1, ORXREG1, OWREGD45), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(mpysu, m_sl16_xul16_si, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x1b)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(mpysu, m_s5_xul16_si, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x1e)), + OP3(OACST, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpysu4, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x05)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyu, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x1f)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyu4, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x04)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyus, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x1d)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpyus4, m, compound, 4cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x05)), + OP3(ORXREG1, ORREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(mpy2, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x00)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpy2ir, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x0f)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(mpy32, 32_32_32, m, mpy, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x10)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(mpy32, 32_32_64, m, mpy, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x14)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpy32su, m, mpy, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x16)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpy32u, m, compound, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x18)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(mpy32us, m, compound, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x19)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* "or" forms of "mv" are preferred over "add" forms when available + because "or" uses less power. However, 40-bit moves are only + available through "add", and before C64X D-unit moves are only + available through "add" (without cross paths being available). */ +INSNE(mv, l_xui_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x7e), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSNE(mv, l_sl_sl, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, + FIX3(FIX(op, 0x20), FIX(x, 0), FIX(src1, 0)), + OP2(ORREGL1, OWREGL1), + ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) +INSNE(mv, s_xui_ui, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x1a), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSNE(mv, d_si_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(0), + FIX2(FIX(op, 0x12), FIX(src1, 0)), + OP2(ORREG1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) +INSNE(mv, d_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 0x3), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSNU(mv, l, lsdmvto, 1cycle, C64X, 0, + FIX1(FIX(unit, 0x0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) + +INSNU(mv, s, lsdmvto, 1cycle, C64X, 0, + FIX1(FIX(unit, 0x1)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) + +INSNU(mv, d, lsdmvto, 1cycle, C64X, 0, + FIX1(FIX(unit, 0x2)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) + +INSNU(mv, l, lsdmvfr, 1cycle, C64X, 0, + FIX1(FIX(unit, 0x0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) + +INSNU(mv, s, lsdmvfr, 1cycle, C64X, 0, + FIX1(FIX(unit, 0x1)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) + +INSNU(mv, d, lsdmvfr, 1cycle, C64X, 0, + FIX1(FIX(unit, 0x2)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(x, xpath, 0), ENC(dst, reg, 1))) +/**/ + +INSNE(mvc, from_cr, s, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_NO_CROSS, + FIX3(FIX(s, 1), FIX(op, 0x0f), FIX(x, 0)), + OP2(ORCREG1, OWREG1), + ENC3(ENC(src1, crhi, 0), ENC(src2, crlo, 0), ENC(dst, reg, 1))) +INSNE(mvc, to_cr, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_SIDE_B_ONLY, + FIX2(FIX(s, 1), FIX(op, 0x0e)), + OP2(ORXREG1, OWCREG1), + ENC4(ENC(x, xpath, 0), ENC(src2, reg, 0), ENC(src1, crhi, 1), + ENC(dst, crlo, 1))) + +/* 16 bits insn */ +INSN(mvc, s, sx1, 1cycle, C64XP, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x6)), + OP2(ORREG1B, OWILC1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 0))) +/**/ + +INSN(mvd, m, unary, 4cycle, C64X, 0, + FIX1(FIX(op, 0x1a)), + OP2(ORXREG1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(mvk, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(h, 0)), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, scst, 0), ENC(dst, reg, 1))) +INSN(mvk, l, unary, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(x, 0), FIX(op, 0x05)), + OP2(OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src2, scst, 0), ENC(dst, reg, 1))) +INSN(mvk, d, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x00), FIX(src2, 0)), + OP2(OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src1, scst, 0), ENC(dst, reg, 1))) + +/* 16 bits insn */ +INSN(mvk, l, lx5, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, scst, 0), ENC(dst, reg, 1))) +INSN(mvk, s, smvk8, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX0(), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) +INSNU(mvk, l, lsdx1c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_SPRED, + FIX1(FIX(unit, 0x0)), + OP2(OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) +INSNU(mvk, s, lsdx1c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_SPRED, + FIX1(FIX(unit, 0x1)), + OP2(OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) +INSNU(mvk, d, lsdx1c, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_SPRED, + FIX1(FIX(unit, 0x2)), + OP2(OACST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, ucst, 0), ENC(dst, reg, 1))) +INSNUE(mvk, zero, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0), FIX(unit, 0x0)), + OP2(OHWCST0, OWREG1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) +INSNUE(mvk, zero, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0), FIX(unit, 0x1)), + OP2(OHWCST0, OWREG1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) +INSNUE(mvk, zero, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0), FIX(unit, 0x2)), + OP2(OHWCST0, OWREG1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) +INSNUE(mvk, one, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 1), FIX(unit, 0x0)), + OP2(OHWCST1, OWREG1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) +INSNUE(mvk, one, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 1), FIX(unit, 0x1)), + OP2(OHWCST1, OWREG1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) +INSNUE(mvk, one, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 1), FIX(unit, 0x2)), + OP2(OHWCST1, OWREG1), + ENC2(ENC(s, fu, 0), ENC(srcdst, reg, 1))) +/**/ + +INSN(mvkh, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(h, 1)), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, lcst_high16, 0), ENC(dst, reg, 1))) + +INSN(mvklh, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, + FIX1(FIX(h, 1)), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, lcst_low16, 0), ENC(dst, reg, 1))) + +INSN(mvkl, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, + FIX1(FIX(h, 0)), + OP2(OLCST, OWREG1), + ENC3(ENC(s, fu, 0), ENC(cst, lcst_low16, 0), ENC(dst, reg, 1))) + +INSNE(neg, s_xsi_si, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x16), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSNE(neg, l_xsi_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x06), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSNE(neg, l_sl_sl, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x24), FIX(src1, 0)), + OP2(ORREGL1, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(nop, nfu, nop_idle, nop, C62X, 0, + FIX2(FIX(s, 0), RAN(op, 0, 8)), + OP1(OACST), + ENC1(ENC(op, ucst_minus_one, 0))) +INSNE(nop, 1, nfu, nop_idle, nop, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(s, 0), FIX(op, 0)), + OP0(), + ENC0()) + +/* 16 bits insn */ +/* contrary to sprufe8b.pdf p767, and accordingly to + * dis6x.exe output, unop3 opcode is decoded as NOP N3 + 1 */ +INSN(nop, nfu, unop, nop, C64XP, 0, + FIX0(), + OP1(OACST), + ENC1(ENC(n, ucst_minus_one, 0))) +/**/ + +INSNE(norm, l_xsi_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX2(FIX(op, 0x63), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSNE(norm, l_sl_ui, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX3(FIX(op, 0x60), FIX(x, 0), FIX(src1, 0)), + OP2(ORREGL1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) + +INSN(not, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x6e), FIX(src1, 0x1f)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSN(not, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x0a), FIX(src1, 0x1f)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSN(not, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0xf), FIX(src1, 0x1f)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSNE(or, d_ui_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(or, d_s5_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x3)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(or, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x7f)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(or, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x7e)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(or, s_ui_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x1b)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(or, s_s5_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x1a)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(or, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 1)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(pack2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(pack2, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0xf)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(packh2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1e)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(packh2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x9)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(packh4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x69)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(packhl2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1c)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(packhl2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x8)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(packlh2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1b)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(packlh2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x10)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(packl4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x68)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(rcpdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x2d), FIX(x, 0)), + OP2(ORREGD1, OWREGD12), + ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), + ENC(dst, reg, 1))) + +INSN(rcpsp, s, 1_or_2_src, 1cycle, C67X, 0, + FIX2(FIX(op, 0x3d), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(ret, s, ext_branch_cond_imm, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, + FIX0(), + OP1(OLCST), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) +INSN(ret, s, branch, branch, C62X, + TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, + FIX1(FIX(s, 1)), + OP1(ORXREG1), + ENC2(ENC(x, xpath, 0), ENC(src2, reg, 0))) +INSN(ret, s, b_irp, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORIRP1), + ENC0()) +INSN(ret, s, b_nrp, branch, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, + FIX3(FIX(s, 1), FIX(x, 0), FIX(dst, 0)), + OP1(ORNRP1), + ENC0()) + +INSN(retp, s, call_imm_nop, branch, C64XP, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MCNOP|TIC6X_FLAG_MACRO|TIC6X_FLAG_RETURN, + FIX1(FIX(z, 1)), + OP2(OLCST, OWRETREG1), + ENC2(ENC(s, fu, 0), ENC(cst, pcrel, 0))) + +INSN(rint, nfu, rint, 1cycle, C64XP, 0, + FIX1(FIX(s, 0)), + OP0(), + ENC0()) + +INSNE(rotl, m_ui_xui_ui, m, compound, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1d)), + OP3(ORXREG1, ORREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(rotl, m_u5_xui_ui, m, compound, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1e)), + OP3(ORXREG1, OACST, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) + +INSN(rpack2, s, ext_1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX2(FIX(op, 0xb), FIX(z, 1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(rsqrdp, s, 1_or_2_src, 2cycle_dp, C67X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x2e), FIX(x, 0)), + OP2(ORREGD1, OWREGD12), + ENC4(ENC(s, fu, 0), ENC(src2, regpair_msb, 0), ENC(src1, regpair_lsb, 0), + ENC(dst, reg, 1))) + +INSN(rsqrsp, s, 1_or_2_src, 1cycle, C67X, 0, + FIX2(FIX(op, 0x3e), FIX(src1, 0)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSNE(sadd, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x13)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sadd, l_xsi_sl_sl, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x31)), + OP3(ORXREG1, ORREGL1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sadd, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x12)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sadd, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x30)), + OP3(OACST, ORREGL1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sadd, s_si_xsi_si, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x20)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(sadd, l, l3_sat_1, 1cycle, C64XP, 0, + FIX1(FIX(op, 0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(sadd, s, s3_sat_1, 1cycle, C64XP,0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(sadd2, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(saddsub, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0e)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(saddsub2, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0f)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(saddsu2, s, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x1)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSN(saddus2, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(saddu4, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x3)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(sat, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX3(FIX(op, 0x40), FIX(x, 0), FIX(src1, 0)), + OP2(ORREGL1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(dst, reg, 1))) + +INSN(set, s, field, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x2)), + OP4(ORREG1, OACST, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(csta, ucst, 1), + ENC(cstb, ucst, 2), ENC(dst, reg, 3))) +INSN(set, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x3b)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(set, s, sc5, 1cycle, C64XP, 0, + FIX1(FIX(op, 1)), + OP4(ORREG1, OACST, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(cst, ucst, 1), + ENC(cst, ucst, 2), ENC(srcdst, reg, 3))) +/**/ + +INSN(shfl, m, unary, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1c)), + OP2(ORXREG1, OWREG2), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(shfl3, l, 1_or_2_src_noncond, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x36)), + OP3(ORREG1, ORXREG1, OWREGD1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(shl, s_xsi_ui_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x33)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(shl, s_sl_ui_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x31), FIX(x, 0)), + OP3(ORREGL1, ORREG1, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(shl, s_xui_ui_ul, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x13)), + OP3(ORXREG1, ORREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(shl, s_xsi_u5_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x32)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) +INSNE(shl, s_sl_u5_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x30), FIX(x, 0)), + OP3(ORREGL1, OACST, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) +INSNE(shl, s_xui_u5_ul, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x12)), + OP3(ORXREG1, OACST, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) + +/* 16bit insn */ +INSN(shl, s, s3i, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(cst, cst_s3i, 1), ENC(dst, reg, 2))) +INSN(shl, s, ssh5_sat_x, 1cycle, C64XP, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), + ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) +INSN(shl, s, s2sh, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), + ENC(srcdst, reg, 2))) +/**/ + +INSN(shlmb, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x61)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(shlmb, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x9)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(shr, s_xsi_ui_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x37)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(shr, s_sl_ui_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x35), FIX(x, 0)), + OP3(ORREGL1, ORREG1, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(shr, s_xsi_u5_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x36)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) +INSNE(shr, s_sl_u5_sl, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x34), FIX(x, 0)), + OP3(ORREGL1, OACST, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) + +/* 16bit insn */ +INSN(shr, s, s3i, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(cst, cst_s3i, 1), ENC(dst, reg, 2))) +INSN(shr, s, ssh5_sat_x, 1cycle, C64XP, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), + ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) +INSN(shr, s, s2sh, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), + ENC(srcdst, reg, 2))) +/**/ + +INSNE(shr2, s_xs2_ui_s2, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x7)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(shr2, s_xs2_u5_s2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x18)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) + +INSN(shrmb, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x62)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(shrmb, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0xa)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(shru, s_xui_ui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x27)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(shru, s_ul_ui_ul, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x25), FIX(x, 0)), + OP3(ORREGL1, ORREG1, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(shru, s_xui_u5_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x26)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) +INSNE(shru, s_ul_u5_ul, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x24), FIX(x, 0)), + OP3(ORREGL1, OACST, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(shru, s, ssh5_sat_0, 1cycle, C64XP, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), + ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) +INSN(shru, s, s2sh, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), + ENC(srcdst, reg, 2))) +/**/ + +INSNE(shru2, s_xu2_ui_u2, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x8)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(shru2, s_xu2_u5_u2, s, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x19)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) + +INSN(sl, d, 1_or_2_src, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_SIDE_T2_ONLY|TIC6X_FLAG_NO_CROSS, + FIX3(FIX(s, 1), FIX(op, 0xd), FIX(src1, 0)), + OP2(ORDREG1, OWMEMDW), + ENC2(ENC(dst, reg, 0), ENC(src2, reg, 1))) + +INSN(smpy, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x1a)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(smpy, m, m3_sat_1, 1616_m, C67X, 0, + FIX1(FIX(op, 0x0)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(smpyh, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x02)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(smpyh, m, m3_sat_1, 1616_m, C67X, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(smpyhl, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x0a)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(smpyhl, m, m3_sat_1, 1616_m, C67X, 0, + FIX1(FIX(op, 0x3)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(smpylh, m, mpy, 1616_m, C62X, 0, + FIX1(FIX(op, 0x12)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(smpylh, m, m3_sat_1, 1616_m, C67X, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORXREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg_shift, 2))) +/**/ + +INSN(smpy2, m, compound, 4cycle, C64X, 0, + FIX1(FIX(op, 0x01)), + OP3(ORREG1, ORXREG1, OWREGD4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* Contrary to SPRUFE8, this is the correct operand order for this + instruction. */ +INSN(smpy32, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x19)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(spack2, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(spacku4, s, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x4)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(spdp, s, 1_or_2_src, 2cycle_dp, C67X, 0, + FIX2(FIX(op, 0x02), FIX(src1, 0)), + OP2(ORXREG1, OWREGD12), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(spint, l, 1_or_2_src, 4cycle, C67X, 0, + FIX2(FIX(op, 0x0a), FIX(src1, 0)), + OP2(ORXREG1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSNE(spkernel, nfu_2, nfu, spkernel, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL, + FIX1(FIX(s, 0)), + OP2(OACST, OACST), + ENC2(ENC(fstgfcyc, fstg, 0), ENC(fstgfcyc, fcyc, 1))) +INSNE(spkernel, nfu_0, nfu, spkernel, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL|TIC6X_FLAG_MACRO, + FIX2(FIX(s, 0), FIX(fstgfcyc, 0)), + OP0(), + ENC0()) + +/* 16 bits insn */ +INSN(spkernel, nfu, uspk, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL, + FIX0(), + OP2(OACST, OACST), + ENC2(ENC(fstgfcyc, fstg, 0), ENC(fstgfcyc, fcyc, 1))) +/**/ + +INSN(spkernelr, nfu, spkernelr, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPKERNEL, + FIX1(FIX(s, 0)), + OP0(), + ENC0()) + +INSN(sploop, nfu, loop_buffer, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, + FIX4(FIX(s, 0), FIX(op, 0xc), FIX(csta, 0), RAN(cstb, 0, 13)), + OP1(OACST), + ENC1(ENC(cstb, ucst_minus_one, 0))) + +INSN(sploopd, nfu, loop_buffer, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, + FIX4(FIX(s, 0), FIX(op, 0xd), FIX(csta, 0), RAN(cstb, 0, 13)), + OP1(OACST), + ENC1(ENC(cstb, ucst_minus_one, 0))) + +INSN(sploopw, nfu, loop_buffer, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, + FIX4(FIX(s, 0), FIX(op, 0xf), FIX(csta, 0), RAN(cstb, 0, 13)), + OP1(OACST), + ENC1(ENC(cstb, ucst_minus_one, 0))) + +/* 16 bits insn */ +INSN(sploop, nfu, uspl, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, + FIX1(FIX(op, 0)), + OP1(OACST), + ENC1(ENC(ii, ucst_minus_one, 0))) + +INSN(sploopd, nfu, uspl, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP, + FIX1(FIX(op, 1)), + OP1(OACST), + ENC1(ENC(ii, ucst_minus_one, 0))) + +INSN(sploopd, nfu, uspldr, 1cycle, C64XP, + TIC6X_FLAG_FIRST|TIC6X_FLAG_NO_MCNOP|TIC6X_FLAG_SPLOOP|TIC6X_FLAG_INSN16_SPRED, + FIX0(), + OP1(OACST), + ENC1(ENC(ii, ucst_minus_one, 0))) +/**/ + + +/* Contrary to SPRUFE8, this is the correct encoding for this + instruction. */ +INSN(spmask, nfu, spmask, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, + FIX2(FIX(s, 0), FIX(op, 0x8)), + OP1(OFULIST), + ENC1(ENC(mask, spmask, 0))) + +/* 16 bits insn */ +INSN(spmask, nfu, uspma, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, + FIX0(), + OP1(OFULIST), + ENC1(ENC(mask, spmask, 0))) +/**/ + +INSN(spmaskr, nfu, spmask, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, + FIX2(FIX(s, 0), FIX(op, 0x9)), + OP1(OFULIST), + ENC1(ENC(mask, spmask, 0))) + +/* 16 bits insn */ +INSN(spmaskr, nfu, uspmb, 1cycle, C64XP, TIC6X_FLAG_FIRST|TIC6X_FLAG_SPMASK, + FIX0(), + OP1(OFULIST), + ENC1(ENC(mask, spmask, 0))) +/**/ + +INSN(sptrunc, l, 1_or_2_src, 4cycle, C67X, 0, + FIX2(FIX(op, 0x0b), FIX(src1, 0)), + OP2(ORXREG1, OWREG4), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSNE(sshl, s_xsi_ui_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x23)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(sshl, s_xsi_u5_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x22)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, ucst, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(sshl, s, ssh5_sat_1, 1cycle, C64XP, + TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), + ENC(cst, ucst, 1), ENC(srcdst, reg, 2))) +INSN(sshl, s, s2sh, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x3)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(src1, reg, 1), + ENC(srcdst, reg, 2))) +/**/ + +INSN(sshvl, m, compound, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1c)), + OP3(ORXREG1, ORREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +/* Contrary to SPRUFE8, this is the correct encoding for this + instruction. */ +INSN(sshvr, m, compound, 1616_m, C64X, 0, + FIX1(FIX(op, 0x1a)), + OP3(ORXREG1, ORREG1, OWREG2), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSNE(ssub, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x0f)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(ssub, l_xsi_si_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x1f)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(ssub, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x0e)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(ssub, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x2c)), + OP3(OACST, ORREGL1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(ssub, l, l3_sat_1, 1cycle, C64XP, 0, + FIX1(FIX(op, 1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/**/ + +INSN(ssub2, l, 1_or_2_src, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x64)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(stb, d, load_store, store, C62X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 3), FIX(r, 0)), + OP2(ORDREG1, OWMEMSB), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), + ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), + ENC(srcdst, reg, 0))) +INSN(stb, d, load_store_long, store, C62X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 3)), + OP2(ORDREG1, OWMEMLB), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 1), ENC(offsetR, ulcst_dpr_byte, 1), + ENC(dst, reg, 0))) + +/* 16 bits insn */ +INSN(stb, d, doff4_dsz_000, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(stb, d, doff4_dsz_x01, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(stb, d, dind_dsz_000, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 1), + ENC(ptr, reg_ptr, 1), ENC(srcdst, reg, 0))) +INSN(stb, d, dind_dsz_x01, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 1), + ENC(ptr, reg_ptr, 1), ENC(srcdst, reg, 0))) +INSN(stb, d, dinc_dsz_000, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stb, d, dinc_dsz_x01, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stb, d, ddec_dsz_000, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stb, d, ddec_dsz_x01, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSB), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +/**/ + +INSN(stdw, d, load_store, store, C64X, TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 4), FIX(r, 1)), + OP2(ORDREGD1, OWMEMSD), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), + ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), + ENC(srcdst, reg, 0))) + +/* 16 bits insn */ +INSN(stdw, d, dpp, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTDECR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, + FIX3(FIX(op, 0), FIX(dw, 1), FIX(s, 1)), + OP2(ORTREGD1, OWMEMSD), + ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(cst, mem_offset_minus_one, 1))) +INSN(stdw, d, ddecdw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMSD), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stdw, d, dincdw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMSD), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stdw, d, dinddw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMSD), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset, 1), + ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) +INSN(stdw, d, doff4dw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX3(FIX(op, 0), FIX(na, 0), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMSD), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset, 1), + ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) +/**/ + +INSN(sth, d, load_store, store, C62X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 5), FIX(r, 0)), + OP2(ORDREG1, OWMEMSH), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), + ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), + ENC(srcdst, reg, 0))) +INSN(sth, d, load_store_long, store, C62X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 5)), + OP2(ORDREG1, OWMEMLH), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 1), ENC(offsetR, ulcst_dpr_half, 1), + ENC(dst, reg, 0))) + +/* 16 bits insn */ +INSN(sth, d, doff4_dsz_01x, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(sth, d, doff4_dsz_111, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(sth, d, dind_dsz_01x, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) +INSN(sth, d, dind_dsz_111, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) +INSN(sth, d, dinc_dsz_01x, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(sth, d, dinc_dsz_111, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(sth, d, ddec_dsz_01x, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(sth, d, ddec_dsz_111, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSH), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +/**/ + +INSN(stndw, d, store_nonaligned, store, C64X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, + FIX0(), + OP2(ORDREGD1, OWMEMND), + ENC7(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), + ENC(offsetR, mem_offset_noscale, 1), ENC(baseR, reg, 1), + ENC(sc, scaled, 1), ENC(src, reg_shift, 0))) + +/* 16 bits insn */ +INSN(stndw, d, ddecdw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMND), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one_noscale, 1))) +INSN(stndw, d, dincdw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMND), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg_shift, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one_noscale, 1))) +INSN(stndw, d, dinddw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMND), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(src1, mem_offset_noscale, 1), + ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) +INSN(stndw, d, doff4dw, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX3(FIX(op, 0), FIX(na, 1), FIX(sz, 0)), + OP2(ORTREGD1, OWMEMND), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(cst, mem_offset_noscale, 1), + ENC(ptr, reg_ptr, 1), ENC(srcdst, reg_shift, 0))) +/**/ + +INSN(stnw, d, load_store, store, C64X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_UNALIGNED, + FIX2(FIX(op, 5), FIX(r, 1)), + OP2(ORDREG1, OWMEMSW), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), + ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), + ENC(srcdst, reg, 0))) + +/* 16 bits insn */ +INSN(stnw, d, doff4_dsz_110, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(stnw, d, dind_dsz_110, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) +INSN(stnw, d, dinc_dsz_110, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stnw, d, ddec_dsz_110, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +/**/ + +INSN(stw, d, load_store, store, C62X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX2(FIX(op, 7), FIX(r, 0)), + OP2(ORDREG1, OWMEMSW), + ENC6(ENC(s, data_fu, 0), ENC(y, fu, 0), ENC(mode, mem_mode, 1), + ENC(offsetR, mem_offset, 1), ENC(baseR, reg, 1), + ENC(srcdst, reg, 0))) +INSN(stw, d, load_store_long, store, C62X, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_SIDE_B_ONLY|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 7)), + OP2(ORDREG1, OWMEMLW), + ENC4(ENC(s, data_fu, 0), ENC(y, areg, 1), ENC(offsetR, ulcst_dpr_word, 1), + ENC(dst, reg, 0))) + +/* 16 bits insn */ +INSN(stw, d, doff4_dsz_0xx, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 0)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(stw, d, doff4_dsz_100, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset, 1))) +INSN(stw, d, dind_dsz_0xx, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 0)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) +INSN(stw, d, dind_dsz_100, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(REG_POSITIVE), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(src1, mem_offset, 1))) +INSN(stw, d, dinc_dsz_0xx, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 0)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stw, d, dinc_dsz_100, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTINCR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stw, d, ddec_dsz_0xx, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 0)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stw, d, ddec_dsz_100, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(PREDECR), + FIX2(FIX(op, 0), FIX(sz, 1)), + OP2(ORTREG1, OWMEMSW), + ENC5(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(ptr, reg_ptr, 1), ENC(cst, mem_offset_minus_one, 1))) +INSN(stw, d, dpp, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSTDECR)|TIC6X_FLAG_INSN16_B15PTR|TIC6X_FLAG_INSN16_NORS, + FIX2(FIX(op, 0), FIX(dw, 0)), + OP2(ORTREG1, OWMEMSW), + ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(cst, mem_offset_minus_one, 1))) +INSN(stw, d, dstk, store, C64XP, + TIC6X_FLAG_STORE|TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_INSN16_MEM_MODE(POSITIVE)|TIC6X_FLAG_INSN16_B15PTR, + FIX2(FIX(op, 0x0), FIX(s, 1)), + OP2(ORTREG1, OWMEMSW), + ENC4(ENC(s, fu, 0), ENC(t, rside, 0), ENC(srcdst, reg, 0), + ENC(cst, mem_offset, 1))) +/**/ + +INSNE(sub, l_si_xsi_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x07)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, l_xsi_si_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x17)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, l_si_xsi_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x27)), + OP3(ORREG1, ORXREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, l_xsi_si_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x37)), + OP3(ORXREG1, ORREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, l_s5_xsi_si, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x06)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, l_s5_sl_sl, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x24)), + OP3(OACST, ORREGL1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, l_xsi_s5_si, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x2)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst_negate, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(sub, l_sl_s5_sl, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x20), FIX(x, 0)), + OP3(ORREGL1, OACST, OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src1, scst_negate, 1), ENC(src2, reg, 0), + ENC(dst, reg, 2))) +INSNE(sub, s_si_xsi_si, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x17)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, s_s5_xsi_si, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x16)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +/* Contrary to SPRUFE8, this is the correct encoding for this + instruction; this instruction can be predicated. */ +INSNE(sub, s_xsi_si_si, s, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x5)), + OP3(ORXREG1, ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) +INSNE(sub, s_xsi_s5_si, s, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_MACRO, + FIX1(FIX(op, 0x6)), + OP3(ORXREG1, OACST, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst_negate, 1), + ENC(src2, reg, 0), ENC(dst, reg, 2))) +INSNE(sub, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x11)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(sub, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x13)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) +INSNE(sub, d_si_xsi_si, d, ext_1_or_2_src, 1cycle, C64X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0xc)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(sub, l, l3_sat_0, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(sub, l, lx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x2)), + OP3(OHWCST0, ORREG1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) +INSN(sub, s, sx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x2)), + OP3(OHWCST0, ORREG1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 1), ENC(srcdst, reg, 2))) +INSN(sub, s, sx2op, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2), + ENC(src2, reg, 1), ENC(x, xpath, 1))) +INSN(sub, s, s3_sat_x, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(sub, d, dx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +INSN(sub, d, dx2op, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x1)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(srcdst, reg, 0), + ENC(src2, reg, 1), ENC(srcdst, reg, 2))) +/**/ + +INSNE(subab, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x31)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(subab, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x33)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) + +INSN(subabs4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x5a)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(subah, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x35)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(subah, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x37)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) + +INSNE(subaw, d_si_si_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x39)), + OP3(ORREG1, ORREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, reg, 1), + ENC(dst, reg, 2))) +INSNE(subaw, d_si_u5_si, d, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_NO_CROSS, + FIX1(FIX(op, 0x3b)), + OP3(ORREG1, OACST, OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg, 0), ENC(src1, ucst, 1), + ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(subaw, d, dx5p, 1cycle, C64XP, 0, + FIX1(FIX(op, 1)), + OP3(ORB15REG1, OACST, OWB15REG1), + ENC2(ENC(s, fu, 0), ENC(cst, ucst, 1))) +/**/ + +INSN(subc, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x4b)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSNE(subdp, l_dp_xdp_dp, l, 1_or_2_src, addsubdp, C67X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x19)), + OP3(ORREGD12, ORXREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subdp, l_xdp_dp_dp, l, 1_or_2_src, addsubdp, C67X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x1d)), + OP3(ORXREGD12, ORREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subdp, s_dp_xdp_dp, s, l_1_or_2_src, addsubdp, C67XP, + TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x73)), + OP3(ORREGD12, ORXREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subdp, s_xdp_dp_dp, s, l_1_or_2_src, addsubdp, C67XP, + TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x77)), + OP3(ORXREGD12, ORREGD12, OWREGD67), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSNE(subsp, l_sp_xsp_sp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x11)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subsp, l_xsp_sp_sp, l, 1_or_2_src, 4cycle, C67X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x15)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subsp, s_sp_xsp_sp, s, l_1_or_2_src, 4cycle, C67XP, + TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x71)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subsp, s_xsp_sp_sp, s, l_1_or_2_src, 4cycle, C67XP, + TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x75)), + OP3(ORXREG1, ORREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(src1, reg, 1), ENC(dst, reg, 2))) + +INSNE(subu, l_ui_xui_ul, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(1), + FIX1(FIX(op, 0x2f)), + OP3(ORREG1, ORXREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(subu, l_xui_ui_ul, l, 1_or_2_src, 1cycle, C62X, TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x3f)), + OP3(ORXREG1, ORREG1, OWREGL1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(sub2, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x04)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(sub2, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x11)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSN(sub2, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x5)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(sub4, l, 1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0x66)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(swap2, l, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x1b), FIX(x, 0)), + OP2(ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 0), ENC(dst, reg, 1))) +INSN(swap2, s, 1_or_2_src, 1cycle, C64X, TIC6X_FLAG_MACRO|TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x10), FIX(x, 0)), + OP2(ORREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 0), ENC(dst, reg, 1))) + +/* Contrary to SPRUFE8, this is the correct encoding for this + instruction. */ +INSN(swap4, l, unary, 1cycle, C64X, 0, + FIX1(FIX(op, 0x1)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(swe, nfu, swe, 1cycle, C64XP, 0, + FIX1(FIX(s, 0)), + OP0(), + ENC0()) + +INSN(swenr, nfu, swenr, 1cycle, C64XP, 0, + FIX1(FIX(s, 0)), + OP0(), + ENC0()) + +INSN(unpkhu4, l, unary, 1cycle, C64X, 0, + FIX1(FIX(op, 0x03)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSN(unpkhu4, s, unary, 1cycle, C64X, 0, + FIX1(FIX(op, 0x03)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(unpklu4, l, unary, 1cycle, C64X, 0, + FIX1(FIX(op, 0x02)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) +INSN(unpklu4, s, unary, 1cycle, C64X, 0, + FIX1(FIX(op, 0x02)), + OP2(ORXREG1, OWREG1), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSNE(xor, l_ui_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x6f)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(xor, l_s5_xui_ui, l, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x6e)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(xor, s_ui_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x0b)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(xor, s_s5_xui_ui, s, 1_or_2_src, 1cycle, C62X, 0, + FIX1(FIX(op, 0x0a)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(xor, d_ui_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0xe)), + OP3(ORREG1, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNE(xor, d_s5_xui_ui, d, ext_1_or_2_src, 1cycle, C64X, 0, + FIX1(FIX(op, 0xf)), + OP3(OACST, ORXREG1, OWREG1), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, scst, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +/* 16 bits insn */ +INSN(xor, l, l2c, 1cycle, C64XP, 0, + FIX1(FIX(op, 0x2)), + OP3(ORREG1, ORXREG1, OWREG1NORS), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) +INSNU(xor, l, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x7), FIX(unit, 0x0)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +INSNU(xor, s, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x7), FIX(unit, 0x1)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +INSNU(xor, d, lsdx1, 1cycle, C64XP, TIC6X_FLAG_NO_CROSS, + FIX2(FIX(op, 0x7), FIX(unit, 0x2)), + OP3(ORREG1, OHWCST1, OWREG1), + ENC3(ENC(s, fu, 0), ENC(srcdst, reg, 0), ENC(srcdst, reg, 2))) +/**/ + +INSN(xormpy, m, 1_or_2_src, 4cycle, C64XP, 0, + FIX1(FIX(op, 0x1b)), + OP3(ORREG1, ORXREG1, OWREG4), + ENC5(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src1, reg, 0), + ENC(src2, reg, 1), ENC(dst, reg, 2))) + +INSN(xpnd2, m, unary, 1616_m, C64X, 0, + FIX1(FIX(op, 0x19)), + OP2(ORXREG1, OWREG2), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(xpnd4, m, unary, 1616_m, C64X, 0, + FIX1(FIX(op, 0x18)), + OP2(ORXREG1, OWREG2), + ENC4(ENC(s, fu, 0), ENC(x, xpath, 0), ENC(src2, reg, 0), + ENC(dst, reg, 1))) + +INSN(zero, s, mvk, 1cycle, C62X, TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, + FIX2(FIX(h, 0), FIX(cst, 0)), + OP1(OWREG1), + ENC2(ENC(s, fu, 0), ENC(dst, reg, 0))) +INSN(zero, l, unary, 1cycle, C64X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(1), + FIX3(FIX(x, 0), FIX(op, 0x05), FIX(src2, 0)), + OP1(OWREG1), + ENC2(ENC(s, fu, 0), ENC(dst, reg, 0))) +INSNE(zero, l_sub, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), + FIX2(FIX(op, 0x07), FIX(x, 0)), + OP1(OWREG1), + ENC4(ENC(s, fu, 0), ENC(src1, reg_unused, 0), ENC(src2, reg_unused, 0), + ENC(dst, reg, 0))) +INSNE(zero, l_sub_sl, l, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO, + FIX2(FIX(op, 0x27), FIX(x, 0)), + OP1(OWREGL1), + ENC4(ENC(s, fu, 0), ENC(src1, reg_unused, 0), ENC(src2, reg_unused, 0), + ENC(dst, reg, 0))) +INSNE(zero, d_mvk, d, 1_or_2_src, 1cycle, C64X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(1), + FIX3(FIX(op, 0x00), FIX(src1, 0), FIX(src2, 0)), + OP1(OWREG1), + ENC2(ENC(s, fu, 0), ENC(dst, reg, 0))) +INSNE(zero, d_sub, d, 1_or_2_src, 1cycle, C62X, + TIC6X_FLAG_NO_CROSS|TIC6X_FLAG_MACRO|TIC6X_FLAG_PREFER(0), + FIX1(FIX(op, 0x11)), + OP1(OWREG1), + ENC4(ENC(s, fu, 0), ENC(src2, reg_unused, 0), ENC(src1, reg_unused, 0), + ENC(dst, reg, 0))) + +#undef TIC6X_INSN_C64X_AND_C67X +#undef tic6x_insn_format_nfu_s_branch_nop_cst +#undef tic6x_insn_format_s_l_1_or_2_src +#undef RAN +#undef FIX +#undef FIX0 +#undef FIX1 +#undef FIX2 +#undef FIX3 +#undef FIX4 +#undef OP0 +#undef OP1 +#undef OP2 +#undef OP3 +#undef OP4 +#undef OACST +#undef OLCST +#undef OHWCSTM1 +#undef OHWCST0 +#undef OHWCST1 +#undef OHWCST5 +#undef OHWCST16 +#undef OHWCST24 +#undef OHWCST31 +#undef OFULIST +#undef ORIRP1 +#undef ORNRP1 +#undef OWREG1 +#undef OWRETREG1 +#undef ORREG1 +#undef ORDREG1 +#undef ORWREG1 +#undef ORAREG1 +#undef ORXREG1 +#undef ORREG12 +#undef ORREG14 +#undef ORXREG14 +#undef OWREG2 +#undef OWREG4 +#undef OWREG9 +#undef OWDREG5 +#undef OWREGL1 +#undef ORREGL1 +#undef OWREGD1 +#undef ORTREG1 +#undef ORTREGD1 +#undef OWTREG5 +#undef OWTREGD5 +#undef OWREGD12 +#undef OWREGD4 +#undef ORREGD1 +#undef OWREGD45 +#undef OWREGD67 +#undef ORDREGD1 +#undef OWDREGD5 +#undef ORREGD12 +#undef ORXREGD12 +#undef ORXREGD1234 +#undef ORREGD1324 +#undef OWREGD910 +#undef OWILC1 +#undef ORCREG1 +#undef OWCREG1 +#undef OWREG1Z +#undef ORB15REG1 +#undef OWB15REG1 +#undef ORMEMDW +#undef OWMEMDW +#undef ORMEMSB +#undef OWMEMSB +#undef ORMEMLB +#undef OWMEMLB +#undef ORMEMSH +#undef OWMEMSH +#undef ORMEMLH +#undef OWMEMLH +#undef ORMEMSW +#undef OWMEMSW +#undef ORMEMLW +#undef OWMEMLW +#undef ORMEMSD +#undef OWMEMSD +#undef ORMEMND +#undef OWMEMND +#undef ENC +#undef ENC0 +#undef ENC1 +#undef ENC2 +#undef ENC3 +#undef ENC4 +#undef ENC5 +#undef ENC6 +#undef ENC7 diff --git a/include/opcode/tic6x.h b/include/opcode/tic6x.h new file mode 100644 index 0000000..d76c5e1 --- /dev/null +++ b/include/opcode/tic6x.h @@ -0,0 +1,718 @@ +/* TI C6X opcode information. + Copyright 2010-2013 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef OPCODE_TIC6X_H +#define OPCODE_TIC6X_H + +#include "bfd.h" +#include "symcat.h" + +/* A field in an instruction format. The names are based on those + used in the architecture manuals. */ +typedef enum + { + tic6x_field_baseR, + tic6x_field_cc, + tic6x_field_creg, + tic6x_field_cst, + tic6x_field_csta, + tic6x_field_cstb, + tic6x_field_dst, + tic6x_field_dstms, + tic6x_field_dw, + tic6x_field_fstgfcyc, + tic6x_field_h, + tic6x_field_ii, + tic6x_field_mask, + tic6x_field_mode, + tic6x_field_n, + tic6x_field_na, + tic6x_field_offsetR, + tic6x_field_op, + tic6x_field_p, + tic6x_field_ptr, + tic6x_field_r, + tic6x_field_s, + tic6x_field_sc, + tic6x_field_src, + tic6x_field_src1, + tic6x_field_src2, + tic6x_field_srcdst, + tic6x_field_srcms, + tic6x_field_sn, + tic6x_field_sz, + tic6x_field_unit, + tic6x_field_t, + tic6x_field_x, + tic6x_field_y, + tic6x_field_z + } tic6x_insn_field_id; + +typedef struct +{ + /* The least-significant bit position in the field. */ + unsigned short low_pos; + + /* The number of bits in the field. */ + unsigned short width; + /* The position of the bitfield in the field. */ + unsigned short pos; +} tic6x_bitfield; + +/* Maximum number of subfields in composite field. */ +#define TIC6X_MAX_BITFIELDS 4 + +typedef struct +{ + /* The name used to reference the field. */ + tic6x_insn_field_id field_id; + unsigned int num_bitfields; + tic6x_bitfield bitfields[TIC6X_MAX_BITFIELDS]; +} tic6x_insn_field; + +/* Maximum number of variable fields in an instruction format. */ +#define TIC6X_MAX_INSN_FIELDS 11 + +/* A particular instruction format. */ +typedef struct +{ + /* How many bits in the instruction. */ + unsigned int num_bits; + + /* Constant bits in the instruction. */ + unsigned int cst_bits; + + /* Mask matching those bits. */ + unsigned int mask; + + /* The number of instruction fields. */ + unsigned int num_fields; + + /* Descriptions of instruction fields. */ + tic6x_insn_field fields[TIC6X_MAX_INSN_FIELDS]; +} tic6x_insn_format; + +/* An index into the table of instruction formats. */ +typedef enum + { +#define FMT(name, num_bits, cst_bits, mask, fields) \ + CONCAT2(tic6x_insn_format_, name), +#include "tic6x-insn-formats.h" +#undef FMT + tic6x_insn_format_max + } tic6x_insn_format_id; + +/* The table itself. */ +extern const tic6x_insn_format tic6x_insn_format_table[tic6x_insn_format_max]; + +/* If instruction format FMT has a field FIELD, return a pointer to + the description of that field; otherwise return NULL. */ + +const tic6x_insn_field *tic6x_field_from_fmt (const tic6x_insn_format *fmt, + tic6x_insn_field_id field); + +/* Description of a field (in an instruction format) whose value is + fixed, or constrained to be in a particular range, in a particular + opcode. */ +typedef struct +{ + /* The name of the field. */ + tic6x_insn_field_id field_id; + + /* The least value of the field in this instruction. */ + unsigned int min_val; + + /* The greatest value of the field in this instruction. */ + unsigned int max_val; +} tic6x_fixed_field; + +/* Pseudo opcode fields position for compact instructions + If 16 bits instruction detected, the opcode is enriched + [DSZ/3][BR][SAT][opcode] */ +#define TIC6X_COMPACT_SAT_POS 16 +#define TIC6X_COMPACT_BR_POS 17 +#define TIC6X_COMPACT_DSZ_POS 18 + +/* Bit-masks for defining instructions present on some subset of + processors; each indicates an instruction present on that processor + and those that are supersets of it. The options passed to the + assembler determine a bit-mask ANDed with the bit-mask indicating + when the instruction was added to determine whether the instruction + is enabled. */ +#define TIC6X_INSN_C62X 0x0001 +#define TIC6X_INSN_C64X 0x0002 +#define TIC6X_INSN_C64XP 0x0004 +#define TIC6X_INSN_C67X 0x0008 +#define TIC6X_INSN_C67XP 0x0010 +#define TIC6X_INSN_C674X 0x0020 + +/* Flags with further information about an opcode table entry. */ + +/* Only used by the assembler, not the disassembler. */ +#define TIC6X_FLAG_MACRO 0x0001 + +/* Must be first in its execute packet. */ +#define TIC6X_FLAG_FIRST 0x0002 + +/* Multi-cycle NOP (not used for the NOP n instruction itself, which + is only a multicycle NOP if n > 1). */ +#define TIC6X_FLAG_MCNOP 0x0004 + +/* Cannot be in parallel with a multi-cycle NOP. */ +#define TIC6X_FLAG_NO_MCNOP 0x0008 + +/* Load instruction. */ +#define TIC6X_FLAG_LOAD 0x0010 + +/* Store instruction. */ +#define TIC6X_FLAG_STORE 0x0020 + +/* Unaligned memory operation. */ +#define TIC6X_FLAG_UNALIGNED 0x0040 + +/* Only on side B. */ +#define TIC6X_FLAG_SIDE_B_ONLY 0x0080 + +/* Only on data path T2. */ +#define TIC6X_FLAG_SIDE_T2_ONLY 0x0100 + +/* Does not support cross paths. */ +#define TIC6X_FLAG_NO_CROSS 0x0200 + +/* Annotate this branch instruction as a call. */ +#define TIC6X_FLAG_CALL 0x0400 + +/* Annotate this branch instruction as a return. */ +#define TIC6X_FLAG_RETURN 0x0800 + +/* This instruction starts a software pipelined loop. */ +#define TIC6X_FLAG_SPLOOP 0x1000 + +/* This instruction ends a software pipelined loop. */ +#define TIC6X_FLAG_SPKERNEL 0x2000 + +/* This instruction takes a list of functional units as parameters; + although described as having one parameter, the number may be 0 to + 8. */ +#define TIC6X_FLAG_SPMASK 0x4000 + +/* When more than one opcode matches the assembly source, prefer the + one with the highest value for this bit-field. If two opcode table + entries can match the same syntactic form, they must have different + values here. */ +#define TIC6X_PREFER_VAL(n) (((n) & 0x8000) >> 15) +#define TIC6X_FLAG_PREFER(n) ((n) << 15) + +/* 16 bits opcode is predicated by register a0 (s = 0) or b0 (s = 1) */ +#define TIC6X_FLAG_INSN16_SPRED 0x00100000 +/* 16 bits opcode ignores RS bit of fetch packet header */ +#define TIC6X_FLAG_INSN16_NORS 0x00200000 +/* 16 bits opcode only on side B */ +#define TIC6X_FLAG_INSN16_BSIDE 0x00400000 +/* 16 bits opcode ptr reg is b15 */ +#define TIC6X_FLAG_INSN16_B15PTR 0x00800000 +/* 16 bits opcode memory access modes */ +#define TIC6X_INSN16_MEM_MODE(n) ((n) << 16) +#define TIC6X_INSN16_MEM_MODE_VAL(n) (((n) & 0x000F0000) >> 16) +#define TIC6X_MEM_MODE_NEGATIVE 0 +#define TIC6X_MEM_MODE_POSITIVE 1 +#define TIC6X_MEM_MODE_REG_NEGATIVE 4 +#define TIC6X_MEM_MODE_REG_POSITIVE 5 +#define TIC6X_MEM_MODE_PREDECR 8 +#define TIC6X_MEM_MODE_PREINCR 9 +#define TIC6X_MEM_MODE_POSTDECR 10 +#define TIC6X_MEM_MODE_POSTINCR 11 + +#define TIC6X_FLAG_INSN16_MEM_MODE(mode) TIC6X_INSN16_MEM_MODE(TIC6X_MEM_MODE_##mode) + +#define TIC6X_NUM_PREFER 2 + +/* Maximum number of fixed fields for a particular opcode. */ +#define TIC6X_MAX_FIXED_FIELDS 4 + +/* Maximum number of operands in the opcode table for a particular + opcode. */ +#define TIC6X_MAX_OPERANDS 4 + +/* Maximum number of operands in the source code for a particular + opcode (different from the number in the opcode table for SPMASK + and SPMASKR). */ +#define TIC6X_MAX_SOURCE_OPERANDS 8 + +/* Maximum number of variable fields for a particular opcode. */ +#define TIC6X_MAX_VAR_FIELDS 7 + +/* Which functional units an opcode uses. This only describes the + basic choice of D, L, M, S or no functional unit; other fields are + used to describe further restrictions (instructions only operating + on one side), use of cross paths and load/store instructions using + one side for the address and the other side for the source or + destination register. */ +typedef enum + { + tic6x_func_unit_d, + tic6x_func_unit_l, + tic6x_func_unit_m, + tic6x_func_unit_s, + tic6x_func_unit_nfu + } tic6x_func_unit_base; + +/* Possible forms of source operand. */ +typedef enum + { + /* An assembly-time constant. */ + tic6x_operand_asm_const, + /* A link-time constant. */ + tic6x_operand_link_const, + /* A register, from the same side as the functional unit + selected. */ + tic6x_operand_reg, + /* A register, from the same side as the functional unit + selected that ignore RS header bit */ + tic6x_operand_reg_nors, + /* A register, from the b side */ + tic6x_operand_reg_bside, + /* A register, from the b side and from the low register set */ + tic6x_operand_reg_bside_nors, + /* A register, that is from the other side if a cross path is + used. */ + tic6x_operand_xreg, + /* A register, that is from the side of the data path + selected. */ + tic6x_operand_dreg, + /* An address register usable with 15-bit offsets (B14 or B15). + This is from the same side as the functional unit if a cross + path is not used, and the other side if a cross path is + used. */ + tic6x_operand_areg, + /* The B15 register */ + tic6x_operand_b15reg, + /* A register coded as an offset from either A16 or B16 depending + on the value of the t bit. */ + tic6x_operand_treg, + /* A register (A0 or B0), from the same side as the + functional unit selected. */ + tic6x_operand_zreg, + /* A return address register (A3 or B3), from the same side as the + functional unit selected. */ + tic6x_operand_retreg, + /* A register pair, from the same side as the functional unit + selected. */ + tic6x_operand_regpair, + /* A register pair, that is from the other side if a cross path is + used. */ + tic6x_operand_xregpair, + /* A register pair, from the side of the data path selected. */ + tic6x_operand_dregpair, + /* A register pair coded as an offset from either A16 or B16 depending + on the value of the t bit. */ + tic6x_operand_tregpair, + /* The literal string "irp" (case-insensitive). */ + tic6x_operand_irp, + /* The literal string "nrp" (case-insensitive). */ + tic6x_operand_nrp, + /* The literal string "ilc" (case-insensitive). */ + tic6x_operand_ilc, + /* A control register. */ + tic6x_operand_ctrl, + /* A memory reference (base and offset registers from the side of + the functional unit selected), using either unsigned 5-bit + constant or register offset, if any offset; register offsets + cannot use unscaled () syntax. */ + tic6x_operand_mem_short, + /* A memory reference (base and offset registers from the side of + the functional unit selected), using either unsigned 5-bit + constant or register offset, if any offset; register offsets + can use unscaled () syntax (for LDNDW and STNDW). */ + tic6x_operand_mem_ndw, + /* A memory reference using 15-bit link-time constant offset + relative to B14 or B15. */ + tic6x_operand_mem_long, + /* A memory reference that only dereferences a register with no + further adjustments (*REG), that register being from the side + of the functional unit selected. */ + tic6x_operand_mem_deref, + /* A functional unit name or a list thereof (for SPMASK and + SPMASKR). */ + tic6x_operand_func_unit, + /* Hardwired constant '5' in Sbu8 Scs10 and Sbu8c 16 bits + instruction formats - spru732j.pdf Appendix F.4 */ + tic6x_operand_hw_const_minus_1, + tic6x_operand_hw_const_0, + tic6x_operand_hw_const_1, + tic6x_operand_hw_const_5, + tic6x_operand_hw_const_16, + tic6x_operand_hw_const_24, + tic6x_operand_hw_const_31 + } tic6x_operand_form; + +/* Whether something is, or can be, read or written. */ +typedef enum + { + tic6x_rw_none, + tic6x_rw_read, + tic6x_rw_write, + tic6x_rw_read_write + } tic6x_rw; + +/* Description of a source operand and how it is used. */ +typedef struct +{ + /* The syntactic form of the operand. */ + tic6x_operand_form form; + + /* For non-constant operands, the size in bytes (1, 2, 4, 5 or + 8). Ignored for constant operands. */ + unsigned int size; + + /* Whether the operand is read, written or both. In addition to the + operations described here, address registers are read on cycle 1 + regardless of when the memory operand is read or written, and may + be modified as described by the addressing mode, and control + registers may be implicitly read by some instructions. There are + also some special cases not fully described by this + structure. + + - For mpydp, the low part of src2 is read on cycles 1 and 3 but + not 2, and the high part on cycles 2 and 4 but not 3. + + - The swap2 pseudo-operation maps to packlh2, reading the first + operand of swap2 twice. */ + tic6x_rw rw; + + /* The first and last cycles (1 for E1, etc.) at which the operand, + or the low part for two-register operands, is read or + written. */ + unsigned short low_first; + unsigned short low_last; + + /* Likewise, for the high part. */ + unsigned short high_first; + unsigned short high_last; +} tic6x_operand_info; + +/* Ways of converting an operand or functional unit specifier to a + field value. */ +typedef enum + { + /* Store an unsigned assembly-time constant (which must fit) in + the field. */ + tic6x_coding_ucst, + /* Store a signed constant (which must fit) in the field. This + may be used both for assembly-time constants and for link-time + constants. */ + tic6x_coding_scst, + /* Subtract one from an unsigned assembly-time constant (which + must be strictly positive before the subtraction) and store the + value (which must fit) in the field. */ + tic6x_coding_ucst_minus_one, + /* Negate a signed assembly-time constant, and store the result of + negation (which must fit) in the field. Used only for + pseudo-operations. */ + tic6x_coding_scst_negate, + /* Store an unsigned link-time constant, implicitly DP-relative + and counting in bytes, in the field. For expression operands, + assembly-time constants are encoded as-is. For memory + reference operands, the offset is encoded as-is if [] syntax is + used and shifted if () is used. */ + tic6x_coding_ulcst_dpr_byte, + /* Store an unsigned link-time constant, implicitly DP-relative + and counting in half-words, in the field. For expression + operands, assembly-time constants are encoded as-is. For + memory reference operands, the offset is encoded as-is if [] + syntax is used and shifted if () is used. */ + tic6x_coding_ulcst_dpr_half, + /* Store an unsigned link-time constant, implicitly DP-relative + and counting in words, in the field. For expression operands, + assembly-time constants are encoded as-is. For memory + reference operands, the offset is encoded as-is if [] syntax is + used and shifted if () is used. */ + tic6x_coding_ulcst_dpr_word, + /* Store the low 16 bits of a link-time constant in the field; + considered unsigned for disassembly. */ + tic6x_coding_lcst_low16, + /* Store the high 16 bits of a link-time constant in the field; + considered unsigned for disassembly. */ + tic6x_coding_lcst_high16, + /* Store a signed PC-relative value (address of label minus + address of fetch packet containing the current instruction, + counted in words) in the field. */ + tic6x_coding_pcrel, + /* Likewise, but counting in half-words if in a header-based fetch + packet. */ + tic6x_coding_pcrel_half, + /* Store an unsigned PC-relative value used in compact insn */ + tic6x_coding_pcrel_half_unsigned, + /* Encode the register number (even number for a register pair) in + the field. When applied to a memory reference, encode the base + register. */ + tic6x_coding_reg, + /* Encode the register-pair's lsb (even register) for instructions + that use src1 as port for loading lsb of double-precision + operand value (absdp, dpint, dpsp, dptrunc, rcpdp, rsqrdp). */ + tic6x_coding_regpair_lsb, + /* Encode the register-pair's msb (odd register), see above. */ + tic6x_coding_regpair_msb, + /* Store 0 for register B14, 1 for register B15. When applied to + a memory reference, encode the base register. */ + tic6x_coding_areg, + /* Compact instruction offset base register */ + tic6x_coding_reg_ptr, + /* Store the low part of a control register address. */ + tic6x_coding_crlo, + /* Store the high part of a control register address. */ + tic6x_coding_crhi, + /* Encode the even register number for a register pair, shifted + right by one bit. */ + tic6x_coding_reg_shift, + /* Store either the offset register or the 5-bit unsigned offset + for a memory reference. If an offset uses the unscaled () + form, which is only permitted with constants, it is scaled + according to the access size of the operand before being + stored. */ + tic6x_coding_mem_offset, + /* Store either the offset register or the 5-bit unsigned offset + for a memory reference, but with no scaling applied to the + offset (for nonaligned doubleword operations). */ + tic6x_coding_mem_offset_noscale, + /* Store the addressing mode for a memory reference. */ + tic6x_coding_mem_mode, + /* Store whether a memory reference is scaled. */ + tic6x_coding_scaled, + /* Store the stage in an SPKERNEL instruction in the upper part of + the field. */ + tic6x_coding_fstg, + /* Store the cycle in an SPKERNEL instruction in the lower part of + the field. */ + tic6x_coding_fcyc, + /* Store the mask bits for functional units in the field in an + SPMASK or SPMASKR instruction. */ + tic6x_coding_spmask, + /* Store the number of a register that is unused, or minimally + used, in this execute packet. The number must be the same for + all uses of this coding in a single instruction, but may be + different for different instructions in the execute packet. + This is for the "zero" pseudo-operation. This is not safe when + reads may occur from instructions in previous execute packets; + in such cases the programmer or compiler should use explicit + "sub" instructions for those cases of "zero" that cannot be + implemented as "mvk" for the processor specified. */ + tic6x_coding_reg_unused, + /* Store 1 if the functional unit used is on side B, 0 for side + A. */ + tic6x_coding_fu, + /* Store 1 if the data path used (source register for store, + destination for load) is on side B, 0 for side A. */ + tic6x_coding_data_fu, + /* Store 1 if the cross path is being used, 0 otherwise. */ + tic6x_coding_xpath, + /* L3i constant coding */ + tic6x_coding_scst_l3i, + /* S3i constant coding */ + tic6x_coding_cst_s3i, + /* mem offset minus 1 */ + tic6x_coding_mem_offset_minus_one, + /* non aligned mem offset minus 1 */ + tic6x_coding_mem_offset_minus_one_noscale, + tic6x_coding_rside + } tic6x_coding_method; + +/* How to generate the value of a particular field. */ +typedef struct +{ + /* The name of the field. */ + tic6x_insn_field_id field_id; + + /* How it is encoded. */ + tic6x_coding_method coding_method; + + /* Source operand number, if any. */ + unsigned int operand_num; +} tic6x_coding_field; + +/* Types of instruction for pipeline purposes. The type determines + functional unit and cross path latency (when the same functional + unit can be used by other instructions, when the same cross path + can be used by other instructions). */ +typedef enum + { + tic6x_pipeline_nop, + tic6x_pipeline_1cycle, + tic6x_pipeline_1616_m, + tic6x_pipeline_store, + tic6x_pipeline_mul_ext, + tic6x_pipeline_load, + tic6x_pipeline_branch, + tic6x_pipeline_2cycle_dp, + tic6x_pipeline_4cycle, + tic6x_pipeline_intdp, + tic6x_pipeline_dpcmp, + tic6x_pipeline_addsubdp, + tic6x_pipeline_mpyi, + tic6x_pipeline_mpyid, + tic6x_pipeline_mpydp, + tic6x_pipeline_mpyspdp, + tic6x_pipeline_mpysp2dp + } tic6x_pipeline_type; + +/* Description of a control register. */ +typedef struct +{ + /* The name of the register. */ + const char *name; + + /* Which ISA variants include this control register. */ + unsigned short isa_variants; + + /* Whether it can be read, written or both (in supervisor mode). + Some registers use the same address, but different names, for + reading and writing. */ + tic6x_rw rw; + + /* crlo value for this register. */ + unsigned int crlo; + + /* Mask that, ANDed with the crhi value in the instruction, must be + 0. 0 is always generated when generating code. */ + unsigned int crhi_mask; +} tic6x_ctrl; + +/* An index into the table of control registers. */ +typedef enum + { +#define CTRL(name, isa, rw, crlo, crhi_mask) \ + CONCAT2(tic6x_ctrl_,name), +#include "tic6x-control-registers.h" +#undef CTRL + tic6x_ctrl_max + } tic6x_ctrl_id; + +/* The table itself. */ +extern const tic6x_ctrl tic6x_ctrl_table[tic6x_ctrl_max]; + +/* An entry in the opcode table. */ +typedef struct +{ + /* The name of the instruction. */ + const char *name; + + /* Functional unit used by this instruction (basic information). */ + tic6x_func_unit_base func_unit; + + /* The format of this instruction. */ + tic6x_insn_format_id format; + + /* The pipeline type of this instruction. */ + tic6x_pipeline_type type; + + /* Which ISA variants include this instruction. */ + unsigned short isa_variants; + + /* Flags for this instruction. */ + unsigned int flags; + + /* Number of fixed fields, or fields with restricted value ranges, + for this instruction. */ + unsigned int num_fixed_fields; + + /* Values of fields fixed for this instruction. */ + tic6x_fixed_field fixed_fields[TIC6X_MAX_FIXED_FIELDS]; + + /* The number of operands in the source form of this + instruction. */ + unsigned int num_operands; + + /* Information about individual operands. */ + tic6x_operand_info operand_info[TIC6X_MAX_OPERANDS]; + + /* The number of variable fields for this instruction with encoding + instructions explicitly given. */ + unsigned int num_variable_fields; + + /* How fields (other than ones with fixed value) are computed from + the source operands and functional unit specifiers. In addition + to fields specified here: + + - creg, if present, is set from the predicate, along with z which + must be present if creg is present. + + - p, if present (on all non-compact instructions), is set from + the parallel bars. + */ + tic6x_coding_field variable_fields[TIC6X_MAX_VAR_FIELDS]; +} tic6x_opcode; + +/* An index into the table of opcodes. */ +typedef enum + { +#define INSN(name, func_unit, format, type, isa, flags, fixed, ops, var) \ + CONCAT6(tic6x_opcode_,name,_,func_unit,_,format), +#define INSNE(name, e, func_unit, format, type, isa, flags, fixed, ops, var) \ + CONCAT4(tic6x_opcode_,name,_,e), +#define INSNU(name, func_unit, format, type, isa, flags, fixed, ops, var) \ + CONCAT6(tic6x_opcode_,name,_,func_unit,_,format), +#define INSNUE(name, e, func_unit, format, type, isa, flags, fixed, ops, var) \ + CONCAT6(tic6x_opcode_,name,_,func_unit,_,e), +#include "tic6x-opcode-table.h" +#undef INSN +#undef INSNE +#undef INSNU +#undef INSNUE + tic6x_opcode_max + } tic6x_opcode_id; + +/* The table itself. */ +extern const tic6x_opcode tic6x_opcode_table[tic6x_opcode_max]; + +/* A linked list of opcodes. */ +typedef struct tic6x_opcode_list_tag +{ + tic6x_opcode_id id; + struct tic6x_opcode_list_tag *next; +} tic6x_opcode_list; + +/* The information from a fetch packet header. */ +typedef struct +{ + /* The header itself. */ + unsigned int header; + + /* Whether each word uses compact instructions. */ + bfd_boolean word_compact[7]; + + /* Whether loads are protected. */ + bfd_boolean prot; + + /* Whether instructions use the high register set. */ + bfd_boolean rs; + + /* Data size. */ + unsigned int dsz; + + /* Whether compact instructions in the S unit are decoded as + branches. */ + bfd_boolean br; + + /* Whether compact instructions saturate. */ + bfd_boolean sat; + + /* P-bits. */ + bfd_boolean p_bits[14]; +} tic6x_fetch_packet_header; + +#endif /* OPCODE_TIC6X_H */ diff --git a/include/opcode/tic80.h b/include/opcode/tic80.h new file mode 100644 index 0000000..43c84be --- /dev/null +++ b/include/opcode/tic80.h @@ -0,0 +1,283 @@ +/* tic80.h -- Header file for TI TMS320C80 (MV) opcode table + Copyright 1996, 1997, 2003, 2010 Free Software Foundation, Inc. + Written by Fred Fish (fnf@cygnus.com), Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef TIC80_H +#define TIC80_H + +/* The opcode table is an array of struct tic80_opcode. */ + +struct tic80_opcode +{ + /* The opcode name. */ + + const char *name; + + /* The opcode itself. Those bits which will be filled in with operands + are zeroes. */ + + unsigned long opcode; + + /* The opcode mask. This is used by the disassembler. This is a mask + containing ones indicating those bits which must match the opcode + field, and zeroes indicating those bits which need not match (and are + presumably filled in by operands). */ + + unsigned long mask; + + /* Special purpose flags for this opcode. */ + + unsigned char flags; + + /* An array of operand codes. Each code is an index into the operand + table. They appear in the order which the operands must appear in + assembly code, and are terminated by a zero. FIXME: Adjust size to + match actual requirements when TIc80 support is complete */ + + unsigned char operands[8]; +}; + +/* The table itself is sorted by major opcode number, and is otherwise in + the order in which the disassembler should consider instructions. + FIXME: This isn't currently true. */ + +extern const struct tic80_opcode tic80_opcodes[]; +extern const int tic80_num_opcodes; + + +/* The operands table is an array of struct tic80_operand. */ + +struct tic80_operand +{ + /* The number of bits in the operand. */ + + int bits; + + /* How far the operand is left shifted in the instruction. */ + + int shift; + + /* Insertion function. This is used by the assembler. To insert an + operand value into an instruction, check this field. + + If it is NULL, execute + i |= (op & ((1 << o->bits) - 1)) << o->shift; + (i is the instruction which we are filling in, o is a pointer to + this structure, and op is the opcode value; this assumes twos + complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction and the operand value. It will return the new value + of the instruction. If the ERRMSG argument is not NULL, then if + the operand value is illegal, *ERRMSG will be set to a warning + string (the operand will be inserted in any case). If the + operand value is legal, *ERRMSG will be unchanged (most operands + can accept any value). */ + + unsigned long (*insert) + (unsigned long instruction, long op, const char **errmsg); + + /* Extraction function. This is used by the disassembler. To + extract this operand type from an instruction, check this field. + + If it is NULL, compute + op = ((i) >> o->shift) & ((1 << o->bits) - 1); + if ((o->flags & TIC80_OPERAND_SIGNED) != 0 + && (op & (1 << (o->bits - 1))) != 0) + op -= 1 << o->bits; + (i is the instruction, o is a pointer to this structure, and op + is the result; this assumes twos complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction value. It will return the value of the operand. If + the INVALID argument is not NULL, *INVALID will be set to + non-zero if this operand type can not actually be extracted from + this operand (i.e., the instruction does not match). If the + operand is valid, *INVALID will not be changed. */ + + long (*extract) (unsigned long instruction, int *invalid); + + /* One bit syntax flags. */ + + unsigned long flags; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the tic80_opcodes table. */ + +extern const struct tic80_operand tic80_operands[]; + + +/* Values defined for the flags field of a struct tic80_operand. + + Note that flags for all predefined symbols, such as the general purpose + registers (ex: r10), control registers (ex: FPST), condition codes (ex: + eq0.b), bit numbers (ex: gt.b), etc are large enough that they can be + or'd into an int where the lower bits contain the actual numeric value + that correponds to this predefined symbol. This way a single int can + contain both the value of the symbol and it's type. + */ + +/* This operand must be an even register number. Floating point numbers + for example are stored in even/odd register pairs. */ + +#define TIC80_OPERAND_EVEN (1 << 0) + +/* This operand must be an odd register number and must be one greater than + the register number of the previous operand. I.E. the second register in + an even/odd register pair. */ + +#define TIC80_OPERAND_ODD (1 << 1) + +/* This operand takes signed values. */ + +#define TIC80_OPERAND_SIGNED (1 << 2) + +/* This operand may be either a predefined constant name or a numeric value. + An example would be a condition code like "eq0.b" which has the numeric + value 0x2. */ + +#define TIC80_OPERAND_NUM (1 << 3) + +/* This operand should be wrapped in parentheses rather than separated + from the previous one by a comma. This is used for various + instructions, like the load and store instructions, which want + their operands to look like "displacement(reg)" */ + +#define TIC80_OPERAND_PARENS (1 << 4) + +/* This operand is a PC relative branch offset. The disassembler prints + these symbolically if possible. Note that the offsets are taken as word + offsets. */ + +#define TIC80_OPERAND_PCREL (1 << 5) + +/* This flag is a hint to the disassembler for using hex as the prefered + printing format, even for small positive or negative immediate values. + Normally values in the range -999 to 999 are printed as signed decimal + values and other values are printed in hex. */ + +#define TIC80_OPERAND_BITFIELD (1 << 6) + +/* This operand may have a ":m" modifier specified by bit 17 in a short + immediate form instruction. */ + +#define TIC80_OPERAND_M_SI (1 << 7) + +/* This operand may have a ":m" modifier specified by bit 15 in a long + immediate or register form instruction. */ + +#define TIC80_OPERAND_M_LI (1 << 8) + +/* This operand may have a ":s" modifier specified in bit 11 in a long + immediate or register form instruction. */ + +#define TIC80_OPERAND_SCALED (1 << 9) + +/* This operand is a floating point value */ + +#define TIC80_OPERAND_FLOAT (1 << 10) + +/* This operand is an byte offset from a base relocation. The lower + two bits of the final relocated address are ignored when the value is + written to the program counter. */ + +#define TIC80_OPERAND_BASEREL (1 << 11) + +/* This operand is an "endmask" field for a shift instruction. + It is treated special in that it can have values of 0-32, + where 0 and 32 result in the same instruction. The assembler + must be able to accept both endmask values. This disassembler + has no way of knowing from the instruction which value was + given at assembly time, so it just uses '0'. */ + +#define TIC80_OPERAND_ENDMASK (1 << 12) + +/* This operand is one of the 32 general purpose registers. + The disassembler prints these with a leading 'r'. */ + +#define TIC80_OPERAND_GPR (1 << 27) + +/* This operand is a floating point accumulator register. + The disassembler prints these with a leading 'a'. */ + +#define TIC80_OPERAND_FPA ( 1 << 28) + +/* This operand is a control register number, either numeric or + symbolic (like "EIF", "EPC", etc). + The disassembler prints these symbolically. */ + +#define TIC80_OPERAND_CR (1 << 29) + +/* This operand is a condition code, either numeric or + symbolic (like "eq0.b", "ne0.w", etc). + The disassembler prints these symbolically. */ + +#define TIC80_OPERAND_CC (1 << 30) + +/* This operand is a bit number, either numeric or + symbolic (like "eq.b", "or.f", etc). + The disassembler prints these symbolically. + Note that they appear in the instruction in 1's complement relative + to the values given in the manual. */ + +#define TIC80_OPERAND_BITNUM (1 << 31) + +/* This mask is used to strip operand bits from an int that contains + both operand bits and a numeric value in the lsbs. */ + +#define TIC80_OPERAND_MASK (TIC80_OPERAND_GPR | TIC80_OPERAND_FPA | TIC80_OPERAND_CR | TIC80_OPERAND_CC | TIC80_OPERAND_BITNUM) + + +/* Flag bits for the struct tic80_opcode flags field. */ + +#define TIC80_VECTOR 01 /* Is a vector instruction */ +#define TIC80_NO_R0_DEST 02 /* Register r0 cannot be a destination register */ + + +/* The opcodes library contains a table that allows translation from predefined + symbol names to numeric values, and vice versa. */ + +/* Structure to hold information about predefined symbols. */ + +struct predefined_symbol +{ + char *name; /* name to recognize */ + int value; +}; + +#define PDS_NAME(pdsp) ((pdsp) -> name) +#define PDS_VALUE(pdsp) ((pdsp) -> value) + +/* Translation array. */ +extern const struct predefined_symbol tic80_predefined_symbols[]; +/* How many members in the array. */ +extern const int tic80_num_predefined_symbols; + +/* Translate value to symbolic name. */ +const char *tic80_value_to_symbol (int val, int class); + +/* Translate symbolic name to value. */ +int tic80_symbol_to_value (char *name, int class); + +const struct predefined_symbol *tic80_next_predefined_symbol + (const struct predefined_symbol *); + +#endif /* TIC80_H */ diff --git a/include/opcode/tilegx.h b/include/opcode/tilegx.h new file mode 100644 index 0000000..c11fc16 --- /dev/null +++ b/include/opcode/tilegx.h @@ -0,0 +1,1304 @@ +/* TILE-Gx opcode information. + * + * Copyright 2011 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 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef opcode_tile_h +#define opcode_tile_h + +typedef unsigned long long tilegx_bundle_bits; + + +enum +{ + TILEGX_MAX_OPERANDS = 4 /* bfexts */ +}; + +typedef enum +{ + TILEGX_OPC_BPT, + TILEGX_OPC_INFO, + TILEGX_OPC_INFOL, + TILEGX_OPC_LD4S_TLS, + TILEGX_OPC_LD_TLS, + TILEGX_OPC_MOVE, + TILEGX_OPC_MOVEI, + TILEGX_OPC_MOVELI, + TILEGX_OPC_PREFETCH, + TILEGX_OPC_PREFETCH_ADD_L1, + TILEGX_OPC_PREFETCH_ADD_L1_FAULT, + TILEGX_OPC_PREFETCH_ADD_L2, + TILEGX_OPC_PREFETCH_ADD_L2_FAULT, + TILEGX_OPC_PREFETCH_ADD_L3, + TILEGX_OPC_PREFETCH_ADD_L3_FAULT, + TILEGX_OPC_PREFETCH_L1, + TILEGX_OPC_PREFETCH_L1_FAULT, + TILEGX_OPC_PREFETCH_L2, + TILEGX_OPC_PREFETCH_L2_FAULT, + TILEGX_OPC_PREFETCH_L3, + TILEGX_OPC_PREFETCH_L3_FAULT, + TILEGX_OPC_RAISE, + TILEGX_OPC_ADD, + TILEGX_OPC_ADDI, + TILEGX_OPC_ADDLI, + TILEGX_OPC_ADDX, + TILEGX_OPC_ADDXI, + TILEGX_OPC_ADDXLI, + TILEGX_OPC_ADDXSC, + TILEGX_OPC_AND, + TILEGX_OPC_ANDI, + TILEGX_OPC_BEQZ, + TILEGX_OPC_BEQZT, + TILEGX_OPC_BFEXTS, + TILEGX_OPC_BFEXTU, + TILEGX_OPC_BFINS, + TILEGX_OPC_BGEZ, + TILEGX_OPC_BGEZT, + TILEGX_OPC_BGTZ, + TILEGX_OPC_BGTZT, + TILEGX_OPC_BLBC, + TILEGX_OPC_BLBCT, + TILEGX_OPC_BLBS, + TILEGX_OPC_BLBST, + TILEGX_OPC_BLEZ, + TILEGX_OPC_BLEZT, + TILEGX_OPC_BLTZ, + TILEGX_OPC_BLTZT, + TILEGX_OPC_BNEZ, + TILEGX_OPC_BNEZT, + TILEGX_OPC_CLZ, + TILEGX_OPC_CMOVEQZ, + TILEGX_OPC_CMOVNEZ, + TILEGX_OPC_CMPEQ, + TILEGX_OPC_CMPEQI, + TILEGX_OPC_CMPEXCH, + TILEGX_OPC_CMPEXCH4, + TILEGX_OPC_CMPLES, + TILEGX_OPC_CMPLEU, + TILEGX_OPC_CMPLTS, + TILEGX_OPC_CMPLTSI, + TILEGX_OPC_CMPLTU, + TILEGX_OPC_CMPLTUI, + TILEGX_OPC_CMPNE, + TILEGX_OPC_CMUL, + TILEGX_OPC_CMULA, + TILEGX_OPC_CMULAF, + TILEGX_OPC_CMULF, + TILEGX_OPC_CMULFR, + TILEGX_OPC_CMULH, + TILEGX_OPC_CMULHR, + TILEGX_OPC_CRC32_32, + TILEGX_OPC_CRC32_8, + TILEGX_OPC_CTZ, + TILEGX_OPC_DBLALIGN, + TILEGX_OPC_DBLALIGN2, + TILEGX_OPC_DBLALIGN4, + TILEGX_OPC_DBLALIGN6, + TILEGX_OPC_DRAIN, + TILEGX_OPC_DTLBPR, + TILEGX_OPC_EXCH, + TILEGX_OPC_EXCH4, + TILEGX_OPC_FDOUBLE_ADD_FLAGS, + TILEGX_OPC_FDOUBLE_ADDSUB, + TILEGX_OPC_FDOUBLE_MUL_FLAGS, + TILEGX_OPC_FDOUBLE_PACK1, + TILEGX_OPC_FDOUBLE_PACK2, + TILEGX_OPC_FDOUBLE_SUB_FLAGS, + TILEGX_OPC_FDOUBLE_UNPACK_MAX, + TILEGX_OPC_FDOUBLE_UNPACK_MIN, + TILEGX_OPC_FETCHADD, + TILEGX_OPC_FETCHADD4, + TILEGX_OPC_FETCHADDGEZ, + TILEGX_OPC_FETCHADDGEZ4, + TILEGX_OPC_FETCHAND, + TILEGX_OPC_FETCHAND4, + TILEGX_OPC_FETCHOR, + TILEGX_OPC_FETCHOR4, + TILEGX_OPC_FINV, + TILEGX_OPC_FLUSH, + TILEGX_OPC_FLUSHWB, + TILEGX_OPC_FNOP, + TILEGX_OPC_FSINGLE_ADD1, + TILEGX_OPC_FSINGLE_ADDSUB2, + TILEGX_OPC_FSINGLE_MUL1, + TILEGX_OPC_FSINGLE_MUL2, + TILEGX_OPC_FSINGLE_PACK1, + TILEGX_OPC_FSINGLE_PACK2, + TILEGX_OPC_FSINGLE_SUB1, + TILEGX_OPC_ICOH, + TILEGX_OPC_ILL, + TILEGX_OPC_INV, + TILEGX_OPC_IRET, + TILEGX_OPC_J, + TILEGX_OPC_JAL, + TILEGX_OPC_JALR, + TILEGX_OPC_JALRP, + TILEGX_OPC_JR, + TILEGX_OPC_JRP, + TILEGX_OPC_LD, + TILEGX_OPC_LD1S, + TILEGX_OPC_LD1S_ADD, + TILEGX_OPC_LD1U, + TILEGX_OPC_LD1U_ADD, + TILEGX_OPC_LD2S, + TILEGX_OPC_LD2S_ADD, + TILEGX_OPC_LD2U, + TILEGX_OPC_LD2U_ADD, + TILEGX_OPC_LD4S, + TILEGX_OPC_LD4S_ADD, + TILEGX_OPC_LD4U, + TILEGX_OPC_LD4U_ADD, + TILEGX_OPC_LD_ADD, + TILEGX_OPC_LDNA, + TILEGX_OPC_LDNA_ADD, + TILEGX_OPC_LDNT, + TILEGX_OPC_LDNT1S, + TILEGX_OPC_LDNT1S_ADD, + TILEGX_OPC_LDNT1U, + TILEGX_OPC_LDNT1U_ADD, + TILEGX_OPC_LDNT2S, + TILEGX_OPC_LDNT2S_ADD, + TILEGX_OPC_LDNT2U, + TILEGX_OPC_LDNT2U_ADD, + TILEGX_OPC_LDNT4S, + TILEGX_OPC_LDNT4S_ADD, + TILEGX_OPC_LDNT4U, + TILEGX_OPC_LDNT4U_ADD, + TILEGX_OPC_LDNT_ADD, + TILEGX_OPC_LNK, + TILEGX_OPC_MF, + TILEGX_OPC_MFSPR, + TILEGX_OPC_MM, + TILEGX_OPC_MNZ, + TILEGX_OPC_MTSPR, + TILEGX_OPC_MUL_HS_HS, + TILEGX_OPC_MUL_HS_HU, + TILEGX_OPC_MUL_HS_LS, + TILEGX_OPC_MUL_HS_LU, + TILEGX_OPC_MUL_HU_HU, + TILEGX_OPC_MUL_HU_LS, + TILEGX_OPC_MUL_HU_LU, + TILEGX_OPC_MUL_LS_LS, + TILEGX_OPC_MUL_LS_LU, + TILEGX_OPC_MUL_LU_LU, + TILEGX_OPC_MULA_HS_HS, + TILEGX_OPC_MULA_HS_HU, + TILEGX_OPC_MULA_HS_LS, + TILEGX_OPC_MULA_HS_LU, + TILEGX_OPC_MULA_HU_HU, + TILEGX_OPC_MULA_HU_LS, + TILEGX_OPC_MULA_HU_LU, + TILEGX_OPC_MULA_LS_LS, + TILEGX_OPC_MULA_LS_LU, + TILEGX_OPC_MULA_LU_LU, + TILEGX_OPC_MULAX, + TILEGX_OPC_MULX, + TILEGX_OPC_MZ, + TILEGX_OPC_NAP, + TILEGX_OPC_NOP, + TILEGX_OPC_NOR, + TILEGX_OPC_OR, + TILEGX_OPC_ORI, + TILEGX_OPC_PCNT, + TILEGX_OPC_REVBITS, + TILEGX_OPC_REVBYTES, + TILEGX_OPC_ROTL, + TILEGX_OPC_ROTLI, + TILEGX_OPC_SHL, + TILEGX_OPC_SHL16INSLI, + TILEGX_OPC_SHL1ADD, + TILEGX_OPC_SHL1ADDX, + TILEGX_OPC_SHL2ADD, + TILEGX_OPC_SHL2ADDX, + TILEGX_OPC_SHL3ADD, + TILEGX_OPC_SHL3ADDX, + TILEGX_OPC_SHLI, + TILEGX_OPC_SHLX, + TILEGX_OPC_SHLXI, + TILEGX_OPC_SHRS, + TILEGX_OPC_SHRSI, + TILEGX_OPC_SHRU, + TILEGX_OPC_SHRUI, + TILEGX_OPC_SHRUX, + TILEGX_OPC_SHRUXI, + TILEGX_OPC_SHUFFLEBYTES, + TILEGX_OPC_ST, + TILEGX_OPC_ST1, + TILEGX_OPC_ST1_ADD, + TILEGX_OPC_ST2, + TILEGX_OPC_ST2_ADD, + TILEGX_OPC_ST4, + TILEGX_OPC_ST4_ADD, + TILEGX_OPC_ST_ADD, + TILEGX_OPC_STNT, + TILEGX_OPC_STNT1, + TILEGX_OPC_STNT1_ADD, + TILEGX_OPC_STNT2, + TILEGX_OPC_STNT2_ADD, + TILEGX_OPC_STNT4, + TILEGX_OPC_STNT4_ADD, + TILEGX_OPC_STNT_ADD, + TILEGX_OPC_SUB, + TILEGX_OPC_SUBX, + TILEGX_OPC_SUBXSC, + TILEGX_OPC_SWINT0, + TILEGX_OPC_SWINT1, + TILEGX_OPC_SWINT2, + TILEGX_OPC_SWINT3, + TILEGX_OPC_TBLIDXB0, + TILEGX_OPC_TBLIDXB1, + TILEGX_OPC_TBLIDXB2, + TILEGX_OPC_TBLIDXB3, + TILEGX_OPC_V1ADD, + TILEGX_OPC_V1ADDI, + TILEGX_OPC_V1ADDUC, + TILEGX_OPC_V1ADIFFU, + TILEGX_OPC_V1AVGU, + TILEGX_OPC_V1CMPEQ, + TILEGX_OPC_V1CMPEQI, + TILEGX_OPC_V1CMPLES, + TILEGX_OPC_V1CMPLEU, + TILEGX_OPC_V1CMPLTS, + TILEGX_OPC_V1CMPLTSI, + TILEGX_OPC_V1CMPLTU, + TILEGX_OPC_V1CMPLTUI, + TILEGX_OPC_V1CMPNE, + TILEGX_OPC_V1DDOTPU, + TILEGX_OPC_V1DDOTPUA, + TILEGX_OPC_V1DDOTPUS, + TILEGX_OPC_V1DDOTPUSA, + TILEGX_OPC_V1DOTP, + TILEGX_OPC_V1DOTPA, + TILEGX_OPC_V1DOTPU, + TILEGX_OPC_V1DOTPUA, + TILEGX_OPC_V1DOTPUS, + TILEGX_OPC_V1DOTPUSA, + TILEGX_OPC_V1INT_H, + TILEGX_OPC_V1INT_L, + TILEGX_OPC_V1MAXU, + TILEGX_OPC_V1MAXUI, + TILEGX_OPC_V1MINU, + TILEGX_OPC_V1MINUI, + TILEGX_OPC_V1MNZ, + TILEGX_OPC_V1MULTU, + TILEGX_OPC_V1MULU, + TILEGX_OPC_V1MULUS, + TILEGX_OPC_V1MZ, + TILEGX_OPC_V1SADAU, + TILEGX_OPC_V1SADU, + TILEGX_OPC_V1SHL, + TILEGX_OPC_V1SHLI, + TILEGX_OPC_V1SHRS, + TILEGX_OPC_V1SHRSI, + TILEGX_OPC_V1SHRU, + TILEGX_OPC_V1SHRUI, + TILEGX_OPC_V1SUB, + TILEGX_OPC_V1SUBUC, + TILEGX_OPC_V2ADD, + TILEGX_OPC_V2ADDI, + TILEGX_OPC_V2ADDSC, + TILEGX_OPC_V2ADIFFS, + TILEGX_OPC_V2AVGS, + TILEGX_OPC_V2CMPEQ, + TILEGX_OPC_V2CMPEQI, + TILEGX_OPC_V2CMPLES, + TILEGX_OPC_V2CMPLEU, + TILEGX_OPC_V2CMPLTS, + TILEGX_OPC_V2CMPLTSI, + TILEGX_OPC_V2CMPLTU, + TILEGX_OPC_V2CMPLTUI, + TILEGX_OPC_V2CMPNE, + TILEGX_OPC_V2DOTP, + TILEGX_OPC_V2DOTPA, + TILEGX_OPC_V2INT_H, + TILEGX_OPC_V2INT_L, + TILEGX_OPC_V2MAXS, + TILEGX_OPC_V2MAXSI, + TILEGX_OPC_V2MINS, + TILEGX_OPC_V2MINSI, + TILEGX_OPC_V2MNZ, + TILEGX_OPC_V2MULFSC, + TILEGX_OPC_V2MULS, + TILEGX_OPC_V2MULTS, + TILEGX_OPC_V2MZ, + TILEGX_OPC_V2PACKH, + TILEGX_OPC_V2PACKL, + TILEGX_OPC_V2PACKUC, + TILEGX_OPC_V2SADAS, + TILEGX_OPC_V2SADAU, + TILEGX_OPC_V2SADS, + TILEGX_OPC_V2SADU, + TILEGX_OPC_V2SHL, + TILEGX_OPC_V2SHLI, + TILEGX_OPC_V2SHLSC, + TILEGX_OPC_V2SHRS, + TILEGX_OPC_V2SHRSI, + TILEGX_OPC_V2SHRU, + TILEGX_OPC_V2SHRUI, + TILEGX_OPC_V2SUB, + TILEGX_OPC_V2SUBSC, + TILEGX_OPC_V4ADD, + TILEGX_OPC_V4ADDSC, + TILEGX_OPC_V4INT_H, + TILEGX_OPC_V4INT_L, + TILEGX_OPC_V4PACKSC, + TILEGX_OPC_V4SHL, + TILEGX_OPC_V4SHLSC, + TILEGX_OPC_V4SHRS, + TILEGX_OPC_V4SHRU, + TILEGX_OPC_V4SUB, + TILEGX_OPC_V4SUBSC, + TILEGX_OPC_WH64, + TILEGX_OPC_XOR, + TILEGX_OPC_XORI, + TILEGX_OPC_NONE +} tilegx_mnemonic; + +/* 64-bit pattern for a { bpt ; nop } bundle. */ +#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL + + + +static __inline unsigned int +get_BFEnd_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_BFOpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 24)) & 0xf); +} + +static __inline unsigned int +get_BFStart_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3f); +} + +static __inline unsigned int +get_BrOff_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 37)) & 0x0001ffc0); +} + +static __inline unsigned int +get_BrType_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 54)) & 0x1f); +} + +static __inline unsigned int +get_Dest_Imm8_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 43)) & 0x000000c0); +} + +static __inline unsigned int +get_Dest_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3f); +} + +static __inline unsigned int +get_Dest_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x3f); +} + +static __inline unsigned int +get_Dest_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3f); +} + +static __inline unsigned int +get_Dest_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x3f); +} + +static __inline unsigned int +get_Imm16_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xffff); +} + +static __inline unsigned int +get_Imm16_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xffff); +} + +static __inline unsigned int +get_Imm8OpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 20)) & 0xff); +} + +static __inline unsigned int +get_Imm8OpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 51)) & 0xff); +} + +static __inline unsigned int +get_Imm8_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xff); +} + +static __inline unsigned int +get_Imm8_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xff); +} + +static __inline unsigned int +get_Imm8_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xff); +} + +static __inline unsigned int +get_Imm8_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xff); +} + +static __inline unsigned int +get_JumpOff_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x7ffffff); +} + +static __inline unsigned int +get_JumpOpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 58)) & 0x1); +} + +static __inline unsigned int +get_MF_Imm14_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3fff); +} + +static __inline unsigned int +get_MT_Imm14_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 37)) & 0x00003fc0); +} + +static __inline unsigned int +get_Mode(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 62)) & 0x3); +} + +static __inline unsigned int +get_Opcode_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 28)) & 0x7); +} + +static __inline unsigned int +get_Opcode_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 59)) & 0x7); +} + +static __inline unsigned int +get_Opcode_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 27)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 58)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y2(tilegx_bundle_bits n) +{ + return (((n >> 26)) & 0x00000001) | + (((unsigned int)(n >> 56)) & 0x00000002); +} + +static __inline unsigned int +get_RRROpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3ff); +} + +static __inline unsigned int +get_RRROpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3ff); +} + +static __inline unsigned int +get_RRROpcodeExtension_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3); +} + +static __inline unsigned int +get_RRROpcodeExtension_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3); +} + +static __inline unsigned int +get_ShAmt_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_ShAmt_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_ShAmt_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_ShAmt_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3ff); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3ff); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3); +} + +static __inline unsigned int +get_ShiftOpcodeExtension_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3); +} + +static __inline unsigned int +get_SrcA_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 6)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 6)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y2(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 20)) & 0x3f); +} + +static __inline unsigned int +get_SrcBDest_Y2(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 51)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_X0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_X1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_Y0(tilegx_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_UnaryOpcodeExtension_Y1(tilegx_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + + +static __inline int +sign_extend(int n, int num_bits) +{ + int shift = (int)(sizeof(int) * 8 - num_bits); + return (n << shift) >> shift; +} + + + +static __inline tilegx_bundle_bits +create_BFEnd_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_BFOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 24); +} + +static __inline tilegx_bundle_bits +create_BFStart_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 18); +} + +static __inline tilegx_bundle_bits +create_BrOff_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilegx_bundle_bits)(n & 0x0001ffc0)) << 37); +} + +static __inline tilegx_bundle_bits +create_BrType_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x1f)) << 54); +} + +static __inline tilegx_bundle_bits +create_Dest_Imm8_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilegx_bundle_bits)(n & 0x000000c0)) << 43); +} + +static __inline tilegx_bundle_bits +create_Dest_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 0); +} + +static __inline tilegx_bundle_bits +create_Dest_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 31); +} + +static __inline tilegx_bundle_bits +create_Dest_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 0); +} + +static __inline tilegx_bundle_bits +create_Dest_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 31); +} + +static __inline tilegx_bundle_bits +create_Imm16_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xffff) << 12); +} + +static __inline tilegx_bundle_bits +create_Imm16_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xffff)) << 43); +} + +static __inline tilegx_bundle_bits +create_Imm8OpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 20); +} + +static __inline tilegx_bundle_bits +create_Imm8OpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xff)) << 51); +} + +static __inline tilegx_bundle_bits +create_Imm8_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 12); +} + +static __inline tilegx_bundle_bits +create_Imm8_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xff)) << 43); +} + +static __inline tilegx_bundle_bits +create_Imm8_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 12); +} + +static __inline tilegx_bundle_bits +create_Imm8_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xff)) << 43); +} + +static __inline tilegx_bundle_bits +create_JumpOff_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x7ffffff)) << 31); +} + +static __inline tilegx_bundle_bits +create_JumpOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x1)) << 58); +} + +static __inline tilegx_bundle_bits +create_MF_Imm14_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3fff)) << 37); +} + +static __inline tilegx_bundle_bits +create_MT_Imm14_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilegx_bundle_bits)(n & 0x00003fc0)) << 37); +} + +static __inline tilegx_bundle_bits +create_Mode(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3)) << 62); +} + +static __inline tilegx_bundle_bits +create_Opcode_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x7) << 28); +} + +static __inline tilegx_bundle_bits +create_Opcode_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x7)) << 59); +} + +static __inline tilegx_bundle_bits +create_Opcode_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 27); +} + +static __inline tilegx_bundle_bits +create_Opcode_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0xf)) << 58); +} + +static __inline tilegx_bundle_bits +create_Opcode_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x00000001) << 26) | + (((tilegx_bundle_bits)(n & 0x00000002)) << 56); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 18); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 18); +} + +static __inline tilegx_bundle_bits +create_RRROpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3)) << 49); +} + +static __inline tilegx_bundle_bits +create_ShAmt_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_ShAmt_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_ShAmt_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_ShAmt_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 18); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3ff)) << 49); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 18); +} + +static __inline tilegx_bundle_bits +create_ShiftOpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3)) << 49); +} + +static __inline tilegx_bundle_bits +create_SrcA_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 6); +} + +static __inline tilegx_bundle_bits +create_SrcA_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 37); +} + +static __inline tilegx_bundle_bits +create_SrcA_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 6); +} + +static __inline tilegx_bundle_bits +create_SrcA_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 37); +} + +static __inline tilegx_bundle_bits +create_SrcA_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 20); +} + +static __inline tilegx_bundle_bits +create_SrcBDest_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 51); +} + +static __inline tilegx_bundle_bits +create_SrcB_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_SrcB_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_SrcB_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_SrcB_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilegx_bundle_bits +create_UnaryOpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilegx_bundle_bits)(n & 0x3f)) << 43); +} + + +typedef enum +{ + TILEGX_PIPELINE_X0, + TILEGX_PIPELINE_X1, + TILEGX_PIPELINE_Y0, + TILEGX_PIPELINE_Y1, + TILEGX_PIPELINE_Y2, +} tilegx_pipeline; + +#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1) + +typedef enum +{ + TILEGX_OP_TYPE_REGISTER, + TILEGX_OP_TYPE_IMMEDIATE, + TILEGX_OP_TYPE_ADDRESS, + TILEGX_OP_TYPE_SPR +} tilegx_operand_type; + +/* These are the bits that determine if a bundle is in the X encoding. */ +#define TILEGX_BUNDLE_MODE_MASK ((tilegx_bundle_bits)3 << 62) + +enum +{ + /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */ + TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE = 3, + + /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */ + TILEGX_NUM_PIPELINE_ENCODINGS = 5, + + /* Log base 2 of TILEGX_BUNDLE_SIZE_IN_BYTES. */ + TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES = 3, + + /* Instructions take this many bytes. */ + TILEGX_BUNDLE_SIZE_IN_BYTES = 1 << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES, + + /* Log base 2 of TILEGX_BUNDLE_ALIGNMENT_IN_BYTES. */ + TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3, + + /* Bundles should be aligned modulo this number of bytes. */ + TILEGX_BUNDLE_ALIGNMENT_IN_BYTES = + (1 << TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES), + + /* Number of registers (some are magic, such as network I/O). */ + TILEGX_NUM_REGISTERS = 64, +}; + + +struct tilegx_operand +{ + /* Is this operand a register, immediate or address? */ + tilegx_operand_type type; + + /* The default relocation type for this operand. */ + signed int default_reloc : 16; + + /* How many bits is this value? (used for range checking) */ + unsigned int num_bits : 5; + + /* Is the value signed? (used for range checking) */ + unsigned int is_signed : 1; + + /* Is this operand a source register? */ + unsigned int is_src_reg : 1; + + /* Is this operand written? (i.e. is it a destination register) */ + unsigned int is_dest_reg : 1; + + /* Is this operand PC-relative? */ + unsigned int is_pc_relative : 1; + + /* By how many bits do we right shift the value before inserting? */ + unsigned int rightshift : 2; + + /* Return the bits for this operand to be ORed into an existing bundle. */ + tilegx_bundle_bits (*insert) (int op); + + /* Extract this operand and return it. */ + unsigned int (*extract) (tilegx_bundle_bits bundle); +}; + + +extern const struct tilegx_operand tilegx_operands[]; + +/* One finite-state machine per pipe for rapid instruction decoding. */ +extern const unsigned short * const +tilegx_bundle_decoder_fsms[TILEGX_NUM_PIPELINE_ENCODINGS]; + + +struct tilegx_opcode +{ + /* The opcode mnemonic, e.g. "add" */ + const char *name; + + /* The enum value for this mnemonic. */ + tilegx_mnemonic mnemonic; + + /* A bit mask of which of the five pipes this instruction + is compatible with: + X0 0x01 + X1 0x02 + Y0 0x04 + Y1 0x08 + Y2 0x10 */ + unsigned char pipes; + + /* How many operands are there? */ + unsigned char num_operands; + + /* Which register does this write implicitly, or TREG_ZERO if none? */ + unsigned char implicitly_written_register; + + /* Can this be bundled with other instructions (almost always true). */ + unsigned char can_bundle; + + /* The description of the operands. Each of these is an + * index into the tilegx_operands[] table. */ + unsigned char operands[TILEGX_NUM_PIPELINE_ENCODINGS][TILEGX_MAX_OPERANDS]; + +#if !defined(__KERNEL__) && !defined(_LIBC) + /* A mask of which bits have predefined values for each pipeline. + * This is useful for disassembly. */ + tilegx_bundle_bits fixed_bit_masks[TILEGX_NUM_PIPELINE_ENCODINGS]; + + /* For each bit set in fixed_bit_masks, what the value is for this + * instruction. */ + tilegx_bundle_bits fixed_bit_values[TILEGX_NUM_PIPELINE_ENCODINGS]; +#endif +}; + +extern const struct tilegx_opcode tilegx_opcodes[]; + +/* Used for non-textual disassembly into structs. */ +struct tilegx_decoded_instruction +{ + const struct tilegx_opcode *opcode; + const struct tilegx_operand *operands[TILEGX_MAX_OPERANDS]; + long long operand_values[TILEGX_MAX_OPERANDS]; +}; + + +/* Disassemble a bundle into a struct for machine processing. */ +extern int parse_insn_tilegx(tilegx_bundle_bits bits, + unsigned long long pc, + struct tilegx_decoded_instruction + decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE]); + + +#if !defined(__KERNEL__) && !defined(_LIBC) +/* Canonical names of all the registers. */ +/* ISSUE: This table lives in "tile-dis.c" */ +extern const char * const tilegx_register_names[]; + +/* Descriptor for a special-purpose register. */ +struct tilegx_spr +{ + /* The number */ + int number; + + /* The name */ + const char *name; +}; + +/* List of all the SPRs; ordered by increasing number. */ +extern const struct tilegx_spr tilegx_sprs[]; + +/* Number of special-purpose registers. */ +extern const int tilegx_num_sprs; + +extern const char * +get_tilegx_spr_name (int num); +#endif /* !__KERNEL__ && !_LIBC */ + +/* Make a few "tile_" variables to simply common code between + architectures. */ + +typedef tilegx_bundle_bits tile_bundle_bits; +#define TILE_BUNDLE_SIZE_IN_BYTES TILEGX_BUNDLE_SIZE_IN_BYTES +#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES +#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ + TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES + +#endif /* opcode_tilegx_h */ diff --git a/include/opcode/tilepro.h b/include/opcode/tilepro.h new file mode 100644 index 0000000..767926b --- /dev/null +++ b/include/opcode/tilepro.h @@ -0,0 +1,1638 @@ +/* TILEPro opcode information. + * + * Copyright 2011 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 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef opcode_tilepro_h +#define opcode_tilepro_h + +typedef unsigned long long tilepro_bundle_bits; + + +enum +{ + TILEPRO_MAX_OPERANDS = 5 /* mm */ +}; + +typedef enum +{ + TILEPRO_OPC_BPT, + TILEPRO_OPC_INFO, + TILEPRO_OPC_INFOL, + TILEPRO_OPC_J, + TILEPRO_OPC_JAL, + TILEPRO_OPC_LW_TLS, + TILEPRO_OPC_LW_TLS_SN, + TILEPRO_OPC_MOVE, + TILEPRO_OPC_MOVE_SN, + TILEPRO_OPC_MOVEI, + TILEPRO_OPC_MOVEI_SN, + TILEPRO_OPC_MOVELI, + TILEPRO_OPC_MOVELI_SN, + TILEPRO_OPC_MOVELIS, + TILEPRO_OPC_PREFETCH, + TILEPRO_OPC_RAISE, + TILEPRO_OPC_ADD, + TILEPRO_OPC_ADD_SN, + TILEPRO_OPC_ADDB, + TILEPRO_OPC_ADDB_SN, + TILEPRO_OPC_ADDBS_U, + TILEPRO_OPC_ADDBS_U_SN, + TILEPRO_OPC_ADDH, + TILEPRO_OPC_ADDH_SN, + TILEPRO_OPC_ADDHS, + TILEPRO_OPC_ADDHS_SN, + TILEPRO_OPC_ADDI, + TILEPRO_OPC_ADDI_SN, + TILEPRO_OPC_ADDIB, + TILEPRO_OPC_ADDIB_SN, + TILEPRO_OPC_ADDIH, + TILEPRO_OPC_ADDIH_SN, + TILEPRO_OPC_ADDLI, + TILEPRO_OPC_ADDLI_SN, + TILEPRO_OPC_ADDLIS, + TILEPRO_OPC_ADDS, + TILEPRO_OPC_ADDS_SN, + TILEPRO_OPC_ADIFFB_U, + TILEPRO_OPC_ADIFFB_U_SN, + TILEPRO_OPC_ADIFFH, + TILEPRO_OPC_ADIFFH_SN, + TILEPRO_OPC_AND, + TILEPRO_OPC_AND_SN, + TILEPRO_OPC_ANDI, + TILEPRO_OPC_ANDI_SN, + TILEPRO_OPC_AULI, + TILEPRO_OPC_AVGB_U, + TILEPRO_OPC_AVGB_U_SN, + TILEPRO_OPC_AVGH, + TILEPRO_OPC_AVGH_SN, + TILEPRO_OPC_BBNS, + TILEPRO_OPC_BBNS_SN, + TILEPRO_OPC_BBNST, + TILEPRO_OPC_BBNST_SN, + TILEPRO_OPC_BBS, + TILEPRO_OPC_BBS_SN, + TILEPRO_OPC_BBST, + TILEPRO_OPC_BBST_SN, + TILEPRO_OPC_BGEZ, + TILEPRO_OPC_BGEZ_SN, + TILEPRO_OPC_BGEZT, + TILEPRO_OPC_BGEZT_SN, + TILEPRO_OPC_BGZ, + TILEPRO_OPC_BGZ_SN, + TILEPRO_OPC_BGZT, + TILEPRO_OPC_BGZT_SN, + TILEPRO_OPC_BITX, + TILEPRO_OPC_BITX_SN, + TILEPRO_OPC_BLEZ, + TILEPRO_OPC_BLEZ_SN, + TILEPRO_OPC_BLEZT, + TILEPRO_OPC_BLEZT_SN, + TILEPRO_OPC_BLZ, + TILEPRO_OPC_BLZ_SN, + TILEPRO_OPC_BLZT, + TILEPRO_OPC_BLZT_SN, + TILEPRO_OPC_BNZ, + TILEPRO_OPC_BNZ_SN, + TILEPRO_OPC_BNZT, + TILEPRO_OPC_BNZT_SN, + TILEPRO_OPC_BYTEX, + TILEPRO_OPC_BYTEX_SN, + TILEPRO_OPC_BZ, + TILEPRO_OPC_BZ_SN, + TILEPRO_OPC_BZT, + TILEPRO_OPC_BZT_SN, + TILEPRO_OPC_CLZ, + TILEPRO_OPC_CLZ_SN, + TILEPRO_OPC_CRC32_32, + TILEPRO_OPC_CRC32_32_SN, + TILEPRO_OPC_CRC32_8, + TILEPRO_OPC_CRC32_8_SN, + TILEPRO_OPC_CTZ, + TILEPRO_OPC_CTZ_SN, + TILEPRO_OPC_DRAIN, + TILEPRO_OPC_DTLBPR, + TILEPRO_OPC_DWORD_ALIGN, + TILEPRO_OPC_DWORD_ALIGN_SN, + TILEPRO_OPC_FINV, + TILEPRO_OPC_FLUSH, + TILEPRO_OPC_FNOP, + TILEPRO_OPC_ICOH, + TILEPRO_OPC_ILL, + TILEPRO_OPC_INTHB, + TILEPRO_OPC_INTHB_SN, + TILEPRO_OPC_INTHH, + TILEPRO_OPC_INTHH_SN, + TILEPRO_OPC_INTLB, + TILEPRO_OPC_INTLB_SN, + TILEPRO_OPC_INTLH, + TILEPRO_OPC_INTLH_SN, + TILEPRO_OPC_INV, + TILEPRO_OPC_IRET, + TILEPRO_OPC_JALB, + TILEPRO_OPC_JALF, + TILEPRO_OPC_JALR, + TILEPRO_OPC_JALRP, + TILEPRO_OPC_JB, + TILEPRO_OPC_JF, + TILEPRO_OPC_JR, + TILEPRO_OPC_JRP, + TILEPRO_OPC_LB, + TILEPRO_OPC_LB_SN, + TILEPRO_OPC_LB_U, + TILEPRO_OPC_LB_U_SN, + TILEPRO_OPC_LBADD, + TILEPRO_OPC_LBADD_SN, + TILEPRO_OPC_LBADD_U, + TILEPRO_OPC_LBADD_U_SN, + TILEPRO_OPC_LH, + TILEPRO_OPC_LH_SN, + TILEPRO_OPC_LH_U, + TILEPRO_OPC_LH_U_SN, + TILEPRO_OPC_LHADD, + TILEPRO_OPC_LHADD_SN, + TILEPRO_OPC_LHADD_U, + TILEPRO_OPC_LHADD_U_SN, + TILEPRO_OPC_LNK, + TILEPRO_OPC_LNK_SN, + TILEPRO_OPC_LW, + TILEPRO_OPC_LW_SN, + TILEPRO_OPC_LW_NA, + TILEPRO_OPC_LW_NA_SN, + TILEPRO_OPC_LWADD, + TILEPRO_OPC_LWADD_SN, + TILEPRO_OPC_LWADD_NA, + TILEPRO_OPC_LWADD_NA_SN, + TILEPRO_OPC_MAXB_U, + TILEPRO_OPC_MAXB_U_SN, + TILEPRO_OPC_MAXH, + TILEPRO_OPC_MAXH_SN, + TILEPRO_OPC_MAXIB_U, + TILEPRO_OPC_MAXIB_U_SN, + TILEPRO_OPC_MAXIH, + TILEPRO_OPC_MAXIH_SN, + TILEPRO_OPC_MF, + TILEPRO_OPC_MFSPR, + TILEPRO_OPC_MINB_U, + TILEPRO_OPC_MINB_U_SN, + TILEPRO_OPC_MINH, + TILEPRO_OPC_MINH_SN, + TILEPRO_OPC_MINIB_U, + TILEPRO_OPC_MINIB_U_SN, + TILEPRO_OPC_MINIH, + TILEPRO_OPC_MINIH_SN, + TILEPRO_OPC_MM, + TILEPRO_OPC_MNZ, + TILEPRO_OPC_MNZ_SN, + TILEPRO_OPC_MNZB, + TILEPRO_OPC_MNZB_SN, + TILEPRO_OPC_MNZH, + TILEPRO_OPC_MNZH_SN, + TILEPRO_OPC_MTSPR, + TILEPRO_OPC_MULHH_SS, + TILEPRO_OPC_MULHH_SS_SN, + TILEPRO_OPC_MULHH_SU, + TILEPRO_OPC_MULHH_SU_SN, + TILEPRO_OPC_MULHH_UU, + TILEPRO_OPC_MULHH_UU_SN, + TILEPRO_OPC_MULHHA_SS, + TILEPRO_OPC_MULHHA_SS_SN, + TILEPRO_OPC_MULHHA_SU, + TILEPRO_OPC_MULHHA_SU_SN, + TILEPRO_OPC_MULHHA_UU, + TILEPRO_OPC_MULHHA_UU_SN, + TILEPRO_OPC_MULHHSA_UU, + TILEPRO_OPC_MULHHSA_UU_SN, + TILEPRO_OPC_MULHL_SS, + TILEPRO_OPC_MULHL_SS_SN, + TILEPRO_OPC_MULHL_SU, + TILEPRO_OPC_MULHL_SU_SN, + TILEPRO_OPC_MULHL_US, + TILEPRO_OPC_MULHL_US_SN, + TILEPRO_OPC_MULHL_UU, + TILEPRO_OPC_MULHL_UU_SN, + TILEPRO_OPC_MULHLA_SS, + TILEPRO_OPC_MULHLA_SS_SN, + TILEPRO_OPC_MULHLA_SU, + TILEPRO_OPC_MULHLA_SU_SN, + TILEPRO_OPC_MULHLA_US, + TILEPRO_OPC_MULHLA_US_SN, + TILEPRO_OPC_MULHLA_UU, + TILEPRO_OPC_MULHLA_UU_SN, + TILEPRO_OPC_MULHLSA_UU, + TILEPRO_OPC_MULHLSA_UU_SN, + TILEPRO_OPC_MULLL_SS, + TILEPRO_OPC_MULLL_SS_SN, + TILEPRO_OPC_MULLL_SU, + TILEPRO_OPC_MULLL_SU_SN, + TILEPRO_OPC_MULLL_UU, + TILEPRO_OPC_MULLL_UU_SN, + TILEPRO_OPC_MULLLA_SS, + TILEPRO_OPC_MULLLA_SS_SN, + TILEPRO_OPC_MULLLA_SU, + TILEPRO_OPC_MULLLA_SU_SN, + TILEPRO_OPC_MULLLA_UU, + TILEPRO_OPC_MULLLA_UU_SN, + TILEPRO_OPC_MULLLSA_UU, + TILEPRO_OPC_MULLLSA_UU_SN, + TILEPRO_OPC_MVNZ, + TILEPRO_OPC_MVNZ_SN, + TILEPRO_OPC_MVZ, + TILEPRO_OPC_MVZ_SN, + TILEPRO_OPC_MZ, + TILEPRO_OPC_MZ_SN, + TILEPRO_OPC_MZB, + TILEPRO_OPC_MZB_SN, + TILEPRO_OPC_MZH, + TILEPRO_OPC_MZH_SN, + TILEPRO_OPC_NAP, + TILEPRO_OPC_NOP, + TILEPRO_OPC_NOR, + TILEPRO_OPC_NOR_SN, + TILEPRO_OPC_OR, + TILEPRO_OPC_OR_SN, + TILEPRO_OPC_ORI, + TILEPRO_OPC_ORI_SN, + TILEPRO_OPC_PACKBS_U, + TILEPRO_OPC_PACKBS_U_SN, + TILEPRO_OPC_PACKHB, + TILEPRO_OPC_PACKHB_SN, + TILEPRO_OPC_PACKHS, + TILEPRO_OPC_PACKHS_SN, + TILEPRO_OPC_PACKLB, + TILEPRO_OPC_PACKLB_SN, + TILEPRO_OPC_PCNT, + TILEPRO_OPC_PCNT_SN, + TILEPRO_OPC_RL, + TILEPRO_OPC_RL_SN, + TILEPRO_OPC_RLI, + TILEPRO_OPC_RLI_SN, + TILEPRO_OPC_S1A, + TILEPRO_OPC_S1A_SN, + TILEPRO_OPC_S2A, + TILEPRO_OPC_S2A_SN, + TILEPRO_OPC_S3A, + TILEPRO_OPC_S3A_SN, + TILEPRO_OPC_SADAB_U, + TILEPRO_OPC_SADAB_U_SN, + TILEPRO_OPC_SADAH, + TILEPRO_OPC_SADAH_SN, + TILEPRO_OPC_SADAH_U, + TILEPRO_OPC_SADAH_U_SN, + TILEPRO_OPC_SADB_U, + TILEPRO_OPC_SADB_U_SN, + TILEPRO_OPC_SADH, + TILEPRO_OPC_SADH_SN, + TILEPRO_OPC_SADH_U, + TILEPRO_OPC_SADH_U_SN, + TILEPRO_OPC_SB, + TILEPRO_OPC_SBADD, + TILEPRO_OPC_SEQ, + TILEPRO_OPC_SEQ_SN, + TILEPRO_OPC_SEQB, + TILEPRO_OPC_SEQB_SN, + TILEPRO_OPC_SEQH, + TILEPRO_OPC_SEQH_SN, + TILEPRO_OPC_SEQI, + TILEPRO_OPC_SEQI_SN, + TILEPRO_OPC_SEQIB, + TILEPRO_OPC_SEQIB_SN, + TILEPRO_OPC_SEQIH, + TILEPRO_OPC_SEQIH_SN, + TILEPRO_OPC_SH, + TILEPRO_OPC_SHADD, + TILEPRO_OPC_SHL, + TILEPRO_OPC_SHL_SN, + TILEPRO_OPC_SHLB, + TILEPRO_OPC_SHLB_SN, + TILEPRO_OPC_SHLH, + TILEPRO_OPC_SHLH_SN, + TILEPRO_OPC_SHLI, + TILEPRO_OPC_SHLI_SN, + TILEPRO_OPC_SHLIB, + TILEPRO_OPC_SHLIB_SN, + TILEPRO_OPC_SHLIH, + TILEPRO_OPC_SHLIH_SN, + TILEPRO_OPC_SHR, + TILEPRO_OPC_SHR_SN, + TILEPRO_OPC_SHRB, + TILEPRO_OPC_SHRB_SN, + TILEPRO_OPC_SHRH, + TILEPRO_OPC_SHRH_SN, + TILEPRO_OPC_SHRI, + TILEPRO_OPC_SHRI_SN, + TILEPRO_OPC_SHRIB, + TILEPRO_OPC_SHRIB_SN, + TILEPRO_OPC_SHRIH, + TILEPRO_OPC_SHRIH_SN, + TILEPRO_OPC_SLT, + TILEPRO_OPC_SLT_SN, + TILEPRO_OPC_SLT_U, + TILEPRO_OPC_SLT_U_SN, + TILEPRO_OPC_SLTB, + TILEPRO_OPC_SLTB_SN, + TILEPRO_OPC_SLTB_U, + TILEPRO_OPC_SLTB_U_SN, + TILEPRO_OPC_SLTE, + TILEPRO_OPC_SLTE_SN, + TILEPRO_OPC_SLTE_U, + TILEPRO_OPC_SLTE_U_SN, + TILEPRO_OPC_SLTEB, + TILEPRO_OPC_SLTEB_SN, + TILEPRO_OPC_SLTEB_U, + TILEPRO_OPC_SLTEB_U_SN, + TILEPRO_OPC_SLTEH, + TILEPRO_OPC_SLTEH_SN, + TILEPRO_OPC_SLTEH_U, + TILEPRO_OPC_SLTEH_U_SN, + TILEPRO_OPC_SLTH, + TILEPRO_OPC_SLTH_SN, + TILEPRO_OPC_SLTH_U, + TILEPRO_OPC_SLTH_U_SN, + TILEPRO_OPC_SLTI, + TILEPRO_OPC_SLTI_SN, + TILEPRO_OPC_SLTI_U, + TILEPRO_OPC_SLTI_U_SN, + TILEPRO_OPC_SLTIB, + TILEPRO_OPC_SLTIB_SN, + TILEPRO_OPC_SLTIB_U, + TILEPRO_OPC_SLTIB_U_SN, + TILEPRO_OPC_SLTIH, + TILEPRO_OPC_SLTIH_SN, + TILEPRO_OPC_SLTIH_U, + TILEPRO_OPC_SLTIH_U_SN, + TILEPRO_OPC_SNE, + TILEPRO_OPC_SNE_SN, + TILEPRO_OPC_SNEB, + TILEPRO_OPC_SNEB_SN, + TILEPRO_OPC_SNEH, + TILEPRO_OPC_SNEH_SN, + TILEPRO_OPC_SRA, + TILEPRO_OPC_SRA_SN, + TILEPRO_OPC_SRAB, + TILEPRO_OPC_SRAB_SN, + TILEPRO_OPC_SRAH, + TILEPRO_OPC_SRAH_SN, + TILEPRO_OPC_SRAI, + TILEPRO_OPC_SRAI_SN, + TILEPRO_OPC_SRAIB, + TILEPRO_OPC_SRAIB_SN, + TILEPRO_OPC_SRAIH, + TILEPRO_OPC_SRAIH_SN, + TILEPRO_OPC_SUB, + TILEPRO_OPC_SUB_SN, + TILEPRO_OPC_SUBB, + TILEPRO_OPC_SUBB_SN, + TILEPRO_OPC_SUBBS_U, + TILEPRO_OPC_SUBBS_U_SN, + TILEPRO_OPC_SUBH, + TILEPRO_OPC_SUBH_SN, + TILEPRO_OPC_SUBHS, + TILEPRO_OPC_SUBHS_SN, + TILEPRO_OPC_SUBS, + TILEPRO_OPC_SUBS_SN, + TILEPRO_OPC_SW, + TILEPRO_OPC_SWADD, + TILEPRO_OPC_SWINT0, + TILEPRO_OPC_SWINT1, + TILEPRO_OPC_SWINT2, + TILEPRO_OPC_SWINT3, + TILEPRO_OPC_TBLIDXB0, + TILEPRO_OPC_TBLIDXB0_SN, + TILEPRO_OPC_TBLIDXB1, + TILEPRO_OPC_TBLIDXB1_SN, + TILEPRO_OPC_TBLIDXB2, + TILEPRO_OPC_TBLIDXB2_SN, + TILEPRO_OPC_TBLIDXB3, + TILEPRO_OPC_TBLIDXB3_SN, + TILEPRO_OPC_TNS, + TILEPRO_OPC_TNS_SN, + TILEPRO_OPC_WH64, + TILEPRO_OPC_XOR, + TILEPRO_OPC_XOR_SN, + TILEPRO_OPC_XORI, + TILEPRO_OPC_XORI_SN, + TILEPRO_OPC_NONE +} tilepro_mnemonic; + +/* 64-bit pattern for a { bpt ; nop } bundle. */ +#define TILEPRO_BPT_BUNDLE 0x400b3cae70166000ULL + +#ifndef DISASM_ONLY + +enum +{ + TILEPRO_SN_MAX_OPERANDS = 6 /* route */ +}; + +typedef enum +{ + TILEPRO_SN_OPC_BZ, + TILEPRO_SN_OPC_BNZ, + TILEPRO_SN_OPC_JRR, + TILEPRO_SN_OPC_FNOP, + TILEPRO_SN_OPC_BLZ, + TILEPRO_SN_OPC_NOP, + TILEPRO_SN_OPC_MOVEI, + TILEPRO_SN_OPC_MOVE, + TILEPRO_SN_OPC_BGEZ, + TILEPRO_SN_OPC_JR, + TILEPRO_SN_OPC_BLEZ, + TILEPRO_SN_OPC_BBNS, + TILEPRO_SN_OPC_JALRR, + TILEPRO_SN_OPC_BPT, + TILEPRO_SN_OPC_JALR, + TILEPRO_SN_OPC_SHR1, + TILEPRO_SN_OPC_BGZ, + TILEPRO_SN_OPC_BBS, + TILEPRO_SN_OPC_SHL8II, + TILEPRO_SN_OPC_ADDI, + TILEPRO_SN_OPC_HALT, + TILEPRO_SN_OPC_ROUTE, + TILEPRO_SN_OPC_NONE +} tilepro_sn_mnemonic; + +extern const unsigned char tilepro_sn_route_encode[6 * 6 * 6]; +extern const signed char tilepro_sn_route_decode[256][3]; +extern const char tilepro_sn_direction_names[6][5]; +extern const signed char tilepro_sn_dest_map[6][6]; +#endif /* DISASM_ONLY */ + + +static __inline unsigned int +get_BrOff_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3ff); +} + +static __inline unsigned int +get_BrOff_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x00007fff) | + (((unsigned int)(n >> 20)) & 0x00018000); +} + +static __inline unsigned int +get_BrType_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0xf); +} + +static __inline unsigned int +get_Dest_Imm8_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 43)) & 0x000000c0); +} + +static __inline unsigned int +get_Dest_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 2)) & 0x3); +} + +static __inline unsigned int +get_Dest_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3f); +} + +static __inline unsigned int +get_Dest_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x3f); +} + +static __inline unsigned int +get_Dest_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3f); +} + +static __inline unsigned int +get_Dest_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x3f); +} + +static __inline unsigned int +get_Imm16_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xffff); +} + +static __inline unsigned int +get_Imm16_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xffff); +} + +static __inline unsigned int +get_Imm8_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0xff); +} + +static __inline unsigned int +get_Imm8_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xff); +} + +static __inline unsigned int +get_Imm8_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xff); +} + +static __inline unsigned int +get_Imm8_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0xff); +} + +static __inline unsigned int +get_Imm8_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0xff); +} + +static __inline unsigned int +get_ImmOpcodeExtension_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 20)) & 0x7f); +} + +static __inline unsigned int +get_ImmOpcodeExtension_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 51)) & 0x7f); +} + +static __inline unsigned int +get_ImmRROpcodeExtension_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 8)) & 0x3); +} + +static __inline unsigned int +get_JOffLong_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x00007fff) | + (((unsigned int)(n >> 20)) & 0x00018000) | + (((unsigned int)(n >> 14)) & 0x001e0000) | + (((unsigned int)(n >> 16)) & 0x07e00000) | + (((unsigned int)(n >> 31)) & 0x18000000); +} + +static __inline unsigned int +get_JOff_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x00007fff) | + (((unsigned int)(n >> 20)) & 0x00018000) | + (((unsigned int)(n >> 14)) & 0x001e0000) | + (((unsigned int)(n >> 16)) & 0x07e00000) | + (((unsigned int)(n >> 31)) & 0x08000000); +} + +static __inline unsigned int +get_MF_Imm15_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x00003fff) | + (((unsigned int)(n >> 44)) & 0x00004000); +} + +static __inline unsigned int +get_MMEnd_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x1f); +} + +static __inline unsigned int +get_MMEnd_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x1f); +} + +static __inline unsigned int +get_MMStart_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 23)) & 0x1f); +} + +static __inline unsigned int +get_MMStart_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 54)) & 0x1f); +} + +static __inline unsigned int +get_MT_Imm15_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 31)) & 0x0000003f) | + (((unsigned int)(n >> 37)) & 0x00003fc0) | + (((unsigned int)(n >> 44)) & 0x00004000); +} + +static __inline unsigned int +get_Mode(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 63)) & 0x1); +} + +static __inline unsigned int +get_NoRegOpcodeExtension_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0xf); +} + +static __inline unsigned int +get_Opcode_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 10)) & 0x3f); +} + +static __inline unsigned int +get_Opcode_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 28)) & 0x7); +} + +static __inline unsigned int +get_Opcode_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 59)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 27)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 59)) & 0xf); +} + +static __inline unsigned int +get_Opcode_Y2(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 56)) & 0x7); +} + +static __inline unsigned int +get_RROpcodeExtension_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 4)) & 0xf); +} + +static __inline unsigned int +get_RRROpcodeExtension_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x1ff); +} + +static __inline unsigned int +get_RRROpcodeExtension_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x1ff); +} + +static __inline unsigned int +get_RRROpcodeExtension_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 18)) & 0x3); +} + +static __inline unsigned int +get_RRROpcodeExtension_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 49)) & 0x3); +} + +static __inline unsigned int +get_RouteOpcodeExtension_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3ff); +} + +static __inline unsigned int +get_S_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 27)) & 0x1); +} + +static __inline unsigned int +get_S_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 58)) & 0x1); +} + +static __inline unsigned int +get_ShAmt_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x1f); +} + +static __inline unsigned int +get_ShAmt_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x1f); +} + +static __inline unsigned int +get_ShAmt_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x1f); +} + +static __inline unsigned int +get_ShAmt_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x1f); +} + +static __inline unsigned int +get_SrcA_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 6)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 6)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 37)) & 0x3f); +} + +static __inline unsigned int +get_SrcA_Y2(tilepro_bundle_bits n) +{ + return (((n >> 26)) & 0x00000001) | + (((unsigned int)(n >> 50)) & 0x0000003e); +} + +static __inline unsigned int +get_SrcBDest_Y2(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 20)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x3f); +} + +static __inline unsigned int +get_SrcB_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x3f); +} + +static __inline unsigned int +get_Src_SN(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 0)) & 0x3); +} + +static __inline unsigned int +get_UnOpcodeExtension_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x1f); +} + +static __inline unsigned int +get_UnOpcodeExtension_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x1f); +} + +static __inline unsigned int +get_UnOpcodeExtension_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 12)) & 0x1f); +} + +static __inline unsigned int +get_UnOpcodeExtension_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 43)) & 0x1f); +} + +static __inline unsigned int +get_UnShOpcodeExtension_X0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 17)) & 0x3ff); +} + +static __inline unsigned int +get_UnShOpcodeExtension_X1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 48)) & 0x3ff); +} + +static __inline unsigned int +get_UnShOpcodeExtension_Y0(tilepro_bundle_bits num) +{ + const unsigned int n = (unsigned int)num; + return (((n >> 17)) & 0x7); +} + +static __inline unsigned int +get_UnShOpcodeExtension_Y1(tilepro_bundle_bits n) +{ + return (((unsigned int)(n >> 48)) & 0x7); +} + + +static __inline int +sign_extend(int n, int num_bits) +{ + int shift = (int)(sizeof(int) * 8 - num_bits); + return (n << shift) >> shift; +} + + + +static __inline tilepro_bundle_bits +create_BrOff_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 0); +} + +static __inline tilepro_bundle_bits +create_BrOff_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x00007fff)) << 43) | + (((tilepro_bundle_bits)(n & 0x00018000)) << 20); +} + +static __inline tilepro_bundle_bits +create_BrType_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0xf)) << 31); +} + +static __inline tilepro_bundle_bits +create_Dest_Imm8_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilepro_bundle_bits)(n & 0x000000c0)) << 43); +} + +static __inline tilepro_bundle_bits +create_Dest_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 2); +} + +static __inline tilepro_bundle_bits +create_Dest_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 0); +} + +static __inline tilepro_bundle_bits +create_Dest_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3f)) << 31); +} + +static __inline tilepro_bundle_bits +create_Dest_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 0); +} + +static __inline tilepro_bundle_bits +create_Dest_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3f)) << 31); +} + +static __inline tilepro_bundle_bits +create_Imm16_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xffff) << 12); +} + +static __inline tilepro_bundle_bits +create_Imm16_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0xffff)) << 43); +} + +static __inline tilepro_bundle_bits +create_Imm8_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 0); +} + +static __inline tilepro_bundle_bits +create_Imm8_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 12); +} + +static __inline tilepro_bundle_bits +create_Imm8_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0xff)) << 43); +} + +static __inline tilepro_bundle_bits +create_Imm8_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xff) << 12); +} + +static __inline tilepro_bundle_bits +create_Imm8_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0xff)) << 43); +} + +static __inline tilepro_bundle_bits +create_ImmOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x7f) << 20); +} + +static __inline tilepro_bundle_bits +create_ImmOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x7f)) << 51); +} + +static __inline tilepro_bundle_bits +create_ImmRROpcodeExtension_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 8); +} + +static __inline tilepro_bundle_bits +create_JOffLong_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x00007fff)) << 43) | + (((tilepro_bundle_bits)(n & 0x00018000)) << 20) | + (((tilepro_bundle_bits)(n & 0x001e0000)) << 14) | + (((tilepro_bundle_bits)(n & 0x07e00000)) << 16) | + (((tilepro_bundle_bits)(n & 0x18000000)) << 31); +} + +static __inline tilepro_bundle_bits +create_JOff_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x00007fff)) << 43) | + (((tilepro_bundle_bits)(n & 0x00018000)) << 20) | + (((tilepro_bundle_bits)(n & 0x001e0000)) << 14) | + (((tilepro_bundle_bits)(n & 0x07e00000)) << 16) | + (((tilepro_bundle_bits)(n & 0x08000000)) << 31); +} + +static __inline tilepro_bundle_bits +create_MF_Imm15_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x00003fff)) << 37) | + (((tilepro_bundle_bits)(n & 0x00004000)) << 44); +} + +static __inline tilepro_bundle_bits +create_MMEnd_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1f) << 18); +} + +static __inline tilepro_bundle_bits +create_MMEnd_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1f)) << 49); +} + +static __inline tilepro_bundle_bits +create_MMStart_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1f) << 23); +} + +static __inline tilepro_bundle_bits +create_MMStart_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1f)) << 54); +} + +static __inline tilepro_bundle_bits +create_MT_Imm15_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x0000003f)) << 31) | + (((tilepro_bundle_bits)(n & 0x00003fc0)) << 37) | + (((tilepro_bundle_bits)(n & 0x00004000)) << 44); +} + +static __inline tilepro_bundle_bits +create_Mode(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1)) << 63); +} + +static __inline tilepro_bundle_bits +create_NoRegOpcodeExtension_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 0); +} + +static __inline tilepro_bundle_bits +create_Opcode_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 10); +} + +static __inline tilepro_bundle_bits +create_Opcode_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x7) << 28); +} + +static __inline tilepro_bundle_bits +create_Opcode_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0xf)) << 59); +} + +static __inline tilepro_bundle_bits +create_Opcode_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 27); +} + +static __inline tilepro_bundle_bits +create_Opcode_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0xf)) << 59); +} + +static __inline tilepro_bundle_bits +create_Opcode_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x7)) << 56); +} + +static __inline tilepro_bundle_bits +create_RROpcodeExtension_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0xf) << 4); +} + +static __inline tilepro_bundle_bits +create_RRROpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1ff) << 18); +} + +static __inline tilepro_bundle_bits +create_RRROpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1ff)) << 49); +} + +static __inline tilepro_bundle_bits +create_RRROpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 18); +} + +static __inline tilepro_bundle_bits +create_RRROpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3)) << 49); +} + +static __inline tilepro_bundle_bits +create_RouteOpcodeExtension_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 0); +} + +static __inline tilepro_bundle_bits +create_S_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1) << 27); +} + +static __inline tilepro_bundle_bits +create_S_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1)) << 58); +} + +static __inline tilepro_bundle_bits +create_ShAmt_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1f) << 12); +} + +static __inline tilepro_bundle_bits +create_ShAmt_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1f)) << 43); +} + +static __inline tilepro_bundle_bits +create_ShAmt_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1f) << 12); +} + +static __inline tilepro_bundle_bits +create_ShAmt_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1f)) << 43); +} + +static __inline tilepro_bundle_bits +create_SrcA_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 6); +} + +static __inline tilepro_bundle_bits +create_SrcA_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3f)) << 37); +} + +static __inline tilepro_bundle_bits +create_SrcA_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 6); +} + +static __inline tilepro_bundle_bits +create_SrcA_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3f)) << 37); +} + +static __inline tilepro_bundle_bits +create_SrcA_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x00000001) << 26) | + (((tilepro_bundle_bits)(n & 0x0000003e)) << 50); +} + +static __inline tilepro_bundle_bits +create_SrcBDest_Y2(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 20); +} + +static __inline tilepro_bundle_bits +create_SrcB_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilepro_bundle_bits +create_SrcB_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilepro_bundle_bits +create_SrcB_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3f) << 12); +} + +static __inline tilepro_bundle_bits +create_SrcB_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3f)) << 43); +} + +static __inline tilepro_bundle_bits +create_Src_SN(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3) << 0); +} + +static __inline tilepro_bundle_bits +create_UnOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1f) << 12); +} + +static __inline tilepro_bundle_bits +create_UnOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1f)) << 43); +} + +static __inline tilepro_bundle_bits +create_UnOpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x1f) << 12); +} + +static __inline tilepro_bundle_bits +create_UnOpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x1f)) << 43); +} + +static __inline tilepro_bundle_bits +create_UnShOpcodeExtension_X0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x3ff) << 17); +} + +static __inline tilepro_bundle_bits +create_UnShOpcodeExtension_X1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x3ff)) << 48); +} + +static __inline tilepro_bundle_bits +create_UnShOpcodeExtension_Y0(int num) +{ + const unsigned int n = (unsigned int)num; + return ((n & 0x7) << 17); +} + +static __inline tilepro_bundle_bits +create_UnShOpcodeExtension_Y1(int num) +{ + const unsigned int n = (unsigned int)num; + return (((tilepro_bundle_bits)(n & 0x7)) << 48); +} + + + +typedef enum +{ + TILEPRO_PIPELINE_X0, + TILEPRO_PIPELINE_X1, + TILEPRO_PIPELINE_Y0, + TILEPRO_PIPELINE_Y1, + TILEPRO_PIPELINE_Y2, +} tilepro_pipeline; + +#define tilepro_is_x_pipeline(p) ((int)(p) <= (int)TILEPRO_PIPELINE_X1) + +typedef enum +{ + TILEPRO_OP_TYPE_REGISTER, + TILEPRO_OP_TYPE_IMMEDIATE, + TILEPRO_OP_TYPE_ADDRESS, + TILEPRO_OP_TYPE_SPR +} tilepro_operand_type; + +/* This is the bit that determines if a bundle is in the Y encoding. */ +#define TILEPRO_BUNDLE_Y_ENCODING_MASK ((tilepro_bundle_bits)1 << 63) + +enum +{ + /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */ + TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE = 3, + + /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */ + TILEPRO_NUM_PIPELINE_ENCODINGS = 5, + + /* Log base 2 of TILEPRO_BUNDLE_SIZE_IN_BYTES. */ + TILEPRO_LOG2_BUNDLE_SIZE_IN_BYTES = 3, + + /* Instructions take this many bytes. */ + TILEPRO_BUNDLE_SIZE_IN_BYTES = 1 << TILEPRO_LOG2_BUNDLE_SIZE_IN_BYTES, + + /* Log base 2 of TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES. */ + TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3, + + /* Bundles should be aligned modulo this number of bytes. */ + TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES = + (1 << TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES), + + /* Log base 2 of TILEPRO_SN_INSTRUCTION_SIZE_IN_BYTES. */ + TILEPRO_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES = 1, + + /* Static network instructions take this many bytes. */ + TILEPRO_SN_INSTRUCTION_SIZE_IN_BYTES = + (1 << TILEPRO_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES), + + /* Number of registers (some are magic, such as network I/O). */ + TILEPRO_NUM_REGISTERS = 64, + + /* Number of static network registers. */ + TILEPRO_NUM_SN_REGISTERS = 4 +}; + + +struct tilepro_operand +{ + /* Is this operand a register, immediate or address? */ + tilepro_operand_type type; + + /* The default relocation type for this operand. */ + signed int default_reloc : 16; + + /* How many bits is this value? (used for range checking) */ + unsigned int num_bits : 5; + + /* Is the value signed? (used for range checking) */ + unsigned int is_signed : 1; + + /* Is this operand a source register? */ + unsigned int is_src_reg : 1; + + /* Is this operand written? (i.e. is it a destination register) */ + unsigned int is_dest_reg : 1; + + /* Is this operand PC-relative? */ + unsigned int is_pc_relative : 1; + + /* By how many bits do we right shift the value before inserting? */ + unsigned int rightshift : 2; + + /* Return the bits for this operand to be ORed into an existing bundle. */ + tilepro_bundle_bits (*insert) (int op); + + /* Extract this operand and return it. */ + unsigned int (*extract) (tilepro_bundle_bits bundle); +}; + + +extern const struct tilepro_operand tilepro_operands[]; + +/* One finite-state machine per pipe for rapid instruction decoding. */ +extern const unsigned short * const +tilepro_bundle_decoder_fsms[TILEPRO_NUM_PIPELINE_ENCODINGS]; + + +struct tilepro_opcode +{ + /* The opcode mnemonic, e.g. "add" */ + const char *name; + + /* The enum value for this mnemonic. */ + tilepro_mnemonic mnemonic; + + /* A bit mask of which of the five pipes this instruction + is compatible with: + X0 0x01 + X1 0x02 + Y0 0x04 + Y1 0x08 + Y2 0x10 */ + unsigned char pipes; + + /* How many operands are there? */ + unsigned char num_operands; + + /* Which register does this write implicitly, or TREG_ZERO if none? */ + unsigned char implicitly_written_register; + + /* Can this be bundled with other instructions (almost always true). */ + unsigned char can_bundle; + + /* The description of the operands. Each of these is an + * index into the tilepro_operands[] table. */ + unsigned char operands[TILEPRO_NUM_PIPELINE_ENCODINGS][TILEPRO_MAX_OPERANDS]; + +#if !defined(__KERNEL__) && !defined(_LIBC) + /* A mask of which bits have predefined values for each pipeline. + * This is useful for disassembly. */ + tilepro_bundle_bits fixed_bit_masks[TILEPRO_NUM_PIPELINE_ENCODINGS]; + + /* For each bit set in fixed_bit_masks, what the value is for this + * instruction. */ + tilepro_bundle_bits fixed_bit_values[TILEPRO_NUM_PIPELINE_ENCODINGS]; +#endif +}; + +extern const struct tilepro_opcode tilepro_opcodes[]; + +#if !defined(__KERNEL__) && !defined(_LIBC) + +typedef unsigned short tilepro_sn_instruction_bits; + +struct tilepro_sn_opcode +{ + /* The opcode mnemonic, e.g. "add" */ + const char *name; + + /* The enum value for this mnemonic. */ + tilepro_sn_mnemonic mnemonic; + + /* How many operands are there? */ + unsigned char num_operands; + + /* The description of the operands. Each of these is an + * index into the tilepro_operands[] table. */ + unsigned char operands[TILEPRO_SN_MAX_OPERANDS]; + + /* A mask of which bits have predefined values. + * This is useful for disassembly. */ + tilepro_sn_instruction_bits fixed_bit_mask; + + /* For each bit set in fixed_bit_masks, what its value is. */ + tilepro_sn_instruction_bits fixed_bit_values; +}; + +extern const struct tilepro_sn_opcode tilepro_sn_opcodes[]; + +#endif /* !__KERNEL__ && !_LIBC */ + +/* Used for non-textual disassembly into structs. */ +struct tilepro_decoded_instruction +{ + const struct tilepro_opcode *opcode; + const struct tilepro_operand *operands[TILEPRO_MAX_OPERANDS]; + int operand_values[TILEPRO_MAX_OPERANDS]; +}; + + +/* Disassemble a bundle into a struct for machine processing. */ +extern int parse_insn_tilepro(tilepro_bundle_bits bits, + unsigned int pc, + struct tilepro_decoded_instruction + decoded[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE]); + + +/* Given a set of bundle bits and a specific pipe, returns which + * instruction the bundle contains in that pipe. + */ +extern const struct tilepro_opcode * +find_opcode(tilepro_bundle_bits bits, tilepro_pipeline pipe); + + +#if !defined(__KERNEL__) && !defined(_LIBC) +/* Canonical names of all the registers. */ +/* ISSUE: This table lives in "tilepro-dis.c" */ +extern const char * const tilepro_register_names[]; + +/* Descriptor for a special-purpose register. */ +struct tilepro_spr +{ + /* The number */ + int number; + + /* The name */ + const char *name; +}; + +/* List of all the SPRs; ordered by increasing number. */ +extern const struct tilepro_spr tilepro_sprs[]; + +/* Number of special-purpose registers. */ +extern const int tilepro_num_sprs; + +extern const char * +get_tilepro_spr_name (int num); +#endif /* !__KERNEL__ && !_LIBC */ + +/* Make a few "tile_" variables to simply common code between + architectures. */ + +typedef tilepro_bundle_bits tile_bundle_bits; +#define TILE_BUNDLE_SIZE_IN_BYTES TILEPRO_BUNDLE_SIZE_IN_BYTES +#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES +#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ + TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES + +#endif /* opcode_tilepro_h */ diff --git a/include/opcode/v850.h b/include/opcode/v850.h new file mode 100644 index 0000000..02ef3d4 --- /dev/null +++ b/include/opcode/v850.h @@ -0,0 +1,240 @@ +/* v850.h -- Header file for NEC V850 opcode table + Copyright 1996-2013 Free Software Foundation, Inc. + Written by J.T. Conklin, Cygnus Support + + This file is part of GDB, GAS, and the GNU binutils. + + GDB, GAS, and the GNU binutils are free software; you can redistribute + them and/or modify them under the terms of the GNU General Public + License as published by the Free Software Foundation; either version 3, + or (at your option) any later version. + + GDB, GAS, and the GNU binutils are distributed in the hope that they + 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 file; see the file COPYING3. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef V850_H +#define V850_H + +/* The opcode table is an array of struct v850_opcode. */ + +struct v850_opcode +{ + /* The opcode name. */ + const char *name; + + /* The opcode itself. Those bits which will be filled in with + operands are zeroes. */ + unsigned long opcode; + + /* The opcode mask. This is used by the disassembler. This is a + mask containing ones indicating those bits which must match the + opcode field, and zeroes indicating those bits which need not + match (and are presumably filled in by operands). */ + unsigned long mask; + + /* An array of operand codes. Each code is an index into the + operand table. They appear in the order which the operands must + appear in assembly code, and are terminated by a zero. */ + unsigned char operands[8]; + + /* Which (if any) operand is a memory operand. */ + unsigned int memop; + + /* Target processor(s). A bit field of processors which support + this instruction. Note a bit field is used as some instructions + are available on multiple, different processor types, whereas + other instructions are only available on one specific type. */ + unsigned int processors; +}; + +/* Values for architecture number. */ +#define arch_V850 0 +#define arch_V850E (arch_V850 + 1) +#define arch_V850E1 (arch_V850E + 1) +#define arch_V850E2 (arch_V850E1 + 1) +#define arch_V850E2V3 (arch_V850E2 + 1) +#define arch_V850E3V5 (arch_V850E2V3 + 1) +#define arch_separator (arch_V850E3V5 + 1) + +#define opt_EXTENSION (arch_separator) +#define opt_ALIAS (opt_EXTENSION + 1) + +/* Values for the processors field in the v850_opcode structure. */ +#define PROCESSOR_V850 (1 << (arch_V850)) /* Just the V850. */ +#define PROCESSOR_V850E (1 << (arch_V850E)) /* Just the V850E. */ +#define PROCESSOR_V850E1 (1 << (arch_V850E1)) /* Just the V850E1. */ +#define PROCESSOR_V850E2 (1 << (arch_V850E2)) /* Just the V850E2. */ +#define PROCESSOR_V850E2V3 (1 << (arch_V850E2V3)) /* Just the V850E2V3. */ +#define PROCESSOR_V850E3V5 (1 << (arch_V850E3V5)) /* Just the V850E3V5. */ + +/* UPPERS */ +#define PROCESSOR_V850E3V5_UP (PROCESSOR_V850E3V5) +#define PROCESSOR_V850E2V3_UP (PROCESSOR_V850E2V3 | PROCESSOR_V850E3V5_UP) +#define PROCESSOR_V850E2_UP (PROCESSOR_V850E2 | PROCESSOR_V850E2V3_UP) +#define PROCESSOR_V850E_UP (PROCESSOR_V850E | PROCESSOR_V850E1 | PROCESSOR_V850E2_UP) +#define PROCESSOR_ALL (PROCESSOR_V850 | PROCESSOR_V850E_UP) + +#define PROCESSOR_MASK (PROCESSOR_ALL) +#define PROCESSOR_NOT_V850 (PROCESSOR_ALL & (~ PROCESSOR_V850)) /* Any processor except the V850. */ + +#define PROCESSOR_UNKNOWN ~(PROCESSOR_MASK) + +/* OPTIONS */ +#define PROCESSOR_OPTION_EXTENSION (1 << (opt_EXTENSION)) /* Enable extension opcodes. */ +#define PROCESSOR_OPTION_ALIAS (1 << (opt_ALIAS)) /* Enable alias opcodes. */ + +#define SET_PROCESSOR_MASK(mask,set) ((mask) = ((mask) & ~PROCESSOR_MASK) | (set)) + +/* The table itself is sorted by major opcode number, and is otherwise + in the order in which the disassembler should consider + instructions. */ +extern const struct v850_opcode v850_opcodes[]; +extern const int v850_num_opcodes; + + +/* The operands table is an array of struct v850_operand. */ + +struct v850_operand +{ + /* The number of bits in the operand. */ + /* If this value is -1 then the operand's bits are in a discontinous + distribution in the instruction. */ + int bits; + + /* (bits >= 0): How far the operand is left shifted in the instruction. */ + /* (bits == -1): Bit mask of the bits in the operand. */ + int shift; + + /* Insertion function. This is used by the assembler. To insert an + operand value into an instruction, check this field. + + If it is NULL, execute + i |= (op & ((1 << o->bits) - 1)) << o->shift; + (i is the instruction which we are filling in, o is a pointer to + this structure, and op is the opcode value; this assumes twos + complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction and the operand value. It will return the new value + of the instruction. If the ERRMSG argument is not NULL, then if + the operand value is illegal, *ERRMSG will be set to a warning + string (the operand will be inserted in any case). If the + operand value is legal, *ERRMSG will be unchanged (most operands + can accept any value). */ + unsigned long (* insert) + (unsigned long instruction, long op, const char ** errmsg); + + /* Extraction function. This is used by the disassembler. To + extract this operand type from an instruction, check this field. + + If it is NULL, compute + op = o->bits == -1 ? ((i) & o->shift) : ((i) >> o->shift) & ((1 << o->bits) - 1); + if (o->flags & V850_OPERAND_SIGNED) + op = (op << (32 - o->bits)) >> (32 - o->bits); + (i is the instruction, o is a pointer to this structure, and op + is the result; this assumes twos complement arithmetic). + + If this field is not NULL, then simply call it with the + instruction value. It will return the value of the operand. If + the INVALID argument is not NULL, *INVALID will be set to + non-zero if this operand type can not actually be extracted from + this operand (i.e., the instruction does not match). If the + operand is valid, *INVALID will not be changed. */ + unsigned long (* extract) (unsigned long instruction, int * invalid); + + /* One bit syntax flags. */ + int flags; + + int default_reloc; +}; + +/* Elements in the table are retrieved by indexing with values from + the operands field of the v850_opcodes table. */ + +extern const struct v850_operand v850_operands[]; + +/* Values defined for the flags field of a struct v850_operand. */ + +/* This operand names a general purpose register. */ +#define V850_OPERAND_REG 0x01 + +/* This operand is the ep register. */ +#define V850_OPERAND_EP 0x02 + +/* This operand names a system register. */ +#define V850_OPERAND_SRG 0x04 + +/* Prologue eilogue type instruction, V850E specific. */ +#define V850E_OPERAND_REG_LIST 0x08 + +/* This operand names a condition code used in the setf instruction. */ +#define V850_OPERAND_CC 0x10 + +#define V850_OPERAND_FLOAT_CC 0x20 + +/* This operand names a vector purpose register. */ +#define V850_OPERAND_VREG 0x40 + +/* 16 bit immediate follows instruction, V850E specific. */ +#define V850E_IMMEDIATE16 0x80 + +/* hi16 bit immediate follows instruction, V850E specific. */ +#define V850E_IMMEDIATE16HI 0x100 + +/* 23 bit immediate follows instruction, V850E specific. */ +#define V850E_IMMEDIATE23 0x200 + +/* 32 bit immediate follows instruction, V850E specific. */ +#define V850E_IMMEDIATE32 0x400 + +/* This is a relaxable operand. Only used for D9->D22 branch relaxing + right now. We may need others in the future (or maybe handle them like + promoted operands on the mn10300?). */ +#define V850_OPERAND_RELAX 0x800 + +/* This operand takes signed values. */ +#define V850_OPERAND_SIGNED 0x1000 + +/* This operand is a displacement. */ +#define V850_OPERAND_DISP 0x2000 + +/* This operand is a PC displacement. */ +#define V850_PCREL 0x4000 + +/* The register specified must be even number. */ +#define V850_REG_EVEN 0x8000 + +/* The register specified must not be r0. */ +#define V850_NOT_R0 0x20000 + +/* The register specified must not be 0. */ +#define V850_NOT_IMM0 0x40000 + +/* The condition code must not be SA CONDITION. */ +#define V850_NOT_SA 0x80000 + +/* The operand has '!' prefix. */ +#define V850_OPERAND_BANG 0x100000 + +/* The operand has '%' prefix. */ +#define V850_OPERAND_PERCENT 0x200000 + +/* This operand is a cache oparation. */ +#define V850_OPERAND_CACHEOP 0x400000 + +/* This operand is a prefetch oparation. */ +#define V850_OPERAND_PREFOP 0x800000 + +/* A PC-relative displacement where a positive value indicates a backwards displacement. */ +#define V850_INVERSE_PCREL 0x1000000 + +extern int v850_msg_is_out_of_range (const char *); + +#endif /* V850_H */ diff --git a/include/opcode/vax.h b/include/opcode/vax.h new file mode 100644 index 0000000..f5cdd24 --- /dev/null +++ b/include/opcode/vax.h @@ -0,0 +1,383 @@ +/* Vax opcde list. + Copyright 1989, 1991, 1992, 1995, 2010 Free Software Foundation, Inc. + + This file is part of GDB and GAS. + + GDB and GAS are 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, or (at your option) + any later version. + + GDB and GAS are 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 GDB or GAS; see the file COPYING3. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +#ifndef vax_opcodeT +#define vax_opcodeT int +#endif /* no vax_opcodeT */ + +struct vot_wot /* vax opcode table: wot to do with this */ + /* particular opcode */ +{ + const char *args; /* how to compile said opcode */ + vax_opcodeT code; /* op-code (may be > 8 bits!) */ +}; + +struct vot /* vax opcode text */ +{ + const char *name; /* opcode name: lowercase string [key] */ + struct vot_wot detail; /* rest of opcode table [datum] */ +}; + +#define vot_how args +#define vot_code code +#define vot_detail detail +#define vot_name name + +static const struct vot +votstrs[] = +{ +{ "halt", {"", 0x00 } }, +{ "nop", {"", 0x01 } }, +{ "rei", {"", 0x02 } }, +{ "bpt", {"", 0x03 } }, +{ "ret", {"", 0x04 } }, +{ "rsb", {"", 0x05 } }, +{ "ldpctx", {"", 0x06 } }, +{ "svpctx", {"", 0x07 } }, +{ "cvtps", {"rwabrwab", 0x08 } }, +{ "cvtsp", {"rwabrwab", 0x09 } }, +{ "index", {"rlrlrlrlrlwl", 0x0a } }, +{ "crc", {"abrlrwab", 0x0b } }, +{ "prober", {"rbrwab", 0x0c } }, +{ "probew", {"rbrwab", 0x0d } }, +{ "insque", {"abab", 0x0e } }, +{ "remque", {"abwl", 0x0f } }, +{ "bsbb", {"bb", 0x10 } }, +{ "brb", {"bb", 0x11 } }, +{ "bneq", {"bb", 0x12 } }, +{ "bnequ", {"bb", 0x12 } }, +{ "beql", {"bb", 0x13 } }, +{ "beqlu", {"bb", 0x13 } }, +{ "bgtr", {"bb", 0x14 } }, +{ "bleq", {"bb", 0x15 } }, +{ "jsb", {"ab", 0x16 } }, +{ "jmp", {"ab", 0x17 } }, +{ "bgeq", {"bb", 0x18 } }, +{ "blss", {"bb", 0x19 } }, +{ "bgtru", {"bb", 0x1a } }, +{ "blequ", {"bb", 0x1b } }, +{ "bvc", {"bb", 0x1c } }, +{ "bvs", {"bb", 0x1d } }, +{ "bcc", {"bb", 0x1e } }, +{ "bgequ", {"bb", 0x1e } }, +{ "blssu", {"bb", 0x1f } }, +{ "bcs", {"bb", 0x1f } }, +{ "addp4", {"rwabrwab", 0x20 } }, +{ "addp6", {"rwabrwabrwab", 0x21 } }, +{ "subp4", {"rwabrwab", 0x22 } }, +{ "subp6", {"rwabrwabrwab", 0x23 } }, +{ "cvtpt", {"rwababrwab", 0x24 } }, +{ "mulp", {"rwabrwabrwab", 0x25 } }, +{ "cvttp", {"rwababrwab", 0x26 } }, +{ "divp", {"rwabrwabrwab", 0x27 } }, +{ "movc3", {"rwabab", 0x28 } }, +{ "cmpc3", {"rwabab", 0x29 } }, +{ "scanc", {"rwababrb", 0x2a } }, +{ "spanc", {"rwababrb", 0x2b } }, +{ "movc5", {"rwabrbrwab", 0x2c } }, +{ "cmpc5", {"rwabrbrwab", 0x2d } }, +{ "movtc", {"rwabrbabrwab", 0x2e } }, +{ "movtuc", {"rwabrbabrwab", 0x2f } }, +{ "bsbw", {"bw", 0x30 } }, +{ "brw", {"bw", 0x31 } }, +{ "cvtwl", {"rwwl", 0x32 } }, +{ "cvtwb", {"rwwb", 0x33 } }, +{ "movp", {"rwabab", 0x34 } }, +{ "cmpp3", {"rwabab", 0x35 } }, +{ "cvtpl", {"rwabwl", 0x36 } }, +{ "cmpp4", {"rwabrwab", 0x37 } }, +{ "editpc", {"rwababab", 0x38 } }, +{ "matchc", {"rwabrwab", 0x39 } }, +{ "locc", {"rbrwab", 0x3a } }, +{ "skpc", {"rbrwab", 0x3b } }, +{ "movzwl", {"rwwl", 0x3c } }, +{ "acbw", {"rwrwmwbw", 0x3d } }, +{ "movaw", {"awwl", 0x3e } }, +{ "pushaw", {"aw", 0x3f } }, +{ "addf2", {"rfmf", 0x40 } }, +{ "addf3", {"rfrfwf", 0x41 } }, +{ "subf2", {"rfmf", 0x42 } }, +{ "subf3", {"rfrfwf", 0x43 } }, +{ "mulf2", {"rfmf", 0x44 } }, +{ "mulf3", {"rfrfwf", 0x45 } }, +{ "divf2", {"rfmf", 0x46 } }, +{ "divf3", {"rfrfwf", 0x47 } }, +{ "cvtfb", {"rfwb", 0x48 } }, +{ "cvtfw", {"rfww", 0x49 } }, +{ "cvtfl", {"rfwl", 0x4a } }, +{ "cvtrfl", {"rfwl", 0x4b } }, +{ "cvtbf", {"rbwf", 0x4c } }, +{ "cvtwf", {"rwwf", 0x4d } }, +{ "cvtlf", {"rlwf", 0x4e } }, +{ "acbf", {"rfrfmfbw", 0x4f } }, +{ "movf", {"rfwf", 0x50 } }, +{ "cmpf", {"rfrf", 0x51 } }, +{ "mnegf", {"rfwf", 0x52 } }, +{ "tstf", {"rf", 0x53 } }, +{ "emodf", {"rfrbrfwlwf", 0x54 } }, +{ "polyf", {"rfrwab", 0x55 } }, +{ "cvtfd", {"rfwd", 0x56 } }, + /* opcode 57 is not defined yet */ +{ "adawi", {"rwmw", 0x58 } }, + /* opcode 59 is not defined yet */ + /* opcode 5a is not defined yet */ + /* opcode 5b is not defined yet */ +{ "insqhi", {"abaq", 0x5c } }, +{ "insqti", {"abaq", 0x5d } }, +{ "remqhi", {"aqwl", 0x5e } }, +{ "remqti", {"aqwl", 0x5f } }, +{ "addd2", {"rdmd", 0x60 } }, +{ "addd3", {"rdrdwd", 0x61 } }, +{ "subd2", {"rdmd", 0x62 } }, +{ "subd3", {"rdrdwd", 0x63 } }, +{ "muld2", {"rdmd", 0x64 } }, +{ "muld3", {"rdrdwd", 0x65 } }, +{ "divd2", {"rdmd", 0x66 } }, +{ "divd3", {"rdrdwd", 0x67 } }, +{ "cvtdb", {"rdwb", 0x68 } }, +{ "cvtdw", {"rdww", 0x69 } }, +{ "cvtdl", {"rdwl", 0x6a } }, +{ "cvtrdl", {"rdwl", 0x6b } }, +{ "cvtbd", {"rbwd", 0x6c } }, +{ "cvtwd", {"rwwd", 0x6d } }, +{ "cvtld", {"rlwd", 0x6e } }, +{ "acbd", {"rdrdmdbw", 0x6f } }, +{ "movd", {"rdwd", 0x70 } }, +{ "cmpd", {"rdrd", 0x71 } }, +{ "mnegd", {"rdwd", 0x72 } }, +{ "tstd", {"rd", 0x73 } }, +{ "emodd", {"rdrbrdwlwd", 0x74 } }, +{ "polyd", {"rdrwab", 0x75 } }, +{ "cvtdf", {"rdwf", 0x76 } }, + /* opcode 77 is not defined yet */ +{ "ashl", {"rbrlwl", 0x78 } }, +{ "ashq", {"rbrqwq", 0x79 } }, +{ "emul", {"rlrlrlwq", 0x7a } }, +{ "ediv", {"rlrqwlwl", 0x7b } }, +{ "clrd", {"wd", 0x7c } }, +{ "clrg", {"wg", 0x7c } }, +{ "clrq", {"wd", 0x7c } }, +{ "movq", {"rqwq", 0x7d } }, +{ "movaq", {"aqwl", 0x7e } }, +{ "movad", {"adwl", 0x7e } }, +{ "pushaq", {"aq", 0x7f } }, +{ "pushad", {"ad", 0x7f } }, +{ "addb2", {"rbmb", 0x80 } }, +{ "addb3", {"rbrbwb", 0x81 } }, +{ "subb2", {"rbmb", 0x82 } }, +{ "subb3", {"rbrbwb", 0x83 } }, +{ "mulb2", {"rbmb", 0x84 } }, +{ "mulb3", {"rbrbwb", 0x85 } }, +{ "divb2", {"rbmb", 0x86 } }, +{ "divb3", {"rbrbwb", 0x87 } }, +{ "bisb2", {"rbmb", 0x88 } }, +{ "bisb3", {"rbrbwb", 0x89 } }, +{ "bicb2", {"rbmb", 0x8a } }, +{ "bicb3", {"rbrbwb", 0x8b } }, +{ "xorb2", {"rbmb", 0x8c } }, +{ "xorb3", {"rbrbwb", 0x8d } }, +{ "mnegb", {"rbwb", 0x8e } }, +{ "caseb", {"rbrbrb", 0x8f } }, +{ "movb", {"rbwb", 0x90 } }, +{ "cmpb", {"rbrb", 0x91 } }, +{ "mcomb", {"rbwb", 0x92 } }, +{ "bitb", {"rbrb", 0x93 } }, +{ "clrb", {"wb", 0x94 } }, +{ "tstb", {"rb", 0x95 } }, +{ "incb", {"mb", 0x96 } }, +{ "decb", {"mb", 0x97 } }, +{ "cvtbl", {"rbwl", 0x98 } }, +{ "cvtbw", {"rbww", 0x99 } }, +{ "movzbl", {"rbwl", 0x9a } }, +{ "movzbw", {"rbww", 0x9b } }, +{ "rotl", {"rbrlwl", 0x9c } }, +{ "acbb", {"rbrbmbbw", 0x9d } }, +{ "movab", {"abwl", 0x9e } }, +{ "pushab", {"ab", 0x9f } }, +{ "addw2", {"rwmw", 0xa0 } }, +{ "addw3", {"rwrwww", 0xa1 } }, +{ "subw2", {"rwmw", 0xa2 } }, +{ "subw3", {"rwrwww", 0xa3 } }, +{ "mulw2", {"rwmw", 0xa4 } }, +{ "mulw3", {"rwrwww", 0xa5 } }, +{ "divw2", {"rwmw", 0xa6 } }, +{ "divw3", {"rwrwww", 0xa7 } }, +{ "bisw2", {"rwmw", 0xa8 } }, +{ "bisw3", {"rwrwww", 0xa9 } }, +{ "bicw2", {"rwmw", 0xaa } }, +{ "bicw3", {"rwrwww", 0xab } }, +{ "xorw2", {"rwmw", 0xac } }, +{ "xorw3", {"rwrwww", 0xad } }, +{ "mnegw", {"rwww", 0xae } }, +{ "casew", {"rwrwrw", 0xaf } }, +{ "movw", {"rwww", 0xb0 } }, +{ "cmpw", {"rwrw", 0xb1 } }, +{ "mcomw", {"rwww", 0xb2 } }, +{ "bitw", {"rwrw", 0xb3 } }, +{ "clrw", {"ww", 0xb4 } }, +{ "tstw", {"rw", 0xb5 } }, +{ "incw", {"mw", 0xb6 } }, +{ "decw", {"mw", 0xb7 } }, +{ "bispsw", {"rw", 0xb8 } }, +{ "bicpsw", {"rw", 0xb9 } }, +{ "popr", {"rw", 0xba } }, +{ "pushr", {"rw", 0xbb } }, +{ "chmk", {"rw", 0xbc } }, +{ "chme", {"rw", 0xbd } }, +{ "chms", {"rw", 0xbe } }, +{ "chmu", {"rw", 0xbf } }, +{ "addl2", {"rlml", 0xc0 } }, +{ "addl3", {"rlrlwl", 0xc1 } }, +{ "subl2", {"rlml", 0xc2 } }, +{ "subl3", {"rlrlwl", 0xc3 } }, +{ "mull2", {"rlml", 0xc4 } }, +{ "mull3", {"rlrlwl", 0xc5 } }, +{ "divl2", {"rlml", 0xc6 } }, +{ "divl3", {"rlrlwl", 0xc7 } }, +{ "bisl2", {"rlml", 0xc8 } }, +{ "bisl3", {"rlrlwl", 0xc9 } }, +{ "bicl2", {"rlml", 0xca } }, +{ "bicl3", {"rlrlwl", 0xcb } }, +{ "xorl2", {"rlml", 0xcc } }, +{ "xorl3", {"rlrlwl", 0xcd } }, +{ "mnegl", {"rlwl", 0xce } }, +{ "casel", {"rlrlrl", 0xcf } }, +{ "movl", {"rlwl", 0xd0 } }, +{ "cmpl", {"rlrl", 0xd1 } }, +{ "mcoml", {"rlwl", 0xd2 } }, +{ "bitl", {"rlrl", 0xd3 } }, +{ "clrf", {"wf", 0xd4 } }, +{ "clrl", {"wl", 0xd4 } }, +{ "tstl", {"rl", 0xd5 } }, +{ "incl", {"ml", 0xd6 } }, +{ "decl", {"ml", 0xd7 } }, +{ "adwc", {"rlml", 0xd8 } }, +{ "sbwc", {"rlml", 0xd9 } }, +{ "mtpr", {"rlrl", 0xda } }, +{ "mfpr", {"rlwl", 0xdb } }, +{ "movpsl", {"wl", 0xdc } }, +{ "pushl", {"rl", 0xdd } }, +{ "moval", {"alwl", 0xde } }, +{ "movaf", {"afwl", 0xde } }, +{ "pushal", {"al", 0xdf } }, +{ "pushaf", {"af", 0xdf } }, +{ "bbs", {"rlvbbb", 0xe0 } }, +{ "bbc", {"rlvbbb", 0xe1 } }, +{ "bbss", {"rlvbbb", 0xe2 } }, +{ "bbcs", {"rlvbbb", 0xe3 } }, +{ "bbsc", {"rlvbbb", 0xe4 } }, +{ "bbcc", {"rlvbbb", 0xe5 } }, +{ "bbssi", {"rlvbbb", 0xe6 } }, +{ "bbcci", {"rlvbbb", 0xe7 } }, +{ "blbs", {"rlbb", 0xe8 } }, +{ "blbc", {"rlbb", 0xe9 } }, +{ "ffs", {"rlrbvbwl", 0xea } }, +{ "ffc", {"rlrbvbwl", 0xeb } }, +{ "cmpv", {"rlrbvbrl", 0xec } }, +{ "cmpzv", {"rlrbvbrl", 0xed } }, +{ "extv", {"rlrbvbwl", 0xee } }, +{ "extzv", {"rlrbvbwl", 0xef } }, +{ "insv", {"rlrlrbvb", 0xf0 } }, +{ "acbl", {"rlrlmlbw", 0xf1 } }, +{ "aoblss", {"rlmlbb", 0xf2 } }, +{ "aobleq", {"rlmlbb", 0xf3 } }, +{ "sobgeq", {"mlbb", 0xf4 } }, +{ "sobgtr", {"mlbb", 0xf5 } }, +{ "cvtlb", {"rlwb", 0xf6 } }, +{ "cvtlw", {"rlww", 0xf7 } }, +{ "ashp", {"rbrwabrbrwab", 0xf8 } }, +{ "cvtlp", {"rlrwab", 0xf9 } }, +{ "callg", {"abab", 0xfa } }, +{ "calls", {"rlab", 0xfb } }, +{ "xfc", {"", 0xfc } }, + /* undefined opcodes here */ +{ "cvtdh", {"rdwh", 0x32fd } }, +{ "cvtgf", {"rgwh", 0x33fd } }, +{ "addg2", {"rgmg", 0x40fd } }, +{ "addg3", {"rgrgwg", 0x41fd } }, +{ "subg2", {"rgmg", 0x42fd } }, +{ "subg3", {"rgrgwg", 0x43fd } }, +{ "mulg2", {"rgmg", 0x44fd } }, +{ "mulg3", {"rgrgwg", 0x45fd } }, +{ "divg2", {"rgmg", 0x46fd } }, +{ "divg3", {"rgrgwg", 0x47fd } }, +{ "cvtgb", {"rgwb", 0x48fd } }, +{ "cvtgw", {"rgww", 0x49fd } }, +{ "cvtgl", {"rgwl", 0x4afd } }, +{ "cvtrgl", {"rgwl", 0x4bfd } }, +{ "cvtbg", {"rbwg", 0x4cfd } }, +{ "cvtwg", {"rwwg", 0x4dfd } }, +{ "cvtlg", {"rlwg", 0x4efd } }, +{ "acbg", {"rgrgmgbw", 0x4ffd } }, +{ "movg", {"rgwg", 0x50fd } }, +{ "cmpg", {"rgrg", 0x51fd } }, +{ "mnegg", {"rgwg", 0x52fd } }, +{ "tstg", {"rg", 0x53fd } }, +{ "emodg", {"rgrwrgwlwg", 0x54fd } }, +{ "polyg", {"rgrwab", 0x55fd } }, +{ "cvtgh", {"rgwh", 0x56fd } }, + /* undefined opcodes here */ +{ "addh2", {"rhmh", 0x60fd } }, +{ "addh3", {"rhrhwh", 0x61fd } }, +{ "subh2", {"rhmh", 0x62fd } }, +{ "subh3", {"rhrhwh", 0x63fd } }, +{ "mulh2", {"rhmh", 0x64fd } }, +{ "mulh3", {"rhrhwh", 0x65fd } }, +{ "divh2", {"rhmh", 0x66fd } }, +{ "divh3", {"rhrhwh", 0x67fd } }, +{ "cvthb", {"rhwb", 0x68fd } }, +{ "cvthw", {"rhww", 0x69fd } }, +{ "cvthl", {"rhwl", 0x6afd } }, +{ "cvtrhl", {"rhwl", 0x6bfd } }, +{ "cvtbh", {"rbwh", 0x6cfd } }, +{ "cvtwh", {"rwwh", 0x6dfd } }, +{ "cvtlh", {"rlwh", 0x6efd } }, +{ "acbh", {"rhrhmhbw", 0x6ffd } }, +{ "movh", {"rhwh", 0x70fd } }, +{ "cmph", {"rhrh", 0x71fd } }, +{ "mnegh", {"rhwh", 0x72fd } }, +{ "tsth", {"rh", 0x73fd } }, +{ "emodh", {"rhrwrhwlwh", 0x74fd } }, +{ "polyh", {"rhrwab", 0x75fd } }, +{ "cvthg", {"rhwg", 0x76fd } }, + /* undefined opcodes here */ +{ "clrh", {"wh", 0x7cfd } }, +{ "clro", {"wo", 0x7cfd } }, +{ "movo", {"rowo", 0x7dfd } }, +{ "movah", {"ahwl", 0x7efd } }, +{ "movao", {"aowl", 0x7efd } }, +{ "pushah", {"ah", 0x7ffd } }, +{ "pushao", {"ao", 0x7ffd } }, + /* undefined opcodes here */ +{ "cvtfh", {"rfwh", 0x98fd } }, +{ "cvtfg", {"rfwg", 0x99fd } }, + /* undefined opcodes here */ +{ "cvthf", {"rhwf", 0xf6fd } }, +{ "cvthd", {"rhwd", 0xf7fd } }, + /* undefined opcodes here */ +{ "bugl", {"rl", 0xfdff } }, +{ "bugw", {"rw", 0xfeff } }, + /* undefined opcodes here */ + +{ "", {"", 0} } /* empty is end sentinel */ + +}; /* votstrs */ + +/* end: vax.opcode.h */ diff --git a/include/opcode/xgate.h b/include/opcode/xgate.h new file mode 100644 index 0000000..8451e66 --- /dev/null +++ b/include/opcode/xgate.h @@ -0,0 +1,100 @@ +/* xgate.h -- Freescale XGATE opcode list + Copyright 2010, 2011, 2012 Free Software Foundation, Inc. + Written by Sean Keys (skeys@ipdatasys.com) + + This file is part of the GNU opcodes library. + + This library 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, or (at your option) + any later version. + + It 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 file; see the file COPYING. If not, write to the + Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _OPCODE_XGATE_H +#define _OPCODE_XGATE_H + +/* XGATE CCR flag definitions. */ +#define XGATE_N_BIT 0x08 /* XGN - Sign Flag */ +#define XGATE_Z_BIT 0x04 /* XGZ - Zero Flag */ +#define XGATE_V_BIT 0x02 /* XGV - Overflow Flag */ +#define XGATE_C_BIT 0x01 /* XGC - Carry Flag */ + +/* Access Detail Notation + V — Vector fetch: always an aligned word read, lasts for at least one RISC core cycle + P — Program word fetch: always an aligned word read, lasts for at least one RISC core cycle + r — 8-bit data read: lasts for at least one RISC core cycle + R — 16-bit data read: lasts for at least one RISC core cycle + w — 8-bit data write: lasts for at least one RISC core cycle + W — 16-bit data write: lasts for at least one RISC core cycle + A — Alignment cycle: no read or write, lasts for zero or one RISC core cycles + f — Free cycle: no read or write, lasts for one RISC core cycles. */ +#define XGATE_CYCLE_V 0x01 +#define XGATE_CYCLE_P 0x02 +#define XGATE_CYCLE_r 0x04 +#define XGATE_CYCLE_R 0x08 +#define XGATE_CYCLE_w 0x10 +#define XGATE_CYCLE_W 0x20 +#define XGATE_CYCLE_A 0x40 +#define XGATE_CYCLE_f 0x80 + +/* XGATE operand formats as stored in the XGATE_opcode table. + They are only used by GAS to recognize operands. */ +#define XGATE_OP_INH "" /* Inherent. */ +#define XGATE_OP_TRI "r,r,r" /* Register followed by two registers. */ +#define XGATE_OP_DYA "r,r" /* Register followed by a register. */ +#define XGATE_OP_IMM16 "r,if" /* Register followed by 16-bit value. */ +#define XGATE_OP_IMM8 "r,i8" /* Register followed by 8-bit value. */ +#define XGATE_OP_IMM4 "r,i4" /* Register followed by 4-bit value. */ +#define XGATE_OP_IMM3 "i3" /* Register followed by 3-bit value. */ +#define XGATE_OP_MON "r" /* Single register. */ +#define XGATE_OP_MON_R_C "r,c" /* General register followed by ccr register. */ +#define XGATE_OP_MON_C_R "c,r" /* CCR register followed by a general register. */ +#define XGATE_OP_MON_R_P "r,p" /* General register followed by pc register. */ +#define XGATE_OP_IDR "r,r,+" /* Three registers with the third having a -/+ directive. */ +#define XGATE_OP_IDO5 "r,r,i5" /* Two general registers followed by an immediate value. */ +#define XGATE_OP_REL9 "b9" /* 9-bit value that is relative to the current pc. */ +#define XGATE_OP_REL10 "ba" /* 10-bit value that is relative to the current pc. */ +#define XGATE_OP_DYA_MON "=r" +/* Macro definitions. */ +#define XGATE_OP_IMM16mADD "r,if; addl addh" +#define XGATE_OP_IMM16mAND "r,if; andl andh" +#define XGATE_OP_IMM16mCPC "r,if; cmpl cpch" +#define XGATE_OP_IMM16mSUB "r,if; subl subh" +#define XGATE_OP_IMM16mLDW "r,if; ldl ldh" + +/* CPU variant identification. */ +#define XGATE_V1 0x1 +#define XGATE_V2 0x2 +#define XGATE_V3 0x4 + +/* The opcode table definitions. */ +struct xgate_opcode +{ + char * name; /* Op-code name. */ + char * constraints; /* Constraint chars. */ + char * format; /* Bit definitions. */ + unsigned int size; /* Opcode size in bytes. */ + unsigned int bin_opcode; /* Binary opcode with operands masked off. */ + unsigned char cycles_min; /* Minimum cpu cycles needed. */ + unsigned char cycles_max; /* Maximum cpu cycles needed. */ + unsigned char set_flags_mask; /* CCR flags set. */ + unsigned char clr_flags_mask; /* CCR flags cleared. */ + unsigned char chg_flags_mask; /* CCR flags changed. */ + unsigned char arch; /* CPU variant. */ +}; + +/* The opcode table. The table contains all the opcodes (all pages). + You can't rely on the order. */ +extern const struct xgate_opcode xgate_opcodes[]; +extern const int xgate_num_opcodes; + +#endif /* _OPCODE_XGATE_H */ diff --git a/include/os9k.h b/include/os9k.h new file mode 100644 index 0000000..e8baee1 --- /dev/null +++ b/include/os9k.h @@ -0,0 +1,181 @@ +/* os9k.h - OS-9000 i386 module header definitions + Copyright 2000 Free Software Foundation, Inc. + +This file is part of GNU CC. + +GNU CC 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. + +GNU CC 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 GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#if !defined(_MODULE_H) +#define _MODULE_H + +#define _MPF386 + +/* Size of common header less parity field. */ +#define N_M_PARITY (sizeof(mh_com)-sizeof(unisgned short)) +#define OLD_M_PARITY 46 +#define M_PARITY N_M_PARITY + +#ifdef _MPF68K +#define MODSYNC 0x4afc /* Module header sync code for 680x0 processors. */ +#endif + +#ifdef _MPF386 +#define MODSYNC 0x4afc /* Module header sync code for 80386 processors. */ +#endif + +#define MODREV 1 /* Module format revision 1. */ +#define CRCCON 0x800063 /* CRC polynomial constant. */ + +/* Module access permission values. */ +#define MP_OWNER_READ 0x0001 +#define MP_OWNER_WRITE 0x0002 +#define MP_OWNER_EXEC 0x0004 +#define MP_GROUP_READ 0x0010 +#define MP_GROUP_WRITE 0x0020 +#define MP_GROUP_EXEC 0x0040 +#define MP_WORLD_READ 0x0100 +#define MP_WORLD_WRITE 0x0200 +#define MP_WORLD_EXEC 0x0400 +#define MP_WORLD_ACCESS 0x0777 +#define MP_OWNER_MASK 0x000f +#define MP_GROUP_MASK 0x00f0 +#define MP_WORLD_MASK 0x0f00 +#define MP_SYSTM_MASK 0xf000 + +/* Module Type/Language values. */ +#define MT_ANY 0 +#define MT_PROGRAM 0x0001 +#define MT_SUBROUT 0x0002 +#define MT_MULTI 0x0003 +#define MT_DATA 0x0004 +#define MT_TRAPLIB 0x000b +#define MT_SYSTEM 0x000c +#define MT_FILEMAN 0x000d +#define MT_DEVDRVR 0x000e +#define MT_DEVDESC 0x000f +#define MT_MASK 0xff00 + +#define ML_ANY 0 +#define ML_OBJECT 1 +#define ML_ICODE 2 +#define ML_PCODE 3 +#define ML_CCODE 4 +#define ML_CBLCODE 5 +#define ML_FRTNCODE 6 +#define ML_MASK 0x00ff + +#define mktypelang(type, lang) (((type) << 8) | (lang)) + +/* Module Attribute values. */ +#define MA_REENT 0x80 +#define MA_GHOST 0x40 +#define MA_SUPER 0x20 +#define MA_MASK 0xff00 +#define MR_MASK 0x00ff + +#define mkattrevs(attr, revs) (((attr) << 8) | (revs)) + +#define m_user m_owner.grp_usr.usr +#define m_group m_owner.grp_usr.grp +#define m_group_user m_owner.group_user + +/* Macro definitions for accessing module header fields. */ +#define MODNAME(mod) ((u_char*)((u_char*)mod + ((Mh_com)mod)->m_name)) +#if 0 +/* Appears not to be used, and the u_int32 typedef is gone (because it + conflicted with a Mach header. */ +#define MODSIZE(mod) ((u_int32)((Mh_com)mod)->m_size) +#endif /* 0 */ +#define MHCOM_BYTES_SIZE 80 +#define N_BADMAG(a) (((a).a_info) != MODSYNC) + +typedef struct mh_com +{ + /* Sync bytes ($4afc). */ + unsigned char m_sync[2]; + unsigned char m_sysrev[2]; /* System revision check value. */ + unsigned char m_size[4]; /* Module size. */ + unsigned char m_owner[4]; /* Group/user id. */ + unsigned char m_name[4]; /* Offset to module name. */ + unsigned char m_access[2]; /* Access permissions. */ + unsigned char m_tylan[2]; /* Type/lang. */ + unsigned char m_attrev[2]; /* Rev/attr. */ + unsigned char m_edit[2]; /* Edition. */ + unsigned char m_needs[4]; /* Module hardware requirements flags. (reserved). */ + unsigned char m_usage[4]; /* Comment string offset. */ + unsigned char m_symbol[4]; /* Symbol table offset. */ + unsigned char m_exec[4]; /* Offset to execution entry point. */ + unsigned char m_excpt[4]; /* Offset to exception entry point. */ + unsigned char m_data[4]; /* Data storage requirement. */ + unsigned char m_stack[4]; /* Stack size. */ + unsigned char m_idata[4]; /* Offset to initialized data. */ + unsigned char m_idref[4]; /* Offset to data reference lists. */ + unsigned char m_init[4]; /* Initialization routine offset. */ + unsigned char m_term[4]; /* Termination routine offset. */ + unsigned char m_ident[2]; /* Ident code for ident program. */ + char m_spare[8]; /* Reserved bytes. */ + unsigned char m_parity[2]; /* Header parity. */ +} mh_com,*Mh_com; + +/* Executable memory module. */ +typedef mh_com *Mh_exec,mh_exec; + +/* Data memory module. */ +typedef mh_com *Mh_data,mh_data; + +/* File manager memory module. */ +typedef mh_com *Mh_fman,mh_fman; + +/* Device driver module. */ +typedef mh_com *Mh_drvr,mh_drvr; + +/* Trap handler module. */ +typedef mh_com mh_trap, *Mh_trap; + +/* Device descriptor module. */ +typedef mh_com *Mh_dev,mh_dev; + +/* Configuration module. */ +typedef mh_com *Mh_config, mh_config; + +#if 0 + +#if !defined(_MODDIR_H) +/* Go get _os_fmod (and others). */ +#include +#endif + +error_code _os_crc (void *, u_int32, int *); +error_code _os_datmod (char *, u_int32, u_int16 *, u_int16 *, u_int32, void **, mh_data **); +error_code _os_get_moddir (void *, u_int32 *); +error_code _os_initdata (mh_com *, void *); +error_code _os_link (char **, mh_com **, void **, u_int16 *, u_int16 *); +error_code _os_linkm (mh_com *, void **, u_int16 *, u_int16 *); +error_code _os_load (char *, mh_com **, void **, u_int32, u_int16 *, u_int16 *, u_int32); +error_code _os_mkmodule (char *, u_int32, u_int16 *, u_int16 *, u_int32, void **, mh_com **, u_int32); +error_code _os_modaddr (void *, mh_com **); +error_code _os_setcrc (mh_com *); +error_code _os_slink (u_int32, char *, void **, void **, mh_com **); +error_code _os_slinkm (u_int32, mh_com *, void **, void **); +error_code _os_unlink (mh_com *); +error_code _os_unload (char *, u_int32); +error_code _os_tlink (u_int32, char *, void **, mh_trap **, void *, u_int32); +error_code _os_tlinkm (u_int32, mh_com *, void **, void *, u_int32); +error_code _os_iodel (mh_com *); +error_code _os_vmodul (mh_com *, mh_com *, u_int32); +#endif /* 0 */ + +#endif diff --git a/include/partition.h b/include/partition.h new file mode 100644 index 0000000..c39873b --- /dev/null +++ b/include/partition.h @@ -0,0 +1,82 @@ +/* List implementation of a partition of consecutive integers. + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + Contributed by CodeSourcery, LLC. + + This file is part of GCC. + + GCC 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. + + GCC 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 GCC; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* This package implements a partition of consecutive integers. The + elements are partitioned into classes. Each class is represented + by one of its elements, the canonical element, which is chosen + arbitrarily from elements in the class. The principal operations + on a partition are FIND, which takes an element, determines its + class, and returns the canonical element for that class, and UNION, + which unites the two classes that contain two given elements into a + single class. + + The list implementation used here provides constant-time finds. By + storing the size of each class with the class's canonical element, + it is able to perform unions over all the classes in the partition + in O (N log N) time. */ + +#ifndef _PARTITION_H +#define _PARTITION_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" +#include + +struct partition_elem +{ + /* The next element in this class. Elements in each class form a + circular list. */ + struct partition_elem* next; + /* The canonical element that represents the class containing this + element. */ + int class_element; + /* The number of elements in this class. Valid only if this is the + canonical element for its class. */ + unsigned class_count; +}; + +typedef struct partition_def +{ + /* The number of elements in this partition. */ + int num_elements; + /* The elements in the partition. */ + struct partition_elem elements[1]; +} *partition; + +extern partition partition_new (int); +extern void partition_delete (partition); +extern int partition_union (partition, int, int); +extern void partition_print (partition, FILE*); + +/* Returns the canonical element corresponding to the class containing + ELEMENT__ in PARTITION__. */ + +#define partition_find(partition__, element__) \ + ((partition__)->elements[(element__)].class_element) + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _PARTITION_H */ diff --git a/include/paths.h b/include/paths.h new file mode 100644 index 0000000..b1c70f5 --- /dev/null +++ b/include/paths.h @@ -0,0 +1,9 @@ +#ifndef _PATHS_H_ +#define _PATHS_H_ + +#define _PATH_DEV "/dev/" +#define _PATH_DEVNULL "/dev/null" +#define _PATH_DEVZERO "/dev/zero" +#define _PATH_BSHELL "/bin/sh" + +#endif /* _PATHS_H_ */ diff --git a/include/plugin-api.h b/include/plugin-api.h new file mode 100644 index 0000000..a794a37 --- /dev/null +++ b/include/plugin-api.h @@ -0,0 +1,457 @@ +/* plugin-api.h -- External linker plugin API. */ + +/* Copyright (C) 2009-2016 Free Software Foundation, Inc. + Written by Cary Coutant . + + This file is part of binutils. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* This file defines the interface for writing a linker plugin, which is + described at < http://gcc.gnu.org/wiki/whopr/driver >. */ + +#ifndef PLUGIN_API_H +#define PLUGIN_API_H + +#ifdef HAVE_STDINT_H +#include +#elif defined(HAVE_INTTYPES_H) +#include +#endif +#include +#if !defined(HAVE_STDINT_H) && !defined(HAVE_INTTYPES_H) && \ + !defined(UINT64_MAX) && !defined(uint64_t) +#error can not find uint64_t type +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Status code returned by most API routines. */ + +enum ld_plugin_status +{ + LDPS_OK = 0, + LDPS_NO_SYMS, /* Attempt to get symbols that haven't been added. */ + LDPS_BAD_HANDLE, /* No claimed object associated with given handle. */ + LDPS_ERR + /* Additional Error codes TBD. */ +}; + +/* The version of the API specification. */ + +enum ld_plugin_api_version +{ + LD_PLUGIN_API_VERSION = 1 +}; + +/* The type of output file being generated by the linker. */ + +enum ld_plugin_output_file_type +{ + LDPO_REL, + LDPO_EXEC, + LDPO_DYN, + LDPO_PIE +}; + +/* An input file managed by the plugin library. */ + +struct ld_plugin_input_file +{ + const char *name; + int fd; + off_t offset; + off_t filesize; + void *handle; +}; + +/* A symbol belonging to an input file managed by the plugin library. */ + +struct ld_plugin_symbol +{ + char *name; + char *version; + int def; + int visibility; + uint64_t size; + char *comdat_key; + int resolution; +}; + +/* An object's section. */ + +struct ld_plugin_section +{ + const void* handle; + unsigned int shndx; +}; + +/* Whether the symbol is a definition, reference, or common, weak or not. */ + +enum ld_plugin_symbol_kind +{ + LDPK_DEF, + LDPK_WEAKDEF, + LDPK_UNDEF, + LDPK_WEAKUNDEF, + LDPK_COMMON +}; + +/* The visibility of the symbol. */ + +enum ld_plugin_symbol_visibility +{ + LDPV_DEFAULT, + LDPV_PROTECTED, + LDPV_INTERNAL, + LDPV_HIDDEN +}; + +/* How a symbol is resolved. */ + +enum ld_plugin_symbol_resolution +{ + LDPR_UNKNOWN = 0, + + /* Symbol is still undefined at this point. */ + LDPR_UNDEF, + + /* This is the prevailing definition of the symbol, with references from + regular object code. */ + LDPR_PREVAILING_DEF, + + /* This is the prevailing definition of the symbol, with no + references from regular objects. It is only referenced from IR + code. */ + LDPR_PREVAILING_DEF_IRONLY, + + /* This definition was pre-empted by a definition in a regular + object file. */ + LDPR_PREEMPTED_REG, + + /* This definition was pre-empted by a definition in another IR file. */ + LDPR_PREEMPTED_IR, + + /* This symbol was resolved by a definition in another IR file. */ + LDPR_RESOLVED_IR, + + /* This symbol was resolved by a definition in a regular object + linked into the main executable. */ + LDPR_RESOLVED_EXEC, + + /* This symbol was resolved by a definition in a shared object. */ + LDPR_RESOLVED_DYN, + + /* This is the prevailing definition of the symbol, with no + references from regular objects. It is only referenced from IR + code, but the symbol is exported and may be referenced from + a dynamic object (not seen at link time). */ + LDPR_PREVAILING_DEF_IRONLY_EXP +}; + +/* The plugin library's "claim file" handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_claim_file_handler) ( + const struct ld_plugin_input_file *file, int *claimed); + +/* The plugin library's "all symbols read" handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_all_symbols_read_handler) (void); + +/* The plugin library's cleanup handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_cleanup_handler) (void); + +/* The linker's interface for registering the "claim file" handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_register_claim_file) (ld_plugin_claim_file_handler handler); + +/* The linker's interface for registering the "all symbols read" handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_register_all_symbols_read) ( + ld_plugin_all_symbols_read_handler handler); + +/* The linker's interface for registering the cleanup handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_register_cleanup) (ld_plugin_cleanup_handler handler); + +/* The linker's interface for adding symbols from a claimed input file. */ + +typedef +enum ld_plugin_status +(*ld_plugin_add_symbols) (void *handle, int nsyms, + const struct ld_plugin_symbol *syms); + +/* The linker's interface for getting the input file information with + an open (possibly re-opened) file descriptor. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_file) (const void *handle, + struct ld_plugin_input_file *file); + +typedef +enum ld_plugin_status +(*ld_plugin_get_view) (const void *handle, const void **viewp); + +/* The linker's interface for releasing the input file. */ + +typedef +enum ld_plugin_status +(*ld_plugin_release_input_file) (const void *handle); + +/* The linker's interface for retrieving symbol resolution information. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_symbols) (const void *handle, int nsyms, + struct ld_plugin_symbol *syms); + +/* The linker's interface for adding a compiled input file. */ + +typedef +enum ld_plugin_status +(*ld_plugin_add_input_file) (const char *pathname); + +/* The linker's interface for adding a library that should be searched. */ + +typedef +enum ld_plugin_status +(*ld_plugin_add_input_library) (const char *libname); + +/* The linker's interface for adding a library path that should be searched. */ + +typedef +enum ld_plugin_status +(*ld_plugin_set_extra_library_path) (const char *path); + +/* The linker's interface for issuing a warning or error message. */ + +typedef +enum ld_plugin_status +(*ld_plugin_message) (int level, const char *format, ...); + +/* The linker's interface for retrieving the number of sections in an object. + The handle is obtained in the claim_file handler. This interface should + only be invoked in the claim_file handler. This function sets *COUNT to + the number of sections in the object. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_count) (const void* handle, unsigned int *count); + +/* The linker's interface for retrieving the section type of a specific + section in an object. This interface should only be invoked in the + claim_file handler. This function sets *TYPE to an ELF SHT_xxx value. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_type) (const struct ld_plugin_section section, + unsigned int *type); + +/* The linker's interface for retrieving the name of a specific section in + an object. This interface should only be invoked in the claim_file handler. + This function sets *SECTION_NAME_PTR to a null-terminated buffer allocated + by malloc. The plugin must free *SECTION_NAME_PTR. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_name) (const struct ld_plugin_section section, + char **section_name_ptr); + +/* The linker's interface for retrieving the contents of a specific section + in an object. This interface should only be invoked in the claim_file + handler. This function sets *SECTION_CONTENTS to point to a buffer that is + valid until clam_file handler returns. It sets *LEN to the size of the + buffer. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_contents) (const struct ld_plugin_section section, + const unsigned char **section_contents, + size_t* len); + +/* The linker's interface for specifying the desired order of sections. + The sections should be specifed using the array SECTION_LIST in the + order in which they should appear in the final layout. NUM_SECTIONS + specifies the number of entries in each array. This should be invoked + in the all_symbols_read handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_update_section_order) (const struct ld_plugin_section *section_list, + unsigned int num_sections); + +/* The linker's interface for specifying that reordering of sections is + desired so that the linker can prepare for it. This should be invoked + before update_section_order, preferably in the claim_file handler. */ + +typedef +enum ld_plugin_status +(*ld_plugin_allow_section_ordering) (void); + +/* The linker's interface for specifying that a subset of sections is + to be mapped to a unique segment. If the plugin wants to call + unique_segment_for_sections, it must call this function from a + claim_file_handler or when it is first loaded. */ + +typedef +enum ld_plugin_status +(*ld_plugin_allow_unique_segment_for_sections) (void); + +/* The linker's interface for specifying that a specific set of sections + must be mapped to a unique segment. ELF segments do not have names + and the NAME is used as the name of the newly created output section + that is then placed in the unique PT_LOAD segment. FLAGS is used to + specify if any additional segment flags need to be set. For instance, + a specific segment flag can be set to identify this segment. Unsetting + segment flags that would be set by default is not possible. The + parameter SEGMENT_ALIGNMENT when non-zero will override the default. */ + +typedef +enum ld_plugin_status +(*ld_plugin_unique_segment_for_sections) ( + const char* segment_name, + uint64_t segment_flags, + uint64_t segment_alignment, + const struct ld_plugin_section * section_list, + unsigned int num_sections); + +/* The linker's interface for retrieving the section alignment requirement + of a specific section in an object. This interface should only be invoked in the + claim_file handler. This function sets *ADDRALIGN to the ELF sh_addralign + value of the input section. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_alignment) (const struct ld_plugin_section section, + unsigned int *addralign); + +/* The linker's interface for retrieving the section size of a specific section + in an object. This interface should only be invoked in the claim_file handler. + This function sets *SECSIZE to the ELF sh_size + value of the input section. */ + +typedef +enum ld_plugin_status +(*ld_plugin_get_input_section_size) (const struct ld_plugin_section section, + uint64_t *secsize); + +enum ld_plugin_level +{ + LDPL_INFO, + LDPL_WARNING, + LDPL_ERROR, + LDPL_FATAL +}; + +/* Values for the tv_tag field of the transfer vector. */ + +enum ld_plugin_tag +{ + LDPT_NULL = 0, + LDPT_API_VERSION = 1, + LDPT_GOLD_VERSION = 2, + LDPT_LINKER_OUTPUT = 3, + LDPT_OPTION = 4, + LDPT_REGISTER_CLAIM_FILE_HOOK = 5, + LDPT_REGISTER_ALL_SYMBOLS_READ_HOOK = 6, + LDPT_REGISTER_CLEANUP_HOOK = 7, + LDPT_ADD_SYMBOLS = 8, + LDPT_GET_SYMBOLS = 9, + LDPT_ADD_INPUT_FILE = 10, + LDPT_MESSAGE = 11, + LDPT_GET_INPUT_FILE = 12, + LDPT_RELEASE_INPUT_FILE = 13, + LDPT_ADD_INPUT_LIBRARY = 14, + LDPT_OUTPUT_NAME = 15, + LDPT_SET_EXTRA_LIBRARY_PATH = 16, + LDPT_GNU_LD_VERSION = 17, + LDPT_GET_VIEW = 18, + LDPT_GET_INPUT_SECTION_COUNT = 19, + LDPT_GET_INPUT_SECTION_TYPE = 20, + LDPT_GET_INPUT_SECTION_NAME = 21, + LDPT_GET_INPUT_SECTION_CONTENTS = 22, + LDPT_UPDATE_SECTION_ORDER = 23, + LDPT_ALLOW_SECTION_ORDERING = 24, + LDPT_GET_SYMBOLS_V2 = 25, + LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS = 26, + LDPT_UNIQUE_SEGMENT_FOR_SECTIONS = 27, + LDPT_GET_SYMBOLS_V3 = 28, + LDPT_GET_INPUT_SECTION_ALIGNMENT = 29, + LDPT_GET_INPUT_SECTION_SIZE = 30 +}; + +/* The plugin transfer vector. */ + +struct ld_plugin_tv +{ + enum ld_plugin_tag tv_tag; + union + { + int tv_val; + const char *tv_string; + ld_plugin_register_claim_file tv_register_claim_file; + ld_plugin_register_all_symbols_read tv_register_all_symbols_read; + ld_plugin_register_cleanup tv_register_cleanup; + ld_plugin_add_symbols tv_add_symbols; + ld_plugin_get_symbols tv_get_symbols; + ld_plugin_add_input_file tv_add_input_file; + ld_plugin_message tv_message; + ld_plugin_get_input_file tv_get_input_file; + ld_plugin_get_view tv_get_view; + ld_plugin_release_input_file tv_release_input_file; + ld_plugin_add_input_library tv_add_input_library; + ld_plugin_set_extra_library_path tv_set_extra_library_path; + ld_plugin_get_input_section_count tv_get_input_section_count; + ld_plugin_get_input_section_type tv_get_input_section_type; + ld_plugin_get_input_section_name tv_get_input_section_name; + ld_plugin_get_input_section_contents tv_get_input_section_contents; + ld_plugin_update_section_order tv_update_section_order; + ld_plugin_allow_section_ordering tv_allow_section_ordering; + ld_plugin_allow_unique_segment_for_sections tv_allow_unique_segment_for_sections; + ld_plugin_unique_segment_for_sections tv_unique_segment_for_sections; + ld_plugin_get_input_section_alignment tv_get_input_section_alignment; + ld_plugin_get_input_section_size tv_get_input_section_size; + } tv_u; +}; + +/* The plugin library's "onload" entry point. */ + +typedef +enum ld_plugin_status +(*ld_plugin_onload) (struct ld_plugin_tv *tv); + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(PLUGIN_API_H) */ diff --git a/include/progress.h b/include/progress.h new file mode 100644 index 0000000..80ffbe2 --- /dev/null +++ b/include/progress.h @@ -0,0 +1,38 @@ +/* Default definitions for progress macros. + Copyright 1994, 2010 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 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +/* The default definitions below are intended to be replaced by real + definitions, if building the tools for an interactive programming + environment. */ + +#ifndef _PROGRESS_H +#define _PROGRESS_H + +#ifndef START_PROGRESS +#define START_PROGRESS(STR,N) +#endif + +#ifndef PROGRESS +#define PROGRESS(X) +#endif + +#ifndef END_PROGRESS +#define END_PROGRESS(STR) +#endif + +#endif /* _PROGRESS_H */ diff --git a/include/pthread.h b/include/pthread.h new file mode 100644 index 0000000..c99ad39 --- /dev/null +++ b/include/pthread.h @@ -0,0 +1,456 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2013, 2015. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + */ + +#ifndef __PTHREAD_h +#define __PTHREAD_h + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if defined(_POSIX_THREADS) + +#include +#include +#include +#include + +struct _pthread_cleanup_context { + void (*_routine)(void *); + void *_arg; + int _canceltype; + struct _pthread_cleanup_context *_previous; +}; + +/* Register Fork Handlers */ +int pthread_atfork (void (*prepare)(void), void (*parent)(void), + void (*child)(void)); + +/* Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81 */ + +int pthread_mutexattr_init (pthread_mutexattr_t *__attr); +int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr); +int pthread_mutexattr_getpshared (const pthread_mutexattr_t *__attr, + int *__pshared); +int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr, + int __pshared); + +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + +/* Single UNIX Specification 2 Mutex Attributes types */ + +int pthread_mutexattr_gettype (const pthread_mutexattr_t *__attr, int *__kind); +int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind); + +#endif + +/* Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87 */ + +int pthread_mutex_init (pthread_mutex_t *__mutex, + const pthread_mutexattr_t *__attr); +int pthread_mutex_destroy (pthread_mutex_t *__mutex); + +/* This is used to statically initialize a pthread_mutex_t. Example: + + pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + */ + +#define PTHREAD_MUTEX_INITIALIZER _PTHREAD_MUTEX_INITIALIZER + +/* Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93 + NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29 */ + +int pthread_mutex_lock (pthread_mutex_t *__mutex); +int pthread_mutex_trylock (pthread_mutex_t *__mutex); +int pthread_mutex_unlock (pthread_mutex_t *__mutex); + +#if defined(_POSIX_TIMEOUTS) + +int pthread_mutex_timedlock (pthread_mutex_t *__mutex, + const struct timespec *__timeout); + +#endif /* _POSIX_TIMEOUTS */ + +#if __GNU_VISIBLE +/* The Issue 8 standard adds pthread_mutex_clocklock() */ +int pthread_mutex_clocklock(pthread_mutex_t *__restrict, clockid_t, + const struct timespec *__restrict); +#endif /* __GNU_VISIBLE */ + +/* Condition Variable Initialization Attributes, P1003.1c/Draft 10, p. 96 */ + +int pthread_condattr_init (pthread_condattr_t *__attr); +int pthread_condattr_destroy (pthread_condattr_t *__attr); + +int pthread_condattr_getclock (const pthread_condattr_t *__restrict __attr, + clockid_t *__restrict __clock_id); +int pthread_condattr_setclock (pthread_condattr_t *__attr, + clockid_t __clock_id); + +int pthread_condattr_getpshared (const pthread_condattr_t *__attr, + int *__pshared); +int pthread_condattr_setpshared (pthread_condattr_t *__attr, int __pshared); + +/* Initializing and Destroying a Condition Variable, P1003.1c/Draft 10, p. 87 */ + +int pthread_cond_init (pthread_cond_t *__cond, + const pthread_condattr_t *__attr); +int pthread_cond_destroy (pthread_cond_t *__mutex); + +/* This is used to statically initialize a pthread_cond_t. Example: + + pthread_cond_t cond = PTHREAD_COND_INITIALIZER; + */ + +#define PTHREAD_COND_INITIALIZER _PTHREAD_COND_INITIALIZER + +/* Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101 */ + +int pthread_cond_signal (pthread_cond_t *__cond); +int pthread_cond_broadcast (pthread_cond_t *__cond); + +/* Waiting on a Condition, P1003.1c/Draft 10, p. 105 */ + +int pthread_cond_wait (pthread_cond_t *__cond, pthread_mutex_t *__mutex); + +int pthread_cond_timedwait (pthread_cond_t *__cond, + pthread_mutex_t *__mutex, + const struct timespec *__abstime); + +#if __GNU_VISIBLE +/* The Issue 8 standard adds pthread_cond_clockwait() */ +int pthread_cond_clockwait(pthread_cond_t *__restrict, + pthread_mutex_t *__restrict, clockid_t, + const struct timespec *__restrict); +#endif /* __GNU_VISIBLE */ + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) + +/* Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 */ + +int pthread_attr_setscope (pthread_attr_t *__attr, int __contentionscope); +int pthread_attr_getscope (const pthread_attr_t *__attr, + int *__contentionscope); +int pthread_attr_setinheritsched (pthread_attr_t *__attr, + int __inheritsched); +int pthread_attr_getinheritsched (const pthread_attr_t *__attr, + int *__inheritsched); +int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy); +int pthread_attr_getschedpolicy (const pthread_attr_t *__attr, + int *__policy); + +#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */ + +int pthread_attr_setschedparam (pthread_attr_t *__attr, + const struct sched_param *__param); +int pthread_attr_getschedparam (const pthread_attr_t *__attr, + struct sched_param *__param); + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) + +/* Dynamic Thread Scheduling Parameters Access, P1003.1c/Draft 10, p. 124 */ + +int pthread_getschedparam (pthread_t __pthread, int *__policy, + struct sched_param *__param); +int pthread_setschedparam (pthread_t __pthread, int __policy, + const struct sched_param *__param); + +/* Set Scheduling Priority of a Thread */ +int pthread_setschedprio (pthread_t thread, int prio); + +#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */ + +#if __GNU_VISIBLE +int pthread_getname_np(pthread_t, char *, size_t) __nonnull((2)); + +int pthread_setname_np(pthread_t, const char *) __nonnull((2)); +#endif + +#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT) + +/* Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128 */ + +int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr, + int __protocol); +int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *__attr, + int *__protocol); +int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr, + int __prioceiling); +int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *__attr, + int *__prioceiling); + +#endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */ + +#if defined(_POSIX_THREAD_PRIO_PROTECT) + +/* Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131 */ + +int pthread_mutex_setprioceiling (pthread_mutex_t *__mutex, + int __prioceiling, int *__old_ceiling); +int pthread_mutex_getprioceiling (const pthread_mutex_t *__restrict __mutex, + int *__prioceiling); + +#endif /* _POSIX_THREAD_PRIO_PROTECT */ + +/* Thread Creation Attributes, P1003.1c/Draft 10, p, 140 */ + +int pthread_attr_init (pthread_attr_t *__attr); +int pthread_attr_destroy (pthread_attr_t *__attr); +int pthread_attr_setstack (pthread_attr_t *attr, + void *__stackaddr, size_t __stacksize); +int pthread_attr_getstack (const pthread_attr_t *attr, + void **__stackaddr, size_t *__stacksize); +int pthread_attr_getstacksize (const pthread_attr_t *__attr, + size_t *__stacksize); +int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize); +int pthread_attr_getstackaddr (const pthread_attr_t *__attr, + void **__stackaddr); +int pthread_attr_setstackaddr (pthread_attr_t *__attr, void *__stackaddr); +int pthread_attr_getdetachstate (const pthread_attr_t *__attr, + int *__detachstate); +int pthread_attr_setdetachstate (pthread_attr_t *__attr, int __detachstate); +int pthread_attr_getguardsize (const pthread_attr_t *__attr, + size_t *__guardsize); +int pthread_attr_setguardsize (pthread_attr_t *__attr, size_t __guardsize); + +/* POSIX thread APIs beyond the POSIX standard but provided + * in GNU/Linux. They may be provided by other OSes for + * compatibility. + */ +#if __GNU_VISIBLE +#if defined(__rtems__) +int pthread_attr_setaffinity_np (pthread_attr_t *__attr, + size_t __cpusetsize, + const cpu_set_t *__cpuset); +int pthread_attr_getaffinity_np (const pthread_attr_t *__attr, + size_t __cpusetsize, cpu_set_t *__cpuset); + +int pthread_setaffinity_np (pthread_t __id, size_t __cpusetsize, + const cpu_set_t *__cpuset); +int pthread_getaffinity_np (const pthread_t __id, size_t __cpusetsize, + cpu_set_t *__cpuset); + +int pthread_getattr_np (pthread_t __id, pthread_attr_t *__attr); +#endif /* defined(__rtems__) */ +#endif /* __GNU_VISIBLE */ + +/* Thread Creation, P1003.1c/Draft 10, p. 144 */ + +int pthread_create (pthread_t *__pthread, const pthread_attr_t *__attr, + void *(*__start_routine)(void *), void *__arg); + +/* Wait for Thread Termination, P1003.1c/Draft 10, p. 147 */ + +int pthread_join (pthread_t __pthread, void **__value_ptr); + +/* Detaching a Thread, P1003.1c/Draft 10, p. 149 */ + +int pthread_detach (pthread_t __pthread); + +/* Thread Termination, p1003.1c/Draft 10, p. 150 */ + +void pthread_exit (void *__value_ptr) __dead2; + +/* Get Calling Thread's ID, p1003.1c/Draft 10, p. XXX */ + +pthread_t pthread_self (void); + +/* Compare Thread IDs, p1003.1c/Draft 10, p. 153 */ + +int pthread_equal (pthread_t __t1, pthread_t __t2); + +/* Retrieve ID of a Thread's CPU Time Clock */ +int pthread_getcpuclockid (pthread_t thread, clockid_t *clock_id); + +/* Get/Set Current Thread's Concurrency Level */ +int pthread_setconcurrency (int new_level); +int pthread_getconcurrency (void); + +#if __BSD_VISIBLE || __GNU_VISIBLE +void pthread_yield (void); +#endif + +/* Dynamic Package Initialization */ + +/* This is used to statically initialize a pthread_once_t. Example: + + pthread_once_t once = PTHREAD_ONCE_INIT; + + NOTE: This is named inconsistently -- it should be INITIALIZER. */ + +#define PTHREAD_ONCE_INIT _PTHREAD_ONCE_INIT + +int pthread_once (pthread_once_t *__once_control, + void (*__init_routine)(void)); + +/* Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163 */ + +int pthread_key_create (pthread_key_t *__key, + void (*__destructor)(void *)); + +/* Thread-Specific Data Management, P1003.1c/Draft 10, p. 165 */ + +int pthread_setspecific (pthread_key_t __key, const void *__value); +void * pthread_getspecific (pthread_key_t __key); + +/* Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167 */ + +int pthread_key_delete (pthread_key_t __key); + +/* Execution of a Thread, P1003.1c/Draft 10, p. 181 */ + +#define PTHREAD_CANCEL_ENABLE 0 +#define PTHREAD_CANCEL_DISABLE 1 + +#define PTHREAD_CANCEL_DEFERRED 0 +#define PTHREAD_CANCEL_ASYNCHRONOUS 1 + +#define PTHREAD_CANCELED ((void *) -1) + +int pthread_cancel (pthread_t __pthread); + +/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ + +int pthread_setcancelstate (int __state, int *__oldstate); +int pthread_setcanceltype (int __type, int *__oldtype); +void pthread_testcancel (void); + +/* Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 */ + +void _pthread_cleanup_push (struct _pthread_cleanup_context *_context, + void (*_routine)(void *), void *_arg); + +void _pthread_cleanup_pop (struct _pthread_cleanup_context *_context, + int _execute); + +/* It is intentional to open and close the scope in two different macros */ +#define pthread_cleanup_push(_routine, _arg) \ + do { \ + struct _pthread_cleanup_context _pthread_clup_ctx; \ + _pthread_cleanup_push(&_pthread_clup_ctx, (_routine), (_arg)) + +#define pthread_cleanup_pop(_execute) \ + _pthread_cleanup_pop(&_pthread_clup_ctx, (_execute)); \ + } while (0) + +#if __GNU_VISIBLE +void _pthread_cleanup_push_defer (struct _pthread_cleanup_context *_context, + void (*_routine)(void *), void *_arg); + +void _pthread_cleanup_pop_restore (struct _pthread_cleanup_context *_context, + int _execute); + +/* It is intentional to open and close the scope in two different macros */ +#define pthread_cleanup_push_defer_np(_routine, _arg) \ + do { \ + struct _pthread_cleanup_context _pthread_clup_ctx; \ + _pthread_cleanup_push_defer(&_pthread_clup_ctx, (_routine), (_arg)) + +#define pthread_cleanup_pop_restore_np(_execute) \ + _pthread_cleanup_pop_restore(&_pthread_clup_ctx, (_execute)); \ + } while (0) +#endif /* __GNU_VISIBLE */ + +#if defined(_POSIX_THREAD_CPUTIME) + +/* Accessing a Thread CPU-time Clock, P1003.4b/D8, p. 58 */ + +int pthread_getcpuclockid (pthread_t __pthread_id, clockid_t *__clock_id); + +#endif /* defined(_POSIX_THREAD_CPUTIME) */ + + +#endif /* defined(_POSIX_THREADS) */ + +#if defined(_POSIX_BARRIERS) + +int pthread_barrierattr_init (pthread_barrierattr_t *__attr); +int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr); +int pthread_barrierattr_getpshared (const pthread_barrierattr_t *__attr, + int *__pshared); +int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr, + int __pshared); + +#define PTHREAD_BARRIER_SERIAL_THREAD -1 + +int pthread_barrier_init (pthread_barrier_t *__barrier, + const pthread_barrierattr_t *__attr, + unsigned __count); +int pthread_barrier_destroy (pthread_barrier_t *__barrier); +int pthread_barrier_wait (pthread_barrier_t *__barrier); + +#endif /* defined(_POSIX_BARRIERS) */ + +#if defined(_POSIX_SPIN_LOCKS) + +int pthread_spin_init (pthread_spinlock_t *__spinlock, int __pshared); +int pthread_spin_destroy (pthread_spinlock_t *__spinlock); +int pthread_spin_lock (pthread_spinlock_t *__spinlock); +int pthread_spin_trylock (pthread_spinlock_t *__spinlock); +int pthread_spin_unlock (pthread_spinlock_t *__spinlock); + +#endif /* defined(_POSIX_SPIN_LOCKS) */ + +#if defined(_POSIX_READER_WRITER_LOCKS) + +/* This is used to statically initialize a pthread_rwlock_t. Example: + + pthread_mutex_t mutex = PTHREAD_RWLOCK_INITIALIZER; + */ + +#define PTHREAD_RWLOCK_INITIALIZER _PTHREAD_RWLOCK_INITIALIZER + +int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr); +int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr); +int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *__attr, + int *__pshared); +int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr, + int __pshared); + +int pthread_rwlock_init (pthread_rwlock_t *__rwlock, + const pthread_rwlockattr_t *__attr); +int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock); +int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_timedrdlock (pthread_rwlock_t *__rwlock, + const struct timespec *__abstime); +int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_timedwrlock (pthread_rwlock_t *__rwlock, + const struct timespec *__abstime); + +#if __GNU_VISIBLE +/* The Issue 8 standard adds pthread_rwlock_clockrdlock() +* and pthread_rwlock_clockwrlock()*/ +int pthread_rwlock_clockrdlock(pthread_rwlock_t *__restrict, clockid_t, + const struct timespec *__restrict); +int pthread_rwlock_clockwrlock(pthread_rwlock_t *__restrict, clockid_t, + const struct timespec *__restrict); +#endif /* __GNU_VISIBLE */ + +#endif /* defined(_POSIX_READER_WRITER_LOCKS) */ + + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/include/pwd.h b/include/pwd.h new file mode 100644 index 0000000..45d1594 --- /dev/null +++ b/include/pwd.h @@ -0,0 +1,83 @@ +/*- + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)pwd.h 5.13 (Berkeley) 5/28/91 + */ + +#ifndef _PWD_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _PWD_H_ + +#include +#include + +#if __BSD_VISIBLE +#define _PATH_PASSWD "/etc/passwd" + +#define _PASSWORD_LEN 128 /* max length, not counting NULL */ +#endif + +struct passwd { + char *pw_name; /* user name */ + char *pw_passwd; /* encrypted password */ + uid_t pw_uid; /* user uid */ + gid_t pw_gid; /* user gid */ + char *pw_comment; /* comment */ + char *pw_gecos; /* Honeywell login info */ + char *pw_dir; /* home directory */ + char *pw_shell; /* default shell */ +}; + +struct passwd *getpwuid (uid_t); +struct passwd *getpwnam (const char *); + +#ifndef __INSIDE_CYGWIN__ +#if __MISC_VISIBLE || __POSIX_VISIBLE +int getpwnam_r (const char *, struct passwd *, + char *, size_t , struct passwd **); +int getpwuid_r (uid_t, struct passwd *, char *, + size_t, struct passwd **); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE >= 4 +struct passwd *getpwent (void); +void setpwent (void); +void endpwent (void); +#endif + +#if __BSD_VISIBLE +int setpassent (int); +#endif +#endif /*!__INSIDE_CYGWIN__*/ + +#ifdef __cplusplus +} +#endif +#endif /* _PWD_H_ */ diff --git a/include/reent.h b/include/reent.h new file mode 100644 index 0000000..23d572c --- /dev/null +++ b/include/reent.h @@ -0,0 +1,188 @@ +/* This header file provides the reentrancy. */ + +/* The reentrant system calls here serve two purposes: + + 1) Provide reentrant versions of the system calls the ANSI C library + requires. + 2) Provide these system calls in a namespace clean way. + + It is intended that *all* system calls that the ANSI C library needs + be declared here. It documents them all in one place. All library access + to the system is via some form of these functions. + + The target may provide the needed syscalls by any of the following: + + 1) Define the reentrant versions of the syscalls directly. + (eg: _open_r, _close_r, etc.). Please keep the namespace clean. + When you do this, set "syscall_dir" to "syscalls" and add + -DREENTRANT_SYSCALLS_PROVIDED to newlib_cflags in configure.host. + + 2) Define namespace clean versions of the system calls by prefixing + them with '_' (eg: _open, _close, etc.). Technically, there won't be + true reentrancy at the syscall level, but the library will be namespace + clean. + When you do this, set "syscall_dir" to "syscalls" in configure.host. + + 3) Define or otherwise provide the regular versions of the syscalls + (eg: open, close, etc.). The library won't be reentrant nor namespace + clean, but at least it will work. + When you do this, add -DMISSING_SYSCALL_NAMES to newlib_cflags in + configure.host. + + 4) Define or otherwise provide the regular versions of the syscalls, + and do not supply functional interfaces for any of the reentrant + calls. With this method, the reentrant syscalls are redefined to + directly call the regular system call without the reentrancy argument. + When you do this, specify both -DREENTRANT_SYSCALLS_PROVIDED and + -DMISSING_SYSCALL_NAMES via newlib_cflags in configure.host and do + not specify "syscall_dir". + + Stubs of the reentrant versions of the syscalls exist in the libc/reent + source directory and are provided if REENTRANT_SYSCALLS_PROVIDED isn't + defined. These stubs call the native system calls: _open, _close, etc. + if MISSING_SYSCALL_NAMES is *not* defined, otherwise they call the + non-underscored versions: open, close, etc. when MISSING_SYSCALL_NAMES + *is* defined. + + By default, newlib functions call the reentrant syscalls internally, + passing a reentrancy structure as an argument. This reentrancy structure + contains data that is thread-specific. For example, the errno value is + kept in the reentrancy structure. If multiple threads exist, each will + keep a separate errno value which is intuitive since the application flow + cannot check for failure reliably otherwise. + + The reentrant syscalls are either provided by the platform, by the + libc/reent stubs, or in the case of both MISSING_SYSCALL_NAMES and + REENTRANT_SYSCALLS_PROVIDED being defined, the calls are redefined to + simply call the regular syscalls with no reentrancy struct argument. + + A single-threaded application does not need to worry about the reentrancy + structure. It is used internally. + + A multi-threaded application needs either to manually manage reentrancy + structures or use dynamic reentrancy. + + Manually managing reentrancy structures entails calling special reentrant + versions of newlib functions that have an additional reentrancy argument. + For example, _printf_r. By convention, the first argument is the + reentrancy structure. By default, the normal version of the function + uses the default reentrancy structure: _REENT. The reentrancy structure + is passed internally, eventually to the reentrant syscalls themselves. + How the structures are stored and accessed in this model is up to the + application. + + Dynamic reentrancy is specified by the __DYNAMIC_REENT__ flag. This + flag denotes setting up a macro to replace _REENT with a function call + to __getreent(). This function needs to be implemented by the platform + and it is meant to return the reentrancy structure for the current + thread. When the regular C functions (e.g. printf) go to call internal + routines with the default _REENT structure, they end up calling with + the reentrancy structure for the thread. Thus, application code does not + need to call the _r routines nor worry about reentrancy structures. */ + +/* WARNING: All identifiers here must begin with an underscore. This file is + included by stdio.h and others and we therefore must only use identifiers + in the namespace allotted to us. */ + +#ifndef _REENT_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _REENT_H_ + +#include +#include + +#define __need_size_t +#define __need_ptrdiff_t +#include + +/* FIXME: not namespace clean */ +struct stat; +struct tms; +struct timeval; +struct timezone; + +#if defined(REENTRANT_SYSCALLS_PROVIDED) && defined(MISSING_SYSCALL_NAMES) + +#define _close_r(__reent, __fd) close(__fd) +#define _execve_r(__reent, __f, __arg, __env) execve(__f, __arg, __env) +#define _fcntl_r(__reent, __fd, __cmd, __arg) fcntl(__fd, __cmd, __arg) +#define _fork_r(__reent) fork() +#define _fstat_r(__reent, __fdes, __stat) fstat(__fdes, __stat) +#define _getpid_r(__reent) getpid() +#define _isatty_r(__reent, __desc) isatty(__desc) +#define _kill_r(__reent, __pid, __signal) kill(__pid, __signal) +#define _link_r(__reent, __oldpath, __newpath) link(__oldpath, __newpath) +#define _lseek_r(__reent, __fdes, __off, __w) lseek(__fdes, __off, __w) +#define _mkdir_r(__reent, __path, __m) mkdir(__path, __m) +#define _open_r(__reent, __path, __flag, __m) open(__path, __flag, __m) +#define _read_r(__reent, __fd, __buff, __cnt) read(__fd, __buff, __cnt) +#define _rename_r(__reent, __old, __new) rename(__old, __new) +#define _sbrk_r(__reent, __incr) sbrk(__incr) +#define _stat_r(__reent, __path, __buff) stat(__path, __buff) +#define _times_r(__reent, __time) times(__time) +#define _unlink_r(__reent, __path) unlink(__path) +#define _wait_r(__reent, __status) wait(__status) +#define _write_r(__reent, __fd, __buff, __cnt) write(__fd, __buff, __cnt) +#define _gettimeofday_r(__reent, __tp, __tzp) gettimeofday(__tp, __tzp) + +#ifdef __LARGE64_FILES +#define _lseek64_r(__reent, __fd, __off, __w) lseek64(__fd, __off, __w) +#define _fstat64_r(__reent, __fd, __buff) fstat64(__fd, __buff) +#define _open64_r(__reent, __path, __flag, __m) open64(__path, __flag, __m) +#endif + +#else +/* Reentrant versions of system calls. */ + +extern int _close_r (struct _reent *, int); +extern int _execve_r (struct _reent *, const char *, char *const *, char *const *); +extern int _fcntl_r (struct _reent *, int, int, int); +extern int _fork_r (struct _reent *); +extern int _fstat_r (struct _reent *, int, struct stat *); +extern int _getpid_r (struct _reent *); +extern int _isatty_r (struct _reent *, int); +extern int _kill_r (struct _reent *, int, int); +extern int _link_r (struct _reent *, const char *, const char *); +extern _off_t _lseek_r (struct _reent *, int, _off_t, int); +extern int _mkdir_r (struct _reent *, const char *, int); +extern int _open_r (struct _reent *, const char *, int, int); +extern _ssize_t _read_r (struct _reent *, int, void *, size_t); +extern int _rename_r (struct _reent *, const char *, const char *); +extern void *_sbrk_r (struct _reent *, ptrdiff_t); +extern int _stat_r (struct _reent *, const char *, struct stat *); +extern _CLOCK_T_ _times_r (struct _reent *, struct tms *); +extern int _unlink_r (struct _reent *, const char *); +extern int _wait_r (struct _reent *, int *); +extern _ssize_t _write_r (struct _reent *, int, const void *, size_t); + +/* This one is not guaranteed to be available on all targets. */ +extern int _gettimeofday_r (struct _reent *, struct timeval *__tp, void *__tzp); + +#ifdef __LARGE64_FILES + + +#if defined(__CYGWIN__) +#define stat64 stat +#endif +struct stat64; + +extern _off64_t _lseek64_r (struct _reent *, int, _off64_t, int); +extern int _fstat64_r (struct _reent *, int, struct stat64 *); +extern int _open64_r (struct _reent *, const char *, int, int); +extern int _stat64_r (struct _reent *, const char *, struct stat64 *); + +/* Don't pollute namespace if not building newlib. */ +#if defined (__CYGWIN__) && !defined (_LIBC) +#undef stat64 +#endif + +#endif + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _REENT_H_ */ diff --git a/include/regdef.h b/include/regdef.h new file mode 100644 index 0000000..8cf144b --- /dev/null +++ b/include/regdef.h @@ -0,0 +1,7 @@ +/* regdef.h -- define register names. */ + +/* This is a standard include file for MIPS targets. Other target + probably don't define it, and attempts to include this file will + fail. */ + +#include diff --git a/include/regex.h b/include/regex.h new file mode 100644 index 0000000..fa3e268 --- /dev/null +++ b/include/regex.h @@ -0,0 +1,103 @@ +/*- + * Copyright (c) 1992 Henry Spencer. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regex.h 8.2 (Berkeley) 1/3/94 + * $FreeBSD: src/include/regex.h,v 1.4 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _REGEX_H_ +#define _REGEX_H_ + +#include + +/* types */ +typedef off_t regoff_t; + +typedef struct { + int re_magic; + size_t re_nsub; /* number of parenthesized subexpressions */ + __const char *re_endp; /* end pointer for REG_PEND */ + struct re_guts *re_g; /* none of your business :-) */ +} regex_t; + +typedef struct { + regoff_t rm_so; /* start of match */ + regoff_t rm_eo; /* end of match */ +} regmatch_t; + +/* regcomp() flags */ +#define REG_BASIC 0000 +#define REG_EXTENDED 0001 +#define REG_ICASE 0002 +#define REG_NOSUB 0004 +#define REG_NEWLINE 0010 +#define REG_NOSPEC 0020 +#define REG_PEND 0040 +#define REG_DUMP 0200 + +/* regerror() flags */ +#define REG_NOMATCH 1 +#define REG_BADPAT 2 +#define REG_ECOLLATE 3 +#define REG_ECTYPE 4 +#define REG_EESCAPE 5 +#define REG_ESUBREG 6 +#define REG_EBRACK 7 +#define REG_EPAREN 8 +#define REG_EBRACE 9 +#define REG_BADBR 10 +#define REG_ERANGE 11 +#define REG_ESPACE 12 +#define REG_BADRPT 13 +#define REG_EMPTY 14 +#define REG_ASSERT 15 +#define REG_INVARG 16 +#define REG_ATOI 255 /* convert name to number (!) */ +#define REG_ITOA 0400 /* convert number to name (!) */ + +/* regexec() flags */ +#define REG_NOTBOL 00001 +#define REG_NOTEOL 00002 +#define REG_STARTEND 00004 +#define REG_TRACE 00400 /* tracing of execution */ +#define REG_LARGE 01000 /* force large representation */ +#define REG_BACKR 02000 /* force use of backref code */ + +__BEGIN_DECLS +int regcomp(regex_t *__restrict, const char *__restrict, int); +size_t regerror(int, const regex_t *__restrict, char *__restrict, size_t); +int regexec(const regex_t *__restrict, const char *__restrict, + size_t, regmatch_t [__restrict], int); +void regfree(regex_t *); +__END_DECLS + +#endif /* !_REGEX_H_ */ diff --git a/include/rpc/types.h b/include/rpc/types.h new file mode 100644 index 0000000..df77a93 --- /dev/null +++ b/include/rpc/types.h @@ -0,0 +1,85 @@ + +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * from: @(#)types.h 1.18 87/07/24 SMI + * from: @(#)types.h 2.3 88/08/15 4.0 RPCSRC + * $FreeBSD: src/include/rpc/types.h,v 1.10.6.1 2003/12/18 00:59:50 peter Exp $ + * $NetBSD: types.h,v 1.13 2000/06/13 01:02:44 thorpej Exp $ + */ + +/* + * Rpc additions to + */ +#ifndef _RPC_TYPES_H +#define _RPC_TYPES_H + +#include +#include + +#define __need_NULL +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(___int64_t_defined) +typedef u_int64_t u_quad_t; +typedef int64_t quad_t; +#endif /* ___int64_t_defined */ +typedef int32_t bool_t; +typedef int32_t enum_t; + +typedef u_int32_t rpcprog_t; +typedef u_int32_t rpcvers_t; +typedef u_int32_t rpcproc_t; +typedef u_int32_t rpcprot_t; +typedef u_int32_t rpcport_t; +typedef int32_t rpc_inline_t; + +#define __dontcare__ -1 + +#ifndef FALSE +# define FALSE 0 +#endif +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef mem_alloc +#define mem_alloc(bsize) calloc(1, bsize) +#endif +#ifndef mem_free +#define mem_free(ptr, bsize) free(ptr) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !_RPC_TYPES_H */ diff --git a/include/rpc/xdr.h b/include/rpc/xdr.h new file mode 100644 index 0000000..139e0c7 --- /dev/null +++ b/include/rpc/xdr.h @@ -0,0 +1,389 @@ + +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * from: @(#)xdr.h 1.19 87/04/22 SMI + * from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC + * $FreeBSD: src/include/rpc/xdr.h,v 1.23 2003/03/07 13:19:40 nectar Exp $ + * $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $ + */ + +/* + * xdr.h, External Data Representation Serialization Routines. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + */ + +#ifndef _RPC_XDR_H +#define _RPC_XDR_H +#include <_ansi.h> +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * XDR provides a conventional way for converting between C data + * types and an external bit-string representation. Library supplied + * routines provide for the conversion on built-in C data types. These + * routines and utility routines defined here are used to help implement + * a type encode/decode routine for each user-defined type. + * + * Each data type provides a single procedure which takes two arguments: + * + * bool_t + * xdrproc(XDR *xdrs, *argresp) + * + * xdrs is an instance of a XDR handle, to which or from which the data + * type is to be converted. argresp is a pointer to the structure to be + * converted. The XDR handle contains an operation field which indicates + * which of the operations (ENCODE, DECODE * or FREE) is to be performed. + * + * XDR_DECODE may allocate space if the pointer argresp is null. This + * data can be freed with the XDR_FREE operation. + * + * We write only one procedure per data type to make it easy + * to keep the encode and decode procedures for a data type consistent. + * In many cases the same code performs all operations on a user defined type, + * because all the hard work is done in the component type routines. + * decode as a series of calls on the nested data types. + */ + +/* + * Xdr operations. XDR_ENCODE causes the type to be encoded into the + * stream. XDR_DECODE causes the type to be extracted from the stream. + * XDR_FREE can be used to release the space allocated by an XDR_DECODE + * request. + */ +enum xdr_op +{ + XDR_ENCODE = 0, + XDR_DECODE = 1, + XDR_FREE = 2 +}; + +/* + * This is the number of bytes per unit of external data. + */ +#define BYTES_PER_XDR_UNIT (4) +#if 1 +/* faster version when BYTES_PER_XDR_UNIT is a power of two */ +# define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1)) +#else /* old version */ +#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \ + * BYTES_PER_XDR_UNIT) +#endif + +/* + * The XDR handle. + * Contains operation which is being applied to the stream, + * an operations vector for the particular implementation (e.g. see xdr_mem.c), + * and two private fields for the use of the particular implementation. + */ +typedef struct __rpc_xdr +{ + enum xdr_op x_op; /* operation; fast additional param */ + const struct xdr_ops + { + /* get a long from underlying stream */ + bool_t (*x_getlong) (struct __rpc_xdr *, long *); + + /* put a long to " */ + bool_t (*x_putlong) (struct __rpc_xdr *, const long *); + + /* get some bytes from " */ + bool_t (*x_getbytes) (struct __rpc_xdr *, char *, u_int); + + /* put some bytes to " */ + bool_t (*x_putbytes) (struct __rpc_xdr *, const char *, u_int); + + /* returns bytes off from beginning */ + u_int (*x_getpostn) (struct __rpc_xdr *); + + /* lets you reposition the stream */ + bool_t (*x_setpostn) (struct __rpc_xdr *, u_int); + + /* buf quick ptr to buffered data */ + int32_t * (*x_inline) (struct __rpc_xdr *, u_int); + + /* free privates of this xdr_stream */ + void (*x_destroy) (struct __rpc_xdr *); + + /* get an int32 from this xdr_stream */ + bool_t (*x_getint32) (struct __rpc_xdr *, int32_t *); + + /* put an int32 to the underlying stream */ + bool_t (*x_putint32) (struct __rpc_xdr *, const int32_t *); + + } *x_ops; + char *x_public; /* users' data */ + void *x_private; /* pointer to private data */ + char *x_base; /* private used for position info */ + u_int x_handy; /* extra private word */ +} XDR; + +/* + * A xdrproc_t exists for each data type which is to be encoded or decoded. + * + * The second argument to the xdrproc_t is a pointer to an opaque pointer. + * The opaque pointer generally points to a structure of the data type + * to be decoded. If this pointer is 0, then the type routines should + * allocate dynamic storage of the appropriate size and return it. + * bool_t (*xdrproc_t)(XDR *, some_type *) + */ +typedef bool_t (*xdrproc_t) (XDR *, ...); + +/* + * Operations defined on a XDR handle + * + * XDR *xdrs; + * long *longp; + * char *addr; + * u_int len; + * u_int pos; + */ +#define XDR_GETINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) +#define xdr_getint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) + +#define XDR_PUTINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) +#define xdr_putint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) + +#define XDR_GETLONG(xdrs, longp) \ + (*(xdrs)->x_ops->x_getlong)(xdrs, longp) +#define xdr_getlong(xdrs, longp) \ + (*(xdrs)->x_ops->x_getlong)(xdrs, longp) + +#define XDR_PUTLONG(xdrs, longp) \ + (*(xdrs)->x_ops->x_putlong)(xdrs, longp) +#define xdr_putlong(xdrs, longp) \ + (*(xdrs)->x_ops->x_putlong)(xdrs, longp) + +#define XDR_GETBYTES(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) +#define xdr_getbytes(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) + +#define XDR_PUTBYTES(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) +#define xdr_putbytes(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) + +#define XDR_GETPOS(xdrs) \ + (*(xdrs)->x_ops->x_getpostn)(xdrs) +#define xdr_getpos(xdrs) \ + (*(xdrs)->x_ops->x_getpostn)(xdrs) + +#define XDR_SETPOS(xdrs, pos) \ + (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) +#define xdr_setpos(xdrs, pos) \ + (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) + +#define XDR_INLINE(xdrs, len) \ + (*(xdrs)->x_ops->x_inline)(xdrs, len) +#define xdr_inline(xdrs, len) \ + (*(xdrs)->x_ops->x_inline)(xdrs, len) + +#define XDR_DESTROY(xdrs) \ + do { \ + if ((xdrs)->x_ops->x_destroy) \ + (*(xdrs)->x_ops->x_destroy)(xdrs); \ + } while (0) +#define xdr_destroy(xdrs) \ + do { \ + if ((xdrs)->x_ops->x_destroy) \ + (*(xdrs)->x_ops->x_destroy)(xdrs); \ + } while (0) + +/* + * Solaris strips the '_t' from these types -- not sure why. + * But, let's be compatible. + */ +#define xdr_rpcvers(xdrs, versp) xdr_u_int32(xdrs, versp) +#define xdr_rpcprog(xdrs, progp) xdr_u_int32(xdrs, progp) +#define xdr_rpcproc(xdrs, procp) xdr_u_int32(xdrs, procp) +#define xdr_rpcprot(xdrs, protp) xdr_u_int32(xdrs, protp) +#define xdr_rpcport(xdrs, portp) xdr_u_int32(xdrs, portp) + +/* + * Support struct for discriminated unions. + * You create an array of xdrdiscrim structures, terminated with + * an entry with a null procedure pointer. The xdr_union routine gets + * the discriminant value and then searches the array of structures + * for a matching value. If a match is found the associated xdr routine + * is called to handle that part of the union. If there is + * no match, then a default routine may be called. + * If there is no match and no default routine it is an error. + */ +#define NULL_xdrproc_t ((xdrproc_t)0) +struct xdr_discrim +{ + int value; + xdrproc_t proc; +}; + +/* + * In-line routines for fast encode/decode of primitive data types. + * Caveat emptor: these use single memory cycles to get the + * data from the underlying buffer, and will fail to operate + * properly if the data is not aligned. The standard way to use these + * is to say: + * if ((buf = XDR_INLINE(xdrs, count)) == NULL) + * return (FALSE); + * <<< macro calls >>> + * where ``count'' is the number of bytes of data occupied + * by the primitive data types. + * + * N.B. and frozen for all time: each data type here uses 4 bytes + * of external representation. + */ +#define IXDR_GET_INT32(buf) ((int32_t)ntohl((u_int32_t)*(buf)++)) +#define IXDR_PUT_INT32(buf, v) (*(buf)++ =(int32_t)htonl((u_int32_t)v)) +#define IXDR_GET_U_INT32(buf) ((uint32_t)IXDR_GET_INT32(buf)) +#define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_INT32((buf), ((int32_t)(v))) + +/* Warning: inline long routines are broken for 64 bit platforms. + * Because the other inline routines below are implemented in terms + * of them, they are all also broken for 64 bit platforms. + */ +#define IXDR_GET_LONG(buf) ((long)ntohl((u_int32_t)*(buf)++)) +#define IXDR_PUT_LONG(buf, v) (*(buf)++ =(int32_t)htonl((u_int32_t)v)) +#define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) +#define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG((buf), (v)) + +#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf)) +#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf)) +#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf)) +#define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf)) + +#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG((buf), (v)) +#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG((buf), (v)) +#define IXDR_PUT_SHORT(buf, v) IXDR_PUT_LONG((buf), (v)) +#define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_LONG((buf), (v)) + +/* + * These are the "generic" xdr routines. + */ +extern bool_t xdr_void (void); +extern bool_t xdr_short (XDR *, short *); +extern bool_t xdr_u_short (XDR *, u_short *); +extern bool_t xdr_int (XDR *, int *); +extern bool_t xdr_u_int (XDR *, u_int *); +extern bool_t xdr_long (XDR *, long *); +extern bool_t xdr_u_long (XDR *, u_long *); +extern bool_t xdr_int8_t (XDR *, int8_t *); +extern bool_t xdr_uint8_t (XDR *, uint8_t *); +extern bool_t xdr_u_int8_t (XDR *, u_int8_t *); +extern bool_t xdr_int16_t (XDR *, int16_t *); +extern bool_t xdr_uint16_t (XDR *, uint16_t *); +extern bool_t xdr_u_int16_t (XDR *, u_int16_t *); +extern bool_t xdr_int32_t (XDR *, int32_t *); +extern bool_t xdr_uint32_t (XDR *, uint32_t *); +extern bool_t xdr_u_int32_t (XDR *, u_int32_t *); +#if defined(___int64_t_defined) +extern bool_t xdr_int64_t (XDR *, int64_t *); +extern bool_t xdr_uint64_t (XDR *, uint64_t *); +extern bool_t xdr_u_int64_t (XDR *, u_int64_t *); +#endif /* ___int64_t_defined */ +extern bool_t xdr_bool (XDR *, bool_t *); +extern bool_t xdr_enum (XDR *, enum_t *); +extern bool_t xdr_array (XDR *, char **, u_int *, u_int, u_int, xdrproc_t); +extern bool_t xdr_bytes (XDR *, char **, u_int *, u_int); +extern bool_t xdr_opaque (XDR *, char *, u_int); +extern bool_t xdr_string (XDR *, char **, u_int); +extern bool_t xdr_union (XDR *, enum_t *, char *, + const struct xdr_discrim *, xdrproc_t); +extern bool_t xdr_char (XDR *, char *); +extern bool_t xdr_u_char (XDR *, u_char *); +extern bool_t xdr_vector (XDR *, char *, u_int, u_int, xdrproc_t); +extern bool_t xdr_float (XDR *, float *); +extern bool_t xdr_double (XDR *, double *); +/* extern bool_t xdr_quadruple (XDR *, long double *); */ +extern bool_t xdr_reference (XDR *, char **, u_int, xdrproc_t); +extern bool_t xdr_pointer (XDR *, char **, u_int, xdrproc_t); +extern bool_t xdr_wrapstring (XDR *, char **); +#if defined(___int64_t_defined) +extern bool_t xdr_hyper (XDR *, quad_t *); +extern bool_t xdr_u_hyper (XDR *, u_quad_t *); +extern bool_t xdr_longlong_t (XDR *, quad_t *); +extern bool_t xdr_u_longlong_t (XDR *, u_quad_t *); +#endif /* ___int64_t_defined */ +extern u_long xdr_sizeof (xdrproc_t, void *); + +/* + * Common opaque bytes objects used by many rpc protocols; + * declared here due to commonality. + */ +#define MAX_NETOBJ_SZ 1024 +struct netobj +{ + u_int n_len; + char *n_bytes; +}; +typedef struct netobj netobj; +extern bool_t xdr_netobj (XDR *, struct netobj *); + +/* + * These are the public routines for the various implementations of + * xdr streams. + */ + +/* XDR using memory buffers */ +extern void xdrmem_create (XDR *, char *, u_int, enum xdr_op); + +/* XDR using stdio library */ +#if defined(_STDIO_H_) +extern void xdrstdio_create (XDR *, FILE *, enum xdr_op); +#endif + +/* XDR pseudo records for tcp */ +extern void xdrrec_create (XDR *, u_int, u_int, void *, + int (*) (void *, void *, int), + int (*) (void *, void *, int)); + +/* make end of xdr record */ +extern bool_t xdrrec_endofrecord (XDR *, bool_t); + +/* move to beginning of next record */ +extern bool_t xdrrec_skiprecord (XDR *); + +/* true if no more input */ +extern bool_t xdrrec_eof (XDR *); +extern u_int xdrrec_readbytes (XDR *, caddr_t, u_int); + +/* free memory buffers for xdr */ +extern void xdr_free (xdrproc_t, void *); + +#ifdef __cplusplus +} +#endif + +#endif /* !_RPC_XDR_H */ diff --git a/include/safe-ctype.h b/include/safe-ctype.h new file mode 100644 index 0000000..a6d163e --- /dev/null +++ b/include/safe-ctype.h @@ -0,0 +1,150 @@ +/* replacement macros. + + Copyright (C) 2000-2015 Free Software Foundation, Inc. + Contributed by Zack Weinberg . + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +/* This is a compatible replacement of the standard C library's + with the following properties: + + - Implements all isxxx() macros required by C99. + - Also implements some character classes useful when + parsing C-like languages. + - Does not change behavior depending on the current locale. + - Behaves properly for all values in the range of a signed or + unsigned char. + + To avoid conflicts, this header defines the isxxx functions in upper + case, e.g. ISALPHA not isalpha. */ + +#ifndef SAFE_CTYPE_H +#define SAFE_CTYPE_H + +/* Determine host character set. */ +#define HOST_CHARSET_UNKNOWN 0 +#define HOST_CHARSET_ASCII 1 +#define HOST_CHARSET_EBCDIC 2 + +#if '\n' == 0x0A && ' ' == 0x20 && '0' == 0x30 \ + && 'A' == 0x41 && 'a' == 0x61 && '!' == 0x21 +# define HOST_CHARSET HOST_CHARSET_ASCII +#else +# if '\n' == 0x15 && ' ' == 0x40 && '0' == 0xF0 \ + && 'A' == 0xC1 && 'a' == 0x81 && '!' == 0x5A +# define HOST_CHARSET HOST_CHARSET_EBCDIC +# else +# define HOST_CHARSET HOST_CHARSET_UNKNOWN +# endif +#endif + +/* Categories. */ + +enum { + /* In C99 */ + _sch_isblank = 0x0001, /* space \t */ + _sch_iscntrl = 0x0002, /* nonprinting characters */ + _sch_isdigit = 0x0004, /* 0-9 */ + _sch_islower = 0x0008, /* a-z */ + _sch_isprint = 0x0010, /* any printing character including ' ' */ + _sch_ispunct = 0x0020, /* all punctuation */ + _sch_isspace = 0x0040, /* space \t \n \r \f \v */ + _sch_isupper = 0x0080, /* A-Z */ + _sch_isxdigit = 0x0100, /* 0-9A-Fa-f */ + + /* Extra categories useful to cpplib. */ + _sch_isidst = 0x0200, /* A-Za-z_ */ + _sch_isvsp = 0x0400, /* \n \r */ + _sch_isnvsp = 0x0800, /* space \t \f \v \0 */ + + /* Combinations of the above. */ + _sch_isalpha = _sch_isupper|_sch_islower, /* A-Za-z */ + _sch_isalnum = _sch_isalpha|_sch_isdigit, /* A-Za-z0-9 */ + _sch_isidnum = _sch_isidst|_sch_isdigit, /* A-Za-z0-9_ */ + _sch_isgraph = _sch_isalnum|_sch_ispunct, /* isprint and not space */ + _sch_iscppsp = _sch_isvsp|_sch_isnvsp, /* isspace + \0 */ + _sch_isbasic = _sch_isprint|_sch_iscppsp /* basic charset of ISO C + (plus ` and @) */ +}; + +/* Character classification. */ +extern const unsigned short _sch_istable[256]; + +#define _sch_test(c, bit) (_sch_istable[(c) & 0xff] & (unsigned short)(bit)) + +#define ISALPHA(c) _sch_test(c, _sch_isalpha) +#define ISALNUM(c) _sch_test(c, _sch_isalnum) +#define ISBLANK(c) _sch_test(c, _sch_isblank) +#define ISCNTRL(c) _sch_test(c, _sch_iscntrl) +#define ISDIGIT(c) _sch_test(c, _sch_isdigit) +#define ISGRAPH(c) _sch_test(c, _sch_isgraph) +#define ISLOWER(c) _sch_test(c, _sch_islower) +#define ISPRINT(c) _sch_test(c, _sch_isprint) +#define ISPUNCT(c) _sch_test(c, _sch_ispunct) +#define ISSPACE(c) _sch_test(c, _sch_isspace) +#define ISUPPER(c) _sch_test(c, _sch_isupper) +#define ISXDIGIT(c) _sch_test(c, _sch_isxdigit) + +#define ISIDNUM(c) _sch_test(c, _sch_isidnum) +#define ISIDST(c) _sch_test(c, _sch_isidst) +#define IS_ISOBASIC(c) _sch_test(c, _sch_isbasic) +#define IS_VSPACE(c) _sch_test(c, _sch_isvsp) +#define IS_NVSPACE(c) _sch_test(c, _sch_isnvsp) +#define IS_SPACE_OR_NUL(c) _sch_test(c, _sch_iscppsp) + +/* Character transformation. */ +extern const unsigned char _sch_toupper[256]; +extern const unsigned char _sch_tolower[256]; +#define TOUPPER(c) _sch_toupper[(c) & 0xff] +#define TOLOWER(c) _sch_tolower[(c) & 0xff] + +/* Prevent the users of safe-ctype.h from accidently using the routines + from ctype.h. Initially, the approach was to produce an error when + detecting that ctype.h has been included. But this was causing + trouble as ctype.h might get indirectly included as a result of + including another system header (for instance gnulib's stdint.h). + So we include ctype.h here and then immediately redefine its macros. */ + +#include +#undef isalpha +#define isalpha(c) do_not_use_isalpha_with_safe_ctype +#undef isalnum +#define isalnum(c) do_not_use_isalnum_with_safe_ctype +#undef iscntrl +#define iscntrl(c) do_not_use_iscntrl_with_safe_ctype +#undef isdigit +#define isdigit(c) do_not_use_isdigit_with_safe_ctype +#undef isgraph +#define isgraph(c) do_not_use_isgraph_with_safe_ctype +#undef islower +#define islower(c) do_not_use_islower_with_safe_ctype +#undef isprint +#define isprint(c) do_not_use_isprint_with_safe_ctype +#undef ispunct +#define ispunct(c) do_not_use_ispunct_with_safe_ctype +#undef isspace +#define isspace(c) do_not_use_isspace_with_safe_ctype +#undef isupper +#define isupper(c) do_not_use_isupper_with_safe_ctype +#undef isxdigit +#define isxdigit(c) do_not_use_isxdigit_with_safe_ctype +#undef toupper +#define toupper(c) do_not_use_toupper_with_safe_ctype +#undef tolower +#define tolower(c) do_not_use_tolower_with_safe_ctype + +#endif /* SAFE_CTYPE_H */ diff --git a/include/sched.h b/include/sched.h new file mode 100644 index 0000000..31599aa --- /dev/null +++ b/include/sched.h @@ -0,0 +1,112 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + +#ifndef _SCHED_H_ +#define _SCHED_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_POSIX_PRIORITY_SCHEDULING) +/* + * XBD 13 - Set Scheduling Parameters, P1003.1b-2008, p. 1803 + */ +int sched_setparam( + pid_t __pid, + const struct sched_param *__param +); + +/* + * XBD 13 - Set Scheduling Parameters, P1003.1b-2008, p. 1800 + */ +int sched_getparam( + pid_t __pid, + struct sched_param *__param +); + +/* + * XBD 13 - Set Scheduling Policy and Scheduling Parameters, + * P1003.1b-2008, p. 1805 + */ +int sched_setscheduler( + pid_t __pid, + int __policy, + const struct sched_param *__param +); + +/* + * XBD 13 - Get Scheduling Policy, P1003.1b-2008, p. 1801 + */ +int sched_getscheduler( + pid_t __pid +); + +/* + * XBD 13 - Get Scheduling Parameter Limits, P1003.1b-2008, p. 1799 + */ +int sched_get_priority_max( + int __policy +); + +int sched_get_priority_min( + int __policy +); + +/* + * XBD 13 - Get Scheduling Parameter Limits, P1003.1b-2008, p. 1802 + */ +int sched_rr_get_interval( + pid_t __pid, + struct timespec *__interval +); +#endif /* _POSIX_PRIORITY_SCHEDULING */ + +#if defined(_POSIX_THREADS) || defined(_POSIX_PRIORITY_SCHEDULING) + +/* + * XBD 13 - Yield Processor, P1003.1b-2008, p. 1807 + */ +int sched_yield( void ); + +#endif /* _POSIX_THREADS or _POSIX_PRIORITY_SCHEDULING */ + +#if __GNU_VISIBLE +int sched_getcpu(void); + +/* The following functions should only be declared if the type + cpu_set_t is defined through indirect inclusion of sys/cpuset.h, + only available on some targets. */ +#ifdef _SYS_CPUSET_H_ +int sched_getaffinity (pid_t, size_t, cpu_set_t *); +int sched_get_thread_affinity (void *, size_t, cpu_set_t *); +int sched_setaffinity (pid_t, size_t, const cpu_set_t *); +int sched_set_thread_affinity (void *, size_t, const cpu_set_t *); +#endif /* _SYS_CPUSET_H_ */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _SCHED_H_ */ diff --git a/include/search.h b/include/search.h new file mode 100644 index 0000000..ed321b0 --- /dev/null +++ b/include/search.h @@ -0,0 +1,64 @@ +/* $NetBSD: search.h,v 1.12 1999/02/22 10:34:28 christos Exp $ */ +/* $FreeBSD: src/include/search.h,v 1.4 2002/03/23 17:24:53 imp Exp $ */ + +/* + * Written by J.T. Conklin + * Public domain. + */ + +#ifndef _SEARCH_H_ +#define _SEARCH_H_ + +#include +#include +#include + +typedef struct entry { + char *key; + void *data; +} ENTRY; + +typedef enum { + FIND, ENTER +} ACTION; + +typedef enum { + preorder, + postorder, + endorder, + leaf +} VISIT; + +#ifdef _SEARCH_PRIVATE +typedef struct node { + char *key; + struct node *llink, *rlink; +} node_t; +#endif + +struct hsearch_data +{ + struct internal_head *htable; + size_t htablesize; +}; + +#ifndef __compar_fn_t_defined +#define __compar_fn_t_defined +typedef int (*__compar_fn_t) (const void *, const void *); +#endif + +__BEGIN_DECLS +int hcreate(size_t); +void hdestroy(void); +ENTRY *hsearch(ENTRY, ACTION); +int hcreate_r(size_t, struct hsearch_data *); +void hdestroy_r(struct hsearch_data *); +int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *); +void *tdelete(const void *__restrict, void **__restrict, __compar_fn_t); +void tdestroy (void *, void (*)(void *)); +void *tfind(const void *, void **, __compar_fn_t); +void *tsearch(const void *, void **, __compar_fn_t); +void twalk(const void *, void (*)(const void *, VISIT, int)); +__END_DECLS + +#endif /* !_SEARCH_H_ */ diff --git a/include/setjmp.h b/include/setjmp.h new file mode 100644 index 0000000..a2830b2 --- /dev/null +++ b/include/setjmp.h @@ -0,0 +1,25 @@ +/* + setjmp.h + stubs for future use. +*/ + +#ifndef _SETJMP_H_ +#define _SETJMP_H_ + +#include "_ansi.h" +#include + +_BEGIN_STD_C + +#ifdef __GNUC__ +void longjmp (jmp_buf __jmpb, int __retval) + __attribute__ ((__noreturn__)); +#else +void longjmp (jmp_buf __jmpb, int __retval); +#endif +int setjmp (jmp_buf __jmpb); + +_END_STD_C + +#endif /* _SETJMP_H_ */ + diff --git a/include/sha1.h b/include/sha1.h new file mode 100644 index 0000000..24f3ab7 --- /dev/null +++ b/include/sha1.h @@ -0,0 +1,145 @@ +/* Declarations of functions and data types used for SHA1 sum + library functions. + Copyright (C) 2000-2015 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 3, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef SHA1_H +# define SHA1_H 1 + +#include + +#if defined HAVE_LIMITS_H || _LIBC +# include +#endif + +#include "ansidecl.h" + +/* The following contortions are an attempt to use the C preprocessor + to determine an unsigned integral type that is 32 bits wide. An + alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but + doing that would require that the configure script compile and *run* + the resulting executable. Locally running cross-compiled executables + is usually not possible. */ + +#ifdef _LIBC +# include +typedef u_int32_t sha1_uint32; +typedef uintptr_t sha1_uintptr; +#elif defined (HAVE_SYS_TYPES_H) && defined (HAVE_STDINT_H) +#include +#include +typedef uint32_t sha1_uint32; +typedef uintptr_t sha1_uintptr; +#else +# define INT_MAX_32_BITS 2147483647 + +/* If UINT_MAX isn't defined, assume it's a 32-bit type. + This should be valid for all systems GNU cares about because + that doesn't include 16-bit systems, and only modern systems + (that certainly have ) have 64+-bit integral types. */ + +# ifndef INT_MAX +# define INT_MAX INT_MAX_32_BITS +# endif + +# if INT_MAX == INT_MAX_32_BITS + typedef unsigned int sha1_uint32; +# else +# if SHRT_MAX == INT_MAX_32_BITS + typedef unsigned short sha1_uint32; +# else +# if LONG_MAX == INT_MAX_32_BITS + typedef unsigned long sha1_uint32; +# else + /* The following line is intended to evoke an error. + Using #error is not portable enough. */ + "Cannot determine unsigned 32-bit data type." +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure to save state of computation between the single steps. */ +struct sha1_ctx +{ + sha1_uint32 A; + sha1_uint32 B; + sha1_uint32 C; + sha1_uint32 D; + sha1_uint32 E; + + sha1_uint32 total[2]; + sha1_uint32 buflen; + sha1_uint32 buffer[32]; +}; + + +/* Initialize structure containing state of computation. */ +extern void sha1_init_ctx (struct sha1_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is necessary that LEN is a multiple of 64!!! */ +extern void sha1_process_block (const void *buffer, size_t len, + struct sha1_ctx *ctx); + +/* Starting with the result of former calls of this function (or the + initialization function update the context for the next LEN bytes + starting at BUFFER. + It is NOT required that LEN is a multiple of 64. */ +extern void sha1_process_bytes (const void *buffer, size_t len, + struct sha1_ctx *ctx); + +/* Process the remaining bytes in the buffer and put result from CTX + in first 20 bytes following RESBUF. The result is always in little + endian byte order, so that a byte-wise output yields to the wanted + ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF be correctly + aligned for a 32 bits value. */ +extern void *sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf); + + +/* Put result from CTX in first 20 bytes following RESBUF. The result is + always in little endian byte order, so that a byte-wise output yields + to the wanted ASCII representation of the message digest. + + IMPORTANT: On some systems it is required that RESBUF is correctly + aligned for a 32 bits value. */ +extern void *sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf); + + +/* Compute SHA1 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 20 bytes + beginning at RESBLOCK. */ +extern int sha1_stream (FILE *stream, void *resblock); + +/* Compute SHA1 message digest for LEN bytes beginning at BUFFER. The + result is always in little endian byte order, so that a byte-wise + output yields to the wanted ASCII representation of the message + digest. */ +extern void *sha1_buffer (const char *buffer, size_t len, void *resblock); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/signal.h b/include/signal.h new file mode 100644 index 0000000..23a9863 --- /dev/null +++ b/include/signal.h @@ -0,0 +1,35 @@ +#ifndef _SIGNAL_H_ +#define _SIGNAL_H_ + +#include "_ansi.h" +#include +#include + +_BEGIN_STD_C + +typedef int sig_atomic_t; /* Atomic entity type (ANSI) */ +#if __BSD_VISIBLE +typedef _sig_func_ptr sig_t; /* BSD naming */ +#endif +#if __GNU_VISIBLE +typedef _sig_func_ptr sighandler_t; /* glibc naming */ +#endif + +#define SIG_DFL ((_sig_func_ptr)0) /* Default action */ +#define SIG_IGN ((_sig_func_ptr)1) /* Ignore action */ +#define SIG_ERR ((_sig_func_ptr)-1) /* Error return */ + +struct _reent; + +_sig_func_ptr _signal_r (struct _reent *, int, _sig_func_ptr); +int _raise_r (struct _reent *, int); + +#ifndef _REENT_ONLY +_sig_func_ptr signal (int, _sig_func_ptr); +int raise (int); +void psignal (int, const char *); +#endif + +_END_STD_C + +#endif /* _SIGNAL_H_ */ diff --git a/include/simple-object.h b/include/simple-object.h new file mode 100644 index 0000000..5bd3d06 --- /dev/null +++ b/include/simple-object.h @@ -0,0 +1,204 @@ +/* simple-object.h -- simple routines to read and write object files + Copyright (C) 2010-2015 Free Software Foundation, Inc. + Written by Ian Lance Taylor, Google. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef SIMPLE_OBJECT_H +#define SIMPLE_OBJECT_H + +#include +#include + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* This header file provides four types with associated functions. + They are used to read and write object files. This is a minimal + interface, intended to support the needs of gcc without bringing in + all the power and complexity of BFD. */ + +/* The type simple_object_read * is used to read an existing object + file. */ + +typedef struct simple_object_read_struct simple_object_read; + +/* Create an simple_object_read given DESCRIPTOR, an open file + descriptor, and OFFSET, an offset within the file. The offset is + for use with archives, and should be 0 for an ordinary object file. + The descriptor must remain open until done with the returned + simple_object_read. SEGMENT_NAME is used on Mach-O and is required + on that platform: it means to only look at sections within the + segment with that name. It is ignored for other object file + formats. On error, this function returns NULL, and sets *ERRMSG to + an error string and sets *ERR to an errno value or 0 if there is no + relevant errno. */ + +extern simple_object_read * +simple_object_start_read (int descriptor, off_t offset, + const char *segment_name, const char **errmsg, + int *err); + +/* Call PFN for each section in SIMPLE_OBJECT, passing it the section + name, offset within the file of the section contents, and length of + the section contents. The offset within the file is relative to + the offset passed to simple_object_start_read. The DATA argument + to simple_object_find_sections is passed on to PFN. If PFN returns + 0, the loop is stopped and simple_object_find_sections returns. If + PFN returns non-zero, the loop continues. On success this returns + NULL. On error it returns an error string, and sets *ERR to an + errno value or 0 if there is no relevant errno. */ + +extern const char * +simple_object_find_sections (simple_object_read *simple_object, + int (*pfn) (void *data, const char *, + off_t offset, off_t length), + void *data, + int *err); + +/* Look for the section NAME in SIMPLE_OBJECT. This returns + information for the first section NAME in SIMPLE_OBJECT. Note that + calling this multiple times is inefficient; use + simple_object_find_sections instead. + + If found, return 1 and set *OFFSET to the offset in the file of the + section contents and set *LENGTH to the length of the section + contents. *OFFSET will be relative to the offset passed to + simple_object_start_read. + + If the section is not found, and no error occurs, return 0 and set + *ERRMSG to NULL. + + If an error occurs, return 0, set *ERRMSG to an error message, and + set *ERR to an errno value or 0 if there is no relevant errno. */ + +extern int +simple_object_find_section (simple_object_read *simple_object, + const char *name, off_t *offset, off_t *length, + const char **errmsg, int *err); + +/* Release all resources associated with SIMPLE_OBJECT. This does not + close the file descriptor. */ + +extern void +simple_object_release_read (simple_object_read *); + +/* The type simple_object_attributes holds the attributes of an object + file that matter for creating a file or ensuring that two files are + compatible. This is a set of magic numbers. */ + +typedef struct simple_object_attributes_struct simple_object_attributes; + +/* Fetch the attributes of SIMPLE_OBJECT. This information will + persist until simple_object_attributes_release is called, even if + SIMPLE_OBJECT is closed. On error this returns NULL, sets *ERRMSG + to an error message, and sets *ERR to an errno value or 0 if there + isn't one. */ + +extern simple_object_attributes * +simple_object_fetch_attributes (simple_object_read *simple_object, + const char **errmsg, int *err); + +/* Merge the FROM attributes into TO. If two objects with these + attributes could be linked together without error, returns NULL. + Otherwise, returns an error message, and sets *ERR to an errno + value or 0 if there isn't one. */ + +extern const char * +simple_object_attributes_merge (simple_object_attributes *to, + simple_object_attributes *from, + int *err); + +/* Release all resources associated with ATTRS. */ + +extern void +simple_object_release_attributes (simple_object_attributes *attrs); + +/* The type simple_object_write is used to create a new object file. */ + +typedef struct simple_object_write_struct simple_object_write; + +/* Start creating a new object file which is like ATTRS. You must + fetch attribute information from an existing object file before you + can create a new one. There is currently no support for creating + an object file de novo. The segment name is only used on Mach-O, + where it is required. It means that all sections are created + within that segment. It is ignored for other object file formats. + On error this function returns NULL, sets *ERRMSG to an error + message, and sets *ERR to an errno value or 0 if there isn't + one. */ + +extern simple_object_write * +simple_object_start_write (simple_object_attributes *attrs, + const char *segment_name, + const char **errmsg, int *err); + +/* The type simple_object_write_section is a handle for a section + which is being written. */ + +typedef struct simple_object_write_section_struct simple_object_write_section; + +/* Add a section to SIMPLE_OBJECT. NAME is the name of the new + section. ALIGN is the required alignment expressed as the number + of required low-order 0 bits (e.g., 2 for alignment to a 32-bit + boundary). The section is created as containing data, readable, + not writable, not executable, not loaded at runtime. On error this + returns NULL, sets *ERRMSG to an error message, and sets *ERR to an + errno value or 0 if there isn't one. */ + +extern simple_object_write_section * +simple_object_write_create_section (simple_object_write *simple_object, + const char *name, unsigned int align, + const char **errmsg, int *err); + +/* Add data BUFFER/SIZE to SECTION in SIMPLE_OBJECT. If COPY is + non-zero, the data will be copied into memory if necessary. If + COPY is zero, BUFFER must persist until SIMPLE_OBJECT is released. + On success this returns NULL. On error this returns an error + message, and sets *ERR to an errno value or 0 if there isn't + one. */ + +extern const char * +simple_object_write_add_data (simple_object_write *simple_object, + simple_object_write_section *section, + const void *buffer, size_t size, + int copy, int *err); + +/* Write the complete object file to DESCRIPTOR, an open file + descriptor. This returns NULL on success. On error this returns + an error message, and sets *ERR to an errno value or 0 if there + isn't one. */ + +extern const char * +simple_object_write_to_file (simple_object_write *simple_object, + int descriptor, int *err); + +/* Release all resources associated with SIMPLE_OBJECT, including any + simple_object_write_section's that may have been created. */ + +extern void +simple_object_release_write (simple_object_write *); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/som/ChangeLog b/include/som/ChangeLog new file mode 100644 index 0000000..e1f1ec5 --- /dev/null +++ b/include/som/ChangeLog @@ -0,0 +1,20 @@ +2010-06-10 Tristan Gingold + + * aout.h: New file. + * clock.h: Likewise. + * lst.h: Likewise. + * reloc.h: Likewise. + * internal.h: Likewise. + +Copyright (C) 2010-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/som/aout.h b/include/som/aout.h new file mode 100644 index 0000000..c3845ed --- /dev/null +++ b/include/som/aout.h @@ -0,0 +1,249 @@ +/* SOM a.out definitions for BFD. + Copyright 2010 Free Software Foundation, Inc. + Contributed by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _SOM_AOUT_H +#define _SOM_AOUT_H + +#include "clock.h" + +/* Note: SOM uses bit-field in its structure. All you need to know is: + - CPUs supported by SOM (hppa) are big-endian, + - the MSB is numbered 0. */ + +struct som_external_header +{ + unsigned char system_id[2]; + unsigned char a_magic[2]; + unsigned char version_id[4]; + struct som_external_clock file_time; + unsigned char entry_space[4]; + unsigned char entry_subspace[4]; + unsigned char entry_offset[4]; + unsigned char aux_header_location[4]; + unsigned char aux_header_size[4]; + unsigned char som_length[4]; + unsigned char presumed_dp[4]; + unsigned char space_location[4]; + unsigned char space_total[4]; + unsigned char subspace_location[4]; + unsigned char subspace_total[4]; + unsigned char loader_fixup_location[4]; + unsigned char loader_fixup_total[4]; + unsigned char space_strings_location[4]; + unsigned char space_strings_size[4]; + unsigned char init_array_location[4]; + unsigned char init_array_total[4]; + unsigned char compiler_location[4]; + unsigned char compiler_total[4]; + unsigned char symbol_location[4]; + unsigned char symbol_total[4]; + unsigned char fixup_request_location[4]; + unsigned char fixup_request_total[4]; + unsigned char symbol_strings_location[4]; + unsigned char symbol_strings_size[4]; + unsigned char unloadable_sp_location[4]; + unsigned char unloadable_sp_size[4]; + unsigned char checksum[4]; +}; + +#define OLD_VERSION_ID 85082112 +#define NEW_VERSION_ID 87102412 + +#define EXECLIBMAGIC 0x0104 +#define RELOC_MAGIC 0x0106 +#define EXEC_MAGIC 0x0107 +#define SHARE_MAGIC 0x0108 +#define SHMEM_MAGIC 0x0109 +#define DEMAND_MAGIC 0x010b +#define DL_MAGIC 0x010d +#define SHL_MAGIC 0x010e + +struct som_external_aux_id +{ + unsigned char flags[4]; + unsigned char length[4]; +}; + +/* Aux id types. */ +#define VERSION_AUX_ID 6 +#define COPYRIGHT_AUX_ID 9 + +/* Aux id flags. */ +#define SOM_AUX_ID_MANDATORY (1 << 31) +#define SOM_AUX_ID_COPY (1 << 30) +#define SOM_AUX_ID_APPEND (1 << 29) +#define SOM_AUX_ID_IGNORE (1 << 28) +#define SOM_AUX_ID_TYPE_SH 0 +#define SOM_AUX_ID_TYPE_MASK 0xffff + +struct som_external_string_auxhdr +{ + struct som_external_aux_id header_id; + + /* Length of the string, without the NUL. */ + unsigned char string_length[4]; + + /* The string. */ +}; + +struct som_external_exec_auxhdr +{ + struct som_external_aux_id som_auxhdr; + + unsigned char exec_tsize[4]; + unsigned char exec_tmem[4]; + unsigned char exec_tfile[4]; + unsigned char exec_dsize[4]; + unsigned char exec_dmem[4]; + unsigned char exec_dfile[4]; + unsigned char exec_bsize[4]; + unsigned char exec_entry[4]; + unsigned char exec_flags[4]; + unsigned char exec_bfill[4]; +}; + +#define AUX_HDR_SIZE sizeof (struct som_external_exec_auxhdr) + +struct som_external_space_dictionary_record +{ + unsigned char name[4]; + unsigned char flags[4]; + unsigned char space_number[4]; + unsigned char subspace_index[4]; + unsigned char subspace_quantity[4]; + unsigned char loader_fix_index[4]; + unsigned char loader_fix_quantity[4]; + unsigned char init_pointer_index[4]; + unsigned char init_pointer_quantity[4]; +}; + +#define SOM_SPACE_IS_LOADABLE (1 << 31) +#define SOM_SPACE_IS_DEFINED (1 << 30) +#define SOM_SPACE_IS_PRIVATE (1 << 29) +#define SOM_SPACE_HAS_INTERMEDIATE_CODE (1 << 28) +#define SOM_SPACE_IS_TSPECIFIC (1 << 27) +#define SOM_SPACE_SORT_KEY_SH 8 +#define SOM_SPACE_SORT_KEY_MASK 0xff + +struct som_external_subspace_dictionary_record +{ + unsigned char space_index[4]; + unsigned char flags[4]; + unsigned char file_loc_init_value[4]; + unsigned char initialization_length[4]; + unsigned char subspace_start[4]; + unsigned char subspace_length[4]; + unsigned char alignment[4]; + unsigned char name[4]; + unsigned char fixup_request_index[4]; + unsigned char fixup_request_quantity[4]; +}; + +#define SOM_SUBSPACE_ACCESS_CONTROL_BITS_SH 25 +#define SOM_SUBSPACE_ACCESS_CONTROL_BITS_MASK 0x7f +#define SOM_SUBSPACE_MEMORY_RESIDENT (1 << 24) +#define SOM_SUBSPACE_DUP_COMMON (1 << 23) +#define SOM_SUBSPACE_IS_COMMON (1 << 22) +#define SOM_SUBSPACE_IS_LOADABLE (1 << 21) +#define SOM_SUBSPACE_QUADRANT_SH 19 +#define SOM_SUBSPACE_QUADRANT_MASK 0x3 +#define SOM_SUBSPACE_INITIALLY_FROZEN (1 << 18) +#define SOM_SUBSPACE_IS_FIRST (1 << 17) +#define SOM_SUBSPACE_CODE_ONLY (1 << 16) +#define SOM_SUBSPACE_SORT_KEY_SH 8 +#define SOM_SUBSPACE_SORT_KEY_MASK 0xff +#define SOM_SUBSPACE_REPLICATE_INIT (1 << 7) +#define SOM_SUBSPACE_CONTINUATION (1 << 6) +#define SOM_SUBSPACE_IS_TSPECIFIC (1 << 5) +#define SOM_SUBSPACE_IS_COMDAT (1 << 4) + +struct som_external_compilation_unit +{ + unsigned char name[4]; + unsigned char language_name[4]; + unsigned char product_id[4]; + unsigned char version_id[4]; + unsigned char flags[4]; + struct som_external_clock compile_time; + struct som_external_clock source_time; +}; + +struct som_external_symbol_dictionary_record +{ + unsigned char flags[4]; + unsigned char name[4]; + unsigned char qualifier_name[4]; + unsigned char info[4]; + unsigned char symbol_value[4]; +}; + +/* Flags fields. */ +#define SOM_SYMBOL_HIDDEN (1 << 31) +#define SOM_SYMBOL_SECONDARY_DEF (1 << 30) +#define SOM_SYMBOL_TYPE_SH 24 +#define SOM_SYMBOL_TYPE_MASK 0x3f +#define SOM_SYMBOL_SCOPE_SH 20 +#define SOM_SYMBOL_SCOPE_MASK 0xf +#define SOM_SYMBOL_CHECK_LEVEL_SH 17 +#define SOM_SYMBOL_CHECK_LEVEL_MASK 0x7 +#define SOM_SYMBOL_MUST_QUALIFY (1 << 16) +#define SOM_SYMBOL_INITIALLY_FROZEN (1 << 15) +#define SOM_SYMBOL_MEMORY_RESIDENT (1 << 14) +#define SOM_SYMBOL_IS_COMMON (1 << 13) +#define SOM_SYMBOL_DUP_COMMON (1 << 12) +#define SOM_SYMBOL_XLEAST_SH 10 +#define SOM_SYMBOL_XLEAT_MASK 0x3 +#define SOM_SYMBOL_ARG_RELOC_SH 0 +#define SOM_SYMBOL_ARG_RELOC_MASK 0x3ff + +/* Info fields. */ +#define SOM_SYMBOL_HAS_LONG_RETURN (1 << 31) +#define SOM_SYMBOL_NO_RELOCATION (1 << 30) +#define SOM_SYMBOL_IS_COMDAT (1 << 29) +#define SOM_SYMBOL_SYMBOL_INFO_SH 0 +#define SOM_SYMBOL_SYMBOL_INFO_MASK 0xffffff + +/* Symbol type definition. */ +#define ST_NULL 0 +#define ST_ABSOLUTE 1 +#define ST_DATA 2 +#define ST_CODE 3 +#define ST_PRI_PROG 4 +#define ST_SEC_PROG 5 +#define ST_ENTRY 6 +#define ST_STORAGE 7 +#define ST_STUB 8 +#define ST_MODULE 9 +#define ST_SYM_EXT 10 +#define ST_ARG_EXT 11 +#define ST_MILLICODE 12 +#define ST_PLABEL 13 +#define ST_OCT_DIS 14 +#define ST_MILLI_EXT 15 +#define ST_TSTORAGE 16 +#define ST_COMDAT 17 + +/* Symbol scope. */ +#define SS_UNSAT 0 +#define SS_EXTERNAL 1 +#define SS_LOCAL 2 +#define SS_UNIVERSAL 3 + +#endif /* _SOM_AOUT_H */ diff --git a/include/som/clock.h b/include/som/clock.h new file mode 100644 index 0000000..e2a7ba6 --- /dev/null +++ b/include/som/clock.h @@ -0,0 +1,30 @@ +/* SOM clock definition for BFD. + Copyright 2010 Free Software Foundation, Inc. + Contributed by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _SOM_CLOCK_H +#define _SOM_CLOCK_H + +struct som_external_clock +{ + unsigned char secs[4]; + unsigned char nanosecs[4]; +}; + +#endif /* _SOM_CLOCK_H */ diff --git a/include/som/internal.h b/include/som/internal.h new file mode 100644 index 0000000..e3889fb --- /dev/null +++ b/include/som/internal.h @@ -0,0 +1,206 @@ +/* SOM internal definitions for BFD. + Copyright 2010 Free Software Foundation, Inc. + Contributed by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _SOM_INTERNAL_H +#define _SOM_INTERNAL_H + +struct som_clock +{ + unsigned int secs; + unsigned int nanosecs; +}; + +struct som_header +{ + unsigned short system_id; + unsigned short a_magic; + unsigned int version_id; + struct som_clock file_time; + unsigned int entry_space; + unsigned int entry_subspace; + unsigned int entry_offset; + unsigned int aux_header_location; + unsigned int aux_header_size; + unsigned int som_length; + unsigned int presumed_dp; + unsigned int space_location; + unsigned int space_total; + unsigned int subspace_location; + unsigned int subspace_total; + unsigned int loader_fixup_location; + unsigned int loader_fixup_total; + unsigned int space_strings_location; + unsigned int space_strings_size; + unsigned int init_array_location; + unsigned int init_array_total; + unsigned int compiler_location; + unsigned int compiler_total; + unsigned int symbol_location; + unsigned int symbol_total; + unsigned int fixup_request_location; + unsigned int fixup_request_total; + unsigned int symbol_strings_location; + unsigned int symbol_strings_size; + unsigned int unloadable_sp_location; + unsigned int unloadable_sp_size; + unsigned int checksum; +}; + +struct som_aux_id +{ + unsigned int mandatory : 1; + unsigned int copy : 1; + unsigned int append : 1; + unsigned int ignore : 1; + unsigned int reserved : 12; + + /* Header type. */ + unsigned int type : 16; + + /* Length of the header in bytes, without the two word identifier. */ + unsigned int length; +}; + +/* Generic auxiliary string header. */ +struct som_string_auxhdr +{ + struct som_aux_id header_id; + + /* Length of the string, without the NUL. */ + unsigned int string_length; + + /* The string. */ + char string[1]; +}; + +struct som_name_pt +{ + char *name; + unsigned int strx; +}; + +struct som_compilation_unit +{ + /* Source file that produced the SOM. */ + struct som_name_pt name; + + /* Name of the language used when creating this SOM. */ + struct som_name_pt language_name; + + /* Identificaton of the compiler. */ + struct som_name_pt product_id; + + /* Version id of the compiler. */ + struct som_name_pt version_id; + + unsigned int flags; + struct som_clock compile_time; + struct som_clock source_time; +}; + +struct som_exec_auxhdr +{ + struct som_aux_id som_auxhdr; + + long exec_tsize; + long exec_tmem; + long exec_tfile; + long exec_dsize; + long exec_dmem; + long exec_dfile; + long exec_bsize; + long exec_entry; + long exec_flags; + long exec_bfill; +}; + +struct som_space_dictionary_record +{ + unsigned int name; + unsigned int is_loadable : 1; + unsigned int is_defined : 1; + unsigned int is_private : 1; + unsigned int has_intermediate_code : 1; + unsigned int is_tspecific : 1; + unsigned int reserved : 11; + unsigned int sort_key : 8; + unsigned int reserved2 : 8; + int space_number; + int subspace_index; + unsigned int subspace_quantity; + int loader_fix_index; + unsigned int loader_fix_quantity; + int init_pointer_index; + unsigned int init_pointer_quantity; +}; + +struct som_subspace_dictionary_record +{ + int space_index; + unsigned int access_control_bits : 7; + unsigned int memory_resident : 1; + unsigned int dup_common : 1; + unsigned int is_common : 1; + unsigned int is_loadable : 1; + unsigned int quadrant : 2; + unsigned int initially_frozen : 1; + unsigned int is_first : 1; + unsigned int code_only : 1; + unsigned int sort_key : 8; + unsigned int replicate_init : 1; + unsigned int continuation : 1; + unsigned int is_tspecific : 1; + unsigned int is_comdat : 1; + unsigned int reserved : 4; + int file_loc_init_value; + unsigned int initialization_length; + unsigned int subspace_start; + unsigned int subspace_length; + unsigned int reserved2 : 5; + unsigned int alignment : 27; + unsigned int name; + int fixup_request_index; + unsigned int fixup_request_quantity; +}; + +struct som_lst_header +{ + unsigned short system_id; + unsigned short a_magic; + unsigned int version_id; + struct som_clock file_time; + unsigned int hash_loc; + unsigned int hash_size; + unsigned int module_count; + unsigned int module_limit; + unsigned int dir_loc; + unsigned int export_loc; + unsigned int export_count; + unsigned int import_loc; + unsigned int aux_loc; + unsigned int aux_size; + unsigned int string_loc; + unsigned int string_size; + unsigned int free_list; + unsigned int file_end; + unsigned int checksum; +}; + +#endif /* _SOM_INTERNAL_H */ diff --git a/include/som/lst.h b/include/som/lst.h new file mode 100644 index 0000000..6088b47 --- /dev/null +++ b/include/som/lst.h @@ -0,0 +1,93 @@ +/* SOM lst definitions for BFD. + Copyright 2010 Free Software Foundation, Inc. + Contributed by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _SOM_LST_H +#define _SOM_LST_H + +#include "clock.h" + +/* See 4.2 Libraray Symbol Table Header Record. */ +struct som_external_lst_header +{ + unsigned char system_id[2]; + unsigned char a_magic[2]; + unsigned char version_id[4]; + struct som_external_clock file_time; + unsigned char hash_loc[4]; + unsigned char hash_size[4]; + unsigned char module_count[4]; + unsigned char module_limit[4]; + unsigned char dir_loc[4]; + unsigned char export_loc[4]; + unsigned char export_count[4]; + unsigned char import_loc[4]; + unsigned char aux_loc[4]; + unsigned char aux_size[4]; + unsigned char string_loc[4]; + unsigned char string_size[4]; + unsigned char free_list[4]; + unsigned char file_end[4]; + unsigned char checksum[4]; +}; + +#define VERSION_ID 85082112 +#define LIBMAGIC 0x0619 +#define LIBMAGIC_EXEC 0x0104 + +struct som_external_lst_symbol_record +{ + unsigned char flags[4]; + unsigned char name[4]; + unsigned char qualifier_name[4]; + unsigned char symbol_info[4]; + unsigned char symbol_value[4]; + unsigned char symbol_descriptor[4]; + unsigned char reserved; + unsigned char max_num_args; + unsigned char min_num_args; + unsigned char num_args; + unsigned char som_index[4]; + unsigned char symbol_key[4]; + unsigned char next_entry[4]; +}; + +/* Fields of flags. */ +#define LST_SYMBOL_HIDDEN (1 << 31) +#define LST_SYMBOL_SECONDARY_DEF (1 << 30) +#define LST_SYMBOL_SYMBOL_TYPE_SH 24 +#define LST_SYMBOL_SYMBOL_SCOPE_SH 20 +#define LST_SYMBOL_CHECK_LEVEL_SH 17 +#define LST_SYMBOL_MUST_QUALIFY (1 << 16) +#define LST_SYMBOL_INITIALY_FROZEN (1 << 15) +#define LST_SYMBOL_MEMORY_RESIDENT (1 << 14) +#define LST_SYMBOL_IS_COMMON (1 << 13) +#define LST_SYMBOL_DUP_COMMON (1 << 12) +#define LST_SYMBOL_XLEAST_SH 10 +#define LST_SYMBOL_ARG_RELOC_SH 0 + +/* According to 4.3.2 SOM Directory. */ + +struct som_external_som_entry +{ + unsigned char location[4]; + unsigned char length[4]; +}; + +#endif /* _SOM_LST_H */ diff --git a/include/som/reloc.h b/include/som/reloc.h new file mode 100644 index 0000000..417b5ee --- /dev/null +++ b/include/som/reloc.h @@ -0,0 +1,79 @@ +/* SOM relocation definitions for BFD. + Copyright 2010 Free Software Foundation, Inc. + Contributed by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software Foundation, + Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef _SOM_RELOC_H +#define _SOM_RELOC_H + +#define R_NO_RELOCATION 0 +#define R_ZEROES 0x20 +#define R_UNINIT 0x22 +#define R_RELOCATION 0x24 +#define R_DATA_ONE_SYMBOL 0x25 +#define R_DATA_PLABEL 0x27 +#define R_SPACE_REF 0x29 +#define R_REPEATED_INIT 0x2a +#define R_PCREL_CALL 0x30 +#define R_SHORT_PCREL_MODE 0x3e +#define R_LONG_PCREL_MODE 0x3f +#define R_ABS_CALL 0x40 +#define R_DP_RELATIVE 0x50 +#define R_DATA_GPREL 0x72 +#define R_INDIRECT_CALL 0x76 +#define R_PLT_REL 0x77 +#define R_DLT_REL 0x78 +#define R_CODE_ONE_SYMBOL 0x80 +#define R_MILLI_REL 0xae +#define R_CODE_PLABEL 0xb0 +#define R_BREAKPOINT 0xb2 +#define R_ENTRY 0xb3 +#define R_ALT_ENTRY 0xb5 +#define R_EXIT 0xb6 +#define R_BEGIN_TRY 0xb7 +#define R_END_TRY 0xb8 +#define R_BEGIN_BRTAB 0xbb +#define R_END_BRTAB 0xbc +#define R_STATEMENT 0xbd +#define R_DATA_EXPR 0xc0 +#define R_CODE_EXPR 0xc1 +#define R_FSEL 0xc2 +#define R_LSEL 0xc3 +#define R_RSEL 0xc4 +#define R_N_MODE 0xc5 +#define R_S_MODE 0xc6 +#define R_D_MODE 0xc7 +#define R_R_MODE 0xc8 +#define R_DATA_OVERRIDE 0xc9 +#define R_TRANSLATED 0xce +#define R_AUX_UNWIND 0xcf +#define R_COMP1 0xd0 +#define R_COMP2 0xd1 +#define R_COMP3 0xd2 +#define R_PREV_FIXUP 0xd3 +#define R_SEC_STMT 0xd7 +#define R_N0SEL 0xd8 +#define R_N1SEL 0xd9 +#define R_LINETAB 0xda +#define R_LINETAB_ESC 0xdb +#define R_LTP_OVERRIDE 0xdc +#define R_COMMENT 0xdd +#define R_TP_OVERRIDE 0xde +#define R_RESERVED 0xdf + +#endif /* _SOM_RELOC_H */ diff --git a/include/sort.h b/include/sort.h new file mode 100644 index 0000000..23025d4 --- /dev/null +++ b/include/sort.h @@ -0,0 +1,48 @@ +/* Sorting algorithms. + Copyright (C) 2000-2015 Free Software Foundation, Inc. + Contributed by Mark Mitchell . + +This file is part of GCC. + +GCC 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. + +GCC 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 GCC; see the file COPYING. If not, write to +the Free Software Foundation, 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef SORT_H +#define SORT_H + +#include /* For size_t */ +#ifdef __STDC__ +#include +#endif /* __STDC__ */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" + +/* Sort an array of pointers. */ + +extern void sort_pointers (size_t, void **, void **); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SORT_H */ + + + + diff --git a/include/spawn.h b/include/spawn.h new file mode 100644 index 0000000..d6ae992 --- /dev/null +++ b/include/spawn.h @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2008 Ed Schouten + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _SPAWN_H_ +#define _SPAWN_H_ + +#include <_ansi.h> +#include +#include +#include +#define __need_sigset_t +#include + +struct sched_param; + +typedef struct __posix_spawnattr *posix_spawnattr_t; +typedef struct __posix_spawn_file_actions *posix_spawn_file_actions_t; + +#define POSIX_SPAWN_RESETIDS 0x01 +#define POSIX_SPAWN_SETPGROUP 0x02 +#define POSIX_SPAWN_SETSCHEDPARAM 0x04 +#define POSIX_SPAWN_SETSCHEDULER 0x08 +#define POSIX_SPAWN_SETSIGDEF 0x10 +#define POSIX_SPAWN_SETSIGMASK 0x20 + +_BEGIN_STD_C +/* + * Spawn routines + * + * XXX both arrays should be __restrict, but this does not work when GCC + * is invoked with -std=c99. + */ +int posix_spawn (pid_t * __restrict, const char * __restrict, + const posix_spawn_file_actions_t *, const posix_spawnattr_t * __restrict, + char * const [], char * const []); +int posix_spawnp (pid_t * __restrict, const char * __restrict, + const posix_spawn_file_actions_t *, const posix_spawnattr_t * __restrict, + char * const [], char * const []); + +/* + * File descriptor actions + */ +int posix_spawn_file_actions_init (posix_spawn_file_actions_t *); +int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *); + +int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t * __restrict, + int, const char * __restrict, int, mode_t); +int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *, int, int); +int posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *, int); +#if __MISC_VISIBLE || __GNU_VISIBLE +int posix_spawn_file_actions_addchdir_np (posix_spawn_file_actions_t *__restrict +, + const char *__restrict); +int posix_spawn_file_actions_addfchdir_np (posix_spawn_file_actions_t *__restrict, + int); +#endif + +/* + * Spawn attributes + */ +int posix_spawnattr_init (posix_spawnattr_t *); +int posix_spawnattr_destroy (posix_spawnattr_t *); + +int posix_spawnattr_getflags (const posix_spawnattr_t * __restrict, + short * __restrict); +int posix_spawnattr_getpgroup (const posix_spawnattr_t * __restrict, + pid_t * __restrict); +int posix_spawnattr_getschedparam (const posix_spawnattr_t * __restrict, + struct sched_param * __restrict); +int posix_spawnattr_getschedpolicy (const posix_spawnattr_t * __restrict, + int * __restrict); +int posix_spawnattr_getsigdefault (const posix_spawnattr_t * __restrict, + sigset_t * __restrict); +int posix_spawnattr_getsigmask (const posix_spawnattr_t * __restrict, + sigset_t * __restrict); + +int posix_spawnattr_setflags (posix_spawnattr_t *, short); +int posix_spawnattr_setpgroup (posix_spawnattr_t *, pid_t); +int posix_spawnattr_setschedparam (posix_spawnattr_t * __restrict, + const struct sched_param * __restrict); +int posix_spawnattr_setschedpolicy (posix_spawnattr_t *, int); +int posix_spawnattr_setsigdefault (posix_spawnattr_t * __restrict, + const sigset_t * __restrict); +int posix_spawnattr_setsigmask (posix_spawnattr_t * __restrict, + const sigset_t * __restrict); +_END_STD_C + +#endif /* !_SPAWN_H_ */ diff --git a/include/splay-tree.h b/include/splay-tree.h new file mode 100644 index 0000000..f71d7d7 --- /dev/null +++ b/include/splay-tree.h @@ -0,0 +1,156 @@ +/* A splay-tree datatype. + Copyright (C) 1998-2015 Free Software Foundation, Inc. + Contributed by Mark Mitchell (mark@markmitchell.com). + + This file is part of GCC. + + GCC 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. + + GCC 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 GCC; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* For an easily readable description of splay-trees, see: + + Lewis, Harry R. and Denenberg, Larry. Data Structures and Their + Algorithms. Harper-Collins, Inc. 1991. + + The major feature of splay trees is that all basic tree operations + are amortized O(log n) time for a tree with n nodes. */ + +#ifndef _SPLAY_TREE_H +#define _SPLAY_TREE_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "ansidecl.h" + +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* Use typedefs for the key and data types to facilitate changing + these types, if necessary. These types should be sufficiently wide + that any pointer or scalar can be cast to these types, and then + cast back, without loss of precision. */ +typedef uintptr_t splay_tree_key; +typedef uintptr_t splay_tree_value; + +/* Forward declaration for a node in the tree. */ +typedef struct splay_tree_node_s *splay_tree_node; + +/* The type of a function which compares two splay-tree keys. The + function should return values as for qsort. */ +typedef int (*splay_tree_compare_fn) (splay_tree_key, splay_tree_key); + +/* The type of a function used to deallocate any resources associated + with the key. */ +typedef void (*splay_tree_delete_key_fn) (splay_tree_key); + +/* The type of a function used to deallocate any resources associated + with the value. */ +typedef void (*splay_tree_delete_value_fn) (splay_tree_value); + +/* The type of a function used to iterate over the tree. */ +typedef int (*splay_tree_foreach_fn) (splay_tree_node, void*); + +/* The type of a function used to allocate memory for tree root and + node structures. The first argument is the number of bytes needed; + the second is a data pointer the splay tree functions pass through + to the allocator. This function must never return zero. */ +typedef void *(*splay_tree_allocate_fn) (int, void *); + +/* The type of a function used to free memory allocated using the + corresponding splay_tree_allocate_fn. The first argument is the + memory to be freed; the latter is a data pointer the splay tree + functions pass through to the freer. */ +typedef void (*splay_tree_deallocate_fn) (void *, void *); + +/* The nodes in the splay tree. */ +struct splay_tree_node_s { + /* The key. */ + splay_tree_key key; + + /* The value. */ + splay_tree_value value; + + /* The left and right children, respectively. */ + splay_tree_node left; + splay_tree_node right; +}; + +/* The splay tree itself. */ +struct splay_tree_s { + /* The root of the tree. */ + splay_tree_node root; + + /* The comparision function. */ + splay_tree_compare_fn comp; + + /* The deallocate-key function. NULL if no cleanup is necessary. */ + splay_tree_delete_key_fn delete_key; + + /* The deallocate-value function. NULL if no cleanup is necessary. */ + splay_tree_delete_value_fn delete_value; + + /* Node allocate function. Takes allocate_data as a parameter. */ + splay_tree_allocate_fn allocate; + + /* Free function for nodes and trees. Takes allocate_data as a parameter. */ + splay_tree_deallocate_fn deallocate; + + /* Parameter for allocate/free functions. */ + void *allocate_data; +}; + +typedef struct splay_tree_s *splay_tree; + +extern splay_tree splay_tree_new (splay_tree_compare_fn, + splay_tree_delete_key_fn, + splay_tree_delete_value_fn); +extern splay_tree splay_tree_new_with_allocator (splay_tree_compare_fn, + splay_tree_delete_key_fn, + splay_tree_delete_value_fn, + splay_tree_allocate_fn, + splay_tree_deallocate_fn, + void *); +extern splay_tree splay_tree_new_typed_alloc (splay_tree_compare_fn, + splay_tree_delete_key_fn, + splay_tree_delete_value_fn, + splay_tree_allocate_fn, + splay_tree_allocate_fn, + splay_tree_deallocate_fn, + void *); +extern void splay_tree_delete (splay_tree); +extern splay_tree_node splay_tree_insert (splay_tree, + splay_tree_key, + splay_tree_value); +extern void splay_tree_remove (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_lookup (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_predecessor (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_successor (splay_tree, splay_tree_key); +extern splay_tree_node splay_tree_max (splay_tree); +extern splay_tree_node splay_tree_min (splay_tree); +extern int splay_tree_foreach (splay_tree, splay_tree_foreach_fn, void*); +extern int splay_tree_compare_ints (splay_tree_key, splay_tree_key); +extern int splay_tree_compare_pointers (splay_tree_key, splay_tree_key); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _SPLAY_TREE_H */ diff --git a/include/ssp/ssp.h b/include/ssp/ssp.h new file mode 100644 index 0000000..9229086 --- /dev/null +++ b/include/ssp/ssp.h @@ -0,0 +1,76 @@ +/* $NetBSD: ssp.h,v 1.13 2015/09/03 20:43:47 plunky Exp $ */ + +/*- + * Copyright (c) 2006, 2011 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_SSP_H_ +#define _SSP_SSP_H_ + +#include + +/* __ssp_real is used by the implementation in libc */ +#if __SSP_FORTIFY_LEVEL == 0 +#define __ssp_real_(fun) fun +#else +#define __ssp_real_(fun) __ssp_real_ ## fun +#endif +#define __ssp_real(fun) __ssp_real_(fun) + +#define __ssp_inline extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) + +#define __ssp_bos(ptr) __builtin_object_size(ptr, __SSP_FORTIFY_LEVEL > 1) +#define __ssp_bos0(ptr) __builtin_object_size(ptr, 0) + +#define __ssp_check(buf, len, bos) \ + if (bos(buf) != (size_t)-1 && len > bos(buf)) \ + __chk_fail() +#define __ssp_decl(rtype, fun, args) \ +rtype __ssp_real_(fun) args __asm__(__ASMNAME(#fun)); \ +__ssp_inline rtype fun args +#define __ssp_redirect_raw(rtype, fun, args, call, cond, bos) \ +__ssp_decl(rtype, fun, args) \ +{ \ + if (cond) \ + __ssp_check(__buf, __len, bos); \ + return __ssp_real_(fun) call; \ +} + +#define __ssp_redirect(rtype, fun, args, call) \ + __ssp_redirect_raw(rtype, fun, args, call, 1, __ssp_bos) +#define __ssp_redirect0(rtype, fun, args, call) \ + __ssp_redirect_raw(rtype, fun, args, call, 1, __ssp_bos0) + +#define __ssp_overlap(a, b, l) \ + (((a) <= (b) && (b) < (a) + (l)) || ((b) <= (a) && (a) < (b) + (l))) + +__BEGIN_DECLS +void __stack_chk_fail(void) __dead2; +void __chk_fail(void) __dead2; +__END_DECLS + +#endif /* _SSP_SSP_H_ */ diff --git a/include/ssp/stdio.h b/include/ssp/stdio.h new file mode 100644 index 0000000..df2cd18 --- /dev/null +++ b/include/ssp/stdio.h @@ -0,0 +1,101 @@ +/* $NetBSD: stdio.h,v 1.5 2011/07/17 20:54:34 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_STDIO_H_ +#define _SSP_STDIO_H_ + +#include + +__BEGIN_DECLS +int __sprintf_chk(char *__restrict, int, size_t, const char *__restrict, ...) + __printflike(4, 5); +int __vsprintf_chk(char *__restrict, int, size_t, const char *__restrict, + __va_list) + __printflike(4, 0); +int __snprintf_chk(char *__restrict, size_t, int, size_t, + const char *__restrict, ...) + __printflike(5, 6); +int __vsnprintf_chk(char *__restrict, size_t, int, size_t, + const char *__restrict, __va_list) + __printflike(5, 0); +char *__gets_chk(char *, size_t); +__END_DECLS + +#if __SSP_FORTIFY_LEVEL > 0 + + +#define sprintf(str, ...) \ + __builtin___sprintf_chk(str, 0, __ssp_bos(str), __VA_ARGS__) + +#define vsprintf(str, fmt, ap) \ + __builtin___vsprintf_chk(str, 0, __ssp_bos(str), fmt, ap) + +#define snprintf(str, len, ...) \ + __builtin___snprintf_chk(str, len, 0, __ssp_bos(str), __VA_ARGS__) + +#define vsnprintf(str, len, fmt, ap) \ + __builtin___vsnprintf_chk(str, len, 0, __ssp_bos(str), fmt, ap) + +#define gets(str) \ + __gets_chk(str, __ssp_bos(str)) + +__ssp_decl(char *, fgets, (char *__restrict __buf, int __len, FILE *__fp)) +{ + if (__len > 0) + __ssp_check(__buf, (size_t)__len, __ssp_bos); + return __ssp_real_fgets(__buf, __len, __fp); +} + +#if __GNU_VISIBLE +__ssp_decl(char *, fgets_unlocked, (char *__restrict __buf, int __len, FILE *__fp)) +{ + if (__len > 0) + __ssp_check(__buf, (size_t)__len, __ssp_bos); + return __ssp_real_fgets_unlocked(__buf, __len, __fp); +} +#endif /* __GNU_VISIBLE */ + +__ssp_decl(size_t, fread, (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __fp)) +{ + __ssp_check(__ptr, __size * __n, __ssp_bos0); + return __ssp_real_fread(__ptr, __size, __n, __fp); +} + +#if __MISC_VISIBLE +__ssp_decl(size_t, fread_unlocked, (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __fp)) +{ + __ssp_check(__ptr, __size * __n, __ssp_bos0); + return __ssp_real_fread_unlocked(__ptr, __size, __n, __fp); +} +#endif /* __MISC_VISIBLE */ + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ + +#endif /* _SSP_STDIO_H_ */ diff --git a/include/ssp/stdlib.h b/include/ssp/stdlib.h new file mode 100644 index 0000000..d5edb6d --- /dev/null +++ b/include/ssp/stdlib.h @@ -0,0 +1,30 @@ +#ifndef _SSP_STDLIB_H_ +#define _SSP_STDLIB_H_ + +#include + +#if __SSP_FORTIFY_LEVEL > 0 +__BEGIN_DECLS + +__ssp_decl(size_t, mbstowcs, (wchar_t *__buf, const char *__src, size_t __n)) +{ + if (__buf != NULL) + __ssp_check(__buf, __n * sizeof(wchar_t), __ssp_bos); + return __ssp_real_mbstowcs (__buf, __src, __n); +} + +__ssp_redirect_raw(size_t, wcstombs, \ + (char *__buf, const wchar_t *__src, size_t __len), \ + (__buf, __src, __len), __buf != NULL, __ssp_bos); + +__ssp_decl(int, wctomb, (char *__buf, wchar_t __wc)) +{ + if (__buf != NULL) + __ssp_check(__buf, MB_CUR_MAX, __ssp_bos); + return __ssp_real_wctomb (__buf, __wc); +} + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STDLIB_H_ */ diff --git a/include/ssp/string.h b/include/ssp/string.h new file mode 100644 index 0000000..85c4512 --- /dev/null +++ b/include/ssp/string.h @@ -0,0 +1,115 @@ +/* $NetBSD: string.h,v 1.13 2014/11/29 13:23:48 pooka Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_STRING_H_ +#define _SSP_STRING_H_ + +#include +#include + +__BEGIN_DECLS +void *__memcpy_chk(void *, const void *, size_t, size_t); +void *__memmove_chk(void *, void *, size_t, size_t); +void *__mempcpy_chk(void *, const void *, size_t, size_t); +void *__memset_chk(void *, int, size_t, size_t); +char *__stpcpy_chk(char *, const char *, size_t); +char *__strcat_chk(char *, const char *, size_t); +char *__strcpy_chk(char *, const char *, size_t); +char *__strncat_chk(char *, const char *, size_t, size_t); +char *__strncpy_chk(char *, const char *, size_t, size_t); +__END_DECLS + +#if __SSP_FORTIFY_LEVEL > 0 + +#define __ssp_bos_check3(fun, dst, src, len) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___ ## fun ## _chk(dst, src, len, __ssp_bos0(dst)) : \ + __ ## fun ## _ichk(dst, src, len)) + +#define __ssp_bos_check2(fun, dst, src) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___ ## fun ## _chk(dst, src, __ssp_bos0(dst)) : \ + __ ## fun ## _ichk(dst, src)) + +#define __ssp_bos_icheck3_restrict(fun, type1, type2) \ +__ssp_inline type1 __ ## fun ## _ichk(type1 __restrict, type2 __restrict, size_t); \ +__ssp_inline type1 \ +__ ## fun ## _ichk(type1 __restrict dst, type2 __restrict src, size_t len) { \ + return __builtin___ ## fun ## _chk(dst, src, len, __ssp_bos0(dst)); \ +} + +#define __ssp_bos_icheck3(fun, type1, type2) \ +__ssp_inline type1 __ ## fun ## _ichk(type1, type2, size_t); \ +__ssp_inline type1 \ +__ ## fun ## _ichk(type1 dst, type2 src, size_t len) { \ + return __builtin___ ## fun ## _chk(dst, src, len, __ssp_bos0(dst)); \ +} + +#define __ssp_bos_icheck2_restrict(fun, type1, type2) \ +__ssp_inline type1 __ ## fun ## _ichk(type1, type2); \ +__ssp_inline type1 \ +__ ## fun ## _ichk(type1 __restrict dst, type2 __restrict src) { \ + return __builtin___ ## fun ## _chk(dst, src, __ssp_bos0(dst)); \ +} + +__BEGIN_DECLS +__ssp_bos_icheck3_restrict(memcpy, void *, const void *) +__ssp_bos_icheck3(memmove, void *, const void *) +__ssp_bos_icheck3_restrict(mempcpy, void *, const void *) +__ssp_bos_icheck3(memset, void *, int) +__ssp_bos_icheck2_restrict(stpcpy, char *, const char *) +#if __GNUC_PREREQ__(4,8) || defined(__clang__) +__ssp_bos_icheck3_restrict(stpncpy, char *, const char *) +#endif +__ssp_bos_icheck2_restrict(strcpy, char *, const char *) +__ssp_bos_icheck2_restrict(strcat, char *, const char *) +__ssp_bos_icheck3_restrict(strncpy, char *, const char *) +__ssp_bos_icheck3_restrict(strncat, char *, const char *) +__END_DECLS + +#define memcpy(dst, src, len) __ssp_bos_check3(memcpy, dst, src, len) +#define memmove(dst, src, len) __ssp_bos_check3(memmove, dst, src, len) +#if __GNU_VISIBLE +#define mempcpy(dst, src, len) __ssp_bos_check3(mempcpy, dst, src, len) +#endif +#define memset(dst, val, len) __ssp_bos_check3(memset, dst, val, len) +#if __POSIX_VISIBLE >= 200809 +#define stpcpy(dst, src) __ssp_bos_check2(stpcpy, dst, src) +#if __GNUC_PREREQ__(4,8) || defined(__clang__) +#define stpncpy(dst, src, len) __ssp_bos_check3(stpncpy, dst, src, len) +#endif +#endif +#define strcpy(dst, src) __ssp_bos_check2(strcpy, dst, src) +#define strcat(dst, src) __ssp_bos_check2(strcat, dst, src) +#define strncpy(dst, src, len) __ssp_bos_check3(strncpy, dst, src, len) +#define strncat(dst, src, len) __ssp_bos_check3(strncat, dst, src, len) + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STRING_H_ */ diff --git a/include/ssp/strings.h b/include/ssp/strings.h new file mode 100644 index 0000000..13adba1 --- /dev/null +++ b/include/ssp/strings.h @@ -0,0 +1,55 @@ +/* $NetBSD: strings.h,v 1.3 2008/04/28 20:22:54 martin Exp $ */ + +/*- + * Copyright (c) 2007 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_STRINGS_H_ +#define _SSP_STRINGS_H_ + +#include + +#if __SSP_FORTIFY_LEVEL > 0 + +#if __BSD_VISIBLE || __POSIX_VISIBLE <= 200112 +#define bcopy(src, dst, len) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___memmove_chk(dst, src, len, __ssp_bos0(dst)) : \ + __memmove_ichk(dst, src, len)) +#define bzero(dst, len) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___memset_chk(dst, 0, len, __ssp_bos0(dst)) : \ + __memset_ichk(dst, 0, len)) +#endif + +#if __BSD_VISIBLE +__ssp_redirect0(void, explicit_bzero, (void *__buf, size_t __len), \ + (__buf, __len)); +#endif + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STRINGS_H_ */ diff --git a/include/ssp/unistd.h b/include/ssp/unistd.h new file mode 100644 index 0000000..5ca6ace --- /dev/null +++ b/include/ssp/unistd.h @@ -0,0 +1,93 @@ +/* $NetBSD: unistd.h,v 1.7 2015/06/25 18:41:03 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_UNISTD_H_ +#define _SSP_UNISTD_H_ + +#include + +#if __SSP_FORTIFY_LEVEL > 0 +__BEGIN_DECLS + +#if __POSIX_VISIBLE >= 199209 +__ssp_redirect(size_t, confstr, (int __name, char *__buf, size_t __len), \ + (__name, __buf, __len)); +#endif + +__ssp_redirect_raw(char *, getcwd, (char *__buf, size_t __len), + (__buf, __len), __buf != 0, __ssp_bos); + +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +__ssp_redirect(int, getdomainname, (char *__buf, size_t __len), \ + (__buf, __len)); +#endif + +__ssp_decl(int, getgroups, (int __n, gid_t __buf[])) +{ + __ssp_check(__buf, __n * sizeof(gid_t), __ssp_bos); + return __ssp_real_getgroups (__n, __buf); +} + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500 +#if !(defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) +__ssp_redirect(int, gethostname, (char *__buf, size_t __len), \ + (__buf, __len)); +#endif +#endif + +__ssp_redirect(int, getlogin_r, (char *__buf, size_t __len), \ + (__buf, __len)); + +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +__ssp_redirect0(ssize_t, pread, (int __fd, void *__buf, size_t __len, off_t __off), \ + (__fd, __buf, __len, __off)); +#endif + +__ssp_redirect0(_READ_WRITE_RETURN_TYPE, read, \ + (int __fd, void *__buf, size_t __len), (__fd, __buf, __len)); + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 4 +__ssp_redirect(ssize_t, readlink, (const char *__restrict __path, \ + char *__restrict __buf, size_t __len), (__path, __buf, __len)); +#endif + +#if __ATFILE_VISIBLE +__ssp_redirect(ssize_t, readlinkat, \ + (int __dirfd1, const char *__restrict __path, char *__restrict __buf, size_t __len), \ + (__dirfd1, __path, __buf, __len)); +#endif + +__ssp_redirect(int, ttyname_r, (int __fd, char *__buf, size_t __len), \ + (__fd, __buf, __len)); + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_UNISTD_H_ */ diff --git a/include/ssp/wchar.h b/include/ssp/wchar.h new file mode 100644 index 0000000..d748fa2 --- /dev/null +++ b/include/ssp/wchar.h @@ -0,0 +1,97 @@ +#ifndef _SSP_WCHAR_H_ +#define _SSP_WCHAR_H_ + +#include +#include + +#if __SSP_FORTIFY_LEVEL > 0 + +/* wide character variant, __wlen is number of wchar_t */ +#define __ssp_redirect_wc(rtype, fun, args, call, cond, bos) \ +__ssp_decl(rtype, fun, args) \ +{ \ + if (cond) \ + __ssp_check(__buf, __wlen * sizeof(wchar_t), bos); \ + return __ssp_real_(fun) call; \ +} + +#define __ssp_bos_wicheck3(fun) \ +__ssp_redirect_wc(wchar_t *, fun, \ + (wchar_t *__buf, const wchar_t *__src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +#define __ssp_bos_wicheck3_restrict(fun) \ +__ssp_redirect_wc(wchar_t *, fun, \ + (wchar_t *__restrict __buf, const wchar_t *__restrict __src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +#define __ssp_bos_wicheck2_restrict(fun) \ +__ssp_decl(wchar_t *, fun, (wchar_t *__restrict __buf, const wchar_t *__restrict __src)) \ +{ \ + __ssp_check(__buf, (wcslen(__src) + 1) * sizeof(wchar_t), __ssp_bos0); \ + return __ssp_real_(fun) (__buf, __src); \ +} + +__BEGIN_DECLS +#if __POSIX_VISIBLE >= 200809 +__ssp_bos_wicheck2_restrict(wcpcpy) +__ssp_bos_wicheck3_restrict(wcpncpy) +#endif +__ssp_bos_wicheck2_restrict(wcscpy) +__ssp_bos_wicheck2_restrict(wcscat) +__ssp_bos_wicheck3_restrict(wcsncpy) +__ssp_bos_wicheck3_restrict(wcsncat) +__ssp_bos_wicheck3_restrict(wmemcpy) +__ssp_bos_wicheck3(wmemmove) +#if __GNU_VISIBLE +__ssp_bos_wicheck3_restrict(wmempcpy) +#endif +__ssp_redirect_wc(wchar_t *, wmemset, \ + (wchar_t *__buf, wchar_t __src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +__ssp_decl(size_t, wcrtomb, (char *__buf, wchar_t __src, mbstate_t *__ps)) +{ + if (__buf != NULL && __src != L'\0') + __ssp_check(__buf, sizeof(wchar_t), __ssp_bos); + return __ssp_real_wcrtomb (__buf, __src, __ps); +} + +__ssp_redirect_wc(size_t, mbsrtowcs, \ + (wchar_t *__buf, const char **__src, size_t __wlen, mbstate_t *__ps), \ + (__buf, __src, __wlen, __ps), __buf != NULL, __ssp_bos) + +__ssp_redirect_raw(size_t, wcsrtombs, \ + (char *__buf, const wchar_t **__src, size_t __len, mbstate_t *__ps), \ + (__buf, __src, __len, __ps), __buf != NULL, __ssp_bos) + +#if __POSIX_VISIBLE >= 200809 +__ssp_redirect_wc(size_t, mbsnrtowcs, \ + (wchar_t *__buf, const char **__src, size_t __nms, size_t __wlen, mbstate_t *__ps), \ + (__buf, __src, __nms, __wlen, __ps), __buf != NULL, __ssp_bos) + +__ssp_redirect_raw(size_t, wcsnrtombs, \ + (char *__buf, const wchar_t **__src, size_t __nwc, size_t __len, mbstate_t *__ps), \ + (__buf, __src, __nwc, __len, __ps), __buf != NULL, __ssp_bos) +#endif + +__ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, __FILE *__restrict __fp)) +{ + if (__wlen > 0) + __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); + return __ssp_real_fgetws(__buf, __wlen, __fp); +} + +#if __GNU_VISIBLE +__ssp_decl(wchar_t *, fgetws_unlocked, (wchar_t *__buf, int __wlen, __FILE *__fp)) +{ + if (__wlen > 0) + __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); + return __ssp_real_fgetws_unlocked(__buf, __wlen, __fp); +} +#endif /* __GNU_VISIBLE */ + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_WCHAR_H_ */ diff --git a/include/stdatomic.h b/include/stdatomic.h new file mode 100644 index 0000000..d58e795 --- /dev/null +++ b/include/stdatomic.h @@ -0,0 +1,409 @@ +/*- + * Copyright (c) 2011 Ed Schouten + * David Chisnall + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _STDATOMIC_H_ +#define _STDATOMIC_H_ + +#include +#include + +#if __has_extension(c_atomic) || __has_extension(cxx_atomic) +#define __CLANG_ATOMICS +#elif __GNUC_PREREQ__(4, 7) +#define __GNUC_ATOMICS +#elif defined(__GNUC__) +#define __SYNC_ATOMICS +#else +#error "stdatomic.h does not support your compiler" +#endif + +/* + * 7.17.1 Atomic lock-free macros. + */ + +#ifdef __GCC_ATOMIC_BOOL_LOCK_FREE +#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_CHAR_LOCK_FREE +#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_CHAR16_T_LOCK_FREE +#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_CHAR32_T_LOCK_FREE +#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_WCHAR_T_LOCK_FREE +#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_SHORT_LOCK_FREE +#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_INT_LOCK_FREE +#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_LONG_LOCK_FREE +#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_LLONG_LOCK_FREE +#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_POINTER_LOCK_FREE +#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE +#endif + +/* + * 7.17.2 Initialization. + */ + +#if defined(__CLANG_ATOMICS) +#define ATOMIC_VAR_INIT(value) (value) +#define atomic_init(obj, value) __c11_atomic_init(obj, value) +#else +#define ATOMIC_VAR_INIT(value) { .__val = (value) } +#define atomic_init(obj, value) ((void)((obj)->__val = (value))) +#endif + +/* + * Clang and recent GCC both provide predefined macros for the memory + * orderings. If we are using a compiler that doesn't define them, use the + * clang values - these will be ignored in the fallback path. + */ + +#ifndef __ATOMIC_RELAXED +#define __ATOMIC_RELAXED 0 +#endif +#ifndef __ATOMIC_CONSUME +#define __ATOMIC_CONSUME 1 +#endif +#ifndef __ATOMIC_ACQUIRE +#define __ATOMIC_ACQUIRE 2 +#endif +#ifndef __ATOMIC_RELEASE +#define __ATOMIC_RELEASE 3 +#endif +#ifndef __ATOMIC_ACQ_REL +#define __ATOMIC_ACQ_REL 4 +#endif +#ifndef __ATOMIC_SEQ_CST +#define __ATOMIC_SEQ_CST 5 +#endif + +/* + * 7.17.3 Order and consistency. + * + * The memory_order_* constants that denote the barrier behaviour of the + * atomic operations. + */ + +typedef enum { + memory_order_relaxed = __ATOMIC_RELAXED, + memory_order_consume = __ATOMIC_CONSUME, + memory_order_acquire = __ATOMIC_ACQUIRE, + memory_order_release = __ATOMIC_RELEASE, + memory_order_acq_rel = __ATOMIC_ACQ_REL, + memory_order_seq_cst = __ATOMIC_SEQ_CST +} memory_order; + +/* + * 7.17.4 Fences. + */ + +static __inline void +atomic_thread_fence(memory_order __order __unused) +{ + +#ifdef __CLANG_ATOMICS + __c11_atomic_thread_fence(__order); +#elif defined(__GNUC_ATOMICS) + __atomic_thread_fence(__order); +#else + __sync_synchronize(); +#endif +} + +static __inline void +atomic_signal_fence(memory_order __order __unused) +{ + +#ifdef __CLANG_ATOMICS + __c11_atomic_signal_fence(__order); +#elif defined(__GNUC_ATOMICS) + __atomic_signal_fence(__order); +#else + __asm volatile ("" ::: "memory"); +#endif +} + +/* + * 7.17.5 Lock-free property. + */ + +#if defined(_KERNEL) +/* Atomics in kernelspace are always lock-free. */ +#define atomic_is_lock_free(obj) \ + ((void)(obj), (_Bool)1) +#elif defined(__CLANG_ATOMICS) || defined(__GNUC_ATOMICS) +#define atomic_is_lock_free(obj) \ + __atomic_is_lock_free(sizeof(*(obj)), obj) +#else +#define atomic_is_lock_free(obj) \ + ((void)(obj), sizeof((obj)->__val) <= sizeof(void *)) +#endif + +/* + * 7.17.6 Atomic integer types. + */ + +typedef _Atomic(_Bool) atomic_bool; +typedef _Atomic(char) atomic_char; +typedef _Atomic(signed char) atomic_schar; +typedef _Atomic(unsigned char) atomic_uchar; +typedef _Atomic(short) atomic_short; +typedef _Atomic(unsigned short) atomic_ushort; +typedef _Atomic(int) atomic_int; +typedef _Atomic(unsigned int) atomic_uint; +typedef _Atomic(long) atomic_long; +typedef _Atomic(unsigned long) atomic_ulong; +typedef _Atomic(long long) atomic_llong; +typedef _Atomic(unsigned long long) atomic_ullong; +#if 0 +typedef _Atomic(__char16_t) atomic_char16_t; +typedef _Atomic(__char32_t) atomic_char32_t; +#endif +typedef _Atomic(wchar_t) atomic_wchar_t; +typedef _Atomic(int_least8_t) atomic_int_least8_t; +typedef _Atomic(uint_least8_t) atomic_uint_least8_t; +typedef _Atomic(int_least16_t) atomic_int_least16_t; +typedef _Atomic(uint_least16_t) atomic_uint_least16_t; +typedef _Atomic(int_least32_t) atomic_int_least32_t; +typedef _Atomic(uint_least32_t) atomic_uint_least32_t; +typedef _Atomic(int_least64_t) atomic_int_least64_t; +typedef _Atomic(uint_least64_t) atomic_uint_least64_t; +typedef _Atomic(int_fast8_t) atomic_int_fast8_t; +typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t; +typedef _Atomic(int_fast16_t) atomic_int_fast16_t; +typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t; +typedef _Atomic(int_fast32_t) atomic_int_fast32_t; +typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t; +typedef _Atomic(int_fast64_t) atomic_int_fast64_t; +typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t; +typedef _Atomic(intptr_t) atomic_intptr_t; +typedef _Atomic(uintptr_t) atomic_uintptr_t; +typedef _Atomic(size_t) atomic_size_t; +typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t; +typedef _Atomic(intmax_t) atomic_intmax_t; +typedef _Atomic(uintmax_t) atomic_uintmax_t; + +/* + * 7.17.7 Operations on atomic types. + */ + +/* + * Compiler-specific operations. + */ + +#if defined(__CLANG_ATOMICS) +#define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) \ + __c11_atomic_compare_exchange_strong(object, expected, desired, \ + success, failure) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + __c11_atomic_compare_exchange_weak(object, expected, desired, \ + success, failure) +#define atomic_exchange_explicit(object, desired, order) \ + __c11_atomic_exchange(object, desired, order) +#define atomic_fetch_add_explicit(object, operand, order) \ + __c11_atomic_fetch_add(object, operand, order) +#define atomic_fetch_and_explicit(object, operand, order) \ + __c11_atomic_fetch_and(object, operand, order) +#define atomic_fetch_or_explicit(object, operand, order) \ + __c11_atomic_fetch_or(object, operand, order) +#define atomic_fetch_sub_explicit(object, operand, order) \ + __c11_atomic_fetch_sub(object, operand, order) +#define atomic_fetch_xor_explicit(object, operand, order) \ + __c11_atomic_fetch_xor(object, operand, order) +#define atomic_load_explicit(object, order) \ + __c11_atomic_load(object, order) +#define atomic_store_explicit(object, desired, order) \ + __c11_atomic_store(object, desired, order) +#elif defined(__GNUC_ATOMICS) +#define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) \ + __atomic_compare_exchange_n(object, expected, \ + desired, 0, success, failure) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + __atomic_compare_exchange_n(object, expected, \ + desired, 1, success, failure) +#define atomic_exchange_explicit(object, desired, order) \ + __atomic_exchange_n(object, desired, order) +#define atomic_fetch_add_explicit(object, operand, order) \ + __atomic_fetch_add(object, operand, order) +#define atomic_fetch_and_explicit(object, operand, order) \ + __atomic_fetch_and(object, operand, order) +#define atomic_fetch_or_explicit(object, operand, order) \ + __atomic_fetch_or(object, operand, order) +#define atomic_fetch_sub_explicit(object, operand, order) \ + __atomic_fetch_sub(object, operand, order) +#define atomic_fetch_xor_explicit(object, operand, order) \ + __atomic_fetch_xor(object, operand, order) +#define atomic_load_explicit(object, order) \ + __atomic_load_n(object, order) +#define atomic_store_explicit(object, desired, order) \ + __atomic_store_n(object, desired, order) +#else +#define __atomic_apply_stride(object, operand) \ + (((__typeof__((object)->__val))0) + (operand)) +#define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) __extension__ ({ \ + __typeof__(expected) __ep = (expected); \ + __typeof__(*__ep) __e = *__ep; \ + (void)(success); (void)(failure); \ + (_Bool)((*__ep = __sync_val_compare_and_swap(&(object)->__val, \ + __e, desired)) == __e); \ +}) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) +#if __has_builtin(__sync_swap) +/* Clang provides a full-barrier atomic exchange - use it if available. */ +#define atomic_exchange_explicit(object, desired, order) \ + ((void)(order), __sync_swap(&(object)->__val, desired)) +#else +/* + * __sync_lock_test_and_set() is only an acquire barrier in theory (although in + * practice it is usually a full barrier) so we need an explicit barrier before + * it. + */ +#define atomic_exchange_explicit(object, desired, order) \ +__extension__ ({ \ + __typeof__(object) __o = (object); \ + __typeof__(desired) __d = (desired); \ + (void)(order); \ + __sync_synchronize(); \ + __sync_lock_test_and_set(&(__o)->__val, __d); \ +}) +#endif +#define atomic_fetch_add_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_add(&(object)->__val, \ + __atomic_apply_stride(object, operand))) +#define atomic_fetch_and_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_and(&(object)->__val, operand)) +#define atomic_fetch_or_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_or(&(object)->__val, operand)) +#define atomic_fetch_sub_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_sub(&(object)->__val, \ + __atomic_apply_stride(object, operand))) +#define atomic_fetch_xor_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_xor(&(object)->__val, operand)) +#define atomic_load_explicit(object, order) \ + ((void)(order), __sync_fetch_and_add(&(object)->__val, 0)) +#define atomic_store_explicit(object, desired, order) \ + ((void)atomic_exchange_explicit(object, desired, order)) +#endif + +/* + * Convenience functions. + * + * Don't provide these in kernel space. In kernel space, we should be + * disciplined enough to always provide explicit barriers. + */ + +#ifndef _KERNEL +#define atomic_compare_exchange_strong(object, expected, desired) \ + atomic_compare_exchange_strong_explicit(object, expected, \ + desired, memory_order_seq_cst, memory_order_seq_cst) +#define atomic_compare_exchange_weak(object, expected, desired) \ + atomic_compare_exchange_weak_explicit(object, expected, \ + desired, memory_order_seq_cst, memory_order_seq_cst) +#define atomic_exchange(object, desired) \ + atomic_exchange_explicit(object, desired, memory_order_seq_cst) +#define atomic_fetch_add(object, operand) \ + atomic_fetch_add_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_and(object, operand) \ + atomic_fetch_and_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_or(object, operand) \ + atomic_fetch_or_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_sub(object, operand) \ + atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_xor(object, operand) \ + atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst) +#define atomic_load(object) \ + atomic_load_explicit(object, memory_order_seq_cst) +#define atomic_store(object, desired) \ + atomic_store_explicit(object, desired, memory_order_seq_cst) +#endif /* !_KERNEL */ + +/* + * 7.17.8 Atomic flag type and operations. + * + * XXX: Assume atomic_bool can be used as an atomic_flag. Is there some + * kind of compiler built-in type we could use? + */ + +typedef struct { + atomic_bool __flag; +} atomic_flag; +#define ATOMIC_FLAG_INIT { ATOMIC_VAR_INIT(0) } + +static __inline _Bool +atomic_flag_test_and_set_explicit(volatile atomic_flag *__object, + memory_order __order) +{ + return (atomic_exchange_explicit(&__object->__flag, 1, __order)); +} + +static __inline void +atomic_flag_clear_explicit(volatile atomic_flag *__object, memory_order __order) +{ + + atomic_store_explicit(&__object->__flag, 0, __order); +} + +#ifndef _KERNEL +static __inline _Bool +atomic_flag_test_and_set(volatile atomic_flag *__object) +{ + + return (atomic_flag_test_and_set_explicit(__object, + memory_order_seq_cst)); +} + +static __inline void +atomic_flag_clear(volatile atomic_flag *__object) +{ + + atomic_flag_clear_explicit(__object, memory_order_seq_cst); +} +#endif /* !_KERNEL */ + +#endif /* !_STDATOMIC_H_ */ diff --git a/include/stdint.h b/include/stdint.h new file mode 100644 index 0000000..4abdacb --- /dev/null +++ b/include/stdint.h @@ -0,0 +1,466 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _STDINT_H +#define _STDINT_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ___int_least8_t_defined +typedef __int_least8_t int_least8_t; +typedef __uint_least8_t uint_least8_t; +#define __int_least8_t_defined 1 +#endif + +#ifdef ___int_least16_t_defined +typedef __int_least16_t int_least16_t; +typedef __uint_least16_t uint_least16_t; +#define __int_least16_t_defined 1 +#endif + +#ifdef ___int_least32_t_defined +typedef __int_least32_t int_least32_t; +typedef __uint_least32_t uint_least32_t; +#define __int_least32_t_defined 1 +#endif + +#ifdef ___int_least64_t_defined +typedef __int_least64_t int_least64_t; +typedef __uint_least64_t uint_least64_t; +#define __int_least64_t_defined 1 +#endif + +/* + * Fastest minimum-width integer types + * + * Assume int to be the fastest type for all types with a width + * less than __INT_MAX__ rsp. INT_MAX + */ +#ifdef __INT_FAST8_TYPE__ + typedef __INT_FAST8_TYPE__ int_fast8_t; + typedef __UINT_FAST8_TYPE__ uint_fast8_t; +#define __int_fast8_t_defined 1 +#elif __STDINT_EXP(INT_MAX) >= 0x7f + typedef signed int int_fast8_t; + typedef unsigned int uint_fast8_t; +#define __int_fast8_t_defined 1 +#endif + +#ifdef __INT_FAST16_TYPE__ + typedef __INT_FAST16_TYPE__ int_fast16_t; + typedef __UINT_FAST16_TYPE__ uint_fast16_t; +#define __int_fast16_t_defined 1 +#elif __STDINT_EXP(INT_MAX) >= 0x7fff + typedef signed int int_fast16_t; + typedef unsigned int uint_fast16_t; +#define __int_fast16_t_defined 1 +#endif + +#ifdef __INT_FAST32_TYPE__ + typedef __INT_FAST32_TYPE__ int_fast32_t; + typedef __UINT_FAST32_TYPE__ uint_fast32_t; +#define __int_fast32_t_defined 1 +#elif __STDINT_EXP(INT_MAX) >= 0x7fffffff + typedef signed int int_fast32_t; + typedef unsigned int uint_fast32_t; +#define __int_fast32_t_defined 1 +#endif + +#ifdef __INT_FAST64_TYPE__ + typedef __INT_FAST64_TYPE__ int_fast64_t; + typedef __UINT_FAST64_TYPE__ uint_fast64_t; +#define __int_fast64_t_defined 1 +#elif __STDINT_EXP(INT_MAX) > 0x7fffffff + typedef signed int int_fast64_t; + typedef unsigned int uint_fast64_t; +#define __int_fast64_t_defined 1 +#endif + +/* + * Fall back to [u]int_least_t for [u]int_fast_t types + * not having been defined, yet. + * Leave undefined, if [u]int_least_t should not be available. + */ +#if !__int_fast8_t_defined +#if __int_least8_t_defined + typedef int_least8_t int_fast8_t; + typedef uint_least8_t uint_fast8_t; +#define __int_fast8_t_defined 1 +#endif +#endif + +#if !__int_fast16_t_defined +#if __int_least16_t_defined + typedef int_least16_t int_fast16_t; + typedef uint_least16_t uint_fast16_t; +#define __int_fast16_t_defined 1 +#endif +#endif + +#if !__int_fast32_t_defined +#if __int_least32_t_defined + typedef int_least32_t int_fast32_t; + typedef uint_least32_t uint_fast32_t; +#define __int_fast32_t_defined 1 +#endif +#endif + +#if !__int_fast64_t_defined +#if __int_least64_t_defined + typedef int_least64_t int_fast64_t; + typedef uint_least64_t uint_fast64_t; +#define __int_fast64_t_defined 1 +#endif +#endif + +#ifdef __INTPTR_TYPE__ +#define INTPTR_MIN (-__INTPTR_MAX__ - 1) +#define INTPTR_MAX (__INTPTR_MAX__) +#define UINTPTR_MAX (__UINTPTR_MAX__) +#elif defined(__PTRDIFF_TYPE__) +#define INTPTR_MAX PTRDIFF_MAX +#define INTPTR_MIN PTRDIFF_MIN +#ifdef __UINTPTR_MAX__ +#define UINTPTR_MAX (__UINTPTR_MAX__) +#else +#define UINTPTR_MAX (2UL * PTRDIFF_MAX + 1) +#endif +#else +/* + * Fallback to hardcoded values, + * should be valid on cpu's with 32bit int/32bit void* + */ +#define INTPTR_MAX (__STDINT_EXP(LONG_MAX)) +#define INTPTR_MIN (-__STDINT_EXP(LONG_MAX) - 1) +#define UINTPTR_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) +#endif + +/* Limits of Specified-Width Integer Types */ + +#ifdef __INT8_MAX__ +#define INT8_MIN (-__INT8_MAX__ - 1) +#define INT8_MAX (__INT8_MAX__) +#define UINT8_MAX (__UINT8_MAX__) +#elif defined(__int8_t_defined) +#define INT8_MIN (-128) +#define INT8_MAX (127) +#define UINT8_MAX (255) +#endif + +#ifdef __INT_LEAST8_MAX__ +#define INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1) +#define INT_LEAST8_MAX (__INT_LEAST8_MAX__) +#define UINT_LEAST8_MAX (__UINT_LEAST8_MAX__) +#elif defined(__int_least8_t_defined) +#define INT_LEAST8_MIN (-128) +#define INT_LEAST8_MAX (127) +#define UINT_LEAST8_MAX (255) +#else +#error required type int_least8_t missing +#endif + +#ifdef __INT16_MAX__ +#define INT16_MIN (-__INT16_MAX__ - 1) +#define INT16_MAX (__INT16_MAX__) +#define UINT16_MAX (__UINT16_MAX__) +#elif defined(__int16_t_defined) +#define INT16_MIN (-32768) +#define INT16_MAX (32767) +#define UINT16_MAX (65535) +#endif + +#ifdef __INT_LEAST16_MAX__ +#define INT_LEAST16_MIN (-__INT_LEAST16_MAX__ - 1) +#define INT_LEAST16_MAX (__INT_LEAST16_MAX__) +#define UINT_LEAST16_MAX (__UINT_LEAST16_MAX__) +#elif defined(__int_least16_t_defined) +#define INT_LEAST16_MIN (-32768) +#define INT_LEAST16_MAX (32767) +#define UINT_LEAST16_MAX (65535) +#else +#error required type int_least16_t missing +#endif + +#ifdef __INT32_MAX__ +#define INT32_MIN (-__INT32_MAX__ - 1) +#define INT32_MAX (__INT32_MAX__) +#define UINT32_MAX (__UINT32_MAX__) +#elif defined(__int32_t_defined) +#if defined (_INT32_EQ_LONG) +#define INT32_MIN (-2147483647L-1) +#define INT32_MAX (2147483647L) +#define UINT32_MAX (4294967295UL) +#else +#define INT32_MIN (-2147483647-1) +#define INT32_MAX (2147483647) +#define UINT32_MAX (4294967295U) +#endif +#endif + +#ifdef __INT_LEAST32_MAX__ +#define INT_LEAST32_MIN (-__INT_LEAST32_MAX__ - 1) +#define INT_LEAST32_MAX (__INT_LEAST32_MAX__) +#define UINT_LEAST32_MAX (__UINT_LEAST32_MAX__) +#elif defined(__int_least32_t_defined) +#if defined (_INT32_EQ_LONG) +#define INT_LEAST32_MIN (-2147483647L-1) +#define INT_LEAST32_MAX (2147483647L) +#define UINT_LEAST32_MAX (4294967295UL) +#else +#define INT_LEAST32_MIN (-2147483647-1) +#define INT_LEAST32_MAX (2147483647) +#define UINT_LEAST32_MAX (4294967295U) +#endif +#else +#error required type int_least32_t missing +#endif + +#ifdef __INT64_MAX__ +#define INT64_MIN (-__INT64_MAX__ - 1) +#define INT64_MAX (__INT64_MAX__) +#define UINT64_MAX (__UINT64_MAX__) +#elif defined(__int64_t_defined) +#if __have_long64 +#define INT64_MIN (-9223372036854775807L-1L) +#define INT64_MAX (9223372036854775807L) +#define UINT64_MAX (18446744073709551615U) +#elif __have_longlong64 +#define INT64_MIN (-9223372036854775807LL-1LL) +#define INT64_MAX (9223372036854775807LL) +#define UINT64_MAX (18446744073709551615ULL) +#endif +#endif + +#ifdef __INT_LEAST64_MAX__ +#define INT_LEAST64_MIN (-__INT_LEAST64_MAX__ - 1) +#define INT_LEAST64_MAX (__INT_LEAST64_MAX__) +#define UINT_LEAST64_MAX (__UINT_LEAST64_MAX__) +#elif defined(__int_least64_t_defined) +#if __have_long64 +#define INT_LEAST64_MIN (-9223372036854775807L-1L) +#define INT_LEAST64_MAX (9223372036854775807L) +#define UINT_LEAST64_MAX (18446744073709551615U) +#elif __have_longlong64 +#define INT_LEAST64_MIN (-9223372036854775807LL-1LL) +#define INT_LEAST64_MAX (9223372036854775807LL) +#define UINT_LEAST64_MAX (18446744073709551615ULL) +#endif +#endif + +#ifdef __INT_FAST8_MAX__ +#define INT_FAST8_MIN (-__INT_FAST8_MAX__ - 1) +#define INT_FAST8_MAX (__INT_FAST8_MAX__) +#define UINT_FAST8_MAX (__UINT_FAST8_MAX__) +#elif defined(__int_fast8_t_defined) +#if __STDINT_EXP(INT_MAX) >= 0x7f +#define INT_FAST8_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST8_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST8_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST8_MIN INT_LEAST8_MIN +#define INT_FAST8_MAX INT_LEAST8_MAX +#define UINT_FAST8_MAX UINT_LEAST8_MAX +#endif +#endif + +#ifdef __INT_FAST16_MAX__ +#define INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1) +#define INT_FAST16_MAX (__INT_FAST16_MAX__) +#define UINT_FAST16_MAX (__UINT_FAST16_MAX__) +#elif defined(__int_fast16_t_defined) +#if __STDINT_EXP(INT_MAX) >= 0x7fff +#define INT_FAST16_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST16_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST16_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST16_MIN INT_LEAST16_MIN +#define INT_FAST16_MAX INT_LEAST16_MAX +#define UINT_FAST16_MAX UINT_LEAST16_MAX +#endif +#endif + +#ifdef __INT_FAST32_MAX__ +#define INT_FAST32_MIN (-__INT_FAST32_MAX__ - 1) +#define INT_FAST32_MAX (__INT_FAST32_MAX__) +#define UINT_FAST32_MAX (__UINT_FAST32_MAX__) +#elif defined(__int_fast32_t_defined) +#if __STDINT_EXP(INT_MAX) >= 0x7fffffff +#define INT_FAST32_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST32_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST32_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST32_MIN INT_LEAST32_MIN +#define INT_FAST32_MAX INT_LEAST32_MAX +#define UINT_FAST32_MAX UINT_LEAST32_MAX +#endif +#endif + +#ifdef __INT_FAST64_MAX__ +#define INT_FAST64_MIN (-__INT_FAST64_MAX__ - 1) +#define INT_FAST64_MAX (__INT_FAST64_MAX__) +#define UINT_FAST64_MAX (__UINT_FAST64_MAX__) +#elif defined(__int_fast64_t_defined) +#if __STDINT_EXP(INT_MAX) > 0x7fffffff +#define INT_FAST64_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST64_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST64_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST64_MIN INT_LEAST64_MIN +#define INT_FAST64_MAX INT_LEAST64_MAX +#define UINT_FAST64_MAX UINT_LEAST64_MAX +#endif +#endif + +#ifdef __INTMAX_MAX__ +#define INTMAX_MAX (__INTMAX_MAX__) +#define INTMAX_MIN (-INTMAX_MAX - 1) +#elif defined(__INTMAX_TYPE__) +/* All relevant GCC versions prefer long to long long for intmax_t. */ +#define INTMAX_MAX INT64_MAX +#define INTMAX_MIN INT64_MIN +#endif + +#ifdef __UINTMAX_MAX__ +#define UINTMAX_MAX (__UINTMAX_MAX__) +#elif defined(__UINTMAX_TYPE__) +/* All relevant GCC versions prefer long to long long for intmax_t. */ +#define UINTMAX_MAX UINT64_MAX +#endif + +/* This must match size_t in stddef.h, currently long unsigned int */ +#ifdef __SIZE_MAX__ +#define SIZE_MAX (__SIZE_MAX__) +#else +#define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) +#endif + +/* This must match sig_atomic_t in (currently int) */ +#define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1) +#define SIG_ATOMIC_MAX (__STDINT_EXP(INT_MAX)) + +/* This must match ptrdiff_t in (currently long int) */ +#ifdef __PTRDIFF_MAX__ +#define PTRDIFF_MAX (__PTRDIFF_MAX__) +#else +#define PTRDIFF_MAX (__STDINT_EXP(LONG_MAX)) +#endif +#define PTRDIFF_MIN (-PTRDIFF_MAX - 1) + +/* This must match definition in */ +#ifndef WCHAR_MIN +#ifdef __WCHAR_MIN__ +#define WCHAR_MIN (__WCHAR_MIN__) +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MIN (0 + L'\0') +#else +#define WCHAR_MIN (-0x7fffffff - 1 + L'\0') +#endif +#endif + +/* This must match definition in */ +#ifndef WCHAR_MAX +#ifdef __WCHAR_MAX__ +#define WCHAR_MAX (__WCHAR_MAX__) +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MAX (0xffffffffu + L'\0') +#else +#define WCHAR_MAX (0x7fffffff + L'\0') +#endif +#endif + +/* wint_t is unsigned int on almost all GCC targets. */ +#ifdef __WINT_MAX__ +#define WINT_MAX (__WINT_MAX__) +#else +#define WINT_MAX (__STDINT_EXP(INT_MAX) * 2U + 1U) +#endif +#ifdef __WINT_MIN__ +#define WINT_MIN (__WINT_MIN__) +#else +#define WINT_MIN (0U) +#endif + +/** Macros for minimum-width integer constant expressions */ +#ifdef __INT8_C +#define INT8_C(x) __INT8_C(x) +#define UINT8_C(x) __UINT8_C(x) +#else +#define INT8_C(x) x +#if __STDINT_EXP(INT_MAX) > 0x7f +#define UINT8_C(x) x +#else +#define UINT8_C(x) x##U +#endif +#endif + +#ifdef __INT16_C +#define INT16_C(x) __INT16_C(x) +#define UINT16_C(x) __UINT16_C(x) +#else +#define INT16_C(x) x +#if __STDINT_EXP(INT_MAX) > 0x7fff +#define UINT16_C(x) x +#else +#define UINT16_C(x) x##U +#endif +#endif + +#ifdef __INT32_C +#define INT32_C(x) __INT32_C(x) +#define UINT32_C(x) __UINT32_C(x) +#else +#if defined (_INT32_EQ_LONG) +#define INT32_C(x) x##L +#define UINT32_C(x) x##UL +#else +#define INT32_C(x) x +#define UINT32_C(x) x##U +#endif +#endif + +#ifdef __INT64_C +#define INT64_C(x) __INT64_C(x) +#define UINT64_C(x) __UINT64_C(x) +#else +#if __int64_t_defined +#if __have_long64 +#define INT64_C(x) x##L +#define UINT64_C(x) x##UL +#else +#define INT64_C(x) x##LL +#define UINT64_C(x) x##ULL +#endif +#endif +#endif + +/** Macros for greatest-width integer constant expression */ +#ifdef __INTMAX_C +#define INTMAX_C(x) __INTMAX_C(x) +#define UINTMAX_C(x) __UINTMAX_C(x) +#else +#if __have_long64 +#define INTMAX_C(x) x##L +#define UINTMAX_C(x) x##UL +#else +#define INTMAX_C(x) x##LL +#define UINTMAX_C(x) x##ULL +#endif +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _STDINT_H */ diff --git a/include/stdio.h b/include/stdio.h new file mode 100644 index 0000000..7796657 --- /dev/null +++ b/include/stdio.h @@ -0,0 +1,807 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)stdio.h 5.3 (Berkeley) 3/15/86 + */ + +/* + * NB: to fit things in six character monocase externals, the + * stdio code uses the prefix `__s' for stdio objects, typically + * followed by a three-character attempt at a mnemonic. + */ + +#ifndef _STDIO_H_ +#define _STDIO_H_ + +#include "_ansi.h" + +#define _FSTDIO /* ``function stdio'' */ + +#define __need_size_t +#define __need_NULL +#include +#include + +/* typedef only __gnuc_va_list, used throughout the header */ +#define __need___va_list +#include + +/* typedef va_list only when required */ +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE +#ifdef __GNUC__ +#ifndef _VA_LIST_DEFINED +typedef __gnuc_va_list va_list; +#define _VA_LIST_DEFINED +#endif +#else /* !__GNUC__ */ +#include +#endif +#endif /* __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE */ + +/* + * defines __FILE, _fpos_t. + * They must be defined there because struct _reent needs them (and we don't + * want reent.h to include this file. + */ + +#include +#include + +_BEGIN_STD_C + +#if !defined(__FILE_defined) +typedef __FILE FILE; +# define __FILE_defined +#endif + +typedef _fpos_t fpos_t; +#ifdef __LARGE64_FILES +typedef _fpos64_t fpos64_t; +#endif + +#ifndef _OFF_T_DECLARED +typedef __off_t off_t; +#define _OFF_T_DECLARED +#endif + +#ifndef _SSIZE_T_DECLARED +typedef _ssize_t ssize_t; +#define _SSIZE_T_DECLARED +#endif + +#include + +#define __SLBF 0x0001 /* line buffered */ +#define __SNBF 0x0002 /* unbuffered */ +#define __SRD 0x0004 /* OK to read */ +#define __SWR 0x0008 /* OK to write */ + /* RD and WR are never simultaneously asserted */ +#define __SRW 0x0010 /* open for reading & writing */ +#define __SEOF 0x0020 /* found EOF */ +#define __SERR 0x0040 /* found error */ +#define __SMBF 0x0080 /* _buf is from malloc */ +#define __SAPP 0x0100 /* fdopen()ed in append mode - so must write to end */ +#define __SSTR 0x0200 /* this is an sprintf/snprintf string */ +#define __SOPT 0x0400 /* do fseek() optimisation */ +#define __SNPT 0x0800 /* do not do fseek() optimisation */ +#define __SOFF 0x1000 /* set iff _offset is in fact correct */ +#define __SORD 0x2000 /* true => stream orientation (byte/wide) decided */ +#if defined(__CYGWIN__) +# define __SCLE 0x4000 /* convert line endings CR/LF <-> NL */ +#endif +#define __SL64 0x8000 /* is 64-bit offset large file */ + +/* _flags2 flags */ +#define __SNLK 0x0001 /* stdio functions do not lock streams themselves */ +#define __SWID 0x2000 /* true => stream orientation wide, false => byte, only valid if __SORD in _flags is true */ + +/* + * The following three definitions are for ANSI C, which took them + * from System V, which stupidly took internal interface macros and + * made them official arguments to setvbuf(), without renaming them. + * Hence, these ugly _IOxxx names are *supposed* to appear in user code. + * + * Although these happen to match their counterparts above, the + * implementation does not rely on that (so these could be renumbered). + */ +#define _IOFBF 0 /* setvbuf should set fully buffered */ +#define _IOLBF 1 /* setvbuf should set line buffered */ +#define _IONBF 2 /* setvbuf should set unbuffered */ + +#define EOF (-1) + +#ifdef __BUFSIZ__ +#define BUFSIZ __BUFSIZ__ +#else +#define BUFSIZ 1024 +#endif + +#ifdef __FOPEN_MAX__ +#define FOPEN_MAX __FOPEN_MAX__ +#else +#define FOPEN_MAX 20 +#endif + +#ifdef __FILENAME_MAX__ +#define FILENAME_MAX __FILENAME_MAX__ +#else +#define FILENAME_MAX 1024 +#endif + +#ifdef __L_tmpnam__ +#define L_tmpnam __L_tmpnam__ +#else +#define L_tmpnam FILENAME_MAX +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE +#define P_tmpdir "/tmp" +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 /* set file offset to offset */ +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 /* set file offset to current plus offset */ +#endif +#ifndef SEEK_END +#define SEEK_END 2 /* set file offset to EOF plus offset */ +#endif + +#define TMP_MAX 26 + +#define stdin _REENT_STDIN(_REENT) +#define stdout _REENT_STDOUT(_REENT) +#define stderr _REENT_STDERR(_REENT) + +#define _stdin_r(x) _REENT_STDIN(x) +#define _stdout_r(x) _REENT_STDOUT(x) +#define _stderr_r(x) _REENT_STDERR(x) + +/* + * Functions defined in ANSI C standard. + */ + +#ifndef __VALIST +#ifdef __GNUC__ +#define __VALIST __gnuc_va_list +#else +#define __VALIST char* +#endif +#endif + +#if __POSIX_VISIBLE +char * ctermid (char *); +#endif +#if __GNU_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 600) +char * cuserid (char *); +#endif +FILE * tmpfile (void); +char * tmpnam (char *); +#if __BSD_VISIBLE || __XSI_VISIBLE || __POSIX_VISIBLE >= 200112 +char * tempnam (const char *, const char *) __malloc_like __result_use_check; +#endif +int fclose (FILE *); +int fflush (FILE *); +FILE * freopen (const char *__restrict, const char *__restrict, FILE *__restrict); +void setbuf (FILE *__restrict, char *__restrict); +int setvbuf (FILE *__restrict, char *__restrict, int, size_t); +int fprintf (FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int fscanf (FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int printf (const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 1, 2))); +int scanf (const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 1, 2))); +int sscanf (const char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int vfprintf (FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vprintf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 1, 0))); +int vsprintf (char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int fgetc (FILE *); +char * fgets (char *__restrict, int, FILE *__restrict); +int fputc (int, FILE *); +int fputs (const char *__restrict, FILE *__restrict); +int getc (FILE *); +int getchar (void); +char * gets (char *); +int putc (int, FILE *); +int putchar (int); +int puts (const char *); +int ungetc (int, FILE *); +size_t fread (void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t fwrite (const void *__restrict , size_t _size, size_t _n, FILE *); +#ifdef _LIBC +int fgetpos (FILE *, _fpos_t *); +#else +int fgetpos (FILE *__restrict, fpos_t *__restrict); +#endif +int fseek (FILE *, long, int); +#ifdef _LIBC +int fsetpos (FILE *, const _fpos_t *); +#else +int fsetpos (FILE *, const fpos_t *); +#endif +long ftell ( FILE *); +void rewind (FILE *); +void clearerr (FILE *); +int feof (FILE *); +int ferror (FILE *); +void perror (const char *); +#ifndef _REENT_ONLY +FILE * fopen (const char *__restrict _name, const char *__restrict _type); +int sprintf (char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int remove (const char *); +int rename (const char *, const char *); +#ifdef _LIBC +int _rename (const char *, const char *); +#endif +#endif +#if __LARGEFILE_VISIBLE || __POSIX_VISIBLE >= 200112 +#ifdef _LIBC +int fseeko (FILE *, _off_t, int); +_off_t ftello (FILE *); +#else +int fseeko (FILE *, off_t, int); +off_t ftello (FILE *); +#endif +#endif +#if __GNU_VISIBLE +int fcloseall (void); +#endif +#ifndef _REENT_ONLY +#if __ISO_C_VISIBLE >= 1999 +int snprintf (char *__restrict, size_t, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int vsnprintf (char *__restrict, size_t, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int vfscanf (FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int vscanf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 1, 0))); +int vsscanf (const char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +#endif +#if __GNU_VISIBLE +int asprintf (char **__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int vasprintf (char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +#endif +#if __MISC_VISIBLE /* Newlib-specific */ +int asiprintf (char **, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +char * asniprintf (char *, size_t *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +char * asnprintf (char *__restrict, size_t *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +#ifndef diprintf +int diprintf (int, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +#endif +int fiprintf (FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int fiscanf (FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int iprintf (const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 1, 2))); +int iscanf (const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 1, 2))); +int siprintf (char *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int siscanf (const char *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int sniprintf (char *, size_t, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int vasiprintf (char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +char * vasniprintf (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +char * vasnprintf (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int vdiprintf (int, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vfiprintf (FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vfiscanf (FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int viprintf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 1, 0))); +int viscanf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 1, 0))); +int vsiprintf (char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vsiscanf (const char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int vsniprintf (char *, size_t, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +#endif /* __MISC_VISIBLE */ +#endif /* !_REENT_ONLY */ + +/* + * Routines in POSIX 1003.1:2001. + */ + +#if __POSIX_VISIBLE +#ifndef _REENT_ONLY +FILE * fdopen (int, const char *); +#endif +int fileno (FILE *); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 199209 +int pclose (FILE *); +FILE * popen (const char *, const char *); +#endif + +#if __BSD_VISIBLE +void setbuffer (FILE *, char *, int); +int setlinebuf (FILE *); +#endif + +#if __MISC_VISIBLE || (__XSI_VISIBLE && __POSIX_VISIBLE < 200112) +int getw (FILE *); +int putw (int, FILE *); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE +int getc_unlocked (FILE *); +int getchar_unlocked (void); +void flockfile (FILE *); +int ftrylockfile (FILE *); +void funlockfile (FILE *); +int putc_unlocked (int, FILE *); +int putchar_unlocked (int); +#endif + +/* + * Routines in POSIX 1003.1:200x. + */ + +#if __POSIX_VISIBLE >= 200809 +# ifndef _REENT_ONLY +# ifndef dprintf +int dprintf (int, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +# endif +FILE * fmemopen (void *__restrict, size_t, const char *__restrict); +/* getdelim - see __getdelim for now */ +/* getline - see __getline for now */ +FILE * open_memstream (char **, size_t *); +int vdprintf (int, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +# endif +#endif +#if __ATFILE_VISIBLE +int renameat (int, const char *, int, const char *); +# ifdef __CYGWIN__ +int renameat2 (int, const char *, int, const char *, unsigned int); +# endif +#endif + +/* + * Recursive versions of the above. + */ + +int _asiprintf_r (struct _reent *, char **, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +char * _asniprintf_r (struct _reent *, char *, size_t *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +char * _asnprintf_r (struct _reent *, char *__restrict, size_t *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +int _asprintf_r (struct _reent *, char **__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _diprintf_r (struct _reent *, int, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _dprintf_r (struct _reent *, int, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _fclose_r (struct _reent *, FILE *); +int _fcloseall_r (struct _reent *); +FILE * _fdopen_r (struct _reent *, int, const char *); +int _fflush_r (struct _reent *, FILE *); +int _fgetc_r (struct _reent *, FILE *); +int _fgetc_unlocked_r (struct _reent *, FILE *); +char * _fgets_r (struct _reent *, char *__restrict, int, FILE *__restrict); +char * _fgets_unlocked_r (struct _reent *, char *__restrict, int, FILE *__restrict); +#ifdef _LIBC +int _fgetpos_r (struct _reent *, FILE *__restrict, _fpos_t *__restrict); +int _fsetpos_r (struct _reent *, FILE *, const _fpos_t *); +#else +int _fgetpos_r (struct _reent *, FILE *, fpos_t *); +int _fsetpos_r (struct _reent *, FILE *, const fpos_t *); +#endif +int _fiprintf_r (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _fiscanf_r (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +FILE * _fmemopen_r (struct _reent *, void *__restrict, size_t, const char *__restrict); +FILE * _fopen_r (struct _reent *, const char *__restrict, const char *__restrict); +FILE * _freopen_r (struct _reent *, const char *__restrict, const char *__restrict, FILE *__restrict); +int _fprintf_r (struct _reent *, FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _fpurge_r (struct _reent *, FILE *); +int _fputc_r (struct _reent *, int, FILE *); +int _fputc_unlocked_r (struct _reent *, int, FILE *); +int _fputs_r (struct _reent *, const char *__restrict, FILE *__restrict); +int _fputs_unlocked_r (struct _reent *, const char *__restrict, FILE *__restrict); +size_t _fread_r (struct _reent *, void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t _fread_unlocked_r (struct _reent *, void *__restrict, size_t _size, size_t _n, FILE *__restrict); +int _fscanf_r (struct _reent *, FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +int _fseek_r (struct _reent *, FILE *, long, int); +int _fseeko_r (struct _reent *, FILE *, _off_t, int); +long _ftell_r (struct _reent *, FILE *); +_off_t _ftello_r (struct _reent *, FILE *); +void _rewind_r (struct _reent *, FILE *); +size_t _fwrite_r (struct _reent *, const void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t _fwrite_unlocked_r (struct _reent *, const void *__restrict, size_t _size, size_t _n, FILE *__restrict); +int _getc_r (struct _reent *, FILE *); +int _getc_unlocked_r (struct _reent *, FILE *); +int _getchar_r (struct _reent *); +int _getchar_unlocked_r (struct _reent *); +char * _gets_r (struct _reent *, char *); +int _iprintf_r (struct _reent *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int _iscanf_r (struct _reent *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +FILE * _open_memstream_r (struct _reent *, char **, size_t *); +void _perror_r (struct _reent *, const char *); +int _printf_r (struct _reent *, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int _putc_r (struct _reent *, int, FILE *); +int _putc_unlocked_r (struct _reent *, int, FILE *); +int _putchar_unlocked_r (struct _reent *, int); +int _putchar_r (struct _reent *, int); +int _puts_r (struct _reent *, const char *); +int _remove_r (struct _reent *, const char *); +int _rename_r (struct _reent *, + const char *_old, const char *_new); +int _scanf_r (struct _reent *, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int _siprintf_r (struct _reent *, char *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _siscanf_r (struct _reent *, const char *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +int _sniprintf_r (struct _reent *, char *, size_t, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +int _snprintf_r (struct _reent *, char *__restrict, size_t, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +int _sprintf_r (struct _reent *, char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _sscanf_r (struct _reent *, const char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +char * _tempnam_r (struct _reent *, const char *, const char *); +FILE * _tmpfile_r (struct _reent *); +char * _tmpnam_r (struct _reent *, char *); +int _ungetc_r (struct _reent *, int, FILE *); +int _vasiprintf_r (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +char * _vasniprintf_r (struct _reent*, char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +char * _vasnprintf_r (struct _reent*, char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +int _vasprintf_r (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vdiprintf_r (struct _reent *, int, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vdprintf_r (struct _reent *, int, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vfiprintf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vfiscanf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); +int _vfprintf_r (struct _reent *, FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vfscanf_r (struct _reent *, FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); +int _viprintf_r (struct _reent *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int _viscanf_r (struct _reent *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int _vprintf_r (struct _reent *, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int _vscanf_r (struct _reent *, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int _vsiprintf_r (struct _reent *, char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vsiscanf_r (struct _reent *, const char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); +int _vsniprintf_r (struct _reent *, char *, size_t, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +int _vsnprintf_r (struct _reent *, char *__restrict, size_t, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +int _vsprintf_r (struct _reent *, char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vsscanf_r (struct _reent *, const char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); + +/* Other extensions. */ + +int fpurge (FILE *); +ssize_t __getdelim (char **, size_t *, int, FILE *); +ssize_t __getline (char **, size_t *, FILE *); + +#if __MISC_VISIBLE +void clearerr_unlocked (FILE *); +int feof_unlocked (FILE *); +int ferror_unlocked (FILE *); +int fileno_unlocked (FILE *); +int fflush_unlocked (FILE *); +int fgetc_unlocked (FILE *); +int fputc_unlocked (int, FILE *); +size_t fread_unlocked (void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t fwrite_unlocked (const void *__restrict , size_t _size, size_t _n, FILE *); +#endif + +#if __GNU_VISIBLE +char * fgets_unlocked (char *__restrict, int, FILE *__restrict); +int fputs_unlocked (const char *__restrict, FILE *__restrict); +#endif + +#ifdef __LARGE64_FILES +#if !defined(__CYGWIN__) || defined(_LIBC) +FILE * fdopen64 (int, const char *); +FILE * fopen64 (const char *, const char *); +FILE * freopen64 (const char *, const char *, FILE *); +_off64_t ftello64 (FILE *); +_off64_t fseeko64 (FILE *, _off64_t, int); +int fgetpos64 (FILE *, _fpos64_t *); +int fsetpos64 (FILE *, const _fpos64_t *); +FILE * tmpfile64 (void); + +FILE * _fdopen64_r (struct _reent *, int, const char *); +FILE * _fopen64_r (struct _reent *,const char *, const char *); +FILE * _freopen64_r (struct _reent *, const char *, const char *, FILE *); +_off64_t _ftello64_r (struct _reent *, FILE *); +_off64_t _fseeko64_r (struct _reent *, FILE *, _off64_t, int); +int _fgetpos64_r (struct _reent *, FILE *, _fpos64_t *); +int _fsetpos64_r (struct _reent *, FILE *, const _fpos64_t *); +FILE * _tmpfile64_r (struct _reent *); +#endif /* !__CYGWIN__ */ +#endif /* __LARGE64_FILES */ + +/* + * Routines internal to the implementation. + */ + +int __srget_r (struct _reent *, FILE *); +int __swbuf_r (struct _reent *, int, FILE *); + +/* + * Stdio function-access interface. + */ + +#if __BSD_VISIBLE +# ifdef __LARGE64_FILES +FILE *funopen (const void *__cookie, + int (*__readfn)(void *__c, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__c, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + _fpos64_t (*__seekfn)(void *__c, _fpos64_t __off, int __whence), + int (*__closefn)(void *__c)); +FILE *_funopen_r (struct _reent *, const void *__cookie, + int (*__readfn)(void *__c, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__c, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + _fpos64_t (*__seekfn)(void *__c, _fpos64_t __off, int __whence), + int (*__closefn)(void *__c)); +# else +FILE *funopen (const void *__cookie, + int (*__readfn)(void *__cookie, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__cookie, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + fpos_t (*__seekfn)(void *__cookie, fpos_t __off, int __whence), + int (*__closefn)(void *__cookie)); +FILE *_funopen_r (struct _reent *, const void *__cookie, + int (*__readfn)(void *__cookie, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__cookie, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + fpos_t (*__seekfn)(void *__cookie, fpos_t __off, int __whence), + int (*__closefn)(void *__cookie)); +# endif /* !__LARGE64_FILES */ + +# define fropen(__cookie, __fn) funopen(__cookie, __fn, NULL, NULL, NULL) +# define fwopen(__cookie, __fn) funopen(__cookie, NULL, __fn, NULL, NULL) +#endif /* __BSD_VISIBLE */ + +#if __GNU_VISIBLE +typedef ssize_t cookie_read_function_t(void *__cookie, char *__buf, size_t __n); +typedef ssize_t cookie_write_function_t(void *__cookie, const char *__buf, + size_t __n); +# ifdef __LARGE64_FILES +typedef int cookie_seek_function_t(void *__cookie, _off64_t *__off, + int __whence); +# else +typedef int cookie_seek_function_t(void *__cookie, off_t *__off, int __whence); +# endif /* !__LARGE64_FILES */ +typedef int cookie_close_function_t(void *__cookie); +typedef struct +{ + /* These four struct member names are dictated by Linux; hopefully, + they don't conflict with any macros. */ + cookie_read_function_t *read; + cookie_write_function_t *write; + cookie_seek_function_t *seek; + cookie_close_function_t *close; +} cookie_io_functions_t; +FILE *fopencookie (void *__cookie, + const char *__mode, cookie_io_functions_t __functions); +FILE *_fopencookie_r (struct _reent *, void *__cookie, + const char *__mode, cookie_io_functions_t __functions); +#endif /* __GNU_VISIBLE */ + +#ifndef __CUSTOM_FILE_IO__ +/* + * The __sfoo macros are here so that we can + * define function versions in the C library. + */ +#define __sgetc_raw_r(__ptr, __f) (--(__f)->_r < 0 ? __srget_r(__ptr, __f) : (int)(*(__f)->_p++)) + +#ifdef __SCLE +/* For a platform with CR/LF, additional logic is required by + __sgetc_r which would otherwise simply be a macro; therefore we + use an inlined function. The function is only meant to be inlined + in place as used and the function body should never be emitted. + + There are two possible means to this end when compiling with GCC, + one when compiling with a standard C99 compiler, and for other + compilers we're just stuck. At the moment, this issue only + affects the Cygwin target, so we'll most likely be using GCC. */ + +_ELIDABLE_INLINE int __sgetc_r(struct _reent *__ptr, FILE *__p); + +_ELIDABLE_INLINE int __sgetc_r(struct _reent *__ptr, FILE *__p) + { + int __c = __sgetc_raw_r(__ptr, __p); + if ((__p->_flags & __SCLE) && (__c == '\r')) + { + int __c2 = __sgetc_raw_r(__ptr, __p); + if (__c2 == '\n') + __c = __c2; + else + ungetc(__c2, __p); + } + return __c; + } +#else +#define __sgetc_r(__ptr, __p) __sgetc_raw_r(__ptr, __p) +#endif + +#ifdef __GNUC__ +_ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) { +#ifdef __SCLE + if ((_p->_flags & __SCLE) && _c == '\n') + __sputc_r (_ptr, '\r', _p); +#endif + if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) + return (*_p->_p++ = _c); + else + return (__swbuf_r(_ptr, _c, _p)); +} +#else +/* + * This has been tuned to generate reasonable code on the vax using pcc + */ +#define __sputc_raw_r(__ptr, __c, __p) \ + (--(__p)->_w < 0 ? \ + (__p)->_w >= (__p)->_lbfsize ? \ + (*(__p)->_p = (__c)), *(__p)->_p != '\n' ? \ + (int)*(__p)->_p++ : \ + __swbuf_r(__ptr, '\n', __p) : \ + __swbuf_r(__ptr, (int)(__c), __p) : \ + (*(__p)->_p = (__c), (int)*(__p)->_p++)) +#ifdef __SCLE +#define __sputc_r(__ptr, __c, __p) \ + ((((__p)->_flags & __SCLE) && ((__c) == '\n')) \ + ? __sputc_raw_r(__ptr, '\r', (__p)) : 0 , \ + __sputc_raw_r((__ptr), (__c), (__p))) +#else +#define __sputc_r(__ptr, __c, __p) __sputc_raw_r(__ptr, __c, __p) +#endif +#endif + +#define __sfeof(p) ((int)(((p)->_flags & __SEOF) != 0)) +#define __sferror(p) ((int)(((p)->_flags & __SERR) != 0)) +#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) +#define __sfileno(p) ((p)->_file) + +#ifndef __cplusplus +#ifndef _REENT_SMALL +#define feof(p) __sfeof(p) +#define ferror(p) __sferror(p) +#define clearerr(p) __sclearerr(p) + +#if __MISC_VISIBLE +#define feof_unlocked(p) __sfeof(p) +#define ferror_unlocked(p) __sferror(p) +#define clearerr_unlocked(p) __sclearerr(p) +#endif /* __MISC_VISIBLE */ +#endif /* _REENT_SMALL */ + +#if 0 /* __POSIX_VISIBLE - FIXME: must initialize stdio first, use fn */ +#define fileno(p) __sfileno(p) +#endif + +static __inline int +_getchar_unlocked(void) +{ + struct _reent *_ptr; + + _ptr = _REENT; + return (__sgetc_r(_ptr, _stdin_r(_ptr))); +} + +static __inline int +_putchar_unlocked(int _c) +{ + struct _reent *_ptr; + + _ptr = _REENT; + return (__sputc_r(_ptr, _c, _stdout_r(_ptr))); +} + +#ifdef __SINGLE_THREAD__ +#define getc(_p) __sgetc_r(_REENT, _p) +#define putc(_c, _p) __sputc_r(_REENT, _c, _p) +#define getchar() _getchar_unlocked() +#define putchar(_c) _putchar_unlocked(_c) +#endif /* __SINGLE_THREAD__ */ + +#if __MISC_VISIBLE || __POSIX_VISIBLE +#define getchar_unlocked() _getchar_unlocked() +#define putchar_unlocked(_c) _putchar_unlocked(_c) +#endif +#endif /* __cplusplus */ + +#if __MISC_VISIBLE +/* fast always-buffered version, true iff error */ +#define fast_putc(x,p) (--(p)->_w < 0 ? \ + __swbuf_r(_REENT, (int)(x), p) == EOF : (*(p)->_p = (x), (p)->_p++, 0)) +#endif + +#if __GNU_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 600) +#define L_cuserid 9 /* posix says it goes in stdio.h :( */ +#endif +#if __POSIX_VISIBLE +#define L_ctermid 16 +#endif + +#else /* __CUSTOM_FILE_IO__ */ + +#define getchar() getc(stdin) +#define putchar(x) putc(x, stdout) + +#if __MISC_VISIBLE || __POSIX_VISIBLE +#define getchar_unlocked() getc_unlocked(stdin) +#define putchar_unlocked(x) putc_unlocked(x, stdout) +#endif + +#endif /* !__CUSTOM_FILE_IO__ */ + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STDIO_H_ */ diff --git a/include/stdio_ext.h b/include/stdio_ext.h new file mode 100644 index 0000000..231262d --- /dev/null +++ b/include/stdio_ext.h @@ -0,0 +1,79 @@ +/* + * stdio_ext.h + * + * Definitions for I/O internal operations, originally from Solaris. + */ + +#ifndef _STDIO_EXT_H_ +#define _STDIO_EXT_H_ + +#ifdef __rtems__ +#error " not supported" +#endif + +#include + +#define FSETLOCKING_QUERY 0 +#define FSETLOCKING_INTERNAL 1 +#define FSETLOCKING_BYCALLER 2 + +_BEGIN_STD_C + +void __fpurge (FILE *); +int __fsetlocking (FILE *, int); + +/* TODO: + + void _flushlbf (void); +*/ + +#ifdef __GNUC__ + +_ELIDABLE_INLINE size_t +__fbufsize (FILE *__fp) { return (size_t) __fp->_bf._size; } + +_ELIDABLE_INLINE int +__freading (FILE *__fp) { return (__fp->_flags & __SRD) != 0; } + +_ELIDABLE_INLINE int +__fwriting (FILE *__fp) { return (__fp->_flags & __SWR) != 0; } + +_ELIDABLE_INLINE int +__freadable (FILE *__fp) { return (__fp->_flags & (__SRD | __SRW)) != 0; } + +_ELIDABLE_INLINE int +__fwritable (FILE *__fp) { return (__fp->_flags & (__SWR | __SRW)) != 0; } + +_ELIDABLE_INLINE int +__flbf (FILE *__fp) { return (__fp->_flags & __SLBF) != 0; } + +_ELIDABLE_INLINE size_t +__fpending (FILE *__fp) { return __fp->_p - __fp->_bf._base; } + +#else + +size_t __fbufsize (FILE *); +int __freading (FILE *); +int __fwriting (FILE *); +int __freadable (FILE *); +int __fwritable (FILE *); +int __flbf (FILE *); +size_t __fpending (FILE *); + +#ifndef __cplusplus + +#define __fbufsize(__fp) ((size_t) (__fp)->_bf._size) +#define __freading(__fp) (((__fp)->_flags & __SRD) != 0) +#define __fwriting(__fp) (((__fp)->_flags & __SWR) != 0) +#define __freadable(__fp) (((__fp)->_flags & (__SRD | __SRW)) != 0) +#define __fwritable(__fp) (((__fp)->_flags & (__SWR | __SRW)) != 0) +#define __flbf(__fp) (((__fp)->_flags & __SLBF) != 0) +#define __fpending(__fp) ((size_t) ((__fp)->_p - (__fp)->_bf._base)) + +#endif /* __cplusplus */ + +#endif /* __GNUC__ */ + +_END_STD_C + +#endif /* _STDIO_EXT_H_ */ diff --git a/include/stdlib.h b/include/stdlib.h new file mode 100644 index 0000000..15b3494 --- /dev/null +++ b/include/stdlib.h @@ -0,0 +1,345 @@ +/* + * stdlib.h + * + * Definitions for common types, variables, and functions. + */ + +#ifndef _STDLIB_H_ +#define _STDLIB_H_ + +#include +#include "_ansi.h" + +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#include + +#include +#include +#include +#ifndef __STRICT_ANSI__ +#include +#endif + +#ifdef __CYGWIN__ +#include +#endif + +#if __GNU_VISIBLE +#include +#endif + +_BEGIN_STD_C + +typedef struct +{ + int quot; /* quotient */ + int rem; /* remainder */ +} div_t; + +typedef struct +{ + long quot; /* quotient */ + long rem; /* remainder */ +} ldiv_t; + +#if __ISO_C_VISIBLE >= 1999 +typedef struct +{ + long long int quot; /* quotient */ + long long int rem; /* remainder */ +} lldiv_t; +#endif + +#ifndef __compar_fn_t_defined +#define __compar_fn_t_defined +typedef int (*__compar_fn_t) (const void *, const void *); +#endif + +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 + +#define RAND_MAX __RAND_MAX + +int __locale_mb_cur_max (void); + +#define MB_CUR_MAX __locale_mb_cur_max() + +void abort (void) _ATTRIBUTE ((__noreturn__)); +int abs (int); +#if __BSD_VISIBLE +__uint32_t arc4random (void); +__uint32_t arc4random_uniform (__uint32_t); +void arc4random_buf (void *, size_t); +#endif +int atexit (void (*__func)(void)); +double atof (const char *__nptr); +#if __MISC_VISIBLE +float atoff (const char *__nptr); +#endif +int atoi (const char *__nptr); +int _atoi_r (struct _reent *, const char *__nptr); +long atol (const char *__nptr); +long _atol_r (struct _reent *, const char *__nptr); +void * bsearch (const void *__key, + const void *__base, + size_t __nmemb, + size_t __size, + __compar_fn_t _compar); +void *calloc(size_t, size_t) __malloc_like __result_use_check + __alloc_size2(1, 2) _NOTHROW; +div_t div (int __numer, int __denom); +void exit (int __status) _ATTRIBUTE ((__noreturn__)); +void free (void *) _NOTHROW; +char * getenv (const char *__string); +char * _getenv_r (struct _reent *, const char *__string); +#if __GNU_VISIBLE +char * secure_getenv (const char *__string); +#endif +char * _findenv (const char *, int *); +char * _findenv_r (struct _reent *, const char *, int *); +#if __POSIX_VISIBLE >= 200809 +extern char *suboptarg; /* getsubopt(3) external variable */ +int getsubopt (char **, char * const *, char **); +#endif +long labs (long); +ldiv_t ldiv (long __numer, long __denom); +void *malloc(size_t) __malloc_like __result_use_check __alloc_size(1) _NOTHROW; +int mblen (const char *, size_t); +int _mblen_r (struct _reent *, const char *, size_t, _mbstate_t *); +int mbtowc (wchar_t *__restrict, const char *__restrict, size_t); +int _mbtowc_r (struct _reent *, wchar_t *__restrict, const char *__restrict, size_t, _mbstate_t *); +int wctomb (char *, wchar_t); +int _wctomb_r (struct _reent *, char *, wchar_t, _mbstate_t *); +size_t mbstowcs (wchar_t *__restrict, const char *__restrict, size_t); +size_t _mbstowcs_r (struct _reent *, wchar_t *__restrict, const char *__restrict, size_t, _mbstate_t *); +size_t wcstombs (char *__restrict, const wchar_t *__restrict, size_t); +size_t _wcstombs_r (struct _reent *, char *__restrict, const wchar_t *__restrict, size_t, _mbstate_t *); +#ifndef _REENT_ONLY +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200809 +char * mkdtemp (char *); +#endif +#if __GNU_VISIBLE +int mkostemp (char *, int); +int mkostemps (char *, int, int); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 4 +int mkstemp (char *); +#endif +#if __MISC_VISIBLE +int mkstemps (char *, int); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112) +char * mktemp (char *) _ATTRIBUTE ((__deprecated__("the use of `mktemp' is dangerous; use `mkstemp' instead"))); +#endif +#endif /* !_REENT_ONLY */ +char * _mkdtemp_r (struct _reent *, char *); +int _mkostemp_r (struct _reent *, char *, int); +int _mkostemps_r (struct _reent *, char *, int, int); +int _mkstemp_r (struct _reent *, char *); +int _mkstemps_r (struct _reent *, char *, int); +char * _mktemp_r (struct _reent *, char *) _ATTRIBUTE ((__deprecated__("the use of `mktemp' is dangerous; use `mkstemp' instead"))); +void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t _compar); +int rand (void); +void *realloc(void *, size_t) __result_use_check __alloc_size(2) _NOTHROW; +#if __BSD_VISIBLE +void *reallocarray(void *, size_t, size_t) __result_use_check __alloc_size2(2, 3); +void *reallocf(void *, size_t) __result_use_check __alloc_size(2); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +char * realpath (const char *__restrict path, char *__restrict resolved_path); +#endif +#if __BSD_VISIBLE +int rpmatch (const char *response); +#endif +#if __XSI_VISIBLE +void setkey (const char *__key); +#endif +void srand (unsigned __seed); +double strtod (const char *__restrict __n, char **__restrict __end_PTR); +double _strtod_r (struct _reent *,const char *__restrict __n, char **__restrict __end_PTR); +#if __ISO_C_VISIBLE >= 1999 +float strtof (const char *__restrict __n, char **__restrict __end_PTR); +#endif +#if __MISC_VISIBLE +/* the following strtodf interface is deprecated...use strtof instead */ +# ifndef strtodf +# define strtodf strtof +# endif +#endif +long strtol (const char *__restrict __n, char **__restrict __end_PTR, int __base); +long _strtol_r (struct _reent *,const char *__restrict __n, char **__restrict __end_PTR, int __base); +unsigned long strtoul (const char *__restrict __n, char **__restrict __end_PTR, int __base); +unsigned long _strtoul_r (struct _reent *,const char *__restrict __n, char **__restrict __end_PTR, int __base); + +#if __GNU_VISIBLE +double strtod_l (const char *__restrict, char **__restrict, locale_t); +float strtof_l (const char *__restrict, char **__restrict, locale_t); +#ifdef _HAVE_LONG_DOUBLE +extern long double strtold_l (const char *__restrict, char **__restrict, + locale_t); +#endif /* _HAVE_LONG_DOUBLE */ +long strtol_l (const char *__restrict, char **__restrict, int, locale_t); +unsigned long strtoul_l (const char *__restrict, char **__restrict, int, + locale_t __loc); +long long strtoll_l (const char *__restrict, char **__restrict, int, locale_t); +unsigned long long strtoull_l (const char *__restrict, char **__restrict, int, + locale_t __loc); +#endif + +int system (const char *__string); + +#if __SVID_VISIBLE || __XSI_VISIBLE >= 4 +long a64l (const char *__input); +char * l64a (long __input); +char * _l64a_r (struct _reent *,long __input); +#endif +#if __MISC_VISIBLE +int on_exit (void (*__func)(int, void *),void *__arg); +#endif +#if __ISO_C_VISIBLE >= 1999 +void _Exit (int __status) _ATTRIBUTE ((__noreturn__)); +#endif +#if __SVID_VISIBLE || __XSI_VISIBLE +int putenv (char *__string); +#endif +int _putenv_r (struct _reent *, char *__string); +void * _reallocf_r (struct _reent *, void *, size_t); +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +int setenv (const char *__string, const char *__value, int __overwrite); +#endif +int _setenv_r (struct _reent *, const char *__string, const char *__value, int __overwrite); + +#if __XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112 +char * gcvt (double,int,char *); +char * gcvtf (float,int,char *); +char * fcvt (double,int,int *,int *); +char * fcvtf (float,int,int *,int *); +char * ecvt (double,int,int *,int *); +char * ecvtbuf (double, int, int*, int*, char *); +char * fcvtbuf (double, int, int*, int*, char *); +char * ecvtf (float,int,int *,int *); +#endif +char * __itoa (int, char *, int); +char * __utoa (unsigned, char *, int); +#if __MISC_VISIBLE +char * itoa (int, char *, int); +char * utoa (unsigned, char *, int); +#endif +#if __POSIX_VISIBLE +int rand_r (unsigned *__seed); +#endif + +#if __SVID_VISIBLE || __XSI_VISIBLE +double drand48 (void); +double _drand48_r (struct _reent *); +double erand48 (unsigned short [3]); +double _erand48_r (struct _reent *, unsigned short [3]); +long jrand48 (unsigned short [3]); +long _jrand48_r (struct _reent *, unsigned short [3]); +void lcong48 (unsigned short [7]); +void _lcong48_r (struct _reent *, unsigned short [7]); +long lrand48 (void); +long _lrand48_r (struct _reent *); +long mrand48 (void); +long _mrand48_r (struct _reent *); +long nrand48 (unsigned short [3]); +long _nrand48_r (struct _reent *, unsigned short [3]); +unsigned short * + seed48 (unsigned short [3]); +unsigned short * + _seed48_r (struct _reent *, unsigned short [3]); +void srand48 (long); +void _srand48_r (struct _reent *, long); +#endif /* __SVID_VISIBLE || __XSI_VISIBLE */ +#if __SVID_VISIBLE || __XSI_VISIBLE >= 4 || __BSD_VISIBLE +char * initstate (unsigned, char *, size_t); +long random (void); +char * setstate (char *); +void srandom (unsigned); +#endif +#if __ISO_C_VISIBLE >= 1999 +long long atoll (const char *__nptr); +#endif +long long _atoll_r (struct _reent *, const char *__nptr); +#if __ISO_C_VISIBLE >= 1999 +long long llabs (long long); +lldiv_t lldiv (long long __numer, long long __denom); +long long strtoll (const char *__restrict __n, char **__restrict __end_PTR, int __base); +#endif +long long _strtoll_r (struct _reent *, const char *__restrict __n, char **__restrict __end_PTR, int __base); +#if __ISO_C_VISIBLE >= 1999 +unsigned long long strtoull (const char *__restrict __n, char **__restrict __end_PTR, int __base); +#endif +unsigned long long _strtoull_r (struct _reent *, const char *__restrict __n, char **__restrict __end_PTR, int __base); + +#ifndef __CYGWIN__ +#if __MISC_VISIBLE +void cfree (void *); +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +int unsetenv (const char *__string); +#endif +int _unsetenv_r (struct _reent *, const char *__string); +#endif /* !__CYGWIN__ */ + +#if __POSIX_VISIBLE >= 200112 +int posix_memalign (void **, size_t, size_t) __nonnull((1)) + __result_use_check; +#endif + +char * _dtoa_r (struct _reent *, double, int, int, int *, int*, char**); +#ifndef __CYGWIN__ +void * _malloc_r (struct _reent *, size_t) _NOTHROW; +void * _calloc_r (struct _reent *, size_t, size_t) _NOTHROW; +void _free_r (struct _reent *, void *) _NOTHROW; +void * _realloc_r (struct _reent *, void *, size_t) _NOTHROW; +void _mstats_r (struct _reent *, char *); +#endif +int _system_r (struct _reent *, const char *); + +void __eprintf (const char *, const char *, unsigned int, const char *); + +/* There are two common qsort_r variants. If you request + _BSD_SOURCE, you get the BSD version; otherwise you get the GNU + version. We want that #undef qsort_r will still let you + invoke the underlying function, but that requires gcc support. */ +#if __GNU_VISIBLE +void qsort_r (void *__base, size_t __nmemb, size_t __size, int (*_compar)(const void *, const void *, void *), void *__thunk); +#elif __BSD_VISIBLE +# ifdef __GNUC__ +void qsort_r (void *__base, size_t __nmemb, size_t __size, void *__thunk, int (*_compar)(void *, const void *, const void *)) + __asm__ (__ASMNAME ("__bsd_qsort_r")); +# else +void __bsd_qsort_r (void *__base, size_t __nmemb, size_t __size, void *__thunk, int (*_compar)(void *, const void *, const void *)); +# define qsort_r __bsd_qsort_r +# endif +#endif + +/* On platforms where long double equals double. */ +#ifdef _HAVE_LONG_DOUBLE +extern long double _strtold_r (struct _reent *, const char *__restrict, char **__restrict); +#if __ISO_C_VISIBLE >= 1999 +extern long double strtold (const char *__restrict, char **__restrict); +#endif +#endif /* _HAVE_LONG_DOUBLE */ + +/* + * If we're in a mode greater than C99, expose C11 functions. + */ +#if __ISO_C_VISIBLE >= 2011 +void * aligned_alloc(size_t, size_t) __malloc_like __alloc_align(1) + __alloc_size(2) __result_use_check; +int at_quick_exit(void (*)(void)); +_Noreturn void + quick_exit(int); +#endif /* __ISO_C_VISIBLE >= 2011 */ + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STDLIB_H_ */ diff --git a/include/string.h b/include/string.h new file mode 100644 index 0000000..32199c0 --- /dev/null +++ b/include/string.h @@ -0,0 +1,183 @@ +/* + * string.h + * + * Definitions for memory and string functions. + */ + +#ifndef _STRING_H_ +#define _STRING_H_ + +#include "_ansi.h" +#include +#include +#include + +#define __need_size_t +#define __need_NULL +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#if __BSD_VISIBLE +#include +#endif + +_BEGIN_STD_C + +void * memchr (const void *, int, size_t); +int memcmp (const void *, const void *, size_t); +void * memcpy (void *__restrict, const void *__restrict, size_t); +void * memmove (void *, const void *, size_t); +void * memset (void *, int, size_t); +char *strcat (char *__restrict, const char *__restrict); +char *strchr (const char *, int); +int strcmp (const char *, const char *); +int strcoll (const char *, const char *); +char *strcpy (char *__restrict, const char *__restrict); +size_t strcspn (const char *, const char *); +char *strerror (int); +size_t strlen (const char *); +char *strncat (char *__restrict, const char *__restrict, size_t); +int strncmp (const char *, const char *, size_t); +char *strncpy (char *__restrict, const char *__restrict, size_t); +char *strpbrk (const char *, const char *); +char *strrchr (const char *, int); +size_t strspn (const char *, const char *); +char *strstr (const char *, const char *); +#ifndef _REENT_ONLY +char *strtok (char *__restrict, const char *__restrict); +#endif +size_t strxfrm (char *__restrict, const char *__restrict, size_t); + +#if __POSIX_VISIBLE >= 200809 +int strcoll_l (const char *, const char *, locale_t); +char *strerror_l (int, locale_t); +size_t strxfrm_l (char *__restrict, const char *__restrict, size_t, locale_t); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE +char *strtok_r (char *__restrict, const char *__restrict, char **__restrict); +#endif +#if __BSD_VISIBLE +int timingsafe_bcmp (const void *, const void *, size_t); +int timingsafe_memcmp (const void *, const void *, size_t); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE +void * memccpy (void *__restrict, const void *__restrict, int, size_t); +#endif +#if __GNU_VISIBLE +void * mempcpy (void *, const void *, size_t); +void * memmem (const void *, size_t, const void *, size_t); +void * memrchr (const void *, int, size_t); +void * rawmemchr (const void *, int); +#endif +#if __POSIX_VISIBLE >= 200809 +char *stpcpy (char *__restrict, const char *__restrict); +char *stpncpy (char *__restrict, const char *__restrict, size_t); +#endif +#if __GNU_VISIBLE +char *strcasestr (const char *, const char *); +char *strchrnul (const char *, int); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4 +char *strdup (const char *) __malloc_like __result_use_check; +#endif +char *_strdup_r (struct _reent *, const char *); +#if __POSIX_VISIBLE >= 200809 +char *strndup (const char *, size_t) __malloc_like __result_use_check; +#endif +char *_strndup_r (struct _reent *, const char *, size_t); + +/* There are two common strerror_r variants. If you request + _GNU_SOURCE, you get the GNU version; otherwise you get the POSIX + version. POSIX requires that #undef strerror_r will still let you + invoke the underlying function, but that requires gcc support. */ +#if __GNU_VISIBLE +char *strerror_r (int, char *, size_t); +#elif __POSIX_VISIBLE >= 200112 +# ifdef __GNUC__ +int strerror_r (int, char *, size_t) +#ifdef __ASMNAME + __asm__ (__ASMNAME ("__xpg_strerror_r")) +#endif + ; +# else +int __xpg_strerror_r (int, char *, size_t); +# define strerror_r __xpg_strerror_r +# endif +#endif + +/* Reentrant version of strerror. */ +char * _strerror_r (struct _reent *, int, int, int *); + +#if __BSD_VISIBLE +size_t strlcat (char *, const char *, size_t); +size_t strlcpy (char *, const char *, size_t); +#endif +#if __POSIX_VISIBLE >= 200809 +size_t strnlen (const char *, size_t); +#endif +#if __BSD_VISIBLE +char *strsep (char **, const char *); +#endif +#if __BSD_VISIBLE +char *strnstr(const char *, const char *, size_t) __pure; +#endif + +#if __MISC_VISIBLE +char *strlwr (char *); +char *strupr (char *); +#endif + +#if __POSIX_VISIBLE >= 200809 +char *strsignal (int __signo); +#endif + +#ifdef __CYGWIN__ +int strtosigno (const char *__name); +#endif + +#if __GNU_VISIBLE +int strverscmp (const char *, const char *); +#endif + +#if __GNU_VISIBLE && defined(__GNUC__) +#define strdupa(__s) \ + (__extension__ ({const char *__sin = (__s); \ + size_t __len = strlen (__sin) + 1; \ + char * __sout = (char *) __builtin_alloca (__len); \ + (char *) memcpy (__sout, __sin, __len);})) +#define strndupa(__s, __n) \ + (__extension__ ({const char *__sin = (__s); \ + size_t __len = strnlen (__sin, (__n)) + 1; \ + char *__sout = (char *) __builtin_alloca (__len); \ + __sout[__len-1] = '\0'; \ + (char *) memcpy (__sout, __sin, __len-1);})) +#endif /* __GNU_VISIBLE && __GNUC__ */ + +/* There are two common basename variants. If you do NOT #include + and you do + + #define _GNU_SOURCE + #include + + you get the GNU version. Otherwise you get the POSIX versionfor which you + should #include i for the function prototype. POSIX requires that + #undef basename will still let you invoke the underlying function. However, + this also implies that the POSIX version is used in this case. That's made + sure here. */ +#if __GNU_VISIBLE && !defined(basename) +# define basename basename +char *__nonnull ((1)) basename (const char *) __asm__(__ASMNAME("__gnu_basename")); +#endif + +#include + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STRING_H_ */ diff --git a/include/strings.h b/include/strings.h new file mode 100644 index 0000000..f0f7ee1 --- /dev/null +++ b/include/strings.h @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2002 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: head/include/strings.h 272673 2014-10-07 04:54:11Z delphij $ + */ + +#ifndef _STRINGS_H_ +#define _STRINGS_H_ + +#include +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#ifndef _SIZE_T_DECLARED +typedef __size_t size_t; +#define _SIZE_T_DECLARED +#endif + +__BEGIN_DECLS +#if __BSD_VISIBLE || __POSIX_VISIBLE <= 200112 +int bcmp(const void *, const void *, size_t) __pure; /* LEGACY */ +void bcopy(const void *, void *, size_t); /* LEGACY */ +void bzero(void *, size_t); /* LEGACY */ +#endif +#if __BSD_VISIBLE +void explicit_bzero(void *, size_t); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE < 200809 || __XSI_VISIBLE >= 700 +int ffs(int) __pure2; +#endif +#if __BSD_VISIBLE +int ffsl(long) __pure2; +int ffsll(long long) __pure2; +int fls(int) __pure2; +int flsl(long) __pure2; +int flsll(long long) __pure2; +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE <= 200112 +char *index(const char *, int) __pure; /* LEGACY */ +char *rindex(const char *, int) __pure; /* LEGACY */ +#endif +int strcasecmp(const char *, const char *) __pure; +int strncasecmp(const char *, const char *, size_t) __pure; + +#if __POSIX_VISIBLE >= 200809 +int strcasecmp_l (const char *, const char *, locale_t); +int strncasecmp_l (const char *, const char *, size_t, locale_t); +#endif +__END_DECLS + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STRINGS_H_ */ diff --git a/include/symcat.h b/include/symcat.h new file mode 100644 index 0000000..95fc9b2 --- /dev/null +++ b/include/symcat.h @@ -0,0 +1,55 @@ +/* Symbol concatenation utilities. + + Copyright (C) 1998-2015 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 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, write to the Free Software Foundation, Inc., + 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef SYM_CAT_H +#define SYM_CAT_H + +#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE) +#define CONCAT2(a,b) a##b +#define CONCAT3(a,b,c) a##b##c +#define CONCAT4(a,b,c,d) a##b##c##d +#define CONCAT5(a,b,c,d,e) a##b##c##d##e +#define CONCAT6(a,b,c,d,e,f) a##b##c##d##e##f +#define STRINGX(s) #s +#else +/* Note one should never pass extra whitespace to the CONCATn macros, + e.g. CONCAT2(foo, bar) because traditonal C will keep the space between + the two labels instead of concatenating them. Instead, make sure to + write CONCAT2(foo,bar). */ +#define CONCAT2(a,b) a/**/b +#define CONCAT3(a,b,c) a/**/b/**/c +#define CONCAT4(a,b,c,d) a/**/b/**/c/**/d +#define CONCAT5(a,b,c,d,e) a/**/b/**/c/**/d/**/e +#define CONCAT6(a,b,c,d,e,f) a/**/b/**/c/**/d/**/e/**/f +#define STRINGX(s) "s" +#endif + +#define XCONCAT2(a,b) CONCAT2(a,b) +#define XCONCAT3(a,b,c) CONCAT3(a,b,c) +#define XCONCAT4(a,b,c,d) CONCAT4(a,b,c,d) +#define XCONCAT5(a,b,c,d,e) CONCAT5(a,b,c,d,e) +#define XCONCAT6(a,b,c,d,e,f) CONCAT6(a,b,c,d,e,f) + +/* Note the layer of indirection here is typically used to allow + stringification of the expansion of macros. I.e. "#define foo + bar", "XSTRING(foo)", to yield "bar". Be aware that this only + works for __STDC__, not for traditional C which will still resolve + to "foo". */ +#define XSTRING(s) STRINGX(s) + +#endif /* SYM_CAT_H */ diff --git a/include/sys/_default_fcntl.h b/include/sys/_default_fcntl.h new file mode 100644 index 0000000..48914c9 --- /dev/null +++ b/include/sys/_default_fcntl.h @@ -0,0 +1,240 @@ + +#ifndef _SYS__DEFAULT_FCNTL_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS__DEFAULT_FCNTL_H_ +#include <_ansi.h> +#include +#define _FOPEN (-1) /* from sys/file.h, kernel use only */ +#define _FREAD 0x0001 /* read enabled */ +#define _FWRITE 0x0002 /* write enabled */ +#define _FAPPEND 0x0008 /* append (writes guaranteed at the end) */ +#define _FMARK 0x0010 /* internal; mark during gc() */ +#define _FDEFER 0x0020 /* internal; defer for next gc pass */ +#define _FASYNC 0x0040 /* signal pgrp when data ready */ +#define _FSHLOCK 0x0080 /* BSD flock() shared lock present */ +#define _FEXLOCK 0x0100 /* BSD flock() exclusive lock present */ +#define _FCREAT 0x0200 /* open with file create */ +#define _FTRUNC 0x0400 /* open with truncation */ +#define _FEXCL 0x0800 /* error on open if file exists */ +#define _FNBIO 0x1000 /* non blocking I/O (sys5 style) */ +#define _FSYNC 0x2000 /* do all writes synchronously */ +#define _FNONBLOCK 0x4000 /* non blocking I/O (POSIX style) */ +#define _FNDELAY _FNONBLOCK /* non blocking I/O (4.2 style) */ +#define _FNOCTTY 0x8000 /* don't assign a ctty on this open */ +#if defined (__CYGWIN__) +#define _FBINARY 0x10000 +#define _FTEXT 0x20000 +#endif +#define _FNOINHERIT 0x40000 +#define _FDIRECT 0x80000 +#define _FNOFOLLOW 0x100000 +#define _FDIRECTORY 0x200000 +#define _FEXECSRCH 0x400000 +#if defined (__CYGWIN__) +#define _FTMPFILE 0x800000 +#define _FNOATIME 0x1000000 +#define _FPATH 0x2000000 +#endif + +#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) + +/* + * Flag values for open(2) and fcntl(2) + * The kernel adds 1 to the open modes to turn it into some + * combination of FREAD and FWRITE. + */ +#define O_RDONLY 0 /* +1 == FREAD */ +#define O_WRONLY 1 /* +1 == FWRITE */ +#define O_RDWR 2 /* +1 == FREAD|FWRITE */ +#define O_APPEND _FAPPEND +#define O_CREAT _FCREAT +#define O_TRUNC _FTRUNC +#define O_EXCL _FEXCL +#define O_SYNC _FSYNC +/* O_NDELAY _FNDELAY set in include/fcntl.h */ +/* O_NDELAY _FNBIO set in include/fcntl.h */ +#define O_NONBLOCK _FNONBLOCK +#define O_NOCTTY _FNOCTTY + +/* POSIX-1.2008 specific flags */ +#if __POSIX_VISIBLE >= 200809 +#define O_CLOEXEC _FNOINHERIT +#define O_NOFOLLOW _FNOFOLLOW +#define O_DIRECTORY _FDIRECTORY +#define O_EXEC _FEXECSRCH +#define O_SEARCH _FEXECSRCH +#endif + +#if __BSD_VISIBLE +#define O_DIRECT _FDIRECT +#endif + +#if defined (__CYGWIN__) +#define O_BINARY _FBINARY +#define O_TEXT _FTEXT +#define O_DSYNC _FSYNC +#define O_RSYNC _FSYNC + +/* Linux-specific flags */ +#if __GNU_VISIBLE +#define O_TMPFILE _FTMPFILE +#define O_NOATIME _FNOATIME +#define O_PATH _FPATH +#endif +#endif + +#if __MISC_VISIBLE + +/* + * Flags that work for fcntl(fd, F_SETFL, FXXXX) + */ +#define FAPPEND _FAPPEND +#define FSYNC _FSYNC +#define FASYNC _FASYNC +#define FNBIO _FNBIO +#define FNONBIO _FNONBLOCK /* XXX fix to be NONBLOCK everywhere */ +#define FNDELAY _FNDELAY + +/* + * Flags that are disallowed for fcntl's (FCNTLCANT); + * used for opens, internal state, or locking. + */ +#define FREAD _FREAD +#define FWRITE _FWRITE +#define FMARK _FMARK +#define FDEFER _FDEFER +#define FSHLOCK _FSHLOCK +#define FEXLOCK _FEXLOCK + +/* + * The rest of the flags, used only for opens + */ +#define FOPEN _FOPEN +#define FCREAT _FCREAT +#define FTRUNC _FTRUNC +#define FEXCL _FEXCL +#define FNOCTTY _FNOCTTY + +#endif /* __MISC_VISIBLE */ + +#if __BSD_VISIBLE +#define FNONBLOCK _FNONBLOCK +#endif /* __BSD_VISIBLE */ + +/* XXX close on exec request; must match UF_EXCLOSE in user.h */ +#define FD_CLOEXEC 1 /* posix */ + +/* fcntl(2) requests */ +#define F_DUPFD 0 /* Duplicate fildes */ +#define F_GETFD 1 /* Get fildes flags (close on exec) */ +#define F_SETFD 2 /* Set fildes flags (close on exec) */ +#define F_GETFL 3 /* Get file flags */ +#define F_SETFL 4 /* Set file flags */ +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +#define F_GETOWN 5 /* Get owner - for ASYNC */ +#define F_SETOWN 6 /* Set owner - for ASYNC */ +#endif /* __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 */ +#define F_GETLK 7 /* Get record-locking information */ +#define F_SETLK 8 /* Set or Clear a record-lock (Non-Blocking) */ +#define F_SETLKW 9 /* Set or Clear a record-lock (Blocking) */ +#if __MISC_VISIBLE +#define F_RGETLK 10 /* Test a remote lock to see if it is blocked */ +#define F_RSETLK 11 /* Set or unlock a remote lock */ +#define F_CNVT 12 /* Convert a fhandle to an open fd */ +#define F_RSETLKW 13 /* Set or Clear remote record-lock(Blocking) */ +#endif /* __MISC_VISIBLE */ +#if __POSIX_VISIBLE >= 200809 +#define F_DUPFD_CLOEXEC 14 /* As F_DUPFD, but set close-on-exec flag */ +#endif + +/* fcntl(2) flags (l_type field of flock structure) */ +#define F_RDLCK 1 /* read lock */ +#define F_WRLCK 2 /* write lock */ +#define F_UNLCK 3 /* remove lock(s) */ +#if __MISC_VISIBLE +#define F_UNLKSYS 4 /* remove remote locks for a given system */ +#endif /* __MISC_VISIBLE */ + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200809 +/* Special descriptor value to denote the cwd in calls to openat(2) etc. */ +#define AT_FDCWD -2 + +/* Flag values for faccessat2) et al. */ +#define AT_EACCESS 1 +#define AT_SYMLINK_NOFOLLOW 2 +#define AT_SYMLINK_FOLLOW 4 +#define AT_REMOVEDIR 8 +#if __GNU_VISIBLE +#define AT_EMPTY_PATH 16 +#endif +#endif + +#if __BSD_VISIBLE +/* lock operations for flock(2) */ +#define LOCK_SH 0x01 /* shared file lock */ +#define LOCK_EX 0x02 /* exclusive file lock */ +#define LOCK_NB 0x04 /* don't block when locking */ +#define LOCK_UN 0x08 /* unlock file */ +#endif + +/*#include */ + +#ifndef __CYGWIN__ +/* file segment locking set data type - information passed to system by user */ +struct flock { + short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ + short l_whence; /* flag to choose starting offset */ + long l_start; /* relative offset, in bytes */ + long l_len; /* length, in bytes; 0 means lock to EOF */ + short l_pid; /* returned with F_GETLK */ + short l_xxx; /* reserved for future use */ +}; +#endif /* __CYGWIN__ */ + +#if __MISC_VISIBLE +/* extended file segment locking set data type */ +struct eflock { + short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ + short l_whence; /* flag to choose starting offset */ + long l_start; /* relative offset, in bytes */ + long l_len; /* length, in bytes; 0 means lock to EOF */ + short l_pid; /* returned with F_GETLK */ + short l_xxx; /* reserved for future use */ + long l_rpid; /* Remote process id wanting this lock */ + long l_rsys; /* Remote system id wanting this lock */ +}; +#endif /* __MISC_VISIBLE */ + +#include +#include /* sigh. for the mode bits for open/creat */ + +extern int open (const char *, int, ...); +#if __ATFILE_VISIBLE +extern int openat (int, const char *, int, ...); +#endif +extern int creat (const char *, mode_t); +extern int fcntl (int, int, ...); +#if __BSD_VISIBLE +extern int flock (int, int); +#endif +#if __GNU_VISIBLE +#include +extern int futimesat (int, const char *, const struct timeval [2]); +#endif + +/* Provide _ prototypes for functions provided by some versions + of newlib. */ +#ifdef _LIBC +extern int _open (const char *, int, ...); +extern int _fcntl (int, int, ...); +#ifdef __LARGE64_FILES +extern int _open64 (const char *, int, ...); +#endif +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !_SYS__DEFAULT_FCNTL_H_ */ diff --git a/include/sys/_intsup.h b/include/sys/_intsup.h new file mode 100644 index 0000000..993121b --- /dev/null +++ b/include/sys/_intsup.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _SYS__INTSUP_H +#define _SYS__INTSUP_H + +#include + +#if __GNUC_PREREQ (3, 2) +/* gcc > 3.2 implicitly defines the values we are interested */ +#define __STDINT_EXP(x) __##x##__ +#else +#define __STDINT_EXP(x) x +#include +#endif + +/* Determine how intptr_t and intN_t fastN_t and leastN_t are defined by gcc + for this target. This is used to determine the correct printf() constant in + inttypes.h and other constants in stdint.h. + So we end up with + ?(signed|unsigned) char == 0 + ?(signed|unsigned) short == 1 + ?(signed|unsigned) int == 2 + ?(signed|unsigned) short int == 3 + ?(signed|unsigned) long == 4 + ?(signed|unsigned) long int == 6 + ?(signed|unsigned) long long == 8 + ?(signed|unsigned) long long int == 10 + */ +#pragma push_macro("signed") +#pragma push_macro("unsigned") +#pragma push_macro("char") +#pragma push_macro("short") +#pragma push_macro("__int20") +#pragma push_macro("__int20__") +#pragma push_macro("int") +#pragma push_macro("long") +#undef signed +#undef unsigned +#undef char +#undef short +#undef int +#undef __int20 +#undef __int20__ +#undef long +#define signed +0 +#define unsigned +0 +#define char +0 +#define short +1 +#define __int20 +2 +#define __int20__ +2 +#define int +2 +#define long +4 +#if (__INTPTR_TYPE__ == 8 || __INTPTR_TYPE__ == 10) +#define _INTPTR_EQ_LONGLONG +#elif (__INTPTR_TYPE__ == 4 || __INTPTR_TYPE__ == 6) +#define _INTPTR_EQ_LONG +/* Note - the tests for _INTPTR_EQ_INT and _INTPTR_EQ_SHORT are currently + redundant as the values are not used. But one day they may be needed + and so the tests remain. */ +#elif __INTPTR_TYPE__ == 2 +#define _INTPTR_EQ_INT +#elif (__INTPTR_TYPE__ == 1 || __INTPTR_TYPE__ == 3) +#define _INTPTR_EQ_SHORT +#else +#error "Unable to determine type definition of intptr_t" +#endif +#if (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6) +#define _INT32_EQ_LONG +#elif __INT32_TYPE__ == 2 +/* Nothing to define because int32_t is safe to print as an int. */ +#else +#error "Unable to determine type definition of int32_t" +#endif + +#if (__INT8_TYPE__ == 0) +#define __INT8 "hh" +#elif (__INT8_TYPE__ == 1 || __INT8_TYPE__ == 3) +#define __INT8 "h" +#elif (__INT8_TYPE__ == 2) +#define __INT8 +#elif (__INT8_TYPE__ == 4 || __INT8_TYPE__ == 6) +#define __INT8 "l" +#elif (__INT8_TYPE__ == 8 || __INT8_TYPE__ == 10) +#define __INT8 "ll" +#endif +#if (__INT16_TYPE__ == 1 || __INT16_TYPE__ == 3) +#define __INT16 "h" +#elif (__INT16_TYPE__ == 2) +#define __INT16 +#elif (__INT16_TYPE__ == 4 || __INT16_TYPE__ == 6) +#define __INT16 "l" +#elif (__INT16_TYPE__ == 8 || __INT16_TYPE__ == 10) +#define __INT16 "ll" +#endif +#if (__INT32_TYPE__ == 2) +#define __INT32 +#elif (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6) +#define __INT32 "l" +#elif (__INT32_TYPE__ == 8 || __INT32_TYPE__ == 10) +#define __INT32 "ll" +#endif +#if (__INT64_TYPE__ == 2) +#define __INT64 +#elif (__INT64_TYPE__ == 4 || __INT64_TYPE__ == 6) +#define __INT64 "l" +#elif (__INT64_TYPE__ == 8 || __INT64_TYPE__ == 10) +#define __INT64 "ll" +#endif +#if (__INT_FAST8_TYPE__ == 0) +#define __FAST8 "hh" +#elif (__INT_FAST8_TYPE__ == 1 || __INT_FAST8_TYPE__ == 3) +#define __FAST8 "h" +#elif (__INT_FAST8_TYPE__ == 2) +#define __FAST8 +#elif (__INT_FAST8_TYPE__ == 4 || __INT_FAST8_TYPE__ == 6) +#define __FAST8 "l" +#elif (__INT_FAST8_TYPE__ == 8 || __INT_FAST8_TYPE__ == 10) +#define __FAST8 "ll" +#endif +#if (__INT_FAST16_TYPE__ == 1 || __INT_FAST16_TYPE__ == 3) +#define __FAST16 "h" +#elif (__INT_FAST16_TYPE__ == 2) +#define __FAST16 +#elif (__INT_FAST16_TYPE__ == 4 || __INT_FAST16_TYPE__ == 6) +#define __FAST16 "l" +#elif (__INT_FAST16_TYPE__ == 8 || __INT_FAST16_TYPE__ == 10) +#define __FAST16 "ll" +#endif +#if (__INT_FAST32_TYPE__ == 2) +#define __FAST32 +#elif (__INT_FAST32_TYPE__ == 4 || __INT_FAST32_TYPE__ == 6) +#define __FAST32 "l" +#elif (__INT_FAST32_TYPE__ == 8 || __INT_FAST32_TYPE__ == 10) +#define __FAST32 "ll" +#endif +#if (__INT_FAST64_TYPE__ == 2) +#define __FAST64 +#elif (__INT_FAST64_TYPE__ == 4 || __INT_FAST64_TYPE__ == 6) +#define __FAST64 "l" +#elif (__INT_FAST64_TYPE__ == 8 || __INT_FAST64_TYPE__ == 10) +#define __FAST64 "ll" +#endif + +#if (__INT_LEAST8_TYPE__ == 0) +#define __LEAST8 "hh" +#elif (__INT_LEAST8_TYPE__ == 1 || __INT_LEAST8_TYPE__ == 3) +#define __LEAST8 "h" +#elif (__INT_LEAST8_TYPE__ == 2) +#define __LEAST8 +#elif (__INT_LEAST8_TYPE__ == 4 || __INT_LEAST8_TYPE__ == 6) +#define __LEAST8 "l" +#elif (__INT_LEAST8_TYPE__ == 8 || __INT_LEAST8_TYPE__ == 10) +#define __LEAST8 "ll" +#endif +#if (__INT_LEAST16_TYPE__ == 1 || __INT_LEAST16_TYPE__ == 3) +#define __LEAST16 "h" +#elif (__INT_LEAST16_TYPE__ == 2) +#define __LEAST16 +#elif (__INT_LEAST16_TYPE__ == 4 || __INT_LEAST16_TYPE__ == 6) +#define __LEAST16 "l" +#elif (__INT_LEAST16_TYPE__ == 8 || __INT_LEAST16_TYPE__ == 10) +#define __LEAST16 "ll" +#endif +#if (__INT_LEAST32_TYPE__ == 2) +#define __LEAST32 +#elif (__INT_LEAST32_TYPE__ == 4 || __INT_LEAST32_TYPE__ == 6) +#define __LEAST32 "l" +#elif (__INT_LEAST32_TYPE__ == 8 || __INT_LEAST32_TYPE__ == 10) +#define __LEAST32 "ll" +#endif +#if (__INT_LEAST64_TYPE__ == 2) +#define __LEAST64 +#elif (__INT_LEAST64_TYPE__ == 4 || __INT_LEAST64_TYPE__ == 6) +#define __LEAST64 "l" +#elif (__INT_LEAST64_TYPE__ == 8 || __INT_LEAST64_TYPE__ == 10) +#define __LEAST64 "ll" +#endif +#undef signed +#undef unsigned +#undef char +#undef short +#undef int +#undef long +#pragma pop_macro("signed") +#pragma pop_macro("unsigned") +#pragma pop_macro("char") +#pragma pop_macro("short") +#pragma pop_macro("__int20") +#pragma pop_macro("__int20__") +#pragma pop_macro("int") +#pragma pop_macro("long") + +#endif /* _SYS__INTSUP_H */ diff --git a/include/sys/_locale.h b/include/sys/_locale.h new file mode 100644 index 0000000..ce6f995 --- /dev/null +++ b/include/sys/_locale.h @@ -0,0 +1,12 @@ +/* Definition of opaque POSIX-1.2008 type locale_t for userspace. */ + +#ifndef _SYS__LOCALE_H +#define _SYS__LOCALE_H + +#include +#include + +struct __locale_t; +typedef struct __locale_t *locale_t; + +#endif /* _SYS__LOCALE_H */ diff --git a/include/sys/_pthreadtypes.h b/include/sys/_pthreadtypes.h new file mode 100644 index 0000000..75e9e1c --- /dev/null +++ b/include/sys/_pthreadtypes.h @@ -0,0 +1,233 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2013, 2015. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + */ + +#ifndef _SYS__PTHREADTYPES_H_ +#define _SYS__PTHREADTYPES_H_ + +#if defined(_POSIX_THREADS) || __POSIX_VISIBLE >= 199506 + +#include + +/* + * 2.5 Primitive System Data Types, P1003.1c/D10, p. 19. + */ + +#if defined(__XMK__) +typedef unsigned int pthread_t; /* identify a thread */ +#else +typedef __uint32_t pthread_t; /* identify a thread */ +#endif + +/* P1003.1c/D10, p. 118-119 */ +#define PTHREAD_SCOPE_PROCESS 0 +#define PTHREAD_SCOPE_SYSTEM 1 + +/* P1003.1c/D10, p. 111 */ +#define PTHREAD_INHERIT_SCHED 1 /* scheduling policy and associated */ + /* attributes are inherited from */ + /* the calling thread. */ +#define PTHREAD_EXPLICIT_SCHED 2 /* set from provided attribute object */ + +/* P1003.1c/D10, p. 141 */ +#define PTHREAD_CREATE_DETACHED 0 +#define PTHREAD_CREATE_JOINABLE 1 + +#if defined(__XMK__) +typedef struct pthread_attr_s { + int contentionscope; + struct sched_param schedparam; + int detachstate; + void *stackaddr; + size_t stacksize; +} pthread_attr_t; + +#define PTHREAD_STACK_MIN 200 + +#else /* !defined(__XMK__) */ +typedef struct { + int is_initialized; + void *stackaddr; + int stacksize; + int contentionscope; + int inheritsched; + int schedpolicy; + struct sched_param schedparam; + + /* P1003.4b/D8, p. 54 adds cputime_clock_allowed attribute. */ +#if defined(_POSIX_THREAD_CPUTIME) + int cputime_clock_allowed; /* see time.h */ +#endif + int detachstate; +} pthread_attr_t; + +#endif /* !defined(__XMK__) */ + +#if defined(_POSIX_THREAD_PROCESS_SHARED) +/* NOTE: P1003.1c/D10, p. 81 defines following values for process_shared. */ + +#define PTHREAD_PROCESS_PRIVATE 0 /* visible within only the creating process */ +#define PTHREAD_PROCESS_SHARED 1 /* visible too all processes with access to */ + /* the memory where the resource is */ + /* located */ +#endif + +#if defined(_POSIX_THREAD_PRIO_PROTECT) +/* Mutexes */ + +/* Values for blocking protocol. */ + +#define PTHREAD_PRIO_NONE 0 +#define PTHREAD_PRIO_INHERIT 1 +#define PTHREAD_PRIO_PROTECT 2 +#endif + +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + +/* Values for mutex type */ + +/* The following defines are part of the X/Open System Interface (XSI). */ + +/* + * This type of mutex does not detect deadlock. A thread attempting to + * relock this mutex without first unlocking it shall deadlock. Attempting + * to unlock a mutex locked by a different thread results in undefined + * behavior. Attempting to unlock an unlocked mutex results in undefined + * behavior. + */ +#define PTHREAD_MUTEX_NORMAL 0 + +/* + * A thread attempting to relock this mutex without first unlocking + * it shall succeed in locking the mutex. The relocking deadlock which + * can occur with mutexes of type PTHREAD_MUTEX_NORMAL cannot occur with + * this type of mutex. Multiple locks of this mutex shall require the + * same number of unlocks to release the mutex before another thread can + * acquire the mutex. A thread attempting to unlock a mutex which another + * thread has locked shall return with an error. A thread attempting to + * unlock an unlocked mutex shall return with an error. + */ +#define PTHREAD_MUTEX_RECURSIVE 1 + +/* + * This type of mutex provides error checking. A thread attempting + * to relock this mutex without first unlocking it shall return with an + * error. A thread attempting to unlock a mutex which another thread has + * locked shall return with an error. A thread attempting to unlock an + * unlocked mutex shall return with an error. + */ +#define PTHREAD_MUTEX_ERRORCHECK 2 + +/* + * Attempting to recursively lock a mutex of this type results + * in undefined behavior. Attempting to unlock a mutex of this type + * which was not locked by the calling thread results in undefined + * behavior. Attempting to unlock a mutex of this type which is not locked + * results in undefined behavior. An implementation may map this mutex to + * one of the other mutex types. + */ +#define PTHREAD_MUTEX_DEFAULT 3 + +#endif /* !defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) */ + +#if defined(__XMK__) +typedef unsigned int pthread_mutex_t; /* identify a mutex */ + +typedef struct { + int type; +} pthread_mutexattr_t; + +#else /* !defined(__XMK__) */ +typedef __uint32_t pthread_mutex_t; /* identify a mutex */ + +typedef struct { + int is_initialized; +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow mutex to be shared amongst processes */ +#endif +#if defined(_POSIX_THREAD_PRIO_PROTECT) + int prio_ceiling; + int protocol; +#endif +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + int type; +#endif + int recursive; +} pthread_mutexattr_t; +#endif /* !defined(__XMK__) */ + +#define _PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF) + +/* Condition Variables */ + +typedef __uint32_t pthread_cond_t; /* identify a condition variable */ + +#define _PTHREAD_COND_INITIALIZER ((pthread_cond_t) 0xFFFFFFFF) + +typedef struct { + int is_initialized; + clock_t clock; /* specifiy clock for timeouts */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_condattr_t; /* a condition attribute object */ + +/* Keys */ + +typedef __uint32_t pthread_key_t; /* thread-specific data keys */ + +typedef struct { + int is_initialized; /* is this structure initialized? */ + int init_executed; /* has the initialization routine been run? */ +} pthread_once_t; /* dynamic package initialization */ + +#define _PTHREAD_ONCE_INIT { 1, 0 } /* is initialized and not run */ +#endif /* defined(_POSIX_THREADS) || __POSIX_VISIBLE >= 199506 */ + +/* POSIX Barrier Types */ + +#if defined(_POSIX_BARRIERS) +typedef __uint32_t pthread_barrier_t; /* POSIX Barrier Object */ +typedef struct { + int is_initialized; /* is this structure initialized? */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_barrierattr_t; +#endif /* defined(_POSIX_BARRIERS) */ + +/* POSIX Spin Lock Types */ + +#if defined(_POSIX_SPIN_LOCKS) +typedef __uint32_t pthread_spinlock_t; /* POSIX Spin Lock Object */ +#endif /* defined(_POSIX_SPIN_LOCKS) */ + +/* POSIX Reader/Writer Lock Types */ + +#if defined(_POSIX_READER_WRITER_LOCKS) +typedef __uint32_t pthread_rwlock_t; /* POSIX RWLock Object */ + +#define _PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) 0xFFFFFFFF) + +typedef struct { + int is_initialized; /* is this structure initialized? */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_rwlockattr_t; +#endif /* defined(_POSIX_READER_WRITER_LOCKS) */ + +#endif /* ! _SYS__PTHREADTYPES_H_ */ diff --git a/include/sys/_sigset.h b/include/sys/_sigset.h new file mode 100644 index 0000000..a9c0d2d --- /dev/null +++ b/include/sys/_sigset.h @@ -0,0 +1,43 @@ +/*- + * Copyright (c) 1982, 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.4 (Berkeley) 5/4/95 + * $FreeBSD$ + */ + +#ifndef _SYS__SIGSET_H_ +#define _SYS__SIGSET_H_ + +typedef unsigned long __sigset_t; + +#endif /* !_SYS__SIGSET_H_ */ diff --git a/include/sys/_stdint.h b/include/sys/_stdint.h new file mode 100644 index 0000000..21a14d3 --- /dev/null +++ b/include/sys/_stdint.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _SYS__STDINT_H +#define _SYS__STDINT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ___int8_t_defined +#ifndef _INT8_T_DECLARED +typedef __int8_t int8_t ; +#define _INT8_T_DECLARED +#endif +#ifndef _UINT8_T_DECLARED +typedef __uint8_t uint8_t ; +#define _UINT8_T_DECLARED +#endif +#define __int8_t_defined 1 +#endif /* ___int8_t_defined */ + +#ifdef ___int16_t_defined +#ifndef _INT16_T_DECLARED +typedef __int16_t int16_t ; +#define _INT16_T_DECLARED +#endif +#ifndef _UINT16_T_DECLARED +typedef __uint16_t uint16_t ; +#define _UINT16_T_DECLARED +#endif +#define __int16_t_defined 1 +#endif /* ___int16_t_defined */ + +#ifdef ___int32_t_defined +#ifndef _INT32_T_DECLARED +typedef __int32_t int32_t ; +#define _INT32_T_DECLARED +#endif +#ifndef _UINT32_T_DECLARED +typedef __uint32_t uint32_t ; +#define _UINT32_T_DECLARED +#endif +#define __int32_t_defined 1 +#endif /* ___int32_t_defined */ + +#ifdef ___int64_t_defined +#ifndef _INT64_T_DECLARED +typedef __int64_t int64_t ; +#define _INT64_T_DECLARED +#endif +#ifndef _UINT64_T_DECLARED +typedef __uint64_t uint64_t ; +#define _UINT64_T_DECLARED +#endif +#define __int64_t_defined 1 +#endif /* ___int64_t_defined */ + +#ifndef _INTMAX_T_DECLARED +typedef __intmax_t intmax_t; +#define _INTMAX_T_DECLARED +#endif + +#ifndef _UINTMAX_T_DECLARED +typedef __uintmax_t uintmax_t; +#define _UINTMAX_T_DECLARED +#endif + +#ifndef _INTPTR_T_DECLARED +typedef __intptr_t intptr_t; +#define _INTPTR_T_DECLARED +#endif + +#ifndef _UINTPTR_T_DECLARED +typedef __uintptr_t uintptr_t; +#define _UINTPTR_T_DECLARED +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS__STDINT_H */ diff --git a/include/sys/_timespec.h b/include/sys/_timespec.h new file mode 100644 index 0000000..f810b00 --- /dev/null +++ b/include/sys/_timespec.h @@ -0,0 +1,52 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * from: FreeBSD: src/sys/sys/time.h,v 1.43 2000/03/20 14:09:05 phk Exp + * $FreeBSD: head/sys/sys/_timespec.h 326023 2017-11-20 19:43:44Z pfg $ + */ + +#ifndef _SYS__TIMESPEC_H_ +#define _SYS__TIMESPEC_H_ + +#include + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* and nanoseconds */ +}; + +#endif /* !_SYS__TIMESPEC_H_ */ diff --git a/include/sys/_timeval.h b/include/sys/_timeval.h new file mode 100644 index 0000000..6b250c0 --- /dev/null +++ b/include/sys/_timeval.h @@ -0,0 +1,60 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2002 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: head/sys/sys/_timeval.h 326256 2017-11-27 15:01:59Z pfg $ + */ + +#ifndef _SYS__TIMEVAL_H_ +#define _SYS__TIMEVAL_H_ + +#include + +#ifndef _SUSECONDS_T_DECLARED +typedef __suseconds_t suseconds_t; +#define _SUSECONDS_T_DECLARED +#endif + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +/* This define is also used outside of Newlib, e.g. in MinGW-w64 */ +#ifndef _TIMEVAL_DEFINED +#define _TIMEVAL_DEFINED + +/* + * Structure returned by gettimeofday(2) system call, and used in other calls. + */ +struct timeval { + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* and microseconds */ +}; +#endif /* _TIMEVAL_DEFINED */ + +#endif /* !_SYS__TIMEVAL_H_ */ diff --git a/include/sys/_types.h b/include/sys/_types.h new file mode 100644 index 0000000..d1112d5 --- /dev/null +++ b/include/sys/_types.h @@ -0,0 +1,228 @@ +/* ANSI C namespace clean utility typedefs */ + +/* This file defines various typedefs needed by the system calls that support + the C library. Basically, they're just the POSIX versions with an '_' + prepended. Targets shall use to define their own + internal types if desired. + + There are three define patterns used for type definitions. Lets assume + xyz_t is a user type. + + The internal type definition uses __machine_xyz_t_defined. It is defined by + to disable a default definition in . It + must not be used in other files. + + User type definitions are guarded by __xyz_t_defined in glibc and + _XYZ_T_DECLARED in BSD compatible systems. +*/ + +#ifndef _SYS__TYPES_H +#define _SYS__TYPES_H + +#define __need_size_t +#define __need_wint_t +#include +#include +#include +#include + +#ifndef __machine_blkcnt_t_defined +typedef long __blkcnt_t; +#endif + +#ifndef __machine_blksize_t_defined +typedef long __blksize_t; +#endif + +#ifndef __machine_fsblkcnt_t_defined +typedef __uint64_t __fsblkcnt_t; +#endif + +#ifndef __machine_fsfilcnt_t_defined +typedef __uint32_t __fsfilcnt_t; +#endif + +#ifndef __machine_off_t_defined +typedef long _off_t; +#endif + +#if defined(__XMK__) +typedef signed char __pid_t; +#else +typedef int __pid_t; +#endif + +#ifndef __machine_dev_t_defined +typedef short __dev_t; +#endif + +#ifndef __machine_uid_t_defined +typedef unsigned short __uid_t; +#endif +#ifndef __machine_gid_t_defined +typedef unsigned short __gid_t; +#endif + +#ifndef __machine_id_t_defined +typedef __uint32_t __id_t; +#endif + +#ifndef __machine_ino_t_defined +#if (defined(__i386__) && (defined(GO32) || defined(__MSDOS__))) || \ + defined(__sparc__) || defined(__SPU__) +typedef unsigned long __ino_t; +#else +typedef unsigned short __ino_t; +#endif +#endif + +#ifndef __machine_mode_t_defined +#if defined(__i386__) && (defined(GO32) || defined(__MSDOS__)) +typedef int __mode_t; +#else +#if defined(__sparc__) && !defined(__sparc_v9__) +#ifdef __svr4__ +typedef unsigned long __mode_t; +#else +typedef unsigned short __mode_t; +#endif +#else +typedef __uint32_t __mode_t; +#endif +#endif +#endif + +#ifndef __machine_off64_t_defined +__extension__ typedef long long _off64_t; +#endif + +#if defined(__CYGWIN__) && !defined(__LP64__) +typedef _off64_t __off_t; +#else +typedef _off_t __off_t; +#endif + +typedef _off64_t __loff_t; + +#ifndef __machine_key_t_defined +typedef long __key_t; +#endif + +/* + * We need fpos_t for the following, but it doesn't have a leading "_", + * so we use _fpos_t instead. + */ +#ifndef __machine_fpos_t_defined +typedef long _fpos_t; /* XXX must match off_t in */ + /* (and must be `long' for now) */ +#endif + +#ifdef __LARGE64_FILES +#ifndef __machine_fpos64_t_defined +typedef _off64_t _fpos64_t; +#endif +#endif + +/* Defined by GCC provided */ +#undef __size_t + +#ifndef __machine_size_t_defined +#ifdef __SIZE_TYPE__ +typedef __SIZE_TYPE__ __size_t; +#else +#if defined(__INT_MAX__) && __INT_MAX__ == 2147483647 +typedef unsigned int __size_t; +#else +typedef unsigned long __size_t; +#endif +#endif +#endif + +#ifndef __machine_ssize_t_defined +#ifdef __SIZE_TYPE__ +/* If __SIZE_TYPE__ is defined (gcc) we define ssize_t based on size_t. + We simply change "unsigned" to "signed" for this single definition + to make sure ssize_t and size_t only differ by their signedness. */ +#define unsigned signed +typedef __SIZE_TYPE__ _ssize_t; +#undef unsigned +#else +#if defined(__INT_MAX__) && __INT_MAX__ == 2147483647 +typedef int _ssize_t; +#else +typedef long _ssize_t; +#endif +#endif +#endif + +typedef _ssize_t __ssize_t; + +#ifndef __machine_mbstate_t_defined +/* Conversion state information. */ +typedef struct +{ + int __count; + union + { + wint_t __wch; + unsigned char __wchb[4]; + } __value; /* Value so far. */ +} _mbstate_t; +#endif + +#ifndef __machine_iconv_t_defined +/* Iconv descriptor type */ +typedef void *_iconv_t; +#endif + +#ifndef __machine_clock_t_defined +#define _CLOCK_T_ unsigned long /* clock() */ +#endif + +typedef _CLOCK_T_ __clock_t; + +#if defined(_USE_LONG_TIME_T) || __LONG_MAX__ > 0x7fffffffL +#define _TIME_T_ long +#else +#define _TIME_T_ __int_least64_t +#endif +typedef _TIME_T_ __time_t; + +#ifndef __machine_clockid_t_defined +#define _CLOCKID_T_ unsigned long +#endif + +typedef _CLOCKID_T_ __clockid_t; + +#ifndef __machine_daddr_t_defined +typedef long __daddr_t; +#endif + +#define _TIMER_T_ unsigned long +typedef _TIMER_T_ __timer_t; + +#ifndef __machine_sa_family_t_defined +typedef __uint8_t __sa_family_t; +#endif + +#ifndef __machine_socklen_t_defined +typedef __uint32_t __socklen_t; +#endif + +typedef int __nl_item; +typedef unsigned short __nlink_t; +typedef long __suseconds_t; /* microseconds (signed) */ +typedef unsigned long __useconds_t; /* microseconds (unsigned) */ + +/* + * Must be identical to the __GNUCLIKE_BUILTIN_VAALIST definition in + * . The must not be included here to avoid cyclic + * header dependencies. + */ +#if __GNUC_MINOR__ > 95 || __GNUC__ >= 3 +typedef __builtin_va_list __va_list; +#else +typedef char * __va_list; +#endif + +#endif /* _SYS__TYPES_H */ diff --git a/include/sys/_tz_structs.h b/include/sys/_tz_structs.h new file mode 100644 index 0000000..9610b06 --- /dev/null +++ b/include/sys/_tz_structs.h @@ -0,0 +1,24 @@ +#ifndef _SYS__TZ_STRUCTS_H_ +#define _SYS__TZ_STRUCTS_H_ + +typedef struct __tzrule_struct +{ + char ch; + int m; /* Month of year if ch=M */ + int n; /* Week of month if ch=M */ + int d; /* Day of week if ch=M, day of year if ch=J or ch=D */ + int s; /* Time of day in seconds */ + time_t change; + long offset; /* Match type of _timezone. */ +} __tzrule_type; + +typedef struct __tzinfo_struct +{ + int __tznorth; + int __tzyear; + __tzrule_type __tzrule[2]; +} __tzinfo_type; + +__tzinfo_type *__gettzinfo (void); + +#endif /* _SYS__TZ_STRUCTS_H_ */ diff --git a/include/sys/cdefs.h b/include/sys/cdefs.h new file mode 100644 index 0000000..720e700 --- /dev/null +++ b/include/sys/cdefs.h @@ -0,0 +1,740 @@ +/* libc/sys/linux/sys/cdefs.h - Helper macros for K&R vs. ANSI C compat. */ + +/* Written 2000 by Werner Almesberger */ + +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Berkeley Software Design, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 + * $FreeBSD$ + */ + +#ifndef _SYS_CDEFS_H_ +#define _SYS_CDEFS_H_ + +#include +#include +#include + +#define __PMT(args) args +#define __DOTS , ... +#define __THROW + +#ifdef __GNUC__ +# define __ASMNAME(cname) __XSTRING (__USER_LABEL_PREFIX__) cname +#endif + +#define __ptr_t void * +#define __long_double_t long double + +#define __attribute_malloc__ +#define __attribute_pure__ +#define __attribute_format_strfmon__(a,b) +#define __flexarr [0] + +#ifndef __BOUNDED_POINTERS__ +# define __bounded /* nothing */ +# define __unbounded /* nothing */ +# define __ptrvalue /* nothing */ +#endif + +/* + * Testing against Clang-specific extensions. + */ +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif +#ifndef __has_extension +#define __has_extension __has_feature +#endif +#ifndef __has_feature +#define __has_feature(x) 0 +#endif +#ifndef __has_include +#define __has_include(x) 0 +#endif +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +#if defined(__cplusplus) +#define __BEGIN_DECLS extern "C" { +#define __END_DECLS } +#else +#define __BEGIN_DECLS +#define __END_DECLS +#endif + +/* + * This code has been put in place to help reduce the addition of + * compiler specific defines in FreeBSD code. It helps to aid in + * having a compiler-agnostic source tree. + */ + +#if defined(__GNUC__) + +#if __GNUC__ >= 3 +#define __GNUCLIKE_ASM 3 +#define __GNUCLIKE_MATH_BUILTIN_CONSTANTS +#else +#define __GNUCLIKE_ASM 2 +#endif +#define __GNUCLIKE___TYPEOF 1 +#define __GNUCLIKE___SECTION 1 + +#define __GNUCLIKE_CTOR_SECTION_HANDLING 1 + +#define __GNUCLIKE_BUILTIN_CONSTANT_P 1 + +#if (__GNUC_MINOR__ > 95 || __GNUC__ >= 3) +#define __GNUCLIKE_BUILTIN_VARARGS 1 +#define __GNUCLIKE_BUILTIN_STDARG 1 +#define __GNUCLIKE_BUILTIN_VAALIST 1 +#endif + +#define __GNUC_VA_LIST_COMPATIBILITY 1 + +/* + * Compiler memory barriers, specific to gcc and clang. + */ +#define __compiler_membar() __asm __volatile(" " : : : "memory") + +#define __GNUCLIKE_BUILTIN_NEXT_ARG 1 +#define __GNUCLIKE_MATH_BUILTIN_RELOPS + +#define __GNUCLIKE_BUILTIN_MEMCPY 1 + +/* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */ +#define __CC_SUPPORTS_INLINE 1 +#define __CC_SUPPORTS___INLINE 1 +#define __CC_SUPPORTS___INLINE__ 1 + +#define __CC_SUPPORTS___FUNC__ 1 +#define __CC_SUPPORTS_WARNING 1 + +#define __CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */ + +#define __CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1 + +#endif /* __GNUC__ */ + +/* + * The __CONCAT macro is used to concatenate parts of symbol names, e.g. + * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. + * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI + * mode -- there must be no spaces between its arguments, and for nested + * __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also + * concatenate double-quoted strings produced by the __STRING macro, but + * this only works with ANSI C. + * + * __XSTRING is like __STRING, but it expands any macros in its argument + * first. It is only available with ANSI C. + */ +#if defined(__STDC__) || defined(__cplusplus) +#define __P(protos) protos /* full-blown ANSI C */ +#define __CONCAT1(x,y) x ## y +#define __CONCAT(x,y) __CONCAT1(x,y) +#define __STRING(x) #x /* stringify without expanding x */ +#define __XSTRING(x) __STRING(x) /* expand x, then stringify */ + +#define __const const /* define reserved names to standard */ +#define __signed signed +#define __volatile volatile +#if defined(__cplusplus) +#define __inline inline /* convert to C++ keyword */ +#else +#if !(defined(__CC_SUPPORTS___INLINE)) +#define __inline /* delete GCC keyword */ +#endif /* ! __CC_SUPPORTS___INLINE */ +#endif /* !__cplusplus */ + +#else /* !(__STDC__ || __cplusplus) */ +#define __P(protos) () /* traditional C preprocessor */ +#define __CONCAT(x,y) x/**/y +#define __STRING(x) "x" + +#if !defined(__CC_SUPPORTS___INLINE) +#define __const /* delete pseudo-ANSI C keywords */ +#define __inline +#define __signed +#define __volatile +/* + * In non-ANSI C environments, new programs will want ANSI-only C keywords + * deleted from the program and old programs will want them left alone. + * When using a compiler other than gcc, programs using the ANSI C keywords + * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. + * When using "gcc -traditional", we assume that this is the intent; if + * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. + */ +#ifndef NO_ANSI_KEYWORDS +#define const /* delete ANSI C keywords */ +#define inline +#define signed +#define volatile +#endif /* !NO_ANSI_KEYWORDS */ +#endif /* !__CC_SUPPORTS___INLINE */ +#endif /* !(__STDC__ || __cplusplus) */ + +/* + * Compiler-dependent macros to help declare dead (non-returning) and + * pure (no side effects) functions, and unused variables. They are + * null except for versions of gcc that are known to support the features + * properly (old versions of gcc-2 supported the dead and pure features + * in a different (wrong) way). If we do not provide an implementation + * for a given compiler, let the compile fail if it is told to use + * a feature that we cannot live without. + */ +#define __weak_symbol __attribute__((__weak__)) +#if !__GNUC_PREREQ__(2, 5) +#define __dead2 +#define __pure2 +#define __unused +#endif +#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 +#define __dead2 __attribute__((__noreturn__)) +#define __pure2 __attribute__((__const__)) +#define __unused +/* XXX Find out what to do for __packed, __aligned and __section */ +#endif +#if __GNUC_PREREQ__(2, 7) +#define __dead2 __attribute__((__noreturn__)) +#define __pure2 __attribute__((__const__)) +#define __unused __attribute__((__unused__)) +#define __used __attribute__((__used__)) +#define __packed __attribute__((__packed__)) +#define __aligned(x) __attribute__((__aligned__(x))) +#define __section(x) __attribute__((__section__(x))) +#endif +#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__) +#define __alloc_size(x) __attribute__((__alloc_size__(x))) +#define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x))) +#else +#define __alloc_size(x) +#define __alloc_size2(n, x) +#endif +#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__) +#define __alloc_align(x) __attribute__((__alloc_align__(x))) +#else +#define __alloc_align(x) +#endif + +#if !__GNUC_PREREQ__(2, 95) +#define __alignof(x) __offsetof(struct { char __a; x __b; }, __b) +#endif + +/* + * Keywords added in C11. + */ + +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L + +#if !__has_extension(c_alignas) +#if (defined(__cplusplus) && __cplusplus >= 201103L) || \ + __has_extension(cxx_alignas) +#define _Alignas(x) alignas(x) +#else +/* XXX: Only emulates _Alignas(constant-expression); not _Alignas(type-name). */ +#define _Alignas(x) __aligned(x) +#endif +#endif + +#if defined(__cplusplus) && __cplusplus >= 201103L +#define _Alignof(x) alignof(x) +#else +#define _Alignof(x) __alignof(x) +#endif + +#if !defined(__cplusplus) && !__has_extension(c_atomic) && \ + !__has_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7) +/* + * No native support for _Atomic(). Place object in structure to prevent + * most forms of direct non-atomic access. + */ +#define _Atomic(T) struct { T volatile __val; } +#endif + +#if defined(__cplusplus) && __cplusplus >= 201103L +#define _Noreturn [[noreturn]] +#else +#define _Noreturn __dead2 +#endif + +#if !__has_extension(c_static_assert) +#if (defined(__cplusplus) && __cplusplus >= 201103L) || \ + __has_extension(cxx_static_assert) +#define _Static_assert(x, y) static_assert(x, y) +#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus) +/* Nothing, gcc 4.6 and higher has _Static_assert built-in */ +#elif defined(__COUNTER__) +#define _Static_assert(x, y) __Static_assert(x, __COUNTER__) +#define __Static_assert(x, y) ___Static_assert(x, y) +#define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 : -1] \ + __unused +#else +#define _Static_assert(x, y) struct __hack +#endif +#endif + +#if !__has_extension(c_thread_local) +/* + * XXX: Some compilers (Clang 3.3, GCC 4.7) falsely announce C++11 mode + * without actually supporting the thread_local keyword. Don't check for + * the presence of C++11 when defining _Thread_local. + */ +#if /* (defined(__cplusplus) && __cplusplus >= 201103L) || */ \ + __has_extension(cxx_thread_local) +#define _Thread_local thread_local +#else +#define _Thread_local __thread +#endif +#endif + +#endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */ + +/* + * Emulation of C11 _Generic(). Unlike the previously defined C11 + * keywords, it is not possible to implement this using exactly the same + * syntax. Therefore implement something similar under the name + * __generic(). Unlike _Generic(), this macro can only distinguish + * between a single type, so it requires nested invocations to + * distinguish multiple cases. + */ + +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ + __has_extension(c_generic_selections) +#define __generic(expr, t, yes, no) \ + _Generic(expr, t: yes, default: no) +#elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus) +#define __generic(expr, t, yes, no) \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(__typeof(expr), t), yes, no) +#endif + +/* + * C99 Static array indices in function parameter declarations. Syntax such as: + * void bar(int myArray[static 10]); + * is allowed in C99 but not in C++. Define __min_size appropriately so + * headers using it can be compiled in either language. Use like this: + * void bar(int myArray[__min_size(10)]); + */ +#if !defined(__cplusplus) && \ + (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \ + (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >= 199901)) +#define __min_size(x) static (x) +#else +#define __min_size(x) (x) +#endif + +#if __GNUC_PREREQ__(2, 96) +#define __malloc_like __attribute__((__malloc__)) +#define __pure __attribute__((__pure__)) +#else +#define __malloc_like +#define __pure +#endif + +#if __GNUC_PREREQ__(3, 1) +#define __always_inline __inline__ __attribute__((__always_inline__)) +#else +#define __always_inline +#endif + +#if __GNUC_PREREQ__(3, 1) +#define __noinline __attribute__ ((__noinline__)) +#else +#define __noinline +#endif + +#if __GNUC_PREREQ__(3, 3) +#define __nonnull(x) __attribute__((__nonnull__ x)) +#define __nonnull_all __attribute__((__nonnull__)) +#else +#define __nonnull(x) +#define __nonnull_all +#endif + +#if __GNUC_PREREQ__(3, 4) +#define __fastcall __attribute__((__fastcall__)) +#define __result_use_check __attribute__((__warn_unused_result__)) +#else +#define __fastcall +#define __result_use_check +#endif + +#if __GNUC_PREREQ__(4, 1) +#define __returns_twice __attribute__((__returns_twice__)) +#else +#define __returns_twice +#endif + +#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable) +#define __unreachable() __builtin_unreachable() +#else +#define __unreachable() ((void)0) +#endif + +/* XXX: should use `#if __STDC_VERSION__ < 199901'. */ +#if !__GNUC_PREREQ__(2, 7) +#define __func__ NULL +#endif + +/* + * GCC 2.95 provides `__restrict' as an extension to C90 to support the + * C99-specific `restrict' type qualifier. We happen to use `__restrict' as + * a way to define the `restrict' type qualifier without disturbing older + * software that is unaware of C99 keywords. + */ +#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95) +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 +#define __restrict +#else +#define __restrict restrict +#endif +#endif + +/* + * GNU C version 2.96 adds explicit branch prediction so that + * the CPU back-end can hint the processor and also so that + * code blocks can be reordered such that the predicted path + * sees a more linear flow, thus improving cache behavior, etc. + * + * The following two macros provide us with a way to utilize this + * compiler feature. Use __predict_true() if you expect the expression + * to evaluate to true, and __predict_false() if you expect the + * expression to evaluate to false. + * + * A few notes about usage: + * + * * Generally, __predict_false() error condition checks (unless + * you have some _strong_ reason to do otherwise, in which case + * document it), and/or __predict_true() `no-error' condition + * checks, assuming you want to optimize for the no-error case. + * + * * Other than that, if you don't know the likelihood of a test + * succeeding from empirical or other `hard' evidence, don't + * make predictions. + * + * * These are meant to be used in places that are run `a lot'. + * It is wasteful to make predictions in code that is run + * seldomly (e.g. at subsystem initialization time) as the + * basic block reordering that this affects can often generate + * larger code. + */ +#if __GNUC_PREREQ__(2, 96) +#define __predict_true(exp) __builtin_expect((exp), 1) +#define __predict_false(exp) __builtin_expect((exp), 0) +#else +#define __predict_true(exp) (exp) +#define __predict_false(exp) (exp) +#endif + +#if __GNUC_PREREQ__(4, 0) +#define __null_sentinel __attribute__((__sentinel__)) +#define __exported __attribute__((__visibility__("default"))) +/* Only default visibility is supported on PE/COFF targets. */ +#ifndef __CYGWIN__ +#define __hidden __attribute__((__visibility__("hidden"))) +#else +#define __hidden +#endif +#else +#define __null_sentinel +#define __exported +#define __hidden +#endif + +#define __offsetof(type, field) offsetof(type, field) +#define __rangeof(type, start, end) \ + (__offsetof(type, end) - __offsetof(type, start)) + +/* + * Given the pointer x to the member m of the struct s, return + * a pointer to the containing structure. When using GCC, we first + * assign pointer x to a local variable, to check that its type is + * compatible with member m. + */ +#if __GNUC_PREREQ__(3, 1) +#define __containerof(x, s, m) ({ \ + const volatile __typeof(((s *)0)->m) *__x = (x); \ + __DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\ +}) +#else +#define __containerof(x, s, m) \ + __DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m)) +#endif + +/* + * Compiler-dependent macros to declare that functions take printf-like + * or scanf-like arguments. They are null except for versions of gcc + * that are known to support the features properly (old versions of gcc-2 + * didn't permit keeping the keywords out of the application namespace). + */ +#if !__GNUC_PREREQ__(2, 7) +#define __printflike(fmtarg, firstvararg) +#define __scanflike(fmtarg, firstvararg) +#define __format_arg(fmtarg) +#define __strfmonlike(fmtarg, firstvararg) +#define __strftimelike(fmtarg, firstvararg) +#else +#define __printflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#define __scanflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) +#define __format_arg(fmtarg) __attribute__((__format_arg__ (fmtarg))) +#define __strfmonlike(fmtarg, firstvararg) \ + __attribute__((__format__ (__strfmon__, fmtarg, firstvararg))) +#define __strftimelike(fmtarg, firstvararg) \ + __attribute__((__format__ (__strftime__, fmtarg, firstvararg))) +#endif + +/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ +#if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \ + defined(__GNUC__) +#define __printf0like(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) +#else +#define __printf0like(fmtarg, firstvararg) +#endif + +#if defined(__GNUC__) +#define __strong_reference(sym,aliassym) \ + extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))) +#ifdef __ELF__ +#ifdef __STDC__ +#define __weak_reference(sym,alias) \ + __asm__(".weak " #alias); \ + __asm__(".equ " #alias ", " #sym) +#define __warn_references(sym,msg) \ + __asm__(".section .gnu.warning." #sym); \ + __asm__(".asciz \"" msg "\""); \ + __asm__(".previous") +#define __sym_compat(sym,impl,verid) \ + __asm__(".symver " #impl ", " #sym "@" #verid) +#define __sym_default(sym,impl,verid) \ + __asm__(".symver " #impl ", " #sym "@@" #verid) +#else +#define __weak_reference(sym,alias) \ + __asm__(".weak alias"); \ + __asm__(".equ alias, sym") +#define __warn_references(sym,msg) \ + __asm__(".section .gnu.warning.sym"); \ + __asm__(".asciz \"msg\""); \ + __asm__(".previous") +#define __sym_compat(sym,impl,verid) \ + __asm__(".symver impl, sym@verid") +#define __sym_default(impl,sym,verid) \ + __asm__(".symver impl, sym@@verid") +#endif /* __STDC__ */ +#else /* !__ELF__ */ +#ifdef __STDC__ +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs \"" msg "\",30,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#else +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs msg,30,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#endif /* __STDC__ */ +#endif /* __ELF__ */ +#endif /* __GNUC__ */ + +#ifndef __FBSDID +#define __FBSDID(s) struct __hack +#endif + +#ifndef __RCSID +#define __RCSID(s) struct __hack +#endif + +#ifndef __RCSID_SOURCE +#define __RCSID_SOURCE(s) struct __hack +#endif + +#ifndef __SCCSID +#define __SCCSID(s) struct __hack +#endif + +#ifndef __COPYRIGHT +#define __COPYRIGHT(s) struct __hack +#endif + +#ifndef __DECONST +#define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var)) +#endif + +#ifndef __DEVOLATILE +#define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var)) +#endif + +#ifndef __DEQUALIFY +#define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var)) +#endif + +/* + * Nullability qualifiers: currently only supported by Clang. + */ +#if !(defined(__clang__) && __has_feature(nullability)) +#define _Nonnull +#define _Nullable +#define _Null_unspecified +#define __NULLABILITY_PRAGMA_PUSH +#define __NULLABILITY_PRAGMA_POP +#else +#define __NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wnullability-completeness\"") +#define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop") +#endif + +/* + * Type Safety Checking + * + * Clang provides additional attributes to enable checking type safety + * properties that cannot be enforced by the C type system. + */ + +#if __has_attribute(__argument_with_type_tag__) && \ + __has_attribute(__type_tag_for_datatype__) +#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) \ + __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx))) +#define __datatype_type_tag(kind, type) \ + __attribute__((__type_tag_for_datatype__(kind, type))) +#else +#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) +#define __datatype_type_tag(kind, type) +#endif + +/* + * Lock annotations. + * + * Clang provides support for doing basic thread-safety tests at + * compile-time, by marking which locks will/should be held when + * entering/leaving a functions. + * + * Furthermore, it is also possible to annotate variables and structure + * members to enforce that they are only accessed when certain locks are + * held. + */ + +#if __has_extension(c_thread_safety_attributes) +#define __lock_annotate(x) __attribute__((x)) +#else +#define __lock_annotate(x) +#endif + +/* Structure implements a lock. */ +/* FIXME: Use __lockable__, etc. to avoid colliding with user namespace macros, + * once clang is fixed: https://bugs.llvm.org/show_bug.cgi?id=34319 */ +#define __lockable __lock_annotate(lockable) + +/* Function acquires an exclusive or shared lock. */ +#define __locks_exclusive(...) \ + __lock_annotate(exclusive_lock_function(__VA_ARGS__)) +#define __locks_shared(...) \ + __lock_annotate(shared_lock_function(__VA_ARGS__)) + +/* Function attempts to acquire an exclusive or shared lock. */ +#define __trylocks_exclusive(...) \ + __lock_annotate(exclusive_trylock_function(__VA_ARGS__)) +#define __trylocks_shared(...) \ + __lock_annotate(shared_trylock_function(__VA_ARGS__)) + +/* Function releases a lock. */ +#define __unlocks(...) __lock_annotate(unlock_function(__VA_ARGS__)) + +/* Function asserts that an exclusive or shared lock is held. */ +#define __asserts_exclusive(...) \ + __lock_annotate(assert_exclusive_lock(__VA_ARGS__)) +#define __asserts_shared(...) \ + __lock_annotate(assert_shared_lock(__VA_ARGS__)) + +/* Function requires that an exclusive or shared lock is or is not held. */ +#define __requires_exclusive(...) \ + __lock_annotate(exclusive_locks_required(__VA_ARGS__)) +#define __requires_shared(...) \ + __lock_annotate(shared_locks_required(__VA_ARGS__)) +#define __requires_unlocked(...) \ + __lock_annotate(locks_excluded(__VA_ARGS__)) + +/* Function should not be analyzed. */ +#define __no_lock_analysis __lock_annotate(no_thread_safety_analysis) + +/* + * Function or variable should not be sanitized, e.g., by AddressSanitizer. + * GCC has the nosanitize attribute, but as a function attribute only, and + * warns on use as a variable attribute. + */ +#if __has_attribute(no_sanitize) && defined(__clang__) +#ifdef _KERNEL +#define __nosanitizeaddress __attribute__((no_sanitize("kernel-address"))) +#define __nosanitizememory __attribute__((no_sanitize("kernel-memory"))) +#else +#define __nosanitizeaddress __attribute__((no_sanitize("address"))) +#define __nosanitizememory __attribute__((no_sanitize("memory"))) +#endif +#define __nosanitizethread __attribute__((no_sanitize("thread"))) +#else +#define __nosanitizeaddress +#define __nosanitizememory +#define __nosanitizethread +#endif + +/* Guard variables and structure members by lock. */ +#define __guarded_by(x) __lock_annotate(guarded_by(x)) +#define __pt_guarded_by(x) __lock_annotate(pt_guarded_by(x)) + +/* Alignment builtins for better type checking and improved code generation. */ +/* Provide fallback versions for other compilers (GCC/Clang < 10): */ +#if !__has_builtin(__builtin_is_aligned) +#define __builtin_is_aligned(x, align) \ + (((__uintptr_t)x & ((align) - 1)) == 0) +#endif +#if !__has_builtin(__builtin_align_up) +#define __builtin_align_up(x, align) \ + ((__typeof__(x))(((__uintptr_t)(x)+((align)-1))&(~((align)-1)))) +#endif +#if !__has_builtin(__builtin_align_down) +#define __builtin_align_down(x, align) \ + ((__typeof__(x))((x)&(~((align)-1)))) +#endif + +#define __align_up(x, y) __builtin_align_up(x, y) +#define __align_down(x, y) __builtin_align_down(x, y) +#define __is_aligned(x, y) __builtin_is_aligned(x, y) + +#endif /* !_SYS_CDEFS_H_ */ diff --git a/include/sys/config.h b/include/sys/config.h new file mode 100644 index 0000000..5dcc77a --- /dev/null +++ b/include/sys/config.h @@ -0,0 +1,314 @@ +#ifndef __SYS_CONFIG_H__ +#define __SYS_CONFIG_H__ + +#include /* floating point macros */ +#include /* POSIX defs */ + +#ifdef __aarch64__ +#define MALLOC_ALIGNMENT 16 +#endif + +#ifdef __AMDGCN__ +#define __DYNAMIC_REENT__ +#endif + +/* exceptions first */ +#if defined(__H8500__) || defined(__W65__) +#define __SMALL_BITFIELDS +/* ??? This conditional is true for the h8500 and the w65, defining H8300 + in those cases probably isn't the right thing to do. */ +#define H8300 1 +#endif + +/* 16 bit integer machines */ +#if defined(__Z8001__) || defined(__Z8002__) || defined(__H8500__) || defined(__W65__) || defined (__mn10200__) || defined (__AVR__) || defined (__MSP430__) + +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX 32767 +#define UINT_MAX 65535 +#endif + +#if defined (__H8300__) || defined (__H8300H__) || defined(__H8300S__) || defined (__H8300SX__) +#define __SMALL_BITFIELDS +#define H8300 1 +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#endif + +#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) +#ifndef __INT32__ +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX 32767 +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#else /* INT32 */ +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX 2147483647 +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#endif /* INT32 */ + +#endif /* CR16C */ + +#if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__) +#define __SMALL_BITFIELDS +#endif + +#ifdef __W65__ +#define __SMALL_BITFIELDS +#endif + +#if defined(__D10V__) +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define _POINTER_INT short +#endif + +#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define _POINTER_INT short +#endif + +#if defined(__m68k__) || defined(__mc68000__) || defined(__riscv) +#define _READ_WRITE_RETURN_TYPE _ssize_t +#endif + +#ifdef ___AM29K__ +#define _FLOAT_RET double +#endif + +#ifdef __i386__ +#ifndef __unix__ +/* in other words, go32 */ +#define _FLOAT_RET double +#endif +#if defined(__linux__) || defined(__RDOS__) +/* we want the reentrancy structure to be returned by a function */ +#define __DYNAMIC_REENT__ +#define HAVE_GETDATE +#define _READ_WRITE_RETURN_TYPE _ssize_t +#define __LARGE64_FILES 1 +/* we use some glibc header files so turn on glibc large file feature */ +#define _LARGEFILE64_SOURCE 1 +#endif +#endif + +#ifdef __mn10200__ +#define __SMALL_BITFIELDS +#endif + +#ifdef __AVR__ +#define __SMALL_BITFIELDS +#define _POINTER_INT short +#endif + +#if defined(__v850) && !defined(__rtems__) +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__sda__)) +#endif + +/* For the PowerPC eabi, force the _impure_ptr to be in .sdata */ +#if defined(__PPC__) +#if defined(_CALL_SYSV) +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) +#endif +#ifdef __SPE__ +#define _LONG_DOUBLE double +#endif +#endif + +/* Configure small REENT structure for Xilinx MicroBlaze platforms */ +#if defined (__MICROBLAZE__) && !defined(__rtems__) +#ifndef _REENT_SMALL +#define _REENT_SMALL +#endif +/* Xilinx XMK uses Unix98 mutex */ +#ifdef __XMK__ +#define _UNIX98_THREAD_MUTEX_ATTRIBUTES +#endif +#endif + +#if defined(__mips__) && !defined(__rtems__) +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) +#endif + +#ifdef __xstormy16__ +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define MALLOC_ALIGNMENT 8 +#define _POINTER_INT short +#define __BUFSIZ__ 16 +#define _REENT_SMALL +#endif + +#if defined __MSP430__ +#ifndef _REENT_SMALL +#define _REENT_SMALL +#endif + +#define __BUFSIZ__ 256 +#define __SMALL_BITFIELDS + +#ifdef __MSP430X_LARGE__ +#define _POINTER_INT __int20 +#else +#define _POINTER_INT int +#endif +#endif + +#ifdef __m32c__ +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define MALLOC_ALIGNMENT 8 +#if defined(__r8c_cpu__) || defined(__m16c_cpu__) +#define _POINTER_INT short +#else +#define _POINTER_INT long +#endif +#define __BUFSIZ__ 16 +#define _REENT_SMALL +#endif /* __m32c__ */ + +#ifdef __SPU__ +#define MALLOC_ALIGNMENT 16 +#define __CUSTOM_FILE_IO__ +#endif + +#if defined(__or1k__) || defined(__or1knd__) +#define __DYNAMIC_REENT__ +#endif + +/* This block should be kept in sync with GCC's limits.h. The point + of having these definitions here is to not include limits.h, which + would pollute the user namespace, while still using types of the + the correct widths when deciding how to define __int32_t and + __int64_t. */ +#ifndef __INT_MAX__ +# ifdef INT_MAX +# define __INT_MAX__ INT_MAX +# else +# define __INT_MAX__ 2147483647 +# endif +#endif + +#ifndef __LONG_MAX__ +# ifdef LONG_MAX +# define __LONG_MAX__ LONG_MAX +# else +# if defined (__alpha__) || (defined (__sparc__) && defined(__arch64__)) \ + || defined (__sparcv9) +# define __LONG_MAX__ 9223372036854775807L +# else +# define __LONG_MAX__ 2147483647L +# endif /* __alpha__ || sparc64 */ +# endif +#endif +/* End of block that should be kept in sync with GCC's limits.h. */ + +#ifndef _POINTER_INT +#define _POINTER_INT long +#endif + +#ifdef __frv__ +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) +#endif +#undef __RAND_MAX +#if __INT_MAX__ == 32767 +#define __RAND_MAX 32767 +#else +#define __RAND_MAX 0x7fffffff +#endif + +#if defined(__CYGWIN__) +#include +#endif + +#if defined(__rtems__) +#define __FILENAME_MAX__ 255 +#define _READ_WRITE_RETURN_TYPE _ssize_t +#define __DYNAMIC_REENT__ +#endif + +#ifndef __EXPORT +#define __EXPORT +#endif + +#ifndef __IMPORT +#define __IMPORT +#endif + +/* Define return type of read/write routines. In POSIX, the return type + for read()/write() is "ssize_t" but legacy newlib code has been using + "int" for some time. If not specified, "int" is defaulted. */ +#ifndef _READ_WRITE_RETURN_TYPE +#define _READ_WRITE_RETURN_TYPE int +#endif +/* Define `count' parameter of read/write routines. In POSIX, the `count' + parameter is "size_t" but legacy newlib code has been using "int" for some + time. If not specified, "int" is defaulted. */ +#ifndef _READ_WRITE_BUFSIZE_TYPE +#define _READ_WRITE_BUFSIZE_TYPE int +#endif + +#ifndef __WCHAR_MAX__ +#if __INT_MAX__ == 32767 || defined (_WIN32) +#define __WCHAR_MAX__ 0xffffu +#endif +#endif + +/* See if small reent asked for at configuration time and + is not chosen by the platform by default. */ +#ifdef _WANT_REENT_SMALL +#ifndef _REENT_SMALL +#define _REENT_SMALL +#endif +#endif + +#ifdef _WANT_USE_LONG_TIME_T +#ifndef _USE_LONG_TIME_T +#define _USE_LONG_TIME_T +#endif +#endif + +#ifdef _WANT_USE_GDTOA +#ifndef _USE_GDTOA +#define _USE_GDTOA +#endif +#endif + +#ifdef _WANT_REENT_BACKWARD_BINARY_COMPAT +#ifndef _REENT_BACKWARD_BINARY_COMPAT +#define _REENT_BACKWARD_BINARY_COMPAT +#endif +#endif + +#ifdef _WANT_REENT_THREAD_LOCAL +#ifndef _REENT_THREAD_LOCAL +#define _REENT_THREAD_LOCAL +#endif +#endif + +/* If _MB_EXTENDED_CHARSETS_ALL is set, we want all of the extended + charsets. The extended charsets add a few functions and a couple + of tables of a few K each. */ +#ifdef _MB_EXTENDED_CHARSETS_ALL +#define _MB_EXTENDED_CHARSETS_ISO 1 +#define _MB_EXTENDED_CHARSETS_WINDOWS 1 +#endif + +#endif /* __SYS_CONFIG_H__ */ diff --git a/include/sys/custom_file.h b/include/sys/custom_file.h new file mode 100644 index 0000000..96314fb --- /dev/null +++ b/include/sys/custom_file.h @@ -0,0 +1,2 @@ +#error System-specific custom_file.h is missing. + diff --git a/include/sys/dir.h b/include/sys/dir.h new file mode 100644 index 0000000..220150d --- /dev/null +++ b/include/sys/dir.h @@ -0,0 +1,10 @@ +/* BSD predecessor of POSIX.1 and struct dirent */ + +#ifndef _SYS_DIR_H_ +#define _SYS_DIR_H_ + +#include + +#define direct dirent + +#endif /*_SYS_DIR_H_*/ diff --git a/include/sys/dirent.h b/include/sys/dirent.h new file mode 100644 index 0000000..a3fb5c0 --- /dev/null +++ b/include/sys/dirent.h @@ -0,0 +1,13 @@ +/* includes , which is this file. On a + system which supports , this file is overridden by + dirent.h in the libc/sys/.../sys directory. On a system which does + not support , we will get this file which uses #error to force + an error. */ + +#ifdef __cplusplus +extern "C" { +#endif +#error " not supported" +#ifdef __cplusplus +} +#endif diff --git a/include/sys/endian.h b/include/sys/endian.h new file mode 100644 index 0000000..3685322 --- /dev/null +++ b/include/sys/endian.h @@ -0,0 +1,207 @@ +/*- + * Copyright (c) 2002 Thomas Moestl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: head/sys/sys/endian.h 208331 2010-05-20 06:16:13Z phk $ + */ + +#ifndef _SYS_ENDIAN_H_ +#define _SYS_ENDIAN_H_ + +#include +#include +#include + +#ifndef _UINT8_T_DECLARED +typedef __uint8_t uint8_t; +#define _UINT8_T_DECLARED +#endif + +#ifndef _UINT16_T_DECLARED +typedef __uint16_t uint16_t; +#define _UINT16_T_DECLARED +#endif + +#ifndef _UINT32_T_DECLARED +typedef __uint32_t uint32_t; +#define _UINT32_T_DECLARED +#endif + +#ifndef _UINT64_T_DECLARED +typedef __uint64_t uint64_t; +#define _UINT64_T_DECLARED +#endif + +/* + * General byte order swapping functions. + */ +#define bswap16(x) __bswap16(x) +#define bswap32(x) __bswap32(x) +#define bswap64(x) __bswap64(x) + +/* + * Host to big endian, host to little endian, big endian to host, and little + * endian to host byte order functions as detailed in byteorder(9). + */ +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define htobe16(x) bswap16((x)) +#define htobe32(x) bswap32((x)) +#define htobe64(x) bswap64((x)) +#define htole16(x) ((uint16_t)(x)) +#define htole32(x) ((uint32_t)(x)) +#define htole64(x) ((uint64_t)(x)) + +#define be16toh(x) bswap16((x)) +#define be32toh(x) bswap32((x)) +#define be64toh(x) bswap64((x)) +#define le16toh(x) ((uint16_t)(x)) +#define le32toh(x) ((uint32_t)(x)) +#define le64toh(x) ((uint64_t)(x)) +#else /* _BYTE_ORDER != _LITTLE_ENDIAN */ +#define htobe16(x) ((uint16_t)(x)) +#define htobe32(x) ((uint32_t)(x)) +#define htobe64(x) ((uint64_t)(x)) +#define htole16(x) bswap16((x)) +#define htole32(x) bswap32((x)) +#define htole64(x) bswap64((x)) + +#define be16toh(x) ((uint16_t)(x)) +#define be32toh(x) ((uint32_t)(x)) +#define be64toh(x) ((uint64_t)(x)) +#define le16toh(x) bswap16((x)) +#define le32toh(x) bswap32((x)) +#define le64toh(x) bswap64((x)) +#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ + +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ + +static __inline uint16_t +be16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[0] << 8) | p[1]); +} + +static __inline uint32_t +be32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | + ((uint32_t)p[2] << 8) | p[3]); +} + +static __inline uint64_t +be64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4)); +} + +static __inline uint16_t +le16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[1] << 8) | p[0]); +} + +static __inline uint32_t +le32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16) | + ((uint32_t)p[1] << 8) | p[0]); +} + +static __inline uint64_t +le64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p)); +} + +static __inline void +be16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 8) & 0xff; + p[1] = u & 0xff; +} + +static __inline void +be32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 24) & 0xff; + p[1] = (u >> 16) & 0xff; + p[2] = (u >> 8) & 0xff; + p[3] = u & 0xff; +} + +static __inline void +be64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + be32enc(p, (uint32_t)(u >> 32)); + be32enc(p + 4, (uint32_t)(u & 0xffffffffU)); +} + +static __inline void +le16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; +} + +static __inline void +le32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; + p[2] = (u >> 16) & 0xff; + p[3] = (u >> 24) & 0xff; +} + +static __inline void +le64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + le32enc(p, (uint32_t)(u & 0xffffffffU)); + le32enc(p + 4, (uint32_t)(u >> 32)); +} + +#endif /* _SYS_ENDIAN_H_ */ diff --git a/include/sys/errno.h b/include/sys/errno.h new file mode 100644 index 0000000..f150971 --- /dev/null +++ b/include/sys/errno.h @@ -0,0 +1,198 @@ +/* errno is not a global variable, because that would make using it + non-reentrant. Instead, its address is returned by the function + __errno. */ + +#ifndef _SYS_ERRNO_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_ERRNO_H_ + +#include + +#ifdef _REENT_THREAD_LOCAL +#define errno (_tls_errno) +#else /* _REENT_THREAD_LOCAL */ + +#ifndef _REENT_ONLY +#define errno (*__errno()) +extern int *__errno (void); +#endif + +#endif /* _REENT_THREAD_LOCAL */ + +/* Please don't use these variables directly. + Use strerror instead. */ +extern __IMPORT const char * const _sys_errlist[]; +extern __IMPORT int _sys_nerr; +#ifdef __CYGWIN__ +extern __IMPORT const char * const sys_errlist[]; +extern __IMPORT int sys_nerr; +extern __IMPORT char *program_invocation_name; +extern __IMPORT char *program_invocation_short_name; +#endif + +#define __errno_r(ptr) _REENT_ERRNO(ptr) + +#define EPERM 1 /* Not owner */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No children */ +#define EAGAIN 11 /* No more processes */ +#define ENOMEM 12 /* Not enough space */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENOTBLK 15 /* Block device required */ +#endif +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* File descriptor value too large */ +#define ENOTTY 25 /* Not a character device */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Mathematics argument out of domain of function */ +#define ERANGE 34 /* Result too large */ +#define ENOMSG 35 /* No message of desired type */ +#define EIDRM 36 /* Identifier removed */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ECHRNG 37 /* Channel number out of range */ +#define EL2NSYNC 38 /* Level 2 not synchronized */ +#define EL3HLT 39 /* Level 3 halted */ +#define EL3RST 40 /* Level 3 reset */ +#define ELNRNG 41 /* Link number out of range */ +#define EUNATCH 42 /* Protocol driver not attached */ +#define ENOCSI 43 /* No CSI structure available */ +#define EL2HLT 44 /* Level 2 halted */ +#endif +#define EDEADLK 45 /* Deadlock */ +#define ENOLCK 46 /* No lock */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define EBADE 50 /* Invalid exchange */ +#define EBADR 51 /* Invalid request descriptor */ +#define EXFULL 52 /* Exchange full */ +#define ENOANO 53 /* No anode */ +#define EBADRQC 54 /* Invalid request code */ +#define EBADSLT 55 /* Invalid slot */ +#define EDEADLOCK 56 /* File locking deadlock error */ +#define EBFONT 57 /* Bad font file fmt */ +#endif +#define ENOSTR 60 /* Not a stream */ +#define ENODATA 61 /* No data (for no delay io) */ +#define ETIME 62 /* Stream ioctl timeout */ +#define ENOSR 63 /* No stream resources */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* The object is remote */ +#endif +#define ENOLINK 67 /* Virtual circuit is gone */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#endif +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 74 /* Multihop attempted */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ELBIN 75 /* Inode is remote (not really error) */ +#define EDOTDOT 76 /* Cross mount point (not really error) */ +#endif +#define EBADMSG 77 /* Bad message */ +#define EFTYPE 79 /* Inappropriate file type or format */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENOTUNIQ 80 /* Given log. name not unique */ +#define EBADFD 81 /* f.d. invalid for this operation */ +#define EREMCHG 82 /* Remote address changed */ +#define ELIBACC 83 /* Can't access a needed shared lib */ +#define ELIBBAD 84 /* Accessing a corrupted shared lib */ +#define ELIBSCN 85 /* .lib section in a.out corrupted */ +#define ELIBMAX 86 /* Attempting to link in too many libs */ +#define ELIBEXEC 87 /* Attempting to exec a shared library */ +#endif +#define ENOSYS 88 /* Function not implemented */ +#ifdef __CYGWIN__ +#define ENMFILE 89 /* No more files */ +#endif +#define ENOTEMPTY 90 /* Directory not empty */ +#define ENAMETOOLONG 91 /* File or path name too long */ +#define ELOOP 92 /* Too many symbolic links */ +#define EOPNOTSUPP 95 /* Operation not supported on socket */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */ +#define EPROTOTYPE 107 /* Protocol wrong type for socket */ +#define ENOTSOCK 108 /* Socket operation on non-socket */ +#define ENOPROTOOPT 109 /* Protocol not available */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ESHUTDOWN 110 /* Can't send after socket shutdown */ +#endif +#define ECONNREFUSED 111 /* Connection refused */ +#define EADDRINUSE 112 /* Address already in use */ +#define ECONNABORTED 113 /* Software caused connection abort */ +#define ENETUNREACH 114 /* Network is unreachable */ +#define ENETDOWN 115 /* Network interface is not configured */ +#define ETIMEDOUT 116 /* Connection timed out */ +#define EHOSTDOWN 117 /* Host is down */ +#define EHOSTUNREACH 118 /* Host is unreachable */ +#define EINPROGRESS 119 /* Connection already in progress */ +#define EALREADY 120 /* Socket already connected */ +#define EDESTADDRREQ 121 /* Destination address required */ +#define EMSGSIZE 122 /* Message too long */ +#define EPROTONOSUPPORT 123 /* Unknown protocol */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ESOCKTNOSUPPORT 124 /* Socket type not supported */ +#endif +#define EADDRNOTAVAIL 125 /* Address not available */ +#define ENETRESET 126 /* Connection aborted by network */ +#define EISCONN 127 /* Socket is already connected */ +#define ENOTCONN 128 /* Socket is not connected */ +#define ETOOMANYREFS 129 +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define EPROCLIM 130 +#define EUSERS 131 +#endif +#define EDQUOT 132 +#define ESTALE 133 +#define ENOTSUP 134 /* Not supported */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENOMEDIUM 135 /* No medium (in tape drive) */ +#endif +#ifdef __CYGWIN__ +#define ENOSHARE 136 /* No such host or network path */ +#define ECASECLASH 137 /* Filename exists with different case */ +#endif +#define EILSEQ 138 /* Illegal byte sequence */ +#define EOVERFLOW 139 /* Value too large for defined data type */ +#define ECANCELED 140 /* Operation canceled */ +#define ENOTRECOVERABLE 141 /* State not recoverable */ +#define EOWNERDEAD 142 /* Previous owner died */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ESTRPIPE 143 /* Streams pipe error */ +#endif +#define EWOULDBLOCK EAGAIN /* Operation would block */ + +#define __ELASTERROR 2000 /* Users can add values starting here */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_ERRNO_H */ diff --git a/include/sys/fcntl.h b/include/sys/fcntl.h new file mode 100644 index 0000000..be85f40 --- /dev/null +++ b/include/sys/fcntl.h @@ -0,0 +1,4 @@ +#ifndef _SYS_FCNTL_H_ +#define _SYS_FCNTL_H_ +#include +#endif diff --git a/include/sys/features.h b/include/sys/features.h new file mode 100644 index 0000000..45476ce --- /dev/null +++ b/include/sys/features.h @@ -0,0 +1,538 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2014. + * + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + +#ifndef _SYS_FEATURES_H +#define _SYS_FEATURES_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <_newlib_version.h> + +/* Macro to test version of GCC. Returns 0 for non-GCC or too old GCC. */ +#ifndef __GNUC_PREREQ +# if defined __GNUC__ && defined __GNUC_MINOR__ +# define __GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +# else +# define __GNUC_PREREQ(maj, min) 0 +# endif +#endif /* __GNUC_PREREQ */ +/* Version with trailing underscores for BSD compatibility. */ +#define __GNUC_PREREQ__(ma, mi) __GNUC_PREREQ(ma, mi) + + +/* + * Feature test macros control which symbols are exposed by the system + * headers. Any of these must be defined before including any headers. + * + * __STRICT_ANSI__ (defined by gcc -ansi, -std=c90, -std=c99, or -std=c11) + * ISO C + * + * _POSIX_SOURCE (deprecated by _POSIX_C_SOURCE=1) + * _POSIX_C_SOURCE >= 1 + * POSIX.1-1990 + * + * _POSIX_C_SOURCE >= 2 + * POSIX.2-1992 + * + * _POSIX_C_SOURCE >= 199309L + * POSIX.1b-1993 Real-time extensions + * + * _POSIX_C_SOURCE >= 199506L + * POSIX.1c-1995 Threads extensions + * + * _POSIX_C_SOURCE >= 200112L + * POSIX.1-2001 and C99 + * + * _POSIX_C_SOURCE >= 200809L + * POSIX.1-2008 + * + * _XOPEN_SOURCE + * POSIX.1-1990 and XPG4 + * + * _XOPEN_SOURCE_EXTENDED + * SUSv1 (POSIX.2-1992 plus XPG4v2) + * + * _XOPEN_SOURCE >= 500 + * SUSv2 (POSIX.1c-1995 plus XSI) + * + * _XOPEN_SOURCE >= 600 + * SUSv3 (POSIX.1-2001 plus XSI) and C99 + * + * _XOPEN_SOURCE >= 700 + * SUSv4 (POSIX.1-2008 plus XSI) + * + * _ISOC99_SOURCE or gcc -std=c99 or g++ + * ISO C99 + * + * _ISOC11_SOURCE or gcc -std=c11 or g++ -std=c++11 + * ISO C11 + * + * _ATFILE_SOURCE (implied by _POSIX_C_SOURCE >= 200809L) + * "at" functions + * + * _LARGEFILE_SOURCE (deprecated by _XOPEN_SOURCE >= 500) + * fseeko, ftello + * + * _GNU_SOURCE + * All of the above plus GNU extensions + * + * _BSD_SOURCE (deprecated by _DEFAULT_SOURCE) + * _SVID_SOURCE (deprecated by _DEFAULT_SOURCE) + * _DEFAULT_SOURCE (or none of the above) + * POSIX-1.2008 with BSD and SVr4 extensions + * + * _FORTIFY_SOURCE = 1 or 2 + * Object Size Checking function wrappers + */ + +#ifdef _GNU_SOURCE +#undef _ATFILE_SOURCE +#define _ATFILE_SOURCE 1 +#undef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE 1 +#undef _ISOC99_SOURCE +#define _ISOC99_SOURCE 1 +#undef _ISOC11_SOURCE +#define _ISOC11_SOURCE 1 +#undef _POSIX_SOURCE +#define _POSIX_SOURCE 1 +#undef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200809L +#undef _XOPEN_SOURCE +#define _XOPEN_SOURCE 700 +#undef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED 1 +#endif /* _GNU_SOURCE */ + +#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || \ + (!defined(__STRICT_ANSI__) && !defined(_ANSI_SOURCE) && \ + !defined(_ISOC99_SOURCE) && !defined(_POSIX_SOURCE) && \ + !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) +#undef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE 1 +#endif + +#if defined(_DEFAULT_SOURCE) +#undef _POSIX_SOURCE +#define _POSIX_SOURCE 1 +#undef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200809L +#endif + +#if !defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + ((!defined(__STRICT_ANSI__) && !defined(_ANSI_SOURCE)) || \ + (_XOPEN_SOURCE - 0) >= 500) +#define _POSIX_SOURCE 1 +#if !defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE - 0) >= 700 +#define _POSIX_C_SOURCE 200809L +#elif (_XOPEN_SOURCE - 0) >= 600 +#define _POSIX_C_SOURCE 200112L +#elif (_XOPEN_SOURCE - 0) >= 500 +#define _POSIX_C_SOURCE 199506L +#elif (_XOPEN_SOURCE - 0) < 500 +#define _POSIX_C_SOURCE 2 +#endif +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809 +#undef _ATFILE_SOURCE +#define _ATFILE_SOURCE 1 +#endif + +/* + * The following private macros are used throughout the headers to control + * which symbols should be exposed. They are for internal use only, as + * indicated by the leading double underscore, and must never be used outside + * of these headers. + * + * __POSIX_VISIBLE + * any version of POSIX.1; enabled by default, or with _POSIX_SOURCE, + * any value of _POSIX_C_SOURCE, or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 2 + * POSIX.2-1992; enabled by default, with _POSIX_C_SOURCE >= 2, + * or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 199309 + * POSIX.1b-1993; enabled by default, with _POSIX_C_SOURCE >= 199309L, + * or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 199506 + * POSIX.1c-1995; enabled by default, with _POSIX_C_SOURCE >= 199506L, + * or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 200112 + * POSIX.1-2001; enabled by default, with _POSIX_C_SOURCE >= 200112L, + * or _XOPEN_SOURCE >= 600. + * + * __POSIX_VISIBLE >= 200809 + * POSIX.1-2008; enabled by default, with _POSIX_C_SOURCE >= 200809L, + * or _XOPEN_SOURCE >= 700. + * + * __XSI_VISIBLE + * XPG4 XSI extensions; enabled with any version of _XOPEN_SOURCE. + * + * __XSI_VISIBLE >= 4 + * SUSv1 XSI extensions; enabled with both _XOPEN_SOURCE and + * _XOPEN_SOURCE_EXTENDED together. + * + * __XSI_VISIBLE >= 500 + * SUSv2 XSI extensions; enabled with _XOPEN_SOURCE >= 500. + * + * __XSI_VISIBLE >= 600 + * SUSv3 XSI extensions; enabled with _XOPEN_SOURCE >= 600. + * + * __XSI_VISIBLE >= 700 + * SUSv4 XSI extensions; enabled with _XOPEN_SOURCE >= 700. + * + * __ISO_C_VISIBLE >= 1999 + * ISO C99; enabled with gcc -std=c99 or newer (on by default since GCC 5), + * any version of C++, or with _ISOC99_SOURCE, _POSIX_C_SOURCE >= 200112L, + * or _XOPEN_SOURCE >= 600. + * + * __ISO_C_VISIBLE >= 2011 + * ISO C11; enabled with gcc -std=c11 or newer (on by default since GCC 5), + * g++ -std=c++11 or newer (on by default since GCC 6), or with + * _ISOC11_SOURCE. + * + * __ATFILE_VISIBLE + * "at" functions; enabled by default, with _ATFILE_SOURCE, + * _POSIX_C_SOURCE >= 200809L, or _XOPEN_SOURCE >= 700. + * + * __LARGEFILE_VISIBLE + * fseeko, ftello; enabled with _LARGEFILE_SOURCE or _XOPEN_SOURCE >= 500. + * + * __BSD_VISIBLE + * BSD extensions; enabled by default, or with _BSD_SOURCE. + * + * __SVID_VISIBLE + * SVr4 extensions; enabled by default, or with _SVID_SOURCE. + * + * __MISC_VISIBLE + * Extensions found in both BSD and SVr4 (shorthand for + * (__BSD_VISIBLE || __SVID_VISIBLE)), or newlib-specific + * extensions; enabled by default. + * + * __GNU_VISIBLE + * GNU extensions; enabled with _GNU_SOURCE. + * + * __SSP_FORTIFY_LEVEL + * Object Size Checking; defined to 0 (off), 1, or 2. + * + * In all cases above, "enabled by default" means either by defining + * _DEFAULT_SOURCE, or by not defining any of the public feature test macros. + */ + +#ifdef _ATFILE_SOURCE +#define __ATFILE_VISIBLE 1 +#else +#define __ATFILE_VISIBLE 0 +#endif + +#ifdef _DEFAULT_SOURCE +#define __BSD_VISIBLE 1 +#else +#define __BSD_VISIBLE 0 +#endif + +#ifdef _GNU_SOURCE +#define __GNU_VISIBLE 1 +#else +#define __GNU_VISIBLE 0 +#endif + +#if defined(_ISOC11_SOURCE) || \ + (__STDC_VERSION__ - 0) >= 201112L || (__cplusplus - 0) >= 201103L +#define __ISO_C_VISIBLE 2011 +#elif defined(_ISOC99_SOURCE) || (_POSIX_C_SOURCE - 0) >= 200112L || \ + (__STDC_VERSION__ - 0) >= 199901L || defined(__cplusplus) +#define __ISO_C_VISIBLE 1999 +#else +#define __ISO_C_VISIBLE 1990 +#endif + +#if defined(_LARGEFILE_SOURCE) || (_XOPEN_SOURCE - 0) >= 500 +#define __LARGEFILE_VISIBLE 1 +#else +#define __LARGEFILE_VISIBLE 0 +#endif + +#ifdef _DEFAULT_SOURCE +#define __MISC_VISIBLE 1 +#else +#define __MISC_VISIBLE 0 +#endif + +#if (_POSIX_C_SOURCE - 0) >= 200809L +#define __POSIX_VISIBLE 200809 +#elif (_POSIX_C_SOURCE - 0) >= 200112L +#define __POSIX_VISIBLE 200112 +#elif (_POSIX_C_SOURCE - 0) >= 199506L +#define __POSIX_VISIBLE 199506 +#elif (_POSIX_C_SOURCE - 0) >= 199309L +#define __POSIX_VISIBLE 199309 +#elif (_POSIX_C_SOURCE - 0) >= 2 || defined(_XOPEN_SOURCE) +#define __POSIX_VISIBLE 199209 +#elif defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) +#define __POSIX_VISIBLE 199009 +#else +#define __POSIX_VISIBLE 0 +#endif + +#ifdef _DEFAULT_SOURCE +#define __SVID_VISIBLE 1 +#else +#define __SVID_VISIBLE 0 +#endif + +#if (_XOPEN_SOURCE - 0) >= 700 +#define __XSI_VISIBLE 700 +#elif (_XOPEN_SOURCE - 0) >= 600 +#define __XSI_VISIBLE 600 +#elif (_XOPEN_SOURCE - 0) >= 500 +#define __XSI_VISIBLE 500 +#elif defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED) +#define __XSI_VISIBLE 4 +#elif defined(_XOPEN_SOURCE) +#define __XSI_VISIBLE 1 +#else +#define __XSI_VISIBLE 0 +#endif + +#if _FORTIFY_SOURCE > 0 && !defined(__cplusplus) && !defined(__lint__) && \ + (__OPTIMIZE__ > 0 || defined(__clang__)) && __GNUC_PREREQ__(4, 1) && \ + !defined(_LIBC) +# if _FORTIFY_SOURCE > 1 +# define __SSP_FORTIFY_LEVEL 2 +# else +# define __SSP_FORTIFY_LEVEL 1 +# endif +#else +# define __SSP_FORTIFY_LEVEL 0 +#endif + +/* RTEMS adheres to POSIX -- 1003.1b with some features from annexes. */ + +#ifdef __rtems__ +#define _POSIX_JOB_CONTROL 1 +#define _POSIX_SAVED_IDS 1 +#define _POSIX_VERSION 199309L +#define _POSIX_ASYNCHRONOUS_IO 1 +#define _POSIX_FSYNC 1 +#define _POSIX_MAPPED_FILES 1 +#define _POSIX_MEMLOCK 1 +#define _POSIX_MEMLOCK_RANGE 1 +#define _POSIX_MEMORY_PROTECTION 1 +#define _POSIX_MESSAGE_PASSING 1 +#define _POSIX_MONOTONIC_CLOCK 200112L +#define _POSIX_CLOCK_SELECTION 200112L +#define _POSIX_PRIORITIZED_IO 1 +#define _POSIX_PRIORITY_SCHEDULING 1 +#define _POSIX_REALTIME_SIGNALS 1 +#define _POSIX_SEMAPHORES 1 +#define _POSIX_SHARED_MEMORY_OBJECTS 1 +#define _POSIX_SYNCHRONIZED_IO 1 +#define _POSIX_TIMERS 1 +#define _POSIX_BARRIERS 200112L +#define _POSIX_READER_WRITER_LOCKS 200112L +#define _POSIX_SPIN_LOCKS 200112L + + +/* In P1003.1b but defined by drafts at least as early as P1003.1c/D10 */ +#define _POSIX_THREADS 1 +#define _POSIX_THREAD_ATTR_STACKADDR 1 +#define _POSIX_THREAD_ATTR_STACKSIZE 1 +#define _POSIX_THREAD_PRIORITY_SCHEDULING 1 +#define _POSIX_THREAD_PRIO_INHERIT 1 +#define _POSIX_THREAD_PRIO_PROTECT 1 +#define _POSIX_THREAD_PROCESS_SHARED 1 +#define _POSIX_THREAD_SAFE_FUNCTIONS 1 + +/* P1003.4b/D8 defines the constants below this comment. */ +#define _POSIX_SPAWN 1 +#define _POSIX_TIMEOUTS 1 +#define _POSIX_CPUTIME 1 +#define _POSIX_THREAD_CPUTIME 1 +#define _POSIX_SPORADIC_SERVER 1 +#define _POSIX_THREAD_SPORADIC_SERVER 1 +#define _POSIX_DEVICE_CONTROL 1 +#define _POSIX_DEVCTL_DIRECTION 1 +#define _POSIX_INTERRUPT_CONTROL 1 +#define _POSIX_ADVISORY_INFO 1 + +/* UNIX98 added some new pthread mutex attributes */ +#define _UNIX98_THREAD_MUTEX_ATTRIBUTES 1 + +/* POSIX 1003.26-2003 defined device control method */ +#define _POSIX_26_VERSION 200312L + +#endif + +/* XMK loosely adheres to POSIX -- 1003.1 */ +#ifdef __XMK__ +#define _POSIX_THREADS 1 +#define _POSIX_THREAD_PRIORITY_SCHEDULING 1 +#endif + + +#ifdef __svr4__ +# define _POSIX_JOB_CONTROL 1 +# define _POSIX_SAVED_IDS 1 +# define _POSIX_VERSION 199009L +#endif + +#ifdef __CYGWIN__ + +#if __POSIX_VISIBLE >= 200809 +#define _POSIX_VERSION 200809L +#define _POSIX2_VERSION 200809L +#elif __POSIX_VISIBLE >= 200112 +#define _POSIX_VERSION 200112L +#define _POSIX2_VERSION 200112L +#elif __POSIX_VISIBLE >= 199506 +#define _POSIX_VERSION 199506L +#define _POSIX2_VERSION 199506L +#elif __POSIX_VISIBLE >= 199309 +#define _POSIX_VERSION 199309L +#define _POSIX2_VERSION 199209L +#elif __POSIX_VISIBLE >= 199209 +#define _POSIX_VERSION 199009L +#define _POSIX2_VERSION 199209L +#elif __POSIX_VISIBLE +#define _POSIX_VERSION 199009L +#endif +#if __XSI_VISIBLE >= 4 +#define _XOPEN_VERSION __XSI_VISIBLE +#endif + +#define _POSIX_ADVISORY_INFO 200809L +#define _POSIX_ASYNCHRONOUS_IO 200809L +#define _POSIX_BARRIERS 200809L +#define _POSIX_CHOWN_RESTRICTED 1 +#define _POSIX_CLOCK_SELECTION 200809L +#define _POSIX_CPUTIME 200809L +#define _POSIX_FSYNC 200809L +#define _POSIX_IPV6 200809L +#define _POSIX_JOB_CONTROL 1 +#define _POSIX_MAPPED_FILES 200809L +/* #define _POSIX_MEMLOCK -1 */ +#define _POSIX_MEMLOCK_RANGE 200809L +#define _POSIX_MEMORY_PROTECTION 200809L +#define _POSIX_MESSAGE_PASSING 200809L +#define _POSIX_MONOTONIC_CLOCK 200809L +#define _POSIX_NO_TRUNC 1 +/* #define _POSIX_PRIORITIZED_IO -1 */ +#define _POSIX_PRIORITY_SCHEDULING 200809L +#define _POSIX_RAW_SOCKETS 200809L +#define _POSIX_READER_WRITER_LOCKS 200809L +#define _POSIX_REALTIME_SIGNALS 200809L +#define _POSIX_REGEXP 1 +#define _POSIX_SAVED_IDS 1 +#define _POSIX_SEMAPHORES 200809L +#define _POSIX_SHARED_MEMORY_OBJECTS 200809L +#define _POSIX_SHELL 1 +#define _POSIX_SPAWN 200809L +#define _POSIX_SPIN_LOCKS 200809L +/* #define _POSIX_SPORADIC_SERVER -1 */ +#define _POSIX_SYNCHRONIZED_IO 200809L +#define _POSIX_THREAD_ATTR_STACKADDR 200809L +#define _POSIX_THREAD_ATTR_STACKSIZE 200809L +#define _POSIX_THREAD_CPUTIME 200809L +/* #define _POSIX_THREAD_PRIO_INHERIT -1 */ +/* #define _POSIX_THREAD_PRIO_PROTECT -1 */ +#define _POSIX_THREAD_PRIORITY_SCHEDULING 200809L +#define _POSIX_THREAD_PROCESS_SHARED 200809L +#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L +/* #define _POSIX_THREAD_SPORADIC_SERVER -1 */ +#define _POSIX_THREADS 200809L +#define _POSIX_TIMEOUTS 200809L +#define _POSIX_TIMERS 200809L +/* #define _POSIX_TRACE -1 */ +/* #define _POSIX_TRACE_EVENT_FILTER -1 */ +/* #define _POSIX_TRACE_INHERIT -1 */ +/* #define _POSIX_TRACE_LOG -1 */ +/* #define _POSIX_TYPED_MEMORY_OBJECTS -1 */ +#define _POSIX_VDISABLE '\0' + +#if __POSIX_VISIBLE >= 2 +#define _POSIX2_C_VERSION _POSIX2_VERSION +#define _POSIX2_C_BIND _POSIX2_VERSION +#define _POSIX2_C_DEV _POSIX2_VERSION +#define _POSIX2_CHAR_TERM _POSIX2_VERSION +/* #define _POSIX2_FORT_DEV -1 */ +/* #define _POSIX2_FORT_RUN -1 */ +/* #define _POSIX2_LOCALEDEF -1 */ +/* #define _POSIX2_PBS -1 */ +/* #define _POSIX2_PBS_ACCOUNTING -1 */ +/* #define _POSIX2_PBS_CHECKPOINT -1 */ +/* #define _POSIX2_PBS_LOCATE -1 */ +/* #define _POSIX2_PBS_MESSAGE -1 */ +/* #define _POSIX2_PBS_TRACK -1 */ +#define _POSIX2_SW_DEV _POSIX2_VERSION +#define _POSIX2_UPE _POSIX2_VERSION +#endif /* __POSIX_VISIBLE >= 2 */ + +#define _POSIX_V6_ILP32_OFF32 -1 +#ifdef __LP64__ +#define _POSIX_V6_ILP32_OFFBIG -1 +#define _POSIX_V6_LP64_OFF64 1 +#define _POSIX_V6_LPBIG_OFFBIG 1 +#else +#define _POSIX_V6_ILP32_OFFBIG 1 +#define _POSIX_V6_LP64_OFF64 -1 +#define _POSIX_V6_LPBIG_OFFBIG -1 +#endif +#define _POSIX_V7_ILP32_OFF32 _POSIX_V6_ILP32_OFF32 +#define _POSIX_V7_ILP32_OFFBIG _POSIX_V6_ILP32_OFFBIG +#define _POSIX_V7_LP64_OFF64 _POSIX_V6_LP64_OFF64 +#define _POSIX_V7_LPBIG_OFFBIG _POSIX_V6_LPBIG_OFFBIG +#define _XBS5_ILP32_OFF32 _POSIX_V6_ILP32_OFF32 +#define _XBS5_ILP32_OFFBIG _POSIX_V6_ILP32_OFFBIG +#define _XBS5_LP64_OFF64 _POSIX_V6_LP64_OFF64 +#define _XBS5_LPBIG_OFFBIG _POSIX_V6_LPBIG_OFFBIG + +#if __XSI_VISIBLE +#define _XOPEN_CRYPT 1 +#define _XOPEN_ENH_I18N 1 +/* #define _XOPEN_LEGACY -1 */ +/* #define _XOPEN_REALTIME -1 */ +/* #define _XOPEN_REALTIME_THREADS -1 */ +#define _XOPEN_SHM 1 +/* #define _XOPEN_STREAMS -1 */ +/* #define _XOPEN_UNIX -1 */ +#endif /* __XSI_VISIBLE */ + +/* + * newlib's wide char conversion functions were updated on + * 2019-01-12 + * to UNICODE version: + * 11.0.0 released 2018-06-05 + */ +#define __STDC_ISO_10646__ 201806L + +#endif /* __CYGWIN__ */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_FEATURES_H */ diff --git a/include/sys/fenv.h b/include/sys/fenv.h new file mode 100644 index 0000000..e0983fa --- /dev/null +++ b/include/sys/fenv.h @@ -0,0 +1,113 @@ +/* + (c) Copyright 2019 Joel Sherrill + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _SYS_FENV_H_ +#define _SYS_FENV_H_ + +/******************************************************************************* + * THIS FILE IS A TEMPLATE, INTENDED TO BE USED AS A STARTING POINT FOR + * TARGET-SPECIFIC FLOATING-POINT IMPLEMENTATIONS. NOTES BELOW HIGHLIGHT THE + * BASICS OF WHAT NEEDS TO BE DEFINED. THE DEFAULT IMPLEMTATION IS + * DEGENERATE, WITH ALL FUNCTIONS RETURNING ERROR AND NO EXCEPTIONS AND NO + * ROUNDING MODES DEFINED (SINCE NONE ARE SUPPORTED). + * THE MACRO VALUES ARE EXAMPLES ONLY, ALTHOUGH TAKEN FROM A WORKING + * IMPLEMENTATION. + * REMOVE THIS NOTICE WHEN COPYING TO A REAL IMPLEMENTATION, REPLACING IT WITH + * ANY TARGET-SPECIFIC NOTES OF INTEREST. THE FENV FUNCTION MAN PAGES POINT TO + * THIS FILE AS A MEANS OF DETERMINING A FUNCTIONAL VS. NON-FUNCTIONAL + * IMPLEMENTATION. + ******************************************************************************/ +/* + * The following macros are to be defined if the respective exception is + * supported by the implementation, each with a unique bit mask: + * + * FE_DIVBYZERO + * FE_INEXACT + * FE_INVALID + * FE_OVERFLOW + * FE_UNDERFLOW + * + * Other implementation-specific exceptions may be defined, and must start + * with FE_ followed by a capital letter. + * + * FE_ALL_EXCEPT must be defined as the logical OR of all exceptions. + */ +//#define FE_DIVBYZERO 0x00000001 +//#define FE_INEXACT 0x00000002 +//#define FE_INVALID 0x00000004 +//#define FE_OVERFLOW 0x00000008 +//#define FE_UNDERFLOW 0x00000010 + +//#define FE_ALL_EXCEPT \ + //(FE_DIVBYZERO|FE_INEXACT|FE_INVALID|FE_OVERFLOW|FE_UNDERFLOW) +#define FE_ALL_EXCEPT 0 /* NONE SUPPORTED IN PLACEHOLDER TEMPLATE */ + +/* + * The following macros are to be defined if the respective rounding + * direction is supported by the implementation via the fegetround() and + * fesetround() functions, each with a unique positive value. + * + * FE_DOWNWARD + * FE_TONEAREST + * FE_TOWARDZERO + * FE_UPWARD + * + * Other implementation-specific rounding modes may be defined, and must start + * with FE_ followed by a capital letter. + */ +//#define FE_DOWNWARD 1 +//#define FE_TONEAREST 2 +//#define FE_TOWARDZERO 3 +//#define FE_UPWARD 4 + +/* + * The following typedefs are required. These should be defined properly + * to support the architecture specific implementation. See the C and + * POSIX standards for details: + * + * fenv_t + * fexcept_t + */ +typedef int fenv_t; +typedef int fexcept_t; + +/* + * Lastly, a FE_DFL_ENV macro must be defined, representing a pointer + * to const fenv_t that contains the value of the default floating point + * environment. + * + * NOTE: The extern'ed variable fe_default_env_p is an implementation + * detail of this stub. FE_DFL_ENV must point to an instance of + * fenv_t with the default fenv_t. The format of fenv_t and where + * FE_DFL_ENV is are implementation specific. + */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV _fe_dfl_env + +#endif /* _SYS_FENV_H_ */ diff --git a/include/sys/file.h b/include/sys/file.h new file mode 100644 index 0000000..58d4fac --- /dev/null +++ b/include/sys/file.h @@ -0,0 +1,2 @@ + +#include diff --git a/include/sys/iconvnls.h b/include/sys/iconvnls.h new file mode 100644 index 0000000..d4ee0b7 --- /dev/null +++ b/include/sys/iconvnls.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy. + * Rights transferred to Franklin Electronic Publishers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Funtions, macros, etc implimented in iconv library but used by other + * NLS-related subsystems too. + */ +#ifndef __SYS_ICONVNLS_H__ +#define __SYS_ICONVNLS_H__ + +#include <_ansi.h> +#include +#include +#include + +/* Iconv data path environment variable name */ +#define NLS_ENVVAR_NAME "NLSPATH" +/* Default NLSPATH value */ +#define ICONV_DEFAULT_NLSPATH "/usr/locale" +/* Direction markers */ +#define ICONV_NLS_FROM 0 +#define ICONV_NLS_TO 1 + +void +_iconv_nls_get_state (iconv_t cd, mbstate_t *ps, int direction); + +int +_iconv_nls_set_state (iconv_t cd, mbstate_t *ps, int direction); + +int +_iconv_nls_is_stateful (iconv_t cd, int direction); + +int +_iconv_nls_get_mb_cur_max (iconv_t cd, int direction); + +size_t +_iconv_nls_conv (struct _reent *rptr, iconv_t cd, + const char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft); + +const char * +_iconv_nls_construct_filename (struct _reent *rptr, const char *file, + const char *dir, const char *ext); + + +int +_iconv_nls_open (struct _reent *rptr, const char *encoding, + iconv_t *towc, iconv_t *fromwc, int flag); + +char * +_iconv_resolve_encoding_name (struct _reent *rptr, const char *ca); + +#endif /* __SYS_ICONVNLS_H__ */ + diff --git a/include/sys/lock.h b/include/sys/lock.h new file mode 100644 index 0000000..5289049 --- /dev/null +++ b/include/sys/lock.h @@ -0,0 +1,69 @@ +#ifndef __SYS_LOCK_H__ +#define __SYS_LOCK_H__ + +/* dummy lock routines for single-threaded aps */ + +#include +#include <_ansi.h> + +#if !defined(_RETARGETABLE_LOCKING) + +typedef int _LOCK_T; +typedef int _LOCK_RECURSIVE_T; + +#define __LOCK_INIT(class,lock) static int lock = 0; +#define __LOCK_INIT_RECURSIVE(class,lock) static int lock = 0; +#define __lock_init(lock) ((void) 0) +#define __lock_init_recursive(lock) ((void) 0) +#define __lock_close(lock) ((void) 0) +#define __lock_close_recursive(lock) ((void) 0) +#define __lock_acquire(lock) ((void) 0) +#define __lock_acquire_recursive(lock) ((void) 0) +#define __lock_try_acquire(lock) ((void) 0) +#define __lock_try_acquire_recursive(lock) ((void) 0) +#define __lock_release(lock) ((void) 0) +#define __lock_release_recursive(lock) ((void) 0) + +#else + +#ifdef __cplusplus +extern "C" { +#endif + +struct __lock; +typedef struct __lock * _LOCK_T; +#define _LOCK_RECURSIVE_T _LOCK_T + +#define __LOCK_INIT(class,lock) extern struct __lock __lock_ ## lock; \ + class _LOCK_T lock = &__lock_ ## lock +#define __LOCK_INIT_RECURSIVE(class,lock) __LOCK_INIT(class,lock) + +extern void __retarget_lock_init(_LOCK_T *lock); +#define __lock_init(lock) __retarget_lock_init(&lock) +extern void __retarget_lock_init_recursive(_LOCK_T *lock); +#define __lock_init_recursive(lock) __retarget_lock_init_recursive(&lock) +extern void __retarget_lock_close(_LOCK_T lock); +#define __lock_close(lock) __retarget_lock_close(lock) +extern void __retarget_lock_close_recursive(_LOCK_T lock); +#define __lock_close_recursive(lock) __retarget_lock_close_recursive(lock) +extern void __retarget_lock_acquire(_LOCK_T lock); +#define __lock_acquire(lock) __retarget_lock_acquire(lock) +extern void __retarget_lock_acquire_recursive(_LOCK_T lock); +#define __lock_acquire_recursive(lock) __retarget_lock_acquire_recursive(lock) +extern int __retarget_lock_try_acquire(_LOCK_T lock); +#define __lock_try_acquire(lock) __retarget_lock_try_acquire(lock) +extern int __retarget_lock_try_acquire_recursive(_LOCK_T lock); +#define __lock_try_acquire_recursive(lock) \ + __retarget_lock_try_acquire_recursive(lock) +extern void __retarget_lock_release(_LOCK_T lock); +#define __lock_release(lock) __retarget_lock_release(lock) +extern void __retarget_lock_release_recursive(_LOCK_T lock); +#define __lock_release_recursive(lock) __retarget_lock_release_recursive(lock) + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(_RETARGETABLE_LOCKING) */ + +#endif /* __SYS_LOCK_H__ */ diff --git a/include/sys/mman.h b/include/sys/mman.h new file mode 100644 index 0000000..c36687f --- /dev/null +++ b/include/sys/mman.h @@ -0,0 +1,166 @@ +/* $OpenBSD: mman.h,v 1.35 2022/10/07 14:59:39 deraadt Exp $ */ +/* $NetBSD: mman.h,v 1.11 1995/03/26 20:24:23 jtc Exp $ */ + +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mman.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _KERNEL +#include +#endif + +/* + * Protections are chosen from these bits, or-ed together + */ +#define PROT_NONE 0x00 /* no permissions */ +#define PROT_READ 0x01 /* pages can be read */ +#define PROT_WRITE 0x02 /* pages can be written */ +#define PROT_EXEC 0x04 /* pages can be executed */ + +/* + * Flags contain sharing type and options. + * Sharing types; choose one. + */ +#define MAP_SHARED 0x0001 /* share changes */ +#define MAP_PRIVATE 0x0002 /* changes are private */ + +/* + * Other flags + */ +#define MAP_FIXED 0x0010 /* map addr must be exactly as requested */ +#define __MAP_NOREPLACE 0x0800 /* fail if address not available */ +#define MAP_ANON 0x1000 /* allocated from memory, swap space */ +#define MAP_ANONYMOUS MAP_ANON /* alternate POSIX spelling */ +#define __MAP_NOFAULT 0x2000 +#define MAP_STACK 0x4000 /* mapping is used for a stack */ +#define MAP_CONCEAL 0x8000 /* omit from dumps */ + +#define MAP_FLAGMASK 0xfff7 + +#ifndef _KERNEL +/* + * Legacy defines for userland source compatibility. + * Can be removed once no longer needed in base and ports. + */ +#define MAP_COPY MAP_PRIVATE /* "copy" region at mmap time */ +#define MAP_FILE 0 /* map from file (default) */ +#define MAP_HASSEMAPHORE 0 /* region may contain semaphores */ +#define MAP_INHERIT 0 /* region is retained after exec */ +#define MAP_NOEXTEND 0 /* for MAP_FILE, don't change file size */ +#define MAP_NORESERVE 0 /* Sun: don't reserve needed swap area */ +#define MAP_RENAME 0 /* Sun: rename private pages to file */ +#define MAP_TRYFIXED 0 /* attempt hint address, even within heap */ +#endif + +/* + * Error return from mmap() + */ +#define MAP_FAILED ((void *)-1) + +/* + * POSIX memory advisory values. + * Note: keep consistent with the original definitions below. + */ +#define POSIX_MADV_NORMAL 0 /* no further special treatment */ +#define POSIX_MADV_RANDOM 1 /* expect random page references */ +#define POSIX_MADV_SEQUENTIAL 2 /* expect sequential page references */ +#define POSIX_MADV_WILLNEED 3 /* will need these pages */ +#define POSIX_MADV_DONTNEED 4 /* don't need these pages */ + +#if __BSD_VISIBLE +/* + * Original advice values, equivalent to POSIX definitions, + * and few implementation-specific ones. For in-kernel and historic use. + */ +#define MADV_NORMAL POSIX_MADV_NORMAL +#define MADV_RANDOM POSIX_MADV_RANDOM +#define MADV_SEQUENTIAL POSIX_MADV_SEQUENTIAL +#define MADV_WILLNEED POSIX_MADV_WILLNEED +#define MADV_DONTNEED POSIX_MADV_DONTNEED +#define MADV_SPACEAVAIL 5 /* insure that resources are reserved */ +#define MADV_FREE 6 /* pages are empty, free them */ +#endif + +/* + * Flags to minherit + */ +#define MAP_INHERIT_SHARE 0 /* share with child */ +#define MAP_INHERIT_COPY 1 /* copy into child */ +#define MAP_INHERIT_NONE 2 /* absent from child */ +#define MAP_INHERIT_ZERO 3 /* zero in child */ + +/* + * Flags to msync + */ +#define MS_ASYNC 0x01 /* perform asynchronous writes */ +#define MS_SYNC 0x02 /* perform synchronous writes */ +#define MS_INVALIDATE 0x04 /* invalidate cached data */ + +/* + * Flags to mlockall + */ +#define MCL_CURRENT 0x01 /* lock all pages currently mapped */ +#define MCL_FUTURE 0x02 /* lock all pages mapped in the future */ + +#ifndef _KERNEL +#include + +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef __size_t size_t; +#endif + +#ifndef _OFF_T_DEFINED_ +#define _OFF_T_DEFINED_ +typedef __off_t off_t; +#endif + +__BEGIN_DECLS +void * mmap(void *, size_t, int, int, int, off_t); +int mprotect(void *, size_t, int); +int munmap(void *, size_t); +int msync(void *, size_t, int); +int mlock(const void *, size_t); +int munlock(const void *, size_t); +int mlockall(int); +int munlockall(void); +#if __BSD_VISIBLE +int madvise(void *, size_t, int); +int minherit(void *, size_t, int); +int mimmutable(void *, size_t); +void * mquery(void *, size_t, int, int, int, off_t); +#endif +int posix_madvise(void *, size_t, int); +int shm_open(const char *, int, __mode_t); +int shm_unlink(const char *); +int shm_mkstemp(char *); +__END_DECLS + +#endif /* !_KERNEL */ diff --git a/include/sys/param.h b/include/sys/param.h new file mode 100644 index 0000000..9a6f115 --- /dev/null +++ b/include/sys/param.h @@ -0,0 +1,35 @@ +/* This is a dummy file, not customized for any + particular system. If there is a param.h in libc/sys/SYSDIR/sys, + it will override this one. */ + +#ifndef _SYS_PARAM_H +# define _SYS_PARAM_H + +#include +#include +#include +#include + +#ifndef NBBY +# define NBBY 8 /* number of bits in a byte */ +#endif +#ifndef HZ +# define HZ (60) +#endif +#ifndef NOFILE +# define NOFILE (60) +#endif +#ifndef PATHSIZE +# define PATHSIZE (1024) +#endif + +#define MAXPATHLEN PATH_MAX + +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif + +#endif diff --git a/include/sys/queue.h b/include/sys/queue.h new file mode 100644 index 0000000..6392b62 --- /dev/null +++ b/include/sys/queue.h @@ -0,0 +1,919 @@ +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + * $FreeBSD$ + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +#include + +/* + * This file defines four types of data structures: singly-linked lists, + * singly-linked tail queues, lists and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may be traversed in either direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * Below is a summary of implemented functions where: + * + means the macro is available + * - means the macro is not available + * s means the macro is available but is slow (runs in O(n) time) + * + * SLIST LIST STAILQ TAILQ + * _HEAD + + + + + * _CLASS_HEAD + + + + + * _HEAD_INITIALIZER + + + + + * _ENTRY + + + + + * _CLASS_ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - + - + + * _LAST - - + + + * _LAST_FAST - - - + + * _FOREACH + + + + + * _FOREACH_FROM + + + + + * _FOREACH_SAFE + + + + + * _FOREACH_FROM_SAFE + + + + + * _FOREACH_REVERSE - - - + + * _FOREACH_REVERSE_FROM - - - + + * _FOREACH_REVERSE_SAFE - - - + + * _FOREACH_REVERSE_FROM_SAFE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _CONCAT s s + + + * _REMOVE_AFTER + - + - + * _REMOVE_HEAD + - + - + * _REMOVE s + s + + * _SWAP + + + + + * + */ +#ifdef QUEUE_MACRO_DEBUG +#warn Use QUEUE_MACRO_DEBUG_TRACE and/or QUEUE_MACRO_DEBUG_TRASH +#define QUEUE_MACRO_DEBUG_TRACE +#define QUEUE_MACRO_DEBUG_TRASH +#endif + +#ifdef QUEUE_MACRO_DEBUG_TRACE +/* Store the last 2 places the queue element or head was altered */ +struct qm_trace { + unsigned long lastline; + unsigned long prevline; + const char *lastfile; + const char *prevfile; +}; + +#define TRACEBUF struct qm_trace trace; +#define TRACEBUF_INITIALIZER { __LINE__, 0, __FILE__, NULL } , + +#define QMD_TRACE_HEAD(head) do { \ + (head)->trace.prevline = (head)->trace.lastline; \ + (head)->trace.prevfile = (head)->trace.lastfile; \ + (head)->trace.lastline = __LINE__; \ + (head)->trace.lastfile = __FILE__; \ +} while (0) + +#define QMD_TRACE_ELEM(elem) do { \ + (elem)->trace.prevline = (elem)->trace.lastline; \ + (elem)->trace.prevfile = (elem)->trace.lastfile; \ + (elem)->trace.lastline = __LINE__; \ + (elem)->trace.lastfile = __FILE__; \ +} while (0) + +#else /* !QUEUE_MACRO_DEBUG_TRACE */ +#define QMD_TRACE_ELEM(elem) +#define QMD_TRACE_HEAD(head) +#define TRACEBUF +#define TRACEBUF_INITIALIZER +#endif /* QUEUE_MACRO_DEBUG_TRACE */ + +#ifdef QUEUE_MACRO_DEBUG_TRASH +#define TRASHIT(x) do {(x) = (void *)-1;} while (0) +#define QMD_IS_TRASHED(x) ((x) == (void *)(intptr_t)-1) +#else /* !QUEUE_MACRO_DEBUG_TRASH */ +#define TRASHIT(x) +#define QMD_IS_TRASHED(x) 0 +#endif /* QUEUE_MACRO_DEBUG_TRASH */ + +#if defined(QUEUE_MACRO_DEBUG_TRACE) || defined(QUEUE_MACRO_DEBUG_TRASH) +#define QMD_SAVELINK(name, link) void **name = (void *)&(link) +#else /* !QUEUE_MACRO_DEBUG_TRACE && !QUEUE_MACRO_DEBUG_TRASH */ +#define QMD_SAVELINK(name, link) +#endif /* QUEUE_MACRO_DEBUG_TRACE || QUEUE_MACRO_DEBUG_TRASH */ + +#ifdef __cplusplus +/* + * In C++ there can be structure lists and class lists: + */ +#define QUEUE_TYPEOF(type) type +#else +#define QUEUE_TYPEOF(type) struct type +#endif + +/* + * Singly-linked List declarations. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_CLASS_HEAD(name, type) \ +struct name { \ + class type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +#define SLIST_CLASS_ENTRY(type) \ +struct { \ + class type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +#define QMD_SLIST_CHECK_PREVPTR(prevp, elm) do { \ + if (*(prevp) != (elm)) \ + panic("Bad prevptr *(%p) == %p != %p", \ + (prevp), *(prevp), (elm)); \ +} while (0) +#else +#define QMD_SLIST_CHECK_PREVPTR(prevp, elm) +#endif + +#define SLIST_CONCAT(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head1); \ + if (curelm == NULL) { \ + if ((SLIST_FIRST(head1) = SLIST_FIRST(head2)) != NULL) \ + SLIST_INIT(head2); \ + } else if (SLIST_FIRST(head2) != NULL) { \ + while (SLIST_NEXT(curelm, field) != NULL) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_NEXT(curelm, field) = SLIST_FIRST(head2); \ + SLIST_INIT(head2); \ + } \ +} while (0) + +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define SLIST_FIRST(head) ((head)->slh_first) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for ((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != NULL; \ + (varp) = &SLIST_NEXT((var), field)) + +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_REMOVE_AFTER(curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#define SLIST_REMOVE_AFTER(elm, field) do { \ + SLIST_NEXT(elm, field) = \ + SLIST_NEXT(SLIST_NEXT(elm, field), field); \ +} while (0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +#define SLIST_REMOVE_PREVPTR(prevp, elm, field) do { \ + QMD_SLIST_CHECK_PREVPTR(prevp, elm); \ + *(prevp) = SLIST_NEXT(elm, field); \ + TRASHIT((elm)->field.sle_next); \ +} while (0) + +#define SLIST_SWAP(head1, head2, type) do { \ + QUEUE_TYPEOF(type) *swap_first = SLIST_FIRST(head1); \ + SLIST_FIRST(head1) = SLIST_FIRST(head2); \ + SLIST_FIRST(head2) = swap_first; \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_CLASS_HEAD(name, type) \ +struct name { \ + class type *stqh_first; /* first element */ \ + class type **stqh_last; /* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +#define STAILQ_CLASS_ENTRY(type) \ +struct { \ + class type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (0) + +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? NULL : \ + __containerof((head)->stqh_last, \ + QUEUE_TYPEOF(type), field.stqe_next)) + +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } \ + else { \ + QUEUE_TYPEOF(type) *curelm = STAILQ_FIRST(head); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + STAILQ_REMOVE_AFTER(head, curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ + if ((STAILQ_NEXT(elm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ + if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_SWAP(head1, head2, type) do { \ + QUEUE_TYPEOF(type) *swap_first = STAILQ_FIRST(head1); \ + QUEUE_TYPEOF(type) **swap_last = (head1)->stqh_last; \ + STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_FIRST(head2) = swap_first; \ + (head2)->stqh_last = swap_last; \ + if (STAILQ_EMPTY(head1)) \ + (head1)->stqh_last = &STAILQ_FIRST(head1); \ + if (STAILQ_EMPTY(head2)) \ + (head2)->stqh_last = &STAILQ_FIRST(head2); \ +} while (0) + + +/* + * List declarations. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_CLASS_HEAD(name, type) \ +struct name { \ + class type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +#define LIST_CLASS_ENTRY(type) \ +struct { \ + class type *le_next; /* next element */ \ + class type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ + +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_LIST_CHECK_HEAD(LIST_HEAD *head, LIST_ENTRY NAME) + * + * If the list is non-empty, validates that the first element of the list + * points back at 'head.' + */ +#define QMD_LIST_CHECK_HEAD(head, field) do { \ + if (LIST_FIRST((head)) != NULL && \ + LIST_FIRST((head))->field.le_prev != \ + &LIST_FIRST((head))) \ + panic("Bad list head %p first->prev != head", (head)); \ +} while (0) + +/* + * QMD_LIST_CHECK_NEXT(TYPE *elm, LIST_ENTRY NAME) + * + * If an element follows 'elm' in the list, validates that the next element + * points back at 'elm.' + */ +#define QMD_LIST_CHECK_NEXT(elm, field) do { \ + if (LIST_NEXT((elm), field) != NULL && \ + LIST_NEXT((elm), field)->field.le_prev != \ + &((elm)->field.le_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +/* + * QMD_LIST_CHECK_PREV(TYPE *elm, LIST_ENTRY NAME) + * + * Validates that the previous element (or head of the list) points to 'elm.' + */ +#define QMD_LIST_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.le_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_LIST_CHECK_HEAD(head, field) +#define QMD_LIST_CHECK_NEXT(elm, field) +#define QMD_LIST_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define LIST_CONCAT(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *curelm = LIST_FIRST(head1); \ + if (curelm == NULL) { \ + if ((LIST_FIRST(head1) = LIST_FIRST(head2)) != NULL) { \ + LIST_FIRST(head2)->field.le_prev = \ + &LIST_FIRST((head1)); \ + LIST_INIT(head2); \ + } \ + } else if (LIST_FIRST(head2) != NULL) { \ + while (LIST_NEXT(curelm, field) != NULL) \ + curelm = LIST_NEXT(curelm, field); \ + LIST_NEXT(curelm, field) = LIST_FIRST(head2); \ + LIST_FIRST(head2)->field.le_prev = &LIST_NEXT(curelm, field); \ + LIST_INIT(head2); \ + } \ +} while (0) + +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LIST_FIRST(head) ((head)->lh_first) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + QMD_LIST_CHECK_NEXT(listelm, field); \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_LIST_CHECK_PREV(listelm, field); \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + QMD_LIST_CHECK_HEAD((head), field); \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_PREV(elm, head, type, field) \ + ((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL : \ + __containerof((elm)->field.le_prev, \ + QUEUE_TYPEOF(type), field.le_next)) + +#define LIST_REMOVE(elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.le_next); \ + QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ + QMD_LIST_CHECK_NEXT(elm, field); \ + QMD_LIST_CHECK_PREV(elm, field); \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ +} while (0) + +#define LIST_SWAP(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *swap_tmp = LIST_FIRST(head1); \ + LIST_FIRST((head1)) = LIST_FIRST((head2)); \ + LIST_FIRST((head2)) = swap_tmp; \ + if ((swap_tmp = LIST_FIRST((head1))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head1)); \ + if ((swap_tmp = LIST_FIRST((head2))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head2)); \ +} while (0) + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_CLASS_HEAD(name, type) \ +struct name { \ + class type *tqh_first; /* first element */ \ + class type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first, TRACEBUF_INITIALIZER } + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +#define TAILQ_CLASS_ENTRY(type) \ +struct { \ + class type *tqe_next; /* next element */ \ + class type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +/* + * Tail queue functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_TAILQ_CHECK_HEAD(TAILQ_HEAD *head, TAILQ_ENTRY NAME) + * + * If the tailq is non-empty, validates that the first element of the tailq + * points back at 'head.' + */ +#define QMD_TAILQ_CHECK_HEAD(head, field) do { \ + if (!TAILQ_EMPTY(head) && \ + TAILQ_FIRST((head))->field.tqe_prev != \ + &TAILQ_FIRST((head))) \ + panic("Bad tailq head %p first->prev != head", (head)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_TAIL(TAILQ_HEAD *head, TAILQ_ENTRY NAME) + * + * Validates that the tail of the tailq is a pointer to pointer to NULL. + */ +#define QMD_TAILQ_CHECK_TAIL(head, field) do { \ + if (*(head)->tqh_last != NULL) \ + panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_NEXT(TYPE *elm, TAILQ_ENTRY NAME) + * + * If an element follows 'elm' in the tailq, validates that the next element + * points back at 'elm.' + */ +#define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ + if (TAILQ_NEXT((elm), field) != NULL && \ + TAILQ_NEXT((elm), field)->field.tqe_prev != \ + &((elm)->field.tqe_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_PREV(TYPE *elm, TAILQ_ENTRY NAME) + * + * Validates that the previous element (or head of the tailq) points to 'elm.' + */ +#define QMD_TAILQ_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.tqe_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_TAILQ_CHECK_HEAD(head, field) +#define QMD_TAILQ_CHECK_TAIL(head, headname) +#define QMD_TAILQ_CHECK_NEXT(elm, field) +#define QMD_TAILQ_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + QMD_TRACE_HEAD(head1); \ + QMD_TRACE_HEAD(head2); \ + } \ +} while (0) + +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_FROM(var, head, headname, field) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE_FROM_SAFE(var, head, headname, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ +} while (0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + QMD_TAILQ_CHECK_NEXT(listelm, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else { \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + } \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&(listelm)->field); \ +} while (0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_TAILQ_CHECK_PREV(listelm, field); \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&(listelm)->field); \ +} while (0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + QMD_TAILQ_CHECK_HEAD(head, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + QMD_TAILQ_CHECK_TAIL(head, field); \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +/* + * The FAST function is fast in that it causes no data access other + * then the access to the head. The standard LAST function above + * will cause a data access of both the element you want and + * the previous element. FAST is very useful for instances when + * you may want to prefetch the last data element. + */ +#define TAILQ_LAST_FAST(head, type, field) \ + (TAILQ_EMPTY(head) ? NULL : __containerof((head)->tqh_last, QUEUE_TYPEOF(type), field.tqe_next)) + +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define TAILQ_REMOVE(head, elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ + QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ + QMD_TAILQ_CHECK_NEXT(elm, field); \ + QMD_TAILQ_CHECK_PREV(elm, field); \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else { \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + QMD_TRACE_HEAD(head); \ + } \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_SWAP(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *swap_first = (head1)->tqh_first; \ + QUEUE_TYPEOF(type) **swap_last = (head1)->tqh_last; \ + (head1)->tqh_first = (head2)->tqh_first; \ + (head1)->tqh_last = (head2)->tqh_last; \ + (head2)->tqh_first = swap_first; \ + (head2)->tqh_last = swap_last; \ + if ((swap_first = (head1)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head1)->tqh_first; \ + else \ + (head1)->tqh_last = &(head1)->tqh_first; \ + if ((swap_first = (head2)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head2)->tqh_first; \ + else \ + (head2)->tqh_last = &(head2)->tqh_first; \ +} while (0) + +#ifdef _KERNEL + +/* + * XXX insque() and remque() are an old way of handling certain queues. + * They bogusly assumes that all queue heads look alike. + */ + +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +#ifdef __GNUC__ + +static __inline void +insque(void *a, void *b) +{ + struct quehead *element = (struct quehead *)a, + *head = (struct quehead *)b; + + element->qh_link = head->qh_link; + element->qh_rlink = head; + head->qh_link = element; + element->qh_link->qh_rlink = element; +} + +static __inline void +remque(void *a) +{ + struct quehead *element = (struct quehead *)a; + + element->qh_link->qh_rlink = element->qh_rlink; + element->qh_rlink->qh_link = element->qh_link; + element->qh_rlink = 0; +} + +#else /* !__GNUC__ */ + +void insque(void *a, void *b); +void remque(void *a); + +#endif /* __GNUC__ */ + +#endif /* _KERNEL */ + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/include/sys/reent.h b/include/sys/reent.h new file mode 100644 index 0000000..c71f75d --- /dev/null +++ b/include/sys/reent.h @@ -0,0 +1,896 @@ +/* This header file provides the reentrancy. */ + +/* WARNING: All identifiers here must begin with an underscore. This file is + included by stdio.h and others and we therefore must only use identifiers + in the namespace allotted to us. */ + +#ifndef _SYS_REENT_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_REENT_H_ + +#include <_ansi.h> +#include +#include + +#define _NULL 0 + +#ifndef __Long +#if __LONG_MAX__ == 2147483647L +#define __Long long +typedef unsigned __Long __ULong; +#elif __INT_MAX__ == 2147483647 +#define __Long int +typedef unsigned __Long __ULong; +#endif +#endif + +#if !defined( __Long) +#include +#endif + +#ifndef __machine_flock_t_defined +#include +typedef _LOCK_RECURSIVE_T _flock_t; +#endif + +#ifndef __Long +#define __Long __int32_t +typedef __uint32_t __ULong; +#endif + +struct _reent; + +struct __locale_t; + +/* + * If _REENT_SMALL is defined, we make struct _reent as small as possible, + * by having nearly everything possible allocated at first use. + */ + +struct _Bigint +{ + struct _Bigint *_next; + int _k, _maxwds, _sign, _wds; + __ULong _x[1]; +}; + +/* needed by reentrant structure */ +struct __tm +{ + int __tm_sec; + int __tm_min; + int __tm_hour; + int __tm_mday; + int __tm_mon; + int __tm_year; + int __tm_wday; + int __tm_yday; + int __tm_isdst; +}; + +/* + * atexit() support. + */ + +#define _ATEXIT_SIZE 32 /* must be at least 32 to guarantee ANSI conformance */ + +struct _on_exit_args { + void * _fnargs[_ATEXIT_SIZE]; /* user fn args */ + void * _dso_handle[_ATEXIT_SIZE]; + /* Bitmask is set if user function takes arguments. */ + __ULong _fntypes; /* type of exit routine - + Must have at least _ATEXIT_SIZE bits */ + /* Bitmask is set if function was registered via __cxa_atexit. */ + __ULong _is_cxa; +}; + +#ifdef _REENT_SMALL +struct _atexit { + struct _atexit *_next; /* next in list */ + int _ind; /* next index in this table */ + void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */ + struct _on_exit_args * _on_exit_args_ptr; +}; +# define _ATEXIT_INIT {_NULL, 0, {_NULL}, _NULL} +#else +struct _atexit { + struct _atexit *_next; /* next in list */ + int _ind; /* next index in this table */ + /* Some entries may already have been called, and will be NULL. */ + void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */ + struct _on_exit_args _on_exit_args; +}; +# define _ATEXIT_INIT {_NULL, 0, {_NULL}, {{_NULL}, {_NULL}, 0, 0}} +#endif + +/* + * Stdio buffers. + * + * This and __FILE are defined here because we need them for struct _reent, + * but we don't want stdio.h included when stdlib.h is. + */ + +struct __sbuf { + unsigned char *_base; + int _size; +}; + +/* + * Stdio state variables. + * + * The following always hold: + * + * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), + * _lbfsize is -_bf._size, else _lbfsize is 0 + * if _flags&__SRD, _w is 0 + * if _flags&__SWR, _r is 0 + * + * This ensures that the getc and putc macros (or inline functions) never + * try to write or read from a file that is in `read' or `write' mode. + * (Moreover, they can, and do, automatically switch from read mode to + * write mode, and back, on "r+" and "w+" files.) + * + * _lbfsize is used only to make the inline line-buffered output stream + * code as compact as possible. + * + * _ub, _up, and _ur are used when ungetc() pushes back more characters + * than fit in the current _bf, or when ungetc() pushes back a character + * that does not match the previous one in _bf. When this happens, + * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff + * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. + */ + +#define _REENT_SMALL_CHECK_INIT(ptr) /* nothing */ + +/* Cygwin must use __sFILE64 for backward compatibility, even though + it's not defining __LARGE64_FILES anymore. To make sure that __sFILE + is never defined, disable it here explicitely. */ +#ifndef __CYGWIN__ + +struct __sFILE { + unsigned char *_p; /* current position in (some) buffer */ + int _r; /* read space left for getc() */ + int _w; /* write space left for putc() */ + short _flags; /* flags, below; this FILE is free if 0 */ + short _file; /* fileno, if Unix descriptor, else -1 */ + struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ + int _lbfsize; /* 0 or -_bf._size, for inline putc */ + +#ifdef _REENT_SMALL + struct _reent *_data; +#endif + + /* operations */ + void * _cookie; /* cookie passed to io functions */ + + _READ_WRITE_RETURN_TYPE (*_read) (struct _reent *, void *, + char *, _READ_WRITE_BUFSIZE_TYPE); + _READ_WRITE_RETURN_TYPE (*_write) (struct _reent *, void *, + const char *, + _READ_WRITE_BUFSIZE_TYPE); + _fpos_t (*_seek) (struct _reent *, void *, _fpos_t, int); + int (*_close) (struct _reent *, void *); + + /* separate buffer for long sequences of ungetc() */ + struct __sbuf _ub; /* ungetc buffer */ + unsigned char *_up; /* saved _p when _p is doing ungetc data */ + int _ur; /* saved _r when _r is counting ungetc data */ + + /* tricks to meet minimum requirements even when malloc() fails */ + unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ + unsigned char _nbuf[1]; /* guarantee a getc() buffer */ + + /* separate buffer for fgetline() when line crosses buffer boundary */ + struct __sbuf _lb; /* buffer for fgetline() */ + + /* Unix stdio files get aligned to block boundaries on fseek() */ + int _blksize; /* stat.st_blksize (may be != _bf._size) */ + _off_t _offset; /* current lseek offset */ + +#ifndef _REENT_SMALL + struct _reent *_data; /* Here for binary compatibility? Remove? */ +#endif + +#ifndef __SINGLE_THREAD__ + _flock_t _lock; /* for thread-safety locking */ +#endif + _mbstate_t _mbstate; /* for wide char stdio functions. */ + int _flags2; /* for future use */ +}; + +#endif /* !__CYGWIN__ */ + +#ifdef __CUSTOM_FILE_IO__ + +/* Get custom _FILE definition. */ +#include + +#else /* !__CUSTOM_FILE_IO__ */ +/* Cygwin must use __sFILE64 for backward compatibility, even though + it's not defining __LARGE64_FILES anymore. It also has to make + sure the name is the same to satisfy C++ name mangling. Overloading + _fpos64_t just fixes a build problem. The _seek64 function is + actually never used without __LARGE64_FILES being defined. */ +#if defined (__LARGE64_FILES) || defined (__CYGWIN__) +#ifdef __CYGWIN__ +#define _fpos64_t _fpos_t +#endif + +struct __sFILE64 { + unsigned char *_p; /* current position in (some) buffer */ + int _r; /* read space left for getc() */ + int _w; /* write space left for putc() */ + short _flags; /* flags, below; this FILE is free if 0 */ + short _file; /* fileno, if Unix descriptor, else -1 */ + struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ + int _lbfsize; /* 0 or -_bf._size, for inline putc */ + + struct _reent *_data; + + /* operations */ + void * _cookie; /* cookie passed to io functions */ + + _READ_WRITE_RETURN_TYPE (*_read) (struct _reent *, void *, + char *, _READ_WRITE_BUFSIZE_TYPE); + _READ_WRITE_RETURN_TYPE (*_write) (struct _reent *, void *, + const char *, + _READ_WRITE_BUFSIZE_TYPE); + _fpos_t (*_seek) (struct _reent *, void *, _fpos_t, int); + int (*_close) (struct _reent *, void *); + + /* separate buffer for long sequences of ungetc() */ + struct __sbuf _ub; /* ungetc buffer */ + unsigned char *_up; /* saved _p when _p is doing ungetc data */ + int _ur; /* saved _r when _r is counting ungetc data */ + + /* tricks to meet minimum requirements even when malloc() fails */ + unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ + unsigned char _nbuf[1]; /* guarantee a getc() buffer */ + + /* separate buffer for fgetline() when line crosses buffer boundary */ + struct __sbuf _lb; /* buffer for fgetline() */ + + /* Unix stdio files get aligned to block boundaries on fseek() */ + int _blksize; /* stat.st_blksize (may be != _bf._size) */ + int _flags2; /* for future use */ + + _off64_t _offset; /* current lseek offset */ + _fpos64_t (*_seek64) (struct _reent *, void *, _fpos64_t, int); + +#ifndef __SINGLE_THREAD__ + _flock_t _lock; /* for thread-safety locking */ +#endif + _mbstate_t _mbstate; /* for wide char stdio functions. */ +}; +typedef struct __sFILE64 __FILE; +#else +typedef struct __sFILE __FILE; +#endif /* __LARGE64_FILES */ +#endif /* !__CUSTOM_FILE_IO__ */ + +extern __FILE __sf[3]; + +struct _glue +{ + struct _glue *_next; + int _niobs; + __FILE *_iobs; +}; + +extern struct _glue __sglue; + +/* + * rand48 family support + * + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ +#define _RAND48_SEED_0 (0x330e) +#define _RAND48_SEED_1 (0xabcd) +#define _RAND48_SEED_2 (0x1234) +#define _RAND48_MULT_0 (0xe66d) +#define _RAND48_MULT_1 (0xdeec) +#define _RAND48_MULT_2 (0x0005) +#define _RAND48_ADD (0x000b) +struct _rand48 { + unsigned short _seed[3]; + unsigned short _mult[3]; + unsigned short _add; +#ifdef _REENT_SMALL + /* Put this in here as well, for good luck. */ + __extension__ unsigned long long _rand_next; +#endif +}; + +/* How big the some arrays are. */ +#define _REENT_EMERGENCY_SIZE 25 +#define _REENT_ASCTIME_SIZE 26 +#define _REENT_SIGNAL_SIZE 24 + +#ifndef _REENT_THREAD_LOCAL + +#ifdef _REENT_BACKWARD_BINARY_COMPAT +#define _REENT_INIT_RESERVED_0 0, +#define _REENT_INIT_RESERVED_1 0, +#define _REENT_INIT_RESERVED_2 0, +#define _REENT_INIT_RESERVED_6_7 _NULL, _ATEXIT_INIT, +#define _REENT_INIT_RESERVED_8 {_NULL, 0, _NULL}, +#else +#define _REENT_INIT_RESERVED_0 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_1 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_2 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_6_7 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_8 /* Nothing to initialize */ +#endif + +/* + * struct _reent + * + * This structure contains the thread-local objects needed by the library. + * It's raison d'etre is to facilitate threads by making all library routines + * reentrant. The exit handler support and FILE maintenance use dedicated + * global objects which are not included in this structure. + */ + +#ifdef _REENT_SMALL + +struct _mprec +{ + /* used by mprec routines */ + struct _Bigint *_result; + int _result_k; + struct _Bigint *_p5s; + struct _Bigint **_freelist; +}; + + +struct _misc_reent +{ + /* miscellaneous reentrant data */ + char *_strtok_last; + _mbstate_t _mblen_state; + _mbstate_t _wctomb_state; + _mbstate_t _mbtowc_state; + char _l64a_buf[8]; + int _getdate_err; + _mbstate_t _mbrlen_state; + _mbstate_t _mbrtowc_state; + _mbstate_t _mbsrtowcs_state; + _mbstate_t _wcrtomb_state; + _mbstate_t _wcsrtombs_state; +}; + +/* This version of _reent is laid out with "int"s in pairs, to help + * ports with 16-bit int's but 32-bit pointers, align nicely. */ +struct _reent +{ + /* As an exception to the above put _errno first for binary + compatibility with non _REENT_SMALL targets. */ + int _errno; /* local copy of errno */ + + /* FILE is a big struct and may change over time. To try to achieve binary + compatibility with future versions, put stdin,stdout,stderr here. + These are pointers into member __sf defined below. */ + __FILE *_stdin, *_stdout, *_stderr; /* XXX */ + + int _inc; /* used by tmpnam */ + + char *_emergency; + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + int _reserved_0; + int _reserved_1; +#endif + struct __locale_t *_locale;/* per-thread locale */ + + struct _mprec *_mp; + + void (*__cleanup) (struct _reent *); + + int _gamma_signgam; + + /* used by some fp conversion routines */ + int _cvtlen; /* should be size_t */ + char *_cvtbuf; + + struct _rand48 *_r48; + struct __tm *_localtime_buf; + char *_asctime_buf; + + /* signal info */ + void (** _sig_func)(int); + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + struct _atexit *_reserved_6; + struct _atexit _reserved_7; + struct _glue _reserved_8; +#endif + + __FILE *__sf; /* file descriptors */ + struct _misc_reent *_misc; /* strtok, multibyte states */ + char *_signal_buf; /* strsignal */ +}; + +# define _REENT_INIT(var) \ + { 0, \ + &__sf[0], \ + &__sf[1], \ + &__sf[2], \ + 0, \ + _NULL, \ + _REENT_INIT_RESERVED_0 \ + _REENT_INIT_RESERVED_1 \ + _NULL, \ + _NULL, \ + _NULL, \ + 0, \ + 0, \ + _NULL, \ + _NULL, \ + _NULL, \ + _NULL, \ + _NULL, \ + _REENT_INIT_RESERVED_6_7 \ + _REENT_INIT_RESERVED_8 \ + _NULL, \ + _NULL, \ + _NULL \ + } + +#define _REENT_INIT_PTR_ZEROED(var) \ + { (var)->_stdin = &__sf[0]; \ + (var)->_stdout = &__sf[1]; \ + (var)->_stderr = &__sf[2]; \ + } + +/* Specify how to handle reent_check malloc failures. */ +#ifdef _REENT_CHECK_VERIFY +#include +#define __reent_assert(x) ((x) ? (void)0 : __assert_func(__FILE__, __LINE__, (char *)0, "REENT malloc succeeded")) +#else +#define __reent_assert(x) ((void)0) +#endif + +#ifdef __CUSTOM_FILE_IO__ +#error Custom FILE I/O and _REENT_SMALL not currently supported. +#endif + +/* Generic _REENT check macro. */ +#define _REENT_CHECK(var, what, type, size, init) do { \ + struct _reent *_r = (var); \ + if (_r->what == NULL) { \ + _r->what = (type)malloc(size); \ + __reent_assert(_r->what); \ + init; \ + } \ +} while (0) + +#define _REENT_CHECK_TM(var) \ + _REENT_CHECK(var, _localtime_buf, struct __tm *, sizeof *((var)->_localtime_buf), \ + /* nothing */) + +#define _REENT_CHECK_ASCTIME_BUF(var) \ + _REENT_CHECK(var, _asctime_buf, char *, _REENT_ASCTIME_SIZE, \ + memset((var)->_asctime_buf, 0, _REENT_ASCTIME_SIZE)) + +/* Handle the dynamically allocated rand48 structure. */ +#define _REENT_INIT_RAND48(var) do { \ + struct _reent *_r = (var); \ + _r->_r48->_seed[0] = _RAND48_SEED_0; \ + _r->_r48->_seed[1] = _RAND48_SEED_1; \ + _r->_r48->_seed[2] = _RAND48_SEED_2; \ + _r->_r48->_mult[0] = _RAND48_MULT_0; \ + _r->_r48->_mult[1] = _RAND48_MULT_1; \ + _r->_r48->_mult[2] = _RAND48_MULT_2; \ + _r->_r48->_add = _RAND48_ADD; \ + _r->_r48->_rand_next = 1; \ +} while (0) +#define _REENT_CHECK_RAND48(var) \ + _REENT_CHECK(var, _r48, struct _rand48 *, sizeof *((var)->_r48), _REENT_INIT_RAND48((var))) + +#define _REENT_INIT_MP(var) do { \ + struct _reent *_r = (var); \ + _r->_mp->_result_k = 0; \ + _r->_mp->_result = _r->_mp->_p5s = _NULL; \ + _r->_mp->_freelist = _NULL; \ +} while (0) +#define _REENT_CHECK_MP(var) \ + _REENT_CHECK(var, _mp, struct _mprec *, sizeof *((var)->_mp), _REENT_INIT_MP(var)) + +#define _REENT_CHECK_EMERGENCY(var) \ + _REENT_CHECK(var, _emergency, char *, _REENT_EMERGENCY_SIZE, /* nothing */) + +#define _REENT_INIT_MISC(var) do { \ + struct _reent *_r = (var); \ + _r->_misc->_strtok_last = _NULL; \ + _r->_misc->_mblen_state.__count = 0; \ + _r->_misc->_mblen_state.__value.__wch = 0; \ + _r->_misc->_wctomb_state.__count = 0; \ + _r->_misc->_wctomb_state.__value.__wch = 0; \ + _r->_misc->_mbtowc_state.__count = 0; \ + _r->_misc->_mbtowc_state.__value.__wch = 0; \ + _r->_misc->_mbrlen_state.__count = 0; \ + _r->_misc->_mbrlen_state.__value.__wch = 0; \ + _r->_misc->_mbrtowc_state.__count = 0; \ + _r->_misc->_mbrtowc_state.__value.__wch = 0; \ + _r->_misc->_mbsrtowcs_state.__count = 0; \ + _r->_misc->_mbsrtowcs_state.__value.__wch = 0; \ + _r->_misc->_wcrtomb_state.__count = 0; \ + _r->_misc->_wcrtomb_state.__value.__wch = 0; \ + _r->_misc->_wcsrtombs_state.__count = 0; \ + _r->_misc->_wcsrtombs_state.__value.__wch = 0; \ + _r->_misc->_l64a_buf[0] = '\0'; \ + _r->_misc->_getdate_err = 0; \ +} while (0) +#define _REENT_CHECK_MISC(var) \ + _REENT_CHECK(var, _misc, struct _misc_reent *, sizeof *((var)->_misc), _REENT_INIT_MISC(var)) + +#define _REENT_CHECK_SIGNAL_BUF(var) \ + _REENT_CHECK(var, _signal_buf, char *, _REENT_SIGNAL_SIZE, /* nothing */) + +#define _REENT_SIGNGAM(ptr) ((ptr)->_gamma_signgam) +#define _REENT_RAND_NEXT(ptr) ((ptr)->_r48->_rand_next) +#define _REENT_RAND48_SEED(ptr) ((ptr)->_r48->_seed) +#define _REENT_RAND48_MULT(ptr) ((ptr)->_r48->_mult) +#define _REENT_RAND48_ADD(ptr) ((ptr)->_r48->_add) +#define _REENT_MP_RESULT(ptr) ((ptr)->_mp->_result) +#define _REENT_MP_RESULT_K(ptr) ((ptr)->_mp->_result_k) +#define _REENT_MP_P5S(ptr) ((ptr)->_mp->_p5s) +#define _REENT_MP_FREELIST(ptr) ((ptr)->_mp->_freelist) +#define _REENT_ASCTIME_BUF(ptr) ((ptr)->_asctime_buf) +#define _REENT_TM(ptr) ((ptr)->_localtime_buf) +#define _REENT_STRTOK_LAST(ptr) ((ptr)->_misc->_strtok_last) +#define _REENT_MBLEN_STATE(ptr) ((ptr)->_misc->_mblen_state) +#define _REENT_MBTOWC_STATE(ptr)((ptr)->_misc->_mbtowc_state) +#define _REENT_WCTOMB_STATE(ptr)((ptr)->_misc->_wctomb_state) +#define _REENT_MBRLEN_STATE(ptr) ((ptr)->_misc->_mbrlen_state) +#define _REENT_MBRTOWC_STATE(ptr) ((ptr)->_misc->_mbrtowc_state) +#define _REENT_MBSRTOWCS_STATE(ptr) ((ptr)->_misc->_mbsrtowcs_state) +#define _REENT_WCRTOMB_STATE(ptr) ((ptr)->_misc->_wcrtomb_state) +#define _REENT_WCSRTOMBS_STATE(ptr) ((ptr)->_misc->_wcsrtombs_state) +#define _REENT_L64A_BUF(ptr) ((ptr)->_misc->_l64a_buf) +#define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_misc->_getdate_err)) +#define _REENT_SIGNAL_BUF(ptr) ((ptr)->_signal_buf) + +#else /* !_REENT_SMALL */ + +struct _reent +{ + int _errno; /* local copy of errno */ + + /* FILE is a big struct and may change over time. To try to achieve binary + compatibility with future versions, put stdin,stdout,stderr here. + These are pointers into member __sf defined below. */ + __FILE *_stdin, *_stdout, *_stderr; + + int _inc; /* used by tmpnam */ + char _emergency[_REENT_EMERGENCY_SIZE]; + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + int _reserved_1; +#endif + struct __locale_t *_locale;/* per-thread locale */ + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + int _reserved_0; +#endif + + void (*__cleanup) (struct _reent *); + + /* used by mprec routines */ + struct _Bigint *_result; + int _result_k; + struct _Bigint *_p5s; + struct _Bigint **_freelist; + + /* used by some fp conversion routines */ + int _cvtlen; /* should be size_t */ + char *_cvtbuf; + + union + { + struct + { +#ifdef _REENT_BACKWARD_BINARY_COMPAT + unsigned int _reserved_2; +#endif + char * _strtok_last; + char _asctime_buf[_REENT_ASCTIME_SIZE]; + struct __tm _localtime_buf; + int _gamma_signgam; + __extension__ unsigned long long _rand_next; + struct _rand48 _r48; + _mbstate_t _mblen_state; + _mbstate_t _mbtowc_state; + _mbstate_t _wctomb_state; + char _l64a_buf[8]; + char _signal_buf[_REENT_SIGNAL_SIZE]; + int _getdate_err; + _mbstate_t _mbrlen_state; + _mbstate_t _mbrtowc_state; + _mbstate_t _mbsrtowcs_state; + _mbstate_t _wcrtomb_state; + _mbstate_t _wcsrtombs_state; + int _h_errno; + } _reent; +#ifdef _REENT_BACKWARD_BINARY_COMPAT + struct + { + unsigned char * _reserved_3[30]; + unsigned int _reserved_4[30]; + } _reserved_5; +#endif + } _new; + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + struct _atexit *_reserved_6; + struct _atexit _reserved_7; +#endif + + /* signal info */ + void (**_sig_func)(int); +}; + +#define _REENT_INIT(var) \ + { 0, \ + &__sf[0], \ + &__sf[1], \ + &__sf[2], \ + 0, \ + "", \ + _REENT_INIT_RESERVED_1 \ + _NULL, \ + _REENT_INIT_RESERVED_0 \ + _NULL, \ + _NULL, \ + 0, \ + _NULL, \ + _NULL, \ + 0, \ + _NULL, \ + { \ + { \ + _REENT_INIT_RESERVED_2 \ + _NULL, \ + "", \ + {0, 0, 0, 0, 0, 0, 0, 0, 0}, \ + 0, \ + 1, \ + { \ + {_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \ + {_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, \ + _RAND48_ADD \ + }, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}}, \ + "", \ + "", \ + 0, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}} \ + } \ + }, \ + _REENT_INIT_RESERVED_6_7 \ + _NULL \ + } + +#define _REENT_INIT_PTR_ZEROED(var) \ + { (var)->_stdin = &__sf[0]; \ + (var)->_stdout = &__sf[1]; \ + (var)->_stderr = &__sf[2]; \ + (var)->_new._reent._rand_next = 1; \ + (var)->_new._reent._r48._seed[0] = _RAND48_SEED_0; \ + (var)->_new._reent._r48._seed[1] = _RAND48_SEED_1; \ + (var)->_new._reent._r48._seed[2] = _RAND48_SEED_2; \ + (var)->_new._reent._r48._mult[0] = _RAND48_MULT_0; \ + (var)->_new._reent._r48._mult[1] = _RAND48_MULT_1; \ + (var)->_new._reent._r48._mult[2] = _RAND48_MULT_2; \ + (var)->_new._reent._r48._add = _RAND48_ADD; \ + } + +#define _REENT_CHECK_RAND48(ptr) /* nothing */ +#define _REENT_CHECK_MP(ptr) /* nothing */ +#define _REENT_CHECK_TM(ptr) /* nothing */ +#define _REENT_CHECK_ASCTIME_BUF(ptr) /* nothing */ +#define _REENT_CHECK_EMERGENCY(ptr) /* nothing */ +#define _REENT_CHECK_MISC(ptr) /* nothing */ +#define _REENT_CHECK_SIGNAL_BUF(ptr) /* nothing */ + +#define _REENT_SIGNGAM(ptr) ((ptr)->_new._reent._gamma_signgam) +#define _REENT_RAND_NEXT(ptr) ((ptr)->_new._reent._rand_next) +#define _REENT_RAND48_SEED(ptr) ((ptr)->_new._reent._r48._seed) +#define _REENT_RAND48_MULT(ptr) ((ptr)->_new._reent._r48._mult) +#define _REENT_RAND48_ADD(ptr) ((ptr)->_new._reent._r48._add) +#define _REENT_MP_RESULT(ptr) ((ptr)->_result) +#define _REENT_MP_RESULT_K(ptr) ((ptr)->_result_k) +#define _REENT_MP_P5S(ptr) ((ptr)->_p5s) +#define _REENT_MP_FREELIST(ptr) ((ptr)->_freelist) +#define _REENT_ASCTIME_BUF(ptr) ((ptr)->_new._reent._asctime_buf) +#define _REENT_TM(ptr) (&(ptr)->_new._reent._localtime_buf) +#define _REENT_STRTOK_LAST(ptr) ((ptr)->_new._reent._strtok_last) +#define _REENT_MBLEN_STATE(ptr) ((ptr)->_new._reent._mblen_state) +#define _REENT_MBTOWC_STATE(ptr)((ptr)->_new._reent._mbtowc_state) +#define _REENT_WCTOMB_STATE(ptr)((ptr)->_new._reent._wctomb_state) +#define _REENT_MBRLEN_STATE(ptr)((ptr)->_new._reent._mbrlen_state) +#define _REENT_MBRTOWC_STATE(ptr)((ptr)->_new._reent._mbrtowc_state) +#define _REENT_MBSRTOWCS_STATE(ptr)((ptr)->_new._reent._mbsrtowcs_state) +#define _REENT_WCRTOMB_STATE(ptr)((ptr)->_new._reent._wcrtomb_state) +#define _REENT_WCSRTOMBS_STATE(ptr)((ptr)->_new._reent._wcsrtombs_state) +#define _REENT_L64A_BUF(ptr) ((ptr)->_new._reent._l64a_buf) +#define _REENT_SIGNAL_BUF(ptr) ((ptr)->_new._reent._signal_buf) +#define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_new._reent._getdate_err)) + +#endif /* !_REENT_SMALL */ + +#define _REENT_CLEANUP(_ptr) ((_ptr)->__cleanup) +#define _REENT_CVTBUF(_ptr) ((_ptr)->_cvtbuf) +#define _REENT_CVTLEN(_ptr) ((_ptr)->_cvtlen) +#define _REENT_EMERGENCY(_ptr) ((_ptr)->_emergency) +#define _REENT_ERRNO(_ptr) ((_ptr)->_errno) +#define _REENT_INC(_ptr) ((_ptr)->_inc) +#define _REENT_LOCALE(_ptr) ((_ptr)->_locale) +#define _REENT_SIG_FUNC(_ptr) ((_ptr)->_sig_func) +#define _REENT_STDIN(_ptr) ((_ptr)->_stdin) +#define _REENT_STDOUT(_ptr) ((_ptr)->_stdout) +#define _REENT_STDERR(_ptr) ((_ptr)->_stderr) + +#define _REENT_INIT_PTR(var) \ + { memset((var), 0, sizeof(*(var))); \ + _REENT_INIT_PTR_ZEROED(var); \ + } + +/* + * All references to struct _reent are via this pointer. + * Internally, newlib routines that need to reference it should use _REENT. + */ + +#ifndef __ATTRIBUTE_IMPURE_PTR__ +#define __ATTRIBUTE_IMPURE_PTR__ +#endif + +extern struct _reent *_impure_ptr __ATTRIBUTE_IMPURE_PTR__; + +#ifndef __ATTRIBUTE_IMPURE_DATA__ +#define __ATTRIBUTE_IMPURE_DATA__ +#endif + +extern struct _reent _impure_data __ATTRIBUTE_IMPURE_DATA__; + +/* #define _REENT_ONLY define this to get only reentrant routines */ + +#if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) +#ifndef __getreent + struct _reent * __getreent (void); +#endif +# define _REENT (__getreent()) +#else /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ +# define _REENT _impure_ptr +#endif /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ + +#define _REENT_IS_NULL(_ptr) ((_ptr) == NULL) + +#define _GLOBAL_REENT (&_impure_data) + +#else /* _REENT_THREAD_LOCAL */ + +#define _REENT NULL +#define _GLOBAL_REENT NULL + +/* + * Since _REENT is defined as NULL, this macro ensures that calls to + * CHECK_INIT() do not automatically fail. + */ +#define _REENT_IS_NULL(_ptr) 0 + +#define _REENT_CHECK_RAND48(ptr) /* nothing */ +#define _REENT_CHECK_MP(ptr) /* nothing */ +#define _REENT_CHECK_TM(ptr) /* nothing */ +#define _REENT_CHECK_ASCTIME_BUF(ptr) /* nothing */ +#define _REENT_CHECK_EMERGENCY(ptr) /* nothing */ +#define _REENT_CHECK_MISC(ptr) /* nothing */ +#define _REENT_CHECK_SIGNAL_BUF(ptr) /* nothing */ + +extern _Thread_local char _tls_asctime_buf[_REENT_ASCTIME_SIZE]; +#define _REENT_ASCTIME_BUF(_ptr) (_tls_asctime_buf) +extern _Thread_local char *_tls_cvtbuf; +#define _REENT_CVTBUF(_ptr) (_tls_cvtbuf) +extern _Thread_local int _tls_cvtlen; +#define _REENT_CVTLEN(_ptr) (_tls_cvtlen) +extern _Thread_local void (*_tls_cleanup)(struct _reent *); +#define _REENT_CLEANUP(_ptr) (_tls_cleanup) +extern _Thread_local char _tls_emergency[_REENT_EMERGENCY_SIZE]; +#define _REENT_EMERGENCY(_ptr) (_tls_emergency) +extern _Thread_local int _tls_errno; +#define _REENT_ERRNO(_ptr) (_tls_errno) +extern _Thread_local int _tls_getdate_err; +#define _REENT_GETDATE_ERR_P(_ptr) (&_tls_getdate_err) +extern _Thread_local int _tls_inc; +#define _REENT_INC(_ptr) (_tls_inc) +extern _Thread_local char _tls_l64a_buf[8]; +#define _REENT_L64A_BUF(_ptr) (_tls_l64a_buf) +extern _Thread_local struct __locale_t *_tls_locale; +#define _REENT_LOCALE(_ptr) (_tls_locale) +extern _Thread_local _mbstate_t _tls_mblen_state; +#define _REENT_MBLEN_STATE(_ptr) (_tls_mblen_state) +extern _Thread_local _mbstate_t _tls_mbrlen_state; +#define _REENT_MBRLEN_STATE(_ptr) (_tls_mbrlen_state) +extern _Thread_local _mbstate_t _tls_mbrtowc_state; +#define _REENT_MBRTOWC_STATE(_ptr) (_tls_mbrtowc_state) +extern _Thread_local _mbstate_t _tls_mbsrtowcs_state; +#define _REENT_MBSRTOWCS_STATE(_ptr) (_tls_mbsrtowcs_state) +extern _Thread_local _mbstate_t _tls_mbtowc_state; +#define _REENT_MBTOWC_STATE(_ptr) (_tls_mbtowc_state) +extern _Thread_local struct _Bigint **_tls_mp_freelist; +#define _REENT_MP_FREELIST(_ptr) (_tls_mp_freelist) +extern _Thread_local struct _Bigint *_tls_mp_p5s; +#define _REENT_MP_P5S(_ptr) (_tls_mp_p5s) +extern _Thread_local struct _Bigint *_tls_mp_result; +#define _REENT_MP_RESULT(_ptr) (_tls_mp_result) +extern _Thread_local int _tls_mp_result_k; +#define _REENT_MP_RESULT_K(_ptr) (_tls_mp_result_k) +extern _Thread_local unsigned short _tls_rand48_add; +#define _REENT_RAND48_ADD(_ptr) (_tls_rand48_add) +extern _Thread_local unsigned short _tls_rand48_mult[3]; +#define _REENT_RAND48_MULT(_ptr) (_tls_rand48_mult) +extern _Thread_local unsigned short _tls_rand48_seed[3]; +#define _REENT_RAND48_SEED(_ptr) (_tls_rand48_seed) +extern _Thread_local unsigned long long _tls_rand_next; +#define _REENT_RAND_NEXT(_ptr) (_tls_rand_next) +extern _Thread_local void (**_tls_sig_func)(int); +#define _REENT_SIG_FUNC(_ptr) (_tls_sig_func) +extern _Thread_local char _tls_signal_buf[_REENT_SIGNAL_SIZE]; +#define _REENT_SIGNAL_BUF(_ptr) (_tls_signal_buf) +extern _Thread_local int _tls_gamma_signgam; +#define _REENT_SIGNGAM(_ptr) (_tls_gamma_signgam) +extern _Thread_local __FILE *_tls_stdin; +#define _REENT_STDIN(_ptr) (_tls_stdin) +extern _Thread_local __FILE *_tls_stdout; +#define _REENT_STDOUT(_ptr) (_tls_stdout) +extern _Thread_local __FILE *_tls_stderr; +#define _REENT_STDERR(_ptr) (_tls_stderr) +extern _Thread_local char *_tls_strtok_last; +#define _REENT_STRTOK_LAST(_ptr) (_tls_strtok_last) +extern _Thread_local struct __tm _tls_localtime_buf; +#define _REENT_TM(_ptr) (&_tls_localtime_buf) +extern _Thread_local _mbstate_t _tls_wctomb_state; +#define _REENT_WCTOMB_STATE(_ptr) (_tls_wctomb_state) +extern _Thread_local _mbstate_t _tls_wcrtomb_state; +#define _REENT_WCRTOMB_STATE(_ptr) (_tls_wcrtomb_state) +extern _Thread_local _mbstate_t _tls_wcsrtombs_state; +#define _REENT_WCSRTOMBS_STATE(_ptr) (_tls_wcsrtombs_state) + +#endif /* !_REENT_THREAD_LOCAL */ + +/* This value is used in stdlib/misc.c. reent/reent.c has to know it + as well to make sure the freelist is correctly free'd. Therefore + we define it here, rather than in stdlib/misc.c, as before. */ +#define _Kmax (sizeof (size_t) << 3) + +extern struct _atexit *__atexit; /* points to head of LIFO stack */ +extern struct _atexit __atexit0; /* one guaranteed table, required by ANSI */ + +extern void (*__stdio_exit_handler) (void); + +void _reclaim_reent (struct _reent *); + +extern int _fwalk_sglue (struct _reent *, int (*)(struct _reent *, __FILE *), + struct _glue *); + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_REENT_H_ */ diff --git a/include/sys/resource.h b/include/sys/resource.h new file mode 100644 index 0000000..c0a0d20 --- /dev/null +++ b/include/sys/resource.h @@ -0,0 +1,24 @@ +#ifndef _SYS_RESOURCE_H_ +#define _SYS_RESOURCE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define RUSAGE_SELF 0 /* calling process */ +#define RUSAGE_CHILDREN -1 /* terminated child processes */ + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ +}; + +int getrusage (int, struct rusage*); + +#ifdef __cplusplus +} +#endif +#endif /* !_SYS_RESOURCE_H_ */ + diff --git a/include/sys/sched.h b/include/sys/sched.h new file mode 100644 index 0000000..4adb6e2 --- /dev/null +++ b/include/sys/sched.h @@ -0,0 +1,69 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + + +#ifndef _SYS_SCHED_H_ +#define _SYS_SCHED_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Scheduling Policies */ +/* Open Group Specifications Issue 6 */ +#if defined(__CYGWIN__) +#define SCHED_OTHER 3 +#else +#define SCHED_OTHER 0 +#endif + +#define SCHED_FIFO 1 +#define SCHED_RR 2 + +#if defined(_POSIX_SPORADIC_SERVER) +#define SCHED_SPORADIC 4 +#endif + +/* Scheduling Parameters */ +/* Open Group Specifications Issue 6 */ + +struct sched_param { + int sched_priority; /* Process execution scheduling priority */ + +#if defined(_POSIX_SPORADIC_SERVER) || defined(_POSIX_THREAD_SPORADIC_SERVER) + int sched_ss_low_priority; /* Low scheduling priority for sporadic */ + /* server */ + struct timespec sched_ss_repl_period; + /* Replenishment period for sporadic server */ + struct timespec sched_ss_init_budget; + /* Initial budget for sporadic server */ + int sched_ss_max_repl; /* Maximum pending replenishments for */ + /* sporadic server */ +#endif +}; + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ + diff --git a/include/sys/select.h b/include/sys/select.h new file mode 100644 index 0000000..93d0b79 --- /dev/null +++ b/include/sys/select.h @@ -0,0 +1,94 @@ +#ifndef _SYS_SELECT_H +#define _SYS_SELECT_H + +/* We don't define fd_set and friends if we are compiling POSIX + source, or if we have included (or may include as indicated + by __USE_W32_SOCKETS) the W32api winsock[2].h header which + defines Windows versions of them. Note that a program which + includes the W32api winsock[2].h header must know what it is doing; + it must not call the Cygwin select function. +*/ +# if !(defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) + +#include +#include +#include +#include + +#if !defined(_SIGSET_T_DECLARED) +#define _SIGSET_T_DECLARED +typedef __sigset_t sigset_t; +#endif + +# define _SYS_TYPES_FD_SET +/* + * Select uses bit masks of file descriptors in longs. + * These macros manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here + * should be enough for most uses. + */ +#ifndef FD_SETSIZE +# ifdef __CYGWIN__ +# define FD_SETSIZE 1024 +# else +# define FD_SETSIZE 64 +# endif +#endif + +typedef unsigned long __fd_mask; +#if __BSD_VISIBLE +typedef __fd_mask fd_mask; +#endif + +#define _NFDBITS ((int)sizeof(__fd_mask) * 8) /* bits per mask */ +#if __BSD_VISIBLE +#define NFDBITS _NFDBITS +#endif + +#ifndef _howmany +#define _howmany(x,y) (((x) + ((y) - 1)) / (y)) +#endif + +typedef struct fd_set { + __fd_mask __fds_bits[_howmany(FD_SETSIZE, _NFDBITS)]; +} fd_set; +#if __BSD_VISIBLE +#define fds_bits __fds_bits +#endif + +#define __fdset_mask(n) ((__fd_mask)1 << ((n) % _NFDBITS)) +#define FD_CLR(n, p) ((p)->__fds_bits[(n)/_NFDBITS] &= ~__fdset_mask(n)) +#if __BSD_VISIBLE +#define FD_COPY(f, t) (void)(*(t) = *(f)) +#endif +#define FD_ISSET(n, p) (((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n)) != 0) +#define FD_SET(n, p) ((p)->__fds_bits[(n)/_NFDBITS] |= __fdset_mask(n)) +#define FD_ZERO(p) do { \ + fd_set *_p; \ + __size_t _n; \ + \ + _p = (p); \ + _n = _howmany(FD_SETSIZE, _NFDBITS); \ + while (_n > 0) \ + _p->__fds_bits[--_n] = 0; \ +} while (0) + +#if !defined (__INSIDE_CYGWIN_NET__) + +__BEGIN_DECLS + +int select __P ((int __n, fd_set *__readfds, fd_set *__writefds, + fd_set *__exceptfds, struct timeval *__timeout)); +#if __POSIX_VISIBLE >= 200112 +int pselect __P ((int __n, fd_set *__readfds, fd_set *__writefds, + fd_set *__exceptfds, const struct timespec *__timeout, + const sigset_t *__set)); +#endif + +__END_DECLS + +#endif /* !__INSIDE_CYGWIN_NET__ */ + +#endif /* !(_WINSOCK_H || _WINSOCKAPI_ || __USE_W32_SOCKETS) */ + +#endif /* sys/select.h */ diff --git a/include/sys/signal.h b/include/sys/signal.h new file mode 100644 index 0000000..8dc5fb9 --- /dev/null +++ b/include/sys/signal.h @@ -0,0 +1,388 @@ +/* sys/signal.h */ + +#ifndef _SYS_SIGNAL_H +#define _SYS_SIGNAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "_ansi.h" +#include +#include +#include +#include +#include +#include + +#if !defined(_SIGSET_T_DECLARED) +#define _SIGSET_T_DECLARED +typedef __sigset_t sigset_t; +#endif + +#if defined(__CYGWIN__) +#include +#else + +#if defined(_POSIX_REALTIME_SIGNALS) || __POSIX_VISIBLE >= 199309 + +/* sigev_notify values + NOTE: P1003.1c/D10, p. 34 adds SIGEV_THREAD. */ + +#define SIGEV_NONE 1 /* No asynchronous notification shall be delivered */ + /* when the event of interest occurs. */ +#define SIGEV_SIGNAL 2 /* A queued signal, with an application defined */ + /* value, shall be delivered when the event of */ + /* interest occurs. */ +#define SIGEV_THREAD 3 /* A notification function shall be called to */ + /* perform notification. */ + +/* Signal Generation and Delivery, P1003.1b-1993, p. 63 + NOTE: P1003.1c/D10, p. 34 adds sigev_notify_function and + sigev_notify_attributes to the sigevent structure. */ + +union sigval { + int sival_int; /* Integer signal value */ + void *sival_ptr; /* Pointer signal value */ +}; + +struct sigevent { + int sigev_notify; /* Notification type */ + int sigev_signo; /* Signal number */ + union sigval sigev_value; /* Signal value */ + +#if defined(_POSIX_THREADS) + void (*sigev_notify_function)( union sigval ); + /* Notification function */ + pthread_attr_t *sigev_notify_attributes; /* Notification Attributes */ +#endif +}; + +/* Signal Actions, P1003.1b-1993, p. 64 */ +/* si_code values, p. 66 */ + +#define SI_USER 1 /* Sent by a user. kill(), abort(), etc */ +#define SI_QUEUE 2 /* Sent by sigqueue() */ +#define SI_TIMER 3 /* Sent by expiration of a timer_settime() timer */ +#define SI_ASYNCIO 4 /* Indicates completion of asycnhronous IO */ +#define SI_MESGQ 5 /* Indicates arrival of a message at an empty queue */ + +typedef struct { + int si_signo; /* Signal number */ + int si_code; /* Cause of the signal */ + union sigval si_value; /* Signal value */ +} siginfo_t; +#endif /* defined(_POSIX_REALTIME_SIGNALS) || __POSIX_VISIBLE >= 199309 */ + +#if defined(__rtems__) + +/* 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76 */ + +#define SA_NOCLDSTOP 0x1 /* Do not generate SIGCHLD when children stop */ +#define SA_SIGINFO 0x2 /* Invoke the signal catching function with */ + /* three arguments instead of one. */ +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +#define SA_ONSTACK 0x4 /* Signal delivery will be on a separate stack. */ +#endif + +/* struct sigaction notes from POSIX: + * + * (1) Routines stored in sa_handler should take a single int as + * their argument although the POSIX standard does not require this. + * This is not longer true since at least POSIX.1-2008 + * (2) The fields sa_handler and sa_sigaction may overlap, and a conforming + * application should not use both simultaneously. + */ + +typedef void (*_sig_func_ptr)(int); + +struct sigaction { + int sa_flags; /* Special flags to affect behavior of signal */ + sigset_t sa_mask; /* Additional set of signals to be blocked */ + /* during execution of signal-catching */ + /* function. */ + union { + _sig_func_ptr _handler; /* SIG_DFL, SIG_IGN, or pointer to a function */ +#if defined(_POSIX_REALTIME_SIGNALS) + void (*_sigaction)( int, siginfo_t *, void * ); +#endif + } _signal_handlers; +}; + +#define sa_handler _signal_handlers._handler +#if defined(_POSIX_REALTIME_SIGNALS) +#define sa_sigaction _signal_handlers._sigaction +#endif + +#else /* defined(__rtems__) */ + +#define SA_NOCLDSTOP 1 /* only value supported now for sa_flags */ + +typedef void (*_sig_func_ptr)(int); + +struct sigaction +{ + _sig_func_ptr sa_handler; + sigset_t sa_mask; + int sa_flags; +}; +#endif /* defined(__rtems__) */ +#endif /* defined(__CYGWIN__) */ + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +/* + * Minimum and default signal stack constants. Allow for target overrides + * from . + */ +#ifndef MINSIGSTKSZ +#define MINSIGSTKSZ 2048 +#endif +#ifndef SIGSTKSZ +#define SIGSTKSZ 8192 +#endif + +/* + * Possible values for ss_flags in stack_t below. + */ +#define SS_ONSTACK 0x1 +#define SS_DISABLE 0x2 + +#endif + +/* + * Structure used in sigaltstack call. + */ +typedef struct sigaltstack { + void *ss_sp; /* Stack base or pointer. */ + int ss_flags; /* Flags. */ + size_t ss_size; /* Stack size. */ +} stack_t; + +#if __POSIX_VISIBLE +#define SIG_SETMASK 0 /* set mask with sigprocmask() */ +#define SIG_BLOCK 1 /* set of signals to block */ +#define SIG_UNBLOCK 2 /* set of signals to, well, unblock */ + +int sigprocmask (int, const sigset_t *, sigset_t *); +#endif + +#if __POSIX_VISIBLE >= 199506 +int pthread_sigmask (int, const sigset_t *, sigset_t *); +#endif + +#ifdef _LIBC +int _kill (pid_t, int); +#endif /* _LIBC */ + +#if __POSIX_VISIBLE +int kill (pid_t, int); +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +int killpg (pid_t, int); +#endif +#if __POSIX_VISIBLE +int sigaction (int, const struct sigaction *, struct sigaction *); +int sigaddset (sigset_t *, const int); +int sigdelset (sigset_t *, const int); +int sigismember (const sigset_t *, int); +int sigfillset (sigset_t *); +int sigemptyset (sigset_t *); +int sigpending (sigset_t *); +int sigsuspend (const sigset_t *); +int sigwait (const sigset_t *, int *); + +#if !defined(__CYGWIN__) && !defined(__rtems__) +/* These depend upon the type of sigset_t, which right now + is always a long.. They're in the POSIX namespace, but + are not ANSI. */ +#define sigaddset(what,sig) (*(what) |= (1<<(sig)), 0) +#define sigdelset(what,sig) (*(what) &= ~(1<<(sig)), 0) +#define sigemptyset(what) (*(what) = 0, 0) +#define sigfillset(what) (*(what) = ~(0), 0) +#define sigismember(what,sig) (((*(what)) & (1<<(sig))) != 0) +#endif /* !__CYGWIN__ && !__rtems__ */ +#endif /* __POSIX_VISIBLE */ + +/* There are two common sigpause variants, both of which take an int argument. + If you request _XOPEN_SOURCE or _GNU_SOURCE, you get the System V version, + which removes the given signal from the process's signal mask; otherwise + you get the BSD version, which sets the process's signal mask to the given + value. */ +#if __XSI_VISIBLE && !defined(__INSIDE_CYGWIN__) +# ifdef __GNUC__ +int sigpause (int) __asm__ (__ASMNAME ("__xpg_sigpause")); +# else +int __xpg_sigpause (int); +# define sigpause __xpg_sigpause +# endif +#elif __BSD_VISIBLE +int sigpause (int); +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int sigaltstack (const stack_t *__restrict, stack_t *__restrict); +#endif + +#if __POSIX_VISIBLE >= 199506 +int pthread_kill (pthread_t, int); +#endif + +#if __POSIX_VISIBLE >= 199309 + +/* 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76 + NOTE: P1003.1c/D10, p. 39 adds sigwait(). */ + +int sigwaitinfo (const sigset_t *, siginfo_t *); +int sigtimedwait (const sigset_t *, siginfo_t *, const struct timespec *); +/* 3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78 */ +int sigqueue (pid_t, int, const union sigval); + +#endif /* __POSIX_VISIBLE >= 199309 */ + +/* Using __MISC_VISIBLE until POSIX Issue 8 is officially released */ +#if __MISC_VISIBLE + +/* POSIX Issue 8 adds sig2str() and str2sig() */ + +#if __SIZEOF_INT__ >= 4 +#define SIG2STR_MAX (sizeof("RTMAX+") + sizeof("4294967295") - 1) +#else +#define SIG2STR_MAX (sizeof("RTMAX+") + sizeof("65535") - 1) +#endif + +int sig2str(int, char *); +int str2sig(const char *__restrict, int *__restrict); + +#endif /* __MISC_VISIBLE */ + +#if defined(___AM29K__) +/* These all need to be defined for ANSI C, but I don't think they are + meaningful. */ +#define SIGABRT 1 +#define SIGFPE 1 +#define SIGILL 1 +#define SIGINT 1 +#define SIGSEGV 1 +#define SIGTERM 1 +/* These need to be defined for POSIX, and some others do too. */ +#define SIGHUP 1 +#define SIGQUIT 1 +#define NSIG 2 +#elif defined(__GO32__) +#define SIGINT 1 +#define SIGKILL 2 +#define SIGPIPE 3 +#define SIGFPE 4 +#define SIGHUP 5 +#define SIGTERM 6 +#define SIGSEGV 7 +#define SIGTSTP 8 +#define SIGQUIT 9 +#define SIGTRAP 10 +#define SIGILL 11 +#define SIGEMT 12 +#define SIGALRM 13 +#define SIGBUS 14 +#define SIGLOST 15 +#define SIGSTOP 16 +#define SIGABRT 17 +#define SIGUSR1 18 +#define SIGUSR2 19 +#define NSIG 20 +#elif !defined(SIGTRAP) +#define SIGHUP 1 /* hangup */ +#define SIGINT 2 /* interrupt */ +#define SIGQUIT 3 /* quit */ +#define SIGILL 4 /* illegal instruction (not reset when caught) */ +#define SIGTRAP 5 /* trace trap (not reset when caught) */ +#define SIGIOT 6 /* IOT instruction */ +#define SIGABRT 6 /* used by abort, replace SIGIOT in the future */ +#define SIGEMT 7 /* EMT instruction */ +#define SIGFPE 8 /* floating point exception */ +#define SIGKILL 9 /* kill (cannot be caught or ignored) */ +#define SIGBUS 10 /* bus error */ +#define SIGSEGV 11 /* segmentation violation */ +#define SIGSYS 12 /* bad argument to system call */ +#define SIGPIPE 13 /* write on a pipe with no one to read it */ +#define SIGALRM 14 /* alarm clock */ +#define SIGTERM 15 /* software termination signal from kill */ + +#if defined(__rtems__) +#define SIGURG 16 /* urgent condition on IO channel */ +#define SIGSTOP 17 /* sendable stop signal not from tty */ +#define SIGTSTP 18 /* stop signal from tty */ +#define SIGCONT 19 /* continue a stopped process */ +#define SIGCHLD 20 /* to parent on child stop or exit */ +#define SIGCLD 20 /* System V name for SIGCHLD */ +#define SIGTTIN 21 /* to readers pgrp upon background tty read */ +#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ +#define SIGIO 23 /* input/output possible signal */ +#define SIGPOLL SIGIO /* System V name for SIGIO */ +#define SIGWINCH 24 /* window changed */ +#define SIGUSR1 25 /* user defined signal 1 */ +#define SIGUSR2 26 /* user defined signal 2 */ + +/* Real-Time Signals Range, P1003.1b-1993, p. 61 + NOTE: By P1003.1b-1993, this should be at least RTSIG_MAX + (which is a minimum of 8) signals. + */ +#define SIGRTMIN 27 +#define SIGRTMAX 31 +#define __SIGFIRSTNOTRT SIGHUP +#define __SIGLASTNOTRT SIGUSR2 + +#define NSIG 32 /* signal 0 implied */ + +#elif defined(__svr4__) +/* svr4 specifics. different signals above 15, and sigaction. */ +#define SIGUSR1 16 +#define SIGUSR2 17 +#define SIGCLD 18 +#define SIGPWR 19 +#define SIGWINCH 20 +#define SIGPOLL 22 /* 20 for x.out binaries!!!! */ +#define SIGSTOP 23 /* sendable stop signal not from tty */ +#define SIGTSTP 24 /* stop signal from tty */ +#define SIGCONT 25 /* continue a stopped process */ +#define SIGTTIN 26 /* to readers pgrp upon background tty read */ +#define SIGTTOU 27 /* like TTIN for output if (tp->t_local<OSTOP) */ +#define NSIG 28 +#else +#define SIGURG 16 /* urgent condition on IO channel */ +#define SIGSTOP 17 /* sendable stop signal not from tty */ +#define SIGTSTP 18 /* stop signal from tty */ +#define SIGCONT 19 /* continue a stopped process */ +#define SIGCHLD 20 /* to parent on child stop or exit */ +#define SIGCLD 20 /* System V name for SIGCHLD */ +#define SIGTTIN 21 /* to readers pgrp upon background tty read */ +#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ +#define SIGIO 23 /* input/output possible signal */ +#define SIGPOLL SIGIO /* System V name for SIGIO */ +#define SIGXCPU 24 /* exceeded CPU time limit */ +#define SIGXFSZ 25 /* exceeded file size limit */ +#define SIGVTALRM 26 /* virtual time alarm */ +#define SIGPROF 27 /* profiling time alarm */ +#define SIGWINCH 28 /* window changed */ +#define SIGLOST 29 /* resource lost (eg, record-lock lost) */ +#define SIGUSR1 30 /* user defined signal 1 */ +#define SIGUSR2 31 /* user defined signal 2 */ +#define NSIG 32 /* signal 0 implied */ +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#if defined(__CYGWIN__) +#if __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +#include +#endif +#endif + +#ifndef _SIGNAL_H_ +/* Some applications take advantage of the fact that + * and are equivalent in glibc. Allow for that here. */ +#include +#endif +#endif /* _SYS_SIGNAL_H */ diff --git a/include/sys/stat.h b/include/sys/stat.h new file mode 100644 index 0000000..98f5add --- /dev/null +++ b/include/sys/stat.h @@ -0,0 +1,179 @@ +#ifndef _SYS_STAT_H +#define _SYS_STAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <_ansi.h> +#include +#include +#include +#include + +/* dj's stat defines _STAT_H_ */ +#ifndef _STAT_H_ + +/* It is intended that the layout of this structure not change when the + sizes of any of the basic types change (short, int, long) [via a compile + time option]. */ + +#ifdef __CYGWIN__ +#include +#ifdef _LIBC +#define stat64 stat +#endif +#else +struct stat +{ + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; +#if defined(__svr4__) && !defined(__PPC__) && !defined(__sun__) + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +#else + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + blksize_t st_blksize; + blkcnt_t st_blocks; +#if !defined(__rtems__) + long st_spare4[2]; +#endif +#endif +}; + +#if !(defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)) +#define st_atime st_atim.tv_sec +#define st_ctime st_ctim.tv_sec +#define st_mtime st_mtim.tv_sec +#endif + +#endif + +#define _IFMT 0170000 /* type of file */ +#define _IFDIR 0040000 /* directory */ +#define _IFCHR 0020000 /* character special */ +#define _IFBLK 0060000 /* block special */ +#define _IFREG 0100000 /* regular */ +#define _IFLNK 0120000 /* symbolic link */ +#define _IFSOCK 0140000 /* socket */ +#define _IFIFO 0010000 /* fifo */ + +#define S_BLKSIZE 1024 /* size of a block */ + +#define S_ISUID 0004000 /* set user id on execution */ +#define S_ISGID 0002000 /* set group id on execution */ +#define S_ISVTX 0001000 /* save swapped text even after use */ +#if __BSD_VISIBLE +#define S_IREAD 0000400 /* read permission, owner */ +#define S_IWRITE 0000200 /* write permission, owner */ +#define S_IEXEC 0000100 /* execute/search permission, owner */ +#define S_ENFMT 0002000 /* enforcement-mode locking */ +#endif /* !_BSD_VISIBLE */ + +#define S_IFMT _IFMT +#define S_IFDIR _IFDIR +#define S_IFCHR _IFCHR +#define S_IFBLK _IFBLK +#define S_IFREG _IFREG +#define S_IFLNK _IFLNK +#define S_IFSOCK _IFSOCK +#define S_IFIFO _IFIFO + +#ifdef _WIN32 +/* The Windows header files define _S_ forms of these, so we do too + for easier portability. */ +#define _S_IFMT _IFMT +#define _S_IFDIR _IFDIR +#define _S_IFCHR _IFCHR +#define _S_IFIFO _IFIFO +#define _S_IFREG _IFREG +#define _S_IREAD 0000400 +#define _S_IWRITE 0000200 +#define _S_IEXEC 0000100 +#endif + +#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) +#define S_IRUSR 0000400 /* read permission, owner */ +#define S_IWUSR 0000200 /* write permission, owner */ +#define S_IXUSR 0000100/* execute/search permission, owner */ +#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +#define S_IRGRP 0000040 /* read permission, group */ +#define S_IWGRP 0000020 /* write permission, grougroup */ +#define S_IXGRP 0000010/* execute/search permission, group */ +#define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +#define S_IROTH 0000004 /* read permission, other */ +#define S_IWOTH 0000002 /* write permission, other */ +#define S_IXOTH 0000001/* execute/search permission, other */ + +#if __BSD_VISIBLE +#define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO) /* 0777 */ +#define ALLPERMS (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO) /* 07777 */ +#define DEFFILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) /* 0666 */ +#endif + +#define S_ISBLK(m) (((m)&_IFMT) == _IFBLK) +#define S_ISCHR(m) (((m)&_IFMT) == _IFCHR) +#define S_ISDIR(m) (((m)&_IFMT) == _IFDIR) +#define S_ISFIFO(m) (((m)&_IFMT) == _IFIFO) +#define S_ISREG(m) (((m)&_IFMT) == _IFREG) +#define S_ISLNK(m) (((m)&_IFMT) == _IFLNK) +#define S_ISSOCK(m) (((m)&_IFMT) == _IFSOCK) + +#if defined(__CYGWIN__) || defined(__rtems__) +/* Special tv_nsec values for futimens(2) and utimensat(2). */ +#define UTIME_NOW -2L +#define UTIME_OMIT -1L +#endif + +int chmod (const char *__path, mode_t __mode ); +int fchmod (int __fd, mode_t __mode); +int fstat (int __fd, struct stat *__sbuf ); +int mkdir (const char *_path, mode_t __mode ); +int mkfifo (const char *__path, mode_t __mode ); +int stat (const char *__restrict __path, struct stat *__restrict __sbuf ); +mode_t umask (mode_t __mask ); + +#if defined (__SPU__) || defined(__rtems__) || defined(__CYGWIN__) +int lstat (const char *__restrict __path, struct stat *__restrict __buf ); +int mknod (const char *__path, mode_t __mode, dev_t __dev ); +#endif + +#if __ATFILE_VISIBLE && !defined(__INSIDE_CYGWIN__) +int fchmodat (int, const char *, mode_t, int); +int fstatat (int, const char *__restrict , struct stat *__restrict, int); +int mkdirat (int, const char *, mode_t); +int mkfifoat (int, const char *, mode_t); +int mknodat (int, const char *, mode_t, dev_t); +int utimensat (int, const char *, const struct timespec [2], int); +#endif +#if __POSIX_VISIBLE >= 200809 && !defined(__INSIDE_CYGWIN__) +int futimens (int, const struct timespec [2]); +#endif + +/* Provide prototypes for most of the _ names that are + provided in newlib for some compilers. */ +#ifdef _LIBC +int _fstat (int __fd, struct stat *__sbuf ); +int _stat (const char *__restrict __path, struct stat *__restrict __sbuf ); +int _mkdir (const char *_path, mode_t __mode ); +#ifdef __LARGE64_FILES +struct stat64; +int _stat64 (const char *__restrict __path, struct stat64 *__restrict __sbuf ); +int _fstat64 (int __fd, struct stat64 *__sbuf ); +#endif +#endif + +#endif /* !_STAT_H_ */ +#ifdef __cplusplus +} +#endif +#endif /* _SYS_STAT_H */ diff --git a/include/sys/stdio.h b/include/sys/stdio.h new file mode 100644 index 0000000..91a2745 --- /dev/null +++ b/include/sys/stdio.h @@ -0,0 +1,27 @@ +#ifndef _NEWLIB_STDIO_H +#define _NEWLIB_STDIO_H + +#include +#include + +/* Internal locking macros, used to protect stdio functions. In the + general case, expand to nothing. Use __SSTR flag in FILE _flags to + detect if FILE is private to sprintf/sscanf class of functions; if + set then do nothing as lock is not initialised. */ +#if !defined(_flockfile) +#ifndef __SINGLE_THREAD__ +# define _flockfile(fp) (((fp)->_flags & __SSTR) ? 0 : __lock_acquire_recursive((fp)->_lock)) +#else +# define _flockfile(fp) ((void) 0) +#endif +#endif + +#if !defined(_funlockfile) +#ifndef __SINGLE_THREAD__ +# define _funlockfile(fp) (((fp)->_flags & __SSTR) ? 0 : __lock_release_recursive((fp)->_lock)) +#else +# define _funlockfile(fp) ((void) 0) +#endif +#endif + +#endif /* _NEWLIB_STDIO_H */ diff --git a/include/sys/string.h b/include/sys/string.h new file mode 100644 index 0000000..ceedf4b --- /dev/null +++ b/include/sys/string.h @@ -0,0 +1,2 @@ +/* This is a dummy used as a placeholder for + systems that need to have a special header file. */ diff --git a/include/sys/syslimits.h b/include/sys/syslimits.h new file mode 100644 index 0000000..c872d20 --- /dev/null +++ b/include/sys/syslimits.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD: src/sys/sys/syslimits.h,v 1.10 2001/06/18 20:24:54 wollman Exp $ + */ + +#ifndef _SYS_SYSLIMITS_H_ +#define _SYS_SYSLIMITS_H_ + +#define ARG_MAX 65536 /* max bytes for an exec function */ +#ifndef CHILD_MAX +#define CHILD_MAX 40 /* max simultaneous processes */ +#endif +#define LINK_MAX 32767 /* max file link count */ +#define MAX_CANON 255 /* max bytes in term canon input line */ +#define MAX_INPUT 255 /* max bytes in terminal input */ +#define NAME_MAX 255 /* max bytes in a file name */ +#define NGROUPS_MAX 16 /* max supplemental group id's */ +#ifndef OPEN_MAX +#define OPEN_MAX 64 /* max open files per process */ +#endif +#define PATH_MAX 1024 /* max bytes in pathname */ +#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ +#define IOV_MAX 1024 /* max elements in i/o vector */ + +#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */ +#define BC_DIM_MAX 2048 /* max array elements in bc(1) */ +#define BC_SCALE_MAX 99 /* max scale value in bc(1) */ +#define BC_STRING_MAX 1000 /* max const string length in bc(1) */ +#define COLL_WEIGHTS_MAX 0 /* max weights for order keyword */ +#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */ +#define LINE_MAX 2048 /* max bytes in an input line */ +#define RE_DUP_MAX 255 /* max RE's in interval notation */ + +#endif diff --git a/include/sys/time.h b/include/sys/time.h new file mode 100644 index 0000000..5a3dec7 --- /dev/null +++ b/include/sys/time.h @@ -0,0 +1,448 @@ +/* time.h -- An implementation of the standard Unix file. + Written by Geoffrey Noer + Public domain; no rights reserved. */ + +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * $FreeBSD: head/sys/sys/time.h 346176 2019-04-13 04:46:35Z imp $ + */ + +#ifndef _SYS_TIME_H_ +#define _SYS_TIME_H_ + +#include <_ansi.h> +#include +#include +#include +#include + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE +#include +#endif + +struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; +#define DST_NONE 0 /* not on dst */ +#define DST_USA 1 /* USA style dst */ +#define DST_AUST 2 /* Australian style dst */ +#define DST_WET 3 /* Western European dst */ +#define DST_MET 4 /* Middle European dst */ +#define DST_EET 5 /* Eastern European dst */ +#define DST_CAN 6 /* Canada */ + +#if __BSD_VISIBLE +struct bintime { + time_t sec; + uint64_t frac; +}; + +static __inline void +bintime_addx(struct bintime *_bt, uint64_t _x) +{ + uint64_t _u; + + _u = _bt->frac; + _bt->frac += _x; + if (_u > _bt->frac) + _bt->sec++; +} + +static __inline void +bintime_add(struct bintime *_bt, const struct bintime *_bt2) +{ + uint64_t _u; + + _u = _bt->frac; + _bt->frac += _bt2->frac; + if (_u > _bt->frac) + _bt->sec++; + _bt->sec += _bt2->sec; +} + +static __inline void +bintime_sub(struct bintime *_bt, const struct bintime *_bt2) +{ + uint64_t _u; + + _u = _bt->frac; + _bt->frac -= _bt2->frac; + if (_u < _bt->frac) + _bt->sec--; + _bt->sec -= _bt2->sec; +} + +static __inline void +bintime_mul(struct bintime *_bt, u_int _x) +{ + uint64_t _p1, _p2; + + _p1 = (_bt->frac & 0xffffffffull) * _x; + _p2 = (_bt->frac >> 32) * _x + (_p1 >> 32); + _bt->sec *= _x; + _bt->sec += (_p2 >> 32); + _bt->frac = (_p2 << 32) | (_p1 & 0xffffffffull); +} + +static __inline void +bintime_shift(struct bintime *_bt, int _exp) +{ + + if (_exp > 0) { + _bt->sec <<= _exp; + _bt->sec |= _bt->frac >> (64 - _exp); + _bt->frac <<= _exp; + } else if (_exp < 0) { + _bt->frac >>= -_exp; + _bt->frac |= (uint64_t)_bt->sec << (64 + _exp); + _bt->sec >>= -_exp; + } +} + +#define bintime_clear(a) ((a)->sec = (a)->frac = 0) +#define bintime_isset(a) ((a)->sec || (a)->frac) +#define bintime_cmp(a, b, cmp) \ + (((a)->sec == (b)->sec) ? \ + ((a)->frac cmp (b)->frac) : \ + ((a)->sec cmp (b)->sec)) + +#define SBT_1S ((sbintime_t)1 << 32) +#define SBT_1M (SBT_1S * 60) +#define SBT_1MS (SBT_1S / 1000) +#define SBT_1US (SBT_1S / 1000000) +#define SBT_1NS (SBT_1S / 1000000000) /* beware rounding, see nstosbt() */ +#define SBT_MAX 0x7fffffffffffffffLL + +static __inline int +sbintime_getsec(sbintime_t _sbt) +{ + + return (_sbt >> 32); +} + +static __inline sbintime_t +bttosbt(const struct bintime _bt) +{ + + return (((sbintime_t)_bt.sec << 32) + (_bt.frac >> 32)); +} + +static __inline struct bintime +sbttobt(sbintime_t _sbt) +{ + struct bintime _bt; + + _bt.sec = _sbt >> 32; + _bt.frac = _sbt << 32; + return (_bt); +} + +/* + * Decimal<->sbt conversions. Multiplying or dividing by SBT_1NS results in + * large roundoff errors which sbttons() and nstosbt() avoid. Millisecond and + * microsecond functions are also provided for completeness. + * + * These functions return the smallest sbt larger or equal to the + * number of seconds requested so that sbttoX(Xtosbt(y)) == y. Unlike + * top of second computations below, which require that we tick at the + * top of second, these need to be rounded up so we do whatever for at + * least as long as requested. + * + * The naive computation we'd do is this + * ((unit * 2^64 / SIFACTOR) + 2^32-1) >> 32 + * However, that overflows. Instead, we compute + * ((unit * 2^63 / SIFACTOR) + 2^31-1) >> 32 + * and use pre-computed constants that are the ceil of the 2^63 / SIFACTOR + * term to ensure we are using exactly the right constant. We use the lesser + * evil of ull rather than a uint64_t cast to ensure we have well defined + * right shift semantics. With these changes, we get all the ns, us and ms + * conversions back and forth right. + */ +static __inline int64_t +sbttons(sbintime_t _sbt) +{ + uint64_t ns; + + ns = _sbt; + if (ns >= SBT_1S) + ns = (ns >> 32) * 1000000000; + else + ns = 0; + + return (ns + (1000000000 * (_sbt & 0xffffffffu) >> 32)); +} + +static __inline sbintime_t +nstosbt(int64_t _ns) +{ + sbintime_t sb = 0; + + if (_ns >= SBT_1S) { + sb = (_ns / 1000000000) * SBT_1S; + _ns = _ns % 1000000000; + } + /* 9223372037 = ceil(2^63 / 1000000000) */ + sb += ((_ns * 9223372037ull) + 0x7fffffff) >> 31; + return (sb); +} + +static __inline int64_t +sbttous(sbintime_t _sbt) +{ + + return ((1000000 * _sbt) >> 32); +} + +static __inline sbintime_t +ustosbt(int64_t _us) +{ + sbintime_t sb = 0; + + if (_us >= SBT_1S) { + sb = (_us / 1000000) * SBT_1S; + _us = _us % 1000000; + } + /* 9223372036855 = ceil(2^63 / 1000000) */ + sb += ((_us * 9223372036855ull) + 0x7fffffff) >> 31; + return (sb); +} + +static __inline int64_t +sbttoms(sbintime_t _sbt) +{ + + return ((1000 * _sbt) >> 32); +} + +static __inline sbintime_t +mstosbt(int64_t _ms) +{ + sbintime_t sb = 0; + + if (_ms >= SBT_1S) { + sb = (_ms / 1000) * SBT_1S; + _ms = _ms % 1000; + } + /* 9223372036854776 = ceil(2^63 / 1000) */ + sb += ((_ms * 9223372036854776ull) + 0x7fffffff) >> 31; + return (sb); +} + +/*- + * Background information: + * + * When converting between timestamps on parallel timescales of differing + * resolutions it is historical and scientific practice to round down rather + * than doing 4/5 rounding. + * + * The date changes at midnight, not at noon. + * + * Even at 15:59:59.999999999 it's not four'o'clock. + * + * time_second ticks after N.999999999 not after N.4999999999 + */ + +static __inline void +bintime2timespec(const struct bintime *_bt, struct timespec *_ts) +{ + + _ts->tv_sec = _bt->sec; + _ts->tv_nsec = ((uint64_t)1000000000 * + (uint32_t)(_bt->frac >> 32)) >> 32; +} + +static __inline void +timespec2bintime(const struct timespec *_ts, struct bintime *_bt) +{ + + _bt->sec = _ts->tv_sec; + /* 18446744073 = int(2^64 / 1000000000) */ + _bt->frac = _ts->tv_nsec * (uint64_t)18446744073LL; +} + +static __inline void +bintime2timeval(const struct bintime *_bt, struct timeval *_tv) +{ + + _tv->tv_sec = _bt->sec; + _tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32; +} + +static __inline void +timeval2bintime(const struct timeval *_tv, struct bintime *_bt) +{ + + _bt->sec = _tv->tv_sec; + /* 18446744073709 = int(2^64 / 1000000) */ + _bt->frac = _tv->tv_usec * (uint64_t)18446744073709LL; +} + +static __inline struct timespec +sbttots(sbintime_t _sbt) +{ + struct timespec _ts; + + _ts.tv_sec = _sbt >> 32; + _ts.tv_nsec = sbttons((uint32_t)_sbt); + return (_ts); +} + +static __inline sbintime_t +tstosbt(struct timespec _ts) +{ + + return (((sbintime_t)_ts.tv_sec << 32) + nstosbt(_ts.tv_nsec)); +} + +static __inline struct timeval +sbttotv(sbintime_t _sbt) +{ + struct timeval _tv; + + _tv.tv_sec = _sbt >> 32; + _tv.tv_usec = sbttous((uint32_t)_sbt); + return (_tv); +} + +static __inline sbintime_t +tvtosbt(struct timeval _tv) +{ + + return (((sbintime_t)_tv.tv_sec << 32) + ustosbt(_tv.tv_usec)); +} + +/* Operations on timespecs */ +#define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0) +#define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec) +#define timespeccmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +#define timespecadd(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ + if ((vsp)->tv_nsec >= 1000000000L) { \ + (vsp)->tv_sec++; \ + (vsp)->tv_nsec -= 1000000000L; \ + } \ + } while (0) +#define timespecsub(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ + if ((vsp)->tv_nsec < 0) { \ + (vsp)->tv_sec--; \ + (vsp)->tv_nsec += 1000000000L; \ + } \ + } while (0) + +#ifndef _KERNEL /* NetBSD/OpenBSD compatible interfaces */ + +#define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) +#define timeradd(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (0) +#define timersub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) +#endif +#endif /* __BSD_VISIBLE */ + +/* + * Names of the interval timers, and structure + * defining a timer setting. + */ +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +struct itimerval { + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +#ifndef _KERNEL +#include + +__BEGIN_DECLS +int utimes (const char *, const struct timeval [2]); + +#if __BSD_VISIBLE +int adjtime (const struct timeval *, struct timeval *); +int futimes (int, const struct timeval [2]); +int lutimes (const char *, const struct timeval [2]); +int settimeofday (const struct timeval *, const struct timezone *); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE +int getitimer (int __which, struct itimerval *__value); +int setitimer (int __which, const struct itimerval *__restrict __value, + struct itimerval *__restrict __ovalue); +#endif + +int gettimeofday (struct timeval *__restrict __p, + void *__restrict __tz); + +#if __GNU_VISIBLE +int futimesat (int, const char *, const struct timeval [2]); +#endif + +#ifdef _LIBC +int _gettimeofday (struct timeval *__p, void *__tz); +#endif + +__END_DECLS + +#endif /* !_KERNEL */ +#include + +#endif /* !_SYS_TIME_H_ */ diff --git a/include/sys/timeb.h b/include/sys/timeb.h new file mode 100644 index 0000000..ccf6649 --- /dev/null +++ b/include/sys/timeb.h @@ -0,0 +1,40 @@ +/* timeb.h -- An implementation of the standard Unix file. + Written by Ian Lance Taylor + Public domain; no rights reserved. + + declares the structure used by the ftime function, as + well as the ftime function itself. Newlib does not provide an + implementation of ftime. */ + +#ifndef _SYS_TIMEB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define _SYS_TIMEB_H + +#include <_ansi.h> +#include + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +struct timeb +{ + time_t time; + unsigned short millitm; + short timezone; + short dstflag; +}; + +extern int ftime (struct timeb *); + +#ifdef __cplusplus +} +#endif + +#endif /* ! defined (_SYS_TIMEB_H) */ diff --git a/include/sys/times.h b/include/sys/times.h new file mode 100644 index 0000000..25dc8bd --- /dev/null +++ b/include/sys/times.h @@ -0,0 +1,32 @@ +#ifndef _SYS_TIMES_H +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_TIMES_H + +#include <_ansi.h> +#include + +#if !defined(__clock_t_defined) && !defined(_CLOCK_T_DECLARED) +typedef _CLOCK_T_ clock_t; +#define __clock_t_defined +#define _CLOCK_T_DECLARED +#endif + +/* Get Process Times, P1003.1b-1993, p. 92 */ +struct tms { + clock_t tms_utime; /* user time */ + clock_t tms_stime; /* system time */ + clock_t tms_cutime; /* user time, children */ + clock_t tms_cstime; /* system time, children */ +}; + +clock_t times (struct tms *); +#ifdef _LIBC +clock_t _times (struct tms *); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !_SYS_TIMES_H */ diff --git a/include/sys/timespec.h b/include/sys/timespec.h new file mode 100644 index 0000000..2505cef --- /dev/null +++ b/include/sys/timespec.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * from: FreeBSD: src/sys/sys/time.h,v 1.43 2000/03/20 14:09:05 phk Exp + * $FreeBSD$ + */ + +#ifndef _SYS_TIMESPEC_H_ +#define _SYS_TIMESPEC_H_ + +#include +#include + +#if __BSD_VISIBLE +#define TIMEVAL_TO_TIMESPEC(tv, ts) \ + do { \ + (ts)->tv_sec = (tv)->tv_sec; \ + (ts)->tv_nsec = (tv)->tv_usec * 1000; \ + } while (0) +#define TIMESPEC_TO_TIMEVAL(tv, ts) \ + do { \ + (tv)->tv_sec = (ts)->tv_sec; \ + (tv)->tv_usec = (ts)->tv_nsec / 1000; \ + } while (0) + +#endif /* __BSD_VISIBLE */ + +/* + * Structure defined by POSIX.1b to be like a itimerval, but with + * timespecs. Used in the timer_*() system calls. + */ +struct itimerspec { + struct timespec it_interval; + struct timespec it_value; +}; + +#endif /* _SYS_TIMESPEC_H_ */ diff --git a/include/sys/tree.h b/include/sys/tree.h new file mode 100644 index 0000000..2d3cec0 --- /dev/null +++ b/include/sys/tree.h @@ -0,0 +1,864 @@ +/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */ +/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */ +/* $FreeBSD: head/sys/sys/tree.h 347360 2019-05-08 18:47:00Z trasz $ */ + +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright 2002 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_TREE_H_ +#define _SYS_TREE_H_ + +#include + +/* + * This file defines data structures for different types of trees: + * splay trees and red-black trees. + * + * A splay tree is a self-organizing data structure. Every operation + * on the tree causes a splay to happen. The splay moves the requested + * node to the root of the tree and partly rebalances it. + * + * This has the benefit that request locality causes faster lookups as + * the requested nodes move to the top of the tree. On the other hand, + * every lookup causes memory writes. + * + * The Balance Theorem bounds the total access time for m operations + * and n inserts on an initially empty tree as O((m + n)lg n). The + * amortized cost for a sequence of m accesses to a splay tree is O(lg n); + * + * A red-black tree is a binary search tree with the node color as an + * extra attribute. It fulfills a set of conditions: + * - every search path from the root to a leaf consists of the + * same number of black nodes, + * - each red node (except for the root) has a black parent, + * - each leaf node is black. + * + * Every operation on a red-black tree is bounded as O(lg n). + * The maximum height of a red-black tree is 2lg (n+1). + */ + +#define SPLAY_HEAD(name, type) \ +struct name { \ + struct type *sph_root; /* root of the tree */ \ +} + +#define SPLAY_INITIALIZER(root) \ + { NULL } + +#define SPLAY_INIT(root) do { \ + (root)->sph_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ENTRY(type) \ +struct { \ + struct type *spe_left; /* left element */ \ + struct type *spe_right; /* right element */ \ +} + +#define SPLAY_LEFT(elm, field) (elm)->field.spe_left +#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right +#define SPLAY_ROOT(head) (head)->sph_root +#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) + +/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ +#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKLEFT(head, tmp, field) do { \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKRIGHT(head, tmp, field) do { \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ + SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ + +#define SPLAY_PROTOTYPE(name, type, field, cmp) \ +void name##_SPLAY(struct name *, struct type *); \ +void name##_SPLAY_MINMAX(struct name *, int); \ +struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ +struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ + \ +/* Finds the node with the same key as elm */ \ +static __unused __inline struct type * \ +name##_SPLAY_FIND(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) \ + return(NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) \ + return (head->sph_root); \ + return (NULL); \ +} \ + \ +static __unused __inline struct type * \ +name##_SPLAY_NEXT(struct name *head, struct type *elm) \ +{ \ + name##_SPLAY(head, elm); \ + if (SPLAY_RIGHT(elm, field) != NULL) { \ + elm = SPLAY_RIGHT(elm, field); \ + while (SPLAY_LEFT(elm, field) != NULL) { \ + elm = SPLAY_LEFT(elm, field); \ + } \ + } else \ + elm = NULL; \ + return (elm); \ +} \ + \ +static __unused __inline struct type * \ +name##_SPLAY_MIN_MAX(struct name *head, int val) \ +{ \ + name##_SPLAY_MINMAX(head, val); \ + return (SPLAY_ROOT(head)); \ +} + +/* Main splay operation. + * Moves node close to the key of elm to top + */ +#define SPLAY_GENERATE(name, type, field, cmp) \ +struct type * \ +name##_SPLAY_INSERT(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) { \ + SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ + } else { \ + int __comp; \ + name##_SPLAY(head, elm); \ + __comp = (cmp)(elm, (head)->sph_root); \ + if(__comp < 0) { \ + SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ + SPLAY_RIGHT(elm, field) = (head)->sph_root; \ + SPLAY_LEFT((head)->sph_root, field) = NULL; \ + } else if (__comp > 0) { \ + SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT(elm, field) = (head)->sph_root; \ + SPLAY_RIGHT((head)->sph_root, field) = NULL; \ + } else \ + return ((head)->sph_root); \ + } \ + (head)->sph_root = (elm); \ + return (NULL); \ +} \ + \ +struct type * \ +name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *__tmp; \ + if (SPLAY_EMPTY(head)) \ + return (NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) { \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ + } else { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ + name##_SPLAY(head, elm); \ + SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ + } \ + return (elm); \ + } \ + return (NULL); \ +} \ + \ +void \ +name##_SPLAY(struct name *head, struct type *elm) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + int __comp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ + __left = __right = &__node; \ +\ + while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) > 0){ \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} \ + \ +/* Splay with either the minimum or the maximum element \ + * Used to find minimum or maximum element in tree. \ + */ \ +void name##_SPLAY_MINMAX(struct name *head, int __comp) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ + __left = __right = &__node; \ +\ + while (1) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp > 0) { \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} + +#define SPLAY_NEGINF -1 +#define SPLAY_INF 1 + +#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) +#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) +#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) +#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) +#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) +#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) + +#define SPLAY_FOREACH(x, name, head) \ + for ((x) = SPLAY_MIN(name, head); \ + (x) != NULL; \ + (x) = SPLAY_NEXT(name, head, x)) + +/* Macros that define a red-black tree */ +#define RB_HEAD(name, type) \ +struct name { \ + struct type *rbh_root; /* root of the tree */ \ +} + +#define RB_INITIALIZER(root) \ + { NULL } + +#define RB_INIT(root) do { \ + (root)->rbh_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define RB_BLACK 0 +#define RB_RED 1 +#define RB_ENTRY(type) \ +struct { \ + struct type *rbe_left; /* left element */ \ + struct type *rbe_right; /* right element */ \ + struct type *rbe_parent; /* parent element */ \ + int rbe_color; /* node color */ \ +} + +#define RB_LEFT(elm, field) (elm)->field.rbe_left +#define RB_RIGHT(elm, field) (elm)->field.rbe_right +#define RB_PARENT(elm, field) (elm)->field.rbe_parent +#define RB_COLOR(elm, field) (elm)->field.rbe_color +#define RB_ISRED(elm, field) ((elm) != NULL && RB_COLOR(elm, field) == RB_RED) +#define RB_ROOT(head) (head)->rbh_root +#define RB_EMPTY(head) (RB_ROOT(head) == NULL) + +#define RB_SET_PARENT(dst, src, field) do { \ + RB_PARENT(dst, field) = src; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET(elm, parent, field) do { \ + RB_SET_PARENT(elm, parent, field); \ + RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ + RB_COLOR(elm, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET_BLACKRED(black, red, field) do { \ + RB_COLOR(black, field) = RB_BLACK; \ + RB_COLOR(red, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +/* + * Something to be invoked in a loop at the root of every modified subtree, + * from the bottom up to the root, to update augmented node data. + */ +#ifndef RB_AUGMENT +#define RB_AUGMENT(x) break +#endif + +#define RB_SWAP_CHILD(head, out, in, field) do { \ + if (RB_PARENT(out, field) == NULL) \ + RB_ROOT(head) = (in); \ + else if ((out) == RB_LEFT(RB_PARENT(out, field), field)) \ + RB_LEFT(RB_PARENT(out, field), field) = (in); \ + else \ + RB_RIGHT(RB_PARENT(out, field), field) = (in); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_RIGHT(elm, field), elm, field); \ + } \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_LEFT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_LEFT(elm, field), elm, field); \ + } \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +/* + * The RB_PARENT_ROTATE_LEFT() and RB_PARENT_ROTATE_RIGHT() rotations are + * specialized versions of RB_ROTATE_LEFT() and RB_ROTATE_RIGHT() which may be + * used if the parent node exists and the direction of the child element is + * known. + */ + +#define RB_PARENT_ROTATE_LEFT(parent, left, tmp, field) do { \ + (tmp) = RB_RIGHT(left, field); \ + if ((RB_RIGHT(left, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_RIGHT(left, field), left, field); \ + } \ + RB_SET_PARENT(tmp, parent, field); \ + RB_LEFT(parent, field) = (tmp); \ + RB_LEFT(tmp, field) = (left); \ + RB_SET_PARENT(left, tmp, field); \ + RB_AUGMENT(left); \ +} while (/*CONSTCOND*/ 0) + +#define RB_PARENT_ROTATE_RIGHT(parent, right, tmp, field) do { \ + (tmp) = RB_LEFT(right, field); \ + if ((RB_LEFT(right, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_LEFT(right, field), right, field); \ + } \ + RB_SET_PARENT(tmp, parent, field); \ + RB_RIGHT(parent, field) = (tmp); \ + RB_RIGHT(tmp, field) = (right); \ + RB_SET_PARENT(right, tmp, field); \ + RB_AUGMENT(right); \ +} while (/*CONSTCOND*/ 0) + +/* + * The RB_RED_ROTATE_LEFT() and RB_RED_ROTATE_RIGHT() rotations are specialized + * versions of RB_ROTATE_LEFT() and RB_ROTATE_RIGHT() which may be used if we + * rotate an element with a red child which has a black sibling. Such a red + * node must have at least two child nodes so that the following red-black tree + * invariant is fulfilled: + * + * Every path from a given node to any of its descendant NULL nodes goes + * through the same number of black nodes. + * + * elm (could be the root) + * / \ + * BLACK RED (left or right child) + * / \ + * BLACK BLACK + */ + +#define RB_RED_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + RB_RIGHT(elm, field) = RB_LEFT(tmp, field); \ + RB_SET_PARENT(RB_RIGHT(elm, field), elm, field); \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_LEFT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +#define RB_RED_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + RB_LEFT(elm, field) = RB_RIGHT(tmp, field); \ + RB_SET_PARENT(RB_LEFT(elm, field), elm, field); \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ + RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \ + RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \ + RB_PROTOTYPE_INSERT(name, type, attr); \ + RB_PROTOTYPE_REMOVE(name, type, attr); \ + RB_PROTOTYPE_FIND(name, type, attr); \ + RB_PROTOTYPE_NFIND(name, type, attr); \ + RB_PROTOTYPE_NEXT(name, type, attr); \ + RB_PROTOTYPE_PREV(name, type, attr); \ + RB_PROTOTYPE_MINMAX(name, type, attr); \ + RB_PROTOTYPE_REINSERT(name, type, attr); +#define RB_PROTOTYPE_INSERT_COLOR(name, type, attr) \ + attr void name##_RB_INSERT_COLOR(struct name *, struct type *) +#define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr) \ + attr void name##_RB_REMOVE_COLOR(struct name *, struct type *) +#define RB_PROTOTYPE_REMOVE(name, type, attr) \ + attr struct type *name##_RB_REMOVE(struct name *, struct type *) +#define RB_PROTOTYPE_INSERT(name, type, attr) \ + attr struct type *name##_RB_INSERT(struct name *, struct type *) +#define RB_PROTOTYPE_FIND(name, type, attr) \ + attr struct type *name##_RB_FIND(struct name *, struct type *) +#define RB_PROTOTYPE_NFIND(name, type, attr) \ + attr struct type *name##_RB_NFIND(struct name *, struct type *) +#define RB_PROTOTYPE_NEXT(name, type, attr) \ + attr struct type *name##_RB_NEXT(struct type *) +#define RB_PROTOTYPE_PREV(name, type, attr) \ + attr struct type *name##_RB_PREV(struct type *) +#define RB_PROTOTYPE_MINMAX(name, type, attr) \ + attr struct type *name##_RB_MINMAX(struct name *, int) +#define RB_PROTOTYPE_REINSERT(name, type, attr) \ + attr struct type *name##_RB_REINSERT(struct name *, struct type *) + +/* Main rb operation. + * Moves node close to the key of elm to top + */ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ + RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ + RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ + RB_GENERATE_INSERT(name, type, field, cmp, attr) \ + RB_GENERATE_REMOVE(name, type, field, attr) \ + RB_GENERATE_FIND(name, type, field, cmp, attr) \ + RB_GENERATE_NFIND(name, type, field, cmp, attr) \ + RB_GENERATE_NEXT(name, type, field, attr) \ + RB_GENERATE_PREV(name, type, field, attr) \ + RB_GENERATE_MINMAX(name, type, field, attr) \ + RB_GENERATE_REINSERT(name, type, field, cmp, attr) + + +#define RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ +attr void \ +name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ +{ \ + struct type *parent, *gparent, *tmp; \ + while (RB_ISRED((parent = RB_PARENT(elm, field)), field)) { \ + gparent = RB_PARENT(parent, field); \ + if (parent == RB_LEFT(gparent, field)) { \ + tmp = RB_RIGHT(gparent, field); \ + if (RB_ISRED(tmp, field)) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if (RB_RIGHT(parent, field) == elm) { \ + RB_PARENT_ROTATE_LEFT(gparent, parent, \ + tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_RIGHT(head, gparent, tmp, field); \ + } else { \ + tmp = RB_LEFT(gparent, field); \ + if (RB_ISRED(tmp, field)) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if (RB_LEFT(parent, field) == elm) { \ + RB_PARENT_ROTATE_RIGHT(gparent, parent, \ + tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_LEFT(head, gparent, tmp, field); \ + } \ + } \ + RB_COLOR(head->rbh_root, field) = RB_BLACK; \ +} + +#define RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ +attr void \ +name##_RB_REMOVE_COLOR(struct name *head, struct type *parent) \ +{ \ + struct type *elm, *tmp; \ + elm = NULL; \ + do { \ + if (RB_LEFT(parent, field) == elm) { \ + tmp = RB_RIGHT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_RED_ROTATE_LEFT(head, parent, tmp, field); \ + tmp = RB_RIGHT(parent, field); \ + } \ + if (RB_ISRED(RB_RIGHT(tmp, field), field)) \ + RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \ + else if (RB_ISRED(RB_LEFT(tmp, field), field)) { \ + struct type *oleft; \ + RB_PARENT_ROTATE_RIGHT(parent, tmp, \ + oleft, field); \ + RB_COLOR(oleft, field) = RB_BLACK; \ + tmp = oleft; \ + } else { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + continue; \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } else { \ + tmp = RB_LEFT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_RED_ROTATE_RIGHT(head, parent, tmp, field); \ + tmp = RB_LEFT(parent, field); \ + } \ + if (RB_ISRED(RB_LEFT(tmp, field), field)) \ + RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \ + else if (RB_ISRED(RB_RIGHT(tmp, field), field)) { \ + struct type *oright; \ + RB_PARENT_ROTATE_LEFT(parent, tmp, \ + oright, field); \ + RB_COLOR(oright, field) = RB_BLACK; \ + tmp = oright; \ + } else { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + continue; \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } \ + } while (RB_COLOR(elm, field) == RB_BLACK && parent != NULL); \ + RB_COLOR(elm, field) = RB_BLACK; \ +} + +#define RB_GENERATE_REMOVE(name, type, field, attr) \ +attr struct type * \ +name##_RB_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *child, *old, *parent, *right; \ + int color; \ + \ + old = elm; \ + parent = RB_PARENT(elm, field); \ + right = RB_RIGHT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (RB_LEFT(elm, field) == NULL) \ + elm = child = right; \ + else if (right == NULL) \ + elm = child = RB_LEFT(elm, field); \ + else { \ + if ((child = RB_LEFT(right, field)) == NULL) { \ + child = RB_RIGHT(right, field); \ + RB_RIGHT(old, field) = child; \ + parent = elm = right; \ + } else { \ + do \ + elm = child; \ + while ((child = RB_LEFT(elm, field)) != NULL); \ + child = RB_RIGHT(elm, field); \ + parent = RB_PARENT(elm, field); \ + RB_LEFT(parent, field) = child; \ + RB_SET_PARENT(RB_RIGHT(old, field), elm, field); \ + } \ + RB_SET_PARENT(RB_LEFT(old, field), elm, field); \ + color = RB_COLOR(elm, field); \ + elm->field = old->field; \ + } \ + RB_SWAP_CHILD(head, old, elm, field); \ + if (child != NULL) { \ + RB_SET_PARENT(child, parent, field); \ + RB_COLOR(child, field) = RB_BLACK; \ + } else if (color != RB_RED && parent != NULL) \ + name##_RB_REMOVE_COLOR(head, parent); \ + while (parent != NULL) { \ + RB_AUGMENT(parent); \ + parent = RB_PARENT(parent, field); \ + } \ + return (old); \ +} + +#define RB_GENERATE_INSERT(name, type, field, cmp, attr) \ +/* Inserts a node into the RB tree */ \ +attr struct type * \ +name##_RB_INSERT(struct name *head, struct type *elm) \ +{ \ + struct type *tmp; \ + struct type *parent = NULL; \ + int comp = 0; \ + tmp = RB_ROOT(head); \ + while (tmp) { \ + parent = tmp; \ + comp = (cmp)(elm, parent); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + RB_SET(elm, parent, field); \ + if (parent != NULL) { \ + if (comp < 0) \ + RB_LEFT(parent, field) = elm; \ + else \ + RB_RIGHT(parent, field) = elm; \ + } else \ + RB_ROOT(head) = elm; \ + name##_RB_INSERT_COLOR(head, elm); \ + while (elm != NULL) { \ + RB_AUGMENT(elm); \ + elm = RB_PARENT(elm, field); \ + } \ + return (NULL); \ +} + +#define RB_GENERATE_FIND(name, type, field, cmp, attr) \ +/* Finds the node with the same key as elm */ \ +attr struct type * \ +name##_RB_FIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (NULL); \ +} + +#define RB_GENERATE_NFIND(name, type, field, cmp, attr) \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} + +#define RB_GENERATE_NEXT(name, type, field, attr) \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_NEXT(struct type *elm) \ +{ \ + if (RB_RIGHT(elm, field)) { \ + elm = RB_RIGHT(elm, field); \ + while (RB_LEFT(elm, field)) \ + elm = RB_LEFT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} + +#define RB_GENERATE_PREV(name, type, field, attr) \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if (RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while (RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} + +#define RB_GENERATE_MINMAX(name, type, field, attr) \ +attr struct type * \ +name##_RB_MINMAX(struct name *head, int val) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *parent = NULL; \ + while (tmp) { \ + parent = tmp; \ + if (val < 0) \ + tmp = RB_LEFT(tmp, field); \ + else \ + tmp = RB_RIGHT(tmp, field); \ + } \ + return (parent); \ +} + +#define RB_GENERATE_REINSERT(name, type, field, cmp, attr) \ +attr struct type * \ +name##_RB_REINSERT(struct name *head, struct type *elm) \ +{ \ + struct type *cmpelm; \ + if (((cmpelm = RB_PREV(name, head, elm)) != NULL && \ + cmp(cmpelm, elm) >= 0) || \ + ((cmpelm = RB_NEXT(name, head, elm)) != NULL && \ + cmp(elm, cmpelm) >= 0)) { \ + /* XXXLAS: Remove/insert is heavy handed. */ \ + RB_REMOVE(name, head, elm); \ + return (RB_INSERT(name, head, elm)); \ + } \ + return (NULL); \ +} \ + +#define RB_NEGINF -1 +#define RB_INF 1 + +#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) +#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) +#define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) +#define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) +#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) +#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) +#define RB_REINSERT(name, x, y) name##_RB_REINSERT(x, y) + +#define RB_FOREACH(x, name, head) \ + for ((x) = RB_MIN(name, head); \ + (x) != NULL; \ + (x) = name##_RB_NEXT(x)) + +#define RB_FOREACH_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_SAFE(x, name, head, y) \ + for ((x) = RB_MIN(name, head); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for ((x) = RB_MAX(name, head); \ + (x) != NULL; \ + (x) = name##_RB_PREV(x)) + +#define RB_FOREACH_REVERSE_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ + for ((x) = RB_MAX(name, head); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#endif /* _SYS_TREE_H_ */ diff --git a/include/sys/types.h b/include/sys/types.h new file mode 100644 index 0000000..5035d54 --- /dev/null +++ b/include/sys/types.h @@ -0,0 +1,228 @@ +/* unified sys/types.h: + start with sef's sysvi386 version. + merge go32 version -- a few ifdefs. + h8300hms, h8300xray, and sysvnecv70 disagree on the following types: + + typedef int gid_t; + typedef int uid_t; + typedef int dev_t; + typedef int ino_t; + typedef int mode_t; + typedef int caddr_t; + + however, these aren't "reasonable" values, the sysvi386 ones make far + more sense, and should work sufficiently well (in particular, h8300 + doesn't have a stat, and the necv70 doesn't matter.) -- eichin + */ + +#ifndef _SYS_TYPES_H + +#include <_ansi.h> +#include +#include + +/* BSD types permitted by POSIX and always exposed as in Glibc. Only provided + for backward compatibility with BSD code. The uintN_t standard types should + be preferred in new code. */ +#if ___int8_t_defined +typedef __uint8_t u_int8_t; +#endif +#if ___int16_t_defined +typedef __uint16_t u_int16_t; +#endif +#if ___int32_t_defined +typedef __uint32_t u_int32_t; +#endif +#if ___int64_t_defined +typedef __uint64_t u_int64_t; +#endif +typedef __intptr_t register_t; +#define __BIT_TYPES_DEFINED__ 1 + +#ifndef __need_inttypes + +#define _SYS_TYPES_H +#include +#include + +#if __BSD_VISIBLE +#include +#include +# define physadr physadr_t +# define quad quad_t + +#ifndef _IN_ADDR_T_DECLARED +typedef __uint32_t in_addr_t; /* base type for internet address */ +#define _IN_ADDR_T_DECLARED +#endif + +#ifndef _IN_PORT_T_DECLARED +typedef __uint16_t in_port_t; +#define _IN_PORT_T_DECLARED +#endif + +typedef __uintptr_t u_register_t; +#endif /* __BSD_VISIBLE */ + +#if __MISC_VISIBLE +#ifndef _BSDTYPES_DEFINED +/* also defined in mingw/gmon.h and in w32api/winsock[2].h */ +#ifndef __u_char_defined +typedef unsigned char u_char; +#define __u_char_defined +#endif +#ifndef __u_short_defined +typedef unsigned short u_short; +#define __u_short_defined +#endif +#ifndef __u_int_defined +typedef unsigned int u_int; +#define __u_int_defined +#endif +#ifndef __u_long_defined +typedef unsigned long u_long; +#define __u_long_defined +#endif +#define _BSDTYPES_DEFINED +#endif +#endif /* __MISC_VISIBLE */ + +#if __MISC_VISIBLE +typedef unsigned short ushort; /* System V compatibility */ +typedef unsigned int uint; /* System V compatibility */ +typedef unsigned long ulong; /* System V compatibility */ +#endif + +#ifndef _BLKCNT_T_DECLARED +typedef __blkcnt_t blkcnt_t; +#define _BLKCNT_T_DECLARED +#endif + +#ifndef _BLKSIZE_T_DECLARED +typedef __blksize_t blksize_t; +#define _BLKSIZE_T_DECLARED +#endif + +#if !defined(__clock_t_defined) && !defined(_CLOCK_T_DECLARED) +typedef _CLOCK_T_ clock_t; +#define __clock_t_defined +#define _CLOCK_T_DECLARED +#endif + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +typedef __daddr_t daddr_t; + +#ifndef __caddr_t_defined +typedef char * caddr_t; +#define __caddr_t_defined +#endif + +#ifndef _FSBLKCNT_T_DECLARED /* for statvfs() */ +typedef __fsblkcnt_t fsblkcnt_t; +typedef __fsfilcnt_t fsfilcnt_t; +#define _FSBLKCNT_T_DECLARED +#endif + +#ifndef _ID_T_DECLARED +typedef __id_t id_t; /* can hold a uid_t or pid_t */ +#define _ID_T_DECLARED +#endif + +#ifndef _INO_T_DECLARED +typedef __ino_t ino_t; /* inode number */ +#define _INO_T_DECLARED +#endif + +#if defined(__i386__) && (defined(GO32) || defined(__MSDOS__)) +typedef char * addr_t; +typedef unsigned long vm_offset_t; +typedef unsigned long vm_size_t; +#endif /* __i386__ && (GO32 || __MSDOS__) */ + +/* + * All these should be machine specific - right now they are all broken. + * However, for all of Cygnus' embedded targets, we want them to all be + * the same. Otherwise things like sizeof (struct stat) might depend on + * how the file was compiled (e.g. -mint16 vs -mint32, etc.). + */ + +#ifndef _OFF_T_DECLARED +typedef __off_t off_t; /* file offset */ +#define _OFF_T_DECLARED +#endif +#ifndef _DEV_T_DECLARED +typedef __dev_t dev_t; /* device number or struct cdev */ +#define _DEV_T_DECLARED +#endif +#ifndef _UID_T_DECLARED +typedef __uid_t uid_t; /* user id */ +#define _UID_T_DECLARED +#endif +#ifndef _GID_T_DECLARED +typedef __gid_t gid_t; /* group id */ +#define _GID_T_DECLARED +#endif + +#ifndef _PID_T_DECLARED +typedef __pid_t pid_t; /* process id */ +#define _PID_T_DECLARED +#endif + +#ifndef _KEY_T_DECLARED +typedef __key_t key_t; /* IPC key */ +#define _KEY_T_DECLARED +#endif + +#ifndef _SSIZE_T_DECLARED +typedef _ssize_t ssize_t; +#define _SSIZE_T_DECLARED +#endif + +#ifndef _MODE_T_DECLARED +typedef __mode_t mode_t; /* permissions */ +#define _MODE_T_DECLARED +#endif + +#ifndef _NLINK_T_DECLARED +typedef __nlink_t nlink_t; /* link count */ +#define _NLINK_T_DECLARED +#endif + +#if !defined(__clockid_t_defined) && !defined(_CLOCKID_T_DECLARED) +typedef __clockid_t clockid_t; +#define __clockid_t_defined +#define _CLOCKID_T_DECLARED +#endif + +#if !defined(__timer_t_defined) && !defined(_TIMER_T_DECLARED) +typedef __timer_t timer_t; +#define __timer_t_defined +#define _TIMER_T_DECLARED +#endif + +#ifndef _USECONDS_T_DECLARED +typedef __useconds_t useconds_t; /* microseconds (unsigned) */ +#define _USECONDS_T_DECLARED +#endif + +#ifndef _SUSECONDS_T_DECLARED +typedef __suseconds_t suseconds_t; +#define _SUSECONDS_T_DECLARED +#endif + +typedef __int64_t sbintime_t; + +#include +#include +#include + +#endif /* !__need_inttypes */ + +#undef __need_inttypes + +#endif /* _SYS_TYPES_H */ diff --git a/include/sys/unistd.h b/include/sys/unistd.h new file mode 100644 index 0000000..216d779 --- /dev/null +++ b/include/sys/unistd.h @@ -0,0 +1,586 @@ +#ifndef _SYS_UNISTD_H +#define _SYS_UNISTD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <_ansi.h> +#define __need_size_t +#define __need_ptrdiff_t +#include +#include +#include +#include + +extern char **environ; + +void _exit (int __status) _ATTRIBUTE ((__noreturn__)); + +int access (const char *__path, int __amode); +unsigned alarm (unsigned __secs); +int chdir (const char *__path); +int chmod (const char *__path, mode_t __mode); +int chown (const char *__path, uid_t __owner, gid_t __group); +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112) +int chroot (const char *__path); +#endif +int close (int __fildes); +#if __POSIX_VISIBLE >= 199209 +size_t confstr (int __name, char *__buf, size_t __len); +#endif +#if __XSI_VISIBLE +char * crypt (const char *__key, const char *__salt); +#endif +#if __XSI_VISIBLE && __XSI_VISIBLE < 700 +char * ctermid (char *__s); +#endif +#if __XSI_VISIBLE && __XSI_VISIBLE < 600 +char * cuserid (char *__s); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +int daemon (int nochdir, int noclose); +#endif +int dup (int __fildes); +int dup2 (int __fildes, int __fildes2); +#if __GNU_VISIBLE +int dup3 (int __fildes, int __fildes2, int flags); +int eaccess (const char *__path, int __mode); +#endif +#if __XSI_VISIBLE +void encrypt (char *__block, int __edflag); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +void endusershell (void); +#endif +#if __GNU_VISIBLE +int euidaccess (const char *__path, int __mode); +#endif +int execl (const char *__path, const char *, ...); +int execle (const char *__path, const char *, ...); +int execlp (const char *__file, const char *, ...); +#if __MISC_VISIBLE +int execlpe (const char *__file, const char *, ...); +#endif +int execv (const char *__path, char * const __argv[]); +int execve (const char *__path, char * const __argv[], char * const __envp[]); +int execvp (const char *__file, char * const __argv[]); +#if __GNU_VISIBLE +int execvpe (const char *__file, char * const __argv[], char * const __envp[]); +#endif +#if __ATFILE_VISIBLE +int faccessat (int __dirfd, const char *__path, int __mode, int __flags); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int fchdir (int __fildes); +#endif +#if __POSIX_VISIBLE >= 199309 +int fchmod (int __fildes, mode_t __mode); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int fchown (int __fildes, uid_t __owner, gid_t __group); +#endif +#if __ATFILE_VISIBLE +int fchownat (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags); +#endif +#if __POSIX_VISIBLE >= 200809 +int fexecve (int __fd, char * const __argv[], char * const __envp[]); +#endif +pid_t fork (void); +long fpathconf (int __fd, int __name); +int fsync (int __fd); +#if __POSIX_VISIBLE >= 199309 +int fdatasync (int __fd); +#endif +#if __GNU_VISIBLE +char * get_current_dir_name (void); +#endif +char * getcwd (char *__buf, size_t __size); +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +int getdomainname (char *__name, size_t __len); +#endif +#if __BSD_VISIBLE +int getentropy (void *, size_t); +#endif +gid_t getegid (void); +uid_t geteuid (void); +gid_t getgid (void); +int getgroups (int __gidsetsize, gid_t __grouplist[]); +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +long gethostid (void); +#endif +char * getlogin (void); +#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) +int getlogin_r (char *name, size_t namesize) ; +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __POSIX_VISIBLE < 200112) +char * getpass (const char *__prompt); +int getpagesize (void); +#endif +#if __BSD_VISIBLE +int getpeereid (int, uid_t *, gid_t *); +#endif +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4 +pid_t getpgid (pid_t); +#endif +pid_t getpgrp (void); +pid_t getpid (void); +pid_t getppid (void); +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4 +pid_t getsid (pid_t); +#endif +uid_t getuid (void); +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +char * getusershell (void); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200809) +char * getwd (char *__buf); +#endif +#if __BSD_VISIBLE +int iruserok (unsigned long raddr, int superuser, const char *ruser, const char *luser); +#endif +int isatty (int __fildes); +#if __BSD_VISIBLE +int issetugid (void); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int lchown (const char *__path, uid_t __owner, gid_t __group); +#endif +int link (const char *__path1, const char *__path2); +#if __ATFILE_VISIBLE +int linkat (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags); +#endif +#if __MISC_VISIBLE || __XSI_VISIBLE +int nice (int __nice_value); +#endif +#if !defined(__INSIDE_CYGWIN__) +off_t lseek (int __fildes, off_t __offset, int __whence); +#endif +#if __MISC_VISIBLE || __XSI_VISIBLE >= 4 +#define F_ULOCK 0 +#define F_LOCK 1 +#define F_TLOCK 2 +#define F_TEST 3 +int lockf (int __fd, int __cmd, off_t __len); +#endif +long pathconf (const char *__path, int __name); +int pause (void); +#if __POSIX_VISIBLE >= 199506 +int pthread_atfork (void (*)(void), void (*)(void), void (*)(void)); +#endif +int pipe (int __fildes[2]); +#if __GNU_VISIBLE +int pipe2 (int __fildes[2], int flags); +#endif +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +ssize_t pread (int __fd, void *__buf, size_t __nbytes, off_t __offset); +ssize_t pwrite (int __fd, const void *__buf, size_t __nbytes, off_t __offset); +#endif +_READ_WRITE_RETURN_TYPE read (int __fd, void *__buf, size_t __nbyte); +#if __BSD_VISIBLE +int rresvport (int *__alport); +int revoke (char *__path); +#endif +int rmdir (const char *__path); +#if __BSD_VISIBLE +int ruserok (const char *rhost, int superuser, const char *ruser, const char *luser); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112) +void * sbrk (ptrdiff_t __incr); +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +int setegid (gid_t __gid); +int seteuid (uid_t __uid); +#endif +int setgid (gid_t __gid); +#if __BSD_VISIBLE +int setgroups (int ngroups, const gid_t *grouplist); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +int sethostname (const char *, size_t); +#endif +int setpgid (pid_t __pid, pid_t __pgid); +#if __SVID_VISIBLE || __XSI_VISIBLE >= 500 +int setpgrp (void); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +int setregid (gid_t __rgid, gid_t __egid); +int setreuid (uid_t __ruid, uid_t __euid); +#endif +pid_t setsid (void); +int setuid (uid_t __uid); +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +void setusershell (void); +#endif +unsigned sleep (unsigned int __seconds); +#if __XSI_VISIBLE +void swab (const void *__restrict, void *__restrict, ssize_t); +#endif +long sysconf (int __name); +pid_t tcgetpgrp (int __fildes); +int tcsetpgrp (int __fildes, pid_t __pgrp_id); +char * ttyname (int __fildes); +int ttyname_r (int, char *, size_t); +int unlink (const char *__path); +#if __XSI_VISIBLE >= 500 && __POSIX_VISIBLE < 200809 || __BSD_VISIBLE +int usleep (useconds_t __useconds); +#endif +#if __BSD_VISIBLE +int vhangup (void); +#endif +_READ_WRITE_RETURN_TYPE write (int __fd, const void *__buf, size_t __nbyte); + +#ifdef __CYGWIN__ +# define __UNISTD_GETOPT__ +# include +# undef __UNISTD_GETOPT__ +#else +extern char *optarg; /* getopt(3) external variables */ +extern int optind, opterr, optopt; +int getopt(int, char * const [], const char *); +extern int optreset; /* getopt(3) external variable */ +#endif + +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200809) +pid_t vfork (void); +#endif + +#ifdef _LIBC +/* Provide prototypes for most of the _ names that are + provided in newlib for some compilers. */ +int _close (int __fildes); +pid_t _fork (void); +pid_t _getpid (void); +int _isatty (int __fildes); +int _link (const char *__path1, const char *__path2); +_off_t _lseek (int __fildes, _off_t __offset, int __whence); +#ifdef __LARGE64_FILES +_off64_t _lseek64 (int __filedes, _off64_t __offset, int __whence); +#endif +_READ_WRITE_RETURN_TYPE _read (int __fd, void *__buf, size_t __nbyte); +void * _sbrk (ptrdiff_t __incr); +int _unlink (const char *__path); +_READ_WRITE_RETURN_TYPE _write (int __fd, const void *__buf, size_t __nbyte); +int _execve (const char *__path, char * const __argv[], char * const __envp[]); +#endif + +#if !defined(__INSIDE_CYGWIN__) +#if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500 +int ftruncate (int __fd, off_t __length); +#endif +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +int truncate (const char *, off_t __length); +#endif +#endif + +#if __BSD_VISIBLE || __POSIX_VISIBLE < 200112 +int getdtablesize (void); +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +useconds_t ualarm (useconds_t __useconds, useconds_t __interval); +#endif + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500 +#if !(defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) +/* winsock[2].h defines as __stdcall, and with int as 2nd arg */ + int gethostname (char *__name, size_t __len); +#endif +#endif + +#if __MISC_VISIBLE +int setdtablesize (int); +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 500 +void sync (void); +#endif + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 4 +ssize_t readlink (const char *__restrict __path, + char *__restrict __buf, size_t __buflen); +int symlink (const char *__name1, const char *__name2); +#endif +#if __ATFILE_VISIBLE +ssize_t readlinkat (int __dirfd1, const char *__restrict __path, + char *__restrict __buf, size_t __buflen); +int symlinkat (const char *, int, const char *); +int unlinkat (int, const char *, int); +#endif + +#define F_OK 0 +#define R_OK 4 +#define W_OK 2 +#define X_OK 1 + +# define SEEK_SET 0 +# define SEEK_CUR 1 +# define SEEK_END 2 + +#include + +#define STDIN_FILENO 0 /* standard input file descriptor */ +#define STDOUT_FILENO 1 /* standard output file descriptor */ +#define STDERR_FILENO 2 /* standard error file descriptor */ + +/* + * sysconf values per IEEE Std 1003.1, 2008 Edition + */ + +#define _SC_ARG_MAX 0 +#define _SC_CHILD_MAX 1 +#define _SC_CLK_TCK 2 +#define _SC_NGROUPS_MAX 3 +#define _SC_OPEN_MAX 4 +#define _SC_JOB_CONTROL 5 +#define _SC_SAVED_IDS 6 +#define _SC_VERSION 7 +#define _SC_PAGESIZE 8 +#define _SC_PAGE_SIZE _SC_PAGESIZE +/* These are non-POSIX values we accidentally introduced in 2000 without + guarding them. Keeping them unguarded for backward compatibility. */ +#define _SC_NPROCESSORS_CONF 9 +#define _SC_NPROCESSORS_ONLN 10 +#define _SC_PHYS_PAGES 11 +#define _SC_AVPHYS_PAGES 12 +/* End of non-POSIX values. */ +#define _SC_MQ_OPEN_MAX 13 +#define _SC_MQ_PRIO_MAX 14 +#define _SC_RTSIG_MAX 15 +#define _SC_SEM_NSEMS_MAX 16 +#define _SC_SEM_VALUE_MAX 17 +#define _SC_SIGQUEUE_MAX 18 +#define _SC_TIMER_MAX 19 +#define _SC_TZNAME_MAX 20 +#define _SC_ASYNCHRONOUS_IO 21 +#define _SC_FSYNC 22 +#define _SC_MAPPED_FILES 23 +#define _SC_MEMLOCK 24 +#define _SC_MEMLOCK_RANGE 25 +#define _SC_MEMORY_PROTECTION 26 +#define _SC_MESSAGE_PASSING 27 +#define _SC_PRIORITIZED_IO 28 +#define _SC_REALTIME_SIGNALS 29 +#define _SC_SEMAPHORES 30 +#define _SC_SHARED_MEMORY_OBJECTS 31 +#define _SC_SYNCHRONIZED_IO 32 +#define _SC_TIMERS 33 +#define _SC_AIO_LISTIO_MAX 34 +#define _SC_AIO_MAX 35 +#define _SC_AIO_PRIO_DELTA_MAX 36 +#define _SC_DELAYTIMER_MAX 37 +#define _SC_THREAD_KEYS_MAX 38 +#define _SC_THREAD_STACK_MIN 39 +#define _SC_THREAD_THREADS_MAX 40 +#define _SC_TTY_NAME_MAX 41 +#define _SC_THREADS 42 +#define _SC_THREAD_ATTR_STACKADDR 43 +#define _SC_THREAD_ATTR_STACKSIZE 44 +#define _SC_THREAD_PRIORITY_SCHEDULING 45 +#define _SC_THREAD_PRIO_INHERIT 46 +/* _SC_THREAD_PRIO_PROTECT was _SC_THREAD_PRIO_CEILING in early drafts */ +#define _SC_THREAD_PRIO_PROTECT 47 +#define _SC_THREAD_PRIO_CEILING _SC_THREAD_PRIO_PROTECT +#define _SC_THREAD_PROCESS_SHARED 48 +#define _SC_THREAD_SAFE_FUNCTIONS 49 +#define _SC_GETGR_R_SIZE_MAX 50 +#define _SC_GETPW_R_SIZE_MAX 51 +#define _SC_LOGIN_NAME_MAX 52 +#define _SC_THREAD_DESTRUCTOR_ITERATIONS 53 +#define _SC_ADVISORY_INFO 54 +#define _SC_ATEXIT_MAX 55 +#define _SC_BARRIERS 56 +#define _SC_BC_BASE_MAX 57 +#define _SC_BC_DIM_MAX 58 +#define _SC_BC_SCALE_MAX 59 +#define _SC_BC_STRING_MAX 60 +#define _SC_CLOCK_SELECTION 61 +#define _SC_COLL_WEIGHTS_MAX 62 +#define _SC_CPUTIME 63 +#define _SC_EXPR_NEST_MAX 64 +#define _SC_HOST_NAME_MAX 65 +#define _SC_IOV_MAX 66 +#define _SC_IPV6 67 +#define _SC_LINE_MAX 68 +#define _SC_MONOTONIC_CLOCK 69 +#define _SC_RAW_SOCKETS 70 +#define _SC_READER_WRITER_LOCKS 71 +#define _SC_REGEXP 72 +#define _SC_RE_DUP_MAX 73 +#define _SC_SHELL 74 +#define _SC_SPAWN 75 +#define _SC_SPIN_LOCKS 76 +#define _SC_SPORADIC_SERVER 77 +#define _SC_SS_REPL_MAX 78 +#define _SC_SYMLOOP_MAX 79 +#define _SC_THREAD_CPUTIME 80 +#define _SC_THREAD_SPORADIC_SERVER 81 +#define _SC_TIMEOUTS 82 +#define _SC_TRACE 83 +#define _SC_TRACE_EVENT_FILTER 84 +#define _SC_TRACE_EVENT_NAME_MAX 85 +#define _SC_TRACE_INHERIT 86 +#define _SC_TRACE_LOG 87 +#define _SC_TRACE_NAME_MAX 88 +#define _SC_TRACE_SYS_MAX 89 +#define _SC_TRACE_USER_EVENT_MAX 90 +#define _SC_TYPED_MEMORY_OBJECTS 91 +#define _SC_V7_ILP32_OFF32 92 +#define _SC_V6_ILP32_OFF32 _SC_V7_ILP32_OFF32 +#define _SC_XBS5_ILP32_OFF32 _SC_V7_ILP32_OFF32 +#define _SC_V7_ILP32_OFFBIG 93 +#define _SC_V6_ILP32_OFFBIG _SC_V7_ILP32_OFFBIG +#define _SC_XBS5_ILP32_OFFBIG _SC_V7_ILP32_OFFBIG +#define _SC_V7_LP64_OFF64 94 +#define _SC_V6_LP64_OFF64 _SC_V7_LP64_OFF64 +#define _SC_XBS5_LP64_OFF64 _SC_V7_LP64_OFF64 +#define _SC_V7_LPBIG_OFFBIG 95 +#define _SC_V6_LPBIG_OFFBIG _SC_V7_LPBIG_OFFBIG +#define _SC_XBS5_LPBIG_OFFBIG _SC_V7_LPBIG_OFFBIG +#define _SC_XOPEN_CRYPT 96 +#define _SC_XOPEN_ENH_I18N 97 +#define _SC_XOPEN_LEGACY 98 +#define _SC_XOPEN_REALTIME 99 +#define _SC_STREAM_MAX 100 +#define _SC_PRIORITY_SCHEDULING 101 +#define _SC_XOPEN_REALTIME_THREADS 102 +#define _SC_XOPEN_SHM 103 +#define _SC_XOPEN_STREAMS 104 +#define _SC_XOPEN_UNIX 105 +#define _SC_XOPEN_VERSION 106 +#define _SC_2_CHAR_TERM 107 +#define _SC_2_C_BIND 108 +#define _SC_2_C_DEV 109 +#define _SC_2_FORT_DEV 110 +#define _SC_2_FORT_RUN 111 +#define _SC_2_LOCALEDEF 112 +#define _SC_2_PBS 113 +#define _SC_2_PBS_ACCOUNTING 114 +#define _SC_2_PBS_CHECKPOINT 115 +#define _SC_2_PBS_LOCATE 116 +#define _SC_2_PBS_MESSAGE 117 +#define _SC_2_PBS_TRACK 118 +#define _SC_2_SW_DEV 119 +#define _SC_2_UPE 120 +#define _SC_2_VERSION 121 +#define _SC_THREAD_ROBUST_PRIO_INHERIT 122 +#define _SC_THREAD_ROBUST_PRIO_PROTECT 123 +#define _SC_XOPEN_UUCP 124 +#define _SC_LEVEL1_ICACHE_SIZE 125 +#define _SC_LEVEL1_ICACHE_ASSOC 126 +#define _SC_LEVEL1_ICACHE_LINESIZE 127 +#define _SC_LEVEL1_DCACHE_SIZE 128 +#define _SC_LEVEL1_DCACHE_ASSOC 129 +#define _SC_LEVEL1_DCACHE_LINESIZE 130 +#define _SC_LEVEL2_CACHE_SIZE 131 +#define _SC_LEVEL2_CACHE_ASSOC 132 +#define _SC_LEVEL2_CACHE_LINESIZE 133 +#define _SC_LEVEL3_CACHE_SIZE 134 +#define _SC_LEVEL3_CACHE_ASSOC 135 +#define _SC_LEVEL3_CACHE_LINESIZE 136 +#define _SC_LEVEL4_CACHE_SIZE 137 +#define _SC_LEVEL4_CACHE_ASSOC 138 +#define _SC_LEVEL4_CACHE_LINESIZE 139 +#define _SC_POSIX_26_VERSION 140 + +/* + * pathconf values per IEEE Std 1003.1, 2008 Edition + */ + +#define _PC_LINK_MAX 0 +#define _PC_MAX_CANON 1 +#define _PC_MAX_INPUT 2 +#define _PC_NAME_MAX 3 +#define _PC_PATH_MAX 4 +#define _PC_PIPE_BUF 5 +#define _PC_CHOWN_RESTRICTED 6 +#define _PC_NO_TRUNC 7 +#define _PC_VDISABLE 8 +#define _PC_ASYNC_IO 9 +#define _PC_PRIO_IO 10 +#define _PC_SYNC_IO 11 +#define _PC_FILESIZEBITS 12 +#define _PC_2_SYMLINKS 13 +#define _PC_SYMLINK_MAX 14 +#define _PC_ALLOC_SIZE_MIN 15 +#define _PC_REC_INCR_XFER_SIZE 16 +#define _PC_REC_MAX_XFER_SIZE 17 +#define _PC_REC_MIN_XFER_SIZE 18 +#define _PC_REC_XFER_ALIGN 19 +#define _PC_TIMESTAMP_RESOLUTION 20 +#ifdef __CYGWIN__ +/* Ask for POSIX permission bits support. */ +#define _PC_POSIX_PERMISSIONS 90 +/* Ask for full POSIX permission support including uid/gid settings. */ +#define _PC_POSIX_SECURITY 91 +#define _PC_CASE_INSENSITIVE 92 +#endif + +/* + * confstr values per IEEE Std 1003.1, 2004 Edition + */ + +/* Only defined on Cygwin and RTEMS for now. */ +#if defined (__CYGWIN__) || defined(__rtems__) +#define _CS_PATH 0 +#define _CS_POSIX_V7_ILP32_OFF32_CFLAGS 1 +#define _CS_POSIX_V6_ILP32_OFF32_CFLAGS _CS_POSIX_V7_ILP32_OFF32_CFLAGS +#define _CS_XBS5_ILP32_OFF32_CFLAGS _CS_POSIX_V7_ILP32_OFF32_CFLAGS +#define _CS_POSIX_V7_ILP32_OFF32_LDFLAGS 2 +#define _CS_POSIX_V6_ILP32_OFF32_LDFLAGS _CS_POSIX_V7_ILP32_OFF32_LDFLAGS +#define _CS_XBS5_ILP32_OFF32_LDFLAGS _CS_POSIX_V7_ILP32_OFF32_LDFLAGS +#define _CS_POSIX_V7_ILP32_OFF32_LIBS 3 +#define _CS_POSIX_V6_ILP32_OFF32_LIBS _CS_POSIX_V7_ILP32_OFF32_LIBS +#define _CS_XBS5_ILP32_OFF32_LIBS _CS_POSIX_V7_ILP32_OFF32_LIBS +#define _CS_XBS5_ILP32_OFF32_LINTFLAGS 4 +#define _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS 5 +#define _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS +#define _CS_XBS5_ILP32_OFFBIG_CFLAGS _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS +#define _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS 6 +#define _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS +#define _CS_XBS5_ILP32_OFFBIG_LDFLAGS _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS +#define _CS_POSIX_V7_ILP32_OFFBIG_LIBS 7 +#define _CS_POSIX_V6_ILP32_OFFBIG_LIBS _CS_POSIX_V7_ILP32_OFFBIG_LIBS +#define _CS_XBS5_ILP32_OFFBIG_LIBS _CS_POSIX_V7_ILP32_OFFBIG_LIBS +#define _CS_XBS5_ILP32_OFFBIG_LINTFLAGS 8 +#define _CS_POSIX_V7_LP64_OFF64_CFLAGS 9 +#define _CS_POSIX_V6_LP64_OFF64_CFLAGS _CS_POSIX_V7_LP64_OFF64_CFLAGS +#define _CS_XBS5_LP64_OFF64_CFLAGS _CS_POSIX_V7_LP64_OFF64_CFLAGS +#define _CS_POSIX_V7_LP64_OFF64_LDFLAGS 10 +#define _CS_POSIX_V6_LP64_OFF64_LDFLAGS _CS_POSIX_V7_LP64_OFF64_LDFLAGS +#define _CS_XBS5_LP64_OFF64_LDFLAGS _CS_POSIX_V7_LP64_OFF64_LDFLAGS +#define _CS_POSIX_V7_LP64_OFF64_LIBS 11 +#define _CS_POSIX_V6_LP64_OFF64_LIBS _CS_POSIX_V7_LP64_OFF64_LIBS +#define _CS_XBS5_LP64_OFF64_LIBS _CS_POSIX_V7_LP64_OFF64_LIBS +#define _CS_XBS5_LP64_OFF64_LINTFLAGS 12 +#define _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS 13 +#define _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS +#define _CS_XBS5_LPBIG_OFFBIG_CFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS +#define _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS 14 +#define _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS +#define _CS_XBS5_LPBIG_OFFBIG_LDFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS +#define _CS_POSIX_V7_LPBIG_OFFBIG_LIBS 15 +#define _CS_POSIX_V6_LPBIG_OFFBIG_LIBS _CS_POSIX_V7_LPBIG_OFFBIG_LIBS +#define _CS_XBS5_LPBIG_OFFBIG_LIBS _CS_POSIX_V7_LPBIG_OFFBIG_LIBS +#define _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS 16 +#define _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS 17 +#define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS +#define _CS_XBS5_WIDTH_RESTRICTED_ENVS _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS +#define _CS_POSIX_V7_THREADS_CFLAGS 18 +#define _CS_POSIX_V7_THREADS_LDFLAGS 19 +#define _CS_V7_ENV 20 +#define _CS_V6_ENV _CS_V7_ENV +#define _CS_LFS_CFLAGS 21 +#define _CS_LFS_LDFLAGS 22 +#define _CS_LFS_LIBS 23 +#define _CS_LFS_LINTFLAGS 24 +#endif + +#ifdef __cplusplus +} +#endif + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _SYS_UNISTD_H */ diff --git a/include/sys/utime.h b/include/sys/utime.h new file mode 100644 index 0000000..5e937f1 --- /dev/null +++ b/include/sys/utime.h @@ -0,0 +1,22 @@ +#ifndef _SYS_UTIME_H +#define _SYS_UTIME_H + +/* This is a dummy file, not customized for any + particular system. If there is a utime.h in libc/sys/SYSDIR/sys, + it will override this one. */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct utimbuf +{ + time_t actime; + time_t modtime; +}; + +#ifdef __cplusplus +}; +#endif + +#endif /* _SYS_UTIME_H */ diff --git a/include/sys/wait.h b/include/sys/wait.h new file mode 100644 index 0000000..d15eec9 --- /dev/null +++ b/include/sys/wait.h @@ -0,0 +1,44 @@ +#ifndef _SYS_WAIT_H +#define _SYS_WAIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define WNOHANG 1 +#define WUNTRACED 2 + +/* A status looks like: + <1 byte info> <1 byte code> + + == 0, child has exited, info is the exit value + == 1..7e, child has exited, info is the signal number. + == 7f, child has stopped, info was the signal number. + == 80, there was a core dump. +*/ + +#define WIFEXITED(w) (((w) & 0xff) == 0) +#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f)) +#define WIFSTOPPED(w) (((w) & 0xff) == 0x7f) +#define WEXITSTATUS(w) (((w) >> 8) & 0xff) +#define WTERMSIG(w) ((w) & 0x7f) +#define WSTOPSIG WEXITSTATUS + +pid_t wait (int *); +pid_t waitpid (pid_t, int *, int); + +#ifdef _LIBC +pid_t _wait (int *); +#endif + +/* Provide prototypes for most of the _ names that are + provided in newlib for some compilers. */ +pid_t _wait (int *); + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/include/tar.h b/include/tar.h new file mode 100644 index 0000000..36437fc --- /dev/null +++ b/include/tar.h @@ -0,0 +1,43 @@ +/* + * tar.h + */ + +#ifndef _TAR_H +#define _TAR_H + +#include + +/* General definitions */ +#define TMAGIC "ustar" /* ustar plus null byte. */ +#define TMAGLEN 6 /* Length of the above. */ +#define TVERSION "00" /* 00 without a null byte. */ +#define TVERSLEN 2 /* Length of the above. */ + +/* Typeflag field definitions */ +#define REGTYPE '0' /* Regular file. */ +#define AREGTYPE '\0' /* Regular file. */ +#define LNKTYPE '1' /* Link. */ +#define SYMTYPE '2' /* Symbolic link. */ +#define CHRTYPE '3' /* Character special. */ +#define BLKTYPE '4' /* Block special. */ +#define DIRTYPE '5' /* Directory. */ +#define FIFOTYPE '6' /* FIFO special. */ +#define CONTTYPE '7' /* Reserved. */ + +/* Mode field bit definitions (octal) */ +#define TSUID 04000 /* Set UID on execution. */ +#define TSGID 02000 /* Set GID on execution. */ +#if __XSI_VISIBLE || __POSIX_VISIBLE < 200112 +#define TSVTX 01000 /* On directories, restricted deletion flag. */ +#endif +#define TUREAD 00400 /* Read by owner. */ +#define TUWRITE 00200 /* Write by owner. */ +#define TUEXEC 00100 /* Execute/search by owner. */ +#define TGREAD 00040 /* Read by group. */ +#define TGWRITE 00020 /* Write by group. */ +#define TGEXEC 00010 /* Execute/search by group. */ +#define TOREAD 00004 /* Read by other. */ +#define TOWRITE 00002 /* Write by other. */ +#define TOEXEC 00001 /* Execute/search by other. */ + +#endif diff --git a/include/termios.h b/include/termios.h new file mode 100644 index 0000000..ee1820c --- /dev/null +++ b/include/termios.h @@ -0,0 +1,7 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif diff --git a/include/tgmath.h b/include/tgmath.h new file mode 100644 index 0000000..97dc50e --- /dev/null +++ b/include/tgmath.h @@ -0,0 +1,185 @@ +/* http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/tgmath.h.html */ +/*- + * Copyright (c) 2004 Stefan Farfeleder. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _TGMATH_H_ +#define _TGMATH_H_ + +#include +#include + +#ifdef log2 +#undef log2 +#endif + +/* + * This implementation of requires two implementation-dependent + * macros to be defined: + * __tg_impl_simple(x, y, z, fn, fnf, fnl, ...) + * Invokes fnl() if the corresponding real type of x, y or z is long + * double, fn() if it is double or any has an integer type, and fnf() + * otherwise. + * __tg_impl_full(x, y, z, fn, fnf, fnl, cfn, cfnf, cfnl, ...) + * Invokes [c]fnl() if the corresponding real type of x, y or z is long + * double, [c]fn() if it is double or any has an integer type, and + * [c]fnf() otherwise. The function with the 'c' prefix is called if + * any of x, y or z is a complex number. + * Both macros call the chosen function with all additional arguments passed + * to them, as given by __VA_ARGS__. + * + * Note that these macros cannot be implemented with C's ?: operator, + * because the return type of the whole expression would incorrectly be long + * double complex regardless of the argument types. + */ + +/* requires GCC >= 3.1 */ +#if !__GNUC_PREREQ (3, 1) +#error " not implemented for this compiler" +#endif + +#define __tg_type(__e, __t) \ + __builtin_types_compatible_p(__typeof__(__e), __t) +#define __tg_type3(__e1, __e2, __e3, __t) \ + (__tg_type(__e1, __t) || __tg_type(__e2, __t) || \ + __tg_type(__e3, __t)) +#define __tg_type_corr(__e1, __e2, __e3, __t) \ + (__tg_type3(__e1, __e2, __e3, __t) || \ + __tg_type3(__e1, __e2, __e3, __t _Complex)) +#define __tg_integer(__e1, __e2, __e3) \ + (((__typeof__(__e1))1.5 == 1) || ((__typeof__(__e2))1.5 == 1) || \ + ((__typeof__(__e3))1.5 == 1)) +#define __tg_is_complex(__e1, __e2, __e3) \ + (__tg_type3(__e1, __e2, __e3, float _Complex) || \ + __tg_type3(__e1, __e2, __e3, double _Complex) || \ + __tg_type3(__e1, __e2, __e3, long double _Complex) || \ + __tg_type3(__e1, __e2, __e3, __typeof__(_Complex_I))) + +#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) +#define __tg_impl_simple(x, y, z, fn, fnf, fnl, ...) \ + __builtin_choose_expr(__tg_type_corr(x, y, z, long double), \ + fnl(__VA_ARGS__), __builtin_choose_expr( \ + __tg_type_corr(x, y, z, double) || __tg_integer(x, y, z),\ + fn(__VA_ARGS__), fnf(__VA_ARGS__))) +#else +#define __tg_impl_simple(__x, __y, __z, __fn, __fnf, __fnl, ...) \ + (__tg_type_corr(__x, __y, __z, double) || __tg_integer(__x, __y, __z)) \ + ? __fn(__VA_ARGS__) : __fnf(__VA_ARGS__) +#endif + +#define __tg_impl_full(__x, __y, __z, __fn, __fnf, __fnl, __cfn, __cfnf, __cfnl, ...) \ + __builtin_choose_expr(__tg_is_complex(__x, __y, __z), \ + __tg_impl_simple(__x, __y, __z, __cfn, __cfnf, __cfnl, __VA_ARGS__), \ + __tg_impl_simple(__x, __y, __z, __fn, __fnf, __fnl, __VA_ARGS__)) + +/* Macros to save lots of repetition below */ +#define __tg_simple(__x, __fn) \ + __tg_impl_simple(__x, __x, __x, __fn, __fn##f, __fn##l, __x) +#define __tg_simple2(__x, __y, __fn) \ + __tg_impl_simple(__x, __x, __y, __fn, __fn##f, __fn##l, __x, __y) +#define __tg_simplev(__x, __fn, ...) \ + __tg_impl_simple(__x, __x, __x, __fn, __fn##f, __fn##l, __VA_ARGS__) +#define __tg_full(__x, __fn) \ + __tg_impl_full(__x, __x, __x, __fn, __fn##f, __fn##l, c##__fn, c##__fn##f, c##__fn##l, __x) + +/* 7.22#4 -- These macros expand to real or complex functions, depending on + * the type of their arguments. */ +#define acos(__x) __tg_full(__x, acos) +#define asin(__x) __tg_full(__x, asin) +#define atan(__x) __tg_full(__x, atan) +#define acosh(__x) __tg_full(__x, acosh) +#define asinh(__x) __tg_full(__x, asinh) +#define atanh(__x) __tg_full(__x, atanh) +#define cos(__x) __tg_full(__x, cos) +#define sin(__x) __tg_full(__x, sin) +#define tan(__x) __tg_full(__x, tan) +#define cosh(__x) __tg_full(__x, cosh) +#define sinh(__x) __tg_full(__x, sinh) +#define tanh(__x) __tg_full(__x, tanh) +#define exp(__x) __tg_full(__x, exp) +#define log(__x) __tg_full(__x, log) +#define pow(__x, __y) __tg_impl_full(__x, __x, __y, pow, powf, powl, \ + cpow, cpowf, cpowl, __x, __y) +#define sqrt(__x) __tg_full(__x, sqrt) + +/* "The corresponding type-generic macro for fabs and cabs is fabs." */ +#define fabs(__x) __tg_impl_full(__x, __x, __x, fabs, fabsf, fabsl, \ + cabs, cabsf, cabsl, __x) + +/* 7.22#5 -- These macros are only defined for arguments with real type. */ +#define atan2(__x, __y) __tg_simple2(__x, __y, atan2) +#define cbrt(__x) __tg_simple(__x, cbrt) +#define ceil(__x) __tg_simple(__x, ceil) +#define copysign(__x, __y) __tg_simple2(__x, __y, copysign) +#define erf(__x) __tg_simple(__x, erf) +#define erfc(__x) __tg_simple(__x, erfc) +#define exp2(__x) __tg_simple(__x, exp2) +#define expm1(__x) __tg_simple(__x, expm1) +#define fdim(__x, __y) __tg_simple2(__x, __y, fdim) +#define floor(__x) __tg_simple(__x, floor) +#define fma(__x, __y, __z) __tg_impl_simple(__x, __y, __z, fma, fmaf, fmal, \ + __x, __y, __z) +#define fmax(__x, __y) __tg_simple2(__x, __y, fmax) +#define fmin(__x, __y) __tg_simple2(__x, __y, fmin) +#define fmod(__x, __y) __tg_simple2(__x, __y, fmod) +#define frexp(__x, __y) __tg_simplev(__x, frexp, __x, __y) +#define hypot(__x, __y) __tg_simple2(__x, __y, hypot) +#define ilogb(__x) __tg_simple(__x, ilogb) +#define ldexp(__x, __y) __tg_simplev(__x, ldexp, __x, __y) +#define lgamma(__x) __tg_simple(__x, lgamma) +#define llrint(__x) __tg_simple(__x, llrint) +#define llround(__x) __tg_simple(__x, llround) +#define log10(__x) __tg_simple(__x, log10) +#define log1p(__x) __tg_simple(__x, log1p) +#define log2(__x) __tg_simple(__x, log2) +#define logb(__x) __tg_simple(__x, logb) +#define lrint(__x) __tg_simple(__x, lrint) +#define lround(__x) __tg_simple(__x, lround) +#define nearbyint(__x) __tg_simple(__x, nearbyint) +#define nextafter(__x, __y) __tg_simple2(__x, __y, nextafter) +/* not yet implemented even for _LDBL_EQ_DBL platforms */ +#ifdef __CYGWIN__ +#define nexttoward(__x, __y) __tg_simplev(__x, nexttoward, __x, __y) +#endif +#define remainder(__x, __y) __tg_simple2(__x, __y, remainder) +#define remquo(__x, __y, __z) __tg_impl_simple(__x, __x, __y, remquo, remquof, \ + remquol, __x, __y, __z) +#define rint(__x) __tg_simple(__x, rint) +#define round(__x) __tg_simple(__x, round) +#define scalbn(__x, __y) __tg_simplev(__x, scalbn, __x, __y) +#define scalbln(__x, __y) __tg_simplev(__x, scalbln, __x, __y) +#define tgamma(__x) __tg_simple(__x, tgamma) +#define trunc(__x) __tg_simple(__x, trunc) + +/* 7.22#6 -- These macros always expand to complex functions. */ +#define carg(__x) __tg_simple(__x, carg) +#define cimag(__x) __tg_simple(__x, cimag) +#define conj(__x) __tg_simple(__x, conj) +#define cproj(__x) __tg_simple(__x, cproj) +#define creal(__x) __tg_simple(__x, creal) + +#endif /* !_TGMATH_H_ */ diff --git a/include/threads.h b/include/threads.h new file mode 100644 index 0000000..9fb08b0 --- /dev/null +++ b/include/threads.h @@ -0,0 +1,93 @@ +/*- + * Copyright (c) 2011 Ed Schouten + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _THREADS_H_ +#define _THREADS_H_ + +#include +#include + +typedef void (*tss_dtor_t)(void *); +typedef int (*thrd_start_t)(void *); + +enum { + mtx_plain = 0x1, + mtx_recursive = 0x2, + mtx_timed = 0x4 +}; + +enum { + thrd_busy = 1, + thrd_error = 2, + thrd_nomem = 3, + thrd_success = 4, + thrd_timedout = 5 +}; + +#if !defined(__cplusplus) || __cplusplus < 201103L +#define thread_local _Thread_local +#endif + +__BEGIN_DECLS +void call_once(once_flag *, void (*)(void)); +int cnd_broadcast(cnd_t *); +void cnd_destroy(cnd_t *); +int cnd_init(cnd_t *); +int cnd_signal(cnd_t *); +int cnd_timedwait(cnd_t *__restrict, mtx_t *__restrict __mtx, + const struct timespec *__restrict) + __requires_exclusive(*__mtx); +int cnd_wait(cnd_t *, mtx_t *__mtx) + __requires_exclusive(*__mtx); +void mtx_destroy(mtx_t *__mtx) + __requires_unlocked(*__mtx); +int mtx_init(mtx_t *__mtx, int) + __requires_unlocked(*__mtx); +int mtx_lock(mtx_t *__mtx) + __locks_exclusive(*__mtx); +int mtx_timedlock(mtx_t *__restrict __mtx, + const struct timespec *__restrict) + __trylocks_exclusive(thrd_success, *__mtx); +int mtx_trylock(mtx_t *__mtx) + __trylocks_exclusive(thrd_success, *__mtx); +int mtx_unlock(mtx_t *__mtx) + __unlocks(*__mtx); +int thrd_create(thrd_t *, thrd_start_t, void *); +thrd_t thrd_current(void); +int thrd_detach(thrd_t); +int thrd_equal(thrd_t, thrd_t); +_Noreturn void + thrd_exit(int); +int thrd_join(thrd_t, int *); +int thrd_sleep(const struct timespec *, struct timespec *); +void thrd_yield(void); +int tss_create(tss_t *, tss_dtor_t); +void tss_delete(tss_t); +void * tss_get(tss_t); +int tss_set(tss_t, void *); +__END_DECLS + +#endif /* !_THREADS_H_ */ diff --git a/include/time.h b/include/time.h new file mode 100644 index 0000000..ed6cc70 --- /dev/null +++ b/include/time.h @@ -0,0 +1,313 @@ +/* + * time.h + * + * Struct and function declarations for dealing with time. + */ + +#ifndef _TIME_H_ +#define _TIME_H_ + +#include "_ansi.h" +#include +#include + +#define __need_size_t +#define __need_NULL +#include + +/* Get _CLOCKS_PER_SEC_ */ +#include + +#ifndef _CLOCKS_PER_SEC_ +#define _CLOCKS_PER_SEC_ 1000 +#endif + +#define CLOCKS_PER_SEC _CLOCKS_PER_SEC_ +#define CLK_TCK CLOCKS_PER_SEC + +#include +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +_BEGIN_STD_C + +struct tm +{ + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +#ifdef __TM_GMTOFF + long __TM_GMTOFF; +#endif +#ifdef __TM_ZONE + const char *__TM_ZONE; +#endif +}; + +clock_t clock (void); +double difftime (time_t _time2, time_t _time1); +time_t mktime (struct tm *_timeptr); +time_t time (time_t *_timer); +#ifndef _REENT_ONLY +char *asctime (const struct tm *_tblock); +char *ctime (const time_t *_time); +struct tm *gmtime (const time_t *_timer); +struct tm *localtime (const time_t *_timer); +#endif +size_t strftime (char *__restrict _s, + size_t _maxsize, const char *__restrict _fmt, + const struct tm *__restrict _t); + +#if __POSIX_VISIBLE >= 200809 +extern size_t strftime_l (char *__restrict _s, size_t _maxsize, + const char *__restrict _fmt, + const struct tm *__restrict _t, locale_t _l); +#endif + +char *asctime_r (const struct tm *__restrict, + char *__restrict); +char *ctime_r (const time_t *, char *); +struct tm *gmtime_r (const time_t *__restrict, + struct tm *__restrict); +struct tm *localtime_r (const time_t *__restrict, + struct tm *__restrict); + +_END_STD_C + +#ifdef __cplusplus +extern "C" { +#endif + +#if __XSI_VISIBLE +char *strptime (const char *__restrict, + const char *__restrict, + struct tm *__restrict); +#endif +#if __GNU_VISIBLE +char *strptime_l (const char *__restrict, const char *__restrict, + struct tm *__restrict, locale_t); +#endif + +#if __POSIX_VISIBLE +void tzset (void); +#endif +void _tzset_r (struct _reent *); + +/* getdate functions */ + +#ifdef HAVE_GETDATE +#if __XSI_VISIBLE >= 4 +#ifndef _REENT_ONLY +#define getdate_err (*__getdate_err()) +int *__getdate_err (void); + +struct tm * getdate (const char *); +/* getdate_err is set to one of the following values to indicate the error. + 1 the DATEMSK environment variable is null or undefined, + 2 the template file cannot be opened for reading, + 3 failed to get file status information, + 4 the template file is not a regular file, + 5 an error is encountered while reading the template file, + 6 memory allication failed (not enough memory available), + 7 there is no line in the template that matches the input, + 8 invalid input specification */ +#endif /* !_REENT_ONLY */ +#endif /* __XSI_VISIBLE >= 4 */ + +#if __GNU_VISIBLE +/* getdate_r returns the error code as above */ +int getdate_r (const char *, struct tm *); +#endif /* __GNU_VISIBLE */ +#endif /* HAVE_GETDATE */ + +/* defines for the opengroup specifications Derived from Issue 1 of the SVID. */ +#if __SVID_VISIBLE || __XSI_VISIBLE +extern __IMPORT long _timezone; +extern __IMPORT int _daylight; +#endif +#if __POSIX_VISIBLE +extern __IMPORT char *_tzname[2]; + +/* POSIX defines the external tzname being defined in time.h */ +#ifndef tzname +#define tzname _tzname +#endif +#endif /* __POSIX_VISIBLE */ + +#ifdef __cplusplus +} +#endif + +#include + +#ifdef __CYGWIN__ +#include +#endif /*__CYGWIN__*/ + +#if defined(_POSIX_TIMERS) + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Clocks, P1003.1b-1993, p. 263 */ + +int clock_settime (clockid_t clock_id, const struct timespec *tp); +int clock_gettime (clockid_t clock_id, struct timespec *tp); +int clock_getres (clockid_t clock_id, struct timespec *res); + +/* Create a Per-Process Timer, P1003.1b-1993, p. 264 */ + +int timer_create (clockid_t clock_id, + struct sigevent *__restrict evp, + timer_t *__restrict timerid); + +/* Delete a Per_process Timer, P1003.1b-1993, p. 266 */ + +int timer_delete (timer_t timerid); + +/* Per-Process Timers, P1003.1b-1993, p. 267 */ + +int timer_settime (timer_t timerid, int flags, + const struct itimerspec *__restrict value, + struct itimerspec *__restrict ovalue); +int timer_gettime (timer_t timerid, struct itimerspec *value); +int timer_getoverrun (timer_t timerid); + +/* High Resolution Sleep, P1003.1b-1993, p. 269 */ + +int nanosleep (const struct timespec *rqtp, struct timespec *rmtp); + +#ifdef __cplusplus +} +#endif +#endif /* _POSIX_TIMERS */ + +#if defined(_POSIX_CLOCK_SELECTION) + +#ifdef __cplusplus +extern "C" { +#endif + +int clock_nanosleep (clockid_t clock_id, int flags, + const struct timespec *rqtp, struct timespec *rmtp); + +#ifdef __cplusplus +} +#endif + +#endif /* _POSIX_CLOCK_SELECTION */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* CPU-time Clock Attributes, P1003.4b/D8, p. 54 */ + +/* values for the clock enable attribute */ + +#define CLOCK_ENABLED 1 /* clock is enabled, i.e. counting execution time */ +#define CLOCK_DISABLED 0 /* clock is disabled */ + +/* values for the pthread cputime_clock_allowed attribute */ + +#define CLOCK_ALLOWED 1 /* If a thread is created with this value a */ + /* CPU-time clock attached to that thread */ + /* shall be accessible. */ +#define CLOCK_DISALLOWED 0 /* If a thread is created with this value, the */ + /* thread shall not have a CPU-time clock */ + /* accessible. */ + +/* Flag indicating time is "absolute" with respect to the clock + associated with a time. Value 4 is historic. */ + +#define TIMER_ABSTIME 4 + +/* Manifest Constants, P1003.1b-1993, p. 262 */ + +#if __GNU_VISIBLE +#define CLOCK_REALTIME_COARSE ((clockid_t) 0) +#endif + +#define CLOCK_REALTIME ((clockid_t) 1) + +/* Manifest Constants, P1003.4b/D8, p. 55 */ + +#if defined(_POSIX_CPUTIME) + +/* When used in a clock or timer function call, this is interpreted as + the identifier of the CPU_time clock associated with the PROCESS + making the function call. */ + +#define CLOCK_PROCESS_CPUTIME_ID ((clockid_t) 2) + +#endif + +#if defined(_POSIX_THREAD_CPUTIME) + +/* When used in a clock or timer function call, this is interpreted as + the identifier of the CPU_time clock associated with the THREAD + making the function call. */ + +#define CLOCK_THREAD_CPUTIME_ID ((clockid_t) 3) + +#endif + +#if defined(_POSIX_MONOTONIC_CLOCK) + +/* The identifier for the system-wide monotonic clock, which is defined + * as a clock whose value cannot be set via clock_settime() and which + * cannot have backward clock jumps. */ + +#define CLOCK_MONOTONIC ((clockid_t) 4) + +#endif + +#if __GNU_VISIBLE + +#define CLOCK_MONOTONIC_RAW ((clockid_t) 5) + +#define CLOCK_MONOTONIC_COARSE ((clockid_t) 6) + +#define CLOCK_BOOTTIME ((clockid_t) 7) + +#define CLOCK_REALTIME_ALARM ((clockid_t) 8) + +#define CLOCK_BOOTTIME_ALARM ((clockid_t) 9) + +#endif + +#if defined(_POSIX_CPUTIME) + +/* Accessing a Process CPU-time CLock, P1003.4b/D8, p. 55 */ + +int clock_getcpuclockid (pid_t pid, clockid_t *clock_id); + +#endif /* _POSIX_CPUTIME */ + +#if defined(_POSIX_CPUTIME) || defined(_POSIX_THREAD_CPUTIME) + +/* CPU-time Clock Attribute Access, P1003.4b/D8, p. 56 */ + +int clock_setenable_attr (clockid_t clock_id, int attr); +int clock_getenable_attr (clockid_t clock_id, int *attr); + +#endif /* _POSIX_CPUTIME or _POSIX_THREAD_CPUTIME */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TIME_H_ */ + diff --git a/include/timeval-utils.h b/include/timeval-utils.h new file mode 100644 index 0000000..adbe818 --- /dev/null +++ b/include/timeval-utils.h @@ -0,0 +1,40 @@ +/* Basic struct timeval utilities. + Copyright (C) 2011-2015 Free Software Foundation, Inc. + +This file is part of the libiberty library. +Libiberty is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +Libiberty is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with libiberty; see the file COPYING.LIB. If not, +write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ + +#ifndef TIMEVAL_UTILS_H +#define TIMEVAL_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* forward decl */ +struct timeval; + +extern void timeval_add (struct timeval *result, + const struct timeval *a, const struct timeval *b); + +extern void timeval_sub (struct timeval *result, + const struct timeval *a, const struct timeval *b); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* TIMEVAL_UTILS_H */ diff --git a/include/unctrl.h b/include/unctrl.h new file mode 100644 index 0000000..3363328 --- /dev/null +++ b/include/unctrl.h @@ -0,0 +1,42 @@ +/* From curses.h. */ +/* + * Copyright (c) 1981, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _UNCTRL_H_ +#define _UNCTRL_H_ + +#include <_ansi.h> + +#define unctrl(c) __unctrl[(c) & 0xff] +#define unctrllen(ch) __unctrllen[(ch) & 0xff] + +extern __IMPORT const char * const __unctrl[256]; /* Control strings. */ +extern __IMPORT const char __unctrllen[256]; /* Control strings length. */ + +#endif /* _UNCTRL_H_ */ diff --git a/include/unistd.h b/include/unistd.h new file mode 100644 index 0000000..f9fca84 --- /dev/null +++ b/include/unistd.h @@ -0,0 +1,6 @@ +#ifndef _UNISTD_H_ +#define _UNISTD_H_ + +# include + +#endif /* _UNISTD_H_ */ diff --git a/include/utime.h b/include/utime.h new file mode 100644 index 0000000..652891a --- /dev/null +++ b/include/utime.h @@ -0,0 +1,12 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#include <_ansi.h> + +/* The utime function is defined in libc/sys//sys if it exists. */ +#include + +#ifdef __cplusplus +} +#endif diff --git a/include/utmp.h b/include/utmp.h new file mode 100644 index 0000000..88cf6f8 --- /dev/null +++ b/include/utmp.h @@ -0,0 +1,8 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + diff --git a/include/vms/ChangeLog b/include/vms/ChangeLog new file mode 100644 index 0000000..8d5e91d --- /dev/null +++ b/include/vms/ChangeLog @@ -0,0 +1,87 @@ +2012-03-08 Tristan Gingold + + * lbr.h (struct vms_lhd): Add comments. + +2010-05-27 Tristan Gingold + + * lbr.h: Improve comments. + +2010-05-17 Tristan Gingold + + * eidc.h: New file. + * esgps.h: New file. + +2010-05-03 Tristan Gingold + + * dmt.h: Improve comments. + +2010-04-30 Tristan Gingold + + * lbr.h (struct vms_kbn): New structure. + +2010-04-30 Tristan Gingold + + * lbr.h (LBR__C_TYP_ISHSTB): Added. + (LHD_SANEID4): Renamed to ... + (LHD_SANEID6): ... this. + (LBR_MAJORID, LBR_ELFMAJORID): New macros. + (struct vms_rfa): New structure. + (struct vms_idxdef): Renamed to ... + (struct vms_idx): ... this. + (struct vms_idxdef2): Renamed to ... + (struct vms_elfidx): ... this. + (ELFIDX__WEAK, ELFIDX__GROUP, ELFIDX__LISTRFA, ELFIDX__SYMESC): New + macros. + (struct vms_lhs, struct vms_lns): New structures. + (struct vms_mhd): Add missing fields. + (MHD__C_MHDLEN): New macro. + +2010-03-31 Tristan Gingold + + * dcx.h: New file. + * dsc.h: New file. + * esdfm.h: New file. + * esdfv.h: New file. + * internal.h: New file. + * lbr.h: New file. + * prt.h: New file. + * shl.h (struct vms_shl): Add comments. + * esrf.h (ESRF__B_NAMLNG): New macro. + * esdf.h (ESDF__B_NAMLNG): New macro. + * emh.h: Add macros for fields maximum value. + * eisd.h (EISD__M_PROTECT): Fix typo in comment. + Add macros for offsets, version, section type and match control. + Merge vms_eisd_ext into vms_eisd. + * eihvn.h (EIHVN__MULTI_PROCESSING_BIT, EIHVN__GALAXY_BIT): Added. + * eihs.h: Remove blank line. + * eihd.h (struct vms_eihd): Add comments, add image subtype names. + * eiha.h (struct vms_eiha): Add inishr and inishr_h fields. + * eiaf.h (struct vms_eiaf): Fix base_va size. + * egsy.h: Add comments. + * egsd.h: Remove blank line. + * egps.h: Add flag names. + * eeom.h (EEOM__M_WKTFR): Added. + * dst.h (DST__K_CXX): Added, and reident languages. + (DST__K_SRC_INCRLNUM_B): Added. + Indent and order pcline commands. + Add record begin/end, enumerations, type specification, value + specification, label, discontinue range definitions. + +2010-02-17 Tristan Gingold + + * dmt.h, dst.h, eeom.h, egps.h, egsd.h, egst.h, egsy.h: New Files. + * eiaf.h, eicp.h, eiha.h, eihd.h, eihi.h, eihs.h, eihvn.h: Ditto. + * eisd.h, emh.h, eobjrec.h, esdf.h, esrf.h, etir.h, shl.h: Ditto. + +Copyright (C) 2010-2012 Free Software Foundation, Inc. + +Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. + +Local Variables: +mode: change-log +left-margin: 8 +fill-column: 74 +version-control: never +End: diff --git a/include/vms/dcx.h b/include/vms/dcx.h new file mode 100644 index 0000000..b6f373a --- /dev/null +++ b/include/vms/dcx.h @@ -0,0 +1,50 @@ +/* Alpha VMS external format for DeCompression. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_DCX_H +#define _VMS_DCX_H + +struct vms_dcxmap +{ + unsigned char size[4]; + unsigned char version[2]; + + unsigned char pad[2]; + unsigned char sanity[4]; + unsigned char flags[4]; + unsigned char nsubs[2]; + unsigned char sub0[2]; +}; + +struct vms_dcxsbm +{ + unsigned char size[2]; + unsigned char min_char; + unsigned char max_char; + unsigned char escape; + unsigned char flags_bits; + unsigned char flags[2]; + unsigned char nodes[2]; + unsigned char next[2]; +}; + +#endif /* _VMS_DCX_H */ diff --git a/include/vms/dmt.h b/include/vms/dmt.h new file mode 100644 index 0000000..f2aad6e --- /dev/null +++ b/include/vms/dmt.h @@ -0,0 +1,48 @@ +/* Alpha VMS external format of Debug Module Table. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_DMT_H +#define _VMS_DMT_H + +struct vms_dmt_header +{ + /* Offset in the DST of the module. */ + unsigned char modbeg[4]; + + /* Size of the DST chunk for this module. */ + unsigned char size[4]; + + /* Number of psect for this module. */ + unsigned char psect_count[2]; + + unsigned char mbz[2]; +}; + +struct vms_dmt_psect +{ + /* Address of the psect. */ + unsigned char start[4]; + + /* Length of the psect. */ + unsigned char length[4]; +}; +#endif /* _VMS_DMT_H */ diff --git a/include/vms/dsc.h b/include/vms/dsc.h new file mode 100644 index 0000000..5a1b0e2 --- /dev/null +++ b/include/vms/dsc.h @@ -0,0 +1,129 @@ +/* Alpha VMS external format of Descriptors. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_DSC_H +#define _VMS_DSC_H + +/* Descriptors. */ +#define DSC__K_DTYPE_Z 0 /* Unspecified. */ +#define DSC__K_DTYPE_V 1 /* Bit. */ +#define DSC__K_DTYPE_BU 2 /* Byte logical. */ +#define DSC__K_DTYPE_WU 3 /* Word logical. */ +#define DSC__K_DTYPE_LU 4 /* Longword logical. */ +#define DSC__K_DTYPE_QU 5 /* Quadword logical. */ +#define DSC__K_DTYPE_B 6 /* Byte integer. */ +#define DSC__K_DTYPE_W 7 /* Word integer. */ +#define DSC__K_DTYPE_L 8 /* Longword integer. */ +#define DSC__K_DTYPE_Q 9 /* Quadword integer. */ +#define DSC__K_DTYPE_F 10 /* Single-precision floating. */ +#define DSC__K_DTYPE_D 11 /* Double-precision floating. */ +#define DSC__K_DTYPE_FC 12 /* Complex. */ +#define DSC__K_DTYPE_DC 13 /* Double-precision Complex. */ +#define DSC__K_DTYPE_T 14 /* ASCII text string. */ +#define DSC__K_DTYPE_NU 15 /* Numeric string, unsigned. */ +#define DSC__K_DTYPE_NL 16 /* Numeric string, left separate sign. */ +#define DSC__K_DTYPE_NLO 17 /* Numeric string, left overpunched sign. */ +#define DSC__K_DTYPE_NR 18 /* Numeric string, right separate sign. */ +#define DSC__K_DTYPE_NRO 19 /* Numeric string, right overpunched sign. */ +#define DSC__K_DTYPE_NZ 20 /* Numeric string, zoned sign. */ +#define DSC__K_DTYPE_P 21 /* Packed decimal string. */ +#define DSC__K_DTYPE_ZI 22 /* Sequence of instructions. */ +#define DSC__K_DTYPE_ZEM 23 /* Procedure entry mask. */ +#define DSC__K_DTYPE_DSC 24 /* Descriptor, used for arrays of dyn strings. */ +#define DSC__K_DTYPE_OU 25 /* Octaword logical. */ +#define DSC__K_DTYPE_O 26 /* Octaword integer. */ +#define DSC__K_DTYPE_G 27 /* Double precision G floating, 64 bit. */ +#define DSC__K_DTYPE_H 28 /* Quadruple precision floating, 128 bit. */ +#define DSC__K_DTYPE_GC 29 /* Double precision complex, G floating. */ +#define DSC__K_DTYPE_HC 30 /* Quadruple precision complex, H floating. */ +#define DSC__K_DTYPE_CIT 31 /* COBOL intermediate temporary. */ +#define DSC__K_DTYPE_BPV 32 /* Bound Procedure Value. */ +#define DSC__K_DTYPE_BLV 33 /* Bound Label Value. */ +#define DSC__K_DTYPE_VU 34 /* Bit Unaligned. */ +#define DSC__K_DTYPE_ADT 35 /* Absolute Date-Time. */ +#define DSC__K_DTYPE_VT 37 /* Varying Text. */ +#define DSC__K_DTYPE_T2 38 /* 16-bit char. */ +#define DSC__K_DTYPE_VT2 39 /* 16-bit varying char. */ + +#define DSC__K_CLASS_S 1 /* Fixed-length scalar/string. */ +#define DSC__K_CLASS_D 2 /* Dynamic string. */ +#define DSC__K_CLASS_V 3 /* Reserved. */ +#define DSC__K_CLASS_A 4 /* Contiguous array. */ +#define DSC__K_CLASS_P 5 /* Procedure argument descriptor. */ +#define DSC__K_CLASS_PI 6 /* Procedure incarnation descriptor. */ +#define DSC__K_CLASS_J 7 /* Reserved. */ +#define DSC__K_CLASS_JI 8 /* Obsolete. */ +#define DSC__K_CLASS_SD 9 /* Decimal (scalar) string. */ +#define DSC__K_CLASS_NCA 10 /* Non-contiguous array. */ +#define DSC__K_CLASS_VS 11 /* Varying string. */ +#define DSC__K_CLASS_VSA 12 /* Varying string array. */ +#define DSC__K_CLASS_UBS 13 /* Unaligned bit string. */ +#define DSC__K_CLASS_UBA 14 /* Unaligned bit array. */ +#define DSC__K_CLASS_SB 15 /* String with bounds. */ +#define DSC__K_CLASS_UBSB 16 /* Unaligned bit string with bounds. */ + +/* Common part. */ + +struct vms_dsc +{ + unsigned char length[2]; + unsigned char dtype; + unsigned char bclass; + unsigned char pointer[4]; +}; + +struct vms_dsc64 +{ + unsigned char mbo[2]; + unsigned char dtype; + unsigned char bclass; + unsigned char mbmo[4]; + unsigned char length[8]; + unsigned char pointer[8]; +}; + +struct vms_dsc_nca +{ + unsigned char length[2]; + unsigned char dtype; + unsigned char bclass; + unsigned char pointer[4]; + + unsigned char scale; + unsigned char digits; + unsigned char aflags; + unsigned char dimct; + + unsigned char arsize[4]; + unsigned char a0[4]; +}; + +struct vms_dsc_ubs +{ + unsigned char length[2]; + unsigned char dtype; + unsigned char bclass; + unsigned char base[4]; + unsigned char pos[4]; +}; + +#endif /* _VMS_DSC_H */ diff --git a/include/vms/dst.h b/include/vms/dst.h new file mode 100644 index 0000000..231d397 --- /dev/null +++ b/include/vms/dst.h @@ -0,0 +1,274 @@ +/* Alpha VMS external format of Debug Symbol Table. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_DST_H +#define _VMS_DST_H + +/* Also available in vms freeware v5.0 debug/alpha_dstrecrds.sdl. */ + +struct vms_dst_header +{ + /* Length. */ + unsigned char length[2]; + + /* Type. */ + unsigned char type[2]; +}; + +/* Beginning of module. */ +#define DST__K_MODBEG 188 + +/* Some well known languages. */ +#define DST__K_MACRO 0 +#define DST__K_BLISS 2 +#define DST__K_C 7 +#define DST__K_ADA 9 +#define DST__K_CXX 15 + +struct vms_dst_modbeg +{ + unsigned char flags; + unsigned char unused; + unsigned char language[4]; + unsigned char major[2]; + unsigned char minor[2]; + /* Module name ASCIC. */ + /* Ident name ASCIC. */ +}; + +/* Routine begin. */ +#define DST__K_RTNBEG 190 + +struct vms_dst_rtnbeg +{ + unsigned char flags; + + /* Address of the code. */ + unsigned char address[4]; + + /* Procedure descriptor address. */ + unsigned char pd_address[4]; + + /* Name: ASCIC */ +}; + +/* Line number. */ +#define DST__K_LINE_NUM 185 + +struct vms_dst_pcline +{ + unsigned char pcline_command; + unsigned char field[4]; +}; + +#define DST__K_DELTA_PC_W 1 +#define DST__K_INCR_LINUM 2 +#define DST__K_INCR_LINUM_W 3 +#define DST__K_SET_LINUM_INCR 4 +#define DST__K_SET_LINUM_INCR_W 5 +#define DST__K_RESET_LINUM_INCR 6 +#define DST__K_BEG_STMT_MODE 7 +#define DST__K_END_STMT_MODE 8 +#define DST__K_SET_LINUM 9 +#define DST__K_SET_PC 10 +#define DST__K_SET_PC_W 11 +#define DST__K_SET_PC_L 12 +#define DST__K_SET_STMTNUM 13 +#define DST__K_TERM 14 +#define DST__K_TERM_W 15 +#define DST__K_SET_ABS_PC 16 +#define DST__K_DELTA_PC_L 17 +#define DST__K_INCR_LINUM_L 18 +#define DST__K_SET_LINUM_B 19 +#define DST__K_SET_LINUM_L 20 +#define DST__K_TERM_L 21 + +/* Routine end. */ +#define DST__K_RTNEND 191 + +struct vms_dst_rtnend +{ + unsigned char unused; + unsigned char size[4]; +}; + +/* Prologue. */ +#define DST__K_PROLOG 162 + +struct vms_dst_prolog +{ + unsigned char bkpt_addr[4]; +}; + +/* Epilog. */ +#define DST__K_EPILOG 127 + +struct vms_dst_epilog +{ + unsigned char flags; + unsigned char count[4]; +}; + +/* Module end. */ +#define DST__K_MODEND 189 + +/* Block begin. */ +#define DST__K_BLKBEG 176 + +struct vms_dst_blkbeg +{ + unsigned char unused; + unsigned char address[4]; + /* Name ASCIC. */ +}; + +/* Block end. */ +#define DST__K_BLKEND 177 + +struct vms_dst_blkend +{ + unsigned char unused; + unsigned char size[4]; +}; + +/* Source correlation. */ +#define DST__K_SOURCE 155 + +#define DST__K_SRC_DECLFILE 1 +#define DST__K_SRC_SETFILE 2 +#define DST__K_SRC_SETREC_L 3 +#define DST__K_SRC_SETREC_W 4 +#define DST__K_SRC_SETLNUM_L 5 +#define DST__K_SRC_SETLNUM_W 6 +#define DST__K_SRC_INCRLNUM_B 7 +#define DST__K_SRC_DEFLINES_W 10 +#define DST__K_SRC_DEFLINES_B 11 +#define DST__K_SRC_FORMFEED 16 + +struct vms_dst_src_decl_src +{ + unsigned char length; + unsigned char flags; + unsigned char fileid[2]; + unsigned char rms_cdt[8]; + unsigned char rms_ebk[4]; + unsigned char rms_ffb[2]; + unsigned char rms_rfo; + /* Filename ASCIC. */ +}; + +/* Record begin. */ +#define DST__K_RECBEG 171 + +struct vms_dst_recbeg +{ + unsigned char vflags; + unsigned char value[4]; + /* Filename ASCIC. */ +}; + +/* Record end. */ +#define DST__K_RECEND 172 + +/* Enumeration begin. */ +#define DST__K_ENUMBEG 165 + +/* Enumeration element. */ +#define DST__K_ENUMELT 164 + +/* Enumeration end. */ +#define DST__K_ENUMEND 166 + +/* Separate type specification. */ +#define DST__K_SEPTYP 163 + +/* Type specification. */ +#define DST__K_TYPSPEC 175 + +#define DST__K_TS_ATOM 1 /* Atomic. */ +#define DST__K_TS_DSC 2 /* VMS Standard descriptor. */ +#define DST__K_TS_IND 3 /* Indirect. */ +#define DST__K_TS_TPTR 4 /* Typed pointer. */ +#define DST__K_TS_PTR 5 /* Pointer. */ +#define DST__K_TS_PIC 6 /* Pictured. */ +#define DST__K_TS_ARRAY 7 +#define DST__K_TS_SET 8 +#define DST__K_TS_SUBRANGE 9 /* Subrange. */ +#define DST__K_TS_ADA_DSC 10 /* Ada descriptor. */ +#define DST__K_TS_FILE 11 +#define DST__K_TS_AREA 12 /* Area (PL/I). */ +#define DST__K_TS_OFFSET 13 /* Offset (PL/I). */ +#define DST__K_TS_NOV_LENG 14 /* Novel Length. */ +#define DST__K_TS_IND_TSPEC 15 /* Internal to debugger. */ +#define DST__K_TS_SELF_REL_LABEL 16 /* Self-relative label (PL/I). */ +#define DST__K_TS_RFA 17 /* (Basic). */ +#define DST__K_TS_TASK 18 /* (Ada). */ +#define DST__K_TS_ADA_ARRAY 19 +#define DST__K_TS_XMOD_IND 20 /* Cross-module indirect type spec. */ +#define DST__K_TS_CONSTRAINED 21 /* (Ada). */ +#define DST__K_TS_MAYBE_CONSTR 22 /* Might-be-constrained (Ada). */ +#define DST__K_TS_DYN_LOV_LENG 23 +#define DST__K_TS_TPTR_D 24 /* Typed pointer to descriptor. */ +#define DST__K_TS_SCAN_TREE 25 +#define DST__K_TS_SCAN_TREEPTR 26 +#define DST__K_TS_INCOMPLETE 27 +#define DST__K_TS_BLISS_BLOCK 28 +#define DST__K_TS_TPTR_64 29 +#define DST__K_TS_PTR_64 30 +#define DST__K_TS_REF 31 /* C++ referenced type. */ +#define DST__K_TS_REF_64 32 + +/* Value Specification. */ +#define DST__K_VFLAGS_NOVAL 128 /* No value. */ +#define DST__K_VFLAGS_NOTACTIVE 248 /* Not active at current PC. */ +#define DST__K_VFLAGS_UNALLOC 249 /* Not allocated. */ +#define DST__K_VFLAGS_DSC 250 /* Descriptor format. */ +#define DST__K_VFLAGS_TVS 251 /* Trailing value spec. */ +#define DST__K_VS_FOLLOWS 253 /* Value specification follow. */ +#define DST__K_VFLAGS_BITOFFS 255 /* Value is a bit offset. */ + +/* Vflags fields. */ +#define DST__K_VALKIND_MASK 0x03 +#define DST__K_INDIR 0x04 +#define DST__K_DISP 0x08 +#define DST__K_REGNUM_MASK 0xf0 +#define DST__K_REGNUM_SHIFT 4 + +#define DST__K_VALKIND_LITERAL 0 +#define DST__K_VALKIND_ADDR 1 +#define DST__K_VALKIND_DESC 2 +#define DST__K_VALKIND_REG 3 + +/* Label. */ +#define DST__K_LABEL 187 + +struct vms_dst_label +{ + unsigned char unused; + + unsigned char value[4]; + unsigned char name[1]; +}; + +/* Discontiguous range. */ +#define DST__K_DIS_RANGE 118 +#endif /* _VMS_DST_H */ diff --git a/include/vms/eeom.h b/include/vms/eeom.h new file mode 100644 index 0000000..807e448 --- /dev/null +++ b/include/vms/eeom.h @@ -0,0 +1,62 @@ +/* Alpha VMS external format of Extended End Of Module. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EEOM_H +#define _VMS_EEOM_H + +/* Completion flags. */ +#define EEOM__C_SUCCESS 0 +#define EEOM__C_WARNING 1 +#define EEOM__C_ERROR 2 +#define EEOM__C_ABORT 3 + +struct vms_eeom +{ + /* Record type. */ + unsigned char rectyp[2]; + + /* Record size. */ + unsigned char size[2]; + + /* Number of conditional linkage pairs. */ + unsigned char total_lps[4]; + + /* Completion code. */ + unsigned char comcod[2]; + + + /* Transfer address flags. */ + unsigned char tfrflg; + + /* Pad for alignment. */ + unsigned char temp; + + /* Psect of transfer address. */ + unsigned char psindx[4]; + + /* Transfer address. */ + unsigned char tfradr[8]; +}; + +#define EEOM__M_WKTFR (1 << 0) /* Transfer address is weak. */ + +#endif /* _VMS_EEOM_H */ diff --git a/include/vms/egps.h b/include/vms/egps.h new file mode 100644 index 0000000..e92df81 --- /dev/null +++ b/include/vms/egps.h @@ -0,0 +1,64 @@ +/* Alpha VMS external format of Extended Program Section Definition. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EGPS_H +#define _VMS_EGPS_H + +struct vms_egps +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char gsdsiz[2]; + + /* Psect alignment. */ + unsigned char align; + + /* Pad for alignment. */ + unsigned char temp; + + unsigned char flags[2]; + + /* Length of this contribution. */ + unsigned char alloc[4]; + + /* Name. */ + unsigned char namlng; + unsigned char name[31]; +}; + +#define EGPS__V_PIC (1 << 0) /* Not meaningful. */ +#define EGPS__V_LIB (1 << 1) /* Defined in a shareable image. */ +#define EGPS__V_OVR (1 << 2) /* Overlaid contribution. */ +#define EGPS__V_REL (1 << 3) /* Relocatable. */ +#define EGPS__V_GBL (1 << 4) /* Global. */ +#define EGPS__V_SHR (1 << 5) /* Shareable. */ +#define EGPS__V_EXE (1 << 6) /* Executable. */ +#define EGPS__V_RD (1 << 7) /* Readable. */ +#define EGPS__V_WRT (1 << 8) /* Writable. */ +#define EGPS__V_VEC (1 << 9) /* Change mode dispatch or message vectors. */ +#define EGPS__V_NOMOD (1 << 10) /* Demand-zero. */ +#define EGPS__V_COM (1 << 11) /* Conditional storage. */ +#define EGPS__V_ALLOC_64BIT (1 << 12) /* Allocated in 64-bit space. */ + +#endif /* _VMS_EGPS_H */ diff --git a/include/vms/egsd.h b/include/vms/egsd.h new file mode 100644 index 0000000..f9be398 --- /dev/null +++ b/include/vms/egsd.h @@ -0,0 +1,60 @@ +/* Alpha VMS external format of Extended Global Symbol Directory. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EGSD_H +#define _VMS_EGSD_H + +#define EGSD__K_ENTRIES 2 /* Offset to first entry in record. */ +#define EGSD__C_ENTRIES 2 /* Offset to first entry in record. */ +#define EGSD__C_PSC 0 /* Psect definition. */ +#define EGSD__C_SYM 1 /* Symbol specification. */ +#define EGSD__C_IDC 2 /* Random entity check. */ +#define EGSD__C_SPSC 5 /* Shareable image psect definition. */ +#define EGSD__C_SYMV 6 /* Vectored (dual-valued) versions of SYM. */ +#define EGSD__C_SYMM 7 /* Masked versions of SYM. */ +#define EGSD__C_SYMG 8 /* EGST - gst version of SYM. */ +#define EGSD__C_MAXRECTYP 8 /* Maximum entry type defined. */ + +struct vms_egsd +{ + /* Record type. */ + unsigned char rectyp[2]; + + /* Record size. */ + unsigned char recsiz[2]; + + /* Padding for alignment. */ + unsigned char alignlw[4]; + + /* Followed by egsd entries. */ +}; + +struct vms_egsd_entry +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char gsdsiz[2]; +}; + +#endif /* _VMS_EGSD_H */ diff --git a/include/vms/egst.h b/include/vms/egst.h new file mode 100644 index 0000000..d424484 --- /dev/null +++ b/include/vms/egst.h @@ -0,0 +1,39 @@ +/* Alpha VMS external format of Extended Global Symbol Definition. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EGST_H +#define _VMS_EGST_H + +struct vms_egst +{ + struct vms_egsy header; + + unsigned char value[8]; + unsigned char lp_1[8]; + unsigned char lp_2[8]; + + unsigned char psindx[4]; + unsigned char namlng; + unsigned char name[31]; +}; + +#endif /* _VMS_EGST_H */ diff --git a/include/vms/egsy.h b/include/vms/egsy.h new file mode 100644 index 0000000..dd36ab2 --- /dev/null +++ b/include/vms/egsy.h @@ -0,0 +1,54 @@ +/* Alpha VMS external format of Extended Global Symbol. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EGSY_H +#define _VMS_EGSY_H + +#define EGSY__W_FLAGS 6 + +#define EGSY__V_WEAK 0x0001 /* Weak symbol definition. */ +#define EGSY__V_DEF 0x0002 /* Symbol definition. */ +#define EGSY__V_UNI 0x0004 /* Reserved. */ +#define EGSY__V_REL 0x0008 /* Relocatable (vs absolute). */ +#define EGSY__V_COMM 0x0010 /* Conditional symbol def. */ +#define EGSY__V_VECEP 0x0020 /* Reserved. */ +#define EGSY__V_NORM 0x0040 /* Normal procedure definition. */ +#define EGSY__V_QUAD_VAL 0x0080 /* Value exceed 32 bits. */ + +struct vms_egsy +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char gsdsiz[2]; + + /* Data type. */ + unsigned char datyp; + + /* Pad for alignment. */ + unsigned char temp; + + unsigned char flags[2]; +}; + +#endif /* _VMS_EGSY_H */ diff --git a/include/vms/eiaf.h b/include/vms/eiaf.h new file mode 100644 index 0000000..c3c3988 --- /dev/null +++ b/include/vms/eiaf.h @@ -0,0 +1,80 @@ +/* Alpha VMS external format of Extended Image Activator Fixup section. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIAF_H +#define _VMS_EIAF_H + +struct vms_eiaf +{ + /* Version. */ + unsigned char majorid[4]; + unsigned char minorid[4]; + + /* Link for image activator use. */ + unsigned char iaflink[8]; + + /* Link for sharable image fixups. */ + unsigned char fixuplnk[8]; + + /* Size of EIAF fixed part. */ + unsigned char size[4]; + + /* Flags. */ + unsigned char flags[4]; + + /* Offsets to quadword and longword relocation fixup data. */ + unsigned char qrelfixoff[4]; + unsigned char lrelfixoff[4]; + + /* Offsets to quardword and longword .address fixup data. */ + unsigned char qdotadroff[4]; + unsigned char ldotadroff[4]; + + /* Offset to code address fixup data. */ + unsigned char codeadroff[4]; + + /* Offset to linkage part fixup data. */ + unsigned char lpfixoff[4]; + + /* Offset to isect change protection data. */ + unsigned char chgprtoff[4]; + + /* Offset to shareable image list. */ + unsigned char shlstoff[4]; + + /* Number of shareable images. */ + unsigned char shrimgcnt[4]; + + /* Number of extra shareable images allowed. */ + unsigned char shlextra[4]; + + /* Permanent shareable image context. */ + unsigned char permctx[4]; + + /* Base address of the image itself. */ + unsigned char base_va[4]; + + /* Offset to linkage pair with procedure signature fixups. */ + unsigned char lppsbfixoff[4]; +}; + +#endif /* _VMS_EIAF_H */ diff --git a/include/vms/eicp.h b/include/vms/eicp.h new file mode 100644 index 0000000..9c769f7 --- /dev/null +++ b/include/vms/eicp.h @@ -0,0 +1,38 @@ +/* Alpha VMS external format of Extended Image section Change Protection. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EICP_H +#define _VMS_EICP_H + +struct vms_eicp +{ + /* Start of section. */ + unsigned char baseva[8]; + + /* Size in bytes of the image section. */ + unsigned char size[4]; + + /* New protections. */ + unsigned char newprt[4]; +}; + +#endif /* _VMS_EICP_H */ diff --git a/include/vms/eidc.h b/include/vms/eidc.h new file mode 100644 index 0000000..987e8c2 --- /dev/null +++ b/include/vms/eidc.h @@ -0,0 +1,49 @@ +/* Alpha VMS external format of Ident Consistency check. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIDC_H +#define _VMS_EIDC_H + +struct vms_eidc +{ + /* Record type. */ + unsigned char rectyp[2]; + + /* Record size. */ + unsigned char recsiz[2]; + + unsigned char flags[4]; + + /* Entity name (ASCIC). */ + /* Object name (ASCIC). */ + /* Ident string (ASCIC or binary BINIDENT set). */ + unsigned char name[1]; +}; + +/* Fields of flags. */ +#define EIDC__V_BINIDENT (1 << 0) /* Ident is a longword. */ +#define EIDC__V_IDMATCH_SH 1 /* Ident match control. */ +#define EIDC__V_IDMATCH_MASK 3 +#define EIDC__V_ERRSEV_SH 3 /* Error severity. */ +#define EIDC__V_ERRSEV_MASK 7 + +#endif /* _VMS_EIDC_H */ diff --git a/include/vms/eiha.h b/include/vms/eiha.h new file mode 100644 index 0000000..5965ef9 --- /dev/null +++ b/include/vms/eiha.h @@ -0,0 +1,54 @@ +/* Alpha VMS external format of Extended Image Activation. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIHA_H +#define _VMS_EIHA_H + +struct vms_eiha +{ + /* Size of the struct. */ + unsigned char size[4]; + + unsigned char spare[4]; + + /* First transfer address. */ + unsigned char tfradr1[4]; + unsigned char tfradr1_h[4]; + + /* Second. */ + unsigned char tfradr2[4]; + unsigned char tfradr2_h[4]; + + /* Third. */ + unsigned char tfradr3[4]; + unsigned char tfradr3_h[4]; + + /* Fourth (must be 0). */ + unsigned char tfradr4[4]; + unsigned char tfradr4_h[4]; + + /* Shared image initialization (only if EIHD__V_INISHR is set). */ + unsigned char inishr[4]; + unsigned char inishr_h[4]; +}; + +#endif /* _VMS_EIHA_H */ diff --git a/include/vms/eihd.h b/include/vms/eihd.h new file mode 100644 index 0000000..fdb3a6e --- /dev/null +++ b/include/vms/eihd.h @@ -0,0 +1,145 @@ +/* Alpha VMS external format of Extended Image Header. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIHD_H +#define _VMS_EIHD_H + +/* Extended Image Header (eihd) structure. */ +struct vms_eihd +{ + /* Version of this EIHD. */ + unsigned char majorid[4]; + unsigned char minorid[4]; + + /* Size in bytes of the header. */ + unsigned char size[4]; + + /* Byte offset to ISD (Image Section Descriptors) list. */ + unsigned char isdoff[4]; + + /* Byte offset to activation data (off=16). */ + unsigned char activoff[4]; + + /* Byte offset to symbol table and debugging data. */ + unsigned char symdbgoff[4]; + + /* Byte offset to image ident. */ + unsigned char imgidoff[4]; + + /* Byte offset to patch data. */ + unsigned char patchoff[4]; + + /* RVA of fixup info (off=32). */ + unsigned char iafva[8]; + + /* RVA of symbol vector. */ + unsigned char symvva[8]; + + /* Byte offset to version number array (off=48). */ + unsigned char version_array_off[4]; + + /* Image type. */ + unsigned char imgtype[4]; + + /* Image subtype. */ + unsigned char subtype[4]; + + /* Size in bytes of image I/O section requested. */ + unsigned char imgiocnt[4]; + + /* Nbr of channels requested (off=64). */ + unsigned char iochancnt[4]; + + /* Requested privilege mask. */ + unsigned char privreqs[8]; + + /* Number of header diskblocks. */ + unsigned char hdrblkcnt[4]; + + /* Linker produced image flags. */ + unsigned char lnkflags[4]; + + /* GBL SEC ident value for linkable image. */ + unsigned char ident[4]; + + /* SYS$K_VERSION or 0 if not linked with exec. */ + unsigned char sysver[4]; + + /* Linker match control. */ + unsigned char matchctl; + unsigned char fill_1[3]; + + /* Size of the symbol vector in bytes. */ + unsigned char symvect_size[4]; + + /* Value of /BPAGE. */ + unsigned char virt_mem_block_size[4]; + + /* Byte offset to extended fixup data. */ + unsigned char ext_fixup_off[4]; + + /* Byte offset to no_optimize psect table. */ + unsigned char noopt_psect_off[4]; + + unsigned char fill_2[398]; + + /* CODE identifies image type to MOM. */ + unsigned char alias[2]; +}; + +#define EIHD__K_MAJORID 3 /* Major id constant */ +#define EIHD__K_MINORID 0 /* Minor id constant */ + +/* Image type. */ +#define EIHD__K_EXE 1 /* Executable image */ +#define EIHD__K_LIM 2 /* Linkable image. */ + +/* Image subtype. */ +#define EIHD__C_NATIVE 0 /* Alpha native image. */ +#define EIHD__C_CLI 1 /* Image is a CLI, run LOGINOUT. */ + +/* Linker image flags. */ +#define EIHD__M_LNKDEBUG 0x0001 /* Full debugging requested. */ +#define EIHD__M_LNKNOTFR 0x0002 /* No first transfer address. */ +#define EIHD__M_NOP0BUFS 0x0004 /* No RMS use of P0 for image I/O. */ +#define EIHD__M_PICIMG 0x0008 /* PIC image. */ +#define EIHD__M_P0IMAGE 0x0010 /* P0 only image. */ +#define EIHD__M_DBGDMT 0x0020 /* Image header has dmt fields. */ +#define EIHD__M_INISHR 0x0040 /* Transfer array contains LNISHR. */ +#define EIHD__M_XLATED 0x0080 /* Translated image. */ +#define EIHD__M_BIND_CODE_SEC 0x0100 /* EXE sect can be put into S0. */ +#define EIHD__M_BIND_DATA_SEC 0x0200 /* DATA sect can be put into S0. */ +#define EIHD__M_MKTHREADS 0x0400 /* Multiple kernel threads. */ +#define EIHD__M_UPCALLS 0x0800 /* Upcalls enabled. */ +#define EIHD__M_OMV_READY 0x1000 /* Can be processed by OMV. */ +#define EIHD__M_EXT_BIND_SECT 0x2000 /* May be moved, using ext fixups. */ + +/* Offsets of some fields. */ +#define EIHD__L_SIZE 8 +#define EIHD__L_ISDOFF 12 +#define EIHD__L_SYMDBGOFF 20 +#define EIHD__Q_SYMVVA 40 +#define EIHD__L_IMGTYPE 52 + +#define EIHD__C_LENGTH 104 + +#endif /* _VMS_EIHD_H */ diff --git a/include/vms/eihi.h b/include/vms/eihi.h new file mode 100644 index 0000000..97d3d89 --- /dev/null +++ b/include/vms/eihi.h @@ -0,0 +1,50 @@ +/* Alpha VMS external format of Extended Image Identification. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIHI_H +#define _VMS_EIHI_H + +#define EIHI__K_MAJORID 1 +#define EIHI__K_MINORID 2 + +struct vms_eihi +{ + unsigned char majorid[4]; + unsigned char minorid[4]; + + /* Time when this image was linked. */ + unsigned char linktime[8]; + + /* Image name. */ + unsigned char imgnam[40]; + + /* Image ident. */ + unsigned char imgid[16]; + + /* Linker ident. */ + unsigned char linkid[16]; + + /* Image build ident. */ + unsigned char imgbid[16]; +}; + +#endif /* _VMS_EIHI_H */ diff --git a/include/vms/eihs.h b/include/vms/eihs.h new file mode 100644 index 0000000..cf048b1 --- /dev/null +++ b/include/vms/eihs.h @@ -0,0 +1,62 @@ +/* Alpha VMS external format of Extended Image Symbols and debug table. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIHS_H +#define _VMS_EIHS_H + +#define EIHS__K_MAJORID 1 +#define EIHS__K_MINORID 1 + +struct vms_eihs +{ + unsigned char majorid[4]; + unsigned char minorid[4]; + + /* Debug symbol table virtual block number (vbn). */ + unsigned char dstvbn[4]; + + /* Debug symbol table size. */ + unsigned char dstsize[4]; + + /* Global symbol table vbn. */ + unsigned char gstvbn[4]; + + /* Global symtol table size. */ + unsigned char gstsize[4]; + + /* Debug module table vbn. */ + unsigned char dmtvbn[4]; + + /* Debug module table size. */ + unsigned char dmtsize[4]; +}; + +/* Various offsets. */ + +#define EIHS__L_DSTVBN 8 +#define EIHS__L_DSTSIZE 12 +#define EIHS__L_GSTVBN 16 +#define EIHS__L_GSTSIZE 20 +#define EIHS__L_DMTVBN 24 +#define EIHS__L_DMTBYTES 28 + +#endif /* _VMS_EIHS_H */ diff --git a/include/vms/eihvn.h b/include/vms/eihvn.h new file mode 100644 index 0000000..07f9eee --- /dev/null +++ b/include/vms/eihvn.h @@ -0,0 +1,58 @@ +/* Alpha VMS external format of Extended Image Header Version. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EIHVN_H +#define _VMS_EIHVN_H + +struct vms_eihvn +{ + unsigned char subsystem_mask[4]; +}; + +struct vms_eihvn_subversion +{ + unsigned char minor[2]; + unsigned char major[2]; +}; + +#define EIHVN__BASE_IMAGE_BIT 0 +#define EIHVN__MEMORY_MANAGEMENT_BIT 1 +#define EIHVN__IO_BIT 2 +#define EIHVN__FILES_VOLUMES_BIT 3 +#define EIHVN__PROCESS_SCHED_BIT 4 +#define EIHVN__SYSGEN_BIT 5 +#define EIHVN__CLUSTERS_LOCKMGR_BIT 6 +#define EIHVN__LOGICAL_NAMES_BIT 7 +#define EIHVN__SECURITY_BIT 8 +#define EIHVN__IMAGE_ACTIVATOR_BIT 9 +#define EIHVN__NETWORKS_BIT 10 +#define EIHVN__COUNTERS_BIT 11 +#define EIHVN__STABLE_BIT 12 +#define EIHVN__MISC_BIT 13 +#define EIHVN__CPU_BIT 14 +#define EIHVN__VOLATILE_BIT 15 +#define EIHVN__SHELL_BIT 16 +#define EIHVN__POSIX_BIT 17 +#define EIHVN__MULTI_PROCESSING_BIT 18 +#define EIHVN__GALAXY_BIT 19 + +#endif /* _VMS_EIHVN_H */ diff --git a/include/vms/eisd.h b/include/vms/eisd.h new file mode 100644 index 0000000..7579e72 --- /dev/null +++ b/include/vms/eisd.h @@ -0,0 +1,118 @@ +/* Alpha VMS external format of Extended Image Section Descriptor. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EISD_H +#define _VMS_EISD_H + +/* Flags. */ +#define EISD__M_GBL 0x0001 /* Global. */ +#define EISD__M_CRF 0x0002 /* Copy on reference. */ +#define EISD__M_DZRO 0x0004 /* Demand zero page. */ +#define EISD__M_WRT 0x0008 /* Writable. */ +#define EISD__M_INITALCODE 0x0010 /* Part of initialization code. */ +#define EISD__M_BASED 0x0020 /* Isect is based. */ +#define EISD__M_FIXUPVEC 0x0040 /* Isect is fixup section. */ +#define EISD__M_RESIDENT 0x0080 /* Isect is memory resident. */ +#define EISD__M_VECTOR 0x0100 /* Vector contained in isect. */ +#define EISD__M_PROTECT 0x0200 /* Isect is protected. */ +#define EISD__M_LASTCLU 0x0400 /* Last cluster. */ +#define EISD__M_EXE 0x0800 /* Code isect. */ +#define EISD__M_NONSHRADR 0x1000 /* Contains non-shareable data. */ +#define EISD__M_QUAD_LENGTH 0x2000 /* Quad length field valid. */ +#define EISD__M_ALLOC_64BIT 0x4000 /* Allocate 64-bit space. */ + +#define EISD__K_LEN 36 +#define EISD__K_LENEND 12 /* For end marker or next block. */ +#define EISD__K_MAXLENGLBL 84 + +#define EISD__K_GBLNAMLEN 44 /* Size of the field. */ + +struct vms_eisd +{ + unsigned char majorid[4]; + unsigned char minorid[4]; + + /* Size (in bytes) of this eisd. */ + unsigned char eisdsize[4]; + + /* Size (in bytes) of the section. */ + unsigned char secsize[4]; + + /* Virtual address of the section. */ + unsigned char virt_addr[8]; + + /* Flags. */ + unsigned char flags[4]; + + /* Base virtual block number. */ + unsigned char vbn[4]; + + /* Page fault cluster. */ + unsigned char pfc; + + /* Linker match control. */ + unsigned char matchctl; + + /* Section type. */ + unsigned char type; + + unsigned char fill_1; + + /* End of structure for normal records. */ + + /* Ident for global section. */ + unsigned char ident[4]; + + /* Global name ascic. First 8 bytes are quad length field. */ + unsigned char gblnam[EISD__K_GBLNAMLEN]; +}; + +/* Versions. */ +#define EISD__K_MAJORID 1 +#define EISD__K_MINORID 1 + +/* Match control. */ +#define EISD__K_MATALL 0 /* Match always. */ +#define EISD__K_MATEQU 1 /* Match if equal. */ +#define EISD__K_MATLEQ 2 /* Match if less or equal. */ +#define EISD__K_MATNEV 3 /* Match never. */ + +/* Section type. */ +#define EISD__K_NORMAL 0 /* Normal program image section. */ +#define EISD__K_SHRFXD 1 /* Shareable fixed section. */ +#define EISD__K_PRVFXD 2 /* Private fixed section. */ +#define EISD__K_SHRPIC 3 /* Shareable pic section. */ +#define EISD__K_PRVPIC 4 /* Private PIC section. */ +#define EISD__K_USRSTACK 253 /* User stack section. */ + +/* EISD offsets. */ + +#define EISD__L_EISDSIZE 8 +#define EISD__L_SECSIZE 12 +#define EISD__Q_VIR_ADDR 16 +#define EISD__L_FLAGS 24 +#define EISD__L_VBN 28 +#define EISD__R_CONTROL 32 +#define EISD__L_IDENT 36 +#define EISD__T_GBLNAM 40 + +#endif /* _VMS_EISD_H */ diff --git a/include/vms/emh.h b/include/vms/emh.h new file mode 100644 index 0000000..973d71e --- /dev/null +++ b/include/vms/emh.h @@ -0,0 +1,79 @@ +/* Alpha VMS external format of Extended Module Header. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EMH_H +#define _VMS_EMH_H + +#define EMH__C_MHD 0 /* Main header record. */ +#define EMH__C_LNM 1 /* Language name and version. */ +#define EMH__C_SRC 2 /* Source file specification. */ +#define EMH__C_TTL 3 /* Title text of module. */ +#define EMH__C_CPR 4 /* Copyright notice. */ +#define EMH__C_MTC 5 /* Maintenance status. */ +#define EMH__C_GTX 6 /* General text. */ +#define EMH__C_MAXHDRTYP 6 /* Maximum allowable type. */ + +struct vms_emh_common +{ + /* Record type. */ + unsigned char rectyp[2]; + + /* Record size. */ + unsigned char size[2]; + + /* Subtype. */ + unsigned char subtyp[2]; +}; + +struct vms_emh_mhd +{ + struct vms_emh_common common; + + unsigned char strlvl; + + unsigned char temp; + + unsigned char arch1[4]; + unsigned char arch2[4]; + + unsigned char recsiz[4]; + + /* Module name: ASCIC. */ + /* Module version: ASCIC. */ + /* Compile data: ASCIC. */ +}; + +#define EOBJ__C_MAXRECSIZ 8192 /* Maximum legal record size. */ +#define EOBJ__C_STRLVL 2 /* Structure level. */ +#define EOBJ__C_SYMSIZ 64 /* Maximum symbol length. */ +#define EOBJ__C_SECSIZ 31 /* Maximum section name length. */ +#define EOBJ__C_STOREPLIM -1 /* Maximum repeat count on store commands. */ +#define EOBJ__C_PSCALILIM 16 /* Maximum p-sect alignment. */ + +struct vms_emh_lnm +{ + struct vms_emh_common common; + + /* Language processor name: ASCII. */ +}; + +#endif /* _VMS_EMH_H */ diff --git a/include/vms/eobjrec.h b/include/vms/eobjrec.h new file mode 100644 index 0000000..985fda7 --- /dev/null +++ b/include/vms/eobjrec.h @@ -0,0 +1,48 @@ +/* Alpha VMS external format of Extended Object Records. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_EOBJREC_H +#define _VMS_EOBJREC_H + +#define EOBJ__C_EMH 8 /* EVAX mdule header record. */ +#define EOBJ__C_EEOM 9 /* EVAX ed of module record. */ +#define EOBJ__C_EGSD 10 /* EVAX gobal symbol definition record. */ +#define EOBJ__C_ETIR 11 /* EVAX txt information record. */ +#define EOBJ__C_EDBG 12 /* EVAX Dbugger information record. */ +#define EOBJ__C_ETBT 13 /* EVAX Taceback information record. */ +#define EOBJ__C_MAXRECTYP 13 /* EVAX Lst assigned record type. */ + +struct vms_eobjrec +{ + /* Record type. */ + unsigned char rectyp[2]; + + /* Record size. */ + unsigned char size[2]; + +#if 0 + /* Record subtype. */ + unsigned char subtyp[2]; +#endif +}; + +#endif /* _VMS_EOBJREC_H */ diff --git a/include/vms/esdf.h b/include/vms/esdf.h new file mode 100644 index 0000000..79ee3d6 --- /dev/null +++ b/include/vms/esdf.h @@ -0,0 +1,41 @@ +/* Alpha VMS external format of Extended GSD Global Symbol Definition. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_ESDF_H +#define _VMS_ESDF_H + +struct vms_esdf +{ + struct vms_egsy header; + + unsigned char value[8]; + unsigned char code_address[8]; + unsigned char ca_psindx[4]; + + unsigned char psindx[4]; + unsigned char namlng; + unsigned char name[31]; +}; + +#define ESDF__B_NAMLNG 32 + +#endif /* _VMS_ESDF_H */ diff --git a/include/vms/esdfm.h b/include/vms/esdfm.h new file mode 100644 index 0000000..e00e44a --- /dev/null +++ b/include/vms/esdfm.h @@ -0,0 +1,49 @@ +/* Alpha VMS external format of Extended Symbol Definition for version Mask. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_ESDFM_H +#define _VMS_ESDFM_H + +struct vms_esdfm +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char size[2]; + + /* Data type. */ + unsigned char datyp; + + /* Pad for alignment. */ + unsigned char temp; + + unsigned char flags[2]; + + unsigned char value[8]; + unsigned char psindx[4]; + unsigned char version_mask[4]; + unsigned char namlng; + unsigned char name[31]; +}; + +#endif /* _VMS_ESDFM_H */ diff --git a/include/vms/esdfv.h b/include/vms/esdfv.h new file mode 100644 index 0000000..fae0dbc --- /dev/null +++ b/include/vms/esdfv.h @@ -0,0 +1,49 @@ +/* Alpha VMS external format of Extended Symbol Def for Vectored symbols. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_ESDFV_H +#define _VMS_ESDFV_H + +struct vms_esdfv +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char size[2]; + + /* Data type. */ + unsigned char datyp; + + /* Pad for alignment. */ + unsigned char temp; + + unsigned char flags[2]; + + unsigned char value[8]; + unsigned char psindx[4]; + unsigned char vector[4]; + unsigned char namlng; + unsigned char name[31]; +}; + +#endif /* _VMS_ESDFV_H */ diff --git a/include/vms/esgps.h b/include/vms/esgps.h new file mode 100644 index 0000000..e668a87 --- /dev/null +++ b/include/vms/esgps.h @@ -0,0 +1,72 @@ +/* Alpha VMS external format of Extended Shared Program Section Definition. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_ESGPS_H +#define _VMS_ESGPS_H + +struct vms_esgps +{ + /* Entry type. */ + unsigned char gsdtyp[2]; + + /* Length of the entry. */ + unsigned char gsdsiz[2]; + + /* Psect alignment. */ + unsigned char align; + + /* Pad for alignment. */ + unsigned char temp; + + unsigned char flags[2]; + + /* Length of this contribution. */ + unsigned char alloc[4]; + + /* Image offset of the psect. */ + unsigned char base[4]; + + /* Symbol vector offset. */ + unsigned char value[8]; + + /* Name. */ + unsigned char namlng; + unsigned char name[31]; +}; + +/* These are the same as EGPS flags. */ + +#define ESGPS__V_PIC (1 << 0) /* Not meaningful. */ +#define ESGPS__V_LIB (1 << 1) /* Defined in a shareable image. */ +#define ESGPS__V_OVR (1 << 2) /* Overlaid contribution. */ +#define ESGPS__V_REL (1 << 3) /* Relocatable. */ +#define ESGPS__V_GBL (1 << 4) /* Global. */ +#define ESGPS__V_SHR (1 << 5) /* Shareable. */ +#define ESGPS__V_EXE (1 << 6) /* Executable. */ +#define ESGPS__V_RD (1 << 7) /* Readable. */ +#define ESGPS__V_WRT (1 << 8) /* Writable. */ +#define ESGPS__V_VEC (1 << 9) /* Change mode dispatch or message vectors. */ +#define ESGPS__V_NOMOD (1 << 10) /* Demand-zero. */ +#define ESGPS__V_COM (1 << 11) /* Conditional storage. */ +#define ESGPS__V_ALLOC_64BIT (1 << 12) /* Allocated in 64-bit space. */ + +#endif /* _VMS_ESGPS_H */ diff --git a/include/vms/esrf.h b/include/vms/esrf.h new file mode 100644 index 0000000..291250c --- /dev/null +++ b/include/vms/esrf.h @@ -0,0 +1,36 @@ +/* Alpha VMS external format of Extended GSD Global Symbol Reference. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_ESRF_H +#define _VMS_ESRF_H + +struct vms_esrf +{ + struct vms_egsy header; + + unsigned char namlng; + unsigned char name[31]; +}; + +#define ESRF__B_NAMLNG 8 + +#endif /* _VMS_ESRF_H */ diff --git a/include/vms/etir.h b/include/vms/etir.h new file mode 100644 index 0000000..4d922dc --- /dev/null +++ b/include/vms/etir.h @@ -0,0 +1,114 @@ +/* Alpha VMS external format of Extended Text Information and Relocation. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_ETIR_H +#define _VMS_ETIR_H + +#define ETIR__C_MINSTACOD 0 /* Minimum stack code. */ +#define ETIR__C_STA_GBL 0 /* Stack global symbol value. */ +#define ETIR__C_STA_LW 1 /* Stack longword. */ +#define ETIR__C_STA_QW 2 /* Stack quadword. */ +#define ETIR__C_STA_PQ 3 /* Stack psect base + quadword off. */ +#define ETIR__C_STA_LI 4 /* Stack literal. */ +#define ETIR__C_STA_MOD 5 /* Stack module. */ +#define ETIR__C_STA_CKARG 6 /* Check Arguments. */ +#define ETIR__C_MAXSTACOD 6 /* Maximum stack code. */ + +#define ETIR__C_MINSTOCOD 50 /* Minimum store code. */ +#define ETIR__C_STO_B 50 /* Store byte. */ +#define ETIR__C_STO_W 51 /* Store word. */ +#define ETIR__C_STO_LW 52 /* Store longword. */ +#define ETIR__C_STO_QW 53 /* Store quadword. */ +#define ETIR__C_STO_IMMR 54 /* Store immediate Repeated. */ +#define ETIR__C_STO_GBL 55 /* Store global. */ +#define ETIR__C_STO_CA 56 /* Store code address. */ +#define ETIR__C_STO_RB 57 /* Store relative branch. */ +#define ETIR__C_STO_AB 58 /* Store absolute branch. */ +#define ETIR__C_STO_OFF 59 /* Store offset within psect. */ +#define ETIR__C_STO_IMM 61 /* Store immediate. */ +#define ETIR__C_STO_GBL_LW 62 /* Store global Longword. */ +#define ETIR__C_STO_LP_PSB 63 /* STO_LP_PSB not valid in level 2 use STC_LP_PSB. */ +#define ETIR__C_STO_HINT_GBL 64 /* Store 14 bit HINT at global address. */ +#define ETIR__C_STO_HINT_PS 65 /* Store 14 bit HINT at psect + offset */ +#define ETIR__C_MAXSTOCOD 65 /* Maximum store code. */ + +/* Operate codes. */ +#define ETIR__C_MINOPRCOD 100 /* Minimum operate code. */ +#define ETIR__C_OPR_NOP 100 /* No-op. */ +#define ETIR__C_OPR_ADD 101 /* Add. */ +#define ETIR__C_OPR_SUB 102 /* Subtract. */ +#define ETIR__C_OPR_MUL 103 /* Multiply. */ +#define ETIR__C_OPR_DIV 104 /* Divide. */ +#define ETIR__C_OPR_AND 105 /* Logical AND. */ +#define ETIR__C_OPR_IOR 106 /* Logical inclusive OR. */ +#define ETIR__C_OPR_EOR 107 /* Logical exclusive OR. */ +#define ETIR__C_OPR_NEG 108 /* Negate. */ +#define ETIR__C_OPR_COM 109 /* Complement. */ +#define ETIR__C_OPR_INSV 110 /* Insert bit field. */ +#define ETIR__C_OPR_ASH 111 /* Arithmetic shift. */ +#define ETIR__C_OPR_USH 112 /* Unsigned shift. */ +#define ETIR__C_OPR_ROT 113 /* Rotate. */ +#define ETIR__C_OPR_SEL 114 /* Select one of 3 long on top of stack. */ +#define ETIR__C_OPR_REDEF 115 /* Redefine this symbol after pass 2. */ +#define ETIR__C_OPR_DFLIT 116 /* Define a literal. */ +#define ETIR__C_MAXOPRCOD 116 /* Maximum operate code. */ + +/* Control codes. */ +#define ETIR__C_MINCTLCOD 150 /* Minimum control code. */ +#define ETIR__C_CTL_SETRB 150 /* Set relocation base. */ +#define ETIR__C_CTL_AUGRB 151 /* Augment relocation base. */ +#define ETIR__C_CTL_DFLOC 152 /* Define debug location. */ +#define ETIR__C_CTL_STLOC 153 /* Set debug location. */ +#define ETIR__C_CTL_STKDL 154 /* Stack debug location. */ +#define ETIR__C_MAXCTLCOD 154 /* Maximum control code. */ + +/* Store-conditional (STC) codes. */ +#define ETIR__C_MINSTCCOD 200 /* Minimum store-conditional code. */ +#define ETIR__C_STC_LP 200 /* STC Linkage Pair. */ +#define ETIR__C_STC_LP_PSB 201 /* STC Linkage Pair with Proc Signature. */ +#define ETIR__C_STC_GBL 202 /* STC Address at global address. */ +#define ETIR__C_STC_GCA 203 /* STC Code Address at global address. */ +#define ETIR__C_STC_PS 204 /* STC Address at psect + offset. */ +#define ETIR__C_STC_NOP_GBL 205 /* STC NOP at address of global. */ +#define ETIR__C_STC_NOP_PS 206 /* STC NOP at pect + offset. */ +#define ETIR__C_STC_BSR_GBL 207 /* STC BSR at global address. */ +#define ETIR__C_STC_BSR_PS 208 /* STC BSR at pect + offset. */ +#define ETIR__C_STC_LDA_GBL 209 /* STC LDA at global address. */ +#define ETIR__C_STC_LDA_PS 210 /* STC LDA at psect + offset. */ +#define ETIR__C_STC_BOH_GBL 211 /* STC BSR or Hint at global address. */ +#define ETIR__C_STC_BOH_PS 212 /* STC BSR or Hint at pect + offset. */ +#define ETIR__C_STC_NBH_GBL 213 /* STC NOP,BSR or HINT at global address. */ +#define ETIR__C_STC_NBH_PS 214 /* STC NOP,BSR or HINT at psect + offset. */ +#define ETIR__C_MAXSTCCOD 214 /* Maximum store-conditional code. */ + +#define ETIR__C_HEADER_SIZE 4 /* Size of the header of a command */ + +struct vms_etir +{ + /* Commands. See above. */ + unsigned char rectyp[2]; + + /* Size (including this header). */ + unsigned char size[2]; +}; + +#endif /* _VMS_ETIR_H */ diff --git a/include/vms/internal.h b/include/vms/internal.h new file mode 100644 index 0000000..1c8c472 --- /dev/null +++ b/include/vms/internal.h @@ -0,0 +1,63 @@ +/* Alpha VMS internal format. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_INTERNAL_H +#define _VMS_INTERNAL_H + +struct vms_internal_eisd +{ + unsigned int majorid; /* Version. */ + unsigned int minorid; + unsigned int eisdsize; /* Size (in bytes) of this eisd. */ + unsigned int secsize; /* Size (in bytes) of the section. */ + bfd_vma virt_addr; /* Virtual address of the section. */ + unsigned int flags; /* Flags. */ + unsigned int vbn; /* Base virtual block number. */ + unsigned char pfc; /* Page fault cluster. */ + unsigned char matchctl; /* Linker match control. */ + unsigned char type; /* Section type. */ +}; + +struct vms_internal_gbl_eisd +{ + struct vms_internal_eisd common; + + unsigned int ident; /* Ident for global section. */ + unsigned char gblnam[44]; /* Global name ascic. */ +}; + +struct vms_internal_eisd_map +{ + /* Next eisd in the list. */ + struct vms_internal_eisd_map *next; + + /* Offset in output file. */ + file_ptr file_pos; + + union + { + struct vms_internal_eisd eisd; + struct vms_internal_gbl_eisd gbl_eisd; + } u; +}; + +#endif /* _VMS_INTERNAL_H */ diff --git a/include/vms/lbr.h b/include/vms/lbr.h new file mode 100644 index 0000000..fd3c256 --- /dev/null +++ b/include/vms/lbr.h @@ -0,0 +1,332 @@ +/* Alpha VMS external format of Libraries. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_LBR_H +#define _VMS_LBR_H + +/* Libray HeaDer. */ + +/* Magic numbers. Should match the major version. */ + +#define LHD_SANEID_DCX 319232342 +#define LHD_SANEID3 233579905 +#define LHD_SANEID6 233579911 + +/* Library type. */ +#define LBR__C_TYP_UNK 0 /* Unknown / unspecified. */ +#define LBR__C_TYP_OBJ 1 /* Vax object. */ +#define LBR__C_TYP_MLB 2 /* Macro. */ +#define LBR__C_TYP_HLP 3 /* Help. */ +#define LBR__C_TYP_TXT 4 /* Text. */ +#define LBR__C_TYP_SHSTB 5 /* Vax shareable image. */ +#define LBR__C_TYP_NCS 6 /* NCS. */ +#define LBR__C_TYP_EOBJ 7 /* Alpha object. */ +#define LBR__C_TYP_ESHSTB 8 /* Alpha shareable image. */ +#define LBR__C_TYP_IOBJ 9 /* IA-64 object. */ +#define LBR__C_TYP_ISHSTB 10 /* IA-64 shareable image. */ + +struct vms_lhd +{ + /* Type of the library. See above. */ + unsigned char type; + + /* Number of indexes. Generally 1, 2 for object libraries. */ + unsigned char nindex; + + unsigned char fill_1[2]; + + /* Sanity Id. */ + unsigned char sanity[4]; + + /* Version. */ + unsigned char majorid[2]; + unsigned char minorid[2]; + + /* Tool name. */ + unsigned char lbrver[32]; + + /* Create time. */ + unsigned char credat[8]; + + /* Update time. */ + unsigned char updtim[8]; + + /* Size of the MHD. */ + unsigned char mhdusz; + + unsigned char idxblkf[2]; /* Unused. */ + unsigned char fill_2; + unsigned char closerror[2]; + + unsigned char spareword[2]; + + /* First free block, and number of free blocks. */ + unsigned char freevbn[4]; + unsigned char freeblk[4]; + + unsigned char nextrfa[6]; + unsigned char nextvbn[4]; + + /* Free pre-allocated index block. */ + /* Number of free blocks. */ + unsigned char freidxblk[4]; + /* VBN of a simply linked list of free blocks. The list is terminated by a + nul VBN. */ + unsigned char freeidx[4]; + + /* Highest pre-allocated index block and in use. */ + unsigned char hipreal[4]; + unsigned char hiprusd[4]; + + /* Number of index blocks in use. */ + unsigned char idxblks[4]; + + /* Number of index entries. */ + unsigned char idxcnt[4]; + + /* Number of modules entries. */ + unsigned char modcnt[4]; + + unsigned char fill_3[2]; + + /* Number of module headers. */ + unsigned char modhdrs[4]; + + /* Overhead index pointers. */ + unsigned char idxovh[4]; + + /* Update history records. */ + unsigned char maxluhrec[2]; + unsigned char numluhrec[2]; + unsigned char begluhrfa[6]; + unsigned char endluhrfa[6]; + + /* DCX map. */ + unsigned char dcxmapvbn[4]; + + unsigned char fill_4[4 * 13]; +}; + +/* Known major ids. */ +#define LBR_MAJORID 3 /* Alpha libraries. */ +#define LBR_ELFMAJORID 6 /* Elf libraries (new index, new data). */ + +/* Offset of the first IDD. */ +#define LHD_IDXDESC 196 + +/* InDex Description. */ +struct vms_idd +{ + unsigned char flags[2]; + + /* Max length of the key. */ + unsigned char keylen[2]; + + /* First index block. */ + unsigned char vbn[4]; +}; + +/* IDD flags. */ +#define IDD__FLAGS_ASCII 1 +#define IDD__FLAGS_LOCKED 2 +#define IDD__FLAGS_VARLENIDX 4 +#define IDD__FLAGS_NOCASECMP 8 +#define IDD__FLAGS_NOCASENTR 16 +#define IDD__FLAGS_UPCASNTRY 32 + +#define IDD_LENGTH 8 + +/* Index block. */ +#define INDEXDEF__LENGTH 512 +#define INDEXDEF__BLKSIZ 500 + +struct vms_indexdef +{ + /* Number of bytes used. */ + unsigned char used[2]; + + /* VBN of the parent. */ + unsigned char parent[4]; + + unsigned char fill_1[6]; + + /* The key field contains vms_idx/vms_elfidx structures, which are + simply a key (= a string) and a rfa. */ + unsigned char keys[INDEXDEF__BLKSIZ]; +}; + +/* An offset in a file. */ + +struct vms_rfa +{ + /* Logical block number, 1 based. + 0 means that the field is absent. Block size is 512. */ + unsigned char vbn[4]; + + /* Offset within the block. */ + unsigned char offset[2]; +}; + +/* Index keys. For version 3. */ + +struct vms_idx +{ + /* Offset from the start of the vbn, so minimum should be + DATA__DATA (ie 6). */ + struct vms_rfa rfa; + + unsigned char keylen; + /* The length of this field is in fact keylen. */ + unsigned char keyname[256]; +}; + +/* Index keys, for version 4 and later. */ + +struct vms_elfidx +{ + struct vms_rfa rfa; + + unsigned char keylen[2]; + unsigned char flags; + unsigned char keyname[256]; +}; + +/* Flags of elfidx. */ + +#define ELFIDX__WEAK 0x01 /* Weak symbol. */ +#define ELFIDX__GROUP 0x02 /* Group symbol. */ +#define ELFIDX__LISTRFA 0x04 /* RFA field points to an LHS. */ +#define ELFIDX__SYMESC 0x08 /* Long symbol. */ + +#define RFADEF__C_INDEX 0xffff + +/* List head structure. That's what is pointed by rfa when LISTRFA flag + is set in elfidx. */ + +struct vms_lhs +{ + struct vms_rfa ng_g_rfa; /* Non-group global. */ + struct vms_rfa ng_wk_rfa; /* Non-group weak. */ + struct vms_rfa g_g_rfa; /* Group global. */ + struct vms_rfa g_wk_rfa; /* Group weak. */ + unsigned char flags; +}; + +/* List node structure. Fields of LHS point to this structure. */ + +struct vms_lns +{ + /* Next node in the list. */ + struct vms_rfa nxtrfa; + + /* Module associated with the key. */ + struct vms_rfa modrfa; +}; + +struct vms_datadef +{ + /* Number of records in this block. */ + unsigned char recs; + unsigned char fill_1; + + /* Next vbn. */ + unsigned char link[4]; + + /* Data. The first word is the record length, followed by record + data and a possible pad byte so that record length is always aligned. */ + unsigned char data[506]; +}; +#define DATA__LENGTH 512 +#define DATA__DATA 6 + +/* Key name block. This is used for keys longer than 128 bytes. */ + +struct vms_kbn +{ + /* Length of the key chunk. */ + unsigned char keylen[2]; + + /* RFA of the next chunk. */ + struct vms_rfa rfa; + + /* Followed by the key chunk. */ +}; + +/* Module header. */ +struct vms_mhd +{ + /* Fixed part. */ + unsigned char lbrflag; + unsigned char id; + unsigned char fill_1[2]; + unsigned char refcnt[4]; + unsigned char datim[8]; + + unsigned char objstat; + /* Ident or GSMATCH. */ + unsigned char objidlng; + unsigned char objid[31]; + + unsigned char pad1[3]; + unsigned char otherefcnt[4]; + unsigned char modsize[4]; + unsigned char pad2[4]; +}; + +#define MHD__C_MHDID 0xad /* Value for id. */ +#define MHD__C_MHDLEN 16 /* Fixed part length. */ +#define MHD__C_USRDAT 16 + +/* Flags for objstat. */ +#define MHD__M_SELSRC 0x1 /* Selective search. */ +#define MHD__M_OBJTIR 0x2 +#define MHD__M_WKSYM 0x4 + +struct vms_luh +{ + unsigned char nxtluhblk[4]; + unsigned char spare[2]; + unsigned char data[506]; +}; + +struct vms_luhdef +{ + unsigned char rechdr[2]; + unsigned char reclen[2]; +}; +#define LUH__RECHDRLEN 4 +#define LUH__RECHDRMRK 0xabba +#define LUH__DATAFLDLEN 506 + +/* Entry in the history. */ + +struct vms_leh +{ + unsigned char date[8]; + unsigned char nbr_units[2]; + unsigned char action[2]; /* 1: delete, 2: insert, 3: replaced. */ + unsigned char idlen; + /* username + modules... */ +}; + +#endif /* _VMS_LBR_H */ diff --git a/include/vms/prt.h b/include/vms/prt.h new file mode 100644 index 0000000..8b8d27b --- /dev/null +++ b/include/vms/prt.h @@ -0,0 +1,43 @@ +/* Alpha VMS external format of Protection values. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_PRT_H +#define _VMS_PRT_H + +#define PRT__C_NA 0 /* No access. */ +#define PRT__C_RESERVED 1 +#define PRT__C_KW 2 /* Kernel RW. */ +#define PRT__C_KR 3 /* Kernel RO. */ +#define PRT__C_UW 4 /* User RW. */ +#define PRT__C_EW 5 /* Executive RW. */ +#define PRT__C_ERKW 6 /* Executive RO, Kernel RW. */ +#define PRT__C_ER 7 /* Executive RO. */ +#define PRT__C_SW 8 /* Supervisor RW. */ +#define PRT__C_SREW 9 /* Supervisor RO, Executive RW. */ +#define PRT__C_SRKW 10 /* Supervisor RO, Kernel RW. */ +#define PRT__C_SR 11 /* Supervisor RO. */ +#define PRT__C_URSW 12 /* User RO, Supervisor RW. */ +#define PRT__C_UREW 13 /* User RO, Executive RW. */ +#define PRT__C_URKW 14 /* User RO, Kernel RW. */ +#define PRT__C_UR 15 /* User RO. */ + +#endif /* _VMS_PRT_H */ diff --git a/include/vms/shl.h b/include/vms/shl.h new file mode 100644 index 0000000..d1d9fae --- /dev/null +++ b/include/vms/shl.h @@ -0,0 +1,55 @@ +/* Alpha VMS external format of Shareable image List. + + Copyright 2010 Free Software Foundation, Inc. + Written by Tristan Gingold , AdaCore. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#ifndef _VMS_SHL_H +#define _VMS_SHL_H + +struct vms_shl +{ + /* Base address of this shareable image. */ + unsigned char baseva[4]; + + /* Point in SHL shareable image to SHL in executable image. */ + unsigned char shlptr[4]; + + /* GSMATCH. */ + unsigned char ident[4]; + + /* Permanent shareable image context. */ + unsigned char permctx[4]; + + /* Size of this structure. */ + unsigned char size; + + unsigned char fill_1[2]; + + /* Flags. */ + unsigned char flags; + + /* Address of the image control block (in memory). */ + unsigned char icb[4]; + + /* Image name. ASCIC. */ + unsigned char imgnam[40]; +}; + +#endif /* _VMS_SHL_H */ diff --git a/include/vtv-change-permission.h b/include/vtv-change-permission.h new file mode 100644 index 0000000..04ad8c3 --- /dev/null +++ b/include/vtv-change-permission.h @@ -0,0 +1,58 @@ +/* Copyright (C) 2013-2015 Free Software Foundation, Inc. + + This file is part of GCC. + + modify it under the terms of the GNU Library General Public License + as published by the Free Software Foundation; either version 2, or + (at your option) any later version. + + In addition to the permissions in the GNU Library General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Library Public License restrictions do apply in other + respects; for example, they cover modification of the file, and + distribution when not linked into a combined executable.) + + 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ + + +#ifndef __VTV_H__ +#define __VTV_H__ + +/* We could have used an enumeration here but it just makes it more + difficult for the compiler to generate a call to this. These are + used as arguments to the function __VLTChangePermission, declared + below. */ +#define __VLTP_READ_ONLY 0 +#define __VLTP_READ_WRITE 1 + +#ifdef __cplusplus +extern "C" void __VLTChangePermission (int); +#else +extern void __VLTChangePermission (int); +#endif + +#ifdef BIG_PAGE_SIZE +/* TODO - Replace '4096' below with correct big page size. */ +#define VTV_PAGE_SIZE 4096 +#else +#if defined(__sun__) && defined(__svr4__) && defined(__sparc__) +#define VTV_PAGE_SIZE 8192 +#else +#define VTV_PAGE_SIZE 4096 +#endif +#endif + + + +#endif /* __VTV_H__ */ diff --git a/include/wchar.h b/include/wchar.h new file mode 100644 index 0000000..7c37427 --- /dev/null +++ b/include/wchar.h @@ -0,0 +1,339 @@ +#ifndef _WCHAR_H_ +#define _WCHAR_H_ + +#include <_ansi.h> + +#include + +#define __need_size_t +#define __need_wchar_t +#define __need_wint_t +#define __need_NULL +#include + +/* For _mbstate_t definition. */ +#include +#include +/* For __STDC_ISO_10646__ */ +#include + +/* typedef only __gnuc_va_list, used throughout the header */ +#define __need___va_list +#include + +/* typedef va_list only when required */ +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE +#ifdef __GNUC__ +#ifndef _VA_LIST_DEFINED +typedef __gnuc_va_list va_list; +#define _VA_LIST_DEFINED +#endif +#else /* !__GNUC__ */ +#include +#endif +#endif /* __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE */ + +#if __XSI_VISIBLE /* && __XSI_VISIBLE < 800 */ && !__GNU_VISIBLE +#include +#endif + +#ifndef WEOF +# define WEOF ((wint_t)-1) +#endif + +/* This must match definition in */ +#ifndef WCHAR_MIN +#ifdef __WCHAR_MIN__ +#define WCHAR_MIN __WCHAR_MIN__ +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MIN (0 + L'\0') +#else +#define WCHAR_MIN (-0x7fffffff - 1 + L'\0') +#endif +#endif + +/* This must match definition in */ +#ifndef WCHAR_MAX +#ifdef __WCHAR_MAX__ +#define WCHAR_MAX __WCHAR_MAX__ +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MAX (0xffffffffu + L'\0') +#else +#define WCHAR_MAX (0x7fffffff + L'\0') +#endif +#endif + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +_BEGIN_STD_C + +#if __POSIX_VISIBLE >= 200809 || _XSI_VISIBLE +/* As in stdio.h, defines __FILE. */ +#if !defined(__FILE_defined) +typedef __FILE FILE; +# define __FILE_defined +#endif +#endif + +/* As required by POSIX.1-2008, declare tm as incomplete type. + The actual definition is in time.h. */ +struct tm; + +#ifndef _MBSTATE_T +#define _MBSTATE_T +typedef _mbstate_t mbstate_t; +#endif /* _MBSTATE_T */ + +wint_t btowc (int); +int wctob (wint_t); +size_t mbrlen (const char *__restrict, size_t, mbstate_t *__restrict); +size_t mbrtowc (wchar_t *__restrict, const char *__restrict, size_t, + mbstate_t *__restrict); +size_t _mbrtowc_r (struct _reent *, wchar_t * , const char * , + size_t, mbstate_t *); +int mbsinit (const mbstate_t *); +#if __POSIX_VISIBLE >= 200809 +size_t mbsnrtowcs (wchar_t *__restrict, const char **__restrict, + size_t, size_t, mbstate_t *__restrict); +#endif +size_t _mbsnrtowcs_r (struct _reent *, wchar_t * , const char ** , + size_t, size_t, mbstate_t *); +size_t mbsrtowcs (wchar_t *__restrict, const char **__restrict, size_t, + mbstate_t *__restrict); +size_t _mbsrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, mbstate_t *); +size_t wcrtomb (char *__restrict, wchar_t, mbstate_t *__restrict); +size_t _wcrtomb_r (struct _reent *, char * , wchar_t, mbstate_t *); +#if __POSIX_VISIBLE >= 200809 +size_t wcsnrtombs (char *__restrict, const wchar_t **__restrict, + size_t, size_t, mbstate_t *__restrict); +#endif +size_t _wcsnrtombs_r (struct _reent *, char * , const wchar_t ** , + size_t, size_t, mbstate_t *); +size_t wcsrtombs (char *__restrict, const wchar_t **__restrict, + size_t, mbstate_t *__restrict); +size_t _wcsrtombs_r (struct _reent *, char * , const wchar_t ** , + size_t, mbstate_t *); +#if __POSIX_VISIBLE >= 200809 +int wcscasecmp (const wchar_t *, const wchar_t *); +#endif +wchar_t *wcscat (wchar_t *__restrict, const wchar_t *__restrict); +wchar_t *wcschr (const wchar_t *, wchar_t); +int wcscmp (const wchar_t *, const wchar_t *); +int wcscoll (const wchar_t *, const wchar_t *); +wchar_t *wcscpy (wchar_t *__restrict, const wchar_t *__restrict); +#if __POSIX_VISIBLE >= 200809 +wchar_t *wcpcpy (wchar_t *__restrict, + const wchar_t *__restrict); +wchar_t *wcsdup (const wchar_t *) __malloc_like __result_use_check; +#endif +wchar_t *_wcsdup_r (struct _reent *, const wchar_t * ); +size_t wcscspn (const wchar_t *, const wchar_t *); +size_t wcsftime (wchar_t *__restrict, size_t, + const wchar_t *__restrict, const struct tm *__restrict); +#if __GNU_VISIBLE +size_t wcsftime_l (wchar_t *__restrict, size_t, const wchar_t *__restrict, + const struct tm *__restrict, locale_t); +#endif +size_t wcslcat (wchar_t *, const wchar_t *, size_t); +size_t wcslcpy (wchar_t *, const wchar_t *, size_t); +size_t wcslen (const wchar_t *); +#if __POSIX_VISIBLE >= 200809 +int wcsncasecmp (const wchar_t *, const wchar_t *, size_t); +#endif +wchar_t *wcsncat (wchar_t *__restrict, + const wchar_t *__restrict, size_t); +int wcsncmp (const wchar_t *, const wchar_t *, size_t); +wchar_t *wcsncpy (wchar_t *__restrict, + const wchar_t *__restrict, size_t); +#if __POSIX_VISIBLE >= 200809 +wchar_t *wcpncpy (wchar_t *__restrict, + const wchar_t *__restrict, size_t); +size_t wcsnlen (const wchar_t *, size_t); +#endif +wchar_t *wcspbrk (const wchar_t *, const wchar_t *); +wchar_t *wcsrchr (const wchar_t *, wchar_t); +size_t wcsspn (const wchar_t *, const wchar_t *); +wchar_t *wcsstr (const wchar_t *__restrict, + const wchar_t *__restrict); +wchar_t *wcstok (wchar_t *__restrict, const wchar_t *__restrict, + wchar_t **__restrict); +double wcstod (const wchar_t *__restrict, wchar_t **__restrict); +double _wcstod_r (struct _reent *, const wchar_t *, wchar_t **); +#if __ISO_C_VISIBLE >= 1999 +float wcstof (const wchar_t *__restrict, wchar_t **__restrict); +#endif +float _wcstof_r (struct _reent *, const wchar_t *, wchar_t **); +#if __XSI_VISIBLE +int wcswidth (const wchar_t *, size_t); +#endif +size_t wcsxfrm (wchar_t *__restrict, const wchar_t *__restrict, + size_t); +#if __POSIX_VISIBLE >= 200809 +extern int wcscasecmp_l (const wchar_t *, const wchar_t *, locale_t); +extern int wcsncasecmp_l (const wchar_t *, const wchar_t *, size_t, locale_t); +extern int wcscoll_l (const wchar_t *, const wchar_t *, locale_t); +extern size_t wcsxfrm_l (wchar_t *__restrict, const wchar_t *__restrict, size_t, + locale_t); +#endif + +#if __XSI_VISIBLE +int wcwidth (const wchar_t); +#endif +wchar_t *wmemchr (const wchar_t *, wchar_t, size_t); +int wmemcmp (const wchar_t *, const wchar_t *, size_t); +wchar_t *wmemcpy (wchar_t *__restrict, const wchar_t *__restrict, + size_t); +wchar_t *wmemmove (wchar_t *, const wchar_t *, size_t); +#if __GNU_VISIBLE +wchar_t *wmempcpy (wchar_t *__restrict, const wchar_t *__restrict, + size_t); +#endif +wchar_t *wmemset (wchar_t *, wchar_t, size_t); + +long wcstol (const wchar_t *__restrict, wchar_t **__restrict, int); +#if __ISO_C_VISIBLE >= 1999 +long long wcstoll (const wchar_t *__restrict, wchar_t **__restrict, + int); +#endif +unsigned long wcstoul (const wchar_t *__restrict, wchar_t **__restrict, + int); +#if __ISO_C_VISIBLE >= 1999 +unsigned long long wcstoull (const wchar_t *__restrict, + wchar_t **__restrict, int); +#endif +long _wcstol_r (struct _reent *, const wchar_t *, wchar_t **, int); +long long _wcstoll_r (struct _reent *, const wchar_t *, wchar_t **, int); +unsigned long _wcstoul_r (struct _reent *, const wchar_t *, wchar_t **, int); +unsigned long long _wcstoull_r (struct _reent *, const wchar_t *, wchar_t **, int); +#if __ISO_C_VISIBLE >= 1999 +long double wcstold (const wchar_t *, wchar_t **); +#endif + +#if __GNU_VISIBLE +long wcstol_l (const wchar_t *__restrict, wchar_t **__restrict, int, locale_t); +long long wcstoll_l (const wchar_t *__restrict, wchar_t **__restrict, int, + locale_t); +unsigned long wcstoul_l (const wchar_t *__restrict, wchar_t **__restrict, int, + locale_t); +unsigned long long wcstoull_l (const wchar_t *__restrict, wchar_t **__restrict, + int, locale_t); +double wcstod_l (const wchar_t *, wchar_t **, locale_t); +float wcstof_l (const wchar_t *, wchar_t **, locale_t); +long double wcstold_l (const wchar_t *, wchar_t **, locale_t); +#endif + +wint_t fgetwc (__FILE *); +wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); +wint_t fputwc (wchar_t, __FILE *); +int fputws (const wchar_t *__restrict, __FILE *__restrict); +#if __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE >= 500 +int fwide (__FILE *, int); +#endif +wint_t getwc (__FILE *); +wint_t getwchar (void); +wint_t putwc (wchar_t, __FILE *); +wint_t putwchar (wchar_t); +wint_t ungetwc (wint_t wc, __FILE *); + +wint_t _fgetwc_r (struct _reent *, __FILE *); +wint_t _fgetwc_unlocked_r (struct _reent *, __FILE *); +wchar_t *_fgetws_r (struct _reent *, wchar_t *, int, __FILE *); +wchar_t *_fgetws_unlocked_r (struct _reent *, wchar_t *, int, __FILE *); +wint_t _fputwc_r (struct _reent *, wchar_t, __FILE *); +wint_t _fputwc_unlocked_r (struct _reent *, wchar_t, __FILE *); +int _fputws_r (struct _reent *, const wchar_t *, __FILE *); +int _fputws_unlocked_r (struct _reent *, const wchar_t *, __FILE *); +int _fwide_r (struct _reent *, __FILE *, int); +wint_t _getwc_r (struct _reent *, __FILE *); +wint_t _getwc_unlocked_r (struct _reent *, __FILE *); +wint_t _getwchar_r (struct _reent *); +wint_t _getwchar_unlocked_r (struct _reent *); +wint_t _putwc_r (struct _reent *, wchar_t, __FILE *); +wint_t _putwc_unlocked_r (struct _reent *, wchar_t, __FILE *); +wint_t _putwchar_r (struct _reent *, wchar_t); +wint_t _putwchar_unlocked_r (struct _reent *, wchar_t); +wint_t _ungetwc_r (struct _reent *, wint_t wc, __FILE *); + +#if __GNU_VISIBLE +wint_t fgetwc_unlocked (__FILE *); +wchar_t *fgetws_unlocked (wchar_t *__restrict, int, __FILE *__restrict); +wint_t fputwc_unlocked (wchar_t, __FILE *); +int fputws_unlocked (const wchar_t *__restrict, __FILE *__restrict); +wint_t getwc_unlocked (__FILE *); +wint_t getwchar_unlocked (void); +wint_t putwc_unlocked (wchar_t, __FILE *); +wint_t putwchar_unlocked (wchar_t); +#endif + +#if __POSIX_VISIBLE >= 200809 +__FILE *open_wmemstream (wchar_t **, size_t *); +#endif +__FILE *_open_wmemstream_r (struct _reent *, wchar_t **, size_t *); + +#ifndef __VALIST +#ifdef __GNUC__ +#define __VALIST __gnuc_va_list +#else +#define __VALIST char* +#endif +#endif + +#if __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE >= 500 +int fwprintf (__FILE *__restrict, const wchar_t *__restrict, ...); +int swprintf (wchar_t *__restrict, size_t, + const wchar_t *__restrict, ...); +int vfwprintf (__FILE *__restrict, const wchar_t *__restrict, + __VALIST); +int vswprintf (wchar_t *__restrict, size_t, + const wchar_t *__restrict, __VALIST); +int vwprintf (const wchar_t *__restrict, __VALIST); +int wprintf (const wchar_t *__restrict, ...); +#endif + +int _fwprintf_r (struct _reent *, __FILE *, const wchar_t *, ...); +int _swprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, ...); +int _vfwprintf_r (struct _reent *, __FILE *, const wchar_t *, __VALIST); +int _vswprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, __VALIST); +int _vwprintf_r (struct _reent *, const wchar_t *, __VALIST); +int _wprintf_r (struct _reent *, const wchar_t *, ...); + +#if __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE >= 500 +int fwscanf (__FILE *__restrict, const wchar_t *__restrict, ...); +int swscanf (const wchar_t *__restrict, + const wchar_t *__restrict, ...); +int vfwscanf (__FILE *__restrict, const wchar_t *__restrict, + __VALIST); +int vswscanf (const wchar_t *__restrict, const wchar_t *__restrict, + __VALIST); +int vwscanf (const wchar_t *__restrict, __VALIST); +int wscanf (const wchar_t *__restrict, ...); +#endif + +int _fwscanf_r (struct _reent *, __FILE *, const wchar_t *, ...); +int _swscanf_r (struct _reent *, const wchar_t *, const wchar_t *, ...); +int _vfwscanf_r (struct _reent *, __FILE *, const wchar_t *, __VALIST); +int _vswscanf_r (struct _reent *, const wchar_t *, const wchar_t *, __VALIST); +int _vwscanf_r (struct _reent *, const wchar_t *, __VALIST); +int _wscanf_r (struct _reent *, const wchar_t *, ...); + +#define getwc(fp) fgetwc(fp) +#define putwc(wc,fp) fputwc((wc), (fp)) +#define getwchar() fgetwc(_REENT_STDIN(_REENT)) +#define putwchar(wc) fputwc((wc), _REENT_STDOUT(_REENT)) + +#if __GNU_VISIBLE +#define getwc_unlocked(fp) fgetwc_unlocked(fp) +#define putwc_unlocked(wc,fp) fputwc_unlocked((wc), (fp)) +#define getwchar_unlocked() fgetwc_unlocked(_REENT_STDIN(_REENT)) +#define putwchar_unlocked(wc) fputwc_unlocked((wc), _REENT_STDOUT(_REENT)) +#endif + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _WCHAR_H_ */ diff --git a/include/wctype.h b/include/wctype.h new file mode 100644 index 0000000..e5452bf --- /dev/null +++ b/include/wctype.h @@ -0,0 +1,74 @@ +#ifndef _WCTYPE_H_ +#define _WCTYPE_H_ + +#include <_ansi.h> +#include + +#define __need_wint_t +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#ifndef WEOF +# define WEOF ((wint_t)-1) +#endif + +_BEGIN_STD_C + +#ifndef _WCTYPE_T +#define _WCTYPE_T +typedef int wctype_t; +#endif + +#ifndef _WCTRANS_T +#define _WCTRANS_T +typedef int wctrans_t; +#endif + +int iswalpha (wint_t); +int iswalnum (wint_t); +#if __ISO_C_VISIBLE >= 1999 +int iswblank (wint_t); +#endif +int iswcntrl (wint_t); +int iswctype (wint_t, wctype_t); +int iswdigit (wint_t); +int iswgraph (wint_t); +int iswlower (wint_t); +int iswprint (wint_t); +int iswpunct (wint_t); +int iswspace (wint_t); +int iswupper (wint_t); +int iswxdigit (wint_t); +wint_t towctrans (wint_t, wctrans_t); +wint_t towupper (wint_t); +wint_t towlower (wint_t); +wctrans_t wctrans (const char *); +wctype_t wctype (const char *); + +#if __POSIX_VISIBLE >= 200809 +extern int iswalpha_l (wint_t, locale_t); +extern int iswalnum_l (wint_t, locale_t); +extern int iswblank_l (wint_t, locale_t); +extern int iswcntrl_l (wint_t, locale_t); +extern int iswctype_l (wint_t, wctype_t, locale_t); +extern int iswdigit_l (wint_t, locale_t); +extern int iswgraph_l (wint_t, locale_t); +extern int iswlower_l (wint_t, locale_t); +extern int iswprint_l (wint_t, locale_t); +extern int iswpunct_l (wint_t, locale_t); +extern int iswspace_l (wint_t, locale_t); +extern int iswupper_l (wint_t, locale_t); +extern int iswxdigit_l (wint_t, locale_t); +extern wint_t towctrans_l (wint_t, wctrans_t, locale_t); +extern wint_t towupper_l (wint_t, locale_t); +extern wint_t towlower_l (wint_t, locale_t); +extern wctrans_t wctrans_l (const char *, locale_t); +extern wctype_t wctype_l (const char *, locale_t); +#endif + +_END_STD_C + +#endif /* _WCTYPE_H_ */ diff --git a/include/wordexp.h b/include/wordexp.h new file mode 100644 index 0000000..1f09a64 --- /dev/null +++ b/include/wordexp.h @@ -0,0 +1,53 @@ +/* Copyright (C) 2002, 2010 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _WORDEXP_H_ +#define _WORDEXP_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct _wordexp_t +{ + size_t we_wordc; /* Count of words matched by words. */ + char **we_wordv; /* Pointer to list of expanded words. */ + size_t we_offs; /* Slots to reserve at the beginning of we_wordv. */ +}; + +typedef struct _wordexp_t wordexp_t; + +#define WRDE_DOOFFS 0x0001 /* Use we_offs. */ +#define WRDE_APPEND 0x0002 /* Append to output from previous call. */ +#define WRDE_NOCMD 0x0004 /* Don't perform command substitution. */ +#define WRDE_REUSE 0x0008 /* pwordexp points to a wordexp_t struct returned from + a previous successful call to wordexp. */ +#define WRDE_SHOWERR 0x0010 /* Print error messages to stderr. */ +#define WRDE_UNDEF 0x0020 /* Report attempt to expand undefined shell variable. */ + +enum { + WRDE_SUCCESS, + WRDE_NOSPACE, + WRDE_BADCHAR, + WRDE_BADVAL, + WRDE_CMDSUB, + WRDE_SYNTAX, + WRDE_NOSYS +}; + +/* Note: This implementation of wordexp requires a version of bash + that supports the --wordexp and --protected arguments to be present + on the system. It does not support the WRDE_UNDEF flag. */ +int wordexp(const char *__restrict, wordexp_t *__restrict, int); +void wordfree(wordexp_t *); + +#ifdef __cplusplus +} +#endif + +#endif /* _WORDEXP_H_ */ diff --git a/include/xregex.h b/include/xregex.h new file mode 100644 index 0000000..4c5ef93 --- /dev/null +++ b/include/xregex.h @@ -0,0 +1,29 @@ +/* This file redefines all regex external names before including + a renamed copy of glibc's regex.h. */ + +#ifndef _XREGEX_H +#define _XREGEX_H 1 + +# define regfree xregfree +# define regexec xregexec +# define regcomp xregcomp +# define regerror xregerror +# define regoff_t xregoff_t +# define re_set_registers xre_set_registers +# define re_match_2 xre_match_2 +# define re_match xre_match +# define re_search xre_search +# define re_compile_pattern xre_compile_pattern +# define re_set_syntax xre_set_syntax +# define re_search_2 xre_search_2 +# define re_compile_fastmap xre_compile_fastmap +# define re_syntax_options xre_syntax_options +# define re_max_failures xre_max_failures + +# define _REGEX_RE_COMP +# define re_comp xre_comp +# define re_exec xre_exec + +#include "xregex2.h" + +#endif /* xregex.h */ diff --git a/include/xregex2.h b/include/xregex2.h new file mode 100644 index 0000000..05066d4 --- /dev/null +++ b/include/xregex2.h @@ -0,0 +1,564 @@ +/* Definitions for data structures and routines for the regular + expression library, version 0.12. + + Copyright (C) 1985-2015 Free Software Foundation, Inc. + + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. */ + +#ifndef _REGEX_H +#define _REGEX_H 1 + +/* Allow the use in C++ code. */ +#ifdef __cplusplus +extern "C" { +#endif + +/* POSIX says that must be included (by the caller) before + . */ + +#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS +/* VMS doesn't have `size_t' in , even though POSIX says it + should be there. */ +# include +#endif + +/* The following two types have to be signed and unsigned integer type + wide enough to hold a value of a pointer. For most ANSI compilers + ptrdiff_t and size_t should be likely OK. Still size of these two + types is 2 for Microsoft C. Ugh... */ +typedef long int s_reg_t; +typedef unsigned long int active_reg_t; + +/* The following bits are used to determine the regexp syntax we + recognize. The set/not-set meanings are chosen so that Emacs syntax + remains the value 0. The bits are given in alphabetical order, and + the definitions shifted by one from the previous bit; thus, when we + add or remove a bit, only one other definition need change. */ +typedef unsigned long int reg_syntax_t; + +/* If this bit is not set, then \ inside a bracket expression is literal. + If set, then such a \ quotes the following character. */ +#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1) + +/* If this bit is not set, then + and ? are operators, and \+ and \? are + literals. + If set, then \+ and \? are operators and + and ? are literals. */ +#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) + +/* If this bit is set, then character classes are supported. They are: + [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], + [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. + If not set, then character classes are not supported. */ +#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) + +/* If this bit is set, then ^ and $ are always anchors (outside bracket + expressions, of course). + If this bit is not set, then it depends: + ^ is an anchor if it is at the beginning of a regular + expression or after an open-group or an alternation operator; + $ is an anchor if it is at the end of a regular expression, or + before a close-group or an alternation operator. + + This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because + POSIX draft 11.2 says that * etc. in leading positions is undefined. + We already implemented a previous draft which made those constructs + invalid, though, so we haven't changed the code back. */ +#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) + +/* If this bit is set, then special characters are always special + regardless of where they are in the pattern. + If this bit is not set, then special characters are special only in + some contexts; otherwise they are ordinary. Specifically, + * + ? and intervals are only special when not after the beginning, + open-group, or alternation operator. */ +#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) + +/* If this bit is set, then *, +, ?, and { cannot be first in an re or + immediately after an alternation or begin-group operator. */ +#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) + +/* If this bit is set, then . matches newline. + If not set, then it doesn't. */ +#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) + +/* If this bit is set, then . doesn't match NUL. + If not set, then it does. */ +#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) + +/* If this bit is set, nonmatching lists [^...] do not match newline. + If not set, they do. */ +#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) + +/* If this bit is set, either \{...\} or {...} defines an + interval, depending on RE_NO_BK_BRACES. + If not set, \{, \}, {, and } are literals. */ +#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) + +/* If this bit is set, +, ? and | aren't recognized as operators. + If not set, they are. */ +#define RE_LIMITED_OPS (RE_INTERVALS << 1) + +/* If this bit is set, newline is an alternation operator. + If not set, newline is literal. */ +#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) + +/* If this bit is set, then `{...}' defines an interval, and \{ and \} + are literals. + If not set, then `\{...\}' defines an interval. */ +#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) + +/* If this bit is set, (...) defines a group, and \( and \) are literals. + If not set, \(...\) defines a group, and ( and ) are literals. */ +#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) + +/* If this bit is set, then \ matches . + If not set, then \ is a back-reference. */ +#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) + +/* If this bit is set, then | is an alternation operator, and \| is literal. + If not set, then \| is an alternation operator, and | is literal. */ +#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) + +/* If this bit is set, then an ending range point collating higher + than the starting range point, as in [z-a], is invalid. + If not set, then when ending range point collates higher than the + starting range point, the range is ignored. */ +#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) + +/* If this bit is set, then an unmatched ) is ordinary. + If not set, then an unmatched ) is invalid. */ +#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) + +/* If this bit is set, succeed as soon as we match the whole pattern, + without further backtracking. */ +#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1) + +/* If this bit is set, do not process the GNU regex operators. + If not set, then the GNU regex operators are recognized. */ +#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1) + +/* If this bit is set, turn on internal regex debugging. + If not set, and debugging was on, turn it off. + This only works if regex.c is compiled -DDEBUG. + We define this bit always, so that all that's needed to turn on + debugging is to recompile regex.c; the calling code can always have + this bit set, and it won't affect anything in the normal case. */ +#define RE_DEBUG (RE_NO_GNU_OPS << 1) + +/* If this bit is set, a syntactically invalid interval is treated as + a string of ordinary characters. For example, the ERE 'a{1' is + treated as 'a\{1'. */ +#define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1) + +/* This global variable defines the particular regexp syntax to use (for + some interfaces). When a regexp is compiled, the syntax used is + stored in the pattern buffer, so changing this does not affect + already-compiled regexps. */ +extern reg_syntax_t re_syntax_options; + +/* Define combinations of the above bits for the standard possibilities. + (The [[[ comments delimit what gets put into the Texinfo file, so + don't delete them!) */ +/* [[[begin syntaxes]]] */ +#define RE_SYNTAX_EMACS 0 + +#define RE_SYNTAX_AWK \ + (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ + | RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \ + | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS) + +#define RE_SYNTAX_GNU_AWK \ + ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \ + & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS)) + +#define RE_SYNTAX_POSIX_AWK \ + (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \ + | RE_INTERVALS | RE_NO_GNU_OPS) + +#define RE_SYNTAX_GREP \ + (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ + | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ + | RE_NEWLINE_ALT) + +#define RE_SYNTAX_EGREP \ + (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ + | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ + | RE_NO_BK_VBAR) + +#define RE_SYNTAX_POSIX_EGREP \ + (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \ + | RE_INVALID_INTERVAL_ORD) + +/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ +#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC + +#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC + +/* Syntax bits common to both basic and extended POSIX regex syntax. */ +#define _RE_SYNTAX_POSIX_COMMON \ + (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ + | RE_INTERVALS | RE_NO_EMPTY_RANGES) + +#define RE_SYNTAX_POSIX_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) + +/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes + RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this + isn't minimal, since other operators, such as \`, aren't disabled. */ +#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ + (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) + +#define RE_SYNTAX_POSIX_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ + | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD) + +/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is + removed and RE_NO_BK_REFS is added. */ +#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ + (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ + | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ + | RE_NO_BK_PARENS | RE_NO_BK_REFS \ + | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) +/* [[[end syntaxes]]] */ + +/* Maximum number of duplicates an interval can allow. Some systems + (erroneously) define this in other header files, but we want our + value, so remove any previous define. */ +#ifdef RE_DUP_MAX +# undef RE_DUP_MAX +#endif +/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows. */ +#define RE_DUP_MAX (0x7fff) + + +/* POSIX `cflags' bits (i.e., information for `regcomp'). */ + +/* If this bit is set, then use extended regular expression syntax. + If not set, then use basic regular expression syntax. */ +#define REG_EXTENDED 1 + +/* If this bit is set, then ignore case when matching. + If not set, then case is significant. */ +#define REG_ICASE (REG_EXTENDED << 1) + +/* If this bit is set, then anchors do not match at newline + characters in the string. + If not set, then anchors do match at newlines. */ +#define REG_NEWLINE (REG_ICASE << 1) + +/* If this bit is set, then report only success or fail in regexec. + If not set, then returns differ between not matching and errors. */ +#define REG_NOSUB (REG_NEWLINE << 1) + + +/* POSIX `eflags' bits (i.e., information for regexec). */ + +/* If this bit is set, then the beginning-of-line operator doesn't match + the beginning of the string (presumably because it's not the + beginning of a line). + If not set, then the beginning-of-line operator does match the + beginning of the string. */ +#define REG_NOTBOL 1 + +/* Like REG_NOTBOL, except for the end-of-line. */ +#define REG_NOTEOL (1 << 1) + + +/* If any error codes are removed, changed, or added, update the + `re_error_msg' table in regex.c. */ +typedef enum +{ +#ifdef _XOPEN_SOURCE + REG_ENOSYS = -1, /* This will never happen for this implementation. */ +#endif + + REG_NOERROR = 0, /* Success. */ + REG_NOMATCH, /* Didn't find a match (for regexec). */ + + /* POSIX regcomp return error codes. (In the order listed in the + standard.) */ + REG_BADPAT, /* Invalid pattern. */ + REG_ECOLLATE, /* Not implemented. */ + REG_ECTYPE, /* Invalid character class name. */ + REG_EESCAPE, /* Trailing backslash. */ + REG_ESUBREG, /* Invalid back reference. */ + REG_EBRACK, /* Unmatched left bracket. */ + REG_EPAREN, /* Parenthesis imbalance. */ + REG_EBRACE, /* Unmatched \{. */ + REG_BADBR, /* Invalid contents of \{\}. */ + REG_ERANGE, /* Invalid range end. */ + REG_ESPACE, /* Ran out of memory. */ + REG_BADRPT, /* No preceding re for repetition op. */ + + /* Error codes we've added. */ + REG_EEND, /* Premature end. */ + REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ + REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ +} reg_errcode_t; + +/* This data structure represents a compiled pattern. Before calling + the pattern compiler, the fields `buffer', `allocated', `fastmap', + `translate', and `no_sub' can be set. After the pattern has been + compiled, the `re_nsub' field is available. All other fields are + private to the regex routines. */ + +#ifndef RE_TRANSLATE_TYPE +# define RE_TRANSLATE_TYPE char * +#endif + +struct re_pattern_buffer +{ +/* [[[begin pattern_buffer]]] */ + /* Space that holds the compiled pattern. It is declared as + `unsigned char *' because its elements are + sometimes used as array indexes. */ + unsigned char *buffer; + + /* Number of bytes to which `buffer' points. */ + unsigned long int allocated; + + /* Number of bytes actually used in `buffer'. */ + unsigned long int used; + + /* Syntax setting with which the pattern was compiled. */ + reg_syntax_t syntax; + + /* Pointer to a fastmap, if any, otherwise zero. re_search uses + the fastmap, if there is one, to skip over impossible + starting points for matches. */ + char *fastmap; + + /* Either a translate table to apply to all characters before + comparing them, or zero for no translation. The translation + is applied to a pattern when it is compiled and to a string + when it is matched. */ + RE_TRANSLATE_TYPE translate; + + /* Number of subexpressions found by the compiler. */ + size_t re_nsub; + + /* Zero if this pattern cannot match the empty string, one else. + Well, in truth it's used only in `re_search_2', to see + whether or not we should use the fastmap, so we don't set + this absolutely perfectly; see `re_compile_fastmap' (the + `duplicate' case). */ + unsigned can_be_null : 1; + + /* If REGS_UNALLOCATED, allocate space in the `regs' structure + for `max (RE_NREGS, re_nsub + 1)' groups. + If REGS_REALLOCATE, reallocate space if necessary. + If REGS_FIXED, use what's there. */ +#define REGS_UNALLOCATED 0 +#define REGS_REALLOCATE 1 +#define REGS_FIXED 2 + unsigned regs_allocated : 2; + + /* Set to zero when `regex_compile' compiles a pattern; set to one + by `re_compile_fastmap' if it updates the fastmap. */ + unsigned fastmap_accurate : 1; + + /* If set, `re_match_2' does not return information about + subexpressions. */ + unsigned no_sub : 1; + + /* If set, a beginning-of-line anchor doesn't match at the + beginning of the string. */ + unsigned not_bol : 1; + + /* Similarly for an end-of-line anchor. */ + unsigned not_eol : 1; + + /* If true, an anchor at a newline matches. */ + unsigned newline_anchor : 1; + +/* [[[end pattern_buffer]]] */ +}; + +typedef struct re_pattern_buffer regex_t; + +/* Type for byte offsets within the string. POSIX mandates this. */ +typedef int regoff_t; + + +/* This is the structure we store register match data in. See + regex.texinfo for a full description of what registers match. */ +struct re_registers +{ + unsigned num_regs; + regoff_t *start; + regoff_t *end; +}; + + +/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, + `re_match_2' returns information about at least this many registers + the first time a `regs' structure is passed. */ +#ifndef RE_NREGS +# define RE_NREGS 30 +#endif + + +/* POSIX specification for registers. Aside from the different names than + `re_registers', POSIX uses an array of structures, instead of a + structure of arrays. */ +typedef struct +{ + regoff_t rm_so; /* Byte offset from string's start to substring's start. */ + regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ +} regmatch_t; + +/* Declarations for routines. */ + +/* To avoid duplicating every routine declaration -- once with a + prototype (if we are ANSI), and once without (if we aren't) -- we + use the following macro to declare argument types. This + unfortunately clutters up the declarations a bit, but I think it's + worth it. */ + +/* Sets the current default syntax to SYNTAX, and return the old syntax. + You can also simply assign to the `re_syntax_options' variable. */ +extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); + +/* Compile the regular expression PATTERN, with length LENGTH + and syntax given by the global `re_syntax_options', into the buffer + BUFFER. Return NULL if successful, and an error string if not. */ +extern const char *re_compile_pattern (const char *pattern, size_t length, + struct re_pattern_buffer *buffer); + + +/* Compile a fastmap for the compiled pattern in BUFFER; used to + accelerate searches. Return 0 if successful and -2 if was an + internal error. */ +extern int re_compile_fastmap (struct re_pattern_buffer *buffer); + + +/* Search in the string STRING (with length LENGTH) for the pattern + compiled into BUFFER. Start searching at position START, for RANGE + characters. Return the starting position of the match, -1 for no + match, or -2 for an internal error. Also return register + information in REGS (if REGS and BUFFER->no_sub are nonzero). */ +extern int re_search (struct re_pattern_buffer *buffer, const char *string, + int length, int start, int range, + struct re_registers *regs); + + +/* Like `re_search', but search in the concatenation of STRING1 and + STRING2. Also, stop searching at index START + STOP. */ +extern int re_search_2 (struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, int range, struct re_registers *regs, + int stop); + + +/* Like `re_search', but return how many characters in STRING the regexp + in BUFFER matched, starting at position START. */ +extern int re_match (struct re_pattern_buffer *buffer, const char *string, + int length, int start, struct re_registers *regs); + + +/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ +extern int re_match_2 (struct re_pattern_buffer *buffer, const char *string1, + int length1, const char *string2, int length2, + int start, struct re_registers *regs, int stop); + + +/* Set REGS to hold NUM_REGS registers, storing them in STARTS and + ENDS. Subsequent matches using BUFFER and REGS will use this memory + for recording register information. STARTS and ENDS must be + allocated with malloc, and must each be at least `NUM_REGS * sizeof + (regoff_t)' bytes long. + + If NUM_REGS == 0, then subsequent matches should allocate their own + register data. + + Unless this function is called, the first search or match using + PATTERN_BUFFER will allocate its own register data, without + freeing the old data. */ +extern void re_set_registers (struct re_pattern_buffer *buffer, + struct re_registers *regs, + unsigned num_regs, regoff_t *starts, + regoff_t *ends); + +#if defined _REGEX_RE_COMP || defined _LIBC +# ifndef _CRAY +/* 4.2 bsd compatibility. */ +extern char *re_comp (const char *); +extern int re_exec (const char *); +# endif +#endif + +/* GCC 2.95 and later have "__restrict"; C99 compilers have + "restrict", and "configure" may have defined "restrict". */ +#ifndef __restrict +# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)) +# if defined restrict || 199901L <= __STDC_VERSION__ +# define __restrict restrict +# else +# define __restrict +# endif +# endif +#endif + +/* GCC 3.1 and later support declaring arrays as non-overlapping + using the syntax array_name[restrict] */ +#ifndef __restrict_arr +# if ! (3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) || defined (__GNUG__) +# define __restrict_arr +# else +# define __restrict_arr __restrict +# endif +#endif + +/* POSIX compatibility. */ +extern int regcomp (regex_t *__restrict __preg, + const char *__restrict __pattern, + int __cflags); + +#if (__GNUC__) +__extension__ +#endif +extern int regexec (const regex_t *__restrict __preg, + const char *__restrict __string, size_t __nmatch, + regmatch_t __pmatch[__restrict_arr], + int __eflags); + +extern size_t regerror (int __errcode, const regex_t *__preg, + char *__errbuf, size_t __errbuf_size); + +extern void regfree (regex_t *__preg); + + +#ifdef __cplusplus +} +#endif /* C++ */ + +#endif /* regex.h */ + +/* +Local variables: +make-backup-files: t +version-control: t +trim-versions-without-asking: nil +End: +*/ diff --git a/include/xtensa-config.h b/include/xtensa-config.h new file mode 100644 index 0000000..5ae4c80 --- /dev/null +++ b/include/xtensa-config.h @@ -0,0 +1,176 @@ +/* Xtensa configuration settings. + Copyright (C) 2001-2015 Free Software Foundation, Inc. + Contributed by Bob Wilson (bob.wilson@acm.org) at Tensilica. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef XTENSA_CONFIG_H +#define XTENSA_CONFIG_H + +/* The macros defined here match those with the same names in the Xtensa + compile-time HAL (Hardware Abstraction Layer). Please refer to the + Xtensa System Software Reference Manual for documentation of these + macros. */ + +#undef XCHAL_HAVE_BE +#define XCHAL_HAVE_BE 1 + +#undef XCHAL_HAVE_DENSITY +#define XCHAL_HAVE_DENSITY 1 + +#undef XCHAL_HAVE_CONST16 +#define XCHAL_HAVE_CONST16 0 + +#undef XCHAL_HAVE_ABS +#define XCHAL_HAVE_ABS 1 + +#undef XCHAL_HAVE_ADDX +#define XCHAL_HAVE_ADDX 1 + +#undef XCHAL_HAVE_L32R +#define XCHAL_HAVE_L32R 1 + +#undef XSHAL_USE_ABSOLUTE_LITERALS +#define XSHAL_USE_ABSOLUTE_LITERALS 0 + +#undef XSHAL_HAVE_TEXT_SECTION_LITERALS +#define XSHAL_HAVE_TEXT_SECTION_LITERALS 1 /* Set if there is some memory that allows both code and literals. */ + +#undef XCHAL_HAVE_MAC16 +#define XCHAL_HAVE_MAC16 0 + +#undef XCHAL_HAVE_MUL16 +#define XCHAL_HAVE_MUL16 1 + +#undef XCHAL_HAVE_MUL32 +#define XCHAL_HAVE_MUL32 1 + +#undef XCHAL_HAVE_MUL32_HIGH +#define XCHAL_HAVE_MUL32_HIGH 0 + +#undef XCHAL_HAVE_DIV32 +#define XCHAL_HAVE_DIV32 1 + +#undef XCHAL_HAVE_NSA +#define XCHAL_HAVE_NSA 1 + +#undef XCHAL_HAVE_MINMAX +#define XCHAL_HAVE_MINMAX 1 + +#undef XCHAL_HAVE_SEXT +#define XCHAL_HAVE_SEXT 1 + +#undef XCHAL_HAVE_LOOPS +#define XCHAL_HAVE_LOOPS 1 + +#undef XCHAL_HAVE_THREADPTR +#define XCHAL_HAVE_THREADPTR 1 + +#undef XCHAL_HAVE_RELEASE_SYNC +#define XCHAL_HAVE_RELEASE_SYNC 1 + +#undef XCHAL_HAVE_S32C1I +#define XCHAL_HAVE_S32C1I 1 + +#undef XCHAL_HAVE_BOOLEANS +#define XCHAL_HAVE_BOOLEANS 0 + +#undef XCHAL_HAVE_FP +#define XCHAL_HAVE_FP 0 + +#undef XCHAL_HAVE_FP_DIV +#define XCHAL_HAVE_FP_DIV 0 + +#undef XCHAL_HAVE_FP_RECIP +#define XCHAL_HAVE_FP_RECIP 0 + +#undef XCHAL_HAVE_FP_SQRT +#define XCHAL_HAVE_FP_SQRT 0 + +#undef XCHAL_HAVE_FP_RSQRT +#define XCHAL_HAVE_FP_RSQRT 0 + +#undef XCHAL_HAVE_DFP_accel +#define XCHAL_HAVE_DFP_accel 0 +#undef XCHAL_HAVE_WINDOWED +#define XCHAL_HAVE_WINDOWED 1 + +#undef XCHAL_NUM_AREGS +#define XCHAL_NUM_AREGS 32 + +#undef XCHAL_HAVE_WIDE_BRANCHES +#define XCHAL_HAVE_WIDE_BRANCHES 0 + +#undef XCHAL_HAVE_PREDICTED_BRANCHES +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 + + +#undef XCHAL_ICACHE_SIZE +#define XCHAL_ICACHE_SIZE 16384 + +#undef XCHAL_DCACHE_SIZE +#define XCHAL_DCACHE_SIZE 16384 + +#undef XCHAL_ICACHE_LINESIZE +#define XCHAL_ICACHE_LINESIZE 32 + +#undef XCHAL_DCACHE_LINESIZE +#define XCHAL_DCACHE_LINESIZE 32 + +#undef XCHAL_ICACHE_LINEWIDTH +#define XCHAL_ICACHE_LINEWIDTH 5 + +#undef XCHAL_DCACHE_LINEWIDTH +#define XCHAL_DCACHE_LINEWIDTH 5 + +#undef XCHAL_DCACHE_IS_WRITEBACK +#define XCHAL_DCACHE_IS_WRITEBACK 1 + + +#undef XCHAL_HAVE_MMU +#define XCHAL_HAVE_MMU 1 + +#undef XCHAL_MMU_MIN_PTE_PAGE_SIZE +#define XCHAL_MMU_MIN_PTE_PAGE_SIZE 12 + + +#undef XCHAL_HAVE_DEBUG +#define XCHAL_HAVE_DEBUG 1 + +#undef XCHAL_NUM_IBREAK +#define XCHAL_NUM_IBREAK 2 + +#undef XCHAL_NUM_DBREAK +#define XCHAL_NUM_DBREAK 2 + +#undef XCHAL_DEBUGLEVEL +#define XCHAL_DEBUGLEVEL 6 + + +#undef XCHAL_MAX_INSTRUCTION_SIZE +#define XCHAL_MAX_INSTRUCTION_SIZE 3 + +#undef XCHAL_INST_FETCH_WIDTH +#define XCHAL_INST_FETCH_WIDTH 4 + + +#undef XSHAL_ABI +#undef XTHAL_ABI_WINDOWED +#undef XTHAL_ABI_CALL0 +#define XSHAL_ABI XTHAL_ABI_WINDOWED +#define XTHAL_ABI_WINDOWED 0 +#define XTHAL_ABI_CALL0 1 + +#endif /* !XTENSA_CONFIG_H */ diff --git a/include/xtensa-isa-internal.h b/include/xtensa-isa-internal.h new file mode 100644 index 0000000..6c72736 --- /dev/null +++ b/include/xtensa-isa-internal.h @@ -0,0 +1,234 @@ +/* Internal definitions for configurable Xtensa ISA support. + Copyright 2003, 2004, 2005, 2008, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef XTENSA_ISA_INTERNAL_H +#define XTENSA_ISA_INTERNAL_H + +/* Flags. */ + +#define XTENSA_OPERAND_IS_REGISTER 0x00000001 +#define XTENSA_OPERAND_IS_PCRELATIVE 0x00000002 +#define XTENSA_OPERAND_IS_INVISIBLE 0x00000004 +#define XTENSA_OPERAND_IS_UNKNOWN 0x00000008 + +#define XTENSA_OPCODE_IS_BRANCH 0x00000001 +#define XTENSA_OPCODE_IS_JUMP 0x00000002 +#define XTENSA_OPCODE_IS_LOOP 0x00000004 +#define XTENSA_OPCODE_IS_CALL 0x00000008 + +#define XTENSA_STATE_IS_EXPORTED 0x00000001 +#define XTENSA_STATE_IS_SHARED_OR 0x00000002 + +#define XTENSA_INTERFACE_HAS_SIDE_EFFECT 0x00000001 + +/* Function pointer typedefs */ +typedef void (*xtensa_format_encode_fn) (xtensa_insnbuf); +typedef void (*xtensa_get_slot_fn) (const xtensa_insnbuf, xtensa_insnbuf); +typedef void (*xtensa_set_slot_fn) (xtensa_insnbuf, const xtensa_insnbuf); +typedef int (*xtensa_opcode_decode_fn) (const xtensa_insnbuf); +typedef uint32 (*xtensa_get_field_fn) (const xtensa_insnbuf); +typedef void (*xtensa_set_field_fn) (xtensa_insnbuf, uint32); +typedef int (*xtensa_immed_decode_fn) (uint32 *); +typedef int (*xtensa_immed_encode_fn) (uint32 *); +typedef int (*xtensa_do_reloc_fn) (uint32 *, uint32); +typedef int (*xtensa_undo_reloc_fn) (uint32 *, uint32); +typedef void (*xtensa_opcode_encode_fn) (xtensa_insnbuf); +typedef int (*xtensa_format_decode_fn) (const xtensa_insnbuf); +typedef int (*xtensa_length_decode_fn) (const unsigned char *); + +typedef struct xtensa_format_internal_struct +{ + const char *name; /* Instruction format name. */ + int length; /* Instruction length in bytes. */ + xtensa_format_encode_fn encode_fn; + int num_slots; + int *slot_id; /* Array[num_slots] of slot IDs. */ +} xtensa_format_internal; + +typedef struct xtensa_slot_internal_struct +{ + const char *name; /* Not necessarily unique. */ + const char *format; + int position; + xtensa_get_slot_fn get_fn; + xtensa_set_slot_fn set_fn; + xtensa_get_field_fn *get_field_fns; /* Array[field_id]. */ + xtensa_set_field_fn *set_field_fns; /* Array[field_id]. */ + xtensa_opcode_decode_fn opcode_decode_fn; + const char *nop_name; +} xtensa_slot_internal; + +typedef struct xtensa_operand_internal_struct +{ + const char *name; + int field_id; + xtensa_regfile regfile; /* Register file. */ + int num_regs; /* Usually 1; 2 for reg pairs, etc. */ + uint32 flags; /* See XTENSA_OPERAND_* flags. */ + xtensa_immed_encode_fn encode; /* Encode the operand value. */ + xtensa_immed_decode_fn decode; /* Decode the value from the field. */ + xtensa_do_reloc_fn do_reloc; /* Perform a PC-relative reloc. */ + xtensa_undo_reloc_fn undo_reloc; /* Undo a PC-relative relocation. */ +} xtensa_operand_internal; + +typedef struct xtensa_arg_internal_struct +{ + union { + int operand_id; /* For normal operands. */ + xtensa_state state; /* For stateOperands. */ + } u; + char inout; /* Direction: 'i', 'o', or 'm'. */ +} xtensa_arg_internal; + +typedef struct xtensa_iclass_internal_struct +{ + int num_operands; /* Size of "operands" array. */ + xtensa_arg_internal *operands; /* Array[num_operands]. */ + + int num_stateOperands; /* Size of "stateOperands" array. */ + xtensa_arg_internal *stateOperands; /* Array[num_stateOperands]. */ + + int num_interfaceOperands; /* Size of "interfaceOperands". */ + xtensa_interface *interfaceOperands; /* Array[num_interfaceOperands]. */ +} xtensa_iclass_internal; + +typedef struct xtensa_opcode_internal_struct +{ + const char *name; /* Opcode mnemonic. */ + int iclass_id; /* Iclass for this opcode. */ + uint32 flags; /* See XTENSA_OPCODE_* flags. */ + xtensa_opcode_encode_fn *encode_fns; /* Array[slot_id]. */ + int num_funcUnit_uses; /* Number of funcUnit_use entries. */ + xtensa_funcUnit_use *funcUnit_uses; /* Array[num_funcUnit_uses]. */ +} xtensa_opcode_internal; + +typedef struct xtensa_regfile_internal_struct +{ + const char *name; /* Full name of the regfile. */ + const char *shortname; /* Abbreviated name. */ + xtensa_regfile parent; /* View parent (or identity). */ + int num_bits; /* Width of the registers. */ + int num_entries; /* Number of registers. */ +} xtensa_regfile_internal; + +typedef struct xtensa_interface_internal_struct +{ + const char *name; /* Interface name. */ + int num_bits; /* Width of the interface. */ + uint32 flags; /* See XTENSA_INTERFACE_* flags. */ + int class_id; /* Class of related interfaces. */ + char inout; /* "i" or "o". */ +} xtensa_interface_internal; + +typedef struct xtensa_funcUnit_internal_struct +{ + const char *name; /* Functional unit name. */ + int num_copies; /* Number of instances. */ +} xtensa_funcUnit_internal; + +typedef struct xtensa_state_internal_struct +{ + const char *name; /* State name. */ + int num_bits; /* Number of state bits. */ + uint32 flags; /* See XTENSA_STATE_* flags. */ +} xtensa_state_internal; + +typedef struct xtensa_sysreg_internal_struct +{ + const char *name; /* Register name. */ + int number; /* Register number. */ + int is_user; /* Non-zero if a "user register". */ +} xtensa_sysreg_internal; + +typedef struct xtensa_lookup_entry_struct +{ + const char *key; + union + { + xtensa_opcode opcode; /* Internal opcode number. */ + xtensa_sysreg sysreg; /* Internal sysreg number. */ + xtensa_state state; /* Internal state number. */ + xtensa_interface intf; /* Internal interface number. */ + xtensa_funcUnit fun; /* Internal funcUnit number. */ + } u; +} xtensa_lookup_entry; + +typedef struct xtensa_isa_internal_struct +{ + int is_big_endian; /* Endianness. */ + int insn_size; /* Maximum length in bytes. */ + int insnbuf_size; /* Number of insnbuf_words. */ + + int num_formats; + xtensa_format_internal *formats; + xtensa_format_decode_fn format_decode_fn; + xtensa_length_decode_fn length_decode_fn; + + int num_slots; + xtensa_slot_internal *slots; + + int num_fields; + + int num_operands; + xtensa_operand_internal *operands; + + int num_iclasses; + xtensa_iclass_internal *iclasses; + + int num_opcodes; + xtensa_opcode_internal *opcodes; + xtensa_lookup_entry *opname_lookup_table; + + int num_regfiles; + xtensa_regfile_internal *regfiles; + + int num_states; + xtensa_state_internal *states; + xtensa_lookup_entry *state_lookup_table; + + int num_sysregs; + xtensa_sysreg_internal *sysregs; + xtensa_lookup_entry *sysreg_lookup_table; + + /* The current Xtensa ISA only supports 256 of each kind of sysreg so + we can get away with implementing lookups with tables indexed by + the register numbers. If we ever allow larger sysreg numbers, this + may have to be reimplemented. The first entry in the following + arrays corresponds to "special" registers and the second to "user" + registers. */ + int max_sysreg_num[2]; + xtensa_sysreg *sysreg_table[2]; + + int num_interfaces; + xtensa_interface_internal *interfaces; + xtensa_lookup_entry *interface_lookup_table; + + int num_funcUnits; + xtensa_funcUnit_internal *funcUnits; + xtensa_lookup_entry *funcUnit_lookup_table; + +} xtensa_isa_internal; + +extern int xtensa_isa_name_compare (const void *, const void *); + +extern xtensa_isa_status xtisa_errno; +extern char xtisa_error_msg[]; + +#endif /* !XTENSA_ISA_INTERNAL_H */ diff --git a/include/xtensa-isa.h b/include/xtensa-isa.h new file mode 100644 index 0000000..c3c740d --- /dev/null +++ b/include/xtensa-isa.h @@ -0,0 +1,813 @@ +/* Interface definition for configurable Xtensa ISA support. + Copyright 2003, 2004, 2005, 2006, 2008, 2010 Free Software Foundation, Inc. + + This file is part of BFD, the Binary File Descriptor library. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef XTENSA_LIBISA_H +#define XTENSA_LIBISA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Version number: This is intended to help support code that works with + versions of this library from multiple Xtensa releases. */ + +#define XTENSA_ISA_VERSION 7000 + +#ifndef uint32 +#define uint32 unsigned int +#endif + +/* This file defines the interface to the Xtensa ISA library. This + library contains most of the ISA-specific information for a + particular Xtensa processor. For example, the set of valid + instructions, their opcode encodings and operand fields are all + included here. + + This interface basically defines a number of abstract data types. + + . an instruction buffer - for holding the raw instruction bits + . ISA info - information about the ISA as a whole + . instruction formats - instruction size and slot structure + . opcodes - information about individual instructions + . operands - information about register and immediate instruction operands + . stateOperands - information about processor state instruction operands + . interfaceOperands - information about interface instruction operands + . register files - register file information + . processor states - internal processor state information + . system registers - "special registers" and "user registers" + . interfaces - TIE interfaces that are external to the processor + . functional units - TIE shared functions + + The interface defines a set of functions to access each data type. + With the exception of the instruction buffer, the internal + representations of the data structures are hidden. All accesses must + be made through the functions defined here. */ + +typedef struct xtensa_isa_opaque { int unused; } *xtensa_isa; + + +/* Most of the Xtensa ISA entities (e.g., opcodes, regfiles, etc.) are + represented here using sequential integers beginning with 0. The + specific values are only fixed for a particular instantiation of an + xtensa_isa structure, so these values should only be used + internally. */ + +typedef int xtensa_opcode; +typedef int xtensa_format; +typedef int xtensa_regfile; +typedef int xtensa_state; +typedef int xtensa_sysreg; +typedef int xtensa_interface; +typedef int xtensa_funcUnit; + + +/* Define a unique value for undefined items. */ + +#define XTENSA_UNDEFINED -1 + + +/* Overview of using this interface to decode/encode instructions: + + Each Xtensa instruction is associated with a particular instruction + format, where the format defines a fixed number of slots for + operations. The formats for the core Xtensa ISA have only one slot, + but FLIX instructions may have multiple slots. Within each slot, + there is a single opcode and some number of associated operands. + + The encoding and decoding functions operate on instruction buffers, + not on the raw bytes of the instructions. The same instruction + buffer data structure is used for both entire instructions and + individual slots in those instructions -- the contents of a slot need + to be extracted from or inserted into the buffer for the instruction + as a whole. + + Decoding an instruction involves first finding the format, which + identifies the number of slots, and then decoding each slot + separately. A slot is decoded by finding the opcode and then using + the opcode to determine how many operands there are. For example: + + xtensa_insnbuf_from_chars + xtensa_format_decode + for each slot { + xtensa_format_get_slot + xtensa_opcode_decode + for each operand { + xtensa_operand_get_field + xtensa_operand_decode + } + } + + Encoding an instruction is roughly the same procedure in reverse: + + xtensa_format_encode + for each slot { + xtensa_opcode_encode + for each operand { + xtensa_operand_encode + xtensa_operand_set_field + } + xtensa_format_set_slot + } + xtensa_insnbuf_to_chars +*/ + + +/* Error handling. */ + +/* Error codes. The code for the most recent error condition can be + retrieved with the "errno" function. For any result other than + xtensa_isa_ok, an error message containing additional information + about the problem can be retrieved using the "error_msg" function. + The error messages are stored in an internal buffer, which should + not be freed and may be overwritten by subsequent operations. */ + +typedef enum xtensa_isa_status_enum +{ + xtensa_isa_ok = 0, + xtensa_isa_bad_format, + xtensa_isa_bad_slot, + xtensa_isa_bad_opcode, + xtensa_isa_bad_operand, + xtensa_isa_bad_field, + xtensa_isa_bad_iclass, + xtensa_isa_bad_regfile, + xtensa_isa_bad_sysreg, + xtensa_isa_bad_state, + xtensa_isa_bad_interface, + xtensa_isa_bad_funcUnit, + xtensa_isa_wrong_slot, + xtensa_isa_no_field, + xtensa_isa_out_of_memory, + xtensa_isa_buffer_overflow, + xtensa_isa_internal_error, + xtensa_isa_bad_value +} xtensa_isa_status; + +extern xtensa_isa_status +xtensa_isa_errno (xtensa_isa isa); + +extern char * +xtensa_isa_error_msg (xtensa_isa isa); + + + +/* Instruction buffers. */ + +typedef uint32 xtensa_insnbuf_word; +typedef xtensa_insnbuf_word *xtensa_insnbuf; + + +/* Get the size in "insnbuf_words" of the xtensa_insnbuf array. */ + +extern int +xtensa_insnbuf_size (xtensa_isa isa); + + +/* Allocate an xtensa_insnbuf of the right size. */ + +extern xtensa_insnbuf +xtensa_insnbuf_alloc (xtensa_isa isa); + + +/* Release an xtensa_insnbuf. */ + +extern void +xtensa_insnbuf_free (xtensa_isa isa, xtensa_insnbuf buf); + + +/* Conversion between raw memory (char arrays) and our internal + instruction representation. This is complicated by the Xtensa ISA's + variable instruction lengths. When converting to chars, the buffer + must contain a valid instruction so we know how many bytes to copy; + thus, the "to_chars" function returns the number of bytes copied or + XTENSA_UNDEFINED on error. The "from_chars" function first reads the + minimal number of bytes required to decode the instruction length and + then proceeds to copy the entire instruction into the buffer; if the + memory does not contain a valid instruction, it copies the maximum + number of bytes required for the longest Xtensa instruction. The + "num_chars" argument may be used to limit the number of bytes that + can be read or written. Otherwise, if "num_chars" is zero, the + functions may read or write past the end of the code. */ + +extern int +xtensa_insnbuf_to_chars (xtensa_isa isa, const xtensa_insnbuf insn, + unsigned char *cp, int num_chars); + +extern void +xtensa_insnbuf_from_chars (xtensa_isa isa, xtensa_insnbuf insn, + const unsigned char *cp, int num_chars); + + + +/* ISA information. */ + +/* Initialize the ISA information. */ + +extern xtensa_isa +xtensa_isa_init (xtensa_isa_status *errno_p, char **error_msg_p); + + +/* Deallocate an xtensa_isa structure. */ + +extern void +xtensa_isa_free (xtensa_isa isa); + + +/* Get the maximum instruction size in bytes. */ + +extern int +xtensa_isa_maxlength (xtensa_isa isa); + + +/* Decode the length in bytes of an instruction in raw memory (not an + insnbuf). This function reads only the minimal number of bytes + required to decode the instruction length. Returns + XTENSA_UNDEFINED on error. */ + +extern int +xtensa_isa_length_from_chars (xtensa_isa isa, const unsigned char *cp); + + +/* Get the number of stages in the processor's pipeline. The pipeline + stage values returned by other functions in this library will range + from 0 to N-1, where N is the value returned by this function. + Note that the stage numbers used here may not correspond to the + actual processor hardware, e.g., the hardware may have additional + stages before stage 0. Returns XTENSA_UNDEFINED on error. */ + +extern int +xtensa_isa_num_pipe_stages (xtensa_isa isa); + + +/* Get the number of various entities that are defined for this processor. */ + +extern int +xtensa_isa_num_formats (xtensa_isa isa); + +extern int +xtensa_isa_num_opcodes (xtensa_isa isa); + +extern int +xtensa_isa_num_regfiles (xtensa_isa isa); + +extern int +xtensa_isa_num_states (xtensa_isa isa); + +extern int +xtensa_isa_num_sysregs (xtensa_isa isa); + +extern int +xtensa_isa_num_interfaces (xtensa_isa isa); + +extern int +xtensa_isa_num_funcUnits (xtensa_isa isa); + + + +/* Instruction formats. */ + +/* Get the name of a format. Returns null on error. */ + +extern const char * +xtensa_format_name (xtensa_isa isa, xtensa_format fmt); + + +/* Given a format name, return the format number. Returns + XTENSA_UNDEFINED if the name is not a valid format. */ + +extern xtensa_format +xtensa_format_lookup (xtensa_isa isa, const char *fmtname); + + +/* Decode the instruction format from a binary instruction buffer. + Returns XTENSA_UNDEFINED if the format is not recognized. */ + +extern xtensa_format +xtensa_format_decode (xtensa_isa isa, const xtensa_insnbuf insn); + + +/* Set the instruction format field(s) in a binary instruction buffer. + All the other fields are set to zero. Returns non-zero on error. */ + +extern int +xtensa_format_encode (xtensa_isa isa, xtensa_format fmt, xtensa_insnbuf insn); + + +/* Find the length (in bytes) of an instruction. Returns + XTENSA_UNDEFINED on error. */ + +extern int +xtensa_format_length (xtensa_isa isa, xtensa_format fmt); + + +/* Get the number of slots in an instruction. Returns XTENSA_UNDEFINED + on error. */ + +extern int +xtensa_format_num_slots (xtensa_isa isa, xtensa_format fmt); + + +/* Get the opcode for a no-op in a particular slot. + Returns XTENSA_UNDEFINED on error. */ + +extern xtensa_opcode +xtensa_format_slot_nop_opcode (xtensa_isa isa, xtensa_format fmt, int slot); + + +/* Get the bits for a specified slot out of an insnbuf for the + instruction as a whole and put them into an insnbuf for that one + slot, and do the opposite to set a slot. Return non-zero on error. */ + +extern int +xtensa_format_get_slot (xtensa_isa isa, xtensa_format fmt, int slot, + const xtensa_insnbuf insn, xtensa_insnbuf slotbuf); + +extern int +xtensa_format_set_slot (xtensa_isa isa, xtensa_format fmt, int slot, + xtensa_insnbuf insn, const xtensa_insnbuf slotbuf); + + + +/* Opcode information. */ + +/* Translate a mnemonic name to an opcode. Returns XTENSA_UNDEFINED if + the name is not a valid opcode mnemonic. */ + +extern xtensa_opcode +xtensa_opcode_lookup (xtensa_isa isa, const char *opname); + + +/* Decode the opcode for one instruction slot from a binary instruction + buffer. Returns the opcode or XTENSA_UNDEFINED if the opcode is + illegal. */ + +extern xtensa_opcode +xtensa_opcode_decode (xtensa_isa isa, xtensa_format fmt, int slot, + const xtensa_insnbuf slotbuf); + + +/* Set the opcode field(s) for an instruction slot. All other fields + in the slot are set to zero. Returns non-zero if the opcode cannot + be encoded. */ + +extern int +xtensa_opcode_encode (xtensa_isa isa, xtensa_format fmt, int slot, + xtensa_insnbuf slotbuf, xtensa_opcode opc); + + +/* Get the mnemonic name for an opcode. Returns null on error. */ + +extern const char * +xtensa_opcode_name (xtensa_isa isa, xtensa_opcode opc); + + +/* Check various properties of opcodes. These functions return 0 if + the condition is false, 1 if the condition is true, and + XTENSA_UNDEFINED on error. The instructions are classified as + follows: + + branch: conditional branch; may fall through to next instruction (B*) + jump: unconditional branch (J, JX, RET*, RF*) + loop: zero-overhead loop (LOOP*) + call: unconditional call; control returns to next instruction (CALL*) + + For the opcodes that affect control flow in some way, the branch + target may be specified by an immediate operand or it may be an + address stored in a register. You can distinguish these by + checking if the instruction has a PC-relative immediate + operand. */ + +extern int +xtensa_opcode_is_branch (xtensa_isa isa, xtensa_opcode opc); + +extern int +xtensa_opcode_is_jump (xtensa_isa isa, xtensa_opcode opc); + +extern int +xtensa_opcode_is_loop (xtensa_isa isa, xtensa_opcode opc); + +extern int +xtensa_opcode_is_call (xtensa_isa isa, xtensa_opcode opc); + + +/* Find the number of ordinary operands, state operands, and interface + operands for an instruction. These return XTENSA_UNDEFINED on + error. */ + +extern int +xtensa_opcode_num_operands (xtensa_isa isa, xtensa_opcode opc); + +extern int +xtensa_opcode_num_stateOperands (xtensa_isa isa, xtensa_opcode opc); + +extern int +xtensa_opcode_num_interfaceOperands (xtensa_isa isa, xtensa_opcode opc); + + +/* Get functional unit usage requirements for an opcode. Each "use" + is identified by a pair. The + "num_funcUnit_uses" function returns the number of these "uses" or + XTENSA_UNDEFINED on error. The "funcUnit_use" function returns + a pointer to a "use" pair or null on error. */ + +typedef struct xtensa_funcUnit_use_struct +{ + xtensa_funcUnit unit; + int stage; +} xtensa_funcUnit_use; + +extern int +xtensa_opcode_num_funcUnit_uses (xtensa_isa isa, xtensa_opcode opc); + +extern xtensa_funcUnit_use * +xtensa_opcode_funcUnit_use (xtensa_isa isa, xtensa_opcode opc, int u); + + + +/* Operand information. */ + +/* Get the name of an operand. Returns null on error. */ + +extern const char * +xtensa_operand_name (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* Some operands are "invisible", i.e., not explicitly specified in + assembly language. When assembling an instruction, you need not set + the values of invisible operands, since they are either hardwired or + derived from other field values. The values of invisible operands + can be examined in the same way as other operands, but remember that + an invisible operand may get its value from another visible one, so + the entire instruction must be available before examining the + invisible operand values. This function returns 1 if an operand is + visible, 0 if it is invisible, or XTENSA_UNDEFINED on error. Note + that whether an operand is visible is orthogonal to whether it is + "implicit", i.e., whether it is encoded in a field in the + instruction. */ + +extern int +xtensa_operand_is_visible (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* Check if an operand is an input ('i'), output ('o'), or inout ('m') + operand. Note: The output operand of a conditional assignment + (e.g., movnez) appears here as an inout ('m') even if it is declared + in the TIE code as an output ('o'); this allows the compiler to + properly handle register allocation for conditional assignments. + Returns 0 on error. */ + +extern char +xtensa_operand_inout (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* Get and set the raw (encoded) value of the field for the specified + operand. The "set" function does not check if the value fits in the + field; that is done by the "encode" function below. Both of these + functions return non-zero on error, e.g., if the field is not defined + for the specified slot. */ + +extern int +xtensa_operand_get_field (xtensa_isa isa, xtensa_opcode opc, int opnd, + xtensa_format fmt, int slot, + const xtensa_insnbuf slotbuf, uint32 *valp); + +extern int +xtensa_operand_set_field (xtensa_isa isa, xtensa_opcode opc, int opnd, + xtensa_format fmt, int slot, + xtensa_insnbuf slotbuf, uint32 val); + + +/* Encode and decode operands. The raw bits in the operand field may + be encoded in a variety of different ways. These functions hide + the details of that encoding. The result values are returned through + the argument pointer. The return value is non-zero on error. */ + +extern int +xtensa_operand_encode (xtensa_isa isa, xtensa_opcode opc, int opnd, + uint32 *valp); + +extern int +xtensa_operand_decode (xtensa_isa isa, xtensa_opcode opc, int opnd, + uint32 *valp); + + +/* An operand may be either a register operand or an immediate of some + sort (e.g., PC-relative or not). The "is_register" function returns + 0 if the operand is an immediate, 1 if it is a register, and + XTENSA_UNDEFINED on error. The "regfile" function returns the + regfile for a register operand, or XTENSA_UNDEFINED on error. */ + +extern int +xtensa_operand_is_register (xtensa_isa isa, xtensa_opcode opc, int opnd); + +extern xtensa_regfile +xtensa_operand_regfile (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* Register operands may span multiple consecutive registers, e.g., a + 64-bit data type may occupy two 32-bit registers. Only the first + register is encoded in the operand field. This function specifies + the number of consecutive registers occupied by this operand. For + non-register operands, the return value is undefined. Returns + XTENSA_UNDEFINED on error. */ + +extern int +xtensa_operand_num_regs (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* Some register operands do not completely identify the register being + accessed. For example, the operand value may be added to an internal + state value. By definition, this implies that the corresponding + regfile is not allocatable. Unknown registers should generally be + treated with worst-case assumptions. The function returns 0 if the + register value is unknown, 1 if known, and XTENSA_UNDEFINED on + error. */ + +extern int +xtensa_operand_is_known_reg (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* Check if an immediate operand is PC-relative. Returns 0 for register + operands and non-PC-relative immediates, 1 for PC-relative + immediates, and XTENSA_UNDEFINED on error. */ + +extern int +xtensa_operand_is_PCrelative (xtensa_isa isa, xtensa_opcode opc, int opnd); + + +/* For PC-relative offset operands, the interpretation of the offset may + vary between opcodes, e.g., is it relative to the current PC or that + of the next instruction? The following functions are defined to + perform PC-relative relocations and to undo them (as in the + disassembler). The "do_reloc" function takes the desired address + value and the PC of the current instruction and sets the value to the + corresponding PC-relative offset (which can then be encoded and + stored into the operand field). The "undo_reloc" function takes the + unencoded offset value and the current PC and sets the value to the + appropriate address. The return values are non-zero on error. Note + that these functions do not replace the encode/decode functions; the + operands must be encoded/decoded separately and the encode functions + are responsible for detecting invalid operand values. */ + +extern int +xtensa_operand_do_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd, + uint32 *valp, uint32 pc); + +extern int +xtensa_operand_undo_reloc (xtensa_isa isa, xtensa_opcode opc, int opnd, + uint32 *valp, uint32 pc); + + + +/* State Operands. */ + +/* Get the state accessed by a state operand. Returns XTENSA_UNDEFINED + on error. */ + +extern xtensa_state +xtensa_stateOperand_state (xtensa_isa isa, xtensa_opcode opc, int stOp); + + +/* Check if a state operand is an input ('i'), output ('o'), or inout + ('m') operand. Returns 0 on error. */ + +extern char +xtensa_stateOperand_inout (xtensa_isa isa, xtensa_opcode opc, int stOp); + + + +/* Interface Operands. */ + +/* Get the external interface accessed by an interface operand. + Returns XTENSA_UNDEFINED on error. */ + +extern xtensa_interface +xtensa_interfaceOperand_interface (xtensa_isa isa, xtensa_opcode opc, + int ifOp); + + + +/* Register Files. */ + +/* Regfiles include both "real" regfiles and "views", where a view + allows a group of adjacent registers in a real "parent" regfile to be + viewed as a single register. A regfile view has all the same + properties as its parent except for its (long) name, bit width, number + of entries, and default ctype. You can use the parent function to + distinguish these two classes. */ + +/* Look up a regfile by either its name or its abbreviated "short name". + Returns XTENSA_UNDEFINED on error. The "lookup_shortname" function + ignores "view" regfiles since they always have the same shortname as + their parents. */ + +extern xtensa_regfile +xtensa_regfile_lookup (xtensa_isa isa, const char *name); + +extern xtensa_regfile +xtensa_regfile_lookup_shortname (xtensa_isa isa, const char *shortname); + + +/* Get the name or abbreviated "short name" of a regfile. + Returns null on error. */ + +extern const char * +xtensa_regfile_name (xtensa_isa isa, xtensa_regfile rf); + +extern const char * +xtensa_regfile_shortname (xtensa_isa isa, xtensa_regfile rf); + + +/* Get the parent regfile of a "view" regfile. If the regfile is not a + view, the result is the same as the input parameter. Returns + XTENSA_UNDEFINED on error. */ + +extern xtensa_regfile +xtensa_regfile_view_parent (xtensa_isa isa, xtensa_regfile rf); + + +/* Get the bit width of a regfile or regfile view. + Returns XTENSA_UNDEFINED on error. */ + +extern int +xtensa_regfile_num_bits (xtensa_isa isa, xtensa_regfile rf); + + +/* Get the number of regfile entries. Returns XTENSA_UNDEFINED on + error. */ + +extern int +xtensa_regfile_num_entries (xtensa_isa isa, xtensa_regfile rf); + + + +/* Processor States. */ + +/* Look up a state by name. Returns XTENSA_UNDEFINED on error. */ + +extern xtensa_state +xtensa_state_lookup (xtensa_isa isa, const char *name); + + +/* Get the name for a processor state. Returns null on error. */ + +extern const char * +xtensa_state_name (xtensa_isa isa, xtensa_state st); + + +/* Get the bit width for a processor state. + Returns XTENSA_UNDEFINED on error. */ + +extern int +xtensa_state_num_bits (xtensa_isa isa, xtensa_state st); + + +/* Check if a state is exported from the processor core. Returns 0 if + the condition is false, 1 if the condition is true, and + XTENSA_UNDEFINED on error. */ + +extern int +xtensa_state_is_exported (xtensa_isa isa, xtensa_state st); + + +/* Check for a "shared_or" state. Returns 0 if the condition is false, + 1 if the condition is true, and XTENSA_UNDEFINED on error. */ + +extern int +xtensa_state_is_shared_or (xtensa_isa isa, xtensa_state st); + + + +/* Sysregs ("special registers" and "user registers"). */ + +/* Look up a register by its number and whether it is a "user register" + or a "special register". Returns XTENSA_UNDEFINED if the sysreg does + not exist. */ + +extern xtensa_sysreg +xtensa_sysreg_lookup (xtensa_isa isa, int num, int is_user); + + +/* Check if there exists a sysreg with a given name. + If not, this function returns XTENSA_UNDEFINED. */ + +extern xtensa_sysreg +xtensa_sysreg_lookup_name (xtensa_isa isa, const char *name); + + +/* Get the name of a sysreg. Returns null on error. */ + +extern const char * +xtensa_sysreg_name (xtensa_isa isa, xtensa_sysreg sysreg); + + +/* Get the register number. Returns XTENSA_UNDEFINED on error. */ + +extern int +xtensa_sysreg_number (xtensa_isa isa, xtensa_sysreg sysreg); + + +/* Check if a sysreg is a "special register" or a "user register". + Returns 0 for special registers, 1 for user registers and + XTENSA_UNDEFINED on error. */ + +extern int +xtensa_sysreg_is_user (xtensa_isa isa, xtensa_sysreg sysreg); + + + +/* Interfaces. */ + +/* Find an interface by name. The return value is XTENSA_UNDEFINED if + the specified interface is not found. */ + +extern xtensa_interface +xtensa_interface_lookup (xtensa_isa isa, const char *ifname); + + +/* Get the name of an interface. Returns null on error. */ + +extern const char * +xtensa_interface_name (xtensa_isa isa, xtensa_interface intf); + + +/* Get the bit width for an interface. + Returns XTENSA_UNDEFINED on error. */ + +extern int +xtensa_interface_num_bits (xtensa_isa isa, xtensa_interface intf); + + +/* Check if an interface is an input ('i') or output ('o') with respect + to the Xtensa processor core. Returns 0 on error. */ + +extern char +xtensa_interface_inout (xtensa_isa isa, xtensa_interface intf); + + +/* Check if accessing an interface has potential side effects. + Currently "data" interfaces have side effects and "control" + interfaces do not. Returns 1 if there are side effects, 0 if not, + and XTENSA_UNDEFINED on error. */ + +extern int +xtensa_interface_has_side_effect (xtensa_isa isa, xtensa_interface intf); + + +/* Some interfaces may be related such that accessing one interface + has side effects on a set of related interfaces. The interfaces + are partitioned into equivalence classes of related interfaces, and + each class is assigned a unique identifier number. This function + returns the class identifier for an interface, or XTENSA_UNDEFINED + on error. These identifiers can be compared to determine if two + interfaces are related; the specific values of the identifiers have + no particular meaning otherwise. */ + +extern int +xtensa_interface_class_id (xtensa_isa isa, xtensa_interface intf); + + + +/* Functional Units. */ + +/* Find a functional unit by name. The return value is XTENSA_UNDEFINED if + the specified unit is not found. */ + +extern xtensa_funcUnit +xtensa_funcUnit_lookup (xtensa_isa isa, const char *fname); + + +/* Get the name of a functional unit. Returns null on error. */ + +extern const char * +xtensa_funcUnit_name (xtensa_isa isa, xtensa_funcUnit fun); + + +/* Functional units may be replicated. See how many instances of a + particular function unit exist. Returns XTENSA_UNDEFINED on error. */ + +extern int +xtensa_funcUnit_num_copies (xtensa_isa isa, xtensa_funcUnit fun); + + +#ifdef __cplusplus +} +#endif +#endif /* XTENSA_LIBISA_H */ diff --git a/lib/Makefile b/lib/Makefile index 4f35f46..d730f30 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -1,2 +1,346 @@ +# SIMPLEFB lib-$(CONFIG_SIMPLE_FB) += simplefb/simplefb.o + +# DEBUG lib-y += debug/debug.o + +# argz +lib-y += \ + argz/argz_add.o \ + argz/argz_add_sep.o \ + argz/argz_append.o \ + argz/argz_count.o \ + argz/argz_create.o \ + argz/argz_create_sep.o \ + argz/argz_delete.o \ + argz/argz_extract.o \ + argz/argz_insert.o \ + argz/argz_next.o \ + argz/argz_replace.o \ + argz/argz_stringify.o \ + argz/buf_findstr.o \ + argz/envz_entry.o \ + argz/envz_get.o \ + argz/envz_add.o \ + argz/envz_remove.o \ + argz/envz_merge.o \ + argz/envz_strip.o + +# stdlib +lib-y += \ + stdlib/__adjust.o \ + stdlib/__atexit.o \ + stdlib/__call_atexit.o \ + stdlib/__exp10.o \ + stdlib/__ten_mu.o \ + stdlib/_Exit.o \ + stdlib/abort.o \ + stdlib/abs.o \ + stdlib/aligned_alloc.o \ + stdlib/assert.o \ + stdlib/atexit.o \ + stdlib/atof.o \ + stdlib/atoff.o \ + stdlib/atoi.o \ + stdlib/atol.o \ + stdlib/calloc.o \ + stdlib/callocr.o \ + stdlib/cfreer.o \ + stdlib/div.o \ + stdlib/dtoa.o \ + stdlib/dtoastub.o \ + stdlib/environ.o \ + stdlib/envlock.o \ + stdlib/eprintf.o \ + stdlib/exit.o \ + stdlib/freer.o \ + stdlib/gdtoa-gethex.o \ + stdlib/gdtoa-hexnan.o \ + stdlib/getenv.o \ + stdlib/getenv_r.o \ + stdlib/imaxabs.o \ + stdlib/imaxdiv.o \ + stdlib/itoa.o \ + stdlib/labs.o \ + stdlib/ldiv.o \ + stdlib/ldtoa.o \ + stdlib/gdtoa-ldtoa.o \ + stdlib/gdtoa-gdtoa.o \ + stdlib/gdtoa-dmisc.o \ + stdlib/gdtoa-gmisc.o \ + stdlib/mallinfor.o \ + stdlib/malloc.o \ + stdlib/mallocr.o \ + stdlib/mallstatsr.o \ + stdlib/mblen.o \ + stdlib/mblen_r.o \ + stdlib/mbstowcs.o \ + stdlib/mbstowcs_r.o \ + stdlib/mbtowc.o \ + stdlib/mbtowc_r.o \ + stdlib/mlock.o \ + stdlib/mprec.o \ + stdlib/msizer.o \ + stdlib/mstats.o \ + stdlib/on_exit_args.o \ + stdlib/quick_exit.o \ + stdlib/rand.o \ + stdlib/rand_r.o \ + stdlib/random.o \ + stdlib/realloc.o \ + stdlib/reallocarray.o \ + stdlib/reallocf.o \ + stdlib/reallocr.o \ + stdlib/sb_charsets.o \ + stdlib/strtod.o \ + stdlib/strtoimax.o \ + stdlib/strtol.o \ + stdlib/strtoul.o \ + stdlib/strtoumax.o \ + stdlib/utoa.o \ + stdlib/wcstod.o \ + stdlib/wcstoimax.o \ + stdlib/wcstol.o \ + stdlib/wcstoul.o \ + stdlib/wcstoumax.o \ + stdlib/wcstombs.o \ + stdlib/wcstombs_r.o \ + stdlib/wctomb.o \ + stdlib/wctomb_r.o + +# ctype +lib-y += \ + ctype/ctype_.o \ + ctype/isalnum.o \ + ctype/isalpha.o \ + ctype/iscntrl.o \ + ctype/isdigit.o \ + ctype/islower.o \ + ctype/isupper.o \ + ctype/isprint.o \ + ctype/ispunct.o \ + ctype/isspace.o \ + ctype/isxdigit.o \ + ctype/tolower.o \ + ctype/toupper.o + +# search +lib-y += \ + search/bsearch.o \ + search/db_local.h \ + search/extern.h \ + search/hash.h \ + search/ndbm.o \ + search/page.h \ + search/qsort.o + + +# string +lib-y += \ + string/bcopy.o \ + string/bzero.o \ + string/explicit_bzero.o \ + string/ffsl.o \ + string/ffsll.o \ + string/fls.o \ + string/flsl.o \ + string/flsll.o \ + string/index.o \ + string/memchr.o \ + string/memcmp.o \ + string/memcpy.o \ + string/memmove.o \ + string/memset.o \ + string/rindex.o \ + string/strcasecmp.o \ + string/strcat.o \ + string/strchr.o \ + string/strcmp.o \ + string/strcoll.o \ + string/strcpy.o \ + string/strcspn.o \ + string/strdup.o \ + string/strdup_r.o \ + string/strerror.o \ + string/strerror_r.o \ + string/strlcat.o \ + string/strlcpy.o \ + string/strlen.o \ + string/strlwr.o \ + string/strncasecmp.o \ + string/strncat.o \ + string/strncmp.o \ + string/strncpy.o \ + string/strnlen.o \ + string/strnstr.o \ + string/strpbrk.o \ + string/strrchr.o \ + string/strsep.o \ + string/strsignal.o \ + string/strspn.o \ + string/strtok.o \ + string/strtok_r.o \ + string/strupr.o \ + string/strxfrm.o \ + string/strstr.o \ + string/swab.o \ + string/timingsafe_bcmp.o \ + string/timingsafe_memcmp.o \ + string/u_strerr.o \ + string/wcscat.o \ + string/wcschr.o \ + string/wcscmp.o \ + string/wcscoll.o \ + string/wcscpy.o \ + string/wcscspn.o \ + string/wcslcat.o \ + string/wcslcpy.o \ + string/wcslen.o \ + string/wcsncat.o \ + string/wcsncmp.o \ + string/wcsncpy.o \ + string/wcsnlen.o \ + string/wcspbrk.o \ + string/wcsrchr.o \ + string/wcsspn.o \ + string/wcsstr.o \ + string/wcstok.o \ + string/wcswidth.o \ + string/wcsxfrm.o \ + string/wcwidth.o \ + string/wmemchr.o \ + string/wmemcmp.o \ + string/wmemcpy.o \ + string/wmemmove.o \ + string/wmemset.o \ + string/xpg_strerror_r.o + +# stdio +# TODO + +#lib-y += \ +# stdio/nano-vfprintf_float.o \ +# stdio/nano-svfprintf.o \ +# stdio/nano-svfscanf.o \ +# stdio/nano-vfprintf.o \ +# stdio/nano-vfprintf_i.o \ +# stdio/nano-vfscanf.o \ +# stdio/nano-vfscanf_i.o \ +# stdio/nano-vfscanf_float.o + +# signal +lib-y += \ + signal/psignal.o signal/raise.o signal/signal.o signal/sig2str.o + +# time +lib-y += \ + time/asctime.o \ + time/asctime_r.o \ + time/clock.o \ + time/ctime.o \ + time/ctime_r.o \ + time/difftime.o \ + time/gettzinfo.o \ + time/gmtime.o \ + time/gmtime_r.o \ + time/lcltime.o \ + time/lcltime_r.o \ + time/mktime.o \ + time/month_lengths.o \ + time/strftime.o \ + time/strptime.o \ + time/time.o \ + time/tzcalc_limits.o \ + time/tzlock.o \ + time/tzset.o \ + time/tzset_r.o \ + time/tzvars.o \ + time/wcsftime.o + +# locale +lib-y += \ + locale/setlocale.h \ + locale/locale.o \ + locale/localeconv.o + +# reent +# TODO + +# errno +lib-y += errno/errno.o + +# misc +lib-y += \ + misc/__dprintf.o \ + misc/unctrl.o \ + misc/ffs.o \ + misc/init.o \ + misc/fini.o + +# syscalls +lib-y += \ + syscalls/sysclose.o \ + syscalls/sysfcntl.o \ + syscalls/sysfstat.o \ + syscalls/sysgetpid.o \ + syscalls/sysgettod.o \ + #syscalls/sysisatty.o \ + syscalls/syskill.o \ + syscalls/syslink.o \ + syscalls/syslseek.o \ + syscalls/sysopen.o \ + syscalls/sysread.o \ + syscalls/syssbrk.o \ + syscalls/sysstat.o \ + syscalls/systimes.o \ + syscalls/sysunlink.o \ + syscalls/syswrite.o + +ifeq ($(ARCH), arm) +# machine +lib-y += \ + machine/arm/setjmp.o machine/arm/strcmp.o machine/arm/strcpy.o \ + machine/arm/aeabi_memcpy.o machine/arm/aeabi_memcpy-armv7a.o \ + machine/arm/aeabi_memmove.o machine/arm/aeabi_memmove-soft.o \ + machine/arm/aeabi_memset.o machine/arm/aeabi_memset-soft.o machine/arm/aeabi_memclr.o \ + machine/arm/memchr-stub.o \ + machine/arm/memchr.o \ + machine/arm/memcpy-stub.o \ + machine/arm/memcpy.o \ + machine/arm/strlen-stub.o \ + machine/arm/strlen.o +else +# machine +lib-y += \ + machine/aarch64/memchr-stub.o \ + machine/aarch64/memchr.o \ + machine/aarch64/memcmp-stub.o \ + machine/aarch64/memcmp.o \ + machine/aarch64/memcpy-stub.o \ + machine/aarch64/memcpy.o \ + machine/aarch64/memmove-stub.o \ + machine/aarch64/memmove.o \ + machine/aarch64/memset-stub.o \ + machine/aarch64/memset.o \ + machine/aarch64/rawmemchr.o \ + machine/aarch64/rawmemchr-stub.o \ + machine/aarch64/setjmp.o \ + machine/aarch64/stpcpy-stub.o \ + machine/aarch64/stpcpy.o \ + machine/aarch64/strchr-stub.o \ + machine/aarch64/strchr.o \ + machine/aarch64/strchrnul-stub.o \ + machine/aarch64/strchrnul.o \ + machine/aarch64/strcmp-stub.o \ + machine/aarch64/strcmp.o \ + machine/aarch64/strcpy-stub.o \ + machine/aarch64/strcpy.o \ + machine/aarch64/strlen-stub.o \ + machine/aarch64/strlen.o \ + machine/aarch64/strncmp-stub.o \ + machine/aarch64/strncmp.o \ + machine/aarch64/strnlen-stub.o \ + machine/aarch64/strnlen.o \ + machine/aarch64/strrchr-stub.o \ + machine/aarch64/strrchr.o +endif diff --git a/lib/acinclude.m4 b/lib/acinclude.m4 new file mode 100644 index 0000000..4266266 --- /dev/null +++ b/lib/acinclude.m4 @@ -0,0 +1,68 @@ +dnl For each directory which we may or may not want, we define a name +dnl for the library and an automake conditional for whether we should +dnl build the library. + +AM_CONDITIONAL(HAVE_SIGNAL_DIR, test x${signal_dir} != x) +AM_CONDITIONAL(HAVE_STDIO_DIR, test x${stdio_dir} != x) +AM_CONDITIONAL(HAVE_STDIO64_DIR, test x${stdio64_dir} != x) +AM_CONDITIONAL(HAVE_POSIX_DIR, test x${posix_dir} != x) +AM_CONDITIONAL(HAVE_XDR_DIR, test x${xdr_dir} != x) +AM_CONDITIONAL(HAVE_SYSCALL_DIR, test x${syscall_dir} != x) +AM_CONDITIONAL(HAVE_UNIX_DIR, test x${unix_dir} != x) + +dnl We always recur into sys and machine, and let them decide what to do. +m4_foreach_w([SYS_DIR], [ + a29khif amdgcn arm + d10v + epiphany + h8300hms h8500hms + m88kbug mmixware + netware + or1k + rdos rtems + sh sysmec sysnec810 sysnecv850 sysvi386 sysvnecv70 + tic80 tirtos + w65 + z8ksim +], [AM_CONDITIONAL([HAVE_LIBC_SYS_]m4_toupper(SYS_DIR)[_DIR], test "${sys_dir}" = SYS_DIR)]) + +AC_TYPE_LONG_DOUBLE +AM_CONDITIONAL(HAVE_LONG_DOUBLE, test x"$ac_cv_type_long_double" = x"yes") + +dnl iconv library will be compiled if --enable-newlib-iconv option is enabled +AM_CONDITIONAL(ENABLE_NEWLIB_ICONV, test x${newlib_iconv} != x) + +dnl We have to include these unconditionally since machines might want to use +dnl AM_CONDITIONAL in their subdirs. +m4_include([libc/machine/nds32/acinclude.m4]) +m4_include([libc/machine/powerpc/acinclude.m4]) +m4_include([libc/machine/sh/acinclude.m4]) +m4_include([libc/machine/spu/acinclude.m4]) + +m4_foreach_w([MACHINE], [ + aarch64 amdgcn arc arm + bfin + cr16 cris crx csky + d10v d30v + epiphany + fr30 frv ft32 + h8300 h8500 hppa + i386 i960 iq2000 + lm32 + m32c m32r m68hc11 m68k m88k mep microblaze mips mn10200 mn10300 moxie msp430 mt + nds32 necv70 nios2 nvptx + or1k + powerpc pru + riscv rl78 rx + sh sparc spu + tic4x tic6x tic80 + v850 visium + w65 + x86_64 xc16x xstormy16 + z8k +], [AM_CONDITIONAL([HAVE_LIBC_MACHINE_]m4_toupper(MACHINE), test "${machine_dir}" = MACHINE)]) + +AM_CONDITIONAL(HAVE_FPMATH_H, test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h") + + +AM_CONDITIONAL(MACH_ADD_SETJMP, test "x$mach_add_setjmp" = "xtrue") diff --git a/lib/argz/Makefile.inc b/lib/argz/Makefile.inc new file mode 100644 index 0000000..98da255 --- /dev/null +++ b/lib/argz/Makefile.inc @@ -0,0 +1,23 @@ +## All functions in this directory are EL/IX level 2 and above +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/argz_add.c \ + %D%/argz_add_sep.c \ + %D%/argz_append.c \ + %D%/argz_count.c \ + %D%/argz_create.c \ + %D%/argz_create_sep.c \ + %D%/argz_delete.c \ + %D%/argz_extract.c \ + %D%/argz_insert.c \ + %D%/argz_next.c \ + %D%/argz_replace.c \ + %D%/argz_stringify.c \ + %D%/buf_findstr.c \ + %D%/envz_entry.c \ + %D%/envz_get.c \ + %D%/envz_add.c \ + %D%/envz_remove.c \ + %D%/envz_merge.c \ + %D%/envz_strip.c +endif diff --git a/lib/argz/argz_add.c b/lib/argz/argz_add.c new file mode 100644 index 0000000..a1a8d3d --- /dev/null +++ b/lib/argz/argz_add.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +error_t +argz_add (char **argz, + size_t *argz_len, + const char *str) +{ + int len_to_add = 0; + size_t last = *argz_len; + + if (str == NULL) + return 0; + + len_to_add = strlen(str) + 1; + *argz_len += len_to_add; + + if(!(*argz = (char *)realloc(*argz, *argz_len))) + return ENOMEM; + + memcpy(*argz + last, str, len_to_add); + return 0; +} diff --git a/lib/argz/argz_add_sep.c b/lib/argz/argz_add_sep.c new file mode 100644 index 0000000..f2964e6 --- /dev/null +++ b/lib/argz/argz_add_sep.c @@ -0,0 +1,35 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +error_t +argz_add_sep (char **argz, + size_t *argz_len, + const char *str, + int sep) +{ + char *str_argz = 0; + size_t str_argz_len = 0; + size_t last = *argz_len; + + argz_create_sep (str, sep, &str_argz, &str_argz_len); + + if (str_argz_len) + { + *argz_len += str_argz_len; + + if(!(*argz = (char *)realloc(*argz, *argz_len))) + return ENOMEM; + + memcpy(*argz + last, str_argz, str_argz_len); + } + return 0; +} diff --git a/lib/argz/argz_append.c b/lib/argz/argz_append.c new file mode 100644 index 0000000..de0cc82 --- /dev/null +++ b/lib/argz/argz_append.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +error_t +argz_append (char **argz, + size_t *argz_len, + const char *buf, + size_t buf_len) +{ + if (buf_len) + { + size_t last = *argz_len; + + *argz_len += buf_len; + + if(!(*argz = (char *)realloc(*argz, *argz_len))) + return ENOMEM; + + memcpy(*argz + last, buf, buf_len); + } + return 0; +} diff --git a/lib/argz/argz_count.c b/lib/argz/argz_count.c new file mode 100644 index 0000000..4c0007c --- /dev/null +++ b/lib/argz/argz_count.c @@ -0,0 +1,25 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include <_ansi.h> +#include +#include +#include + +size_t +argz_count (const char *argz, + size_t argz_len) +{ + int i; + size_t count = 0; + + for (i = 0; i < argz_len; i++) + { + if (argz[i] == '\0') + count++; + } + return count; +} diff --git a/lib/argz/argz_create.c b/lib/argz/argz_create.c new file mode 100644 index 0000000..4ab622d --- /dev/null +++ b/lib/argz/argz_create.c @@ -0,0 +1,49 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +error_t +argz_create (char *const argv[], + char **argz, + size_t *argz_len) +{ + int argc = 0; + int i = 0; + int len = 0; + char *iter; + + *argz_len = 0; + + if (*argv == NULL) + { + *argz = NULL; + return 0; + } + + while (argv[argc]) + { + *argz_len += (strlen(argv[argc]) + 1); + argc++; + } + + /* There are argc strings to copy into argz. */ + if(!(*argz = (char *)malloc(*argz_len))) + return ENOMEM; + + iter = *argz; + for(i = 0; i < argc; i++) + { + len = strlen(argv[i]) + 1; + memcpy(iter, argv[i], len); + iter += len; + } + return 0; +} diff --git a/lib/argz/argz_create_sep.c b/lib/argz/argz_create_sep.c new file mode 100644 index 0000000..bf578e6 --- /dev/null +++ b/lib/argz/argz_create_sep.c @@ -0,0 +1,68 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +error_t +argz_create_sep (const char *string, + int sep, + char **argz, + size_t *argz_len) +{ + int len = 0; + int i = 0; + int num_strings = 0; + char delim[2]; + char *running = 0; + char *old_running = 0; + char *token = 0; + char *iter = 0; + + *argz_len = 0; + + if (!string || string[0] == '\0') + { + *argz= NULL; + return 0; + } + + delim[0] = sep; + delim[1] = '\0'; + + running = strdup(string); + old_running = running; + + while ((token = strsep(&running, delim))) + { + len = strlen(token); + *argz_len += (len + 1); + num_strings++; + } + + if(!(*argz = (char *)malloc(*argz_len))) + return ENOMEM; + + free(old_running); + + running = strdup(string); + old_running = running; + + iter = *argz; + for (i = 0; i < num_strings; i++) + { + token = strsep(&running, delim); + len = strlen(token) + 1; + memcpy(iter, token, len); + iter += len; + } + + free(old_running); + return 0; +} diff --git a/lib/argz/argz_delete.c b/lib/argz/argz_delete.c new file mode 100644 index 0000000..aa1fe4c --- /dev/null +++ b/lib/argz/argz_delete.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +error_t +argz_delete (char **argz, + size_t *argz_len, + char *entry) +{ + int len = 0; + char *moveto = entry; + + if (entry) + { + len = strlen(entry) + 1; + entry += len; + + memmove(moveto, entry, *argz + *argz_len - entry); + + *argz_len -= len; + + if(!(*argz = (char *)realloc(*argz, *argz_len))) + return ENOMEM; + + if (*argz_len <= 0) + { + free(*argz); + *argz = NULL; + } + } + return 0; +} diff --git a/lib/argz/argz_extract.c b/lib/argz/argz_extract.c new file mode 100644 index 0000000..e97b769 --- /dev/null +++ b/lib/argz/argz_extract.c @@ -0,0 +1,31 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include + +void +argz_extract (char *argz, + size_t argz_len, + char **argv) +{ + size_t i = 0; + int j = 0; + const size_t count = argz_count(argz, argz_len); + + if (argz_len > 1) + for (i = argz_len - 2; i > 0; i--) + { + if (argz[i] == '\0') + { + j++; + argv[count - j] = &argz[i + 1]; + } + } + argv[0] = &argz[0]; + argv[count] = NULL; +} diff --git a/lib/argz/argz_insert.c b/lib/argz/argz_insert.c new file mode 100644 index 0000000..abdfeb0 --- /dev/null +++ b/lib/argz/argz_insert.c @@ -0,0 +1,47 @@ +/* Copyright (C) 2002, 2005 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include +#define __need_ptrdiff_t +#include + +error_t +argz_insert (char **argz, + size_t *argz_len, + char *before, + const char *entry) +{ + int len = 0; + ptrdiff_t delta; + + if (before == NULL) + return argz_add(argz, argz_len, entry); + + if (before < *argz || before >= *argz + *argz_len) + return EINVAL; + + while (before != *argz && before[-1]) + before--; + + /* delta will always be non-negative, and < *argz_len */ + delta = before - *argz; + + len = strlen(entry) + 1; + + if(!(*argz = (char *)realloc(*argz, *argz_len + len))) + return ENOMEM; + + memmove(*argz + delta + len, *argz + delta, *argz_len - delta); + memcpy(*argz + delta, entry, len); + + *argz_len += len; + + return 0; +} diff --git a/lib/argz/argz_next.c b/lib/argz/argz_next.c new file mode 100644 index 0000000..0d6f21d --- /dev/null +++ b/lib/argz/argz_next.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +char * +argz_next (char *argz, + size_t argz_len, + const char *entry) +{ + if (entry) + { + while(*entry != '\0') + entry++; + entry++; + + if (entry >= argz + argz_len) + return NULL; + else + return (char *) entry; + } + else + { + if (argz_len > 0) + return (char *) argz; + else + return NULL; + } +} diff --git a/lib/argz/argz_replace.c b/lib/argz/argz_replace.c new file mode 100644 index 0000000..f2e0d52 --- /dev/null +++ b/lib/argz/argz_replace.c @@ -0,0 +1,93 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +#include "buf_findstr.h" + +error_t +argz_replace (char **argz, + size_t *argz_len, + const char *str, + const char *with, + unsigned *replace_count) +{ + const int str_len = strlen(str); + const int with_len = strlen(with); + const int len_diff = with_len - str_len; + + char *buf_iter = *argz; + size_t buf_len = *argz_len; + char *last_iter = NULL; + char *new_argz = NULL; + size_t new_argz_len = 0; + char *new_argz_iter = NULL; + char *argz_realloc = NULL; + + *replace_count = 0; + new_argz_len = *argz_len; + + while(buf_len) + { + if(_buf_findstr(str, &buf_iter, &buf_len)) + { + *replace_count += 1; + new_argz_len += len_diff; + } + } + + if (*replace_count) + { + if (!(new_argz = (char *)malloc(new_argz_len))) + return ENOMEM; + + buf_iter = *argz; + buf_len = *argz_len; + last_iter = buf_iter; + new_argz_iter = new_argz; + + while(buf_len) + { + if (_buf_findstr(str, &buf_iter, &buf_len)) + { + /* copy everything up to, but not including str, from old argz to + new argz. */ + memcpy(new_argz_iter, last_iter, buf_iter - last_iter - str_len); + new_argz_iter += (buf_iter - last_iter - str_len); + /* copy replacement string. */ + memcpy(new_argz_iter, with, with_len); + new_argz_iter += with_len; + last_iter = buf_iter; + } + } + /* copy everything after last occurrence of str. */ + memcpy(new_argz_iter, last_iter, *argz + *argz_len - last_iter); + + /* reallocate argz, and copy over the new value. */ + if(!(argz_realloc = (char *)realloc(*argz, new_argz_len))) + { + free(new_argz); + return ENOMEM; + } + *argz = argz_realloc; + + memcpy(*argz, new_argz, new_argz_len); + *argz_len = new_argz_len; + + if (*argz_len == 0) + { + free(*argz); + *argz = NULL; + } + free(new_argz); + } + + return 0; +} diff --git a/lib/argz/argz_stringify.c b/lib/argz/argz_stringify.c new file mode 100644 index 0000000..98f6c9b --- /dev/null +++ b/lib/argz/argz_stringify.c @@ -0,0 +1,26 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include <_ansi.h> +#include +#include +#include + +void +argz_stringify (char *argz, + size_t argz_len, + int sep) +{ + size_t i; + + /* len includes trailing \0, which we don't want to replace. */ + if (argz_len > 1) + for (i = 0; i < argz_len - 1; i++) + { + if (argz[i] == '\0') + argz[i] = sep; + } +} diff --git a/lib/argz/buf_findstr.c b/lib/argz/buf_findstr.c new file mode 100644 index 0000000..aeb32a9 --- /dev/null +++ b/lib/argz/buf_findstr.c @@ -0,0 +1,44 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include + +#include "buf_findstr.h" + +/* Find string str in buffer buf of length buf_len. Point buf to character after string, + or set it to NULL if end of buffer is reached. Return 1 if found, 0 if not. */ +int +_buf_findstr(const char *str, char **buf, size_t *buf_len) +{ + int i = 0; + int j = 0; + + for (i = 0; i < *buf_len; i++) + { + if (str[0] == (*buf)[i]) + { + j = i; + while (str[j - i] && (str[j - i] == (*buf)[j])) j++; + if(str[j - i] == '\0') + { + *buf += j; + *buf_len -= j; + return 1; + } + } + } + + if (i == *buf_len) + { + *buf += *buf_len; + *buf_len = 0; + } + + return 0; +} diff --git a/lib/argz/buf_findstr.h b/lib/argz/buf_findstr.h new file mode 100644 index 0000000..d6cef7c --- /dev/null +++ b/lib/argz/buf_findstr.h @@ -0,0 +1,12 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include + +/* Find string str in buffer buf of length buf_len. Point buf to + character after string, or set it to NULL if end of buffer is + reached. Return 1 if found, 0 if not. */ +int _buf_findstr(const char *str, char **buf, size_t *buf_len); diff --git a/lib/argz/envz_add.c b/lib/argz/envz_add.c new file mode 100644 index 0000000..60ecf17 --- /dev/null +++ b/lib/argz/envz_add.c @@ -0,0 +1,46 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include +#include + +error_t +envz_add (char **envz, + size_t *envz_len, + const char *name, + const char *value) +{ + char *concat = NULL; + int name_len = 0; + int val_len = 0; + int retval = 0; + + envz_remove(envz, envz_len, name); + + if (value) + { + name_len = strlen(name); + val_len = strlen(value); + if(!(concat = (char *) malloc(name_len + val_len + 2))) + return ENOMEM; + + memcpy(concat, name, name_len); + concat[name_len] = '='; + memcpy(concat + name_len + 1, value, val_len + 1); + + retval = argz_add(envz, envz_len, concat); + free(concat); + } + else + { + retval = argz_add(envz, envz_len, name); + } + return retval; +} diff --git a/lib/argz/envz_entry.c b/lib/argz/envz_entry.c new file mode 100644 index 0000000..869c332 --- /dev/null +++ b/lib/argz/envz_entry.c @@ -0,0 +1,45 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +#include "buf_findstr.h" + +char * +envz_entry (const char *envz, + size_t envz_len, + const char *name) +{ + char *buf_ptr = (char *)envz; + size_t buf_len = envz_len; + + while(buf_len) + { + if (_buf_findstr(name, &buf_ptr, &buf_len)) + { + if (buf_ptr) + { + if (*buf_ptr == '=' || *buf_ptr == '\0') + { + buf_ptr--; + + /* Move buf_ptr back to start of entry. */ + while(*buf_ptr != '\0' && buf_ptr != envz) buf_ptr--; + + if(*buf_ptr == '\0') + buf_ptr++; + + return (char *)buf_ptr; + } + } + } + } + return 0; +} diff --git a/lib/argz/envz_get.c b/lib/argz/envz_get.c new file mode 100644 index 0000000..9863642 --- /dev/null +++ b/lib/argz/envz_get.c @@ -0,0 +1,42 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include + +#include "buf_findstr.h" + +char * +envz_get (const char *envz, + size_t envz_len, + const char *name) +{ + char *buf_ptr = (char *)envz; + size_t buf_len = envz_len; + + while(buf_len) + { + if (_buf_findstr(name, &buf_ptr, &buf_len)) + { + if (*buf_ptr == '=') + { + buf_ptr++; + return (char *)buf_ptr; + } + else + { + if (*buf_ptr == '\0') + /* NULL entry. */ + return NULL; + } + } + } + /* No matching entries found. */ + return NULL; +} diff --git a/lib/argz/envz_merge.c b/lib/argz/envz_merge.c new file mode 100644 index 0000000..3be7c1f --- /dev/null +++ b/lib/argz/envz_merge.c @@ -0,0 +1,61 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include +#include + +error_t +envz_merge (char **envz, + size_t *envz_len, + const char *envz2, + size_t envz2_len, + int override) +{ + char *entry = NULL; + char *name_str = NULL; + char *val_str = NULL; + char *name_iter = NULL; + int retval = 0; + + while((entry = argz_next((char *)envz2, envz2_len, entry)) && !retval) + { + if (!override) + { + name_str = strdup (entry); + name_iter = strchr(name_str, '='); + if(name_iter) + *name_iter = '\0'; + + if(!envz_entry(*envz, *envz_len, name_str)) + { + retval = argz_add(envz, envz_len, entry); + } + free(name_str); + } + else + { + name_str = strdup (entry); + name_iter = strchr(name_str, '='); + if(name_iter) + { + *name_iter = '\0'; + val_str = name_iter + 1; + } + else + { + val_str = NULL; + } + + retval = envz_add(envz, envz_len, name_str, val_str); + free(name_str); + } + } + return retval; +} diff --git a/lib/argz/envz_remove.c b/lib/argz/envz_remove.c new file mode 100644 index 0000000..8fc9e8f --- /dev/null +++ b/lib/argz/envz_remove.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include +#include + +void +envz_remove (char **envz, + size_t *envz_len, + const char *name) +{ + char *entry = NULL; + int len = 0; + entry = envz_entry (*envz, *envz_len, name); + + if (entry) + { + len = strlen(entry) + 1; + + /* Not the last entry. */ + if (*envz + *envz_len != entry + len - 1) + { + memmove(entry, entry + len, *envz + *envz_len - entry - len); + } + + *envz = (char *)realloc(*envz, *envz_len - len); + *envz_len -= len; + } +} diff --git a/lib/argz/envz_strip.c b/lib/argz/envz_strip.c new file mode 100644 index 0000000..8efa5cb --- /dev/null +++ b/lib/argz/envz_strip.c @@ -0,0 +1,41 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include +#include +#include +#include +#include + +void +envz_strip (char **envz, + size_t *envz_len) +{ + char *entry = 0; + int len = 0; + int null_found = 0; + + while((entry = argz_next(*envz, *envz_len, entry))) + { + if(!strchr(entry, '=')) + { + null_found = 1; + len = strlen(entry) + 1; + /* Make sure this is not the last entry in envz. If it is, it + will be chopped off by the realloc anyway.*/ + if(*envz + *envz_len != entry + len - 1) + { + memmove(entry, entry + len, *envz + *envz_len - entry - len); + } + *envz_len -= len; + } + } + if(null_found) + { + *envz = (char *)realloc(*envz, *envz_len); + } +} diff --git a/lib/ctype/Makefile.inc b/lib/ctype/Makefile.inc new file mode 100644 index 0000000..0affa29 --- /dev/null +++ b/lib/ctype/Makefile.inc @@ -0,0 +1,112 @@ +libc_a_SOURCES += \ + %D%/ctype_.c \ + %D%/isalnum.c \ + %D%/isalpha.c \ + %D%/iscntrl.c \ + %D%/isdigit.c \ + %D%/islower.c \ + %D%/isupper.c \ + %D%/isprint.c \ + %D%/ispunct.c \ + %D%/isspace.c \ + %D%/isxdigit.c \ + %D%/tolower.c \ + %D%/toupper.c + +## The following handles EL/IX level 2 functions +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/categories.c \ + %D%/isalnum_l.c \ + %D%/isalpha_l.c \ + %D%/isascii.c \ + %D%/isascii_l.c \ + %D%/isblank.c \ + %D%/isblank_l.c \ + %D%/iscntrl_l.c \ + %D%/isdigit_l.c \ + %D%/islower_l.c \ + %D%/isupper_l.c \ + %D%/isprint_l.c \ + %D%/ispunct_l.c \ + %D%/isspace_l.c \ + %D%/iswalnum.c \ + %D%/iswalnum_l.c \ + %D%/iswalpha.c \ + %D%/iswalpha_l.c \ + %D%/iswblank.c \ + %D%/iswblank_l.c \ + %D%/iswcntrl.c \ + %D%/iswcntrl_l.c \ + %D%/iswctype.c \ + %D%/iswctype_l.c \ + %D%/iswdigit.c \ + %D%/iswdigit_l.c \ + %D%/iswgraph.c \ + %D%/iswgraph_l.c \ + %D%/iswlower.c \ + %D%/iswlower_l.c \ + %D%/iswprint.c \ + %D%/iswprint_l.c \ + %D%/iswpunct.c \ + %D%/iswpunct_l.c \ + %D%/iswspace.c \ + %D%/iswspace_l.c \ + %D%/iswupper.c \ + %D%/iswupper_l.c \ + %D%/iswxdigit.c \ + %D%/iswxdigit_l.c \ + %D%/isxdigit_l.c \ + %D%/jp2uc.c \ + %D%/toascii.c \ + %D%/toascii_l.c \ + %D%/tolower_l.c \ + %D%/toupper_l.c \ + %D%/towctrans.c \ + %D%/towctrans_l.c \ + %D%/towlower.c \ + %D%/towlower_l.c \ + %D%/towupper.c \ + %D%/towupper_l.c \ + %D%/wctrans.c \ + %D%/wctrans_l.c \ + %D%/wctype.c \ + %D%/wctype_l.c +endif + +LIBC_CHEWOUT_FILES += \ + %D%/isalnum.def \ + %D%/isalpha.def \ + %D%/isascii.def \ + %D%/isblank.def \ + %D%/iscntrl.def \ + %D%/isdigit.def \ + %D%/islower.def \ + %D%/isprint.def \ + %D%/ispunct.def \ + %D%/isspace.def \ + %D%/isupper.def \ + %D%/iswalnum.def \ + %D%/iswalpha.def \ + %D%/iswblank.def \ + %D%/iswcntrl.def \ + %D%/iswctype.def \ + %D%/iswdigit.def \ + %D%/iswgraph.def \ + %D%/iswlower.def \ + %D%/iswprint.def \ + %D%/iswpunct.def \ + %D%/iswspace.def \ + %D%/iswupper.def \ + %D%/iswxdigit.def \ + %D%/isxdigit.def \ + %D%/toascii.def \ + %D%/tolower.def \ + %D%/toupper.def \ + %D%/towctrans.def \ + %D%/towlower.def \ + %D%/towupper.def \ + %D%/wctrans.def \ + %D%/wctype.def + +LIBC_CHAPTERS += %D%/ctype.tex diff --git a/lib/ctype/caseconv.t b/lib/ctype/caseconv.t new file mode 100644 index 0000000..0620f14 --- /dev/null +++ b/lib/ctype/caseconv.t @@ -0,0 +1,328 @@ + {0x0041, 25, TOLO, 32}, + {0x0061, 25, TOUP, -32}, + {0x00B5, 0, TOUP, 743}, + {0x00C0, 22, TOLO, 32}, + {0x00D8, 6, TOLO, 32}, + {0x00E0, 22, TOUP, -32}, + {0x00F8, 6, TOUP, -32}, + {0x00FF, 0, TOUP, 121}, + {0x0100, 47, TO1, EVENCAP}, + {0x0130, 0, TOLO, -199}, + {0x0131, 0, TOUP, -232}, + {0x0132, 5, TO1, EVENCAP}, + {0x0139, 15, TO1, ODDCAP}, + {0x014A, 45, TO1, EVENCAP}, + {0x0178, 0, TOLO, -121}, + {0x0179, 5, TO1, ODDCAP}, + {0x017F, 0, TOUP, -300}, + {0x0180, 0, TOUP, 195}, + {0x0181, 0, TOLO, 210}, + {0x0182, 3, TO1, EVENCAP}, + {0x0186, 0, TOLO, 206}, + {0x0187, 1, TO1, ODDCAP}, + {0x0189, 1, TOLO, 205}, + {0x018B, 1, TO1, ODDCAP}, + {0x018E, 0, TOLO, 79}, + {0x018F, 0, TOLO, 202}, + {0x0190, 0, TOLO, 203}, + {0x0191, 1, TO1, ODDCAP}, + {0x0193, 0, TOLO, 205}, + {0x0194, 0, TOLO, 207}, + {0x0195, 0, TOUP, 97}, + {0x0196, 0, TOLO, 211}, + {0x0197, 0, TOLO, 209}, + {0x0198, 1, TO1, EVENCAP}, + {0x019A, 0, TOUP, 163}, + {0x019C, 0, TOLO, 211}, + {0x019D, 0, TOLO, 213}, + {0x019E, 0, TOUP, 130}, + {0x019F, 0, TOLO, 214}, + {0x01A0, 5, TO1, EVENCAP}, + {0x01A6, 0, TOLO, 218}, + {0x01A7, 1, TO1, ODDCAP}, + {0x01A9, 0, TOLO, 218}, + {0x01AC, 1, TO1, EVENCAP}, + {0x01AE, 0, TOLO, 218}, + {0x01AF, 1, TO1, ODDCAP}, + {0x01B1, 1, TOLO, 217}, + {0x01B3, 3, TO1, ODDCAP}, + {0x01B7, 0, TOLO, 219}, + {0x01B8, 1, TO1, EVENCAP}, + {0x01BC, 1, TO1, EVENCAP}, + {0x01BF, 0, TOUP, 56}, + {0x01C4, 0, TOLO, 2}, + {0x01C5, 0, TOBOTH, 0}, + {0x01C6, 0, TOUP, -2}, + {0x01C7, 0, TOLO, 2}, + {0x01C8, 0, TOBOTH, 0}, + {0x01C9, 0, TOUP, -2}, + {0x01CA, 0, TOLO, 2}, + {0x01CB, 0, TOBOTH, 0}, + {0x01CC, 0, TOUP, -2}, + {0x01CD, 15, TO1, ODDCAP}, + {0x01DD, 0, TOUP, -79}, + {0x01DE, 17, TO1, EVENCAP}, + {0x01F1, 0, TOLO, 2}, + {0x01F2, 0, TOBOTH, 0}, + {0x01F3, 0, TOUP, -2}, + {0x01F4, 1, TO1, EVENCAP}, + {0x01F6, 0, TOLO, -97}, + {0x01F7, 0, TOLO, -56}, + {0x01F8, 39, TO1, EVENCAP}, + {0x0220, 0, TOLO, -130}, + {0x0222, 17, TO1, EVENCAP}, + {0x023A, 0, TOLO, 10795}, + {0x023B, 1, TO1, ODDCAP}, + {0x023D, 0, TOLO, -163}, + {0x023E, 0, TOLO, 10792}, + {0x023F, 1, TOUP, 10815}, + {0x0241, 1, TO1, ODDCAP}, + {0x0243, 0, TOLO, -195}, + {0x0244, 0, TOLO, 69}, + {0x0245, 0, TOLO, 71}, + {0x0246, 9, TO1, EVENCAP}, + {0x0250, 0, TOUP, 10783}, + {0x0251, 0, TOUP, 10780}, + {0x0252, 0, TOUP, 10782}, + {0x0253, 0, TOUP, -210}, + {0x0254, 0, TOUP, -206}, + {0x0256, 1, TOUP, -205}, + {0x0259, 0, TOUP, -202}, + {0x025B, 0, TOUP, -203}, + {0x025C, 0, TOUP, 42319}, + {0x0260, 0, TOUP, -205}, + {0x0261, 0, TOUP, 42315}, + {0x0263, 0, TOUP, -207}, + {0x0265, 0, TOUP, 42280}, + {0x0266, 0, TOUP, 42308}, + {0x0268, 0, TOUP, -209}, + {0x0269, 0, TOUP, -211}, + {0x026A, 0, TOUP, 42308}, + {0x026B, 0, TOUP, 10743}, + {0x026C, 0, TOUP, 42305}, + {0x026F, 0, TOUP, -211}, + {0x0271, 0, TOUP, 10749}, + {0x0272, 0, TOUP, -213}, + {0x0275, 0, TOUP, -214}, + {0x027D, 0, TOUP, 10727}, + {0x0280, 0, TOUP, -218}, + {0x0282, 0, TOUP, 42307}, + {0x0283, 0, TOUP, -218}, + {0x0287, 0, TOUP, 42282}, + {0x0288, 0, TOUP, -218}, + {0x0289, 0, TOUP, -69}, + {0x028A, 1, TOUP, -217}, + {0x028C, 0, TOUP, -71}, + {0x0292, 0, TOUP, -219}, + {0x029D, 0, TOUP, 42261}, + {0x029E, 0, TOUP, 42258}, + {0x0345, 0, TOUP, 84}, + {0x0370, 3, TO1, EVENCAP}, + {0x0376, 1, TO1, EVENCAP}, + {0x037B, 2, TOUP, 130}, + {0x037F, 0, TOLO, 116}, + {0x0386, 0, TOLO, 38}, + {0x0388, 2, TOLO, 37}, + {0x038C, 0, TOLO, 64}, + {0x038E, 1, TOLO, 63}, + {0x0391, 16, TOLO, 32}, + {0x03A3, 8, TOLO, 32}, + {0x03AC, 0, TOUP, -38}, + {0x03AD, 2, TOUP, -37}, + {0x03B1, 16, TOUP, -32}, + {0x03C2, 0, TOUP, -31}, + {0x03C3, 8, TOUP, -32}, + {0x03CC, 0, TOUP, -64}, + {0x03CD, 1, TOUP, -63}, + {0x03CF, 0, TOLO, 8}, + {0x03D0, 0, TOUP, -62}, + {0x03D1, 0, TOUP, -57}, + {0x03D5, 0, TOUP, -47}, + {0x03D6, 0, TOUP, -54}, + {0x03D7, 0, TOUP, -8}, + {0x03D8, 23, TO1, EVENCAP}, + {0x03F0, 0, TOUP, -86}, + {0x03F1, 0, TOUP, -80}, + {0x03F2, 0, TOUP, 7}, + {0x03F3, 0, TOUP, -116}, + {0x03F4, 0, TOLO, -60}, + {0x03F5, 0, TOUP, -96}, + {0x03F7, 1, TO1, ODDCAP}, + {0x03F9, 0, TOLO, -7}, + {0x03FA, 1, TO1, EVENCAP}, + {0x03FD, 2, TOLO, -130}, + {0x0400, 15, TOLO, 80}, + {0x0410, 31, TOLO, 32}, + {0x0430, 31, TOUP, -32}, + {0x0450, 15, TOUP, -80}, + {0x0460, 33, TO1, EVENCAP}, + {0x048A, 53, TO1, EVENCAP}, + {0x04C0, 0, TOLO, 15}, + {0x04C1, 13, TO1, ODDCAP}, + {0x04CF, 0, TOUP, -15}, + {0x04D0, 95, TO1, EVENCAP}, + {0x0531, 37, TOLO, 48}, + {0x0561, 37, TOUP, -48}, + {0x10A0, 37, TOLO, 7264}, + {0x10C7, 0, TOLO, 7264}, + {0x10CD, 0, TOLO, 7264}, + {0x10D0, 42, TOUP, 3008}, + {0x10FD, 2, TOUP, 3008}, + {0x13A0, 79, TOLO, 38864}, + {0x13F0, 5, TOLO, 8}, + {0x13F8, 5, TOUP, -8}, + {0x1C80, 0, TOUP, -6254}, + {0x1C81, 0, TOUP, -6253}, + {0x1C82, 0, TOUP, -6244}, + {0x1C83, 1, TOUP, -6242}, + {0x1C85, 0, TOUP, -6243}, + {0x1C86, 0, TOUP, -6236}, + {0x1C87, 0, TOUP, -6181}, + {0x1C88, 0, TOUP, 35266}, + {0x1C90, 42, TOLO, -3008}, + {0x1CBD, 2, TOLO, -3008}, + {0x1D79, 0, TOUP, 35332}, + {0x1D7D, 0, TOUP, 3814}, + {0x1D8E, 0, TOUP, 35384}, + {0x1E00, 149, TO1, EVENCAP}, + {0x1E9B, 0, TOUP, -59}, + {0x1E9E, 0, TOLO, -7615}, + {0x1EA0, 95, TO1, EVENCAP}, + {0x1F00, 7, TOUP, 8}, + {0x1F08, 7, TOLO, -8}, + {0x1F10, 5, TOUP, 8}, + {0x1F18, 5, TOLO, -8}, + {0x1F20, 7, TOUP, 8}, + {0x1F28, 7, TOLO, -8}, + {0x1F30, 7, TOUP, 8}, + {0x1F38, 7, TOLO, -8}, + {0x1F40, 5, TOUP, 8}, + {0x1F48, 5, TOLO, -8}, + {0x1F51, 0, TOUP, 8}, + {0x1F53, 0, TOUP, 8}, + {0x1F55, 0, TOUP, 8}, + {0x1F57, 0, TOUP, 8}, + {0x1F59, 0, TOLO, -8}, + {0x1F5B, 0, TOLO, -8}, + {0x1F5D, 0, TOLO, -8}, + {0x1F5F, 0, TOLO, -8}, + {0x1F60, 7, TOUP, 8}, + {0x1F68, 7, TOLO, -8}, + {0x1F70, 1, TOUP, 74}, + {0x1F72, 3, TOUP, 86}, + {0x1F76, 1, TOUP, 100}, + {0x1F78, 1, TOUP, 128}, + {0x1F7A, 1, TOUP, 112}, + {0x1F7C, 1, TOUP, 126}, + {0x1F80, 7, TOUP, 8}, + {0x1F88, 7, TOLO, -8}, + {0x1F90, 7, TOUP, 8}, + {0x1F98, 7, TOLO, -8}, + {0x1FA0, 7, TOUP, 8}, + {0x1FA8, 7, TOLO, -8}, + {0x1FB0, 1, TOUP, 8}, + {0x1FB3, 0, TOUP, 9}, + {0x1FB8, 1, TOLO, -8}, + {0x1FBA, 1, TOLO, -74}, + {0x1FBC, 0, TOLO, -9}, + {0x1FBE, 0, TOUP, -7205}, + {0x1FC3, 0, TOUP, 9}, + {0x1FC8, 3, TOLO, -86}, + {0x1FCC, 0, TOLO, -9}, + {0x1FD0, 1, TOUP, 8}, + {0x1FD8, 1, TOLO, -8}, + {0x1FDA, 1, TOLO, -100}, + {0x1FE0, 1, TOUP, 8}, + {0x1FE5, 0, TOUP, 7}, + {0x1FE8, 1, TOLO, -8}, + {0x1FEA, 1, TOLO, -112}, + {0x1FEC, 0, TOLO, -7}, + {0x1FF3, 0, TOUP, 9}, + {0x1FF8, 1, TOLO, -128}, + {0x1FFA, 1, TOLO, -126}, + {0x1FFC, 0, TOLO, -9}, + {0x2126, 0, TOLO, -7517}, + {0x212A, 0, TOLO, -8383}, + {0x212B, 0, TOLO, -8262}, + {0x2132, 0, TOLO, 28}, + {0x214E, 0, TOUP, -28}, + {0x2160, 15, TOLO, 16}, + {0x2170, 15, TOUP, -16}, + {0x2183, 1, TO1, ODDCAP}, + {0x24B6, 25, TOLO, 26}, + {0x24D0, 25, TOUP, -26}, + {0x2C00, 47, TOLO, 48}, + {0x2C30, 47, TOUP, -48}, + {0x2C60, 1, TO1, EVENCAP}, + {0x2C62, 0, TOLO, -10743}, + {0x2C63, 0, TOLO, -3814}, + {0x2C64, 0, TOLO, -10727}, + {0x2C65, 0, TOUP, -10795}, + {0x2C66, 0, TOUP, -10792}, + {0x2C67, 5, TO1, ODDCAP}, + {0x2C6D, 0, TOLO, -10780}, + {0x2C6E, 0, TOLO, -10749}, + {0x2C6F, 0, TOLO, -10783}, + {0x2C70, 0, TOLO, -10782}, + {0x2C72, 1, TO1, EVENCAP}, + {0x2C75, 1, TO1, ODDCAP}, + {0x2C7E, 1, TOLO, -10815}, + {0x2C80, 99, TO1, EVENCAP}, + {0x2CEB, 3, TO1, ODDCAP}, + {0x2CF2, 1, TO1, EVENCAP}, + {0x2D00, 37, TOUP, -7264}, + {0x2D27, 0, TOUP, -7264}, + {0x2D2D, 0, TOUP, -7264}, + {0xA640, 45, TO1, EVENCAP}, + {0xA680, 27, TO1, EVENCAP}, + {0xA722, 13, TO1, EVENCAP}, + {0xA732, 61, TO1, EVENCAP}, + {0xA779, 3, TO1, ODDCAP}, + {0xA77D, 0, TOLO, -35332}, + {0xA77E, 9, TO1, EVENCAP}, + {0xA78B, 1, TO1, ODDCAP}, + {0xA78D, 0, TOLO, -42280}, + {0xA790, 3, TO1, EVENCAP}, + {0xA794, 0, TOUP, 48}, + {0xA796, 19, TO1, EVENCAP}, + {0xA7AA, 0, TOLO, -42308}, + {0xA7AB, 0, TOLO, -42319}, + {0xA7AC, 0, TOLO, -42315}, + {0xA7AD, 0, TOLO, -42305}, + {0xA7AE, 0, TOLO, -42308}, + {0xA7B0, 0, TOLO, -42258}, + {0xA7B1, 0, TOLO, -42282}, + {0xA7B2, 0, TOLO, -42261}, + {0xA7B3, 0, TOLO, 928}, + {0xA7B4, 15, TO1, EVENCAP}, + {0xA7C4, 0, TOLO, -48}, + {0xA7C5, 0, TOLO, -42307}, + {0xA7C6, 0, TOLO, -35384}, + {0xA7C7, 3, TO1, ODDCAP}, + {0xA7D0, 1, TO1, EVENCAP}, + {0xA7D6, 3, TO1, EVENCAP}, + {0xA7F5, 1, TO1, ODDCAP}, + {0xAB53, 0, TOUP, -928}, + {0xAB70, 79, TOUP, -38864}, + {0xFF21, 25, TOLO, 32}, + {0xFF41, 25, TOUP, -32}, + {0x10400, 39, TOLO, 40}, + {0x10428, 39, TOUP, -40}, + {0x104B0, 35, TOLO, 40}, + {0x104D8, 35, TOUP, -40}, + {0x10570, 10, TOLO, 39}, + {0x1057C, 14, TOLO, 39}, + {0x1058C, 6, TOLO, 39}, + {0x10594, 1, TOLO, 39}, + {0x10597, 10, TOUP, -39}, + {0x105A3, 14, TOUP, -39}, + {0x105B3, 6, TOUP, -39}, + {0x105BB, 1, TOUP, -39}, + {0x10C80, 50, TOLO, 64}, + {0x10CC0, 50, TOUP, -64}, + {0x118A0, 31, TOLO, 32}, + {0x118C0, 31, TOUP, -32}, + {0x16E40, 31, TOLO, 32}, + {0x16E60, 31, TOUP, -32}, + {0x1E900, 33, TOLO, 34}, + {0x1E922, 33, TOUP, -34}, diff --git a/lib/ctype/categories.c b/lib/ctype/categories.c new file mode 100644 index 0000000..a8de1f1 --- /dev/null +++ b/lib/ctype/categories.c @@ -0,0 +1,40 @@ +#include +#include +#include "categories.h" + +struct _category { + enum category cat: 8; + uint_least32_t first: 24; + uint_least16_t delta; +} __attribute__((packed)); + +static const struct _category categories[] = { +#include "categories.t" +}; + +static enum category +bisearch_cat(wint_t ucs, const struct _category *table, int max) +{ + int min = 0; + int mid; + + if (ucs < table[0].first || ucs > table[max].first + table[max].delta) + return -1; + while (max >= min) + { + mid = (min + max) / 2; + if (ucs > table[mid].first + table[mid].delta) + min = mid + 1; + else if (ucs < table[mid].first) + max = mid - 1; + else + return table[mid].cat; + } + return -1; +} + +enum category category(wint_t ucs) +{ + return bisearch_cat(ucs, categories, + sizeof(categories) / sizeof(*categories) - 1); +} diff --git a/lib/ctype/categories.cat b/lib/ctype/categories.cat new file mode 100644 index 0000000..cade60a --- /dev/null +++ b/lib/ctype/categories.cat @@ -0,0 +1,29 @@ + CAT_Cc, + CAT_Cf, + CAT_Cs, + CAT_LC, + CAT_Ll, + CAT_Lm, + CAT_Lo, + CAT_Lt, + CAT_Lu, + CAT_Mc, + CAT_Me, + CAT_Mn, + CAT_Nd, + CAT_Nl, + CAT_No, + CAT_Pc, + CAT_Pd, + CAT_Pe, + CAT_Pf, + CAT_Pi, + CAT_Po, + CAT_Ps, + CAT_Sc, + CAT_Sk, + CAT_Sm, + CAT_So, + CAT_Zl, + CAT_Zp, + CAT_Zs, diff --git a/lib/ctype/categories.h b/lib/ctype/categories.h new file mode 100644 index 0000000..271038e --- /dev/null +++ b/lib/ctype/categories.h @@ -0,0 +1,7 @@ +/* category data */ + +enum category { +#include "categories.cat" +}; + +extern enum category category(wint_t ucs); diff --git a/lib/ctype/categories.t b/lib/ctype/categories.t new file mode 100644 index 0000000..4fec4af --- /dev/null +++ b/lib/ctype/categories.t @@ -0,0 +1,2298 @@ + {CAT_Cc, 0x0000, 31}, + {CAT_Zs, 0x0020, 0}, + {CAT_Po, 0x0021, 2}, + {CAT_Sc, 0x0024, 0}, + {CAT_Po, 0x0025, 2}, + {CAT_Ps, 0x0028, 0}, + {CAT_Pe, 0x0029, 0}, + {CAT_Po, 0x002A, 0}, + {CAT_Sm, 0x002B, 0}, + {CAT_Po, 0x002C, 0}, + {CAT_Pd, 0x002D, 0}, + {CAT_Po, 0x002E, 1}, + {CAT_Nd, 0x0030, 9}, + {CAT_Po, 0x003A, 1}, + {CAT_Sm, 0x003C, 2}, + {CAT_Po, 0x003F, 1}, + {CAT_LC, 0x0041, 25}, + {CAT_Ps, 0x005B, 0}, + {CAT_Po, 0x005C, 0}, + {CAT_Pe, 0x005D, 0}, + {CAT_Sk, 0x005E, 0}, + {CAT_Pc, 0x005F, 0}, + {CAT_Sk, 0x0060, 0}, + {CAT_LC, 0x0061, 25}, + {CAT_Ps, 0x007B, 0}, + {CAT_Sm, 0x007C, 0}, + {CAT_Pe, 0x007D, 0}, + {CAT_Sm, 0x007E, 0}, + {CAT_Cc, 0x007F, 32}, + {CAT_Zs, 0x00A0, 0}, + {CAT_Po, 0x00A1, 0}, + {CAT_Sc, 0x00A2, 3}, + {CAT_So, 0x00A6, 0}, + {CAT_Po, 0x00A7, 0}, + {CAT_Sk, 0x00A8, 0}, + {CAT_So, 0x00A9, 0}, + {CAT_Lo, 0x00AA, 0}, + {CAT_Pi, 0x00AB, 0}, + {CAT_Sm, 0x00AC, 0}, + {CAT_Cf, 0x00AD, 0}, + {CAT_So, 0x00AE, 0}, + {CAT_Sk, 0x00AF, 0}, + {CAT_So, 0x00B0, 0}, + {CAT_Sm, 0x00B1, 0}, + {CAT_No, 0x00B2, 1}, + {CAT_Sk, 0x00B4, 0}, + {CAT_LC, 0x00B5, 0}, + {CAT_Po, 0x00B6, 1}, + {CAT_Sk, 0x00B8, 0}, + {CAT_No, 0x00B9, 0}, + {CAT_Lo, 0x00BA, 0}, + {CAT_Pf, 0x00BB, 0}, + {CAT_No, 0x00BC, 2}, + {CAT_Po, 0x00BF, 0}, + {CAT_LC, 0x00C0, 22}, + {CAT_Sm, 0x00D7, 0}, + {CAT_LC, 0x00D8, 6}, + {CAT_Ll, 0x00DF, 0}, + {CAT_LC, 0x00E0, 22}, + {CAT_Sm, 0x00F7, 0}, + {CAT_LC, 0x00F8, 63}, + {CAT_Ll, 0x0138, 0}, + {CAT_LC, 0x0139, 15}, + {CAT_Ll, 0x0149, 0}, + {CAT_LC, 0x014A, 66}, + {CAT_Ll, 0x018D, 0}, + {CAT_LC, 0x018E, 12}, + {CAT_Ll, 0x019B, 0}, + {CAT_LC, 0x019C, 13}, + {CAT_Ll, 0x01AA, 1}, + {CAT_LC, 0x01AC, 13}, + {CAT_Ll, 0x01BA, 0}, + {CAT_Lo, 0x01BB, 0}, + {CAT_LC, 0x01BC, 1}, + {CAT_Ll, 0x01BE, 0}, + {CAT_LC, 0x01BF, 0}, + {CAT_Lo, 0x01C0, 3}, + {CAT_LC, 0x01C4, 0}, + {CAT_Lt, 0x01C5, 0}, + {CAT_LC, 0x01C6, 1}, + {CAT_Lt, 0x01C8, 0}, + {CAT_LC, 0x01C9, 1}, + {CAT_Lt, 0x01CB, 0}, + {CAT_LC, 0x01CC, 35}, + {CAT_Ll, 0x01F0, 0}, + {CAT_LC, 0x01F1, 0}, + {CAT_Lt, 0x01F2, 0}, + {CAT_LC, 0x01F3, 45}, + {CAT_Ll, 0x0221, 0}, + {CAT_LC, 0x0222, 17}, + {CAT_Ll, 0x0234, 5}, + {CAT_LC, 0x023A, 26}, + {CAT_Ll, 0x0255, 0}, + {CAT_LC, 0x0256, 1}, + {CAT_Ll, 0x0258, 0}, + {CAT_LC, 0x0259, 0}, + {CAT_Ll, 0x025A, 0}, + {CAT_LC, 0x025B, 1}, + {CAT_Ll, 0x025D, 2}, + {CAT_LC, 0x0260, 1}, + {CAT_Ll, 0x0262, 0}, + {CAT_LC, 0x0263, 0}, + {CAT_Ll, 0x0264, 0}, + {CAT_LC, 0x0265, 1}, + {CAT_Ll, 0x0267, 0}, + {CAT_LC, 0x0268, 4}, + {CAT_Ll, 0x026D, 1}, + {CAT_LC, 0x026F, 0}, + {CAT_Ll, 0x0270, 0}, + {CAT_LC, 0x0271, 1}, + {CAT_Ll, 0x0273, 1}, + {CAT_LC, 0x0275, 0}, + {CAT_Ll, 0x0276, 6}, + {CAT_LC, 0x027D, 0}, + {CAT_Ll, 0x027E, 1}, + {CAT_LC, 0x0280, 0}, + {CAT_Ll, 0x0281, 0}, + {CAT_LC, 0x0282, 1}, + {CAT_Ll, 0x0284, 2}, + {CAT_LC, 0x0287, 5}, + {CAT_Ll, 0x028D, 4}, + {CAT_LC, 0x0292, 0}, + {CAT_Ll, 0x0293, 0}, + {CAT_Lo, 0x0294, 0}, + {CAT_Ll, 0x0295, 7}, + {CAT_LC, 0x029D, 1}, + {CAT_Ll, 0x029F, 16}, + {CAT_Lm, 0x02B0, 17}, + {CAT_Sk, 0x02C2, 3}, + {CAT_Lm, 0x02C6, 11}, + {CAT_Sk, 0x02D2, 13}, + {CAT_Lm, 0x02E0, 4}, + {CAT_Sk, 0x02E5, 6}, + {CAT_Lm, 0x02EC, 0}, + {CAT_Sk, 0x02ED, 0}, + {CAT_Lm, 0x02EE, 0}, + {CAT_Sk, 0x02EF, 16}, + {CAT_Mn, 0x0300, 111}, + {CAT_LC, 0x0370, 3}, + {CAT_Lm, 0x0374, 0}, + {CAT_Sk, 0x0375, 0}, + {CAT_LC, 0x0376, 1}, + {CAT_Lm, 0x037A, 0}, + {CAT_LC, 0x037B, 2}, + {CAT_Po, 0x037E, 0}, + {CAT_LC, 0x037F, 0}, + {CAT_Sk, 0x0384, 1}, + {CAT_LC, 0x0386, 0}, + {CAT_Po, 0x0387, 0}, + {CAT_LC, 0x0388, 2}, + {CAT_LC, 0x038C, 0}, + {CAT_LC, 0x038E, 1}, + {CAT_Ll, 0x0390, 0}, + {CAT_LC, 0x0391, 16}, + {CAT_LC, 0x03A3, 12}, + {CAT_Ll, 0x03B0, 0}, + {CAT_LC, 0x03B1, 32}, + {CAT_Lu, 0x03D2, 2}, + {CAT_LC, 0x03D5, 32}, + {CAT_Sm, 0x03F6, 0}, + {CAT_LC, 0x03F7, 4}, + {CAT_Ll, 0x03FC, 0}, + {CAT_LC, 0x03FD, 132}, + {CAT_So, 0x0482, 0}, + {CAT_Mn, 0x0483, 4}, + {CAT_Me, 0x0488, 1}, + {CAT_LC, 0x048A, 165}, + {CAT_LC, 0x0531, 37}, + {CAT_Lm, 0x0559, 0}, + {CAT_Po, 0x055A, 5}, + {CAT_Ll, 0x0560, 0}, + {CAT_LC, 0x0561, 37}, + {CAT_Ll, 0x0587, 1}, + {CAT_Po, 0x0589, 0}, + {CAT_Pd, 0x058A, 0}, + {CAT_So, 0x058D, 1}, + {CAT_Sc, 0x058F, 0}, + {CAT_Mn, 0x0591, 44}, + {CAT_Pd, 0x05BE, 0}, + {CAT_Mn, 0x05BF, 0}, + {CAT_Po, 0x05C0, 0}, + {CAT_Mn, 0x05C1, 1}, + {CAT_Po, 0x05C3, 0}, + {CAT_Mn, 0x05C4, 1}, + {CAT_Po, 0x05C6, 0}, + {CAT_Mn, 0x05C7, 0}, + {CAT_Lo, 0x05D0, 26}, + {CAT_Lo, 0x05EF, 3}, + {CAT_Po, 0x05F3, 1}, + {CAT_Cf, 0x0600, 5}, + {CAT_Sm, 0x0606, 2}, + {CAT_Po, 0x0609, 1}, + {CAT_Sc, 0x060B, 0}, + {CAT_Po, 0x060C, 1}, + {CAT_So, 0x060E, 1}, + {CAT_Mn, 0x0610, 10}, + {CAT_Po, 0x061B, 0}, + {CAT_Cf, 0x061C, 0}, + {CAT_Po, 0x061D, 2}, + {CAT_Lo, 0x0620, 31}, + {CAT_Lm, 0x0640, 0}, + {CAT_Lo, 0x0641, 9}, + {CAT_Mn, 0x064B, 20}, + {CAT_Nd, 0x0660, 9}, + {CAT_Po, 0x066A, 3}, + {CAT_Lo, 0x066E, 1}, + {CAT_Mn, 0x0670, 0}, + {CAT_Lo, 0x0671, 98}, + {CAT_Po, 0x06D4, 0}, + {CAT_Lo, 0x06D5, 0}, + {CAT_Mn, 0x06D6, 6}, + {CAT_Cf, 0x06DD, 0}, + {CAT_So, 0x06DE, 0}, + {CAT_Mn, 0x06DF, 5}, + {CAT_Lm, 0x06E5, 1}, + {CAT_Mn, 0x06E7, 1}, + {CAT_So, 0x06E9, 0}, + {CAT_Mn, 0x06EA, 3}, + {CAT_Lo, 0x06EE, 1}, + {CAT_Nd, 0x06F0, 9}, + {CAT_Lo, 0x06FA, 2}, + {CAT_So, 0x06FD, 1}, + {CAT_Lo, 0x06FF, 0}, + {CAT_Po, 0x0700, 13}, + {CAT_Cf, 0x070F, 0}, + {CAT_Lo, 0x0710, 0}, + {CAT_Mn, 0x0711, 0}, + {CAT_Lo, 0x0712, 29}, + {CAT_Mn, 0x0730, 26}, + {CAT_Lo, 0x074D, 88}, + {CAT_Mn, 0x07A6, 10}, + {CAT_Lo, 0x07B1, 0}, + {CAT_Nd, 0x07C0, 9}, + {CAT_Lo, 0x07CA, 32}, + {CAT_Mn, 0x07EB, 8}, + {CAT_Lm, 0x07F4, 1}, + {CAT_So, 0x07F6, 0}, + {CAT_Po, 0x07F7, 2}, + {CAT_Lm, 0x07FA, 0}, + {CAT_Mn, 0x07FD, 0}, + {CAT_Sc, 0x07FE, 1}, + {CAT_Lo, 0x0800, 21}, + {CAT_Mn, 0x0816, 3}, + {CAT_Lm, 0x081A, 0}, + {CAT_Mn, 0x081B, 8}, + {CAT_Lm, 0x0824, 0}, + {CAT_Mn, 0x0825, 2}, + {CAT_Lm, 0x0828, 0}, + {CAT_Mn, 0x0829, 4}, + {CAT_Po, 0x0830, 14}, + {CAT_Lo, 0x0840, 24}, + {CAT_Mn, 0x0859, 2}, + {CAT_Po, 0x085E, 0}, + {CAT_Lo, 0x0860, 10}, + {CAT_Lo, 0x0870, 23}, + {CAT_Sk, 0x0888, 0}, + {CAT_Lo, 0x0889, 5}, + {CAT_Cf, 0x0890, 1}, + {CAT_Mn, 0x0898, 7}, + {CAT_Lo, 0x08A0, 40}, + {CAT_Lm, 0x08C9, 0}, + {CAT_Mn, 0x08CA, 23}, + {CAT_Cf, 0x08E2, 0}, + {CAT_Mn, 0x08E3, 31}, + {CAT_Mc, 0x0903, 0}, + {CAT_Lo, 0x0904, 53}, + {CAT_Mn, 0x093A, 0}, + {CAT_Mc, 0x093B, 0}, + {CAT_Mn, 0x093C, 0}, + {CAT_Lo, 0x093D, 0}, + {CAT_Mc, 0x093E, 2}, + {CAT_Mn, 0x0941, 7}, + {CAT_Mc, 0x0949, 3}, + {CAT_Mn, 0x094D, 0}, + {CAT_Mc, 0x094E, 1}, + {CAT_Lo, 0x0950, 0}, + {CAT_Mn, 0x0951, 6}, + {CAT_Lo, 0x0958, 9}, + {CAT_Mn, 0x0962, 1}, + {CAT_Po, 0x0964, 1}, + {CAT_Nd, 0x0966, 9}, + {CAT_Po, 0x0970, 0}, + {CAT_Lm, 0x0971, 0}, + {CAT_Lo, 0x0972, 14}, + {CAT_Mn, 0x0981, 0}, + {CAT_Mc, 0x0982, 1}, + {CAT_Lo, 0x0985, 7}, + {CAT_Lo, 0x098F, 1}, + {CAT_Lo, 0x0993, 21}, + {CAT_Lo, 0x09AA, 6}, + {CAT_Lo, 0x09B2, 0}, + {CAT_Lo, 0x09B6, 3}, + {CAT_Mn, 0x09BC, 0}, + {CAT_Lo, 0x09BD, 0}, + {CAT_Mc, 0x09BE, 2}, + {CAT_Mn, 0x09C1, 3}, + {CAT_Mc, 0x09C7, 1}, + {CAT_Mc, 0x09CB, 1}, + {CAT_Mn, 0x09CD, 0}, + {CAT_Lo, 0x09CE, 0}, + {CAT_Mc, 0x09D7, 0}, + {CAT_Lo, 0x09DC, 1}, + {CAT_Lo, 0x09DF, 2}, + {CAT_Mn, 0x09E2, 1}, + {CAT_Nd, 0x09E6, 9}, + {CAT_Lo, 0x09F0, 1}, + {CAT_Sc, 0x09F2, 1}, + {CAT_No, 0x09F4, 5}, + {CAT_So, 0x09FA, 0}, + {CAT_Sc, 0x09FB, 0}, + {CAT_Lo, 0x09FC, 0}, + {CAT_Po, 0x09FD, 0}, + {CAT_Mn, 0x09FE, 0}, + {CAT_Mn, 0x0A01, 1}, + {CAT_Mc, 0x0A03, 0}, + {CAT_Lo, 0x0A05, 5}, + {CAT_Lo, 0x0A0F, 1}, + {CAT_Lo, 0x0A13, 21}, + {CAT_Lo, 0x0A2A, 6}, + {CAT_Lo, 0x0A32, 1}, + {CAT_Lo, 0x0A35, 1}, + {CAT_Lo, 0x0A38, 1}, + {CAT_Mn, 0x0A3C, 0}, + {CAT_Mc, 0x0A3E, 2}, + {CAT_Mn, 0x0A41, 1}, + {CAT_Mn, 0x0A47, 1}, + {CAT_Mn, 0x0A4B, 2}, + {CAT_Mn, 0x0A51, 0}, + {CAT_Lo, 0x0A59, 3}, + {CAT_Lo, 0x0A5E, 0}, + {CAT_Nd, 0x0A66, 9}, + {CAT_Mn, 0x0A70, 1}, + {CAT_Lo, 0x0A72, 2}, + {CAT_Mn, 0x0A75, 0}, + {CAT_Po, 0x0A76, 0}, + {CAT_Mn, 0x0A81, 1}, + {CAT_Mc, 0x0A83, 0}, + {CAT_Lo, 0x0A85, 8}, + {CAT_Lo, 0x0A8F, 2}, + {CAT_Lo, 0x0A93, 21}, + {CAT_Lo, 0x0AAA, 6}, + {CAT_Lo, 0x0AB2, 1}, + {CAT_Lo, 0x0AB5, 4}, + {CAT_Mn, 0x0ABC, 0}, + {CAT_Lo, 0x0ABD, 0}, + {CAT_Mc, 0x0ABE, 2}, + {CAT_Mn, 0x0AC1, 4}, + {CAT_Mn, 0x0AC7, 1}, + {CAT_Mc, 0x0AC9, 0}, + {CAT_Mc, 0x0ACB, 1}, + {CAT_Mn, 0x0ACD, 0}, + {CAT_Lo, 0x0AD0, 0}, + {CAT_Lo, 0x0AE0, 1}, + {CAT_Mn, 0x0AE2, 1}, + {CAT_Nd, 0x0AE6, 9}, + {CAT_Po, 0x0AF0, 0}, + {CAT_Sc, 0x0AF1, 0}, + {CAT_Lo, 0x0AF9, 0}, + {CAT_Mn, 0x0AFA, 5}, + {CAT_Mn, 0x0B01, 0}, + {CAT_Mc, 0x0B02, 1}, + {CAT_Lo, 0x0B05, 7}, + {CAT_Lo, 0x0B0F, 1}, + {CAT_Lo, 0x0B13, 21}, + {CAT_Lo, 0x0B2A, 6}, + {CAT_Lo, 0x0B32, 1}, + {CAT_Lo, 0x0B35, 4}, + {CAT_Mn, 0x0B3C, 0}, + {CAT_Lo, 0x0B3D, 0}, + {CAT_Mc, 0x0B3E, 0}, + {CAT_Mn, 0x0B3F, 0}, + {CAT_Mc, 0x0B40, 0}, + {CAT_Mn, 0x0B41, 3}, + {CAT_Mc, 0x0B47, 1}, + {CAT_Mc, 0x0B4B, 1}, + {CAT_Mn, 0x0B4D, 0}, + {CAT_Mn, 0x0B55, 1}, + {CAT_Mc, 0x0B57, 0}, + {CAT_Lo, 0x0B5C, 1}, + {CAT_Lo, 0x0B5F, 2}, + {CAT_Mn, 0x0B62, 1}, + {CAT_Nd, 0x0B66, 9}, + {CAT_So, 0x0B70, 0}, + {CAT_Lo, 0x0B71, 0}, + {CAT_No, 0x0B72, 5}, + {CAT_Mn, 0x0B82, 0}, + {CAT_Lo, 0x0B83, 0}, + {CAT_Lo, 0x0B85, 5}, + {CAT_Lo, 0x0B8E, 2}, + {CAT_Lo, 0x0B92, 3}, + {CAT_Lo, 0x0B99, 1}, + {CAT_Lo, 0x0B9C, 0}, + {CAT_Lo, 0x0B9E, 1}, + {CAT_Lo, 0x0BA3, 1}, + {CAT_Lo, 0x0BA8, 2}, + {CAT_Lo, 0x0BAE, 11}, + {CAT_Mc, 0x0BBE, 1}, + {CAT_Mn, 0x0BC0, 0}, + {CAT_Mc, 0x0BC1, 1}, + {CAT_Mc, 0x0BC6, 2}, + {CAT_Mc, 0x0BCA, 2}, + {CAT_Mn, 0x0BCD, 0}, + {CAT_Lo, 0x0BD0, 0}, + {CAT_Mc, 0x0BD7, 0}, + {CAT_Nd, 0x0BE6, 9}, + {CAT_No, 0x0BF0, 2}, + {CAT_So, 0x0BF3, 5}, + {CAT_Sc, 0x0BF9, 0}, + {CAT_So, 0x0BFA, 0}, + {CAT_Mn, 0x0C00, 0}, + {CAT_Mc, 0x0C01, 2}, + {CAT_Mn, 0x0C04, 0}, + {CAT_Lo, 0x0C05, 7}, + {CAT_Lo, 0x0C0E, 2}, + {CAT_Lo, 0x0C12, 22}, + {CAT_Lo, 0x0C2A, 15}, + {CAT_Mn, 0x0C3C, 0}, + {CAT_Lo, 0x0C3D, 0}, + {CAT_Mn, 0x0C3E, 2}, + {CAT_Mc, 0x0C41, 3}, + {CAT_Mn, 0x0C46, 2}, + {CAT_Mn, 0x0C4A, 3}, + {CAT_Mn, 0x0C55, 1}, + {CAT_Lo, 0x0C58, 2}, + {CAT_Lo, 0x0C5D, 0}, + {CAT_Lo, 0x0C60, 1}, + {CAT_Mn, 0x0C62, 1}, + {CAT_Nd, 0x0C66, 9}, + {CAT_Po, 0x0C77, 0}, + {CAT_No, 0x0C78, 6}, + {CAT_So, 0x0C7F, 0}, + {CAT_Lo, 0x0C80, 0}, + {CAT_Mn, 0x0C81, 0}, + {CAT_Mc, 0x0C82, 1}, + {CAT_Po, 0x0C84, 0}, + {CAT_Lo, 0x0C85, 7}, + {CAT_Lo, 0x0C8E, 2}, + {CAT_Lo, 0x0C92, 22}, + {CAT_Lo, 0x0CAA, 9}, + {CAT_Lo, 0x0CB5, 4}, + {CAT_Mn, 0x0CBC, 0}, + {CAT_Lo, 0x0CBD, 0}, + {CAT_Mc, 0x0CBE, 0}, + {CAT_Mn, 0x0CBF, 0}, + {CAT_Mc, 0x0CC0, 4}, + {CAT_Mn, 0x0CC6, 0}, + {CAT_Mc, 0x0CC7, 1}, + {CAT_Mc, 0x0CCA, 1}, + {CAT_Mn, 0x0CCC, 1}, + {CAT_Mc, 0x0CD5, 1}, + {CAT_Lo, 0x0CDD, 1}, + {CAT_Lo, 0x0CE0, 1}, + {CAT_Mn, 0x0CE2, 1}, + {CAT_Nd, 0x0CE6, 9}, + {CAT_Lo, 0x0CF1, 1}, + {CAT_Mc, 0x0CF3, 0}, + {CAT_Mn, 0x0D00, 1}, + {CAT_Mc, 0x0D02, 1}, + {CAT_Lo, 0x0D04, 8}, + {CAT_Lo, 0x0D0E, 2}, + {CAT_Lo, 0x0D12, 40}, + {CAT_Mn, 0x0D3B, 1}, + {CAT_Lo, 0x0D3D, 0}, + {CAT_Mc, 0x0D3E, 2}, + {CAT_Mn, 0x0D41, 3}, + {CAT_Mc, 0x0D46, 2}, + {CAT_Mc, 0x0D4A, 2}, + {CAT_Mn, 0x0D4D, 0}, + {CAT_Lo, 0x0D4E, 0}, + {CAT_So, 0x0D4F, 0}, + {CAT_Lo, 0x0D54, 2}, + {CAT_Mc, 0x0D57, 0}, + {CAT_No, 0x0D58, 6}, + {CAT_Lo, 0x0D5F, 2}, + {CAT_Mn, 0x0D62, 1}, + {CAT_Nd, 0x0D66, 9}, + {CAT_No, 0x0D70, 8}, + {CAT_So, 0x0D79, 0}, + {CAT_Lo, 0x0D7A, 5}, + {CAT_Mn, 0x0D81, 0}, + {CAT_Mc, 0x0D82, 1}, + {CAT_Lo, 0x0D85, 17}, + {CAT_Lo, 0x0D9A, 23}, + {CAT_Lo, 0x0DB3, 8}, + {CAT_Lo, 0x0DBD, 0}, + {CAT_Lo, 0x0DC0, 6}, + {CAT_Mn, 0x0DCA, 0}, + {CAT_Mc, 0x0DCF, 2}, + {CAT_Mn, 0x0DD2, 2}, + {CAT_Mn, 0x0DD6, 0}, + {CAT_Mc, 0x0DD8, 7}, + {CAT_Nd, 0x0DE6, 9}, + {CAT_Mc, 0x0DF2, 1}, + {CAT_Po, 0x0DF4, 0}, + {CAT_Lo, 0x0E01, 47}, + {CAT_Mn, 0x0E31, 0}, + {CAT_Lo, 0x0E32, 1}, + {CAT_Mn, 0x0E34, 6}, + {CAT_Sc, 0x0E3F, 0}, + {CAT_Lo, 0x0E40, 5}, + {CAT_Lm, 0x0E46, 0}, + {CAT_Mn, 0x0E47, 7}, + {CAT_Po, 0x0E4F, 0}, + {CAT_Nd, 0x0E50, 9}, + {CAT_Po, 0x0E5A, 1}, + {CAT_Lo, 0x0E81, 1}, + {CAT_Lo, 0x0E84, 0}, + {CAT_Lo, 0x0E86, 4}, + {CAT_Lo, 0x0E8C, 23}, + {CAT_Lo, 0x0EA5, 0}, + {CAT_Lo, 0x0EA7, 9}, + {CAT_Mn, 0x0EB1, 0}, + {CAT_Lo, 0x0EB2, 1}, + {CAT_Mn, 0x0EB4, 8}, + {CAT_Lo, 0x0EBD, 0}, + {CAT_Lo, 0x0EC0, 4}, + {CAT_Lm, 0x0EC6, 0}, + {CAT_Mn, 0x0EC8, 6}, + {CAT_Nd, 0x0ED0, 9}, + {CAT_Lo, 0x0EDC, 3}, + {CAT_Lo, 0x0F00, 0}, + {CAT_So, 0x0F01, 2}, + {CAT_Po, 0x0F04, 14}, + {CAT_So, 0x0F13, 0}, + {CAT_Po, 0x0F14, 0}, + {CAT_So, 0x0F15, 2}, + {CAT_Mn, 0x0F18, 1}, + {CAT_So, 0x0F1A, 5}, + {CAT_Nd, 0x0F20, 9}, + {CAT_No, 0x0F2A, 9}, + {CAT_So, 0x0F34, 0}, + {CAT_Mn, 0x0F35, 0}, + {CAT_So, 0x0F36, 0}, + {CAT_Mn, 0x0F37, 0}, + {CAT_So, 0x0F38, 0}, + {CAT_Mn, 0x0F39, 0}, + {CAT_Ps, 0x0F3A, 0}, + {CAT_Pe, 0x0F3B, 0}, + {CAT_Ps, 0x0F3C, 0}, + {CAT_Pe, 0x0F3D, 0}, + {CAT_Mc, 0x0F3E, 1}, + {CAT_Lo, 0x0F40, 7}, + {CAT_Lo, 0x0F49, 35}, + {CAT_Mn, 0x0F71, 13}, + {CAT_Mc, 0x0F7F, 0}, + {CAT_Mn, 0x0F80, 4}, + {CAT_Po, 0x0F85, 0}, + {CAT_Mn, 0x0F86, 1}, + {CAT_Lo, 0x0F88, 4}, + {CAT_Mn, 0x0F8D, 10}, + {CAT_Mn, 0x0F99, 35}, + {CAT_So, 0x0FBE, 7}, + {CAT_Mn, 0x0FC6, 0}, + {CAT_So, 0x0FC7, 5}, + {CAT_So, 0x0FCE, 1}, + {CAT_Po, 0x0FD0, 4}, + {CAT_So, 0x0FD5, 3}, + {CAT_Po, 0x0FD9, 1}, + {CAT_Lo, 0x1000, 42}, + {CAT_Mc, 0x102B, 1}, + {CAT_Mn, 0x102D, 3}, + {CAT_Mc, 0x1031, 0}, + {CAT_Mn, 0x1032, 5}, + {CAT_Mc, 0x1038, 0}, + {CAT_Mn, 0x1039, 1}, + {CAT_Mc, 0x103B, 1}, + {CAT_Mn, 0x103D, 1}, + {CAT_Lo, 0x103F, 0}, + {CAT_Nd, 0x1040, 9}, + {CAT_Po, 0x104A, 5}, + {CAT_Lo, 0x1050, 5}, + {CAT_Mc, 0x1056, 1}, + {CAT_Mn, 0x1058, 1}, + {CAT_Lo, 0x105A, 3}, + {CAT_Mn, 0x105E, 2}, + {CAT_Lo, 0x1061, 0}, + {CAT_Mc, 0x1062, 2}, + {CAT_Lo, 0x1065, 1}, + {CAT_Mc, 0x1067, 6}, + {CAT_Lo, 0x106E, 2}, + {CAT_Mn, 0x1071, 3}, + {CAT_Lo, 0x1075, 12}, + {CAT_Mn, 0x1082, 0}, + {CAT_Mc, 0x1083, 1}, + {CAT_Mn, 0x1085, 1}, + {CAT_Mc, 0x1087, 5}, + {CAT_Mn, 0x108D, 0}, + {CAT_Lo, 0x108E, 0}, + {CAT_Mc, 0x108F, 0}, + {CAT_Nd, 0x1090, 9}, + {CAT_Mc, 0x109A, 2}, + {CAT_Mn, 0x109D, 0}, + {CAT_So, 0x109E, 1}, + {CAT_LC, 0x10A0, 37}, + {CAT_LC, 0x10C7, 0}, + {CAT_LC, 0x10CD, 0}, + {CAT_LC, 0x10D0, 42}, + {CAT_Po, 0x10FB, 0}, + {CAT_Lm, 0x10FC, 0}, + {CAT_LC, 0x10FD, 2}, + {CAT_Lo, 0x1100, 328}, + {CAT_Lo, 0x124A, 3}, + {CAT_Lo, 0x1250, 6}, + {CAT_Lo, 0x1258, 0}, + {CAT_Lo, 0x125A, 3}, + {CAT_Lo, 0x1260, 40}, + {CAT_Lo, 0x128A, 3}, + {CAT_Lo, 0x1290, 32}, + {CAT_Lo, 0x12B2, 3}, + {CAT_Lo, 0x12B8, 6}, + {CAT_Lo, 0x12C0, 0}, + {CAT_Lo, 0x12C2, 3}, + {CAT_Lo, 0x12C8, 14}, + {CAT_Lo, 0x12D8, 56}, + {CAT_Lo, 0x1312, 3}, + {CAT_Lo, 0x1318, 66}, + {CAT_Mn, 0x135D, 2}, + {CAT_Po, 0x1360, 8}, + {CAT_No, 0x1369, 19}, + {CAT_Lo, 0x1380, 15}, + {CAT_So, 0x1390, 9}, + {CAT_LC, 0x13A0, 85}, + {CAT_LC, 0x13F8, 5}, + {CAT_Pd, 0x1400, 0}, + {CAT_Lo, 0x1401, 619}, + {CAT_So, 0x166D, 0}, + {CAT_Po, 0x166E, 0}, + {CAT_Lo, 0x166F, 16}, + {CAT_Zs, 0x1680, 0}, + {CAT_Lo, 0x1681, 25}, + {CAT_Ps, 0x169B, 0}, + {CAT_Pe, 0x169C, 0}, + {CAT_Lo, 0x16A0, 74}, + {CAT_Po, 0x16EB, 2}, + {CAT_Nl, 0x16EE, 2}, + {CAT_Lo, 0x16F1, 7}, + {CAT_Lo, 0x1700, 17}, + {CAT_Mn, 0x1712, 2}, + {CAT_Mc, 0x1715, 0}, + {CAT_Lo, 0x171F, 18}, + {CAT_Mn, 0x1732, 1}, + {CAT_Mc, 0x1734, 0}, + {CAT_Po, 0x1735, 1}, + {CAT_Lo, 0x1740, 17}, + {CAT_Mn, 0x1752, 1}, + {CAT_Lo, 0x1760, 12}, + {CAT_Lo, 0x176E, 2}, + {CAT_Mn, 0x1772, 1}, + {CAT_Lo, 0x1780, 51}, + {CAT_Mn, 0x17B4, 1}, + {CAT_Mc, 0x17B6, 0}, + {CAT_Mn, 0x17B7, 6}, + {CAT_Mc, 0x17BE, 7}, + {CAT_Mn, 0x17C6, 0}, + {CAT_Mc, 0x17C7, 1}, + {CAT_Mn, 0x17C9, 10}, + {CAT_Po, 0x17D4, 2}, + {CAT_Lm, 0x17D7, 0}, + {CAT_Po, 0x17D8, 2}, + {CAT_Sc, 0x17DB, 0}, + {CAT_Lo, 0x17DC, 0}, + {CAT_Mn, 0x17DD, 0}, + {CAT_Nd, 0x17E0, 9}, + {CAT_No, 0x17F0, 9}, + {CAT_Po, 0x1800, 5}, + {CAT_Pd, 0x1806, 0}, + {CAT_Po, 0x1807, 3}, + {CAT_Mn, 0x180B, 2}, + {CAT_Cf, 0x180E, 0}, + {CAT_Mn, 0x180F, 0}, + {CAT_Nd, 0x1810, 9}, + {CAT_Lo, 0x1820, 34}, + {CAT_Lm, 0x1843, 0}, + {CAT_Lo, 0x1844, 52}, + {CAT_Lo, 0x1880, 4}, + {CAT_Mn, 0x1885, 1}, + {CAT_Lo, 0x1887, 33}, + {CAT_Mn, 0x18A9, 0}, + {CAT_Lo, 0x18AA, 0}, + {CAT_Lo, 0x18B0, 69}, + {CAT_Lo, 0x1900, 30}, + {CAT_Mn, 0x1920, 2}, + {CAT_Mc, 0x1923, 3}, + {CAT_Mn, 0x1927, 1}, + {CAT_Mc, 0x1929, 2}, + {CAT_Mc, 0x1930, 1}, + {CAT_Mn, 0x1932, 0}, + {CAT_Mc, 0x1933, 5}, + {CAT_Mn, 0x1939, 2}, + {CAT_So, 0x1940, 0}, + {CAT_Po, 0x1944, 1}, + {CAT_Nd, 0x1946, 9}, + {CAT_Lo, 0x1950, 29}, + {CAT_Lo, 0x1970, 4}, + {CAT_Lo, 0x1980, 43}, + {CAT_Lo, 0x19B0, 25}, + {CAT_Nd, 0x19D0, 9}, + {CAT_No, 0x19DA, 0}, + {CAT_So, 0x19DE, 33}, + {CAT_Lo, 0x1A00, 22}, + {CAT_Mn, 0x1A17, 1}, + {CAT_Mc, 0x1A19, 1}, + {CAT_Mn, 0x1A1B, 0}, + {CAT_Po, 0x1A1E, 1}, + {CAT_Lo, 0x1A20, 52}, + {CAT_Mc, 0x1A55, 0}, + {CAT_Mn, 0x1A56, 0}, + {CAT_Mc, 0x1A57, 0}, + {CAT_Mn, 0x1A58, 6}, + {CAT_Mn, 0x1A60, 0}, + {CAT_Mc, 0x1A61, 0}, + {CAT_Mn, 0x1A62, 0}, + {CAT_Mc, 0x1A63, 1}, + {CAT_Mn, 0x1A65, 7}, + {CAT_Mc, 0x1A6D, 5}, + {CAT_Mn, 0x1A73, 9}, + {CAT_Mn, 0x1A7F, 0}, + {CAT_Nd, 0x1A80, 9}, + {CAT_Nd, 0x1A90, 9}, + {CAT_Po, 0x1AA0, 6}, + {CAT_Lm, 0x1AA7, 0}, + {CAT_Po, 0x1AA8, 5}, + {CAT_Mn, 0x1AB0, 13}, + {CAT_Me, 0x1ABE, 0}, + {CAT_Mn, 0x1ABF, 15}, + {CAT_Mn, 0x1B00, 3}, + {CAT_Mc, 0x1B04, 0}, + {CAT_Lo, 0x1B05, 46}, + {CAT_Mn, 0x1B34, 0}, + {CAT_Mc, 0x1B35, 0}, + {CAT_Mn, 0x1B36, 4}, + {CAT_Mc, 0x1B3B, 0}, + {CAT_Mn, 0x1B3C, 0}, + {CAT_Mc, 0x1B3D, 4}, + {CAT_Mn, 0x1B42, 0}, + {CAT_Mc, 0x1B43, 1}, + {CAT_Lo, 0x1B45, 7}, + {CAT_Nd, 0x1B50, 9}, + {CAT_Po, 0x1B5A, 6}, + {CAT_So, 0x1B61, 9}, + {CAT_Mn, 0x1B6B, 8}, + {CAT_So, 0x1B74, 8}, + {CAT_Po, 0x1B7D, 1}, + {CAT_Mn, 0x1B80, 1}, + {CAT_Mc, 0x1B82, 0}, + {CAT_Lo, 0x1B83, 29}, + {CAT_Mc, 0x1BA1, 0}, + {CAT_Mn, 0x1BA2, 3}, + {CAT_Mc, 0x1BA6, 1}, + {CAT_Mn, 0x1BA8, 1}, + {CAT_Mc, 0x1BAA, 0}, + {CAT_Mn, 0x1BAB, 2}, + {CAT_Lo, 0x1BAE, 1}, + {CAT_Nd, 0x1BB0, 9}, + {CAT_Lo, 0x1BBA, 43}, + {CAT_Mn, 0x1BE6, 0}, + {CAT_Mc, 0x1BE7, 0}, + {CAT_Mn, 0x1BE8, 1}, + {CAT_Mc, 0x1BEA, 2}, + {CAT_Mn, 0x1BED, 0}, + {CAT_Mc, 0x1BEE, 0}, + {CAT_Mn, 0x1BEF, 2}, + {CAT_Mc, 0x1BF2, 1}, + {CAT_Po, 0x1BFC, 3}, + {CAT_Lo, 0x1C00, 35}, + {CAT_Mc, 0x1C24, 7}, + {CAT_Mn, 0x1C2C, 7}, + {CAT_Mc, 0x1C34, 1}, + {CAT_Mn, 0x1C36, 1}, + {CAT_Po, 0x1C3B, 4}, + {CAT_Nd, 0x1C40, 9}, + {CAT_Lo, 0x1C4D, 2}, + {CAT_Nd, 0x1C50, 9}, + {CAT_Lo, 0x1C5A, 29}, + {CAT_Lm, 0x1C78, 5}, + {CAT_Po, 0x1C7E, 1}, + {CAT_LC, 0x1C80, 8}, + {CAT_LC, 0x1C90, 42}, + {CAT_LC, 0x1CBD, 2}, + {CAT_Po, 0x1CC0, 7}, + {CAT_Mn, 0x1CD0, 2}, + {CAT_Po, 0x1CD3, 0}, + {CAT_Mn, 0x1CD4, 12}, + {CAT_Mc, 0x1CE1, 0}, + {CAT_Mn, 0x1CE2, 6}, + {CAT_Lo, 0x1CE9, 3}, + {CAT_Mn, 0x1CED, 0}, + {CAT_Lo, 0x1CEE, 5}, + {CAT_Mn, 0x1CF4, 0}, + {CAT_Lo, 0x1CF5, 1}, + {CAT_Mc, 0x1CF7, 0}, + {CAT_Mn, 0x1CF8, 1}, + {CAT_Lo, 0x1CFA, 0}, + {CAT_Ll, 0x1D00, 43}, + {CAT_Lm, 0x1D2C, 62}, + {CAT_Ll, 0x1D6B, 12}, + {CAT_Lm, 0x1D78, 0}, + {CAT_LC, 0x1D79, 0}, + {CAT_Ll, 0x1D7A, 2}, + {CAT_LC, 0x1D7D, 0}, + {CAT_Ll, 0x1D7E, 15}, + {CAT_LC, 0x1D8E, 0}, + {CAT_Ll, 0x1D8F, 11}, + {CAT_Lm, 0x1D9B, 36}, + {CAT_Mn, 0x1DC0, 63}, + {CAT_LC, 0x1E00, 149}, + {CAT_Ll, 0x1E96, 4}, + {CAT_LC, 0x1E9B, 0}, + {CAT_Ll, 0x1E9C, 1}, + {CAT_LC, 0x1E9E, 0}, + {CAT_Ll, 0x1E9F, 0}, + {CAT_LC, 0x1EA0, 117}, + {CAT_LC, 0x1F18, 5}, + {CAT_LC, 0x1F20, 37}, + {CAT_LC, 0x1F48, 5}, + {CAT_Ll, 0x1F50, 0}, + {CAT_LC, 0x1F51, 0}, + {CAT_Ll, 0x1F52, 0}, + {CAT_LC, 0x1F53, 0}, + {CAT_Ll, 0x1F54, 0}, + {CAT_LC, 0x1F55, 0}, + {CAT_Ll, 0x1F56, 0}, + {CAT_LC, 0x1F57, 0}, + {CAT_LC, 0x1F59, 0}, + {CAT_LC, 0x1F5B, 0}, + {CAT_LC, 0x1F5D, 0}, + {CAT_LC, 0x1F5F, 30}, + {CAT_LC, 0x1F80, 7}, + {CAT_Lt, 0x1F88, 7}, + {CAT_LC, 0x1F90, 7}, + {CAT_Lt, 0x1F98, 7}, + {CAT_LC, 0x1FA0, 7}, + {CAT_Lt, 0x1FA8, 7}, + {CAT_LC, 0x1FB0, 1}, + {CAT_Ll, 0x1FB2, 0}, + {CAT_LC, 0x1FB3, 0}, + {CAT_Ll, 0x1FB4, 0}, + {CAT_Ll, 0x1FB6, 1}, + {CAT_LC, 0x1FB8, 3}, + {CAT_Lt, 0x1FBC, 0}, + {CAT_Sk, 0x1FBD, 0}, + {CAT_LC, 0x1FBE, 0}, + {CAT_Sk, 0x1FBF, 2}, + {CAT_Ll, 0x1FC2, 0}, + {CAT_LC, 0x1FC3, 0}, + {CAT_Ll, 0x1FC4, 0}, + {CAT_Ll, 0x1FC6, 1}, + {CAT_LC, 0x1FC8, 3}, + {CAT_Lt, 0x1FCC, 0}, + {CAT_Sk, 0x1FCD, 2}, + {CAT_LC, 0x1FD0, 1}, + {CAT_Ll, 0x1FD2, 1}, + {CAT_Ll, 0x1FD6, 1}, + {CAT_LC, 0x1FD8, 3}, + {CAT_Sk, 0x1FDD, 2}, + {CAT_LC, 0x1FE0, 1}, + {CAT_Ll, 0x1FE2, 2}, + {CAT_LC, 0x1FE5, 0}, + {CAT_Ll, 0x1FE6, 1}, + {CAT_LC, 0x1FE8, 4}, + {CAT_Sk, 0x1FED, 2}, + {CAT_Ll, 0x1FF2, 0}, + {CAT_LC, 0x1FF3, 0}, + {CAT_Ll, 0x1FF4, 0}, + {CAT_Ll, 0x1FF6, 1}, + {CAT_LC, 0x1FF8, 3}, + {CAT_Lt, 0x1FFC, 0}, + {CAT_Sk, 0x1FFD, 1}, + {CAT_Zs, 0x2000, 10}, + {CAT_Cf, 0x200B, 4}, + {CAT_Pd, 0x2010, 5}, + {CAT_Po, 0x2016, 1}, + {CAT_Pi, 0x2018, 0}, + {CAT_Pf, 0x2019, 0}, + {CAT_Ps, 0x201A, 0}, + {CAT_Pi, 0x201B, 1}, + {CAT_Pf, 0x201D, 0}, + {CAT_Ps, 0x201E, 0}, + {CAT_Pi, 0x201F, 0}, + {CAT_Po, 0x2020, 7}, + {CAT_Zl, 0x2028, 0}, + {CAT_Zp, 0x2029, 0}, + {CAT_Cf, 0x202A, 4}, + {CAT_Zs, 0x202F, 0}, + {CAT_Po, 0x2030, 8}, + {CAT_Pi, 0x2039, 0}, + {CAT_Pf, 0x203A, 0}, + {CAT_Po, 0x203B, 3}, + {CAT_Pc, 0x203F, 1}, + {CAT_Po, 0x2041, 2}, + {CAT_Sm, 0x2044, 0}, + {CAT_Ps, 0x2045, 0}, + {CAT_Pe, 0x2046, 0}, + {CAT_Po, 0x2047, 10}, + {CAT_Sm, 0x2052, 0}, + {CAT_Po, 0x2053, 0}, + {CAT_Pc, 0x2054, 0}, + {CAT_Po, 0x2055, 9}, + {CAT_Zs, 0x205F, 0}, + {CAT_Cf, 0x2060, 4}, + {CAT_Cf, 0x2066, 9}, + {CAT_No, 0x2070, 0}, + {CAT_Lm, 0x2071, 0}, + {CAT_No, 0x2074, 5}, + {CAT_Sm, 0x207A, 2}, + {CAT_Ps, 0x207D, 0}, + {CAT_Pe, 0x207E, 0}, + {CAT_Lm, 0x207F, 0}, + {CAT_No, 0x2080, 9}, + {CAT_Sm, 0x208A, 2}, + {CAT_Ps, 0x208D, 0}, + {CAT_Pe, 0x208E, 0}, + {CAT_Lm, 0x2090, 12}, + {CAT_Sc, 0x20A0, 32}, + {CAT_Mn, 0x20D0, 12}, + {CAT_Me, 0x20DD, 3}, + {CAT_Mn, 0x20E1, 0}, + {CAT_Me, 0x20E2, 2}, + {CAT_Mn, 0x20E5, 11}, + {CAT_So, 0x2100, 1}, + {CAT_Lu, 0x2102, 0}, + {CAT_So, 0x2103, 3}, + {CAT_Lu, 0x2107, 0}, + {CAT_So, 0x2108, 1}, + {CAT_Ll, 0x210A, 0}, + {CAT_Lu, 0x210B, 2}, + {CAT_Ll, 0x210E, 1}, + {CAT_Lu, 0x2110, 2}, + {CAT_Ll, 0x2113, 0}, + {CAT_So, 0x2114, 0}, + {CAT_Lu, 0x2115, 0}, + {CAT_So, 0x2116, 1}, + {CAT_Sm, 0x2118, 0}, + {CAT_Lu, 0x2119, 4}, + {CAT_So, 0x211E, 5}, + {CAT_Lu, 0x2124, 0}, + {CAT_So, 0x2125, 0}, + {CAT_LC, 0x2126, 0}, + {CAT_So, 0x2127, 0}, + {CAT_Lu, 0x2128, 0}, + {CAT_So, 0x2129, 0}, + {CAT_LC, 0x212A, 1}, + {CAT_Lu, 0x212C, 1}, + {CAT_So, 0x212E, 0}, + {CAT_Ll, 0x212F, 0}, + {CAT_Lu, 0x2130, 1}, + {CAT_LC, 0x2132, 0}, + {CAT_Lu, 0x2133, 0}, + {CAT_Ll, 0x2134, 0}, + {CAT_Lo, 0x2135, 3}, + {CAT_Ll, 0x2139, 0}, + {CAT_So, 0x213A, 1}, + {CAT_Ll, 0x213C, 1}, + {CAT_Lu, 0x213E, 1}, + {CAT_Sm, 0x2140, 4}, + {CAT_Lu, 0x2145, 0}, + {CAT_Ll, 0x2146, 3}, + {CAT_So, 0x214A, 0}, + {CAT_Sm, 0x214B, 0}, + {CAT_So, 0x214C, 1}, + {CAT_LC, 0x214E, 0}, + {CAT_So, 0x214F, 0}, + {CAT_No, 0x2150, 15}, + {CAT_Nl, 0x2160, 34}, + {CAT_LC, 0x2183, 1}, + {CAT_Nl, 0x2185, 3}, + {CAT_No, 0x2189, 0}, + {CAT_So, 0x218A, 1}, + {CAT_Sm, 0x2190, 4}, + {CAT_So, 0x2195, 4}, + {CAT_Sm, 0x219A, 1}, + {CAT_So, 0x219C, 3}, + {CAT_Sm, 0x21A0, 0}, + {CAT_So, 0x21A1, 1}, + {CAT_Sm, 0x21A3, 0}, + {CAT_So, 0x21A4, 1}, + {CAT_Sm, 0x21A6, 0}, + {CAT_So, 0x21A7, 6}, + {CAT_Sm, 0x21AE, 0}, + {CAT_So, 0x21AF, 30}, + {CAT_Sm, 0x21CE, 1}, + {CAT_So, 0x21D0, 1}, + {CAT_Sm, 0x21D2, 0}, + {CAT_So, 0x21D3, 0}, + {CAT_Sm, 0x21D4, 0}, + {CAT_So, 0x21D5, 30}, + {CAT_Sm, 0x21F4, 267}, + {CAT_So, 0x2300, 7}, + {CAT_Ps, 0x2308, 0}, + {CAT_Pe, 0x2309, 0}, + {CAT_Ps, 0x230A, 0}, + {CAT_Pe, 0x230B, 0}, + {CAT_So, 0x230C, 19}, + {CAT_Sm, 0x2320, 1}, + {CAT_So, 0x2322, 6}, + {CAT_Ps, 0x2329, 0}, + {CAT_Pe, 0x232A, 0}, + {CAT_So, 0x232B, 80}, + {CAT_Sm, 0x237C, 0}, + {CAT_So, 0x237D, 29}, + {CAT_Sm, 0x239B, 24}, + {CAT_So, 0x23B4, 39}, + {CAT_Sm, 0x23DC, 5}, + {CAT_So, 0x23E2, 68}, + {CAT_So, 0x2440, 10}, + {CAT_No, 0x2460, 59}, + {CAT_So, 0x249C, 77}, + {CAT_No, 0x24EA, 21}, + {CAT_So, 0x2500, 182}, + {CAT_Sm, 0x25B7, 0}, + {CAT_So, 0x25B8, 8}, + {CAT_Sm, 0x25C1, 0}, + {CAT_So, 0x25C2, 53}, + {CAT_Sm, 0x25F8, 7}, + {CAT_So, 0x2600, 110}, + {CAT_Sm, 0x266F, 0}, + {CAT_So, 0x2670, 247}, + {CAT_Ps, 0x2768, 0}, + {CAT_Pe, 0x2769, 0}, + {CAT_Ps, 0x276A, 0}, + {CAT_Pe, 0x276B, 0}, + {CAT_Ps, 0x276C, 0}, + {CAT_Pe, 0x276D, 0}, + {CAT_Ps, 0x276E, 0}, + {CAT_Pe, 0x276F, 0}, + {CAT_Ps, 0x2770, 0}, + {CAT_Pe, 0x2771, 0}, + {CAT_Ps, 0x2772, 0}, + {CAT_Pe, 0x2773, 0}, + {CAT_Ps, 0x2774, 0}, + {CAT_Pe, 0x2775, 0}, + {CAT_No, 0x2776, 29}, + {CAT_So, 0x2794, 43}, + {CAT_Sm, 0x27C0, 4}, + {CAT_Ps, 0x27C5, 0}, + {CAT_Pe, 0x27C6, 0}, + {CAT_Sm, 0x27C7, 30}, + {CAT_Ps, 0x27E6, 0}, + {CAT_Pe, 0x27E7, 0}, + {CAT_Ps, 0x27E8, 0}, + {CAT_Pe, 0x27E9, 0}, + {CAT_Ps, 0x27EA, 0}, + {CAT_Pe, 0x27EB, 0}, + {CAT_Ps, 0x27EC, 0}, + {CAT_Pe, 0x27ED, 0}, + {CAT_Ps, 0x27EE, 0}, + {CAT_Pe, 0x27EF, 0}, + {CAT_Sm, 0x27F0, 15}, + {CAT_So, 0x2800, 255}, + {CAT_Sm, 0x2900, 130}, + {CAT_Ps, 0x2983, 0}, + {CAT_Pe, 0x2984, 0}, + {CAT_Ps, 0x2985, 0}, + {CAT_Pe, 0x2986, 0}, + {CAT_Ps, 0x2987, 0}, + {CAT_Pe, 0x2988, 0}, + {CAT_Ps, 0x2989, 0}, + {CAT_Pe, 0x298A, 0}, + {CAT_Ps, 0x298B, 0}, + {CAT_Pe, 0x298C, 0}, + {CAT_Ps, 0x298D, 0}, + {CAT_Pe, 0x298E, 0}, + {CAT_Ps, 0x298F, 0}, + {CAT_Pe, 0x2990, 0}, + {CAT_Ps, 0x2991, 0}, + {CAT_Pe, 0x2992, 0}, + {CAT_Ps, 0x2993, 0}, + {CAT_Pe, 0x2994, 0}, + {CAT_Ps, 0x2995, 0}, + {CAT_Pe, 0x2996, 0}, + {CAT_Ps, 0x2997, 0}, + {CAT_Pe, 0x2998, 0}, + {CAT_Sm, 0x2999, 62}, + {CAT_Ps, 0x29D8, 0}, + {CAT_Pe, 0x29D9, 0}, + {CAT_Ps, 0x29DA, 0}, + {CAT_Pe, 0x29DB, 0}, + {CAT_Sm, 0x29DC, 31}, + {CAT_Ps, 0x29FC, 0}, + {CAT_Pe, 0x29FD, 0}, + {CAT_Sm, 0x29FE, 257}, + {CAT_So, 0x2B00, 47}, + {CAT_Sm, 0x2B30, 20}, + {CAT_So, 0x2B45, 1}, + {CAT_Sm, 0x2B47, 5}, + {CAT_So, 0x2B4D, 38}, + {CAT_So, 0x2B76, 31}, + {CAT_So, 0x2B97, 104}, + {CAT_LC, 0x2C00, 112}, + {CAT_Ll, 0x2C71, 0}, + {CAT_LC, 0x2C72, 1}, + {CAT_Ll, 0x2C74, 0}, + {CAT_LC, 0x2C75, 1}, + {CAT_Ll, 0x2C77, 4}, + {CAT_Lm, 0x2C7C, 1}, + {CAT_LC, 0x2C7E, 101}, + {CAT_Ll, 0x2CE4, 0}, + {CAT_So, 0x2CE5, 5}, + {CAT_LC, 0x2CEB, 3}, + {CAT_Mn, 0x2CEF, 2}, + {CAT_LC, 0x2CF2, 1}, + {CAT_Po, 0x2CF9, 3}, + {CAT_No, 0x2CFD, 0}, + {CAT_Po, 0x2CFE, 1}, + {CAT_LC, 0x2D00, 37}, + {CAT_LC, 0x2D27, 0}, + {CAT_LC, 0x2D2D, 0}, + {CAT_Lo, 0x2D30, 55}, + {CAT_Lm, 0x2D6F, 0}, + {CAT_Po, 0x2D70, 0}, + {CAT_Mn, 0x2D7F, 0}, + {CAT_Lo, 0x2D80, 22}, + {CAT_Lo, 0x2DA0, 6}, + {CAT_Lo, 0x2DA8, 6}, + {CAT_Lo, 0x2DB0, 6}, + {CAT_Lo, 0x2DB8, 6}, + {CAT_Lo, 0x2DC0, 6}, + {CAT_Lo, 0x2DC8, 6}, + {CAT_Lo, 0x2DD0, 6}, + {CAT_Lo, 0x2DD8, 6}, + {CAT_Mn, 0x2DE0, 31}, + {CAT_Po, 0x2E00, 1}, + {CAT_Pi, 0x2E02, 0}, + {CAT_Pf, 0x2E03, 0}, + {CAT_Pi, 0x2E04, 0}, + {CAT_Pf, 0x2E05, 0}, + {CAT_Po, 0x2E06, 2}, + {CAT_Pi, 0x2E09, 0}, + {CAT_Pf, 0x2E0A, 0}, + {CAT_Po, 0x2E0B, 0}, + {CAT_Pi, 0x2E0C, 0}, + {CAT_Pf, 0x2E0D, 0}, + {CAT_Po, 0x2E0E, 8}, + {CAT_Pd, 0x2E17, 0}, + {CAT_Po, 0x2E18, 1}, + {CAT_Pd, 0x2E1A, 0}, + {CAT_Po, 0x2E1B, 0}, + {CAT_Pi, 0x2E1C, 0}, + {CAT_Pf, 0x2E1D, 0}, + {CAT_Po, 0x2E1E, 1}, + {CAT_Pi, 0x2E20, 0}, + {CAT_Pf, 0x2E21, 0}, + {CAT_Ps, 0x2E22, 0}, + {CAT_Pe, 0x2E23, 0}, + {CAT_Ps, 0x2E24, 0}, + {CAT_Pe, 0x2E25, 0}, + {CAT_Ps, 0x2E26, 0}, + {CAT_Pe, 0x2E27, 0}, + {CAT_Ps, 0x2E28, 0}, + {CAT_Pe, 0x2E29, 0}, + {CAT_Po, 0x2E2A, 4}, + {CAT_Lm, 0x2E2F, 0}, + {CAT_Po, 0x2E30, 9}, + {CAT_Pd, 0x2E3A, 1}, + {CAT_Po, 0x2E3C, 3}, + {CAT_Pd, 0x2E40, 0}, + {CAT_Po, 0x2E41, 0}, + {CAT_Ps, 0x2E42, 0}, + {CAT_Po, 0x2E43, 12}, + {CAT_So, 0x2E50, 1}, + {CAT_Po, 0x2E52, 2}, + {CAT_Ps, 0x2E55, 0}, + {CAT_Pe, 0x2E56, 0}, + {CAT_Ps, 0x2E57, 0}, + {CAT_Pe, 0x2E58, 0}, + {CAT_Ps, 0x2E59, 0}, + {CAT_Pe, 0x2E5A, 0}, + {CAT_Ps, 0x2E5B, 0}, + {CAT_Pe, 0x2E5C, 0}, + {CAT_Pd, 0x2E5D, 0}, + {CAT_So, 0x2E80, 25}, + {CAT_So, 0x2E9B, 88}, + {CAT_So, 0x2F00, 213}, + {CAT_So, 0x2FF0, 11}, + {CAT_Zs, 0x3000, 0}, + {CAT_Po, 0x3001, 2}, + {CAT_So, 0x3004, 0}, + {CAT_Lm, 0x3005, 0}, + {CAT_Lo, 0x3006, 0}, + {CAT_Nl, 0x3007, 0}, + {CAT_Ps, 0x3008, 0}, + {CAT_Pe, 0x3009, 0}, + {CAT_Ps, 0x300A, 0}, + {CAT_Pe, 0x300B, 0}, + {CAT_Ps, 0x300C, 0}, + {CAT_Pe, 0x300D, 0}, + {CAT_Ps, 0x300E, 0}, + {CAT_Pe, 0x300F, 0}, + {CAT_Ps, 0x3010, 0}, + {CAT_Pe, 0x3011, 0}, + {CAT_So, 0x3012, 1}, + {CAT_Ps, 0x3014, 0}, + {CAT_Pe, 0x3015, 0}, + {CAT_Ps, 0x3016, 0}, + {CAT_Pe, 0x3017, 0}, + {CAT_Ps, 0x3018, 0}, + {CAT_Pe, 0x3019, 0}, + {CAT_Ps, 0x301A, 0}, + {CAT_Pe, 0x301B, 0}, + {CAT_Pd, 0x301C, 0}, + {CAT_Ps, 0x301D, 0}, + {CAT_Pe, 0x301E, 1}, + {CAT_So, 0x3020, 0}, + {CAT_Nl, 0x3021, 8}, + {CAT_Mn, 0x302A, 3}, + {CAT_Mc, 0x302E, 1}, + {CAT_Pd, 0x3030, 0}, + {CAT_Lm, 0x3031, 4}, + {CAT_So, 0x3036, 1}, + {CAT_Nl, 0x3038, 2}, + {CAT_Lm, 0x303B, 0}, + {CAT_Lo, 0x303C, 0}, + {CAT_Po, 0x303D, 0}, + {CAT_So, 0x303E, 1}, + {CAT_Lo, 0x3041, 85}, + {CAT_Mn, 0x3099, 1}, + {CAT_Sk, 0x309B, 1}, + {CAT_Lm, 0x309D, 1}, + {CAT_Lo, 0x309F, 0}, + {CAT_Pd, 0x30A0, 0}, + {CAT_Lo, 0x30A1, 89}, + {CAT_Po, 0x30FB, 0}, + {CAT_Lm, 0x30FC, 2}, + {CAT_Lo, 0x30FF, 0}, + {CAT_Lo, 0x3105, 42}, + {CAT_Lo, 0x3131, 93}, + {CAT_So, 0x3190, 1}, + {CAT_No, 0x3192, 3}, + {CAT_So, 0x3196, 9}, + {CAT_Lo, 0x31A0, 31}, + {CAT_So, 0x31C0, 35}, + {CAT_Lo, 0x31F0, 15}, + {CAT_So, 0x3200, 30}, + {CAT_No, 0x3220, 9}, + {CAT_So, 0x322A, 29}, + {CAT_No, 0x3248, 7}, + {CAT_So, 0x3250, 0}, + {CAT_No, 0x3251, 14}, + {CAT_So, 0x3260, 31}, + {CAT_No, 0x3280, 9}, + {CAT_So, 0x328A, 38}, + {CAT_No, 0x32B1, 14}, + {CAT_So, 0x32C0, 319}, + {CAT_Lo, 0x3400, 6591}, + {CAT_So, 0x4DC0, 63}, + {CAT_Lo, 0x4E00, 21012}, + {CAT_Lm, 0xA015, 0}, + {CAT_Lo, 0xA016, 1142}, + {CAT_So, 0xA490, 54}, + {CAT_Lo, 0xA4D0, 39}, + {CAT_Lm, 0xA4F8, 5}, + {CAT_Po, 0xA4FE, 1}, + {CAT_Lo, 0xA500, 267}, + {CAT_Lm, 0xA60C, 0}, + {CAT_Po, 0xA60D, 2}, + {CAT_Lo, 0xA610, 15}, + {CAT_Nd, 0xA620, 9}, + {CAT_Lo, 0xA62A, 1}, + {CAT_LC, 0xA640, 45}, + {CAT_Lo, 0xA66E, 0}, + {CAT_Mn, 0xA66F, 0}, + {CAT_Me, 0xA670, 2}, + {CAT_Po, 0xA673, 0}, + {CAT_Mn, 0xA674, 9}, + {CAT_Po, 0xA67E, 0}, + {CAT_Lm, 0xA67F, 0}, + {CAT_LC, 0xA680, 27}, + {CAT_Lm, 0xA69C, 1}, + {CAT_Mn, 0xA69E, 1}, + {CAT_Lo, 0xA6A0, 69}, + {CAT_Nl, 0xA6E6, 9}, + {CAT_Mn, 0xA6F0, 1}, + {CAT_Po, 0xA6F2, 5}, + {CAT_Sk, 0xA700, 22}, + {CAT_Lm, 0xA717, 8}, + {CAT_Sk, 0xA720, 1}, + {CAT_LC, 0xA722, 13}, + {CAT_Ll, 0xA730, 1}, + {CAT_LC, 0xA732, 61}, + {CAT_Lm, 0xA770, 0}, + {CAT_Ll, 0xA771, 7}, + {CAT_LC, 0xA779, 14}, + {CAT_Lm, 0xA788, 0}, + {CAT_Sk, 0xA789, 1}, + {CAT_LC, 0xA78B, 2}, + {CAT_Ll, 0xA78E, 0}, + {CAT_Lo, 0xA78F, 0}, + {CAT_LC, 0xA790, 4}, + {CAT_Ll, 0xA795, 0}, + {CAT_LC, 0xA796, 24}, + {CAT_Ll, 0xA7AF, 0}, + {CAT_LC, 0xA7B0, 26}, + {CAT_LC, 0xA7D0, 1}, + {CAT_Ll, 0xA7D3, 0}, + {CAT_Ll, 0xA7D5, 0}, + {CAT_LC, 0xA7D6, 3}, + {CAT_Lm, 0xA7F2, 2}, + {CAT_LC, 0xA7F5, 1}, + {CAT_Lo, 0xA7F7, 0}, + {CAT_Lm, 0xA7F8, 1}, + {CAT_Ll, 0xA7FA, 0}, + {CAT_Lo, 0xA7FB, 6}, + {CAT_Mn, 0xA802, 0}, + {CAT_Lo, 0xA803, 2}, + {CAT_Mn, 0xA806, 0}, + {CAT_Lo, 0xA807, 3}, + {CAT_Mn, 0xA80B, 0}, + {CAT_Lo, 0xA80C, 22}, + {CAT_Mc, 0xA823, 1}, + {CAT_Mn, 0xA825, 1}, + {CAT_Mc, 0xA827, 0}, + {CAT_So, 0xA828, 3}, + {CAT_Mn, 0xA82C, 0}, + {CAT_No, 0xA830, 5}, + {CAT_So, 0xA836, 1}, + {CAT_Sc, 0xA838, 0}, + {CAT_So, 0xA839, 0}, + {CAT_Lo, 0xA840, 51}, + {CAT_Po, 0xA874, 3}, + {CAT_Mc, 0xA880, 1}, + {CAT_Lo, 0xA882, 49}, + {CAT_Mc, 0xA8B4, 15}, + {CAT_Mn, 0xA8C4, 1}, + {CAT_Po, 0xA8CE, 1}, + {CAT_Nd, 0xA8D0, 9}, + {CAT_Mn, 0xA8E0, 17}, + {CAT_Lo, 0xA8F2, 5}, + {CAT_Po, 0xA8F8, 2}, + {CAT_Lo, 0xA8FB, 0}, + {CAT_Po, 0xA8FC, 0}, + {CAT_Lo, 0xA8FD, 1}, + {CAT_Mn, 0xA8FF, 0}, + {CAT_Nd, 0xA900, 9}, + {CAT_Lo, 0xA90A, 27}, + {CAT_Mn, 0xA926, 7}, + {CAT_Po, 0xA92E, 1}, + {CAT_Lo, 0xA930, 22}, + {CAT_Mn, 0xA947, 10}, + {CAT_Mc, 0xA952, 1}, + {CAT_Po, 0xA95F, 0}, + {CAT_Lo, 0xA960, 28}, + {CAT_Mn, 0xA980, 2}, + {CAT_Mc, 0xA983, 0}, + {CAT_Lo, 0xA984, 46}, + {CAT_Mn, 0xA9B3, 0}, + {CAT_Mc, 0xA9B4, 1}, + {CAT_Mn, 0xA9B6, 3}, + {CAT_Mc, 0xA9BA, 1}, + {CAT_Mn, 0xA9BC, 1}, + {CAT_Mc, 0xA9BE, 2}, + {CAT_Po, 0xA9C1, 12}, + {CAT_Lm, 0xA9CF, 0}, + {CAT_Nd, 0xA9D0, 9}, + {CAT_Po, 0xA9DE, 1}, + {CAT_Lo, 0xA9E0, 4}, + {CAT_Mn, 0xA9E5, 0}, + {CAT_Lm, 0xA9E6, 0}, + {CAT_Lo, 0xA9E7, 8}, + {CAT_Nd, 0xA9F0, 9}, + {CAT_Lo, 0xA9FA, 4}, + {CAT_Lo, 0xAA00, 40}, + {CAT_Mn, 0xAA29, 5}, + {CAT_Mc, 0xAA2F, 1}, + {CAT_Mn, 0xAA31, 1}, + {CAT_Mc, 0xAA33, 1}, + {CAT_Mn, 0xAA35, 1}, + {CAT_Lo, 0xAA40, 2}, + {CAT_Mn, 0xAA43, 0}, + {CAT_Lo, 0xAA44, 7}, + {CAT_Mn, 0xAA4C, 0}, + {CAT_Mc, 0xAA4D, 0}, + {CAT_Nd, 0xAA50, 9}, + {CAT_Po, 0xAA5C, 3}, + {CAT_Lo, 0xAA60, 15}, + {CAT_Lm, 0xAA70, 0}, + {CAT_Lo, 0xAA71, 5}, + {CAT_So, 0xAA77, 2}, + {CAT_Lo, 0xAA7A, 0}, + {CAT_Mc, 0xAA7B, 0}, + {CAT_Mn, 0xAA7C, 0}, + {CAT_Mc, 0xAA7D, 0}, + {CAT_Lo, 0xAA7E, 49}, + {CAT_Mn, 0xAAB0, 0}, + {CAT_Lo, 0xAAB1, 0}, + {CAT_Mn, 0xAAB2, 2}, + {CAT_Lo, 0xAAB5, 1}, + {CAT_Mn, 0xAAB7, 1}, + {CAT_Lo, 0xAAB9, 4}, + {CAT_Mn, 0xAABE, 1}, + {CAT_Lo, 0xAAC0, 0}, + {CAT_Mn, 0xAAC1, 0}, + {CAT_Lo, 0xAAC2, 0}, + {CAT_Lo, 0xAADB, 1}, + {CAT_Lm, 0xAADD, 0}, + {CAT_Po, 0xAADE, 1}, + {CAT_Lo, 0xAAE0, 10}, + {CAT_Mc, 0xAAEB, 0}, + {CAT_Mn, 0xAAEC, 1}, + {CAT_Mc, 0xAAEE, 1}, + {CAT_Po, 0xAAF0, 1}, + {CAT_Lo, 0xAAF2, 0}, + {CAT_Lm, 0xAAF3, 1}, + {CAT_Mc, 0xAAF5, 0}, + {CAT_Mn, 0xAAF6, 0}, + {CAT_Lo, 0xAB01, 5}, + {CAT_Lo, 0xAB09, 5}, + {CAT_Lo, 0xAB11, 5}, + {CAT_Lo, 0xAB20, 6}, + {CAT_Lo, 0xAB28, 6}, + {CAT_Ll, 0xAB30, 34}, + {CAT_LC, 0xAB53, 0}, + {CAT_Ll, 0xAB54, 6}, + {CAT_Sk, 0xAB5B, 0}, + {CAT_Lm, 0xAB5C, 3}, + {CAT_Ll, 0xAB60, 8}, + {CAT_Lm, 0xAB69, 0}, + {CAT_Sk, 0xAB6A, 1}, + {CAT_LC, 0xAB70, 79}, + {CAT_Lo, 0xABC0, 34}, + {CAT_Mc, 0xABE3, 1}, + {CAT_Mn, 0xABE5, 0}, + {CAT_Mc, 0xABE6, 1}, + {CAT_Mn, 0xABE8, 0}, + {CAT_Mc, 0xABE9, 1}, + {CAT_Po, 0xABEB, 0}, + {CAT_Mc, 0xABEC, 0}, + {CAT_Mn, 0xABED, 0}, + {CAT_Nd, 0xABF0, 9}, + {CAT_Lo, 0xAC00, 11171}, + {CAT_Lo, 0xD7B0, 22}, + {CAT_Lo, 0xD7CB, 48}, + {CAT_Cs, 0xD800, 2047}, + {CAT_Lo, 0xF900, 365}, + {CAT_Lo, 0xFA70, 105}, + {CAT_Ll, 0xFB00, 6}, + {CAT_Ll, 0xFB13, 4}, + {CAT_Lo, 0xFB1D, 0}, + {CAT_Mn, 0xFB1E, 0}, + {CAT_Lo, 0xFB1F, 9}, + {CAT_Sm, 0xFB29, 0}, + {CAT_Lo, 0xFB2A, 12}, + {CAT_Lo, 0xFB38, 4}, + {CAT_Lo, 0xFB3E, 0}, + {CAT_Lo, 0xFB40, 1}, + {CAT_Lo, 0xFB43, 1}, + {CAT_Lo, 0xFB46, 107}, + {CAT_Sk, 0xFBB2, 16}, + {CAT_Lo, 0xFBD3, 362}, + {CAT_Pe, 0xFD3E, 0}, + {CAT_Ps, 0xFD3F, 0}, + {CAT_So, 0xFD40, 15}, + {CAT_Lo, 0xFD50, 63}, + {CAT_Lo, 0xFD92, 53}, + {CAT_So, 0xFDCF, 0}, + {CAT_Lo, 0xFDF0, 11}, + {CAT_Sc, 0xFDFC, 0}, + {CAT_So, 0xFDFD, 2}, + {CAT_Mn, 0xFE00, 15}, + {CAT_Po, 0xFE10, 6}, + {CAT_Ps, 0xFE17, 0}, + {CAT_Pe, 0xFE18, 0}, + {CAT_Po, 0xFE19, 0}, + {CAT_Mn, 0xFE20, 15}, + {CAT_Po, 0xFE30, 0}, + {CAT_Pd, 0xFE31, 1}, + {CAT_Pc, 0xFE33, 1}, + {CAT_Ps, 0xFE35, 0}, + {CAT_Pe, 0xFE36, 0}, + {CAT_Ps, 0xFE37, 0}, + {CAT_Pe, 0xFE38, 0}, + {CAT_Ps, 0xFE39, 0}, + {CAT_Pe, 0xFE3A, 0}, + {CAT_Ps, 0xFE3B, 0}, + {CAT_Pe, 0xFE3C, 0}, + {CAT_Ps, 0xFE3D, 0}, + {CAT_Pe, 0xFE3E, 0}, + {CAT_Ps, 0xFE3F, 0}, + {CAT_Pe, 0xFE40, 0}, + {CAT_Ps, 0xFE41, 0}, + {CAT_Pe, 0xFE42, 0}, + {CAT_Ps, 0xFE43, 0}, + {CAT_Pe, 0xFE44, 0}, + {CAT_Po, 0xFE45, 1}, + {CAT_Ps, 0xFE47, 0}, + {CAT_Pe, 0xFE48, 0}, + {CAT_Po, 0xFE49, 3}, + {CAT_Pc, 0xFE4D, 2}, + {CAT_Po, 0xFE50, 2}, + {CAT_Po, 0xFE54, 3}, + {CAT_Pd, 0xFE58, 0}, + {CAT_Ps, 0xFE59, 0}, + {CAT_Pe, 0xFE5A, 0}, + {CAT_Ps, 0xFE5B, 0}, + {CAT_Pe, 0xFE5C, 0}, + {CAT_Ps, 0xFE5D, 0}, + {CAT_Pe, 0xFE5E, 0}, + {CAT_Po, 0xFE5F, 2}, + {CAT_Sm, 0xFE62, 0}, + {CAT_Pd, 0xFE63, 0}, + {CAT_Sm, 0xFE64, 2}, + {CAT_Po, 0xFE68, 0}, + {CAT_Sc, 0xFE69, 0}, + {CAT_Po, 0xFE6A, 1}, + {CAT_Lo, 0xFE70, 4}, + {CAT_Lo, 0xFE76, 134}, + {CAT_Cf, 0xFEFF, 0}, + {CAT_Po, 0xFF01, 2}, + {CAT_Sc, 0xFF04, 0}, + {CAT_Po, 0xFF05, 2}, + {CAT_Ps, 0xFF08, 0}, + {CAT_Pe, 0xFF09, 0}, + {CAT_Po, 0xFF0A, 0}, + {CAT_Sm, 0xFF0B, 0}, + {CAT_Po, 0xFF0C, 0}, + {CAT_Pd, 0xFF0D, 0}, + {CAT_Po, 0xFF0E, 1}, + {CAT_Nd, 0xFF10, 9}, + {CAT_Po, 0xFF1A, 1}, + {CAT_Sm, 0xFF1C, 2}, + {CAT_Po, 0xFF1F, 1}, + {CAT_LC, 0xFF21, 25}, + {CAT_Ps, 0xFF3B, 0}, + {CAT_Po, 0xFF3C, 0}, + {CAT_Pe, 0xFF3D, 0}, + {CAT_Sk, 0xFF3E, 0}, + {CAT_Pc, 0xFF3F, 0}, + {CAT_Sk, 0xFF40, 0}, + {CAT_LC, 0xFF41, 25}, + {CAT_Ps, 0xFF5B, 0}, + {CAT_Sm, 0xFF5C, 0}, + {CAT_Pe, 0xFF5D, 0}, + {CAT_Sm, 0xFF5E, 0}, + {CAT_Ps, 0xFF5F, 0}, + {CAT_Pe, 0xFF60, 0}, + {CAT_Po, 0xFF61, 0}, + {CAT_Ps, 0xFF62, 0}, + {CAT_Pe, 0xFF63, 0}, + {CAT_Po, 0xFF64, 1}, + {CAT_Lo, 0xFF66, 9}, + {CAT_Lm, 0xFF70, 0}, + {CAT_Lo, 0xFF71, 44}, + {CAT_Lm, 0xFF9E, 1}, + {CAT_Lo, 0xFFA0, 30}, + {CAT_Lo, 0xFFC2, 5}, + {CAT_Lo, 0xFFCA, 5}, + {CAT_Lo, 0xFFD2, 5}, + {CAT_Lo, 0xFFDA, 2}, + {CAT_Sc, 0xFFE0, 1}, + {CAT_Sm, 0xFFE2, 0}, + {CAT_Sk, 0xFFE3, 0}, + {CAT_So, 0xFFE4, 0}, + {CAT_Sc, 0xFFE5, 1}, + {CAT_So, 0xFFE8, 0}, + {CAT_Sm, 0xFFE9, 3}, + {CAT_So, 0xFFED, 1}, + {CAT_Cf, 0xFFF9, 2}, + {CAT_So, 0xFFFC, 1}, + {CAT_Lo, 0x10000, 11}, + {CAT_Lo, 0x1000D, 25}, + {CAT_Lo, 0x10028, 18}, + {CAT_Lo, 0x1003C, 1}, + {CAT_Lo, 0x1003F, 14}, + {CAT_Lo, 0x10050, 13}, + {CAT_Lo, 0x10080, 122}, + {CAT_Po, 0x10100, 2}, + {CAT_No, 0x10107, 44}, + {CAT_So, 0x10137, 8}, + {CAT_Nl, 0x10140, 52}, + {CAT_No, 0x10175, 3}, + {CAT_So, 0x10179, 16}, + {CAT_No, 0x1018A, 1}, + {CAT_So, 0x1018C, 2}, + {CAT_So, 0x10190, 12}, + {CAT_So, 0x101A0, 0}, + {CAT_So, 0x101D0, 44}, + {CAT_Mn, 0x101FD, 0}, + {CAT_Lo, 0x10280, 28}, + {CAT_Lo, 0x102A0, 48}, + {CAT_Mn, 0x102E0, 0}, + {CAT_No, 0x102E1, 26}, + {CAT_Lo, 0x10300, 31}, + {CAT_No, 0x10320, 3}, + {CAT_Lo, 0x1032D, 19}, + {CAT_Nl, 0x10341, 0}, + {CAT_Lo, 0x10342, 7}, + {CAT_Nl, 0x1034A, 0}, + {CAT_Lo, 0x10350, 37}, + {CAT_Mn, 0x10376, 4}, + {CAT_Lo, 0x10380, 29}, + {CAT_Po, 0x1039F, 0}, + {CAT_Lo, 0x103A0, 35}, + {CAT_Lo, 0x103C8, 7}, + {CAT_Po, 0x103D0, 0}, + {CAT_Nl, 0x103D1, 4}, + {CAT_LC, 0x10400, 79}, + {CAT_Lo, 0x10450, 77}, + {CAT_Nd, 0x104A0, 9}, + {CAT_LC, 0x104B0, 35}, + {CAT_LC, 0x104D8, 35}, + {CAT_Lo, 0x10500, 39}, + {CAT_Lo, 0x10530, 51}, + {CAT_Po, 0x1056F, 0}, + {CAT_LC, 0x10570, 10}, + {CAT_LC, 0x1057C, 14}, + {CAT_LC, 0x1058C, 6}, + {CAT_LC, 0x10594, 1}, + {CAT_LC, 0x10597, 10}, + {CAT_LC, 0x105A3, 14}, + {CAT_LC, 0x105B3, 6}, + {CAT_LC, 0x105BB, 1}, + {CAT_Lo, 0x10600, 310}, + {CAT_Lo, 0x10740, 21}, + {CAT_Lo, 0x10760, 7}, + {CAT_Lm, 0x10780, 5}, + {CAT_Lm, 0x10787, 41}, + {CAT_Lm, 0x107B2, 8}, + {CAT_Lo, 0x10800, 5}, + {CAT_Lo, 0x10808, 0}, + {CAT_Lo, 0x1080A, 43}, + {CAT_Lo, 0x10837, 1}, + {CAT_Lo, 0x1083C, 0}, + {CAT_Lo, 0x1083F, 22}, + {CAT_Po, 0x10857, 0}, + {CAT_No, 0x10858, 7}, + {CAT_Lo, 0x10860, 22}, + {CAT_So, 0x10877, 1}, + {CAT_No, 0x10879, 6}, + {CAT_Lo, 0x10880, 30}, + {CAT_No, 0x108A7, 8}, + {CAT_Lo, 0x108E0, 18}, + {CAT_Lo, 0x108F4, 1}, + {CAT_No, 0x108FB, 4}, + {CAT_Lo, 0x10900, 21}, + {CAT_No, 0x10916, 5}, + {CAT_Po, 0x1091F, 0}, + {CAT_Lo, 0x10920, 25}, + {CAT_Po, 0x1093F, 0}, + {CAT_Lo, 0x10980, 55}, + {CAT_No, 0x109BC, 1}, + {CAT_Lo, 0x109BE, 1}, + {CAT_No, 0x109C0, 15}, + {CAT_No, 0x109D2, 45}, + {CAT_Lo, 0x10A00, 0}, + {CAT_Mn, 0x10A01, 2}, + {CAT_Mn, 0x10A05, 1}, + {CAT_Mn, 0x10A0C, 3}, + {CAT_Lo, 0x10A10, 3}, + {CAT_Lo, 0x10A15, 2}, + {CAT_Lo, 0x10A19, 28}, + {CAT_Mn, 0x10A38, 2}, + {CAT_Mn, 0x10A3F, 0}, + {CAT_No, 0x10A40, 8}, + {CAT_Po, 0x10A50, 8}, + {CAT_Lo, 0x10A60, 28}, + {CAT_No, 0x10A7D, 1}, + {CAT_Po, 0x10A7F, 0}, + {CAT_Lo, 0x10A80, 28}, + {CAT_No, 0x10A9D, 2}, + {CAT_Lo, 0x10AC0, 7}, + {CAT_So, 0x10AC8, 0}, + {CAT_Lo, 0x10AC9, 27}, + {CAT_Mn, 0x10AE5, 1}, + {CAT_No, 0x10AEB, 4}, + {CAT_Po, 0x10AF0, 6}, + {CAT_Lo, 0x10B00, 53}, + {CAT_Po, 0x10B39, 6}, + {CAT_Lo, 0x10B40, 21}, + {CAT_No, 0x10B58, 7}, + {CAT_Lo, 0x10B60, 18}, + {CAT_No, 0x10B78, 7}, + {CAT_Lo, 0x10B80, 17}, + {CAT_Po, 0x10B99, 3}, + {CAT_No, 0x10BA9, 6}, + {CAT_Lo, 0x10C00, 72}, + {CAT_LC, 0x10C80, 50}, + {CAT_LC, 0x10CC0, 50}, + {CAT_No, 0x10CFA, 5}, + {CAT_Lo, 0x10D00, 35}, + {CAT_Mn, 0x10D24, 3}, + {CAT_Nd, 0x10D30, 9}, + {CAT_No, 0x10E60, 30}, + {CAT_Lo, 0x10E80, 41}, + {CAT_Mn, 0x10EAB, 1}, + {CAT_Pd, 0x10EAD, 0}, + {CAT_Lo, 0x10EB0, 1}, + {CAT_Mn, 0x10EFD, 2}, + {CAT_Lo, 0x10F00, 28}, + {CAT_No, 0x10F1D, 9}, + {CAT_Lo, 0x10F27, 0}, + {CAT_Lo, 0x10F30, 21}, + {CAT_Mn, 0x10F46, 10}, + {CAT_No, 0x10F51, 3}, + {CAT_Po, 0x10F55, 4}, + {CAT_Lo, 0x10F70, 17}, + {CAT_Mn, 0x10F82, 3}, + {CAT_Po, 0x10F86, 3}, + {CAT_Lo, 0x10FB0, 20}, + {CAT_No, 0x10FC5, 6}, + {CAT_Lo, 0x10FE0, 22}, + {CAT_Mc, 0x11000, 0}, + {CAT_Mn, 0x11001, 0}, + {CAT_Mc, 0x11002, 0}, + {CAT_Lo, 0x11003, 52}, + {CAT_Mn, 0x11038, 14}, + {CAT_Po, 0x11047, 6}, + {CAT_No, 0x11052, 19}, + {CAT_Nd, 0x11066, 9}, + {CAT_Mn, 0x11070, 0}, + {CAT_Lo, 0x11071, 1}, + {CAT_Mn, 0x11073, 1}, + {CAT_Lo, 0x11075, 0}, + {CAT_Mn, 0x1107F, 2}, + {CAT_Mc, 0x11082, 0}, + {CAT_Lo, 0x11083, 44}, + {CAT_Mc, 0x110B0, 2}, + {CAT_Mn, 0x110B3, 3}, + {CAT_Mc, 0x110B7, 1}, + {CAT_Mn, 0x110B9, 1}, + {CAT_Po, 0x110BB, 1}, + {CAT_Cf, 0x110BD, 0}, + {CAT_Po, 0x110BE, 3}, + {CAT_Mn, 0x110C2, 0}, + {CAT_Cf, 0x110CD, 0}, + {CAT_Lo, 0x110D0, 24}, + {CAT_Nd, 0x110F0, 9}, + {CAT_Mn, 0x11100, 2}, + {CAT_Lo, 0x11103, 35}, + {CAT_Mn, 0x11127, 4}, + {CAT_Mc, 0x1112C, 0}, + {CAT_Mn, 0x1112D, 7}, + {CAT_Nd, 0x11136, 9}, + {CAT_Po, 0x11140, 3}, + {CAT_Lo, 0x11144, 0}, + {CAT_Mc, 0x11145, 1}, + {CAT_Lo, 0x11147, 0}, + {CAT_Lo, 0x11150, 34}, + {CAT_Mn, 0x11173, 0}, + {CAT_Po, 0x11174, 1}, + {CAT_Lo, 0x11176, 0}, + {CAT_Mn, 0x11180, 1}, + {CAT_Mc, 0x11182, 0}, + {CAT_Lo, 0x11183, 47}, + {CAT_Mc, 0x111B3, 2}, + {CAT_Mn, 0x111B6, 8}, + {CAT_Mc, 0x111BF, 1}, + {CAT_Lo, 0x111C1, 3}, + {CAT_Po, 0x111C5, 3}, + {CAT_Mn, 0x111C9, 3}, + {CAT_Po, 0x111CD, 0}, + {CAT_Mc, 0x111CE, 0}, + {CAT_Mn, 0x111CF, 0}, + {CAT_Nd, 0x111D0, 9}, + {CAT_Lo, 0x111DA, 0}, + {CAT_Po, 0x111DB, 0}, + {CAT_Lo, 0x111DC, 0}, + {CAT_Po, 0x111DD, 2}, + {CAT_No, 0x111E1, 19}, + {CAT_Lo, 0x11200, 17}, + {CAT_Lo, 0x11213, 24}, + {CAT_Mc, 0x1122C, 2}, + {CAT_Mn, 0x1122F, 2}, + {CAT_Mc, 0x11232, 1}, + {CAT_Mn, 0x11234, 0}, + {CAT_Mc, 0x11235, 0}, + {CAT_Mn, 0x11236, 1}, + {CAT_Po, 0x11238, 5}, + {CAT_Mn, 0x1123E, 0}, + {CAT_Lo, 0x1123F, 1}, + {CAT_Mn, 0x11241, 0}, + {CAT_Lo, 0x11280, 6}, + {CAT_Lo, 0x11288, 0}, + {CAT_Lo, 0x1128A, 3}, + {CAT_Lo, 0x1128F, 14}, + {CAT_Lo, 0x1129F, 9}, + {CAT_Po, 0x112A9, 0}, + {CAT_Lo, 0x112B0, 46}, + {CAT_Mn, 0x112DF, 0}, + {CAT_Mc, 0x112E0, 2}, + {CAT_Mn, 0x112E3, 7}, + {CAT_Nd, 0x112F0, 9}, + {CAT_Mn, 0x11300, 1}, + {CAT_Mc, 0x11302, 1}, + {CAT_Lo, 0x11305, 7}, + {CAT_Lo, 0x1130F, 1}, + {CAT_Lo, 0x11313, 21}, + {CAT_Lo, 0x1132A, 6}, + {CAT_Lo, 0x11332, 1}, + {CAT_Lo, 0x11335, 4}, + {CAT_Mn, 0x1133B, 1}, + {CAT_Lo, 0x1133D, 0}, + {CAT_Mc, 0x1133E, 1}, + {CAT_Mn, 0x11340, 0}, + {CAT_Mc, 0x11341, 3}, + {CAT_Mc, 0x11347, 1}, + {CAT_Mc, 0x1134B, 2}, + {CAT_Lo, 0x11350, 0}, + {CAT_Mc, 0x11357, 0}, + {CAT_Lo, 0x1135D, 4}, + {CAT_Mc, 0x11362, 1}, + {CAT_Mn, 0x11366, 6}, + {CAT_Mn, 0x11370, 4}, + {CAT_Lo, 0x11400, 52}, + {CAT_Mc, 0x11435, 2}, + {CAT_Mn, 0x11438, 7}, + {CAT_Mc, 0x11440, 1}, + {CAT_Mn, 0x11442, 2}, + {CAT_Mc, 0x11445, 0}, + {CAT_Mn, 0x11446, 0}, + {CAT_Lo, 0x11447, 3}, + {CAT_Po, 0x1144B, 4}, + {CAT_Nd, 0x11450, 9}, + {CAT_Po, 0x1145A, 1}, + {CAT_Po, 0x1145D, 0}, + {CAT_Mn, 0x1145E, 0}, + {CAT_Lo, 0x1145F, 2}, + {CAT_Lo, 0x11480, 47}, + {CAT_Mc, 0x114B0, 2}, + {CAT_Mn, 0x114B3, 5}, + {CAT_Mc, 0x114B9, 0}, + {CAT_Mn, 0x114BA, 0}, + {CAT_Mc, 0x114BB, 3}, + {CAT_Mn, 0x114BF, 1}, + {CAT_Mc, 0x114C1, 0}, + {CAT_Mn, 0x114C2, 1}, + {CAT_Lo, 0x114C4, 1}, + {CAT_Po, 0x114C6, 0}, + {CAT_Lo, 0x114C7, 0}, + {CAT_Nd, 0x114D0, 9}, + {CAT_Lo, 0x11580, 46}, + {CAT_Mc, 0x115AF, 2}, + {CAT_Mn, 0x115B2, 3}, + {CAT_Mc, 0x115B8, 3}, + {CAT_Mn, 0x115BC, 1}, + {CAT_Mc, 0x115BE, 0}, + {CAT_Mn, 0x115BF, 1}, + {CAT_Po, 0x115C1, 22}, + {CAT_Lo, 0x115D8, 3}, + {CAT_Mn, 0x115DC, 1}, + {CAT_Lo, 0x11600, 47}, + {CAT_Mc, 0x11630, 2}, + {CAT_Mn, 0x11633, 7}, + {CAT_Mc, 0x1163B, 1}, + {CAT_Mn, 0x1163D, 0}, + {CAT_Mc, 0x1163E, 0}, + {CAT_Mn, 0x1163F, 1}, + {CAT_Po, 0x11641, 2}, + {CAT_Lo, 0x11644, 0}, + {CAT_Nd, 0x11650, 9}, + {CAT_Po, 0x11660, 12}, + {CAT_Lo, 0x11680, 42}, + {CAT_Mn, 0x116AB, 0}, + {CAT_Mc, 0x116AC, 0}, + {CAT_Mn, 0x116AD, 0}, + {CAT_Mc, 0x116AE, 1}, + {CAT_Mn, 0x116B0, 5}, + {CAT_Mc, 0x116B6, 0}, + {CAT_Mn, 0x116B7, 0}, + {CAT_Lo, 0x116B8, 0}, + {CAT_Po, 0x116B9, 0}, + {CAT_Nd, 0x116C0, 9}, + {CAT_Lo, 0x11700, 26}, + {CAT_Mn, 0x1171D, 2}, + {CAT_Mc, 0x11720, 1}, + {CAT_Mn, 0x11722, 3}, + {CAT_Mc, 0x11726, 0}, + {CAT_Mn, 0x11727, 4}, + {CAT_Nd, 0x11730, 9}, + {CAT_No, 0x1173A, 1}, + {CAT_Po, 0x1173C, 2}, + {CAT_So, 0x1173F, 0}, + {CAT_Lo, 0x11740, 6}, + {CAT_Lo, 0x11800, 43}, + {CAT_Mc, 0x1182C, 2}, + {CAT_Mn, 0x1182F, 8}, + {CAT_Mc, 0x11838, 0}, + {CAT_Mn, 0x11839, 1}, + {CAT_Po, 0x1183B, 0}, + {CAT_LC, 0x118A0, 63}, + {CAT_Nd, 0x118E0, 9}, + {CAT_No, 0x118EA, 8}, + {CAT_Lo, 0x118FF, 7}, + {CAT_Lo, 0x11909, 0}, + {CAT_Lo, 0x1190C, 7}, + {CAT_Lo, 0x11915, 1}, + {CAT_Lo, 0x11918, 23}, + {CAT_Mc, 0x11930, 5}, + {CAT_Mc, 0x11937, 1}, + {CAT_Mn, 0x1193B, 1}, + {CAT_Mc, 0x1193D, 0}, + {CAT_Mn, 0x1193E, 0}, + {CAT_Lo, 0x1193F, 0}, + {CAT_Mc, 0x11940, 0}, + {CAT_Lo, 0x11941, 0}, + {CAT_Mc, 0x11942, 0}, + {CAT_Mn, 0x11943, 0}, + {CAT_Po, 0x11944, 2}, + {CAT_Nd, 0x11950, 9}, + {CAT_Lo, 0x119A0, 7}, + {CAT_Lo, 0x119AA, 38}, + {CAT_Mc, 0x119D1, 2}, + {CAT_Mn, 0x119D4, 3}, + {CAT_Mn, 0x119DA, 1}, + {CAT_Mc, 0x119DC, 3}, + {CAT_Mn, 0x119E0, 0}, + {CAT_Lo, 0x119E1, 0}, + {CAT_Po, 0x119E2, 0}, + {CAT_Lo, 0x119E3, 0}, + {CAT_Mc, 0x119E4, 0}, + {CAT_Lo, 0x11A00, 0}, + {CAT_Mn, 0x11A01, 9}, + {CAT_Lo, 0x11A0B, 39}, + {CAT_Mn, 0x11A33, 5}, + {CAT_Mc, 0x11A39, 0}, + {CAT_Lo, 0x11A3A, 0}, + {CAT_Mn, 0x11A3B, 3}, + {CAT_Po, 0x11A3F, 7}, + {CAT_Mn, 0x11A47, 0}, + {CAT_Lo, 0x11A50, 0}, + {CAT_Mn, 0x11A51, 5}, + {CAT_Mc, 0x11A57, 1}, + {CAT_Mn, 0x11A59, 2}, + {CAT_Lo, 0x11A5C, 45}, + {CAT_Mn, 0x11A8A, 12}, + {CAT_Mc, 0x11A97, 0}, + {CAT_Mn, 0x11A98, 1}, + {CAT_Po, 0x11A9A, 2}, + {CAT_Lo, 0x11A9D, 0}, + {CAT_Po, 0x11A9E, 4}, + {CAT_Lo, 0x11AB0, 72}, + {CAT_Po, 0x11B00, 9}, + {CAT_Lo, 0x11C00, 8}, + {CAT_Lo, 0x11C0A, 36}, + {CAT_Mc, 0x11C2F, 0}, + {CAT_Mn, 0x11C30, 6}, + {CAT_Mn, 0x11C38, 5}, + {CAT_Mc, 0x11C3E, 0}, + {CAT_Mn, 0x11C3F, 0}, + {CAT_Lo, 0x11C40, 0}, + {CAT_Po, 0x11C41, 4}, + {CAT_Nd, 0x11C50, 9}, + {CAT_No, 0x11C5A, 18}, + {CAT_Po, 0x11C70, 1}, + {CAT_Lo, 0x11C72, 29}, + {CAT_Mn, 0x11C92, 21}, + {CAT_Mc, 0x11CA9, 0}, + {CAT_Mn, 0x11CAA, 6}, + {CAT_Mc, 0x11CB1, 0}, + {CAT_Mn, 0x11CB2, 1}, + {CAT_Mc, 0x11CB4, 0}, + {CAT_Mn, 0x11CB5, 1}, + {CAT_Lo, 0x11D00, 6}, + {CAT_Lo, 0x11D08, 1}, + {CAT_Lo, 0x11D0B, 37}, + {CAT_Mn, 0x11D31, 5}, + {CAT_Mn, 0x11D3A, 0}, + {CAT_Mn, 0x11D3C, 1}, + {CAT_Mn, 0x11D3F, 6}, + {CAT_Lo, 0x11D46, 0}, + {CAT_Mn, 0x11D47, 0}, + {CAT_Nd, 0x11D50, 9}, + {CAT_Lo, 0x11D60, 5}, + {CAT_Lo, 0x11D67, 1}, + {CAT_Lo, 0x11D6A, 31}, + {CAT_Mc, 0x11D8A, 4}, + {CAT_Mn, 0x11D90, 1}, + {CAT_Mc, 0x11D93, 1}, + {CAT_Mn, 0x11D95, 0}, + {CAT_Mc, 0x11D96, 0}, + {CAT_Mn, 0x11D97, 0}, + {CAT_Lo, 0x11D98, 0}, + {CAT_Nd, 0x11DA0, 9}, + {CAT_Lo, 0x11EE0, 18}, + {CAT_Mn, 0x11EF3, 1}, + {CAT_Mc, 0x11EF5, 1}, + {CAT_Po, 0x11EF7, 1}, + {CAT_Mn, 0x11F00, 1}, + {CAT_Lo, 0x11F02, 0}, + {CAT_Mc, 0x11F03, 0}, + {CAT_Lo, 0x11F04, 12}, + {CAT_Lo, 0x11F12, 33}, + {CAT_Mc, 0x11F34, 1}, + {CAT_Mn, 0x11F36, 4}, + {CAT_Mc, 0x11F3E, 1}, + {CAT_Mn, 0x11F40, 0}, + {CAT_Mc, 0x11F41, 0}, + {CAT_Mn, 0x11F42, 0}, + {CAT_Po, 0x11F43, 12}, + {CAT_Nd, 0x11F50, 9}, + {CAT_Lo, 0x11FB0, 0}, + {CAT_No, 0x11FC0, 20}, + {CAT_So, 0x11FD5, 7}, + {CAT_Sc, 0x11FDD, 3}, + {CAT_So, 0x11FE1, 16}, + {CAT_Po, 0x11FFF, 0}, + {CAT_Lo, 0x12000, 921}, + {CAT_Nl, 0x12400, 110}, + {CAT_Po, 0x12470, 4}, + {CAT_Lo, 0x12480, 195}, + {CAT_Lo, 0x12F90, 96}, + {CAT_Po, 0x12FF1, 1}, + {CAT_Lo, 0x13000, 1071}, + {CAT_Cf, 0x13430, 15}, + {CAT_Mn, 0x13440, 0}, + {CAT_Lo, 0x13441, 5}, + {CAT_Mn, 0x13447, 14}, + {CAT_Lo, 0x14400, 582}, + {CAT_Lo, 0x16800, 568}, + {CAT_Lo, 0x16A40, 30}, + {CAT_Nd, 0x16A60, 9}, + {CAT_Po, 0x16A6E, 1}, + {CAT_Lo, 0x16A70, 78}, + {CAT_Nd, 0x16AC0, 9}, + {CAT_Lo, 0x16AD0, 29}, + {CAT_Mn, 0x16AF0, 4}, + {CAT_Po, 0x16AF5, 0}, + {CAT_Lo, 0x16B00, 47}, + {CAT_Mn, 0x16B30, 6}, + {CAT_Po, 0x16B37, 4}, + {CAT_So, 0x16B3C, 3}, + {CAT_Lm, 0x16B40, 3}, + {CAT_Po, 0x16B44, 0}, + {CAT_So, 0x16B45, 0}, + {CAT_Nd, 0x16B50, 9}, + {CAT_No, 0x16B5B, 6}, + {CAT_Lo, 0x16B63, 20}, + {CAT_Lo, 0x16B7D, 18}, + {CAT_LC, 0x16E40, 63}, + {CAT_No, 0x16E80, 22}, + {CAT_Po, 0x16E97, 3}, + {CAT_Lo, 0x16F00, 74}, + {CAT_Mn, 0x16F4F, 0}, + {CAT_Lo, 0x16F50, 0}, + {CAT_Mc, 0x16F51, 54}, + {CAT_Mn, 0x16F8F, 3}, + {CAT_Lm, 0x16F93, 12}, + {CAT_Lm, 0x16FE0, 1}, + {CAT_Po, 0x16FE2, 0}, + {CAT_Lm, 0x16FE3, 0}, + {CAT_Mn, 0x16FE4, 0}, + {CAT_Mc, 0x16FF0, 1}, + {CAT_Lo, 0x17000, 6135}, + {CAT_Lo, 0x18800, 1237}, + {CAT_Lo, 0x18D00, 8}, + {CAT_Lm, 0x1AFF0, 3}, + {CAT_Lm, 0x1AFF5, 6}, + {CAT_Lm, 0x1AFFD, 1}, + {CAT_Lo, 0x1B000, 290}, + {CAT_Lo, 0x1B132, 0}, + {CAT_Lo, 0x1B150, 2}, + {CAT_Lo, 0x1B155, 0}, + {CAT_Lo, 0x1B164, 3}, + {CAT_Lo, 0x1B170, 395}, + {CAT_Lo, 0x1BC00, 106}, + {CAT_Lo, 0x1BC70, 12}, + {CAT_Lo, 0x1BC80, 8}, + {CAT_Lo, 0x1BC90, 9}, + {CAT_So, 0x1BC9C, 0}, + {CAT_Mn, 0x1BC9D, 1}, + {CAT_Po, 0x1BC9F, 0}, + {CAT_Cf, 0x1BCA0, 3}, + {CAT_Mn, 0x1CF00, 45}, + {CAT_Mn, 0x1CF30, 22}, + {CAT_So, 0x1CF50, 115}, + {CAT_So, 0x1D000, 245}, + {CAT_So, 0x1D100, 38}, + {CAT_So, 0x1D129, 59}, + {CAT_Mc, 0x1D165, 1}, + {CAT_Mn, 0x1D167, 2}, + {CAT_So, 0x1D16A, 2}, + {CAT_Mc, 0x1D16D, 5}, + {CAT_Cf, 0x1D173, 7}, + {CAT_Mn, 0x1D17B, 7}, + {CAT_So, 0x1D183, 1}, + {CAT_Mn, 0x1D185, 6}, + {CAT_So, 0x1D18C, 29}, + {CAT_Mn, 0x1D1AA, 3}, + {CAT_So, 0x1D1AE, 60}, + {CAT_So, 0x1D200, 65}, + {CAT_Mn, 0x1D242, 2}, + {CAT_So, 0x1D245, 0}, + {CAT_No, 0x1D2C0, 19}, + {CAT_No, 0x1D2E0, 19}, + {CAT_So, 0x1D300, 86}, + {CAT_No, 0x1D360, 24}, + {CAT_Lu, 0x1D400, 25}, + {CAT_Ll, 0x1D41A, 25}, + {CAT_Lu, 0x1D434, 25}, + {CAT_Ll, 0x1D44E, 6}, + {CAT_Ll, 0x1D456, 17}, + {CAT_Lu, 0x1D468, 25}, + {CAT_Ll, 0x1D482, 25}, + {CAT_Lu, 0x1D49C, 0}, + {CAT_Lu, 0x1D49E, 1}, + {CAT_Lu, 0x1D4A2, 0}, + {CAT_Lu, 0x1D4A5, 1}, + {CAT_Lu, 0x1D4A9, 3}, + {CAT_Lu, 0x1D4AE, 7}, + {CAT_Ll, 0x1D4B6, 3}, + {CAT_Ll, 0x1D4BB, 0}, + {CAT_Ll, 0x1D4BD, 6}, + {CAT_Ll, 0x1D4C5, 10}, + {CAT_Lu, 0x1D4D0, 25}, + {CAT_Ll, 0x1D4EA, 25}, + {CAT_Lu, 0x1D504, 1}, + {CAT_Lu, 0x1D507, 3}, + {CAT_Lu, 0x1D50D, 7}, + {CAT_Lu, 0x1D516, 6}, + {CAT_Ll, 0x1D51E, 25}, + {CAT_Lu, 0x1D538, 1}, + {CAT_Lu, 0x1D53B, 3}, + {CAT_Lu, 0x1D540, 4}, + {CAT_Lu, 0x1D546, 0}, + {CAT_Lu, 0x1D54A, 6}, + {CAT_Ll, 0x1D552, 25}, + {CAT_Lu, 0x1D56C, 25}, + {CAT_Ll, 0x1D586, 25}, + {CAT_Lu, 0x1D5A0, 25}, + {CAT_Ll, 0x1D5BA, 25}, + {CAT_Lu, 0x1D5D4, 25}, + {CAT_Ll, 0x1D5EE, 25}, + {CAT_Lu, 0x1D608, 25}, + {CAT_Ll, 0x1D622, 25}, + {CAT_Lu, 0x1D63C, 25}, + {CAT_Ll, 0x1D656, 25}, + {CAT_Lu, 0x1D670, 25}, + {CAT_Ll, 0x1D68A, 27}, + {CAT_Lu, 0x1D6A8, 24}, + {CAT_Sm, 0x1D6C1, 0}, + {CAT_Ll, 0x1D6C2, 24}, + {CAT_Sm, 0x1D6DB, 0}, + {CAT_Ll, 0x1D6DC, 5}, + {CAT_Lu, 0x1D6E2, 24}, + {CAT_Sm, 0x1D6FB, 0}, + {CAT_Ll, 0x1D6FC, 24}, + {CAT_Sm, 0x1D715, 0}, + {CAT_Ll, 0x1D716, 5}, + {CAT_Lu, 0x1D71C, 24}, + {CAT_Sm, 0x1D735, 0}, + {CAT_Ll, 0x1D736, 24}, + {CAT_Sm, 0x1D74F, 0}, + {CAT_Ll, 0x1D750, 5}, + {CAT_Lu, 0x1D756, 24}, + {CAT_Sm, 0x1D76F, 0}, + {CAT_Ll, 0x1D770, 24}, + {CAT_Sm, 0x1D789, 0}, + {CAT_Ll, 0x1D78A, 5}, + {CAT_Lu, 0x1D790, 24}, + {CAT_Sm, 0x1D7A9, 0}, + {CAT_Ll, 0x1D7AA, 24}, + {CAT_Sm, 0x1D7C3, 0}, + {CAT_Ll, 0x1D7C4, 5}, + {CAT_Lu, 0x1D7CA, 0}, + {CAT_Ll, 0x1D7CB, 0}, + {CAT_Nd, 0x1D7CE, 49}, + {CAT_So, 0x1D800, 511}, + {CAT_Mn, 0x1DA00, 54}, + {CAT_So, 0x1DA37, 3}, + {CAT_Mn, 0x1DA3B, 49}, + {CAT_So, 0x1DA6D, 7}, + {CAT_Mn, 0x1DA75, 0}, + {CAT_So, 0x1DA76, 13}, + {CAT_Mn, 0x1DA84, 0}, + {CAT_So, 0x1DA85, 1}, + {CAT_Po, 0x1DA87, 4}, + {CAT_Mn, 0x1DA9B, 4}, + {CAT_Mn, 0x1DAA1, 14}, + {CAT_Ll, 0x1DF00, 9}, + {CAT_Lo, 0x1DF0A, 0}, + {CAT_Ll, 0x1DF0B, 19}, + {CAT_Ll, 0x1DF25, 5}, + {CAT_Mn, 0x1E000, 6}, + {CAT_Mn, 0x1E008, 16}, + {CAT_Mn, 0x1E01B, 6}, + {CAT_Mn, 0x1E023, 1}, + {CAT_Mn, 0x1E026, 4}, + {CAT_Lm, 0x1E030, 61}, + {CAT_Mn, 0x1E08F, 0}, + {CAT_Lo, 0x1E100, 44}, + {CAT_Mn, 0x1E130, 6}, + {CAT_Lm, 0x1E137, 6}, + {CAT_Nd, 0x1E140, 9}, + {CAT_Lo, 0x1E14E, 0}, + {CAT_So, 0x1E14F, 0}, + {CAT_Lo, 0x1E290, 29}, + {CAT_Mn, 0x1E2AE, 0}, + {CAT_Lo, 0x1E2C0, 43}, + {CAT_Mn, 0x1E2EC, 3}, + {CAT_Nd, 0x1E2F0, 9}, + {CAT_Sc, 0x1E2FF, 0}, + {CAT_Lo, 0x1E4D0, 26}, + {CAT_Lm, 0x1E4EB, 0}, + {CAT_Mn, 0x1E4EC, 3}, + {CAT_Nd, 0x1E4F0, 9}, + {CAT_Lo, 0x1E7E0, 6}, + {CAT_Lo, 0x1E7E8, 3}, + {CAT_Lo, 0x1E7ED, 1}, + {CAT_Lo, 0x1E7F0, 14}, + {CAT_Lo, 0x1E800, 196}, + {CAT_No, 0x1E8C7, 8}, + {CAT_Mn, 0x1E8D0, 6}, + {CAT_LC, 0x1E900, 67}, + {CAT_Mn, 0x1E944, 6}, + {CAT_Lm, 0x1E94B, 0}, + {CAT_Nd, 0x1E950, 9}, + {CAT_Po, 0x1E95E, 1}, + {CAT_No, 0x1EC71, 58}, + {CAT_So, 0x1ECAC, 0}, + {CAT_No, 0x1ECAD, 2}, + {CAT_Sc, 0x1ECB0, 0}, + {CAT_No, 0x1ECB1, 3}, + {CAT_No, 0x1ED01, 44}, + {CAT_So, 0x1ED2E, 0}, + {CAT_No, 0x1ED2F, 14}, + {CAT_Lo, 0x1EE00, 3}, + {CAT_Lo, 0x1EE05, 26}, + {CAT_Lo, 0x1EE21, 1}, + {CAT_Lo, 0x1EE24, 0}, + {CAT_Lo, 0x1EE27, 0}, + {CAT_Lo, 0x1EE29, 9}, + {CAT_Lo, 0x1EE34, 3}, + {CAT_Lo, 0x1EE39, 0}, + {CAT_Lo, 0x1EE3B, 0}, + {CAT_Lo, 0x1EE42, 0}, + {CAT_Lo, 0x1EE47, 0}, + {CAT_Lo, 0x1EE49, 0}, + {CAT_Lo, 0x1EE4B, 0}, + {CAT_Lo, 0x1EE4D, 2}, + {CAT_Lo, 0x1EE51, 1}, + {CAT_Lo, 0x1EE54, 0}, + {CAT_Lo, 0x1EE57, 0}, + {CAT_Lo, 0x1EE59, 0}, + {CAT_Lo, 0x1EE5B, 0}, + {CAT_Lo, 0x1EE5D, 0}, + {CAT_Lo, 0x1EE5F, 0}, + {CAT_Lo, 0x1EE61, 1}, + {CAT_Lo, 0x1EE64, 0}, + {CAT_Lo, 0x1EE67, 3}, + {CAT_Lo, 0x1EE6C, 6}, + {CAT_Lo, 0x1EE74, 3}, + {CAT_Lo, 0x1EE79, 3}, + {CAT_Lo, 0x1EE7E, 0}, + {CAT_Lo, 0x1EE80, 9}, + {CAT_Lo, 0x1EE8B, 16}, + {CAT_Lo, 0x1EEA1, 2}, + {CAT_Lo, 0x1EEA5, 4}, + {CAT_Lo, 0x1EEAB, 16}, + {CAT_Sm, 0x1EEF0, 1}, + {CAT_So, 0x1F000, 43}, + {CAT_So, 0x1F030, 99}, + {CAT_So, 0x1F0A0, 14}, + {CAT_So, 0x1F0B1, 14}, + {CAT_So, 0x1F0C1, 14}, + {CAT_So, 0x1F0D1, 36}, + {CAT_No, 0x1F100, 12}, + {CAT_So, 0x1F10D, 160}, + {CAT_So, 0x1F1E6, 28}, + {CAT_So, 0x1F210, 43}, + {CAT_So, 0x1F240, 8}, + {CAT_So, 0x1F250, 1}, + {CAT_So, 0x1F260, 5}, + {CAT_So, 0x1F300, 250}, + {CAT_Sk, 0x1F3FB, 4}, + {CAT_So, 0x1F400, 727}, + {CAT_So, 0x1F6DC, 16}, + {CAT_So, 0x1F6F0, 12}, + {CAT_So, 0x1F700, 118}, + {CAT_So, 0x1F77B, 94}, + {CAT_So, 0x1F7E0, 11}, + {CAT_So, 0x1F7F0, 0}, + {CAT_So, 0x1F800, 11}, + {CAT_So, 0x1F810, 55}, + {CAT_So, 0x1F850, 9}, + {CAT_So, 0x1F860, 39}, + {CAT_So, 0x1F890, 29}, + {CAT_So, 0x1F8B0, 1}, + {CAT_So, 0x1F900, 339}, + {CAT_So, 0x1FA60, 13}, + {CAT_So, 0x1FA70, 12}, + {CAT_So, 0x1FA80, 8}, + {CAT_So, 0x1FA90, 45}, + {CAT_So, 0x1FABF, 6}, + {CAT_So, 0x1FACE, 13}, + {CAT_So, 0x1FAE0, 8}, + {CAT_So, 0x1FAF0, 8}, + {CAT_So, 0x1FB00, 146}, + {CAT_So, 0x1FB94, 54}, + {CAT_Nd, 0x1FBF0, 9}, + {CAT_Lo, 0x20000, 42719}, + {CAT_Lo, 0x2A700, 4153}, + {CAT_Lo, 0x2B740, 221}, + {CAT_Lo, 0x2B820, 5761}, + {CAT_Lo, 0x2CEB0, 7472}, + {CAT_Lo, 0x2F800, 541}, + {CAT_Lo, 0x30000, 4938}, + {CAT_Lo, 0x31350, 4191}, + {CAT_Cf, 0xE0001, 0}, + {CAT_Cf, 0xE0020, 95}, + {CAT_Mn, 0xE0100, 239}, diff --git a/lib/ctype/ctype.tex b/lib/ctype/ctype.tex new file mode 100644 index 0000000..1cd223e --- /dev/null +++ b/lib/ctype/ctype.tex @@ -0,0 +1,143 @@ +@node Ctype +@chapter Character Type Macros and Functions (@file{ctype.h}) +This chapter groups macros (which are also available as subroutines) +to classify characters into several categories (alphabetic, +numeric, control characters, whitespace, and so on), or to perform +simple character mappings. + +The header file @file{ctype.h} defines the macros. +@menu +* isalnum:: Alphanumeric character predicate (isalnum, isalnum_l) +* isalpha:: Alphabetic character predicate (isalpha, isalpha_l) +* isascii:: ASCII character predicate (isascii, isascii_l) +* isblank:: Blank character predicate (isblank, isblank_l) +* iscntrl:: Control character predicate (iscntrl, iscntrl_l) +* isdigit:: Decimal digit predicate (isdigit, isdigit_l) +* islower:: Lowercase character predicate (islower, islower_l) +* isprint:: Printable character predicates (isprint, isprint_l. isgraph, isgraph_l) +* ispunct:: Punctuation character predicate (ispunct, ispunct_l) +* isspace:: Whitespace character predicate (isspace, isspace_l) +* isupper:: Uppercase character predicate (isupper, isupper_l) +* isxdigit:: Hexadecimal digit predicate (isxdigit, isxdigit_l) +* toascii:: Force integers to ASCII range (toascii, toascii_l) +* tolower:: Translate characters to lowercase (tolower, tolower_l) +* toupper:: Translate characters to uppercase (toupper, toupper_l) +* iswalnum:: Alphanumeric wide character predicate (iswalnum, iswalnum_l) +* iswalpha:: Alphabetic wide character predicate (iswalpha, iswalpha_l) +* iswblank:: Blank wide character predicate (iswblank, iswblank_l) +* iswcntrl:: Control wide character predicate (iswcntrl, iswcntrl_l) +* iswdigit:: Decimal digit wide character predicate (iswdigit, iswdigit_l) +* iswgraph:: Graphic wide character predicate (iswgraph, iswgraph_l) +* iswlower:: Lowercase wide character predicate (iswlower, iswlower_l) +* iswprint:: Printable wide character predicate (iswprint, iswprint_l) +* iswpunct:: Punctuation wide character predicate (iswpunct, iswpunct_l) +* iswspace:: Whitespace wide character predicate (iswspace, iswspace_l) +* iswupper:: Uppercase wide character predicate (iswupper, iswupper_l) +* iswxdigit:: Hexadecimal digit wide character predicate (iswxdigit, iswxdigit_l) +* iswctype:: Extensible wide-character test (iswctype, iswctype_l) +* wctype:: Compute wide-character test type (wctype, wctype_l) +* towlower:: Translate wide characters to lowercase (towlower, towlower_l) +* towupper:: Translate wide characters to uppercase (towupper, towupper_l) +* towctrans:: Extensible wide-character translation (towctrans, towctrans_l) +* wctrans:: Compute wide-character translation type (wctrans, wctrans_l) +@end menu + +@page +@include ctype/isalnum.def + +@page +@include ctype/isalpha.def + +@page +@include ctype/isascii.def + +@page +@include ctype/isblank.def + +@page +@include ctype/iscntrl.def + +@page +@include ctype/isdigit.def + +@page +@include ctype/islower.def + +@page +@include ctype/isprint.def + +@page +@include ctype/ispunct.def + +@page +@include ctype/isspace.def + +@page +@include ctype/isupper.def + +@page +@include ctype/isxdigit.def + +@page +@include ctype/toascii.def + +@page +@include ctype/tolower.def + +@page +@include ctype/toupper.def + +@page +@include ctype/iswalnum.def + +@page +@include ctype/iswalpha.def + +@page +@include ctype/iswcntrl.def + +@page +@include ctype/iswblank.def + +@page +@include ctype/iswdigit.def + +@page +@include ctype/iswgraph.def + +@page +@include ctype/iswlower.def + +@page +@include ctype/iswprint.def + +@page +@include ctype/iswpunct.def + +@page +@include ctype/iswspace.def + +@page +@include ctype/iswupper.def + +@page +@include ctype/iswxdigit.def + +@page +@include ctype/iswctype.def + +@page +@include ctype/wctype.def + +@page +@include ctype/towlower.def + +@page +@include ctype/towupper.def + +@page +@include ctype/towctrans.def + +@page +@include ctype/wctrans.def + diff --git a/lib/ctype/ctype_.c b/lib/ctype/ctype_.c new file mode 100644 index 0000000..32ce4f3 --- /dev/null +++ b/lib/ctype/ctype_.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)ctype_.c 5.6 (Berkeley) 6/1/90"; +#endif /* LIBC_SCCS and not lint */ + +#include "ctype_.h" +#include "../locale/setlocale.h" + +#define _CTYPE_DATA_0_127 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C|_S, _C|_S, _C|_S, _C|_S, _C|_S, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _N, _N, _N, _N, _N, _N, _N, _N, \ + _N, _N, _P, _P, _P, _P, _P, _P, \ + _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _P, _P, _P, _P, _P, \ + _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _P, _P, _P, _P, _C + +#define _CTYPE_DATA_128_255 \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0 + +#if defined(_MB_CAPABLE) +#if defined(_MB_EXTENDED_CHARSETS_ISO) +#include "ctype_iso.h" +#endif +#if defined(_MB_EXTENDED_CHARSETS_WINDOWS) +#include "ctype_cp.h" +#endif +#endif + +#if defined(ALLOW_NEGATIVE_CTYPE_INDEX) +/* No static const on Cygwin since it's referenced and potentially overwritten + for compatibility with older applications. */ +#ifndef __CYGWIN__ +const +#endif +char _ctype_b[128 + 256] = { + _CTYPE_DATA_128_255, + _CTYPE_DATA_0_127, + _CTYPE_DATA_128_255 +}; + +# ifdef __CYGWIN__ +/* For backward compatibility */ +char __EXPORT *__ctype_ptr__ = DEFAULT_CTYPE_PTR; + +# ifdef __x86_64__ +__asm__ (" \n\ + .data \n\ + .globl _ctype_ \n\ + .set _ctype_,_ctype_b+127 \n\ + .text \n\ +"); +# else +__asm__ (" \n\ + .data \n\ + .globl __ctype_ \n\ + .set __ctype_,__ctype_b+127 \n\ + .text \n\ +"); +# endif +# else /* !__CYGWIN__ */ + +const char _ctype_[1 + 256] = { + 0, + _CTYPE_DATA_0_127, + _CTYPE_DATA_128_255 +}; +# endif /* !__CYGWIN__ */ + +#else /* !ALLOW_NEGATIVE_CTYPE_INDEX */ + +const char _ctype_[1 + 256] = { + 0, + _CTYPE_DATA_0_127, + _CTYPE_DATA_128_255 +}; + +#endif /* !ALLOW_NEGATIVE_CTYPE_INDEX */ + +#if defined(_MB_CAPABLE) +/* Cygwin has its own implementation which additionally maintains backward + compatibility with applications built under older Cygwin releases. */ +#ifndef __CYGWIN__ +void +__set_ctype (struct __locale_t *loc, const char *charset) +{ +#if defined(_MB_EXTENDED_CHARSETS_ISO) || defined(_MB_EXTENDED_CHARSETS_WINDOWS) + int idx; +#endif + char *ctype_ptr = NULL; + + switch (*charset) + { +#if defined(_MB_EXTENDED_CHARSETS_ISO) + case 'I': + idx = __iso_8859_index (charset + 9); + /* The ctype table has a leading ISO-8859-1 element so we have to add + 1 to the index returned by __iso_8859_index. If __iso_8859_index + returns < 0, it's ISO-8859-1. */ + if (idx < 0) + idx = 0; + else + ++idx; + ctype_ptr = __ctype_iso[idx]; + break; +#endif +#if defined(_MB_EXTENDED_CHARSETS_WINDOWS) + case 'C': + idx = __cp_index (charset + 2); + if (idx < 0) + break; + ctype_ptr = __ctype_cp[idx]; + break; +#endif + default: + break; + } + if (!ctype_ptr) + { +# if defined(ALLOW_NEGATIVE_CTYPE_INDEX) + ctype_ptr = _ctype_b; +# else + ctype_ptr = _ctype_; +# endif + } +# if defined(ALLOW_NEGATIVE_CTYPE_INDEX) + loc->ctype_ptr = ctype_ptr + 127; +# else + loc->ctype_ptr = ctype_ptr; +# endif +} +#endif /* !__CYGWIN__ */ +#endif /* _MB_CAPABLE */ diff --git a/lib/ctype/ctype_.h b/lib/ctype/ctype_.h new file mode 100644 index 0000000..a73870b --- /dev/null +++ b/lib/ctype/ctype_.h @@ -0,0 +1,22 @@ +#include + +#if (defined(__GNUC__) && !defined(__CHAR_UNSIGNED__) && !defined(COMPACT_CTYPE)) || defined (__CYGWIN__) +#define ALLOW_NEGATIVE_CTYPE_INDEX +#endif + +#ifdef ALLOW_NEGATIVE_CTYPE_INDEX + +#ifndef __CYGWIN__ + extern const char _ctype_b[]; +#else + extern char _ctype_b[]; +#endif +# define DEFAULT_CTYPE_PTR ((char *) _ctype_b + 127) + +#else /* !ALLOW_NEGATIVE_CTYPE_INDEX */ + + /* _ctype_ is declared in . */ +# define DEFAULT_CTYPE_PTR ((char *) _ctype_) + +#endif /* !ALLOW_NEGATIVE_CTYPE_INDEX */ + diff --git a/lib/ctype/ctype_cp.h b/lib/ctype/ctype_cp.h new file mode 100644 index 0000000..f6aa2e5 --- /dev/null +++ b/lib/ctype/ctype_cp.h @@ -0,0 +1,801 @@ +/* ctype table definitions for Windows codepage charsets. + Included by ctype_.c. */ + +#define _CTYPE_CP437_128_254 \ + _U, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _U, _U, \ + _U, _L, _U, _L, _L, _L, _L, _L, \ + _L, _U, _U, _P, _P, _P, _P, _P, \ + _L, _L, _L, _L, _L, _L, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _U, _L, _U, _L, _P, _L, \ + _U, _U, _U, _L, _P, _L, _L, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP437_255 _S|_B +#define _CTYPE_CP720_128_254 \ + 0, 0, _L, _L, 0, _L, 0, _L, \ + _L, _L, _L, _L, _L, 0, 0, 0, \ + 0, _P, _P, _L, _P, _P, _L, _L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _P, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _P, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP720_255 _S|_B +#define _CTYPE_CP737_128_254 \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _U, _U, _U, _U, _U, _U, \ + _U, _P, _P, _P, _U, _U, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP737_255 _S|_B +#define _CTYPE_CP775_128_254 \ + _U, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _U, _L, _L, _U, _U, _U, \ + _U, _L, _U, _L, _L, _U, _P, _U, \ + _L, _U, _U, _L, _P, _U, _P, _P, \ + _U, _U, _L, _U, _L, _L, _P, _P, \ + _P, _P, _P, _P, _P, _U, _P, _P, \ + _P, _P, _P, _P, _P, _U, _U, _U, \ + _U, _P, _P, _P, _P, _U, _U, _P, \ + _P, _P, _P, _P, _P, _P, _U, _U, \ + _P, _P, _P, _P, _P, _P, _P, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _P, _P, _P, _P, _P, _P, _P, \ + _U, _L, _U, _U, _L, _U, _P, _L, \ + _U, _L, _U, _L, _L, _U, _U, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP775_255 _S|_B +#define _CTYPE_CP850_128_254 \ + _U, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _U, _U, \ + _U, _L, _U, _L, _L, _L, _L, _L, \ + _L, _U, _U, _L, _P, _U, _P, _L, \ + _L, _L, _L, _L, _L, _U, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _U, _U, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _L, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _U, _U, _U, _U, _L, _U, _U, \ + _U, _P, _P, _P, _P, _P, _U, _P, \ + _U, _L, _U, _U, _L, _U, _P, _L, \ + _U, _U, _U, _U, _L, _U, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP850_255 _S|_B +#define _CTYPE_CP852_128_254 \ + _U, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _U, _L, _L, _U, _U, _U, \ + _U, _U, _L, _L, _L, _U, _L, _U, \ + _L, _U, _U, _U, _L, _U, _P, _L, \ + _L, _L, _L, _L, _U, _L, _U, _L, \ + _U, _L, _P, _L, _U, _L, _P, _P, \ + _P, _P, _P, _P, _P, _U, _U, _U, \ + _U, _P, _P, _P, _P, _U, _L, _P, \ + _P, _P, _P, _P, _P, _P, _U, _L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _U, _U, _U, _L, _U, _U, _U, \ + _L, _P, _P, _P, _P, _U, _U, _P, \ + _U, _L, _U, _U, _L, _L, _U, _L, \ + _U, _U, _L, _U, _L, _U, _L, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _L, _U, _L, _P +#define _CTYPE_CP852_255 _S|_B +#define _CTYPE_CP855_128_254 \ + _L, _U, _L, _U, _L, _U, _L, _U, \ + _L, _U, _L, _U, _L, _U, _L, _U, \ + _L, _U, _L, _U, _L, _U, _L, _U, \ + _L, _U, _L, _U, _L, _U, _L, _U, \ + _L, _U, _L, _U, _L, _U, _L, _U, \ + _L, _U, _L, _U, _L, _U, _P, _P, \ + _P, _P, _P, _P, _P, _L, _U, _L, \ + _U, _P, _P, _P, _P, _L, _U, _P, \ + _P, _P, _P, _P, _P, _P, _L, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _U, _L, _U, _L, _U, _L, _U, \ + _L, _P, _P, _P, _P, _U, _L, _P, \ + _U, _L, _U, _L, _U, _L, _U, _L, \ + _U, _L, _U, _L, _U, _L, _U, _P, \ + _P, _L, _U, _L, _U, _L, _U, _L, \ + _U, _L, _U, _L, _U, _P, _P +#define _CTYPE_CP855_255 _S|_B +#define _CTYPE_CP857_128_254 \ + _U, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _U, _U, \ + _U, _L, _U, _L, _L, _L, _L, _L, \ + _U, _U, _U, _L, _P, _U, _U, _L, \ + _L, _L, _L, _L, _L, _U, _U, _L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _U, _U, _U, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _L, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _U, _U, _U, 0, _U, _U, \ + _U, _P, _P, _P, _P, _P, _U, _P, \ + _U, _L, _U, _U, _L, _U, _P, 0, \ + _P, _U, _U, _U, _L, _L, _P, _P, \ + _P, _P, 0, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP857_255 _S|_B +#define _CTYPE_CP858_128_254 \ + _U, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _U, _U, \ + _U, _L, _U, _L, _L, _L, _L, _L, \ + _L, _U, _U, _L, _P, _U, _P, _L, \ + _L, _L, _L, _L, _L, _U, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _U, _U, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _L, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _U, _U, _U, _U, _P, _U, _U, \ + _U, _P, _P, _P, _P, _P, _U, _P, \ + _U, _L, _U, _U, _L, _U, _P, _L, \ + _U, _U, _U, _U, _L, _U, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP858_255 _S|_B +#define _CTYPE_CP862_128_254 \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _P, _P, _P, _P, _L, \ + _L, _L, _L, _L, _L, _U, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _U, _L, _U, _L, _P, _L, \ + _U, _U, _U, _L, _P, _L, _L, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP862_255 _S|_B +#define _CTYPE_CP866_128_254 \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _U, _L, _U, _L, _U, _L, _U, _L, \ + _P, _P, _P, _P, _P, _P, _P +#define _CTYPE_CP866_255 _S|_B +#define _CTYPE_CP874_128_254 \ + _P, 0, 0, 0, 0, _P, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + _S|_B, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, 0, 0, 0, 0, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _U|_L, _U|_L, 0, 0, 0 +#define _CTYPE_CP874_255 0 +#define _CTYPE_CP1125_128_254 \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _U, _L, _U, _L, _U, _L, _U, _L, \ + _U, _L, _P, _P, _P, _P, _P +#define _CTYPE_CP1125_255 _S|_B +#define _CTYPE_CP1250_128_254 \ + _P, 0, _P, 0, _P, _P, _P, _P, \ + 0, _P, _U, _P, _U, _U, _U, _U, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + 0, _P, _L, _P, _L, _L, _L, _L, \ + _S|_B, _P, _P, _U, _P, _U, _P, _P, \ + _P, _P, _U, _P, _P, _P, _P, _U, \ + _P, _P, _P, _L, _P, _P, _P, _P, \ + _P, _L, _L, _P, _U, _P, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_CP1250_255 _P +#define _CTYPE_CP1251_128_254 \ + _U, _U, _P, _L, _P, _P, _P, _P, \ + _P, _P, _U, _P, _U, _U, _U, _U, \ + _L, _P, _P, _P, _P, _P, _P, _P, \ + 0, _P, _L, _P, _L, _L, _L, _L, \ + _S|_B, _U, _L, _U, _P, _U, _P, _P, \ + _U, _P, _U, _P, _P, _P, _P, _U, \ + _P, _P, _U, _L, _L, _P, _P, _P, \ + _L, _P, _L, _P, _L, _U, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_CP1251_255 _L +#define _CTYPE_CP1252_128_254 \ + _P, 0, _P, _L, _P, _P, _P, _P, \ + _P, _P, _U, _P, _U, _U, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _L, _P, _L, 0, _L, _U, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_CP1252_255 _L +#define _CTYPE_CP1253_128_254 \ + _P, 0, _P, _L, _P, _P, _P, _P, \ + 0, _P, 0, _P, 0, 0, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + 0, _P, 0, _P, 0, 0, 0, 0, \ + _S|_B, _P, _U, _P, _P, _P, _P, _P, \ + _P, _P, 0, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U, _U, _U, _P, _U, _P, _U, _U, \ + _L, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_CP1253_255 _L +#define _CTYPE_CP1254_128_254 \ + _P, 0, _P, _L, _P, _P, _P, _P, \ + _P, _P, _U, _P, _U, 0, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _L, _P, _L, 0, 0, _U, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_CP1254_255 _L +#define _CTYPE_CP1255_128_254 \ + _P, 0, _P, _L, _P, _P, _P, _P, \ + _P, _P, 0, _P, 0, 0, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, 0, _P, 0, 0, 0, 0, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _U|_L, _U|_L, _U|_L, _P, \ + _P, 0, 0, 0, 0, 0, 0, 0, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, 0, 0, _P, _P +#define _CTYPE_CP1255_255 0 +#define _CTYPE_CP1256_128_254 \ + _P, _U|_L, _P, _L, _P, _P, _P, _P, \ + _P, _P, _U|_L, _P, _U, _U|_L, _U|_L, _U|_L, \ + _U|_L, _P, _P, _P, _P, _P, _P, _P, \ + _U|_L, _P, _U|_L, _P, _L, _P, _P, _U|_L, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _U|_L, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _P, _U|_L, _U|_L, _U|_L, \ + _L, _U|_L, _L, _U|_L, _U|_L, _U|_L, _U|_L, _L, \ + _L, _L, _L, _L, _U|_L, _U|_L, _L, _L, \ + _P, _P, _P, _P, _L, _P, _P, _P, \ + _P, _L, _P, _L, _L, _P, _P +#define _CTYPE_CP1256_255 _U|_L +#define _CTYPE_CP1257_128_254 \ + _P, 0, _P, 0, _P, _P, _P, _P, \ + 0, _P, 0, _P, 0, _P, _P, _P, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + 0, _P, 0, _P, 0, _P, _P, 0, \ + _S|_B, 0, _P, _P, _P, 0, _P, _P, \ + _U, _P, _U, _P, _P, _P, _P, _U, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _P, _L, _P, _P, _P, _P, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_CP1257_255 _P +#define _CTYPE_CP1258_128_254 \ + _P, 0, _P, _L, _P, _P, _P, _P, \ + _P, _P, 0, _P, _U, 0, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, 0, _P, _L, 0, 0, _U, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _P, _U, _U, _U, \ + _U, _U, _P, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _P, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _P, _L, _L, _L, \ + _L, _L, _P, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _P +#define _CTYPE_CP1258_255 _L +#define _CTYPE_CP20866_128_254 \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _S|_B, _P, _P, _P, _P, _P, \ + _P, _P, _P, _L, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _U, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U +#define _CTYPE_CP20866_255 _U +#define _CTYPE_CP21866_128_254 \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _S|_B, _P, _P, _P, _P, _P, \ + _P, _P, _P, _L, _L, _P, _L, _L, \ + _P, _P, _P, _P, _P, _L, _P, _P, \ + _P, _P, _P, _U, _U, _P, _U, _U, \ + _P, _P, _P, _P, _P, _U, _P, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U +#define _CTYPE_CP21866_255 _U +#define _CTYPE_GEORGIAN_PS_128_254 \ + _P, 0, _P, _L, _P, _P, _P, _P, \ + _P, _P, _U, _P, _U, _U, 0, 0, \ + 0, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _L, _P, _L, 0, _L, _U, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_GEORGIAN_PS_255 _L +#define _CTYPE_PT154_128_254 \ + _U, _U, _U, _L, _P, _P, _U, _U, \ + _U, _L, _U, _U, _U, _U, _U, _U, \ + _L, _P, _P, _P, _P, _P, _P, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _S|_B, _U, _L, _U, _U, _U, _U, _P, \ + _U, _P, _U, _P, _P, _L, _P, _U, \ + _P, _L, _U, _L, _L, _L, _P, _P, \ + _L, _P, _L, _P, _L, _U, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_PT154_255 _L +#define _CTYPE_CP103_128_254 \ + _L, _L, _P, _U, _P, _P, _P, _P, \ + 0, _P, _L, _P, _U, _L, _U, 0, \ + _U, _P, _P, _P, _P, _P, _P, _P, \ + 0, _P, 0, _P, 0, 0, 0, 0, \ + 0, _L, _U, _L, _P, _L, _P, _P, \ + 0, 0, 0, _P, _P, _P, _P, 0, \ + _P, _P, _P, _U, 0, _U, _P, _P, \ + 0, _P, 0, _P, 0, 0, 0, _P, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U +#define _CTYPE_CP103_255 _U + +#if defined(ALLOW_NEGATIVE_CTYPE_INDEX) + +#ifndef __CYGWIN__ +static const +#endif +char __ctype_cp[27][128 + 256] = { + { _CTYPE_CP437_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP437_128_254, + _CTYPE_CP437_255 + }, + { _CTYPE_CP720_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP720_128_254, + _CTYPE_CP720_255 + }, + { _CTYPE_CP737_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP737_128_254, + _CTYPE_CP737_255 + }, + { _CTYPE_CP775_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP775_128_254, + _CTYPE_CP775_255 + }, + { _CTYPE_CP850_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP850_128_254, + _CTYPE_CP850_255 + }, + { _CTYPE_CP852_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP852_128_254, + _CTYPE_CP852_255 + }, + { _CTYPE_CP855_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP855_128_254, + _CTYPE_CP855_255 + }, + { _CTYPE_CP857_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP857_128_254, + _CTYPE_CP857_255 + }, + { _CTYPE_CP858_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP858_128_254, + _CTYPE_CP858_255 + }, + { _CTYPE_CP862_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP862_128_254, + _CTYPE_CP862_255 + }, + { _CTYPE_CP866_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP866_128_254, + _CTYPE_CP866_255 + }, + { _CTYPE_CP874_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP874_128_254, + _CTYPE_CP874_255 + }, + { _CTYPE_CP1125_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1125_128_254, + _CTYPE_CP1125_255 + }, + { _CTYPE_CP1250_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1250_128_254, + _CTYPE_CP1250_255 + }, + { _CTYPE_CP1251_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1251_128_254, + _CTYPE_CP1251_255 + }, + { _CTYPE_CP1252_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1252_128_254, + _CTYPE_CP1252_255 + }, + { _CTYPE_CP1253_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1253_128_254, + _CTYPE_CP1253_255 + }, + { _CTYPE_CP1254_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1254_128_254, + _CTYPE_CP1254_255 + }, + { _CTYPE_CP1255_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1255_128_254, + _CTYPE_CP1255_255 + }, + { _CTYPE_CP1256_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1256_128_254, + _CTYPE_CP1256_255 + }, + { _CTYPE_CP1257_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1257_128_254, + _CTYPE_CP1257_255 + }, + { _CTYPE_CP1258_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1258_128_254, + _CTYPE_CP1258_255 + }, + { _CTYPE_CP20866_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP20866_128_254, + _CTYPE_CP20866_255 + }, + { _CTYPE_CP21866_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP21866_128_254, + _CTYPE_CP21866_255 + }, + { _CTYPE_GEORGIAN_PS_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_GEORGIAN_PS_128_254, + _CTYPE_GEORGIAN_PS_255 + }, + { _CTYPE_PT154_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_PT154_128_254, + _CTYPE_PT154_255 + }, + { _CTYPE_CP103_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_CP103_128_254, + _CTYPE_CP103_255 + }, +}; + +#else /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */ + +static const char __ctype_cp[27][1 + 256] = { + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP437_128_254, + _CTYPE_CP437_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP720_128_254, + _CTYPE_CP720_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP737_128_254, + _CTYPE_CP737_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP775_128_254, + _CTYPE_CP775_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP850_128_254, + _CTYPE_CP850_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP852_128_254, + _CTYPE_CP852_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP855_128_254, + _CTYPE_CP855_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP857_128_254, + _CTYPE_CP857_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP858_128_254, + _CTYPE_CP858_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP862_128_254, + _CTYPE_CP862_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP866_128_254, + _CTYPE_CP866_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP874_128_254, + _CTYPE_CP874_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1125_128_254, + _CTYPE_CP1125_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1250_128_254, + _CTYPE_CP1250_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1251_128_254, + _CTYPE_CP1251_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1252_128_254, + _CTYPE_CP1252_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1253_128_254, + _CTYPE_CP1253_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1254_128_254, + _CTYPE_CP1254_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1255_128_254, + _CTYPE_CP1255_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1256_128_254, + _CTYPE_CP1256_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1257_128_254, + _CTYPE_CP1257_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP1258_128_254, + _CTYPE_CP1258_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP20866_128_254, + _CTYPE_CP20866_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP21866_128_254, + _CTYPE_CP21866_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_GEORGIAN_PS_128_254, + _CTYPE_GEORGIAN_PS_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_PT154_128_254, + _CTYPE_PT154_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_CP103_128_254, + _CTYPE_CP103_255 + }, +}; + +#endif /* ALLOW_NEGATIVE_CTYPE_INDEX */ diff --git a/lib/ctype/ctype_iso.h b/lib/ctype/ctype_iso.h new file mode 100644 index 0000000..616e4cc --- /dev/null +++ b/lib/ctype/ctype_iso.h @@ -0,0 +1,455 @@ +/* ctype table definitions for ISO-8859-x charsets. + Included by ctype_.c. */ + +#define _CTYPE_ISO_8859_1_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_1_255 _L +#define _CTYPE_ISO_8859_2_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _P, _U, _P, _U, _U, _P, \ + _P, _U, _U, _U, _U, _P, _U, _U, \ + _P, _L, _P, _L, _P, _L, _L, _P, \ + _P, _L, _L, _L, _L, _P, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_2_255 _P +#define _CTYPE_ISO_8859_3_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _P, _P, _P, 0, _U, _P, \ + _P, _U, _U, _U, _U, _P, 0, _U, \ + _P, _L, _P, _P, _P, _P, _L, _P, \ + _P, _L, _L, _L, _L, _P, 0, _L, \ + _U, _U, _U, 0, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + 0, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, 0, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + 0, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_3_255 _P +#define _CTYPE_ISO_8859_4_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _L, _U, _P, _U, _U, _P, \ + _P, _U, _U, _U, _U, _P, _U, _P, \ + _P, _L, _P, _L, _P, _L, _L, _P, \ + _P, _L, _L, _L, _L, _P, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_4_255 _L +#define _CTYPE_ISO_8859_5_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _P, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _P, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _P, _L +#define _CTYPE_ISO_8859_5_255 _L +#define _CTYPE_ISO_8859_6_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, 0, 0, 0, _P, 0, 0, 0, \ + 0, 0, 0, 0, _P, _P, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, _P, 0, 0, 0, _P, \ + 0, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, 0, 0, 0, 0, 0, \ + _P, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _P, _P, _P, _P, _P, \ + _P, _P, _P, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0 +#define _CTYPE_ISO_8859_6_255 0 +#define _CTYPE_ISO_8859_7_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, 0, _P, \ + _P, _P, _P, _P, _P, _P, _U, _P, \ + _U, _U, _U, _P, _U, _P, _U, _U, \ + _L, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_7_255 0 +#define _CTYPE_ISO_8859_8_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, 0, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, 0, 0, _P, _P +#define _CTYPE_ISO_8859_8_255 0 +#define _CTYPE_ISO_8859_9_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_9_255 _L +#define _CTYPE_ISO_8859_10_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _P, _U, _U, \ + _P, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _P, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_10_255 _L +#define _CTYPE_ISO_8859_11_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _P, _U|_L, _U|_L, _P, _P, _P, _P, \ + _P, _P, _P, 0, 0, 0, 0, _P, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _P, \ + _P, _P, _P, _P, _P, _P, _P, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, _U|_L, \ + _U|_L, _U|_L, _U|_L, _U|_L, 0, 0, 0 +#define _CTYPE_ISO_8859_11_255 0 +#define _CTYPE_ISO_8859_13_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _P, _P, \ + _U, _P, _U, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _P, _P, _P, _P, \ + _L, _P, _L, _P, _P, _P, _P, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_13_255 _P +#define _CTYPE_ISO_8859_14_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _L, _P, _U, _L, _U, _P, \ + _U, _P, _U, _L, _U, _P, _P, _U, \ + _U, _L, _U, _L, _U, _L, _P, _U, \ + _L, _L, _L, _U, _L, _U, _L, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_14_255 _L +#define _CTYPE_ISO_8859_15_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _P, _P, _P, _P, _P, _U, _P, \ + _L, _P, _P, _P, _P, _P, _P, _P, \ + _P, _P, _P, _P, _U, _P, _P, _P, \ + _L, _P, _P, _P, _U, _L, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _P, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _P, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_15_255 _L +#define _CTYPE_ISO_8859_16_128_254 \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _C, _C, _C, _C, _C, _C, _C, _C, \ + _S|_B, _U, _L, _U, _P, _P, _U, _P, \ + _L, _P, _U, _P, _U, _P, _L, _U, \ + _P, _P, _U, _U, _U, _P, _P, _P, \ + _L, _L, _L, _P, _U, _L, _U, _L, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _U, \ + _U, _U, _U, _U, _U, _U, _U, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L, _L, \ + _L, _L, _L, _L, _L, _L, _L +#define _CTYPE_ISO_8859_16_255 _L + +extern int __iso_8859_index (const char *charset_ext); + +#if defined(ALLOW_NEGATIVE_CTYPE_INDEX) + +#ifndef __CYGWIN__ +static const +#endif +char __ctype_iso[15][128 + 256] = { + { _CTYPE_ISO_8859_1_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_1_128_254, + _CTYPE_ISO_8859_1_255 + }, + { _CTYPE_ISO_8859_2_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_2_128_254, + _CTYPE_ISO_8859_2_255 + }, + { _CTYPE_ISO_8859_3_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_3_128_254, + _CTYPE_ISO_8859_3_255 + }, + { _CTYPE_ISO_8859_4_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_4_128_254, + _CTYPE_ISO_8859_4_255 + }, + { _CTYPE_ISO_8859_5_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_5_128_254, + _CTYPE_ISO_8859_5_255 + }, + { _CTYPE_ISO_8859_6_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_6_128_254, + _CTYPE_ISO_8859_6_255 + }, + { _CTYPE_ISO_8859_7_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_7_128_254, + _CTYPE_ISO_8859_7_255 + }, + { _CTYPE_ISO_8859_8_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_8_128_254, + _CTYPE_ISO_8859_8_255 + }, + { _CTYPE_ISO_8859_9_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_9_128_254, + _CTYPE_ISO_8859_9_255 + }, + { _CTYPE_ISO_8859_10_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_10_128_254, + _CTYPE_ISO_8859_10_255 + }, + { _CTYPE_ISO_8859_11_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_11_128_254, + _CTYPE_ISO_8859_11_255 + }, + { _CTYPE_ISO_8859_13_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_13_128_254, + _CTYPE_ISO_8859_13_255 + }, + { _CTYPE_ISO_8859_14_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_14_128_254, + _CTYPE_ISO_8859_14_255 + }, + { _CTYPE_ISO_8859_15_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_15_128_254, + _CTYPE_ISO_8859_15_255 + }, + { _CTYPE_ISO_8859_16_128_254, + 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_16_128_254, + _CTYPE_ISO_8859_16_255 + }, +}; + +#else /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */ + +static const char __ctype_iso[15][1 + 256] = { + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_1_128_254, + _CTYPE_ISO_8859_1_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_2_128_254, + _CTYPE_ISO_8859_2_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_3_128_254, + _CTYPE_ISO_8859_3_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_4_128_254, + _CTYPE_ISO_8859_4_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_5_128_254, + _CTYPE_ISO_8859_5_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_6_128_254, + _CTYPE_ISO_8859_6_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_7_128_254, + _CTYPE_ISO_8859_7_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_8_128_254, + _CTYPE_ISO_8859_8_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_9_128_254, + _CTYPE_ISO_8859_9_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_10_128_254, + _CTYPE_ISO_8859_10_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_11_128_254, + _CTYPE_ISO_8859_11_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_13_128_254, + _CTYPE_ISO_8859_13_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_14_128_254, + _CTYPE_ISO_8859_14_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_15_128_254, + _CTYPE_ISO_8859_15_255 + }, + { 0, + _CTYPE_DATA_0_127, + _CTYPE_ISO_8859_16_128_254, + _CTYPE_ISO_8859_16_255 + }, +}; + +#endif /* ALLOW_NEGATIVE_CTYPE_INDEX */ diff --git a/lib/ctype/isalnum.c b/lib/ctype/isalnum.c new file mode 100644 index 0000000..d926f97 --- /dev/null +++ b/lib/ctype/isalnum.c @@ -0,0 +1,50 @@ +/* +FUNCTION + <>, <>---alphanumeric character predicate + +INDEX + isalnum +INDEX + isalnum_l + +SYNOPSIS + #include + int isalnum(int <[c]>); + + #include + int isalnum_l(int <[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for alphabetic or +numeric ASCII characters, and <<0>> for other arguments. It is defined +only if <[c]> is representable as an unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isalnum>>' or `<<#undef isalnum_l>>'. + +RETURNS +<>,<> return non-zero if <[c]> is a letter or a digit. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No OS subroutines are required. +*/ + +#include <_ansi.h> +#include + +#undef isalnum + +int +isalnum (int c) +{ + return(__CTYPE_PTR[c+1] & (_U|_L|_N)); +} diff --git a/lib/ctype/isalnum_l.c b/lib/ctype/isalnum_l.c new file mode 100644 index 0000000..dcb7e36 --- /dev/null +++ b/lib/ctype/isalnum_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef isalnum_l + +int +isalnum_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & (_U|_L|_N); +} diff --git a/lib/ctype/isalpha.c b/lib/ctype/isalpha.c new file mode 100644 index 0000000..8b8e78a --- /dev/null +++ b/lib/ctype/isalpha.c @@ -0,0 +1,49 @@ +/* +FUNCTION + <>, <>---alphabetic character predicate + +INDEX + isalpha + +INDEX + isalpha_l + +SYNOPSIS + #include + int isalpha(int <[c]>); + + #include + int isalpha_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero when <[c]> represents an +alphabetic ASCII character, and 0 otherwise. It is defined only if +<[c]> is representable as an unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isalpha>>' or `<<#undef isalpha_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a letter. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include + +#undef isalpha +int +isalpha (int c) +{ + return(__CTYPE_PTR[c+1] & (_U|_L)); +} diff --git a/lib/ctype/isalpha_l.c b/lib/ctype/isalpha_l.c new file mode 100644 index 0000000..dcae3cc --- /dev/null +++ b/lib/ctype/isalpha_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef isalpha_l + +int +isalpha_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & (_U|_L); +} diff --git a/lib/ctype/isascii.c b/lib/ctype/isascii.c new file mode 100644 index 0000000..5adb812 --- /dev/null +++ b/lib/ctype/isascii.c @@ -0,0 +1,50 @@ +/* +FUNCTION + <>, <>---ASCII character predicate + +INDEX + isascii + +INDEX + isascii_l + +SYNOPSIS + #include + int isascii(int <[c]>); + + #include + int isascii_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which returns non-zero when <[c]> is an ASCII +character, and 0 otherwise. It is defined for all integer values. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isascii>>' or `<<#undef isascii_l>>'. + +RETURNS +<>, <> return non-zero if the low order byte of <[c]> +is in the range 0 to 127 (<<0x00>>--<<0x7F>>). + +PORTABILITY +<> is ANSI C. +<> is a GNU extension. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + + + +#undef isascii + +int +isascii (int c) +{ + return c >= 0 && c< 128; +} diff --git a/lib/ctype/isascii_l.c b/lib/ctype/isascii_l.c new file mode 100644 index 0000000..59b5f95 --- /dev/null +++ b/lib/ctype/isascii_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef isascii_l + +int +isascii_l (int c, struct __locale_t *locale) +{ + return c >= 0 && c < 128; +} diff --git a/lib/ctype/isblank.c b/lib/ctype/isblank.c new file mode 100644 index 0000000..0ebc219 --- /dev/null +++ b/lib/ctype/isblank.c @@ -0,0 +1,48 @@ +/* +FUNCTION + <>, <>---blank character predicate + +INDEX + isblank + +INDEX + isblank_l + +SYNOPSIS + #include + int isblank(int <[c]>); + + #include + int isblank_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for blank characters, and 0 +for other characters. It is defined only if <[c]> is representable as an +unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a blank character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include + + + +#undef isblank +int +isblank (int c) +{ + return ((__CTYPE_PTR[c+1] & _B) || (c == '\t')); +} diff --git a/lib/ctype/isblank_l.c b/lib/ctype/isblank_l.c new file mode 100644 index 0000000..8bbb84e --- /dev/null +++ b/lib/ctype/isblank_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef isblank_l + +int +isblank_l (int c, struct __locale_t *locale) +{ + return (__locale_ctype_ptr_l (locale)[c+1] & _B) || (c == '\t'); +} diff --git a/lib/ctype/iscntrl.c b/lib/ctype/iscntrl.c new file mode 100644 index 0000000..ebbdd73 --- /dev/null +++ b/lib/ctype/iscntrl.c @@ -0,0 +1,52 @@ +/* +FUNCTION + <>, <>---control character predicate + +INDEX + iscntrl + +INDEX + iscntrl_l + +SYNOPSIS + #include + int iscntrl(int <[c]>); + + #include + int iscntrl_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for control characters, and 0 +for other characters. It is defined only if <[c]> is representable as an +unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef iscntrl>>' or `<<#undef iscntrl_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a delete character +or ordinary control character. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include + + + +#undef iscntrl +int +iscntrl (int c) +{ + return(__CTYPE_PTR[c+1] & _C); +} diff --git a/lib/ctype/iscntrl_l.c b/lib/ctype/iscntrl_l.c new file mode 100644 index 0000000..0ae17c7 --- /dev/null +++ b/lib/ctype/iscntrl_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef iscntrl_l + +int +iscntrl_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & _C; +} diff --git a/lib/ctype/isdigit.c b/lib/ctype/isdigit.c new file mode 100644 index 0000000..a5c5119 --- /dev/null +++ b/lib/ctype/isdigit.c @@ -0,0 +1,51 @@ +/* +FUNCTION + <>, <>---decimal digit predicate + +INDEX + isdigit + +INDEX + isdigit_l + +SYNOPSIS + #include + int isdigit(int <[c]>); + + #include + int isdigit_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for decimal digits, and 0 for +other characters. It is defined only if <[c]> is representable as an +unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isdigit>>' or `<<#undef isdigit_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a decimal digit +(<<0>>--<<9>>). + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include + + +#undef isdigit +int +isdigit (int c) +{ + return(__CTYPE_PTR[c+1] & _N); +} diff --git a/lib/ctype/isdigit_l.c b/lib/ctype/isdigit_l.c new file mode 100644 index 0000000..1fb79e0 --- /dev/null +++ b/lib/ctype/isdigit_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef isdigit_l + +int +isdigit_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & _N; +} diff --git a/lib/ctype/islower.c b/lib/ctype/islower.c new file mode 100644 index 0000000..2b34404 --- /dev/null +++ b/lib/ctype/islower.c @@ -0,0 +1,49 @@ +/* +FUNCTION + <>, <>---lowercase character predicate + +INDEX + islower + +INDEX + islower_l + +SYNOPSIS + #include + int islower(int <[c]>); + + #include + int islower_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for minuscules +(lowercase alphabetic characters), and 0 for other characters. +It is defined only if <[c]> is representable as an unsigned char or if +<[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef islower>>' or `<<#undef islower_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a lowercase letter. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +#undef islower +int +islower (int c) +{ + return ((__CTYPE_PTR[c+1] & (_U|_L)) == _L); +} diff --git a/lib/ctype/islower_l.c b/lib/ctype/islower_l.c new file mode 100644 index 0000000..d1f3a82 --- /dev/null +++ b/lib/ctype/islower_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef islower_l + +int +islower_l (int c, struct __locale_t *locale) +{ + return (__locale_ctype_ptr_l (locale)[c+1] & (_U|_L)) == _L; +} diff --git a/lib/ctype/isprint.c b/lib/ctype/isprint.c new file mode 100644 index 0000000..e34fbe2 --- /dev/null +++ b/lib/ctype/isprint.c @@ -0,0 +1,71 @@ +/* +FUNCTION + <>, <>, <>, <>---printable character predicates + +INDEX + isprint + +INDEX + isgraph + +INDEX + isprint_l + +INDEX + isgraph_l + +SYNOPSIS + #include + int isprint(int <[c]>); + int isgraph(int <[c]>); + + #include + int isprint_l(int <[c]>, locale_t <[locale]>); + int isgraph_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for printable characters, +and 0 for other character arguments. It is defined only if <[c]> is +representable as an unsigned char or if <[c]> is EOF. + +<> behaves identically to <>, except that space characters +are excluded. + +<>, <> are like <>, <> but perform +the check based on the locale specified by the locale object locale. If +<[locale]> is LC_GLOBAL_LOCALE or not a valid locale object, the behaviour +is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining either macro using `<<#undef isprint>>' or `<<#undef isgraph>>', +or `<<#undef isprint_l>>' or `<<#undef isgraph_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a printing character. +<>, <> return non-zero if <[c]> is a printing character +except spaces. + +PORTABILITY +<> and <> are ANSI C. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include + +#undef isgraph +int +isgraph (int c) +{ + return(__CTYPE_PTR[c+1] & (_P|_U|_L|_N)); +} + + +#undef isprint +int +isprint (int c) +{ + return(__CTYPE_PTR[c+1] & (_P|_U|_L|_N|_B)); +} diff --git a/lib/ctype/isprint_l.c b/lib/ctype/isprint_l.c new file mode 100644 index 0000000..535504f --- /dev/null +++ b/lib/ctype/isprint_l.c @@ -0,0 +1,18 @@ +#include <_ansi.h> +#include + +#undef isgraph_l + +int +isgraph_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & (_P|_U|_L|_N); +} + +#undef isprint_l + +int +isprint_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & (_P|_U|_L|_N|_B); +} diff --git a/lib/ctype/ispunct.c b/lib/ctype/ispunct.c new file mode 100644 index 0000000..9c5a3fc --- /dev/null +++ b/lib/ctype/ispunct.c @@ -0,0 +1,51 @@ +/* +FUNCTION + <>, <>---punctuation character predicate + +INDEX + ispunct + +INDEX + ispunct_l + +SYNOPSIS + #include + int ispunct(int <[c]>); + + #include + int ispunct_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for printable +punctuation characters, and 0 for other characters. It is defined only +if <[c]> is representable as an unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef ispunct>>' or `<<#undef ispunct_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a printable +punctuation character. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include + + +#undef ispunct +int +ispunct (int c) +{ + return(__CTYPE_PTR[c+1] & _P); +} diff --git a/lib/ctype/ispunct_l.c b/lib/ctype/ispunct_l.c new file mode 100644 index 0000000..eeba1f5 --- /dev/null +++ b/lib/ctype/ispunct_l.c @@ -0,0 +1,11 @@ +#include <_ansi.h> +#include + +#undef ispunct_l + +int +ispunct_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & _P; +} + diff --git a/lib/ctype/isspace.c b/lib/ctype/isspace.c new file mode 100644 index 0000000..0def2c0 --- /dev/null +++ b/lib/ctype/isspace.c @@ -0,0 +1,50 @@ +/* +FUNCTION + <>, <>---whitespace character predicate + +INDEX + isspace + +INDEX + isspace_l + +SYNOPSIS + #include + int isspace(int <[c]>); + + #include + int isspace_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for whitespace +characters, and 0 for other characters. It is defined only when <>(<[c]>) is true or <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isspace>>' or `<<#undef isspace_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a space, tab, +carriage return, new line, vertical tab, or formfeed (<<0x09>>--<<0x0D>>, +<<0x20>>), or one of the other space characters in non-ASCII charsets. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + + +#undef isspace +int +isspace (int c) +{ + return(__CTYPE_PTR[c+1] & _S); +} diff --git a/lib/ctype/isspace_l.c b/lib/ctype/isspace_l.c new file mode 100644 index 0000000..bf4a36c --- /dev/null +++ b/lib/ctype/isspace_l.c @@ -0,0 +1,11 @@ +#include <_ansi.h> +#include + +#undef isspace_l + +int +isspace_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & _S; +} + diff --git a/lib/ctype/isupper.c b/lib/ctype/isupper.c new file mode 100644 index 0000000..aeed383 --- /dev/null +++ b/lib/ctype/isupper.c @@ -0,0 +1,47 @@ +/* +FUNCTION + <>, <>---uppercase character predicate + +INDEX + isupper + +INDEX + isupper_l + +SYNOPSIS + #include + int isupper(int <[c]>); + + #include + int isupper_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for uppercase letters +(<>--<>), and 0 for other characters. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isupper>>' or `<<#undef isupper_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is an uppercase letter. + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +#undef isupper +int +isupper (int c) +{ + return ((__CTYPE_PTR[c+1] & (_U|_L)) == _U); +} diff --git a/lib/ctype/isupper_l.c b/lib/ctype/isupper_l.c new file mode 100644 index 0000000..eb473a7 --- /dev/null +++ b/lib/ctype/isupper_l.c @@ -0,0 +1,11 @@ +#include <_ansi.h> +#include + +#undef isupper_l + +int +isupper_l (int c, struct __locale_t *locale) +{ + return (__locale_ctype_ptr_l (locale)[c+1] & (_U|_L)) == _U; +} + diff --git a/lib/ctype/iswalnum.c b/lib/ctype/iswalnum.c new file mode 100644 index 0000000..7b2cac7 --- /dev/null +++ b/lib/ctype/iswalnum.c @@ -0,0 +1,43 @@ +/* +FUNCTION + <>, <>---alphanumeric wide character test + +INDEX + iswalnum + +INDEX + iswalnum_l + +SYNOPSIS + #include + int iswalnum(wint_t <[c]>); + + #include + int iswalnum_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are alphanumeric. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a alphanumeric +wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswalnum (wint_t c) +{ + return iswalnum_l (c, 0); +} diff --git a/lib/ctype/iswalnum_l.c b/lib/ctype/iswalnum_l.c new file mode 100644 index 0000000..8802273 --- /dev/null +++ b/lib/ctype/iswalnum_l.c @@ -0,0 +1,23 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswalnum_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + //return iswalpha (c) || iswdigit (c); + c = _jp2uc_l (c, locale); + enum category cat = category (c); + return cat == CAT_LC || cat == CAT_Lu || cat == CAT_Ll || cat == CAT_Lt + || cat == CAT_Lm || cat == CAT_Lo + || cat == CAT_Nl // Letter_Number + || cat == CAT_Nd // Decimal_Number + ; +#else + return c < (wint_t)0x100 ? isalnum (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswalpha.c b/lib/ctype/iswalpha.c new file mode 100644 index 0000000..3928772 --- /dev/null +++ b/lib/ctype/iswalpha.c @@ -0,0 +1,73 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---alphabetic wide character test + +INDEX + iswalpha + +INDEX + iswalpha_l + +SYNOPSIS + #include + int iswalpha(wint_t <[c]>); + + #include + int iswalpha_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are alphabetic. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is an alphabetic +wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswalpha (wint_t c) +{ + return iswalpha_l (c, 0); +} diff --git a/lib/ctype/iswalpha_l.c b/lib/ctype/iswalpha_l.c new file mode 100644 index 0000000..922983e --- /dev/null +++ b/lib/ctype/iswalpha_l.c @@ -0,0 +1,21 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswalpha_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + enum category cat = category (c); + return cat == CAT_LC || cat == CAT_Lu || cat == CAT_Ll || cat == CAT_Lt + || cat == CAT_Lm || cat == CAT_Lo + || cat == CAT_Nl // Letter_Number + ; +#else + return c < (wint_t)0x100 ? isalpha (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswblank.c b/lib/ctype/iswblank.c new file mode 100644 index 0000000..31779d2 --- /dev/null +++ b/lib/ctype/iswblank.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---blank wide character test + +INDEX + iswblank + +INDEX + iswblank_l + +SYNOPSIS + #include + int iswblank(wint_t <[c]>); + + #include + int iswblank_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are categorized as blank. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a blank wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswblank (wint_t c) +{ + return iswblank_l (c, 0); +} diff --git a/lib/ctype/iswblank_l.c b/lib/ctype/iswblank_l.c new file mode 100644 index 0000000..b27ed82 --- /dev/null +++ b/lib/ctype/iswblank_l.c @@ -0,0 +1,20 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswblank_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + enum category cat = category (c); + // exclude ""? + return cat == CAT_Zs + || c == '\t'; +#else + return c < 0x100 ? isblank (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswcntrl.c b/lib/ctype/iswcntrl.c new file mode 100644 index 0000000..d4b0147 --- /dev/null +++ b/lib/ctype/iswcntrl.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---control wide character test + +INDEX + iswcntrl + +INDEX + iswcntrl_l + +SYNOPSIS + #include + int iswcntrl(wint_t <[c]>); + + #include + int iswcntrl_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are categorized as control characters. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a control wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswcntrl (wint_t c) +{ + return iswcntrl_l (c, 0); +} diff --git a/lib/ctype/iswcntrl_l.c b/lib/ctype/iswcntrl_l.c new file mode 100644 index 0000000..6a900a7 --- /dev/null +++ b/lib/ctype/iswcntrl_l.c @@ -0,0 +1,20 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswcntrl_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + enum category cat = category (c); + return cat == CAT_Cc + || cat == CAT_Zl || cat == CAT_Zp // Line/Paragraph Separator + ; +#else + return c < 0x100 ? iscntrl (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswctype.c b/lib/ctype/iswctype.c new file mode 100644 index 0000000..027cb8a --- /dev/null +++ b/lib/ctype/iswctype.c @@ -0,0 +1,75 @@ +/* +FUNCTION + <>, <>---extensible wide-character test + +INDEX + iswctype + +INDEX + iswctype_l + +SYNOPSIS + #include + int iswctype(wint_t <[c]>, wctype_t <[desc]>); + + #include + int iswctype_l(wint_t <[c]>, wctype_t <[desc]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values using the +wide-character test specified by <[desc]>. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if and only if <[c]> matches +the test specified by <[desc]>. If <[desc]> is unknown, zero is returned. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include +#include "local.h" + +int +iswctype (wint_t c, wctype_t desc) +{ + switch (desc) + { + case WC_ALNUM: + return iswalnum (c); + case WC_ALPHA: + return iswalpha (c); + case WC_BLANK: + return iswblank (c); + case WC_CNTRL: + return iswcntrl (c); + case WC_DIGIT: + return iswdigit (c); + case WC_GRAPH: + return iswgraph (c); + case WC_LOWER: + return iswlower (c); + case WC_PRINT: + return iswprint (c); + case WC_PUNCT: + return iswpunct (c); + case WC_SPACE: + return iswspace (c); + case WC_UPPER: + return iswupper (c); + case WC_XDIGIT: + return iswxdigit (c); + default: + return 0; /* eliminate warning */ + } + + /* otherwise unknown */ + return 0; +} diff --git a/lib/ctype/iswctype_l.c b/lib/ctype/iswctype_l.c new file mode 100644 index 0000000..506972d --- /dev/null +++ b/lib/ctype/iswctype_l.c @@ -0,0 +1,41 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include "local.h" + +int +iswctype_l (wint_t c, wctype_t desc, struct __locale_t *locale) +{ + switch (desc) + { + case WC_ALNUM: + return iswalnum_l (c, locale); + case WC_ALPHA: + return iswalpha_l (c, locale); + case WC_BLANK: + return iswblank_l (c, locale); + case WC_CNTRL: + return iswcntrl_l (c, locale); + case WC_DIGIT: + return iswdigit_l (c, locale); + case WC_GRAPH: + return iswgraph_l (c, locale); + case WC_LOWER: + return iswlower_l (c, locale); + case WC_PRINT: + return iswprint_l (c, locale); + case WC_PUNCT: + return iswpunct_l (c, locale); + case WC_SPACE: + return iswspace_l (c, locale); + case WC_UPPER: + return iswupper_l (c, locale); + case WC_XDIGIT: + return iswxdigit_l (c, locale); + default: + return 0; /* eliminate warning */ + } + + /* otherwise unknown */ + return 0; +} diff --git a/lib/ctype/iswdigit.c b/lib/ctype/iswdigit.c new file mode 100644 index 0000000..d3562f8 --- /dev/null +++ b/lib/ctype/iswdigit.c @@ -0,0 +1,43 @@ +/* +FUNCTION + <>, <>---decimal digit wide character test + +INDEX + iswdigit + +INDEX + iswdigit_l + +SYNOPSIS + #include + int iswdigit(wint_t <[c]>); + + #include + int iswdigit_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are decimal digits. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a decimal digit wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswdigit (wint_t c) +{ + return c >= (wint_t)'0' && c <= (wint_t)'9'; + // category (c) == CAT_Nd not to be included as of C-99 +} diff --git a/lib/ctype/iswdigit_l.c b/lib/ctype/iswdigit_l.c new file mode 100644 index 0000000..29de9d3 --- /dev/null +++ b/lib/ctype/iswdigit_l.c @@ -0,0 +1,8 @@ +#include <_ansi.h> +#include + +int +iswdigit_l (wint_t c, struct __locale_t *locale) +{ + return c >= (wint_t)'0' && c <= (wint_t)'9'; +} diff --git a/lib/ctype/iswgraph.c b/lib/ctype/iswgraph.c new file mode 100644 index 0000000..bb21c21 --- /dev/null +++ b/lib/ctype/iswgraph.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---graphic wide character test + +INDEX + iswgraph + +INDEX + iswgraph_l + +SYNOPSIS + #include + int iswgraph(wint_t <[c]>); + + #include + int iswgraph_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are graphic. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a graphic wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswgraph (wint_t c) +{ + return iswgraph_l (c, 0); +} diff --git a/lib/ctype/iswgraph_l.c b/lib/ctype/iswgraph_l.c new file mode 100644 index 0000000..b8a5866 --- /dev/null +++ b/lib/ctype/iswgraph_l.c @@ -0,0 +1,23 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include "local.h" +#include "categories.h" + +int +iswgraph_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + //return iswprint (c, locale) && !iswspace (c, locale); + c = _jp2uc_l (c, locale); + enum category cat = category (c); + return cat != -1 + && cat != CAT_Cc && cat != CAT_Cf + && cat != CAT_Cs // Surrogate + && cat != CAT_Zs + && cat != CAT_Zl && cat != CAT_Zp // Line/Paragraph Separator + ; +#else + return iswprint_l (c, locale) && !iswspace_l (c, locale); +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswlower.c b/lib/ctype/iswlower.c new file mode 100644 index 0000000..e1d926b --- /dev/null +++ b/lib/ctype/iswlower.c @@ -0,0 +1,42 @@ +/* +FUNCTION + <>, <>---lowercase wide character test + +INDEX + iswlower + +INDEX + iswlower_l + +SYNOPSIS + #include + int iswlower(wint_t <[c]>); + + #include + int iswlower_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are categorized as lowercase. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a lowercase wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswlower (wint_t c) +{ + return iswlower_l (c, 0); +} diff --git a/lib/ctype/iswlower_l.c b/lib/ctype/iswlower_l.c new file mode 100644 index 0000000..6446133 --- /dev/null +++ b/lib/ctype/iswlower_l.c @@ -0,0 +1,20 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswlower_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + // The wide-character class "lower" contains at least those characters wc + // which are equal to towlower(wc) and different from towupper(wc). + enum category cat = category (c); + return cat == CAT_Ll || (cat == CAT_LC && towlower (c) == c); +#else + return c < 0x100 ? islower (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswprint.c b/lib/ctype/iswprint.c new file mode 100644 index 0000000..5e468fe --- /dev/null +++ b/lib/ctype/iswprint.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---printable wide character test + +INDEX + iswprint + +INDEX + iswprint_l + +SYNOPSIS + #include + int iswprint(wint_t <[c]>); + + #include + int iswprint_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are printable. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a printable wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswprint (wint_t c) +{ + return iswprint_l (c, 0); +} diff --git a/lib/ctype/iswprint_l.c b/lib/ctype/iswprint_l.c new file mode 100644 index 0000000..cdf027b --- /dev/null +++ b/lib/ctype/iswprint_l.c @@ -0,0 +1,21 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswprint_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + enum category cat = category (c); + return cat != -1 + && cat != CAT_Cc && cat != CAT_Cf + && cat != CAT_Cs // Surrogate + ; +#else + return c < (wint_t)0x100 ? isprint (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswpunct.c b/lib/ctype/iswpunct.c new file mode 100644 index 0000000..27a6d65 --- /dev/null +++ b/lib/ctype/iswpunct.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---punctuation wide character test + +INDEX + iswpunct + +INDEX + iswpunct_l + +SYNOPSIS + #include + int iswpunct(wint_t <[c]>); + + #include + int iswpunct_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are punctuation. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a punctuation wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswpunct (wint_t c) +{ + return iswpunct_l (c, 0); +} diff --git a/lib/ctype/iswpunct_l.c b/lib/ctype/iswpunct_l.c new file mode 100644 index 0000000..4adc1ed --- /dev/null +++ b/lib/ctype/iswpunct_l.c @@ -0,0 +1,26 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswpunct_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + //return !iswalnum (c) && iswgraph (c); + c = _jp2uc_l (c, locale); + enum category cat = category (c); + return cat == CAT_Pc || cat == CAT_Pd || cat == CAT_Pe || cat == CAT_Pf || cat == CAT_Pi || cat == CAT_Po || cat == CAT_Ps + || cat == CAT_Sm // Math Symbols + // the following are included for backwards consistency: + || cat == CAT_Sc // Currency Symbols + || cat == CAT_Sk // Modifier_Symbol + || cat == CAT_So // Other_Symbol + || cat == CAT_No // Other_Number + ; +#else + return c < (wint_t)0x100 ? ispunct (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswspace.c b/lib/ctype/iswspace.c new file mode 100644 index 0000000..ca6a887 --- /dev/null +++ b/lib/ctype/iswspace.c @@ -0,0 +1,72 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---whitespace wide character test + +INDEX + iswspace + +INDEX + iswspace_l + +SYNOPSIS + #include + int iswspace(wint_t <[c]>); + + #include + int iswspace_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are categorized as whitespace. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a whitespace wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswspace (wint_t c) +{ + return iswspace_l (c, 0); +} diff --git a/lib/ctype/iswspace_l.c b/lib/ctype/iswspace_l.c new file mode 100644 index 0000000..e7f47ee --- /dev/null +++ b/lib/ctype/iswspace_l.c @@ -0,0 +1,21 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswspace_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + enum category cat = category (c); + // exclude ""? + return cat == CAT_Zs + || cat == CAT_Zl || cat == CAT_Zp // Line/Paragraph Separator + || (c >= 0x9 && c <= 0xD); +#else + return c < 0x100 ? isspace (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswupper.c b/lib/ctype/iswupper.c new file mode 100644 index 0000000..96b5a0c --- /dev/null +++ b/lib/ctype/iswupper.c @@ -0,0 +1,42 @@ +/* +FUNCTION + <>, <>---uppercase wide character test + +INDEX + iswupper + +INDEX + iswupper_l + +SYNOPSIS + #include + int iswupper(wint_t <[c]>); + + #include + int iswupper_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide-character values that +are categorized as uppercase. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is an uppercase wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswupper (wint_t c) +{ + return iswupper_l (c, 0); +} diff --git a/lib/ctype/iswupper_l.c b/lib/ctype/iswupper_l.c new file mode 100644 index 0000000..e772f92 --- /dev/null +++ b/lib/ctype/iswupper_l.c @@ -0,0 +1,20 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" +#include "categories.h" + +int +iswupper_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + c = _jp2uc_l (c, locale); + // The wide-character class "upper" contains at least those characters wc + // which are equal to towupper(wc) and different from towlower(wc). + enum category cat = category (c); + return cat == CAT_Lu || (cat == CAT_LC && towupper (c) == c); +#else + return c < 0x100 ? isupper (c) : 0; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/iswxdigit.c b/lib/ctype/iswxdigit.c new file mode 100644 index 0000000..fce2a4d --- /dev/null +++ b/lib/ctype/iswxdigit.c @@ -0,0 +1,44 @@ +/* +FUNCTION + <>, <>---hexadecimal digit wide character test + +INDEX + iswxdigit + +INDEX + iswxdigit_l + +SYNOPSIS + #include + int iswxdigit(wint_t <[c]>); + + #include + int iswxdigit_l(wint_t <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a function which classifies wide character values that +are hexadecimal digits. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return non-zero if <[c]> is a hexadecimal digit wide character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + +int +iswxdigit (wint_t c) +{ + return (c >= (wint_t)'0' && c <= (wint_t)'9') + || (c >= (wint_t)'a' && c <= (wint_t)'f') + || (c >= (wint_t)'A' && c <= (wint_t)'F'); +} diff --git a/lib/ctype/iswxdigit_l.c b/lib/ctype/iswxdigit_l.c new file mode 100644 index 0000000..5a4c339 --- /dev/null +++ b/lib/ctype/iswxdigit_l.c @@ -0,0 +1,11 @@ +#include <_ansi.h> +#include + +int +iswxdigit_l (wint_t c, struct __locale_t *locale) +{ + return ((c >= (wint_t)'0' && c <= (wint_t)'9') || + (c >= (wint_t)'a' && c <= (wint_t)'f') || + (c >= (wint_t)'A' && c <= (wint_t)'F')); +} + diff --git a/lib/ctype/isxdigit.c b/lib/ctype/isxdigit.c new file mode 100644 index 0000000..2bfe18d --- /dev/null +++ b/lib/ctype/isxdigit.c @@ -0,0 +1,50 @@ +/* +FUNCTION + <>, <>---hexadecimal digit predicate + +INDEX + isxdigit + +INDEX + isxdigit_l + +SYNOPSIS + #include + int isxdigit(int <[c]>); + + #include + int isxdigit_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which classifies singlebyte charset values by table +lookup. It is a predicate returning non-zero for hexadecimal digits, +and <<0>> for other characters. It is defined only if <[c]> is +representable as an unsigned char or if <[c]> is EOF. + +<> is like <> but performs the check based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining the macro using `<<#undef isxdigit>>' or `<<#undef isxdigit_l>>'. + +RETURNS +<>, <> return non-zero if <[c]> is a hexadecimal digit +(<<0>>--<<9>>, <>--<>, or <>--<>). + +PORTABILITY +<> is ANSI C. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ +#include <_ansi.h> +#include + + +#undef isxdigit +int +isxdigit (int c) +{ + return(__CTYPE_PTR[c+1] & ((_X)|(_N))); +} diff --git a/lib/ctype/isxdigit_l.c b/lib/ctype/isxdigit_l.c new file mode 100644 index 0000000..726db31 --- /dev/null +++ b/lib/ctype/isxdigit_l.c @@ -0,0 +1,11 @@ +#include <_ansi.h> +#include + + +#undef isxdigit_l +int +isxdigit_l (int c, struct __locale_t *locale) +{ + return __locale_ctype_ptr_l (locale)[c+1] & ((_X)|(_N)); +} + diff --git a/lib/ctype/jp2uc.c b/lib/ctype/jp2uc.c new file mode 100644 index 0000000..5e30f09 --- /dev/null +++ b/lib/ctype/jp2uc.c @@ -0,0 +1,200 @@ +/* Routine to translate between Japanese characters and Unicode */ + +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff: consider locale, add dummy uc2jp + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include + +#ifdef _MB_CAPABLE +/* Under Cygwin, the incoming wide character is already given in UTF due + to the requirements of the underlying OS. */ +#ifndef __CYGWIN__ + +#include <_ansi.h> +#include +#include +#include "local.h" + +/* Japanese encoding types supported */ +#define JP_JIS 1 +#define JP_SJIS 2 +#define JP_EUCJP 3 + +/* Japanese to Unicode conversion routine */ +#include "jp2uc.h" + +static wint_t +__jp2uc (wint_t c, int type) +{ + int index, adj; + unsigned char byte1, byte2; + wint_t ret; + + /* we actually use tables of EUCJP to Unicode. For JIS, we simply + note that EUCJP is essentially JIS with the top bits on in each + byte and translate to EUCJP. For SJIS, we do a translation to EUCJP before + accessing the tables. */ + switch (type) + { + case JP_JIS: + byte1 = (c >> 8) + 0x80; + byte2 = (c & 0xff) + 0x80; + break; + case JP_EUCJP: + byte1 = (c >> 8); + byte2 = (c & 0xff); + break; + case JP_SJIS: + byte1 = c >> 8; + byte2 = c & 0xff; + if (byte2 <= 0x9e) + { + adj = 0xa1 - 0x22; + byte2 = (byte2 - 31) + 0xa1; + } + else + { + adj = 0xa1 - 0x21; + byte2 = (byte2 - 126) + 0xa1; + } + if (byte1 <= 0x9f) + byte1 = ((byte1 - 112) << 1) + adj; + else + byte1 = ((byte1 - 176) << 1) + adj; + break; + default: + return WEOF; + } + + /* find conversion in jp2uc arrays */ + + /* handle larger ranges first */ + if (byte1 >= 0xb0 && byte1 <= 0xcf && c <= 0xcfd3) + { + index = (byte1 - 0xb0) * 0xfe + (byte2 - 0xa1); + return b02cf[index]; + } + else if (byte1 >= 0xd0 && byte1 <= 0xf4 && c <= 0xf4a6) + { + index = (byte1 - 0xd0) * 0xfe + (byte2 - 0xa1); + return d02f4[index]; + } + + /* handle smaller ranges here */ + switch (byte1) + { + case 0xA1: + return (wint_t)a1[byte2 - 0xa1]; + case 0xA2: + ret = a2[byte2 - 0xa1]; + if (ret != 0) + return (wint_t)ret; + break; + case 0xA3: + if (a3[byte2 - 0xa1]) + return (wint_t)(0xff00 + (byte2 - 0xa0)); + break; + case 0xA4: + if (byte2 <= 0xf3) + return (wint_t)(0x3000 + (byte2 - 0x60)); + break; + case 0xA5: + if (byte2 <= 0xf6) + return (wint_t)(0x3000 + byte2); + break; + case 0xA6: + ret = 0; + if (byte2 <= 0xd8) + ret = (wint_t)a6[byte2 - 0xa1]; + if (ret != 0) + return ret; + break; + case 0xA7: + ret = 0; + if (byte2 <= 0xf1) + ret = (wint_t)a7[byte2 - 0xa1]; + if (ret != 0) + return ret; + break; + case 0xA8: + if (byte2 <= 0xc0) + return (wint_t)a8[byte2 - 0xa1]; + break; + default: + return WEOF; + } + + return WEOF; +} + +/* Unicode to Japanese conversion routine */ +static wint_t +__uc2jp (wint_t c, int type) +{ +#warning back-conversion Unicode to Japanese not implemented; needed for towupper/towlower + return c; +} + +/* Japanese to Unicode conversion interface */ +wint_t +_jp2uc_l (wint_t c, struct __locale_t * l) +{ + const char * cs = l ? __locale_charset(l) : __current_locale_charset(); + if (0 == strcmp (cs, "JIS")) + c = __jp2uc (c, JP_JIS); + else if (0 == strcmp (cs, "SJIS")) + c = __jp2uc (c, JP_SJIS); + else if (0 == strcmp (cs, "EUCJP")) + c = __jp2uc (c, JP_EUCJP); + return c; +} + +wint_t +_jp2uc (wint_t c) +{ + return _jp2uc_l (c, 0); +} + +/* Unicode to Japanese conversion interface */ +wint_t +_uc2jp_l (wint_t c, struct __locale_t * l) +{ + const char * cs = l ? __locale_charset(l) : __current_locale_charset(); + if (0 == strcmp (cs, "JIS")) + c = __uc2jp (c, JP_JIS); + else if (0 == strcmp (cs, "SJIS")) + c = __uc2jp (c, JP_SJIS); + else if (0 == strcmp (cs, "EUCJP")) + c = __uc2jp (c, JP_EUCJP); + return c; +} + +#endif /* !__CYGWIN__ */ +#endif /* _MB_CAPABLE */ diff --git a/lib/ctype/jp2uc.h b/lib/ctype/jp2uc.h new file mode 100644 index 0000000..04eb67d --- /dev/null +++ b/lib/ctype/jp2uc.h @@ -0,0 +1,6849 @@ +/* based on eucjp-208A.txt */ + +/* a1 is contiguous from a1a1 to a1fe */ +static unsigned short a1[] = { + 0x3000, + 0x3001, + 0x3002, + 0xFF0C, + 0xFF0E, + 0x30FB, + 0xFF1A, + 0xFF1B, + 0xFF1F, + 0xFF01, + 0x309B, + 0x309C, + 0x00B4, + 0xFF40, + 0x00A8, + 0xFF3E, + 0x203E, + 0xFF3F, + 0x30FD, + 0x30FE, + 0x309D, + 0x309E, + 0x3003, + 0x4EDD, + 0x3005, + 0x3006, + 0x3007, + 0x30FC, + 0x2014, + 0x2010, + 0xFF0F, + 0xFF3C, + 0x301C, + 0x2016, + 0xFF5C, + 0x2026, + 0x2025, + 0x2018, + 0x2019, + 0x201C, + 0x201D, + 0xFF08, + 0xFF09, + 0x3014, + 0x3015, + 0xFF3B, + 0xFF3D, + 0xFF5B, + 0xFF5D, + 0x3008, + 0x3009, + 0x300A, + 0x300B, + 0x300C, + 0x300D, + 0x300E, + 0x300F, + 0x3010, + 0x3011, + 0xFF0B, + 0x2212, + 0x00B1, + 0x00D7, + 0x00F7, + 0xFF1D, + 0x2260, + 0xFF1C, + 0xFF1E, + 0x2266, + 0x2267, + 0x221E, + 0x2234, + 0x2642, + 0x2640, + 0x00B0, + 0x2032, + 0x2033, + 0x2103, + 0x00A5, + 0xFF04, + 0x00A2, + 0x00A3, + 0xFF05, + 0xFF03, + 0xFF06, + 0xFF0A, + 0xFF20, + 0x00A7, + 0x2606, + 0x2605, + 0x25CB, + 0x25CF, + 0x25CE, + 0x25C7 +}; + +/* a2 has a number of holes between a2a1 and a2fe which we fill with 0x0000 */ +static unsigned short a2[] = { + 0x25C6, + 0x25A1, + 0x25A0, + 0x25B3, + 0x25B2, + 0x25BD, + 0x25BC, + 0x203B, + 0x3012, + 0x2192, + 0x2190, + 0x2191, + 0x2193, + 0x3013, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x2208, + 0x220B, + 0x2286, + 0x2287, + 0x2282, + 0x2283, + 0x222A, + 0x2229, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x2227, + 0x2228, + 0x00AC, + 0x21D2, + 0x21D4, + 0x2200, + 0x2203, + 0x2229, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x2220, + 0x22A5, + 0x2312, + 0x2202, + 0x2207, + 0x2261, + 0x2252, + 0x226A, + 0x226B, + 0x221A, + 0x223D, + 0x221D, + 0x2235, + 0x222B, + 0x222C, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x212B, + 0x2030, + 0x266F, + 0x266D, + 0x266A, + 0x2020, + 0x2021, + 0x00B6, + 0x222C, + 0x0000, + 0x0000, + 0x0000, + 0x25EF +}; + + +/* a3a1 to a3fe is mostly contiguous. Conversion output values are + of the form 0xFFxx where xx is (yy - 0xA0) where the input is 0xA3yy */ +static unsigned char a3[] = { + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 +}; + +/* a4 is contiguous from a4a1 to a4f3 */ +/* transform = 0x30xx where xx = last byte - 0x60 */ + +/* a5 is contiguous from a5a1 to a5f6 */ +/* transform = 0x30xx where xx = last byte */ + +/* a6 is mostly contiguous from a6a1 to a6d8 */ +static unsigned short a6[] = { + 0x0391, + 0x0392, + 0x0393, + 0x0394, + 0x0395, + 0x0396, + 0x0397, + 0x0398, + 0x0399, + 0x039A, + 0x039B, + 0x039C, + 0x039D, + 0x039E, + 0x039F, + 0x03A0, + 0x03A1, + 0x03A3, + 0x03A4, + 0x03A5, + 0x03A6, + 0x03A7, + 0x03A8, + 0x03A9, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x03B1, + 0x03B2, + 0x03B3, + 0x03B4, + 0x03B5, + 0x03B6, + 0x03B7, + 0x03B8, + 0x03B9, + 0x03BA, + 0x03BB, + 0x03BC, + 0x03BD, + 0x03BE, + 0x03BF, + 0x03C0, + 0x03C1, + 0x03C3, + 0x03C4, + 0x03C5, + 0x03C6, + 0x03C7, + 0x03C8, + 0x03C9 +}; + +/* a7 is mostly contiguous from a7a1 to a7f1 */ +static unsigned short a7[] = { + 0x0410, + 0x0411, + 0x0412, + 0x0413, + 0x0414, + 0x0415, + 0x0401, + 0x0416, + 0x0417, + 0x0418, + 0x0419, + 0x041A, + 0x041B, + 0x041C, + 0x041D, + 0x041E, + 0x041F, + 0x0420, + 0x0421, + 0x0422, + 0x0423, + 0x0424, + 0x0425, + 0x0426, + 0x0427, + 0x0428, + 0x0429, + 0x042A, + 0x042B, + 0x042C, + 0x042D, + 0x042E, + 0x042F, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0430, + 0x0431, + 0x0432, + 0x0433, + 0x0434, + 0x0435, + 0x0451, + 0x0436, + 0x0437, + 0x0438, + 0x0439, + 0x043A, + 0x043B, + 0x043C, + 0x043D, + 0x043E, + 0x043F, + 0x0440, + 0x0441, + 0x0442, + 0x0443, + 0x0444, + 0x0445, + 0x0446, + 0x0447, + 0x0448, + 0x0449, + 0x044A, + 0x044B, + 0x044C, + 0x044D, + 0x044E, + 0x044F +}; + +/* a8 is contiguous from a8a1 to a8c0 */ +static unsigned short a8[] = { + 0x2500, + 0x2502, + 0x250C, + 0x2510, + 0x2518, + 0x2514, + 0x251C, + 0x252C, + 0x2524, + 0x2534, + 0x253C, + 0x2501, + 0x2503, + 0x250F, + 0x2513, + 0x251B, + 0x2517, + 0x2523, + 0x2533, + 0x252B, + 0x253B, + 0x254B, + 0x2520, + 0x252F, + 0x2528, + 0x2537, + 0x253F, + 0x251D, + 0x2530, + 0x2525, + 0x2538, + 0x2542 +}; + +/* no conversion a9 to af */ + +/* b0a1 to cfd3 is contiguous except for illegal sequences with 0xfe */ +static unsigned short b02cf[] = { + 0x4E9C, + 0x5516, + 0x5A03, + 0x963F, + 0x54C0, + 0x611B, + 0x6328, + 0x59F6, + 0x9022, + 0x8475, + 0x831C, + 0x7A50, + 0x60AA, + 0x63E1, + 0x6E25, + 0x65ED, + 0x8466, + 0x82A6, + 0x9BF5, + 0x6893, + 0x5727, + 0x65A1, + 0x6271, + 0x5B9B, + 0x59D0, + 0x867B, + 0x98F4, + 0x7D62, + 0x7DBE, + 0x9B8E, + 0x6216, + 0x7C9F, + 0x88B7, + 0x5B89, + 0x5EB5, + 0x6309, + 0x6697, + 0x6848, + 0x95C7, + 0x978D, + 0x674F, + 0x4EE5, + 0x4F0A, + 0x4F4D, + 0x4F9D, + 0x5049, + 0x56F2, + 0x5937, + 0x59D4, + 0x5A01, + 0x5C09, + 0x60DF, + 0x610F, + 0x6170, + 0x6613, + 0x6905, + 0x70BA, + 0x754F, + 0x7570, + 0x79FB, + 0x7DAD, + 0x7DEF, + 0x80C3, + 0x840E, + 0x8863, + 0x8B02, + 0x9055, + 0x907A, + 0x533B, + 0x4E95, + 0x4EA5, + 0x57DF, + 0x80B2, + 0x90C1, + 0x78EF, + 0x4E00, + 0x58F1, + 0x6EA2, + 0x9038, + 0x7A32, + 0x8328, + 0x828B, + 0x9C2F, + 0x5141, + 0x5370, + 0x54BD, + 0x54E1, + 0x56E0, + 0x59FB, + 0x5F15, + 0x98F2, + 0x6DEB, + 0x80E4, + 0x852D, + 0x9662, + 0x9670, + 0x96A0, + 0x97FB, + 0x540B, + 0x53F3, + 0x5B87, + 0x70CF, + 0x7FBD, + 0x8FC2, + 0x96E8, + 0x536F, + 0x9D5C, + 0x7ABA, + 0x4E11, + 0x7893, + 0x81FC, + 0x6E26, + 0x5618, + 0x5504, + 0x6B1D, + 0x851A, + 0x9C3B, + 0x59E5, + 0x53A9, + 0x6D66, + 0x74DC, + 0x958F, + 0x5642, + 0x4E91, + 0x904B, + 0x96F2, + 0x834F, + 0x990C, + 0x53E1, + 0x55B6, + 0x5B30, + 0x5F71, + 0x6620, + 0x66F3, + 0x6804, + 0x6C38, + 0x6CF3, + 0x6D29, + 0x745B, + 0x76C8, + 0x7A4E, + 0x9834, + 0x82F1, + 0x885B, + 0x8A60, + 0x92ED, + 0x6DB2, + 0x75AB, + 0x76CA, + 0x99C5, + 0x60A6, + 0x8B01, + 0x8D8A, + 0x95B2, + 0x698E, + 0x53AD, + 0x5186, + 0x5712, + 0x5830, + 0x5944, + 0x5BB4, + 0x5EF6, + 0x6028, + 0x63A9, + 0x63F4, + 0x6CBF, + 0x6F14, + 0x708E, + 0x7114, + 0x7159, + 0x71D5, + 0x733F, + 0x7E01, + 0x8276, + 0x82D1, + 0x8597, + 0x9060, + 0x925B, + 0x9D1B, + 0x5869, + 0x65BC, + 0x6C5A, + 0x7525, + 0x51F9, + 0x592E, + 0x5965, + 0x5F80, + 0x5FDC, + 0x62BC, + 0x65FA, + 0x6A2A, + 0x6B27, + 0x6BB4, + 0x738B, + 0x7FC1, + 0x8956, + 0x9D2C, + 0x9D0E, + 0x9EC4, + 0x5CA1, + 0x6C96, + 0x837B, + 0x5104, + 0x5C4B, + 0x61B6, + 0x81C6, + 0x6876, + 0x7261, + 0x4E59, + 0x4FFA, + 0x5378, + 0x6069, + 0x6E29, + 0x7A4F, + 0x97F3, + 0x4E0B, + 0x5316, + 0x4EEE, + 0x4F55, + 0x4F3D, + 0x4FA1, + 0x4F73, + 0x52A0, + 0x53EF, + 0x5609, + 0x590F, + 0x5AC1, + 0x5BB6, + 0x5BE1, + 0x79D1, + 0x6687, + 0x679C, + 0x67B6, + 0x6B4C, + 0x6CB3, + 0x706B, + 0x73C2, + 0x798D, + 0x79BE, + 0x7A3C, + 0x7B87, + 0x82B1, + 0x82DB, + 0x8304, + 0x8377, + 0x83EF, + 0x83D3, + 0x8766, + 0x8AB2, + 0x5629, + 0x8CA8, + 0x8FE6, + 0x904E, + 0x971E, + 0x868A, + 0x4FC4, + 0x5CE8, + 0x6211, + 0x7259, + 0x753B, + 0x81E5, + 0x82BD, + 0x86FE, + 0x8CC0, + 0x96C5, + 0x9913, + 0x99D5, + 0x4ECB, + 0x4F1A, + 0x89E3, + 0x56DE, + 0x584A, + 0x58CA, + 0x5EFB, + 0x5FEB, + 0x602A, + 0x6094, + 0x6062, + 0x61D0, + 0x6212, + 0x62D0, + 0x6539, + 0x9B41, + 0x6666, + 0x68B0, + 0x6D77, + 0x7070, + 0x754C, + 0x7686, + 0x7D75, + 0x82A5, + 0x87F9, + 0x958B, + 0x968E, + 0x8C9D, + 0x51F1, + 0x52BE, + 0x5916, + 0x54B3, + 0x5BB3, + 0x5D16, + 0x6168, + 0x6982, + 0x6DAF, + 0x788D, + 0x84CB, + 0x8857, + 0x8A72, + 0x93A7, + 0x9AB8, + 0x6D6C, + 0x99A8, + 0x86D9, + 0x57A3, + 0x67FF, + 0x86CE, + 0x920E, + 0x5283, + 0x5687, + 0x5404, + 0x5ED3, + 0x62E1, + 0x64B9, + 0x683C, + 0x6838, + 0x6BBB, + 0x7372, + 0x78BA, + 0x7A6B, + 0x899A, + 0x89D2, + 0x8D6B, + 0x8F03, + 0x90ED, + 0x95A3, + 0x9694, + 0x9769, + 0x5B66, + 0x5CB3, + 0x697D, + 0x984D, + 0x984E, + 0x639B, + 0x7B20, + 0x6A2B, + 0x6A7F, + 0x68B6, + 0x9C0D, + 0x6F5F, + 0x5272, + 0x559D, + 0x6070, + 0x62EC, + 0x6D3B, + 0x6E07, + 0x6ED1, + 0x845B, + 0x8910, + 0x8F44, + 0x4E14, + 0x9C39, + 0x53F6, + 0x691B, + 0x6A3A, + 0x9784, + 0x682A, + 0x515C, + 0x7AC3, + 0x84B2, + 0x91DC, + 0x938C, + 0x565B, + 0x9D28, + 0x6822, + 0x8305, + 0x8431, + 0x7CA5, + 0x5208, + 0x82C5, + 0x74E6, + 0x4E7E, + 0x4F83, + 0x51A0, + 0x5BD2, + 0x520A, + 0x52D8, + 0x52E7, + 0x5DFB, + 0x559A, + 0x582A, + 0x59E6, + 0x5B8C, + 0x5B98, + 0x5BDB, + 0x5E72, + 0x5E79, + 0x60A3, + 0x611F, + 0x6163, + 0x61BE, + 0x63DB, + 0x6562, + 0x67D1, + 0x6853, + 0x68FA, + 0x6B3E, + 0x6B53, + 0x6C57, + 0x6F22, + 0x6F97, + 0x6F45, + 0x74B0, + 0x7518, + 0x76E3, + 0x770B, + 0x7AFF, + 0x7BA1, + 0x7C21, + 0x7DE9, + 0x7F36, + 0x7FF0, + 0x809D, + 0x8266, + 0x839E, + 0x89B3, + 0x8ACC, + 0x8CAB, + 0x9084, + 0x9451, + 0x9593, + 0x9591, + 0x95A2, + 0x9665, + 0x97D3, + 0x9928, + 0x8218, + 0x4E38, + 0x542B, + 0x5CB8, + 0x5DCC, + 0x73A9, + 0x764C, + 0x773C, + 0x5CA9, + 0x7FEB, + 0x8D0B, + 0x96C1, + 0x9811, + 0x9854, + 0x9858, + 0x4F01, + 0x4F0E, + 0x5371, + 0x559C, + 0x5668, + 0x57FA, + 0x5947, + 0x5B09, + 0x5BC4, + 0x5C90, + 0x5E0C, + 0x5E7E, + 0x5FCC, + 0x63EE, + 0x673A, + 0x65D7, + 0x65E2, + 0x671F, + 0x68CB, + 0x68C4, + 0x6A5F, + 0x5E30, + 0x6BC5, + 0x6C17, + 0x6C7D, + 0x757F, + 0x7948, + 0x5B63, + 0x7A00, + 0x7D00, + 0x5FBD, + 0x898F, + 0x8A18, + 0x8CB4, + 0x8D77, + 0x8ECC, + 0x8F1D, + 0x98E2, + 0x9A0E, + 0x9B3C, + 0x4E80, + 0x507D, + 0x5100, + 0x5993, + 0x5B9C, + 0x622F, + 0x6280, + 0x64EC, + 0x6B3A, + 0x72A0, + 0x7591, + 0x7947, + 0x7FA9, + 0x87FB, + 0x8ABC, + 0x8B70, + 0x63AC, + 0x83CA, + 0x97A0, + 0x5409, + 0x5403, + 0x55AB, + 0x6854, + 0x6A58, + 0x8A70, + 0x7827, + 0x6775, + 0x9ECD, + 0x5374, + 0x5BA2, + 0x811A, + 0x8650, + 0x9006, + 0x4E18, + 0x4E45, + 0x4EC7, + 0x4F11, + 0x53CA, + 0x5438, + 0x5BAE, + 0x5F13, + 0x6025, + 0x6551, + 0x673D, + 0x6C42, + 0x6C72, + 0x6CE3, + 0x7078, + 0x7403, + 0x7A76, + 0x7AAE, + 0x7B08, + 0x7D1A, + 0x7CFE, + 0x7D66, + 0x65E7, + 0x725B, + 0x53BB, + 0x5C45, + 0x5DE8, + 0x62D2, + 0x62E0, + 0x6319, + 0x6E20, + 0x865A, + 0x8A31, + 0x8DDD, + 0x92F8, + 0x6F01, + 0x79A6, + 0x9B5A, + 0x4EA8, + 0x4EAB, + 0x4EAC, + 0x4F9B, + 0x4FA0, + 0x50D1, + 0x5147, + 0x7AF6, + 0x5171, + 0x51F6, + 0x5354, + 0x5321, + 0x537F, + 0x53EB, + 0x55AC, + 0x5883, + 0x5CE1, + 0x5F37, + 0x5F4A, + 0x602F, + 0x6050, + 0x606D, + 0x631F, + 0x6559, + 0x6A4B, + 0x6CC1, + 0x72C2, + 0x72ED, + 0x77EF, + 0x80F8, + 0x8105, + 0x8208, + 0x854E, + 0x90F7, + 0x93E1, + 0x97FF, + 0x9957, + 0x9A5A, + 0x4EF0, + 0x51DD, + 0x5C2D, + 0x6681, + 0x696D, + 0x5C40, + 0x66F2, + 0x6975, + 0x7389, + 0x6850, + 0x7C81, + 0x50C5, + 0x52E4, + 0x5747, + 0x5DFE, + 0x9326, + 0x65A4, + 0x6B23, + 0x6B3D, + 0x7434, + 0x7981, + 0x79BD, + 0x7B4B, + 0x7DCA, + 0x82B9, + 0x83CC, + 0x887F, + 0x895F, + 0x8B39, + 0x8FD1, + 0x91D1, + 0x541F, + 0x9280, + 0x4E5D, + 0x5036, + 0x53E5, + 0x533A, + 0x72D7, + 0x7396, + 0x77E9, + 0x82E6, + 0x8EAF, + 0x99C6, + 0x99C8, + 0x99D2, + 0x5177, + 0x611A, + 0x865E, + 0x55B0, + 0x7A7A, + 0x5076, + 0x5BD3, + 0x9047, + 0x9685, + 0x4E32, + 0x6ADB, + 0x91E7, + 0x5C51, + 0x5C48, + 0x6398, + 0x7A9F, + 0x6C93, + 0x9774, + 0x8F61, + 0x7AAA, + 0x718A, + 0x9688, + 0x7C82, + 0x6817, + 0x7E70, + 0x6851, + 0x936C, + 0x52F2, + 0x541B, + 0x85AB, + 0x8A13, + 0x7FA4, + 0x8ECD, + 0x90E1, + 0x5366, + 0x8888, + 0x7941, + 0x4FC2, + 0x50BE, + 0x5211, + 0x5144, + 0x5553, + 0x572D, + 0x73EA, + 0x578B, + 0x5951, + 0x5F62, + 0x5F84, + 0x6075, + 0x6176, + 0x6167, + 0x61A9, + 0x63B2, + 0x643A, + 0x656C, + 0x666F, + 0x6842, + 0x6E13, + 0x7566, + 0x7A3D, + 0x7CFB, + 0x7D4C, + 0x7D99, + 0x7E4B, + 0x7F6B, + 0x830E, + 0x834A, + 0x86CD, + 0x8A08, + 0x8A63, + 0x8B66, + 0x8EFD, + 0x981A, + 0x9D8F, + 0x82B8, + 0x8FCE, + 0x9BE8, + 0x5287, + 0x621F, + 0x6483, + 0x6FC0, + 0x9699, + 0x6841, + 0x5091, + 0x6B20, + 0x6C7A, + 0x6F54, + 0x7A74, + 0x7D50, + 0x8840, + 0x8A23, + 0x6708, + 0x4EF6, + 0x5039, + 0x5026, + 0x5065, + 0x517C, + 0x5238, + 0x5263, + 0x55A7, + 0x570F, + 0x5805, + 0x5ACC, + 0x5EFA, + 0x61B2, + 0x61F8, + 0x62F3, + 0x6372, + 0x691C, + 0x6A29, + 0x727D, + 0x72AC, + 0x732E, + 0x7814, + 0x786F, + 0x7D79, + 0x770C, + 0x80A9, + 0x898B, + 0x8B19, + 0x8CE2, + 0x8ED2, + 0x9063, + 0x9375, + 0x967A, + 0x9855, + 0x9A13, + 0x9E78, + 0x5143, + 0x539F, + 0x53B3, + 0x5E7B, + 0x5F26, + 0x6E1B, + 0x6E90, + 0x7384, + 0x73FE, + 0x7D43, + 0x8237, + 0x8A00, + 0x8AFA, + 0x9650, + 0x4E4E, + 0x500B, + 0x53E4, + 0x547C, + 0x56FA, + 0x59D1, + 0x5B64, + 0x5DF1, + 0x5EAB, + 0x5F27, + 0x6238, + 0x6545, + 0x67AF, + 0x6E56, + 0x72D0, + 0x7CCA, + 0x88B4, + 0x80A1, + 0x80E1, + 0x83F0, + 0x864E, + 0x8A87, + 0x8DE8, + 0x9237, + 0x96C7, + 0x9867, + 0x9F13, + 0x4E94, + 0x4E92, + 0x4F0D, + 0x5348, + 0x5449, + 0x543E, + 0x5A2F, + 0x5F8C, + 0x5FA1, + 0x609F, + 0x68A7, + 0x6A8E, + 0x745A, + 0x7881, + 0x8A9E, + 0x8AA4, + 0x8B77, + 0x9190, + 0x4E5E, + 0x9BC9, + 0x4EA4, + 0x4F7C, + 0x4FAF, + 0x5019, + 0x5016, + 0x5149, + 0x516C, + 0x529F, + 0x52B9, + 0x52FE, + 0x539A, + 0x53E3, + 0x5411, + 0x540E, + 0x5589, + 0x5751, + 0x57A2, + 0x597D, + 0x5B54, + 0x5B5D, + 0x5B8F, + 0x5DE5, + 0x5DE7, + 0x5DF7, + 0x5E78, + 0x5E83, + 0x5E9A, + 0x5EB7, + 0x5F18, + 0x6052, + 0x614C, + 0x6297, + 0x62D8, + 0x63A7, + 0x653B, + 0x6602, + 0x6643, + 0x66F4, + 0x676D, + 0x6821, + 0x6897, + 0x69CB, + 0x6C5F, + 0x6D2A, + 0x6D69, + 0x6E2F, + 0x6E9D, + 0x7532, + 0x7687, + 0x786C, + 0x7A3F, + 0x7CE0, + 0x7D05, + 0x7D18, + 0x7D5E, + 0x7DB1, + 0x8015, + 0x8003, + 0x80AF, + 0x80B1, + 0x8154, + 0x818F, + 0x822A, + 0x8352, + 0x884C, + 0x8861, + 0x8B1B, + 0x8CA2, + 0x8CFC, + 0x90CA, + 0x9175, + 0x9271, + 0x783F, + 0x92FC, + 0x95A4, + 0x964D, + 0x9805, + 0x9999, + 0x9AD8, + 0x9D3B, + 0x525B, + 0x52AB, + 0x53F7, + 0x5408, + 0x58D5, + 0x62F7, + 0x6FE0, + 0x8C6A, + 0x8F5F, + 0x9EB9, + 0x514B, + 0x523B, + 0x544A, + 0x56FD, + 0x7A40, + 0x9177, + 0x9D60, + 0x9ED2, + 0x7344, + 0x6F09, + 0x8170, + 0x7511, + 0x5FFD, + 0x60DA, + 0x9AA8, + 0x72DB, + 0x8FBC, + 0x6B64, + 0x9803, + 0x4ECA, + 0x56F0, + 0x5764, + 0x58BE, + 0x5A5A, + 0x6068, + 0x61C7, + 0x660F, + 0x6606, + 0x6839, + 0x68B1, + 0x6DF7, + 0x75D5, + 0x7D3A, + 0x826E, + 0x9B42, + 0x4E9B, + 0x4F50, + 0x53C9, + 0x5506, + 0x5D6F, + 0x5DE6, + 0x5DEE, + 0x67FB, + 0x6C99, + 0x7473, + 0x7802, + 0x8A50, + 0x9396, + 0x88DF, + 0x5750, + 0x5EA7, + 0x632B, + 0x50B5, + 0x50AC, + 0x518D, + 0x6700, + 0x54C9, + 0x585E, + 0x59BB, + 0x5BB0, + 0x5F69, + 0x624D, + 0x63A1, + 0x683D, + 0x6B73, + 0x6E08, + 0x707D, + 0x91C7, + 0x7280, + 0x7815, + 0x7826, + 0x796D, + 0x658E, + 0x7D30, + 0x83DC, + 0x88C1, + 0x8F09, + 0x969B, + 0x5264, + 0x5728, + 0x6750, + 0x7F6A, + 0x8CA1, + 0x51B4, + 0x5742, + 0x962A, + 0x583A, + 0x698A, + 0x80B4, + 0x54B2, + 0x5D0E, + 0x57FC, + 0x7895, + 0x9DFA, + 0x4F5C, + 0x524A, + 0x548B, + 0x643E, + 0x6628, + 0x6714, + 0x67F5, + 0x7A84, + 0x7B56, + 0x7D22, + 0x932F, + 0x685C, + 0x9BAD, + 0x7B39, + 0x5319, + 0x518A, + 0x5237, + 0x5BDF, + 0x62F6, + 0x64AE, + 0x64E6, + 0x672D, + 0x6BBA, + 0x85A9, + 0x96D1, + 0x7690, + 0x9BD6, + 0x634C, + 0x9306, + 0x9BAB, + 0x76BF, + 0x6652, + 0x4E09, + 0x5098, + 0x53C2, + 0x5C71, + 0x60E8, + 0x6492, + 0x6563, + 0x685F, + 0x71E6, + 0x73CA, + 0x7523, + 0x7B97, + 0x7E82, + 0x8695, + 0x8B83, + 0x8CDB, + 0x9178, + 0x9910, + 0x65AC, + 0x66AB, + 0x6B8B, + 0x4ED5, + 0x4ED4, + 0x4F3A, + 0x4F7F, + 0x523A, + 0x53F8, + 0x53F2, + 0x55E3, + 0x56DB, + 0x58EB, + 0x59CB, + 0x59C9, + 0x59FF, + 0x5B50, + 0x5C4D, + 0x5E02, + 0x5E2B, + 0x5FD7, + 0x601D, + 0x6307, + 0x652F, + 0x5B5C, + 0x65AF, + 0x65BD, + 0x65E8, + 0x679D, + 0x6B62, + 0x6B7B, + 0x6C0F, + 0x7345, + 0x7949, + 0x79C1, + 0x7CF8, + 0x7D19, + 0x7D2B, + 0x80A2, + 0x8102, + 0x81F3, + 0x8996, + 0x8A5E, + 0x8A69, + 0x8A66, + 0x8A8C, + 0x8AEE, + 0x8CC7, + 0x8CDC, + 0x96CC, + 0x98FC, + 0x6B6F, + 0x4E8B, + 0x4F3C, + 0x4F8D, + 0x5150, + 0x5B57, + 0x5BFA, + 0x6148, + 0x6301, + 0x6642, + 0x6B21, + 0x6ECB, + 0x6CBB, + 0x723E, + 0x74BD, + 0x75D4, + 0x78C1, + 0x793A, + 0x800C, + 0x8033, + 0x81EA, + 0x8494, + 0x8F9E, + 0x6C50, + 0x9E7F, + 0x5F0F, + 0x8B58, + 0x9D2B, + 0x7AFA, + 0x8EF8, + 0x5B8D, + 0x96EB, + 0x4E03, + 0x53F1, + 0x57F7, + 0x5931, + 0x5AC9, + 0x5BA4, + 0x6089, + 0x6E7F, + 0x6F06, + 0x75BE, + 0x8CEA, + 0x5B9F, + 0x8500, + 0x7BE0, + 0x5072, + 0x67F4, + 0x829D, + 0x5C61, + 0x854A, + 0x7E1E, + 0x820E, + 0x5199, + 0x5C04, + 0x6368, + 0x8D66, + 0x659C, + 0x716E, + 0x793E, + 0x7D17, + 0x8005, + 0x8B1D, + 0x8ECA, + 0x906E, + 0x86C7, + 0x90AA, + 0x501F, + 0x52FA, + 0x5C3A, + 0x6753, + 0x707C, + 0x7235, + 0x914C, + 0x91C8, + 0x932B, + 0x82E5, + 0x5BC2, + 0x5F31, + 0x60F9, + 0x4E3B, + 0x53D6, + 0x5B88, + 0x624B, + 0x6731, + 0x6B8A, + 0x72E9, + 0x73E0, + 0x7A2E, + 0x816B, + 0x8DA3, + 0x9152, + 0x9996, + 0x5112, + 0x53D7, + 0x546A, + 0x5BFF, + 0x6388, + 0x6A39, + 0x7DAC, + 0x9700, + 0x56DA, + 0x53CE, + 0x5468, + 0x5B97, + 0x5C31, + 0x5DDE, + 0x4FEE, + 0x6101, + 0x62FE, + 0x6D32, + 0x79C0, + 0x79CB, + 0x7D42, + 0x7E4D, + 0x7FD2, + 0x81ED, + 0x821F, + 0x8490, + 0x8846, + 0x8972, + 0x8B90, + 0x8E74, + 0x8F2F, + 0x9031, + 0x914B, + 0x916C, + 0x96C6, + 0x919C, + 0x4EC0, + 0x4F4F, + 0x5145, + 0x5341, + 0x5F93, + 0x620E, + 0x67D4, + 0x6C41, + 0x6E0B, + 0x7363, + 0x7E26, + 0x91CD, + 0x9283, + 0x53D4, + 0x5919, + 0x5BBF, + 0x6DD1, + 0x795D, + 0x7E2E, + 0x7C9B, + 0x587E, + 0x719F, + 0x51FA, + 0x8853, + 0x8FF0, + 0x4FCA, + 0x5CFB, + 0x6625, + 0x77AC, + 0x7AE3, + 0x821C, + 0x99FF, + 0x51C6, + 0x5FAA, + 0x65EC, + 0x696F, + 0x6B89, + 0x6DF3, + 0x6E96, + 0x6F64, + 0x76FE, + 0x7D14, + 0x5DE1, + 0x9075, + 0x9187, + 0x9806, + 0x51E6, + 0x521D, + 0x6240, + 0x6691, + 0x66D9, + 0x6E1A, + 0x5EB6, + 0x7DD2, + 0x7F72, + 0x66F8, + 0x85AF, + 0x85F7, + 0x8AF8, + 0x52A9, + 0x53D9, + 0x5973, + 0x5E8F, + 0x5F90, + 0x6055, + 0x92E4, + 0x9664, + 0x50B7, + 0x511F, + 0x52DD, + 0x5320, + 0x5347, + 0x53EC, + 0x54E8, + 0x5546, + 0x5531, + 0x5617, + 0x5968, + 0x59BE, + 0x5A3C, + 0x5BB5, + 0x5C06, + 0x5C0F, + 0x5C11, + 0x5C1A, + 0x5E84, + 0x5E8A, + 0x5EE0, + 0x5F70, + 0x627F, + 0x6284, + 0x62DB, + 0x638C, + 0x6377, + 0x6607, + 0x660C, + 0x662D, + 0x6676, + 0x677E, + 0x68A2, + 0x6A1F, + 0x6A35, + 0x6CBC, + 0x6D88, + 0x6E09, + 0x6E58, + 0x713C, + 0x7126, + 0x7167, + 0x75C7, + 0x7701, + 0x785D, + 0x7901, + 0x7965, + 0x79F0, + 0x7AE0, + 0x7B11, + 0x7CA7, + 0x7D39, + 0x8096, + 0x83D6, + 0x848B, + 0x8549, + 0x885D, + 0x88F3, + 0x8A1F, + 0x8A3C, + 0x8A54, + 0x8A73, + 0x8C61, + 0x8CDE, + 0x91A4, + 0x9266, + 0x937E, + 0x9418, + 0x969C, + 0x9798, + 0x4E0A, + 0x4E08, + 0x4E1E, + 0x4E57, + 0x5197, + 0x5270, + 0x57CE, + 0x5834, + 0x58CC, + 0x5B22, + 0x5E38, + 0x60C5, + 0x64FE, + 0x6761, + 0x6756, + 0x6D44, + 0x72B6, + 0x7573, + 0x7A63, + 0x84B8, + 0x8B72, + 0x91B8, + 0x9320, + 0x5631, + 0x57F4, + 0x98FE, + 0x62ED, + 0x690D, + 0x6B96, + 0x71ED, + 0x7E54, + 0x8077, + 0x8272, + 0x89E6, + 0x98DF, + 0x8755, + 0x8FB1, + 0x5C3B, + 0x4F38, + 0x4FE1, + 0x4FB5, + 0x5507, + 0x5A20, + 0x5BDD, + 0x5BE9, + 0x5FC3, + 0x614E, + 0x632F, + 0x65B0, + 0x664B, + 0x68EE, + 0x699B, + 0x6D78, + 0x6DF1, + 0x7533, + 0x75B9, + 0x771F, + 0x795E, + 0x79E6, + 0x7D33, + 0x81E3, + 0x82AF, + 0x85AA, + 0x89AA, + 0x8A3A, + 0x8EAB, + 0x8F9B, + 0x9032, + 0x91DD, + 0x9707, + 0x4EBA, + 0x4EC1, + 0x5203, + 0x5875, + 0x58EC, + 0x5C0B, + 0x751A, + 0x5C3D, + 0x814E, + 0x8A0A, + 0x8FC5, + 0x9663, + 0x976D, + 0x7B25, + 0x8ACF, + 0x9808, + 0x9162, + 0x56F3, + 0x53A8, + 0x9017, + 0x5439, + 0x5782, + 0x5E25, + 0x63A8, + 0x6C34, + 0x708A, + 0x7761, + 0x7C8B, + 0x7FE0, + 0x8870, + 0x9042, + 0x9154, + 0x9310, + 0x9318, + 0x968F, + 0x745E, + 0x9AC4, + 0x5D07, + 0x5D69, + 0x6570, + 0x67A2, + 0x8DA8, + 0x96DB, + 0x636E, + 0x6749, + 0x6919, + 0x83C5, + 0x9817, + 0x96C0, + 0x88FE, + 0x6F84, + 0x647A, + 0x5BF8, + 0x4E16, + 0x702C, + 0x755D, + 0x662F, + 0x51C4, + 0x5236, + 0x52E2, + 0x59D3, + 0x5F81, + 0x6027, + 0x6210, + 0x653F, + 0x6574, + 0x661F, + 0x6674, + 0x68F2, + 0x6816, + 0x6B63, + 0x6E05, + 0x7272, + 0x751F, + 0x76DB, + 0x7CBE, + 0x8056, + 0x58F0, + 0x88FD, + 0x897F, + 0x8AA0, + 0x8A93, + 0x8ACB, + 0x901D, + 0x9192, + 0x9752, + 0x9759, + 0x6589, + 0x7A0E, + 0x8106, + 0x96BB, + 0x5E2D, + 0x60DC, + 0x621A, + 0x65A5, + 0x6614, + 0x6790, + 0x77F3, + 0x7A4D, + 0x7C4D, + 0x7E3E, + 0x810A, + 0x8CAC, + 0x8D64, + 0x8DE1, + 0x8E5F, + 0x78A9, + 0x5207, + 0x62D9, + 0x63A5, + 0x6442, + 0x6298, + 0x8A2D, + 0x7A83, + 0x7BC0, + 0x8AAC, + 0x96EA, + 0x7D76, + 0x820C, + 0x8749, + 0x4ED9, + 0x5148, + 0x5343, + 0x5360, + 0x5BA3, + 0x5C02, + 0x5C16, + 0x5DDD, + 0x6226, + 0x6247, + 0x64B0, + 0x6813, + 0x6834, + 0x6CC9, + 0x6D45, + 0x6D17, + 0x67D3, + 0x6F5C, + 0x714E, + 0x717D, + 0x65CB, + 0x7A7F, + 0x7BAD, + 0x7DDA, + 0x7E4A, + 0x7FA8, + 0x817A, + 0x821B, + 0x8239, + 0x85A6, + 0x8A6E, + 0x8CCE, + 0x8DF5, + 0x9078, + 0x9077, + 0x92AD, + 0x9291, + 0x9583, + 0x9BAE, + 0x524D, + 0x5584, + 0x6F38, + 0x7136, + 0x5168, + 0x7985, + 0x7E55, + 0x81B3, + 0x7CCE, + 0x564C, + 0x5851, + 0x5CA8, + 0x63AA, + 0x66FE, + 0x66FD, + 0x695A, + 0x72D9, + 0x758F, + 0x758E, + 0x790E, + 0x7956, + 0x79DF, + 0x7C97, + 0x7D20, + 0x7D44, + 0x8607, + 0x8A34, + 0x963B, + 0x9061, + 0x9F20, + 0x50E7, + 0x5275, + 0x53CC, + 0x53E2, + 0x5009, + 0x55AA, + 0x58EE, + 0x594F, + 0x723D, + 0x5B8B, + 0x5C64, + 0x531D, + 0x60E3, + 0x60F3, + 0x635C, + 0x6383, + 0x633F, + 0x63BB, + 0x64CD, + 0x65E9, + 0x66F9, + 0x5DE3, + 0x69CD, + 0x69FD, + 0x6F15, + 0x71E5, + 0x4E89, + 0x75E9, + 0x76F8, + 0x7A93, + 0x7CDF, + 0x7DCF, + 0x7D9C, + 0x8061, + 0x8349, + 0x8358, + 0x846C, + 0x84BC, + 0x85FB, + 0x88C5, + 0x8D70, + 0x9001, + 0x906D, + 0x9397, + 0x971C, + 0x9A12, + 0x50CF, + 0x5897, + 0x618E, + 0x81D3, + 0x8535, + 0x8D08, + 0x9020, + 0x4FC3, + 0x5074, + 0x5247, + 0x5373, + 0x606F, + 0x6349, + 0x675F, + 0x6E2C, + 0x8DB3, + 0x901F, + 0x4FD7, + 0x5C5E, + 0x8CCA, + 0x65CF, + 0x7D9A, + 0x5352, + 0x8896, + 0x5176, + 0x63C3, + 0x5B58, + 0x5B6B, + 0x5C0A, + 0x640D, + 0x6751, + 0x905C, + 0x4ED6, + 0x591A, + 0x592A, + 0x6C70, + 0x8A51, + 0x553E, + 0x5815, + 0x59A5, + 0x60F0, + 0x6253, + 0x67C1, + 0x8235, + 0x6955, + 0x9640, + 0x99C4, + 0x9A28, + 0x4F53, + 0x5806, + 0x5BFE, + 0x8010, + 0x5CB1, + 0x5E2F, + 0x5F85, + 0x6020, + 0x614B, + 0x6234, + 0x66FF, + 0x6CF0, + 0x6EDE, + 0x80CE, + 0x817F, + 0x82D4, + 0x888B, + 0x8CB8, + 0x9000, + 0x902E, + 0x968A, + 0x9EDB, + 0x9BDB, + 0x4EE3, + 0x53F0, + 0x5927, + 0x7B2C, + 0x918D, + 0x984C, + 0x9DF9, + 0x6EDD, + 0x7027, + 0x5353, + 0x5544, + 0x5B85, + 0x6258, + 0x629E, + 0x62D3, + 0x6CA2, + 0x6FEF, + 0x7422, + 0x8A17, + 0x9438, + 0x6FC1, + 0x8AFE, + 0x8338, + 0x51E7, + 0x86F8, + 0x53EA, + 0x53E9, + 0x4F46, + 0x9054, + 0x8FB0, + 0x596A, + 0x8131, + 0x5DFD, + 0x7AEA, + 0x8FBF, + 0x68DA, + 0x8C37, + 0x72F8, + 0x9C48, + 0x6A3D, + 0x8AB0, + 0x4E39, + 0x5358, + 0x5606, + 0x5766, + 0x62C5, + 0x63A2, + 0x65E6, + 0x6B4E, + 0x6DE1, + 0x6E5B, + 0x70AD, + 0x77ED, + 0x7AEF, + 0x7BAA, + 0x7DBB, + 0x803D, + 0x80C6, + 0x86CB, + 0x8A95, + 0x935B, + 0x56E3, + 0x58C7, + 0x5F3E, + 0x65AD, + 0x6696, + 0x6A80, + 0x6BB5, + 0x7537, + 0x8AC7, + 0x5024, + 0x77E5, + 0x5730, + 0x5F1B, + 0x6065, + 0x667A, + 0x6C60, + 0x75F4, + 0x7A1A, + 0x7F6E, + 0x81F4, + 0x8718, + 0x9045, + 0x99B3, + 0x7BC9, + 0x755C, + 0x7AF9, + 0x7B51, + 0x84C4, + 0x9010, + 0x79E9, + 0x7A92, + 0x8336, + 0x5AE1, + 0x7740, + 0x4E2D, + 0x4EF2, + 0x5B99, + 0x5FE0, + 0x62BD, + 0x663C, + 0x67F1, + 0x6CE8, + 0x866B, + 0x8877, + 0x8A3B, + 0x914E, + 0x92F3, + 0x99D0, + 0x6A17, + 0x7026, + 0x732A, + 0x82E7, + 0x8457, + 0x8CAF, + 0x4E01, + 0x5146, + 0x51CB, + 0x558B, + 0x5BF5, + 0x5E16, + 0x5E33, + 0x5E81, + 0x5F14, + 0x5F35, + 0x5F6B, + 0x5FB4, + 0x61F2, + 0x6311, + 0x66A2, + 0x671D, + 0x6F6E, + 0x7252, + 0x753A, + 0x773A, + 0x8074, + 0x8139, + 0x8178, + 0x8776, + 0x8ABF, + 0x8ADC, + 0x8D85, + 0x8DF3, + 0x929A, + 0x9577, + 0x9802, + 0x9CE5, + 0x52C5, + 0x6357, + 0x76F4, + 0x6715, + 0x6C88, + 0x73CD, + 0x8CC3, + 0x93AE, + 0x9673, + 0x6D25, + 0x589C, + 0x690E, + 0x69CC, + 0x8FFD, + 0x939A, + 0x75DB, + 0x901A, + 0x585A, + 0x6802, + 0x63B4, + 0x69FB, + 0x4F43, + 0x6F2C, + 0x67D8, + 0x8FBB, + 0x8526, + 0x7DB4, + 0x9354, + 0x693F, + 0x6F70, + 0x576A, + 0x58F7, + 0x5B2C, + 0x7D2C, + 0x722A, + 0x540A, + 0x91E3, + 0x9DB4, + 0x4EAD, + 0x4F4E, + 0x505C, + 0x5075, + 0x5243, + 0x8C9E, + 0x5448, + 0x5824, + 0x5B9A, + 0x5E1D, + 0x5E95, + 0x5EAD, + 0x5EF7, + 0x5F1F, + 0x608C, + 0x62B5, + 0x633A, + 0x63D0, + 0x68AF, + 0x6C40, + 0x7887, + 0x798E, + 0x7A0B, + 0x7DE0, + 0x8247, + 0x8A02, + 0x8AE6, + 0x8E44, + 0x9013, + 0x90B8, + 0x912D, + 0x91D8, + 0x9F0E, + 0x6CE5, + 0x6458, + 0x64E2, + 0x6575, + 0x6EF4, + 0x7684, + 0x7B1B, + 0x9069, + 0x93D1, + 0x6EBA, + 0x54F2, + 0x5FB9, + 0x64A4, + 0x8F4D, + 0x8FED, + 0x9244, + 0x5178, + 0x586B, + 0x5929, + 0x5C55, + 0x5E97, + 0x6DFB, + 0x7E8F, + 0x751C, + 0x8CBC, + 0x8EE2, + 0x985B, + 0x70B9, + 0x4F1D, + 0x6BBF, + 0x6FB1, + 0x7530, + 0x96FB, + 0x514E, + 0x5410, + 0x5835, + 0x5857, + 0x59AC, + 0x5C60, + 0x5F92, + 0x6597, + 0x675C, + 0x6E21, + 0x767B, + 0x83DF, + 0x8CED, + 0x9014, + 0x90FD, + 0x934D, + 0x7825, + 0x783A, + 0x52AA, + 0x5EA6, + 0x571F, + 0x5974, + 0x6012, + 0x5012, + 0x515A, + 0x51AC, + 0x51CD, + 0x5200, + 0x5510, + 0x5854, + 0x5858, + 0x5957, + 0x5B95, + 0x5CF6, + 0x5D8B, + 0x60BC, + 0x6295, + 0x642D, + 0x6771, + 0x6843, + 0x68BC, + 0x68DF, + 0x76D7, + 0x6DD8, + 0x6E6F, + 0x6D9B, + 0x706F, + 0x71C8, + 0x5F53, + 0x75D8, + 0x7977, + 0x7B49, + 0x7B54, + 0x7B52, + 0x7CD6, + 0x7D71, + 0x5230, + 0x8463, + 0x8569, + 0x85E4, + 0x8A0E, + 0x8B04, + 0x8C46, + 0x8E0F, + 0x9003, + 0x900F, + 0x9419, + 0x9676, + 0x982D, + 0x9A30, + 0x95D8, + 0x50CD, + 0x52D5, + 0x540C, + 0x5802, + 0x5C0E, + 0x61A7, + 0x649E, + 0x6D1E, + 0x77B3, + 0x7AE5, + 0x80F4, + 0x8404, + 0x9053, + 0x9285, + 0x5CE0, + 0x9D07, + 0x533F, + 0x5F97, + 0x5FB3, + 0x6D9C, + 0x7279, + 0x7763, + 0x79BF, + 0x7BE4, + 0x6BD2, + 0x72EC, + 0x8AAD, + 0x6803, + 0x6A61, + 0x51F8, + 0x7A81, + 0x6934, + 0x5C4A, + 0x9CF6, + 0x82EB, + 0x5BC5, + 0x9149, + 0x701E, + 0x5678, + 0x5C6F, + 0x60C7, + 0x6566, + 0x6C8C, + 0x8C5A, + 0x9041, + 0x9813, + 0x5451, + 0x66C7, + 0x920D, + 0x5948, + 0x90A3, + 0x5185, + 0x4E4D, + 0x51EA, + 0x8599, + 0x8B0E, + 0x7058, + 0x637A, + 0x934B, + 0x6962, + 0x99B4, + 0x7E04, + 0x7577, + 0x5357, + 0x6960, + 0x8EDF, + 0x96E3, + 0x6C5D, + 0x4E8C, + 0x5C3C, + 0x5F10, + 0x8FE9, + 0x5302, + 0x8CD1, + 0x8089, + 0x8679, + 0x5EFF, + 0x65E5, + 0x4E73, + 0x5165, + 0x5982, + 0x5C3F, + 0x97EE, + 0x4EFB, + 0x598A, + 0x5FCD, + 0x8A8D, + 0x6FE1, + 0x79B0, + 0x7962, + 0x5BE7, + 0x8471, + 0x732B, + 0x71B1, + 0x5E74, + 0x5FF5, + 0x637B, + 0x649A, + 0x71C3, + 0x7C98, + 0x4E43, + 0x5EFC, + 0x4E4B, + 0x57DC, + 0x56A2, + 0x60A9, + 0x6FC3, + 0x7D0D, + 0x80FD, + 0x8133, + 0x81BF, + 0x8FB2, + 0x8997, + 0x86A4, + 0x5DF4, + 0x628A, + 0x64AD, + 0x8987, + 0x6777, + 0x6CE2, + 0x6D3E, + 0x7436, + 0x7834, + 0x5A46, + 0x7F75, + 0x82AD, + 0x99AC, + 0x4FF3, + 0x5EC3, + 0x62DD, + 0x6392, + 0x6557, + 0x676F, + 0x76C3, + 0x724C, + 0x80CC, + 0x80BA, + 0x8F29, + 0x914D, + 0x500D, + 0x57F9, + 0x5A92, + 0x6885, + 0x6973, + 0x7164, + 0x72FD, + 0x8CB7, + 0x58F2, + 0x8CE0, + 0x966A, + 0x9019, + 0x877F, + 0x79E4, + 0x77E7, + 0x8429, + 0x4F2F, + 0x5265, + 0x535A, + 0x62CD, + 0x67CF, + 0x6CCA, + 0x767D, + 0x7B94, + 0x7C95, + 0x8236, + 0x8584, + 0x8FEB, + 0x66DD, + 0x6F20, + 0x7206, + 0x7E1B, + 0x83AB, + 0x99C1, + 0x9EA6, + 0x51FD, + 0x7BB1, + 0x7872, + 0x7BB8, + 0x8087, + 0x7B48, + 0x6AE8, + 0x5E61, + 0x808C, + 0x7551, + 0x7560, + 0x516B, + 0x9262, + 0x6E8C, + 0x767A, + 0x9197, + 0x9AEA, + 0x4F10, + 0x7F70, + 0x629C, + 0x7B4F, + 0x95A5, + 0x9CE9, + 0x567A, + 0x5859, + 0x86E4, + 0x96BC, + 0x4F34, + 0x5224, + 0x534A, + 0x53CD, + 0x53DB, + 0x5E06, + 0x642C, + 0x6591, + 0x677F, + 0x6C3E, + 0x6C4E, + 0x7248, + 0x72AF, + 0x73ED, + 0x7554, + 0x7E41, + 0x822C, + 0x85E9, + 0x8CA9, + 0x7BC4, + 0x91C6, + 0x7169, + 0x9812, + 0x98EF, + 0x633D, + 0x6669, + 0x756A, + 0x76E4, + 0x78D0, + 0x8543, + 0x86EE, + 0x532A, + 0x5351, + 0x5426, + 0x5983, + 0x5E87, + 0x5F7C, + 0x60B2, + 0x6249, + 0x6279, + 0x62AB, + 0x6590, + 0x6BD4, + 0x6CCC, + 0x75B2, + 0x76AE, + 0x7891, + 0x79D8, + 0x7DCB, + 0x7F77, + 0x80A5, + 0x88AB, + 0x8AB9, + 0x8CBB, + 0x907F, + 0x975E, + 0x98DB, + 0x6A0B, + 0x7C38, + 0x5099, + 0x5C3E, + 0x5FAE, + 0x6787, + 0x6BD8, + 0x7435, + 0x7709, + 0x7F8E, + 0x9F3B, + 0x67CA, + 0x7A17, + 0x5339, + 0x758B, + 0x9AED, + 0x5F66, + 0x819D, + 0x83F1, + 0x8098, + 0x5F3C, + 0x5FC5, + 0x7562, + 0x7B46, + 0x903C, + 0x6867, + 0x59EB, + 0x5A9B, + 0x7D10, + 0x767E, + 0x8B2C, + 0x4FF5, + 0x5F6A, + 0x6A19, + 0x6C37, + 0x6F02, + 0x74E2, + 0x7968, + 0x8868, + 0x8A55, + 0x8C79, + 0x5EDF, + 0x63CF, + 0x75C5, + 0x79D2, + 0x82D7, + 0x9328, + 0x92F2, + 0x849C, + 0x86ED, + 0x9C2D, + 0x54C1, + 0x5F6C, + 0x658C, + 0x6D5C, + 0x7015, + 0x8CA7, + 0x8CD3, + 0x983B, + 0x654F, + 0x74F6, + 0x4E0D, + 0x4ED8, + 0x57E0, + 0x592B, + 0x5A66, + 0x5BCC, + 0x51A8, + 0x5E03, + 0x5E9C, + 0x6016, + 0x6276, + 0x6577, + 0x65A7, + 0x666E, + 0x6D6E, + 0x7236, + 0x7B26, + 0x8150, + 0x819A, + 0x8299, + 0x8B5C, + 0x8CA0, + 0x8CE6, + 0x8D74, + 0x961C, + 0x9644, + 0x4FAE, + 0x64AB, + 0x6B66, + 0x821E, + 0x8461, + 0x856A, + 0x90E8, + 0x5C01, + 0x6953, + 0x98A8, + 0x847A, + 0x8557, + 0x4F0F, + 0x526F, + 0x5FA9, + 0x5E45, + 0x670D, + 0x798F, + 0x8179, + 0x8907, + 0x8986, + 0x6DF5, + 0x5F17, + 0x6255, + 0x6CB8, + 0x4ECF, + 0x7269, + 0x9B92, + 0x5206, + 0x543B, + 0x5674, + 0x58B3, + 0x61A4, + 0x626E, + 0x711A, + 0x596E, + 0x7C89, + 0x7CDE, + 0x7D1B, + 0x96F0, + 0x6587, + 0x805E, + 0x4E19, + 0x4F75, + 0x5175, + 0x5840, + 0x5E63, + 0x5E73, + 0x5F0A, + 0x67C4, + 0x4E26, + 0x853D, + 0x9589, + 0x965B, + 0x7C73, + 0x9801, + 0x50FB, + 0x58C1, + 0x7656, + 0x78A7, + 0x5225, + 0x77A5, + 0x8511, + 0x7B86, + 0x504F, + 0x5909, + 0x7247, + 0x7BC7, + 0x7DE8, + 0x8FBA, + 0x8FD4, + 0x904D, + 0x4FBF, + 0x52C9, + 0x5A29, + 0x5F01, + 0x97AD, + 0x4FDD, + 0x8217, + 0x92EA, + 0x5703, + 0x6355, + 0x6B69, + 0x752B, + 0x88DC, + 0x8F14, + 0x7A42, + 0x52DF, + 0x5893, + 0x6155, + 0x620A, + 0x66AE, + 0x6BCD, + 0x7C3F, + 0x83E9, + 0x5023, + 0x4FF8, + 0x5305, + 0x5446, + 0x5831, + 0x5949, + 0x5B9D, + 0x5CF0, + 0x5CEF, + 0x5D29, + 0x5E96, + 0x62B1, + 0x6367, + 0x653E, + 0x65B9, + 0x670B, + 0x6CD5, + 0x6CE1, + 0x70F9, + 0x7832, + 0x7E2B, + 0x80DE, + 0x82B3, + 0x840C, + 0x84EC, + 0x8702, + 0x8912, + 0x8A2A, + 0x8C4A, + 0x90A6, + 0x92D2, + 0x98FD, + 0x9CF3, + 0x9D6C, + 0x4E4F, + 0x4EA1, + 0x508D, + 0x5256, + 0x574A, + 0x59A8, + 0x5E3D, + 0x5FD8, + 0x5FD9, + 0x623F, + 0x66B4, + 0x671B, + 0x67D0, + 0x68D2, + 0x5192, + 0x7D21, + 0x80AA, + 0x81A8, + 0x8B00, + 0x8C8C, + 0x8CBF, + 0x927E, + 0x9632, + 0x5420, + 0x982C, + 0x5317, + 0x50D5, + 0x535C, + 0x58A8, + 0x64B2, + 0x6734, + 0x7267, + 0x7766, + 0x7A46, + 0x91E6, + 0x52C3, + 0x6CA1, + 0x6B86, + 0x5800, + 0x5E4C, + 0x5954, + 0x672C, + 0x7FFB, + 0x51E1, + 0x76C6, + 0x6469, + 0x78E8, + 0x9B54, + 0x9EBB, + 0x57CB, + 0x59B9, + 0x6627, + 0x679A, + 0x6BCE, + 0x54E9, + 0x69D9, + 0x5E55, + 0x819C, + 0x6795, + 0x9BAA, + 0x67FE, + 0x9C52, + 0x685D, + 0x4EA6, + 0x4FE3, + 0x53C8, + 0x62B9, + 0x672B, + 0x6CAB, + 0x8FC4, + 0x4FAD, + 0x7E6D, + 0x9EBF, + 0x4E07, + 0x6162, + 0x6E80, + 0x6F2B, + 0x8513, + 0x5473, + 0x672A, + 0x9B45, + 0x5DF3, + 0x7B95, + 0x5CAC, + 0x5BC6, + 0x871C, + 0x6E4A, + 0x84D1, + 0x7A14, + 0x8108, + 0x5999, + 0x7C8D, + 0x6C11, + 0x7720, + 0x52D9, + 0x5922, + 0x7121, + 0x725F, + 0x77DB, + 0x9727, + 0x9D61, + 0x690B, + 0x5A7F, + 0x5A18, + 0x51A5, + 0x540D, + 0x547D, + 0x660E, + 0x76DF, + 0x8FF7, + 0x9298, + 0x9CF4, + 0x59EA, + 0x725D, + 0x6EC5, + 0x514D, + 0x68C9, + 0x7DBF, + 0x7DEC, + 0x9762, + 0x9EBA, + 0x6478, + 0x6A21, + 0x8302, + 0x5984, + 0x5B5F, + 0x6BDB, + 0x731B, + 0x76F2, + 0x7DB2, + 0x8017, + 0x8499, + 0x5132, + 0x6728, + 0x9ED9, + 0x76EE, + 0x6762, + 0x52FF, + 0x9905, + 0x5C24, + 0x623B, + 0x7C7E, + 0x8CB0, + 0x554F, + 0x60B6, + 0x7D0B, + 0x9580, + 0x5301, + 0x4E5F, + 0x51B6, + 0x591C, + 0x723A, + 0x8036, + 0x91CE, + 0x5F25, + 0x77E2, + 0x5384, + 0x5F79, + 0x7D04, + 0x85AC, + 0x8A33, + 0x8E8D, + 0x9756, + 0x67F3, + 0x85AE, + 0x9453, + 0x6109, + 0x6108, + 0x6CB9, + 0x7652, + 0x8AED, + 0x8F38, + 0x552F, + 0x4F51, + 0x512A, + 0x52C7, + 0x53CB, + 0x5BA5, + 0x5E7D, + 0x60A0, + 0x6182, + 0x63D6, + 0x6709, + 0x67DA, + 0x6E67, + 0x6D8C, + 0x7336, + 0x7337, + 0x7531, + 0x7950, + 0x88D5, + 0x8A98, + 0x904A, + 0x9091, + 0x90F5, + 0x96C4, + 0x878D, + 0x5915, + 0x4E88, + 0x4F59, + 0x4E0E, + 0x8A89, + 0x8F3F, + 0x9810, + 0x50AD, + 0x5E7C, + 0x5996, + 0x5BB9, + 0x5EB8, + 0x63DA, + 0x63FA, + 0x64C1, + 0x66DC, + 0x694A, + 0x69D8, + 0x6D0B, + 0x6EB6, + 0x7194, + 0x7528, + 0x7AAF, + 0x7F8A, + 0x8000, + 0x8449, + 0x84C9, + 0x8981, + 0x8B21, + 0x8E0A, + 0x9065, + 0x967D, + 0x990A, + 0x617E, + 0x6291, + 0x6B32, + 0x6C83, + 0x6D74, + 0x7FCC, + 0x7FFC, + 0x6DC0, + 0x7F85, + 0x87BA, + 0x88F8, + 0x6765, + 0x83B1, + 0x983C, + 0x96F7, + 0x6D1B, + 0x7D61, + 0x843D, + 0x916A, + 0x4E71, + 0x5375, + 0x5D50, + 0x6B04, + 0x6FEB, + 0x85CD, + 0x862D, + 0x89A7, + 0x5229, + 0x540F, + 0x5C65, + 0x674E, + 0x68A8, + 0x7406, + 0x7483, + 0x75E2, + 0x88CF, + 0x88E1, + 0x91CC, + 0x96E2, + 0x9678, + 0x5F8B, + 0x7387, + 0x7ACB, + 0x844E, + 0x63A0, + 0x7565, + 0x5289, + 0x6D41, + 0x6E9C, + 0x7409, + 0x7559, + 0x786B, + 0x7C92, + 0x9686, + 0x7ADC, + 0x9F8D, + 0x4FB6, + 0x616E, + 0x65C5, + 0x865C, + 0x4E86, + 0x4EAE, + 0x50DA, + 0x4E21, + 0x51CC, + 0x5BEE, + 0x6599, + 0x6881, + 0x6DBC, + 0x731F, + 0x7642, + 0x77AD, + 0x7A1C, + 0x7CE7, + 0x826F, + 0x8AD2, + 0x907C, + 0x91CF, + 0x9675, + 0x9818, + 0x529B, + 0x7DD1, + 0x502B, + 0x5398, + 0x6797, + 0x6DCB, + 0x71D0, + 0x7433, + 0x81E8, + 0x8F2A, + 0x96A3, + 0x9C57, + 0x9E9F, + 0x7460, + 0x5841, + 0x6D99, + 0x7D2F, + 0x985E, + 0x4EE4, + 0x4F36, + 0x4F8B, + 0x51B7, + 0x52B1, + 0x5DBA, + 0x601C, + 0x73B2, + 0x793C, + 0x82D3, + 0x9234, + 0x96B7, + 0x96F6, + 0x970A, + 0x9E97, + 0x9F62, + 0x66A6, + 0x6B74, + 0x5217, + 0x52A3, + 0x70C8, + 0x88C2, + 0x5EC9, + 0x604B, + 0x6190, + 0x6F23, + 0x7149, + 0x7C3E, + 0x7DF4, + 0x806F, + 0x84EE, + 0x9023, + 0x932C, + 0x5442, + 0x9B6F, + 0x6AD3, + 0x7089, + 0x8CC2, + 0x8DEF, + 0x9732, + 0x52B4, + 0x5A41, + 0x5ECA, + 0x5F04, + 0x6717, + 0x697C, + 0x6994, + 0x6D6A, + 0x6F0F, + 0x7262, + 0x72FC, + 0x7BED, + 0x8001, + 0x807E, + 0x874B, + 0x90CE, + 0x516D, + 0x9E93, + 0x7984, + 0x808B, + 0x9332, + 0x8AD6, + 0x502D, + 0x548C, + 0x8A71, + 0x6B6A, + 0x8CC4, + 0x8107, + 0x60D1, + 0x67A0, + 0x9DF2, + 0x4E99, + 0x4E98, + 0x9C10, + 0x8A6B, + 0x85C1, + 0x8568, + 0x6900, + 0x6E7E, + 0x7897, + 0x8155 +}; + +/* d0a1 to f4a6 is contiguous */ + +static unsigned short d02f4[] = { + 0x5F0C, + 0x4E10, + 0x4E15, + 0x4E2A, + 0x4E31, + 0x4E36, + 0x4E3C, + 0x4E3F, + 0x4E42, + 0x4E56, + 0x4E58, + 0x4E82, + 0x4E85, + 0x8C6B, + 0x4E8A, + 0x8212, + 0x5F0D, + 0x4E8E, + 0x4E9E, + 0x4E9F, + 0x4EA0, + 0x4EA2, + 0x4EB0, + 0x4EB3, + 0x4EB6, + 0x4ECE, + 0x4ECD, + 0x4EC4, + 0x4EC6, + 0x4EC2, + 0x4ED7, + 0x4EDE, + 0x4EED, + 0x4EDF, + 0x4EF7, + 0x4F09, + 0x4F5A, + 0x4F30, + 0x4F5B, + 0x4F5D, + 0x4F57, + 0x4F47, + 0x4F76, + 0x4F88, + 0x4F8F, + 0x4F98, + 0x4F7B, + 0x4F69, + 0x4F70, + 0x4F91, + 0x4F6F, + 0x4F86, + 0x4F96, + 0x5118, + 0x4FD4, + 0x4FDF, + 0x4FCE, + 0x4FD8, + 0x4FDB, + 0x4FD1, + 0x4FDA, + 0x4FD0, + 0x4FE4, + 0x4FE5, + 0x501A, + 0x5028, + 0x5014, + 0x502A, + 0x5025, + 0x5005, + 0x4F1C, + 0x4FF6, + 0x5021, + 0x5029, + 0x502C, + 0x4FFE, + 0x4FEF, + 0x5011, + 0x5006, + 0x5043, + 0x5047, + 0x6703, + 0x5055, + 0x5050, + 0x5048, + 0x505A, + 0x5056, + 0x506C, + 0x5078, + 0x5080, + 0x509A, + 0x5085, + 0x50B4, + 0x50B2, + 0x50C9, + 0x50CA, + 0x50B3, + 0x50C2, + 0x50D6, + 0x50DE, + 0x50E5, + 0x50ED, + 0x50E3, + 0x50EE, + 0x50F9, + 0x50F5, + 0x5109, + 0x5101, + 0x5102, + 0x5116, + 0x5115, + 0x5114, + 0x511A, + 0x5121, + 0x513A, + 0x5137, + 0x513C, + 0x513B, + 0x513F, + 0x5140, + 0x5152, + 0x514C, + 0x5154, + 0x5162, + 0x7AF8, + 0x5169, + 0x516A, + 0x516E, + 0x5180, + 0x5182, + 0x56D8, + 0x518C, + 0x5189, + 0x518F, + 0x5191, + 0x5193, + 0x5195, + 0x5196, + 0x51A4, + 0x51A6, + 0x51A2, + 0x51A9, + 0x51AA, + 0x51AB, + 0x51B3, + 0x51B1, + 0x51B2, + 0x51B0, + 0x51B5, + 0x51BD, + 0x51C5, + 0x51C9, + 0x51DB, + 0x51E0, + 0x8655, + 0x51E9, + 0x51ED, + 0x51F0, + 0x51F5, + 0x51FE, + 0x5204, + 0x520B, + 0x5214, + 0x520E, + 0x5227, + 0x522A, + 0x522E, + 0x5233, + 0x5239, + 0x524F, + 0x5244, + 0x524B, + 0x524C, + 0x525E, + 0x5254, + 0x526A, + 0x5274, + 0x5269, + 0x5273, + 0x527F, + 0x527D, + 0x528D, + 0x5294, + 0x5292, + 0x5271, + 0x5288, + 0x5291, + 0x8FA8, + 0x8FA7, + 0x52AC, + 0x52AD, + 0x52BC, + 0x52B5, + 0x52C1, + 0x52CD, + 0x52D7, + 0x52DE, + 0x52E3, + 0x52E6, + 0x98ED, + 0x52E0, + 0x52F3, + 0x52F5, + 0x52F8, + 0x52F9, + 0x5306, + 0x5308, + 0x7538, + 0x530D, + 0x5310, + 0x530F, + 0x5315, + 0x531A, + 0x5323, + 0x532F, + 0x5331, + 0x5333, + 0x5338, + 0x5340, + 0x5346, + 0x5345, + 0x4E17, + 0x5349, + 0x534D, + 0x51D6, + 0x535E, + 0x5369, + 0x536E, + 0x5918, + 0x537B, + 0x5377, + 0x5382, + 0x5396, + 0x53A0, + 0x53A6, + 0x53A5, + 0x53AE, + 0x53B0, + 0x53B6, + 0x53C3, + 0x7C12, + 0x96D9, + 0x53DF, + 0x66FC, + 0x71EE, + 0x53EE, + 0x53E8, + 0x53ED, + 0x53FA, + 0x5401, + 0x543D, + 0x5440, + 0x542C, + 0x542D, + 0x543C, + 0x542E, + 0x5436, + 0x5429, + 0x541D, + 0x544E, + 0x548F, + 0x5475, + 0x548E, + 0x545F, + 0x5471, + 0x5477, + 0x5470, + 0x5492, + 0x547B, + 0x5480, + 0x5476, + 0x5484, + 0x5490, + 0x5486, + 0x54C7, + 0x54A2, + 0x54B8, + 0x54A5, + 0x54AC, + 0x54C4, + 0x54C8, + 0x54A8, + 0x54AB, + 0x54C2, + 0x54A4, + 0x54BE, + 0x54BC, + 0x54D8, + 0x54E5, + 0x54E6, + 0x550F, + 0x5514, + 0x54FD, + 0x54EE, + 0x54ED, + 0x54FA, + 0x54E2, + 0x5539, + 0x5540, + 0x5563, + 0x554C, + 0x552E, + 0x555C, + 0x5545, + 0x5556, + 0x5557, + 0x5538, + 0x5533, + 0x555D, + 0x5599, + 0x5580, + 0x54AF, + 0x558A, + 0x559F, + 0x557B, + 0x557E, + 0x5598, + 0x559E, + 0x55AE, + 0x557C, + 0x5583, + 0x55A9, + 0x5587, + 0x55A8, + 0x55DA, + 0x55C5, + 0x55DF, + 0x55C4, + 0x55DC, + 0x55E4, + 0x55D4, + 0x5614, + 0x55F7, + 0x5616, + 0x55FE, + 0x55FD, + 0x561B, + 0x55F9, + 0x564E, + 0x5650, + 0x71DF, + 0x5634, + 0x5636, + 0x5632, + 0x5638, + 0x566B, + 0x5664, + 0x562F, + 0x566C, + 0x566A, + 0x5686, + 0x5680, + 0x568A, + 0x56A0, + 0x5694, + 0x568F, + 0x56A5, + 0x56AE, + 0x56B6, + 0x56B4, + 0x56C2, + 0x56BC, + 0x56C1, + 0x56C3, + 0x56C0, + 0x56C8, + 0x56CE, + 0x56D1, + 0x56D3, + 0x56D7, + 0x56EE, + 0x56F9, + 0x5700, + 0x56FF, + 0x5704, + 0x5709, + 0x5708, + 0x570B, + 0x570D, + 0x5713, + 0x5718, + 0x5716, + 0x55C7, + 0x571C, + 0x5726, + 0x5737, + 0x5738, + 0x574E, + 0x573B, + 0x5740, + 0x574F, + 0x5769, + 0x57C0, + 0x5788, + 0x5761, + 0x577F, + 0x5789, + 0x5793, + 0x57A0, + 0x57B3, + 0x57A4, + 0x57AA, + 0x57B0, + 0x57C3, + 0x57C6, + 0x57D4, + 0x57D2, + 0x57D3, + 0x580A, + 0x57D6, + 0x57E3, + 0x580B, + 0x5819, + 0x581D, + 0x5872, + 0x5821, + 0x5862, + 0x584B, + 0x5870, + 0x6BC0, + 0x5852, + 0x583D, + 0x5879, + 0x5885, + 0x58B9, + 0x589F, + 0x58AB, + 0x58BA, + 0x58DE, + 0x58BB, + 0x58B8, + 0x58AE, + 0x58C5, + 0x58D3, + 0x58D1, + 0x58D7, + 0x58D9, + 0x58D8, + 0x58E5, + 0x58DC, + 0x58E4, + 0x58DF, + 0x58EF, + 0x58FA, + 0x58F9, + 0x58FB, + 0x58FC, + 0x58FD, + 0x5902, + 0x590A, + 0x5910, + 0x591B, + 0x68A6, + 0x5925, + 0x592C, + 0x592D, + 0x5932, + 0x5938, + 0x593E, + 0x7AD2, + 0x5955, + 0x5950, + 0x594E, + 0x595A, + 0x5958, + 0x5962, + 0x5960, + 0x5967, + 0x596C, + 0x5969, + 0x5978, + 0x5981, + 0x599D, + 0x4F5E, + 0x4FAB, + 0x59A3, + 0x59B2, + 0x59C6, + 0x59E8, + 0x59DC, + 0x598D, + 0x59D9, + 0x59DA, + 0x5A25, + 0x5A1F, + 0x5A11, + 0x5A1C, + 0x5A09, + 0x5A1A, + 0x5A40, + 0x5A6C, + 0x5A49, + 0x5A35, + 0x5A36, + 0x5A62, + 0x5A6A, + 0x5A9A, + 0x5ABC, + 0x5ABE, + 0x5ACB, + 0x5AC2, + 0x5ABD, + 0x5AE3, + 0x5AD7, + 0x5AE6, + 0x5AE9, + 0x5AD6, + 0x5AFA, + 0x5AFB, + 0x5B0C, + 0x5B0B, + 0x5B16, + 0x5B32, + 0x5AD0, + 0x5B2A, + 0x5B36, + 0x5B3E, + 0x5B43, + 0x5B45, + 0x5B40, + 0x5B51, + 0x5B55, + 0x5B5A, + 0x5B5B, + 0x5B65, + 0x5B69, + 0x5B70, + 0x5B73, + 0x5B75, + 0x5B78, + 0x6588, + 0x5B7A, + 0x5B80, + 0x5B83, + 0x5BA6, + 0x5BB8, + 0x5BC3, + 0x5BC7, + 0x5BC9, + 0x5BD4, + 0x5BD0, + 0x5BE4, + 0x5BE6, + 0x5BE2, + 0x5BDE, + 0x5BE5, + 0x5BEB, + 0x5BF0, + 0x5BF6, + 0x5BF3, + 0x5C05, + 0x5C07, + 0x5C08, + 0x5C0D, + 0x5C13, + 0x5C20, + 0x5C22, + 0x5C28, + 0x5C38, + 0x5C39, + 0x5C41, + 0x5C46, + 0x5C4E, + 0x5C53, + 0x5C50, + 0x5C4F, + 0x5B71, + 0x5C6C, + 0x5C6E, + 0x4E62, + 0x5C76, + 0x5C79, + 0x5C8C, + 0x5C91, + 0x5C94, + 0x599B, + 0x5CAB, + 0x5CBB, + 0x5CB6, + 0x5CBC, + 0x5CB7, + 0x5CC5, + 0x5CBE, + 0x5CC7, + 0x5CD9, + 0x5CE9, + 0x5CFD, + 0x5CFA, + 0x5CED, + 0x5D8C, + 0x5CEA, + 0x5D0B, + 0x5D15, + 0x5D17, + 0x5D5C, + 0x5D1F, + 0x5D1B, + 0x5D11, + 0x5D14, + 0x5D22, + 0x5D1A, + 0x5D19, + 0x5D18, + 0x5D4C, + 0x5D52, + 0x5D4E, + 0x5D4B, + 0x5D6C, + 0x5D73, + 0x5D76, + 0x5D87, + 0x5D84, + 0x5D82, + 0x5DA2, + 0x5D9D, + 0x5DAC, + 0x5DAE, + 0x5DBD, + 0x5D90, + 0x5DB7, + 0x5DBC, + 0x5DC9, + 0x5DCD, + 0x5DD3, + 0x5DD2, + 0x5DD6, + 0x5DDB, + 0x5DEB, + 0x5DF2, + 0x5DF5, + 0x5E0B, + 0x5E1A, + 0x5E19, + 0x5E11, + 0x5E1B, + 0x5E36, + 0x5E37, + 0x5E44, + 0x5E43, + 0x5E40, + 0x5E4E, + 0x5E57, + 0x5E54, + 0x5E5F, + 0x5E62, + 0x5E64, + 0x5E47, + 0x5E75, + 0x5E76, + 0x5E7A, + 0x9EBC, + 0x5E7F, + 0x5EA0, + 0x5EC1, + 0x5EC2, + 0x5EC8, + 0x5ED0, + 0x5ECF, + 0x5ED6, + 0x5EE3, + 0x5EDD, + 0x5EDA, + 0x5EDB, + 0x5EE2, + 0x5EE1, + 0x5EE8, + 0x5EE9, + 0x5EEC, + 0x5EF1, + 0x5EF3, + 0x5EF0, + 0x5EF4, + 0x5EF8, + 0x5EFE, + 0x5F03, + 0x5F09, + 0x5F5D, + 0x5F5C, + 0x5F0B, + 0x5F11, + 0x5F16, + 0x5F29, + 0x5F2D, + 0x5F38, + 0x5F41, + 0x5F48, + 0x5F4C, + 0x5F4E, + 0x5F2F, + 0x5F51, + 0x5F56, + 0x5F57, + 0x5F59, + 0x5F61, + 0x5F6D, + 0x5F73, + 0x5F77, + 0x5F83, + 0x5F82, + 0x5F7F, + 0x5F8A, + 0x5F88, + 0x5F91, + 0x5F87, + 0x5F9E, + 0x5F99, + 0x5F98, + 0x5FA0, + 0x5FA8, + 0x5FAD, + 0x5FBC, + 0x5FD6, + 0x5FFB, + 0x5FE4, + 0x5FF8, + 0x5FF1, + 0x5FDD, + 0x60B3, + 0x5FFF, + 0x6021, + 0x6060, + 0x6019, + 0x6010, + 0x6029, + 0x600E, + 0x6031, + 0x601B, + 0x6015, + 0x602B, + 0x6026, + 0x600F, + 0x603A, + 0x605A, + 0x6041, + 0x606A, + 0x6077, + 0x605F, + 0x604A, + 0x6046, + 0x604D, + 0x6063, + 0x6043, + 0x6064, + 0x6042, + 0x606C, + 0x606B, + 0x6059, + 0x6081, + 0x608D, + 0x60E7, + 0x6083, + 0x609A, + 0x6084, + 0x609B, + 0x6096, + 0x6097, + 0x6092, + 0x60A7, + 0x608B, + 0x60E1, + 0x60B8, + 0x60E0, + 0x60D3, + 0x60B4, + 0x5FF0, + 0x60BD, + 0x60C6, + 0x60B5, + 0x60D8, + 0x614D, + 0x6115, + 0x6106, + 0x60F6, + 0x60F7, + 0x6100, + 0x60F4, + 0x60FA, + 0x6103, + 0x6121, + 0x60FB, + 0x60F1, + 0x610D, + 0x610E, + 0x6147, + 0x613E, + 0x6128, + 0x6127, + 0x614A, + 0x613F, + 0x613C, + 0x612C, + 0x6134, + 0x613D, + 0x6142, + 0x6144, + 0x6173, + 0x6177, + 0x6158, + 0x6159, + 0x615A, + 0x616B, + 0x6174, + 0x616F, + 0x6165, + 0x6171, + 0x615F, + 0x615D, + 0x6153, + 0x6175, + 0x6199, + 0x6196, + 0x6187, + 0x61AC, + 0x6194, + 0x619A, + 0x618A, + 0x6191, + 0x61AB, + 0x61AE, + 0x61CC, + 0x61CA, + 0x61C9, + 0x61F7, + 0x61C8, + 0x61C3, + 0x61C6, + 0x61BA, + 0x61CB, + 0x7F79, + 0x61CD, + 0x61E6, + 0x61E3, + 0x61F6, + 0x61FA, + 0x61F4, + 0x61FF, + 0x61FD, + 0x61FC, + 0x61FE, + 0x6200, + 0x6208, + 0x6209, + 0x620D, + 0x620C, + 0x6214, + 0x621B, + 0x621E, + 0x6221, + 0x622A, + 0x622E, + 0x6230, + 0x6232, + 0x6233, + 0x6241, + 0x624E, + 0x625E, + 0x6263, + 0x625B, + 0x6260, + 0x6268, + 0x627C, + 0x6282, + 0x6289, + 0x627E, + 0x6292, + 0x6293, + 0x6296, + 0x62D4, + 0x6283, + 0x6294, + 0x62D7, + 0x62D1, + 0x62BB, + 0x62CF, + 0x62FF, + 0x62C6, + 0x64D4, + 0x62C8, + 0x62DC, + 0x62CC, + 0x62CA, + 0x62C2, + 0x62C7, + 0x629B, + 0x62C9, + 0x630C, + 0x62EE, + 0x62F1, + 0x6327, + 0x6302, + 0x6308, + 0x62EF, + 0x62F5, + 0x6350, + 0x633E, + 0x634D, + 0x641C, + 0x634F, + 0x6396, + 0x638E, + 0x6380, + 0x63AB, + 0x6376, + 0x63A3, + 0x638F, + 0x6389, + 0x639F, + 0x63B5, + 0x636B, + 0x6369, + 0x63BE, + 0x63E9, + 0x63C0, + 0x63C6, + 0x63E3, + 0x63C9, + 0x63D2, + 0x63F6, + 0x63C4, + 0x6416, + 0x6434, + 0x6406, + 0x6413, + 0x6426, + 0x6436, + 0x651D, + 0x6417, + 0x6428, + 0x640F, + 0x6467, + 0x646F, + 0x6476, + 0x644E, + 0x652A, + 0x6495, + 0x6493, + 0x64A5, + 0x64A9, + 0x6488, + 0x64BC, + 0x64DA, + 0x64D2, + 0x64C5, + 0x64C7, + 0x64BB, + 0x64D8, + 0x64C2, + 0x64F1, + 0x64E7, + 0x8209, + 0x64E0, + 0x64E1, + 0x62AC, + 0x64E3, + 0x64EF, + 0x652C, + 0x64F6, + 0x64F4, + 0x64F2, + 0x64FA, + 0x6500, + 0x64FD, + 0x6518, + 0x651C, + 0x6505, + 0x6524, + 0x6523, + 0x652B, + 0x6534, + 0x6535, + 0x6537, + 0x6536, + 0x6538, + 0x754B, + 0x6548, + 0x6556, + 0x6555, + 0x654D, + 0x6558, + 0x655E, + 0x655D, + 0x6572, + 0x6578, + 0x6582, + 0x6583, + 0x8B8A, + 0x659B, + 0x659F, + 0x65AB, + 0x65B7, + 0x65C3, + 0x65C6, + 0x65C1, + 0x65C4, + 0x65CC, + 0x65D2, + 0x65DB, + 0x65D9, + 0x65E0, + 0x65E1, + 0x65F1, + 0x6772, + 0x660A, + 0x6603, + 0x65FB, + 0x6773, + 0x6635, + 0x6636, + 0x6634, + 0x661C, + 0x664F, + 0x6644, + 0x6649, + 0x6641, + 0x665E, + 0x665D, + 0x6664, + 0x6667, + 0x6668, + 0x665F, + 0x6662, + 0x6670, + 0x6683, + 0x6688, + 0x668E, + 0x6689, + 0x6684, + 0x6698, + 0x669D, + 0x66C1, + 0x66B9, + 0x66C9, + 0x66BE, + 0x66BC, + 0x66C4, + 0x66B8, + 0x66D6, + 0x66DA, + 0x66E0, + 0x663F, + 0x66E6, + 0x66E9, + 0x66F0, + 0x66F5, + 0x66F7, + 0x670F, + 0x6716, + 0x671E, + 0x6726, + 0x6727, + 0x9738, + 0x672E, + 0x673F, + 0x6736, + 0x6741, + 0x6738, + 0x6737, + 0x6746, + 0x675E, + 0x6760, + 0x6759, + 0x6763, + 0x6764, + 0x6789, + 0x6770, + 0x67A9, + 0x677C, + 0x676A, + 0x678C, + 0x678B, + 0x67A6, + 0x67A1, + 0x6785, + 0x67B7, + 0x67EF, + 0x67B4, + 0x67EC, + 0x67B3, + 0x67E9, + 0x67B8, + 0x67E4, + 0x67DE, + 0x67DD, + 0x67E2, + 0x67EE, + 0x67B9, + 0x67CE, + 0x67C6, + 0x67E7, + 0x6A9C, + 0x681E, + 0x6846, + 0x6829, + 0x6840, + 0x684D, + 0x6832, + 0x684E, + 0x68B3, + 0x682B, + 0x6859, + 0x6863, + 0x6877, + 0x687F, + 0x689F, + 0x688F, + 0x68AD, + 0x6894, + 0x689D, + 0x689B, + 0x6883, + 0x6AAE, + 0x68B9, + 0x6874, + 0x68B5, + 0x68A0, + 0x68BA, + 0x690F, + 0x688D, + 0x687E, + 0x6901, + 0x68CA, + 0x6908, + 0x68D8, + 0x6922, + 0x6926, + 0x68E1, + 0x690C, + 0x68CD, + 0x68D4, + 0x68E7, + 0x68D5, + 0x6936, + 0x6912, + 0x6904, + 0x68D7, + 0x68E3, + 0x6925, + 0x68F9, + 0x68E0, + 0x68EF, + 0x6928, + 0x692A, + 0x691A, + 0x6923, + 0x6921, + 0x68C6, + 0x6979, + 0x6977, + 0x695C, + 0x6978, + 0x696B, + 0x6954, + 0x697E, + 0x696E, + 0x6939, + 0x6974, + 0x693D, + 0x6959, + 0x6930, + 0x6961, + 0x695E, + 0x695D, + 0x6981, + 0x696A, + 0x69B2, + 0x69AE, + 0x69D0, + 0x69BF, + 0x69C1, + 0x69D3, + 0x69BE, + 0x69CE, + 0x5BE8, + 0x69CA, + 0x69DD, + 0x69BB, + 0x69C3, + 0x69A7, + 0x6A2E, + 0x6991, + 0x69A0, + 0x699C, + 0x6995, + 0x69B4, + 0x69DE, + 0x69E8, + 0x6A02, + 0x6A1B, + 0x69FF, + 0x6B0A, + 0x69F9, + 0x69F2, + 0x69E7, + 0x6A05, + 0x69B1, + 0x6A1E, + 0x69ED, + 0x6A14, + 0x69EB, + 0x6A0A, + 0x6A12, + 0x6AC1, + 0x6A23, + 0x6A13, + 0x6A44, + 0x6A0C, + 0x6A72, + 0x6A36, + 0x6A78, + 0x6A47, + 0x6A62, + 0x6A59, + 0x6A66, + 0x6A48, + 0x6A38, + 0x6A22, + 0x6A90, + 0x6A8D, + 0x6AA0, + 0x6A84, + 0x6AA2, + 0x6AA3, + 0x6A97, + 0x8617, + 0x6ABB, + 0x6AC3, + 0x6AC2, + 0x6AB8, + 0x6AB3, + 0x6AAC, + 0x6ADE, + 0x6AD1, + 0x6ADF, + 0x6AAA, + 0x6ADA, + 0x6AEA, + 0x6AFB, + 0x6B05, + 0x8616, + 0x6AFA, + 0x6B12, + 0x6B16, + 0x9B31, + 0x6B1F, + 0x6B38, + 0x6B37, + 0x76DC, + 0x6B39, + 0x98EE, + 0x6B47, + 0x6B43, + 0x6B49, + 0x6B50, + 0x6B59, + 0x6B54, + 0x6B5B, + 0x6B5F, + 0x6B61, + 0x6B78, + 0x6B79, + 0x6B7F, + 0x6B80, + 0x6B84, + 0x6B83, + 0x6B8D, + 0x6B98, + 0x6B95, + 0x6B9E, + 0x6BA4, + 0x6BAA, + 0x6BAB, + 0x6BAF, + 0x6BB2, + 0x6BB1, + 0x6BB3, + 0x6BB7, + 0x6BBC, + 0x6BC6, + 0x6BCB, + 0x6BD3, + 0x6BDF, + 0x6BEC, + 0x6BEB, + 0x6BF3, + 0x6BEF, + 0x9EBE, + 0x6C08, + 0x6C13, + 0x6C14, + 0x6C1B, + 0x6C24, + 0x6C23, + 0x6C5E, + 0x6C55, + 0x6C62, + 0x6C6A, + 0x6C82, + 0x6C8D, + 0x6C9A, + 0x6C81, + 0x6C9B, + 0x6C7E, + 0x6C68, + 0x6C73, + 0x6C92, + 0x6C90, + 0x6CC4, + 0x6CF1, + 0x6CD3, + 0x6CBD, + 0x6CD7, + 0x6CC5, + 0x6CDD, + 0x6CAE, + 0x6CB1, + 0x6CBE, + 0x6CBA, + 0x6CDB, + 0x6CEF, + 0x6CD9, + 0x6CEA, + 0x6D1F, + 0x884D, + 0x6D36, + 0x6D2B, + 0x6D3D, + 0x6D38, + 0x6D19, + 0x6D35, + 0x6D33, + 0x6D12, + 0x6D0C, + 0x6D63, + 0x6D93, + 0x6D64, + 0x6D5A, + 0x6D79, + 0x6D59, + 0x6D8E, + 0x6D95, + 0x6FE4, + 0x6D85, + 0x6DF9, + 0x6E15, + 0x6E0A, + 0x6DB5, + 0x6DC7, + 0x6DE6, + 0x6DB8, + 0x6DC6, + 0x6DEC, + 0x6DDE, + 0x6DCC, + 0x6DE8, + 0x6DD2, + 0x6DC5, + 0x6DFA, + 0x6DD9, + 0x6DE4, + 0x6DD5, + 0x6DEA, + 0x6DEE, + 0x6E2D, + 0x6E6E, + 0x6E2E, + 0x6E19, + 0x6E72, + 0x6E5F, + 0x6E3E, + 0x6E23, + 0x6E6B, + 0x6E2B, + 0x6E76, + 0x6E4D, + 0x6E1F, + 0x6E43, + 0x6E3A, + 0x6E4E, + 0x6E24, + 0x6EFF, + 0x6E1D, + 0x6E38, + 0x6E82, + 0x6EAA, + 0x6E98, + 0x6EC9, + 0x6EB7, + 0x6ED3, + 0x6EBD, + 0x6EAF, + 0x6EC4, + 0x6EB2, + 0x6ED4, + 0x6ED5, + 0x6E8F, + 0x6EA5, + 0x6EC2, + 0x6E9F, + 0x6F41, + 0x6F11, + 0x704C, + 0x6EEC, + 0x6EF8, + 0x6EFE, + 0x6F3F, + 0x6EF2, + 0x6F31, + 0x6EEF, + 0x6F32, + 0x6ECC, + 0x6F3E, + 0x6F13, + 0x6EF7, + 0x6F86, + 0x6F7A, + 0x6F78, + 0x6F81, + 0x6F80, + 0x6F6F, + 0x6F5B, + 0x6FF3, + 0x6F6D, + 0x6F82, + 0x6F7C, + 0x6F58, + 0x6F8E, + 0x6F91, + 0x6FC2, + 0x6F66, + 0x6FB3, + 0x6FA3, + 0x6FA1, + 0x6FA4, + 0x6FB9, + 0x6FC6, + 0x6FAA, + 0x6FDF, + 0x6FD5, + 0x6FEC, + 0x6FD4, + 0x6FD8, + 0x6FF1, + 0x6FEE, + 0x6FDB, + 0x7009, + 0x700B, + 0x6FFA, + 0x7011, + 0x7001, + 0x700F, + 0x6FFE, + 0x701B, + 0x701A, + 0x6F74, + 0x701D, + 0x7018, + 0x701F, + 0x7030, + 0x703E, + 0x7032, + 0x7051, + 0x7063, + 0x7099, + 0x7092, + 0x70AF, + 0x70F1, + 0x70AC, + 0x70B8, + 0x70B3, + 0x70AE, + 0x70DF, + 0x70CB, + 0x70DD, + 0x70D9, + 0x7109, + 0x70FD, + 0x711C, + 0x7119, + 0x7165, + 0x7155, + 0x7188, + 0x7166, + 0x7162, + 0x714C, + 0x7156, + 0x716C, + 0x718F, + 0x71FB, + 0x7184, + 0x7195, + 0x71A8, + 0x71AC, + 0x71D7, + 0x71B9, + 0x71BE, + 0x71D2, + 0x71C9, + 0x71D4, + 0x71CE, + 0x71E0, + 0x71EC, + 0x71E7, + 0x71F5, + 0x71FC, + 0x71F9, + 0x71FF, + 0x720D, + 0x7210, + 0x721B, + 0x7228, + 0x722D, + 0x722C, + 0x7230, + 0x7232, + 0x723B, + 0x723C, + 0x723F, + 0x7240, + 0x7246, + 0x724B, + 0x7258, + 0x7274, + 0x727E, + 0x7282, + 0x7281, + 0x7287, + 0x7292, + 0x7296, + 0x72A2, + 0x72A7, + 0x72B9, + 0x72B2, + 0x72C3, + 0x72C6, + 0x72C4, + 0x72CE, + 0x72D2, + 0x72E2, + 0x72E0, + 0x72E1, + 0x72F9, + 0x72F7, + 0x500F, + 0x7317, + 0x730A, + 0x731C, + 0x7316, + 0x731D, + 0x7334, + 0x732F, + 0x7329, + 0x7325, + 0x733E, + 0x734E, + 0x734F, + 0x9ED8, + 0x7357, + 0x736A, + 0x7368, + 0x7370, + 0x7378, + 0x7375, + 0x737B, + 0x737A, + 0x73C8, + 0x73B3, + 0x73CE, + 0x73BB, + 0x73C0, + 0x73E5, + 0x73EE, + 0x73DE, + 0x74A2, + 0x7405, + 0x746F, + 0x7425, + 0x73F8, + 0x7432, + 0x743A, + 0x7455, + 0x743F, + 0x745F, + 0x7459, + 0x7441, + 0x745C, + 0x7469, + 0x7470, + 0x7463, + 0x746A, + 0x7476, + 0x747E, + 0x748B, + 0x749E, + 0x74A7, + 0x74CA, + 0x74CF, + 0x74D4, + 0x73F1, + 0x74E0, + 0x74E3, + 0x74E7, + 0x74E9, + 0x74EE, + 0x74F2, + 0x74F0, + 0x74F1, + 0x74F8, + 0x74F7, + 0x7504, + 0x7503, + 0x7505, + 0x750C, + 0x750E, + 0x750D, + 0x7515, + 0x7513, + 0x751E, + 0x7526, + 0x752C, + 0x753C, + 0x7544, + 0x754D, + 0x754A, + 0x7549, + 0x755B, + 0x7546, + 0x755A, + 0x7569, + 0x7564, + 0x7567, + 0x756B, + 0x756D, + 0x7578, + 0x7576, + 0x7586, + 0x7587, + 0x7574, + 0x758A, + 0x7589, + 0x7582, + 0x7594, + 0x759A, + 0x759D, + 0x75A5, + 0x75A3, + 0x75C2, + 0x75B3, + 0x75C3, + 0x75B5, + 0x75BD, + 0x75B8, + 0x75BC, + 0x75B1, + 0x75CD, + 0x75CA, + 0x75D2, + 0x75D9, + 0x75E3, + 0x75DE, + 0x75FE, + 0x75FF, + 0x75FC, + 0x7601, + 0x75F0, + 0x75FA, + 0x75F2, + 0x75F3, + 0x760B, + 0x760D, + 0x7609, + 0x761F, + 0x7627, + 0x7620, + 0x7621, + 0x7622, + 0x7624, + 0x7634, + 0x7630, + 0x763B, + 0x7647, + 0x7648, + 0x7646, + 0x765C, + 0x7658, + 0x7661, + 0x7662, + 0x7668, + 0x7669, + 0x766A, + 0x7667, + 0x766C, + 0x7670, + 0x7672, + 0x7676, + 0x7678, + 0x767C, + 0x7680, + 0x7683, + 0x7688, + 0x768B, + 0x768E, + 0x7696, + 0x7693, + 0x7699, + 0x769A, + 0x76B0, + 0x76B4, + 0x76B8, + 0x76B9, + 0x76BA, + 0x76C2, + 0x76CD, + 0x76D6, + 0x76D2, + 0x76DE, + 0x76E1, + 0x76E5, + 0x76E7, + 0x76EA, + 0x862F, + 0x76FB, + 0x7708, + 0x7707, + 0x7704, + 0x7729, + 0x7724, + 0x771E, + 0x7725, + 0x7726, + 0x771B, + 0x7737, + 0x7738, + 0x7747, + 0x775A, + 0x7768, + 0x776B, + 0x775B, + 0x7765, + 0x777F, + 0x777E, + 0x7779, + 0x778E, + 0x778B, + 0x7791, + 0x77A0, + 0x779E, + 0x77B0, + 0x77B6, + 0x77B9, + 0x77BF, + 0x77BC, + 0x77BD, + 0x77BB, + 0x77C7, + 0x77CD, + 0x77D7, + 0x77DA, + 0x77DC, + 0x77E3, + 0x77EE, + 0x77FC, + 0x780C, + 0x7812, + 0x7926, + 0x7820, + 0x792A, + 0x7845, + 0x788E, + 0x7874, + 0x7886, + 0x787C, + 0x789A, + 0x788C, + 0x78A3, + 0x78B5, + 0x78AA, + 0x78AF, + 0x78D1, + 0x78C6, + 0x78CB, + 0x78D4, + 0x78BE, + 0x78BC, + 0x78C5, + 0x78CA, + 0x78EC, + 0x78E7, + 0x78DA, + 0x78FD, + 0x78F4, + 0x7907, + 0x7912, + 0x7911, + 0x7919, + 0x792C, + 0x792B, + 0x7940, + 0x7960, + 0x7957, + 0x795F, + 0x795A, + 0x7955, + 0x7953, + 0x797A, + 0x797F, + 0x798A, + 0x799D, + 0x79A7, + 0x9F4B, + 0x79AA, + 0x79AE, + 0x79B3, + 0x79B9, + 0x79BA, + 0x79C9, + 0x79D5, + 0x79E7, + 0x79EC, + 0x79E1, + 0x79E3, + 0x7A08, + 0x7A0D, + 0x7A18, + 0x7A19, + 0x7A20, + 0x7A1F, + 0x7980, + 0x7A31, + 0x7A3B, + 0x7A3E, + 0x7A37, + 0x7A43, + 0x7A57, + 0x7A49, + 0x7A61, + 0x7A62, + 0x7A69, + 0x9F9D, + 0x7A70, + 0x7A79, + 0x7A7D, + 0x7A88, + 0x7A97, + 0x7A95, + 0x7A98, + 0x7A96, + 0x7AA9, + 0x7AC8, + 0x7AB0, + 0x7AB6, + 0x7AC5, + 0x7AC4, + 0x7ABF, + 0x9083, + 0x7AC7, + 0x7ACA, + 0x7ACD, + 0x7ACF, + 0x7AD5, + 0x7AD3, + 0x7AD9, + 0x7ADA, + 0x7ADD, + 0x7AE1, + 0x7AE2, + 0x7AE6, + 0x7AED, + 0x7AF0, + 0x7B02, + 0x7B0F, + 0x7B0A, + 0x7B06, + 0x7B33, + 0x7B18, + 0x7B19, + 0x7B1E, + 0x7B35, + 0x7B28, + 0x7B36, + 0x7B50, + 0x7B7A, + 0x7B04, + 0x7B4D, + 0x7B0B, + 0x7B4C, + 0x7B45, + 0x7B75, + 0x7B65, + 0x7B74, + 0x7B67, + 0x7B70, + 0x7B71, + 0x7B6C, + 0x7B6E, + 0x7B9D, + 0x7B98, + 0x7B9F, + 0x7B8D, + 0x7B9C, + 0x7B9A, + 0x7B8B, + 0x7B92, + 0x7B8F, + 0x7B5D, + 0x7B99, + 0x7BCB, + 0x7BC1, + 0x7BCC, + 0x7BCF, + 0x7BB4, + 0x7BC6, + 0x7BDD, + 0x7BE9, + 0x7C11, + 0x7C14, + 0x7BE6, + 0x7BE5, + 0x7C60, + 0x7C00, + 0x7C07, + 0x7C13, + 0x7BF3, + 0x7BF7, + 0x7C17, + 0x7C0D, + 0x7BF6, + 0x7C23, + 0x7C27, + 0x7C2A, + 0x7C1F, + 0x7C37, + 0x7C2B, + 0x7C3D, + 0x7C4C, + 0x7C43, + 0x7C54, + 0x7C4F, + 0x7C40, + 0x7C50, + 0x7C58, + 0x7C5F, + 0x7C64, + 0x7C56, + 0x7C65, + 0x7C6C, + 0x7C75, + 0x7C83, + 0x7C90, + 0x7CA4, + 0x7CAD, + 0x7CA2, + 0x7CAB, + 0x7CA1, + 0x7CA8, + 0x7CB3, + 0x7CB2, + 0x7CB1, + 0x7CAE, + 0x7CB9, + 0x7CBD, + 0x7CC0, + 0x7CC5, + 0x7CC2, + 0x7CD8, + 0x7CD2, + 0x7CDC, + 0x7CE2, + 0x9B3B, + 0x7CEF, + 0x7CF2, + 0x7CF4, + 0x7CF6, + 0x7CFA, + 0x7D06, + 0x7D02, + 0x7D1C, + 0x7D15, + 0x7D0A, + 0x7D45, + 0x7D4B, + 0x7D2E, + 0x7D32, + 0x7D3F, + 0x7D35, + 0x7D46, + 0x7D73, + 0x7D56, + 0x7D4E, + 0x7D72, + 0x7D68, + 0x7D6E, + 0x7D4F, + 0x7D63, + 0x7D93, + 0x7D89, + 0x7D5B, + 0x7D8F, + 0x7D7D, + 0x7D9B, + 0x7DBA, + 0x7DAE, + 0x7DA3, + 0x7DB5, + 0x7DC7, + 0x7DBD, + 0x7DAB, + 0x7E3D, + 0x7DA2, + 0x7DAF, + 0x7DDC, + 0x7DB8, + 0x7D9F, + 0x7DB0, + 0x7DD8, + 0x7DDD, + 0x7DE4, + 0x7DDE, + 0x7DFB, + 0x7DF2, + 0x7DE1, + 0x7E05, + 0x7E0A, + 0x7E23, + 0x7E21, + 0x7E12, + 0x7E31, + 0x7E1F, + 0x7E09, + 0x7E0B, + 0x7E22, + 0x7E46, + 0x7E66, + 0x7E3B, + 0x7E35, + 0x7E39, + 0x7E43, + 0x7E37, + 0x7E32, + 0x7E3A, + 0x7E67, + 0x7E5D, + 0x7E56, + 0x7E5E, + 0x7E59, + 0x7E5A, + 0x7E79, + 0x7E6A, + 0x7E69, + 0x7E7C, + 0x7E7B, + 0x7E83, + 0x7DD5, + 0x7E7D, + 0x8FAE, + 0x7E7F, + 0x7E88, + 0x7E89, + 0x7E8C, + 0x7E92, + 0x7E90, + 0x7E93, + 0x7E94, + 0x7E96, + 0x7E8E, + 0x7E9B, + 0x7E9C, + 0x7F38, + 0x7F3A, + 0x7F45, + 0x7F4C, + 0x7F4D, + 0x7F4E, + 0x7F50, + 0x7F51, + 0x7F55, + 0x7F54, + 0x7F58, + 0x7F5F, + 0x7F60, + 0x7F68, + 0x7F69, + 0x7F67, + 0x7F78, + 0x7F82, + 0x7F86, + 0x7F83, + 0x7F88, + 0x7F87, + 0x7F8C, + 0x7F94, + 0x7F9E, + 0x7F9D, + 0x7F9A, + 0x7FA3, + 0x7FAF, + 0x7FB2, + 0x7FB9, + 0x7FAE, + 0x7FB6, + 0x7FB8, + 0x8B71, + 0x7FC5, + 0x7FC6, + 0x7FCA, + 0x7FD5, + 0x7FD4, + 0x7FE1, + 0x7FE6, + 0x7FE9, + 0x7FF3, + 0x7FF9, + 0x98DC, + 0x8006, + 0x8004, + 0x800B, + 0x8012, + 0x8018, + 0x8019, + 0x801C, + 0x8021, + 0x8028, + 0x803F, + 0x803B, + 0x804A, + 0x8046, + 0x8052, + 0x8058, + 0x805A, + 0x805F, + 0x8062, + 0x8068, + 0x8073, + 0x8072, + 0x8070, + 0x8076, + 0x8079, + 0x807D, + 0x807F, + 0x8084, + 0x8086, + 0x8085, + 0x809B, + 0x8093, + 0x809A, + 0x80AD, + 0x5190, + 0x80AC, + 0x80DB, + 0x80E5, + 0x80D9, + 0x80DD, + 0x80C4, + 0x80DA, + 0x80D6, + 0x8109, + 0x80EF, + 0x80F1, + 0x811B, + 0x8129, + 0x8123, + 0x812F, + 0x814B, + 0x968B, + 0x8146, + 0x813E, + 0x8153, + 0x8151, + 0x80FC, + 0x8171, + 0x816E, + 0x8165, + 0x8166, + 0x8174, + 0x8183, + 0x8188, + 0x818A, + 0x8180, + 0x8182, + 0x81A0, + 0x8195, + 0x81A4, + 0x81A3, + 0x815F, + 0x8193, + 0x81A9, + 0x81B0, + 0x81B5, + 0x81BE, + 0x81B8, + 0x81BD, + 0x81C0, + 0x81C2, + 0x81BA, + 0x81C9, + 0x81CD, + 0x81D1, + 0x81D9, + 0x81D8, + 0x81C8, + 0x81DA, + 0x81DF, + 0x81E0, + 0x81E7, + 0x81FA, + 0x81FB, + 0x81FE, + 0x8201, + 0x8202, + 0x8205, + 0x8207, + 0x820A, + 0x820D, + 0x8210, + 0x8216, + 0x8229, + 0x822B, + 0x8238, + 0x8233, + 0x8240, + 0x8259, + 0x8258, + 0x825D, + 0x825A, + 0x825F, + 0x8264, + 0x8262, + 0x8268, + 0x826A, + 0x826B, + 0x822E, + 0x8271, + 0x8277, + 0x8278, + 0x827E, + 0x828D, + 0x8292, + 0x82AB, + 0x829F, + 0x82BB, + 0x82AC, + 0x82E1, + 0x82E3, + 0x82DF, + 0x82D2, + 0x82F4, + 0x82F3, + 0x82FA, + 0x8393, + 0x8303, + 0x82FB, + 0x82F9, + 0x82DE, + 0x8306, + 0x82DC, + 0x8309, + 0x82D9, + 0x8335, + 0x8334, + 0x8316, + 0x8332, + 0x8331, + 0x8340, + 0x8339, + 0x8350, + 0x8345, + 0x832F, + 0x832B, + 0x8317, + 0x8318, + 0x8385, + 0x839A, + 0x83AA, + 0x839F, + 0x83A2, + 0x8396, + 0x8323, + 0x838E, + 0x8387, + 0x838A, + 0x837C, + 0x83B5, + 0x8373, + 0x8375, + 0x83A0, + 0x8389, + 0x83A8, + 0x83F4, + 0x8413, + 0x83EB, + 0x83CE, + 0x83FD, + 0x8403, + 0x83D8, + 0x840B, + 0x83C1, + 0x83F7, + 0x8407, + 0x83E0, + 0x83F2, + 0x840D, + 0x8422, + 0x8420, + 0x83BD, + 0x8438, + 0x8506, + 0x83FB, + 0x846D, + 0x842A, + 0x843C, + 0x855A, + 0x8484, + 0x8477, + 0x846B, + 0x84AD, + 0x846E, + 0x8482, + 0x8469, + 0x8446, + 0x842C, + 0x846F, + 0x8479, + 0x8435, + 0x84CA, + 0x8462, + 0x84B9, + 0x84BF, + 0x849F, + 0x84D9, + 0x84CD, + 0x84BB, + 0x84DA, + 0x84D0, + 0x84C1, + 0x84C6, + 0x84D6, + 0x84A1, + 0x8521, + 0x84FF, + 0x84F4, + 0x8517, + 0x8518, + 0x852C, + 0x851F, + 0x8515, + 0x8514, + 0x84FC, + 0x8540, + 0x8563, + 0x8558, + 0x8548, + 0x8541, + 0x8602, + 0x854B, + 0x8555, + 0x8580, + 0x85A4, + 0x8588, + 0x8591, + 0x858A, + 0x85A8, + 0x856D, + 0x8594, + 0x859B, + 0x85EA, + 0x8587, + 0x859C, + 0x8577, + 0x857E, + 0x8590, + 0x85C9, + 0x85BA, + 0x85CF, + 0x85B9, + 0x85D0, + 0x85D5, + 0x85DD, + 0x85E5, + 0x85DC, + 0x85F9, + 0x860A, + 0x8613, + 0x860B, + 0x85FE, + 0x85FA, + 0x8606, + 0x8622, + 0x861A, + 0x8630, + 0x863F, + 0x864D, + 0x4E55, + 0x8654, + 0x865F, + 0x8667, + 0x8671, + 0x8693, + 0x86A3, + 0x86A9, + 0x86AA, + 0x868B, + 0x868C, + 0x86B6, + 0x86AF, + 0x86C4, + 0x86C6, + 0x86B0, + 0x86C9, + 0x8823, + 0x86AB, + 0x86D4, + 0x86DE, + 0x86E9, + 0x86EC, + 0x86DF, + 0x86DB, + 0x86EF, + 0x8712, + 0x8706, + 0x8708, + 0x8700, + 0x8703, + 0x86FB, + 0x8711, + 0x8709, + 0x870D, + 0x86F9, + 0x870A, + 0x8734, + 0x873F, + 0x8737, + 0x873B, + 0x8725, + 0x8729, + 0x871A, + 0x8760, + 0x875F, + 0x8778, + 0x874C, + 0x874E, + 0x8774, + 0x8757, + 0x8768, + 0x876E, + 0x8759, + 0x8753, + 0x8763, + 0x876A, + 0x8805, + 0x87A2, + 0x879F, + 0x8782, + 0x87AF, + 0x87CB, + 0x87BD, + 0x87C0, + 0x87D0, + 0x96D6, + 0x87AB, + 0x87C4, + 0x87B3, + 0x87C7, + 0x87C6, + 0x87BB, + 0x87EF, + 0x87F2, + 0x87E0, + 0x880F, + 0x880D, + 0x87FE, + 0x87F6, + 0x87F7, + 0x880E, + 0x87D2, + 0x8811, + 0x8816, + 0x8815, + 0x8822, + 0x8821, + 0x8831, + 0x8836, + 0x8839, + 0x8827, + 0x883B, + 0x8844, + 0x8842, + 0x8852, + 0x8859, + 0x885E, + 0x8862, + 0x886B, + 0x8881, + 0x887E, + 0x889E, + 0x8875, + 0x887D, + 0x88B5, + 0x8872, + 0x8882, + 0x8897, + 0x8892, + 0x88AE, + 0x8899, + 0x88A2, + 0x888D, + 0x88A4, + 0x88B0, + 0x88BF, + 0x88B1, + 0x88C3, + 0x88C4, + 0x88D4, + 0x88D8, + 0x88D9, + 0x88DD, + 0x88F9, + 0x8902, + 0x88FC, + 0x88F4, + 0x88E8, + 0x88F2, + 0x8904, + 0x890C, + 0x890A, + 0x8913, + 0x8943, + 0x891E, + 0x8925, + 0x892A, + 0x892B, + 0x8941, + 0x8944, + 0x893B, + 0x8936, + 0x8938, + 0x894C, + 0x891D, + 0x8960, + 0x895E, + 0x8966, + 0x8964, + 0x896D, + 0x896A, + 0x896F, + 0x8974, + 0x8977, + 0x897E, + 0x8983, + 0x8988, + 0x898A, + 0x8993, + 0x8998, + 0x89A1, + 0x89A9, + 0x89A6, + 0x89AC, + 0x89AF, + 0x89B2, + 0x89BA, + 0x89BD, + 0x89BF, + 0x89C0, + 0x89DA, + 0x89DC, + 0x89DD, + 0x89E7, + 0x89F4, + 0x89F8, + 0x8A03, + 0x8A16, + 0x8A10, + 0x8A0C, + 0x8A1B, + 0x8A1D, + 0x8A25, + 0x8A36, + 0x8A41, + 0x8A5B, + 0x8A52, + 0x8A46, + 0x8A48, + 0x8A7C, + 0x8A6D, + 0x8A6C, + 0x8A62, + 0x8A85, + 0x8A82, + 0x8A84, + 0x8AA8, + 0x8AA1, + 0x8A91, + 0x8AA5, + 0x8AA6, + 0x8A9A, + 0x8AA3, + 0x8AC4, + 0x8ACD, + 0x8AC2, + 0x8ADA, + 0x8AEB, + 0x8AF3, + 0x8AE7, + 0x8AE4, + 0x8AF1, + 0x8B14, + 0x8AE0, + 0x8AE2, + 0x8AF7, + 0x8ADE, + 0x8ADB, + 0x8B0C, + 0x8B07, + 0x8B1A, + 0x8AE1, + 0x8B16, + 0x8B10, + 0x8B17, + 0x8B20, + 0x8B33, + 0x97AB, + 0x8B26, + 0x8B2B, + 0x8B3E, + 0x8B28, + 0x8B41, + 0x8B4C, + 0x8B4F, + 0x8B4E, + 0x8B49, + 0x8B56, + 0x8B5B, + 0x8B5A, + 0x8B6B, + 0x8B5F, + 0x8B6C, + 0x8B6F, + 0x8B74, + 0x8B7D, + 0x8B80, + 0x8B8C, + 0x8B8E, + 0x8B92, + 0x8B93, + 0x8B96, + 0x8B99, + 0x8B9A, + 0x8C3A, + 0x8C41, + 0x8C3F, + 0x8C48, + 0x8C4C, + 0x8C4E, + 0x8C50, + 0x8C55, + 0x8C62, + 0x8C6C, + 0x8C78, + 0x8C7A, + 0x8C82, + 0x8C89, + 0x8C85, + 0x8C8A, + 0x8C8D, + 0x8C8E, + 0x8C94, + 0x8C7C, + 0x8C98, + 0x621D, + 0x8CAD, + 0x8CAA, + 0x8CBD, + 0x8CB2, + 0x8CB3, + 0x8CAE, + 0x8CB6, + 0x8CC8, + 0x8CC1, + 0x8CE4, + 0x8CE3, + 0x8CDA, + 0x8CFD, + 0x8CFA, + 0x8CFB, + 0x8D04, + 0x8D05, + 0x8D0A, + 0x8D07, + 0x8D0F, + 0x8D0D, + 0x8D10, + 0x9F4E, + 0x8D13, + 0x8CCD, + 0x8D14, + 0x8D16, + 0x8D67, + 0x8D6D, + 0x8D71, + 0x8D73, + 0x8D81, + 0x8D99, + 0x8DC2, + 0x8DBE, + 0x8DBA, + 0x8DCF, + 0x8DDA, + 0x8DD6, + 0x8DCC, + 0x8DDB, + 0x8DCB, + 0x8DEA, + 0x8DEB, + 0x8DDF, + 0x8DE3, + 0x8DFC, + 0x8E08, + 0x8E09, + 0x8DFF, + 0x8E1D, + 0x8E1E, + 0x8E10, + 0x8E1F, + 0x8E42, + 0x8E35, + 0x8E30, + 0x8E34, + 0x8E4A, + 0x8E47, + 0x8E49, + 0x8E4C, + 0x8E50, + 0x8E48, + 0x8E59, + 0x8E64, + 0x8E60, + 0x8E2A, + 0x8E63, + 0x8E55, + 0x8E76, + 0x8E72, + 0x8E7C, + 0x8E81, + 0x8E87, + 0x8E85, + 0x8E84, + 0x8E8B, + 0x8E8A, + 0x8E93, + 0x8E91, + 0x8E94, + 0x8E99, + 0x8EAA, + 0x8EA1, + 0x8EAC, + 0x8EB0, + 0x8EC6, + 0x8EB1, + 0x8EBE, + 0x8EC5, + 0x8EC8, + 0x8ECB, + 0x8EDB, + 0x8EE3, + 0x8EFC, + 0x8EFB, + 0x8EEB, + 0x8EFE, + 0x8F0A, + 0x8F05, + 0x8F15, + 0x8F12, + 0x8F19, + 0x8F13, + 0x8F1C, + 0x8F1F, + 0x8F1B, + 0x8F0C, + 0x8F26, + 0x8F33, + 0x8F3B, + 0x8F39, + 0x8F45, + 0x8F42, + 0x8F3E, + 0x8F4C, + 0x8F49, + 0x8F46, + 0x8F4E, + 0x8F57, + 0x8F5C, + 0x8F62, + 0x8F63, + 0x8F64, + 0x8F9C, + 0x8F9F, + 0x8FA3, + 0x8FAD, + 0x8FAF, + 0x8FB7, + 0x8FDA, + 0x8FE5, + 0x8FE2, + 0x8FEA, + 0x8FEF, + 0x9087, + 0x8FF4, + 0x9005, + 0x8FF9, + 0x8FFA, + 0x9011, + 0x9015, + 0x9021, + 0x900D, + 0x901E, + 0x9016, + 0x900B, + 0x9027, + 0x9036, + 0x9035, + 0x9039, + 0x8FF8, + 0x904F, + 0x9050, + 0x9051, + 0x9052, + 0x900E, + 0x9049, + 0x903E, + 0x9056, + 0x9058, + 0x905E, + 0x9068, + 0x906F, + 0x9076, + 0x96A8, + 0x9072, + 0x9082, + 0x907D, + 0x9081, + 0x9080, + 0x908A, + 0x9089, + 0x908F, + 0x90A8, + 0x90AF, + 0x90B1, + 0x90B5, + 0x90E2, + 0x90E4, + 0x6248, + 0x90DB, + 0x9102, + 0x9112, + 0x9119, + 0x9132, + 0x9130, + 0x914A, + 0x9156, + 0x9158, + 0x9163, + 0x9165, + 0x9169, + 0x9173, + 0x9172, + 0x918B, + 0x9189, + 0x9182, + 0x91A2, + 0x91AB, + 0x91AF, + 0x91AA, + 0x91B5, + 0x91B4, + 0x91BA, + 0x91C0, + 0x91C1, + 0x91C9, + 0x91CB, + 0x91D0, + 0x91D6, + 0x91DF, + 0x91E1, + 0x91DB, + 0x91FC, + 0x91F5, + 0x91F6, + 0x921E, + 0x91FF, + 0x9214, + 0x922C, + 0x9215, + 0x9211, + 0x925E, + 0x9257, + 0x9245, + 0x9249, + 0x9264, + 0x9248, + 0x9295, + 0x923F, + 0x924B, + 0x9250, + 0x929C, + 0x9296, + 0x9293, + 0x929B, + 0x925A, + 0x92CF, + 0x92B9, + 0x92B7, + 0x92E9, + 0x930F, + 0x92FA, + 0x9344, + 0x932E, + 0x9319, + 0x9322, + 0x931A, + 0x9323, + 0x933A, + 0x9335, + 0x933B, + 0x935C, + 0x9360, + 0x937C, + 0x936E, + 0x9356, + 0x93B0, + 0x93AC, + 0x93AD, + 0x9394, + 0x93B9, + 0x93D6, + 0x93D7, + 0x93E8, + 0x93E5, + 0x93D8, + 0x93C3, + 0x93DD, + 0x93D0, + 0x93C8, + 0x93E4, + 0x941A, + 0x9414, + 0x9413, + 0x9403, + 0x9407, + 0x9410, + 0x9436, + 0x942B, + 0x9435, + 0x9421, + 0x943A, + 0x9441, + 0x9452, + 0x9444, + 0x945B, + 0x9460, + 0x9462, + 0x945E, + 0x946A, + 0x9229, + 0x9470, + 0x9475, + 0x9477, + 0x947D, + 0x945A, + 0x947C, + 0x947E, + 0x9481, + 0x947F, + 0x9582, + 0x9587, + 0x958A, + 0x9594, + 0x9596, + 0x9598, + 0x9599, + 0x95A0, + 0x95A8, + 0x95A7, + 0x95AD, + 0x95BC, + 0x95BB, + 0x95B9, + 0x95BE, + 0x95CA, + 0x6FF6, + 0x95C3, + 0x95CD, + 0x95CC, + 0x95D5, + 0x95D4, + 0x95D6, + 0x95DC, + 0x95E1, + 0x95E5, + 0x95E2, + 0x9621, + 0x9628, + 0x962E, + 0x962F, + 0x9642, + 0x964C, + 0x964F, + 0x964B, + 0x9677, + 0x965C, + 0x965E, + 0x965D, + 0x965F, + 0x9666, + 0x9672, + 0x966C, + 0x968D, + 0x9698, + 0x9695, + 0x9697, + 0x96AA, + 0x96A7, + 0x96B1, + 0x96B2, + 0x96B0, + 0x96B4, + 0x96B6, + 0x96B8, + 0x96B9, + 0x96CE, + 0x96CB, + 0x96C9, + 0x96CD, + 0x894D, + 0x96DC, + 0x970D, + 0x96D5, + 0x96F9, + 0x9704, + 0x9706, + 0x9708, + 0x9713, + 0x970E, + 0x9711, + 0x970F, + 0x9716, + 0x9719, + 0x9724, + 0x972A, + 0x9730, + 0x9739, + 0x973D, + 0x973E, + 0x9744, + 0x9746, + 0x9748, + 0x9742, + 0x9749, + 0x975C, + 0x9760, + 0x9764, + 0x9766, + 0x9768, + 0x52D2, + 0x976B, + 0x9771, + 0x9779, + 0x9785, + 0x977C, + 0x9781, + 0x977A, + 0x9786, + 0x978B, + 0x978F, + 0x9790, + 0x979C, + 0x97A8, + 0x97A6, + 0x97A3, + 0x97B3, + 0x97B4, + 0x97C3, + 0x97C6, + 0x97C8, + 0x97CB, + 0x97DC, + 0x97ED, + 0x9F4F, + 0x97F2, + 0x7ADF, + 0x97F6, + 0x97F5, + 0x980F, + 0x980C, + 0x9838, + 0x9824, + 0x9821, + 0x9837, + 0x983D, + 0x9846, + 0x984F, + 0x984B, + 0x986B, + 0x986F, + 0x9870, + 0x9871, + 0x9874, + 0x9873, + 0x98AA, + 0x98AF, + 0x98B1, + 0x98B6, + 0x98C4, + 0x98C3, + 0x98C6, + 0x98E9, + 0x98EB, + 0x9903, + 0x9909, + 0x9912, + 0x9914, + 0x9918, + 0x9921, + 0x991D, + 0x991E, + 0x9924, + 0x9920, + 0x992C, + 0x992E, + 0x993D, + 0x993E, + 0x9942, + 0x9949, + 0x9945, + 0x9950, + 0x994B, + 0x9951, + 0x9952, + 0x994C, + 0x9955, + 0x9997, + 0x9998, + 0x99A5, + 0x99AD, + 0x99AE, + 0x99BC, + 0x99DF, + 0x99DB, + 0x99DD, + 0x99D8, + 0x99D1, + 0x99ED, + 0x99EE, + 0x99F1, + 0x99F2, + 0x99FB, + 0x99F8, + 0x9A01, + 0x9A0F, + 0x9A05, + 0x99E2, + 0x9A19, + 0x9A2B, + 0x9A37, + 0x9A45, + 0x9A42, + 0x9A40, + 0x9A43, + 0x9A3E, + 0x9A55, + 0x9A4D, + 0x9A5B, + 0x9A57, + 0x9A5F, + 0x9A62, + 0x9A65, + 0x9A64, + 0x9A69, + 0x9A6B, + 0x9A6A, + 0x9AAD, + 0x9AB0, + 0x9ABC, + 0x9AC0, + 0x9ACF, + 0x9AD1, + 0x9AD3, + 0x9AD4, + 0x9ADE, + 0x9ADF, + 0x9AE2, + 0x9AE3, + 0x9AE6, + 0x9AEF, + 0x9AEB, + 0x9AEE, + 0x9AF4, + 0x9AF1, + 0x9AF7, + 0x9AFB, + 0x9B06, + 0x9B18, + 0x9B1A, + 0x9B1F, + 0x9B22, + 0x9B23, + 0x9B25, + 0x9B27, + 0x9B28, + 0x9B29, + 0x9B2A, + 0x9B2E, + 0x9B2F, + 0x9B32, + 0x9B44, + 0x9B43, + 0x9B4F, + 0x9B4D, + 0x9B4E, + 0x9B51, + 0x9B58, + 0x9B74, + 0x9B93, + 0x9B83, + 0x9B91, + 0x9B96, + 0x9B97, + 0x9B9F, + 0x9BA0, + 0x9BA8, + 0x9BB4, + 0x9BC0, + 0x9BCA, + 0x9BB9, + 0x9BC6, + 0x9BCF, + 0x9BD1, + 0x9BD2, + 0x9BE3, + 0x9BE2, + 0x9BE4, + 0x9BD4, + 0x9BE1, + 0x9C3A, + 0x9BF2, + 0x9BF1, + 0x9BF0, + 0x9C15, + 0x9C14, + 0x9C09, + 0x9C13, + 0x9C0C, + 0x9C06, + 0x9C08, + 0x9C12, + 0x9C0A, + 0x9C04, + 0x9C2E, + 0x9C1B, + 0x9C25, + 0x9C24, + 0x9C21, + 0x9C30, + 0x9C47, + 0x9C32, + 0x9C46, + 0x9C3E, + 0x9C5A, + 0x9C60, + 0x9C67, + 0x9C76, + 0x9C78, + 0x9CE7, + 0x9CEC, + 0x9CF0, + 0x9D09, + 0x9D08, + 0x9CEB, + 0x9D03, + 0x9D06, + 0x9D2A, + 0x9D26, + 0x9DAF, + 0x9D23, + 0x9D1F, + 0x9D44, + 0x9D15, + 0x9D12, + 0x9D41, + 0x9D3F, + 0x9D3E, + 0x9D46, + 0x9D48, + 0x9D5D, + 0x9D5E, + 0x9D64, + 0x9D51, + 0x9D50, + 0x9D59, + 0x9D72, + 0x9D89, + 0x9D87, + 0x9DAB, + 0x9D6F, + 0x9D7A, + 0x9D9A, + 0x9DA4, + 0x9DA9, + 0x9DB2, + 0x9DC4, + 0x9DC1, + 0x9DBB, + 0x9DB8, + 0x9DBA, + 0x9DC6, + 0x9DCF, + 0x9DC2, + 0x9DD9, + 0x9DD3, + 0x9DF8, + 0x9DE6, + 0x9DED, + 0x9DEF, + 0x9DFD, + 0x9E1A, + 0x9E1B, + 0x9E1E, + 0x9E75, + 0x9E79, + 0x9E7D, + 0x9E81, + 0x9E88, + 0x9E8B, + 0x9E8C, + 0x9E92, + 0x9E95, + 0x9E91, + 0x9E9D, + 0x9EA5, + 0x9EA9, + 0x9EB8, + 0x9EAA, + 0x9EAD, + 0x9761, + 0x9ECC, + 0x9ECE, + 0x9ECF, + 0x9ED0, + 0x9ED4, + 0x9EDC, + 0x9EDE, + 0x9EDD, + 0x9EE0, + 0x9EE5, + 0x9EE8, + 0x9EEF, + 0x9EF4, + 0x9EF6, + 0x9EF7, + 0x9EF9, + 0x9EFB, + 0x9EFC, + 0x9EFD, + 0x9F07, + 0x9F08, + 0x76B7, + 0x9F15, + 0x9F21, + 0x9F2C, + 0x9F3E, + 0x9F4A, + 0x9F52, + 0x9F54, + 0x9F63, + 0x9F5F, + 0x9F60, + 0x9F61, + 0x9F66, + 0x9F67, + 0x9F6C, + 0x9F6A, + 0x9F77, + 0x9F72, + 0x9F76, + 0x9F95, + 0x9F9C, + 0x9FA0, + 0x582F, + 0x69C7, + 0x9059, + 0x7464, + 0x51DC, + 0x7199 +}; + +/* f5 to fe is non-existent */ diff --git a/lib/ctype/local.h b/lib/ctype/local.h new file mode 100644 index 0000000..5c293c8 --- /dev/null +++ b/lib/ctype/local.h @@ -0,0 +1,44 @@ +/* Modified (m) 2017 Thomas Wolff: fixed locale/wchar handling */ + +/* wctrans constants */ + +#include <_ansi.h> +#include "../locale/setlocale.h" + +/* valid values for wctrans_t */ +#define WCT_TOLOWER 1 +#define WCT_TOUPPER 2 + +/* valid values for wctype_t */ +#define WC_ALNUM 1 +#define WC_ALPHA 2 +#define WC_BLANK 3 +#define WC_CNTRL 4 +#define WC_DIGIT 5 +#define WC_GRAPH 6 +#define WC_LOWER 7 +#define WC_PRINT 8 +#define WC_PUNCT 9 +#define WC_SPACE 10 +#define WC_UPPER 11 +#define WC_XDIGIT 12 + +/* internal functions to translate between JP and Unicode */ +/* note this is not applicable to Cygwin, where wchar_t is always Unicode, + and should not be applicable to most other platforms either; + * platforms for which wchar_t is not Unicode should be explicitly listed + * the transformation should be applied to all non-Unicode locales + (also Chinese, Korean, and even 8-bit locales such as *.CP1252) + * for towupper and towlower, the result must be back-transformed + into the respective locale encoding; currently NOT IMPLEMENTED +*/ +#ifdef __CYGWIN__ +/* Under Cygwin, wchar_t (or its extension wint_t) is Unicode */ +#define _jp2uc(c) (c) +#define _jp2uc_l(c, l) (c) +#define _uc2jp_l(c, l) (c) +#else +wint_t _jp2uc (wint_t); +wint_t _jp2uc_l (wint_t, struct __locale_t *); +wint_t _uc2jp_l (wint_t, struct __locale_t *); +#endif diff --git a/lib/ctype/mkcaseconv b/lib/ctype/mkcaseconv new file mode 100644 index 0000000..a455aed --- /dev/null +++ b/lib/ctype/mkcaseconv @@ -0,0 +1,128 @@ +#! /bin/sh -f + +# generate a table for Unicode case conversion; entries: +# struct caseconv_entry defined in towctrans_l.c + +if [ -r UnicodeData.txt ] +then UnicodeData=UnicodeData.txt +elif [ -r /usr/share/unicode/ucd/UnicodeData.txt ] +then UnicodeData=/usr/share/unicode/ucd/UnicodeData.txt +else echo UnicodeData.txt not found >&2 + exit 1 +fi + +LC_ALL=C +export LC_ALL + +compact=true + +#0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +#0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +#0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +#01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +#01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +#01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 + +tr -d '\015' < $UnicodeData | +sed \ +-e 's,^\([^;]*\);[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;][^;]*\);\([^;]*\);\([^;]*\)$,src \1 upper "\2" lower "\3" title "\4",' \ +-e t \ +-e 's,^\([^;]*\);[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);\([^;][^;]*\);\([^;]*\)$,src \1 upper "\2" lower "\3" title "\4",' \ +-e t \ +-e 's,^\([^;]*\);[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);\([^;]*\);\([^;][^;]*\)$,src \1 upper "\2" lower "\3" title "\4",' \ +-e t \ +-e d | +(#src 01C5 upper "01C4" lower "01C6" title "01C5" +if $compact +then + ( + cat <<\/EOS + src () { + if [ -n "$3" ] + then tohi=$(( 0x0$3 - 0x0$1 )) + else tohi=0 + fi + if [ -n "$5" ] + then tolo=$(( 0x0$5 - 0x0$1 )) + else tolo=0 + fi + case "$tolo.$tohi" in + 0.0) true;; + 0.*) + case "$1.$tohi" in + *[02468ACE].1) echo "'#error' U+$1 ODDSML";; + *[02468ACE].-1) echo " 0x$1 TO1 ODDCAP";; + *[13579BDF].1) echo "'#error' U+$1 EVENSML";; + *[13579BDF].-1) echo " 0x$1 TO1 EVENCAP";; + *) echo " 0x$1 TOUP $tohi";; + esac;; + *.0) + case "$1.$tolo" in + *[02468ACE].1) echo " 0x$1 TO1 EVENCAP";; + *[02468ACE].-1) echo "'#error' U+$1 EVENSML";; + *[13579BDF].1) echo " 0x$1 TO1 ODDCAP";; + *[13579BDF].-1) echo "'#error' U+$1 ODDSML";; + *) echo " 0x$1 TOLO $tolo";; + esac;; + *) case "$tolo.$tohi" in + 1.-1) echo " 0x$1 TOBOTH 0";; + *) echo "'#error' U+$1";; + esac;; + esac + } +/EOS + cat + ) | sh | + uniq -f1 --group=append | sed -e "s,^$,range," -e t -e "s,^,item ," | + ( + cat <<\/EOS + first= + diff=-1 + max=255 + range () { + # $diff == $(($last - $first)) + if [ "$diff" -ge 0 ] + then # we have items at all + echo " {$first, $diff, $v2, $v3}," + fi + first= + diff=-1 + } + item () { + if [ "$1" = "#error" ] + then echo "$*" + return + fi + + if [ $diff -eq $max ] + then range + elif [ -n "$first" ] + then if [ $(( $1 )) -ne $(( ${last-0} + 1 )) ] + then range + fi + fi + + if [ -z "$first" ] + then first=$1 + v2=$2 + v3=$3 + fi + + last=$1 + diff=$(( $diff + 1 )) + } +/EOS + cat + ) | sh +elif false +then + sed -e 's/src \([^ ]*\) upper "\([^ ]*\)" lower "\([^ ]*\)" title "\([^ ]*\)"/ {0x\1, 0x\2 - 0x\1, 0x\3 - 0x\1},/' \ + -e 's/0x - 0x[^ ,}]*/0/g' -e 's/0x}/0}/' \ + -e 's/\(0x[0-9A-F][0-9A-F]*\) - \(0x[0-9A-F][0-9A-F]*\)/$((`printf %d \1` - `printf %d \2`))/g' \ + -e 's/^/echo "/' -e 's/$/"/' | + sh +else + sed -e 's/src \([^ ]*\) upper "\([^ ]*\)" lower "\([^ ]*\)" title "\([^ ]*\)"/ {0x\1, 0x\2 - 0x\1, 0x\3 - 0x\1},/' \ + -e 's/0x - 0x[^ ,}]*/0/g' -e 's/0x}/0}/' +fi +) > caseconv.t diff --git a/lib/ctype/mkcategories b/lib/ctype/mkcategories new file mode 100644 index 0000000..22c7d4d --- /dev/null +++ b/lib/ctype/mkcategories @@ -0,0 +1,71 @@ +#! /bin/sh + +# generate table of Unicode character category ranges; +# note: undefined characters between two characters of the same category +# are associated to the same category, e.g. +#0A0A;GURMUKHI LETTER UU;Lo +#0A0B..0A0E -> Lo +#0A0F;GURMUKHI LETTER EE;Lo + +if [ -r UnicodeData.txt ] +then UnicodeData=UnicodeData.txt +elif [ -r /usr/share/unicode/ucd/UnicodeData.txt ] +then UnicodeData=/usr/share/unicode/ucd/UnicodeData.txt +else echo UnicodeData.txt not found >&2 + exit 1 +fi + +# the code assumes foldall=false, foldcase=true +foldall=false +foldcase=true + +( +cat <<\/EOS +first= +item () { + if [ -n "$first" ] + then if [ "$2" != "isRangeLast" \ + -a $(( 0x$1 )) -ne $(( 0x${last-0} + 1 )) ] + then range + fi + fi + + if [ -z "$first" ] + then first=$1 + val=$3 + fi + + last=$1 +} +range () { +# echo " {0x$first, 0x$last, CAT_$val}," +# echo " {0x$first, $((0x$last - 0x$first)), CAT_$val}," +# echo " {0x$first | (CAT_$val << 24), $((0x$last - 0x$first))}," + echo " {CAT_$val, 0x$first, $((0x$last - 0x$first))}," + first= +} +/EOS + +cat "$UnicodeData" | +if $foldall +then sed -e "s,;L[lu];,;LC;," -e "s,;C[fs];,;Cfs;," \ + -e "s,;L[mo];,;Lmo;," -e "s,;Nl;,;Lmo;," \ + -e "s,;P.;,;P;," -e "s,;No;,;P;," \ + -e "s,;S.;,;S;," -e "s,;Z[lp];,;Zlp;," \ + -e "s,;C[no];,;X;," -e "s,;M[cen];,;M;," +elif $foldcase +then +# fold Lu/Ll to LC only if lower/upper conversion is available + sed -e '/^\([^;]*\);[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);\([^;][^;]*\);.*/ s/;Lu;/;LC;/' \ + -e '/^\([^;]*\);[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;][^;]*\);\([^;]*\);.*/ s/;Ll;/;LC;/' \ + -e '/;Co;/ d' +else cat +fi | +sed -e "s,^\([^;]*\);<[^;]*\, Last>;\([^;]*\);.*,\1 isRangeLast \2," \ + -e "s,^\([^;]*\);[^;]*;\([^;]*\);.*,\1 isNormalOrRangeFirst \2," | +uniq -f2 --group=append | sed -e "s,^$,range," -e t -e "s,^,item ," +) | sh > categories.t + +sed -e "s/.*\(CAT_[A-Za-z]*\).*/ \1,/" categories.t | +sort | uniq > categories.cat + diff --git a/lib/ctype/mkunidata b/lib/ctype/mkunidata new file mode 100644 index 0000000..4adf667 --- /dev/null +++ b/lib/ctype/mkunidata @@ -0,0 +1,60 @@ +#! /bin/sh + +echo Generating Unicode character properties data for newlib/libc/ctype + +cd `dirname $0` + +############################################################################# +# checks and (with option -u) download + +case "$1" in +-h) echo "Usage: $0 [-h|-u|-i]" + echo "Generate case conversion table caseconv.t and character category table categories.t" + echo "from local Unicode file UnicodeData.txt." + echo "" + echo "Options:" + echo " -u download file from unicode.org first" + echo " -i copy file from /usr/share/unicode/ucd first" + echo " -h show this" + exit + ;; +-u) + wget () { + ref=`basename $1` + ref=`ls "$ref" 2> /dev/null || echo 01-Jan-1970` + curl -R -O --connect-timeout 55 -z "$ref" "$1" + } + + echo downloading data from unicode.org + for data in UnicodeData.txt + do wget http://unicode.org/Public/UNIDATA/$data + done + ;; +-i) + echo copying data from /usr/share/unicode/ucd + for data in UnicodeData.txt + do cp /usr/share/unicode/ucd/$data . + done + ;; +esac + +echo checking Unicode data file +for data in UnicodeData.txt +do if [ -r $data ] + then true + else echo $data not available, skipping table generation + exit + fi +done + +############################################################################# +# table generation + +echo generating character category table for "isw*.c" + sh ./mkcategories + +echo generating case conversion table for "tow*.c" + sh ./mkcaseconv + +############################################################################# +# end diff --git a/lib/ctype/toascii.c b/lib/ctype/toascii.c new file mode 100644 index 0000000..de5b8e1 --- /dev/null +++ b/lib/ctype/toascii.c @@ -0,0 +1,48 @@ +/* +FUNCTION + <>, <>---force integers to ASCII range + +INDEX + toascii + +INDEX + toascii_l + +SYNOPSIS + #include + int toascii(int <[c]>); + + #include + int toascii_l(int <[c]>, locale_t <[locale]>); + +DESCRIPTION +<> is a macro which coerces integers to the ASCII range (0--127) by zeroing any higher-order bits. + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining this macro using `<<#undef toascii>>' or `<<#undef toascii_l>>'. + +RETURNS +<>, <> return integers between 0 and 127. + +PORTABILITY +<> is X/Open, BSD and POSIX-1.2001, but marked obsolete in +POSIX-1.2008. +<> is a GNU extension. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#undef toascii + +int +toascii (int c) +{ + return (c)&0177; +} + diff --git a/lib/ctype/toascii_l.c b/lib/ctype/toascii_l.c new file mode 100644 index 0000000..8781261 --- /dev/null +++ b/lib/ctype/toascii_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +#undef toascii_l + +int +toascii_l (int c, struct __locale_t *locale) +{ + return c & 0177; +} diff --git a/lib/ctype/tolower.c b/lib/ctype/tolower.c new file mode 100644 index 0000000..aae2ce0 --- /dev/null +++ b/lib/ctype/tolower.c @@ -0,0 +1,82 @@ +/* +FUNCTION + <>, <>---translate characters to lowercase + +INDEX + tolower + +INDEX + tolower_l + +INDEX + _tolower + +SYNOPSIS + #include + int tolower(int <[c]>); + int _tolower(int <[c]>); + + #include + int tolower_l(int <[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a macro which converts uppercase characters to lowercase, +leaving all other characters unchanged. It is only defined when +<[c]> is an integer in the range <> to <<255>>. + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining this macro using `<<#undef tolower>>' or `<<#undef tolower_l>>'. + +<<_tolower>> performs the same conversion as <>, but should +only be used when <[c]> is known to be an uppercase character (<>--<>). + +RETURNS +<>, <> return the lowercase equivalent of <[c]> when +<[c]> is an uppercase character, and <[c]> otherwise. + +<<_tolower>> returns the lowercase equivalent of <[c]> when it is a +character between <> and <>. If <[c]> is not one of these +characters, the behaviour of <<_tolower>> is undefined. + +PORTABILITY +<> is ANSI C. <<_tolower>> is not recommended for portable programs. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) +#include +#include +#include +#include +#include +#endif + +#undef tolower +int +tolower (int c) +{ +#if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) + if ((unsigned char) c <= 0x7f) + return isupper (c) ? c - 'A' + 'a' : c; + else if (c != EOF && MB_CUR_MAX == 1 && isupper (c)) + { + char s[MB_LEN_MAX] = { c, '\0' }; + wchar_t wc; + if (mbtowc (&wc, s, 1) >= 0 + && wctomb (s, (wchar_t) towlower ((wint_t) wc)) == 1) + c = (unsigned char) s[0]; + } + return c; +#else + return isupper(c) ? (c) - 'A' + 'a' : c; +#endif +} diff --git a/lib/ctype/tolower_l.c b/lib/ctype/tolower_l.c new file mode 100644 index 0000000..3b196c8 --- /dev/null +++ b/lib/ctype/tolower_l.c @@ -0,0 +1,36 @@ +#include <_ansi.h> +#include +#if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" +#endif + +int +tolower_l (int c, struct __locale_t *locale) +{ +#if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) + if ((unsigned char) c <= 0x7f) + return isupper_l (c, locale) ? c - 'A' + 'a' : c; + else if (c != EOF && __locale_mb_cur_max_l (locale) == 1 + && isupper_l (c, locale)) + { + char s[MB_LEN_MAX] = { c, '\0' }; + wchar_t wc; + mbstate_t state; + + memset (&state, 0, sizeof state); + if (locale->mbtowc (_REENT, &wc, s, 1, &state) >= 0 + && locale->wctomb (_REENT, s, + (wchar_t) towlower_l ((wint_t) wc, locale), + &state) == 1) + c = (unsigned char) s[0]; + } + return c; +#else + return isupper_l (c, locale) ? (c) - 'A' + 'a' : c; +#endif +} diff --git a/lib/ctype/toupper.c b/lib/ctype/toupper.c new file mode 100644 index 0000000..61951b0 --- /dev/null +++ b/lib/ctype/toupper.c @@ -0,0 +1,82 @@ +/* +FUNCTION + <>, <>---translate characters to uppercase + +INDEX + toupper + +INDEX + toupper_l + +INDEX + _toupper + +SYNOPSIS + #include + int toupper(int <[c]>); + int _toupper(int <[c]>); + + #include + int toupper_l(int <[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a macro which converts lowercase characters to uppercase, +leaving all other characters unchanged. It is only defined when +<[c]> is an integer in the range <> to <<255>>. + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +You can use a compiled subroutine instead of the macro definition by +undefining this macro using `<<#undef toupper>>' or `<<#undef toupper_l>>'. + +<<_toupper>> performs the same conversion as <>, but should +only be used when <[c]> is known to be a lowercase character (<>--<>). + +RETURNS +<>, <> return the uppercase equivalent of <[c]> when +<[c]> is a lowercase character, and <[c]> otherwise. + +<<_toupper>> returns the uppercase equivalent of <[c]> when it is a +character between <> and <>. If <[c]> is not one of these +characters, the behaviour of <<_toupper>> is undefined. + +PORTABILITY +<> is ANSI C. <<_toupper>> is not recommended for portable programs. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) +#include +#include +#include +#include +#include +#endif + +#undef toupper +int +toupper (int c) +{ +#if defined (_MB_EXTENDED_CHARSETS_ISO) || defined (_MB_EXTENDED_CHARSETS_WINDOWS) + if ((unsigned char) c <= 0x7f) + return islower (c) ? c - 'a' + 'A' : c; + else if (c != EOF && MB_CUR_MAX == 1 && islower (c)) + { + char s[MB_LEN_MAX] = { c, '\0' }; + wchar_t wc; + if (mbtowc (&wc, s, 1) >= 0 + && wctomb (s, (wchar_t) towupper ((wint_t) wc)) == 1) + c = (unsigned char) s[0]; + } + return c; +#else + return islower (c) ? c - 'a' + 'A' : c; +#endif +} diff --git a/lib/ctype/toupper_l.c b/lib/ctype/toupper_l.c new file mode 100644 index 0000000..b126c1e --- /dev/null +++ b/lib/ctype/toupper_l.c @@ -0,0 +1,38 @@ +#include <_ansi.h> +#include +#if defined (_MB_EXTENDED_CHARSETS_ISO) \ + || defined (_MB_EXTENDED_CHARSETS_WINDOWS) +#include +#include +#include +#include +#include +#include <../locale/setlocale.h> +#endif + +int +toupper_l (int c, struct __locale_t *locale) +{ +#if defined (_MB_EXTENDED_CHARSETS_ISO) \ + || defined (_MB_EXTENDED_CHARSETS_WINDOWS) + if ((unsigned char) c <= 0x7f) + return islower_l (c, locale) ? c - 'a' + 'A' : c; + else if (c != EOF && __locale_mb_cur_max_l (locale) == 1 + && islower_l (c, locale)) + { + char s[MB_LEN_MAX] = { c, '\0' }; + wchar_t wc; + mbstate_t state; + + memset (&state, 0, sizeof state); + if (locale->mbtowc (_REENT, &wc, s, 1, &state) >= 0 + && locale->wctomb (_REENT, s, + (wchar_t) towupper_l ((wint_t) wc, locale), + &state) == 1) + c = (unsigned char) s[0]; + } + return c; +#else + return islower_l (c, locale) ? c - 'a' + 'A' : c; +#endif +} diff --git a/lib/ctype/towctrans.c b/lib/ctype/towctrans.c new file mode 100644 index 0000000..176aa3d --- /dev/null +++ b/lib/ctype/towctrans.c @@ -0,0 +1,101 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---extensible wide-character translation + +INDEX + towctrans + +INDEX + towctrans_l + +SYNOPSIS + #include + wint_t towctrans(wint_t <[c]>, wctrans_t <[w]>); + + #include + wint_t towctrans_l(wint_t <[c]>, wctrans_t <[w]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a function which converts wide characters based on +a specified translation type <[w]>. If the translation type is +invalid or cannot be applied to the current character, no change +to the character is made. + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return the translated equivalent of <[c]> +when it is a valid for the given translation, otherwise, it returns the +input character. When the translation type is invalid, <> is +set to <>. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include +//#include +#include "local.h" + +wint_t +_towctrans_r (struct _reent *r, + wint_t c, + wctrans_t w) +{ + if (w == WCT_TOLOWER || w == WCT_TOUPPER) + return towctrans_l (c, w, 0); + else + { + // skipping this because it was causing trouble (cygwin crash) + // and there is no errno specified for towctrans + //r->_errno = EINVAL; + return c; + } +} + +#ifndef _REENT_ONLY +wint_t +towctrans (wint_t c, + wctrans_t w) +{ + return _towctrans_r (_REENT, c, w); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/ctype/towctrans_l.c b/lib/ctype/towctrans_l.c new file mode 100644 index 0000000..b829266 --- /dev/null +++ b/lib/ctype/towctrans_l.c @@ -0,0 +1,162 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +//#include +#include "local.h" + +/* + struct caseconv_entry describes the case conversion behaviour + of a range of Unicode characters. + It was designed to be compact for a minimal table size. + The range is first...first + diff. + Conversion behaviour for a character c in the respective range: + mode == TOLO towlower (c) = c + delta + mode == TOUP towupper (c) = c + delta + mode == TOBOTH (titling case characters) + towlower (c) = c + 1 + towupper (c) = c - 1 + mode == TO1 capital/small letters are alternating + delta == EVENCAP even codes are capital + delta == ODDCAP odd codes are capital + (this correlates with an even/odd first range value + as of Unicode 10.0 but we do not rely on this) + As of Unicode 10.0, the following field lengths are sufficient + first: 17 bits + diff: 8 bits + delta: 17 bits + mode: 2 bits + The reserve of 4 bits (to limit the struct to 6 bytes) + is currently added to the 'first' field; + should a future Unicode version make it necessary to expand the others, + the 'first' field could be reduced as needed, or larger ranges could + be split up (reduce limit max=255 e.g. to max=127 or max=63 in + script mkcaseconv, check increasing table size). + */ +enum {TO1, TOLO, TOUP, TOBOTH}; +enum {EVENCAP, ODDCAP}; +static struct caseconv_entry { + uint_least32_t first: 21; + uint_least32_t diff: 8; + uint_least32_t mode: 2; + int_least32_t delta: 17; +} __attribute__ ((packed)) +caseconv_table [] = { +#include "caseconv.t" +}; +#define first(ce) ce.first +#define last(ce) (ce.first + ce.diff) + +/* auxiliary function for binary search in interval properties table */ +static const struct caseconv_entry * +bisearch (wint_t ucs, const struct caseconv_entry *table, int max) +{ + int min = 0; + int mid; + + if (ucs < first(table[0]) || ucs > last(table[max])) + return 0; + while (max >= min) + { + mid = (min + max) / 2; + if (ucs > last(table[mid])) + min = mid + 1; + else if (ucs < first(table[mid])) + max = mid - 1; + else + return &table[mid]; + } + return 0; +} + +static wint_t +toulower (wint_t c) +{ + const struct caseconv_entry * cce = + bisearch(c, caseconv_table, + sizeof(caseconv_table) / sizeof(*caseconv_table) - 1); + + if (cce) + switch (cce->mode) + { + case TOLO: + return c + cce->delta; + case TOBOTH: + return c + 1; + case TO1: + switch (cce->delta) + { + case EVENCAP: + if (!(c & 1)) + return c + 1; + break; + case ODDCAP: + if (c & 1) + return c + 1; + break; + default: + break; + } + default: + break; + } + + return c; +} + +static wint_t +touupper (wint_t c) +{ + const struct caseconv_entry * cce = + bisearch(c, caseconv_table, + sizeof(caseconv_table) / sizeof(*caseconv_table) - 1); + + if (cce) + switch (cce->mode) + { + case TOUP: + return c + cce->delta; + case TOBOTH: + return c - 1; + case TO1: + switch (cce->delta) + { + case EVENCAP: + if (c & 1) + return c - 1; + break; + case ODDCAP: + if (!(c & 1)) + return c - 1; + break; + default: + break; + } + default: + break; + } + + return c; +} + +wint_t +towctrans_l (wint_t c, wctrans_t w, struct __locale_t *locale) +{ + wint_t u = _jp2uc_l (c, locale); + wint_t res; + if (w == WCT_TOLOWER) + res = toulower (u); + else if (w == WCT_TOUPPER) + res = touupper (u); + else + { + // skipping the errno setting that was previously involved + // by delegating to towctrans; it was causing trouble (cygwin crash) + // and there is no errno specified for towctrans + return c; + } + if (res != u) + return _uc2jp_l (res, locale); + else + return c; +} diff --git a/lib/ctype/towlower.c b/lib/ctype/towlower.c new file mode 100644 index 0000000..01de1bd --- /dev/null +++ b/lib/ctype/towlower.c @@ -0,0 +1,81 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---translate wide characters to lowercase + +INDEX + towlower + +INDEX + towlower_l + +SYNOPSIS + #include + wint_t towlower(wint_t <[c]>); + + #include + wint_t towlower_l(wint_t <[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a function which converts uppercase wide characters to +lowercase, leaving all other characters unchanged. + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return the lowercase equivalent of <[c]> when it is a +uppercase wide character; otherwise, it returns the input character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include +#include "local.h" + +wint_t +towlower (wint_t c) +{ +#ifdef _MB_CAPABLE + return towctrans (c, WCT_TOLOWER); +#else + return c < 0x00ff ? (wint_t)(tolower ((int)c)) : c; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/towlower_l.c b/lib/ctype/towlower_l.c new file mode 100644 index 0000000..46e024d --- /dev/null +++ b/lib/ctype/towlower_l.c @@ -0,0 +1,15 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include +#include "local.h" + +wint_t +towlower_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + return towctrans_l (c, WCT_TOLOWER, locale); +#else + return towlower (c); +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/towupper.c b/lib/ctype/towupper.c new file mode 100644 index 0000000..a60e62b --- /dev/null +++ b/lib/ctype/towupper.c @@ -0,0 +1,84 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + Modified (m) 2017 Thomas Wolff to refer to generated Unicode data tables. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---translate wide characters to uppercase + +INDEX + towupper + +INDEX + towupper_l + +SYNOPSIS + #include + wint_t towupper(wint_t <[c]>); + + #include + wint_t towupper_l(wint_t <[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a function which converts lowercase wide characters to +uppercase, leaving all other characters unchanged. + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return the uppercase equivalent of <[c]> when it is a +lowercase wide character, otherwise, it returns the input character. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +wint_t +towupper (wint_t c) +{ +#ifdef _MB_CAPABLE + return towctrans (c, WCT_TOUPPER); +#else + return c < 0x00ff ? (wint_t)(toupper ((int)c)) : c; +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/towupper_l.c b/lib/ctype/towupper_l.c new file mode 100644 index 0000000..d7c1adb --- /dev/null +++ b/lib/ctype/towupper_l.c @@ -0,0 +1,14 @@ +/* Modified (m) 2017 Thomas Wolff: revise Unicode and locale/wchar handling */ +#include <_ansi.h> +#include +#include "local.h" + +wint_t +towupper_l (wint_t c, struct __locale_t *locale) +{ +#ifdef _MB_CAPABLE + return towctrans_l (c, WCT_TOUPPER, locale); +#else + return towupper (c); +#endif /* _MB_CAPABLE */ +} diff --git a/lib/ctype/wctrans.c b/lib/ctype/wctrans.c new file mode 100644 index 0000000..dbb103d --- /dev/null +++ b/lib/ctype/wctrans.c @@ -0,0 +1,98 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---get wide-character translation type + +INDEX + wctrans + +INDEX + wctrans_l + +SYNOPSIS + #include + wctrans_t wctrans(const char *<[c]>); + + #include + wctrans_t wctrans_l(const char *<[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a function which takes a string <[c]> and gives back +the appropriate wctrans_t type value associated with the string, +if one exists. The following values are guaranteed to be recognized: +"tolower" and "toupper". + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return 0 and sets <> to <> if the +given name is invalid. Otherwise, it returns a valid non-zero wctrans_t +value. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +wctrans_t +_wctrans_r (struct _reent *r, + const char *c) +{ + if (!strcmp (c, "tolower")) + return WCT_TOLOWER; + else if (!strcmp (c, "toupper")) + return WCT_TOUPPER; + else + { + _REENT_ERRNO(r) = EINVAL; + return 0; + } +} + +#ifndef _REENT_ONLY +wctrans_t +wctrans (const char *c) +{ + return _wctrans_r (_REENT, c); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/ctype/wctrans_l.c b/lib/ctype/wctrans_l.c new file mode 100644 index 0000000..30e61a4 --- /dev/null +++ b/lib/ctype/wctrans_l.c @@ -0,0 +1,10 @@ +#include <_ansi.h> +#include + +wctrans_t +wctrans_l (const char *c, struct __locale_t *locale) +{ + /* We're using a locale-independent representation of upper/lower case + based on Unicode data. Thus, the locale doesn't matter. */ + return wctrans (c); +} diff --git a/lib/ctype/wctype.c b/lib/ctype/wctype.c new file mode 100644 index 0000000..8c7afc7 --- /dev/null +++ b/lib/ctype/wctype.c @@ -0,0 +1,141 @@ +/* Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* +FUNCTION + <>, <>---get wide-character classification type + +INDEX + wctype + +INDEX + wctype_l + +SYNOPSIS + #include + wctype_t wctype(const char *<[c]>); + + #include + wctype_t wctype_l(const char *<[c]>, locale_t <[locale]>); + + +DESCRIPTION +<> is a function which takes a string <[c]> and gives back +the appropriate wctype_t type value associated with the string, +if one exists. The following values are guaranteed to be recognized: +"alnum", "alpha", "blank", "cntrl", "digit", "graph", "lower", "print", +"punct", "space", "upper", and "xdigit". + +<> is like <> but performs the function based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return 0 and sets <> to <> if the +given name is invalid. Otherwise, it returns a valid non-zero wctype_t +value. + +PORTABILITY +<> is C99. +<> is POSIX-1.2008. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +wctype_t +_wctype_r (struct _reent *r, + const char *c) +{ + switch (*c) + { + case 'a': + if (!strcmp (c, "alnum")) + return WC_ALNUM; + else if (!strcmp (c, "alpha")) + return WC_ALPHA; + break; + case 'b': + if (!strcmp (c, "blank")) + return WC_BLANK; + break; + case 'c': + if (!strcmp (c, "cntrl")) + return WC_CNTRL; + break; + case 'd': + if (!strcmp (c, "digit")) + return WC_DIGIT; + break; + case 'g': + if (!strcmp (c, "graph")) + return WC_GRAPH; + break; + case 'l': + if (!strcmp (c, "lower")) + return WC_LOWER; + break; + case 'p': + if (!strcmp (c, "print")) + return WC_PRINT; + else if (!strcmp (c, "punct")) + return WC_PUNCT; + break; + case 's': + if (!strcmp (c, "space")) + return WC_SPACE; + break; + case 'u': + if (!strcmp (c, "upper")) + return WC_UPPER; + break; + case 'x': + if (!strcmp (c, "xdigit")) + return WC_XDIGIT; + break; + } + + /* otherwise invalid */ + _REENT_ERRNO(r) = EINVAL; + return 0; +} + +#ifndef _REENT_ONLY +wctype_t +wctype (const char *c) +{ + return _wctype_r (_REENT, c); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/ctype/wctype_l.c b/lib/ctype/wctype_l.c new file mode 100644 index 0000000..c2793dd --- /dev/null +++ b/lib/ctype/wctype_l.c @@ -0,0 +1,8 @@ +#include <_ansi.h> +#include + +wctype_t +wctype_l (const char *c, struct __locale_t *locale) +{ + return wctype (c); +} diff --git a/lib/debug/debug.c b/lib/debug/debug.c index dd5fa7f..f206818 100644 --- a/lib/debug/debug.c +++ b/lib/debug/debug.c @@ -26,9 +26,9 @@ void printk(char *text) { debug_linecount++; #endif } - +/* #ifdef __aarch64__ - /* Define our own 128 bit memcpy */ + Define our own 128 bit memcpy * void memcpy(void *dest, void *src, size_t size) { unsigned __int128 *src2 = src; @@ -44,4 +44,4 @@ void printk(char *text) { for (size_t i = 0; i < len; i++) dest[i] = src[i]; } - #endif + #endif*/ diff --git a/lib/errno/Makefile.inc b/lib/errno/Makefile.inc new file mode 100644 index 0000000..f06b8c5 --- /dev/null +++ b/lib/errno/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/errno.c diff --git a/lib/errno/errno.c b/lib/errno/errno.c new file mode 100644 index 0000000..384b07f --- /dev/null +++ b/lib/errno/errno.c @@ -0,0 +1,22 @@ +/* The errno variable is stored in the reentrancy structure. This + function returns its address for use by the macro errno defined in + errno.h. */ + +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local int _tls_errno; +#else /* !_REENT_THREAD_LOCAL */ + +#ifndef _REENT_ONLY + +int * +__errno () +{ + return &_REENT_ERRNO(_REENT); +} + +#endif + +#endif /* _REENT_THREAD_LOCAL */ diff --git a/lib/iconv/Makefile.inc b/lib/iconv/Makefile.inc new file mode 100644 index 0000000..49585c7 --- /dev/null +++ b/lib/iconv/Makefile.inc @@ -0,0 +1,28 @@ +if ENABLE_NEWLIB_ICONV +cctdir = $(datadir)/iconv_data +cct_DATA = %D%/encoding.aliases +endif + +LIBC_CHAPTERS += %D%/iconv.tex + +## If mkdeps.pl or encodings.deps changes, make sure to regenerate outputs. +%C%_mkdeps_outputs = \ + $(top_srcdir)/iconv.m4 \ + $(srcdir)/%D%/ccs/ccsbi.c \ + $(srcdir)/%D%/ccs/ccsbi.h \ + $(srcdir)/%D%/ccs/ccsnames.h \ + $(srcdir)/%D%/ces/cesbi.c \ + $(srcdir)/%D%/ces/cesbi.h \ + $(srcdir)/%D%/ces/cesdeps.h \ + $(srcdir)/%D%/encoding.aliases \ + $(srcdir)/%D%/lib/aliasesbi.c \ + $(srcdir)/%D%/lib/encnames.h + +$(%C%_mkdeps_outputs): @MAINTAINER_MODE_TRUE@ $(srcdir)/%D%/ces/mkdeps.pl $(srcdir)/%D%/lib/encoding.deps + $(AM_V_GEN)cd $(srcdir)/%D%/ces && ./mkdeps.pl + +noinst_DATA += $(%C%_mkdeps_outputs) + +include %D%/ces/Makefile.inc +include %D%/ccs/Makefile.inc +include %D%/lib/Makefile.inc diff --git a/lib/iconv/ccs/Makefile.inc b/lib/iconv/ccs/Makefile.inc new file mode 100644 index 0000000..76da3c7 --- /dev/null +++ b/lib/iconv/ccs/Makefile.inc @@ -0,0 +1,24 @@ +if ENABLE_NEWLIB_ICONV + +## The following interfaces are EL/IX level 2 +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/ccsbi.c \ + %D%/iso_8859_10.c %D%/iso_8859_13.c %D%/iso_8859_14.c %D%/iso_8859_15.c \ + %D%/iso_8859_1.c %D%/iso_8859_2.c %D%/iso_8859_3.c %D%/iso_8859_4.c \ + %D%/iso_8859_5.c %D%/iso_8859_6.c %D%/iso_8859_7.c %D%/iso_8859_8.c \ + %D%/iso_8859_9.c %D%/iso_8859_11.c \ + %D%/win_1250.c %D%/win_1252.c %D%/win_1254.c \ + %D%/win_1256.c %D%/win_1258.c %D%/win_1251.c \ + %D%/win_1253.c %D%/win_1255.c %D%/win_1257.c \ + %D%/koi8_r.c %D%/koi8_u.c %D%/koi8_ru.c %D%/koi8_uni.c \ + %D%/iso_ir_111.c \ + %D%/big5.c \ + %D%/cp775.c %D%/cp850.c %D%/cp852.c %D%/cp855.c %D%/cp866.c \ + %D%/jis_x0212_1990.c %D%/jis_x0201_1976.c %D%/jis_x0208_1990.c %D%/ksx1001.c \ + %D%/cns11643_plane1.c %D%/cns11643_plane2.c %D%/cns11643_plane14.c +endif + +include %D%/binary/Makefile.inc + +endif diff --git a/lib/iconv/ccs/big5.c b/lib/iconv/ccs/big5.c new file mode 100644 index 0000000..02b20a1 --- /dev/null +++ b/lib/iconv/ccs/big5.c @@ -0,0 +1,12615 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for big5 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_BIG5) \ + || defined (ICONV_FROM_UCS_CCS_BIG5) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit big5 -> UCS speed-optimized table (45568 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_BIG5) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_big5[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700, + 0x0800,0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00,0x0F00, + 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700, + 0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00, + 0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, + INVBLK,0x2800,0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00, + 0x2F00,0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600, + 0x3700,0x3800,0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00, + 0x3F00,0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600, + 0x4700,0x4800,0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00, + 0x4F00,0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600, + 0x5700,0x5800,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 162, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3000,0xFF0C,0x3001,0x3002,0xFF0E,0x2022,0xFF1B,0xFF1A, + 0xFF1F,0xFF01,0xFE30,0x2026,0x2025,0xFE50,0xFF64,0xFE52, + 0x00B7,0xFE54,0xFE55,0xFE56,0xFE57,0xFF5C,0x2013,0xFE31, + 0x2014,0xFE33,0xFFFD,0xFE34,0xFE4F,0xFF08,0xFF09,0xFE35, + 0xFE36,0xFF5B,0xFF5D,0xFE37,0xFE38,0x3014,0x3015,0xFE39, + 0xFE3A,0x3010,0x3011,0xFE3B,0xFE3C,0x300A,0x300B,0xFE3D, + 0xFE3E,0x3008,0x3009,0xFE3F,0xFE40,0x300C,0x300D,0xFE41, + 0xFE42,0x300E,0x300F,0xFE43,0xFE44,0xFE59,0xFE5A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFE5B,0xFE5C,0xFE5D,0xFE5E,0x2018,0x2019,0x201C, + 0x201D,0x301D,0x301E,0x2035,0x2032,0xFF03,0xFF06,0xFF0A, + 0x203B,0x00A7,0x3003,0x25CB,0x25CF,0x25B3,0x25B2,0x25CE, + 0x2606,0x2605,0x25C7,0x25C6,0x25A1,0x25A0,0x25BD,0x25BC, + 0x32A3,0x2105,0x203E,0xFFFD,0xFF3F,0xFFFD,0xFE49,0xFE4A, + 0xFE4D,0xFE4E,0xFE4B,0xFE4C,0xFE5F,0xFE60,0xFE61,0xFF0B, + 0xFF0D,0x00D7,0x00F7,0x00B1,0x221A,0xFF1C,0xFF1E,0xFF1D, + 0x2266,0x2267,0x2260,0x221E,0x2252,0x2261,0xFE62,0xFE63, + 0xFE64,0xFE65,0xFE66,0x223C,0x2229,0x222A,0x22A5,0x2220, + 0x221F,0x22BF,0x33D2,0x33D1,0x222B,0x222E,0x2235,0x2234, + 0x2640,0x2642,0x2641,0x2609,0x2191,0x2193,0x2190,0x2192, + 0x2196,0x2197,0x2199,0x2198,0x2225,0x2223,0xFFFD,INVALC, + /* Block 163, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xFFFD,0xFF0F,0xFF3C,0xFF04,0x00A5,0x3012,0x00A2,0x00A3, + 0xFF05,0xFF20,0x2103,0x2109,0xFE69,0xFE6A,0xFE6B,0x33D5, + 0x339C,0x339D,0x339E,0x33CE,0x33A1,0x338E,0x338F,0x33C4, + 0x00B0,0x5159,0x515B,0x515E,0x515D,0x5161,0x5163,0x55E7, + 0x74E9,0x7CCE,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586, + 0x2587,0x2588,0x258F,0x258E,0x258D,0x258C,0x258B,0x258A, + 0x2589,0x253C,0x2534,0x252C,0x2524,0x251C,0x2594,0x2500, + 0x2502,0x2595,0x250C,0x2510,0x2514,0x2518,0x256D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x256E,0x2570,0x256F,0x2550,0x255E,0x256A,0x2561, + 0x25E2,0x25E3,0x25E5,0x25E4,0x2571,0x2572,0x2573,0xFF10, + 0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, + 0xFF19,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166, + 0x2167,0x2168,0x2169,0x3021,0x3022,0x3023,0x3024,0x3025, + 0x3026,0x3027,0x3028,0x3029,0xFFFD,0x5344,0xFFFD,0xFF21, + 0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29, + 0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31, + 0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39, + 0xFF3A,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, + 0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, + 0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,INVALC, + /* Block 164, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xFF57,0xFF58,0xFF59,0xFF5A,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C, + 0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4, + 0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC, + 0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3,0x03C4,0x03C5, + 0x03C6,0x03C7,0x03C8,0x03C9,0x3105,0x3106,0x3107,0x3108, + 0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116, + 0x3117,0x3118,0x3119,0x311A,0x311B,0x311C,0x311D,0x311E, + 0x311F,0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126, + 0x3127,0x3128,0x3129,0x02D9,0x02C9,0x02CA,0x02C7,0x02CB, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 165, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E00,0x4E59,0x4E01,0x4E03,0x4E43,0x4E5D,0x4E86,0x4E8C, + 0x4EBA,0x513F,0x5165,0x516B,0x51E0,0x5200,0x5201,0x529B, + 0x5315,0x5341,0x535C,0x53C8,0x4E09,0x4E0B,0x4E08,0x4E0A, + 0x4E2B,0x4E38,0x51E1,0x4E45,0x4E48,0x4E5F,0x4E5E,0x4E8E, + 0x4EA1,0x5140,0x5203,0x52FA,0x5343,0x53C9,0x53E3,0x571F, + 0x58EB,0x5915,0x5927,0x5973,0x5B50,0x5B51,0x5B53,0x5BF8, + 0x5C0F,0x5C22,0x5C38,0x5C71,0x5DDD,0x5DE5,0x5DF1,0x5DF2, + 0x5DF3,0x5DFE,0x5E72,0x5EFE,0x5F0B,0x5F13,0x624D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E11,0x4E10,0x4E0D,0x4E2D,0x4E30,0x4E39,0x4E4B, + 0x5C39,0x4E88,0x4E91,0x4E95,0x4E92,0x4E94,0x4EA2,0x4EC1, + 0x4EC0,0x4EC3,0x4EC6,0x4EC7,0x4ECD,0x4ECA,0x4ECB,0x4EC4, + 0x5143,0x5141,0x5167,0x516D,0x516E,0x516C,0x5197,0x51F6, + 0x5206,0x5207,0x5208,0x52FB,0x52FE,0x52FF,0x5316,0x5339, + 0x5348,0x5347,0x5345,0x535E,0x5384,0x53CB,0x53CA,0x53CD, + 0x58EC,0x5929,0x592B,0x592A,0x592D,0x5B54,0x5C11,0x5C24, + 0x5C3A,0x5C6F,0x5DF4,0x5E7B,0x5EFF,0x5F14,0x5F15,0x5FC3, + 0x6208,0x6236,0x624B,0x624E,0x652F,0x6587,0x6597,0x65A4, + 0x65B9,0x65E5,0x66F0,0x6708,0x6728,0x6B20,0x6B62,0x6B79, + 0x6BCB,0x6BD4,0x6BDB,0x6C0F,0x6C34,0x706B,0x722A,0x7236, + 0x723B,0x7247,0x7259,0x725B,0x72AC,0x738B,0x4E19,INVALC, + /* Block 166, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E16,0x4E15,0x4E14,0x4E18,0x4E3B,0x4E4D,0x4E4F,0x4E4E, + 0x4EE5,0x4ED8,0x4ED4,0x4ED5,0x4ED6,0x4ED7,0x4EE3,0x4EE4, + 0x4ED9,0x4EDE,0x5145,0x5144,0x5189,0x518A,0x51AC,0x51F9, + 0x51FA,0x51F8,0x520A,0x52A0,0x529F,0x5305,0x5306,0x5317, + 0x531D,0x4EDF,0x534A,0x5349,0x5361,0x5360,0x536F,0x536E, + 0x53BB,0x53EF,0x53E4,0x53F3,0x53EC,0x53EE,0x53E9,0x53E8, + 0x53FC,0x53F8,0x53F5,0x53EB,0x53E6,0x53EA,0x53F2,0x53F1, + 0x53F0,0x53E5,0x53ED,0x53FB,0x56DB,0x56DA,0x5916,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x592E,0x5931,0x5974,0x5976,0x5B55,0x5B83,0x5C3C, + 0x5DE8,0x5DE7,0x5DE6,0x5E02,0x5E03,0x5E73,0x5E7C,0x5F01, + 0x5F18,0x5F17,0x5FC5,0x620A,0x6253,0x6254,0x6252,0x6251, + 0x65A5,0x65E6,0x672E,0x672C,0x672A,0x672B,0x672D,0x6B63, + 0x6BCD,0x6C11,0x6C10,0x6C38,0x6C41,0x6C40,0x6C3E,0x72AF, + 0x7384,0x7389,0x74DC,0x74E6,0x7518,0x751F,0x7528,0x7529, + 0x7530,0x7531,0x7532,0x7533,0x758B,0x767D,0x76AE,0x76BF, + 0x76EE,0x77DB,0x77E2,0x77F3,0x793A,0x79BE,0x7A74,0x7ACB, + 0x4E1E,0x4E1F,0x4E52,0x4E53,0x4E69,0x4E99,0x4EA4,0x4EA6, + 0x4EA5,0x4EFF,0x4F09,0x4F19,0x4F0A,0x4F15,0x4F0D,0x4F10, + 0x4F11,0x4F0F,0x4EF2,0x4EF6,0x4EFB,0x4EF0,0x4EF3,0x4EFD, + 0x4F01,0x4F0B,0x5149,0x5147,0x5146,0x5148,0x5168,INVALC, + /* Block 167, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5171,0x518D,0x51B0,0x5217,0x5211,0x5212,0x520E,0x5216, + 0x52A3,0x5308,0x5321,0x5320,0x5370,0x5371,0x5409,0x540F, + 0x540C,0x540A,0x5410,0x5401,0x540B,0x5404,0x5411,0x540D, + 0x5408,0x5403,0x540E,0x5406,0x5412,0x56E0,0x56DE,0x56DD, + 0x5733,0x5730,0x5728,0x572D,0x572C,0x572F,0x5729,0x5919, + 0x591A,0x5937,0x5938,0x5984,0x5978,0x5983,0x597D,0x5979, + 0x5982,0x5981,0x5B57,0x5B58,0x5B87,0x5B88,0x5B85,0x5B89, + 0x5BFA,0x5C16,0x5C79,0x5DDE,0x5E06,0x5E76,0x5E74,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F0F,0x5F1B,0x5FD9,0x5FD6,0x620E,0x620C,0x620D, + 0x6210,0x6263,0x625B,0x6258,0x6536,0x65E9,0x65E8,0x65EC, + 0x65ED,0x66F2,0x66F3,0x6709,0x673D,0x6734,0x6731,0x6735, + 0x6B21,0x6B64,0x6B7B,0x6C16,0x6C5D,0x6C57,0x6C59,0x6C5F, + 0x6C60,0x6C50,0x6C55,0x6C61,0x6C5B,0x6C4D,0x6C4E,0x7070, + 0x725F,0x725D,0x767E,0x7AF9,0x7C73,0x7CF8,0x7F36,0x7F8A, + 0x7FBD,0x8001,0x8003,0x800C,0x8012,0x8033,0x807F,0x8089, + 0x808B,0x808C,0x81E3,0x81EA,0x81F3,0x81FC,0x820C,0x821B, + 0x821F,0x826E,0x8272,0x827E,0x866B,0x8840,0x884C,0x8863, + 0x897F,0x9621,0x4E32,0x4EA8,0x4F4D,0x4F4F,0x4F47,0x4F57, + 0x4F5E,0x4F34,0x4F5B,0x4F55,0x4F30,0x4F50,0x4F51,0x4F3D, + 0x4F3A,0x4F38,0x4F43,0x4F54,0x4F3C,0x4F46,0x4F63,INVALC, + /* Block 168, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F5C,0x4F60,0x4F2F,0x4F4E,0x4F36,0x4F59,0x4F5D,0x4F48, + 0x4F5A,0x514C,0x514B,0x514D,0x5175,0x51B6,0x51B7,0x5225, + 0x5224,0x5229,0x522A,0x5228,0x52AB,0x52A9,0x52AA,0x52AC, + 0x5323,0x5373,0x5375,0x541D,0x542D,0x541E,0x543E,0x5426, + 0x544E,0x5427,0x5446,0x5443,0x5433,0x5448,0x5442,0x541B, + 0x5429,0x544A,0x5439,0x543B,0x5438,0x542E,0x5435,0x5436, + 0x5420,0x543C,0x5440,0x5431,0x542B,0x541F,0x542C,0x56EA, + 0x56F0,0x56E4,0x56EB,0x574A,0x5751,0x5740,0x574D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5747,0x574E,0x573E,0x5750,0x574F,0x573B,0x58EF, + 0x593E,0x599D,0x5992,0x59A8,0x599E,0x59A3,0x5999,0x5996, + 0x598D,0x59A4,0x5993,0x598A,0x59A5,0x5B5D,0x5B5C,0x5B5A, + 0x5B5B,0x5B8C,0x5B8B,0x5B8F,0x5C2C,0x5C40,0x5C41,0x5C3F, + 0x5C3E,0x5C90,0x5C91,0x5C94,0x5C8C,0x5DEB,0x5E0C,0x5E8F, + 0x5E87,0x5E8A,0x5EF7,0x5F04,0x5F1F,0x5F64,0x5F62,0x5F77, + 0x5F79,0x5FD8,0x5FCC,0x5FD7,0x5FCD,0x5FF1,0x5FEB,0x5FF8, + 0x5FEA,0x6212,0x6211,0x6284,0x6297,0x6296,0x6280,0x6276, + 0x6289,0x626D,0x628A,0x627C,0x627E,0x6279,0x6273,0x6292, + 0x626F,0x6298,0x626E,0x6295,0x6293,0x6291,0x6286,0x6539, + 0x653B,0x6538,0x65F1,0x66F4,0x675F,0x674E,0x674F,0x6750, + 0x6751,0x675C,0x6756,0x675E,0x6749,0x6746,0x6760,INVALC, + /* Block 169, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6753,0x6757,0x6B65,0x6BCF,0x6C42,0x6C5E,0x6C99,0x6C81, + 0x6C88,0x6C89,0x6C85,0x6C9B,0x6C6A,0x6C7A,0x6C90,0x6C70, + 0x6C8C,0x6C68,0x6C96,0x6C92,0x6C7D,0x6C83,0x6C72,0x6C7E, + 0x6C74,0x6C86,0x6C76,0x6C8D,0x6C94,0x6C98,0x6C82,0x7076, + 0x707C,0x707D,0x7078,0x7262,0x7261,0x7260,0x72C4,0x72C2, + 0x7396,0x752C,0x752B,0x7537,0x7538,0x7682,0x76EF,0x77E3, + 0x79C1,0x79C0,0x79BF,0x7A76,0x7CFB,0x7F55,0x8096,0x8093, + 0x809D,0x8098,0x809B,0x809A,0x80B2,0x826F,0x8292,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x828B,0x828D,0x898B,0x89D2,0x8A00,0x8C37,0x8C46, + 0x8C55,0x8C9D,0x8D64,0x8D70,0x8DB3,0x8EAB,0x8ECA,0x8F9B, + 0x8FB0,0x8FC2,0x8FC6,0x8FC5,0x8FC4,0x5DE1,0x9091,0x90A2, + 0x90AA,0x90A6,0x90A3,0x9149,0x91C6,0x91CC,0x9632,0x962E, + 0x9631,0x962A,0x962C,0x4E26,0x4E56,0x4E73,0x4E8B,0x4E9B, + 0x4E9E,0x4EAB,0x4EAC,0x4F6F,0x4F9D,0x4F8D,0x4F73,0x4F7F, + 0x4F6C,0x4F9B,0x4F8B,0x4F86,0x4F83,0x4F70,0x4F75,0x4F88, + 0x4F69,0x4F7B,0x4F96,0x4F7E,0x4F8F,0x4F91,0x4F7A,0x5154, + 0x5152,0x5155,0x5169,0x5177,0x5176,0x5178,0x51BD,0x51FD, + 0x523B,0x5238,0x5237,0x523A,0x5230,0x522E,0x5236,0x5241, + 0x52BE,0x52BB,0x5352,0x5354,0x5353,0x5351,0x5366,0x5377, + 0x5378,0x5379,0x53D6,0x53D4,0x53D7,0x5473,0x5475,INVALC, + /* Block 170, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5496,0x5478,0x5495,0x5480,0x547B,0x5477,0x5484,0x5492, + 0x5486,0x547C,0x5490,0x5471,0x5476,0x548C,0x549A,0x5462, + 0x5468,0x548B,0x547D,0x548E,0x56FA,0x5783,0x5777,0x576A, + 0x5769,0x5761,0x5766,0x5764,0x577C,0x591C,0x5949,0x5947, + 0x5948,0x5944,0x5954,0x59BE,0x59BB,0x59D4,0x59B9,0x59AE, + 0x59D1,0x59C6,0x59D0,0x59CD,0x59CB,0x59D3,0x59CA,0x59AF, + 0x59B3,0x59D2,0x59C5,0x5B5F,0x5B64,0x5B63,0x5B97,0x5B9A, + 0x5B98,0x5B9C,0x5B99,0x5B9B,0x5C1A,0x5C48,0x5C45,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C46,0x5CB7,0x5CA1,0x5CB8,0x5CA9,0x5CAB,0x5CB1, + 0x5CB3,0x5E18,0x5E1A,0x5E16,0x5E15,0x5E1B,0x5E11,0x5E78, + 0x5E9A,0x5E97,0x5E9C,0x5E95,0x5E96,0x5EF6,0x5F26,0x5F27, + 0x5F29,0x5F80,0x5F81,0x5F7F,0x5F7C,0x5FDD,0x5FE0,0x5FFD, + 0x5FF5,0x5FFF,0x600F,0x6014,0x602F,0x6035,0x6016,0x602A, + 0x6015,0x6021,0x6027,0x6029,0x602B,0x601B,0x6216,0x6215, + 0x623F,0x623E,0x6240,0x627F,0x62C9,0x62CC,0x62C4,0x62BF, + 0x62C2,0x62B9,0x62D2,0x62DB,0x62AB,0x62D3,0x62D4,0x62CB, + 0x62C8,0x62A8,0x62BD,0x62BC,0x62D0,0x62D9,0x62C7,0x62CD, + 0x62B5,0x62DA,0x62B1,0x62D8,0x62D6,0x62D7,0x62C6,0x62AC, + 0x62CE,0x653E,0x65A7,0x65BC,0x65FA,0x6614,0x6613,0x660C, + 0x6606,0x6602,0x660E,0x6600,0x660F,0x6615,0x660A,INVALC, + /* Block 171, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6607,0x670D,0x670B,0x676D,0x678B,0x6795,0x6771,0x679C, + 0x6773,0x6777,0x6787,0x679D,0x6797,0x676F,0x6770,0x677F, + 0x6789,0x677E,0x6790,0x6775,0x679A,0x6793,0x677C,0x676A, + 0x6772,0x6B23,0x6B66,0x6B67,0x6B7F,0x6C13,0x6C1B,0x6CE3, + 0x6CE8,0x6CF3,0x6CB1,0x6CCC,0x6CE5,0x6CB3,0x6CBD,0x6CBE, + 0x6CBC,0x6CE2,0x6CAB,0x6CD5,0x6CD3,0x6CB8,0x6CC4,0x6CB9, + 0x6CC1,0x6CAE,0x6CD7,0x6CC5,0x6CF1,0x6CBF,0x6CBB,0x6CE1, + 0x6CDB,0x6CCA,0x6CAC,0x6CEF,0x6CDC,0x6CD6,0x6CE0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7095,0x708E,0x7092,0x708A,0x7099,0x722C,0x722D, + 0x7238,0x7248,0x7267,0x7269,0x72C0,0x72CE,0x72D9,0x72D7, + 0x72D0,0x73A9,0x73A8,0x739F,0x73AB,0x73A5,0x753D,0x759D, + 0x7599,0x759A,0x7684,0x76C2,0x76F2,0x76F4,0x77E5,0x77FD, + 0x793E,0x7940,0x7941,0x79C9,0x79C8,0x7A7A,0x7A79,0x7AFA, + 0x7CFE,0x7F54,0x7F8C,0x7F8B,0x8005,0x80BA,0x80A5,0x80A2, + 0x80B1,0x80A1,0x80AB,0x80A9,0x80B4,0x80AA,0x80AF,0x81E5, + 0x81FE,0x820D,0x82B3,0x829D,0x8299,0x82AD,0x82BD,0x829F, + 0x82B9,0x82B1,0x82AC,0x82A5,0x82AF,0x82B8,0x82A3,0x82B0, + 0x82BE,0x82B7,0x864E,0x8671,0x521D,0x8868,0x8ECB,0x8FCE, + 0x8FD4,0x8FD1,0x90B5,0x90B8,0x90B1,0x90B6,0x91C7,0x91D1, + 0x9577,0x9580,0x961C,0x9640,0x963F,0x963B,0x9644,INVALC, + /* Block 172, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x9642,0x96B9,0x96E8,0x9752,0x975E,0x4E9F,0x4EAD,0x4EAE, + 0x4FE1,0x4FB5,0x4FAF,0x4FBF,0x4FE0,0x4FD1,0x4FCF,0x4FDD, + 0x4FC3,0x4FB6,0x4FD8,0x4FDF,0x4FCA,0x4FD7,0x4FAE,0x4FD0, + 0x4FC4,0x4FC2,0x4FDA,0x4FCE,0x4FDE,0x4FB7,0x5157,0x5192, + 0x5191,0x51A0,0x524E,0x5243,0x524A,0x524D,0x524C,0x524B, + 0x5247,0x52C7,0x52C9,0x52C3,0x52C1,0x530D,0x5357,0x537B, + 0x539A,0x53DB,0x54AC,0x54C0,0x54A8,0x54CE,0x54C9,0x54B8, + 0x54A6,0x54B3,0x54C7,0x54C2,0x54BD,0x54AA,0x54C1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x54C4,0x54C8,0x54AF,0x54AB,0x54B1,0x54BB,0x54A9, + 0x54A7,0x54BF,0x56FF,0x5782,0x578B,0x57A0,0x57A3,0x57A2, + 0x57CE,0x57AE,0x5793,0x5955,0x5951,0x594F,0x594E,0x5950, + 0x59DC,0x59D8,0x59FF,0x59E3,0x59E8,0x5A03,0x59E5,0x59EA, + 0x59DA,0x59E6,0x5A01,0x59FB,0x5B69,0x5BA3,0x5BA6,0x5BA4, + 0x5BA2,0x5BA5,0x5C01,0x5C4E,0x5C4F,0x5C4D,0x5C4B,0x5CD9, + 0x5CD2,0x5DF7,0x5E1D,0x5E25,0x5E1F,0x5E7D,0x5EA0,0x5EA6, + 0x5EFA,0x5F08,0x5F2D,0x5F65,0x5F88,0x5F85,0x5F8A,0x5F8B, + 0x5F87,0x5F8C,0x5F89,0x6012,0x601D,0x6020,0x6025,0x600E, + 0x6028,0x604D,0x6070,0x6068,0x6062,0x6046,0x6043,0x606C, + 0x606B,0x606A,0x6064,0x6241,0x62DC,0x6316,0x6309,0x62FC, + 0x62ED,0x6301,0x62EE,0x62FD,0x6307,0x62F1,0x62F7,INVALC, + /* Block 173, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x62EF,0x62EC,0x62FE,0x62F4,0x6311,0x6302,0x653F,0x6545, + 0x65AB,0x65BD,0x65E2,0x6625,0x662D,0x6620,0x6627,0x662F, + 0x661F,0x6628,0x6631,0x6624,0x66F7,0x67FF,0x67D3,0x67F1, + 0x67D4,0x67D0,0x67EC,0x67B6,0x67AF,0x67F5,0x67E9,0x67EF, + 0x67C4,0x67D1,0x67B4,0x67DA,0x67E5,0x67B8,0x67CF,0x67DE, + 0x67F3,0x67B0,0x67D9,0x67E2,0x67DD,0x67D2,0x6B6A,0x6B83, + 0x6B86,0x6BB5,0x6BD2,0x6BD7,0x6C1F,0x6CC9,0x6D0B,0x6D32, + 0x6D2A,0x6D41,0x6D25,0x6D0C,0x6D31,0x6D1E,0x6D17,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D3B,0x6D3D,0x6D3E,0x6D36,0x6D1B,0x6CF5,0x6D39, + 0x6D27,0x6D38,0x6D29,0x6D2E,0x6D35,0x6D0E,0x6D2B,0x70AB, + 0x70BA,0x70B3,0x70AC,0x70AF,0x70AD,0x70B8,0x70AE,0x70A4, + 0x7230,0x7272,0x726F,0x7274,0x72E9,0x72E0,0x72E1,0x73B7, + 0x73CA,0x73BB,0x73B2,0x73CD,0x73C0,0x73B3,0x751A,0x752D, + 0x754F,0x754C,0x754E,0x754B,0x75AB,0x75A4,0x75A5,0x75A2, + 0x75A3,0x7678,0x7686,0x7687,0x7688,0x76C8,0x76C6,0x76C3, + 0x76C5,0x7701,0x76F9,0x76F8,0x7709,0x770B,0x76FE,0x76FC, + 0x7707,0x77DC,0x7802,0x7814,0x780C,0x780D,0x7946,0x7949, + 0x7948,0x7947,0x79B9,0x79BA,0x79D1,0x79D2,0x79CB,0x7A7F, + 0x7A81,0x7AFF,0x7AFD,0x7C7D,0x7D02,0x7D05,0x7D00,0x7D09, + 0x7D07,0x7D04,0x7D06,0x7F38,0x7F8E,0x7FBF,0x8004,INVALC, + /* Block 174, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8010,0x800D,0x8011,0x8036,0x80D6,0x80E5,0x80DA,0x80C3, + 0x80C4,0x80CC,0x80E1,0x80DB,0x80CE,0x80DE,0x80E4,0x80DD, + 0x81F4,0x8222,0x82E7,0x8303,0x8305,0x82E3,0x82DB,0x82E6, + 0x8304,0x82E5,0x8302,0x8309,0x82D2,0x82D7,0x82F1,0x8301, + 0x82DC,0x82D4,0x82D1,0x82DE,0x82D3,0x82DF,0x82EF,0x8306, + 0x8650,0x8679,0x867B,0x867A,0x884D,0x886B,0x8981,0x89D4, + 0x8A08,0x8A02,0x8A03,0x8C9E,0x8CA0,0x8D74,0x8D73,0x8DB4, + 0x8ECD,0x8ECC,0x8FF0,0x8FE6,0x8FE2,0x8FEA,0x8FE5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8FED,0x8FEB,0x8FE4,0x8FE8,0x90CA,0x90CE,0x90C1, + 0x90C3,0x914B,0x914A,0x91CD,0x9582,0x9650,0x964B,0x964C, + 0x964D,0x9762,0x9769,0x97CB,0x97ED,0x97F3,0x9801,0x98A8, + 0x98DB,0x98DF,0x9996,0x9999,0x4E58,0x4EB3,0x500C,0x500D, + 0x5023,0x4FEF,0x5026,0x5025,0x4FF8,0x5029,0x5016,0x5006, + 0x503C,0x501F,0x501A,0x5012,0x5011,0x4FFA,0x5000,0x5014, + 0x5028,0x4FF1,0x5021,0x500B,0x5019,0x5018,0x4FF3,0x4FEE, + 0x502D,0x502A,0x4FFE,0x502B,0x5009,0x517C,0x51A4,0x51A5, + 0x51A2,0x51CD,0x51CC,0x51C6,0x51CB,0x5256,0x525C,0x5254, + 0x525B,0x525D,0x532A,0x537F,0x539F,0x539D,0x53DF,0x54E8, + 0x5510,0x5501,0x5537,0x54FC,0x54E5,0x54F2,0x5506,0x54FA, + 0x5514,0x54E9,0x54ED,0x54E1,0x5509,0x54EE,0x54EA,INVALC, + /* Block 175, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x54E6,0x5527,0x5507,0x54FD,0x550F,0x5703,0x5704,0x57C2, + 0x57D4,0x57CB,0x57C3,0x5809,0x590F,0x5957,0x5958,0x595A, + 0x5A11,0x5A18,0x5A1C,0x5A1F,0x5A1B,0x5A13,0x59EC,0x5A20, + 0x5A23,0x5A29,0x5A25,0x5A0C,0x5A09,0x5B6B,0x5C58,0x5BB0, + 0x5BB3,0x5BB6,0x5BB4,0x5BAE,0x5BB5,0x5BB9,0x5BB8,0x5C04, + 0x5C51,0x5C55,0x5C50,0x5CED,0x5CFD,0x5CFB,0x5CEA,0x5CE8, + 0x5CF0,0x5CF6,0x5D01,0x5CF4,0x5DEE,0x5E2D,0x5E2B,0x5EAB, + 0x5EAD,0x5EA7,0x5F31,0x5F92,0x5F91,0x5F90,0x6059,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6063,0x6065,0x6050,0x6055,0x606D,0x6069,0x606F, + 0x6084,0x609F,0x609A,0x608D,0x6094,0x608C,0x6085,0x6096, + 0x6247,0x62F3,0x6308,0x62FF,0x634E,0x633E,0x632F,0x6355, + 0x6342,0x6346,0x634F,0x6349,0x633A,0x6350,0x633D,0x632A, + 0x632B,0x6328,0x634D,0x634C,0x6548,0x6549,0x6599,0x65C1, + 0x65C5,0x6642,0x6649,0x664F,0x6643,0x6652,0x664C,0x6645, + 0x6641,0x66F8,0x6714,0x6715,0x6717,0x6821,0x6838,0x6848, + 0x6846,0x6853,0x6839,0x6842,0x6854,0x6829,0x68B3,0x6817, + 0x684C,0x6851,0x683D,0x67F4,0x6850,0x6840,0x683C,0x6843, + 0x682A,0x6845,0x6813,0x6818,0x6841,0x6B8A,0x6B89,0x6BB7, + 0x6C23,0x6C27,0x6C28,0x6C26,0x6C24,0x6CF0,0x6D6A,0x6D95, + 0x6D88,0x6D87,0x6D66,0x6D78,0x6D77,0x6D59,0x6D93,INVALC, + /* Block 176, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D6C,0x6D89,0x6D6E,0x6D5A,0x6D74,0x6D69,0x6D8C,0x6D8A, + 0x6D79,0x6D85,0x6D65,0x6D94,0x70CA,0x70D8,0x70E4,0x70D9, + 0x70C8,0x70CF,0x7239,0x7279,0x72FC,0x72F9,0x72FD,0x72F8, + 0x72F7,0x7386,0x73ED,0x7409,0x73EE,0x73E0,0x73EA,0x73DE, + 0x7554,0x755D,0x755C,0x755A,0x7559,0x75BE,0x75C5,0x75C7, + 0x75B2,0x75B3,0x75BD,0x75BC,0x75B9,0x75C2,0x75B8,0x768B, + 0x76B0,0x76CA,0x76CD,0x76CE,0x7729,0x771F,0x7720,0x7728, + 0x77E9,0x7830,0x7827,0x7838,0x781D,0x7834,0x7837,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7825,0x782D,0x7820,0x781F,0x7832,0x7955,0x7950, + 0x7960,0x795F,0x7956,0x795E,0x795D,0x7957,0x795A,0x79E4, + 0x79E3,0x79E7,0x79DF,0x79E6,0x79E9,0x79D8,0x7A84,0x7A88, + 0x7AD9,0x7B06,0x7B11,0x7C89,0x7D21,0x7D17,0x7D0B,0x7D0A, + 0x7D20,0x7D22,0x7D14,0x7D10,0x7D15,0x7D1A,0x7D1C,0x7D0D, + 0x7D19,0x7D1B,0x7F3A,0x7F5F,0x7F94,0x7FC5,0x7FC1,0x8006, + 0x8018,0x8015,0x8019,0x8017,0x803D,0x803F,0x80F1,0x8102, + 0x80F0,0x8105,0x80ED,0x80F4,0x8106,0x80F8,0x80F3,0x8108, + 0x80FD,0x810A,0x80FC,0x80EF,0x81ED,0x81EC,0x8200,0x8210, + 0x822A,0x822B,0x8228,0x822C,0x82BB,0x832B,0x8352,0x8354, + 0x834A,0x8338,0x8350,0x8349,0x8335,0x8334,0x834F,0x8332, + 0x8339,0x8336,0x8317,0x8340,0x8331,0x8328,0x8343,INVALC, + /* Block 177, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8654,0x868A,0x86AA,0x8693,0x86A4,0x86A9,0x868C,0x86A3, + 0x869C,0x8870,0x8877,0x8881,0x8882,0x887D,0x8879,0x8A18, + 0x8A10,0x8A0E,0x8A0C,0x8A15,0x8A0A,0x8A17,0x8A13,0x8A16, + 0x8A0F,0x8A11,0x8C48,0x8C7A,0x8C79,0x8CA1,0x8CA2,0x8D77, + 0x8EAC,0x8ED2,0x8ED4,0x8ECF,0x8FB1,0x9001,0x9006,0x8FF7, + 0x9000,0x8FFA,0x8FF4,0x9003,0x8FFD,0x9005,0x8FF8,0x9095, + 0x90E1,0x90DD,0x90E2,0x9152,0x914D,0x914C,0x91D8,0x91DD, + 0x91D7,0x91DC,0x91D9,0x9583,0x9662,0x9663,0x9661,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x965B,0x965D,0x9664,0x9658,0x965E,0x96BB,0x98E2, + 0x99AC,0x9AA8,0x9AD8,0x9B25,0x9B32,0x9B3C,0x4E7E,0x507A, + 0x507D,0x505C,0x5047,0x5043,0x504C,0x505A,0x5049,0x5065, + 0x5076,0x504E,0x5055,0x5075,0x5074,0x5077,0x504F,0x500F, + 0x506F,0x506D,0x515C,0x5195,0x51F0,0x526A,0x526F,0x52D2, + 0x52D9,0x52D8,0x52D5,0x5310,0x530F,0x5319,0x533F,0x5340, + 0x533E,0x53C3,0x66FC,0x5546,0x556A,0x5566,0x5544,0x555E, + 0x5561,0x5543,0x554A,0x5531,0x5556,0x554F,0x5555,0x552F, + 0x5564,0x5538,0x552E,0x555C,0x552C,0x5563,0x5533,0x5541, + 0x5557,0x5708,0x570B,0x5709,0x57DF,0x5805,0x580A,0x5806, + 0x57E0,0x57E4,0x57FA,0x5802,0x5835,0x57F7,0x57F9,0x5920, + 0x5962,0x5A36,0x5A41,0x5A49,0x5A66,0x5A6A,0x5A40,INVALC, + /* Block 178, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A3C,0x5A62,0x5A5A,0x5A46,0x5A4A,0x5B70,0x5BC7,0x5BC5, + 0x5BC4,0x5BC2,0x5BBF,0x5BC6,0x5C09,0x5C08,0x5C07,0x5C60, + 0x5C5C,0x5C5D,0x5D07,0x5D06,0x5D0E,0x5D1B,0x5D16,0x5D22, + 0x5D11,0x5D29,0x5D14,0x5D19,0x5D24,0x5D27,0x5D17,0x5DE2, + 0x5E38,0x5E36,0x5E33,0x5E37,0x5EB7,0x5EB8,0x5EB6,0x5EB5, + 0x5EBE,0x5F35,0x5F37,0x5F57,0x5F6C,0x5F69,0x5F6B,0x5F97, + 0x5F99,0x5F9E,0x5F98,0x5FA1,0x5FA0,0x5F9C,0x607F,0x60A3, + 0x6089,0x60A0,0x60A8,0x60CB,0x60B4,0x60E6,0x60BD,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x60C5,0x60BB,0x60B5,0x60DC,0x60BC,0x60D8,0x60D5, + 0x60C6,0x60DF,0x60B8,0x60DA,0x60C7,0x621A,0x621B,0x6248, + 0x63A0,0x63A7,0x6372,0x6396,0x63A2,0x63A5,0x6377,0x6367, + 0x6398,0x63AA,0x6371,0x63A9,0x6389,0x6383,0x639B,0x636B, + 0x63A8,0x6384,0x6388,0x6399,0x63A1,0x63AC,0x6392,0x638F, + 0x6380,0x637B,0x6369,0x6368,0x637A,0x655D,0x6556,0x6551, + 0x6559,0x6557,0x555F,0x654F,0x6558,0x6555,0x6554,0x659C, + 0x659B,0x65AC,0x65CF,0x65CB,0x65CC,0x65CE,0x665D,0x665A, + 0x6664,0x6668,0x6666,0x665E,0x66F9,0x52D7,0x671B,0x6881, + 0x68AF,0x68A2,0x6893,0x68B5,0x687F,0x6876,0x68B1,0x68A7, + 0x6897,0x68B0,0x6883,0x68C4,0x68AD,0x6886,0x6885,0x6894, + 0x689D,0x68A8,0x689F,0x68A1,0x6882,0x6B32,0x6BBA,INVALC, + /* Block 179, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6BEB,0x6BEC,0x6C2B,0x6D8E,0x6DBC,0x6DF3,0x6DD9,0x6DB2, + 0x6DE1,0x6DCC,0x6DE4,0x6DFB,0x6DFA,0x6E05,0x6DC7,0x6DCB, + 0x6DAF,0x6DD1,0x6DAE,0x6DDE,0x6DF9,0x6DB8,0x6DF7,0x6DF5, + 0x6DC5,0x6DD2,0x6E1A,0x6DB5,0x6DDA,0x6DEB,0x6DD8,0x6DEA, + 0x6DF1,0x6DEE,0x6DE8,0x6DC6,0x6DC4,0x6DAA,0x6DEC,0x6DBF, + 0x6DE6,0x70F9,0x7109,0x710A,0x70FD,0x70EF,0x723D,0x727D, + 0x7281,0x731C,0x731B,0x7316,0x7313,0x7319,0x7387,0x7405, + 0x740A,0x7403,0x7406,0x73FE,0x740D,0x74E0,0x74F6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x74F7,0x751C,0x7522,0x7565,0x7566,0x7562,0x7570, + 0x758F,0x75D4,0x75D5,0x75B5,0x75CA,0x75CD,0x768E,0x76D4, + 0x76D2,0x76DB,0x7737,0x773E,0x773C,0x7736,0x7738,0x773A, + 0x786B,0x7843,0x784E,0x7965,0x7968,0x796D,0x79FB,0x7A92, + 0x7A95,0x7B20,0x7B28,0x7B1B,0x7B2C,0x7B26,0x7B19,0x7B1E, + 0x7B2E,0x7C92,0x7C97,0x7C95,0x7D46,0x7D43,0x7D71,0x7D2E, + 0x7D39,0x7D3C,0x7D40,0x7D30,0x7D33,0x7D44,0x7D2F,0x7D42, + 0x7D32,0x7D31,0x7F3D,0x7F9E,0x7F9A,0x7FCC,0x7FCE,0x7FD2, + 0x801C,0x804A,0x8046,0x812F,0x8116,0x8123,0x812B,0x8129, + 0x8130,0x8124,0x8202,0x8235,0x8237,0x8236,0x8239,0x838E, + 0x839E,0x8398,0x8378,0x83A2,0x8396,0x83BD,0x83AB,0x8392, + 0x838A,0x8393,0x8389,0x83A0,0x8377,0x837B,0x837C,INVALC, + /* Block 180, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8386,0x83A7,0x8655,0x5F6A,0x86C7,0x86C0,0x86B6,0x86C4, + 0x86B5,0x86C6,0x86CB,0x86B1,0x86AF,0x86C9,0x8853,0x889E, + 0x8888,0x88AB,0x8892,0x8896,0x888D,0x888B,0x8993,0x898F, + 0x8A2A,0x8A1D,0x8A23,0x8A25,0x8A31,0x8A2D,0x8A1F,0x8A1B, + 0x8A22,0x8C49,0x8C5A,0x8CA9,0x8CAC,0x8CAB,0x8CA8,0x8CAA, + 0x8CA7,0x8D67,0x8D66,0x8DBE,0x8DBA,0x8EDB,0x8EDF,0x9019, + 0x900D,0x901A,0x9017,0x9023,0x901F,0x901D,0x9010,0x9015, + 0x901E,0x9020,0x900F,0x9022,0x9016,0x901B,0x9014,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x90E8,0x90ED,0x90FD,0x9157,0x91CE,0x91F5,0x91E6, + 0x91E3,0x91E7,0x91ED,0x91E9,0x9589,0x966A,0x9675,0x9673, + 0x9678,0x9670,0x9674,0x9676,0x9677,0x966C,0x96C0,0x96EA, + 0x96E9,0x7AE0,0x7ADF,0x9802,0x9803,0x9B5A,0x9CE5,0x9E75, + 0x9E7F,0x9EA5,0x9EBB,0x50A2,0x508D,0x5085,0x5099,0x5091, + 0x5080,0x5096,0x5098,0x509A,0x6700,0x51F1,0x5272,0x5274, + 0x5275,0x5269,0x52DE,0x52DD,0x52DB,0x535A,0x53A5,0x557B, + 0x5580,0x55A7,0x557C,0x558A,0x559D,0x5598,0x5582,0x559C, + 0x55AA,0x5594,0x5587,0x558B,0x5583,0x55B3,0x55AE,0x559F, + 0x553E,0x55B2,0x559A,0x55BB,0x55AC,0x55B1,0x557E,0x5589, + 0x55AB,0x5599,0x570D,0x582F,0x582A,0x5834,0x5824,0x5830, + 0x5831,0x5821,0x581D,0x5820,0x58F9,0x58FA,0x5960,INVALC, + /* Block 181, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A77,0x5A9A,0x5A7F,0x5A92,0x5A9B,0x5AA7,0x5B73,0x5B71, + 0x5BD2,0x5BCC,0x5BD3,0x5BD0,0x5C0A,0x5C0B,0x5C31,0x5D4C, + 0x5D50,0x5D34,0x5D47,0x5DFD,0x5E45,0x5E3D,0x5E40,0x5E43, + 0x5E7E,0x5ECA,0x5EC1,0x5EC2,0x5EC4,0x5F3C,0x5F6D,0x5FA9, + 0x5FAA,0x5FA8,0x60D1,0x60E1,0x60B2,0x60B6,0x60E0,0x611C, + 0x6123,0x60FA,0x6115,0x60F0,0x60FB,0x60F4,0x6168,0x60F1, + 0x610E,0x60F6,0x6109,0x6100,0x6112,0x621F,0x6249,0x63A3, + 0x638C,0x63CF,0x63C0,0x63E9,0x63C9,0x63C6,0x63CD,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x63D2,0x63E3,0x63D0,0x63E1,0x63D6,0x63ED,0x63EE, + 0x6376,0x63F4,0x63EA,0x63DB,0x6452,0x63DA,0x63F9,0x655E, + 0x6566,0x6562,0x6563,0x6591,0x6590,0x65AF,0x666E,0x6670, + 0x6674,0x6676,0x666F,0x6691,0x667A,0x667E,0x6677,0x66FE, + 0x66FF,0x671F,0x671D,0x68FA,0x68D5,0x68E0,0x68D8,0x68D7, + 0x6905,0x68DF,0x68F5,0x68EE,0x68E7,0x68F9,0x68D2,0x68F2, + 0x68E3,0x68CB,0x68CD,0x690D,0x6912,0x690E,0x68C9,0x68DA, + 0x696E,0x68FB,0x6B3E,0x6B3A,0x6B3D,0x6B98,0x6B96,0x6BBC, + 0x6BEF,0x6C2E,0x6C2F,0x6C2C,0x6E2F,0x6E38,0x6E54,0x6E21, + 0x6E32,0x6E67,0x6E4A,0x6E20,0x6E25,0x6E23,0x6E1B,0x6E5B, + 0x6E58,0x6E24,0x6E56,0x6E6E,0x6E2D,0x6E26,0x6E6F,0x6E34, + 0x6E4D,0x6E3A,0x6E2C,0x6E43,0x6E1D,0x6E3E,0x6ECB,INVALC, + /* Block 182, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E89,0x6E19,0x6E4E,0x6E63,0x6E44,0x6E72,0x6E69,0x6E5F, + 0x7119,0x711A,0x7126,0x7130,0x7121,0x7136,0x716E,0x711C, + 0x724C,0x7284,0x7280,0x7336,0x7325,0x7334,0x7329,0x743A, + 0x742A,0x7433,0x7422,0x7425,0x7435,0x7436,0x7434,0x742F, + 0x741B,0x7426,0x7428,0x7525,0x7526,0x756B,0x756A,0x75E2, + 0x75DB,0x75E3,0x75D9,0x75D8,0x75DE,0x75E0,0x767B,0x767C, + 0x7696,0x7693,0x76B4,0x76DC,0x774F,0x77ED,0x785D,0x786C, + 0x786F,0x7A0D,0x7A08,0x7A0B,0x7A05,0x7A00,0x7A98,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A97,0x7A96,0x7AE5,0x7AE3,0x7B49,0x7B56,0x7B46, + 0x7B50,0x7B52,0x7B54,0x7B4D,0x7B4B,0x7B4F,0x7B51,0x7C9F, + 0x7CA5,0x7D5E,0x7D50,0x7D68,0x7D55,0x7D2B,0x7D6E,0x7D72, + 0x7D61,0x7D66,0x7D62,0x7D70,0x7D73,0x5584,0x7FD4,0x7FD5, + 0x800B,0x8052,0x8085,0x8155,0x8154,0x814B,0x8151,0x814E, + 0x8139,0x8146,0x813E,0x814C,0x8153,0x8174,0x8212,0x821C, + 0x83E9,0x8403,0x83F8,0x840D,0x83E0,0x83C5,0x840B,0x83C1, + 0x83EF,0x83F1,0x83F4,0x8457,0x840A,0x83F0,0x840C,0x83CC, + 0x83FD,0x83F2,0x83CA,0x8438,0x840E,0x8404,0x83DC,0x8407, + 0x83D4,0x83DF,0x865B,0x86DF,0x86D9,0x86ED,0x86D4,0x86DB, + 0x86E4,0x86D0,0x86DE,0x8857,0x88C1,0x88C2,0x88B1,0x8983, + 0x8996,0x8A3B,0x8A60,0x8A55,0x8A5E,0x8A3C,0x8A41,INVALC, + /* Block 183, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8A54,0x8A5B,0x8A50,0x8A46,0x8A34,0x8A3A,0x8A36,0x8A56, + 0x8C61,0x8C82,0x8CAF,0x8CBC,0x8CB3,0x8CBD,0x8CC1,0x8CBB, + 0x8CC0,0x8CB4,0x8CB7,0x8CB6,0x8CBF,0x8CB8,0x8D8A,0x8D85, + 0x8D81,0x8DCE,0x8DDD,0x8DCB,0x8DDA,0x8DD1,0x8DCC,0x8DDB, + 0x8DC6,0x8EFB,0x8EF8,0x8EFC,0x8F9C,0x902E,0x9035,0x9031, + 0x9038,0x9032,0x9036,0x9102,0x90F5,0x9109,0x90FE,0x9163, + 0x9165,0x91CF,0x9214,0x9215,0x9223,0x9209,0x921E,0x920D, + 0x9210,0x9207,0x9211,0x9594,0x958F,0x958B,0x9591,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9593,0x9592,0x958E,0x968A,0x968E,0x968B,0x967D, + 0x9685,0x9686,0x968D,0x9672,0x9684,0x96C1,0x96C5,0x96C4, + 0x96C6,0x96C7,0x96EF,0x96F2,0x97CC,0x9805,0x9806,0x9808, + 0x98E7,0x98EA,0x98EF,0x98E9,0x98F2,0x98ED,0x99AE,0x99AD, + 0x9EC3,0x9ECD,0x9ED1,0x4E82,0x50AD,0x50B5,0x50B2,0x50B3, + 0x50C5,0x50BE,0x50AC,0x50B7,0x50BB,0x50AF,0x50C7,0x527F, + 0x5277,0x527D,0x52DF,0x52E6,0x52E4,0x52E2,0x52E3,0x532F, + 0x55DF,0x55E8,0x55D3,0x55E6,0x55CE,0x55DC,0x55C7,0x55D1, + 0x55E3,0x55E4,0x55EF,0x55DA,0x55E1,0x55C5,0x55C6,0x55E5, + 0x55C9,0x5712,0x5713,0x585E,0x5851,0x5858,0x5857,0x585A, + 0x5854,0x586B,0x584C,0x586D,0x584A,0x5862,0x5852,0x584B, + 0x5967,0x5AC1,0x5AC9,0x5ACC,0x5ABE,0x5ABD,0x5ABC,INVALC, + /* Block 184, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5AB3,0x5AC2,0x5AB2,0x5D69,0x5D6F,0x5E4C,0x5E79,0x5EC9, + 0x5EC8,0x5F12,0x5F59,0x5FAC,0x5FAE,0x611A,0x610F,0x6148, + 0x611F,0x60F3,0x611B,0x60F9,0x6101,0x6108,0x614E,0x614C, + 0x6144,0x614D,0x613E,0x6134,0x6127,0x610D,0x6106,0x6137, + 0x6221,0x6222,0x6413,0x643E,0x641E,0x642A,0x642D,0x643D, + 0x642C,0x640F,0x641C,0x6414,0x640D,0x6436,0x6416,0x6417, + 0x6406,0x656C,0x659F,0x65B0,0x6697,0x6689,0x6687,0x6688, + 0x6696,0x6684,0x6698,0x668D,0x6703,0x6994,0x696D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x695A,0x6977,0x6960,0x6954,0x6975,0x6930,0x6982, + 0x694A,0x6968,0x696B,0x695E,0x6953,0x6979,0x6986,0x695D, + 0x6963,0x695B,0x6B47,0x6B72,0x6BC0,0x6BBF,0x6BD3,0x6BFD, + 0x6EA2,0x6EAF,0x6ED3,0x6EB6,0x6EC2,0x6E90,0x6E9D,0x6EC7, + 0x6EC5,0x6EA5,0x6E98,0x6EBC,0x6EBA,0x6EAB,0x6ED1,0x6E96, + 0x6E9C,0x6EC4,0x6ED4,0x6EAA,0x6EA7,0x6EB4,0x714E,0x7159, + 0x7169,0x7164,0x7149,0x7167,0x715C,0x716C,0x7166,0x714C, + 0x7165,0x715E,0x7146,0x7168,0x7156,0x723A,0x7252,0x7337, + 0x7345,0x733F,0x733E,0x746F,0x745A,0x7455,0x745F,0x745E, + 0x7441,0x743F,0x7459,0x745B,0x745C,0x7576,0x7578,0x7600, + 0x75F0,0x7601,0x75F2,0x75F1,0x75FA,0x75FF,0x75F4,0x75F3, + 0x76DE,0x76DF,0x775B,0x776B,0x7766,0x775E,0x7763,INVALC, + /* Block 185, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7779,0x776A,0x776C,0x775C,0x7765,0x7768,0x7762,0x77EE, + 0x788E,0x78B0,0x7897,0x7898,0x788C,0x7889,0x787C,0x7891, + 0x7893,0x787F,0x797A,0x797F,0x7981,0x842C,0x79BD,0x7A1C, + 0x7A1A,0x7A20,0x7A14,0x7A1F,0x7A1E,0x7A9F,0x7AA0,0x7B77, + 0x7BC0,0x7B60,0x7B6E,0x7B67,0x7CB1,0x7CB3,0x7CB5,0x7D93, + 0x7D79,0x7D91,0x7D81,0x7D8F,0x7D5B,0x7F6E,0x7F69,0x7F6A, + 0x7F72,0x7FA9,0x7FA8,0x7FA4,0x8056,0x8058,0x8086,0x8084, + 0x8171,0x8170,0x8178,0x8165,0x816E,0x8173,0x816B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8179,0x817A,0x8166,0x8205,0x8247,0x8482,0x8477, + 0x843D,0x8431,0x8475,0x8466,0x846B,0x8449,0x846C,0x845B, + 0x843C,0x8435,0x8461,0x8463,0x8469,0x846D,0x8446,0x865E, + 0x865C,0x865F,0x86F9,0x8713,0x8708,0x8707,0x8700,0x86FE, + 0x86FB,0x8702,0x8703,0x8706,0x870A,0x8859,0x88DF,0x88D4, + 0x88D9,0x88DC,0x88D8,0x88DD,0x88E1,0x88CA,0x88D5,0x88D2, + 0x899C,0x89E3,0x8A6B,0x8A72,0x8A73,0x8A66,0x8A69,0x8A70, + 0x8A87,0x8A7C,0x8A63,0x8AA0,0x8A71,0x8A85,0x8A6D,0x8A62, + 0x8A6E,0x8A6C,0x8A79,0x8A7B,0x8A3E,0x8A68,0x8C62,0x8C8A, + 0x8C89,0x8CCA,0x8CC7,0x8CC8,0x8CC4,0x8CB2,0x8CC3,0x8CC2, + 0x8CC5,0x8DE1,0x8DDF,0x8DE8,0x8DEF,0x8DF3,0x8DFA,0x8DEA, + 0x8DE4,0x8DE6,0x8EB2,0x8F03,0x8F09,0x8EFE,0x8F0A,INVALC, + /* Block 186, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8F9F,0x8FB2,0x904B,0x904A,0x9053,0x9042,0x9054,0x903C, + 0x9055,0x9050,0x9047,0x904F,0x904E,0x904D,0x9051,0x903E, + 0x9041,0x9112,0x9117,0x916C,0x916A,0x9169,0x91C9,0x9237, + 0x9257,0x9238,0x923D,0x9240,0x923E,0x925B,0x924B,0x9264, + 0x9251,0x9234,0x9249,0x924D,0x9245,0x9239,0x923F,0x925A, + 0x9598,0x9698,0x9694,0x9695,0x96CD,0x96CB,0x96C9,0x96CA, + 0x96F7,0x96FB,0x96F9,0x96F6,0x9756,0x9774,0x9776,0x9810, + 0x9811,0x9813,0x980A,0x9812,0x980C,0x98FC,0x98F4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x98FD,0x98FE,0x99B3,0x99B1,0x99B4,0x9AE1,0x9CE9, + 0x9E82,0x9F0E,0x9F13,0x9F20,0x50E7,0x50EE,0x50E5,0x50D6, + 0x50ED,0x50DA,0x50D5,0x50CF,0x50D1,0x50F1,0x50CE,0x50E9, + 0x5162,0x51F3,0x5283,0x5282,0x5331,0x53AD,0x55FE,0x5600, + 0x561B,0x5617,0x55FD,0x5614,0x5606,0x5609,0x560D,0x560E, + 0x55F7,0x5616,0x561F,0x5608,0x5610,0x55F6,0x5718,0x5716, + 0x5875,0x587E,0x5883,0x5893,0x588A,0x5879,0x5885,0x587D, + 0x58FD,0x5925,0x5922,0x5924,0x596A,0x5969,0x5AE1,0x5AE6, + 0x5AE9,0x5AD7,0x5AD6,0x5AD8,0x5AE3,0x5B75,0x5BDE,0x5BE7, + 0x5BE1,0x5BE5,0x5BE6,0x5BE8,0x5BE2,0x5BE4,0x5BDF,0x5C0D, + 0x5C62,0x5D84,0x5D87,0x5E5B,0x5E63,0x5E55,0x5E57,0x5E54, + 0x5ED3,0x5ED6,0x5F0A,0x5F46,0x5F70,0x5FB9,0x6147,INVALC, + /* Block 187, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x613F,0x614B,0x6177,0x6162,0x6163,0x615F,0x615A,0x6158, + 0x6175,0x622A,0x6487,0x6458,0x6454,0x64A4,0x6478,0x645F, + 0x647A,0x6451,0x6467,0x6434,0x646D,0x647B,0x6572,0x65A1, + 0x65D7,0x65D6,0x66A2,0x66A8,0x669D,0x699C,0x69A8,0x6995, + 0x69C1,0x69AE,0x69D3,0x69CB,0x699B,0x69B7,0x69BB,0x69AB, + 0x69B4,0x69D0,0x69CD,0x69AD,0x69CC,0x69A6,0x69C3,0x69A3, + 0x6B49,0x6B4C,0x6C33,0x6F33,0x6F14,0x6EFE,0x6F13,0x6EF4, + 0x6F29,0x6F3E,0x6F20,0x6F2C,0x6F0F,0x6F02,0x6F22,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6EFF,0x6EEF,0x6F06,0x6F31,0x6F38,0x6F32,0x6F23, + 0x6F15,0x6F2B,0x6F2F,0x6F88,0x6F2A,0x6EEC,0x6F01,0x6EF2, + 0x6ECC,0x6EF7,0x7194,0x7199,0x717D,0x718A,0x7184,0x7192, + 0x723E,0x7292,0x7296,0x7344,0x7350,0x7464,0x7463,0x746A, + 0x7470,0x746D,0x7504,0x7591,0x7627,0x760D,0x760B,0x7609, + 0x7613,0x76E1,0x76E3,0x7784,0x777D,0x777F,0x7761,0x78C1, + 0x789F,0x78A7,0x78B3,0x78A9,0x78A3,0x798E,0x798F,0x798D, + 0x7A2E,0x7A31,0x7AAA,0x7AA9,0x7AED,0x7AEF,0x7BA1,0x7B95, + 0x7B8B,0x7B75,0x7B97,0x7B9D,0x7B94,0x7B8F,0x7BB8,0x7B87, + 0x7B84,0x7CB9,0x7CBD,0x7CBE,0x7DBB,0x7DB0,0x7D9C,0x7DBD, + 0x7DBE,0x7DA0,0x7DCA,0x7DB4,0x7DB2,0x7DB1,0x7DBA,0x7DA2, + 0x7DBF,0x7DB5,0x7DB8,0x7DAD,0x7DD2,0x7DC7,0x7DAC,INVALC, + /* Block 188, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7F70,0x7FE0,0x7FE1,0x7FDF,0x805E,0x805A,0x8087,0x8150, + 0x8180,0x818F,0x8188,0x818A,0x817F,0x8182,0x81E7,0x81FA, + 0x8207,0x8214,0x821E,0x824B,0x84C9,0x84BF,0x84C6,0x84C4, + 0x8499,0x849E,0x84B2,0x849C,0x84CB,0x84B8,0x84C0,0x84D3, + 0x8490,0x84BC,0x84D1,0x84CA,0x873F,0x871C,0x873B,0x8722, + 0x8725,0x8734,0x8718,0x8755,0x8737,0x8729,0x88F3,0x8902, + 0x88F4,0x88F9,0x88F8,0x88FD,0x88E8,0x891A,0x88EF,0x8AA6, + 0x8A8C,0x8A9E,0x8AA3,0x8A8D,0x8AA1,0x8A93,0x8AA4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8AAA,0x8AA5,0x8AA8,0x8A98,0x8A91,0x8A9A,0x8AA7, + 0x8C6A,0x8C8D,0x8C8C,0x8CD3,0x8CD1,0x8CD2,0x8D6B,0x8D99, + 0x8D95,0x8DFC,0x8F14,0x8F12,0x8F15,0x8F13,0x8FA3,0x9060, + 0x9058,0x905C,0x9063,0x9059,0x905E,0x9062,0x905D,0x905B, + 0x9119,0x9118,0x911E,0x9175,0x9178,0x9177,0x9174,0x9278, + 0x9280,0x9285,0x9298,0x9296,0x927B,0x9293,0x929C,0x92A8, + 0x927C,0x9291,0x95A1,0x95A8,0x95A9,0x95A3,0x95A5,0x95A4, + 0x9699,0x969C,0x969B,0x96CC,0x96D2,0x9700,0x977C,0x9785, + 0x97F6,0x9817,0x9818,0x98AF,0x98B1,0x9903,0x9905,0x990C, + 0x9909,0x99C1,0x9AAF,0x9AB0,0x9AE6,0x9B41,0x9B42,0x9CF4, + 0x9CF6,0x9CF3,0x9EBC,0x9F3B,0x9F4A,0x5104,0x5100,0x50FB, + 0x50F5,0x50F9,0x5102,0x5108,0x5109,0x5105,0x51DC,INVALC, + /* Block 189, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5287,0x5288,0x5289,0x528D,0x528A,0x52F0,0x53B2,0x562E, + 0x563B,0x5639,0x5632,0x563F,0x5634,0x5629,0x5653,0x564E, + 0x5657,0x5674,0x5636,0x562F,0x5630,0x5880,0x589F,0x589E, + 0x58B3,0x589C,0x58AE,0x58A9,0x58A6,0x596D,0x5B09,0x5AFB, + 0x5B0B,0x5AF5,0x5B0C,0x5B08,0x5BEE,0x5BEC,0x5BE9,0x5BEB, + 0x5C64,0x5C65,0x5D9D,0x5D94,0x5E62,0x5E5F,0x5E61,0x5EE2, + 0x5EDA,0x5EDF,0x5EDD,0x5EE3,0x5EE0,0x5F48,0x5F71,0x5FB7, + 0x5FB5,0x6176,0x6167,0x616E,0x615D,0x6155,0x6182,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x617C,0x6170,0x616B,0x617E,0x61A7,0x6190,0x61AB, + 0x618E,0x61AC,0x619A,0x61A4,0x6194,0x61AE,0x622E,0x6469, + 0x646F,0x6479,0x649E,0x64B2,0x6488,0x6490,0x64B0,0x64A5, + 0x6493,0x6495,0x64A9,0x6492,0x64AE,0x64AD,0x64AB,0x649A, + 0x64AC,0x6499,0x64A2,0x64B3,0x6575,0x6577,0x6578,0x66AE, + 0x66AB,0x66B4,0x66B1,0x6A23,0x6A1F,0x69E8,0x6A01,0x6A1E, + 0x6A19,0x69FD,0x6A21,0x6A13,0x6A0A,0x69F3,0x6A02,0x6A05, + 0x69ED,0x6A11,0x6B50,0x6B4E,0x6BA4,0x6BC5,0x6BC6,0x6F3F, + 0x6F7C,0x6F84,0x6F51,0x6F66,0x6F54,0x6F86,0x6F6D,0x6F5B, + 0x6F78,0x6F6E,0x6F8E,0x6F7A,0x6F70,0x6F64,0x6F97,0x6F58, + 0x6ED5,0x6F6F,0x6F60,0x6F5F,0x719F,0x71AC,0x71B1,0x71A8, + 0x7256,0x729B,0x734E,0x7357,0x7469,0x748B,0x7483,INVALC, + /* Block 190, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x747E,0x7480,0x757F,0x7620,0x7629,0x761F,0x7624,0x7626, + 0x7621,0x7622,0x769A,0x76BA,0x76E4,0x778E,0x7787,0x778C, + 0x7791,0x778B,0x78CB,0x78C5,0x78BA,0x78CA,0x78BE,0x78D5, + 0x78BC,0x78D0,0x7A3F,0x7A3C,0x7A40,0x7A3D,0x7A37,0x7A3B, + 0x7AAF,0x7AAE,0x7BAD,0x7BB1,0x7BC4,0x7BB4,0x7BC6,0x7BC7, + 0x7BC1,0x7BA0,0x7BCC,0x7CCA,0x7DE0,0x7DF4,0x7DEF,0x7DFB, + 0x7DD8,0x7DEC,0x7DDD,0x7DE8,0x7DE3,0x7DDA,0x7DDE,0x7DE9, + 0x7D9E,0x7DD9,0x7DF2,0x7DF9,0x7F75,0x7F77,0x7FAF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7FE9,0x8026,0x819B,0x819C,0x819D,0x81A0,0x819A, + 0x8198,0x8517,0x853D,0x851A,0x84EE,0x852C,0x852D,0x8513, + 0x8511,0x8523,0x8521,0x8514,0x84EC,0x8525,0x84FF,0x8506, + 0x8782,0x8774,0x8776,0x8760,0x8766,0x8778,0x8768,0x8759, + 0x8757,0x874C,0x8753,0x885B,0x885D,0x8910,0x8907,0x8912, + 0x8913,0x8915,0x890A,0x8ABC,0x8AD2,0x8AC7,0x8AC4,0x8A95, + 0x8ACB,0x8AF8,0x8AB2,0x8AC9,0x8AC2,0x8ABF,0x8AB0,0x8AD6, + 0x8ACD,0x8AB6,0x8AB9,0x8ADB,0x8C4C,0x8C4E,0x8C6C,0x8CE0, + 0x8CDE,0x8CE6,0x8CE4,0x8CEC,0x8CED,0x8CE2,0x8CE3,0x8CDC, + 0x8CEA,0x8CE1,0x8D6D,0x8D9F,0x8DA3,0x8E2B,0x8E10,0x8E1D, + 0x8E22,0x8E0F,0x8E29,0x8E1F,0x8E21,0x8E1E,0x8EBA,0x8F1D, + 0x8F1B,0x8F1F,0x8F29,0x8F26,0x8F2A,0x8F1C,0x8F1E,INVALC, + /* Block 191, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8F25,0x9069,0x906E,0x9068,0x906D,0x9077,0x9130,0x912D, + 0x9127,0x9131,0x9187,0x9189,0x918B,0x9183,0x92C5,0x92BB, + 0x92B7,0x92EA,0x92AC,0x92E4,0x92C1,0x92B3,0x92BC,0x92D2, + 0x92C7,0x92F0,0x92B2,0x95AD,0x95B1,0x9704,0x9706,0x9707, + 0x9709,0x9760,0x978D,0x978B,0x978F,0x9821,0x982B,0x981C, + 0x98B3,0x990A,0x9913,0x9912,0x9918,0x99DD,0x99D0,0x99DF, + 0x99DB,0x99D1,0x99D5,0x99D2,0x99D9,0x9AB7,0x9AEE,0x9AEF, + 0x9B27,0x9B45,0x9B44,0x9B77,0x9B6F,0x9D06,0x9D09,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9D03,0x9EA9,0x9EBE,0x9ECE,0x58A8,0x9F52,0x5112, + 0x5118,0x5114,0x5110,0x5115,0x5180,0x51AA,0x51DD,0x5291, + 0x5293,0x52F3,0x5659,0x566B,0x5679,0x5669,0x5664,0x5678, + 0x566A,0x5668,0x5665,0x5671,0x566F,0x566C,0x5662,0x5676, + 0x58C1,0x58BE,0x58C7,0x58C5,0x596E,0x5B1D,0x5B34,0x5B78, + 0x5BF0,0x5C0E,0x5F4A,0x61B2,0x6191,0x61A9,0x618A,0x61CD, + 0x61B6,0x61BE,0x61CA,0x61C8,0x6230,0x64C5,0x64C1,0x64CB, + 0x64BB,0x64BC,0x64DA,0x64C4,0x64C7,0x64C2,0x64CD,0x64BF, + 0x64D2,0x64D4,0x64BE,0x6574,0x66C6,0x66C9,0x66B9,0x66C4, + 0x66C7,0x66B8,0x6A3D,0x6A38,0x6A3A,0x6A59,0x6A6B,0x6A58, + 0x6A39,0x6A44,0x6A62,0x6A61,0x6A4B,0x6A47,0x6A35,0x6A5F, + 0x6A48,0x6B59,0x6B77,0x6C05,0x6FC2,0x6FB1,0x6FA1,INVALC, + /* Block 192, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6FC3,0x6FA4,0x6FC1,0x6FA7,0x6FB3,0x6FC0,0x6FB9,0x6FB6, + 0x6FA6,0x6FA0,0x6FB4,0x71BE,0x71C9,0x71D0,0x71D2,0x71C8, + 0x71D5,0x71B9,0x71CE,0x71D9,0x71DC,0x71C3,0x71C4,0x7368, + 0x749C,0x74A3,0x7498,0x749F,0x749E,0x74E2,0x750C,0x750D, + 0x7634,0x7638,0x763A,0x76E7,0x76E5,0x77A0,0x779E,0x779F, + 0x77A5,0x78E8,0x78DA,0x78EC,0x78E7,0x79A6,0x7A4D,0x7A4E, + 0x7A46,0x7A4C,0x7A4B,0x7ABA,0x7BD9,0x7C11,0x7BC9,0x7BE4, + 0x7BDB,0x7BE1,0x7BE9,0x7BE6,0x7CD5,0x7CD6,0x7E0A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7E11,0x7E08,0x7E1B,0x7E23,0x7E1E,0x7E1D,0x7E09, + 0x7E10,0x7F79,0x7FB2,0x7FF0,0x7FF1,0x7FEE,0x8028,0x81B3, + 0x81A9,0x81A8,0x81FB,0x8208,0x8258,0x8259,0x854A,0x8559, + 0x8548,0x8568,0x8569,0x8543,0x8549,0x856D,0x856A,0x855E, + 0x8783,0x879F,0x879E,0x87A2,0x878D,0x8861,0x892A,0x8932, + 0x8925,0x892B,0x8921,0x89AA,0x89A6,0x8AE6,0x8AFA,0x8AEB, + 0x8AF1,0x8B00,0x8ADC,0x8AE7,0x8AEE,0x8AFE,0x8B01,0x8B02, + 0x8AF7,0x8AED,0x8AF3,0x8AF6,0x8AFC,0x8C6B,0x8C6D,0x8C93, + 0x8CF4,0x8E44,0x8E31,0x8E34,0x8E42,0x8E39,0x8E35,0x8F3B, + 0x8F2F,0x8F38,0x8F33,0x8FA8,0x8FA6,0x9075,0x9074,0x9078, + 0x9072,0x907C,0x907A,0x9134,0x9192,0x9320,0x9336,0x92F8, + 0x9333,0x932F,0x9322,0x92FC,0x932B,0x9304,0x931A,INVALC, + /* Block 193, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x9310,0x9326,0x9321,0x9315,0x932E,0x9319,0x95BB,0x96A7, + 0x96A8,0x96AA,0x96D5,0x970E,0x9711,0x9716,0x970D,0x9713, + 0x970F,0x975B,0x975C,0x9766,0x9798,0x9830,0x9838,0x983B, + 0x9837,0x982D,0x9839,0x9824,0x9910,0x9928,0x991E,0x991B, + 0x9921,0x991A,0x99ED,0x99E2,0x99F1,0x9AB8,0x9ABC,0x9AFB, + 0x9AED,0x9B28,0x9B91,0x9D15,0x9D23,0x9D26,0x9D28,0x9D12, + 0x9D1B,0x9ED8,0x9ED4,0x9F8D,0x9F9C,0x512A,0x511F,0x5121, + 0x5132,0x52F5,0x568E,0x5680,0x5690,0x5685,0x5687,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x568F,0x58D5,0x58D3,0x58D1,0x58CE,0x5B30,0x5B2A, + 0x5B24,0x5B7A,0x5C37,0x5C68,0x5DBC,0x5DBA,0x5DBD,0x5DB8, + 0x5E6B,0x5F4C,0x5FBD,0x61C9,0x61C2,0x61C7,0x61E6,0x61CB, + 0x6232,0x6234,0x64CE,0x64CA,0x64D8,0x64E0,0x64F0,0x64E6, + 0x64EC,0x64F1,0x64E2,0x64ED,0x6582,0x6583,0x66D9,0x66D6, + 0x6A80,0x6A94,0x6A84,0x6AA2,0x6A9C,0x6ADB,0x6AA3,0x6A7E, + 0x6A97,0x6A90,0x6AA0,0x6B5C,0x6BAE,0x6BDA,0x6C08,0x6FD8, + 0x6FF1,0x6FDF,0x6FE0,0x6FDB,0x6FE4,0x6FEB,0x6FEF,0x6F80, + 0x6FEC,0x6FE1,0x6FE9,0x6FD5,0x6FEE,0x6FF0,0x71E7,0x71DF, + 0x71EE,0x71E6,0x71E5,0x71ED,0x71EC,0x71F4,0x71E0,0x7235, + 0x7246,0x7370,0x7372,0x74A9,0x74B0,0x74A6,0x74A8,0x7646, + 0x7642,0x764C,0x76EA,0x77B3,0x77AA,0x77B0,0x77AC,INVALC, + /* Block 194, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x77A7,0x77AD,0x77EF,0x78F7,0x78FA,0x78F4,0x78EF,0x7901, + 0x79A7,0x79AA,0x7A57,0x7ABF,0x7C07,0x7C0D,0x7BFE,0x7BF7, + 0x7C0C,0x7BE0,0x7CE0,0x7CDC,0x7CDE,0x7CE2,0x7CDF,0x7CD9, + 0x7CDD,0x7E2E,0x7E3E,0x7E46,0x7E37,0x7E32,0x7E43,0x7E2B, + 0x7E3D,0x7E31,0x7E45,0x7E41,0x7E34,0x7E39,0x7E48,0x7E35, + 0x7E3F,0x7E2F,0x7F44,0x7FF3,0x7FFC,0x8071,0x8072,0x8070, + 0x806F,0x8073,0x81C6,0x81C3,0x81BA,0x81C2,0x81C0,0x81BF, + 0x81BD,0x81C9,0x81BE,0x81E8,0x8209,0x8271,0x85AA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8584,0x857E,0x859C,0x8591,0x8594,0x85AF,0x859B, + 0x8587,0x85A8,0x858A,0x8667,0x87C0,0x87D1,0x87B3,0x87D2, + 0x87C6,0x87AB,0x87BB,0x87BA,0x87C8,0x87CB,0x893B,0x8936, + 0x8944,0x8938,0x893D,0x89AC,0x8B0E,0x8B17,0x8B19,0x8B1B, + 0x8B0A,0x8B20,0x8B1D,0x8B04,0x8B10,0x8C41,0x8C3F,0x8C73, + 0x8CFA,0x8CFD,0x8CFC,0x8CF8,0x8CFB,0x8DA8,0x8E49,0x8E4B, + 0x8E48,0x8E4A,0x8F44,0x8F3E,0x8F42,0x8F45,0x8F3F,0x907F, + 0x907D,0x9084,0x9081,0x9082,0x9080,0x9139,0x91A3,0x919E, + 0x919C,0x934D,0x9382,0x9328,0x9375,0x934A,0x9365,0x934B, + 0x9318,0x937E,0x936C,0x935B,0x9370,0x935A,0x9354,0x95CA, + 0x95CB,0x95CC,0x95C8,0x95C6,0x96B1,0x96B8,0x96D6,0x971C, + 0x971E,0x97A0,0x97D3,0x9846,0x98B6,0x9935,0x9A01,INVALC, + /* Block 195, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x99FF,0x9BAE,0x9BAB,0x9BAA,0x9BAD,0x9D3B,0x9D3F,0x9E8B, + 0x9ECF,0x9EDE,0x9EDC,0x9EDD,0x9EDB,0x9F3E,0x9F4B,0x53E2, + 0x5695,0x56AE,0x58D9,0x58D8,0x5B38,0x5F5D,0x61E3,0x6233, + 0x64F4,0x64F2,0x64FE,0x6506,0x64FA,0x64FB,0x64F7,0x65B7, + 0x66DC,0x6726,0x6AB3,0x6AAC,0x6AC3,0x6ABB,0x6AB8,0x6AC2, + 0x6AAE,0x6AAF,0x6B5F,0x6B78,0x6BAF,0x7009,0x700B,0x6FFE, + 0x7006,0x6FFA,0x7011,0x700F,0x71FB,0x71FC,0x71FE,0x71F8, + 0x7377,0x7375,0x74A7,0x74BF,0x7515,0x7656,0x7658,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7652,0x77BD,0x77BF,0x77BB,0x77BC,0x790E,0x79AE, + 0x7A61,0x7A62,0x7A60,0x7AC4,0x7AC5,0x7C2B,0x7C27,0x7C2A, + 0x7C1E,0x7C23,0x7C21,0x7CE7,0x7E54,0x7E55,0x7E5E,0x7E5A, + 0x7E61,0x7E52,0x7E59,0x7F48,0x7FF9,0x7FFB,0x8077,0x8076, + 0x81CD,0x81CF,0x820A,0x85CF,0x85A9,0x85CD,0x85D0,0x85C9, + 0x85B0,0x85BA,0x85B9,0x85A6,0x87EF,0x87EC,0x87F2,0x87E0, + 0x8986,0x89B2,0x89F4,0x8B28,0x8B39,0x8B2C,0x8B2B,0x8C50, + 0x8D05,0x8E59,0x8E63,0x8E66,0x8E64,0x8E5F,0x8E55,0x8EC0, + 0x8F49,0x8F4D,0x9087,0x9083,0x9088,0x91AB,0x91AC,0x91D0, + 0x9394,0x938A,0x9396,0x93A2,0x93B3,0x93AE,0x93AC,0x93B0, + 0x9398,0x939A,0x9397,0x95D4,0x95D6,0x95D0,0x95D5,0x96E2, + 0x96DC,0x96D9,0x96DB,0x96DE,0x9724,0x97A3,0x97A6,INVALC, + /* Block 196, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x97AD,0x97F9,0x984D,0x984F,0x984C,0x984E,0x9853,0x98BA, + 0x993E,0x993F,0x993D,0x992E,0x99A5,0x9A0E,0x9AC1,0x9B03, + 0x9B06,0x9B4F,0x9B4E,0x9B4D,0x9BCA,0x9BC9,0x9BFD,0x9BC8, + 0x9BC0,0x9D51,0x9D5D,0x9D60,0x9EE0,0x9F15,0x9F2C,0x5133, + 0x56A5,0x58DE,0x58DF,0x58E2,0x5BF5,0x9F90,0x5EEC,0x61F2, + 0x61F7,0x61F6,0x61F5,0x6500,0x650F,0x66E0,0x66DD,0x6AE5, + 0x6ADD,0x6ADA,0x6AD3,0x701B,0x701F,0x7028,0x701A,0x701D, + 0x7015,0x7018,0x7206,0x720D,0x7258,0x72A2,0x7378,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x737A,0x74BD,0x74CA,0x74E3,0x7587,0x7586,0x765F, + 0x7661,0x77C7,0x7919,0x79B1,0x7A6B,0x7A69,0x7C3E,0x7C3F, + 0x7C38,0x7C3D,0x7C37,0x7C40,0x7E6B,0x7E6D,0x7E79,0x7E69, + 0x7E6A,0x7F85,0x7E73,0x7FB6,0x7FB9,0x7FB8,0x81D8,0x85E9, + 0x85DD,0x85EA,0x85D5,0x85E4,0x85E5,0x85F7,0x87FB,0x8805, + 0x880D,0x87F9,0x87FE,0x8960,0x895F,0x8956,0x895E,0x8B41, + 0x8B5C,0x8B58,0x8B49,0x8B5A,0x8B4E,0x8B4F,0x8B46,0x8B59, + 0x8D08,0x8D0A,0x8E7C,0x8E72,0x8E87,0x8E76,0x8E6C,0x8E7A, + 0x8E74,0x8F54,0x8F4E,0x8FAD,0x908A,0x908B,0x91B1,0x91AE, + 0x93E1,0x93D1,0x93DF,0x93C3,0x93C8,0x93DC,0x93DD,0x93D6, + 0x93E2,0x93CD,0x93D8,0x93E4,0x93D7,0x93E8,0x95DC,0x96B4, + 0x96E3,0x972A,0x9727,0x9761,0x97DC,0x97FB,0x985E,INVALC, + /* Block 197, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x9858,0x985B,0x98BC,0x9945,0x9949,0x9A16,0x9A19,0x9B0D, + 0x9BE8,0x9BE7,0x9BD6,0x9BDB,0x9D89,0x9D61,0x9D72,0x9D6A, + 0x9D6C,0x9E92,0x9E97,0x9E93,0x9EB4,0x52F8,0x56A8,0x56B7, + 0x56B6,0x56B4,0x56BC,0x58E4,0x5B40,0x5B43,0x5B7D,0x5BF6, + 0x5DC9,0x61F8,0x61FA,0x6518,0x6514,0x6519,0x66E6,0x6727, + 0x6AEC,0x703E,0x7030,0x7032,0x7210,0x737B,0x74CF,0x7662, + 0x7665,0x7926,0x792A,0x792C,0x792B,0x7AC7,0x7AF6,0x7C4C, + 0x7C43,0x7C4D,0x7CEF,0x7CF0,0x8FAE,0x7E7D,0x7E7C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7E82,0x7F4C,0x8000,0x81DA,0x8266,0x85FB,0x85F9, + 0x8611,0x85FA,0x8606,0x860B,0x8607,0x860A,0x8814,0x8815, + 0x8964,0x89BA,0x89F8,0x8B70,0x8B6C,0x8B66,0x8B6F,0x8B5F, + 0x8B6B,0x8D0F,0x8D0D,0x8E89,0x8E81,0x8E85,0x8E82,0x91B4, + 0x91CB,0x9418,0x9403,0x93FD,0x95E1,0x9730,0x98C4,0x9952, + 0x9951,0x99A8,0x9A2B,0x9A30,0x9A37,0x9A35,0x9C13,0x9C0D, + 0x9E79,0x9EB5,0x9EE8,0x9F2F,0x9F5F,0x9F63,0x9F61,0x5137, + 0x5138,0x56C1,0x56C0,0x56C2,0x5914,0x5C6C,0x5DCD,0x61FC, + 0x61FE,0x651D,0x651C,0x6595,0x66E9,0x6AFB,0x6B04,0x6AFA, + 0x6BB2,0x704C,0x721B,0x72A7,0x74D6,0x74D4,0x7669,0x77D3, + 0x7C50,0x7E8F,0x7E8C,0x7FBC,0x8617,0x862D,0x861A,0x8823, + 0x8822,0x8821,0x881F,0x896A,0x896C,0x89BD,0x8B74,INVALC, + /* Block 198, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8B77,0x8B7D,0x8D13,0x8E8A,0x8E8D,0x8E8B,0x8F5F,0x8FAF, + 0x91BA,0x942E,0x9433,0x9435,0x943A,0x9438,0x9432,0x942B, + 0x95E2,0x9738,0x9739,0x9732,0x97FF,0x9867,0x9865,0x9957, + 0x9A45,0x9A43,0x9A40,0x9A3E,0x9ACF,0x9B54,0x9B51,0x9C2D, + 0x9C25,0x9DAF,0x9DB4,0x9DC2,0x9DB8,0x9E9D,0x9EEF,0x9F19, + 0x9F5C,0x9F66,0x9F67,0x513C,0x513B,0x56C8,0x56CA,0x56C9, + 0x5B7F,0x5DD4,0x5DD2,0x5F4E,0x61FF,0x6524,0x6B0A,0x6B61, + 0x7051,0x7058,0x7380,0x74E4,0x758A,0x766E,0x766C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x79B3,0x7C60,0x7C5F,0x807E,0x807D,0x81DF,0x8972, + 0x896F,0x89FC,0x8B80,0x8D16,0x8D17,0x8E91,0x8E93,0x8F61, + 0x9148,0x9444,0x9451,0x9452,0x973D,0x973E,0x97C3,0x97C1, + 0x986B,0x9955,0x9A55,0x9A4D,0x9AD2,0x9B1A,0x9C49,0x9C31, + 0x9C3E,0x9C3B,0x9DD3,0x9DD7,0x9F34,0x9F6C,0x9F6A,0x9F94, + 0x56CC,0x5DD6,0x6200,0x6523,0x652B,0x652A,0x66EC,0x6B10, + 0x74DA,0x7ACA,0x7C64,0x7C63,0x7C65,0x7E93,0x7E96,0x7E94, + 0x81E2,0x8638,0x863F,0x8831,0x8B8A,0x9090,0x908F,0x9463, + 0x9460,0x9464,0x9768,0x986F,0x995C,0x9A5A,0x9A5B,0x9A57, + 0x9AD3,0x9AD4,0x9AD1,0x9C54,0x9C57,0x9C56,0x9DE5,0x9E9F, + 0x9EF4,0x56D1,0x58E9,0x652C,0x705E,0x7671,0x7672,0x77D7, + 0x7F50,0x7F88,0x8836,0x8839,0x8862,0x8B93,0x8B92,INVALC, + /* Block 199, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8B96,0x8277,0x8D1B,0x91C0,0x946A,0x9742,0x9748,0x9744, + 0x97C6,0x9870,0x9A5F,0x9B22,0x9B58,0x9C5F,0x9DF9,0x9DFA, + 0x9E7C,0x9E7D,0x9F07,0x9F77,0x9F72,0x5EF3,0x6B16,0x7063, + 0x7C6C,0x7C6E,0x883B,0x89C0,0x8EA1,0x91C1,0x9472,0x9470, + 0x9871,0x995E,0x9AD6,0x9B23,0x9ECC,0x7064,0x77DA,0x8B9A, + 0x9477,0x97C9,0x9A62,0x9A65,0x7E9C,0x8B9C,0x8EAA,0x91C5, + 0x947D,0x947E,0x947C,0x9C77,0x9C78,0x9EF7,0x8C54,0x947F, + 0x9E1A,0x7228,0x9A6A,0x9B31,0x9E1B,0x9E1E,0x7C72,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x30FE,0x309D,0x309E,0x3005,0x3041,0x3042,0x3043, + 0x3044,0x3045,0x3046,0x3047,0x3048,0x3049,0x304A,0x304B, + 0x304C,0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,0x3053, + 0x3054,0x3055,0x3056,0x3057,0x3058,0x3059,0x305A,0x305B, + 0x305C,0x305D,0x305E,0x305F,0x3060,0x3061,0x3062,0x3063, + 0x3064,0x3065,0x3066,0x3067,0x3068,0x3069,0x306A,0x306B, + 0x306C,0x306D,0x306E,0x306F,0x3070,0x3071,0x3072,0x3073, + 0x3074,0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,0x307B, + 0x307C,0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083, + 0x3084,0x3085,0x3086,0x3087,0x3088,0x3089,0x308A,0x308B, + 0x308C,0x308D,0x308E,0x308F,0x3090,0x3091,0x3092,0x3093, + 0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,INVALC, + /* Block 200, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF, + 0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7, + 0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF, + 0x30C0,0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7, + 0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF, + 0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7, + 0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, + 0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x30E7,0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED, + 0x30EE,0x30EF,0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5, + 0x30F6,0x0414,0x0415,0x0401,0x0416,0x0417,0x0418,0x0419, + 0x041A,0x041B,0x041C,0x0423,0x0424,0x0425,0x0426,0x0427, + 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, + 0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, + 0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, + 0x044F,0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466, + 0x2467,0x2468,0x2469,0x2474,0x2475,0x2476,0x2477,0x2478, + 0x2479,0x247A,0x247B,0x247C,0x247D,INVALC,INVALC,INVALC, + /* Block 202, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C,0x4E47, + 0x4E8D,0x56D7,0xFA0C,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E, + 0x4E2E,0x4E93,0x4EC2,0x4EC9,0x4EC8,0x5198,0x52FC,0x536C, + 0x53B9,0x5720,0x5903,0x592C,0x5C10,0x5DFF,0x65E1,0x6BB3, + 0x6BCC,0x6C14,0x723F,0x4E31,0x4E3C,0x4EE8,0x4EDC,0x4EE9, + 0x4EE1,0x4EDD,0x4EDA,0x520C,0x531C,0x534C,0x5722,0x5723, + 0x5917,0x592F,0x5B81,0x5B84,0x5C12,0x5C3B,0x5C74,0x5C73, + 0x5E04,0x5E80,0x5E82,0x5FC9,0x6209,0x6250,0x6C15,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C36,0x6C43,0x6C3F,0x6C3B,0x72AE,0x72B0,0x738A, + 0x79B8,0x808A,0x961E,0x4F0E,0x4F18,0x4F2C,0x4EF5,0x4F14, + 0x4EF1,0x4F00,0x4EF7,0x4F08,0x4F1D,0x4F02,0x4F05,0x4F22, + 0x4F13,0x4F04,0x4EF4,0x4F12,0x51B1,0x5213,0x5209,0x5210, + 0x52A6,0x5322,0x531F,0x534D,0x538A,0x5407,0x56E1,0x56DF, + 0x572E,0x572A,0x5734,0x593C,0x5980,0x597C,0x5985,0x597B, + 0x597E,0x5977,0x597F,0x5B56,0x5C15,0x5C25,0x5C7C,0x5C7A, + 0x5C7B,0x5C7E,0x5DDF,0x5E75,0x5E84,0x5F02,0x5F1A,0x5F74, + 0x5FD5,0x5FD4,0x5FCF,0x625C,0x625E,0x6264,0x6261,0x6266, + 0x6262,0x6259,0x6260,0x625A,0x6265,0x65EF,0x65EE,0x673E, + 0x6739,0x6738,0x673B,0x673A,0x673F,0x673C,0x6733,0x6C18, + 0x6C46,0x6C52,0x6C5C,0x6C4F,0x6C4A,0x6C54,0x6C4B,INVALC, + /* Block 203, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C4C,0x7071,0x725E,0x72B4,0x72B5,0x738E,0x752A,0x767F, + 0x7A75,0x7F51,0x8278,0x827C,0x8280,0x827D,0x827F,0x864D, + 0x897E,0x9099,0x9097,0x9098,0x909B,0x9094,0x9622,0x9624, + 0x9620,0x9623,0x4F56,0x4F3B,0x4F62,0x4F49,0x4F53,0x4F64, + 0x4F3E,0x4F67,0x4F52,0x4F5F,0x4F41,0x4F58,0x4F2D,0x4F33, + 0x4F3F,0x4F61,0x518F,0x51B9,0x521C,0x521E,0x5221,0x52AD, + 0x52AE,0x5309,0x5363,0x5372,0x538E,0x538F,0x5430,0x5437, + 0x542A,0x5454,0x5445,0x5419,0x541C,0x5425,0x5418,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x543D,0x544F,0x5441,0x5428,0x5424,0x5447,0x56EE, + 0x56E7,0x56E5,0x5741,0x5745,0x574C,0x5749,0x574B,0x5752, + 0x5906,0x5940,0x59A6,0x5998,0x59A0,0x5997,0x598E,0x59A2, + 0x5990,0x598F,0x59A7,0x59A1,0x5B8E,0x5B92,0x5C28,0x5C2A, + 0x5C8D,0x5C8F,0x5C88,0x5C8B,0x5C89,0x5C92,0x5C8A,0x5C86, + 0x5C93,0x5C95,0x5DE0,0x5E0A,0x5E0E,0x5E8B,0x5E89,0x5E8C, + 0x5E88,0x5E8D,0x5F05,0x5F1D,0x5F78,0x5F76,0x5FD2,0x5FD1, + 0x5FD0,0x5FED,0x5FE8,0x5FEE,0x5FF3,0x5FE1,0x5FE4,0x5FE3, + 0x5FFA,0x5FEF,0x5FF7,0x5FFB,0x6000,0x5FF4,0x623A,0x6283, + 0x628C,0x628E,0x628F,0x6294,0x6287,0x6271,0x627B,0x627A, + 0x6270,0x6281,0x6288,0x6277,0x627D,0x6272,0x6274,0x6537, + 0x65F0,0x65F4,0x65F3,0x65F2,0x65F5,0x6745,0x6747,INVALC, + /* Block 204, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6759,0x6755,0x674C,0x6748,0x675D,0x674D,0x675A,0x674B, + 0x6BD0,0x6C19,0x6C1A,0x6C78,0x6C67,0x6C6B,0x6C84,0x6C8B, + 0x6C8F,0x6C71,0x6C6F,0x6C69,0x6C9A,0x6C6D,0x6C87,0x6C95, + 0x6C9C,0x6C66,0x6C73,0x6C65,0x6C7B,0x6C8E,0x7074,0x707A, + 0x7263,0x72BF,0x72BD,0x72C3,0x72C6,0x72C1,0x72BA,0x72C5, + 0x7395,0x7397,0x7393,0x7394,0x7392,0x753A,0x7539,0x7594, + 0x7595,0x7681,0x793D,0x8034,0x8095,0x8099,0x8090,0x8092, + 0x809C,0x8290,0x828F,0x8285,0x828E,0x8291,0x8293,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x828A,0x8283,0x8284,0x8C78,0x8FC9,0x8FBF,0x909F, + 0x90A1,0x90A5,0x909E,0x90A7,0x90A0,0x9630,0x9628,0x962F, + 0x962D,0x4E33,0x4F98,0x4F7C,0x4F85,0x4F7D,0x4F80,0x4F87, + 0x4F76,0x4F74,0x4F89,0x4F84,0x4F77,0x4F4C,0x4F97,0x4F6A, + 0x4F9A,0x4F79,0x4F81,0x4F78,0x4F90,0x4F9C,0x4F94,0x4F9E, + 0x4F92,0x4F82,0x4F95,0x4F6B,0x4F6E,0x519E,0x51BC,0x51BE, + 0x5235,0x5232,0x5233,0x5246,0x5231,0x52BC,0x530A,0x530B, + 0x533C,0x5392,0x5394,0x5487,0x547F,0x5481,0x5491,0x5482, + 0x5488,0x546B,0x547A,0x547E,0x5465,0x546C,0x5474,0x5466, + 0x548D,0x546F,0x5461,0x5460,0x5498,0x5463,0x5467,0x5464, + 0x56F7,0x56F9,0x576F,0x5772,0x576D,0x576B,0x5771,0x5770, + 0x5776,0x5780,0x5775,0x577B,0x5773,0x5774,0x5762,INVALC, + /* Block 205, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5768,0x577D,0x590C,0x5945,0x59B5,0x59BA,0x59CF,0x59CE, + 0x59B2,0x59CC,0x59C1,0x59B6,0x59BC,0x59C3,0x59D6,0x59B1, + 0x59BD,0x59C0,0x59C8,0x59B4,0x59C7,0x5B62,0x5B65,0x5B93, + 0x5B95,0x5C44,0x5C47,0x5CAE,0x5CA4,0x5CA0,0x5CB5,0x5CAF, + 0x5CA8,0x5CAC,0x5C9F,0x5CA3,0x5CAD,0x5CA2,0x5CAA,0x5CA7, + 0x5C9D,0x5CA5,0x5CB6,0x5CB0,0x5CA6,0x5E17,0x5E14,0x5E19, + 0x5F28,0x5F22,0x5F23,0x5F24,0x5F54,0x5F82,0x5F7E,0x5F7D, + 0x5FDE,0x5FE5,0x602D,0x6026,0x6019,0x6032,0x600B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6034,0x600A,0x6017,0x6033,0x601A,0x601E,0x602C, + 0x6022,0x600D,0x6010,0x602E,0x6013,0x6011,0x600C,0x6009, + 0x601C,0x6214,0x623D,0x62AD,0x62B4,0x62D1,0x62BE,0x62AA, + 0x62B6,0x62CA,0x62AE,0x62B3,0x62AF,0x62BB,0x62A9,0x62B0, + 0x62B8,0x653D,0x65A8,0x65BB,0x6609,0x65FC,0x6604,0x6612, + 0x6608,0x65FB,0x6603,0x660B,0x660D,0x6605,0x65FD,0x6611, + 0x6610,0x66F6,0x670A,0x6785,0x676C,0x678E,0x6792,0x6776, + 0x677B,0x6798,0x6786,0x6784,0x6774,0x678D,0x678C,0x677A, + 0x679F,0x6791,0x6799,0x6783,0x677D,0x6781,0x6778,0x6779, + 0x6794,0x6B25,0x6B80,0x6B7E,0x6BDE,0x6C1D,0x6C93,0x6CEC, + 0x6CEB,0x6CEE,0x6CD9,0x6CB6,0x6CD4,0x6CAD,0x6CE7,0x6CB7, + 0x6CD0,0x6CC2,0x6CBA,0x6CC3,0x6CC6,0x6CED,0x6CF2,INVALC, + /* Block 206, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6CD2,0x6CDD,0x6CB4,0x6C8A,0x6C9D,0x6C80,0x6CDE,0x6CC0, + 0x6D30,0x6CCD,0x6CC7,0x6CB0,0x6CF9,0x6CCF,0x6CE9,0x6CD1, + 0x7094,0x7098,0x7085,0x7093,0x7086,0x7084,0x7091,0x7096, + 0x7082,0x709A,0x7083,0x726A,0x72D6,0x72CB,0x72D8,0x72C9, + 0x72DC,0x72D2,0x72D4,0x72DA,0x72CC,0x72D1,0x73A4,0x73A1, + 0x73AD,0x73A6,0x73A2,0x73A0,0x73AC,0x739D,0x74DD,0x74E8, + 0x753F,0x7540,0x753E,0x758C,0x7598,0x76AF,0x76F3,0x76F1, + 0x76F0,0x76F5,0x77F8,0x77FC,0x77F9,0x77FB,0x77FA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x77F7,0x7942,0x793F,0x79C5,0x7A78,0x7A7B,0x7AFB, + 0x7C75,0x7CFD,0x8035,0x808F,0x80AE,0x80A3,0x80B8,0x80B5, + 0x80AD,0x8220,0x82A0,0x82C0,0x82AB,0x829A,0x8298,0x829B, + 0x82B5,0x82A7,0x82AE,0x82BC,0x829E,0x82BA,0x82B4,0x82A8, + 0x82A1,0x82A9,0x82C2,0x82A4,0x82C3,0x82B6,0x82A2,0x8670, + 0x866F,0x866D,0x866E,0x8C56,0x8FD2,0x8FCB,0x8FD3,0x8FCD, + 0x8FD6,0x8FD5,0x8FD7,0x90B2,0x90B4,0x90AF,0x90B3,0x90B0, + 0x9639,0x963D,0x963C,0x963A,0x9643,0x4FCD,0x4FC5,0x4FD3, + 0x4FB2,0x4FC9,0x4FCB,0x4FC1,0x4FD4,0x4FDC,0x4FD9,0x4FBB, + 0x4FB3,0x4FDB,0x4FC7,0x4FD6,0x4FBA,0x4FC0,0x4FB9,0x4FEC, + 0x5244,0x5249,0x52C0,0x52C2,0x533D,0x537C,0x5397,0x5396, + 0x5399,0x5398,0x54BA,0x54A1,0x54AD,0x54A5,0x54CF,INVALC, + /* Block 207, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x54C3,0x830D,0x54B7,0x54AE,0x54D6,0x54B6,0x54C5,0x54C6, + 0x54A0,0x5470,0x54BC,0x54A2,0x54BE,0x5472,0x54DE,0x54B0, + 0x57B5,0x579E,0x579F,0x57A4,0x578C,0x5797,0x579D,0x579B, + 0x5794,0x5798,0x578F,0x5799,0x57A5,0x579A,0x5795,0x58F4, + 0x590D,0x5953,0x59E1,0x59DE,0x59EE,0x5A00,0x59F1,0x59DD, + 0x59FA,0x59FD,0x59FC,0x59F6,0x59E4,0x59F2,0x59F7,0x59DB, + 0x59E9,0x59F3,0x59F5,0x59E0,0x59FE,0x59F4,0x59ED,0x5BA8, + 0x5C4C,0x5CD0,0x5CD8,0x5CCC,0x5CD7,0x5CCB,0x5CDB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5CDE,0x5CDA,0x5CC9,0x5CC7,0x5CCA,0x5CD6,0x5CD3, + 0x5CD4,0x5CCF,0x5CC8,0x5CC6,0x5CCE,0x5CDF,0x5CF8,0x5DF9, + 0x5E21,0x5E22,0x5E23,0x5E20,0x5E24,0x5EB0,0x5EA4,0x5EA2, + 0x5E9B,0x5EA3,0x5EA5,0x5F07,0x5F2E,0x5F56,0x5F86,0x6037, + 0x6039,0x6054,0x6072,0x605E,0x6045,0x6053,0x6047,0x6049, + 0x605B,0x604C,0x6040,0x6042,0x605F,0x6024,0x6044,0x6058, + 0x6066,0x606E,0x6242,0x6243,0x62CF,0x630D,0x630B,0x62F5, + 0x630E,0x6303,0x62EB,0x62F9,0x630F,0x630C,0x62F8,0x62F6, + 0x6300,0x6313,0x6314,0x62FA,0x6315,0x62FB,0x62F0,0x6541, + 0x6543,0x65AA,0x65BF,0x6636,0x6621,0x6632,0x6635,0x661C, + 0x6626,0x6622,0x6633,0x662B,0x663A,0x661D,0x6634,0x6639, + 0x662E,0x670F,0x6710,0x67C1,0x67F2,0x67C8,0x67BA,INVALC, + /* Block 208, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x67DC,0x67BB,0x67F8,0x67D8,0x67C0,0x67B7,0x67C5,0x67EB, + 0x67E4,0x67DF,0x67B5,0x67CD,0x67B3,0x67F7,0x67F6,0x67EE, + 0x67E3,0x67C2,0x67B9,0x67CE,0x67E7,0x67F0,0x67B2,0x67FC, + 0x67C6,0x67ED,0x67CC,0x67AE,0x67E6,0x67DB,0x67FA,0x67C9, + 0x67CA,0x67C3,0x67EA,0x67CB,0x6B28,0x6B82,0x6B84,0x6BB6, + 0x6BD6,0x6BD8,0x6BE0,0x6C20,0x6C21,0x6D28,0x6D34,0x6D2D, + 0x6D1F,0x6D3C,0x6D3F,0x6D12,0x6D0A,0x6CDA,0x6D33,0x6D04, + 0x6D19,0x6D3A,0x6D1A,0x6D11,0x6D00,0x6D1D,0x6D42,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D01,0x6D18,0x6D37,0x6D03,0x6D0F,0x6D40,0x6D07, + 0x6D20,0x6D2C,0x6D08,0x6D22,0x6D09,0x6D10,0x70B7,0x709F, + 0x70BE,0x70B1,0x70B0,0x70A1,0x70B4,0x70B5,0x70A9,0x7241, + 0x7249,0x724A,0x726C,0x7270,0x7273,0x726E,0x72CA,0x72E4, + 0x72E8,0x72EB,0x72DF,0x72EA,0x72E6,0x72E3,0x7385,0x73CC, + 0x73C2,0x73C8,0x73C5,0x73B9,0x73B6,0x73B5,0x73B4,0x73EB, + 0x73BF,0x73C7,0x73BE,0x73C3,0x73C6,0x73B8,0x73CB,0x74EC, + 0x74EE,0x752E,0x7547,0x7548,0x75A7,0x75AA,0x7679,0x76C4, + 0x7708,0x7703,0x7704,0x7705,0x770A,0x76F7,0x76FB,0x76FA, + 0x77E7,0x77E8,0x7806,0x7811,0x7812,0x7805,0x7810,0x780F, + 0x780E,0x7809,0x7803,0x7813,0x794A,0x794C,0x794B,0x7945, + 0x7944,0x79D5,0x79CD,0x79CF,0x79D6,0x79CE,0x7A80,INVALC, + /* Block 209, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A7E,0x7AD1,0x7B00,0x7B01,0x7C7A,0x7C78,0x7C79,0x7C7F, + 0x7C80,0x7C81,0x7D03,0x7D08,0x7D01,0x7F58,0x7F91,0x7F8D, + 0x7FBE,0x8007,0x800E,0x800F,0x8014,0x8037,0x80D8,0x80C7, + 0x80E0,0x80D1,0x80C8,0x80C2,0x80D0,0x80C5,0x80E3,0x80D9, + 0x80DC,0x80CA,0x80D5,0x80C9,0x80CF,0x80D7,0x80E6,0x80CD, + 0x81FF,0x8221,0x8294,0x82D9,0x82FE,0x82F9,0x8307,0x82E8, + 0x8300,0x82D5,0x833A,0x82EB,0x82D6,0x82F4,0x82EC,0x82E1, + 0x82F2,0x82F5,0x830C,0x82FB,0x82F6,0x82F0,0x82EA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x82E4,0x82E0,0x82FA,0x82F3,0x82ED,0x8677,0x8674, + 0x867C,0x8673,0x8841,0x884E,0x8867,0x886A,0x8869,0x89D3, + 0x8A04,0x8A07,0x8D72,0x8FE3,0x8FE1,0x8FEE,0x8FE0,0x90F1, + 0x90BD,0x90BF,0x90D5,0x90C5,0x90BE,0x90C7,0x90CB,0x90C8, + 0x91D4,0x91D3,0x9654,0x964F,0x9651,0x9653,0x964A,0x964E, + 0x501E,0x5005,0x5007,0x5013,0x5022,0x5030,0x501B,0x4FF5, + 0x4FF4,0x5033,0x5037,0x502C,0x4FF6,0x4FF7,0x5017,0x501C, + 0x5020,0x5027,0x5035,0x502F,0x5031,0x500E,0x515A,0x5194, + 0x5193,0x51CA,0x51C4,0x51C5,0x51C8,0x51CE,0x5261,0x525A, + 0x5252,0x525E,0x525F,0x5255,0x5262,0x52CD,0x530E,0x539E, + 0x5526,0x54E2,0x5517,0x5512,0x54E7,0x54F3,0x54E4,0x551A, + 0x54FF,0x5504,0x5508,0x54EB,0x5511,0x5505,0x54F1,INVALC, + /* Block 210, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x550A,0x54FB,0x54F7,0x54F8,0x54E0,0x550E,0x5503,0x550B, + 0x5701,0x5702,0x57CC,0x5832,0x57D5,0x57D2,0x57BA,0x57C6, + 0x57BD,0x57BC,0x57B8,0x57B6,0x57BF,0x57C7,0x57D0,0x57B9, + 0x57C1,0x590E,0x594A,0x5A19,0x5A16,0x5A2D,0x5A2E,0x5A15, + 0x5A0F,0x5A17,0x5A0A,0x5A1E,0x5A33,0x5B6C,0x5BA7,0x5BAD, + 0x5BAC,0x5C03,0x5C56,0x5C54,0x5CEC,0x5CFF,0x5CEE,0x5CF1, + 0x5CF7,0x5D00,0x5CF9,0x5E29,0x5E28,0x5EA8,0x5EAE,0x5EAA, + 0x5EAC,0x5F33,0x5F30,0x5F67,0x605D,0x605A,0x6067,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6041,0x60A2,0x6088,0x6080,0x6092,0x6081,0x609D, + 0x6083,0x6095,0x609B,0x6097,0x6087,0x609C,0x608E,0x6219, + 0x6246,0x62F2,0x6310,0x6356,0x632C,0x6344,0x6345,0x6336, + 0x6343,0x63E4,0x6339,0x634B,0x634A,0x633C,0x6329,0x6341, + 0x6334,0x6358,0x6354,0x6359,0x632D,0x6347,0x6333,0x635A, + 0x6351,0x6338,0x6357,0x6340,0x6348,0x654A,0x6546,0x65C6, + 0x65C3,0x65C4,0x65C2,0x664A,0x665F,0x6647,0x6651,0x6712, + 0x6713,0x681F,0x681A,0x6849,0x6832,0x6833,0x683B,0x684B, + 0x684F,0x6816,0x6831,0x681C,0x6835,0x682B,0x682D,0x682F, + 0x684E,0x6844,0x6834,0x681D,0x6812,0x6814,0x6826,0x6828, + 0x682E,0x684D,0x683A,0x6825,0x6820,0x6B2C,0x6B2F,0x6B2D, + 0x6B31,0x6B34,0x6B6D,0x8082,0x6B88,0x6BE6,0x6BE4,INVALC, + /* Block 211, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6BE8,0x6BE3,0x6BE2,0x6BE7,0x6C25,0x6D7A,0x6D63,0x6D64, + 0x6D76,0x6D0D,0x6D61,0x6D92,0x6D58,0x6D62,0x6D6D,0x6D6F, + 0x6D91,0x6D8D,0x6DEF,0x6D7F,0x6D86,0x6D5E,0x6D67,0x6D60, + 0x6D97,0x6D70,0x6D7C,0x6D5F,0x6D82,0x6D98,0x6D2F,0x6D68, + 0x6D8B,0x6D7E,0x6D80,0x6D84,0x6D16,0x6D83,0x6D7B,0x6D7D, + 0x6D75,0x6D90,0x70DC,0x70D3,0x70D1,0x70DD,0x70CB,0x7F39, + 0x70E2,0x70D7,0x70D2,0x70DE,0x70E0,0x70D4,0x70CD,0x70C5, + 0x70C6,0x70C7,0x70DA,0x70CE,0x70E1,0x7242,0x7278,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7277,0x7276,0x7300,0x72FA,0x72F4,0x72FE,0x72F6, + 0x72F3,0x72FB,0x7301,0x73D3,0x73D9,0x73E5,0x73D6,0x73BC, + 0x73E7,0x73E3,0x73E9,0x73DC,0x73D2,0x73DB,0x73D4,0x73DD, + 0x73DA,0x73D7,0x73D8,0x73E8,0x74DE,0x74DF,0x74F4,0x74F5, + 0x7521,0x755B,0x755F,0x75B0,0x75C1,0x75BB,0x75C4,0x75C0, + 0x75BF,0x75B6,0x75BA,0x768A,0x76C9,0x771D,0x771B,0x7710, + 0x7713,0x7712,0x7723,0x7711,0x7715,0x7719,0x771A,0x7722, + 0x7727,0x7823,0x782C,0x7822,0x7835,0x782F,0x7828,0x782E, + 0x782B,0x7821,0x7829,0x7833,0x782A,0x7831,0x7954,0x795B, + 0x794F,0x795C,0x7953,0x7952,0x7951,0x79EB,0x79EC,0x79E0, + 0x79EE,0x79ED,0x79EA,0x79DC,0x79DE,0x79DD,0x7A86,0x7A89, + 0x7A85,0x7A8B,0x7A8C,0x7A8A,0x7A87,0x7AD8,0x7B10,INVALC, + /* Block 212, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7B04,0x7B13,0x7B05,0x7B0F,0x7B08,0x7B0A,0x7B0E,0x7B09, + 0x7B12,0x7C84,0x7C91,0x7C8A,0x7C8C,0x7C88,0x7C8D,0x7C85, + 0x7D1E,0x7D1D,0x7D11,0x7D0E,0x7D18,0x7D16,0x7D13,0x7D1F, + 0x7D12,0x7D0F,0x7D0C,0x7F5C,0x7F61,0x7F5E,0x7F60,0x7F5D, + 0x7F5B,0x7F96,0x7F92,0x7FC3,0x7FC2,0x7FC0,0x8016,0x803E, + 0x8039,0x80FA,0x80F2,0x80F9,0x80F5,0x8101,0x80FB,0x8100, + 0x8201,0x822F,0x8225,0x8333,0x832D,0x8344,0x8319,0x8351, + 0x8325,0x8356,0x833F,0x8341,0x8326,0x831C,0x8322,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8342,0x834E,0x831B,0x832A,0x8308,0x833C,0x834D, + 0x8316,0x8324,0x8320,0x8337,0x832F,0x8329,0x8347,0x8345, + 0x834C,0x8353,0x831E,0x832C,0x834B,0x8327,0x8348,0x8653, + 0x8652,0x86A2,0x86A8,0x8696,0x868D,0x8691,0x869E,0x8687, + 0x8697,0x8686,0x868B,0x869A,0x8685,0x86A5,0x8699,0x86A1, + 0x86A7,0x8695,0x8698,0x868E,0x869D,0x8690,0x8694,0x8843, + 0x8844,0x886D,0x8875,0x8876,0x8872,0x8880,0x8871,0x887F, + 0x886F,0x8883,0x887E,0x8874,0x887C,0x8A12,0x8C47,0x8C57, + 0x8C7B,0x8CA4,0x8CA3,0x8D76,0x8D78,0x8DB5,0x8DB7,0x8DB6, + 0x8ED1,0x8ED3,0x8FFE,0x8FF5,0x9002,0x8FFF,0x8FFB,0x9004, + 0x8FFC,0x8FF6,0x90D6,0x90E0,0x90D9,0x90DA,0x90E3,0x90DF, + 0x90E5,0x90D8,0x90DB,0x90D7,0x90DC,0x90E4,0x9150,INVALC, + /* Block 213, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x914E,0x914F,0x91D5,0x91E2,0x91DA,0x965C,0x965F,0x96BC, + 0x98E3,0x9ADF,0x9B2F,0x4E7F,0x5070,0x506A,0x5061,0x505E, + 0x5060,0x5053,0x504B,0x505D,0x5072,0x5048,0x504D,0x5041, + 0x505B,0x504A,0x5062,0x5015,0x5045,0x505F,0x5069,0x506B, + 0x5063,0x5064,0x5046,0x5040,0x506E,0x5073,0x5057,0x5051, + 0x51D0,0x526B,0x526D,0x526C,0x526E,0x52D6,0x52D3,0x532D, + 0x539C,0x5575,0x5576,0x553C,0x554D,0x5550,0x5534,0x552A, + 0x5551,0x5562,0x5536,0x5535,0x5530,0x5552,0x5545,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x550C,0x5532,0x5565,0x554E,0x5539,0x5548,0x552D, + 0x553B,0x5540,0x554B,0x570A,0x5707,0x57FB,0x5814,0x57E2, + 0x57F6,0x57DC,0x57F4,0x5800,0x57ED,0x57FD,0x5808,0x57F8, + 0x580B,0x57F3,0x57CF,0x5807,0x57EE,0x57E3,0x57F2,0x57E5, + 0x57EC,0x57E1,0x580E,0x57FC,0x5810,0x57E7,0x5801,0x580C, + 0x57F1,0x57E9,0x57F0,0x580D,0x5804,0x595C,0x5A60,0x5A58, + 0x5A55,0x5A67,0x5A5E,0x5A38,0x5A35,0x5A6D,0x5A50,0x5A5F, + 0x5A65,0x5A6C,0x5A53,0x5A64,0x5A57,0x5A43,0x5A5D,0x5A52, + 0x5A44,0x5A5B,0x5A48,0x5A8E,0x5A3E,0x5A4D,0x5A39,0x5A4C, + 0x5A70,0x5A69,0x5A47,0x5A51,0x5A56,0x5A42,0x5A5C,0x5B72, + 0x5B6E,0x5BC1,0x5BC0,0x5C59,0x5D1E,0x5D0B,0x5D1D,0x5D1A, + 0x5D20,0x5D0C,0x5D28,0x5D0D,0x5D26,0x5D25,0x5D0F,INVALC, + /* Block 214, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D30,0x5D12,0x5D23,0x5D1F,0x5D2E,0x5E3E,0x5E34,0x5EB1, + 0x5EB4,0x5EB9,0x5EB2,0x5EB3,0x5F36,0x5F38,0x5F9B,0x5F96, + 0x5F9F,0x608A,0x6090,0x6086,0x60BE,0x60B0,0x60BA,0x60D3, + 0x60D4,0x60CF,0x60E4,0x60D9,0x60DD,0x60C8,0x60B1,0x60DB, + 0x60B7,0x60CA,0x60BF,0x60C3,0x60CD,0x60C0,0x6332,0x6365, + 0x638A,0x6382,0x637D,0x63BD,0x639E,0x63AD,0x639D,0x6397, + 0x63AB,0x638E,0x636F,0x6387,0x6390,0x636E,0x63AF,0x6375, + 0x639C,0x636D,0x63AE,0x637C,0x63A4,0x633B,0x639F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6378,0x6385,0x6381,0x6391,0x638D,0x6370,0x6553, + 0x65CD,0x6665,0x6661,0x665B,0x6659,0x665C,0x6662,0x6718, + 0x6879,0x6887,0x6890,0x689C,0x686D,0x686E,0x68AE,0x68AB, + 0x6956,0x686F,0x68A3,0x68AC,0x68A9,0x6875,0x6874,0x68B2, + 0x688F,0x6877,0x6892,0x687C,0x686B,0x6872,0x68AA,0x6880, + 0x6871,0x687E,0x689B,0x6896,0x688B,0x68A0,0x6889,0x68A4, + 0x6878,0x687B,0x6891,0x688C,0x688A,0x687D,0x6B36,0x6B33, + 0x6B37,0x6B38,0x6B91,0x6B8F,0x6B8D,0x6B8E,0x6B8C,0x6C2A, + 0x6DC0,0x6DAB,0x6DB4,0x6DB3,0x6E74,0x6DAC,0x6DE9,0x6DE2, + 0x6DB7,0x6DF6,0x6DD4,0x6E00,0x6DC8,0x6DE0,0x6DDF,0x6DD6, + 0x6DBE,0x6DE5,0x6DDC,0x6DDD,0x6DDB,0x6DF4,0x6DCA,0x6DBD, + 0x6DED,0x6DF0,0x6DBA,0x6DD5,0x6DC2,0x6DCF,0x6DC9,INVALC, + /* Block 215, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6DD0,0x6DF2,0x6DD3,0x6DFD,0x6DD7,0x6DCD,0x6DE3,0x6DBB, + 0x70FA,0x710D,0x70F7,0x7117,0x70F4,0x710C,0x70F0,0x7104, + 0x70F3,0x7110,0x70FC,0x70FF,0x7106,0x7113,0x7100,0x70F8, + 0x70F6,0x710B,0x7102,0x710E,0x727E,0x727B,0x727C,0x727F, + 0x731D,0x7317,0x7307,0x7311,0x7318,0x730A,0x7308,0x72FF, + 0x730F,0x731E,0x7388,0x73F6,0x73F8,0x73F5,0x7404,0x7401, + 0x73FD,0x7407,0x7400,0x73FA,0x73FC,0x73FF,0x740C,0x740B, + 0x73F4,0x7408,0x7564,0x7563,0x75CE,0x75D2,0x75CF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x75CB,0x75CC,0x75D1,0x75D0,0x768F,0x7689,0x76D3, + 0x7739,0x772F,0x772D,0x7731,0x7732,0x7734,0x7733,0x773D, + 0x7725,0x773B,0x7735,0x7848,0x7852,0x7849,0x784D,0x784A, + 0x784C,0x7826,0x7845,0x7850,0x7964,0x7967,0x7969,0x796A, + 0x7963,0x796B,0x7961,0x79BB,0x79FA,0x79F8,0x79F6,0x79F7, + 0x7A8F,0x7A94,0x7A90,0x7B35,0x7B47,0x7B34,0x7B25,0x7B30, + 0x7B22,0x7B24,0x7B33,0x7B18,0x7B2A,0x7B1D,0x7B31,0x7B2B, + 0x7B2D,0x7B2F,0x7B32,0x7B38,0x7B1A,0x7B23,0x7C94,0x7C98, + 0x7C96,0x7CA3,0x7D35,0x7D3D,0x7D38,0x7D36,0x7D3A,0x7D45, + 0x7D2C,0x7D29,0x7D41,0x7D47,0x7D3E,0x7D3F,0x7D4A,0x7D3B, + 0x7D28,0x7F63,0x7F95,0x7F9C,0x7F9D,0x7F9B,0x7FCA,0x7FCB, + 0x7FCD,0x7FD0,0x7FD1,0x7FC7,0x7FCF,0x7FC9,0x801F,INVALC, + /* Block 216, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x801E,0x801B,0x8047,0x8043,0x8048,0x8118,0x8125,0x8119, + 0x811B,0x812D,0x811F,0x812C,0x811E,0x8121,0x8115,0x8127, + 0x811D,0x8122,0x8211,0x8238,0x8233,0x823A,0x8234,0x8232, + 0x8274,0x8390,0x83A3,0x83A8,0x838D,0x837A,0x8373,0x83A4, + 0x8374,0x838F,0x8381,0x8395,0x8399,0x8375,0x8394,0x83A9, + 0x837D,0x8383,0x838C,0x839D,0x839B,0x83AA,0x838B,0x837E, + 0x83A5,0x83AF,0x8388,0x8397,0x83B0,0x837F,0x83A6,0x8387, + 0x83AE,0x8376,0x839A,0x8659,0x8656,0x86BF,0x86B7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x86C2,0x86C1,0x86C5,0x86BA,0x86B0,0x86C8,0x86B9, + 0x86B3,0x86B8,0x86CC,0x86B4,0x86BB,0x86BC,0x86C3,0x86BD, + 0x86BE,0x8852,0x8889,0x8895,0x88A8,0x88A2,0x88AA,0x889A, + 0x8891,0x88A1,0x889F,0x8898,0x88A7,0x8899,0x889B,0x8897, + 0x88A4,0x88AC,0x888C,0x8893,0x888E,0x8982,0x89D6,0x89D9, + 0x89D5,0x8A30,0x8A27,0x8A2C,0x8A1E,0x8C39,0x8C3B,0x8C5C, + 0x8C5D,0x8C7D,0x8CA5,0x8D7D,0x8D7B,0x8D79,0x8DBC,0x8DC2, + 0x8DB9,0x8DBF,0x8DC1,0x8ED8,0x8EDE,0x8EDD,0x8EDC,0x8ED7, + 0x8EE0,0x8EE1,0x9024,0x900B,0x9011,0x901C,0x900C,0x9021, + 0x90EF,0x90EA,0x90F0,0x90F4,0x90F2,0x90F3,0x90D4,0x90EB, + 0x90EC,0x90E9,0x9156,0x9158,0x915A,0x9153,0x9155,0x91EC, + 0x91F4,0x91F1,0x91F3,0x91F8,0x91E4,0x91F9,0x91EA,INVALC, + /* Block 217, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x91EB,0x91F7,0x91E8,0x91EE,0x957A,0x9586,0x9588,0x967C, + 0x966D,0x966B,0x9671,0x966F,0x96BF,0x976A,0x9804,0x98E5, + 0x9997,0x509B,0x5095,0x5094,0x509E,0x508B,0x50A3,0x5083, + 0x508C,0x508E,0x509D,0x5068,0x509C,0x5092,0x5082,0x5087, + 0x515F,0x51D4,0x5312,0x5311,0x53A4,0x53A7,0x5591,0x55A8, + 0x55A5,0x55AD,0x5577,0x5645,0x55A2,0x5593,0x5588,0x558F, + 0x55B5,0x5581,0x55A3,0x5592,0x55A4,0x557D,0x558C,0x55A6, + 0x557F,0x5595,0x55A1,0x558E,0x570C,0x5829,0x5837,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5819,0x581E,0x5827,0x5823,0x5828,0x57F5,0x5848, + 0x5825,0x581C,0x581B,0x5833,0x583F,0x5836,0x582E,0x5839, + 0x5838,0x582D,0x582C,0x583B,0x5961,0x5AAF,0x5A94,0x5A9F, + 0x5A7A,0x5AA2,0x5A9E,0x5A78,0x5AA6,0x5A7C,0x5AA5,0x5AAC, + 0x5A95,0x5AAE,0x5A37,0x5A84,0x5A8A,0x5A97,0x5A83,0x5A8B, + 0x5AA9,0x5A7B,0x5A7D,0x5A8C,0x5A9C,0x5A8F,0x5A93,0x5A9D, + 0x5BEA,0x5BCD,0x5BCB,0x5BD4,0x5BD1,0x5BCA,0x5BCE,0x5C0C, + 0x5C30,0x5D37,0x5D43,0x5D6B,0x5D41,0x5D4B,0x5D3F,0x5D35, + 0x5D51,0x5D4E,0x5D55,0x5D33,0x5D3A,0x5D52,0x5D3D,0x5D31, + 0x5D59,0x5D42,0x5D39,0x5D49,0x5D38,0x5D3C,0x5D32,0x5D36, + 0x5D40,0x5D45,0x5E44,0x5E41,0x5F58,0x5FA6,0x5FA5,0x5FAB, + 0x60C9,0x60B9,0x60CC,0x60E2,0x60CE,0x60C4,0x6114,INVALC, + /* Block 218, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x60F2,0x610A,0x6116,0x6105,0x60F5,0x6113,0x60F8,0x60FC, + 0x60FE,0x60C1,0x6103,0x6118,0x611D,0x6110,0x60FF,0x6104, + 0x610B,0x624A,0x6394,0x63B1,0x63B0,0x63CE,0x63E5,0x63E8, + 0x63EF,0x63C3,0x649D,0x63F3,0x63CA,0x63E0,0x63F6,0x63D5, + 0x63F2,0x63F5,0x6461,0x63DF,0x63BE,0x63DD,0x63DC,0x63C4, + 0x63D8,0x63D3,0x63C2,0x63C7,0x63CC,0x63CB,0x63C8,0x63F0, + 0x63D7,0x63D9,0x6532,0x6567,0x656A,0x6564,0x655C,0x6568, + 0x6565,0x658C,0x659D,0x659E,0x65AE,0x65D0,0x65D2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x667C,0x666C,0x667B,0x6680,0x6671,0x6679,0x666A, + 0x6672,0x6701,0x690C,0x68D3,0x6904,0x68DC,0x692A,0x68EC, + 0x68EA,0x68F1,0x690F,0x68D6,0x68F7,0x68EB,0x68E4,0x68F6, + 0x6913,0x6910,0x68F3,0x68E1,0x6907,0x68CC,0x6908,0x6970, + 0x68B4,0x6911,0x68EF,0x68C6,0x6914,0x68F8,0x68D0,0x68FD, + 0x68FC,0x68E8,0x690B,0x690A,0x6917,0x68CE,0x68C8,0x68DD, + 0x68DE,0x68E6,0x68F4,0x68D1,0x6906,0x68D4,0x68E9,0x6915, + 0x6925,0x68C7,0x6B39,0x6B3B,0x6B3F,0x6B3C,0x6B94,0x6B97, + 0x6B99,0x6B95,0x6BBD,0x6BF0,0x6BF2,0x6BF3,0x6C30,0x6DFC, + 0x6E46,0x6E47,0x6E1F,0x6E49,0x6E88,0x6E3C,0x6E3D,0x6E45, + 0x6E62,0x6E2B,0x6E3F,0x6E41,0x6E5D,0x6E73,0x6E1C,0x6E33, + 0x6E4B,0x6E40,0x6E51,0x6E3B,0x6E03,0x6E2E,0x6E5E,INVALC, + /* Block 219, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E68,0x6E5C,0x6E61,0x6E31,0x6E28,0x6E60,0x6E71,0x6E6B, + 0x6E39,0x6E22,0x6E30,0x6E53,0x6E65,0x6E27,0x6E78,0x6E64, + 0x6E77,0x6E55,0x6E79,0x6E52,0x6E66,0x6E35,0x6E36,0x6E5A, + 0x7120,0x711E,0x712F,0x70FB,0x712E,0x7131,0x7123,0x7125, + 0x7122,0x7132,0x711F,0x7128,0x713A,0x711B,0x724B,0x725A, + 0x7288,0x7289,0x7286,0x7285,0x728B,0x7312,0x730B,0x7330, + 0x7322,0x7331,0x7333,0x7327,0x7332,0x732D,0x7326,0x7323, + 0x7335,0x730C,0x742E,0x742C,0x7430,0x742B,0x7416,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x741A,0x7421,0x742D,0x7431,0x7424,0x7423,0x741D, + 0x7429,0x7420,0x7432,0x74FB,0x752F,0x756F,0x756C,0x75E7, + 0x75DA,0x75E1,0x75E6,0x75DD,0x75DF,0x75E4,0x75D7,0x7695, + 0x7692,0x76DA,0x7746,0x7747,0x7744,0x774D,0x7745,0x774A, + 0x774E,0x774B,0x774C,0x77DE,0x77EC,0x7860,0x7864,0x7865, + 0x785C,0x786D,0x7871,0x786A,0x786E,0x7870,0x7869,0x7868, + 0x785E,0x7862,0x7974,0x7973,0x7972,0x7970,0x7A02,0x7A0A, + 0x7A03,0x7A0C,0x7A04,0x7A99,0x7AE6,0x7AE4,0x7B4A,0x7B3B, + 0x7B44,0x7B48,0x7B4C,0x7B4E,0x7B40,0x7B58,0x7B45,0x7CA2, + 0x7C9E,0x7CA8,0x7CA1,0x7D58,0x7D6F,0x7D63,0x7D53,0x7D56, + 0x7D67,0x7D6A,0x7D4F,0x7D6D,0x7D5C,0x7D6B,0x7D52,0x7D54, + 0x7D69,0x7D51,0x7D5F,0x7D4E,0x7F3E,0x7F3F,0x7F65,INVALC, + /* Block 220, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7F66,0x7FA2,0x7FA0,0x7FA1,0x7FD7,0x8051,0x804F,0x8050, + 0x80FE,0x80D4,0x8143,0x814A,0x8152,0x814F,0x8147,0x813D, + 0x814D,0x813A,0x81E6,0x81EE,0x81F7,0x81F8,0x81F9,0x8204, + 0x823C,0x823D,0x823F,0x8275,0x833B,0x83CF,0x83F9,0x8423, + 0x83C0,0x83E8,0x8412,0x83E7,0x83E4,0x83FC,0x83F6,0x8410, + 0x83C6,0x83C8,0x83EB,0x83E3,0x83BF,0x8401,0x83DD,0x83E5, + 0x83D8,0x83FF,0x83E1,0x83CB,0x83CE,0x83D6,0x83F5,0x83C9, + 0x8409,0x840F,0x83DE,0x8411,0x8406,0x83C2,0x83F3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x83D5,0x83FA,0x83C7,0x83D1,0x83EA,0x8413,0x83C3, + 0x83EC,0x83EE,0x83C4,0x83FB,0x83D7,0x83E2,0x841B,0x83DB, + 0x83FE,0x86D8,0x86E2,0x86E6,0x86D3,0x86E3,0x86DA,0x86EA, + 0x86DD,0x86EB,0x86DC,0x86EC,0x86E9,0x86D7,0x86E8,0x86D1, + 0x8848,0x8856,0x8855,0x88BA,0x88D7,0x88B9,0x88B8,0x88C0, + 0x88BE,0x88B6,0x88BC,0x88B7,0x88BD,0x88B2,0x8901,0x88C9, + 0x8995,0x8998,0x8997,0x89DD,0x89DA,0x89DB,0x8A4E,0x8A4D, + 0x8A39,0x8A59,0x8A40,0x8A57,0x8A58,0x8A44,0x8A45,0x8A52, + 0x8A48,0x8A51,0x8A4A,0x8A4C,0x8A4F,0x8C5F,0x8C81,0x8C80, + 0x8CBA,0x8CBE,0x8CB0,0x8CB9,0x8CB5,0x8D84,0x8D80,0x8D89, + 0x8DD8,0x8DD3,0x8DCD,0x8DC7,0x8DD6,0x8DDC,0x8DCF,0x8DD5, + 0x8DD9,0x8DC8,0x8DD7,0x8DC5,0x8EEF,0x8EF7,0x8EFA,INVALC, + /* Block 221, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8EF9,0x8EE6,0x8EEE,0x8EE5,0x8EF5,0x8EE7,0x8EE8,0x8EF6, + 0x8EEB,0x8EF1,0x8EEC,0x8EF4,0x8EE9,0x902D,0x9034,0x902F, + 0x9106,0x912C,0x9104,0x90FF,0x90FC,0x9108,0x90F9,0x90FB, + 0x9101,0x9100,0x9107,0x9105,0x9103,0x9161,0x9164,0x915F, + 0x9162,0x9160,0x9201,0x920A,0x9225,0x9203,0x921A,0x9226, + 0x920F,0x920C,0x9200,0x9212,0x91FF,0x91FD,0x9206,0x9204, + 0x9227,0x9202,0x921C,0x9224,0x9219,0x9217,0x9205,0x9216, + 0x957B,0x958D,0x958C,0x9590,0x9687,0x967E,0x9688,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9689,0x9683,0x9680,0x96C2,0x96C8,0x96C3,0x96F1, + 0x96F0,0x976C,0x9770,0x976E,0x9807,0x98A9,0x98EB,0x9CE6, + 0x9EF9,0x4E83,0x4E84,0x4EB6,0x50BD,0x50BF,0x50C6,0x50AE, + 0x50C4,0x50CA,0x50B4,0x50C8,0x50C2,0x50B0,0x50C1,0x50BA, + 0x50B1,0x50CB,0x50C9,0x50B6,0x50B8,0x51D7,0x527A,0x5278, + 0x527B,0x527C,0x55C3,0x55DB,0x55CC,0x55D0,0x55CB,0x55CA, + 0x55DD,0x55C0,0x55D4,0x55C4,0x55E9,0x55BF,0x55D2,0x558D, + 0x55CF,0x55D5,0x55E2,0x55D6,0x55C8,0x55F2,0x55CD,0x55D9, + 0x55C2,0x5714,0x5853,0x5868,0x5864,0x584F,0x584D,0x5849, + 0x586F,0x5855,0x584E,0x585D,0x5859,0x5865,0x585B,0x583D, + 0x5863,0x5871,0x58FC,0x5AC7,0x5AC4,0x5ACB,0x5ABA,0x5AB8, + 0x5AB1,0x5AB5,0x5AB0,0x5ABF,0x5AC8,0x5ABB,0x5AC6,INVALC, + /* Block 222, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5AB7,0x5AC0,0x5ACA,0x5AB4,0x5AB6,0x5ACD,0x5AB9,0x5A90, + 0x5BD6,0x5BD8,0x5BD9,0x5C1F,0x5C33,0x5D71,0x5D63,0x5D4A, + 0x5D65,0x5D72,0x5D6C,0x5D5E,0x5D68,0x5D67,0x5D62,0x5DF0, + 0x5E4F,0x5E4E,0x5E4A,0x5E4D,0x5E4B,0x5EC5,0x5ECC,0x5EC6, + 0x5ECB,0x5EC7,0x5F40,0x5FAF,0x5FAD,0x60F7,0x6149,0x614A, + 0x612B,0x6145,0x6136,0x6132,0x612E,0x6146,0x612F,0x614F, + 0x6129,0x6140,0x6220,0x9168,0x6223,0x6225,0x6224,0x63C5, + 0x63F1,0x63EB,0x6410,0x6412,0x6409,0x6420,0x6424,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6433,0x6443,0x641F,0x6415,0x6418,0x6439,0x6437, + 0x6422,0x6423,0x640C,0x6426,0x6430,0x6428,0x6441,0x6435, + 0x642F,0x640A,0x641A,0x6440,0x6425,0x6427,0x640B,0x63E7, + 0x641B,0x642E,0x6421,0x640E,0x656F,0x6592,0x65D3,0x6686, + 0x668C,0x6695,0x6690,0x668B,0x668A,0x6699,0x6694,0x6678, + 0x6720,0x6966,0x695F,0x6938,0x694E,0x6962,0x6971,0x693F, + 0x6945,0x696A,0x6939,0x6942,0x6957,0x6959,0x697A,0x6948, + 0x6949,0x6935,0x696C,0x6933,0x693D,0x6965,0x68F0,0x6978, + 0x6934,0x6969,0x6940,0x696F,0x6944,0x6976,0x6958,0x6941, + 0x6974,0x694C,0x693B,0x694B,0x6937,0x695C,0x694F,0x6951, + 0x6932,0x6952,0x692F,0x697B,0x693C,0x6B46,0x6B45,0x6B43, + 0x6B42,0x6B48,0x6B41,0x6B9B,0xFA0D,0x6BFB,0x6BFC,INVALC, + /* Block 223, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6BF9,0x6BF7,0x6BF8,0x6E9B,0x6ED6,0x6EC8,0x6E8F,0x6EC0, + 0x6E9F,0x6E93,0x6E94,0x6EA0,0x6EB1,0x6EB9,0x6EC6,0x6ED2, + 0x6EBD,0x6EC1,0x6E9E,0x6EC9,0x6EB7,0x6EB0,0x6ECD,0x6EA6, + 0x6ECF,0x6EB2,0x6EBE,0x6EC3,0x6EDC,0x6ED8,0x6E99,0x6E92, + 0x6E8E,0x6E8D,0x6EA4,0x6EA1,0x6EBF,0x6EB3,0x6ED0,0x6ECA, + 0x6E97,0x6EAE,0x6EA3,0x7147,0x7154,0x7152,0x7163,0x7160, + 0x7141,0x715D,0x7162,0x7172,0x7178,0x716A,0x7161,0x7142, + 0x7158,0x7143,0x714B,0x7170,0x715F,0x7150,0x7153,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7144,0x714D,0x715A,0x724F,0x728D,0x728C,0x7291, + 0x7290,0x728E,0x733C,0x7342,0x733B,0x733A,0x7340,0x734A, + 0x7349,0x7444,0x744A,0x744B,0x7452,0x7451,0x7457,0x7440, + 0x744F,0x7450,0x744E,0x7442,0x7446,0x744D,0x7454,0x74E1, + 0x74FF,0x74FE,0x74FD,0x751D,0x7579,0x7577,0x6983,0x75EF, + 0x760F,0x7603,0x75F7,0x75FE,0x75FC,0x75F9,0x75F8,0x7610, + 0x75FB,0x75F6,0x75ED,0x75F5,0x75FD,0x7699,0x76B5,0x76DD, + 0x7755,0x775F,0x7760,0x7752,0x7756,0x775A,0x7769,0x7767, + 0x7754,0x7759,0x776D,0x77E0,0x7887,0x789A,0x7894,0x788F, + 0x7884,0x7895,0x7885,0x7886,0x78A1,0x7883,0x7879,0x7899, + 0x7880,0x7896,0x787B,0x797C,0x7982,0x797D,0x7979,0x7A11, + 0x7A18,0x7A19,0x7A12,0x7A17,0x7A15,0x7A22,0x7A13,INVALC, + /* Block 224, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A1B,0x7A10,0x7AA3,0x7AA2,0x7A9E,0x7AEB,0x7B66,0x7B64, + 0x7B6D,0x7B74,0x7B69,0x7B72,0x7B65,0x7B73,0x7B71,0x7B70, + 0x7B61,0x7B78,0x7B76,0x7B63,0x7CB2,0x7CB4,0x7CAF,0x7D88, + 0x7D86,0x7D80,0x7D8D,0x7D7F,0x7D85,0x7D7A,0x7D8E,0x7D7B, + 0x7D83,0x7D7C,0x7D8C,0x7D94,0x7D84,0x7D7D,0x7D92,0x7F6D, + 0x7F6B,0x7F67,0x7F68,0x7F6C,0x7FA6,0x7FA5,0x7FA7,0x7FDB, + 0x7FDC,0x8021,0x8164,0x8160,0x8177,0x815C,0x8169,0x815B, + 0x8162,0x8172,0x6721,0x815E,0x8176,0x8167,0x816F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8144,0x8161,0x821D,0x8249,0x8244,0x8240,0x8242, + 0x8245,0x84F1,0x843F,0x8456,0x8476,0x8479,0x848F,0x848D, + 0x8465,0x8451,0x8440,0x8486,0x8467,0x8430,0x844D,0x847D, + 0x845A,0x8459,0x8474,0x8473,0x845D,0x8507,0x845E,0x8437, + 0x843A,0x8434,0x847A,0x8443,0x8478,0x8432,0x8445,0x8429, + 0x83D9,0x844B,0x842F,0x8442,0x842D,0x845F,0x8470,0x8439, + 0x844E,0x844C,0x8452,0x846F,0x84C5,0x848E,0x843B,0x8447, + 0x8436,0x8433,0x8468,0x847E,0x8444,0x842B,0x8460,0x8454, + 0x846E,0x8450,0x870B,0x8704,0x86F7,0x870C,0x86FA,0x86D6, + 0x86F5,0x874D,0x86F8,0x870E,0x8709,0x8701,0x86F6,0x870D, + 0x8705,0x88D6,0x88CB,0x88CD,0x88CE,0x88DE,0x88DB,0x88DA, + 0x88CC,0x88D0,0x8985,0x899B,0x89DF,0x89E5,0x89E4,INVALC, + /* Block 225, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x89E1,0x89E0,0x89E2,0x89DC,0x89E6,0x8A76,0x8A86,0x8A7F, + 0x8A61,0x8A3F,0x8A77,0x8A82,0x8A84,0x8A75,0x8A83,0x8A81, + 0x8A74,0x8A7A,0x8C3C,0x8C4B,0x8C4A,0x8C65,0x8C64,0x8C66, + 0x8C86,0x8C84,0x8C85,0x8CCC,0x8D68,0x8D69,0x8D91,0x8D8C, + 0x8D8E,0x8D8F,0x8D8D,0x8D93,0x8D94,0x8D90,0x8D92,0x8DF0, + 0x8DE0,0x8DEC,0x8DF1,0x8DEE,0x8DD0,0x8DE9,0x8DE3,0x8DE2, + 0x8DE7,0x8DF2,0x8DEB,0x8DF4,0x8F06,0x8EFF,0x8F01,0x8F00, + 0x8F05,0x8F07,0x8F08,0x8F02,0x8F0B,0x9052,0x903F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9044,0x9049,0x903D,0x9110,0x910D,0x910F,0x9111, + 0x9116,0x9114,0x910B,0x910E,0x916E,0x916F,0x9248,0x9252, + 0x9230,0x923A,0x9266,0x9233,0x9265,0x925E,0x9283,0x922E, + 0x924A,0x9246,0x926D,0x926C,0x924F,0x9260,0x9267,0x926F, + 0x9236,0x9261,0x9270,0x9231,0x9254,0x9263,0x9250,0x9272, + 0x924E,0x9253,0x924C,0x9256,0x9232,0x959F,0x959C,0x959E, + 0x959B,0x9692,0x9693,0x9691,0x9697,0x96CE,0x96FA,0x96FD, + 0x96F8,0x96F5,0x9773,0x9777,0x9778,0x9772,0x980F,0x980D, + 0x980E,0x98AC,0x98F6,0x98F9,0x99AF,0x99B2,0x99B0,0x99B5, + 0x9AAD,0x9AAB,0x9B5B,0x9CEA,0x9CED,0x9CE7,0x9E80,0x9EFD, + 0x50E6,0x50D4,0x50D7,0x50E8,0x50F3,0x50DB,0x50EA,0x50DD, + 0x50E4,0x50D3,0x50EC,0x50F0,0x50EF,0x50E3,0x50E0,INVALC, + /* Block 226, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x51D8,0x5280,0x5281,0x52E9,0x52EB,0x5330,0x53AC,0x5627, + 0x5615,0x560C,0x5612,0x55FC,0x560F,0x561C,0x5601,0x5613, + 0x5602,0x55FA,0x561D,0x5604,0x55FF,0x55F9,0x5889,0x587C, + 0x5890,0x5898,0x5886,0x5881,0x587F,0x5874,0x588B,0x587A, + 0x5887,0x5891,0x588E,0x5876,0x5882,0x5888,0x587B,0x5894, + 0x588F,0x58FE,0x596B,0x5ADC,0x5AEE,0x5AE5,0x5AD5,0x5AEA, + 0x5ADA,0x5AED,0x5AEB,0x5AF3,0x5AE2,0x5AE0,0x5ADB,0x5AEC, + 0x5ADE,0x5ADD,0x5AD9,0x5AE8,0x5ADF,0x5B77,0x5BE0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5BE3,0x5C63,0x5D82,0x5D80,0x5D7D,0x5D86,0x5D7A, + 0x5D81,0x5D77,0x5D8A,0x5D89,0x5D88,0x5D7E,0x5D7C,0x5D8D, + 0x5D79,0x5D7F,0x5E58,0x5E59,0x5E53,0x5ED8,0x5ED1,0x5ED7, + 0x5ECE,0x5EDC,0x5ED5,0x5ED9,0x5ED2,0x5ED4,0x5F44,0x5F43, + 0x5F6F,0x5FB6,0x612C,0x6128,0x6141,0x615E,0x6171,0x6173, + 0x6152,0x6153,0x6172,0x616C,0x6180,0x6174,0x6154,0x617A, + 0x615B,0x6165,0x613B,0x616A,0x6161,0x6156,0x6229,0x6227, + 0x622B,0x642B,0x644D,0x645B,0x645D,0x6474,0x6476,0x6472, + 0x6473,0x647D,0x6475,0x6466,0x64A6,0x644E,0x6482,0x645E, + 0x645C,0x644B,0x6453,0x6460,0x6450,0x647F,0x643F,0x646C, + 0x646B,0x6459,0x6465,0x6477,0x6573,0x65A0,0x66A1,0x66A0, + 0x669F,0x6705,0x6704,0x6722,0x69B1,0x69B6,0x69C9,INVALC, + /* Block 227, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x69A0,0x69CE,0x6996,0x69B0,0x69AC,0x69BC,0x6991,0x6999, + 0x698E,0x69A7,0x698D,0x69A9,0x69BE,0x69AF,0x69BF,0x69C4, + 0x69BD,0x69A4,0x69D4,0x69B9,0x69CA,0x699A,0x69CF,0x69B3, + 0x6993,0x69AA,0x69A1,0x699E,0x69D9,0x6997,0x6990,0x69C2, + 0x69B5,0x69A5,0x69C6,0x6B4A,0x6B4D,0x6B4B,0x6B9E,0x6B9F, + 0x6BA0,0x6BC3,0x6BC4,0x6BFE,0x6ECE,0x6EF5,0x6EF1,0x6F03, + 0x6F25,0x6EF8,0x6F37,0x6EFB,0x6F2E,0x6F09,0x6F4E,0x6F19, + 0x6F1A,0x6F27,0x6F18,0x6F3B,0x6F12,0x6EED,0x6F0A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F36,0x6F73,0x6EF9,0x6EEE,0x6F2D,0x6F40,0x6F30, + 0x6F3C,0x6F35,0x6EEB,0x6F07,0x6F0E,0x6F43,0x6F05,0x6EFD, + 0x6EF6,0x6F39,0x6F1C,0x6EFC,0x6F3A,0x6F1F,0x6F0D,0x6F1E, + 0x6F08,0x6F21,0x7187,0x7190,0x7189,0x7180,0x7185,0x7182, + 0x718F,0x717B,0x7186,0x7181,0x7197,0x7244,0x7253,0x7297, + 0x7295,0x7293,0x7343,0x734D,0x7351,0x734C,0x7462,0x7473, + 0x7471,0x7475,0x7472,0x7467,0x746E,0x7500,0x7502,0x7503, + 0x757D,0x7590,0x7616,0x7608,0x760C,0x7615,0x7611,0x760A, + 0x7614,0x76B8,0x7781,0x777C,0x7785,0x7782,0x776E,0x7780, + 0x776F,0x777E,0x7783,0x78B2,0x78AA,0x78B4,0x78AD,0x78A8, + 0x787E,0x78AB,0x789E,0x78A5,0x78A0,0x78AC,0x78A2,0x78A4, + 0x7998,0x798A,0x798B,0x7996,0x7995,0x7994,0x7993,INVALC, + /* Block 228, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7997,0x7988,0x7992,0x7990,0x7A2B,0x7A4A,0x7A30,0x7A2F, + 0x7A28,0x7A26,0x7AA8,0x7AAB,0x7AAC,0x7AEE,0x7B88,0x7B9C, + 0x7B8A,0x7B91,0x7B90,0x7B96,0x7B8D,0x7B8C,0x7B9B,0x7B8E, + 0x7B85,0x7B98,0x5284,0x7B99,0x7BA4,0x7B82,0x7CBB,0x7CBF, + 0x7CBC,0x7CBA,0x7DA7,0x7DB7,0x7DC2,0x7DA3,0x7DAA,0x7DC1, + 0x7DC0,0x7DC5,0x7D9D,0x7DCE,0x7DC4,0x7DC6,0x7DCB,0x7DCC, + 0x7DAF,0x7DB9,0x7D96,0x7DBC,0x7D9F,0x7DA6,0x7DAE,0x7DA9, + 0x7DA1,0x7DC9,0x7F73,0x7FE2,0x7FE3,0x7FE5,0x7FDE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8024,0x805D,0x805C,0x8189,0x8186,0x8183,0x8187, + 0x818D,0x818C,0x818B,0x8215,0x8497,0x84A4,0x84A1,0x849F, + 0x84BA,0x84CE,0x84C2,0x84AC,0x84AE,0x84AB,0x84B9,0x84B4, + 0x84C1,0x84CD,0x84AA,0x849A,0x84B1,0x84D0,0x849D,0x84A7, + 0x84BB,0x84A2,0x8494,0x84C7,0x84CC,0x849B,0x84A9,0x84AF, + 0x84A8,0x84D6,0x8498,0x84B6,0x84CF,0x84A0,0x84D7,0x84D4, + 0x84D2,0x84DB,0x84B0,0x8491,0x8661,0x8733,0x8723,0x8728, + 0x876B,0x8740,0x872E,0x871E,0x8721,0x8719,0x871B,0x8743, + 0x872C,0x8741,0x873E,0x8746,0x8720,0x8732,0x872A,0x872D, + 0x873C,0x8712,0x873A,0x8731,0x8735,0x8742,0x8726,0x8727, + 0x8738,0x8724,0x871A,0x8730,0x8711,0x88F7,0x88E7,0x88F1, + 0x88F2,0x88FA,0x88FE,0x88EE,0x88FC,0x88F6,0x88FB,INVALC, + /* Block 229, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x88F0,0x88EC,0x88EB,0x899D,0x89A1,0x899F,0x899E,0x89E9, + 0x89EB,0x89E8,0x8AAB,0x8A99,0x8A8B,0x8A92,0x8A8F,0x8A96, + 0x8C3D,0x8C68,0x8C69,0x8CD5,0x8CCF,0x8CD7,0x8D96,0x8E09, + 0x8E02,0x8DFF,0x8E0D,0x8DFD,0x8E0A,0x8E03,0x8E07,0x8E06, + 0x8E05,0x8DFE,0x8E00,0x8E04,0x8F10,0x8F11,0x8F0E,0x8F0D, + 0x9123,0x911C,0x9120,0x9122,0x911F,0x911D,0x911A,0x9124, + 0x9121,0x911B,0x917A,0x9172,0x9179,0x9173,0x92A5,0x92A4, + 0x9276,0x929B,0x927A,0x92A0,0x9294,0x92AA,0x928D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x92A6,0x929A,0x92AB,0x9279,0x9297,0x927F,0x92A3, + 0x92EE,0x928E,0x9282,0x9295,0x92A2,0x927D,0x9288,0x92A1, + 0x928A,0x9286,0x928C,0x9299,0x92A7,0x927E,0x9287,0x92A9, + 0x929D,0x928B,0x922D,0x969E,0x96A1,0x96FF,0x9758,0x977D, + 0x977A,0x977E,0x9783,0x9780,0x9782,0x977B,0x9784,0x9781, + 0x977F,0x97CE,0x97CD,0x9816,0x98AD,0x98AE,0x9902,0x9900, + 0x9907,0x999D,0x999C,0x99C3,0x99B9,0x99BB,0x99BA,0x99C2, + 0x99BD,0x99C7,0x9AB1,0x9AE3,0x9AE7,0x9B3E,0x9B3F,0x9B60, + 0x9B61,0x9B5F,0x9CF1,0x9CF2,0x9CF5,0x9EA7,0x50FF,0x5103, + 0x5130,0x50F8,0x5106,0x5107,0x50F6,0x50FE,0x510B,0x510C, + 0x50FD,0x510A,0x528B,0x528C,0x52F1,0x52EF,0x5648,0x5642, + 0x564C,0x5635,0x5641,0x564A,0x5649,0x5646,0x5658,INVALC, + /* Block 230, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x565A,0x5640,0x5633,0x563D,0x562C,0x563E,0x5638,0x562A, + 0x563A,0x571A,0x58AB,0x589D,0x58B1,0x58A0,0x58A3,0x58AF, + 0x58AC,0x58A5,0x58A1,0x58FF,0x5AFF,0x5AF4,0x5AFD,0x5AF7, + 0x5AF6,0x5B03,0x5AF8,0x5B02,0x5AF9,0x5B01,0x5B07,0x5B05, + 0x5B0F,0x5C67,0x5D99,0x5D97,0x5D9F,0x5D92,0x5DA2,0x5D93, + 0x5D95,0x5DA0,0x5D9C,0x5DA1,0x5D9A,0x5D9E,0x5E69,0x5E5D, + 0x5E60,0x5E5C,0x7DF3,0x5EDB,0x5EDE,0x5EE1,0x5F49,0x5FB2, + 0x618B,0x6183,0x6179,0x61B1,0x61B0,0x61A2,0x6189,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x619B,0x6193,0x61AF,0x61AD,0x619F,0x6192,0x61AA, + 0x61A1,0x618D,0x6166,0x61B3,0x622D,0x646E,0x6470,0x6496, + 0x64A0,0x6485,0x6497,0x649C,0x648F,0x648B,0x648A,0x648C, + 0x64A3,0x649F,0x6468,0x64B1,0x6498,0x6576,0x657A,0x6579, + 0x657B,0x65B2,0x65B3,0x66B5,0x66B0,0x66A9,0x66B2,0x66B7, + 0x66AA,0x66AF,0x6A00,0x6A06,0x6A17,0x69E5,0x69F8,0x6A15, + 0x69F1,0x69E4,0x6A20,0x69FF,0x69EC,0x69E2,0x6A1B,0x6A1D, + 0x69FE,0x6A27,0x69F2,0x69EE,0x6A14,0x69F7,0x69E7,0x6A40, + 0x6A08,0x69E6,0x69FB,0x6A0D,0x69FC,0x69EB,0x6A09,0x6A04, + 0x6A18,0x6A25,0x6A0F,0x69F6,0x6A26,0x6A07,0x69F4,0x6A16, + 0x6B51,0x6BA5,0x6BA3,0x6BA2,0x6BA6,0x6C01,0x6C00,0x6BFF, + 0x6C02,0x6F41,0x6F26,0x6F7E,0x6F87,0x6FC6,0x6F92,INVALC, + /* Block 231, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F8D,0x6F89,0x6F8C,0x6F62,0x6F4F,0x6F85,0x6F5A,0x6F96, + 0x6F76,0x6F6C,0x6F82,0x6F55,0x6F72,0x6F52,0x6F50,0x6F57, + 0x6F94,0x6F93,0x6F5D,0x6F00,0x6F61,0x6F6B,0x6F7D,0x6F67, + 0x6F90,0x6F53,0x6F8B,0x6F69,0x6F7F,0x6F95,0x6F63,0x6F77, + 0x6F6A,0x6F7B,0x71B2,0x71AF,0x719B,0x71B0,0x71A0,0x719A, + 0x71A9,0x71B5,0x719D,0x71A5,0x719E,0x71A4,0x71A1,0x71AA, + 0x719C,0x71A7,0x71B3,0x7298,0x729A,0x7358,0x7352,0x735E, + 0x735F,0x7360,0x735D,0x735B,0x7361,0x735A,0x7359,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7362,0x7487,0x7489,0x748A,0x7486,0x7481,0x747D, + 0x7485,0x7488,0x747C,0x7479,0x7508,0x7507,0x757E,0x7625, + 0x761E,0x7619,0x761D,0x761C,0x7623,0x761A,0x7628,0x761B, + 0x769C,0x769D,0x769E,0x769B,0x778D,0x778F,0x7789,0x7788, + 0x78CD,0x78BB,0x78CF,0x78CC,0x78D1,0x78CE,0x78D4,0x78C8, + 0x78C3,0x78C4,0x78C9,0x799A,0x79A1,0x79A0,0x799C,0x79A2, + 0x799B,0x6B76,0x7A39,0x7AB2,0x7AB4,0x7AB3,0x7BB7,0x7BCB, + 0x7BBE,0x7BAC,0x7BCE,0x7BAF,0x7BB9,0x7BCA,0x7BB5,0x7CC5, + 0x7CC8,0x7CCC,0x7CCB,0x7DF7,0x7DDB,0x7DEA,0x7DE7,0x7DD7, + 0x7DE1,0x7E03,0x7DFA,0x7DE6,0x7DF6,0x7DF1,0x7DF0,0x7DEE, + 0x7DDF,0x7F76,0x7FAC,0x7FB0,0x7FAD,0x7FED,0x7FEB,0x7FEA, + 0x7FEC,0x7FE6,0x7FE8,0x8064,0x8067,0x81A3,0x819F,INVALC, + /* Block 232, Array index 0x4600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x819E,0x8195,0x81A2,0x8199,0x8197,0x8216,0x824F,0x8253, + 0x8252,0x8250,0x824E,0x8251,0x8524,0x853B,0x850F,0x8500, + 0x8529,0x850E,0x8509,0x850D,0x851F,0x850A,0x8527,0x851C, + 0x84FB,0x852B,0x84FA,0x8508,0x850C,0x84F4,0x852A,0x84F2, + 0x8515,0x84F7,0x84EB,0x84F3,0x84FC,0x8512,0x84EA,0x84E9, + 0x8516,0x84FE,0x8528,0x851D,0x852E,0x8502,0x84FD,0x851E, + 0x84F6,0x8531,0x8526,0x84E7,0x84E8,0x84F0,0x84EF,0x84F9, + 0x8518,0x8520,0x8530,0x850B,0x8519,0x852F,0x8662,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8756,0x8763,0x8764,0x8777,0x87E1,0x8773,0x8758, + 0x8754,0x875B,0x8752,0x8761,0x875A,0x8751,0x875E,0x876D, + 0x876A,0x8750,0x874E,0x875F,0x875D,0x876F,0x876C,0x877A, + 0x876E,0x875C,0x8765,0x874F,0x877B,0x8775,0x8762,0x8767, + 0x8769,0x885A,0x8905,0x890C,0x8914,0x890B,0x8917,0x8918, + 0x8919,0x8906,0x8916,0x8911,0x890E,0x8909,0x89A2,0x89A4, + 0x89A3,0x89ED,0x89F0,0x89EC,0x8ACF,0x8AC6,0x8AB8,0x8AD3, + 0x8AD1,0x8AD4,0x8AD5,0x8ABB,0x8AD7,0x8ABE,0x8AC0,0x8AC5, + 0x8AD8,0x8AC3,0x8ABA,0x8ABD,0x8AD9,0x8C3E,0x8C4D,0x8C8F, + 0x8CE5,0x8CDF,0x8CD9,0x8CE8,0x8CDA,0x8CDD,0x8CE7,0x8DA0, + 0x8D9C,0x8DA1,0x8D9B,0x8E20,0x8E23,0x8E25,0x8E24,0x8E2E, + 0x8E15,0x8E1B,0x8E16,0x8E11,0x8E19,0x8E26,0x8E27,INVALC, + /* Block 233, Array index 0x4700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8E14,0x8E12,0x8E18,0x8E13,0x8E1C,0x8E17,0x8E1A,0x8F2C, + 0x8F24,0x8F18,0x8F1A,0x8F20,0x8F23,0x8F16,0x8F17,0x9073, + 0x9070,0x906F,0x9067,0x906B,0x912F,0x912B,0x9129,0x912A, + 0x9132,0x9126,0x912E,0x9185,0x9186,0x918A,0x9181,0x9182, + 0x9184,0x9180,0x92D0,0x92C3,0x92C4,0x92C0,0x92D9,0x92B6, + 0x92CF,0x92F1,0x92DF,0x92D8,0x92E9,0x92D7,0x92DD,0x92CC, + 0x92EF,0x92C2,0x92E8,0x92CA,0x92C8,0x92CE,0x92E6,0x92CD, + 0x92D5,0x92C9,0x92E0,0x92DE,0x92E7,0x92D1,0x92D3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x92B5,0x92E1,0x92C6,0x92B4,0x957C,0x95AC,0x95AB, + 0x95AE,0x95B0,0x96A4,0x96A2,0x96D3,0x9705,0x9708,0x9702, + 0x975A,0x978A,0x978E,0x9788,0x97D0,0x97CF,0x981E,0x981D, + 0x9826,0x9829,0x9828,0x9820,0x981B,0x9827,0x98B2,0x9908, + 0x98FA,0x9911,0x9914,0x9916,0x9917,0x9915,0x99DC,0x99CD, + 0x99CF,0x99D3,0x99D4,0x99CE,0x99C9,0x99D6,0x99D8,0x99CB, + 0x99D7,0x99CC,0x9AB3,0x9AEC,0x9AEB,0x9AF3,0x9AF2,0x9AF1, + 0x9B46,0x9B43,0x9B67,0x9B74,0x9B71,0x9B66,0x9B76,0x9B75, + 0x9B70,0x9B68,0x9B64,0x9B6C,0x9CFC,0x9CFA,0x9CFD,0x9CFF, + 0x9CF7,0x9D07,0x9D00,0x9CF9,0x9CFB,0x9D08,0x9D05,0x9D04, + 0x9E83,0x9ED3,0x9F0F,0x9F10,0x511C,0x5113,0x5117,0x511A, + 0x5111,0x51DE,0x5334,0x53E1,0x5670,0x5660,0x566E,INVALC, + /* Block 234, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5673,0x5666,0x5663,0x566D,0x5672,0x565E,0x5677,0x571C, + 0x571B,0x58C8,0x58BD,0x58C9,0x58BF,0x58BA,0x58C2,0x58BC, + 0x58C6,0x5B17,0x5B19,0x5B1B,0x5B21,0x5B14,0x5B13,0x5B10, + 0x5B16,0x5B28,0x5B1A,0x5B20,0x5B1E,0x5BEF,0x5DAC,0x5DB1, + 0x5DA9,0x5DA7,0x5DB5,0x5DB0,0x5DAE,0x5DAA,0x5DA8,0x5DB2, + 0x5DAD,0x5DAF,0x5DB4,0x5E67,0x5E68,0x5E66,0x5E6F,0x5EE9, + 0x5EE7,0x5EE6,0x5EE8,0x5EE5,0x5F4B,0x5FBC,0x619D,0x61A8, + 0x6196,0x61C5,0x61B4,0x61C6,0x61C1,0x61CC,0x61BA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x61BF,0x61B8,0x618C,0x64D7,0x64D6,0x64D0,0x64CF, + 0x64C9,0x64BD,0x6489,0x64C3,0x64DB,0x64F3,0x64D9,0x6533, + 0x657F,0x657C,0x65A2,0x66C8,0x66BE,0x66C0,0x66CA,0x66CB, + 0x66CF,0x66BD,0x66BB,0x66BA,0x66CC,0x6723,0x6A34,0x6A66, + 0x6A49,0x6A67,0x6A32,0x6A68,0x6A3E,0x6A5D,0x6A6D,0x6A76, + 0x6A5B,0x6A51,0x6A28,0x6A5A,0x6A3B,0x6A3F,0x6A41,0x6A6A, + 0x6A64,0x6A50,0x6A4F,0x6A54,0x6A6F,0x6A69,0x6A60,0x6A3C, + 0x6A5E,0x6A56,0x6A55,0x6A4D,0x6A4E,0x6A46,0x6B55,0x6B54, + 0x6B56,0x6BA7,0x6BAA,0x6BAB,0x6BC8,0x6BC7,0x6C04,0x6C03, + 0x6C06,0x6FAD,0x6FCB,0x6FA3,0x6FC7,0x6FBC,0x6FCE,0x6FC8, + 0x6F5E,0x6FC4,0x6FBD,0x6F9E,0x6FCA,0x6FA8,0x7004,0x6FA5, + 0x6FAE,0x6FBA,0x6FAC,0x6FAA,0x6FCF,0x6FBF,0x6FB8,INVALC, + /* Block 235, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6FA2,0x6FC9,0x6FAB,0x6FCD,0x6FAF,0x6FB2,0x6FB0,0x71C5, + 0x71C2,0x71BF,0x71B8,0x71D6,0x71C0,0x71C1,0x71CB,0x71D4, + 0x71CA,0x71C7,0x71CF,0x71BD,0x71D8,0x71BC,0x71C6,0x71DA, + 0x71DB,0x729D,0x729E,0x7369,0x7366,0x7367,0x736C,0x7365, + 0x736B,0x736A,0x747F,0x749A,0x74A0,0x7494,0x7492,0x7495, + 0x74A1,0x750B,0x7580,0x762F,0x762D,0x7631,0x763D,0x7633, + 0x763C,0x7635,0x7632,0x7630,0x76BB,0x76E6,0x779A,0x779D, + 0x77A1,0x779C,0x779B,0x77A2,0x77A3,0x7795,0x7799,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7797,0x78DD,0x78E9,0x78E5,0x78EA,0x78DE,0x78E3, + 0x78DB,0x78E1,0x78E2,0x78ED,0x78DF,0x78E0,0x79A4,0x7A44, + 0x7A48,0x7A47,0x7AB6,0x7AB8,0x7AB5,0x7AB1,0x7AB7,0x7BDE, + 0x7BE3,0x7BE7,0x7BDD,0x7BD5,0x7BE5,0x7BDA,0x7BE8,0x7BF9, + 0x7BD4,0x7BEA,0x7BE2,0x7BDC,0x7BEB,0x7BD8,0x7BDF,0x7CD2, + 0x7CD4,0x7CD7,0x7CD0,0x7CD1,0x7E12,0x7E21,0x7E17,0x7E0C, + 0x7E1F,0x7E20,0x7E13,0x7E0E,0x7E1C,0x7E15,0x7E1A,0x7E22, + 0x7E0B,0x7E0F,0x7E16,0x7E0D,0x7E14,0x7E25,0x7E24,0x7F43, + 0x7F7B,0x7F7C,0x7F7A,0x7FB1,0x7FEF,0x802A,0x8029,0x806C, + 0x81B1,0x81A6,0x81AE,0x81B9,0x81B5,0x81AB,0x81B0,0x81AC, + 0x81B4,0x81B2,0x81B7,0x81A7,0x81F2,0x8255,0x8256,0x8257, + 0x8556,0x8545,0x856B,0x854D,0x8553,0x8561,0x8558,INVALC, + /* Block 236, Array index 0x4A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8540,0x8546,0x8564,0x8541,0x8562,0x8544,0x8551,0x8547, + 0x8563,0x853E,0x855B,0x8571,0x854E,0x856E,0x8575,0x8555, + 0x8567,0x8560,0x858C,0x8566,0x855D,0x8554,0x8565,0x856C, + 0x8663,0x8665,0x8664,0x879B,0x878F,0x8797,0x8793,0x8792, + 0x8788,0x8781,0x8796,0x8798,0x8779,0x8787,0x87A3,0x8785, + 0x8790,0x8791,0x879D,0x8784,0x8794,0x879C,0x879A,0x8789, + 0x891E,0x8926,0x8930,0x892D,0x892E,0x8927,0x8931,0x8922, + 0x8929,0x8923,0x892F,0x892C,0x891F,0x89F1,0x8AE0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8AE2,0x8AF2,0x8AF4,0x8AF5,0x8ADD,0x8B14,0x8AE4, + 0x8ADF,0x8AF0,0x8AC8,0x8ADE,0x8AE1,0x8AE8,0x8AFF,0x8AEF, + 0x8AFB,0x8C91,0x8C92,0x8C90,0x8CF5,0x8CEE,0x8CF1,0x8CF0, + 0x8CF3,0x8D6C,0x8D6E,0x8DA5,0x8DA7,0x8E33,0x8E3E,0x8E38, + 0x8E40,0x8E45,0x8E36,0x8E3C,0x8E3D,0x8E41,0x8E30,0x8E3F, + 0x8EBD,0x8F36,0x8F2E,0x8F35,0x8F32,0x8F39,0x8F37,0x8F34, + 0x9076,0x9079,0x907B,0x9086,0x90FA,0x9133,0x9135,0x9136, + 0x9193,0x9190,0x9191,0x918D,0x918F,0x9327,0x931E,0x9308, + 0x931F,0x9306,0x930F,0x937A,0x9338,0x933C,0x931B,0x9323, + 0x9312,0x9301,0x9346,0x932D,0x930E,0x930D,0x92CB,0x931D, + 0x92FA,0x9325,0x9313,0x92F9,0x92F7,0x9334,0x9302,0x9324, + 0x92FF,0x9329,0x9339,0x9335,0x932A,0x9314,0x930C,INVALC, + /* Block 237, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x930B,0x92FE,0x9309,0x9300,0x92FB,0x9316,0x95BC,0x95CD, + 0x95BE,0x95B9,0x95BA,0x95B6,0x95BF,0x95B5,0x95BD,0x96A9, + 0x96D4,0x970B,0x9712,0x9710,0x9799,0x9797,0x9794,0x97F0, + 0x97F8,0x9835,0x982F,0x9832,0x9924,0x991F,0x9927,0x9929, + 0x999E,0x99EE,0x99EC,0x99E5,0x99E4,0x99F0,0x99E3,0x99EA, + 0x99E9,0x99E7,0x9AB9,0x9ABF,0x9AB4,0x9ABB,0x9AF6,0x9AFA, + 0x9AF9,0x9AF7,0x9B33,0x9B80,0x9B85,0x9B87,0x9B7C,0x9B7E, + 0x9B7B,0x9B82,0x9B93,0x9B92,0x9B90,0x9B7A,0x9B95,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9B7D,0x9B88,0x9D25,0x9D17,0x9D20,0x9D1E,0x9D14, + 0x9D29,0x9D1D,0x9D18,0x9D22,0x9D10,0x9D19,0x9D1F,0x9E88, + 0x9E86,0x9E87,0x9EAE,0x9EAD,0x9ED5,0x9ED6,0x9EFA,0x9F12, + 0x9F3D,0x5126,0x5125,0x5122,0x5124,0x5120,0x5129,0x52F4, + 0x5693,0x568C,0x568D,0x5686,0x5684,0x5683,0x567E,0x5682, + 0x567F,0x5681,0x58D6,0x58D4,0x58CF,0x58D2,0x5B2D,0x5B25, + 0x5B32,0x5B23,0x5B2C,0x5B27,0x5B26,0x5B2F,0x5B2E,0x5B7B, + 0x5BF1,0x5BF2,0x5DB7,0x5E6C,0x5E6A,0x5FBE,0x5FBB,0x61C3, + 0x61B5,0x61BC,0x61E7,0x61E0,0x61E5,0x61E4,0x61E8,0x61DE, + 0x64EF,0x64E9,0x64E3,0x64EB,0x64E4,0x64E8,0x6581,0x6580, + 0x65B6,0x65DA,0x66D2,0x6A8D,0x6A96,0x6A81,0x6AA5,0x6A89, + 0x6A9F,0x6A9B,0x6AA1,0x6A9E,0x6A87,0x6A93,0x6A8E,INVALC, + /* Block 238, Array index 0x4C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A95,0x6A83,0x6AA8,0x6AA4,0x6A91,0x6A7F,0x6AA6,0x6A9A, + 0x6A85,0x6A8C,0x6A92,0x6B5B,0x6BAD,0x6C09,0x6FCC,0x6FA9, + 0x6FF4,0x6FD4,0x6FE3,0x6FDC,0x6FED,0x6FE7,0x6FE6,0x6FDE, + 0x6FF2,0x6FDD,0x6FE2,0x6FE8,0x71E1,0x71F1,0x71E8,0x71F2, + 0x71E4,0x71F0,0x71E2,0x7373,0x736E,0x736F,0x7497,0x74B2, + 0x74AB,0x7490,0x74AA,0x74AD,0x74B1,0x74A5,0x74AF,0x7510, + 0x7511,0x7512,0x750F,0x7584,0x7643,0x7648,0x7649,0x7647, + 0x76A4,0x76E9,0x77B5,0x77AB,0x77B2,0x77B7,0x77B6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x77B4,0x77B1,0x77A8,0x77F0,0x78F3,0x78FD,0x7902, + 0x78FB,0x78FC,0x78F2,0x7905,0x78F9,0x78FE,0x7904,0x79AB, + 0x79A8,0x7A5C,0x7A5B,0x7A56,0x7A58,0x7A54,0x7A5A,0x7ABE, + 0x7AC0,0x7AC1,0x7C05,0x7C0F,0x7BF2,0x7C00,0x7BFF,0x7BFB, + 0x7C0E,0x7BF4,0x7C0B,0x7BF3,0x7C02,0x7C09,0x7C03,0x7C01, + 0x7BF8,0x7BFD,0x7C06,0x7BF0,0x7BF1,0x7C10,0x7C0A,0x7CE8, + 0x7E2D,0x7E3C,0x7E42,0x7E33,0x9848,0x7E38,0x7E2A,0x7E49, + 0x7E40,0x7E47,0x7E29,0x7E4C,0x7E30,0x7E3B,0x7E36,0x7E44, + 0x7E3A,0x7F45,0x7F7F,0x7F7E,0x7F7D,0x7FF4,0x7FF2,0x802C, + 0x81BB,0x81C4,0x81CC,0x81CA,0x81C5,0x81C7,0x81BC,0x81E9, + 0x825B,0x825A,0x825C,0x8583,0x8580,0x858F,0x85A7,0x8595, + 0x85A0,0x858B,0x85A3,0x857B,0x85A4,0x859A,0x859E,INVALC, + /* Block 239, Array index 0x4D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8577,0x857C,0x8589,0x85A1,0x857A,0x8578,0x8557,0x858E, + 0x8596,0x8586,0x858D,0x8599,0x859D,0x8581,0x85A2,0x8582, + 0x8588,0x8585,0x8579,0x8576,0x8598,0x8590,0x859F,0x8668, + 0x87BE,0x87AA,0x87AD,0x87C5,0x87B0,0x87AC,0x87B9,0x87B5, + 0x87BC,0x87AE,0x87C9,0x87C3,0x87C2,0x87CC,0x87B7,0x87AF, + 0x87C4,0x87CA,0x87B4,0x87B6,0x87BF,0x87B8,0x87BD,0x87DE, + 0x87B2,0x8935,0x8933,0x893C,0x893E,0x8941,0x8952,0x8937, + 0x8942,0x89AD,0x89AF,0x89AE,0x89F2,0x89F3,0x8B1E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8B18,0x8B16,0x8B11,0x8B05,0x8B0B,0x8B22,0x8B0F, + 0x8B12,0x8B15,0x8B07,0x8B0D,0x8B08,0x8B06,0x8B1C,0x8B13, + 0x8B1A,0x8C4F,0x8C70,0x8C72,0x8C71,0x8C6F,0x8C95,0x8C94, + 0x8CF9,0x8D6F,0x8E4E,0x8E4D,0x8E53,0x8E50,0x8E4C,0x8E47, + 0x8F43,0x8F40,0x9085,0x907E,0x9138,0x919A,0x91A2,0x919B, + 0x9199,0x919F,0x91A1,0x919D,0x91A0,0x93A1,0x9383,0x93AF, + 0x9364,0x9356,0x9347,0x937C,0x9358,0x935C,0x9376,0x9349, + 0x9350,0x9351,0x9360,0x936D,0x938F,0x934C,0x936A,0x9379, + 0x9357,0x9355,0x9352,0x934F,0x9371,0x9377,0x937B,0x9361, + 0x935E,0x9363,0x9367,0x9380,0x934E,0x9359,0x95C7,0x95C0, + 0x95C9,0x95C3,0x95C5,0x95B7,0x96AE,0x96B0,0x96AC,0x9720, + 0x971F,0x9718,0x971D,0x9719,0x979A,0x97A1,0x979C,INVALC, + /* Block 240, Array index 0x4E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x979E,0x979D,0x97D5,0x97D4,0x97F1,0x9841,0x9844,0x984A, + 0x9849,0x9845,0x9843,0x9925,0x992B,0x992C,0x992A,0x9933, + 0x9932,0x992F,0x992D,0x9931,0x9930,0x9998,0x99A3,0x99A1, + 0x9A02,0x99FA,0x99F4,0x99F7,0x99F9,0x99F8,0x99F6,0x99FB, + 0x99FD,0x99FE,0x99FC,0x9A03,0x9ABE,0x9AFE,0x9AFD,0x9B01, + 0x9AFC,0x9B48,0x9B9A,0x9BA8,0x9B9E,0x9B9B,0x9BA6,0x9BA1, + 0x9BA5,0x9BA4,0x9B86,0x9BA2,0x9BA0,0x9BAF,0x9D33,0x9D41, + 0x9D67,0x9D36,0x9D2E,0x9D2F,0x9D31,0x9D38,0x9D30,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9D45,0x9D42,0x9D43,0x9D3E,0x9D37,0x9D40,0x9D3D, + 0x7FF5,0x9D2D,0x9E8A,0x9E89,0x9E8D,0x9EB0,0x9EC8,0x9EDA, + 0x9EFB,0x9EFF,0x9F24,0x9F23,0x9F22,0x9F54,0x9FA0,0x5131, + 0x512D,0x512E,0x5698,0x569C,0x5697,0x569A,0x569D,0x5699, + 0x5970,0x5B3C,0x5C69,0x5C6A,0x5DC0,0x5E6D,0x5E6E,0x61D8, + 0x61DF,0x61ED,0x61EE,0x61F1,0x61EA,0x61F0,0x61EB,0x61D6, + 0x61E9,0x64FF,0x6504,0x64FD,0x64F8,0x6501,0x6503,0x64FC, + 0x6594,0x65DB,0x66DA,0x66DB,0x66D8,0x6AC5,0x6AB9,0x6ABD, + 0x6AE1,0x6AC6,0x6ABA,0x6AB6,0x6AB7,0x6AC7,0x6AB4,0x6AAD, + 0x6B5E,0x6BC9,0x6C0B,0x7007,0x700C,0x700D,0x7001,0x7005, + 0x7014,0x700E,0x6FFF,0x7000,0x6FFB,0x7026,0x6FFC,0x6FF7, + 0x700A,0x7201,0x71FF,0x71F9,0x7203,0x71FD,0x7376,INVALC, + /* Block 241, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x74B8,0x74C0,0x74B5,0x74C1,0x74BE,0x74B6,0x74BB,0x74C2, + 0x7514,0x7513,0x765C,0x7664,0x7659,0x7650,0x7653,0x7657, + 0x765A,0x76A6,0x76BD,0x76EC,0x77C2,0x77BA,0x78FF,0x790C, + 0x7913,0x7914,0x7909,0x7910,0x7912,0x7911,0x79AD,0x79AC, + 0x7A5F,0x7C1C,0x7C29,0x7C19,0x7C20,0x7C1F,0x7C2D,0x7C1D, + 0x7C26,0x7C28,0x7C22,0x7C25,0x7C30,0x7E5C,0x7E50,0x7E56, + 0x7E63,0x7E58,0x7E62,0x7E5F,0x7E51,0x7E60,0x7E57,0x7E53, + 0x7FB5,0x7FB3,0x7FF7,0x7FF8,0x8075,0x81D1,0x81D2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x81D0,0x825F,0x825E,0x85B4,0x85C6,0x85C0,0x85C3, + 0x85C2,0x85B3,0x85B5,0x85BD,0x85C7,0x85C4,0x85BF,0x85CB, + 0x85CE,0x85C8,0x85C5,0x85B1,0x85B6,0x85D2,0x8624,0x85B8, + 0x85B7,0x85BE,0x8669,0x87E7,0x87E6,0x87E2,0x87DB,0x87EB, + 0x87EA,0x87E5,0x87DF,0x87F3,0x87E4,0x87D4,0x87DC,0x87D3, + 0x87ED,0x87D8,0x87E3,0x87A4,0x87D7,0x87D9,0x8801,0x87F4, + 0x87E8,0x87DD,0x8953,0x894B,0x894F,0x894C,0x8946,0x8950, + 0x8951,0x8949,0x8B2A,0x8B27,0x8B23,0x8B33,0x8B30,0x8B35, + 0x8B47,0x8B2F,0x8B3C,0x8B3E,0x8B31,0x8B25,0x8B37,0x8B26, + 0x8B36,0x8B2E,0x8B24,0x8B3B,0x8B3D,0x8B3A,0x8C42,0x8C75, + 0x8C99,0x8C98,0x8C97,0x8CFE,0x8D04,0x8D02,0x8D00,0x8E5C, + 0x8E62,0x8E60,0x8E57,0x8E56,0x8E5E,0x8E65,0x8E67,INVALC, + /* Block 242, Array index 0x5000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8E5B,0x8E5A,0x8E61,0x8E5D,0x8E69,0x8E54,0x8F46,0x8F47, + 0x8F48,0x8F4B,0x9128,0x913A,0x913B,0x913E,0x91A8,0x91A5, + 0x91A7,0x91AF,0x91AA,0x93B5,0x938C,0x9392,0x93B7,0x939B, + 0x939D,0x9389,0x93A7,0x938E,0x93AA,0x939E,0x93A6,0x9395, + 0x9388,0x9399,0x939F,0x938D,0x93B1,0x9391,0x93B2,0x93A4, + 0x93A8,0x93B4,0x93A3,0x93A5,0x95D2,0x95D3,0x95D1,0x96B3, + 0x96D7,0x96DA,0x5DC2,0x96DF,0x96D8,0x96DD,0x9723,0x9722, + 0x9725,0x97AC,0x97AE,0x97A8,0x97AB,0x97A4,0x97AA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x97A2,0x97A5,0x97D7,0x97D9,0x97D6,0x97D8,0x97FA, + 0x9850,0x9851,0x9852,0x98B8,0x9941,0x993C,0x993A,0x9A0F, + 0x9A0B,0x9A09,0x9A0D,0x9A04,0x9A11,0x9A0A,0x9A05,0x9A07, + 0x9A06,0x9AC0,0x9ADC,0x9B08,0x9B04,0x9B05,0x9B29,0x9B35, + 0x9B4A,0x9B4C,0x9B4B,0x9BC7,0x9BC6,0x9BC3,0x9BBF,0x9BC1, + 0x9BB5,0x9BB8,0x9BD3,0x9BB6,0x9BC4,0x9BB9,0x9BBD,0x9D5C, + 0x9D53,0x9D4F,0x9D4A,0x9D5B,0x9D4B,0x9D59,0x9D56,0x9D4C, + 0x9D57,0x9D52,0x9D54,0x9D5F,0x9D58,0x9D5A,0x9E8E,0x9E8C, + 0x9EDF,0x9F01,0x9F00,0x9F16,0x9F25,0x9F2B,0x9F2A,0x9F29, + 0x9F28,0x9F4C,0x9F55,0x5134,0x5135,0x5296,0x52F7,0x53B4, + 0x56AB,0x56AD,0x56A6,0x56A7,0x56AA,0x56AC,0x58DA,0x58DD, + 0x58DB,0x5912,0x5B3D,0x5B3E,0x5B3F,0x5DC3,0x5E70,INVALC, + /* Block 243, Array index 0x5100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5FBF,0x61FB,0x6507,0x6510,0x650D,0x6509,0x650C,0x650E, + 0x6584,0x65DE,0x65DD,0x66DE,0x6AE7,0x6AE0,0x6ACC,0x6AD1, + 0x6AD9,0x6ACB,0x6ADF,0x6ADC,0x6AD0,0x6AEB,0x6ACF,0x6ACD, + 0x6ADE,0x6B60,0x6BB0,0x6C0C,0x7019,0x7027,0x7020,0x7016, + 0x702B,0x7021,0x7022,0x7023,0x7029,0x7017,0x7024,0x701C, + 0x702A,0x720C,0x720A,0x7207,0x7202,0x7205,0x72A5,0x72A6, + 0x72A4,0x72A3,0x72A1,0x74CB,0x74C5,0x74B7,0x74C3,0x7516, + 0x7660,0x77C9,0x77CA,0x77C4,0x77F1,0x791D,0x791B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7921,0x791C,0x7917,0x791E,0x79B0,0x7A67,0x7A68, + 0x7C33,0x7C3C,0x7C39,0x7C2C,0x7C3B,0x7CEC,0x7CEA,0x7E76, + 0x7E75,0x7E78,0x7E70,0x7E77,0x7E6F,0x7E7A,0x7E72,0x7E74, + 0x7E68,0x7F4B,0x7F4A,0x7F83,0x7F86,0x7FB7,0x7FFD,0x7FFE, + 0x8078,0x81D7,0x81D5,0x8264,0x8261,0x8263,0x85EB,0x85F1, + 0x85ED,0x85D9,0x85E1,0x85E8,0x85DA,0x85D7,0x85EC,0x85F2, + 0x85F8,0x85D8,0x85DF,0x85E3,0x85DC,0x85D1,0x85F0,0x85E6, + 0x85EF,0x85DE,0x85E2,0x8800,0x87FA,0x8803,0x87F6,0x87F7, + 0x8809,0x880C,0x880B,0x8806,0x87FC,0x8808,0x87FF,0x880A, + 0x8802,0x8962,0x895A,0x895B,0x8957,0x8961,0x895C,0x8958, + 0x895D,0x8959,0x8988,0x89B7,0x89B6,0x89F6,0x8B50,0x8B48, + 0x8B4A,0x8B40,0x8B53,0x8B56,0x8B54,0x8B4B,0x8B55,INVALC, + /* Block 244, Array index 0x5200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8B51,0x8B42,0x8B52,0x8B57,0x8C43,0x8C77,0x8C76,0x8C9A, + 0x8D06,0x8D07,0x8D09,0x8DAC,0x8DAA,0x8DAD,0x8DAB,0x8E6D, + 0x8E78,0x8E73,0x8E6A,0x8E6F,0x8E7B,0x8EC2,0x8F52,0x8F51, + 0x8F4F,0x8F50,0x8F53,0x8FB4,0x9140,0x913F,0x91B0,0x91AD, + 0x93DE,0x93C7,0x93CF,0x93C2,0x93DA,0x93D0,0x93F9,0x93EC, + 0x93CC,0x93D9,0x93A9,0x93E6,0x93CA,0x93D4,0x93EE,0x93E3, + 0x93D5,0x93C4,0x93CE,0x93C0,0x93D2,0x93E7,0x957D,0x95DA, + 0x95DB,0x96E1,0x9729,0x972B,0x972C,0x9728,0x9726,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x97B3,0x97B7,0x97B6,0x97DD,0x97DE,0x97DF,0x985C, + 0x9859,0x985D,0x9857,0x98BF,0x98BD,0x98BB,0x98BE,0x9948, + 0x9947,0x9943,0x99A6,0x99A7,0x9A1A,0x9A15,0x9A25,0x9A1D, + 0x9A24,0x9A1B,0x9A22,0x9A20,0x9A27,0x9A23,0x9A1E,0x9A1C, + 0x9A14,0x9AC2,0x9B0B,0x9B0A,0x9B0E,0x9B0C,0x9B37,0x9BEA, + 0x9BEB,0x9BE0,0x9BDE,0x9BE4,0x9BE6,0x9BE2,0x9BF0,0x9BD4, + 0x9BD7,0x9BEC,0x9BDC,0x9BD9,0x9BE5,0x9BD5,0x9BE1,0x9BDA, + 0x9D77,0x9D81,0x9D8A,0x9D84,0x9D88,0x9D71,0x9D80,0x9D78, + 0x9D86,0x9D8B,0x9D8C,0x9D7D,0x9D6B,0x9D74,0x9D75,0x9D70, + 0x9D69,0x9D85,0x9D73,0x9D7B,0x9D82,0x9D6F,0x9D79,0x9D7F, + 0x9D87,0x9D68,0x9E94,0x9E91,0x9EC0,0x9EFC,0x9F2D,0x9F40, + 0x9F41,0x9F4D,0x9F56,0x9F57,0x9F58,0x5337,0x56B2,INVALC, + /* Block 245, Array index 0x5300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x56B5,0x56B3,0x58E3,0x5B45,0x5DC6,0x5DC7,0x5EEE,0x5EEF, + 0x5FC0,0x5FC1,0x61F9,0x6517,0x6516,0x6515,0x6513,0x65DF, + 0x66E8,0x66E3,0x66E4,0x6AF3,0x6AF0,0x6AEA,0x6AE8,0x6AF9, + 0x6AF1,0x6AEE,0x6AEF,0x703C,0x7035,0x702F,0x7037,0x7034, + 0x7031,0x7042,0x7038,0x703F,0x703A,0x7039,0x7040,0x703B, + 0x7033,0x7041,0x7213,0x7214,0x72A8,0x737D,0x737C,0x74BA, + 0x76AB,0x76AA,0x76BE,0x76ED,0x77CC,0x77CE,0x77CF,0x77CD, + 0x77F2,0x7925,0x7923,0x7927,0x7928,0x7924,0x7929,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x79B2,0x7A6E,0x7A6C,0x7A6D,0x7AF7,0x7C49,0x7C48, + 0x7C4A,0x7C47,0x7C45,0x7CEE,0x7E7B,0x7E7E,0x7E81,0x7E80, + 0x7FBA,0x7FFF,0x8079,0x81DB,0x81D9,0x820B,0x8268,0x8269, + 0x8622,0x85FF,0x8601,0x85FE,0x861B,0x8600,0x85F6,0x8604, + 0x8609,0x8605,0x860C,0x85FD,0x8819,0x8810,0x8811,0x8817, + 0x8813,0x8816,0x8963,0x8966,0x89B9,0x89F7,0x8B60,0x8B6A, + 0x8B5D,0x8B68,0x8B63,0x8B65,0x8B67,0x8B6D,0x8DAE,0x8E86, + 0x8E88,0x8E84,0x8F59,0x8F56,0x8F57,0x8F55,0x8F58,0x8F5A, + 0x908D,0x9143,0x9141,0x91B7,0x91B5,0x91B2,0x91B3,0x940B, + 0x9413,0x93FB,0x9420,0x940F,0x9414,0x93FE,0x9415,0x9410, + 0x9428,0x9419,0x940D,0x93F5,0x9400,0x93F7,0x9407,0x940E, + 0x9416,0x9412,0x93FA,0x9409,0x93F8,0x940A,0x93FF,INVALC, + /* Block 246, Array index 0x5400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x93FC,0x940C,0x93F6,0x9411,0x9406,0x95DE,0x95E0,0x95DF, + 0x972E,0x972F,0x97B9,0x97BB,0x97FD,0x97FE,0x9860,0x9862, + 0x9863,0x985F,0x98C1,0x98C2,0x9950,0x994E,0x9959,0x994C, + 0x994B,0x9953,0x9A32,0x9A34,0x9A31,0x9A2C,0x9A2A,0x9A36, + 0x9A29,0x9A2E,0x9A38,0x9A2D,0x9AC7,0x9ACA,0x9AC6,0x9B10, + 0x9B12,0x9B11,0x9C0B,0x9C08,0x9BF7,0x9C05,0x9C12,0x9BF8, + 0x9C40,0x9C07,0x9C0E,0x9C06,0x9C17,0x9C14,0x9C09,0x9D9F, + 0x9D99,0x9DA4,0x9D9D,0x9D92,0x9D98,0x9D90,0x9D9B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9DA0,0x9D94,0x9D9C,0x9DAA,0x9D97,0x9DA1,0x9D9A, + 0x9DA2,0x9DA8,0x9D9E,0x9DA3,0x9DBF,0x9DA9,0x9D96,0x9DA6, + 0x9DA7,0x9E99,0x9E9B,0x9E9A,0x9EE5,0x9EE4,0x9EE7,0x9EE6, + 0x9F30,0x9F2E,0x9F5B,0x9F60,0x9F5E,0x9F5D,0x9F59,0x9F91, + 0x513A,0x5139,0x5298,0x5297,0x56C3,0x56BD,0x56BE,0x5B48, + 0x5B47,0x5DCB,0x5DCF,0x5EF1,0x61FD,0x651B,0x6B02,0x6AFC, + 0x6B03,0x6AF8,0x6B00,0x7043,0x7044,0x704A,0x7048,0x7049, + 0x7045,0x7046,0x721D,0x721A,0x7219,0x737E,0x7517,0x766A, + 0x77D0,0x792D,0x7931,0x792F,0x7C54,0x7C53,0x7CF2,0x7E8A, + 0x7E87,0x7E88,0x7E8B,0x7E86,0x7E8D,0x7F4D,0x7FBB,0x8030, + 0x81DD,0x8618,0x862A,0x8626,0x861F,0x8623,0x861C,0x8619, + 0x8627,0x862E,0x8621,0x8620,0x8629,0x861E,0x8625,INVALC, + /* Block 247, Array index 0x5500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8829,0x881D,0x881B,0x8820,0x8824,0x881C,0x882B,0x884A, + 0x896D,0x8969,0x896E,0x896B,0x89FA,0x8B79,0x8B78,0x8B45, + 0x8B7A,0x8B7B,0x8D10,0x8D14,0x8DAF,0x8E8E,0x8E8C,0x8F5E, + 0x8F5B,0x8F5D,0x9146,0x9144,0x9145,0x91B9,0x943F,0x943B, + 0x9436,0x9429,0x943D,0x943C,0x9430,0x9439,0x942A,0x9437, + 0x942C,0x9440,0x9431,0x95E5,0x95E4,0x95E3,0x9735,0x973A, + 0x97BF,0x97E1,0x9864,0x98C9,0x98C6,0x98C0,0x9958,0x9956, + 0x9A39,0x9A3D,0x9A46,0x9A44,0x9A42,0x9A41,0x9A3A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9A3F,0x9ACD,0x9B15,0x9B17,0x9B18,0x9B16,0x9B3A, + 0x9B52,0x9C2B,0x9C1D,0x9C1C,0x9C2C,0x9C23,0x9C28,0x9C29, + 0x9C24,0x9C21,0x9DB7,0x9DB6,0x9DBC,0x9DC1,0x9DC7,0x9DCA, + 0x9DCF,0x9DBE,0x9DC5,0x9DC3,0x9DBB,0x9DB5,0x9DCE,0x9DB9, + 0x9DBA,0x9DAC,0x9DC8,0x9DB1,0x9DAD,0x9DCC,0x9DB3,0x9DCD, + 0x9DB2,0x9E7A,0x9E9C,0x9EEB,0x9EEE,0x9EED,0x9F1B,0x9F18, + 0x9F1A,0x9F31,0x9F4E,0x9F65,0x9F64,0x9F92,0x4EB9,0x56C6, + 0x56C5,0x56CB,0x5971,0x5B4B,0x5B4C,0x5DD5,0x5DD1,0x5EF2, + 0x6521,0x6520,0x6526,0x6522,0x6B0B,0x6B08,0x6B09,0x6C0D, + 0x7055,0x7056,0x7057,0x7052,0x721E,0x721F,0x72A9,0x737F, + 0x74D8,0x74D5,0x74D9,0x74D7,0x766D,0x76AD,0x7935,0x79B4, + 0x7A70,0x7A71,0x7C57,0x7C5C,0x7C59,0x7C5B,0x7C5A,INVALC, + /* Block 248, Array index 0x5600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7CF4,0x7CF1,0x7E91,0x7F4F,0x7F87,0x81DE,0x826B,0x8634, + 0x8635,0x8633,0x862C,0x8632,0x8636,0x882C,0x8828,0x8826, + 0x882A,0x8825,0x8971,0x89BF,0x89BE,0x89FB,0x8B7E,0x8B84, + 0x8B82,0x8B86,0x8B85,0x8B7F,0x8D15,0x8E95,0x8E94,0x8E9A, + 0x8E92,0x8E90,0x8E96,0x8E97,0x8F60,0x8F62,0x9147,0x944C, + 0x9450,0x944A,0x944B,0x944F,0x9447,0x9445,0x9448,0x9449, + 0x9446,0x973F,0x97E3,0x986A,0x9869,0x98CB,0x9954,0x995B, + 0x9A4E,0x9A53,0x9A54,0x9A4C,0x9A4F,0x9A48,0x9A4A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9A49,0x9A52,0x9A50,0x9AD0,0x9B19,0x9B2B,0x9B3B, + 0x9B56,0x9B55,0x9C46,0x9C48,0x9C3F,0x9C44,0x9C39,0x9C33, + 0x9C41,0x9C3C,0x9C37,0x9C34,0x9C32,0x9C3D,0x9C36,0x9DDB, + 0x9DD2,0x9DDE,0x9DDA,0x9DCB,0x9DD0,0x9DDC,0x9DD1,0x9DDF, + 0x9DE9,0x9DD9,0x9DD8,0x9DD6,0x9DF5,0x9DD5,0x9DDD,0x9EB6, + 0x9EF0,0x9F35,0x9F33,0x9F32,0x9F42,0x9F6B,0x9F95,0x9FA2, + 0x513D,0x5299,0x58E8,0x58E7,0x5972,0x5B4D,0x5DD8,0x882F, + 0x5F4F,0x6201,0x6203,0x6204,0x6529,0x6525,0x6596,0x66EB, + 0x6B11,0x6B12,0x6B0F,0x6BCA,0x705B,0x705A,0x7222,0x7382, + 0x7381,0x7383,0x7670,0x77D4,0x7C67,0x7C66,0x7E95,0x826C, + 0x863A,0x8640,0x8639,0x863C,0x8631,0x863B,0x863E,0x8830, + 0x8832,0x882E,0x8833,0x8976,0x8974,0x8973,0x89FE,INVALC, + /* Block 249, Array index 0x5700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8B8C,0x8B8E,0x8B8B,0x8B88,0x8C45,0x8D19,0x8E98,0x8F64, + 0x8F63,0x91BC,0x9462,0x9455,0x945D,0x9457,0x945E,0x97C4, + 0x97C5,0x9800,0x9A56,0x9A59,0x9B1E,0x9B1F,0x9B20,0x9C52, + 0x9C58,0x9C50,0x9C4A,0x9C4D,0x9C4B,0x9C55,0x9C59,0x9C4C, + 0x9C4E,0x9DFB,0x9DF7,0x9DEF,0x9DE3,0x9DEB,0x9DF8,0x9DE4, + 0x9DF6,0x9DE1,0x9DEE,0x9DE6,0x9DF2,0x9DF0,0x9DE2,0x9DEC, + 0x9DF4,0x9DF3,0x9DE8,0x9DED,0x9EC2,0x9ED0,0x9EF2,0x9EF3, + 0x9F06,0x9F1C,0x9F38,0x9F37,0x9F36,0x9F43,0x9F4F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9F71,0x9F70,0x9F6E,0x9F6F,0x56D3,0x56CD,0x5B4E, + 0x5C6D,0x652D,0x66ED,0x66EE,0x6B13,0x705F,0x7061,0x705D, + 0x7060,0x7223,0x74DB,0x74E5,0x77D5,0x7938,0x79B7,0x79B6, + 0x7C6A,0x7E97,0x7F89,0x826D,0x8643,0x8838,0x8837,0x8835, + 0x884B,0x8B94,0x8B95,0x8E9E,0x8E9F,0x8EA0,0x8E9D,0x91BE, + 0x91BD,0x91C2,0x946B,0x9468,0x9469,0x96E5,0x9746,0x9743, + 0x9747,0x97C7,0x97E5,0x9A5E,0x9AD5,0x9B59,0x9C63,0x9C67, + 0x9C66,0x9C62,0x9C5E,0x9C60,0x9E02,0x9DFE,0x9E07,0x9E03, + 0x9E06,0x9E05,0x9E00,0x9E01,0x9E09,0x9DFF,0x9DFD,0x9E04, + 0x9EA0,0x9F1E,0x9F46,0x9F74,0x9F75,0x9F76,0x56D4,0x652E, + 0x65B8,0x6B18,0x6B19,0x6B17,0x6B1A,0x7062,0x7226,0x72AA, + 0x77D8,0x77D9,0x7939,0x7C69,0x7C6B,0x7CF6,0x7E9A,INVALC, + /* Block 250, Array index 0x5800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7E98,0x7E9B,0x7E99,0x81E0,0x81E1,0x8646,0x8647,0x8648, + 0x8979,0x897A,0x897C,0x897B,0x89FF,0x8B98,0x8B99,0x8EA5, + 0x8EA4,0x8EA3,0x946E,0x946D,0x946F,0x9471,0x9473,0x9749, + 0x9872,0x995F,0x9C68,0x9C6E,0x9C6D,0x9E0B,0x9E0D,0x9E10, + 0x9E0F,0x9E12,0x9E11,0x9EA1,0x9EF5,0x9F09,0x9F47,0x9F78, + 0x9F7B,0x9F7A,0x9F79,0x571E,0x7066,0x7C6F,0x883C,0x8DB2, + 0x8EA6,0x91C3,0x9474,0x9478,0x9476,0x9475,0x9A60,0x9C74, + 0x9C73,0x9C71,0x9C75,0x9E14,0x9E13,0x9EF6,0x9F0A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9FA4,0x7068,0x7065,0x7CF7,0x866A,0x883E,0x883D, + 0x883F,0x8B9E,0x8C9C,0x8EA9,0x8EC9,0x974B,0x9873,0x9874, + 0x98CC,0x9961,0x99AB,0x9A64,0x9A66,0x9A67,0x9B24,0x9E15, + 0x9E17,0x9F48,0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482, + 0x9480,0x9481,0x9A69,0x9A68,0x9B2E,0x9E19,0x7229,0x864B, + 0x8B9F,0x9483,0x9C79,0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D, + 0x7069,0x706A,0x9EA4,0x9F7E,0x9F49,0x9F98,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_BIG5 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit big5 -> UCS size-optimized table (28482 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_BIG5) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_big5[] = +{ + 0x00B0, /* Ranges number */ + 0x0000, /* Unranged codes number */ + 0x37A1, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0xA140, 0xA17E, 0x0213, + /* Array index: 0x0006 */ 0xA1A1, 0xA1FE, 0x0252, + /* Array index: 0x0009 */ 0xA240, 0xA27E, 0x02B0, + /* Array index: 0x000C */ 0xA2A1, 0xA2FE, 0x02EF, + /* Array index: 0x000F */ 0xA340, 0xA37E, 0x034D, + /* Array index: 0x0012 */ 0xA3A1, 0xA3BF, 0x038C, + /* Array index: 0x0015 */ 0xA440, 0xA47E, 0x03AB, + /* Array index: 0x0018 */ 0xA4A1, 0xA4FE, 0x03EA, + /* Array index: 0x001B */ 0xA540, 0xA57E, 0x0448, + /* Array index: 0x001E */ 0xA5A1, 0xA5FE, 0x0487, + /* Array index: 0x0021 */ 0xA640, 0xA67E, 0x04E5, + /* Array index: 0x0024 */ 0xA6A1, 0xA6FE, 0x0524, + /* Array index: 0x0027 */ 0xA740, 0xA77E, 0x0582, + /* Array index: 0x002A */ 0xA7A1, 0xA7FE, 0x05C1, + /* Array index: 0x002D */ 0xA840, 0xA87E, 0x061F, + /* Array index: 0x0030 */ 0xA8A1, 0xA8FE, 0x065E, + /* Array index: 0x0033 */ 0xA940, 0xA97E, 0x06BC, + /* Array index: 0x0036 */ 0xA9A1, 0xA9FE, 0x06FB, + /* Array index: 0x0039 */ 0xAA40, 0xAA7E, 0x0759, + /* Array index: 0x003C */ 0xAAA1, 0xAAFE, 0x0798, + /* Array index: 0x003F */ 0xAB40, 0xAB7E, 0x07F6, + /* Array index: 0x0042 */ 0xABA1, 0xABFE, 0x0835, + /* Array index: 0x0045 */ 0xAC40, 0xAC7E, 0x0893, + /* Array index: 0x0048 */ 0xACA1, 0xACFE, 0x08D2, + /* Array index: 0x004B */ 0xAD40, 0xAD7E, 0x0930, + /* Array index: 0x004E */ 0xADA1, 0xADFE, 0x096F, + /* Array index: 0x0051 */ 0xAE40, 0xAE7E, 0x09CD, + /* Array index: 0x0054 */ 0xAEA1, 0xAEFE, 0x0A0C, + /* Array index: 0x0057 */ 0xAF40, 0xAF7E, 0x0A6A, + /* Array index: 0x005A */ 0xAFA1, 0xAFFE, 0x0AA9, + /* Array index: 0x005D */ 0xB040, 0xB07E, 0x0B07, + /* Array index: 0x0060 */ 0xB0A1, 0xB0FE, 0x0B46, + /* Array index: 0x0063 */ 0xB140, 0xB17E, 0x0BA4, + /* Array index: 0x0066 */ 0xB1A1, 0xB1FE, 0x0BE3, + /* Array index: 0x0069 */ 0xB240, 0xB27E, 0x0C41, + /* Array index: 0x006C */ 0xB2A1, 0xB2FE, 0x0C80, + /* Array index: 0x006F */ 0xB340, 0xB37E, 0x0CDE, + /* Array index: 0x0072 */ 0xB3A1, 0xB3FE, 0x0D1D, + /* Array index: 0x0075 */ 0xB440, 0xB47E, 0x0D7B, + /* Array index: 0x0078 */ 0xB4A1, 0xB4FE, 0x0DBA, + /* Array index: 0x007B */ 0xB540, 0xB57E, 0x0E18, + /* Array index: 0x007E */ 0xB5A1, 0xB5FE, 0x0E57, + /* Array index: 0x0081 */ 0xB640, 0xB67E, 0x0EB5, + /* Array index: 0x0084 */ 0xB6A1, 0xB6FE, 0x0EF4, + /* Array index: 0x0087 */ 0xB740, 0xB77E, 0x0F52, + /* Array index: 0x008A */ 0xB7A1, 0xB7FE, 0x0F91, + /* Array index: 0x008D */ 0xB840, 0xB87E, 0x0FEF, + /* Array index: 0x0090 */ 0xB8A1, 0xB8FE, 0x102E, + /* Array index: 0x0093 */ 0xB940, 0xB97E, 0x108C, + /* Array index: 0x0096 */ 0xB9A1, 0xB9FE, 0x10CB, + /* Array index: 0x0099 */ 0xBA40, 0xBA7E, 0x1129, + /* Array index: 0x009C */ 0xBAA1, 0xBAFE, 0x1168, + /* Array index: 0x009F */ 0xBB40, 0xBB7E, 0x11C6, + /* Array index: 0x00A2 */ 0xBBA1, 0xBBFE, 0x1205, + /* Array index: 0x00A5 */ 0xBC40, 0xBC7E, 0x1263, + /* Array index: 0x00A8 */ 0xBCA1, 0xBCFE, 0x12A2, + /* Array index: 0x00AB */ 0xBD40, 0xBD7E, 0x1300, + /* Array index: 0x00AE */ 0xBDA1, 0xBDFE, 0x133F, + /* Array index: 0x00B1 */ 0xBE40, 0xBE7E, 0x139D, + /* Array index: 0x00B4 */ 0xBEA1, 0xBEFE, 0x13DC, + /* Array index: 0x00B7 */ 0xBF40, 0xBF7E, 0x143A, + /* Array index: 0x00BA */ 0xBFA1, 0xBFFE, 0x1479, + /* Array index: 0x00BD */ 0xC040, 0xC07E, 0x14D7, + /* Array index: 0x00C0 */ 0xC0A1, 0xC0FE, 0x1516, + /* Array index: 0x00C3 */ 0xC140, 0xC17E, 0x1574, + /* Array index: 0x00C6 */ 0xC1A1, 0xC1FE, 0x15B3, + /* Array index: 0x00C9 */ 0xC240, 0xC27E, 0x1611, + /* Array index: 0x00CC */ 0xC2A1, 0xC2FE, 0x1650, + /* Array index: 0x00CF */ 0xC340, 0xC37E, 0x16AE, + /* Array index: 0x00D2 */ 0xC3A1, 0xC3FE, 0x16ED, + /* Array index: 0x00D5 */ 0xC440, 0xC47E, 0x174B, + /* Array index: 0x00D8 */ 0xC4A1, 0xC4FE, 0x178A, + /* Array index: 0x00DB */ 0xC540, 0xC57E, 0x17E8, + /* Array index: 0x00DE */ 0xC5A1, 0xC5FE, 0x1827, + /* Array index: 0x00E1 */ 0xC640, 0xC67E, 0x1885, + /* Array index: 0x00E4 */ 0xC6A1, 0xC6FE, 0x18C4, + /* Array index: 0x00E7 */ 0xC740, 0xC77E, 0x1922, + /* Array index: 0x00EA */ 0xC7A1, 0xC7FC, 0x1961, + /* Array index: 0x00ED */ 0xC940, 0xC97E, 0x19BD, + /* Array index: 0x00F0 */ 0xC9A1, 0xC9FE, 0x19FC, + /* Array index: 0x00F3 */ 0xCA40, 0xCA7E, 0x1A5A, + /* Array index: 0x00F6 */ 0xCAA1, 0xCAFE, 0x1A99, + /* Array index: 0x00F9 */ 0xCB40, 0xCB7E, 0x1AF7, + /* Array index: 0x00FC */ 0xCBA1, 0xCBFE, 0x1B36, + /* Array index: 0x00FF */ 0xCC40, 0xCC7E, 0x1B94, + /* Array index: 0x0102 */ 0xCCA1, 0xCCFE, 0x1BD3, + /* Array index: 0x0105 */ 0xCD40, 0xCD7E, 0x1C31, + /* Array index: 0x0108 */ 0xCDA1, 0xCDFE, 0x1C70, + /* Array index: 0x010B */ 0xCE40, 0xCE7E, 0x1CCE, + /* Array index: 0x010E */ 0xCEA1, 0xCEFE, 0x1D0D, + /* Array index: 0x0111 */ 0xCF40, 0xCF7E, 0x1D6B, + /* Array index: 0x0114 */ 0xCFA1, 0xCFFE, 0x1DAA, + /* Array index: 0x0117 */ 0xD040, 0xD07E, 0x1E08, + /* Array index: 0x011A */ 0xD0A1, 0xD0FE, 0x1E47, + /* Array index: 0x011D */ 0xD140, 0xD17E, 0x1EA5, + /* Array index: 0x0120 */ 0xD1A1, 0xD1FE, 0x1EE4, + /* Array index: 0x0123 */ 0xD240, 0xD27E, 0x1F42, + /* Array index: 0x0126 */ 0xD2A1, 0xD2FE, 0x1F81, + /* Array index: 0x0129 */ 0xD340, 0xD37E, 0x1FDF, + /* Array index: 0x012C */ 0xD3A1, 0xD3FE, 0x201E, + /* Array index: 0x012F */ 0xD440, 0xD47E, 0x207C, + /* Array index: 0x0132 */ 0xD4A1, 0xD4FE, 0x20BB, + /* Array index: 0x0135 */ 0xD540, 0xD57E, 0x2119, + /* Array index: 0x0138 */ 0xD5A1, 0xD5FE, 0x2158, + /* Array index: 0x013B */ 0xD640, 0xD67E, 0x21B6, + /* Array index: 0x013E */ 0xD6A1, 0xD6FE, 0x21F5, + /* Array index: 0x0141 */ 0xD740, 0xD77E, 0x2253, + /* Array index: 0x0144 */ 0xD7A1, 0xD7FE, 0x2292, + /* Array index: 0x0147 */ 0xD840, 0xD87E, 0x22F0, + /* Array index: 0x014A */ 0xD8A1, 0xD8FE, 0x232F, + /* Array index: 0x014D */ 0xD940, 0xD97E, 0x238D, + /* Array index: 0x0150 */ 0xD9A1, 0xD9FE, 0x23CC, + /* Array index: 0x0153 */ 0xDA40, 0xDA7E, 0x242A, + /* Array index: 0x0156 */ 0xDAA1, 0xDAFE, 0x2469, + /* Array index: 0x0159 */ 0xDB40, 0xDB7E, 0x24C7, + /* Array index: 0x015C */ 0xDBA1, 0xDBFE, 0x2506, + /* Array index: 0x015F */ 0xDC40, 0xDC7E, 0x2564, + /* Array index: 0x0162 */ 0xDCA1, 0xDCFE, 0x25A3, + /* Array index: 0x0165 */ 0xDD40, 0xDD7E, 0x2601, + /* Array index: 0x0168 */ 0xDDA1, 0xDDFE, 0x2640, + /* Array index: 0x016B */ 0xDE40, 0xDE7E, 0x269E, + /* Array index: 0x016E */ 0xDEA1, 0xDEFE, 0x26DD, + /* Array index: 0x0171 */ 0xDF40, 0xDF7E, 0x273B, + /* Array index: 0x0174 */ 0xDFA1, 0xDFFE, 0x277A, + /* Array index: 0x0177 */ 0xE040, 0xE07E, 0x27D8, + /* Array index: 0x017A */ 0xE0A1, 0xE0FE, 0x2817, + /* Array index: 0x017D */ 0xE140, 0xE17E, 0x2875, + /* Array index: 0x0180 */ 0xE1A1, 0xE1FE, 0x28B4, + /* Array index: 0x0183 */ 0xE240, 0xE27E, 0x2912, + /* Array index: 0x0186 */ 0xE2A1, 0xE2FE, 0x2951, + /* Array index: 0x0189 */ 0xE340, 0xE37E, 0x29AF, + /* Array index: 0x018C */ 0xE3A1, 0xE3FE, 0x29EE, + /* Array index: 0x018F */ 0xE440, 0xE47E, 0x2A4C, + /* Array index: 0x0192 */ 0xE4A1, 0xE4FE, 0x2A8B, + /* Array index: 0x0195 */ 0xE540, 0xE57E, 0x2AE9, + /* Array index: 0x0198 */ 0xE5A1, 0xE5FE, 0x2B28, + /* Array index: 0x019B */ 0xE640, 0xE67E, 0x2B86, + /* Array index: 0x019E */ 0xE6A1, 0xE6FE, 0x2BC5, + /* Array index: 0x01A1 */ 0xE740, 0xE77E, 0x2C23, + /* Array index: 0x01A4 */ 0xE7A1, 0xE7FE, 0x2C62, + /* Array index: 0x01A7 */ 0xE840, 0xE87E, 0x2CC0, + /* Array index: 0x01AA */ 0xE8A1, 0xE8FE, 0x2CFF, + /* Array index: 0x01AD */ 0xE940, 0xE97E, 0x2D5D, + /* Array index: 0x01B0 */ 0xE9A1, 0xE9FE, 0x2D9C, + /* Array index: 0x01B3 */ 0xEA40, 0xEA7E, 0x2DFA, + /* Array index: 0x01B6 */ 0xEAA1, 0xEAFE, 0x2E39, + /* Array index: 0x01B9 */ 0xEB40, 0xEB7E, 0x2E97, + /* Array index: 0x01BC */ 0xEBA1, 0xEBFE, 0x2ED6, + /* Array index: 0x01BF */ 0xEC40, 0xEC7E, 0x2F34, + /* Array index: 0x01C2 */ 0xECA1, 0xECFE, 0x2F73, + /* Array index: 0x01C5 */ 0xED40, 0xED7E, 0x2FD1, + /* Array index: 0x01C8 */ 0xEDA1, 0xEDFE, 0x3010, + /* Array index: 0x01CB */ 0xEE40, 0xEE7E, 0x306E, + /* Array index: 0x01CE */ 0xEEA1, 0xEEFE, 0x30AD, + /* Array index: 0x01D1 */ 0xEF40, 0xEF7E, 0x310B, + /* Array index: 0x01D4 */ 0xEFA1, 0xEFFE, 0x314A, + /* Array index: 0x01D7 */ 0xF040, 0xF07E, 0x31A8, + /* Array index: 0x01DA */ 0xF0A1, 0xF0FE, 0x31E7, + /* Array index: 0x01DD */ 0xF140, 0xF17E, 0x3245, + /* Array index: 0x01E0 */ 0xF1A1, 0xF1FE, 0x3284, + /* Array index: 0x01E3 */ 0xF240, 0xF27E, 0x32E2, + /* Array index: 0x01E6 */ 0xF2A1, 0xF2FE, 0x3321, + /* Array index: 0x01E9 */ 0xF340, 0xF37E, 0x337F, + /* Array index: 0x01EC */ 0xF3A1, 0xF3FE, 0x33BE, + /* Array index: 0x01EF */ 0xF440, 0xF47E, 0x341C, + /* Array index: 0x01F2 */ 0xF4A1, 0xF4FE, 0x345B, + /* Array index: 0x01F5 */ 0xF540, 0xF57E, 0x34B9, + /* Array index: 0x01F8 */ 0xF5A1, 0xF5FE, 0x34F8, + /* Array index: 0x01FB */ 0xF640, 0xF67E, 0x3556, + /* Array index: 0x01FE */ 0xF6A1, 0xF6FE, 0x3595, + /* Array index: 0x0201 */ 0xF740, 0xF77E, 0x35F3, + /* Array index: 0x0204 */ 0xF7A1, 0xF7FE, 0x3632, + /* Array index: 0x0207 */ 0xF840, 0xF87E, 0x3690, + /* Array index: 0x020A */ 0xF8A1, 0xF8FE, 0x36CF, + /* Array index: 0x020D */ 0xF940, 0xF97E, 0x372D, + /* Array index: 0x0210 */ 0xF9A1, 0xF9D5, 0x376C, + /* Ranges content */ + /* Range 0xA140 - 0xA17E, array index: 0x0213 */ + 0x3000,0xFF0C,0x3001,0x3002,0xFF0E,0x2022,0xFF1B,0xFF1A, + 0xFF1F,0xFF01,0xFE30,0x2026,0x2025,0xFE50,0xFF64,0xFE52, + 0x00B7,0xFE54,0xFE55,0xFE56,0xFE57,0xFF5C,0x2013,0xFE31, + 0x2014,0xFE33,0xFFFD,0xFE34,0xFE4F,0xFF08,0xFF09,0xFE35, + 0xFE36,0xFF5B,0xFF5D,0xFE37,0xFE38,0x3014,0x3015,0xFE39, + 0xFE3A,0x3010,0x3011,0xFE3B,0xFE3C,0x300A,0x300B,0xFE3D, + 0xFE3E,0x3008,0x3009,0xFE3F,0xFE40,0x300C,0x300D,0xFE41, + 0xFE42,0x300E,0x300F,0xFE43,0xFE44,0xFE59,0xFE5A, + /* Range 0xA1A1 - 0xA1FE, array index: 0x0252 */ + 0xFE5B,0xFE5C,0xFE5D,0xFE5E,0x2018,0x2019,0x201C,0x201D, + 0x301D,0x301E,0x2035,0x2032,0xFF03,0xFF06,0xFF0A,0x203B, + 0x00A7,0x3003,0x25CB,0x25CF,0x25B3,0x25B2,0x25CE,0x2606, + 0x2605,0x25C7,0x25C6,0x25A1,0x25A0,0x25BD,0x25BC,0x32A3, + 0x2105,0x203E,0xFFFD,0xFF3F,0xFFFD,0xFE49,0xFE4A,0xFE4D, + 0xFE4E,0xFE4B,0xFE4C,0xFE5F,0xFE60,0xFE61,0xFF0B,0xFF0D, + 0x00D7,0x00F7,0x00B1,0x221A,0xFF1C,0xFF1E,0xFF1D,0x2266, + 0x2267,0x2260,0x221E,0x2252,0x2261,0xFE62,0xFE63,0xFE64, + 0xFE65,0xFE66,0x223C,0x2229,0x222A,0x22A5,0x2220,0x221F, + 0x22BF,0x33D2,0x33D1,0x222B,0x222E,0x2235,0x2234,0x2640, + 0x2642,0x2641,0x2609,0x2191,0x2193,0x2190,0x2192,0x2196, + 0x2197,0x2199,0x2198,0x2225,0x2223,0xFFFD, + /* Range 0xA240 - 0xA27E, array index: 0x02B0 */ + 0xFFFD,0xFF0F,0xFF3C,0xFF04,0x00A5,0x3012,0x00A2,0x00A3, + 0xFF05,0xFF20,0x2103,0x2109,0xFE69,0xFE6A,0xFE6B,0x33D5, + 0x339C,0x339D,0x339E,0x33CE,0x33A1,0x338E,0x338F,0x33C4, + 0x00B0,0x5159,0x515B,0x515E,0x515D,0x5161,0x5163,0x55E7, + 0x74E9,0x7CCE,0x2581,0x2582,0x2583,0x2584,0x2585,0x2586, + 0x2587,0x2588,0x258F,0x258E,0x258D,0x258C,0x258B,0x258A, + 0x2589,0x253C,0x2534,0x252C,0x2524,0x251C,0x2594,0x2500, + 0x2502,0x2595,0x250C,0x2510,0x2514,0x2518,0x256D, + /* Range 0xA2A1 - 0xA2FE, array index: 0x02EF */ + 0x256E,0x2570,0x256F,0x2550,0x255E,0x256A,0x2561,0x25E2, + 0x25E3,0x25E5,0x25E4,0x2571,0x2572,0x2573,0xFF10,0xFF11, + 0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18,0xFF19, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, + 0x2168,0x2169,0x3021,0x3022,0x3023,0x3024,0x3025,0x3026, + 0x3027,0x3028,0x3029,0xFFFD,0x5344,0xFFFD,0xFF21,0xFF22, + 0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28,0xFF29,0xFF2A, + 0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30,0xFF31,0xFF32, + 0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38,0xFF39,0xFF3A, + 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48, + 0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50, + 0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56, + /* Range 0xA340 - 0xA37E, array index: 0x034D */ + 0xFF57,0xFF58,0xFF59,0xFF5A,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C, + 0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3,0x03A4,0x03A5, + 0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2,0x03B3,0x03B4, + 0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC, + 0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3,0x03C4,0x03C5, + 0x03C6,0x03C7,0x03C8,0x03C9,0x3105,0x3106,0x3107,0x3108, + 0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F, + /* Range 0xA3A1 - 0xA3BF, array index: 0x038C */ + 0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117, + 0x3118,0x3119,0x311A,0x311B,0x311C,0x311D,0x311E,0x311F, + 0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,0x3127, + 0x3128,0x3129,0x02D9,0x02C9,0x02CA,0x02C7,0x02CB, + /* Range 0xA440 - 0xA47E, array index: 0x03AB */ + 0x4E00,0x4E59,0x4E01,0x4E03,0x4E43,0x4E5D,0x4E86,0x4E8C, + 0x4EBA,0x513F,0x5165,0x516B,0x51E0,0x5200,0x5201,0x529B, + 0x5315,0x5341,0x535C,0x53C8,0x4E09,0x4E0B,0x4E08,0x4E0A, + 0x4E2B,0x4E38,0x51E1,0x4E45,0x4E48,0x4E5F,0x4E5E,0x4E8E, + 0x4EA1,0x5140,0x5203,0x52FA,0x5343,0x53C9,0x53E3,0x571F, + 0x58EB,0x5915,0x5927,0x5973,0x5B50,0x5B51,0x5B53,0x5BF8, + 0x5C0F,0x5C22,0x5C38,0x5C71,0x5DDD,0x5DE5,0x5DF1,0x5DF2, + 0x5DF3,0x5DFE,0x5E72,0x5EFE,0x5F0B,0x5F13,0x624D, + /* Range 0xA4A1 - 0xA4FE, array index: 0x03EA */ + 0x4E11,0x4E10,0x4E0D,0x4E2D,0x4E30,0x4E39,0x4E4B,0x5C39, + 0x4E88,0x4E91,0x4E95,0x4E92,0x4E94,0x4EA2,0x4EC1,0x4EC0, + 0x4EC3,0x4EC6,0x4EC7,0x4ECD,0x4ECA,0x4ECB,0x4EC4,0x5143, + 0x5141,0x5167,0x516D,0x516E,0x516C,0x5197,0x51F6,0x5206, + 0x5207,0x5208,0x52FB,0x52FE,0x52FF,0x5316,0x5339,0x5348, + 0x5347,0x5345,0x535E,0x5384,0x53CB,0x53CA,0x53CD,0x58EC, + 0x5929,0x592B,0x592A,0x592D,0x5B54,0x5C11,0x5C24,0x5C3A, + 0x5C6F,0x5DF4,0x5E7B,0x5EFF,0x5F14,0x5F15,0x5FC3,0x6208, + 0x6236,0x624B,0x624E,0x652F,0x6587,0x6597,0x65A4,0x65B9, + 0x65E5,0x66F0,0x6708,0x6728,0x6B20,0x6B62,0x6B79,0x6BCB, + 0x6BD4,0x6BDB,0x6C0F,0x6C34,0x706B,0x722A,0x7236,0x723B, + 0x7247,0x7259,0x725B,0x72AC,0x738B,0x4E19, + /* Range 0xA540 - 0xA57E, array index: 0x0448 */ + 0x4E16,0x4E15,0x4E14,0x4E18,0x4E3B,0x4E4D,0x4E4F,0x4E4E, + 0x4EE5,0x4ED8,0x4ED4,0x4ED5,0x4ED6,0x4ED7,0x4EE3,0x4EE4, + 0x4ED9,0x4EDE,0x5145,0x5144,0x5189,0x518A,0x51AC,0x51F9, + 0x51FA,0x51F8,0x520A,0x52A0,0x529F,0x5305,0x5306,0x5317, + 0x531D,0x4EDF,0x534A,0x5349,0x5361,0x5360,0x536F,0x536E, + 0x53BB,0x53EF,0x53E4,0x53F3,0x53EC,0x53EE,0x53E9,0x53E8, + 0x53FC,0x53F8,0x53F5,0x53EB,0x53E6,0x53EA,0x53F2,0x53F1, + 0x53F0,0x53E5,0x53ED,0x53FB,0x56DB,0x56DA,0x5916, + /* Range 0xA5A1 - 0xA5FE, array index: 0x0487 */ + 0x592E,0x5931,0x5974,0x5976,0x5B55,0x5B83,0x5C3C,0x5DE8, + 0x5DE7,0x5DE6,0x5E02,0x5E03,0x5E73,0x5E7C,0x5F01,0x5F18, + 0x5F17,0x5FC5,0x620A,0x6253,0x6254,0x6252,0x6251,0x65A5, + 0x65E6,0x672E,0x672C,0x672A,0x672B,0x672D,0x6B63,0x6BCD, + 0x6C11,0x6C10,0x6C38,0x6C41,0x6C40,0x6C3E,0x72AF,0x7384, + 0x7389,0x74DC,0x74E6,0x7518,0x751F,0x7528,0x7529,0x7530, + 0x7531,0x7532,0x7533,0x758B,0x767D,0x76AE,0x76BF,0x76EE, + 0x77DB,0x77E2,0x77F3,0x793A,0x79BE,0x7A74,0x7ACB,0x4E1E, + 0x4E1F,0x4E52,0x4E53,0x4E69,0x4E99,0x4EA4,0x4EA6,0x4EA5, + 0x4EFF,0x4F09,0x4F19,0x4F0A,0x4F15,0x4F0D,0x4F10,0x4F11, + 0x4F0F,0x4EF2,0x4EF6,0x4EFB,0x4EF0,0x4EF3,0x4EFD,0x4F01, + 0x4F0B,0x5149,0x5147,0x5146,0x5148,0x5168, + /* Range 0xA640 - 0xA67E, array index: 0x04E5 */ + 0x5171,0x518D,0x51B0,0x5217,0x5211,0x5212,0x520E,0x5216, + 0x52A3,0x5308,0x5321,0x5320,0x5370,0x5371,0x5409,0x540F, + 0x540C,0x540A,0x5410,0x5401,0x540B,0x5404,0x5411,0x540D, + 0x5408,0x5403,0x540E,0x5406,0x5412,0x56E0,0x56DE,0x56DD, + 0x5733,0x5730,0x5728,0x572D,0x572C,0x572F,0x5729,0x5919, + 0x591A,0x5937,0x5938,0x5984,0x5978,0x5983,0x597D,0x5979, + 0x5982,0x5981,0x5B57,0x5B58,0x5B87,0x5B88,0x5B85,0x5B89, + 0x5BFA,0x5C16,0x5C79,0x5DDE,0x5E06,0x5E76,0x5E74, + /* Range 0xA6A1 - 0xA6FE, array index: 0x0524 */ + 0x5F0F,0x5F1B,0x5FD9,0x5FD6,0x620E,0x620C,0x620D,0x6210, + 0x6263,0x625B,0x6258,0x6536,0x65E9,0x65E8,0x65EC,0x65ED, + 0x66F2,0x66F3,0x6709,0x673D,0x6734,0x6731,0x6735,0x6B21, + 0x6B64,0x6B7B,0x6C16,0x6C5D,0x6C57,0x6C59,0x6C5F,0x6C60, + 0x6C50,0x6C55,0x6C61,0x6C5B,0x6C4D,0x6C4E,0x7070,0x725F, + 0x725D,0x767E,0x7AF9,0x7C73,0x7CF8,0x7F36,0x7F8A,0x7FBD, + 0x8001,0x8003,0x800C,0x8012,0x8033,0x807F,0x8089,0x808B, + 0x808C,0x81E3,0x81EA,0x81F3,0x81FC,0x820C,0x821B,0x821F, + 0x826E,0x8272,0x827E,0x866B,0x8840,0x884C,0x8863,0x897F, + 0x9621,0x4E32,0x4EA8,0x4F4D,0x4F4F,0x4F47,0x4F57,0x4F5E, + 0x4F34,0x4F5B,0x4F55,0x4F30,0x4F50,0x4F51,0x4F3D,0x4F3A, + 0x4F38,0x4F43,0x4F54,0x4F3C,0x4F46,0x4F63, + /* Range 0xA740 - 0xA77E, array index: 0x0582 */ + 0x4F5C,0x4F60,0x4F2F,0x4F4E,0x4F36,0x4F59,0x4F5D,0x4F48, + 0x4F5A,0x514C,0x514B,0x514D,0x5175,0x51B6,0x51B7,0x5225, + 0x5224,0x5229,0x522A,0x5228,0x52AB,0x52A9,0x52AA,0x52AC, + 0x5323,0x5373,0x5375,0x541D,0x542D,0x541E,0x543E,0x5426, + 0x544E,0x5427,0x5446,0x5443,0x5433,0x5448,0x5442,0x541B, + 0x5429,0x544A,0x5439,0x543B,0x5438,0x542E,0x5435,0x5436, + 0x5420,0x543C,0x5440,0x5431,0x542B,0x541F,0x542C,0x56EA, + 0x56F0,0x56E4,0x56EB,0x574A,0x5751,0x5740,0x574D, + /* Range 0xA7A1 - 0xA7FE, array index: 0x05C1 */ + 0x5747,0x574E,0x573E,0x5750,0x574F,0x573B,0x58EF,0x593E, + 0x599D,0x5992,0x59A8,0x599E,0x59A3,0x5999,0x5996,0x598D, + 0x59A4,0x5993,0x598A,0x59A5,0x5B5D,0x5B5C,0x5B5A,0x5B5B, + 0x5B8C,0x5B8B,0x5B8F,0x5C2C,0x5C40,0x5C41,0x5C3F,0x5C3E, + 0x5C90,0x5C91,0x5C94,0x5C8C,0x5DEB,0x5E0C,0x5E8F,0x5E87, + 0x5E8A,0x5EF7,0x5F04,0x5F1F,0x5F64,0x5F62,0x5F77,0x5F79, + 0x5FD8,0x5FCC,0x5FD7,0x5FCD,0x5FF1,0x5FEB,0x5FF8,0x5FEA, + 0x6212,0x6211,0x6284,0x6297,0x6296,0x6280,0x6276,0x6289, + 0x626D,0x628A,0x627C,0x627E,0x6279,0x6273,0x6292,0x626F, + 0x6298,0x626E,0x6295,0x6293,0x6291,0x6286,0x6539,0x653B, + 0x6538,0x65F1,0x66F4,0x675F,0x674E,0x674F,0x6750,0x6751, + 0x675C,0x6756,0x675E,0x6749,0x6746,0x6760, + /* Range 0xA840 - 0xA87E, array index: 0x061F */ + 0x6753,0x6757,0x6B65,0x6BCF,0x6C42,0x6C5E,0x6C99,0x6C81, + 0x6C88,0x6C89,0x6C85,0x6C9B,0x6C6A,0x6C7A,0x6C90,0x6C70, + 0x6C8C,0x6C68,0x6C96,0x6C92,0x6C7D,0x6C83,0x6C72,0x6C7E, + 0x6C74,0x6C86,0x6C76,0x6C8D,0x6C94,0x6C98,0x6C82,0x7076, + 0x707C,0x707D,0x7078,0x7262,0x7261,0x7260,0x72C4,0x72C2, + 0x7396,0x752C,0x752B,0x7537,0x7538,0x7682,0x76EF,0x77E3, + 0x79C1,0x79C0,0x79BF,0x7A76,0x7CFB,0x7F55,0x8096,0x8093, + 0x809D,0x8098,0x809B,0x809A,0x80B2,0x826F,0x8292, + /* Range 0xA8A1 - 0xA8FE, array index: 0x065E */ + 0x828B,0x828D,0x898B,0x89D2,0x8A00,0x8C37,0x8C46,0x8C55, + 0x8C9D,0x8D64,0x8D70,0x8DB3,0x8EAB,0x8ECA,0x8F9B,0x8FB0, + 0x8FC2,0x8FC6,0x8FC5,0x8FC4,0x5DE1,0x9091,0x90A2,0x90AA, + 0x90A6,0x90A3,0x9149,0x91C6,0x91CC,0x9632,0x962E,0x9631, + 0x962A,0x962C,0x4E26,0x4E56,0x4E73,0x4E8B,0x4E9B,0x4E9E, + 0x4EAB,0x4EAC,0x4F6F,0x4F9D,0x4F8D,0x4F73,0x4F7F,0x4F6C, + 0x4F9B,0x4F8B,0x4F86,0x4F83,0x4F70,0x4F75,0x4F88,0x4F69, + 0x4F7B,0x4F96,0x4F7E,0x4F8F,0x4F91,0x4F7A,0x5154,0x5152, + 0x5155,0x5169,0x5177,0x5176,0x5178,0x51BD,0x51FD,0x523B, + 0x5238,0x5237,0x523A,0x5230,0x522E,0x5236,0x5241,0x52BE, + 0x52BB,0x5352,0x5354,0x5353,0x5351,0x5366,0x5377,0x5378, + 0x5379,0x53D6,0x53D4,0x53D7,0x5473,0x5475, + /* Range 0xA940 - 0xA97E, array index: 0x06BC */ + 0x5496,0x5478,0x5495,0x5480,0x547B,0x5477,0x5484,0x5492, + 0x5486,0x547C,0x5490,0x5471,0x5476,0x548C,0x549A,0x5462, + 0x5468,0x548B,0x547D,0x548E,0x56FA,0x5783,0x5777,0x576A, + 0x5769,0x5761,0x5766,0x5764,0x577C,0x591C,0x5949,0x5947, + 0x5948,0x5944,0x5954,0x59BE,0x59BB,0x59D4,0x59B9,0x59AE, + 0x59D1,0x59C6,0x59D0,0x59CD,0x59CB,0x59D3,0x59CA,0x59AF, + 0x59B3,0x59D2,0x59C5,0x5B5F,0x5B64,0x5B63,0x5B97,0x5B9A, + 0x5B98,0x5B9C,0x5B99,0x5B9B,0x5C1A,0x5C48,0x5C45, + /* Range 0xA9A1 - 0xA9FE, array index: 0x06FB */ + 0x5C46,0x5CB7,0x5CA1,0x5CB8,0x5CA9,0x5CAB,0x5CB1,0x5CB3, + 0x5E18,0x5E1A,0x5E16,0x5E15,0x5E1B,0x5E11,0x5E78,0x5E9A, + 0x5E97,0x5E9C,0x5E95,0x5E96,0x5EF6,0x5F26,0x5F27,0x5F29, + 0x5F80,0x5F81,0x5F7F,0x5F7C,0x5FDD,0x5FE0,0x5FFD,0x5FF5, + 0x5FFF,0x600F,0x6014,0x602F,0x6035,0x6016,0x602A,0x6015, + 0x6021,0x6027,0x6029,0x602B,0x601B,0x6216,0x6215,0x623F, + 0x623E,0x6240,0x627F,0x62C9,0x62CC,0x62C4,0x62BF,0x62C2, + 0x62B9,0x62D2,0x62DB,0x62AB,0x62D3,0x62D4,0x62CB,0x62C8, + 0x62A8,0x62BD,0x62BC,0x62D0,0x62D9,0x62C7,0x62CD,0x62B5, + 0x62DA,0x62B1,0x62D8,0x62D6,0x62D7,0x62C6,0x62AC,0x62CE, + 0x653E,0x65A7,0x65BC,0x65FA,0x6614,0x6613,0x660C,0x6606, + 0x6602,0x660E,0x6600,0x660F,0x6615,0x660A, + /* Range 0xAA40 - 0xAA7E, array index: 0x0759 */ + 0x6607,0x670D,0x670B,0x676D,0x678B,0x6795,0x6771,0x679C, + 0x6773,0x6777,0x6787,0x679D,0x6797,0x676F,0x6770,0x677F, + 0x6789,0x677E,0x6790,0x6775,0x679A,0x6793,0x677C,0x676A, + 0x6772,0x6B23,0x6B66,0x6B67,0x6B7F,0x6C13,0x6C1B,0x6CE3, + 0x6CE8,0x6CF3,0x6CB1,0x6CCC,0x6CE5,0x6CB3,0x6CBD,0x6CBE, + 0x6CBC,0x6CE2,0x6CAB,0x6CD5,0x6CD3,0x6CB8,0x6CC4,0x6CB9, + 0x6CC1,0x6CAE,0x6CD7,0x6CC5,0x6CF1,0x6CBF,0x6CBB,0x6CE1, + 0x6CDB,0x6CCA,0x6CAC,0x6CEF,0x6CDC,0x6CD6,0x6CE0, + /* Range 0xAAA1 - 0xAAFE, array index: 0x0798 */ + 0x7095,0x708E,0x7092,0x708A,0x7099,0x722C,0x722D,0x7238, + 0x7248,0x7267,0x7269,0x72C0,0x72CE,0x72D9,0x72D7,0x72D0, + 0x73A9,0x73A8,0x739F,0x73AB,0x73A5,0x753D,0x759D,0x7599, + 0x759A,0x7684,0x76C2,0x76F2,0x76F4,0x77E5,0x77FD,0x793E, + 0x7940,0x7941,0x79C9,0x79C8,0x7A7A,0x7A79,0x7AFA,0x7CFE, + 0x7F54,0x7F8C,0x7F8B,0x8005,0x80BA,0x80A5,0x80A2,0x80B1, + 0x80A1,0x80AB,0x80A9,0x80B4,0x80AA,0x80AF,0x81E5,0x81FE, + 0x820D,0x82B3,0x829D,0x8299,0x82AD,0x82BD,0x829F,0x82B9, + 0x82B1,0x82AC,0x82A5,0x82AF,0x82B8,0x82A3,0x82B0,0x82BE, + 0x82B7,0x864E,0x8671,0x521D,0x8868,0x8ECB,0x8FCE,0x8FD4, + 0x8FD1,0x90B5,0x90B8,0x90B1,0x90B6,0x91C7,0x91D1,0x9577, + 0x9580,0x961C,0x9640,0x963F,0x963B,0x9644, + /* Range 0xAB40 - 0xAB7E, array index: 0x07F6 */ + 0x9642,0x96B9,0x96E8,0x9752,0x975E,0x4E9F,0x4EAD,0x4EAE, + 0x4FE1,0x4FB5,0x4FAF,0x4FBF,0x4FE0,0x4FD1,0x4FCF,0x4FDD, + 0x4FC3,0x4FB6,0x4FD8,0x4FDF,0x4FCA,0x4FD7,0x4FAE,0x4FD0, + 0x4FC4,0x4FC2,0x4FDA,0x4FCE,0x4FDE,0x4FB7,0x5157,0x5192, + 0x5191,0x51A0,0x524E,0x5243,0x524A,0x524D,0x524C,0x524B, + 0x5247,0x52C7,0x52C9,0x52C3,0x52C1,0x530D,0x5357,0x537B, + 0x539A,0x53DB,0x54AC,0x54C0,0x54A8,0x54CE,0x54C9,0x54B8, + 0x54A6,0x54B3,0x54C7,0x54C2,0x54BD,0x54AA,0x54C1, + /* Range 0xABA1 - 0xABFE, array index: 0x0835 */ + 0x54C4,0x54C8,0x54AF,0x54AB,0x54B1,0x54BB,0x54A9,0x54A7, + 0x54BF,0x56FF,0x5782,0x578B,0x57A0,0x57A3,0x57A2,0x57CE, + 0x57AE,0x5793,0x5955,0x5951,0x594F,0x594E,0x5950,0x59DC, + 0x59D8,0x59FF,0x59E3,0x59E8,0x5A03,0x59E5,0x59EA,0x59DA, + 0x59E6,0x5A01,0x59FB,0x5B69,0x5BA3,0x5BA6,0x5BA4,0x5BA2, + 0x5BA5,0x5C01,0x5C4E,0x5C4F,0x5C4D,0x5C4B,0x5CD9,0x5CD2, + 0x5DF7,0x5E1D,0x5E25,0x5E1F,0x5E7D,0x5EA0,0x5EA6,0x5EFA, + 0x5F08,0x5F2D,0x5F65,0x5F88,0x5F85,0x5F8A,0x5F8B,0x5F87, + 0x5F8C,0x5F89,0x6012,0x601D,0x6020,0x6025,0x600E,0x6028, + 0x604D,0x6070,0x6068,0x6062,0x6046,0x6043,0x606C,0x606B, + 0x606A,0x6064,0x6241,0x62DC,0x6316,0x6309,0x62FC,0x62ED, + 0x6301,0x62EE,0x62FD,0x6307,0x62F1,0x62F7, + /* Range 0xAC40 - 0xAC7E, array index: 0x0893 */ + 0x62EF,0x62EC,0x62FE,0x62F4,0x6311,0x6302,0x653F,0x6545, + 0x65AB,0x65BD,0x65E2,0x6625,0x662D,0x6620,0x6627,0x662F, + 0x661F,0x6628,0x6631,0x6624,0x66F7,0x67FF,0x67D3,0x67F1, + 0x67D4,0x67D0,0x67EC,0x67B6,0x67AF,0x67F5,0x67E9,0x67EF, + 0x67C4,0x67D1,0x67B4,0x67DA,0x67E5,0x67B8,0x67CF,0x67DE, + 0x67F3,0x67B0,0x67D9,0x67E2,0x67DD,0x67D2,0x6B6A,0x6B83, + 0x6B86,0x6BB5,0x6BD2,0x6BD7,0x6C1F,0x6CC9,0x6D0B,0x6D32, + 0x6D2A,0x6D41,0x6D25,0x6D0C,0x6D31,0x6D1E,0x6D17, + /* Range 0xACA1 - 0xACFE, array index: 0x08D2 */ + 0x6D3B,0x6D3D,0x6D3E,0x6D36,0x6D1B,0x6CF5,0x6D39,0x6D27, + 0x6D38,0x6D29,0x6D2E,0x6D35,0x6D0E,0x6D2B,0x70AB,0x70BA, + 0x70B3,0x70AC,0x70AF,0x70AD,0x70B8,0x70AE,0x70A4,0x7230, + 0x7272,0x726F,0x7274,0x72E9,0x72E0,0x72E1,0x73B7,0x73CA, + 0x73BB,0x73B2,0x73CD,0x73C0,0x73B3,0x751A,0x752D,0x754F, + 0x754C,0x754E,0x754B,0x75AB,0x75A4,0x75A5,0x75A2,0x75A3, + 0x7678,0x7686,0x7687,0x7688,0x76C8,0x76C6,0x76C3,0x76C5, + 0x7701,0x76F9,0x76F8,0x7709,0x770B,0x76FE,0x76FC,0x7707, + 0x77DC,0x7802,0x7814,0x780C,0x780D,0x7946,0x7949,0x7948, + 0x7947,0x79B9,0x79BA,0x79D1,0x79D2,0x79CB,0x7A7F,0x7A81, + 0x7AFF,0x7AFD,0x7C7D,0x7D02,0x7D05,0x7D00,0x7D09,0x7D07, + 0x7D04,0x7D06,0x7F38,0x7F8E,0x7FBF,0x8004, + /* Range 0xAD40 - 0xAD7E, array index: 0x0930 */ + 0x8010,0x800D,0x8011,0x8036,0x80D6,0x80E5,0x80DA,0x80C3, + 0x80C4,0x80CC,0x80E1,0x80DB,0x80CE,0x80DE,0x80E4,0x80DD, + 0x81F4,0x8222,0x82E7,0x8303,0x8305,0x82E3,0x82DB,0x82E6, + 0x8304,0x82E5,0x8302,0x8309,0x82D2,0x82D7,0x82F1,0x8301, + 0x82DC,0x82D4,0x82D1,0x82DE,0x82D3,0x82DF,0x82EF,0x8306, + 0x8650,0x8679,0x867B,0x867A,0x884D,0x886B,0x8981,0x89D4, + 0x8A08,0x8A02,0x8A03,0x8C9E,0x8CA0,0x8D74,0x8D73,0x8DB4, + 0x8ECD,0x8ECC,0x8FF0,0x8FE6,0x8FE2,0x8FEA,0x8FE5, + /* Range 0xADA1 - 0xADFE, array index: 0x096F */ + 0x8FED,0x8FEB,0x8FE4,0x8FE8,0x90CA,0x90CE,0x90C1,0x90C3, + 0x914B,0x914A,0x91CD,0x9582,0x9650,0x964B,0x964C,0x964D, + 0x9762,0x9769,0x97CB,0x97ED,0x97F3,0x9801,0x98A8,0x98DB, + 0x98DF,0x9996,0x9999,0x4E58,0x4EB3,0x500C,0x500D,0x5023, + 0x4FEF,0x5026,0x5025,0x4FF8,0x5029,0x5016,0x5006,0x503C, + 0x501F,0x501A,0x5012,0x5011,0x4FFA,0x5000,0x5014,0x5028, + 0x4FF1,0x5021,0x500B,0x5019,0x5018,0x4FF3,0x4FEE,0x502D, + 0x502A,0x4FFE,0x502B,0x5009,0x517C,0x51A4,0x51A5,0x51A2, + 0x51CD,0x51CC,0x51C6,0x51CB,0x5256,0x525C,0x5254,0x525B, + 0x525D,0x532A,0x537F,0x539F,0x539D,0x53DF,0x54E8,0x5510, + 0x5501,0x5537,0x54FC,0x54E5,0x54F2,0x5506,0x54FA,0x5514, + 0x54E9,0x54ED,0x54E1,0x5509,0x54EE,0x54EA, + /* Range 0xAE40 - 0xAE7E, array index: 0x09CD */ + 0x54E6,0x5527,0x5507,0x54FD,0x550F,0x5703,0x5704,0x57C2, + 0x57D4,0x57CB,0x57C3,0x5809,0x590F,0x5957,0x5958,0x595A, + 0x5A11,0x5A18,0x5A1C,0x5A1F,0x5A1B,0x5A13,0x59EC,0x5A20, + 0x5A23,0x5A29,0x5A25,0x5A0C,0x5A09,0x5B6B,0x5C58,0x5BB0, + 0x5BB3,0x5BB6,0x5BB4,0x5BAE,0x5BB5,0x5BB9,0x5BB8,0x5C04, + 0x5C51,0x5C55,0x5C50,0x5CED,0x5CFD,0x5CFB,0x5CEA,0x5CE8, + 0x5CF0,0x5CF6,0x5D01,0x5CF4,0x5DEE,0x5E2D,0x5E2B,0x5EAB, + 0x5EAD,0x5EA7,0x5F31,0x5F92,0x5F91,0x5F90,0x6059, + /* Range 0xAEA1 - 0xAEFE, array index: 0x0A0C */ + 0x6063,0x6065,0x6050,0x6055,0x606D,0x6069,0x606F,0x6084, + 0x609F,0x609A,0x608D,0x6094,0x608C,0x6085,0x6096,0x6247, + 0x62F3,0x6308,0x62FF,0x634E,0x633E,0x632F,0x6355,0x6342, + 0x6346,0x634F,0x6349,0x633A,0x6350,0x633D,0x632A,0x632B, + 0x6328,0x634D,0x634C,0x6548,0x6549,0x6599,0x65C1,0x65C5, + 0x6642,0x6649,0x664F,0x6643,0x6652,0x664C,0x6645,0x6641, + 0x66F8,0x6714,0x6715,0x6717,0x6821,0x6838,0x6848,0x6846, + 0x6853,0x6839,0x6842,0x6854,0x6829,0x68B3,0x6817,0x684C, + 0x6851,0x683D,0x67F4,0x6850,0x6840,0x683C,0x6843,0x682A, + 0x6845,0x6813,0x6818,0x6841,0x6B8A,0x6B89,0x6BB7,0x6C23, + 0x6C27,0x6C28,0x6C26,0x6C24,0x6CF0,0x6D6A,0x6D95,0x6D88, + 0x6D87,0x6D66,0x6D78,0x6D77,0x6D59,0x6D93, + /* Range 0xAF40 - 0xAF7E, array index: 0x0A6A */ + 0x6D6C,0x6D89,0x6D6E,0x6D5A,0x6D74,0x6D69,0x6D8C,0x6D8A, + 0x6D79,0x6D85,0x6D65,0x6D94,0x70CA,0x70D8,0x70E4,0x70D9, + 0x70C8,0x70CF,0x7239,0x7279,0x72FC,0x72F9,0x72FD,0x72F8, + 0x72F7,0x7386,0x73ED,0x7409,0x73EE,0x73E0,0x73EA,0x73DE, + 0x7554,0x755D,0x755C,0x755A,0x7559,0x75BE,0x75C5,0x75C7, + 0x75B2,0x75B3,0x75BD,0x75BC,0x75B9,0x75C2,0x75B8,0x768B, + 0x76B0,0x76CA,0x76CD,0x76CE,0x7729,0x771F,0x7720,0x7728, + 0x77E9,0x7830,0x7827,0x7838,0x781D,0x7834,0x7837, + /* Range 0xAFA1 - 0xAFFE, array index: 0x0AA9 */ + 0x7825,0x782D,0x7820,0x781F,0x7832,0x7955,0x7950,0x7960, + 0x795F,0x7956,0x795E,0x795D,0x7957,0x795A,0x79E4,0x79E3, + 0x79E7,0x79DF,0x79E6,0x79E9,0x79D8,0x7A84,0x7A88,0x7AD9, + 0x7B06,0x7B11,0x7C89,0x7D21,0x7D17,0x7D0B,0x7D0A,0x7D20, + 0x7D22,0x7D14,0x7D10,0x7D15,0x7D1A,0x7D1C,0x7D0D,0x7D19, + 0x7D1B,0x7F3A,0x7F5F,0x7F94,0x7FC5,0x7FC1,0x8006,0x8018, + 0x8015,0x8019,0x8017,0x803D,0x803F,0x80F1,0x8102,0x80F0, + 0x8105,0x80ED,0x80F4,0x8106,0x80F8,0x80F3,0x8108,0x80FD, + 0x810A,0x80FC,0x80EF,0x81ED,0x81EC,0x8200,0x8210,0x822A, + 0x822B,0x8228,0x822C,0x82BB,0x832B,0x8352,0x8354,0x834A, + 0x8338,0x8350,0x8349,0x8335,0x8334,0x834F,0x8332,0x8339, + 0x8336,0x8317,0x8340,0x8331,0x8328,0x8343, + /* Range 0xB040 - 0xB07E, array index: 0x0B07 */ + 0x8654,0x868A,0x86AA,0x8693,0x86A4,0x86A9,0x868C,0x86A3, + 0x869C,0x8870,0x8877,0x8881,0x8882,0x887D,0x8879,0x8A18, + 0x8A10,0x8A0E,0x8A0C,0x8A15,0x8A0A,0x8A17,0x8A13,0x8A16, + 0x8A0F,0x8A11,0x8C48,0x8C7A,0x8C79,0x8CA1,0x8CA2,0x8D77, + 0x8EAC,0x8ED2,0x8ED4,0x8ECF,0x8FB1,0x9001,0x9006,0x8FF7, + 0x9000,0x8FFA,0x8FF4,0x9003,0x8FFD,0x9005,0x8FF8,0x9095, + 0x90E1,0x90DD,0x90E2,0x9152,0x914D,0x914C,0x91D8,0x91DD, + 0x91D7,0x91DC,0x91D9,0x9583,0x9662,0x9663,0x9661, + /* Range 0xB0A1 - 0xB0FE, array index: 0x0B46 */ + 0x965B,0x965D,0x9664,0x9658,0x965E,0x96BB,0x98E2,0x99AC, + 0x9AA8,0x9AD8,0x9B25,0x9B32,0x9B3C,0x4E7E,0x507A,0x507D, + 0x505C,0x5047,0x5043,0x504C,0x505A,0x5049,0x5065,0x5076, + 0x504E,0x5055,0x5075,0x5074,0x5077,0x504F,0x500F,0x506F, + 0x506D,0x515C,0x5195,0x51F0,0x526A,0x526F,0x52D2,0x52D9, + 0x52D8,0x52D5,0x5310,0x530F,0x5319,0x533F,0x5340,0x533E, + 0x53C3,0x66FC,0x5546,0x556A,0x5566,0x5544,0x555E,0x5561, + 0x5543,0x554A,0x5531,0x5556,0x554F,0x5555,0x552F,0x5564, + 0x5538,0x552E,0x555C,0x552C,0x5563,0x5533,0x5541,0x5557, + 0x5708,0x570B,0x5709,0x57DF,0x5805,0x580A,0x5806,0x57E0, + 0x57E4,0x57FA,0x5802,0x5835,0x57F7,0x57F9,0x5920,0x5962, + 0x5A36,0x5A41,0x5A49,0x5A66,0x5A6A,0x5A40, + /* Range 0xB140 - 0xB17E, array index: 0x0BA4 */ + 0x5A3C,0x5A62,0x5A5A,0x5A46,0x5A4A,0x5B70,0x5BC7,0x5BC5, + 0x5BC4,0x5BC2,0x5BBF,0x5BC6,0x5C09,0x5C08,0x5C07,0x5C60, + 0x5C5C,0x5C5D,0x5D07,0x5D06,0x5D0E,0x5D1B,0x5D16,0x5D22, + 0x5D11,0x5D29,0x5D14,0x5D19,0x5D24,0x5D27,0x5D17,0x5DE2, + 0x5E38,0x5E36,0x5E33,0x5E37,0x5EB7,0x5EB8,0x5EB6,0x5EB5, + 0x5EBE,0x5F35,0x5F37,0x5F57,0x5F6C,0x5F69,0x5F6B,0x5F97, + 0x5F99,0x5F9E,0x5F98,0x5FA1,0x5FA0,0x5F9C,0x607F,0x60A3, + 0x6089,0x60A0,0x60A8,0x60CB,0x60B4,0x60E6,0x60BD, + /* Range 0xB1A1 - 0xB1FE, array index: 0x0BE3 */ + 0x60C5,0x60BB,0x60B5,0x60DC,0x60BC,0x60D8,0x60D5,0x60C6, + 0x60DF,0x60B8,0x60DA,0x60C7,0x621A,0x621B,0x6248,0x63A0, + 0x63A7,0x6372,0x6396,0x63A2,0x63A5,0x6377,0x6367,0x6398, + 0x63AA,0x6371,0x63A9,0x6389,0x6383,0x639B,0x636B,0x63A8, + 0x6384,0x6388,0x6399,0x63A1,0x63AC,0x6392,0x638F,0x6380, + 0x637B,0x6369,0x6368,0x637A,0x655D,0x6556,0x6551,0x6559, + 0x6557,0x555F,0x654F,0x6558,0x6555,0x6554,0x659C,0x659B, + 0x65AC,0x65CF,0x65CB,0x65CC,0x65CE,0x665D,0x665A,0x6664, + 0x6668,0x6666,0x665E,0x66F9,0x52D7,0x671B,0x6881,0x68AF, + 0x68A2,0x6893,0x68B5,0x687F,0x6876,0x68B1,0x68A7,0x6897, + 0x68B0,0x6883,0x68C4,0x68AD,0x6886,0x6885,0x6894,0x689D, + 0x68A8,0x689F,0x68A1,0x6882,0x6B32,0x6BBA, + /* Range 0xB240 - 0xB27E, array index: 0x0C41 */ + 0x6BEB,0x6BEC,0x6C2B,0x6D8E,0x6DBC,0x6DF3,0x6DD9,0x6DB2, + 0x6DE1,0x6DCC,0x6DE4,0x6DFB,0x6DFA,0x6E05,0x6DC7,0x6DCB, + 0x6DAF,0x6DD1,0x6DAE,0x6DDE,0x6DF9,0x6DB8,0x6DF7,0x6DF5, + 0x6DC5,0x6DD2,0x6E1A,0x6DB5,0x6DDA,0x6DEB,0x6DD8,0x6DEA, + 0x6DF1,0x6DEE,0x6DE8,0x6DC6,0x6DC4,0x6DAA,0x6DEC,0x6DBF, + 0x6DE6,0x70F9,0x7109,0x710A,0x70FD,0x70EF,0x723D,0x727D, + 0x7281,0x731C,0x731B,0x7316,0x7313,0x7319,0x7387,0x7405, + 0x740A,0x7403,0x7406,0x73FE,0x740D,0x74E0,0x74F6, + /* Range 0xB2A1 - 0xB2FE, array index: 0x0C80 */ + 0x74F7,0x751C,0x7522,0x7565,0x7566,0x7562,0x7570,0x758F, + 0x75D4,0x75D5,0x75B5,0x75CA,0x75CD,0x768E,0x76D4,0x76D2, + 0x76DB,0x7737,0x773E,0x773C,0x7736,0x7738,0x773A,0x786B, + 0x7843,0x784E,0x7965,0x7968,0x796D,0x79FB,0x7A92,0x7A95, + 0x7B20,0x7B28,0x7B1B,0x7B2C,0x7B26,0x7B19,0x7B1E,0x7B2E, + 0x7C92,0x7C97,0x7C95,0x7D46,0x7D43,0x7D71,0x7D2E,0x7D39, + 0x7D3C,0x7D40,0x7D30,0x7D33,0x7D44,0x7D2F,0x7D42,0x7D32, + 0x7D31,0x7F3D,0x7F9E,0x7F9A,0x7FCC,0x7FCE,0x7FD2,0x801C, + 0x804A,0x8046,0x812F,0x8116,0x8123,0x812B,0x8129,0x8130, + 0x8124,0x8202,0x8235,0x8237,0x8236,0x8239,0x838E,0x839E, + 0x8398,0x8378,0x83A2,0x8396,0x83BD,0x83AB,0x8392,0x838A, + 0x8393,0x8389,0x83A0,0x8377,0x837B,0x837C, + /* Range 0xB340 - 0xB37E, array index: 0x0CDE */ + 0x8386,0x83A7,0x8655,0x5F6A,0x86C7,0x86C0,0x86B6,0x86C4, + 0x86B5,0x86C6,0x86CB,0x86B1,0x86AF,0x86C9,0x8853,0x889E, + 0x8888,0x88AB,0x8892,0x8896,0x888D,0x888B,0x8993,0x898F, + 0x8A2A,0x8A1D,0x8A23,0x8A25,0x8A31,0x8A2D,0x8A1F,0x8A1B, + 0x8A22,0x8C49,0x8C5A,0x8CA9,0x8CAC,0x8CAB,0x8CA8,0x8CAA, + 0x8CA7,0x8D67,0x8D66,0x8DBE,0x8DBA,0x8EDB,0x8EDF,0x9019, + 0x900D,0x901A,0x9017,0x9023,0x901F,0x901D,0x9010,0x9015, + 0x901E,0x9020,0x900F,0x9022,0x9016,0x901B,0x9014, + /* Range 0xB3A1 - 0xB3FE, array index: 0x0D1D */ + 0x90E8,0x90ED,0x90FD,0x9157,0x91CE,0x91F5,0x91E6,0x91E3, + 0x91E7,0x91ED,0x91E9,0x9589,0x966A,0x9675,0x9673,0x9678, + 0x9670,0x9674,0x9676,0x9677,0x966C,0x96C0,0x96EA,0x96E9, + 0x7AE0,0x7ADF,0x9802,0x9803,0x9B5A,0x9CE5,0x9E75,0x9E7F, + 0x9EA5,0x9EBB,0x50A2,0x508D,0x5085,0x5099,0x5091,0x5080, + 0x5096,0x5098,0x509A,0x6700,0x51F1,0x5272,0x5274,0x5275, + 0x5269,0x52DE,0x52DD,0x52DB,0x535A,0x53A5,0x557B,0x5580, + 0x55A7,0x557C,0x558A,0x559D,0x5598,0x5582,0x559C,0x55AA, + 0x5594,0x5587,0x558B,0x5583,0x55B3,0x55AE,0x559F,0x553E, + 0x55B2,0x559A,0x55BB,0x55AC,0x55B1,0x557E,0x5589,0x55AB, + 0x5599,0x570D,0x582F,0x582A,0x5834,0x5824,0x5830,0x5831, + 0x5821,0x581D,0x5820,0x58F9,0x58FA,0x5960, + /* Range 0xB440 - 0xB47E, array index: 0x0D7B */ + 0x5A77,0x5A9A,0x5A7F,0x5A92,0x5A9B,0x5AA7,0x5B73,0x5B71, + 0x5BD2,0x5BCC,0x5BD3,0x5BD0,0x5C0A,0x5C0B,0x5C31,0x5D4C, + 0x5D50,0x5D34,0x5D47,0x5DFD,0x5E45,0x5E3D,0x5E40,0x5E43, + 0x5E7E,0x5ECA,0x5EC1,0x5EC2,0x5EC4,0x5F3C,0x5F6D,0x5FA9, + 0x5FAA,0x5FA8,0x60D1,0x60E1,0x60B2,0x60B6,0x60E0,0x611C, + 0x6123,0x60FA,0x6115,0x60F0,0x60FB,0x60F4,0x6168,0x60F1, + 0x610E,0x60F6,0x6109,0x6100,0x6112,0x621F,0x6249,0x63A3, + 0x638C,0x63CF,0x63C0,0x63E9,0x63C9,0x63C6,0x63CD, + /* Range 0xB4A1 - 0xB4FE, array index: 0x0DBA */ + 0x63D2,0x63E3,0x63D0,0x63E1,0x63D6,0x63ED,0x63EE,0x6376, + 0x63F4,0x63EA,0x63DB,0x6452,0x63DA,0x63F9,0x655E,0x6566, + 0x6562,0x6563,0x6591,0x6590,0x65AF,0x666E,0x6670,0x6674, + 0x6676,0x666F,0x6691,0x667A,0x667E,0x6677,0x66FE,0x66FF, + 0x671F,0x671D,0x68FA,0x68D5,0x68E0,0x68D8,0x68D7,0x6905, + 0x68DF,0x68F5,0x68EE,0x68E7,0x68F9,0x68D2,0x68F2,0x68E3, + 0x68CB,0x68CD,0x690D,0x6912,0x690E,0x68C9,0x68DA,0x696E, + 0x68FB,0x6B3E,0x6B3A,0x6B3D,0x6B98,0x6B96,0x6BBC,0x6BEF, + 0x6C2E,0x6C2F,0x6C2C,0x6E2F,0x6E38,0x6E54,0x6E21,0x6E32, + 0x6E67,0x6E4A,0x6E20,0x6E25,0x6E23,0x6E1B,0x6E5B,0x6E58, + 0x6E24,0x6E56,0x6E6E,0x6E2D,0x6E26,0x6E6F,0x6E34,0x6E4D, + 0x6E3A,0x6E2C,0x6E43,0x6E1D,0x6E3E,0x6ECB, + /* Range 0xB540 - 0xB57E, array index: 0x0E18 */ + 0x6E89,0x6E19,0x6E4E,0x6E63,0x6E44,0x6E72,0x6E69,0x6E5F, + 0x7119,0x711A,0x7126,0x7130,0x7121,0x7136,0x716E,0x711C, + 0x724C,0x7284,0x7280,0x7336,0x7325,0x7334,0x7329,0x743A, + 0x742A,0x7433,0x7422,0x7425,0x7435,0x7436,0x7434,0x742F, + 0x741B,0x7426,0x7428,0x7525,0x7526,0x756B,0x756A,0x75E2, + 0x75DB,0x75E3,0x75D9,0x75D8,0x75DE,0x75E0,0x767B,0x767C, + 0x7696,0x7693,0x76B4,0x76DC,0x774F,0x77ED,0x785D,0x786C, + 0x786F,0x7A0D,0x7A08,0x7A0B,0x7A05,0x7A00,0x7A98, + /* Range 0xB5A1 - 0xB5FE, array index: 0x0E57 */ + 0x7A97,0x7A96,0x7AE5,0x7AE3,0x7B49,0x7B56,0x7B46,0x7B50, + 0x7B52,0x7B54,0x7B4D,0x7B4B,0x7B4F,0x7B51,0x7C9F,0x7CA5, + 0x7D5E,0x7D50,0x7D68,0x7D55,0x7D2B,0x7D6E,0x7D72,0x7D61, + 0x7D66,0x7D62,0x7D70,0x7D73,0x5584,0x7FD4,0x7FD5,0x800B, + 0x8052,0x8085,0x8155,0x8154,0x814B,0x8151,0x814E,0x8139, + 0x8146,0x813E,0x814C,0x8153,0x8174,0x8212,0x821C,0x83E9, + 0x8403,0x83F8,0x840D,0x83E0,0x83C5,0x840B,0x83C1,0x83EF, + 0x83F1,0x83F4,0x8457,0x840A,0x83F0,0x840C,0x83CC,0x83FD, + 0x83F2,0x83CA,0x8438,0x840E,0x8404,0x83DC,0x8407,0x83D4, + 0x83DF,0x865B,0x86DF,0x86D9,0x86ED,0x86D4,0x86DB,0x86E4, + 0x86D0,0x86DE,0x8857,0x88C1,0x88C2,0x88B1,0x8983,0x8996, + 0x8A3B,0x8A60,0x8A55,0x8A5E,0x8A3C,0x8A41, + /* Range 0xB640 - 0xB67E, array index: 0x0EB5 */ + 0x8A54,0x8A5B,0x8A50,0x8A46,0x8A34,0x8A3A,0x8A36,0x8A56, + 0x8C61,0x8C82,0x8CAF,0x8CBC,0x8CB3,0x8CBD,0x8CC1,0x8CBB, + 0x8CC0,0x8CB4,0x8CB7,0x8CB6,0x8CBF,0x8CB8,0x8D8A,0x8D85, + 0x8D81,0x8DCE,0x8DDD,0x8DCB,0x8DDA,0x8DD1,0x8DCC,0x8DDB, + 0x8DC6,0x8EFB,0x8EF8,0x8EFC,0x8F9C,0x902E,0x9035,0x9031, + 0x9038,0x9032,0x9036,0x9102,0x90F5,0x9109,0x90FE,0x9163, + 0x9165,0x91CF,0x9214,0x9215,0x9223,0x9209,0x921E,0x920D, + 0x9210,0x9207,0x9211,0x9594,0x958F,0x958B,0x9591, + /* Range 0xB6A1 - 0xB6FE, array index: 0x0EF4 */ + 0x9593,0x9592,0x958E,0x968A,0x968E,0x968B,0x967D,0x9685, + 0x9686,0x968D,0x9672,0x9684,0x96C1,0x96C5,0x96C4,0x96C6, + 0x96C7,0x96EF,0x96F2,0x97CC,0x9805,0x9806,0x9808,0x98E7, + 0x98EA,0x98EF,0x98E9,0x98F2,0x98ED,0x99AE,0x99AD,0x9EC3, + 0x9ECD,0x9ED1,0x4E82,0x50AD,0x50B5,0x50B2,0x50B3,0x50C5, + 0x50BE,0x50AC,0x50B7,0x50BB,0x50AF,0x50C7,0x527F,0x5277, + 0x527D,0x52DF,0x52E6,0x52E4,0x52E2,0x52E3,0x532F,0x55DF, + 0x55E8,0x55D3,0x55E6,0x55CE,0x55DC,0x55C7,0x55D1,0x55E3, + 0x55E4,0x55EF,0x55DA,0x55E1,0x55C5,0x55C6,0x55E5,0x55C9, + 0x5712,0x5713,0x585E,0x5851,0x5858,0x5857,0x585A,0x5854, + 0x586B,0x584C,0x586D,0x584A,0x5862,0x5852,0x584B,0x5967, + 0x5AC1,0x5AC9,0x5ACC,0x5ABE,0x5ABD,0x5ABC, + /* Range 0xB740 - 0xB77E, array index: 0x0F52 */ + 0x5AB3,0x5AC2,0x5AB2,0x5D69,0x5D6F,0x5E4C,0x5E79,0x5EC9, + 0x5EC8,0x5F12,0x5F59,0x5FAC,0x5FAE,0x611A,0x610F,0x6148, + 0x611F,0x60F3,0x611B,0x60F9,0x6101,0x6108,0x614E,0x614C, + 0x6144,0x614D,0x613E,0x6134,0x6127,0x610D,0x6106,0x6137, + 0x6221,0x6222,0x6413,0x643E,0x641E,0x642A,0x642D,0x643D, + 0x642C,0x640F,0x641C,0x6414,0x640D,0x6436,0x6416,0x6417, + 0x6406,0x656C,0x659F,0x65B0,0x6697,0x6689,0x6687,0x6688, + 0x6696,0x6684,0x6698,0x668D,0x6703,0x6994,0x696D, + /* Range 0xB7A1 - 0xB7FE, array index: 0x0F91 */ + 0x695A,0x6977,0x6960,0x6954,0x6975,0x6930,0x6982,0x694A, + 0x6968,0x696B,0x695E,0x6953,0x6979,0x6986,0x695D,0x6963, + 0x695B,0x6B47,0x6B72,0x6BC0,0x6BBF,0x6BD3,0x6BFD,0x6EA2, + 0x6EAF,0x6ED3,0x6EB6,0x6EC2,0x6E90,0x6E9D,0x6EC7,0x6EC5, + 0x6EA5,0x6E98,0x6EBC,0x6EBA,0x6EAB,0x6ED1,0x6E96,0x6E9C, + 0x6EC4,0x6ED4,0x6EAA,0x6EA7,0x6EB4,0x714E,0x7159,0x7169, + 0x7164,0x7149,0x7167,0x715C,0x716C,0x7166,0x714C,0x7165, + 0x715E,0x7146,0x7168,0x7156,0x723A,0x7252,0x7337,0x7345, + 0x733F,0x733E,0x746F,0x745A,0x7455,0x745F,0x745E,0x7441, + 0x743F,0x7459,0x745B,0x745C,0x7576,0x7578,0x7600,0x75F0, + 0x7601,0x75F2,0x75F1,0x75FA,0x75FF,0x75F4,0x75F3,0x76DE, + 0x76DF,0x775B,0x776B,0x7766,0x775E,0x7763, + /* Range 0xB840 - 0xB87E, array index: 0x0FEF */ + 0x7779,0x776A,0x776C,0x775C,0x7765,0x7768,0x7762,0x77EE, + 0x788E,0x78B0,0x7897,0x7898,0x788C,0x7889,0x787C,0x7891, + 0x7893,0x787F,0x797A,0x797F,0x7981,0x842C,0x79BD,0x7A1C, + 0x7A1A,0x7A20,0x7A14,0x7A1F,0x7A1E,0x7A9F,0x7AA0,0x7B77, + 0x7BC0,0x7B60,0x7B6E,0x7B67,0x7CB1,0x7CB3,0x7CB5,0x7D93, + 0x7D79,0x7D91,0x7D81,0x7D8F,0x7D5B,0x7F6E,0x7F69,0x7F6A, + 0x7F72,0x7FA9,0x7FA8,0x7FA4,0x8056,0x8058,0x8086,0x8084, + 0x8171,0x8170,0x8178,0x8165,0x816E,0x8173,0x816B, + /* Range 0xB8A1 - 0xB8FE, array index: 0x102E */ + 0x8179,0x817A,0x8166,0x8205,0x8247,0x8482,0x8477,0x843D, + 0x8431,0x8475,0x8466,0x846B,0x8449,0x846C,0x845B,0x843C, + 0x8435,0x8461,0x8463,0x8469,0x846D,0x8446,0x865E,0x865C, + 0x865F,0x86F9,0x8713,0x8708,0x8707,0x8700,0x86FE,0x86FB, + 0x8702,0x8703,0x8706,0x870A,0x8859,0x88DF,0x88D4,0x88D9, + 0x88DC,0x88D8,0x88DD,0x88E1,0x88CA,0x88D5,0x88D2,0x899C, + 0x89E3,0x8A6B,0x8A72,0x8A73,0x8A66,0x8A69,0x8A70,0x8A87, + 0x8A7C,0x8A63,0x8AA0,0x8A71,0x8A85,0x8A6D,0x8A62,0x8A6E, + 0x8A6C,0x8A79,0x8A7B,0x8A3E,0x8A68,0x8C62,0x8C8A,0x8C89, + 0x8CCA,0x8CC7,0x8CC8,0x8CC4,0x8CB2,0x8CC3,0x8CC2,0x8CC5, + 0x8DE1,0x8DDF,0x8DE8,0x8DEF,0x8DF3,0x8DFA,0x8DEA,0x8DE4, + 0x8DE6,0x8EB2,0x8F03,0x8F09,0x8EFE,0x8F0A, + /* Range 0xB940 - 0xB97E, array index: 0x108C */ + 0x8F9F,0x8FB2,0x904B,0x904A,0x9053,0x9042,0x9054,0x903C, + 0x9055,0x9050,0x9047,0x904F,0x904E,0x904D,0x9051,0x903E, + 0x9041,0x9112,0x9117,0x916C,0x916A,0x9169,0x91C9,0x9237, + 0x9257,0x9238,0x923D,0x9240,0x923E,0x925B,0x924B,0x9264, + 0x9251,0x9234,0x9249,0x924D,0x9245,0x9239,0x923F,0x925A, + 0x9598,0x9698,0x9694,0x9695,0x96CD,0x96CB,0x96C9,0x96CA, + 0x96F7,0x96FB,0x96F9,0x96F6,0x9756,0x9774,0x9776,0x9810, + 0x9811,0x9813,0x980A,0x9812,0x980C,0x98FC,0x98F4, + /* Range 0xB9A1 - 0xB9FE, array index: 0x10CB */ + 0x98FD,0x98FE,0x99B3,0x99B1,0x99B4,0x9AE1,0x9CE9,0x9E82, + 0x9F0E,0x9F13,0x9F20,0x50E7,0x50EE,0x50E5,0x50D6,0x50ED, + 0x50DA,0x50D5,0x50CF,0x50D1,0x50F1,0x50CE,0x50E9,0x5162, + 0x51F3,0x5283,0x5282,0x5331,0x53AD,0x55FE,0x5600,0x561B, + 0x5617,0x55FD,0x5614,0x5606,0x5609,0x560D,0x560E,0x55F7, + 0x5616,0x561F,0x5608,0x5610,0x55F6,0x5718,0x5716,0x5875, + 0x587E,0x5883,0x5893,0x588A,0x5879,0x5885,0x587D,0x58FD, + 0x5925,0x5922,0x5924,0x596A,0x5969,0x5AE1,0x5AE6,0x5AE9, + 0x5AD7,0x5AD6,0x5AD8,0x5AE3,0x5B75,0x5BDE,0x5BE7,0x5BE1, + 0x5BE5,0x5BE6,0x5BE8,0x5BE2,0x5BE4,0x5BDF,0x5C0D,0x5C62, + 0x5D84,0x5D87,0x5E5B,0x5E63,0x5E55,0x5E57,0x5E54,0x5ED3, + 0x5ED6,0x5F0A,0x5F46,0x5F70,0x5FB9,0x6147, + /* Range 0xBA40 - 0xBA7E, array index: 0x1129 */ + 0x613F,0x614B,0x6177,0x6162,0x6163,0x615F,0x615A,0x6158, + 0x6175,0x622A,0x6487,0x6458,0x6454,0x64A4,0x6478,0x645F, + 0x647A,0x6451,0x6467,0x6434,0x646D,0x647B,0x6572,0x65A1, + 0x65D7,0x65D6,0x66A2,0x66A8,0x669D,0x699C,0x69A8,0x6995, + 0x69C1,0x69AE,0x69D3,0x69CB,0x699B,0x69B7,0x69BB,0x69AB, + 0x69B4,0x69D0,0x69CD,0x69AD,0x69CC,0x69A6,0x69C3,0x69A3, + 0x6B49,0x6B4C,0x6C33,0x6F33,0x6F14,0x6EFE,0x6F13,0x6EF4, + 0x6F29,0x6F3E,0x6F20,0x6F2C,0x6F0F,0x6F02,0x6F22, + /* Range 0xBAA1 - 0xBAFE, array index: 0x1168 */ + 0x6EFF,0x6EEF,0x6F06,0x6F31,0x6F38,0x6F32,0x6F23,0x6F15, + 0x6F2B,0x6F2F,0x6F88,0x6F2A,0x6EEC,0x6F01,0x6EF2,0x6ECC, + 0x6EF7,0x7194,0x7199,0x717D,0x718A,0x7184,0x7192,0x723E, + 0x7292,0x7296,0x7344,0x7350,0x7464,0x7463,0x746A,0x7470, + 0x746D,0x7504,0x7591,0x7627,0x760D,0x760B,0x7609,0x7613, + 0x76E1,0x76E3,0x7784,0x777D,0x777F,0x7761,0x78C1,0x789F, + 0x78A7,0x78B3,0x78A9,0x78A3,0x798E,0x798F,0x798D,0x7A2E, + 0x7A31,0x7AAA,0x7AA9,0x7AED,0x7AEF,0x7BA1,0x7B95,0x7B8B, + 0x7B75,0x7B97,0x7B9D,0x7B94,0x7B8F,0x7BB8,0x7B87,0x7B84, + 0x7CB9,0x7CBD,0x7CBE,0x7DBB,0x7DB0,0x7D9C,0x7DBD,0x7DBE, + 0x7DA0,0x7DCA,0x7DB4,0x7DB2,0x7DB1,0x7DBA,0x7DA2,0x7DBF, + 0x7DB5,0x7DB8,0x7DAD,0x7DD2,0x7DC7,0x7DAC, + /* Range 0xBB40 - 0xBB7E, array index: 0x11C6 */ + 0x7F70,0x7FE0,0x7FE1,0x7FDF,0x805E,0x805A,0x8087,0x8150, + 0x8180,0x818F,0x8188,0x818A,0x817F,0x8182,0x81E7,0x81FA, + 0x8207,0x8214,0x821E,0x824B,0x84C9,0x84BF,0x84C6,0x84C4, + 0x8499,0x849E,0x84B2,0x849C,0x84CB,0x84B8,0x84C0,0x84D3, + 0x8490,0x84BC,0x84D1,0x84CA,0x873F,0x871C,0x873B,0x8722, + 0x8725,0x8734,0x8718,0x8755,0x8737,0x8729,0x88F3,0x8902, + 0x88F4,0x88F9,0x88F8,0x88FD,0x88E8,0x891A,0x88EF,0x8AA6, + 0x8A8C,0x8A9E,0x8AA3,0x8A8D,0x8AA1,0x8A93,0x8AA4, + /* Range 0xBBA1 - 0xBBFE, array index: 0x1205 */ + 0x8AAA,0x8AA5,0x8AA8,0x8A98,0x8A91,0x8A9A,0x8AA7,0x8C6A, + 0x8C8D,0x8C8C,0x8CD3,0x8CD1,0x8CD2,0x8D6B,0x8D99,0x8D95, + 0x8DFC,0x8F14,0x8F12,0x8F15,0x8F13,0x8FA3,0x9060,0x9058, + 0x905C,0x9063,0x9059,0x905E,0x9062,0x905D,0x905B,0x9119, + 0x9118,0x911E,0x9175,0x9178,0x9177,0x9174,0x9278,0x9280, + 0x9285,0x9298,0x9296,0x927B,0x9293,0x929C,0x92A8,0x927C, + 0x9291,0x95A1,0x95A8,0x95A9,0x95A3,0x95A5,0x95A4,0x9699, + 0x969C,0x969B,0x96CC,0x96D2,0x9700,0x977C,0x9785,0x97F6, + 0x9817,0x9818,0x98AF,0x98B1,0x9903,0x9905,0x990C,0x9909, + 0x99C1,0x9AAF,0x9AB0,0x9AE6,0x9B41,0x9B42,0x9CF4,0x9CF6, + 0x9CF3,0x9EBC,0x9F3B,0x9F4A,0x5104,0x5100,0x50FB,0x50F5, + 0x50F9,0x5102,0x5108,0x5109,0x5105,0x51DC, + /* Range 0xBC40 - 0xBC7E, array index: 0x1263 */ + 0x5287,0x5288,0x5289,0x528D,0x528A,0x52F0,0x53B2,0x562E, + 0x563B,0x5639,0x5632,0x563F,0x5634,0x5629,0x5653,0x564E, + 0x5657,0x5674,0x5636,0x562F,0x5630,0x5880,0x589F,0x589E, + 0x58B3,0x589C,0x58AE,0x58A9,0x58A6,0x596D,0x5B09,0x5AFB, + 0x5B0B,0x5AF5,0x5B0C,0x5B08,0x5BEE,0x5BEC,0x5BE9,0x5BEB, + 0x5C64,0x5C65,0x5D9D,0x5D94,0x5E62,0x5E5F,0x5E61,0x5EE2, + 0x5EDA,0x5EDF,0x5EDD,0x5EE3,0x5EE0,0x5F48,0x5F71,0x5FB7, + 0x5FB5,0x6176,0x6167,0x616E,0x615D,0x6155,0x6182, + /* Range 0xBCA1 - 0xBCFE, array index: 0x12A2 */ + 0x617C,0x6170,0x616B,0x617E,0x61A7,0x6190,0x61AB,0x618E, + 0x61AC,0x619A,0x61A4,0x6194,0x61AE,0x622E,0x6469,0x646F, + 0x6479,0x649E,0x64B2,0x6488,0x6490,0x64B0,0x64A5,0x6493, + 0x6495,0x64A9,0x6492,0x64AE,0x64AD,0x64AB,0x649A,0x64AC, + 0x6499,0x64A2,0x64B3,0x6575,0x6577,0x6578,0x66AE,0x66AB, + 0x66B4,0x66B1,0x6A23,0x6A1F,0x69E8,0x6A01,0x6A1E,0x6A19, + 0x69FD,0x6A21,0x6A13,0x6A0A,0x69F3,0x6A02,0x6A05,0x69ED, + 0x6A11,0x6B50,0x6B4E,0x6BA4,0x6BC5,0x6BC6,0x6F3F,0x6F7C, + 0x6F84,0x6F51,0x6F66,0x6F54,0x6F86,0x6F6D,0x6F5B,0x6F78, + 0x6F6E,0x6F8E,0x6F7A,0x6F70,0x6F64,0x6F97,0x6F58,0x6ED5, + 0x6F6F,0x6F60,0x6F5F,0x719F,0x71AC,0x71B1,0x71A8,0x7256, + 0x729B,0x734E,0x7357,0x7469,0x748B,0x7483, + /* Range 0xBD40 - 0xBD7E, array index: 0x1300 */ + 0x747E,0x7480,0x757F,0x7620,0x7629,0x761F,0x7624,0x7626, + 0x7621,0x7622,0x769A,0x76BA,0x76E4,0x778E,0x7787,0x778C, + 0x7791,0x778B,0x78CB,0x78C5,0x78BA,0x78CA,0x78BE,0x78D5, + 0x78BC,0x78D0,0x7A3F,0x7A3C,0x7A40,0x7A3D,0x7A37,0x7A3B, + 0x7AAF,0x7AAE,0x7BAD,0x7BB1,0x7BC4,0x7BB4,0x7BC6,0x7BC7, + 0x7BC1,0x7BA0,0x7BCC,0x7CCA,0x7DE0,0x7DF4,0x7DEF,0x7DFB, + 0x7DD8,0x7DEC,0x7DDD,0x7DE8,0x7DE3,0x7DDA,0x7DDE,0x7DE9, + 0x7D9E,0x7DD9,0x7DF2,0x7DF9,0x7F75,0x7F77,0x7FAF, + /* Range 0xBDA1 - 0xBDFE, array index: 0x133F */ + 0x7FE9,0x8026,0x819B,0x819C,0x819D,0x81A0,0x819A,0x8198, + 0x8517,0x853D,0x851A,0x84EE,0x852C,0x852D,0x8513,0x8511, + 0x8523,0x8521,0x8514,0x84EC,0x8525,0x84FF,0x8506,0x8782, + 0x8774,0x8776,0x8760,0x8766,0x8778,0x8768,0x8759,0x8757, + 0x874C,0x8753,0x885B,0x885D,0x8910,0x8907,0x8912,0x8913, + 0x8915,0x890A,0x8ABC,0x8AD2,0x8AC7,0x8AC4,0x8A95,0x8ACB, + 0x8AF8,0x8AB2,0x8AC9,0x8AC2,0x8ABF,0x8AB0,0x8AD6,0x8ACD, + 0x8AB6,0x8AB9,0x8ADB,0x8C4C,0x8C4E,0x8C6C,0x8CE0,0x8CDE, + 0x8CE6,0x8CE4,0x8CEC,0x8CED,0x8CE2,0x8CE3,0x8CDC,0x8CEA, + 0x8CE1,0x8D6D,0x8D9F,0x8DA3,0x8E2B,0x8E10,0x8E1D,0x8E22, + 0x8E0F,0x8E29,0x8E1F,0x8E21,0x8E1E,0x8EBA,0x8F1D,0x8F1B, + 0x8F1F,0x8F29,0x8F26,0x8F2A,0x8F1C,0x8F1E, + /* Range 0xBE40 - 0xBE7E, array index: 0x139D */ + 0x8F25,0x9069,0x906E,0x9068,0x906D,0x9077,0x9130,0x912D, + 0x9127,0x9131,0x9187,0x9189,0x918B,0x9183,0x92C5,0x92BB, + 0x92B7,0x92EA,0x92AC,0x92E4,0x92C1,0x92B3,0x92BC,0x92D2, + 0x92C7,0x92F0,0x92B2,0x95AD,0x95B1,0x9704,0x9706,0x9707, + 0x9709,0x9760,0x978D,0x978B,0x978F,0x9821,0x982B,0x981C, + 0x98B3,0x990A,0x9913,0x9912,0x9918,0x99DD,0x99D0,0x99DF, + 0x99DB,0x99D1,0x99D5,0x99D2,0x99D9,0x9AB7,0x9AEE,0x9AEF, + 0x9B27,0x9B45,0x9B44,0x9B77,0x9B6F,0x9D06,0x9D09, + /* Range 0xBEA1 - 0xBEFE, array index: 0x13DC */ + 0x9D03,0x9EA9,0x9EBE,0x9ECE,0x58A8,0x9F52,0x5112,0x5118, + 0x5114,0x5110,0x5115,0x5180,0x51AA,0x51DD,0x5291,0x5293, + 0x52F3,0x5659,0x566B,0x5679,0x5669,0x5664,0x5678,0x566A, + 0x5668,0x5665,0x5671,0x566F,0x566C,0x5662,0x5676,0x58C1, + 0x58BE,0x58C7,0x58C5,0x596E,0x5B1D,0x5B34,0x5B78,0x5BF0, + 0x5C0E,0x5F4A,0x61B2,0x6191,0x61A9,0x618A,0x61CD,0x61B6, + 0x61BE,0x61CA,0x61C8,0x6230,0x64C5,0x64C1,0x64CB,0x64BB, + 0x64BC,0x64DA,0x64C4,0x64C7,0x64C2,0x64CD,0x64BF,0x64D2, + 0x64D4,0x64BE,0x6574,0x66C6,0x66C9,0x66B9,0x66C4,0x66C7, + 0x66B8,0x6A3D,0x6A38,0x6A3A,0x6A59,0x6A6B,0x6A58,0x6A39, + 0x6A44,0x6A62,0x6A61,0x6A4B,0x6A47,0x6A35,0x6A5F,0x6A48, + 0x6B59,0x6B77,0x6C05,0x6FC2,0x6FB1,0x6FA1, + /* Range 0xBF40 - 0xBF7E, array index: 0x143A */ + 0x6FC3,0x6FA4,0x6FC1,0x6FA7,0x6FB3,0x6FC0,0x6FB9,0x6FB6, + 0x6FA6,0x6FA0,0x6FB4,0x71BE,0x71C9,0x71D0,0x71D2,0x71C8, + 0x71D5,0x71B9,0x71CE,0x71D9,0x71DC,0x71C3,0x71C4,0x7368, + 0x749C,0x74A3,0x7498,0x749F,0x749E,0x74E2,0x750C,0x750D, + 0x7634,0x7638,0x763A,0x76E7,0x76E5,0x77A0,0x779E,0x779F, + 0x77A5,0x78E8,0x78DA,0x78EC,0x78E7,0x79A6,0x7A4D,0x7A4E, + 0x7A46,0x7A4C,0x7A4B,0x7ABA,0x7BD9,0x7C11,0x7BC9,0x7BE4, + 0x7BDB,0x7BE1,0x7BE9,0x7BE6,0x7CD5,0x7CD6,0x7E0A, + /* Range 0xBFA1 - 0xBFFE, array index: 0x1479 */ + 0x7E11,0x7E08,0x7E1B,0x7E23,0x7E1E,0x7E1D,0x7E09,0x7E10, + 0x7F79,0x7FB2,0x7FF0,0x7FF1,0x7FEE,0x8028,0x81B3,0x81A9, + 0x81A8,0x81FB,0x8208,0x8258,0x8259,0x854A,0x8559,0x8548, + 0x8568,0x8569,0x8543,0x8549,0x856D,0x856A,0x855E,0x8783, + 0x879F,0x879E,0x87A2,0x878D,0x8861,0x892A,0x8932,0x8925, + 0x892B,0x8921,0x89AA,0x89A6,0x8AE6,0x8AFA,0x8AEB,0x8AF1, + 0x8B00,0x8ADC,0x8AE7,0x8AEE,0x8AFE,0x8B01,0x8B02,0x8AF7, + 0x8AED,0x8AF3,0x8AF6,0x8AFC,0x8C6B,0x8C6D,0x8C93,0x8CF4, + 0x8E44,0x8E31,0x8E34,0x8E42,0x8E39,0x8E35,0x8F3B,0x8F2F, + 0x8F38,0x8F33,0x8FA8,0x8FA6,0x9075,0x9074,0x9078,0x9072, + 0x907C,0x907A,0x9134,0x9192,0x9320,0x9336,0x92F8,0x9333, + 0x932F,0x9322,0x92FC,0x932B,0x9304,0x931A, + /* Range 0xC040 - 0xC07E, array index: 0x14D7 */ + 0x9310,0x9326,0x9321,0x9315,0x932E,0x9319,0x95BB,0x96A7, + 0x96A8,0x96AA,0x96D5,0x970E,0x9711,0x9716,0x970D,0x9713, + 0x970F,0x975B,0x975C,0x9766,0x9798,0x9830,0x9838,0x983B, + 0x9837,0x982D,0x9839,0x9824,0x9910,0x9928,0x991E,0x991B, + 0x9921,0x991A,0x99ED,0x99E2,0x99F1,0x9AB8,0x9ABC,0x9AFB, + 0x9AED,0x9B28,0x9B91,0x9D15,0x9D23,0x9D26,0x9D28,0x9D12, + 0x9D1B,0x9ED8,0x9ED4,0x9F8D,0x9F9C,0x512A,0x511F,0x5121, + 0x5132,0x52F5,0x568E,0x5680,0x5690,0x5685,0x5687, + /* Range 0xC0A1 - 0xC0FE, array index: 0x1516 */ + 0x568F,0x58D5,0x58D3,0x58D1,0x58CE,0x5B30,0x5B2A,0x5B24, + 0x5B7A,0x5C37,0x5C68,0x5DBC,0x5DBA,0x5DBD,0x5DB8,0x5E6B, + 0x5F4C,0x5FBD,0x61C9,0x61C2,0x61C7,0x61E6,0x61CB,0x6232, + 0x6234,0x64CE,0x64CA,0x64D8,0x64E0,0x64F0,0x64E6,0x64EC, + 0x64F1,0x64E2,0x64ED,0x6582,0x6583,0x66D9,0x66D6,0x6A80, + 0x6A94,0x6A84,0x6AA2,0x6A9C,0x6ADB,0x6AA3,0x6A7E,0x6A97, + 0x6A90,0x6AA0,0x6B5C,0x6BAE,0x6BDA,0x6C08,0x6FD8,0x6FF1, + 0x6FDF,0x6FE0,0x6FDB,0x6FE4,0x6FEB,0x6FEF,0x6F80,0x6FEC, + 0x6FE1,0x6FE9,0x6FD5,0x6FEE,0x6FF0,0x71E7,0x71DF,0x71EE, + 0x71E6,0x71E5,0x71ED,0x71EC,0x71F4,0x71E0,0x7235,0x7246, + 0x7370,0x7372,0x74A9,0x74B0,0x74A6,0x74A8,0x7646,0x7642, + 0x764C,0x76EA,0x77B3,0x77AA,0x77B0,0x77AC, + /* Range 0xC140 - 0xC17E, array index: 0x1574 */ + 0x77A7,0x77AD,0x77EF,0x78F7,0x78FA,0x78F4,0x78EF,0x7901, + 0x79A7,0x79AA,0x7A57,0x7ABF,0x7C07,0x7C0D,0x7BFE,0x7BF7, + 0x7C0C,0x7BE0,0x7CE0,0x7CDC,0x7CDE,0x7CE2,0x7CDF,0x7CD9, + 0x7CDD,0x7E2E,0x7E3E,0x7E46,0x7E37,0x7E32,0x7E43,0x7E2B, + 0x7E3D,0x7E31,0x7E45,0x7E41,0x7E34,0x7E39,0x7E48,0x7E35, + 0x7E3F,0x7E2F,0x7F44,0x7FF3,0x7FFC,0x8071,0x8072,0x8070, + 0x806F,0x8073,0x81C6,0x81C3,0x81BA,0x81C2,0x81C0,0x81BF, + 0x81BD,0x81C9,0x81BE,0x81E8,0x8209,0x8271,0x85AA, + /* Range 0xC1A1 - 0xC1FE, array index: 0x15B3 */ + 0x8584,0x857E,0x859C,0x8591,0x8594,0x85AF,0x859B,0x8587, + 0x85A8,0x858A,0x8667,0x87C0,0x87D1,0x87B3,0x87D2,0x87C6, + 0x87AB,0x87BB,0x87BA,0x87C8,0x87CB,0x893B,0x8936,0x8944, + 0x8938,0x893D,0x89AC,0x8B0E,0x8B17,0x8B19,0x8B1B,0x8B0A, + 0x8B20,0x8B1D,0x8B04,0x8B10,0x8C41,0x8C3F,0x8C73,0x8CFA, + 0x8CFD,0x8CFC,0x8CF8,0x8CFB,0x8DA8,0x8E49,0x8E4B,0x8E48, + 0x8E4A,0x8F44,0x8F3E,0x8F42,0x8F45,0x8F3F,0x907F,0x907D, + 0x9084,0x9081,0x9082,0x9080,0x9139,0x91A3,0x919E,0x919C, + 0x934D,0x9382,0x9328,0x9375,0x934A,0x9365,0x934B,0x9318, + 0x937E,0x936C,0x935B,0x9370,0x935A,0x9354,0x95CA,0x95CB, + 0x95CC,0x95C8,0x95C6,0x96B1,0x96B8,0x96D6,0x971C,0x971E, + 0x97A0,0x97D3,0x9846,0x98B6,0x9935,0x9A01, + /* Range 0xC240 - 0xC27E, array index: 0x1611 */ + 0x99FF,0x9BAE,0x9BAB,0x9BAA,0x9BAD,0x9D3B,0x9D3F,0x9E8B, + 0x9ECF,0x9EDE,0x9EDC,0x9EDD,0x9EDB,0x9F3E,0x9F4B,0x53E2, + 0x5695,0x56AE,0x58D9,0x58D8,0x5B38,0x5F5D,0x61E3,0x6233, + 0x64F4,0x64F2,0x64FE,0x6506,0x64FA,0x64FB,0x64F7,0x65B7, + 0x66DC,0x6726,0x6AB3,0x6AAC,0x6AC3,0x6ABB,0x6AB8,0x6AC2, + 0x6AAE,0x6AAF,0x6B5F,0x6B78,0x6BAF,0x7009,0x700B,0x6FFE, + 0x7006,0x6FFA,0x7011,0x700F,0x71FB,0x71FC,0x71FE,0x71F8, + 0x7377,0x7375,0x74A7,0x74BF,0x7515,0x7656,0x7658, + /* Range 0xC2A1 - 0xC2FE, array index: 0x1650 */ + 0x7652,0x77BD,0x77BF,0x77BB,0x77BC,0x790E,0x79AE,0x7A61, + 0x7A62,0x7A60,0x7AC4,0x7AC5,0x7C2B,0x7C27,0x7C2A,0x7C1E, + 0x7C23,0x7C21,0x7CE7,0x7E54,0x7E55,0x7E5E,0x7E5A,0x7E61, + 0x7E52,0x7E59,0x7F48,0x7FF9,0x7FFB,0x8077,0x8076,0x81CD, + 0x81CF,0x820A,0x85CF,0x85A9,0x85CD,0x85D0,0x85C9,0x85B0, + 0x85BA,0x85B9,0x85A6,0x87EF,0x87EC,0x87F2,0x87E0,0x8986, + 0x89B2,0x89F4,0x8B28,0x8B39,0x8B2C,0x8B2B,0x8C50,0x8D05, + 0x8E59,0x8E63,0x8E66,0x8E64,0x8E5F,0x8E55,0x8EC0,0x8F49, + 0x8F4D,0x9087,0x9083,0x9088,0x91AB,0x91AC,0x91D0,0x9394, + 0x938A,0x9396,0x93A2,0x93B3,0x93AE,0x93AC,0x93B0,0x9398, + 0x939A,0x9397,0x95D4,0x95D6,0x95D0,0x95D5,0x96E2,0x96DC, + 0x96D9,0x96DB,0x96DE,0x9724,0x97A3,0x97A6, + /* Range 0xC340 - 0xC37E, array index: 0x16AE */ + 0x97AD,0x97F9,0x984D,0x984F,0x984C,0x984E,0x9853,0x98BA, + 0x993E,0x993F,0x993D,0x992E,0x99A5,0x9A0E,0x9AC1,0x9B03, + 0x9B06,0x9B4F,0x9B4E,0x9B4D,0x9BCA,0x9BC9,0x9BFD,0x9BC8, + 0x9BC0,0x9D51,0x9D5D,0x9D60,0x9EE0,0x9F15,0x9F2C,0x5133, + 0x56A5,0x58DE,0x58DF,0x58E2,0x5BF5,0x9F90,0x5EEC,0x61F2, + 0x61F7,0x61F6,0x61F5,0x6500,0x650F,0x66E0,0x66DD,0x6AE5, + 0x6ADD,0x6ADA,0x6AD3,0x701B,0x701F,0x7028,0x701A,0x701D, + 0x7015,0x7018,0x7206,0x720D,0x7258,0x72A2,0x7378, + /* Range 0xC3A1 - 0xC3FE, array index: 0x16ED */ + 0x737A,0x74BD,0x74CA,0x74E3,0x7587,0x7586,0x765F,0x7661, + 0x77C7,0x7919,0x79B1,0x7A6B,0x7A69,0x7C3E,0x7C3F,0x7C38, + 0x7C3D,0x7C37,0x7C40,0x7E6B,0x7E6D,0x7E79,0x7E69,0x7E6A, + 0x7F85,0x7E73,0x7FB6,0x7FB9,0x7FB8,0x81D8,0x85E9,0x85DD, + 0x85EA,0x85D5,0x85E4,0x85E5,0x85F7,0x87FB,0x8805,0x880D, + 0x87F9,0x87FE,0x8960,0x895F,0x8956,0x895E,0x8B41,0x8B5C, + 0x8B58,0x8B49,0x8B5A,0x8B4E,0x8B4F,0x8B46,0x8B59,0x8D08, + 0x8D0A,0x8E7C,0x8E72,0x8E87,0x8E76,0x8E6C,0x8E7A,0x8E74, + 0x8F54,0x8F4E,0x8FAD,0x908A,0x908B,0x91B1,0x91AE,0x93E1, + 0x93D1,0x93DF,0x93C3,0x93C8,0x93DC,0x93DD,0x93D6,0x93E2, + 0x93CD,0x93D8,0x93E4,0x93D7,0x93E8,0x95DC,0x96B4,0x96E3, + 0x972A,0x9727,0x9761,0x97DC,0x97FB,0x985E, + /* Range 0xC440 - 0xC47E, array index: 0x174B */ + 0x9858,0x985B,0x98BC,0x9945,0x9949,0x9A16,0x9A19,0x9B0D, + 0x9BE8,0x9BE7,0x9BD6,0x9BDB,0x9D89,0x9D61,0x9D72,0x9D6A, + 0x9D6C,0x9E92,0x9E97,0x9E93,0x9EB4,0x52F8,0x56A8,0x56B7, + 0x56B6,0x56B4,0x56BC,0x58E4,0x5B40,0x5B43,0x5B7D,0x5BF6, + 0x5DC9,0x61F8,0x61FA,0x6518,0x6514,0x6519,0x66E6,0x6727, + 0x6AEC,0x703E,0x7030,0x7032,0x7210,0x737B,0x74CF,0x7662, + 0x7665,0x7926,0x792A,0x792C,0x792B,0x7AC7,0x7AF6,0x7C4C, + 0x7C43,0x7C4D,0x7CEF,0x7CF0,0x8FAE,0x7E7D,0x7E7C, + /* Range 0xC4A1 - 0xC4FE, array index: 0x178A */ + 0x7E82,0x7F4C,0x8000,0x81DA,0x8266,0x85FB,0x85F9,0x8611, + 0x85FA,0x8606,0x860B,0x8607,0x860A,0x8814,0x8815,0x8964, + 0x89BA,0x89F8,0x8B70,0x8B6C,0x8B66,0x8B6F,0x8B5F,0x8B6B, + 0x8D0F,0x8D0D,0x8E89,0x8E81,0x8E85,0x8E82,0x91B4,0x91CB, + 0x9418,0x9403,0x93FD,0x95E1,0x9730,0x98C4,0x9952,0x9951, + 0x99A8,0x9A2B,0x9A30,0x9A37,0x9A35,0x9C13,0x9C0D,0x9E79, + 0x9EB5,0x9EE8,0x9F2F,0x9F5F,0x9F63,0x9F61,0x5137,0x5138, + 0x56C1,0x56C0,0x56C2,0x5914,0x5C6C,0x5DCD,0x61FC,0x61FE, + 0x651D,0x651C,0x6595,0x66E9,0x6AFB,0x6B04,0x6AFA,0x6BB2, + 0x704C,0x721B,0x72A7,0x74D6,0x74D4,0x7669,0x77D3,0x7C50, + 0x7E8F,0x7E8C,0x7FBC,0x8617,0x862D,0x861A,0x8823,0x8822, + 0x8821,0x881F,0x896A,0x896C,0x89BD,0x8B74, + /* Range 0xC540 - 0xC57E, array index: 0x17E8 */ + 0x8B77,0x8B7D,0x8D13,0x8E8A,0x8E8D,0x8E8B,0x8F5F,0x8FAF, + 0x91BA,0x942E,0x9433,0x9435,0x943A,0x9438,0x9432,0x942B, + 0x95E2,0x9738,0x9739,0x9732,0x97FF,0x9867,0x9865,0x9957, + 0x9A45,0x9A43,0x9A40,0x9A3E,0x9ACF,0x9B54,0x9B51,0x9C2D, + 0x9C25,0x9DAF,0x9DB4,0x9DC2,0x9DB8,0x9E9D,0x9EEF,0x9F19, + 0x9F5C,0x9F66,0x9F67,0x513C,0x513B,0x56C8,0x56CA,0x56C9, + 0x5B7F,0x5DD4,0x5DD2,0x5F4E,0x61FF,0x6524,0x6B0A,0x6B61, + 0x7051,0x7058,0x7380,0x74E4,0x758A,0x766E,0x766C, + /* Range 0xC5A1 - 0xC5FE, array index: 0x1827 */ + 0x79B3,0x7C60,0x7C5F,0x807E,0x807D,0x81DF,0x8972,0x896F, + 0x89FC,0x8B80,0x8D16,0x8D17,0x8E91,0x8E93,0x8F61,0x9148, + 0x9444,0x9451,0x9452,0x973D,0x973E,0x97C3,0x97C1,0x986B, + 0x9955,0x9A55,0x9A4D,0x9AD2,0x9B1A,0x9C49,0x9C31,0x9C3E, + 0x9C3B,0x9DD3,0x9DD7,0x9F34,0x9F6C,0x9F6A,0x9F94,0x56CC, + 0x5DD6,0x6200,0x6523,0x652B,0x652A,0x66EC,0x6B10,0x74DA, + 0x7ACA,0x7C64,0x7C63,0x7C65,0x7E93,0x7E96,0x7E94,0x81E2, + 0x8638,0x863F,0x8831,0x8B8A,0x9090,0x908F,0x9463,0x9460, + 0x9464,0x9768,0x986F,0x995C,0x9A5A,0x9A5B,0x9A57,0x9AD3, + 0x9AD4,0x9AD1,0x9C54,0x9C57,0x9C56,0x9DE5,0x9E9F,0x9EF4, + 0x56D1,0x58E9,0x652C,0x705E,0x7671,0x7672,0x77D7,0x7F50, + 0x7F88,0x8836,0x8839,0x8862,0x8B93,0x8B92, + /* Range 0xC640 - 0xC67E, array index: 0x1885 */ + 0x8B96,0x8277,0x8D1B,0x91C0,0x946A,0x9742,0x9748,0x9744, + 0x97C6,0x9870,0x9A5F,0x9B22,0x9B58,0x9C5F,0x9DF9,0x9DFA, + 0x9E7C,0x9E7D,0x9F07,0x9F77,0x9F72,0x5EF3,0x6B16,0x7063, + 0x7C6C,0x7C6E,0x883B,0x89C0,0x8EA1,0x91C1,0x9472,0x9470, + 0x9871,0x995E,0x9AD6,0x9B23,0x9ECC,0x7064,0x77DA,0x8B9A, + 0x9477,0x97C9,0x9A62,0x9A65,0x7E9C,0x8B9C,0x8EAA,0x91C5, + 0x947D,0x947E,0x947C,0x9C77,0x9C78,0x9EF7,0x8C54,0x947F, + 0x9E1A,0x7228,0x9A6A,0x9B31,0x9E1B,0x9E1E,0x7C72, + /* Range 0xC6A1 - 0xC6FE, array index: 0x18C4 */ + 0x30FE,0x309D,0x309E,0x3005,0x3041,0x3042,0x3043,0x3044, + 0x3045,0x3046,0x3047,0x3048,0x3049,0x304A,0x304B,0x304C, + 0x304D,0x304E,0x304F,0x3050,0x3051,0x3052,0x3053,0x3054, + 0x3055,0x3056,0x3057,0x3058,0x3059,0x305A,0x305B,0x305C, + 0x305D,0x305E,0x305F,0x3060,0x3061,0x3062,0x3063,0x3064, + 0x3065,0x3066,0x3067,0x3068,0x3069,0x306A,0x306B,0x306C, + 0x306D,0x306E,0x306F,0x3070,0x3071,0x3072,0x3073,0x3074, + 0x3075,0x3076,0x3077,0x3078,0x3079,0x307A,0x307B,0x307C, + 0x307D,0x307E,0x307F,0x3080,0x3081,0x3082,0x3083,0x3084, + 0x3085,0x3086,0x3087,0x3088,0x3089,0x308A,0x308B,0x308C, + 0x308D,0x308E,0x308F,0x3090,0x3091,0x3092,0x3093,0x30A1, + 0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7, + /* Range 0xC740 - 0xC77E, array index: 0x1922 */ + 0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF, + 0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7, + 0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF, + 0x30C0,0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7, + 0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF, + 0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7, + 0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, + 0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6, + /* Range 0xC7A1 - 0xC7FC, array index: 0x1961 */ + 0x30E7,0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE, + 0x30EF,0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, + 0x0414,0x0415,0x0401,0x0416,0x0417,0x0418,0x0419,0x041A, + 0x041B,0x041C,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428, + 0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,0x0430, + 0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436,0x0437, + 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, + 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, + 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F, + 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, + 0x2468,0x2469,0x2474,0x2475,0x2476,0x2477,0x2478,0x2479, + 0x247A,0x247B,0x247C,0x247D, + /* Range 0xC940 - 0xC97E, array index: 0x19BD */ + 0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C,0x4E47, + 0x4E8D,0x56D7,0xFA0C,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E, + 0x4E2E,0x4E93,0x4EC2,0x4EC9,0x4EC8,0x5198,0x52FC,0x536C, + 0x53B9,0x5720,0x5903,0x592C,0x5C10,0x5DFF,0x65E1,0x6BB3, + 0x6BCC,0x6C14,0x723F,0x4E31,0x4E3C,0x4EE8,0x4EDC,0x4EE9, + 0x4EE1,0x4EDD,0x4EDA,0x520C,0x531C,0x534C,0x5722,0x5723, + 0x5917,0x592F,0x5B81,0x5B84,0x5C12,0x5C3B,0x5C74,0x5C73, + 0x5E04,0x5E80,0x5E82,0x5FC9,0x6209,0x6250,0x6C15, + /* Range 0xC9A1 - 0xC9FE, array index: 0x19FC */ + 0x6C36,0x6C43,0x6C3F,0x6C3B,0x72AE,0x72B0,0x738A,0x79B8, + 0x808A,0x961E,0x4F0E,0x4F18,0x4F2C,0x4EF5,0x4F14,0x4EF1, + 0x4F00,0x4EF7,0x4F08,0x4F1D,0x4F02,0x4F05,0x4F22,0x4F13, + 0x4F04,0x4EF4,0x4F12,0x51B1,0x5213,0x5209,0x5210,0x52A6, + 0x5322,0x531F,0x534D,0x538A,0x5407,0x56E1,0x56DF,0x572E, + 0x572A,0x5734,0x593C,0x5980,0x597C,0x5985,0x597B,0x597E, + 0x5977,0x597F,0x5B56,0x5C15,0x5C25,0x5C7C,0x5C7A,0x5C7B, + 0x5C7E,0x5DDF,0x5E75,0x5E84,0x5F02,0x5F1A,0x5F74,0x5FD5, + 0x5FD4,0x5FCF,0x625C,0x625E,0x6264,0x6261,0x6266,0x6262, + 0x6259,0x6260,0x625A,0x6265,0x65EF,0x65EE,0x673E,0x6739, + 0x6738,0x673B,0x673A,0x673F,0x673C,0x6733,0x6C18,0x6C46, + 0x6C52,0x6C5C,0x6C4F,0x6C4A,0x6C54,0x6C4B, + /* Range 0xCA40 - 0xCA7E, array index: 0x1A5A */ + 0x6C4C,0x7071,0x725E,0x72B4,0x72B5,0x738E,0x752A,0x767F, + 0x7A75,0x7F51,0x8278,0x827C,0x8280,0x827D,0x827F,0x864D, + 0x897E,0x9099,0x9097,0x9098,0x909B,0x9094,0x9622,0x9624, + 0x9620,0x9623,0x4F56,0x4F3B,0x4F62,0x4F49,0x4F53,0x4F64, + 0x4F3E,0x4F67,0x4F52,0x4F5F,0x4F41,0x4F58,0x4F2D,0x4F33, + 0x4F3F,0x4F61,0x518F,0x51B9,0x521C,0x521E,0x5221,0x52AD, + 0x52AE,0x5309,0x5363,0x5372,0x538E,0x538F,0x5430,0x5437, + 0x542A,0x5454,0x5445,0x5419,0x541C,0x5425,0x5418, + /* Range 0xCAA1 - 0xCAFE, array index: 0x1A99 */ + 0x543D,0x544F,0x5441,0x5428,0x5424,0x5447,0x56EE,0x56E7, + 0x56E5,0x5741,0x5745,0x574C,0x5749,0x574B,0x5752,0x5906, + 0x5940,0x59A6,0x5998,0x59A0,0x5997,0x598E,0x59A2,0x5990, + 0x598F,0x59A7,0x59A1,0x5B8E,0x5B92,0x5C28,0x5C2A,0x5C8D, + 0x5C8F,0x5C88,0x5C8B,0x5C89,0x5C92,0x5C8A,0x5C86,0x5C93, + 0x5C95,0x5DE0,0x5E0A,0x5E0E,0x5E8B,0x5E89,0x5E8C,0x5E88, + 0x5E8D,0x5F05,0x5F1D,0x5F78,0x5F76,0x5FD2,0x5FD1,0x5FD0, + 0x5FED,0x5FE8,0x5FEE,0x5FF3,0x5FE1,0x5FE4,0x5FE3,0x5FFA, + 0x5FEF,0x5FF7,0x5FFB,0x6000,0x5FF4,0x623A,0x6283,0x628C, + 0x628E,0x628F,0x6294,0x6287,0x6271,0x627B,0x627A,0x6270, + 0x6281,0x6288,0x6277,0x627D,0x6272,0x6274,0x6537,0x65F0, + 0x65F4,0x65F3,0x65F2,0x65F5,0x6745,0x6747, + /* Range 0xCB40 - 0xCB7E, array index: 0x1AF7 */ + 0x6759,0x6755,0x674C,0x6748,0x675D,0x674D,0x675A,0x674B, + 0x6BD0,0x6C19,0x6C1A,0x6C78,0x6C67,0x6C6B,0x6C84,0x6C8B, + 0x6C8F,0x6C71,0x6C6F,0x6C69,0x6C9A,0x6C6D,0x6C87,0x6C95, + 0x6C9C,0x6C66,0x6C73,0x6C65,0x6C7B,0x6C8E,0x7074,0x707A, + 0x7263,0x72BF,0x72BD,0x72C3,0x72C6,0x72C1,0x72BA,0x72C5, + 0x7395,0x7397,0x7393,0x7394,0x7392,0x753A,0x7539,0x7594, + 0x7595,0x7681,0x793D,0x8034,0x8095,0x8099,0x8090,0x8092, + 0x809C,0x8290,0x828F,0x8285,0x828E,0x8291,0x8293, + /* Range 0xCBA1 - 0xCBFE, array index: 0x1B36 */ + 0x828A,0x8283,0x8284,0x8C78,0x8FC9,0x8FBF,0x909F,0x90A1, + 0x90A5,0x909E,0x90A7,0x90A0,0x9630,0x9628,0x962F,0x962D, + 0x4E33,0x4F98,0x4F7C,0x4F85,0x4F7D,0x4F80,0x4F87,0x4F76, + 0x4F74,0x4F89,0x4F84,0x4F77,0x4F4C,0x4F97,0x4F6A,0x4F9A, + 0x4F79,0x4F81,0x4F78,0x4F90,0x4F9C,0x4F94,0x4F9E,0x4F92, + 0x4F82,0x4F95,0x4F6B,0x4F6E,0x519E,0x51BC,0x51BE,0x5235, + 0x5232,0x5233,0x5246,0x5231,0x52BC,0x530A,0x530B,0x533C, + 0x5392,0x5394,0x5487,0x547F,0x5481,0x5491,0x5482,0x5488, + 0x546B,0x547A,0x547E,0x5465,0x546C,0x5474,0x5466,0x548D, + 0x546F,0x5461,0x5460,0x5498,0x5463,0x5467,0x5464,0x56F7, + 0x56F9,0x576F,0x5772,0x576D,0x576B,0x5771,0x5770,0x5776, + 0x5780,0x5775,0x577B,0x5773,0x5774,0x5762, + /* Range 0xCC40 - 0xCC7E, array index: 0x1B94 */ + 0x5768,0x577D,0x590C,0x5945,0x59B5,0x59BA,0x59CF,0x59CE, + 0x59B2,0x59CC,0x59C1,0x59B6,0x59BC,0x59C3,0x59D6,0x59B1, + 0x59BD,0x59C0,0x59C8,0x59B4,0x59C7,0x5B62,0x5B65,0x5B93, + 0x5B95,0x5C44,0x5C47,0x5CAE,0x5CA4,0x5CA0,0x5CB5,0x5CAF, + 0x5CA8,0x5CAC,0x5C9F,0x5CA3,0x5CAD,0x5CA2,0x5CAA,0x5CA7, + 0x5C9D,0x5CA5,0x5CB6,0x5CB0,0x5CA6,0x5E17,0x5E14,0x5E19, + 0x5F28,0x5F22,0x5F23,0x5F24,0x5F54,0x5F82,0x5F7E,0x5F7D, + 0x5FDE,0x5FE5,0x602D,0x6026,0x6019,0x6032,0x600B, + /* Range 0xCCA1 - 0xCCFE, array index: 0x1BD3 */ + 0x6034,0x600A,0x6017,0x6033,0x601A,0x601E,0x602C,0x6022, + 0x600D,0x6010,0x602E,0x6013,0x6011,0x600C,0x6009,0x601C, + 0x6214,0x623D,0x62AD,0x62B4,0x62D1,0x62BE,0x62AA,0x62B6, + 0x62CA,0x62AE,0x62B3,0x62AF,0x62BB,0x62A9,0x62B0,0x62B8, + 0x653D,0x65A8,0x65BB,0x6609,0x65FC,0x6604,0x6612,0x6608, + 0x65FB,0x6603,0x660B,0x660D,0x6605,0x65FD,0x6611,0x6610, + 0x66F6,0x670A,0x6785,0x676C,0x678E,0x6792,0x6776,0x677B, + 0x6798,0x6786,0x6784,0x6774,0x678D,0x678C,0x677A,0x679F, + 0x6791,0x6799,0x6783,0x677D,0x6781,0x6778,0x6779,0x6794, + 0x6B25,0x6B80,0x6B7E,0x6BDE,0x6C1D,0x6C93,0x6CEC,0x6CEB, + 0x6CEE,0x6CD9,0x6CB6,0x6CD4,0x6CAD,0x6CE7,0x6CB7,0x6CD0, + 0x6CC2,0x6CBA,0x6CC3,0x6CC6,0x6CED,0x6CF2, + /* Range 0xCD40 - 0xCD7E, array index: 0x1C31 */ + 0x6CD2,0x6CDD,0x6CB4,0x6C8A,0x6C9D,0x6C80,0x6CDE,0x6CC0, + 0x6D30,0x6CCD,0x6CC7,0x6CB0,0x6CF9,0x6CCF,0x6CE9,0x6CD1, + 0x7094,0x7098,0x7085,0x7093,0x7086,0x7084,0x7091,0x7096, + 0x7082,0x709A,0x7083,0x726A,0x72D6,0x72CB,0x72D8,0x72C9, + 0x72DC,0x72D2,0x72D4,0x72DA,0x72CC,0x72D1,0x73A4,0x73A1, + 0x73AD,0x73A6,0x73A2,0x73A0,0x73AC,0x739D,0x74DD,0x74E8, + 0x753F,0x7540,0x753E,0x758C,0x7598,0x76AF,0x76F3,0x76F1, + 0x76F0,0x76F5,0x77F8,0x77FC,0x77F9,0x77FB,0x77FA, + /* Range 0xCDA1 - 0xCDFE, array index: 0x1C70 */ + 0x77F7,0x7942,0x793F,0x79C5,0x7A78,0x7A7B,0x7AFB,0x7C75, + 0x7CFD,0x8035,0x808F,0x80AE,0x80A3,0x80B8,0x80B5,0x80AD, + 0x8220,0x82A0,0x82C0,0x82AB,0x829A,0x8298,0x829B,0x82B5, + 0x82A7,0x82AE,0x82BC,0x829E,0x82BA,0x82B4,0x82A8,0x82A1, + 0x82A9,0x82C2,0x82A4,0x82C3,0x82B6,0x82A2,0x8670,0x866F, + 0x866D,0x866E,0x8C56,0x8FD2,0x8FCB,0x8FD3,0x8FCD,0x8FD6, + 0x8FD5,0x8FD7,0x90B2,0x90B4,0x90AF,0x90B3,0x90B0,0x9639, + 0x963D,0x963C,0x963A,0x9643,0x4FCD,0x4FC5,0x4FD3,0x4FB2, + 0x4FC9,0x4FCB,0x4FC1,0x4FD4,0x4FDC,0x4FD9,0x4FBB,0x4FB3, + 0x4FDB,0x4FC7,0x4FD6,0x4FBA,0x4FC0,0x4FB9,0x4FEC,0x5244, + 0x5249,0x52C0,0x52C2,0x533D,0x537C,0x5397,0x5396,0x5399, + 0x5398,0x54BA,0x54A1,0x54AD,0x54A5,0x54CF, + /* Range 0xCE40 - 0xCE7E, array index: 0x1CCE */ + 0x54C3,0x830D,0x54B7,0x54AE,0x54D6,0x54B6,0x54C5,0x54C6, + 0x54A0,0x5470,0x54BC,0x54A2,0x54BE,0x5472,0x54DE,0x54B0, + 0x57B5,0x579E,0x579F,0x57A4,0x578C,0x5797,0x579D,0x579B, + 0x5794,0x5798,0x578F,0x5799,0x57A5,0x579A,0x5795,0x58F4, + 0x590D,0x5953,0x59E1,0x59DE,0x59EE,0x5A00,0x59F1,0x59DD, + 0x59FA,0x59FD,0x59FC,0x59F6,0x59E4,0x59F2,0x59F7,0x59DB, + 0x59E9,0x59F3,0x59F5,0x59E0,0x59FE,0x59F4,0x59ED,0x5BA8, + 0x5C4C,0x5CD0,0x5CD8,0x5CCC,0x5CD7,0x5CCB,0x5CDB, + /* Range 0xCEA1 - 0xCEFE, array index: 0x1D0D */ + 0x5CDE,0x5CDA,0x5CC9,0x5CC7,0x5CCA,0x5CD6,0x5CD3,0x5CD4, + 0x5CCF,0x5CC8,0x5CC6,0x5CCE,0x5CDF,0x5CF8,0x5DF9,0x5E21, + 0x5E22,0x5E23,0x5E20,0x5E24,0x5EB0,0x5EA4,0x5EA2,0x5E9B, + 0x5EA3,0x5EA5,0x5F07,0x5F2E,0x5F56,0x5F86,0x6037,0x6039, + 0x6054,0x6072,0x605E,0x6045,0x6053,0x6047,0x6049,0x605B, + 0x604C,0x6040,0x6042,0x605F,0x6024,0x6044,0x6058,0x6066, + 0x606E,0x6242,0x6243,0x62CF,0x630D,0x630B,0x62F5,0x630E, + 0x6303,0x62EB,0x62F9,0x630F,0x630C,0x62F8,0x62F6,0x6300, + 0x6313,0x6314,0x62FA,0x6315,0x62FB,0x62F0,0x6541,0x6543, + 0x65AA,0x65BF,0x6636,0x6621,0x6632,0x6635,0x661C,0x6626, + 0x6622,0x6633,0x662B,0x663A,0x661D,0x6634,0x6639,0x662E, + 0x670F,0x6710,0x67C1,0x67F2,0x67C8,0x67BA, + /* Range 0xCF40 - 0xCF7E, array index: 0x1D6B */ + 0x67DC,0x67BB,0x67F8,0x67D8,0x67C0,0x67B7,0x67C5,0x67EB, + 0x67E4,0x67DF,0x67B5,0x67CD,0x67B3,0x67F7,0x67F6,0x67EE, + 0x67E3,0x67C2,0x67B9,0x67CE,0x67E7,0x67F0,0x67B2,0x67FC, + 0x67C6,0x67ED,0x67CC,0x67AE,0x67E6,0x67DB,0x67FA,0x67C9, + 0x67CA,0x67C3,0x67EA,0x67CB,0x6B28,0x6B82,0x6B84,0x6BB6, + 0x6BD6,0x6BD8,0x6BE0,0x6C20,0x6C21,0x6D28,0x6D34,0x6D2D, + 0x6D1F,0x6D3C,0x6D3F,0x6D12,0x6D0A,0x6CDA,0x6D33,0x6D04, + 0x6D19,0x6D3A,0x6D1A,0x6D11,0x6D00,0x6D1D,0x6D42, + /* Range 0xCFA1 - 0xCFFE, array index: 0x1DAA */ + 0x6D01,0x6D18,0x6D37,0x6D03,0x6D0F,0x6D40,0x6D07,0x6D20, + 0x6D2C,0x6D08,0x6D22,0x6D09,0x6D10,0x70B7,0x709F,0x70BE, + 0x70B1,0x70B0,0x70A1,0x70B4,0x70B5,0x70A9,0x7241,0x7249, + 0x724A,0x726C,0x7270,0x7273,0x726E,0x72CA,0x72E4,0x72E8, + 0x72EB,0x72DF,0x72EA,0x72E6,0x72E3,0x7385,0x73CC,0x73C2, + 0x73C8,0x73C5,0x73B9,0x73B6,0x73B5,0x73B4,0x73EB,0x73BF, + 0x73C7,0x73BE,0x73C3,0x73C6,0x73B8,0x73CB,0x74EC,0x74EE, + 0x752E,0x7547,0x7548,0x75A7,0x75AA,0x7679,0x76C4,0x7708, + 0x7703,0x7704,0x7705,0x770A,0x76F7,0x76FB,0x76FA,0x77E7, + 0x77E8,0x7806,0x7811,0x7812,0x7805,0x7810,0x780F,0x780E, + 0x7809,0x7803,0x7813,0x794A,0x794C,0x794B,0x7945,0x7944, + 0x79D5,0x79CD,0x79CF,0x79D6,0x79CE,0x7A80, + /* Range 0xD040 - 0xD07E, array index: 0x1E08 */ + 0x7A7E,0x7AD1,0x7B00,0x7B01,0x7C7A,0x7C78,0x7C79,0x7C7F, + 0x7C80,0x7C81,0x7D03,0x7D08,0x7D01,0x7F58,0x7F91,0x7F8D, + 0x7FBE,0x8007,0x800E,0x800F,0x8014,0x8037,0x80D8,0x80C7, + 0x80E0,0x80D1,0x80C8,0x80C2,0x80D0,0x80C5,0x80E3,0x80D9, + 0x80DC,0x80CA,0x80D5,0x80C9,0x80CF,0x80D7,0x80E6,0x80CD, + 0x81FF,0x8221,0x8294,0x82D9,0x82FE,0x82F9,0x8307,0x82E8, + 0x8300,0x82D5,0x833A,0x82EB,0x82D6,0x82F4,0x82EC,0x82E1, + 0x82F2,0x82F5,0x830C,0x82FB,0x82F6,0x82F0,0x82EA, + /* Range 0xD0A1 - 0xD0FE, array index: 0x1E47 */ + 0x82E4,0x82E0,0x82FA,0x82F3,0x82ED,0x8677,0x8674,0x867C, + 0x8673,0x8841,0x884E,0x8867,0x886A,0x8869,0x89D3,0x8A04, + 0x8A07,0x8D72,0x8FE3,0x8FE1,0x8FEE,0x8FE0,0x90F1,0x90BD, + 0x90BF,0x90D5,0x90C5,0x90BE,0x90C7,0x90CB,0x90C8,0x91D4, + 0x91D3,0x9654,0x964F,0x9651,0x9653,0x964A,0x964E,0x501E, + 0x5005,0x5007,0x5013,0x5022,0x5030,0x501B,0x4FF5,0x4FF4, + 0x5033,0x5037,0x502C,0x4FF6,0x4FF7,0x5017,0x501C,0x5020, + 0x5027,0x5035,0x502F,0x5031,0x500E,0x515A,0x5194,0x5193, + 0x51CA,0x51C4,0x51C5,0x51C8,0x51CE,0x5261,0x525A,0x5252, + 0x525E,0x525F,0x5255,0x5262,0x52CD,0x530E,0x539E,0x5526, + 0x54E2,0x5517,0x5512,0x54E7,0x54F3,0x54E4,0x551A,0x54FF, + 0x5504,0x5508,0x54EB,0x5511,0x5505,0x54F1, + /* Range 0xD140 - 0xD17E, array index: 0x1EA5 */ + 0x550A,0x54FB,0x54F7,0x54F8,0x54E0,0x550E,0x5503,0x550B, + 0x5701,0x5702,0x57CC,0x5832,0x57D5,0x57D2,0x57BA,0x57C6, + 0x57BD,0x57BC,0x57B8,0x57B6,0x57BF,0x57C7,0x57D0,0x57B9, + 0x57C1,0x590E,0x594A,0x5A19,0x5A16,0x5A2D,0x5A2E,0x5A15, + 0x5A0F,0x5A17,0x5A0A,0x5A1E,0x5A33,0x5B6C,0x5BA7,0x5BAD, + 0x5BAC,0x5C03,0x5C56,0x5C54,0x5CEC,0x5CFF,0x5CEE,0x5CF1, + 0x5CF7,0x5D00,0x5CF9,0x5E29,0x5E28,0x5EA8,0x5EAE,0x5EAA, + 0x5EAC,0x5F33,0x5F30,0x5F67,0x605D,0x605A,0x6067, + /* Range 0xD1A1 - 0xD1FE, array index: 0x1EE4 */ + 0x6041,0x60A2,0x6088,0x6080,0x6092,0x6081,0x609D,0x6083, + 0x6095,0x609B,0x6097,0x6087,0x609C,0x608E,0x6219,0x6246, + 0x62F2,0x6310,0x6356,0x632C,0x6344,0x6345,0x6336,0x6343, + 0x63E4,0x6339,0x634B,0x634A,0x633C,0x6329,0x6341,0x6334, + 0x6358,0x6354,0x6359,0x632D,0x6347,0x6333,0x635A,0x6351, + 0x6338,0x6357,0x6340,0x6348,0x654A,0x6546,0x65C6,0x65C3, + 0x65C4,0x65C2,0x664A,0x665F,0x6647,0x6651,0x6712,0x6713, + 0x681F,0x681A,0x6849,0x6832,0x6833,0x683B,0x684B,0x684F, + 0x6816,0x6831,0x681C,0x6835,0x682B,0x682D,0x682F,0x684E, + 0x6844,0x6834,0x681D,0x6812,0x6814,0x6826,0x6828,0x682E, + 0x684D,0x683A,0x6825,0x6820,0x6B2C,0x6B2F,0x6B2D,0x6B31, + 0x6B34,0x6B6D,0x8082,0x6B88,0x6BE6,0x6BE4, + /* Range 0xD240 - 0xD27E, array index: 0x1F42 */ + 0x6BE8,0x6BE3,0x6BE2,0x6BE7,0x6C25,0x6D7A,0x6D63,0x6D64, + 0x6D76,0x6D0D,0x6D61,0x6D92,0x6D58,0x6D62,0x6D6D,0x6D6F, + 0x6D91,0x6D8D,0x6DEF,0x6D7F,0x6D86,0x6D5E,0x6D67,0x6D60, + 0x6D97,0x6D70,0x6D7C,0x6D5F,0x6D82,0x6D98,0x6D2F,0x6D68, + 0x6D8B,0x6D7E,0x6D80,0x6D84,0x6D16,0x6D83,0x6D7B,0x6D7D, + 0x6D75,0x6D90,0x70DC,0x70D3,0x70D1,0x70DD,0x70CB,0x7F39, + 0x70E2,0x70D7,0x70D2,0x70DE,0x70E0,0x70D4,0x70CD,0x70C5, + 0x70C6,0x70C7,0x70DA,0x70CE,0x70E1,0x7242,0x7278, + /* Range 0xD2A1 - 0xD2FE, array index: 0x1F81 */ + 0x7277,0x7276,0x7300,0x72FA,0x72F4,0x72FE,0x72F6,0x72F3, + 0x72FB,0x7301,0x73D3,0x73D9,0x73E5,0x73D6,0x73BC,0x73E7, + 0x73E3,0x73E9,0x73DC,0x73D2,0x73DB,0x73D4,0x73DD,0x73DA, + 0x73D7,0x73D8,0x73E8,0x74DE,0x74DF,0x74F4,0x74F5,0x7521, + 0x755B,0x755F,0x75B0,0x75C1,0x75BB,0x75C4,0x75C0,0x75BF, + 0x75B6,0x75BA,0x768A,0x76C9,0x771D,0x771B,0x7710,0x7713, + 0x7712,0x7723,0x7711,0x7715,0x7719,0x771A,0x7722,0x7727, + 0x7823,0x782C,0x7822,0x7835,0x782F,0x7828,0x782E,0x782B, + 0x7821,0x7829,0x7833,0x782A,0x7831,0x7954,0x795B,0x794F, + 0x795C,0x7953,0x7952,0x7951,0x79EB,0x79EC,0x79E0,0x79EE, + 0x79ED,0x79EA,0x79DC,0x79DE,0x79DD,0x7A86,0x7A89,0x7A85, + 0x7A8B,0x7A8C,0x7A8A,0x7A87,0x7AD8,0x7B10, + /* Range 0xD340 - 0xD37E, array index: 0x1FDF */ + 0x7B04,0x7B13,0x7B05,0x7B0F,0x7B08,0x7B0A,0x7B0E,0x7B09, + 0x7B12,0x7C84,0x7C91,0x7C8A,0x7C8C,0x7C88,0x7C8D,0x7C85, + 0x7D1E,0x7D1D,0x7D11,0x7D0E,0x7D18,0x7D16,0x7D13,0x7D1F, + 0x7D12,0x7D0F,0x7D0C,0x7F5C,0x7F61,0x7F5E,0x7F60,0x7F5D, + 0x7F5B,0x7F96,0x7F92,0x7FC3,0x7FC2,0x7FC0,0x8016,0x803E, + 0x8039,0x80FA,0x80F2,0x80F9,0x80F5,0x8101,0x80FB,0x8100, + 0x8201,0x822F,0x8225,0x8333,0x832D,0x8344,0x8319,0x8351, + 0x8325,0x8356,0x833F,0x8341,0x8326,0x831C,0x8322, + /* Range 0xD3A1 - 0xD3FE, array index: 0x201E */ + 0x8342,0x834E,0x831B,0x832A,0x8308,0x833C,0x834D,0x8316, + 0x8324,0x8320,0x8337,0x832F,0x8329,0x8347,0x8345,0x834C, + 0x8353,0x831E,0x832C,0x834B,0x8327,0x8348,0x8653,0x8652, + 0x86A2,0x86A8,0x8696,0x868D,0x8691,0x869E,0x8687,0x8697, + 0x8686,0x868B,0x869A,0x8685,0x86A5,0x8699,0x86A1,0x86A7, + 0x8695,0x8698,0x868E,0x869D,0x8690,0x8694,0x8843,0x8844, + 0x886D,0x8875,0x8876,0x8872,0x8880,0x8871,0x887F,0x886F, + 0x8883,0x887E,0x8874,0x887C,0x8A12,0x8C47,0x8C57,0x8C7B, + 0x8CA4,0x8CA3,0x8D76,0x8D78,0x8DB5,0x8DB7,0x8DB6,0x8ED1, + 0x8ED3,0x8FFE,0x8FF5,0x9002,0x8FFF,0x8FFB,0x9004,0x8FFC, + 0x8FF6,0x90D6,0x90E0,0x90D9,0x90DA,0x90E3,0x90DF,0x90E5, + 0x90D8,0x90DB,0x90D7,0x90DC,0x90E4,0x9150, + /* Range 0xD440 - 0xD47E, array index: 0x207C */ + 0x914E,0x914F,0x91D5,0x91E2,0x91DA,0x965C,0x965F,0x96BC, + 0x98E3,0x9ADF,0x9B2F,0x4E7F,0x5070,0x506A,0x5061,0x505E, + 0x5060,0x5053,0x504B,0x505D,0x5072,0x5048,0x504D,0x5041, + 0x505B,0x504A,0x5062,0x5015,0x5045,0x505F,0x5069,0x506B, + 0x5063,0x5064,0x5046,0x5040,0x506E,0x5073,0x5057,0x5051, + 0x51D0,0x526B,0x526D,0x526C,0x526E,0x52D6,0x52D3,0x532D, + 0x539C,0x5575,0x5576,0x553C,0x554D,0x5550,0x5534,0x552A, + 0x5551,0x5562,0x5536,0x5535,0x5530,0x5552,0x5545, + /* Range 0xD4A1 - 0xD4FE, array index: 0x20BB */ + 0x550C,0x5532,0x5565,0x554E,0x5539,0x5548,0x552D,0x553B, + 0x5540,0x554B,0x570A,0x5707,0x57FB,0x5814,0x57E2,0x57F6, + 0x57DC,0x57F4,0x5800,0x57ED,0x57FD,0x5808,0x57F8,0x580B, + 0x57F3,0x57CF,0x5807,0x57EE,0x57E3,0x57F2,0x57E5,0x57EC, + 0x57E1,0x580E,0x57FC,0x5810,0x57E7,0x5801,0x580C,0x57F1, + 0x57E9,0x57F0,0x580D,0x5804,0x595C,0x5A60,0x5A58,0x5A55, + 0x5A67,0x5A5E,0x5A38,0x5A35,0x5A6D,0x5A50,0x5A5F,0x5A65, + 0x5A6C,0x5A53,0x5A64,0x5A57,0x5A43,0x5A5D,0x5A52,0x5A44, + 0x5A5B,0x5A48,0x5A8E,0x5A3E,0x5A4D,0x5A39,0x5A4C,0x5A70, + 0x5A69,0x5A47,0x5A51,0x5A56,0x5A42,0x5A5C,0x5B72,0x5B6E, + 0x5BC1,0x5BC0,0x5C59,0x5D1E,0x5D0B,0x5D1D,0x5D1A,0x5D20, + 0x5D0C,0x5D28,0x5D0D,0x5D26,0x5D25,0x5D0F, + /* Range 0xD540 - 0xD57E, array index: 0x2119 */ + 0x5D30,0x5D12,0x5D23,0x5D1F,0x5D2E,0x5E3E,0x5E34,0x5EB1, + 0x5EB4,0x5EB9,0x5EB2,0x5EB3,0x5F36,0x5F38,0x5F9B,0x5F96, + 0x5F9F,0x608A,0x6090,0x6086,0x60BE,0x60B0,0x60BA,0x60D3, + 0x60D4,0x60CF,0x60E4,0x60D9,0x60DD,0x60C8,0x60B1,0x60DB, + 0x60B7,0x60CA,0x60BF,0x60C3,0x60CD,0x60C0,0x6332,0x6365, + 0x638A,0x6382,0x637D,0x63BD,0x639E,0x63AD,0x639D,0x6397, + 0x63AB,0x638E,0x636F,0x6387,0x6390,0x636E,0x63AF,0x6375, + 0x639C,0x636D,0x63AE,0x637C,0x63A4,0x633B,0x639F, + /* Range 0xD5A1 - 0xD5FE, array index: 0x2158 */ + 0x6378,0x6385,0x6381,0x6391,0x638D,0x6370,0x6553,0x65CD, + 0x6665,0x6661,0x665B,0x6659,0x665C,0x6662,0x6718,0x6879, + 0x6887,0x6890,0x689C,0x686D,0x686E,0x68AE,0x68AB,0x6956, + 0x686F,0x68A3,0x68AC,0x68A9,0x6875,0x6874,0x68B2,0x688F, + 0x6877,0x6892,0x687C,0x686B,0x6872,0x68AA,0x6880,0x6871, + 0x687E,0x689B,0x6896,0x688B,0x68A0,0x6889,0x68A4,0x6878, + 0x687B,0x6891,0x688C,0x688A,0x687D,0x6B36,0x6B33,0x6B37, + 0x6B38,0x6B91,0x6B8F,0x6B8D,0x6B8E,0x6B8C,0x6C2A,0x6DC0, + 0x6DAB,0x6DB4,0x6DB3,0x6E74,0x6DAC,0x6DE9,0x6DE2,0x6DB7, + 0x6DF6,0x6DD4,0x6E00,0x6DC8,0x6DE0,0x6DDF,0x6DD6,0x6DBE, + 0x6DE5,0x6DDC,0x6DDD,0x6DDB,0x6DF4,0x6DCA,0x6DBD,0x6DED, + 0x6DF0,0x6DBA,0x6DD5,0x6DC2,0x6DCF,0x6DC9, + /* Range 0xD640 - 0xD67E, array index: 0x21B6 */ + 0x6DD0,0x6DF2,0x6DD3,0x6DFD,0x6DD7,0x6DCD,0x6DE3,0x6DBB, + 0x70FA,0x710D,0x70F7,0x7117,0x70F4,0x710C,0x70F0,0x7104, + 0x70F3,0x7110,0x70FC,0x70FF,0x7106,0x7113,0x7100,0x70F8, + 0x70F6,0x710B,0x7102,0x710E,0x727E,0x727B,0x727C,0x727F, + 0x731D,0x7317,0x7307,0x7311,0x7318,0x730A,0x7308,0x72FF, + 0x730F,0x731E,0x7388,0x73F6,0x73F8,0x73F5,0x7404,0x7401, + 0x73FD,0x7407,0x7400,0x73FA,0x73FC,0x73FF,0x740C,0x740B, + 0x73F4,0x7408,0x7564,0x7563,0x75CE,0x75D2,0x75CF, + /* Range 0xD6A1 - 0xD6FE, array index: 0x21F5 */ + 0x75CB,0x75CC,0x75D1,0x75D0,0x768F,0x7689,0x76D3,0x7739, + 0x772F,0x772D,0x7731,0x7732,0x7734,0x7733,0x773D,0x7725, + 0x773B,0x7735,0x7848,0x7852,0x7849,0x784D,0x784A,0x784C, + 0x7826,0x7845,0x7850,0x7964,0x7967,0x7969,0x796A,0x7963, + 0x796B,0x7961,0x79BB,0x79FA,0x79F8,0x79F6,0x79F7,0x7A8F, + 0x7A94,0x7A90,0x7B35,0x7B47,0x7B34,0x7B25,0x7B30,0x7B22, + 0x7B24,0x7B33,0x7B18,0x7B2A,0x7B1D,0x7B31,0x7B2B,0x7B2D, + 0x7B2F,0x7B32,0x7B38,0x7B1A,0x7B23,0x7C94,0x7C98,0x7C96, + 0x7CA3,0x7D35,0x7D3D,0x7D38,0x7D36,0x7D3A,0x7D45,0x7D2C, + 0x7D29,0x7D41,0x7D47,0x7D3E,0x7D3F,0x7D4A,0x7D3B,0x7D28, + 0x7F63,0x7F95,0x7F9C,0x7F9D,0x7F9B,0x7FCA,0x7FCB,0x7FCD, + 0x7FD0,0x7FD1,0x7FC7,0x7FCF,0x7FC9,0x801F, + /* Range 0xD740 - 0xD77E, array index: 0x2253 */ + 0x801E,0x801B,0x8047,0x8043,0x8048,0x8118,0x8125,0x8119, + 0x811B,0x812D,0x811F,0x812C,0x811E,0x8121,0x8115,0x8127, + 0x811D,0x8122,0x8211,0x8238,0x8233,0x823A,0x8234,0x8232, + 0x8274,0x8390,0x83A3,0x83A8,0x838D,0x837A,0x8373,0x83A4, + 0x8374,0x838F,0x8381,0x8395,0x8399,0x8375,0x8394,0x83A9, + 0x837D,0x8383,0x838C,0x839D,0x839B,0x83AA,0x838B,0x837E, + 0x83A5,0x83AF,0x8388,0x8397,0x83B0,0x837F,0x83A6,0x8387, + 0x83AE,0x8376,0x839A,0x8659,0x8656,0x86BF,0x86B7, + /* Range 0xD7A1 - 0xD7FE, array index: 0x2292 */ + 0x86C2,0x86C1,0x86C5,0x86BA,0x86B0,0x86C8,0x86B9,0x86B3, + 0x86B8,0x86CC,0x86B4,0x86BB,0x86BC,0x86C3,0x86BD,0x86BE, + 0x8852,0x8889,0x8895,0x88A8,0x88A2,0x88AA,0x889A,0x8891, + 0x88A1,0x889F,0x8898,0x88A7,0x8899,0x889B,0x8897,0x88A4, + 0x88AC,0x888C,0x8893,0x888E,0x8982,0x89D6,0x89D9,0x89D5, + 0x8A30,0x8A27,0x8A2C,0x8A1E,0x8C39,0x8C3B,0x8C5C,0x8C5D, + 0x8C7D,0x8CA5,0x8D7D,0x8D7B,0x8D79,0x8DBC,0x8DC2,0x8DB9, + 0x8DBF,0x8DC1,0x8ED8,0x8EDE,0x8EDD,0x8EDC,0x8ED7,0x8EE0, + 0x8EE1,0x9024,0x900B,0x9011,0x901C,0x900C,0x9021,0x90EF, + 0x90EA,0x90F0,0x90F4,0x90F2,0x90F3,0x90D4,0x90EB,0x90EC, + 0x90E9,0x9156,0x9158,0x915A,0x9153,0x9155,0x91EC,0x91F4, + 0x91F1,0x91F3,0x91F8,0x91E4,0x91F9,0x91EA, + /* Range 0xD840 - 0xD87E, array index: 0x22F0 */ + 0x91EB,0x91F7,0x91E8,0x91EE,0x957A,0x9586,0x9588,0x967C, + 0x966D,0x966B,0x9671,0x966F,0x96BF,0x976A,0x9804,0x98E5, + 0x9997,0x509B,0x5095,0x5094,0x509E,0x508B,0x50A3,0x5083, + 0x508C,0x508E,0x509D,0x5068,0x509C,0x5092,0x5082,0x5087, + 0x515F,0x51D4,0x5312,0x5311,0x53A4,0x53A7,0x5591,0x55A8, + 0x55A5,0x55AD,0x5577,0x5645,0x55A2,0x5593,0x5588,0x558F, + 0x55B5,0x5581,0x55A3,0x5592,0x55A4,0x557D,0x558C,0x55A6, + 0x557F,0x5595,0x55A1,0x558E,0x570C,0x5829,0x5837, + /* Range 0xD8A1 - 0xD8FE, array index: 0x232F */ + 0x5819,0x581E,0x5827,0x5823,0x5828,0x57F5,0x5848,0x5825, + 0x581C,0x581B,0x5833,0x583F,0x5836,0x582E,0x5839,0x5838, + 0x582D,0x582C,0x583B,0x5961,0x5AAF,0x5A94,0x5A9F,0x5A7A, + 0x5AA2,0x5A9E,0x5A78,0x5AA6,0x5A7C,0x5AA5,0x5AAC,0x5A95, + 0x5AAE,0x5A37,0x5A84,0x5A8A,0x5A97,0x5A83,0x5A8B,0x5AA9, + 0x5A7B,0x5A7D,0x5A8C,0x5A9C,0x5A8F,0x5A93,0x5A9D,0x5BEA, + 0x5BCD,0x5BCB,0x5BD4,0x5BD1,0x5BCA,0x5BCE,0x5C0C,0x5C30, + 0x5D37,0x5D43,0x5D6B,0x5D41,0x5D4B,0x5D3F,0x5D35,0x5D51, + 0x5D4E,0x5D55,0x5D33,0x5D3A,0x5D52,0x5D3D,0x5D31,0x5D59, + 0x5D42,0x5D39,0x5D49,0x5D38,0x5D3C,0x5D32,0x5D36,0x5D40, + 0x5D45,0x5E44,0x5E41,0x5F58,0x5FA6,0x5FA5,0x5FAB,0x60C9, + 0x60B9,0x60CC,0x60E2,0x60CE,0x60C4,0x6114, + /* Range 0xD940 - 0xD97E, array index: 0x238D */ + 0x60F2,0x610A,0x6116,0x6105,0x60F5,0x6113,0x60F8,0x60FC, + 0x60FE,0x60C1,0x6103,0x6118,0x611D,0x6110,0x60FF,0x6104, + 0x610B,0x624A,0x6394,0x63B1,0x63B0,0x63CE,0x63E5,0x63E8, + 0x63EF,0x63C3,0x649D,0x63F3,0x63CA,0x63E0,0x63F6,0x63D5, + 0x63F2,0x63F5,0x6461,0x63DF,0x63BE,0x63DD,0x63DC,0x63C4, + 0x63D8,0x63D3,0x63C2,0x63C7,0x63CC,0x63CB,0x63C8,0x63F0, + 0x63D7,0x63D9,0x6532,0x6567,0x656A,0x6564,0x655C,0x6568, + 0x6565,0x658C,0x659D,0x659E,0x65AE,0x65D0,0x65D2, + /* Range 0xD9A1 - 0xD9FE, array index: 0x23CC */ + 0x667C,0x666C,0x667B,0x6680,0x6671,0x6679,0x666A,0x6672, + 0x6701,0x690C,0x68D3,0x6904,0x68DC,0x692A,0x68EC,0x68EA, + 0x68F1,0x690F,0x68D6,0x68F7,0x68EB,0x68E4,0x68F6,0x6913, + 0x6910,0x68F3,0x68E1,0x6907,0x68CC,0x6908,0x6970,0x68B4, + 0x6911,0x68EF,0x68C6,0x6914,0x68F8,0x68D0,0x68FD,0x68FC, + 0x68E8,0x690B,0x690A,0x6917,0x68CE,0x68C8,0x68DD,0x68DE, + 0x68E6,0x68F4,0x68D1,0x6906,0x68D4,0x68E9,0x6915,0x6925, + 0x68C7,0x6B39,0x6B3B,0x6B3F,0x6B3C,0x6B94,0x6B97,0x6B99, + 0x6B95,0x6BBD,0x6BF0,0x6BF2,0x6BF3,0x6C30,0x6DFC,0x6E46, + 0x6E47,0x6E1F,0x6E49,0x6E88,0x6E3C,0x6E3D,0x6E45,0x6E62, + 0x6E2B,0x6E3F,0x6E41,0x6E5D,0x6E73,0x6E1C,0x6E33,0x6E4B, + 0x6E40,0x6E51,0x6E3B,0x6E03,0x6E2E,0x6E5E, + /* Range 0xDA40 - 0xDA7E, array index: 0x242A */ + 0x6E68,0x6E5C,0x6E61,0x6E31,0x6E28,0x6E60,0x6E71,0x6E6B, + 0x6E39,0x6E22,0x6E30,0x6E53,0x6E65,0x6E27,0x6E78,0x6E64, + 0x6E77,0x6E55,0x6E79,0x6E52,0x6E66,0x6E35,0x6E36,0x6E5A, + 0x7120,0x711E,0x712F,0x70FB,0x712E,0x7131,0x7123,0x7125, + 0x7122,0x7132,0x711F,0x7128,0x713A,0x711B,0x724B,0x725A, + 0x7288,0x7289,0x7286,0x7285,0x728B,0x7312,0x730B,0x7330, + 0x7322,0x7331,0x7333,0x7327,0x7332,0x732D,0x7326,0x7323, + 0x7335,0x730C,0x742E,0x742C,0x7430,0x742B,0x7416, + /* Range 0xDAA1 - 0xDAFE, array index: 0x2469 */ + 0x741A,0x7421,0x742D,0x7431,0x7424,0x7423,0x741D,0x7429, + 0x7420,0x7432,0x74FB,0x752F,0x756F,0x756C,0x75E7,0x75DA, + 0x75E1,0x75E6,0x75DD,0x75DF,0x75E4,0x75D7,0x7695,0x7692, + 0x76DA,0x7746,0x7747,0x7744,0x774D,0x7745,0x774A,0x774E, + 0x774B,0x774C,0x77DE,0x77EC,0x7860,0x7864,0x7865,0x785C, + 0x786D,0x7871,0x786A,0x786E,0x7870,0x7869,0x7868,0x785E, + 0x7862,0x7974,0x7973,0x7972,0x7970,0x7A02,0x7A0A,0x7A03, + 0x7A0C,0x7A04,0x7A99,0x7AE6,0x7AE4,0x7B4A,0x7B3B,0x7B44, + 0x7B48,0x7B4C,0x7B4E,0x7B40,0x7B58,0x7B45,0x7CA2,0x7C9E, + 0x7CA8,0x7CA1,0x7D58,0x7D6F,0x7D63,0x7D53,0x7D56,0x7D67, + 0x7D6A,0x7D4F,0x7D6D,0x7D5C,0x7D6B,0x7D52,0x7D54,0x7D69, + 0x7D51,0x7D5F,0x7D4E,0x7F3E,0x7F3F,0x7F65, + /* Range 0xDB40 - 0xDB7E, array index: 0x24C7 */ + 0x7F66,0x7FA2,0x7FA0,0x7FA1,0x7FD7,0x8051,0x804F,0x8050, + 0x80FE,0x80D4,0x8143,0x814A,0x8152,0x814F,0x8147,0x813D, + 0x814D,0x813A,0x81E6,0x81EE,0x81F7,0x81F8,0x81F9,0x8204, + 0x823C,0x823D,0x823F,0x8275,0x833B,0x83CF,0x83F9,0x8423, + 0x83C0,0x83E8,0x8412,0x83E7,0x83E4,0x83FC,0x83F6,0x8410, + 0x83C6,0x83C8,0x83EB,0x83E3,0x83BF,0x8401,0x83DD,0x83E5, + 0x83D8,0x83FF,0x83E1,0x83CB,0x83CE,0x83D6,0x83F5,0x83C9, + 0x8409,0x840F,0x83DE,0x8411,0x8406,0x83C2,0x83F3, + /* Range 0xDBA1 - 0xDBFE, array index: 0x2506 */ + 0x83D5,0x83FA,0x83C7,0x83D1,0x83EA,0x8413,0x83C3,0x83EC, + 0x83EE,0x83C4,0x83FB,0x83D7,0x83E2,0x841B,0x83DB,0x83FE, + 0x86D8,0x86E2,0x86E6,0x86D3,0x86E3,0x86DA,0x86EA,0x86DD, + 0x86EB,0x86DC,0x86EC,0x86E9,0x86D7,0x86E8,0x86D1,0x8848, + 0x8856,0x8855,0x88BA,0x88D7,0x88B9,0x88B8,0x88C0,0x88BE, + 0x88B6,0x88BC,0x88B7,0x88BD,0x88B2,0x8901,0x88C9,0x8995, + 0x8998,0x8997,0x89DD,0x89DA,0x89DB,0x8A4E,0x8A4D,0x8A39, + 0x8A59,0x8A40,0x8A57,0x8A58,0x8A44,0x8A45,0x8A52,0x8A48, + 0x8A51,0x8A4A,0x8A4C,0x8A4F,0x8C5F,0x8C81,0x8C80,0x8CBA, + 0x8CBE,0x8CB0,0x8CB9,0x8CB5,0x8D84,0x8D80,0x8D89,0x8DD8, + 0x8DD3,0x8DCD,0x8DC7,0x8DD6,0x8DDC,0x8DCF,0x8DD5,0x8DD9, + 0x8DC8,0x8DD7,0x8DC5,0x8EEF,0x8EF7,0x8EFA, + /* Range 0xDC40 - 0xDC7E, array index: 0x2564 */ + 0x8EF9,0x8EE6,0x8EEE,0x8EE5,0x8EF5,0x8EE7,0x8EE8,0x8EF6, + 0x8EEB,0x8EF1,0x8EEC,0x8EF4,0x8EE9,0x902D,0x9034,0x902F, + 0x9106,0x912C,0x9104,0x90FF,0x90FC,0x9108,0x90F9,0x90FB, + 0x9101,0x9100,0x9107,0x9105,0x9103,0x9161,0x9164,0x915F, + 0x9162,0x9160,0x9201,0x920A,0x9225,0x9203,0x921A,0x9226, + 0x920F,0x920C,0x9200,0x9212,0x91FF,0x91FD,0x9206,0x9204, + 0x9227,0x9202,0x921C,0x9224,0x9219,0x9217,0x9205,0x9216, + 0x957B,0x958D,0x958C,0x9590,0x9687,0x967E,0x9688, + /* Range 0xDCA1 - 0xDCFE, array index: 0x25A3 */ + 0x9689,0x9683,0x9680,0x96C2,0x96C8,0x96C3,0x96F1,0x96F0, + 0x976C,0x9770,0x976E,0x9807,0x98A9,0x98EB,0x9CE6,0x9EF9, + 0x4E83,0x4E84,0x4EB6,0x50BD,0x50BF,0x50C6,0x50AE,0x50C4, + 0x50CA,0x50B4,0x50C8,0x50C2,0x50B0,0x50C1,0x50BA,0x50B1, + 0x50CB,0x50C9,0x50B6,0x50B8,0x51D7,0x527A,0x5278,0x527B, + 0x527C,0x55C3,0x55DB,0x55CC,0x55D0,0x55CB,0x55CA,0x55DD, + 0x55C0,0x55D4,0x55C4,0x55E9,0x55BF,0x55D2,0x558D,0x55CF, + 0x55D5,0x55E2,0x55D6,0x55C8,0x55F2,0x55CD,0x55D9,0x55C2, + 0x5714,0x5853,0x5868,0x5864,0x584F,0x584D,0x5849,0x586F, + 0x5855,0x584E,0x585D,0x5859,0x5865,0x585B,0x583D,0x5863, + 0x5871,0x58FC,0x5AC7,0x5AC4,0x5ACB,0x5ABA,0x5AB8,0x5AB1, + 0x5AB5,0x5AB0,0x5ABF,0x5AC8,0x5ABB,0x5AC6, + /* Range 0xDD40 - 0xDD7E, array index: 0x2601 */ + 0x5AB7,0x5AC0,0x5ACA,0x5AB4,0x5AB6,0x5ACD,0x5AB9,0x5A90, + 0x5BD6,0x5BD8,0x5BD9,0x5C1F,0x5C33,0x5D71,0x5D63,0x5D4A, + 0x5D65,0x5D72,0x5D6C,0x5D5E,0x5D68,0x5D67,0x5D62,0x5DF0, + 0x5E4F,0x5E4E,0x5E4A,0x5E4D,0x5E4B,0x5EC5,0x5ECC,0x5EC6, + 0x5ECB,0x5EC7,0x5F40,0x5FAF,0x5FAD,0x60F7,0x6149,0x614A, + 0x612B,0x6145,0x6136,0x6132,0x612E,0x6146,0x612F,0x614F, + 0x6129,0x6140,0x6220,0x9168,0x6223,0x6225,0x6224,0x63C5, + 0x63F1,0x63EB,0x6410,0x6412,0x6409,0x6420,0x6424, + /* Range 0xDDA1 - 0xDDFE, array index: 0x2640 */ + 0x6433,0x6443,0x641F,0x6415,0x6418,0x6439,0x6437,0x6422, + 0x6423,0x640C,0x6426,0x6430,0x6428,0x6441,0x6435,0x642F, + 0x640A,0x641A,0x6440,0x6425,0x6427,0x640B,0x63E7,0x641B, + 0x642E,0x6421,0x640E,0x656F,0x6592,0x65D3,0x6686,0x668C, + 0x6695,0x6690,0x668B,0x668A,0x6699,0x6694,0x6678,0x6720, + 0x6966,0x695F,0x6938,0x694E,0x6962,0x6971,0x693F,0x6945, + 0x696A,0x6939,0x6942,0x6957,0x6959,0x697A,0x6948,0x6949, + 0x6935,0x696C,0x6933,0x693D,0x6965,0x68F0,0x6978,0x6934, + 0x6969,0x6940,0x696F,0x6944,0x6976,0x6958,0x6941,0x6974, + 0x694C,0x693B,0x694B,0x6937,0x695C,0x694F,0x6951,0x6932, + 0x6952,0x692F,0x697B,0x693C,0x6B46,0x6B45,0x6B43,0x6B42, + 0x6B48,0x6B41,0x6B9B,0xFA0D,0x6BFB,0x6BFC, + /* Range 0xDE40 - 0xDE7E, array index: 0x269E */ + 0x6BF9,0x6BF7,0x6BF8,0x6E9B,0x6ED6,0x6EC8,0x6E8F,0x6EC0, + 0x6E9F,0x6E93,0x6E94,0x6EA0,0x6EB1,0x6EB9,0x6EC6,0x6ED2, + 0x6EBD,0x6EC1,0x6E9E,0x6EC9,0x6EB7,0x6EB0,0x6ECD,0x6EA6, + 0x6ECF,0x6EB2,0x6EBE,0x6EC3,0x6EDC,0x6ED8,0x6E99,0x6E92, + 0x6E8E,0x6E8D,0x6EA4,0x6EA1,0x6EBF,0x6EB3,0x6ED0,0x6ECA, + 0x6E97,0x6EAE,0x6EA3,0x7147,0x7154,0x7152,0x7163,0x7160, + 0x7141,0x715D,0x7162,0x7172,0x7178,0x716A,0x7161,0x7142, + 0x7158,0x7143,0x714B,0x7170,0x715F,0x7150,0x7153, + /* Range 0xDEA1 - 0xDEFE, array index: 0x26DD */ + 0x7144,0x714D,0x715A,0x724F,0x728D,0x728C,0x7291,0x7290, + 0x728E,0x733C,0x7342,0x733B,0x733A,0x7340,0x734A,0x7349, + 0x7444,0x744A,0x744B,0x7452,0x7451,0x7457,0x7440,0x744F, + 0x7450,0x744E,0x7442,0x7446,0x744D,0x7454,0x74E1,0x74FF, + 0x74FE,0x74FD,0x751D,0x7579,0x7577,0x6983,0x75EF,0x760F, + 0x7603,0x75F7,0x75FE,0x75FC,0x75F9,0x75F8,0x7610,0x75FB, + 0x75F6,0x75ED,0x75F5,0x75FD,0x7699,0x76B5,0x76DD,0x7755, + 0x775F,0x7760,0x7752,0x7756,0x775A,0x7769,0x7767,0x7754, + 0x7759,0x776D,0x77E0,0x7887,0x789A,0x7894,0x788F,0x7884, + 0x7895,0x7885,0x7886,0x78A1,0x7883,0x7879,0x7899,0x7880, + 0x7896,0x787B,0x797C,0x7982,0x797D,0x7979,0x7A11,0x7A18, + 0x7A19,0x7A12,0x7A17,0x7A15,0x7A22,0x7A13, + /* Range 0xDF40 - 0xDF7E, array index: 0x273B */ + 0x7A1B,0x7A10,0x7AA3,0x7AA2,0x7A9E,0x7AEB,0x7B66,0x7B64, + 0x7B6D,0x7B74,0x7B69,0x7B72,0x7B65,0x7B73,0x7B71,0x7B70, + 0x7B61,0x7B78,0x7B76,0x7B63,0x7CB2,0x7CB4,0x7CAF,0x7D88, + 0x7D86,0x7D80,0x7D8D,0x7D7F,0x7D85,0x7D7A,0x7D8E,0x7D7B, + 0x7D83,0x7D7C,0x7D8C,0x7D94,0x7D84,0x7D7D,0x7D92,0x7F6D, + 0x7F6B,0x7F67,0x7F68,0x7F6C,0x7FA6,0x7FA5,0x7FA7,0x7FDB, + 0x7FDC,0x8021,0x8164,0x8160,0x8177,0x815C,0x8169,0x815B, + 0x8162,0x8172,0x6721,0x815E,0x8176,0x8167,0x816F, + /* Range 0xDFA1 - 0xDFFE, array index: 0x277A */ + 0x8144,0x8161,0x821D,0x8249,0x8244,0x8240,0x8242,0x8245, + 0x84F1,0x843F,0x8456,0x8476,0x8479,0x848F,0x848D,0x8465, + 0x8451,0x8440,0x8486,0x8467,0x8430,0x844D,0x847D,0x845A, + 0x8459,0x8474,0x8473,0x845D,0x8507,0x845E,0x8437,0x843A, + 0x8434,0x847A,0x8443,0x8478,0x8432,0x8445,0x8429,0x83D9, + 0x844B,0x842F,0x8442,0x842D,0x845F,0x8470,0x8439,0x844E, + 0x844C,0x8452,0x846F,0x84C5,0x848E,0x843B,0x8447,0x8436, + 0x8433,0x8468,0x847E,0x8444,0x842B,0x8460,0x8454,0x846E, + 0x8450,0x870B,0x8704,0x86F7,0x870C,0x86FA,0x86D6,0x86F5, + 0x874D,0x86F8,0x870E,0x8709,0x8701,0x86F6,0x870D,0x8705, + 0x88D6,0x88CB,0x88CD,0x88CE,0x88DE,0x88DB,0x88DA,0x88CC, + 0x88D0,0x8985,0x899B,0x89DF,0x89E5,0x89E4, + /* Range 0xE040 - 0xE07E, array index: 0x27D8 */ + 0x89E1,0x89E0,0x89E2,0x89DC,0x89E6,0x8A76,0x8A86,0x8A7F, + 0x8A61,0x8A3F,0x8A77,0x8A82,0x8A84,0x8A75,0x8A83,0x8A81, + 0x8A74,0x8A7A,0x8C3C,0x8C4B,0x8C4A,0x8C65,0x8C64,0x8C66, + 0x8C86,0x8C84,0x8C85,0x8CCC,0x8D68,0x8D69,0x8D91,0x8D8C, + 0x8D8E,0x8D8F,0x8D8D,0x8D93,0x8D94,0x8D90,0x8D92,0x8DF0, + 0x8DE0,0x8DEC,0x8DF1,0x8DEE,0x8DD0,0x8DE9,0x8DE3,0x8DE2, + 0x8DE7,0x8DF2,0x8DEB,0x8DF4,0x8F06,0x8EFF,0x8F01,0x8F00, + 0x8F05,0x8F07,0x8F08,0x8F02,0x8F0B,0x9052,0x903F, + /* Range 0xE0A1 - 0xE0FE, array index: 0x2817 */ + 0x9044,0x9049,0x903D,0x9110,0x910D,0x910F,0x9111,0x9116, + 0x9114,0x910B,0x910E,0x916E,0x916F,0x9248,0x9252,0x9230, + 0x923A,0x9266,0x9233,0x9265,0x925E,0x9283,0x922E,0x924A, + 0x9246,0x926D,0x926C,0x924F,0x9260,0x9267,0x926F,0x9236, + 0x9261,0x9270,0x9231,0x9254,0x9263,0x9250,0x9272,0x924E, + 0x9253,0x924C,0x9256,0x9232,0x959F,0x959C,0x959E,0x959B, + 0x9692,0x9693,0x9691,0x9697,0x96CE,0x96FA,0x96FD,0x96F8, + 0x96F5,0x9773,0x9777,0x9778,0x9772,0x980F,0x980D,0x980E, + 0x98AC,0x98F6,0x98F9,0x99AF,0x99B2,0x99B0,0x99B5,0x9AAD, + 0x9AAB,0x9B5B,0x9CEA,0x9CED,0x9CE7,0x9E80,0x9EFD,0x50E6, + 0x50D4,0x50D7,0x50E8,0x50F3,0x50DB,0x50EA,0x50DD,0x50E4, + 0x50D3,0x50EC,0x50F0,0x50EF,0x50E3,0x50E0, + /* Range 0xE140 - 0xE17E, array index: 0x2875 */ + 0x51D8,0x5280,0x5281,0x52E9,0x52EB,0x5330,0x53AC,0x5627, + 0x5615,0x560C,0x5612,0x55FC,0x560F,0x561C,0x5601,0x5613, + 0x5602,0x55FA,0x561D,0x5604,0x55FF,0x55F9,0x5889,0x587C, + 0x5890,0x5898,0x5886,0x5881,0x587F,0x5874,0x588B,0x587A, + 0x5887,0x5891,0x588E,0x5876,0x5882,0x5888,0x587B,0x5894, + 0x588F,0x58FE,0x596B,0x5ADC,0x5AEE,0x5AE5,0x5AD5,0x5AEA, + 0x5ADA,0x5AED,0x5AEB,0x5AF3,0x5AE2,0x5AE0,0x5ADB,0x5AEC, + 0x5ADE,0x5ADD,0x5AD9,0x5AE8,0x5ADF,0x5B77,0x5BE0, + /* Range 0xE1A1 - 0xE1FE, array index: 0x28B4 */ + 0x5BE3,0x5C63,0x5D82,0x5D80,0x5D7D,0x5D86,0x5D7A,0x5D81, + 0x5D77,0x5D8A,0x5D89,0x5D88,0x5D7E,0x5D7C,0x5D8D,0x5D79, + 0x5D7F,0x5E58,0x5E59,0x5E53,0x5ED8,0x5ED1,0x5ED7,0x5ECE, + 0x5EDC,0x5ED5,0x5ED9,0x5ED2,0x5ED4,0x5F44,0x5F43,0x5F6F, + 0x5FB6,0x612C,0x6128,0x6141,0x615E,0x6171,0x6173,0x6152, + 0x6153,0x6172,0x616C,0x6180,0x6174,0x6154,0x617A,0x615B, + 0x6165,0x613B,0x616A,0x6161,0x6156,0x6229,0x6227,0x622B, + 0x642B,0x644D,0x645B,0x645D,0x6474,0x6476,0x6472,0x6473, + 0x647D,0x6475,0x6466,0x64A6,0x644E,0x6482,0x645E,0x645C, + 0x644B,0x6453,0x6460,0x6450,0x647F,0x643F,0x646C,0x646B, + 0x6459,0x6465,0x6477,0x6573,0x65A0,0x66A1,0x66A0,0x669F, + 0x6705,0x6704,0x6722,0x69B1,0x69B6,0x69C9, + /* Range 0xE240 - 0xE27E, array index: 0x2912 */ + 0x69A0,0x69CE,0x6996,0x69B0,0x69AC,0x69BC,0x6991,0x6999, + 0x698E,0x69A7,0x698D,0x69A9,0x69BE,0x69AF,0x69BF,0x69C4, + 0x69BD,0x69A4,0x69D4,0x69B9,0x69CA,0x699A,0x69CF,0x69B3, + 0x6993,0x69AA,0x69A1,0x699E,0x69D9,0x6997,0x6990,0x69C2, + 0x69B5,0x69A5,0x69C6,0x6B4A,0x6B4D,0x6B4B,0x6B9E,0x6B9F, + 0x6BA0,0x6BC3,0x6BC4,0x6BFE,0x6ECE,0x6EF5,0x6EF1,0x6F03, + 0x6F25,0x6EF8,0x6F37,0x6EFB,0x6F2E,0x6F09,0x6F4E,0x6F19, + 0x6F1A,0x6F27,0x6F18,0x6F3B,0x6F12,0x6EED,0x6F0A, + /* Range 0xE2A1 - 0xE2FE, array index: 0x2951 */ + 0x6F36,0x6F73,0x6EF9,0x6EEE,0x6F2D,0x6F40,0x6F30,0x6F3C, + 0x6F35,0x6EEB,0x6F07,0x6F0E,0x6F43,0x6F05,0x6EFD,0x6EF6, + 0x6F39,0x6F1C,0x6EFC,0x6F3A,0x6F1F,0x6F0D,0x6F1E,0x6F08, + 0x6F21,0x7187,0x7190,0x7189,0x7180,0x7185,0x7182,0x718F, + 0x717B,0x7186,0x7181,0x7197,0x7244,0x7253,0x7297,0x7295, + 0x7293,0x7343,0x734D,0x7351,0x734C,0x7462,0x7473,0x7471, + 0x7475,0x7472,0x7467,0x746E,0x7500,0x7502,0x7503,0x757D, + 0x7590,0x7616,0x7608,0x760C,0x7615,0x7611,0x760A,0x7614, + 0x76B8,0x7781,0x777C,0x7785,0x7782,0x776E,0x7780,0x776F, + 0x777E,0x7783,0x78B2,0x78AA,0x78B4,0x78AD,0x78A8,0x787E, + 0x78AB,0x789E,0x78A5,0x78A0,0x78AC,0x78A2,0x78A4,0x7998, + 0x798A,0x798B,0x7996,0x7995,0x7994,0x7993, + /* Range 0xE340 - 0xE37E, array index: 0x29AF */ + 0x7997,0x7988,0x7992,0x7990,0x7A2B,0x7A4A,0x7A30,0x7A2F, + 0x7A28,0x7A26,0x7AA8,0x7AAB,0x7AAC,0x7AEE,0x7B88,0x7B9C, + 0x7B8A,0x7B91,0x7B90,0x7B96,0x7B8D,0x7B8C,0x7B9B,0x7B8E, + 0x7B85,0x7B98,0x5284,0x7B99,0x7BA4,0x7B82,0x7CBB,0x7CBF, + 0x7CBC,0x7CBA,0x7DA7,0x7DB7,0x7DC2,0x7DA3,0x7DAA,0x7DC1, + 0x7DC0,0x7DC5,0x7D9D,0x7DCE,0x7DC4,0x7DC6,0x7DCB,0x7DCC, + 0x7DAF,0x7DB9,0x7D96,0x7DBC,0x7D9F,0x7DA6,0x7DAE,0x7DA9, + 0x7DA1,0x7DC9,0x7F73,0x7FE2,0x7FE3,0x7FE5,0x7FDE, + /* Range 0xE3A1 - 0xE3FE, array index: 0x29EE */ + 0x8024,0x805D,0x805C,0x8189,0x8186,0x8183,0x8187,0x818D, + 0x818C,0x818B,0x8215,0x8497,0x84A4,0x84A1,0x849F,0x84BA, + 0x84CE,0x84C2,0x84AC,0x84AE,0x84AB,0x84B9,0x84B4,0x84C1, + 0x84CD,0x84AA,0x849A,0x84B1,0x84D0,0x849D,0x84A7,0x84BB, + 0x84A2,0x8494,0x84C7,0x84CC,0x849B,0x84A9,0x84AF,0x84A8, + 0x84D6,0x8498,0x84B6,0x84CF,0x84A0,0x84D7,0x84D4,0x84D2, + 0x84DB,0x84B0,0x8491,0x8661,0x8733,0x8723,0x8728,0x876B, + 0x8740,0x872E,0x871E,0x8721,0x8719,0x871B,0x8743,0x872C, + 0x8741,0x873E,0x8746,0x8720,0x8732,0x872A,0x872D,0x873C, + 0x8712,0x873A,0x8731,0x8735,0x8742,0x8726,0x8727,0x8738, + 0x8724,0x871A,0x8730,0x8711,0x88F7,0x88E7,0x88F1,0x88F2, + 0x88FA,0x88FE,0x88EE,0x88FC,0x88F6,0x88FB, + /* Range 0xE440 - 0xE47E, array index: 0x2A4C */ + 0x88F0,0x88EC,0x88EB,0x899D,0x89A1,0x899F,0x899E,0x89E9, + 0x89EB,0x89E8,0x8AAB,0x8A99,0x8A8B,0x8A92,0x8A8F,0x8A96, + 0x8C3D,0x8C68,0x8C69,0x8CD5,0x8CCF,0x8CD7,0x8D96,0x8E09, + 0x8E02,0x8DFF,0x8E0D,0x8DFD,0x8E0A,0x8E03,0x8E07,0x8E06, + 0x8E05,0x8DFE,0x8E00,0x8E04,0x8F10,0x8F11,0x8F0E,0x8F0D, + 0x9123,0x911C,0x9120,0x9122,0x911F,0x911D,0x911A,0x9124, + 0x9121,0x911B,0x917A,0x9172,0x9179,0x9173,0x92A5,0x92A4, + 0x9276,0x929B,0x927A,0x92A0,0x9294,0x92AA,0x928D, + /* Range 0xE4A1 - 0xE4FE, array index: 0x2A8B */ + 0x92A6,0x929A,0x92AB,0x9279,0x9297,0x927F,0x92A3,0x92EE, + 0x928E,0x9282,0x9295,0x92A2,0x927D,0x9288,0x92A1,0x928A, + 0x9286,0x928C,0x9299,0x92A7,0x927E,0x9287,0x92A9,0x929D, + 0x928B,0x922D,0x969E,0x96A1,0x96FF,0x9758,0x977D,0x977A, + 0x977E,0x9783,0x9780,0x9782,0x977B,0x9784,0x9781,0x977F, + 0x97CE,0x97CD,0x9816,0x98AD,0x98AE,0x9902,0x9900,0x9907, + 0x999D,0x999C,0x99C3,0x99B9,0x99BB,0x99BA,0x99C2,0x99BD, + 0x99C7,0x9AB1,0x9AE3,0x9AE7,0x9B3E,0x9B3F,0x9B60,0x9B61, + 0x9B5F,0x9CF1,0x9CF2,0x9CF5,0x9EA7,0x50FF,0x5103,0x5130, + 0x50F8,0x5106,0x5107,0x50F6,0x50FE,0x510B,0x510C,0x50FD, + 0x510A,0x528B,0x528C,0x52F1,0x52EF,0x5648,0x5642,0x564C, + 0x5635,0x5641,0x564A,0x5649,0x5646,0x5658, + /* Range 0xE540 - 0xE57E, array index: 0x2AE9 */ + 0x565A,0x5640,0x5633,0x563D,0x562C,0x563E,0x5638,0x562A, + 0x563A,0x571A,0x58AB,0x589D,0x58B1,0x58A0,0x58A3,0x58AF, + 0x58AC,0x58A5,0x58A1,0x58FF,0x5AFF,0x5AF4,0x5AFD,0x5AF7, + 0x5AF6,0x5B03,0x5AF8,0x5B02,0x5AF9,0x5B01,0x5B07,0x5B05, + 0x5B0F,0x5C67,0x5D99,0x5D97,0x5D9F,0x5D92,0x5DA2,0x5D93, + 0x5D95,0x5DA0,0x5D9C,0x5DA1,0x5D9A,0x5D9E,0x5E69,0x5E5D, + 0x5E60,0x5E5C,0x7DF3,0x5EDB,0x5EDE,0x5EE1,0x5F49,0x5FB2, + 0x618B,0x6183,0x6179,0x61B1,0x61B0,0x61A2,0x6189, + /* Range 0xE5A1 - 0xE5FE, array index: 0x2B28 */ + 0x619B,0x6193,0x61AF,0x61AD,0x619F,0x6192,0x61AA,0x61A1, + 0x618D,0x6166,0x61B3,0x622D,0x646E,0x6470,0x6496,0x64A0, + 0x6485,0x6497,0x649C,0x648F,0x648B,0x648A,0x648C,0x64A3, + 0x649F,0x6468,0x64B1,0x6498,0x6576,0x657A,0x6579,0x657B, + 0x65B2,0x65B3,0x66B5,0x66B0,0x66A9,0x66B2,0x66B7,0x66AA, + 0x66AF,0x6A00,0x6A06,0x6A17,0x69E5,0x69F8,0x6A15,0x69F1, + 0x69E4,0x6A20,0x69FF,0x69EC,0x69E2,0x6A1B,0x6A1D,0x69FE, + 0x6A27,0x69F2,0x69EE,0x6A14,0x69F7,0x69E7,0x6A40,0x6A08, + 0x69E6,0x69FB,0x6A0D,0x69FC,0x69EB,0x6A09,0x6A04,0x6A18, + 0x6A25,0x6A0F,0x69F6,0x6A26,0x6A07,0x69F4,0x6A16,0x6B51, + 0x6BA5,0x6BA3,0x6BA2,0x6BA6,0x6C01,0x6C00,0x6BFF,0x6C02, + 0x6F41,0x6F26,0x6F7E,0x6F87,0x6FC6,0x6F92, + /* Range 0xE640 - 0xE67E, array index: 0x2B86 */ + 0x6F8D,0x6F89,0x6F8C,0x6F62,0x6F4F,0x6F85,0x6F5A,0x6F96, + 0x6F76,0x6F6C,0x6F82,0x6F55,0x6F72,0x6F52,0x6F50,0x6F57, + 0x6F94,0x6F93,0x6F5D,0x6F00,0x6F61,0x6F6B,0x6F7D,0x6F67, + 0x6F90,0x6F53,0x6F8B,0x6F69,0x6F7F,0x6F95,0x6F63,0x6F77, + 0x6F6A,0x6F7B,0x71B2,0x71AF,0x719B,0x71B0,0x71A0,0x719A, + 0x71A9,0x71B5,0x719D,0x71A5,0x719E,0x71A4,0x71A1,0x71AA, + 0x719C,0x71A7,0x71B3,0x7298,0x729A,0x7358,0x7352,0x735E, + 0x735F,0x7360,0x735D,0x735B,0x7361,0x735A,0x7359, + /* Range 0xE6A1 - 0xE6FE, array index: 0x2BC5 */ + 0x7362,0x7487,0x7489,0x748A,0x7486,0x7481,0x747D,0x7485, + 0x7488,0x747C,0x7479,0x7508,0x7507,0x757E,0x7625,0x761E, + 0x7619,0x761D,0x761C,0x7623,0x761A,0x7628,0x761B,0x769C, + 0x769D,0x769E,0x769B,0x778D,0x778F,0x7789,0x7788,0x78CD, + 0x78BB,0x78CF,0x78CC,0x78D1,0x78CE,0x78D4,0x78C8,0x78C3, + 0x78C4,0x78C9,0x799A,0x79A1,0x79A0,0x799C,0x79A2,0x799B, + 0x6B76,0x7A39,0x7AB2,0x7AB4,0x7AB3,0x7BB7,0x7BCB,0x7BBE, + 0x7BAC,0x7BCE,0x7BAF,0x7BB9,0x7BCA,0x7BB5,0x7CC5,0x7CC8, + 0x7CCC,0x7CCB,0x7DF7,0x7DDB,0x7DEA,0x7DE7,0x7DD7,0x7DE1, + 0x7E03,0x7DFA,0x7DE6,0x7DF6,0x7DF1,0x7DF0,0x7DEE,0x7DDF, + 0x7F76,0x7FAC,0x7FB0,0x7FAD,0x7FED,0x7FEB,0x7FEA,0x7FEC, + 0x7FE6,0x7FE8,0x8064,0x8067,0x81A3,0x819F, + /* Range 0xE740 - 0xE77E, array index: 0x2C23 */ + 0x819E,0x8195,0x81A2,0x8199,0x8197,0x8216,0x824F,0x8253, + 0x8252,0x8250,0x824E,0x8251,0x8524,0x853B,0x850F,0x8500, + 0x8529,0x850E,0x8509,0x850D,0x851F,0x850A,0x8527,0x851C, + 0x84FB,0x852B,0x84FA,0x8508,0x850C,0x84F4,0x852A,0x84F2, + 0x8515,0x84F7,0x84EB,0x84F3,0x84FC,0x8512,0x84EA,0x84E9, + 0x8516,0x84FE,0x8528,0x851D,0x852E,0x8502,0x84FD,0x851E, + 0x84F6,0x8531,0x8526,0x84E7,0x84E8,0x84F0,0x84EF,0x84F9, + 0x8518,0x8520,0x8530,0x850B,0x8519,0x852F,0x8662, + /* Range 0xE7A1 - 0xE7FE, array index: 0x2C62 */ + 0x8756,0x8763,0x8764,0x8777,0x87E1,0x8773,0x8758,0x8754, + 0x875B,0x8752,0x8761,0x875A,0x8751,0x875E,0x876D,0x876A, + 0x8750,0x874E,0x875F,0x875D,0x876F,0x876C,0x877A,0x876E, + 0x875C,0x8765,0x874F,0x877B,0x8775,0x8762,0x8767,0x8769, + 0x885A,0x8905,0x890C,0x8914,0x890B,0x8917,0x8918,0x8919, + 0x8906,0x8916,0x8911,0x890E,0x8909,0x89A2,0x89A4,0x89A3, + 0x89ED,0x89F0,0x89EC,0x8ACF,0x8AC6,0x8AB8,0x8AD3,0x8AD1, + 0x8AD4,0x8AD5,0x8ABB,0x8AD7,0x8ABE,0x8AC0,0x8AC5,0x8AD8, + 0x8AC3,0x8ABA,0x8ABD,0x8AD9,0x8C3E,0x8C4D,0x8C8F,0x8CE5, + 0x8CDF,0x8CD9,0x8CE8,0x8CDA,0x8CDD,0x8CE7,0x8DA0,0x8D9C, + 0x8DA1,0x8D9B,0x8E20,0x8E23,0x8E25,0x8E24,0x8E2E,0x8E15, + 0x8E1B,0x8E16,0x8E11,0x8E19,0x8E26,0x8E27, + /* Range 0xE840 - 0xE87E, array index: 0x2CC0 */ + 0x8E14,0x8E12,0x8E18,0x8E13,0x8E1C,0x8E17,0x8E1A,0x8F2C, + 0x8F24,0x8F18,0x8F1A,0x8F20,0x8F23,0x8F16,0x8F17,0x9073, + 0x9070,0x906F,0x9067,0x906B,0x912F,0x912B,0x9129,0x912A, + 0x9132,0x9126,0x912E,0x9185,0x9186,0x918A,0x9181,0x9182, + 0x9184,0x9180,0x92D0,0x92C3,0x92C4,0x92C0,0x92D9,0x92B6, + 0x92CF,0x92F1,0x92DF,0x92D8,0x92E9,0x92D7,0x92DD,0x92CC, + 0x92EF,0x92C2,0x92E8,0x92CA,0x92C8,0x92CE,0x92E6,0x92CD, + 0x92D5,0x92C9,0x92E0,0x92DE,0x92E7,0x92D1,0x92D3, + /* Range 0xE8A1 - 0xE8FE, array index: 0x2CFF */ + 0x92B5,0x92E1,0x92C6,0x92B4,0x957C,0x95AC,0x95AB,0x95AE, + 0x95B0,0x96A4,0x96A2,0x96D3,0x9705,0x9708,0x9702,0x975A, + 0x978A,0x978E,0x9788,0x97D0,0x97CF,0x981E,0x981D,0x9826, + 0x9829,0x9828,0x9820,0x981B,0x9827,0x98B2,0x9908,0x98FA, + 0x9911,0x9914,0x9916,0x9917,0x9915,0x99DC,0x99CD,0x99CF, + 0x99D3,0x99D4,0x99CE,0x99C9,0x99D6,0x99D8,0x99CB,0x99D7, + 0x99CC,0x9AB3,0x9AEC,0x9AEB,0x9AF3,0x9AF2,0x9AF1,0x9B46, + 0x9B43,0x9B67,0x9B74,0x9B71,0x9B66,0x9B76,0x9B75,0x9B70, + 0x9B68,0x9B64,0x9B6C,0x9CFC,0x9CFA,0x9CFD,0x9CFF,0x9CF7, + 0x9D07,0x9D00,0x9CF9,0x9CFB,0x9D08,0x9D05,0x9D04,0x9E83, + 0x9ED3,0x9F0F,0x9F10,0x511C,0x5113,0x5117,0x511A,0x5111, + 0x51DE,0x5334,0x53E1,0x5670,0x5660,0x566E, + /* Range 0xE940 - 0xE97E, array index: 0x2D5D */ + 0x5673,0x5666,0x5663,0x566D,0x5672,0x565E,0x5677,0x571C, + 0x571B,0x58C8,0x58BD,0x58C9,0x58BF,0x58BA,0x58C2,0x58BC, + 0x58C6,0x5B17,0x5B19,0x5B1B,0x5B21,0x5B14,0x5B13,0x5B10, + 0x5B16,0x5B28,0x5B1A,0x5B20,0x5B1E,0x5BEF,0x5DAC,0x5DB1, + 0x5DA9,0x5DA7,0x5DB5,0x5DB0,0x5DAE,0x5DAA,0x5DA8,0x5DB2, + 0x5DAD,0x5DAF,0x5DB4,0x5E67,0x5E68,0x5E66,0x5E6F,0x5EE9, + 0x5EE7,0x5EE6,0x5EE8,0x5EE5,0x5F4B,0x5FBC,0x619D,0x61A8, + 0x6196,0x61C5,0x61B4,0x61C6,0x61C1,0x61CC,0x61BA, + /* Range 0xE9A1 - 0xE9FE, array index: 0x2D9C */ + 0x61BF,0x61B8,0x618C,0x64D7,0x64D6,0x64D0,0x64CF,0x64C9, + 0x64BD,0x6489,0x64C3,0x64DB,0x64F3,0x64D9,0x6533,0x657F, + 0x657C,0x65A2,0x66C8,0x66BE,0x66C0,0x66CA,0x66CB,0x66CF, + 0x66BD,0x66BB,0x66BA,0x66CC,0x6723,0x6A34,0x6A66,0x6A49, + 0x6A67,0x6A32,0x6A68,0x6A3E,0x6A5D,0x6A6D,0x6A76,0x6A5B, + 0x6A51,0x6A28,0x6A5A,0x6A3B,0x6A3F,0x6A41,0x6A6A,0x6A64, + 0x6A50,0x6A4F,0x6A54,0x6A6F,0x6A69,0x6A60,0x6A3C,0x6A5E, + 0x6A56,0x6A55,0x6A4D,0x6A4E,0x6A46,0x6B55,0x6B54,0x6B56, + 0x6BA7,0x6BAA,0x6BAB,0x6BC8,0x6BC7,0x6C04,0x6C03,0x6C06, + 0x6FAD,0x6FCB,0x6FA3,0x6FC7,0x6FBC,0x6FCE,0x6FC8,0x6F5E, + 0x6FC4,0x6FBD,0x6F9E,0x6FCA,0x6FA8,0x7004,0x6FA5,0x6FAE, + 0x6FBA,0x6FAC,0x6FAA,0x6FCF,0x6FBF,0x6FB8, + /* Range 0xEA40 - 0xEA7E, array index: 0x2DFA */ + 0x6FA2,0x6FC9,0x6FAB,0x6FCD,0x6FAF,0x6FB2,0x6FB0,0x71C5, + 0x71C2,0x71BF,0x71B8,0x71D6,0x71C0,0x71C1,0x71CB,0x71D4, + 0x71CA,0x71C7,0x71CF,0x71BD,0x71D8,0x71BC,0x71C6,0x71DA, + 0x71DB,0x729D,0x729E,0x7369,0x7366,0x7367,0x736C,0x7365, + 0x736B,0x736A,0x747F,0x749A,0x74A0,0x7494,0x7492,0x7495, + 0x74A1,0x750B,0x7580,0x762F,0x762D,0x7631,0x763D,0x7633, + 0x763C,0x7635,0x7632,0x7630,0x76BB,0x76E6,0x779A,0x779D, + 0x77A1,0x779C,0x779B,0x77A2,0x77A3,0x7795,0x7799, + /* Range 0xEAA1 - 0xEAFE, array index: 0x2E39 */ + 0x7797,0x78DD,0x78E9,0x78E5,0x78EA,0x78DE,0x78E3,0x78DB, + 0x78E1,0x78E2,0x78ED,0x78DF,0x78E0,0x79A4,0x7A44,0x7A48, + 0x7A47,0x7AB6,0x7AB8,0x7AB5,0x7AB1,0x7AB7,0x7BDE,0x7BE3, + 0x7BE7,0x7BDD,0x7BD5,0x7BE5,0x7BDA,0x7BE8,0x7BF9,0x7BD4, + 0x7BEA,0x7BE2,0x7BDC,0x7BEB,0x7BD8,0x7BDF,0x7CD2,0x7CD4, + 0x7CD7,0x7CD0,0x7CD1,0x7E12,0x7E21,0x7E17,0x7E0C,0x7E1F, + 0x7E20,0x7E13,0x7E0E,0x7E1C,0x7E15,0x7E1A,0x7E22,0x7E0B, + 0x7E0F,0x7E16,0x7E0D,0x7E14,0x7E25,0x7E24,0x7F43,0x7F7B, + 0x7F7C,0x7F7A,0x7FB1,0x7FEF,0x802A,0x8029,0x806C,0x81B1, + 0x81A6,0x81AE,0x81B9,0x81B5,0x81AB,0x81B0,0x81AC,0x81B4, + 0x81B2,0x81B7,0x81A7,0x81F2,0x8255,0x8256,0x8257,0x8556, + 0x8545,0x856B,0x854D,0x8553,0x8561,0x8558, + /* Range 0xEB40 - 0xEB7E, array index: 0x2E97 */ + 0x8540,0x8546,0x8564,0x8541,0x8562,0x8544,0x8551,0x8547, + 0x8563,0x853E,0x855B,0x8571,0x854E,0x856E,0x8575,0x8555, + 0x8567,0x8560,0x858C,0x8566,0x855D,0x8554,0x8565,0x856C, + 0x8663,0x8665,0x8664,0x879B,0x878F,0x8797,0x8793,0x8792, + 0x8788,0x8781,0x8796,0x8798,0x8779,0x8787,0x87A3,0x8785, + 0x8790,0x8791,0x879D,0x8784,0x8794,0x879C,0x879A,0x8789, + 0x891E,0x8926,0x8930,0x892D,0x892E,0x8927,0x8931,0x8922, + 0x8929,0x8923,0x892F,0x892C,0x891F,0x89F1,0x8AE0, + /* Range 0xEBA1 - 0xEBFE, array index: 0x2ED6 */ + 0x8AE2,0x8AF2,0x8AF4,0x8AF5,0x8ADD,0x8B14,0x8AE4,0x8ADF, + 0x8AF0,0x8AC8,0x8ADE,0x8AE1,0x8AE8,0x8AFF,0x8AEF,0x8AFB, + 0x8C91,0x8C92,0x8C90,0x8CF5,0x8CEE,0x8CF1,0x8CF0,0x8CF3, + 0x8D6C,0x8D6E,0x8DA5,0x8DA7,0x8E33,0x8E3E,0x8E38,0x8E40, + 0x8E45,0x8E36,0x8E3C,0x8E3D,0x8E41,0x8E30,0x8E3F,0x8EBD, + 0x8F36,0x8F2E,0x8F35,0x8F32,0x8F39,0x8F37,0x8F34,0x9076, + 0x9079,0x907B,0x9086,0x90FA,0x9133,0x9135,0x9136,0x9193, + 0x9190,0x9191,0x918D,0x918F,0x9327,0x931E,0x9308,0x931F, + 0x9306,0x930F,0x937A,0x9338,0x933C,0x931B,0x9323,0x9312, + 0x9301,0x9346,0x932D,0x930E,0x930D,0x92CB,0x931D,0x92FA, + 0x9325,0x9313,0x92F9,0x92F7,0x9334,0x9302,0x9324,0x92FF, + 0x9329,0x9339,0x9335,0x932A,0x9314,0x930C, + /* Range 0xEC40 - 0xEC7E, array index: 0x2F34 */ + 0x930B,0x92FE,0x9309,0x9300,0x92FB,0x9316,0x95BC,0x95CD, + 0x95BE,0x95B9,0x95BA,0x95B6,0x95BF,0x95B5,0x95BD,0x96A9, + 0x96D4,0x970B,0x9712,0x9710,0x9799,0x9797,0x9794,0x97F0, + 0x97F8,0x9835,0x982F,0x9832,0x9924,0x991F,0x9927,0x9929, + 0x999E,0x99EE,0x99EC,0x99E5,0x99E4,0x99F0,0x99E3,0x99EA, + 0x99E9,0x99E7,0x9AB9,0x9ABF,0x9AB4,0x9ABB,0x9AF6,0x9AFA, + 0x9AF9,0x9AF7,0x9B33,0x9B80,0x9B85,0x9B87,0x9B7C,0x9B7E, + 0x9B7B,0x9B82,0x9B93,0x9B92,0x9B90,0x9B7A,0x9B95, + /* Range 0xECA1 - 0xECFE, array index: 0x2F73 */ + 0x9B7D,0x9B88,0x9D25,0x9D17,0x9D20,0x9D1E,0x9D14,0x9D29, + 0x9D1D,0x9D18,0x9D22,0x9D10,0x9D19,0x9D1F,0x9E88,0x9E86, + 0x9E87,0x9EAE,0x9EAD,0x9ED5,0x9ED6,0x9EFA,0x9F12,0x9F3D, + 0x5126,0x5125,0x5122,0x5124,0x5120,0x5129,0x52F4,0x5693, + 0x568C,0x568D,0x5686,0x5684,0x5683,0x567E,0x5682,0x567F, + 0x5681,0x58D6,0x58D4,0x58CF,0x58D2,0x5B2D,0x5B25,0x5B32, + 0x5B23,0x5B2C,0x5B27,0x5B26,0x5B2F,0x5B2E,0x5B7B,0x5BF1, + 0x5BF2,0x5DB7,0x5E6C,0x5E6A,0x5FBE,0x5FBB,0x61C3,0x61B5, + 0x61BC,0x61E7,0x61E0,0x61E5,0x61E4,0x61E8,0x61DE,0x64EF, + 0x64E9,0x64E3,0x64EB,0x64E4,0x64E8,0x6581,0x6580,0x65B6, + 0x65DA,0x66D2,0x6A8D,0x6A96,0x6A81,0x6AA5,0x6A89,0x6A9F, + 0x6A9B,0x6AA1,0x6A9E,0x6A87,0x6A93,0x6A8E, + /* Range 0xED40 - 0xED7E, array index: 0x2FD1 */ + 0x6A95,0x6A83,0x6AA8,0x6AA4,0x6A91,0x6A7F,0x6AA6,0x6A9A, + 0x6A85,0x6A8C,0x6A92,0x6B5B,0x6BAD,0x6C09,0x6FCC,0x6FA9, + 0x6FF4,0x6FD4,0x6FE3,0x6FDC,0x6FED,0x6FE7,0x6FE6,0x6FDE, + 0x6FF2,0x6FDD,0x6FE2,0x6FE8,0x71E1,0x71F1,0x71E8,0x71F2, + 0x71E4,0x71F0,0x71E2,0x7373,0x736E,0x736F,0x7497,0x74B2, + 0x74AB,0x7490,0x74AA,0x74AD,0x74B1,0x74A5,0x74AF,0x7510, + 0x7511,0x7512,0x750F,0x7584,0x7643,0x7648,0x7649,0x7647, + 0x76A4,0x76E9,0x77B5,0x77AB,0x77B2,0x77B7,0x77B6, + /* Range 0xEDA1 - 0xEDFE, array index: 0x3010 */ + 0x77B4,0x77B1,0x77A8,0x77F0,0x78F3,0x78FD,0x7902,0x78FB, + 0x78FC,0x78F2,0x7905,0x78F9,0x78FE,0x7904,0x79AB,0x79A8, + 0x7A5C,0x7A5B,0x7A56,0x7A58,0x7A54,0x7A5A,0x7ABE,0x7AC0, + 0x7AC1,0x7C05,0x7C0F,0x7BF2,0x7C00,0x7BFF,0x7BFB,0x7C0E, + 0x7BF4,0x7C0B,0x7BF3,0x7C02,0x7C09,0x7C03,0x7C01,0x7BF8, + 0x7BFD,0x7C06,0x7BF0,0x7BF1,0x7C10,0x7C0A,0x7CE8,0x7E2D, + 0x7E3C,0x7E42,0x7E33,0x9848,0x7E38,0x7E2A,0x7E49,0x7E40, + 0x7E47,0x7E29,0x7E4C,0x7E30,0x7E3B,0x7E36,0x7E44,0x7E3A, + 0x7F45,0x7F7F,0x7F7E,0x7F7D,0x7FF4,0x7FF2,0x802C,0x81BB, + 0x81C4,0x81CC,0x81CA,0x81C5,0x81C7,0x81BC,0x81E9,0x825B, + 0x825A,0x825C,0x8583,0x8580,0x858F,0x85A7,0x8595,0x85A0, + 0x858B,0x85A3,0x857B,0x85A4,0x859A,0x859E, + /* Range 0xEE40 - 0xEE7E, array index: 0x306E */ + 0x8577,0x857C,0x8589,0x85A1,0x857A,0x8578,0x8557,0x858E, + 0x8596,0x8586,0x858D,0x8599,0x859D,0x8581,0x85A2,0x8582, + 0x8588,0x8585,0x8579,0x8576,0x8598,0x8590,0x859F,0x8668, + 0x87BE,0x87AA,0x87AD,0x87C5,0x87B0,0x87AC,0x87B9,0x87B5, + 0x87BC,0x87AE,0x87C9,0x87C3,0x87C2,0x87CC,0x87B7,0x87AF, + 0x87C4,0x87CA,0x87B4,0x87B6,0x87BF,0x87B8,0x87BD,0x87DE, + 0x87B2,0x8935,0x8933,0x893C,0x893E,0x8941,0x8952,0x8937, + 0x8942,0x89AD,0x89AF,0x89AE,0x89F2,0x89F3,0x8B1E, + /* Range 0xEEA1 - 0xEEFE, array index: 0x30AD */ + 0x8B18,0x8B16,0x8B11,0x8B05,0x8B0B,0x8B22,0x8B0F,0x8B12, + 0x8B15,0x8B07,0x8B0D,0x8B08,0x8B06,0x8B1C,0x8B13,0x8B1A, + 0x8C4F,0x8C70,0x8C72,0x8C71,0x8C6F,0x8C95,0x8C94,0x8CF9, + 0x8D6F,0x8E4E,0x8E4D,0x8E53,0x8E50,0x8E4C,0x8E47,0x8F43, + 0x8F40,0x9085,0x907E,0x9138,0x919A,0x91A2,0x919B,0x9199, + 0x919F,0x91A1,0x919D,0x91A0,0x93A1,0x9383,0x93AF,0x9364, + 0x9356,0x9347,0x937C,0x9358,0x935C,0x9376,0x9349,0x9350, + 0x9351,0x9360,0x936D,0x938F,0x934C,0x936A,0x9379,0x9357, + 0x9355,0x9352,0x934F,0x9371,0x9377,0x937B,0x9361,0x935E, + 0x9363,0x9367,0x9380,0x934E,0x9359,0x95C7,0x95C0,0x95C9, + 0x95C3,0x95C5,0x95B7,0x96AE,0x96B0,0x96AC,0x9720,0x971F, + 0x9718,0x971D,0x9719,0x979A,0x97A1,0x979C, + /* Range 0xEF40 - 0xEF7E, array index: 0x310B */ + 0x979E,0x979D,0x97D5,0x97D4,0x97F1,0x9841,0x9844,0x984A, + 0x9849,0x9845,0x9843,0x9925,0x992B,0x992C,0x992A,0x9933, + 0x9932,0x992F,0x992D,0x9931,0x9930,0x9998,0x99A3,0x99A1, + 0x9A02,0x99FA,0x99F4,0x99F7,0x99F9,0x99F8,0x99F6,0x99FB, + 0x99FD,0x99FE,0x99FC,0x9A03,0x9ABE,0x9AFE,0x9AFD,0x9B01, + 0x9AFC,0x9B48,0x9B9A,0x9BA8,0x9B9E,0x9B9B,0x9BA6,0x9BA1, + 0x9BA5,0x9BA4,0x9B86,0x9BA2,0x9BA0,0x9BAF,0x9D33,0x9D41, + 0x9D67,0x9D36,0x9D2E,0x9D2F,0x9D31,0x9D38,0x9D30, + /* Range 0xEFA1 - 0xEFFE, array index: 0x314A */ + 0x9D45,0x9D42,0x9D43,0x9D3E,0x9D37,0x9D40,0x9D3D,0x7FF5, + 0x9D2D,0x9E8A,0x9E89,0x9E8D,0x9EB0,0x9EC8,0x9EDA,0x9EFB, + 0x9EFF,0x9F24,0x9F23,0x9F22,0x9F54,0x9FA0,0x5131,0x512D, + 0x512E,0x5698,0x569C,0x5697,0x569A,0x569D,0x5699,0x5970, + 0x5B3C,0x5C69,0x5C6A,0x5DC0,0x5E6D,0x5E6E,0x61D8,0x61DF, + 0x61ED,0x61EE,0x61F1,0x61EA,0x61F0,0x61EB,0x61D6,0x61E9, + 0x64FF,0x6504,0x64FD,0x64F8,0x6501,0x6503,0x64FC,0x6594, + 0x65DB,0x66DA,0x66DB,0x66D8,0x6AC5,0x6AB9,0x6ABD,0x6AE1, + 0x6AC6,0x6ABA,0x6AB6,0x6AB7,0x6AC7,0x6AB4,0x6AAD,0x6B5E, + 0x6BC9,0x6C0B,0x7007,0x700C,0x700D,0x7001,0x7005,0x7014, + 0x700E,0x6FFF,0x7000,0x6FFB,0x7026,0x6FFC,0x6FF7,0x700A, + 0x7201,0x71FF,0x71F9,0x7203,0x71FD,0x7376, + /* Range 0xF040 - 0xF07E, array index: 0x31A8 */ + 0x74B8,0x74C0,0x74B5,0x74C1,0x74BE,0x74B6,0x74BB,0x74C2, + 0x7514,0x7513,0x765C,0x7664,0x7659,0x7650,0x7653,0x7657, + 0x765A,0x76A6,0x76BD,0x76EC,0x77C2,0x77BA,0x78FF,0x790C, + 0x7913,0x7914,0x7909,0x7910,0x7912,0x7911,0x79AD,0x79AC, + 0x7A5F,0x7C1C,0x7C29,0x7C19,0x7C20,0x7C1F,0x7C2D,0x7C1D, + 0x7C26,0x7C28,0x7C22,0x7C25,0x7C30,0x7E5C,0x7E50,0x7E56, + 0x7E63,0x7E58,0x7E62,0x7E5F,0x7E51,0x7E60,0x7E57,0x7E53, + 0x7FB5,0x7FB3,0x7FF7,0x7FF8,0x8075,0x81D1,0x81D2, + /* Range 0xF0A1 - 0xF0FE, array index: 0x31E7 */ + 0x81D0,0x825F,0x825E,0x85B4,0x85C6,0x85C0,0x85C3,0x85C2, + 0x85B3,0x85B5,0x85BD,0x85C7,0x85C4,0x85BF,0x85CB,0x85CE, + 0x85C8,0x85C5,0x85B1,0x85B6,0x85D2,0x8624,0x85B8,0x85B7, + 0x85BE,0x8669,0x87E7,0x87E6,0x87E2,0x87DB,0x87EB,0x87EA, + 0x87E5,0x87DF,0x87F3,0x87E4,0x87D4,0x87DC,0x87D3,0x87ED, + 0x87D8,0x87E3,0x87A4,0x87D7,0x87D9,0x8801,0x87F4,0x87E8, + 0x87DD,0x8953,0x894B,0x894F,0x894C,0x8946,0x8950,0x8951, + 0x8949,0x8B2A,0x8B27,0x8B23,0x8B33,0x8B30,0x8B35,0x8B47, + 0x8B2F,0x8B3C,0x8B3E,0x8B31,0x8B25,0x8B37,0x8B26,0x8B36, + 0x8B2E,0x8B24,0x8B3B,0x8B3D,0x8B3A,0x8C42,0x8C75,0x8C99, + 0x8C98,0x8C97,0x8CFE,0x8D04,0x8D02,0x8D00,0x8E5C,0x8E62, + 0x8E60,0x8E57,0x8E56,0x8E5E,0x8E65,0x8E67, + /* Range 0xF140 - 0xF17E, array index: 0x3245 */ + 0x8E5B,0x8E5A,0x8E61,0x8E5D,0x8E69,0x8E54,0x8F46,0x8F47, + 0x8F48,0x8F4B,0x9128,0x913A,0x913B,0x913E,0x91A8,0x91A5, + 0x91A7,0x91AF,0x91AA,0x93B5,0x938C,0x9392,0x93B7,0x939B, + 0x939D,0x9389,0x93A7,0x938E,0x93AA,0x939E,0x93A6,0x9395, + 0x9388,0x9399,0x939F,0x938D,0x93B1,0x9391,0x93B2,0x93A4, + 0x93A8,0x93B4,0x93A3,0x93A5,0x95D2,0x95D3,0x95D1,0x96B3, + 0x96D7,0x96DA,0x5DC2,0x96DF,0x96D8,0x96DD,0x9723,0x9722, + 0x9725,0x97AC,0x97AE,0x97A8,0x97AB,0x97A4,0x97AA, + /* Range 0xF1A1 - 0xF1FE, array index: 0x3284 */ + 0x97A2,0x97A5,0x97D7,0x97D9,0x97D6,0x97D8,0x97FA,0x9850, + 0x9851,0x9852,0x98B8,0x9941,0x993C,0x993A,0x9A0F,0x9A0B, + 0x9A09,0x9A0D,0x9A04,0x9A11,0x9A0A,0x9A05,0x9A07,0x9A06, + 0x9AC0,0x9ADC,0x9B08,0x9B04,0x9B05,0x9B29,0x9B35,0x9B4A, + 0x9B4C,0x9B4B,0x9BC7,0x9BC6,0x9BC3,0x9BBF,0x9BC1,0x9BB5, + 0x9BB8,0x9BD3,0x9BB6,0x9BC4,0x9BB9,0x9BBD,0x9D5C,0x9D53, + 0x9D4F,0x9D4A,0x9D5B,0x9D4B,0x9D59,0x9D56,0x9D4C,0x9D57, + 0x9D52,0x9D54,0x9D5F,0x9D58,0x9D5A,0x9E8E,0x9E8C,0x9EDF, + 0x9F01,0x9F00,0x9F16,0x9F25,0x9F2B,0x9F2A,0x9F29,0x9F28, + 0x9F4C,0x9F55,0x5134,0x5135,0x5296,0x52F7,0x53B4,0x56AB, + 0x56AD,0x56A6,0x56A7,0x56AA,0x56AC,0x58DA,0x58DD,0x58DB, + 0x5912,0x5B3D,0x5B3E,0x5B3F,0x5DC3,0x5E70, + /* Range 0xF240 - 0xF27E, array index: 0x32E2 */ + 0x5FBF,0x61FB,0x6507,0x6510,0x650D,0x6509,0x650C,0x650E, + 0x6584,0x65DE,0x65DD,0x66DE,0x6AE7,0x6AE0,0x6ACC,0x6AD1, + 0x6AD9,0x6ACB,0x6ADF,0x6ADC,0x6AD0,0x6AEB,0x6ACF,0x6ACD, + 0x6ADE,0x6B60,0x6BB0,0x6C0C,0x7019,0x7027,0x7020,0x7016, + 0x702B,0x7021,0x7022,0x7023,0x7029,0x7017,0x7024,0x701C, + 0x702A,0x720C,0x720A,0x7207,0x7202,0x7205,0x72A5,0x72A6, + 0x72A4,0x72A3,0x72A1,0x74CB,0x74C5,0x74B7,0x74C3,0x7516, + 0x7660,0x77C9,0x77CA,0x77C4,0x77F1,0x791D,0x791B, + /* Range 0xF2A1 - 0xF2FE, array index: 0x3321 */ + 0x7921,0x791C,0x7917,0x791E,0x79B0,0x7A67,0x7A68,0x7C33, + 0x7C3C,0x7C39,0x7C2C,0x7C3B,0x7CEC,0x7CEA,0x7E76,0x7E75, + 0x7E78,0x7E70,0x7E77,0x7E6F,0x7E7A,0x7E72,0x7E74,0x7E68, + 0x7F4B,0x7F4A,0x7F83,0x7F86,0x7FB7,0x7FFD,0x7FFE,0x8078, + 0x81D7,0x81D5,0x8264,0x8261,0x8263,0x85EB,0x85F1,0x85ED, + 0x85D9,0x85E1,0x85E8,0x85DA,0x85D7,0x85EC,0x85F2,0x85F8, + 0x85D8,0x85DF,0x85E3,0x85DC,0x85D1,0x85F0,0x85E6,0x85EF, + 0x85DE,0x85E2,0x8800,0x87FA,0x8803,0x87F6,0x87F7,0x8809, + 0x880C,0x880B,0x8806,0x87FC,0x8808,0x87FF,0x880A,0x8802, + 0x8962,0x895A,0x895B,0x8957,0x8961,0x895C,0x8958,0x895D, + 0x8959,0x8988,0x89B7,0x89B6,0x89F6,0x8B50,0x8B48,0x8B4A, + 0x8B40,0x8B53,0x8B56,0x8B54,0x8B4B,0x8B55, + /* Range 0xF340 - 0xF37E, array index: 0x337F */ + 0x8B51,0x8B42,0x8B52,0x8B57,0x8C43,0x8C77,0x8C76,0x8C9A, + 0x8D06,0x8D07,0x8D09,0x8DAC,0x8DAA,0x8DAD,0x8DAB,0x8E6D, + 0x8E78,0x8E73,0x8E6A,0x8E6F,0x8E7B,0x8EC2,0x8F52,0x8F51, + 0x8F4F,0x8F50,0x8F53,0x8FB4,0x9140,0x913F,0x91B0,0x91AD, + 0x93DE,0x93C7,0x93CF,0x93C2,0x93DA,0x93D0,0x93F9,0x93EC, + 0x93CC,0x93D9,0x93A9,0x93E6,0x93CA,0x93D4,0x93EE,0x93E3, + 0x93D5,0x93C4,0x93CE,0x93C0,0x93D2,0x93E7,0x957D,0x95DA, + 0x95DB,0x96E1,0x9729,0x972B,0x972C,0x9728,0x9726, + /* Range 0xF3A1 - 0xF3FE, array index: 0x33BE */ + 0x97B3,0x97B7,0x97B6,0x97DD,0x97DE,0x97DF,0x985C,0x9859, + 0x985D,0x9857,0x98BF,0x98BD,0x98BB,0x98BE,0x9948,0x9947, + 0x9943,0x99A6,0x99A7,0x9A1A,0x9A15,0x9A25,0x9A1D,0x9A24, + 0x9A1B,0x9A22,0x9A20,0x9A27,0x9A23,0x9A1E,0x9A1C,0x9A14, + 0x9AC2,0x9B0B,0x9B0A,0x9B0E,0x9B0C,0x9B37,0x9BEA,0x9BEB, + 0x9BE0,0x9BDE,0x9BE4,0x9BE6,0x9BE2,0x9BF0,0x9BD4,0x9BD7, + 0x9BEC,0x9BDC,0x9BD9,0x9BE5,0x9BD5,0x9BE1,0x9BDA,0x9D77, + 0x9D81,0x9D8A,0x9D84,0x9D88,0x9D71,0x9D80,0x9D78,0x9D86, + 0x9D8B,0x9D8C,0x9D7D,0x9D6B,0x9D74,0x9D75,0x9D70,0x9D69, + 0x9D85,0x9D73,0x9D7B,0x9D82,0x9D6F,0x9D79,0x9D7F,0x9D87, + 0x9D68,0x9E94,0x9E91,0x9EC0,0x9EFC,0x9F2D,0x9F40,0x9F41, + 0x9F4D,0x9F56,0x9F57,0x9F58,0x5337,0x56B2, + /* Range 0xF440 - 0xF47E, array index: 0x341C */ + 0x56B5,0x56B3,0x58E3,0x5B45,0x5DC6,0x5DC7,0x5EEE,0x5EEF, + 0x5FC0,0x5FC1,0x61F9,0x6517,0x6516,0x6515,0x6513,0x65DF, + 0x66E8,0x66E3,0x66E4,0x6AF3,0x6AF0,0x6AEA,0x6AE8,0x6AF9, + 0x6AF1,0x6AEE,0x6AEF,0x703C,0x7035,0x702F,0x7037,0x7034, + 0x7031,0x7042,0x7038,0x703F,0x703A,0x7039,0x7040,0x703B, + 0x7033,0x7041,0x7213,0x7214,0x72A8,0x737D,0x737C,0x74BA, + 0x76AB,0x76AA,0x76BE,0x76ED,0x77CC,0x77CE,0x77CF,0x77CD, + 0x77F2,0x7925,0x7923,0x7927,0x7928,0x7924,0x7929, + /* Range 0xF4A1 - 0xF4FE, array index: 0x345B */ + 0x79B2,0x7A6E,0x7A6C,0x7A6D,0x7AF7,0x7C49,0x7C48,0x7C4A, + 0x7C47,0x7C45,0x7CEE,0x7E7B,0x7E7E,0x7E81,0x7E80,0x7FBA, + 0x7FFF,0x8079,0x81DB,0x81D9,0x820B,0x8268,0x8269,0x8622, + 0x85FF,0x8601,0x85FE,0x861B,0x8600,0x85F6,0x8604,0x8609, + 0x8605,0x860C,0x85FD,0x8819,0x8810,0x8811,0x8817,0x8813, + 0x8816,0x8963,0x8966,0x89B9,0x89F7,0x8B60,0x8B6A,0x8B5D, + 0x8B68,0x8B63,0x8B65,0x8B67,0x8B6D,0x8DAE,0x8E86,0x8E88, + 0x8E84,0x8F59,0x8F56,0x8F57,0x8F55,0x8F58,0x8F5A,0x908D, + 0x9143,0x9141,0x91B7,0x91B5,0x91B2,0x91B3,0x940B,0x9413, + 0x93FB,0x9420,0x940F,0x9414,0x93FE,0x9415,0x9410,0x9428, + 0x9419,0x940D,0x93F5,0x9400,0x93F7,0x9407,0x940E,0x9416, + 0x9412,0x93FA,0x9409,0x93F8,0x940A,0x93FF, + /* Range 0xF540 - 0xF57E, array index: 0x34B9 */ + 0x93FC,0x940C,0x93F6,0x9411,0x9406,0x95DE,0x95E0,0x95DF, + 0x972E,0x972F,0x97B9,0x97BB,0x97FD,0x97FE,0x9860,0x9862, + 0x9863,0x985F,0x98C1,0x98C2,0x9950,0x994E,0x9959,0x994C, + 0x994B,0x9953,0x9A32,0x9A34,0x9A31,0x9A2C,0x9A2A,0x9A36, + 0x9A29,0x9A2E,0x9A38,0x9A2D,0x9AC7,0x9ACA,0x9AC6,0x9B10, + 0x9B12,0x9B11,0x9C0B,0x9C08,0x9BF7,0x9C05,0x9C12,0x9BF8, + 0x9C40,0x9C07,0x9C0E,0x9C06,0x9C17,0x9C14,0x9C09,0x9D9F, + 0x9D99,0x9DA4,0x9D9D,0x9D92,0x9D98,0x9D90,0x9D9B, + /* Range 0xF5A1 - 0xF5FE, array index: 0x34F8 */ + 0x9DA0,0x9D94,0x9D9C,0x9DAA,0x9D97,0x9DA1,0x9D9A,0x9DA2, + 0x9DA8,0x9D9E,0x9DA3,0x9DBF,0x9DA9,0x9D96,0x9DA6,0x9DA7, + 0x9E99,0x9E9B,0x9E9A,0x9EE5,0x9EE4,0x9EE7,0x9EE6,0x9F30, + 0x9F2E,0x9F5B,0x9F60,0x9F5E,0x9F5D,0x9F59,0x9F91,0x513A, + 0x5139,0x5298,0x5297,0x56C3,0x56BD,0x56BE,0x5B48,0x5B47, + 0x5DCB,0x5DCF,0x5EF1,0x61FD,0x651B,0x6B02,0x6AFC,0x6B03, + 0x6AF8,0x6B00,0x7043,0x7044,0x704A,0x7048,0x7049,0x7045, + 0x7046,0x721D,0x721A,0x7219,0x737E,0x7517,0x766A,0x77D0, + 0x792D,0x7931,0x792F,0x7C54,0x7C53,0x7CF2,0x7E8A,0x7E87, + 0x7E88,0x7E8B,0x7E86,0x7E8D,0x7F4D,0x7FBB,0x8030,0x81DD, + 0x8618,0x862A,0x8626,0x861F,0x8623,0x861C,0x8619,0x8627, + 0x862E,0x8621,0x8620,0x8629,0x861E,0x8625, + /* Range 0xF640 - 0xF67E, array index: 0x3556 */ + 0x8829,0x881D,0x881B,0x8820,0x8824,0x881C,0x882B,0x884A, + 0x896D,0x8969,0x896E,0x896B,0x89FA,0x8B79,0x8B78,0x8B45, + 0x8B7A,0x8B7B,0x8D10,0x8D14,0x8DAF,0x8E8E,0x8E8C,0x8F5E, + 0x8F5B,0x8F5D,0x9146,0x9144,0x9145,0x91B9,0x943F,0x943B, + 0x9436,0x9429,0x943D,0x943C,0x9430,0x9439,0x942A,0x9437, + 0x942C,0x9440,0x9431,0x95E5,0x95E4,0x95E3,0x9735,0x973A, + 0x97BF,0x97E1,0x9864,0x98C9,0x98C6,0x98C0,0x9958,0x9956, + 0x9A39,0x9A3D,0x9A46,0x9A44,0x9A42,0x9A41,0x9A3A, + /* Range 0xF6A1 - 0xF6FE, array index: 0x3595 */ + 0x9A3F,0x9ACD,0x9B15,0x9B17,0x9B18,0x9B16,0x9B3A,0x9B52, + 0x9C2B,0x9C1D,0x9C1C,0x9C2C,0x9C23,0x9C28,0x9C29,0x9C24, + 0x9C21,0x9DB7,0x9DB6,0x9DBC,0x9DC1,0x9DC7,0x9DCA,0x9DCF, + 0x9DBE,0x9DC5,0x9DC3,0x9DBB,0x9DB5,0x9DCE,0x9DB9,0x9DBA, + 0x9DAC,0x9DC8,0x9DB1,0x9DAD,0x9DCC,0x9DB3,0x9DCD,0x9DB2, + 0x9E7A,0x9E9C,0x9EEB,0x9EEE,0x9EED,0x9F1B,0x9F18,0x9F1A, + 0x9F31,0x9F4E,0x9F65,0x9F64,0x9F92,0x4EB9,0x56C6,0x56C5, + 0x56CB,0x5971,0x5B4B,0x5B4C,0x5DD5,0x5DD1,0x5EF2,0x6521, + 0x6520,0x6526,0x6522,0x6B0B,0x6B08,0x6B09,0x6C0D,0x7055, + 0x7056,0x7057,0x7052,0x721E,0x721F,0x72A9,0x737F,0x74D8, + 0x74D5,0x74D9,0x74D7,0x766D,0x76AD,0x7935,0x79B4,0x7A70, + 0x7A71,0x7C57,0x7C5C,0x7C59,0x7C5B,0x7C5A, + /* Range 0xF740 - 0xF77E, array index: 0x35F3 */ + 0x7CF4,0x7CF1,0x7E91,0x7F4F,0x7F87,0x81DE,0x826B,0x8634, + 0x8635,0x8633,0x862C,0x8632,0x8636,0x882C,0x8828,0x8826, + 0x882A,0x8825,0x8971,0x89BF,0x89BE,0x89FB,0x8B7E,0x8B84, + 0x8B82,0x8B86,0x8B85,0x8B7F,0x8D15,0x8E95,0x8E94,0x8E9A, + 0x8E92,0x8E90,0x8E96,0x8E97,0x8F60,0x8F62,0x9147,0x944C, + 0x9450,0x944A,0x944B,0x944F,0x9447,0x9445,0x9448,0x9449, + 0x9446,0x973F,0x97E3,0x986A,0x9869,0x98CB,0x9954,0x995B, + 0x9A4E,0x9A53,0x9A54,0x9A4C,0x9A4F,0x9A48,0x9A4A, + /* Range 0xF7A1 - 0xF7FE, array index: 0x3632 */ + 0x9A49,0x9A52,0x9A50,0x9AD0,0x9B19,0x9B2B,0x9B3B,0x9B56, + 0x9B55,0x9C46,0x9C48,0x9C3F,0x9C44,0x9C39,0x9C33,0x9C41, + 0x9C3C,0x9C37,0x9C34,0x9C32,0x9C3D,0x9C36,0x9DDB,0x9DD2, + 0x9DDE,0x9DDA,0x9DCB,0x9DD0,0x9DDC,0x9DD1,0x9DDF,0x9DE9, + 0x9DD9,0x9DD8,0x9DD6,0x9DF5,0x9DD5,0x9DDD,0x9EB6,0x9EF0, + 0x9F35,0x9F33,0x9F32,0x9F42,0x9F6B,0x9F95,0x9FA2,0x513D, + 0x5299,0x58E8,0x58E7,0x5972,0x5B4D,0x5DD8,0x882F,0x5F4F, + 0x6201,0x6203,0x6204,0x6529,0x6525,0x6596,0x66EB,0x6B11, + 0x6B12,0x6B0F,0x6BCA,0x705B,0x705A,0x7222,0x7382,0x7381, + 0x7383,0x7670,0x77D4,0x7C67,0x7C66,0x7E95,0x826C,0x863A, + 0x8640,0x8639,0x863C,0x8631,0x863B,0x863E,0x8830,0x8832, + 0x882E,0x8833,0x8976,0x8974,0x8973,0x89FE, + /* Range 0xF840 - 0xF87E, array index: 0x3690 */ + 0x8B8C,0x8B8E,0x8B8B,0x8B88,0x8C45,0x8D19,0x8E98,0x8F64, + 0x8F63,0x91BC,0x9462,0x9455,0x945D,0x9457,0x945E,0x97C4, + 0x97C5,0x9800,0x9A56,0x9A59,0x9B1E,0x9B1F,0x9B20,0x9C52, + 0x9C58,0x9C50,0x9C4A,0x9C4D,0x9C4B,0x9C55,0x9C59,0x9C4C, + 0x9C4E,0x9DFB,0x9DF7,0x9DEF,0x9DE3,0x9DEB,0x9DF8,0x9DE4, + 0x9DF6,0x9DE1,0x9DEE,0x9DE6,0x9DF2,0x9DF0,0x9DE2,0x9DEC, + 0x9DF4,0x9DF3,0x9DE8,0x9DED,0x9EC2,0x9ED0,0x9EF2,0x9EF3, + 0x9F06,0x9F1C,0x9F38,0x9F37,0x9F36,0x9F43,0x9F4F, + /* Range 0xF8A1 - 0xF8FE, array index: 0x36CF */ + 0x9F71,0x9F70,0x9F6E,0x9F6F,0x56D3,0x56CD,0x5B4E,0x5C6D, + 0x652D,0x66ED,0x66EE,0x6B13,0x705F,0x7061,0x705D,0x7060, + 0x7223,0x74DB,0x74E5,0x77D5,0x7938,0x79B7,0x79B6,0x7C6A, + 0x7E97,0x7F89,0x826D,0x8643,0x8838,0x8837,0x8835,0x884B, + 0x8B94,0x8B95,0x8E9E,0x8E9F,0x8EA0,0x8E9D,0x91BE,0x91BD, + 0x91C2,0x946B,0x9468,0x9469,0x96E5,0x9746,0x9743,0x9747, + 0x97C7,0x97E5,0x9A5E,0x9AD5,0x9B59,0x9C63,0x9C67,0x9C66, + 0x9C62,0x9C5E,0x9C60,0x9E02,0x9DFE,0x9E07,0x9E03,0x9E06, + 0x9E05,0x9E00,0x9E01,0x9E09,0x9DFF,0x9DFD,0x9E04,0x9EA0, + 0x9F1E,0x9F46,0x9F74,0x9F75,0x9F76,0x56D4,0x652E,0x65B8, + 0x6B18,0x6B19,0x6B17,0x6B1A,0x7062,0x7226,0x72AA,0x77D8, + 0x77D9,0x7939,0x7C69,0x7C6B,0x7CF6,0x7E9A, + /* Range 0xF940 - 0xF97E, array index: 0x372D */ + 0x7E98,0x7E9B,0x7E99,0x81E0,0x81E1,0x8646,0x8647,0x8648, + 0x8979,0x897A,0x897C,0x897B,0x89FF,0x8B98,0x8B99,0x8EA5, + 0x8EA4,0x8EA3,0x946E,0x946D,0x946F,0x9471,0x9473,0x9749, + 0x9872,0x995F,0x9C68,0x9C6E,0x9C6D,0x9E0B,0x9E0D,0x9E10, + 0x9E0F,0x9E12,0x9E11,0x9EA1,0x9EF5,0x9F09,0x9F47,0x9F78, + 0x9F7B,0x9F7A,0x9F79,0x571E,0x7066,0x7C6F,0x883C,0x8DB2, + 0x8EA6,0x91C3,0x9474,0x9478,0x9476,0x9475,0x9A60,0x9C74, + 0x9C73,0x9C71,0x9C75,0x9E14,0x9E13,0x9EF6,0x9F0A, + /* Range 0xF9A1 - 0xF9D5, array index: 0x376C */ + 0x9FA4,0x7068,0x7065,0x7CF7,0x866A,0x883E,0x883D,0x883F, + 0x8B9E,0x8C9C,0x8EA9,0x8EC9,0x974B,0x9873,0x9874,0x98CC, + 0x9961,0x99AB,0x9A64,0x9A66,0x9A67,0x9B24,0x9E15,0x9E17, + 0x9F48,0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482,0x9480, + 0x9481,0x9A69,0x9A68,0x9B2E,0x9E19,0x7229,0x864B,0x8B9F, + 0x9483,0x9C79,0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D,0x7069, + 0x706A,0x9EA4,0x9F7E,0x9F49,0x9F98, + /* Unranged codes (176 codes) */ +}; + +#endif /* ICONV_TO_UCS_CCS_BIG5 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> big5 speed-optimized table (51200 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_BIG5) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_big5[] = +{ + /* Heading Block */ + 0x0100,INVBLK,0x0200,0x0300,0x0400,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0500,0x0600,0x0700,INVBLK,0x0800,0x0900,0x0A00,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0B00,0x0C00,0x0D00,0x0E00,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x0F00,0x1000, + 0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700,0x1800, + 0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,0x2000, + 0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700,0x2800, + 0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000, + 0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700,0x3800, + 0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00,0x3F00,0x4000, + 0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,0x4800, + 0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00,0x4F00,0x5000, + 0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700,0x5800, + 0x5900,0x5A00,0x5B00,0x5C00,0x5D00,0x5E00,0x5F00,0x6000, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,0x6100,INVBLK,INVBLK,INVBLK,0x6200,0x6300, + /* Block 1, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA246,0xA247,INVALC,0xA244,INVALC,0xA1B1, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA258,0xA1D3,INVALC,INVALC,INVALC,INVALC,INVALC,0xA150, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA1D1, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA1D2, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 3, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA3BE, + INVALC,0xA3BC,0xA3BD,0xA3BF,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA3BB,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 4, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA344,0xA345,0xA346,0xA347,0xA348,0xA349,0xA34A, + 0xA34B,0xA34C,0xA34D,0xA34E,0xA34F,0xA350,0xA351,0xA352, + 0xA353,0xA354,INVALC,0xA355,0xA356,0xA357,0xA358,0xA359, + 0xA35A,0xA35B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA35C,0xA35D,0xA35E,0xA35F,0xA360,0xA361,0xA362, + 0xA363,0xA364,0xA365,0xA366,0xA367,0xA368,0xA369,0xA36A, + 0xA36B,0xA36C,INVALC,0xA36D,0xA36E,0xA36F,0xA370,0xA371, + 0xA372,0xA373,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 5, Array index 0x0400 */ + INVALC,0xC7B3,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xC7B1,0xC7B2,0xC7B4,0xC7B5, + 0xC7B6,0xC7B7,0xC7B8,0xC7B9,0xC7BA,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xC7BB,0xC7BC,0xC7BD,0xC7BE,0xC7BF, + 0xC7C0,0xC7C1,0xC7C2,0xC7C3,0xC7C4,0xC7C5,0xC7C6,0xC7C7, + 0xC7C8,0xC7C9,0xC7CA,0xC7CB,0xC7CC,0xC7CD,0xC7CF,0xC7D0, + 0xC7D1,0xC7D2,0xC7D3,0xC7D4,0xC7D5,0xC7D6,0xC7D7,0xC7D8, + 0xC7D9,0xC7DA,0xC7DB,0xC7DC,0xC7DD,0xC7DE,0xC7DF,0xC7E0, + 0xC7E1,0xC7E2,0xC7E3,0xC7E4,0xC7E5,0xC7E6,0xC7E7,0xC7E8, + INVALC,0xC7CE,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 33, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA156,0xA158,INVALC,INVALC,INVALC, + 0xA1A5,0xA1A6,INVALC,INVALC,0xA1A7,0xA1A8,INVALC,INVALC, + INVALC,INVALC,0xA145,INVALC,INVALC,0xA14C,0xA14B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA1AC,INVALC,INVALC,0xA1AB,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA1B0,INVALC,INVALC,0xA1C2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 34, Array index 0x0600 */ + INVALC,INVALC,INVALC,0xA24A,INVALC,0xA1C1,INVALC,INVALC, + INVALC,0xA24B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA2B9,0xA2BA,0xA2BB,0xA2BC,0xA2BD,0xA2BE,0xA2BF,0xA2C0, + 0xA2C1,0xA2C2,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA1F6,0xA1F4,0xA1F7,0xA1F5,INVALC,INVALC,0xA1F8,0xA1F9, + 0xA1FB,0xA1FA,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA1D4,INVALC,INVALC,INVALC,0xA1DB,0xA1E8, + 0xA1E7,INVALC,INVALC,0xA1FD,INVALC,0xA1FC,INVALC,INVALC, + INVALC,0xA1E4,0xA1E5,0xA1EC,INVALC,INVALC,0xA1ED,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA1EF,0xA1EE,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA1E3,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA1DC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA1DA,0xA1DD,INVALC,INVALC,INVALC,INVALC,0xA1D8,0xA1D9, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xA1E6,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA1E9, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xC7E9,0xC7EA,0xC7EB,0xC7EC,0xC7ED,0xC7EE,0xC7EF,0xC7F0, + 0xC7F1,0xC7F2,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xC7F3,0xC7F4,0xC7F5,0xC7F6, + 0xC7F7,0xC7F8,0xC7F9,0xC7FA,0xC7FB,0xC7FC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0900 */ + 0xA277,INVALC,0xA278,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA27A,INVALC,INVALC,INVALC, + 0xA27B,INVALC,INVALC,INVALC,0xA27C,INVALC,INVALC,INVALC, + 0xA27D,INVALC,INVALC,INVALC,0xA275,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA274,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA273,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA272,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA271,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA2A4,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA2A5,INVALC, + INVALC,0xA2A7,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA2A6,INVALC,INVALC,0xA27E,0xA2A1,0xA2A3, + 0xA2A2,0xA2AC,0xA2AD,0xA2AE,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA262,0xA263,0xA264,0xA265,0xA266,0xA267,0xA268, + 0xA269,0xA270,0xA26F,0xA26E,0xA26D,0xA26C,0xA26B,0xA26A, + INVALC,INVALC,INVALC,INVALC,0xA276,0xA279,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA1BD,0xA1BC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA1B6,0xA1B5,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA1BF,0xA1BE,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA1BB,0xA1BA, + INVALC,INVALC,INVALC,0xA1B3,INVALC,INVALC,0xA1B7,0xA1B4, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA2A8,0xA2A9,0xA2AB,0xA2AA,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0xA1B9,0xA1B8,INVALC, + INVALC,0xA1F3,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA1F0,0xA1F2,0xA1F1,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0B00 */ + 0xA140,0xA142,0xA143,0xA1B2,INVALC,0xC6A4,INVALC,INVALC, + 0xA171,0xA172,0xA16D,0xA16E,0xA175,0xA176,0xA179,0xA17A, + 0xA169,0xA16A,0xA245,INVALC,0xA165,0xA166,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xA1A9,0xA1AA,INVALC, + INVALC,0xA2C3,0xA2C4,0xA2C5,0xA2C6,0xA2C7,0xA2C8,0xA2C9, + 0xA2CA,0xA2CB,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC6A5,0xC6A6,0xC6A7,0xC6A8,0xC6A9,0xC6AA,0xC6AB, + 0xC6AC,0xC6AD,0xC6AE,0xC6AF,0xC6B0,0xC6B1,0xC6B2,0xC6B3, + 0xC6B4,0xC6B5,0xC6B6,0xC6B7,0xC6B8,0xC6B9,0xC6BA,0xC6BB, + 0xC6BC,0xC6BD,0xC6BE,0xC6BF,0xC6C0,0xC6C1,0xC6C2,0xC6C3, + 0xC6C4,0xC6C5,0xC6C6,0xC6C7,0xC6C8,0xC6C9,0xC6CA,0xC6CB, + 0xC6CC,0xC6CD,0xC6CE,0xC6CF,0xC6D0,0xC6D1,0xC6D2,0xC6D3, + 0xC6D4,0xC6D5,0xC6D6,0xC6D7,0xC6D8,0xC6D9,0xC6DA,0xC6DB, + 0xC6DC,0xC6DD,0xC6DE,0xC6DF,0xC6E0,0xC6E1,0xC6E2,0xC6E3, + 0xC6E4,0xC6E5,0xC6E6,0xC6E7,0xC6E8,0xC6E9,0xC6EA,0xC6EB, + 0xC6EC,0xC6ED,0xC6EE,0xC6EF,0xC6F0,0xC6F1,0xC6F2,0xC6F3, + 0xC6F4,0xC6F5,0xC6F6,0xC6F7,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xC6A2,0xC6A3,INVALC, + INVALC,0xC6F8,0xC6F9,0xC6FA,0xC6FB,0xC6FC,0xC6FD,0xC6FE, + 0xC740,0xC741,0xC742,0xC743,0xC744,0xC745,0xC746,0xC747, + 0xC748,0xC749,0xC74A,0xC74B,0xC74C,0xC74D,0xC74E,0xC74F, + 0xC750,0xC751,0xC752,0xC753,0xC754,0xC755,0xC756,0xC757, + 0xC758,0xC759,0xC75A,0xC75B,0xC75C,0xC75D,0xC75E,0xC75F, + 0xC760,0xC761,0xC762,0xC763,0xC764,0xC765,0xC766,0xC767, + 0xC768,0xC769,0xC76A,0xC76B,0xC76C,0xC76D,0xC76E,0xC76F, + 0xC770,0xC771,0xC772,0xC773,0xC774,0xC775,0xC776,0xC777, + 0xC778,0xC779,0xC77A,0xC77B,0xC77C,0xC77D,0xC77E,0xC7A1, + 0xC7A2,0xC7A3,0xC7A4,0xC7A5,0xC7A6,0xC7A7,0xC7A8,0xC7A9, + 0xC7AA,0xC7AB,0xC7AC,0xC7AD,0xC7AE,0xC7AF,0xC7B0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xC6A1,INVALC, + /* Block 50, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0xA374,0xA375,0xA376, + 0xA377,0xA378,0xA379,0xA37A,0xA37B,0xA37C,0xA37D,0xA37E, + 0xA3A1,0xA3A2,0xA3A3,0xA3A4,0xA3A5,0xA3A6,0xA3A7,0xA3A8, + 0xA3A9,0xA3AA,0xA3AB,0xA3AC,0xA3AD,0xA3AE,0xA3AF,0xA3B0, + 0xA3B1,0xA3B2,0xA3B3,0xA3B4,0xA3B5,0xA3B6,0xA3B7,0xA3B8, + 0xA3B9,0xA3BA,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA1C0,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA255,0xA256, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA250,0xA251,0xA252,INVALC, + INVALC,0xA254,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA257,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA253,INVALC, + INVALC,0xA1EB,0xA1EA,INVALC,INVALC,0xA24F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x0F00 */ + 0xA440,0xA442,INVALC,0xA443,INVALC,INVALC,INVALC,0xC945, + 0xA456,0xA454,0xA457,0xA455,0xC946,0xA4A3,0xC94F,0xC94D, + 0xA4A2,0xA4A1,INVALC,INVALC,0xA542,0xA541,0xA540,INVALC, + 0xA543,0xA4FE,INVALC,INVALC,INVALC,INVALC,0xA5E0,0xA5E1, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA8C3,INVALC, + INVALC,INVALC,INVALC,0xA458,INVALC,0xA4A4,0xC950,INVALC, + 0xA4A5,0xC963,0xA6EA,0xCBB1,INVALC,INVALC,INVALC,INVALC, + 0xA459,0xA4A6,INVALC,0xA544,0xC964,INVALC,INVALC,INVALC, + INVALC,INVALC,0xC940,0xA444,INVALC,0xA45B,INVALC,0xC947, + 0xA45C,INVALC,INVALC,0xA4A7,INVALC,0xA545,0xA547,0xA546, + INVALC,INVALC,0xA5E2,0xA5E3,INVALC,INVALC,0xA8C4,INVALC, + 0xADBC,0xA441,INVALC,INVALC,0xC941,0xA445,0xA45E,0xA45D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA5E4,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA8C5,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xB0AE,0xD44B, + INVALC,INVALC,0xB6C3,0xDCB1,0xDCB2,INVALC,0xA446,INVALC, + 0xA4A9,INVALC,INVALC,0xA8C6,0xA447,0xC948,0xA45F,INVALC, + INVALC,0xA4AA,0xA4AC,0xC951,0xA4AD,0xA4AB,INVALC,INVALC, + INVALC,0xA5E5,INVALC,0xA8C7,INVALC,INVALC,0xA8C8,0xAB45, + INVALC,0xA460,0xA4AE,INVALC,0xA5E6,0xA5E8,0xA5E7,INVALC, + 0xA6EB,INVALC,INVALC,0xA8C9,0xA8CA,0xAB46,0xAB47,INVALC, + INVALC,INVALC,INVALC,0xADBD,INVALC,INVALC,0xDCB3,INVALC, + INVALC,0xF6D6,0xA448,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA4B0,0xA4AF,0xC952,0xA4B1,0xA4B7,INVALC,0xA4B2,0xA4B3, + 0xC954,0xC953,0xA4B5,0xA4B6,INVALC,0xA4B4,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA54A,0xA54B,0xA54C,0xA54D, + 0xA549,0xA550,0xC96A,INVALC,0xC966,0xC969,0xA551,0xA561, + INVALC,0xC968,INVALC,0xA54E,0xA54F,0xA548,INVALC,INVALC, + 0xC965,0xC967,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA5F5,0xC9B0,0xA5F2,0xA5F6,0xC9BA,0xC9AE,0xA5F3,0xC9B2, + INVALC,INVALC,INVALC,0xA5F4,INVALC,0xA5F7,INVALC,0xA5E9, + /* Block 80, Array index 0x1000 */ + 0xC9B1,0xA5F8,0xC9B5,INVALC,0xC9B9,0xC9B6,INVALC,INVALC, + 0xC9B3,0xA5EA,0xA5EC,0xA5F9,INVALC,0xA5EE,0xC9AB,0xA5F1, + 0xA5EF,0xA5F0,0xC9BB,0xC9B8,0xC9AF,0xA5ED,INVALC,INVALC, + 0xC9AC,0xA5EB,INVALC,INVALC,INVALC,0xC9B4,INVALC,INVALC, + INVALC,INVALC,0xC9B7,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xC9AD,0xCA66,INVALC,0xA742, + 0xA6F4,INVALC,INVALC,0xCA67,0xA6F1,INVALC,0xA744,INVALC, + 0xA6F9,INVALC,0xA6F8,0xCA5B,0xA6FC,0xA6F7,0xCA60,0xCA68, + INVALC,0xCA64,INVALC,0xA6FA,INVALC,INVALC,0xA6FD,0xA6EE, + 0xA747,0xCA5D,INVALC,INVALC,0xCBBD,0xA6EC,0xA743,0xA6ED, + 0xA6F5,0xA6F6,0xCA62,0xCA5E,0xA6FB,0xA6F3,0xCA5A,0xA6EF, + 0xCA65,0xA745,0xA748,0xA6F2,0xA740,0xA746,0xA6F0,0xCA63, + 0xA741,0xCA69,0xCA5C,0xA6FE,0xCA5F,INVALC,INVALC,0xCA61, + INVALC,0xA8D8,0xCBBF,0xCBCB,0xA8D0,INVALC,0xCBCC,0xA8CB, + 0xA8D5,INVALC,INVALC,0xA8CE,0xCBB9,0xA8D6,0xCBB8,0xCBBC, + 0xCBC3,0xCBC1,0xA8DE,0xA8D9,0xCBB3,0xCBB5,0xA8DB,0xA8CF, + 0xCBB6,0xCBC2,0xCBC9,0xA8D4,0xCBBB,0xCBB4,0xA8D3,0xCBB7, + 0xA8D7,0xCBBA,INVALC,0xA8D2,INVALC,0xA8CD,INVALC,0xA8DC, + 0xCBC4,0xA8DD,0xCBC8,INVALC,0xCBC6,0xCBCA,0xA8DA,0xCBBE, + 0xCBB2,INVALC,0xCBC0,0xA8D1,0xCBC5,0xA8CC,0xCBC7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xAB56,0xAB4A, + INVALC,INVALC,0xCDE0,0xCDE8,INVALC,0xAB49,0xAB51,0xAB5D, + INVALC,0xCDEE,0xCDEC,0xCDE7,INVALC,INVALC,INVALC,0xAB4B, + 0xCDED,0xCDE3,0xAB59,0xAB50,0xAB58,0xCDDE,INVALC,0xCDEA, + INVALC,0xCDE1,0xAB54,0xCDE2,INVALC,0xCDDD,0xAB5B,0xAB4E, + 0xAB57,0xAB4D,INVALC,0xCDDF,0xCDE4,INVALC,0xCDEB,0xAB55, + 0xAB52,0xCDE6,0xAB5A,0xCDE9,0xCDE5,0xAB4F,0xAB5C,0xAB53, + 0xAB4C,0xAB48,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xCDEF,INVALC,0xADD7,0xADC1, + INVALC,0xADD1,INVALC,0xADD6,0xD0D0,0xD0CF,0xD0D4,0xD0D5, + 0xADC4,INVALC,0xADCD,INVALC,INVALC,INVALC,0xADDA,INVALC, + /* Block 81, Array index 0x1100 */ + 0xADCE,INVALC,INVALC,INVALC,INVALC,0xD0C9,0xADC7,0xD0CA, + INVALC,0xADDC,INVALC,0xADD3,0xADBE,0xADBF,0xD0DD,0xB0BF, + INVALC,0xADCC,0xADCB,0xD0CB,0xADCF,0xD45B,0xADC6,0xD0D6, + 0xADD5,0xADD4,0xADCA,0xD0CE,0xD0D7,INVALC,0xD0C8,0xADC9, + 0xD0D8,0xADD2,0xD0CC,0xADC0,INVALC,0xADC3,0xADC2,0xD0D9, + 0xADD0,0xADC5,0xADD9,0xADDB,0xD0D3,0xADD8,INVALC,0xD0DB, + 0xD0CD,0xD0DC,INVALC,0xD0D1,INVALC,0xD0DA,INVALC,0xD0D2, + INVALC,INVALC,INVALC,INVALC,0xADC8,INVALC,INVALC,INVALC, + 0xD463,0xD457,INVALC,0xB0B3,INVALC,0xD45C,0xD462,0xB0B2, + 0xD455,0xB0B6,0xD459,0xD452,0xB0B4,0xD456,0xB0B9,0xB0BE, + INVALC,0xD467,INVALC,0xD451,INVALC,0xB0BA,INVALC,0xD466, + INVALC,INVALC,0xB0B5,0xD458,0xB0B1,0xD453,0xD44F,0xD45D, + 0xD450,0xD44E,0xD45A,0xD460,0xD461,0xB0B7,INVALC,INVALC, + 0xD85B,0xD45E,0xD44D,0xD45F,INVALC,0xB0C1,0xD464,0xB0C0, + 0xD44C,INVALC,0xD454,0xD465,0xB0BC,0xB0BB,0xB0B8,0xB0BD, + INVALC,INVALC,0xB0AF,INVALC,INVALC,0xB0B0,INVALC,INVALC, + 0xB3C8,INVALC,0xD85E,0xD857,INVALC,0xB3C5,INVALC,0xD85F, + INVALC,INVALC,INVALC,0xD855,0xD858,0xB3C4,0xD859,INVALC, + INVALC,0xB3C7,0xD85D,INVALC,0xD853,0xD852,0xB3C9,INVALC, + 0xB3CA,0xB3C6,0xB3CB,0xD851,0xD85C,0xD85A,0xD854,INVALC, + INVALC,INVALC,0xB3C3,0xD856,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xB6CA,0xB6C4,0xDCB7,0xB6CD, + 0xDCBD,0xDCC0,0xB6C6,0xB6C7,0xDCBA,0xB6C5,0xDCC3,0xB6CB, + 0xDCC4,INVALC,0xDCBF,0xB6CC,INVALC,0xDCB4,0xB6C9,0xDCB5, + INVALC,0xDCBE,0xDCBC,INVALC,0xDCB8,0xB6C8,0xDCB6,0xB6CE, + 0xDCBB,0xDCC2,0xDCB9,0xDCC1,INVALC,INVALC,0xB9B6,0xB9B3, + INVALC,0xB9B4,INVALC,0xE0F9,0xE0F1,0xB9B2,0xB9AF,0xE0F2, + INVALC,INVALC,0xB9B1,0xE0F5,INVALC,0xE0F7,INVALC,INVALC, + 0xE0FE,INVALC,INVALC,0xE0FD,0xE0F8,0xB9AE,0xE0F0,0xB9AC, + 0xE0F3,0xB9B7,0xE0F6,INVALC,0xE0FA,0xB9B0,0xB9AD,0xE0FC, + 0xE0FB,0xB9B5,INVALC,0xE0F4,INVALC,0xBBF8,0xE4EC,INVALC, + 0xE4E9,0xBBF9,INVALC,0xBBF7,INVALC,0xE4F0,0xE4ED,0xE4E6, + /* Block 82, Array index 0x1200 */ + 0xBBF6,INVALC,0xBBFA,0xE4E7,0xBBF5,0xBBFD,0xE4EA,0xE4EB, + 0xBBFB,0xBBFC,0xE4F1,0xE4EE,0xE4EF,INVALC,INVALC,INVALC, + 0xBEAA,0xE8F8,0xBEA7,0xE8F5,0xBEA9,0xBEAB,INVALC,0xE8F6, + 0xBEA8,INVALC,0xE8F7,INVALC,0xE8F4,INVALC,INVALC,0xC076, + 0xECBD,0xC077,0xECBB,INVALC,0xECBC,0xECBA,0xECB9,INVALC, + INVALC,0xECBE,0xC075,INVALC,INVALC,0xEFB8,0xEFB9,INVALC, + 0xE4E8,0xEFB7,0xC078,0xC35F,0xF1EB,0xF1EC,INVALC,0xC4D7, + 0xC4D8,0xF5C1,0xF5C0,0xC56C,0xC56B,0xF7D0,INVALC,0xA449, + 0xA461,0xA4B9,INVALC,0xA4B8,0xA553,0xA552,0xA5FC,0xA5FB, + 0xA5FD,0xA5FA,INVALC,0xA74A,0xA749,0xA74B,INVALC,INVALC, + INVALC,INVALC,0xA8E0,INVALC,0xA8DF,0xA8E1,INVALC,0xAB5E, + INVALC,0xA259,0xD0DE,0xA25A,0xB0C2,0xA25C,0xA25B,0xD860, + INVALC,0xA25D,0xB9B8,0xA25E,INVALC,0xA44A,INVALC,0xA4BA, + 0xA5FE,0xA8E2,INVALC,0xA44B,0xA4BD,0xA4BB,0xA4BC,INVALC, + INVALC,0xA640,INVALC,INVALC,INVALC,0xA74C,0xA8E4,0xA8E3, + 0xA8E5,INVALC,INVALC,INVALC,0xADDD,INVALC,INVALC,INVALC, + 0xBEAC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xC94E, + INVALC,0xA554,0xA555,INVALC,INVALC,0xA641,INVALC,0xCA6A, + INVALC,0xAB60,0xAB5F,0xD0E0,0xD0DF,0xB0C3,INVALC,0xA4BE, + 0xC955,INVALC,INVALC,INVALC,INVALC,INVALC,0xCBCD,INVALC, + 0xAB61,INVALC,0xADE0,INVALC,0xADDE,0xADDF,INVALC,INVALC, + INVALC,INVALC,0xBEAD,INVALC,0xA556,INVALC,INVALC,INVALC, + 0xA642,0xC9BC,INVALC,INVALC,INVALC,INVALC,0xA74D,0xA74E, + INVALC,0xCA6B,INVALC,INVALC,0xCBCE,0xA8E6,0xCBCF,INVALC, + INVALC,INVALC,INVALC,INVALC,0xD0E2,0xD0E3,0xADE3,INVALC, + 0xD0E4,INVALC,0xD0E1,0xADE4,0xADE2,0xADE1,0xD0E5,INVALC, + 0xD468,INVALC,INVALC,INVALC,0xD861,INVALC,INVALC,0xDCC5, + 0xE140,INVALC,INVALC,INVALC,0xBBFE,0xBEAE,0xE8F9,INVALC, + 0xA44C,0xA45A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xB0C4,0xB3CD,INVALC,0xB9B9,INVALC,0xC942,0xA4BF,INVALC, + 0xA559,0xA557,0xA558,INVALC,INVALC,0xA8E7,INVALC,INVALC, + /* Block 83, Array index 0x1300 */ + 0xA44D,0xA44E,INVALC,0xA462,INVALC,INVALC,0xA4C0,0xA4C1, + 0xA4C2,0xC9BE,0xA55A,INVALC,0xC96B,INVALC,0xA646,INVALC, + 0xC9BF,0xA644,0xA645,0xC9BD,INVALC,INVALC,0xA647,0xA643, + INVALC,INVALC,INVALC,INVALC,0xCA6C,0xAAEC,0xCA6D,INVALC, + INVALC,0xCA6E,INVALC,INVALC,0xA750,0xA74F,INVALC,INVALC, + 0xA753,0xA751,0xA752,INVALC,INVALC,INVALC,0xA8ED,INVALC, + 0xA8EC,0xCBD4,0xCBD1,0xCBD2,INVALC,0xCBD0,0xA8EE,0xA8EA, + 0xA8E9,INVALC,0xA8EB,0xA8E8,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA8EF,INVALC,0xAB63,0xCDF0,INVALC,0xCBD3,0xAB68, + INVALC,0xCDF1,0xAB64,0xAB67,0xAB66,0xAB65,0xAB62,INVALC, + INVALC,INVALC,0xD0E8,INVALC,0xADE7,0xD0EB,0xADE5,INVALC, + INVALC,INVALC,0xD0E7,0xADE8,0xADE6,0xADE9,0xD0E9,0xD0EA, + INVALC,0xD0E6,0xD0EC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB3D1,0xB0C5,0xD469,0xD46B,0xD46A,0xD46C,0xB0C6, + INVALC,INVALC,0xB3CE,INVALC,0xB3CF,0xB3D0,INVALC,0xB6D0, + 0xDCC7,INVALC,0xDCC6,0xDCC8,0xDCC9,0xB6D1,INVALC,0xB6CF, + 0xE141,0xE142,0xB9BB,0xB9BA,0xE35A,INVALC,INVALC,0xBC40, + 0xBC41,0xBC42,0xBC44,0xE4F2,0xE4F3,0xBC43,INVALC,INVALC, + INVALC,0xBEAF,INVALC,0xBEB0,INVALC,INVALC,0xF1ED,0xF5C3, + 0xF5C2,0xF7D1,INVALC,0xA44F,INVALC,INVALC,INVALC,0xA55C, + 0xA55B,INVALC,INVALC,0xA648,INVALC,INVALC,0xC9C0,INVALC, + INVALC,0xA755,0xA756,0xA754,0xA757,0xCA6F,0xCA70,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA8F1,0xCBD5,INVALC,0xA8F0,INVALC, + 0xCDF2,0xAB6C,0xCDF3,0xAB6B,INVALC,INVALC,INVALC,0xAB69, + INVALC,0xAB6A,INVALC,INVALC,INVALC,0xD0ED,INVALC,INVALC, + INVALC,INVALC,0xB0C7,0xD46E,INVALC,0xB0CA,0xD46D,0xB1E5, + 0xB0C9,0xB0C8,INVALC,0xB3D4,INVALC,0xB3D3,0xB3D2,0xB6D2, + INVALC,INVALC,0xB6D5,0xB6D6,0xB6D4,INVALC,0xB6D3,INVALC, + INVALC,0xE143,INVALC,0xE144,INVALC,INVALC,INVALC,0xE4F5, + 0xBC45,0xE4F4,INVALC,0xBEB1,0xECBF,0xC079,INVALC,0xF1EE, + 0xC455,INVALC,0xA463,0xA4C3,0xC956,INVALC,0xA4C4,0xA4C5, + /* Block 84, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0xA55D,0xA55E,INVALC, + 0xA649,0xCA71,0xCBD6,0xCBD7,INVALC,0xAB6D,0xD0EE,0xB0CC, + 0xB0CB,0xD863,0xD862,INVALC,INVALC,0xA450,0xA4C6,0xA55F, + INVALC,0xB0CD,0xC943,INVALC,0xC96C,0xA560,INVALC,0xC9C2, + 0xA64B,0xA64A,0xC9C1,0xA758,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xADEA,INVALC,INVALC,0xD46F,INVALC,0xB6D7, + 0xE145,0xB9BC,INVALC,INVALC,0xE8FA,INVALC,INVALC,0xF3FD, + INVALC,0xA4C7,INVALC,INVALC,0xCBD8,0xCDF4,0xB0D0,0xB0CE, + 0xB0CF,0xA451,INVALC,0xA464,0xA2CD,0xA4CA,INVALC,0xA4C9, + 0xA4C8,0xA563,0xA562,INVALC,0xC96D,0xC9C3,INVALC,INVALC, + INVALC,0xA8F5,0xA8F2,0xA8F4,0xA8F3,INVALC,INVALC,0xAB6E, + INVALC,INVALC,0xB3D5,INVALC,0xA452,INVALC,0xA4CB,INVALC, + 0xA565,0xA564,INVALC,0xCA72,INVALC,INVALC,0xA8F6,INVALC, + INVALC,INVALC,INVALC,INVALC,0xC957,INVALC,0xA567,0xA566, + 0xA64C,0xA64D,0xCA73,0xA759,INVALC,0xA75A,INVALC,0xA8F7, + 0xA8F8,0xA8F9,INVALC,0xAB6F,0xCDF5,INVALC,INVALC,0xADEB, + INVALC,INVALC,0xC944,INVALC,0xA4CC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xC9C4,INVALC,INVALC,INVALC,0xCA74,0xCA75, + INVALC,INVALC,0xCBD9,INVALC,0xCBDA,INVALC,0xCDF7,0xCDF6, + 0xCDF9,0xCDF8,0xAB70,INVALC,0xD470,0xADED,0xD0EF,0xADEC, + INVALC,INVALC,INVALC,INVALC,0xD864,0xB3D6,INVALC,0xD865, + INVALC,INVALC,INVALC,INVALC,0xE146,0xB9BD,INVALC,INVALC, + INVALC,INVALC,0xBC46,INVALC,0xF1EF,INVALC,INVALC,INVALC, + INVALC,0xC958,INVALC,0xA568,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xB0D1,INVALC,INVALC,INVALC,INVALC, + 0xA453,0xA465,0xA4CE,0xA4CD,INVALC,0xA4CF,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA8FB,INVALC,0xA8FA,0xA8FC, + INVALC,INVALC,INVALC,0xAB71,INVALC,INVALC,INVALC,0xADEE, + INVALC,0xE8FB,0xC24F,0xA466,0xA56A,0xA579,0xA574,INVALC, + 0xA56F,0xA56E,0xA575,0xA573,0xA56C,0xA57A,0xA56D,0xA569, + 0xA578,0xA577,0xA576,0xA56B,INVALC,0xA572,INVALC,INVALC, + 0xA571,INVALC,INVALC,0xA57B,0xA570,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x1500 */ + INVALC,0xA653,INVALC,0xA659,0xA655,INVALC,0xA65B,0xC9C5, + 0xA658,0xA64E,0xA651,0xA654,0xA650,0xA657,0xA65A,0xA64F, + 0xA652,0xA656,0xA65C,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xCA7E,0xCA7B,INVALC,0xA767,0xCA7C,0xA75B,0xA75D,0xA775, + 0xA770,INVALC,INVALC,INVALC,0xCAA5,0xCA7D,0xA75F,0xA761, + 0xCAA4,0xA768,0xCA78,0xA774,0xA776,0xA75C,0xA76D,INVALC, + 0xCA76,0xA773,INVALC,0xA764,INVALC,0xA76E,0xA76F,0xCA77, + 0xA76C,0xA76A,INVALC,0xA76B,0xA771,0xCAA1,0xA75E,INVALC, + 0xA772,0xCAA3,0xA766,0xA763,INVALC,0xCA7A,0xA762,0xCAA6, + 0xA765,INVALC,0xA769,INVALC,INVALC,INVALC,0xA760,0xCAA2, + INVALC,INVALC,INVALC,INVALC,0xCA79,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xCBEB,0xCBEA,0xA94F,0xCBED,0xCBEF,0xCBE4,0xCBE7,0xCBEE, + 0xA950,INVALC,INVALC,0xCBE1,0xCBE5,INVALC,INVALC,0xCBE9, + 0xCE49,0xA94B,0xCE4D,0xA8FD,0xCBE6,0xA8FE,0xA94C,0xA945, + 0xA941,INVALC,0xCBE2,0xA944,0xA949,0xA952,0xCBE3,0xCBDC, + 0xA943,0xCBDD,0xCBDF,INVALC,0xA946,INVALC,0xA948,0xCBDB, + 0xCBE0,INVALC,INVALC,0xA951,0xA94D,0xCBE8,0xA953,INVALC, + 0xA94A,0xCBDE,0xA947,INVALC,INVALC,0xA942,0xA940,INVALC, + 0xCBEC,INVALC,0xA94E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xCE48,0xCDFB,0xCE4B,INVALC,INVALC,0xCDFD,0xAB78,0xABA8, + 0xAB74,0xABA7,0xAB7D,0xABA4,0xAB72,0xCDFC,0xCE43,0xABA3, + 0xCE4F,0xABA5,INVALC,0xAB79,INVALC,INVALC,0xCE45,0xCE42, + 0xAB77,INVALC,0xCDFA,0xABA6,0xCE4A,0xAB7C,0xCE4C,0xABA9, + 0xAB73,0xAB7E,0xAB7B,0xCE40,0xABA1,0xCE46,0xCE47,0xAB7A, + 0xABA2,0xAB76,INVALC,INVALC,INVALC,INVALC,0xAB75,0xCDFE, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCE44,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCE4E,INVALC, + 0xD144,0xADFB,0xD0F1,INVALC,0xD0F6,0xADF4,0xAE40,0xD0F4, + 0xADEF,0xADF9,0xADFE,0xD0FB,INVALC,0xADFA,0xADFD,INVALC, + INVALC,0xD0FE,0xADF5,0xD0F5,INVALC,INVALC,INVALC,0xD142, + 0xD143,INVALC,0xADF7,0xD141,0xADF3,0xAE43,INVALC,0xD0F8, + /* Block 86, Array index 0x1600 */ + INVALC,0xADF1,INVALC,0xD146,0xD0F9,0xD0FD,0xADF6,0xAE42, + 0xD0FA,0xADFC,0xD140,0xD147,0xD4A1,INVALC,0xD145,0xAE44, + 0xADF0,0xD0FC,0xD0F3,INVALC,0xADF8,INVALC,INVALC,0xD0F2, + INVALC,INVALC,0xD0F7,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xD0F0,0xAE41, + INVALC,INVALC,0xD477,INVALC,0xB0E4,0xD4A7,0xB0E2,0xB0DF, + 0xD47C,0xB0DB,0xD4A2,0xB0E6,0xD476,0xD47B,0xD47A,0xADF2, + 0xB0E1,0xD4A5,INVALC,0xD4A8,0xD473,INVALC,0xB3E8,INVALC, + 0xD4A9,0xB0E7,INVALC,0xB0D9,0xB0D6,0xD47E,0xB0D3,INVALC, + 0xD4A6,INVALC,0xB0DA,0xD4AA,INVALC,0xD474,0xD4A4,0xB0DD, + 0xD475,0xD478,0xD47D,INVALC,INVALC,0xB0DE,0xB0DC,0xB0E8, + INVALC,INVALC,INVALC,INVALC,0xB0E3,INVALC,0xB0D7,0xB1D2, + INVALC,0xB0D8,0xD479,0xB0E5,0xB0E0,0xD4A3,0xB0D5,INVALC, + INVALC,INVALC,0xB0D4,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD471,0xD472,0xD86A, + INVALC,INVALC,INVALC,0xB3D7,0xB3DA,0xD875,0xB3EE,0xD878, + 0xB3D8,0xD871,0xB3DE,0xB3E4,0xB5BD,INVALC,INVALC,0xB3E2, + 0xD86E,0xB3EF,0xB3DB,0xB3E3,0xD876,0xDCD7,0xD87B,0xD86F, + INVALC,0xD866,0xD873,0xD86D,0xB3E1,0xD879,INVALC,INVALC, + 0xB3DD,0xB3F1,0xB3EA,INVALC,0xB3DF,0xB3DC,INVALC,0xB3E7, + INVALC,0xD87A,0xD86C,0xD872,0xD874,0xD868,0xD877,0xB3D9, + 0xD867,INVALC,0xB3E0,0xB3F0,0xB3EC,0xD869,0xB3E6,INVALC, + INVALC,0xB3ED,0xB3E9,0xB3E5,INVALC,0xD870,INVALC,INVALC, + INVALC,INVALC,INVALC,0xB3EB,INVALC,INVALC,INVALC,0xDCD5, + 0xDCD1,INVALC,0xDCE0,0xDCCA,0xDCD3,0xB6E5,0xB6E6,0xB6DE, + 0xDCDC,0xB6E8,0xDCCF,0xDCCE,0xDCCC,0xDCDE,0xB6DC,0xDCD8, + 0xDCCD,0xB6DF,0xDCD6,0xB6DA,0xDCD2,0xDCD9,0xDCDB,INVALC, + INVALC,0xDCDF,0xB6E3,0xDCCB,0xB6DD,0xDCD0,INVALC,0xB6D8, + INVALC,0xB6E4,0xDCDA,0xB6E0,0xB6E1,0xB6E7,0xB6DB,0xA25F, + 0xB6D9,0xDCD4,INVALC,INVALC,INVALC,INVALC,INVALC,0xB6E2, + INVALC,INVALC,0xDCDD,INVALC,INVALC,INVALC,0xB9CD,0xB9C8, + INVALC,0xE155,0xE151,INVALC,0xE14B,0xB9C2,0xB9BE,0xE154, + /* Block 87, Array index 0x1700 */ + 0xB9BF,0xE14E,0xE150,INVALC,0xE153,INVALC,0xB9C4,INVALC, + 0xB9CB,0xB9C5,INVALC,INVALC,0xE149,0xB9C6,0xB9C7,0xE14C, + 0xB9CC,INVALC,0xE14A,0xE14F,0xB9C3,0xE148,0xB9C9,0xB9C1, + INVALC,INVALC,INVALC,0xB9C0,0xE14D,0xE152,INVALC,0xB9CA, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xE147, + INVALC,0xBC4D,0xE547,INVALC,0xE544,INVALC,0xBC47,0xBC53, + 0xBC54,INVALC,0xBC4A,0xE542,0xBC4C,0xE4F9,0xBC52,INVALC, + 0xE546,0xBC49,0xE548,0xBC48,INVALC,0xE543,0xE545,0xBC4B, + 0xE541,0xE4FA,0xE4F7,INVALC,INVALC,0xD86B,0xE4FD,INVALC, + 0xE4F6,0xE4FC,0xE4FB,INVALC,0xE4F8,INVALC,0xBC4F,INVALC, + INVALC,INVALC,INVALC,0xBC4E,INVALC,INVALC,INVALC,0xBC50, + 0xE4FE,0xBEB2,0xE540,INVALC,INVALC,INVALC,0xE945,INVALC, + 0xE8FD,INVALC,0xBEBE,0xE942,0xBEB6,0xBEBA,0xE941,INVALC, + 0xBEB9,0xBEB5,0xBEB8,0xBEB3,0xBEBD,0xE943,0xE8FE,0xBEBC, + 0xE8FC,0xBEBB,0xE944,0xE940,0xBC51,INVALC,0xBEBF,0xE946, + 0xBEB7,0xBEB4,INVALC,INVALC,INVALC,INVALC,0xECC6,0xECC8, + 0xC07B,0xECC9,0xECC7,0xECC5,0xECC4,0xC07D,0xECC3,0xC07E, + INVALC,INVALC,INVALC,INVALC,0xECC1,0xECC2,0xC07A,0xC0A1, + 0xC07C,INVALC,INVALC,0xECC0,INVALC,0xC250,INVALC,0xEFBC, + 0xEFBA,0xEFBF,0xEFBD,INVALC,0xEFBB,0xEFBE,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xC360,0xF1F2,0xF1F3, + 0xC456,INVALC,0xF1F4,0xF1F0,0xF1F5,0xF1F1,0xC251,INVALC, + INVALC,INVALC,0xF3FE,0xF441,0xC459,0xF440,0xC458,0xC457, + INVALC,INVALC,INVALC,INVALC,0xC45A,0xF5C5,0xF5C6,INVALC, + 0xC4DA,0xC4D9,0xC4DB,0xF5C4,INVALC,0xF6D8,0xF6D7,INVALC, + 0xC56D,0xC56F,0xC56E,0xF6D9,0xC5C8,0xF8A6,INVALC,INVALC, + INVALC,0xC5F1,INVALC,0xF8A5,0xF8EE,INVALC,INVALC,0xC949, + INVALC,INVALC,0xA57D,0xA57C,INVALC,0xA65F,0xA65E,0xC9C7, + 0xA65D,0xC9C6,INVALC,INVALC,0xA779,0xCAA9,INVALC,0xCAA8, + INVALC,INVALC,0xA777,0xA77A,INVALC,INVALC,0xCAA7,INVALC, + 0xA778,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCBF0, + INVALC,0xCBF1,0xA954,INVALC,INVALC,INVALC,INVALC,0xABAA, + /* Block 88, Array index 0x1800 */ + INVALC,0xD148,0xD149,0xAE45,0xAE46,INVALC,INVALC,0xD4AC, + 0xB0E9,0xB0EB,0xD4AB,0xB0EA,0xD87C,0xB3F2,INVALC,INVALC, + INVALC,INVALC,0xB6E9,0xB6EA,0xDCE1,INVALC,0xB9CF,INVALC, + 0xB9CE,INVALC,0xE549,0xE948,0xE947,INVALC,0xF96B,0xA467, + 0xC959,INVALC,0xC96E,0xC96F,INVALC,INVALC,INVALC,INVALC, + 0xA662,0xA666,0xC9C9,INVALC,0xA664,0xA663,0xC9C8,0xA665, + 0xA661,INVALC,INVALC,0xA660,0xC9CA,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA7A6,INVALC,INVALC,0xA7A3,INVALC, + 0xA77D,0xCAAA,INVALC,INVALC,INVALC,0xCAAB,INVALC,0xA7A1, + INVALC,0xCAAD,0xA77B,0xCAAE,0xCAAC,0xA77E,0xA7A2,0xA7A5, + 0xA7A4,0xA77C,0xCAAF,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xA959,0xCBFE,INVALC,0xA95B,INVALC,0xA95A,INVALC, + 0xCC40,0xA958,0xA957,0xCBF5,INVALC,0xCBF4,INVALC,0xCBF2, + 0xCBF7,0xCBF6,0xCBF3,0xCBFC,0xCBFD,0xCBFA,0xCBF8,0xA956, + INVALC,INVALC,INVALC,0xCBFB,0xA95C,0xCC41,INVALC,INVALC, + 0xCBF9,INVALC,0xABAB,0xA955,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xABAC,0xCE54,INVALC,INVALC,0xCE5A, + INVALC,INVALC,INVALC,0xABB2,0xCE58,0xCE5E,INVALC,0xCE55, + 0xCE59,0xCE5B,0xCE5D,0xCE57,INVALC,0xCE56,0xCE51,0xCE52, + 0xABAD,INVALC,0xABAF,0xABAE,0xCE53,0xCE5C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xABB1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xCE50,0xD153,INVALC, + 0xD152,0xD157,0xD14E,INVALC,0xD151,0xD150,INVALC,0xD154, + INVALC,0xD158,0xAE47,0xAE4A,INVALC,INVALC,0xD14F,0xD155, + INVALC,INVALC,INVALC,0xAE49,0xD14A,INVALC,0xABB0,0xD4BA, + 0xD156,INVALC,0xD14D,INVALC,0xAE48,0xD14C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xD4B1,INVALC,INVALC,0xB0EC, + 0xB0F0,0xD4C1,0xD4AF,0xD4BD,0xB0F1,0xD4BF,INVALC,0xD4C5, + INVALC,0xD4C9,INVALC,INVALC,0xD4C0,0xD4B4,0xD4BC,INVALC, + 0xD4CA,0xD4C8,0xD4BE,0xD4B9,0xD4B2,0xD8A6,0xD4B0,0xB0F5, + 0xD4B7,0xB0F6,0xB0F2,0xD4AD,0xD4C3,0xD4B5,INVALC,INVALC, + /* Block 89, Array index 0x1900 */ + 0xD4B3,0xD4C6,0xB0F3,INVALC,0xD4CC,0xB0ED,0xB0EF,0xD4BB, + 0xD4B6,0xAE4B,0xB0EE,0xD4B8,0xD4C7,0xD4CB,0xD4C2,INVALC, + 0xD4C4,INVALC,INVALC,INVALC,0xD4AE,INVALC,INVALC,INVALC, + INVALC,0xD8A1,INVALC,0xD8AA,0xD8A9,0xB3FA,0xD8A2,INVALC, + 0xB3FB,0xB3F9,INVALC,0xD8A4,0xB3F6,0xD8A8,INVALC,0xD8A3, + 0xD8A5,0xD87D,0xB3F4,INVALC,0xD8B2,0xD8B1,0xD8AE,0xB3F3, + 0xB3F7,0xB3F8,0xD14B,0xD8AB,0xB3F5,0xB0F4,0xD8AD,0xD87E, + 0xD8B0,0xD8AF,INVALC,0xD8B3,INVALC,0xDCEF,INVALC,0xD8AC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD8A7,0xDCE7,0xB6F4,0xB6F7,0xB6F2,0xDCE6,0xDCEA,0xDCE5, + INVALC,0xB6EC,0xB6F6,0xDCE2,0xB6F0,0xDCE9,INVALC,0xB6EE, + 0xB6ED,0xDCEC,0xB6EF,0xDCEE,INVALC,0xDCEB,0xB6EB,INVALC, + INVALC,INVALC,0xB6F5,0xDCF0,0xDCE4,0xDCED,INVALC,INVALC, + 0xDCE3,INVALC,INVALC,0xB6F1,INVALC,0xB6F3,INVALC,0xDCE8, + INVALC,0xDCF1,INVALC,INVALC,0xE15D,0xB9D0,0xE163,INVALC, + INVALC,0xB9D5,0xE15F,0xE166,0xE157,0xB9D7,0xB9D1,0xE15C, + 0xBC55,0xE15B,0xE164,0xB9D2,INVALC,0xB9D6,0xE15A,0xE160, + 0xE165,0xE156,0xB9D4,0xE15E,INVALC,INVALC,0xE162,0xE168, + 0xE158,0xE161,INVALC,0xB9D3,0xE167,INVALC,INVALC,INVALC, + 0xE159,INVALC,INVALC,INVALC,0xBC59,0xE54B,0xBC57,0xBC56, + 0xE54D,0xE552,INVALC,0xE54E,INVALC,0xE551,0xBC5C,INVALC, + 0xBEA5,0xBC5B,INVALC,0xE54A,0xE550,INVALC,0xBC5A,0xE54F, + INVALC,0xE54C,INVALC,0xBC58,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xE94D,INVALC,0xE94F,0xE94A,0xBEC1,0xE94C, + INVALC,0xBEC0,0xE94E,INVALC,INVALC,0xBEC3,0xE950,0xBEC2, + 0xE949,0xE94B,INVALC,INVALC,INVALC,INVALC,0xC0A5,0xECCC, + INVALC,0xC0A4,0xECCD,0xC0A3,0xECCB,0xC0A2,0xECCA,INVALC, + 0xC253,0xC252,0xF1F6,0xF1F8,INVALC,0xF1F7,0xC361,0xC362, + INVALC,INVALC,0xC363,0xF442,0xC45B,INVALC,INVALC,0xF7D3, + 0xF7D2,0xC5F2,INVALC,0xA468,0xA4D0,INVALC,INVALC,0xA7A7, + INVALC,INVALC,INVALC,INVALC,0xCE5F,INVALC,INVALC,INVALC, + INVALC,0xB3FC,0xB3FD,INVALC,0xDCF2,0xB9D8,0xE169,0xE553, + /* Block 90, Array index 0x1A00 */ + INVALC,INVALC,INVALC,0xC95A,INVALC,INVALC,0xCAB0,INVALC, + INVALC,INVALC,INVALC,INVALC,0xCC42,0xCE60,0xD159,0xAE4C, + INVALC,INVALC,0xF1F9,INVALC,0xC4DC,0xA469,0xA57E,0xC970, + INVALC,0xA667,0xA668,INVALC,0xA95D,INVALC,INVALC,INVALC, + 0xB0F7,INVALC,0xB9DA,INVALC,0xB9DB,0xB9D9,INVALC,0xA46A, + INVALC,0xA4D1,0xA4D3,0xA4D2,0xC95B,0xA4D4,0xA5A1,0xC971, + INVALC,0xA5A2,INVALC,INVALC,INVALC,INVALC,INVALC,0xA669, + 0xA66A,INVALC,INVALC,INVALC,0xC9CB,INVALC,0xA7A8,INVALC, + 0xCAB1,INVALC,INVALC,INVALC,0xA961,0xCC43,INVALC,0xA95F, + 0xA960,0xA95E,0xD15A,INVALC,INVALC,INVALC,0xABB6,0xABB5, + 0xABB7,0xABB4,INVALC,0xCE61,0xA962,0xABB3,INVALC,0xAE4D, + 0xAE4E,INVALC,0xAE4F,INVALC,0xD4CD,INVALC,INVALC,INVALC, + 0xB3FE,0xD8B4,0xB0F8,INVALC,INVALC,INVALC,INVALC,0xB6F8, + INVALC,0xB9DD,0xB9DC,0xE16A,INVALC,0xBC5D,0xBEC4,INVALC, + 0xEFC0,0xF6DA,0xF7D4,0xA46B,0xA5A3,INVALC,0xA5A4,0xC9D1, + 0xA66C,0xA66F,INVALC,0xC9CF,0xC9CD,0xA66E,0xC9D0,0xC9D2, + 0xC9CC,0xA671,0xA670,0xA66D,0xA66B,0xC9CE,INVALC,INVALC, + INVALC,INVALC,0xA7B3,INVALC,INVALC,0xA7B0,0xCAB6,0xCAB9, + 0xCAB8,INVALC,0xA7AA,0xA7B2,INVALC,INVALC,0xA7AF,0xCAB5, + 0xCAB3,0xA7AE,INVALC,INVALC,INVALC,0xA7A9,0xA7AC,INVALC, + 0xCAB4,0xCABB,0xCAB7,0xA7AD,0xA7B1,0xA7B4,0xCAB2,0xCABA, + 0xA7AB,INVALC,INVALC,INVALC,INVALC,INVALC,0xA967,0xA96F, + INVALC,0xCC4F,0xCC48,0xA970,0xCC53,0xCC44,0xCC4B,INVALC, + INVALC,0xA966,0xCC45,0xA964,0xCC4C,0xCC50,0xA963,INVALC, + 0xCC51,0xCC4A,INVALC,0xCC4D,INVALC,0xA972,0xA969,0xCC54, + 0xCC52,INVALC,0xA96E,0xA96C,0xCC49,0xA96B,0xCC47,0xCC46, + 0xA96A,0xA968,0xA971,0xA96D,0xA965,INVALC,0xCC4E,INVALC, + 0xABB9,INVALC,0xABC0,0xCE6F,0xABB8,0xCE67,0xCE63,INVALC, + 0xCE73,0xCE62,INVALC,0xABBB,0xCE6C,0xABBE,0xABC1,INVALC, + 0xABBC,0xCE70,0xABBF,INVALC,0xAE56,0xCE76,0xCE64,INVALC, + INVALC,0xCE66,0xCE6D,0xCE71,0xCE75,0xCE72,0xCE6B,0xCE6E, + INVALC,INVALC,0xCE68,0xABC3,0xCE6A,0xCE69,0xCE74,0xABBA, + /* Block 91, Array index 0x1B00 */ + 0xCE65,0xABC2,INVALC,0xABBD,INVALC,INVALC,INVALC,INVALC, + INVALC,0xAE5C,0xD162,INVALC,0xAE5B,INVALC,INVALC,0xD160, + INVALC,0xAE50,INVALC,0xAE55,INVALC,0xD15F,0xD15C,0xD161, + 0xAE51,0xD15B,INVALC,0xAE54,0xAE52,INVALC,0xD163,0xAE53, + 0xAE57,INVALC,INVALC,0xAE58,INVALC,0xAE5A,INVALC,INVALC, + INVALC,0xAE59,INVALC,INVALC,INVALC,0xD15D,0xD15E,INVALC, + INVALC,INVALC,INVALC,0xD164,INVALC,0xD4D4,0xB0F9,0xD8C2, + 0xD4D3,0xD4E6,INVALC,INVALC,0xB140,INVALC,0xD4E4,INVALC, + 0xB0FE,0xB0FA,0xD4ED,0xD4DD,0xD4E0,INVALC,0xB143,0xD4EA, + 0xD4E2,0xB0FB,0xB144,INVALC,0xD4E7,0xD4E5,INVALC,INVALC, + 0xD4D6,0xD4EB,0xD4DF,0xD4DA,INVALC,0xD4D0,0xD4EC,0xD4DC, + 0xD4CF,INVALC,0xB142,0xD4E1,0xD4EE,0xD4DE,0xD4D2,0xD4D7, + 0xD4CE,INVALC,0xB141,INVALC,0xD4DB,0xD4D8,0xB0FC,0xD4D1, + INVALC,0xD4E9,0xB0FD,INVALC,0xD4D9,0xD4D5,INVALC,INVALC, + 0xD4E8,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xB440, + 0xD8BB,INVALC,0xD8B8,0xD8C9,0xD8BD,0xD8CA,INVALC,0xB442, + INVALC,INVALC,INVALC,0xD8C6,0xD8C3,INVALC,INVALC,INVALC, + INVALC,INVALC,0xD8C4,0xD8C7,0xD8CB,INVALC,0xD4E3,0xD8CD, + 0xDD47,INVALC,0xB443,0xD8CE,0xD8B6,0xD8C0,INVALC,0xD8C5, + INVALC,INVALC,0xB441,0xB444,0xD8CC,0xD8CF,0xD8BA,0xD8B7, + INVALC,INVALC,0xD8B9,INVALC,INVALC,0xD8BE,0xD8BC,0xB445, + INVALC,0xD8C8,INVALC,INVALC,0xD8BF,INVALC,0xD8C1,0xD8B5, + 0xDCFA,0xDCF8,0xB742,0xB740,0xDD43,0xDCF9,0xDD44,0xDD40, + 0xDCF7,0xDD46,0xDCF6,0xDCFD,0xB6FE,0xB6FD,0xB6FC,0xDCFB, + 0xDD41,0xB6F9,0xB741,INVALC,0xDCF4,INVALC,0xDCFE,0xDCF3, + 0xDCFC,0xB6FA,0xDD42,0xDCF5,0xB6FB,0xDD45,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xE16E,0xB9E2,0xB9E1, + 0xB9E3,0xE17A,0xE170,0xE176,0xE16B,0xE179,0xE178,0xE17C, + 0xE175,0xB9DE,0xE174,0xB9E4,INVALC,0xE16D,0xB9DF,INVALC, + 0xE17B,0xB9E0,0xE16F,0xE172,0xE177,0xE171,0xE16C,INVALC, + INVALC,INVALC,INVALC,0xE173,0xE555,0xBC61,0xE558,0xE557, + 0xE55A,0xE55C,INVALC,0xBC5F,INVALC,0xE556,INVALC,0xE554, + /* Block 92, Array index 0x1C00 */ + INVALC,0xE55D,0xE55B,0xE559,INVALC,0xE55F,INVALC,0xE55E, + 0xBC63,0xBC5E,INVALC,0xBC60,0xBC62,INVALC,INVALC,0xE560, + 0xE957,INVALC,INVALC,0xE956,0xE955,INVALC,0xE958,0xE951, + INVALC,0xE952,0xE95A,0xE953,INVALC,0xBEC5,0xE95C,INVALC, + 0xE95B,0xE954,INVALC,0xECD1,0xC0A8,0xECCF,0xECD4,0xECD3, + 0xE959,INVALC,0xC0A7,INVALC,0xECD2,0xECCE,0xECD6,0xECD5, + 0xC0A6,INVALC,0xECD0,INVALC,0xBEC6,INVALC,INVALC,INVALC, + 0xC254,INVALC,INVALC,INVALC,0xEFC1,0xF1FA,0xF1FB,0xF1FC, + 0xC45C,INVALC,INVALC,0xC45D,INVALC,0xF443,INVALC,0xF5C8, + 0xF5C7,INVALC,INVALC,0xF6DB,0xF6DC,0xF7D5,0xF8A7,INVALC, + 0xA46C,0xA46D,INVALC,0xA46E,0xA4D5,0xA5A5,0xC9D3,0xA672, + 0xA673,INVALC,0xA7B7,0xA7B8,0xA7B6,0xA7B5,INVALC,0xA973, + INVALC,INVALC,0xCC55,0xA975,0xA974,0xCC56,INVALC,INVALC, + INVALC,0xABC4,INVALC,0xAE5D,0xD165,INVALC,0xD4F0,INVALC, + 0xB145,0xB447,0xD4EF,0xB446,INVALC,0xB9E5,INVALC,0xE17D, + 0xBEC7,INVALC,0xC0A9,0xECD7,INVALC,0xC45E,INVALC,0xC570, + INVALC,0xC972,INVALC,0xA5A6,0xC973,0xA676,INVALC,0xA674, + 0xA675,0xA677,INVALC,0xA7BA,0xA7B9,INVALC,0xCABC,0xA7BB, + INVALC,INVALC,0xCABD,0xCC57,INVALC,0xCC58,INVALC,0xA976, + 0xA978,0xA97A,0xA977,0xA97B,0xA979,INVALC,INVALC,INVALC, + INVALC,INVALC,0xABC8,0xABC5,0xABC7,0xABC9,0xABC6,0xD166, + 0xCE77,INVALC,INVALC,INVALC,0xD168,0xD167,0xAE63,INVALC, + 0xAE5F,INVALC,INVALC,0xAE60,0xAE62,0xAE64,0xAE61,INVALC, + 0xAE66,0xAE65,INVALC,INVALC,INVALC,INVALC,INVALC,0xB14A, + 0xD4F2,0xD4F1,0xB149,INVALC,0xB148,0xB147,0xB14B,0xB146, + INVALC,INVALC,0xD8D5,0xD8D2,0xB449,0xD8D1,0xD8D6,INVALC, + 0xB44B,0xD8D4,0xB448,0xB44A,0xD8D3,INVALC,0xDD48,INVALC, + 0xDD49,0xDD4A,INVALC,INVALC,INVALC,INVALC,0xB9E6,0xB9EE, + 0xE17E,0xB9E8,0xB9EC,0xE1A1,0xB9ED,0xB9E9,0xB9EA,0xB9E7, + 0xB9EB,0xBC66,0xD8D0,0xBC67,0xBC65,INVALC,0xBC64,0xE95D, + 0xBEC8,0xECD8,0xECD9,INVALC,INVALC,0xC364,0xC45F,INVALC, + 0xA46F,INVALC,0xA678,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x1D00 */ + INVALC,0xABCA,INVALC,0xD169,0xAE67,INVALC,INVALC,0xB14E, + 0xB14D,0xB14C,0xB44C,0xB44D,0xD8D7,0xB9EF,0xBEC9,0xA470, + 0xC95C,0xA4D6,0xC974,INVALC,INVALC,0xC9D4,0xA679,INVALC, + INVALC,INVALC,0xA97C,INVALC,INVALC,INVALC,INVALC,0xDD4B, + INVALC,INVALC,0xA471,INVALC,0xA4D7,0xC9D5,INVALC,INVALC, + 0xCABE,INVALC,0xCABF,INVALC,0xA7BC,INVALC,INVALC,INVALC, + 0xD8D8,0xB44E,INVALC,0xDD4C,INVALC,INVALC,INVALC,0xC0AA, + 0xA472,0xA4A8,0xA4D8,0xC975,0xA5A7,INVALC,0xA7C0,0xA7BF, + 0xA7BD,0xA7BE,INVALC,INVALC,0xCC59,0xA97E,0xA9A1,0xCC5A, + 0xA97D,INVALC,INVALC,0xABCE,0xCE78,0xABCD,0xABCB,0xABCC, + 0xAE6A,0xAE68,INVALC,INVALC,0xD16B,0xAE69,0xD16A,INVALC, + 0xAE5E,0xD4F3,INVALC,INVALC,0xB150,0xB151,INVALC,INVALC, + 0xB14F,INVALC,0xB9F0,0xE1A2,0xBC68,0xBC69,INVALC,0xE561, + 0xC0AB,0xEFC2,0xEFC3,INVALC,0xC4DD,0xF8A8,0xC94B,0xA4D9, + INVALC,0xA473,INVALC,0xC977,0xC976,INVALC,INVALC,INVALC, + INVALC,0xA67A,0xC9D7,0xC9D8,0xC9D6,INVALC,0xC9D9,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCAC7,INVALC, + 0xCAC2,0xCAC4,0xCAC6,0xCAC3,0xA7C4,0xCAC0,INVALC,0xCAC1, + 0xA7C1,0xA7C2,0xCAC5,0xCAC8,0xA7C3,0xCAC9,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xCC68,INVALC,0xCC62, + 0xCC5D,0xA9A3,0xCC65,0xCC63,0xCC5C,0xCC69,0xCC6C,0xCC67, + 0xCC60,0xA9A5,0xCC66,0xA9A6,0xCC61,0xCC64,0xCC5B,0xCC5F, + 0xCC6B,0xA9A7,INVALC,0xA9A8,INVALC,0xCC5E,0xCC6A,0xA9A2, + 0xA9A4,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCEAB,0xCEA4, + 0xCEAA,0xCEA3,0xCEA5,0xCE7D,0xCE7B,INVALC,0xCEAC,0xCEA9, + 0xCE79,INVALC,0xABD0,0xCEA7,0xCEA8,INVALC,0xCEA6,0xCE7C, + 0xCE7A,0xABCF,0xCEA2,0xCE7E,INVALC,INVALC,0xCEA1,0xCEAD, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xAE6F,INVALC,0xAE6E,INVALC,0xD16C,0xAE6B,0xD16E,INVALC, + 0xAE70,0xD16F,INVALC,INVALC,0xAE73,INVALC,0xAE71,0xD170, + 0xCEAE,0xD172,INVALC,0xAE6D,INVALC,0xAE6C,INVALC,0xD16D, + /* Block 94, Array index 0x1E00 */ + 0xD171,0xAE72,INVALC,INVALC,INVALC,INVALC,0xB153,0xB152, + INVALC,INVALC,INVALC,0xD4F5,0xD4F9,0xD4FB,0xB154,0xD4FE, + INVALC,0xB158,0xD541,INVALC,0xB15A,INVALC,0xB156,0xB15E, + INVALC,0xB15B,0xD4F7,0xB155,INVALC,0xD4F6,0xD4F4,0xD543, + 0xD4F8,INVALC,0xB157,0xD542,0xB15C,0xD4FD,0xD4FC,0xB15D, + 0xD4FA,0xB159,INVALC,INVALC,INVALC,INVALC,0xD544,INVALC, + 0xD540,0xD8E7,0xD8EE,0xD8E3,0xB451,0xD8DF,0xD8EF,0xD8D9, + 0xD8EC,0xD8EA,0xD8E4,INVALC,0xD8ED,0xD8E6,INVALC,0xD8DE, + 0xD8F0,0xD8DC,0xD8E9,0xD8DA,INVALC,0xD8F1,INVALC,0xB452, + INVALC,0xD8EB,0xDD4F,0xD8DD,0xB44F,INVALC,0xD8E1,INVALC, + 0xB450,0xD8E0,0xD8E5,INVALC,INVALC,0xD8E2,INVALC,INVALC, + INVALC,0xD8E8,INVALC,INVALC,INVALC,INVALC,0xDD53,INVALC, + INVALC,INVALC,0xDD56,0xDD4E,INVALC,0xDD50,INVALC,0xDD55, + 0xDD54,0xB743,INVALC,0xD8DB,0xDD52,INVALC,INVALC,0xB744, + INVALC,0xDD4D,0xDD51,INVALC,INVALC,INVALC,INVALC,0xE1A9, + INVALC,0xE1B0,0xE1A7,INVALC,0xE1AE,0xE1A5,0xE1AD,0xE1B1, + 0xE1A4,0xE1A8,0xE1A3,INVALC,0xB9F1,INVALC,0xE1A6,0xB9F2, + 0xE1AC,0xE1AB,0xE1AA,INVALC,INVALC,0xE1AF,INVALC,INVALC, + INVALC,INVALC,0xE565,0xE567,0xBC6B,0xE568,INVALC,0xE563, + INVALC,0xE562,0xE56C,INVALC,0xE56A,0xBC6A,0xE56D,0xE564, + 0xE569,0xE56B,0xE566,INVALC,INVALC,INVALC,INVALC,0xE961, + 0xE966,0xE960,0xE965,INVALC,0xE95E,0xE968,0xE964,0xE969, + 0xE963,0xE95F,0xE967,INVALC,0xE96A,0xE962,INVALC,0xECDA, + 0xC0AF,INVALC,0xC0AD,INVALC,0xC0AC,0xC0AE,INVALC,INVALC, + 0xEFC4,INVALC,0xF172,0xF1FD,INVALC,INVALC,0xF444,0xF445, + INVALC,0xC460,INVALC,0xF5C9,INVALC,0xC4DE,INVALC,0xF5CA, + INVALC,0xF6DE,0xC572,INVALC,0xC571,0xF6DD,0xC5C9,INVALC, + 0xF7D6,INVALC,INVALC,INVALC,INVALC,0xA474,0xA67B,0xC9DA, + 0xCACA,0xA8B5,0xB15F,INVALC,INVALC,0xA475,0xA5AA,0xA5A9, + 0xA5A8,INVALC,INVALC,0xA7C5,INVALC,INVALC,0xAE74,INVALC, + 0xDD57,0xA476,0xA477,0xA478,0xA4DA,INVALC,INVALC,0xABD1, + INVALC,0xCEAF,INVALC,INVALC,INVALC,0xB453,0xA479,0xC95D, + /* Block 95, Array index 0x1F00 */ + INVALC,INVALC,0xA5AB,0xA5AC,0xC978,INVALC,0xA67C,INVALC, + INVALC,INVALC,0xCACB,INVALC,0xA7C6,INVALC,0xCACC,INVALC, + INVALC,0xA9AE,INVALC,INVALC,0xCC6E,0xA9AC,0xA9AB,0xCC6D, + 0xA9A9,0xCC6F,0xA9AA,0xA9AD,INVALC,0xABD2,INVALC,0xABD4, + 0xCEB3,0xCEB0,0xCEB1,0xCEB2,0xCEB4,0xABD3,INVALC,INVALC, + 0xD174,0xD173,INVALC,0xAE76,INVALC,0xAE75,INVALC,INVALC, + INVALC,INVALC,INVALC,0xB162,0xD546,INVALC,0xB161,0xB163, + 0xB160,INVALC,INVALC,INVALC,INVALC,0xB455,0xD545,INVALC, + 0xB456,0xD8F3,INVALC,0xB457,0xD8F2,0xB454,INVALC,INVALC, + INVALC,INVALC,0xDD5A,0xDD5C,0xB745,0xDD5B,0xDD59,0xDD58, + INVALC,INVALC,INVALC,0xE1B4,0xB9F7,0xB9F5,INVALC,0xB9F6, + 0xE1B2,0xE1B3,INVALC,0xB9F3,0xE571,0xE56F,INVALC,0xBC6D, + 0xE570,0xBC6E,0xBC6C,0xB9F4,INVALC,INVALC,0xE96D,0xE96B, + 0xE96C,0xE56E,0xECDC,0xC0B0,0xECDB,0xEFC5,0xEFC6,0xE96E, + 0xF1FE,INVALC,0xA47A,0xA5AD,0xA67E,0xC9DB,0xA67D,INVALC, + 0xA9AF,0xB746,INVALC,0xA4DB,0xA5AE,0xABD5,0xB458,INVALC, + 0xC979,INVALC,0xC97A,INVALC,0xC9DC,INVALC,INVALC,0xA7C8, + 0xCAD0,0xCACE,0xA7C9,0xCACD,0xCACF,0xCAD1,INVALC,0xA7C7, + INVALC,INVALC,INVALC,INVALC,INVALC,0xA9B3,0xA9B4,0xA9B1, + INVALC,INVALC,0xA9B0,0xCEB8,0xA9B2,INVALC,INVALC,INVALC, + 0xABD6,INVALC,0xCEB7,0xCEB9,0xCEB6,0xCEBA,0xABD7,0xAE79, + 0xD175,INVALC,0xD177,0xAE77,0xD178,0xAE78,0xD176,INVALC, + 0xCEB5,0xD547,0xD54A,0xD54B,0xD548,0xB167,0xB166,0xB164, + 0xB165,0xD549,INVALC,INVALC,INVALC,INVALC,0xB168,INVALC, + INVALC,0xB45A,0xB45B,INVALC,0xB45C,0xDD5D,0xDD5F,0xDD61, + 0xB748,0xB747,0xB459,0xDD60,0xDD5E,INVALC,0xE1B8,INVALC, + INVALC,0xE1B6,0xE1BC,0xB9F8,0xE1BD,0xE1BA,0xB9F9,0xE1B7, + 0xE1B5,0xE1BB,0xBC70,0xE573,0xE1B9,0xBC72,0xE574,0xBC71, + 0xBC74,0xE575,0xBC6F,0xBC73,INVALC,0xE973,0xE971,0xE970, + 0xE972,0xE96F,INVALC,INVALC,0xC366,INVALC,0xF446,0xF447, + INVALC,0xF5CB,0xF6DF,0xC655,INVALC,INVALC,0xA9B5,0xA7CA, + INVALC,INVALC,0xABD8,INVALC,INVALC,INVALC,0xA47B,0xA4DC, + /* Block 96, Array index 0x2000 */ + INVALC,0xA5AF,0xC9DD,INVALC,0xA7CB,0xCAD2,INVALC,0xCEBB, + 0xABD9,INVALC,0xB9FA,0xA47C,INVALC,INVALC,INVALC,0xA6A1, + INVALC,INVALC,0xB749,0xA47D,0xA4DD,0xA4DE,INVALC,0xA5B1, + 0xA5B0,INVALC,0xC9DE,0xA6A2,INVALC,0xCAD3,INVALC,0xA7CC, + INVALC,INVALC,0xCC71,0xCC72,0xCC73,INVALC,0xA9B6,0xA9B7, + 0xCC70,0xA9B8,INVALC,INVALC,INVALC,0xABDA,0xCEBC,INVALC, + 0xD17A,0xAE7A,INVALC,0xD179,INVALC,0xB169,0xD54C,0xB16A, + 0xD54D,INVALC,INVALC,INVALC,0xB45D,INVALC,INVALC,INVALC, + 0xDD62,INVALC,INVALC,0xE1BF,0xE1BE,INVALC,0xB9FB,INVALC, + 0xBC75,0xE576,0xBECA,0xE974,0xC0B1,INVALC,0xC573,0xF7D8, + INVALC,INVALC,INVALC,INVALC,0xCC74,INVALC,0xCEBD,0xB16B, + 0xD8F4,0xB74A,INVALC,INVALC,INVALC,0xC255,INVALC,INVALC, + INVALC,INVALC,0xA7CE,INVALC,0xA7CD,0xABDB,INVALC,0xD17B, + INVALC,0xB16D,0xB343,0xB16E,0xB16C,0xB45E,INVALC,0xE1C0, + 0xB9FC,0xBC76,INVALC,0xC94C,0xC9DF,INVALC,0xCAD5,0xA7CF, + 0xCAD4,0xA7D0,INVALC,INVALC,0xA9BC,0xCC77,0xCC76,0xA9BB, + 0xA9B9,0xA9BA,0xCC75,INVALC,INVALC,0xABDD,0xCEBE,0xABE0, + 0xABDC,0xABE2,0xABDE,0xABDF,0xABE1,INVALC,INVALC,INVALC, + 0xAE7D,0xAE7C,0xAE7B,INVALC,INVALC,INVALC,0xD54F,0xB16F, + 0xB172,0xB170,INVALC,0xD54E,0xB175,INVALC,0xB171,0xD550, + 0xB174,0xB173,INVALC,INVALC,INVALC,0xD8F6,0xD8F5,INVALC, + 0xB461,0xB45F,0xB460,0xD8F7,0xB74B,0xDD64,0xB74C,0xDD63, + INVALC,INVALC,0xE577,INVALC,INVALC,0xBC78,0xE1C1,0xBC77, + INVALC,0xB9FD,INVALC,0xECDE,0xE975,0xC0B2,0xECDD,0xF240, + 0xF448,0xF449,INVALC,0xA4DF,INVALC,0xA5B2,INVALC,INVALC, + INVALC,0xC97B,INVALC,INVALC,0xA7D2,0xA7D4,INVALC,0xC9E2, + 0xCAD8,0xCAD7,0xCAD6,INVALC,0xC9E1,0xC9E0,0xA6A4,0xA7D3, + 0xA7D1,0xA6A3,INVALC,INVALC,INVALC,0xA9BD,0xCC78,INVALC, + 0xA9BE,0xCADD,INVALC,0xCADF,0xCADE,0xCC79,INVALC,INVALC, + 0xCADA,INVALC,0xA7D8,0xA7D6,INVALC,0xCAD9,0xCADB,0xCAE1, + INVALC,0xA7D5,INVALC,0xCADC,0xCAE5,0xA9C0,INVALC,0xCAE2, + 0xA7D7,INVALC,0xCAE0,0xCAE3,INVALC,0xA9BF,INVALC,0xA9C1, + /* Block 97, Array index 0x2100 */ + 0xCAE4,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xCCAF,0xCCA2,0xCC7E,0xCCAE,0xCCA9,0xABE7,0xA9C2, + 0xCCAA,0xCCAD,0xABE3,0xCCAC,0xA9C3,0xA9C8,0xA9C6,0xCCA3, + INVALC,0xCC7C,0xCCA5,0xA9CD,0xCCB0,0xABE4,0xCCA6,INVALC, + 0xABE5,0xA9C9,0xCCA8,INVALC,0xCECD,0xABE6,0xCC7B,0xA9CA, + 0xABE8,0xA9CB,0xA9C7,0xA9CC,0xCCA7,0xCC7A,0xCCAB,0xA9C4, + INVALC,INVALC,0xCC7D,0xCCA4,0xCCA1,0xA9C5,INVALC,0xCEBF, + INVALC,0xCEC0,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xCECA,0xD1A1,0xCECB,0xABEE,0xCECE,0xCEC4,0xABED,0xCEC6, + INVALC,0xCEC7,INVALC,INVALC,0xCEC9,0xABE9,INVALC,INVALC, + 0xAEA3,INVALC,INVALC,0xCEC5,0xCEC1,0xAEA4,INVALC,INVALC, + 0xCECF,0xAE7E,0xD17D,0xCEC8,INVALC,0xD17C,0xCEC3,0xCECC, + INVALC,INVALC,0xABEC,0xAEA1,0xABF2,0xAEA2,0xCED0,0xD17E, + 0xABEB,0xAEA6,0xABF1,0xABF0,0xABEF,0xAEA5,0xCED1,0xAEA7, + 0xABEA,INVALC,0xCEC2,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xB176, + 0xD1A4,0xD1A6,INVALC,0xD1A8,0xAEA8,0xAEAE,0xD553,0xD1AC, + 0xD1A3,0xB178,0xD551,INVALC,0xAEAD,0xAEAB,0xD1AE,INVALC, + 0xD552,INVALC,0xD1A5,INVALC,0xAEAC,0xD1A9,0xAEAF,0xD1AB, + INVALC,INVALC,0xAEAA,0xD1AA,0xD1AD,0xD1A7,INVALC,0xAEA9, + 0xB179,INVALC,0xD1A2,0xB177,INVALC,INVALC,INVALC,INVALC, + 0xB17A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD555,0xD55E,0xB464,INVALC,0xB17C,0xB1A3,0xB465,0xD560, + 0xB1AA,0xD8F9,0xD556,0xB1A2,0xB1A5,0xB17E,0xD554,0xD562, + 0xD565,0xD949,INVALC,0xD563,0xD8FD,0xB1A1,0xB1A8,0xB1AC, + 0xD55D,0xD8F8,0xD561,0xB17B,0xD8FA,0xD564,0xD8FC,0xD559, + INVALC,0xB462,INVALC,0xD557,0xD558,0xB1A7,INVALC,INVALC, + 0xB1A6,0xD55B,0xB1AB,0xD55F,0xB1A4,0xD55C,INVALC,0xB1A9, + 0xB466,0xB463,0xD8FB,INVALC,0xD55A,INVALC,0xB17D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xB46B,0xB46F,0xD940,0xB751,0xB46D,0xD944,0xB471,0xDD65, + 0xD946,0xB753,0xB469,0xB46C,0xD947,INVALC,0xD948,0xD94E, + /* Block 98, Array index 0x2200 */ + 0xB473,0xB754,INVALC,0xD94A,0xD94F,0xD943,0xB75E,INVALC, + 0xB755,0xB472,0xD941,0xD950,INVALC,0xB75D,0xB470,0xB74E, + 0xD94D,INVALC,0xB474,0xD945,0xD8FE,0xB46A,0xD942,INVALC, + 0xD94B,INVALC,0xB74D,0xB752,0xB467,0xD94C,INVALC,0xB750, + INVALC,INVALC,INVALC,0xB468,INVALC,INVALC,INVALC,0xB75C, + 0xE1C3,0xDD70,INVALC,0xDD68,0xE1C2,INVALC,0xDD6C,0xDD6E, + INVALC,INVALC,0xDD6B,INVALC,0xB75B,INVALC,0xDD6A,0xB75F, + INVALC,INVALC,INVALC,0xE1D2,INVALC,INVALC,0xB75A,0xBA40, + 0xDD71,0xE1C4,INVALC,INVALC,0xB758,0xDD69,0xDD6D,0xB9FE, + 0xB74F,0xDD66,0xDD67,0xBA41,0xB757,0xB759,0xB756,0xDD6F, + INVALC,INVALC,0xE1C8,0xE1C9,0xE1CE,0xBC7D,0xE1D5,INVALC, + 0xBA47,INVALC,0xBA46,0xE1D0,INVALC,0xBC7C,0xE1C5,0xBA45, + INVALC,0xE1D4,0xBA43,0xBA44,INVALC,0xE1D1,0xE5AA,0xBC7A, + 0xB46E,INVALC,0xE1D3,0xBCA3,0xE1CB,INVALC,0xBC7B,INVALC, + 0xBCA2,0xE1C6,0xE1CA,0xE1C7,0xE1CD,0xBA48,0xBC79,0xBA42, + INVALC,0xE57A,0xE1CF,INVALC,0xBCA1,INVALC,0xBCA4,INVALC, + 0xE1CC,INVALC,0xBC7E,0xE579,INVALC,INVALC,INVALC,INVALC, + INVALC,0xE57E,0xBECE,0xE578,0xE9A3,0xE5A9,0xBCA8,INVALC, + 0xBCA6,0xBECC,0xE5A6,0xE5A2,0xBCAC,INVALC,0xE978,INVALC, + INVALC,INVALC,0xBCAA,0xE5A1,INVALC,0xE976,INVALC,0xE5A5, + INVALC,0xE5A8,0xE57D,INVALC,0xBCAB,INVALC,INVALC,0xBCA5, + 0xE977,0xBECD,0xE5A7,0xBCA7,0xBCA9,0xE5A4,0xBCAD,0xE5A3, + 0xE57C,0xE57B,0xBECB,0xE5AB,0xE97A,0xECE0,0xBED0,INVALC, + 0xE9A2,INVALC,0xE97E,INVALC,0xECE1,INVALC,0xBED1,0xE9A1, + INVALC,0xE97C,0xC0B4,0xECDF,INVALC,0xE979,0xE97B,0xC0B5, + 0xBED3,0xC0B3,0xBED2,0xC0B7,0xE97D,0xBECF,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xEFCF,INVALC, + 0xEFC7,INVALC,INVALC,INVALC,INVALC,INVALC,0xECE7,0xEFC8, + 0xECE3,INVALC,INVALC,0xC256,0xECE5,0xECE4,0xC0B6,0xECE2, + 0xECE6,0xEFD0,0xEFCC,0xEFCE,INVALC,0xEFC9,0xEFCA,INVALC, + 0xEFCD,0xEFCB,0xC367,INVALC,INVALC,0xC36A,0xC369,0xC368, + 0xC461,0xF44A,0xC462,0xF241,0xC4DF,0xF5CC,0xC4E0,0xC574, + /* Block 99, Array index 0x2300 */ + 0xC5CA,0xF7D9,INVALC,0xF7DA,0xF7DB,INVALC,INVALC,0xF9BA, + 0xA4E0,0xC97C,0xA5B3,INVALC,0xA6A6,0xA6A7,0xA6A5,INVALC, + 0xA6A8,0xA7DA,0xA7D9,INVALC,0xCCB1,0xA9CF,0xA9CE,INVALC, + INVALC,0xD1AF,0xB1AD,0xB1AE,INVALC,INVALC,INVALC,0xB475, + 0xDD72,0xB760,0xB761,0xDD74,0xDD76,0xDD75,INVALC,0xE1D7, + INVALC,0xE1D6,0xBA49,0xE1D8,INVALC,0xE5AC,0xBCAE,INVALC, + 0xBED4,INVALC,0xC0B8,0xC257,0xC0B9,INVALC,0xA4E1,INVALC, + INVALC,INVALC,0xCAE6,INVALC,INVALC,0xCCB2,0xA9D1,0xA9D0, + 0xA9D2,0xABF3,0xCED2,0xCED3,INVALC,INVALC,0xD1B0,0xAEB0, + 0xB1AF,0xB476,0xD951,0xA4E2,INVALC,0xA47E,0xA4E3,INVALC, + 0xC97D,0xA5B7,0xA5B6,0xA5B4,0xA5B5,INVALC,INVALC,INVALC, + 0xA6AB,0xC9E9,0xC9EB,0xA6AA,0xC9E3,INVALC,0xC9E4,INVALC, + 0xC9EA,0xC9E6,0xC9E8,0xA6A9,0xC9E5,0xC9EC,0xC9E7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xA7E1,0xA7EA,0xA7E8, + 0xCAF0,0xCAED,0xCAF5,0xA7E6,0xCAF6,INVALC,0xA7DF,0xCAF3, + INVALC,0xA7E5,0xCAEF,0xCAEE,0xA7E3,0xCAF4,0xA7E4,0xA9D3, + 0xA7DE,0xCAF1,INVALC,0xCAE7,0xA7DB,INVALC,0xA7EE,0xCAEC, + 0xCAF2,0xA7E0,0xA7E2,INVALC,0xCAE8,INVALC,0xCAE9,0xCAEA, + INVALC,0xA7ED,0xA7E7,0xA7EC,0xCAEB,0xA7EB,0xA7DD,0xA7DC, + 0xA7E9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA9E1,0xCCBE,0xCCB7,0xA9DC,0xA9EF,0xCCB3,0xCCBA,0xCCBC, + 0xCCBF,0xA9EA,INVALC,0xCCBB,0xCCB4,0xA9E8,0xCCB8,INVALC, + 0xCCC0,0xA9D9,INVALC,0xCCBD,0xA9E3,0xA9E2,0xCCB6,0xA9D7, + INVALC,INVALC,0xA9D8,INVALC,0xA9D6,INVALC,0xA9EE,0xA9E6, + 0xA9E0,0xA9D4,0xCCB9,0xA9DF,0xA9D5,0xA9E7,0xA9F0,0xCED4, + 0xA9E4,0xCCB5,0xA9DA,0xA9DD,0xA9DE,INVALC,0xA9EC,0xA9ED, + 0xA9EB,0xA9E5,0xA9E9,0xA9DB,0xABF4,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xCEDA,0xAC41,0xABF8,0xABFA,0xAC40, + 0xCEE6,0xABFD,0xD1B1,0xAEB1,0xAC43,0xCED7,0xCEDF,0xABFE, + 0xCEDE,0xCEDB,0xCEE3,0xCEE5,0xABF7,0xABFB,0xAC42,0xAEB3, + /* Block 100, Array index 0x2400 */ + 0xCEE0,0xABF9,0xAC45,0xCED9,INVALC,INVALC,INVALC,0xABFC, + 0xAEB2,0xABF6,INVALC,0xCED6,0xCEDD,0xCED5,0xCED8,0xCEDC, + 0xD1B2,0xAC44,INVALC,0xCEE1,0xCEE2,0xCEE4,0xABF5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xAEC1,0xD1BE,0xAEBF,0xAEC0,0xD1B4,0xD1C4,INVALC,0xAEB6, + INVALC,INVALC,0xD566,0xD1C6,0xD1C0,INVALC,0xD1B7,INVALC, + 0xD1C9,0xD1BA,0xAEBC,0xD57D,0xD1BD,0xAEBE,0xAEB5,INVALC, + 0xD1CB,0xD1BF,0xAEB8,0xD1B8,0xD1B5,0xD1B6,0xAEB9,0xD1C5, + 0xD1CC,0xAEBB,0xD1BC,0xD1BB,0xAEC3,0xAEC2,0xAEB4,0xAEBA, + 0xAEBD,0xD1C8,INVALC,INVALC,0xD1C2,0xAEB7,0xD1B3,0xD1CA, + 0xD1C1,0xD1C3,0xD1C7,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD567,INVALC,0xB1B7, + 0xB1CB,0xB1CA,INVALC,0xB1BF,INVALC,0xD579,0xD575,0xD572, + 0xD5A6,0xB1BA,0xB1B2,INVALC,INVALC,0xD577,0xB4A8,0xB1B6, + 0xD5A1,INVALC,0xB1CC,0xB1C9,0xD57B,0xD56A,INVALC,INVALC, + 0xB1C8,0xD5A3,0xD569,0xB1BD,0xB1C1,0xD5A2,INVALC,0xD573, + 0xB1C2,0xB1BC,0xD568,INVALC,0xB478,0xD5A5,0xD571,0xB1C7, + 0xD574,0xD5A4,0xB1C6,INVALC,0xD952,INVALC,0xB1B3,0xD56F, + 0xB1B8,0xB1C3,INVALC,0xB1BE,0xD578,0xD56E,0xD56C,0xD57E, + 0xB1B0,0xB1C4,0xB1B4,0xB477,0xD57C,0xB1B5,INVALC,0xB1B1, + 0xB1C0,0xB1BB,0xB1B9,0xD570,0xB1C5,0xD56D,0xD57A,0xD576, + 0xD954,0xD953,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD56B,0xD964,INVALC, + 0xB47A,INVALC,0xD96A,0xD959,0xD967,0xDD77,0xB47D,0xD96B, + 0xD96E,0xB47C,0xD95C,0xD96D,0xD96C,0xB47E,0xD955,0xB479, + 0xB4A3,INVALC,0xB4A1,0xD969,INVALC,0xD95F,0xB4A5,0xD970, + 0xD968,0xD971,0xB4AD,0xB4AB,0xD966,0xD965,INVALC,0xD963, + 0xD95D,0xB4A4,INVALC,0xB4A2,0xD1B9,0xD956,INVALC,0xDDB7, + 0xD957,0xB47B,0xB4AA,0xDD79,INVALC,0xB4A6,0xB4A7,0xD958, + 0xD96F,0xDD78,0xD960,0xD95B,0xB4A9,0xD961,0xD95E,INVALC, + INVALC,0xB4AE,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xB770,INVALC, + INVALC,0xDD7C,0xDDB1,0xDDB6,0xDDAA,0xB76C,0xDDBB,0xB769, + 0xDD7A,INVALC,0xDD7B,0xB762,0xB76B,0xDDA4,0xB76E,0xB76F, + 0xDDA5,INVALC,0xDDB2,0xDDB8,0xB76A,INVALC,0xB764,0xDDA3, + 0xDD7D,0xDDBA,0xDDA8,0xDDA9,0xDD7E,0xDDB4,0xDDAB,0xDDB5, + 0xDDAD,INVALC,0xB765,0xE1D9,0xB768,0xB766,0xDDB9,0xDDB0, + 0xDDAC,INVALC,INVALC,0xDDA1,0xBA53,0xDDAF,0xB76D,0xDDA7, + INVALC,0xDDA6,INVALC,INVALC,INVALC,0xB767,0xB763,0xE1EE, + 0xDDB3,0xDDAE,INVALC,0xDDA2,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xE1E9,INVALC,0xE1DA,0xE1E5,INVALC, + 0xE1EC,0xBA51,0xB4AC,0xE1EA,0xBA4C,INVALC,INVALC,INVALC, + 0xBA4B,0xE1F1,INVALC,0xE1DB,0xE1E8,0xE1DC,0xE1E7,0xBA4F, + 0xE1EB,0xD962,INVALC,INVALC,INVALC,0xE1F2,0xE1E3,0xBA52, + 0xE5BA,0xBCAF,INVALC,0xE1F0,0xE1EF,0xBA54,0xE5AD,0xBCB0, + 0xE5AE,INVALC,0xE1DF,0xE1E0,0xE1DD,0xE1E2,0xE1DE,0xE1F3, + 0xBA4E,0xBCB1,0xBA50,0xBA55,INVALC,0xE1E1,INVALC,0xE1ED, + INVALC,INVALC,0xE1E6,INVALC,INVALC,0xE5B1,INVALC,0xBA4A, + 0xBCB4,0xE9AA,0xE5B6,0xE5B5,0xE5B7,INVALC,INVALC,0xE5B4, + 0xBCB5,INVALC,0xBCBB,0xBCB8,INVALC,0xBCB9,0xE5AF,0xE5B2, + 0xE5BC,0xBCC1,0xBCBF,INVALC,0xE5B3,0xD95A,0xBCB2,0xE5B9, + 0xE5B0,INVALC,0xBCC2,0xE5B8,0xBA4D,0xBCB7,0xE1E4,INVALC, + INVALC,0xBCBA,INVALC,0xBCBE,0xBCC0,0xBCBD,0xBCBC,INVALC, + 0xBCB6,0xE5BB,0xBCB3,0xBCC3,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xBED8,0xBED9,0xE9A9,0xBEE2,0xBEDF, + INVALC,0xBED6,0xBEDD,0xE9AB,0xBEDB,0xBED5,INVALC,0xBEDC, + INVALC,0xE9A8,0xC0BB,0xBED7,INVALC,0xBEDE,0xC0BA,0xE9A7, + 0xE9A6,INVALC,0xBEE0,INVALC,0xBEE1,INVALC,0xE9A5,0xE9A4, + 0xC0BC,0xE9AE,0xBEDA,0xE9AC,INVALC,INVALC,INVALC,INVALC, + 0xC0BD,INVALC,0xC0C2,0xECEA,0xECEC,INVALC,0xC0BF,INVALC, + 0xECED,0xECE9,INVALC,0xECEB,0xC0C0,0xC0C3,INVALC,0xECE8, + 0xC0BE,0xC0C1,0xC259,0xE9AD,0xC258,INVALC,INVALC,0xC25E, + 0xEFD4,INVALC,0xC25C,0xC25D,0xEFD7,0xEFD3,0xC25A,0xEFD1, + /* Block 102, Array index 0x2600 */ + 0xC36B,0xEFD5,INVALC,0xEFD6,0xEFD2,INVALC,0xC25B,0xF242, + INVALC,0xF245,INVALC,INVALC,0xF246,0xF244,0xF247,0xC36C, + 0xF243,INVALC,INVALC,0xF44E,0xC464,0xF44D,0xF44C,0xF44B, + 0xC463,0xC465,INVALC,0xF5CD,0xC4E2,0xC4E1,INVALC,INVALC, + 0xF6E1,0xF6E0,0xF6E3,0xC5CB,0xC575,0xF7DD,0xF6E2,INVALC, + INVALC,0xF7DC,0xC5CD,0xC5CC,0xC5F3,0xF8A9,0xF8EF,0xA4E4, + INVALC,INVALC,0xD972,0xE9AF,INVALC,INVALC,0xA6AC,0xCAF7, + 0xA7F1,0xA7EF,INVALC,0xA7F0,INVALC,0xCCC1,0xA9F1,0xAC46, + INVALC,0xCEE7,INVALC,0xCEE8,INVALC,0xAC47,0xD1CE,INVALC, + 0xAEC4,0xAEC5,0xD1CD,INVALC,INVALC,INVALC,INVALC,0xB1D3, + INVALC,0xB1CF,INVALC,0xD5A7,0xB1D6,0xB1D5,0xB1CE,0xB1D1, + 0xB1D4,0xB1D0,INVALC,INVALC,0xD976,0xB1CD,0xB4AF,INVALC, + INVALC,INVALC,0xB4B1,0xB4B2,0xD975,0xD978,0xB4B0,0xD973, + 0xD977,INVALC,0xD974,INVALC,0xB771,INVALC,INVALC,0xDDBC, + INVALC,INVALC,0xBA56,0xE1F4,0xBEE3,0xBCC4,0xE5BD,0xBCC5, + 0xBCC6,0xE5BF,0xE5BE,0xE5C0,0xE9B1,INVALC,INVALC,0xE9B0, + 0xECEF,0xECEE,0xC0C4,0xC0C5,0xF248,INVALC,INVALC,0xA4E5, + INVALC,INVALC,INVALC,INVALC,0xD979,INVALC,INVALC,INVALC, + 0xB4B4,0xB4B3,0xDDBD,INVALC,0xEFD8,0xC4E3,0xF7DE,0xA4E6, + INVALC,0xAEC6,INVALC,0xB1D8,0xB1D7,0xD97A,0xD97B,0xB772, + 0xE1F5,0xBA57,0xE9B2,INVALC,0xA4E7,0xA5B8,INVALC,0xA9F2, + 0xCCC2,INVALC,0xCEE9,0xAC48,0xB1D9,INVALC,0xD97C,0xB4B5, + 0xB773,INVALC,0xE5C1,0xE5C2,INVALC,INVALC,0xECF0,0xC25F, + 0xF8F0,0xA4E8,INVALC,0xCCC3,0xA9F3,0xAC49,INVALC,0xCEEA, + INVALC,0xAEC7,0xD1D2,0xD1D0,0xD1D1,0xAEC8,0xD1CF,INVALC, + INVALC,INVALC,INVALC,0xB1DB,0xB1DC,0xD5A8,0xB1DD,0xB1DA, + 0xD97D,INVALC,0xD97E,0xDDBE,INVALC,INVALC,0xBA59,0xBA58, + INVALC,INVALC,0xECF1,0xEFD9,INVALC,0xF24A,0xF249,0xF44F, + INVALC,0xC95E,0xAC4A,INVALC,INVALC,0xA4E9,0xA5B9,INVALC, + 0xA6AE,0xA6AD,INVALC,INVALC,0xA6AF,0xA6B0,0xC9EE,0xC9ED, + 0xCAF8,0xA7F2,0xCAFB,0xCAFA,0xCAF9,0xCAFC,INVALC,INVALC, + INVALC,INVALC,0xA9F4,0xCCC9,0xCCC5,0xCCCE,INVALC,INVALC, + /* Block 103, Array index 0x2700 */ + 0xA9FB,INVALC,0xA9F9,0xCCCA,0xCCC6,0xCCCD,0xA9F8,0xAA40, + 0xCCC8,0xCCC4,0xA9FE,0xCCCB,0xA9F7,0xCCCC,0xA9FA,0xA9FC, + 0xCCD0,0xCCCF,0xCCC7,0xA9F6,0xA9F5,0xA9FD,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xCEEF,0xCEF5,INVALC,0xAC50, + 0xAC4D,0xCEEC,0xCEF1,INVALC,0xAC53,0xAC4B,0xCEF0,0xAC4E, + 0xAC51,INVALC,INVALC,0xCEF3,INVALC,0xAC4C,0xCEF8,0xAC4F, + INVALC,0xAC52,0xCEED,0xCEF2,0xCEF6,0xCEEE,0xCEEB,INVALC, + INVALC,0xCEF7,0xCEF4,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xAED0,0xAEC9,0xAECC,INVALC,0xAECF,INVALC,0xD1D5, + INVALC,0xAECA,0xD1D3,INVALC,0xAECE,INVALC,INVALC,0xAECB, + INVALC,0xD1D6,0xAECD,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xD5AC,0xB1DF,0xD5AB,0xD5AD,0xB1DE,0xB1E3,0xD1D4, + INVALC,0xD5AA,0xD5AE,INVALC,0xB1E0,0xD5A9,0xB1E2,INVALC, + 0xB1E1,INVALC,0xD9A7,INVALC,0xD9A2,INVALC,0xB4B6,0xB4BA, + 0xB4B7,0xD9A5,0xD9A8,INVALC,0xB4B8,INVALC,0xB4B9,0xB4BE, + 0xDDC7,0xD9A6,0xB4BC,0xD9A3,0xD9A1,INVALC,0xB4BD,INVALC, + 0xD9A4,INVALC,INVALC,INVALC,0xB779,INVALC,0xDDBF,0xB776, + 0xB777,0xB775,0xDDC4,0xDDC3,0xDDC0,0xB77B,INVALC,INVALC, + 0xDDC2,0xB4BB,INVALC,INVALC,0xDDC6,0xDDC1,0xB778,0xB774, + 0xB77A,0xDDC5,INVALC,INVALC,INVALC,0xBA5C,INVALC,0xE1F8, + 0xE1F7,0xE1F6,0xBA5A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xBA5B,0xE5C5,0xE5C8,0xBCC8,INVALC,INVALC,0xBCC7,0xE5C9, + 0xE5C4,0xBCCA,0xE5C6,INVALC,0xBCC9,0xE5C3,INVALC,0xE5C7, + 0xBEE9,0xBEE6,0xE9BB,0xE9BA,INVALC,0xE9B9,0xE9B4,INVALC, + 0xE9B5,INVALC,INVALC,INVALC,0xBEE7,INVALC,0xBEE4,0xBEE8, + 0xE9B3,0xBEE5,0xE9B6,0xE9B7,0xE9BC,INVALC,INVALC,0xE9B8, + INVALC,INVALC,0xECF2,INVALC,INVALC,INVALC,0xC0C7,INVALC, + 0xEFDC,0xC0C6,0xEFDA,0xEFDB,0xC260,0xC36E,0xF24B,INVALC, + 0xC36D,INVALC,INVALC,0xF451,0xF452,INVALC,0xC466,INVALC, + 0xF450,0xC4E4,INVALC,0xF7DF,0xC5CE,0xF8AA,0xF8AB,INVALC, + 0xA4EA,INVALC,0xA6B1,0xA6B2,0xA7F3,INVALC,0xCCD1,0xAC54, + 0xAED1,0xB1E4,INVALC,INVALC,0xB0D2,INVALC,0xB4BF,0xB4C0, + /* Block 104, Array index 0x2800 */ + 0xB3CC,0xD9A9,INVALC,0xB77C,0xE1FA,0xE1F9,INVALC,INVALC, + 0xA4EB,0xA6B3,0xCCD2,0xAA42,INVALC,0xAA41,INVALC,0xCEF9, + 0xCEFA,INVALC,0xD1D7,0xD1D8,0xAED2,0xAED3,INVALC,0xAED4, + 0xD5AF,INVALC,INVALC,0xB1E6,INVALC,0xB4C2,INVALC,0xB4C1, + 0xDDC8,0xDF7A,0xE1FB,0xE9BD,INVALC,INVALC,0xC261,0xC467, + 0xA4EC,INVALC,0xA5BC,0xA5BD,0xA5BB,0xA5BE,0xA5BA,INVALC, + INVALC,0xA6B6,INVALC,0xC9F6,0xA6B5,0xA6B7,INVALC,INVALC, + 0xC9F1,0xC9F0,0xC9F3,0xC9F2,0xC9F5,0xA6B4,0xC9EF,0xC9F4, + INVALC,INVALC,INVALC,INVALC,INVALC,0xCAFD,0xA7FD,0xCAFE, + 0xCB43,0xA7FC,INVALC,0xCB47,0xCB42,0xCB45,0xA7F5,0xA7F6, + 0xA7F7,0xA7F8,INVALC,0xA840,INVALC,0xCB41,0xA7FA,0xA841, + INVALC,0xCB40,0xCB46,INVALC,0xA7F9,0xCB44,0xA7FB,0xA7F4, + 0xA7FE,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xAA57,INVALC,0xCCD4,0xAA43,INVALC,0xAA4D, + 0xAA4E,0xAA46,0xAA58,0xAA48,0xCCDC,0xAA53,0xCCD7,0xAA49, + 0xCCE6,0xCCE7,0xCCDF,0xCCD8,0xAA56,0xCCE4,0xAA51,0xAA4F, + INVALC,0xCCE5,INVALC,0xCCE3,0xCCDB,0xCCD3,0xCCDA,0xAA4A, + INVALC,0xAA50,INVALC,0xAA44,0xCCDE,0xCCDD,0xCCD5,INVALC, + 0xAA52,0xCCE1,0xCCD6,0xAA55,0xCCE8,0xAA45,INVALC,0xAA4C, + 0xCCD9,0xCCE2,0xAA54,INVALC,0xAA47,0xAA4B,INVALC,0xCCE0, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCF5B,0xAC5C, + 0xAC69,INVALC,0xCF56,0xCF4C,0xAC62,0xCF4A,0xAC5B,0xCF45, + 0xAC65,0xCF52,0xCEFE,0xCF41,INVALC,INVALC,INVALC,INVALC, + 0xCF44,0xCEFB,0xCF51,0xCF61,0xAC60,0xCF46,0xCF58,INVALC, + 0xCEFD,0xCF5F,0xCF60,0xCF63,0xCF5A,0xCF4B,0xCF53,0xAC66, + 0xAC59,0xAC61,0xAC6D,0xAC56,0xAC58,INVALC,INVALC,INVALC, + 0xCF43,0xAC6A,0xAC63,0xCF5D,0xCF40,0xAC6C,0xAC67,0xCF49, + INVALC,INVALC,0xAC6B,0xCF50,0xCF48,0xAC64,0xCF5C,0xCF54, + INVALC,0xAC5E,0xCF62,0xCF47,0xAC5A,0xCF59,0xCF4F,0xAC5F, + 0xCF55,0xAC57,0xCEFC,0xAC68,0xAEE3,0xAC5D,0xCF4E,0xCF4D, + 0xCF42,INVALC,0xCF5E,INVALC,0xCF57,INVALC,INVALC,0xAC55, + /* Block 105, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xD1EC,0xAEEA,0xD1ED,INVALC,0xD1E1,0xAEDF, + 0xAEEB,INVALC,0xD1DA,INVALC,0xD1E3,0xD1EB,INVALC,0xD1D9, + 0xD1F4,0xAED5,INVALC,INVALC,INVALC,0xD1F3,0xD1EE,INVALC, + 0xD1EF,0xAEDD,0xAEE8,0xD1E5,INVALC,0xD1E6,0xD1F0,0xD1E7, + INVALC,0xD1E2,0xD1DC,0xD1DD,0xD1EA,0xD1E4,INVALC,INVALC, + 0xAED6,0xAEDA,0xD1F2,0xD1DE,0xAEE6,0xAEE2,INVALC,INVALC, + 0xAEE5,0xAEEC,0xAEDB,0xAEE7,0xD1E9,0xAEE9,0xAED8,INVALC, + 0xAED7,0xD1DB,INVALC,0xD1DF,0xAEE0,0xD1F1,0xD1E8,0xD1E0, + 0xAEE4,0xAEE1,INVALC,0xAED9,0xAEDC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xD5C4,INVALC,0xD5B4,0xD5B5,0xD5B9, + INVALC,0xD5C8,0xD5C5,INVALC,0xD5BE,0xD5BD,0xB1ED,0xD5C1, + 0xD5D0,0xD5B0,INVALC,0xD5D1,0xD5C3,0xD5D5,0xD5C9,0xB1EC, + 0xD5C7,0xB1E7,0xB1FC,0xB1F2,INVALC,0xB1F6,0xB1F5,0xD5B1, + INVALC,0xD5CE,0xD5D4,0xD5CC,0xD5D3,INVALC,INVALC,0xD5C0, + 0xD5B2,0xD5D2,0xD5C2,0xB1EA,0xB1F7,INVALC,0xD5CB,0xB1F0, + INVALC,INVALC,INVALC,0xD5CA,0xD5B3,0xB1F8,INVALC,0xB1FA, + 0xD5CD,0xB1FB,0xB1E9,0xD5BA,0xD5CF,INVALC,INVALC,0xB1EF, + 0xB1F9,0xD5BC,0xD5C6,0xD5B7,0xD5BB,0xB1F4,0xD5B6,0xB1E8, + 0xB1F1,0xB1EE,0xD5BF,0xAEDE,0xD9C0,0xB1EB,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xB1F3,INVALC,0xD9C3,0xD9D9, + 0xD9CE,0xB4D6,INVALC,0xB4D1,0xD9BD,0xB4D2,0xD9CD,INVALC, + 0xD9C6,0xD9D3,0xB4CE,0xD9AB,0xD9D5,0xB4C4,0xD9B3,0xB4C7, + 0xB4C6,INVALC,0xB4D7,INVALC,0xD9AD,0xD9CF,0xD9D0,0xB4C9, + 0xB4C5,0xD9BB,INVALC,0xB4D0,0xD9B6,INVALC,0xD9D1,0xB4CC, + 0xD9C9,0xD9D6,0xD9B0,0xD9B5,0xD9AF,INVALC,0xB4CB,0xD9C2, + 0xDDDE,0xD9B1,0xB4CF,0xD9BA,0xD9D2,0xB4CA,0xD9B7,0xD9B4, + 0xD9C5,0xB4CD,0xB4C3,0xB4D9,0xD9C8,0xD9C7,INVALC,INVALC, + /* Block 106, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,0xD9AC,0xB4C8,0xD9D4,0xD9BC, + 0xD9BE,INVALC,0xD9CB,0xD9CA,0xD9AA,0xB4D3,0xB4D5,0xD9B2, + 0xD9B9,0xD9C1,0xB4D4,0xD9B8,0xD9C4,0xD9D7,INVALC,0xD9CC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD9D8,INVALC,INVALC, + INVALC,INVALC,0xD9AE,INVALC,INVALC,INVALC,INVALC,0xDDF2, + 0xB7A6,INVALC,0xDDF0,0xDDDB,0xDDE0,0xDDD9,INVALC,0xDDEC, + 0xDDCB,0xDDD2,INVALC,0xDDEA,0xDDF4,0xDDDC,INVALC,0xDDCF, + 0xDDE2,0xDDE7,0xDDD3,INVALC,0xDDE4,0xDDD0,INVALC,INVALC, + 0xDDD7,0xDDD8,0xB7A8,0xDDEB,0xDDE9,INVALC,0xDDCC,0xDDEE, + INVALC,0xDDEF,0xDDF1,0xB7AC,0xB7A4,INVALC,0xD5B8,0xDDD4, + 0xDDE6,0xDDD5,0xB7A1,0xB7B1,0xDDED,0xB7AF,0xB7AB,0xDDCA, + 0xB7A3,INVALC,0xDDCD,0xB7B0,INVALC,0xDDDD,0xDDC9,INVALC, + 0xB7A9,0xDDE1,0xDDD1,0xB7AA,0xDDDA,0xB77E,0xB4D8,0xDDE3, + 0xD9BF,0xDDCE,INVALC,INVALC,0xDDE8,0xB7A5,0xDDE5,0xB7A2, + 0xDDDF,0xB7AD,0xDDD6,0xDDF3,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xB7A7,0xDEC6,INVALC,INVALC,0xB7AE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xE24A,0xE248,INVALC, + 0xE25E,0xE246,INVALC,0xE258,0xB77D,0xBA5F,0xE242,0xE25D, + INVALC,0xE247,0xE255,0xBA64,0xBA5D,INVALC,0xE25B,INVALC, + 0xE240,0xE25A,INVALC,0xBA6F,0xE251,0xE261,0xBA6D,0xE249, + 0xBA5E,0xE24B,0xE259,0xBA67,0xE244,0xBA6B,0xBA61,0xE24D, + 0xE243,0xE1FC,INVALC,0xE257,0xBA68,0xE260,0xE1FD,0xBA65, + INVALC,0xE253,INVALC,0xBA66,0xE245,0xE250,0xE24C,0xE24E, + INVALC,0xBA60,0xE25F,0xBA6E,0xE24F,INVALC,0xE262,INVALC, + INVALC,0xE1FE,0xE254,0xBA63,0xBA6C,0xBA6A,0xE241,0xE256, + 0xBA69,INVALC,INVALC,0xBA62,0xE252,INVALC,INVALC,INVALC, + INVALC,0xE25C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xE5D5,INVALC,0xE5D1,0xE5CD,0xE5E1,0xE5DE, + 0xBCCD,INVALC,INVALC,0xE5E5,0xE5D4,0xBCD8,0xE5DB,INVALC, + INVALC,0xE5D0,0xE5DA,0xBCD5,0xE5EE,INVALC,0xE5EB,0xE5DD, + 0xE5CE,INVALC,INVALC,0xE5E2,0xE5E4,0xBCD1,0xE5D8,0xE5D3, + /* Block 107, Array index 0x2B00 */ + 0xE5CA,0xBCCE,0xBCD6,INVALC,0xE5E7,0xBCD7,0xE5CB,0xE5ED, + 0xE5E0,0xE5E6,0xBCD4,INVALC,INVALC,0xE5E3,INVALC,0xE5EA, + INVALC,0xBCD9,INVALC,0xBCD3,0xE5DC,0xE5CF,0xE5EF,0xE5CC, + 0xE5E8,0xBCD0,INVALC,0xE5D6,INVALC,0xE5D7,0xBCCF,0xBCCC, + 0xE5D2,0xBCD2,INVALC,0xBCCB,INVALC,0xE5E9,0xE5EC,0xE5D9, + 0xE9CA,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xE9C2,INVALC,0xE9BE,0xBEF6,INVALC,INVALC, + 0xBEEB,0xBEF0,0xBEEC,0xE9CC,0xE9D7,0xBEEA,0xE9C4,0xE9CD, + 0xE5DF,0xE9CE,INVALC,INVALC,0xBEF1,INVALC,0xE9DD,0xBEF5, + 0xBEF8,0xE9C0,INVALC,0xBEF4,INVALC,0xE9DB,0xE9DC,0xE9D2, + 0xE9D1,0xE9C9,INVALC,INVALC,0xE9D3,0xE9DA,0xE9D9,INVALC, + 0xBEEF,0xBEED,0xE9CB,0xE9C8,INVALC,0xE9C5,0xE9D8,0xBEF7, + 0xE9D6,0xBEF3,0xBEF2,INVALC,0xE9D0,INVALC,0xE9BF,0xE9C1, + 0xE9C3,0xE9D5,0xE9CF,0xBEEE,INVALC,0xE9C6,INVALC,0xE9D4, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xE9C7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xC0CF,0xED45, + 0xC0C8,0xECF5,INVALC,0xED41,0xC0CA,0xED48,INVALC,0xECFC, + INVALC,0xECF7,INVALC,INVALC,0xED49,0xECF3,0xECFE,INVALC, + 0xC0D1,0xED44,0xED4A,0xECFD,0xC0C9,0xED40,0xECF4,0xC0D0, + INVALC,INVALC,0xED47,0xECF9,0xC0CC,INVALC,0xECFB,0xECF8, + 0xC0D2,0xECFA,0xC0CB,0xC0CE,0xED43,0xECF6,0xED46,INVALC, + 0xED42,INVALC,INVALC,INVALC,0xC263,0xEFE7,0xC268,0xC269, + INVALC,INVALC,INVALC,0xC262,0xEFE6,INVALC,0xEFE3,0xEFE4, + 0xC266,0xEFDE,0xEFE2,0xC265,INVALC,0xEFDF,INVALC,INVALC, + INVALC,INVALC,0xC267,0xC264,INVALC,0xEFDD,0xEFE1,0xEFE5, + INVALC,INVALC,INVALC,0xF251,0xF24E,0xF257,INVALC,0xF256, + 0xF254,0xF24F,INVALC,0xC372,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF250,0xC371,0xC0CD,0xF253,0xC370,0xF258,0xF252, + 0xF24D,0xEFE0,INVALC,INVALC,INVALC,0xC36F,INVALC,0xF24C, + 0xF456,INVALC,0xF455,0xF255,0xC468,INVALC,0xF459,0xF45A, + 0xF454,0xF458,INVALC,0xF453,INVALC,INVALC,INVALC,INVALC, + 0xF5D1,0xF457,0xC4E7,0xC4E5,0xF5CF,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x2C00 */ + 0xF5D2,INVALC,0xF5CE,0xF5D0,0xC4E6,INVALC,INVALC,INVALC, + 0xF6E5,0xF6E6,0xC576,0xF6E4,INVALC,INVALC,INVALC,0xF7E2, + 0xC5CF,0xF7E0,0xF7E1,0xF8AC,INVALC,INVALC,0xC656,0xF8F3, + 0xF8F1,0xF8F2,0xF8F4,INVALC,INVALC,INVALC,0xF9BB,INVALC, + 0xA4ED,0xA6B8,INVALC,0xAA59,INVALC,0xCCE9,INVALC,INVALC, + 0xCF64,INVALC,INVALC,INVALC,0xD1F5,0xD1F7,INVALC,0xD1F6, + INVALC,0xD1F8,0xB1FD,0xD5D7,0xD1F9,INVALC,0xD5D6,0xD5D8, + 0xD5D9,0xD9DA,0xB4DB,0xD9DB,0xD9DD,0xB4DC,0xB4DA,0xD9DC, + INVALC,0xDDFA,0xDDF8,0xDDF7,INVALC,0xDDF6,0xDDF5,0xB7B2, + 0xDDF9,0xBA70,0xE263,0xE265,0xBA71,0xE264,0xBCDB,INVALC, + 0xBCDA,0xE5F0,INVALC,INVALC,0xE9DF,0xE9DE,0xE9E0,INVALC, + INVALC,0xBEF9,INVALC,0xED4B,0xC0D3,INVALC,0xEFE8,0xC26A, + 0xF259,0xC577,0xA4EE,0xA5BF,0xA6B9,0xA842,0xAA5A,0xAA5B, + INVALC,INVALC,0xAC6E,INVALC,INVALC,0xD1FA,INVALC,INVALC, + INVALC,INVALC,0xB7B3,INVALC,INVALC,INVALC,0xE6D1,0xBEFA, + 0xC26B,0xA4EF,INVALC,0xA6BA,INVALC,INVALC,0xCCEB,0xAA5C, + 0xCCEA,INVALC,0xCF65,0xAC6F,0xCF66,INVALC,0xAC70,INVALC, + 0xD1FC,0xAEEE,0xAEED,INVALC,0xD5DE,0xD5DC,0xD5DD,0xD5DB, + INVALC,0xD5DA,INVALC,INVALC,0xD9DE,0xD9E1,0xB4DE,0xD9DF, + 0xB4DD,0xD9E0,INVALC,0xDDFB,INVALC,INVALC,0xE266,0xE267, + 0xE268,INVALC,0xE5F3,0xE5F2,0xBCDC,0xE5F1,0xE5F4,0xE9E1, + INVALC,INVALC,0xE9E2,0xE9E3,INVALC,0xED4C,0xC0D4,0xC26C, + 0xF25A,INVALC,0xC4E8,0xC95F,INVALC,0xAC71,0xCF67,0xAEEF, + INVALC,INVALC,0xB1FE,INVALC,0xB4DF,0xD9E2,INVALC,0xB7B5, + 0xB7B4,INVALC,INVALC,0xE269,0xE26A,0xBCDD,0xBCDE,0xE9E5, + 0xE9E4,0xEFE9,0xF7E3,0xA4F0,0xC960,0xA5C0,INVALC,0xA843, + 0xCB48,INVALC,0xAC72,0xB7B6,0xA4F1,INVALC,0xCF68,0xAC73, + 0xCF69,INVALC,0xC0D5,0xA4F2,INVALC,INVALC,0xCCEC,INVALC, + 0xCF6A,INVALC,0xD242,0xD241,0xD1FE,INVALC,0xD1FD,0xD243, + 0xD240,INVALC,INVALC,0xB240,0xB241,INVALC,INVALC,0xB4E0, + 0xD9E3,INVALC,0xD9E4,0xD9E5,INVALC,INVALC,INVALC,0xDE41, + 0xDE42,0xDE40,INVALC,0xDDFD,0xDDFE,0xB7B7,0xE26B,0xE5F7, + /* Block 109, Array index 0x2D00 */ + 0xE5F6,0xE5F5,0xE5F8,0xE9E7,0xE9E6,0xBEFB,0xE9E8,INVALC, + 0xC0D6,0xED4D,INVALC,0xEFEA,0xF25B,0xF6E7,INVALC,0xA4F3, + 0xA5C2,0xA5C1,INVALC,0xAA5D,0xC961,0xC97E,0xA6BB,INVALC, + 0xC9F7,0xCB49,0xCB4A,0xAA5E,INVALC,0xCCED,INVALC,0xAC74, + 0xCF6B,0xCF6C,INVALC,0xAEF0,0xAEF4,0xD244,0xAEF3,0xAEF1, + 0xAEF2,INVALC,0xD5DF,0xB242,0xB4E3,INVALC,0xB4E1,0xB4E2, + 0xD9E6,INVALC,INVALC,0xBA72,0xA4F4,INVALC,0xC9A1,INVALC, + 0xA5C3,INVALC,INVALC,0xC9A4,INVALC,INVALC,0xA5C6,0xC9A3, + 0xA5C5,0xA5C4,0xA844,0xC9A2,INVALC,INVALC,0xC9F8,INVALC, + INVALC,INVALC,0xC9FC,0xC9FE,0xCA40,0xA6C5,0xA6C6,0xC9FB, + 0xA6C1,INVALC,0xC9F9,INVALC,0xC9FD,0xA6C2,INVALC,0xA6BD, + INVALC,0xA6BE,INVALC,0xA6C4,0xC9FA,0xA6BC,0xA845,0xA6BF, + 0xA6C0,0xA6C3,INVALC,INVALC,INVALC,0xCB5B,0xCB59,0xCB4C, + 0xA851,0xCB53,0xA84C,0xCB4D,INVALC,0xCB55,INVALC,0xCB52, + 0xA84F,0xCB51,0xA856,0xCB5A,0xA858,INVALC,0xA85A,INVALC, + 0xCB4B,INVALC,0xA84D,0xCB5C,INVALC,0xA854,0xA857,INVALC, + 0xCD45,0xA847,0xA85E,0xA855,0xCB4E,0xA84A,0xA859,0xCB56, + 0xA848,0xA849,0xCD43,0xCB4F,0xA850,0xA85B,0xCB5D,0xCB50, + 0xA84E,INVALC,0xA853,0xCCEE,0xA85C,0xCB57,0xA852,INVALC, + 0xA85D,0xA846,0xCB54,0xA84B,0xCB58,0xCD44,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xAA6A,0xAA7A,0xCCF5,0xAA71,INVALC, + 0xCD4B,0xAA62,INVALC,0xAA65,0xCD42,INVALC,0xCCF3,0xCCF7, + 0xAA6D,0xAA6F,0xCCFA,0xAA76,0xAA68,0xAA66,0xAA67,0xAA75, + 0xCD47,0xAA70,0xCCF9,0xCCFB,0xAA6E,0xAA73,0xCCFC,0xCD4A, + INVALC,0xAC75,0xAA79,INVALC,0xAA63,0xCD49,INVALC,0xCD4D, + 0xCCF8,0xCD4F,0xCD40,0xAA6C,0xCCF4,0xAA6B,0xAA7D,0xAA72, + INVALC,0xCCF2,0xCF75,0xAA78,0xAA7C,0xCD41,0xCD46,INVALC, + 0xAA7E,0xAA77,0xAA69,0xAA5F,INVALC,0xAA64,INVALC,0xCCF6, + 0xAA60,0xCD4E,INVALC,0xCCF0,0xCCEF,0xCCFD,0xCCF1,0xAA7B, + 0xAEF5,0xAA74,0xCCFE,0xAA61,INVALC,0xACA6,INVALC,INVALC, + INVALC,0xCD4C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x2E00 */ + 0xCF7C,0xCFA1,INVALC,0xCFA4,0xCF77,INVALC,INVALC,0xCFA7, + 0xCFAA,0xCFAC,0xCF74,0xAC76,0xAC7B,0xD249,0xACAD,0xCFA5, + 0xCFAD,0xCF7B,0xCF73,INVALC,INVALC,INVALC,0xD264,0xAC7E, + 0xCFA2,0xCF78,0xCF7A,0xACA5,INVALC,0xCF7D,0xAC7D,0xCF70, + 0xCFA8,INVALC,0xCFAB,INVALC,INVALC,0xAC7A,INVALC,0xACA8, + 0xCF6D,0xACAA,0xAC78,0xACAE,0xCFA9,0xCF6F,0xACAB,0xD25E, + 0xCD48,0xAC7C,0xAC77,0xCF76,0xCF6E,0xACAC,0xACA4,0xCFA3, + 0xACA9,0xACA7,0xCF79,0xACA1,0xCF71,0xACA2,0xACA3,0xCF72, + 0xCFA6,0xAC79,0xCF7E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD24C,0xAEFD,0xAF43,INVALC,INVALC,INVALC,0xD255,0xD25B, + 0xD257,0xD24A,0xD24D,0xD246,0xD247,0xAF4A,0xAEFA,0xD256, + 0xD25F,0xAF45,0xAEF6,INVALC,0xAF40,0xD24E,0xAF42,0xD24F, + 0xD259,INVALC,INVALC,INVALC,0xAF44,0xD268,0xD248,0xAEFC, + 0xAEFB,0xAF48,0xD245,0xD266,0xD25A,0xD267,0xD261,0xD253, + 0xD262,INVALC,0xD25C,0xD265,0xD263,0xAF49,0xD254,0xAEF9, + 0xAEF8,0xAF41,0xAF47,0xD260,0xAF46,0xD251,0xB243,INVALC, + 0xD269,0xD250,0xD24B,0xAEFE,0xAF4B,0xAEF7,INVALC,0xD258, + 0xD25D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xB265,0xD5E1,0xD5E5,INVALC,0xB252,0xB250, + INVALC,INVALC,0xB247,0xD5E3,0xD5E2,0xB25B,INVALC,0xD5E8, + 0xB255,INVALC,0xD5FA,0xD647,0xB244,0xD5F7,0xD5F0,0xB267, + 0xD5E0,INVALC,0xD5FC,INVALC,0xB264,0xB258,0xB263,0xB24E, + 0xD5EC,0xD5FE,0xD5F6,0xB24F,0xB249,0xD645,INVALC,0xD5FD, + 0xD640,0xB251,0xB259,0xD642,0xD5EA,0xD5FB,0xD5EF,0xD644, + 0xB25E,0xB246,0xB25C,0xD5F4,0xD5F2,0xD5F3,0xB253,0xD5EE, + 0xD5ED,0xB248,0xD5E7,0xD646,0xB24A,0xD5F1,0xB268,INVALC, + 0xB262,0xD5E6,0xB25F,0xB25D,0xB266,0xD5F8,0xB261,0xD252, + 0xD5F9,0xB260,0xD641,0xB245,0xD5F5,0xB257,0xD5E9,0xB256, + INVALC,0xB254,0xB24C,0xB24B,0xD9E7,0xD643,INVALC,INVALC, + /* Block 111, Array index 0x2F00 */ + 0xD5EB,INVALC,INVALC,0xD9FC,INVALC,0xB24D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB541,0xB25A,0xB4EE,0xD9F6,0xB4FC,INVALC,0xD9EA, + 0xB4EB,0xB4E7,0xDA49,0xB4ED,0xB4F1,0xB4EC,0xB4F5,0xDA4D, + 0xDA44,INVALC,INVALC,0xD9F1,0xB4FA,0xB4F4,0xD9FD,0xB4E4, + 0xDA4A,0xDA43,0xB4E8,0xD9F7,0xB4F7,0xDA55,0xDA56,INVALC, + 0xB4E5,0xDA48,0xB4F9,0xD9FB,0xD9ED,0xD9EE,0xB4FD,0xD9F2, + 0xD9F9,0xD9F3,INVALC,0xB4FB,0xB544,0xD9EF,0xD9E8,0xD9E9, + INVALC,0xD9EB,0xB4EA,0xD9F8,INVALC,0xB4F8,0xB542,INVALC, + INVALC,0xD9FA,0xDA53,0xDA4B,0xB4E6,0xDA51,0xB4F2,INVALC, + 0xB4F0,INVALC,0xDA57,0xB4EF,0xDA41,0xD9F4,0xD9FE,0xB547, + 0xDA45,0xDA42,0xD9F0,0xB543,0xDA4F,0xDA4C,0xDA54,0xB4E9, + 0xDA40,0xB546,INVALC,0xDA47,INVALC,INVALC,0xB4F3,0xB4F6, + INVALC,0xDA46,0xB545,0xD9F5,0xD5E4,INVALC,INVALC,0xDA50, + 0xDA4E,0xDA52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD9EC,0xB540,INVALC,INVALC,INVALC,0xDE61,0xDE60,0xDE46, + 0xB7BD,INVALC,0xDE5F,0xDE49,0xDE4A,INVALC,0xB7C7,0xDE68, + 0xB7C2,0xDE5E,INVALC,0xDE43,0xB7C8,0xB7BE,0xDE52,0xDE48, + 0xDE4B,0xDE63,0xB7B8,0xDE6A,0xDE62,0xB7C1,0xDE57,0xB7CC, + INVALC,INVALC,0xB7CB,0xB7C5,INVALC,INVALC,0xDE69,0xB7B9, + 0xDE55,0xDE4C,0xDE59,0xDE65,0xB7CD,INVALC,0xB7BB,0xDE54, + INVALC,0xDE4D,0xB7C4,INVALC,0xB7C3,0xDE50,0xDE5A,0xDE64, + 0xDE47,0xDE51,0xB7BC,0xDE5B,0xB7C9,0xB7C0,0xDE4E,0xB7BF, + 0xDE45,0xDE53,0xDE67,0xB4FE,0xBAB0,0xDE56,0xE26C,0xDE58, + 0xDE66,0xB7C6,0xDE4F,0xB7BA,0xB7CA,0xBCF0,0xDE44,INVALC, + 0xDE5D,INVALC,INVALC,INVALC,0xDE5C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xE2AA,0xBAAD,0xE27D,0xE2A4,0xBAA2, + INVALC,0xE26E,0xBAAF,INVALC,0xBA77,0xE26D,0xE2B0,0xBAB1, + 0xE271,0xE2A3,INVALC,0xE273,0xE2B3,0xE2AF,0xBA75,0xBAA1, + /* Block 112, Array index 0x3000 */ + 0xE653,0xBAAE,0xBA7D,0xE26F,INVALC,0xE2AE,0xBAA3,0xE2AB, + 0xE2B8,0xE275,0xE27E,INVALC,INVALC,0xE2B6,0xE2AC,0xBA7C, + INVALC,INVALC,0xE27C,0xBA76,0xBA74,0xBAA8,INVALC,INVALC, + 0xE27A,0xE277,0xE278,INVALC,0xE2B2,INVALC,0xE2B7,0xE2B5, + 0xBA7A,0xE2B9,0xBA7E,0xBAA7,INVALC,0xE270,0xE5FA,0xE279, + INVALC,0xBA78,0xBAAC,0xBAA9,0xBA7B,0xE2A5,0xE274,0xBAAA, + 0xE2A7,0xBAA4,0xBAA6,0xBA73,INVALC,0xE2A9,0xE2A1,0xE272, + 0xBAA5,0xE2B1,0xE2B4,0xE27B,0xE2A8,INVALC,0xBA79,0xBCDF, + 0xE2A6,0xE5F9,INVALC,0xE2AD,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xE276,0xE644, + 0xE64E,0xBCE2,0xE64D,0xE659,0xBCE4,0xE64B,INVALC,0xE64F, + 0xBCEF,INVALC,0xE646,0xBCE7,INVALC,0xE652,0xE9F0,0xBCF3, + 0xBCF2,0xE654,0xE643,0xE65E,0xBCED,INVALC,0xBCE3,0xE657, + INVALC,0xE65B,0xE660,0xE655,0xE649,0xBCE6,0xBCE9,0xBCF1, + 0xBCEC,INVALC,0xE64C,0xE2A2,INVALC,INVALC,0xE648,0xE65F, + 0xBCE8,INVALC,0xBCEB,0xE661,0xBCE0,0xE656,0xE5FB,0xE65C, + 0xC0DF,INVALC,0xE64A,INVALC,0xBCE1,0xE645,0xBCE5,0xE5FC, + 0xBAAB,0xE641,INVALC,0xE65A,0xE642,0xE640,0xBCEA,INVALC, + 0xE658,INVALC,0xE5FE,0xE651,0xE650,0xE65D,0xE647,0xBCEE, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xE9F3,INVALC, + 0xBF49,0xBEFE,0xEA40,0xE9EB,0xBF41,0xE9F7,0xBF48,0xBF43, + 0xE9F5,0xED4F,0xE9FB,0xEA42,0xE9FA,0xE9E9,0xE9F8,0xEA44, + 0xEA46,0xBEFD,0xEA45,0xBF44,0xBF4A,INVALC,0xBF47,INVALC, + 0xE9FE,0xBF46,0xE9F9,INVALC,0xE9ED,0xE9F2,INVALC,0xE9FD, + 0xBF45,0xBF42,0xBEFC,0xBF40,0xE9F1,INVALC,0xE5FD,0xE9EC, + 0xE9EF,0xEA41,0xE9F4,0xE9EA,0xED4E,0xEA43,0xE9EE,0xE9FC, + INVALC,INVALC,INVALC,INVALC,0xED51,0xC0E3,INVALC,INVALC, + 0xC0D7,INVALC,INVALC,0xC0DB,0xED53,0xED59,0xED57,0xC0D9, + 0xC0DA,0xC0E1,0xED5A,0xED52,0xC0DC,INVALC,0xED56,0xED55, + 0xED5B,0xC0E2,INVALC,0xC0DD,0xC0E0,0xED54,0xC0E4,0xC0DE, + 0xC0E5,0xC0D8,0xED58,INVALC,0xED50,INVALC,INVALC,0xEFF7, + INVALC,INVALC,0xC271,0xEFF4,0xEFF6,INVALC,0xC26F,0xEFF2, + /* Block 113, Array index 0x3100 */ + 0xEFF3,0xEFEE,INVALC,INVALC,0xE9F6,0xEFEF,0xC270,0xEFEB, + INVALC,0xC26D,0xEFF8,0xC26E,0xEFEC,0xEFED,0xEFF1,0xC273, + INVALC,0xC272,INVALC,INVALC,0xEFF0,0xC378,0xF25F,0xF265, + 0xC379,0xF25C,0xC376,0xC373,0xF267,0xC377,INVALC,0xC374, + 0xF25E,0xF261,0xF262,0xF263,0xF266,INVALC,0xEFF5,0xF25D, + 0xC375,0xF264,0xF268,0xF260,INVALC,INVALC,INVALC,0xF45D, + 0xC46A,0xF460,0xC46B,0xF468,0xF45F,0xF45C,INVALC,0xF45E, + 0xF462,0xF465,0xF464,0xF467,0xF45B,INVALC,0xC469,0xF463, + 0xF466,0xF469,0xF461,0xF5D3,0xF5D4,0xF5D8,0xF5D9,INVALC, + 0xF5D6,0xF5D7,0xF5D5,INVALC,0xC4E9,INVALC,INVALC,INVALC, + INVALC,0xC578,0xF6EB,INVALC,INVALC,0xF6E8,0xF6E9,0xF6EA, + 0xC579,INVALC,0xF7E5,0xF7E4,INVALC,0xF8AF,0xC5F4,0xF8AD, + 0xF8B0,0xF8AE,0xF8F5,0xC657,0xC665,0xF9A3,0xF96C,INVALC, + 0xF9A2,0xF9D0,0xF9D1,0xA4F5,INVALC,INVALC,INVALC,INVALC, + 0xA6C7,0xCA41,INVALC,INVALC,0xCB5E,INVALC,0xA85F,INVALC, + 0xA862,INVALC,0xCB5F,INVALC,0xA860,0xA861,INVALC,INVALC, + INVALC,INVALC,0xCD58,0xCD5A,0xCD55,0xCD52,0xCD54,INVALC, + INVALC,INVALC,0xAAA4,INVALC,INVALC,INVALC,0xAAA2,INVALC, + INVALC,0xCD56,0xAAA3,0xCD53,0xCD50,0xAAA1,0xCD57,INVALC, + 0xCD51,0xAAA5,0xCD59,INVALC,INVALC,INVALC,INVALC,0xCFAF, + INVALC,0xCFB3,INVALC,INVALC,0xACB7,INVALC,INVALC,INVALC, + INVALC,0xCFB6,INVALC,0xACAF,0xACB2,0xACB4,0xACB6,0xACB3, + 0xCFB2,0xCFB1,INVALC,0xACB1,0xCFB4,0xCFB5,INVALC,0xCFAE, + 0xACB5,INVALC,0xACB0,INVALC,INVALC,INVALC,0xCFB0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD277,0xD278,0xD279, + 0xAF50,INVALC,0xAF4C,0xD26E,INVALC,0xD276,0xD27B,0xAF51, + INVALC,0xD26C,0xD272,0xD26B,0xD275,INVALC,INVALC,0xD271, + 0xAF4D,0xAF4F,0xD27A,INVALC,0xD26A,0xD26D,0xD273,INVALC, + 0xD274,0xD27C,0xD270,INVALC,0xAF4E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xB26D, + 0xD64E,INVALC,INVALC,0xD650,0xD64C,INVALC,0xD658,0xD64A, + 0xD657,0xB269,0xD648,0xDA5B,0xD652,0xB26C,INVALC,0xD653, + /* Block 114, Array index 0x3200 */ + 0xD656,INVALC,0xD65A,INVALC,0xD64F,INVALC,0xD654,INVALC, + INVALC,0xB26A,0xB26B,0xD659,0xD64D,0xD649,0xD65B,INVALC, + 0xD651,INVALC,INVALC,0xD655,INVALC,INVALC,INVALC,0xD64B, + INVALC,0xB548,0xB549,0xDA65,0xB54F,INVALC,0xDA59,0xDA62, + 0xDA58,0xB54C,0xDA60,0xDA5E,INVALC,0xDA5F,0xB54A,INVALC, + 0xDA63,INVALC,INVALC,INVALC,INVALC,INVALC,0xDA5C,0xDA5A, + 0xB54B,0xDA5D,0xDA61,INVALC,INVALC,INVALC,0xB54D,INVALC, + INVALC,INVALC,0xDA64,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xDE70,0xDE77,0xDE79,0xDEA1,INVALC,0xB7DA,0xDE6B, + INVALC,0xB7D2,INVALC,0xDE7A,0xB7D7,0xDEA2,0xB7CE,INVALC, + 0xDE7D,INVALC,0xDE6D,0xDE7E,0xDE6C,INVALC,0xB7DC,INVALC, + 0xDE78,0xB7CF,0xDEA3,INVALC,0xB7D4,0xDE71,0xB7D9,0xDE7C, + 0xDE6F,0xDE76,0xDE72,0xDE6E,0xB7D1,0xB7D8,0xB7D6,0xB7D3, + 0xB7DB,0xB7D0,0xDE75,INVALC,0xB7D5,INVALC,0xB54E,INVALC, + 0xDE7B,INVALC,0xDE73,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xDE74,INVALC,INVALC,0xE2C1,INVALC,0xBAB4,INVALC,INVALC, + 0xE2BD,0xE2C3,0xE2BF,INVALC,0xBAB6,0xE2BE,0xE2C2,0xE2BA, + INVALC,0xE2BC,0xBAB5,INVALC,INVALC,INVALC,INVALC,0xE2C0, + 0xE2BB,INVALC,0xBAB7,INVALC,0xBAB2,INVALC,INVALC,0xE2C4, + INVALC,0xBAB3,0xE667,0xE664,0xE670,0xE66A,0xE66C,0xBCF4, + 0xE666,0xE66E,INVALC,INVALC,0xE66D,0xE66B,INVALC,0xE671, + 0xBCF7,0xE668,0xE66F,INVALC,0xBCF5,INVALC,INVALC,0xE663, + 0xE665,0xBCF6,0xE662,0xE672,INVALC,0xE669,INVALC,INVALC, + 0xEA4A,0xBF51,INVALC,INVALC,0xEA55,0xEA53,0xBF4B,0xEA49, + 0xEA4C,0xEA4D,0xEA48,0xBF55,0xBF56,0xEA47,0xEA56,0xEA51, + 0xBF4F,0xBF4C,0xEA50,0xEA4E,INVALC,INVALC,0xBF52,0xEA52, + 0xBF4D,INVALC,0xBF4E,INVALC,0xEA4F,0xBF50,0xEA4B,INVALC, + 0xEA54,0xBF53,0xEA57,0xEA58,0xBF54,INVALC,INVALC,0xC0E7, + 0xC0EE,0xED5C,0xED62,INVALC,0xED60,0xC0EA,0xC0E9,0xC0E6, + 0xED5E,INVALC,INVALC,INVALC,0xC0EC,0xC0EB,0xC0E8,INVALC, + 0xED61,0xED5D,0xED5F,INVALC,0xC0ED,INVALC,INVALC,INVALC, + 0xC277,0xEFFB,INVALC,0xC274,0xC275,0xEFFD,0xC276,0xEFFA, + /* Block 115, Array index 0x3300 */ + INVALC,0xEFF9,0xF26C,0xEFFC,INVALC,0xF26D,0xC37A,0xF26B, + INVALC,INVALC,0xF26A,INVALC,0xF269,0xC37B,INVALC,INVALC, + 0xC46C,INVALC,INVALC,0xF46A,0xF46B,INVALC,INVALC,INVALC, + INVALC,0xF5DC,0xF5DB,0xC4EA,INVALC,0xF5DA,0xF6EC,0xF6ED, + INVALC,INVALC,0xF7E6,0xF8B1,INVALC,INVALC,0xF8F6,0xF9BC, + 0xC679,0xF9C6,0xA4F6,INVALC,0xAAA6,0xAAA7,INVALC,INVALC, + 0xACB8,INVALC,INVALC,INVALC,INVALC,0xC0EF,0xA4F7,INVALC, + 0xAAA8,0xAF52,0xB7DD,0xA4F8,INVALC,0xB26E,0xBAB8,0xC962, + INVALC,0xCFB7,0xD27D,INVALC,0xE2C5,INVALC,0xC0F0,0xA4F9, + 0xAAA9,0xCFB8,0xCFB9,0xDA66,0xB550,INVALC,INVALC,0xDEA4, + INVALC,INVALC,0xB7DE,0xE2C6,INVALC,INVALC,0xBCF8,INVALC, + 0xC37C,0xA4FA,0xDA67,0xA4FB,INVALC,0xA6C9,0xCA42,0xA6C8, + 0xA865,0xA864,0xA863,0xCB60,INVALC,INVALC,INVALC,0xAAAA, + INVALC,0xAAAB,0xCD5B,INVALC,0xCFBA,INVALC,0xCFBD,0xACBA, + 0xCFBB,INVALC,0xACB9,0xCFBC,0xACBB,INVALC,0xD2A2,0xD2A1, + 0xD27E,0xAF53,INVALC,0xD65D,0xD65E,0xB26F,0xD65C,0xD65F, + 0xB552,0xB270,INVALC,INVALC,0xB551,0xDA6B,0xDA6A,INVALC, + 0xDA68,0xDA69,INVALC,0xDA6C,0xDEA6,0xDEA5,0xDEA9,INVALC, + 0xDEA8,0xDEA7,0xBAB9,0xE2C9,INVALC,0xE2C8,0xBABA,0xE2C7, + 0xE673,INVALC,0xE674,0xBCF9,INVALC,0xEA59,0xEA5A,INVALC, + INVALC,0xF272,0xC37D,0xF271,0xF270,0xF26E,0xF26F,0xC4EB, + 0xF46C,0xF6EE,0xF8F7,INVALC,0xA4FC,INVALC,0xC9A5,0xA5C7, + 0xC9A6,INVALC,INVALC,INVALC,0xCA43,0xCA44,INVALC,INVALC, + INVALC,INVALC,0xCB66,INVALC,INVALC,0xCB62,INVALC,0xCB61, + 0xAAAC,0xCB65,0xA867,0xCB63,0xA866,0xCB67,0xCB64,INVALC, + INVALC,0xCD5F,0xCFBE,0xCD5D,0xCD64,INVALC,0xAAAD,INVALC, + 0xAAB0,0xCD65,0xCD61,INVALC,0xCD62,INVALC,0xCD5C,0xAAAF, + 0xCD5E,0xAAAE,0xCD63,INVALC,0xCD60,INVALC,INVALC,0xCFC2, + 0xACBD,0xACBE,INVALC,0xCFC5,0xCFBF,INVALC,0xCFC4,INVALC, + 0xCFC0,0xACBC,0xCFC3,0xCFC1,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xD2A8,0xD2A5,INVALC,0xD2A7,0xAF58, + 0xAF57,0xAF55,0xD2A4,0xD2A9,0xAF54,0xAF56,0xD2A6,0xD667, + /* Block 116, Array index 0x3400 */ + 0xD2A3,0xD2AA,INVALC,INVALC,INVALC,INVALC,INVALC,0xD662, + 0xD666,INVALC,0xD665,0xDA6E,0xDA79,INVALC,INVALC,0xD668, + INVALC,0xD663,0xDA6D,0xB274,INVALC,INVALC,0xB273,0xD661, + 0xD664,0xB275,INVALC,0xB272,0xB271,0xD660,0xD669,INVALC, + INVALC,INVALC,0xDA70,0xDA77,INVALC,0xB554,0xDA76,0xDA73, + INVALC,0xB556,INVALC,INVALC,INVALC,0xDA75,INVALC,INVALC, + 0xDA6F,0xDA71,0xDA74,0xDA72,0xB555,0xDA78,0xB553,0xB7DF, + INVALC,INVALC,0xDEAD,0xDEAC,0xDEAA,INVALC,0xB7E2,0xB7E1, + 0xDEAE,INVALC,0xDEAB,0xE2CA,0xBABB,0xB7E0,INVALC,INVALC, + INVALC,0xDEB0,0xDEAF,INVALC,0xE2CD,0xE2CB,0xBCFA,INVALC, + 0xBABC,0xE2CC,0xE676,INVALC,INVALC,INVALC,INVALC,0xBCFB, + 0xE675,0xE67E,0xE67D,0xE67B,INVALC,0xE67A,0xE677,0xE678, + 0xE679,0xE67C,0xE6A1,INVALC,INVALC,0xEA5F,0xEA5C,0xEA5D, + 0xBF57,0xEA5B,0xEA61,0xEA60,0xEA5E,INVALC,0xED64,0xED65, + 0xC0F1,INVALC,0xC0F2,0xED63,INVALC,0xC279,0xEFFE,0xC278, + 0xC37E,INVALC,0xC3A1,0xC46D,0xF46E,0xF46D,0xF5DD,0xF6EF, + 0xC57A,0xF7E8,0xF7E7,0xF7E9,0xA5C8,0xCFC6,0xAF59,0xB276, + 0xD66A,0xA5C9,0xC9A7,0xA4FD,INVALC,INVALC,0xCA45,INVALC, + INVALC,INVALC,0xCB6C,0xCB6A,0xCB6B,0xCB68,0xA868,0xCB69, + INVALC,INVALC,INVALC,INVALC,INVALC,0xCD6D,INVALC,0xAAB3, + 0xCD6B,0xCD67,0xCD6A,INVALC,0xCD66,0xAAB5,0xCD69,INVALC, + 0xAAB2,0xAAB1,INVALC,0xAAB4,0xCD6C,0xCD68,INVALC,INVALC, + INVALC,INVALC,0xACC2,0xACC5,0xCFCE,0xCFCD,0xCFCC,0xACBF, + 0xCFD5,0xCFCB,INVALC,0xACC1,0xD2AF,INVALC,0xCFD2,0xCFD0, + 0xACC4,INVALC,0xCFC8,0xCFD3,INVALC,0xCFCA,0xCFD4,0xCFD1, + 0xCFC9,INVALC,0xACC0,0xCFD6,0xCFC7,0xACC3,INVALC,INVALC, + INVALC,INVALC,0xD2B4,0xD2AB,0xD2B6,INVALC,0xD2AE,0xD2B9, + 0xD2BA,0xD2AC,0xD2B8,0xD2B5,0xD2B3,0xD2B7,0xAF5F,INVALC, + 0xAF5D,INVALC,INVALC,0xD2B1,INVALC,0xD2AD,INVALC,0xD2B0, + 0xD2BB,0xD2B2,0xAF5E,0xCFCF,INVALC,0xAF5A,0xAF5C,INVALC, + INVALC,INVALC,INVALC,INVALC,0xD678,0xD66D,0xD66B,INVALC, + 0xD66C,INVALC,0xD673,INVALC,0xD674,0xD670,0xB27B,0xD675, + /* Block 117, Array index 0x3500 */ + 0xD672,0xD66F,INVALC,0xB279,0xD66E,0xB277,0xB27A,0xD671, + 0xD679,0xAF5B,0xB278,0xD677,0xD676,0xB27C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xDA7E,INVALC, + INVALC,INVALC,0xDAA1,0xB560,INVALC,0xDAA7,INVALC,INVALC, + 0xDAA9,0xDAA2,0xB55A,0xDAA6,0xDAA5,0xB55B,0xB561,INVALC, + 0xB562,0xDAA8,0xB558,0xDA7D,0xDA7B,0xDAA3,0xDA7A,0xB55F, + 0xDA7C,0xDAA4,0xDAAA,0xB559,0xB55E,0xB55C,0xB55D,INVALC, + INVALC,INVALC,0xB557,INVALC,INVALC,INVALC,INVALC,0xB7E9, + 0xDEB7,0xB7E8,0xDEBB,INVALC,0xDEB1,INVALC,0xDEBC,INVALC, + INVALC,INVALC,0xDEB2,0xDEB3,INVALC,0xDEBD,0xDEBA,0xDEB8, + 0xDEB9,0xDEB5,0xDEB4,INVALC,0xDEBE,0xB7E5,INVALC,0xDEB6, + INVALC,0xB7EA,0xB7E4,0xB7EB,0xB7EC,INVALC,0xB7E7,0xB7E6, + INVALC,INVALC,0xE2CE,0xBABE,0xBABD,INVALC,INVALC,0xE2D3, + INVALC,0xBCFC,0xBABF,INVALC,INVALC,0xBAC1,0xE2D4,0xB7E3, + 0xBAC0,0xE2D0,0xE2D2,0xE2CF,INVALC,0xE2D1,INVALC,INVALC, + INVALC,0xE6AB,INVALC,INVALC,0xE6AA,0xE6A7,0xBD40,0xEA62, + 0xBD41,0xE6A6,INVALC,0xBCFE,INVALC,0xE6A8,0xE6A5,0xE6A2, + 0xE6A9,0xE6A3,0xE6A4,0xBCFD,INVALC,INVALC,INVALC,INVALC, + 0xED69,INVALC,0xEA66,INVALC,0xEA65,0xEA67,INVALC,0xED66, + 0xBF5A,INVALC,0xEA63,INVALC,0xBF58,INVALC,0xBF5C,0xBF5B, + 0xEA64,0xEA68,INVALC,0xBF59,INVALC,0xED6D,0xC0F5,0xC27A, + 0xC0F6,0xC0F3,0xED6A,0xED68,INVALC,0xED6B,INVALC,0xED6E, + 0xC0F4,0xED6C,0xED67,INVALC,INVALC,0xF042,0xF045,0xF275, + 0xF040,INVALC,0xF46F,0xF046,INVALC,0xC3A2,0xF044,0xC27B, + 0xF041,0xF043,0xF047,0xF276,INVALC,0xF274,INVALC,INVALC, + INVALC,INVALC,0xC3A3,0xF273,INVALC,INVALC,INVALC,0xC46E, + INVALC,INVALC,INVALC,INVALC,0xC4ED,0xF6F1,0xC4EC,0xF6F3, + 0xF6F0,0xF6F2,0xC5D0,0xF8B2,0xA5CA,0xCD6E,0xD2BC,0xD2BD, + 0xB27D,0xDEBF,0xBF5D,0xC3A4,0xC57B,0xF8B3,0xA5CB,INVALC, + 0xCD6F,0xA260,INVALC,INVALC,0xCFD7,INVALC,0xCFD8,INVALC, + INVALC,INVALC,INVALC,INVALC,0xD2BE,0xD2BF,0xB27E,0xB2A1, + INVALC,INVALC,INVALC,0xDAAB,INVALC,0xDEC2,0xDEC1,0xDEC0, + /* Block 118, Array index 0x3600 */ + 0xE2D5,INVALC,0xE2D6,0xE2D7,0xBAC2,INVALC,INVALC,0xE6AD, + 0xE6AC,INVALC,INVALC,0xEA69,0xBF5E,0xBF5F,INVALC,0xED72, + 0xED6F,0xED70,0xED71,0xF049,0xF048,0xC27C,0xF277,0xF5DE, + 0xA5CC,INVALC,0xACC6,INVALC,0xB2A2,0xDEC3,INVALC,0xA5CD, + INVALC,0xD2C0,0xB2A3,INVALC,INVALC,0xB563,0xB564,INVALC, + 0xA5CE,0xA5CF,0xCA46,0xA86A,0xA869,0xACC7,0xCFD9,0xDAAC, + 0xA5D0,0xA5D1,0xA5D2,0xA5D3,INVALC,INVALC,INVALC,0xA86B, + 0xA86C,0xCB6E,0xCB6D,INVALC,INVALC,0xAAB6,0xCD72,0xCD70, + 0xCD71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCFDA, + 0xCFDB,INVALC,INVALC,0xACCB,0xACC9,INVALC,0xACCA,0xACC8, + INVALC,INVALC,INVALC,INVALC,0xAF60,INVALC,INVALC,INVALC, + INVALC,0xAF64,0xAF63,0xD2C1,0xAF62,0xAF61,INVALC,0xD2C2, + INVALC,INVALC,0xB2A6,0xD67B,0xD67A,0xB2A4,0xB2A5,INVALC, + INVALC,INVALC,0xB566,0xB565,0xDAAE,INVALC,INVALC,0xDAAD, + 0xB2A7,INVALC,INVALC,INVALC,INVALC,INVALC,0xB7ED,0xDEC5, + 0xB7EE,0xDEC4,INVALC,INVALC,INVALC,0xE2D8,0xE6AE,0xBD42, + 0xEA6A,INVALC,INVALC,INVALC,0xED73,INVALC,0xC3A6,0xC3A5, + INVALC,INVALC,0xC57C,0xA5D4,0xCD73,INVALC,INVALC,0xB2A8, + 0xE2D9,0xBAC3,INVALC,INVALC,0xCB6F,0xCB70,INVALC,INVALC, + 0xCD74,0xAAB8,0xAAB9,INVALC,INVALC,0xAAB7,INVALC,INVALC, + INVALC,INVALC,0xACCF,0xACD0,0xACCD,0xACCE,INVALC,0xCFDC, + INVALC,INVALC,0xCFDD,0xACCC,INVALC,INVALC,INVALC,INVALC, + 0xD2C3,INVALC,0xAF68,0xAF69,INVALC,0xB2AB,0xD2C9,INVALC, + 0xAF6E,0xAF6C,0xD2CA,0xD2C5,0xAF6B,0xAF6A,0xAF65,0xD2C8, + 0xD2C7,0xD2C4,0xAF6D,INVALC,0xD2C6,0xAF66,INVALC,0xAF67, + INVALC,INVALC,0xB2AC,0xD6A1,0xD6A2,0xB2AD,0xD67C,0xD67E, + 0xD6A4,0xD6A3,0xD67D,INVALC,0xB2A9,0xB2AA,INVALC,0xDAB6, + 0xB56B,0xB56A,0xDAB0,0xB568,INVALC,0xDAB3,0xB56C,0xDAB4, + 0xB56D,0xDAB1,0xB567,0xB569,0xDAB5,INVALC,0xDAB2,0xDAAF, + INVALC,INVALC,INVALC,INVALC,INVALC,0xDED2,INVALC,0xDEC7, + 0xB7F0,0xB7F3,0xB7F2,0xB7F7,0xB7F6,0xDED3,0xDED1,0xDECA, + 0xDECE,0xDECD,0xB7F4,0xDED0,0xDECC,0xDED4,0xDECB,0xB7F5, + /* Block 119, Array index 0x3700 */ + 0xB7EF,0xB7F1,INVALC,0xDEC9,INVALC,INVALC,INVALC,INVALC, + 0xE2DB,0xBAC7,0xE2DF,0xBAC6,0xE2DC,0xBAC5,INVALC,0xDEC8, + 0xDECF,0xE2DE,INVALC,0xBAC8,0xE2E0,0xE2DD,0xE2DA,INVALC, + INVALC,0xE6B1,0xE6B5,0xE6B7,0xE6B3,0xE6B2,0xE6B0,0xBD45, + 0xBD43,0xBD48,0xBD49,0xE6B4,0xBD46,0xE6AF,0xBD47,0xBAC4, + 0xE6B6,0xBD44,INVALC,INVALC,INVALC,0xEA6C,INVALC,0xEA6B, + 0xEA73,0xEA6D,0xEA72,0xEA6F,0xBF60,0xEA71,INVALC,INVALC, + 0xBF61,INVALC,0xBF62,INVALC,0xEA70,0xEA6E,INVALC,INVALC, + INVALC,INVALC,0xC0F8,0xED74,INVALC,INVALC,0xC0F7,0xED77, + 0xED75,0xED76,INVALC,INVALC,0xC0F9,INVALC,INVALC,INVALC, + 0xF04D,INVALC,0xC2A1,0xF04E,INVALC,INVALC,0xC27D,0xF04F, + 0xC27E,0xF04C,0xF050,INVALC,0xF04A,INVALC,INVALC,0xC3A7, + 0xF278,0xC3A8,0xC46F,INVALC,0xF04B,0xC470,INVALC,INVALC, + INVALC,0xC4EE,0xF5DF,INVALC,0xC57E,0xF6F4,0xC57D,INVALC, + 0xF7EA,0xC5F5,0xC5F6,INVALC,INVALC,0xF9CC,INVALC,INVALC, + 0xACD1,0xCFDE,INVALC,0xB56E,0xB56F,0xA5D5,0xA6CA,0xCA47, + INVALC,0xCB71,0xA86D,INVALC,0xAABA,INVALC,0xACD2,0xACD3, + 0xACD4,0xD6A6,0xD2CB,0xAF6F,INVALC,INVALC,0xB2AE,0xD6A5, + INVALC,INVALC,0xDAB8,0xB571,INVALC,0xDAB7,0xB570,INVALC, + INVALC,0xDED5,0xBD4A,0xE6BB,0xE6B8,0xE6B9,0xE6BA,INVALC, + INVALC,INVALC,INVALC,INVALC,0xED78,INVALC,0xF051,INVALC, + INVALC,INVALC,0xF471,0xF470,INVALC,0xF6F5,0xA5D6,0xCD75, + 0xAF70,INVALC,INVALC,INVALC,0xB572,0xDED6,INVALC,INVALC, + 0xE2E1,INVALC,0xBD4B,0xEA74,INVALC,0xF052,0xF472,0xA5D7, + INVALC,INVALC,0xAABB,0xACD7,0xCFDF,0xACD8,0xACD6,INVALC, + 0xACD5,0xD2CC,0xAF71,INVALC,INVALC,0xAF72,0xAF73,INVALC, + INVALC,INVALC,0xB2B0,0xD6A7,0xB2AF,INVALC,INVALC,INVALC, + INVALC,INVALC,0xDAB9,0xB2B1,0xB573,0xDED7,0xB7F8,0xB7F9, + INVALC,0xBAC9,INVALC,0xBACA,0xBD4C,0xBF64,0xEA75,0xBF63, + INVALC,0xED79,0xC0FA,INVALC,0xF053,0xF473,0xA5D8,0xA86E, + 0xCD78,0xCD77,0xAABC,0xCD76,0xAABD,0xCD79,INVALC,0xCFE5, + 0xACDB,0xACDA,0xCFE7,0xCFE6,0xACDF,INVALC,0xACDE,INVALC, + /* Block 120, Array index 0x3800 */ + INVALC,0xACD9,INVALC,0xCFE1,0xCFE2,0xCFE3,INVALC,0xACE0, + 0xCFE0,0xACDC,0xCFE4,0xACDD,INVALC,INVALC,INVALC,INVALC, + 0xD2CF,0xD2D3,0xD2D1,0xD2D0,INVALC,0xD2D4,INVALC,INVALC, + INVALC,0xD2D5,0xD2D6,0xD2CE,INVALC,0xD2CD,INVALC,0xAF75, + 0xAF76,INVALC,0xD2D7,0xD2D2,INVALC,0xD6B0,INVALC,0xD2D8, + 0xAF77,0xAF74,INVALC,INVALC,INVALC,0xD6AA,INVALC,0xD6A9, + INVALC,0xD6AB,0xD6AC,0xD6AE,0xD6AD,0xD6B2,0xB2B5,0xB2B2, + 0xB2B6,0xD6A8,0xB2B7,0xD6B1,0xB2B4,0xD6AF,0xB2B3,INVALC, + INVALC,INVALC,INVALC,INVALC,0xDABC,0xDABE,0xDABA,0xDABB, + INVALC,INVALC,0xDABF,0xDAC1,0xDAC2,0xDABD,0xDAC0,0xB574, + INVALC,INVALC,0xDEDB,INVALC,0xDEE0,0xDED8,0xDEDC,INVALC, + INVALC,0xDEE1,0xDEDD,0xB7FA,0xB843,INVALC,0xB7FD,0xDED9, + 0xDEDA,0xBACE,0xB846,0xB7FE,INVALC,0xB844,0xB7FC,0xDEDF, + 0xB845,0xDEDE,0xB841,0xB7FB,0xB842,0xDEE2,0xE2E6,0xE2E8, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB840,INVALC,INVALC,0xE2E3,0xBACC,0xE2E9,0xBACD, + 0xE2E7,0xE2E2,0xE2E5,0xE2EA,0xBACB,0xE2E4,INVALC,0xBD4E, + 0xE6BF,0xE6BE,INVALC,0xBD51,0xBD4F,0xE6BC,0xBD4D,0xE6BD, + INVALC,0xBD50,INVALC,INVALC,INVALC,0xEA7D,INVALC,0xEAA1, + INVALC,0xEA7E,0xEA76,0xEA7A,0xEA79,0xEA77,0xBF66,0xBF67, + 0xBF65,0xEA78,0xEA7B,0xEA7C,INVALC,0xBF68,INVALC,0xC140, + 0xEDA3,INVALC,0xC0FC,0xED7B,0xC0FE,0xC141,INVALC,INVALC, + 0xC0FD,0xEDA2,0xED7C,0xC0FB,0xEDA1,0xED7A,0xED7E,0xED7D, + INVALC,INVALC,0xF055,0xC2A4,0xC2A5,0xC2A2,INVALC,0xC2A3, + INVALC,INVALC,0xF054,INVALC,0xF27B,INVALC,INVALC,0xC3A9, + INVALC,0xF279,0xF27A,INVALC,0xF474,0xF477,0xF475,0xF476, + 0xF5E0,INVALC,INVALC,0xC4EF,0xF7EB,0xF8B4,INVALC,0xC5F7, + 0xF8F8,0xF8F9,0xC666,0xA5D9,0xACE1,INVALC,0xDAC3,INVALC, + 0xDEE3,INVALC,0xA5DA,0xA86F,INVALC,0xAABE,INVALC,0xCFE8, + 0xCFE9,0xAF78,INVALC,INVALC,0xDAC4,0xB575,0xB847,0xC142, + 0xEDA4,0xF27C,0xF478,0xA5DB,INVALC,INVALC,INVALC,0xCDA1, + 0xCD7A,0xCD7C,0xCD7E,0xCD7D,0xCD7B,0xAABF,INVALC,INVALC, + /* Block 121, Array index 0x3900 */ + INVALC,INVALC,0xACE2,0xCFF2,INVALC,0xCFED,0xCFEA,INVALC, + INVALC,0xCFF1,INVALC,INVALC,0xACE4,0xACE5,0xCFF0,0xCFEF, + 0xCFEE,0xCFEB,0xCFEC,0xCFF3,0xACE3,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xAF7C,INVALC,0xAFA4, + 0xAFA3,0xD2E1,0xD2DB,0xD2D9,INVALC,0xAFA1,0xD6B9,0xAF7A, + 0xD2DE,0xD2E2,0xD2E4,0xD2E0,0xD2DA,0xAFA2,0xD2DF,0xD2DD, + 0xAF79,0xD2E5,0xAFA5,0xD2E3,0xAF7D,0xD2DC,INVALC,0xAF7E, + 0xAF7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xB2B9,INVALC,0xD6BA,INVALC,INVALC, + 0xD6B3,0xD6B5,0xD6B7,INVALC,0xD6B8,0xD6B6,0xB2BA,INVALC, + 0xD6BB,INVALC,0xD6B4,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xDAC8,0xB576,0xDAD0,INVALC, + 0xDAC5,INVALC,0xDAD1,INVALC,0xDAC6,0xDAC7,INVALC,INVALC, + 0xDACF,0xDACE,0xDACB,0xB2B8,0xB577,0xDAC9,0xDACC,0xB578, + 0xDACD,0xDACA,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xDEEE,INVALC,0xDEF2,0xB84E,INVALC,0xE2F0,0xB851, + 0xDEF0,INVALC,INVALC,0xDEED,0xDEE8,0xDEEA,0xDEEB,0xDEE4, + INVALC,0xB84D,INVALC,INVALC,0xB84C,INVALC,0xB848,0xDEE7, + INVALC,0xB84F,INVALC,0xB850,0xDEE6,0xDEE9,0xDEF1,0xB84A, + 0xB84B,0xDEEF,0xDEE5,INVALC,INVALC,INVALC,0xE2F2,0xBAD0, + 0xE2F4,0xDEEC,0xE2F6,0xBAD4,0xE2F7,0xE2F3,INVALC,0xBAD1, + 0xE2EF,0xBAD3,0xE2EC,0xE2F1,0xE2F5,0xE2EE,INVALC,INVALC, + 0xB849,INVALC,0xE2EB,0xBAD2,0xE2ED,INVALC,INVALC,INVALC, + INVALC,INVALC,0xBD54,0xE6C1,0xBD58,INVALC,0xBD56,INVALC, + INVALC,0xBACF,INVALC,0xE6C8,0xE6C9,0xBD53,INVALC,INVALC, + 0xE6C7,0xE6CA,0xBD55,0xBD52,0xE6C3,0xE6C0,0xE6C5,0xE6C2, + 0xBD59,0xE6C4,INVALC,INVALC,0xE6C6,0xBD57,INVALC,INVALC, + INVALC,INVALC,0xBF6A,0xEAA8,INVALC,0xEAA2,0xEAA6,0xEAAC, + 0xEAAD,0xEAA9,0xEAAA,0xEAA7,INVALC,0xEAA4,INVALC,0xBF6C, + 0xBF69,0xEAA3,0xEAA5,INVALC,0xBF6B,0xEAAB,INVALC,0xC146, + INVALC,INVALC,0xEDAA,0xEDA5,0xC145,INVALC,INVALC,0xC143, + INVALC,0xEDAC,0xC144,0xEDA8,0xEDA9,0xEDA6,0xEDAD,0xF056, + /* Block 122, Array index 0x3A00 */ + INVALC,0xC147,0xEDA7,INVALC,0xEDAE,0xEDAB,INVALC,INVALC, + INVALC,0xF05A,INVALC,INVALC,0xF057,INVALC,0xC2A6,INVALC, + 0xF05B,0xF05D,0xF05C,0xF058,0xF059,INVALC,INVALC,0xF2A3, + INVALC,0xC3AA,INVALC,0xF27E,0xF2A2,0xF27D,0xF2A4,INVALC, + INVALC,0xF2A1,INVALC,0xF47A,0xF47D,0xF479,0xC471,0xF47B, + 0xF47C,0xF47E,0xC472,0xC474,0xC473,0xF5E1,INVALC,0xF5E3, + INVALC,0xF5E2,INVALC,INVALC,INVALC,0xF6F6,INVALC,INVALC, + 0xF8B5,0xF8FA,0xA5DC,INVALC,INVALC,0xCB72,0xAAC0,0xCDA3, + 0xAAC1,0xAAC2,0xCDA2,INVALC,0xCFF8,0xCFF7,0xACE6,0xACE9, + 0xACE8,0xACE7,0xCFF4,0xCFF6,0xCFF5,INVALC,INVALC,0xD2E8, + 0xAFA7,0xD2EC,0xD2EB,0xD2EA,0xD2E6,0xAFA6,0xAFAA,0xAFAD, + INVALC,INVALC,0xAFAE,0xD2E7,0xD2E9,0xAFAC,0xAFAB,0xAFA9, + 0xAFA8,0xD6C2,INVALC,0xD6C0,0xD6BC,0xB2BB,INVALC,0xD6BD, + 0xB2BC,0xD6BE,0xD6BF,0xD6C1,INVALC,0xB2BD,INVALC,INVALC, + 0xDAD5,INVALC,0xDAD4,0xDAD3,0xDAD2,INVALC,INVALC,INVALC, + INVALC,0xDEF6,0xB852,INVALC,0xDEF3,0xDEF5,INVALC,0xB853, + INVALC,0xB854,0xDEF4,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xE341,INVALC,0xE2F9,0xE2FA,INVALC,0xBAD7,0xBAD5,0xBAD6, + 0xE343,INVALC,0xE342,0xE2FE,0xE2FD,0xE2FC,0xE2FB,0xE340, + 0xE2F8,INVALC,0xE6CB,0xE6D0,0xE6CE,INVALC,INVALC,INVALC, + 0xE6CD,0xE6CC,0xE6CF,INVALC,0xEAAE,INVALC,0xBF6D,0xC148, + 0xEDB0,INVALC,0xC149,0xEDAF,0xF05F,0xF05E,0xC2A7,INVALC, + 0xF2A5,0xC3AB,0xF4A1,0xC5A1,0xF6F7,INVALC,0xF8B7,0xF8B6, + 0xC9A8,0xACEA,0xACEB,0xD6C3,INVALC,0xB856,0xA5DD,0xA872, + 0xA871,0xA870,INVALC,INVALC,INVALC,0xCDA4,INVALC,INVALC, + 0xAAC4,0xAAC3,INVALC,0xACEE,INVALC,0xCFFA,0xCFFD,0xCFFB, + INVALC,0xACEC,0xACED,INVALC,INVALC,0xCFF9,0xCFFC,INVALC, + 0xAFB5,INVALC,INVALC,INVALC,0xD2F3,0xD2F5,0xD2F4,0xAFB2, + 0xD2EF,INVALC,INVALC,0xAFB0,0xAFAF,INVALC,0xAFB3,0xAFB1, + INVALC,0xAFB4,0xD2F2,0xD2ED,0xD2EE,0xD2F1,0xD2F0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xD6C6,0xD6C7, + 0xD6C5,INVALC,0xD6C4,0xB2BE,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x3B00 */ + 0xB57D,INVALC,0xDAD6,0xDAD8,0xDADA,0xB57C,INVALC,INVALC, + 0xB57A,INVALC,0xDAD7,0xB57B,0xDAD9,0xB579,INVALC,INVALC, + 0xDF41,0xDEF7,0xDEFA,0xDEFE,0xB85A,0xDEFC,INVALC,0xDEFB, + 0xDEF8,0xDEF9,0xB858,0xDF40,0xB857,INVALC,0xB85C,0xB85B, + 0xB859,INVALC,0xDEFD,INVALC,INVALC,INVALC,0xE349,INVALC, + 0xE348,INVALC,INVALC,0xE344,INVALC,INVALC,0xBAD8,0xE347, + 0xE346,0xBAD9,INVALC,INVALC,INVALC,INVALC,INVALC,0xBD5E, + INVALC,0xE6D2,INVALC,0xBD5F,0xBD5B,0xBD5D,INVALC,0xBD5A, + 0xBD5C,INVALC,INVALC,INVALC,0xEAAF,INVALC,0xBF70,0xEAB1, + 0xEAB0,INVALC,0xE345,0xBF72,0xBF71,0xBF6E,0xBF6F,INVALC, + INVALC,INVALC,INVALC,INVALC,0xEDB5,INVALC,0xEDB3,0xC14A, + 0xEDB4,INVALC,0xEDB6,0xEDB2,0xEDB1,INVALC,INVALC,0xF060, + 0xC2AA,0xC2A8,0xC2A9,INVALC,INVALC,INVALC,INVALC,0xF2A6, + 0xF2A7,0xC3AD,INVALC,0xC3AC,0xF4A3,0xF4A4,0xF4A2,INVALC, + 0xF6F8,0xF6F9,INVALC,INVALC,0xA5DE,0xCA48,0xA873,INVALC, + 0xCDA5,0xAAC6,0xAAC5,0xCDA6,INVALC,INVALC,0xD040,0xACEF, + 0xCFFE,0xACF0,INVALC,INVALC,0xAFB6,0xD2F8,0xD2F6,0xD2FC, + 0xAFB7,0xD2F7,0xD2FB,0xD2F9,0xD2FA,INVALC,INVALC,0xD6C8, + 0xD6CA,INVALC,0xB2BF,INVALC,0xD6C9,0xB2C0,0xB5A2,0xB5A1, + 0xB57E,0xDADB,INVALC,INVALC,INVALC,INVALC,0xDF44,0xB85D, + 0xB85E,INVALC,0xDF43,0xDF42,INVALC,INVALC,INVALC,INVALC, + 0xE34A,0xBADB,0xBADA,0xE34B,0xE34C,INVALC,0xBD61,0xBD60, + INVALC,0xEAB5,0xE6D3,0xE6D5,0xE6D4,0xEAB4,0xEAB2,0xEAB6, + 0xEAB3,INVALC,0xBF73,INVALC,INVALC,INVALC,0xEDB7,0xC14B, + 0xEDB8,0xEDB9,INVALC,INVALC,0xC2AB,0xC2AC,INVALC,0xC475, + INVALC,INVALC,0xC5D1,0xA5DF,INVALC,INVALC,INVALC,INVALC, + INVALC,0xD041,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD2FD,0xAFB8,INVALC,INVALC,INVALC,INVALC,INVALC,0xB3BA, + 0xB3B9,INVALC,INVALC,0xB5A4,0xDADD,0xB5A3,0xDADC,INVALC, + INVALC,INVALC,INVALC,0xDF45,INVALC,0xBADC,0xE34D,0xBADD, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xC476,0xF4A5, + INVALC,0xA6CB,0xAAC7,0xCDA7,INVALC,0xACF2,INVALC,0xACF1, + /* Block 124, Array index 0x3C00 */ + 0xD042,0xD043,INVALC,INVALC,0xD340,0xD342,0xAFB9,INVALC, + 0xD344,0xD347,0xD345,INVALC,INVALC,INVALC,0xD346,0xD343, + 0xD2FE,0xAFBA,0xD348,0xD341,INVALC,INVALC,INVALC,INVALC, + 0xD6D3,0xB2C6,0xD6DC,0xB2C3,INVALC,0xD6D5,0xB2C7,INVALC, + 0xB2C1,INVALC,0xD6D0,0xD6DD,0xD6D1,0xD6CE,0xB2C5,INVALC, + 0xB2C2,INVALC,0xD6D4,0xD6D7,0xB2C4,0xD6D8,0xB2C8,0xD6D9, + 0xD6CF,0xD6D6,0xD6DA,0xD6D2,0xD6CD,0xD6CB,INVALC,INVALC, + 0xD6DB,INVALC,INVALC,0xDADF,INVALC,INVALC,INVALC,INVALC, + 0xDAE4,INVALC,INVALC,INVALC,0xDAE0,0xDAE6,0xB5A7,0xD6CC, + 0xDAE1,0xB5A5,0xDADE,0xB5AC,0xDAE2,0xB5AB,0xDAE3,0xB5AD, + 0xB5A8,0xB5AE,0xB5A9,INVALC,0xB5AA,INVALC,0xB5A6,INVALC, + 0xDAE5,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xB861,0xDF50,INVALC,0xDF53,0xDF47,0xDF4C,0xDF46,0xB863, + INVALC,0xDF4A,INVALC,INVALC,INVALC,0xDF48,0xB862,INVALC, + 0xDF4F,0xDF4E,0xDF4B,0xDF4D,0xDF49,0xBAE1,0xDF52,0xB85F, + 0xDF51,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xE35D,INVALC,0xBAE8,0xE358,INVALC,0xBAE7, + 0xE34E,INVALC,0xE350,0xBAE0,0xE355,0xE354,0xE357,0xBAE5, + 0xE352,0xE351,INVALC,INVALC,0xBAE4,0xBADF,0xE353,0xBAE2, + 0xE359,0xE35B,INVALC,0xE356,0xE34F,0xBAE3,INVALC,INVALC, + 0xBD69,0xBADE,INVALC,INVALC,0xE35C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xE6D9,0xBD62,INVALC,0xE6DB, + INVALC,0xBD63,INVALC,INVALC,0xBD65,0xE6DE,INVALC,0xE6D6, + 0xBAE6,0xE6DC,INVALC,INVALC,INVALC,INVALC,0xE6D8,INVALC, + 0xB860,0xBD68,INVALC,INVALC,0xBD64,INVALC,0xBD66,0xBD67, + INVALC,0xBF76,0xE6DD,0xE6D7,0xBD6A,INVALC,0xE6DA,INVALC, + INVALC,INVALC,INVALC,INVALC,0xEAC0,0xEABB,INVALC,INVALC, + 0xEAC5,0xBF74,0xEABD,0xBF78,0xEAC3,0xEABA,0xEAB7,0xEAC6, + 0xC151,0xBF79,0xEAC2,0xEAB8,0xBF77,0xEABC,0xBF7B,0xEAB9, + 0xEABE,0xBF7A,0xEAC1,0xEAC4,INVALC,INVALC,INVALC,INVALC, + 0xEDCB,0xEDCC,0xEDBC,0xEDC3,0xEDC1,INVALC,INVALC,0xC14F, + 0xEDC8,0xEABF,INVALC,0xEDBF,INVALC,0xEDC9,0xC14E,0xEDBE, + /* Block 125, Array index 0x3D00 */ + 0xEDBD,0xEDC7,0xEDC4,0xEDC6,INVALC,0xEDBA,0xEDCA,0xC14C, + INVALC,0xEDC5,0xEDCE,0xEDC2,0xC150,0xC14D,0xEDC0,0xEDBB, + 0xEDCD,0xBF75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF063,INVALC,INVALC,0xF061,0xF067,0xC2B0,0xF065, + 0xF064,0xC2B2,0xF06A,0xC2B1,INVALC,0xF06B,0xF068,0xC2AE, + 0xF069,0xF062,0xC2AF,0xC2AD,0xF2AB,0xF066,INVALC,INVALC, + 0xF06C,INVALC,INVALC,0xF2A8,INVALC,INVALC,INVALC,0xC3B2, + 0xC3B0,0xF2AA,INVALC,0xF2AC,0xF2A9,0xC3B1,0xC3AE,0xC3AF, + 0xC3B3,INVALC,INVALC,0xC478,INVALC,0xF4AA,INVALC,0xF4A9, + 0xF4A7,0xF4A6,0xF4A8,INVALC,0xC477,0xC479,INVALC,INVALC, + 0xC4F0,INVALC,INVALC,0xF5E5,0xF5E4,INVALC,INVALC,0xF6FA, + INVALC,0xF6FC,0xF6FE,0xF6FD,0xF6FB,INVALC,INVALC,0xC5A3, + 0xC5A2,INVALC,INVALC,0xC5D3,0xC5D2,0xC5D4,0xF7ED,0xF7EC, + INVALC,0xF8FB,0xF8B8,0xF8FC,0xC658,INVALC,0xC659,0xF96D, + INVALC,INVALC,0xC67E,0xA6CC,INVALC,0xCDA8,INVALC,INVALC, + 0xD045,0xD046,0xD044,INVALC,INVALC,0xACF3,INVALC,0xD047, + 0xD048,0xD049,INVALC,INVALC,0xD349,0xD34F,INVALC,INVALC, + 0xD34D,0xAFBB,0xD34B,INVALC,0xD34C,0xD34E,INVALC,INVALC, + INVALC,0xD34A,0xB2C9,INVALC,0xD6DE,0xB2CB,0xD6E0,0xB2CA, + 0xD6DF,INVALC,INVALC,INVALC,INVALC,INVALC,0xDAE8,0xB5AF, + INVALC,0xDAEA,0xDAE7,0xD6E1,INVALC,0xB5B0,INVALC,INVALC, + 0xDAE9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xDF56, + INVALC,0xB864,0xDF54,0xB865,0xDF55,0xB866,INVALC,INVALC, + INVALC,0xBAE9,0xE361,0xE35E,0xE360,0xBAEA,0xBAEB,0xE35F, + INVALC,INVALC,INVALC,INVALC,INVALC,0xE6DF,INVALC,INVALC, + 0xE6E0,INVALC,0xBD6B,0xE6E2,0xE6E1,INVALC,0xA261,INVALC, + 0xEACA,0xEACB,0xEAC7,INVALC,0xEAC8,0xBF7C,0xBF7D,0xEAC9, + INVALC,0xC157,INVALC,INVALC,0xC153,0xC158,0xC154,0xC156, + 0xC152,INVALC,0xC155,INVALC,INVALC,INVALC,INVALC,0xC2B3, + 0xEDCF,INVALC,0xF2AE,INVALC,0xF2AD,INVALC,0xF4AB,0xC47A, + 0xC47B,0xF741,0xF5E6,INVALC,0xF740,INVALC,0xF8FD,0xF9A4, + 0xA6CD,INVALC,INVALC,0xA874,INVALC,0xCDA9,0xAAC8,INVALC, + /* Block 126, Array index 0x3E00 */ + 0xACF6,0xD04C,0xACF4,0xD04A,0xACF9,0xACF5,0xACFA,0xACF8, + 0xD04B,0xACF7,0xAFBF,0xAFBE,0xD35A,0xAFC7,0xD353,0xD359, + 0xAFC3,0xD352,0xD358,0xD356,0xAFC2,0xAFC4,0xD355,0xAFBD, + 0xD354,0xAFC8,0xAFC5,0xAFC9,0xAFC6,0xD351,0xD350,0xD357, + 0xAFC0,0xAFBC,0xAFC1,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD6F0,0xD6E9,INVALC,0xB5B5,0xD6E8,INVALC,0xB2CF,0xB2D6, + 0xB2D3,0xB2D9,0xB2D8,0xB2D4,INVALC,0xD6E2,0xD6E5,INVALC, + 0xD6E4,0xB2D0,0xD6E6,0xD6EF,0xB2D1,0xD6E3,0xD6EC,0xD6ED, + 0xB2D2,0xD6EA,0xB2D7,0xB2CD,0xB2D5,0xD6E7,0xB2CC,0xD6EB, + INVALC,INVALC,0xD6EE,INVALC,INVALC,INVALC,0xDAFB,0xDAF2, + 0xB5B2,0xDAF9,0xDAF6,0xDAEE,0xDAF7,0xB5B4,0xDAEF,INVALC, + 0xDAEB,INVALC,INVALC,0xB86C,0xDAF4,INVALC,0xB5B1,0xDAFA, + INVALC,0xB5B8,0xB5BA,0xDAED,INVALC,INVALC,0xB5B9,0xDAF0, + 0xB5B3,0xDAF8,0xDAF1,0xDAF5,INVALC,0xDAF3,0xB5B6,0xDAEC, + 0xB5BB,0xB2CE,0xB5B7,0xB5BC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB868,0xDF5D,0xDF5F,0xDF61,0xDF65,INVALC,0xDF5B, + 0xDF59,0xB86A,INVALC,0xDF60,0xDF64,0xDF5C,0xDF58,INVALC, + 0xDF57,INVALC,INVALC,INVALC,0xDF62,0xDF5A,0xDF5E,0xB86B, + INVALC,0xB869,0xDF66,0xB867,0xDF63,INVALC,0xE372,INVALC, + INVALC,INVALC,INVALC,INVALC,0xBAEE,0xE36A,0xBD78,0xE374, + 0xBAF1,0xE378,0xBAF7,0xE365,INVALC,INVALC,0xE375,0xE362, + INVALC,0xE377,0xE366,INVALC,0xBAFE,0xBAFB,0xE376,0xE370, + 0xBAED,0xBAF5,0xBAF4,INVALC,0xBAF3,0xBAF9,INVALC,0xE363, + 0xBAFA,0xE371,0xBAF6,0xBAEC,0xE373,0xBAEF,0xBAF0,0xBAF8, + 0xE368,0xE367,0xE364,INVALC,0xE36C,0xE369,0xE36D,0xBAFD, + INVALC,0xE379,0xBAF2,0xE36E,0xE36F,INVALC,0xE36B,INVALC, + INVALC,INVALC,0xBAFC,INVALC,INVALC,INVALC,INVALC,0xE6E7, + 0xBD70,0xBD79,0xBD75,0xE6E4,INVALC,0xBD72,0xBD76,0xE6F0, + 0xBD6C,0xE6E8,INVALC,0xBD74,INVALC,INVALC,0xE6EB,0xE6E6, + 0xBD73,0xBD77,0xE6E5,INVALC,0xBD71,INVALC,0xE6EF,0xBD6E, + 0xE6EE,0xE6ED,0xBD7A,0xE572,0xBD6D,INVALC,0xE6EC,0xE6E3, + INVALC,0xBD7B,0xE6EA,0xBD6F,INVALC,INVALC,INVALC,INVALC, + /* Block 127, Array index 0x3F00 */ + INVALC,INVALC,INVALC,0xE6E9,INVALC,INVALC,INVALC,INVALC, + 0xBFA2,0xBFA7,0xBF7E,0xEAD8,0xEACF,0xEADB,0xEAD3,0xEAD9, + 0xBFA8,0xBFA1,0xEACC,0xEAD2,0xEADC,0xEAD5,0xEADA,0xEACE, + INVALC,INVALC,0xEAD6,0xBFA3,0xEAD4,0xBFA6,0xBFA5,0xEAD0, + 0xEAD1,0xEACD,0xEAD7,0xBFA4,0xEADE,0xEADD,INVALC,INVALC, + INVALC,0xEDDA,0xEDD6,0xC15F,INVALC,0xEDD0,0xC159,0xC169, + 0xEDDC,0xC161,0xC15D,0xEDD3,0xC164,0xC167,0xEDDE,0xC15C, + 0xEDD5,0xC165,0xEDE0,0xEDDD,0xEDD1,0xC160,0xC15A,0xC168, + 0xEDD8,0xC163,0xEDD2,0xC15E,0xEDDF,0xC162,0xC15B,0xEDD9, + 0xC166,0xEDD7,INVALC,INVALC,0xEDDB,INVALC,INVALC,INVALC, + 0xF06E,0xF074,0xC2B9,0xF077,0xC2B4,0xC2B5,0xF06F,0xF076, + 0xF071,0xC2BA,0xC2B7,INVALC,0xF06D,INVALC,0xC2B6,0xF073, + 0xF075,0xC2B8,0xF072,0xF070,INVALC,INVALC,INVALC,INVALC, + 0xF2B8,0xC3B7,0xC3B8,0xC3B4,INVALC,0xC3B5,INVALC,0xF2B4, + 0xF2B2,INVALC,0xF2B6,0xC3BA,0xF2B7,0xF2B0,0xF2AF,0xF2B3, + 0xF2B1,0xC3B6,0xF2B5,0xF4AC,0xC47E,0xC47D,0xF4AD,INVALC, + 0xF4AF,0xF4AE,0xC4A1,INVALC,INVALC,INVALC,0xF5EB,0xF5E8, + 0xF5E9,INVALC,0xF5E7,0xF5EA,0xC4F2,0xF5EC,INVALC,0xC4F1, + INVALC,0xF742,INVALC,0xC5D5,0xC5D7,0xF7EE,0xC5D6,0xF8B9, + 0xF940,0xF942,0xF8FE,0xF941,0xC66C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA6CE,INVALC, + 0xACFB,0xD26F,0xAFCA,INVALC,INVALC,0xB2DA,0xDAFC,0xDAFD, + INVALC,INVALC,INVALC,0xEADF,0xC16A,0xEDE1,INVALC,INVALC, + 0xC2BB,INVALC,0xF2BA,0xF2B9,0xC4A2,0xF5ED,INVALC,0xF743, + 0xC5F8,0xCA49,INVALC,INVALC,0xAAC9,0xA875,INVALC,INVALC, + 0xD04D,INVALC,INVALC,0xD360,0xD35B,0xD35F,0xD35D,0xAFCB, + 0xD35E,0xD35C,INVALC,0xD6F1,INVALC,0xDAFE,0xDB40,0xDF69, + 0xDF6A,0xB86E,0xB86F,0xDF68,0xDF6B,0xDF67,0xB86D,INVALC, + 0xBB40,INVALC,0xB870,0xE37A,INVALC,0xBD7C,0xE6F1,0xBD7D, + INVALC,0xBFA9,0xEAE2,0xEAE0,0xEAE1,0xEDE4,0xEDE3,0xEDE2, + INVALC,INVALC,INVALC,0xF2BB,INVALC,0xC3B9,0xF2BC,0xF744, + 0xC5F9,0xF8BA,0xA6CF,0xAACB,0xAACA,0xD04F,0xACFC,INVALC, + INVALC,0xD04E,0xD362,INVALC,0xAFCC,0xD6F2,0xD361,INVALC, + INVALC,INVALC,0xB2DC,0xD6F5,0xD6F3,0xD6F4,0xB2DB,INVALC, + 0xDB42,0xDB43,0xDB41,INVALC,0xB873,0xDF6D,0xDF6C,0xDF6E, + 0xB872,0xB871,INVALC,INVALC,0xE6F2,0xE6F4,INVALC,0xBD7E, + 0xE6F3,0xEAE3,0xBFAA,0xF079,INVALC,0xF078,0xC3BB,0xF2BD, + 0xC3BD,0xC3BC,0xF4B0,0xF5EE,0xC4F3,0xA6D0,0xD050,0xACFD, + 0xD365,0xAFCE,0xD364,0xD363,INVALC,0xAFCD,INVALC,0xD6FB, + INVALC,0xD6FD,0xD6F6,0xD6F7,0xB2DD,0xD6F8,0xB2DE,0xD6FC, + 0xD6F9,0xD6FA,0xB2DF,INVALC,0xB5BE,0xB5BF,INVALC,0xDB44, + INVALC,INVALC,INVALC,0xDF6F,0xDF70,INVALC,0xE37E,0xBB43, + 0xBB41,0xBB42,0xE37B,0xE37C,INVALC,0xE37D,0xE6F9,INVALC, + 0xE6FA,0xBDA1,0xE6F7,0xE6F6,0xE6F8,0xE6F5,0xBFAD,0xEAE4, + 0xBFAB,0xBFAC,0xEDE6,0xC16B,0xEDE5,0xEFA8,INVALC,0xF07A, + 0xF07B,0xC2BC,INVALC,0xC2BD,0xC16C,0xF2BE,0xF2BF,0xF4B1, + /* Block 129, Array index 0x4100 */ + 0xC4A3,0xA6D1,INVALC,0xA6D2,0xACFE,0xAACC,0xAFCF,0xD051, + INVALC,INVALC,INVALC,0xB5C0,0xA6D3,0xAD41,0xD052,0xD053, + 0xAD40,0xAD42,0xA6D4,INVALC,0xD054,0xAFD1,0xD366,0xAFD3, + 0xAFD0,0xAFD2,INVALC,0xD741,0xB2E0,INVALC,0xD740,0xD6FE, + INVALC,0xDF71,INVALC,INVALC,0xE3A1,INVALC,0xBDA2,INVALC, + 0xBFAE,0xEAE6,0xEAE5,INVALC,0xEDE7,INVALC,INVALC,INVALC, + 0xF5EF,INVALC,INVALC,0xA6D5,0xCB73,0xCDAA,0xAD43,0xD055, + INVALC,0xD368,INVALC,INVALC,INVALC,0xAFD4,0xD367,0xAFD5, + INVALC,INVALC,INVALC,0xD743,INVALC,INVALC,0xB2E2,0xD742, + 0xD744,INVALC,0xB2E1,INVALC,INVALC,INVALC,INVALC,0xDB46, + 0xDB47,0xDB45,0xB5C1,INVALC,INVALC,INVALC,0xB874,INVALC, + 0xB875,INVALC,0xBB45,INVALC,0xE3A3,0xE3A2,0xBB44,INVALC, + INVALC,INVALC,INVALC,INVALC,0xE6FB,INVALC,INVALC,0xE6FC, + INVALC,INVALC,INVALC,INVALC,0xEAE7,INVALC,INVALC,0xC170, + 0xC16F,0xC16D,0xC16E,0xC171,INVALC,0xF07C,0xC2BF,0xC2BE, + 0xF2C0,0xF4B2,INVALC,INVALC,INVALC,0xC5A5,0xC5A4,0xA6D6, + INVALC,INVALC,0xD1FB,INVALC,0xB877,0xB5C2,0xB876,0xBB46, + INVALC,0xA6D7,0xC9A9,0xA6D8,0xA6D9,INVALC,INVALC,0xCDAB, + 0xCB76,INVALC,0xCB77,0xA877,INVALC,0xCB74,0xA876,INVALC, + 0xA879,0xCB75,0xA87B,0xA87A,0xCB78,0xA878,INVALC,INVALC, + INVALC,0xAAD1,0xAACF,0xCDAD,INVALC,0xAACE,INVALC,INVALC, + INVALC,0xAAD3,0xAAD5,0xAAD2,INVALC,0xCDB0,0xCDAC,0xAAD6, + INVALC,0xAAD0,0xA87C,INVALC,0xAAD4,0xCDAF,INVALC,INVALC, + 0xCDAE,INVALC,0xAACD,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xD05B,0xAD47,0xAD48,0xD05D,INVALC,0xD057, + 0xD05A,0xD063,0xD061,INVALC,0xAD49,0xD067,0xAD4C,0xD064, + 0xD05C,0xD059,INVALC,INVALC,0xDB49,0xD062,0xAD44,0xD065, + 0xD056,0xD05F,0xAD46,0xAD4B,0xD060,0xAD4F,0xAD4D,INVALC, + 0xD058,0xAD4A,INVALC,0xD05E,0xAD4E,0xAD45,0xD066,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xAFDA,INVALC,0xAFE3, + 0xAFD8,0xAFD6,0xD36A,0xAFDE,0xAFDB,0xD36C,INVALC,INVALC, + 0xAFDD,0xD36B,0xD369,0xD36E,0xAFE2,0xAFE0,0xDB48,INVALC, + /* Block 130, Array index 0x4200 */ + 0xD36F,0xD36D,0xAFD7,INVALC,INVALC,0xAFD9,0xAFDC,INVALC, + 0xAFDF,INVALC,0xAFE1,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD74E,0xB2E4,INVALC, + 0xD745,0xD747,INVALC,0xD748,INVALC,0xD750,0xD74C,0xD74A, + INVALC,0xD74D,0xD751,0xB2E5,0xB2E9,0xD746,INVALC,0xD74F, + INVALC,0xB2E7,INVALC,0xB2E6,0xD74B,0xD749,INVALC,0xB2E3, + 0xB2E8,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB5C8,0xDB51,INVALC,INVALC,0xDB4F,0xB5CA,INVALC, + INVALC,INVALC,INVALC,0xDB4A,0xDFA1,INVALC,0xB5C9,0xDB4E, + INVALC,INVALC,0xDB4B,0xB5C5,0xB5CB,0xDB50,0xB5C7,0xDB4D, + 0xBB47,0xB5C6,0xDB4C,0xB5CC,0xB5C4,0xB5C3,INVALC,INVALC, + INVALC,INVALC,INVALC,0xDF77,0xDF75,INVALC,0xDF7B,INVALC, + 0xDF73,0xDFA2,0xDF78,INVALC,0xDF72,0xB87B,0xB8A3,0xDF7D, + INVALC,0xDF76,INVALC,0xB87E,INVALC,INVALC,0xB87C,0xDF7E, + 0xB879,0xB878,0xDF79,0xB87D,0xB5CD,INVALC,0xDF7C,0xDF74, + 0xB87A,0xB8A1,0xB8A2,INVALC,INVALC,INVALC,INVALC,0xBB4C, + 0xBB48,INVALC,0xBB4D,0xE3A6,INVALC,INVALC,0xE3A5,0xE3A7, + 0xBB4A,0xE3A4,0xBB4B,0xE3AA,0xE3A9,0xE3A8,INVALC,0xBB49, + INVALC,INVALC,INVALC,INVALC,INVALC,0xE741,INVALC,0xE744, + 0xBDA8,0xE743,0xBDA7,0xBDA3,0xBDA4,0xBDA5,0xE740,0xE6FE, + 0xBDA6,INVALC,0xE742,0xE6FD,INVALC,INVALC,0xEAE9,0xEAF3, + 0xBFB1,0xBFB0,INVALC,0xEAED,0xEAEF,INVALC,0xEAEA,INVALC, + 0xEAEE,0xEAE8,0xEAF1,0xBFAF,0xEAF0,0xEAEC,INVALC,0xEAF2, + INVALC,0xEAEB,0xC174,0xEDE8,0xEDEE,0xC178,0xC17A,0xC177, + 0xC176,INVALC,0xC175,0xC173,0xEDE9,0xEDEC,0xC172,0xEDED, + INVALC,0xC179,0xEDEB,INVALC,0xEDEA,0xC2C0,INVALC,0xC2C1, + 0xF0A1,0xF07D,0xF07E,INVALC,INVALC,0xF2C2,INVALC,0xF2C1, + 0xC3BE,0xF4B4,0xC4A4,0xF4B3,INVALC,0xF5F0,0xF745,0xC5A6, + 0xF943,0xF944,0xC5D8,0xA6DA,INVALC,0xAAD7,0xDB52,0xBB4E, + 0xC17B,0xEDEF,0xA6DB,INVALC,0xAFE5,0xAFE4,0xDB53,INVALC, + INVALC,INVALC,0xEAF4,0xA6DC,0xAD50,INVALC,INVALC,0xDB54, + 0xDB55,0xDB56,0xBB4F,0xBFB2,0xA6DD,INVALC,0xAAD8,0xD068, + /* Block 131, Array index 0x4300 */ + 0xAFE6,0xD370,0xB2EA,INVALC,0xDB57,0xB8A4,INVALC,0xBB50, + 0xBFB3,0xC17C,0xC2C2,0xF4B5,0xA6DE,0xAAD9,INVALC,INVALC, + 0xAFE7,0xD752,0xB5CE,INVALC,0xBB51,0xE3AB,0xE745,INVALC, + INVALC,INVALC,INVALC,0xA6DF,0xB5CF,0xDFA3,0xBB52,0xA6E0, + 0xCDB1,0xD069,0xAD51,INVALC,INVALC,0xD372,INVALC,INVALC, + 0xAFEA,INVALC,0xAFE8,0xAFE9,0xAFEB,INVALC,INVALC,0xD371, + INVALC,INVALC,0xD757,0xD754,0xD756,0xB2EB,0xB2ED,0xB2EC, + 0xD753,0xB2EE,0xD755,INVALC,0xDB58,0xDB59,INVALC,0xDB5A, + 0xDFA6,INVALC,0xDFA7,INVALC,0xDFA5,0xDFA8,INVALC,0xB8A5, + INVALC,0xDFA4,INVALC,0xBB53,INVALC,INVALC,0xE74A,0xE746, + 0xE749,0xE74B,0xE748,0xE747,INVALC,0xEAF5,0xEAF6,0xEAF7, + 0xBFB4,0xBFB5,0xEDF1,0xEDF0,0xEDF2,INVALC,0xF0A3,0xF0A2, + INVALC,0xF2C4,INVALC,0xF2C5,0xF2C3,INVALC,0xC4A5,INVALC, + 0xF4B6,0xF4B7,INVALC,0xF746,0xF7EF,0xF8BB,0xA6E1,0xA87D, + INVALC,0xC17D,0xA6E2,INVALC,0xD758,0xDB5B,INVALC,0xC641, + 0xCA4A,INVALC,INVALC,INVALC,0xCA4B,0xCA4D,0xA6E3,0xCA4E, + 0xCA4C,INVALC,INVALC,0xCBA2,0xCBA3,0xCB7B,INVALC,INVALC, + INVALC,INVALC,0xCBA1,0xA8A1,INVALC,0xA8A2,0xCB7C,0xCB7A, + 0xCB79,0xCB7D,0xA87E,0xCB7E,0xD06A,INVALC,INVALC,INVALC, + 0xCDB6,0xAADC,0xCDB5,0xCDB7,INVALC,0xAADB,0xCDBC,0xAADF, + 0xCDB2,0xCDC0,0xCDC6,0xAAE6,0xCDC3,0xAAE3,INVALC,0xCDB9, + 0xCDBF,0xCDC1,INVALC,0xCDB4,0xAAE2,0xAADD,0xCDBA,0xAAE4, + 0xAAE7,0xAAE1,INVALC,0xAADA,0xCDBE,0xCDB8,0xCDC5,0xAAE9, + 0xAAE5,0xAAE0,0xCDBD,0xAFEC,0xCDBB,0xAADE,0xAAE8,INVALC, + 0xCDB3,INVALC,0xCDC2,0xCDC4,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xAD62,0xAD5C,0xAD64,0xAD61,0xD071,0xD074,0xAD5D, + INVALC,0xD06B,INVALC,0xAD56,0xAD60,INVALC,0xAD63,0xAD65, + 0xD0A2,0xD077,INVALC,0xAD55,0xD0A1,0xAD59,0xAD57,0xAD52, + 0xD06F,INVALC,0xD07E,0xD073,0xD076,0xD0A5,INVALC,0xAD66, + 0xD07D,0xAD5E,0xD078,0xD0A4,0xD075,0xD079,0xD07C,INVALC, + INVALC,0xD06D,0xD0A3,0xD07B,INVALC,INVALC,0xD06C,INVALC, + /* Block 132, Array index 0x4400 */ + 0xD070,0xAD5F,0xAD5A,0xAD53,0xAD58,0xAD54,0xAD67,0xD06E, + 0xD3A5,0xAD5B,INVALC,INVALC,0xD07A,0xCE41,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xD3A8,0xAFFA, + INVALC,0xD376,INVALC,0xD3A3,0xD37D,INVALC,0xD3B2,INVALC, + 0xD3AA,INVALC,0xD37E,INVALC,0xD3A9,0xD378,0xD37C,0xD3B5, + 0xAFFD,0xD3AD,0xD3A4,0xAFED,0xD3B3,0xD374,INVALC,0xD3AC, + INVALC,0xAFFC,0xAFF7,0xD373,0xAFF5,0xAFF4,0xAFF9,0xD3AB, + 0xAFF1,0xAFF8,0xD072,0xDB5C,0xD3A6,INVALC,INVALC,0xD37A, + 0xAFFB,0xD37B,0xD3A1,0xAFFE,0xD375,0xD3AF,INVALC,0xD3AE, + 0xD3B6,0xAFF3,0xAFF0,0xD3B4,0xD3B0,0xD3A7,0xD3A2,0xAFF6, + 0xAFF2,0xD377,0xAFEE,0xD3B1,0xAFEF,INVALC,0xD379,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xD75E,0xD760,0xD765,0xD779,0xB2FC, + 0xB2F2,INVALC,0xD75D,0xB2FD,0xB2FE,0xD768,0xD76F,0xD775, + INVALC,0xD762,INVALC,0xD769,INVALC,INVALC,0xB340,0xD777, + 0xD772,0xB2FA,0xB2F8,0xD76E,0xD76A,0xD75C,0xB2EF,0xD761, + 0xD759,INVALC,0xB2F7,0xB2F9,0xD766,0xD763,0xB2F4,0xD773, + 0xB2F1,0xD764,0xD77A,0xD76C,INVALC,0xD76B,0xB2F0,INVALC, + 0xB2FB,INVALC,0xB2F3,0xD75A,0xD75F,0xD770,0xD776,0xB341, + 0xD75B,0xD767,0xD76D,0xB2F6,INVALC,INVALC,0xD778,0xD771, + 0xD774,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xB2F5,INVALC,0xDB6C, + 0xDB60,0xB5D7,0xDB7D,0xDBA7,0xDBAA,0xB5D5,0xDB68,0xDBA3, + 0xDB69,0xDB77,0xB5E2,0xDB73,0xB5DF,INVALC,0xDB74,0xDB5D, + INVALC,0xDBA4,INVALC,INVALC,0xB5E8,0xDBA1,0xDB75,0xDBAC, + 0xDB70,0xDFC8,INVALC,0xDBAF,0xB5E6,0xDB6E,0xDB7A,0xB5E9, + 0xB5D4,0xDB72,0xDBAD,0xDB6B,0xDB64,0xDB6F,INVALC,0xDB63, + 0xDB61,0xB5D0,0xDBA5,0xDB6A,0xDBA8,INVALC,0xDBA9,0xB5D8, + 0xB5DD,0xB5D9,0xB5E1,0xDB7E,0xB5DA,0xDB76,0xDB66,INVALC, + 0xB5D2,0xDB5E,0xDBA2,0xDBAB,0xDB65,0xB5E0,0xDBB0,0xDB71, + /* Block 133, Array index 0x4500 */ + INVALC,0xDB6D,INVALC,0xB5D1,0xB5E5,INVALC,0xDB7C,0xB5E7, + INVALC,0xDB78,0xB5DC,0xB5D6,0xB5DE,0xB5D3,0xB5E4,0xDB79, + 0xDB67,0xDB7B,0xDB62,0xDBA6,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xDBAE,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xDB5F,INVALC,INVALC,INVALC,INVALC, + INVALC,0xDFC7,INVALC,0xDFDD,0xB855,0xDFCC,INVALC,0xDFCA, + 0xDFB5,0xB8A9,0xDFC5,0xDFD9,0xDFC1,0xB8B1,0xDFD8,0xDFBF, + 0xB5E3,0xDFCF,0xDFC0,0xDFD6,0xB8B0,0xB8A8,INVALC,0xDFAA, + 0xDFB2,INVALC,0xDFCB,0xDFC3,0xDFDC,0xDFC6,0xB8B6,0xDFD7, + INVALC,0xB8AD,INVALC,0xDFC9,0xDFD1,0xDFB6,0xDFD0,INVALC, + 0xDFE1,0xDFB1,0xDFD2,INVALC,0xDFDF,INVALC,0xDFAB,0xB5DB, + INVALC,0xDFB9,0xDFB8,0xB8AF,INVALC,0xDFBC,0xDFBE,0xDFCD, + 0xDFDE,0xB8B2,INVALC,0xB8B3,INVALC,0xDFB0,0xB8AB,0xDFB4, + 0xDFDA,0xB8B4,INVALC,0xB8AC,0xB8AE,0xB8B5,0xDFE0,0xDFD3, + 0xDFCE,INVALC,INVALC,0xDFBB,0xDFBA,0xB8AA,0xDFAC,0xB8A7, + 0xDFC4,0xDFAD,0xDFC2,INVALC,INVALC,0xDFB7,0xDFDB,INVALC, + INVALC,INVALC,0xB8A6,INVALC,INVALC,INVALC,0xDFB3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xDFAF,0xDFD5,0xDFAE, + 0xBB60,0xE3D3,INVALC,INVALC,0xE3C2,INVALC,INVALC,0xE3AC, + 0xE3CA,0xBB58,0xE3BB,0xE3C5,0xBB5B,0xE3BE,0xBB59,0xE3AF, + 0xE3CD,0xE3AE,0xE3C1,INVALC,0xE3AD,INVALC,INVALC,0xE3BF, + 0xE3C8,0xE3C6,0xE3BA,0xE3B5,0xE3B3,INVALC,0xE3B4,0xE3C7, + 0xE3D2,0xE3BC,0xBB5A,INVALC,0xE3B7,INVALC,0xE3CB,INVALC, + 0xBB5D,0xE3B6,0xE3B0,0xE3C0,0xBB61,INVALC,INVALC,0xBB55, + 0xBB5E,0xE3B8,0xE3B2,INVALC,0xBB57,0xDFD4,0xBB56,0xE3C3, + INVALC,0xBB54,0xBB63,0xBB5C,0xE3C4,0xE3B9,0xE3B1,0xE3CC, + 0xE3BD,0xBB62,0xE3D0,0xBB5F,0xE3CF,INVALC,0xE3C9,0xE3CE, + INVALC,INVALC,INVALC,0xE3D1,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xE773, + 0xE774,0xE767,0xE766,0xE762,0xBDB4,INVALC,0xBDAC,0xE776, + 0xE775,0xDFA9,0xE75F,0xE763,0xE75D,INVALC,0xE770,0xE761, + INVALC,0xE777,0xE75A,0xE758,0xE764,0xE76E,0xE769,0xBDB6, + /* Block 134, Array index 0x4600 */ + 0xE74F,INVALC,0xE76D,INVALC,INVALC,INVALC,0xBDB7,0xDFBD, + 0xE75B,0xE752,0xE755,0xE77B,0xE75C,0xE753,0xE751,0xE74E, + INVALC,0xBDB0,0xE765,0xBDAF,0xBDB3,0xE760,0xE768,0xBDA9, + 0xE778,0xE77C,0xBDAB,INVALC,0xE757,0xE76B,0xE76F,0xE754, + 0xE779,0xBDB2,INVALC,0xBDB1,0xE74C,0xBDB5,0xE772,0xE756, + 0xE76A,0xE750,0xE75E,0xE759,0xBDAD,0xBDAE,0xE76C,0xE77D, + 0xE77A,0xE771,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xE74D,INVALC,0xBDAA,0xEB49,INVALC, + 0xEB40,0xEB43,INVALC,0xBFBB,0xEB45,0xEAF9,0xEB41,0xEB47, + 0xBFB8,0xBFBC,0xBFB6,INVALC,INVALC,0xEAFB,0xEB4C,INVALC, + INVALC,0xEB46,INVALC,0xEAFC,0xEB55,0xEB4F,0xEAF8,0xEE46, + 0xEAFE,0xBFB7,INVALC,0xEB4A,INVALC,0xEB54,0xBFBF,INVALC, + 0xEB51,0xEAFD,0xEB44,0xEB48,0xEB42,0xEB56,0xEB53,0xEB50, + 0xBFB9,0xBFBA,0xBFBE,0xEAFA,0xEB57,0xBFBD,0xEB4D,INVALC, + INVALC,0xEB4B,INVALC,INVALC,INVALC,0xEB4E,0xEE53,0xEE40, + 0xEE45,0xEE52,0xEE44,0xEDFB,0xEE41,INVALC,0xC1A2,INVALC, + 0xEDF4,0xEE4D,0xEE4F,0xEDF3,0xC1A1,0xEE51,0xEE49,0xC1A8, + 0xEE50,0xEE42,0xC1AA,0xEDF9,0xEB52,0xEE4A,0xEE47,0xEDF5, + 0xEE55,0xC1A4,INVALC,INVALC,0xC1A5,0xEDF7,0xEE48,INVALC, + 0xEE54,0xEE4B,0xEDFD,0xC1A7,0xC1A3,0xEE4C,0xEDFE,0xEE56, + 0xEDF8,0xEE43,0xEE4E,0xEDFA,0xEDFC,INVALC,0xC2CB,0xEDF6, + 0xC1A9,0xC2C4,0xC17E,INVALC,INVALC,INVALC,INVALC,0xC1A6, + 0xC2C8,0xF0B3,INVALC,0xF0A9,0xF0A4,0xF0AA,0xF0B4,0xF0B8, + 0xF0B7,0xC2CA,0xC2C9,INVALC,INVALC,0xF0AB,0xF0B9,0xF0AE, + 0xF0A6,INVALC,0xF0A8,0xF0A7,0xF0AD,0xF0B2,0xF0A5,0xF0AC, + 0xF0B1,0xC2C7,INVALC,0xF0AF,INVALC,0xC2C5,0xF0B0,0xC2C3, + 0xC2C6,0xF2D5,0xF0B5,INVALC,INVALC,0xC3C2,INVALC,0xF2CD, + 0xF2D1,0xF2C9,0xF2CC,INVALC,0xF2D4,0xC3C0,0xF2D9,0xF2D2, + INVALC,0xF2CA,0xF2DA,0xF2D3,0xC3C3,0xC3C4,0xF2D7,INVALC, + 0xF2CB,0xC3BF,0xC3C1,0xF2C6,0xF2CE,0xF2C8,INVALC,0xF2D8, + 0xF2D6,0xF2C7,0xF2CF,INVALC,INVALC,INVALC,0xF4BE,0xC3C5, + 0xF2D0,0xC4A7,0xC4A9,0xC4A6,INVALC,0xF4C3,0xF4BB,0xF4B9, + /* Block 135, Array index 0x4700 */ + 0xF4BD,0xF4BA,INVALC,INVALC,0xF4BF,0xF4C1,0xC4AA,0xC4AC, + INVALC,0xF4C0,0xC4AD,0xC4AB,0xF4C2,INVALC,INVALC,INVALC, + INVALC,0xC4A8,INVALC,INVALC,INVALC,INVALC,INVALC,0xC4F4, + 0xF5F1,0xF5F7,0xC4F6,0xF4BC,0xF5F6,INVALC,0xF5FD,0xF5F4, + 0xF5FB,0xF5FA,0xF4B8,0xF5F5,0xF0B6,0xF5FE,0xF5F3,0xF5F8, + INVALC,0xF5FC,0xF5F2,INVALC,0xF74A,0xC4F5,0xF5F9,INVALC, + INVALC,0xF7F4,0xF74B,0xF749,0xF747,0xF748,0xF74C,INVALC, + 0xC5D9,0xF7F2,0xF7F0,0xF7F5,0xF7F3,INVALC,0xF7F6,0xC5DA, + 0xF7F1,INVALC,INVALC,0xF8BC,INVALC,INVALC,0xF945,0xF946, + 0xF947,INVALC,INVALC,0xF9C7,0xF9BD,0xCA4F,0xAAEA,INVALC, + 0xAD68,INVALC,0xD3B8,0xD3B7,0xB040,0xB342,0xD77C,INVALC, + INVALC,0xD77B,INVALC,0xB5EA,0xB8B8,INVALC,0xB8B7,0xB8B9, + INVALC,0xE3D4,0xE77E,0xEB58,0xEB5A,0xEB59,INVALC,0xC1AB, + 0xEE57,0xF0BA,0xF9A5,0xA6E4,INVALC,0xCDC9,0xCDCA,0xCDC8, + 0xCDC7,0xAAEB,INVALC,0xD0A9,0xD0A7,INVALC,INVALC,0xD0A6, + INVALC,0xAD69,0xAD6B,0xAD6A,0xD0A8,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xD3C4,0xD3C1,0xD3BF, + INVALC,INVALC,0xB041,0xD3C2,0xB046,0xD3BC,0xD3CB,INVALC, + 0xD3CD,0xD3BD,INVALC,0xB043,0xD3CE,0xD3C9,0xD3BB,0xD3C0, + 0xD3CA,0xD3C6,0xD3C3,INVALC,0xB048,0xD3CC,0xD3BE,INVALC, + INVALC,0xD3C7,0xD3B9,0xB047,0xB044,0xD3C5,INVALC,0xD3C8, + 0xD3BA,0xB045,0xB042,INVALC,INVALC,INVALC,INVALC,0xB34C, + 0xD7A5,0xB34B,INVALC,0xD7A8,0xD7AB,0xB348,0xB346,0xD77E, + 0xD7A9,0xD7A7,0xD7A4,0xD7AC,0xD7AD,0xD7AF,0xD7B0,0xD77D, + 0xB345,0xD7A2,0xD7A1,0xD7AE,0xB347,0xD7A3,0xB349,0xB344, + 0xD7A6,0xB34D,INVALC,0xB34A,0xD7AA,INVALC,INVALC,INVALC, + 0xB5F1,0xDBBF,INVALC,0xDBB4,0xB5EE,INVALC,0xDFE7,0xDBBD, + 0xDBB1,0xB5EC,0xDBB6,0xB5EF,0xDBBA,0xDBB8,0xB5F2,0xB5EB, + INVALC,INVALC,0xDBB2,0xDBB5,0xB5F0,INVALC,0xDBB3,INVALC, + 0xDBBE,0xDBBC,0xDBB7,0xDBB9,0xDBBB,0xB5ED,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xDFE8,0xDFEE,0xDFE4, + 0xDFEA,0xB8BA,0xDFE6,0xB8C0,INVALC,INVALC,0xB8BF,INVALC, + /* Block 136, Array index 0x4800 */ + 0xB8BE,0xDFED,0xB8C1,0xB8C2,0xDFE3,0xDFF0,0xB8C3,0xB8BD, + 0xB8BC,0xDFEC,0xB8C4,0xDFE2,0xDFE5,0xDFEF,0xDFEB,INVALC, + INVALC,0xE3F4,0xE3E9,0xB8BB,INVALC,INVALC,INVALC,INVALC, + 0xBB6A,0xE3DD,0xE3F2,0xE3DE,0xBB65,INVALC,0xE3DB,INVALC, + 0xE3E4,0xE3DC,0xBB67,0xE3D6,0xE3F1,0xBB68,0xE3EE,0xE3EF, + 0xE3D7,0xBB6D,0xE3E6,INVALC,0xE3E0,0xE3E7,0xE3DA,INVALC, + 0xE3F3,0xE3EB,0xE3E5,0xE3D5,0xBB69,0xE3EC,INVALC,0xBB6C, + 0xE3F0,INVALC,0xE3EA,0xBB66,0xE3E8,INVALC,0xE3E2,0xBB64, + 0xE3D9,0xE3E1,0xE3ED,0xE3DF,INVALC,INVALC,0xE3E3,INVALC, + INVALC,INVALC,INVALC,INVALC,0xBDC1,0xDFE9,0xE7B2,0xE7BB, + 0xE7B1,0xE7AD,0xE7AA,0xBDC2,0xE7A8,0xBB6B,0xE7A1,0xBDC0, + 0xE7A7,0xBDBF,0xE7AC,0xE7A9,0xE7B9,0xE7B4,0xE7AE,0xE7B3, + 0xBDBB,0xE7AB,0xE7BE,0xE7A2,0xE7A3,0xE7BA,0xBDBC,0xE7BF, + 0xBDBE,0xE7C0,0xE7B0,0xE3D8,0xE7B6,0xE7AF,0xE7B8,0xE7B5, + INVALC,INVALC,INVALC,0xE7A6,0xBDB9,0xE7BD,0xBDBA,0xE7A4, + 0xBDBD,0xEB64,0xE7B7,0xE7BC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xEB61,0xBDB8,0xBFC0,0xEB6B,0xEB67,INVALC,0xEB65, + 0xEB60,0xEB6F,INVALC,INVALC,INVALC,0xBFC4,INVALC,0xEB5C, + 0xEB68,0xEB69,0xEB5F,0xEB5E,0xEB6C,INVALC,0xEB62,0xEB5D, + 0xEB63,INVALC,0xEB6E,0xEB5B,0xEB6D,0xEB6A,0xBFC2,0xBFC1, + INVALC,INVALC,0xBFC3,0xEB66,0xF0CB,INVALC,INVALC,INVALC, + INVALC,INVALC,0xEE59,0xC1B1,0xEE5D,0xEE5A,0xEE61,0xEE67, + 0xEE5C,INVALC,0xEE70,0xC1AE,0xEE6A,0xEE5F,0xEE6B,0xEE66, + 0xEE6D,0xEE5E,0xC1B3,0xC1B2,0xEE60,0xEE6E,0xEE58,0xEE6C, + 0xC1AC,INVALC,0xEE64,0xEE63,0xEE68,0xEE5B,0xC1B0,INVALC, + 0xC1B4,0xEE62,0xEE69,0xC1B5,0xEE65,INVALC,INVALC,INVALC, + INVALC,0xC1AD,0xC1AF,0xF0C7,0xF0C5,INVALC,INVALC,0xF0CC, + 0xF0C9,0xF0CD,INVALC,0xF0BE,0xF0C6,0xF0D1,0xEE6F,0xF0C2, + 0xC2CF,0xE7A5,0xF0BD,0xF0CA,0xF0C4,0xF0C1,0xF0BC,0xF0BB, + 0xF0D0,INVALC,0xF0C0,0xF0BF,0xC2CD,0xF0C8,INVALC,0xC2CC, + INVALC,INVALC,0xC2CE,0xF0C3,0xF0CF,INVALC,0xF2DE,0xF2DF, + INVALC,0xC3C9,0xF2DC,0xC3C6,0xF2E4,INVALC,0xC3CA,0xF2E6, + /* Block 137, Array index 0x4900 */ + 0xF2DB,0xF0CE,0xF2E8,0xF2DD,INVALC,0xC3C7,0xF2E3,INVALC, + 0xF2E5,0xF2E0,0xF2E7,0xF2E2,0xF2E1,0xC3C8,INVALC,INVALC, + 0xF4C5,0xF4C6,INVALC,0xF4C8,0xC4AE,0xC4AF,0xF4C9,0xF4C7, + INVALC,0xF4C4,INVALC,0xF642,0xF645,0xF641,INVALC,0xC4FA, + 0xF643,0xC4F9,0xC4F8,0xC4F7,0xF644,0xF751,0xF74F,INVALC, + 0xF74E,0xF640,0xF750,0xF646,0xF74D,INVALC,0xF7F9,0xF7D7, + 0xF7F7,0xC5DB,0xF7F8,0xF7FA,INVALC,0xF8BF,0xC5FA,0xF8BE, + 0xF8BD,0xC5FB,INVALC,0xC65A,0xF96E,0xF9A7,0xF9A6,0xF9A8, + 0xA6E5,0xD0AA,INVALC,0xD3CF,0xD3D0,INVALC,INVALC,INVALC, + 0xDBC0,INVALC,0xF647,0xF8C0,0xA6E6,0xAD6C,0xD0AB,INVALC, + INVALC,INVALC,0xD7B1,0xB34E,INVALC,0xDBC2,0xDBC1,0xB5F3, + INVALC,0xB8C5,0xE7C1,0xBDC3,INVALC,0xBDC4,INVALC,INVALC, + INVALC,0xBFC5,0xC5FC,0xA6E7,INVALC,INVALC,INVALC,0xD0AC, + 0xAAED,0xD0AE,0xD0AD,0xAD6D,INVALC,0xD3D1,INVALC,0xD3D8, + 0xB049,0xD3D6,0xD3D4,INVALC,0xD3DB,0xD3D2,0xD3D3,0xB04A, + INVALC,0xB04E,INVALC,INVALC,0xD3DC,0xB04D,0xD3DA,0xD3D7, + 0xD3D5,0xB04B,0xB04C,0xD3D9,INVALC,INVALC,INVALC,INVALC, + 0xB350,0xD7B2,INVALC,0xB355,0xD7C2,0xB354,0xD7C4,INVALC, + INVALC,0xD7B8,0xB352,0xD7C3,INVALC,0xD7B3,0xB353,0xD7BF, + 0xD7BB,0xD7BD,0xD7B7,0xD7BE,INVALC,INVALC,0xB34F,0xD7BA, + INVALC,0xD7B9,0xD7B5,INVALC,0xD7C0,INVALC,INVALC,0xD7BC, + 0xD7B4,INVALC,0xD7B6,0xB351,0xD7C1,INVALC,INVALC,INVALC, + INVALC,0xB5F6,0xDBCD,INVALC,INVALC,INVALC,0xDBC9,0xDBCB, + 0xDBC6,0xDBC5,0xDBC3,INVALC,0xDBCA,0xDBCC,0xDBC8,INVALC, + 0xDBC7,0xB5F4,0xB5F5,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xDBCF,0xB8CD,0xDFF2,0xDFF8,0xDFF3,0xDFF4,INVALC, + 0xDFF9,INVALC,0xB8CF,INVALC,0xB8C7,0xB8CE,0xDFF1,0xDBC4, + 0xB8CA,0xB8C8,0xDFF7,0xDFF6,0xB8C9,0xB8CB,0xDFF5,0xB8C6, + INVALC,0xB8CC,INVALC,INVALC,INVALC,INVALC,INVALC,0xE3F6, + 0xBB74,INVALC,INVALC,0xE442,0xE441,INVALC,0xE3FB,0xBB76, + 0xE440,0xE3F7,0xE3F8,0xBB6E,0xBB70,INVALC,0xE3FD,0xE3F5, + 0xBB72,0xBB71,0xE3F9,0xE3FE,0xE3FC,0xBB73,0xE3FA,INVALC, + /* Block 138, Array index 0x4A00 */ + INVALC,0xDBCE,0xBB6F,INVALC,INVALC,0xE7C2,0xE7C9,0xBDC6, + INVALC,0xE7CD,0xBDCA,0xE7C5,0xE7C3,INVALC,0xE7CC,INVALC, + 0xBDC5,0xE7CB,0xBDC7,0xBDC8,0xE7C4,0xBDC9,0xE7CA,0xE7C6, + 0xE7C7,0xE7C8,0xBB75,INVALC,INVALC,INVALC,0xEB70,0xEB7C, + INVALC,0xBFCA,0xEB77,0xEB79,INVALC,0xBFC8,0xEB71,0xEB75, + INVALC,0xEB78,0xBFC6,0xBFC9,0xEB7B,0xEB73,0xEB74,0xEB7A, + 0xEB72,0xEB76,0xBFC7,0xEE72,INVALC,0xEE71,0xC1B7,0xEE77, + 0xC1B9,INVALC,INVALC,0xC1B6,0xEE73,0xC1BA,0xEE74,INVALC, + INVALC,0xEE75,0xEE78,INVALC,0xC1B8,INVALC,0xF0D6,INVALC, + INVALC,0xF0D9,INVALC,0xF0D3,0xF0D5,INVALC,INVALC,0xF0D4, + 0xF0D7,0xF0D8,0xEE76,0xF0D2,INVALC,INVALC,0xC3CD,0xF2EC, + 0xF2EF,0xF2F1,0xF2EA,0xF2EB,0xF2EE,0xF2F0,0xC3CE,0xC3CC, + 0xC3CB,0xF2ED,0xF2E9,0xF4CA,0xC4B0,INVALC,0xF4CB,INVALC, + INVALC,0xF649,0xC4FB,0xF64B,0xC4FC,0xF648,0xF64A,0xC5A8, + INVALC,0xF752,0xC5A7,0xF7FD,0xF7FC,INVALC,0xF7FB,INVALC, + INVALC,0xF948,0xF949,0xF94B,0xF94A,INVALC,0xCA50,0xA6E8, + INVALC,0xAD6E,0xD7C5,0xB5F7,INVALC,0xDFFA,0xC2D0,INVALC, + 0xF2F2,INVALC,INVALC,0xA8A3,INVALC,INVALC,INVALC,0xB357, + INVALC,INVALC,INVALC,0xB356,INVALC,0xDBD0,0xB5F8,0xDBD2, + 0xDBD1,INVALC,INVALC,0xDFFB,0xB8D0,0xE443,0xE446,0xE445, + INVALC,0xE444,0xE7CE,0xE7D0,0xE7CF,INVALC,0xBFCC,INVALC, + INVALC,INVALC,0xBFCB,INVALC,0xC1BB,0xEE79,0xEE7B,0xEE7A, + INVALC,INVALC,0xC2D1,INVALC,INVALC,INVALC,0xF2F4,0xF2F3, + INVALC,0xF4CC,0xC4B1,INVALC,INVALC,0xC4FD,0xF754,0xF753, + 0xC65B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xA8A4,0xD0AF,0xAD6F,0xD7C8,0xD7C6,INVALC, + INVALC,0xD7C7,0xDBD4,0xDBD5,0xE043,0xDBD3,INVALC,0xDFFC, + 0xE041,0xE040,0xE042,0xB8D1,0xDFFE,0xDFFD,0xE044,INVALC, + 0xE449,0xE447,INVALC,0xE448,0xE7D3,0xE7D1,INVALC,INVALC, + 0xE7D2,0xEB7D,0xEE7C,0xEE7D,0xC2D2,INVALC,0xF2F5,0xF4CD, + 0xC4B2,INVALC,0xF64C,0xF755,0xC5A9,INVALC,0xF7FE,0xF94C, + /* Block 139, Array index 0x4B00 */ + 0xA8A5,INVALC,0xAD71,0xAD72,0xD0B0,INVALC,INVALC,0xD0B1, + 0xAD70,INVALC,0xB054,INVALC,0xB052,INVALC,0xB051,0xB058, + 0xB050,0xB059,0xD3DD,0xB056,INVALC,0xB053,0xB057,0xB055, + 0xB04F,INVALC,INVALC,0xB35F,INVALC,0xB359,0xD7CC,0xB35E, + INVALC,INVALC,0xB360,0xB35A,INVALC,0xB35B,INVALC,0xD7CA, + INVALC,INVALC,0xB358,INVALC,0xD7CB,0xB35D,INVALC,INVALC, + 0xD7C9,0xB35C,INVALC,INVALC,0xB644,INVALC,0xB646,INVALC, + INVALC,0xDBD8,0xB645,0xB5F9,0xB5FD,INVALC,0xB8E4,0xE049, + 0xDBDA,0xB5FE,INVALC,INVALC,0xDBDD,0xDBDE,0xB643,INVALC, + 0xDBE0,INVALC,0xDBE2,INVALC,0xDBE3,0xDBD7,0xDBD6,0xDBE4, + 0xB642,0xDBE1,0xDBDF,INVALC,0xB640,0xB5FB,0xB647,0xDBDB, + 0xDBDC,0xDBD9,INVALC,0xB641,INVALC,INVALC,0xB5FC,INVALC, + 0xB5FA,0xE048,0xB8DF,0xB8DA,INVALC,INVALC,0xB8D5,INVALC, + 0xB8E5,0xB8D6,INVALC,0xB8D2,0xB8E1,0xB8DE,0xB8E0,INVALC, + 0xB8D7,0xB8DC,0xB8D3,0xB8D4,0xE050,0xE04D,0xE045,0xE04A, + INVALC,0xB8E2,0xE051,0xB8E3,0xB8D9,INVALC,INVALC,0xE047, + INVALC,0xE04F,0xE04B,0xE04E,0xE04C,0xB8DD,0xE046,0xB8D8, + INVALC,INVALC,INVALC,0xE44C,0xBB78,0xBB7B,INVALC,0xE44E, + INVALC,0xBBA5,0xE44D,0xBB7D,INVALC,0xBDCF,0xE44F,INVALC, + 0xBBA4,0xE44B,0xBBA6,INVALC,INVALC,INVALC,0xBB79,INVALC, + 0xB8DB,0xBB7C,INVALC,0xBB7A,0xBB7E,0xBBA2,0xBB77,0xBBA7, + 0xBBA3,INVALC,0xBBA1,0xE44A,INVALC,INVALC,INVALC,INVALC, + 0xBDD6,INVALC,0xBDD2,INVALC,INVALC,INVALC,0xBDD9,INVALC, + 0xE7D6,0xBDDA,0xE7E2,0xE7DB,0xBDCB,0xE7E3,0xE7DD,0xBDD5, + 0xE7DE,INVALC,0xBDD4,0xE7E1,0xBDCE,0xE7DF,0xE7D5,0xBDCD, + 0xEBAA,0xBDD3,INVALC,0xBDD0,INVALC,0xBDD8,INVALC,0xE7D4, + INVALC,0xE7D8,0xBDCC,0xE7D7,0xE7D9,0xE7DA,0xBDD7,0xE7DC, + 0xE7E0,0xE7E4,INVALC,0xBDDB,0xBFD2,0xEBA5,0xEBAB,0xEBA8, + 0xEB7E,0xEBAC,0xEBA1,INVALC,0xEBA7,INVALC,0xBFCD,0xBFD3, + 0xEBAD,INVALC,INVALC,0xBFCF,INVALC,0xBFD9,0xBFD4,0xEBAF, + 0xEBA9,0xBFD0,0xEBA2,0xBFDA,0xEBA3,0xEBA4,0xBFDB,0xBFD8, + 0xBDD1,INVALC,0xBFCE,0xEBB0,0xBFDC,INVALC,0xBFD5,0xEBAE, + /* Block 140, Array index 0x4C00 */ + 0xBFD1,0xBFD6,0xBFD7,INVALC,0xC1C3,0xEEA4,0xEEAD,0xEEAA, + 0xEEAC,INVALC,0xC1C0,0xEEA5,INVALC,0xEEAB,0xC1BC,0xEEA7, + 0xC1C4,0xEEA3,0xEEA8,0xEEAF,0xEBA6,0xEEA9,0xEEA2,0xC1BD, + 0xEEA1,0xC1BE,0xEEB0,0xC1BF,0xEEAE,0xC1C2,0xEE7E,INVALC, + 0xC1C1,INVALC,0xEEA6,0xF0DC,0xF0EA,0xF0E5,0xF0E7,0xF0DB, + 0xC2D3,INVALC,0xF0DA,0xC2D6,0xC2D5,INVALC,0xF0E9,0xF0E1, + 0xF0DE,0xF0E4,INVALC,0xF0DD,INVALC,0xF0DF,0xF0E8,0xF0E6, + INVALC,0xC2D4,0xF0ED,0xF0EB,0xF0E2,0xF0EC,0xF0E3,INVALC, + 0xF2F9,0xC3CF,0xF341,INVALC,INVALC,0xF64F,0xC3D6,0xF0E0, + 0xF2F7,0xC3D2,0xF2F8,0xF2FD,INVALC,INVALC,0xC3D4,0xC3D5, + 0xF2F6,0xF340,0xF342,0xF2FA,0xF2FC,0xF2FE,0xF2FB,0xF343, + 0xC3D1,0xC3D7,0xC3D3,INVALC,0xC3D0,0xF4D0,INVALC,0xC4B7, + 0xF4CE,INVALC,INVALC,0xF4D2,INVALC,0xF4D3,0xC4B5,0xF4D4, + 0xF4D1,INVALC,0xF4CF,0xC4B8,0xC4B4,0xF4D5,INVALC,0xC4B6, + 0xC4B3,INVALC,INVALC,INVALC,0xC4FE,INVALC,INVALC,0xC540, + 0xF64E,0xF64D,0xF650,0xF651,INVALC,0xC541,0xF756,0xF75B, + 0xC5AA,INVALC,0xF758,INVALC,0xF757,0xF75A,0xF759,INVALC, + 0xF843,INVALC,0xC5DC,0xF842,0xF840,INVALC,0xF841,INVALC, + INVALC,INVALC,0xC5FE,0xC5FD,0xF8C1,0xF8C2,0xC640,INVALC, + 0xF94D,0xF94E,0xC667,INVALC,0xC66D,INVALC,0xF9A9,0xF9C8, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x4D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xA8A6, + INVALC,0xD7CD,INVALC,0xD7CE,0xE052,0xE450,0xE7E5,0xC1C6, + INVALC,0xC1C5,0xF0EE,0xF344,INVALC,0xF844,0xA8A7,0xD3DE, + 0xB05A,0xB361,0xE054,0xE053,0xBDDC,0xE7E6,0xBDDD,0xEEB1, + 0xC2D7,INVALC,INVALC,INVALC,0xC676,0xA8A8,0xCDCB,0xD3DF, + INVALC,INVALC,0xB362,INVALC,0xD7CF,0xD7D0,INVALC,0xDBE5, + INVALC,0xB648,0xB8E6,INVALC,0xE056,0xE055,0xE057,INVALC, + 0xE451,0xE452,0xBBA8,0xBFDD,0xBDDE,0xBFDE,INVALC,0xEEB5, + 0xEEB2,0xEEB4,0xEEB3,0xC1C7,INVALC,0xF0EF,0xF346,0xF345, + 0xCBA4,0xB05C,0xB05B,0xD3E0,INVALC,0xD7D1,INVALC,INVALC, + 0xDBE7,0xDBE6,0xB649,INVALC,0xE059,0xE05A,0xE058,INVALC, + INVALC,0xB8E8,0xB8E7,INVALC,0xBBAA,0xBBA9,INVALC,0xE7E7, + 0xEBB3,0xEBB1,0xEBB2,0xBFDF,0xEEB7,0xEEB6,INVALC,0xF0F2, + 0xF0F1,0xF0F0,0xF347,INVALC,0xF9AA,0xA8A9,0xAD73,INVALC, + 0xAD74,0xB05D,0xB05E,0xD3E2,0xD3E1,0xD7D2,INVALC,0xB368, + 0xB366,0xB363,0xB367,0xB365,0xB364,INVALC,INVALC,0xB64A, + 0xDBEA,INVALC,0xB8ED,0xB64C,0xB651,0xDBEC,0xB653,0xB652, + 0xB655,0xDBEB,0xDBE8,0xB64F,0xB64B,0xB64D,0xDBE9,0xB654, + 0xB650,0xB64E,0xB8EF,0xB8EE,0xB8EC,0xB8F0,INVALC,0xB8EA, + 0xB8EB,INVALC,0xB8E9,INVALC,0xE05B,INVALC,INVALC,0xE454, + INVALC,0xBBAC,0xBBAD,0xBBAB,INVALC,0xE453,INVALC,0xE455, + INVALC,0xE7EA,0xE7EC,INVALC,0xBDE7,0xE7ED,0xBDE0,0xE7E9, + 0xBDDF,0xBDE9,0xBDE5,0xBDE6,0xBDE2,0xE7E8,0xBDE1,0xE7EE, + 0xE7EB,INVALC,0xBDE8,INVALC,0xBDE3,0xBDE4,0xEBB5,INVALC, + 0xEBB7,0xEBB6,INVALC,0xEBB8,0xBFE0,0xEBB4,INVALC,INVALC, + 0xC1CB,0xEEB8,0xC1C8,0xC1CC,0xC1CA,0xC1C9,0xF0F3,INVALC, + /* Block 142, Array index 0x4E00 */ + 0xF0F6,INVALC,0xF0F5,INVALC,0xF0F4,0xC2D8,0xF348,0xF349, + 0xC3D8,0xF34A,0xC3D9,INVALC,INVALC,0xC4BA,INVALC,0xC4B9, + 0xF652,INVALC,INVALC,0xC542,0xF653,0xF75C,0xC5AB,0xC5AC, + INVALC,0xF845,INVALC,0xC642,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA8AA,INVALC,0xB36A,0xB369, + 0xE05C,0xE05D,INVALC,0xBBAE,0xEBB9,0xBDEA,0xEBBA,0xEEB9, + 0xA8AB,INVALC,0xD0B2,0xAD76,0xAD75,INVALC,0xD3E3,0xB05F, + 0xD3E4,0xD7D5,INVALC,0xD7D4,INVALC,0xD7D3,INVALC,INVALC, + 0xDBEE,0xB658,INVALC,INVALC,0xDBED,0xB657,INVALC,INVALC, + INVALC,0xDBEF,0xB656,INVALC,0xE05F,0xE062,0xE060,0xE061, + 0xE065,0xE05E,0xE066,0xE063,0xE064,0xBBB0,0xE456,INVALC, + INVALC,0xBBAF,INVALC,0xE7F2,0xE7F0,INVALC,INVALC,0xBDEB, + 0xE7EF,0xE7F1,INVALC,0xBDEC,INVALC,0xEBBB,INVALC,0xEBBC, + 0xC1CD,INVALC,0xF34C,0xF34E,0xF34B,0xF34D,0xF4D6,0xF654, + INVALC,INVALC,0xF96F,0xA8AC,0xAD77,0xD3E5,0xD3E7,0xD3E6, + INVALC,0xD7D8,0xB36C,INVALC,0xD7D6,INVALC,0xB36B,0xD7D9, + INVALC,0xD7DA,0xD7D7,INVALC,INVALC,0xDBFB,0xB660,0xDBF3, + 0xDBF9,INVALC,INVALC,0xB65B,0xB65E,0xDBF2,0xB659,0xDBF6, + 0xE06C,0xB65D,INVALC,0xDBF1,INVALC,0xDBF7,0xDBF4,0xDBFA, + 0xDBF0,0xDBF8,0xB65C,0xB65F,0xDBF5,0xB65A,INVALC,0xB8F2, + 0xE068,0xB8F1,0xE06F,0xE06E,0xB8F8,INVALC,0xB8F9,0xE070, + 0xB8F3,0xE06D,0xB8F7,0xE072,0xE069,INVALC,0xE06B,0xB8F4, + 0xE067,0xE06A,0xE071,0xB8F5,0xE073,INVALC,INVALC,INVALC, + INVALC,INVALC,0xB8F6,INVALC,0xBBB1,0xE45B,0xE461,0xE459, + /* Block 143, Array index 0x4F00 */ + 0xE462,INVALC,0xE458,0xE45D,0xE463,0xE460,0xE45F,0xE45E, + INVALC,0xE457,0xE45C,INVALC,INVALC,0xE45A,INVALC,0xBDF1, + 0xBDEE,0xE7FB,0xE841,0xE843,0xE840,0xE7F8,0xE7FA,0xE845, + 0xE842,0xE7FC,0xE846,0xE7F9,0xE844,0xBDEF,0xBDF5,0xBDF3, + 0xE7F3,0xBDF4,0xBDF0,0xE7F4,0xE7F6,0xE7F5,0xE7FD,0xE7FE, + INVALC,0xBDF2,INVALC,0xBDED,INVALC,INVALC,0xE7F7,INVALC, + 0xEBC6,0xBFE2,INVALC,0xEBBD,0xBFE3,0xBFE6,0xEBC2,INVALC, + 0xEBBF,0xBFE5,INVALC,INVALC,0xEBC3,0xEBC4,0xEBBE,0xEBC7, + 0xEBC0,0xEBC5,0xBFE4,INVALC,0xBFE1,0xEBC1,INVALC,0xEEBF, + 0xC1D0,0xC1CE,0xC1D1,0xC1CF,0xEEBE,0xEEBB,0xEEBA,INVALC, + 0xEEBD,INVALC,INVALC,0xEEBC,0xF145,0xC2DE,0xF0FB,0xF0FA, + INVALC,0xC2D9,0xF141,0xF140,0xF0F7,0xF143,0xF0FC,0xC2DD, + 0xF0F9,0xF142,0xF0F8,0xC2DA,0xC2DC,0xF0FD,0xC2DB,0xF0FE, + INVALC,0xF144,0xF352,INVALC,0xC3DE,0xF34F,INVALC,0xF353, + INVALC,INVALC,0xC3DB,0xF351,0xC3E0,INVALC,0xC3DD,INVALC, + 0xF350,INVALC,0xC3DF,0xF354,0xC3DA,INVALC,INVALC,INVALC, + INVALC,0xC4BC,0xC4BE,INVALC,0xF4D9,0xC4BD,0xF4D7,0xC3DC, + 0xF4D8,0xC4BB,0xC543,0xC545,0xF656,0xC544,0xF655,INVALC, + 0xF761,0xC5AD,0xF760,0xC5AE,0xF75E,0xF75D,0xF762,0xF763, + 0xF846,INVALC,0xF75F,INVALC,INVALC,0xF8C6,0xF8C3,0xF8C4, + 0xF8C5,0xC65C,INVALC,0xF951,0xF950,0xF94F,0xF970,INVALC, + 0xF9BE,0xF9AB,0xC66E,0xA8AD,0xB060,INVALC,INVALC,INVALC, + INVALC,INVALC,0xB8FA,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xBDF6,INVALC,INVALC,0xEBC8,INVALC,INVALC, + 0xC2DF,INVALC,0xF355,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF9AC,0xA8AE,0xAAEE,0xAD79,0xAD78,INVALC,0xB063, + INVALC,0xD3E8,0xB061,0xD3E9,0xB062,INVALC,INVALC,0xD7DF, + 0xD7DB,INVALC,INVALC,0xB36D,0xD7DE,0xD7DD,0xD7DC,0xB36E, + 0xD7E0,0xD7E1,INVALC,INVALC,INVALC,0xDC43,0xDC41,0xDC45, + 0xDC46,0xDC4C,INVALC,0xDC48,0xDC4A,INVALC,0xDC42,0xDBFC, + INVALC,0xDC49,INVALC,INVALC,0xDC4B,0xDC44,0xDC47,0xDBFD, + 0xB662,0xDC40,0xDBFE,0xB661,0xB663,INVALC,0xB8FD,0xE075, + /* Block 144, Array index 0x5000 */ + 0xE077,0xE076,0xE07B,0xB8FB,INVALC,0xE078,0xE074,0xE079, + 0xE07A,0xB8FC,0xB8FE,0xE07C,INVALC,0xE467,0xE466,INVALC, + 0xE464,0xE465,0xBBB3,0xBBB5,0xBBB2,0xBBB4,0xE84D,0xE84E, + 0xE849,INVALC,0xE84A,0xBDF8,0xBDFD,0xBDF7,0xBDFE,0xBDF9, + 0xE84B,INVALC,INVALC,0xE84C,0xE848,0xBE40,0xBDFB,INVALC, + INVALC,0xBDFA,0xBDFC,INVALC,0xE847,INVALC,0xEBCA,0xBFE8, + INVALC,INVALC,0xEBCC,0xBFEA,0xEBCF,0xEBCB,0xEBC9,0xEBCE, + 0xBFE9,0xEBCD,INVALC,0xBFE7,INVALC,INVALC,0xC1D3,0xC1D6, + 0xEEC1,INVALC,0xC1D4,0xEEC0,0xC1D2,0xC1D5,0xF146,0xF147, + 0xF148,0xC2E0,INVALC,0xF149,INVALC,0xC2E1,0xC3E2,0xF358, + 0xF359,0xF357,0xF356,0xF35A,0xC3E1,0xF4DD,0xF4DB,0xF4DC, + 0xF4DE,0xF4DA,0xF4DF,0xF658,INVALC,0xF659,0xF657,0xC546, + 0xF764,0xC5AF,0xF765,0xF848,0xF847,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xA8AF,0xB664,INVALC,INVALC,0xB940, + INVALC,INVALC,INVALC,0xBBB6,INVALC,INVALC,0xBFEC,INVALC, + 0xBFEB,INVALC,INVALC,INVALC,INVALC,0xC3E3,0xC47C,0xC547, + 0xA8B0,0xB064,0xB941,INVALC,0xF35B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xCBA6, + INVALC,INVALC,0xA8B1,INVALC,0xA8B4,0xA8B3,0xA8B2,INVALC, + INVALC,0xCBA5,INVALC,0xCDCD,INVALC,0xCDCF,0xAAEF,INVALC, + INVALC,0xAAF1,0xCDCC,0xCDCE,0xAAF0,0xCDD1,0xCDD0,0xCDD2, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xD0B6,0xD0B4,0xAD7C,0xD0B3,0xADA3,0xAD7E,0xAD7B,INVALC, + 0xADA4,INVALC,0xAD7D,0xADA2,INVALC,0xADA1,0xD0B5,INVALC, + 0xAD7A,INVALC,INVALC,INVALC,0xB06A,0xD3EB,0xD3F1,0xB067, + 0xB06E,INVALC,0xB069,0xD3EE,0xD3F0,0xB06C,0xD3EA,0xD3ED, + /* Block 145, Array index 0x5100 */ + 0xB068,0xB065,0xD3EC,0xB06B,0xD3EF,0xB06D,0xB066,INVALC, + INVALC,INVALC,INVALC,0xD7E3,0xD7E6,0xB370,INVALC,0xB37A, + 0xB376,0xD7E4,INVALC,INVALC,0xB37E,0xB377,0xB37C,0xB372, + INVALC,0xB36F,0xB371,0xB37D,0xD7E5,0xB375,0xB378,0xB374, + 0xB379,0xD7E7,0xB37B,0xB373,0xD7E2,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xDC4D,0xB665,0xDC4F, + INVALC,0xB667,0xB669,INVALC,0xDC4E,0xB666,0xB66A,INVALC, + 0xB668,INVALC,INVALC,INVALC,0xB947,0xE0A3,0xB94F,0xE07E, + INVALC,0xB950,0xB945,INVALC,0xE0A1,INVALC,INVALC,0xB94A, + INVALC,0xE0A2,0xB943,0xB942,INVALC,0xB94D,0xB94C,0xB94B, + 0xB949,0xB94E,0xE07D,0xB944,0xB946,0xB948,INVALC,INVALC, + 0xBBB8,0xBBBB,INVALC,0xBBBF,0xBBB9,0xBBBE,0xBBBC,INVALC, + 0xBBB7,INVALC,0xBBBD,0xBBBA,INVALC,INVALC,INVALC,0xE852, + 0xBE43,0xBE41,INVALC,0xE853,INVALC,0xBE44,0xBE42,0xE851, + 0xE850,INVALC,0xBFF0,0xE84F,0xBFEE,0xBFED,0xEBD0,0xBE45, + 0xBFEF,0xEBD1,0xBFF2,0xEBD2,0xBFF1,0xC1D8,0xEEC3,0xC1D7, + 0xC1DC,0xC1DA,0xC1DB,0xC2E3,0xC1D9,0xEEC2,0xEBD3,0xC2E2, + 0xC2E4,INVALC,0xC3E4,0xC3E5,INVALC,0xF4E0,INVALC,0xC5DE, + 0xC5DD,0xA8B6,INVALC,INVALC,0xCA55,0xB06F,INVALC,0xCA52, + 0xCA53,0xCA51,INVALC,0xCA54,INVALC,INVALC,0xCBAA,0xCBA7, + 0xCBAC,0xCBA8,0xA8B7,0xA8BA,INVALC,0xCBA9,0xA8B9,0xCBAB, + INVALC,INVALC,0xA8B8,INVALC,INVALC,INVALC,INVALC,0xCDD5, + 0xCDD7,0xAAF4,0xCDD3,0xCDD6,0xCDD4,0xAAF2,0xAAF5,INVALC, + 0xAAF3,INVALC,INVALC,INVALC,INVALC,0xD0B8,0xD0BC,0xD0B9, + INVALC,0xADA7,INVALC,0xADA8,INVALC,0xD0BB,INVALC,0xD0BD, + 0xD0BF,INVALC,0xADA5,0xD0BE,INVALC,INVALC,0xADA6,INVALC, + INVALC,INVALC,INVALC,INVALC,0xD7EE,0xD0BA,0xD3F2,0xD3FB, + 0xD3F9,0xD3F4,0xD3F5,0xD3FA,0xD3FC,0xB071,INVALC,0xD3F7, + 0xD3F3,0xB070,0xB072,0xD3F6,0xD3FD,0xD3F8,INVALC,INVALC, + 0xB3A1,0xD7F1,0xD7E9,0xD7EF,0xD7F0,0xB3A2,INVALC,0xD7E8, + 0xD7EA,0xD0B7,0xD7EC,0xD7ED,0xD7EB,0xB66C,INVALC,INVALC, + INVALC,0xDC56,0xEBD4,0xDC57,0xDC54,0xB3A3,0xB66E,0xDC53, + /* Block 146, Array index 0x5200 */ + 0xDC59,0xDC58,0xB66B,0xDC5C,0xDC52,0xDC5B,0xDC50,0xDC5A, + 0xDC55,0xB66D,INVALC,0xE0AA,INVALC,0xE0A5,0xE0AB,0xE0A6, + 0xE0A4,0xE0A7,0xB951,INVALC,0xE0A9,INVALC,0xE0A8,0xB952, + 0xBBC1,0xBBC0,0xE46E,0xE471,0xE469,0xE46D,0xBBC2,0xE46C, + 0xE46A,0xE470,0xE46B,0xE468,0xE46F,INVALC,0xE859,0xBE48, + 0xF14A,0xE856,0xE857,0xE855,0xDC51,0xBE47,0xE85A,0xE854, + 0xBE46,0xBE49,0xE858,0xEBD5,0xBFF3,0xEBD6,0xEBD7,INVALC, + 0xEEC4,0xC1DD,0xF14B,0xF14C,INVALC,INVALC,0xF14D,0xF35D, + 0xF35C,0xF4E2,INVALC,0xF4E1,0xF65B,0xF65C,0xF65A,0xF766, + 0xC5B0,0xA8BB,0xADAA,0xADA9,0xB075,0xB074,0xD440,0xD441, + 0xD3FE,INVALC,0xB073,0xD7F5,INVALC,0xD7F6,0xD7F2,0xB3A4, + 0xD7F3,INVALC,0xD7F4,INVALC,INVALC,INVALC,INVALC,0xDC5F, + 0xDC61,0xDC5D,0xDC60,0xB66F,0xDC5E,0xB670,INVALC,INVALC, + 0xDD73,0xB955,0xB954,INVALC,0xB953,INVALC,0xE0AC,0xE0AD, + INVALC,INVALC,0xE473,0xE475,0xBBC6,0xBBC3,INVALC,0xBBC5, + 0xBBC4,0xE474,0xE472,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xE861,0xE85E,0xE85F,0xBE4D,0xE860,0xE85B,0xE85C,0xBE4A, + INVALC,0xBE4B,0xE85D,0xBE4C,INVALC,0xEBDB,INVALC,0xEBDC, + 0xEBD9,0xEBDA,0xBFF4,0xEBD8,INVALC,INVALC,INVALC,INVALC, + INVALC,0xEEC8,0xEEC5,0xEEC7,0xC1E0,0xEECB,0xC1DF,0xEEC9, + 0xEECC,0xEECA,0xEEC6,0xC1DE,INVALC,0xF14F,INVALC,0xF150, + 0xF14E,INVALC,0xF152,0xC2E5,0xC2E6,0xF35F,0xC3E7,0xF151, + 0xF35E,0xC3E6,0xF4E5,0xF4E6,0xC4BF,0xF4E4,INVALC,0xF4E3, + INVALC,0xF65D,0xC548,INVALC,0xF849,0xF8C8,0xF8C7,INVALC, + 0xC643,0xC65D,0xF8C9,0xF971,INVALC,0xC66F,0xA8BC,0xAAF6, + INVALC,0xB956,INVALC,0xC4C0,0xA8BD,0xADAB,0xB3A5,0xB671, + 0xC2E7,0xAAF7,INVALC,0xD0C1,0xD0C0,0xD442,INVALC,0xB078, + 0xB076,0xB07A,0xD444,INVALC,0xB079,0xB077,INVALC,INVALC, + INVALC,INVALC,0xD443,0xB3A8,0xD7FC,INVALC,0xB3A7,0xB3A9, + 0xD842,0xB3AB,0xD7FE,0xD840,0xD7F7,0xB3AA,0xD843,INVALC, + INVALC,0xD7F9,INVALC,0xD7FA,0xD7F8,0xB3A6,INVALC,0xD841, + 0xD7FB,0xD7FD,INVALC,INVALC,INVALC,0xDC6D,INVALC,0xDC6C, + /* Block 147, Array index 0x5300 */ + 0xDC6A,0xDC62,0xDC71,0xDC65,0xDC6F,0xDC76,0xDC6E,0xB679, + INVALC,0xB675,0xDC63,INVALC,0xDC69,0xB677,INVALC,0xDC68, + 0xB678,0xB67A,0xDC6B,INVALC,0xB672,0xB673,0xDC77,0xDC75, + INVALC,0xDC74,0xDC66,INVALC,0xDC72,INVALC,0xB676,INVALC, + INVALC,INVALC,INVALC,0xB674,0xDC73,0xDC64,0xDC67,0xDC70, + INVALC,INVALC,INVALC,INVALC,INVALC,0xE4BA,0xE0B7,INVALC, + 0xE0B0,0xE0C3,0xE0CC,0xE0B3,0xB961,INVALC,0xE0C0,0xB957, + 0xB959,0xB965,0xE0B1,INVALC,INVALC,0xB95A,0xB95C,0xB966, + 0xB95B,INVALC,INVALC,INVALC,INVALC,0xB964,0xE0B9,INVALC, + 0xE0AE,0xB962,0xE0B8,0xB95E,0xE0CA,0xB963,0xE0C8,0xE0BC, + 0xE0C6,0xB960,0xE0AF,0xE0C9,0xE0C4,INVALC,0xE0CB,0xB958, + INVALC,INVALC,0xB967,0xB95D,INVALC,INVALC,0xE0B5,INVALC, + 0xE0BD,0xE0C1,INVALC,0xE0C5,0xB95F,0xE0B4,0xE0B2,0xE0BE, + INVALC,INVALC,INVALC,INVALC,0xE0BB,0xE0BA,INVALC,0xE0BF, + 0xE0C2,INVALC,0xE0C7,INVALC,INVALC,INVALC,0xE478,INVALC, + 0xBBC7,0xE4A4,0xE47A,0xBBCC,0xBBD0,0xE4AD,0xE4B5,0xE4A6, + 0xBBC8,INVALC,0xE4AA,0xE0B6,INVALC,0xBBC9,0xE4B1,0xE4B6, + 0xE4AE,INVALC,0xE4B0,0xE4B9,0xE4B2,0xE47E,0xE4A9,INVALC, + INVALC,0xBBD1,INVALC,0xBBCD,0xE47C,0xE4AB,0xBBCB,0xE4A5, + 0xBBCA,0xE4B3,0xE4A2,0xE479,0xBBCE,0xE4B8,INVALC,INVALC, + 0xE47B,0xE4AF,0xE4AC,0xE4A7,0xE477,0xE476,0xE4A1,0xE4B4, + 0xBBCF,0xE4B7,0xE47D,0xE4A3,0xBE52,INVALC,INVALC,INVALC, + INVALC,INVALC,0xBE5A,0xBE55,0xE8A4,0xE8A1,0xE867,0xBE50, + INVALC,INVALC,INVALC,0xBE4F,0xBE56,INVALC,INVALC,INVALC, + 0xE865,0xBE54,0xE871,0xE863,0xE864,0xBE4E,0xE8A3,0xBE58, + 0xE874,0xE879,0xE873,0xEBEE,0xE86F,0xE877,0xE875,0xE868, + 0xE862,0xE87D,0xBE57,0xE87E,INVALC,0xE878,INVALC,0xE86D, + 0xE86B,0xE866,INVALC,INVALC,INVALC,0xE86E,0xE87B,0xE86A, + 0xE87A,0xE8A2,INVALC,INVALC,0xBE53,INVALC,0xE876,0xE87C, + 0xE872,0xE86C,0xBE51,INVALC,INVALC,INVALC,0xE4A8,0xE870, + 0xBE59,0xE869,INVALC,INVALC,INVALC,INVALC,INVALC,0xEBF4, + 0xBFF7,0xEBF3,0xEBF0,0xEC44,0xBFFB,INVALC,0xEC41,0xEBF8, + /* Block 148, Array index 0x5400 */ + 0xEC43,0xEBE9,0xEBF6,INVALC,0xBFFD,INVALC,0xEBE1,INVALC, + 0xEBDF,0xEC42,INVALC,0xEC40,0xEBFE,0xEBED,0xEBEC,0xEBE2, + 0xC040,INVALC,0xEBE8,0xEBF2,0xEBFD,0xC043,0xEC45,INVALC, + 0xC1E8,0xC045,0xBFFE,0xEBE6,INVALC,0xEBEF,0xEBDE,0xEBE0, + 0xBFF5,0xC042,0xBFFA,0xEBE7,0xEBF7,0xEBF1,0xC041,0xEBDD, + 0xC1E3,0xEBF9,0xEBFC,0xBFFC,INVALC,0xEBEB,0xC044,0xBFF9, + INVALC,INVALC,INVALC,0xBFF8,0xEBF5,0xEBFB,0xBFF6,INVALC, + 0xEBE4,0xEBFA,INVALC,INVALC,0xEBE5,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xEBEA,0xEED2, + INVALC,0xEED7,0xC1E5,0xC1E7,0xEEDD,0xC1E1,0xEEEC,0xEEE3, + 0xEED8,0xEED9,0xEEE2,INVALC,0xC1EE,0xEEE1,0xEED1,0xEEE0, + 0xEED4,0xEEED,0xC1ED,0xC1EB,0xEED5,INVALC,0xEEE8,INVALC, + 0xEEDA,0xEEE7,INVALC,0xEEE9,0xEED0,0xC1E6,INVALC,0xEEEA, + INVALC,INVALC,0xEEDE,INVALC,0xC1EA,0xEEDB,INVALC,INVALC, + 0xC1EC,0xEEE4,INVALC,INVALC,INVALC,0xC1E4,0xEED6,0xEEE5, + INVALC,0xEEDF,0xEBE3,0xEEE6,0xEED3,INVALC,0xC1E9,INVALC, + 0xEEEB,INVALC,0xC1E2,0xEECE,INVALC,INVALC,INVALC,INVALC, + 0xF160,0xF159,0xC2E9,INVALC,0xF154,0xF163,0xF15B,0xEEDC, + INVALC,0xF165,0xF155,INVALC,0xC2E8,0xF15F,0xC2EA,0xC2F2, + 0xC2F0,0xF161,0xC2F1,0xF157,INVALC,0xF158,0xF15D,0xF162, + INVALC,0xEECD,0xC2EB,0xF16A,0xF167,0xF16B,0xF15E,0xF15A, + 0xF168,0xF36A,0xF15C,INVALC,0xC2EE,INVALC,0xC2ED,0xEECF, + 0xC2EF,0xF164,0xF166,0xC2EC,0xF169,0xF153,INVALC,0xF156, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xF373,INVALC,0xF363,0xC3EB,0xF371,INVALC,INVALC,0xF361, + 0xC3EC,INVALC,0xF36C,INVALC,0xF368,0xC3F1,0xF372,0xF362, + 0xF365,0xC3E9,0xF374,INVALC,0xF36D,0xF370,0xC3EF,0xC3F4, + 0xC3F2,0xF369,0xF364,INVALC,0xC3ED,0xC3EE,0xF360,0xC3EA, + INVALC,0xC3E8,0xC3F0,0xF36F,0xC3F3,INVALC,0xF36B,0xF375, + 0xC3F5,INVALC,INVALC,INVALC,0xF367,INVALC,0xF36E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xF4F3,0xF542,0xF4F5, + 0xF4FC,0xF366,0xF4FA,0xF4E9,0xF540,0xC4C3,0xF4ED,0xF4FE, + /* Block 149, Array index 0x5500 */ + 0xF4F4,INVALC,INVALC,0xC4C2,INVALC,INVALC,0xF544,0xF4F6, + INVALC,0xF4FB,0xF4FD,0xF4E7,0xF541,0xF4F2,0xF4F7,0xF4EB, + 0xF4EF,0xF543,0xF4F9,0xF4E8,0xF4EC,0xF4EE,0xF4F8,INVALC, + 0xC4C1,0xF4F1,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xF4EA,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xF4F0,0xF661,0xF666,0xC54F,0xF668,INVALC,0xC549,INVALC, + 0xF664,0xF66A,0xC54E,0xC54A,INVALC,0xC54B,0xF660,0xF667, + 0xC54D,0xF665,0xC54C,0xF65F,0xF663,0xF662,INVALC,0xF65E, + 0xF669,INVALC,INVALC,INVALC,0xC5B1,0xF76D,0xF770,0xF76C, + 0xF76E,0xF76F,0xF769,0xF76A,0xF767,INVALC,INVALC,0xF76B, + 0xF768,0xC5B2,0xC5B3,INVALC,INVALC,0xF84B,INVALC,0xF84D, + INVALC,INVALC,INVALC,INVALC,INVALC,0xF84C,0xF84E,INVALC, + 0xC5E0,INVALC,0xF84A,0xC5DF,0xC5E1,INVALC,INVALC,INVALC, + 0xF8CB,0xF8CC,0xC644,0xF8CA,INVALC,0xF953,0xF952,0xF954, + 0xC65F,0xF955,0xC65E,0xF956,0xF972,0xF975,0xF974,0xC668, + 0xF973,INVALC,INVALC,INVALC,0xC672,0xC670,0xC671,0xC677, + 0xF9C0,0xF9C1,0xF9BF,0xF9C9,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x5600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xAAF8, + INVALC,INVALC,0xD844,0xDC78,0xE8A5,0xF376,INVALC,INVALC, + 0xAAF9,INVALC,0xADAC,0xB07B,INVALC,INVALC,0xD845,INVALC, + 0xD846,0xB3AC,INVALC,0xB67D,0xDC7A,0xDC79,0xB6A3,0xB67C, + 0xDC7B,0xB67E,0xB6A2,0xB6A1,0xB67B,INVALC,INVALC,INVALC, + 0xB968,INVALC,INVALC,0xE0D0,0xE0CE,INVALC,0xE0CF,0xE0CD, + INVALC,0xBBD2,INVALC,0xBBD5,0xBBD7,0xBBD6,INVALC,INVALC, + 0xBBD3,0xBBD4,INVALC,0xE8A7,0xE8A6,0xBE5B,0xE8A8,INVALC, + 0xE8A9,0xBE5C,INVALC,INVALC,INVALC,0xEC4D,0xEC4B,0xEEF3, + INVALC,0xEC49,0xEC4A,0xC046,0xEC46,0xEC4E,0xEC48,0xEC4C, + 0xEEEF,INVALC,INVALC,0xEEF1,INVALC,0xEEF2,0xC1F3,0xEEEE, + 0xC1F2,0xEEF0,0xC1EF,0xC1F0,0xC1F1,0xEC47,INVALC,INVALC, + 0xC2F5,0xF16E,0xF16C,0xF16D,0xC2F3,0xC2F6,0xC2F4,INVALC, + INVALC,INVALC,0xF377,0xF378,0xC3F6,INVALC,0xF545,0xF547, + 0xF546,0xC4C4,0xC550,0xF66D,0xF66C,0xF66B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x5700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xAAFA,INVALC,0xC9AA,INVALC, + 0xCA58,0xA6E9,0xCA56,0xCA59,0xCA57,INVALC,INVALC,INVALC, + 0xCBAE,INVALC,0xA8C1,INVALC,0xA8C2,0xCBB0,0xA8BF,0xCBAF, + 0xCBAD,0xA8C0,0xA8BE,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xCDD8,0xCDDB,0xAAFD,0xCDDA,0xCDD9,INVALC,0xAAFC, + 0xAAFB,INVALC,0xAB40,0xCDDC,0xAAFE,INVALC,INVALC,INVALC, + INVALC,INVALC,0xD0C6,0xADAE,0xADAF,0xADB0,0xD0C7,0xD0C3, + 0xADAD,0xD0C4,INVALC,0xD0C5,0xD0C2,INVALC,INVALC,INVALC, + 0xB0A4,INVALC,INVALC,0xB0A1,0xD445,0xB0A2,0xB0A5,0xD446, + INVALC,0xB07E,0xB07C,0xB07D,0xB0A3,INVALC,INVALC,INVALC, + INVALC,INVALC,0xB3AD,0xD849,0xB3B5,0xD848,INVALC,0xD84B, + 0xB3B1,0xD84A,0xB6AB,0xB3AF,0xB3B2,0xB3AE,0xB3B3,0xB3B4, + 0xB3B0,INVALC,INVALC,INVALC,0xD847,0xB6A7,0xDC7D,INVALC, + 0xDCA3,INVALC,INVALC,0xDCA2,0xB6AC,0xB6A8,0xB6A9,0xDC7C, + 0xDC7E,0xDCA1,0xB6A4,0xB6A6,INVALC,0xB6AA,0xB6A5,INVALC, + INVALC,0xE0D3,0xE0D1,0xE0D2,0xB96A,0xB96B,INVALC,0xE0D4, + 0xB969,0xBBD8,INVALC,0xBBDA,0xBBD9,INVALC,0xE4BB,INVALC, + INVALC,0xE4BC,0xE8AB,INVALC,0xE8AA,INVALC,INVALC,0xC047, + 0xC048,0xEC4F,0xC049,INVALC,0xEEF6,INVALC,0xEEF4,INVALC, + 0xEEF5,0xC1F4,INVALC,0xF16F,0xC3F7,INVALC,INVALC,INVALC, + 0xC1F5,0xAB41,INVALC,0xB0A6,0xD447,INVALC,INVALC,0xD84C, + 0xB3B6,0xB6AD,0xDCA4,0xDCA6,0xB6AF,0xB6AE,0xB6B0,0xB6B1, + 0xDCA5,0xB96E,0xB96F,0xB96D,0xBBDB,0xB96C,0xE0D5,INVALC, + INVALC,INVALC,0xBBDC,0xE8AC,0xEC50,0xC04A,0xC1F6,0xF170, + 0xF174,0xC2F9,0xF171,0xC2FA,0xC2F8,0xF175,0xC2FB,0xF173, + INVALC,0xF379,0xC2F7,0xC3F8,INVALC,0xF8CD,INVALC,INVALC, + 0xAB42,0xB3B8,0xB3B7,INVALC,INVALC,INVALC,INVALC,0xB6B2, + 0xDCA8,0xDCA7,0xB6B3,INVALC,INVALC,0xE0D9,0xB973,0xB970, + 0xE0D8,0xB972,0xE0D6,0xB971,INVALC,0xE0D7,INVALC,0xE4BD, + /* Block 152, Array index 0x5800 */ + 0xBBDD,INVALC,0xE8AF,INVALC,0xBE5D,0xE8AD,0xBE5E,0xBE5F, + 0xE8AE,0xBE60,INVALC,0xEC51,INVALC,0xC04E,0xC04B,0xC050, + 0xEC53,0xC04C,0xEC52,0xC04F,INVALC,INVALC,0xC04D,INVALC, + 0xEEF9,0xEEFB,INVALC,INVALC,0xC1F7,0xEEFA,0xC1F8,0xEEF8, + 0xEEF7,INVALC,0xF177,0xF176,0xC2FC,0xF178,0xF37E,0xC3FA, + 0xF37D,0xF37A,0xC3F9,0xF37B,0xF37C,INVALC,0xF548,0xF549, + 0xC4C5,INVALC,0xC553,INVALC,INVALC,0xF66E,INVALC,INVALC, + 0xC551,0xC552,0xF66F,INVALC,INVALC,0xC5B4,0xC5B5,0xF771, + INVALC,INVALC,0xC645,0xF8CF,0xC647,INVALC,0xF8CE,0xF8D0, + 0xC646,0xF957,INVALC,0xF9AD,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0xAB43,INVALC,INVALC,INVALC,0xB974,INVALC, + 0xE4BE,INVALC,0xE8B0,0xC051,0xC052,INVALC,0xAB44,INVALC, + 0xBE61,0xC3FB,0xADB1,INVALC,INVALC,INVALC,0xC053,INVALC, + 0xC5E2,0xADB2,0xD84D,INVALC,0xDCA9,INVALC,0xDCAB,INVALC, + 0xDCAA,INVALC,0xE0DD,0xE0DA,0xB975,INVALC,0xB976,0xE0DB, + 0xE0DC,INVALC,0xE4C0,0xE4C5,0xBBDE,0xE4BF,0xE4C1,0xE4C8, + 0xE4C3,0xE4C7,0xE4C4,0xE4C2,0xE4C6,0xBBDF,INVALC,INVALC, + 0xE8B3,INVALC,0xE8B1,0xBE63,INVALC,0xBE62,0xE8B2,0xBE64, + INVALC,INVALC,INVALC,INVALC,0xEC56,INVALC,INVALC,0xEC55, + 0xC054,0xEC54,0xEEFC,INVALC,0xEEFE,0xEF41,0xEF40,INVALC, + 0xC1F9,0xEEFD,0xF1A1,0xC2FD,0xF17D,0xF1A2,0xC2FE,INVALC, + 0xF17B,INVALC,0xF17E,0xF17C,0xF179,0xC340,0xF17A,INVALC, + INVALC,INVALC,INVALC,0xF3A1,INVALC,INVALC,0xF3A3,0xF3A2, + INVALC,0xF54A,INVALC,0xF54B,INVALC,INVALC,INVALC,0xF670, + INVALC,0xC5B7,INVALC,0xC5B6,0xF84F,0xF850,0xC648,0xF8D1, + INVALC,0xC669,INVALC,0xADB3,0xB6B4,0xE4CA,0xE4C9,0xE8B5, + 0xE8B4,INVALC,INVALC,0xC1FA,0xEF43,0xEF42,0xF1A5,0xF1A3, + 0xF1A6,0xF1A4,INVALC,INVALC,0xC3FC,0xF3A4,0xF3A5,0xF3A6, + INVALC,0xF671,INVALC,0xF772,INVALC,0xF8D2,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xADB4,INVALC,INVALC, + 0xEC57,0xEF44,INVALC,0xADB5,INVALC,INVALC,0xBBE0,INVALC, + 0xEC58,0xC341,0xF1A7,0xC3FD,INVALC,0xF54C,0xF54D,0xC554, + /* Block 153, Array index 0x5900 */ + 0xF851,0xADB6,0xB3BB,0xB3BC,0xD84E,0xB6B5,0xB6B6,0xDCAC, + 0xB6B7,INVALC,0xB97A,INVALC,0xB97C,0xE0DF,0xE0E0,0xE0DE, + 0xB977,0xB978,0xB97B,0xB979,INVALC,INVALC,0xE4CB,0xBBE1, + 0xBBE2,INVALC,INVALC,0xE8BC,0xBE67,0xE8B7,0xE8B6,INVALC, + 0xE8BB,0xBE65,INVALC,INVALC,0xC05B,INVALC,0xE8B8,0xE8BD, + 0xE8BA,0xE8B9,INVALC,0xBE66,INVALC,0xC059,INVALC,0xEC5A, + 0xC055,INVALC,0xEC5B,INVALC,INVALC,0xEC59,INVALC,0xC058, + 0xC056,0xC05A,INVALC,0xC057,INVALC,INVALC,INVALC,INVALC, + INVALC,0xEF45,INVALC,0xEF4A,0xEF46,0xEF49,0xC1FB,INVALC, + 0xEDD4,0xEF48,0xEF47,INVALC,0xC344,0xC342,0xC345,0xC343, + 0xF1A8,0xF1A9,0xF1AA,0xC346,INVALC,INVALC,INVALC,0xF3AA, + 0xC440,0xF3A8,INVALC,0xC441,0xF3A7,0xF3A9,0xC3FE,0xF551, + 0xF54E,INVALC,0xF54F,0xF550,0xF672,0xC556,INVALC,0xC555, + INVALC,0xF774,0xF773,0xC5B8,INVALC,INVALC,INVALC,0xC5E3, + 0xC649,0xC660,0xF958,0xF9AE,0xF9AF,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xADB7,0xDCAD,INVALC,INVALC,0xE0E1,0xE4CC,0xE4CD,0xBBE3, + INVALC,0xBBE4,0xE8BE,0xBE68,INVALC,INVALC,0xC1FC,INVALC, + 0xF1AB,INVALC,0xC347,0xF3AD,0xC442,0xF3AC,0xF3AE,0xF3AB, + 0xF675,0xF552,0xF553,INVALC,0xC4C6,INVALC,0xF674,INVALC, + INVALC,0xF673,INVALC,0xF775,0xF9B0,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xADB8,INVALC,INVALC,INVALC,0xADB9, + INVALC,INVALC,0xB0A7,0xD448,INVALC,0xD84F,INVALC,0xB6B8, + INVALC,0xB6BB,0xB6B9,0xDCAE,INVALC,0xB6BD,INVALC,0xB6BA, + INVALC,INVALC,0xB6BC,INVALC,0xB97E,INVALC,0xE0E2,INVALC, + INVALC,0xE0E3,0xE8C0,INVALC,0xB97D,0xB9A1,0xB9A2,INVALC, + /* Block 154, Array index 0x5A00 */ + 0xE4CF,INVALC,0xE4CE,0xBBE5,INVALC,0xBBE6,INVALC,0xE4D0, + 0xE8BF,0xBBE8,0xBE69,INVALC,0xBBE7,INVALC,INVALC,INVALC, + 0xC05C,0xE8C1,0xBE6B,0xBE6A,0xE8C2,0xE8C5,0xE8C3,0xE8C4, + 0xBE6C,INVALC,0xC061,0xC05F,INVALC,INVALC,0xC05E,0xEC5D, + INVALC,0xC060,INVALC,INVALC,0xEC5C,0xEF4B,INVALC,0xEC5E, + 0xC05D,0xEC5F,0xEF4E,0xEF4C,0xEF4D,0xEF52,0xC34B,0xEF51, + 0xEF54,0xEF53,0xEF50,0xEF4F,INVALC,0xC1FD,INVALC,INVALC, + INVALC,INVALC,0xF1AE,INVALC,0xF1AD,0xC34A,0xC348,0xC349, + INVALC,0xF1AC,INVALC,0xF3B1,INVALC,0xC443,INVALC,0xF3B0, + 0xF3AF,0xC444,INVALC,0xF558,0xF557,INVALC,0xF555,INVALC, + 0xF554,0xC4C8,0xC4C7,0xF559,0xF776,0xC5B9,0xF677,0xC557, + 0xF676,0xF556,INVALC,0xF777,0xC5E4,INVALC,0xC661,0xF959, + INVALC,0xF9B1,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xADBA,0xD850, + 0xEF55,0xADBB,INVALC,INVALC,0xE4D2,0xE4D1,0xEC60,INVALC, + INVALC,0xEF57,INVALC,0xEF56,INVALC,0xC34C,0xF3B2,0xF3B3, + 0xC4C9,INVALC,INVALC,0xF9B2,0xB0A8,0xB6BF,0xB6BE,0xE0E4, + 0xE0E6,0xB9A4,0xE0E5,0xB9A3,0xB9A5,0xE0E7,INVALC,INVALC, + INVALC,0xE4D4,0xE4D6,0xE4D5,INVALC,0xE4D8,INVALC,INVALC, + INVALC,0xBBE9,0xE4D7,0xE4D3,INVALC,INVALC,INVALC,0xE4D9, + INVALC,0xE8CC,INVALC,0xE8CF,0xE8D1,0xE8C7,0xE8CB,0xE8C8, + 0xBE6E,0xBE71,0xBE73,0xE8C9,0xE8CA,0xBE72,0xE8CD,0xE8D0, + 0xE8CE,0xBE74,INVALC,0xBE70,0xE8C6,0xBE6D,INVALC,0xBE6F, + INVALC,INVALC,0xC063,0xEC66,0xEC64,0xEC63,INVALC,0xEC69, + INVALC,0xEC68,0xEC67,INVALC,0xEC62,0xC062,0xEC61,INVALC, + 0xEC65,0xC064,INVALC,INVALC,0xEF5A,INVALC,0xEF5E,0xEF5B, + 0xEF5D,0xEF5C,0xEF59,0xEF5F,0xEF62,0xEF60,0xEF61,0xC240, + /* Block 155, Array index 0x5B00 */ + INVALC,0xC1FE,0xEF58,0xEF63,0xF1B3,0xF1B6,0xF1B8,0xF1B7, + INVALC,0xF1B1,0xF1B5,0xF1B0,INVALC,0xF1B2,0xC34D,0xF1AF, + INVALC,0xF1B4,INVALC,INVALC,0xF3C0,0xF3B5,0xC445,INVALC, + INVALC,0xC446,0xF3B4,0xF3B9,0xF3BF,0xF3B7,0xF3BE,INVALC, + 0xF3BB,INVALC,0xF3BA,0xF3BD,0xF3B8,0xF3B6,INVALC,0xF3BC, + INVALC,0xF560,0xF55E,0xC4CA,0xF55D,0xF563,0xF561,INVALC, + 0xC4CB,0xF55C,0xF55A,INVALC,0xF55B,0xC4CD,0xF55F,0xC4CC, + 0xF562,0xF678,0xF67E,INVALC,INVALC,0xF679,0xC55B,0xF6A1, + 0xC55A,0xF67D,0xF67C,0xC559,0xF67B,0xC558,0xF67A,INVALC, + 0xF77D,0xF7A1,0xF77E,INVALC,0xF77B,0xC5BB,0xF778,0xF77C, + 0xF7A3,INVALC,0xF7A2,0xF779,0xF77A,0xC5BA,0xF852,0xC5E7, + INVALC,0xF853,0xC5E5,0xC5E6,INVALC,INVALC,0xF8D3,0xC64A, + 0xF976,INVALC,0xC66A,INVALC,0xF9B3,0xC66B,0xF9B4,0xF9B5, + 0xF9C3,0xF9C2,0xC67A,0xF9CD,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xB0A9,INVALC,INVALC,0xE0E9,INVALC,0xE0E8,INVALC,0xBBEA, + 0xBBEB,0xE4DA,INVALC,0xE8D2,0xEC6C,INVALC,INVALC,0xBE75, + 0xC065,0xEC6A,INVALC,0xEC6D,0xC066,INVALC,0xEF64,0xEC6B, + 0xF1B9,0xC34E,0xF3C1,INVALC,INVALC,INVALC,0xF566,0xF564, + INVALC,INVALC,0xF565,INVALC,INVALC,0xF6A2,INVALC,0xC55C, + 0xF7A4,0xC5EA,0xC5BC,0xC5E8,0xC5E9,0xF8D4,0xC662,INVALC, + 0xB0AA,INVALC,INVALC,INVALC,0xF1BA,INVALC,INVALC,0xD449, + INVALC,0xB9A6,INVALC,0xE4DB,INVALC,INVALC,0xBBEC,0xE4DC, + INVALC,INVALC,INVALC,0xE8D4,0xE8D3,0xC068,0xBE76,0xBE77, + INVALC,0xE8D7,0xE8D6,0xE8D5,INVALC,INVALC,0xEC6E,0xEC71, + INVALC,0xEC70,0xEC6F,0xC067,0xEF68,0xEF66,0xEF65,INVALC, + /* Block 156, Array index 0x5C00 */ + INVALC,0xEF67,INVALC,0xC34F,0xF1BC,0xF1BD,0xC350,INVALC, + 0xF1BB,INVALC,0xF3C3,0xF3C2,0xF3C5,0xC447,0xF3C4,INVALC, + 0xF567,0xF569,0xF568,INVALC,INVALC,0xF6A3,0xF6A6,0xF6A4, + 0xF6A5,0xF7A5,0xC5BD,INVALC,INVALC,INVALC,0xF854,0xF855, + 0xF856,INVALC,0xC64B,0xC663,0xF9B6,0xB0AB,INVALC,0xBE78, + 0xC069,0xF1BE,INVALC,0xF7A6,INVALC,INVALC,0xF9C4,0xD44A, + INVALC,0xC67B,0xB0AC,0xEC72,INVALC,0xF1BF,INVALC,0xF3C6, + INVALC,INVALC,0xF6A7,0xF7A7,0xB0AD,INVALC,0xE4DD,0xE4DE, + INVALC,0xBBED,0xBBEE,0xE8D9,0xBE7A,0xBE79,0xE8D8,INVALC, + 0xEF69,INVALC,0xF1C0,0xF1C2,0xF1C1,0xC353,0xC352,0xC351, + INVALC,0xC55E,0xF6A8,INVALC,0xC55D,0xF7A9,0xF7A8,INVALC, + 0xC64C,0xF8D5,0xB3BD,0xE0EA,INVALC,INVALC,INVALC,0xE4E1, + 0xE4DF,0xE4E0,INVALC,INVALC,0xE8E2,INVALC,0xE8DD,0xE8DA, + 0xE8E1,INVALC,INVALC,INVALC,0xE8E3,INVALC,INVALC,0xBE7C, + 0xE8E0,0xE8DC,INVALC,INVALC,0xE8DB,0xE8DF,0xE8DE,0xBE7B, + INVALC,INVALC,0xEC7D,0xEC78,0xEC76,0xECA1,0xEC77,INVALC, + 0xEC73,INVALC,0xEC79,INVALC,INVALC,0xEC74,0xEF72,0xEC75, + 0xECA2,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xEC7C,0xC06A,0xEC7B,0xEC7A,INVALC,0xEC7E,INVALC,INVALC, + INVALC,INVALC,0xEF6A,0xEF6D,INVALC,INVALC,0xEF6C,INVALC, + 0xEF74,0xEF6F,0xEF73,INVALC,0xEF71,0xEF70,0xEF6E,INVALC, + 0xEF6B,INVALC,0xC243,0xC242,INVALC,0xC244,0xC241,0xEF75, + INVALC,INVALC,INVALC,INVALC,INVALC,0xF1C8,0xF1CB,INVALC, + 0xF1C9,0xF1CD,INVALC,INVALC,INVALC,0xF1CE,INVALC,0xF1C6, + 0xC358,0xF1C7,INVALC,0xF1C5,0xF1CC,INVALC,0xF1C4,0xF1C3, + 0xC357,0xC355,0xC354,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0xF1CA,0xF3CF,0xF3D5,0xC44A,0xF3D0, + INVALC,0xF3D3,0xF3D7,0xC44B,0xF3D2,INVALC,0xF3CA,INVALC, + 0xF3C9,0xF3D6,0xF3CD,INVALC,0xF3CB,0xF3D4,0xF3CC,0xC449, + 0xC448,INVALC,0xF3C7,0xF3C8,0xF3D1,INVALC,INVALC,INVALC, + 0xF3CE,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0xF56C, + 0xF56F,INVALC,INVALC,INVALC,INVALC,0xC356,INVALC,INVALC, + /* Block 157, Array index 0x5D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0xF56D,0xF573,0xF571, + 0xF56B,0xF576,INVALC,0xF56A,INVALC,0xC4CF,0xF572,INVALC, + INVALC,INVALC,0xF56E,0xC4CE,0xF575,INVALC,INVALC,0xF574, + INVALC,INVALC,INVALC,INVALC,0xF6AB,0xF6AA,INVALC,INVALC, + INVALC,0xF6B1,INVALC,0xF6AD,0xF6B0,0xC560,INVALC,INVALC, + 0xF6AE,0xF6AF,INVALC,0xF6A9,0xF6AC,0xC55F,INVALC,INVALC, + INVALC,0xC5BF,0xF7B4,0xF7AF,0xF7B3,INVALC,0xF7B6,0xF7B2, + INVALC,0xF7AE,INVALC,0xC5C1,0xF7B1,0xF7B5,0xC5C0,0xF7AC, + 0xF570,0xF7B0,INVALC,INVALC,0xF7AD,INVALC,0xF7AA,INVALC, + 0xF7AB,0xC5BE,0xF85A,0xF85C,0xF85F,0xF85B,0xF860,INVALC, + 0xF859,INVALC,0xF857,INVALC,0xC5EB,0xF85D,0xC5ED,0xC5EC, + 0xF858,0xF85E,INVALC,INVALC,INVALC,INVALC,0xF8DA,0xC64D, + 0xF8DB,INVALC,0xF8D9,0xF8D6,INVALC,INVALC,0xF8D8,0xF8D7, + 0xF95A,INVALC,INVALC,INVALC,INVALC,0xF95C,0xF95B,INVALC, + INVALC,0xF979,INVALC,0xF978,0xF977,0xF97A,INVALC,0xC673, + 0xC674,0xF9CA,0xF9CE,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xB3BE,0xDCAF,0xE0ED, + INVALC,0xB9A7,0xE0EB,INVALC,INVALC,0xE0EC,INVALC,INVALC, + INVALC,0xE4E2,0xE4E3,0xBBF1,0xBBEF,0xE4E4,0xBBF0,0xE8E8, + INVALC,0xE8EB,0xE8E5,0xE8EC,0xE8E4,0xE8E6,INVALC,0xE8E7, + /* Block 158, Array index 0x5E00 */ + 0xE8EA,INVALC,INVALC,0xBEA1,0xE8EF,0xE8EE,0xBE7D,0xE8E9, + 0xE8ED,0xBE7E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xECAC,INVALC,0xC06F,INVALC,0xECA7,0xC06B,INVALC,0xECA4, + 0xECAA,0xECAD,INVALC,0xC070,INVALC,0xECA9,0xECA6,0xECAE, + 0xECA5,INVALC,0xECAB,0xC06C,INVALC,0xECA3,0xC06D,INVALC, + 0xC06E,0xECA8,INVALC,INVALC,INVALC,0xEFA9,0xEF7A,0xEF7B, + 0xEF7E,0xEF7C,INVALC,0xEF76,INVALC,INVALC,0xEF79,0xEFA5, + 0xEF7D,INVALC,INVALC,0xC245,INVALC,0xEFA7,0xEFA4,0xC246, + 0xEFA6,0xEF77,0xEFA2,0xEFA3,INVALC,0xEFA1,INVALC,INVALC, + INVALC,INVALC,0xF1D2,0xF1D4,0xF1D7,INVALC,INVALC,0xF1D1, + INVALC,0xC359,0xF1D9,0xF1D0,0xF1DA,INVALC,0xF1D6,0xF1D8, + 0xF1DC,0xF1D5,0xF1DD,0xF1D3,0xF1CF,0xC35A,INVALC,0xF1DB, + 0xC35B,0xC44D,INVALC,INVALC,INVALC,INVALC,INVALC,0xEF78, + 0xF3F1,0xF3E8,0xC44F,0xF3E4,0xC450,INVALC,INVALC,0xF3ED, + 0xF3E7,0xF3DD,0xC44E,0xF3EA,0xF3E5,0xF3E6,INVALC,0xF3D8, + 0xF3DF,0xF3EE,INVALC,0xF3EB,INVALC,0xF3E3,INVALC,0xF3EF, + 0xF3DE,0xF3D9,0xF3EC,INVALC,0xF3DB,0xF3E9,0xF3E0,0xF3F0, + 0xF3DC,0xC44C,0xF3DA,0xF3E1,0xF3E2,INVALC,INVALC,INVALC, + 0xF57D,INVALC,0xF57B,INVALC,0xF5A2,INVALC,0xF5AE,0xF5A5, + 0xF57C,0xF578,0xF5A7,0xF57E,0xF5A3,0xF57A,0xF5AA,0xF577, + 0xF5A1,0xF5A6,0xF5A8,0xF5AB,0xF579,INVALC,0xF5AF,0xF5B0, + 0xF5A9,0xF5AD,0xF5A4,INVALC,0xF6C1,0xF6C4,INVALC,0xC561, + INVALC,0xF6C3,0xF6C8,0xF6C6,0xC562,0xF6BD,0xF6B3,0xF6B2, + 0xC564,0xF6BF,0xF6C0,0xF6BC,0xF6B4,INVALC,0xF6B9,0xF5AC, + INVALC,0xF6B5,0xC563,0xF6BB,INVALC,0xF6BA,INVALC,0xF6B6, + 0xF6C2,INVALC,0xF6B7,0xF7BB,0xF6C5,0xF6C7,0xF6BE,0xF6B8, + 0xF7BC,0xF7BE,0xF7B8,0xC5C2,INVALC,0xF7C5,0xF7C3,0xC5C3, + 0xF7C2,0xF7C1,0xF7BA,0xF7B7,0xF7BD,0xF7C6,0xF7B9,0xF7BF, + INVALC,0xF869,0xF86E,0xF864,0xF867,0xC5EE,0xF86B,INVALC, + 0xF872,0xF7C0,INVALC,0xF865,0xF86F,0xF873,0xF86A,0xF863, + 0xF86D,INVALC,0xF86C,0xF871,0xF870,0xF7C4,0xF868,0xF862, + 0xF866,0xC64E,0xC64F,0xF861,INVALC,0xF8E6,0xF8DD,0xF8E5, + /* Block 159, Array index 0x5F00 */ + 0xF8E2,0xF8E3,0xF8DC,0xF8DF,0xF8E7,0xF8E1,0xF8E0,0xF8DE, + INVALC,0xF8E4,INVALC,0xF95D,INVALC,0xF95E,INVALC,0xF960, + 0xF95F,0xF962,0xF961,0xF97C,0xF97B,0xF9B7,INVALC,0xF9B8, + INVALC,0xF9C5,0xC678,0xC67C,INVALC,0xF9CF,0xC67D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xB3BF,INVALC,INVALC, + INVALC,0xC4D0,0xF6C9,INVALC,0xC650,0xC651,INVALC,0xB3C0, + 0xE0EE,INVALC,0xB9A8,0xE8F0,INVALC,INVALC,0xECB0,0xECB1, + 0xECAF,0xEFAB,0xEFAA,0xC247,0xF1DF,0xEFAC,0xF1DE,INVALC, + INVALC,0xF3F3,0xC451,0xC453,0xF3F2,INVALC,INVALC,0xC452, + INVALC,0xF5B1,0xF5B3,0xF5B2,0xF6CA,0xC565,INVALC,0xC5EF, + 0xF8E8,0xF963,INVALC,INVALC,0xF9D2,0xB3C1,INVALC,0xE4E5, + INVALC,0xBEA2,INVALC,INVALC,INVALC,0xECB3,0xECB2,INVALC, + 0xEFAD,INVALC,INVALC,INVALC,0xC454,0xC4D1,0xF7C7,0xF9CB, + INVALC,INVALC,INVALC,0xB3C2,0xBBF2,INVALC,0xBEA3,INVALC, + 0xF3F4,INVALC,0xF874,0xB6C0,INVALC,INVALC,INVALC,INVALC, + 0xEFAE,INVALC,INVALC,INVALC,0xC664,0xB6C1,0xBEA4,0xC248, + 0xF875,0xB6C2,INVALC,0xE8F1,0xC072,0xECB4,0xECB5,INVALC, + 0xC071,INVALC,0xEFAF,0xC24C,0xC24A,0xC24B,0xC249,0xF1E0, + 0xC35C,INVALC,INVALC,INVALC,0xF5B5,0xF5B4,0xF5B7,0xF5B6, + 0xC4D2,INVALC,INVALC,0xF6CB,INVALC,0xF6CD,0xF6CC,0xC566, + 0xF7C8,INVALC,0xF876,0xF877,0xC5F0,0xF964,0xF97D,0xC675, + INVALC,0xDCB0,0xECB6,0xEFB0,0xF3F5,0xE0EF,INVALC,0xEFB1, + /* Block 160, Array index 0x6000 */ + 0xF1E2,0xF1E1,INVALC,INVALC,INVALC,INVALC,0xF878,0xC652, + INVALC,0xF965,0xF97E,INVALC,INVALC,INVALC,0xB9A9,0xE8F2, + 0xE8F3,INVALC,0xECB7,0xB9AA,INVALC,0xC35D,0xF1E3,INVALC, + 0xF6CF,0xC567,0xF6D0,0xF6CE,0xF879,INVALC,0xF8E9,INVALC, + 0xB9AB,INVALC,0xEFB4,0xEFB3,0xEFB2,0xF1E4,INVALC,INVALC, + 0xF1E8,0xF1E7,0xF1E6,0xF1E5,0xC35E,0xF3F6,0xF5B9,0xC4D3, + 0xF5B8,0xF6D1,0xF7CB,0xF7CA,0xC5C4,0xF7C9,0xF87C,0xF87B, + 0xF87A,INVALC,INVALC,0xBBF3,INVALC,0xECB8,0xC24D,INVALC, + 0xF3F7,0xF3F8,0xF7CC,0xF87D,INVALC,INVALC,0xF8EA,0xF966, + 0xF9B9,0xF9D4,0xBBF4,0xC24E,0xF1E9,0xF3F9,0xF6D2,0xF87E, + INVALC,INVALC,0xBEA6,INVALC,0xEFB5,0xF1EA,0xF3FA,0xF3FB, + 0xF3FC,0xF5BE,INVALC,0xF5BA,0xC568,0xF5BD,0xF5BC,0xC4D4, + 0xF5BB,0xC4D6,INVALC,0xC4D5,0xF6D4,0xF6D3,0xC569,0xC56A, + INVALC,INVALC,0xC5C6,0xF7CD,0xC5C5,INVALC,0xF8A3,0xF8A4, + 0xF8A2,0xF8A1,0xC654,INVALC,0xF8EB,0xF8EC,0xF8ED,0xC653, + 0xF967,0xF96A,0xF969,0xF968,INVALC,INVALC,0xF9D3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xC073,INVALC,INVALC, + 0xC365,0xF5BF,0xF6D5,INVALC,0xC5C7,0xF7CE,INVALC,INVALC, + 0xF9D5,INVALC,INVALC,INVALC,0xC074,INVALC,INVALC,INVALC, + 0xEFB6,INVALC,0xF7CF,INVALC,0xF9A1,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 251, Array index 0x6100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xC94A,0xDDFC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 255, Array index 0x6200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xA14A,0xA157,INVALC,0xA159,0xA15B,0xA15F,0xA160,0xA163, + 0xA164,0xA167,0xA168,0xA16B,0xA16C,0xA16F,0xA170,0xA173, + 0xA174,0xA177,0xA178,0xA17B,0xA17C,INVALC,INVALC,INVALC, + INVALC,0xA1C6,0xA1C7,0xA1CA,0xA1CB,0xA1C8,0xA1C9,0xA15C, + 0xA14D,INVALC,0xA14F,INVALC,0xA151,0xA152,0xA153,0xA154, + INVALC,0xA17D,0xA17E,0xA1A1,0xA1A2,0xA1A3,0xA1A4,0xA1CC, + 0xA1CD,0xA1CE,0xA1DE,0xA1DF,0xA1E0,0xA1E1,0xA1E2,INVALC, + INVALC,0xA24C,0xA24D,0xA24E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 256, Array index 0x6300 */ + INVALC,0xA149,INVALC,0xA1AD,0xA243,0xA248,0xA1AE,INVALC, + 0xA15D,0xA15E,0xA1AF,0xA1CF,0xA141,0xA1D0,0xA144,0xA241, + 0xA2AF,0xA2B0,0xA2B1,0xA2B2,0xA2B3,0xA2B4,0xA2B5,0xA2B6, + 0xA2B7,0xA2B8,0xA147,0xA146,0xA1D5,0xA1D7,0xA1D6,0xA148, + 0xA249,0xA2CF,0xA2D0,0xA2D1,0xA2D2,0xA2D3,0xA2D4,0xA2D5, + 0xA2D6,0xA2D7,0xA2D8,0xA2D9,0xA2DA,0xA2DB,0xA2DC,0xA2DD, + 0xA2DE,0xA2DF,0xA2E0,0xA2E1,0xA2E2,0xA2E3,0xA2E4,0xA2E5, + 0xA2E6,0xA2E7,0xA2E8,INVALC,0xA242,INVALC,INVALC,0xA1C4, + INVALC,0xA2E9,0xA2EA,0xA2EB,0xA2EC,0xA2ED,0xA2EE,0xA2EF, + 0xA2F0,0xA2F1,0xA2F2,0xA2F3,0xA2F4,0xA2F5,0xA2F6,0xA2F7, + 0xA2F8,0xA2F9,0xA2FA,0xA2FB,0xA2FC,0xA2FD,0xA2FE,0xA340, + 0xA341,0xA342,0xA343,0xA161,0xA155,0xA162,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0xA14E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0xA15A,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_BIG5 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> big5 size-optimized table (38748 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_BIG5) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_big5[] = +{ + 0x0235, /* Ranges number */ + 0x02F3, /* Unranged codes number */ + 0x45C8, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x02C7, 0x02CB, 0x06A2, + /* Array index: 0x0006 */ 0x0391, 0x03A9, 0x06A7, + /* Array index: 0x0009 */ 0x03B1, 0x03C9, 0x06C0, + /* Array index: 0x000C */ 0x0414, 0x041C, 0x06D9, + /* Array index: 0x000F */ 0x0423, 0x0451, 0x06E2, + /* Array index: 0x0012 */ 0x2160, 0x2169, 0x0711, + /* Array index: 0x0015 */ 0x2190, 0x2199, 0x071B, + /* Array index: 0x0018 */ 0x221E, 0x2220, 0x0725, + /* Array index: 0x001B */ 0x2229, 0x222B, 0x0728, + /* Array index: 0x001E */ 0x2460, 0x2469, 0x072B, + /* Array index: 0x0021 */ 0x2474, 0x247D, 0x0735, + /* Array index: 0x0024 */ 0x256D, 0x2573, 0x073F, + /* Array index: 0x0027 */ 0x2581, 0x258F, 0x0746, + /* Array index: 0x002A */ 0x25E2, 0x25E5, 0x0755, + /* Array index: 0x002D */ 0x2640, 0x2642, 0x0759, + /* Array index: 0x0030 */ 0x3000, 0x3015, 0x075C, + /* Array index: 0x0033 */ 0x301D, 0x3029, 0x0772, + /* Array index: 0x0036 */ 0x3041, 0x3093, 0x077F, + /* Array index: 0x0039 */ 0x309D, 0x30F6, 0x07D2, + /* Array index: 0x003C */ 0x3105, 0x3129, 0x082C, + /* Array index: 0x003F */ 0x339C, 0x339E, 0x0851, + /* Array index: 0x0042 */ 0x4E07, 0x4E19, 0x0854, + /* Array index: 0x0045 */ 0x4E2D, 0x4E33, 0x0867, + /* Array index: 0x0048 */ 0x4E38, 0x4E3C, 0x086E, + /* Array index: 0x004B */ 0x4E4B, 0x4E53, 0x0873, + /* Array index: 0x004E */ 0x4E58, 0x4E5F, 0x087C, + /* Array index: 0x0051 */ 0x4E7E, 0x4E95, 0x0884, + /* Array index: 0x0054 */ 0x4E9E, 0x4EAE, 0x089C, + /* Array index: 0x0057 */ 0x4EC0, 0x4ECD, 0x08AD, + /* Array index: 0x005A */ 0x4ED4, 0x4EE9, 0x08BB, + /* Array index: 0x005D */ 0x4EF0, 0x4EF7, 0x08D1, + /* Array index: 0x0060 */ 0x4EFD, 0x4F19, 0x08D9, + /* Array index: 0x0063 */ 0x4F2C, 0x4F64, 0x08F6, + /* Array index: 0x0066 */ 0x4F67, 0x4F9E, 0x092F, + /* Array index: 0x0069 */ 0x4FB2, 0x4FE1, 0x0967, + /* Array index: 0x006C */ 0x4FF1, 0x4FFA, 0x0997, + /* Array index: 0x006F */ 0x5005, 0x5037, 0x09A1, + /* Array index: 0x0072 */ 0x5043, 0x5077, 0x09D4, + /* Array index: 0x0075 */ 0x508B, 0x509E, 0x0A09, + /* Array index: 0x0078 */ 0x50AC, 0x50DD, 0x0A1D, + /* Array index: 0x007B */ 0x50E3, 0x514D, 0x0A4F, + /* Array index: 0x007E */ 0x5157, 0x516E, 0x0ABA, + /* Array index: 0x0081 */ 0x5175, 0x5178, 0x0AD2, + /* Array index: 0x0084 */ 0x518F, 0x5198, 0x0AD6, + /* Array index: 0x0087 */ 0x51BC, 0x51BE, 0x0AE0, + /* Array index: 0x008A */ 0x51C4, 0x51D0, 0x0AE3, + /* Array index: 0x008D */ 0x51DC, 0x51E1, 0x0AF0, + /* Array index: 0x0090 */ 0x51F5, 0x51FA, 0x0AF6, + /* Array index: 0x0093 */ 0x5206, 0x5217, 0x0AFC, + /* Array index: 0x0096 */ 0x521C, 0x521E, 0x0B0E, + /* Array index: 0x0099 */ 0x5224, 0x522A, 0x0B11, + /* Array index: 0x009C */ 0x522E, 0x523B, 0x0B18, + /* Array index: 0x009F */ 0x5243, 0x524E, 0x0B26, + /* Array index: 0x00A2 */ 0x5252, 0x5262, 0x0B32, + /* Array index: 0x00A5 */ 0x5269, 0x526F, 0x0B43, + /* Array index: 0x00A8 */ 0x5274, 0x528D, 0x0B4A, + /* Array index: 0x00AB */ 0x5296, 0x529B, 0x0B64, + /* Array index: 0x00AE */ 0x52A9, 0x52AE, 0x0B6A, + /* Array index: 0x00B1 */ 0x52BE, 0x52C3, 0x0B70, + /* Array index: 0x00B4 */ 0x52D2, 0x52E6, 0x0B76, + /* Array index: 0x00B7 */ 0x52EF, 0x52FF, 0x0B8B, + /* Array index: 0x00BA */ 0x5305, 0x5323, 0x0B9C, + /* Array index: 0x00BD */ 0x532D, 0x5331, 0x0BBB, + /* Array index: 0x00C0 */ 0x533C, 0x5354, 0x0BC0, + /* Array index: 0x00C3 */ 0x536C, 0x537C, 0x0BD9, + /* Array index: 0x00C6 */ 0x5394, 0x539F, 0x0BEA, + /* Array index: 0x00C9 */ 0x53C8, 0x53CD, 0x0BF6, + /* Array index: 0x00CC */ 0x53DF, 0x53F5, 0x0BFC, + /* Array index: 0x00CF */ 0x5403, 0x5412, 0x0C13, + /* Array index: 0x00D2 */ 0x5418, 0x544A, 0x0C23, + /* Array index: 0x00D5 */ 0x5460, 0x549A, 0x0C56, + /* Array index: 0x00D8 */ 0x54A0, 0x54C9, 0x0C91, + /* Array index: 0x00DB */ 0x54DE, 0x54F3, 0x0CBB, + /* Array index: 0x00DE */ 0x54F7, 0x5514, 0x0CD1, + /* Array index: 0x00E1 */ 0x552A, 0x5557, 0x0CEF, + /* Array index: 0x00E4 */ 0x555E, 0x5566, 0x0D1D, + /* Array index: 0x00E7 */ 0x5575, 0x55B5, 0x0D26, + /* Array index: 0x00EA */ 0x55BF, 0x55E9, 0x0D67, + /* Array index: 0x00ED */ 0x55F6, 0x561F, 0x0D92, + /* Array index: 0x00F0 */ 0x562C, 0x564E, 0x0DBC, + /* Array index: 0x00F3 */ 0x5657, 0x565A, 0x0DDF, + /* Array index: 0x00F6 */ 0x5660, 0x5679, 0x0DE3, + /* Array index: 0x00F9 */ 0x567E, 0x5687, 0x0DFD, + /* Array index: 0x00FC */ 0x568C, 0x5690, 0x0E07, + /* Array index: 0x00FF */ 0x5695, 0x569D, 0x0E0C, + /* Array index: 0x0102 */ 0x56A5, 0x56B7, 0x0E15, + /* Array index: 0x0105 */ 0x56BC, 0x56CD, 0x0E28, + /* Array index: 0x0108 */ 0x56DA, 0x56EB, 0x0E3A, + /* Array index: 0x010B */ 0x56FF, 0x570D, 0x0E4C, + /* Array index: 0x010E */ 0x5712, 0x5723, 0x0E5B, + /* Array index: 0x0111 */ 0x5728, 0x5734, 0x0E6D, + /* Array index: 0x0114 */ 0x5747, 0x5752, 0x0E7A, + /* Array index: 0x0117 */ 0x5766, 0x577D, 0x0E86, + /* Array index: 0x011A */ 0x5793, 0x57A5, 0x0E9E, + /* Array index: 0x011D */ 0x57B5, 0x57C7, 0x0EB1, + /* Array index: 0x0120 */ 0x57CB, 0x57D5, 0x0EC4, + /* Array index: 0x0123 */ 0x57DF, 0x5810, 0x0ECF, + /* Array index: 0x0126 */ 0x5819, 0x583F, 0x0F01, + /* Array index: 0x0129 */ 0x5848, 0x5865, 0x0F28, + /* Array index: 0x012C */ 0x5874, 0x5894, 0x0F46, + /* Array index: 0x012F */ 0x589C, 0x58B3, 0x0F67, + /* Array index: 0x0132 */ 0x58BA, 0x58C9, 0x0F7F, + /* Array index: 0x0135 */ 0x58CE, 0x58EC, 0x0F8F, + /* Array index: 0x0138 */ 0x58F9, 0x58FF, 0x0FAE, + /* Array index: 0x013B */ 0x590C, 0x590F, 0x0FB5, + /* Array index: 0x013E */ 0x5912, 0x591C, 0x0FB9, + /* Array index: 0x0141 */ 0x5927, 0x5931, 0x0FC4, + /* Array index: 0x0144 */ 0x5944, 0x5962, 0x0FCF, + /* Array index: 0x0147 */ 0x5967, 0x5985, 0x0FEE, + /* Array index: 0x014A */ 0x598D, 0x5999, 0x100D, + /* Array index: 0x014D */ 0x599D, 0x59A8, 0x101A, + /* Array index: 0x0150 */ 0x59AE, 0x5A03, 0x1026, + /* Array index: 0x0153 */ 0x5A13, 0x5A20, 0x107C, + /* Array index: 0x0156 */ 0x5A33, 0x5A39, 0x108A, + /* Array index: 0x0159 */ 0x5A3E, 0x5A6D, 0x1091, + /* Array index: 0x015C */ 0x5A77, 0x5A7F, 0x10C1, + /* Array index: 0x015F */ 0x5A8A, 0x5A9F, 0x10CA, + /* Array index: 0x0162 */ 0x5AA5, 0x5AA9, 0x10E0, + /* Array index: 0x0165 */ 0x5AAC, 0x5ACD, 0x10E5, + /* Array index: 0x0168 */ 0x5AD5, 0x5AEE, 0x1107, + /* Array index: 0x016B */ 0x5AF3, 0x5B34, 0x1121, + /* Array index: 0x016E */ 0x5B3C, 0x5B40, 0x1163, + /* Array index: 0x0171 */ 0x5B47, 0x5B65, 0x1168, + /* Array index: 0x0174 */ 0x5B6E, 0x5B9C, 0x1187, + /* Array index: 0x0177 */ 0x5BA2, 0x5BB9, 0x11B6, + /* Array index: 0x017A */ 0x5BBF, 0x5BD9, 0x11CE, + /* Array index: 0x017D */ 0x5BDE, 0x5BFA, 0x11E9, + /* Array index: 0x0180 */ 0x5C03, 0x5C16, 0x1206, + /* Array index: 0x0183 */ 0x5C37, 0x5C5D, 0x121A, + /* Array index: 0x0186 */ 0x5C60, 0x5C74, 0x1241, + /* Array index: 0x0189 */ 0x5C79, 0x5C7E, 0x1256, + /* Array index: 0x018C */ 0x5C86, 0x5C95, 0x125C, + /* Array index: 0x018F */ 0x5C9D, 0x5CB8, 0x126C, + /* Array index: 0x0192 */ 0x5CC6, 0x5CDF, 0x1288, + /* Array index: 0x0195 */ 0x5CEA, 0x5CF1, 0x12A2, + /* Array index: 0x0198 */ 0x5CF4, 0x5D01, 0x12AA, + /* Array index: 0x019B */ 0x5D0B, 0x5D29, 0x12B8, + /* Array index: 0x019E */ 0x5D2E, 0x5D52, 0x12D7, + /* Array index: 0x01A1 */ 0x5D65, 0x5D6C, 0x12FC, + /* Array index: 0x01A4 */ 0x5D79, 0x5D8A, 0x1304, + /* Array index: 0x01A7 */ 0x5D92, 0x5DA2, 0x1316, + /* Array index: 0x01AA */ 0x5DA7, 0x5DBD, 0x1327, + /* Array index: 0x01AD */ 0x5DD1, 0x5DD8, 0x133E, + /* Array index: 0x01B0 */ 0x5DDD, 0x5DE8, 0x1346, + /* Array index: 0x01B3 */ 0x5DEE, 0x5DF4, 0x1352, + /* Array index: 0x01B6 */ 0x5DFD, 0x5E06, 0x1359, + /* Array index: 0x01B9 */ 0x5E14, 0x5E2D, 0x1363, + /* Array index: 0x01BC */ 0x5E33, 0x5E38, 0x137D, + /* Array index: 0x01BF */ 0x5E3D, 0x5E45, 0x1383, + /* Array index: 0x01C2 */ 0x5E4A, 0x5E8F, 0x138C, + /* Array index: 0x01C5 */ 0x5E95, 0x5E9C, 0x13D2, + /* Array index: 0x01C8 */ 0x5EA0, 0x5EB9, 0x13DA, + /* Array index: 0x01CB */ 0x5EC1, 0x5EE9, 0x13F4, + /* Array index: 0x01CE */ 0x5EEE, 0x5EF7, 0x141D, + /* Array index: 0x01D1 */ 0x5EFE, 0x5F0B, 0x1427, + /* Array index: 0x01D4 */ 0x5F12, 0x5F29, 0x1435, + /* Array index: 0x01D7 */ 0x5F2D, 0x5F38, 0x144D, + /* Array index: 0x01DA */ 0x5F46, 0x5F4F, 0x1459, + /* Array index: 0x01DD */ 0x5F54, 0x5F59, 0x1463, + /* Array index: 0x01E0 */ 0x5F67, 0x5FA1, 0x1469, + /* Array index: 0x01E3 */ 0x5FA5, 0x5FAF, 0x14A4, + /* Array index: 0x01E6 */ 0x5FB5, 0x5FC5, 0x14AF, + /* Array index: 0x01E9 */ 0x5FCC, 0x5FD9, 0x14C0, + /* Array index: 0x01EC */ 0x5FDD, 0x5FE5, 0x14CE, + /* Array index: 0x01EF */ 0x5FEA, 0x6000, 0x14D7, + /* Array index: 0x01F2 */ 0x6009, 0x6039, 0x14EE, + /* Array index: 0x01F5 */ 0x6040, 0x604D, 0x151F, + /* Array index: 0x01F8 */ 0x6053, 0x6072, 0x152D, + /* Array index: 0x01FB */ 0x607F, 0x60A3, 0x154D, + /* Array index: 0x01FE */ 0x60B0, 0x60E6, 0x1572, + /* Array index: 0x0201 */ 0x60F0, 0x611F, 0x15A9, + /* Array index: 0x0204 */ 0x6127, 0x612F, 0x15D9, + /* Array index: 0x0207 */ 0x613E, 0x6183, 0x15E2, + /* Array index: 0x020A */ 0x6189, 0x6196, 0x1628, + /* Array index: 0x020D */ 0x61A7, 0x61CD, 0x1636, + /* Array index: 0x0210 */ 0x61DE, 0x6236, 0x165D, + /* Array index: 0x0213 */ 0x623D, 0x6266, 0x16B6, + /* Array index: 0x0216 */ 0x626D, 0x6298, 0x16E0, + /* Array index: 0x0219 */ 0x62A8, 0x62BF, 0x170C, + /* Array index: 0x021C */ 0x62C4, 0x62DC, 0x1724, + /* Array index: 0x021F */ 0x62EB, 0x6316, 0x173D, + /* Array index: 0x0222 */ 0x6328, 0x635A, 0x1769, + /* Array index: 0x0225 */ 0x6365, 0x63B1, 0x179C, + /* Array index: 0x0228 */ 0x63C0, 0x63F6, 0x17E9, + /* Array index: 0x022B */ 0x6409, 0x6443, 0x1820, + /* Array index: 0x022E */ 0x644D, 0x6454, 0x185B, + /* Array index: 0x0231 */ 0x6458, 0x647F, 0x1863, + /* Array index: 0x0234 */ 0x6485, 0x64A6, 0x188B, + /* Array index: 0x0237 */ 0x64A9, 0x64B3, 0x18AD, + /* Array index: 0x023A */ 0x64BB, 0x64DB, 0x18B8, + /* Array index: 0x023D */ 0x64E0, 0x654A, 0x18D9, + /* Array index: 0x0240 */ 0x6551, 0x656C, 0x1944, + /* Array index: 0x0243 */ 0x6572, 0x6584, 0x1960, + /* Array index: 0x0246 */ 0x6590, 0x65C6, 0x1973, + /* Array index: 0x0249 */ 0x65CB, 0x65F5, 0x19AA, + /* Array index: 0x024C */ 0x65FA, 0x65FD, 0x19D5, + /* Array index: 0x024F */ 0x6600, 0x6615, 0x19D9, + /* Array index: 0x0252 */ 0x661C, 0x6628, 0x19EF, + /* Array index: 0x0255 */ 0x662B, 0x663A, 0x19FC, + /* Array index: 0x0258 */ 0x6641, 0x664C, 0x1A0C, + /* Array index: 0x025B */ 0x6659, 0x6680, 0x1A18, + /* Array index: 0x025E */ 0x6684, 0x6699, 0x1A40, + /* Array index: 0x0261 */ 0x669D, 0x66A2, 0x1A56, + /* Array index: 0x0264 */ 0x66A8, 0x66C0, 0x1A5C, + /* Array index: 0x0267 */ 0x66C4, 0x66CC, 0x1A75, + /* Array index: 0x026A */ 0x66D6, 0x66F9, 0x1A7E, + /* Array index: 0x026D */ 0x66FC, 0x6718, 0x1AA2, + /* Array index: 0x0270 */ 0x671D, 0x672E, 0x1ABF, + /* Array index: 0x0273 */ 0x6731, 0x673F, 0x1AD1, + /* Array index: 0x0276 */ 0x6745, 0x6760, 0x1AE0, + /* Array index: 0x0279 */ 0x676C, 0x679F, 0x1AFC, + /* Array index: 0x027C */ 0x67AE, 0x67BB, 0x1B30, + /* Array index: 0x027F */ 0x67C0, 0x67FC, 0x1B3E, + /* Array index: 0x0282 */ 0x6812, 0x6821, 0x1B7B, + /* Array index: 0x0285 */ 0x6825, 0x6854, 0x1B8B, + /* Array index: 0x0288 */ 0x686B, 0x68B5, 0x1BBB, + /* Array index: 0x028B */ 0x68C4, 0x68FD, 0x1C06, + /* Array index: 0x028E */ 0x6904, 0x6917, 0x1C40, + /* Array index: 0x0291 */ 0x692F, 0x697B, 0x1C54, + /* Array index: 0x0294 */ 0x698D, 0x69D4, 0x1CA1, + /* Array index: 0x0297 */ 0x69E2, 0x6A0A, 0x1CE9, + /* Array index: 0x029A */ 0x6A11, 0x6A28, 0x1D12, + /* Array index: 0x029D */ 0x6A34, 0x6A41, 0x1D2A, + /* Array index: 0x02A0 */ 0x6A44, 0x6A6F, 0x1D38, + /* Array index: 0x02A3 */ 0x6A7E, 0x6AAF, 0x1D64, + /* Array index: 0x02A6 */ 0x6AB3, 0x6ABD, 0x1D96, + /* Array index: 0x02A9 */ 0x6AC2, 0x6AD3, 0x1DA1, + /* Array index: 0x02AC */ 0x6AD9, 0x6AE1, 0x1DB3, + /* Array index: 0x02AF */ 0x6AE7, 0x6AF3, 0x1DBC, + /* Array index: 0x02B2 */ 0x6AF8, 0x6AFC, 0x1DC9, + /* Array index: 0x02B5 */ 0x6B00, 0x6B1A, 0x1DCE, + /* Array index: 0x02B8 */ 0x6B2F, 0x6B56, 0x1DE9, + /* Array index: 0x02BB */ 0x6B5B, 0x6B67, 0x1E11, + /* Array index: 0x02BE */ 0x6B76, 0x6BB7, 0x1E1E, + /* Array index: 0x02C1 */ 0x6BBC, 0x6BDB, 0x1E60, + /* Array index: 0x02C4 */ 0x6BE0, 0x6C38, 0x1E80, + /* Array index: 0x02C7 */ 0x6C3E, 0x6C43, 0x1ED9, + /* Array index: 0x02CA */ 0x6C4A, 0x6C9D, 0x1EDF, + /* Array index: 0x02CD */ 0x6CAB, 0x6CF5, 0x1F33, + /* Array index: 0x02D0 */ 0x6D00, 0x6D22, 0x1F7E, + /* Array index: 0x02D3 */ 0x6D25, 0x6D42, 0x1FA1, + /* Array index: 0x02D6 */ 0x6D58, 0x6D98, 0x1FBF, + /* Array index: 0x02D9 */ 0x6DAA, 0x6DFD, 0x2000, + /* Array index: 0x02DC */ 0x6E19, 0x6E79, 0x2054, + /* Array index: 0x02DF */ 0x6E8D, 0x6ED8, 0x20B5, + /* Array index: 0x02E2 */ 0x6EEB, 0x6F43, 0x2101, + /* Array index: 0x02E5 */ 0x6F4E, 0x6F97, 0x215A, + /* Array index: 0x02E8 */ 0x6F9E, 0x6FCF, 0x21A4, + /* Array index: 0x02EB */ 0x6FDB, 0x6FF4, 0x21D6, + /* Array index: 0x02EE */ 0x6FFA, 0x704C, 0x21F0, + /* Array index: 0x02F1 */ 0x7051, 0x706B, 0x2243, + /* Array index: 0x02F4 */ 0x7082, 0x7086, 0x225E, + /* Array index: 0x02F7 */ 0x7091, 0x709A, 0x2263, + /* Array index: 0x02FA */ 0x70A9, 0x70BA, 0x226D, + /* Array index: 0x02FD */ 0x70C5, 0x70E4, 0x227F, + /* Array index: 0x0300 */ 0x70F3, 0x7110, 0x229F, + /* Array index: 0x0303 */ 0x7117, 0x7128, 0x22BD, + /* Array index: 0x0306 */ 0x712E, 0x7132, 0x22CF, + /* Array index: 0x0309 */ 0x7141, 0x7172, 0x22D4, + /* Array index: 0x030C */ 0x7180, 0x718A, 0x2306, + /* Array index: 0x030F */ 0x7197, 0x71F4, 0x2311, + /* Array index: 0x0312 */ 0x71F8, 0x7207, 0x236F, + /* Array index: 0x0315 */ 0x7219, 0x722D, 0x237F, + /* Array index: 0x0318 */ 0x7235, 0x724C, 0x2394, + /* Array index: 0x031B */ 0x7256, 0x7263, 0x23AC, + /* Array index: 0x031E */ 0x726C, 0x72B0, 0x23BA, + /* Array index: 0x0321 */ 0x72BD, 0x72EB, 0x23FF, + /* Array index: 0x0324 */ 0x72F3, 0x7301, 0x242E, + /* Array index: 0x0327 */ 0x7307, 0x730C, 0x243D, + /* Array index: 0x032A */ 0x730F, 0x731E, 0x2443, + /* Array index: 0x032D */ 0x7322, 0x7329, 0x2453, + /* Array index: 0x0330 */ 0x7330, 0x7345, 0x245B, + /* Array index: 0x0333 */ 0x7349, 0x7352, 0x2471, + /* Array index: 0x0336 */ 0x7357, 0x738B, 0x247B, + /* Array index: 0x0339 */ 0x7392, 0x7397, 0x24B0, + /* Array index: 0x033C */ 0x739D, 0x73AD, 0x24B6, + /* Array index: 0x033F */ 0x73B2, 0x73CD, 0x24C7, + /* Array index: 0x0342 */ 0x73D2, 0x73E0, 0x24E3, + /* Array index: 0x0345 */ 0x73E5, 0x73EE, 0x24F2, + /* Array index: 0x0348 */ 0x73F4, 0x740D, 0x24FC, + /* Array index: 0x034B */ 0x7420, 0x7436, 0x2516, + /* Array index: 0x034E */ 0x743F, 0x7446, 0x252D, + /* Array index: 0x0351 */ 0x744A, 0x7464, 0x2535, + /* Array index: 0x0354 */ 0x7469, 0x7475, 0x2550, + /* Array index: 0x0357 */ 0x747C, 0x748B, 0x255D, + /* Array index: 0x035A */ 0x7494, 0x74C5, 0x256D, + /* Array index: 0x035D */ 0x74D4, 0x74E9, 0x259F, + /* Array index: 0x0360 */ 0x74F4, 0x74F7, 0x25B5, + /* Array index: 0x0363 */ 0x74FB, 0x7540, 0x25B9, + /* Array index: 0x0366 */ 0x754B, 0x754F, 0x25FF, + /* Array index: 0x0369 */ 0x7559, 0x7570, 0x2604, + /* Array index: 0x036C */ 0x7576, 0x7580, 0x261C, + /* Array index: 0x036F */ 0x7586, 0x759A, 0x2627, + /* Array index: 0x0372 */ 0x75A2, 0x75AB, 0x263C, + /* Array index: 0x0375 */ 0x75B2, 0x75E7, 0x2646, + /* Array index: 0x0378 */ 0x75ED, 0x7603, 0x267C, + /* Array index: 0x037B */ 0x7608, 0x7629, 0x2693, + /* Array index: 0x037E */ 0x762D, 0x7635, 0x26B5, + /* Array index: 0x0381 */ 0x7642, 0x7649, 0x26BE, + /* Array index: 0x0384 */ 0x7652, 0x7665, 0x26C6, + /* Array index: 0x0387 */ 0x7669, 0x7672, 0x26DA, + /* Array index: 0x038A */ 0x7678, 0x769E, 0x26E4, + /* Array index: 0x038D */ 0x76AA, 0x76B0, 0x270B, + /* Array index: 0x0390 */ 0x76BA, 0x76D4, 0x2712, + /* Array index: 0x0393 */ 0x76DA, 0x76FE, 0x272D, + /* Array index: 0x0396 */ 0x7701, 0x770B, 0x2752, + /* Array index: 0x0399 */ 0x7710, 0x7729, 0x275D, + /* Array index: 0x039C */ 0x772F, 0x773E, 0x2777, + /* Array index: 0x039F */ 0x7744, 0x774F, 0x2787, + /* Array index: 0x03A2 */ 0x7752, 0x776F, 0x2793, + /* Array index: 0x03A5 */ 0x777C, 0x7791, 0x27B1, + /* Array index: 0x03A8 */ 0x7797, 0x77BF, 0x27C7, + /* Array index: 0x03AB */ 0x77C9, 0x77FD, 0x27F0, + /* Array index: 0x03AE */ 0x7802, 0x7806, 0x2825, + /* Array index: 0x03B1 */ 0x780C, 0x7814, 0x282A, + /* Array index: 0x03B4 */ 0x781D, 0x7838, 0x2833, + /* Array index: 0x03B7 */ 0x7848, 0x7852, 0x284F, + /* Array index: 0x03BA */ 0x785C, 0x7871, 0x285A, + /* Array index: 0x03BD */ 0x787B, 0x7889, 0x2870, + /* Array index: 0x03C0 */ 0x7891, 0x78AD, 0x287F, + /* Array index: 0x03C3 */ 0x78B0, 0x78B4, 0x289C, + /* Array index: 0x03C6 */ 0x78BA, 0x78BE, 0x28A1, + /* Array index: 0x03C9 */ 0x78C1, 0x78D5, 0x28A6, + /* Array index: 0x03CC */ 0x78DA, 0x78F4, 0x28BB, + /* Array index: 0x03CF */ 0x78F7, 0x7905, 0x28D6, + /* Array index: 0x03D2 */ 0x790E, 0x7914, 0x28E5, + /* Array index: 0x03D5 */ 0x7919, 0x791E, 0x28EC, + /* Array index: 0x03D8 */ 0x7921, 0x7931, 0x28F2, + /* Array index: 0x03DB */ 0x7938, 0x796D, 0x2903, + /* Array index: 0x03DE */ 0x7970, 0x7974, 0x2939, + /* Array index: 0x03E1 */ 0x7979, 0x7982, 0x293E, + /* Array index: 0x03E4 */ 0x798A, 0x79C1, 0x2948, + /* Array index: 0x03E7 */ 0x79CB, 0x79EE, 0x2980, + /* Array index: 0x03EA */ 0x79F6, 0x79FB, 0x29A4, + /* Array index: 0x03ED */ 0x7A00, 0x7A05, 0x29AA, + /* Array index: 0x03F0 */ 0x7A08, 0x7A22, 0x29B0, + /* Array index: 0x03F3 */ 0x7A2E, 0x7A31, 0x29CB, + /* Array index: 0x03F6 */ 0x7A39, 0x7A40, 0x29CF, + /* Array index: 0x03F9 */ 0x7A44, 0x7A4E, 0x29D7, + /* Array index: 0x03FC */ 0x7A54, 0x7A62, 0x29E2, + /* Array index: 0x03FF */ 0x7A67, 0x7A99, 0x29F1, + /* Array index: 0x0402 */ 0x7A9E, 0x7AA3, 0x2A24, + /* Array index: 0x0405 */ 0x7AA8, 0x7ACB, 0x2A2A, + /* Array index: 0x0408 */ 0x7ADF, 0x7AE6, 0x2A4E, + /* Array index: 0x040B */ 0x7AEB, 0x7AEF, 0x2A56, + /* Array index: 0x040E */ 0x7AF6, 0x7B13, 0x2A5B, + /* Array index: 0x0411 */ 0x7B18, 0x7B35, 0x2A79, + /* Array index: 0x0414 */ 0x7B44, 0x7B58, 0x2A97, + /* Array index: 0x0417 */ 0x7B60, 0x7B69, 0x2AAC, + /* Array index: 0x041A */ 0x7B6D, 0x7B78, 0x2AB6, + /* Array index: 0x041D */ 0x7B84, 0x7BA1, 0x2AC2, + /* Array index: 0x0420 */ 0x7BB4, 0x7BB9, 0x2AE0, + /* Array index: 0x0423 */ 0x7BC6, 0x7BCE, 0x2AE6, + /* Array index: 0x0426 */ 0x7BD4, 0x7BEB, 0x2AEF, + /* Array index: 0x0429 */ 0x7BF0, 0x7C11, 0x2B07, + /* Array index: 0x042C */ 0x7C1C, 0x7C2D, 0x2B29, + /* Array index: 0x042F */ 0x7C37, 0x7C40, 0x2B3B, + /* Array index: 0x0432 */ 0x7C45, 0x7C4D, 0x2B45, + /* Array index: 0x0435 */ 0x7C57, 0x7C7A, 0x2B4E, + /* Array index: 0x0438 */ 0x7C7D, 0x7C8D, 0x2B72, + /* Array index: 0x043B */ 0x7C91, 0x7C98, 0x2B83, + /* Array index: 0x043E */ 0x7C9E, 0x7CA5, 0x2B8B, + /* Array index: 0x0441 */ 0x7CAF, 0x7CBF, 0x2B93, + /* Array index: 0x0444 */ 0x7CC8, 0x7CE2, 0x2BA4, + /* Array index: 0x0447 */ 0x7CEC, 0x7CF8, 0x2BBF, + /* Array index: 0x044A */ 0x7CFD, 0x7D22, 0x2BCC, + /* Array index: 0x044D */ 0x7D28, 0x7D47, 0x2BF2, + /* Array index: 0x0450 */ 0x7D4E, 0x7D73, 0x2C12, + /* Array index: 0x0453 */ 0x7D79, 0x7D96, 0x2C38, + /* Array index: 0x0456 */ 0x7D9C, 0x7DCE, 0x2C56, + /* Array index: 0x0459 */ 0x7DD7, 0x7DFB, 0x2C89, + /* Array index: 0x045C */ 0x7E08, 0x7E49, 0x2CAE, + /* Array index: 0x045F */ 0x7E50, 0x7E63, 0x2CF0, + /* Array index: 0x0462 */ 0x7E68, 0x7E9C, 0x2D04, + /* Array index: 0x0465 */ 0x7F36, 0x7F45, 0x2D39, + /* Array index: 0x0468 */ 0x7F48, 0x7F55, 0x2D49, + /* Array index: 0x046B */ 0x7F5B, 0x7F7F, 0x2D57, + /* Array index: 0x046E */ 0x7F83, 0x7FD7, 0x2D7C, + /* Array index: 0x0471 */ 0x7FDB, 0x8021, 0x2DD1, + /* Array index: 0x0474 */ 0x8026, 0x802C, 0x2E18, + /* Array index: 0x0477 */ 0x8033, 0x803F, 0x2E1F, + /* Array index: 0x047A */ 0x8046, 0x804A, 0x2E2C, + /* Array index: 0x047D */ 0x804F, 0x8052, 0x2E31, + /* Array index: 0x0480 */ 0x805A, 0x805E, 0x2E35, + /* Array index: 0x0483 */ 0x806F, 0x807F, 0x2E3A, + /* Array index: 0x0486 */ 0x8082, 0x80B5, 0x2E4B, + /* Array index: 0x0489 */ 0x80C2, 0x80E6, 0x2E7F, + /* Array index: 0x048C */ 0x80ED, 0x810A, 0x2EA4, + /* Array index: 0x048F */ 0x8115, 0x8130, 0x2EC2, + /* Array index: 0x0492 */ 0x8143, 0x8155, 0x2EDE, + /* Array index: 0x0495 */ 0x815E, 0x817A, 0x2EF1, + /* Array index: 0x0498 */ 0x817F, 0x818F, 0x2F0E, + /* Array index: 0x049B */ 0x8195, 0x81D2, 0x2F1F, + /* Array index: 0x049E */ 0x81D5, 0x8216, 0x2F5D, + /* Array index: 0x04A1 */ 0x821B, 0x8222, 0x2F9F, + /* Array index: 0x04A4 */ 0x8228, 0x822C, 0x2FA7, + /* Array index: 0x04A7 */ 0x8232, 0x8285, 0x2FAC, + /* Array index: 0x04AA */ 0x828A, 0x82C3, 0x3000, + /* Array index: 0x04AD */ 0x82D1, 0x82FB, 0x303A, + /* Array index: 0x04B0 */ 0x82FE, 0x830D, 0x3065, + /* Array index: 0x04B3 */ 0x8322, 0x8356, 0x3075, + /* Array index: 0x04B6 */ 0x8373, 0x83B0, 0x30AA, + /* Array index: 0x04B9 */ 0x83BD, 0x8413, 0x30E8, + /* Array index: 0x04BC */ 0x8429, 0x847E, 0x313F, + /* Array index: 0x04BF */ 0x848D, 0x8491, 0x3195, + /* Array index: 0x04C2 */ 0x8497, 0x84D7, 0x319A, + /* Array index: 0x04C5 */ 0x84E7, 0x8531, 0x31DB, + /* Array index: 0x04C8 */ 0x853D, 0x854E, 0x3226, + /* Array index: 0x04CB */ 0x8551, 0x856E, 0x3238, + /* Array index: 0x04CE */ 0x8575, 0x85AA, 0x3256, + /* Array index: 0x04D1 */ 0x85AF, 0x85D2, 0x328C, + /* Array index: 0x04D4 */ 0x85D5, 0x860C, 0x32B0, + /* Array index: 0x04D7 */ 0x8617, 0x8640, 0x32E8, + /* Array index: 0x04DA */ 0x8646, 0x8656, 0x3312, + /* Array index: 0x04DD */ 0x865B, 0x8674, 0x3323, + /* Array index: 0x04E0 */ 0x8677, 0x867C, 0x333D, + /* Array index: 0x04E3 */ 0x8685, 0x86AA, 0x3343, + /* Array index: 0x04E6 */ 0x86AF, 0x86CC, 0x3369, + /* Array index: 0x04E9 */ 0x86D0, 0x86ED, 0x3387, + /* Array index: 0x04EC */ 0x86F5, 0x86FB, 0x33A5, + /* Array index: 0x04EF */ 0x86FE, 0x8713, 0x33AC, + /* Array index: 0x04F2 */ 0x8718, 0x8743, 0x33C2, + /* Array index: 0x04F5 */ 0x874C, 0x877B, 0x33EE, + /* Array index: 0x04F8 */ 0x8781, 0x8789, 0x341E, + /* Array index: 0x04FB */ 0x878D, 0x87A4, 0x3427, + /* Array index: 0x04FE */ 0x87AA, 0x87CC, 0x343F, + /* Array index: 0x0501 */ 0x87D1, 0x8844, 0x3462, + /* Array index: 0x0504 */ 0x8848, 0x884E, 0x34D6, + /* Array index: 0x0507 */ 0x8852, 0x8883, 0x34DD, + /* Array index: 0x050A */ 0x8888, 0x88AC, 0x350F, + /* Array index: 0x050D */ 0x88B6, 0x88C2, 0x3534, + /* Array index: 0x0510 */ 0x88C9, 0x88E1, 0x3541, + /* Array index: 0x0513 */ 0x88EB, 0x891A, 0x355A, + /* Array index: 0x0516 */ 0x891E, 0x8946, 0x358A, + /* Array index: 0x0519 */ 0x894B, 0x8988, 0x35B3, + /* Array index: 0x051C */ 0x8993, 0x89A6, 0x35F1, + /* Array index: 0x051F */ 0x89AA, 0x89AF, 0x3605, + /* Array index: 0x0522 */ 0x89B6, 0x89C0, 0x360B, + /* Array index: 0x0525 */ 0x89D2, 0x8A18, 0x3616, + /* Array index: 0x0528 */ 0x8A1B, 0x8A27, 0x365D, + /* Array index: 0x052B */ 0x8A39, 0x8A5B, 0x366A, + /* Array index: 0x052E */ 0x8A5E, 0x8A63, 0x368D, + /* Array index: 0x0531 */ 0x8A68, 0x8A7C, 0x3693, + /* Array index: 0x0534 */ 0x8A7F, 0x8A9A, 0x36A8, + /* Array index: 0x0537 */ 0x8AA0, 0x8AAB, 0x36C4, + /* Array index: 0x053A */ 0x8AB6, 0x8AE8, 0x36D0, + /* Array index: 0x053D */ 0x8AEB, 0x8B60, 0x3703, + /* Array index: 0x0540 */ 0x8B63, 0x8B70, 0x3779, + /* Array index: 0x0543 */ 0x8B77, 0x8B9F, 0x3787, + /* Array index: 0x0546 */ 0x8C39, 0x8C57, 0x37B0, + /* Array index: 0x0549 */ 0x8C61, 0x8CCC, 0x37CF, + /* Array index: 0x054C */ 0x8CCF, 0x8D0A, 0x383B, + /* Array index: 0x054F */ 0x8D0F, 0x8D1B, 0x3877, + /* Array index: 0x0552 */ 0x8D64, 0x8D85, 0x3884, + /* Array index: 0x0555 */ 0x8D89, 0x8D96, 0x38A6, + /* Array index: 0x0558 */ 0x8D9B, 0x8DF4, 0x38B4, + /* Array index: 0x055B */ 0x8DFA, 0x8E0A, 0x390E, + /* Array index: 0x055E */ 0x8E0D, 0x8E2B, 0x391F, + /* Array index: 0x0561 */ 0x8E30, 0x8E7C, 0x393E, + /* Array index: 0x0564 */ 0x8E81, 0x8EAC, 0x398B, + /* Array index: 0x0567 */ 0x8EC9, 0x8F64, 0x39B7, + /* Array index: 0x056A */ 0x8FAD, 0x8FB4, 0x3A53, + /* Array index: 0x056D */ 0x8FC2, 0x8FC6, 0x3A5B, + /* Array index: 0x0570 */ 0x8FCD, 0x8FD7, 0x3A60, + /* Array index: 0x0573 */ 0x8FE0, 0x9006, 0x3A6B, + /* Array index: 0x0576 */ 0x900B, 0x9024, 0x3A92, + /* Array index: 0x0579 */ 0x902D, 0x9044, 0x3AAC, + /* Array index: 0x057C */ 0x9047, 0x90A7, 0x3AC4, + /* Array index: 0x057F */ 0x90AF, 0x90B8, 0x3B25, + /* Array index: 0x0582 */ 0x90BD, 0x90CB, 0x3B2F, + /* Array index: 0x0585 */ 0x90D4, 0x915A, 0x3B3E, + /* Array index: 0x0588 */ 0x915F, 0x917A, 0x3BC5, + /* Array index: 0x058B */ 0x9180, 0x9193, 0x3BE1, + /* Array index: 0x058E */ 0x9199, 0x91DD, 0x3BF5, + /* Array index: 0x0591 */ 0x91E2, 0x91EE, 0x3C3A, + /* Array index: 0x0594 */ 0x91F1, 0x91F9, 0x3C47, + /* Array index: 0x0597 */ 0x91FD, 0x921E, 0x3C50, + /* Array index: 0x059A */ 0x9223, 0x9227, 0x3C72, + /* Array index: 0x059D */ 0x922D, 0x9240, 0x3C77, + /* Array index: 0x05A0 */ 0x9245, 0x925B, 0x3C8B, + /* Array index: 0x05A3 */ 0x9260, 0x9267, 0x3CA2, + /* Array index: 0x05A6 */ 0x926C, 0x9272, 0x3CAA, + /* Array index: 0x05A9 */ 0x9276, 0x928E, 0x3CB1, + /* Array index: 0x05AC */ 0x9291, 0x92AC, 0x3CCA, + /* Array index: 0x05AF */ 0x92B2, 0x92B7, 0x3CE6, + /* Array index: 0x05B2 */ 0x92C0, 0x92E1, 0x3CEC, + /* Array index: 0x05B5 */ 0x92E4, 0x92F1, 0x3D0E, + /* Array index: 0x05B8 */ 0x92F7, 0x9339, 0x3D1C, + /* Array index: 0x05BB */ 0x9346, 0x9367, 0x3D5F, + /* Array index: 0x05BE */ 0x9375, 0x9383, 0x3D81, + /* Array index: 0x05C1 */ 0x9388, 0x93B7, 0x3D90, + /* Array index: 0x05C4 */ 0x93C0, 0x93E8, 0x3DC0, + /* Array index: 0x05C7 */ 0x93F5, 0x9400, 0x3DE9, + /* Array index: 0x05CA */ 0x9406, 0x9419, 0x3DF5, + /* Array index: 0x05CD */ 0x9428, 0x9452, 0x3E09, + /* Array index: 0x05D0 */ 0x9460, 0x9483, 0x3E34, + /* Array index: 0x05D3 */ 0x957A, 0x957D, 0x3E58, + /* Array index: 0x05D6 */ 0x9588, 0x9594, 0x3E5C, + /* Array index: 0x05D9 */ 0x959B, 0x95C0, 0x3E69, + /* Array index: 0x05DC */ 0x95C3, 0x95E5, 0x3E8F, + /* Array index: 0x05DF */ 0x961E, 0x9624, 0x3EB2, + /* Array index: 0x05E2 */ 0x962A, 0x9632, 0x3EB9, + /* Array index: 0x05E5 */ 0x9639, 0x9644, 0x3EC2, + /* Array index: 0x05E8 */ 0x964A, 0x9654, 0x3ECE, + /* Array index: 0x05EB */ 0x965B, 0x9664, 0x3ED9, + /* Array index: 0x05EE */ 0x966A, 0x96B4, 0x3EE3, + /* Array index: 0x05F1 */ 0x96B8, 0x96EA, 0x3F2E, + /* Array index: 0x05F4 */ 0x96EF, 0x9713, 0x3F61, + /* Array index: 0x05F7 */ 0x9718, 0x9732, 0x3F86, + /* Array index: 0x05FA */ 0x9738, 0x974B, 0x3FA1, + /* Array index: 0x05FD */ 0x9758, 0x9762, 0x3FB5, + /* Array index: 0x0600 */ 0x9766, 0x9785, 0x3FC0, + /* Array index: 0x0603 */ 0x978A, 0x978F, 0x3FE0, + /* Array index: 0x0606 */ 0x9797, 0x97AE, 0x3FE6, + /* Array index: 0x0609 */ 0x97C1, 0x97E5, 0x3FFE, + /* Array index: 0x060C */ 0x97F6, 0x9821, 0x4023, + /* Array index: 0x060F */ 0x9824, 0x9832, 0x404F, + /* Array index: 0x0612 */ 0x9835, 0x983B, 0x405E, + /* Array index: 0x0615 */ 0x9841, 0x9874, 0x4065, + /* Array index: 0x0618 */ 0x98A8, 0x98B3, 0x4099, + /* Array index: 0x061B */ 0x98B8, 0x98C6, 0x40A5, + /* Array index: 0x061E */ 0x98E7, 0x98EF, 0x40B4, + /* Array index: 0x0621 */ 0x98F9, 0x9935, 0x40BD, + /* Array index: 0x0624 */ 0x993A, 0x9961, 0x40FA, + /* Array index: 0x0627 */ 0x9996, 0x999E, 0x4122, + /* Array index: 0x062A */ 0x99A3, 0x99C3, 0x412B, + /* Array index: 0x062D */ 0x99C9, 0x99F1, 0x414C, + /* Array index: 0x0630 */ 0x99F4, 0x9A6B, 0x4175, + /* Array index: 0x0633 */ 0x9AAD, 0x9AC2, 0x41ED, + /* Array index: 0x0636 */ 0x9ACD, 0x9AD8, 0x4203, + /* Array index: 0x0639 */ 0x9AEB, 0x9AFE, 0x420F, + /* Array index: 0x063C */ 0x9B01, 0x9B61, 0x4223, + /* Array index: 0x063F */ 0x9B64, 0x9B68, 0x4284, + /* Array index: 0x0642 */ 0x9B6F, 0x9B88, 0x4289, + /* Array index: 0x0645 */ 0x9B90, 0x9B95, 0x42A3, + /* Array index: 0x0648 */ 0x9B9E, 0x9BAF, 0x42A9, + /* Array index: 0x064B */ 0x9BB5, 0x9BB9, 0x42BB, + /* Array index: 0x064E */ 0x9BBD, 0x9BCA, 0x42C0, + /* Array index: 0x0651 */ 0x9BD3, 0x9BEC, 0x42CE, + /* Array index: 0x0654 */ 0x9C05, 0x9C14, 0x42E8, + /* Array index: 0x0657 */ 0x9C21, 0x9C41, 0x42F8, + /* Array index: 0x065A */ 0x9C46, 0x9C59, 0x4319, + /* Array index: 0x065D */ 0x9C5E, 0x9C68, 0x432D, + /* Array index: 0x0660 */ 0x9C71, 0x9C7A, 0x4338, + /* Array index: 0x0663 */ 0x9CE5, 0x9CEA, 0x4342, + /* Array index: 0x0666 */ 0x9CF1, 0x9D09, 0x4348, + /* Array index: 0x0669 */ 0x9D14, 0x9D38, 0x4361, + /* Array index: 0x066C */ 0x9D3B, 0x9D45, 0x4386, + /* Array index: 0x066F */ 0x9D4A, 0x9D4C, 0x4391, + /* Array index: 0x0672 */ 0x9D4F, 0x9D61, 0x4394, + /* Array index: 0x0675 */ 0x9D67, 0x9D8C, 0x43A7, + /* Array index: 0x0678 */ 0x9D94, 0x9E1E, 0x43CD, + /* Array index: 0x067B */ 0x9E79, 0x9E94, 0x4458, + /* Array index: 0x067E */ 0x9E97, 0x9EA9, 0x4474, + /* Array index: 0x0681 */ 0x9EB4, 0x9EB7, 0x4487, + /* Array index: 0x0684 */ 0x9ECC, 0x9EE8, 0x448B, + /* Array index: 0x0687 */ 0x9EEB, 0x9F01, 0x44A8, + /* Array index: 0x068A */ 0x9F06, 0x9F38, 0x44BF, + /* Array index: 0x068D */ 0x9F3D, 0x9F4F, 0x44F2, + /* Array index: 0x0690 */ 0x9F52, 0x9F7B, 0x4505, + /* Array index: 0x0693 */ 0x9F90, 0x9F95, 0x452F, + /* Array index: 0x0696 */ 0xFE30, 0xFE44, 0x4535, + /* Array index: 0x0699 */ 0xFE49, 0xFE6B, 0x454A, + /* Array index: 0x069C */ 0xFF01, 0xFF3C, 0x456D, + /* Array index: 0x069F */ 0xFF3F, 0xFF5D, 0x45A9, + /* Ranges content */ + /* Range 0x02C7 - 0x02CB, array index: 0x06A2 */ + 0xA3BE,INVALC,0xA3BC,0xA3BD,0xA3BF, + /* Range 0x0391 - 0x03A9, array index: 0x06A7 */ + 0xA344,0xA345,0xA346,0xA347,0xA348,0xA349,0xA34A,0xA34B, + 0xA34C,0xA34D,0xA34E,0xA34F,0xA350,0xA351,0xA352,0xA353, + 0xA354,INVALC,0xA355,0xA356,0xA357,0xA358,0xA359,0xA35A, + 0xA35B, + /* Range 0x03B1 - 0x03C9, array index: 0x06C0 */ + 0xA35C,0xA35D,0xA35E,0xA35F,0xA360,0xA361,0xA362,0xA363, + 0xA364,0xA365,0xA366,0xA367,0xA368,0xA369,0xA36A,0xA36B, + 0xA36C,INVALC,0xA36D,0xA36E,0xA36F,0xA370,0xA371,0xA372, + 0xA373, + /* Range 0x0414 - 0x041C, array index: 0x06D9 */ + 0xC7B1,0xC7B2,0xC7B4,0xC7B5,0xC7B6,0xC7B7,0xC7B8,0xC7B9, + 0xC7BA, + /* Range 0x0423 - 0x0451, array index: 0x06E2 */ + 0xC7BB,0xC7BC,0xC7BD,0xC7BE,0xC7BF,0xC7C0,0xC7C1,0xC7C2, + 0xC7C3,0xC7C4,0xC7C5,0xC7C6,0xC7C7,0xC7C8,0xC7C9,0xC7CA, + 0xC7CB,0xC7CC,0xC7CD,0xC7CF,0xC7D0,0xC7D1,0xC7D2,0xC7D3, + 0xC7D4,0xC7D5,0xC7D6,0xC7D7,0xC7D8,0xC7D9,0xC7DA,0xC7DB, + 0xC7DC,0xC7DD,0xC7DE,0xC7DF,0xC7E0,0xC7E1,0xC7E2,0xC7E3, + 0xC7E4,0xC7E5,0xC7E6,0xC7E7,0xC7E8,INVALC,0xC7CE, + /* Range 0x2160 - 0x2169, array index: 0x0711 */ + 0xA2B9,0xA2BA,0xA2BB,0xA2BC,0xA2BD,0xA2BE,0xA2BF,0xA2C0, + 0xA2C1,0xA2C2, + /* Range 0x2190 - 0x2199, array index: 0x071B */ + 0xA1F6,0xA1F4,0xA1F7,0xA1F5,INVALC,INVALC,0xA1F8,0xA1F9, + 0xA1FB,0xA1FA, + /* Range 0x221E - 0x2220, array index: 0x0725 */ + 0xA1DB,0xA1E8,0xA1E7, + /* Range 0x2229 - 0x222B, array index: 0x0728 */ + 0xA1E4,0xA1E5,0xA1EC, + /* Range 0x2460 - 0x2469, array index: 0x072B */ + 0xC7E9,0xC7EA,0xC7EB,0xC7EC,0xC7ED,0xC7EE,0xC7EF,0xC7F0, + 0xC7F1,0xC7F2, + /* Range 0x2474 - 0x247D, array index: 0x0735 */ + 0xC7F3,0xC7F4,0xC7F5,0xC7F6,0xC7F7,0xC7F8,0xC7F9,0xC7FA, + 0xC7FB,0xC7FC, + /* Range 0x256D - 0x2573, array index: 0x073F */ + 0xA27E,0xA2A1,0xA2A3,0xA2A2,0xA2AC,0xA2AD,0xA2AE, + /* Range 0x2581 - 0x258F, array index: 0x0746 */ + 0xA262,0xA263,0xA264,0xA265,0xA266,0xA267,0xA268,0xA269, + 0xA270,0xA26F,0xA26E,0xA26D,0xA26C,0xA26B,0xA26A, + /* Range 0x25E2 - 0x25E5, array index: 0x0755 */ + 0xA2A8,0xA2A9,0xA2AB,0xA2AA, + /* Range 0x2640 - 0x2642, array index: 0x0759 */ + 0xA1F0,0xA1F2,0xA1F1, + /* Range 0x3000 - 0x3015, array index: 0x075C */ + 0xA140,0xA142,0xA143,0xA1B2,INVALC,0xC6A4,INVALC,INVALC, + 0xA171,0xA172,0xA16D,0xA16E,0xA175,0xA176,0xA179,0xA17A, + 0xA169,0xA16A,0xA245,INVALC,0xA165,0xA166, + /* Range 0x301D - 0x3029, array index: 0x0772 */ + 0xA1A9,0xA1AA,INVALC,INVALC,0xA2C3,0xA2C4,0xA2C5,0xA2C6, + 0xA2C7,0xA2C8,0xA2C9,0xA2CA,0xA2CB, + /* Range 0x3041 - 0x3093, array index: 0x077F */ + 0xC6A5,0xC6A6,0xC6A7,0xC6A8,0xC6A9,0xC6AA,0xC6AB,0xC6AC, + 0xC6AD,0xC6AE,0xC6AF,0xC6B0,0xC6B1,0xC6B2,0xC6B3,0xC6B4, + 0xC6B5,0xC6B6,0xC6B7,0xC6B8,0xC6B9,0xC6BA,0xC6BB,0xC6BC, + 0xC6BD,0xC6BE,0xC6BF,0xC6C0,0xC6C1,0xC6C2,0xC6C3,0xC6C4, + 0xC6C5,0xC6C6,0xC6C7,0xC6C8,0xC6C9,0xC6CA,0xC6CB,0xC6CC, + 0xC6CD,0xC6CE,0xC6CF,0xC6D0,0xC6D1,0xC6D2,0xC6D3,0xC6D4, + 0xC6D5,0xC6D6,0xC6D7,0xC6D8,0xC6D9,0xC6DA,0xC6DB,0xC6DC, + 0xC6DD,0xC6DE,0xC6DF,0xC6E0,0xC6E1,0xC6E2,0xC6E3,0xC6E4, + 0xC6E5,0xC6E6,0xC6E7,0xC6E8,0xC6E9,0xC6EA,0xC6EB,0xC6EC, + 0xC6ED,0xC6EE,0xC6EF,0xC6F0,0xC6F1,0xC6F2,0xC6F3,0xC6F4, + 0xC6F5,0xC6F6,0xC6F7, + /* Range 0x309D - 0x30F6, array index: 0x07D2 */ + 0xC6A2,0xC6A3,INVALC,INVALC,0xC6F8,0xC6F9,0xC6FA,0xC6FB, + 0xC6FC,0xC6FD,0xC6FE,0xC740,0xC741,0xC742,0xC743,0xC744, + 0xC745,0xC746,0xC747,0xC748,0xC749,0xC74A,0xC74B,0xC74C, + 0xC74D,0xC74E,0xC74F,0xC750,0xC751,0xC752,0xC753,0xC754, + 0xC755,0xC756,0xC757,0xC758,0xC759,0xC75A,0xC75B,0xC75C, + 0xC75D,0xC75E,0xC75F,0xC760,0xC761,0xC762,0xC763,0xC764, + 0xC765,0xC766,0xC767,0xC768,0xC769,0xC76A,0xC76B,0xC76C, + 0xC76D,0xC76E,0xC76F,0xC770,0xC771,0xC772,0xC773,0xC774, + 0xC775,0xC776,0xC777,0xC778,0xC779,0xC77A,0xC77B,0xC77C, + 0xC77D,0xC77E,0xC7A1,0xC7A2,0xC7A3,0xC7A4,0xC7A5,0xC7A6, + 0xC7A7,0xC7A8,0xC7A9,0xC7AA,0xC7AB,0xC7AC,0xC7AD,0xC7AE, + 0xC7AF,0xC7B0, + /* Range 0x3105 - 0x3129, array index: 0x082C */ + 0xA374,0xA375,0xA376,0xA377,0xA378,0xA379,0xA37A,0xA37B, + 0xA37C,0xA37D,0xA37E,0xA3A1,0xA3A2,0xA3A3,0xA3A4,0xA3A5, + 0xA3A6,0xA3A7,0xA3A8,0xA3A9,0xA3AA,0xA3AB,0xA3AC,0xA3AD, + 0xA3AE,0xA3AF,0xA3B0,0xA3B1,0xA3B2,0xA3B3,0xA3B4,0xA3B5, + 0xA3B6,0xA3B7,0xA3B8,0xA3B9,0xA3BA, + /* Range 0x339C - 0x339E, array index: 0x0851 */ + 0xA250,0xA251,0xA252, + /* Range 0x4E07 - 0x4E19, array index: 0x0854 */ + 0xC945,0xA456,0xA454,0xA457,0xA455,0xC946,0xA4A3,0xC94F, + 0xC94D,0xA4A2,0xA4A1,INVALC,INVALC,0xA542,0xA541,0xA540, + INVALC,0xA543,0xA4FE, + /* Range 0x4E2D - 0x4E33, array index: 0x0867 */ + 0xA4A4,0xC950,INVALC,0xA4A5,0xC963,0xA6EA,0xCBB1, + /* Range 0x4E38 - 0x4E3C, array index: 0x086E */ + 0xA459,0xA4A6,INVALC,0xA544,0xC964, + /* Range 0x4E4B - 0x4E53, array index: 0x0873 */ + 0xA4A7,INVALC,0xA545,0xA547,0xA546,INVALC,INVALC,0xA5E2, + 0xA5E3, + /* Range 0x4E58 - 0x4E5F, array index: 0x087C */ + 0xADBC,0xA441,INVALC,INVALC,0xC941,0xA445,0xA45E,0xA45D, + /* Range 0x4E7E - 0x4E95, array index: 0x0884 */ + 0xB0AE,0xD44B,INVALC,INVALC,0xB6C3,0xDCB1,0xDCB2,INVALC, + 0xA446,INVALC,0xA4A9,INVALC,INVALC,0xA8C6,0xA447,0xC948, + 0xA45F,INVALC,INVALC,0xA4AA,0xA4AC,0xC951,0xA4AD,0xA4AB, + /* Range 0x4E9E - 0x4EAE, array index: 0x089C */ + 0xA8C8,0xAB45,INVALC,0xA460,0xA4AE,INVALC,0xA5E6,0xA5E8, + 0xA5E7,INVALC,0xA6EB,INVALC,INVALC,0xA8C9,0xA8CA,0xAB46, + 0xAB47, + /* Range 0x4EC0 - 0x4ECD, array index: 0x08AD */ + 0xA4B0,0xA4AF,0xC952,0xA4B1,0xA4B7,INVALC,0xA4B2,0xA4B3, + 0xC954,0xC953,0xA4B5,0xA4B6,INVALC,0xA4B4, + /* Range 0x4ED4 - 0x4EE9, array index: 0x08BB */ + 0xA54A,0xA54B,0xA54C,0xA54D,0xA549,0xA550,0xC96A,INVALC, + 0xC966,0xC969,0xA551,0xA561,INVALC,0xC968,INVALC,0xA54E, + 0xA54F,0xA548,INVALC,INVALC,0xC965,0xC967, + /* Range 0x4EF0 - 0x4EF7, array index: 0x08D1 */ + 0xA5F5,0xC9B0,0xA5F2,0xA5F6,0xC9BA,0xC9AE,0xA5F3,0xC9B2, + /* Range 0x4EFD - 0x4F19, array index: 0x08D9 */ + 0xA5F7,INVALC,0xA5E9,0xC9B1,0xA5F8,0xC9B5,INVALC,0xC9B9, + 0xC9B6,INVALC,INVALC,0xC9B3,0xA5EA,0xA5EC,0xA5F9,INVALC, + 0xA5EE,0xC9AB,0xA5F1,0xA5EF,0xA5F0,0xC9BB,0xC9B8,0xC9AF, + 0xA5ED,INVALC,INVALC,0xC9AC,0xA5EB, + /* Range 0x4F2C - 0x4F64, array index: 0x08F6 */ + 0xC9AD,0xCA66,INVALC,0xA742,0xA6F4,INVALC,INVALC,0xCA67, + 0xA6F1,INVALC,0xA744,INVALC,0xA6F9,INVALC,0xA6F8,0xCA5B, + 0xA6FC,0xA6F7,0xCA60,0xCA68,INVALC,0xCA64,INVALC,0xA6FA, + INVALC,INVALC,0xA6FD,0xA6EE,0xA747,0xCA5D,INVALC,INVALC, + 0xCBBD,0xA6EC,0xA743,0xA6ED,0xA6F5,0xA6F6,0xCA62,0xCA5E, + 0xA6FB,0xA6F3,0xCA5A,0xA6EF,0xCA65,0xA745,0xA748,0xA6F2, + 0xA740,0xA746,0xA6F0,0xCA63,0xA741,0xCA69,0xCA5C,0xA6FE, + 0xCA5F, + /* Range 0x4F67 - 0x4F9E, array index: 0x092F */ + 0xCA61,INVALC,0xA8D8,0xCBBF,0xCBCB,0xA8D0,INVALC,0xCBCC, + 0xA8CB,0xA8D5,INVALC,INVALC,0xA8CE,0xCBB9,0xA8D6,0xCBB8, + 0xCBBC,0xCBC3,0xCBC1,0xA8DE,0xA8D9,0xCBB3,0xCBB5,0xA8DB, + 0xA8CF,0xCBB6,0xCBC2,0xCBC9,0xA8D4,0xCBBB,0xCBB4,0xA8D3, + 0xCBB7,0xA8D7,0xCBBA,INVALC,0xA8D2,INVALC,0xA8CD,INVALC, + 0xA8DC,0xCBC4,0xA8DD,0xCBC8,INVALC,0xCBC6,0xCBCA,0xA8DA, + 0xCBBE,0xCBB2,INVALC,0xCBC0,0xA8D1,0xCBC5,0xA8CC,0xCBC7, + /* Range 0x4FB2 - 0x4FE1, array index: 0x0967 */ + 0xCDE0,0xCDE8,INVALC,0xAB49,0xAB51,0xAB5D,INVALC,0xCDEE, + 0xCDEC,0xCDE7,INVALC,INVALC,INVALC,0xAB4B,0xCDED,0xCDE3, + 0xAB59,0xAB50,0xAB58,0xCDDE,INVALC,0xCDEA,INVALC,0xCDE1, + 0xAB54,0xCDE2,INVALC,0xCDDD,0xAB5B,0xAB4E,0xAB57,0xAB4D, + INVALC,0xCDDF,0xCDE4,INVALC,0xCDEB,0xAB55,0xAB52,0xCDE6, + 0xAB5A,0xCDE9,0xCDE5,0xAB4F,0xAB5C,0xAB53,0xAB4C,0xAB48, + /* Range 0x4FF1 - 0x4FFA, array index: 0x0997 */ + 0xADD1,INVALC,0xADD6,0xD0D0,0xD0CF,0xD0D4,0xD0D5,0xADC4, + INVALC,0xADCD, + /* Range 0x5005 - 0x5037, array index: 0x09A1 */ + 0xD0C9,0xADC7,0xD0CA,INVALC,0xADDC,INVALC,0xADD3,0xADBE, + 0xADBF,0xD0DD,0xB0BF,INVALC,0xADCC,0xADCB,0xD0CB,0xADCF, + 0xD45B,0xADC6,0xD0D6,0xADD5,0xADD4,0xADCA,0xD0CE,0xD0D7, + INVALC,0xD0C8,0xADC9,0xD0D8,0xADD2,0xD0CC,0xADC0,INVALC, + 0xADC3,0xADC2,0xD0D9,0xADD0,0xADC5,0xADD9,0xADDB,0xD0D3, + 0xADD8,INVALC,0xD0DB,0xD0CD,0xD0DC,INVALC,0xD0D1,INVALC, + 0xD0DA,INVALC,0xD0D2, + /* Range 0x5043 - 0x5077, array index: 0x09D4 */ + 0xB0B3,INVALC,0xD45C,0xD462,0xB0B2,0xD455,0xB0B6,0xD459, + 0xD452,0xB0B4,0xD456,0xB0B9,0xB0BE,INVALC,0xD467,INVALC, + 0xD451,INVALC,0xB0BA,INVALC,0xD466,INVALC,INVALC,0xB0B5, + 0xD458,0xB0B1,0xD453,0xD44F,0xD45D,0xD450,0xD44E,0xD45A, + 0xD460,0xD461,0xB0B7,INVALC,INVALC,0xD85B,0xD45E,0xD44D, + 0xD45F,INVALC,0xB0C1,0xD464,0xB0C0,0xD44C,INVALC,0xD454, + 0xD465,0xB0BC,0xB0BB,0xB0B8,0xB0BD, + /* Range 0x508B - 0x509E, array index: 0x0A09 */ + 0xD855,0xD858,0xB3C4,0xD859,INVALC,INVALC,0xB3C7,0xD85D, + INVALC,0xD853,0xD852,0xB3C9,INVALC,0xB3CA,0xB3C6,0xB3CB, + 0xD851,0xD85C,0xD85A,0xD854, + /* Range 0x50AC - 0x50DD, array index: 0x0A1D */ + 0xB6CA,0xB6C4,0xDCB7,0xB6CD,0xDCBD,0xDCC0,0xB6C6,0xB6C7, + 0xDCBA,0xB6C5,0xDCC3,0xB6CB,0xDCC4,INVALC,0xDCBF,0xB6CC, + INVALC,0xDCB4,0xB6C9,0xDCB5,INVALC,0xDCBE,0xDCBC,INVALC, + 0xDCB8,0xB6C8,0xDCB6,0xB6CE,0xDCBB,0xDCC2,0xDCB9,0xDCC1, + INVALC,INVALC,0xB9B6,0xB9B3,INVALC,0xB9B4,INVALC,0xE0F9, + 0xE0F1,0xB9B2,0xB9AF,0xE0F2,INVALC,INVALC,0xB9B1,0xE0F5, + INVALC,0xE0F7, + /* Range 0x50E3 - 0x514D, array index: 0x0A4F */ + 0xE0FD,0xE0F8,0xB9AE,0xE0F0,0xB9AC,0xE0F3,0xB9B7,0xE0F6, + INVALC,0xE0FA,0xB9B0,0xB9AD,0xE0FC,0xE0FB,0xB9B5,INVALC, + 0xE0F4,INVALC,0xBBF8,0xE4EC,INVALC,0xE4E9,0xBBF9,INVALC, + 0xBBF7,INVALC,0xE4F0,0xE4ED,0xE4E6,0xBBF6,INVALC,0xBBFA, + 0xE4E7,0xBBF5,0xBBFD,0xE4EA,0xE4EB,0xBBFB,0xBBFC,0xE4F1, + 0xE4EE,0xE4EF,INVALC,INVALC,INVALC,0xBEAA,0xE8F8,0xBEA7, + 0xE8F5,0xBEA9,0xBEAB,INVALC,0xE8F6,0xBEA8,INVALC,0xE8F7, + INVALC,0xE8F4,INVALC,INVALC,0xC076,0xECBD,0xC077,0xECBB, + INVALC,0xECBC,0xECBA,0xECB9,INVALC,INVALC,0xECBE,0xC075, + INVALC,INVALC,0xEFB8,0xEFB9,INVALC,0xE4E8,0xEFB7,0xC078, + 0xC35F,0xF1EB,0xF1EC,INVALC,0xC4D7,0xC4D8,0xF5C1,0xF5C0, + 0xC56C,0xC56B,0xF7D0,INVALC,0xA449,0xA461,0xA4B9,INVALC, + 0xA4B8,0xA553,0xA552,0xA5FC,0xA5FB,0xA5FD,0xA5FA,INVALC, + 0xA74A,0xA749,0xA74B, + /* Range 0x5157 - 0x516E, array index: 0x0ABA */ + 0xAB5E,INVALC,0xA259,0xD0DE,0xA25A,0xB0C2,0xA25C,0xA25B, + 0xD860,INVALC,0xA25D,0xB9B8,0xA25E,INVALC,0xA44A,INVALC, + 0xA4BA,0xA5FE,0xA8E2,INVALC,0xA44B,0xA4BD,0xA4BB,0xA4BC, + /* Range 0x5175 - 0x5178, array index: 0x0AD2 */ + 0xA74C,0xA8E4,0xA8E3,0xA8E5, + /* Range 0x518F - 0x5198, array index: 0x0AD6 */ + 0xCA6A,INVALC,0xAB60,0xAB5F,0xD0E0,0xD0DF,0xB0C3,INVALC, + 0xA4BE,0xC955, + /* Range 0x51BC - 0x51BE, array index: 0x0AE0 */ + 0xCBCE,0xA8E6,0xCBCF, + /* Range 0x51C4 - 0x51D0, array index: 0x0AE3 */ + 0xD0E2,0xD0E3,0xADE3,INVALC,0xD0E4,INVALC,0xD0E1,0xADE4, + 0xADE2,0xADE1,0xD0E5,INVALC,0xD468, + /* Range 0x51DC - 0x51E1, array index: 0x0AF0 */ + 0xBBFE,0xBEAE,0xE8F9,INVALC,0xA44C,0xA45A, + /* Range 0x51F5 - 0x51FA, array index: 0x0AF6 */ + 0xC942,0xA4BF,INVALC,0xA559,0xA557,0xA558, + /* Range 0x5206 - 0x5217, array index: 0x0AFC */ + 0xA4C0,0xA4C1,0xA4C2,0xC9BE,0xA55A,INVALC,0xC96B,INVALC, + 0xA646,INVALC,0xC9BF,0xA644,0xA645,0xC9BD,INVALC,INVALC, + 0xA647,0xA643, + /* Range 0x521C - 0x521E, array index: 0x0B0E */ + 0xCA6C,0xAAEC,0xCA6D, + /* Range 0x5224 - 0x522A, array index: 0x0B11 */ + 0xA750,0xA74F,INVALC,INVALC,0xA753,0xA751,0xA752, + /* Range 0x522E - 0x523B, array index: 0x0B18 */ + 0xA8ED,INVALC,0xA8EC,0xCBD4,0xCBD1,0xCBD2,INVALC,0xCBD0, + 0xA8EE,0xA8EA,0xA8E9,INVALC,0xA8EB,0xA8E8, + /* Range 0x5243 - 0x524E, array index: 0x0B26 */ + 0xAB63,0xCDF0,INVALC,0xCBD3,0xAB68,INVALC,0xCDF1,0xAB64, + 0xAB67,0xAB66,0xAB65,0xAB62, + /* Range 0x5252 - 0x5262, array index: 0x0B32 */ + 0xD0E8,INVALC,0xADE7,0xD0EB,0xADE5,INVALC,INVALC,INVALC, + 0xD0E7,0xADE8,0xADE6,0xADE9,0xD0E9,0xD0EA,INVALC,0xD0E6, + 0xD0EC, + /* Range 0x5269 - 0x526F, array index: 0x0B43 */ + 0xB3D1,0xB0C5,0xD469,0xD46B,0xD46A,0xD46C,0xB0C6, + /* Range 0x5274 - 0x528D, array index: 0x0B4A */ + 0xB3CF,0xB3D0,INVALC,0xB6D0,0xDCC7,INVALC,0xDCC6,0xDCC8, + 0xDCC9,0xB6D1,INVALC,0xB6CF,0xE141,0xE142,0xB9BB,0xB9BA, + 0xE35A,INVALC,INVALC,0xBC40,0xBC41,0xBC42,0xBC44,0xE4F2, + 0xE4F3,0xBC43, + /* Range 0x5296 - 0x529B, array index: 0x0B64 */ + 0xF1ED,0xF5C3,0xF5C2,0xF7D1,INVALC,0xA44F, + /* Range 0x52A9 - 0x52AE, array index: 0x0B6A */ + 0xA755,0xA756,0xA754,0xA757,0xCA6F,0xCA70, + /* Range 0x52BE - 0x52C3, array index: 0x0B70 */ + 0xA8F0,INVALC,0xCDF2,0xAB6C,0xCDF3,0xAB6B, + /* Range 0x52D2 - 0x52E6, array index: 0x0B76 */ + 0xB0C7,0xD46E,INVALC,0xB0CA,0xD46D,0xB1E5,0xB0C9,0xB0C8, + INVALC,0xB3D4,INVALC,0xB3D3,0xB3D2,0xB6D2,INVALC,INVALC, + 0xB6D5,0xB6D6,0xB6D4,INVALC,0xB6D3, + /* Range 0x52EF - 0x52FF, array index: 0x0B8B */ + 0xE4F5,0xBC45,0xE4F4,INVALC,0xBEB1,0xECBF,0xC079,INVALC, + 0xF1EE,0xC455,INVALC,0xA463,0xA4C3,0xC956,INVALC,0xA4C4, + 0xA4C5, + /* Range 0x5305 - 0x5323, array index: 0x0B9C */ + 0xA55D,0xA55E,INVALC,0xA649,0xCA71,0xCBD6,0xCBD7,INVALC, + 0xAB6D,0xD0EE,0xB0CC,0xB0CB,0xD863,0xD862,INVALC,INVALC, + 0xA450,0xA4C6,0xA55F,INVALC,0xB0CD,0xC943,INVALC,0xC96C, + 0xA560,INVALC,0xC9C2,0xA64B,0xA64A,0xC9C1,0xA758, + /* Range 0x532D - 0x5331, array index: 0x0BBB */ + 0xD46F,INVALC,0xB6D7,0xE145,0xB9BC, + /* Range 0x533C - 0x5354, array index: 0x0BC0 */ + 0xCBD8,0xCDF4,0xB0D0,0xB0CE,0xB0CF,0xA451,INVALC,0xA464, + 0xA2CD,0xA4CA,INVALC,0xA4C9,0xA4C8,0xA563,0xA562,INVALC, + 0xC96D,0xC9C3,INVALC,INVALC,INVALC,0xA8F5,0xA8F2,0xA8F4, + 0xA8F3, + /* Range 0x536C - 0x537C, array index: 0x0BD9 */ + 0xC957,INVALC,0xA567,0xA566,0xA64C,0xA64D,0xCA73,0xA759, + INVALC,0xA75A,INVALC,0xA8F7,0xA8F8,0xA8F9,INVALC,0xAB6F, + 0xCDF5, + /* Range 0x5394 - 0x539F, array index: 0x0BEA */ + 0xCBDA,INVALC,0xCDF7,0xCDF6,0xCDF9,0xCDF8,0xAB70,INVALC, + 0xD470,0xADED,0xD0EF,0xADEC, + /* Range 0x53C8 - 0x53CD, array index: 0x0BF6 */ + 0xA453,0xA465,0xA4CE,0xA4CD,INVALC,0xA4CF, + /* Range 0x53DF - 0x53F5, array index: 0x0BFC */ + 0xADEE,INVALC,0xE8FB,0xC24F,0xA466,0xA56A,0xA579,0xA574, + INVALC,0xA56F,0xA56E,0xA575,0xA573,0xA56C,0xA57A,0xA56D, + 0xA569,0xA578,0xA577,0xA576,0xA56B,INVALC,0xA572, + /* Range 0x5403 - 0x5412, array index: 0x0C13 */ + 0xA659,0xA655,INVALC,0xA65B,0xC9C5,0xA658,0xA64E,0xA651, + 0xA654,0xA650,0xA657,0xA65A,0xA64F,0xA652,0xA656,0xA65C, + /* Range 0x5418 - 0x544A, array index: 0x0C23 */ + 0xCA7E,0xCA7B,INVALC,0xA767,0xCA7C,0xA75B,0xA75D,0xA775, + 0xA770,INVALC,INVALC,INVALC,0xCAA5,0xCA7D,0xA75F,0xA761, + 0xCAA4,0xA768,0xCA78,0xA774,0xA776,0xA75C,0xA76D,INVALC, + 0xCA76,0xA773,INVALC,0xA764,INVALC,0xA76E,0xA76F,0xCA77, + 0xA76C,0xA76A,INVALC,0xA76B,0xA771,0xCAA1,0xA75E,INVALC, + 0xA772,0xCAA3,0xA766,0xA763,INVALC,0xCA7A,0xA762,0xCAA6, + 0xA765,INVALC,0xA769, + /* Range 0x5460 - 0x549A, array index: 0x0C56 */ + 0xCBEB,0xCBEA,0xA94F,0xCBED,0xCBEF,0xCBE4,0xCBE7,0xCBEE, + 0xA950,INVALC,INVALC,0xCBE1,0xCBE5,INVALC,INVALC,0xCBE9, + 0xCE49,0xA94B,0xCE4D,0xA8FD,0xCBE6,0xA8FE,0xA94C,0xA945, + 0xA941,INVALC,0xCBE2,0xA944,0xA949,0xA952,0xCBE3,0xCBDC, + 0xA943,0xCBDD,0xCBDF,INVALC,0xA946,INVALC,0xA948,0xCBDB, + 0xCBE0,INVALC,INVALC,0xA951,0xA94D,0xCBE8,0xA953,INVALC, + 0xA94A,0xCBDE,0xA947,INVALC,INVALC,0xA942,0xA940,INVALC, + 0xCBEC,INVALC,0xA94E, + /* Range 0x54A0 - 0x54C9, array index: 0x0C91 */ + 0xCE48,0xCDFB,0xCE4B,INVALC,INVALC,0xCDFD,0xAB78,0xABA8, + 0xAB74,0xABA7,0xAB7D,0xABA4,0xAB72,0xCDFC,0xCE43,0xABA3, + 0xCE4F,0xABA5,INVALC,0xAB79,INVALC,INVALC,0xCE45,0xCE42, + 0xAB77,INVALC,0xCDFA,0xABA6,0xCE4A,0xAB7C,0xCE4C,0xABA9, + 0xAB73,0xAB7E,0xAB7B,0xCE40,0xABA1,0xCE46,0xCE47,0xAB7A, + 0xABA2,0xAB76, + /* Range 0x54DE - 0x54F3, array index: 0x0CBB */ + 0xCE4E,INVALC,0xD144,0xADFB,0xD0F1,INVALC,0xD0F6,0xADF4, + 0xAE40,0xD0F4,0xADEF,0xADF9,0xADFE,0xD0FB,INVALC,0xADFA, + 0xADFD,INVALC,INVALC,0xD0FE,0xADF5,0xD0F5, + /* Range 0x54F7 - 0x5514, array index: 0x0CD1 */ + 0xD142,0xD143,INVALC,0xADF7,0xD141,0xADF3,0xAE43,INVALC, + 0xD0F8,INVALC,0xADF1,INVALC,0xD146,0xD0F9,0xD0FD,0xADF6, + 0xAE42,0xD0FA,0xADFC,0xD140,0xD147,0xD4A1,INVALC,0xD145, + 0xAE44,0xADF0,0xD0FC,0xD0F3,INVALC,0xADF8, + /* Range 0x552A - 0x5557, array index: 0x0CEF */ + 0xD477,INVALC,0xB0E4,0xD4A7,0xB0E2,0xB0DF,0xD47C,0xB0DB, + 0xD4A2,0xB0E6,0xD476,0xD47B,0xD47A,0xADF2,0xB0E1,0xD4A5, + INVALC,0xD4A8,0xD473,INVALC,0xB3E8,INVALC,0xD4A9,0xB0E7, + INVALC,0xB0D9,0xB0D6,0xD47E,0xB0D3,INVALC,0xD4A6,INVALC, + 0xB0DA,0xD4AA,INVALC,0xD474,0xD4A4,0xB0DD,0xD475,0xD478, + 0xD47D,INVALC,INVALC,0xB0DE,0xB0DC,0xB0E8, + /* Range 0x555E - 0x5566, array index: 0x0D1D */ + 0xB0D7,0xB1D2,INVALC,0xB0D8,0xD479,0xB0E5,0xB0E0,0xD4A3, + 0xB0D5, + /* Range 0x5575 - 0x55B5, array index: 0x0D26 */ + 0xD471,0xD472,0xD86A,INVALC,INVALC,INVALC,0xB3D7,0xB3DA, + 0xD875,0xB3EE,0xD878,0xB3D8,0xD871,0xB3DE,0xB3E4,0xB5BD, + INVALC,INVALC,0xB3E2,0xD86E,0xB3EF,0xB3DB,0xB3E3,0xD876, + 0xDCD7,0xD87B,0xD86F,INVALC,0xD866,0xD873,0xD86D,0xB3E1, + 0xD879,INVALC,INVALC,0xB3DD,0xB3F1,0xB3EA,INVALC,0xB3DF, + 0xB3DC,INVALC,0xB3E7,INVALC,0xD87A,0xD86C,0xD872,0xD874, + 0xD868,0xD877,0xB3D9,0xD867,INVALC,0xB3E0,0xB3F0,0xB3EC, + 0xD869,0xB3E6,INVALC,INVALC,0xB3ED,0xB3E9,0xB3E5,INVALC, + 0xD870, + /* Range 0x55BF - 0x55E9, array index: 0x0D67 */ + 0xDCD5,0xDCD1,INVALC,0xDCE0,0xDCCA,0xDCD3,0xB6E5,0xB6E6, + 0xB6DE,0xDCDC,0xB6E8,0xDCCF,0xDCCE,0xDCCC,0xDCDE,0xB6DC, + 0xDCD8,0xDCCD,0xB6DF,0xDCD6,0xB6DA,0xDCD2,0xDCD9,0xDCDB, + INVALC,INVALC,0xDCDF,0xB6E3,0xDCCB,0xB6DD,0xDCD0,INVALC, + 0xB6D8,INVALC,0xB6E4,0xDCDA,0xB6E0,0xB6E1,0xB6E7,0xB6DB, + 0xA25F,0xB6D9,0xDCD4, + /* Range 0x55F6 - 0x561F, array index: 0x0D92 */ + 0xB9CD,0xB9C8,INVALC,0xE155,0xE151,INVALC,0xE14B,0xB9C2, + 0xB9BE,0xE154,0xB9BF,0xE14E,0xE150,INVALC,0xE153,INVALC, + 0xB9C4,INVALC,0xB9CB,0xB9C5,INVALC,INVALC,0xE149,0xB9C6, + 0xB9C7,0xE14C,0xB9CC,INVALC,0xE14A,0xE14F,0xB9C3,0xE148, + 0xB9C9,0xB9C1,INVALC,INVALC,INVALC,0xB9C0,0xE14D,0xE152, + INVALC,0xB9CA, + /* Range 0x562C - 0x564E, array index: 0x0DBC */ + 0xE544,INVALC,0xBC47,0xBC53,0xBC54,INVALC,0xBC4A,0xE542, + 0xBC4C,0xE4F9,0xBC52,INVALC,0xE546,0xBC49,0xE548,0xBC48, + INVALC,0xE543,0xE545,0xBC4B,0xE541,0xE4FA,0xE4F7,INVALC, + INVALC,0xD86B,0xE4FD,INVALC,0xE4F6,0xE4FC,0xE4FB,INVALC, + 0xE4F8,INVALC,0xBC4F, + /* Range 0x5657 - 0x565A, array index: 0x0DDF */ + 0xBC50,0xE4FE,0xBEB2,0xE540, + /* Range 0x5660 - 0x5679, array index: 0x0DE3 */ + 0xE8FD,INVALC,0xBEBE,0xE942,0xBEB6,0xBEBA,0xE941,INVALC, + 0xBEB9,0xBEB5,0xBEB8,0xBEB3,0xBEBD,0xE943,0xE8FE,0xBEBC, + 0xE8FC,0xBEBB,0xE944,0xE940,0xBC51,INVALC,0xBEBF,0xE946, + 0xBEB7,0xBEB4, + /* Range 0x567E - 0x5687, array index: 0x0DFD */ + 0xECC6,0xECC8,0xC07B,0xECC9,0xECC7,0xECC5,0xECC4,0xC07D, + 0xECC3,0xC07E, + /* Range 0x568C - 0x5690, array index: 0x0E07 */ + 0xECC1,0xECC2,0xC07A,0xC0A1,0xC07C, + /* Range 0x5695 - 0x569D, array index: 0x0E0C */ + 0xC250,INVALC,0xEFBC,0xEFBA,0xEFBF,0xEFBD,INVALC,0xEFBB, + 0xEFBE, + /* Range 0x56A5 - 0x56B7, array index: 0x0E15 */ + 0xC360,0xF1F2,0xF1F3,0xC456,INVALC,0xF1F4,0xF1F0,0xF1F5, + 0xF1F1,0xC251,INVALC,INVALC,INVALC,0xF3FE,0xF441,0xC459, + 0xF440,0xC458,0xC457, + /* Range 0x56BC - 0x56CD, array index: 0x0E28 */ + 0xC45A,0xF5C5,0xF5C6,INVALC,0xC4DA,0xC4D9,0xC4DB,0xF5C4, + INVALC,0xF6D8,0xF6D7,INVALC,0xC56D,0xC56F,0xC56E,0xF6D9, + 0xC5C8,0xF8A6, + /* Range 0x56DA - 0x56EB, array index: 0x0E3A */ + 0xA57D,0xA57C,INVALC,0xA65F,0xA65E,0xC9C7,0xA65D,0xC9C6, + INVALC,INVALC,0xA779,0xCAA9,INVALC,0xCAA8,INVALC,INVALC, + 0xA777,0xA77A, + /* Range 0x56FF - 0x570D, array index: 0x0E4C */ + 0xABAA,INVALC,0xD148,0xD149,0xAE45,0xAE46,INVALC,INVALC, + 0xD4AC,0xB0E9,0xB0EB,0xD4AB,0xB0EA,0xD87C,0xB3F2, + /* Range 0x5712 - 0x5723, array index: 0x0E5B */ + 0xB6E9,0xB6EA,0xDCE1,INVALC,0xB9CF,INVALC,0xB9CE,INVALC, + 0xE549,0xE948,0xE947,INVALC,0xF96B,0xA467,0xC959,INVALC, + 0xC96E,0xC96F, + /* Range 0x5728 - 0x5734, array index: 0x0E6D */ + 0xA662,0xA666,0xC9C9,INVALC,0xA664,0xA663,0xC9C8,0xA665, + 0xA661,INVALC,INVALC,0xA660,0xC9CA, + /* Range 0x5747 - 0x5752, array index: 0x0E7A */ + 0xA7A1,INVALC,0xCAAD,0xA77B,0xCAAE,0xCAAC,0xA77E,0xA7A2, + 0xA7A5,0xA7A4,0xA77C,0xCAAF, + /* Range 0x5766 - 0x577D, array index: 0x0E86 */ + 0xA95A,INVALC,0xCC40,0xA958,0xA957,0xCBF5,INVALC,0xCBF4, + INVALC,0xCBF2,0xCBF7,0xCBF6,0xCBF3,0xCBFC,0xCBFD,0xCBFA, + 0xCBF8,0xA956,INVALC,INVALC,INVALC,0xCBFB,0xA95C,0xCC41, + /* Range 0x5793 - 0x57A5, array index: 0x0E9E */ + 0xABB2,0xCE58,0xCE5E,INVALC,0xCE55,0xCE59,0xCE5B,0xCE5D, + 0xCE57,INVALC,0xCE56,0xCE51,0xCE52,0xABAD,INVALC,0xABAF, + 0xABAE,0xCE53,0xCE5C, + /* Range 0x57B5 - 0x57C7, array index: 0x0EB1 */ + 0xCE50,0xD153,INVALC,0xD152,0xD157,0xD14E,INVALC,0xD151, + 0xD150,INVALC,0xD154,INVALC,0xD158,0xAE47,0xAE4A,INVALC, + INVALC,0xD14F,0xD155, + /* Range 0x57CB - 0x57D5, array index: 0x0EC4 */ + 0xAE49,0xD14A,INVALC,0xABB0,0xD4BA,0xD156,INVALC,0xD14D, + INVALC,0xAE48,0xD14C, + /* Range 0x57DF - 0x5810, array index: 0x0ECF */ + 0xB0EC,0xB0F0,0xD4C1,0xD4AF,0xD4BD,0xB0F1,0xD4BF,INVALC, + 0xD4C5,INVALC,0xD4C9,INVALC,INVALC,0xD4C0,0xD4B4,0xD4BC, + INVALC,0xD4CA,0xD4C8,0xD4BE,0xD4B9,0xD4B2,0xD8A6,0xD4B0, + 0xB0F5,0xD4B7,0xB0F6,0xB0F2,0xD4AD,0xD4C3,0xD4B5,INVALC, + INVALC,0xD4B3,0xD4C6,0xB0F3,INVALC,0xD4CC,0xB0ED,0xB0EF, + 0xD4BB,0xD4B6,0xAE4B,0xB0EE,0xD4B8,0xD4C7,0xD4CB,0xD4C2, + INVALC,0xD4C4, + /* Range 0x5819 - 0x583F, array index: 0x0F01 */ + 0xD8A1,INVALC,0xD8AA,0xD8A9,0xB3FA,0xD8A2,INVALC,0xB3FB, + 0xB3F9,INVALC,0xD8A4,0xB3F6,0xD8A8,INVALC,0xD8A3,0xD8A5, + 0xD87D,0xB3F4,INVALC,0xD8B2,0xD8B1,0xD8AE,0xB3F3,0xB3F7, + 0xB3F8,0xD14B,0xD8AB,0xB3F5,0xB0F4,0xD8AD,0xD87E,0xD8B0, + 0xD8AF,INVALC,0xD8B3,INVALC,0xDCEF,INVALC,0xD8AC, + /* Range 0x5848 - 0x5865, array index: 0x0F28 */ + 0xD8A7,0xDCE7,0xB6F4,0xB6F7,0xB6F2,0xDCE6,0xDCEA,0xDCE5, + INVALC,0xB6EC,0xB6F6,0xDCE2,0xB6F0,0xDCE9,INVALC,0xB6EE, + 0xB6ED,0xDCEC,0xB6EF,0xDCEE,INVALC,0xDCEB,0xB6EB,INVALC, + INVALC,INVALC,0xB6F5,0xDCF0,0xDCE4,0xDCED, + /* Range 0x5874 - 0x5894, array index: 0x0F46 */ + 0xE15D,0xB9D0,0xE163,INVALC,INVALC,0xB9D5,0xE15F,0xE166, + 0xE157,0xB9D7,0xB9D1,0xE15C,0xBC55,0xE15B,0xE164,0xB9D2, + INVALC,0xB9D6,0xE15A,0xE160,0xE165,0xE156,0xB9D4,0xE15E, + INVALC,INVALC,0xE162,0xE168,0xE158,0xE161,INVALC,0xB9D3, + 0xE167, + /* Range 0x589C - 0x58B3, array index: 0x0F67 */ + 0xBC59,0xE54B,0xBC57,0xBC56,0xE54D,0xE552,INVALC,0xE54E, + INVALC,0xE551,0xBC5C,INVALC,0xBEA5,0xBC5B,INVALC,0xE54A, + 0xE550,INVALC,0xBC5A,0xE54F,INVALC,0xE54C,INVALC,0xBC58, + /* Range 0x58BA - 0x58C9, array index: 0x0F7F */ + 0xE94D,INVALC,0xE94F,0xE94A,0xBEC1,0xE94C,INVALC,0xBEC0, + 0xE94E,INVALC,INVALC,0xBEC3,0xE950,0xBEC2,0xE949,0xE94B, + /* Range 0x58CE - 0x58EC, array index: 0x0F8F */ + 0xC0A5,0xECCC,INVALC,0xC0A4,0xECCD,0xC0A3,0xECCB,0xC0A2, + 0xECCA,INVALC,0xC253,0xC252,0xF1F6,0xF1F8,INVALC,0xF1F7, + 0xC361,0xC362,INVALC,INVALC,0xC363,0xF442,0xC45B,INVALC, + INVALC,0xF7D3,0xF7D2,0xC5F2,INVALC,0xA468,0xA4D0, + /* Range 0x58F9 - 0x58FF, array index: 0x0FAE */ + 0xB3FC,0xB3FD,INVALC,0xDCF2,0xB9D8,0xE169,0xE553, + /* Range 0x590C - 0x590F, array index: 0x0FB5 */ + 0xCC42,0xCE60,0xD159,0xAE4C, + /* Range 0x5912 - 0x591C, array index: 0x0FB9 */ + 0xF1F9,INVALC,0xC4DC,0xA469,0xA57E,0xC970,INVALC,0xA667, + 0xA668,INVALC,0xA95D, + /* Range 0x5927 - 0x5931, array index: 0x0FC4 */ + 0xA46A,INVALC,0xA4D1,0xA4D3,0xA4D2,0xC95B,0xA4D4,0xA5A1, + 0xC971,INVALC,0xA5A2, + /* Range 0x5944 - 0x5962, array index: 0x0FCF */ + 0xA961,0xCC43,INVALC,0xA95F,0xA960,0xA95E,0xD15A,INVALC, + INVALC,INVALC,0xABB6,0xABB5,0xABB7,0xABB4,INVALC,0xCE61, + 0xA962,0xABB3,INVALC,0xAE4D,0xAE4E,INVALC,0xAE4F,INVALC, + 0xD4CD,INVALC,INVALC,INVALC,0xB3FE,0xD8B4,0xB0F8, + /* Range 0x5967 - 0x5985, array index: 0x0FEE */ + 0xB6F8,INVALC,0xB9DD,0xB9DC,0xE16A,INVALC,0xBC5D,0xBEC4, + INVALC,0xEFC0,0xF6DA,0xF7D4,0xA46B,0xA5A3,INVALC,0xA5A4, + 0xC9D1,0xA66C,0xA66F,INVALC,0xC9CF,0xC9CD,0xA66E,0xC9D0, + 0xC9D2,0xC9CC,0xA671,0xA670,0xA66D,0xA66B,0xC9CE, + /* Range 0x598D - 0x5999, array index: 0x100D */ + 0xA7B0,0xCAB6,0xCAB9,0xCAB8,INVALC,0xA7AA,0xA7B2,INVALC, + INVALC,0xA7AF,0xCAB5,0xCAB3,0xA7AE, + /* Range 0x599D - 0x59A8, array index: 0x101A */ + 0xA7A9,0xA7AC,INVALC,0xCAB4,0xCABB,0xCAB7,0xA7AD,0xA7B1, + 0xA7B4,0xCAB2,0xCABA,0xA7AB, + /* Range 0x59AE - 0x5A03, array index: 0x1026 */ + 0xA967,0xA96F,INVALC,0xCC4F,0xCC48,0xA970,0xCC53,0xCC44, + 0xCC4B,INVALC,INVALC,0xA966,0xCC45,0xA964,0xCC4C,0xCC50, + 0xA963,INVALC,0xCC51,0xCC4A,INVALC,0xCC4D,INVALC,0xA972, + 0xA969,0xCC54,0xCC52,INVALC,0xA96E,0xA96C,0xCC49,0xA96B, + 0xCC47,0xCC46,0xA96A,0xA968,0xA971,0xA96D,0xA965,INVALC, + 0xCC4E,INVALC,0xABB9,INVALC,0xABC0,0xCE6F,0xABB8,0xCE67, + 0xCE63,INVALC,0xCE73,0xCE62,INVALC,0xABBB,0xCE6C,0xABBE, + 0xABC1,INVALC,0xABBC,0xCE70,0xABBF,INVALC,0xAE56,0xCE76, + 0xCE64,INVALC,INVALC,0xCE66,0xCE6D,0xCE71,0xCE75,0xCE72, + 0xCE6B,0xCE6E,INVALC,INVALC,0xCE68,0xABC3,0xCE6A,0xCE69, + 0xCE74,0xABBA,0xCE65,0xABC2,INVALC,0xABBD, + /* Range 0x5A13 - 0x5A20, array index: 0x107C */ + 0xAE55,INVALC,0xD15F,0xD15C,0xD161,0xAE51,0xD15B,INVALC, + 0xAE54,0xAE52,INVALC,0xD163,0xAE53,0xAE57, + /* Range 0x5A33 - 0x5A39, array index: 0x108A */ + 0xD164,INVALC,0xD4D4,0xB0F9,0xD8C2,0xD4D3,0xD4E6, + /* Range 0x5A3E - 0x5A6D, array index: 0x1091 */ + 0xD4E4,INVALC,0xB0FE,0xB0FA,0xD4ED,0xD4DD,0xD4E0,INVALC, + 0xB143,0xD4EA,0xD4E2,0xB0FB,0xB144,INVALC,0xD4E7,0xD4E5, + INVALC,INVALC,0xD4D6,0xD4EB,0xD4DF,0xD4DA,INVALC,0xD4D0, + 0xD4EC,0xD4DC,0xD4CF,INVALC,0xB142,0xD4E1,0xD4EE,0xD4DE, + 0xD4D2,0xD4D7,0xD4CE,INVALC,0xB141,INVALC,0xD4DB,0xD4D8, + 0xB0FC,0xD4D1,INVALC,0xD4E9,0xB0FD,INVALC,0xD4D9,0xD4D5, + /* Range 0x5A77 - 0x5A7F, array index: 0x10C1 */ + 0xB440,0xD8BB,INVALC,0xD8B8,0xD8C9,0xD8BD,0xD8CA,INVALC, + 0xB442, + /* Range 0x5A8A - 0x5A9F, array index: 0x10CA */ + 0xD8C4,0xD8C7,0xD8CB,INVALC,0xD4E3,0xD8CD,0xDD47,INVALC, + 0xB443,0xD8CE,0xD8B6,0xD8C0,INVALC,0xD8C5,INVALC,INVALC, + 0xB441,0xB444,0xD8CC,0xD8CF,0xD8BA,0xD8B7, + /* Range 0x5AA5 - 0x5AA9, array index: 0x10E0 */ + 0xD8BE,0xD8BC,0xB445,INVALC,0xD8C8, + /* Range 0x5AAC - 0x5ACD, array index: 0x10E5 */ + 0xD8BF,INVALC,0xD8C1,0xD8B5,0xDCFA,0xDCF8,0xB742,0xB740, + 0xDD43,0xDCF9,0xDD44,0xDD40,0xDCF7,0xDD46,0xDCF6,0xDCFD, + 0xB6FE,0xB6FD,0xB6FC,0xDCFB,0xDD41,0xB6F9,0xB741,INVALC, + 0xDCF4,INVALC,0xDCFE,0xDCF3,0xDCFC,0xB6FA,0xDD42,0xDCF5, + 0xB6FB,0xDD45, + /* Range 0x5AD5 - 0x5AEE, array index: 0x1107 */ + 0xE16E,0xB9E2,0xB9E1,0xB9E3,0xE17A,0xE170,0xE176,0xE16B, + 0xE179,0xE178,0xE17C,0xE175,0xB9DE,0xE174,0xB9E4,INVALC, + 0xE16D,0xB9DF,INVALC,0xE17B,0xB9E0,0xE16F,0xE172,0xE177, + 0xE171,0xE16C, + /* Range 0x5AF3 - 0x5B34, array index: 0x1121 */ + 0xE173,0xE555,0xBC61,0xE558,0xE557,0xE55A,0xE55C,INVALC, + 0xBC5F,INVALC,0xE556,INVALC,0xE554,INVALC,0xE55D,0xE55B, + 0xE559,INVALC,0xE55F,INVALC,0xE55E,0xBC63,0xBC5E,INVALC, + 0xBC60,0xBC62,INVALC,INVALC,0xE560,0xE957,INVALC,INVALC, + 0xE956,0xE955,INVALC,0xE958,0xE951,INVALC,0xE952,0xE95A, + 0xE953,INVALC,0xBEC5,0xE95C,INVALC,0xE95B,0xE954,INVALC, + 0xECD1,0xC0A8,0xECCF,0xECD4,0xECD3,0xE959,INVALC,0xC0A7, + INVALC,0xECD2,0xECCE,0xECD6,0xECD5,0xC0A6,INVALC,0xECD0, + INVALC,0xBEC6, + /* Range 0x5B3C - 0x5B40, array index: 0x1163 */ + 0xEFC1,0xF1FA,0xF1FB,0xF1FC,0xC45C, + /* Range 0x5B47 - 0x5B65, array index: 0x1168 */ + 0xF5C8,0xF5C7,INVALC,INVALC,0xF6DB,0xF6DC,0xF7D5,0xF8A7, + INVALC,0xA46C,0xA46D,INVALC,0xA46E,0xA4D5,0xA5A5,0xC9D3, + 0xA672,0xA673,INVALC,0xA7B7,0xA7B8,0xA7B6,0xA7B5,INVALC, + 0xA973,INVALC,INVALC,0xCC55,0xA975,0xA974,0xCC56, + /* Range 0x5B6E - 0x5B9C, array index: 0x1187 */ + 0xD4F0,INVALC,0xB145,0xB447,0xD4EF,0xB446,INVALC,0xB9E5, + INVALC,0xE17D,0xBEC7,INVALC,0xC0A9,0xECD7,INVALC,0xC45E, + INVALC,0xC570,INVALC,0xC972,INVALC,0xA5A6,0xC973,0xA676, + INVALC,0xA674,0xA675,0xA677,INVALC,0xA7BA,0xA7B9,INVALC, + 0xCABC,0xA7BB,INVALC,INVALC,0xCABD,0xCC57,INVALC,0xCC58, + INVALC,0xA976,0xA978,0xA97A,0xA977,0xA97B,0xA979, + /* Range 0x5BA2 - 0x5BB9, array index: 0x11B6 */ + 0xABC8,0xABC5,0xABC7,0xABC9,0xABC6,0xD166,0xCE77,INVALC, + INVALC,INVALC,0xD168,0xD167,0xAE63,INVALC,0xAE5F,INVALC, + INVALC,0xAE60,0xAE62,0xAE64,0xAE61,INVALC,0xAE66,0xAE65, + /* Range 0x5BBF - 0x5BD9, array index: 0x11CE */ + 0xB14A,0xD4F2,0xD4F1,0xB149,INVALC,0xB148,0xB147,0xB14B, + 0xB146,INVALC,INVALC,0xD8D5,0xD8D2,0xB449,0xD8D1,0xD8D6, + INVALC,0xB44B,0xD8D4,0xB448,0xB44A,0xD8D3,INVALC,0xDD48, + INVALC,0xDD49,0xDD4A, + /* Range 0x5BDE - 0x5BFA, array index: 0x11E9 */ + 0xB9E6,0xB9EE,0xE17E,0xB9E8,0xB9EC,0xE1A1,0xB9ED,0xB9E9, + 0xB9EA,0xB9E7,0xB9EB,0xBC66,0xD8D0,0xBC67,0xBC65,INVALC, + 0xBC64,0xE95D,0xBEC8,0xECD8,0xECD9,INVALC,INVALC,0xC364, + 0xC45F,INVALC,0xA46F,INVALC,0xA678, + /* Range 0x5C03 - 0x5C16, array index: 0x1206 */ + 0xD169,0xAE67,INVALC,INVALC,0xB14E,0xB14D,0xB14C,0xB44C, + 0xB44D,0xD8D7,0xB9EF,0xBEC9,0xA470,0xC95C,0xA4D6,0xC974, + INVALC,INVALC,0xC9D4,0xA679, + /* Range 0x5C37 - 0x5C5D, array index: 0x121A */ + 0xC0AA,0xA472,0xA4A8,0xA4D8,0xC975,0xA5A7,INVALC,0xA7C0, + 0xA7BF,0xA7BD,0xA7BE,INVALC,INVALC,0xCC59,0xA97E,0xA9A1, + 0xCC5A,0xA97D,INVALC,INVALC,0xABCE,0xCE78,0xABCD,0xABCB, + 0xABCC,0xAE6A,0xAE68,INVALC,INVALC,0xD16B,0xAE69,0xD16A, + INVALC,0xAE5E,0xD4F3,INVALC,INVALC,0xB150,0xB151, + /* Range 0x5C60 - 0x5C74, array index: 0x1241 */ + 0xB14F,INVALC,0xB9F0,0xE1A2,0xBC68,0xBC69,INVALC,0xE561, + 0xC0AB,0xEFC2,0xEFC3,INVALC,0xC4DD,0xF8A8,0xC94B,0xA4D9, + INVALC,0xA473,INVALC,0xC977,0xC976, + /* Range 0x5C79 - 0x5C7E, array index: 0x1256 */ + 0xA67A,0xC9D7,0xC9D8,0xC9D6,INVALC,0xC9D9, + /* Range 0x5C86 - 0x5C95, array index: 0x125C */ + 0xCAC7,INVALC,0xCAC2,0xCAC4,0xCAC6,0xCAC3,0xA7C4,0xCAC0, + INVALC,0xCAC1,0xA7C1,0xA7C2,0xCAC5,0xCAC8,0xA7C3,0xCAC9, + /* Range 0x5C9D - 0x5CB8, array index: 0x126C */ + 0xCC68,INVALC,0xCC62,0xCC5D,0xA9A3,0xCC65,0xCC63,0xCC5C, + 0xCC69,0xCC6C,0xCC67,0xCC60,0xA9A5,0xCC66,0xA9A6,0xCC61, + 0xCC64,0xCC5B,0xCC5F,0xCC6B,0xA9A7,INVALC,0xA9A8,INVALC, + 0xCC5E,0xCC6A,0xA9A2,0xA9A4, + /* Range 0x5CC6 - 0x5CDF, array index: 0x1288 */ + 0xCEAB,0xCEA4,0xCEAA,0xCEA3,0xCEA5,0xCE7D,0xCE7B,INVALC, + 0xCEAC,0xCEA9,0xCE79,INVALC,0xABD0,0xCEA7,0xCEA8,INVALC, + 0xCEA6,0xCE7C,0xCE7A,0xABCF,0xCEA2,0xCE7E,INVALC,INVALC, + 0xCEA1,0xCEAD, + /* Range 0x5CEA - 0x5CF1, array index: 0x12A2 */ + 0xAE6E,INVALC,0xD16C,0xAE6B,0xD16E,INVALC,0xAE70,0xD16F, + /* Range 0x5CF4 - 0x5D01, array index: 0x12AA */ + 0xAE73,INVALC,0xAE71,0xD170,0xCEAE,0xD172,INVALC,0xAE6D, + INVALC,0xAE6C,INVALC,0xD16D,0xD171,0xAE72, + /* Range 0x5D0B - 0x5D29, array index: 0x12B8 */ + 0xD4F5,0xD4F9,0xD4FB,0xB154,0xD4FE,INVALC,0xB158,0xD541, + INVALC,0xB15A,INVALC,0xB156,0xB15E,INVALC,0xB15B,0xD4F7, + 0xB155,INVALC,0xD4F6,0xD4F4,0xD543,0xD4F8,INVALC,0xB157, + 0xD542,0xB15C,0xD4FD,0xD4FC,0xB15D,0xD4FA,0xB159, + /* Range 0x5D2E - 0x5D52, array index: 0x12D7 */ + 0xD544,INVALC,0xD540,0xD8E7,0xD8EE,0xD8E3,0xB451,0xD8DF, + 0xD8EF,0xD8D9,0xD8EC,0xD8EA,0xD8E4,INVALC,0xD8ED,0xD8E6, + INVALC,0xD8DE,0xD8F0,0xD8DC,0xD8E9,0xD8DA,INVALC,0xD8F1, + INVALC,0xB452,INVALC,0xD8EB,0xDD4F,0xD8DD,0xB44F,INVALC, + 0xD8E1,INVALC,0xB450,0xD8E0,0xD8E5, + /* Range 0x5D65 - 0x5D6C, array index: 0x12FC */ + 0xDD50,INVALC,0xDD55,0xDD54,0xB743,INVALC,0xD8DB,0xDD52, + /* Range 0x5D79 - 0x5D8A, array index: 0x1304 */ + 0xE1B0,0xE1A7,INVALC,0xE1AE,0xE1A5,0xE1AD,0xE1B1,0xE1A4, + 0xE1A8,0xE1A3,INVALC,0xB9F1,INVALC,0xE1A6,0xB9F2,0xE1AC, + 0xE1AB,0xE1AA, + /* Range 0x5D92 - 0x5DA2, array index: 0x1316 */ + 0xE565,0xE567,0xBC6B,0xE568,INVALC,0xE563,INVALC,0xE562, + 0xE56C,INVALC,0xE56A,0xBC6A,0xE56D,0xE564,0xE569,0xE56B, + 0xE566, + /* Range 0x5DA7 - 0x5DBD, array index: 0x1327 */ + 0xE961,0xE966,0xE960,0xE965,INVALC,0xE95E,0xE968,0xE964, + 0xE969,0xE963,0xE95F,0xE967,INVALC,0xE96A,0xE962,INVALC, + 0xECDA,0xC0AF,INVALC,0xC0AD,INVALC,0xC0AC,0xC0AE, + /* Range 0x5DD1 - 0x5DD8, array index: 0x133E */ + 0xF6DE,0xC572,INVALC,0xC571,0xF6DD,0xC5C9,INVALC,0xF7D6, + /* Range 0x5DDD - 0x5DE8, array index: 0x1346 */ + 0xA474,0xA67B,0xC9DA,0xCACA,0xA8B5,0xB15F,INVALC,INVALC, + 0xA475,0xA5AA,0xA5A9,0xA5A8, + /* Range 0x5DEE - 0x5DF4, array index: 0x1352 */ + 0xAE74,INVALC,0xDD57,0xA476,0xA477,0xA478,0xA4DA, + /* Range 0x5DFD - 0x5E06, array index: 0x1359 */ + 0xB453,0xA479,0xC95D,INVALC,INVALC,0xA5AB,0xA5AC,0xC978, + INVALC,0xA67C, + /* Range 0x5E14 - 0x5E2D, array index: 0x1363 */ + 0xCC6E,0xA9AC,0xA9AB,0xCC6D,0xA9A9,0xCC6F,0xA9AA,0xA9AD, + INVALC,0xABD2,INVALC,0xABD4,0xCEB3,0xCEB0,0xCEB1,0xCEB2, + 0xCEB4,0xABD3,INVALC,INVALC,0xD174,0xD173,INVALC,0xAE76, + INVALC,0xAE75, + /* Range 0x5E33 - 0x5E38, array index: 0x137D */ + 0xB162,0xD546,INVALC,0xB161,0xB163,0xB160, + /* Range 0x5E3D - 0x5E45, array index: 0x1383 */ + 0xB455,0xD545,INVALC,0xB456,0xD8F3,INVALC,0xB457,0xD8F2, + 0xB454, + /* Range 0x5E4A - 0x5E8F, array index: 0x138C */ + 0xDD5A,0xDD5C,0xB745,0xDD5B,0xDD59,0xDD58,INVALC,INVALC, + INVALC,0xE1B4,0xB9F7,0xB9F5,INVALC,0xB9F6,0xE1B2,0xE1B3, + INVALC,0xB9F3,0xE571,0xE56F,INVALC,0xBC6D,0xE570,0xBC6E, + 0xBC6C,0xB9F4,INVALC,INVALC,0xE96D,0xE96B,0xE96C,0xE56E, + 0xECDC,0xC0B0,0xECDB,0xEFC5,0xEFC6,0xE96E,0xF1FE,INVALC, + 0xA47A,0xA5AD,0xA67E,0xC9DB,0xA67D,INVALC,0xA9AF,0xB746, + INVALC,0xA4DB,0xA5AE,0xABD5,0xB458,INVALC,0xC979,INVALC, + 0xC97A,INVALC,0xC9DC,INVALC,INVALC,0xA7C8,0xCAD0,0xCACE, + 0xA7C9,0xCACD,0xCACF,0xCAD1,INVALC,0xA7C7, + /* Range 0x5E95 - 0x5E9C, array index: 0x13D2 */ + 0xA9B3,0xA9B4,0xA9B1,INVALC,INVALC,0xA9B0,0xCEB8,0xA9B2, + /* Range 0x5EA0 - 0x5EB9, array index: 0x13DA */ + 0xABD6,INVALC,0xCEB7,0xCEB9,0xCEB6,0xCEBA,0xABD7,0xAE79, + 0xD175,INVALC,0xD177,0xAE77,0xD178,0xAE78,0xD176,INVALC, + 0xCEB5,0xD547,0xD54A,0xD54B,0xD548,0xB167,0xB166,0xB164, + 0xB165,0xD549, + /* Range 0x5EC1 - 0x5EE9, array index: 0x13F4 */ + 0xB45A,0xB45B,INVALC,0xB45C,0xDD5D,0xDD5F,0xDD61,0xB748, + 0xB747,0xB459,0xDD60,0xDD5E,INVALC,0xE1B8,INVALC,INVALC, + 0xE1B6,0xE1BC,0xB9F8,0xE1BD,0xE1BA,0xB9F9,0xE1B7,0xE1B5, + 0xE1BB,0xBC70,0xE573,0xE1B9,0xBC72,0xE574,0xBC71,0xBC74, + 0xE575,0xBC6F,0xBC73,INVALC,0xE973,0xE971,0xE970,0xE972, + 0xE96F, + /* Range 0x5EEE - 0x5EF7, array index: 0x141D */ + 0xF446,0xF447,INVALC,0xF5CB,0xF6DF,0xC655,INVALC,INVALC, + 0xA9B5,0xA7CA, + /* Range 0x5EFE - 0x5F0B, array index: 0x1427 */ + 0xA47B,0xA4DC,INVALC,0xA5AF,0xC9DD,INVALC,0xA7CB,0xCAD2, + INVALC,0xCEBB,0xABD9,INVALC,0xB9FA,0xA47C, + /* Range 0x5F12 - 0x5F29, array index: 0x1435 */ + 0xB749,0xA47D,0xA4DD,0xA4DE,INVALC,0xA5B1,0xA5B0,INVALC, + 0xC9DE,0xA6A2,INVALC,0xCAD3,INVALC,0xA7CC,INVALC,INVALC, + 0xCC71,0xCC72,0xCC73,INVALC,0xA9B6,0xA9B7,0xCC70,0xA9B8, + /* Range 0x5F2D - 0x5F38, array index: 0x144D */ + 0xABDA,0xCEBC,INVALC,0xD17A,0xAE7A,INVALC,0xD179,INVALC, + 0xB169,0xD54C,0xB16A,0xD54D, + /* Range 0x5F46 - 0x5F4F, array index: 0x1459 */ + 0xB9FB,INVALC,0xBC75,0xE576,0xBECA,0xE974,0xC0B1,INVALC, + 0xC573,0xF7D8, + /* Range 0x5F54 - 0x5F59, array index: 0x1463 */ + 0xCC74,INVALC,0xCEBD,0xB16B,0xD8F4,0xB74A, + /* Range 0x5F67 - 0x5FA1, array index: 0x1469 */ + 0xD17B,INVALC,0xB16D,0xB343,0xB16E,0xB16C,0xB45E,INVALC, + 0xE1C0,0xB9FC,0xBC76,INVALC,0xC94C,0xC9DF,INVALC,0xCAD5, + 0xA7CF,0xCAD4,0xA7D0,INVALC,INVALC,0xA9BC,0xCC77,0xCC76, + 0xA9BB,0xA9B9,0xA9BA,0xCC75,INVALC,INVALC,0xABDD,0xCEBE, + 0xABE0,0xABDC,0xABE2,0xABDE,0xABDF,0xABE1,INVALC,INVALC, + INVALC,0xAE7D,0xAE7C,0xAE7B,INVALC,INVALC,INVALC,0xD54F, + 0xB16F,0xB172,0xB170,INVALC,0xD54E,0xB175,INVALC,0xB171, + 0xD550,0xB174,0xB173, + /* Range 0x5FA5 - 0x5FAF, array index: 0x14A4 */ + 0xD8F6,0xD8F5,INVALC,0xB461,0xB45F,0xB460,0xD8F7,0xB74B, + 0xDD64,0xB74C,0xDD63, + /* Range 0x5FB5 - 0x5FC5, array index: 0x14AF */ + 0xBC78,0xE1C1,0xBC77,INVALC,0xB9FD,INVALC,0xECDE,0xE975, + 0xC0B2,0xECDD,0xF240,0xF448,0xF449,INVALC,0xA4DF,INVALC, + 0xA5B2, + /* Range 0x5FCC - 0x5FD9, array index: 0x14C0 */ + 0xA7D2,0xA7D4,INVALC,0xC9E2,0xCAD8,0xCAD7,0xCAD6,INVALC, + 0xC9E1,0xC9E0,0xA6A4,0xA7D3,0xA7D1,0xA6A3, + /* Range 0x5FDD - 0x5FE5, array index: 0x14CE */ + 0xA9BD,0xCC78,INVALC,0xA9BE,0xCADD,INVALC,0xCADF,0xCADE, + 0xCC79, + /* Range 0x5FEA - 0x6000, array index: 0x14D7 */ + 0xA7D8,0xA7D6,INVALC,0xCAD9,0xCADB,0xCAE1,INVALC,0xA7D5, + INVALC,0xCADC,0xCAE5,0xA9C0,INVALC,0xCAE2,0xA7D7,INVALC, + 0xCAE0,0xCAE3,INVALC,0xA9BF,INVALC,0xA9C1,0xCAE4, + /* Range 0x6009 - 0x6039, array index: 0x14EE */ + 0xCCAF,0xCCA2,0xCC7E,0xCCAE,0xCCA9,0xABE7,0xA9C2,0xCCAA, + 0xCCAD,0xABE3,0xCCAC,0xA9C3,0xA9C8,0xA9C6,0xCCA3,INVALC, + 0xCC7C,0xCCA5,0xA9CD,0xCCB0,0xABE4,0xCCA6,INVALC,0xABE5, + 0xA9C9,0xCCA8,INVALC,0xCECD,0xABE6,0xCC7B,0xA9CA,0xABE8, + 0xA9CB,0xA9C7,0xA9CC,0xCCA7,0xCC7A,0xCCAB,0xA9C4,INVALC, + INVALC,0xCC7D,0xCCA4,0xCCA1,0xA9C5,INVALC,0xCEBF,INVALC, + 0xCEC0, + /* Range 0x6040 - 0x604D, array index: 0x151F */ + 0xCECA,0xD1A1,0xCECB,0xABEE,0xCECE,0xCEC4,0xABED,0xCEC6, + INVALC,0xCEC7,INVALC,INVALC,0xCEC9,0xABE9, + /* Range 0x6053 - 0x6072, array index: 0x152D */ + 0xCEC5,0xCEC1,0xAEA4,INVALC,INVALC,0xCECF,0xAE7E,0xD17D, + 0xCEC8,INVALC,0xD17C,0xCEC3,0xCECC,INVALC,INVALC,0xABEC, + 0xAEA1,0xABF2,0xAEA2,0xCED0,0xD17E,0xABEB,0xAEA6,0xABF1, + 0xABF0,0xABEF,0xAEA5,0xCED1,0xAEA7,0xABEA,INVALC,0xCEC2, + /* Range 0x607F - 0x60A3, array index: 0x154D */ + 0xB176,0xD1A4,0xD1A6,INVALC,0xD1A8,0xAEA8,0xAEAE,0xD553, + 0xD1AC,0xD1A3,0xB178,0xD551,INVALC,0xAEAD,0xAEAB,0xD1AE, + INVALC,0xD552,INVALC,0xD1A5,INVALC,0xAEAC,0xD1A9,0xAEAF, + 0xD1AB,INVALC,INVALC,0xAEAA,0xD1AA,0xD1AD,0xD1A7,INVALC, + 0xAEA9,0xB179,INVALC,0xD1A2,0xB177, + /* Range 0x60B0 - 0x60E6, array index: 0x1572 */ + 0xD555,0xD55E,0xB464,INVALC,0xB17C,0xB1A3,0xB465,0xD560, + 0xB1AA,0xD8F9,0xD556,0xB1A2,0xB1A5,0xB17E,0xD554,0xD562, + 0xD565,0xD949,INVALC,0xD563,0xD8FD,0xB1A1,0xB1A8,0xB1AC, + 0xD55D,0xD8F8,0xD561,0xB17B,0xD8FA,0xD564,0xD8FC,0xD559, + INVALC,0xB462,INVALC,0xD557,0xD558,0xB1A7,INVALC,INVALC, + 0xB1A6,0xD55B,0xB1AB,0xD55F,0xB1A4,0xD55C,INVALC,0xB1A9, + 0xB466,0xB463,0xD8FB,INVALC,0xD55A,INVALC,0xB17D, + /* Range 0x60F0 - 0x611F, array index: 0x15A9 */ + 0xB46B,0xB46F,0xD940,0xB751,0xB46D,0xD944,0xB471,0xDD65, + 0xD946,0xB753,0xB469,0xB46C,0xD947,INVALC,0xD948,0xD94E, + 0xB473,0xB754,INVALC,0xD94A,0xD94F,0xD943,0xB75E,INVALC, + 0xB755,0xB472,0xD941,0xD950,INVALC,0xB75D,0xB470,0xB74E, + 0xD94D,INVALC,0xB474,0xD945,0xD8FE,0xB46A,0xD942,INVALC, + 0xD94B,INVALC,0xB74D,0xB752,0xB467,0xD94C,INVALC,0xB750, + /* Range 0x6127 - 0x612F, array index: 0x15D9 */ + 0xB75C,0xE1C3,0xDD70,INVALC,0xDD68,0xE1C2,INVALC,0xDD6C, + 0xDD6E, + /* Range 0x613E - 0x6183, array index: 0x15E2 */ + 0xB75A,0xBA40,0xDD71,0xE1C4,INVALC,INVALC,0xB758,0xDD69, + 0xDD6D,0xB9FE,0xB74F,0xDD66,0xDD67,0xBA41,0xB757,0xB759, + 0xB756,0xDD6F,INVALC,INVALC,0xE1C8,0xE1C9,0xE1CE,0xBC7D, + 0xE1D5,INVALC,0xBA47,INVALC,0xBA46,0xE1D0,INVALC,0xBC7C, + 0xE1C5,0xBA45,INVALC,0xE1D4,0xBA43,0xBA44,INVALC,0xE1D1, + 0xE5AA,0xBC7A,0xB46E,INVALC,0xE1D3,0xBCA3,0xE1CB,INVALC, + 0xBC7B,INVALC,0xBCA2,0xE1C6,0xE1CA,0xE1C7,0xE1CD,0xBA48, + 0xBC79,0xBA42,INVALC,0xE57A,0xE1CF,INVALC,0xBCA1,INVALC, + 0xBCA4,INVALC,0xE1CC,INVALC,0xBC7E,0xE579, + /* Range 0x6189 - 0x6196, array index: 0x1628 */ + 0xE57E,0xBECE,0xE578,0xE9A3,0xE5A9,0xBCA8,INVALC,0xBCA6, + 0xBECC,0xE5A6,0xE5A2,0xBCAC,INVALC,0xE978, + /* Range 0x61A7 - 0x61CD, array index: 0x1636 */ + 0xBCA5,0xE977,0xBECD,0xE5A7,0xBCA7,0xBCA9,0xE5A4,0xBCAD, + 0xE5A3,0xE57C,0xE57B,0xBECB,0xE5AB,0xE97A,0xECE0,0xBED0, + INVALC,0xE9A2,INVALC,0xE97E,INVALC,0xECE1,INVALC,0xBED1, + 0xE9A1,INVALC,0xE97C,0xC0B4,0xECDF,INVALC,0xE979,0xE97B, + 0xC0B5,0xBED3,0xC0B3,0xBED2,0xC0B7,0xE97D,0xBECF, + /* Range 0x61DE - 0x6236, array index: 0x165D */ + 0xECE7,0xEFC8,0xECE3,INVALC,INVALC,0xC256,0xECE5,0xECE4, + 0xC0B6,0xECE2,0xECE6,0xEFD0,0xEFCC,0xEFCE,INVALC,0xEFC9, + 0xEFCA,INVALC,0xEFCD,0xEFCB,0xC367,INVALC,INVALC,0xC36A, + 0xC369,0xC368,0xC461,0xF44A,0xC462,0xF241,0xC4DF,0xF5CC, + 0xC4E0,0xC574,0xC5CA,0xF7D9,INVALC,0xF7DA,0xF7DB,INVALC, + INVALC,0xF9BA,0xA4E0,0xC97C,0xA5B3,INVALC,0xA6A6,0xA6A7, + 0xA6A5,INVALC,0xA6A8,0xA7DA,0xA7D9,INVALC,0xCCB1,0xA9CF, + 0xA9CE,INVALC,INVALC,0xD1AF,0xB1AD,0xB1AE,INVALC,INVALC, + INVALC,0xB475,0xDD72,0xB760,0xB761,0xDD74,0xDD76,0xDD75, + INVALC,0xE1D7,INVALC,0xE1D6,0xBA49,0xE1D8,INVALC,0xE5AC, + 0xBCAE,INVALC,0xBED4,INVALC,0xC0B8,0xC257,0xC0B9,INVALC, + 0xA4E1, + /* Range 0x623D - 0x6266, array index: 0x16B6 */ + 0xCCB2,0xA9D1,0xA9D0,0xA9D2,0xABF3,0xCED2,0xCED3,INVALC, + INVALC,0xD1B0,0xAEB0,0xB1AF,0xB476,0xD951,0xA4E2,INVALC, + 0xA47E,0xA4E3,INVALC,0xC97D,0xA5B7,0xA5B6,0xA5B4,0xA5B5, + INVALC,INVALC,INVALC,0xA6AB,0xC9E9,0xC9EB,0xA6AA,0xC9E3, + INVALC,0xC9E4,INVALC,0xC9EA,0xC9E6,0xC9E8,0xA6A9,0xC9E5, + 0xC9EC,0xC9E7, + /* Range 0x626D - 0x6298, array index: 0x16E0 */ + 0xA7E1,0xA7EA,0xA7E8,0xCAF0,0xCAED,0xCAF5,0xA7E6,0xCAF6, + INVALC,0xA7DF,0xCAF3,INVALC,0xA7E5,0xCAEF,0xCAEE,0xA7E3, + 0xCAF4,0xA7E4,0xA9D3,0xA7DE,0xCAF1,INVALC,0xCAE7,0xA7DB, + INVALC,0xA7EE,0xCAEC,0xCAF2,0xA7E0,0xA7E2,INVALC,0xCAE8, + INVALC,0xCAE9,0xCAEA,INVALC,0xA7ED,0xA7E7,0xA7EC,0xCAEB, + 0xA7EB,0xA7DD,0xA7DC,0xA7E9, + /* Range 0x62A8 - 0x62BF, array index: 0x170C */ + 0xA9E1,0xCCBE,0xCCB7,0xA9DC,0xA9EF,0xCCB3,0xCCBA,0xCCBC, + 0xCCBF,0xA9EA,INVALC,0xCCBB,0xCCB4,0xA9E8,0xCCB8,INVALC, + 0xCCC0,0xA9D9,INVALC,0xCCBD,0xA9E3,0xA9E2,0xCCB6,0xA9D7, + /* Range 0x62C4 - 0x62DC, array index: 0x1724 */ + 0xA9D6,INVALC,0xA9EE,0xA9E6,0xA9E0,0xA9D4,0xCCB9,0xA9DF, + 0xA9D5,0xA9E7,0xA9F0,0xCED4,0xA9E4,0xCCB5,0xA9DA,0xA9DD, + 0xA9DE,INVALC,0xA9EC,0xA9ED,0xA9EB,0xA9E5,0xA9E9,0xA9DB, + 0xABF4, + /* Range 0x62EB - 0x6316, array index: 0x173D */ + 0xCEDA,0xAC41,0xABF8,0xABFA,0xAC40,0xCEE6,0xABFD,0xD1B1, + 0xAEB1,0xAC43,0xCED7,0xCEDF,0xABFE,0xCEDE,0xCEDB,0xCEE3, + 0xCEE5,0xABF7,0xABFB,0xAC42,0xAEB3,0xCEE0,0xABF9,0xAC45, + 0xCED9,INVALC,INVALC,INVALC,0xABFC,0xAEB2,0xABF6,INVALC, + 0xCED6,0xCEDD,0xCED5,0xCED8,0xCEDC,0xD1B2,0xAC44,INVALC, + 0xCEE1,0xCEE2,0xCEE4,0xABF5, + /* Range 0x6328 - 0x635A, array index: 0x1769 */ + 0xAEC1,0xD1BE,0xAEBF,0xAEC0,0xD1B4,0xD1C4,INVALC,0xAEB6, + INVALC,INVALC,0xD566,0xD1C6,0xD1C0,INVALC,0xD1B7,INVALC, + 0xD1C9,0xD1BA,0xAEBC,0xD57D,0xD1BD,0xAEBE,0xAEB5,INVALC, + 0xD1CB,0xD1BF,0xAEB8,0xD1B8,0xD1B5,0xD1B6,0xAEB9,0xD1C5, + 0xD1CC,0xAEBB,0xD1BC,0xD1BB,0xAEC3,0xAEC2,0xAEB4,0xAEBA, + 0xAEBD,0xD1C8,INVALC,INVALC,0xD1C2,0xAEB7,0xD1B3,0xD1CA, + 0xD1C1,0xD1C3,0xD1C7, + /* Range 0x6365 - 0x63B1, array index: 0x179C */ + 0xD567,INVALC,0xB1B7,0xB1CB,0xB1CA,INVALC,0xB1BF,INVALC, + 0xD579,0xD575,0xD572,0xD5A6,0xB1BA,0xB1B2,INVALC,INVALC, + 0xD577,0xB4A8,0xB1B6,0xD5A1,INVALC,0xB1CC,0xB1C9,0xD57B, + 0xD56A,INVALC,INVALC,0xB1C8,0xD5A3,0xD569,0xB1BD,0xB1C1, + 0xD5A2,INVALC,0xD573,0xB1C2,0xB1BC,0xD568,INVALC,0xB478, + 0xD5A5,0xD571,0xB1C7,0xD574,0xD5A4,0xB1C6,INVALC,0xD952, + INVALC,0xB1B3,0xD56F,0xB1B8,0xB1C3,INVALC,0xB1BE,0xD578, + 0xD56E,0xD56C,0xD57E,0xB1B0,0xB1C4,0xB1B4,0xB477,0xD57C, + 0xB1B5,INVALC,0xB1B1,0xB1C0,0xB1BB,0xB1B9,0xD570,0xB1C5, + 0xD56D,0xD57A,0xD576,0xD954,0xD953, + /* Range 0x63C0 - 0x63F6, array index: 0x17E9 */ + 0xB47A,INVALC,0xD96A,0xD959,0xD967,0xDD77,0xB47D,0xD96B, + 0xD96E,0xB47C,0xD95C,0xD96D,0xD96C,0xB47E,0xD955,0xB479, + 0xB4A3,INVALC,0xB4A1,0xD969,INVALC,0xD95F,0xB4A5,0xD970, + 0xD968,0xD971,0xB4AD,0xB4AB,0xD966,0xD965,INVALC,0xD963, + 0xD95D,0xB4A4,INVALC,0xB4A2,0xD1B9,0xD956,INVALC,0xDDB7, + 0xD957,0xB47B,0xB4AA,0xDD79,INVALC,0xB4A6,0xB4A7,0xD958, + 0xD96F,0xDD78,0xD960,0xD95B,0xB4A9,0xD961,0xD95E, + /* Range 0x6409 - 0x6443, array index: 0x1820 */ + 0xDD7C,0xDDB1,0xDDB6,0xDDAA,0xB76C,0xDDBB,0xB769,0xDD7A, + INVALC,0xDD7B,0xB762,0xB76B,0xDDA4,0xB76E,0xB76F,0xDDA5, + INVALC,0xDDB2,0xDDB8,0xB76A,INVALC,0xB764,0xDDA3,0xDD7D, + 0xDDBA,0xDDA8,0xDDA9,0xDD7E,0xDDB4,0xDDAB,0xDDB5,0xDDAD, + INVALC,0xB765,0xE1D9,0xB768,0xB766,0xDDB9,0xDDB0,0xDDAC, + INVALC,INVALC,0xDDA1,0xBA53,0xDDAF,0xB76D,0xDDA7,INVALC, + 0xDDA6,INVALC,INVALC,INVALC,0xB767,0xB763,0xE1EE,0xDDB3, + 0xDDAE,INVALC,0xDDA2, + /* Range 0x644D - 0x6454, array index: 0x185B */ + 0xE1DA,0xE1E5,INVALC,0xE1EC,0xBA51,0xB4AC,0xE1EA,0xBA4C, + /* Range 0x6458 - 0x647F, array index: 0x1863 */ + 0xBA4B,0xE1F1,INVALC,0xE1DB,0xE1E8,0xE1DC,0xE1E7,0xBA4F, + 0xE1EB,0xD962,INVALC,INVALC,INVALC,0xE1F2,0xE1E3,0xBA52, + 0xE5BA,0xBCAF,INVALC,0xE1F0,0xE1EF,0xBA54,0xE5AD,0xBCB0, + 0xE5AE,INVALC,0xE1DF,0xE1E0,0xE1DD,0xE1E2,0xE1DE,0xE1F3, + 0xBA4E,0xBCB1,0xBA50,0xBA55,INVALC,0xE1E1,INVALC,0xE1ED, + /* Range 0x6485 - 0x64A6, array index: 0x188B */ + 0xE5B1,INVALC,0xBA4A,0xBCB4,0xE9AA,0xE5B6,0xE5B5,0xE5B7, + INVALC,INVALC,0xE5B4,0xBCB5,INVALC,0xBCBB,0xBCB8,INVALC, + 0xBCB9,0xE5AF,0xE5B2,0xE5BC,0xBCC1,0xBCBF,INVALC,0xE5B3, + 0xD95A,0xBCB2,0xE5B9,0xE5B0,INVALC,0xBCC2,0xE5B8,0xBA4D, + 0xBCB7,0xE1E4, + /* Range 0x64A9 - 0x64B3, array index: 0x18AD */ + 0xBCBA,INVALC,0xBCBE,0xBCC0,0xBCBD,0xBCBC,INVALC,0xBCB6, + 0xE5BB,0xBCB3,0xBCC3, + /* Range 0x64BB - 0x64DB, array index: 0x18B8 */ + 0xBED8,0xBED9,0xE9A9,0xBEE2,0xBEDF,INVALC,0xBED6,0xBEDD, + 0xE9AB,0xBEDB,0xBED5,INVALC,0xBEDC,INVALC,0xE9A8,0xC0BB, + 0xBED7,INVALC,0xBEDE,0xC0BA,0xE9A7,0xE9A6,INVALC,0xBEE0, + INVALC,0xBEE1,INVALC,0xE9A5,0xE9A4,0xC0BC,0xE9AE,0xBEDA, + 0xE9AC, + /* Range 0x64E0 - 0x654A, array index: 0x18D9 */ + 0xC0BD,INVALC,0xC0C2,0xECEA,0xECEC,INVALC,0xC0BF,INVALC, + 0xECED,0xECE9,INVALC,0xECEB,0xC0C0,0xC0C3,INVALC,0xECE8, + 0xC0BE,0xC0C1,0xC259,0xE9AD,0xC258,INVALC,INVALC,0xC25E, + 0xEFD4,INVALC,0xC25C,0xC25D,0xEFD7,0xEFD3,0xC25A,0xEFD1, + 0xC36B,0xEFD5,INVALC,0xEFD6,0xEFD2,INVALC,0xC25B,0xF242, + INVALC,0xF245,INVALC,INVALC,0xF246,0xF244,0xF247,0xC36C, + 0xF243,INVALC,INVALC,0xF44E,0xC464,0xF44D,0xF44C,0xF44B, + 0xC463,0xC465,INVALC,0xF5CD,0xC4E2,0xC4E1,INVALC,INVALC, + 0xF6E1,0xF6E0,0xF6E3,0xC5CB,0xC575,0xF7DD,0xF6E2,INVALC, + INVALC,0xF7DC,0xC5CD,0xC5CC,0xC5F3,0xF8A9,0xF8EF,0xA4E4, + INVALC,INVALC,0xD972,0xE9AF,INVALC,INVALC,0xA6AC,0xCAF7, + 0xA7F1,0xA7EF,INVALC,0xA7F0,INVALC,0xCCC1,0xA9F1,0xAC46, + INVALC,0xCEE7,INVALC,0xCEE8,INVALC,0xAC47,0xD1CE,INVALC, + 0xAEC4,0xAEC5,0xD1CD, + /* Range 0x6551 - 0x656C, array index: 0x1944 */ + 0xB1CF,INVALC,0xD5A7,0xB1D6,0xB1D5,0xB1CE,0xB1D1,0xB1D4, + 0xB1D0,INVALC,INVALC,0xD976,0xB1CD,0xB4AF,INVALC,INVALC, + INVALC,0xB4B1,0xB4B2,0xD975,0xD978,0xB4B0,0xD973,0xD977, + INVALC,0xD974,INVALC,0xB771, + /* Range 0x6572 - 0x6584, array index: 0x1960 */ + 0xBA56,0xE1F4,0xBEE3,0xBCC4,0xE5BD,0xBCC5,0xBCC6,0xE5BF, + 0xE5BE,0xE5C0,0xE9B1,INVALC,INVALC,0xE9B0,0xECEF,0xECEE, + 0xC0C4,0xC0C5,0xF248, + /* Range 0x6590 - 0x65C6, array index: 0x1973 */ + 0xB4B4,0xB4B3,0xDDBD,INVALC,0xEFD8,0xC4E3,0xF7DE,0xA4E6, + INVALC,0xAEC6,INVALC,0xB1D8,0xB1D7,0xD97A,0xD97B,0xB772, + 0xE1F5,0xBA57,0xE9B2,INVALC,0xA4E7,0xA5B8,INVALC,0xA9F2, + 0xCCC2,INVALC,0xCEE9,0xAC48,0xB1D9,INVALC,0xD97C,0xB4B5, + 0xB773,INVALC,0xE5C1,0xE5C2,INVALC,INVALC,0xECF0,0xC25F, + 0xF8F0,0xA4E8,INVALC,0xCCC3,0xA9F3,0xAC49,INVALC,0xCEEA, + INVALC,0xAEC7,0xD1D2,0xD1D0,0xD1D1,0xAEC8,0xD1CF, + /* Range 0x65CB - 0x65F5, array index: 0x19AA */ + 0xB1DB,0xB1DC,0xD5A8,0xB1DD,0xB1DA,0xD97D,INVALC,0xD97E, + 0xDDBE,INVALC,INVALC,0xBA59,0xBA58,INVALC,INVALC,0xECF1, + 0xEFD9,INVALC,0xF24A,0xF249,0xF44F,INVALC,0xC95E,0xAC4A, + INVALC,INVALC,0xA4E9,0xA5B9,INVALC,0xA6AE,0xA6AD,INVALC, + INVALC,0xA6AF,0xA6B0,0xC9EE,0xC9ED,0xCAF8,0xA7F2,0xCAFB, + 0xCAFA,0xCAF9,0xCAFC, + /* Range 0x65FA - 0x65FD, array index: 0x19D5 */ + 0xA9F4,0xCCC9,0xCCC5,0xCCCE, + /* Range 0x6600 - 0x6615, array index: 0x19D9 */ + 0xA9FB,INVALC,0xA9F9,0xCCCA,0xCCC6,0xCCCD,0xA9F8,0xAA40, + 0xCCC8,0xCCC4,0xA9FE,0xCCCB,0xA9F7,0xCCCC,0xA9FA,0xA9FC, + 0xCCD0,0xCCCF,0xCCC7,0xA9F6,0xA9F5,0xA9FD, + /* Range 0x661C - 0x6628, array index: 0x19EF */ + 0xCEEF,0xCEF5,INVALC,0xAC50,0xAC4D,0xCEEC,0xCEF1,INVALC, + 0xAC53,0xAC4B,0xCEF0,0xAC4E,0xAC51, + /* Range 0x662B - 0x663A, array index: 0x19FC */ + 0xCEF3,INVALC,0xAC4C,0xCEF8,0xAC4F,INVALC,0xAC52,0xCEED, + 0xCEF2,0xCEF6,0xCEEE,0xCEEB,INVALC,INVALC,0xCEF7,0xCEF4, + /* Range 0x6641 - 0x664C, array index: 0x1A0C */ + 0xAED0,0xAEC9,0xAECC,INVALC,0xAECF,INVALC,0xD1D5,INVALC, + 0xAECA,0xD1D3,INVALC,0xAECE, + /* Range 0x6659 - 0x6680, array index: 0x1A18 */ + 0xD5AC,0xB1DF,0xD5AB,0xD5AD,0xB1DE,0xB1E3,0xD1D4,INVALC, + 0xD5AA,0xD5AE,INVALC,0xB1E0,0xD5A9,0xB1E2,INVALC,0xB1E1, + INVALC,0xD9A7,INVALC,0xD9A2,INVALC,0xB4B6,0xB4BA,0xB4B7, + 0xD9A5,0xD9A8,INVALC,0xB4B8,INVALC,0xB4B9,0xB4BE,0xDDC7, + 0xD9A6,0xB4BC,0xD9A3,0xD9A1,INVALC,0xB4BD,INVALC,0xD9A4, + /* Range 0x6684 - 0x6699, array index: 0x1A40 */ + 0xB779,INVALC,0xDDBF,0xB776,0xB777,0xB775,0xDDC4,0xDDC3, + 0xDDC0,0xB77B,INVALC,INVALC,0xDDC2,0xB4BB,INVALC,INVALC, + 0xDDC6,0xDDC1,0xB778,0xB774,0xB77A,0xDDC5, + /* Range 0x669D - 0x66A2, array index: 0x1A56 */ + 0xBA5C,INVALC,0xE1F8,0xE1F7,0xE1F6,0xBA5A, + /* Range 0x66A8 - 0x66C0, array index: 0x1A5C */ + 0xBA5B,0xE5C5,0xE5C8,0xBCC8,INVALC,INVALC,0xBCC7,0xE5C9, + 0xE5C4,0xBCCA,0xE5C6,INVALC,0xBCC9,0xE5C3,INVALC,0xE5C7, + 0xBEE9,0xBEE6,0xE9BB,0xE9BA,INVALC,0xE9B9,0xE9B4,INVALC, + 0xE9B5, + /* Range 0x66C4 - 0x66CC, array index: 0x1A75 */ + 0xBEE7,INVALC,0xBEE4,0xBEE8,0xE9B3,0xBEE5,0xE9B6,0xE9B7, + 0xE9BC, + /* Range 0x66D6 - 0x66F9, array index: 0x1A7E */ + 0xC0C7,INVALC,0xEFDC,0xC0C6,0xEFDA,0xEFDB,0xC260,0xC36E, + 0xF24B,INVALC,0xC36D,INVALC,INVALC,0xF451,0xF452,INVALC, + 0xC466,INVALC,0xF450,0xC4E4,INVALC,0xF7DF,0xC5CE,0xF8AA, + 0xF8AB,INVALC,0xA4EA,INVALC,0xA6B1,0xA6B2,0xA7F3,INVALC, + 0xCCD1,0xAC54,0xAED1,0xB1E4, + /* Range 0x66FC - 0x6718, array index: 0x1AA2 */ + 0xB0D2,INVALC,0xB4BF,0xB4C0,0xB3CC,0xD9A9,INVALC,0xB77C, + 0xE1FA,0xE1F9,INVALC,INVALC,0xA4EB,0xA6B3,0xCCD2,0xAA42, + INVALC,0xAA41,INVALC,0xCEF9,0xCEFA,INVALC,0xD1D7,0xD1D8, + 0xAED2,0xAED3,INVALC,0xAED4,0xD5AF, + /* Range 0x671D - 0x672E, array index: 0x1ABF */ + 0xB4C2,INVALC,0xB4C1,0xDDC8,0xDF7A,0xE1FB,0xE9BD,INVALC, + INVALC,0xC261,0xC467,0xA4EC,INVALC,0xA5BC,0xA5BD,0xA5BB, + 0xA5BE,0xA5BA, + /* Range 0x6731 - 0x673F, array index: 0x1AD1 */ + 0xA6B6,INVALC,0xC9F6,0xA6B5,0xA6B7,INVALC,INVALC,0xC9F1, + 0xC9F0,0xC9F3,0xC9F2,0xC9F5,0xA6B4,0xC9EF,0xC9F4, + /* Range 0x6745 - 0x6760, array index: 0x1AE0 */ + 0xCAFD,0xA7FD,0xCAFE,0xCB43,0xA7FC,INVALC,0xCB47,0xCB42, + 0xCB45,0xA7F5,0xA7F6,0xA7F7,0xA7F8,INVALC,0xA840,INVALC, + 0xCB41,0xA7FA,0xA841,INVALC,0xCB40,0xCB46,INVALC,0xA7F9, + 0xCB44,0xA7FB,0xA7F4,0xA7FE, + /* Range 0x676C - 0x679F, array index: 0x1AFC */ + 0xCCD4,0xAA43,INVALC,0xAA4D,0xAA4E,0xAA46,0xAA58,0xAA48, + 0xCCDC,0xAA53,0xCCD7,0xAA49,0xCCE6,0xCCE7,0xCCDF,0xCCD8, + 0xAA56,0xCCE4,0xAA51,0xAA4F,INVALC,0xCCE5,INVALC,0xCCE3, + 0xCCDB,0xCCD3,0xCCDA,0xAA4A,INVALC,0xAA50,INVALC,0xAA44, + 0xCCDE,0xCCDD,0xCCD5,INVALC,0xAA52,0xCCE1,0xCCD6,0xAA55, + 0xCCE8,0xAA45,INVALC,0xAA4C,0xCCD9,0xCCE2,0xAA54,INVALC, + 0xAA47,0xAA4B,INVALC,0xCCE0, + /* Range 0x67AE - 0x67BB, array index: 0x1B30 */ + 0xCF5B,0xAC5C,0xAC69,INVALC,0xCF56,0xCF4C,0xAC62,0xCF4A, + 0xAC5B,0xCF45,0xAC65,0xCF52,0xCEFE,0xCF41, + /* Range 0x67C0 - 0x67FC, array index: 0x1B3E */ + 0xCF44,0xCEFB,0xCF51,0xCF61,0xAC60,0xCF46,0xCF58,INVALC, + 0xCEFD,0xCF5F,0xCF60,0xCF63,0xCF5A,0xCF4B,0xCF53,0xAC66, + 0xAC59,0xAC61,0xAC6D,0xAC56,0xAC58,INVALC,INVALC,INVALC, + 0xCF43,0xAC6A,0xAC63,0xCF5D,0xCF40,0xAC6C,0xAC67,0xCF49, + INVALC,INVALC,0xAC6B,0xCF50,0xCF48,0xAC64,0xCF5C,0xCF54, + INVALC,0xAC5E,0xCF62,0xCF47,0xAC5A,0xCF59,0xCF4F,0xAC5F, + 0xCF55,0xAC57,0xCEFC,0xAC68,0xAEE3,0xAC5D,0xCF4E,0xCF4D, + 0xCF42,INVALC,0xCF5E,INVALC,0xCF57, + /* Range 0x6812 - 0x6821, array index: 0x1B7B */ + 0xD1EC,0xAEEA,0xD1ED,INVALC,0xD1E1,0xAEDF,0xAEEB,INVALC, + 0xD1DA,INVALC,0xD1E3,0xD1EB,INVALC,0xD1D9,0xD1F4,0xAED5, + /* Range 0x6825 - 0x6854, array index: 0x1B8B */ + 0xD1F3,0xD1EE,INVALC,0xD1EF,0xAEDD,0xAEE8,0xD1E5,INVALC, + 0xD1E6,0xD1F0,0xD1E7,INVALC,0xD1E2,0xD1DC,0xD1DD,0xD1EA, + 0xD1E4,INVALC,INVALC,0xAED6,0xAEDA,0xD1F2,0xD1DE,0xAEE6, + 0xAEE2,INVALC,INVALC,0xAEE5,0xAEEC,0xAEDB,0xAEE7,0xD1E9, + 0xAEE9,0xAED8,INVALC,0xAED7,0xD1DB,INVALC,0xD1DF,0xAEE0, + 0xD1F1,0xD1E8,0xD1E0,0xAEE4,0xAEE1,INVALC,0xAED9,0xAEDC, + /* Range 0x686B - 0x68B5, array index: 0x1BBB */ + 0xD5C4,INVALC,0xD5B4,0xD5B5,0xD5B9,INVALC,0xD5C8,0xD5C5, + INVALC,0xD5BE,0xD5BD,0xB1ED,0xD5C1,0xD5D0,0xD5B0,INVALC, + 0xD5D1,0xD5C3,0xD5D5,0xD5C9,0xB1EC,0xD5C7,0xB1E7,0xB1FC, + 0xB1F2,INVALC,0xB1F6,0xB1F5,0xD5B1,INVALC,0xD5CE,0xD5D4, + 0xD5CC,0xD5D3,INVALC,INVALC,0xD5C0,0xD5B2,0xD5D2,0xD5C2, + 0xB1EA,0xB1F7,INVALC,0xD5CB,0xB1F0,INVALC,INVALC,INVALC, + 0xD5CA,0xD5B3,0xB1F8,INVALC,0xB1FA,0xD5CD,0xB1FB,0xB1E9, + 0xD5BA,0xD5CF,INVALC,INVALC,0xB1EF,0xB1F9,0xD5BC,0xD5C6, + 0xD5B7,0xD5BB,0xB1F4,0xD5B6,0xB1E8,0xB1F1,0xB1EE,0xD5BF, + 0xAEDE,0xD9C0,0xB1EB, + /* Range 0x68C4 - 0x68FD, array index: 0x1C06 */ + 0xB1F3,INVALC,0xD9C3,0xD9D9,0xD9CE,0xB4D6,INVALC,0xB4D1, + 0xD9BD,0xB4D2,0xD9CD,INVALC,0xD9C6,0xD9D3,0xB4CE,0xD9AB, + 0xD9D5,0xB4C4,0xD9B3,0xB4C7,0xB4C6,INVALC,0xB4D7,INVALC, + 0xD9AD,0xD9CF,0xD9D0,0xB4C9,0xB4C5,0xD9BB,INVALC,0xB4D0, + 0xD9B6,INVALC,0xD9D1,0xB4CC,0xD9C9,0xD9D6,0xD9B0,0xD9B5, + 0xD9AF,INVALC,0xB4CB,0xD9C2,0xDDDE,0xD9B1,0xB4CF,0xD9BA, + 0xD9D2,0xB4CA,0xD9B7,0xD9B4,0xD9C5,0xB4CD,0xB4C3,0xB4D9, + 0xD9C8,0xD9C7, + /* Range 0x6904 - 0x6917, array index: 0x1C40 */ + 0xD9AC,0xB4C8,0xD9D4,0xD9BC,0xD9BE,INVALC,0xD9CB,0xD9CA, + 0xD9AA,0xB4D3,0xB4D5,0xD9B2,0xD9B9,0xD9C1,0xB4D4,0xD9B8, + 0xD9C4,0xD9D7,INVALC,0xD9CC, + /* Range 0x692F - 0x697B, array index: 0x1C54 */ + 0xDDF2,0xB7A6,INVALC,0xDDF0,0xDDDB,0xDDE0,0xDDD9,INVALC, + 0xDDEC,0xDDCB,0xDDD2,INVALC,0xDDEA,0xDDF4,0xDDDC,INVALC, + 0xDDCF,0xDDE2,0xDDE7,0xDDD3,INVALC,0xDDE4,0xDDD0,INVALC, + INVALC,0xDDD7,0xDDD8,0xB7A8,0xDDEB,0xDDE9,INVALC,0xDDCC, + 0xDDEE,INVALC,0xDDEF,0xDDF1,0xB7AC,0xB7A4,INVALC,0xD5B8, + 0xDDD4,0xDDE6,0xDDD5,0xB7A1,0xB7B1,0xDDED,0xB7AF,0xB7AB, + 0xDDCA,0xB7A3,INVALC,0xDDCD,0xB7B0,INVALC,0xDDDD,0xDDC9, + INVALC,0xB7A9,0xDDE1,0xDDD1,0xB7AA,0xDDDA,0xB77E,0xB4D8, + 0xDDE3,0xD9BF,0xDDCE,INVALC,INVALC,0xDDE8,0xB7A5,0xDDE5, + 0xB7A2,0xDDDF,0xB7AD,0xDDD6,0xDDF3, + /* Range 0x698D - 0x69D4, array index: 0x1CA1 */ + 0xE24A,0xE248,INVALC,0xE25E,0xE246,INVALC,0xE258,0xB77D, + 0xBA5F,0xE242,0xE25D,INVALC,0xE247,0xE255,0xBA64,0xBA5D, + INVALC,0xE25B,INVALC,0xE240,0xE25A,INVALC,0xBA6F,0xE251, + 0xE261,0xBA6D,0xE249,0xBA5E,0xE24B,0xE259,0xBA67,0xE244, + 0xBA6B,0xBA61,0xE24D,0xE243,0xE1FC,INVALC,0xE257,0xBA68, + 0xE260,0xE1FD,0xBA65,INVALC,0xE253,INVALC,0xBA66,0xE245, + 0xE250,0xE24C,0xE24E,INVALC,0xBA60,0xE25F,0xBA6E,0xE24F, + INVALC,0xE262,INVALC,INVALC,0xE1FE,0xE254,0xBA63,0xBA6C, + 0xBA6A,0xE241,0xE256,0xBA69,INVALC,INVALC,0xBA62,0xE252, + /* Range 0x69E2 - 0x6A0A, array index: 0x1CE9 */ + 0xE5D5,INVALC,0xE5D1,0xE5CD,0xE5E1,0xE5DE,0xBCCD,INVALC, + INVALC,0xE5E5,0xE5D4,0xBCD8,0xE5DB,INVALC,INVALC,0xE5D0, + 0xE5DA,0xBCD5,0xE5EE,INVALC,0xE5EB,0xE5DD,0xE5CE,INVALC, + INVALC,0xE5E2,0xE5E4,0xBCD1,0xE5D8,0xE5D3,0xE5CA,0xBCCE, + 0xBCD6,INVALC,0xE5E7,0xBCD7,0xE5CB,0xE5ED,0xE5E0,0xE5E6, + 0xBCD4, + /* Range 0x6A11 - 0x6A28, array index: 0x1D12 */ + 0xBCD9,INVALC,0xBCD3,0xE5DC,0xE5CF,0xE5EF,0xE5CC,0xE5E8, + 0xBCD0,INVALC,0xE5D6,INVALC,0xE5D7,0xBCCF,0xBCCC,0xE5D2, + 0xBCD2,INVALC,0xBCCB,INVALC,0xE5E9,0xE5EC,0xE5D9,0xE9CA, + /* Range 0x6A34 - 0x6A41, array index: 0x1D2A */ + 0xE9BE,0xBEF6,INVALC,INVALC,0xBEEB,0xBEF0,0xBEEC,0xE9CC, + 0xE9D7,0xBEEA,0xE9C4,0xE9CD,0xE5DF,0xE9CE, + /* Range 0x6A44 - 0x6A6F, array index: 0x1D38 */ + 0xBEF1,INVALC,0xE9DD,0xBEF5,0xBEF8,0xE9C0,INVALC,0xBEF4, + INVALC,0xE9DB,0xE9DC,0xE9D2,0xE9D1,0xE9C9,INVALC,INVALC, + 0xE9D3,0xE9DA,0xE9D9,INVALC,0xBEEF,0xBEED,0xE9CB,0xE9C8, + INVALC,0xE9C5,0xE9D8,0xBEF7,0xE9D6,0xBEF3,0xBEF2,INVALC, + 0xE9D0,INVALC,0xE9BF,0xE9C1,0xE9C3,0xE9D5,0xE9CF,0xBEEE, + INVALC,0xE9C6,INVALC,0xE9D4, + /* Range 0x6A7E - 0x6AAF, array index: 0x1D64 */ + 0xC0CF,0xED45,0xC0C8,0xECF5,INVALC,0xED41,0xC0CA,0xED48, + INVALC,0xECFC,INVALC,0xECF7,INVALC,INVALC,0xED49,0xECF3, + 0xECFE,INVALC,0xC0D1,0xED44,0xED4A,0xECFD,0xC0C9,0xED40, + 0xECF4,0xC0D0,INVALC,INVALC,0xED47,0xECF9,0xC0CC,INVALC, + 0xECFB,0xECF8,0xC0D2,0xECFA,0xC0CB,0xC0CE,0xED43,0xECF6, + 0xED46,INVALC,0xED42,INVALC,INVALC,INVALC,0xC263,0xEFE7, + 0xC268,0xC269, + /* Range 0x6AB3 - 0x6ABD, array index: 0x1D96 */ + 0xC262,0xEFE6,INVALC,0xEFE3,0xEFE4,0xC266,0xEFDE,0xEFE2, + 0xC265,INVALC,0xEFDF, + /* Range 0x6AC2 - 0x6AD3, array index: 0x1DA1 */ + 0xC267,0xC264,INVALC,0xEFDD,0xEFE1,0xEFE5,INVALC,INVALC, + INVALC,0xF251,0xF24E,0xF257,INVALC,0xF256,0xF254,0xF24F, + INVALC,0xC372, + /* Range 0x6AD9 - 0x6AE1, array index: 0x1DB3 */ + 0xF250,0xC371,0xC0CD,0xF253,0xC370,0xF258,0xF252,0xF24D, + 0xEFE0, + /* Range 0x6AE7 - 0x6AF3, array index: 0x1DBC */ + 0xF24C,0xF456,INVALC,0xF455,0xF255,0xC468,INVALC,0xF459, + 0xF45A,0xF454,0xF458,INVALC,0xF453, + /* Range 0x6AF8 - 0x6AFC, array index: 0x1DC9 */ + 0xF5D1,0xF457,0xC4E7,0xC4E5,0xF5CF, + /* Range 0x6B00 - 0x6B1A, array index: 0x1DCE */ + 0xF5D2,INVALC,0xF5CE,0xF5D0,0xC4E6,INVALC,INVALC,INVALC, + 0xF6E5,0xF6E6,0xC576,0xF6E4,INVALC,INVALC,INVALC,0xF7E2, + 0xC5CF,0xF7E0,0xF7E1,0xF8AC,INVALC,INVALC,0xC656,0xF8F3, + 0xF8F1,0xF8F2,0xF8F4, + /* Range 0x6B2F - 0x6B56, array index: 0x1DE9 */ + 0xD1F6,INVALC,0xD1F8,0xB1FD,0xD5D7,0xD1F9,INVALC,0xD5D6, + 0xD5D8,0xD5D9,0xD9DA,0xB4DB,0xD9DB,0xD9DD,0xB4DC,0xB4DA, + 0xD9DC,INVALC,0xDDFA,0xDDF8,0xDDF7,INVALC,0xDDF6,0xDDF5, + 0xB7B2,0xDDF9,0xBA70,0xE263,0xE265,0xBA71,0xE264,0xBCDB, + INVALC,0xBCDA,0xE5F0,INVALC,INVALC,0xE9DF,0xE9DE,0xE9E0, + /* Range 0x6B5B - 0x6B67, array index: 0x1E11 */ + 0xED4B,0xC0D3,INVALC,0xEFE8,0xC26A,0xF259,0xC577,0xA4EE, + 0xA5BF,0xA6B9,0xA842,0xAA5A,0xAA5B, + /* Range 0x6B76 - 0x6BB7, array index: 0x1E1E */ + 0xE6D1,0xBEFA,0xC26B,0xA4EF,INVALC,0xA6BA,INVALC,INVALC, + 0xCCEB,0xAA5C,0xCCEA,INVALC,0xCF65,0xAC6F,0xCF66,INVALC, + 0xAC70,INVALC,0xD1FC,0xAEEE,0xAEED,INVALC,0xD5DE,0xD5DC, + 0xD5DD,0xD5DB,INVALC,0xD5DA,INVALC,INVALC,0xD9DE,0xD9E1, + 0xB4DE,0xD9DF,0xB4DD,0xD9E0,INVALC,0xDDFB,INVALC,INVALC, + 0xE266,0xE267,0xE268,INVALC,0xE5F3,0xE5F2,0xBCDC,0xE5F1, + 0xE5F4,0xE9E1,INVALC,INVALC,0xE9E2,0xE9E3,INVALC,0xED4C, + 0xC0D4,0xC26C,0xF25A,INVALC,0xC4E8,0xC95F,INVALC,0xAC71, + 0xCF67,0xAEEF, + /* Range 0x6BBC - 0x6BDB, array index: 0x1E60 */ + 0xB4DF,0xD9E2,INVALC,0xB7B5,0xB7B4,INVALC,INVALC,0xE269, + 0xE26A,0xBCDD,0xBCDE,0xE9E5,0xE9E4,0xEFE9,0xF7E3,0xA4F0, + 0xC960,0xA5C0,INVALC,0xA843,0xCB48,INVALC,0xAC72,0xB7B6, + 0xA4F1,INVALC,0xCF68,0xAC73,0xCF69,INVALC,0xC0D5,0xA4F2, + /* Range 0x6BE0 - 0x6C38, array index: 0x1E80 */ + 0xCF6A,INVALC,0xD242,0xD241,0xD1FE,INVALC,0xD1FD,0xD243, + 0xD240,INVALC,INVALC,0xB240,0xB241,INVALC,INVALC,0xB4E0, + 0xD9E3,INVALC,0xD9E4,0xD9E5,INVALC,INVALC,INVALC,0xDE41, + 0xDE42,0xDE40,INVALC,0xDDFD,0xDDFE,0xB7B7,0xE26B,0xE5F7, + 0xE5F6,0xE5F5,0xE5F8,0xE9E7,0xE9E6,0xBEFB,0xE9E8,INVALC, + 0xC0D6,0xED4D,INVALC,0xEFEA,0xF25B,0xF6E7,INVALC,0xA4F3, + 0xA5C2,0xA5C1,INVALC,0xAA5D,0xC961,0xC97E,0xA6BB,INVALC, + 0xC9F7,0xCB49,0xCB4A,0xAA5E,INVALC,0xCCED,INVALC,0xAC74, + 0xCF6B,0xCF6C,INVALC,0xAEF0,0xAEF4,0xD244,0xAEF3,0xAEF1, + 0xAEF2,INVALC,0xD5DF,0xB242,0xB4E3,INVALC,0xB4E1,0xB4E2, + 0xD9E6,INVALC,INVALC,0xBA72,0xA4F4,INVALC,0xC9A1,INVALC, + 0xA5C3, + /* Range 0x6C3E - 0x6C43, array index: 0x1ED9 */ + 0xA5C6,0xC9A3,0xA5C5,0xA5C4,0xA844,0xC9A2, + /* Range 0x6C4A - 0x6C9D, array index: 0x1EDF */ + 0xC9FC,0xC9FE,0xCA40,0xA6C5,0xA6C6,0xC9FB,0xA6C1,INVALC, + 0xC9F9,INVALC,0xC9FD,0xA6C2,INVALC,0xA6BD,INVALC,0xA6BE, + INVALC,0xA6C4,0xC9FA,0xA6BC,0xA845,0xA6BF,0xA6C0,0xA6C3, + INVALC,INVALC,INVALC,0xCB5B,0xCB59,0xCB4C,0xA851,0xCB53, + 0xA84C,0xCB4D,INVALC,0xCB55,INVALC,0xCB52,0xA84F,0xCB51, + 0xA856,0xCB5A,0xA858,INVALC,0xA85A,INVALC,0xCB4B,INVALC, + 0xA84D,0xCB5C,INVALC,0xA854,0xA857,INVALC,0xCD45,0xA847, + 0xA85E,0xA855,0xCB4E,0xA84A,0xA859,0xCB56,0xA848,0xA849, + 0xCD43,0xCB4F,0xA850,0xA85B,0xCB5D,0xCB50,0xA84E,INVALC, + 0xA853,0xCCEE,0xA85C,0xCB57,0xA852,INVALC,0xA85D,0xA846, + 0xCB54,0xA84B,0xCB58,0xCD44, + /* Range 0x6CAB - 0x6CF5, array index: 0x1F33 */ + 0xAA6A,0xAA7A,0xCCF5,0xAA71,INVALC,0xCD4B,0xAA62,INVALC, + 0xAA65,0xCD42,INVALC,0xCCF3,0xCCF7,0xAA6D,0xAA6F,0xCCFA, + 0xAA76,0xAA68,0xAA66,0xAA67,0xAA75,0xCD47,0xAA70,0xCCF9, + 0xCCFB,0xAA6E,0xAA73,0xCCFC,0xCD4A,INVALC,0xAC75,0xAA79, + INVALC,0xAA63,0xCD49,INVALC,0xCD4D,0xCCF8,0xCD4F,0xCD40, + 0xAA6C,0xCCF4,0xAA6B,0xAA7D,0xAA72,INVALC,0xCCF2,0xCF75, + 0xAA78,0xAA7C,0xCD41,0xCD46,INVALC,0xAA7E,0xAA77,0xAA69, + 0xAA5F,INVALC,0xAA64,INVALC,0xCCF6,0xAA60,0xCD4E,INVALC, + 0xCCF0,0xCCEF,0xCCFD,0xCCF1,0xAA7B,0xAEF5,0xAA74,0xCCFE, + 0xAA61,INVALC,0xACA6, + /* Range 0x6D00 - 0x6D22, array index: 0x1F7E */ + 0xCF7C,0xCFA1,INVALC,0xCFA4,0xCF77,INVALC,INVALC,0xCFA7, + 0xCFAA,0xCFAC,0xCF74,0xAC76,0xAC7B,0xD249,0xACAD,0xCFA5, + 0xCFAD,0xCF7B,0xCF73,INVALC,INVALC,INVALC,0xD264,0xAC7E, + 0xCFA2,0xCF78,0xCF7A,0xACA5,INVALC,0xCF7D,0xAC7D,0xCF70, + 0xCFA8,INVALC,0xCFAB, + /* Range 0x6D25 - 0x6D42, array index: 0x1FA1 */ + 0xAC7A,INVALC,0xACA8,0xCF6D,0xACAA,0xAC78,0xACAE,0xCFA9, + 0xCF6F,0xACAB,0xD25E,0xCD48,0xAC7C,0xAC77,0xCF76,0xCF6E, + 0xACAC,0xACA4,0xCFA3,0xACA9,0xACA7,0xCF79,0xACA1,0xCF71, + 0xACA2,0xACA3,0xCF72,0xCFA6,0xAC79,0xCF7E, + /* Range 0x6D58 - 0x6D98, array index: 0x1FBF */ + 0xD24C,0xAEFD,0xAF43,INVALC,INVALC,INVALC,0xD255,0xD25B, + 0xD257,0xD24A,0xD24D,0xD246,0xD247,0xAF4A,0xAEFA,0xD256, + 0xD25F,0xAF45,0xAEF6,INVALC,0xAF40,0xD24E,0xAF42,0xD24F, + 0xD259,INVALC,INVALC,INVALC,0xAF44,0xD268,0xD248,0xAEFC, + 0xAEFB,0xAF48,0xD245,0xD266,0xD25A,0xD267,0xD261,0xD253, + 0xD262,INVALC,0xD25C,0xD265,0xD263,0xAF49,0xD254,0xAEF9, + 0xAEF8,0xAF41,0xAF47,0xD260,0xAF46,0xD251,0xB243,INVALC, + 0xD269,0xD250,0xD24B,0xAEFE,0xAF4B,0xAEF7,INVALC,0xD258, + 0xD25D, + /* Range 0x6DAA - 0x6DFD, array index: 0x2000 */ + 0xB265,0xD5E1,0xD5E5,INVALC,0xB252,0xB250,INVALC,INVALC, + 0xB247,0xD5E3,0xD5E2,0xB25B,INVALC,0xD5E8,0xB255,INVALC, + 0xD5FA,0xD647,0xB244,0xD5F7,0xD5F0,0xB267,0xD5E0,INVALC, + 0xD5FC,INVALC,0xB264,0xB258,0xB263,0xB24E,0xD5EC,0xD5FE, + 0xD5F6,0xB24F,0xB249,0xD645,INVALC,0xD5FD,0xD640,0xB251, + 0xB259,0xD642,0xD5EA,0xD5FB,0xD5EF,0xD644,0xB25E,0xB246, + 0xB25C,0xD5F4,0xD5F2,0xD5F3,0xB253,0xD5EE,0xD5ED,0xB248, + 0xD5E7,0xD646,0xB24A,0xD5F1,0xB268,INVALC,0xB262,0xD5E6, + 0xB25F,0xB25D,0xB266,0xD5F8,0xB261,0xD252,0xD5F9,0xB260, + 0xD641,0xB245,0xD5F5,0xB257,0xD5E9,0xB256,INVALC,0xB254, + 0xB24C,0xB24B,0xD9E7,0xD643, + /* Range 0x6E19 - 0x6E79, array index: 0x2054 */ + 0xB541,0xB25A,0xB4EE,0xD9F6,0xB4FC,INVALC,0xD9EA,0xB4EB, + 0xB4E7,0xDA49,0xB4ED,0xB4F1,0xB4EC,0xB4F5,0xDA4D,0xDA44, + INVALC,INVALC,0xD9F1,0xB4FA,0xB4F4,0xD9FD,0xB4E4,0xDA4A, + 0xDA43,0xB4E8,0xD9F7,0xB4F7,0xDA55,0xDA56,INVALC,0xB4E5, + 0xDA48,0xB4F9,0xD9FB,0xD9ED,0xD9EE,0xB4FD,0xD9F2,0xD9F9, + 0xD9F3,INVALC,0xB4FB,0xB544,0xD9EF,0xD9E8,0xD9E9,INVALC, + 0xD9EB,0xB4EA,0xD9F8,INVALC,0xB4F8,0xB542,INVALC,INVALC, + 0xD9FA,0xDA53,0xDA4B,0xB4E6,0xDA51,0xB4F2,INVALC,0xB4F0, + INVALC,0xDA57,0xB4EF,0xDA41,0xD9F4,0xD9FE,0xB547,0xDA45, + 0xDA42,0xD9F0,0xB543,0xDA4F,0xDA4C,0xDA54,0xB4E9,0xDA40, + 0xB546,INVALC,0xDA47,INVALC,INVALC,0xB4F3,0xB4F6,INVALC, + 0xDA46,0xB545,0xD9F5,0xD5E4,INVALC,INVALC,0xDA50,0xDA4E, + 0xDA52, + /* Range 0x6E8D - 0x6ED8, array index: 0x20B5 */ + 0xDE61,0xDE60,0xDE46,0xB7BD,INVALC,0xDE5F,0xDE49,0xDE4A, + INVALC,0xB7C7,0xDE68,0xB7C2,0xDE5E,INVALC,0xDE43,0xB7C8, + 0xB7BE,0xDE52,0xDE48,0xDE4B,0xDE63,0xB7B8,0xDE6A,0xDE62, + 0xB7C1,0xDE57,0xB7CC,INVALC,INVALC,0xB7CB,0xB7C5,INVALC, + INVALC,0xDE69,0xB7B9,0xDE55,0xDE4C,0xDE59,0xDE65,0xB7CD, + INVALC,0xB7BB,0xDE54,INVALC,0xDE4D,0xB7C4,INVALC,0xB7C3, + 0xDE50,0xDE5A,0xDE64,0xDE47,0xDE51,0xB7BC,0xDE5B,0xB7C9, + 0xB7C0,0xDE4E,0xB7BF,0xDE45,0xDE53,0xDE67,0xB4FE,0xBAB0, + 0xDE56,0xE26C,0xDE58,0xDE66,0xB7C6,0xDE4F,0xB7BA,0xB7CA, + 0xBCF0,0xDE44,INVALC,0xDE5D, + /* Range 0x6EEB - 0x6F43, array index: 0x2101 */ + 0xE2AA,0xBAAD,0xE27D,0xE2A4,0xBAA2,INVALC,0xE26E,0xBAAF, + INVALC,0xBA77,0xE26D,0xE2B0,0xBAB1,0xE271,0xE2A3,INVALC, + 0xE273,0xE2B3,0xE2AF,0xBA75,0xBAA1,0xE653,0xBAAE,0xBA7D, + 0xE26F,INVALC,0xE2AE,0xBAA3,0xE2AB,0xE2B8,0xE275,0xE27E, + INVALC,INVALC,0xE2B6,0xE2AC,0xBA7C,INVALC,INVALC,0xE27C, + 0xBA76,0xBA74,0xBAA8,INVALC,INVALC,0xE27A,0xE277,0xE278, + INVALC,0xE2B2,INVALC,0xE2B7,0xE2B5,0xBA7A,0xE2B9,0xBA7E, + 0xBAA7,INVALC,0xE270,0xE5FA,0xE279,INVALC,0xBA78,0xBAAC, + 0xBAA9,0xBA7B,0xE2A5,0xE274,0xBAAA,0xE2A7,0xBAA4,0xBAA6, + 0xBA73,INVALC,0xE2A9,0xE2A1,0xE272,0xBAA5,0xE2B1,0xE2B4, + 0xE27B,0xE2A8,INVALC,0xBA79,0xBCDF,0xE2A6,0xE5F9,INVALC, + 0xE2AD, + /* Range 0x6F4E - 0x6F97, array index: 0x215A */ + 0xE276,0xE644,0xE64E,0xBCE2,0xE64D,0xE659,0xBCE4,0xE64B, + INVALC,0xE64F,0xBCEF,INVALC,0xE646,0xBCE7,INVALC,0xE652, + 0xE9F0,0xBCF3,0xBCF2,0xE654,0xE643,0xE65E,0xBCED,INVALC, + 0xBCE3,0xE657,INVALC,0xE65B,0xE660,0xE655,0xE649,0xBCE6, + 0xBCE9,0xBCF1,0xBCEC,INVALC,0xE64C,0xE2A2,INVALC,INVALC, + 0xE648,0xE65F,0xBCE8,INVALC,0xBCEB,0xE661,0xBCE0,0xE656, + 0xE5FB,0xE65C,0xC0DF,INVALC,0xE64A,INVALC,0xBCE1,0xE645, + 0xBCE5,0xE5FC,0xBAAB,0xE641,INVALC,0xE65A,0xE642,0xE640, + 0xBCEA,INVALC,0xE658,INVALC,0xE5FE,0xE651,0xE650,0xE65D, + 0xE647,0xBCEE, + /* Range 0x6F9E - 0x6FCF, array index: 0x21A4 */ + 0xE9F3,INVALC,0xBF49,0xBEFE,0xEA40,0xE9EB,0xBF41,0xE9F7, + 0xBF48,0xBF43,0xE9F5,0xED4F,0xE9FB,0xEA42,0xE9FA,0xE9E9, + 0xE9F8,0xEA44,0xEA46,0xBEFD,0xEA45,0xBF44,0xBF4A,INVALC, + 0xBF47,INVALC,0xE9FE,0xBF46,0xE9F9,INVALC,0xE9ED,0xE9F2, + INVALC,0xE9FD,0xBF45,0xBF42,0xBEFC,0xBF40,0xE9F1,INVALC, + 0xE5FD,0xE9EC,0xE9EF,0xEA41,0xE9F4,0xE9EA,0xED4E,0xEA43, + 0xE9EE,0xE9FC, + /* Range 0x6FDB - 0x6FF4, array index: 0x21D6 */ + 0xC0DB,0xED53,0xED59,0xED57,0xC0D9,0xC0DA,0xC0E1,0xED5A, + 0xED52,0xC0DC,INVALC,0xED56,0xED55,0xED5B,0xC0E2,INVALC, + 0xC0DD,0xC0E0,0xED54,0xC0E4,0xC0DE,0xC0E5,0xC0D8,0xED58, + INVALC,0xED50, + /* Range 0x6FFA - 0x704C, array index: 0x21F0 */ + 0xC271,0xEFF4,0xEFF6,INVALC,0xC26F,0xEFF2,0xEFF3,0xEFEE, + INVALC,INVALC,0xE9F6,0xEFEF,0xC270,0xEFEB,INVALC,0xC26D, + 0xEFF8,0xC26E,0xEFEC,0xEFED,0xEFF1,0xC273,INVALC,0xC272, + INVALC,INVALC,0xEFF0,0xC378,0xF25F,0xF265,0xC379,0xF25C, + 0xC376,0xC373,0xF267,0xC377,INVALC,0xC374,0xF25E,0xF261, + 0xF262,0xF263,0xF266,INVALC,0xEFF5,0xF25D,0xC375,0xF264, + 0xF268,0xF260,INVALC,INVALC,INVALC,0xF45D,0xC46A,0xF460, + 0xC46B,0xF468,0xF45F,0xF45C,INVALC,0xF45E,0xF462,0xF465, + 0xF464,0xF467,0xF45B,INVALC,0xC469,0xF463,0xF466,0xF469, + 0xF461,0xF5D3,0xF5D4,0xF5D8,0xF5D9,INVALC,0xF5D6,0xF5D7, + 0xF5D5,INVALC,0xC4E9, + /* Range 0x7051 - 0x706B, array index: 0x2243 */ + 0xC578,0xF6EB,INVALC,INVALC,0xF6E8,0xF6E9,0xF6EA,0xC579, + INVALC,0xF7E5,0xF7E4,INVALC,0xF8AF,0xC5F4,0xF8AD,0xF8B0, + 0xF8AE,0xF8F5,0xC657,0xC665,0xF9A3,0xF96C,INVALC,0xF9A2, + 0xF9D0,0xF9D1,0xA4F5, + /* Range 0x7082 - 0x7086, array index: 0x225E */ + 0xCD58,0xCD5A,0xCD55,0xCD52,0xCD54, + /* Range 0x7091 - 0x709A, array index: 0x2263 */ + 0xCD56,0xAAA3,0xCD53,0xCD50,0xAAA1,0xCD57,INVALC,0xCD51, + 0xAAA5,0xCD59, + /* Range 0x70A9 - 0x70BA, array index: 0x226D */ + 0xCFB6,INVALC,0xACAF,0xACB2,0xACB4,0xACB6,0xACB3,0xCFB2, + 0xCFB1,INVALC,0xACB1,0xCFB4,0xCFB5,INVALC,0xCFAE,0xACB5, + INVALC,0xACB0, + /* Range 0x70C5 - 0x70E4, array index: 0x227F */ + 0xD277,0xD278,0xD279,0xAF50,INVALC,0xAF4C,0xD26E,INVALC, + 0xD276,0xD27B,0xAF51,INVALC,0xD26C,0xD272,0xD26B,0xD275, + INVALC,INVALC,0xD271,0xAF4D,0xAF4F,0xD27A,INVALC,0xD26A, + 0xD26D,0xD273,INVALC,0xD274,0xD27C,0xD270,INVALC,0xAF4E, + /* Range 0x70F3 - 0x7110, array index: 0x229F */ + 0xD650,0xD64C,INVALC,0xD658,0xD64A,0xD657,0xB269,0xD648, + 0xDA5B,0xD652,0xB26C,INVALC,0xD653,0xD656,INVALC,0xD65A, + INVALC,0xD64F,INVALC,0xD654,INVALC,INVALC,0xB26A,0xB26B, + 0xD659,0xD64D,0xD649,0xD65B,INVALC,0xD651, + /* Range 0x7117 - 0x7128, array index: 0x22BD */ + 0xD64B,INVALC,0xB548,0xB549,0xDA65,0xB54F,INVALC,0xDA59, + 0xDA62,0xDA58,0xB54C,0xDA60,0xDA5E,INVALC,0xDA5F,0xB54A, + INVALC,0xDA63, + /* Range 0x712E - 0x7132, array index: 0x22CF */ + 0xDA5C,0xDA5A,0xB54B,0xDA5D,0xDA61, + /* Range 0x7141 - 0x7172, array index: 0x22D4 */ + 0xDE70,0xDE77,0xDE79,0xDEA1,INVALC,0xB7DA,0xDE6B,INVALC, + 0xB7D2,INVALC,0xDE7A,0xB7D7,0xDEA2,0xB7CE,INVALC,0xDE7D, + INVALC,0xDE6D,0xDE7E,0xDE6C,INVALC,0xB7DC,INVALC,0xDE78, + 0xB7CF,0xDEA3,INVALC,0xB7D4,0xDE71,0xB7D9,0xDE7C,0xDE6F, + 0xDE76,0xDE72,0xDE6E,0xB7D1,0xB7D8,0xB7D6,0xB7D3,0xB7DB, + 0xB7D0,0xDE75,INVALC,0xB7D5,INVALC,0xB54E,INVALC,0xDE7B, + INVALC,0xDE73, + /* Range 0x7180 - 0x718A, array index: 0x2306 */ + 0xE2BD,0xE2C3,0xE2BF,INVALC,0xBAB6,0xE2BE,0xE2C2,0xE2BA, + INVALC,0xE2BC,0xBAB5, + /* Range 0x7197 - 0x71F4, array index: 0x2311 */ + 0xE2C4,INVALC,0xBAB3,0xE667,0xE664,0xE670,0xE66A,0xE66C, + 0xBCF4,0xE666,0xE66E,INVALC,INVALC,0xE66D,0xE66B,INVALC, + 0xE671,0xBCF7,0xE668,0xE66F,INVALC,0xBCF5,INVALC,INVALC, + 0xE663,0xE665,0xBCF6,0xE662,0xE672,INVALC,0xE669,INVALC, + INVALC,0xEA4A,0xBF51,INVALC,INVALC,0xEA55,0xEA53,0xBF4B, + 0xEA49,0xEA4C,0xEA4D,0xEA48,0xBF55,0xBF56,0xEA47,0xEA56, + 0xEA51,0xBF4F,0xBF4C,0xEA50,0xEA4E,INVALC,INVALC,0xBF52, + 0xEA52,0xBF4D,INVALC,0xBF4E,INVALC,0xEA4F,0xBF50,0xEA4B, + INVALC,0xEA54,0xBF53,0xEA57,0xEA58,0xBF54,INVALC,INVALC, + 0xC0E7,0xC0EE,0xED5C,0xED62,INVALC,0xED60,0xC0EA,0xC0E9, + 0xC0E6,0xED5E,INVALC,INVALC,INVALC,0xC0EC,0xC0EB,0xC0E8, + INVALC,0xED61,0xED5D,0xED5F,INVALC,0xC0ED, + /* Range 0x71F8 - 0x7207, array index: 0x236F */ + 0xC277,0xEFFB,INVALC,0xC274,0xC275,0xEFFD,0xC276,0xEFFA, + INVALC,0xEFF9,0xF26C,0xEFFC,INVALC,0xF26D,0xC37A,0xF26B, + /* Range 0x7219 - 0x722D, array index: 0x237F */ + 0xF5DC,0xF5DB,0xC4EA,INVALC,0xF5DA,0xF6EC,0xF6ED,INVALC, + INVALC,0xF7E6,0xF8B1,INVALC,INVALC,0xF8F6,0xF9BC,0xC679, + 0xF9C6,0xA4F6,INVALC,0xAAA6,0xAAA7, + /* Range 0x7235 - 0x724C, array index: 0x2394 */ + 0xC0EF,0xA4F7,INVALC,0xAAA8,0xAF52,0xB7DD,0xA4F8,INVALC, + 0xB26E,0xBAB8,0xC962,INVALC,0xCFB7,0xD27D,INVALC,0xE2C5, + INVALC,0xC0F0,0xA4F9,0xAAA9,0xCFB8,0xCFB9,0xDA66,0xB550, + /* Range 0x7256 - 0x7263, array index: 0x23AC */ + 0xBCF8,INVALC,0xC37C,0xA4FA,0xDA67,0xA4FB,INVALC,0xA6C9, + 0xCA42,0xA6C8,0xA865,0xA864,0xA863,0xCB60, + /* Range 0x726C - 0x72B0, array index: 0x23BA */ + 0xCFBA,INVALC,0xCFBD,0xACBA,0xCFBB,INVALC,0xACB9,0xCFBC, + 0xACBB,INVALC,0xD2A2,0xD2A1,0xD27E,0xAF53,INVALC,0xD65D, + 0xD65E,0xB26F,0xD65C,0xD65F,0xB552,0xB270,INVALC,INVALC, + 0xB551,0xDA6B,0xDA6A,INVALC,0xDA68,0xDA69,INVALC,0xDA6C, + 0xDEA6,0xDEA5,0xDEA9,INVALC,0xDEA8,0xDEA7,0xBAB9,0xE2C9, + INVALC,0xE2C8,0xBABA,0xE2C7,0xE673,INVALC,0xE674,0xBCF9, + INVALC,0xEA59,0xEA5A,INVALC,INVALC,0xF272,0xC37D,0xF271, + 0xF270,0xF26E,0xF26F,0xC4EB,0xF46C,0xF6EE,0xF8F7,INVALC, + 0xA4FC,INVALC,0xC9A5,0xA5C7,0xC9A6, + /* Range 0x72BD - 0x72EB, array index: 0x23FF */ + 0xCB62,INVALC,0xCB61,0xAAAC,0xCB65,0xA867,0xCB63,0xA866, + 0xCB67,0xCB64,INVALC,INVALC,0xCD5F,0xCFBE,0xCD5D,0xCD64, + INVALC,0xAAAD,INVALC,0xAAB0,0xCD65,0xCD61,INVALC,0xCD62, + INVALC,0xCD5C,0xAAAF,0xCD5E,0xAAAE,0xCD63,INVALC,0xCD60, + INVALC,INVALC,0xCFC2,0xACBD,0xACBE,INVALC,0xCFC5,0xCFBF, + INVALC,0xCFC4,INVALC,0xCFC0,0xACBC,0xCFC3,0xCFC1, + /* Range 0x72F3 - 0x7301, array index: 0x242E */ + 0xD2A8,0xD2A5,INVALC,0xD2A7,0xAF58,0xAF57,0xAF55,0xD2A4, + 0xD2A9,0xAF54,0xAF56,0xD2A6,0xD667,0xD2A3,0xD2AA, + /* Range 0x7307 - 0x730C, array index: 0x243D */ + 0xD662,0xD666,INVALC,0xD665,0xDA6E,0xDA79, + /* Range 0x730F - 0x731E, array index: 0x2443 */ + 0xD668,INVALC,0xD663,0xDA6D,0xB274,INVALC,INVALC,0xB273, + 0xD661,0xD664,0xB275,INVALC,0xB272,0xB271,0xD660,0xD669, + /* Range 0x7322 - 0x7329, array index: 0x2453 */ + 0xDA70,0xDA77,INVALC,0xB554,0xDA76,0xDA73,INVALC,0xB556, + /* Range 0x7330 - 0x7345, array index: 0x245B */ + 0xDA6F,0xDA71,0xDA74,0xDA72,0xB555,0xDA78,0xB553,0xB7DF, + INVALC,INVALC,0xDEAD,0xDEAC,0xDEAA,INVALC,0xB7E2,0xB7E1, + 0xDEAE,INVALC,0xDEAB,0xE2CA,0xBABB,0xB7E0, + /* Range 0x7349 - 0x7352, array index: 0x2471 */ + 0xDEB0,0xDEAF,INVALC,0xE2CD,0xE2CB,0xBCFA,INVALC,0xBABC, + 0xE2CC,0xE676, + /* Range 0x7357 - 0x738B, array index: 0x247B */ + 0xBCFB,0xE675,0xE67E,0xE67D,0xE67B,INVALC,0xE67A,0xE677, + 0xE678,0xE679,0xE67C,0xE6A1,INVALC,INVALC,0xEA5F,0xEA5C, + 0xEA5D,0xBF57,0xEA5B,0xEA61,0xEA60,0xEA5E,INVALC,0xED64, + 0xED65,0xC0F1,INVALC,0xC0F2,0xED63,INVALC,0xC279,0xEFFE, + 0xC278,0xC37E,INVALC,0xC3A1,0xC46D,0xF46E,0xF46D,0xF5DD, + 0xF6EF,0xC57A,0xF7E8,0xF7E7,0xF7E9,0xA5C8,0xCFC6,0xAF59, + 0xB276,0xD66A,0xA5C9,0xC9A7,0xA4FD, + /* Range 0x7392 - 0x7397, array index: 0x24B0 */ + 0xCB6C,0xCB6A,0xCB6B,0xCB68,0xA868,0xCB69, + /* Range 0x739D - 0x73AD, array index: 0x24B6 */ + 0xCD6D,INVALC,0xAAB3,0xCD6B,0xCD67,0xCD6A,INVALC,0xCD66, + 0xAAB5,0xCD69,INVALC,0xAAB2,0xAAB1,INVALC,0xAAB4,0xCD6C, + 0xCD68, + /* Range 0x73B2 - 0x73CD, array index: 0x24C7 */ + 0xACC2,0xACC5,0xCFCE,0xCFCD,0xCFCC,0xACBF,0xCFD5,0xCFCB, + INVALC,0xACC1,0xD2AF,INVALC,0xCFD2,0xCFD0,0xACC4,INVALC, + 0xCFC8,0xCFD3,INVALC,0xCFCA,0xCFD4,0xCFD1,0xCFC9,INVALC, + 0xACC0,0xCFD6,0xCFC7,0xACC3, + /* Range 0x73D2 - 0x73E0, array index: 0x24E3 */ + 0xD2B4,0xD2AB,0xD2B6,INVALC,0xD2AE,0xD2B9,0xD2BA,0xD2AC, + 0xD2B8,0xD2B5,0xD2B3,0xD2B7,0xAF5F,INVALC,0xAF5D, + /* Range 0x73E5 - 0x73EE, array index: 0x24F2 */ + 0xD2AD,INVALC,0xD2B0,0xD2BB,0xD2B2,0xAF5E,0xCFCF,INVALC, + 0xAF5A,0xAF5C, + /* Range 0x73F4 - 0x740D, array index: 0x24FC */ + 0xD678,0xD66D,0xD66B,INVALC,0xD66C,INVALC,0xD673,INVALC, + 0xD674,0xD670,0xB27B,0xD675,0xD672,0xD66F,INVALC,0xB279, + 0xD66E,0xB277,0xB27A,0xD671,0xD679,0xAF5B,0xB278,0xD677, + 0xD676,0xB27C, + /* Range 0x7420 - 0x7436, array index: 0x2516 */ + 0xDAA9,0xDAA2,0xB55A,0xDAA6,0xDAA5,0xB55B,0xB561,INVALC, + 0xB562,0xDAA8,0xB558,0xDA7D,0xDA7B,0xDAA3,0xDA7A,0xB55F, + 0xDA7C,0xDAA4,0xDAAA,0xB559,0xB55E,0xB55C,0xB55D, + /* Range 0x743F - 0x7446, array index: 0x252D */ + 0xB7E9,0xDEB7,0xB7E8,0xDEBB,INVALC,0xDEB1,INVALC,0xDEBC, + /* Range 0x744A - 0x7464, array index: 0x2535 */ + 0xDEB2,0xDEB3,INVALC,0xDEBD,0xDEBA,0xDEB8,0xDEB9,0xDEB5, + 0xDEB4,INVALC,0xDEBE,0xB7E5,INVALC,0xDEB6,INVALC,0xB7EA, + 0xB7E4,0xB7EB,0xB7EC,INVALC,0xB7E7,0xB7E6,INVALC,INVALC, + 0xE2CE,0xBABE,0xBABD, + /* Range 0x7469 - 0x7475, array index: 0x2550 */ + 0xBCFC,0xBABF,INVALC,INVALC,0xBAC1,0xE2D4,0xB7E3,0xBAC0, + 0xE2D0,0xE2D2,0xE2CF,INVALC,0xE2D1, + /* Range 0x747C - 0x748B, array index: 0x255D */ + 0xE6AA,0xE6A7,0xBD40,0xEA62,0xBD41,0xE6A6,INVALC,0xBCFE, + INVALC,0xE6A8,0xE6A5,0xE6A2,0xE6A9,0xE6A3,0xE6A4,0xBCFD, + /* Range 0x7494 - 0x74C5, array index: 0x256D */ + 0xEA65,0xEA67,INVALC,0xED66,0xBF5A,INVALC,0xEA63,INVALC, + 0xBF58,INVALC,0xBF5C,0xBF5B,0xEA64,0xEA68,INVALC,0xBF59, + INVALC,0xED6D,0xC0F5,0xC27A,0xC0F6,0xC0F3,0xED6A,0xED68, + INVALC,0xED6B,INVALC,0xED6E,0xC0F4,0xED6C,0xED67,INVALC, + INVALC,0xF042,0xF045,0xF275,0xF040,INVALC,0xF46F,0xF046, + INVALC,0xC3A2,0xF044,0xC27B,0xF041,0xF043,0xF047,0xF276, + INVALC,0xF274, + /* Range 0x74D4 - 0x74E9, array index: 0x259F */ + 0xC4ED,0xF6F1,0xC4EC,0xF6F3,0xF6F0,0xF6F2,0xC5D0,0xF8B2, + 0xA5CA,0xCD6E,0xD2BC,0xD2BD,0xB27D,0xDEBF,0xBF5D,0xC3A4, + 0xC57B,0xF8B3,0xA5CB,INVALC,0xCD6F,0xA260, + /* Range 0x74F4 - 0x74F7, array index: 0x25B5 */ + 0xD2BE,0xD2BF,0xB27E,0xB2A1, + /* Range 0x74FB - 0x7540, array index: 0x25B9 */ + 0xDAAB,INVALC,0xDEC2,0xDEC1,0xDEC0,0xE2D5,INVALC,0xE2D6, + 0xE2D7,0xBAC2,INVALC,INVALC,0xE6AD,0xE6AC,INVALC,INVALC, + 0xEA69,0xBF5E,0xBF5F,INVALC,0xED72,0xED6F,0xED70,0xED71, + 0xF049,0xF048,0xC27C,0xF277,0xF5DE,0xA5CC,INVALC,0xACC6, + INVALC,0xB2A2,0xDEC3,INVALC,0xA5CD,INVALC,0xD2C0,0xB2A3, + INVALC,INVALC,0xB563,0xB564,INVALC,0xA5CE,0xA5CF,0xCA46, + 0xA86A,0xA869,0xACC7,0xCFD9,0xDAAC,0xA5D0,0xA5D1,0xA5D2, + 0xA5D3,INVALC,INVALC,INVALC,0xA86B,0xA86C,0xCB6E,0xCB6D, + INVALC,INVALC,0xAAB6,0xCD72,0xCD70,0xCD71, + /* Range 0x754B - 0x754F, array index: 0x25FF */ + 0xACCB,0xACC9,INVALC,0xACCA,0xACC8, + /* Range 0x7559 - 0x7570, array index: 0x2604 */ + 0xAF64,0xAF63,0xD2C1,0xAF62,0xAF61,INVALC,0xD2C2,INVALC, + INVALC,0xB2A6,0xD67B,0xD67A,0xB2A4,0xB2A5,INVALC,INVALC, + INVALC,0xB566,0xB565,0xDAAE,INVALC,INVALC,0xDAAD,0xB2A7, + /* Range 0x7576 - 0x7580, array index: 0x261C */ + 0xB7ED,0xDEC5,0xB7EE,0xDEC4,INVALC,INVALC,INVALC,0xE2D8, + 0xE6AE,0xBD42,0xEA6A, + /* Range 0x7586 - 0x759A, array index: 0x2627 */ + 0xC3A6,0xC3A5,INVALC,INVALC,0xC57C,0xA5D4,0xCD73,INVALC, + INVALC,0xB2A8,0xE2D9,0xBAC3,INVALC,INVALC,0xCB6F,0xCB70, + INVALC,INVALC,0xCD74,0xAAB8,0xAAB9, + /* Range 0x75A2 - 0x75AB, array index: 0x263C */ + 0xACCF,0xACD0,0xACCD,0xACCE,INVALC,0xCFDC,INVALC,INVALC, + 0xCFDD,0xACCC, + /* Range 0x75B2 - 0x75E7, array index: 0x2646 */ + 0xAF68,0xAF69,INVALC,0xB2AB,0xD2C9,INVALC,0xAF6E,0xAF6C, + 0xD2CA,0xD2C5,0xAF6B,0xAF6A,0xAF65,0xD2C8,0xD2C7,0xD2C4, + 0xAF6D,INVALC,0xD2C6,0xAF66,INVALC,0xAF67,INVALC,INVALC, + 0xB2AC,0xD6A1,0xD6A2,0xB2AD,0xD67C,0xD67E,0xD6A4,0xD6A3, + 0xD67D,INVALC,0xB2A9,0xB2AA,INVALC,0xDAB6,0xB56B,0xB56A, + 0xDAB0,0xB568,INVALC,0xDAB3,0xB56C,0xDAB4,0xB56D,0xDAB1, + 0xB567,0xB569,0xDAB5,INVALC,0xDAB2,0xDAAF, + /* Range 0x75ED - 0x7603, array index: 0x267C */ + 0xDED2,INVALC,0xDEC7,0xB7F0,0xB7F3,0xB7F2,0xB7F7,0xB7F6, + 0xDED3,0xDED1,0xDECA,0xDECE,0xDECD,0xB7F4,0xDED0,0xDECC, + 0xDED4,0xDECB,0xB7F5,0xB7EF,0xB7F1,INVALC,0xDEC9, + /* Range 0x7608 - 0x7629, array index: 0x2693 */ + 0xE2DB,0xBAC7,0xE2DF,0xBAC6,0xE2DC,0xBAC5,INVALC,0xDEC8, + 0xDECF,0xE2DE,INVALC,0xBAC8,0xE2E0,0xE2DD,0xE2DA,INVALC, + INVALC,0xE6B1,0xE6B5,0xE6B7,0xE6B3,0xE6B2,0xE6B0,0xBD45, + 0xBD43,0xBD48,0xBD49,0xE6B4,0xBD46,0xE6AF,0xBD47,0xBAC4, + 0xE6B6,0xBD44, + /* Range 0x762D - 0x7635, array index: 0x26B5 */ + 0xEA6C,INVALC,0xEA6B,0xEA73,0xEA6D,0xEA72,0xEA6F,0xBF60, + 0xEA71, + /* Range 0x7642 - 0x7649, array index: 0x26BE */ + 0xC0F8,0xED74,INVALC,INVALC,0xC0F7,0xED77,0xED75,0xED76, + /* Range 0x7652 - 0x7665, array index: 0x26C6 */ + 0xC2A1,0xF04E,INVALC,INVALC,0xC27D,0xF04F,0xC27E,0xF04C, + 0xF050,INVALC,0xF04A,INVALC,INVALC,0xC3A7,0xF278,0xC3A8, + 0xC46F,INVALC,0xF04B,0xC470, + /* Range 0x7669 - 0x7672, array index: 0x26DA */ + 0xC4EE,0xF5DF,INVALC,0xC57E,0xF6F4,0xC57D,INVALC,0xF7EA, + 0xC5F5,0xC5F6, + /* Range 0x7678 - 0x769E, array index: 0x26E4 */ + 0xACD1,0xCFDE,INVALC,0xB56E,0xB56F,0xA5D5,0xA6CA,0xCA47, + INVALC,0xCB71,0xA86D,INVALC,0xAABA,INVALC,0xACD2,0xACD3, + 0xACD4,0xD6A6,0xD2CB,0xAF6F,INVALC,INVALC,0xB2AE,0xD6A5, + INVALC,INVALC,0xDAB8,0xB571,INVALC,0xDAB7,0xB570,INVALC, + INVALC,0xDED5,0xBD4A,0xE6BB,0xE6B8,0xE6B9,0xE6BA, + /* Range 0x76AA - 0x76B0, array index: 0x270B */ + 0xF471,0xF470,INVALC,0xF6F5,0xA5D6,0xCD75,0xAF70, + /* Range 0x76BA - 0x76D4, array index: 0x2712 */ + 0xBD4B,0xEA74,INVALC,0xF052,0xF472,0xA5D7,INVALC,INVALC, + 0xAABB,0xACD7,0xCFDF,0xACD8,0xACD6,INVALC,0xACD5,0xD2CC, + 0xAF71,INVALC,INVALC,0xAF72,0xAF73,INVALC,INVALC,INVALC, + 0xB2B0,0xD6A7,0xB2AF, + /* Range 0x76DA - 0x76FE, array index: 0x272D */ + 0xDAB9,0xB2B1,0xB573,0xDED7,0xB7F8,0xB7F9,INVALC,0xBAC9, + INVALC,0xBACA,0xBD4C,0xBF64,0xEA75,0xBF63,INVALC,0xED79, + 0xC0FA,INVALC,0xF053,0xF473,0xA5D8,0xA86E,0xCD78,0xCD77, + 0xAABC,0xCD76,0xAABD,0xCD79,INVALC,0xCFE5,0xACDB,0xACDA, + 0xCFE7,0xCFE6,0xACDF,INVALC,0xACDE, + /* Range 0x7701 - 0x770B, array index: 0x2752 */ + 0xACD9,INVALC,0xCFE1,0xCFE2,0xCFE3,INVALC,0xACE0,0xCFE0, + 0xACDC,0xCFE4,0xACDD, + /* Range 0x7710 - 0x7729, array index: 0x275D */ + 0xD2CF,0xD2D3,0xD2D1,0xD2D0,INVALC,0xD2D4,INVALC,INVALC, + INVALC,0xD2D5,0xD2D6,0xD2CE,INVALC,0xD2CD,INVALC,0xAF75, + 0xAF76,INVALC,0xD2D7,0xD2D2,INVALC,0xD6B0,INVALC,0xD2D8, + 0xAF77,0xAF74, + /* Range 0x772F - 0x773E, array index: 0x2777 */ + 0xD6A9,INVALC,0xD6AB,0xD6AC,0xD6AE,0xD6AD,0xD6B2,0xB2B5, + 0xB2B2,0xB2B6,0xD6A8,0xB2B7,0xD6B1,0xB2B4,0xD6AF,0xB2B3, + /* Range 0x7744 - 0x774F, array index: 0x2787 */ + 0xDABC,0xDABE,0xDABA,0xDABB,INVALC,INVALC,0xDABF,0xDAC1, + 0xDAC2,0xDABD,0xDAC0,0xB574, + /* Range 0x7752 - 0x776F, array index: 0x2793 */ + 0xDEDB,INVALC,0xDEE0,0xDED8,0xDEDC,INVALC,INVALC,0xDEE1, + 0xDEDD,0xB7FA,0xB843,INVALC,0xB7FD,0xDED9,0xDEDA,0xBACE, + 0xB846,0xB7FE,INVALC,0xB844,0xB7FC,0xDEDF,0xB845,0xDEDE, + 0xB841,0xB7FB,0xB842,0xDEE2,0xE2E6,0xE2E8, + /* Range 0x777C - 0x7791, array index: 0x27B1 */ + 0xE2E3,0xBACC,0xE2E9,0xBACD,0xE2E7,0xE2E2,0xE2E5,0xE2EA, + 0xBACB,0xE2E4,INVALC,0xBD4E,0xE6BF,0xE6BE,INVALC,0xBD51, + 0xBD4F,0xE6BC,0xBD4D,0xE6BD,INVALC,0xBD50, + /* Range 0x7797 - 0x77BF, array index: 0x27C7 */ + 0xEAA1,INVALC,0xEA7E,0xEA76,0xEA7A,0xEA79,0xEA77,0xBF66, + 0xBF67,0xBF65,0xEA78,0xEA7B,0xEA7C,INVALC,0xBF68,INVALC, + 0xC140,0xEDA3,INVALC,0xC0FC,0xED7B,0xC0FE,0xC141,INVALC, + INVALC,0xC0FD,0xEDA2,0xED7C,0xC0FB,0xEDA1,0xED7A,0xED7E, + 0xED7D,INVALC,INVALC,0xF055,0xC2A4,0xC2A5,0xC2A2,INVALC, + 0xC2A3, + /* Range 0x77C9 - 0x77FD, array index: 0x27F0 */ + 0xF279,0xF27A,INVALC,0xF474,0xF477,0xF475,0xF476,0xF5E0, + INVALC,INVALC,0xC4EF,0xF7EB,0xF8B4,INVALC,0xC5F7,0xF8F8, + 0xF8F9,0xC666,0xA5D9,0xACE1,INVALC,0xDAC3,INVALC,0xDEE3, + INVALC,0xA5DA,0xA86F,INVALC,0xAABE,INVALC,0xCFE8,0xCFE9, + 0xAF78,INVALC,INVALC,0xDAC4,0xB575,0xB847,0xC142,0xEDA4, + 0xF27C,0xF478,0xA5DB,INVALC,INVALC,INVALC,0xCDA1,0xCD7A, + 0xCD7C,0xCD7E,0xCD7D,0xCD7B,0xAABF, + /* Range 0x7802 - 0x7806, array index: 0x2825 */ + 0xACE2,0xCFF2,INVALC,0xCFED,0xCFEA, + /* Range 0x780C - 0x7814, array index: 0x282A */ + 0xACE4,0xACE5,0xCFF0,0xCFEF,0xCFEE,0xCFEB,0xCFEC,0xCFF3, + 0xACE3, + /* Range 0x781D - 0x7838, array index: 0x2833 */ + 0xAF7C,INVALC,0xAFA4,0xAFA3,0xD2E1,0xD2DB,0xD2D9,INVALC, + 0xAFA1,0xD6B9,0xAF7A,0xD2DE,0xD2E2,0xD2E4,0xD2E0,0xD2DA, + 0xAFA2,0xD2DF,0xD2DD,0xAF79,0xD2E5,0xAFA5,0xD2E3,0xAF7D, + 0xD2DC,INVALC,0xAF7E,0xAF7B, + /* Range 0x7848 - 0x7852, array index: 0x284F */ + 0xD6B3,0xD6B5,0xD6B7,INVALC,0xD6B8,0xD6B6,0xB2BA,INVALC, + 0xD6BB,INVALC,0xD6B4, + /* Range 0x785C - 0x7871, array index: 0x285A */ + 0xDAC8,0xB576,0xDAD0,INVALC,0xDAC5,INVALC,0xDAD1,INVALC, + 0xDAC6,0xDAC7,INVALC,INVALC,0xDACF,0xDACE,0xDACB,0xB2B8, + 0xB577,0xDAC9,0xDACC,0xB578,0xDACD,0xDACA, + /* Range 0x787B - 0x7889, array index: 0x2870 */ + 0xDEF2,0xB84E,INVALC,0xE2F0,0xB851,0xDEF0,INVALC,INVALC, + 0xDEED,0xDEE8,0xDEEA,0xDEEB,0xDEE4,INVALC,0xB84D, + /* Range 0x7891 - 0x78AD, array index: 0x287F */ + 0xB84F,INVALC,0xB850,0xDEE6,0xDEE9,0xDEF1,0xB84A,0xB84B, + 0xDEEF,0xDEE5,INVALC,INVALC,INVALC,0xE2F2,0xBAD0,0xE2F4, + 0xDEEC,0xE2F6,0xBAD4,0xE2F7,0xE2F3,INVALC,0xBAD1,0xE2EF, + 0xBAD3,0xE2EC,0xE2F1,0xE2F5,0xE2EE, + /* Range 0x78B0 - 0x78B4, array index: 0x289C */ + 0xB849,INVALC,0xE2EB,0xBAD2,0xE2ED, + /* Range 0x78BA - 0x78BE, array index: 0x28A1 */ + 0xBD54,0xE6C1,0xBD58,INVALC,0xBD56, + /* Range 0x78C1 - 0x78D5, array index: 0x28A6 */ + 0xBACF,INVALC,0xE6C8,0xE6C9,0xBD53,INVALC,INVALC,0xE6C7, + 0xE6CA,0xBD55,0xBD52,0xE6C3,0xE6C0,0xE6C5,0xE6C2,0xBD59, + 0xE6C4,INVALC,INVALC,0xE6C6,0xBD57, + /* Range 0x78DA - 0x78F4, array index: 0x28BB */ + 0xBF6A,0xEAA8,INVALC,0xEAA2,0xEAA6,0xEAAC,0xEAAD,0xEAA9, + 0xEAAA,0xEAA7,INVALC,0xEAA4,INVALC,0xBF6C,0xBF69,0xEAA3, + 0xEAA5,INVALC,0xBF6B,0xEAAB,INVALC,0xC146,INVALC,INVALC, + 0xEDAA,0xEDA5,0xC145, + /* Range 0x78F7 - 0x7905, array index: 0x28D6 */ + 0xC143,INVALC,0xEDAC,0xC144,0xEDA8,0xEDA9,0xEDA6,0xEDAD, + 0xF056,INVALC,0xC147,0xEDA7,INVALC,0xEDAE,0xEDAB, + /* Range 0x790E - 0x7914, array index: 0x28E5 */ + 0xC2A6,INVALC,0xF05B,0xF05D,0xF05C,0xF058,0xF059, + /* Range 0x7919 - 0x791E, array index: 0x28EC */ + 0xC3AA,INVALC,0xF27E,0xF2A2,0xF27D,0xF2A4, + /* Range 0x7921 - 0x7931, array index: 0x28F2 */ + 0xF2A1,INVALC,0xF47A,0xF47D,0xF479,0xC471,0xF47B,0xF47C, + 0xF47E,0xC472,0xC474,0xC473,0xF5E1,INVALC,0xF5E3,INVALC, + 0xF5E2, + /* Range 0x7938 - 0x796D, array index: 0x2903 */ + 0xF8B5,0xF8FA,0xA5DC,INVALC,INVALC,0xCB72,0xAAC0,0xCDA3, + 0xAAC1,0xAAC2,0xCDA2,INVALC,0xCFF8,0xCFF7,0xACE6,0xACE9, + 0xACE8,0xACE7,0xCFF4,0xCFF6,0xCFF5,INVALC,INVALC,0xD2E8, + 0xAFA7,0xD2EC,0xD2EB,0xD2EA,0xD2E6,0xAFA6,0xAFAA,0xAFAD, + INVALC,INVALC,0xAFAE,0xD2E7,0xD2E9,0xAFAC,0xAFAB,0xAFA9, + 0xAFA8,0xD6C2,INVALC,0xD6C0,0xD6BC,0xB2BB,INVALC,0xD6BD, + 0xB2BC,0xD6BE,0xD6BF,0xD6C1,INVALC,0xB2BD, + /* Range 0x7970 - 0x7974, array index: 0x2939 */ + 0xDAD5,INVALC,0xDAD4,0xDAD3,0xDAD2, + /* Range 0x7979 - 0x7982, array index: 0x293E */ + 0xDEF6,0xB852,INVALC,0xDEF3,0xDEF5,INVALC,0xB853,INVALC, + 0xB854,0xDEF4, + /* Range 0x798A - 0x79C1, array index: 0x2948 */ + 0xE2F9,0xE2FA,INVALC,0xBAD7,0xBAD5,0xBAD6,0xE343,INVALC, + 0xE342,0xE2FE,0xE2FD,0xE2FC,0xE2FB,0xE340,0xE2F8,INVALC, + 0xE6CB,0xE6D0,0xE6CE,INVALC,INVALC,INVALC,0xE6CD,0xE6CC, + 0xE6CF,INVALC,0xEAAE,INVALC,0xBF6D,0xC148,0xEDB0,INVALC, + 0xC149,0xEDAF,0xF05F,0xF05E,0xC2A7,INVALC,0xF2A5,0xC3AB, + 0xF4A1,0xC5A1,0xF6F7,INVALC,0xF8B7,0xF8B6,0xC9A8,0xACEA, + 0xACEB,0xD6C3,INVALC,0xB856,0xA5DD,0xA872,0xA871,0xA870, + /* Range 0x79CB - 0x79EE, array index: 0x2980 */ + 0xACEE,INVALC,0xCFFA,0xCFFD,0xCFFB,INVALC,0xACEC,0xACED, + INVALC,INVALC,0xCFF9,0xCFFC,INVALC,0xAFB5,INVALC,INVALC, + INVALC,0xD2F3,0xD2F5,0xD2F4,0xAFB2,0xD2EF,INVALC,INVALC, + 0xAFB0,0xAFAF,INVALC,0xAFB3,0xAFB1,INVALC,0xAFB4,0xD2F2, + 0xD2ED,0xD2EE,0xD2F1,0xD2F0, + /* Range 0x79F6 - 0x79FB, array index: 0x29A4 */ + 0xD6C6,0xD6C7,0xD6C5,INVALC,0xD6C4,0xB2BE, + /* Range 0x7A00 - 0x7A05, array index: 0x29AA */ + 0xB57D,INVALC,0xDAD6,0xDAD8,0xDADA,0xB57C, + /* Range 0x7A08 - 0x7A22, array index: 0x29B0 */ + 0xB57A,INVALC,0xDAD7,0xB57B,0xDAD9,0xB579,INVALC,INVALC, + 0xDF41,0xDEF7,0xDEFA,0xDEFE,0xB85A,0xDEFC,INVALC,0xDEFB, + 0xDEF8,0xDEF9,0xB858,0xDF40,0xB857,INVALC,0xB85C,0xB85B, + 0xB859,INVALC,0xDEFD, + /* Range 0x7A2E - 0x7A31, array index: 0x29CB */ + 0xBAD8,0xE347,0xE346,0xBAD9, + /* Range 0x7A39 - 0x7A40, array index: 0x29CF */ + 0xE6D2,INVALC,0xBD5F,0xBD5B,0xBD5D,INVALC,0xBD5A,0xBD5C, + /* Range 0x7A44 - 0x7A4E, array index: 0x29D7 */ + 0xEAAF,INVALC,0xBF70,0xEAB1,0xEAB0,INVALC,0xE345,0xBF72, + 0xBF71,0xBF6E,0xBF6F, + /* Range 0x7A54 - 0x7A62, array index: 0x29E2 */ + 0xEDB5,INVALC,0xEDB3,0xC14A,0xEDB4,INVALC,0xEDB6,0xEDB2, + 0xEDB1,INVALC,INVALC,0xF060,0xC2AA,0xC2A8,0xC2A9, + /* Range 0x7A67 - 0x7A99, array index: 0x29F1 */ + 0xF2A6,0xF2A7,0xC3AD,INVALC,0xC3AC,0xF4A3,0xF4A4,0xF4A2, + INVALC,0xF6F8,0xF6F9,INVALC,INVALC,0xA5DE,0xCA48,0xA873, + INVALC,0xCDA5,0xAAC6,0xAAC5,0xCDA6,INVALC,INVALC,0xD040, + 0xACEF,0xCFFE,0xACF0,INVALC,INVALC,0xAFB6,0xD2F8,0xD2F6, + 0xD2FC,0xAFB7,0xD2F7,0xD2FB,0xD2F9,0xD2FA,INVALC,INVALC, + 0xD6C8,0xD6CA,INVALC,0xB2BF,INVALC,0xD6C9,0xB2C0,0xB5A2, + 0xB5A1,0xB57E,0xDADB, + /* Range 0x7A9E - 0x7AA3, array index: 0x2A24 */ + 0xDF44,0xB85D,0xB85E,INVALC,0xDF43,0xDF42, + /* Range 0x7AA8 - 0x7ACB, array index: 0x2A2A */ + 0xE34A,0xBADB,0xBADA,0xE34B,0xE34C,INVALC,0xBD61,0xBD60, + INVALC,0xEAB5,0xE6D3,0xE6D5,0xE6D4,0xEAB4,0xEAB2,0xEAB6, + 0xEAB3,INVALC,0xBF73,INVALC,INVALC,INVALC,0xEDB7,0xC14B, + 0xEDB8,0xEDB9,INVALC,INVALC,0xC2AB,0xC2AC,INVALC,0xC475, + INVALC,INVALC,0xC5D1,0xA5DF, + /* Range 0x7ADF - 0x7AE6, array index: 0x2A4E */ + 0xB3BA,0xB3B9,INVALC,INVALC,0xB5A4,0xDADD,0xB5A3,0xDADC, + /* Range 0x7AEB - 0x7AEF, array index: 0x2A56 */ + 0xDF45,INVALC,0xBADC,0xE34D,0xBADD, + /* Range 0x7AF6 - 0x7B13, array index: 0x2A5B */ + 0xC476,0xF4A5,INVALC,0xA6CB,0xAAC7,0xCDA7,INVALC,0xACF2, + INVALC,0xACF1,0xD042,0xD043,INVALC,INVALC,0xD340,0xD342, + 0xAFB9,INVALC,0xD344,0xD347,0xD345,INVALC,INVALC,INVALC, + 0xD346,0xD343,0xD2FE,0xAFBA,0xD348,0xD341, + /* Range 0x7B18 - 0x7B35, array index: 0x2A79 */ + 0xD6D3,0xB2C6,0xD6DC,0xB2C3,INVALC,0xD6D5,0xB2C7,INVALC, + 0xB2C1,INVALC,0xD6D0,0xD6DD,0xD6D1,0xD6CE,0xB2C5,INVALC, + 0xB2C2,INVALC,0xD6D4,0xD6D7,0xB2C4,0xD6D8,0xB2C8,0xD6D9, + 0xD6CF,0xD6D6,0xD6DA,0xD6D2,0xD6CD,0xD6CB, + /* Range 0x7B44 - 0x7B58, array index: 0x2A97 */ + 0xDAE0,0xDAE6,0xB5A7,0xD6CC,0xDAE1,0xB5A5,0xDADE,0xB5AC, + 0xDAE2,0xB5AB,0xDAE3,0xB5AD,0xB5A8,0xB5AE,0xB5A9,INVALC, + 0xB5AA,INVALC,0xB5A6,INVALC,0xDAE5, + /* Range 0x7B60 - 0x7B69, array index: 0x2AAC */ + 0xB861,0xDF50,INVALC,0xDF53,0xDF47,0xDF4C,0xDF46,0xB863, + INVALC,0xDF4A, + /* Range 0x7B6D - 0x7B78, array index: 0x2AB6 */ + 0xDF48,0xB862,INVALC,0xDF4F,0xDF4E,0xDF4B,0xDF4D,0xDF49, + 0xBAE1,0xDF52,0xB85F,0xDF51, + /* Range 0x7B84 - 0x7BA1, array index: 0x2AC2 */ + 0xBAE8,0xE358,INVALC,0xBAE7,0xE34E,INVALC,0xE350,0xBAE0, + 0xE355,0xE354,0xE357,0xBAE5,0xE352,0xE351,INVALC,INVALC, + 0xBAE4,0xBADF,0xE353,0xBAE2,0xE359,0xE35B,INVALC,0xE356, + 0xE34F,0xBAE3,INVALC,INVALC,0xBD69,0xBADE, + /* Range 0x7BB4 - 0x7BB9, array index: 0x2AE0 */ + 0xBD65,0xE6DE,INVALC,0xE6D6,0xBAE6,0xE6DC, + /* Range 0x7BC6 - 0x7BCE, array index: 0x2AE6 */ + 0xBD66,0xBD67,INVALC,0xBF76,0xE6DD,0xE6D7,0xBD6A,INVALC, + 0xE6DA, + /* Range 0x7BD4 - 0x7BEB, array index: 0x2AEF */ + 0xEAC0,0xEABB,INVALC,INVALC,0xEAC5,0xBF74,0xEABD,0xBF78, + 0xEAC3,0xEABA,0xEAB7,0xEAC6,0xC151,0xBF79,0xEAC2,0xEAB8, + 0xBF77,0xEABC,0xBF7B,0xEAB9,0xEABE,0xBF7A,0xEAC1,0xEAC4, + /* Range 0x7BF0 - 0x7C11, array index: 0x2B07 */ + 0xEDCB,0xEDCC,0xEDBC,0xEDC3,0xEDC1,INVALC,INVALC,0xC14F, + 0xEDC8,0xEABF,INVALC,0xEDBF,INVALC,0xEDC9,0xC14E,0xEDBE, + 0xEDBD,0xEDC7,0xEDC4,0xEDC6,INVALC,0xEDBA,0xEDCA,0xC14C, + INVALC,0xEDC5,0xEDCE,0xEDC2,0xC150,0xC14D,0xEDC0,0xEDBB, + 0xEDCD,0xBF75, + /* Range 0x7C1C - 0x7C2D, array index: 0x2B29 */ + 0xF061,0xF067,0xC2B0,0xF065,0xF064,0xC2B2,0xF06A,0xC2B1, + INVALC,0xF06B,0xF068,0xC2AE,0xF069,0xF062,0xC2AF,0xC2AD, + 0xF2AB,0xF066, + /* Range 0x7C37 - 0x7C40, array index: 0x2B3B */ + 0xC3B2,0xC3B0,0xF2AA,INVALC,0xF2AC,0xF2A9,0xC3B1,0xC3AE, + 0xC3AF,0xC3B3, + /* Range 0x7C45 - 0x7C4D, array index: 0x2B45 */ + 0xF4AA,INVALC,0xF4A9,0xF4A7,0xF4A6,0xF4A8,INVALC,0xC477, + 0xC479, + /* Range 0x7C57 - 0x7C7A, array index: 0x2B4E */ + 0xF6FA,INVALC,0xF6FC,0xF6FE,0xF6FD,0xF6FB,INVALC,INVALC, + 0xC5A3,0xC5A2,INVALC,INVALC,0xC5D3,0xC5D2,0xC5D4,0xF7ED, + 0xF7EC,INVALC,0xF8FB,0xF8B8,0xF8FC,0xC658,INVALC,0xC659, + 0xF96D,INVALC,INVALC,0xC67E,0xA6CC,INVALC,0xCDA8,INVALC, + INVALC,0xD045,0xD046,0xD044, + /* Range 0x7C7D - 0x7C8D, array index: 0x2B72 */ + 0xACF3,INVALC,0xD047,0xD048,0xD049,INVALC,INVALC,0xD349, + 0xD34F,INVALC,INVALC,0xD34D,0xAFBB,0xD34B,INVALC,0xD34C, + 0xD34E, + /* Range 0x7C91 - 0x7C98, array index: 0x2B83 */ + 0xD34A,0xB2C9,INVALC,0xD6DE,0xB2CB,0xD6E0,0xB2CA,0xD6DF, + /* Range 0x7C9E - 0x7CA5, array index: 0x2B8B */ + 0xDAE8,0xB5AF,INVALC,0xDAEA,0xDAE7,0xD6E1,INVALC,0xB5B0, + /* Range 0x7CAF - 0x7CBF, array index: 0x2B93 */ + 0xDF56,INVALC,0xB864,0xDF54,0xB865,0xDF55,0xB866,INVALC, + INVALC,INVALC,0xBAE9,0xE361,0xE35E,0xE360,0xBAEA,0xBAEB, + 0xE35F, + /* Range 0x7CC8 - 0x7CE2, array index: 0x2BA4 */ + 0xE6E0,INVALC,0xBD6B,0xE6E2,0xE6E1,INVALC,0xA261,INVALC, + 0xEACA,0xEACB,0xEAC7,INVALC,0xEAC8,0xBF7C,0xBF7D,0xEAC9, + INVALC,0xC157,INVALC,INVALC,0xC153,0xC158,0xC154,0xC156, + 0xC152,INVALC,0xC155, + /* Range 0x7CEC - 0x7CF8, array index: 0x2BBF */ + 0xF2AD,INVALC,0xF4AB,0xC47A,0xC47B,0xF741,0xF5E6,INVALC, + 0xF740,INVALC,0xF8FD,0xF9A4,0xA6CD, + /* Range 0x7CFD - 0x7D22, array index: 0x2BCC */ + 0xCDA9,0xAAC8,INVALC,0xACF6,0xD04C,0xACF4,0xD04A,0xACF9, + 0xACF5,0xACFA,0xACF8,0xD04B,0xACF7,0xAFBF,0xAFBE,0xD35A, + 0xAFC7,0xD353,0xD359,0xAFC3,0xD352,0xD358,0xD356,0xAFC2, + 0xAFC4,0xD355,0xAFBD,0xD354,0xAFC8,0xAFC5,0xAFC9,0xAFC6, + 0xD351,0xD350,0xD357,0xAFC0,0xAFBC,0xAFC1, + /* Range 0x7D28 - 0x7D47, array index: 0x2BF2 */ + 0xD6F0,0xD6E9,INVALC,0xB5B5,0xD6E8,INVALC,0xB2CF,0xB2D6, + 0xB2D3,0xB2D9,0xB2D8,0xB2D4,INVALC,0xD6E2,0xD6E5,INVALC, + 0xD6E4,0xB2D0,0xD6E6,0xD6EF,0xB2D1,0xD6E3,0xD6EC,0xD6ED, + 0xB2D2,0xD6EA,0xB2D7,0xB2CD,0xB2D5,0xD6E7,0xB2CC,0xD6EB, + /* Range 0x7D4E - 0x7D73, array index: 0x2C12 */ + 0xDAFB,0xDAF2,0xB5B2,0xDAF9,0xDAF6,0xDAEE,0xDAF7,0xB5B4, + 0xDAEF,INVALC,0xDAEB,INVALC,INVALC,0xB86C,0xDAF4,INVALC, + 0xB5B1,0xDAFA,INVALC,0xB5B8,0xB5BA,0xDAED,INVALC,INVALC, + 0xB5B9,0xDAF0,0xB5B3,0xDAF8,0xDAF1,0xDAF5,INVALC,0xDAF3, + 0xB5B6,0xDAEC,0xB5BB,0xB2CE,0xB5B7,0xB5BC, + /* Range 0x7D79 - 0x7D96, array index: 0x2C38 */ + 0xB868,0xDF5D,0xDF5F,0xDF61,0xDF65,INVALC,0xDF5B,0xDF59, + 0xB86A,INVALC,0xDF60,0xDF64,0xDF5C,0xDF58,INVALC,0xDF57, + INVALC,INVALC,INVALC,0xDF62,0xDF5A,0xDF5E,0xB86B,INVALC, + 0xB869,0xDF66,0xB867,0xDF63,INVALC,0xE372, + /* Range 0x7D9C - 0x7DCE, array index: 0x2C56 */ + 0xBAEE,0xE36A,0xBD78,0xE374,0xBAF1,0xE378,0xBAF7,0xE365, + INVALC,INVALC,0xE375,0xE362,INVALC,0xE377,0xE366,INVALC, + 0xBAFE,0xBAFB,0xE376,0xE370,0xBAED,0xBAF5,0xBAF4,INVALC, + 0xBAF3,0xBAF9,INVALC,0xE363,0xBAFA,0xE371,0xBAF6,0xBAEC, + 0xE373,0xBAEF,0xBAF0,0xBAF8,0xE368,0xE367,0xE364,INVALC, + 0xE36C,0xE369,0xE36D,0xBAFD,INVALC,0xE379,0xBAF2,0xE36E, + 0xE36F,INVALC,0xE36B, + /* Range 0x7DD7 - 0x7DFB, array index: 0x2C89 */ + 0xE6E7,0xBD70,0xBD79,0xBD75,0xE6E4,INVALC,0xBD72,0xBD76, + 0xE6F0,0xBD6C,0xE6E8,INVALC,0xBD74,INVALC,INVALC,0xE6EB, + 0xE6E6,0xBD73,0xBD77,0xE6E5,INVALC,0xBD71,INVALC,0xE6EF, + 0xBD6E,0xE6EE,0xE6ED,0xBD7A,0xE572,0xBD6D,INVALC,0xE6EC, + 0xE6E3,INVALC,0xBD7B,0xE6EA,0xBD6F, + /* Range 0x7E08 - 0x7E49, array index: 0x2CAE */ + 0xBFA2,0xBFA7,0xBF7E,0xEAD8,0xEACF,0xEADB,0xEAD3,0xEAD9, + 0xBFA8,0xBFA1,0xEACC,0xEAD2,0xEADC,0xEAD5,0xEADA,0xEACE, + INVALC,INVALC,0xEAD6,0xBFA3,0xEAD4,0xBFA6,0xBFA5,0xEAD0, + 0xEAD1,0xEACD,0xEAD7,0xBFA4,0xEADE,0xEADD,INVALC,INVALC, + INVALC,0xEDDA,0xEDD6,0xC15F,INVALC,0xEDD0,0xC159,0xC169, + 0xEDDC,0xC161,0xC15D,0xEDD3,0xC164,0xC167,0xEDDE,0xC15C, + 0xEDD5,0xC165,0xEDE0,0xEDDD,0xEDD1,0xC160,0xC15A,0xC168, + 0xEDD8,0xC163,0xEDD2,0xC15E,0xEDDF,0xC162,0xC15B,0xEDD9, + 0xC166,0xEDD7, + /* Range 0x7E50 - 0x7E63, array index: 0x2CF0 */ + 0xF06E,0xF074,0xC2B9,0xF077,0xC2B4,0xC2B5,0xF06F,0xF076, + 0xF071,0xC2BA,0xC2B7,INVALC,0xF06D,INVALC,0xC2B6,0xF073, + 0xF075,0xC2B8,0xF072,0xF070, + /* Range 0x7E68 - 0x7E9C, array index: 0x2D04 */ + 0xF2B8,0xC3B7,0xC3B8,0xC3B4,INVALC,0xC3B5,INVALC,0xF2B4, + 0xF2B2,INVALC,0xF2B6,0xC3BA,0xF2B7,0xF2B0,0xF2AF,0xF2B3, + 0xF2B1,0xC3B6,0xF2B5,0xF4AC,0xC47E,0xC47D,0xF4AD,INVALC, + 0xF4AF,0xF4AE,0xC4A1,INVALC,INVALC,INVALC,0xF5EB,0xF5E8, + 0xF5E9,INVALC,0xF5E7,0xF5EA,0xC4F2,0xF5EC,INVALC,0xC4F1, + INVALC,0xF742,INVALC,0xC5D5,0xC5D7,0xF7EE,0xC5D6,0xF8B9, + 0xF940,0xF942,0xF8FE,0xF941,0xC66C, + /* Range 0x7F36 - 0x7F45, array index: 0x2D39 */ + 0xA6CE,INVALC,0xACFB,0xD26F,0xAFCA,INVALC,INVALC,0xB2DA, + 0xDAFC,0xDAFD,INVALC,INVALC,INVALC,0xEADF,0xC16A,0xEDE1, + /* Range 0x7F48 - 0x7F55, array index: 0x2D49 */ + 0xC2BB,INVALC,0xF2BA,0xF2B9,0xC4A2,0xF5ED,INVALC,0xF743, + 0xC5F8,0xCA49,INVALC,INVALC,0xAAC9,0xA875, + /* Range 0x7F5B - 0x7F7F, array index: 0x2D57 */ + 0xD360,0xD35B,0xD35F,0xD35D,0xAFCB,0xD35E,0xD35C,INVALC, + 0xD6F1,INVALC,0xDAFE,0xDB40,0xDF69,0xDF6A,0xB86E,0xB86F, + 0xDF68,0xDF6B,0xDF67,0xB86D,INVALC,0xBB40,INVALC,0xB870, + 0xE37A,INVALC,0xBD7C,0xE6F1,0xBD7D,INVALC,0xBFA9,0xEAE2, + 0xEAE0,0xEAE1,0xEDE4,0xEDE3,0xEDE2, + /* Range 0x7F83 - 0x7FD7, array index: 0x2D7C */ + 0xF2BB,INVALC,0xC3B9,0xF2BC,0xF744,0xC5F9,0xF8BA,0xA6CF, + 0xAACB,0xAACA,0xD04F,0xACFC,INVALC,INVALC,0xD04E,0xD362, + INVALC,0xAFCC,0xD6F2,0xD361,INVALC,INVALC,INVALC,0xB2DC, + 0xD6F5,0xD6F3,0xD6F4,0xB2DB,INVALC,0xDB42,0xDB43,0xDB41, + INVALC,0xB873,0xDF6D,0xDF6C,0xDF6E,0xB872,0xB871,INVALC, + INVALC,0xE6F2,0xE6F4,INVALC,0xBD7E,0xE6F3,0xEAE3,0xBFAA, + 0xF079,INVALC,0xF078,0xC3BB,0xF2BD,0xC3BD,0xC3BC,0xF4B0, + 0xF5EE,0xC4F3,0xA6D0,0xD050,0xACFD,0xD365,0xAFCE,0xD364, + 0xD363,INVALC,0xAFCD,INVALC,0xD6FB,INVALC,0xD6FD,0xD6F6, + 0xD6F7,0xB2DD,0xD6F8,0xB2DE,0xD6FC,0xD6F9,0xD6FA,0xB2DF, + INVALC,0xB5BE,0xB5BF,INVALC,0xDB44, + /* Range 0x7FDB - 0x8021, array index: 0x2DD1 */ + 0xDF6F,0xDF70,INVALC,0xE37E,0xBB43,0xBB41,0xBB42,0xE37B, + 0xE37C,INVALC,0xE37D,0xE6F9,INVALC,0xE6FA,0xBDA1,0xE6F7, + 0xE6F6,0xE6F8,0xE6F5,0xBFAD,0xEAE4,0xBFAB,0xBFAC,0xEDE6, + 0xC16B,0xEDE5,0xEFA8,INVALC,0xF07A,0xF07B,0xC2BC,INVALC, + 0xC2BD,0xC16C,0xF2BE,0xF2BF,0xF4B1,0xC4A3,0xA6D1,INVALC, + 0xA6D2,0xACFE,0xAACC,0xAFCF,0xD051,INVALC,INVALC,INVALC, + 0xB5C0,0xA6D3,0xAD41,0xD052,0xD053,0xAD40,0xAD42,0xA6D4, + INVALC,0xD054,0xAFD1,0xD366,0xAFD3,0xAFD0,0xAFD2,INVALC, + 0xD741,0xB2E0,INVALC,0xD740,0xD6FE,INVALC,0xDF71, + /* Range 0x8026 - 0x802C, array index: 0x2E18 */ + 0xBDA2,INVALC,0xBFAE,0xEAE6,0xEAE5,INVALC,0xEDE7, + /* Range 0x8033 - 0x803F, array index: 0x2E1F */ + 0xA6D5,0xCB73,0xCDAA,0xAD43,0xD055,INVALC,0xD368,INVALC, + INVALC,INVALC,0xAFD4,0xD367,0xAFD5, + /* Range 0x8046 - 0x804A, array index: 0x2E2C */ + 0xB2E2,0xD742,0xD744,INVALC,0xB2E1, + /* Range 0x804F - 0x8052, array index: 0x2E31 */ + 0xDB46,0xDB47,0xDB45,0xB5C1, + /* Range 0x805A - 0x805E, array index: 0x2E35 */ + 0xBB45,INVALC,0xE3A3,0xE3A2,0xBB44, + /* Range 0x806F - 0x807F, array index: 0x2E3A */ + 0xC170,0xC16F,0xC16D,0xC16E,0xC171,INVALC,0xF07C,0xC2BF, + 0xC2BE,0xF2C0,0xF4B2,INVALC,INVALC,INVALC,0xC5A5,0xC5A4, + 0xA6D6, + /* Range 0x8082 - 0x80B5, array index: 0x2E4B */ + 0xD1FB,INVALC,0xB877,0xB5C2,0xB876,0xBB46,INVALC,0xA6D7, + 0xC9A9,0xA6D8,0xA6D9,INVALC,INVALC,0xCDAB,0xCB76,INVALC, + 0xCB77,0xA877,INVALC,0xCB74,0xA876,INVALC,0xA879,0xCB75, + 0xA87B,0xA87A,0xCB78,0xA878,INVALC,INVALC,INVALC,0xAAD1, + 0xAACF,0xCDAD,INVALC,0xAACE,INVALC,INVALC,INVALC,0xAAD3, + 0xAAD5,0xAAD2,INVALC,0xCDB0,0xCDAC,0xAAD6,INVALC,0xAAD0, + 0xA87C,INVALC,0xAAD4,0xCDAF, + /* Range 0x80C2 - 0x80E6, array index: 0x2E7F */ + 0xD05B,0xAD47,0xAD48,0xD05D,INVALC,0xD057,0xD05A,0xD063, + 0xD061,INVALC,0xAD49,0xD067,0xAD4C,0xD064,0xD05C,0xD059, + INVALC,INVALC,0xDB49,0xD062,0xAD44,0xD065,0xD056,0xD05F, + 0xAD46,0xAD4B,0xD060,0xAD4F,0xAD4D,INVALC,0xD058,0xAD4A, + INVALC,0xD05E,0xAD4E,0xAD45,0xD066, + /* Range 0x80ED - 0x810A, array index: 0x2EA4 */ + 0xAFDA,INVALC,0xAFE3,0xAFD8,0xAFD6,0xD36A,0xAFDE,0xAFDB, + 0xD36C,INVALC,INVALC,0xAFDD,0xD36B,0xD369,0xD36E,0xAFE2, + 0xAFE0,0xDB48,INVALC,0xD36F,0xD36D,0xAFD7,INVALC,INVALC, + 0xAFD9,0xAFDC,INVALC,0xAFDF,INVALC,0xAFE1, + /* Range 0x8115 - 0x8130, array index: 0x2EC2 */ + 0xD74E,0xB2E4,INVALC,0xD745,0xD747,INVALC,0xD748,INVALC, + 0xD750,0xD74C,0xD74A,INVALC,0xD74D,0xD751,0xB2E5,0xB2E9, + 0xD746,INVALC,0xD74F,INVALC,0xB2E7,INVALC,0xB2E6,0xD74B, + 0xD749,INVALC,0xB2E3,0xB2E8, + /* Range 0x8143 - 0x8155, array index: 0x2EDE */ + 0xDB4A,0xDFA1,INVALC,0xB5C9,0xDB4E,INVALC,INVALC,0xDB4B, + 0xB5C5,0xB5CB,0xDB50,0xB5C7,0xDB4D,0xBB47,0xB5C6,0xDB4C, + 0xB5CC,0xB5C4,0xB5C3, + /* Range 0x815E - 0x817A, array index: 0x2EF1 */ + 0xDF7B,INVALC,0xDF73,0xDFA2,0xDF78,INVALC,0xDF72,0xB87B, + 0xB8A3,0xDF7D,INVALC,0xDF76,INVALC,0xB87E,INVALC,INVALC, + 0xB87C,0xDF7E,0xB879,0xB878,0xDF79,0xB87D,0xB5CD,INVALC, + 0xDF7C,0xDF74,0xB87A,0xB8A1,0xB8A2, + /* Range 0x817F - 0x818F, array index: 0x2F0E */ + 0xBB4C,0xBB48,INVALC,0xBB4D,0xE3A6,INVALC,INVALC,0xE3A5, + 0xE3A7,0xBB4A,0xE3A4,0xBB4B,0xE3AA,0xE3A9,0xE3A8,INVALC, + 0xBB49, + /* Range 0x8195 - 0x81D2, array index: 0x2F1F */ + 0xE741,INVALC,0xE744,0xBDA8,0xE743,0xBDA7,0xBDA3,0xBDA4, + 0xBDA5,0xE740,0xE6FE,0xBDA6,INVALC,0xE742,0xE6FD,INVALC, + INVALC,0xEAE9,0xEAF3,0xBFB1,0xBFB0,INVALC,0xEAED,0xEAEF, + INVALC,0xEAEA,INVALC,0xEAEE,0xEAE8,0xEAF1,0xBFAF,0xEAF0, + 0xEAEC,INVALC,0xEAF2,INVALC,0xEAEB,0xC174,0xEDE8,0xEDEE, + 0xC178,0xC17A,0xC177,0xC176,INVALC,0xC175,0xC173,0xEDE9, + 0xEDEC,0xC172,0xEDED,INVALC,0xC179,0xEDEB,INVALC,0xEDEA, + 0xC2C0,INVALC,0xC2C1,0xF0A1,0xF07D,0xF07E, + /* Range 0x81D5 - 0x8216, array index: 0x2F5D */ + 0xF2C2,INVALC,0xF2C1,0xC3BE,0xF4B4,0xC4A4,0xF4B3,INVALC, + 0xF5F0,0xF745,0xC5A6,0xF943,0xF944,0xC5D8,0xA6DA,INVALC, + 0xAAD7,0xDB52,0xBB4E,0xC17B,0xEDEF,0xA6DB,INVALC,0xAFE5, + 0xAFE4,0xDB53,INVALC,INVALC,INVALC,0xEAF4,0xA6DC,0xAD50, + INVALC,INVALC,0xDB54,0xDB55,0xDB56,0xBB4F,0xBFB2,0xA6DD, + INVALC,0xAAD8,0xD068,0xAFE6,0xD370,0xB2EA,INVALC,0xDB57, + 0xB8A4,INVALC,0xBB50,0xBFB3,0xC17C,0xC2C2,0xF4B5,0xA6DE, + 0xAAD9,INVALC,INVALC,0xAFE7,0xD752,0xB5CE,INVALC,0xBB51, + 0xE3AB,0xE745, + /* Range 0x821B - 0x8222, array index: 0x2F9F */ + 0xA6DF,0xB5CF,0xDFA3,0xBB52,0xA6E0,0xCDB1,0xD069,0xAD51, + /* Range 0x8228 - 0x822C, array index: 0x2FA7 */ + 0xAFEA,INVALC,0xAFE8,0xAFE9,0xAFEB, + /* Range 0x8232 - 0x8285, array index: 0x2FAC */ + 0xD757,0xD754,0xD756,0xB2EB,0xB2ED,0xB2EC,0xD753,0xB2EE, + 0xD755,INVALC,0xDB58,0xDB59,INVALC,0xDB5A,0xDFA6,INVALC, + 0xDFA7,INVALC,0xDFA5,0xDFA8,INVALC,0xB8A5,INVALC,0xDFA4, + INVALC,0xBB53,INVALC,INVALC,0xE74A,0xE746,0xE749,0xE74B, + 0xE748,0xE747,INVALC,0xEAF5,0xEAF6,0xEAF7,0xBFB4,0xBFB5, + 0xEDF1,0xEDF0,0xEDF2,INVALC,0xF0A3,0xF0A2,INVALC,0xF2C4, + INVALC,0xF2C5,0xF2C3,INVALC,0xC4A5,INVALC,0xF4B6,0xF4B7, + INVALC,0xF746,0xF7EF,0xF8BB,0xA6E1,0xA87D,INVALC,0xC17D, + 0xA6E2,INVALC,0xD758,0xDB5B,INVALC,0xC641,0xCA4A,INVALC, + INVALC,INVALC,0xCA4B,0xCA4D,0xA6E3,0xCA4E,0xCA4C,INVALC, + INVALC,0xCBA2,0xCBA3,0xCB7B, + /* Range 0x828A - 0x82C3, array index: 0x3000 */ + 0xCBA1,0xA8A1,INVALC,0xA8A2,0xCB7C,0xCB7A,0xCB79,0xCB7D, + 0xA87E,0xCB7E,0xD06A,INVALC,INVALC,INVALC,0xCDB6,0xAADC, + 0xCDB5,0xCDB7,INVALC,0xAADB,0xCDBC,0xAADF,0xCDB2,0xCDC0, + 0xCDC6,0xAAE6,0xCDC3,0xAAE3,INVALC,0xCDB9,0xCDBF,0xCDC1, + INVALC,0xCDB4,0xAAE2,0xAADD,0xCDBA,0xAAE4,0xAAE7,0xAAE1, + INVALC,0xAADA,0xCDBE,0xCDB8,0xCDC5,0xAAE9,0xAAE5,0xAAE0, + 0xCDBD,0xAFEC,0xCDBB,0xAADE,0xAAE8,INVALC,0xCDB3,INVALC, + 0xCDC2,0xCDC4, + /* Range 0x82D1 - 0x82FB, array index: 0x303A */ + 0xAD62,0xAD5C,0xAD64,0xAD61,0xD071,0xD074,0xAD5D,INVALC, + 0xD06B,INVALC,0xAD56,0xAD60,INVALC,0xAD63,0xAD65,0xD0A2, + 0xD077,INVALC,0xAD55,0xD0A1,0xAD59,0xAD57,0xAD52,0xD06F, + INVALC,0xD07E,0xD073,0xD076,0xD0A5,INVALC,0xAD66,0xD07D, + 0xAD5E,0xD078,0xD0A4,0xD075,0xD079,0xD07C,INVALC,INVALC, + 0xD06D,0xD0A3,0xD07B, + /* Range 0x82FE - 0x830D, array index: 0x3065 */ + 0xD06C,INVALC,0xD070,0xAD5F,0xAD5A,0xAD53,0xAD58,0xAD54, + 0xAD67,0xD06E,0xD3A5,0xAD5B,INVALC,INVALC,0xD07A,0xCE41, + /* Range 0x8322 - 0x8356, array index: 0x3075 */ + 0xD37E,INVALC,0xD3A9,0xD378,0xD37C,0xD3B5,0xAFFD,0xD3AD, + 0xD3A4,0xAFED,0xD3B3,0xD374,INVALC,0xD3AC,INVALC,0xAFFC, + 0xAFF7,0xD373,0xAFF5,0xAFF4,0xAFF9,0xD3AB,0xAFF1,0xAFF8, + 0xD072,0xDB5C,0xD3A6,INVALC,INVALC,0xD37A,0xAFFB,0xD37B, + 0xD3A1,0xAFFE,0xD375,0xD3AF,INVALC,0xD3AE,0xD3B6,0xAFF3, + 0xAFF0,0xD3B4,0xD3B0,0xD3A7,0xD3A2,0xAFF6,0xAFF2,0xD377, + 0xAFEE,0xD3B1,0xAFEF,INVALC,0xD379, + /* Range 0x8373 - 0x83B0, array index: 0x30AA */ + 0xD75E,0xD760,0xD765,0xD779,0xB2FC,0xB2F2,INVALC,0xD75D, + 0xB2FD,0xB2FE,0xD768,0xD76F,0xD775,INVALC,0xD762,INVALC, + 0xD769,INVALC,INVALC,0xB340,0xD777,0xD772,0xB2FA,0xB2F8, + 0xD76E,0xD76A,0xD75C,0xB2EF,0xD761,0xD759,INVALC,0xB2F7, + 0xB2F9,0xD766,0xD763,0xB2F4,0xD773,0xB2F1,0xD764,0xD77A, + 0xD76C,INVALC,0xD76B,0xB2F0,INVALC,0xB2FB,INVALC,0xB2F3, + 0xD75A,0xD75F,0xD770,0xD776,0xB341,0xD75B,0xD767,0xD76D, + 0xB2F6,INVALC,INVALC,0xD778,0xD771,0xD774, + /* Range 0x83BD - 0x8413, array index: 0x30E8 */ + 0xB2F5,INVALC,0xDB6C,0xDB60,0xB5D7,0xDB7D,0xDBA7,0xDBAA, + 0xB5D5,0xDB68,0xDBA3,0xDB69,0xDB77,0xB5E2,0xDB73,0xB5DF, + INVALC,0xDB74,0xDB5D,INVALC,0xDBA4,INVALC,INVALC,0xB5E8, + 0xDBA1,0xDB75,0xDBAC,0xDB70,0xDFC8,INVALC,0xDBAF,0xB5E6, + 0xDB6E,0xDB7A,0xB5E9,0xB5D4,0xDB72,0xDBAD,0xDB6B,0xDB64, + 0xDB6F,INVALC,0xDB63,0xDB61,0xB5D0,0xDBA5,0xDB6A,0xDBA8, + INVALC,0xDBA9,0xB5D8,0xB5DD,0xB5D9,0xB5E1,0xDB7E,0xB5DA, + 0xDB76,0xDB66,INVALC,0xB5D2,0xDB5E,0xDBA2,0xDBAB,0xDB65, + 0xB5E0,0xDBB0,0xDB71,INVALC,0xDB6D,INVALC,0xB5D1,0xB5E5, + INVALC,0xDB7C,0xB5E7,INVALC,0xDB78,0xB5DC,0xB5D6,0xB5DE, + 0xB5D3,0xB5E4,0xDB79,0xDB67,0xDB7B,0xDB62,0xDBA6, + /* Range 0x8429 - 0x847E, array index: 0x313F */ + 0xDFC7,INVALC,0xDFDD,0xB855,0xDFCC,INVALC,0xDFCA,0xDFB5, + 0xB8A9,0xDFC5,0xDFD9,0xDFC1,0xB8B1,0xDFD8,0xDFBF,0xB5E3, + 0xDFCF,0xDFC0,0xDFD6,0xB8B0,0xB8A8,INVALC,0xDFAA,0xDFB2, + INVALC,0xDFCB,0xDFC3,0xDFDC,0xDFC6,0xB8B6,0xDFD7,INVALC, + 0xB8AD,INVALC,0xDFC9,0xDFD1,0xDFB6,0xDFD0,INVALC,0xDFE1, + 0xDFB1,0xDFD2,INVALC,0xDFDF,INVALC,0xDFAB,0xB5DB,INVALC, + 0xDFB9,0xDFB8,0xB8AF,INVALC,0xDFBC,0xDFBE,0xDFCD,0xDFDE, + 0xB8B2,INVALC,0xB8B3,INVALC,0xDFB0,0xB8AB,0xDFB4,0xDFDA, + 0xB8B4,INVALC,0xB8AC,0xB8AE,0xB8B5,0xDFE0,0xDFD3,0xDFCE, + INVALC,INVALC,0xDFBB,0xDFBA,0xB8AA,0xDFAC,0xB8A7,0xDFC4, + 0xDFAD,0xDFC2,INVALC,INVALC,0xDFB7,0xDFDB, + /* Range 0x848D - 0x8491, array index: 0x3195 */ + 0xDFAF,0xDFD5,0xDFAE,0xBB60,0xE3D3, + /* Range 0x8497 - 0x84D7, array index: 0x319A */ + 0xE3AC,0xE3CA,0xBB58,0xE3BB,0xE3C5,0xBB5B,0xE3BE,0xBB59, + 0xE3AF,0xE3CD,0xE3AE,0xE3C1,INVALC,0xE3AD,INVALC,INVALC, + 0xE3BF,0xE3C8,0xE3C6,0xE3BA,0xE3B5,0xE3B3,INVALC,0xE3B4, + 0xE3C7,0xE3D2,0xE3BC,0xBB5A,INVALC,0xE3B7,INVALC,0xE3CB, + INVALC,0xBB5D,0xE3B6,0xE3B0,0xE3C0,0xBB61,INVALC,INVALC, + 0xBB55,0xBB5E,0xE3B8,0xE3B2,INVALC,0xBB57,0xDFD4,0xBB56, + 0xE3C3,INVALC,0xBB54,0xBB63,0xBB5C,0xE3C4,0xE3B9,0xE3B1, + 0xE3CC,0xE3BD,0xBB62,0xE3D0,0xBB5F,0xE3CF,INVALC,0xE3C9, + 0xE3CE, + /* Range 0x84E7 - 0x8531, array index: 0x31DB */ + 0xE773,0xE774,0xE767,0xE766,0xE762,0xBDB4,INVALC,0xBDAC, + 0xE776,0xE775,0xDFA9,0xE75F,0xE763,0xE75D,INVALC,0xE770, + 0xE761,INVALC,0xE777,0xE75A,0xE758,0xE764,0xE76E,0xE769, + 0xBDB6,0xE74F,INVALC,0xE76D,INVALC,INVALC,INVALC,0xBDB7, + 0xDFBD,0xE75B,0xE752,0xE755,0xE77B,0xE75C,0xE753,0xE751, + 0xE74E,INVALC,0xBDB0,0xE765,0xBDAF,0xBDB3,0xE760,0xE768, + 0xBDA9,0xE778,0xE77C,0xBDAB,INVALC,0xE757,0xE76B,0xE76F, + 0xE754,0xE779,0xBDB2,INVALC,0xBDB1,0xE74C,0xBDB5,0xE772, + 0xE756,0xE76A,0xE750,0xE75E,0xE759,0xBDAD,0xBDAE,0xE76C, + 0xE77D,0xE77A,0xE771, + /* Range 0x853D - 0x854E, array index: 0x3226 */ + 0xBDAA,0xEB49,INVALC,0xEB40,0xEB43,INVALC,0xBFBB,0xEB45, + 0xEAF9,0xEB41,0xEB47,0xBFB8,0xBFBC,0xBFB6,INVALC,INVALC, + 0xEAFB,0xEB4C, + /* Range 0x8551 - 0x856E, array index: 0x3238 */ + 0xEB46,INVALC,0xEAFC,0xEB55,0xEB4F,0xEAF8,0xEE46,0xEAFE, + 0xBFB7,INVALC,0xEB4A,INVALC,0xEB54,0xBFBF,INVALC,0xEB51, + 0xEAFD,0xEB44,0xEB48,0xEB42,0xEB56,0xEB53,0xEB50,0xBFB9, + 0xBFBA,0xBFBE,0xEAFA,0xEB57,0xBFBD,0xEB4D, + /* Range 0x8575 - 0x85AA, array index: 0x3256 */ + 0xEB4E,0xEE53,0xEE40,0xEE45,0xEE52,0xEE44,0xEDFB,0xEE41, + INVALC,0xC1A2,INVALC,0xEDF4,0xEE4D,0xEE4F,0xEDF3,0xC1A1, + 0xEE51,0xEE49,0xC1A8,0xEE50,0xEE42,0xC1AA,0xEDF9,0xEB52, + 0xEE4A,0xEE47,0xEDF5,0xEE55,0xC1A4,INVALC,INVALC,0xC1A5, + 0xEDF7,0xEE48,INVALC,0xEE54,0xEE4B,0xEDFD,0xC1A7,0xC1A3, + 0xEE4C,0xEDFE,0xEE56,0xEDF8,0xEE43,0xEE4E,0xEDFA,0xEDFC, + INVALC,0xC2CB,0xEDF6,0xC1A9,0xC2C4,0xC17E, + /* Range 0x85AF - 0x85D2, array index: 0x328C */ + 0xC1A6,0xC2C8,0xF0B3,INVALC,0xF0A9,0xF0A4,0xF0AA,0xF0B4, + 0xF0B8,0xF0B7,0xC2CA,0xC2C9,INVALC,INVALC,0xF0AB,0xF0B9, + 0xF0AE,0xF0A6,INVALC,0xF0A8,0xF0A7,0xF0AD,0xF0B2,0xF0A5, + 0xF0AC,0xF0B1,0xC2C7,INVALC,0xF0AF,INVALC,0xC2C5,0xF0B0, + 0xC2C3,0xC2C6,0xF2D5,0xF0B5, + /* Range 0x85D5 - 0x860C, array index: 0x32B0 */ + 0xC3C2,INVALC,0xF2CD,0xF2D1,0xF2C9,0xF2CC,INVALC,0xF2D4, + 0xC3C0,0xF2D9,0xF2D2,INVALC,0xF2CA,0xF2DA,0xF2D3,0xC3C3, + 0xC3C4,0xF2D7,INVALC,0xF2CB,0xC3BF,0xC3C1,0xF2C6,0xF2CE, + 0xF2C8,INVALC,0xF2D8,0xF2D6,0xF2C7,0xF2CF,INVALC,INVALC, + INVALC,0xF4BE,0xC3C5,0xF2D0,0xC4A7,0xC4A9,0xC4A6,INVALC, + 0xF4C3,0xF4BB,0xF4B9,0xF4BD,0xF4BA,INVALC,INVALC,0xF4BF, + 0xF4C1,0xC4AA,0xC4AC,INVALC,0xF4C0,0xC4AD,0xC4AB,0xF4C2, + /* Range 0x8617 - 0x8640, array index: 0x32E8 */ + 0xC4F4,0xF5F1,0xF5F7,0xC4F6,0xF4BC,0xF5F6,INVALC,0xF5FD, + 0xF5F4,0xF5FB,0xF5FA,0xF4B8,0xF5F5,0xF0B6,0xF5FE,0xF5F3, + 0xF5F8,INVALC,0xF5FC,0xF5F2,INVALC,0xF74A,0xC4F5,0xF5F9, + INVALC,INVALC,0xF7F4,0xF74B,0xF749,0xF747,0xF748,0xF74C, + INVALC,0xC5D9,0xF7F2,0xF7F0,0xF7F5,0xF7F3,INVALC,0xF7F6, + 0xC5DA,0xF7F1, + /* Range 0x8646 - 0x8656, array index: 0x3312 */ + 0xF945,0xF946,0xF947,INVALC,INVALC,0xF9C7,0xF9BD,0xCA4F, + 0xAAEA,INVALC,0xAD68,INVALC,0xD3B8,0xD3B7,0xB040,0xB342, + 0xD77C, + /* Range 0x865B - 0x8674, array index: 0x3323 */ + 0xB5EA,0xB8B8,INVALC,0xB8B7,0xB8B9,INVALC,0xE3D4,0xE77E, + 0xEB58,0xEB5A,0xEB59,INVALC,0xC1AB,0xEE57,0xF0BA,0xF9A5, + 0xA6E4,INVALC,0xCDC9,0xCDCA,0xCDC8,0xCDC7,0xAAEB,INVALC, + 0xD0A9,0xD0A7, + /* Range 0x8677 - 0x867C, array index: 0x333D */ + 0xD0A6,INVALC,0xAD69,0xAD6B,0xAD6A,0xD0A8, + /* Range 0x8685 - 0x86AA, array index: 0x3343 */ + 0xD3C4,0xD3C1,0xD3BF,INVALC,INVALC,0xB041,0xD3C2,0xB046, + 0xD3BC,0xD3CB,INVALC,0xD3CD,0xD3BD,INVALC,0xB043,0xD3CE, + 0xD3C9,0xD3BB,0xD3C0,0xD3CA,0xD3C6,0xD3C3,INVALC,0xB048, + 0xD3CC,0xD3BE,INVALC,INVALC,0xD3C7,0xD3B9,0xB047,0xB044, + 0xD3C5,INVALC,0xD3C8,0xD3BA,0xB045,0xB042, + /* Range 0x86AF - 0x86CC, array index: 0x3369 */ + 0xB34C,0xD7A5,0xB34B,INVALC,0xD7A8,0xD7AB,0xB348,0xB346, + 0xD77E,0xD7A9,0xD7A7,0xD7A4,0xD7AC,0xD7AD,0xD7AF,0xD7B0, + 0xD77D,0xB345,0xD7A2,0xD7A1,0xD7AE,0xB347,0xD7A3,0xB349, + 0xB344,0xD7A6,0xB34D,INVALC,0xB34A,0xD7AA, + /* Range 0x86D0 - 0x86ED, array index: 0x3387 */ + 0xB5F1,0xDBBF,INVALC,0xDBB4,0xB5EE,INVALC,0xDFE7,0xDBBD, + 0xDBB1,0xB5EC,0xDBB6,0xB5EF,0xDBBA,0xDBB8,0xB5F2,0xB5EB, + INVALC,INVALC,0xDBB2,0xDBB5,0xB5F0,INVALC,0xDBB3,INVALC, + 0xDBBE,0xDBBC,0xDBB7,0xDBB9,0xDBBB,0xB5ED, + /* Range 0x86F5 - 0x86FB, array index: 0x33A5 */ + 0xDFE8,0xDFEE,0xDFE4,0xDFEA,0xB8BA,0xDFE6,0xB8C0, + /* Range 0x86FE - 0x8713, array index: 0x33AC */ + 0xB8BF,INVALC,0xB8BE,0xDFED,0xB8C1,0xB8C2,0xDFE3,0xDFF0, + 0xB8C3,0xB8BD,0xB8BC,0xDFEC,0xB8C4,0xDFE2,0xDFE5,0xDFEF, + 0xDFEB,INVALC,INVALC,0xE3F4,0xE3E9,0xB8BB, + /* Range 0x8718 - 0x8743, array index: 0x33C2 */ + 0xBB6A,0xE3DD,0xE3F2,0xE3DE,0xBB65,INVALC,0xE3DB,INVALC, + 0xE3E4,0xE3DC,0xBB67,0xE3D6,0xE3F1,0xBB68,0xE3EE,0xE3EF, + 0xE3D7,0xBB6D,0xE3E6,INVALC,0xE3E0,0xE3E7,0xE3DA,INVALC, + 0xE3F3,0xE3EB,0xE3E5,0xE3D5,0xBB69,0xE3EC,INVALC,0xBB6C, + 0xE3F0,INVALC,0xE3EA,0xBB66,0xE3E8,INVALC,0xE3E2,0xBB64, + 0xE3D9,0xE3E1,0xE3ED,0xE3DF, + /* Range 0x874C - 0x877B, array index: 0x33EE */ + 0xBDC1,0xDFE9,0xE7B2,0xE7BB,0xE7B1,0xE7AD,0xE7AA,0xBDC2, + 0xE7A8,0xBB6B,0xE7A1,0xBDC0,0xE7A7,0xBDBF,0xE7AC,0xE7A9, + 0xE7B9,0xE7B4,0xE7AE,0xE7B3,0xBDBB,0xE7AB,0xE7BE,0xE7A2, + 0xE7A3,0xE7BA,0xBDBC,0xE7BF,0xBDBE,0xE7C0,0xE7B0,0xE3D8, + 0xE7B6,0xE7AF,0xE7B8,0xE7B5,INVALC,INVALC,INVALC,0xE7A6, + 0xBDB9,0xE7BD,0xBDBA,0xE7A4,0xBDBD,0xEB64,0xE7B7,0xE7BC, + /* Range 0x8781 - 0x8789, array index: 0x341E */ + 0xEB61,0xBDB8,0xBFC0,0xEB6B,0xEB67,INVALC,0xEB65,0xEB60, + 0xEB6F, + /* Range 0x878D - 0x87A4, array index: 0x3427 */ + 0xBFC4,INVALC,0xEB5C,0xEB68,0xEB69,0xEB5F,0xEB5E,0xEB6C, + INVALC,0xEB62,0xEB5D,0xEB63,INVALC,0xEB6E,0xEB5B,0xEB6D, + 0xEB6A,0xBFC2,0xBFC1,INVALC,INVALC,0xBFC3,0xEB66,0xF0CB, + /* Range 0x87AA - 0x87CC, array index: 0x343F */ + 0xEE59,0xC1B1,0xEE5D,0xEE5A,0xEE61,0xEE67,0xEE5C,INVALC, + 0xEE70,0xC1AE,0xEE6A,0xEE5F,0xEE6B,0xEE66,0xEE6D,0xEE5E, + 0xC1B3,0xC1B2,0xEE60,0xEE6E,0xEE58,0xEE6C,0xC1AC,INVALC, + 0xEE64,0xEE63,0xEE68,0xEE5B,0xC1B0,INVALC,0xC1B4,0xEE62, + 0xEE69,0xC1B5,0xEE65, + /* Range 0x87D1 - 0x8844, array index: 0x3462 */ + 0xC1AD,0xC1AF,0xF0C7,0xF0C5,INVALC,INVALC,0xF0CC,0xF0C9, + 0xF0CD,INVALC,0xF0BE,0xF0C6,0xF0D1,0xEE6F,0xF0C2,0xC2CF, + 0xE7A5,0xF0BD,0xF0CA,0xF0C4,0xF0C1,0xF0BC,0xF0BB,0xF0D0, + INVALC,0xF0C0,0xF0BF,0xC2CD,0xF0C8,INVALC,0xC2CC,INVALC, + INVALC,0xC2CE,0xF0C3,0xF0CF,INVALC,0xF2DE,0xF2DF,INVALC, + 0xC3C9,0xF2DC,0xC3C6,0xF2E4,INVALC,0xC3CA,0xF2E6,0xF2DB, + 0xF0CE,0xF2E8,0xF2DD,INVALC,0xC3C7,0xF2E3,INVALC,0xF2E5, + 0xF2E0,0xF2E7,0xF2E2,0xF2E1,0xC3C8,INVALC,INVALC,0xF4C5, + 0xF4C6,INVALC,0xF4C8,0xC4AE,0xC4AF,0xF4C9,0xF4C7,INVALC, + 0xF4C4,INVALC,0xF642,0xF645,0xF641,INVALC,0xC4FA,0xF643, + 0xC4F9,0xC4F8,0xC4F7,0xF644,0xF751,0xF74F,INVALC,0xF74E, + 0xF640,0xF750,0xF646,0xF74D,INVALC,0xF7F9,0xF7D7,0xF7F7, + 0xC5DB,0xF7F8,0xF7FA,INVALC,0xF8BF,0xC5FA,0xF8BE,0xF8BD, + 0xC5FB,INVALC,0xC65A,0xF96E,0xF9A7,0xF9A6,0xF9A8,0xA6E5, + 0xD0AA,INVALC,0xD3CF,0xD3D0, + /* Range 0x8848 - 0x884E, array index: 0x34D6 */ + 0xDBC0,INVALC,0xF647,0xF8C0,0xA6E6,0xAD6C,0xD0AB, + /* Range 0x8852 - 0x8883, array index: 0x34DD */ + 0xD7B1,0xB34E,INVALC,0xDBC2,0xDBC1,0xB5F3,INVALC,0xB8C5, + 0xE7C1,0xBDC3,INVALC,0xBDC4,INVALC,INVALC,INVALC,0xBFC5, + 0xC5FC,0xA6E7,INVALC,INVALC,INVALC,0xD0AC,0xAAED,0xD0AE, + 0xD0AD,0xAD6D,INVALC,0xD3D1,INVALC,0xD3D8,0xB049,0xD3D6, + 0xD3D4,INVALC,0xD3DB,0xD3D2,0xD3D3,0xB04A,INVALC,0xB04E, + INVALC,INVALC,0xD3DC,0xB04D,0xD3DA,0xD3D7,0xD3D5,0xB04B, + 0xB04C,0xD3D9, + /* Range 0x8888 - 0x88AC, array index: 0x350F */ + 0xB350,0xD7B2,INVALC,0xB355,0xD7C2,0xB354,0xD7C4,INVALC, + INVALC,0xD7B8,0xB352,0xD7C3,INVALC,0xD7B3,0xB353,0xD7BF, + 0xD7BB,0xD7BD,0xD7B7,0xD7BE,INVALC,INVALC,0xB34F,0xD7BA, + INVALC,0xD7B9,0xD7B5,INVALC,0xD7C0,INVALC,INVALC,0xD7BC, + 0xD7B4,INVALC,0xD7B6,0xB351,0xD7C1, + /* Range 0x88B6 - 0x88C2, array index: 0x3534 */ + 0xDBC9,0xDBCB,0xDBC6,0xDBC5,0xDBC3,INVALC,0xDBCA,0xDBCC, + 0xDBC8,INVALC,0xDBC7,0xB5F4,0xB5F5, + /* Range 0x88C9 - 0x88E1, array index: 0x3541 */ + 0xDBCF,0xB8CD,0xDFF2,0xDFF8,0xDFF3,0xDFF4,INVALC,0xDFF9, + INVALC,0xB8CF,INVALC,0xB8C7,0xB8CE,0xDFF1,0xDBC4,0xB8CA, + 0xB8C8,0xDFF7,0xDFF6,0xB8C9,0xB8CB,0xDFF5,0xB8C6,INVALC, + 0xB8CC, + /* Range 0x88EB - 0x891A, array index: 0x355A */ + 0xE442,0xE441,INVALC,0xE3FB,0xBB76,0xE440,0xE3F7,0xE3F8, + 0xBB6E,0xBB70,INVALC,0xE3FD,0xE3F5,0xBB72,0xBB71,0xE3F9, + 0xE3FE,0xE3FC,0xBB73,0xE3FA,INVALC,INVALC,0xDBCE,0xBB6F, + INVALC,INVALC,0xE7C2,0xE7C9,0xBDC6,INVALC,0xE7CD,0xBDCA, + 0xE7C5,0xE7C3,INVALC,0xE7CC,INVALC,0xBDC5,0xE7CB,0xBDC7, + 0xBDC8,0xE7C4,0xBDC9,0xE7CA,0xE7C6,0xE7C7,0xE7C8,0xBB75, + /* Range 0x891E - 0x8946, array index: 0x358A */ + 0xEB70,0xEB7C,INVALC,0xBFCA,0xEB77,0xEB79,INVALC,0xBFC8, + 0xEB71,0xEB75,INVALC,0xEB78,0xBFC6,0xBFC9,0xEB7B,0xEB73, + 0xEB74,0xEB7A,0xEB72,0xEB76,0xBFC7,0xEE72,INVALC,0xEE71, + 0xC1B7,0xEE77,0xC1B9,INVALC,INVALC,0xC1B6,0xEE73,0xC1BA, + 0xEE74,INVALC,INVALC,0xEE75,0xEE78,INVALC,0xC1B8,INVALC, + 0xF0D6, + /* Range 0x894B - 0x8988, array index: 0x35B3 */ + 0xF0D3,0xF0D5,INVALC,INVALC,0xF0D4,0xF0D7,0xF0D8,0xEE76, + 0xF0D2,INVALC,INVALC,0xC3CD,0xF2EC,0xF2EF,0xF2F1,0xF2EA, + 0xF2EB,0xF2EE,0xF2F0,0xC3CE,0xC3CC,0xC3CB,0xF2ED,0xF2E9, + 0xF4CA,0xC4B0,INVALC,0xF4CB,INVALC,INVALC,0xF649,0xC4FB, + 0xF64B,0xC4FC,0xF648,0xF64A,0xC5A8,INVALC,0xF752,0xC5A7, + 0xF7FD,0xF7FC,INVALC,0xF7FB,INVALC,INVALC,0xF948,0xF949, + 0xF94B,0xF94A,INVALC,0xCA50,0xA6E8,INVALC,0xAD6E,0xD7C5, + 0xB5F7,INVALC,0xDFFA,0xC2D0,INVALC,0xF2F2, + /* Range 0x8993 - 0x89A6, array index: 0x35F1 */ + 0xB356,INVALC,0xDBD0,0xB5F8,0xDBD2,0xDBD1,INVALC,INVALC, + 0xDFFB,0xB8D0,0xE443,0xE446,0xE445,INVALC,0xE444,0xE7CE, + 0xE7D0,0xE7CF,INVALC,0xBFCC, + /* Range 0x89AA - 0x89AF, array index: 0x3605 */ + 0xBFCB,INVALC,0xC1BB,0xEE79,0xEE7B,0xEE7A, + /* Range 0x89B6 - 0x89C0, array index: 0x360B */ + 0xF2F4,0xF2F3,INVALC,0xF4CC,0xC4B1,INVALC,INVALC,0xC4FD, + 0xF754,0xF753,0xC65B, + /* Range 0x89D2 - 0x8A18, array index: 0x3616 */ + 0xA8A4,0xD0AF,0xAD6F,0xD7C8,0xD7C6,INVALC,INVALC,0xD7C7, + 0xDBD4,0xDBD5,0xE043,0xDBD3,INVALC,0xDFFC,0xE041,0xE040, + 0xE042,0xB8D1,0xDFFE,0xDFFD,0xE044,INVALC,0xE449,0xE447, + INVALC,0xE448,0xE7D3,0xE7D1,INVALC,INVALC,0xE7D2,0xEB7D, + 0xEE7C,0xEE7D,0xC2D2,INVALC,0xF2F5,0xF4CD,0xC4B2,INVALC, + 0xF64C,0xF755,0xC5A9,INVALC,0xF7FE,0xF94C,0xA8A5,INVALC, + 0xAD71,0xAD72,0xD0B0,INVALC,INVALC,0xD0B1,0xAD70,INVALC, + 0xB054,INVALC,0xB052,INVALC,0xB051,0xB058,0xB050,0xB059, + 0xD3DD,0xB056,INVALC,0xB053,0xB057,0xB055,0xB04F, + /* Range 0x8A1B - 0x8A27, array index: 0x365D */ + 0xB35F,INVALC,0xB359,0xD7CC,0xB35E,INVALC,INVALC,0xB360, + 0xB35A,INVALC,0xB35B,INVALC,0xD7CA, + /* Range 0x8A39 - 0x8A5B, array index: 0x366A */ + 0xDBD8,0xB645,0xB5F9,0xB5FD,INVALC,0xB8E4,0xE049,0xDBDA, + 0xB5FE,INVALC,INVALC,0xDBDD,0xDBDE,0xB643,INVALC,0xDBE0, + INVALC,0xDBE2,INVALC,0xDBE3,0xDBD7,0xDBD6,0xDBE4,0xB642, + 0xDBE1,0xDBDF,INVALC,0xB640,0xB5FB,0xB647,0xDBDB,0xDBDC, + 0xDBD9,INVALC,0xB641, + /* Range 0x8A5E - 0x8A63, array index: 0x368D */ + 0xB5FC,INVALC,0xB5FA,0xE048,0xB8DF,0xB8DA, + /* Range 0x8A68 - 0x8A7C, array index: 0x3693 */ + 0xB8E5,0xB8D6,INVALC,0xB8D2,0xB8E1,0xB8DE,0xB8E0,INVALC, + 0xB8D7,0xB8DC,0xB8D3,0xB8D4,0xE050,0xE04D,0xE045,0xE04A, + INVALC,0xB8E2,0xE051,0xB8E3,0xB8D9, + /* Range 0x8A7F - 0x8A9A, array index: 0x36A8 */ + 0xE047,INVALC,0xE04F,0xE04B,0xE04E,0xE04C,0xB8DD,0xE046, + 0xB8D8,INVALC,INVALC,INVALC,0xE44C,0xBB78,0xBB7B,INVALC, + 0xE44E,INVALC,0xBBA5,0xE44D,0xBB7D,INVALC,0xBDCF,0xE44F, + INVALC,0xBBA4,0xE44B,0xBBA6, + /* Range 0x8AA0 - 0x8AAB, array index: 0x36C4 */ + 0xB8DB,0xBB7C,INVALC,0xBB7A,0xBB7E,0xBBA2,0xBB77,0xBBA7, + 0xBBA3,INVALC,0xBBA1,0xE44A, + /* Range 0x8AB6 - 0x8AE8, array index: 0x36D0 */ + 0xBDD9,INVALC,0xE7D6,0xBDDA,0xE7E2,0xE7DB,0xBDCB,0xE7E3, + 0xE7DD,0xBDD5,0xE7DE,INVALC,0xBDD4,0xE7E1,0xBDCE,0xE7DF, + 0xE7D5,0xBDCD,0xEBAA,0xBDD3,INVALC,0xBDD0,INVALC,0xBDD8, + INVALC,0xE7D4,INVALC,0xE7D8,0xBDCC,0xE7D7,0xE7D9,0xE7DA, + 0xBDD7,0xE7DC,0xE7E0,0xE7E4,INVALC,0xBDDB,0xBFD2,0xEBA5, + 0xEBAB,0xEBA8,0xEB7E,0xEBAC,0xEBA1,INVALC,0xEBA7,INVALC, + 0xBFCD,0xBFD3,0xEBAD, + /* Range 0x8AEB - 0x8B60, array index: 0x3703 */ + 0xBFCF,INVALC,0xBFD9,0xBFD4,0xEBAF,0xEBA9,0xBFD0,0xEBA2, + 0xBFDA,0xEBA3,0xEBA4,0xBFDB,0xBFD8,0xBDD1,INVALC,0xBFCE, + 0xEBB0,0xBFDC,INVALC,0xBFD5,0xEBAE,0xBFD1,0xBFD6,0xBFD7, + INVALC,0xC1C3,0xEEA4,0xEEAD,0xEEAA,0xEEAC,INVALC,0xC1C0, + 0xEEA5,INVALC,0xEEAB,0xC1BC,0xEEA7,0xC1C4,0xEEA3,0xEEA8, + 0xEEAF,0xEBA6,0xEEA9,0xEEA2,0xC1BD,0xEEA1,0xC1BE,0xEEB0, + 0xC1BF,0xEEAE,0xC1C2,0xEE7E,INVALC,0xC1C1,INVALC,0xEEA6, + 0xF0DC,0xF0EA,0xF0E5,0xF0E7,0xF0DB,0xC2D3,INVALC,0xF0DA, + 0xC2D6,0xC2D5,INVALC,0xF0E9,0xF0E1,0xF0DE,0xF0E4,INVALC, + 0xF0DD,INVALC,0xF0DF,0xF0E8,0xF0E6,INVALC,0xC2D4,0xF0ED, + 0xF0EB,0xF0E2,0xF0EC,0xF0E3,INVALC,0xF2F9,0xC3CF,0xF341, + INVALC,INVALC,0xF64F,0xC3D6,0xF0E0,0xF2F7,0xC3D2,0xF2F8, + 0xF2FD,INVALC,INVALC,0xC3D4,0xC3D5,0xF2F6,0xF340,0xF342, + 0xF2FA,0xF2FC,0xF2FE,0xF2FB,0xF343,0xC3D1,0xC3D7,0xC3D3, + INVALC,0xC3D0,0xF4D0,INVALC,0xC4B7,0xF4CE, + /* Range 0x8B63 - 0x8B70, array index: 0x3779 */ + 0xF4D2,INVALC,0xF4D3,0xC4B5,0xF4D4,0xF4D1,INVALC,0xF4CF, + 0xC4B8,0xC4B4,0xF4D5,INVALC,0xC4B6,0xC4B3, + /* Range 0x8B77 - 0x8B9F, array index: 0x3787 */ + 0xC540,0xF64E,0xF64D,0xF650,0xF651,INVALC,0xC541,0xF756, + 0xF75B,0xC5AA,INVALC,0xF758,INVALC,0xF757,0xF75A,0xF759, + INVALC,0xF843,INVALC,0xC5DC,0xF842,0xF840,INVALC,0xF841, + INVALC,INVALC,INVALC,0xC5FE,0xC5FD,0xF8C1,0xF8C2,0xC640, + INVALC,0xF94D,0xF94E,0xC667,INVALC,0xC66D,INVALC,0xF9A9, + 0xF9C8, + /* Range 0x8C39 - 0x8C57, array index: 0x37B0 */ + 0xD7CD,INVALC,0xD7CE,0xE052,0xE450,0xE7E5,0xC1C6,INVALC, + 0xC1C5,0xF0EE,0xF344,INVALC,0xF844,0xA8A7,0xD3DE,0xB05A, + 0xB361,0xE054,0xE053,0xBDDC,0xE7E6,0xBDDD,0xEEB1,0xC2D7, + INVALC,INVALC,INVALC,0xC676,0xA8A8,0xCDCB,0xD3DF, + /* Range 0x8C61 - 0x8CCC, array index: 0x37CF */ + 0xB648,0xB8E6,INVALC,0xE056,0xE055,0xE057,INVALC,0xE451, + 0xE452,0xBBA8,0xBFDD,0xBDDE,0xBFDE,INVALC,0xEEB5,0xEEB2, + 0xEEB4,0xEEB3,0xC1C7,INVALC,0xF0EF,0xF346,0xF345,0xCBA4, + 0xB05C,0xB05B,0xD3E0,INVALC,0xD7D1,INVALC,INVALC,0xDBE7, + 0xDBE6,0xB649,INVALC,0xE059,0xE05A,0xE058,INVALC,INVALC, + 0xB8E8,0xB8E7,INVALC,0xBBAA,0xBBA9,INVALC,0xE7E7,0xEBB3, + 0xEBB1,0xEBB2,0xBFDF,0xEEB7,0xEEB6,INVALC,0xF0F2,0xF0F1, + 0xF0F0,0xF347,INVALC,0xF9AA,0xA8A9,0xAD73,INVALC,0xAD74, + 0xB05D,0xB05E,0xD3E2,0xD3E1,0xD7D2,INVALC,0xB368,0xB366, + 0xB363,0xB367,0xB365,0xB364,INVALC,INVALC,0xB64A,0xDBEA, + INVALC,0xB8ED,0xB64C,0xB651,0xDBEC,0xB653,0xB652,0xB655, + 0xDBEB,0xDBE8,0xB64F,0xB64B,0xB64D,0xDBE9,0xB654,0xB650, + 0xB64E,0xB8EF,0xB8EE,0xB8EC,0xB8F0,INVALC,0xB8EA,0xB8EB, + INVALC,0xB8E9,INVALC,0xE05B, + /* Range 0x8CCF - 0x8D0A, array index: 0x383B */ + 0xE454,INVALC,0xBBAC,0xBBAD,0xBBAB,INVALC,0xE453,INVALC, + 0xE455,INVALC,0xE7EA,0xE7EC,INVALC,0xBDE7,0xE7ED,0xBDE0, + 0xE7E9,0xBDDF,0xBDE9,0xBDE5,0xBDE6,0xBDE2,0xE7E8,0xBDE1, + 0xE7EE,0xE7EB,INVALC,0xBDE8,INVALC,0xBDE3,0xBDE4,0xEBB5, + INVALC,0xEBB7,0xEBB6,INVALC,0xEBB8,0xBFE0,0xEBB4,INVALC, + INVALC,0xC1CB,0xEEB8,0xC1C8,0xC1CC,0xC1CA,0xC1C9,0xF0F3, + INVALC,0xF0F6,INVALC,0xF0F5,INVALC,0xF0F4,0xC2D8,0xF348, + 0xF349,0xC3D8,0xF34A,0xC3D9, + /* Range 0x8D0F - 0x8D1B, array index: 0x3877 */ + 0xC4B9,0xF652,INVALC,INVALC,0xC542,0xF653,0xF75C,0xC5AB, + 0xC5AC,INVALC,0xF845,INVALC,0xC642, + /* Range 0x8D64 - 0x8D85, array index: 0x3884 */ + 0xA8AA,INVALC,0xB36A,0xB369,0xE05C,0xE05D,INVALC,0xBBAE, + 0xEBB9,0xBDEA,0xEBBA,0xEEB9,0xA8AB,INVALC,0xD0B2,0xAD76, + 0xAD75,INVALC,0xD3E3,0xB05F,0xD3E4,0xD7D5,INVALC,0xD7D4, + INVALC,0xD7D3,INVALC,INVALC,0xDBEE,0xB658,INVALC,INVALC, + 0xDBED,0xB657, + /* Range 0x8D89 - 0x8D96, array index: 0x38A6 */ + 0xDBEF,0xB656,INVALC,0xE05F,0xE062,0xE060,0xE061,0xE065, + 0xE05E,0xE066,0xE063,0xE064,0xBBB0,0xE456, + /* Range 0x8D9B - 0x8DF4, array index: 0x38B4 */ + 0xE7F2,0xE7F0,INVALC,INVALC,0xBDEB,0xE7EF,0xE7F1,INVALC, + 0xBDEC,INVALC,0xEBBB,INVALC,0xEBBC,0xC1CD,INVALC,0xF34C, + 0xF34E,0xF34B,0xF34D,0xF4D6,0xF654,INVALC,INVALC,0xF96F, + 0xA8AC,0xAD77,0xD3E5,0xD3E7,0xD3E6,INVALC,0xD7D8,0xB36C, + INVALC,0xD7D6,INVALC,0xB36B,0xD7D9,INVALC,0xD7DA,0xD7D7, + INVALC,INVALC,0xDBFB,0xB660,0xDBF3,0xDBF9,INVALC,INVALC, + 0xB65B,0xB65E,0xDBF2,0xB659,0xDBF6,0xE06C,0xB65D,INVALC, + 0xDBF1,INVALC,0xDBF7,0xDBF4,0xDBFA,0xDBF0,0xDBF8,0xB65C, + 0xB65F,0xDBF5,0xB65A,INVALC,0xB8F2,0xE068,0xB8F1,0xE06F, + 0xE06E,0xB8F8,INVALC,0xB8F9,0xE070,0xB8F3,0xE06D,0xB8F7, + 0xE072,0xE069,INVALC,0xE06B,0xB8F4,0xE067,0xE06A,0xE071, + 0xB8F5,0xE073, + /* Range 0x8DFA - 0x8E0A, array index: 0x390E */ + 0xB8F6,INVALC,0xBBB1,0xE45B,0xE461,0xE459,0xE462,INVALC, + 0xE458,0xE45D,0xE463,0xE460,0xE45F,0xE45E,INVALC,0xE457, + 0xE45C, + /* Range 0x8E0D - 0x8E2B, array index: 0x391F */ + 0xE45A,INVALC,0xBDF1,0xBDEE,0xE7FB,0xE841,0xE843,0xE840, + 0xE7F8,0xE7FA,0xE845,0xE842,0xE7FC,0xE846,0xE7F9,0xE844, + 0xBDEF,0xBDF5,0xBDF3,0xE7F3,0xBDF4,0xBDF0,0xE7F4,0xE7F6, + 0xE7F5,0xE7FD,0xE7FE,INVALC,0xBDF2,INVALC,0xBDED, + /* Range 0x8E30 - 0x8E7C, array index: 0x393E */ + 0xEBC6,0xBFE2,INVALC,0xEBBD,0xBFE3,0xBFE6,0xEBC2,INVALC, + 0xEBBF,0xBFE5,INVALC,INVALC,0xEBC3,0xEBC4,0xEBBE,0xEBC7, + 0xEBC0,0xEBC5,0xBFE4,INVALC,0xBFE1,0xEBC1,INVALC,0xEEBF, + 0xC1D0,0xC1CE,0xC1D1,0xC1CF,0xEEBE,0xEEBB,0xEEBA,INVALC, + 0xEEBD,INVALC,INVALC,0xEEBC,0xF145,0xC2DE,0xF0FB,0xF0FA, + INVALC,0xC2D9,0xF141,0xF140,0xF0F7,0xF143,0xF0FC,0xC2DD, + 0xF0F9,0xF142,0xF0F8,0xC2DA,0xC2DC,0xF0FD,0xC2DB,0xF0FE, + INVALC,0xF144,0xF352,INVALC,0xC3DE,0xF34F,INVALC,0xF353, + INVALC,INVALC,0xC3DB,0xF351,0xC3E0,INVALC,0xC3DD,INVALC, + 0xF350,INVALC,0xC3DF,0xF354,0xC3DA, + /* Range 0x8E81 - 0x8EAC, array index: 0x398B */ + 0xC4BC,0xC4BE,INVALC,0xF4D9,0xC4BD,0xF4D7,0xC3DC,0xF4D8, + 0xC4BB,0xC543,0xC545,0xF656,0xC544,0xF655,INVALC,0xF761, + 0xC5AD,0xF760,0xC5AE,0xF75E,0xF75D,0xF762,0xF763,0xF846, + INVALC,0xF75F,INVALC,INVALC,0xF8C6,0xF8C3,0xF8C4,0xF8C5, + 0xC65C,INVALC,0xF951,0xF950,0xF94F,0xF970,INVALC,0xF9BE, + 0xF9AB,0xC66E,0xA8AD,0xB060, + /* Range 0x8EC9 - 0x8F64, array index: 0x39B7 */ + 0xF9AC,0xA8AE,0xAAEE,0xAD79,0xAD78,INVALC,0xB063,INVALC, + 0xD3E8,0xB061,0xD3E9,0xB062,INVALC,INVALC,0xD7DF,0xD7DB, + INVALC,INVALC,0xB36D,0xD7DE,0xD7DD,0xD7DC,0xB36E,0xD7E0, + 0xD7E1,INVALC,INVALC,INVALC,0xDC43,0xDC41,0xDC45,0xDC46, + 0xDC4C,INVALC,0xDC48,0xDC4A,INVALC,0xDC42,0xDBFC,INVALC, + 0xDC49,INVALC,INVALC,0xDC4B,0xDC44,0xDC47,0xDBFD,0xB662, + 0xDC40,0xDBFE,0xB661,0xB663,INVALC,0xB8FD,0xE075,0xE077, + 0xE076,0xE07B,0xB8FB,INVALC,0xE078,0xE074,0xE079,0xE07A, + 0xB8FC,0xB8FE,0xE07C,INVALC,0xE467,0xE466,INVALC,0xE464, + 0xE465,0xBBB3,0xBBB5,0xBBB2,0xBBB4,0xE84D,0xE84E,0xE849, + INVALC,0xE84A,0xBDF8,0xBDFD,0xBDF7,0xBDFE,0xBDF9,0xE84B, + INVALC,INVALC,0xE84C,0xE848,0xBE40,0xBDFB,INVALC,INVALC, + 0xBDFA,0xBDFC,INVALC,0xE847,INVALC,0xEBCA,0xBFE8,INVALC, + INVALC,0xEBCC,0xBFEA,0xEBCF,0xEBCB,0xEBC9,0xEBCE,0xBFE9, + 0xEBCD,INVALC,0xBFE7,INVALC,INVALC,0xC1D3,0xC1D6,0xEEC1, + INVALC,0xC1D4,0xEEC0,0xC1D2,0xC1D5,0xF146,0xF147,0xF148, + 0xC2E0,INVALC,0xF149,INVALC,0xC2E1,0xC3E2,0xF358,0xF359, + 0xF357,0xF356,0xF35A,0xC3E1,0xF4DD,0xF4DB,0xF4DC,0xF4DE, + 0xF4DA,0xF4DF,0xF658,INVALC,0xF659,0xF657,0xC546,0xF764, + 0xC5AF,0xF765,0xF848,0xF847, + /* Range 0x8FAD - 0x8FB4, array index: 0x3A53 */ + 0xC3E3,0xC47C,0xC547,0xA8B0,0xB064,0xB941,INVALC,0xF35B, + /* Range 0x8FC2 - 0x8FC6, array index: 0x3A5B */ + 0xA8B1,INVALC,0xA8B4,0xA8B3,0xA8B2, + /* Range 0x8FCD - 0x8FD7, array index: 0x3A60 */ + 0xCDCF,0xAAEF,INVALC,INVALC,0xAAF1,0xCDCC,0xCDCE,0xAAF0, + 0xCDD1,0xCDD0,0xCDD2, + /* Range 0x8FE0 - 0x9006, array index: 0x3A6B */ + 0xD0B6,0xD0B4,0xAD7C,0xD0B3,0xADA3,0xAD7E,0xAD7B,INVALC, + 0xADA4,INVALC,0xAD7D,0xADA2,INVALC,0xADA1,0xD0B5,INVALC, + 0xAD7A,INVALC,INVALC,INVALC,0xB06A,0xD3EB,0xD3F1,0xB067, + 0xB06E,INVALC,0xB069,0xD3EE,0xD3F0,0xB06C,0xD3EA,0xD3ED, + 0xB068,0xB065,0xD3EC,0xB06B,0xD3EF,0xB06D,0xB066, + /* Range 0x900B - 0x9024, array index: 0x3A92 */ + 0xD7E3,0xD7E6,0xB370,INVALC,0xB37A,0xB376,0xD7E4,INVALC, + INVALC,0xB37E,0xB377,0xB37C,0xB372,INVALC,0xB36F,0xB371, + 0xB37D,0xD7E5,0xB375,0xB378,0xB374,0xB379,0xD7E7,0xB37B, + 0xB373,0xD7E2, + /* Range 0x902D - 0x9044, array index: 0x3AAC */ + 0xDC4D,0xB665,0xDC4F,INVALC,0xB667,0xB669,INVALC,0xDC4E, + 0xB666,0xB66A,INVALC,0xB668,INVALC,INVALC,INVALC,0xB947, + 0xE0A3,0xB94F,0xE07E,INVALC,0xB950,0xB945,INVALC,0xE0A1, + /* Range 0x9047 - 0x90A7, array index: 0x3AC4 */ + 0xB94A,INVALC,0xE0A2,0xB943,0xB942,INVALC,0xB94D,0xB94C, + 0xB94B,0xB949,0xB94E,0xE07D,0xB944,0xB946,0xB948,INVALC, + INVALC,0xBBB8,0xBBBB,INVALC,0xBBBF,0xBBB9,0xBBBE,0xBBBC, + INVALC,0xBBB7,INVALC,0xBBBD,0xBBBA,INVALC,INVALC,INVALC, + 0xE852,0xBE43,0xBE41,INVALC,0xE853,INVALC,0xBE44,0xBE42, + 0xE851,0xE850,INVALC,0xBFF0,0xE84F,0xBFEE,0xBFED,0xEBD0, + 0xBE45,0xBFEF,0xEBD1,0xBFF2,0xEBD2,0xBFF1,0xC1D8,0xEEC3, + 0xC1D7,0xC1DC,0xC1DA,0xC1DB,0xC2E3,0xC1D9,0xEEC2,0xEBD3, + 0xC2E2,0xC2E4,INVALC,0xC3E4,0xC3E5,INVALC,0xF4E0,INVALC, + 0xC5DE,0xC5DD,0xA8B6,INVALC,INVALC,0xCA55,0xB06F,INVALC, + 0xCA52,0xCA53,0xCA51,INVALC,0xCA54,INVALC,INVALC,0xCBAA, + 0xCBA7,0xCBAC,0xCBA8,0xA8B7,0xA8BA,INVALC,0xCBA9,0xA8B9, + 0xCBAB, + /* Range 0x90AF - 0x90B8, array index: 0x3B25 */ + 0xCDD5,0xCDD7,0xAAF4,0xCDD3,0xCDD6,0xCDD4,0xAAF2,0xAAF5, + INVALC,0xAAF3, + /* Range 0x90BD - 0x90CB, array index: 0x3B2F */ + 0xD0B8,0xD0BC,0xD0B9,INVALC,0xADA7,INVALC,0xADA8,INVALC, + 0xD0BB,INVALC,0xD0BD,0xD0BF,INVALC,0xADA5,0xD0BE, + /* Range 0x90D4 - 0x915A, array index: 0x3B3E */ + 0xD7EE,0xD0BA,0xD3F2,0xD3FB,0xD3F9,0xD3F4,0xD3F5,0xD3FA, + 0xD3FC,0xB071,INVALC,0xD3F7,0xD3F3,0xB070,0xB072,0xD3F6, + 0xD3FD,0xD3F8,INVALC,INVALC,0xB3A1,0xD7F1,0xD7E9,0xD7EF, + 0xD7F0,0xB3A2,INVALC,0xD7E8,0xD7EA,0xD0B7,0xD7EC,0xD7ED, + 0xD7EB,0xB66C,INVALC,INVALC,INVALC,0xDC56,0xEBD4,0xDC57, + 0xDC54,0xB3A3,0xB66E,0xDC53,0xDC59,0xDC58,0xB66B,0xDC5C, + 0xDC52,0xDC5B,0xDC50,0xDC5A,0xDC55,0xB66D,INVALC,0xE0AA, + INVALC,0xE0A5,0xE0AB,0xE0A6,0xE0A4,0xE0A7,0xB951,INVALC, + 0xE0A9,INVALC,0xE0A8,0xB952,0xBBC1,0xBBC0,0xE46E,0xE471, + 0xE469,0xE46D,0xBBC2,0xE46C,0xE46A,0xE470,0xE46B,0xE468, + 0xE46F,INVALC,0xE859,0xBE48,0xF14A,0xE856,0xE857,0xE855, + 0xDC51,0xBE47,0xE85A,0xE854,0xBE46,0xBE49,0xE858,0xEBD5, + 0xBFF3,0xEBD6,0xEBD7,INVALC,0xEEC4,0xC1DD,0xF14B,0xF14C, + INVALC,INVALC,0xF14D,0xF35D,0xF35C,0xF4E2,INVALC,0xF4E1, + 0xF65B,0xF65C,0xF65A,0xF766,0xC5B0,0xA8BB,0xADAA,0xADA9, + 0xB075,0xB074,0xD440,0xD441,0xD3FE,INVALC,0xB073,0xD7F5, + INVALC,0xD7F6,0xD7F2,0xB3A4,0xD7F3,INVALC,0xD7F4, + /* Range 0x915F - 0x917A, array index: 0x3BC5 */ + 0xDC5F,0xDC61,0xDC5D,0xDC60,0xB66F,0xDC5E,0xB670,INVALC, + INVALC,0xDD73,0xB955,0xB954,INVALC,0xB953,INVALC,0xE0AC, + 0xE0AD,INVALC,INVALC,0xE473,0xE475,0xBBC6,0xBBC3,INVALC, + 0xBBC5,0xBBC4,0xE474,0xE472, + /* Range 0x9180 - 0x9193, array index: 0x3BE1 */ + 0xE861,0xE85E,0xE85F,0xBE4D,0xE860,0xE85B,0xE85C,0xBE4A, + INVALC,0xBE4B,0xE85D,0xBE4C,INVALC,0xEBDB,INVALC,0xEBDC, + 0xEBD9,0xEBDA,0xBFF4,0xEBD8, + /* Range 0x9199 - 0x91DD, array index: 0x3BF5 */ + 0xEEC8,0xEEC5,0xEEC7,0xC1E0,0xEECB,0xC1DF,0xEEC9,0xEECC, + 0xEECA,0xEEC6,0xC1DE,INVALC,0xF14F,INVALC,0xF150,0xF14E, + INVALC,0xF152,0xC2E5,0xC2E6,0xF35F,0xC3E7,0xF151,0xF35E, + 0xC3E6,0xF4E5,0xF4E6,0xC4BF,0xF4E4,INVALC,0xF4E3,INVALC, + 0xF65D,0xC548,INVALC,0xF849,0xF8C8,0xF8C7,INVALC,0xC643, + 0xC65D,0xF8C9,0xF971,INVALC,0xC66F,0xA8BC,0xAAF6,INVALC, + 0xB956,INVALC,0xC4C0,0xA8BD,0xADAB,0xB3A5,0xB671,0xC2E7, + 0xAAF7,INVALC,0xD0C1,0xD0C0,0xD442,INVALC,0xB078,0xB076, + 0xB07A,0xD444,INVALC,0xB079,0xB077, + /* Range 0x91E2 - 0x91EE, array index: 0x3C3A */ + 0xD443,0xB3A8,0xD7FC,INVALC,0xB3A7,0xB3A9,0xD842,0xB3AB, + 0xD7FE,0xD840,0xD7F7,0xB3AA,0xD843, + /* Range 0x91F1 - 0x91F9, array index: 0x3C47 */ + 0xD7F9,INVALC,0xD7FA,0xD7F8,0xB3A6,INVALC,0xD841,0xD7FB, + 0xD7FD, + /* Range 0x91FD - 0x921E, array index: 0x3C50 */ + 0xDC6D,INVALC,0xDC6C,0xDC6A,0xDC62,0xDC71,0xDC65,0xDC6F, + 0xDC76,0xDC6E,0xB679,INVALC,0xB675,0xDC63,INVALC,0xDC69, + 0xB677,INVALC,0xDC68,0xB678,0xB67A,0xDC6B,INVALC,0xB672, + 0xB673,0xDC77,0xDC75,INVALC,0xDC74,0xDC66,INVALC,0xDC72, + INVALC,0xB676, + /* Range 0x9223 - 0x9227, array index: 0x3C72 */ + 0xB674,0xDC73,0xDC64,0xDC67,0xDC70, + /* Range 0x922D - 0x9240, array index: 0x3C77 */ + 0xE4BA,0xE0B7,INVALC,0xE0B0,0xE0C3,0xE0CC,0xE0B3,0xB961, + INVALC,0xE0C0,0xB957,0xB959,0xB965,0xE0B1,INVALC,INVALC, + 0xB95A,0xB95C,0xB966,0xB95B, + /* Range 0x9245 - 0x925B, array index: 0x3C8B */ + 0xB964,0xE0B9,INVALC,0xE0AE,0xB962,0xE0B8,0xB95E,0xE0CA, + 0xB963,0xE0C8,0xE0BC,0xE0C6,0xB960,0xE0AF,0xE0C9,0xE0C4, + INVALC,0xE0CB,0xB958,INVALC,INVALC,0xB967,0xB95D, + /* Range 0x9260 - 0x9267, array index: 0x3CA2 */ + 0xE0BD,0xE0C1,INVALC,0xE0C5,0xB95F,0xE0B4,0xE0B2,0xE0BE, + /* Range 0x926C - 0x9272, array index: 0x3CAA */ + 0xE0BB,0xE0BA,INVALC,0xE0BF,0xE0C2,INVALC,0xE0C7, + /* Range 0x9276 - 0x928E, array index: 0x3CB1 */ + 0xE478,INVALC,0xBBC7,0xE4A4,0xE47A,0xBBCC,0xBBD0,0xE4AD, + 0xE4B5,0xE4A6,0xBBC8,INVALC,0xE4AA,0xE0B6,INVALC,0xBBC9, + 0xE4B1,0xE4B6,0xE4AE,INVALC,0xE4B0,0xE4B9,0xE4B2,0xE47E, + 0xE4A9, + /* Range 0x9291 - 0x92AC, array index: 0x3CCA */ + 0xBBD1,INVALC,0xBBCD,0xE47C,0xE4AB,0xBBCB,0xE4A5,0xBBCA, + 0xE4B3,0xE4A2,0xE479,0xBBCE,0xE4B8,INVALC,INVALC,0xE47B, + 0xE4AF,0xE4AC,0xE4A7,0xE477,0xE476,0xE4A1,0xE4B4,0xBBCF, + 0xE4B7,0xE47D,0xE4A3,0xBE52, + /* Range 0x92B2 - 0x92B7, array index: 0x3CE6 */ + 0xBE5A,0xBE55,0xE8A4,0xE8A1,0xE867,0xBE50, + /* Range 0x92C0 - 0x92E1, array index: 0x3CEC */ + 0xE865,0xBE54,0xE871,0xE863,0xE864,0xBE4E,0xE8A3,0xBE58, + 0xE874,0xE879,0xE873,0xEBEE,0xE86F,0xE877,0xE875,0xE868, + 0xE862,0xE87D,0xBE57,0xE87E,INVALC,0xE878,INVALC,0xE86D, + 0xE86B,0xE866,INVALC,INVALC,INVALC,0xE86E,0xE87B,0xE86A, + 0xE87A,0xE8A2, + /* Range 0x92E4 - 0x92F1, array index: 0x3D0E */ + 0xBE53,INVALC,0xE876,0xE87C,0xE872,0xE86C,0xBE51,INVALC, + INVALC,INVALC,0xE4A8,0xE870,0xBE59,0xE869, + /* Range 0x92F7 - 0x9339, array index: 0x3D1C */ + 0xEBF4,0xBFF7,0xEBF3,0xEBF0,0xEC44,0xBFFB,INVALC,0xEC41, + 0xEBF8,0xEC43,0xEBE9,0xEBF6,INVALC,0xBFFD,INVALC,0xEBE1, + INVALC,0xEBDF,0xEC42,INVALC,0xEC40,0xEBFE,0xEBED,0xEBEC, + 0xEBE2,0xC040,INVALC,0xEBE8,0xEBF2,0xEBFD,0xC043,0xEC45, + INVALC,0xC1E8,0xC045,0xBFFE,0xEBE6,INVALC,0xEBEF,0xEBDE, + 0xEBE0,0xBFF5,0xC042,0xBFFA,0xEBE7,0xEBF7,0xEBF1,0xC041, + 0xEBDD,0xC1E3,0xEBF9,0xEBFC,0xBFFC,INVALC,0xEBEB,0xC044, + 0xBFF9,INVALC,INVALC,INVALC,0xBFF8,0xEBF5,0xEBFB,0xBFF6, + INVALC,0xEBE4,0xEBFA, + /* Range 0x9346 - 0x9367, array index: 0x3D5F */ + 0xEBEA,0xEED2,INVALC,0xEED7,0xC1E5,0xC1E7,0xEEDD,0xC1E1, + 0xEEEC,0xEEE3,0xEED8,0xEED9,0xEEE2,INVALC,0xC1EE,0xEEE1, + 0xEED1,0xEEE0,0xEED4,0xEEED,0xC1ED,0xC1EB,0xEED5,INVALC, + 0xEEE8,INVALC,0xEEDA,0xEEE7,INVALC,0xEEE9,0xEED0,0xC1E6, + INVALC,0xEEEA, + /* Range 0x9375 - 0x9383, array index: 0x3D81 */ + 0xC1E4,0xEED6,0xEEE5,INVALC,0xEEDF,0xEBE3,0xEEE6,0xEED3, + INVALC,0xC1E9,INVALC,0xEEEB,INVALC,0xC1E2,0xEECE, + /* Range 0x9388 - 0x93B7, array index: 0x3D90 */ + 0xF160,0xF159,0xC2E9,INVALC,0xF154,0xF163,0xF15B,0xEEDC, + INVALC,0xF165,0xF155,INVALC,0xC2E8,0xF15F,0xC2EA,0xC2F2, + 0xC2F0,0xF161,0xC2F1,0xF157,INVALC,0xF158,0xF15D,0xF162, + INVALC,0xEECD,0xC2EB,0xF16A,0xF167,0xF16B,0xF15E,0xF15A, + 0xF168,0xF36A,0xF15C,INVALC,0xC2EE,INVALC,0xC2ED,0xEECF, + 0xC2EF,0xF164,0xF166,0xC2EC,0xF169,0xF153,INVALC,0xF156, + /* Range 0x93C0 - 0x93E8, array index: 0x3DC0 */ + 0xF373,INVALC,0xF363,0xC3EB,0xF371,INVALC,INVALC,0xF361, + 0xC3EC,INVALC,0xF36C,INVALC,0xF368,0xC3F1,0xF372,0xF362, + 0xF365,0xC3E9,0xF374,INVALC,0xF36D,0xF370,0xC3EF,0xC3F4, + 0xC3F2,0xF369,0xF364,INVALC,0xC3ED,0xC3EE,0xF360,0xC3EA, + INVALC,0xC3E8,0xC3F0,0xF36F,0xC3F3,INVALC,0xF36B,0xF375, + 0xC3F5, + /* Range 0x93F5 - 0x9400, array index: 0x3DE9 */ + 0xF4F3,0xF542,0xF4F5,0xF4FC,0xF366,0xF4FA,0xF4E9,0xF540, + 0xC4C3,0xF4ED,0xF4FE,0xF4F4, + /* Range 0x9406 - 0x9419, array index: 0x3DF5 */ + 0xF544,0xF4F6,INVALC,0xF4FB,0xF4FD,0xF4E7,0xF541,0xF4F2, + 0xF4F7,0xF4EB,0xF4EF,0xF543,0xF4F9,0xF4E8,0xF4EC,0xF4EE, + 0xF4F8,INVALC,0xC4C1,0xF4F1, + /* Range 0x9428 - 0x9452, array index: 0x3E09 */ + 0xF4F0,0xF661,0xF666,0xC54F,0xF668,INVALC,0xC549,INVALC, + 0xF664,0xF66A,0xC54E,0xC54A,INVALC,0xC54B,0xF660,0xF667, + 0xC54D,0xF665,0xC54C,0xF65F,0xF663,0xF662,INVALC,0xF65E, + 0xF669,INVALC,INVALC,INVALC,0xC5B1,0xF76D,0xF770,0xF76C, + 0xF76E,0xF76F,0xF769,0xF76A,0xF767,INVALC,INVALC,0xF76B, + 0xF768,0xC5B2,0xC5B3, + /* Range 0x9460 - 0x9483, array index: 0x3E34 */ + 0xC5E0,INVALC,0xF84A,0xC5DF,0xC5E1,INVALC,INVALC,INVALC, + 0xF8CB,0xF8CC,0xC644,0xF8CA,INVALC,0xF953,0xF952,0xF954, + 0xC65F,0xF955,0xC65E,0xF956,0xF972,0xF975,0xF974,0xC668, + 0xF973,INVALC,INVALC,INVALC,0xC672,0xC670,0xC671,0xC677, + 0xF9C0,0xF9C1,0xF9BF,0xF9C9, + /* Range 0x957A - 0x957D, array index: 0x3E58 */ + 0xD844,0xDC78,0xE8A5,0xF376, + /* Range 0x9588 - 0x9594, array index: 0x3E5C */ + 0xD846,0xB3AC,INVALC,0xB67D,0xDC7A,0xDC79,0xB6A3,0xB67C, + 0xDC7B,0xB67E,0xB6A2,0xB6A1,0xB67B, + /* Range 0x959B - 0x95C0, array index: 0x3E69 */ + 0xE0D0,0xE0CE,INVALC,0xE0CF,0xE0CD,INVALC,0xBBD2,INVALC, + 0xBBD5,0xBBD7,0xBBD6,INVALC,INVALC,0xBBD3,0xBBD4,INVALC, + 0xE8A7,0xE8A6,0xBE5B,0xE8A8,INVALC,0xE8A9,0xBE5C,INVALC, + INVALC,INVALC,0xEC4D,0xEC4B,0xEEF3,INVALC,0xEC49,0xEC4A, + 0xC046,0xEC46,0xEC4E,0xEC48,0xEC4C,0xEEEF, + /* Range 0x95C3 - 0x95E5, array index: 0x3E8F */ + 0xEEF1,INVALC,0xEEF2,0xC1F3,0xEEEE,0xC1F2,0xEEF0,0xC1EF, + 0xC1F0,0xC1F1,0xEC47,INVALC,INVALC,0xC2F5,0xF16E,0xF16C, + 0xF16D,0xC2F3,0xC2F6,0xC2F4,INVALC,INVALC,INVALC,0xF377, + 0xF378,0xC3F6,INVALC,0xF545,0xF547,0xF546,0xC4C4,0xC550, + 0xF66D,0xF66C,0xF66B, + /* Range 0x961E - 0x9624, array index: 0x3EB2 */ + 0xC9AA,INVALC,0xCA58,0xA6E9,0xCA56,0xCA59,0xCA57, + /* Range 0x962A - 0x9632, array index: 0x3EB9 */ + 0xA8C1,INVALC,0xA8C2,0xCBB0,0xA8BF,0xCBAF,0xCBAD,0xA8C0, + 0xA8BE, + /* Range 0x9639 - 0x9644, array index: 0x3EC2 */ + 0xCDD8,0xCDDB,0xAAFD,0xCDDA,0xCDD9,INVALC,0xAAFC,0xAAFB, + INVALC,0xAB40,0xCDDC,0xAAFE, + /* Range 0x964A - 0x9654, array index: 0x3ECE */ + 0xD0C6,0xADAE,0xADAF,0xADB0,0xD0C7,0xD0C3,0xADAD,0xD0C4, + INVALC,0xD0C5,0xD0C2, + /* Range 0x965B - 0x9664, array index: 0x3ED9 */ + 0xB0A1,0xD445,0xB0A2,0xB0A5,0xD446,INVALC,0xB07E,0xB07C, + 0xB07D,0xB0A3, + /* Range 0x966A - 0x96B4, array index: 0x3EE3 */ + 0xB3AD,0xD849,0xB3B5,0xD848,INVALC,0xD84B,0xB3B1,0xD84A, + 0xB6AB,0xB3AF,0xB3B2,0xB3AE,0xB3B3,0xB3B4,0xB3B0,INVALC, + INVALC,INVALC,0xD847,0xB6A7,0xDC7D,INVALC,0xDCA3,INVALC, + INVALC,0xDCA2,0xB6AC,0xB6A8,0xB6A9,0xDC7C,0xDC7E,0xDCA1, + 0xB6A4,0xB6A6,INVALC,0xB6AA,0xB6A5,INVALC,INVALC,0xE0D3, + 0xE0D1,0xE0D2,0xB96A,0xB96B,INVALC,0xE0D4,0xB969,0xBBD8, + INVALC,0xBBDA,0xBBD9,INVALC,0xE4BB,INVALC,INVALC,0xE4BC, + 0xE8AB,INVALC,0xE8AA,INVALC,INVALC,0xC047,0xC048,0xEC4F, + 0xC049,INVALC,0xEEF6,INVALC,0xEEF4,INVALC,0xEEF5,0xC1F4, + INVALC,0xF16F,0xC3F7, + /* Range 0x96B8 - 0x96EA, array index: 0x3F2E */ + 0xC1F5,0xAB41,INVALC,0xB0A6,0xD447,INVALC,INVALC,0xD84C, + 0xB3B6,0xB6AD,0xDCA4,0xDCA6,0xB6AF,0xB6AE,0xB6B0,0xB6B1, + 0xDCA5,0xB96E,0xB96F,0xB96D,0xBBDB,0xB96C,0xE0D5,INVALC, + INVALC,INVALC,0xBBDC,0xE8AC,0xEC50,0xC04A,0xC1F6,0xF170, + 0xF174,0xC2F9,0xF171,0xC2FA,0xC2F8,0xF175,0xC2FB,0xF173, + INVALC,0xF379,0xC2F7,0xC3F8,INVALC,0xF8CD,INVALC,INVALC, + 0xAB42,0xB3B8,0xB3B7, + /* Range 0x96EF - 0x9713, array index: 0x3F61 */ + 0xB6B2,0xDCA8,0xDCA7,0xB6B3,INVALC,INVALC,0xE0D9,0xB973, + 0xB970,0xE0D8,0xB972,0xE0D6,0xB971,INVALC,0xE0D7,INVALC, + 0xE4BD,0xBBDD,INVALC,0xE8AF,INVALC,0xBE5D,0xE8AD,0xBE5E, + 0xBE5F,0xE8AE,0xBE60,INVALC,0xEC51,INVALC,0xC04E,0xC04B, + 0xC050,0xEC53,0xC04C,0xEC52,0xC04F, + /* Range 0x9718 - 0x9732, array index: 0x3F86 */ + 0xEEF9,0xEEFB,INVALC,INVALC,0xC1F7,0xEEFA,0xC1F8,0xEEF8, + 0xEEF7,INVALC,0xF177,0xF176,0xC2FC,0xF178,0xF37E,0xC3FA, + 0xF37D,0xF37A,0xC3F9,0xF37B,0xF37C,INVALC,0xF548,0xF549, + 0xC4C5,INVALC,0xC553, + /* Range 0x9738 - 0x974B, array index: 0x3FA1 */ + 0xC551,0xC552,0xF66F,INVALC,INVALC,0xC5B4,0xC5B5,0xF771, + INVALC,INVALC,0xC645,0xF8CF,0xC647,INVALC,0xF8CE,0xF8D0, + 0xC646,0xF957,INVALC,0xF9AD, + /* Range 0x9758 - 0x9762, array index: 0x3FB5 */ + 0xE4BE,INVALC,0xE8B0,0xC051,0xC052,INVALC,0xAB44,INVALC, + 0xBE61,0xC3FB,0xADB1, + /* Range 0x9766 - 0x9785, array index: 0x3FC0 */ + 0xC053,INVALC,0xC5E2,0xADB2,0xD84D,INVALC,0xDCA9,INVALC, + 0xDCAB,INVALC,0xDCAA,INVALC,0xE0DD,0xE0DA,0xB975,INVALC, + 0xB976,0xE0DB,0xE0DC,INVALC,0xE4C0,0xE4C5,0xBBDE,0xE4BF, + 0xE4C1,0xE4C8,0xE4C3,0xE4C7,0xE4C4,0xE4C2,0xE4C6,0xBBDF, + /* Range 0x978A - 0x978F, array index: 0x3FE0 */ + 0xE8B1,0xBE63,INVALC,0xBE62,0xE8B2,0xBE64, + /* Range 0x9797 - 0x97AE, array index: 0x3FE6 */ + 0xEC55,0xC054,0xEC54,0xEEFC,INVALC,0xEEFE,0xEF41,0xEF40, + INVALC,0xC1F9,0xEEFD,0xF1A1,0xC2FD,0xF17D,0xF1A2,0xC2FE, + INVALC,0xF17B,INVALC,0xF17E,0xF17C,0xF179,0xC340,0xF17A, + /* Range 0x97C1 - 0x97E5, array index: 0x3FFE */ + 0xC5B7,INVALC,0xC5B6,0xF84F,0xF850,0xC648,0xF8D1,INVALC, + 0xC669,INVALC,0xADB3,0xB6B4,0xE4CA,0xE4C9,0xE8B5,0xE8B4, + INVALC,INVALC,0xC1FA,0xEF43,0xEF42,0xF1A5,0xF1A3,0xF1A6, + 0xF1A4,INVALC,INVALC,0xC3FC,0xF3A4,0xF3A5,0xF3A6,INVALC, + 0xF671,INVALC,0xF772,INVALC,0xF8D2, + /* Range 0x97F6 - 0x9821, array index: 0x4023 */ + 0xBBE0,INVALC,0xEC58,0xC341,0xF1A7,0xC3FD,INVALC,0xF54C, + 0xF54D,0xC554,0xF851,0xADB6,0xB3BB,0xB3BC,0xD84E,0xB6B5, + 0xB6B6,0xDCAC,0xB6B7,INVALC,0xB97A,INVALC,0xB97C,0xE0DF, + 0xE0E0,0xE0DE,0xB977,0xB978,0xB97B,0xB979,INVALC,INVALC, + 0xE4CB,0xBBE1,0xBBE2,INVALC,INVALC,0xE8BC,0xBE67,0xE8B7, + 0xE8B6,INVALC,0xE8BB,0xBE65, + /* Range 0x9824 - 0x9832, array index: 0x404F */ + 0xC05B,INVALC,0xE8B8,0xE8BD,0xE8BA,0xE8B9,INVALC,0xBE66, + INVALC,0xC059,INVALC,0xEC5A,0xC055,INVALC,0xEC5B, + /* Range 0x9835 - 0x983B, array index: 0x405E */ + 0xEC59,INVALC,0xC058,0xC056,0xC05A,INVALC,0xC057, + /* Range 0x9841 - 0x9874, array index: 0x4065 */ + 0xEF45,INVALC,0xEF4A,0xEF46,0xEF49,0xC1FB,INVALC,0xEDD4, + 0xEF48,0xEF47,INVALC,0xC344,0xC342,0xC345,0xC343,0xF1A8, + 0xF1A9,0xF1AA,0xC346,INVALC,INVALC,INVALC,0xF3AA,0xC440, + 0xF3A8,INVALC,0xC441,0xF3A7,0xF3A9,0xC3FE,0xF551,0xF54E, + INVALC,0xF54F,0xF550,0xF672,0xC556,INVALC,0xC555,INVALC, + 0xF774,0xF773,0xC5B8,INVALC,INVALC,INVALC,0xC5E3,0xC649, + 0xC660,0xF958,0xF9AE,0xF9AF, + /* Range 0x98A8 - 0x98B3, array index: 0x4099 */ + 0xADB7,0xDCAD,INVALC,INVALC,0xE0E1,0xE4CC,0xE4CD,0xBBE3, + INVALC,0xBBE4,0xE8BE,0xBE68, + /* Range 0x98B8 - 0x98C6, array index: 0x40A5 */ + 0xF1AB,INVALC,0xC347,0xF3AD,0xC442,0xF3AC,0xF3AE,0xF3AB, + 0xF675,0xF552,0xF553,INVALC,0xC4C6,INVALC,0xF674, + /* Range 0x98E7 - 0x98EF, array index: 0x40B4 */ + 0xB6B8,INVALC,0xB6BB,0xB6B9,0xDCAE,INVALC,0xB6BD,INVALC, + 0xB6BA, + /* Range 0x98F9 - 0x9935, array index: 0x40BD */ + 0xE0E3,0xE8C0,INVALC,0xB97D,0xB9A1,0xB9A2,INVALC,0xE4CF, + INVALC,0xE4CE,0xBBE5,INVALC,0xBBE6,INVALC,0xE4D0,0xE8BF, + 0xBBE8,0xBE69,INVALC,0xBBE7,INVALC,INVALC,INVALC,0xC05C, + 0xE8C1,0xBE6B,0xBE6A,0xE8C2,0xE8C5,0xE8C3,0xE8C4,0xBE6C, + INVALC,0xC061,0xC05F,INVALC,INVALC,0xC05E,0xEC5D,INVALC, + 0xC060,INVALC,INVALC,0xEC5C,0xEF4B,INVALC,0xEC5E,0xC05D, + 0xEC5F,0xEF4E,0xEF4C,0xEF4D,0xEF52,0xC34B,0xEF51,0xEF54, + 0xEF53,0xEF50,0xEF4F,INVALC,0xC1FD, + /* Range 0x993A - 0x9961, array index: 0x40FA */ + 0xF1AE,INVALC,0xF1AD,0xC34A,0xC348,0xC349,INVALC,0xF1AC, + INVALC,0xF3B1,INVALC,0xC443,INVALC,0xF3B0,0xF3AF,0xC444, + INVALC,0xF558,0xF557,INVALC,0xF555,INVALC,0xF554,0xC4C8, + 0xC4C7,0xF559,0xF776,0xC5B9,0xF677,0xC557,0xF676,0xF556, + INVALC,0xF777,0xC5E4,INVALC,0xC661,0xF959,INVALC,0xF9B1, + /* Range 0x9996 - 0x999E, array index: 0x4122 */ + 0xADBA,0xD850,0xEF55,0xADBB,INVALC,INVALC,0xE4D2,0xE4D1, + 0xEC60, + /* Range 0x99A3 - 0x99C3, array index: 0x412B */ + 0xEF56,INVALC,0xC34C,0xF3B2,0xF3B3,0xC4C9,INVALC,INVALC, + 0xF9B2,0xB0A8,0xB6BF,0xB6BE,0xE0E4,0xE0E6,0xB9A4,0xE0E5, + 0xB9A3,0xB9A5,0xE0E7,INVALC,INVALC,INVALC,0xE4D4,0xE4D6, + 0xE4D5,INVALC,0xE4D8,INVALC,INVALC,INVALC,0xBBE9,0xE4D7, + 0xE4D3, + /* Range 0x99C9 - 0x99F1, array index: 0x414C */ + 0xE8CC,INVALC,0xE8CF,0xE8D1,0xE8C7,0xE8CB,0xE8C8,0xBE6E, + 0xBE71,0xBE73,0xE8C9,0xE8CA,0xBE72,0xE8CD,0xE8D0,0xE8CE, + 0xBE74,INVALC,0xBE70,0xE8C6,0xBE6D,INVALC,0xBE6F,INVALC, + INVALC,0xC063,0xEC66,0xEC64,0xEC63,INVALC,0xEC69,INVALC, + 0xEC68,0xEC67,INVALC,0xEC62,0xC062,0xEC61,INVALC,0xEC65, + 0xC064, + /* Range 0x99F4 - 0x9A6B, array index: 0x4175 */ + 0xEF5A,INVALC,0xEF5E,0xEF5B,0xEF5D,0xEF5C,0xEF59,0xEF5F, + 0xEF62,0xEF60,0xEF61,0xC240,INVALC,0xC1FE,0xEF58,0xEF63, + 0xF1B3,0xF1B6,0xF1B8,0xF1B7,INVALC,0xF1B1,0xF1B5,0xF1B0, + INVALC,0xF1B2,0xC34D,0xF1AF,INVALC,0xF1B4,INVALC,INVALC, + 0xF3C0,0xF3B5,0xC445,INVALC,INVALC,0xC446,0xF3B4,0xF3B9, + 0xF3BF,0xF3B7,0xF3BE,INVALC,0xF3BB,INVALC,0xF3BA,0xF3BD, + 0xF3B8,0xF3B6,INVALC,0xF3BC,INVALC,0xF560,0xF55E,0xC4CA, + 0xF55D,0xF563,0xF561,INVALC,0xC4CB,0xF55C,0xF55A,INVALC, + 0xF55B,0xC4CD,0xF55F,0xC4CC,0xF562,0xF678,0xF67E,INVALC, + INVALC,0xF679,0xC55B,0xF6A1,0xC55A,0xF67D,0xF67C,0xC559, + 0xF67B,0xC558,0xF67A,INVALC,0xF77D,0xF7A1,0xF77E,INVALC, + 0xF77B,0xC5BB,0xF778,0xF77C,0xF7A3,INVALC,0xF7A2,0xF779, + 0xF77A,0xC5BA,0xF852,0xC5E7,INVALC,0xF853,0xC5E5,0xC5E6, + INVALC,INVALC,0xF8D3,0xC64A,0xF976,INVALC,0xC66A,INVALC, + 0xF9B3,0xC66B,0xF9B4,0xF9B5,0xF9C3,0xF9C2,0xC67A,0xF9CD, + /* Range 0x9AAD - 0x9AC2, array index: 0x41ED */ + 0xE0E8,INVALC,0xBBEA,0xBBEB,0xE4DA,INVALC,0xE8D2,0xEC6C, + INVALC,INVALC,0xBE75,0xC065,0xEC6A,INVALC,0xEC6D,0xC066, + INVALC,0xEF64,0xEC6B,0xF1B9,0xC34E,0xF3C1, + /* Range 0x9ACD - 0x9AD8, array index: 0x4203 */ + 0xF6A2,INVALC,0xC55C,0xF7A4,0xC5EA,0xC5BC,0xC5E8,0xC5E9, + 0xF8D4,0xC662,INVALC,0xB0AA, + /* Range 0x9AEB - 0x9AFE, array index: 0x420F */ + 0xE8D4,0xE8D3,0xC068,0xBE76,0xBE77,INVALC,0xE8D7,0xE8D6, + 0xE8D5,INVALC,INVALC,0xEC6E,0xEC71,INVALC,0xEC70,0xEC6F, + 0xC067,0xEF68,0xEF66,0xEF65, + /* Range 0x9B01 - 0x9B61, array index: 0x4223 */ + 0xEF67,INVALC,0xC34F,0xF1BC,0xF1BD,0xC350,INVALC,0xF1BB, + INVALC,0xF3C3,0xF3C2,0xF3C5,0xC447,0xF3C4,INVALC,0xF567, + 0xF569,0xF568,INVALC,INVALC,0xF6A3,0xF6A6,0xF6A4,0xF6A5, + 0xF7A5,0xC5BD,INVALC,INVALC,INVALC,0xF854,0xF855,0xF856, + INVALC,0xC64B,0xC663,0xF9B6,0xB0AB,INVALC,0xBE78,0xC069, + 0xF1BE,INVALC,0xF7A6,INVALC,INVALC,0xF9C4,0xD44A,INVALC, + 0xC67B,0xB0AC,0xEC72,INVALC,0xF1BF,INVALC,0xF3C6,INVALC, + INVALC,0xF6A7,0xF7A7,0xB0AD,INVALC,0xE4DD,0xE4DE,INVALC, + 0xBBED,0xBBEE,0xE8D9,0xBE7A,0xBE79,0xE8D8,INVALC,0xEF69, + INVALC,0xF1C0,0xF1C2,0xF1C1,0xC353,0xC352,0xC351,INVALC, + 0xC55E,0xF6A8,INVALC,0xC55D,0xF7A9,0xF7A8,INVALC,0xC64C, + 0xF8D5,0xB3BD,0xE0EA,INVALC,INVALC,INVALC,0xE4E1,0xE4DF, + 0xE4E0, + /* Range 0x9B64 - 0x9B68, array index: 0x4284 */ + 0xE8E2,INVALC,0xE8DD,0xE8DA,0xE8E1, + /* Range 0x9B6F - 0x9B88, array index: 0x4289 */ + 0xBE7C,0xE8E0,0xE8DC,INVALC,INVALC,0xE8DB,0xE8DF,0xE8DE, + 0xBE7B,INVALC,INVALC,0xEC7D,0xEC78,0xEC76,0xECA1,0xEC77, + INVALC,0xEC73,INVALC,0xEC79,INVALC,INVALC,0xEC74,0xEF72, + 0xEC75,0xECA2, + /* Range 0x9B90 - 0x9B95, array index: 0x42A3 */ + 0xEC7C,0xC06A,0xEC7B,0xEC7A,INVALC,0xEC7E, + /* Range 0x9B9E - 0x9BAF, array index: 0x42A9 */ + 0xEF6C,INVALC,0xEF74,0xEF6F,0xEF73,INVALC,0xEF71,0xEF70, + 0xEF6E,INVALC,0xEF6B,INVALC,0xC243,0xC242,INVALC,0xC244, + 0xC241,0xEF75, + /* Range 0x9BB5 - 0x9BB9, array index: 0x42BB */ + 0xF1C8,0xF1CB,INVALC,0xF1C9,0xF1CD, + /* Range 0x9BBD - 0x9BCA, array index: 0x42C0 */ + 0xF1CE,INVALC,0xF1C6,0xC358,0xF1C7,INVALC,0xF1C5,0xF1CC, + INVALC,0xF1C4,0xF1C3,0xC357,0xC355,0xC354, + /* Range 0x9BD3 - 0x9BEC, array index: 0x42CE */ + 0xF1CA,0xF3CF,0xF3D5,0xC44A,0xF3D0,INVALC,0xF3D3,0xF3D7, + 0xC44B,0xF3D2,INVALC,0xF3CA,INVALC,0xF3C9,0xF3D6,0xF3CD, + INVALC,0xF3CB,0xF3D4,0xF3CC,0xC449,0xC448,INVALC,0xF3C7, + 0xF3C8,0xF3D1, + /* Range 0x9C05 - 0x9C14, array index: 0x42E8 */ + 0xF56D,0xF573,0xF571,0xF56B,0xF576,INVALC,0xF56A,INVALC, + 0xC4CF,0xF572,INVALC,INVALC,INVALC,0xF56E,0xC4CE,0xF575, + /* Range 0x9C21 - 0x9C41, array index: 0x42F8 */ + 0xF6B1,INVALC,0xF6AD,0xF6B0,0xC560,INVALC,INVALC,0xF6AE, + 0xF6AF,INVALC,0xF6A9,0xF6AC,0xC55F,INVALC,INVALC,INVALC, + 0xC5BF,0xF7B4,0xF7AF,0xF7B3,INVALC,0xF7B6,0xF7B2,INVALC, + 0xF7AE,INVALC,0xC5C1,0xF7B1,0xF7B5,0xC5C0,0xF7AC,0xF570, + 0xF7B0, + /* Range 0x9C46 - 0x9C59, array index: 0x4319 */ + 0xF7AA,INVALC,0xF7AB,0xC5BE,0xF85A,0xF85C,0xF85F,0xF85B, + 0xF860,INVALC,0xF859,INVALC,0xF857,INVALC,0xC5EB,0xF85D, + 0xC5ED,0xC5EC,0xF858,0xF85E, + /* Range 0x9C5E - 0x9C68, array index: 0x432D */ + 0xF8DA,0xC64D,0xF8DB,INVALC,0xF8D9,0xF8D6,INVALC,INVALC, + 0xF8D8,0xF8D7,0xF95A, + /* Range 0x9C71 - 0x9C7A, array index: 0x4338 */ + 0xF979,INVALC,0xF978,0xF977,0xF97A,INVALC,0xC673,0xC674, + 0xF9CA,0xF9CE, + /* Range 0x9CE5 - 0x9CEA, array index: 0x4342 */ + 0xB3BE,0xDCAF,0xE0ED,INVALC,0xB9A7,0xE0EB, + /* Range 0x9CF1 - 0x9D09, array index: 0x4348 */ + 0xE4E2,0xE4E3,0xBBF1,0xBBEF,0xE4E4,0xBBF0,0xE8E8,INVALC, + 0xE8EB,0xE8E5,0xE8EC,0xE8E4,0xE8E6,INVALC,0xE8E7,0xE8EA, + INVALC,INVALC,0xBEA1,0xE8EF,0xE8EE,0xBE7D,0xE8E9,0xE8ED, + 0xBE7E, + /* Range 0x9D14 - 0x9D38, array index: 0x4361 */ + 0xECA7,0xC06B,INVALC,0xECA4,0xECAA,0xECAD,INVALC,0xC070, + INVALC,0xECA9,0xECA6,0xECAE,0xECA5,INVALC,0xECAB,0xC06C, + INVALC,0xECA3,0xC06D,INVALC,0xC06E,0xECA8,INVALC,INVALC, + INVALC,0xEFA9,0xEF7A,0xEF7B,0xEF7E,0xEF7C,INVALC,0xEF76, + INVALC,INVALC,0xEF79,0xEFA5,0xEF7D, + /* Range 0x9D3B - 0x9D45, array index: 0x4386 */ + 0xC245,INVALC,0xEFA7,0xEFA4,0xC246,0xEFA6,0xEF77,0xEFA2, + 0xEFA3,INVALC,0xEFA1, + /* Range 0x9D4A - 0x9D4C, array index: 0x4391 */ + 0xF1D2,0xF1D4,0xF1D7, + /* Range 0x9D4F - 0x9D61, array index: 0x4394 */ + 0xF1D1,INVALC,0xC359,0xF1D9,0xF1D0,0xF1DA,INVALC,0xF1D6, + 0xF1D8,0xF1DC,0xF1D5,0xF1DD,0xF1D3,0xF1CF,0xC35A,INVALC, + 0xF1DB,0xC35B,0xC44D, + /* Range 0x9D67 - 0x9D8C, array index: 0x43A7 */ + 0xEF78,0xF3F1,0xF3E8,0xC44F,0xF3E4,0xC450,INVALC,INVALC, + 0xF3ED,0xF3E7,0xF3DD,0xC44E,0xF3EA,0xF3E5,0xF3E6,INVALC, + 0xF3D8,0xF3DF,0xF3EE,INVALC,0xF3EB,INVALC,0xF3E3,INVALC, + 0xF3EF,0xF3DE,0xF3D9,0xF3EC,INVALC,0xF3DB,0xF3E9,0xF3E0, + 0xF3F0,0xF3DC,0xC44C,0xF3DA,0xF3E1,0xF3E2, + /* Range 0x9D94 - 0x9E1E, array index: 0x43CD */ + 0xF5A2,INVALC,0xF5AE,0xF5A5,0xF57C,0xF578,0xF5A7,0xF57E, + 0xF5A3,0xF57A,0xF5AA,0xF577,0xF5A1,0xF5A6,0xF5A8,0xF5AB, + 0xF579,INVALC,0xF5AF,0xF5B0,0xF5A9,0xF5AD,0xF5A4,INVALC, + 0xF6C1,0xF6C4,INVALC,0xC561,INVALC,0xF6C3,0xF6C8,0xF6C6, + 0xC562,0xF6BD,0xF6B3,0xF6B2,0xC564,0xF6BF,0xF6C0,0xF6BC, + 0xF6B4,INVALC,0xF6B9,0xF5AC,INVALC,0xF6B5,0xC563,0xF6BB, + INVALC,0xF6BA,INVALC,0xF6B6,0xF6C2,INVALC,0xF6B7,0xF7BB, + 0xF6C5,0xF6C7,0xF6BE,0xF6B8,0xF7BC,0xF7BE,0xF7B8,0xC5C2, + INVALC,0xF7C5,0xF7C3,0xC5C3,0xF7C2,0xF7C1,0xF7BA,0xF7B7, + 0xF7BD,0xF7C6,0xF7B9,0xF7BF,INVALC,0xF869,0xF86E,0xF864, + 0xF867,0xC5EE,0xF86B,INVALC,0xF872,0xF7C0,INVALC,0xF865, + 0xF86F,0xF873,0xF86A,0xF863,0xF86D,INVALC,0xF86C,0xF871, + 0xF870,0xF7C4,0xF868,0xF862,0xF866,0xC64E,0xC64F,0xF861, + INVALC,0xF8E6,0xF8DD,0xF8E5,0xF8E2,0xF8E3,0xF8DC,0xF8DF, + 0xF8E7,0xF8E1,0xF8E0,0xF8DE,INVALC,0xF8E4,INVALC,0xF95D, + INVALC,0xF95E,INVALC,0xF960,0xF95F,0xF962,0xF961,0xF97C, + 0xF97B,0xF9B7,INVALC,0xF9B8,INVALC,0xF9C5,0xC678,0xC67C, + INVALC,0xF9CF,0xC67D, + /* Range 0x9E79 - 0x9E94, array index: 0x4458 */ + 0xC4D0,0xF6C9,INVALC,0xC650,0xC651,INVALC,0xB3C0,0xE0EE, + INVALC,0xB9A8,0xE8F0,INVALC,INVALC,0xECB0,0xECB1,0xECAF, + 0xEFAB,0xEFAA,0xC247,0xF1DF,0xEFAC,0xF1DE,INVALC,INVALC, + 0xF3F3,0xC451,0xC453,0xF3F2, + /* Range 0x9E97 - 0x9EA9, array index: 0x4474 */ + 0xC452,INVALC,0xF5B1,0xF5B3,0xF5B2,0xF6CA,0xC565,INVALC, + 0xC5EF,0xF8E8,0xF963,INVALC,INVALC,0xF9D2,0xB3C1,INVALC, + 0xE4E5,INVALC,0xBEA2, + /* Range 0x9EB4 - 0x9EB7, array index: 0x4487 */ + 0xC454,0xC4D1,0xF7C7,0xF9CB, + /* Range 0x9ECC - 0x9EE8, array index: 0x448B */ + 0xC664,0xB6C1,0xBEA4,0xC248,0xF875,0xB6C2,INVALC,0xE8F1, + 0xC072,0xECB4,0xECB5,INVALC,0xC071,INVALC,0xEFAF,0xC24C, + 0xC24A,0xC24B,0xC249,0xF1E0,0xC35C,INVALC,INVALC,INVALC, + 0xF5B5,0xF5B4,0xF5B7,0xF5B6,0xC4D2, + /* Range 0x9EEB - 0x9F01, array index: 0x44A8 */ + 0xF6CB,INVALC,0xF6CD,0xF6CC,0xC566,0xF7C8,INVALC,0xF876, + 0xF877,0xC5F0,0xF964,0xF97D,0xC675,INVALC,0xDCB0,0xECB6, + 0xEFB0,0xF3F5,0xE0EF,INVALC,0xEFB1,0xF1E2,0xF1E1, + /* Range 0x9F06 - 0x9F38, array index: 0x44BF */ + 0xF878,0xC652,INVALC,0xF965,0xF97E,INVALC,INVALC,INVALC, + 0xB9A9,0xE8F2,0xE8F3,INVALC,0xECB7,0xB9AA,INVALC,0xC35D, + 0xF1E3,INVALC,0xF6CF,0xC567,0xF6D0,0xF6CE,0xF879,INVALC, + 0xF8E9,INVALC,0xB9AB,INVALC,0xEFB4,0xEFB3,0xEFB2,0xF1E4, + INVALC,INVALC,0xF1E8,0xF1E7,0xF1E6,0xF1E5,0xC35E,0xF3F6, + 0xF5B9,0xC4D3,0xF5B8,0xF6D1,0xF7CB,0xF7CA,0xC5C4,0xF7C9, + 0xF87C,0xF87B,0xF87A, + /* Range 0x9F3D - 0x9F4F, array index: 0x44F2 */ + 0xECB8,0xC24D,INVALC,0xF3F7,0xF3F8,0xF7CC,0xF87D,INVALC, + INVALC,0xF8EA,0xF966,0xF9B9,0xF9D4,0xBBF4,0xC24E,0xF1E9, + 0xF3F9,0xF6D2,0xF87E, + /* Range 0x9F52 - 0x9F7B, array index: 0x4505 */ + 0xBEA6,INVALC,0xEFB5,0xF1EA,0xF3FA,0xF3FB,0xF3FC,0xF5BE, + INVALC,0xF5BA,0xC568,0xF5BD,0xF5BC,0xC4D4,0xF5BB,0xC4D6, + INVALC,0xC4D5,0xF6D4,0xF6D3,0xC569,0xC56A,INVALC,INVALC, + 0xC5C6,0xF7CD,0xC5C5,INVALC,0xF8A3,0xF8A4,0xF8A2,0xF8A1, + 0xC654,INVALC,0xF8EB,0xF8EC,0xF8ED,0xC653,0xF967,0xF96A, + 0xF969,0xF968, + /* Range 0x9F90 - 0x9F95, array index: 0x452F */ + 0xC365,0xF5BF,0xF6D5,INVALC,0xC5C7,0xF7CE, + /* Range 0xFE30 - 0xFE44, array index: 0x4535 */ + 0xA14A,0xA157,INVALC,0xA159,0xA15B,0xA15F,0xA160,0xA163, + 0xA164,0xA167,0xA168,0xA16B,0xA16C,0xA16F,0xA170,0xA173, + 0xA174,0xA177,0xA178,0xA17B,0xA17C, + /* Range 0xFE49 - 0xFE6B, array index: 0x454A */ + 0xA1C6,0xA1C7,0xA1CA,0xA1CB,0xA1C8,0xA1C9,0xA15C,0xA14D, + INVALC,0xA14F,INVALC,0xA151,0xA152,0xA153,0xA154,INVALC, + 0xA17D,0xA17E,0xA1A1,0xA1A2,0xA1A3,0xA1A4,0xA1CC,0xA1CD, + 0xA1CE,0xA1DE,0xA1DF,0xA1E0,0xA1E1,0xA1E2,INVALC,INVALC, + 0xA24C,0xA24D,0xA24E, + /* Range 0xFF01 - 0xFF3C, array index: 0x456D */ + 0xA149,INVALC,0xA1AD,0xA243,0xA248,0xA1AE,INVALC,0xA15D, + 0xA15E,0xA1AF,0xA1CF,0xA141,0xA1D0,0xA144,0xA241,0xA2AF, + 0xA2B0,0xA2B1,0xA2B2,0xA2B3,0xA2B4,0xA2B5,0xA2B6,0xA2B7, + 0xA2B8,0xA147,0xA146,0xA1D5,0xA1D7,0xA1D6,0xA148,0xA249, + 0xA2CF,0xA2D0,0xA2D1,0xA2D2,0xA2D3,0xA2D4,0xA2D5,0xA2D6, + 0xA2D7,0xA2D8,0xA2D9,0xA2DA,0xA2DB,0xA2DC,0xA2DD,0xA2DE, + 0xA2DF,0xA2E0,0xA2E1,0xA2E2,0xA2E3,0xA2E4,0xA2E5,0xA2E6, + 0xA2E7,0xA2E8,INVALC,0xA242, + /* Range 0xFF3F - 0xFF5D, array index: 0x45A9 */ + 0xA1C4,INVALC,0xA2E9,0xA2EA,0xA2EB,0xA2EC,0xA2ED,0xA2EE, + 0xA2EF,0xA2F0,0xA2F1,0xA2F2,0xA2F3,0xA2F4,0xA2F5,0xA2F6, + 0xA2F7,0xA2F8,0xA2F9,0xA2FA,0xA2FB,0xA2FC,0xA2FD,0xA2FE, + 0xA340,0xA341,0xA342,0xA343,0xA161,0xA155,0xA162, + /* Unranged codes (565 codes) */ + /* Array index: 0x45C8 */ 0x00A2,0xA246, + /* Array index: 0x45C8 */ 0x00A3,0xA247, + /* Array index: 0x45C8 */ 0x00A5,0xA244, + /* Array index: 0x45C8 */ 0x00A7,0xA1B1, + /* Array index: 0x45C8 */ 0x00B0,0xA258, + /* Array index: 0x45C8 */ 0x00B1,0xA1D3, + /* Array index: 0x45C8 */ 0x00B7,0xA150, + /* Array index: 0x45C8 */ 0x00D7,0xA1D1, + /* Array index: 0x45C8 */ 0x00F7,0xA1D2, + /* Array index: 0x45C8 */ 0x02D9,0xA3BB, + /* Array index: 0x45C8 */ 0x0401,0xC7B3, + /* Array index: 0x45C8 */ 0x2013,0xA156, + /* Array index: 0x45C8 */ 0x2014,0xA158, + /* Array index: 0x45C8 */ 0x2018,0xA1A5, + /* Array index: 0x45C8 */ 0x2019,0xA1A6, + /* Array index: 0x45C8 */ 0x201C,0xA1A7, + /* Array index: 0x45C8 */ 0x201D,0xA1A8, + /* Array index: 0x45C8 */ 0x2022,0xA145, + /* Array index: 0x45C8 */ 0x2025,0xA14C, + /* Array index: 0x45C8 */ 0x2026,0xA14B, + /* Array index: 0x45C8 */ 0x2032,0xA1AC, + /* Array index: 0x45C8 */ 0x2035,0xA1AB, + /* Array index: 0x45C8 */ 0x203B,0xA1B0, + /* Array index: 0x45C8 */ 0x203E,0xA1C2, + /* Array index: 0x45C8 */ 0x2103,0xA24A, + /* Array index: 0x45C8 */ 0x2105,0xA1C1, + /* Array index: 0x45C8 */ 0x2109,0xA24B, + /* Array index: 0x45C8 */ 0x221A,0xA1D4, + /* Array index: 0x45C8 */ 0x2223,0xA1FD, + /* Array index: 0x45C8 */ 0x2225,0xA1FC, + /* Array index: 0x45C8 */ 0x222E,0xA1ED, + /* Array index: 0x45C8 */ 0x2234,0xA1EF, + /* Array index: 0x45C8 */ 0x2235,0xA1EE, + /* Array index: 0x45C8 */ 0x223C,0xA1E3, + /* Array index: 0x45C8 */ 0x2252,0xA1DC, + /* Array index: 0x45C8 */ 0x2260,0xA1DA, + /* Array index: 0x45C8 */ 0x2261,0xA1DD, + /* Array index: 0x45C8 */ 0x2266,0xA1D8, + /* Array index: 0x45C8 */ 0x2267,0xA1D9, + /* Array index: 0x45C8 */ 0x22A5,0xA1E6, + /* Array index: 0x45C8 */ 0x22BF,0xA1E9, + /* Array index: 0x45C8 */ 0x2500,0xA277, + /* Array index: 0x45C8 */ 0x2502,0xA278, + /* Array index: 0x45C8 */ 0x250C,0xA27A, + /* Array index: 0x45C8 */ 0x2510,0xA27B, + /* Array index: 0x45C8 */ 0x2514,0xA27C, + /* Array index: 0x45C8 */ 0x2518,0xA27D, + /* Array index: 0x45C8 */ 0x251C,0xA275, + /* Array index: 0x45C8 */ 0x2524,0xA274, + /* Array index: 0x45C8 */ 0x252C,0xA273, + /* Array index: 0x45C8 */ 0x2534,0xA272, + /* Array index: 0x45C8 */ 0x253C,0xA271, + /* Array index: 0x45C8 */ 0x2550,0xA2A4, + /* Array index: 0x45C8 */ 0x255E,0xA2A5, + /* Array index: 0x45C8 */ 0x2561,0xA2A7, + /* Array index: 0x45C8 */ 0x256A,0xA2A6, + /* Array index: 0x45C8 */ 0x2594,0xA276, + /* Array index: 0x45C8 */ 0x2595,0xA279, + /* Array index: 0x45C8 */ 0x25A0,0xA1BD, + /* Array index: 0x45C8 */ 0x25A1,0xA1BC, + /* Array index: 0x45C8 */ 0x25B2,0xA1B6, + /* Array index: 0x45C8 */ 0x25B3,0xA1B5, + /* Array index: 0x45C8 */ 0x25BC,0xA1BF, + /* Array index: 0x45C8 */ 0x25BD,0xA1BE, + /* Array index: 0x45C8 */ 0x25C6,0xA1BB, + /* Array index: 0x45C8 */ 0x25C7,0xA1BA, + /* Array index: 0x45C8 */ 0x25CB,0xA1B3, + /* Array index: 0x45C8 */ 0x25CE,0xA1B7, + /* Array index: 0x45C8 */ 0x25CF,0xA1B4, + /* Array index: 0x45C8 */ 0x2605,0xA1B9, + /* Array index: 0x45C8 */ 0x2606,0xA1B8, + /* Array index: 0x45C8 */ 0x2609,0xA1F3, + /* Array index: 0x45C8 */ 0x30FE,0xC6A1, + /* Array index: 0x45C8 */ 0x32A3,0xA1C0, + /* Array index: 0x45C8 */ 0x338E,0xA255, + /* Array index: 0x45C8 */ 0x338F,0xA256, + /* Array index: 0x45C8 */ 0x33A1,0xA254, + /* Array index: 0x45C8 */ 0x33C4,0xA257, + /* Array index: 0x45C8 */ 0x33CE,0xA253, + /* Array index: 0x45C8 */ 0x33D1,0xA1EB, + /* Array index: 0x45C8 */ 0x33D2,0xA1EA, + /* Array index: 0x45C8 */ 0x33D5,0xA24F, + /* Array index: 0x45C8 */ 0x4E00,0xA440, + /* Array index: 0x45C8 */ 0x4E01,0xA442, + /* Array index: 0x45C8 */ 0x4E03,0xA443, + /* Array index: 0x45C8 */ 0x4E1E,0xA5E0, + /* Array index: 0x45C8 */ 0x4E1F,0xA5E1, + /* Array index: 0x45C8 */ 0x4E26,0xA8C3, + /* Array index: 0x45C8 */ 0x4E2B,0xA458, + /* Array index: 0x45C8 */ 0x4E42,0xC940, + /* Array index: 0x45C8 */ 0x4E43,0xA444, + /* Array index: 0x45C8 */ 0x4E45,0xA45B, + /* Array index: 0x45C8 */ 0x4E47,0xC947, + /* Array index: 0x45C8 */ 0x4E48,0xA45C, + /* Array index: 0x45C8 */ 0x4E56,0xA8C4, + /* Array index: 0x45C8 */ 0x4E69,0xA5E4, + /* Array index: 0x45C8 */ 0x4E73,0xA8C5, + /* Array index: 0x45C8 */ 0x4E99,0xA5E5, + /* Array index: 0x45C8 */ 0x4E9B,0xA8C7, + /* Array index: 0x45C8 */ 0x4EB3,0xADBD, + /* Array index: 0x45C8 */ 0x4EB6,0xDCB3, + /* Array index: 0x45C8 */ 0x4EB9,0xF6D6, + /* Array index: 0x45C8 */ 0x4EBA,0xA448, + /* Array index: 0x45C8 */ 0x4EFB,0xA5F4, + /* Array index: 0x45C8 */ 0x4F1D,0xC9B4, + /* Array index: 0x45C8 */ 0x4F22,0xC9B7, + /* Array index: 0x45C8 */ 0x4FAE,0xAB56, + /* Array index: 0x45C8 */ 0x4FAF,0xAB4A, + /* Array index: 0x45C8 */ 0x4FEC,0xCDEF, + /* Array index: 0x45C8 */ 0x4FEE,0xADD7, + /* Array index: 0x45C8 */ 0x4FEF,0xADC1, + /* Array index: 0x45C8 */ 0x4FFE,0xADDA, + /* Array index: 0x45C8 */ 0x5000,0xADCE, + /* Array index: 0x45C8 */ 0x503C,0xADC8, + /* Array index: 0x45C8 */ 0x5040,0xD463, + /* Array index: 0x45C8 */ 0x5041,0xD457, + /* Array index: 0x45C8 */ 0x507A,0xB0AF, + /* Array index: 0x45C8 */ 0x507D,0xB0B0, + /* Array index: 0x45C8 */ 0x5080,0xB3C8, + /* Array index: 0x45C8 */ 0x5082,0xD85E, + /* Array index: 0x45C8 */ 0x5083,0xD857, + /* Array index: 0x45C8 */ 0x5085,0xB3C5, + /* Array index: 0x45C8 */ 0x5087,0xD85F, + /* Array index: 0x45C8 */ 0x50A2,0xB3C3, + /* Array index: 0x45C8 */ 0x50A3,0xD856, + /* Array index: 0x45C8 */ 0x50E0,0xE0FE, + /* Array index: 0x45C8 */ 0x5152,0xA8E0, + /* Array index: 0x45C8 */ 0x5154,0xA8DF, + /* Array index: 0x45C8 */ 0x5155,0xA8E1, + /* Array index: 0x45C8 */ 0x5171,0xA640, + /* Array index: 0x45C8 */ 0x517C,0xADDD, + /* Array index: 0x45C8 */ 0x5180,0xBEAC, + /* Array index: 0x45C8 */ 0x5187,0xC94E, + /* Array index: 0x45C8 */ 0x5189,0xA554, + /* Array index: 0x45C8 */ 0x518A,0xA555, + /* Array index: 0x45C8 */ 0x518D,0xA641, + /* Array index: 0x45C8 */ 0x519E,0xCBCD, + /* Array index: 0x45C8 */ 0x51A0,0xAB61, + /* Array index: 0x45C8 */ 0x51A2,0xADE0, + /* Array index: 0x45C8 */ 0x51A4,0xADDE, + /* Array index: 0x45C8 */ 0x51A5,0xADDF, + /* Array index: 0x45C8 */ 0x51AA,0xBEAD, + /* Array index: 0x45C8 */ 0x51AC,0xA556, + /* Array index: 0x45C8 */ 0x51B0,0xA642, + /* Array index: 0x45C8 */ 0x51B1,0xC9BC, + /* Array index: 0x45C8 */ 0x51B6,0xA74D, + /* Array index: 0x45C8 */ 0x51B7,0xA74E, + /* Array index: 0x45C8 */ 0x51B9,0xCA6B, + /* Array index: 0x45C8 */ 0x51D4,0xD861, + /* Array index: 0x45C8 */ 0x51D7,0xDCC5, + /* Array index: 0x45C8 */ 0x51D8,0xE140, + /* Array index: 0x45C8 */ 0x51F0,0xB0C4, + /* Array index: 0x45C8 */ 0x51F1,0xB3CD, + /* Array index: 0x45C8 */ 0x51F3,0xB9B9, + /* Array index: 0x45C8 */ 0x51FD,0xA8E7, + /* Array index: 0x45C8 */ 0x5200,0xA44D, + /* Array index: 0x45C8 */ 0x5201,0xA44E, + /* Array index: 0x45C8 */ 0x5203,0xA462, + /* Array index: 0x45C8 */ 0x5221,0xCA6E, + /* Array index: 0x45C8 */ 0x5241,0xA8EF, + /* Array index: 0x45C8 */ 0x5272,0xB3CE, + /* Array index: 0x45C8 */ 0x5291,0xBEAF, + /* Array index: 0x45C8 */ 0x5293,0xBEB0, + /* Array index: 0x45C8 */ 0x529F,0xA55C, + /* Array index: 0x45C8 */ 0x52A0,0xA55B, + /* Array index: 0x45C8 */ 0x52A3,0xA648, + /* Array index: 0x45C8 */ 0x52A6,0xC9C0, + /* Array index: 0x45C8 */ 0x52BB,0xA8F1, + /* Array index: 0x45C8 */ 0x52BC,0xCBD5, + /* Array index: 0x45C8 */ 0x52C7,0xAB69, + /* Array index: 0x45C8 */ 0x52C9,0xAB6A, + /* Array index: 0x45C8 */ 0x52CD,0xD0ED, + /* Array index: 0x45C8 */ 0x52E9,0xE143, + /* Array index: 0x45C8 */ 0x52EB,0xE144, + /* Array index: 0x45C8 */ 0x532A,0xADEA, + /* Array index: 0x45C8 */ 0x5334,0xE8FA, + /* Array index: 0x45C8 */ 0x5337,0xF3FD, + /* Array index: 0x45C8 */ 0x5339,0xA4C7, + /* Array index: 0x45C8 */ 0x5357,0xAB6E, + /* Array index: 0x45C8 */ 0x535A,0xB3D5, + /* Array index: 0x45C8 */ 0x535C,0xA452, + /* Array index: 0x45C8 */ 0x535E,0xA4CB, + /* Array index: 0x45C8 */ 0x5360,0xA565, + /* Array index: 0x45C8 */ 0x5361,0xA564, + /* Array index: 0x45C8 */ 0x5363,0xCA72, + /* Array index: 0x45C8 */ 0x5366,0xA8F6, + /* Array index: 0x45C8 */ 0x537F,0xADEB, + /* Array index: 0x45C8 */ 0x5382,0xC944, + /* Array index: 0x45C8 */ 0x5384,0xA4CC, + /* Array index: 0x45C8 */ 0x538A,0xC9C4, + /* Array index: 0x45C8 */ 0x538E,0xCA74, + /* Array index: 0x45C8 */ 0x538F,0xCA75, + /* Array index: 0x45C8 */ 0x5392,0xCBD9, + /* Array index: 0x45C8 */ 0x53A4,0xD864, + /* Array index: 0x45C8 */ 0x53A5,0xB3D6, + /* Array index: 0x45C8 */ 0x53A7,0xD865, + /* Array index: 0x45C8 */ 0x53AC,0xE146, + /* Array index: 0x45C8 */ 0x53AD,0xB9BD, + /* Array index: 0x45C8 */ 0x53B2,0xBC46, + /* Array index: 0x45C8 */ 0x53B4,0xF1EF, + /* Array index: 0x45C8 */ 0x53B9,0xC958, + /* Array index: 0x45C8 */ 0x53BB,0xA568, + /* Array index: 0x45C8 */ 0x53C3,0xB0D1, + /* Array index: 0x45C8 */ 0x53D4,0xA8FB, + /* Array index: 0x45C8 */ 0x53D6,0xA8FA, + /* Array index: 0x45C8 */ 0x53D7,0xA8FC, + /* Array index: 0x45C8 */ 0x53DB,0xAB71, + /* Array index: 0x45C8 */ 0x53F8,0xA571, + /* Array index: 0x45C8 */ 0x53FB,0xA57B, + /* Array index: 0x45C8 */ 0x53FC,0xA570, + /* Array index: 0x45C8 */ 0x5401,0xA653, + /* Array index: 0x45C8 */ 0x544E,0xA760, + /* Array index: 0x45C8 */ 0x544F,0xCAA2, + /* Array index: 0x45C8 */ 0x5454,0xCA79, + /* Array index: 0x45C8 */ 0x54CE,0xAB75, + /* Array index: 0x45C8 */ 0x54CF,0xCDFE, + /* Array index: 0x45C8 */ 0x54D6,0xCE44, + /* Array index: 0x45C8 */ 0x5517,0xD0F2, + /* Array index: 0x45C8 */ 0x551A,0xD0F7, + /* Array index: 0x45C8 */ 0x5526,0xD0F0, + /* Array index: 0x45C8 */ 0x5527,0xAE41, + /* Array index: 0x45C8 */ 0x555C,0xB0E3, + /* Array index: 0x45C8 */ 0x556A,0xB0D4, + /* Array index: 0x45C8 */ 0x55BB,0xB3EB, + /* Array index: 0x45C8 */ 0x55EF,0xB6E2, + /* Array index: 0x45C8 */ 0x55F2,0xDCDD, + /* Array index: 0x45C8 */ 0x5627,0xE147, + /* Array index: 0x45C8 */ 0x5629,0xBC4D, + /* Array index: 0x45C8 */ 0x562A,0xE547, + /* Array index: 0x45C8 */ 0x5653,0xBC4E, + /* Array index: 0x45C8 */ 0x565E,0xE945, + /* Array index: 0x45C8 */ 0x5693,0xECC0, + /* Array index: 0x45C8 */ 0x56D1,0xC5F1, + /* Array index: 0x45C8 */ 0x56D3,0xF8A5, + /* Array index: 0x45C8 */ 0x56D4,0xF8EE, + /* Array index: 0x45C8 */ 0x56D7,0xC949, + /* Array index: 0x45C8 */ 0x56EE,0xCAA7, + /* Array index: 0x45C8 */ 0x56F0,0xA778, + /* Array index: 0x45C8 */ 0x56F7,0xCBF0, + /* Array index: 0x45C8 */ 0x56F9,0xCBF1, + /* Array index: 0x45C8 */ 0x56FA,0xA954, + /* Array index: 0x45C8 */ 0x573B,0xA7A6, + /* Array index: 0x45C8 */ 0x573E,0xA7A3, + /* Array index: 0x45C8 */ 0x5740,0xA77D, + /* Array index: 0x45C8 */ 0x5741,0xCAAA, + /* Array index: 0x45C8 */ 0x5745,0xCAAB, + /* Array index: 0x45C8 */ 0x5761,0xA959, + /* Array index: 0x45C8 */ 0x5762,0xCBFE, + /* Array index: 0x45C8 */ 0x5764,0xA95B, + /* Array index: 0x45C8 */ 0x5780,0xCBF9, + /* Array index: 0x45C8 */ 0x5782,0xABAB, + /* Array index: 0x45C8 */ 0x5783,0xA955, + /* Array index: 0x45C8 */ 0x578B,0xABAC, + /* Array index: 0x45C8 */ 0x578C,0xCE54, + /* Array index: 0x45C8 */ 0x578F,0xCE5A, + /* Array index: 0x45C8 */ 0x57AE,0xABB1, + /* Array index: 0x45C8 */ 0x57DC,0xD4B1, + /* Array index: 0x45C8 */ 0x5814,0xD4AE, + /* Array index: 0x45C8 */ 0x5868,0xDCE3, + /* Array index: 0x45C8 */ 0x586B,0xB6F1, + /* Array index: 0x45C8 */ 0x586D,0xB6F3, + /* Array index: 0x45C8 */ 0x586F,0xDCE8, + /* Array index: 0x45C8 */ 0x5871,0xDCF1, + /* Array index: 0x45C8 */ 0x5898,0xE159, + /* Array index: 0x45C8 */ 0x58EF,0xA7A7, + /* Array index: 0x45C8 */ 0x58F4,0xCE5F, + /* Array index: 0x45C8 */ 0x5903,0xC95A, + /* Array index: 0x45C8 */ 0x5906,0xCAB0, + /* Array index: 0x45C8 */ 0x5920,0xB0F7, + /* Array index: 0x45C8 */ 0x5922,0xB9DA, + /* Array index: 0x45C8 */ 0x5924,0xB9DB, + /* Array index: 0x45C8 */ 0x5925,0xB9D9, + /* Array index: 0x45C8 */ 0x5937,0xA669, + /* Array index: 0x45C8 */ 0x5938,0xA66A, + /* Array index: 0x45C8 */ 0x593C,0xC9CB, + /* Array index: 0x45C8 */ 0x593E,0xA7A8, + /* Array index: 0x45C8 */ 0x5940,0xCAB1, + /* Array index: 0x45C8 */ 0x598A,0xA7B3, + /* Array index: 0x45C8 */ 0x5A09,0xAE5C, + /* Array index: 0x45C8 */ 0x5A0A,0xD162, + /* Array index: 0x45C8 */ 0x5A0C,0xAE5B, + /* Array index: 0x45C8 */ 0x5A0F,0xD160, + /* Array index: 0x45C8 */ 0x5A11,0xAE50, + /* Array index: 0x45C8 */ 0x5A23,0xAE58, + /* Array index: 0x45C8 */ 0x5A25,0xAE5A, + /* Array index: 0x45C8 */ 0x5A29,0xAE59, + /* Array index: 0x45C8 */ 0x5A2D,0xD15D, + /* Array index: 0x45C8 */ 0x5A2E,0xD15E, + /* Array index: 0x45C8 */ 0x5A3C,0xB140, + /* Array index: 0x45C8 */ 0x5A70,0xD4E8, + /* Array index: 0x45C8 */ 0x5A83,0xD8C6, + /* Array index: 0x45C8 */ 0x5A84,0xD8C3, + /* Array index: 0x45C8 */ 0x5AA2,0xD8B9, + /* Array index: 0x45C8 */ 0x5B38,0xC254, + /* Array index: 0x45C8 */ 0x5B43,0xC45D, + /* Array index: 0x45C8 */ 0x5B45,0xF443, + /* Array index: 0x45C8 */ 0x5B69,0xABC4, + /* Array index: 0x45C8 */ 0x5B6B,0xAE5D, + /* Array index: 0x45C8 */ 0x5B6C,0xD165, + /* Array index: 0x45C8 */ 0x5C01,0xABCA, + /* Array index: 0x45C8 */ 0x5C1A,0xA97C, + /* Array index: 0x45C8 */ 0x5C1F,0xDD4B, + /* Array index: 0x45C8 */ 0x5C22,0xA471, + /* Array index: 0x45C8 */ 0x5C24,0xA4D7, + /* Array index: 0x45C8 */ 0x5C25,0xC9D5, + /* Array index: 0x45C8 */ 0x5C28,0xCABE, + /* Array index: 0x45C8 */ 0x5C2A,0xCABF, + /* Array index: 0x45C8 */ 0x5C2C,0xA7BC, + /* Array index: 0x45C8 */ 0x5C30,0xD8D8, + /* Array index: 0x45C8 */ 0x5C31,0xB44E, + /* Array index: 0x45C8 */ 0x5C33,0xDD4C, + /* Array index: 0x45C8 */ 0x5CE8,0xAE6F, + /* Array index: 0x45C8 */ 0x5D06,0xB153, + /* Array index: 0x45C8 */ 0x5D07,0xB152, + /* Array index: 0x45C8 */ 0x5D55,0xD8E2, + /* Array index: 0x45C8 */ 0x5D59,0xD8E8, + /* Array index: 0x45C8 */ 0x5D5E,0xDD53, + /* Array index: 0x45C8 */ 0x5D62,0xDD56, + /* Array index: 0x45C8 */ 0x5D63,0xDD4E, + /* Array index: 0x45C8 */ 0x5D6F,0xB744, + /* Array index: 0x45C8 */ 0x5D71,0xDD4D, + /* Array index: 0x45C8 */ 0x5D72,0xDD51, + /* Array index: 0x45C8 */ 0x5D77,0xE1A9, + /* Array index: 0x45C8 */ 0x5D8D,0xE1AF, + /* Array index: 0x45C8 */ 0x5DC0,0xEFC4, + /* Array index: 0x45C8 */ 0x5DC2,0xF172, + /* Array index: 0x45C8 */ 0x5DC3,0xF1FD, + /* Array index: 0x45C8 */ 0x5DC6,0xF444, + /* Array index: 0x45C8 */ 0x5DC7,0xF445, + /* Array index: 0x45C8 */ 0x5DC9,0xC460, + /* Array index: 0x45C8 */ 0x5DCB,0xF5C9, + /* Array index: 0x45C8 */ 0x5DCD,0xC4DE, + /* Array index: 0x45C8 */ 0x5DCF,0xF5CA, + /* Array index: 0x45C8 */ 0x5DEB,0xA7C5, + /* Array index: 0x45C8 */ 0x5DF7,0xABD1, + /* Array index: 0x45C8 */ 0x5DF9,0xCEAF, + /* Array index: 0x45C8 */ 0x5E0A,0xCACB, + /* Array index: 0x45C8 */ 0x5E0C,0xA7C6, + /* Array index: 0x45C8 */ 0x5E0E,0xCACC, + /* Array index: 0x45C8 */ 0x5E11,0xA9AE, + /* Array index: 0x45C8 */ 0x5EBE,0xB168, + /* Array index: 0x45C8 */ 0x5EEC,0xC366, + /* Array index: 0x45C8 */ 0x5EFA,0xABD8, + /* Array index: 0x45C8 */ 0x5F0F,0xA6A1, + /* Array index: 0x45C8 */ 0x5F3C,0xB45D, + /* Array index: 0x45C8 */ 0x5F40,0xDD62, + /* Array index: 0x45C8 */ 0x5F43,0xE1BF, + /* Array index: 0x45C8 */ 0x5F44,0xE1BE, + /* Array index: 0x45C8 */ 0x5F5D,0xC255, + /* Array index: 0x45C8 */ 0x5F62,0xA7CE, + /* Array index: 0x45C8 */ 0x5F64,0xA7CD, + /* Array index: 0x45C8 */ 0x5F65,0xABDB, + /* Array index: 0x45C8 */ 0x5FB2,0xE577, + /* Array index: 0x45C8 */ 0x5FC9,0xC97B, + /* Array index: 0x45C8 */ 0x5FE8,0xCADA, + /* Array index: 0x45C8 */ 0x6050,0xAEA3, + /* Array index: 0x45C8 */ 0x60A8,0xB17A, + /* Array index: 0x45C8 */ 0x6123,0xB468, + /* Array index: 0x45C8 */ 0x6132,0xDD6B, + /* Array index: 0x45C8 */ 0x6134,0xB75B, + /* Array index: 0x45C8 */ 0x6136,0xDD6A, + /* Array index: 0x45C8 */ 0x6137,0xB75F, + /* Array index: 0x45C8 */ 0x613B,0xE1D2, + /* Array index: 0x45C8 */ 0x619A,0xBCAA, + /* Array index: 0x45C8 */ 0x619B,0xE5A1, + /* Array index: 0x45C8 */ 0x619D,0xE976, + /* Array index: 0x45C8 */ 0x619F,0xE5A5, + /* Array index: 0x45C8 */ 0x61A1,0xE5A8, + /* Array index: 0x45C8 */ 0x61A2,0xE57D, + /* Array index: 0x45C8 */ 0x61A4,0xBCAB, + /* Array index: 0x45C8 */ 0x61D6,0xEFCF, + /* Array index: 0x45C8 */ 0x61D8,0xEFC7, + /* Array index: 0x45C8 */ 0x623A,0xCAE6, + /* Array index: 0x45C8 */ 0x62C2,0xA9D8, + /* Array index: 0x45C8 */ 0x63BD,0xD56B, + /* Array index: 0x45C8 */ 0x63BE,0xD964, + /* Array index: 0x45C8 */ 0x63F9,0xB4AE, + /* Array index: 0x45C8 */ 0x6406,0xB770, + /* Array index: 0x45C8 */ 0x644B,0xE1E9, + /* Array index: 0x45C8 */ 0x6482,0xE1E6, + /* Array index: 0x45C8 */ 0x654F,0xB1D3, + /* Array index: 0x45C8 */ 0x656F,0xDDBC, + /* Array index: 0x45C8 */ 0x6587,0xA4E5, + /* Array index: 0x45C8 */ 0x658C,0xD979, + /* Array index: 0x45C8 */ 0x664F,0xAECB, + /* Array index: 0x45C8 */ 0x6651,0xD1D6, + /* Array index: 0x45C8 */ 0x6652,0xAECD, + /* Array index: 0x45C8 */ 0x66CF,0xE9B8, + /* Array index: 0x45C8 */ 0x66D2,0xECF2, + /* Array index: 0x45C8 */ 0x671B,0xB1E6, + /* Array index: 0x45C8 */ 0x676A,0xAA57, + /* Array index: 0x45C8 */ 0x67FF,0xAC55, + /* Array index: 0x45C8 */ 0x6925,0xD9D8, + /* Array index: 0x45C8 */ 0x692A,0xD9AE, + /* Array index: 0x45C8 */ 0x6982,0xB7A7, + /* Array index: 0x45C8 */ 0x6983,0xDEC6, + /* Array index: 0x45C8 */ 0x6986,0xB7AE, + /* Array index: 0x45C8 */ 0x69D9,0xE25C, + /* Array index: 0x45C8 */ 0x6A0D,0xE5E3, + /* Array index: 0x45C8 */ 0x6A0F,0xE5EA, + /* Array index: 0x45C8 */ 0x6A32,0xE9C2, + /* Array index: 0x45C8 */ 0x6A76,0xE9C7, + /* Array index: 0x45C8 */ 0x6AE5,0xC36F, + /* Array index: 0x45C8 */ 0x6B1E,0xF9BB, + /* Array index: 0x45C8 */ 0x6B20,0xA4ED, + /* Array index: 0x45C8 */ 0x6B21,0xA6B8, + /* Array index: 0x45C8 */ 0x6B23,0xAA59, + /* Array index: 0x45C8 */ 0x6B25,0xCCE9, + /* Array index: 0x45C8 */ 0x6B28,0xCF64, + /* Array index: 0x45C8 */ 0x6B2C,0xD1F5, + /* Array index: 0x45C8 */ 0x6B2D,0xD1F7, + /* Array index: 0x45C8 */ 0x6B59,0xBEF9, + /* Array index: 0x45C8 */ 0x6B6A,0xAC6E, + /* Array index: 0x45C8 */ 0x6B6D,0xD1FA, + /* Array index: 0x45C8 */ 0x6B72,0xB7B3, + /* Array index: 0x45C8 */ 0x6BBA,0xB1FE, + /* Array index: 0x45C8 */ 0x6BDE,0xCCEC, + /* Array index: 0x45C8 */ 0x6C3B,0xC9A4, + /* Array index: 0x45C8 */ 0x6C46,0xC9F8, + /* Array index: 0x45C8 */ 0x6CF9,0xCD4C, + /* Array index: 0x45C8 */ 0x6E00,0xD5EB, + /* Array index: 0x45C8 */ 0x6E03,0xD9FC, + /* Array index: 0x45C8 */ 0x6E05,0xB24D, + /* Array index: 0x45C8 */ 0x6E88,0xD9EC, + /* Array index: 0x45C8 */ 0x6E89,0xB540, + /* Array index: 0x45C8 */ 0x6EDC,0xDE5C, + /* Array index: 0x45C8 */ 0x6FD4,0xED51, + /* Array index: 0x45C8 */ 0x6FD5,0xC0E3, + /* Array index: 0x45C8 */ 0x6FD8,0xC0D7, + /* Array index: 0x45C8 */ 0x6FF7,0xEFF7, + /* Array index: 0x45C8 */ 0x7070,0xA6C7, + /* Array index: 0x45C8 */ 0x7071,0xCA41, + /* Array index: 0x45C8 */ 0x7074,0xCB5E, + /* Array index: 0x45C8 */ 0x7076,0xA85F, + /* Array index: 0x45C8 */ 0x7078,0xA862, + /* Array index: 0x45C8 */ 0x707A,0xCB5F, + /* Array index: 0x45C8 */ 0x707C,0xA860, + /* Array index: 0x45C8 */ 0x707D,0xA861, + /* Array index: 0x45C8 */ 0x708A,0xAAA4, + /* Array index: 0x45C8 */ 0x708E,0xAAA2, + /* Array index: 0x45C8 */ 0x709F,0xCFAF, + /* Array index: 0x45C8 */ 0x70A1,0xCFB3, + /* Array index: 0x45C8 */ 0x70A4,0xACB7, + /* Array index: 0x45C8 */ 0x70BE,0xCFB0, + /* Array index: 0x45C8 */ 0x70EF,0xB26D, + /* Array index: 0x45C8 */ 0x70F0,0xD64E, + /* Array index: 0x45C8 */ 0x7113,0xD655, + /* Array index: 0x45C8 */ 0x7136,0xB54D, + /* Array index: 0x45C8 */ 0x713A,0xDA64, + /* Array index: 0x45C8 */ 0x7178,0xDE74, + /* Array index: 0x45C8 */ 0x717B,0xE2C1, + /* Array index: 0x45C8 */ 0x717D,0xBAB4, + /* Array index: 0x45C8 */ 0x718F,0xE2C0, + /* Array index: 0x45C8 */ 0x7190,0xE2BB, + /* Array index: 0x45C8 */ 0x7192,0xBAB7, + /* Array index: 0x45C8 */ 0x7194,0xBAB2, + /* Array index: 0x45C8 */ 0x720A,0xF26A, + /* Array index: 0x45C8 */ 0x720C,0xF269, + /* Array index: 0x45C8 */ 0x720D,0xC37B, + /* Array index: 0x45C8 */ 0x7210,0xC46C, + /* Array index: 0x45C8 */ 0x7213,0xF46A, + /* Array index: 0x45C8 */ 0x7214,0xF46B, + /* Array index: 0x45C8 */ 0x7230,0xACB8, + /* Array index: 0x45C8 */ 0x724F,0xDEA4, + /* Array index: 0x45C8 */ 0x7252,0xB7DE, + /* Array index: 0x45C8 */ 0x7253,0xE2C6, + /* Array index: 0x45C8 */ 0x7267,0xAAAA, + /* Array index: 0x45C8 */ 0x7269,0xAAAB, + /* Array index: 0x45C8 */ 0x726A,0xCD5B, + /* Array index: 0x45C8 */ 0x72B4,0xCA43, + /* Array index: 0x45C8 */ 0x72B5,0xCA44, + /* Array index: 0x45C8 */ 0x72BA,0xCB66, + /* Array index: 0x45C8 */ 0x732D,0xDA75, + /* Array index: 0x45C8 */ 0x738E,0xCA45, + /* Array index: 0x45C8 */ 0x73E3,0xD2B1, + /* Array index: 0x45C8 */ 0x7416,0xDA7E, + /* Array index: 0x45C8 */ 0x741A,0xDAA1, + /* Array index: 0x45C8 */ 0x741B,0xB560, + /* Array index: 0x45C8 */ 0x741D,0xDAA7, + /* Array index: 0x45C8 */ 0x743A,0xB557, + /* Array index: 0x45C8 */ 0x7467,0xE2D3, + /* Array index: 0x45C8 */ 0x7479,0xE6AB, + /* Array index: 0x45C8 */ 0x7490,0xED69, + /* Array index: 0x45C8 */ 0x7492,0xEA66, + /* Array index: 0x45C8 */ 0x74CA,0xC3A3, + /* Array index: 0x45C8 */ 0x74CB,0xF273, + /* Array index: 0x45C8 */ 0x74CF,0xC46E, + /* Array index: 0x45C8 */ 0x74EC,0xCFD7, + /* Array index: 0x45C8 */ 0x74EE,0xCFD8, + /* Array index: 0x45C8 */ 0x7547,0xCFDA, + /* Array index: 0x45C8 */ 0x7548,0xCFDB, + /* Array index: 0x45C8 */ 0x7554,0xAF60, + /* Array index: 0x45C8 */ 0x7584,0xED73, + /* Array index: 0x45C8 */ 0x759D,0xAAB7, + /* Array index: 0x45C8 */ 0x75B0,0xD2C3, + /* Array index: 0x45C8 */ 0x7638,0xBF61, + /* Array index: 0x45C8 */ 0x763A,0xBF62, + /* Array index: 0x45C8 */ 0x763C,0xEA70, + /* Array index: 0x45C8 */ 0x763D,0xEA6E, + /* Array index: 0x45C8 */ 0x764C,0xC0F9, + /* Array index: 0x45C8 */ 0x7650,0xF04D, + /* Array index: 0x45C8 */ 0x7675,0xF9CC, + /* Array index: 0x45C8 */ 0x76A4,0xED78, + /* Array index: 0x45C8 */ 0x76A6,0xF051, + /* Array index: 0x45C8 */ 0x76B4,0xB572, + /* Array index: 0x45C8 */ 0x76B5,0xDED6, + /* Array index: 0x45C8 */ 0x76B8,0xE2E1, + /* Array index: 0x45C8 */ 0x772D,0xD6AA, + /* Array index: 0x45C8 */ 0x7779,0xB840, + /* Array index: 0x45C8 */ 0x7795,0xEA7D, + /* Array index: 0x45C8 */ 0x77C2,0xF054, + /* Array index: 0x45C8 */ 0x77C4,0xF27B, + /* Array index: 0x45C8 */ 0x77C7,0xC3A9, + /* Array index: 0x45C8 */ 0x7809,0xCFF1, + /* Array index: 0x45C8 */ 0x7843,0xB2B9, + /* Array index: 0x45C8 */ 0x7845,0xD6BA, + /* Array index: 0x45C8 */ 0x7879,0xDEEE, + /* Array index: 0x45C8 */ 0x788C,0xB84C, + /* Array index: 0x45C8 */ 0x788E,0xB848, + /* Array index: 0x45C8 */ 0x788F,0xDEE7, + /* Array index: 0x45C8 */ 0x7909,0xF05A, + /* Array index: 0x45C8 */ 0x790C,0xF057, + /* Array index: 0x45C8 */ 0x7917,0xF2A3, + /* Array index: 0x45C8 */ 0x7935,0xF6F6, + /* Array index: 0x45C8 */ 0x7988,0xE341, + /* Array index: 0x45C8 */ 0x79C5,0xCDA4, + /* Array index: 0x45C8 */ 0x79C8,0xAAC4, + /* Array index: 0x45C8 */ 0x79C9,0xAAC3, + /* Array index: 0x45C8 */ 0x7A26,0xE349, + /* Array index: 0x45C8 */ 0x7A28,0xE348, + /* Array index: 0x45C8 */ 0x7A2B,0xE344, + /* Array index: 0x45C8 */ 0x7A37,0xBD5E, + /* Array index: 0x45C8 */ 0x7AD1,0xD041, + /* Array index: 0x45C8 */ 0x7AD8,0xD2FD, + /* Array index: 0x45C8 */ 0x7AD9,0xAFB8, + /* Array index: 0x45C8 */ 0x7B38,0xD6DB, + /* Array index: 0x45C8 */ 0x7B3B,0xDADF, + /* Array index: 0x45C8 */ 0x7B40,0xDAE4, + /* Array index: 0x45C8 */ 0x7B82,0xE35D, + /* Array index: 0x45C8 */ 0x7BA4,0xE35C, + /* Array index: 0x45C8 */ 0x7BAC,0xE6D9, + /* Array index: 0x45C8 */ 0x7BAD,0xBD62, + /* Array index: 0x45C8 */ 0x7BAF,0xE6DB, + /* Array index: 0x45C8 */ 0x7BB1,0xBD63, + /* Array index: 0x45C8 */ 0x7BBE,0xE6D8, + /* Array index: 0x45C8 */ 0x7BC0,0xB860, + /* Array index: 0x45C8 */ 0x7BC1,0xBD68, + /* Array index: 0x45C8 */ 0x7BC4,0xBD64, + /* Array index: 0x45C8 */ 0x7C19,0xF063, + /* Array index: 0x45C8 */ 0x7C30,0xF06C, + /* Array index: 0x45C8 */ 0x7C33,0xF2A8, + /* Array index: 0x45C8 */ 0x7C43,0xC478, + /* Array index: 0x45C8 */ 0x7C50,0xC4F0, + /* Array index: 0x45C8 */ 0x7C53,0xF5E5, + /* Array index: 0x45C8 */ 0x7C54,0xF5E4, + /* Array index: 0x45C8 */ 0x7CA8,0xDAE9, + /* Array index: 0x45C8 */ 0x7CC5,0xE6DF, + /* Array index: 0x45C8 */ 0x7CE7,0xC2B3, + /* Array index: 0x45C8 */ 0x7CE8,0xEDCF, + /* Array index: 0x45C8 */ 0x7CEA,0xF2AE, + /* Array index: 0x45C8 */ 0x7CFB,0xA874, + /* Array index: 0x45C8 */ 0x7D4A,0xD6EE, + /* Array index: 0x45C8 */ 0x7DD2,0xBAFC, + /* Array index: 0x45C8 */ 0x7E03,0xE6E9, + /* Array index: 0x45C8 */ 0x7E4C,0xEDDB, + /* Array index: 0x45C8 */ 0x7F58,0xD04D, + /* Array index: 0x45C8 */ 0x8024,0xE3A1, + /* Array index: 0x45C8 */ 0x8030,0xF5EF, + /* Array index: 0x45C8 */ 0x8043,0xD743, + /* Array index: 0x45C8 */ 0x8056,0xB874, + /* Array index: 0x45C8 */ 0x8058,0xB875, + /* Array index: 0x45C8 */ 0x8064,0xE6FB, + /* Array index: 0x45C8 */ 0x8067,0xE6FC, + /* Array index: 0x45C8 */ 0x806C,0xEAE7, + /* Array index: 0x45C8 */ 0x80B8,0xCDAE, + /* Array index: 0x45C8 */ 0x80BA,0xAACD, + /* Array index: 0x45C8 */ 0x8139,0xB5C8, + /* Array index: 0x45C8 */ 0x813A,0xDB51, + /* Array index: 0x45C8 */ 0x813D,0xDB4F, + /* Array index: 0x45C8 */ 0x813E,0xB5CA, + /* Array index: 0x45C8 */ 0x815B,0xDF77, + /* Array index: 0x45C8 */ 0x815C,0xDF75, + /* Array index: 0x45C8 */ 0x8225,0xD372, + /* Array index: 0x45C8 */ 0x822F,0xD371, + /* Array index: 0x45C8 */ 0x8316,0xD3A8, + /* Array index: 0x45C8 */ 0x8317,0xAFFA, + /* Array index: 0x45C8 */ 0x8319,0xD376, + /* Array index: 0x45C8 */ 0x831B,0xD3A3, + /* Array index: 0x45C8 */ 0x831C,0xD37D, + /* Array index: 0x45C8 */ 0x831E,0xD3B2, + /* Array index: 0x45C8 */ 0x8320,0xD3AA, + /* Array index: 0x45C8 */ 0x841B,0xDBAE, + /* Array index: 0x45C8 */ 0x8423,0xDB5F, + /* Array index: 0x45C8 */ 0x8482,0xB8A6, + /* Array index: 0x45C8 */ 0x8486,0xDFB3, + /* Array index: 0x45C8 */ 0x8494,0xE3C2, + /* Array index: 0x45C8 */ 0x84DB,0xE3D1, + /* Array index: 0x45C8 */ 0x853B,0xE74D, + /* Array index: 0x45C8 */ 0x8571,0xEB4B, + /* Array index: 0x45C8 */ 0x8611,0xC4A8, + /* Array index: 0x45C8 */ 0x8643,0xF8BC, + /* Array index: 0x45C8 */ 0x8659,0xD77B, + /* Array index: 0x45C8 */ 0x8746,0xE3E3, + /* Array index: 0x45C8 */ 0x88B1,0xB5F6, + /* Array index: 0x45C8 */ 0x88B2,0xDBCD, + /* Array index: 0x45C8 */ 0x88E7,0xE3F6, + /* Array index: 0x45C8 */ 0x88E8,0xBB74, + /* Array index: 0x45C8 */ 0x8949,0xF0D9, + /* Array index: 0x45C8 */ 0x898B,0xA8A3, + /* Array index: 0x45C8 */ 0x898F,0xB357, + /* Array index: 0x45C8 */ 0x89B2,0xC2D1, + /* Array index: 0x45C8 */ 0x8A2A,0xB358, + /* Array index: 0x45C8 */ 0x8A2C,0xD7CB, + /* Array index: 0x45C8 */ 0x8A2D,0xB35D, + /* Array index: 0x45C8 */ 0x8A30,0xD7C9, + /* Array index: 0x45C8 */ 0x8A31,0xB35C, + /* Array index: 0x45C8 */ 0x8A34,0xB644, + /* Array index: 0x45C8 */ 0x8A36,0xB646, + /* Array index: 0x45C8 */ 0x8A66,0xB8D5, + /* Array index: 0x45C8 */ 0x8A9E,0xBB79, + /* Array index: 0x45C8 */ 0x8AB0,0xBDD6, + /* Array index: 0x45C8 */ 0x8AB2,0xBDD2, + /* Array index: 0x45C8 */ 0x8B74,0xC4FE, + /* Array index: 0x45C8 */ 0x8C37,0xA8A6, + /* Array index: 0x45C8 */ 0x8C5A,0xB362, + /* Array index: 0x45C8 */ 0x8C5C,0xD7CF, + /* Array index: 0x45C8 */ 0x8C5D,0xD7D0, + /* Array index: 0x45C8 */ 0x8C5F,0xDBE5, + /* Array index: 0x45C8 */ 0x8D0D,0xC4BA, + /* Array index: 0x45C8 */ 0x8D99,0xBBAF, + /* Array index: 0x45C8 */ 0x8E2E,0xE7F7, + /* Array index: 0x45C8 */ 0x8EB2,0xB8FA, + /* Array index: 0x45C8 */ 0x8EBA,0xBDF6, + /* Array index: 0x45C8 */ 0x8EBD,0xEBC8, + /* Array index: 0x45C8 */ 0x8EC0,0xC2DF, + /* Array index: 0x45C8 */ 0x8EC2,0xF355, + /* Array index: 0x45C8 */ 0x8F9B,0xA8AF, + /* Array index: 0x45C8 */ 0x8F9C,0xB664, + /* Array index: 0x45C8 */ 0x8F9F,0xB940, + /* Array index: 0x45C8 */ 0x8FA3,0xBBB6, + /* Array index: 0x45C8 */ 0x8FA6,0xBFEC, + /* Array index: 0x45C8 */ 0x8FA8,0xBFEB, + /* Array index: 0x45C8 */ 0x8FBF,0xCBA6, + /* Array index: 0x45C8 */ 0x8FC9,0xCBA5, + /* Array index: 0x45C8 */ 0x8FCB,0xCDCD, + /* Array index: 0x45C8 */ 0x90AA,0xA8B8, + /* Array index: 0x45C8 */ 0x90CE,0xADA6, + /* Array index: 0x45C8 */ 0x925E,0xE0B5, + /* Array index: 0x45C8 */ 0x92BB,0xBE4F, + /* Array index: 0x45C8 */ 0x92BC,0xBE56, + /* Array index: 0x45C8 */ 0x933C,0xEBE5, + /* Array index: 0x45C8 */ 0x936A,0xEEDE, + /* Array index: 0x45C8 */ 0x936C,0xC1EA, + /* Array index: 0x45C8 */ 0x936D,0xEEDB, + /* Array index: 0x45C8 */ 0x9370,0xC1EC, + /* Array index: 0x45C8 */ 0x9371,0xEEE4, + /* Array index: 0x45C8 */ 0x93EC,0xF367, + /* Array index: 0x45C8 */ 0x93EE,0xF36E, + /* Array index: 0x45C8 */ 0x9403,0xC4C2, + /* Array index: 0x45C8 */ 0x9420,0xF4EA, + /* Array index: 0x45C8 */ 0x9455,0xF84B, + /* Array index: 0x45C8 */ 0x9457,0xF84D, + /* Array index: 0x45C8 */ 0x945D,0xF84C, + /* Array index: 0x45C8 */ 0x945E,0xF84E, + /* Array index: 0x45C8 */ 0x9577,0xAAF8, + /* Array index: 0x45C8 */ 0x9580,0xAAF9, + /* Array index: 0x45C8 */ 0x9582,0xADAC, + /* Array index: 0x45C8 */ 0x9583,0xB07B, + /* Array index: 0x45C8 */ 0x9586,0xD845, + /* Array index: 0x45C8 */ 0x9598,0xB968, + /* Array index: 0x45C8 */ 0x961C,0xAAFA, + /* Array index: 0x45C8 */ 0x9628,0xCBAE, + /* Array index: 0x45C8 */ 0x9658,0xB0A4, + /* Array index: 0x45C8 */ 0x9716,0xC04D, + /* Array index: 0x45C8 */ 0x9735,0xF66E, + /* Array index: 0x45C8 */ 0x9752,0xAB43, + /* Array index: 0x45C8 */ 0x9756,0xB974, + /* Array index: 0x45C8 */ 0x9788,0xE8B3, + /* Array index: 0x45C8 */ 0x9794,0xEC56, + /* Array index: 0x45C8 */ 0x97B3,0xF3A1, + /* Array index: 0x45C8 */ 0x97B6,0xF3A3, + /* Array index: 0x45C8 */ 0x97B7,0xF3A2, + /* Array index: 0x45C8 */ 0x97B9,0xF54A, + /* Array index: 0x45C8 */ 0x97BB,0xF54B, + /* Array index: 0x45C8 */ 0x97BF,0xF670, + /* Array index: 0x45C8 */ 0x97ED,0xADB4, + /* Array index: 0x45C8 */ 0x97F0,0xEC57, + /* Array index: 0x45C8 */ 0x97F1,0xEF44, + /* Array index: 0x45C8 */ 0x97F3,0xADB5, + /* Array index: 0x45C8 */ 0x98B6,0xC1FC, + /* Array index: 0x45C8 */ 0x98C9,0xF673, + /* Array index: 0x45C8 */ 0x98CB,0xF775, + /* Array index: 0x45C8 */ 0x98CC,0xF9B0, + /* Array index: 0x45C8 */ 0x98DB,0xADB8, + /* Array index: 0x45C8 */ 0x98DF,0xADB9, + /* Array index: 0x45C8 */ 0x98E2,0xB0A7, + /* Array index: 0x45C8 */ 0x98E3,0xD448, + /* Array index: 0x45C8 */ 0x98E5,0xD84F, + /* Array index: 0x45C8 */ 0x98F2,0xB6BC, + /* Array index: 0x45C8 */ 0x98F4,0xB97E, + /* Array index: 0x45C8 */ 0x98F6,0xE0E2, + /* Array index: 0x45C8 */ 0x99A1,0xEF57, + /* Array index: 0x45C8 */ 0x99C7,0xE4D9, + /* Array index: 0x45C8 */ 0x9AA8,0xB0A9, + /* Array index: 0x45C8 */ 0x9AAB,0xE0E9, + /* Array index: 0x45C8 */ 0x9AC6,0xF566, + /* Array index: 0x45C8 */ 0x9AC7,0xF564, + /* Array index: 0x45C8 */ 0x9ACA,0xF565, + /* Array index: 0x45C8 */ 0x9ADC,0xF1BA, + /* Array index: 0x45C8 */ 0x9ADF,0xD449, + /* Array index: 0x45C8 */ 0x9AE1,0xB9A6, + /* Array index: 0x45C8 */ 0x9AE3,0xE4DB, + /* Array index: 0x45C8 */ 0x9AE6,0xBBEC, + /* Array index: 0x45C8 */ 0x9AE7,0xE4DC, + /* Array index: 0x45C8 */ 0x9B6C,0xE8E3, + /* Array index: 0x45C8 */ 0x9B9A,0xEF6A, + /* Array index: 0x45C8 */ 0x9B9B,0xEF6D, + /* Array index: 0x45C8 */ 0x9BF0,0xF3CE, + /* Array index: 0x45C8 */ 0x9BF7,0xF56C, + /* Array index: 0x45C8 */ 0x9BF8,0xF56F, + /* Array index: 0x45C8 */ 0x9BFD,0xC356, + /* Array index: 0x45C8 */ 0x9C17,0xF574, + /* Array index: 0x45C8 */ 0x9C1C,0xF6AB, + /* Array index: 0x45C8 */ 0x9C1D,0xF6AA, + /* Array index: 0x45C8 */ 0x9C44,0xF7AD, + /* Array index: 0x45C8 */ 0x9C6D,0xF95C, + /* Array index: 0x45C8 */ 0x9C6E,0xF95B, + /* Array index: 0x45C8 */ 0x9CED,0xE0EC, + /* Array index: 0x45C8 */ 0x9D10,0xECAC, + /* Array index: 0x45C8 */ 0x9D12,0xC06F, + /* Array index: 0x45C8 */ 0x9D90,0xF57D, + /* Array index: 0x45C8 */ 0x9D92,0xF57B, + /* Array index: 0x45C8 */ 0x9E75,0xB3BF, + /* Array index: 0x45C8 */ 0x9EAD,0xECB3, + /* Array index: 0x45C8 */ 0x9EAE,0xECB2, + /* Array index: 0x45C8 */ 0x9EB0,0xEFAD, + /* Array index: 0x45C8 */ 0x9EBB,0xB3C2, + /* Array index: 0x45C8 */ 0x9EBC,0xBBF2, + /* Array index: 0x45C8 */ 0x9EBE,0xBEA3, + /* Array index: 0x45C8 */ 0x9EC0,0xF3F4, + /* Array index: 0x45C8 */ 0x9EC2,0xF874, + /* Array index: 0x45C8 */ 0x9EC3,0xB6C0, + /* Array index: 0x45C8 */ 0x9EC8,0xEFAE, + /* Array index: 0x45C8 */ 0x9F3B,0xBBF3, + /* Array index: 0x45C8 */ 0x9F7E,0xF9D3, + /* Array index: 0x45C8 */ 0x9F8D,0xC073, + /* Array index: 0x45C8 */ 0x9F98,0xF9D5, + /* Array index: 0x45C8 */ 0x9F9C,0xC074, + /* Array index: 0x45C8 */ 0x9FA0,0xEFB6, + /* Array index: 0x45C8 */ 0x9FA2,0xF7CF, + /* Array index: 0x45C8 */ 0x9FA4,0xF9A1, + /* Array index: 0x45C8 */ 0xFA0C,0xC94A, + /* Array index: 0x45C8 */ 0xFA0D,0xDDFC, + /* Array index: 0x45C8 */ 0xFF64,0xA14E, + /* Array index: 0x45C8 */ 0xFFFD,0xA15A, +}; + +#endif /* ICONV_FROM_UCS_CCS_BIG5 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * big5 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_big5 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_BIG5, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_BIG5) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_big5, /* UCS -> big5 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_BIG5) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_big5, /* UCS -> big5 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_BIG5) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_big5 /* big5 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_BIG5) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_big5 /* big5 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_BIG5) || ... */ + diff --git a/lib/iconv/ccs/binary/Makefile.inc b/lib/iconv/ccs/binary/Makefile.inc new file mode 100644 index 0000000..7858230 --- /dev/null +++ b/lib/iconv/ccs/binary/Makefile.inc @@ -0,0 +1,14 @@ +cct_DATA += \ + %D%/iso_8859_10.cct %D%/iso_8859_13.cct %D%/iso_8859_14.cct %D%/iso_8859_15.cct \ + %D%/iso_8859_1.cct %D%/iso_8859_2.cct %D%/iso_8859_3.cct %D%/iso_8859_4.cct \ + %D%/iso_8859_5.cct %D%/iso_8859_6.cct %D%/iso_8859_7.cct %D%/iso_8859_8.cct \ + %D%/iso_8859_9.cct %D%/iso_8859_11.cct \ + %D%/win_1250.cct %D%/win_1252.cct %D%/win_1254.cct \ + %D%/win_1256.cct %D%/win_1258.cct %D%/win_1251.cct \ + %D%/win_1253.cct %D%/win_1255.cct %D%/win_1257.cct \ + %D%/koi8_r.cct %D%/koi8_u.cct %D%/koi8_ru.cct %D%/koi8_uni.cct \ + %D%/iso_ir_111.cct \ + %D%/big5.cct \ + %D%/cp775.cct %D%/cp850.cct %D%/cp852.cct %D%/cp855.cct %D%/cp866.cct \ + %D%/jis_x0212_1990.cct %D%/jis_x0201_1976.cct %D%/jis_x0208_1990.cct %D%/ksx1001.cct \ + %D%/cns11643_plane1.cct %D%/cns11643_plane2.cct %D%/cns11643_plane14.cct diff --git a/lib/iconv/ccs/binary/big5.cct b/lib/iconv/ccs/binary/big5.cct new file mode 100644 index 0000000..b033093 Binary files /dev/null and b/lib/iconv/ccs/binary/big5.cct differ diff --git a/lib/iconv/ccs/binary/cns11643_plane1.cct b/lib/iconv/ccs/binary/cns11643_plane1.cct new file mode 100644 index 0000000..509604b Binary files /dev/null and b/lib/iconv/ccs/binary/cns11643_plane1.cct differ diff --git a/lib/iconv/ccs/binary/cns11643_plane14.cct b/lib/iconv/ccs/binary/cns11643_plane14.cct new file mode 100644 index 0000000..bdd01f4 Binary files /dev/null and b/lib/iconv/ccs/binary/cns11643_plane14.cct differ diff --git a/lib/iconv/ccs/binary/cns11643_plane2.cct b/lib/iconv/ccs/binary/cns11643_plane2.cct new file mode 100644 index 0000000..29cedd4 Binary files /dev/null and b/lib/iconv/ccs/binary/cns11643_plane2.cct differ diff --git a/lib/iconv/ccs/binary/cp775.cct b/lib/iconv/ccs/binary/cp775.cct new file mode 100644 index 0000000..88c7755 Binary files /dev/null and b/lib/iconv/ccs/binary/cp775.cct differ diff --git a/lib/iconv/ccs/binary/cp850.cct b/lib/iconv/ccs/binary/cp850.cct new file mode 100644 index 0000000..527e0f7 Binary files /dev/null and b/lib/iconv/ccs/binary/cp850.cct differ diff --git a/lib/iconv/ccs/binary/cp852.cct b/lib/iconv/ccs/binary/cp852.cct new file mode 100644 index 0000000..a30201c Binary files /dev/null and b/lib/iconv/ccs/binary/cp852.cct differ diff --git a/lib/iconv/ccs/binary/cp855.cct b/lib/iconv/ccs/binary/cp855.cct new file mode 100644 index 0000000..b49c83d Binary files /dev/null and b/lib/iconv/ccs/binary/cp855.cct differ diff --git a/lib/iconv/ccs/binary/cp866.cct b/lib/iconv/ccs/binary/cp866.cct new file mode 100644 index 0000000..0fb184f Binary files /dev/null and b/lib/iconv/ccs/binary/cp866.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_1.cct b/lib/iconv/ccs/binary/iso_8859_1.cct new file mode 100644 index 0000000..a1030d6 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_1.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_10.cct b/lib/iconv/ccs/binary/iso_8859_10.cct new file mode 100644 index 0000000..c6ef964 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_10.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_11.cct b/lib/iconv/ccs/binary/iso_8859_11.cct new file mode 100644 index 0000000..a88fb21 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_11.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_13.cct b/lib/iconv/ccs/binary/iso_8859_13.cct new file mode 100644 index 0000000..b2b8d21 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_13.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_14.cct b/lib/iconv/ccs/binary/iso_8859_14.cct new file mode 100644 index 0000000..844576c Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_14.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_15.cct b/lib/iconv/ccs/binary/iso_8859_15.cct new file mode 100644 index 0000000..9a7df7e Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_15.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_2.cct b/lib/iconv/ccs/binary/iso_8859_2.cct new file mode 100644 index 0000000..5224213 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_2.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_3.cct b/lib/iconv/ccs/binary/iso_8859_3.cct new file mode 100644 index 0000000..c6b6a8f Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_3.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_4.cct b/lib/iconv/ccs/binary/iso_8859_4.cct new file mode 100644 index 0000000..521765f Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_4.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_5.cct b/lib/iconv/ccs/binary/iso_8859_5.cct new file mode 100644 index 0000000..8901b5f Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_5.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_6.cct b/lib/iconv/ccs/binary/iso_8859_6.cct new file mode 100644 index 0000000..07dcd9c Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_6.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_7.cct b/lib/iconv/ccs/binary/iso_8859_7.cct new file mode 100644 index 0000000..c668611 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_7.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_8.cct b/lib/iconv/ccs/binary/iso_8859_8.cct new file mode 100644 index 0000000..57c46c4 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_8.cct differ diff --git a/lib/iconv/ccs/binary/iso_8859_9.cct b/lib/iconv/ccs/binary/iso_8859_9.cct new file mode 100644 index 0000000..a5e095c Binary files /dev/null and b/lib/iconv/ccs/binary/iso_8859_9.cct differ diff --git a/lib/iconv/ccs/binary/iso_ir_111.cct b/lib/iconv/ccs/binary/iso_ir_111.cct new file mode 100644 index 0000000..56bd3f9 Binary files /dev/null and b/lib/iconv/ccs/binary/iso_ir_111.cct differ diff --git a/lib/iconv/ccs/binary/jis_x0201_1976.cct b/lib/iconv/ccs/binary/jis_x0201_1976.cct new file mode 100644 index 0000000..29fbcb3 Binary files /dev/null and b/lib/iconv/ccs/binary/jis_x0201_1976.cct differ diff --git a/lib/iconv/ccs/binary/jis_x0208_1990.cct b/lib/iconv/ccs/binary/jis_x0208_1990.cct new file mode 100644 index 0000000..11d3bb4 Binary files /dev/null and b/lib/iconv/ccs/binary/jis_x0208_1990.cct differ diff --git a/lib/iconv/ccs/binary/jis_x0212_1990.cct b/lib/iconv/ccs/binary/jis_x0212_1990.cct new file mode 100644 index 0000000..06eb9b8 Binary files /dev/null and b/lib/iconv/ccs/binary/jis_x0212_1990.cct differ diff --git a/lib/iconv/ccs/binary/koi8_r.cct b/lib/iconv/ccs/binary/koi8_r.cct new file mode 100644 index 0000000..103272d Binary files /dev/null and b/lib/iconv/ccs/binary/koi8_r.cct differ diff --git a/lib/iconv/ccs/binary/koi8_ru.cct b/lib/iconv/ccs/binary/koi8_ru.cct new file mode 100644 index 0000000..01a9abd Binary files /dev/null and b/lib/iconv/ccs/binary/koi8_ru.cct differ diff --git a/lib/iconv/ccs/binary/koi8_u.cct b/lib/iconv/ccs/binary/koi8_u.cct new file mode 100644 index 0000000..2c8c2a4 Binary files /dev/null and b/lib/iconv/ccs/binary/koi8_u.cct differ diff --git a/lib/iconv/ccs/binary/koi8_uni.cct b/lib/iconv/ccs/binary/koi8_uni.cct new file mode 100644 index 0000000..8744449 Binary files /dev/null and b/lib/iconv/ccs/binary/koi8_uni.cct differ diff --git a/lib/iconv/ccs/binary/ksx1001.cct b/lib/iconv/ccs/binary/ksx1001.cct new file mode 100644 index 0000000..2bfef00 Binary files /dev/null and b/lib/iconv/ccs/binary/ksx1001.cct differ diff --git a/lib/iconv/ccs/binary/win_1250.cct b/lib/iconv/ccs/binary/win_1250.cct new file mode 100644 index 0000000..5a4b4af Binary files /dev/null and b/lib/iconv/ccs/binary/win_1250.cct differ diff --git a/lib/iconv/ccs/binary/win_1251.cct b/lib/iconv/ccs/binary/win_1251.cct new file mode 100644 index 0000000..37e64b4 Binary files /dev/null and b/lib/iconv/ccs/binary/win_1251.cct differ diff --git a/lib/iconv/ccs/binary/win_1252.cct b/lib/iconv/ccs/binary/win_1252.cct new file mode 100644 index 0000000..1375127 Binary files /dev/null and b/lib/iconv/ccs/binary/win_1252.cct differ diff --git a/lib/iconv/ccs/binary/win_1253.cct b/lib/iconv/ccs/binary/win_1253.cct new file mode 100644 index 0000000..303dd4c Binary files /dev/null and b/lib/iconv/ccs/binary/win_1253.cct differ diff --git a/lib/iconv/ccs/binary/win_1254.cct b/lib/iconv/ccs/binary/win_1254.cct new file mode 100644 index 0000000..e866480 Binary files /dev/null and b/lib/iconv/ccs/binary/win_1254.cct differ diff --git a/lib/iconv/ccs/binary/win_1255.cct b/lib/iconv/ccs/binary/win_1255.cct new file mode 100644 index 0000000..092c358 Binary files /dev/null and b/lib/iconv/ccs/binary/win_1255.cct differ diff --git a/lib/iconv/ccs/binary/win_1256.cct b/lib/iconv/ccs/binary/win_1256.cct new file mode 100644 index 0000000..6a458d3 Binary files /dev/null and b/lib/iconv/ccs/binary/win_1256.cct differ diff --git a/lib/iconv/ccs/binary/win_1257.cct b/lib/iconv/ccs/binary/win_1257.cct new file mode 100644 index 0000000..c5fcabc Binary files /dev/null and b/lib/iconv/ccs/binary/win_1257.cct differ diff --git a/lib/iconv/ccs/binary/win_1258.cct b/lib/iconv/ccs/binary/win_1258.cct new file mode 100644 index 0000000..3de80ba Binary files /dev/null and b/lib/iconv/ccs/binary/win_1258.cct differ diff --git a/lib/iconv/ccs/ccs.h b/lib/iconv/ccs/ccs.h new file mode 100644 index 0000000..c640b64 --- /dev/null +++ b/lib/iconv/ccs/ccs.h @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef __CCS_H__ +#define __CCS_H__ + +#include <_ansi.h> +#include +#include + +/* + * Size-optimized tables will be linked instead of speed-optimized if + * TABLE_USE_SIZE_OPTIMISATION macro is defined. + */ +#if defined (PREFER_SIZE_OVER_SPEED) || defined (__OPTIMIZE_SIZE__) +# define TABLE_USE_SIZE_OPTIMIZATION +#endif + +/* Invalid code marker */ +#define INVALC 0xFFFF +/* Invalid block marker - marks empty blocks in speed-optimized tables */ +#define INVBLK 0xFFFF +/* Lost code marker - marks codes that was lost during CCS->UCS mapping */ +#define LOST_C DEFAULT_CHARACTER + +/* + * Table parameters values. + */ +/* Table version 1.0 identifier */ +#define TABLE_VERSION_1 1 +/* 8 and 16 bit tables identifiers */ +#define TABLE_8BIT 8 +#define TABLE_16BIT 16 +/* Size-optimized and speed-optimized tables identifiers */ +#define TABLE_SIZE_OPTIMIZED 1 +#define TABLE_SPEED_OPTIMIZED 2 +/* Built-in/external tables identifiers */ +#define TABLE_BUILTIN 1 +#define TABLE_EXTERNAL 2 + +/* + * Binary table fields. + */ +/* "No table" marker */ +#define EXTTABLE_NO_TABLE 0 +/* Version offset (2 bytes) */ +#define EXTTABLE_VERSION_OFF 0 +/* Bits number offset (2 bytes) */ +#define EXTTABLE_BITS_OFF 2 +/* CCS name length offset (2 bytes) */ +#define EXTTABLE_CCSNAME_LEN_OFF 4 +/* CCS name offset (expanded to even bytes number)*/ +#define EXTTABLE_CCSNAME_OFF 8 +/* Header length (minus CCS name) */ +#define EXTTABLE_HEADER_LEN (EXTTABLE_CCSNAME_OFF + 16*4) +/* Tables and lengths offsets minus CCS name length (4 bytes) */ +#define EXTTABLE_FROM_SPEED_BE_OFF (EXTTABLE_CCSNAME_OFF + 0) +#define EXTTABLE_FROM_SPEED_BE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 4) +#define EXTTABLE_FROM_SPEED_LE_OFF (EXTTABLE_CCSNAME_OFF + 8) +#define EXTTABLE_FROM_SPEED_LE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 12) +#define EXTTABLE_FROM_SIZE_BE_OFF (EXTTABLE_CCSNAME_OFF + 16) +#define EXTTABLE_FROM_SIZE_BE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 20) +#define EXTTABLE_FROM_SIZE_LE_OFF (EXTTABLE_CCSNAME_OFF + 24) +#define EXTTABLE_FROM_SIZE_LE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 28) +#define EXTTABLE_TO_SPEED_BE_OFF (EXTTABLE_CCSNAME_OFF + 32) +#define EXTTABLE_TO_SPEED_BE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 36) +#define EXTTABLE_TO_SPEED_LE_OFF (EXTTABLE_CCSNAME_OFF + 40) +#define EXTTABLE_TO_SPEED_LE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 44) +#define EXTTABLE_TO_SIZE_BE_OFF (EXTTABLE_CCSNAME_OFF + 48) +#define EXTTABLE_TO_SIZE_BE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 52) +#define EXTTABLE_TO_SIZE_LE_OFF (EXTTABLE_CCSNAME_OFF + 56) +#define EXTTABLE_TO_SIZE_LE_LEN_OFF (EXTTABLE_CCSNAME_OFF + 60) +/* Endian-independent offsets */ +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define EXTTABLE_FROM_SPEED_OFF EXTTABLE_FROM_SPEED_LE_OFF +# define EXTTABLE_FROM_SIZE_OFF EXTTABLE_FROM_SIZE_LE_OFF +# define EXTTABLE_TO_SPEED_OFF EXTTABLE_TO_SPEED_LE_OFF +# define EXTTABLE_TO_SIZE_OFF EXTTABLE_TO_SIZE_LE_OFF +# define EXTTABLE_FROM_SPEED_LEN_OFF EXTTABLE_FROM_SPEED_LE_LEN_OFF +# define EXTTABLE_FROM_SIZE_LEN_OFF EXTTABLE_FROM_SIZE_LE_LEN_OFF +# define EXTTABLE_TO_SPEED_LEN_OFF EXTTABLE_TO_SPEED_LE_LEN_OFF +# define EXTTABLE_TO_SIZE_LEN_OFF EXTTABLE_TO_SIZE_LE_LEN_OFF +#elif (BYTE_ORDER == BIG_ENDIAN) +# define EXTTABLE_FROM_SPEED_OFF EXTTABLE_FROM_SPEED_BE_OFF +# define EXTTABLE_FROM_SIZE_OFF EXTTABLE_FROM_SIZE_BE_OFF +# define EXTTABLE_TO_SPEED_OFF EXTTABLE_TO_SPEED_BE_OFF +# define EXTTABLE_TO_SIZE_OFF EXTTABLE_TO_SIZE_BE_OFF +# define EXTTABLE_FROM_SPEED_LEN_OFF EXTTABLE_FROM_SPEED_BE_LEN_OFF +# define EXTTABLE_FROM_SIZE_LEN_OFF EXTTABLE_FROM_SIZE_BE_LEN_OFF +# define EXTTABLE_TO_SPEED_LEN_OFF EXTTABLE_TO_SPEED_BE_LEN_OFF +# define EXTTABLE_TO_SIZE_LEN_OFF EXTTABLE_TO_SIZE_BE_LEN_OFF +#endif + +/* + * Size-optimized suitable fields indexes. + */ +/* Ranges number array index */ +#define RANGES_NUM_INDEX 0 +/* Un-ranged codes number array index */ +#define UNRANGED_NUM_INDEX 1 +/* First un-ranged pair index array index */ +#define FIRST_UNRANGED_INDEX_INDEX 2 +/* First range array index */ +#define FIRST_RANGE_INDEX 3 + + +/* + * Builtin CCS table description structure. + */ +typedef struct +{ + __uint16_t ver; /* Table version */ + const char *name; /* CCS name */ + __uint16_t bits; /* CCS's bits number */ + int from_ucs_type; /* UCS -> CCS table optimization type */ + const __uint16_t *from_ucs; /* UCS -> CCS table */ + int to_ucs_type; /* CCS -> UCS table optimization type */ + const __uint16_t *to_ucs; /* CCS -> UCS table */ +} iconv_ccs_t; + +/* + * CCS table descriptor. + */ +typedef struct +{ + int bits; /* CCS's bits number */ + int type; /* Table type (builtin/external) */ + int optimization; /* Table optimization type (speed/size) */ + const __uint16_t *tbl; /* Table's data */ +} iconv_ccs_desc_t; + +/* Array containing all built-in CCS tables */ +extern const iconv_ccs_t * +_iconv_ccs[]; + +#endif /* __CCS_H__ */ + diff --git a/lib/iconv/ccs/ccsbi.c b/lib/iconv/ccs/ccsbi.c new file mode 100644 index 0000000..376123e --- /dev/null +++ b/lib/iconv/ccs/ccsbi.c @@ -0,0 +1,179 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#include <_ansi.h> +#include "ccsbi.h" + +/* + * The following array contains the list of built-in CCS tables. + */ +const iconv_ccs_t * +_iconv_ccs[] = +{ +#if defined (ICONV_TO_UCS_CCS_BIG5) \ + || defined (ICONV_FROM_UCS_CCS_BIG5) + &_iconv_ccs_big5, +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) + &_iconv_ccs_cns11643_plane1, +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) + &_iconv_ccs_cns11643_plane14, +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) + &_iconv_ccs_cns11643_plane2, +#endif +#if defined (ICONV_TO_UCS_CCS_CP775) \ + || defined (ICONV_FROM_UCS_CCS_CP775) + &_iconv_ccs_cp775, +#endif +#if defined (ICONV_TO_UCS_CCS_CP850) \ + || defined (ICONV_FROM_UCS_CCS_CP850) + &_iconv_ccs_cp850, +#endif +#if defined (ICONV_TO_UCS_CCS_CP852) \ + || defined (ICONV_FROM_UCS_CCS_CP852) + &_iconv_ccs_cp852, +#endif +#if defined (ICONV_TO_UCS_CCS_CP855) \ + || defined (ICONV_FROM_UCS_CCS_CP855) + &_iconv_ccs_cp855, +#endif +#if defined (ICONV_TO_UCS_CCS_CP866) \ + || defined (ICONV_FROM_UCS_CCS_CP866) + &_iconv_ccs_cp866, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_1) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_1) + &_iconv_ccs_iso_8859_1, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_10) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_10) + &_iconv_ccs_iso_8859_10, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_11) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_11) + &_iconv_ccs_iso_8859_11, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_13) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_13) + &_iconv_ccs_iso_8859_13, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_14) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_14) + &_iconv_ccs_iso_8859_14, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_15) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_15) + &_iconv_ccs_iso_8859_15, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_2) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_2) + &_iconv_ccs_iso_8859_2, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_3) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_3) + &_iconv_ccs_iso_8859_3, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_4) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_4) + &_iconv_ccs_iso_8859_4, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_5) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_5) + &_iconv_ccs_iso_8859_5, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_6) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_6) + &_iconv_ccs_iso_8859_6, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_7) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_7) + &_iconv_ccs_iso_8859_7, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_8) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_8) + &_iconv_ccs_iso_8859_8, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_9) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_9) + &_iconv_ccs_iso_8859_9, +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_IR_111) \ + || defined (ICONV_FROM_UCS_CCS_ISO_IR_111) + &_iconv_ccs_iso_ir_111, +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0201_1976) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0201_1976) + &_iconv_ccs_jis_x0201_1976, +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) + &_iconv_ccs_jis_x0208_1990, +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) + &_iconv_ccs_jis_x0212_1990, +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_R) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_R) + &_iconv_ccs_koi8_r, +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_RU) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_RU) + &_iconv_ccs_koi8_ru, +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_U) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_U) + &_iconv_ccs_koi8_u, +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_UNI) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_UNI) + &_iconv_ccs_koi8_uni, +#endif +#if defined (ICONV_TO_UCS_CCS_KSX1001) \ + || defined (ICONV_FROM_UCS_CCS_KSX1001) + &_iconv_ccs_ksx1001, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1250) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1250) + &_iconv_ccs_win_1250, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1251) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1251) + &_iconv_ccs_win_1251, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1252) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1252) + &_iconv_ccs_win_1252, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1253) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1253) + &_iconv_ccs_win_1253, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1254) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1254) + &_iconv_ccs_win_1254, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1255) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1255) + &_iconv_ccs_win_1255, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1256) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1256) + &_iconv_ccs_win_1256, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1257) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1257) + &_iconv_ccs_win_1257, +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1258) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1258) + &_iconv_ccs_win_1258, +#endif + NULL +}; diff --git a/lib/iconv/ccs/ccsbi.h b/lib/iconv/ccs/ccsbi.h new file mode 100644 index 0000000..97a88a0 --- /dev/null +++ b/lib/iconv/ccs/ccsbi.h @@ -0,0 +1,521 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#ifndef __CCSBI_H__ +#define __CCSBI_H__ + +#include +#include <_ansi.h> +#include "ccs.h" + +/* + * Enable CCS tables if encoding needs them. + * Defining ICONV_TO_UCS_CCS_XXX macro or ICONV_FROM_UCS_CCS_XXX + * macro is needed to enable "XXX encoding -> UCS" or "UCS -> XXX encoding" + * part of CCS table. + * CCS tables aren't linked if Newlib was configuted to use external CCS tables. + */ +#ifndef _ICONV_ENABLE_EXTERNAL_CCS + +#if defined (_ICONV_FROM_ENCODING_BIG5) +# define ICONV_TO_UCS_CCS_BIG5 +#endif +#if defined (_ICONV_TO_ENCODING_BIG5) +# define ICONV_FROM_UCS_CCS_BIG5 +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_TW) +# define ICONV_TO_UCS_CCS_CNS11643_PLANE1 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_TW) +# define ICONV_FROM_UCS_CCS_CNS11643_PLANE1 +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_TW) +# define ICONV_TO_UCS_CCS_CNS11643_PLANE14 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_TW) +# define ICONV_FROM_UCS_CCS_CNS11643_PLANE14 +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_TW) +# define ICONV_TO_UCS_CCS_CNS11643_PLANE2 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_TW) +# define ICONV_FROM_UCS_CCS_CNS11643_PLANE2 +#endif + +#if defined (_ICONV_FROM_ENCODING_CP775) +# define ICONV_TO_UCS_CCS_CP775 +#endif +#if defined (_ICONV_TO_ENCODING_CP775) +# define ICONV_FROM_UCS_CCS_CP775 +#endif + +#if defined (_ICONV_FROM_ENCODING_CP850) +# define ICONV_TO_UCS_CCS_CP850 +#endif +#if defined (_ICONV_TO_ENCODING_CP850) +# define ICONV_FROM_UCS_CCS_CP850 +#endif + +#if defined (_ICONV_FROM_ENCODING_CP852) +# define ICONV_TO_UCS_CCS_CP852 +#endif +#if defined (_ICONV_TO_ENCODING_CP852) +# define ICONV_FROM_UCS_CCS_CP852 +#endif + +#if defined (_ICONV_FROM_ENCODING_CP855) +# define ICONV_TO_UCS_CCS_CP855 +#endif +#if defined (_ICONV_TO_ENCODING_CP855) +# define ICONV_FROM_UCS_CCS_CP855 +#endif + +#if defined (_ICONV_FROM_ENCODING_CP866) +# define ICONV_TO_UCS_CCS_CP866 +#endif +#if defined (_ICONV_TO_ENCODING_CP866) +# define ICONV_FROM_UCS_CCS_CP866 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_1) +# define ICONV_TO_UCS_CCS_ISO_8859_1 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_1) +# define ICONV_FROM_UCS_CCS_ISO_8859_1 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_10) +# define ICONV_TO_UCS_CCS_ISO_8859_10 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_10) +# define ICONV_FROM_UCS_CCS_ISO_8859_10 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_11) +# define ICONV_TO_UCS_CCS_ISO_8859_11 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_11) +# define ICONV_FROM_UCS_CCS_ISO_8859_11 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_13) +# define ICONV_TO_UCS_CCS_ISO_8859_13 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_13) +# define ICONV_FROM_UCS_CCS_ISO_8859_13 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_14) +# define ICONV_TO_UCS_CCS_ISO_8859_14 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_14) +# define ICONV_FROM_UCS_CCS_ISO_8859_14 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_15) +# define ICONV_TO_UCS_CCS_ISO_8859_15 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_15) +# define ICONV_FROM_UCS_CCS_ISO_8859_15 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_2) +# define ICONV_TO_UCS_CCS_ISO_8859_2 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_2) +# define ICONV_FROM_UCS_CCS_ISO_8859_2 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_3) +# define ICONV_TO_UCS_CCS_ISO_8859_3 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_3) +# define ICONV_FROM_UCS_CCS_ISO_8859_3 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_4) +# define ICONV_TO_UCS_CCS_ISO_8859_4 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_4) +# define ICONV_FROM_UCS_CCS_ISO_8859_4 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_5) +# define ICONV_TO_UCS_CCS_ISO_8859_5 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_5) +# define ICONV_FROM_UCS_CCS_ISO_8859_5 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_6) +# define ICONV_TO_UCS_CCS_ISO_8859_6 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_6) +# define ICONV_FROM_UCS_CCS_ISO_8859_6 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_7) +# define ICONV_TO_UCS_CCS_ISO_8859_7 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_7) +# define ICONV_FROM_UCS_CCS_ISO_8859_7 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_8) +# define ICONV_TO_UCS_CCS_ISO_8859_8 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_8) +# define ICONV_FROM_UCS_CCS_ISO_8859_8 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_8859_9) +# define ICONV_TO_UCS_CCS_ISO_8859_9 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_8859_9) +# define ICONV_FROM_UCS_CCS_ISO_8859_9 +#endif + +#if defined (_ICONV_FROM_ENCODING_ISO_IR_111) +# define ICONV_TO_UCS_CCS_ISO_IR_111 +#endif +#if defined (_ICONV_TO_ENCODING_ISO_IR_111) +# define ICONV_FROM_UCS_CCS_ISO_IR_111 +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_JP) +# define ICONV_TO_UCS_CCS_JIS_X0201_1976 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_JP) +# define ICONV_FROM_UCS_CCS_JIS_X0201_1976 +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_JP) +# define ICONV_TO_UCS_CCS_JIS_X0208_1990 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_JP) +# define ICONV_FROM_UCS_CCS_JIS_X0208_1990 +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_JP) +# define ICONV_TO_UCS_CCS_JIS_X0212_1990 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_JP) +# define ICONV_FROM_UCS_CCS_JIS_X0212_1990 +#endif + +#if defined (_ICONV_FROM_ENCODING_KOI8_R) +# define ICONV_TO_UCS_CCS_KOI8_R +#endif +#if defined (_ICONV_TO_ENCODING_KOI8_R) +# define ICONV_FROM_UCS_CCS_KOI8_R +#endif + +#if defined (_ICONV_FROM_ENCODING_KOI8_RU) +# define ICONV_TO_UCS_CCS_KOI8_RU +#endif +#if defined (_ICONV_TO_ENCODING_KOI8_RU) +# define ICONV_FROM_UCS_CCS_KOI8_RU +#endif + +#if defined (_ICONV_FROM_ENCODING_KOI8_U) +# define ICONV_TO_UCS_CCS_KOI8_U +#endif +#if defined (_ICONV_TO_ENCODING_KOI8_U) +# define ICONV_FROM_UCS_CCS_KOI8_U +#endif + +#if defined (_ICONV_FROM_ENCODING_KOI8_UNI) +# define ICONV_TO_UCS_CCS_KOI8_UNI +#endif +#if defined (_ICONV_TO_ENCODING_KOI8_UNI) +# define ICONV_FROM_UCS_CCS_KOI8_UNI +#endif + +#if defined (_ICONV_FROM_ENCODING_EUC_KR) +# define ICONV_TO_UCS_CCS_KSX1001 +#endif +#if defined (_ICONV_TO_ENCODING_EUC_KR) +# define ICONV_FROM_UCS_CCS_KSX1001 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1250) +# define ICONV_TO_UCS_CCS_WIN_1250 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1250) +# define ICONV_FROM_UCS_CCS_WIN_1250 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1251) +# define ICONV_TO_UCS_CCS_WIN_1251 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1251) +# define ICONV_FROM_UCS_CCS_WIN_1251 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1252) +# define ICONV_TO_UCS_CCS_WIN_1252 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1252) +# define ICONV_FROM_UCS_CCS_WIN_1252 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1253) +# define ICONV_TO_UCS_CCS_WIN_1253 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1253) +# define ICONV_FROM_UCS_CCS_WIN_1253 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1254) +# define ICONV_TO_UCS_CCS_WIN_1254 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1254) +# define ICONV_FROM_UCS_CCS_WIN_1254 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1255) +# define ICONV_TO_UCS_CCS_WIN_1255 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1255) +# define ICONV_FROM_UCS_CCS_WIN_1255 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1256) +# define ICONV_TO_UCS_CCS_WIN_1256 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1256) +# define ICONV_FROM_UCS_CCS_WIN_1256 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1257) +# define ICONV_TO_UCS_CCS_WIN_1257 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1257) +# define ICONV_FROM_UCS_CCS_WIN_1257 +#endif + +#if defined (_ICONV_FROM_ENCODING_WIN_1258) +# define ICONV_TO_UCS_CCS_WIN_1258 +#endif +#if defined (_ICONV_TO_ENCODING_WIN_1258) +# define ICONV_FROM_UCS_CCS_WIN_1258 +#endif + +/* + * CCS table description structures forward declarations. + */ +#if defined (ICONV_TO_UCS_CCS_BIG5) \ + || defined (ICONV_FROM_UCS_CCS_BIG5) +extern const iconv_ccs_t +_iconv_ccs_big5; +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) +extern const iconv_ccs_t +_iconv_ccs_cns11643_plane1; +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) +extern const iconv_ccs_t +_iconv_ccs_cns11643_plane14; +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) +extern const iconv_ccs_t +_iconv_ccs_cns11643_plane2; +#endif +#if defined (ICONV_TO_UCS_CCS_CP775) \ + || defined (ICONV_FROM_UCS_CCS_CP775) +extern const iconv_ccs_t +_iconv_ccs_cp775; +#endif +#if defined (ICONV_TO_UCS_CCS_CP850) \ + || defined (ICONV_FROM_UCS_CCS_CP850) +extern const iconv_ccs_t +_iconv_ccs_cp850; +#endif +#if defined (ICONV_TO_UCS_CCS_CP852) \ + || defined (ICONV_FROM_UCS_CCS_CP852) +extern const iconv_ccs_t +_iconv_ccs_cp852; +#endif +#if defined (ICONV_TO_UCS_CCS_CP855) \ + || defined (ICONV_FROM_UCS_CCS_CP855) +extern const iconv_ccs_t +_iconv_ccs_cp855; +#endif +#if defined (ICONV_TO_UCS_CCS_CP866) \ + || defined (ICONV_FROM_UCS_CCS_CP866) +extern const iconv_ccs_t +_iconv_ccs_cp866; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_1) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_1) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_1; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_10) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_10) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_10; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_11) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_11) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_11; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_13) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_13) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_13; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_14) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_14) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_14; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_15) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_15) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_15; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_2) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_2) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_2; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_3) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_3) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_3; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_4) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_4) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_4; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_5) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_5) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_5; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_6) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_6) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_6; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_7) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_7) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_7; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_8) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_8) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_8; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_8859_9) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_9) +extern const iconv_ccs_t +_iconv_ccs_iso_8859_9; +#endif +#if defined (ICONV_TO_UCS_CCS_ISO_IR_111) \ + || defined (ICONV_FROM_UCS_CCS_ISO_IR_111) +extern const iconv_ccs_t +_iconv_ccs_iso_ir_111; +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0201_1976) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0201_1976) +extern const iconv_ccs_t +_iconv_ccs_jis_x0201_1976; +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) +extern const iconv_ccs_t +_iconv_ccs_jis_x0208_1990; +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) +extern const iconv_ccs_t +_iconv_ccs_jis_x0212_1990; +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_R) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_R) +extern const iconv_ccs_t +_iconv_ccs_koi8_r; +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_RU) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_RU) +extern const iconv_ccs_t +_iconv_ccs_koi8_ru; +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_U) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_U) +extern const iconv_ccs_t +_iconv_ccs_koi8_u; +#endif +#if defined (ICONV_TO_UCS_CCS_KOI8_UNI) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_UNI) +extern const iconv_ccs_t +_iconv_ccs_koi8_uni; +#endif +#if defined (ICONV_TO_UCS_CCS_KSX1001) \ + || defined (ICONV_FROM_UCS_CCS_KSX1001) +extern const iconv_ccs_t +_iconv_ccs_ksx1001; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1250) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1250) +extern const iconv_ccs_t +_iconv_ccs_win_1250; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1251) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1251) +extern const iconv_ccs_t +_iconv_ccs_win_1251; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1252) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1252) +extern const iconv_ccs_t +_iconv_ccs_win_1252; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1253) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1253) +extern const iconv_ccs_t +_iconv_ccs_win_1253; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1254) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1254) +extern const iconv_ccs_t +_iconv_ccs_win_1254; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1255) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1255) +extern const iconv_ccs_t +_iconv_ccs_win_1255; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1256) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1256) +extern const iconv_ccs_t +_iconv_ccs_win_1256; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1257) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1257) +extern const iconv_ccs_t +_iconv_ccs_win_1257; +#endif +#if defined (ICONV_TO_UCS_CCS_WIN_1258) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1258) +extern const iconv_ccs_t +_iconv_ccs_win_1258; +#endif + +#endif /* !_ICONV_ENABLE_EXTERNAL_CCS */ + + +#endif /* __CCSBI_H__ */ + diff --git a/lib/iconv/ccs/ccsnames.h b/lib/iconv/ccs/ccsnames.h new file mode 100644 index 0000000..24bfafc --- /dev/null +++ b/lib/iconv/ccs/ccsnames.h @@ -0,0 +1,56 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#ifndef __CCSNAMES_H__ +#define __CCSNAMES_H__ + +#include "../lib/encnames.h" + +/* + * CCS tables names macros. + */ +#define ICONV_CCS_BIG5 ICONV_ENCODING_BIG5 +#define ICONV_CCS_CNS11643_PLANE1 "cns11643_plane1" +#define ICONV_CCS_CNS11643_PLANE14 "cns11643_plane14" +#define ICONV_CCS_CNS11643_PLANE2 "cns11643_plane2" +#define ICONV_CCS_CP775 ICONV_ENCODING_CP775 +#define ICONV_CCS_CP850 ICONV_ENCODING_CP850 +#define ICONV_CCS_CP852 ICONV_ENCODING_CP852 +#define ICONV_CCS_CP855 ICONV_ENCODING_CP855 +#define ICONV_CCS_CP866 ICONV_ENCODING_CP866 +#define ICONV_CCS_ISO_8859_1 ICONV_ENCODING_ISO_8859_1 +#define ICONV_CCS_ISO_8859_10 ICONV_ENCODING_ISO_8859_10 +#define ICONV_CCS_ISO_8859_11 ICONV_ENCODING_ISO_8859_11 +#define ICONV_CCS_ISO_8859_13 ICONV_ENCODING_ISO_8859_13 +#define ICONV_CCS_ISO_8859_14 ICONV_ENCODING_ISO_8859_14 +#define ICONV_CCS_ISO_8859_15 ICONV_ENCODING_ISO_8859_15 +#define ICONV_CCS_ISO_8859_2 ICONV_ENCODING_ISO_8859_2 +#define ICONV_CCS_ISO_8859_3 ICONV_ENCODING_ISO_8859_3 +#define ICONV_CCS_ISO_8859_4 ICONV_ENCODING_ISO_8859_4 +#define ICONV_CCS_ISO_8859_5 ICONV_ENCODING_ISO_8859_5 +#define ICONV_CCS_ISO_8859_6 ICONV_ENCODING_ISO_8859_6 +#define ICONV_CCS_ISO_8859_7 ICONV_ENCODING_ISO_8859_7 +#define ICONV_CCS_ISO_8859_8 ICONV_ENCODING_ISO_8859_8 +#define ICONV_CCS_ISO_8859_9 ICONV_ENCODING_ISO_8859_9 +#define ICONV_CCS_ISO_IR_111 ICONV_ENCODING_ISO_IR_111 +#define ICONV_CCS_JIS_X0201_1976 "jis_x0201_1976" +#define ICONV_CCS_JIS_X0208_1990 "jis_x0208_1990" +#define ICONV_CCS_JIS_X0212_1990 "jis_x0212_1990" +#define ICONV_CCS_KOI8_R ICONV_ENCODING_KOI8_R +#define ICONV_CCS_KOI8_RU ICONV_ENCODING_KOI8_RU +#define ICONV_CCS_KOI8_U ICONV_ENCODING_KOI8_U +#define ICONV_CCS_KOI8_UNI ICONV_ENCODING_KOI8_UNI +#define ICONV_CCS_KSX1001 "ksx1001" +#define ICONV_CCS_WIN_1250 ICONV_ENCODING_WIN_1250 +#define ICONV_CCS_WIN_1251 ICONV_ENCODING_WIN_1251 +#define ICONV_CCS_WIN_1252 ICONV_ENCODING_WIN_1252 +#define ICONV_CCS_WIN_1253 ICONV_ENCODING_WIN_1253 +#define ICONV_CCS_WIN_1254 ICONV_ENCODING_WIN_1254 +#define ICONV_CCS_WIN_1255 ICONV_ENCODING_WIN_1255 +#define ICONV_CCS_WIN_1256 ICONV_ENCODING_WIN_1256 +#define ICONV_CCS_WIN_1257 ICONV_ENCODING_WIN_1257 +#define ICONV_CCS_WIN_1258 ICONV_ENCODING_WIN_1258 + +#endif /* !__CCSNAMES_H__ */ + diff --git a/lib/iconv/ccs/cns11643_plane1.c b/lib/iconv/ccs/cns11643_plane1.c new file mode 100644 index 0000000..da1c059 --- /dev/null +++ b/lib/iconv/ccs/cns11643_plane1.c @@ -0,0 +1,11211 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cns11643_plane1 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit cns11643_plane1 -> UCS speed-optimized table (33792 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_cns11643_plane1[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,0x0700,INVBLK,0x0800,0x0900,0x0A00,0x0B00, + 0x0C00,0x0D00,0x0E00,0x0F00,0x1000,0x1100,0x1200,0x1300, + 0x1400,0x1500,0x1600,0x1700,0x1800,0x1900,0x1A00,0x1B00, + 0x1C00,0x1D00,0x1E00,0x1F00,0x2000,0x2100,0x2200,0x2300, + 0x2400,0x2500,0x2600,0x2700,0x2800,0x2900,0x2A00,0x2B00, + 0x2C00,0x2D00,0x2E00,0x2F00,0x3000,0x3100,0x3200,0x3300, + 0x3400,0x3500,0x3600,0x3700,0x3800,0x3900,0x3A00,0x3B00, + 0x3C00,0x3D00,0x3E00,0x3F00,0x4000,0x4100,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 34, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3000,0xFF0C,0x3001,0x3002,0xFF0E,0x30FB,0xFF1B, + 0xFF1A,0xFF1F,0xFF01,0xFE30,0x2026,0x2025,0xFE50,0xFE51, + 0xFE52,0x00B7,0xFE54,0xFE55,0xFE56,0xFE57,0xFE31,0x2014, + 0xFE32,0x2013,INVALC,INVALC,INVALC,INVALC,0xFF08,0xFF09, + 0xFE35,0xFE36,0xFF5B,0xFF5D,0xFE37,0xFE38,0x3014,0x3015, + 0xFE39,0xFE3A,0x3010,0x3011,0xFE3B,0xFE3C,0x300A,0x300B, + 0xFE3D,0xFE3E,0x3008,0x3009,0xFE3F,0xFE40,0x300C,0x300D, + 0xFE41,0xFE42,0x300E,0x300F,0xFE43,0xFE44,0xFE59,0xFE5A, + 0xFE5B,0xFE5C,0xFE5D,0xFE5E,0x2018,0x2019,0x201C,0x201D, + 0x301D,0x301E,0x2032,0x2035,0xFF03,0xFF06,0xFF0A,0x203B, + 0x00A7,0x3003,0x25CB,0x25CF,0x25B3,0x25B2,0x25CE,0x2606, + 0x2605,0x25C7,0x25C6,0x25A1,0x25A0,0x25BD,0x25BC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x32A3,0x2105,0x203E,INVALC,0xFF3F,INVALC,0xFE49, + 0xFE4A,0xFE4D,0xFE4E,0xFE4B,0xFE4C,0xFE5F,0xFE60,0xFE61, + 0xFF0B,0xFF0D,0x00D7,0x00F7,0x00B1,0x221A,0xFF1C,0xFF1E, + 0xFF1D,0x2266,0x2267,0x2260,0x221E,0x2252,0x2261,0xFE62, + 0xFE63,0xFE64,0xFE66,0xFE65,0x223C,0x2229,0x222A,0x22A5, + 0x2220,0x221F,0x22BF,0x33D2,0x33D1,0x222B,0x222E,0x2235, + 0x2234,0x2640,0x2642,0x2641,0x2609,0x2191,0x2193,0x2192, + 0x2190,0x2196,0x2197,0x2199,0x2198,0x2016,0xFF5C,0xFF0F, + 0xFF3C,0x2215,0xFE68,0xFF04,0xFFE5,0x3012,0xFFE0,0xFFE1, + 0xFF05,0xFF20,0x2103,0x2109,0xFE69,0xFE6A,0xFE6B,0x33D5, + 0x339C,0x339D,0x339E,0x33CE,0x33A1,0x338E,0x338F,0x33C4, + 0x00B0,0x5159,0x515B,0x515E,0x515D,0x5161,0x5163,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x55E7,0x74E9,0x7CCE,0x2581,0x2582,0x2583,0x2584, + 0x2585,0x2586,0x2587,0x2588,0x258F,0x258E,0x258D,0x258C, + 0x258B,0x258A,0x2589,0x253C,0x2534,0x252C,0x2524,0x251C, + 0x2594,0x2500,0x2502,0x2595,0x250C,0x2510,0x2514,0x2518, + 0x256D,0x256E,0x2570,0x256F,0x2550,0x255E,0x256A,0x2561, + 0x25E2,0x25E3,0x25E5,0x25E4,0x2571,0x2572,0x2573,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16, + 0xFF17,0xFF18,0xFF19,0x2160,0x2161,0x2162,0x2163,0x2164, + 0x2165,0x2166,0x2167,0x2168,0x2169,0x3021,0x3022,0x3023, + 0x3024,0x3025,0x3026,0x3027,0x3028,0x3029,INVALC,0x5344, + INVALC,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, + 0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, + 0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, + 0xFF38,0xFF39,0xFF3A,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45, + 0xFF46,0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D, + 0xFF4E,0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55, + 0xFF56,0xFF57,0xFF58,0xFF59,0xFF5A,0x0391,0x0392,0x0393, + 0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1, + 0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9,0x03B1, + 0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9, + 0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0,0x03C1, + 0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x3105, + 0x3106,0x3107,0x3108,0x3109,0x310A,0x310B,0x310C,0x310D, + 0x310E,0x310F,0x3110,0x3111,0x3112,0x3113,0x3114,0x3115, + 0x3116,0x3117,0x3118,0x3119,0x311A,0x311B,0x311C,0x311D, + 0x311E,0x311F,0x3120,0x3121,0x3122,0x3123,0x3124,0x3125, + 0x3126,0x3127,0x3128,0x3129,0x02D9,0x02C9,0x02CA,0x02C7, + 0x02CB,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466, + 0x2467,0x2468,0x2469,0x2474,0x2475,0x2476,0x2477,0x2478, + 0x2479,0x247A,0x247B,0x247C,0x247D,0x2170,0x2171,0x2172, + 0x2173,0x2174,0x2175,0x2176,0x2177,0x2178,0x2179,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 67, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2400,0x2401,0x2402,0x2403,0x2404,0x2405,0x2406, + 0x2407,0x2408,0x2409,0x240A,0x240B,0x240C,0x240D,0x240E, + 0x240F,0x2410,0x2411,0x2412,0x2413,0x2414,0x2415,0x2416, + 0x2417,0x2418,0x2419,0x241A,0x241B,0x241C,0x241D,0x241E, + 0x241F,0x2421,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 69, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E00,0x4E59,0x4E01,0x4E03,0x4E43,0x4E5D,0x4E86, + 0x4E8C,0x4EBA,0x513F,0x5165,0x516B,0x51E0,0x5200,0x5201, + 0x529B,0x5315,0x5341,0x535C,0x53C8,0x4E09,0x4E0B,0x4E08, + 0x4E0A,0x4E2B,0x4E38,0x51E1,0x4E45,0x4E48,0x4E5F,0x4E5E, + 0x4E8E,0x4EA1,0x5140,0x5203,0x52FA,0x5343,0x53C9,0x53E3, + 0x571F,0x58EB,0x5915,0x5927,0x5973,0x5B50,0x5B51,0x5B53, + 0x5BF8,0x5C0F,0x5C22,0x5C38,0x5C71,0x5DDD,0x5DE5,0x5DF1, + 0x5DF2,0x5DF3,0x5DFE,0x5E72,0x5EFE,0x5F0B,0x5F13,0x624D, + 0x4E11,0x4E10,0x4E0D,0x4E2D,0x4E30,0x4E39,0x4E4B,0x5C39, + 0x4E88,0x4E91,0x4E95,0x4E92,0x4E94,0x4EA2,0x4EC1,0x4EC0, + 0x4EC3,0x4EC6,0x4EC7,0x4ECD,0x4ECA,0x4ECB,0x4EC4,0x5143, + 0x5141,0x5167,0x516D,0x516E,0x516C,0x5197,0x51F6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 70, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5206,0x5207,0x5208,0x52FB,0x52FE,0x52FF,0x5316, + 0x5339,0x5348,0x5347,0x5345,0x535E,0x5384,0x53CB,0x53CA, + 0x53CD,0x58EC,0x5929,0x592B,0x592A,0x592D,0x5B54,0x5C11, + 0x5C24,0x5C3A,0x5C6F,0x5DF4,0x5E7B,0x5EFF,0x5F14,0x5F15, + 0x5FC3,0x6208,0x6236,0x624B,0x624E,0x652F,0x6587,0x6597, + 0x65A4,0x65B9,0x65E5,0x66F0,0x6708,0x6728,0x6B20,0x6B62, + 0x6B79,0x6BCB,0x6BD4,0x6BDB,0x6C0F,0x6C34,0x706B,0x722A, + 0x7236,0x723B,0x7247,0x7259,0x725B,0x72AC,0x738B,0x4E19, + 0x4E16,0x4E15,0x4E14,0x4E18,0x4E3B,0x4E4D,0x4E4F,0x4E4E, + 0x4EE5,0x4ED8,0x4ED4,0x4ED5,0x4ED6,0x4ED7,0x4EE3,0x4EE4, + 0x4ED9,0x4EDE,0x5145,0x5144,0x5189,0x518A,0x51AC,0x51F9, + 0x51FA,0x51F8,0x520A,0x52A0,0x529F,0x5305,0x5306,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 71, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5317,0x531D,0x4EDF,0x534A,0x5349,0x5361,0x5360, + 0x536F,0x536E,0x53BB,0x53EF,0x53E4,0x53F3,0x53EC,0x53EE, + 0x53E9,0x53E8,0x53FC,0x53F8,0x53F5,0x53EB,0x53E6,0x53EA, + 0x53F2,0x53F1,0x53F0,0x53E5,0x53ED,0x53FB,0x56DB,0x56DA, + 0x5916,0x592E,0x5931,0x5974,0x5976,0x5B55,0x5B83,0x5C3C, + 0x5DE8,0x5DE7,0x5DE6,0x5E02,0x5E03,0x5E73,0x5E7C,0x5F01, + 0x5F18,0x5F17,0x5FC5,0x620A,0x6253,0x6254,0x6252,0x6251, + 0x65A5,0x65E6,0x672E,0x672C,0x672A,0x672B,0x672D,0x6B63, + 0x6BCD,0x6C11,0x6C10,0x6C38,0x6C41,0x6C40,0x6C3E,0x72AF, + 0x7384,0x7389,0x74DC,0x74E6,0x7518,0x751F,0x7528,0x7529, + 0x7530,0x7531,0x7532,0x7533,0x758B,0x767D,0x76AE,0x76BF, + 0x76EE,0x77DB,0x77E2,0x77F3,0x793A,0x79BE,0x7A74,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 72, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7ACB,0x4E1E,0x4E1F,0x4E52,0x4E53,0x4E69,0x4E99, + 0x4EA4,0x4EA6,0x4EA5,0x4EFF,0x4F09,0x4F19,0x4F0A,0x4F15, + 0x4F0D,0x4F10,0x4F11,0x4F0F,0x4EF2,0x4EF6,0x4EFB,0x4EF0, + 0x4EF3,0x4EFD,0x4F01,0x4F0B,0x5149,0x5147,0x5146,0x5148, + 0x5168,0x5171,0x518D,0x51B0,0x5217,0x5211,0x5212,0x520E, + 0x5216,0x52A3,0x5308,0x5321,0x5320,0x5370,0x5371,0x5409, + 0x540F,0x540C,0x540A,0x5410,0x5401,0x540B,0x5404,0x5411, + 0x540D,0x5408,0x5403,0x540E,0x5406,0x5412,0x56E0,0x56DE, + 0x56DD,0x5733,0x5730,0x5728,0x572D,0x572C,0x572F,0x5729, + 0x5919,0x591A,0x5937,0x5938,0x5984,0x5978,0x5983,0x597D, + 0x5979,0x5982,0x5981,0x5B57,0x5B58,0x5B87,0x5B88,0x5B85, + 0x5B89,0x5BFA,0x5C16,0x5C79,0x5DDE,0x5E06,0x5E76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 73, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E74,0x5F0F,0x5F1B,0x5FD9,0x5FD6,0x620E,0x620C, + 0x620D,0x6210,0x6263,0x625B,0x6258,0x6536,0x65E9,0x65E8, + 0x65EC,0x65ED,0x66F2,0x66F3,0x6709,0x673D,0x6734,0x6731, + 0x6735,0x6B21,0x6B64,0x6B7B,0x6C16,0x6C5D,0x6C57,0x6C59, + 0x6C5F,0x6C60,0x6C50,0x6C55,0x6C61,0x6C5B,0x6C4D,0x6C4E, + 0x7070,0x725F,0x725D,0x767E,0x7AF9,0x7C73,0x7CF8,0x7F36, + 0x7F8A,0x7FBD,0x8001,0x8003,0x800C,0x8012,0x8033,0x807F, + 0x8089,0x808B,0x808C,0x81E3,0x81EA,0x81F3,0x81FC,0x820C, + 0x821B,0x821F,0x826E,0x8272,0x827E,0x866B,0x8840,0x884C, + 0x8863,0x897F,0x9621,0x4E32,0x4EA8,0x4F4D,0x4F4F,0x4F47, + 0x4F57,0x4F5E,0x4F34,0x4F5B,0x4F55,0x4F30,0x4F50,0x4F51, + 0x4F3D,0x4F3A,0x4F38,0x4F43,0x4F54,0x4F3C,0x4F46,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 74, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F63,0x4F5C,0x4F60,0x4F2F,0x4F4E,0x4F36,0x4F59, + 0x4F5D,0x4F48,0x4F5A,0x514C,0x514B,0x514D,0x5175,0x51B6, + 0x51B7,0x5225,0x5224,0x5229,0x522A,0x5228,0x52AB,0x52A9, + 0x52AA,0x52AC,0x5323,0x5373,0x5375,0x541D,0x542D,0x541E, + 0x543E,0x5426,0x544E,0x5427,0x5446,0x5443,0x5433,0x5448, + 0x5442,0x541B,0x5429,0x544A,0x5439,0x543B,0x5438,0x542E, + 0x5435,0x5436,0x5420,0x543C,0x5440,0x5431,0x542B,0x541F, + 0x542C,0x56EA,0x56F0,0x56E4,0x56EB,0x574A,0x5751,0x5740, + 0x574D,0x5747,0x574E,0x573E,0x5750,0x574F,0x573B,0x58EF, + 0x593E,0x599D,0x5992,0x59A8,0x599E,0x59A3,0x5999,0x5996, + 0x598D,0x59A4,0x5993,0x598A,0x59A5,0x5B5D,0x5B5C,0x5B5A, + 0x5B5B,0x5B8C,0x5B8B,0x5B8F,0x5C2C,0x5C40,0x5C41,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 75, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C3F,0x5C3E,0x5C90,0x5C91,0x5C94,0x5C8C,0x5DEB, + 0x5E0C,0x5E8F,0x5E87,0x5E8A,0x5EF7,0x5F04,0x5F1F,0x5F64, + 0x5F62,0x5F77,0x5F79,0x5FD8,0x5FCC,0x5FD7,0x5FCD,0x5FF1, + 0x5FEB,0x5FF8,0x5FEA,0x6212,0x6211,0x6284,0x6297,0x6296, + 0x6280,0x6276,0x6289,0x626D,0x628A,0x627C,0x627E,0x6279, + 0x6273,0x6292,0x626F,0x6298,0x626E,0x6295,0x6293,0x6291, + 0x6286,0x6539,0x653B,0x6538,0x65F1,0x66F4,0x675F,0x674E, + 0x674F,0x6750,0x6751,0x675C,0x6756,0x675E,0x6749,0x6746, + 0x6760,0x6753,0x6757,0x6B65,0x6BCF,0x6C42,0x6C5E,0x6C99, + 0x6C81,0x6C88,0x6C89,0x6C85,0x6C9B,0x6C6A,0x6C7A,0x6C90, + 0x6C70,0x6C8C,0x6C68,0x6C96,0x6C92,0x6C7D,0x6C83,0x6C72, + 0x6C7E,0x6C74,0x6C86,0x6C76,0x6C8D,0x6C94,0x6C98,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 76, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C82,0x7076,0x707C,0x707D,0x7078,0x7262,0x7261, + 0x7260,0x72C4,0x72C2,0x7396,0x752C,0x752B,0x7537,0x7538, + 0x7682,0x76EF,0x77E3,0x79C1,0x79C0,0x79BF,0x7A76,0x7CFB, + 0x7F55,0x8096,0x8093,0x809D,0x8098,0x809B,0x809A,0x80B2, + 0x826F,0x8292,0x828B,0x828D,0x898B,0x89D2,0x8A00,0x8C37, + 0x8C46,0x8C55,0x8C9D,0x8D64,0x8D70,0x8DB3,0x8EAB,0x8ECA, + 0x8F9B,0x8FB0,0x8FC2,0x8FC6,0x8FC5,0x8FC4,0x5DE1,0x9091, + 0x90A2,0x90AA,0x90A6,0x90A3,0x9149,0x91C6,0x91CC,0x9632, + 0x962E,0x9631,0x962A,0x962C,0x4E26,0x4E56,0x4E73,0x4E8B, + 0x4E9B,0x4E9E,0x4EAB,0x4EAC,0x4F6F,0x4F9D,0x4F8D,0x4F73, + 0x4F7F,0x4F6C,0x4F9B,0x4F8B,0x4F86,0x4F83,0x4F70,0x4F75, + 0x4F88,0x4F69,0x4F7B,0x4F96,0x4F7E,0x4F8F,0x4F91,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 77, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F7A,0x5154,0x5152,0x5155,0x5169,0x5177,0x5176, + 0x5178,0x51BD,0x51FD,0x523B,0x5238,0x5237,0x523A,0x5230, + 0x522E,0x5236,0x5241,0x52BE,0x52BB,0x5352,0x5354,0x5353, + 0x5351,0x5366,0x5377,0x5378,0x5379,0x53D6,0x53D4,0x53D7, + 0x5473,0x5475,0x5496,0x5478,0x5495,0x5480,0x547B,0x5477, + 0x5484,0x5492,0x5486,0x547C,0x5490,0x5471,0x5476,0x548C, + 0x549A,0x5462,0x5468,0x548B,0x547D,0x548E,0x56FA,0x5783, + 0x5777,0x576A,0x5769,0x5761,0x5766,0x5764,0x577C,0x591C, + 0x5949,0x5947,0x5948,0x5944,0x5954,0x59BE,0x59BB,0x59D4, + 0x59B9,0x59AE,0x59D1,0x59C6,0x59D0,0x59CD,0x59CB,0x59D3, + 0x59CA,0x59AF,0x59B3,0x59D2,0x59C5,0x5B5F,0x5B64,0x5B63, + 0x5B97,0x5B9A,0x5B98,0x5B9C,0x5B99,0x5B9B,0x5C1A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 78, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C48,0x5C45,0x5C46,0x5CB7,0x5CA1,0x5CB8,0x5CA9, + 0x5CAB,0x5CB1,0x5CB3,0x5E18,0x5E1A,0x5E16,0x5E15,0x5E1B, + 0x5E11,0x5E78,0x5E9A,0x5E97,0x5E9C,0x5E95,0x5E96,0x5EF6, + 0x5F26,0x5F27,0x5F29,0x5F80,0x5F81,0x5F7F,0x5F7C,0x5FDD, + 0x5FE0,0x5FFD,0x5FF5,0x5FFF,0x600F,0x6014,0x602F,0x6035, + 0x6016,0x602A,0x6015,0x6021,0x6027,0x6029,0x602B,0x601B, + 0x6216,0x6215,0x623F,0x623E,0x6240,0x627F,0x62C9,0x62CC, + 0x62C4,0x62BF,0x62C2,0x62B9,0x62D2,0x62DB,0x62AB,0x62D3, + 0x62D4,0x62CB,0x62C8,0x62A8,0x62BD,0x62BC,0x62D0,0x62D9, + 0x62C7,0x62CD,0x62B5,0x62DA,0x62B1,0x62D8,0x62D6,0x62D7, + 0x62C6,0x62AC,0x62CE,0x653E,0x65A7,0x65BC,0x65FA,0x6614, + 0x6613,0x660C,0x6606,0x6602,0x660E,0x6600,0x660F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6615,0x660A,0x6607,0x670D,0x670B,0x676D,0x678B, + 0x6795,0x6771,0x679C,0x6773,0x6777,0x6787,0x679D,0x6797, + 0x676F,0x6770,0x677F,0x6789,0x677E,0x6790,0x6775,0x679A, + 0x6793,0x677C,0x676A,0x6772,0x6B23,0x6B66,0x6B67,0x6B7F, + 0x6C13,0x6C1B,0x6CE3,0x6CE8,0x6CF3,0x6CB1,0x6CCC,0x6CE5, + 0x6CB3,0x6CBD,0x6CBE,0x6CBC,0x6CE2,0x6CAB,0x6CD5,0x6CD3, + 0x6CB8,0x6CC4,0x6CB9,0x6CC1,0x6CAE,0x6CD7,0x6CC5,0x6CF1, + 0x6CBF,0x6CBB,0x6CE1,0x6CDB,0x6CCA,0x6CAC,0x6CEF,0x6CDC, + 0x6CD6,0x6CE0,0x7095,0x708E,0x7092,0x708A,0x7099,0x722C, + 0x722D,0x7238,0x7248,0x7267,0x7269,0x72C0,0x72CE,0x72D9, + 0x72D7,0x72D0,0x73A9,0x73A8,0x739F,0x73AB,0x73A5,0x753D, + 0x759D,0x7599,0x759A,0x7684,0x76C2,0x76F2,0x76F4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x77E5,0x77FD,0x793E,0x7940,0x7941,0x79C9,0x79C8, + 0x7A7A,0x7A79,0x7AFA,0x7CFE,0x7F54,0x7F8C,0x7F8B,0x8005, + 0x80BA,0x80A5,0x80A2,0x80B1,0x80A1,0x80AB,0x80A9,0x80B4, + 0x80AA,0x80AF,0x81E5,0x81FE,0x820D,0x82B3,0x829D,0x8299, + 0x82AD,0x82BD,0x829F,0x82B9,0x82B1,0x82AC,0x82A5,0x82AF, + 0x82B8,0x82A3,0x82B0,0x82BE,0x82B7,0x864E,0x8671,0x521D, + 0x8868,0x8ECB,0x8FCE,0x8FD4,0x8FD1,0x90B5,0x90B8,0x90B1, + 0x90B6,0x91C7,0x91D1,0x9577,0x9580,0x961C,0x9640,0x963F, + 0x963B,0x9644,0x9642,0x96B9,0x96E8,0x9752,0x975E,0x4E9F, + 0x4EAD,0x4EAE,0x4FE1,0x4FB5,0x4FAF,0x4FBF,0x4FE0,0x4FD1, + 0x4FCF,0x4FDD,0x4FC3,0x4FB6,0x4FD8,0x4FDF,0x4FCA,0x4FD7, + 0x4FAE,0x4FD0,0x4FC4,0x4FC2,0x4FDA,0x4FCE,0x4FDE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4FB7,0x5157,0x5192,0x5191,0x51A0,0x524E,0x5243, + 0x524A,0x524D,0x524C,0x524B,0x5247,0x52C7,0x52C9,0x52C3, + 0x52C1,0x530D,0x5357,0x537B,0x539A,0x53DB,0x54AC,0x54C0, + 0x54A8,0x54CE,0x54C9,0x54B8,0x54A6,0x54B3,0x54C7,0x54C2, + 0x54BD,0x54AA,0x54C1,0x54C4,0x54C8,0x54AF,0x54AB,0x54B1, + 0x54BB,0x54A9,0x54A7,0x54BF,0x56FF,0x5782,0x578B,0x57A0, + 0x57A3,0x57A2,0x57CE,0x57AE,0x5793,0x5955,0x5951,0x594F, + 0x594E,0x5950,0x59DC,0x59D8,0x59FF,0x59E3,0x59E8,0x5A03, + 0x59E5,0x59EA,0x59DA,0x59E6,0x5A01,0x59FB,0x5B69,0x5BA3, + 0x5BA6,0x5BA4,0x5BA2,0x5BA5,0x5C01,0x5C4E,0x5C4F,0x5C4D, + 0x5C4B,0x5CD9,0x5CD2,0x5DF7,0x5E1D,0x5E25,0x5E1F,0x5E7D, + 0x5EA0,0x5EA6,0x5EFA,0x5F08,0x5F2D,0x5F65,0x5F88,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F85,0x5F8A,0x5F8B,0x5F87,0x5F8C,0x5F89,0x6012, + 0x601D,0x6020,0x6025,0x600E,0x6028,0x604D,0x6070,0x6068, + 0x6062,0x6046,0x6043,0x606C,0x606B,0x606A,0x6064,0x6241, + 0x62DC,0x6316,0x6309,0x62FC,0x62ED,0x6301,0x62EE,0x62FD, + 0x6307,0x62F1,0x62F7,0x62EF,0x62EC,0x62FE,0x62F4,0x6311, + 0x6302,0x653F,0x6545,0x65AB,0x65BD,0x65E2,0x6625,0x662D, + 0x6620,0x6627,0x662F,0x661F,0x6628,0x6631,0x6624,0x66F7, + 0x67FF,0x67D3,0x67F1,0x67D4,0x67D0,0x67EC,0x67B6,0x67AF, + 0x67F5,0x67E9,0x67EF,0x67C4,0x67D1,0x67B4,0x67DA,0x67E5, + 0x67B8,0x67CF,0x67DE,0x67F3,0x67B0,0x67D9,0x67E2,0x67DD, + 0x67D2,0x6B6A,0x6B83,0x6B86,0x6BB5,0x6BD2,0x6BD7,0x6C1F, + 0x6CC9,0x6D0B,0x6D32,0x6D2A,0x6D41,0x6D25,0x6D0C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D31,0x6D1E,0x6D17,0x6D3B,0x6D3D,0x6D3E,0x6D36, + 0x6D1B,0x6CF5,0x6D39,0x6D27,0x6D38,0x6D29,0x6D2E,0x6D35, + 0x6D0E,0x6D2B,0x70AB,0x70BA,0x70B3,0x70AC,0x70AF,0x70AD, + 0x70B8,0x70AE,0x70A4,0x7230,0x7272,0x726F,0x7274,0x72E9, + 0x72E0,0x72E1,0x73B7,0x73CA,0x73BB,0x73B2,0x73CD,0x73C0, + 0x73B3,0x751A,0x752D,0x754F,0x754C,0x754E,0x754B,0x75AB, + 0x75A4,0x75A5,0x75A2,0x75A3,0x7678,0x7686,0x7687,0x7688, + 0x76C8,0x76C6,0x76C3,0x76C5,0x7701,0x76F9,0x76F8,0x7709, + 0x770B,0x76FE,0x76FC,0x7707,0x77DC,0x7802,0x7814,0x780C, + 0x780D,0x7946,0x7949,0x7948,0x7947,0x79B9,0x79BA,0x79D1, + 0x79D2,0x79CB,0x7A7F,0x7A81,0x7AFF,0x7AFD,0x7C7D,0x7D02, + 0x7D05,0x7D00,0x7D09,0x7D07,0x7D04,0x7D06,0x7F38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7F8E,0x7FBF,0x8010,0x800D,0x8011,0x8036,0x80D6, + 0x80E5,0x80DA,0x80C3,0x80C4,0x80CC,0x80E1,0x80DB,0x80CE, + 0x80DE,0x80E4,0x80DD,0x81F4,0x8222,0x82E7,0x8303,0x8305, + 0x82E3,0x82DB,0x82E6,0x8304,0x82E5,0x8302,0x8309,0x82D2, + 0x82D7,0x82F1,0x8301,0x82DC,0x82D4,0x82D1,0x82DE,0x82D3, + 0x82DF,0x82EF,0x8306,0x8650,0x8679,0x867B,0x867A,0x884D, + 0x886B,0x8981,0x89D4,0x8A08,0x8A02,0x8A03,0x8C9E,0x8CA0, + 0x8D74,0x8D73,0x8DB4,0x8ECD,0x8ECC,0x8FF0,0x8FE6,0x8FE2, + 0x8FEA,0x8FE5,0x8FED,0x8FEB,0x8FE4,0x8FE8,0x90CA,0x90CE, + 0x90C1,0x90C3,0x914B,0x914A,0x91CD,0x9582,0x9650,0x964B, + 0x964C,0x964D,0x9762,0x9769,0x97CB,0x97ED,0x97F3,0x9801, + 0x98A8,0x98DB,0x98DF,0x9996,0x9999,0x4E58,0x4EB3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x500C,0x500D,0x5023,0x4FEF,0x5026,0x5025,0x4FF8, + 0x5029,0x5016,0x5006,0x503C,0x501F,0x501A,0x5012,0x5011, + 0x4FFA,0x5000,0x5014,0x5028,0x4FF1,0x5021,0x500B,0x5019, + 0x5018,0x4FF3,0x4FEE,0x502D,0x502A,0x4FFE,0x502B,0x5009, + 0x517C,0x51A4,0x51A5,0x51A2,0x51CD,0x51CC,0x51C6,0x51CB, + 0x5256,0x525C,0x5254,0x525B,0x525D,0x532A,0x537F,0x539F, + 0x539D,0x53DF,0x54E8,0x5510,0x5501,0x5537,0x54FC,0x54E5, + 0x54F2,0x5506,0x54FA,0x5514,0x54E9,0x54ED,0x54E1,0x5509, + 0x54EE,0x54EA,0x54E6,0x5527,0x5507,0x54FD,0x550F,0x5703, + 0x5704,0x57C2,0x57D4,0x57CB,0x57C3,0x5809,0x590F,0x5957, + 0x5958,0x595A,0x5A11,0x5A18,0x5A1C,0x5A1F,0x5A1B,0x5A13, + 0x59EC,0x5A20,0x5A23,0x5A29,0x5A25,0x5A0C,0x5A09,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B6B,0x5C58,0x5BB0,0x5BB3,0x5BB6,0x5BB4,0x5BAE, + 0x5BB5,0x5BB9,0x5BB8,0x5C04,0x5C51,0x5C55,0x5C50,0x5CED, + 0x5CFD,0x5CFB,0x5CEA,0x5CE8,0x5CF0,0x5CF6,0x5D01,0x5CF4, + 0x5DEE,0x5E2D,0x5E2B,0x5EAB,0x5EAD,0x5EA7,0x5F31,0x5F92, + 0x5F91,0x5F90,0x6059,0x6063,0x6065,0x6050,0x6055,0x606D, + 0x6069,0x606F,0x6084,0x609F,0x609A,0x608D,0x6094,0x608C, + 0x6085,0x6096,0x6247,0x62F3,0x6308,0x62FF,0x634E,0x633E, + 0x632F,0x6355,0x6342,0x6346,0x634F,0x6349,0x633A,0x6350, + 0x633D,0x632A,0x632B,0x6328,0x634D,0x634C,0x6548,0x6549, + 0x6599,0x65C1,0x65C5,0x6642,0x6649,0x664F,0x6643,0x6652, + 0x664C,0x6645,0x6641,0x66F8,0x6714,0x6715,0x6717,0x6821, + 0x6838,0x6848,0x6846,0x6853,0x6839,0x6842,0x6854,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6829,0x68B3,0x6817,0x684C,0x6851,0x683D,0x67F4, + 0x6850,0x6840,0x683C,0x6843,0x682A,0x6845,0x6813,0x6818, + 0x6841,0x6B8A,0x6B89,0x6BB7,0x6C23,0x6C27,0x6C28,0x6C26, + 0x6C24,0x6CF0,0x6D6A,0x6D95,0x6D88,0x6D87,0x6D66,0x6D78, + 0x6D77,0x6D59,0x6D93,0x6D6C,0x6D89,0x6D6E,0x6D5A,0x6D74, + 0x6D69,0x6D8C,0x6D8A,0x6D79,0x6D85,0x6D65,0x6D94,0x70CA, + 0x70D8,0x70E4,0x70D9,0x70C8,0x70CF,0x7239,0x7279,0x72FC, + 0x72F9,0x72FD,0x72F8,0x72F7,0x7386,0x73ED,0x7409,0x73EE, + 0x73E0,0x73EA,0x73DE,0x7554,0x755D,0x755C,0x755A,0x7559, + 0x75BE,0x75C5,0x75C7,0x75B2,0x75B3,0x75BD,0x75BC,0x75B9, + 0x75C2,0x75B8,0x768B,0x76B0,0x76CA,0x76CD,0x76CE,0x7729, + 0x771F,0x7720,0x7728,0x77E9,0x7830,0x7827,0x7838,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x781D,0x7834,0x7837,0x7825,0x782D,0x7820,0x781F, + 0x7832,0x7955,0x7950,0x7960,0x795F,0x7956,0x795E,0x795D, + 0x7957,0x795A,0x79E4,0x79E3,0x79E7,0x79DF,0x79E6,0x79E9, + 0x79D8,0x7A84,0x7A88,0x7AD9,0x7B06,0x7B11,0x7C89,0x7D21, + 0x7D17,0x7D0B,0x7D0A,0x7D20,0x7D22,0x7D14,0x7D10,0x7D15, + 0x7D1A,0x7D1C,0x7D0D,0x7D19,0x7D1B,0x7F3A,0x7F5F,0x7F94, + 0x7FC5,0x7FC1,0x8006,0x8004,0x8018,0x8015,0x8019,0x8017, + 0x803D,0x803F,0x80F1,0x8102,0x80F0,0x8105,0x80ED,0x80F4, + 0x8106,0x80F8,0x80F3,0x8108,0x80FD,0x810A,0x80FC,0x80EF, + 0x81ED,0x81EC,0x8200,0x8210,0x822A,0x822B,0x8228,0x822C, + 0x82BB,0x832B,0x8352,0x8354,0x834A,0x8338,0x8350,0x8349, + 0x8335,0x8334,0x834F,0x8332,0x8339,0x8336,0x8317,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8340,0x8331,0x8328,0x8343,0x8654,0x868A,0x86AA, + 0x8693,0x86A4,0x86A9,0x868C,0x86A3,0x869C,0x8870,0x8877, + 0x8881,0x8882,0x887D,0x8879,0x8A18,0x8A10,0x8A0E,0x8A0C, + 0x8A15,0x8A0A,0x8A17,0x8A13,0x8A16,0x8A0F,0x8A11,0x8C48, + 0x8C7A,0x8C79,0x8CA1,0x8CA2,0x8D77,0x8EAC,0x8ED2,0x8ED4, + 0x8ECF,0x8FB1,0x9001,0x9006,0x8FF7,0x9000,0x8FFA,0x8FF4, + 0x9003,0x8FFD,0x9005,0x8FF8,0x9095,0x90E1,0x90DD,0x90E2, + 0x9152,0x914D,0x914C,0x91D8,0x91DD,0x91D7,0x91DC,0x91D9, + 0x9583,0x9662,0x9663,0x9661,0x965B,0x965D,0x9664,0x9658, + 0x965E,0x96BB,0x98E2,0x99AC,0x9AA8,0x9AD8,0x9B25,0x9B32, + 0x9B3C,0x4E7E,0x507A,0x507D,0x505C,0x5047,0x5043,0x504C, + 0x505A,0x5049,0x5065,0x5076,0x504E,0x5055,0x5075,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5074,0x5077,0x504F,0x500F,0x506F,0x506D,0x515C, + 0x5195,0x51F0,0x526A,0x526F,0x52D2,0x52D9,0x52D8,0x52D5, + 0x5310,0x530F,0x5319,0x533F,0x5340,0x533E,0x53C3,0x66FC, + 0x5546,0x556A,0x5566,0x5544,0x555E,0x5561,0x5543,0x554A, + 0x5531,0x5556,0x554F,0x5555,0x552F,0x5564,0x5538,0x552E, + 0x555C,0x552C,0x5563,0x5533,0x5541,0x5557,0x5708,0x570B, + 0x5709,0x57DF,0x5805,0x580A,0x5806,0x57E0,0x57E4,0x57FA, + 0x5802,0x5835,0x57F7,0x57F9,0x5920,0x5962,0x5A36,0x5A41, + 0x5A49,0x5A66,0x5A6A,0x5A40,0x5A3C,0x5A62,0x5A5A,0x5A46, + 0x5A4A,0x5B70,0x5BC7,0x5BC5,0x5BC4,0x5BC2,0x5BBF,0x5BC6, + 0x5C09,0x5C08,0x5C07,0x5C60,0x5C5C,0x5C5D,0x5D07,0x5D06, + 0x5D0E,0x5D1B,0x5D16,0x5D22,0x5D11,0x5D29,0x5D14,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D19,0x5D24,0x5D27,0x5D17,0x5DE2,0x5E38,0x5E36, + 0x5E33,0x5E37,0x5EB7,0x5EB8,0x5EB6,0x5EB5,0x5EBE,0x5F35, + 0x5F37,0x5F57,0x5F6C,0x5F69,0x5F6B,0x5F97,0x5F99,0x5F9E, + 0x5F98,0x5FA1,0x5FA0,0x5F9C,0x607F,0x60A3,0x6089,0x60A0, + 0x60A8,0x60CB,0x60B4,0x60E6,0x60BD,0x60C5,0x60BB,0x60B5, + 0x60DC,0x60BC,0x60D8,0x60D5,0x60C6,0x60DF,0x60B8,0x60DA, + 0x60C7,0x621A,0x621B,0x6248,0x63A0,0x63A7,0x6372,0x6396, + 0x63A2,0x63A5,0x6377,0x6367,0x6398,0x63AA,0x6371,0x63A9, + 0x6389,0x6383,0x639B,0x636B,0x63A8,0x6384,0x6388,0x6399, + 0x63A1,0x63AC,0x6392,0x638F,0x6380,0x637B,0x6369,0x6368, + 0x637A,0x655D,0x6556,0x6551,0x6559,0x6557,0x555F,0x654F, + 0x6558,0x6555,0x6554,0x659C,0x659B,0x65AC,0x65CF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x65CB,0x65CC,0x65CE,0x665D,0x665A,0x6664,0x6668, + 0x6666,0x665E,0x66F9,0x52D7,0x671B,0x6881,0x68AF,0x68A2, + 0x6893,0x68B5,0x687F,0x6876,0x68B1,0x68A7,0x6897,0x68B0, + 0x6883,0x68C4,0x68AD,0x6886,0x6885,0x6894,0x689D,0x68A8, + 0x689F,0x68A1,0x6882,0x6B32,0x6BBA,0x6BEB,0x6BEC,0x6C2B, + 0x6D8E,0x6DBC,0x6DF3,0x6DD9,0x6DB2,0x6DE1,0x6DCC,0x6DE4, + 0x6DFB,0x6DFA,0x6E05,0x6DC7,0x6DCB,0x6DAF,0x6DD1,0x6DAE, + 0x6DDE,0x6DF9,0x6DB8,0x6DF7,0x6DF5,0x6DC5,0x6DD2,0x6E1A, + 0x6DB5,0x6DDA,0x6DEB,0x6DD8,0x6DEA,0x6DF1,0x6DEE,0x6DE8, + 0x6DC6,0x6DC4,0x6DAA,0x6DEC,0x6DBF,0x6DE6,0x70F9,0x7109, + 0x710A,0x70FD,0x70EF,0x723D,0x727D,0x7281,0x731C,0x731B, + 0x7316,0x7313,0x7319,0x7387,0x7405,0x740A,0x7403,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7406,0x73FE,0x740D,0x74E0,0x74F6,0x74F7,0x751C, + 0x7522,0x7565,0x7566,0x7562,0x7570,0x758F,0x75D4,0x75D5, + 0x75B5,0x75CA,0x75CD,0x768E,0x76D4,0x76D2,0x76DB,0x7737, + 0x773E,0x773C,0x7736,0x7738,0x773A,0x786B,0x7843,0x784E, + 0x7965,0x7968,0x796D,0x79FB,0x7A92,0x7A95,0x7B20,0x7B28, + 0x7B1B,0x7B2C,0x7B26,0x7B19,0x7B1E,0x7B2E,0x7C92,0x7C97, + 0x7C95,0x7D46,0x7D43,0x7D71,0x7D2E,0x7D39,0x7D3C,0x7D40, + 0x7D30,0x7D33,0x7D44,0x7D2F,0x7D42,0x7D32,0x7D31,0x7F3D, + 0x7F9E,0x7F9A,0x7FCC,0x7FCE,0x7FD2,0x801C,0x804A,0x8046, + 0x812F,0x8116,0x8123,0x812B,0x8129,0x8130,0x8124,0x8202, + 0x8235,0x8237,0x8236,0x8239,0x838E,0x839E,0x8398,0x8378, + 0x83A2,0x8396,0x83BD,0x83AB,0x8392,0x838A,0x8393,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8389,0x83A0,0x8377,0x837B,0x837C,0x8386,0x83A7, + 0x8655,0x5F6A,0x86C7,0x86C0,0x86B6,0x86C4,0x86B5,0x86C6, + 0x86CB,0x86B1,0x86AF,0x86C9,0x8853,0x889E,0x8888,0x88AB, + 0x8892,0x8896,0x888D,0x888B,0x8993,0x898F,0x8A2A,0x8A1D, + 0x8A23,0x8A25,0x8A31,0x8A2D,0x8A1F,0x8A1B,0x8A22,0x8C49, + 0x8C5A,0x8CA9,0x8CAC,0x8CAB,0x8CA8,0x8CAA,0x8CA7,0x8D67, + 0x8D66,0x8DBE,0x8DBA,0x8EDB,0x8EDF,0x9019,0x900D,0x901A, + 0x9017,0x9023,0x901F,0x901D,0x9010,0x9015,0x901E,0x9020, + 0x900F,0x9022,0x9016,0x901B,0x9014,0x90E8,0x90ED,0x90FD, + 0x9157,0x91CE,0x91F5,0x91E6,0x91E3,0x91E7,0x91ED,0x91E9, + 0x9589,0x966A,0x9675,0x9673,0x9678,0x9670,0x9674,0x9676, + 0x9677,0x966C,0x96C0,0x96EA,0x96E9,0x7AE0,0x7ADF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9802,0x9803,0x9B5A,0x9CE5,0x9E75,0x9E7F,0x9EA5, + 0x9EBB,0x50A2,0x508D,0x5085,0x5099,0x5091,0x5080,0x5096, + 0x5098,0x509A,0x6700,0x51F1,0x5272,0x5274,0x5275,0x5269, + 0x52DE,0x52DD,0x52DB,0x535A,0x53A5,0x557B,0x5580,0x55A7, + 0x557C,0x558A,0x559D,0x5598,0x5582,0x559C,0x55AA,0x5594, + 0x5587,0x558B,0x5583,0x55B3,0x55AE,0x559F,0x553E,0x55B2, + 0x559A,0x55BB,0x55AC,0x55B1,0x557E,0x5589,0x55AB,0x5599, + 0x570D,0x582F,0x582A,0x5834,0x5824,0x5830,0x5831,0x5821, + 0x581D,0x5820,0x58F9,0x58FA,0x5960,0x5A77,0x5A9A,0x5A7F, + 0x5A92,0x5A9B,0x5AA7,0x5B73,0x5B71,0x5BD2,0x5BCC,0x5BD3, + 0x5BD0,0x5C0A,0x5C0B,0x5C31,0x5D4C,0x5D50,0x5D34,0x5D47, + 0x5DFD,0x5E45,0x5E3D,0x5E40,0x5E43,0x5E7E,0x5ECA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5EC1,0x5EC2,0x5EC4,0x5F3C,0x5F6D,0x5FA9,0x5FAA, + 0x5FA8,0x60D1,0x60E1,0x60B2,0x60B6,0x60E0,0x611C,0x6123, + 0x60FA,0x6115,0x60F0,0x60FB,0x60F4,0x6168,0x60F1,0x610E, + 0x60F6,0x6109,0x6100,0x6112,0x621F,0x6249,0x63A3,0x638C, + 0x63CF,0x63C0,0x63E9,0x63C9,0x63C6,0x63CD,0x63D2,0x63E3, + 0x63D0,0x63E1,0x63D6,0x63ED,0x63EE,0x6376,0x63F4,0x63EA, + 0x63DB,0x6452,0x63DA,0x63F9,0x655E,0x6566,0x6562,0x6563, + 0x6591,0x6590,0x65AF,0x666E,0x6670,0x6674,0x6676,0x666F, + 0x6691,0x667A,0x667E,0x6677,0x66FE,0x66FF,0x671F,0x671D, + 0x68FA,0x68D5,0x68E0,0x68D8,0x68D7,0x6905,0x68DF,0x68F5, + 0x68EE,0x68E7,0x68F9,0x68D2,0x68F2,0x68E3,0x68CB,0x68CD, + 0x690D,0x6912,0x690E,0x68C9,0x68DA,0x696E,0x68FB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B3E,0x6B3A,0x6B3D,0x6B98,0x6B96,0x6BBC,0x6BEF, + 0x6C2E,0x6C2F,0x6C2C,0x6E2F,0x6E38,0x6E54,0x6E21,0x6E32, + 0x6E67,0x6E4A,0x6E20,0x6E25,0x6E23,0x6E1B,0x6E5B,0x6E58, + 0x6E24,0x6E56,0x6E6E,0x6E2D,0x6E26,0x6E6F,0x6E34,0x6E4D, + 0x6E3A,0x6E2C,0x6E43,0x6E1D,0x6E3E,0x6ECB,0x6E89,0x6E19, + 0x6E4E,0x6E63,0x6E44,0x6E72,0x6E69,0x6E5F,0x7119,0x711A, + 0x7126,0x7130,0x7121,0x7136,0x716E,0x711C,0x724C,0x7284, + 0x7280,0x7336,0x7325,0x7334,0x7329,0x743A,0x742A,0x7433, + 0x7422,0x7425,0x7435,0x7436,0x7434,0x742F,0x741B,0x7426, + 0x7428,0x7525,0x7526,0x756B,0x756A,0x75E2,0x75DB,0x75E3, + 0x75D9,0x75D8,0x75DE,0x75E0,0x767B,0x767C,0x7696,0x7693, + 0x76B4,0x76DC,0x774F,0x77ED,0x785D,0x786C,0x786F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A0D,0x7A08,0x7A0B,0x7A05,0x7A00,0x7A98,0x7A97, + 0x7A96,0x7AE5,0x7AE3,0x7B49,0x7B56,0x7B46,0x7B50,0x7B52, + 0x7B54,0x7B4D,0x7B4B,0x7B4F,0x7B51,0x7C9F,0x7CA5,0x7D5E, + 0x7D50,0x7D68,0x7D55,0x7D2B,0x7D6E,0x7D72,0x7D61,0x7D66, + 0x7D62,0x7D70,0x7D73,0x5584,0x7FD4,0x7FD5,0x800B,0x8052, + 0x8085,0x8155,0x8154,0x814B,0x8151,0x814E,0x8139,0x8146, + 0x813E,0x814C,0x8153,0x8174,0x8212,0x821C,0x83E9,0x8403, + 0x83F8,0x840D,0x83E0,0x83C5,0x840B,0x83C1,0x83EF,0x83F1, + 0x83F4,0x8457,0x840A,0x83F0,0x840C,0x83CC,0x83FD,0x83F2, + 0x83CA,0x8438,0x840E,0x8404,0x83DC,0x8407,0x83D4,0x83DF, + 0x865B,0x86DF,0x86D9,0x86ED,0x86D4,0x86DB,0x86E4,0x86D0, + 0x86DE,0x8857,0x88C1,0x88C2,0x88B1,0x8983,0x8996,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8A3B,0x8A60,0x8A55,0x8A5E,0x8A3C,0x8A41,0x8A54, + 0x8A5B,0x8A50,0x8A46,0x8A34,0x8A3A,0x8A36,0x8A56,0x8C61, + 0x8C82,0x8CAF,0x8CBC,0x8CB3,0x8CBD,0x8CC1,0x8CBB,0x8CC0, + 0x8CB4,0x8CB7,0x8CB6,0x8CBF,0x8CB8,0x8D8A,0x8D85,0x8D81, + 0x8DCE,0x8DDD,0x8DCB,0x8DDA,0x8DD1,0x8DCC,0x8DDB,0x8DC6, + 0x8EFB,0x8EF8,0x8EFC,0x8F9C,0x902E,0x9035,0x9031,0x9038, + 0x9032,0x9036,0x9102,0x90F5,0x9109,0x90FE,0x9163,0x9165, + 0x91CF,0x9214,0x9215,0x9223,0x9209,0x921E,0x920D,0x9210, + 0x9207,0x9211,0x9594,0x958F,0x958B,0x9591,0x9593,0x9592, + 0x958E,0x968A,0x968E,0x968B,0x967D,0x9685,0x9686,0x968D, + 0x9672,0x9684,0x96C1,0x96C5,0x96C4,0x96C6,0x96C7,0x96EF, + 0x96F2,0x97CC,0x9805,0x9806,0x9808,0x98E7,0x98EA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x98EF,0x98E9,0x98F2,0x98ED,0x99AE,0x99AD,0x9EC3, + 0x9ECD,0x9ED1,0x4E82,0x50AD,0x50B5,0x50B2,0x50B3,0x50C5, + 0x50BE,0x50AC,0x50B7,0x50BB,0x50AF,0x50C7,0x527F,0x5277, + 0x527D,0x52DF,0x52E6,0x52E4,0x52E2,0x52E3,0x532F,0x55DF, + 0x55E8,0x55D3,0x55E6,0x55CE,0x55DC,0x55C7,0x55D1,0x55E3, + 0x55E4,0x55EF,0x55DA,0x55E1,0x55C5,0x55C6,0x55E5,0x55C9, + 0x5712,0x5713,0x585E,0x5851,0x5858,0x5857,0x585A,0x5854, + 0x586B,0x584C,0x586D,0x584A,0x5862,0x5852,0x584B,0x5967, + 0x5AC1,0x5AC9,0x5ACC,0x5ABE,0x5ABD,0x5ABC,0x5AB3,0x5AC2, + 0x5AB2,0x5D69,0x5D6F,0x5E4C,0x5E79,0x5EC9,0x5EC8,0x5F12, + 0x5F59,0x5FAC,0x5FAE,0x611A,0x610F,0x6148,0x611F,0x60F3, + 0x611B,0x60F9,0x6101,0x6108,0x614E,0x614C,0x6144,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x614D,0x613E,0x6134,0x6127,0x610D,0x6106,0x6137, + 0x6221,0x6222,0x6413,0x643E,0x641E,0x642A,0x642D,0x643D, + 0x642C,0x640F,0x641C,0x6414,0x640D,0x6436,0x6416,0x6417, + 0x6406,0x656C,0x659F,0x65B0,0x6697,0x6689,0x6687,0x6688, + 0x6696,0x6684,0x6698,0x668D,0x6703,0x6994,0x696D,0x695A, + 0x6977,0x6960,0x6954,0x6975,0x6930,0x6982,0x694A,0x6968, + 0x696B,0x695E,0x6953,0x6979,0x6986,0x695D,0x6963,0x695B, + 0x6B47,0x6B72,0x6BC0,0x6BBF,0x6BD3,0x6BFD,0x6EA2,0x6EAF, + 0x6ED3,0x6EB6,0x6EC2,0x6E90,0x6E9D,0x6EC7,0x6EC5,0x6EA5, + 0x6E98,0x6EBC,0x6EBA,0x6EAB,0x6ED1,0x6E96,0x6E9C,0x6EC4, + 0x6ED4,0x6EAA,0x6EA7,0x6EB4,0x714E,0x7159,0x7169,0x7164, + 0x7149,0x7167,0x715C,0x716C,0x7166,0x714C,0x7165,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x715E,0x7146,0x7168,0x7156,0x723A,0x7252,0x7337, + 0x7345,0x733F,0x733E,0x746F,0x745A,0x7455,0x745F,0x745E, + 0x7441,0x743F,0x7459,0x745B,0x745C,0x7576,0x7578,0x7600, + 0x75F0,0x7601,0x75F2,0x75F1,0x75FA,0x75FF,0x75F4,0x75F3, + 0x76DE,0x76DF,0x775B,0x776B,0x7766,0x775E,0x7763,0x7779, + 0x776A,0x776C,0x775C,0x7765,0x7768,0x7762,0x77EE,0x788E, + 0x78B0,0x7897,0x7898,0x788C,0x7889,0x787C,0x7891,0x7893, + 0x787F,0x797A,0x797F,0x7981,0x842C,0x79BD,0x7A1C,0x7A1A, + 0x7A20,0x7A14,0x7A1F,0x7A1E,0x7A9F,0x7AA0,0x7B77,0x7BC0, + 0x7B60,0x7B6E,0x7B67,0x7CB1,0x7CB3,0x7CB5,0x7D93,0x7D79, + 0x7D91,0x7D81,0x7D8F,0x7D5B,0x7F6E,0x7F69,0x7F6A,0x7F72, + 0x7FA9,0x7FA8,0x7FA4,0x8056,0x8058,0x8086,0x8084,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8171,0x8170,0x8178,0x8165,0x816E,0x8173,0x816B, + 0x8179,0x817A,0x8166,0x8205,0x8247,0x8482,0x8477,0x843D, + 0x8431,0x8475,0x8466,0x846B,0x8449,0x846C,0x845B,0x843C, + 0x8435,0x8461,0x8463,0x8469,0x846D,0x8446,0x865E,0x865C, + 0x865F,0x86F9,0x8713,0x8708,0x8707,0x8700,0x86FE,0x86FB, + 0x8702,0x8703,0x8706,0x870A,0x8859,0x88DF,0x88D4,0x88D9, + 0x88DC,0x88D8,0x88DD,0x88E1,0x88CA,0x88D5,0x88D2,0x899C, + 0x89E3,0x8A6B,0x8A72,0x8A73,0x8A66,0x8A69,0x8A70,0x8A87, + 0x8A7C,0x8A63,0x8AA0,0x8A71,0x8A85,0x8A6D,0x8A62,0x8A6E, + 0x8A6C,0x8A79,0x8A7B,0x8A3E,0x8A68,0x8C62,0x8C8A,0x8C89, + 0x8CCA,0x8CC7,0x8CC8,0x8CC4,0x8CB2,0x8CC3,0x8CC2,0x8CC5, + 0x8DE1,0x8DDF,0x8DE8,0x8DEF,0x8DF3,0x8DFA,0x8DEA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8DE4,0x8DE6,0x8EB2,0x8F03,0x8F09,0x8EFE,0x8F0A, + 0x8F9F,0x8FB2,0x904B,0x904A,0x9053,0x9042,0x9054,0x903C, + 0x9055,0x9050,0x9047,0x904F,0x904E,0x904D,0x9051,0x903E, + 0x9041,0x9112,0x9117,0x916C,0x916A,0x9169,0x91C9,0x9237, + 0x9257,0x9238,0x923D,0x9240,0x923E,0x925B,0x924B,0x9264, + 0x9251,0x9234,0x9249,0x924D,0x9245,0x9239,0x923F,0x925A, + 0x9598,0x9698,0x9694,0x9695,0x96CD,0x96CB,0x96C9,0x96CA, + 0x96F7,0x96FB,0x96F9,0x96F6,0x9756,0x9774,0x9776,0x9810, + 0x9811,0x9813,0x980A,0x9812,0x980C,0x98FC,0x98F4,0x98FD, + 0x98FE,0x99B3,0x99B1,0x99B4,0x9AE1,0x9CE9,0x9E82,0x9F0E, + 0x9F13,0x9F20,0x50E7,0x50EE,0x50E5,0x50D6,0x50ED,0x50DA, + 0x50D5,0x50CF,0x50D1,0x50F1,0x50CE,0x50E9,0x5162,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x51F3,0x5283,0x5282,0x5331,0x53AD,0x55FE,0x5600, + 0x561B,0x5617,0x55FD,0x5614,0x5606,0x5609,0x560D,0x560E, + 0x55F7,0x5616,0x561F,0x5608,0x5610,0x55F6,0x5718,0x5716, + 0x5875,0x587E,0x5883,0x5893,0x588A,0x5879,0x5885,0x587D, + 0x58FD,0x5925,0x5922,0x5924,0x596A,0x5969,0x5AE1,0x5AE6, + 0x5AE9,0x5AD7,0x5AD6,0x5AD8,0x5AE3,0x5B75,0x5BDE,0x5BE7, + 0x5BE1,0x5BE5,0x5BE6,0x5BE8,0x5BE2,0x5BE4,0x5BDF,0x5C0D, + 0x5C62,0x5D84,0x5D87,0x5E5B,0x5E63,0x5E55,0x5E57,0x5E54, + 0x5ED3,0x5ED6,0x5F0A,0x5F46,0x5F70,0x5FB9,0x6147,0x613F, + 0x614B,0x6177,0x6162,0x6163,0x615F,0x615A,0x6158,0x6175, + 0x622A,0x6487,0x6458,0x6454,0x64A4,0x6478,0x645F,0x647A, + 0x6451,0x6467,0x6434,0x646D,0x647B,0x6572,0x65A1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x65D7,0x65D6,0x66A2,0x66A8,0x669D,0x699C,0x69A8, + 0x6995,0x69C1,0x69AE,0x69D3,0x69CB,0x699B,0x69B7,0x69BB, + 0x69AB,0x69B4,0x69D0,0x69CD,0x69AD,0x69CC,0x69A6,0x69C3, + 0x69A3,0x6B49,0x6B4C,0x6C33,0x6F33,0x6F14,0x6EFE,0x6F13, + 0x6EF4,0x6F29,0x6F3E,0x6F20,0x6F2C,0x6F0F,0x6F02,0x6F22, + 0x6EFF,0x6EEF,0x6F06,0x6F31,0x6F38,0x6F32,0x6F23,0x6F15, + 0x6F2B,0x6F2F,0x6F88,0x6F2A,0x6EEC,0x6F01,0x6EF2,0x6ECC, + 0x6EF7,0x7194,0x7199,0x717D,0x718A,0x7184,0x7192,0x723E, + 0x7292,0x7296,0x7344,0x7350,0x7464,0x7463,0x746A,0x7470, + 0x746D,0x7504,0x7591,0x7627,0x760D,0x760B,0x7609,0x7613, + 0x76E1,0x76E3,0x7784,0x777D,0x777F,0x7761,0x78C1,0x789F, + 0x78A7,0x78B3,0x78A9,0x78A3,0x798E,0x798F,0x798D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 107, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A2E,0x7A31,0x7AAA,0x7AA9,0x7AED,0x7AEF,0x7BA1, + 0x7B95,0x7B8B,0x7B75,0x7B97,0x7B9D,0x7B94,0x7B8F,0x7BB8, + 0x7B87,0x7B84,0x7CB9,0x7CBD,0x7CBE,0x7DBB,0x7DB0,0x7D9C, + 0x7DBD,0x7DBE,0x7DA0,0x7DCA,0x7DB4,0x7DB2,0x7DB1,0x7DBA, + 0x7DA2,0x7DBF,0x7DB5,0x7DB8,0x7DAD,0x7DD2,0x7DC7,0x7DAC, + 0x7F70,0x7FE0,0x7FE1,0x7FDF,0x805E,0x805A,0x8087,0x8150, + 0x8180,0x818F,0x8188,0x818A,0x817F,0x8182,0x81E7,0x81FA, + 0x8207,0x8214,0x821E,0x824B,0x84C9,0x84BF,0x84C6,0x84C4, + 0x8499,0x849E,0x84B2,0x849C,0x84CB,0x84B8,0x84C0,0x84D3, + 0x8490,0x84BC,0x84D1,0x84CA,0x873F,0x871C,0x873B,0x8722, + 0x8725,0x8734,0x8718,0x8755,0x8737,0x8729,0x88F3,0x8902, + 0x88F4,0x88F9,0x88F8,0x88FD,0x88E8,0x891A,0x88EF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8AA6,0x8A8C,0x8A9E,0x8AA3,0x8A8D,0x8AA1,0x8A93, + 0x8AA4,0x8AAA,0x8AA5,0x8AA8,0x8A98,0x8A91,0x8A9A,0x8AA7, + 0x8C6A,0x8C8D,0x8C8C,0x8CD3,0x8CD1,0x8CD2,0x8D6B,0x8D99, + 0x8D95,0x8DFC,0x8F14,0x8F12,0x8F15,0x8F13,0x8FA3,0x9060, + 0x9058,0x905C,0x9063,0x9059,0x905E,0x9062,0x905D,0x905B, + 0x9119,0x9118,0x911E,0x9175,0x9178,0x9177,0x9174,0x9278, + 0x92AC,0x9280,0x9285,0x9298,0x9296,0x927B,0x9293,0x929C, + 0x92A8,0x927C,0x9291,0x95A1,0x95A8,0x95A9,0x95A3,0x95A5, + 0x95A4,0x9699,0x969C,0x969B,0x96CC,0x96D2,0x9700,0x977C, + 0x9785,0x97F6,0x9817,0x9818,0x98AF,0x98B1,0x9903,0x9905, + 0x990C,0x9909,0x99C1,0x9AAF,0x9AB0,0x9AE6,0x9B41,0x9B42, + 0x9CF4,0x9CF6,0x9CF3,0x9EBC,0x9F3B,0x9F4A,0x5104,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5100,0x50FB,0x50F5,0x50F9,0x5102,0x5108,0x5109, + 0x5105,0x51DC,0x5287,0x5288,0x5289,0x528D,0x528A,0x52F0, + 0x53B2,0x562E,0x563B,0x5639,0x5632,0x563F,0x5634,0x5629, + 0x5653,0x564E,0x5657,0x5674,0x5636,0x562F,0x5630,0x5880, + 0x589F,0x589E,0x58B3,0x589C,0x58AE,0x58A9,0x58A6,0x596D, + 0x5B09,0x5AFB,0x5B0B,0x5AF5,0x5B0C,0x5B08,0x5BEE,0x5BEC, + 0x5BE9,0x5BEB,0x5C64,0x5C65,0x5D9D,0x5D94,0x5E62,0x5E5F, + 0x5E61,0x5EE2,0x5EDA,0x5EDF,0x5EDD,0x5EE3,0x5EE0,0x5F48, + 0x5F71,0x5FB7,0x5FB5,0x6176,0x6167,0x616E,0x615D,0x6155, + 0x6182,0x617C,0x6170,0x616B,0x617E,0x61A7,0x6190,0x61AB, + 0x618E,0x61AC,0x619A,0x61A4,0x6194,0x61AE,0x622E,0x6469, + 0x646F,0x6479,0x649E,0x64B2,0x6488,0x6490,0x64B0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x64A5,0x6493,0x6495,0x64A9,0x6492,0x64AE,0x64AD, + 0x64AB,0x649A,0x64AC,0x6499,0x64A2,0x64B3,0x6575,0x6577, + 0x6578,0x66AE,0x66AB,0x66B4,0x66B1,0x6A23,0x6A1F,0x69E8, + 0x6A01,0x6A1E,0x6A19,0x69FD,0x6A21,0x6A13,0x6A0A,0x69F3, + 0x6A02,0x6A05,0x69ED,0x6A11,0x6B50,0x6B4E,0x6BA4,0x6BC5, + 0x6BC6,0x6F3F,0x6F7C,0x6F84,0x6F51,0x6F66,0x6F54,0x6F86, + 0x6F6D,0x6F5B,0x6F78,0x6F6E,0x6F8E,0x6F7A,0x6F70,0x6F64, + 0x6F97,0x6F58,0x6ED5,0x6F6F,0x6F60,0x6F5F,0x719F,0x71AC, + 0x71B1,0x71A8,0x7256,0x729B,0x734E,0x7357,0x7469,0x748B, + 0x7483,0x747E,0x7480,0x757F,0x7620,0x7629,0x761F,0x7624, + 0x7626,0x7621,0x7622,0x769A,0x76BA,0x76E4,0x778E,0x7787, + 0x778C,0x7791,0x778B,0x78CB,0x78C5,0x78BA,0x78CA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x78BE,0x78D5,0x78BC,0x78D0,0x7A3F,0x7A3C,0x7A40, + 0x7A3D,0x7A37,0x7A3B,0x7AAF,0x7AAE,0x7BAD,0x7BB1,0x7BC4, + 0x7BB4,0x7BC6,0x7BC7,0x7BC1,0x7BA0,0x7BCC,0x7CCA,0x7DE0, + 0x7DF4,0x7DEF,0x7DFB,0x7DD8,0x7DEC,0x7DDD,0x7DE8,0x7DE3, + 0x7DDA,0x7DDE,0x7DE9,0x7D9E,0x7DD9,0x7DF2,0x7DF9,0x7F75, + 0x7F77,0x7FAF,0x7FE9,0x8026,0x819B,0x819C,0x819D,0x81A0, + 0x819A,0x8198,0x8517,0x853D,0x851A,0x84EE,0x852C,0x852D, + 0x8513,0x8511,0x8523,0x8521,0x8514,0x84EC,0x8525,0x84FF, + 0x8506,0x8782,0x8774,0x8776,0x8760,0x8766,0x8778,0x8768, + 0x8759,0x8757,0x874C,0x8753,0x885B,0x885D,0x8910,0x8907, + 0x8912,0x8913,0x8915,0x890A,0x8ABC,0x8AD2,0x8AC7,0x8AC4, + 0x8A95,0x8ACB,0x8AF8,0x8AB2,0x8AC9,0x8AC2,0x8ABF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 112, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8AB0,0x8AD6,0x8ACD,0x8AB6,0x8AB9,0x8ADB,0x8C4C, + 0x8C4E,0x8C6C,0x8CE0,0x8CDE,0x8CE6,0x8CE4,0x8CEC,0x8CED, + 0x8CE2,0x8CE3,0x8CDC,0x8CEA,0x8CE1,0x8D6D,0x8D9F,0x8DA3, + 0x8E2B,0x8E10,0x8E1D,0x8E22,0x8E0F,0x8E29,0x8E1F,0x8E21, + 0x8E1E,0x8EBA,0x8F1D,0x8F1B,0x8F1F,0x8F29,0x8F26,0x8F2A, + 0x8F1C,0x8F1E,0x8F25,0x9069,0x906E,0x9068,0x906D,0x9077, + 0x9130,0x912D,0x9127,0x9131,0x9187,0x9189,0x918B,0x9183, + 0x92C5,0x92BB,0x92B7,0x92EA,0x92E4,0x92C1,0x92B3,0x92BC, + 0x92D2,0x92C7,0x92F0,0x92B2,0x95AD,0x95B1,0x9704,0x9706, + 0x9707,0x9709,0x9760,0x978D,0x978B,0x978F,0x9821,0x982B, + 0x981C,0x98B3,0x990A,0x9913,0x9912,0x9918,0x99DD,0x99D0, + 0x99DF,0x99DB,0x99D1,0x99D5,0x99D2,0x99D9,0x9AB7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 113, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9AEE,0x9AEF,0x9B27,0x9B45,0x9B44,0x9B77,0x9B6F, + 0x9D06,0x9D09,0x9D03,0x9EA9,0x9EBE,0x9ECE,0x58A8,0x9F52, + 0x5112,0x5118,0x5114,0x5110,0x5115,0x5180,0x51AA,0x51DD, + 0x5291,0x5293,0x52F3,0x5659,0x566B,0x5679,0x5669,0x5664, + 0x5678,0x566A,0x5668,0x5665,0x5671,0x566F,0x566C,0x5662, + 0x5676,0x58C1,0x58BE,0x58C7,0x58C5,0x596E,0x5B1D,0x5B34, + 0x5B78,0x5BF0,0x5C0E,0x5F4A,0x61B2,0x6191,0x61A9,0x618A, + 0x61CD,0x61B6,0x61BE,0x61CA,0x61C8,0x6230,0x64C5,0x64C1, + 0x64CB,0x64BB,0x64BC,0x64DA,0x64C4,0x64C7,0x64C2,0x64CD, + 0x64BF,0x64D2,0x64D4,0x64BE,0x6574,0x66C6,0x66C9,0x66B9, + 0x66C4,0x66C7,0x66B8,0x6A3D,0x6A38,0x6A3A,0x6A59,0x6A6B, + 0x6A58,0x6A39,0x6A44,0x6A62,0x6A61,0x6A4B,0x6A47,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 114, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A35,0x6A5F,0x6A48,0x6B59,0x6B77,0x6C05,0x6FC2, + 0x6FB1,0x6FA1,0x6FC3,0x6FA4,0x6FC1,0x6FA7,0x6FB3,0x6FC0, + 0x6FB9,0x6FB6,0x6FA6,0x6FA0,0x6FB4,0x71BE,0x71C9,0x71D0, + 0x71D2,0x71C8,0x71D5,0x71B9,0x71CE,0x71D9,0x71DC,0x71C3, + 0x71C4,0x7368,0x749C,0x74A3,0x7498,0x749F,0x749E,0x74E2, + 0x750C,0x750D,0x7634,0x7638,0x763A,0x76E7,0x76E5,0x77A0, + 0x779E,0x779F,0x77A5,0x78E8,0x78DA,0x78EC,0x78E7,0x79A6, + 0x7A4D,0x7A4E,0x7A46,0x7A4C,0x7A4B,0x7ABA,0x7BD9,0x7C11, + 0x7BC9,0x7BE4,0x7BDB,0x7BE1,0x7BE9,0x7BE6,0x7CD5,0x7CD6, + 0x7E0A,0x7E11,0x7E08,0x7E1B,0x7E23,0x7E1E,0x7E1D,0x7E09, + 0x7E10,0x7F79,0x7FB2,0x7FF0,0x7FF1,0x7FEE,0x8028,0x81B3, + 0x81A9,0x81A8,0x81FB,0x8208,0x8258,0x8259,0x854A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 115, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8559,0x8548,0x8568,0x8569,0x8543,0x8549,0x856D, + 0x856A,0x855E,0x8783,0x879F,0x879E,0x87A2,0x878D,0x8861, + 0x892A,0x8932,0x8925,0x892B,0x8921,0x89AA,0x89A6,0x8AE6, + 0x8AFA,0x8AEB,0x8AF1,0x8B00,0x8ADC,0x8AE7,0x8AEE,0x8AFE, + 0x8B01,0x8B02,0x8AF7,0x8AED,0x8AF3,0x8AF6,0x8AFC,0x8C6B, + 0x8C6D,0x8C93,0x8CF4,0x8E44,0x8E31,0x8E34,0x8E42,0x8E39, + 0x8E35,0x8F3B,0x8F2F,0x8F38,0x8F33,0x8FA8,0x8FA6,0x9075, + 0x9074,0x9078,0x9072,0x907C,0x907A,0x9134,0x9192,0x9320, + 0x9336,0x92F8,0x9333,0x932F,0x9322,0x92FC,0x932B,0x9304, + 0x931A,0x9310,0x9326,0x9321,0x9315,0x932E,0x9319,0x95BB, + 0x96A7,0x96A8,0x96AA,0x96D5,0x970E,0x9711,0x9716,0x970D, + 0x9713,0x970F,0x975B,0x975C,0x9766,0x9798,0x9830,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 116, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9838,0x983B,0x9837,0x982D,0x9839,0x9824,0x9910, + 0x9928,0x991E,0x991B,0x9921,0x991A,0x99ED,0x99E2,0x99F1, + 0x9AB8,0x9ABC,0x9AFB,0x9AED,0x9B28,0x9B91,0x9D15,0x9D23, + 0x9D26,0x9D28,0x9D12,0x9D1B,0x9ED8,0x9ED4,0x9F8D,0x9F9C, + 0x512A,0x511F,0x5121,0x5132,0x52F5,0x568E,0x5680,0x5690, + 0x5685,0x5687,0x568F,0x58D5,0x58D3,0x58D1,0x58CE,0x5B30, + 0x5B2A,0x5B24,0x5B7A,0x5C37,0x5C68,0x5DBC,0x5DBA,0x5DBD, + 0x5DB8,0x5E6B,0x5F4C,0x5FBD,0x61C9,0x61C2,0x61C7,0x61E6, + 0x61CB,0x6232,0x6234,0x64CE,0x64CA,0x64D8,0x64E0,0x64F0, + 0x64E6,0x64EC,0x64F1,0x64E2,0x64ED,0x6582,0x6583,0x66D9, + 0x66D6,0x6A80,0x6A94,0x6A84,0x6AA2,0x6A9C,0x6ADB,0x6AA3, + 0x6A7E,0x6A97,0x6A90,0x6AA0,0x6B5C,0x6BAE,0x6BDA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 117, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C08,0x6FD8,0x6FF1,0x6FDF,0x6FE0,0x6FDB,0x6FE4, + 0x6FEB,0x6FEF,0x6F80,0x6FEC,0x6FE1,0x6FE9,0x6FD5,0x6FEE, + 0x6FF0,0x71E7,0x71DF,0x71EE,0x71E6,0x71E5,0x71ED,0x71EC, + 0x71F4,0x71E0,0x7235,0x7246,0x7370,0x7372,0x74A9,0x74B0, + 0x74A6,0x74A8,0x7646,0x7642,0x764C,0x76EA,0x77B3,0x77AA, + 0x77B0,0x77AC,0x77A7,0x77AD,0x77EF,0x78F7,0x78FA,0x78F4, + 0x78EF,0x7901,0x79A7,0x79AA,0x7A57,0x7ABF,0x7C07,0x7C0D, + 0x7BFE,0x7BF7,0x7C0C,0x7BE0,0x7CE0,0x7CDC,0x7CDE,0x7CE2, + 0x7CDF,0x7CD9,0x7CDD,0x7E2E,0x7E3E,0x7E46,0x7E37,0x7E32, + 0x7E43,0x7E2B,0x7E3D,0x7E31,0x7E45,0x7E41,0x7E34,0x7E39, + 0x7E48,0x7E35,0x7E3F,0x7E2F,0x7F44,0x7FF3,0x7FFC,0x8071, + 0x8072,0x8070,0x806F,0x8073,0x81C6,0x81C3,0x81BA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 118, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x81C2,0x81C0,0x81BF,0x81BD,0x81C9,0x81BE,0x81E8, + 0x8209,0x8271,0x85AA,0x8584,0x857E,0x859C,0x8591,0x8594, + 0x85AF,0x859B,0x8587,0x85A8,0x858A,0x85A6,0x8667,0x87C0, + 0x87D1,0x87B3,0x87D2,0x87C6,0x87AB,0x87BB,0x87BA,0x87C8, + 0x87CB,0x893B,0x8936,0x8944,0x8938,0x893D,0x89AC,0x8B0E, + 0x8B17,0x8B19,0x8B1B,0x8B0A,0x8B20,0x8B1D,0x8B04,0x8B10, + 0x8C41,0x8C3F,0x8C73,0x8CFA,0x8CFD,0x8CFC,0x8CF8,0x8CFB, + 0x8DA8,0x8E49,0x8E4B,0x8E48,0x8E4A,0x8F44,0x8F3E,0x8F42, + 0x8F45,0x8F3F,0x907F,0x907D,0x9084,0x9081,0x9082,0x9080, + 0x9139,0x91A3,0x919E,0x919C,0x934D,0x9382,0x9328,0x9375, + 0x934A,0x9365,0x934B,0x9318,0x937E,0x936C,0x935B,0x9370, + 0x935A,0x9354,0x95CA,0x95CB,0x95CC,0x95C8,0x95C6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 119, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x96B1,0x96B8,0x96D6,0x971C,0x971E,0x97A0,0x97D3, + 0x9846,0x98B6,0x9935,0x9A01,0x99FF,0x9BAE,0x9BAB,0x9BAA, + 0x9BAD,0x9D3B,0x9D3F,0x9E8B,0x9ECF,0x9EDE,0x9EDC,0x9EDD, + 0x9EDB,0x9F3E,0x9F4B,0x53E2,0x5695,0x56AE,0x58D9,0x58D8, + 0x5B38,0x5F5E,0x61E3,0x6233,0x64F4,0x64F2,0x64FE,0x6506, + 0x64FA,0x64FB,0x64F7,0x65B7,0x66DC,0x6726,0x6AB3,0x6AAC, + 0x6AC3,0x6ABB,0x6AB8,0x6AC2,0x6AAE,0x6AAF,0x6B5F,0x6B78, + 0x6BAF,0x7009,0x700B,0x6FFE,0x7006,0x6FFA,0x7011,0x700F, + 0x71FB,0x71FC,0x71FE,0x71F8,0x7377,0x7375,0x74A7,0x74BF, + 0x7515,0x7656,0x7658,0x7652,0x77BD,0x77BF,0x77BB,0x77BC, + 0x790E,0x79AE,0x7A61,0x7A62,0x7A60,0x7AC4,0x7AC5,0x7C2B, + 0x7C27,0x7C2A,0x7C1E,0x7C23,0x7C21,0x7CE7,0x7E54,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 120, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7E55,0x7E5E,0x7E5A,0x7E61,0x7E52,0x7E59,0x7F48, + 0x7FF9,0x7FFB,0x8077,0x8076,0x81CD,0x81CF,0x820A,0x85CF, + 0x85A9,0x85CD,0x85D0,0x85C9,0x85B0,0x85BA,0x85B9,0x87EF, + 0x87EC,0x87F2,0x87E0,0x8986,0x89B2,0x89F4,0x8B28,0x8B39, + 0x8B2C,0x8B2B,0x8C50,0x8D05,0x8E59,0x8E63,0x8E66,0x8E64, + 0x8E5F,0x8E55,0x8EC0,0x8F49,0x8F4D,0x9087,0x9083,0x9088, + 0x91AB,0x91AC,0x91D0,0x9394,0x938A,0x9396,0x93A2,0x93B3, + 0x93AE,0x93AC,0x93B0,0x9398,0x939A,0x9397,0x95D4,0x95D6, + 0x95D0,0x95D5,0x96E2,0x96DC,0x96D9,0x96DB,0x96DE,0x9724, + 0x97A3,0x97A6,0x97AD,0x97F9,0x984D,0x984F,0x984C,0x984E, + 0x9853,0x98BA,0x993E,0x993F,0x993D,0x992E,0x99A5,0x9A0E, + 0x9AC1,0x9B03,0x9B06,0x9B4F,0x9B4E,0x9B4D,0x9BCA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9BC9,0x9BFD,0x9BC8,0x9BC0,0x9D51,0x9D5D,0x9D60, + 0x9EE0,0x9F15,0x9F2C,0x5133,0x56A5,0x56A8,0x58DE,0x58DF, + 0x58E2,0x5BF5,0x9F90,0x5EEC,0x61F2,0x61F7,0x61F6,0x61F5, + 0x6500,0x650F,0x66E0,0x66DD,0x6AE5,0x6ADD,0x6ADA,0x6AD3, + 0x701B,0x701F,0x7028,0x701A,0x701D,0x7015,0x7018,0x7206, + 0x720D,0x7258,0x72A2,0x7378,0x737A,0x74BD,0x74CA,0x74E3, + 0x7587,0x7586,0x765F,0x7661,0x77C7,0x7919,0x79B1,0x7A6B, + 0x7A69,0x7C3E,0x7C3F,0x7C38,0x7C3D,0x7C37,0x7C40,0x7E6B, + 0x7E6D,0x7E79,0x7E69,0x7E6A,0x7E73,0x7F85,0x7FB6,0x7FB9, + 0x7FB8,0x81D8,0x85E9,0x85DD,0x85EA,0x85D5,0x85E4,0x85E5, + 0x85F7,0x87FB,0x8805,0x880D,0x87F9,0x87FE,0x8960,0x895F, + 0x8956,0x895E,0x8B41,0x8B5C,0x8B58,0x8B49,0x8B5A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 122, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8B4E,0x8B4F,0x8B46,0x8B59,0x8D08,0x8D0A,0x8E7C, + 0x8E72,0x8E87,0x8E76,0x8E6C,0x8E7A,0x8E74,0x8F54,0x8F4E, + 0x8FAD,0x908A,0x908B,0x91B1,0x91AE,0x93E1,0x93D1,0x93DF, + 0x93C3,0x93C8,0x93DC,0x93DD,0x93D6,0x93E2,0x93CD,0x93D8, + 0x93E4,0x93D7,0x93E8,0x95DC,0x96B4,0x96E3,0x972A,0x9727, + 0x9761,0x97DC,0x97FB,0x985E,0x9858,0x985B,0x98BC,0x9945, + 0x9949,0x9A16,0x9A19,0x9B0D,0x9BE8,0x9BE7,0x9BD6,0x9BDB, + 0x9D89,0x9D61,0x9D72,0x9D6A,0x9D6C,0x9E92,0x9E97,0x9E93, + 0x9EB4,0x52F8,0x56B7,0x56B6,0x56B4,0x56BC,0x58E4,0x5B40, + 0x5B43,0x5B7D,0x5BF6,0x5DC9,0x61F8,0x61FA,0x6518,0x6514, + 0x6519,0x66E6,0x6727,0x6AEC,0x703E,0x7030,0x7032,0x7210, + 0x737B,0x74CF,0x7662,0x7665,0x7926,0x792A,0x792C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x792B,0x7AC7,0x7AF6,0x7C4C,0x7C43,0x7C4D,0x7CEF, + 0x7CF0,0x8FAE,0x7E7D,0x7E7C,0x7E82,0x7F4C,0x8000,0x81DA, + 0x8266,0x85FB,0x85F9,0x8611,0x85FA,0x8606,0x860B,0x8607, + 0x860A,0x8814,0x8815,0x8964,0x89BA,0x89F8,0x8B70,0x8B6C, + 0x8B66,0x8B6F,0x8B5F,0x8B6B,0x8D0F,0x8D0D,0x8E89,0x8E81, + 0x8E85,0x8E82,0x91B4,0x91CB,0x9418,0x9403,0x93FD,0x95E1, + 0x9730,0x98C4,0x9952,0x9951,0x99A8,0x9A2B,0x9A30,0x9A37, + 0x9A35,0x9C13,0x9C0D,0x9E79,0x9EB5,0x9EE8,0x9F2F,0x9F5F, + 0x9F63,0x9F61,0x5137,0x5138,0x56C1,0x56C0,0x56C2,0x5914, + 0x5C6C,0x5DCD,0x61FC,0x61FE,0x651D,0x651C,0x6595,0x66E9, + 0x6AFB,0x6B04,0x6AFA,0x6BB2,0x704C,0x721B,0x72A7,0x74D6, + 0x74D4,0x7669,0x77D3,0x7C50,0x7E8F,0x7E8C,0x7FBC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 124, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8617,0x862D,0x861A,0x8823,0x8822,0x8821,0x881F, + 0x896A,0x896C,0x89BD,0x8B74,0x8B77,0x8B7D,0x8D13,0x8E8A, + 0x8E8D,0x8E8B,0x8F5F,0x8FAF,0x91BA,0x942E,0x9433,0x9435, + 0x943A,0x9438,0x9432,0x942B,0x95E2,0x9738,0x9739,0x9732, + 0x97FF,0x9867,0x9865,0x9957,0x9A45,0x9A43,0x9A40,0x9A3E, + 0x9ACF,0x9B54,0x9B51,0x9C2D,0x9C25,0x9DAF,0x9DB4,0x9DC2, + 0x9DB8,0x9E9D,0x9EEF,0x9F19,0x9F5C,0x9F66,0x9F67,0x513C, + 0x513B,0x56C8,0x56CA,0x56C9,0x5B7F,0x5DD4,0x5DD2,0x5F4E, + 0x61FF,0x6524,0x6B0A,0x6B61,0x7051,0x7058,0x7380,0x74E4, + 0x758A,0x766E,0x766C,0x79B3,0x7C60,0x7C5F,0x807E,0x807D, + 0x81DF,0x8972,0x896F,0x89FC,0x8B80,0x8D16,0x8D17,0x8E91, + 0x8E93,0x8F61,0x9148,0x9444,0x9451,0x9452,0x973D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 125, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x973E,0x97C3,0x97C1,0x986B,0x9955,0x9A55,0x9A4D, + 0x9AD2,0x9B1A,0x9C49,0x9C31,0x9C3E,0x9C3B,0x9DD3,0x9DD7, + 0x9F34,0x9F6C,0x9F6A,0x9F94,0x56CC,0x5DD6,0x6200,0x6523, + 0x652B,0x652A,0x66EC,0x6B10,0x74DA,0x7ACA,0x7C64,0x7C63, + 0x7C65,0x7E93,0x7E96,0x7E94,0x81E2,0x8638,0x863F,0x8831, + 0x8B8A,0x9090,0x908F,0x9463,0x9460,0x9464,0x9768,0x986F, + 0x995C,0x9A5A,0x9A5B,0x9A57,0x9AD3,0x9AD4,0x9AD1,0x9C54, + 0x9C57,0x9C56,0x9DE5,0x9E9F,0x9EF4,0x56D1,0x58E9,0x652C, + 0x705E,0x7671,0x7672,0x77D7,0x7F50,0x7F88,0x8836,0x8839, + 0x8862,0x8B93,0x8B92,0x8B96,0x8277,0x8D1B,0x91C0,0x946A, + 0x9742,0x9748,0x9744,0x97C6,0x9870,0x9A5F,0x9B22,0x9B58, + 0x9C5F,0x9DF9,0x9DFA,0x9E7C,0x9E7D,0x9F07,0x9F77,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 126, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9F72,0x5EF3,0x6B16,0x7063,0x7C6C,0x7C6E,0x883B, + 0x89C0,0x8EA1,0x91C1,0x9472,0x9470,0x9871,0x995E,0x9AD6, + 0x9B23,0x9ECC,0x7064,0x77DA,0x8B9A,0x9477,0x97C9,0x9A62, + 0x9A65,0x7E9C,0x8B9C,0x8EAA,0x91C5,0x947D,0x947E,0x947C, + 0x9C77,0x9C78,0x9EF7,0x8C54,0x947F,0x9E1A,0x7228,0x9A6A, + 0x9B31,0x9E1B,0x9E1E,0x7C72,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE1 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit cns11643_plane1 -> UCS size-optimized table (12138 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_cns11643_plane1[] = +{ + 0x0042, /* Ranges number */ + 0x0000, /* Unranged codes number */ + 0x17B5, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x2121, 0x2139, 0x00C9, + /* Array index: 0x0006 */ 0x213E, 0x217E, 0x00E2, + /* Array index: 0x0009 */ 0x2221, 0x227E, 0x0123, + /* Array index: 0x000C */ 0x2321, 0x234E, 0x0181, + /* Array index: 0x000F */ 0x2421, 0x247E, 0x01AF, + /* Array index: 0x0012 */ 0x2521, 0x2570, 0x020D, + /* Array index: 0x0015 */ 0x2621, 0x263E, 0x025D, + /* Array index: 0x0018 */ 0x4221, 0x4241, 0x027B, + /* Array index: 0x001B */ 0x4421, 0x447E, 0x029C, + /* Array index: 0x001E */ 0x4521, 0x457E, 0x02FA, + /* Array index: 0x0021 */ 0x4621, 0x467E, 0x0358, + /* Array index: 0x0024 */ 0x4721, 0x477E, 0x03B6, + /* Array index: 0x0027 */ 0x4821, 0x487E, 0x0414, + /* Array index: 0x002A */ 0x4921, 0x497E, 0x0472, + /* Array index: 0x002D */ 0x4A21, 0x4A7E, 0x04D0, + /* Array index: 0x0030 */ 0x4B21, 0x4B7E, 0x052E, + /* Array index: 0x0033 */ 0x4C21, 0x4C7E, 0x058C, + /* Array index: 0x0036 */ 0x4D21, 0x4D7E, 0x05EA, + /* Array index: 0x0039 */ 0x4E21, 0x4E7E, 0x0648, + /* Array index: 0x003C */ 0x4F21, 0x4F7E, 0x06A6, + /* Array index: 0x003F */ 0x5021, 0x507E, 0x0704, + /* Array index: 0x0042 */ 0x5121, 0x517E, 0x0762, + /* Array index: 0x0045 */ 0x5221, 0x527E, 0x07C0, + /* Array index: 0x0048 */ 0x5321, 0x537E, 0x081E, + /* Array index: 0x004B */ 0x5421, 0x547E, 0x087C, + /* Array index: 0x004E */ 0x5521, 0x557E, 0x08DA, + /* Array index: 0x0051 */ 0x5621, 0x567E, 0x0938, + /* Array index: 0x0054 */ 0x5721, 0x577E, 0x0996, + /* Array index: 0x0057 */ 0x5821, 0x587E, 0x09F4, + /* Array index: 0x005A */ 0x5921, 0x597E, 0x0A52, + /* Array index: 0x005D */ 0x5A21, 0x5A7E, 0x0AB0, + /* Array index: 0x0060 */ 0x5B21, 0x5B7E, 0x0B0E, + /* Array index: 0x0063 */ 0x5C21, 0x5C7E, 0x0B6C, + /* Array index: 0x0066 */ 0x5D21, 0x5D7E, 0x0BCA, + /* Array index: 0x0069 */ 0x5E21, 0x5E7E, 0x0C28, + /* Array index: 0x006C */ 0x5F21, 0x5F7E, 0x0C86, + /* Array index: 0x006F */ 0x6021, 0x607E, 0x0CE4, + /* Array index: 0x0072 */ 0x6121, 0x617E, 0x0D42, + /* Array index: 0x0075 */ 0x6221, 0x627E, 0x0DA0, + /* Array index: 0x0078 */ 0x6321, 0x637E, 0x0DFE, + /* Array index: 0x007B */ 0x6421, 0x647E, 0x0E5C, + /* Array index: 0x007E */ 0x6521, 0x657E, 0x0EBA, + /* Array index: 0x0081 */ 0x6621, 0x667E, 0x0F18, + /* Array index: 0x0084 */ 0x6721, 0x677E, 0x0F76, + /* Array index: 0x0087 */ 0x6821, 0x687E, 0x0FD4, + /* Array index: 0x008A */ 0x6921, 0x697E, 0x1032, + /* Array index: 0x008D */ 0x6A21, 0x6A7E, 0x1090, + /* Array index: 0x0090 */ 0x6B21, 0x6B7E, 0x10EE, + /* Array index: 0x0093 */ 0x6C21, 0x6C7E, 0x114C, + /* Array index: 0x0096 */ 0x6D21, 0x6D7E, 0x11AA, + /* Array index: 0x0099 */ 0x6E21, 0x6E7E, 0x1208, + /* Array index: 0x009C */ 0x6F21, 0x6F7E, 0x1266, + /* Array index: 0x009F */ 0x7021, 0x707E, 0x12C4, + /* Array index: 0x00A2 */ 0x7121, 0x717E, 0x1322, + /* Array index: 0x00A5 */ 0x7221, 0x727E, 0x1380, + /* Array index: 0x00A8 */ 0x7321, 0x737E, 0x13DE, + /* Array index: 0x00AB */ 0x7421, 0x747E, 0x143C, + /* Array index: 0x00AE */ 0x7521, 0x757E, 0x149A, + /* Array index: 0x00B1 */ 0x7621, 0x767E, 0x14F8, + /* Array index: 0x00B4 */ 0x7721, 0x777E, 0x1556, + /* Array index: 0x00B7 */ 0x7821, 0x787E, 0x15B4, + /* Array index: 0x00BA */ 0x7921, 0x797E, 0x1612, + /* Array index: 0x00BD */ 0x7A21, 0x7A7E, 0x1670, + /* Array index: 0x00C0 */ 0x7B21, 0x7B7E, 0x16CE, + /* Array index: 0x00C3 */ 0x7C21, 0x7C7E, 0x172C, + /* Array index: 0x00C6 */ 0x7D21, 0x7D4B, 0x178A, + /* Ranges content */ + /* Range 0x2121 - 0x2139, array index: 0x00C9 */ + 0x3000,0xFF0C,0x3001,0x3002,0xFF0E,0x30FB,0xFF1B,0xFF1A, + 0xFF1F,0xFF01,0xFE30,0x2026,0x2025,0xFE50,0xFE51,0xFE52, + 0x00B7,0xFE54,0xFE55,0xFE56,0xFE57,0xFE31,0x2014,0xFE32, + 0x2013, + /* Range 0x213E - 0x217E, array index: 0x00E2 */ + 0xFF08,0xFF09,0xFE35,0xFE36,0xFF5B,0xFF5D,0xFE37,0xFE38, + 0x3014,0x3015,0xFE39,0xFE3A,0x3010,0x3011,0xFE3B,0xFE3C, + 0x300A,0x300B,0xFE3D,0xFE3E,0x3008,0x3009,0xFE3F,0xFE40, + 0x300C,0x300D,0xFE41,0xFE42,0x300E,0x300F,0xFE43,0xFE44, + 0xFE59,0xFE5A,0xFE5B,0xFE5C,0xFE5D,0xFE5E,0x2018,0x2019, + 0x201C,0x201D,0x301D,0x301E,0x2032,0x2035,0xFF03,0xFF06, + 0xFF0A,0x203B,0x00A7,0x3003,0x25CB,0x25CF,0x25B3,0x25B2, + 0x25CE,0x2606,0x2605,0x25C7,0x25C6,0x25A1,0x25A0,0x25BD, + 0x25BC, + /* Range 0x2221 - 0x227E, array index: 0x0123 */ + 0x32A3,0x2105,0x203E,INVALC,0xFF3F,INVALC,0xFE49,0xFE4A, + 0xFE4D,0xFE4E,0xFE4B,0xFE4C,0xFE5F,0xFE60,0xFE61,0xFF0B, + 0xFF0D,0x00D7,0x00F7,0x00B1,0x221A,0xFF1C,0xFF1E,0xFF1D, + 0x2266,0x2267,0x2260,0x221E,0x2252,0x2261,0xFE62,0xFE63, + 0xFE64,0xFE66,0xFE65,0x223C,0x2229,0x222A,0x22A5,0x2220, + 0x221F,0x22BF,0x33D2,0x33D1,0x222B,0x222E,0x2235,0x2234, + 0x2640,0x2642,0x2641,0x2609,0x2191,0x2193,0x2192,0x2190, + 0x2196,0x2197,0x2199,0x2198,0x2016,0xFF5C,0xFF0F,0xFF3C, + 0x2215,0xFE68,0xFF04,0xFFE5,0x3012,0xFFE0,0xFFE1,0xFF05, + 0xFF20,0x2103,0x2109,0xFE69,0xFE6A,0xFE6B,0x33D5,0x339C, + 0x339D,0x339E,0x33CE,0x33A1,0x338E,0x338F,0x33C4,0x00B0, + 0x5159,0x515B,0x515E,0x515D,0x5161,0x5163, + /* Range 0x2321 - 0x234E, array index: 0x0181 */ + 0x55E7,0x74E9,0x7CCE,0x2581,0x2582,0x2583,0x2584,0x2585, + 0x2586,0x2587,0x2588,0x258F,0x258E,0x258D,0x258C,0x258B, + 0x258A,0x2589,0x253C,0x2534,0x252C,0x2524,0x251C,0x2594, + 0x2500,0x2502,0x2595,0x250C,0x2510,0x2514,0x2518,0x256D, + 0x256E,0x2570,0x256F,0x2550,0x255E,0x256A,0x2561,0x25E2, + 0x25E3,0x25E5,0x25E4,0x2571,0x2572,0x2573, + /* Range 0x2421 - 0x247E, array index: 0x01AF */ + 0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, + 0xFF18,0xFF19,0x2160,0x2161,0x2162,0x2163,0x2164,0x2165, + 0x2166,0x2167,0x2168,0x2169,0x3021,0x3022,0x3023,0x3024, + 0x3025,0x3026,0x3027,0x3028,0x3029,INVALC,0x5344,INVALC, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, + 0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, + 0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, + 0xFF39,0xFF3A,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46, + 0xFF47,0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E, + 0xFF4F,0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56, + 0xFF57,0xFF58,0xFF59,0xFF5A,0x0391,0x0392,0x0393,0x0394, + 0x0395,0x0396,0x0397,0x0398,0x0399,0x039A, + /* Range 0x2521 - 0x2570, array index: 0x020D */ + 0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0,0x03A1,0x03A3, + 0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9,0x03B1,0x03B2, + 0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA, + 0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0,0x03C1,0x03C3, + 0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x3105,0x3106, + 0x3107,0x3108,0x3109,0x310A,0x310B,0x310C,0x310D,0x310E, + 0x310F,0x3110,0x3111,0x3112,0x3113,0x3114,0x3115,0x3116, + 0x3117,0x3118,0x3119,0x311A,0x311B,0x311C,0x311D,0x311E, + 0x311F,0x3120,0x3121,0x3122,0x3123,0x3124,0x3125,0x3126, + 0x3127,0x3128,0x3129,0x02D9,0x02C9,0x02CA,0x02C7,0x02CB, + /* Range 0x2621 - 0x263E, array index: 0x025D */ + 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, + 0x2468,0x2469,0x2474,0x2475,0x2476,0x2477,0x2478,0x2479, + 0x247A,0x247B,0x247C,0x247D,0x2170,0x2171,0x2172,0x2173, + 0x2174,0x2175,0x2176,0x2177,0x2178,0x2179, + /* Range 0x4221 - 0x4241, array index: 0x027B */ + 0x2400,0x2401,0x2402,0x2403,0x2404,0x2405,0x2406,0x2407, + 0x2408,0x2409,0x240A,0x240B,0x240C,0x240D,0x240E,0x240F, + 0x2410,0x2411,0x2412,0x2413,0x2414,0x2415,0x2416,0x2417, + 0x2418,0x2419,0x241A,0x241B,0x241C,0x241D,0x241E,0x241F, + 0x2421, + /* Range 0x4421 - 0x447E, array index: 0x029C */ + 0x4E00,0x4E59,0x4E01,0x4E03,0x4E43,0x4E5D,0x4E86,0x4E8C, + 0x4EBA,0x513F,0x5165,0x516B,0x51E0,0x5200,0x5201,0x529B, + 0x5315,0x5341,0x535C,0x53C8,0x4E09,0x4E0B,0x4E08,0x4E0A, + 0x4E2B,0x4E38,0x51E1,0x4E45,0x4E48,0x4E5F,0x4E5E,0x4E8E, + 0x4EA1,0x5140,0x5203,0x52FA,0x5343,0x53C9,0x53E3,0x571F, + 0x58EB,0x5915,0x5927,0x5973,0x5B50,0x5B51,0x5B53,0x5BF8, + 0x5C0F,0x5C22,0x5C38,0x5C71,0x5DDD,0x5DE5,0x5DF1,0x5DF2, + 0x5DF3,0x5DFE,0x5E72,0x5EFE,0x5F0B,0x5F13,0x624D,0x4E11, + 0x4E10,0x4E0D,0x4E2D,0x4E30,0x4E39,0x4E4B,0x5C39,0x4E88, + 0x4E91,0x4E95,0x4E92,0x4E94,0x4EA2,0x4EC1,0x4EC0,0x4EC3, + 0x4EC6,0x4EC7,0x4ECD,0x4ECA,0x4ECB,0x4EC4,0x5143,0x5141, + 0x5167,0x516D,0x516E,0x516C,0x5197,0x51F6, + /* Range 0x4521 - 0x457E, array index: 0x02FA */ + 0x5206,0x5207,0x5208,0x52FB,0x52FE,0x52FF,0x5316,0x5339, + 0x5348,0x5347,0x5345,0x535E,0x5384,0x53CB,0x53CA,0x53CD, + 0x58EC,0x5929,0x592B,0x592A,0x592D,0x5B54,0x5C11,0x5C24, + 0x5C3A,0x5C6F,0x5DF4,0x5E7B,0x5EFF,0x5F14,0x5F15,0x5FC3, + 0x6208,0x6236,0x624B,0x624E,0x652F,0x6587,0x6597,0x65A4, + 0x65B9,0x65E5,0x66F0,0x6708,0x6728,0x6B20,0x6B62,0x6B79, + 0x6BCB,0x6BD4,0x6BDB,0x6C0F,0x6C34,0x706B,0x722A,0x7236, + 0x723B,0x7247,0x7259,0x725B,0x72AC,0x738B,0x4E19,0x4E16, + 0x4E15,0x4E14,0x4E18,0x4E3B,0x4E4D,0x4E4F,0x4E4E,0x4EE5, + 0x4ED8,0x4ED4,0x4ED5,0x4ED6,0x4ED7,0x4EE3,0x4EE4,0x4ED9, + 0x4EDE,0x5145,0x5144,0x5189,0x518A,0x51AC,0x51F9,0x51FA, + 0x51F8,0x520A,0x52A0,0x529F,0x5305,0x5306, + /* Range 0x4621 - 0x467E, array index: 0x0358 */ + 0x5317,0x531D,0x4EDF,0x534A,0x5349,0x5361,0x5360,0x536F, + 0x536E,0x53BB,0x53EF,0x53E4,0x53F3,0x53EC,0x53EE,0x53E9, + 0x53E8,0x53FC,0x53F8,0x53F5,0x53EB,0x53E6,0x53EA,0x53F2, + 0x53F1,0x53F0,0x53E5,0x53ED,0x53FB,0x56DB,0x56DA,0x5916, + 0x592E,0x5931,0x5974,0x5976,0x5B55,0x5B83,0x5C3C,0x5DE8, + 0x5DE7,0x5DE6,0x5E02,0x5E03,0x5E73,0x5E7C,0x5F01,0x5F18, + 0x5F17,0x5FC5,0x620A,0x6253,0x6254,0x6252,0x6251,0x65A5, + 0x65E6,0x672E,0x672C,0x672A,0x672B,0x672D,0x6B63,0x6BCD, + 0x6C11,0x6C10,0x6C38,0x6C41,0x6C40,0x6C3E,0x72AF,0x7384, + 0x7389,0x74DC,0x74E6,0x7518,0x751F,0x7528,0x7529,0x7530, + 0x7531,0x7532,0x7533,0x758B,0x767D,0x76AE,0x76BF,0x76EE, + 0x77DB,0x77E2,0x77F3,0x793A,0x79BE,0x7A74, + /* Range 0x4721 - 0x477E, array index: 0x03B6 */ + 0x7ACB,0x4E1E,0x4E1F,0x4E52,0x4E53,0x4E69,0x4E99,0x4EA4, + 0x4EA6,0x4EA5,0x4EFF,0x4F09,0x4F19,0x4F0A,0x4F15,0x4F0D, + 0x4F10,0x4F11,0x4F0F,0x4EF2,0x4EF6,0x4EFB,0x4EF0,0x4EF3, + 0x4EFD,0x4F01,0x4F0B,0x5149,0x5147,0x5146,0x5148,0x5168, + 0x5171,0x518D,0x51B0,0x5217,0x5211,0x5212,0x520E,0x5216, + 0x52A3,0x5308,0x5321,0x5320,0x5370,0x5371,0x5409,0x540F, + 0x540C,0x540A,0x5410,0x5401,0x540B,0x5404,0x5411,0x540D, + 0x5408,0x5403,0x540E,0x5406,0x5412,0x56E0,0x56DE,0x56DD, + 0x5733,0x5730,0x5728,0x572D,0x572C,0x572F,0x5729,0x5919, + 0x591A,0x5937,0x5938,0x5984,0x5978,0x5983,0x597D,0x5979, + 0x5982,0x5981,0x5B57,0x5B58,0x5B87,0x5B88,0x5B85,0x5B89, + 0x5BFA,0x5C16,0x5C79,0x5DDE,0x5E06,0x5E76, + /* Range 0x4821 - 0x487E, array index: 0x0414 */ + 0x5E74,0x5F0F,0x5F1B,0x5FD9,0x5FD6,0x620E,0x620C,0x620D, + 0x6210,0x6263,0x625B,0x6258,0x6536,0x65E9,0x65E8,0x65EC, + 0x65ED,0x66F2,0x66F3,0x6709,0x673D,0x6734,0x6731,0x6735, + 0x6B21,0x6B64,0x6B7B,0x6C16,0x6C5D,0x6C57,0x6C59,0x6C5F, + 0x6C60,0x6C50,0x6C55,0x6C61,0x6C5B,0x6C4D,0x6C4E,0x7070, + 0x725F,0x725D,0x767E,0x7AF9,0x7C73,0x7CF8,0x7F36,0x7F8A, + 0x7FBD,0x8001,0x8003,0x800C,0x8012,0x8033,0x807F,0x8089, + 0x808B,0x808C,0x81E3,0x81EA,0x81F3,0x81FC,0x820C,0x821B, + 0x821F,0x826E,0x8272,0x827E,0x866B,0x8840,0x884C,0x8863, + 0x897F,0x9621,0x4E32,0x4EA8,0x4F4D,0x4F4F,0x4F47,0x4F57, + 0x4F5E,0x4F34,0x4F5B,0x4F55,0x4F30,0x4F50,0x4F51,0x4F3D, + 0x4F3A,0x4F38,0x4F43,0x4F54,0x4F3C,0x4F46, + /* Range 0x4921 - 0x497E, array index: 0x0472 */ + 0x4F63,0x4F5C,0x4F60,0x4F2F,0x4F4E,0x4F36,0x4F59,0x4F5D, + 0x4F48,0x4F5A,0x514C,0x514B,0x514D,0x5175,0x51B6,0x51B7, + 0x5225,0x5224,0x5229,0x522A,0x5228,0x52AB,0x52A9,0x52AA, + 0x52AC,0x5323,0x5373,0x5375,0x541D,0x542D,0x541E,0x543E, + 0x5426,0x544E,0x5427,0x5446,0x5443,0x5433,0x5448,0x5442, + 0x541B,0x5429,0x544A,0x5439,0x543B,0x5438,0x542E,0x5435, + 0x5436,0x5420,0x543C,0x5440,0x5431,0x542B,0x541F,0x542C, + 0x56EA,0x56F0,0x56E4,0x56EB,0x574A,0x5751,0x5740,0x574D, + 0x5747,0x574E,0x573E,0x5750,0x574F,0x573B,0x58EF,0x593E, + 0x599D,0x5992,0x59A8,0x599E,0x59A3,0x5999,0x5996,0x598D, + 0x59A4,0x5993,0x598A,0x59A5,0x5B5D,0x5B5C,0x5B5A,0x5B5B, + 0x5B8C,0x5B8B,0x5B8F,0x5C2C,0x5C40,0x5C41, + /* Range 0x4A21 - 0x4A7E, array index: 0x04D0 */ + 0x5C3F,0x5C3E,0x5C90,0x5C91,0x5C94,0x5C8C,0x5DEB,0x5E0C, + 0x5E8F,0x5E87,0x5E8A,0x5EF7,0x5F04,0x5F1F,0x5F64,0x5F62, + 0x5F77,0x5F79,0x5FD8,0x5FCC,0x5FD7,0x5FCD,0x5FF1,0x5FEB, + 0x5FF8,0x5FEA,0x6212,0x6211,0x6284,0x6297,0x6296,0x6280, + 0x6276,0x6289,0x626D,0x628A,0x627C,0x627E,0x6279,0x6273, + 0x6292,0x626F,0x6298,0x626E,0x6295,0x6293,0x6291,0x6286, + 0x6539,0x653B,0x6538,0x65F1,0x66F4,0x675F,0x674E,0x674F, + 0x6750,0x6751,0x675C,0x6756,0x675E,0x6749,0x6746,0x6760, + 0x6753,0x6757,0x6B65,0x6BCF,0x6C42,0x6C5E,0x6C99,0x6C81, + 0x6C88,0x6C89,0x6C85,0x6C9B,0x6C6A,0x6C7A,0x6C90,0x6C70, + 0x6C8C,0x6C68,0x6C96,0x6C92,0x6C7D,0x6C83,0x6C72,0x6C7E, + 0x6C74,0x6C86,0x6C76,0x6C8D,0x6C94,0x6C98, + /* Range 0x4B21 - 0x4B7E, array index: 0x052E */ + 0x6C82,0x7076,0x707C,0x707D,0x7078,0x7262,0x7261,0x7260, + 0x72C4,0x72C2,0x7396,0x752C,0x752B,0x7537,0x7538,0x7682, + 0x76EF,0x77E3,0x79C1,0x79C0,0x79BF,0x7A76,0x7CFB,0x7F55, + 0x8096,0x8093,0x809D,0x8098,0x809B,0x809A,0x80B2,0x826F, + 0x8292,0x828B,0x828D,0x898B,0x89D2,0x8A00,0x8C37,0x8C46, + 0x8C55,0x8C9D,0x8D64,0x8D70,0x8DB3,0x8EAB,0x8ECA,0x8F9B, + 0x8FB0,0x8FC2,0x8FC6,0x8FC5,0x8FC4,0x5DE1,0x9091,0x90A2, + 0x90AA,0x90A6,0x90A3,0x9149,0x91C6,0x91CC,0x9632,0x962E, + 0x9631,0x962A,0x962C,0x4E26,0x4E56,0x4E73,0x4E8B,0x4E9B, + 0x4E9E,0x4EAB,0x4EAC,0x4F6F,0x4F9D,0x4F8D,0x4F73,0x4F7F, + 0x4F6C,0x4F9B,0x4F8B,0x4F86,0x4F83,0x4F70,0x4F75,0x4F88, + 0x4F69,0x4F7B,0x4F96,0x4F7E,0x4F8F,0x4F91, + /* Range 0x4C21 - 0x4C7E, array index: 0x058C */ + 0x4F7A,0x5154,0x5152,0x5155,0x5169,0x5177,0x5176,0x5178, + 0x51BD,0x51FD,0x523B,0x5238,0x5237,0x523A,0x5230,0x522E, + 0x5236,0x5241,0x52BE,0x52BB,0x5352,0x5354,0x5353,0x5351, + 0x5366,0x5377,0x5378,0x5379,0x53D6,0x53D4,0x53D7,0x5473, + 0x5475,0x5496,0x5478,0x5495,0x5480,0x547B,0x5477,0x5484, + 0x5492,0x5486,0x547C,0x5490,0x5471,0x5476,0x548C,0x549A, + 0x5462,0x5468,0x548B,0x547D,0x548E,0x56FA,0x5783,0x5777, + 0x576A,0x5769,0x5761,0x5766,0x5764,0x577C,0x591C,0x5949, + 0x5947,0x5948,0x5944,0x5954,0x59BE,0x59BB,0x59D4,0x59B9, + 0x59AE,0x59D1,0x59C6,0x59D0,0x59CD,0x59CB,0x59D3,0x59CA, + 0x59AF,0x59B3,0x59D2,0x59C5,0x5B5F,0x5B64,0x5B63,0x5B97, + 0x5B9A,0x5B98,0x5B9C,0x5B99,0x5B9B,0x5C1A, + /* Range 0x4D21 - 0x4D7E, array index: 0x05EA */ + 0x5C48,0x5C45,0x5C46,0x5CB7,0x5CA1,0x5CB8,0x5CA9,0x5CAB, + 0x5CB1,0x5CB3,0x5E18,0x5E1A,0x5E16,0x5E15,0x5E1B,0x5E11, + 0x5E78,0x5E9A,0x5E97,0x5E9C,0x5E95,0x5E96,0x5EF6,0x5F26, + 0x5F27,0x5F29,0x5F80,0x5F81,0x5F7F,0x5F7C,0x5FDD,0x5FE0, + 0x5FFD,0x5FF5,0x5FFF,0x600F,0x6014,0x602F,0x6035,0x6016, + 0x602A,0x6015,0x6021,0x6027,0x6029,0x602B,0x601B,0x6216, + 0x6215,0x623F,0x623E,0x6240,0x627F,0x62C9,0x62CC,0x62C4, + 0x62BF,0x62C2,0x62B9,0x62D2,0x62DB,0x62AB,0x62D3,0x62D4, + 0x62CB,0x62C8,0x62A8,0x62BD,0x62BC,0x62D0,0x62D9,0x62C7, + 0x62CD,0x62B5,0x62DA,0x62B1,0x62D8,0x62D6,0x62D7,0x62C6, + 0x62AC,0x62CE,0x653E,0x65A7,0x65BC,0x65FA,0x6614,0x6613, + 0x660C,0x6606,0x6602,0x660E,0x6600,0x660F, + /* Range 0x4E21 - 0x4E7E, array index: 0x0648 */ + 0x6615,0x660A,0x6607,0x670D,0x670B,0x676D,0x678B,0x6795, + 0x6771,0x679C,0x6773,0x6777,0x6787,0x679D,0x6797,0x676F, + 0x6770,0x677F,0x6789,0x677E,0x6790,0x6775,0x679A,0x6793, + 0x677C,0x676A,0x6772,0x6B23,0x6B66,0x6B67,0x6B7F,0x6C13, + 0x6C1B,0x6CE3,0x6CE8,0x6CF3,0x6CB1,0x6CCC,0x6CE5,0x6CB3, + 0x6CBD,0x6CBE,0x6CBC,0x6CE2,0x6CAB,0x6CD5,0x6CD3,0x6CB8, + 0x6CC4,0x6CB9,0x6CC1,0x6CAE,0x6CD7,0x6CC5,0x6CF1,0x6CBF, + 0x6CBB,0x6CE1,0x6CDB,0x6CCA,0x6CAC,0x6CEF,0x6CDC,0x6CD6, + 0x6CE0,0x7095,0x708E,0x7092,0x708A,0x7099,0x722C,0x722D, + 0x7238,0x7248,0x7267,0x7269,0x72C0,0x72CE,0x72D9,0x72D7, + 0x72D0,0x73A9,0x73A8,0x739F,0x73AB,0x73A5,0x753D,0x759D, + 0x7599,0x759A,0x7684,0x76C2,0x76F2,0x76F4, + /* Range 0x4F21 - 0x4F7E, array index: 0x06A6 */ + 0x77E5,0x77FD,0x793E,0x7940,0x7941,0x79C9,0x79C8,0x7A7A, + 0x7A79,0x7AFA,0x7CFE,0x7F54,0x7F8C,0x7F8B,0x8005,0x80BA, + 0x80A5,0x80A2,0x80B1,0x80A1,0x80AB,0x80A9,0x80B4,0x80AA, + 0x80AF,0x81E5,0x81FE,0x820D,0x82B3,0x829D,0x8299,0x82AD, + 0x82BD,0x829F,0x82B9,0x82B1,0x82AC,0x82A5,0x82AF,0x82B8, + 0x82A3,0x82B0,0x82BE,0x82B7,0x864E,0x8671,0x521D,0x8868, + 0x8ECB,0x8FCE,0x8FD4,0x8FD1,0x90B5,0x90B8,0x90B1,0x90B6, + 0x91C7,0x91D1,0x9577,0x9580,0x961C,0x9640,0x963F,0x963B, + 0x9644,0x9642,0x96B9,0x96E8,0x9752,0x975E,0x4E9F,0x4EAD, + 0x4EAE,0x4FE1,0x4FB5,0x4FAF,0x4FBF,0x4FE0,0x4FD1,0x4FCF, + 0x4FDD,0x4FC3,0x4FB6,0x4FD8,0x4FDF,0x4FCA,0x4FD7,0x4FAE, + 0x4FD0,0x4FC4,0x4FC2,0x4FDA,0x4FCE,0x4FDE, + /* Range 0x5021 - 0x507E, array index: 0x0704 */ + 0x4FB7,0x5157,0x5192,0x5191,0x51A0,0x524E,0x5243,0x524A, + 0x524D,0x524C,0x524B,0x5247,0x52C7,0x52C9,0x52C3,0x52C1, + 0x530D,0x5357,0x537B,0x539A,0x53DB,0x54AC,0x54C0,0x54A8, + 0x54CE,0x54C9,0x54B8,0x54A6,0x54B3,0x54C7,0x54C2,0x54BD, + 0x54AA,0x54C1,0x54C4,0x54C8,0x54AF,0x54AB,0x54B1,0x54BB, + 0x54A9,0x54A7,0x54BF,0x56FF,0x5782,0x578B,0x57A0,0x57A3, + 0x57A2,0x57CE,0x57AE,0x5793,0x5955,0x5951,0x594F,0x594E, + 0x5950,0x59DC,0x59D8,0x59FF,0x59E3,0x59E8,0x5A03,0x59E5, + 0x59EA,0x59DA,0x59E6,0x5A01,0x59FB,0x5B69,0x5BA3,0x5BA6, + 0x5BA4,0x5BA2,0x5BA5,0x5C01,0x5C4E,0x5C4F,0x5C4D,0x5C4B, + 0x5CD9,0x5CD2,0x5DF7,0x5E1D,0x5E25,0x5E1F,0x5E7D,0x5EA0, + 0x5EA6,0x5EFA,0x5F08,0x5F2D,0x5F65,0x5F88, + /* Range 0x5121 - 0x517E, array index: 0x0762 */ + 0x5F85,0x5F8A,0x5F8B,0x5F87,0x5F8C,0x5F89,0x6012,0x601D, + 0x6020,0x6025,0x600E,0x6028,0x604D,0x6070,0x6068,0x6062, + 0x6046,0x6043,0x606C,0x606B,0x606A,0x6064,0x6241,0x62DC, + 0x6316,0x6309,0x62FC,0x62ED,0x6301,0x62EE,0x62FD,0x6307, + 0x62F1,0x62F7,0x62EF,0x62EC,0x62FE,0x62F4,0x6311,0x6302, + 0x653F,0x6545,0x65AB,0x65BD,0x65E2,0x6625,0x662D,0x6620, + 0x6627,0x662F,0x661F,0x6628,0x6631,0x6624,0x66F7,0x67FF, + 0x67D3,0x67F1,0x67D4,0x67D0,0x67EC,0x67B6,0x67AF,0x67F5, + 0x67E9,0x67EF,0x67C4,0x67D1,0x67B4,0x67DA,0x67E5,0x67B8, + 0x67CF,0x67DE,0x67F3,0x67B0,0x67D9,0x67E2,0x67DD,0x67D2, + 0x6B6A,0x6B83,0x6B86,0x6BB5,0x6BD2,0x6BD7,0x6C1F,0x6CC9, + 0x6D0B,0x6D32,0x6D2A,0x6D41,0x6D25,0x6D0C, + /* Range 0x5221 - 0x527E, array index: 0x07C0 */ + 0x6D31,0x6D1E,0x6D17,0x6D3B,0x6D3D,0x6D3E,0x6D36,0x6D1B, + 0x6CF5,0x6D39,0x6D27,0x6D38,0x6D29,0x6D2E,0x6D35,0x6D0E, + 0x6D2B,0x70AB,0x70BA,0x70B3,0x70AC,0x70AF,0x70AD,0x70B8, + 0x70AE,0x70A4,0x7230,0x7272,0x726F,0x7274,0x72E9,0x72E0, + 0x72E1,0x73B7,0x73CA,0x73BB,0x73B2,0x73CD,0x73C0,0x73B3, + 0x751A,0x752D,0x754F,0x754C,0x754E,0x754B,0x75AB,0x75A4, + 0x75A5,0x75A2,0x75A3,0x7678,0x7686,0x7687,0x7688,0x76C8, + 0x76C6,0x76C3,0x76C5,0x7701,0x76F9,0x76F8,0x7709,0x770B, + 0x76FE,0x76FC,0x7707,0x77DC,0x7802,0x7814,0x780C,0x780D, + 0x7946,0x7949,0x7948,0x7947,0x79B9,0x79BA,0x79D1,0x79D2, + 0x79CB,0x7A7F,0x7A81,0x7AFF,0x7AFD,0x7C7D,0x7D02,0x7D05, + 0x7D00,0x7D09,0x7D07,0x7D04,0x7D06,0x7F38, + /* Range 0x5321 - 0x537E, array index: 0x081E */ + 0x7F8E,0x7FBF,0x8010,0x800D,0x8011,0x8036,0x80D6,0x80E5, + 0x80DA,0x80C3,0x80C4,0x80CC,0x80E1,0x80DB,0x80CE,0x80DE, + 0x80E4,0x80DD,0x81F4,0x8222,0x82E7,0x8303,0x8305,0x82E3, + 0x82DB,0x82E6,0x8304,0x82E5,0x8302,0x8309,0x82D2,0x82D7, + 0x82F1,0x8301,0x82DC,0x82D4,0x82D1,0x82DE,0x82D3,0x82DF, + 0x82EF,0x8306,0x8650,0x8679,0x867B,0x867A,0x884D,0x886B, + 0x8981,0x89D4,0x8A08,0x8A02,0x8A03,0x8C9E,0x8CA0,0x8D74, + 0x8D73,0x8DB4,0x8ECD,0x8ECC,0x8FF0,0x8FE6,0x8FE2,0x8FEA, + 0x8FE5,0x8FED,0x8FEB,0x8FE4,0x8FE8,0x90CA,0x90CE,0x90C1, + 0x90C3,0x914B,0x914A,0x91CD,0x9582,0x9650,0x964B,0x964C, + 0x964D,0x9762,0x9769,0x97CB,0x97ED,0x97F3,0x9801,0x98A8, + 0x98DB,0x98DF,0x9996,0x9999,0x4E58,0x4EB3, + /* Range 0x5421 - 0x547E, array index: 0x087C */ + 0x500C,0x500D,0x5023,0x4FEF,0x5026,0x5025,0x4FF8,0x5029, + 0x5016,0x5006,0x503C,0x501F,0x501A,0x5012,0x5011,0x4FFA, + 0x5000,0x5014,0x5028,0x4FF1,0x5021,0x500B,0x5019,0x5018, + 0x4FF3,0x4FEE,0x502D,0x502A,0x4FFE,0x502B,0x5009,0x517C, + 0x51A4,0x51A5,0x51A2,0x51CD,0x51CC,0x51C6,0x51CB,0x5256, + 0x525C,0x5254,0x525B,0x525D,0x532A,0x537F,0x539F,0x539D, + 0x53DF,0x54E8,0x5510,0x5501,0x5537,0x54FC,0x54E5,0x54F2, + 0x5506,0x54FA,0x5514,0x54E9,0x54ED,0x54E1,0x5509,0x54EE, + 0x54EA,0x54E6,0x5527,0x5507,0x54FD,0x550F,0x5703,0x5704, + 0x57C2,0x57D4,0x57CB,0x57C3,0x5809,0x590F,0x5957,0x5958, + 0x595A,0x5A11,0x5A18,0x5A1C,0x5A1F,0x5A1B,0x5A13,0x59EC, + 0x5A20,0x5A23,0x5A29,0x5A25,0x5A0C,0x5A09, + /* Range 0x5521 - 0x557E, array index: 0x08DA */ + 0x5B6B,0x5C58,0x5BB0,0x5BB3,0x5BB6,0x5BB4,0x5BAE,0x5BB5, + 0x5BB9,0x5BB8,0x5C04,0x5C51,0x5C55,0x5C50,0x5CED,0x5CFD, + 0x5CFB,0x5CEA,0x5CE8,0x5CF0,0x5CF6,0x5D01,0x5CF4,0x5DEE, + 0x5E2D,0x5E2B,0x5EAB,0x5EAD,0x5EA7,0x5F31,0x5F92,0x5F91, + 0x5F90,0x6059,0x6063,0x6065,0x6050,0x6055,0x606D,0x6069, + 0x606F,0x6084,0x609F,0x609A,0x608D,0x6094,0x608C,0x6085, + 0x6096,0x6247,0x62F3,0x6308,0x62FF,0x634E,0x633E,0x632F, + 0x6355,0x6342,0x6346,0x634F,0x6349,0x633A,0x6350,0x633D, + 0x632A,0x632B,0x6328,0x634D,0x634C,0x6548,0x6549,0x6599, + 0x65C1,0x65C5,0x6642,0x6649,0x664F,0x6643,0x6652,0x664C, + 0x6645,0x6641,0x66F8,0x6714,0x6715,0x6717,0x6821,0x6838, + 0x6848,0x6846,0x6853,0x6839,0x6842,0x6854, + /* Range 0x5621 - 0x567E, array index: 0x0938 */ + 0x6829,0x68B3,0x6817,0x684C,0x6851,0x683D,0x67F4,0x6850, + 0x6840,0x683C,0x6843,0x682A,0x6845,0x6813,0x6818,0x6841, + 0x6B8A,0x6B89,0x6BB7,0x6C23,0x6C27,0x6C28,0x6C26,0x6C24, + 0x6CF0,0x6D6A,0x6D95,0x6D88,0x6D87,0x6D66,0x6D78,0x6D77, + 0x6D59,0x6D93,0x6D6C,0x6D89,0x6D6E,0x6D5A,0x6D74,0x6D69, + 0x6D8C,0x6D8A,0x6D79,0x6D85,0x6D65,0x6D94,0x70CA,0x70D8, + 0x70E4,0x70D9,0x70C8,0x70CF,0x7239,0x7279,0x72FC,0x72F9, + 0x72FD,0x72F8,0x72F7,0x7386,0x73ED,0x7409,0x73EE,0x73E0, + 0x73EA,0x73DE,0x7554,0x755D,0x755C,0x755A,0x7559,0x75BE, + 0x75C5,0x75C7,0x75B2,0x75B3,0x75BD,0x75BC,0x75B9,0x75C2, + 0x75B8,0x768B,0x76B0,0x76CA,0x76CD,0x76CE,0x7729,0x771F, + 0x7720,0x7728,0x77E9,0x7830,0x7827,0x7838, + /* Range 0x5721 - 0x577E, array index: 0x0996 */ + 0x781D,0x7834,0x7837,0x7825,0x782D,0x7820,0x781F,0x7832, + 0x7955,0x7950,0x7960,0x795F,0x7956,0x795E,0x795D,0x7957, + 0x795A,0x79E4,0x79E3,0x79E7,0x79DF,0x79E6,0x79E9,0x79D8, + 0x7A84,0x7A88,0x7AD9,0x7B06,0x7B11,0x7C89,0x7D21,0x7D17, + 0x7D0B,0x7D0A,0x7D20,0x7D22,0x7D14,0x7D10,0x7D15,0x7D1A, + 0x7D1C,0x7D0D,0x7D19,0x7D1B,0x7F3A,0x7F5F,0x7F94,0x7FC5, + 0x7FC1,0x8006,0x8004,0x8018,0x8015,0x8019,0x8017,0x803D, + 0x803F,0x80F1,0x8102,0x80F0,0x8105,0x80ED,0x80F4,0x8106, + 0x80F8,0x80F3,0x8108,0x80FD,0x810A,0x80FC,0x80EF,0x81ED, + 0x81EC,0x8200,0x8210,0x822A,0x822B,0x8228,0x822C,0x82BB, + 0x832B,0x8352,0x8354,0x834A,0x8338,0x8350,0x8349,0x8335, + 0x8334,0x834F,0x8332,0x8339,0x8336,0x8317, + /* Range 0x5821 - 0x587E, array index: 0x09F4 */ + 0x8340,0x8331,0x8328,0x8343,0x8654,0x868A,0x86AA,0x8693, + 0x86A4,0x86A9,0x868C,0x86A3,0x869C,0x8870,0x8877,0x8881, + 0x8882,0x887D,0x8879,0x8A18,0x8A10,0x8A0E,0x8A0C,0x8A15, + 0x8A0A,0x8A17,0x8A13,0x8A16,0x8A0F,0x8A11,0x8C48,0x8C7A, + 0x8C79,0x8CA1,0x8CA2,0x8D77,0x8EAC,0x8ED2,0x8ED4,0x8ECF, + 0x8FB1,0x9001,0x9006,0x8FF7,0x9000,0x8FFA,0x8FF4,0x9003, + 0x8FFD,0x9005,0x8FF8,0x9095,0x90E1,0x90DD,0x90E2,0x9152, + 0x914D,0x914C,0x91D8,0x91DD,0x91D7,0x91DC,0x91D9,0x9583, + 0x9662,0x9663,0x9661,0x965B,0x965D,0x9664,0x9658,0x965E, + 0x96BB,0x98E2,0x99AC,0x9AA8,0x9AD8,0x9B25,0x9B32,0x9B3C, + 0x4E7E,0x507A,0x507D,0x505C,0x5047,0x5043,0x504C,0x505A, + 0x5049,0x5065,0x5076,0x504E,0x5055,0x5075, + /* Range 0x5921 - 0x597E, array index: 0x0A52 */ + 0x5074,0x5077,0x504F,0x500F,0x506F,0x506D,0x515C,0x5195, + 0x51F0,0x526A,0x526F,0x52D2,0x52D9,0x52D8,0x52D5,0x5310, + 0x530F,0x5319,0x533F,0x5340,0x533E,0x53C3,0x66FC,0x5546, + 0x556A,0x5566,0x5544,0x555E,0x5561,0x5543,0x554A,0x5531, + 0x5556,0x554F,0x5555,0x552F,0x5564,0x5538,0x552E,0x555C, + 0x552C,0x5563,0x5533,0x5541,0x5557,0x5708,0x570B,0x5709, + 0x57DF,0x5805,0x580A,0x5806,0x57E0,0x57E4,0x57FA,0x5802, + 0x5835,0x57F7,0x57F9,0x5920,0x5962,0x5A36,0x5A41,0x5A49, + 0x5A66,0x5A6A,0x5A40,0x5A3C,0x5A62,0x5A5A,0x5A46,0x5A4A, + 0x5B70,0x5BC7,0x5BC5,0x5BC4,0x5BC2,0x5BBF,0x5BC6,0x5C09, + 0x5C08,0x5C07,0x5C60,0x5C5C,0x5C5D,0x5D07,0x5D06,0x5D0E, + 0x5D1B,0x5D16,0x5D22,0x5D11,0x5D29,0x5D14, + /* Range 0x5A21 - 0x5A7E, array index: 0x0AB0 */ + 0x5D19,0x5D24,0x5D27,0x5D17,0x5DE2,0x5E38,0x5E36,0x5E33, + 0x5E37,0x5EB7,0x5EB8,0x5EB6,0x5EB5,0x5EBE,0x5F35,0x5F37, + 0x5F57,0x5F6C,0x5F69,0x5F6B,0x5F97,0x5F99,0x5F9E,0x5F98, + 0x5FA1,0x5FA0,0x5F9C,0x607F,0x60A3,0x6089,0x60A0,0x60A8, + 0x60CB,0x60B4,0x60E6,0x60BD,0x60C5,0x60BB,0x60B5,0x60DC, + 0x60BC,0x60D8,0x60D5,0x60C6,0x60DF,0x60B8,0x60DA,0x60C7, + 0x621A,0x621B,0x6248,0x63A0,0x63A7,0x6372,0x6396,0x63A2, + 0x63A5,0x6377,0x6367,0x6398,0x63AA,0x6371,0x63A9,0x6389, + 0x6383,0x639B,0x636B,0x63A8,0x6384,0x6388,0x6399,0x63A1, + 0x63AC,0x6392,0x638F,0x6380,0x637B,0x6369,0x6368,0x637A, + 0x655D,0x6556,0x6551,0x6559,0x6557,0x555F,0x654F,0x6558, + 0x6555,0x6554,0x659C,0x659B,0x65AC,0x65CF, + /* Range 0x5B21 - 0x5B7E, array index: 0x0B0E */ + 0x65CB,0x65CC,0x65CE,0x665D,0x665A,0x6664,0x6668,0x6666, + 0x665E,0x66F9,0x52D7,0x671B,0x6881,0x68AF,0x68A2,0x6893, + 0x68B5,0x687F,0x6876,0x68B1,0x68A7,0x6897,0x68B0,0x6883, + 0x68C4,0x68AD,0x6886,0x6885,0x6894,0x689D,0x68A8,0x689F, + 0x68A1,0x6882,0x6B32,0x6BBA,0x6BEB,0x6BEC,0x6C2B,0x6D8E, + 0x6DBC,0x6DF3,0x6DD9,0x6DB2,0x6DE1,0x6DCC,0x6DE4,0x6DFB, + 0x6DFA,0x6E05,0x6DC7,0x6DCB,0x6DAF,0x6DD1,0x6DAE,0x6DDE, + 0x6DF9,0x6DB8,0x6DF7,0x6DF5,0x6DC5,0x6DD2,0x6E1A,0x6DB5, + 0x6DDA,0x6DEB,0x6DD8,0x6DEA,0x6DF1,0x6DEE,0x6DE8,0x6DC6, + 0x6DC4,0x6DAA,0x6DEC,0x6DBF,0x6DE6,0x70F9,0x7109,0x710A, + 0x70FD,0x70EF,0x723D,0x727D,0x7281,0x731C,0x731B,0x7316, + 0x7313,0x7319,0x7387,0x7405,0x740A,0x7403, + /* Range 0x5C21 - 0x5C7E, array index: 0x0B6C */ + 0x7406,0x73FE,0x740D,0x74E0,0x74F6,0x74F7,0x751C,0x7522, + 0x7565,0x7566,0x7562,0x7570,0x758F,0x75D4,0x75D5,0x75B5, + 0x75CA,0x75CD,0x768E,0x76D4,0x76D2,0x76DB,0x7737,0x773E, + 0x773C,0x7736,0x7738,0x773A,0x786B,0x7843,0x784E,0x7965, + 0x7968,0x796D,0x79FB,0x7A92,0x7A95,0x7B20,0x7B28,0x7B1B, + 0x7B2C,0x7B26,0x7B19,0x7B1E,0x7B2E,0x7C92,0x7C97,0x7C95, + 0x7D46,0x7D43,0x7D71,0x7D2E,0x7D39,0x7D3C,0x7D40,0x7D30, + 0x7D33,0x7D44,0x7D2F,0x7D42,0x7D32,0x7D31,0x7F3D,0x7F9E, + 0x7F9A,0x7FCC,0x7FCE,0x7FD2,0x801C,0x804A,0x8046,0x812F, + 0x8116,0x8123,0x812B,0x8129,0x8130,0x8124,0x8202,0x8235, + 0x8237,0x8236,0x8239,0x838E,0x839E,0x8398,0x8378,0x83A2, + 0x8396,0x83BD,0x83AB,0x8392,0x838A,0x8393, + /* Range 0x5D21 - 0x5D7E, array index: 0x0BCA */ + 0x8389,0x83A0,0x8377,0x837B,0x837C,0x8386,0x83A7,0x8655, + 0x5F6A,0x86C7,0x86C0,0x86B6,0x86C4,0x86B5,0x86C6,0x86CB, + 0x86B1,0x86AF,0x86C9,0x8853,0x889E,0x8888,0x88AB,0x8892, + 0x8896,0x888D,0x888B,0x8993,0x898F,0x8A2A,0x8A1D,0x8A23, + 0x8A25,0x8A31,0x8A2D,0x8A1F,0x8A1B,0x8A22,0x8C49,0x8C5A, + 0x8CA9,0x8CAC,0x8CAB,0x8CA8,0x8CAA,0x8CA7,0x8D67,0x8D66, + 0x8DBE,0x8DBA,0x8EDB,0x8EDF,0x9019,0x900D,0x901A,0x9017, + 0x9023,0x901F,0x901D,0x9010,0x9015,0x901E,0x9020,0x900F, + 0x9022,0x9016,0x901B,0x9014,0x90E8,0x90ED,0x90FD,0x9157, + 0x91CE,0x91F5,0x91E6,0x91E3,0x91E7,0x91ED,0x91E9,0x9589, + 0x966A,0x9675,0x9673,0x9678,0x9670,0x9674,0x9676,0x9677, + 0x966C,0x96C0,0x96EA,0x96E9,0x7AE0,0x7ADF, + /* Range 0x5E21 - 0x5E7E, array index: 0x0C28 */ + 0x9802,0x9803,0x9B5A,0x9CE5,0x9E75,0x9E7F,0x9EA5,0x9EBB, + 0x50A2,0x508D,0x5085,0x5099,0x5091,0x5080,0x5096,0x5098, + 0x509A,0x6700,0x51F1,0x5272,0x5274,0x5275,0x5269,0x52DE, + 0x52DD,0x52DB,0x535A,0x53A5,0x557B,0x5580,0x55A7,0x557C, + 0x558A,0x559D,0x5598,0x5582,0x559C,0x55AA,0x5594,0x5587, + 0x558B,0x5583,0x55B3,0x55AE,0x559F,0x553E,0x55B2,0x559A, + 0x55BB,0x55AC,0x55B1,0x557E,0x5589,0x55AB,0x5599,0x570D, + 0x582F,0x582A,0x5834,0x5824,0x5830,0x5831,0x5821,0x581D, + 0x5820,0x58F9,0x58FA,0x5960,0x5A77,0x5A9A,0x5A7F,0x5A92, + 0x5A9B,0x5AA7,0x5B73,0x5B71,0x5BD2,0x5BCC,0x5BD3,0x5BD0, + 0x5C0A,0x5C0B,0x5C31,0x5D4C,0x5D50,0x5D34,0x5D47,0x5DFD, + 0x5E45,0x5E3D,0x5E40,0x5E43,0x5E7E,0x5ECA, + /* Range 0x5F21 - 0x5F7E, array index: 0x0C86 */ + 0x5EC1,0x5EC2,0x5EC4,0x5F3C,0x5F6D,0x5FA9,0x5FAA,0x5FA8, + 0x60D1,0x60E1,0x60B2,0x60B6,0x60E0,0x611C,0x6123,0x60FA, + 0x6115,0x60F0,0x60FB,0x60F4,0x6168,0x60F1,0x610E,0x60F6, + 0x6109,0x6100,0x6112,0x621F,0x6249,0x63A3,0x638C,0x63CF, + 0x63C0,0x63E9,0x63C9,0x63C6,0x63CD,0x63D2,0x63E3,0x63D0, + 0x63E1,0x63D6,0x63ED,0x63EE,0x6376,0x63F4,0x63EA,0x63DB, + 0x6452,0x63DA,0x63F9,0x655E,0x6566,0x6562,0x6563,0x6591, + 0x6590,0x65AF,0x666E,0x6670,0x6674,0x6676,0x666F,0x6691, + 0x667A,0x667E,0x6677,0x66FE,0x66FF,0x671F,0x671D,0x68FA, + 0x68D5,0x68E0,0x68D8,0x68D7,0x6905,0x68DF,0x68F5,0x68EE, + 0x68E7,0x68F9,0x68D2,0x68F2,0x68E3,0x68CB,0x68CD,0x690D, + 0x6912,0x690E,0x68C9,0x68DA,0x696E,0x68FB, + /* Range 0x6021 - 0x607E, array index: 0x0CE4 */ + 0x6B3E,0x6B3A,0x6B3D,0x6B98,0x6B96,0x6BBC,0x6BEF,0x6C2E, + 0x6C2F,0x6C2C,0x6E2F,0x6E38,0x6E54,0x6E21,0x6E32,0x6E67, + 0x6E4A,0x6E20,0x6E25,0x6E23,0x6E1B,0x6E5B,0x6E58,0x6E24, + 0x6E56,0x6E6E,0x6E2D,0x6E26,0x6E6F,0x6E34,0x6E4D,0x6E3A, + 0x6E2C,0x6E43,0x6E1D,0x6E3E,0x6ECB,0x6E89,0x6E19,0x6E4E, + 0x6E63,0x6E44,0x6E72,0x6E69,0x6E5F,0x7119,0x711A,0x7126, + 0x7130,0x7121,0x7136,0x716E,0x711C,0x724C,0x7284,0x7280, + 0x7336,0x7325,0x7334,0x7329,0x743A,0x742A,0x7433,0x7422, + 0x7425,0x7435,0x7436,0x7434,0x742F,0x741B,0x7426,0x7428, + 0x7525,0x7526,0x756B,0x756A,0x75E2,0x75DB,0x75E3,0x75D9, + 0x75D8,0x75DE,0x75E0,0x767B,0x767C,0x7696,0x7693,0x76B4, + 0x76DC,0x774F,0x77ED,0x785D,0x786C,0x786F, + /* Range 0x6121 - 0x617E, array index: 0x0D42 */ + 0x7A0D,0x7A08,0x7A0B,0x7A05,0x7A00,0x7A98,0x7A97,0x7A96, + 0x7AE5,0x7AE3,0x7B49,0x7B56,0x7B46,0x7B50,0x7B52,0x7B54, + 0x7B4D,0x7B4B,0x7B4F,0x7B51,0x7C9F,0x7CA5,0x7D5E,0x7D50, + 0x7D68,0x7D55,0x7D2B,0x7D6E,0x7D72,0x7D61,0x7D66,0x7D62, + 0x7D70,0x7D73,0x5584,0x7FD4,0x7FD5,0x800B,0x8052,0x8085, + 0x8155,0x8154,0x814B,0x8151,0x814E,0x8139,0x8146,0x813E, + 0x814C,0x8153,0x8174,0x8212,0x821C,0x83E9,0x8403,0x83F8, + 0x840D,0x83E0,0x83C5,0x840B,0x83C1,0x83EF,0x83F1,0x83F4, + 0x8457,0x840A,0x83F0,0x840C,0x83CC,0x83FD,0x83F2,0x83CA, + 0x8438,0x840E,0x8404,0x83DC,0x8407,0x83D4,0x83DF,0x865B, + 0x86DF,0x86D9,0x86ED,0x86D4,0x86DB,0x86E4,0x86D0,0x86DE, + 0x8857,0x88C1,0x88C2,0x88B1,0x8983,0x8996, + /* Range 0x6221 - 0x627E, array index: 0x0DA0 */ + 0x8A3B,0x8A60,0x8A55,0x8A5E,0x8A3C,0x8A41,0x8A54,0x8A5B, + 0x8A50,0x8A46,0x8A34,0x8A3A,0x8A36,0x8A56,0x8C61,0x8C82, + 0x8CAF,0x8CBC,0x8CB3,0x8CBD,0x8CC1,0x8CBB,0x8CC0,0x8CB4, + 0x8CB7,0x8CB6,0x8CBF,0x8CB8,0x8D8A,0x8D85,0x8D81,0x8DCE, + 0x8DDD,0x8DCB,0x8DDA,0x8DD1,0x8DCC,0x8DDB,0x8DC6,0x8EFB, + 0x8EF8,0x8EFC,0x8F9C,0x902E,0x9035,0x9031,0x9038,0x9032, + 0x9036,0x9102,0x90F5,0x9109,0x90FE,0x9163,0x9165,0x91CF, + 0x9214,0x9215,0x9223,0x9209,0x921E,0x920D,0x9210,0x9207, + 0x9211,0x9594,0x958F,0x958B,0x9591,0x9593,0x9592,0x958E, + 0x968A,0x968E,0x968B,0x967D,0x9685,0x9686,0x968D,0x9672, + 0x9684,0x96C1,0x96C5,0x96C4,0x96C6,0x96C7,0x96EF,0x96F2, + 0x97CC,0x9805,0x9806,0x9808,0x98E7,0x98EA, + /* Range 0x6321 - 0x637E, array index: 0x0DFE */ + 0x98EF,0x98E9,0x98F2,0x98ED,0x99AE,0x99AD,0x9EC3,0x9ECD, + 0x9ED1,0x4E82,0x50AD,0x50B5,0x50B2,0x50B3,0x50C5,0x50BE, + 0x50AC,0x50B7,0x50BB,0x50AF,0x50C7,0x527F,0x5277,0x527D, + 0x52DF,0x52E6,0x52E4,0x52E2,0x52E3,0x532F,0x55DF,0x55E8, + 0x55D3,0x55E6,0x55CE,0x55DC,0x55C7,0x55D1,0x55E3,0x55E4, + 0x55EF,0x55DA,0x55E1,0x55C5,0x55C6,0x55E5,0x55C9,0x5712, + 0x5713,0x585E,0x5851,0x5858,0x5857,0x585A,0x5854,0x586B, + 0x584C,0x586D,0x584A,0x5862,0x5852,0x584B,0x5967,0x5AC1, + 0x5AC9,0x5ACC,0x5ABE,0x5ABD,0x5ABC,0x5AB3,0x5AC2,0x5AB2, + 0x5D69,0x5D6F,0x5E4C,0x5E79,0x5EC9,0x5EC8,0x5F12,0x5F59, + 0x5FAC,0x5FAE,0x611A,0x610F,0x6148,0x611F,0x60F3,0x611B, + 0x60F9,0x6101,0x6108,0x614E,0x614C,0x6144, + /* Range 0x6421 - 0x647E, array index: 0x0E5C */ + 0x614D,0x613E,0x6134,0x6127,0x610D,0x6106,0x6137,0x6221, + 0x6222,0x6413,0x643E,0x641E,0x642A,0x642D,0x643D,0x642C, + 0x640F,0x641C,0x6414,0x640D,0x6436,0x6416,0x6417,0x6406, + 0x656C,0x659F,0x65B0,0x6697,0x6689,0x6687,0x6688,0x6696, + 0x6684,0x6698,0x668D,0x6703,0x6994,0x696D,0x695A,0x6977, + 0x6960,0x6954,0x6975,0x6930,0x6982,0x694A,0x6968,0x696B, + 0x695E,0x6953,0x6979,0x6986,0x695D,0x6963,0x695B,0x6B47, + 0x6B72,0x6BC0,0x6BBF,0x6BD3,0x6BFD,0x6EA2,0x6EAF,0x6ED3, + 0x6EB6,0x6EC2,0x6E90,0x6E9D,0x6EC7,0x6EC5,0x6EA5,0x6E98, + 0x6EBC,0x6EBA,0x6EAB,0x6ED1,0x6E96,0x6E9C,0x6EC4,0x6ED4, + 0x6EAA,0x6EA7,0x6EB4,0x714E,0x7159,0x7169,0x7164,0x7149, + 0x7167,0x715C,0x716C,0x7166,0x714C,0x7165, + /* Range 0x6521 - 0x657E, array index: 0x0EBA */ + 0x715E,0x7146,0x7168,0x7156,0x723A,0x7252,0x7337,0x7345, + 0x733F,0x733E,0x746F,0x745A,0x7455,0x745F,0x745E,0x7441, + 0x743F,0x7459,0x745B,0x745C,0x7576,0x7578,0x7600,0x75F0, + 0x7601,0x75F2,0x75F1,0x75FA,0x75FF,0x75F4,0x75F3,0x76DE, + 0x76DF,0x775B,0x776B,0x7766,0x775E,0x7763,0x7779,0x776A, + 0x776C,0x775C,0x7765,0x7768,0x7762,0x77EE,0x788E,0x78B0, + 0x7897,0x7898,0x788C,0x7889,0x787C,0x7891,0x7893,0x787F, + 0x797A,0x797F,0x7981,0x842C,0x79BD,0x7A1C,0x7A1A,0x7A20, + 0x7A14,0x7A1F,0x7A1E,0x7A9F,0x7AA0,0x7B77,0x7BC0,0x7B60, + 0x7B6E,0x7B67,0x7CB1,0x7CB3,0x7CB5,0x7D93,0x7D79,0x7D91, + 0x7D81,0x7D8F,0x7D5B,0x7F6E,0x7F69,0x7F6A,0x7F72,0x7FA9, + 0x7FA8,0x7FA4,0x8056,0x8058,0x8086,0x8084, + /* Range 0x6621 - 0x667E, array index: 0x0F18 */ + 0x8171,0x8170,0x8178,0x8165,0x816E,0x8173,0x816B,0x8179, + 0x817A,0x8166,0x8205,0x8247,0x8482,0x8477,0x843D,0x8431, + 0x8475,0x8466,0x846B,0x8449,0x846C,0x845B,0x843C,0x8435, + 0x8461,0x8463,0x8469,0x846D,0x8446,0x865E,0x865C,0x865F, + 0x86F9,0x8713,0x8708,0x8707,0x8700,0x86FE,0x86FB,0x8702, + 0x8703,0x8706,0x870A,0x8859,0x88DF,0x88D4,0x88D9,0x88DC, + 0x88D8,0x88DD,0x88E1,0x88CA,0x88D5,0x88D2,0x899C,0x89E3, + 0x8A6B,0x8A72,0x8A73,0x8A66,0x8A69,0x8A70,0x8A87,0x8A7C, + 0x8A63,0x8AA0,0x8A71,0x8A85,0x8A6D,0x8A62,0x8A6E,0x8A6C, + 0x8A79,0x8A7B,0x8A3E,0x8A68,0x8C62,0x8C8A,0x8C89,0x8CCA, + 0x8CC7,0x8CC8,0x8CC4,0x8CB2,0x8CC3,0x8CC2,0x8CC5,0x8DE1, + 0x8DDF,0x8DE8,0x8DEF,0x8DF3,0x8DFA,0x8DEA, + /* Range 0x6721 - 0x677E, array index: 0x0F76 */ + 0x8DE4,0x8DE6,0x8EB2,0x8F03,0x8F09,0x8EFE,0x8F0A,0x8F9F, + 0x8FB2,0x904B,0x904A,0x9053,0x9042,0x9054,0x903C,0x9055, + 0x9050,0x9047,0x904F,0x904E,0x904D,0x9051,0x903E,0x9041, + 0x9112,0x9117,0x916C,0x916A,0x9169,0x91C9,0x9237,0x9257, + 0x9238,0x923D,0x9240,0x923E,0x925B,0x924B,0x9264,0x9251, + 0x9234,0x9249,0x924D,0x9245,0x9239,0x923F,0x925A,0x9598, + 0x9698,0x9694,0x9695,0x96CD,0x96CB,0x96C9,0x96CA,0x96F7, + 0x96FB,0x96F9,0x96F6,0x9756,0x9774,0x9776,0x9810,0x9811, + 0x9813,0x980A,0x9812,0x980C,0x98FC,0x98F4,0x98FD,0x98FE, + 0x99B3,0x99B1,0x99B4,0x9AE1,0x9CE9,0x9E82,0x9F0E,0x9F13, + 0x9F20,0x50E7,0x50EE,0x50E5,0x50D6,0x50ED,0x50DA,0x50D5, + 0x50CF,0x50D1,0x50F1,0x50CE,0x50E9,0x5162, + /* Range 0x6821 - 0x687E, array index: 0x0FD4 */ + 0x51F3,0x5283,0x5282,0x5331,0x53AD,0x55FE,0x5600,0x561B, + 0x5617,0x55FD,0x5614,0x5606,0x5609,0x560D,0x560E,0x55F7, + 0x5616,0x561F,0x5608,0x5610,0x55F6,0x5718,0x5716,0x5875, + 0x587E,0x5883,0x5893,0x588A,0x5879,0x5885,0x587D,0x58FD, + 0x5925,0x5922,0x5924,0x596A,0x5969,0x5AE1,0x5AE6,0x5AE9, + 0x5AD7,0x5AD6,0x5AD8,0x5AE3,0x5B75,0x5BDE,0x5BE7,0x5BE1, + 0x5BE5,0x5BE6,0x5BE8,0x5BE2,0x5BE4,0x5BDF,0x5C0D,0x5C62, + 0x5D84,0x5D87,0x5E5B,0x5E63,0x5E55,0x5E57,0x5E54,0x5ED3, + 0x5ED6,0x5F0A,0x5F46,0x5F70,0x5FB9,0x6147,0x613F,0x614B, + 0x6177,0x6162,0x6163,0x615F,0x615A,0x6158,0x6175,0x622A, + 0x6487,0x6458,0x6454,0x64A4,0x6478,0x645F,0x647A,0x6451, + 0x6467,0x6434,0x646D,0x647B,0x6572,0x65A1, + /* Range 0x6921 - 0x697E, array index: 0x1032 */ + 0x65D7,0x65D6,0x66A2,0x66A8,0x669D,0x699C,0x69A8,0x6995, + 0x69C1,0x69AE,0x69D3,0x69CB,0x699B,0x69B7,0x69BB,0x69AB, + 0x69B4,0x69D0,0x69CD,0x69AD,0x69CC,0x69A6,0x69C3,0x69A3, + 0x6B49,0x6B4C,0x6C33,0x6F33,0x6F14,0x6EFE,0x6F13,0x6EF4, + 0x6F29,0x6F3E,0x6F20,0x6F2C,0x6F0F,0x6F02,0x6F22,0x6EFF, + 0x6EEF,0x6F06,0x6F31,0x6F38,0x6F32,0x6F23,0x6F15,0x6F2B, + 0x6F2F,0x6F88,0x6F2A,0x6EEC,0x6F01,0x6EF2,0x6ECC,0x6EF7, + 0x7194,0x7199,0x717D,0x718A,0x7184,0x7192,0x723E,0x7292, + 0x7296,0x7344,0x7350,0x7464,0x7463,0x746A,0x7470,0x746D, + 0x7504,0x7591,0x7627,0x760D,0x760B,0x7609,0x7613,0x76E1, + 0x76E3,0x7784,0x777D,0x777F,0x7761,0x78C1,0x789F,0x78A7, + 0x78B3,0x78A9,0x78A3,0x798E,0x798F,0x798D, + /* Range 0x6A21 - 0x6A7E, array index: 0x1090 */ + 0x7A2E,0x7A31,0x7AAA,0x7AA9,0x7AED,0x7AEF,0x7BA1,0x7B95, + 0x7B8B,0x7B75,0x7B97,0x7B9D,0x7B94,0x7B8F,0x7BB8,0x7B87, + 0x7B84,0x7CB9,0x7CBD,0x7CBE,0x7DBB,0x7DB0,0x7D9C,0x7DBD, + 0x7DBE,0x7DA0,0x7DCA,0x7DB4,0x7DB2,0x7DB1,0x7DBA,0x7DA2, + 0x7DBF,0x7DB5,0x7DB8,0x7DAD,0x7DD2,0x7DC7,0x7DAC,0x7F70, + 0x7FE0,0x7FE1,0x7FDF,0x805E,0x805A,0x8087,0x8150,0x8180, + 0x818F,0x8188,0x818A,0x817F,0x8182,0x81E7,0x81FA,0x8207, + 0x8214,0x821E,0x824B,0x84C9,0x84BF,0x84C6,0x84C4,0x8499, + 0x849E,0x84B2,0x849C,0x84CB,0x84B8,0x84C0,0x84D3,0x8490, + 0x84BC,0x84D1,0x84CA,0x873F,0x871C,0x873B,0x8722,0x8725, + 0x8734,0x8718,0x8755,0x8737,0x8729,0x88F3,0x8902,0x88F4, + 0x88F9,0x88F8,0x88FD,0x88E8,0x891A,0x88EF, + /* Range 0x6B21 - 0x6B7E, array index: 0x10EE */ + 0x8AA6,0x8A8C,0x8A9E,0x8AA3,0x8A8D,0x8AA1,0x8A93,0x8AA4, + 0x8AAA,0x8AA5,0x8AA8,0x8A98,0x8A91,0x8A9A,0x8AA7,0x8C6A, + 0x8C8D,0x8C8C,0x8CD3,0x8CD1,0x8CD2,0x8D6B,0x8D99,0x8D95, + 0x8DFC,0x8F14,0x8F12,0x8F15,0x8F13,0x8FA3,0x9060,0x9058, + 0x905C,0x9063,0x9059,0x905E,0x9062,0x905D,0x905B,0x9119, + 0x9118,0x911E,0x9175,0x9178,0x9177,0x9174,0x9278,0x92AC, + 0x9280,0x9285,0x9298,0x9296,0x927B,0x9293,0x929C,0x92A8, + 0x927C,0x9291,0x95A1,0x95A8,0x95A9,0x95A3,0x95A5,0x95A4, + 0x9699,0x969C,0x969B,0x96CC,0x96D2,0x9700,0x977C,0x9785, + 0x97F6,0x9817,0x9818,0x98AF,0x98B1,0x9903,0x9905,0x990C, + 0x9909,0x99C1,0x9AAF,0x9AB0,0x9AE6,0x9B41,0x9B42,0x9CF4, + 0x9CF6,0x9CF3,0x9EBC,0x9F3B,0x9F4A,0x5104, + /* Range 0x6C21 - 0x6C7E, array index: 0x114C */ + 0x5100,0x50FB,0x50F5,0x50F9,0x5102,0x5108,0x5109,0x5105, + 0x51DC,0x5287,0x5288,0x5289,0x528D,0x528A,0x52F0,0x53B2, + 0x562E,0x563B,0x5639,0x5632,0x563F,0x5634,0x5629,0x5653, + 0x564E,0x5657,0x5674,0x5636,0x562F,0x5630,0x5880,0x589F, + 0x589E,0x58B3,0x589C,0x58AE,0x58A9,0x58A6,0x596D,0x5B09, + 0x5AFB,0x5B0B,0x5AF5,0x5B0C,0x5B08,0x5BEE,0x5BEC,0x5BE9, + 0x5BEB,0x5C64,0x5C65,0x5D9D,0x5D94,0x5E62,0x5E5F,0x5E61, + 0x5EE2,0x5EDA,0x5EDF,0x5EDD,0x5EE3,0x5EE0,0x5F48,0x5F71, + 0x5FB7,0x5FB5,0x6176,0x6167,0x616E,0x615D,0x6155,0x6182, + 0x617C,0x6170,0x616B,0x617E,0x61A7,0x6190,0x61AB,0x618E, + 0x61AC,0x619A,0x61A4,0x6194,0x61AE,0x622E,0x6469,0x646F, + 0x6479,0x649E,0x64B2,0x6488,0x6490,0x64B0, + /* Range 0x6D21 - 0x6D7E, array index: 0x11AA */ + 0x64A5,0x6493,0x6495,0x64A9,0x6492,0x64AE,0x64AD,0x64AB, + 0x649A,0x64AC,0x6499,0x64A2,0x64B3,0x6575,0x6577,0x6578, + 0x66AE,0x66AB,0x66B4,0x66B1,0x6A23,0x6A1F,0x69E8,0x6A01, + 0x6A1E,0x6A19,0x69FD,0x6A21,0x6A13,0x6A0A,0x69F3,0x6A02, + 0x6A05,0x69ED,0x6A11,0x6B50,0x6B4E,0x6BA4,0x6BC5,0x6BC6, + 0x6F3F,0x6F7C,0x6F84,0x6F51,0x6F66,0x6F54,0x6F86,0x6F6D, + 0x6F5B,0x6F78,0x6F6E,0x6F8E,0x6F7A,0x6F70,0x6F64,0x6F97, + 0x6F58,0x6ED5,0x6F6F,0x6F60,0x6F5F,0x719F,0x71AC,0x71B1, + 0x71A8,0x7256,0x729B,0x734E,0x7357,0x7469,0x748B,0x7483, + 0x747E,0x7480,0x757F,0x7620,0x7629,0x761F,0x7624,0x7626, + 0x7621,0x7622,0x769A,0x76BA,0x76E4,0x778E,0x7787,0x778C, + 0x7791,0x778B,0x78CB,0x78C5,0x78BA,0x78CA, + /* Range 0x6E21 - 0x6E7E, array index: 0x1208 */ + 0x78BE,0x78D5,0x78BC,0x78D0,0x7A3F,0x7A3C,0x7A40,0x7A3D, + 0x7A37,0x7A3B,0x7AAF,0x7AAE,0x7BAD,0x7BB1,0x7BC4,0x7BB4, + 0x7BC6,0x7BC7,0x7BC1,0x7BA0,0x7BCC,0x7CCA,0x7DE0,0x7DF4, + 0x7DEF,0x7DFB,0x7DD8,0x7DEC,0x7DDD,0x7DE8,0x7DE3,0x7DDA, + 0x7DDE,0x7DE9,0x7D9E,0x7DD9,0x7DF2,0x7DF9,0x7F75,0x7F77, + 0x7FAF,0x7FE9,0x8026,0x819B,0x819C,0x819D,0x81A0,0x819A, + 0x8198,0x8517,0x853D,0x851A,0x84EE,0x852C,0x852D,0x8513, + 0x8511,0x8523,0x8521,0x8514,0x84EC,0x8525,0x84FF,0x8506, + 0x8782,0x8774,0x8776,0x8760,0x8766,0x8778,0x8768,0x8759, + 0x8757,0x874C,0x8753,0x885B,0x885D,0x8910,0x8907,0x8912, + 0x8913,0x8915,0x890A,0x8ABC,0x8AD2,0x8AC7,0x8AC4,0x8A95, + 0x8ACB,0x8AF8,0x8AB2,0x8AC9,0x8AC2,0x8ABF, + /* Range 0x6F21 - 0x6F7E, array index: 0x1266 */ + 0x8AB0,0x8AD6,0x8ACD,0x8AB6,0x8AB9,0x8ADB,0x8C4C,0x8C4E, + 0x8C6C,0x8CE0,0x8CDE,0x8CE6,0x8CE4,0x8CEC,0x8CED,0x8CE2, + 0x8CE3,0x8CDC,0x8CEA,0x8CE1,0x8D6D,0x8D9F,0x8DA3,0x8E2B, + 0x8E10,0x8E1D,0x8E22,0x8E0F,0x8E29,0x8E1F,0x8E21,0x8E1E, + 0x8EBA,0x8F1D,0x8F1B,0x8F1F,0x8F29,0x8F26,0x8F2A,0x8F1C, + 0x8F1E,0x8F25,0x9069,0x906E,0x9068,0x906D,0x9077,0x9130, + 0x912D,0x9127,0x9131,0x9187,0x9189,0x918B,0x9183,0x92C5, + 0x92BB,0x92B7,0x92EA,0x92E4,0x92C1,0x92B3,0x92BC,0x92D2, + 0x92C7,0x92F0,0x92B2,0x95AD,0x95B1,0x9704,0x9706,0x9707, + 0x9709,0x9760,0x978D,0x978B,0x978F,0x9821,0x982B,0x981C, + 0x98B3,0x990A,0x9913,0x9912,0x9918,0x99DD,0x99D0,0x99DF, + 0x99DB,0x99D1,0x99D5,0x99D2,0x99D9,0x9AB7, + /* Range 0x7021 - 0x707E, array index: 0x12C4 */ + 0x9AEE,0x9AEF,0x9B27,0x9B45,0x9B44,0x9B77,0x9B6F,0x9D06, + 0x9D09,0x9D03,0x9EA9,0x9EBE,0x9ECE,0x58A8,0x9F52,0x5112, + 0x5118,0x5114,0x5110,0x5115,0x5180,0x51AA,0x51DD,0x5291, + 0x5293,0x52F3,0x5659,0x566B,0x5679,0x5669,0x5664,0x5678, + 0x566A,0x5668,0x5665,0x5671,0x566F,0x566C,0x5662,0x5676, + 0x58C1,0x58BE,0x58C7,0x58C5,0x596E,0x5B1D,0x5B34,0x5B78, + 0x5BF0,0x5C0E,0x5F4A,0x61B2,0x6191,0x61A9,0x618A,0x61CD, + 0x61B6,0x61BE,0x61CA,0x61C8,0x6230,0x64C5,0x64C1,0x64CB, + 0x64BB,0x64BC,0x64DA,0x64C4,0x64C7,0x64C2,0x64CD,0x64BF, + 0x64D2,0x64D4,0x64BE,0x6574,0x66C6,0x66C9,0x66B9,0x66C4, + 0x66C7,0x66B8,0x6A3D,0x6A38,0x6A3A,0x6A59,0x6A6B,0x6A58, + 0x6A39,0x6A44,0x6A62,0x6A61,0x6A4B,0x6A47, + /* Range 0x7121 - 0x717E, array index: 0x1322 */ + 0x6A35,0x6A5F,0x6A48,0x6B59,0x6B77,0x6C05,0x6FC2,0x6FB1, + 0x6FA1,0x6FC3,0x6FA4,0x6FC1,0x6FA7,0x6FB3,0x6FC0,0x6FB9, + 0x6FB6,0x6FA6,0x6FA0,0x6FB4,0x71BE,0x71C9,0x71D0,0x71D2, + 0x71C8,0x71D5,0x71B9,0x71CE,0x71D9,0x71DC,0x71C3,0x71C4, + 0x7368,0x749C,0x74A3,0x7498,0x749F,0x749E,0x74E2,0x750C, + 0x750D,0x7634,0x7638,0x763A,0x76E7,0x76E5,0x77A0,0x779E, + 0x779F,0x77A5,0x78E8,0x78DA,0x78EC,0x78E7,0x79A6,0x7A4D, + 0x7A4E,0x7A46,0x7A4C,0x7A4B,0x7ABA,0x7BD9,0x7C11,0x7BC9, + 0x7BE4,0x7BDB,0x7BE1,0x7BE9,0x7BE6,0x7CD5,0x7CD6,0x7E0A, + 0x7E11,0x7E08,0x7E1B,0x7E23,0x7E1E,0x7E1D,0x7E09,0x7E10, + 0x7F79,0x7FB2,0x7FF0,0x7FF1,0x7FEE,0x8028,0x81B3,0x81A9, + 0x81A8,0x81FB,0x8208,0x8258,0x8259,0x854A, + /* Range 0x7221 - 0x727E, array index: 0x1380 */ + 0x8559,0x8548,0x8568,0x8569,0x8543,0x8549,0x856D,0x856A, + 0x855E,0x8783,0x879F,0x879E,0x87A2,0x878D,0x8861,0x892A, + 0x8932,0x8925,0x892B,0x8921,0x89AA,0x89A6,0x8AE6,0x8AFA, + 0x8AEB,0x8AF1,0x8B00,0x8ADC,0x8AE7,0x8AEE,0x8AFE,0x8B01, + 0x8B02,0x8AF7,0x8AED,0x8AF3,0x8AF6,0x8AFC,0x8C6B,0x8C6D, + 0x8C93,0x8CF4,0x8E44,0x8E31,0x8E34,0x8E42,0x8E39,0x8E35, + 0x8F3B,0x8F2F,0x8F38,0x8F33,0x8FA8,0x8FA6,0x9075,0x9074, + 0x9078,0x9072,0x907C,0x907A,0x9134,0x9192,0x9320,0x9336, + 0x92F8,0x9333,0x932F,0x9322,0x92FC,0x932B,0x9304,0x931A, + 0x9310,0x9326,0x9321,0x9315,0x932E,0x9319,0x95BB,0x96A7, + 0x96A8,0x96AA,0x96D5,0x970E,0x9711,0x9716,0x970D,0x9713, + 0x970F,0x975B,0x975C,0x9766,0x9798,0x9830, + /* Range 0x7321 - 0x737E, array index: 0x13DE */ + 0x9838,0x983B,0x9837,0x982D,0x9839,0x9824,0x9910,0x9928, + 0x991E,0x991B,0x9921,0x991A,0x99ED,0x99E2,0x99F1,0x9AB8, + 0x9ABC,0x9AFB,0x9AED,0x9B28,0x9B91,0x9D15,0x9D23,0x9D26, + 0x9D28,0x9D12,0x9D1B,0x9ED8,0x9ED4,0x9F8D,0x9F9C,0x512A, + 0x511F,0x5121,0x5132,0x52F5,0x568E,0x5680,0x5690,0x5685, + 0x5687,0x568F,0x58D5,0x58D3,0x58D1,0x58CE,0x5B30,0x5B2A, + 0x5B24,0x5B7A,0x5C37,0x5C68,0x5DBC,0x5DBA,0x5DBD,0x5DB8, + 0x5E6B,0x5F4C,0x5FBD,0x61C9,0x61C2,0x61C7,0x61E6,0x61CB, + 0x6232,0x6234,0x64CE,0x64CA,0x64D8,0x64E0,0x64F0,0x64E6, + 0x64EC,0x64F1,0x64E2,0x64ED,0x6582,0x6583,0x66D9,0x66D6, + 0x6A80,0x6A94,0x6A84,0x6AA2,0x6A9C,0x6ADB,0x6AA3,0x6A7E, + 0x6A97,0x6A90,0x6AA0,0x6B5C,0x6BAE,0x6BDA, + /* Range 0x7421 - 0x747E, array index: 0x143C */ + 0x6C08,0x6FD8,0x6FF1,0x6FDF,0x6FE0,0x6FDB,0x6FE4,0x6FEB, + 0x6FEF,0x6F80,0x6FEC,0x6FE1,0x6FE9,0x6FD5,0x6FEE,0x6FF0, + 0x71E7,0x71DF,0x71EE,0x71E6,0x71E5,0x71ED,0x71EC,0x71F4, + 0x71E0,0x7235,0x7246,0x7370,0x7372,0x74A9,0x74B0,0x74A6, + 0x74A8,0x7646,0x7642,0x764C,0x76EA,0x77B3,0x77AA,0x77B0, + 0x77AC,0x77A7,0x77AD,0x77EF,0x78F7,0x78FA,0x78F4,0x78EF, + 0x7901,0x79A7,0x79AA,0x7A57,0x7ABF,0x7C07,0x7C0D,0x7BFE, + 0x7BF7,0x7C0C,0x7BE0,0x7CE0,0x7CDC,0x7CDE,0x7CE2,0x7CDF, + 0x7CD9,0x7CDD,0x7E2E,0x7E3E,0x7E46,0x7E37,0x7E32,0x7E43, + 0x7E2B,0x7E3D,0x7E31,0x7E45,0x7E41,0x7E34,0x7E39,0x7E48, + 0x7E35,0x7E3F,0x7E2F,0x7F44,0x7FF3,0x7FFC,0x8071,0x8072, + 0x8070,0x806F,0x8073,0x81C6,0x81C3,0x81BA, + /* Range 0x7521 - 0x757E, array index: 0x149A */ + 0x81C2,0x81C0,0x81BF,0x81BD,0x81C9,0x81BE,0x81E8,0x8209, + 0x8271,0x85AA,0x8584,0x857E,0x859C,0x8591,0x8594,0x85AF, + 0x859B,0x8587,0x85A8,0x858A,0x85A6,0x8667,0x87C0,0x87D1, + 0x87B3,0x87D2,0x87C6,0x87AB,0x87BB,0x87BA,0x87C8,0x87CB, + 0x893B,0x8936,0x8944,0x8938,0x893D,0x89AC,0x8B0E,0x8B17, + 0x8B19,0x8B1B,0x8B0A,0x8B20,0x8B1D,0x8B04,0x8B10,0x8C41, + 0x8C3F,0x8C73,0x8CFA,0x8CFD,0x8CFC,0x8CF8,0x8CFB,0x8DA8, + 0x8E49,0x8E4B,0x8E48,0x8E4A,0x8F44,0x8F3E,0x8F42,0x8F45, + 0x8F3F,0x907F,0x907D,0x9084,0x9081,0x9082,0x9080,0x9139, + 0x91A3,0x919E,0x919C,0x934D,0x9382,0x9328,0x9375,0x934A, + 0x9365,0x934B,0x9318,0x937E,0x936C,0x935B,0x9370,0x935A, + 0x9354,0x95CA,0x95CB,0x95CC,0x95C8,0x95C6, + /* Range 0x7621 - 0x767E, array index: 0x14F8 */ + 0x96B1,0x96B8,0x96D6,0x971C,0x971E,0x97A0,0x97D3,0x9846, + 0x98B6,0x9935,0x9A01,0x99FF,0x9BAE,0x9BAB,0x9BAA,0x9BAD, + 0x9D3B,0x9D3F,0x9E8B,0x9ECF,0x9EDE,0x9EDC,0x9EDD,0x9EDB, + 0x9F3E,0x9F4B,0x53E2,0x5695,0x56AE,0x58D9,0x58D8,0x5B38, + 0x5F5E,0x61E3,0x6233,0x64F4,0x64F2,0x64FE,0x6506,0x64FA, + 0x64FB,0x64F7,0x65B7,0x66DC,0x6726,0x6AB3,0x6AAC,0x6AC3, + 0x6ABB,0x6AB8,0x6AC2,0x6AAE,0x6AAF,0x6B5F,0x6B78,0x6BAF, + 0x7009,0x700B,0x6FFE,0x7006,0x6FFA,0x7011,0x700F,0x71FB, + 0x71FC,0x71FE,0x71F8,0x7377,0x7375,0x74A7,0x74BF,0x7515, + 0x7656,0x7658,0x7652,0x77BD,0x77BF,0x77BB,0x77BC,0x790E, + 0x79AE,0x7A61,0x7A62,0x7A60,0x7AC4,0x7AC5,0x7C2B,0x7C27, + 0x7C2A,0x7C1E,0x7C23,0x7C21,0x7CE7,0x7E54, + /* Range 0x7721 - 0x777E, array index: 0x1556 */ + 0x7E55,0x7E5E,0x7E5A,0x7E61,0x7E52,0x7E59,0x7F48,0x7FF9, + 0x7FFB,0x8077,0x8076,0x81CD,0x81CF,0x820A,0x85CF,0x85A9, + 0x85CD,0x85D0,0x85C9,0x85B0,0x85BA,0x85B9,0x87EF,0x87EC, + 0x87F2,0x87E0,0x8986,0x89B2,0x89F4,0x8B28,0x8B39,0x8B2C, + 0x8B2B,0x8C50,0x8D05,0x8E59,0x8E63,0x8E66,0x8E64,0x8E5F, + 0x8E55,0x8EC0,0x8F49,0x8F4D,0x9087,0x9083,0x9088,0x91AB, + 0x91AC,0x91D0,0x9394,0x938A,0x9396,0x93A2,0x93B3,0x93AE, + 0x93AC,0x93B0,0x9398,0x939A,0x9397,0x95D4,0x95D6,0x95D0, + 0x95D5,0x96E2,0x96DC,0x96D9,0x96DB,0x96DE,0x9724,0x97A3, + 0x97A6,0x97AD,0x97F9,0x984D,0x984F,0x984C,0x984E,0x9853, + 0x98BA,0x993E,0x993F,0x993D,0x992E,0x99A5,0x9A0E,0x9AC1, + 0x9B03,0x9B06,0x9B4F,0x9B4E,0x9B4D,0x9BCA, + /* Range 0x7821 - 0x787E, array index: 0x15B4 */ + 0x9BC9,0x9BFD,0x9BC8,0x9BC0,0x9D51,0x9D5D,0x9D60,0x9EE0, + 0x9F15,0x9F2C,0x5133,0x56A5,0x56A8,0x58DE,0x58DF,0x58E2, + 0x5BF5,0x9F90,0x5EEC,0x61F2,0x61F7,0x61F6,0x61F5,0x6500, + 0x650F,0x66E0,0x66DD,0x6AE5,0x6ADD,0x6ADA,0x6AD3,0x701B, + 0x701F,0x7028,0x701A,0x701D,0x7015,0x7018,0x7206,0x720D, + 0x7258,0x72A2,0x7378,0x737A,0x74BD,0x74CA,0x74E3,0x7587, + 0x7586,0x765F,0x7661,0x77C7,0x7919,0x79B1,0x7A6B,0x7A69, + 0x7C3E,0x7C3F,0x7C38,0x7C3D,0x7C37,0x7C40,0x7E6B,0x7E6D, + 0x7E79,0x7E69,0x7E6A,0x7E73,0x7F85,0x7FB6,0x7FB9,0x7FB8, + 0x81D8,0x85E9,0x85DD,0x85EA,0x85D5,0x85E4,0x85E5,0x85F7, + 0x87FB,0x8805,0x880D,0x87F9,0x87FE,0x8960,0x895F,0x8956, + 0x895E,0x8B41,0x8B5C,0x8B58,0x8B49,0x8B5A, + /* Range 0x7921 - 0x797E, array index: 0x1612 */ + 0x8B4E,0x8B4F,0x8B46,0x8B59,0x8D08,0x8D0A,0x8E7C,0x8E72, + 0x8E87,0x8E76,0x8E6C,0x8E7A,0x8E74,0x8F54,0x8F4E,0x8FAD, + 0x908A,0x908B,0x91B1,0x91AE,0x93E1,0x93D1,0x93DF,0x93C3, + 0x93C8,0x93DC,0x93DD,0x93D6,0x93E2,0x93CD,0x93D8,0x93E4, + 0x93D7,0x93E8,0x95DC,0x96B4,0x96E3,0x972A,0x9727,0x9761, + 0x97DC,0x97FB,0x985E,0x9858,0x985B,0x98BC,0x9945,0x9949, + 0x9A16,0x9A19,0x9B0D,0x9BE8,0x9BE7,0x9BD6,0x9BDB,0x9D89, + 0x9D61,0x9D72,0x9D6A,0x9D6C,0x9E92,0x9E97,0x9E93,0x9EB4, + 0x52F8,0x56B7,0x56B6,0x56B4,0x56BC,0x58E4,0x5B40,0x5B43, + 0x5B7D,0x5BF6,0x5DC9,0x61F8,0x61FA,0x6518,0x6514,0x6519, + 0x66E6,0x6727,0x6AEC,0x703E,0x7030,0x7032,0x7210,0x737B, + 0x74CF,0x7662,0x7665,0x7926,0x792A,0x792C, + /* Range 0x7A21 - 0x7A7E, array index: 0x1670 */ + 0x792B,0x7AC7,0x7AF6,0x7C4C,0x7C43,0x7C4D,0x7CEF,0x7CF0, + 0x8FAE,0x7E7D,0x7E7C,0x7E82,0x7F4C,0x8000,0x81DA,0x8266, + 0x85FB,0x85F9,0x8611,0x85FA,0x8606,0x860B,0x8607,0x860A, + 0x8814,0x8815,0x8964,0x89BA,0x89F8,0x8B70,0x8B6C,0x8B66, + 0x8B6F,0x8B5F,0x8B6B,0x8D0F,0x8D0D,0x8E89,0x8E81,0x8E85, + 0x8E82,0x91B4,0x91CB,0x9418,0x9403,0x93FD,0x95E1,0x9730, + 0x98C4,0x9952,0x9951,0x99A8,0x9A2B,0x9A30,0x9A37,0x9A35, + 0x9C13,0x9C0D,0x9E79,0x9EB5,0x9EE8,0x9F2F,0x9F5F,0x9F63, + 0x9F61,0x5137,0x5138,0x56C1,0x56C0,0x56C2,0x5914,0x5C6C, + 0x5DCD,0x61FC,0x61FE,0x651D,0x651C,0x6595,0x66E9,0x6AFB, + 0x6B04,0x6AFA,0x6BB2,0x704C,0x721B,0x72A7,0x74D6,0x74D4, + 0x7669,0x77D3,0x7C50,0x7E8F,0x7E8C,0x7FBC, + /* Range 0x7B21 - 0x7B7E, array index: 0x16CE */ + 0x8617,0x862D,0x861A,0x8823,0x8822,0x8821,0x881F,0x896A, + 0x896C,0x89BD,0x8B74,0x8B77,0x8B7D,0x8D13,0x8E8A,0x8E8D, + 0x8E8B,0x8F5F,0x8FAF,0x91BA,0x942E,0x9433,0x9435,0x943A, + 0x9438,0x9432,0x942B,0x95E2,0x9738,0x9739,0x9732,0x97FF, + 0x9867,0x9865,0x9957,0x9A45,0x9A43,0x9A40,0x9A3E,0x9ACF, + 0x9B54,0x9B51,0x9C2D,0x9C25,0x9DAF,0x9DB4,0x9DC2,0x9DB8, + 0x9E9D,0x9EEF,0x9F19,0x9F5C,0x9F66,0x9F67,0x513C,0x513B, + 0x56C8,0x56CA,0x56C9,0x5B7F,0x5DD4,0x5DD2,0x5F4E,0x61FF, + 0x6524,0x6B0A,0x6B61,0x7051,0x7058,0x7380,0x74E4,0x758A, + 0x766E,0x766C,0x79B3,0x7C60,0x7C5F,0x807E,0x807D,0x81DF, + 0x8972,0x896F,0x89FC,0x8B80,0x8D16,0x8D17,0x8E91,0x8E93, + 0x8F61,0x9148,0x9444,0x9451,0x9452,0x973D, + /* Range 0x7C21 - 0x7C7E, array index: 0x172C */ + 0x973E,0x97C3,0x97C1,0x986B,0x9955,0x9A55,0x9A4D,0x9AD2, + 0x9B1A,0x9C49,0x9C31,0x9C3E,0x9C3B,0x9DD3,0x9DD7,0x9F34, + 0x9F6C,0x9F6A,0x9F94,0x56CC,0x5DD6,0x6200,0x6523,0x652B, + 0x652A,0x66EC,0x6B10,0x74DA,0x7ACA,0x7C64,0x7C63,0x7C65, + 0x7E93,0x7E96,0x7E94,0x81E2,0x8638,0x863F,0x8831,0x8B8A, + 0x9090,0x908F,0x9463,0x9460,0x9464,0x9768,0x986F,0x995C, + 0x9A5A,0x9A5B,0x9A57,0x9AD3,0x9AD4,0x9AD1,0x9C54,0x9C57, + 0x9C56,0x9DE5,0x9E9F,0x9EF4,0x56D1,0x58E9,0x652C,0x705E, + 0x7671,0x7672,0x77D7,0x7F50,0x7F88,0x8836,0x8839,0x8862, + 0x8B93,0x8B92,0x8B96,0x8277,0x8D1B,0x91C0,0x946A,0x9742, + 0x9748,0x9744,0x97C6,0x9870,0x9A5F,0x9B22,0x9B58,0x9C5F, + 0x9DF9,0x9DFA,0x9E7C,0x9E7D,0x9F07,0x9F77, + /* Range 0x7D21 - 0x7D4B, array index: 0x178A */ + 0x9F72,0x5EF3,0x6B16,0x7063,0x7C6C,0x7C6E,0x883B,0x89C0, + 0x8EA1,0x91C1,0x9472,0x9470,0x9871,0x995E,0x9AD6,0x9B23, + 0x9ECC,0x7064,0x77DA,0x8B9A,0x9477,0x97C9,0x9A62,0x9A65, + 0x7E9C,0x8B9C,0x8EAA,0x91C5,0x947D,0x947E,0x947C,0x9C77, + 0x9C78,0x9EF7,0x8C54,0x947F,0x9E1A,0x7228,0x9A6A,0x9B31, + 0x9E1B,0x9E1E,0x7C72, + /* Unranged codes (66 codes) */ +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE1 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> cns11643_plane1 speed-optimized table (50176 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_cns11643_plane1[] = +{ + /* Heading Block */ + 0x0100,INVBLK,0x0200,0x0300,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0400,0x0500,0x0600,INVBLK,0x0700,0x0800,0x0900,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0A00,0x0B00,0x0C00,0x0D00,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x0E00,0x0F00, + 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700, + 0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00, + 0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, + 0x2800,0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00, + 0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700, + 0x3800,0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00,0x3F00, + 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700, + 0x4800,0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00,0x4F00, + 0x5000,0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700, + 0x5800,0x5900,0x5A00,0x5B00,0x5C00,0x5D00,0x5E00,0x5F00, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x6000,0x6100, + /* Block 1, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2170, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2278,0x2234,INVALC,INVALC,INVALC,INVALC,INVALC,0x2131, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2232, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2233, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 3, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x256F, + INVALC,0x256D,0x256E,0x2570,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x256C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 4, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B, + 0x247C,0x247D,0x247E,0x2521,0x2522,0x2523,0x2524,0x2525, + 0x2526,0x2527,INVALC,0x2528,0x2529,0x252A,0x252B,0x252C, + 0x252D,0x252E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x252F,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535, + 0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C,0x253D, + 0x253E,0x253F,INVALC,0x2540,0x2541,0x2542,0x2543,0x2544, + 0x2545,0x2546,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 33, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2139,0x2137,INVALC,0x225D,INVALC, + 0x2164,0x2165,INVALC,INVALC,0x2166,0x2167,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x212D,0x212C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x216A,INVALC,INVALC,0x216B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x216F,INVALC,INVALC,0x2223,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 34, Array index 0x0500 */ + INVALC,INVALC,INVALC,0x226A,INVALC,0x2222,INVALC,INVALC, + INVALC,0x226B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x242B,0x242C,0x242D,0x242E,0x242F,0x2430,0x2431,0x2432, + 0x2433,0x2434,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2635,0x2636,0x2637,0x2638,0x2639,0x263A,0x263B,0x263C, + 0x263D,0x263E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2258,0x2255,0x2257,0x2256,INVALC,INVALC,0x2259,0x225A, + 0x225C,0x225B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2261,INVALC,INVALC, + INVALC,INVALC,0x2235,INVALC,INVALC,INVALC,0x223C,0x2249, + 0x2248,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2245,0x2246,0x224D,INVALC,INVALC,0x224E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2250,0x224F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2244,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x223D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x223B,0x223E,INVALC,INVALC,INVALC,INVALC,0x2239,0x223A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2247,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x224A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0700 */ + 0x4221,0x4222,0x4223,0x4224,0x4225,0x4226,0x4227,0x4228, + 0x4229,0x422A,0x422B,0x422C,0x422D,0x422E,0x422F,0x4230, + 0x4231,0x4232,0x4233,0x4234,0x4235,0x4236,0x4237,0x4238, + 0x4239,0x423A,0x423B,0x423C,0x423D,0x423E,0x423F,0x4240, + INVALC,0x4241,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2621,0x2622,0x2623,0x2624,0x2625,0x2626,0x2627,0x2628, + 0x2629,0x262A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x262B,0x262C,0x262D,0x262E, + 0x262F,0x2630,0x2631,0x2632,0x2633,0x2634,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0800 */ + 0x2339,INVALC,0x233A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x233C,INVALC,INVALC,INVALC, + 0x233D,INVALC,INVALC,INVALC,0x233E,INVALC,INVALC,INVALC, + 0x233F,INVALC,INVALC,INVALC,0x2337,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2336,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2335,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2334,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2333,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2344,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2345,INVALC, + INVALC,0x2347,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2346,INVALC,INVALC,0x2340,0x2341,0x2343, + 0x2342,0x234C,0x234D,0x234E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2324,0x2325,0x2326,0x2327,0x2328,0x2329,0x232A, + 0x232B,0x2332,0x2331,0x2330,0x232F,0x232E,0x232D,0x232C, + INVALC,INVALC,INVALC,INVALC,0x2338,0x233B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x217C,0x217B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2175,0x2174,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x217E,0x217D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x217A,0x2179, + INVALC,INVALC,INVALC,0x2172,INVALC,INVALC,0x2176,0x2173, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2348,0x2349,0x234B,0x234A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x2178,0x2177,INVALC, + INVALC,0x2254,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2251,0x2253,0x2252,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0A00 */ + 0x2121,0x2123,0x2124,0x2171,INVALC,INVALC,INVALC,INVALC, + 0x2152,0x2153,0x214E,0x214F,0x2156,0x2157,0x215A,0x215B, + 0x214A,0x214B,0x2265,INVALC,0x2146,0x2147,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2168,0x2169,INVALC, + INVALC,0x2435,0x2436,0x2437,0x2438,0x2439,0x243A,0x243B, + 0x243C,0x243D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2126,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x2547,0x2548,0x2549, + 0x254A,0x254B,0x254C,0x254D,0x254E,0x254F,0x2550,0x2551, + 0x2552,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559, + 0x255A,0x255B,0x255C,0x255D,0x255E,0x255F,0x2560,0x2561, + 0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569, + 0x256A,0x256B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2221,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2275,0x2276, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2270,0x2271,0x2272,INVALC, + INVALC,0x2274,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2277,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2273,INVALC, + INVALC,0x224C,0x224B,INVALC,INVALC,0x226F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x0E00 */ + 0x4421,0x4423,INVALC,0x4424,INVALC,INVALC,INVALC,INVALC, + 0x4437,0x4435,0x4438,0x4436,INVALC,0x4462,INVALC,INVALC, + 0x4461,0x4460,INVALC,INVALC,0x4562,0x4561,0x4560,INVALC, + 0x4563,0x455F,INVALC,INVALC,INVALC,INVALC,0x4722,0x4723, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B64,INVALC, + INVALC,INVALC,INVALC,0x4439,INVALC,0x4463,INVALC,INVALC, + 0x4464,INVALC,0x486B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x443A,0x4465,INVALC,0x4564,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4425,INVALC,0x443C,INVALC,INVALC, + 0x443D,INVALC,INVALC,0x4466,INVALC,0x4565,0x4567,0x4566, + INVALC,INVALC,0x4724,0x4725,INVALC,INVALC,0x4B65,INVALC, + 0x537D,0x4422,INVALC,INVALC,INVALC,0x4426,0x443F,0x443E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4726,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B66,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5871,INVALC, + INVALC,INVALC,0x632A,INVALC,INVALC,INVALC,0x4427,INVALC, + 0x4468,INVALC,INVALC,0x4B67,0x4428,INVALC,0x4440,INVALC, + INVALC,0x4469,0x446B,INVALC,0x446C,0x446A,INVALC,INVALC, + INVALC,0x4727,INVALC,0x4B68,INVALC,INVALC,0x4B69,0x4F67, + INVALC,0x4441,0x446D,INVALC,0x4728,0x472A,0x4729,INVALC, + 0x486C,INVALC,INVALC,0x4B6A,0x4B6B,0x4F68,0x4F69,INVALC, + INVALC,INVALC,INVALC,0x537E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4429,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x446F,0x446E,INVALC,0x4470,0x4476,INVALC,0x4471,0x4472, + INVALC,INVALC,0x4474,0x4475,INVALC,0x4473,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x456A,0x456B,0x456C,0x456D, + 0x4569,0x4570,INVALC,INVALC,INVALC,INVALC,0x4571,0x4623, + INVALC,INVALC,INVALC,0x456E,0x456F,0x4568,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4737,INVALC,0x4734,0x4738,INVALC,INVALC,0x4735,INVALC, + INVALC,INVALC,INVALC,0x4736,INVALC,0x4739,INVALC,0x472B, + /* Block 80, Array index 0x0F00 */ + INVALC,0x473A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x472C,0x472E,0x473B,INVALC,0x4730,INVALC,0x4733, + 0x4731,0x4732,INVALC,INVALC,INVALC,0x472F,INVALC,INVALC, + INVALC,0x472D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4924, + 0x4875,INVALC,INVALC,INVALC,0x4872,INVALC,0x4926,INVALC, + 0x487A,INVALC,0x4879,INVALC,0x487D,0x4878,INVALC,INVALC, + INVALC,INVALC,INVALC,0x487B,INVALC,INVALC,0x487E,0x486F, + 0x4929,INVALC,INVALC,INVALC,INVALC,0x486D,0x4925,0x486E, + 0x4876,0x4877,INVALC,INVALC,0x487C,0x4874,INVALC,0x4870, + INVALC,0x4927,0x492A,0x4873,0x4922,0x4928,0x4871,INVALC, + 0x4923,INVALC,INVALC,0x4921,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4B79,INVALC,INVALC,0x4B71,INVALC,INVALC,0x4B6C, + 0x4B76,INVALC,INVALC,0x4B6F,INVALC,0x4B77,INVALC,INVALC, + INVALC,INVALC,0x4C21,0x4B7A,INVALC,INVALC,0x4B7C,0x4B70, + INVALC,INVALC,INVALC,0x4B75,INVALC,INVALC,0x4B74,INVALC, + 0x4B78,INVALC,INVALC,0x4B73,INVALC,0x4B6E,INVALC,0x4B7D, + INVALC,0x4B7E,INVALC,INVALC,INVALC,INVALC,0x4B7B,INVALC, + INVALC,INVALC,INVALC,0x4B72,INVALC,0x4B6D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F78,0x4F6C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F6B,0x4F73,0x5021, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F6D, + INVALC,INVALC,0x4F7B,0x4F72,0x4F7A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F76,INVALC,INVALC,INVALC,0x4F7D,0x4F70, + 0x4F79,0x4F6F,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F77, + 0x4F74,INVALC,0x4F7C,INVALC,INVALC,0x4F71,0x4F7E,0x4F75, + 0x4F6E,0x4F6A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x543A,0x5424, + INVALC,0x5434,INVALC,0x5439,INVALC,INVALC,INVALC,INVALC, + 0x5427,INVALC,0x5430,INVALC,INVALC,INVALC,0x543D,INVALC, + /* Block 81, Array index 0x1000 */ + 0x5431,INVALC,INVALC,INVALC,INVALC,INVALC,0x542A,INVALC, + INVALC,0x543F,INVALC,0x5436,0x5421,0x5422,INVALC,0x5924, + INVALC,0x542F,0x542E,INVALC,0x5432,INVALC,0x5429,INVALC, + 0x5438,0x5437,0x542D,INVALC,INVALC,INVALC,INVALC,0x542C, + INVALC,0x5435,INVALC,0x5423,INVALC,0x5426,0x5425,INVALC, + 0x5433,0x5428,0x543C,0x543E,INVALC,0x543B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x542B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5876,INVALC,INVALC,INVALC,0x5875, + INVALC,0x5879,INVALC,INVALC,0x5877,INVALC,0x587C,0x5923, + INVALC,INVALC,INVALC,INVALC,INVALC,0x587D,INVALC,INVALC, + INVALC,INVALC,0x5878,INVALC,0x5874,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x587A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5926,INVALC,0x5925, + INVALC,INVALC,INVALC,INVALC,0x5921,0x587E,0x587B,0x5922, + INVALC,INVALC,0x5872,INVALC,INVALC,0x5873,INVALC,INVALC, + 0x5E2E,INVALC,INVALC,INVALC,INVALC,0x5E2B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E2A,INVALC,INVALC, + INVALC,0x5E2D,INVALC,INVALC,INVALC,INVALC,0x5E2F,INVALC, + 0x5E30,0x5E2C,0x5E31,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E29,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6331,0x632B,INVALC,0x6334, + INVALC,INVALC,0x632D,0x632E,INVALC,0x632C,INVALC,0x6332, + INVALC,INVALC,INVALC,0x6333,INVALC,INVALC,0x6330,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x632F,INVALC,0x6335, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x677C,0x6779, + INVALC,0x677A,INVALC,INVALC,INVALC,0x6778,0x6775,INVALC, + INVALC,INVALC,0x6777,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6774,INVALC,0x6772, + INVALC,0x677D,INVALC,INVALC,INVALC,0x6776,0x6773,INVALC, + INVALC,0x677B,INVALC,INVALC,INVALC,0x6C23,INVALC,INVALC, + INVALC,0x6C24,INVALC,0x6C22,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x1100 */ + 0x6C21,INVALC,0x6C25,INVALC,0x6B7E,0x6C28,INVALC,INVALC, + 0x6C26,0x6C27,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7033,INVALC,0x7030,INVALC,0x7032,0x7034,INVALC,INVALC, + 0x7031,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7341, + INVALC,0x7342,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7340,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7343,0x782B,INVALC,INVALC,INVALC,0x7A62, + 0x7A63,INVALC,INVALC,0x7B58,0x7B57,INVALC,INVALC,0x442A, + 0x4442,0x4478,INVALC,0x4477,0x4573,0x4572,0x473E,0x473D, + 0x473F,0x473C,INVALC,0x492C,0x492B,0x492D,INVALC,INVALC, + INVALC,INVALC,0x4C23,INVALC,0x4C22,0x4C24,INVALC,0x5022, + INVALC,0x2279,INVALC,0x227A,0x5927,0x227C,0x227B,INVALC, + INVALC,0x227D,0x677E,0x227E,INVALC,0x442B,INVALC,0x4479, + 0x4740,0x4C25,INVALC,0x442C,0x447C,0x447A,0x447B,INVALC, + INVALC,0x4741,INVALC,INVALC,INVALC,0x492E,0x4C27,0x4C26, + 0x4C28,INVALC,INVALC,INVALC,0x5440,INVALC,INVALC,INVALC, + 0x7035,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4574,0x4575,INVALC,INVALC,0x4742,INVALC,INVALC, + INVALC,0x5024,0x5023,INVALC,INVALC,0x5928,INVALC,0x447D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5025,INVALC,0x5443,INVALC,0x5441,0x5442,INVALC,INVALC, + INVALC,INVALC,0x7036,INVALC,0x4576,INVALC,INVALC,INVALC, + 0x4743,INVALC,INVALC,INVALC,INVALC,INVALC,0x492F,0x4930, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C29,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5446,INVALC, + INVALC,INVALC,INVALC,0x5447,0x5445,0x5444,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C29,0x7037,INVALC,INVALC, + 0x442D,0x443B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5929,0x5E33,INVALC,0x6821,INVALC,INVALC,0x447E,INVALC, + 0x4579,0x4577,0x4578,INVALC,INVALC,0x4C2A,INVALC,INVALC, + /* Block 83, Array index 0x1200 */ + 0x442E,0x442F,INVALC,0x4443,INVALC,INVALC,0x4521,0x4522, + 0x4523,INVALC,0x457A,INVALC,INVALC,INVALC,0x4747,INVALC, + INVALC,0x4745,0x4746,INVALC,INVALC,INVALC,0x4748,0x4744, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F4F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4932,0x4931,INVALC,INVALC, + 0x4935,0x4933,0x4934,INVALC,INVALC,INVALC,0x4C30,INVALC, + 0x4C2F,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C31,0x4C2D, + 0x4C2C,INVALC,0x4C2E,0x4C2B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C32,INVALC,0x5027,INVALC,INVALC,INVALC,0x502C, + INVALC,INVALC,0x5028,0x502B,0x502A,0x5029,0x5026,INVALC, + INVALC,INVALC,INVALC,INVALC,0x544A,INVALC,0x5448,INVALC, + INVALC,INVALC,INVALC,0x544B,0x5449,0x544C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E37,0x592A,INVALC,INVALC,INVALC,INVALC,0x592B, + INVALC,INVALC,0x5E34,INVALC,0x5E35,0x5E36,INVALC,0x6337, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6338,INVALC,0x6336, + INVALC,INVALC,0x6823,0x6822,INVALC,INVALC,INVALC,0x6C2A, + 0x6C2B,0x6C2C,0x6C2E,INVALC,INVALC,0x6C2D,INVALC,INVALC, + INVALC,0x7038,INVALC,0x7039,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4430,INVALC,INVALC,INVALC,0x457C, + 0x457B,INVALC,INVALC,0x4749,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4937,0x4938,0x4936,0x4939,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4C34,INVALC,INVALC,0x4C33,INVALC, + INVALC,0x5030,INVALC,0x502F,INVALC,INVALC,INVALC,0x502D, + INVALC,0x502E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x592C,INVALC,INVALC,0x592F,INVALC,0x5B2B, + 0x592E,0x592D,INVALC,0x5E3A,INVALC,0x5E39,0x5E38,0x6339, + INVALC,INVALC,0x633C,0x633D,0x633B,INVALC,0x633A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C2F,INVALC,INVALC,0x703A,INVALC,0x7344,INVALC,INVALC, + 0x7961,INVALC,0x4444,0x4524,INVALC,INVALC,0x4525,0x4526, + /* Block 84, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x457D,0x457E,INVALC, + 0x474A,INVALC,INVALC,INVALC,INVALC,0x5031,INVALC,0x5931, + 0x5930,INVALC,INVALC,INVALC,INVALC,0x4431,0x4527,0x4621, + INVALC,0x5932,INVALC,INVALC,INVALC,0x4622,INVALC,INVALC, + 0x474C,0x474B,INVALC,0x493A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x544D,INVALC,INVALC,INVALC,INVALC,0x633E, + INVALC,0x6824,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4528,INVALC,INVALC,INVALC,INVALC,0x5935,0x5933, + 0x5934,0x4432,INVALC,0x4445,0x243F,0x452B,INVALC,0x452A, + 0x4529,0x4625,0x4624,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C38,0x4C35,0x4C37,0x4C36,INVALC,INVALC,0x5032, + INVALC,INVALC,0x5E3B,INVALC,0x4433,INVALC,0x452C,INVALC, + 0x4627,0x4626,INVALC,INVALC,INVALC,INVALC,0x4C39,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4629,0x4628, + 0x474D,0x474E,INVALC,0x493B,INVALC,0x493C,INVALC,0x4C3A, + 0x4C3B,0x4C3C,INVALC,0x5033,INVALC,INVALC,INVALC,0x544E, + INVALC,INVALC,INVALC,INVALC,0x452D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5034,INVALC,INVALC,0x5450,INVALC,0x544F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E3C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6825,INVALC,INVALC, + INVALC,INVALC,0x6C30,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x462A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5936,INVALC,INVALC,INVALC,INVALC, + 0x4434,0x4446,0x452F,0x452E,INVALC,0x4530,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C3E,INVALC,0x4C3D,0x4C3F, + INVALC,INVALC,INVALC,0x5035,INVALC,INVALC,INVALC,0x5451, + INVALC,INVALC,0x763B,0x4447,0x462C,0x463B,0x4636,INVALC, + 0x4631,0x4630,0x4637,0x4635,0x462E,0x463C,0x462F,0x462B, + 0x463A,0x4639,0x4638,0x462D,INVALC,0x4634,INVALC,INVALC, + 0x4633,INVALC,INVALC,0x463D,0x4632,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x1400 */ + INVALC,0x4754,INVALC,0x475A,0x4756,INVALC,0x475C,INVALC, + 0x4759,0x474F,0x4752,0x4755,0x4751,0x4758,0x475B,0x4750, + 0x4753,0x4757,0x475D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4949,INVALC,0x493D,0x493F,0x4957, + 0x4952,INVALC,INVALC,INVALC,INVALC,INVALC,0x4941,0x4943, + INVALC,0x494A,INVALC,0x4956,0x4958,0x493E,0x494F,INVALC, + INVALC,0x4955,INVALC,0x4946,INVALC,0x4950,0x4951,INVALC, + 0x494E,0x494C,INVALC,0x494D,0x4953,INVALC,0x4940,INVALC, + 0x4954,INVALC,0x4948,0x4945,INVALC,INVALC,0x4944,INVALC, + 0x4947,INVALC,0x494B,INVALC,INVALC,INVALC,0x4942,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C51,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C4D,INVALC,0x4C40,INVALC,0x4C41,0x4C4E,0x4C47, + 0x4C43,INVALC,INVALC,0x4C46,0x4C4B,0x4C54,INVALC,INVALC, + 0x4C45,INVALC,INVALC,INVALC,0x4C48,INVALC,0x4C4A,INVALC, + INVALC,INVALC,INVALC,0x4C53,0x4C4F,INVALC,0x4C55,INVALC, + 0x4C4C,INVALC,0x4C49,INVALC,INVALC,0x4C44,0x4C42,INVALC, + INVALC,INVALC,0x4C50,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x503C,0x504A, + 0x5038,0x5049,0x5041,0x5046,0x5036,INVALC,INVALC,0x5045, + INVALC,0x5047,INVALC,0x503D,INVALC,INVALC,INVALC,INVALC, + 0x503B,INVALC,INVALC,0x5048,INVALC,0x5040,INVALC,0x504B, + 0x5037,0x5042,0x503F,INVALC,0x5043,INVALC,INVALC,0x503E, + 0x5044,0x503A,INVALC,INVALC,INVALC,INVALC,0x5039,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x545E,INVALC,INVALC,INVALC,0x5457,0x5462,INVALC, + 0x5452,0x545C,0x5461,INVALC,INVALC,0x545D,0x5460,INVALC, + INVALC,INVALC,0x5458,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x545A,INVALC,0x5456,0x5465,INVALC,INVALC, + /* Block 86, Array index 0x1500 */ + INVALC,0x5454,INVALC,INVALC,INVALC,INVALC,0x5459,0x5464, + INVALC,0x545F,INVALC,INVALC,INVALC,INVALC,INVALC,0x5466, + 0x5453,INVALC,INVALC,INVALC,0x545B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5463, + INVALC,INVALC,INVALC,INVALC,0x5949,INVALC,0x5947,0x5944, + INVALC,0x5940,INVALC,0x594B,INVALC,INVALC,INVALC,0x5455, + 0x5946,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E4E,INVALC, + INVALC,0x594C,INVALC,0x593E,0x593B,INVALC,0x5938,INVALC, + INVALC,INVALC,0x593F,INVALC,INVALC,INVALC,INVALC,0x5942, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5943,0x5941,0x594D, + INVALC,INVALC,INVALC,INVALC,0x5948,INVALC,0x593C,0x5A76, + INVALC,0x593D,INVALC,0x594A,0x5945,INVALC,0x593A,INVALC, + INVALC,INVALC,0x5939,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E3D,0x5E40,INVALC,0x5E54,INVALC, + 0x5E3E,INVALC,0x5E44,0x5E4A,0x6143,INVALC,INVALC,0x5E48, + INVALC,0x5E55,0x5E41,0x5E49,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E47,INVALC,INVALC,INVALC, + 0x5E43,0x5E57,0x5E50,INVALC,0x5E45,0x5E42,INVALC,0x5E4D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E3F, + INVALC,INVALC,0x5E46,0x5E56,0x5E52,INVALC,0x5E4C,INVALC, + INVALC,0x5E53,0x5E4F,0x5E4B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E51,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x634C,0x634D,0x6345, + INVALC,0x634F,INVALC,INVALC,INVALC,INVALC,0x6343,INVALC, + INVALC,0x6346,INVALC,0x6341,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x634A,INVALC,0x6344,INVALC,INVALC,0x633F, + INVALC,0x634B,INVALC,0x6347,0x6348,0x634E,0x6342,0x2321, + 0x6340,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6349, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6835,0x6830, + INVALC,INVALC,INVALC,INVALC,INVALC,0x682A,0x6826,INVALC, + /* Block 87, Array index 0x1600 */ + 0x6827,INVALC,INVALC,INVALC,INVALC,INVALC,0x682C,INVALC, + 0x6833,0x682D,INVALC,INVALC,INVALC,0x682E,0x682F,INVALC, + 0x6834,INVALC,INVALC,INVALC,0x682B,INVALC,0x6831,0x6829, + INVALC,INVALC,INVALC,0x6828,INVALC,INVALC,INVALC,0x6832, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C37,INVALC,INVALC,INVALC,INVALC,0x6C31,0x6C3D, + 0x6C3E,INVALC,0x6C34,INVALC,0x6C36,INVALC,0x6C3C,INVALC, + INVALC,0x6C33,INVALC,0x6C32,INVALC,INVALC,INVALC,0x6C35, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C39,INVALC, + INVALC,INVALC,INVALC,0x6C38,INVALC,INVALC,INVALC,0x6C3A, + INVALC,0x703B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7047,INVALC,0x703F,0x7043,INVALC,INVALC, + 0x7042,0x703E,0x7041,0x703C,0x7046,INVALC,INVALC,0x7045, + INVALC,0x7044,INVALC,INVALC,0x6C3B,INVALC,0x7048,INVALC, + 0x7040,0x703D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7346,INVALC,INVALC,INVALC,INVALC,0x7348,INVALC,0x7349, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7345,0x734A, + 0x7347,INVALC,INVALC,INVALC,INVALC,0x763C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x782C,INVALC,INVALC, + 0x782D,INVALC,INVALC,INVALC,INVALC,INVALC,0x763D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7964,INVALC,0x7963,0x7962, + INVALC,INVALC,INVALC,INVALC,0x7965,INVALC,INVALC,INVALC, + 0x7A65,0x7A64,0x7A66,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7B59,0x7B5B,0x7B5A,INVALC,0x7C34,INVALC,INVALC,INVALC, + INVALC,0x7C5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x463F,0x463E,INVALC,0x4760,0x475F,INVALC, + 0x475E,INVALC,INVALC,INVALC,0x495B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4959,0x495C,INVALC,INVALC,INVALC,INVALC, + 0x495A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C56,INVALC,INVALC,INVALC,INVALC,0x504C, + /* Block 88, Array index 0x1700 */ + INVALC,INVALC,INVALC,0x5467,0x5468,INVALC,INVALC,INVALC, + 0x594E,0x5950,INVALC,0x594F,INVALC,0x5E58,INVALC,INVALC, + INVALC,INVALC,0x6350,0x6351,INVALC,INVALC,0x6837,INVALC, + 0x6836,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4448, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4763,0x4767,INVALC,INVALC,0x4765,0x4764,INVALC,0x4766, + 0x4762,INVALC,INVALC,0x4761,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4966,INVALC,INVALC,0x4963,INVALC, + 0x495F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4961, + INVALC,INVALC,0x495D,INVALC,INVALC,0x4960,0x4962,0x4965, + 0x4964,0x495E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C5B,INVALC,INVALC,0x4C5D,INVALC,0x4C5C,INVALC, + INVALC,0x4C5A,0x4C59,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C58, + INVALC,INVALC,INVALC,INVALC,0x4C5E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x504D,0x4C57,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x504E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5054,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x504F,INVALC,0x5051,0x5050,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5053,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5469,0x546C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x546B,INVALC,INVALC,0x5052,INVALC, + INVALC,INVALC,INVALC,INVALC,0x546A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5951, + 0x5955,INVALC,INVALC,INVALC,0x5956,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x595A, + INVALC,0x595B,0x5957,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x1800 */ + INVALC,INVALC,0x5958,INVALC,INVALC,0x5952,0x5954,INVALC, + INVALC,0x546D,0x5953,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E60,INVALC,INVALC, + 0x5E61,0x5E5F,INVALC,INVALC,0x5E5C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E5A,INVALC,INVALC,INVALC,INVALC,0x5E59, + 0x5E5D,0x5E5E,INVALC,INVALC,0x5E5B,0x5959,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x635B,0x635E,0x6359,INVALC,INVALC,INVALC, + INVALC,0x6353,0x635D,INVALC,0x6357,INVALC,INVALC,0x6355, + 0x6354,INVALC,0x6356,INVALC,INVALC,INVALC,0x6352,INVALC, + INVALC,INVALC,0x635C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6358,INVALC,0x635A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6838,INVALC,INVALC, + INVALC,0x683D,INVALC,INVALC,INVALC,0x683F,0x6839,INVALC, + 0x6C3F,INVALC,INVALC,0x683A,INVALC,0x683E,INVALC,INVALC, + INVALC,INVALC,0x683C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x683B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C43,INVALC,0x6C41,0x6C40, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C46,INVALC, + 0x702E,0x6C45,INVALC,INVALC,INVALC,INVALC,0x6C44,INVALC, + INVALC,INVALC,INVALC,0x6C42,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x704A,INVALC, + INVALC,0x7049,INVALC,INVALC,INVALC,0x704C,INVALC,0x704B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x734E,INVALC, + INVALC,0x734D,INVALC,0x734C,INVALC,0x734B,INVALC,INVALC, + 0x763F,0x763E,INVALC,INVALC,INVALC,INVALC,0x782E,0x782F, + INVALC,INVALC,0x7830,INVALC,0x7966,INVALC,INVALC,INVALC, + INVALC,0x7C5E,INVALC,0x4449,0x4531,INVALC,INVALC,0x4967, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E62,0x5E63,INVALC,INVALC,0x6840,INVALC,INVALC, + /* Block 90, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x546E, + INVALC,INVALC,INVALC,INVALC,0x7A67,0x444A,0x4640,INVALC, + INVALC,0x4768,0x4769,INVALC,0x4C5F,INVALC,INVALC,INVALC, + 0x595C,INVALC,0x6842,INVALC,0x6843,0x6841,INVALC,0x444B, + INVALC,0x4532,0x4534,0x4533,INVALC,0x4535,0x4641,INVALC, + INVALC,0x4642,INVALC,INVALC,INVALC,INVALC,INVALC,0x476A, + 0x476B,INVALC,INVALC,INVALC,INVALC,INVALC,0x4968,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C63,INVALC,INVALC,0x4C61, + 0x4C62,0x4C60,INVALC,INVALC,INVALC,INVALC,0x5058,0x5057, + 0x5059,0x5056,INVALC,INVALC,0x4C64,0x5055,INVALC,0x546F, + 0x5470,INVALC,0x5471,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E64,INVALC,0x595D,INVALC,INVALC,INVALC,INVALC,0x635F, + INVALC,0x6845,0x6844,INVALC,INVALC,0x6C47,0x704D,INVALC, + INVALC,INVALC,INVALC,0x444C,0x4643,INVALC,0x4644,INVALC, + 0x476D,0x4770,INVALC,INVALC,INVALC,0x476F,INVALC,INVALC, + INVALC,0x4772,0x4771,0x476E,0x476C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4973,INVALC,INVALC,0x4970,INVALC,INVALC, + INVALC,INVALC,0x496A,0x4972,INVALC,INVALC,0x496F,INVALC, + INVALC,0x496E,INVALC,INVALC,INVALC,0x4969,0x496C,INVALC, + INVALC,INVALC,INVALC,0x496D,0x4971,0x4974,INVALC,INVALC, + 0x496B,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C69,0x4C71, + INVALC,INVALC,INVALC,0x4C72,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C68,INVALC,0x4C66,INVALC,INVALC,0x4C65,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C74,0x4C6B,INVALC, + INVALC,INVALC,0x4C70,0x4C6E,INVALC,0x4C6D,INVALC,INVALC, + 0x4C6C,0x4C6A,0x4C73,0x4C6F,0x4C67,INVALC,INVALC,INVALC, + 0x505B,INVALC,0x5062,INVALC,0x505A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x505D,INVALC,0x5060,0x5063,INVALC, + 0x505E,INVALC,0x5061,INVALC,0x5478,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5065,INVALC,INVALC,INVALC,0x505C, + /* Block 91, Array index 0x1A00 */ + INVALC,0x5064,INVALC,0x505F,INVALC,INVALC,INVALC,INVALC, + INVALC,0x547E,INVALC,INVALC,0x547D,INVALC,INVALC,INVALC, + INVALC,0x5472,INVALC,0x5477,INVALC,INVALC,INVALC,INVALC, + 0x5473,INVALC,INVALC,0x5476,0x5474,INVALC,INVALC,0x5475, + 0x5479,INVALC,INVALC,0x547A,INVALC,0x547C,INVALC,INVALC, + INVALC,0x547B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x595E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5964,INVALC,INVALC,INVALC, + 0x5963,0x595F,INVALC,INVALC,INVALC,INVALC,0x5967,INVALC, + INVALC,0x5960,0x5968,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5966,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5965,INVALC,INVALC,INVALC,0x5961,INVALC, + INVALC,INVALC,0x5962,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E65, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E67, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E68,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E66,0x5E69,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E6A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6368,0x6366,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6365,0x6364,0x6363,INVALC, + INVALC,0x6360,0x6367,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6361,INVALC,INVALC,0x6362,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x684A,0x6849, + 0x684B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6846,INVALC,0x684C,INVALC,INVALC,0x6847,INVALC, + INVALC,0x6848,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C4B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C49,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C4D,0x6C48,INVALC,0x6C4A,0x6C4C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x704E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7351,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7350,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x734F,INVALC,INVALC,INVALC,0x704F,INVALC,INVALC,INVALC, + 0x7640,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7967,INVALC,INVALC,0x7968,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x444D,0x444E,INVALC,0x444F,0x4536,0x4645,INVALC,0x4773, + 0x4774,INVALC,0x4977,0x4978,0x4976,0x4975,INVALC,0x4C75, + INVALC,INVALC,INVALC,0x4C77,0x4C76,INVALC,INVALC,INVALC, + INVALC,0x5066,INVALC,0x5521,INVALC,INVALC,INVALC,INVALC, + 0x5969,0x5E6C,INVALC,0x5E6B,INVALC,0x684D,INVALC,INVALC, + 0x7050,INVALC,0x7352,INVALC,INVALC,0x7969,INVALC,0x7B5C, + INVALC,INVALC,INVALC,0x4646,INVALC,0x4777,INVALC,0x4775, + 0x4776,0x4778,INVALC,0x497A,0x4979,INVALC,INVALC,0x497B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C78, + 0x4C7A,0x4C7C,0x4C79,0x4C7D,0x4C7B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x506A,0x5067,0x5069,0x506B,0x5068,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5527,INVALC, + 0x5523,INVALC,INVALC,0x5524,0x5526,0x5528,0x5525,INVALC, + 0x552A,0x5529,INVALC,INVALC,INVALC,INVALC,INVALC,0x596E, + INVALC,INVALC,0x596D,INVALC,0x596C,0x596B,0x596F,0x596A, + INVALC,INVALC,INVALC,INVALC,0x5E6E,INVALC,INVALC,INVALC, + 0x5E70,INVALC,0x5E6D,0x5E6F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x684E,0x6856, + INVALC,0x6850,0x6854,INVALC,0x6855,0x6851,0x6852,0x684F, + 0x6853,0x6C50,INVALC,0x6C51,0x6C4F,INVALC,0x6C4E,INVALC, + 0x7051,INVALC,INVALC,INVALC,INVALC,0x7831,0x796A,INVALC, + 0x4450,INVALC,0x4779,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x1C00 */ + INVALC,0x506C,INVALC,INVALC,0x552B,INVALC,INVALC,0x5972, + 0x5971,0x5970,0x5E71,0x5E72,INVALC,0x6857,0x7052,0x4451, + INVALC,0x4537,INVALC,INVALC,INVALC,INVALC,0x477A,INVALC, + INVALC,INVALC,0x4C7E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4452,INVALC,0x4538,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x497C,INVALC,INVALC,INVALC, + INVALC,0x5E73,INVALC,INVALC,INVALC,INVALC,INVALC,0x7353, + 0x4453,0x4467,0x4539,INVALC,0x4647,INVALC,0x4A22,0x4A21, + 0x497D,0x497E,INVALC,INVALC,INVALC,0x4D22,0x4D23,INVALC, + 0x4D21,INVALC,INVALC,0x5070,INVALC,0x506F,0x506D,0x506E, + 0x552E,0x552C,INVALC,INVALC,INVALC,0x552D,INVALC,INVALC, + 0x5522,INVALC,INVALC,INVALC,0x5974,0x5975,INVALC,INVALC, + 0x5973,INVALC,0x6858,INVALC,0x6C52,0x6C53,INVALC,INVALC, + 0x7354,INVALC,INVALC,INVALC,0x7A68,INVALC,INVALC,0x453A, + INVALC,0x4454,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x477B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A26,INVALC,INVALC,INVALC, + 0x4A23,0x4A24,INVALC,INVALC,0x4A25,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D25,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D27,INVALC,0x4D28,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D29,INVALC,0x4D2A,INVALC,INVALC,INVALC,0x4D24, + 0x4D26,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5072,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5071,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5533,INVALC,0x5532,INVALC,INVALC,0x552F,INVALC,INVALC, + 0x5534,INVALC,INVALC,INVALC,0x5537,INVALC,0x5535,INVALC, + INVALC,INVALC,INVALC,0x5531,INVALC,0x5530,INVALC,INVALC, + /* Block 94, Array index 0x1D00 */ + INVALC,0x5536,INVALC,INVALC,INVALC,INVALC,0x5977,0x5976, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5978,INVALC, + INVALC,0x597C,INVALC,INVALC,0x597E,INVALC,0x597A,0x5A24, + INVALC,0x5A21,INVALC,0x5979,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x597B,INVALC,0x5A22,INVALC,INVALC,0x5A23, + INVALC,0x597D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E76,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E77, + INVALC,INVALC,INVALC,INVALC,0x5E74,INVALC,INVALC,INVALC, + 0x5E75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6369,INVALC,INVALC,INVALC,INVALC,INVALC,0x636A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6859,INVALC,INVALC,0x685A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C55,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C54,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7358,INVALC,0x7356,INVALC,0x7355,0x7357,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x796B,INVALC,INVALC,INVALC,0x7A69,INVALC,INVALC, + INVALC,INVALC,0x7B5E,INVALC,0x7B5D,INVALC,0x7C35,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4455,0x477C,INVALC, + INVALC,0x4B56,0x5A25,INVALC,INVALC,0x4456,0x464A,0x4649, + 0x4648,INVALC,INVALC,0x4A27,INVALC,INVALC,0x5538,INVALC, + INVALC,0x4457,0x4458,0x4459,0x453B,INVALC,INVALC,0x5073, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E78,0x445A,INVALC, + /* Block 95, Array index 0x1E00 */ + INVALC,INVALC,0x464B,0x464C,INVALC,INVALC,0x477D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A28,INVALC,INVALC,INVALC, + INVALC,0x4D30,INVALC,INVALC,INVALC,0x4D2E,0x4D2D,INVALC, + 0x4D2B,INVALC,0x4D2C,0x4D2F,INVALC,0x5074,INVALC,0x5076, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5075,INVALC,INVALC, + INVALC,INVALC,INVALC,0x553A,INVALC,0x5539,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A28,INVALC,INVALC,0x5A27,0x5A29, + 0x5A26,INVALC,INVALC,INVALC,INVALC,0x5E7A,INVALC,INVALC, + 0x5E7B,INVALC,INVALC,0x5E7C,INVALC,0x5E79,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x636B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x685F,0x685D,INVALC,0x685E, + INVALC,INVALC,INVALC,0x685B,INVALC,INVALC,INVALC,0x6C57, + INVALC,0x6C58,0x6C56,0x685C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7359,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x445B,0x464D,0x4821,INVALC,0x477E,INVALC, + 0x4D31,0x636C,INVALC,0x453C,0x464E,0x5077,0x5E7D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A2A, + INVALC,INVALC,0x4A2B,INVALC,INVALC,INVALC,INVALC,0x4A29, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D35,0x4D36,0x4D33, + INVALC,INVALC,0x4D32,INVALC,0x4D34,INVALC,INVALC,INVALC, + 0x5078,INVALC,INVALC,INVALC,INVALC,INVALC,0x5079,0x553D, + INVALC,INVALC,INVALC,0x553B,INVALC,0x553C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A2D,0x5A2C,0x5A2A, + 0x5A2B,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A2E,INVALC, + INVALC,0x5F21,0x5F22,INVALC,0x5F23,INVALC,INVALC,INVALC, + 0x636E,0x636D,0x5E7E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6860,INVALC,INVALC,0x6861,INVALC, + INVALC,INVALC,0x6C5A,INVALC,INVALC,0x6C5C,INVALC,0x6C5B, + 0x6C5E,INVALC,0x6C59,0x6C5D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7833,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7D22,INVALC,INVALC,0x4D37,0x4A2C, + INVALC,INVALC,0x507A,INVALC,INVALC,INVALC,0x445C,0x453D, + /* Block 96, Array index 0x1F00 */ + INVALC,0x464F,INVALC,INVALC,0x4A2D,INVALC,INVALC,INVALC, + 0x507B,INVALC,0x6862,0x445D,INVALC,INVALC,INVALC,0x4822, + INVALC,INVALC,0x636F,0x445E,0x453E,0x453F,INVALC,0x4651, + 0x4650,INVALC,INVALC,0x4823,INVALC,INVALC,INVALC,0x4A2E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D38,0x4D39, + INVALC,0x4D3A,INVALC,INVALC,INVALC,0x507C,INVALC,INVALC, + INVALC,0x553E,INVALC,INVALC,INVALC,0x5A2F,INVALC,0x5A30, + INVALC,INVALC,INVALC,INVALC,0x5F24,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6863,INVALC, + 0x6C5F,INVALC,0x7053,INVALC,0x735A,INVALC,0x7B5F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A31, + INVALC,0x6370,INVALC,INVALC,INVALC,INVALC,0x7641,INVALC, + INVALC,INVALC,0x4A30,INVALC,0x4A2F,0x507D,INVALC,INVALC, + INVALC,0x5A33,0x5D29,0x5A34,0x5A32,0x5F25,INVALC,INVALC, + 0x6864,0x6C60,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A31, + INVALC,0x4A32,INVALC,INVALC,0x4D3E,INVALC,INVALC,0x4D3D, + 0x4D3B,0x4D3C,INVALC,INVALC,INVALC,0x5121,INVALC,0x5124, + 0x507E,0x5126,0x5122,0x5123,0x5125,INVALC,INVALC,INVALC, + 0x5541,0x5540,0x553F,INVALC,INVALC,INVALC,INVALC,0x5A35, + 0x5A38,0x5A36,INVALC,INVALC,0x5A3B,INVALC,0x5A37,INVALC, + 0x5A3A,0x5A39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F28,0x5F26,0x5F27,INVALC,0x6371,INVALC,0x6372,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C62,INVALC,0x6C61, + INVALC,0x6865,INVALC,INVALC,INVALC,0x735B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4540,INVALC,0x4652,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A34,0x4A36,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4825,0x4A35, + 0x4A33,0x4824,INVALC,INVALC,INVALC,0x4D3F,INVALC,INVALC, + 0x4D40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A3A,0x4A38,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A37,INVALC,INVALC,INVALC,0x4D42,INVALC,INVALC, + 0x4A39,INVALC,INVALC,INVALC,INVALC,0x4D41,INVALC,0x4D43, + /* Block 97, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x512B,0x4D44, + INVALC,INVALC,0x5127,INVALC,0x4D45,0x4D4A,0x4D48,INVALC, + INVALC,INVALC,INVALC,0x4D4F,INVALC,0x5128,INVALC,INVALC, + 0x5129,0x4D4B,INVALC,INVALC,INVALC,0x512A,INVALC,0x4D4C, + 0x512C,0x4D4D,0x4D49,0x4D4E,INVALC,INVALC,INVALC,0x4D46, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D47,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5132,INVALC,INVALC,0x5131,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x512D,INVALC,INVALC, + 0x5545,INVALC,INVALC,INVALC,INVALC,0x5546,INVALC,INVALC, + INVALC,0x5542,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5130,0x5543,0x5136,0x5544,INVALC,INVALC, + 0x512F,0x5548,0x5135,0x5134,0x5133,0x5547,INVALC,0x5549, + 0x512E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A3C, + INVALC,INVALC,INVALC,INVALC,0x554A,0x5550,INVALC,INVALC, + INVALC,0x5A3E,INVALC,INVALC,0x554F,0x554D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x554E,INVALC,0x5551,INVALC, + INVALC,INVALC,0x554C,INVALC,INVALC,INVALC,INVALC,0x554B, + 0x5A3F,INVALC,INVALC,0x5A3D,INVALC,INVALC,INVALC,INVALC, + 0x5A40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F2B,INVALC,0x5A42,0x5A47,0x5F2C,INVALC, + 0x5A4E,INVALC,INVALC,0x5A46,0x5A49,0x5A44,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A45,0x5A4C,0x5A50, + INVALC,INVALC,INVALC,0x5A41,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F29,INVALC,INVALC,INVALC,0x5A4B,INVALC,INVALC, + 0x5A4A,INVALC,0x5A4F,INVALC,0x5A48,INVALC,INVALC,0x5A4D, + 0x5F2D,0x5F2A,INVALC,INVALC,INVALC,INVALC,0x5A43,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F32,0x5F36,INVALC,0x6377,0x5F34,INVALC,0x5F38,INVALC, + INVALC,0x6379,0x5F30,0x5F33,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x2100 */ + 0x5F3A,0x637A,INVALC,INVALC,INVALC,INVALC,0x6426,INVALC, + 0x637B,0x5F39,INVALC,INVALC,INVALC,0x6425,0x5F37,0x6374, + INVALC,INVALC,0x5F3B,INVALC,INVALC,0x5F31,INVALC,INVALC, + INVALC,INVALC,0x6373,0x6378,0x5F2E,INVALC,INVALC,0x6376, + INVALC,INVALC,INVALC,0x5F2F,INVALC,INVALC,INVALC,0x6424, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6423,INVALC,INVALC,0x6427, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6422,0x6867, + INVALC,INVALC,INVALC,INVALC,0x637E,INVALC,INVALC,0x6866, + 0x6375,INVALC,INVALC,0x6868,0x637D,0x6421,0x637C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C67,INVALC,INVALC, + 0x686E,INVALC,0x686D,INVALC,INVALC,0x6C66,INVALC,0x686C, + INVALC,INVALC,0x686A,0x686B,INVALC,INVALC,INVALC,0x6C64, + 0x5F35,INVALC,INVALC,0x6C6B,INVALC,INVALC,0x6C65,INVALC, + 0x6C6A,INVALC,INVALC,INVALC,INVALC,0x686F,0x6C63,0x6869, + INVALC,INVALC,INVALC,INVALC,0x6C69,INVALC,0x6C6C,INVALC, + INVALC,INVALC,0x6C68,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7057,INVALC,INVALC,INVALC,0x6C70,INVALC, + 0x6C6E,0x7055,INVALC,INVALC,0x6C74,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C72,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C73,INVALC,INVALC,0x6C6D, + INVALC,0x7056,INVALC,0x6C6F,0x6C71,INVALC,0x6C75,INVALC, + INVALC,INVALC,0x7054,INVALC,INVALC,INVALC,0x7059,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x705A,INVALC, + INVALC,INVALC,0x735D,INVALC,INVALC,INVALC,INVALC,0x735E, + 0x705C,0x735C,0x705B,0x7360,INVALC,0x7058,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7642,INVALC,INVALC,0x735F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7834,INVALC,INVALC,0x7837,0x7836,0x7835, + 0x796C,INVALC,0x796D,INVALC,0x7A6A,INVALC,0x7A6B,0x7B60, + /* Block 99, Array index 0x2200 */ + 0x7C36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4541,INVALC,0x4653,INVALC,0x4827,0x4828,0x4826,INVALC, + 0x4829,0x4A3C,0x4A3B,INVALC,INVALC,0x4D51,0x4D50,INVALC, + INVALC,INVALC,0x5A51,0x5A52,INVALC,INVALC,INVALC,0x5F3C, + INVALC,0x6428,0x6429,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6870,INVALC,INVALC,INVALC,0x6C76,INVALC, + 0x705D,INVALC,0x7361,0x7643,0x7362,INVALC,0x4542,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D53,0x4D52, + 0x4D54,0x5137,INVALC,INVALC,INVALC,INVALC,INVALC,0x5552, + 0x5A53,0x5F3D,INVALC,0x4543,INVALC,0x445F,0x4544,INVALC, + INVALC,0x4657,0x4656,0x4654,0x4655,INVALC,INVALC,INVALC, + 0x482C,INVALC,INVALC,0x482B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x482A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A43,0x4A4C,0x4A4A, + INVALC,INVALC,INVALC,0x4A48,INVALC,INVALC,0x4A41,INVALC, + INVALC,0x4A47,INVALC,INVALC,0x4A45,INVALC,0x4A46,0x4D55, + 0x4A40,INVALC,INVALC,INVALC,0x4A3D,INVALC,0x4A50,INVALC, + INVALC,0x4A42,0x4A44,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A4F,0x4A49,0x4A4E,INVALC,0x4A4D,0x4A3F,0x4A3E, + 0x4A4B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D63,INVALC,INVALC,0x4D5E,0x4D71,INVALC,INVALC,INVALC, + INVALC,0x4D6C,INVALC,INVALC,INVALC,0x4D6A,INVALC,INVALC, + INVALC,0x4D5B,INVALC,INVALC,0x4D65,0x4D64,INVALC,0x4D59, + INVALC,INVALC,0x4D5A,INVALC,0x4D58,INVALC,0x4D70,0x4D68, + 0x4D62,0x4D56,INVALC,0x4D61,0x4D57,0x4D69,0x4D72,INVALC, + 0x4D66,INVALC,0x4D5C,0x4D5F,0x4D60,INVALC,0x4D6E,0x4D6F, + 0x4D6D,0x4D67,0x4D6B,0x4D5D,0x5138,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5144,0x513C,0x513E,0x5143, + INVALC,0x5141,INVALC,0x5553,0x5146,INVALC,INVALC,0x5142, + INVALC,INVALC,INVALC,INVALC,0x513B,0x513F,0x5145,0x5555, + /* Block 100, Array index 0x2300 */ + INVALC,0x513D,0x5148,INVALC,INVALC,INVALC,INVALC,0x5140, + 0x5554,0x513A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5147,INVALC,INVALC,INVALC,INVALC,0x5139,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5563,INVALC,0x5561,0x5562,INVALC,INVALC,INVALC,0x5558, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x555E,INVALC,INVALC,0x5560,0x5557,INVALC, + INVALC,INVALC,0x555A,INVALC,INVALC,INVALC,0x555B,INVALC, + INVALC,0x555D,INVALC,INVALC,0x5565,0x5564,0x5556,0x555C, + 0x555F,INVALC,INVALC,INVALC,INVALC,0x5559,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A5B, + 0x5A6F,0x5A6E,INVALC,0x5A63,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A5E,0x5A56,INVALC,INVALC,INVALC,0x5F4D,0x5A5A, + INVALC,INVALC,0x5A70,0x5A6D,INVALC,INVALC,INVALC,INVALC, + 0x5A6C,INVALC,INVALC,0x5A61,0x5A65,INVALC,INVALC,INVALC, + 0x5A66,0x5A60,INVALC,INVALC,0x5F3F,INVALC,INVALC,0x5A6B, + INVALC,INVALC,0x5A6A,INVALC,INVALC,INVALC,0x5A57,INVALC, + 0x5A5C,0x5A67,INVALC,0x5A62,INVALC,INVALC,INVALC,INVALC, + 0x5A54,0x5A68,0x5A58,0x5F3E,INVALC,0x5A59,INVALC,0x5A55, + 0x5A64,0x5A5F,0x5A5D,INVALC,0x5A69,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F41,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F44,INVALC, + INVALC,0x5F43,INVALC,INVALC,INVALC,0x5F45,INVALC,0x5F40, + 0x5F48,INVALC,0x5F46,INVALC,INVALC,INVALC,0x5F4A,INVALC, + INVALC,INVALC,0x5F52,0x5F50,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F49,INVALC,0x5F47,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F42,0x5F4F,INVALC,INVALC,0x5F4B,0x5F4C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F4E,INVALC,INVALC,INVALC, + INVALC,0x5F53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6438,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6434,INVALC,0x6431, + INVALC,INVALC,INVALC,0x642A,0x6433,INVALC,0x6436,0x6437, + INVALC,INVALC,INVALC,INVALC,0x6432,INVALC,0x642C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x642D,INVALC,0x6430,0x642E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x687A,INVALC,0x6435,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x642F,0x642B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6878,0x5F51,INVALC,0x6873,INVALC,INVALC,INVALC, + 0x6872,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6876, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6879, + INVALC,0x6C77,INVALC,INVALC,INVALC,0x687B,INVALC,0x6C78, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6875,0x6C79,0x6877,0x687C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6871, + 0x6C7C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C7D,INVALC,0x6D25,0x6D22,INVALC,0x6D23,INVALC,INVALC, + INVALC,0x6D2B,0x6D29,INVALC,INVALC,INVALC,0x6C7A,INVALC, + INVALC,INVALC,0x6D2C,INVALC,0x6874,0x6D21,INVALC,INVALC, + INVALC,0x6D24,INVALC,0x6D28,0x6D2A,0x6D27,0x6D26,INVALC, + 0x6C7E,INVALC,0x6C7B,0x6D2D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7061,0x7062,INVALC,0x706B,0x7068, + INVALC,0x705F,0x7066,INVALC,0x7064,0x705E,INVALC,0x7065, + INVALC,INVALC,0x7364,0x7060,INVALC,0x7067,0x7363,INVALC, + INVALC,INVALC,0x7069,INVALC,0x706A,INVALC,INVALC,INVALC, + 0x7365,INVALC,0x7063,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7366,INVALC,0x736B,INVALC,INVALC,INVALC,0x7368,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7369,0x736C,INVALC,INVALC, + 0x7367,0x736A,0x7645,INVALC,0x7644,INVALC,INVALC,0x764A, + INVALC,INVALC,0x7648,0x7649,INVALC,INVALC,0x7646,INVALC, + /* Block 102, Array index 0x2500 */ + 0x7838,INVALC,INVALC,INVALC,INVALC,INVALC,0x7647,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7839, + INVALC,INVALC,INVALC,INVALC,0x796F,INVALC,INVALC,INVALC, + 0x796E,0x7970,INVALC,INVALC,0x7A6D,0x7A6C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7C37,0x7B61,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C39,0x7C38,0x7C5F,INVALC,INVALC,0x4545, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x482D,INVALC, + 0x4A53,0x4A51,INVALC,0x4A52,INVALC,INVALC,0x4D73,0x5149, + INVALC,INVALC,INVALC,INVALC,INVALC,0x514A,INVALC,INVALC, + 0x5566,0x5567,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A77, + INVALC,0x5A73,INVALC,INVALC,0x5A7A,0x5A79,0x5A72,0x5A75, + 0x5A78,0x5A74,INVALC,INVALC,INVALC,0x5A71,0x5F54,INVALC, + INVALC,INVALC,0x5F56,0x5F57,INVALC,INVALC,0x5F55,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6439,INVALC,INVALC,INVALC, + INVALC,INVALC,0x687D,INVALC,0x706C,0x6D2E,INVALC,0x6D2F, + 0x6D30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x736D,0x736E,INVALC,INVALC,INVALC,0x4546, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F59,0x5F58,INVALC,INVALC,INVALC,0x7A6E,INVALC,0x4547, + INVALC,0x5568,INVALC,0x5A7C,0x5A7B,INVALC,INVALC,0x643A, + INVALC,0x687E,INVALC,INVALC,0x4548,0x4658,INVALC,0x4D74, + INVALC,INVALC,INVALC,0x514B,0x5A7D,INVALC,INVALC,0x5F5A, + 0x643B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x764B, + INVALC,0x4549,INVALC,INVALC,0x4D75,0x514C,INVALC,INVALC, + INVALC,0x5569,INVALC,INVALC,INVALC,0x556A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B21,0x5B22,INVALC,0x5B23,0x5A7E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6922,0x6921, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x514D,INVALC,INVALC,0x454A,0x4659,INVALC, + 0x482F,0x482E,INVALC,INVALC,0x4830,0x4831,INVALC,INVALC, + INVALC,0x4A54,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D76,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x2600 */ + 0x4D7D,INVALC,0x4D7B,INVALC,INVALC,INVALC,0x4D7A,0x4E23, + INVALC,INVALC,0x4E22,INVALC,0x4D79,INVALC,0x4D7C,0x4D7E, + INVALC,INVALC,INVALC,0x4D78,0x4D77,0x4E21,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5153, + 0x5150,INVALC,INVALC,INVALC,0x5156,0x514E,INVALC,0x5151, + 0x5154,INVALC,INVALC,INVALC,INVALC,0x514F,INVALC,0x5152, + INVALC,0x5155,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5572,0x556B,0x556E,INVALC,0x5571,INVALC,INVALC, + INVALC,0x556C,INVALC,INVALC,0x5570,INVALC,INVALC,0x556D, + INVALC,INVALC,0x556F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B25,INVALC,INVALC,0x5B24,0x5B29,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B26,INVALC,0x5B28,INVALC, + 0x5B27,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F5B,0x5F5F, + 0x5F5C,INVALC,INVALC,INVALC,0x5F5D,INVALC,0x5F5E,0x5F63, + INVALC,INVALC,0x5F61,INVALC,INVALC,INVALC,0x5F62,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6441,INVALC,INVALC,0x643E, + 0x643F,0x643D,INVALC,INVALC,INVALC,0x6443,INVALC,INVALC, + INVALC,0x5F60,INVALC,INVALC,INVALC,INVALC,0x6440,0x643C, + 0x6442,INVALC,INVALC,INVALC,INVALC,0x6925,INVALC,INVALC, + INVALC,INVALC,0x6923,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6924,INVALC,INVALC,0x6D32,INVALC,INVALC,0x6D31,INVALC, + INVALC,0x6D34,INVALC,INVALC,0x6D33,INVALC,INVALC,INVALC, + 0x7072,0x706F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7070,INVALC,0x706D,0x7071, + INVALC,0x706E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7370,INVALC, + INVALC,0x736F,INVALC,INVALC,0x764C,0x783B,INVALC,INVALC, + 0x783A,INVALC,INVALC,INVALC,INVALC,INVALC,0x7971,INVALC, + INVALC,0x7A6F,INVALC,INVALC,0x7C3A,INVALC,INVALC,INVALC, + 0x454B,INVALC,0x4832,0x4833,0x4A55,INVALC,INVALC,0x5157, + 0x5573,0x5B2A,INVALC,INVALC,0x5937,INVALC,0x5F64,0x5F65, + /* Block 104, Array index 0x2700 */ + 0x5E32,INVALC,INVALC,0x6444,INVALC,INVALC,INVALC,INVALC, + 0x454C,0x4834,INVALC,0x4E25,INVALC,0x4E24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5574,0x5575,INVALC,0x5576, + INVALC,INVALC,INVALC,0x5B2C,INVALC,0x5F67,INVALC,0x5F66, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x764D,0x7972, + 0x454D,INVALC,0x465C,0x465D,0x465B,0x465E,0x465A,INVALC, + INVALC,0x4837,INVALC,INVALC,0x4836,0x4838,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4835,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A5F,INVALC, + INVALC,0x4A5E,INVALC,INVALC,INVALC,INVALC,0x4A57,0x4A58, + 0x4A59,0x4A5A,INVALC,0x4A61,INVALC,INVALC,0x4A5C,0x4A62, + INVALC,INVALC,INVALC,INVALC,0x4A5B,INVALC,0x4A5D,0x4A56, + 0x4A60,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E3A,INVALC,INVALC,0x4E26,INVALC,0x4E30, + 0x4E31,0x4E29,0x4E3B,0x4E2B,INVALC,0x4E36,INVALC,0x4E2C, + INVALC,INVALC,INVALC,INVALC,0x4E39,INVALC,0x4E34,0x4E32, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E2D, + INVALC,0x4E33,INVALC,0x4E27,INVALC,INVALC,INVALC,INVALC, + 0x4E35,INVALC,INVALC,0x4E38,INVALC,0x4E28,INVALC,0x4E2F, + INVALC,INVALC,0x4E37,INVALC,0x4E2A,0x4E2E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x515F, + 0x516C,INVALC,INVALC,INVALC,0x5165,INVALC,0x515E,INVALC, + 0x5168,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5163,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5169, + 0x515C,0x5164,0x5170,0x5159,0x515B,INVALC,INVALC,INVALC, + INVALC,0x516D,0x5166,INVALC,INVALC,0x516F,0x516A,INVALC, + INVALC,INVALC,0x516E,INVALC,INVALC,0x5167,INVALC,INVALC, + INVALC,0x5161,INVALC,INVALC,0x515D,INVALC,INVALC,0x5162, + INVALC,0x515A,INVALC,0x516B,0x5627,0x5160,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5158, + /* Block 105, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x562E,INVALC,INVALC,INVALC,0x5623, + 0x562F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5577,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5621,0x562C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5578,0x557C,INVALC,INVALC,0x562A,0x5626,INVALC,INVALC, + 0x5629,0x5630,0x557D,0x562B,INVALC,0x562D,0x557A,INVALC, + 0x5579,INVALC,INVALC,INVALC,0x5624,INVALC,INVALC,INVALC, + 0x5628,0x5625,INVALC,0x557B,0x557E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B33,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B32, + INVALC,0x5B2D,0x5B42,0x5B38,INVALC,0x5B3C,0x5B3B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B30,0x5B3D,INVALC,INVALC,0x5B36, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B3E,INVALC,0x5B40, + INVALC,0x5B41,0x5B2F,INVALC,INVALC,INVALC,INVALC,0x5B35, + 0x5B3F,INVALC,INVALC,INVALC,INVALC,0x5B3A,INVALC,0x5B2E, + 0x5B37,0x5B34,INVALC,0x5622,INVALC,0x5B31,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B39,INVALC,INVALC,INVALC, + INVALC,0x5F7B,INVALC,0x5F76,INVALC,0x5F77,INVALC,INVALC, + INVALC,INVALC,0x5F73,INVALC,INVALC,0x5F69,INVALC,0x5F6C, + 0x5F6B,INVALC,0x5F7C,INVALC,INVALC,INVALC,INVALC,0x5F6E, + 0x5F6A,INVALC,INVALC,0x5F75,INVALC,INVALC,INVALC,0x5F71, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F70,INVALC, + INVALC,INVALC,0x5F74,INVALC,INVALC,0x5F6F,INVALC,INVALC, + INVALC,0x5F72,0x5F68,0x5F7E,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F6D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F78,0x5F7A,INVALC, + INVALC,INVALC,0x5F79,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x644C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x644E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6452,0x644A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6447,0x6457,INVALC,0x6455,0x6451,INVALC, + 0x6449,INVALC,INVALC,0x6456,INVALC,INVALC,INVALC,INVALC, + 0x644F,INVALC,INVALC,0x6450,INVALC,0x6446,0x5F7D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x644B,INVALC,0x6448, + INVALC,0x6453,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x644D,INVALC,INVALC,INVALC,0x6454,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6445,0x6928,INVALC,INVALC, + INVALC,INVALC,INVALC,0x692D,0x6926,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6938,INVALC,INVALC,0x6936,INVALC, + 0x6927,INVALC,INVALC,0x6930,INVALC,0x6934,0x692A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6931,INVALC,INVALC,0x692E, + INVALC,INVALC,INVALC,0x692F,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6929,INVALC,0x6937,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x692C,0x6935,0x6933,INVALC,INVALC, + 0x6932,INVALC,INVALC,0x692B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D37,INVALC,INVALC,INVALC,INVALC,0x6D42,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D3F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6D3B,INVALC,INVALC, + /* Block 107, Array index 0x2A00 */ + INVALC,0x6D38,0x6D40,INVALC,INVALC,0x6D41,INVALC,INVALC, + INVALC,INVALC,0x6D3E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D43,INVALC,0x6D3D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D3A,INVALC,INVALC,INVALC,INVALC,0x6D39,0x6D36, + INVALC,0x6D3C,INVALC,0x6D35,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7121,INVALC,INVALC, + 0x7074,0x7079,0x7075,INVALC,INVALC,0x7073,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x707A,INVALC,INVALC,0x707E, + 0x7123,INVALC,INVALC,0x707D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7078,0x7076,INVALC,INVALC,INVALC,INVALC,INVALC,0x7122, + INVALC,0x707C,0x707B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7077,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7378,INVALC, + 0x7371,INVALC,INVALC,INVALC,0x7373,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x737A,INVALC,INVALC,INVALC,0x7372,INVALC,INVALC,0x7379, + INVALC,INVALC,INVALC,INVALC,0x7375,INVALC,INVALC,INVALC, + 0x737B,INVALC,0x7374,0x7377,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x764F,INVALC,0x7654,0x7655, + INVALC,INVALC,INVALC,0x764E,INVALC,INVALC,INVALC,INVALC, + 0x7652,INVALC,INVALC,0x7651,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7653,0x7650,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x783F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x783E,0x7376,INVALC,0x783D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x783C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7973,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7A72,0x7A70,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,0x7A71,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B62,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C3B,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D23,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x454E,0x4839,INVALC,0x4E3C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B43,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6022,INVALC,INVALC,0x6023,0x6021,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6458, + INVALC,0x6939,INVALC,INVALC,0x693A,INVALC,0x6D45,INVALC, + 0x6D44,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7124,INVALC,INVALC,0x737C,INVALC,INVALC,0x7656, + INVALC,0x7B63,0x454F,0x465F,0x483A,0x4A63,0x4E3D,0x4E3E, + INVALC,INVALC,0x5171,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6459,INVALC,INVALC,INVALC,INVALC,0x7125, + 0x7657,0x4550,INVALC,0x483B,INVALC,INVALC,INVALC,0x4E3F, + INVALC,INVALC,INVALC,0x5172,INVALC,INVALC,0x5173,INVALC, + INVALC,0x5632,0x5631,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6025,INVALC, + 0x6024,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6D46,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x737D,0x7658, + INVALC,INVALC,0x7A73,INVALC,INVALC,0x5174,INVALC,0x5633, + INVALC,INVALC,0x5B44,INVALC,0x6026,INVALC,INVALC,0x645B, + 0x645A,INVALC,INVALC,INVALC,INVALC,0x6D47,0x6D48,INVALC, + INVALC,INVALC,INVALC,0x4551,INVALC,0x4660,INVALC,0x4A64, + INVALC,INVALC,0x5175,0x645C,0x4552,INVALC,INVALC,0x5176, + INVALC,INVALC,0x737E,0x4553,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B45,0x5B46,INVALC,INVALC,0x6027, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x645D,INVALC,INVALC, + /* Block 109, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x7126,INVALC,INVALC, + 0x7421,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4554, + 0x4662,0x4661,INVALC,0x4E40,INVALC,INVALC,0x483C,INVALC, + INVALC,INVALC,INVALC,0x4E41,INVALC,INVALC,INVALC,0x5177, + INVALC,INVALC,INVALC,0x5634,0x5638,INVALC,0x5637,0x5635, + 0x5636,INVALC,INVALC,0x5B47,0x602A,INVALC,0x6028,0x6029, + INVALC,INVALC,INVALC,0x693B,0x4555,INVALC,INVALC,INVALC, + 0x4663,INVALC,INVALC,INVALC,INVALC,INVALC,0x4666,INVALC, + 0x4665,0x4664,0x4A65,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4846,0x4847,INVALC, + 0x4842,INVALC,INVALC,INVALC,INVALC,0x4843,INVALC,0x483E, + INVALC,0x483F,INVALC,0x4845,INVALC,0x483D,0x4A66,0x4840, + 0x4841,0x4844,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A72,INVALC,0x4A6D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A70,INVALC,0x4A77,INVALC,0x4A79,INVALC,0x4A7B,INVALC, + INVALC,INVALC,0x4A6E,INVALC,INVALC,0x4A75,0x4A78,INVALC, + INVALC,0x4A68,0x4B21,0x4A76,INVALC,0x4A6B,0x4A7A,INVALC, + 0x4A69,0x4A6A,INVALC,INVALC,0x4A71,0x4A7C,INVALC,INVALC, + 0x4A6F,INVALC,0x4A74,INVALC,0x4A7D,INVALC,0x4A73,INVALC, + 0x4A7E,0x4A67,INVALC,0x4A6C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E4D,0x4E5D,INVALC,0x4E54,INVALC, + INVALC,0x4E45,INVALC,0x4E48,INVALC,INVALC,INVALC,INVALC, + 0x4E50,0x4E52,INVALC,0x4E59,0x4E4B,0x4E49,0x4E4A,0x4E58, + INVALC,0x4E53,INVALC,INVALC,0x4E51,0x4E56,INVALC,INVALC, + INVALC,0x5178,0x4E5C,INVALC,0x4E46,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E4F,INVALC,0x4E4E,0x4E60,0x4E55, + INVALC,INVALC,INVALC,0x4E5B,0x4E5F,INVALC,INVALC,INVALC, + 0x4E61,0x4E5A,0x4E4C,0x4E42,INVALC,0x4E47,INVALC,INVALC, + 0x4E43,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E5E, + 0x5639,0x4E57,INVALC,0x4E44,INVALC,0x5229,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5179,0x517E,INVALC,0x5230,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5223, + INVALC,INVALC,INVALC,0x5228,INVALC,INVALC,0x5222,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x517D,INVALC,0x522B, + INVALC,0x522D,0x517B,0x5231,INVALC,INVALC,0x522E,INVALC, + INVALC,0x5221,0x517A,INVALC,INVALC,0x522F,0x5227,INVALC, + 0x522C,0x522A,INVALC,0x5224,INVALC,0x5225,0x5226,INVALC, + INVALC,0x517C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5641,0x5646,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x564D,0x563E,INVALC, + INVALC,0x5648,0x563A,INVALC,0x5643,INVALC,0x5645,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5647,INVALC,INVALC,0x5640, + 0x563F,0x564B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x564C,INVALC,0x563D, + 0x563C,0x5644,0x564A,INVALC,0x5649,INVALC,0x5B48,INVALC, + INVALC,INVALC,INVALC,0x5642,0x564E,0x563B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B6A,INVALC,INVALC,INVALC,0x5B57,0x5B55, + INVALC,INVALC,0x5B4C,INVALC,INVALC,0x5B60,INVALC,INVALC, + 0x5B5A,INVALC,INVALC,INVALC,0x5B49,INVALC,INVALC,0x5B6C, + INVALC,INVALC,INVALC,INVALC,0x5B69,0x5B5D,0x5B68,0x5B53, + INVALC,INVALC,INVALC,0x5B54,0x5B4E,INVALC,INVALC,INVALC, + INVALC,0x5B56,0x5B5E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B63,0x5B4B,0x5B61,INVALC,INVALC,INVALC,0x5B58,INVALC, + INVALC,0x5B4D,INVALC,INVALC,0x5B4F,INVALC,0x5B6D,INVALC, + 0x5B67,INVALC,0x5B64,0x5B62,0x5B6B,INVALC,0x5B66,INVALC, + INVALC,0x5B65,INVALC,0x5B4A,INVALC,0x5B5C,INVALC,0x5B5B, + INVALC,0x5B59,0x5B51,0x5B50,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B52,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6047,0x5B5F,0x6035,INVALC,0x6043,INVALC,INVALC, + 0x6032,0x602E,INVALC,0x6034,0x6038,0x6033,0x603C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6041,0x603B,INVALC,0x602B, + INVALC,INVALC,0x602F,INVALC,0x603E,INVALC,INVALC,INVALC, + 0x602C,INVALC,0x6040,INVALC,INVALC,INVALC,0x6044,INVALC, + INVALC,INVALC,INVALC,0x6042,0x604A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6031,INVALC,INVALC,0x603F,0x6048,INVALC, + INVALC,INVALC,INVALC,INVALC,0x602D,INVALC,0x6039,INVALC, + 0x6037,INVALC,INVALC,0x6036,INVALC,INVALC,INVALC,0x604D, + INVALC,INVALC,INVALC,0x6049,INVALC,INVALC,INVALC,0x6030, + INVALC,0x604C,INVALC,INVALC,INVALC,INVALC,0x603A,0x603D, + INVALC,INVALC,0x604B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6046,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6463,INVALC,INVALC,INVALC,INVALC,INVALC,0x646D,INVALC, + 0x6468,INVALC,INVALC,INVALC,0x646E,0x6464,INVALC,INVALC, + INVALC,INVALC,0x645E,INVALC,INVALC,0x6467,INVALC,0x6472, + INVALC,INVALC,0x6471,0x646B,INVALC,INVALC,INVALC,0x645F, + INVALC,INVALC,INVALC,INVALC,0x6473,INVALC,0x6461,INVALC, + INVALC,INVALC,0x646A,INVALC,0x6469,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6462,INVALC,0x646F,0x6466,INVALC,0x6465, + INVALC,INVALC,INVALC,0x6045,0x6957,INVALC,INVALC,INVALC, + INVALC,0x646C,INVALC,0x6460,0x6470,0x6D5A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6954,INVALC,INVALC,0x6949, + INVALC,INVALC,0x6956,INVALC,0x6940,INVALC,INVALC,0x6958, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x693E,0x6948, + /* Block 112, Array index 0x2F00 */ + INVALC,0x6955,0x6946,INVALC,INVALC,INVALC,0x694A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6945, + INVALC,INVALC,INVALC,0x693F,0x693D,0x694F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6943,INVALC,0x6947,0x694E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6941,0x6953,0x6950,0x6944,INVALC,INVALC,0x6951, + INVALC,0x694B,0x694D,0x693C,INVALC,INVALC,INVALC,INVALC, + 0x694C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6942,0x6D49, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D4C,INVALC,INVALC,0x6D4E,INVALC,INVALC,INVALC, + 0x6D59,INVALC,INVALC,0x6D51,INVALC,INVALC,INVALC,0x6D5D, + 0x6D5C,INVALC,INVALC,INVALC,0x6D57,INVALC,0x6D4D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6D50,0x6D53,0x6D5B, + 0x6D56,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D52,INVALC,0x6D55,INVALC,0x6D4A,INVALC,INVALC,INVALC, + 0x742A,INVALC,INVALC,INVALC,0x6D4B,INVALC,0x6D4F,INVALC, + 0x6952,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D54,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D58, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7133,0x7129,INVALC,INVALC,0x712B,INVALC,0x7132,0x712D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7128,INVALC,0x712E,0x7134,INVALC,0x7131,INVALC, + INVALC,0x7130,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x712F,0x712C,0x7127,0x712A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x742E,INVALC,INVALC, + 0x7422,INVALC,INVALC,0x7426,INVALC,INVALC,INVALC,0x7424, + 0x7425,0x742C,INVALC,INVALC,0x7427,INVALC,INVALC,INVALC, + INVALC,0x742D,INVALC,0x7428,0x742B,INVALC,0x742F,0x7429, + 0x7430,0x7423,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x765D,INVALC,INVALC,INVALC,0x765B,INVALC, + /* Block 113, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x765C,INVALC, + INVALC,0x7659,INVALC,0x765A,INVALC,INVALC,INVALC,0x765F, + INVALC,0x765E,INVALC,INVALC,INVALC,0x7845,INVALC,INVALC, + 0x7846,INVALC,0x7843,0x7840,INVALC,0x7844,INVALC,0x7841, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7842,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7975,INVALC,0x7976,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7974,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A74,INVALC,INVALC,INVALC, + INVALC,0x7B64,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7B65,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C60,INVALC, + INVALC,INVALC,INVALC,0x7D24,0x7D32,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4556,INVALC,INVALC,INVALC,INVALC, + 0x4848,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B22,INVALC, + 0x4B25,INVALC,INVALC,INVALC,0x4B23,0x4B24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E65,INVALC,INVALC,INVALC,0x4E63,INVALC, + INVALC,INVALC,0x4E64,INVALC,INVALC,0x4E62,INVALC,INVALC, + INVALC,0x4E66,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x523A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5232,0x5235,0x5237,0x5239,0x5236, + INVALC,INVALC,INVALC,0x5234,INVALC,INVALC,INVALC,INVALC, + 0x5238,INVALC,0x5233,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5653,INVALC,0x564F,INVALC,INVALC,INVALC,INVALC,0x5654, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5650,0x5652,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5651,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B72, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B6E,INVALC,INVALC,INVALC,0x5B71,INVALC,INVALC, + /* Block 114, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B6F,0x5B70,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x604E,0x604F,INVALC,0x6055,INVALC,INVALC,INVALC, + INVALC,0x6052,INVALC,INVALC,INVALC,INVALC,0x6050,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6051,INVALC,INVALC,INVALC,INVALC,INVALC,0x6053,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6522,INVALC, + INVALC,0x6478,INVALC,INVALC,0x647D,INVALC,0x6474,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6524,INVALC, + INVALC,0x6475,INVALC,INVALC,0x647A,INVALC,0x6521,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6477,0x647E,0x647C,0x6479, + 0x6523,0x6476,INVALC,INVALC,0x647B,INVALC,0x6054,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x695B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x695D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x695C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x695E,INVALC,0x6959,INVALC,INVALC,INVALC, + INVALC,0x695A,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D5E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D61,INVALC,INVALC,INVALC,0x6D5F,INVALC,INVALC,INVALC, + INVALC,0x6D60,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x713B,INVALC,INVALC,INVALC,INVALC,0x7135,INVALC, + INVALC,INVALC,INVALC,0x713F,0x7140,INVALC,INVALC,INVALC, + 0x7139,0x7136,INVALC,INVALC,INVALC,INVALC,0x713C,INVALC, + 0x7137,INVALC,0x7138,INVALC,INVALC,0x713A,INVALC,INVALC, + INVALC,0x713D,INVALC,INVALC,0x713E,INVALC,INVALC,0x7432, + 0x7439,INVALC,INVALC,INVALC,INVALC,0x7435,0x7434,0x7431, + INVALC,INVALC,INVALC,INVALC,0x7437,0x7436,0x7433,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7438,INVALC,INVALC,INVALC, + 0x7663,INVALC,INVALC,0x7660,0x7661,INVALC,0x7662,INVALC, + /* Block 115, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7847,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7848,INVALC,INVALC, + 0x7977,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A75,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7D46,INVALC,0x4557,INVALC,0x4E67,0x4E68,INVALC,INVALC, + 0x523B,INVALC,INVALC,INVALC,INVALC,0x743A,0x4558,INVALC, + 0x4E69,0x5655,0x6525,0x4559,INVALC,0x5B73,0x695F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x743B,0x455A, + 0x4E6A,INVALC,INVALC,INVALC,0x6056,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6526,INVALC,INVALC,INVALC,0x6D62,INVALC, + 0x7849,0x455B,INVALC,0x455C,INVALC,0x484A,INVALC,0x4849, + 0x4B28,0x4B27,0x4B26,INVALC,INVALC,INVALC,INVALC,0x4E6B, + INVALC,0x4E6C,INVALC,INVALC,INVALC,INVALC,INVALC,0x523D, + INVALC,INVALC,0x523C,INVALC,0x523E,INVALC,INVALC,INVALC, + INVALC,0x5656,INVALC,INVALC,INVALC,0x5B74,INVALC,INVALC, + 0x6058,0x5B75,INVALC,INVALC,0x6057,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6960,INVALC,INVALC,INVALC,0x6961,INVALC, + INVALC,INVALC,INVALC,0x6D63,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x784A,INVALC,INVALC,INVALC,INVALC,0x7A76, + INVALC,INVALC,INVALC,INVALC,0x455D,INVALC,INVALC,0x4667, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E6D,INVALC,0x4B2A,INVALC,0x4B29,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E6E,INVALC, + 0x4E71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E70, + INVALC,0x4E6F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5240,0x5241,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x523F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x565B, + 0x565A,0x5658,INVALC,INVALC,0x5657,0x5659,INVALC,INVALC, + /* Block 116, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B79,INVALC,INVALC,0x5B78,INVALC, + INVALC,0x5B7A,INVALC,0x5B77,0x5B76,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x605A,INVALC,INVALC, + INVALC,0x605C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x605B,INVALC,0x6059,0x6527, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x652A,0x6529, + INVALC,INVALC,INVALC,INVALC,0x6962,0x6528,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D64,INVALC, + 0x6963,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D65, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7141,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x743C,INVALC,0x743D,INVALC,INVALC,0x7665,INVALC,0x7664, + 0x784B,INVALC,0x784C,0x7978,INVALC,INVALC,INVALC,INVALC, + 0x7B66,INVALC,INVALC,INVALC,0x4668,INVALC,0x565C,0x5B7B, + INVALC,0x4669,INVALC,0x455E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B2B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E74, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E76,INVALC,INVALC, + 0x4E73,0x4E72,INVALC,0x4E75,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5245,0x5248,INVALC,INVALC,INVALC,0x5242, + INVALC,INVALC,INVALC,0x5244,INVALC,INVALC,INVALC,INVALC, + 0x5247,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5243,INVALC,INVALC,0x5246,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5662,INVALC, + 0x5660,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5661,INVALC,INVALC,0x565D,0x565F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C22,INVALC, + /* Block 117, Array index 0x3400 */ + INVALC,INVALC,INVALC,0x5B7E,INVALC,0x5B7C,0x5C21,INVALC, + INVALC,0x565E,0x5B7D,INVALC,INVALC,0x5C23,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6066,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6060,INVALC,INVALC,0x6061,0x6067,INVALC, + 0x6068,INVALC,0x605E,INVALC,INVALC,INVALC,INVALC,0x6065, + INVALC,INVALC,INVALC,0x605F,0x6064,0x6062,0x6063,INVALC, + INVALC,INVALC,0x605D,INVALC,INVALC,INVALC,INVALC,0x6531, + INVALC,0x6530,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x652D,INVALC,INVALC, + INVALC,0x6532,0x652C,0x6533,0x6534,INVALC,0x652F,0x652E, + INVALC,INVALC,INVALC,0x6965,0x6964,INVALC,INVALC,INVALC, + INVALC,0x6D66,0x6966,INVALC,INVALC,0x6968,INVALC,0x652B, + 0x6967,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D69,INVALC, + 0x6D6A,INVALC,INVALC,0x6D68,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D67,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7144,INVALC,INVALC,INVALC,0x7142,INVALC,0x7146,0x7145, + INVALC,INVALC,INVALC,0x7143,INVALC,INVALC,0x7440,0x7666, + 0x7441,0x743E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x743F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x784D,INVALC,0x7667, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x784E,INVALC,INVALC,INVALC,INVALC,0x7979, + INVALC,INVALC,INVALC,INVALC,0x7A78,INVALC,0x7A77,INVALC, + INVALC,INVALC,0x7C3C,INVALC,0x466A,INVALC,INVALC,INVALC, + 0x5C24,INVALC,0x7147,0x784F,0x7B67,INVALC,0x466B,INVALC, + INVALC,0x2322,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C25,0x5C26, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 118, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,0x6969,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7148,0x7149,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7668,INVALC,INVALC, + 0x466C,INVALC,0x5249,INVALC,0x5C27,INVALC,INVALC,0x466D, + INVALC,INVALC,0x5C28,INVALC,INVALC,0x6069,0x606A,INVALC, + 0x466E,0x466F,INVALC,0x4B2D,0x4B2C,0x524A,INVALC,INVALC, + 0x4670,0x4671,0x4672,0x4673,INVALC,INVALC,INVALC,0x4B2E, + 0x4B2F,INVALC,INVALC,INVALC,INVALC,0x4E77,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x524E,0x524C,INVALC,0x524D,0x524B, + INVALC,INVALC,INVALC,INVALC,0x5663,INVALC,INVALC,INVALC, + INVALC,0x5667,0x5666,INVALC,0x5665,0x5664,INVALC,INVALC, + INVALC,INVALC,0x5C2B,INVALC,INVALC,0x5C29,0x5C2A,INVALC, + INVALC,INVALC,0x606C,0x606B,INVALC,INVALC,INVALC,INVALC, + 0x5C2C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6535,INVALC, + 0x6536,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D6B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7851,0x7850, + INVALC,INVALC,0x7B68,0x4674,INVALC,INVALC,INVALC,0x5C2D, + INVALC,0x696A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E79,0x4E7A,INVALC,INVALC,0x4E78,INVALC,INVALC, + INVALC,INVALC,0x5252,0x5253,0x5250,0x5251,INVALC,INVALC, + INVALC,INVALC,INVALC,0x524F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x566B,0x566C,INVALC,0x5C30,INVALC,INVALC, + 0x5671,0x566F,INVALC,INVALC,0x566E,0x566D,0x5668,INVALC, + INVALC,INVALC,0x5670,INVALC,INVALC,0x5669,INVALC,0x566A, + INVALC,INVALC,0x5C31,INVALC,INVALC,0x5C32,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C2E,0x5C2F,INVALC,INVALC, + 0x6071,0x6070,INVALC,0x606E,INVALC,INVALC,0x6072,INVALC, + 0x6073,INVALC,0x606D,0x606F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6538,0x653B,0x653A,0x653F,0x653E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x653C,INVALC,INVALC,INVALC,INVALC,0x653D, + /* Block 119, Array index 0x3600 */ + 0x6537,0x6539,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x696E,INVALC,0x696D,INVALC,0x696C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x696F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D6E, + 0x6D6C,0x6D71,0x6D72,INVALC,0x6D6F,INVALC,0x6D70,0x696B, + INVALC,0x6D6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x714A,INVALC,INVALC,INVALC, + 0x714B,INVALC,0x714C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7443,INVALC,INVALC,INVALC,0x7442,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7444,INVALC,INVALC,INVALC, + INVALC,INVALC,0x766B,INVALC,INVALC,INVALC,0x7669,INVALC, + 0x766A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7852, + INVALC,0x7853,0x797A,INVALC,INVALC,0x797B,INVALC,INVALC, + INVALC,0x7A79,INVALC,INVALC,0x7B6A,INVALC,0x7B69,INVALC, + INVALC,0x7C61,0x7C62,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5254,INVALC,INVALC,0x6074,0x6075,0x4675,0x484B,INVALC, + INVALC,INVALC,0x4B30,INVALC,0x4E7B,INVALC,0x5255,0x5256, + 0x5257,INVALC,INVALC,0x5672,INVALC,INVALC,0x5C33,INVALC, + INVALC,INVALC,INVALC,0x6077,INVALC,INVALC,0x6076,INVALC, + INVALC,INVALC,0x6D73,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4676,INVALC, + 0x5673,INVALC,INVALC,INVALC,0x6078,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D74,INVALC,INVALC,INVALC,INVALC,0x4677, + INVALC,INVALC,0x4E7C,0x525A,INVALC,0x525B,0x5259,INVALC, + 0x5258,INVALC,0x5674,INVALC,INVALC,0x5675,0x5676,INVALC, + INVALC,INVALC,0x5C35,INVALC,0x5C34,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C36,0x6079,INVALC,0x6540,0x6541, + INVALC,0x6970,INVALC,0x6971,0x6D75,0x714E,INVALC,0x714D, + INVALC,INVALC,0x7445,INVALC,INVALC,INVALC,0x4678,0x4B31, + INVALC,INVALC,0x4E7D,INVALC,0x4E7E,INVALC,INVALC,INVALC, + 0x525E,0x525D,INVALC,INVALC,0x5262,INVALC,0x5261,INVALC, + /* Block 120, Array index 0x3700 */ + INVALC,0x525C,INVALC,INVALC,INVALC,INVALC,INVALC,0x5263, + INVALC,0x525F,INVALC,0x5260,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5678, + 0x5679,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x567A,0x5677,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C3A,0x5C37, + 0x5C3B,INVALC,0x5C3C,INVALC,0x5C39,INVALC,0x5C38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x607A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6542,0x654A,INVALC,0x6545,INVALC, + INVALC,0x6975,0x654D,0x6546,INVALC,0x654B,0x6544,INVALC, + 0x654C,INVALC,0x6548,0x6543,0x6549,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6547,INVALC,INVALC,INVALC,0x6973,INVALC,0x6974, + INVALC,INVALC,INVALC,INVALC,0x6972,INVALC,INVALC,0x6D77, + INVALC,INVALC,INVALC,0x6D7A,0x6D78,INVALC,0x6D76,INVALC, + INVALC,0x6D79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7150,0x7151, + 0x714F,INVALC,INVALC,INVALC,INVALC,0x7152,INVALC,0x744A, + INVALC,INVALC,0x7447,INVALC,0x7449,0x744B,INVALC,INVALC, + 0x7448,INVALC,INVALC,0x7446,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x766E,0x766F,0x766C,INVALC,0x766D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7854, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A7A,INVALC,INVALC,INVALC,0x7C63, + INVALC,INVALC,0x7D33,0x4679,0x5264,INVALC,INVALC,INVALC, + INVALC,INVALC,0x467A,0x4B32,INVALC,0x4F21,INVALC,INVALC, + INVALC,0x567B,INVALC,INVALC,INVALC,0x607B,0x654E,0x744C, + INVALC,INVALC,INVALC,0x467B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F22,INVALC,INVALC, + /* Block 121, Array index 0x3800 */ + INVALC,INVALC,0x5265,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5267,0x5268,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5266,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5721,INVALC,0x5727, + 0x5726,INVALC,INVALC,INVALC,INVALC,0x5724,INVALC,0x567D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5725,INVALC,INVALC, + 0x567C,INVALC,0x5728,INVALC,0x5722,INVALC,INVALC,0x5723, + 0x567E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C3E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C3F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x607C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C3D,0x607D,INVALC,INVALC,0x607E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6555,INVALC,INVALC,0x6558, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6554,INVALC,INVALC,0x6553,INVALC,0x654F,INVALC, + INVALC,0x6556,INVALC,0x6557,INVALC,INVALC,INVALC,0x6551, + 0x6552,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6977, + INVALC,INVALC,INVALC,0x697B,INVALC,INVALC,INVALC,0x6978, + INVALC,0x697A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6550,INVALC,INVALC,0x6979,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D7D,INVALC,0x6E23,INVALC,0x6E21,INVALC, + INVALC,0x6976,INVALC,INVALC,INVALC,0x6D7C,INVALC,INVALC, + INVALC,INVALC,0x6D7E,0x6D7B,INVALC,INVALC,INVALC,INVALC, + 0x6E24,INVALC,INVALC,INVALC,INVALC,0x6E22,INVALC,INVALC, + INVALC,INVALC,0x7154,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7156, + 0x7153,INVALC,INVALC,INVALC,0x7155,INVALC,INVALC,0x7450, + INVALC,INVALC,INVALC,INVALC,0x744F,INVALC,INVALC,0x744D, + INVALC,INVALC,0x744E,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 122, Array index 0x3900 */ + INVALC,0x7451,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7670,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7855,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x797C,INVALC, + INVALC,INVALC,0x797D,0x7A21,0x797E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x467C,INVALC,INVALC,INVALC,0x4F23,INVALC, + 0x4F24,0x4F25,INVALC,INVALC,INVALC,INVALC,0x5269,0x526C, + 0x526B,0x526A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x572A,INVALC,INVALC,INVALC,INVALC,0x5729,0x572D,0x5730, + INVALC,INVALC,0x5731,INVALC,INVALC,0x572F,0x572E,0x572C, + 0x572B,INVALC,INVALC,INVALC,INVALC,0x5C40,INVALC,INVALC, + 0x5C41,INVALC,INVALC,INVALC,INVALC,0x5C42,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6559,INVALC,INVALC,INVALC,INVALC,0x655A, + INVALC,0x655B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x697E,0x697C,0x697D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7157,0x7452, + INVALC,INVALC,0x7453,INVALC,INVALC,INVALC,0x7671,INVALC, + INVALC,0x7856,INVALC,0x7B6B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x526D,0x526E,INVALC,INVALC,0x655D,0x467D,0x4B35, + 0x4B34,0x4B33,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F27,0x4F26,INVALC,0x5271,INVALC,INVALC,INVALC,INVALC, + INVALC,0x526F,0x5270,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5738,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5735, + INVALC,INVALC,INVALC,0x5733,0x5732,INVALC,0x5736,0x5734, + INVALC,0x5737,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C43,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x3A00 */ + 0x6125,INVALC,INVALC,INVALC,INVALC,0x6124,INVALC,INVALC, + 0x6122,INVALC,INVALC,0x6123,INVALC,0x6121,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6561,INVALC,INVALC,INVALC, + INVALC,INVALC,0x655F,INVALC,0x655E,INVALC,0x6563,0x6562, + 0x6560,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A21,INVALC, + INVALC,0x6A22,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E29, + INVALC,INVALC,INVALC,0x6E2A,0x6E26,0x6E28,INVALC,0x6E25, + 0x6E27,INVALC,INVALC,INVALC,INVALC,INVALC,0x715A,INVALC, + INVALC,INVALC,INVALC,0x715C,0x715B,0x7158,0x7159,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7454, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7674,0x7672,0x7673,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7858,INVALC,0x7857,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x467E,INVALC,0x4B36,INVALC, + INVALC,0x4F29,0x4F28,INVALC,INVALC,INVALC,INVALC,0x5272, + INVALC,0x5273,INVALC,INVALC,0x5739,INVALC,INVALC,INVALC, + 0x573A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C44,INVALC,INVALC,0x5C45,0x6128,0x6127, + 0x6126,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6564, + 0x6565,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A24,0x6A23,INVALC,INVALC,INVALC,0x6E2C,0x6E2B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x715D,INVALC,INVALC,INVALC,INVALC,0x7455, + INVALC,INVALC,INVALC,INVALC,0x7675,0x7676,INVALC,0x7A22, + INVALC,INVALC,0x7C3D,0x4721,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x573B,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D7E, + 0x5D7D,INVALC,INVALC,0x612A,INVALC,0x6129,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A25,INVALC,0x6A26, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A23,INVALC, + INVALC,0x484C,0x4F2A,INVALC,INVALC,0x5275,INVALC,0x5274, + /* Block 124, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x573C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x573D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C4B,INVALC,0x5C48,INVALC,INVALC,0x5C4C,INVALC, + 0x5C46,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C4A,INVALC, + 0x5C47,INVALC,INVALC,INVALC,0x5C49,INVALC,0x5C4D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x612D,INVALC, + INVALC,0x612B,INVALC,0x6132,INVALC,0x6131,INVALC,0x6133, + 0x612E,0x6134,0x612F,INVALC,0x6130,INVALC,0x612C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6568,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x656A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6569,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A2A,INVALC,0x6566, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A31,INVALC,INVALC,0x6A30, + INVALC,INVALC,INVALC,0x6A29,INVALC,INVALC,INVALC,0x6A2E, + INVALC,INVALC,INVALC,INVALC,0x6A2D,0x6A28,INVALC,0x6A2B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A2C,INVALC,INVALC, + 0x6E34,0x6A27,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6E2D,INVALC,INVALC, + INVALC,0x6E2E,INVALC,INVALC,0x6E30,INVALC,INVALC,INVALC, + 0x6A2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6567,0x6E33,INVALC,INVALC,0x6E2F,INVALC,0x6E31,0x6E32, + INVALC,0x7160,INVALC,INVALC,0x6E35,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x715E,INVALC,0x7162,INVALC,INVALC,INVALC,INVALC, + 0x745B,0x7163,INVALC,INVALC,0x7161,INVALC,0x7165,INVALC, + INVALC,0x7164,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7459, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7458,INVALC, + /* Block 125, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7456, + INVALC,INVALC,INVALC,INVALC,0x745A,0x7457,INVALC,INVALC, + INVALC,0x715F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x767A,INVALC, + INVALC,0x767C,INVALC,0x767B,INVALC,INVALC,INVALC,0x7678, + INVALC,INVALC,0x7679,0x7677,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x785D, + 0x785B,INVALC,INVALC,INVALC,INVALC,0x785C,0x7859,0x785A, + 0x785E,INVALC,INVALC,0x7A25,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A24,0x7A26,INVALC,INVALC, + 0x7A7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B6D, + 0x7B6C,INVALC,INVALC,0x7C3F,0x7C3E,0x7C40,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7D25,INVALC,0x7D26,INVALC, + INVALC,INVALC,0x7D4B,0x484D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5276,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x573E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C4E,INVALC,INVALC,0x5C50,INVALC,0x5C4F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6135, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6136,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x656B,INVALC,0x656C,INVALC,0x656D,INVALC,INVALC, + INVALC,0x6A32,INVALC,INVALC,INVALC,0x6A33,0x6A34,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E36,INVALC,INVALC,INVALC,0x2323,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7166,0x7167,INVALC, + INVALC,0x7461,INVALC,INVALC,0x745D,0x7462,0x745E,0x7460, + 0x745C,INVALC,0x745F,INVALC,INVALC,INVALC,INVALC,0x767D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A27, + 0x7A28,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x484E,INVALC,INVALC,0x4B37,INVALC,INVALC,0x4F2B,INVALC, + /* Block 126, Array index 0x3D00 */ + 0x5279,INVALC,0x5277,INVALC,0x527C,0x5278,0x527D,0x527B, + INVALC,0x527A,0x5742,0x5741,INVALC,0x574A,INVALC,INVALC, + 0x5746,INVALC,INVALC,INVALC,0x5745,0x5747,INVALC,0x5740, + INVALC,0x574B,0x5748,0x574C,0x5749,INVALC,INVALC,INVALC, + 0x5743,0x573F,0x5744,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x613B,INVALC,INVALC,0x5C54,0x5C5B, + 0x5C58,0x5C5E,0x5C5D,0x5C59,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C55,INVALC,INVALC,0x5C56,INVALC,INVALC,INVALC, + 0x5C57,INVALC,0x5C5C,0x5C52,0x5C5A,INVALC,0x5C51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6138,INVALC,INVALC,INVALC,INVALC,0x613A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6573,INVALC,INVALC,0x6137,INVALC, + INVALC,0x613E,0x6140,INVALC,INVALC,INVALC,0x613F,INVALC, + 0x6139,INVALC,INVALC,INVALC,INVALC,INVALC,0x613C,INVALC, + 0x6141,0x5C53,0x613D,0x6142,INVALC,INVALC,INVALC,INVALC, + INVALC,0x656F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6571,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6572, + INVALC,0x6570,INVALC,0x656E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A37,INVALC,0x6E43,INVALC, + 0x6A3A,INVALC,0x6A40,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A47,0x6A44,INVALC,INVALC, + 0x6A36,0x6A3E,0x6A3D,INVALC,0x6A3C,0x6A42,INVALC,INVALC, + 0x6A43,INVALC,0x6A3F,0x6A35,INVALC,0x6A38,0x6A39,0x6A41, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A46, + INVALC,INVALC,0x6A3B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A45,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E3B,0x6E44,0x6E40,INVALC,INVALC,0x6E3D,0x6E41,INVALC, + 0x6E37,INVALC,INVALC,0x6E3F,INVALC,INVALC,INVALC,INVALC, + 0x6E3E,0x6E42,INVALC,INVALC,0x6E3C,INVALC,INVALC,0x6E39, + INVALC,INVALC,0x6E45,INVALC,0x6E38,INVALC,INVALC,INVALC, + INVALC,0x6E46,INVALC,0x6E3A,INVALC,INVALC,INVALC,INVALC, + /* Block 127, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x716A,0x716F,0x7168,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7170,0x7169,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x716B,INVALC,0x716E,0x716D,INVALC, + INVALC,INVALC,INVALC,0x716C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7469,INVALC,INVALC,0x7463,0x7473, + INVALC,0x746B,0x7467,INVALC,0x746E,0x7471,INVALC,0x7466, + INVALC,0x746F,INVALC,INVALC,INVALC,0x746A,0x7464,0x7472, + INVALC,0x746D,INVALC,0x7468,INVALC,0x746C,0x7465,INVALC, + 0x7470,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7725,INVALC,0x767E,0x7721,INVALC,INVALC, + INVALC,0x7726,0x7723,INVALC,INVALC,INVALC,0x7722,INVALC, + INVALC,0x7724,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7862,0x7863,0x785F,INVALC,0x7860,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7864,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7861,INVALC,INVALC,0x7A2B,0x7A2A,INVALC,INVALC, + INVALC,INVALC,0x7A2C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A7D,INVALC,INVALC,0x7A7C, + INVALC,INVALC,INVALC,0x7C41,0x7C43,INVALC,0x7C42,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7D39,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x484F,INVALC, + 0x527E,INVALC,0x574D,INVALC,INVALC,0x5C5F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7474,INVALC,INVALC,INVALC, + 0x7727,INVALC,INVALC,INVALC,0x7A2D,INVALC,INVALC,INVALC, + 0x7C64,INVALC,INVALC,INVALC,0x4F2C,0x4B38,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x574E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6575,0x6576,INVALC,INVALC,INVALC,0x6574,INVALC, + 0x6A48,INVALC,0x6577,INVALC,INVALC,0x6E47,INVALC,0x6E48, + INVALC,0x7171,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7865,INVALC,INVALC, + 0x7C65,INVALC,0x4850,0x4F2E,0x4F2D,INVALC,0x5321,INVALC, + INVALC,INVALC,INVALC,INVALC,0x574F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C61,INVALC,INVALC,INVALC,0x5C60,INVALC, + INVALC,INVALC,INVALC,INVALC,0x657A,INVALC,INVALC,INVALC, + 0x6579,0x6578,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E49, + INVALC,INVALC,0x7172,INVALC,INVALC,INVALC,0x7866,INVALC, + 0x7868,0x7867,INVALC,INVALC,0x7A7E,0x4851,INVALC,0x5322, + INVALC,0x5751,INVALC,INVALC,INVALC,0x5750,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C62,INVALC,0x5C63,INVALC, + INVALC,INVALC,0x5C64,INVALC,0x6144,0x6145,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A4B, + 0x6A49,0x6A4A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E4A,INVALC,INVALC,INVALC,INVALC,0x7175,INVALC, + 0x7173,0x7174,INVALC,0x7475,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7728,INVALC,0x7729,0x7476,INVALC,INVALC,INVALC, + /* Block 129, Array index 0x4000 */ + 0x7A2E,0x4852,INVALC,0x4853,0x5753,0x4F2F,0x5752,INVALC, + INVALC,INVALC,INVALC,0x6146,0x4854,0x5324,INVALC,INVALC, + 0x5323,0x5325,0x4855,INVALC,INVALC,0x5755,INVALC,0x5757, + 0x5754,0x5756,INVALC,INVALC,0x5C65,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E4B,INVALC, + 0x7176,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4856,INVALC,INVALC,0x5326,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5758,INVALC,0x5759, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C67,INVALC, + INVALC,INVALC,0x5C66,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6147,INVALC,INVALC,INVALC,0x657B,INVALC, + 0x657C,INVALC,0x6A4D,INVALC,INVALC,INVALC,0x6A4C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x747A, + 0x7479,0x7477,0x7478,0x747B,INVALC,INVALC,0x772B,0x772A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B6F,0x7B6E,0x4857, + INVALC,INVALC,INVALC,INVALC,0x657E,0x6148,0x657D,0x6A4E, + INVALC,0x4858,INVALC,0x4859,0x485A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B3A,INVALC,INVALC,0x4B39,INVALC, + 0x4B3C,INVALC,0x4B3E,0x4B3D,INVALC,0x4B3B,INVALC,INVALC, + INVALC,0x4F34,0x4F32,INVALC,INVALC,0x4F31,INVALC,INVALC, + INVALC,0x4F36,0x4F38,0x4F35,INVALC,INVALC,INVALC,0x4F39, + INVALC,0x4F33,0x4B3F,INVALC,0x4F37,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F30,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x532A,0x532B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x532C,INVALC,0x532F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5327,INVALC, + INVALC,INVALC,0x5329,0x532E,INVALC,0x5332,0x5330,INVALC, + INVALC,0x532D,INVALC,INVALC,0x5331,0x5328,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x575E,INVALC,0x5767, + 0x575C,0x575A,INVALC,0x5762,0x575F,INVALC,INVALC,INVALC, + 0x5761,INVALC,INVALC,INVALC,0x5766,0x5764,INVALC,INVALC, + /* Block 130, Array index 0x4100 */ + INVALC,INVALC,0x575B,INVALC,INVALC,0x575D,0x5760,INVALC, + 0x5763,INVALC,0x5765,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C69,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C6A,0x5C6E,INVALC,INVALC,INVALC, + INVALC,0x5C6C,INVALC,0x5C6B,INVALC,INVALC,INVALC,0x5C68, + 0x5C6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x614E,INVALC,INVALC,INVALC,INVALC,0x6150,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x614F,INVALC, + INVALC,INVALC,INVALC,0x614B,0x6151,INVALC,0x614D,INVALC, + 0x6A4F,0x614C,INVALC,0x6152,0x614A,0x6149,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6624,0x662A,INVALC, + INVALC,INVALC,INVALC,0x6627,INVALC,INVALC,0x6625,INVALC, + 0x6622,0x6621,INVALC,0x6626,0x6153,INVALC,INVALC,INVALC, + 0x6623,0x6628,0x6629,INVALC,INVALC,INVALC,INVALC,0x6A54, + 0x6A50,INVALC,0x6A55,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A52,INVALC,0x6A53,INVALC,INVALC,INVALC,INVALC,0x6A51, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E51,INVALC,0x6E50,0x6E4C,0x6E4D,0x6E4E,INVALC,INVALC, + 0x6E4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7179,0x7178,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7177,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x747E,INVALC,INVALC,0x7524,0x7526,0x7523, + 0x7522,INVALC,0x7521,0x747D,INVALC,INVALC,0x747C,INVALC, + INVALC,0x7525,INVALC,INVALC,INVALC,0x772C,INVALC,0x772D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7869,INVALC,0x7A2F,INVALC,INVALC,INVALC,INVALC,0x7B70, + INVALC,INVALC,0x7C44,0x485B,INVALC,0x4F3A,INVALC,0x6A56, + 0x7527,INVALC,0x485C,INVALC,0x5769,0x5768,INVALC,INVALC, + INVALC,INVALC,INVALC,0x485D,0x5333,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A57,0x717A,0x485E,INVALC,0x4F3B,INVALC, + /* Block 131, Array index 0x4200 */ + 0x576A,INVALC,0x5C6F,INVALC,INVALC,0x662B,INVALC,0x6A58, + 0x717B,0x7528,0x772E,INVALC,0x485F,0x4F3C,INVALC,INVALC, + 0x576B,INVALC,0x6154,INVALC,0x6A59,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4860,0x6155,INVALC,0x6A5A,0x4861, + INVALC,INVALC,0x5334,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x576E,INVALC,0x576C,0x576D,0x576F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C70,0x5C72,0x5C71, + INVALC,0x5C73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x662C, + INVALC,INVALC,INVALC,0x6A5B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x717C,0x717D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A30,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4862,0x4B40, + INVALC,0x7529,0x4863,INVALC,INVALC,INVALC,INVALC,0x7C6C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4864,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B42,INVALC,0x4B43,INVALC,INVALC, + INVALC,INVALC,0x4B41,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F3F,INVALC,INVALC,INVALC,0x4F3E,INVALC,0x4F42, + INVALC,INVALC,INVALC,0x4F49,INVALC,0x4F46,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F45,0x4F40,INVALC,0x4F47, + 0x4F4A,0x4F44,INVALC,0x4F3D,INVALC,INVALC,INVALC,0x4F4C, + 0x4F48,0x4F43,INVALC,0x5770,INVALC,0x4F41,0x4F4B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5345,0x533F,0x5347,0x5344,INVALC,INVALC,0x5340, + INVALC,INVALC,INVALC,0x5339,0x5343,INVALC,0x5346,0x5348, + INVALC,INVALC,INVALC,0x5338,INVALC,0x533C,0x533A,0x5335, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5349, + INVALC,0x5341,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 132, Array index 0x4300 */ + INVALC,0x5342,0x533D,0x5336,0x533B,0x5337,0x534A,INVALC, + INVALC,0x533E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x577E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5823,INVALC,INVALC,0x5771,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5822,0x577B,INVALC,0x5779,0x5778,0x577D,INVALC, + 0x5775,0x577C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5821,INVALC,INVALC,0x5824,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5777,0x5774,INVALC,INVALC,INVALC,INVALC,0x577A, + 0x5776,INVALC,0x5772,INVALC,0x5773,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D23, + 0x5C77,INVALC,INVALC,0x5D24,0x5D25,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D26,INVALC, + INVALC,0x5D21,0x5C7D,INVALC,INVALC,INVALC,0x5C74,INVALC, + INVALC,INVALC,0x5C7C,0x5C7E,INVALC,INVALC,0x5C79,INVALC, + 0x5C76,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C75,INVALC, + 0x5D22,INVALC,0x5C78,INVALC,INVALC,INVALC,INVALC,0x5D27, + INVALC,INVALC,INVALC,0x5C7B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C7A,INVALC,INVALC, + INVALC,0x615D,INVALC,INVALC,INVALC,0x615B,INVALC,INVALC, + INVALC,INVALC,0x6168,INVALC,0x6165,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x616E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x616C,INVALC,INVALC,0x616F, + 0x615A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6156,INVALC,INVALC,INVALC,INVALC,INVALC,0x615E, + 0x6163,0x615F,0x6167,INVALC,0x6160,INVALC,INVALC,INVALC, + 0x6158,INVALC,INVALC,INVALC,INVALC,0x6166,INVALC,INVALC, + /* Block 133, Array index 0x4400 */ + INVALC,INVALC,INVALC,0x6157,0x616B,INVALC,INVALC,0x616D, + INVALC,INVALC,0x6162,0x615C,0x6164,0x6159,0x616A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x655C,INVALC,INVALC,INVALC, + INVALC,0x6630,INVALC,INVALC,INVALC,0x6638,INVALC,INVALC, + 0x6169,INVALC,INVALC,INVALC,0x6637,0x662F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x663D,INVALC, + INVALC,0x6634,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6161, + INVALC,INVALC,INVALC,0x6636,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6639,INVALC,0x663A,INVALC,INVALC,0x6632,INVALC, + INVALC,0x663B,INVALC,0x6633,0x6635,0x663C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6631,INVALC,0x662E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x662D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A68,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A60,INVALC,INVALC,0x6A63,INVALC,0x6A61,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A62,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A65,INVALC,INVALC,INVALC,0x6A69,INVALC,INVALC,0x6A5D, + 0x6A66,INVALC,INVALC,INVALC,0x6A5F,INVALC,0x6A5E,INVALC, + INVALC,0x6A5C,0x6A6B,0x6A64,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A6A,INVALC,0x6A67,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E5D,INVALC,0x6E55,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E5F, + /* Block 134, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E60,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E59,INVALC,0x6E58,0x6E5C,INVALC,INVALC,0x6E52, + INVALC,INVALC,0x6E54,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E5B,INVALC,0x6E5A,INVALC,0x6E5E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E56,0x6E57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6E53,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7225,INVALC,INVALC,INVALC,INVALC, + 0x7222,0x7226,0x717E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7221,INVALC,INVALC,INVALC,INVALC,0x7229,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7223,0x7224,0x7228,INVALC,INVALC,0x7227,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x752C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x752B,INVALC,INVALC,0x7532, + INVALC,INVALC,0x7534,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x752E,INVALC,INVALC,0x752F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7531,0x752D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7535,INVALC, + 0x7533,0x7730,0x752A,INVALC,INVALC,INVALC,INVALC,0x7530, + 0x7734,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7736,0x7735,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7733,INVALC,INVALC,INVALC,0x7731,INVALC,0x772F, + 0x7732,INVALC,INVALC,INVALC,INVALC,0x786D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x786B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x786E,0x786F,INVALC,INVALC, + INVALC,0x786A,0x786C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7870, + INVALC,0x7A32,0x7A34,0x7A31,INVALC,INVALC,INVALC,INVALC, + /* Block 135, Array index 0x4600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A35,0x7A37, + INVALC,INVALC,0x7A38,0x7A36,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A33,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B21, + INVALC,INVALC,0x7B23,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B22,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C45,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C46, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F4D,INVALC, + 0x534B,INVALC,INVALC,INVALC,0x5825,0x5D28,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6170,0x663F,INVALC,0x663E,0x6640, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7536, + INVALC,INVALC,INVALC,0x4865,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x534C,0x534E,0x534D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5826,INVALC,0x582B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5828,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x582D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x582C,0x5829,INVALC,INVALC,INVALC, + INVALC,0x582A,0x5827,INVALC,INVALC,INVALC,INVALC,0x5D32, + INVALC,0x5D31,INVALC,INVALC,INVALC,0x5D2E,0x5D2C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D2B,INVALC,INVALC,INVALC,0x5D2D,INVALC,0x5D2F,0x5D2A, + INVALC,0x5D33,INVALC,0x5D30,INVALC,INVALC,INVALC,INVALC, + 0x6177,INVALC,INVALC,INVALC,0x6174,INVALC,INVALC,INVALC, + INVALC,0x6172,INVALC,0x6175,INVALC,INVALC,0x6178,0x6171, + INVALC,INVALC,INVALC,INVALC,0x6176,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6173,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6641,INVALC,0x6647,INVALC,INVALC,0x6646,INVALC, + /* Block 136, Array index 0x4700 */ + 0x6645,INVALC,0x6648,0x6649,INVALC,INVALC,0x664A,0x6644, + 0x6643,INVALC,0x664B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6642,INVALC,INVALC,INVALC,INVALC, + 0x6A72,INVALC,INVALC,INVALC,0x6A6D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A6F,INVALC,INVALC,0x6A70,INVALC,INVALC, + INVALC,0x6A75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A71,INVALC,INVALC,0x6A74, + INVALC,INVALC,INVALC,0x6A6E,INVALC,INVALC,INVALC,0x6A6C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E6A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6E6B,INVALC,0x6A73,INVALC,0x6E69, + INVALC,0x6E68,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E64,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E65,INVALC, + 0x6E67,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E62,INVALC,0x6E63,INVALC, + 0x6E66,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E61,0x722A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x722E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x722C,0x722B, + INVALC,INVALC,0x722D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x753C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7539,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x753E,0x753D,INVALC,INVALC,INVALC,INVALC, + 0x7537,INVALC,INVALC,INVALC,INVALC,INVALC,0x753B,INVALC, + 0x753F,INVALC,INVALC,0x7540,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7538,0x753A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x773A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7738,INVALC,INVALC,0x7737, + INVALC,INVALC,0x7739,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7874,INVALC,0x7871,INVALC,INVALC,0x7875,INVALC, + /* Block 137, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x7872,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7873,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A39,0x7A3A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B27, + INVALC,0x7B26,0x7B25,0x7B24,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C47,INVALC,INVALC,INVALC,INVALC,0x7C66,INVALC, + INVALC,0x7C67,INVALC,0x7D27,INVALC,INVALC,INVALC,INVALC, + 0x4866,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4867,0x534F,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D34,INVALC,INVALC,INVALC,0x6179, + INVALC,0x664C,INVALC,0x6E6C,INVALC,0x6E6D,INVALC,INVALC, + INVALC,0x722F,0x7C68,0x4868,INVALC,INVALC,INVALC,INVALC, + 0x4F50,INVALC,INVALC,0x5350,INVALC,INVALC,INVALC,INVALC, + 0x582E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x582F, + INVALC,0x5833,INVALC,INVALC,INVALC,0x5832,INVALC,INVALC, + INVALC,0x5830,0x5831,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D36,INVALC,INVALC,0x5D3B,INVALC,0x5D3A,INVALC,INVALC, + INVALC,INVALC,0x5D38,INVALC,INVALC,INVALC,0x5D39,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D35,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D37,INVALC,INVALC,INVALC,INVALC, + INVALC,0x617C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x617A,0x617B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6654,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6656,INVALC,0x664E,0x6655,INVALC,INVALC, + 0x6651,0x664F,INVALC,INVALC,0x6650,0x6652,INVALC,0x664D, + INVALC,0x6653,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A7C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A7E, + INVALC,INVALC,INVALC,0x6A76,0x6A78,INVALC,INVALC,INVALC, + 0x6A7A,0x6A79,INVALC,INVALC,INVALC,0x6A7B,INVALC,INVALC, + /* Block 138, Array index 0x4900 */ + INVALC,INVALC,0x6A77,INVALC,INVALC,INVALC,INVALC,0x6E6F, + INVALC,INVALC,0x6E73,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E6E,INVALC,0x6E70,0x6E71,INVALC,0x6E72,INVALC,INVALC, + INVALC,INVALC,0x6A7D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7234,INVALC,INVALC,INVALC,0x7232,INVALC,INVALC, + INVALC,INVALC,0x7230,0x7233,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7231,INVALC,INVALC,INVALC,0x7542,INVALC, + 0x7544,INVALC,INVALC,0x7541,INVALC,0x7545,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7543,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7878,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7879,0x7877, + 0x7876,INVALC,INVALC,INVALC,0x7A3B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B28,INVALC,0x7B29,INVALC,INVALC,0x7B72, + INVALC,INVALC,0x7B71,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4869, + INVALC,0x5351,INVALC,0x617D,INVALC,INVALC,0x773B,INVALC, + INVALC,INVALC,INVALC,0x4B44,INVALC,INVALC,INVALC,0x5D3D, + INVALC,INVALC,INVALC,0x5D3C,INVALC,INVALC,0x617E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6657,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7236,INVALC, + INVALC,INVALC,0x7235,INVALC,0x7546,INVALC,INVALC,INVALC, + INVALC,INVALC,0x773C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7A3C,INVALC,INVALC,0x7B2A,INVALC,INVALC, + 0x7D28,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B45,INVALC,0x5352,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6658,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x773D,INVALC,INVALC,INVALC, + 0x7A3D,INVALC,INVALC,INVALC,0x7B73,INVALC,INVALC,INVALC, + /* Block 139, Array index 0x4A00 */ + 0x4B46,INVALC,0x5354,0x5355,INVALC,INVALC,INVALC,INVALC, + 0x5353,INVALC,0x5839,INVALC,0x5837,INVALC,0x5836,0x583D, + 0x5835,0x583E,INVALC,0x583B,INVALC,0x5838,0x583C,0x583A, + 0x5834,INVALC,INVALC,0x5D45,INVALC,0x5D3F,INVALC,0x5D44, + INVALC,INVALC,0x5D46,0x5D40,INVALC,0x5D41,INVALC,INVALC, + INVALC,INVALC,0x5D3E,INVALC,INVALC,0x5D43,INVALC,INVALC, + INVALC,0x5D42,INVALC,INVALC,0x622B,INVALC,0x622D,INVALC, + INVALC,INVALC,0x622C,0x6221,0x6225,INVALC,0x666B,INVALC, + INVALC,0x6226,INVALC,INVALC,INVALC,INVALC,0x622A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6229,INVALC,INVALC,INVALC,0x6227,0x6223,0x622E,INVALC, + INVALC,INVALC,INVALC,0x6228,INVALC,INVALC,0x6224,INVALC, + 0x6222,INVALC,0x6666,0x6661,INVALC,INVALC,0x665C,INVALC, + 0x666C,0x665D,INVALC,0x6659,0x6668,0x6665,0x6667,INVALC, + 0x665E,0x6663,0x665A,0x665B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6669,INVALC,0x666A,0x6660,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6664,INVALC,0x665F, + INVALC,INVALC,INVALC,INVALC,0x6B22,0x6B25,INVALC,INVALC, + INVALC,0x6B2D,INVALC,0x6B27,INVALC,0x6E78,INVALC,INVALC, + 0x6B2C,INVALC,0x6B2E,INVALC,INVALC,INVALC,0x6B23,INVALC, + 0x6662,0x6B26,INVALC,0x6B24,0x6B28,0x6B2A,0x6B21,0x6B2F, + 0x6B2B,INVALC,0x6B29,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F21,INVALC,0x6E7B,INVALC,INVALC,INVALC,0x6F24,INVALC, + INVALC,0x6F25,INVALC,INVALC,0x6E74,INVALC,INVALC,0x6E7E, + INVALC,INVALC,0x6E7D,INVALC,0x6E77,INVALC,INVALC,0x6E76, + INVALC,0x6E7C,INVALC,0x6E79,INVALC,0x6F23,INVALC,INVALC, + INVALC,INVALC,0x6E75,INVALC,INVALC,INVALC,0x6F22,INVALC, + INVALC,INVALC,INVALC,0x6F26,0x723C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7237,0x723D, + INVALC,INVALC,INVALC,0x7239,INVALC,0x7243,0x723E,INVALC, + INVALC,0x723A,INVALC,0x7244,INVALC,INVALC,0x7245,0x7242, + 0x6E7A,INVALC,0x7238,INVALC,0x7246,INVALC,0x723F,INVALC, + /* Block 140, Array index 0x4B00 */ + 0x723B,0x7240,0x7241,INVALC,0x754E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x754B,INVALC,INVALC,INVALC,0x7547,INVALC, + 0x754F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7548, + INVALC,0x7549,INVALC,0x754A,INVALC,0x754D,INVALC,INVALC, + 0x754C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x773E,INVALC,INVALC,0x7741,0x7740,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x773F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x787A,INVALC,INVALC,INVALC,INVALC,0x7923,INVALC, + INVALC,0x787D,INVALC,INVALC,INVALC,INVALC,0x7921,0x7922, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x787C,0x7924,0x787E,INVALC,0x787B,INVALC,INVALC,0x7A42, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A40,INVALC, + INVALC,INVALC,INVALC,0x7A43,0x7A3F,INVALC,INVALC,0x7A41, + 0x7A3E,INVALC,INVALC,INVALC,0x7B2B,INVALC,INVALC,0x7B2C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B2D,INVALC,INVALC, + 0x7B74,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C48,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C6A,0x7C69,INVALC,INVALC,0x7C6B,INVALC, + INVALC,INVALC,0x7D34,INVALC,0x7D3A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x4C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B47, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7551, + INVALC,0x7550,INVALC,INVALC,INVALC,INVALC,0x4B48,INVALC, + 0x583F,0x5D47,INVALC,INVALC,0x6F27,INVALC,0x6F28,INVALC, + 0x7742,INVALC,INVALC,INVALC,0x7D43,0x4B49,INVALC,INVALC, + INVALC,INVALC,0x5D48,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x622F,0x666D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B30,0x7247,0x6F29,0x7248,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7552,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5841,0x5840,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6230,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x666F,0x666E,INVALC,0x6B32,0x6B31,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7249,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B4A,0x5356,INVALC, + 0x5357,0x5842,0x5843,INVALC,INVALC,INVALC,INVALC,0x5D4E, + 0x5D4C,0x5D49,0x5D4D,0x5D4B,0x5D4A,INVALC,INVALC,0x6231, + INVALC,INVALC,0x6674,0x6233,0x6238,INVALC,0x623A,0x6239, + 0x623C,INVALC,INVALC,0x6236,0x6232,0x6234,INVALC,0x623B, + 0x6237,0x6235,0x6676,0x6675,0x6673,0x6677,INVALC,0x6671, + 0x6672,INVALC,0x6670,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B34,0x6B35,0x6B33,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6F32,INVALC,0x6F2B,INVALC, + 0x6F2A,0x6F34,0x6F30,0x6F31,0x6F2D,INVALC,0x6F2C,INVALC, + INVALC,INVALC,0x6F33,INVALC,0x6F2E,0x6F2F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x724A,INVALC,INVALC,INVALC, + 0x7556,INVALC,0x7553,0x7557,0x7555,0x7554,INVALC,INVALC, + /* Block 142, Array index 0x4D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x7743,INVALC,INVALC, + 0x7925,INVALC,0x7926,INVALC,INVALC,0x7A45,INVALC,0x7A44, + INVALC,INVALC,INVALC,0x7B2E,INVALC,INVALC,0x7B75,0x7B76, + INVALC,INVALC,INVALC,0x7C6D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B4B,INVALC,0x5D50,0x5D4F, + INVALC,INVALC,INVALC,0x6B36,INVALC,0x6F35,INVALC,INVALC, + 0x4B4C,INVALC,INVALC,0x5359,0x5358,INVALC,INVALC,0x5844, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x623F,INVALC,INVALC,INVALC,0x623E,INVALC,INVALC, + INVALC,INVALC,0x623D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6B38,INVALC,INVALC, + INVALC,0x6B37,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F36, + INVALC,INVALC,INVALC,0x6F37,INVALC,INVALC,INVALC,INVALC, + 0x7558,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B4D,0x535A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D52,INVALC,INVALC,INVALC,0x5D51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6247,INVALC, + INVALC,INVALC,INVALC,0x6242,0x6245,INVALC,0x6240,INVALC, + INVALC,0x6244,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6243,0x6246,INVALC,0x6241,INVALC,0x6679, + INVALC,0x6678,INVALC,INVALC,0x6721,INVALC,0x6722,INVALC, + 0x667A,INVALC,0x667E,INVALC,INVALC,INVALC,INVALC,0x667B, + INVALC,INVALC,INVALC,0x667C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x667D,INVALC,0x6B39,INVALC,INVALC,INVALC, + /* Block 143, Array index 0x4E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F3C, + 0x6F39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F3A,0x6F40,0x6F3E, + INVALC,0x6F3F,0x6F3B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F3D,INVALC,0x6F38,INVALC,INVALC,INVALC,INVALC, + INVALC,0x724C,INVALC,INVALC,0x724D,0x7250,INVALC,INVALC, + INVALC,0x724F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x724E,INVALC,0x724B,INVALC,INVALC,INVALC, + 0x755B,0x7559,0x755C,0x755A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7749,INVALC,INVALC, + INVALC,0x7744,INVALC,INVALC,INVALC,INVALC,INVALC,0x7748, + INVALC,INVALC,INVALC,0x7745,0x7747,INVALC,0x7746,INVALC, + INVALC,INVALC,INVALC,INVALC,0x792B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7928,INVALC,0x792D,INVALC,0x792A,INVALC, + INVALC,INVALC,0x792C,INVALC,0x7927,INVALC,INVALC,INVALC, + INVALC,0x7A47,0x7A49,INVALC,INVALC,0x7A48,INVALC,0x7929, + INVALC,0x7A46,0x7B2F,0x7B31,INVALC,0x7B30,INVALC,INVALC, + INVALC,0x7B77,INVALC,0x7B78,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D29,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7D3B,0x4B4E,0x5845,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6723,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F41,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x774A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B4F,0x4F51,0x535C,0x535B,INVALC,0x5848, + INVALC,INVALC,0x5846,INVALC,0x5847,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D53,INVALC,INVALC,INVALC,0x5D54, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6249,INVALC,INVALC,0x6248,0x624A,INVALC,0x6726,INVALC, + /* Block 144, Array index 0x4F00 */ + INVALC,INVALC,INVALC,0x6724,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6725,0x6727,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B3B,0x6B3D,0x6B3A,0x6B3C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F43,0x6F48,0x6F42,0x6F49,0x6F44, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F4A,0x6F46,INVALC, + INVALC,0x6F45,0x6F47,INVALC,INVALC,INVALC,INVALC,0x7252, + INVALC,INVALC,INVALC,0x7254,INVALC,INVALC,INVALC,INVALC, + 0x7253,INVALC,INVALC,0x7251,INVALC,INVALC,0x755E,0x7561, + INVALC,INVALC,0x755F,INVALC,0x755D,0x7560,INVALC,INVALC, + INVALC,0x774B,INVALC,INVALC,INVALC,0x774C,0x792F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x792E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B32, + INVALC,0x7B79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B50,0x624B,INVALC,INVALC,0x6728, + INVALC,INVALC,INVALC,0x6B3E,INVALC,INVALC,0x7256,INVALC, + 0x7255,INVALC,INVALC,INVALC,INVALC,0x7930,0x7A29,0x7B33, + 0x4B51,0x5849,0x6729,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B52,INVALC,0x4B55,0x4B54,0x4B53,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F52,INVALC, + INVALC,0x4F54,INVALC,INVALC,0x4F53,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x535F,INVALC,0x5364,0x5361,0x535E,INVALC, + 0x5365,INVALC,0x5360,0x5363,INVALC,0x5362,INVALC,INVALC, + 0x535D,INVALC,INVALC,INVALC,0x584F,INVALC,INVALC,0x584C, + 0x5853,INVALC,0x584E,INVALC,INVALC,0x5851,INVALC,INVALC, + /* Block 145, Array index 0x5000 */ + 0x584D,0x584A,INVALC,0x5850,INVALC,0x5852,0x584B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D56,INVALC,0x5D60, + 0x5D5C,INVALC,INVALC,INVALC,0x5D64,0x5D5D,0x5D62,0x5D58, + INVALC,0x5D55,0x5D57,0x5D63,INVALC,0x5D5B,0x5D5E,0x5D5A, + 0x5D5F,INVALC,0x5D61,0x5D59,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x624C,INVALC, + INVALC,0x624E,0x6250,INVALC,INVALC,0x624D,0x6251,INVALC, + 0x624F,INVALC,INVALC,INVALC,0x672F,INVALC,0x6737,INVALC, + INVALC,0x6738,0x672D,INVALC,INVALC,INVALC,INVALC,0x6732, + INVALC,INVALC,0x672B,0x672A,INVALC,0x6735,0x6734,0x6733, + 0x6731,0x6736,INVALC,0x672C,0x672E,0x6730,INVALC,INVALC, + 0x6B40,0x6B43,INVALC,0x6B47,0x6B41,0x6B46,0x6B44,INVALC, + 0x6B3F,INVALC,0x6B45,0x6B42,INVALC,INVALC,INVALC,INVALC, + 0x6F4D,0x6F4B,INVALC,INVALC,INVALC,0x6F4E,0x6F4C,INVALC, + INVALC,INVALC,0x725A,INVALC,0x7258,0x7257,INVALC,0x6F4F, + 0x7259,INVALC,0x725C,INVALC,0x725B,0x7563,INVALC,0x7562, + 0x7567,0x7565,0x7566,0x774E,0x7564,INVALC,INVALC,0x774D, + 0x774F,INVALC,0x7931,0x7932,INVALC,INVALC,INVALC,0x7C4A, + 0x7C49,0x4B57,INVALC,INVALC,INVALC,0x5854,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B58,0x4B5B,INVALC,INVALC,0x4B5A,INVALC, + INVALC,INVALC,0x4B59,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F57,INVALC,INVALC,INVALC,0x4F55,0x4F58,INVALC, + 0x4F56,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5368,INVALC,0x5369,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5366,INVALC,INVALC,INVALC,0x5367,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5856,INVALC,INVALC, + INVALC,0x5855,0x5857,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D65,INVALC,INVALC,INVALC,INVALC,0x5D66,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6253,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D67,0x6255,INVALC, + /* Block 146, Array index 0x5100 */ + INVALC,INVALC,0x6252,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6254,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6739,INVALC,INVALC,INVALC,INVALC,0x673A, + 0x6B49,0x6B48,INVALC,INVALC,INVALC,INVALC,0x6B4A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F52, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F51,INVALC,INVALC, + 0x6F50,0x6F53,INVALC,INVALC,0x725D,INVALC,INVALC,INVALC, + INVALC,0x7568,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7B7A,0x4B5C,0x536B,0x536A,0x585A,0x5859,INVALC,INVALC, + INVALC,INVALC,0x5858,INVALC,INVALC,INVALC,INVALC,0x5D68, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6256,INVALC,0x6257,INVALC,INVALC, + INVALC,0x673D,0x673C,INVALC,0x673B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6B4E,0x6B4B,INVALC,0x6B4D, + 0x6B4C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F57,INVALC,INVALC,INVALC,0x6F54, + INVALC,0x6F55,INVALC,0x6F56,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x725E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x756B,INVALC,0x756A,INVALC, + INVALC,INVALC,INVALC,0x7569,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7750,0x7751,INVALC,0x7934,INVALC, + INVALC,0x7933,INVALC,INVALC,0x7A4A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B34,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C6E,0x7D2A,INVALC,INVALC,INVALC,0x7D3C,0x4B5D,0x4F59, + INVALC,0x673E,INVALC,0x7A4B,0x4B5E,0x536C,0x5D69,0x6258, + 0x7752,0x4F5A,INVALC,INVALC,INVALC,INVALC,INVALC,0x585D, + 0x585B,0x585F,INVALC,INVALC,0x585E,0x585C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D6C,INVALC,INVALC,0x5D6B,0x5D6D, + INVALC,0x5D6F,INVALC,INVALC,INVALC,0x5D6E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D6A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 147, Array index 0x5200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6260, + INVALC,0x625C,INVALC,INVALC,INVALC,0x625E,INVALC,INVALC, + 0x625F,0x6261,INVALC,INVALC,0x6259,0x625A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x625D,INVALC, + INVALC,INVALC,INVALC,0x625B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6749,INVALC,INVALC,0x673F, + 0x6741,0x674D,INVALC,INVALC,INVALC,0x6742,0x6744,0x674E, + 0x6743,INVALC,INVALC,INVALC,INVALC,0x674C,INVALC,INVALC, + INVALC,0x674A,INVALC,0x6746,INVALC,0x674B,INVALC,INVALC, + INVALC,0x6748,INVALC,INVALC,INVALC,INVALC,INVALC,0x6740, + INVALC,INVALC,0x674F,0x6745,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6747,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B4F,INVALC,INVALC,0x6B55,0x6B59,INVALC,INVALC,INVALC, + 0x6B51,INVALC,INVALC,INVALC,INVALC,0x6B52,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B5A,INVALC,0x6B56,INVALC,INVALC,0x6B54,INVALC, + 0x6B53,INVALC,INVALC,INVALC,0x6B57,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B58,INVALC,INVALC,INVALC,0x6B50,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F63,0x6F5E,INVALC,INVALC,INVALC,0x6F5A, + INVALC,INVALC,INVALC,0x6F59,0x6F5F,INVALC,INVALC,INVALC, + INVALC,0x6F5D,INVALC,INVALC,INVALC,0x6F58,INVALC,0x6F61, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F60,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6F5C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F5B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F62,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7261,INVALC,INVALC,INVALC,0x7265,INVALC,INVALC,INVALC, + /* Block 148, Array index 0x5300 */ + INVALC,INVALC,INVALC,INVALC,0x7267,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7269,INVALC,INVALC,INVALC,INVALC,0x726C,INVALC,INVALC, + 0x7573,0x726E,0x7268,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x725F,0x726B,0x7264,INVALC,INVALC,INVALC,0x726A,INVALC, + 0x756E,INVALC,INVALC,0x7266,INVALC,INVALC,0x726D,0x7263, + INVALC,INVALC,INVALC,0x7262,INVALC,INVALC,0x7260,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7570,0x7572,INVALC,0x756C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7579,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7578,0x7576,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7571,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7575,INVALC,INVALC,INVALC, + 0x7577,INVALC,INVALC,INVALC,INVALC,0x756F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7574,INVALC, + INVALC,INVALC,0x756D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7754,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7753,INVALC,0x7755,0x775D, + 0x775B,INVALC,0x775C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7756,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7759,INVALC,0x7758,INVALC, + 0x775A,INVALC,INVALC,0x7757,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7938,INVALC,INVALC,INVALC,INVALC, + 0x7939,INVALC,INVALC,INVALC,INVALC,0x793E,INVALC,INVALC, + INVALC,0x7936,INVALC,INVALC,INVALC,INVALC,0x793C,0x7941, + 0x793F,INVALC,INVALC,INVALC,0x793A,0x793B,INVALC,0x7937, + INVALC,0x7935,0x793D,INVALC,0x7940,INVALC,INVALC,INVALC, + 0x7942,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7A4E,INVALC,INVALC, + /* Block 149, Array index 0x5400 */ + INVALC,INVALC,INVALC,0x7A4D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A4C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B3B,INVALC,INVALC,0x7B35,INVALC, + INVALC,INVALC,0x7B3A,0x7B36,INVALC,0x7B37,INVALC,INVALC, + 0x7B39,INVALC,0x7B38,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7B7B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B7C,0x7B7D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C4C,INVALC,INVALC,0x7C4B,0x7C4D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C6F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7D2C,INVALC,0x7D2B,INVALC,INVALC,INVALC,INVALC,0x7D35, + INVALC,INVALC,INVALC,INVALC,0x7D3F,0x7D3D,0x7D3E,0x7D44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x5500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F5B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F5C,INVALC,0x536D,0x5860,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D70,INVALC,0x6264,INVALC,INVALC,0x6268,0x6263, + INVALC,0x6265,0x6267,0x6266,0x6262,INVALC,INVALC,INVALC, + 0x6750,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B5B,INVALC,0x6B5E,0x6B60,0x6B5F,INVALC,INVALC, + 0x6B5C,0x6B5D,INVALC,INVALC,INVALC,0x6F64,INVALC,INVALC, + INVALC,0x6F65,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x726F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x757E,INVALC, + 0x757D,INVALC,0x757A,0x757B,0x757C,INVALC,INVALC,INVALC, + 0x7760,INVALC,INVALC,INVALC,0x775E,0x7761,0x775F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7943,INVALC,INVALC,INVALC, + INVALC,0x7A4F,0x7B3C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x5600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F5D,INVALC,INVALC,INVALC, + INVALC,0x486A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B62,INVALC,0x4B63,INVALC,0x4B60,INVALC, + INVALC,0x4B61,0x4B5F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F60,INVALC,INVALC,INVALC,0x4F5F, + 0x4F5E,INVALC,0x4F62,INVALC,0x4F61,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x536F,0x5370,0x5371,INVALC,INVALC, + 0x536E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5867,INVALC,INVALC,0x5864,INVALC,0x5865,0x5868,INVALC, + INVALC,0x5863,0x5861,0x5862,0x5866,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D71,INVALC,0x5D79,INVALC,INVALC,INVALC, + 0x5D75,INVALC,0x6270,0x5D73,0x5D76,0x5D72,0x5D77,0x5D78, + 0x5D74,INVALC,INVALC,INVALC,INVALC,0x626C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6271,0x626D,0x626E,INVALC, + INVALC,INVALC,0x6269,0x626B,INVALC,0x626F,0x626A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6752,0x6753,INVALC,INVALC, + 0x6751,0x6B61,INVALC,0x6B63,0x6B62,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7270, + 0x7271,INVALC,0x7272,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7621,INVALC,INVALC,0x7944,INVALC,INVALC,INVALC, + 0x7622,0x4F63,INVALC,0x5869,INVALC,INVALC,INVALC,INVALC, + 0x5D7A,0x6272,INVALC,INVALC,0x6274,0x6273,0x6275,0x6276, + INVALC,0x6756,0x6757,0x6755,0x6B64,0x6754,INVALC,INVALC, + INVALC,INVALC,0x6B65,INVALC,INVALC,0x7273,0x7623,INVALC, + INVALC,0x7764,INVALC,0x7765,0x7763,INVALC,0x7766,INVALC, + INVALC,INVALC,0x7762,0x7945,INVALC,INVALC,INVALC,INVALC, + 0x4F64,0x5D7C,0x5D7B,INVALC,INVALC,INVALC,INVALC,0x6277, + INVALC,INVALC,0x6278,INVALC,INVALC,INVALC,0x675B,0x6758, + INVALC,0x675A,INVALC,0x6759,INVALC,INVALC,INVALC,INVALC, + /* Block 152, Array index 0x5700 */ + 0x6B66,INVALC,INVALC,INVALC,0x6F66,INVALC,0x6F67,0x6F68, + INVALC,0x6F69,INVALC,INVALC,INVALC,0x7277,0x7274,0x7279, + INVALC,0x7275,INVALC,0x7278,INVALC,INVALC,0x7276,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7624,INVALC,0x7625,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7767,INVALC,INVALC,0x7947, + INVALC,INVALC,0x7946,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A50,INVALC,0x7B3F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7B3D,0x7B3E,INVALC,INVALC,INVALC,0x7B7E,0x7C21,INVALC, + INVALC,INVALC,0x7C70,INVALC,0x7C72,INVALC,INVALC,INVALC, + 0x7C71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F65,INVALC,INVALC,INVALC,0x675C,INVALC, + INVALC,INVALC,INVALC,0x727A,0x727B,INVALC,0x4F66,INVALC, + 0x6F6A,0x7948,0x5372,INVALC,INVALC,INVALC,0x727C,INVALC, + 0x7C4E,0x5373,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x675D,INVALC,0x675E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6B67,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6B68,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F6C,INVALC,0x6F6B,INVALC,0x6F6D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x727D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7626,INVALC,INVALC,0x7768,INVALC,INVALC,0x7769,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x776A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C23,INVALC,0x7C22,INVALC,INVALC,0x7C73,INVALC, + INVALC,0x7D36,INVALC,0x5374,0x6279,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7627,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7949,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5375,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5376,INVALC,INVALC,0x6B69,INVALC, + INVALC,0x776B,INVALC,0x794A,INVALC,INVALC,INVALC,0x7B40, + /* Block 153, Array index 0x5800 */ + INVALC,0x5377,0x5E21,0x5E22,INVALC,0x627A,0x627B,INVALC, + 0x627C,INVALC,0x6762,INVALC,0x6764,INVALC,INVALC,INVALC, + 0x675F,0x6760,0x6763,0x6761,INVALC,INVALC,INVALC,0x6B6A, + 0x6B6B,INVALC,INVALC,INVALC,0x6F70,INVALC,INVALC,INVALC, + INVALC,0x6F6E,INVALC,INVALC,0x7326,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F6F,INVALC,0x7324,INVALC,INVALC, + 0x727E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7323, + 0x7321,0x7325,INVALC,0x7322,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7628,INVALC, + INVALC,INVALC,INVALC,INVALC,0x776E,0x776C,0x776F,0x776D, + INVALC,INVALC,INVALC,0x7770,INVALC,INVALC,INVALC,INVALC, + 0x794C,INVALC,INVALC,0x794D,INVALC,INVALC,0x794B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B42,INVALC,0x7B41, + INVALC,INVALC,INVALC,0x7C24,INVALC,INVALC,INVALC,0x7C4F, + 0x7C74,0x7D2D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5378,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B6C, + INVALC,0x6B6D,INVALC,0x6F71,INVALC,INVALC,0x7629,INVALC, + INVALC,INVALC,0x7771,INVALC,0x794E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A51,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5379,INVALC,INVALC,INVALC,0x537A, + INVALC,INVALC,0x586A,INVALC,INVALC,INVALC,INVALC,0x627D, + INVALC,0x6322,0x627E,INVALC,INVALC,0x6324,INVALC,0x6321, + INVALC,INVALC,0x6323,INVALC,0x6766,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6765,0x6767,0x6768,INVALC, + /* Block 154, Array index 0x5900 */ + INVALC,INVALC,INVALC,0x6B6E,INVALC,0x6B6F,INVALC,INVALC, + INVALC,0x6B71,0x6F72,INVALC,0x6B70,INVALC,INVALC,INVALC, + 0x7327,INVALC,0x6F74,0x6F73,INVALC,INVALC,INVALC,INVALC, + 0x6F75,INVALC,0x732C,0x732A,INVALC,INVALC,0x7329,INVALC, + INVALC,0x732B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7328,INVALC,INVALC,INVALC,INVALC,INVALC,0x7775,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x762A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7774,0x7772,0x7773, + INVALC,INVALC,INVALC,INVALC,INVALC,0x794F,INVALC,INVALC, + INVALC,0x7950,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A53,0x7A52,INVALC,INVALC,0x7C25,INVALC,0x7B43, + INVALC,INVALC,INVALC,INVALC,0x7C50,INVALC,0x7D2E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x537B,INVALC, + INVALC,0x537C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7776,INVALC,INVALC, + 0x7A54,INVALC,INVALC,INVALC,0x586B,0x6326,0x6325,INVALC, + INVALC,0x676A,INVALC,0x6769,0x676B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B72,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F77,0x6F7A,0x6F7C,INVALC,INVALC,0x6F7B,INVALC,INVALC, + INVALC,0x6F7D,INVALC,0x6F79,INVALC,0x6F76,INVALC,0x6F78, + INVALC,INVALC,0x732E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x732D,INVALC,INVALC, + INVALC,0x732F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x762C, + /* Block 155, Array index 0x5A00 */ + INVALC,0x762B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7777,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7951,INVALC, + INVALC,0x7952,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A55,INVALC,INVALC,INVALC,INVALC, + 0x7A56,INVALC,INVALC,INVALC,INVALC,0x7A58,INVALC,0x7A57, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B47,INVALC, + 0x7B46,INVALC,INVALC,0x7B45,INVALC,0x7B44,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C27,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C26,INVALC,0x7C53, + INVALC,INVALC,0x7C51,0x7C52,INVALC,INVALC,INVALC,0x7C75, + INVALC,INVALC,0x7D37,INVALC,INVALC,0x7D38,INVALC,INVALC, + INVALC,INVALC,0x7D47,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x586C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B73, + 0x6B74,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F7E, + 0x7330,INVALC,INVALC,INVALC,0x7331,INVALC,INVALC,INVALC, + INVALC,0x7778,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B48, + INVALC,0x7C56,0x7C28,0x7C54,0x7C55,INVALC,0x7D2F,INVALC, + 0x586D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x676C,INVALC,INVALC,INVALC,INVALC,0x6B75,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7333,0x7021,0x7022, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7332,INVALC,INVALC,INVALC,INVALC, + /* Block 156, Array index 0x5B00 */ + INVALC,INVALC,INVALC,0x7779,INVALC,INVALC,0x777A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7953,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C29,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C76,0x7D30,INVALC,0x586E,INVALC,0x7023, + 0x7334,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D48,0x586F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5870,INVALC,INVALC,INVALC, + INVALC,0x6B76,0x6B77,INVALC,0x7025,0x7024,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x777D,0x777C,0x777B, + INVALC,0x7B4A,INVALC,INVALC,0x7B49,INVALC,INVALC,INVALC, + 0x7C77,INVALC,0x5E23,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7027, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7026, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7335,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x762F,0x762E,INVALC,0x7630,0x762D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7824,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7823,0x7821,0x777E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7956,INVALC, + INVALC,INVALC,INVALC,0x7957,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7955, + 0x7954,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7822,INVALC,INVALC, + /* Block 157, Array index 0x5C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7A5A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A59,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B4C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B4B,INVALC,INVALC, + INVALC,0x7C2B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7C2D,INVALC,INVALC,0x7C2C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7C57,INVALC,0x7C59,0x7C58, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C78, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D40, + 0x7D41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E24,INVALC,INVALC, + INVALC,0x676D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B7A,0x6B78,INVALC,0x6B79,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 158, Array index 0x5D00 */ + INVALC,INVALC,INVALC,0x702A,INVALC,INVALC,0x7028,INVALC, + INVALC,0x7029,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x733A,INVALC,INVALC,0x7336,INVALC,INVALC, + INVALC,INVALC,INVALC,0x733B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7337,INVALC,INVALC,0x7338,INVALC, + 0x7339,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7631,INVALC,INVALC,INVALC,0x7632, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7825,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7826,INVALC,INVALC, + 0x7827,0x7959,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x795B,INVALC,0x795C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x795A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7958,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B4D, + INVALC,INVALC,INVALC,INVALC,0x7B4E,INVALC,INVALC,INVALC, + 0x7B50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B4F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7C2E,INVALC,INVALC,INVALC,0x7C2F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C5A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C79,0x7C7A,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 159, Array index 0x5E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7D45,0x7D49,INVALC,INVALC,0x7D4A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E25,INVALC,INVALC, + INVALC,0x7A5B,INVALC,INVALC,0x7C7B,0x7C7C,INVALC,0x5E26, + INVALC,INVALC,0x676E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7633,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x795D,0x795F,INVALC,INVALC,INVALC,0x795E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B51,INVALC,0x7C5B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E27,INVALC,INVALC, + INVALC,0x702B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7960,0x7A5C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E28,0x6B7B,INVALC,0x702C,INVALC, + INVALC,INVALC,INVALC,0x6327,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7D31,0x6328,0x702D,0x7634, + INVALC,0x6329,INVALC,INVALC,0x733D,INVALC,INVALC,INVALC, + 0x733C,INVALC,INVALC,0x7638,0x7636,0x7637,0x7635,INVALC, + 0x7828,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B52, + INVALC,INVALC,INVALC,INVALC,0x7C5C,INVALC,INVALC,0x7D42, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 160, Array index 0x5F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C7D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x676F,INVALC, + INVALC,INVALC,INVALC,0x6770,INVALC,0x7829,INVALC,INVALC, + INVALC,0x7B53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6771,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x782A,INVALC,INVALC,0x7A5E, + INVALC,INVALC,INVALC,INVALC,0x7C30,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B7C,INVALC,INVALC,0x7639,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B7D,0x763A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x702F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7B54,INVALC,INVALC,0x7A5F, + INVALC,0x7A61,INVALC,0x7A60,INVALC,INVALC,0x7B55,0x7B56, + INVALC,INVALC,0x7C32,INVALC,0x7C31,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7D21,INVALC,INVALC,INVALC,INVALC,0x7C7E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x733E,INVALC,INVALC, + 0x7832,INVALC,INVALC,INVALC,0x7C33,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x733F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 255, Array index 0x6000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x212B,0x2136,0x2138,INVALC,INVALC,0x2140,0x2141,0x2144, + 0x2145,0x2148,0x2149,0x214C,0x214D,0x2150,0x2151,0x2154, + 0x2155,0x2158,0x2159,0x215C,0x215D,INVALC,INVALC,INVALC, + INVALC,0x2227,0x2228,0x222B,0x222C,0x2229,0x222A,INVALC, + 0x212E,0x212F,0x2130,INVALC,0x2132,0x2133,0x2134,0x2135, + INVALC,0x215E,0x215F,0x2160,0x2161,0x2162,0x2163,0x222D, + 0x222E,0x222F,0x223F,0x2240,0x2241,0x2243,0x2242,INVALC, + 0x2262,0x226C,0x226D,0x226E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 256, Array index 0x6100 */ + INVALC,0x212A,INVALC,0x216C,0x2263,0x2268,0x216D,INVALC, + 0x213E,0x213F,0x216E,0x2230,0x2122,0x2231,0x2125,0x225F, + 0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427,0x2428, + 0x2429,0x242A,0x2128,0x2127,0x2236,0x2238,0x2237,0x2129, + 0x2269,0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447, + 0x2448,0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F, + 0x2450,0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457, + 0x2458,0x2459,0x245A,INVALC,0x2260,INVALC,INVALC,0x2225, + INVALC,0x245B,0x245C,0x245D,0x245E,0x245F,0x2460,0x2461, + 0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469, + 0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470,0x2471, + 0x2472,0x2473,0x2474,0x2142,0x225E,0x2143,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2266,0x2267,INVALC,INVALC,INVALC,0x2264,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_CNS11643_PLANE1 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> cns11643_plane1 size-optimized table (22050 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_cns11643_plane1[] = +{ + 0x017D, /* Ranges number */ + 0x0DA3, /* Unranged codes number */ + 0x0FCB, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x02C7, 0x02CB, 0x047A, + /* Array index: 0x0006 */ 0x0391, 0x03A9, 0x047F, + /* Array index: 0x0009 */ 0x03B1, 0x03C9, 0x0498, + /* Array index: 0x000C */ 0x2160, 0x2169, 0x04B1, + /* Array index: 0x000F */ 0x2170, 0x2179, 0x04BB, + /* Array index: 0x0012 */ 0x2190, 0x2199, 0x04C5, + /* Array index: 0x0015 */ 0x221E, 0x2220, 0x04CF, + /* Array index: 0x0018 */ 0x2229, 0x222B, 0x04D2, + /* Array index: 0x001B */ 0x2400, 0x2421, 0x04D5, + /* Array index: 0x001E */ 0x2460, 0x2469, 0x04F7, + /* Array index: 0x0021 */ 0x2474, 0x247D, 0x0501, + /* Array index: 0x0024 */ 0x256D, 0x2573, 0x050B, + /* Array index: 0x0027 */ 0x2581, 0x258F, 0x0512, + /* Array index: 0x002A */ 0x25E2, 0x25E5, 0x0521, + /* Array index: 0x002D */ 0x2640, 0x2642, 0x0525, + /* Array index: 0x0030 */ 0x3000, 0x3003, 0x0528, + /* Array index: 0x0033 */ 0x3008, 0x3015, 0x052C, + /* Array index: 0x0036 */ 0x301D, 0x3029, 0x053A, + /* Array index: 0x0039 */ 0x3105, 0x3129, 0x0547, + /* Array index: 0x003C */ 0x339C, 0x339E, 0x056C, + /* Array index: 0x003F */ 0x4E08, 0x4E19, 0x056F, + /* Array index: 0x0042 */ 0x4E4B, 0x4E53, 0x0581, + /* Array index: 0x0045 */ 0x4E5D, 0x4E5F, 0x058A, + /* Array index: 0x0048 */ 0x4E91, 0x4E95, 0x058D, + /* Array index: 0x004B */ 0x4E9E, 0x4EAE, 0x0592, + /* Array index: 0x004E */ 0x4EC0, 0x4ECD, 0x05A3, + /* Array index: 0x0051 */ 0x4ED4, 0x4ED9, 0x05B1, + /* Array index: 0x0054 */ 0x4EE3, 0x4EE5, 0x05B7, + /* Array index: 0x0057 */ 0x4F09, 0x4F11, 0x05BA, + /* Array index: 0x005A */ 0x4F46, 0x4F48, 0x05C3, + /* Array index: 0x005D */ 0x4F4D, 0x4F60, 0x05C6, + /* Array index: 0x0060 */ 0x4FB5, 0x4FB7, 0x05DA, + /* Array index: 0x0063 */ 0x4FC2, 0x4FC4, 0x05DD, + /* Array index: 0x0066 */ 0x4FCE, 0x4FD1, 0x05E0, + /* Array index: 0x0069 */ 0x4FDD, 0x4FE1, 0x05E4, + /* Array index: 0x006C */ 0x5009, 0x501A, 0x05E9, + /* Array index: 0x006F */ 0x5025, 0x502D, 0x05FB, + /* Array index: 0x0072 */ 0x5074, 0x5077, 0x0604, + /* Array index: 0x0075 */ 0x5096, 0x509A, 0x0608, + /* Array index: 0x0078 */ 0x513B, 0x514D, 0x060D, + /* Array index: 0x007B */ 0x5159, 0x516E, 0x0620, + /* Array index: 0x007E */ 0x5175, 0x5178, 0x0636, + /* Array index: 0x0081 */ 0x51CB, 0x51CD, 0x063A, + /* Array index: 0x0084 */ 0x51F6, 0x51FA, 0x063D, + /* Array index: 0x0087 */ 0x5206, 0x520A, 0x0642, + /* Array index: 0x008A */ 0x5224, 0x522A, 0x0647, + /* Array index: 0x008D */ 0x5236, 0x523B, 0x064E, + /* Array index: 0x0090 */ 0x524A, 0x524E, 0x0654, + /* Array index: 0x0093 */ 0x525B, 0x525D, 0x0659, + /* Array index: 0x0096 */ 0x5287, 0x528A, 0x065C, + /* Array index: 0x0099 */ 0x52A9, 0x52AC, 0x0660, + /* Array index: 0x009C */ 0x52D5, 0x52E6, 0x0664, + /* Array index: 0x009F */ 0x5315, 0x5319, 0x0676, + /* Array index: 0x00A2 */ 0x533E, 0x534A, 0x067B, + /* Array index: 0x00A5 */ 0x5351, 0x5354, 0x0688, + /* Array index: 0x00A8 */ 0x536E, 0x537B, 0x068C, + /* Array index: 0x00AB */ 0x53C8, 0x53CD, 0x069A, + /* Array index: 0x00AE */ 0x53E2, 0x53F5, 0x06A0, + /* Array index: 0x00B1 */ 0x5406, 0x5412, 0x06B4, + /* Array index: 0x00B4 */ 0x541B, 0x5420, 0x06C1, + /* Array index: 0x00B7 */ 0x5429, 0x542E, 0x06C7, + /* Array index: 0x00BA */ 0x5435, 0x5443, 0x06CD, + /* Array index: 0x00BD */ 0x5473, 0x547D, 0x06DC, + /* Array index: 0x00C0 */ 0x54A6, 0x54AC, 0x06E7, + /* Array index: 0x00C3 */ 0x54BD, 0x54C9, 0x06EE, + /* Array index: 0x00C6 */ 0x54E5, 0x54EE, 0x06FB, + /* Array index: 0x00C9 */ 0x5555, 0x5557, 0x0705, + /* Array index: 0x00CC */ 0x5580, 0x5584, 0x0708, + /* Array index: 0x00CF */ 0x5587, 0x558B, 0x070D, + /* Array index: 0x00D2 */ 0x5598, 0x559F, 0x0712, + /* Array index: 0x00D5 */ 0x55AA, 0x55B3, 0x071A, + /* Array index: 0x00D8 */ 0x55C5, 0x55C9, 0x0724, + /* Array index: 0x00DB */ 0x55E1, 0x55E8, 0x0729, + /* Array index: 0x00DE */ 0x562E, 0x5636, 0x0731, + /* Array index: 0x00E1 */ 0x5664, 0x566C, 0x073A, + /* Array index: 0x00E4 */ 0x568E, 0x5690, 0x0743, + /* Array index: 0x00E7 */ 0x56C0, 0x56C2, 0x0746, + /* Array index: 0x00EA */ 0x56C8, 0x56CC, 0x0749, + /* Array index: 0x00ED */ 0x56DA, 0x56E0, 0x074E, + /* Array index: 0x00F0 */ 0x572C, 0x5730, 0x0755, + /* Array index: 0x00F3 */ 0x574D, 0x5751, 0x075A, + /* Array index: 0x00F6 */ 0x582F, 0x5835, 0x075F, + /* Array index: 0x00F9 */ 0x584A, 0x584C, 0x0766, + /* Array index: 0x00FC */ 0x5914, 0x591C, 0x0769, + /* Array index: 0x00FF */ 0x5927, 0x592E, 0x0772, + /* Array index: 0x0102 */ 0x5947, 0x5949, 0x077A, + /* Array index: 0x0105 */ 0x594E, 0x595A, 0x077D, + /* Array index: 0x0108 */ 0x5981, 0x5984, 0x078A, + /* Array index: 0x010B */ 0x59A3, 0x59A5, 0x078E, + /* Array index: 0x010E */ 0x59D0, 0x59D4, 0x0791, + /* Array index: 0x0111 */ 0x5ABC, 0x5AC2, 0x0796, + /* Array index: 0x0114 */ 0x5AD6, 0x5AD8, 0x079D, + /* Array index: 0x0117 */ 0x5B08, 0x5B0C, 0x07A0, + /* Array index: 0x011A */ 0x5B50, 0x5B5F, 0x07A5, + /* Array index: 0x011D */ 0x5B85, 0x5B8C, 0x07B5, + /* Array index: 0x0120 */ 0x5B97, 0x5B9C, 0x07BD, + /* Array index: 0x0123 */ 0x5BA2, 0x5BA6, 0x07C3, + /* Array index: 0x0126 */ 0x5BB3, 0x5BB9, 0x07C8, + /* Array index: 0x0129 */ 0x5BC2, 0x5BC7, 0x07CF, + /* Array index: 0x012C */ 0x5BDE, 0x5BF0, 0x07D5, + /* Array index: 0x012F */ 0x5C07, 0x5C11, 0x07E8, + /* Array index: 0x0132 */ 0x5C37, 0x5C41, 0x07F3, + /* Array index: 0x0135 */ 0x5C4B, 0x5C51, 0x07FE, + /* Array index: 0x0138 */ 0x5DE1, 0x5DE8, 0x0805, + /* Array index: 0x013B */ 0x5DF1, 0x5DF4, 0x080D, + /* Array index: 0x013E */ 0x5E36, 0x5E38, 0x0811, + /* Array index: 0x0141 */ 0x5E5F, 0x5E63, 0x0814, + /* Array index: 0x0144 */ 0x5E72, 0x5E7E, 0x0819, + /* Array index: 0x0147 */ 0x5E95, 0x5E97, 0x0826, + /* Array index: 0x014A */ 0x5EB5, 0x5EB8, 0x0829, + /* Array index: 0x014D */ 0x5EC8, 0x5ECA, 0x082D, + /* Array index: 0x0150 */ 0x5EDF, 0x5EE3, 0x0830, + /* Array index: 0x0153 */ 0x5F12, 0x5F18, 0x0835, + /* Array index: 0x0156 */ 0x5F69, 0x5F71, 0x083C, + /* Array index: 0x0159 */ 0x5F7F, 0x5F81, 0x0845, + /* Array index: 0x015C */ 0x5F85, 0x5F92, 0x0848, + /* Array index: 0x015F */ 0x5F97, 0x5F99, 0x0856, + /* Array index: 0x0162 */ 0x5FA8, 0x5FAE, 0x0859, + /* Array index: 0x0165 */ 0x5FD6, 0x5FD9, 0x0860, + /* Array index: 0x0168 */ 0x6012, 0x6016, 0x0864, + /* Array index: 0x016B */ 0x6025, 0x602B, 0x0869, + /* Array index: 0x016E */ 0x6062, 0x6070, 0x0870, + /* Array index: 0x0171 */ 0x60B2, 0x60BD, 0x087F, + /* Array index: 0x0174 */ 0x60C5, 0x60C7, 0x088B, + /* Array index: 0x0177 */ 0x60DF, 0x60E1, 0x088E, + /* Array index: 0x017A */ 0x60F0, 0x60FB, 0x0891, + /* Array index: 0x017D */ 0x610D, 0x610F, 0x089D, + /* Array index: 0x0180 */ 0x611A, 0x611C, 0x08A0, + /* Array index: 0x0183 */ 0x6147, 0x614E, 0x08A3, + /* Array index: 0x0186 */ 0x6175, 0x6177, 0x08AB, + /* Array index: 0x0189 */ 0x61C7, 0x61CD, 0x08AE, + /* Array index: 0x018C */ 0x61F5, 0x6200, 0x08B5, + /* Array index: 0x018F */ 0x620A, 0x6216, 0x08C1, + /* Array index: 0x0192 */ 0x6230, 0x6236, 0x08CE, + /* Array index: 0x0195 */ 0x623E, 0x6241, 0x08D5, + /* Array index: 0x0198 */ 0x6247, 0x6254, 0x08D9, + /* Array index: 0x019B */ 0x626D, 0x626F, 0x08E7, + /* Array index: 0x019E */ 0x627C, 0x6280, 0x08EA, + /* Array index: 0x01A1 */ 0x6291, 0x6298, 0x08EF, + /* Array index: 0x01A4 */ 0x62C4, 0x62DC, 0x08F7, + /* Array index: 0x01A7 */ 0x62EC, 0x62F4, 0x0910, + /* Array index: 0x01AA */ 0x62FC, 0x6302, 0x0919, + /* Array index: 0x01AD */ 0x6307, 0x6309, 0x0920, + /* Array index: 0x01B0 */ 0x634C, 0x6350, 0x0923, + /* Array index: 0x01B3 */ 0x6367, 0x636B, 0x0928, + /* Array index: 0x01B6 */ 0x63A0, 0x63AC, 0x092D, + /* Array index: 0x01B9 */ 0x6413, 0x6417, 0x093A, + /* Array index: 0x01BC */ 0x6478, 0x647B, 0x093F, + /* Array index: 0x01BF */ 0x64A9, 0x64B3, 0x0943, + /* Array index: 0x01C2 */ 0x64BB, 0x64CE, 0x094E, + /* Array index: 0x01C5 */ 0x64EC, 0x64F4, 0x0962, + /* Array index: 0x01C8 */ 0x652A, 0x652C, 0x096B, + /* Array index: 0x01CB */ 0x6554, 0x6559, 0x096E, + /* Array index: 0x01CE */ 0x6574, 0x6578, 0x0974, + /* Array index: 0x01D1 */ 0x65CB, 0x65CF, 0x0979, + /* Array index: 0x01D4 */ 0x65E5, 0x65ED, 0x097E, + /* Array index: 0x01D7 */ 0x6613, 0x6615, 0x0987, + /* Array index: 0x01DA */ 0x6624, 0x6628, 0x098A, + /* Array index: 0x01DD */ 0x6641, 0x6645, 0x098F, + /* Array index: 0x01E0 */ 0x666E, 0x6670, 0x0994, + /* Array index: 0x01E3 */ 0x6687, 0x6689, 0x0997, + /* Array index: 0x01E6 */ 0x6696, 0x6698, 0x099A, + /* Array index: 0x01E9 */ 0x66F0, 0x66F9, 0x099D, + /* Array index: 0x01EC */ 0x66FC, 0x6700, 0x09A7, + /* Array index: 0x01EF */ 0x6726, 0x672E, 0x09AC, + /* Array index: 0x01F2 */ 0x674E, 0x6757, 0x09B5, + /* Array index: 0x01F5 */ 0x675C, 0x6760, 0x09BF, + /* Array index: 0x01F8 */ 0x676D, 0x6777, 0x09C4, + /* Array index: 0x01FB */ 0x67CF, 0x67D4, 0x09CF, + /* Array index: 0x01FE */ 0x67F1, 0x67F5, 0x09D5, + /* Array index: 0x0201 */ 0x683C, 0x6848, 0x09DA, + /* Array index: 0x0204 */ 0x6850, 0x6854, 0x09E7, + /* Array index: 0x0207 */ 0x687F, 0x6886, 0x09EC, + /* Array index: 0x020A */ 0x68AD, 0x68B5, 0x09F4, + /* Array index: 0x020D */ 0x68F9, 0x68FB, 0x09FD, + /* Array index: 0x0210 */ 0x695A, 0x6960, 0x0A00, + /* Array index: 0x0213 */ 0x69CB, 0x69CD, 0x0A07, + /* Array index: 0x0216 */ 0x6A38, 0x6A3A, 0x0A0A, + /* Array index: 0x0219 */ 0x6B5F, 0x6B67, 0x0A0D, + /* Array index: 0x021C */ 0x6B77, 0x6B7B, 0x0A16, + /* Array index: 0x021F */ 0x6BD2, 0x6BD4, 0x0A1B, + /* Array index: 0x0222 */ 0x6C0F, 0x6C13, 0x0A1E, + /* Array index: 0x0225 */ 0x6C23, 0x6C2F, 0x0A23, + /* Array index: 0x0228 */ 0x6C3E, 0x6C42, 0x0A30, + /* Array index: 0x022B */ 0x6C5B, 0x6C61, 0x0A35, + /* Array index: 0x022E */ 0x6C7D, 0x6C8D, 0x0A3C, + /* Array index: 0x0231 */ 0x6CB8, 0x6CC5, 0x0A4D, + /* Array index: 0x0234 */ 0x6CD3, 0x6CD7, 0x0A5B, + /* Array index: 0x0237 */ 0x6CE0, 0x6CE5, 0x0A60, + /* Array index: 0x023A */ 0x6CEF, 0x6CF5, 0x0A66, + /* Array index: 0x023D */ 0x6D27, 0x6D2B, 0x0A6D, + /* Array index: 0x0240 */ 0x6D35, 0x6D3E, 0x0A72, + /* Array index: 0x0243 */ 0x6D77, 0x6D79, 0x0A7C, + /* Array index: 0x0246 */ 0x6D85, 0x6D8E, 0x0A7F, + /* Array index: 0x0249 */ 0x6D93, 0x6D95, 0x0A89, + /* Array index: 0x024C */ 0x6DC4, 0x6DC7, 0x0A8C, + /* Array index: 0x024F */ 0x6DD8, 0x6DDA, 0x0A90, + /* Array index: 0x0252 */ 0x6DE8, 0x6DEE, 0x0A93, + /* Array index: 0x0255 */ 0x6DF7, 0x6DFB, 0x0A9A, + /* Array index: 0x0258 */ 0x6E19, 0x6E26, 0x0A9F, + /* Array index: 0x025B */ 0x6ED1, 0x6ED5, 0x0AAD, + /* Array index: 0x025E */ 0x6EFE, 0x6F02, 0x0AB2, + /* Array index: 0x0261 */ 0x6F13, 0x6F15, 0x0AB7, + /* Array index: 0x0264 */ 0x6F29, 0x6F2C, 0x0ABA, + /* Array index: 0x0267 */ 0x6F2F, 0x6F33, 0x0ABE, + /* Array index: 0x026A */ 0x6F6D, 0x6F70, 0x0AC3, + /* Array index: 0x026D */ 0x6FC0, 0x6FC3, 0x0AC7, + /* Array index: 0x0270 */ 0x6FDF, 0x6FE1, 0x0ACB, + /* Array index: 0x0273 */ 0x6FEB, 0x6FF1, 0x0ACE, + /* Array index: 0x0276 */ 0x70AB, 0x70AF, 0x0AD5, + /* Array index: 0x0279 */ 0x7164, 0x7169, 0x0ADA, + /* Array index: 0x027C */ 0x71E5, 0x71E7, 0x0AE0, + /* Array index: 0x027F */ 0x71EC, 0x71EE, 0x0AE3, + /* Array index: 0x0282 */ 0x7235, 0x723E, 0x0AE6, + /* Array index: 0x0285 */ 0x7246, 0x7248, 0x0AF0, + /* Array index: 0x0288 */ 0x725D, 0x7262, 0x0AF3, + /* Array index: 0x028B */ 0x72F7, 0x72FD, 0x0AF9, + /* Array index: 0x028E */ 0x7377, 0x737B, 0x0B00, + /* Array index: 0x0291 */ 0x7433, 0x7436, 0x0B05, + /* Array index: 0x0294 */ 0x7459, 0x745F, 0x0B09, + /* Array index: 0x0297 */ 0x74A6, 0x74A9, 0x0B10, + /* Array index: 0x029A */ 0x74E0, 0x74E6, 0x0B14, + /* Array index: 0x029D */ 0x7525, 0x7533, 0x0B1B, + /* Array index: 0x02A0 */ 0x754B, 0x754F, 0x0B2A, + /* Array index: 0x02A3 */ 0x7559, 0x755D, 0x0B2F, + /* Array index: 0x02A6 */ 0x75A2, 0x75A5, 0x0B34, + /* Array index: 0x02A9 */ 0x75B8, 0x75BE, 0x0B38, + /* Array index: 0x02AC */ 0x75F0, 0x75F4, 0x0B3F, + /* Array index: 0x02AF */ 0x75FF, 0x7601, 0x0B44, + /* Array index: 0x02B2 */ 0x761F, 0x7629, 0x0B47, + /* Array index: 0x02B5 */ 0x767B, 0x767E, 0x0B52, + /* Array index: 0x02B8 */ 0x7684, 0x7688, 0x0B56, + /* Array index: 0x02BB */ 0x76C2, 0x76CE, 0x0B5B, + /* Array index: 0x02BE */ 0x76DB, 0x76E7, 0x0B68, + /* Array index: 0x02C1 */ 0x7736, 0x773E, 0x0B75, + /* Array index: 0x02C4 */ 0x7761, 0x776C, 0x0B7E, + /* Array index: 0x02C7 */ 0x779E, 0x77A0, 0x0B8A, + /* Array index: 0x02CA */ 0x77BB, 0x77BF, 0x0B8D, + /* Array index: 0x02CD */ 0x77DA, 0x77DC, 0x0B92, + /* Array index: 0x02D0 */ 0x77ED, 0x77EF, 0x0B95, + /* Array index: 0x02D3 */ 0x792A, 0x792C, 0x0B98, + /* Array index: 0x02D6 */ 0x7946, 0x7949, 0x0B9B, + /* Array index: 0x02D9 */ 0x7955, 0x7957, 0x0B9F, + /* Array index: 0x02DC */ 0x795D, 0x7960, 0x0BA2, + /* Array index: 0x02DF */ 0x798D, 0x798F, 0x0BA6, + /* Array index: 0x02E2 */ 0x79B9, 0x79C1, 0x0BA9, + /* Array index: 0x02E5 */ 0x79E3, 0x79E9, 0x0BB2, + /* Array index: 0x02E8 */ 0x7A1C, 0x7A20, 0x0BB9, + /* Array index: 0x02EB */ 0x7A3B, 0x7A40, 0x0BBE, + /* Array index: 0x02EE */ 0x7A4B, 0x7A4E, 0x0BC4, + /* Array index: 0x02F1 */ 0x7A60, 0x7A62, 0x0BC8, + /* Array index: 0x02F4 */ 0x7A95, 0x7A98, 0x0BCB, + /* Array index: 0x02F7 */ 0x7B4D, 0x7B56, 0x0BCF, + /* Array index: 0x02FA */ 0x7C3D, 0x7C40, 0x0BD9, + /* Array index: 0x02FD */ 0x7C5F, 0x7C65, 0x0BDD, + /* Array index: 0x0300 */ 0x7CDC, 0x7CE2, 0x0BE4, + /* Array index: 0x0303 */ 0x7D02, 0x7D0D, 0x0BEB, + /* Array index: 0x0306 */ 0x7D17, 0x7D22, 0x0BF7, + /* Array index: 0x0309 */ 0x7D2E, 0x7D33, 0x0C03, + /* Array index: 0x030C */ 0x7D40, 0x7D46, 0x0C09, + /* Array index: 0x030F */ 0x7D6E, 0x7D73, 0x0C10, + /* Array index: 0x0312 */ 0x7DAC, 0x7DB5, 0x0C16, + /* Array index: 0x0315 */ 0x7DBA, 0x7DBF, 0x0C20, + /* Array index: 0x0318 */ 0x7DD8, 0x7DE0, 0x0C26, + /* Array index: 0x031B */ 0x7E08, 0x7E0A, 0x0C2F, + /* Array index: 0x031E */ 0x7E2E, 0x7E48, 0x0C32, + /* Array index: 0x0321 */ 0x7E69, 0x7E6D, 0x0C4D, + /* Array index: 0x0324 */ 0x7F88, 0x7F8E, 0x0C52, + /* Array index: 0x0327 */ 0x7FDF, 0x7FE1, 0x0C59, + /* Array index: 0x032A */ 0x8000, 0x8006, 0x0C5C, + /* Array index: 0x032D */ 0x800B, 0x8012, 0x0C63, + /* Array index: 0x0330 */ 0x8015, 0x8019, 0x0C6B, + /* Array index: 0x0333 */ 0x806F, 0x8077, 0x0C70, + /* Array index: 0x0336 */ 0x807D, 0x807F, 0x0C79, + /* Array index: 0x0339 */ 0x8084, 0x808C, 0x0C7C, + /* Array index: 0x033C */ 0x80A9, 0x80AB, 0x0C85, + /* Array index: 0x033F */ 0x80DA, 0x80DE, 0x0C88, + /* Array index: 0x0342 */ 0x80ED, 0x80F4, 0x0C8D, + /* Array index: 0x0345 */ 0x8150, 0x8155, 0x0C95, + /* Array index: 0x0348 */ 0x8170, 0x817A, 0x0C9B, + /* Array index: 0x034B */ 0x8198, 0x819D, 0x0CA6, + /* Array index: 0x034E */ 0x81BD, 0x81C3, 0x0CAC, + /* Array index: 0x0351 */ 0x81FA, 0x8202, 0x0CB3, + /* Array index: 0x0354 */ 0x8205, 0x820D, 0x0CBC, + /* Array index: 0x0357 */ 0x821B, 0x821F, 0x0CC5, + /* Array index: 0x035A */ 0x8228, 0x822C, 0x0CCA, + /* Array index: 0x035D */ 0x8235, 0x8239, 0x0CCF, + /* Array index: 0x0360 */ 0x826E, 0x8272, 0x0CD4, + /* Array index: 0x0363 */ 0x82AC, 0x82BE, 0x0CD9, + /* Array index: 0x0366 */ 0x82D1, 0x82D4, 0x0CEC, + /* Array index: 0x0369 */ 0x82DB, 0x82DF, 0x0CF0, + /* Array index: 0x036C */ 0x82E3, 0x82E7, 0x0CF5, + /* Array index: 0x036F */ 0x8301, 0x8306, 0x0CFA, + /* Array index: 0x0372 */ 0x8331, 0x8339, 0x0D00, + /* Array index: 0x0375 */ 0x83EF, 0x83F4, 0x0D09, + /* Array index: 0x0378 */ 0x840A, 0x840E, 0x0D0F, + /* Array index: 0x037B */ 0x8469, 0x846D, 0x0D14, + /* Array index: 0x037E */ 0x84C9, 0x84CB, 0x0D19, + /* Array index: 0x0381 */ 0x8548, 0x854A, 0x0D1C, + /* Array index: 0x0384 */ 0x8568, 0x856A, 0x0D1F, + /* Array index: 0x0387 */ 0x85A6, 0x85AA, 0x0D22, + /* Array index: 0x038A */ 0x85F7, 0x85FB, 0x0D27, + /* Array index: 0x038D */ 0x865B, 0x865F, 0x0D2C, + /* Array index: 0x0390 */ 0x8679, 0x867B, 0x0D31, + /* Array index: 0x0393 */ 0x8702, 0x870A, 0x0D34, + /* Array index: 0x0396 */ 0x881F, 0x8823, 0x0D3D, + /* Array index: 0x0399 */ 0x8861, 0x8863, 0x0D42, + /* Array index: 0x039C */ 0x895E, 0x8960, 0x0D45, + /* Array index: 0x039F */ 0x8A0C, 0x8A18, 0x0D48, + /* Array index: 0x03A2 */ 0x8A3A, 0x8A3E, 0x0D55, + /* Array index: 0x03A5 */ 0x8A54, 0x8A56, 0x0D5A, + /* Array index: 0x03A8 */ 0x8A68, 0x8A73, 0x0D5D, + /* Array index: 0x03AB */ 0x8AA0, 0x8AAA, 0x0D69, + /* Array index: 0x03AE */ 0x8AF6, 0x8B04, 0x0D74, + /* Array index: 0x03B1 */ 0x8B58, 0x8B5C, 0x0D83, + /* Array index: 0x03B4 */ 0x8C6A, 0x8C6D, 0x0D88, + /* Array index: 0x03B7 */ 0x8C89, 0x8C8D, 0x0D8C, + /* Array index: 0x03BA */ 0x8C9D, 0x8CA2, 0x0D91, + /* Array index: 0x03BD */ 0x8CA7, 0x8CAC, 0x0D97, + /* Array index: 0x03C0 */ 0x8CB2, 0x8CCA, 0x0D9D, + /* Array index: 0x03C3 */ 0x8CD1, 0x8CD3, 0x0DB6, + /* Array index: 0x03C6 */ 0x8CDE, 0x8CE6, 0x0DB9, + /* Array index: 0x03C9 */ 0x8CF8, 0x8CFD, 0x0DC2, + /* Array index: 0x03CC */ 0x8E1D, 0x8E22, 0x0DC8, + /* Array index: 0x03CF */ 0x8E48, 0x8E4B, 0x0DCE, + /* Array index: 0x03D2 */ 0x8E87, 0x8E8D, 0x0DD2, + /* Array index: 0x03D5 */ 0x8EAA, 0x8EAC, 0x0DD9, + /* Array index: 0x03D8 */ 0x8ECA, 0x8ECF, 0x0DDC, + /* Array index: 0x03DB */ 0x8F12, 0x8F15, 0x0DE2, + /* Array index: 0x03DE */ 0x8F1B, 0x8F1F, 0x0DE6, + /* Array index: 0x03E1 */ 0x8FAD, 0x8FB2, 0x0DEB, + /* Array index: 0x03E4 */ 0x8FC2, 0x8FC6, 0x0DF1, + /* Array index: 0x03E7 */ 0x8FE2, 0x8FED, 0x0DF6, + /* Array index: 0x03EA */ 0x9014, 0x9023, 0x0E02, + /* Array index: 0x03ED */ 0x904A, 0x9063, 0x0E12, + /* Array index: 0x03F0 */ 0x9074, 0x9091, 0x0E2C, + /* Array index: 0x03F3 */ 0x9117, 0x9119, 0x0E4A, + /* Array index: 0x03F6 */ 0x9148, 0x914D, 0x0E4D, + /* Array index: 0x03F9 */ 0x9174, 0x9178, 0x0E53, + /* Array index: 0x03FC */ 0x91C5, 0x91D1, 0x0E58, + /* Array index: 0x03FF */ 0x91D7, 0x91DD, 0x0E65, + /* Array index: 0x0402 */ 0x9237, 0x9240, 0x0E6C, + /* Array index: 0x0405 */ 0x9318, 0x931A, 0x0E76, + /* Array index: 0x0408 */ 0x9320, 0x9322, 0x0E79, + /* Array index: 0x040B */ 0x9394, 0x939A, 0x0E7C, + /* Array index: 0x040E */ 0x93D6, 0x93D8, 0x0E83, + /* Array index: 0x0411 */ 0x947C, 0x947F, 0x0E86, + /* Array index: 0x0414 */ 0x958E, 0x9594, 0x0E8A, + /* Array index: 0x0417 */ 0x95A1, 0x95A9, 0x0E91, + /* Array index: 0x041A */ 0x95C8, 0x95CC, 0x0E9A, + /* Array index: 0x041D */ 0x95D4, 0x95D6, 0x0E9F, + /* Array index: 0x0420 */ 0x964B, 0x964D, 0x0EA2, + /* Array index: 0x0423 */ 0x965D, 0x9664, 0x0EA5, + /* Array index: 0x0426 */ 0x9670, 0x9678, 0x0EAD, + /* Array index: 0x0429 */ 0x9684, 0x9686, 0x0EB6, + /* Array index: 0x042C */ 0x968A, 0x968E, 0x0EB9, + /* Array index: 0x042F */ 0x9698, 0x969C, 0x0EBE, + /* Array index: 0x0432 */ 0x96C0, 0x96CD, 0x0EC3, + /* Array index: 0x0435 */ 0x96E8, 0x96EA, 0x0ED1, + /* Array index: 0x0438 */ 0x970D, 0x9713, 0x0ED4, + /* Array index: 0x043B */ 0x975E, 0x9762, 0x0EDB, + /* Array index: 0x043E */ 0x97FF, 0x9813, 0x0EE0, + /* Array index: 0x0441 */ 0x9837, 0x983B, 0x0EF5, + /* Array index: 0x0444 */ 0x984C, 0x984F, 0x0EFA, + /* Array index: 0x0447 */ 0x986F, 0x9871, 0x0EFE, + /* Array index: 0x044A */ 0x98FC, 0x98FE, 0x0F01, + /* Array index: 0x044D */ 0x993D, 0x993F, 0x0F04, + /* Array index: 0x0450 */ 0x99AC, 0x99AE, 0x0F07, + /* Array index: 0x0453 */ 0x99D0, 0x99D2, 0x0F0A, + /* Array index: 0x0456 */ 0x9ACF, 0x9AD8, 0x0F0D, + /* Array index: 0x0459 */ 0x9AED, 0x9AEF, 0x0F17, + /* Array index: 0x045C */ 0x9B41, 0x9B45, 0x0F1A, + /* Array index: 0x045F */ 0x9B4D, 0x9B51, 0x0F1F, + /* Array index: 0x0462 */ 0x9BAA, 0x9BAE, 0x0F24, + /* Array index: 0x0465 */ 0x9BC8, 0x9BCA, 0x0F29, + /* Array index: 0x0468 */ 0x9ECC, 0x9ED1, 0x0F2C, + /* Array index: 0x046B */ 0x9EDB, 0x9EE0, 0x0F32, + /* Array index: 0x046E */ 0xFE30, 0xFE44, 0x0F38, + /* Array index: 0x0471 */ 0xFE49, 0xFE6B, 0x0F4D, + /* Array index: 0x0474 */ 0xFF01, 0xFF3C, 0x0F70, + /* Array index: 0x0477 */ 0xFF3F, 0xFF5D, 0x0FAC, + /* Ranges content */ + /* Range 0x02C7 - 0x02CB, array index: 0x047A */ + 0x256F,INVALC,0x256D,0x256E,0x2570, + /* Range 0x0391 - 0x03A9, array index: 0x047F */ + 0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C, + 0x247D,0x247E,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526, + 0x2527,INVALC,0x2528,0x2529,0x252A,0x252B,0x252C,0x252D, + 0x252E, + /* Range 0x03B1 - 0x03C9, array index: 0x0498 */ + 0x252F,0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536, + 0x2537,0x2538,0x2539,0x253A,0x253B,0x253C,0x253D,0x253E, + 0x253F,INVALC,0x2540,0x2541,0x2542,0x2543,0x2544,0x2545, + 0x2546, + /* Range 0x2160 - 0x2169, array index: 0x04B1 */ + 0x242B,0x242C,0x242D,0x242E,0x242F,0x2430,0x2431,0x2432, + 0x2433,0x2434, + /* Range 0x2170 - 0x2179, array index: 0x04BB */ + 0x2635,0x2636,0x2637,0x2638,0x2639,0x263A,0x263B,0x263C, + 0x263D,0x263E, + /* Range 0x2190 - 0x2199, array index: 0x04C5 */ + 0x2258,0x2255,0x2257,0x2256,INVALC,INVALC,0x2259,0x225A, + 0x225C,0x225B, + /* Range 0x221E - 0x2220, array index: 0x04CF */ + 0x223C,0x2249,0x2248, + /* Range 0x2229 - 0x222B, array index: 0x04D2 */ + 0x2245,0x2246,0x224D, + /* Range 0x2400 - 0x2421, array index: 0x04D5 */ + 0x4221,0x4222,0x4223,0x4224,0x4225,0x4226,0x4227,0x4228, + 0x4229,0x422A,0x422B,0x422C,0x422D,0x422E,0x422F,0x4230, + 0x4231,0x4232,0x4233,0x4234,0x4235,0x4236,0x4237,0x4238, + 0x4239,0x423A,0x423B,0x423C,0x423D,0x423E,0x423F,0x4240, + INVALC,0x4241, + /* Range 0x2460 - 0x2469, array index: 0x04F7 */ + 0x2621,0x2622,0x2623,0x2624,0x2625,0x2626,0x2627,0x2628, + 0x2629,0x262A, + /* Range 0x2474 - 0x247D, array index: 0x0501 */ + 0x262B,0x262C,0x262D,0x262E,0x262F,0x2630,0x2631,0x2632, + 0x2633,0x2634, + /* Range 0x256D - 0x2573, array index: 0x050B */ + 0x2340,0x2341,0x2343,0x2342,0x234C,0x234D,0x234E, + /* Range 0x2581 - 0x258F, array index: 0x0512 */ + 0x2324,0x2325,0x2326,0x2327,0x2328,0x2329,0x232A,0x232B, + 0x2332,0x2331,0x2330,0x232F,0x232E,0x232D,0x232C, + /* Range 0x25E2 - 0x25E5, array index: 0x0521 */ + 0x2348,0x2349,0x234B,0x234A, + /* Range 0x2640 - 0x2642, array index: 0x0525 */ + 0x2251,0x2253,0x2252, + /* Range 0x3000 - 0x3003, array index: 0x0528 */ + 0x2121,0x2123,0x2124,0x2171, + /* Range 0x3008 - 0x3015, array index: 0x052C */ + 0x2152,0x2153,0x214E,0x214F,0x2156,0x2157,0x215A,0x215B, + 0x214A,0x214B,0x2265,INVALC,0x2146,0x2147, + /* Range 0x301D - 0x3029, array index: 0x053A */ + 0x2168,0x2169,INVALC,INVALC,0x2435,0x2436,0x2437,0x2438, + 0x2439,0x243A,0x243B,0x243C,0x243D, + /* Range 0x3105 - 0x3129, array index: 0x0547 */ + 0x2547,0x2548,0x2549,0x254A,0x254B,0x254C,0x254D,0x254E, + 0x254F,0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556, + 0x2557,0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E, + 0x255F,0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566, + 0x2567,0x2568,0x2569,0x256A,0x256B, + /* Range 0x339C - 0x339E, array index: 0x056C */ + 0x2270,0x2271,0x2272, + /* Range 0x4E08 - 0x4E19, array index: 0x056F */ + 0x4437,0x4435,0x4438,0x4436,INVALC,0x4462,INVALC,INVALC, + 0x4461,0x4460,INVALC,INVALC,0x4562,0x4561,0x4560,INVALC, + 0x4563,0x455F, + /* Range 0x4E4B - 0x4E53, array index: 0x0581 */ + 0x4466,INVALC,0x4565,0x4567,0x4566,INVALC,INVALC,0x4724, + 0x4725, + /* Range 0x4E5D - 0x4E5F, array index: 0x058A */ + 0x4426,0x443F,0x443E, + /* Range 0x4E91 - 0x4E95, array index: 0x058D */ + 0x4469,0x446B,INVALC,0x446C,0x446A, + /* Range 0x4E9E - 0x4EAE, array index: 0x0592 */ + 0x4B69,0x4F67,INVALC,0x4441,0x446D,INVALC,0x4728,0x472A, + 0x4729,INVALC,0x486C,INVALC,INVALC,0x4B6A,0x4B6B,0x4F68, + 0x4F69, + /* Range 0x4EC0 - 0x4ECD, array index: 0x05A3 */ + 0x446F,0x446E,INVALC,0x4470,0x4476,INVALC,0x4471,0x4472, + INVALC,INVALC,0x4474,0x4475,INVALC,0x4473, + /* Range 0x4ED4 - 0x4ED9, array index: 0x05B1 */ + 0x456A,0x456B,0x456C,0x456D,0x4569,0x4570, + /* Range 0x4EE3 - 0x4EE5, array index: 0x05B7 */ + 0x456E,0x456F,0x4568, + /* Range 0x4F09 - 0x4F11, array index: 0x05BA */ + 0x472C,0x472E,0x473B,INVALC,0x4730,INVALC,0x4733,0x4731, + 0x4732, + /* Range 0x4F46 - 0x4F48, array index: 0x05C3 */ + 0x487E,0x486F,0x4929, + /* Range 0x4F4D - 0x4F60, array index: 0x05C6 */ + 0x486D,0x4925,0x486E,0x4876,0x4877,INVALC,INVALC,0x487C, + 0x4874,INVALC,0x4870,INVALC,0x4927,0x492A,0x4873,0x4922, + 0x4928,0x4871,INVALC,0x4923, + /* Range 0x4FB5 - 0x4FB7, array index: 0x05DA */ + 0x4F6B,0x4F73,0x5021, + /* Range 0x4FC2 - 0x4FC4, array index: 0x05DD */ + 0x4F7B,0x4F72,0x4F7A, + /* Range 0x4FCE - 0x4FD1, array index: 0x05E0 */ + 0x4F7D,0x4F70,0x4F79,0x4F6F, + /* Range 0x4FDD - 0x4FE1, array index: 0x05E4 */ + 0x4F71,0x4F7E,0x4F75,0x4F6E,0x4F6A, + /* Range 0x5009 - 0x501A, array index: 0x05E9 */ + 0x543F,INVALC,0x5436,0x5421,0x5422,INVALC,0x5924,INVALC, + 0x542F,0x542E,INVALC,0x5432,INVALC,0x5429,INVALC,0x5438, + 0x5437,0x542D, + /* Range 0x5025 - 0x502D, array index: 0x05FB */ + 0x5426,0x5425,INVALC,0x5433,0x5428,0x543C,0x543E,INVALC, + 0x543B, + /* Range 0x5074 - 0x5077, array index: 0x0604 */ + 0x5921,0x587E,0x587B,0x5922, + /* Range 0x5096 - 0x509A, array index: 0x0608 */ + 0x5E2F,INVALC,0x5E30,0x5E2C,0x5E31, + /* Range 0x513B - 0x514D, array index: 0x060D */ + 0x7B58,0x7B57,INVALC,INVALC,0x442A,0x4442,0x4478,INVALC, + 0x4477,0x4573,0x4572,0x473E,0x473D,0x473F,0x473C,INVALC, + 0x492C,0x492B,0x492D, + /* Range 0x5159 - 0x516E, array index: 0x0620 */ + 0x2279,INVALC,0x227A,0x5927,0x227C,0x227B,INVALC,INVALC, + 0x227D,0x677E,0x227E,INVALC,0x442B,INVALC,0x4479,0x4740, + 0x4C25,INVALC,0x442C,0x447C,0x447A,0x447B, + /* Range 0x5175 - 0x5178, array index: 0x0636 */ + 0x492E,0x4C27,0x4C26,0x4C28, + /* Range 0x51CB - 0x51CD, array index: 0x063A */ + 0x5447,0x5445,0x5444, + /* Range 0x51F6 - 0x51FA, array index: 0x063D */ + 0x447E,INVALC,0x4579,0x4577,0x4578, + /* Range 0x5206 - 0x520A, array index: 0x0642 */ + 0x4521,0x4522,0x4523,INVALC,0x457A, + /* Range 0x5224 - 0x522A, array index: 0x0647 */ + 0x4932,0x4931,INVALC,INVALC,0x4935,0x4933,0x4934, + /* Range 0x5236 - 0x523B, array index: 0x064E */ + 0x4C31,0x4C2D,0x4C2C,INVALC,0x4C2E,0x4C2B, + /* Range 0x524A - 0x524E, array index: 0x0654 */ + 0x5028,0x502B,0x502A,0x5029,0x5026, + /* Range 0x525B - 0x525D, array index: 0x0659 */ + 0x544B,0x5449,0x544C, + /* Range 0x5287 - 0x528A, array index: 0x065C */ + 0x6C2A,0x6C2B,0x6C2C,0x6C2E, + /* Range 0x52A9 - 0x52AC, array index: 0x0660 */ + 0x4937,0x4938,0x4936,0x4939, + /* Range 0x52D5 - 0x52E6, array index: 0x0664 */ + 0x592F,INVALC,0x5B2B,0x592E,0x592D,INVALC,0x5E3A,INVALC, + 0x5E39,0x5E38,0x6339,INVALC,INVALC,0x633C,0x633D,0x633B, + INVALC,0x633A, + /* Range 0x5315 - 0x5319, array index: 0x0676 */ + 0x4431,0x4527,0x4621,INVALC,0x5932, + /* Range 0x533E - 0x534A, array index: 0x067B */ + 0x5935,0x5933,0x5934,0x4432,INVALC,0x4445,0x243F,0x452B, + INVALC,0x452A,0x4529,0x4625,0x4624, + /* Range 0x5351 - 0x5354, array index: 0x0688 */ + 0x4C38,0x4C35,0x4C37,0x4C36, + /* Range 0x536E - 0x537B, array index: 0x068C */ + 0x4629,0x4628,0x474D,0x474E,INVALC,0x493B,INVALC,0x493C, + INVALC,0x4C3A,0x4C3B,0x4C3C,INVALC,0x5033, + /* Range 0x53C8 - 0x53CD, array index: 0x069A */ + 0x4434,0x4446,0x452F,0x452E,INVALC,0x4530, + /* Range 0x53E2 - 0x53F5, array index: 0x06A0 */ + 0x763B,0x4447,0x462C,0x463B,0x4636,INVALC,0x4631,0x4630, + 0x4637,0x4635,0x462E,0x463C,0x462F,0x462B,0x463A,0x4639, + 0x4638,0x462D,INVALC,0x4634, + /* Range 0x5406 - 0x5412, array index: 0x06B4 */ + 0x475C,INVALC,0x4759,0x474F,0x4752,0x4755,0x4751,0x4758, + 0x475B,0x4750,0x4753,0x4757,0x475D, + /* Range 0x541B - 0x5420, array index: 0x06C1 */ + 0x4949,INVALC,0x493D,0x493F,0x4957,0x4952, + /* Range 0x5429 - 0x542E, array index: 0x06C7 */ + 0x494A,INVALC,0x4956,0x4958,0x493E,0x494F, + /* Range 0x5435 - 0x5443, array index: 0x06CD */ + 0x4950,0x4951,INVALC,0x494E,0x494C,INVALC,0x494D,0x4953, + INVALC,0x4940,INVALC,0x4954,INVALC,0x4948,0x4945, + /* Range 0x5473 - 0x547D, array index: 0x06DC */ + 0x4C40,INVALC,0x4C41,0x4C4E,0x4C47,0x4C43,INVALC,INVALC, + 0x4C46,0x4C4B,0x4C54, + /* Range 0x54A6 - 0x54AC, array index: 0x06E7 */ + 0x503C,0x504A,0x5038,0x5049,0x5041,0x5046,0x5036, + /* Range 0x54BD - 0x54C9, array index: 0x06EE */ + 0x5040,INVALC,0x504B,0x5037,0x5042,0x503F,INVALC,0x5043, + INVALC,INVALC,0x503E,0x5044,0x503A, + /* Range 0x54E5 - 0x54EE, array index: 0x06FB */ + 0x5457,0x5462,INVALC,0x5452,0x545C,0x5461,INVALC,INVALC, + 0x545D,0x5460, + /* Range 0x5555 - 0x5557, array index: 0x0705 */ + 0x5943,0x5941,0x594D, + /* Range 0x5580 - 0x5584, array index: 0x0708 */ + 0x5E3E,INVALC,0x5E44,0x5E4A,0x6143, + /* Range 0x5587 - 0x558B, array index: 0x070D */ + 0x5E48,INVALC,0x5E55,0x5E41,0x5E49, + /* Range 0x5598 - 0x559F, array index: 0x0712 */ + 0x5E43,0x5E57,0x5E50,INVALC,0x5E45,0x5E42,INVALC,0x5E4D, + /* Range 0x55AA - 0x55B3, array index: 0x071A */ + 0x5E46,0x5E56,0x5E52,INVALC,0x5E4C,INVALC,INVALC,0x5E53, + 0x5E4F,0x5E4B, + /* Range 0x55C5 - 0x55C9, array index: 0x0724 */ + 0x634C,0x634D,0x6345,INVALC,0x634F, + /* Range 0x55E1 - 0x55E8, array index: 0x0729 */ + 0x634B,INVALC,0x6347,0x6348,0x634E,0x6342,0x2321,0x6340, + /* Range 0x562E - 0x5636, array index: 0x0731 */ + 0x6C31,0x6C3D,0x6C3E,INVALC,0x6C34,INVALC,0x6C36,INVALC, + 0x6C3C, + /* Range 0x5664 - 0x566C, array index: 0x073A */ + 0x703F,0x7043,INVALC,INVALC,0x7042,0x703E,0x7041,0x703C, + 0x7046, + /* Range 0x568E - 0x5690, array index: 0x0743 */ + 0x7345,0x734A,0x7347, + /* Range 0x56C0 - 0x56C2, array index: 0x0746 */ + 0x7A65,0x7A64,0x7A66, + /* Range 0x56C8 - 0x56CC, array index: 0x0749 */ + 0x7B59,0x7B5B,0x7B5A,INVALC,0x7C34, + /* Range 0x56DA - 0x56E0, array index: 0x074E */ + 0x463F,0x463E,INVALC,0x4760,0x475F,INVALC,0x475E, + /* Range 0x572C - 0x5730, array index: 0x0755 */ + 0x4765,0x4764,INVALC,0x4766,0x4762, + /* Range 0x574D - 0x5751, array index: 0x075A */ + 0x4960,0x4962,0x4965,0x4964,0x495E, + /* Range 0x582F - 0x5835, array index: 0x075F */ + 0x5E59,0x5E5D,0x5E5E,INVALC,INVALC,0x5E5B,0x5959, + /* Range 0x584A - 0x584C, array index: 0x0766 */ + 0x635B,0x635E,0x6359, + /* Range 0x5914 - 0x591C, array index: 0x0769 */ + 0x7A67,0x444A,0x4640,INVALC,INVALC,0x4768,0x4769,INVALC, + 0x4C5F, + /* Range 0x5927 - 0x592E, array index: 0x0772 */ + 0x444B,INVALC,0x4532,0x4534,0x4533,INVALC,0x4535,0x4641, + /* Range 0x5947 - 0x5949, array index: 0x077A */ + 0x4C61,0x4C62,0x4C60, + /* Range 0x594E - 0x595A, array index: 0x077D */ + 0x5058,0x5057,0x5059,0x5056,INVALC,INVALC,0x4C64,0x5055, + INVALC,0x546F,0x5470,INVALC,0x5471, + /* Range 0x5981 - 0x5984, array index: 0x078A */ + 0x4772,0x4771,0x476E,0x476C, + /* Range 0x59A3 - 0x59A5, array index: 0x078E */ + 0x496D,0x4971,0x4974, + /* Range 0x59D0 - 0x59D4, array index: 0x0791 */ + 0x4C6C,0x4C6A,0x4C73,0x4C6F,0x4C67, + /* Range 0x5ABC - 0x5AC2, array index: 0x0796 */ + 0x6365,0x6364,0x6363,INVALC,INVALC,0x6360,0x6367, + /* Range 0x5AD6 - 0x5AD8, array index: 0x079D */ + 0x684A,0x6849,0x684B, + /* Range 0x5B08 - 0x5B0C, array index: 0x07A0 */ + 0x6C4D,0x6C48,INVALC,0x6C4A,0x6C4C, + /* Range 0x5B50 - 0x5B5F, array index: 0x07A5 */ + 0x444D,0x444E,INVALC,0x444F,0x4536,0x4645,INVALC,0x4773, + 0x4774,INVALC,0x4977,0x4978,0x4976,0x4975,INVALC,0x4C75, + /* Range 0x5B85 - 0x5B8C, array index: 0x07B5 */ + 0x4777,INVALC,0x4775,0x4776,0x4778,INVALC,0x497A,0x4979, + /* Range 0x5B97 - 0x5B9C, array index: 0x07BD */ + 0x4C78,0x4C7A,0x4C7C,0x4C79,0x4C7D,0x4C7B, + /* Range 0x5BA2 - 0x5BA6, array index: 0x07C3 */ + 0x506A,0x5067,0x5069,0x506B,0x5068, + /* Range 0x5BB3 - 0x5BB9, array index: 0x07C8 */ + 0x5524,0x5526,0x5528,0x5525,INVALC,0x552A,0x5529, + /* Range 0x5BC2 - 0x5BC7, array index: 0x07CF */ + 0x596D,INVALC,0x596C,0x596B,0x596F,0x596A, + /* Range 0x5BDE - 0x5BF0, array index: 0x07D5 */ + 0x684E,0x6856,INVALC,0x6850,0x6854,INVALC,0x6855,0x6851, + 0x6852,0x684F,0x6853,0x6C50,INVALC,0x6C51,0x6C4F,INVALC, + 0x6C4E,INVALC,0x7051, + /* Range 0x5C07 - 0x5C11, array index: 0x07E8 */ + 0x5972,0x5971,0x5970,0x5E71,0x5E72,INVALC,0x6857,0x7052, + 0x4451,INVALC,0x4537, + /* Range 0x5C37 - 0x5C41, array index: 0x07F3 */ + 0x7353,0x4453,0x4467,0x4539,INVALC,0x4647,INVALC,0x4A22, + 0x4A21,0x497D,0x497E, + /* Range 0x5C4B - 0x5C51, array index: 0x07FE */ + 0x5070,INVALC,0x506F,0x506D,0x506E,0x552E,0x552C, + /* Range 0x5DE1 - 0x5DE8, array index: 0x0805 */ + 0x4B56,0x5A25,INVALC,INVALC,0x4456,0x464A,0x4649,0x4648, + /* Range 0x5DF1 - 0x5DF4, array index: 0x080D */ + 0x4457,0x4458,0x4459,0x453B, + /* Range 0x5E36 - 0x5E38, array index: 0x0811 */ + 0x5A27,0x5A29,0x5A26, + /* Range 0x5E5F - 0x5E63, array index: 0x0814 */ + 0x6C57,INVALC,0x6C58,0x6C56,0x685C, + /* Range 0x5E72 - 0x5E7E, array index: 0x0819 */ + 0x445B,0x464D,0x4821,INVALC,0x477E,INVALC,0x4D31,0x636C, + INVALC,0x453C,0x464E,0x5077,0x5E7D, + /* Range 0x5E95 - 0x5E97, array index: 0x0826 */ + 0x4D35,0x4D36,0x4D33, + /* Range 0x5EB5 - 0x5EB8, array index: 0x0829 */ + 0x5A2D,0x5A2C,0x5A2A,0x5A2B, + /* Range 0x5EC8 - 0x5ECA, array index: 0x082D */ + 0x636E,0x636D,0x5E7E, + /* Range 0x5EDF - 0x5EE3, array index: 0x0830 */ + 0x6C5B,0x6C5E,INVALC,0x6C59,0x6C5D, + /* Range 0x5F12 - 0x5F18, array index: 0x0835 */ + 0x636F,0x445E,0x453E,0x453F,INVALC,0x4651,0x4650, + /* Range 0x5F69 - 0x5F71, array index: 0x083C */ + 0x5A33,0x5D29,0x5A34,0x5A32,0x5F25,INVALC,INVALC,0x6864, + 0x6C60, + /* Range 0x5F7F - 0x5F81, array index: 0x0845 */ + 0x4D3D,0x4D3B,0x4D3C, + /* Range 0x5F85 - 0x5F92, array index: 0x0848 */ + 0x5121,INVALC,0x5124,0x507E,0x5126,0x5122,0x5123,0x5125, + INVALC,INVALC,INVALC,0x5541,0x5540,0x553F, + /* Range 0x5F97 - 0x5F99, array index: 0x0856 */ + 0x5A35,0x5A38,0x5A36, + /* Range 0x5FA8 - 0x5FAE, array index: 0x0859 */ + 0x5F28,0x5F26,0x5F27,INVALC,0x6371,INVALC,0x6372, + /* Range 0x5FD6 - 0x5FD9, array index: 0x0860 */ + 0x4825,0x4A35,0x4A33,0x4824, + /* Range 0x6012 - 0x6016, array index: 0x0864 */ + 0x5127,INVALC,0x4D45,0x4D4A,0x4D48, + /* Range 0x6025 - 0x602B, array index: 0x0869 */ + 0x512A,INVALC,0x4D4C,0x512C,0x4D4D,0x4D49,0x4D4E, + /* Range 0x6062 - 0x6070, array index: 0x0870 */ + 0x5130,0x5543,0x5136,0x5544,INVALC,INVALC,0x512F,0x5548, + 0x5135,0x5134,0x5133,0x5547,INVALC,0x5549,0x512E, + /* Range 0x60B2 - 0x60BD, array index: 0x087F */ + 0x5F2B,INVALC,0x5A42,0x5A47,0x5F2C,INVALC,0x5A4E,INVALC, + INVALC,0x5A46,0x5A49,0x5A44, + /* Range 0x60C5 - 0x60C7, array index: 0x088B */ + 0x5A45,0x5A4C,0x5A50, + /* Range 0x60DF - 0x60E1, array index: 0x088E */ + 0x5A4D,0x5F2D,0x5F2A, + /* Range 0x60F0 - 0x60FB, array index: 0x0891 */ + 0x5F32,0x5F36,INVALC,0x6377,0x5F34,INVALC,0x5F38,INVALC, + INVALC,0x6379,0x5F30,0x5F33, + /* Range 0x610D - 0x610F, array index: 0x089D */ + 0x6425,0x5F37,0x6374, + /* Range 0x611A - 0x611C, array index: 0x08A0 */ + 0x6373,0x6378,0x5F2E, + /* Range 0x6147 - 0x614E, array index: 0x08A3 */ + 0x6866,0x6375,INVALC,INVALC,0x6868,0x637D,0x6421,0x637C, + /* Range 0x6175 - 0x6177, array index: 0x08AB */ + 0x686F,0x6C63,0x6869, + /* Range 0x61C7 - 0x61CD, array index: 0x08AE */ + 0x735E,0x705C,0x735C,0x705B,0x7360,INVALC,0x7058, + /* Range 0x61F5 - 0x6200, array index: 0x08B5 */ + 0x7837,0x7836,0x7835,0x796C,INVALC,0x796D,INVALC,0x7A6A, + INVALC,0x7A6B,0x7B60,0x7C36, + /* Range 0x620A - 0x6216, array index: 0x08C1 */ + 0x4653,INVALC,0x4827,0x4828,0x4826,INVALC,0x4829,0x4A3C, + 0x4A3B,INVALC,INVALC,0x4D51,0x4D50, + /* Range 0x6230 - 0x6236, array index: 0x08CE */ + 0x705D,INVALC,0x7361,0x7643,0x7362,INVALC,0x4542, + /* Range 0x623E - 0x6241, array index: 0x08D5 */ + 0x4D53,0x4D52,0x4D54,0x5137, + /* Range 0x6247 - 0x6254, array index: 0x08D9 */ + 0x5552,0x5A53,0x5F3D,INVALC,0x4543,INVALC,0x445F,0x4544, + INVALC,INVALC,0x4657,0x4656,0x4654,0x4655, + /* Range 0x626D - 0x626F, array index: 0x08E7 */ + 0x4A43,0x4A4C,0x4A4A, + /* Range 0x627C - 0x6280, array index: 0x08EA */ + 0x4A45,INVALC,0x4A46,0x4D55,0x4A40, + /* Range 0x6291 - 0x6298, array index: 0x08EF */ + 0x4A4F,0x4A49,0x4A4E,INVALC,0x4A4D,0x4A3F,0x4A3E,0x4A4B, + /* Range 0x62C4 - 0x62DC, array index: 0x08F7 */ + 0x4D58,INVALC,0x4D70,0x4D68,0x4D62,0x4D56,INVALC,0x4D61, + 0x4D57,0x4D69,0x4D72,INVALC,0x4D66,INVALC,0x4D5C,0x4D5F, + 0x4D60,INVALC,0x4D6E,0x4D6F,0x4D6D,0x4D67,0x4D6B,0x4D5D, + 0x5138, + /* Range 0x62EC - 0x62F4, array index: 0x0910 */ + 0x5144,0x513C,0x513E,0x5143,INVALC,0x5141,INVALC,0x5553, + 0x5146, + /* Range 0x62FC - 0x6302, array index: 0x0919 */ + 0x513B,0x513F,0x5145,0x5555,INVALC,0x513D,0x5148, + /* Range 0x6307 - 0x6309, array index: 0x0920 */ + 0x5140,0x5554,0x513A, + /* Range 0x634C - 0x6350, array index: 0x0923 */ + 0x5565,0x5564,0x5556,0x555C,0x555F, + /* Range 0x6367 - 0x636B, array index: 0x0928 */ + 0x5A5B,0x5A6F,0x5A6E,INVALC,0x5A63, + /* Range 0x63A0 - 0x63AC, array index: 0x092D */ + 0x5A54,0x5A68,0x5A58,0x5F3E,INVALC,0x5A59,INVALC,0x5A55, + 0x5A64,0x5A5F,0x5A5D,INVALC,0x5A69, + /* Range 0x6413 - 0x6417, array index: 0x093A */ + 0x642A,0x6433,INVALC,0x6436,0x6437, + /* Range 0x6478 - 0x647B, array index: 0x093F */ + 0x6875,0x6C79,0x6877,0x687C, + /* Range 0x64A9 - 0x64B3, array index: 0x0943 */ + 0x6D24,INVALC,0x6D28,0x6D2A,0x6D27,0x6D26,INVALC,0x6C7E, + INVALC,0x6C7B,0x6D2D, + /* Range 0x64BB - 0x64CE, array index: 0x094E */ + 0x7061,0x7062,INVALC,0x706B,0x7068,INVALC,0x705F,0x7066, + INVALC,0x7064,0x705E,INVALC,0x7065,INVALC,INVALC,0x7364, + 0x7060,INVALC,0x7067,0x7363, + /* Range 0x64EC - 0x64F4, array index: 0x0962 */ + 0x7369,0x736C,INVALC,INVALC,0x7367,0x736A,0x7645,INVALC, + 0x7644, + /* Range 0x652A - 0x652C, array index: 0x096B */ + 0x7C39,0x7C38,0x7C5F, + /* Range 0x6554 - 0x6559, array index: 0x096E */ + 0x5A7A,0x5A79,0x5A72,0x5A75,0x5A78,0x5A74, + /* Range 0x6574 - 0x6578, array index: 0x0974 */ + 0x706C,0x6D2E,INVALC,0x6D2F,0x6D30, + /* Range 0x65CB - 0x65CF, array index: 0x0979 */ + 0x5B21,0x5B22,INVALC,0x5B23,0x5A7E, + /* Range 0x65E5 - 0x65ED, array index: 0x097E */ + 0x454A,0x4659,INVALC,0x482F,0x482E,INVALC,INVALC,0x4830, + 0x4831, + /* Range 0x6613 - 0x6615, array index: 0x0987 */ + 0x4D78,0x4D77,0x4E21, + /* Range 0x6624 - 0x6628, array index: 0x098A */ + 0x5156,0x514E,INVALC,0x5151,0x5154, + /* Range 0x6641 - 0x6645, array index: 0x098F */ + 0x5572,0x556B,0x556E,INVALC,0x5571, + /* Range 0x666E - 0x6670, array index: 0x0994 */ + 0x5F5B,0x5F5F,0x5F5C, + /* Range 0x6687 - 0x6689, array index: 0x0997 */ + 0x643E,0x643F,0x643D, + /* Range 0x6696 - 0x6698, array index: 0x099A */ + 0x6440,0x643C,0x6442, + /* Range 0x66F0 - 0x66F9, array index: 0x099D */ + 0x454B,INVALC,0x4832,0x4833,0x4A55,INVALC,INVALC,0x5157, + 0x5573,0x5B2A, + /* Range 0x66FC - 0x6700, array index: 0x09A7 */ + 0x5937,INVALC,0x5F64,0x5F65,0x5E32, + /* Range 0x6726 - 0x672E, array index: 0x09AC */ + 0x764D,0x7972,0x454D,INVALC,0x465C,0x465D,0x465B,0x465E, + 0x465A, + /* Range 0x674E - 0x6757, array index: 0x09B5 */ + 0x4A57,0x4A58,0x4A59,0x4A5A,INVALC,0x4A61,INVALC,INVALC, + 0x4A5C,0x4A62, + /* Range 0x675C - 0x6760, array index: 0x09BF */ + 0x4A5B,INVALC,0x4A5D,0x4A56,0x4A60, + /* Range 0x676D - 0x6777, array index: 0x09C4 */ + 0x4E26,INVALC,0x4E30,0x4E31,0x4E29,0x4E3B,0x4E2B,INVALC, + 0x4E36,INVALC,0x4E2C, + /* Range 0x67CF - 0x67D4, array index: 0x09CF */ + 0x5169,0x515C,0x5164,0x5170,0x5159,0x515B, + /* Range 0x67F1 - 0x67F5, array index: 0x09D5 */ + 0x515A,INVALC,0x516B,0x5627,0x5160, + /* Range 0x683C - 0x6848, array index: 0x09DA */ + 0x562A,0x5626,INVALC,INVALC,0x5629,0x5630,0x557D,0x562B, + INVALC,0x562D,0x557A,INVALC,0x5579, + /* Range 0x6850 - 0x6854, array index: 0x09E7 */ + 0x5628,0x5625,INVALC,0x557B,0x557E, + /* Range 0x687F - 0x6886, array index: 0x09EC */ + 0x5B32,INVALC,0x5B2D,0x5B42,0x5B38,INVALC,0x5B3C,0x5B3B, + /* Range 0x68AD - 0x68B5, array index: 0x09F4 */ + 0x5B3A,INVALC,0x5B2E,0x5B37,0x5B34,INVALC,0x5622,INVALC, + 0x5B31, + /* Range 0x68F9 - 0x68FB, array index: 0x09FD */ + 0x5F72,0x5F68,0x5F7E, + /* Range 0x695A - 0x6960, array index: 0x0A00 */ + 0x6447,0x6457,INVALC,0x6455,0x6451,INVALC,0x6449, + /* Range 0x69CB - 0x69CD, array index: 0x0A07 */ + 0x692C,0x6935,0x6933, + /* Range 0x6A38 - 0x6A3A, array index: 0x0A0A */ + 0x7074,0x7079,0x7075, + /* Range 0x6B5F - 0x6B67, array index: 0x0A0D */ + 0x7656,INVALC,0x7B63,0x454F,0x465F,0x483A,0x4A63,0x4E3D, + 0x4E3E, + /* Range 0x6B77 - 0x6B7B, array index: 0x0A16 */ + 0x7125,0x7657,0x4550,INVALC,0x483B, + /* Range 0x6BD2 - 0x6BD4, array index: 0x0A1B */ + 0x5175,0x645C,0x4552, + /* Range 0x6C0F - 0x6C13, array index: 0x0A1E */ + 0x4554,0x4662,0x4661,INVALC,0x4E40, + /* Range 0x6C23 - 0x6C2F, array index: 0x0A23 */ + 0x5634,0x5638,INVALC,0x5637,0x5635,0x5636,INVALC,INVALC, + 0x5B47,0x602A,INVALC,0x6028,0x6029, + /* Range 0x6C3E - 0x6C42, array index: 0x0A30 */ + 0x4666,INVALC,0x4665,0x4664,0x4A65, + /* Range 0x6C5B - 0x6C61, array index: 0x0A35 */ + 0x4845,INVALC,0x483D,0x4A66,0x4840,0x4841,0x4844, + /* Range 0x6C7D - 0x6C8D, array index: 0x0A3C */ + 0x4A75,0x4A78,INVALC,INVALC,0x4A68,0x4B21,0x4A76,INVALC, + 0x4A6B,0x4A7A,INVALC,0x4A69,0x4A6A,INVALC,INVALC,0x4A71, + 0x4A7C, + /* Range 0x6CB8 - 0x6CC5, array index: 0x0A4D */ + 0x4E50,0x4E52,INVALC,0x4E59,0x4E4B,0x4E49,0x4E4A,0x4E58, + INVALC,0x4E53,INVALC,INVALC,0x4E51,0x4E56, + /* Range 0x6CD3 - 0x6CD7, array index: 0x0A5B */ + 0x4E4F,INVALC,0x4E4E,0x4E60,0x4E55, + /* Range 0x6CE0 - 0x6CE5, array index: 0x0A60 */ + 0x4E61,0x4E5A,0x4E4C,0x4E42,INVALC,0x4E47, + /* Range 0x6CEF - 0x6CF5, array index: 0x0A66 */ + 0x4E5E,0x5639,0x4E57,INVALC,0x4E44,INVALC,0x5229, + /* Range 0x6D27 - 0x6D2B, array index: 0x0A6D */ + 0x522B,INVALC,0x522D,0x517B,0x5231, + /* Range 0x6D35 - 0x6D3E, array index: 0x0A72 */ + 0x522F,0x5227,INVALC,0x522C,0x522A,INVALC,0x5224,INVALC, + 0x5225,0x5226, + /* Range 0x6D77 - 0x6D79, array index: 0x0A7C */ + 0x5640,0x563F,0x564B, + /* Range 0x6D85 - 0x6D8E, array index: 0x0A7F */ + 0x564C,INVALC,0x563D,0x563C,0x5644,0x564A,INVALC,0x5649, + INVALC,0x5B48, + /* Range 0x6D93 - 0x6D95, array index: 0x0A89 */ + 0x5642,0x564E,0x563B, + /* Range 0x6DC4 - 0x6DC7, array index: 0x0A8C */ + 0x5B69,0x5B5D,0x5B68,0x5B53, + /* Range 0x6DD8 - 0x6DDA, array index: 0x0A90 */ + 0x5B63,0x5B4B,0x5B61, + /* Range 0x6DE8 - 0x6DEE, array index: 0x0A93 */ + 0x5B67,INVALC,0x5B64,0x5B62,0x5B6B,INVALC,0x5B66, + /* Range 0x6DF7 - 0x6DFB, array index: 0x0A9A */ + 0x5B5B,INVALC,0x5B59,0x5B51,0x5B50, + /* Range 0x6E19 - 0x6E26, array index: 0x0A9F */ + 0x6047,0x5B5F,0x6035,INVALC,0x6043,INVALC,INVALC,0x6032, + 0x602E,INVALC,0x6034,0x6038,0x6033,0x603C, + /* Range 0x6ED1 - 0x6ED5, array index: 0x0AAD */ + 0x646C,INVALC,0x6460,0x6470,0x6D5A, + /* Range 0x6EFE - 0x6F02, array index: 0x0AB2 */ + 0x693E,0x6948,INVALC,0x6955,0x6946, + /* Range 0x6F13 - 0x6F15, array index: 0x0AB7 */ + 0x693F,0x693D,0x694F, + /* Range 0x6F29 - 0x6F2C, array index: 0x0ABA */ + 0x6941,0x6953,0x6950,0x6944, + /* Range 0x6F2F - 0x6F33, array index: 0x0ABE */ + 0x6951,INVALC,0x694B,0x694D,0x693C, + /* Range 0x6F6D - 0x6F70, array index: 0x0AC3 */ + 0x6D50,0x6D53,0x6D5B,0x6D56, + /* Range 0x6FC0 - 0x6FC3, array index: 0x0AC7 */ + 0x712F,0x712C,0x7127,0x712A, + /* Range 0x6FDF - 0x6FE1, array index: 0x0ACB */ + 0x7424,0x7425,0x742C, + /* Range 0x6FEB - 0x6FF1, array index: 0x0ACE */ + 0x7428,0x742B,INVALC,0x742F,0x7429,0x7430,0x7423, + /* Range 0x70AB - 0x70AF, array index: 0x0AD5 */ + 0x5232,0x5235,0x5237,0x5239,0x5236, + /* Range 0x7164 - 0x7169, array index: 0x0ADA */ + 0x6477,0x647E,0x647C,0x6479,0x6523,0x6476, + /* Range 0x71E5 - 0x71E7, array index: 0x0AE0 */ + 0x7435,0x7434,0x7431, + /* Range 0x71EC - 0x71EE, array index: 0x0AE3 */ + 0x7437,0x7436,0x7433, + /* Range 0x7235 - 0x723E, array index: 0x0AE6 */ + 0x743A,0x4558,INVALC,0x4E69,0x5655,0x6525,0x4559,INVALC, + 0x5B73,0x695F, + /* Range 0x7246 - 0x7248, array index: 0x0AF0 */ + 0x743B,0x455A,0x4E6A, + /* Range 0x725D - 0x7262, array index: 0x0AF3 */ + 0x484A,INVALC,0x4849,0x4B28,0x4B27,0x4B26, + /* Range 0x72F7 - 0x72FD, array index: 0x0AF9 */ + 0x565B,0x565A,0x5658,INVALC,INVALC,0x5657,0x5659, + /* Range 0x7377 - 0x737B, array index: 0x0B00 */ + 0x7664,0x784B,INVALC,0x784C,0x7978, + /* Range 0x7433 - 0x7436, array index: 0x0B05 */ + 0x605F,0x6064,0x6062,0x6063, + /* Range 0x7459 - 0x745F, array index: 0x0B09 */ + 0x6532,0x652C,0x6533,0x6534,INVALC,0x652F,0x652E, + /* Range 0x74A6 - 0x74A9, array index: 0x0B10 */ + 0x7440,0x7666,0x7441,0x743E, + /* Range 0x74E0 - 0x74E6, array index: 0x0B14 */ + 0x5C24,INVALC,0x7147,0x784F,0x7B67,INVALC,0x466B, + /* Range 0x7525 - 0x7533, array index: 0x0B1B */ + 0x6069,0x606A,INVALC,0x466E,0x466F,INVALC,0x4B2D,0x4B2C, + 0x524A,INVALC,INVALC,0x4670,0x4671,0x4672,0x4673, + /* Range 0x754B - 0x754F, array index: 0x0B2A */ + 0x524E,0x524C,INVALC,0x524D,0x524B, + /* Range 0x7559 - 0x755D, array index: 0x0B2F */ + 0x5667,0x5666,INVALC,0x5665,0x5664, + /* Range 0x75A2 - 0x75A5, array index: 0x0B34 */ + 0x5252,0x5253,0x5250,0x5251, + /* Range 0x75B8 - 0x75BE, array index: 0x0B38 */ + 0x5671,0x566F,INVALC,INVALC,0x566E,0x566D,0x5668, + /* Range 0x75F0 - 0x75F4, array index: 0x0B3F */ + 0x6538,0x653B,0x653A,0x653F,0x653E, + /* Range 0x75FF - 0x7601, array index: 0x0B44 */ + 0x653D,0x6537,0x6539, + /* Range 0x761F - 0x7629, array index: 0x0B47 */ + 0x6D6E,0x6D6C,0x6D71,0x6D72,INVALC,0x6D6F,INVALC,0x6D70, + 0x696B,INVALC,0x6D6D, + /* Range 0x767B - 0x767E, array index: 0x0B52 */ + 0x6074,0x6075,0x4675,0x484B, + /* Range 0x7684 - 0x7688, array index: 0x0B56 */ + 0x4E7B,INVALC,0x5255,0x5256,0x5257, + /* Range 0x76C2 - 0x76CE, array index: 0x0B5B */ + 0x4E7C,0x525A,INVALC,0x525B,0x5259,INVALC,0x5258,INVALC, + 0x5674,INVALC,INVALC,0x5675,0x5676, + /* Range 0x76DB - 0x76E7, array index: 0x0B68 */ + 0x5C36,0x6079,INVALC,0x6540,0x6541,INVALC,0x6970,INVALC, + 0x6971,0x6D75,0x714E,INVALC,0x714D, + /* Range 0x7736 - 0x773E, array index: 0x0B75 */ + 0x5C3A,0x5C37,0x5C3B,INVALC,0x5C3C,INVALC,0x5C39,INVALC, + 0x5C38, + /* Range 0x7761 - 0x776C, array index: 0x0B7E */ + 0x6975,0x654D,0x6546,INVALC,0x654B,0x6544,INVALC,0x654C, + INVALC,0x6548,0x6543,0x6549, + /* Range 0x779E - 0x77A0, array index: 0x0B8A */ + 0x7150,0x7151,0x714F, + /* Range 0x77BB - 0x77BF, array index: 0x0B8D */ + 0x766E,0x766F,0x766C,INVALC,0x766D, + /* Range 0x77DA - 0x77DC, array index: 0x0B92 */ + 0x7D33,0x4679,0x5264, + /* Range 0x77ED - 0x77EF, array index: 0x0B95 */ + 0x607B,0x654E,0x744C, + /* Range 0x792A - 0x792C, array index: 0x0B98 */ + 0x797D,0x7A21,0x797E, + /* Range 0x7946 - 0x7949, array index: 0x0B9B */ + 0x5269,0x526C,0x526B,0x526A, + /* Range 0x7955 - 0x7957, array index: 0x0B9F */ + 0x5729,0x572D,0x5730, + /* Range 0x795D - 0x7960, array index: 0x0BA2 */ + 0x572F,0x572E,0x572C,0x572B, + /* Range 0x798D - 0x798F, array index: 0x0BA6 */ + 0x697E,0x697C,0x697D, + /* Range 0x79B9 - 0x79C1, array index: 0x0BA9 */ + 0x526D,0x526E,INVALC,INVALC,0x655D,0x467D,0x4B35,0x4B34, + 0x4B33, + /* Range 0x79E3 - 0x79E9, array index: 0x0BB2 */ + 0x5733,0x5732,INVALC,0x5736,0x5734,INVALC,0x5737, + /* Range 0x7A1C - 0x7A20, array index: 0x0BB9 */ + 0x655E,INVALC,0x6563,0x6562,0x6560, + /* Range 0x7A3B - 0x7A40, array index: 0x0BBE */ + 0x6E2A,0x6E26,0x6E28,INVALC,0x6E25,0x6E27, + /* Range 0x7A4B - 0x7A4E, array index: 0x0BC4 */ + 0x715C,0x715B,0x7158,0x7159, + /* Range 0x7A60 - 0x7A62, array index: 0x0BC8 */ + 0x7674,0x7672,0x7673, + /* Range 0x7A95 - 0x7A98, array index: 0x0BCB */ + 0x5C45,0x6128,0x6127,0x6126, + /* Range 0x7B4D - 0x7B56, array index: 0x0BCF */ + 0x6131,INVALC,0x6133,0x612E,0x6134,0x612F,INVALC,0x6130, + INVALC,0x612C, + /* Range 0x7C3D - 0x7C40, array index: 0x0BD9 */ + 0x785C,0x7859,0x785A,0x785E, + /* Range 0x7C5F - 0x7C65, array index: 0x0BDD */ + 0x7B6D,0x7B6C,INVALC,INVALC,0x7C3F,0x7C3E,0x7C40, + /* Range 0x7CDC - 0x7CE2, array index: 0x0BE4 */ + 0x745D,0x7462,0x745E,0x7460,0x745C,INVALC,0x745F, + /* Range 0x7D02 - 0x7D0D, array index: 0x0BEB */ + 0x5277,INVALC,0x527C,0x5278,0x527D,0x527B,INVALC,0x527A, + 0x5742,0x5741,INVALC,0x574A, + /* Range 0x7D17 - 0x7D22, array index: 0x0BF7 */ + 0x5740,INVALC,0x574B,0x5748,0x574C,0x5749,INVALC,INVALC, + INVALC,0x5743,0x573F,0x5744, + /* Range 0x7D2E - 0x7D33, array index: 0x0C03 */ + 0x5C54,0x5C5B,0x5C58,0x5C5E,0x5C5D,0x5C59, + /* Range 0x7D40 - 0x7D46, array index: 0x0C09 */ + 0x5C57,INVALC,0x5C5C,0x5C52,0x5C5A,INVALC,0x5C51, + /* Range 0x7D6E - 0x7D73, array index: 0x0C10 */ + 0x613C,INVALC,0x6141,0x5C53,0x613D,0x6142, + /* Range 0x7DAC - 0x7DB5, array index: 0x0C16 */ + 0x6A47,0x6A44,INVALC,INVALC,0x6A36,0x6A3E,0x6A3D,INVALC, + 0x6A3C,0x6A42, + /* Range 0x7DBA - 0x7DBF, array index: 0x0C20 */ + 0x6A3F,0x6A35,INVALC,0x6A38,0x6A39,0x6A41, + /* Range 0x7DD8 - 0x7DE0, array index: 0x0C26 */ + 0x6E3B,0x6E44,0x6E40,INVALC,INVALC,0x6E3D,0x6E41,INVALC, + 0x6E37, + /* Range 0x7E08 - 0x7E0A, array index: 0x0C2F */ + 0x716A,0x716F,0x7168, + /* Range 0x7E2E - 0x7E48, array index: 0x0C32 */ + 0x7463,0x7473,INVALC,0x746B,0x7467,INVALC,0x746E,0x7471, + INVALC,0x7466,INVALC,0x746F,INVALC,INVALC,INVALC,0x746A, + 0x7464,0x7472,INVALC,0x746D,INVALC,0x7468,INVALC,0x746C, + 0x7465,INVALC,0x7470, + /* Range 0x7E69 - 0x7E6D, array index: 0x0C4D */ + 0x7862,0x7863,0x785F,INVALC,0x7860, + /* Range 0x7F88 - 0x7F8E, array index: 0x0C52 */ + 0x7C65,INVALC,0x4850,0x4F2E,0x4F2D,INVALC,0x5321, + /* Range 0x7FDF - 0x7FE1, array index: 0x0C59 */ + 0x6A4B,0x6A49,0x6A4A, + /* Range 0x8000 - 0x8006, array index: 0x0C5C */ + 0x7A2E,0x4852,INVALC,0x4853,0x5753,0x4F2F,0x5752, + /* Range 0x800B - 0x8012, array index: 0x0C63 */ + 0x6146,0x4854,0x5324,INVALC,INVALC,0x5323,0x5325,0x4855, + /* Range 0x8015 - 0x8019, array index: 0x0C6B */ + 0x5755,INVALC,0x5757,0x5754,0x5756, + /* Range 0x806F - 0x8077, array index: 0x0C70 */ + 0x747A,0x7479,0x7477,0x7478,0x747B,INVALC,INVALC,0x772B, + 0x772A, + /* Range 0x807D - 0x807F, array index: 0x0C79 */ + 0x7B6F,0x7B6E,0x4857, + /* Range 0x8084 - 0x808C, array index: 0x0C7C */ + 0x657E,0x6148,0x657D,0x6A4E,INVALC,0x4858,INVALC,0x4859, + 0x485A, + /* Range 0x80A9 - 0x80AB, array index: 0x0C85 */ + 0x4F36,0x4F38,0x4F35, + /* Range 0x80DA - 0x80DE, array index: 0x0C88 */ + 0x5329,0x532E,INVALC,0x5332,0x5330, + /* Range 0x80ED - 0x80F4, array index: 0x0C8D */ + 0x575E,INVALC,0x5767,0x575C,0x575A,INVALC,0x5762,0x575F, + /* Range 0x8150 - 0x8155, array index: 0x0C95 */ + 0x6A4F,0x614C,INVALC,0x6152,0x614A,0x6149, + /* Range 0x8170 - 0x817A, array index: 0x0C9B */ + 0x6622,0x6621,INVALC,0x6626,0x6153,INVALC,INVALC,INVALC, + 0x6623,0x6628,0x6629, + /* Range 0x8198 - 0x819D, array index: 0x0CA6 */ + 0x6E51,INVALC,0x6E50,0x6E4C,0x6E4D,0x6E4E, + /* Range 0x81BD - 0x81C3, array index: 0x0CAC */ + 0x7524,0x7526,0x7523,0x7522,INVALC,0x7521,0x747D, + /* Range 0x81FA - 0x8202, array index: 0x0CB3 */ + 0x6A57,0x717A,0x485E,INVALC,0x4F3B,INVALC,0x576A,INVALC, + 0x5C6F, + /* Range 0x8205 - 0x820D, array index: 0x0CBC */ + 0x662B,INVALC,0x6A58,0x717B,0x7528,0x772E,INVALC,0x485F, + 0x4F3C, + /* Range 0x821B - 0x821F, array index: 0x0CC5 */ + 0x4860,0x6155,INVALC,0x6A5A,0x4861, + /* Range 0x8228 - 0x822C, array index: 0x0CCA */ + 0x576E,INVALC,0x576C,0x576D,0x576F, + /* Range 0x8235 - 0x8239, array index: 0x0CCF */ + 0x5C70,0x5C72,0x5C71,INVALC,0x5C73, + /* Range 0x826E - 0x8272, array index: 0x0CD4 */ + 0x4862,0x4B40,INVALC,0x7529,0x4863, + /* Range 0x82AC - 0x82BE, array index: 0x0CD9 */ + 0x4F45,0x4F40,INVALC,0x4F47,0x4F4A,0x4F44,INVALC,0x4F3D, + INVALC,INVALC,INVALC,0x4F4C,0x4F48,0x4F43,INVALC,0x5770, + INVALC,0x4F41,0x4F4B, + /* Range 0x82D1 - 0x82D4, array index: 0x0CEC */ + 0x5345,0x533F,0x5347,0x5344, + /* Range 0x82DB - 0x82DF, array index: 0x0CF0 */ + 0x5339,0x5343,INVALC,0x5346,0x5348, + /* Range 0x82E3 - 0x82E7, array index: 0x0CF5 */ + 0x5338,INVALC,0x533C,0x533A,0x5335, + /* Range 0x8301 - 0x8306, array index: 0x0CFA */ + 0x5342,0x533D,0x5336,0x533B,0x5337,0x534A, + /* Range 0x8331 - 0x8339, array index: 0x0D00 */ + 0x5822,0x577B,INVALC,0x5779,0x5778,0x577D,INVALC,0x5775, + 0x577C, + /* Range 0x83EF - 0x83F4, array index: 0x0D09 */ + 0x615E,0x6163,0x615F,0x6167,INVALC,0x6160, + /* Range 0x840A - 0x840E, array index: 0x0D0F */ + 0x6162,0x615C,0x6164,0x6159,0x616A, + /* Range 0x8469 - 0x846D, array index: 0x0D14 */ + 0x663B,INVALC,0x6633,0x6635,0x663C, + /* Range 0x84C9 - 0x84CB, array index: 0x0D19 */ + 0x6A5C,0x6A6B,0x6A64, + /* Range 0x8548 - 0x854A, array index: 0x0D1C */ + 0x7222,0x7226,0x717E, + /* Range 0x8568 - 0x856A, array index: 0x0D1F */ + 0x7223,0x7224,0x7228, + /* Range 0x85A6 - 0x85AA, array index: 0x0D22 */ + 0x7535,INVALC,0x7533,0x7730,0x752A, + /* Range 0x85F7 - 0x85FB, array index: 0x0D27 */ + 0x7870,INVALC,0x7A32,0x7A34,0x7A31, + /* Range 0x865B - 0x865F, array index: 0x0D2C */ + 0x6170,0x663F,INVALC,0x663E,0x6640, + /* Range 0x8679 - 0x867B, array index: 0x0D31 */ + 0x534C,0x534E,0x534D, + /* Range 0x8702 - 0x870A, array index: 0x0D34 */ + 0x6648,0x6649,INVALC,INVALC,0x664A,0x6644,0x6643,INVALC, + 0x664B, + /* Range 0x881F - 0x8823, array index: 0x0D3D */ + 0x7B27,INVALC,0x7B26,0x7B25,0x7B24, + /* Range 0x8861 - 0x8863, array index: 0x0D42 */ + 0x722F,0x7C68,0x4868, + /* Range 0x895E - 0x8960, array index: 0x0D45 */ + 0x7879,0x7877,0x7876, + /* Range 0x8A0C - 0x8A18, array index: 0x0D48 */ + 0x5837,INVALC,0x5836,0x583D,0x5835,0x583E,INVALC,0x583B, + INVALC,0x5838,0x583C,0x583A,0x5834, + /* Range 0x8A3A - 0x8A3E, array index: 0x0D55 */ + 0x622C,0x6221,0x6225,INVALC,0x666B, + /* Range 0x8A54 - 0x8A56, array index: 0x0D5A */ + 0x6227,0x6223,0x622E, + /* Range 0x8A68 - 0x8A73, array index: 0x0D5D */ + 0x666C,0x665D,INVALC,0x6659,0x6668,0x6665,0x6667,INVALC, + 0x665E,0x6663,0x665A,0x665B, + /* Range 0x8AA0 - 0x8AAA, array index: 0x0D69 */ + 0x6662,0x6B26,INVALC,0x6B24,0x6B28,0x6B2A,0x6B21,0x6B2F, + 0x6B2B,INVALC,0x6B29, + /* Range 0x8AF6 - 0x8B04, array index: 0x0D74 */ + 0x7245,0x7242,0x6E7A,INVALC,0x7238,INVALC,0x7246,INVALC, + 0x723F,INVALC,0x723B,0x7240,0x7241,INVALC,0x754E, + /* Range 0x8B58 - 0x8B5C, array index: 0x0D83 */ + 0x787C,0x7924,0x787E,INVALC,0x787B, + /* Range 0x8C6A - 0x8C6D, array index: 0x0D88 */ + 0x6B30,0x7247,0x6F29,0x7248, + /* Range 0x8C89 - 0x8C8D, array index: 0x0D8C */ + 0x666F,0x666E,INVALC,0x6B32,0x6B31, + /* Range 0x8C9D - 0x8CA2, array index: 0x0D91 */ + 0x4B4A,0x5356,INVALC,0x5357,0x5842,0x5843, + /* Range 0x8CA7 - 0x8CAC, array index: 0x0D97 */ + 0x5D4E,0x5D4C,0x5D49,0x5D4D,0x5D4B,0x5D4A, + /* Range 0x8CB2 - 0x8CCA, array index: 0x0D9D */ + 0x6674,0x6233,0x6238,INVALC,0x623A,0x6239,0x623C,INVALC, + INVALC,0x6236,0x6232,0x6234,INVALC,0x623B,0x6237,0x6235, + 0x6676,0x6675,0x6673,0x6677,INVALC,0x6671,0x6672,INVALC, + 0x6670, + /* Range 0x8CD1 - 0x8CD3, array index: 0x0DB6 */ + 0x6B34,0x6B35,0x6B33, + /* Range 0x8CDE - 0x8CE6, array index: 0x0DB9 */ + 0x6F2B,INVALC,0x6F2A,0x6F34,0x6F30,0x6F31,0x6F2D,INVALC, + 0x6F2C, + /* Range 0x8CF8 - 0x8CFD, array index: 0x0DC2 */ + 0x7556,INVALC,0x7553,0x7557,0x7555,0x7554, + /* Range 0x8E1D - 0x8E22, array index: 0x0DC8 */ + 0x6F3A,0x6F40,0x6F3E,INVALC,0x6F3F,0x6F3B, + /* Range 0x8E48 - 0x8E4B, array index: 0x0DCE */ + 0x755B,0x7559,0x755C,0x755A, + /* Range 0x8E87 - 0x8E8D, array index: 0x0DD2 */ + 0x7929,INVALC,0x7A46,0x7B2F,0x7B31,INVALC,0x7B30, + /* Range 0x8EAA - 0x8EAC, array index: 0x0DD9 */ + 0x7D3B,0x4B4E,0x5845, + /* Range 0x8ECA - 0x8ECF, array index: 0x0DDC */ + 0x4B4F,0x4F51,0x535C,0x535B,INVALC,0x5848, + /* Range 0x8F12 - 0x8F15, array index: 0x0DE2 */ + 0x6B3B,0x6B3D,0x6B3A,0x6B3C, + /* Range 0x8F1B - 0x8F1F, array index: 0x0DE6 */ + 0x6F43,0x6F48,0x6F42,0x6F49,0x6F44, + /* Range 0x8FAD - 0x8FB2, array index: 0x0DEB */ + 0x7930,0x7A29,0x7B33,0x4B51,0x5849,0x6729, + /* Range 0x8FC2 - 0x8FC6, array index: 0x0DF1 */ + 0x4B52,INVALC,0x4B55,0x4B54,0x4B53, + /* Range 0x8FE2 - 0x8FED, array index: 0x0DF6 */ + 0x535F,INVALC,0x5364,0x5361,0x535E,INVALC,0x5365,INVALC, + 0x5360,0x5363,INVALC,0x5362, + /* Range 0x9014 - 0x9023, array index: 0x0E02 */ + 0x5D64,0x5D5D,0x5D62,0x5D58,INVALC,0x5D55,0x5D57,0x5D63, + INVALC,0x5D5B,0x5D5E,0x5D5A,0x5D5F,INVALC,0x5D61,0x5D59, + /* Range 0x904A - 0x9063, array index: 0x0E12 */ + 0x672B,0x672A,INVALC,0x6735,0x6734,0x6733,0x6731,0x6736, + INVALC,0x672C,0x672E,0x6730,INVALC,INVALC,0x6B40,0x6B43, + INVALC,0x6B47,0x6B41,0x6B46,0x6B44,INVALC,0x6B3F,INVALC, + 0x6B45,0x6B42, + /* Range 0x9074 - 0x9091, array index: 0x0E2C */ + 0x7258,0x7257,INVALC,0x6F4F,0x7259,INVALC,0x725C,INVALC, + 0x725B,0x7563,INVALC,0x7562,0x7567,0x7565,0x7566,0x774E, + 0x7564,INVALC,INVALC,0x774D,0x774F,INVALC,0x7931,0x7932, + INVALC,INVALC,INVALC,0x7C4A,0x7C49,0x4B57, + /* Range 0x9117 - 0x9119, array index: 0x0E4A */ + 0x673A,0x6B49,0x6B48, + /* Range 0x9148 - 0x914D, array index: 0x0E4D */ + 0x7B7A,0x4B5C,0x536B,0x536A,0x585A,0x5859, + /* Range 0x9174 - 0x9178, array index: 0x0E53 */ + 0x6B4E,0x6B4B,INVALC,0x6B4D,0x6B4C, + /* Range 0x91C5 - 0x91D1, array index: 0x0E58 */ + 0x7D3C,0x4B5D,0x4F59,INVALC,0x673E,INVALC,0x7A4B,0x4B5E, + 0x536C,0x5D69,0x6258,0x7752,0x4F5A, + /* Range 0x91D7 - 0x91DD, array index: 0x0E65 */ + 0x585D,0x585B,0x585F,INVALC,INVALC,0x585E,0x585C, + /* Range 0x9237 - 0x9240, array index: 0x0E6C */ + 0x673F,0x6741,0x674D,INVALC,INVALC,INVALC,0x6742,0x6744, + 0x674E,0x6743, + /* Range 0x9318 - 0x931A, array index: 0x0E76 */ + 0x7573,0x726E,0x7268, + /* Range 0x9320 - 0x9322, array index: 0x0E79 */ + 0x725F,0x726B,0x7264, + /* Range 0x9394 - 0x939A, array index: 0x0E7C */ + 0x7753,INVALC,0x7755,0x775D,0x775B,INVALC,0x775C, + /* Range 0x93D6 - 0x93D8, array index: 0x0E83 */ + 0x793C,0x7941,0x793F, + /* Range 0x947C - 0x947F, array index: 0x0E86 */ + 0x7D3F,0x7D3D,0x7D3E,0x7D44, + /* Range 0x958E - 0x9594, array index: 0x0E8A */ + 0x6268,0x6263,INVALC,0x6265,0x6267,0x6266,0x6262, + /* Range 0x95A1 - 0x95A9, array index: 0x0E91 */ + 0x6B5B,INVALC,0x6B5E,0x6B60,0x6B5F,INVALC,INVALC,0x6B5C, + 0x6B5D, + /* Range 0x95C8 - 0x95CC, array index: 0x0E9A */ + 0x757D,INVALC,0x757A,0x757B,0x757C, + /* Range 0x95D4 - 0x95D6, array index: 0x0E9F */ + 0x775E,0x7761,0x775F, + /* Range 0x964B - 0x964D, array index: 0x0EA2 */ + 0x536F,0x5370,0x5371, + /* Range 0x965D - 0x9664, array index: 0x0EA5 */ + 0x5865,0x5868,INVALC,INVALC,0x5863,0x5861,0x5862,0x5866, + /* Range 0x9670 - 0x9678, array index: 0x0EAD */ + 0x5D75,INVALC,0x6270,0x5D73,0x5D76,0x5D72,0x5D77,0x5D78, + 0x5D74, + /* Range 0x9684 - 0x9686, array index: 0x0EB6 */ + 0x6271,0x626D,0x626E, + /* Range 0x968A - 0x968E, array index: 0x0EB9 */ + 0x6269,0x626B,INVALC,0x626F,0x626A, + /* Range 0x9698 - 0x969C, array index: 0x0EBE */ + 0x6751,0x6B61,INVALC,0x6B63,0x6B62, + /* Range 0x96C0 - 0x96CD, array index: 0x0EC3 */ + 0x5D7A,0x6272,INVALC,INVALC,0x6274,0x6273,0x6275,0x6276, + INVALC,0x6756,0x6757,0x6755,0x6B64,0x6754, + /* Range 0x96E8 - 0x96EA, array index: 0x0ED1 */ + 0x4F64,0x5D7C,0x5D7B, + /* Range 0x970D - 0x9713, array index: 0x0ED4 */ + 0x7277,0x7274,0x7279,INVALC,0x7275,INVALC,0x7278, + /* Range 0x975E - 0x9762, array index: 0x0EDB */ + 0x4F66,INVALC,0x6F6A,0x7948,0x5372, + /* Range 0x97FF - 0x9813, array index: 0x0EE0 */ + 0x7B40,INVALC,0x5377,0x5E21,0x5E22,INVALC,0x627A,0x627B, + INVALC,0x627C,INVALC,0x6762,INVALC,0x6764,INVALC,INVALC, + INVALC,0x675F,0x6760,0x6763,0x6761, + /* Range 0x9837 - 0x983B, array index: 0x0EF5 */ + 0x7323,0x7321,0x7325,INVALC,0x7322, + /* Range 0x984C - 0x984F, array index: 0x0EFA */ + 0x776E,0x776C,0x776F,0x776D, + /* Range 0x986F - 0x9871, array index: 0x0EFE */ + 0x7C4F,0x7C74,0x7D2D, + /* Range 0x98FC - 0x98FE, array index: 0x0F01 */ + 0x6765,0x6767,0x6768, + /* Range 0x993D - 0x993F, array index: 0x0F04 */ + 0x7774,0x7772,0x7773, + /* Range 0x99AC - 0x99AE, array index: 0x0F07 */ + 0x586B,0x6326,0x6325, + /* Range 0x99D0 - 0x99D2, array index: 0x0F0A */ + 0x6F77,0x6F7A,0x6F7C, + /* Range 0x9ACF - 0x9AD8, array index: 0x0F0D */ + 0x7B48,INVALC,0x7C56,0x7C28,0x7C54,0x7C55,INVALC,0x7D2F, + INVALC,0x586D, + /* Range 0x9AED - 0x9AEF, array index: 0x0F17 */ + 0x7333,0x7021,0x7022, + /* Range 0x9B41 - 0x9B45, array index: 0x0F1A */ + 0x6B76,0x6B77,INVALC,0x7025,0x7024, + /* Range 0x9B4D - 0x9B51, array index: 0x0F1F */ + 0x777D,0x777C,0x777B,INVALC,0x7B4A, + /* Range 0x9BAA - 0x9BAE, array index: 0x0F24 */ + 0x762F,0x762E,INVALC,0x7630,0x762D, + /* Range 0x9BC8 - 0x9BCA, array index: 0x0F29 */ + 0x7823,0x7821,0x777E, + /* Range 0x9ECC - 0x9ED1, array index: 0x0F2C */ + 0x7D31,0x6328,0x702D,0x7634,INVALC,0x6329, + /* Range 0x9EDB - 0x9EE0, array index: 0x0F32 */ + 0x7638,0x7636,0x7637,0x7635,INVALC,0x7828, + /* Range 0xFE30 - 0xFE44, array index: 0x0F38 */ + 0x212B,0x2136,0x2138,INVALC,INVALC,0x2140,0x2141,0x2144, + 0x2145,0x2148,0x2149,0x214C,0x214D,0x2150,0x2151,0x2154, + 0x2155,0x2158,0x2159,0x215C,0x215D, + /* Range 0xFE49 - 0xFE6B, array index: 0x0F4D */ + 0x2227,0x2228,0x222B,0x222C,0x2229,0x222A,INVALC,0x212E, + 0x212F,0x2130,INVALC,0x2132,0x2133,0x2134,0x2135,INVALC, + 0x215E,0x215F,0x2160,0x2161,0x2162,0x2163,0x222D,0x222E, + 0x222F,0x223F,0x2240,0x2241,0x2243,0x2242,INVALC,0x2262, + 0x226C,0x226D,0x226E, + /* Range 0xFF01 - 0xFF3C, array index: 0x0F70 */ + 0x212A,INVALC,0x216C,0x2263,0x2268,0x216D,INVALC,0x213E, + 0x213F,0x216E,0x2230,0x2122,0x2231,0x2125,0x225F,0x2421, + 0x2422,0x2423,0x2424,0x2425,0x2426,0x2427,0x2428,0x2429, + 0x242A,0x2128,0x2127,0x2236,0x2238,0x2237,0x2129,0x2269, + 0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447,0x2448, + 0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F,0x2450, + 0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457,0x2458, + 0x2459,0x245A,INVALC,0x2260, + /* Range 0xFF3F - 0xFF5D, array index: 0x0FAC */ + 0x2225,INVALC,0x245B,0x245C,0x245D,0x245E,0x245F,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468, + 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470, + 0x2471,0x2472,0x2473,0x2474,0x2142,0x225E,0x2143, + /* Unranged codes (381 codes) */ + /* Array index: 0x0FCB */ 0x00A7,0x2170, + /* Array index: 0x0FCB */ 0x00B0,0x2278, + /* Array index: 0x0FCB */ 0x00B1,0x2234, + /* Array index: 0x0FCB */ 0x00B7,0x2131, + /* Array index: 0x0FCB */ 0x00D7,0x2232, + /* Array index: 0x0FCB */ 0x00F7,0x2233, + /* Array index: 0x0FCB */ 0x02D9,0x256C, + /* Array index: 0x0FCB */ 0x2013,0x2139, + /* Array index: 0x0FCB */ 0x2014,0x2137, + /* Array index: 0x0FCB */ 0x2016,0x225D, + /* Array index: 0x0FCB */ 0x2018,0x2164, + /* Array index: 0x0FCB */ 0x2019,0x2165, + /* Array index: 0x0FCB */ 0x201C,0x2166, + /* Array index: 0x0FCB */ 0x201D,0x2167, + /* Array index: 0x0FCB */ 0x2025,0x212D, + /* Array index: 0x0FCB */ 0x2026,0x212C, + /* Array index: 0x0FCB */ 0x2032,0x216A, + /* Array index: 0x0FCB */ 0x2035,0x216B, + /* Array index: 0x0FCB */ 0x203B,0x216F, + /* Array index: 0x0FCB */ 0x203E,0x2223, + /* Array index: 0x0FCB */ 0x2103,0x226A, + /* Array index: 0x0FCB */ 0x2105,0x2222, + /* Array index: 0x0FCB */ 0x2109,0x226B, + /* Array index: 0x0FCB */ 0x2215,0x2261, + /* Array index: 0x0FCB */ 0x221A,0x2235, + /* Array index: 0x0FCB */ 0x222E,0x224E, + /* Array index: 0x0FCB */ 0x2234,0x2250, + /* Array index: 0x0FCB */ 0x2235,0x224F, + /* Array index: 0x0FCB */ 0x223C,0x2244, + /* Array index: 0x0FCB */ 0x2252,0x223D, + /* Array index: 0x0FCB */ 0x2260,0x223B, + /* Array index: 0x0FCB */ 0x2261,0x223E, + /* Array index: 0x0FCB */ 0x2266,0x2239, + /* Array index: 0x0FCB */ 0x2267,0x223A, + /* Array index: 0x0FCB */ 0x22A5,0x2247, + /* Array index: 0x0FCB */ 0x22BF,0x224A, + /* Array index: 0x0FCB */ 0x2500,0x2339, + /* Array index: 0x0FCB */ 0x2502,0x233A, + /* Array index: 0x0FCB */ 0x250C,0x233C, + /* Array index: 0x0FCB */ 0x2510,0x233D, + /* Array index: 0x0FCB */ 0x2514,0x233E, + /* Array index: 0x0FCB */ 0x2518,0x233F, + /* Array index: 0x0FCB */ 0x251C,0x2337, + /* Array index: 0x0FCB */ 0x2524,0x2336, + /* Array index: 0x0FCB */ 0x252C,0x2335, + /* Array index: 0x0FCB */ 0x2534,0x2334, + /* Array index: 0x0FCB */ 0x253C,0x2333, + /* Array index: 0x0FCB */ 0x2550,0x2344, + /* Array index: 0x0FCB */ 0x255E,0x2345, + /* Array index: 0x0FCB */ 0x2561,0x2347, + /* Array index: 0x0FCB */ 0x256A,0x2346, + /* Array index: 0x0FCB */ 0x2594,0x2338, + /* Array index: 0x0FCB */ 0x2595,0x233B, + /* Array index: 0x0FCB */ 0x25A0,0x217C, + /* Array index: 0x0FCB */ 0x25A1,0x217B, + /* Array index: 0x0FCB */ 0x25B2,0x2175, + /* Array index: 0x0FCB */ 0x25B3,0x2174, + /* Array index: 0x0FCB */ 0x25BC,0x217E, + /* Array index: 0x0FCB */ 0x25BD,0x217D, + /* Array index: 0x0FCB */ 0x25C6,0x217A, + /* Array index: 0x0FCB */ 0x25C7,0x2179, + /* Array index: 0x0FCB */ 0x25CB,0x2172, + /* Array index: 0x0FCB */ 0x25CE,0x2176, + /* Array index: 0x0FCB */ 0x25CF,0x2173, + /* Array index: 0x0FCB */ 0x2605,0x2178, + /* Array index: 0x0FCB */ 0x2606,0x2177, + /* Array index: 0x0FCB */ 0x2609,0x2254, + /* Array index: 0x0FCB */ 0x30FB,0x2126, + /* Array index: 0x0FCB */ 0x32A3,0x2221, + /* Array index: 0x0FCB */ 0x338E,0x2275, + /* Array index: 0x0FCB */ 0x338F,0x2276, + /* Array index: 0x0FCB */ 0x33A1,0x2274, + /* Array index: 0x0FCB */ 0x33C4,0x2277, + /* Array index: 0x0FCB */ 0x33CE,0x2273, + /* Array index: 0x0FCB */ 0x33D1,0x224C, + /* Array index: 0x0FCB */ 0x33D2,0x224B, + /* Array index: 0x0FCB */ 0x33D5,0x226F, + /* Array index: 0x0FCB */ 0x4E00,0x4421, + /* Array index: 0x0FCB */ 0x4E01,0x4423, + /* Array index: 0x0FCB */ 0x4E03,0x4424, + /* Array index: 0x0FCB */ 0x4E1E,0x4722, + /* Array index: 0x0FCB */ 0x4E1F,0x4723, + /* Array index: 0x0FCB */ 0x4E26,0x4B64, + /* Array index: 0x0FCB */ 0x4E2B,0x4439, + /* Array index: 0x0FCB */ 0x4E2D,0x4463, + /* Array index: 0x0FCB */ 0x4E30,0x4464, + /* Array index: 0x0FCB */ 0x4E32,0x486B, + /* Array index: 0x0FCB */ 0x4E38,0x443A, + /* Array index: 0x0FCB */ 0x4E39,0x4465, + /* Array index: 0x0FCB */ 0x4E3B,0x4564, + /* Array index: 0x0FCB */ 0x4E43,0x4425, + /* Array index: 0x0FCB */ 0x4E45,0x443C, + /* Array index: 0x0FCB */ 0x4E48,0x443D, + /* Array index: 0x0FCB */ 0x4E56,0x4B65, + /* Array index: 0x0FCB */ 0x4E58,0x537D, + /* Array index: 0x0FCB */ 0x4E59,0x4422, + /* Array index: 0x0FCB */ 0x4E69,0x4726, + /* Array index: 0x0FCB */ 0x4E73,0x4B66, + /* Array index: 0x0FCB */ 0x4E7E,0x5871, + /* Array index: 0x0FCB */ 0x4E82,0x632A, + /* Array index: 0x0FCB */ 0x4E86,0x4427, + /* Array index: 0x0FCB */ 0x4E88,0x4468, + /* Array index: 0x0FCB */ 0x4E8B,0x4B67, + /* Array index: 0x0FCB */ 0x4E8C,0x4428, + /* Array index: 0x0FCB */ 0x4E8E,0x4440, + /* Array index: 0x0FCB */ 0x4E99,0x4727, + /* Array index: 0x0FCB */ 0x4E9B,0x4B68, + /* Array index: 0x0FCB */ 0x4EB3,0x537E, + /* Array index: 0x0FCB */ 0x4EBA,0x4429, + /* Array index: 0x0FCB */ 0x4EDE,0x4571, + /* Array index: 0x0FCB */ 0x4EDF,0x4623, + /* Array index: 0x0FCB */ 0x4EF0,0x4737, + /* Array index: 0x0FCB */ 0x4EF2,0x4734, + /* Array index: 0x0FCB */ 0x4EF3,0x4738, + /* Array index: 0x0FCB */ 0x4EF6,0x4735, + /* Array index: 0x0FCB */ 0x4EFB,0x4736, + /* Array index: 0x0FCB */ 0x4EFD,0x4739, + /* Array index: 0x0FCB */ 0x4EFF,0x472B, + /* Array index: 0x0FCB */ 0x4F01,0x473A, + /* Array index: 0x0FCB */ 0x4F15,0x472F, + /* Array index: 0x0FCB */ 0x4F19,0x472D, + /* Array index: 0x0FCB */ 0x4F2F,0x4924, + /* Array index: 0x0FCB */ 0x4F30,0x4875, + /* Array index: 0x0FCB */ 0x4F34,0x4872, + /* Array index: 0x0FCB */ 0x4F36,0x4926, + /* Array index: 0x0FCB */ 0x4F38,0x487A, + /* Array index: 0x0FCB */ 0x4F3A,0x4879, + /* Array index: 0x0FCB */ 0x4F3C,0x487D, + /* Array index: 0x0FCB */ 0x4F3D,0x4878, + /* Array index: 0x0FCB */ 0x4F43,0x487B, + /* Array index: 0x0FCB */ 0x4F63,0x4921, + /* Array index: 0x0FCB */ 0x4F69,0x4B79, + /* Array index: 0x0FCB */ 0x4F6C,0x4B71, + /* Array index: 0x0FCB */ 0x4F6F,0x4B6C, + /* Array index: 0x0FCB */ 0x4F70,0x4B76, + /* Array index: 0x0FCB */ 0x4F73,0x4B6F, + /* Array index: 0x0FCB */ 0x4F75,0x4B77, + /* Array index: 0x0FCB */ 0x4F7A,0x4C21, + /* Array index: 0x0FCB */ 0x4F7B,0x4B7A, + /* Array index: 0x0FCB */ 0x4F7E,0x4B7C, + /* Array index: 0x0FCB */ 0x4F7F,0x4B70, + /* Array index: 0x0FCB */ 0x4F83,0x4B75, + /* Array index: 0x0FCB */ 0x4F86,0x4B74, + /* Array index: 0x0FCB */ 0x4F88,0x4B78, + /* Array index: 0x0FCB */ 0x4F8B,0x4B73, + /* Array index: 0x0FCB */ 0x4F8D,0x4B6E, + /* Array index: 0x0FCB */ 0x4F8F,0x4B7D, + /* Array index: 0x0FCB */ 0x4F91,0x4B7E, + /* Array index: 0x0FCB */ 0x4F96,0x4B7B, + /* Array index: 0x0FCB */ 0x4F9B,0x4B72, + /* Array index: 0x0FCB */ 0x4F9D,0x4B6D, + /* Array index: 0x0FCB */ 0x4FAE,0x4F78, + /* Array index: 0x0FCB */ 0x4FAF,0x4F6C, + /* Array index: 0x0FCB */ 0x4FBF,0x4F6D, + /* Array index: 0x0FCB */ 0x4FCA,0x4F76, + /* Array index: 0x0FCB */ 0x4FD7,0x4F77, + /* Array index: 0x0FCB */ 0x4FD8,0x4F74, + /* Array index: 0x0FCB */ 0x4FDA,0x4F7C, + /* Array index: 0x0FCB */ 0x4FEE,0x543A, + /* Array index: 0x0FCB */ 0x4FEF,0x5424, + /* Array index: 0x0FCB */ 0x4FF1,0x5434, + /* Array index: 0x0FCB */ 0x4FF3,0x5439, + /* Array index: 0x0FCB */ 0x4FF8,0x5427, + /* Array index: 0x0FCB */ 0x4FFA,0x5430, + /* Array index: 0x0FCB */ 0x4FFE,0x543D, + /* Array index: 0x0FCB */ 0x5000,0x5431, + /* Array index: 0x0FCB */ 0x5006,0x542A, + /* Array index: 0x0FCB */ 0x501F,0x542C, + /* Array index: 0x0FCB */ 0x5021,0x5435, + /* Array index: 0x0FCB */ 0x5023,0x5423, + /* Array index: 0x0FCB */ 0x503C,0x542B, + /* Array index: 0x0FCB */ 0x5043,0x5876, + /* Array index: 0x0FCB */ 0x5047,0x5875, + /* Array index: 0x0FCB */ 0x5049,0x5879, + /* Array index: 0x0FCB */ 0x504C,0x5877, + /* Array index: 0x0FCB */ 0x504E,0x587C, + /* Array index: 0x0FCB */ 0x504F,0x5923, + /* Array index: 0x0FCB */ 0x5055,0x587D, + /* Array index: 0x0FCB */ 0x505A,0x5878, + /* Array index: 0x0FCB */ 0x505C,0x5874, + /* Array index: 0x0FCB */ 0x5065,0x587A, + /* Array index: 0x0FCB */ 0x506D,0x5926, + /* Array index: 0x0FCB */ 0x506F,0x5925, + /* Array index: 0x0FCB */ 0x507A,0x5872, + /* Array index: 0x0FCB */ 0x507D,0x5873, + /* Array index: 0x0FCB */ 0x5080,0x5E2E, + /* Array index: 0x0FCB */ 0x5085,0x5E2B, + /* Array index: 0x0FCB */ 0x508D,0x5E2A, + /* Array index: 0x0FCB */ 0x5091,0x5E2D, + /* Array index: 0x0FCB */ 0x50A2,0x5E29, + /* Array index: 0x0FCB */ 0x50AC,0x6331, + /* Array index: 0x0FCB */ 0x50AD,0x632B, + /* Array index: 0x0FCB */ 0x50AF,0x6334, + /* Array index: 0x0FCB */ 0x50B2,0x632D, + /* Array index: 0x0FCB */ 0x50B3,0x632E, + /* Array index: 0x0FCB */ 0x50B5,0x632C, + /* Array index: 0x0FCB */ 0x50B7,0x6332, + /* Array index: 0x0FCB */ 0x50BB,0x6333, + /* Array index: 0x0FCB */ 0x50BE,0x6330, + /* Array index: 0x0FCB */ 0x50C5,0x632F, + /* Array index: 0x0FCB */ 0x50C7,0x6335, + /* Array index: 0x0FCB */ 0x50CE,0x677C, + /* Array index: 0x0FCB */ 0x50CF,0x6779, + /* Array index: 0x0FCB */ 0x50D1,0x677A, + /* Array index: 0x0FCB */ 0x50D5,0x6778, + /* Array index: 0x0FCB */ 0x50D6,0x6775, + /* Array index: 0x0FCB */ 0x50DA,0x6777, + /* Array index: 0x0FCB */ 0x50E5,0x6774, + /* Array index: 0x0FCB */ 0x50E7,0x6772, + /* Array index: 0x0FCB */ 0x50E9,0x677D, + /* Array index: 0x0FCB */ 0x50ED,0x6776, + /* Array index: 0x0FCB */ 0x50EE,0x6773, + /* Array index: 0x0FCB */ 0x50F1,0x677B, + /* Array index: 0x0FCB */ 0x50F5,0x6C23, + /* Array index: 0x0FCB */ 0x50F9,0x6C24, + /* Array index: 0x0FCB */ 0x50FB,0x6C22, + /* Array index: 0x0FCB */ 0x5100,0x6C21, + /* Array index: 0x0FCB */ 0x5102,0x6C25, + /* Array index: 0x0FCB */ 0x5104,0x6B7E, + /* Array index: 0x0FCB */ 0x5105,0x6C28, + /* Array index: 0x0FCB */ 0x5108,0x6C26, + /* Array index: 0x0FCB */ 0x5109,0x6C27, + /* Array index: 0x0FCB */ 0x5110,0x7033, + /* Array index: 0x0FCB */ 0x5112,0x7030, + /* Array index: 0x0FCB */ 0x5114,0x7032, + /* Array index: 0x0FCB */ 0x5115,0x7034, + /* Array index: 0x0FCB */ 0x5118,0x7031, + /* Array index: 0x0FCB */ 0x511F,0x7341, + /* Array index: 0x0FCB */ 0x5121,0x7342, + /* Array index: 0x0FCB */ 0x512A,0x7340, + /* Array index: 0x0FCB */ 0x5132,0x7343, + /* Array index: 0x0FCB */ 0x5133,0x782B, + /* Array index: 0x0FCB */ 0x5137,0x7A62, + /* Array index: 0x0FCB */ 0x5138,0x7A63, + /* Array index: 0x0FCB */ 0x5152,0x4C23, + /* Array index: 0x0FCB */ 0x5154,0x4C22, + /* Array index: 0x0FCB */ 0x5155,0x4C24, + /* Array index: 0x0FCB */ 0x5157,0x5022, + /* Array index: 0x0FCB */ 0x5171,0x4741, + /* Array index: 0x0FCB */ 0x517C,0x5440, + /* Array index: 0x0FCB */ 0x5180,0x7035, + /* Array index: 0x0FCB */ 0x5189,0x4574, + /* Array index: 0x0FCB */ 0x518A,0x4575, + /* Array index: 0x0FCB */ 0x518D,0x4742, + /* Array index: 0x0FCB */ 0x5191,0x5024, + /* Array index: 0x0FCB */ 0x5192,0x5023, + /* Array index: 0x0FCB */ 0x5195,0x5928, + /* Array index: 0x0FCB */ 0x5197,0x447D, + /* Array index: 0x0FCB */ 0x51A0,0x5025, + /* Array index: 0x0FCB */ 0x51A2,0x5443, + /* Array index: 0x0FCB */ 0x51A4,0x5441, + /* Array index: 0x0FCB */ 0x51A5,0x5442, + /* Array index: 0x0FCB */ 0x51AA,0x7036, + /* Array index: 0x0FCB */ 0x51AC,0x4576, + /* Array index: 0x0FCB */ 0x51B0,0x4743, + /* Array index: 0x0FCB */ 0x51B6,0x492F, + /* Array index: 0x0FCB */ 0x51B7,0x4930, + /* Array index: 0x0FCB */ 0x51BD,0x4C29, + /* Array index: 0x0FCB */ 0x51C6,0x5446, + /* Array index: 0x0FCB */ 0x51DC,0x6C29, + /* Array index: 0x0FCB */ 0x51DD,0x7037, + /* Array index: 0x0FCB */ 0x51E0,0x442D, + /* Array index: 0x0FCB */ 0x51E1,0x443B, + /* Array index: 0x0FCB */ 0x51F0,0x5929, + /* Array index: 0x0FCB */ 0x51F1,0x5E33, + /* Array index: 0x0FCB */ 0x51F3,0x6821, + /* Array index: 0x0FCB */ 0x51FD,0x4C2A, + /* Array index: 0x0FCB */ 0x5200,0x442E, + /* Array index: 0x0FCB */ 0x5201,0x442F, + /* Array index: 0x0FCB */ 0x5203,0x4443, + /* Array index: 0x0FCB */ 0x520E,0x4747, + /* Array index: 0x0FCB */ 0x5211,0x4745, + /* Array index: 0x0FCB */ 0x5212,0x4746, + /* Array index: 0x0FCB */ 0x5216,0x4748, + /* Array index: 0x0FCB */ 0x5217,0x4744, + /* Array index: 0x0FCB */ 0x521D,0x4F4F, + /* Array index: 0x0FCB */ 0x522E,0x4C30, + /* Array index: 0x0FCB */ 0x5230,0x4C2F, + /* Array index: 0x0FCB */ 0x5241,0x4C32, + /* Array index: 0x0FCB */ 0x5243,0x5027, + /* Array index: 0x0FCB */ 0x5247,0x502C, + /* Array index: 0x0FCB */ 0x5254,0x544A, + /* Array index: 0x0FCB */ 0x5256,0x5448, + /* Array index: 0x0FCB */ 0x5269,0x5E37, + /* Array index: 0x0FCB */ 0x526A,0x592A, + /* Array index: 0x0FCB */ 0x526F,0x592B, + /* Array index: 0x0FCB */ 0x5272,0x5E34, + /* Array index: 0x0FCB */ 0x5274,0x5E35, + /* Array index: 0x0FCB */ 0x5275,0x5E36, + /* Array index: 0x0FCB */ 0x5277,0x6337, + /* Array index: 0x0FCB */ 0x527D,0x6338, + /* Array index: 0x0FCB */ 0x527F,0x6336, + /* Array index: 0x0FCB */ 0x5282,0x6823, + /* Array index: 0x0FCB */ 0x5283,0x6822, + /* Array index: 0x0FCB */ 0x528D,0x6C2D, + /* Array index: 0x0FCB */ 0x5291,0x7038, + /* Array index: 0x0FCB */ 0x5293,0x7039, + /* Array index: 0x0FCB */ 0x529B,0x4430, + /* Array index: 0x0FCB */ 0x529F,0x457C, + /* Array index: 0x0FCB */ 0x52A0,0x457B, + /* Array index: 0x0FCB */ 0x52A3,0x4749, + /* Array index: 0x0FCB */ 0x52BB,0x4C34, + /* Array index: 0x0FCB */ 0x52BE,0x4C33, + /* Array index: 0x0FCB */ 0x52C1,0x5030, + /* Array index: 0x0FCB */ 0x52C3,0x502F, + /* Array index: 0x0FCB */ 0x52C7,0x502D, + /* Array index: 0x0FCB */ 0x52C9,0x502E, + /* Array index: 0x0FCB */ 0x52D2,0x592C, + /* Array index: 0x0FCB */ 0x52F0,0x6C2F, + /* Array index: 0x0FCB */ 0x52F3,0x703A, + /* Array index: 0x0FCB */ 0x52F5,0x7344, + /* Array index: 0x0FCB */ 0x52F8,0x7961, + /* Array index: 0x0FCB */ 0x52FA,0x4444, + /* Array index: 0x0FCB */ 0x52FB,0x4524, + /* Array index: 0x0FCB */ 0x52FE,0x4525, + /* Array index: 0x0FCB */ 0x52FF,0x4526, + /* Array index: 0x0FCB */ 0x5305,0x457D, + /* Array index: 0x0FCB */ 0x5306,0x457E, + /* Array index: 0x0FCB */ 0x5308,0x474A, + /* Array index: 0x0FCB */ 0x530D,0x5031, + /* Array index: 0x0FCB */ 0x530F,0x5931, + /* Array index: 0x0FCB */ 0x5310,0x5930, + /* Array index: 0x0FCB */ 0x531D,0x4622, + /* Array index: 0x0FCB */ 0x5320,0x474C, + /* Array index: 0x0FCB */ 0x5321,0x474B, + /* Array index: 0x0FCB */ 0x5323,0x493A, + /* Array index: 0x0FCB */ 0x532A,0x544D, + /* Array index: 0x0FCB */ 0x532F,0x633E, + /* Array index: 0x0FCB */ 0x5331,0x6824, + /* Array index: 0x0FCB */ 0x5339,0x4528, + /* Array index: 0x0FCB */ 0x5357,0x5032, + /* Array index: 0x0FCB */ 0x535A,0x5E3B, + /* Array index: 0x0FCB */ 0x535C,0x4433, + /* Array index: 0x0FCB */ 0x535E,0x452C, + /* Array index: 0x0FCB */ 0x5360,0x4627, + /* Array index: 0x0FCB */ 0x5361,0x4626, + /* Array index: 0x0FCB */ 0x5366,0x4C39, + /* Array index: 0x0FCB */ 0x537F,0x544E, + /* Array index: 0x0FCB */ 0x5384,0x452D, + /* Array index: 0x0FCB */ 0x539A,0x5034, + /* Array index: 0x0FCB */ 0x539D,0x5450, + /* Array index: 0x0FCB */ 0x539F,0x544F, + /* Array index: 0x0FCB */ 0x53A5,0x5E3C, + /* Array index: 0x0FCB */ 0x53AD,0x6825, + /* Array index: 0x0FCB */ 0x53B2,0x6C30, + /* Array index: 0x0FCB */ 0x53BB,0x462A, + /* Array index: 0x0FCB */ 0x53C3,0x5936, + /* Array index: 0x0FCB */ 0x53D4,0x4C3E, + /* Array index: 0x0FCB */ 0x53D6,0x4C3D, + /* Array index: 0x0FCB */ 0x53D7,0x4C3F, + /* Array index: 0x0FCB */ 0x53DB,0x5035, + /* Array index: 0x0FCB */ 0x53DF,0x5451, + /* Array index: 0x0FCB */ 0x53F8,0x4633, + /* Array index: 0x0FCB */ 0x53FB,0x463D, + /* Array index: 0x0FCB */ 0x53FC,0x4632, + /* Array index: 0x0FCB */ 0x5401,0x4754, + /* Array index: 0x0FCB */ 0x5403,0x475A, + /* Array index: 0x0FCB */ 0x5404,0x4756, + /* Array index: 0x0FCB */ 0x5426,0x4941, + /* Array index: 0x0FCB */ 0x5427,0x4943, + /* Array index: 0x0FCB */ 0x5431,0x4955, + /* Array index: 0x0FCB */ 0x5433,0x4946, + /* Array index: 0x0FCB */ 0x5446,0x4944, + /* Array index: 0x0FCB */ 0x5448,0x4947, + /* Array index: 0x0FCB */ 0x544A,0x494B, + /* Array index: 0x0FCB */ 0x544E,0x4942, + /* Array index: 0x0FCB */ 0x5462,0x4C51, + /* Array index: 0x0FCB */ 0x5468,0x4C52, + /* Array index: 0x0FCB */ 0x5471,0x4C4D, + /* Array index: 0x0FCB */ 0x5480,0x4C45, + /* Array index: 0x0FCB */ 0x5484,0x4C48, + /* Array index: 0x0FCB */ 0x5486,0x4C4A, + /* Array index: 0x0FCB */ 0x548B,0x4C53, + /* Array index: 0x0FCB */ 0x548C,0x4C4F, + /* Array index: 0x0FCB */ 0x548E,0x4C55, + /* Array index: 0x0FCB */ 0x5490,0x4C4C, + /* Array index: 0x0FCB */ 0x5492,0x4C49, + /* Array index: 0x0FCB */ 0x5495,0x4C44, + /* Array index: 0x0FCB */ 0x5496,0x4C42, + /* Array index: 0x0FCB */ 0x549A,0x4C50, + /* Array index: 0x0FCB */ 0x54AF,0x5045, + /* Array index: 0x0FCB */ 0x54B1,0x5047, + /* Array index: 0x0FCB */ 0x54B3,0x503D, + /* Array index: 0x0FCB */ 0x54B8,0x503B, + /* Array index: 0x0FCB */ 0x54BB,0x5048, + /* Array index: 0x0FCB */ 0x54CE,0x5039, + /* Array index: 0x0FCB */ 0x54E1,0x545E, + /* Array index: 0x0FCB */ 0x54F2,0x5458, + /* Array index: 0x0FCB */ 0x54FA,0x545A, + /* Array index: 0x0FCB */ 0x54FC,0x5456, + /* Array index: 0x0FCB */ 0x54FD,0x5465, + /* Array index: 0x0FCB */ 0x5501,0x5454, + /* Array index: 0x0FCB */ 0x5506,0x5459, + /* Array index: 0x0FCB */ 0x5507,0x5464, + /* Array index: 0x0FCB */ 0x5509,0x545F, + /* Array index: 0x0FCB */ 0x550F,0x5466, + /* Array index: 0x0FCB */ 0x5510,0x5453, + /* Array index: 0x0FCB */ 0x5514,0x545B, + /* Array index: 0x0FCB */ 0x5527,0x5463, + /* Array index: 0x0FCB */ 0x552C,0x5949, + /* Array index: 0x0FCB */ 0x552E,0x5947, + /* Array index: 0x0FCB */ 0x552F,0x5944, + /* Array index: 0x0FCB */ 0x5531,0x5940, + /* Array index: 0x0FCB */ 0x5533,0x594B, + /* Array index: 0x0FCB */ 0x5537,0x5455, + /* Array index: 0x0FCB */ 0x5538,0x5946, + /* Array index: 0x0FCB */ 0x553E,0x5E4E, + /* Array index: 0x0FCB */ 0x5541,0x594C, + /* Array index: 0x0FCB */ 0x5543,0x593E, + /* Array index: 0x0FCB */ 0x5544,0x593B, + /* Array index: 0x0FCB */ 0x5546,0x5938, + /* Array index: 0x0FCB */ 0x554A,0x593F, + /* Array index: 0x0FCB */ 0x554F,0x5942, + /* Array index: 0x0FCB */ 0x555C,0x5948, + /* Array index: 0x0FCB */ 0x555E,0x593C, + /* Array index: 0x0FCB */ 0x555F,0x5A76, + /* Array index: 0x0FCB */ 0x5561,0x593D, + /* Array index: 0x0FCB */ 0x5563,0x594A, + /* Array index: 0x0FCB */ 0x5564,0x5945, + /* Array index: 0x0FCB */ 0x5566,0x593A, + /* Array index: 0x0FCB */ 0x556A,0x5939, + /* Array index: 0x0FCB */ 0x557B,0x5E3D, + /* Array index: 0x0FCB */ 0x557C,0x5E40, + /* Array index: 0x0FCB */ 0x557E,0x5E54, + /* Array index: 0x0FCB */ 0x5594,0x5E47, + /* Array index: 0x0FCB */ 0x55A7,0x5E3F, + /* Array index: 0x0FCB */ 0x55BB,0x5E51, + /* Array index: 0x0FCB */ 0x55CE,0x6343, + /* Array index: 0x0FCB */ 0x55D1,0x6346, + /* Array index: 0x0FCB */ 0x55D3,0x6341, + /* Array index: 0x0FCB */ 0x55DA,0x634A, + /* Array index: 0x0FCB */ 0x55DC,0x6344, + /* Array index: 0x0FCB */ 0x55DF,0x633F, + /* Array index: 0x0FCB */ 0x55EF,0x6349, + /* Array index: 0x0FCB */ 0x55F6,0x6835, + /* Array index: 0x0FCB */ 0x55F7,0x6830, + /* Array index: 0x0FCB */ 0x55FD,0x682A, + /* Array index: 0x0FCB */ 0x55FE,0x6826, + /* Array index: 0x0FCB */ 0x5600,0x6827, + /* Array index: 0x0FCB */ 0x5606,0x682C, + /* Array index: 0x0FCB */ 0x5608,0x6833, + /* Array index: 0x0FCB */ 0x5609,0x682D, + /* Array index: 0x0FCB */ 0x560D,0x682E, + /* Array index: 0x0FCB */ 0x560E,0x682F, + /* Array index: 0x0FCB */ 0x5610,0x6834, + /* Array index: 0x0FCB */ 0x5614,0x682B, + /* Array index: 0x0FCB */ 0x5616,0x6831, + /* Array index: 0x0FCB */ 0x5617,0x6829, + /* Array index: 0x0FCB */ 0x561B,0x6828, + /* Array index: 0x0FCB */ 0x561F,0x6832, + /* Array index: 0x0FCB */ 0x5629,0x6C37, + /* Array index: 0x0FCB */ 0x5639,0x6C33, + /* Array index: 0x0FCB */ 0x563B,0x6C32, + /* Array index: 0x0FCB */ 0x563F,0x6C35, + /* Array index: 0x0FCB */ 0x564E,0x6C39, + /* Array index: 0x0FCB */ 0x5653,0x6C38, + /* Array index: 0x0FCB */ 0x5657,0x6C3A, + /* Array index: 0x0FCB */ 0x5659,0x703B, + /* Array index: 0x0FCB */ 0x5662,0x7047, + /* Array index: 0x0FCB */ 0x566F,0x7045, + /* Array index: 0x0FCB */ 0x5671,0x7044, + /* Array index: 0x0FCB */ 0x5674,0x6C3B, + /* Array index: 0x0FCB */ 0x5676,0x7048, + /* Array index: 0x0FCB */ 0x5678,0x7040, + /* Array index: 0x0FCB */ 0x5679,0x703D, + /* Array index: 0x0FCB */ 0x5680,0x7346, + /* Array index: 0x0FCB */ 0x5685,0x7348, + /* Array index: 0x0FCB */ 0x5687,0x7349, + /* Array index: 0x0FCB */ 0x5695,0x763C, + /* Array index: 0x0FCB */ 0x56A5,0x782C, + /* Array index: 0x0FCB */ 0x56A8,0x782D, + /* Array index: 0x0FCB */ 0x56AE,0x763D, + /* Array index: 0x0FCB */ 0x56B4,0x7964, + /* Array index: 0x0FCB */ 0x56B6,0x7963, + /* Array index: 0x0FCB */ 0x56B7,0x7962, + /* Array index: 0x0FCB */ 0x56BC,0x7965, + /* Array index: 0x0FCB */ 0x56D1,0x7C5D, + /* Array index: 0x0FCB */ 0x56E4,0x495B, + /* Array index: 0x0FCB */ 0x56EA,0x4959, + /* Array index: 0x0FCB */ 0x56EB,0x495C, + /* Array index: 0x0FCB */ 0x56F0,0x495A, + /* Array index: 0x0FCB */ 0x56FA,0x4C56, + /* Array index: 0x0FCB */ 0x56FF,0x504C, + /* Array index: 0x0FCB */ 0x5703,0x5467, + /* Array index: 0x0FCB */ 0x5704,0x5468, + /* Array index: 0x0FCB */ 0x5708,0x594E, + /* Array index: 0x0FCB */ 0x5709,0x5950, + /* Array index: 0x0FCB */ 0x570B,0x594F, + /* Array index: 0x0FCB */ 0x570D,0x5E58, + /* Array index: 0x0FCB */ 0x5712,0x6350, + /* Array index: 0x0FCB */ 0x5713,0x6351, + /* Array index: 0x0FCB */ 0x5716,0x6837, + /* Array index: 0x0FCB */ 0x5718,0x6836, + /* Array index: 0x0FCB */ 0x571F,0x4448, + /* Array index: 0x0FCB */ 0x5728,0x4763, + /* Array index: 0x0FCB */ 0x5729,0x4767, + /* Array index: 0x0FCB */ 0x5733,0x4761, + /* Array index: 0x0FCB */ 0x573B,0x4966, + /* Array index: 0x0FCB */ 0x573E,0x4963, + /* Array index: 0x0FCB */ 0x5740,0x495F, + /* Array index: 0x0FCB */ 0x5747,0x4961, + /* Array index: 0x0FCB */ 0x574A,0x495D, + /* Array index: 0x0FCB */ 0x5761,0x4C5B, + /* Array index: 0x0FCB */ 0x5764,0x4C5D, + /* Array index: 0x0FCB */ 0x5766,0x4C5C, + /* Array index: 0x0FCB */ 0x5769,0x4C5A, + /* Array index: 0x0FCB */ 0x576A,0x4C59, + /* Array index: 0x0FCB */ 0x5777,0x4C58, + /* Array index: 0x0FCB */ 0x577C,0x4C5E, + /* Array index: 0x0FCB */ 0x5782,0x504D, + /* Array index: 0x0FCB */ 0x5783,0x4C57, + /* Array index: 0x0FCB */ 0x578B,0x504E, + /* Array index: 0x0FCB */ 0x5793,0x5054, + /* Array index: 0x0FCB */ 0x57A0,0x504F, + /* Array index: 0x0FCB */ 0x57A2,0x5051, + /* Array index: 0x0FCB */ 0x57A3,0x5050, + /* Array index: 0x0FCB */ 0x57AE,0x5053, + /* Array index: 0x0FCB */ 0x57C2,0x5469, + /* Array index: 0x0FCB */ 0x57C3,0x546C, + /* Array index: 0x0FCB */ 0x57CB,0x546B, + /* Array index: 0x0FCB */ 0x57CE,0x5052, + /* Array index: 0x0FCB */ 0x57D4,0x546A, + /* Array index: 0x0FCB */ 0x57DF,0x5951, + /* Array index: 0x0FCB */ 0x57E0,0x5955, + /* Array index: 0x0FCB */ 0x57E4,0x5956, + /* Array index: 0x0FCB */ 0x57F7,0x595A, + /* Array index: 0x0FCB */ 0x57F9,0x595B, + /* Array index: 0x0FCB */ 0x57FA,0x5957, + /* Array index: 0x0FCB */ 0x5802,0x5958, + /* Array index: 0x0FCB */ 0x5805,0x5952, + /* Array index: 0x0FCB */ 0x5806,0x5954, + /* Array index: 0x0FCB */ 0x5809,0x546D, + /* Array index: 0x0FCB */ 0x580A,0x5953, + /* Array index: 0x0FCB */ 0x581D,0x5E60, + /* Array index: 0x0FCB */ 0x5820,0x5E61, + /* Array index: 0x0FCB */ 0x5821,0x5E5F, + /* Array index: 0x0FCB */ 0x5824,0x5E5C, + /* Array index: 0x0FCB */ 0x582A,0x5E5A, + /* Array index: 0x0FCB */ 0x5851,0x6353, + /* Array index: 0x0FCB */ 0x5852,0x635D, + /* Array index: 0x0FCB */ 0x5854,0x6357, + /* Array index: 0x0FCB */ 0x5857,0x6355, + /* Array index: 0x0FCB */ 0x5858,0x6354, + /* Array index: 0x0FCB */ 0x585A,0x6356, + /* Array index: 0x0FCB */ 0x585E,0x6352, + /* Array index: 0x0FCB */ 0x5862,0x635C, + /* Array index: 0x0FCB */ 0x586B,0x6358, + /* Array index: 0x0FCB */ 0x586D,0x635A, + /* Array index: 0x0FCB */ 0x5875,0x6838, + /* Array index: 0x0FCB */ 0x5879,0x683D, + /* Array index: 0x0FCB */ 0x587D,0x683F, + /* Array index: 0x0FCB */ 0x587E,0x6839, + /* Array index: 0x0FCB */ 0x5880,0x6C3F, + /* Array index: 0x0FCB */ 0x5883,0x683A, + /* Array index: 0x0FCB */ 0x5885,0x683E, + /* Array index: 0x0FCB */ 0x588A,0x683C, + /* Array index: 0x0FCB */ 0x5893,0x683B, + /* Array index: 0x0FCB */ 0x589C,0x6C43, + /* Array index: 0x0FCB */ 0x589E,0x6C41, + /* Array index: 0x0FCB */ 0x589F,0x6C40, + /* Array index: 0x0FCB */ 0x58A6,0x6C46, + /* Array index: 0x0FCB */ 0x58A8,0x702E, + /* Array index: 0x0FCB */ 0x58A9,0x6C45, + /* Array index: 0x0FCB */ 0x58AE,0x6C44, + /* Array index: 0x0FCB */ 0x58B3,0x6C42, + /* Array index: 0x0FCB */ 0x58BE,0x704A, + /* Array index: 0x0FCB */ 0x58C1,0x7049, + /* Array index: 0x0FCB */ 0x58C5,0x704C, + /* Array index: 0x0FCB */ 0x58C7,0x704B, + /* Array index: 0x0FCB */ 0x58CE,0x734E, + /* Array index: 0x0FCB */ 0x58D1,0x734D, + /* Array index: 0x0FCB */ 0x58D3,0x734C, + /* Array index: 0x0FCB */ 0x58D5,0x734B, + /* Array index: 0x0FCB */ 0x58D8,0x763F, + /* Array index: 0x0FCB */ 0x58D9,0x763E, + /* Array index: 0x0FCB */ 0x58DE,0x782E, + /* Array index: 0x0FCB */ 0x58DF,0x782F, + /* Array index: 0x0FCB */ 0x58E2,0x7830, + /* Array index: 0x0FCB */ 0x58E4,0x7966, + /* Array index: 0x0FCB */ 0x58E9,0x7C5E, + /* Array index: 0x0FCB */ 0x58EB,0x4449, + /* Array index: 0x0FCB */ 0x58EC,0x4531, + /* Array index: 0x0FCB */ 0x58EF,0x4967, + /* Array index: 0x0FCB */ 0x58F9,0x5E62, + /* Array index: 0x0FCB */ 0x58FA,0x5E63, + /* Array index: 0x0FCB */ 0x58FD,0x6840, + /* Array index: 0x0FCB */ 0x590F,0x546E, + /* Array index: 0x0FCB */ 0x5920,0x595C, + /* Array index: 0x0FCB */ 0x5922,0x6842, + /* Array index: 0x0FCB */ 0x5924,0x6843, + /* Array index: 0x0FCB */ 0x5925,0x6841, + /* Array index: 0x0FCB */ 0x5931,0x4642, + /* Array index: 0x0FCB */ 0x5937,0x476A, + /* Array index: 0x0FCB */ 0x5938,0x476B, + /* Array index: 0x0FCB */ 0x593E,0x4968, + /* Array index: 0x0FCB */ 0x5944,0x4C63, + /* Array index: 0x0FCB */ 0x5960,0x5E64, + /* Array index: 0x0FCB */ 0x5962,0x595D, + /* Array index: 0x0FCB */ 0x5967,0x635F, + /* Array index: 0x0FCB */ 0x5969,0x6845, + /* Array index: 0x0FCB */ 0x596A,0x6844, + /* Array index: 0x0FCB */ 0x596D,0x6C47, + /* Array index: 0x0FCB */ 0x596E,0x704D, + /* Array index: 0x0FCB */ 0x5973,0x444C, + /* Array index: 0x0FCB */ 0x5974,0x4643, + /* Array index: 0x0FCB */ 0x5976,0x4644, + /* Array index: 0x0FCB */ 0x5978,0x476D, + /* Array index: 0x0FCB */ 0x5979,0x4770, + /* Array index: 0x0FCB */ 0x597D,0x476F, + /* Array index: 0x0FCB */ 0x598A,0x4973, + /* Array index: 0x0FCB */ 0x598D,0x4970, + /* Array index: 0x0FCB */ 0x5992,0x496A, + /* Array index: 0x0FCB */ 0x5993,0x4972, + /* Array index: 0x0FCB */ 0x5996,0x496F, + /* Array index: 0x0FCB */ 0x5999,0x496E, + /* Array index: 0x0FCB */ 0x599D,0x4969, + /* Array index: 0x0FCB */ 0x599E,0x496C, + /* Array index: 0x0FCB */ 0x59A8,0x496B, + /* Array index: 0x0FCB */ 0x59AE,0x4C69, + /* Array index: 0x0FCB */ 0x59AF,0x4C71, + /* Array index: 0x0FCB */ 0x59B3,0x4C72, + /* Array index: 0x0FCB */ 0x59B9,0x4C68, + /* Array index: 0x0FCB */ 0x59BB,0x4C66, + /* Array index: 0x0FCB */ 0x59BE,0x4C65, + /* Array index: 0x0FCB */ 0x59C5,0x4C74, + /* Array index: 0x0FCB */ 0x59C6,0x4C6B, + /* Array index: 0x0FCB */ 0x59CA,0x4C70, + /* Array index: 0x0FCB */ 0x59CB,0x4C6E, + /* Array index: 0x0FCB */ 0x59CD,0x4C6D, + /* Array index: 0x0FCB */ 0x59D8,0x505B, + /* Array index: 0x0FCB */ 0x59DA,0x5062, + /* Array index: 0x0FCB */ 0x59DC,0x505A, + /* Array index: 0x0FCB */ 0x59E3,0x505D, + /* Array index: 0x0FCB */ 0x59E5,0x5060, + /* Array index: 0x0FCB */ 0x59E6,0x5063, + /* Array index: 0x0FCB */ 0x59E8,0x505E, + /* Array index: 0x0FCB */ 0x59EA,0x5061, + /* Array index: 0x0FCB */ 0x59EC,0x5478, + /* Array index: 0x0FCB */ 0x59FB,0x5065, + /* Array index: 0x0FCB */ 0x59FF,0x505C, + /* Array index: 0x0FCB */ 0x5A01,0x5064, + /* Array index: 0x0FCB */ 0x5A03,0x505F, + /* Array index: 0x0FCB */ 0x5A09,0x547E, + /* Array index: 0x0FCB */ 0x5A0C,0x547D, + /* Array index: 0x0FCB */ 0x5A11,0x5472, + /* Array index: 0x0FCB */ 0x5A13,0x5477, + /* Array index: 0x0FCB */ 0x5A18,0x5473, + /* Array index: 0x0FCB */ 0x5A1B,0x5476, + /* Array index: 0x0FCB */ 0x5A1C,0x5474, + /* Array index: 0x0FCB */ 0x5A1F,0x5475, + /* Array index: 0x0FCB */ 0x5A20,0x5479, + /* Array index: 0x0FCB */ 0x5A23,0x547A, + /* Array index: 0x0FCB */ 0x5A25,0x547C, + /* Array index: 0x0FCB */ 0x5A29,0x547B, + /* Array index: 0x0FCB */ 0x5A36,0x595E, + /* Array index: 0x0FCB */ 0x5A3C,0x5964, + /* Array index: 0x0FCB */ 0x5A40,0x5963, + /* Array index: 0x0FCB */ 0x5A41,0x595F, + /* Array index: 0x0FCB */ 0x5A46,0x5967, + /* Array index: 0x0FCB */ 0x5A49,0x5960, + /* Array index: 0x0FCB */ 0x5A4A,0x5968, + /* Array index: 0x0FCB */ 0x5A5A,0x5966, + /* Array index: 0x0FCB */ 0x5A62,0x5965, + /* Array index: 0x0FCB */ 0x5A66,0x5961, + /* Array index: 0x0FCB */ 0x5A6A,0x5962, + /* Array index: 0x0FCB */ 0x5A77,0x5E65, + /* Array index: 0x0FCB */ 0x5A7F,0x5E67, + /* Array index: 0x0FCB */ 0x5A92,0x5E68, + /* Array index: 0x0FCB */ 0x5A9A,0x5E66, + /* Array index: 0x0FCB */ 0x5A9B,0x5E69, + /* Array index: 0x0FCB */ 0x5AA7,0x5E6A, + /* Array index: 0x0FCB */ 0x5AB2,0x6368, + /* Array index: 0x0FCB */ 0x5AB3,0x6366, + /* Array index: 0x0FCB */ 0x5AC9,0x6361, + /* Array index: 0x0FCB */ 0x5ACC,0x6362, + /* Array index: 0x0FCB */ 0x5AE1,0x6846, + /* Array index: 0x0FCB */ 0x5AE3,0x684C, + /* Array index: 0x0FCB */ 0x5AE6,0x6847, + /* Array index: 0x0FCB */ 0x5AE9,0x6848, + /* Array index: 0x0FCB */ 0x5AF5,0x6C4B, + /* Array index: 0x0FCB */ 0x5AFB,0x6C49, + /* Array index: 0x0FCB */ 0x5B1D,0x704E, + /* Array index: 0x0FCB */ 0x5B24,0x7351, + /* Array index: 0x0FCB */ 0x5B2A,0x7350, + /* Array index: 0x0FCB */ 0x5B30,0x734F, + /* Array index: 0x0FCB */ 0x5B34,0x704F, + /* Array index: 0x0FCB */ 0x5B38,0x7640, + /* Array index: 0x0FCB */ 0x5B40,0x7967, + /* Array index: 0x0FCB */ 0x5B43,0x7968, + /* Array index: 0x0FCB */ 0x5B63,0x4C77, + /* Array index: 0x0FCB */ 0x5B64,0x4C76, + /* Array index: 0x0FCB */ 0x5B69,0x5066, + /* Array index: 0x0FCB */ 0x5B6B,0x5521, + /* Array index: 0x0FCB */ 0x5B70,0x5969, + /* Array index: 0x0FCB */ 0x5B71,0x5E6C, + /* Array index: 0x0FCB */ 0x5B73,0x5E6B, + /* Array index: 0x0FCB */ 0x5B75,0x684D, + /* Array index: 0x0FCB */ 0x5B78,0x7050, + /* Array index: 0x0FCB */ 0x5B7A,0x7352, + /* Array index: 0x0FCB */ 0x5B7D,0x7969, + /* Array index: 0x0FCB */ 0x5B7F,0x7B5C, + /* Array index: 0x0FCB */ 0x5B83,0x4646, + /* Array index: 0x0FCB */ 0x5B8F,0x497B, + /* Array index: 0x0FCB */ 0x5BAE,0x5527, + /* Array index: 0x0FCB */ 0x5BB0,0x5523, + /* Array index: 0x0FCB */ 0x5BBF,0x596E, + /* Array index: 0x0FCB */ 0x5BCC,0x5E6E, + /* Array index: 0x0FCB */ 0x5BD0,0x5E70, + /* Array index: 0x0FCB */ 0x5BD2,0x5E6D, + /* Array index: 0x0FCB */ 0x5BD3,0x5E6F, + /* Array index: 0x0FCB */ 0x5BF5,0x7831, + /* Array index: 0x0FCB */ 0x5BF6,0x796A, + /* Array index: 0x0FCB */ 0x5BF8,0x4450, + /* Array index: 0x0FCB */ 0x5BFA,0x4779, + /* Array index: 0x0FCB */ 0x5C01,0x506C, + /* Array index: 0x0FCB */ 0x5C04,0x552B, + /* Array index: 0x0FCB */ 0x5C16,0x477A, + /* Array index: 0x0FCB */ 0x5C1A,0x4C7E, + /* Array index: 0x0FCB */ 0x5C22,0x4452, + /* Array index: 0x0FCB */ 0x5C24,0x4538, + /* Array index: 0x0FCB */ 0x5C2C,0x497C, + /* Array index: 0x0FCB */ 0x5C31,0x5E73, + /* Array index: 0x0FCB */ 0x5C45,0x4D22, + /* Array index: 0x0FCB */ 0x5C46,0x4D23, + /* Array index: 0x0FCB */ 0x5C48,0x4D21, + /* Array index: 0x0FCB */ 0x5C55,0x552D, + /* Array index: 0x0FCB */ 0x5C58,0x5522, + /* Array index: 0x0FCB */ 0x5C5C,0x5974, + /* Array index: 0x0FCB */ 0x5C5D,0x5975, + /* Array index: 0x0FCB */ 0x5C60,0x5973, + /* Array index: 0x0FCB */ 0x5C62,0x6858, + /* Array index: 0x0FCB */ 0x5C64,0x6C52, + /* Array index: 0x0FCB */ 0x5C65,0x6C53, + /* Array index: 0x0FCB */ 0x5C68,0x7354, + /* Array index: 0x0FCB */ 0x5C6C,0x7A68, + /* Array index: 0x0FCB */ 0x5C6F,0x453A, + /* Array index: 0x0FCB */ 0x5C71,0x4454, + /* Array index: 0x0FCB */ 0x5C79,0x477B, + /* Array index: 0x0FCB */ 0x5C8C,0x4A26, + /* Array index: 0x0FCB */ 0x5C90,0x4A23, + /* Array index: 0x0FCB */ 0x5C91,0x4A24, + /* Array index: 0x0FCB */ 0x5C94,0x4A25, + /* Array index: 0x0FCB */ 0x5CA1,0x4D25, + /* Array index: 0x0FCB */ 0x5CA9,0x4D27, + /* Array index: 0x0FCB */ 0x5CAB,0x4D28, + /* Array index: 0x0FCB */ 0x5CB1,0x4D29, + /* Array index: 0x0FCB */ 0x5CB3,0x4D2A, + /* Array index: 0x0FCB */ 0x5CB7,0x4D24, + /* Array index: 0x0FCB */ 0x5CB8,0x4D26, + /* Array index: 0x0FCB */ 0x5CD2,0x5072, + /* Array index: 0x0FCB */ 0x5CD9,0x5071, + /* Array index: 0x0FCB */ 0x5CE8,0x5533, + /* Array index: 0x0FCB */ 0x5CEA,0x5532, + /* Array index: 0x0FCB */ 0x5CED,0x552F, + /* Array index: 0x0FCB */ 0x5CF0,0x5534, + /* Array index: 0x0FCB */ 0x5CF4,0x5537, + /* Array index: 0x0FCB */ 0x5CF6,0x5535, + /* Array index: 0x0FCB */ 0x5CFB,0x5531, + /* Array index: 0x0FCB */ 0x5CFD,0x5530, + /* Array index: 0x0FCB */ 0x5D01,0x5536, + /* Array index: 0x0FCB */ 0x5D06,0x5977, + /* Array index: 0x0FCB */ 0x5D07,0x5976, + /* Array index: 0x0FCB */ 0x5D0E,0x5978, + /* Array index: 0x0FCB */ 0x5D11,0x597C, + /* Array index: 0x0FCB */ 0x5D14,0x597E, + /* Array index: 0x0FCB */ 0x5D16,0x597A, + /* Array index: 0x0FCB */ 0x5D17,0x5A24, + /* Array index: 0x0FCB */ 0x5D19,0x5A21, + /* Array index: 0x0FCB */ 0x5D1B,0x5979, + /* Array index: 0x0FCB */ 0x5D22,0x597B, + /* Array index: 0x0FCB */ 0x5D24,0x5A22, + /* Array index: 0x0FCB */ 0x5D27,0x5A23, + /* Array index: 0x0FCB */ 0x5D29,0x597D, + /* Array index: 0x0FCB */ 0x5D34,0x5E76, + /* Array index: 0x0FCB */ 0x5D47,0x5E77, + /* Array index: 0x0FCB */ 0x5D4C,0x5E74, + /* Array index: 0x0FCB */ 0x5D50,0x5E75, + /* Array index: 0x0FCB */ 0x5D69,0x6369, + /* Array index: 0x0FCB */ 0x5D6F,0x636A, + /* Array index: 0x0FCB */ 0x5D84,0x6859, + /* Array index: 0x0FCB */ 0x5D87,0x685A, + /* Array index: 0x0FCB */ 0x5D94,0x6C55, + /* Array index: 0x0FCB */ 0x5D9D,0x6C54, + /* Array index: 0x0FCB */ 0x5DB8,0x7358, + /* Array index: 0x0FCB */ 0x5DBA,0x7356, + /* Array index: 0x0FCB */ 0x5DBC,0x7355, + /* Array index: 0x0FCB */ 0x5DBD,0x7357, + /* Array index: 0x0FCB */ 0x5DC9,0x796B, + /* Array index: 0x0FCB */ 0x5DCD,0x7A69, + /* Array index: 0x0FCB */ 0x5DD2,0x7B5E, + /* Array index: 0x0FCB */ 0x5DD4,0x7B5D, + /* Array index: 0x0FCB */ 0x5DD6,0x7C35, + /* Array index: 0x0FCB */ 0x5DDD,0x4455, + /* Array index: 0x0FCB */ 0x5DDE,0x477C, + /* Array index: 0x0FCB */ 0x5DEB,0x4A27, + /* Array index: 0x0FCB */ 0x5DEE,0x5538, + /* Array index: 0x0FCB */ 0x5DF7,0x5073, + /* Array index: 0x0FCB */ 0x5DFD,0x5E78, + /* Array index: 0x0FCB */ 0x5DFE,0x445A, + /* Array index: 0x0FCB */ 0x5E02,0x464B, + /* Array index: 0x0FCB */ 0x5E03,0x464C, + /* Array index: 0x0FCB */ 0x5E06,0x477D, + /* Array index: 0x0FCB */ 0x5E0C,0x4A28, + /* Array index: 0x0FCB */ 0x5E11,0x4D30, + /* Array index: 0x0FCB */ 0x5E15,0x4D2E, + /* Array index: 0x0FCB */ 0x5E16,0x4D2D, + /* Array index: 0x0FCB */ 0x5E18,0x4D2B, + /* Array index: 0x0FCB */ 0x5E1A,0x4D2C, + /* Array index: 0x0FCB */ 0x5E1B,0x4D2F, + /* Array index: 0x0FCB */ 0x5E1D,0x5074, + /* Array index: 0x0FCB */ 0x5E1F,0x5076, + /* Array index: 0x0FCB */ 0x5E25,0x5075, + /* Array index: 0x0FCB */ 0x5E2B,0x553A, + /* Array index: 0x0FCB */ 0x5E2D,0x5539, + /* Array index: 0x0FCB */ 0x5E33,0x5A28, + /* Array index: 0x0FCB */ 0x5E3D,0x5E7A, + /* Array index: 0x0FCB */ 0x5E40,0x5E7B, + /* Array index: 0x0FCB */ 0x5E43,0x5E7C, + /* Array index: 0x0FCB */ 0x5E45,0x5E79, + /* Array index: 0x0FCB */ 0x5E4C,0x636B, + /* Array index: 0x0FCB */ 0x5E54,0x685F, + /* Array index: 0x0FCB */ 0x5E55,0x685D, + /* Array index: 0x0FCB */ 0x5E57,0x685E, + /* Array index: 0x0FCB */ 0x5E5B,0x685B, + /* Array index: 0x0FCB */ 0x5E6B,0x7359, + /* Array index: 0x0FCB */ 0x5E87,0x4A2A, + /* Array index: 0x0FCB */ 0x5E8A,0x4A2B, + /* Array index: 0x0FCB */ 0x5E8F,0x4A29, + /* Array index: 0x0FCB */ 0x5E9A,0x4D32, + /* Array index: 0x0FCB */ 0x5E9C,0x4D34, + /* Array index: 0x0FCB */ 0x5EA0,0x5078, + /* Array index: 0x0FCB */ 0x5EA6,0x5079, + /* Array index: 0x0FCB */ 0x5EA7,0x553D, + /* Array index: 0x0FCB */ 0x5EAB,0x553B, + /* Array index: 0x0FCB */ 0x5EAD,0x553C, + /* Array index: 0x0FCB */ 0x5EBE,0x5A2E, + /* Array index: 0x0FCB */ 0x5EC1,0x5F21, + /* Array index: 0x0FCB */ 0x5EC2,0x5F22, + /* Array index: 0x0FCB */ 0x5EC4,0x5F23, + /* Array index: 0x0FCB */ 0x5ED3,0x6860, + /* Array index: 0x0FCB */ 0x5ED6,0x6861, + /* Array index: 0x0FCB */ 0x5EDA,0x6C5A, + /* Array index: 0x0FCB */ 0x5EDD,0x6C5C, + /* Array index: 0x0FCB */ 0x5EEC,0x7833, + /* Array index: 0x0FCB */ 0x5EF3,0x7D22, + /* Array index: 0x0FCB */ 0x5EF6,0x4D37, + /* Array index: 0x0FCB */ 0x5EF7,0x4A2C, + /* Array index: 0x0FCB */ 0x5EFA,0x507A, + /* Array index: 0x0FCB */ 0x5EFE,0x445C, + /* Array index: 0x0FCB */ 0x5EFF,0x453D, + /* Array index: 0x0FCB */ 0x5F01,0x464F, + /* Array index: 0x0FCB */ 0x5F04,0x4A2D, + /* Array index: 0x0FCB */ 0x5F08,0x507B, + /* Array index: 0x0FCB */ 0x5F0A,0x6862, + /* Array index: 0x0FCB */ 0x5F0B,0x445D, + /* Array index: 0x0FCB */ 0x5F0F,0x4822, + /* Array index: 0x0FCB */ 0x5F1B,0x4823, + /* Array index: 0x0FCB */ 0x5F1F,0x4A2E, + /* Array index: 0x0FCB */ 0x5F26,0x4D38, + /* Array index: 0x0FCB */ 0x5F27,0x4D39, + /* Array index: 0x0FCB */ 0x5F29,0x4D3A, + /* Array index: 0x0FCB */ 0x5F2D,0x507C, + /* Array index: 0x0FCB */ 0x5F31,0x553E, + /* Array index: 0x0FCB */ 0x5F35,0x5A2F, + /* Array index: 0x0FCB */ 0x5F37,0x5A30, + /* Array index: 0x0FCB */ 0x5F3C,0x5F24, + /* Array index: 0x0FCB */ 0x5F46,0x6863, + /* Array index: 0x0FCB */ 0x5F48,0x6C5F, + /* Array index: 0x0FCB */ 0x5F4A,0x7053, + /* Array index: 0x0FCB */ 0x5F4C,0x735A, + /* Array index: 0x0FCB */ 0x5F4E,0x7B5F, + /* Array index: 0x0FCB */ 0x5F57,0x5A31, + /* Array index: 0x0FCB */ 0x5F59,0x6370, + /* Array index: 0x0FCB */ 0x5F5E,0x7641, + /* Array index: 0x0FCB */ 0x5F62,0x4A30, + /* Array index: 0x0FCB */ 0x5F64,0x4A2F, + /* Array index: 0x0FCB */ 0x5F65,0x507D, + /* Array index: 0x0FCB */ 0x5F77,0x4A31, + /* Array index: 0x0FCB */ 0x5F79,0x4A32, + /* Array index: 0x0FCB */ 0x5F7C,0x4D3E, + /* Array index: 0x0FCB */ 0x5F9C,0x5A3B, + /* Array index: 0x0FCB */ 0x5F9E,0x5A37, + /* Array index: 0x0FCB */ 0x5FA0,0x5A3A, + /* Array index: 0x0FCB */ 0x5FA1,0x5A39, + /* Array index: 0x0FCB */ 0x5FB5,0x6C62, + /* Array index: 0x0FCB */ 0x5FB7,0x6C61, + /* Array index: 0x0FCB */ 0x5FB9,0x6865, + /* Array index: 0x0FCB */ 0x5FBD,0x735B, + /* Array index: 0x0FCB */ 0x5FC3,0x4540, + /* Array index: 0x0FCB */ 0x5FC5,0x4652, + /* Array index: 0x0FCB */ 0x5FCC,0x4A34, + /* Array index: 0x0FCB */ 0x5FCD,0x4A36, + /* Array index: 0x0FCB */ 0x5FDD,0x4D3F, + /* Array index: 0x0FCB */ 0x5FE0,0x4D40, + /* Array index: 0x0FCB */ 0x5FEA,0x4A3A, + /* Array index: 0x0FCB */ 0x5FEB,0x4A38, + /* Array index: 0x0FCB */ 0x5FF1,0x4A37, + /* Array index: 0x0FCB */ 0x5FF5,0x4D42, + /* Array index: 0x0FCB */ 0x5FF8,0x4A39, + /* Array index: 0x0FCB */ 0x5FFD,0x4D41, + /* Array index: 0x0FCB */ 0x5FFF,0x4D43, + /* Array index: 0x0FCB */ 0x600E,0x512B, + /* Array index: 0x0FCB */ 0x600F,0x4D44, + /* Array index: 0x0FCB */ 0x601B,0x4D4F, + /* Array index: 0x0FCB */ 0x601D,0x5128, + /* Array index: 0x0FCB */ 0x6020,0x5129, + /* Array index: 0x0FCB */ 0x6021,0x4D4B, + /* Array index: 0x0FCB */ 0x602F,0x4D46, + /* Array index: 0x0FCB */ 0x6035,0x4D47, + /* Array index: 0x0FCB */ 0x6043,0x5132, + /* Array index: 0x0FCB */ 0x6046,0x5131, + /* Array index: 0x0FCB */ 0x604D,0x512D, + /* Array index: 0x0FCB */ 0x6050,0x5545, + /* Array index: 0x0FCB */ 0x6055,0x5546, + /* Array index: 0x0FCB */ 0x6059,0x5542, + /* Array index: 0x0FCB */ 0x607F,0x5A3C, + /* Array index: 0x0FCB */ 0x6084,0x554A, + /* Array index: 0x0FCB */ 0x6085,0x5550, + /* Array index: 0x0FCB */ 0x6089,0x5A3E, + /* Array index: 0x0FCB */ 0x608C,0x554F, + /* Array index: 0x0FCB */ 0x608D,0x554D, + /* Array index: 0x0FCB */ 0x6094,0x554E, + /* Array index: 0x0FCB */ 0x6096,0x5551, + /* Array index: 0x0FCB */ 0x609A,0x554C, + /* Array index: 0x0FCB */ 0x609F,0x554B, + /* Array index: 0x0FCB */ 0x60A0,0x5A3F, + /* Array index: 0x0FCB */ 0x60A3,0x5A3D, + /* Array index: 0x0FCB */ 0x60A8,0x5A40, + /* Array index: 0x0FCB */ 0x60CB,0x5A41, + /* Array index: 0x0FCB */ 0x60D1,0x5F29, + /* Array index: 0x0FCB */ 0x60D5,0x5A4B, + /* Array index: 0x0FCB */ 0x60D8,0x5A4A, + /* Array index: 0x0FCB */ 0x60DA,0x5A4F, + /* Array index: 0x0FCB */ 0x60DC,0x5A48, + /* Array index: 0x0FCB */ 0x60E6,0x5A43, + /* Array index: 0x0FCB */ 0x6100,0x5F3A, + /* Array index: 0x0FCB */ 0x6101,0x637A, + /* Array index: 0x0FCB */ 0x6106,0x6426, + /* Array index: 0x0FCB */ 0x6108,0x637B, + /* Array index: 0x0FCB */ 0x6109,0x5F39, + /* Array index: 0x0FCB */ 0x6112,0x5F3B, + /* Array index: 0x0FCB */ 0x6115,0x5F31, + /* Array index: 0x0FCB */ 0x611F,0x6376, + /* Array index: 0x0FCB */ 0x6123,0x5F2F, + /* Array index: 0x0FCB */ 0x6127,0x6424, + /* Array index: 0x0FCB */ 0x6134,0x6423, + /* Array index: 0x0FCB */ 0x6137,0x6427, + /* Array index: 0x0FCB */ 0x613E,0x6422, + /* Array index: 0x0FCB */ 0x613F,0x6867, + /* Array index: 0x0FCB */ 0x6144,0x637E, + /* Array index: 0x0FCB */ 0x6155,0x6C67, + /* Array index: 0x0FCB */ 0x6158,0x686E, + /* Array index: 0x0FCB */ 0x615A,0x686D, + /* Array index: 0x0FCB */ 0x615D,0x6C66, + /* Array index: 0x0FCB */ 0x615F,0x686C, + /* Array index: 0x0FCB */ 0x6162,0x686A, + /* Array index: 0x0FCB */ 0x6163,0x686B, + /* Array index: 0x0FCB */ 0x6167,0x6C64, + /* Array index: 0x0FCB */ 0x6168,0x5F35, + /* Array index: 0x0FCB */ 0x616B,0x6C6B, + /* Array index: 0x0FCB */ 0x616E,0x6C65, + /* Array index: 0x0FCB */ 0x6170,0x6C6A, + /* Array index: 0x0FCB */ 0x617C,0x6C69, + /* Array index: 0x0FCB */ 0x617E,0x6C6C, + /* Array index: 0x0FCB */ 0x6182,0x6C68, + /* Array index: 0x0FCB */ 0x618A,0x7057, + /* Array index: 0x0FCB */ 0x618E,0x6C70, + /* Array index: 0x0FCB */ 0x6190,0x6C6E, + /* Array index: 0x0FCB */ 0x6191,0x7055, + /* Array index: 0x0FCB */ 0x6194,0x6C74, + /* Array index: 0x0FCB */ 0x619A,0x6C72, + /* Array index: 0x0FCB */ 0x61A4,0x6C73, + /* Array index: 0x0FCB */ 0x61A7,0x6C6D, + /* Array index: 0x0FCB */ 0x61A9,0x7056, + /* Array index: 0x0FCB */ 0x61AB,0x6C6F, + /* Array index: 0x0FCB */ 0x61AC,0x6C71, + /* Array index: 0x0FCB */ 0x61AE,0x6C75, + /* Array index: 0x0FCB */ 0x61B2,0x7054, + /* Array index: 0x0FCB */ 0x61B6,0x7059, + /* Array index: 0x0FCB */ 0x61BE,0x705A, + /* Array index: 0x0FCB */ 0x61C2,0x735D, + /* Array index: 0x0FCB */ 0x61E3,0x7642, + /* Array index: 0x0FCB */ 0x61E6,0x735F, + /* Array index: 0x0FCB */ 0x61F2,0x7834, + /* Array index: 0x0FCB */ 0x6208,0x4541, + /* Array index: 0x0FCB */ 0x621A,0x5A51, + /* Array index: 0x0FCB */ 0x621B,0x5A52, + /* Array index: 0x0FCB */ 0x621F,0x5F3C, + /* Array index: 0x0FCB */ 0x6221,0x6428, + /* Array index: 0x0FCB */ 0x6222,0x6429, + /* Array index: 0x0FCB */ 0x622A,0x6870, + /* Array index: 0x0FCB */ 0x622E,0x6C76, + /* Array index: 0x0FCB */ 0x6258,0x482C, + /* Array index: 0x0FCB */ 0x625B,0x482B, + /* Array index: 0x0FCB */ 0x6263,0x482A, + /* Array index: 0x0FCB */ 0x6273,0x4A48, + /* Array index: 0x0FCB */ 0x6276,0x4A41, + /* Array index: 0x0FCB */ 0x6279,0x4A47, + /* Array index: 0x0FCB */ 0x6284,0x4A3D, + /* Array index: 0x0FCB */ 0x6286,0x4A50, + /* Array index: 0x0FCB */ 0x6289,0x4A42, + /* Array index: 0x0FCB */ 0x628A,0x4A44, + /* Array index: 0x0FCB */ 0x62A8,0x4D63, + /* Array index: 0x0FCB */ 0x62AB,0x4D5E, + /* Array index: 0x0FCB */ 0x62AC,0x4D71, + /* Array index: 0x0FCB */ 0x62B1,0x4D6C, + /* Array index: 0x0FCB */ 0x62B5,0x4D6A, + /* Array index: 0x0FCB */ 0x62B9,0x4D5B, + /* Array index: 0x0FCB */ 0x62BC,0x4D65, + /* Array index: 0x0FCB */ 0x62BD,0x4D64, + /* Array index: 0x0FCB */ 0x62BF,0x4D59, + /* Array index: 0x0FCB */ 0x62C2,0x4D5A, + /* Array index: 0x0FCB */ 0x62F7,0x5142, + /* Array index: 0x0FCB */ 0x6311,0x5147, + /* Array index: 0x0FCB */ 0x6316,0x5139, + /* Array index: 0x0FCB */ 0x6328,0x5563, + /* Array index: 0x0FCB */ 0x632A,0x5561, + /* Array index: 0x0FCB */ 0x632B,0x5562, + /* Array index: 0x0FCB */ 0x632F,0x5558, + /* Array index: 0x0FCB */ 0x633A,0x555E, + /* Array index: 0x0FCB */ 0x633D,0x5560, + /* Array index: 0x0FCB */ 0x633E,0x5557, + /* Array index: 0x0FCB */ 0x6342,0x555A, + /* Array index: 0x0FCB */ 0x6346,0x555B, + /* Array index: 0x0FCB */ 0x6349,0x555D, + /* Array index: 0x0FCB */ 0x6355,0x5559, + /* Array index: 0x0FCB */ 0x6371,0x5A5E, + /* Array index: 0x0FCB */ 0x6372,0x5A56, + /* Array index: 0x0FCB */ 0x6376,0x5F4D, + /* Array index: 0x0FCB */ 0x6377,0x5A5A, + /* Array index: 0x0FCB */ 0x637A,0x5A70, + /* Array index: 0x0FCB */ 0x637B,0x5A6D, + /* Array index: 0x0FCB */ 0x6380,0x5A6C, + /* Array index: 0x0FCB */ 0x6383,0x5A61, + /* Array index: 0x0FCB */ 0x6384,0x5A65, + /* Array index: 0x0FCB */ 0x6388,0x5A66, + /* Array index: 0x0FCB */ 0x6389,0x5A60, + /* Array index: 0x0FCB */ 0x638C,0x5F3F, + /* Array index: 0x0FCB */ 0x638F,0x5A6B, + /* Array index: 0x0FCB */ 0x6392,0x5A6A, + /* Array index: 0x0FCB */ 0x6396,0x5A57, + /* Array index: 0x0FCB */ 0x6398,0x5A5C, + /* Array index: 0x0FCB */ 0x6399,0x5A67, + /* Array index: 0x0FCB */ 0x639B,0x5A62, + /* Array index: 0x0FCB */ 0x63C0,0x5F41, + /* Array index: 0x0FCB */ 0x63C6,0x5F44, + /* Array index: 0x0FCB */ 0x63C9,0x5F43, + /* Array index: 0x0FCB */ 0x63CD,0x5F45, + /* Array index: 0x0FCB */ 0x63CF,0x5F40, + /* Array index: 0x0FCB */ 0x63D0,0x5F48, + /* Array index: 0x0FCB */ 0x63D2,0x5F46, + /* Array index: 0x0FCB */ 0x63D6,0x5F4A, + /* Array index: 0x0FCB */ 0x63DA,0x5F52, + /* Array index: 0x0FCB */ 0x63DB,0x5F50, + /* Array index: 0x0FCB */ 0x63E1,0x5F49, + /* Array index: 0x0FCB */ 0x63E3,0x5F47, + /* Array index: 0x0FCB */ 0x63E9,0x5F42, + /* Array index: 0x0FCB */ 0x63EA,0x5F4F, + /* Array index: 0x0FCB */ 0x63ED,0x5F4B, + /* Array index: 0x0FCB */ 0x63EE,0x5F4C, + /* Array index: 0x0FCB */ 0x63F4,0x5F4E, + /* Array index: 0x0FCB */ 0x63F9,0x5F53, + /* Array index: 0x0FCB */ 0x6406,0x6438, + /* Array index: 0x0FCB */ 0x640D,0x6434, + /* Array index: 0x0FCB */ 0x640F,0x6431, + /* Array index: 0x0FCB */ 0x641C,0x6432, + /* Array index: 0x0FCB */ 0x641E,0x642C, + /* Array index: 0x0FCB */ 0x642A,0x642D, + /* Array index: 0x0FCB */ 0x642C,0x6430, + /* Array index: 0x0FCB */ 0x642D,0x642E, + /* Array index: 0x0FCB */ 0x6434,0x687A, + /* Array index: 0x0FCB */ 0x6436,0x6435, + /* Array index: 0x0FCB */ 0x643D,0x642F, + /* Array index: 0x0FCB */ 0x643E,0x642B, + /* Array index: 0x0FCB */ 0x6451,0x6878, + /* Array index: 0x0FCB */ 0x6452,0x5F51, + /* Array index: 0x0FCB */ 0x6454,0x6873, + /* Array index: 0x0FCB */ 0x6458,0x6872, + /* Array index: 0x0FCB */ 0x645F,0x6876, + /* Array index: 0x0FCB */ 0x6467,0x6879, + /* Array index: 0x0FCB */ 0x6469,0x6C77, + /* Array index: 0x0FCB */ 0x646D,0x687B, + /* Array index: 0x0FCB */ 0x646F,0x6C78, + /* Array index: 0x0FCB */ 0x6487,0x6871, + /* Array index: 0x0FCB */ 0x6488,0x6C7C, + /* Array index: 0x0FCB */ 0x6490,0x6C7D, + /* Array index: 0x0FCB */ 0x6492,0x6D25, + /* Array index: 0x0FCB */ 0x6493,0x6D22, + /* Array index: 0x0FCB */ 0x6495,0x6D23, + /* Array index: 0x0FCB */ 0x6499,0x6D2B, + /* Array index: 0x0FCB */ 0x649A,0x6D29, + /* Array index: 0x0FCB */ 0x649E,0x6C7A, + /* Array index: 0x0FCB */ 0x64A2,0x6D2C, + /* Array index: 0x0FCB */ 0x64A4,0x6874, + /* Array index: 0x0FCB */ 0x64A5,0x6D21, + /* Array index: 0x0FCB */ 0x64D2,0x7069, + /* Array index: 0x0FCB */ 0x64D4,0x706A, + /* Array index: 0x0FCB */ 0x64D8,0x7365, + /* Array index: 0x0FCB */ 0x64DA,0x7063, + /* Array index: 0x0FCB */ 0x64E0,0x7366, + /* Array index: 0x0FCB */ 0x64E2,0x736B, + /* Array index: 0x0FCB */ 0x64E6,0x7368, + /* Array index: 0x0FCB */ 0x64F7,0x764A, + /* Array index: 0x0FCB */ 0x64FA,0x7648, + /* Array index: 0x0FCB */ 0x64FB,0x7649, + /* Array index: 0x0FCB */ 0x64FE,0x7646, + /* Array index: 0x0FCB */ 0x6500,0x7838, + /* Array index: 0x0FCB */ 0x6506,0x7647, + /* Array index: 0x0FCB */ 0x650F,0x7839, + /* Array index: 0x0FCB */ 0x6514,0x796F, + /* Array index: 0x0FCB */ 0x6518,0x796E, + /* Array index: 0x0FCB */ 0x6519,0x7970, + /* Array index: 0x0FCB */ 0x651C,0x7A6D, + /* Array index: 0x0FCB */ 0x651D,0x7A6C, + /* Array index: 0x0FCB */ 0x6523,0x7C37, + /* Array index: 0x0FCB */ 0x6524,0x7B61, + /* Array index: 0x0FCB */ 0x652F,0x4545, + /* Array index: 0x0FCB */ 0x6536,0x482D, + /* Array index: 0x0FCB */ 0x6538,0x4A53, + /* Array index: 0x0FCB */ 0x6539,0x4A51, + /* Array index: 0x0FCB */ 0x653B,0x4A52, + /* Array index: 0x0FCB */ 0x653E,0x4D73, + /* Array index: 0x0FCB */ 0x653F,0x5149, + /* Array index: 0x0FCB */ 0x6545,0x514A, + /* Array index: 0x0FCB */ 0x6548,0x5566, + /* Array index: 0x0FCB */ 0x6549,0x5567, + /* Array index: 0x0FCB */ 0x654F,0x5A77, + /* Array index: 0x0FCB */ 0x6551,0x5A73, + /* Array index: 0x0FCB */ 0x655D,0x5A71, + /* Array index: 0x0FCB */ 0x655E,0x5F54, + /* Array index: 0x0FCB */ 0x6562,0x5F56, + /* Array index: 0x0FCB */ 0x6563,0x5F57, + /* Array index: 0x0FCB */ 0x6566,0x5F55, + /* Array index: 0x0FCB */ 0x656C,0x6439, + /* Array index: 0x0FCB */ 0x6572,0x687D, + /* Array index: 0x0FCB */ 0x6582,0x736D, + /* Array index: 0x0FCB */ 0x6583,0x736E, + /* Array index: 0x0FCB */ 0x6587,0x4546, + /* Array index: 0x0FCB */ 0x6590,0x5F59, + /* Array index: 0x0FCB */ 0x6591,0x5F58, + /* Array index: 0x0FCB */ 0x6595,0x7A6E, + /* Array index: 0x0FCB */ 0x6597,0x4547, + /* Array index: 0x0FCB */ 0x6599,0x5568, + /* Array index: 0x0FCB */ 0x659B,0x5A7C, + /* Array index: 0x0FCB */ 0x659C,0x5A7B, + /* Array index: 0x0FCB */ 0x659F,0x643A, + /* Array index: 0x0FCB */ 0x65A1,0x687E, + /* Array index: 0x0FCB */ 0x65A4,0x4548, + /* Array index: 0x0FCB */ 0x65A5,0x4658, + /* Array index: 0x0FCB */ 0x65A7,0x4D74, + /* Array index: 0x0FCB */ 0x65AB,0x514B, + /* Array index: 0x0FCB */ 0x65AC,0x5A7D, + /* Array index: 0x0FCB */ 0x65AF,0x5F5A, + /* Array index: 0x0FCB */ 0x65B0,0x643B, + /* Array index: 0x0FCB */ 0x65B7,0x764B, + /* Array index: 0x0FCB */ 0x65B9,0x4549, + /* Array index: 0x0FCB */ 0x65BC,0x4D75, + /* Array index: 0x0FCB */ 0x65BD,0x514C, + /* Array index: 0x0FCB */ 0x65C1,0x5569, + /* Array index: 0x0FCB */ 0x65C5,0x556A, + /* Array index: 0x0FCB */ 0x65D6,0x6922, + /* Array index: 0x0FCB */ 0x65D7,0x6921, + /* Array index: 0x0FCB */ 0x65E2,0x514D, + /* Array index: 0x0FCB */ 0x65F1,0x4A54, + /* Array index: 0x0FCB */ 0x65FA,0x4D76, + /* Array index: 0x0FCB */ 0x6600,0x4D7D, + /* Array index: 0x0FCB */ 0x6602,0x4D7B, + /* Array index: 0x0FCB */ 0x6606,0x4D7A, + /* Array index: 0x0FCB */ 0x6607,0x4E23, + /* Array index: 0x0FCB */ 0x660A,0x4E22, + /* Array index: 0x0FCB */ 0x660C,0x4D79, + /* Array index: 0x0FCB */ 0x660E,0x4D7C, + /* Array index: 0x0FCB */ 0x660F,0x4D7E, + /* Array index: 0x0FCB */ 0x661F,0x5153, + /* Array index: 0x0FCB */ 0x6620,0x5150, + /* Array index: 0x0FCB */ 0x662D,0x514F, + /* Array index: 0x0FCB */ 0x662F,0x5152, + /* Array index: 0x0FCB */ 0x6631,0x5155, + /* Array index: 0x0FCB */ 0x6649,0x556C, + /* Array index: 0x0FCB */ 0x664C,0x5570, + /* Array index: 0x0FCB */ 0x664F,0x556D, + /* Array index: 0x0FCB */ 0x6652,0x556F, + /* Array index: 0x0FCB */ 0x665A,0x5B25, + /* Array index: 0x0FCB */ 0x665D,0x5B24, + /* Array index: 0x0FCB */ 0x665E,0x5B29, + /* Array index: 0x0FCB */ 0x6664,0x5B26, + /* Array index: 0x0FCB */ 0x6666,0x5B28, + /* Array index: 0x0FCB */ 0x6668,0x5B27, + /* Array index: 0x0FCB */ 0x6674,0x5F5D, + /* Array index: 0x0FCB */ 0x6676,0x5F5E, + /* Array index: 0x0FCB */ 0x6677,0x5F63, + /* Array index: 0x0FCB */ 0x667A,0x5F61, + /* Array index: 0x0FCB */ 0x667E,0x5F62, + /* Array index: 0x0FCB */ 0x6684,0x6441, + /* Array index: 0x0FCB */ 0x668D,0x6443, + /* Array index: 0x0FCB */ 0x6691,0x5F60, + /* Array index: 0x0FCB */ 0x669D,0x6925, + /* Array index: 0x0FCB */ 0x66A2,0x6923, + /* Array index: 0x0FCB */ 0x66A8,0x6924, + /* Array index: 0x0FCB */ 0x66AB,0x6D32, + /* Array index: 0x0FCB */ 0x66AE,0x6D31, + /* Array index: 0x0FCB */ 0x66B1,0x6D34, + /* Array index: 0x0FCB */ 0x66B4,0x6D33, + /* Array index: 0x0FCB */ 0x66B8,0x7072, + /* Array index: 0x0FCB */ 0x66B9,0x706F, + /* Array index: 0x0FCB */ 0x66C4,0x7070, + /* Array index: 0x0FCB */ 0x66C6,0x706D, + /* Array index: 0x0FCB */ 0x66C7,0x7071, + /* Array index: 0x0FCB */ 0x66C9,0x706E, + /* Array index: 0x0FCB */ 0x66D6,0x7370, + /* Array index: 0x0FCB */ 0x66D9,0x736F, + /* Array index: 0x0FCB */ 0x66DC,0x764C, + /* Array index: 0x0FCB */ 0x66DD,0x783B, + /* Array index: 0x0FCB */ 0x66E0,0x783A, + /* Array index: 0x0FCB */ 0x66E6,0x7971, + /* Array index: 0x0FCB */ 0x66E9,0x7A6F, + /* Array index: 0x0FCB */ 0x66EC,0x7C3A, + /* Array index: 0x0FCB */ 0x6703,0x6444, + /* Array index: 0x0FCB */ 0x6708,0x454C, + /* Array index: 0x0FCB */ 0x6709,0x4834, + /* Array index: 0x0FCB */ 0x670B,0x4E25, + /* Array index: 0x0FCB */ 0x670D,0x4E24, + /* Array index: 0x0FCB */ 0x6714,0x5574, + /* Array index: 0x0FCB */ 0x6715,0x5575, + /* Array index: 0x0FCB */ 0x6717,0x5576, + /* Array index: 0x0FCB */ 0x671B,0x5B2C, + /* Array index: 0x0FCB */ 0x671D,0x5F67, + /* Array index: 0x0FCB */ 0x671F,0x5F66, + /* Array index: 0x0FCB */ 0x6731,0x4837, + /* Array index: 0x0FCB */ 0x6734,0x4836, + /* Array index: 0x0FCB */ 0x6735,0x4838, + /* Array index: 0x0FCB */ 0x673D,0x4835, + /* Array index: 0x0FCB */ 0x6746,0x4A5F, + /* Array index: 0x0FCB */ 0x6749,0x4A5E, + /* Array index: 0x0FCB */ 0x676A,0x4E3A, + /* Array index: 0x0FCB */ 0x677C,0x4E39, + /* Array index: 0x0FCB */ 0x677E,0x4E34, + /* Array index: 0x0FCB */ 0x677F,0x4E32, + /* Array index: 0x0FCB */ 0x6787,0x4E2D, + /* Array index: 0x0FCB */ 0x6789,0x4E33, + /* Array index: 0x0FCB */ 0x678B,0x4E27, + /* Array index: 0x0FCB */ 0x6790,0x4E35, + /* Array index: 0x0FCB */ 0x6793,0x4E38, + /* Array index: 0x0FCB */ 0x6795,0x4E28, + /* Array index: 0x0FCB */ 0x6797,0x4E2F, + /* Array index: 0x0FCB */ 0x679A,0x4E37, + /* Array index: 0x0FCB */ 0x679C,0x4E2A, + /* Array index: 0x0FCB */ 0x679D,0x4E2E, + /* Array index: 0x0FCB */ 0x67AF,0x515F, + /* Array index: 0x0FCB */ 0x67B0,0x516C, + /* Array index: 0x0FCB */ 0x67B4,0x5165, + /* Array index: 0x0FCB */ 0x67B6,0x515E, + /* Array index: 0x0FCB */ 0x67B8,0x5168, + /* Array index: 0x0FCB */ 0x67C4,0x5163, + /* Array index: 0x0FCB */ 0x67D9,0x516D, + /* Array index: 0x0FCB */ 0x67DA,0x5166, + /* Array index: 0x0FCB */ 0x67DD,0x516F, + /* Array index: 0x0FCB */ 0x67DE,0x516A, + /* Array index: 0x0FCB */ 0x67E2,0x516E, + /* Array index: 0x0FCB */ 0x67E5,0x5167, + /* Array index: 0x0FCB */ 0x67E9,0x5161, + /* Array index: 0x0FCB */ 0x67EC,0x515D, + /* Array index: 0x0FCB */ 0x67EF,0x5162, + /* Array index: 0x0FCB */ 0x67FF,0x5158, + /* Array index: 0x0FCB */ 0x6813,0x562E, + /* Array index: 0x0FCB */ 0x6817,0x5623, + /* Array index: 0x0FCB */ 0x6818,0x562F, + /* Array index: 0x0FCB */ 0x6821,0x5577, + /* Array index: 0x0FCB */ 0x6829,0x5621, + /* Array index: 0x0FCB */ 0x682A,0x562C, + /* Array index: 0x0FCB */ 0x6838,0x5578, + /* Array index: 0x0FCB */ 0x6839,0x557C, + /* Array index: 0x0FCB */ 0x684C,0x5624, + /* Array index: 0x0FCB */ 0x6876,0x5B33, + /* Array index: 0x0FCB */ 0x6893,0x5B30, + /* Array index: 0x0FCB */ 0x6894,0x5B3D, + /* Array index: 0x0FCB */ 0x6897,0x5B36, + /* Array index: 0x0FCB */ 0x689D,0x5B3E, + /* Array index: 0x0FCB */ 0x689F,0x5B40, + /* Array index: 0x0FCB */ 0x68A1,0x5B41, + /* Array index: 0x0FCB */ 0x68A2,0x5B2F, + /* Array index: 0x0FCB */ 0x68A7,0x5B35, + /* Array index: 0x0FCB */ 0x68A8,0x5B3F, + /* Array index: 0x0FCB */ 0x68C4,0x5B39, + /* Array index: 0x0FCB */ 0x68C9,0x5F7B, + /* Array index: 0x0FCB */ 0x68CB,0x5F76, + /* Array index: 0x0FCB */ 0x68CD,0x5F77, + /* Array index: 0x0FCB */ 0x68D2,0x5F73, + /* Array index: 0x0FCB */ 0x68D5,0x5F69, + /* Array index: 0x0FCB */ 0x68D7,0x5F6C, + /* Array index: 0x0FCB */ 0x68D8,0x5F6B, + /* Array index: 0x0FCB */ 0x68DA,0x5F7C, + /* Array index: 0x0FCB */ 0x68DF,0x5F6E, + /* Array index: 0x0FCB */ 0x68E0,0x5F6A, + /* Array index: 0x0FCB */ 0x68E3,0x5F75, + /* Array index: 0x0FCB */ 0x68E7,0x5F71, + /* Array index: 0x0FCB */ 0x68EE,0x5F70, + /* Array index: 0x0FCB */ 0x68F2,0x5F74, + /* Array index: 0x0FCB */ 0x68F5,0x5F6F, + /* Array index: 0x0FCB */ 0x6905,0x5F6D, + /* Array index: 0x0FCB */ 0x690D,0x5F78, + /* Array index: 0x0FCB */ 0x690E,0x5F7A, + /* Array index: 0x0FCB */ 0x6912,0x5F79, + /* Array index: 0x0FCB */ 0x6930,0x644C, + /* Array index: 0x0FCB */ 0x694A,0x644E, + /* Array index: 0x0FCB */ 0x6953,0x6452, + /* Array index: 0x0FCB */ 0x6954,0x644A, + /* Array index: 0x0FCB */ 0x6963,0x6456, + /* Array index: 0x0FCB */ 0x6968,0x644F, + /* Array index: 0x0FCB */ 0x696B,0x6450, + /* Array index: 0x0FCB */ 0x696D,0x6446, + /* Array index: 0x0FCB */ 0x696E,0x5F7D, + /* Array index: 0x0FCB */ 0x6975,0x644B, + /* Array index: 0x0FCB */ 0x6977,0x6448, + /* Array index: 0x0FCB */ 0x6979,0x6453, + /* Array index: 0x0FCB */ 0x6982,0x644D, + /* Array index: 0x0FCB */ 0x6986,0x6454, + /* Array index: 0x0FCB */ 0x6994,0x6445, + /* Array index: 0x0FCB */ 0x6995,0x6928, + /* Array index: 0x0FCB */ 0x699B,0x692D, + /* Array index: 0x0FCB */ 0x699C,0x6926, + /* Array index: 0x0FCB */ 0x69A3,0x6938, + /* Array index: 0x0FCB */ 0x69A6,0x6936, + /* Array index: 0x0FCB */ 0x69A8,0x6927, + /* Array index: 0x0FCB */ 0x69AB,0x6930, + /* Array index: 0x0FCB */ 0x69AD,0x6934, + /* Array index: 0x0FCB */ 0x69AE,0x692A, + /* Array index: 0x0FCB */ 0x69B4,0x6931, + /* Array index: 0x0FCB */ 0x69B7,0x692E, + /* Array index: 0x0FCB */ 0x69BB,0x692F, + /* Array index: 0x0FCB */ 0x69C1,0x6929, + /* Array index: 0x0FCB */ 0x69C3,0x6937, + /* Array index: 0x0FCB */ 0x69D0,0x6932, + /* Array index: 0x0FCB */ 0x69D3,0x692B, + /* Array index: 0x0FCB */ 0x69E8,0x6D37, + /* Array index: 0x0FCB */ 0x69ED,0x6D42, + /* Array index: 0x0FCB */ 0x69F3,0x6D3F, + /* Array index: 0x0FCB */ 0x69FD,0x6D3B, + /* Array index: 0x0FCB */ 0x6A01,0x6D38, + /* Array index: 0x0FCB */ 0x6A02,0x6D40, + /* Array index: 0x0FCB */ 0x6A05,0x6D41, + /* Array index: 0x0FCB */ 0x6A0A,0x6D3E, + /* Array index: 0x0FCB */ 0x6A11,0x6D43, + /* Array index: 0x0FCB */ 0x6A13,0x6D3D, + /* Array index: 0x0FCB */ 0x6A19,0x6D3A, + /* Array index: 0x0FCB */ 0x6A1E,0x6D39, + /* Array index: 0x0FCB */ 0x6A1F,0x6D36, + /* Array index: 0x0FCB */ 0x6A21,0x6D3C, + /* Array index: 0x0FCB */ 0x6A23,0x6D35, + /* Array index: 0x0FCB */ 0x6A35,0x7121, + /* Array index: 0x0FCB */ 0x6A3D,0x7073, + /* Array index: 0x0FCB */ 0x6A44,0x707A, + /* Array index: 0x0FCB */ 0x6A47,0x707E, + /* Array index: 0x0FCB */ 0x6A48,0x7123, + /* Array index: 0x0FCB */ 0x6A4B,0x707D, + /* Array index: 0x0FCB */ 0x6A58,0x7078, + /* Array index: 0x0FCB */ 0x6A59,0x7076, + /* Array index: 0x0FCB */ 0x6A5F,0x7122, + /* Array index: 0x0FCB */ 0x6A61,0x707C, + /* Array index: 0x0FCB */ 0x6A62,0x707B, + /* Array index: 0x0FCB */ 0x6A6B,0x7077, + /* Array index: 0x0FCB */ 0x6A7E,0x7378, + /* Array index: 0x0FCB */ 0x6A80,0x7371, + /* Array index: 0x0FCB */ 0x6A84,0x7373, + /* Array index: 0x0FCB */ 0x6A90,0x737A, + /* Array index: 0x0FCB */ 0x6A94,0x7372, + /* Array index: 0x0FCB */ 0x6A97,0x7379, + /* Array index: 0x0FCB */ 0x6A9C,0x7375, + /* Array index: 0x0FCB */ 0x6AA0,0x737B, + /* Array index: 0x0FCB */ 0x6AA2,0x7374, + /* Array index: 0x0FCB */ 0x6AA3,0x7377, + /* Array index: 0x0FCB */ 0x6AAC,0x764F, + /* Array index: 0x0FCB */ 0x6AAE,0x7654, + /* Array index: 0x0FCB */ 0x6AAF,0x7655, + /* Array index: 0x0FCB */ 0x6AB3,0x764E, + /* Array index: 0x0FCB */ 0x6AB8,0x7652, + /* Array index: 0x0FCB */ 0x6ABB,0x7651, + /* Array index: 0x0FCB */ 0x6AC2,0x7653, + /* Array index: 0x0FCB */ 0x6AC3,0x7650, + /* Array index: 0x0FCB */ 0x6AD3,0x783F, + /* Array index: 0x0FCB */ 0x6ADA,0x783E, + /* Array index: 0x0FCB */ 0x6ADB,0x7376, + /* Array index: 0x0FCB */ 0x6ADD,0x783D, + /* Array index: 0x0FCB */ 0x6AE5,0x783C, + /* Array index: 0x0FCB */ 0x6AEC,0x7973, + /* Array index: 0x0FCB */ 0x6AFA,0x7A72, + /* Array index: 0x0FCB */ 0x6AFB,0x7A70, + /* Array index: 0x0FCB */ 0x6B04,0x7A71, + /* Array index: 0x0FCB */ 0x6B0A,0x7B62, + /* Array index: 0x0FCB */ 0x6B10,0x7C3B, + /* Array index: 0x0FCB */ 0x6B16,0x7D23, + /* Array index: 0x0FCB */ 0x6B20,0x454E, + /* Array index: 0x0FCB */ 0x6B21,0x4839, + /* Array index: 0x0FCB */ 0x6B23,0x4E3C, + /* Array index: 0x0FCB */ 0x6B32,0x5B43, + /* Array index: 0x0FCB */ 0x6B3A,0x6022, + /* Array index: 0x0FCB */ 0x6B3D,0x6023, + /* Array index: 0x0FCB */ 0x6B3E,0x6021, + /* Array index: 0x0FCB */ 0x6B47,0x6458, + /* Array index: 0x0FCB */ 0x6B49,0x6939, + /* Array index: 0x0FCB */ 0x6B4C,0x693A, + /* Array index: 0x0FCB */ 0x6B4E,0x6D45, + /* Array index: 0x0FCB */ 0x6B50,0x6D44, + /* Array index: 0x0FCB */ 0x6B59,0x7124, + /* Array index: 0x0FCB */ 0x6B5C,0x737C, + /* Array index: 0x0FCB */ 0x6B6A,0x5171, + /* Array index: 0x0FCB */ 0x6B72,0x6459, + /* Array index: 0x0FCB */ 0x6B7F,0x4E3F, + /* Array index: 0x0FCB */ 0x6B83,0x5172, + /* Array index: 0x0FCB */ 0x6B86,0x5173, + /* Array index: 0x0FCB */ 0x6B89,0x5632, + /* Array index: 0x0FCB */ 0x6B8A,0x5631, + /* Array index: 0x0FCB */ 0x6B96,0x6025, + /* Array index: 0x0FCB */ 0x6B98,0x6024, + /* Array index: 0x0FCB */ 0x6BA4,0x6D46, + /* Array index: 0x0FCB */ 0x6BAE,0x737D, + /* Array index: 0x0FCB */ 0x6BAF,0x7658, + /* Array index: 0x0FCB */ 0x6BB2,0x7A73, + /* Array index: 0x0FCB */ 0x6BB5,0x5174, + /* Array index: 0x0FCB */ 0x6BB7,0x5633, + /* Array index: 0x0FCB */ 0x6BBA,0x5B44, + /* Array index: 0x0FCB */ 0x6BBC,0x6026, + /* Array index: 0x0FCB */ 0x6BBF,0x645B, + /* Array index: 0x0FCB */ 0x6BC0,0x645A, + /* Array index: 0x0FCB */ 0x6BC5,0x6D47, + /* Array index: 0x0FCB */ 0x6BC6,0x6D48, + /* Array index: 0x0FCB */ 0x6BCB,0x4551, + /* Array index: 0x0FCB */ 0x6BCD,0x4660, + /* Array index: 0x0FCB */ 0x6BCF,0x4A64, + /* Array index: 0x0FCB */ 0x6BD7,0x5176, + /* Array index: 0x0FCB */ 0x6BDA,0x737E, + /* Array index: 0x0FCB */ 0x6BDB,0x4553, + /* Array index: 0x0FCB */ 0x6BEB,0x5B45, + /* Array index: 0x0FCB */ 0x6BEC,0x5B46, + /* Array index: 0x0FCB */ 0x6BEF,0x6027, + /* Array index: 0x0FCB */ 0x6BFD,0x645D, + /* Array index: 0x0FCB */ 0x6C05,0x7126, + /* Array index: 0x0FCB */ 0x6C08,0x7421, + /* Array index: 0x0FCB */ 0x6C16,0x483C, + /* Array index: 0x0FCB */ 0x6C1B,0x4E41, + /* Array index: 0x0FCB */ 0x6C1F,0x5177, + /* Array index: 0x0FCB */ 0x6C33,0x693B, + /* Array index: 0x0FCB */ 0x6C34,0x4555, + /* Array index: 0x0FCB */ 0x6C38,0x4663, + /* Array index: 0x0FCB */ 0x6C4D,0x4846, + /* Array index: 0x0FCB */ 0x6C4E,0x4847, + /* Array index: 0x0FCB */ 0x6C50,0x4842, + /* Array index: 0x0FCB */ 0x6C55,0x4843, + /* Array index: 0x0FCB */ 0x6C57,0x483E, + /* Array index: 0x0FCB */ 0x6C59,0x483F, + /* Array index: 0x0FCB */ 0x6C68,0x4A72, + /* Array index: 0x0FCB */ 0x6C6A,0x4A6D, + /* Array index: 0x0FCB */ 0x6C70,0x4A70, + /* Array index: 0x0FCB */ 0x6C72,0x4A77, + /* Array index: 0x0FCB */ 0x6C74,0x4A79, + /* Array index: 0x0FCB */ 0x6C76,0x4A7B, + /* Array index: 0x0FCB */ 0x6C7A,0x4A6E, + /* Array index: 0x0FCB */ 0x6C90,0x4A6F, + /* Array index: 0x0FCB */ 0x6C92,0x4A74, + /* Array index: 0x0FCB */ 0x6C94,0x4A7D, + /* Array index: 0x0FCB */ 0x6C96,0x4A73, + /* Array index: 0x0FCB */ 0x6C98,0x4A7E, + /* Array index: 0x0FCB */ 0x6C99,0x4A67, + /* Array index: 0x0FCB */ 0x6C9B,0x4A6C, + /* Array index: 0x0FCB */ 0x6CAB,0x4E4D, + /* Array index: 0x0FCB */ 0x6CAC,0x4E5D, + /* Array index: 0x0FCB */ 0x6CAE,0x4E54, + /* Array index: 0x0FCB */ 0x6CB1,0x4E45, + /* Array index: 0x0FCB */ 0x6CB3,0x4E48, + /* Array index: 0x0FCB */ 0x6CC9,0x5178, + /* Array index: 0x0FCB */ 0x6CCA,0x4E5C, + /* Array index: 0x0FCB */ 0x6CCC,0x4E46, + /* Array index: 0x0FCB */ 0x6CDB,0x4E5B, + /* Array index: 0x0FCB */ 0x6CDC,0x4E5F, + /* Array index: 0x0FCB */ 0x6CE8,0x4E43, + /* Array index: 0x0FCB */ 0x6D0B,0x5179, + /* Array index: 0x0FCB */ 0x6D0C,0x517E, + /* Array index: 0x0FCB */ 0x6D0E,0x5230, + /* Array index: 0x0FCB */ 0x6D17,0x5223, + /* Array index: 0x0FCB */ 0x6D1B,0x5228, + /* Array index: 0x0FCB */ 0x6D1E,0x5222, + /* Array index: 0x0FCB */ 0x6D25,0x517D, + /* Array index: 0x0FCB */ 0x6D2E,0x522E, + /* Array index: 0x0FCB */ 0x6D31,0x5221, + /* Array index: 0x0FCB */ 0x6D32,0x517A, + /* Array index: 0x0FCB */ 0x6D41,0x517C, + /* Array index: 0x0FCB */ 0x6D59,0x5641, + /* Array index: 0x0FCB */ 0x6D5A,0x5646, + /* Array index: 0x0FCB */ 0x6D65,0x564D, + /* Array index: 0x0FCB */ 0x6D66,0x563E, + /* Array index: 0x0FCB */ 0x6D69,0x5648, + /* Array index: 0x0FCB */ 0x6D6A,0x563A, + /* Array index: 0x0FCB */ 0x6D6C,0x5643, + /* Array index: 0x0FCB */ 0x6D6E,0x5645, + /* Array index: 0x0FCB */ 0x6D74,0x5647, + /* Array index: 0x0FCB */ 0x6DAA,0x5B6A, + /* Array index: 0x0FCB */ 0x6DAE,0x5B57, + /* Array index: 0x0FCB */ 0x6DAF,0x5B55, + /* Array index: 0x0FCB */ 0x6DB2,0x5B4C, + /* Array index: 0x0FCB */ 0x6DB5,0x5B60, + /* Array index: 0x0FCB */ 0x6DB8,0x5B5A, + /* Array index: 0x0FCB */ 0x6DBC,0x5B49, + /* Array index: 0x0FCB */ 0x6DBF,0x5B6C, + /* Array index: 0x0FCB */ 0x6DCB,0x5B54, + /* Array index: 0x0FCB */ 0x6DCC,0x5B4E, + /* Array index: 0x0FCB */ 0x6DD1,0x5B56, + /* Array index: 0x0FCB */ 0x6DD2,0x5B5E, + /* Array index: 0x0FCB */ 0x6DDE,0x5B58, + /* Array index: 0x0FCB */ 0x6DE1,0x5B4D, + /* Array index: 0x0FCB */ 0x6DE4,0x5B4F, + /* Array index: 0x0FCB */ 0x6DE6,0x5B6D, + /* Array index: 0x0FCB */ 0x6DF1,0x5B65, + /* Array index: 0x0FCB */ 0x6DF3,0x5B4A, + /* Array index: 0x0FCB */ 0x6DF5,0x5B5C, + /* Array index: 0x0FCB */ 0x6E05,0x5B52, + /* Array index: 0x0FCB */ 0x6E2C,0x6041, + /* Array index: 0x0FCB */ 0x6E2D,0x603B, + /* Array index: 0x0FCB */ 0x6E2F,0x602B, + /* Array index: 0x0FCB */ 0x6E32,0x602F, + /* Array index: 0x0FCB */ 0x6E34,0x603E, + /* Array index: 0x0FCB */ 0x6E38,0x602C, + /* Array index: 0x0FCB */ 0x6E3A,0x6040, + /* Array index: 0x0FCB */ 0x6E3E,0x6044, + /* Array index: 0x0FCB */ 0x6E43,0x6042, + /* Array index: 0x0FCB */ 0x6E44,0x604A, + /* Array index: 0x0FCB */ 0x6E4A,0x6031, + /* Array index: 0x0FCB */ 0x6E4D,0x603F, + /* Array index: 0x0FCB */ 0x6E4E,0x6048, + /* Array index: 0x0FCB */ 0x6E54,0x602D, + /* Array index: 0x0FCB */ 0x6E56,0x6039, + /* Array index: 0x0FCB */ 0x6E58,0x6037, + /* Array index: 0x0FCB */ 0x6E5B,0x6036, + /* Array index: 0x0FCB */ 0x6E5F,0x604D, + /* Array index: 0x0FCB */ 0x6E63,0x6049, + /* Array index: 0x0FCB */ 0x6E67,0x6030, + /* Array index: 0x0FCB */ 0x6E69,0x604C, + /* Array index: 0x0FCB */ 0x6E6E,0x603A, + /* Array index: 0x0FCB */ 0x6E6F,0x603D, + /* Array index: 0x0FCB */ 0x6E72,0x604B, + /* Array index: 0x0FCB */ 0x6E89,0x6046, + /* Array index: 0x0FCB */ 0x6E90,0x6463, + /* Array index: 0x0FCB */ 0x6E96,0x646D, + /* Array index: 0x0FCB */ 0x6E98,0x6468, + /* Array index: 0x0FCB */ 0x6E9C,0x646E, + /* Array index: 0x0FCB */ 0x6E9D,0x6464, + /* Array index: 0x0FCB */ 0x6EA2,0x645E, + /* Array index: 0x0FCB */ 0x6EA5,0x6467, + /* Array index: 0x0FCB */ 0x6EA7,0x6472, + /* Array index: 0x0FCB */ 0x6EAA,0x6471, + /* Array index: 0x0FCB */ 0x6EAB,0x646B, + /* Array index: 0x0FCB */ 0x6EAF,0x645F, + /* Array index: 0x0FCB */ 0x6EB4,0x6473, + /* Array index: 0x0FCB */ 0x6EB6,0x6461, + /* Array index: 0x0FCB */ 0x6EBA,0x646A, + /* Array index: 0x0FCB */ 0x6EBC,0x6469, + /* Array index: 0x0FCB */ 0x6EC2,0x6462, + /* Array index: 0x0FCB */ 0x6EC4,0x646F, + /* Array index: 0x0FCB */ 0x6EC5,0x6466, + /* Array index: 0x0FCB */ 0x6EC7,0x6465, + /* Array index: 0x0FCB */ 0x6ECB,0x6045, + /* Array index: 0x0FCB */ 0x6ECC,0x6957, + /* Array index: 0x0FCB */ 0x6EEC,0x6954, + /* Array index: 0x0FCB */ 0x6EEF,0x6949, + /* Array index: 0x0FCB */ 0x6EF2,0x6956, + /* Array index: 0x0FCB */ 0x6EF4,0x6940, + /* Array index: 0x0FCB */ 0x6EF7,0x6958, + /* Array index: 0x0FCB */ 0x6F06,0x694A, + /* Array index: 0x0FCB */ 0x6F0F,0x6945, + /* Array index: 0x0FCB */ 0x6F20,0x6943, + /* Array index: 0x0FCB */ 0x6F22,0x6947, + /* Array index: 0x0FCB */ 0x6F23,0x694E, + /* Array index: 0x0FCB */ 0x6F38,0x694C, + /* Array index: 0x0FCB */ 0x6F3E,0x6942, + /* Array index: 0x0FCB */ 0x6F3F,0x6D49, + /* Array index: 0x0FCB */ 0x6F51,0x6D4C, + /* Array index: 0x0FCB */ 0x6F54,0x6D4E, + /* Array index: 0x0FCB */ 0x6F58,0x6D59, + /* Array index: 0x0FCB */ 0x6F5B,0x6D51, + /* Array index: 0x0FCB */ 0x6F5F,0x6D5D, + /* Array index: 0x0FCB */ 0x6F60,0x6D5C, + /* Array index: 0x0FCB */ 0x6F64,0x6D57, + /* Array index: 0x0FCB */ 0x6F66,0x6D4D, + /* Array index: 0x0FCB */ 0x6F78,0x6D52, + /* Array index: 0x0FCB */ 0x6F7A,0x6D55, + /* Array index: 0x0FCB */ 0x6F7C,0x6D4A, + /* Array index: 0x0FCB */ 0x6F80,0x742A, + /* Array index: 0x0FCB */ 0x6F84,0x6D4B, + /* Array index: 0x0FCB */ 0x6F86,0x6D4F, + /* Array index: 0x0FCB */ 0x6F88,0x6952, + /* Array index: 0x0FCB */ 0x6F8E,0x6D54, + /* Array index: 0x0FCB */ 0x6F97,0x6D58, + /* Array index: 0x0FCB */ 0x6FA0,0x7133, + /* Array index: 0x0FCB */ 0x6FA1,0x7129, + /* Array index: 0x0FCB */ 0x6FA4,0x712B, + /* Array index: 0x0FCB */ 0x6FA6,0x7132, + /* Array index: 0x0FCB */ 0x6FA7,0x712D, + /* Array index: 0x0FCB */ 0x6FB1,0x7128, + /* Array index: 0x0FCB */ 0x6FB3,0x712E, + /* Array index: 0x0FCB */ 0x6FB4,0x7134, + /* Array index: 0x0FCB */ 0x6FB6,0x7131, + /* Array index: 0x0FCB */ 0x6FB9,0x7130, + /* Array index: 0x0FCB */ 0x6FD5,0x742E, + /* Array index: 0x0FCB */ 0x6FD8,0x7422, + /* Array index: 0x0FCB */ 0x6FDB,0x7426, + /* Array index: 0x0FCB */ 0x6FE4,0x7427, + /* Array index: 0x0FCB */ 0x6FE9,0x742D, + /* Array index: 0x0FCB */ 0x6FFA,0x765D, + /* Array index: 0x0FCB */ 0x6FFE,0x765B, + /* Array index: 0x0FCB */ 0x7006,0x765C, + /* Array index: 0x0FCB */ 0x7009,0x7659, + /* Array index: 0x0FCB */ 0x700B,0x765A, + /* Array index: 0x0FCB */ 0x700F,0x765F, + /* Array index: 0x0FCB */ 0x7011,0x765E, + /* Array index: 0x0FCB */ 0x7015,0x7845, + /* Array index: 0x0FCB */ 0x7018,0x7846, + /* Array index: 0x0FCB */ 0x701A,0x7843, + /* Array index: 0x0FCB */ 0x701B,0x7840, + /* Array index: 0x0FCB */ 0x701D,0x7844, + /* Array index: 0x0FCB */ 0x701F,0x7841, + /* Array index: 0x0FCB */ 0x7028,0x7842, + /* Array index: 0x0FCB */ 0x7030,0x7975, + /* Array index: 0x0FCB */ 0x7032,0x7976, + /* Array index: 0x0FCB */ 0x703E,0x7974, + /* Array index: 0x0FCB */ 0x704C,0x7A74, + /* Array index: 0x0FCB */ 0x7051,0x7B64, + /* Array index: 0x0FCB */ 0x7058,0x7B65, + /* Array index: 0x0FCB */ 0x705E,0x7C60, + /* Array index: 0x0FCB */ 0x7063,0x7D24, + /* Array index: 0x0FCB */ 0x7064,0x7D32, + /* Array index: 0x0FCB */ 0x706B,0x4556, + /* Array index: 0x0FCB */ 0x7070,0x4848, + /* Array index: 0x0FCB */ 0x7076,0x4B22, + /* Array index: 0x0FCB */ 0x7078,0x4B25, + /* Array index: 0x0FCB */ 0x707C,0x4B23, + /* Array index: 0x0FCB */ 0x707D,0x4B24, + /* Array index: 0x0FCB */ 0x708A,0x4E65, + /* Array index: 0x0FCB */ 0x708E,0x4E63, + /* Array index: 0x0FCB */ 0x7092,0x4E64, + /* Array index: 0x0FCB */ 0x7095,0x4E62, + /* Array index: 0x0FCB */ 0x7099,0x4E66, + /* Array index: 0x0FCB */ 0x70A4,0x523A, + /* Array index: 0x0FCB */ 0x70B3,0x5234, + /* Array index: 0x0FCB */ 0x70B8,0x5238, + /* Array index: 0x0FCB */ 0x70BA,0x5233, + /* Array index: 0x0FCB */ 0x70C8,0x5653, + /* Array index: 0x0FCB */ 0x70CA,0x564F, + /* Array index: 0x0FCB */ 0x70CF,0x5654, + /* Array index: 0x0FCB */ 0x70D8,0x5650, + /* Array index: 0x0FCB */ 0x70D9,0x5652, + /* Array index: 0x0FCB */ 0x70E4,0x5651, + /* Array index: 0x0FCB */ 0x70EF,0x5B72, + /* Array index: 0x0FCB */ 0x70F9,0x5B6E, + /* Array index: 0x0FCB */ 0x70FD,0x5B71, + /* Array index: 0x0FCB */ 0x7109,0x5B6F, + /* Array index: 0x0FCB */ 0x710A,0x5B70, + /* Array index: 0x0FCB */ 0x7119,0x604E, + /* Array index: 0x0FCB */ 0x711A,0x604F, + /* Array index: 0x0FCB */ 0x711C,0x6055, + /* Array index: 0x0FCB */ 0x7121,0x6052, + /* Array index: 0x0FCB */ 0x7126,0x6050, + /* Array index: 0x0FCB */ 0x7130,0x6051, + /* Array index: 0x0FCB */ 0x7136,0x6053, + /* Array index: 0x0FCB */ 0x7146,0x6522, + /* Array index: 0x0FCB */ 0x7149,0x6478, + /* Array index: 0x0FCB */ 0x714C,0x647D, + /* Array index: 0x0FCB */ 0x714E,0x6474, + /* Array index: 0x0FCB */ 0x7156,0x6524, + /* Array index: 0x0FCB */ 0x7159,0x6475, + /* Array index: 0x0FCB */ 0x715C,0x647A, + /* Array index: 0x0FCB */ 0x715E,0x6521, + /* Array index: 0x0FCB */ 0x716C,0x647B, + /* Array index: 0x0FCB */ 0x716E,0x6054, + /* Array index: 0x0FCB */ 0x717D,0x695B, + /* Array index: 0x0FCB */ 0x7184,0x695D, + /* Array index: 0x0FCB */ 0x718A,0x695C, + /* Array index: 0x0FCB */ 0x7192,0x695E, + /* Array index: 0x0FCB */ 0x7194,0x6959, + /* Array index: 0x0FCB */ 0x7199,0x695A, + /* Array index: 0x0FCB */ 0x719F,0x6D5E, + /* Array index: 0x0FCB */ 0x71A8,0x6D61, + /* Array index: 0x0FCB */ 0x71AC,0x6D5F, + /* Array index: 0x0FCB */ 0x71B1,0x6D60, + /* Array index: 0x0FCB */ 0x71B9,0x713B, + /* Array index: 0x0FCB */ 0x71BE,0x7135, + /* Array index: 0x0FCB */ 0x71C3,0x713F, + /* Array index: 0x0FCB */ 0x71C4,0x7140, + /* Array index: 0x0FCB */ 0x71C8,0x7139, + /* Array index: 0x0FCB */ 0x71C9,0x7136, + /* Array index: 0x0FCB */ 0x71CE,0x713C, + /* Array index: 0x0FCB */ 0x71D0,0x7137, + /* Array index: 0x0FCB */ 0x71D2,0x7138, + /* Array index: 0x0FCB */ 0x71D5,0x713A, + /* Array index: 0x0FCB */ 0x71D9,0x713D, + /* Array index: 0x0FCB */ 0x71DC,0x713E, + /* Array index: 0x0FCB */ 0x71DF,0x7432, + /* Array index: 0x0FCB */ 0x71E0,0x7439, + /* Array index: 0x0FCB */ 0x71F4,0x7438, + /* Array index: 0x0FCB */ 0x71F8,0x7663, + /* Array index: 0x0FCB */ 0x71FB,0x7660, + /* Array index: 0x0FCB */ 0x71FC,0x7661, + /* Array index: 0x0FCB */ 0x71FE,0x7662, + /* Array index: 0x0FCB */ 0x7206,0x7847, + /* Array index: 0x0FCB */ 0x720D,0x7848, + /* Array index: 0x0FCB */ 0x7210,0x7977, + /* Array index: 0x0FCB */ 0x721B,0x7A75, + /* Array index: 0x0FCB */ 0x7228,0x7D46, + /* Array index: 0x0FCB */ 0x722A,0x4557, + /* Array index: 0x0FCB */ 0x722C,0x4E67, + /* Array index: 0x0FCB */ 0x722D,0x4E68, + /* Array index: 0x0FCB */ 0x7230,0x523B, + /* Array index: 0x0FCB */ 0x724C,0x6056, + /* Array index: 0x0FCB */ 0x7252,0x6526, + /* Array index: 0x0FCB */ 0x7256,0x6D62, + /* Array index: 0x0FCB */ 0x7258,0x7849, + /* Array index: 0x0FCB */ 0x7259,0x455B, + /* Array index: 0x0FCB */ 0x725B,0x455C, + /* Array index: 0x0FCB */ 0x7267,0x4E6B, + /* Array index: 0x0FCB */ 0x7269,0x4E6C, + /* Array index: 0x0FCB */ 0x726F,0x523D, + /* Array index: 0x0FCB */ 0x7272,0x523C, + /* Array index: 0x0FCB */ 0x7274,0x523E, + /* Array index: 0x0FCB */ 0x7279,0x5656, + /* Array index: 0x0FCB */ 0x727D,0x5B74, + /* Array index: 0x0FCB */ 0x7280,0x6058, + /* Array index: 0x0FCB */ 0x7281,0x5B75, + /* Array index: 0x0FCB */ 0x7284,0x6057, + /* Array index: 0x0FCB */ 0x7292,0x6960, + /* Array index: 0x0FCB */ 0x7296,0x6961, + /* Array index: 0x0FCB */ 0x729B,0x6D63, + /* Array index: 0x0FCB */ 0x72A2,0x784A, + /* Array index: 0x0FCB */ 0x72A7,0x7A76, + /* Array index: 0x0FCB */ 0x72AC,0x455D, + /* Array index: 0x0FCB */ 0x72AF,0x4667, + /* Array index: 0x0FCB */ 0x72C0,0x4E6D, + /* Array index: 0x0FCB */ 0x72C2,0x4B2A, + /* Array index: 0x0FCB */ 0x72C4,0x4B29, + /* Array index: 0x0FCB */ 0x72CE,0x4E6E, + /* Array index: 0x0FCB */ 0x72D0,0x4E71, + /* Array index: 0x0FCB */ 0x72D7,0x4E70, + /* Array index: 0x0FCB */ 0x72D9,0x4E6F, + /* Array index: 0x0FCB */ 0x72E0,0x5240, + /* Array index: 0x0FCB */ 0x72E1,0x5241, + /* Array index: 0x0FCB */ 0x72E9,0x523F, + /* Array index: 0x0FCB */ 0x7313,0x5B79, + /* Array index: 0x0FCB */ 0x7316,0x5B78, + /* Array index: 0x0FCB */ 0x7319,0x5B7A, + /* Array index: 0x0FCB */ 0x731B,0x5B77, + /* Array index: 0x0FCB */ 0x731C,0x5B76, + /* Array index: 0x0FCB */ 0x7325,0x605A, + /* Array index: 0x0FCB */ 0x7329,0x605C, + /* Array index: 0x0FCB */ 0x7334,0x605B, + /* Array index: 0x0FCB */ 0x7336,0x6059, + /* Array index: 0x0FCB */ 0x7337,0x6527, + /* Array index: 0x0FCB */ 0x733E,0x652A, + /* Array index: 0x0FCB */ 0x733F,0x6529, + /* Array index: 0x0FCB */ 0x7344,0x6962, + /* Array index: 0x0FCB */ 0x7345,0x6528, + /* Array index: 0x0FCB */ 0x734E,0x6D64, + /* Array index: 0x0FCB */ 0x7350,0x6963, + /* Array index: 0x0FCB */ 0x7357,0x6D65, + /* Array index: 0x0FCB */ 0x7368,0x7141, + /* Array index: 0x0FCB */ 0x7370,0x743C, + /* Array index: 0x0FCB */ 0x7372,0x743D, + /* Array index: 0x0FCB */ 0x7375,0x7665, + /* Array index: 0x0FCB */ 0x7380,0x7B66, + /* Array index: 0x0FCB */ 0x7384,0x4668, + /* Array index: 0x0FCB */ 0x7386,0x565C, + /* Array index: 0x0FCB */ 0x7387,0x5B7B, + /* Array index: 0x0FCB */ 0x7389,0x4669, + /* Array index: 0x0FCB */ 0x738B,0x455E, + /* Array index: 0x0FCB */ 0x7396,0x4B2B, + /* Array index: 0x0FCB */ 0x739F,0x4E74, + /* Array index: 0x0FCB */ 0x73A5,0x4E76, + /* Array index: 0x0FCB */ 0x73A8,0x4E73, + /* Array index: 0x0FCB */ 0x73A9,0x4E72, + /* Array index: 0x0FCB */ 0x73AB,0x4E75, + /* Array index: 0x0FCB */ 0x73B2,0x5245, + /* Array index: 0x0FCB */ 0x73B3,0x5248, + /* Array index: 0x0FCB */ 0x73B7,0x5242, + /* Array index: 0x0FCB */ 0x73BB,0x5244, + /* Array index: 0x0FCB */ 0x73C0,0x5247, + /* Array index: 0x0FCB */ 0x73CA,0x5243, + /* Array index: 0x0FCB */ 0x73CD,0x5246, + /* Array index: 0x0FCB */ 0x73DE,0x5662, + /* Array index: 0x0FCB */ 0x73E0,0x5660, + /* Array index: 0x0FCB */ 0x73EA,0x5661, + /* Array index: 0x0FCB */ 0x73ED,0x565D, + /* Array index: 0x0FCB */ 0x73EE,0x565F, + /* Array index: 0x0FCB */ 0x73FE,0x5C22, + /* Array index: 0x0FCB */ 0x7403,0x5B7E, + /* Array index: 0x0FCB */ 0x7405,0x5B7C, + /* Array index: 0x0FCB */ 0x7406,0x5C21, + /* Array index: 0x0FCB */ 0x7409,0x565E, + /* Array index: 0x0FCB */ 0x740A,0x5B7D, + /* Array index: 0x0FCB */ 0x740D,0x5C23, + /* Array index: 0x0FCB */ 0x741B,0x6066, + /* Array index: 0x0FCB */ 0x7422,0x6060, + /* Array index: 0x0FCB */ 0x7425,0x6061, + /* Array index: 0x0FCB */ 0x7426,0x6067, + /* Array index: 0x0FCB */ 0x7428,0x6068, + /* Array index: 0x0FCB */ 0x742A,0x605E, + /* Array index: 0x0FCB */ 0x742F,0x6065, + /* Array index: 0x0FCB */ 0x743A,0x605D, + /* Array index: 0x0FCB */ 0x743F,0x6531, + /* Array index: 0x0FCB */ 0x7441,0x6530, + /* Array index: 0x0FCB */ 0x7455,0x652D, + /* Array index: 0x0FCB */ 0x7463,0x6965, + /* Array index: 0x0FCB */ 0x7464,0x6964, + /* Array index: 0x0FCB */ 0x7469,0x6D66, + /* Array index: 0x0FCB */ 0x746A,0x6966, + /* Array index: 0x0FCB */ 0x746D,0x6968, + /* Array index: 0x0FCB */ 0x746F,0x652B, + /* Array index: 0x0FCB */ 0x7470,0x6967, + /* Array index: 0x0FCB */ 0x747E,0x6D69, + /* Array index: 0x0FCB */ 0x7480,0x6D6A, + /* Array index: 0x0FCB */ 0x7483,0x6D68, + /* Array index: 0x0FCB */ 0x748B,0x6D67, + /* Array index: 0x0FCB */ 0x7498,0x7144, + /* Array index: 0x0FCB */ 0x749C,0x7142, + /* Array index: 0x0FCB */ 0x749E,0x7146, + /* Array index: 0x0FCB */ 0x749F,0x7145, + /* Array index: 0x0FCB */ 0x74A3,0x7143, + /* Array index: 0x0FCB */ 0x74B0,0x743F, + /* Array index: 0x0FCB */ 0x74BD,0x784D, + /* Array index: 0x0FCB */ 0x74BF,0x7667, + /* Array index: 0x0FCB */ 0x74CA,0x784E, + /* Array index: 0x0FCB */ 0x74CF,0x7979, + /* Array index: 0x0FCB */ 0x74D4,0x7A78, + /* Array index: 0x0FCB */ 0x74D6,0x7A77, + /* Array index: 0x0FCB */ 0x74DA,0x7C3C, + /* Array index: 0x0FCB */ 0x74DC,0x466A, + /* Array index: 0x0FCB */ 0x74E9,0x2322, + /* Array index: 0x0FCB */ 0x74F6,0x5C25, + /* Array index: 0x0FCB */ 0x74F7,0x5C26, + /* Array index: 0x0FCB */ 0x7504,0x6969, + /* Array index: 0x0FCB */ 0x750C,0x7148, + /* Array index: 0x0FCB */ 0x750D,0x7149, + /* Array index: 0x0FCB */ 0x7515,0x7668, + /* Array index: 0x0FCB */ 0x7518,0x466C, + /* Array index: 0x0FCB */ 0x751A,0x5249, + /* Array index: 0x0FCB */ 0x751C,0x5C27, + /* Array index: 0x0FCB */ 0x751F,0x466D, + /* Array index: 0x0FCB */ 0x7522,0x5C28, + /* Array index: 0x0FCB */ 0x7537,0x4B2E, + /* Array index: 0x0FCB */ 0x7538,0x4B2F, + /* Array index: 0x0FCB */ 0x753D,0x4E77, + /* Array index: 0x0FCB */ 0x7554,0x5663, + /* Array index: 0x0FCB */ 0x7562,0x5C2B, + /* Array index: 0x0FCB */ 0x7565,0x5C29, + /* Array index: 0x0FCB */ 0x7566,0x5C2A, + /* Array index: 0x0FCB */ 0x756A,0x606C, + /* Array index: 0x0FCB */ 0x756B,0x606B, + /* Array index: 0x0FCB */ 0x7570,0x5C2C, + /* Array index: 0x0FCB */ 0x7576,0x6535, + /* Array index: 0x0FCB */ 0x7578,0x6536, + /* Array index: 0x0FCB */ 0x757F,0x6D6B, + /* Array index: 0x0FCB */ 0x7586,0x7851, + /* Array index: 0x0FCB */ 0x7587,0x7850, + /* Array index: 0x0FCB */ 0x758A,0x7B68, + /* Array index: 0x0FCB */ 0x758B,0x4674, + /* Array index: 0x0FCB */ 0x758F,0x5C2D, + /* Array index: 0x0FCB */ 0x7591,0x696A, + /* Array index: 0x0FCB */ 0x7599,0x4E79, + /* Array index: 0x0FCB */ 0x759A,0x4E7A, + /* Array index: 0x0FCB */ 0x759D,0x4E78, + /* Array index: 0x0FCB */ 0x75AB,0x524F, + /* Array index: 0x0FCB */ 0x75B2,0x566B, + /* Array index: 0x0FCB */ 0x75B3,0x566C, + /* Array index: 0x0FCB */ 0x75B5,0x5C30, + /* Array index: 0x0FCB */ 0x75C2,0x5670, + /* Array index: 0x0FCB */ 0x75C5,0x5669, + /* Array index: 0x0FCB */ 0x75C7,0x566A, + /* Array index: 0x0FCB */ 0x75CA,0x5C31, + /* Array index: 0x0FCB */ 0x75CD,0x5C32, + /* Array index: 0x0FCB */ 0x75D4,0x5C2E, + /* Array index: 0x0FCB */ 0x75D5,0x5C2F, + /* Array index: 0x0FCB */ 0x75D8,0x6071, + /* Array index: 0x0FCB */ 0x75D9,0x6070, + /* Array index: 0x0FCB */ 0x75DB,0x606E, + /* Array index: 0x0FCB */ 0x75DE,0x6072, + /* Array index: 0x0FCB */ 0x75E0,0x6073, + /* Array index: 0x0FCB */ 0x75E2,0x606D, + /* Array index: 0x0FCB */ 0x75E3,0x606F, + /* Array index: 0x0FCB */ 0x75FA,0x653C, + /* Array index: 0x0FCB */ 0x7609,0x696E, + /* Array index: 0x0FCB */ 0x760B,0x696D, + /* Array index: 0x0FCB */ 0x760D,0x696C, + /* Array index: 0x0FCB */ 0x7613,0x696F, + /* Array index: 0x0FCB */ 0x7634,0x714A, + /* Array index: 0x0FCB */ 0x7638,0x714B, + /* Array index: 0x0FCB */ 0x763A,0x714C, + /* Array index: 0x0FCB */ 0x7642,0x7443, + /* Array index: 0x0FCB */ 0x7646,0x7442, + /* Array index: 0x0FCB */ 0x764C,0x7444, + /* Array index: 0x0FCB */ 0x7652,0x766B, + /* Array index: 0x0FCB */ 0x7656,0x7669, + /* Array index: 0x0FCB */ 0x7658,0x766A, + /* Array index: 0x0FCB */ 0x765F,0x7852, + /* Array index: 0x0FCB */ 0x7661,0x7853, + /* Array index: 0x0FCB */ 0x7662,0x797A, + /* Array index: 0x0FCB */ 0x7665,0x797B, + /* Array index: 0x0FCB */ 0x7669,0x7A79, + /* Array index: 0x0FCB */ 0x766C,0x7B6A, + /* Array index: 0x0FCB */ 0x766E,0x7B69, + /* Array index: 0x0FCB */ 0x7671,0x7C61, + /* Array index: 0x0FCB */ 0x7672,0x7C62, + /* Array index: 0x0FCB */ 0x7678,0x5254, + /* Array index: 0x0FCB */ 0x7682,0x4B30, + /* Array index: 0x0FCB */ 0x768B,0x5672, + /* Array index: 0x0FCB */ 0x768E,0x5C33, + /* Array index: 0x0FCB */ 0x7693,0x6077, + /* Array index: 0x0FCB */ 0x7696,0x6076, + /* Array index: 0x0FCB */ 0x769A,0x6D73, + /* Array index: 0x0FCB */ 0x76AE,0x4676, + /* Array index: 0x0FCB */ 0x76B0,0x5673, + /* Array index: 0x0FCB */ 0x76B4,0x6078, + /* Array index: 0x0FCB */ 0x76BA,0x6D74, + /* Array index: 0x0FCB */ 0x76BF,0x4677, + /* Array index: 0x0FCB */ 0x76D2,0x5C35, + /* Array index: 0x0FCB */ 0x76D4,0x5C34, + /* Array index: 0x0FCB */ 0x76EA,0x7445, + /* Array index: 0x0FCB */ 0x76EE,0x4678, + /* Array index: 0x0FCB */ 0x76EF,0x4B31, + /* Array index: 0x0FCB */ 0x76F2,0x4E7D, + /* Array index: 0x0FCB */ 0x76F4,0x4E7E, + /* Array index: 0x0FCB */ 0x76F8,0x525E, + /* Array index: 0x0FCB */ 0x76F9,0x525D, + /* Array index: 0x0FCB */ 0x76FC,0x5262, + /* Array index: 0x0FCB */ 0x76FE,0x5261, + /* Array index: 0x0FCB */ 0x7701,0x525C, + /* Array index: 0x0FCB */ 0x7707,0x5263, + /* Array index: 0x0FCB */ 0x7709,0x525F, + /* Array index: 0x0FCB */ 0x770B,0x5260, + /* Array index: 0x0FCB */ 0x771F,0x5678, + /* Array index: 0x0FCB */ 0x7720,0x5679, + /* Array index: 0x0FCB */ 0x7728,0x567A, + /* Array index: 0x0FCB */ 0x7729,0x5677, + /* Array index: 0x0FCB */ 0x774F,0x607A, + /* Array index: 0x0FCB */ 0x775B,0x6542, + /* Array index: 0x0FCB */ 0x775C,0x654A, + /* Array index: 0x0FCB */ 0x775E,0x6545, + /* Array index: 0x0FCB */ 0x7779,0x6547, + /* Array index: 0x0FCB */ 0x777D,0x6973, + /* Array index: 0x0FCB */ 0x777F,0x6974, + /* Array index: 0x0FCB */ 0x7784,0x6972, + /* Array index: 0x0FCB */ 0x7787,0x6D77, + /* Array index: 0x0FCB */ 0x778B,0x6D7A, + /* Array index: 0x0FCB */ 0x778C,0x6D78, + /* Array index: 0x0FCB */ 0x778E,0x6D76, + /* Array index: 0x0FCB */ 0x7791,0x6D79, + /* Array index: 0x0FCB */ 0x77A5,0x7152, + /* Array index: 0x0FCB */ 0x77A7,0x744A, + /* Array index: 0x0FCB */ 0x77AA,0x7447, + /* Array index: 0x0FCB */ 0x77AC,0x7449, + /* Array index: 0x0FCB */ 0x77AD,0x744B, + /* Array index: 0x0FCB */ 0x77B0,0x7448, + /* Array index: 0x0FCB */ 0x77B3,0x7446, + /* Array index: 0x0FCB */ 0x77C7,0x7854, + /* Array index: 0x0FCB */ 0x77D3,0x7A7A, + /* Array index: 0x0FCB */ 0x77D7,0x7C63, + /* Array index: 0x0FCB */ 0x77E2,0x467A, + /* Array index: 0x0FCB */ 0x77E3,0x4B32, + /* Array index: 0x0FCB */ 0x77E5,0x4F21, + /* Array index: 0x0FCB */ 0x77E9,0x567B, + /* Array index: 0x0FCB */ 0x77F3,0x467B, + /* Array index: 0x0FCB */ 0x77FD,0x4F22, + /* Array index: 0x0FCB */ 0x7802,0x5265, + /* Array index: 0x0FCB */ 0x780C,0x5267, + /* Array index: 0x0FCB */ 0x780D,0x5268, + /* Array index: 0x0FCB */ 0x7814,0x5266, + /* Array index: 0x0FCB */ 0x781D,0x5721, + /* Array index: 0x0FCB */ 0x781F,0x5727, + /* Array index: 0x0FCB */ 0x7820,0x5726, + /* Array index: 0x0FCB */ 0x7825,0x5724, + /* Array index: 0x0FCB */ 0x7827,0x567D, + /* Array index: 0x0FCB */ 0x782D,0x5725, + /* Array index: 0x0FCB */ 0x7830,0x567C, + /* Array index: 0x0FCB */ 0x7832,0x5728, + /* Array index: 0x0FCB */ 0x7834,0x5722, + /* Array index: 0x0FCB */ 0x7837,0x5723, + /* Array index: 0x0FCB */ 0x7838,0x567E, + /* Array index: 0x0FCB */ 0x7843,0x5C3E, + /* Array index: 0x0FCB */ 0x784E,0x5C3F, + /* Array index: 0x0FCB */ 0x785D,0x607C, + /* Array index: 0x0FCB */ 0x786B,0x5C3D, + /* Array index: 0x0FCB */ 0x786C,0x607D, + /* Array index: 0x0FCB */ 0x786F,0x607E, + /* Array index: 0x0FCB */ 0x787C,0x6555, + /* Array index: 0x0FCB */ 0x787F,0x6558, + /* Array index: 0x0FCB */ 0x7889,0x6554, + /* Array index: 0x0FCB */ 0x788C,0x6553, + /* Array index: 0x0FCB */ 0x788E,0x654F, + /* Array index: 0x0FCB */ 0x7891,0x6556, + /* Array index: 0x0FCB */ 0x7893,0x6557, + /* Array index: 0x0FCB */ 0x7897,0x6551, + /* Array index: 0x0FCB */ 0x7898,0x6552, + /* Array index: 0x0FCB */ 0x789F,0x6977, + /* Array index: 0x0FCB */ 0x78A3,0x697B, + /* Array index: 0x0FCB */ 0x78A7,0x6978, + /* Array index: 0x0FCB */ 0x78A9,0x697A, + /* Array index: 0x0FCB */ 0x78B0,0x6550, + /* Array index: 0x0FCB */ 0x78B3,0x6979, + /* Array index: 0x0FCB */ 0x78BA,0x6D7D, + /* Array index: 0x0FCB */ 0x78BC,0x6E23, + /* Array index: 0x0FCB */ 0x78BE,0x6E21, + /* Array index: 0x0FCB */ 0x78C1,0x6976, + /* Array index: 0x0FCB */ 0x78C5,0x6D7C, + /* Array index: 0x0FCB */ 0x78CA,0x6D7E, + /* Array index: 0x0FCB */ 0x78CB,0x6D7B, + /* Array index: 0x0FCB */ 0x78D0,0x6E24, + /* Array index: 0x0FCB */ 0x78D5,0x6E22, + /* Array index: 0x0FCB */ 0x78DA,0x7154, + /* Array index: 0x0FCB */ 0x78E7,0x7156, + /* Array index: 0x0FCB */ 0x78E8,0x7153, + /* Array index: 0x0FCB */ 0x78EC,0x7155, + /* Array index: 0x0FCB */ 0x78EF,0x7450, + /* Array index: 0x0FCB */ 0x78F4,0x744F, + /* Array index: 0x0FCB */ 0x78F7,0x744D, + /* Array index: 0x0FCB */ 0x78FA,0x744E, + /* Array index: 0x0FCB */ 0x7901,0x7451, + /* Array index: 0x0FCB */ 0x790E,0x7670, + /* Array index: 0x0FCB */ 0x7919,0x7855, + /* Array index: 0x0FCB */ 0x7926,0x797C, + /* Array index: 0x0FCB */ 0x793A,0x467C, + /* Array index: 0x0FCB */ 0x793E,0x4F23, + /* Array index: 0x0FCB */ 0x7940,0x4F24, + /* Array index: 0x0FCB */ 0x7941,0x4F25, + /* Array index: 0x0FCB */ 0x7950,0x572A, + /* Array index: 0x0FCB */ 0x795A,0x5731, + /* Array index: 0x0FCB */ 0x7965,0x5C40, + /* Array index: 0x0FCB */ 0x7968,0x5C41, + /* Array index: 0x0FCB */ 0x796D,0x5C42, + /* Array index: 0x0FCB */ 0x797A,0x6559, + /* Array index: 0x0FCB */ 0x797F,0x655A, + /* Array index: 0x0FCB */ 0x7981,0x655B, + /* Array index: 0x0FCB */ 0x79A6,0x7157, + /* Array index: 0x0FCB */ 0x79A7,0x7452, + /* Array index: 0x0FCB */ 0x79AA,0x7453, + /* Array index: 0x0FCB */ 0x79AE,0x7671, + /* Array index: 0x0FCB */ 0x79B1,0x7856, + /* Array index: 0x0FCB */ 0x79B3,0x7B6B, + /* Array index: 0x0FCB */ 0x79C8,0x4F27, + /* Array index: 0x0FCB */ 0x79C9,0x4F26, + /* Array index: 0x0FCB */ 0x79CB,0x5271, + /* Array index: 0x0FCB */ 0x79D1,0x526F, + /* Array index: 0x0FCB */ 0x79D2,0x5270, + /* Array index: 0x0FCB */ 0x79D8,0x5738, + /* Array index: 0x0FCB */ 0x79DF,0x5735, + /* Array index: 0x0FCB */ 0x79FB,0x5C43, + /* Array index: 0x0FCB */ 0x7A00,0x6125, + /* Array index: 0x0FCB */ 0x7A05,0x6124, + /* Array index: 0x0FCB */ 0x7A08,0x6122, + /* Array index: 0x0FCB */ 0x7A0B,0x6123, + /* Array index: 0x0FCB */ 0x7A0D,0x6121, + /* Array index: 0x0FCB */ 0x7A14,0x6561, + /* Array index: 0x0FCB */ 0x7A1A,0x655F, + /* Array index: 0x0FCB */ 0x7A2E,0x6A21, + /* Array index: 0x0FCB */ 0x7A31,0x6A22, + /* Array index: 0x0FCB */ 0x7A37,0x6E29, + /* Array index: 0x0FCB */ 0x7A46,0x715A, + /* Array index: 0x0FCB */ 0x7A57,0x7454, + /* Array index: 0x0FCB */ 0x7A69,0x7858, + /* Array index: 0x0FCB */ 0x7A6B,0x7857, + /* Array index: 0x0FCB */ 0x7A74,0x467E, + /* Array index: 0x0FCB */ 0x7A76,0x4B36, + /* Array index: 0x0FCB */ 0x7A79,0x4F29, + /* Array index: 0x0FCB */ 0x7A7A,0x4F28, + /* Array index: 0x0FCB */ 0x7A7F,0x5272, + /* Array index: 0x0FCB */ 0x7A81,0x5273, + /* Array index: 0x0FCB */ 0x7A84,0x5739, + /* Array index: 0x0FCB */ 0x7A88,0x573A, + /* Array index: 0x0FCB */ 0x7A92,0x5C44, + /* Array index: 0x0FCB */ 0x7A9F,0x6564, + /* Array index: 0x0FCB */ 0x7AA0,0x6565, + /* Array index: 0x0FCB */ 0x7AA9,0x6A24, + /* Array index: 0x0FCB */ 0x7AAA,0x6A23, + /* Array index: 0x0FCB */ 0x7AAE,0x6E2C, + /* Array index: 0x0FCB */ 0x7AAF,0x6E2B, + /* Array index: 0x0FCB */ 0x7ABA,0x715D, + /* Array index: 0x0FCB */ 0x7ABF,0x7455, + /* Array index: 0x0FCB */ 0x7AC4,0x7675, + /* Array index: 0x0FCB */ 0x7AC5,0x7676, + /* Array index: 0x0FCB */ 0x7AC7,0x7A22, + /* Array index: 0x0FCB */ 0x7ACA,0x7C3D, + /* Array index: 0x0FCB */ 0x7ACB,0x4721, + /* Array index: 0x0FCB */ 0x7AD9,0x573B, + /* Array index: 0x0FCB */ 0x7ADF,0x5D7E, + /* Array index: 0x0FCB */ 0x7AE0,0x5D7D, + /* Array index: 0x0FCB */ 0x7AE3,0x612A, + /* Array index: 0x0FCB */ 0x7AE5,0x6129, + /* Array index: 0x0FCB */ 0x7AED,0x6A25, + /* Array index: 0x0FCB */ 0x7AEF,0x6A26, + /* Array index: 0x0FCB */ 0x7AF6,0x7A23, + /* Array index: 0x0FCB */ 0x7AF9,0x484C, + /* Array index: 0x0FCB */ 0x7AFA,0x4F2A, + /* Array index: 0x0FCB */ 0x7AFD,0x5275, + /* Array index: 0x0FCB */ 0x7AFF,0x5274, + /* Array index: 0x0FCB */ 0x7B06,0x573C, + /* Array index: 0x0FCB */ 0x7B11,0x573D, + /* Array index: 0x0FCB */ 0x7B19,0x5C4B, + /* Array index: 0x0FCB */ 0x7B1B,0x5C48, + /* Array index: 0x0FCB */ 0x7B1E,0x5C4C, + /* Array index: 0x0FCB */ 0x7B20,0x5C46, + /* Array index: 0x0FCB */ 0x7B26,0x5C4A, + /* Array index: 0x0FCB */ 0x7B28,0x5C47, + /* Array index: 0x0FCB */ 0x7B2C,0x5C49, + /* Array index: 0x0FCB */ 0x7B2E,0x5C4D, + /* Array index: 0x0FCB */ 0x7B46,0x612D, + /* Array index: 0x0FCB */ 0x7B49,0x612B, + /* Array index: 0x0FCB */ 0x7B4B,0x6132, + /* Array index: 0x0FCB */ 0x7B60,0x6568, + /* Array index: 0x0FCB */ 0x7B67,0x656A, + /* Array index: 0x0FCB */ 0x7B6E,0x6569, + /* Array index: 0x0FCB */ 0x7B75,0x6A2A, + /* Array index: 0x0FCB */ 0x7B77,0x6566, + /* Array index: 0x0FCB */ 0x7B84,0x6A31, + /* Array index: 0x0FCB */ 0x7B87,0x6A30, + /* Array index: 0x0FCB */ 0x7B8B,0x6A29, + /* Array index: 0x0FCB */ 0x7B8F,0x6A2E, + /* Array index: 0x0FCB */ 0x7B94,0x6A2D, + /* Array index: 0x0FCB */ 0x7B95,0x6A28, + /* Array index: 0x0FCB */ 0x7B97,0x6A2B, + /* Array index: 0x0FCB */ 0x7B9D,0x6A2C, + /* Array index: 0x0FCB */ 0x7BA0,0x6E34, + /* Array index: 0x0FCB */ 0x7BA1,0x6A27, + /* Array index: 0x0FCB */ 0x7BAD,0x6E2D, + /* Array index: 0x0FCB */ 0x7BB1,0x6E2E, + /* Array index: 0x0FCB */ 0x7BB4,0x6E30, + /* Array index: 0x0FCB */ 0x7BB8,0x6A2F, + /* Array index: 0x0FCB */ 0x7BC0,0x6567, + /* Array index: 0x0FCB */ 0x7BC1,0x6E33, + /* Array index: 0x0FCB */ 0x7BC4,0x6E2F, + /* Array index: 0x0FCB */ 0x7BC6,0x6E31, + /* Array index: 0x0FCB */ 0x7BC7,0x6E32, + /* Array index: 0x0FCB */ 0x7BC9,0x7160, + /* Array index: 0x0FCB */ 0x7BCC,0x6E35, + /* Array index: 0x0FCB */ 0x7BD9,0x715E, + /* Array index: 0x0FCB */ 0x7BDB,0x7162, + /* Array index: 0x0FCB */ 0x7BE0,0x745B, + /* Array index: 0x0FCB */ 0x7BE1,0x7163, + /* Array index: 0x0FCB */ 0x7BE4,0x7161, + /* Array index: 0x0FCB */ 0x7BE6,0x7165, + /* Array index: 0x0FCB */ 0x7BE9,0x7164, + /* Array index: 0x0FCB */ 0x7BF7,0x7459, + /* Array index: 0x0FCB */ 0x7BFE,0x7458, + /* Array index: 0x0FCB */ 0x7C07,0x7456, + /* Array index: 0x0FCB */ 0x7C0C,0x745A, + /* Array index: 0x0FCB */ 0x7C0D,0x7457, + /* Array index: 0x0FCB */ 0x7C11,0x715F, + /* Array index: 0x0FCB */ 0x7C1E,0x767A, + /* Array index: 0x0FCB */ 0x7C21,0x767C, + /* Array index: 0x0FCB */ 0x7C23,0x767B, + /* Array index: 0x0FCB */ 0x7C27,0x7678, + /* Array index: 0x0FCB */ 0x7C2A,0x7679, + /* Array index: 0x0FCB */ 0x7C2B,0x7677, + /* Array index: 0x0FCB */ 0x7C37,0x785D, + /* Array index: 0x0FCB */ 0x7C38,0x785B, + /* Array index: 0x0FCB */ 0x7C43,0x7A25, + /* Array index: 0x0FCB */ 0x7C4C,0x7A24, + /* Array index: 0x0FCB */ 0x7C4D,0x7A26, + /* Array index: 0x0FCB */ 0x7C50,0x7A7B, + /* Array index: 0x0FCB */ 0x7C6C,0x7D25, + /* Array index: 0x0FCB */ 0x7C6E,0x7D26, + /* Array index: 0x0FCB */ 0x7C72,0x7D4B, + /* Array index: 0x0FCB */ 0x7C73,0x484D, + /* Array index: 0x0FCB */ 0x7C7D,0x5276, + /* Array index: 0x0FCB */ 0x7C89,0x573E, + /* Array index: 0x0FCB */ 0x7C92,0x5C4E, + /* Array index: 0x0FCB */ 0x7C95,0x5C50, + /* Array index: 0x0FCB */ 0x7C97,0x5C4F, + /* Array index: 0x0FCB */ 0x7C9F,0x6135, + /* Array index: 0x0FCB */ 0x7CA5,0x6136, + /* Array index: 0x0FCB */ 0x7CB1,0x656B, + /* Array index: 0x0FCB */ 0x7CB3,0x656C, + /* Array index: 0x0FCB */ 0x7CB5,0x656D, + /* Array index: 0x0FCB */ 0x7CB9,0x6A32, + /* Array index: 0x0FCB */ 0x7CBD,0x6A33, + /* Array index: 0x0FCB */ 0x7CBE,0x6A34, + /* Array index: 0x0FCB */ 0x7CCA,0x6E36, + /* Array index: 0x0FCB */ 0x7CCE,0x2323, + /* Array index: 0x0FCB */ 0x7CD5,0x7166, + /* Array index: 0x0FCB */ 0x7CD6,0x7167, + /* Array index: 0x0FCB */ 0x7CD9,0x7461, + /* Array index: 0x0FCB */ 0x7CE7,0x767D, + /* Array index: 0x0FCB */ 0x7CEF,0x7A27, + /* Array index: 0x0FCB */ 0x7CF0,0x7A28, + /* Array index: 0x0FCB */ 0x7CF8,0x484E, + /* Array index: 0x0FCB */ 0x7CFB,0x4B37, + /* Array index: 0x0FCB */ 0x7CFE,0x4F2B, + /* Array index: 0x0FCB */ 0x7D00,0x5279, + /* Array index: 0x0FCB */ 0x7D10,0x5746, + /* Array index: 0x0FCB */ 0x7D14,0x5745, + /* Array index: 0x0FCB */ 0x7D15,0x5747, + /* Array index: 0x0FCB */ 0x7D2B,0x613B, + /* Array index: 0x0FCB */ 0x7D39,0x5C55, + /* Array index: 0x0FCB */ 0x7D3C,0x5C56, + /* Array index: 0x0FCB */ 0x7D50,0x6138, + /* Array index: 0x0FCB */ 0x7D55,0x613A, + /* Array index: 0x0FCB */ 0x7D5B,0x6573, + /* Array index: 0x0FCB */ 0x7D5E,0x6137, + /* Array index: 0x0FCB */ 0x7D61,0x613E, + /* Array index: 0x0FCB */ 0x7D62,0x6140, + /* Array index: 0x0FCB */ 0x7D66,0x613F, + /* Array index: 0x0FCB */ 0x7D68,0x6139, + /* Array index: 0x0FCB */ 0x7D79,0x656F, + /* Array index: 0x0FCB */ 0x7D81,0x6571, + /* Array index: 0x0FCB */ 0x7D8F,0x6572, + /* Array index: 0x0FCB */ 0x7D91,0x6570, + /* Array index: 0x0FCB */ 0x7D93,0x656E, + /* Array index: 0x0FCB */ 0x7D9C,0x6A37, + /* Array index: 0x0FCB */ 0x7D9E,0x6E43, + /* Array index: 0x0FCB */ 0x7DA0,0x6A3A, + /* Array index: 0x0FCB */ 0x7DA2,0x6A40, + /* Array index: 0x0FCB */ 0x7DB8,0x6A43, + /* Array index: 0x0FCB */ 0x7DC7,0x6A46, + /* Array index: 0x0FCB */ 0x7DCA,0x6A3B, + /* Array index: 0x0FCB */ 0x7DD2,0x6A45, + /* Array index: 0x0FCB */ 0x7DE3,0x6E3F, + /* Array index: 0x0FCB */ 0x7DE8,0x6E3E, + /* Array index: 0x0FCB */ 0x7DE9,0x6E42, + /* Array index: 0x0FCB */ 0x7DEC,0x6E3C, + /* Array index: 0x0FCB */ 0x7DEF,0x6E39, + /* Array index: 0x0FCB */ 0x7DF2,0x6E45, + /* Array index: 0x0FCB */ 0x7DF4,0x6E38, + /* Array index: 0x0FCB */ 0x7DF9,0x6E46, + /* Array index: 0x0FCB */ 0x7DFB,0x6E3A, + /* Array index: 0x0FCB */ 0x7E10,0x7170, + /* Array index: 0x0FCB */ 0x7E11,0x7169, + /* Array index: 0x0FCB */ 0x7E1B,0x716B, + /* Array index: 0x0FCB */ 0x7E1D,0x716E, + /* Array index: 0x0FCB */ 0x7E1E,0x716D, + /* Array index: 0x0FCB */ 0x7E23,0x716C, + /* Array index: 0x0FCB */ 0x7E2B,0x7469, + /* Array index: 0x0FCB */ 0x7E52,0x7725, + /* Array index: 0x0FCB */ 0x7E54,0x767E, + /* Array index: 0x0FCB */ 0x7E55,0x7721, + /* Array index: 0x0FCB */ 0x7E59,0x7726, + /* Array index: 0x0FCB */ 0x7E5A,0x7723, + /* Array index: 0x0FCB */ 0x7E5E,0x7722, + /* Array index: 0x0FCB */ 0x7E61,0x7724, + /* Array index: 0x0FCB */ 0x7E73,0x7864, + /* Array index: 0x0FCB */ 0x7E79,0x7861, + /* Array index: 0x0FCB */ 0x7E7C,0x7A2B, + /* Array index: 0x0FCB */ 0x7E7D,0x7A2A, + /* Array index: 0x0FCB */ 0x7E82,0x7A2C, + /* Array index: 0x0FCB */ 0x7E8C,0x7A7D, + /* Array index: 0x0FCB */ 0x7E8F,0x7A7C, + /* Array index: 0x0FCB */ 0x7E93,0x7C41, + /* Array index: 0x0FCB */ 0x7E94,0x7C43, + /* Array index: 0x0FCB */ 0x7E96,0x7C42, + /* Array index: 0x0FCB */ 0x7E9C,0x7D39, + /* Array index: 0x0FCB */ 0x7F36,0x484F, + /* Array index: 0x0FCB */ 0x7F38,0x527E, + /* Array index: 0x0FCB */ 0x7F3A,0x574D, + /* Array index: 0x0FCB */ 0x7F3D,0x5C5F, + /* Array index: 0x0FCB */ 0x7F44,0x7474, + /* Array index: 0x0FCB */ 0x7F48,0x7727, + /* Array index: 0x0FCB */ 0x7F4C,0x7A2D, + /* Array index: 0x0FCB */ 0x7F50,0x7C64, + /* Array index: 0x0FCB */ 0x7F54,0x4F2C, + /* Array index: 0x0FCB */ 0x7F55,0x4B38, + /* Array index: 0x0FCB */ 0x7F5F,0x574E, + /* Array index: 0x0FCB */ 0x7F69,0x6575, + /* Array index: 0x0FCB */ 0x7F6A,0x6576, + /* Array index: 0x0FCB */ 0x7F6E,0x6574, + /* Array index: 0x0FCB */ 0x7F70,0x6A48, + /* Array index: 0x0FCB */ 0x7F72,0x6577, + /* Array index: 0x0FCB */ 0x7F75,0x6E47, + /* Array index: 0x0FCB */ 0x7F77,0x6E48, + /* Array index: 0x0FCB */ 0x7F79,0x7171, + /* Array index: 0x0FCB */ 0x7F85,0x7865, + /* Array index: 0x0FCB */ 0x7F94,0x574F, + /* Array index: 0x0FCB */ 0x7F9A,0x5C61, + /* Array index: 0x0FCB */ 0x7F9E,0x5C60, + /* Array index: 0x0FCB */ 0x7FA4,0x657A, + /* Array index: 0x0FCB */ 0x7FA8,0x6579, + /* Array index: 0x0FCB */ 0x7FA9,0x6578, + /* Array index: 0x0FCB */ 0x7FAF,0x6E49, + /* Array index: 0x0FCB */ 0x7FB2,0x7172, + /* Array index: 0x0FCB */ 0x7FB6,0x7866, + /* Array index: 0x0FCB */ 0x7FB8,0x7868, + /* Array index: 0x0FCB */ 0x7FB9,0x7867, + /* Array index: 0x0FCB */ 0x7FBC,0x7A7E, + /* Array index: 0x0FCB */ 0x7FBD,0x4851, + /* Array index: 0x0FCB */ 0x7FBF,0x5322, + /* Array index: 0x0FCB */ 0x7FC1,0x5751, + /* Array index: 0x0FCB */ 0x7FC5,0x5750, + /* Array index: 0x0FCB */ 0x7FCC,0x5C62, + /* Array index: 0x0FCB */ 0x7FCE,0x5C63, + /* Array index: 0x0FCB */ 0x7FD2,0x5C64, + /* Array index: 0x0FCB */ 0x7FD4,0x6144, + /* Array index: 0x0FCB */ 0x7FD5,0x6145, + /* Array index: 0x0FCB */ 0x7FE9,0x6E4A, + /* Array index: 0x0FCB */ 0x7FEE,0x7175, + /* Array index: 0x0FCB */ 0x7FF0,0x7173, + /* Array index: 0x0FCB */ 0x7FF1,0x7174, + /* Array index: 0x0FCB */ 0x7FF3,0x7475, + /* Array index: 0x0FCB */ 0x7FF9,0x7728, + /* Array index: 0x0FCB */ 0x7FFB,0x7729, + /* Array index: 0x0FCB */ 0x7FFC,0x7476, + /* Array index: 0x0FCB */ 0x801C,0x5C65, + /* Array index: 0x0FCB */ 0x8026,0x6E4B, + /* Array index: 0x0FCB */ 0x8028,0x7176, + /* Array index: 0x0FCB */ 0x8033,0x4856, + /* Array index: 0x0FCB */ 0x8036,0x5326, + /* Array index: 0x0FCB */ 0x803D,0x5758, + /* Array index: 0x0FCB */ 0x803F,0x5759, + /* Array index: 0x0FCB */ 0x8046,0x5C67, + /* Array index: 0x0FCB */ 0x804A,0x5C66, + /* Array index: 0x0FCB */ 0x8052,0x6147, + /* Array index: 0x0FCB */ 0x8056,0x657B, + /* Array index: 0x0FCB */ 0x8058,0x657C, + /* Array index: 0x0FCB */ 0x805A,0x6A4D, + /* Array index: 0x0FCB */ 0x805E,0x6A4C, + /* Array index: 0x0FCB */ 0x8093,0x4B3A, + /* Array index: 0x0FCB */ 0x8096,0x4B39, + /* Array index: 0x0FCB */ 0x8098,0x4B3C, + /* Array index: 0x0FCB */ 0x809A,0x4B3E, + /* Array index: 0x0FCB */ 0x809B,0x4B3D, + /* Array index: 0x0FCB */ 0x809D,0x4B3B, + /* Array index: 0x0FCB */ 0x80A1,0x4F34, + /* Array index: 0x0FCB */ 0x80A2,0x4F32, + /* Array index: 0x0FCB */ 0x80A5,0x4F31, + /* Array index: 0x0FCB */ 0x80AF,0x4F39, + /* Array index: 0x0FCB */ 0x80B1,0x4F33, + /* Array index: 0x0FCB */ 0x80B2,0x4B3F, + /* Array index: 0x0FCB */ 0x80B4,0x4F37, + /* Array index: 0x0FCB */ 0x80BA,0x4F30, + /* Array index: 0x0FCB */ 0x80C3,0x532A, + /* Array index: 0x0FCB */ 0x80C4,0x532B, + /* Array index: 0x0FCB */ 0x80CC,0x532C, + /* Array index: 0x0FCB */ 0x80CE,0x532F, + /* Array index: 0x0FCB */ 0x80D6,0x5327, + /* Array index: 0x0FCB */ 0x80E1,0x532D, + /* Array index: 0x0FCB */ 0x80E4,0x5331, + /* Array index: 0x0FCB */ 0x80E5,0x5328, + /* Array index: 0x0FCB */ 0x80F8,0x5761, + /* Array index: 0x0FCB */ 0x80FC,0x5766, + /* Array index: 0x0FCB */ 0x80FD,0x5764, + /* Array index: 0x0FCB */ 0x8102,0x575B, + /* Array index: 0x0FCB */ 0x8105,0x575D, + /* Array index: 0x0FCB */ 0x8106,0x5760, + /* Array index: 0x0FCB */ 0x8108,0x5763, + /* Array index: 0x0FCB */ 0x810A,0x5765, + /* Array index: 0x0FCB */ 0x8116,0x5C69, + /* Array index: 0x0FCB */ 0x8123,0x5C6A, + /* Array index: 0x0FCB */ 0x8124,0x5C6E, + /* Array index: 0x0FCB */ 0x8129,0x5C6C, + /* Array index: 0x0FCB */ 0x812B,0x5C6B, + /* Array index: 0x0FCB */ 0x812F,0x5C68, + /* Array index: 0x0FCB */ 0x8130,0x5C6D, + /* Array index: 0x0FCB */ 0x8139,0x614E, + /* Array index: 0x0FCB */ 0x813E,0x6150, + /* Array index: 0x0FCB */ 0x8146,0x614F, + /* Array index: 0x0FCB */ 0x814B,0x614B, + /* Array index: 0x0FCB */ 0x814C,0x6151, + /* Array index: 0x0FCB */ 0x814E,0x614D, + /* Array index: 0x0FCB */ 0x8165,0x6624, + /* Array index: 0x0FCB */ 0x8166,0x662A, + /* Array index: 0x0FCB */ 0x816B,0x6627, + /* Array index: 0x0FCB */ 0x816E,0x6625, + /* Array index: 0x0FCB */ 0x817F,0x6A54, + /* Array index: 0x0FCB */ 0x8180,0x6A50, + /* Array index: 0x0FCB */ 0x8182,0x6A55, + /* Array index: 0x0FCB */ 0x8188,0x6A52, + /* Array index: 0x0FCB */ 0x818A,0x6A53, + /* Array index: 0x0FCB */ 0x818F,0x6A51, + /* Array index: 0x0FCB */ 0x81A0,0x6E4F, + /* Array index: 0x0FCB */ 0x81A8,0x7179, + /* Array index: 0x0FCB */ 0x81A9,0x7178, + /* Array index: 0x0FCB */ 0x81B3,0x7177, + /* Array index: 0x0FCB */ 0x81BA,0x747E, + /* Array index: 0x0FCB */ 0x81C6,0x747C, + /* Array index: 0x0FCB */ 0x81C9,0x7525, + /* Array index: 0x0FCB */ 0x81CD,0x772C, + /* Array index: 0x0FCB */ 0x81CF,0x772D, + /* Array index: 0x0FCB */ 0x81D8,0x7869, + /* Array index: 0x0FCB */ 0x81DA,0x7A2F, + /* Array index: 0x0FCB */ 0x81DF,0x7B70, + /* Array index: 0x0FCB */ 0x81E2,0x7C44, + /* Array index: 0x0FCB */ 0x81E3,0x485B, + /* Array index: 0x0FCB */ 0x81E5,0x4F3A, + /* Array index: 0x0FCB */ 0x81E7,0x6A56, + /* Array index: 0x0FCB */ 0x81E8,0x7527, + /* Array index: 0x0FCB */ 0x81EA,0x485C, + /* Array index: 0x0FCB */ 0x81EC,0x5769, + /* Array index: 0x0FCB */ 0x81ED,0x5768, + /* Array index: 0x0FCB */ 0x81F3,0x485D, + /* Array index: 0x0FCB */ 0x81F4,0x5333, + /* Array index: 0x0FCB */ 0x8210,0x576B, + /* Array index: 0x0FCB */ 0x8212,0x6154, + /* Array index: 0x0FCB */ 0x8214,0x6A59, + /* Array index: 0x0FCB */ 0x8222,0x5334, + /* Array index: 0x0FCB */ 0x8247,0x662C, + /* Array index: 0x0FCB */ 0x824B,0x6A5B, + /* Array index: 0x0FCB */ 0x8258,0x717C, + /* Array index: 0x0FCB */ 0x8259,0x717D, + /* Array index: 0x0FCB */ 0x8266,0x7A30, + /* Array index: 0x0FCB */ 0x8277,0x7C6C, + /* Array index: 0x0FCB */ 0x827E,0x4864, + /* Array index: 0x0FCB */ 0x828B,0x4B42, + /* Array index: 0x0FCB */ 0x828D,0x4B43, + /* Array index: 0x0FCB */ 0x8292,0x4B41, + /* Array index: 0x0FCB */ 0x8299,0x4F3F, + /* Array index: 0x0FCB */ 0x829D,0x4F3E, + /* Array index: 0x0FCB */ 0x829F,0x4F42, + /* Array index: 0x0FCB */ 0x82A3,0x4F49, + /* Array index: 0x0FCB */ 0x82A5,0x4F46, + /* Array index: 0x0FCB */ 0x82D7,0x5340, + /* Array index: 0x0FCB */ 0x82EF,0x5349, + /* Array index: 0x0FCB */ 0x82F1,0x5341, + /* Array index: 0x0FCB */ 0x8309,0x533E, + /* Array index: 0x0FCB */ 0x8317,0x577E, + /* Array index: 0x0FCB */ 0x8328,0x5823, + /* Array index: 0x0FCB */ 0x832B,0x5771, + /* Array index: 0x0FCB */ 0x8340,0x5821, + /* Array index: 0x0FCB */ 0x8343,0x5824, + /* Array index: 0x0FCB */ 0x8349,0x5777, + /* Array index: 0x0FCB */ 0x834A,0x5774, + /* Array index: 0x0FCB */ 0x834F,0x577A, + /* Array index: 0x0FCB */ 0x8350,0x5776, + /* Array index: 0x0FCB */ 0x8352,0x5772, + /* Array index: 0x0FCB */ 0x8354,0x5773, + /* Array index: 0x0FCB */ 0x8377,0x5D23, + /* Array index: 0x0FCB */ 0x8378,0x5C77, + /* Array index: 0x0FCB */ 0x837B,0x5D24, + /* Array index: 0x0FCB */ 0x837C,0x5D25, + /* Array index: 0x0FCB */ 0x8386,0x5D26, + /* Array index: 0x0FCB */ 0x8389,0x5D21, + /* Array index: 0x0FCB */ 0x838A,0x5C7D, + /* Array index: 0x0FCB */ 0x838E,0x5C74, + /* Array index: 0x0FCB */ 0x8392,0x5C7C, + /* Array index: 0x0FCB */ 0x8393,0x5C7E, + /* Array index: 0x0FCB */ 0x8396,0x5C79, + /* Array index: 0x0FCB */ 0x8398,0x5C76, + /* Array index: 0x0FCB */ 0x839E,0x5C75, + /* Array index: 0x0FCB */ 0x83A0,0x5D22, + /* Array index: 0x0FCB */ 0x83A2,0x5C78, + /* Array index: 0x0FCB */ 0x83A7,0x5D27, + /* Array index: 0x0FCB */ 0x83AB,0x5C7B, + /* Array index: 0x0FCB */ 0x83BD,0x5C7A, + /* Array index: 0x0FCB */ 0x83C1,0x615D, + /* Array index: 0x0FCB */ 0x83C5,0x615B, + /* Array index: 0x0FCB */ 0x83CA,0x6168, + /* Array index: 0x0FCB */ 0x83CC,0x6165, + /* Array index: 0x0FCB */ 0x83D4,0x616E, + /* Array index: 0x0FCB */ 0x83DC,0x616C, + /* Array index: 0x0FCB */ 0x83DF,0x616F, + /* Array index: 0x0FCB */ 0x83E0,0x615A, + /* Array index: 0x0FCB */ 0x83E9,0x6156, + /* Array index: 0x0FCB */ 0x83F8,0x6158, + /* Array index: 0x0FCB */ 0x83FD,0x6166, + /* Array index: 0x0FCB */ 0x8403,0x6157, + /* Array index: 0x0FCB */ 0x8404,0x616B, + /* Array index: 0x0FCB */ 0x8407,0x616D, + /* Array index: 0x0FCB */ 0x842C,0x655C, + /* Array index: 0x0FCB */ 0x8431,0x6630, + /* Array index: 0x0FCB */ 0x8435,0x6638, + /* Array index: 0x0FCB */ 0x8438,0x6169, + /* Array index: 0x0FCB */ 0x843C,0x6637, + /* Array index: 0x0FCB */ 0x843D,0x662F, + /* Array index: 0x0FCB */ 0x8446,0x663D, + /* Array index: 0x0FCB */ 0x8449,0x6634, + /* Array index: 0x0FCB */ 0x8457,0x6161, + /* Array index: 0x0FCB */ 0x845B,0x6636, + /* Array index: 0x0FCB */ 0x8461,0x6639, + /* Array index: 0x0FCB */ 0x8463,0x663A, + /* Array index: 0x0FCB */ 0x8466,0x6632, + /* Array index: 0x0FCB */ 0x8475,0x6631, + /* Array index: 0x0FCB */ 0x8477,0x662E, + /* Array index: 0x0FCB */ 0x8482,0x662D, + /* Array index: 0x0FCB */ 0x8490,0x6A68, + /* Array index: 0x0FCB */ 0x8499,0x6A60, + /* Array index: 0x0FCB */ 0x849C,0x6A63, + /* Array index: 0x0FCB */ 0x849E,0x6A61, + /* Array index: 0x0FCB */ 0x84B2,0x6A62, + /* Array index: 0x0FCB */ 0x84B8,0x6A65, + /* Array index: 0x0FCB */ 0x84BC,0x6A69, + /* Array index: 0x0FCB */ 0x84BF,0x6A5D, + /* Array index: 0x0FCB */ 0x84C0,0x6A66, + /* Array index: 0x0FCB */ 0x84C4,0x6A5F, + /* Array index: 0x0FCB */ 0x84C6,0x6A5E, + /* Array index: 0x0FCB */ 0x84D1,0x6A6A, + /* Array index: 0x0FCB */ 0x84D3,0x6A67, + /* Array index: 0x0FCB */ 0x84EC,0x6E5D, + /* Array index: 0x0FCB */ 0x84EE,0x6E55, + /* Array index: 0x0FCB */ 0x84FF,0x6E5F, + /* Array index: 0x0FCB */ 0x8506,0x6E60, + /* Array index: 0x0FCB */ 0x8511,0x6E59, + /* Array index: 0x0FCB */ 0x8513,0x6E58, + /* Array index: 0x0FCB */ 0x8514,0x6E5C, + /* Array index: 0x0FCB */ 0x8517,0x6E52, + /* Array index: 0x0FCB */ 0x851A,0x6E54, + /* Array index: 0x0FCB */ 0x8521,0x6E5B, + /* Array index: 0x0FCB */ 0x8523,0x6E5A, + /* Array index: 0x0FCB */ 0x8525,0x6E5E, + /* Array index: 0x0FCB */ 0x852C,0x6E56, + /* Array index: 0x0FCB */ 0x852D,0x6E57, + /* Array index: 0x0FCB */ 0x853D,0x6E53, + /* Array index: 0x0FCB */ 0x8543,0x7225, + /* Array index: 0x0FCB */ 0x8559,0x7221, + /* Array index: 0x0FCB */ 0x855E,0x7229, + /* Array index: 0x0FCB */ 0x856D,0x7227, + /* Array index: 0x0FCB */ 0x857E,0x752C, + /* Array index: 0x0FCB */ 0x8584,0x752B, + /* Array index: 0x0FCB */ 0x8587,0x7532, + /* Array index: 0x0FCB */ 0x858A,0x7534, + /* Array index: 0x0FCB */ 0x8591,0x752E, + /* Array index: 0x0FCB */ 0x8594,0x752F, + /* Array index: 0x0FCB */ 0x859B,0x7531, + /* Array index: 0x0FCB */ 0x859C,0x752D, + /* Array index: 0x0FCB */ 0x85AF,0x7530, + /* Array index: 0x0FCB */ 0x85B0,0x7734, + /* Array index: 0x0FCB */ 0x85B9,0x7736, + /* Array index: 0x0FCB */ 0x85BA,0x7735, + /* Array index: 0x0FCB */ 0x85C9,0x7733, + /* Array index: 0x0FCB */ 0x85CD,0x7731, + /* Array index: 0x0FCB */ 0x85CF,0x772F, + /* Array index: 0x0FCB */ 0x85D0,0x7732, + /* Array index: 0x0FCB */ 0x85D5,0x786D, + /* Array index: 0x0FCB */ 0x85DD,0x786B, + /* Array index: 0x0FCB */ 0x85E4,0x786E, + /* Array index: 0x0FCB */ 0x85E5,0x786F, + /* Array index: 0x0FCB */ 0x85E9,0x786A, + /* Array index: 0x0FCB */ 0x85EA,0x786C, + /* Array index: 0x0FCB */ 0x8606,0x7A35, + /* Array index: 0x0FCB */ 0x8607,0x7A37, + /* Array index: 0x0FCB */ 0x860A,0x7A38, + /* Array index: 0x0FCB */ 0x860B,0x7A36, + /* Array index: 0x0FCB */ 0x8611,0x7A33, + /* Array index: 0x0FCB */ 0x8617,0x7B21, + /* Array index: 0x0FCB */ 0x861A,0x7B23, + /* Array index: 0x0FCB */ 0x862D,0x7B22, + /* Array index: 0x0FCB */ 0x8638,0x7C45, + /* Array index: 0x0FCB */ 0x863F,0x7C46, + /* Array index: 0x0FCB */ 0x864E,0x4F4D, + /* Array index: 0x0FCB */ 0x8650,0x534B, + /* Array index: 0x0FCB */ 0x8654,0x5825, + /* Array index: 0x0FCB */ 0x8655,0x5D28, + /* Array index: 0x0FCB */ 0x8667,0x7536, + /* Array index: 0x0FCB */ 0x866B,0x4865, + /* Array index: 0x0FCB */ 0x8671,0x4F4E, + /* Array index: 0x0FCB */ 0x868A,0x5826, + /* Array index: 0x0FCB */ 0x868C,0x582B, + /* Array index: 0x0FCB */ 0x8693,0x5828, + /* Array index: 0x0FCB */ 0x869C,0x582D, + /* Array index: 0x0FCB */ 0x86A3,0x582C, + /* Array index: 0x0FCB */ 0x86A4,0x5829, + /* Array index: 0x0FCB */ 0x86A9,0x582A, + /* Array index: 0x0FCB */ 0x86AA,0x5827, + /* Array index: 0x0FCB */ 0x86AF,0x5D32, + /* Array index: 0x0FCB */ 0x86B1,0x5D31, + /* Array index: 0x0FCB */ 0x86B5,0x5D2E, + /* Array index: 0x0FCB */ 0x86B6,0x5D2C, + /* Array index: 0x0FCB */ 0x86C0,0x5D2B, + /* Array index: 0x0FCB */ 0x86C4,0x5D2D, + /* Array index: 0x0FCB */ 0x86C6,0x5D2F, + /* Array index: 0x0FCB */ 0x86C7,0x5D2A, + /* Array index: 0x0FCB */ 0x86C9,0x5D33, + /* Array index: 0x0FCB */ 0x86CB,0x5D30, + /* Array index: 0x0FCB */ 0x86D0,0x6177, + /* Array index: 0x0FCB */ 0x86D4,0x6174, + /* Array index: 0x0FCB */ 0x86D9,0x6172, + /* Array index: 0x0FCB */ 0x86DB,0x6175, + /* Array index: 0x0FCB */ 0x86DE,0x6178, + /* Array index: 0x0FCB */ 0x86DF,0x6171, + /* Array index: 0x0FCB */ 0x86E4,0x6176, + /* Array index: 0x0FCB */ 0x86ED,0x6173, + /* Array index: 0x0FCB */ 0x86F9,0x6641, + /* Array index: 0x0FCB */ 0x86FB,0x6647, + /* Array index: 0x0FCB */ 0x86FE,0x6646, + /* Array index: 0x0FCB */ 0x8700,0x6645, + /* Array index: 0x0FCB */ 0x8713,0x6642, + /* Array index: 0x0FCB */ 0x8718,0x6A72, + /* Array index: 0x0FCB */ 0x871C,0x6A6D, + /* Array index: 0x0FCB */ 0x8722,0x6A6F, + /* Array index: 0x0FCB */ 0x8725,0x6A70, + /* Array index: 0x0FCB */ 0x8729,0x6A75, + /* Array index: 0x0FCB */ 0x8734,0x6A71, + /* Array index: 0x0FCB */ 0x8737,0x6A74, + /* Array index: 0x0FCB */ 0x873B,0x6A6E, + /* Array index: 0x0FCB */ 0x873F,0x6A6C, + /* Array index: 0x0FCB */ 0x874C,0x6E6A, + /* Array index: 0x0FCB */ 0x8753,0x6E6B, + /* Array index: 0x0FCB */ 0x8755,0x6A73, + /* Array index: 0x0FCB */ 0x8757,0x6E69, + /* Array index: 0x0FCB */ 0x8759,0x6E68, + /* Array index: 0x0FCB */ 0x8760,0x6E64, + /* Array index: 0x0FCB */ 0x8766,0x6E65, + /* Array index: 0x0FCB */ 0x8768,0x6E67, + /* Array index: 0x0FCB */ 0x8774,0x6E62, + /* Array index: 0x0FCB */ 0x8776,0x6E63, + /* Array index: 0x0FCB */ 0x8778,0x6E66, + /* Array index: 0x0FCB */ 0x8782,0x6E61, + /* Array index: 0x0FCB */ 0x8783,0x722A, + /* Array index: 0x0FCB */ 0x878D,0x722E, + /* Array index: 0x0FCB */ 0x879E,0x722C, + /* Array index: 0x0FCB */ 0x879F,0x722B, + /* Array index: 0x0FCB */ 0x87A2,0x722D, + /* Array index: 0x0FCB */ 0x87AB,0x753C, + /* Array index: 0x0FCB */ 0x87B3,0x7539, + /* Array index: 0x0FCB */ 0x87BA,0x753E, + /* Array index: 0x0FCB */ 0x87BB,0x753D, + /* Array index: 0x0FCB */ 0x87C0,0x7537, + /* Array index: 0x0FCB */ 0x87C6,0x753B, + /* Array index: 0x0FCB */ 0x87C8,0x753F, + /* Array index: 0x0FCB */ 0x87CB,0x7540, + /* Array index: 0x0FCB */ 0x87D1,0x7538, + /* Array index: 0x0FCB */ 0x87D2,0x753A, + /* Array index: 0x0FCB */ 0x87E0,0x773A, + /* Array index: 0x0FCB */ 0x87EC,0x7738, + /* Array index: 0x0FCB */ 0x87EF,0x7737, + /* Array index: 0x0FCB */ 0x87F2,0x7739, + /* Array index: 0x0FCB */ 0x87F9,0x7874, + /* Array index: 0x0FCB */ 0x87FB,0x7871, + /* Array index: 0x0FCB */ 0x87FE,0x7875, + /* Array index: 0x0FCB */ 0x8805,0x7872, + /* Array index: 0x0FCB */ 0x880D,0x7873, + /* Array index: 0x0FCB */ 0x8814,0x7A39, + /* Array index: 0x0FCB */ 0x8815,0x7A3A, + /* Array index: 0x0FCB */ 0x8831,0x7C47, + /* Array index: 0x0FCB */ 0x8836,0x7C66, + /* Array index: 0x0FCB */ 0x8839,0x7C67, + /* Array index: 0x0FCB */ 0x883B,0x7D27, + /* Array index: 0x0FCB */ 0x8840,0x4866, + /* Array index: 0x0FCB */ 0x884C,0x4867, + /* Array index: 0x0FCB */ 0x884D,0x534F, + /* Array index: 0x0FCB */ 0x8853,0x5D34, + /* Array index: 0x0FCB */ 0x8857,0x6179, + /* Array index: 0x0FCB */ 0x8859,0x664C, + /* Array index: 0x0FCB */ 0x885B,0x6E6C, + /* Array index: 0x0FCB */ 0x885D,0x6E6D, + /* Array index: 0x0FCB */ 0x8868,0x4F50, + /* Array index: 0x0FCB */ 0x886B,0x5350, + /* Array index: 0x0FCB */ 0x8870,0x582E, + /* Array index: 0x0FCB */ 0x8877,0x582F, + /* Array index: 0x0FCB */ 0x8879,0x5833, + /* Array index: 0x0FCB */ 0x887D,0x5832, + /* Array index: 0x0FCB */ 0x8881,0x5830, + /* Array index: 0x0FCB */ 0x8882,0x5831, + /* Array index: 0x0FCB */ 0x8888,0x5D36, + /* Array index: 0x0FCB */ 0x888B,0x5D3B, + /* Array index: 0x0FCB */ 0x888D,0x5D3A, + /* Array index: 0x0FCB */ 0x8892,0x5D38, + /* Array index: 0x0FCB */ 0x8896,0x5D39, + /* Array index: 0x0FCB */ 0x889E,0x5D35, + /* Array index: 0x0FCB */ 0x88AB,0x5D37, + /* Array index: 0x0FCB */ 0x88B1,0x617C, + /* Array index: 0x0FCB */ 0x88C1,0x617A, + /* Array index: 0x0FCB */ 0x88C2,0x617B, + /* Array index: 0x0FCB */ 0x88CA,0x6654, + /* Array index: 0x0FCB */ 0x88D2,0x6656, + /* Array index: 0x0FCB */ 0x88D4,0x664E, + /* Array index: 0x0FCB */ 0x88D5,0x6655, + /* Array index: 0x0FCB */ 0x88D8,0x6651, + /* Array index: 0x0FCB */ 0x88D9,0x664F, + /* Array index: 0x0FCB */ 0x88DC,0x6650, + /* Array index: 0x0FCB */ 0x88DD,0x6652, + /* Array index: 0x0FCB */ 0x88DF,0x664D, + /* Array index: 0x0FCB */ 0x88E1,0x6653, + /* Array index: 0x0FCB */ 0x88E8,0x6A7C, + /* Array index: 0x0FCB */ 0x88EF,0x6A7E, + /* Array index: 0x0FCB */ 0x88F3,0x6A76, + /* Array index: 0x0FCB */ 0x88F4,0x6A78, + /* Array index: 0x0FCB */ 0x88F8,0x6A7A, + /* Array index: 0x0FCB */ 0x88F9,0x6A79, + /* Array index: 0x0FCB */ 0x88FD,0x6A7B, + /* Array index: 0x0FCB */ 0x8902,0x6A77, + /* Array index: 0x0FCB */ 0x8907,0x6E6F, + /* Array index: 0x0FCB */ 0x890A,0x6E73, + /* Array index: 0x0FCB */ 0x8910,0x6E6E, + /* Array index: 0x0FCB */ 0x8912,0x6E70, + /* Array index: 0x0FCB */ 0x8913,0x6E71, + /* Array index: 0x0FCB */ 0x8915,0x6E72, + /* Array index: 0x0FCB */ 0x891A,0x6A7D, + /* Array index: 0x0FCB */ 0x8921,0x7234, + /* Array index: 0x0FCB */ 0x8925,0x7232, + /* Array index: 0x0FCB */ 0x892A,0x7230, + /* Array index: 0x0FCB */ 0x892B,0x7233, + /* Array index: 0x0FCB */ 0x8932,0x7231, + /* Array index: 0x0FCB */ 0x8936,0x7542, + /* Array index: 0x0FCB */ 0x8938,0x7544, + /* Array index: 0x0FCB */ 0x893B,0x7541, + /* Array index: 0x0FCB */ 0x893D,0x7545, + /* Array index: 0x0FCB */ 0x8944,0x7543, + /* Array index: 0x0FCB */ 0x8956,0x7878, + /* Array index: 0x0FCB */ 0x8964,0x7A3B, + /* Array index: 0x0FCB */ 0x896A,0x7B28, + /* Array index: 0x0FCB */ 0x896C,0x7B29, + /* Array index: 0x0FCB */ 0x896F,0x7B72, + /* Array index: 0x0FCB */ 0x8972,0x7B71, + /* Array index: 0x0FCB */ 0x897F,0x4869, + /* Array index: 0x0FCB */ 0x8981,0x5351, + /* Array index: 0x0FCB */ 0x8983,0x617D, + /* Array index: 0x0FCB */ 0x8986,0x773B, + /* Array index: 0x0FCB */ 0x898B,0x4B44, + /* Array index: 0x0FCB */ 0x898F,0x5D3D, + /* Array index: 0x0FCB */ 0x8993,0x5D3C, + /* Array index: 0x0FCB */ 0x8996,0x617E, + /* Array index: 0x0FCB */ 0x899C,0x6657, + /* Array index: 0x0FCB */ 0x89A6,0x7236, + /* Array index: 0x0FCB */ 0x89AA,0x7235, + /* Array index: 0x0FCB */ 0x89AC,0x7546, + /* Array index: 0x0FCB */ 0x89B2,0x773C, + /* Array index: 0x0FCB */ 0x89BA,0x7A3C, + /* Array index: 0x0FCB */ 0x89BD,0x7B2A, + /* Array index: 0x0FCB */ 0x89C0,0x7D28, + /* Array index: 0x0FCB */ 0x89D2,0x4B45, + /* Array index: 0x0FCB */ 0x89D4,0x5352, + /* Array index: 0x0FCB */ 0x89E3,0x6658, + /* Array index: 0x0FCB */ 0x89F4,0x773D, + /* Array index: 0x0FCB */ 0x89F8,0x7A3D, + /* Array index: 0x0FCB */ 0x89FC,0x7B73, + /* Array index: 0x0FCB */ 0x8A00,0x4B46, + /* Array index: 0x0FCB */ 0x8A02,0x5354, + /* Array index: 0x0FCB */ 0x8A03,0x5355, + /* Array index: 0x0FCB */ 0x8A08,0x5353, + /* Array index: 0x0FCB */ 0x8A0A,0x5839, + /* Array index: 0x0FCB */ 0x8A1B,0x5D45, + /* Array index: 0x0FCB */ 0x8A1D,0x5D3F, + /* Array index: 0x0FCB */ 0x8A1F,0x5D44, + /* Array index: 0x0FCB */ 0x8A22,0x5D46, + /* Array index: 0x0FCB */ 0x8A23,0x5D40, + /* Array index: 0x0FCB */ 0x8A25,0x5D41, + /* Array index: 0x0FCB */ 0x8A2A,0x5D3E, + /* Array index: 0x0FCB */ 0x8A2D,0x5D43, + /* Array index: 0x0FCB */ 0x8A31,0x5D42, + /* Array index: 0x0FCB */ 0x8A34,0x622B, + /* Array index: 0x0FCB */ 0x8A36,0x622D, + /* Array index: 0x0FCB */ 0x8A41,0x6226, + /* Array index: 0x0FCB */ 0x8A46,0x622A, + /* Array index: 0x0FCB */ 0x8A50,0x6229, + /* Array index: 0x0FCB */ 0x8A5B,0x6228, + /* Array index: 0x0FCB */ 0x8A5E,0x6224, + /* Array index: 0x0FCB */ 0x8A60,0x6222, + /* Array index: 0x0FCB */ 0x8A62,0x6666, + /* Array index: 0x0FCB */ 0x8A63,0x6661, + /* Array index: 0x0FCB */ 0x8A66,0x665C, + /* Array index: 0x0FCB */ 0x8A79,0x6669, + /* Array index: 0x0FCB */ 0x8A7B,0x666A, + /* Array index: 0x0FCB */ 0x8A7C,0x6660, + /* Array index: 0x0FCB */ 0x8A85,0x6664, + /* Array index: 0x0FCB */ 0x8A87,0x665F, + /* Array index: 0x0FCB */ 0x8A8C,0x6B22, + /* Array index: 0x0FCB */ 0x8A8D,0x6B25, + /* Array index: 0x0FCB */ 0x8A91,0x6B2D, + /* Array index: 0x0FCB */ 0x8A93,0x6B27, + /* Array index: 0x0FCB */ 0x8A95,0x6E78, + /* Array index: 0x0FCB */ 0x8A98,0x6B2C, + /* Array index: 0x0FCB */ 0x8A9A,0x6B2E, + /* Array index: 0x0FCB */ 0x8A9E,0x6B23, + /* Array index: 0x0FCB */ 0x8AB0,0x6F21, + /* Array index: 0x0FCB */ 0x8AB2,0x6E7B, + /* Array index: 0x0FCB */ 0x8AB6,0x6F24, + /* Array index: 0x0FCB */ 0x8AB9,0x6F25, + /* Array index: 0x0FCB */ 0x8ABC,0x6E74, + /* Array index: 0x0FCB */ 0x8ABF,0x6E7E, + /* Array index: 0x0FCB */ 0x8AC2,0x6E7D, + /* Array index: 0x0FCB */ 0x8AC4,0x6E77, + /* Array index: 0x0FCB */ 0x8AC7,0x6E76, + /* Array index: 0x0FCB */ 0x8AC9,0x6E7C, + /* Array index: 0x0FCB */ 0x8ACB,0x6E79, + /* Array index: 0x0FCB */ 0x8ACD,0x6F23, + /* Array index: 0x0FCB */ 0x8AD2,0x6E75, + /* Array index: 0x0FCB */ 0x8AD6,0x6F22, + /* Array index: 0x0FCB */ 0x8ADB,0x6F26, + /* Array index: 0x0FCB */ 0x8ADC,0x723C, + /* Array index: 0x0FCB */ 0x8AE6,0x7237, + /* Array index: 0x0FCB */ 0x8AE7,0x723D, + /* Array index: 0x0FCB */ 0x8AEB,0x7239, + /* Array index: 0x0FCB */ 0x8AED,0x7243, + /* Array index: 0x0FCB */ 0x8AEE,0x723E, + /* Array index: 0x0FCB */ 0x8AF1,0x723A, + /* Array index: 0x0FCB */ 0x8AF3,0x7244, + /* Array index: 0x0FCB */ 0x8B0A,0x754B, + /* Array index: 0x0FCB */ 0x8B0E,0x7547, + /* Array index: 0x0FCB */ 0x8B10,0x754F, + /* Array index: 0x0FCB */ 0x8B17,0x7548, + /* Array index: 0x0FCB */ 0x8B19,0x7549, + /* Array index: 0x0FCB */ 0x8B1B,0x754A, + /* Array index: 0x0FCB */ 0x8B1D,0x754D, + /* Array index: 0x0FCB */ 0x8B20,0x754C, + /* Array index: 0x0FCB */ 0x8B28,0x773E, + /* Array index: 0x0FCB */ 0x8B2B,0x7741, + /* Array index: 0x0FCB */ 0x8B2C,0x7740, + /* Array index: 0x0FCB */ 0x8B39,0x773F, + /* Array index: 0x0FCB */ 0x8B41,0x787A, + /* Array index: 0x0FCB */ 0x8B46,0x7923, + /* Array index: 0x0FCB */ 0x8B49,0x787D, + /* Array index: 0x0FCB */ 0x8B4E,0x7921, + /* Array index: 0x0FCB */ 0x8B4F,0x7922, + /* Array index: 0x0FCB */ 0x8B5F,0x7A42, + /* Array index: 0x0FCB */ 0x8B66,0x7A40, + /* Array index: 0x0FCB */ 0x8B6B,0x7A43, + /* Array index: 0x0FCB */ 0x8B6C,0x7A3F, + /* Array index: 0x0FCB */ 0x8B6F,0x7A41, + /* Array index: 0x0FCB */ 0x8B70,0x7A3E, + /* Array index: 0x0FCB */ 0x8B74,0x7B2B, + /* Array index: 0x0FCB */ 0x8B77,0x7B2C, + /* Array index: 0x0FCB */ 0x8B7D,0x7B2D, + /* Array index: 0x0FCB */ 0x8B80,0x7B74, + /* Array index: 0x0FCB */ 0x8B8A,0x7C48, + /* Array index: 0x0FCB */ 0x8B92,0x7C6A, + /* Array index: 0x0FCB */ 0x8B93,0x7C69, + /* Array index: 0x0FCB */ 0x8B96,0x7C6B, + /* Array index: 0x0FCB */ 0x8B9A,0x7D34, + /* Array index: 0x0FCB */ 0x8B9C,0x7D3A, + /* Array index: 0x0FCB */ 0x8C37,0x4B47, + /* Array index: 0x0FCB */ 0x8C3F,0x7551, + /* Array index: 0x0FCB */ 0x8C41,0x7550, + /* Array index: 0x0FCB */ 0x8C46,0x4B48, + /* Array index: 0x0FCB */ 0x8C48,0x583F, + /* Array index: 0x0FCB */ 0x8C49,0x5D47, + /* Array index: 0x0FCB */ 0x8C4C,0x6F27, + /* Array index: 0x0FCB */ 0x8C4E,0x6F28, + /* Array index: 0x0FCB */ 0x8C50,0x7742, + /* Array index: 0x0FCB */ 0x8C54,0x7D43, + /* Array index: 0x0FCB */ 0x8C55,0x4B49, + /* Array index: 0x0FCB */ 0x8C5A,0x5D48, + /* Array index: 0x0FCB */ 0x8C61,0x622F, + /* Array index: 0x0FCB */ 0x8C62,0x666D, + /* Array index: 0x0FCB */ 0x8C73,0x7552, + /* Array index: 0x0FCB */ 0x8C79,0x5841, + /* Array index: 0x0FCB */ 0x8C7A,0x5840, + /* Array index: 0x0FCB */ 0x8C82,0x6230, + /* Array index: 0x0FCB */ 0x8C93,0x7249, + /* Array index: 0x0FCB */ 0x8CAF,0x6231, + /* Array index: 0x0FCB */ 0x8CDC,0x6F32, + /* Array index: 0x0FCB */ 0x8CEA,0x6F33, + /* Array index: 0x0FCB */ 0x8CEC,0x6F2E, + /* Array index: 0x0FCB */ 0x8CED,0x6F2F, + /* Array index: 0x0FCB */ 0x8CF4,0x724A, + /* Array index: 0x0FCB */ 0x8D05,0x7743, + /* Array index: 0x0FCB */ 0x8D08,0x7925, + /* Array index: 0x0FCB */ 0x8D0A,0x7926, + /* Array index: 0x0FCB */ 0x8D0D,0x7A45, + /* Array index: 0x0FCB */ 0x8D0F,0x7A44, + /* Array index: 0x0FCB */ 0x8D13,0x7B2E, + /* Array index: 0x0FCB */ 0x8D16,0x7B75, + /* Array index: 0x0FCB */ 0x8D17,0x7B76, + /* Array index: 0x0FCB */ 0x8D1B,0x7C6D, + /* Array index: 0x0FCB */ 0x8D64,0x4B4B, + /* Array index: 0x0FCB */ 0x8D66,0x5D50, + /* Array index: 0x0FCB */ 0x8D67,0x5D4F, + /* Array index: 0x0FCB */ 0x8D6B,0x6B36, + /* Array index: 0x0FCB */ 0x8D6D,0x6F35, + /* Array index: 0x0FCB */ 0x8D70,0x4B4C, + /* Array index: 0x0FCB */ 0x8D73,0x5359, + /* Array index: 0x0FCB */ 0x8D74,0x5358, + /* Array index: 0x0FCB */ 0x8D77,0x5844, + /* Array index: 0x0FCB */ 0x8D81,0x623F, + /* Array index: 0x0FCB */ 0x8D85,0x623E, + /* Array index: 0x0FCB */ 0x8D8A,0x623D, + /* Array index: 0x0FCB */ 0x8D95,0x6B38, + /* Array index: 0x0FCB */ 0x8D99,0x6B37, + /* Array index: 0x0FCB */ 0x8D9F,0x6F36, + /* Array index: 0x0FCB */ 0x8DA3,0x6F37, + /* Array index: 0x0FCB */ 0x8DA8,0x7558, + /* Array index: 0x0FCB */ 0x8DB3,0x4B4D, + /* Array index: 0x0FCB */ 0x8DB4,0x535A, + /* Array index: 0x0FCB */ 0x8DBA,0x5D52, + /* Array index: 0x0FCB */ 0x8DBE,0x5D51, + /* Array index: 0x0FCB */ 0x8DC6,0x6247, + /* Array index: 0x0FCB */ 0x8DCB,0x6242, + /* Array index: 0x0FCB */ 0x8DCC,0x6245, + /* Array index: 0x0FCB */ 0x8DCE,0x6240, + /* Array index: 0x0FCB */ 0x8DD1,0x6244, + /* Array index: 0x0FCB */ 0x8DDA,0x6243, + /* Array index: 0x0FCB */ 0x8DDB,0x6246, + /* Array index: 0x0FCB */ 0x8DDD,0x6241, + /* Array index: 0x0FCB */ 0x8DDF,0x6679, + /* Array index: 0x0FCB */ 0x8DE1,0x6678, + /* Array index: 0x0FCB */ 0x8DE4,0x6721, + /* Array index: 0x0FCB */ 0x8DE6,0x6722, + /* Array index: 0x0FCB */ 0x8DE8,0x667A, + /* Array index: 0x0FCB */ 0x8DEA,0x667E, + /* Array index: 0x0FCB */ 0x8DEF,0x667B, + /* Array index: 0x0FCB */ 0x8DF3,0x667C, + /* Array index: 0x0FCB */ 0x8DFA,0x667D, + /* Array index: 0x0FCB */ 0x8DFC,0x6B39, + /* Array index: 0x0FCB */ 0x8E0F,0x6F3C, + /* Array index: 0x0FCB */ 0x8E10,0x6F39, + /* Array index: 0x0FCB */ 0x8E29,0x6F3D, + /* Array index: 0x0FCB */ 0x8E2B,0x6F38, + /* Array index: 0x0FCB */ 0x8E31,0x724C, + /* Array index: 0x0FCB */ 0x8E34,0x724D, + /* Array index: 0x0FCB */ 0x8E35,0x7250, + /* Array index: 0x0FCB */ 0x8E39,0x724F, + /* Array index: 0x0FCB */ 0x8E42,0x724E, + /* Array index: 0x0FCB */ 0x8E44,0x724B, + /* Array index: 0x0FCB */ 0x8E55,0x7749, + /* Array index: 0x0FCB */ 0x8E59,0x7744, + /* Array index: 0x0FCB */ 0x8E5F,0x7748, + /* Array index: 0x0FCB */ 0x8E63,0x7745, + /* Array index: 0x0FCB */ 0x8E64,0x7747, + /* Array index: 0x0FCB */ 0x8E66,0x7746, + /* Array index: 0x0FCB */ 0x8E6C,0x792B, + /* Array index: 0x0FCB */ 0x8E72,0x7928, + /* Array index: 0x0FCB */ 0x8E74,0x792D, + /* Array index: 0x0FCB */ 0x8E76,0x792A, + /* Array index: 0x0FCB */ 0x8E7A,0x792C, + /* Array index: 0x0FCB */ 0x8E7C,0x7927, + /* Array index: 0x0FCB */ 0x8E81,0x7A47, + /* Array index: 0x0FCB */ 0x8E82,0x7A49, + /* Array index: 0x0FCB */ 0x8E85,0x7A48, + /* Array index: 0x0FCB */ 0x8E91,0x7B77, + /* Array index: 0x0FCB */ 0x8E93,0x7B78, + /* Array index: 0x0FCB */ 0x8EA1,0x7D29, + /* Array index: 0x0FCB */ 0x8EB2,0x6723, + /* Array index: 0x0FCB */ 0x8EBA,0x6F41, + /* Array index: 0x0FCB */ 0x8EC0,0x774A, + /* Array index: 0x0FCB */ 0x8ED2,0x5846, + /* Array index: 0x0FCB */ 0x8ED4,0x5847, + /* Array index: 0x0FCB */ 0x8EDB,0x5D53, + /* Array index: 0x0FCB */ 0x8EDF,0x5D54, + /* Array index: 0x0FCB */ 0x8EF8,0x6249, + /* Array index: 0x0FCB */ 0x8EFB,0x6248, + /* Array index: 0x0FCB */ 0x8EFC,0x624A, + /* Array index: 0x0FCB */ 0x8EFE,0x6726, + /* Array index: 0x0FCB */ 0x8F03,0x6724, + /* Array index: 0x0FCB */ 0x8F09,0x6725, + /* Array index: 0x0FCB */ 0x8F0A,0x6727, + /* Array index: 0x0FCB */ 0x8F25,0x6F4A, + /* Array index: 0x0FCB */ 0x8F26,0x6F46, + /* Array index: 0x0FCB */ 0x8F29,0x6F45, + /* Array index: 0x0FCB */ 0x8F2A,0x6F47, + /* Array index: 0x0FCB */ 0x8F2F,0x7252, + /* Array index: 0x0FCB */ 0x8F33,0x7254, + /* Array index: 0x0FCB */ 0x8F38,0x7253, + /* Array index: 0x0FCB */ 0x8F3B,0x7251, + /* Array index: 0x0FCB */ 0x8F3E,0x755E, + /* Array index: 0x0FCB */ 0x8F3F,0x7561, + /* Array index: 0x0FCB */ 0x8F42,0x755F, + /* Array index: 0x0FCB */ 0x8F44,0x755D, + /* Array index: 0x0FCB */ 0x8F45,0x7560, + /* Array index: 0x0FCB */ 0x8F49,0x774B, + /* Array index: 0x0FCB */ 0x8F4D,0x774C, + /* Array index: 0x0FCB */ 0x8F4E,0x792F, + /* Array index: 0x0FCB */ 0x8F54,0x792E, + /* Array index: 0x0FCB */ 0x8F5F,0x7B32, + /* Array index: 0x0FCB */ 0x8F61,0x7B79, + /* Array index: 0x0FCB */ 0x8F9B,0x4B50, + /* Array index: 0x0FCB */ 0x8F9C,0x624B, + /* Array index: 0x0FCB */ 0x8F9F,0x6728, + /* Array index: 0x0FCB */ 0x8FA3,0x6B3E, + /* Array index: 0x0FCB */ 0x8FA6,0x7256, + /* Array index: 0x0FCB */ 0x8FA8,0x7255, + /* Array index: 0x0FCB */ 0x8FCE,0x4F52, + /* Array index: 0x0FCB */ 0x8FD1,0x4F54, + /* Array index: 0x0FCB */ 0x8FD4,0x4F53, + /* Array index: 0x0FCB */ 0x8FF0,0x535D, + /* Array index: 0x0FCB */ 0x8FF4,0x584F, + /* Array index: 0x0FCB */ 0x8FF7,0x584C, + /* Array index: 0x0FCB */ 0x8FF8,0x5853, + /* Array index: 0x0FCB */ 0x8FFA,0x584E, + /* Array index: 0x0FCB */ 0x8FFD,0x5851, + /* Array index: 0x0FCB */ 0x9000,0x584D, + /* Array index: 0x0FCB */ 0x9001,0x584A, + /* Array index: 0x0FCB */ 0x9003,0x5850, + /* Array index: 0x0FCB */ 0x9005,0x5852, + /* Array index: 0x0FCB */ 0x9006,0x584B, + /* Array index: 0x0FCB */ 0x900D,0x5D56, + /* Array index: 0x0FCB */ 0x900F,0x5D60, + /* Array index: 0x0FCB */ 0x9010,0x5D5C, + /* Array index: 0x0FCB */ 0x902E,0x624C, + /* Array index: 0x0FCB */ 0x9031,0x624E, + /* Array index: 0x0FCB */ 0x9032,0x6250, + /* Array index: 0x0FCB */ 0x9035,0x624D, + /* Array index: 0x0FCB */ 0x9036,0x6251, + /* Array index: 0x0FCB */ 0x9038,0x624F, + /* Array index: 0x0FCB */ 0x903C,0x672F, + /* Array index: 0x0FCB */ 0x903E,0x6737, + /* Array index: 0x0FCB */ 0x9041,0x6738, + /* Array index: 0x0FCB */ 0x9042,0x672D, + /* Array index: 0x0FCB */ 0x9047,0x6732, + /* Array index: 0x0FCB */ 0x9068,0x6F4D, + /* Array index: 0x0FCB */ 0x9069,0x6F4B, + /* Array index: 0x0FCB */ 0x906D,0x6F4E, + /* Array index: 0x0FCB */ 0x906E,0x6F4C, + /* Array index: 0x0FCB */ 0x9072,0x725A, + /* Array index: 0x0FCB */ 0x9095,0x5854, + /* Array index: 0x0FCB */ 0x90A2,0x4B58, + /* Array index: 0x0FCB */ 0x90A3,0x4B5B, + /* Array index: 0x0FCB */ 0x90A6,0x4B5A, + /* Array index: 0x0FCB */ 0x90AA,0x4B59, + /* Array index: 0x0FCB */ 0x90B1,0x4F57, + /* Array index: 0x0FCB */ 0x90B5,0x4F55, + /* Array index: 0x0FCB */ 0x90B6,0x4F58, + /* Array index: 0x0FCB */ 0x90B8,0x4F56, + /* Array index: 0x0FCB */ 0x90C1,0x5368, + /* Array index: 0x0FCB */ 0x90C3,0x5369, + /* Array index: 0x0FCB */ 0x90CA,0x5366, + /* Array index: 0x0FCB */ 0x90CE,0x5367, + /* Array index: 0x0FCB */ 0x90DD,0x5856, + /* Array index: 0x0FCB */ 0x90E1,0x5855, + /* Array index: 0x0FCB */ 0x90E2,0x5857, + /* Array index: 0x0FCB */ 0x90E8,0x5D65, + /* Array index: 0x0FCB */ 0x90ED,0x5D66, + /* Array index: 0x0FCB */ 0x90F5,0x6253, + /* Array index: 0x0FCB */ 0x90FD,0x5D67, + /* Array index: 0x0FCB */ 0x90FE,0x6255, + /* Array index: 0x0FCB */ 0x9102,0x6252, + /* Array index: 0x0FCB */ 0x9109,0x6254, + /* Array index: 0x0FCB */ 0x9112,0x6739, + /* Array index: 0x0FCB */ 0x911E,0x6B4A, + /* Array index: 0x0FCB */ 0x9127,0x6F52, + /* Array index: 0x0FCB */ 0x912D,0x6F51, + /* Array index: 0x0FCB */ 0x9130,0x6F50, + /* Array index: 0x0FCB */ 0x9131,0x6F53, + /* Array index: 0x0FCB */ 0x9134,0x725D, + /* Array index: 0x0FCB */ 0x9139,0x7568, + /* Array index: 0x0FCB */ 0x9152,0x5858, + /* Array index: 0x0FCB */ 0x9157,0x5D68, + /* Array index: 0x0FCB */ 0x9163,0x6256, + /* Array index: 0x0FCB */ 0x9165,0x6257, + /* Array index: 0x0FCB */ 0x9169,0x673D, + /* Array index: 0x0FCB */ 0x916A,0x673C, + /* Array index: 0x0FCB */ 0x916C,0x673B, + /* Array index: 0x0FCB */ 0x9183,0x6F57, + /* Array index: 0x0FCB */ 0x9187,0x6F54, + /* Array index: 0x0FCB */ 0x9189,0x6F55, + /* Array index: 0x0FCB */ 0x918B,0x6F56, + /* Array index: 0x0FCB */ 0x9192,0x725E, + /* Array index: 0x0FCB */ 0x919C,0x756B, + /* Array index: 0x0FCB */ 0x919E,0x756A, + /* Array index: 0x0FCB */ 0x91A3,0x7569, + /* Array index: 0x0FCB */ 0x91AB,0x7750, + /* Array index: 0x0FCB */ 0x91AC,0x7751, + /* Array index: 0x0FCB */ 0x91AE,0x7934, + /* Array index: 0x0FCB */ 0x91B1,0x7933, + /* Array index: 0x0FCB */ 0x91B4,0x7A4A, + /* Array index: 0x0FCB */ 0x91BA,0x7B34, + /* Array index: 0x0FCB */ 0x91C0,0x7C6E, + /* Array index: 0x0FCB */ 0x91C1,0x7D2A, + /* Array index: 0x0FCB */ 0x91E3,0x5D6C, + /* Array index: 0x0FCB */ 0x91E6,0x5D6B, + /* Array index: 0x0FCB */ 0x91E7,0x5D6D, + /* Array index: 0x0FCB */ 0x91E9,0x5D6F, + /* Array index: 0x0FCB */ 0x91ED,0x5D6E, + /* Array index: 0x0FCB */ 0x91F5,0x5D6A, + /* Array index: 0x0FCB */ 0x9207,0x6260, + /* Array index: 0x0FCB */ 0x9209,0x625C, + /* Array index: 0x0FCB */ 0x920D,0x625E, + /* Array index: 0x0FCB */ 0x9210,0x625F, + /* Array index: 0x0FCB */ 0x9211,0x6261, + /* Array index: 0x0FCB */ 0x9214,0x6259, + /* Array index: 0x0FCB */ 0x9215,0x625A, + /* Array index: 0x0FCB */ 0x921E,0x625D, + /* Array index: 0x0FCB */ 0x9223,0x625B, + /* Array index: 0x0FCB */ 0x9234,0x6749, + /* Array index: 0x0FCB */ 0x9245,0x674C, + /* Array index: 0x0FCB */ 0x9249,0x674A, + /* Array index: 0x0FCB */ 0x924B,0x6746, + /* Array index: 0x0FCB */ 0x924D,0x674B, + /* Array index: 0x0FCB */ 0x9251,0x6748, + /* Array index: 0x0FCB */ 0x9257,0x6740, + /* Array index: 0x0FCB */ 0x925A,0x674F, + /* Array index: 0x0FCB */ 0x925B,0x6745, + /* Array index: 0x0FCB */ 0x9264,0x6747, + /* Array index: 0x0FCB */ 0x9278,0x6B4F, + /* Array index: 0x0FCB */ 0x927B,0x6B55, + /* Array index: 0x0FCB */ 0x927C,0x6B59, + /* Array index: 0x0FCB */ 0x9280,0x6B51, + /* Array index: 0x0FCB */ 0x9285,0x6B52, + /* Array index: 0x0FCB */ 0x9291,0x6B5A, + /* Array index: 0x0FCB */ 0x9293,0x6B56, + /* Array index: 0x0FCB */ 0x9296,0x6B54, + /* Array index: 0x0FCB */ 0x9298,0x6B53, + /* Array index: 0x0FCB */ 0x929C,0x6B57, + /* Array index: 0x0FCB */ 0x92A8,0x6B58, + /* Array index: 0x0FCB */ 0x92AC,0x6B50, + /* Array index: 0x0FCB */ 0x92B2,0x6F63, + /* Array index: 0x0FCB */ 0x92B3,0x6F5E, + /* Array index: 0x0FCB */ 0x92B7,0x6F5A, + /* Array index: 0x0FCB */ 0x92BB,0x6F59, + /* Array index: 0x0FCB */ 0x92BC,0x6F5F, + /* Array index: 0x0FCB */ 0x92C1,0x6F5D, + /* Array index: 0x0FCB */ 0x92C5,0x6F58, + /* Array index: 0x0FCB */ 0x92C7,0x6F61, + /* Array index: 0x0FCB */ 0x92D2,0x6F60, + /* Array index: 0x0FCB */ 0x92E4,0x6F5C, + /* Array index: 0x0FCB */ 0x92EA,0x6F5B, + /* Array index: 0x0FCB */ 0x92F0,0x6F62, + /* Array index: 0x0FCB */ 0x92F8,0x7261, + /* Array index: 0x0FCB */ 0x92FC,0x7265, + /* Array index: 0x0FCB */ 0x9304,0x7267, + /* Array index: 0x0FCB */ 0x9310,0x7269, + /* Array index: 0x0FCB */ 0x9315,0x726C, + /* Array index: 0x0FCB */ 0x9326,0x726A, + /* Array index: 0x0FCB */ 0x9328,0x756E, + /* Array index: 0x0FCB */ 0x932B,0x7266, + /* Array index: 0x0FCB */ 0x932E,0x726D, + /* Array index: 0x0FCB */ 0x932F,0x7263, + /* Array index: 0x0FCB */ 0x9333,0x7262, + /* Array index: 0x0FCB */ 0x9336,0x7260, + /* Array index: 0x0FCB */ 0x934A,0x7570, + /* Array index: 0x0FCB */ 0x934B,0x7572, + /* Array index: 0x0FCB */ 0x934D,0x756C, + /* Array index: 0x0FCB */ 0x9354,0x7579, + /* Array index: 0x0FCB */ 0x935A,0x7578, + /* Array index: 0x0FCB */ 0x935B,0x7576, + /* Array index: 0x0FCB */ 0x9365,0x7571, + /* Array index: 0x0FCB */ 0x936C,0x7575, + /* Array index: 0x0FCB */ 0x9370,0x7577, + /* Array index: 0x0FCB */ 0x9375,0x756F, + /* Array index: 0x0FCB */ 0x937E,0x7574, + /* Array index: 0x0FCB */ 0x9382,0x756D, + /* Array index: 0x0FCB */ 0x938A,0x7754, + /* Array index: 0x0FCB */ 0x93A2,0x7756, + /* Array index: 0x0FCB */ 0x93AC,0x7759, + /* Array index: 0x0FCB */ 0x93AE,0x7758, + /* Array index: 0x0FCB */ 0x93B0,0x775A, + /* Array index: 0x0FCB */ 0x93B3,0x7757, + /* Array index: 0x0FCB */ 0x93C3,0x7938, + /* Array index: 0x0FCB */ 0x93C8,0x7939, + /* Array index: 0x0FCB */ 0x93CD,0x793E, + /* Array index: 0x0FCB */ 0x93D1,0x7936, + /* Array index: 0x0FCB */ 0x93DC,0x793A, + /* Array index: 0x0FCB */ 0x93DD,0x793B, + /* Array index: 0x0FCB */ 0x93DF,0x7937, + /* Array index: 0x0FCB */ 0x93E1,0x7935, + /* Array index: 0x0FCB */ 0x93E2,0x793D, + /* Array index: 0x0FCB */ 0x93E4,0x7940, + /* Array index: 0x0FCB */ 0x93E8,0x7942, + /* Array index: 0x0FCB */ 0x93FD,0x7A4E, + /* Array index: 0x0FCB */ 0x9403,0x7A4D, + /* Array index: 0x0FCB */ 0x9418,0x7A4C, + /* Array index: 0x0FCB */ 0x942B,0x7B3B, + /* Array index: 0x0FCB */ 0x942E,0x7B35, + /* Array index: 0x0FCB */ 0x9432,0x7B3A, + /* Array index: 0x0FCB */ 0x9433,0x7B36, + /* Array index: 0x0FCB */ 0x9435,0x7B37, + /* Array index: 0x0FCB */ 0x9438,0x7B39, + /* Array index: 0x0FCB */ 0x943A,0x7B38, + /* Array index: 0x0FCB */ 0x9444,0x7B7B, + /* Array index: 0x0FCB */ 0x9451,0x7B7C, + /* Array index: 0x0FCB */ 0x9452,0x7B7D, + /* Array index: 0x0FCB */ 0x9460,0x7C4C, + /* Array index: 0x0FCB */ 0x9463,0x7C4B, + /* Array index: 0x0FCB */ 0x9464,0x7C4D, + /* Array index: 0x0FCB */ 0x946A,0x7C6F, + /* Array index: 0x0FCB */ 0x9470,0x7D2C, + /* Array index: 0x0FCB */ 0x9472,0x7D2B, + /* Array index: 0x0FCB */ 0x9477,0x7D35, + /* Array index: 0x0FCB */ 0x9577,0x4F5B, + /* Array index: 0x0FCB */ 0x9580,0x4F5C, + /* Array index: 0x0FCB */ 0x9582,0x536D, + /* Array index: 0x0FCB */ 0x9583,0x5860, + /* Array index: 0x0FCB */ 0x9589,0x5D70, + /* Array index: 0x0FCB */ 0x958B,0x6264, + /* Array index: 0x0FCB */ 0x9598,0x6750, + /* Array index: 0x0FCB */ 0x95AD,0x6F64, + /* Array index: 0x0FCB */ 0x95B1,0x6F65, + /* Array index: 0x0FCB */ 0x95BB,0x726F, + /* Array index: 0x0FCB */ 0x95C6,0x757E, + /* Array index: 0x0FCB */ 0x95D0,0x7760, + /* Array index: 0x0FCB */ 0x95DC,0x7943, + /* Array index: 0x0FCB */ 0x95E1,0x7A4F, + /* Array index: 0x0FCB */ 0x95E2,0x7B3C, + /* Array index: 0x0FCB */ 0x961C,0x4F5D, + /* Array index: 0x0FCB */ 0x9621,0x486A, + /* Array index: 0x0FCB */ 0x962A,0x4B62, + /* Array index: 0x0FCB */ 0x962C,0x4B63, + /* Array index: 0x0FCB */ 0x962E,0x4B60, + /* Array index: 0x0FCB */ 0x9631,0x4B61, + /* Array index: 0x0FCB */ 0x9632,0x4B5F, + /* Array index: 0x0FCB */ 0x963B,0x4F60, + /* Array index: 0x0FCB */ 0x963F,0x4F5F, + /* Array index: 0x0FCB */ 0x9640,0x4F5E, + /* Array index: 0x0FCB */ 0x9642,0x4F62, + /* Array index: 0x0FCB */ 0x9644,0x4F61, + /* Array index: 0x0FCB */ 0x9650,0x536E, + /* Array index: 0x0FCB */ 0x9658,0x5867, + /* Array index: 0x0FCB */ 0x965B,0x5864, + /* Array index: 0x0FCB */ 0x966A,0x5D71, + /* Array index: 0x0FCB */ 0x966C,0x5D79, + /* Array index: 0x0FCB */ 0x967D,0x626C, + /* Array index: 0x0FCB */ 0x9694,0x6752, + /* Array index: 0x0FCB */ 0x9695,0x6753, + /* Array index: 0x0FCB */ 0x96A7,0x7270, + /* Array index: 0x0FCB */ 0x96A8,0x7271, + /* Array index: 0x0FCB */ 0x96AA,0x7272, + /* Array index: 0x0FCB */ 0x96B1,0x7621, + /* Array index: 0x0FCB */ 0x96B4,0x7944, + /* Array index: 0x0FCB */ 0x96B8,0x7622, + /* Array index: 0x0FCB */ 0x96B9,0x4F63, + /* Array index: 0x0FCB */ 0x96BB,0x5869, + /* Array index: 0x0FCB */ 0x96D2,0x6B65, + /* Array index: 0x0FCB */ 0x96D5,0x7273, + /* Array index: 0x0FCB */ 0x96D6,0x7623, + /* Array index: 0x0FCB */ 0x96D9,0x7764, + /* Array index: 0x0FCB */ 0x96DB,0x7765, + /* Array index: 0x0FCB */ 0x96DC,0x7763, + /* Array index: 0x0FCB */ 0x96DE,0x7766, + /* Array index: 0x0FCB */ 0x96E2,0x7762, + /* Array index: 0x0FCB */ 0x96E3,0x7945, + /* Array index: 0x0FCB */ 0x96EF,0x6277, + /* Array index: 0x0FCB */ 0x96F2,0x6278, + /* Array index: 0x0FCB */ 0x96F6,0x675B, + /* Array index: 0x0FCB */ 0x96F7,0x6758, + /* Array index: 0x0FCB */ 0x96F9,0x675A, + /* Array index: 0x0FCB */ 0x96FB,0x6759, + /* Array index: 0x0FCB */ 0x9700,0x6B66, + /* Array index: 0x0FCB */ 0x9704,0x6F66, + /* Array index: 0x0FCB */ 0x9706,0x6F67, + /* Array index: 0x0FCB */ 0x9707,0x6F68, + /* Array index: 0x0FCB */ 0x9709,0x6F69, + /* Array index: 0x0FCB */ 0x9716,0x7276, + /* Array index: 0x0FCB */ 0x971C,0x7624, + /* Array index: 0x0FCB */ 0x971E,0x7625, + /* Array index: 0x0FCB */ 0x9724,0x7767, + /* Array index: 0x0FCB */ 0x9727,0x7947, + /* Array index: 0x0FCB */ 0x972A,0x7946, + /* Array index: 0x0FCB */ 0x9730,0x7A50, + /* Array index: 0x0FCB */ 0x9732,0x7B3F, + /* Array index: 0x0FCB */ 0x9738,0x7B3D, + /* Array index: 0x0FCB */ 0x9739,0x7B3E, + /* Array index: 0x0FCB */ 0x973D,0x7B7E, + /* Array index: 0x0FCB */ 0x973E,0x7C21, + /* Array index: 0x0FCB */ 0x9742,0x7C70, + /* Array index: 0x0FCB */ 0x9744,0x7C72, + /* Array index: 0x0FCB */ 0x9748,0x7C71, + /* Array index: 0x0FCB */ 0x9752,0x4F65, + /* Array index: 0x0FCB */ 0x9756,0x675C, + /* Array index: 0x0FCB */ 0x975B,0x727A, + /* Array index: 0x0FCB */ 0x975C,0x727B, + /* Array index: 0x0FCB */ 0x9766,0x727C, + /* Array index: 0x0FCB */ 0x9768,0x7C4E, + /* Array index: 0x0FCB */ 0x9769,0x5373, + /* Array index: 0x0FCB */ 0x9774,0x675D, + /* Array index: 0x0FCB */ 0x9776,0x675E, + /* Array index: 0x0FCB */ 0x977C,0x6B67, + /* Array index: 0x0FCB */ 0x9785,0x6B68, + /* Array index: 0x0FCB */ 0x978B,0x6F6C, + /* Array index: 0x0FCB */ 0x978D,0x6F6B, + /* Array index: 0x0FCB */ 0x978F,0x6F6D, + /* Array index: 0x0FCB */ 0x9798,0x727D, + /* Array index: 0x0FCB */ 0x97A0,0x7626, + /* Array index: 0x0FCB */ 0x97A3,0x7768, + /* Array index: 0x0FCB */ 0x97A6,0x7769, + /* Array index: 0x0FCB */ 0x97AD,0x776A, + /* Array index: 0x0FCB */ 0x97C1,0x7C23, + /* Array index: 0x0FCB */ 0x97C3,0x7C22, + /* Array index: 0x0FCB */ 0x97C6,0x7C73, + /* Array index: 0x0FCB */ 0x97C9,0x7D36, + /* Array index: 0x0FCB */ 0x97CB,0x5374, + /* Array index: 0x0FCB */ 0x97CC,0x6279, + /* Array index: 0x0FCB */ 0x97D3,0x7627, + /* Array index: 0x0FCB */ 0x97DC,0x7949, + /* Array index: 0x0FCB */ 0x97ED,0x5375, + /* Array index: 0x0FCB */ 0x97F3,0x5376, + /* Array index: 0x0FCB */ 0x97F6,0x6B69, + /* Array index: 0x0FCB */ 0x97F9,0x776B, + /* Array index: 0x0FCB */ 0x97FB,0x794A, + /* Array index: 0x0FCB */ 0x9817,0x6B6A, + /* Array index: 0x0FCB */ 0x9818,0x6B6B, + /* Array index: 0x0FCB */ 0x981C,0x6F70, + /* Array index: 0x0FCB */ 0x9821,0x6F6E, + /* Array index: 0x0FCB */ 0x9824,0x7326, + /* Array index: 0x0FCB */ 0x982B,0x6F6F, + /* Array index: 0x0FCB */ 0x982D,0x7324, + /* Array index: 0x0FCB */ 0x9830,0x727E, + /* Array index: 0x0FCB */ 0x9846,0x7628, + /* Array index: 0x0FCB */ 0x9853,0x7770, + /* Array index: 0x0FCB */ 0x9858,0x794C, + /* Array index: 0x0FCB */ 0x985B,0x794D, + /* Array index: 0x0FCB */ 0x985E,0x794B, + /* Array index: 0x0FCB */ 0x9865,0x7B42, + /* Array index: 0x0FCB */ 0x9867,0x7B41, + /* Array index: 0x0FCB */ 0x986B,0x7C24, + /* Array index: 0x0FCB */ 0x98A8,0x5378, + /* Array index: 0x0FCB */ 0x98AF,0x6B6C, + /* Array index: 0x0FCB */ 0x98B1,0x6B6D, + /* Array index: 0x0FCB */ 0x98B3,0x6F71, + /* Array index: 0x0FCB */ 0x98B6,0x7629, + /* Array index: 0x0FCB */ 0x98BA,0x7771, + /* Array index: 0x0FCB */ 0x98BC,0x794E, + /* Array index: 0x0FCB */ 0x98C4,0x7A51, + /* Array index: 0x0FCB */ 0x98DB,0x5379, + /* Array index: 0x0FCB */ 0x98DF,0x537A, + /* Array index: 0x0FCB */ 0x98E2,0x586A, + /* Array index: 0x0FCB */ 0x98E7,0x627D, + /* Array index: 0x0FCB */ 0x98E9,0x6322, + /* Array index: 0x0FCB */ 0x98EA,0x627E, + /* Array index: 0x0FCB */ 0x98ED,0x6324, + /* Array index: 0x0FCB */ 0x98EF,0x6321, + /* Array index: 0x0FCB */ 0x98F2,0x6323, + /* Array index: 0x0FCB */ 0x98F4,0x6766, + /* Array index: 0x0FCB */ 0x9903,0x6B6E, + /* Array index: 0x0FCB */ 0x9905,0x6B6F, + /* Array index: 0x0FCB */ 0x9909,0x6B71, + /* Array index: 0x0FCB */ 0x990A,0x6F72, + /* Array index: 0x0FCB */ 0x990C,0x6B70, + /* Array index: 0x0FCB */ 0x9910,0x7327, + /* Array index: 0x0FCB */ 0x9912,0x6F74, + /* Array index: 0x0FCB */ 0x9913,0x6F73, + /* Array index: 0x0FCB */ 0x9918,0x6F75, + /* Array index: 0x0FCB */ 0x991A,0x732C, + /* Array index: 0x0FCB */ 0x991B,0x732A, + /* Array index: 0x0FCB */ 0x991E,0x7329, + /* Array index: 0x0FCB */ 0x9921,0x732B, + /* Array index: 0x0FCB */ 0x9928,0x7328, + /* Array index: 0x0FCB */ 0x992E,0x7775, + /* Array index: 0x0FCB */ 0x9935,0x762A, + /* Array index: 0x0FCB */ 0x9945,0x794F, + /* Array index: 0x0FCB */ 0x9949,0x7950, + /* Array index: 0x0FCB */ 0x9951,0x7A53, + /* Array index: 0x0FCB */ 0x9952,0x7A52, + /* Array index: 0x0FCB */ 0x9955,0x7C25, + /* Array index: 0x0FCB */ 0x9957,0x7B43, + /* Array index: 0x0FCB */ 0x995C,0x7C50, + /* Array index: 0x0FCB */ 0x995E,0x7D2E, + /* Array index: 0x0FCB */ 0x9996,0x537B, + /* Array index: 0x0FCB */ 0x9999,0x537C, + /* Array index: 0x0FCB */ 0x99A5,0x7776, + /* Array index: 0x0FCB */ 0x99A8,0x7A54, + /* Array index: 0x0FCB */ 0x99B1,0x676A, + /* Array index: 0x0FCB */ 0x99B3,0x6769, + /* Array index: 0x0FCB */ 0x99B4,0x676B, + /* Array index: 0x0FCB */ 0x99C1,0x6B72, + /* Array index: 0x0FCB */ 0x99D5,0x6F7B, + /* Array index: 0x0FCB */ 0x99D9,0x6F7D, + /* Array index: 0x0FCB */ 0x99DB,0x6F79, + /* Array index: 0x0FCB */ 0x99DD,0x6F76, + /* Array index: 0x0FCB */ 0x99DF,0x6F78, + /* Array index: 0x0FCB */ 0x99E2,0x732E, + /* Array index: 0x0FCB */ 0x99ED,0x732D, + /* Array index: 0x0FCB */ 0x99F1,0x732F, + /* Array index: 0x0FCB */ 0x99FF,0x762C, + /* Array index: 0x0FCB */ 0x9A01,0x762B, + /* Array index: 0x0FCB */ 0x9A0E,0x7777, + /* Array index: 0x0FCB */ 0x9A16,0x7951, + /* Array index: 0x0FCB */ 0x9A19,0x7952, + /* Array index: 0x0FCB */ 0x9A2B,0x7A55, + /* Array index: 0x0FCB */ 0x9A30,0x7A56, + /* Array index: 0x0FCB */ 0x9A35,0x7A58, + /* Array index: 0x0FCB */ 0x9A37,0x7A57, + /* Array index: 0x0FCB */ 0x9A3E,0x7B47, + /* Array index: 0x0FCB */ 0x9A40,0x7B46, + /* Array index: 0x0FCB */ 0x9A43,0x7B45, + /* Array index: 0x0FCB */ 0x9A45,0x7B44, + /* Array index: 0x0FCB */ 0x9A4D,0x7C27, + /* Array index: 0x0FCB */ 0x9A55,0x7C26, + /* Array index: 0x0FCB */ 0x9A57,0x7C53, + /* Array index: 0x0FCB */ 0x9A5A,0x7C51, + /* Array index: 0x0FCB */ 0x9A5B,0x7C52, + /* Array index: 0x0FCB */ 0x9A5F,0x7C75, + /* Array index: 0x0FCB */ 0x9A62,0x7D37, + /* Array index: 0x0FCB */ 0x9A65,0x7D38, + /* Array index: 0x0FCB */ 0x9A6A,0x7D47, + /* Array index: 0x0FCB */ 0x9AA8,0x586C, + /* Array index: 0x0FCB */ 0x9AAF,0x6B73, + /* Array index: 0x0FCB */ 0x9AB0,0x6B74, + /* Array index: 0x0FCB */ 0x9AB7,0x6F7E, + /* Array index: 0x0FCB */ 0x9AB8,0x7330, + /* Array index: 0x0FCB */ 0x9ABC,0x7331, + /* Array index: 0x0FCB */ 0x9AC1,0x7778, + /* Array index: 0x0FCB */ 0x9AE1,0x676C, + /* Array index: 0x0FCB */ 0x9AE6,0x6B75, + /* Array index: 0x0FCB */ 0x9AFB,0x7332, + /* Array index: 0x0FCB */ 0x9B03,0x7779, + /* Array index: 0x0FCB */ 0x9B06,0x777A, + /* Array index: 0x0FCB */ 0x9B0D,0x7953, + /* Array index: 0x0FCB */ 0x9B1A,0x7C29, + /* Array index: 0x0FCB */ 0x9B22,0x7C76, + /* Array index: 0x0FCB */ 0x9B23,0x7D30, + /* Array index: 0x0FCB */ 0x9B25,0x586E, + /* Array index: 0x0FCB */ 0x9B27,0x7023, + /* Array index: 0x0FCB */ 0x9B28,0x7334, + /* Array index: 0x0FCB */ 0x9B31,0x7D48, + /* Array index: 0x0FCB */ 0x9B32,0x586F, + /* Array index: 0x0FCB */ 0x9B3C,0x5870, + /* Array index: 0x0FCB */ 0x9B54,0x7B49, + /* Array index: 0x0FCB */ 0x9B58,0x7C77, + /* Array index: 0x0FCB */ 0x9B5A,0x5E23, + /* Array index: 0x0FCB */ 0x9B6F,0x7027, + /* Array index: 0x0FCB */ 0x9B77,0x7026, + /* Array index: 0x0FCB */ 0x9B91,0x7335, + /* Array index: 0x0FCB */ 0x9BC0,0x7824, + /* Array index: 0x0FCB */ 0x9BD6,0x7956, + /* Array index: 0x0FCB */ 0x9BDB,0x7957, + /* Array index: 0x0FCB */ 0x9BE7,0x7955, + /* Array index: 0x0FCB */ 0x9BE8,0x7954, + /* Array index: 0x0FCB */ 0x9BFD,0x7822, + /* Array index: 0x0FCB */ 0x9C0D,0x7A5A, + /* Array index: 0x0FCB */ 0x9C13,0x7A59, + /* Array index: 0x0FCB */ 0x9C25,0x7B4C, + /* Array index: 0x0FCB */ 0x9C2D,0x7B4B, + /* Array index: 0x0FCB */ 0x9C31,0x7C2B, + /* Array index: 0x0FCB */ 0x9C3B,0x7C2D, + /* Array index: 0x0FCB */ 0x9C3E,0x7C2C, + /* Array index: 0x0FCB */ 0x9C49,0x7C2A, + /* Array index: 0x0FCB */ 0x9C54,0x7C57, + /* Array index: 0x0FCB */ 0x9C56,0x7C59, + /* Array index: 0x0FCB */ 0x9C57,0x7C58, + /* Array index: 0x0FCB */ 0x9C5F,0x7C78, + /* Array index: 0x0FCB */ 0x9C77,0x7D40, + /* Array index: 0x0FCB */ 0x9C78,0x7D41, + /* Array index: 0x0FCB */ 0x9CE5,0x5E24, + /* Array index: 0x0FCB */ 0x9CE9,0x676D, + /* Array index: 0x0FCB */ 0x9CF3,0x6B7A, + /* Array index: 0x0FCB */ 0x9CF4,0x6B78, + /* Array index: 0x0FCB */ 0x9CF6,0x6B79, + /* Array index: 0x0FCB */ 0x9D03,0x702A, + /* Array index: 0x0FCB */ 0x9D06,0x7028, + /* Array index: 0x0FCB */ 0x9D09,0x7029, + /* Array index: 0x0FCB */ 0x9D12,0x733A, + /* Array index: 0x0FCB */ 0x9D15,0x7336, + /* Array index: 0x0FCB */ 0x9D1B,0x733B, + /* Array index: 0x0FCB */ 0x9D23,0x7337, + /* Array index: 0x0FCB */ 0x9D26,0x7338, + /* Array index: 0x0FCB */ 0x9D28,0x7339, + /* Array index: 0x0FCB */ 0x9D3B,0x7631, + /* Array index: 0x0FCB */ 0x9D3F,0x7632, + /* Array index: 0x0FCB */ 0x9D51,0x7825, + /* Array index: 0x0FCB */ 0x9D5D,0x7826, + /* Array index: 0x0FCB */ 0x9D60,0x7827, + /* Array index: 0x0FCB */ 0x9D61,0x7959, + /* Array index: 0x0FCB */ 0x9D6A,0x795B, + /* Array index: 0x0FCB */ 0x9D6C,0x795C, + /* Array index: 0x0FCB */ 0x9D72,0x795A, + /* Array index: 0x0FCB */ 0x9D89,0x7958, + /* Array index: 0x0FCB */ 0x9DAF,0x7B4D, + /* Array index: 0x0FCB */ 0x9DB4,0x7B4E, + /* Array index: 0x0FCB */ 0x9DB8,0x7B50, + /* Array index: 0x0FCB */ 0x9DC2,0x7B4F, + /* Array index: 0x0FCB */ 0x9DD3,0x7C2E, + /* Array index: 0x0FCB */ 0x9DD7,0x7C2F, + /* Array index: 0x0FCB */ 0x9DE5,0x7C5A, + /* Array index: 0x0FCB */ 0x9DF9,0x7C79, + /* Array index: 0x0FCB */ 0x9DFA,0x7C7A, + /* Array index: 0x0FCB */ 0x9E1A,0x7D45, + /* Array index: 0x0FCB */ 0x9E1B,0x7D49, + /* Array index: 0x0FCB */ 0x9E1E,0x7D4A, + /* Array index: 0x0FCB */ 0x9E75,0x5E25, + /* Array index: 0x0FCB */ 0x9E79,0x7A5B, + /* Array index: 0x0FCB */ 0x9E7C,0x7C7B, + /* Array index: 0x0FCB */ 0x9E7D,0x7C7C, + /* Array index: 0x0FCB */ 0x9E7F,0x5E26, + /* Array index: 0x0FCB */ 0x9E82,0x676E, + /* Array index: 0x0FCB */ 0x9E8B,0x7633, + /* Array index: 0x0FCB */ 0x9E92,0x795D, + /* Array index: 0x0FCB */ 0x9E93,0x795F, + /* Array index: 0x0FCB */ 0x9E97,0x795E, + /* Array index: 0x0FCB */ 0x9E9D,0x7B51, + /* Array index: 0x0FCB */ 0x9E9F,0x7C5B, + /* Array index: 0x0FCB */ 0x9EA5,0x5E27, + /* Array index: 0x0FCB */ 0x9EA9,0x702B, + /* Array index: 0x0FCB */ 0x9EB4,0x7960, + /* Array index: 0x0FCB */ 0x9EB5,0x7A5C, + /* Array index: 0x0FCB */ 0x9EBB,0x5E28, + /* Array index: 0x0FCB */ 0x9EBC,0x6B7B, + /* Array index: 0x0FCB */ 0x9EBE,0x702C, + /* Array index: 0x0FCB */ 0x9EC3,0x6327, + /* Array index: 0x0FCB */ 0x9ED4,0x733D, + /* Array index: 0x0FCB */ 0x9ED8,0x733C, + /* Array index: 0x0FCB */ 0x9EE8,0x7A5D, + /* Array index: 0x0FCB */ 0x9EEF,0x7B52, + /* Array index: 0x0FCB */ 0x9EF4,0x7C5C, + /* Array index: 0x0FCB */ 0x9EF7,0x7D42, + /* Array index: 0x0FCB */ 0x9F07,0x7C7D, + /* Array index: 0x0FCB */ 0x9F0E,0x676F, + /* Array index: 0x0FCB */ 0x9F13,0x6770, + /* Array index: 0x0FCB */ 0x9F15,0x7829, + /* Array index: 0x0FCB */ 0x9F19,0x7B53, + /* Array index: 0x0FCB */ 0x9F20,0x6771, + /* Array index: 0x0FCB */ 0x9F2C,0x782A, + /* Array index: 0x0FCB */ 0x9F2F,0x7A5E, + /* Array index: 0x0FCB */ 0x9F34,0x7C30, + /* Array index: 0x0FCB */ 0x9F3B,0x6B7C, + /* Array index: 0x0FCB */ 0x9F3E,0x7639, + /* Array index: 0x0FCB */ 0x9F4A,0x6B7D, + /* Array index: 0x0FCB */ 0x9F4B,0x763A, + /* Array index: 0x0FCB */ 0x9F52,0x702F, + /* Array index: 0x0FCB */ 0x9F5C,0x7B54, + /* Array index: 0x0FCB */ 0x9F5F,0x7A5F, + /* Array index: 0x0FCB */ 0x9F61,0x7A61, + /* Array index: 0x0FCB */ 0x9F63,0x7A60, + /* Array index: 0x0FCB */ 0x9F66,0x7B55, + /* Array index: 0x0FCB */ 0x9F67,0x7B56, + /* Array index: 0x0FCB */ 0x9F6A,0x7C32, + /* Array index: 0x0FCB */ 0x9F6C,0x7C31, + /* Array index: 0x0FCB */ 0x9F72,0x7D21, + /* Array index: 0x0FCB */ 0x9F77,0x7C7E, + /* Array index: 0x0FCB */ 0x9F8D,0x733E, + /* Array index: 0x0FCB */ 0x9F90,0x7832, + /* Array index: 0x0FCB */ 0x9F94,0x7C33, + /* Array index: 0x0FCB */ 0x9F9C,0x733F, + /* Array index: 0x0FCB */ 0xFFE0,0x2266, + /* Array index: 0x0FCB */ 0xFFE1,0x2267, + /* Array index: 0x0FCB */ 0xFFE5,0x2264, +}; + +#endif /* ICONV_FROM_UCS_CCS_CNS11643_PLANE1 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * cns11643_plane1 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cns11643_plane1 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CNS11643_PLANE1, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_cns11643_plane1, /* UCS -> cns11643_plane1 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE1) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_cns11643_plane1, /* UCS -> cns11643_plane1 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_cns11643_plane1 /* cns11643_plane1 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_CNS11643_PLANE1) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_cns11643_plane1 /* cns11643_plane1 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE1) || ... */ + diff --git a/lib/iconv/ccs/cns11643_plane14.c b/lib/iconv/ccs/cns11643_plane14.c new file mode 100644 index 0000000..507cdef --- /dev/null +++ b/lib/iconv/ccs/cns11643_plane14.c @@ -0,0 +1,10763 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cns11643_plane14 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit cns11643_plane14 -> UCS speed-optimized table (36864 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_cns11643_plane14[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700, + 0x0800,0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00,0x0F00, + 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700, + 0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00, + 0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, + 0x2800,0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00, + 0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700, + 0x3800,0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00,0x3F00, + 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 34, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E28,0x4E36,0x4E3F,0x4E85,0x4E05,0x4E04,0x5182, + 0x5196,0x5338,0x5369,0x53B6,0x4E2A,0x4E87,0x4E49,0x51E2, + 0x4E46,0x4E8F,0x4EBC,0x4EBE,0x5166,0x51E3,0x5204,0x529C, + INVALC,0x5902,0x590A,0x5B80,0x5DDB,0x5E7A,0x5E7F,0x5EF4, + 0x5F50,0x5F51,0x5F61,0x961D,INVALC,0x4E63,0x4E62,0x4EA3, + 0x5185,0x4EC5,0x4ECF,0x4ECE,0x4ECC,0x5184,0x5186,INVALC, + INVALC,0x51E4,0x5205,0x529E,0x529D,0x52FD,0x5300,0x533A, + INVALC,0x5346,0x535D,0x5386,0x53B7,INVALC,0x53CC,INVALC, + 0x53CE,0x5721,INVALC,0x5E00,0x5F0C,0x6237,0x6238,0x6534, + 0x6535,0x65E0,INVALC,0x738D,0x4E97,0x4EE0,INVALC,INVALC, + 0x4EE7,INVALC,0x4EE6,INVALC,INVALC,INVALC,INVALC,0x56D8, + 0x518B,0x518C,0x5199,0x51E5,INVALC,0x520B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5304,0x5303,0x5307,INVALC,0x531E,0x535F, + 0x536D,0x5389,0x53BA,0x53D0,INVALC,0x53F6,0x53F7,0x53F9, + INVALC,0x53F4,INVALC,INVALC,0x5724,0x5904,0x5918,0x5932, + 0x5930,0x5934,INVALC,0x5975,INVALC,0x5B82,0x5BF9,0x5C14, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E81, + 0x5E83,0x5F0D,0x5F52,INVALC,0x5FCA,0x5FC7,0x6239,INVALC, + 0x624F,0x65E7,0x672F,0x6B7A,0x6C39,INVALC,INVALC,0x6C37, + 0x6C44,0x6C45,0x738C,0x7592,0x7676,0x9093,0x9092,INVALC, + INVALC,0x4E21,0x4E20,0x4E22,0x4E68,0x4E89,0x4E98,0x4EF9, + 0x4EEF,INVALC,INVALC,0x4EF8,0x4F06,0x4F03,0x4EFC,0x4EEE, + 0x4F16,INVALC,0x4F28,0x4F1C,0x4F07,0x4F1A,0x4EFA,0x4F17, + 0x514A,INVALC,0x5172,INVALC,0x51B4,0x51B3,0x51B2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x51E8,INVALC,0x5214,0x520F,0x5215,0x5218, + 0x52A8,INVALC,0x534B,0x534F,INVALC,0x5350,INVALC,0x538B, + INVALC,0x53BE,INVALC,0x53D2,0x5416,0x53FF,INVALC,0x5400, + INVALC,0x5405,0x5413,0x5415,INVALC,INVALC,0x56E3,0x5735, + 0x5736,0x5731,0x5732,0x58EE,0x5905,0x4E54,INVALC,0x5936, + INVALC,INVALC,INVALC,0x597A,INVALC,0x5986,INVALC,INVALC, + 0x5B86,0x5F53,0x5C18,INVALC,0x5C3D,0x5C78,INVALC,INVALC, + INVALC,INVALC,0x5C80,INVALC,0x5E08,INVALC,INVALC,INVALC, + INVALC,0x5EF5,0x5F0E,INVALC,INVALC,INVALC,0x5FD3,0x5FDA, + INVALC,0x5FDB,INVALC,0x620F,0x625D,0x625F,0x6267,0x6257, + 0x9F50,INVALC,0x65EB,0x65EA,INVALC,0x6737,INVALC,0x6732, + 0x6736,0x6B22,0x6BCE,INVALC,0x6C58,0x6C51,0x6C77,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C3C,INVALC,0x6C5A,INVALC,0x6C53,0x706F,0x7072, + 0x706E,INVALC,INVALC,0x7073,0x72B1,0x72B2,INVALC,0x738F, + INVALC,INVALC,INVALC,0x793C,INVALC,0x808D,0x808E,INVALC, + 0x827B,INVALC,0x8D71,0x8FB9,0x9096,0x909A,INVALC,0x4E24, + 0x4E71,INVALC,0x4E9C,0x4F45,0x4F4A,0x4F39,0x4F37,INVALC, + 0x4F32,0x4F42,INVALC,0x4F44,0x4F4B,INVALC,0x4F40,0x4F35, + 0x4F31,0x5151,INVALC,0x5150,0x514E,INVALC,INVALC,0x519D, + INVALC,0x51B5,0x51B8,0x51EC,0x5223,0x5227,0x5226,0x521F, + 0x522B,0x5220,0x52B4,0x52B3,INVALC,0x5325,0x533B,0x5374, + INVALC,INVALC,INVALC,INVALC,INVALC,0x544D,INVALC,INVALC, + 0x543A,INVALC,INVALC,0x5444,0x544C,0x5423,0x541A,0x5432, + 0x544B,0x5421,INVALC,0x5434,0x5449,0x5450,0x5422,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x543F,0x5451,0x545A,0x542F,INVALC,0x56E9,0x56F2, + 0x56F3,0x56EF,0x56ED,0x56EC,0x56E6,0x5748,INVALC,0x5744, + 0x573F,0x573C,0x5753,0x5756,INVALC,0x575F,0x5743,0x5758, + 0x5757,INVALC,INVALC,INVALC,0x5746,INVALC,0x573D,INVALC, + 0x5742,0x5754,0x5755,0x58F1,0x58F2,0x58F0,0x590B,0x9EA6, + 0x56F1,0x593D,INVALC,0x5994,0x598C,INVALC,0x599C,INVALC, + INVALC,0x599F,INVALC,0x599B,INVALC,0x5989,0x599A,INVALC, + 0x6588,INVALC,0x5B8D,INVALC,0x5BFE,0x5BFF,0x5BFD,0x5C2B, + INVALC,0x5C84,0x5C8E,0x5C9C,INVALC,INVALC,0x5C85,0x5DF5, + 0x5E09,INVALC,INVALC,0x5E0B,INVALC,0x5E92,0x5E90,0x5F03, + INVALC,0x5F1E,0x5F63,INVALC,0x5FE7,0x5FFE,0x5FE6,0x5FDC, + 0x5FCE,INVALC,0x5FFC,0x5FDF,0x5FEC,0x5FF6,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5FF2,0x5FF0,0x5FF9,INVALC,0x6213,INVALC,INVALC, + 0x623B,0x623C,0x6282,INVALC,INVALC,INVALC,0x6278,0x628B, + INVALC,0x629E,0x62A5,0x629B,0x629C,0x6299,0x628D,0x6285, + 0x629D,0x6275,INVALC,INVALC,INVALC,0x65F6,INVALC,INVALC, + INVALC,0x66F5,0x675B,INVALC,0x6754,0x6752,INVALC,0x6758, + 0x6744,0x674A,0x6761,INVALC,0x6C7F,0x6C91,0x6C9E,INVALC, + 0x6C6E,0x6C7C,0x6C9F,0x6C75,INVALC,0x6C56,0x6CA2,0x6C79, + INVALC,0x6CA1,INVALC,0x6CAA,0x6CA0,INVALC,0x7079,0x7077, + 0x707E,INVALC,0x7075,0x707B,0x7264,INVALC,0x72BB,0x72BC, + 0x72C7,0x72B9,0x72BE,0x72B6,INVALC,INVALC,0x7398,INVALC, + INVALC,INVALC,INVALC,0x7593,0x7680,INVALC,0x7683,0x76C0, + 0x76C1,INVALC,INVALC,0x77F4,0x77F5,INVALC,0x7ACC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 40, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7ACD,0x7CFA,0x809F,0x8091,0x8097,0x8094,INVALC, + 0x8286,0x828C,INVALC,0x8295,INVALC,0x866C,INVALC,0x8FB5, + 0x8FBE,0x8FC7,INVALC,0x8FC1,0x90A9,0x90A4,INVALC,INVALC, + INVALC,0x90A8,0x9627,0x9626,0x962B,0x9633,0x9634,0x9629, + 0x4E3D,INVALC,0x4E9D,0x4F93,0x4F8A,INVALC,INVALC,0x4F6D, + 0x4F8E,0x4FA0,0x4FA2,0x4FA1,0x4F9F,0x4FA3,INVALC,0x4F72, + INVALC,0x4F8C,0x5156,INVALC,INVALC,0x5190,INVALC,INVALC, + INVALC,0x51ED,0x51FE,0x522F,INVALC,0x523C,0x5234,0x5239, + 0x52B9,0x52B5,0x52BF,0x5355,INVALC,0x5376,0x537A,0x5393, + INVALC,0x53C1,0x53C2,0x53D5,0x5485,INVALC,0x545F,0x5493, + 0x5489,0x5479,0x9EFE,0x548F,0x5469,0x546D,INVALC,0x5494, + 0x546A,0x548A,INVALC,0x56FD,0x56FB,0x56F8,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 41, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x56FC,0x56F6,0x5765,0x5781,0x5763,0x5767,INVALC, + 0x576E,0x5778,0x577F,INVALC,INVALC,0x58F3,0x594B,0x594C, + INVALC,INVALC,INVALC,0x59AD,INVALC,0x59C4,INVALC,0x59C2, + 0x59B0,INVALC,INVALC,INVALC,INVALC,0x59BF,INVALC,0x59C9, + 0x59B8,0x59AC,INVALC,INVALC,INVALC,0x59B7,0x59D7,INVALC, + 0x5B60,INVALC,0x5B96,0x5B9E,0x5B94,0x5B9F,0x5B9D,INVALC, + 0x5C00,0x5C19,INVALC,INVALC,0x5C49,0x5C4A,INVALC,0x5CBB, + 0x5CC1,INVALC,INVALC,INVALC,0x5CB9,0x5C9E,0x5CB4,0x5CBA, + 0x5DF6,0x5E13,0x5E12,0x5E77,INVALC,0x5E98,INVALC,0x5E99, + 0x5E9D,0x5EF8,INVALC,0x5EF9,INVALC,0x5F06,0x5F21,INVALC, + 0x5F25,0x5F55,INVALC,INVALC,INVALC,0x5F84,0x5F83,0x6030, + 0x6007,INVALC,0x6036,INVALC,INVALC,INVALC,0x5FE9,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 42, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x603D,0x6008,INVALC,INVALC,0x62BA,0x62B2,INVALC, + 0x62B7,0x62E4,0x62A7,INVALC,INVALC,INVALC,0x62D5,0x62E1, + 0x62DD,0x62A6,0x62C1,0x62C5,0x62C0,0x62DF,0x62E0,0x62DE, + INVALC,0x6589,INVALC,0x65A6,0x65BA,INVALC,0x65FF,INVALC, + 0x6617,0x6618,0x6601,0x65FE,INVALC,0x670C,INVALC,0x676B, + 0x6796,0x6782,0x678A,INVALC,0x67A3,INVALC,0x67A2,0x678F, + INVALC,0x67F9,0x6780,0x6B26,0x6B27,0x6B68,0x6B69,INVALC, + 0x6B81,0x6BB4,0x6BD1,INVALC,INVALC,0x6C1C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C97,0x6C6C,0x6CDF,INVALC,0x6CEA, + INVALC,0x6CE4,0x6CD8,0x6CB2,0x6CCE,0x6CC8,INVALC,0x708B, + 0x7088,0x7090,0x708F,INVALC,0x7087,0x7089,0x708D,0x7081, + INVALC,0x708C,INVALC,INVALC,0x7240,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 43, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7265,0x7266,0x7268,INVALC,INVALC,0x72CD,0x72D3, + 0x72DB,INVALC,0x72CF,0x73A7,0x73A3,0x739E,INVALC,0x73AF, + INVALC,INVALC,0x73AA,0x739C,INVALC,0x7542,0x7544,0x753B, + 0x7541,INVALC,0x759B,0x759E,INVALC,0x79C4,0x79C3,0x79C6, + INVALC,INVALC,0x79C7,INVALC,0x79CA,INVALC,INVALC,0x7ACF, + 0x7C76,0x7C74,0x7CFF,0x7CFC,INVALC,INVALC,0x7F59,0x80A8, + INVALC,INVALC,0x80B0,INVALC,0x80B3,INVALC,0x80A4,0x80B6, + 0x80A7,0x80AC,INVALC,0x80A6,0x5367,0x820E,0x82C4,0x833E, + 0x829C,INVALC,INVALC,INVALC,INVALC,INVALC,0x82AA,INVALC, + 0x82C9,INVALC,INVALC,0x82A6,0x82B2,INVALC,INVALC,INVALC, + 0x8FCC,0x8FD9,0x8FCA,0x8FD8,0x8FCF,0x90B7,INVALC,0x90AD, + 0x90B9,0x9637,INVALC,0x9641,0x963E,0x96B6,0x9751,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 44, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9763,0x4E57,0x4E79,0x4EB2,0x4EB0,0x4EAF,0x4EB1, + 0x4FD2,0x4FD5,INVALC,0x4FBE,0x4FB8,0x4FB0,0x4FB1,0x4FC8, + INVALC,INVALC,0x4FC6,0x4FCC,0x4FE5,0x4FE3,0x4FB4,0x516A, + INVALC,0x519F,INVALC,0x51C1,INVALC,0x51C2,0x51C3,0x5245, + 0x5248,INVALC,INVALC,0x524F,INVALC,INVALC,0x52C5,0x52CA, + 0x52C4,0x5327,0x5358,0x537D,INVALC,0x53DD,0x53DC,0x53DA, + 0x53D9,0x54B9,INVALC,0x54D0,0x54B4,0x54CA,INVALC,0x54A3, + 0x54DA,0x54A4,INVALC,0x54B2,0x549E,0x549F,0x54B5,INVALC, + INVALC,0x54CD,INVALC,0x54CC,INVALC,0x5700,0x57AC,0x5791, + 0x578E,0x578D,0x5792,0x57A1,0x5790,0x57A6,0x57A8,INVALC, + 0x579C,0x5796,0x57A7,INVALC,INVALC,INVALC,INVALC,0x58F5, + INVALC,0x5909,0x5908,INVALC,0x5952,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 45, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x59DF,INVALC,0x59EB,0x59EF,0x59F0,0x59D5,0x5A0D, + 0x5A04,0x59F9,0x5A02,0x59F8,0x59E2,0x59D9,0x59E7,0x5B6A, + INVALC,INVALC,0x5BAB,INVALC,0x5C1B,0x5C2F,INVALC,0x663C, + INVALC,INVALC,INVALC,0x5CD1,0x5CDC,0x5CE6,0x5CE1,0x5CCD, + INVALC,0x5CE2,0x5CDD,0x5CE5,0x5DFB,0x5DFA,0x5E1E,INVALC, + 0x5EA1,INVALC,INVALC,0x5EFC,0x5EFB,0x5F2F,INVALC,INVALC, + 0x5F66,INVALC,INVALC,INVALC,0x605C,INVALC,0x604E,0x6051, + INVALC,INVALC,0x6023,0x6031,0x607C,0x6052,INVALC,0x6060, + 0x604A,0x6061,INVALC,0x6218,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x631F,0x6317,0x62EA,0x6321,0x6304, + 0x6305,INVALC,0x6531,0x6544,0x6540,INVALC,0x6542,0x65BE, + INVALC,0x6629,0x661B,INVALC,0x6623,0x662C,0x661A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 46, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6630,0x663B,0x661E,0x6637,0x6638,INVALC,0x670E, + INVALC,INVALC,0x67E8,0x67D6,INVALC,0x67C7,0x67BC,0x6852, + 0x67BF,0x67D5,0x67FE,0x8363,0x67FB,INVALC,0x67B1,0x6801, + 0x6805,0x6800,0x67D7,INVALC,0x6B2A,0x6B6B,INVALC,INVALC, + INVALC,INVALC,0x6BE1,INVALC,INVALC,0x6D23,0x6CFF,0x6D14, + 0x6D05,0x6D13,0x6D06,0x6D21,INVALC,0x6D15,0x6CAF,0x6CF4, + 0x6D02,0x6D45,INVALC,0x6D26,INVALC,0x6D44,INVALC,0x6D24, + 0x70A5,INVALC,0x70A3,INVALC,0x70A2,0x70BB,0x70A0,0x70AA, + INVALC,INVALC,0x70A8,0x70B6,0x70B2,0x70A7,INVALC,INVALC, + 0x70B9,0x722E,INVALC,0x723C,INVALC,0x726D,INVALC,INVALC, + 0x72E7,0x72ED,INVALC,0x72EC,0x72E5,0x72E2,INVALC,0x73C4, + 0x73BD,0x73CF,0x73C9,0x73C1,0x73D0,INVALC,0x73CE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 47, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x74ED,0x74EB,INVALC,0x74EF,0x7549,0x7550,0x7546, + 0x754A,INVALC,0x754D,0x75A6,INVALC,INVALC,INVALC,0x75A8, + INVALC,INVALC,0x76C7,0x76FF,INVALC,0x76FD,0x77E6,0x780A, + INVALC,0x7804,0x780B,0x7807,INVALC,0x7815,0x7808,INVALC, + 0x79D3,0x79D4,0x79D0,0x79D7,0x7A7C,INVALC,INVALC,0x7A7D, + 0x7A83,0x7A82,INVALC,0x7AD4,0x7AD5,0x7AD3,0x7AD0,0x7AD2, + 0x7AFE,0x7AFC,0x7C77,0x7C7C,0x7C7B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7F8F,0x80D3,INVALC, + 0x80CB,0x80D2,INVALC,0x8109,0x80E2,0x80DF,0x80C6,INVALC, + 0x8224,0x82F7,0x82D8,0x82DD,INVALC,INVALC,0x82F8,0x82FC, + INVALC,INVALC,0x82E9,INVALC,0x82EE,INVALC,0x82D0,0x830E, + 0x82E2,0x830B,0x82FD,0x5179,0x8676,INVALC,0x8678,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 48, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x8675,0x867D,INVALC,0x8842,0x8866, + INVALC,0x898C,0x8A05,INVALC,0x8A06,INVALC,0x8C9F,INVALC, + 0x8FF1,0x8FE7,0x8FE9,0x8FEF,0x90C2,0x90BC,INVALC,0x90C6, + 0x90C0,INVALC,INVALC,0x90CD,0x90C9,INVALC,0x90C4,INVALC, + 0x9581,INVALC,0x9CEC,0x5032,0x4FF9,0x501D,0x4FFF,0x5004, + 0x4FF0,0x5003,INVALC,0x5002,0x4FFC,0x4FF2,0x5024,0x5008, + 0x5036,0x502E,INVALC,0x5010,0x5038,0x5039,0x4FFD,0x5056, + 0x4FFB,0x51A3,0x51A6,0x51A1,INVALC,INVALC,0x51C7,0x51C9, + 0x5260,0x5264,0x5259,0x5265,0x5267,0x5257,0x5263,INVALC, + 0x5253,INVALC,0x52CF,INVALC,0x52CE,0x52D0,0x52D1,0x52CC, + INVALC,INVALC,INVALC,0x550D,0x54F4,INVALC,0x5513,0x54EF, + 0x54F5,0x54F9,0x5502,0x5500,INVALC,INVALC,0x5518,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x54F0,0x54F6,INVALC,INVALC,0x5519,INVALC,0x5705, + 0x57C9,INVALC,0x57B7,0x57CD,INVALC,INVALC,INVALC,0x57BE, + 0x57BB,INVALC,0x57DB,0x57C8,0x57C4,0x57C5,0x57D1,0x57CA, + 0x57C0,INVALC,INVALC,0x5A21,0x5A2A,INVALC,0x5A1D,INVALC, + 0x5A0B,INVALC,INVALC,INVALC,INVALC,0x5A22,INVALC,INVALC, + 0x5A24,INVALC,0x5A14,0x5A31,INVALC,0x5A2F,0x5A1A,0x5A12, + INVALC,INVALC,0x5A26,INVALC,INVALC,0x5BBC,0x5BBB,0x5BB7, + 0x5C05,0x5C06,0x5C52,0x5C53,INVALC,INVALC,0x5CFA,0x5CEB, + INVALC,0x5CF3,0x5CF5,0x5CE9,0x5CEF,INVALC,0x5E2A,0x5E30, + 0x5E2E,0x5E2C,0x5E2F,0x5EAF,0x5EA9,INVALC,0x5EFD,0x5F32, + 0x5F8E,0x5F93,0x5F8F,0x604F,0x6099,INVALC,0x607E,INVALC, + 0x6074,0x604B,0x6073,0x6075,INVALC,INVALC,0x6056,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x60A9,0x608B,0x60A6,INVALC,0x6093,0x60AE,0x609E, + 0x60A7,0x6245,INVALC,INVALC,0x632E,INVALC,0x6352,0x6330, + 0x635B,INVALC,0x6319,0x631B,INVALC,0x6331,0x635D,0x6337, + 0x6335,0x6353,INVALC,0x635C,0x633F,0x654B,INVALC,INVALC, + 0x658B,INVALC,0x659A,0x6650,0x6646,0x664E,0x6640,INVALC, + 0x664B,0x6648,INVALC,0x6660,0x6644,0x664D,INVALC,0x6837, + 0x6824,INVALC,INVALC,0x681B,0x6836,INVALC,0x682C,0x6819, + 0x6856,0x6847,0x683E,0x681E,INVALC,0x6815,0x6822,0x6827, + 0x6859,0x6858,0x6855,0x6830,0x6823,0x6B2E,0x6B2B,0x6B30, + 0x6B6C,INVALC,0x6B8B,INVALC,0x6BE9,0x6BEA,0x6BE5,0x6D6B, + INVALC,INVALC,0x6D73,0x6D57,INVALC,INVALC,0x6D5D,0x6D56, + 0x6D8F,0x6D5B,0x6D1C,0x6D9A,0x6D9B,0x6D99,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D81,0x6D71,INVALC,INVALC,0x6D72,0x6D5C,0x6D96, + 0x70C4,0x70DB,0x70CC,0x70D0,0x70E3,0x70DF,INVALC,0x70D6, + 0x70EE,0x70D5,INVALC,INVALC,INVALC,INVALC,0x727A,INVALC, + 0x72F5,0x7302,INVALC,INVALC,0x73E2,0x73EC,0x73D5,0x73F9, + 0x73DF,0x73E6,INVALC,INVALC,INVALC,INVALC,0x73E4,0x73E1, + 0x74F3,INVALC,INVALC,INVALC,INVALC,0x7556,0x7555,0x7558, + 0x7557,0x755E,0x75C3,INVALC,INVALC,0x75B4,INVALC,0x75B1, + INVALC,INVALC,0x76CB,0x76CC,0x772A,INVALC,0x7716,0x770F, + INVALC,INVALC,0x773F,0x772B,0x770E,0x7724,INVALC,0x7721, + 0x7718,0x77DD,INVALC,INVALC,0x7824,0x7836,INVALC,0x7958, + 0x7959,INVALC,0x7962,0x79DA,0x79D9,INVALC,0x79E1,0x79E5, + 0x79E8,0x79DB,INVALC,0x79E2,0x79F0,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7ADA,0x7ADD,INVALC,0x7ADB,0x7ADC, + INVALC,INVALC,0x7B0D,0x7B0B,0x7B14,0x7C8E,0x7C86,INVALC, + 0x7C87,0x7C83,0x7C8B,INVALC,INVALC,INVALC,INVALC,0x7D24, + INVALC,INVALC,INVALC,0x7D25,0x7F62,0x7F93,0x7F99,0x7F97, + INVALC,INVALC,0x7FC4,0x7FC6,0x800A,INVALC,INVALC,0x8040, + 0x803C,0x803B,0x80F6,0x80FF,0x80EE,0x8104,0x8103,0x8107, + INVALC,INVALC,0x80F7,INVALC,INVALC,0x822D,INVALC,0x8227, + 0x8229,0x831F,0x8357,INVALC,INVALC,INVALC,INVALC,0x8321, + INVALC,INVALC,0x8318,0x8358,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8684,0x869F,0x869B,0x8689,0x86A6,0x8692,0x868F, + 0x86A0,0x884F,0x8878,0x887A,0x886E,0x887B,0x8884,0x8873, + INVALC,INVALC,0x8A0D,0x8A0B,0x8A19,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 53, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x8FF9,0x9009,0x9008, + INVALC,0x90DE,0x9151,INVALC,INVALC,0x91DB,0x91DF,0x91DE, + 0x91D6,0x91E0,0x9585,0x9660,0x9659,INVALC,0x9656,INVALC, + INVALC,0x96BD,INVALC,INVALC,0x5042,0x5059,INVALC,0x5044, + 0x5066,0x5052,0x5054,0x5071,0x5050,0x507B,0x507C,0x5058, + INVALC,INVALC,0x5079,0x506C,0x5078,0x51A8,0x51D1,0x51CF, + 0x5268,0x5276,0x52D4,INVALC,0x53A0,0x53C4,INVALC,0x5558, + 0x554C,0x5568,INVALC,0x5549,INVALC,INVALC,0x555D,0x5529, + INVALC,0x5554,0x5553,INVALC,0x555A,INVALC,0x553A,0x553F, + 0x552B,0x57EA,INVALC,0x57EF,INVALC,INVALC,0x57DD,0x57FE, + INVALC,0x57DE,0x57E6,INVALC,0x57E8,0x57FF,0x5803,0x58F7, + 0x68A6,0x591F,INVALC,0x595B,0x595D,0x595E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 54, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A2B,INVALC,0x5A3B,INVALC,INVALC,0x5A61, + 0x5A3A,0x5A6E,0x5A4B,0x5A6B,INVALC,INVALC,0x5A45,0x5A4E, + 0x5A68,0x5A3D,0x5A71,0x5A3F,0x5A6F,0x5A75,INVALC,0x5A73, + 0x5A2C,0x5A59,0x5A54,0x5A4F,0x5A63,INVALC,INVALC,0x5BC8, + INVALC,0x5BC3,INVALC,0x5C5B,0x5C61,INVALC,0x5D21,0x5D0A, + 0x5D09,INVALC,0x5D2C,0x5D08,INVALC,INVALC,0x5D2A,0x5D15, + INVALC,0x5D10,0x5D13,INVALC,0x5D2F,0x5D18,INVALC,0x5DE3, + 0x5E39,0x5E35,0x5E3A,0x5E32,INVALC,INVALC,INVALC,INVALC, + 0x5EBB,0x5EBA,0x5F34,0x5F39,INVALC,INVALC,INVALC,INVALC, + 0x6098,INVALC,0x60D0,INVALC,INVALC,INVALC,0x60D7,0x60AA, + INVALC,0x60A1,0x60A4,INVALC,0x60EE,INVALC,0x60E7,INVALC, + INVALC,0x60DE,INVALC,INVALC,0x637E,0x638B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 55, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6379,0x6386,0x6393,INVALC,0x6373,0x636A, + INVALC,0x636C,INVALC,0x637F,INVALC,0x63B2,0x63BA,INVALC, + INVALC,0x6366,0x6374,INVALC,0x655A,INVALC,0x654E,0x654D, + 0x658D,0x658E,0x65AD,INVALC,0x65C7,0x65CA,INVALC,0x65C9, + INVALC,0x65E3,0x6657,INVALC,0x6663,0x6667,0x671A,0x6719, + 0x6716,INVALC,INVALC,0x689E,0x68B6,0x6898,0x6873,INVALC, + 0x689A,0x688E,0x68B7,0x68DB,0x68A5,0x686C,0x68C1,0x6884, + INVALC,INVALC,0x6895,0x687A,0x6899,INVALC,0x68B8,0x68B9, + 0x6870,INVALC,0x6B35,INVALC,0x6B90,0x6BBB,0x6BED,INVALC, + INVALC,INVALC,0x6DC1,0x6DC3,0x6DCE,INVALC,INVALC,0x6DAD, + 0x6E04,INVALC,0x6DB9,INVALC,0x6DE7,INVALC,0x6E08,0x6E06, + INVALC,0x6E0A,0x6DB0,INVALC,0x6DF8,0x6E0C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 56, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6DB1,INVALC,0x6E02,0x6E07,0x6E09,0x6E01,0x6E17, + 0x6DFF,0x6E12,INVALC,INVALC,0x7103,0x7107,0x7101,0x70F5, + 0x70F1,0x7108,0x70F2,0x710F,INVALC,0x70FE,INVALC,INVALC, + INVALC,0x731A,0x7310,0x730E,0x7402,0x73F3,INVALC,INVALC, + 0x73FB,INVALC,INVALC,INVALC,0x751B,0x7523,0x7561,0x7568, + INVALC,0x7567,0x75D3,INVALC,INVALC,0x7690,INVALC,INVALC, + 0x76D5,0x76D7,0x76D6,0x7730,INVALC,0x7726,INVALC,0x7740, + INVALC,0x771E,INVALC,INVALC,INVALC,0x7847,INVALC,0x784B, + 0x7851,0x784F,0x7842,0x7846,INVALC,0x796E,0x796C,0x79F2, + INVALC,0x79F1,0x79F5,0x79F3,0x79F9,INVALC,INVALC,INVALC, + 0x7A9A,0x7A93,0x7A91,0x7AE1,INVALC,INVALC,0x7B21,0x7B1C, + 0x7B16,0x7B17,0x7B36,0x7B1F,INVALC,0x7C93,0x7C99,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 57, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C9A,0x7C9C,INVALC,0x7D49,INVALC,0x7D34,0x7D37, + INVALC,0x7D2D,INVALC,0x7D4C,INVALC,INVALC,0x7D48,INVALC, + INVALC,0x7F3B,INVALC,INVALC,INVALC,INVALC,0x8008,0x801A, + INVALC,0x801D,INVALC,0x8049,0x8045,0x8044,0x7C9B,INVALC, + INVALC,0x812A,0x812E,INVALC,INVALC,0x8131,INVALC,0x811A, + 0x8134,0x8117,INVALC,INVALC,INVALC,0x831D,0x8371,0x8384, + 0x8380,0x8372,0x83A1,INVALC,0x8379,0x8391,INVALC,0x839F, + 0x83AD,INVALC,INVALC,0x8323,INVALC,0x8385,0x839C,0x83B7, + 0x8658,0x865A,INVALC,0x8657,0x86B2,INVALC,0x86AE,INVALC, + INVALC,INVALC,0x8845,0x889C,0x8894,0x88A3,0x888F,0x88A5, + 0x88A9,0x88A6,0x888A,0x88A0,0x8890,0x8992,0x8991,0x8994, + INVALC,0x8A26,0x8A32,0x8A28,INVALC,INVALC,0x8A1C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 58, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x8A2B,0x8A20,INVALC,0x8A29,INVALC,INVALC, + INVALC,0x8A21,0x8C3A,INVALC,0x8C5B,0x8C58,0x8C7C,INVALC, + 0x8CA6,0x8CAE,0x8CAD,0x8D65,INVALC,0x8D7E,INVALC,0x8D7C, + 0x8D7F,0x8D7A,0x8DBD,INVALC,INVALC,0x8DC0,0x8DBB,0x8EAD, + 0x8EAF,0x8ED6,INVALC,INVALC,INVALC,INVALC,INVALC,0x8ED9, + INVALC,INVALC,0x9012,0x900E,0x9025,INVALC,0x9013,0x90EE, + INVALC,0x90AB,0x90F7,INVALC,0x9159,0x9154,0x91F2,0x91F0, + 0x91E5,0x91F6,INVALC,INVALC,0x9587,INVALC,0x965A,INVALC, + INVALC,0x966E,INVALC,INVALC,INVALC,0x9679,INVALC,0x98E1, + 0x98E6,INVALC,0x9EC4,0x9ED2,0x4E80,INVALC,0x4E81,0x508F, + 0x5097,0x5088,0x5089,INVALC,INVALC,0x5081,0x5160,INVALC, + INVALC,0x5E42,0x51D3,INVALC,INVALC,0x51D2,0x51D6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 59, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5273,INVALC,0x5270,INVALC,INVALC,INVALC,0x53A8, + 0x53A6,0x53C5,0x5597,0x55DE,INVALC,INVALC,0x5596,0x55B4, + INVALC,0x5585,INVALC,0x559B,0x55A0,INVALC,0x5559,INVALC, + 0x5586,INVALC,INVALC,0x55AF,0x557A,INVALC,INVALC,INVALC, + 0x559E,INVALC,0x55A9,0x570F,0x570E,0x581A,INVALC,0x581F, + INVALC,0x583C,0x5818,0x583E,0x5826,INVALC,0x583A,INVALC, + 0x5822,INVALC,0x58FB,0x5963,0x5964,INVALC,0x5AA8,0x5AA3, + 0x5A82,0x5A88,0x5AA1,0x5A85,0x5A98,INVALC,0x5A99,INVALC, + 0x5A89,0x5A81,0x5A96,0x5A80,INVALC,INVALC,0x5A91,INVALC, + INVALC,INVALC,INVALC,0x5ACF,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A87,0x5AA0,INVALC,0x5A79,INVALC,0x5A86, + 0x5AAB,0x5AAA,0x5AA4,0x5A8D,0x5A7E,INVALC,0x5BD5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 60, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C1E,0x5C5F,0x5C5E,0x5D44, + 0x5D3E,INVALC,0x5D48,0x5D1C,INVALC,0x5D5B,0x5D4D,INVALC, + INVALC,0x5D57,INVALC,0x5D53,0x5D4F,INVALC,0x5D3B,0x5D46, + INVALC,INVALC,0x5E46,0x5E47,INVALC,0x5E48,0x5EC0,0x5EBD, + 0x5EBF,INVALC,0x5F11,INVALC,0x5F3E,0x5F3B,INVALC,0x5F3A, + INVALC,INVALC,INVALC,0x5FA7,INVALC,0x60EA,INVALC,0x6107, + 0x6122,0x610C,INVALC,INVALC,0x60B3,0x60D6,0x60D2,INVALC, + 0x60E3,0x60E5,0x60E9,INVALC,INVALC,0x6111,0x60FD,INVALC, + INVALC,0x611E,0x6120,0x6121,0x621E,INVALC,0x63E2,0x63DE, + 0x63E6,INVALC,INVALC,INVALC,INVALC,0x63F8,INVALC,0x63FE, + 0x63C1,0x63BF,0x63F7,0x63D1,0x655F,0x6560,0x6561,INVALC, + INVALC,0x65D1,INVALC,INVALC,0x667D,0x666B,0x667F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 61, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6673,0x6681,0x666D,0x6669,INVALC, + INVALC,0x671E,0x68ED,INVALC,INVALC,INVALC,INVALC,0x6903, + INVALC,0x68FE,0x68E5,0x691E,0x6902,INVALC,INVALC,0x6909, + 0x68CA,0x6900,INVALC,0x6901,0x6918,0x68E2,0x68CF,INVALC, + 0x692E,0x68C5,0x68FF,INVALC,0x691C,0x68C3,INVALC,0x6B6F, + INVALC,0x6B6E,INVALC,0x6BBE,INVALC,0x6BF4,0x6C2D,INVALC, + 0x6DB6,0x6E75,0x6E1E,INVALC,0x6E18,INVALC,0x6E48,INVALC, + 0x6E4F,INVALC,0x6E42,0x6E6A,0x6E70,0x6DFE,INVALC,INVALC, + 0x6E6D,INVALC,0x6E7B,0x6E7E,0x6E59,INVALC,0x6E57,INVALC, + 0x6E80,0x6E50,INVALC,0x6E29,0x6E76,0x6E2A,0x6E4C,0x712A, + INVALC,0x7135,0x712C,0x7137,0x711D,INVALC,INVALC,0x7138, + INVALC,0x7134,0x712B,0x7133,0x7127,0x7124,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 62, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x712D,0x7232,0x7283,0x7282,0x7287,0x7306,0x7324, + 0x7338,0x732A,0x732C,0x732B,INVALC,0x732F,0x7328,0x7417, + INVALC,INVALC,0x7419,0x7438,INVALC,0x741F,0x7414,0x743C, + 0x73F7,0x741C,0x7415,0x7418,0x7439,0x74F9,0x7524,INVALC, + INVALC,INVALC,0x756E,0x756D,0x7571,0x758E,INVALC,0x75E5, + INVALC,INVALC,INVALC,INVALC,0x7694,0x76B3,INVALC,0x76D9, + INVALC,0x7748,0x7749,0x7743,INVALC,INVALC,0x7742,0x77DF, + INVALC,0x7863,0x7876,INVALC,0x785F,0x7866,0x7966,0x7971, + INVALC,INVALC,0x7976,0x7984,0x7975,0x79FF,0x7A07,INVALC, + 0x7A0E,0x7A09,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7AE7,0x7AE2,0x7B55,INVALC,INVALC,0x7B43,0x7B57,0x7B6C, + 0x7B42,0x7B53,INVALC,0x7B41,INVALC,INVALC,0x7CA7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 63, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7CA0,0x7CA6,0x7CA4,0x7D74,INVALC,0x7D59,INVALC, + 0x7D60,0x7D57,0x7D6C,0x7D7E,0x7D64,INVALC,0x7D5A,0x7D5D, + INVALC,INVALC,INVALC,0x7D76,0x7D4D,0x7D75,INVALC,0x7FD3, + 0x7FD6,INVALC,INVALC,0x8060,0x804E,0x8145,0x813B,INVALC, + 0x8148,0x8142,0x8149,0x8140,0x8114,0x8141,INVALC,0x81EF, + 0x81F6,0x8203,INVALC,0x83ED,INVALC,0x83DA,0x8418,0x83D2, + 0x8408,INVALC,0x8400,INVALC,INVALC,INVALC,0x8417,0x8346, + 0x8414,0x83D3,0x8405,0x841F,0x8402,0x8416,0x83CD,0x83E6, + INVALC,0x865D,0x86D5,0x86E1,INVALC,INVALC,INVALC,INVALC, + 0x86EE,0x8847,0x8846,INVALC,INVALC,0x88BB,INVALC,0x88BF, + 0x88B4,INVALC,0x88B5,INVALC,0x899A,0x8A43,INVALC,INVALC, + 0x8A5A,INVALC,INVALC,INVALC,0x8A35,0x8A38,0x8A42,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 64, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8A49,0x8A5D,0x8A4B,0x8A3D,INVALC,INVALC,INVALC, + INVALC,0x8C60,0x8C5E,0x8C7F,0x8C7E,0x8C83,INVALC,0x8CB1, + 0x8D87,INVALC,INVALC,0x8D88,0x8D83,INVALC,INVALC,0x8D86, + 0x8D8B,0x8D82,0x8DCA,0x8DD2,INVALC,INVALC,0x8DD4,0x8DC9, + 0x8EB0,INVALC,INVALC,INVALC,0x8EF2,0x8EE4,0x8EF3,0x8EEA, + INVALC,0x8EFD,INVALC,0x8F9D,0x902B,0x902A,INVALC,0x9028, + 0x9029,0x902C,INVALC,INVALC,0x903A,0x9030,0x9037,0x903B, + INVALC,0x910A,INVALC,INVALC,INVALC,0x91FE,0x9220,INVALC, + 0x920B,INVALC,0x9218,0x9222,INVALC,0x921B,0x9208,INVALC, + 0x920E,0x9213,INVALC,INVALC,0x9595,INVALC,INVALC,INVALC, + 0x968C,0x967B,0x967F,0x9681,INVALC,0x9682,INVALC,INVALC, + INVALC,INVALC,INVALC,0x96EE,0x96ED,INVALC,0x96EC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 65, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x975F,0x976F,INVALC,0x976D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x98F0,INVALC,INVALC,INVALC,0x9AA9, + INVALC,INVALC,0x9AE0,0x4EB7,INVALC,INVALC,0x50CC,0x50BC, + INVALC,0x50AA,0x50B9,INVALC,0x50AB,0x50C3,0x50CD,0x517E, + 0x527E,0x5279,INVALC,INVALC,0x52E1,0x52E0,0x52E7,0x5380, + 0x53AB,0x53AA,0x53A9,0x53E0,0x55EA,INVALC,0x55D7,INVALC, + INVALC,0x55C1,0x5715,INVALC,0x586C,INVALC,0x585C,0x5850, + 0x5861,0x586A,0x5869,0x5856,0x5860,0x5866,0x585F,0x5923, + 0x5966,0x5968,INVALC,INVALC,0x5ACE,INVALC,0x5AC5,0x5AC3, + INVALC,INVALC,0x5AD0,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B74,0x5B76,0x5BDC,0x5BD7,0x5BDA,0x5BDB,INVALC, + 0x5C20,0x5D6D,0x5D66,INVALC,0x5D64,0x5D6E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 66, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D60,0x5F42,0x5F5A,0x5F6E,INVALC,INVALC,0x6130, + 0x613A,0x612A,0x6143,0x6119,0x6131,INVALC,0x613D,INVALC, + INVALC,INVALC,0x6408,0x6432,0x6438,INVALC,0x6431,INVALC, + 0x6419,INVALC,0x6411,INVALC,INVALC,0x6429,0x641D,INVALC, + INVALC,INVALC,0x643C,INVALC,0x6446,0x6447,INVALC,INVALC, + 0x643A,0x6407,INVALC,0x656B,INVALC,0x6570,0x656D,INVALC, + 0x65E4,0x6693,INVALC,INVALC,INVALC,INVALC,0x668F,INVALC, + INVALC,0x6692,INVALC,0x668E,INVALC,0x6946,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6931,INVALC,INVALC, + 0x693E,INVALC,0x697C,0x6943,INVALC,0x6973,INVALC,0x6955, + INVALC,INVALC,0x6985,0x694D,0x6950,0x6947,0x6967,0x6936, + 0x6964,0x6961,INVALC,0x697D,0x6B44,0x6B40,0x6B71,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 67, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B73,0x6B9C,INVALC,INVALC,INVALC,0x6BC1,INVALC, + 0x6BFA,0x6C31,0x6C32,INVALC,INVALC,0x6EB8,0x6EA8,INVALC, + 0x6E91,0x6EBB,INVALC,0x6E9A,INVALC,INVALC,0x6EA9,INVALC, + INVALC,0x6EB5,0x6E6C,0x6EE8,INVALC,0x6EDD,0x6EDA,0x6EE6, + 0x6EAC,INVALC,INVALC,INVALC,0x6ED9,0x6EE3,0x6EE9,0x6EDB, + INVALC,0x716F,INVALC,INVALC,0x7148,INVALC,0x714A,0x716B, + INVALC,0x714F,0x7157,0x7174,INVALC,INVALC,INVALC,0x7145, + 0x7151,0x716D,INVALC,0x7251,0x7250,0x724E,INVALC,0x7341, + INVALC,0x732E,0x7346,INVALC,0x7427,INVALC,0x7448,0x7453, + 0x743D,INVALC,0x745D,0x7456,INVALC,0x741E,0x7447,0x7443, + 0x7458,0x7449,INVALC,0x744C,0x7445,0x743E,INVALC,0x7501, + 0x751E,INVALC,INVALC,0x757A,0x75EE,0x7602,0x7697,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 68, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7698,INVALC,INVALC,INVALC,0x775D,0x7764,0x7753, + 0x7758,0x7882,0x7890,0x788A,INVALC,0x787A,0x787D,INVALC, + 0x788B,0x7878,INVALC,INVALC,0x788D,0x7888,0x7892,0x7881, + 0x797E,0x7983,INVALC,INVALC,INVALC,0x7980,INVALC,INVALC, + INVALC,0x7A0F,INVALC,INVALC,0x7A1D,INVALC,0x7AA1,0x7AA4, + INVALC,0x7AE9,0x7AEA,INVALC,0x7B62,0x7B6B,INVALC,0x7B5E, + INVALC,0x7B79,INVALC,INVALC,0x7B6F,0x7B68,INVALC,INVALC, + 0x7CAE,INVALC,INVALC,INVALC,0x7CB0,INVALC,0x7D90,INVALC, + 0x7D8A,INVALC,0x7D8B,0x7D99,0x7D95,INVALC,0x7D87,0x7D78, + 0x7D97,0x7D89,0x7D98,INVALC,INVALC,INVALC,0x7FA3,INVALC, + INVALC,INVALC,0x7FDD,0x8057,INVALC,0x8163,0x816A,0x816C, + INVALC,INVALC,INVALC,0x815D,0x8175,INVALC,0x815F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 69, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x817D,0x816D,INVALC,INVALC,0x8241,0x844F, + 0x8484,INVALC,0x847F,INVALC,0x8448,0x842A,0x847B,0x8472, + 0x8464,0x842E,0x845C,0x8453,INVALC,0x8441,0x84C8,INVALC, + 0x8462,0x8480,0x843E,0x8483,0x8471,INVALC,0x844A,0x8455, + 0x8458,INVALC,INVALC,INVALC,0x86FC,0x86FD,0x8715,INVALC, + 0x8716,0x86FF,INVALC,INVALC,INVALC,0x8858,0x88CF,0x88E0, + INVALC,INVALC,INVALC,INVALC,0x89E7,0x8A6A,0x8A80,INVALC, + 0x8A6F,0x8A65,INVALC,0x8A78,0x8A7D,0x8A88,INVALC,INVALC, + 0x8A64,0x8A7E,INVALC,0x8A67,0x8C63,0x8C88,INVALC,0x8CCD, + INVALC,0x8CC9,INVALC,0x8DED,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x8EB1,INVALC,INVALC,0x8F04,0x8F9E, + 0x8FA0,0x9043,0x9046,0x9048,0x9045,0x9040,0x904C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 70, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x910C,0x9113,0x9115,INVALC,0x916B, + 0x9167,0x925D,0x9255,0x9235,INVALC,0x9259,0x922F,0x923C, + 0x928F,0x925C,0x926A,0x9262,0x925F,0x926B,0x926E,0x923B, + 0x9244,0x9241,0x959A,INVALC,0x9599,INVALC,INVALC,INVALC, + 0x968F,INVALC,0x9696,INVALC,INVALC,INVALC,0x96F4,0x96FC, + INVALC,0x9755,INVALC,0x9779,INVALC,INVALC,INVALC,0x97EE, + 0x97F5,INVALC,0x980B,INVALC,0x98F3,INVALC,INVALC,0x98F7, + 0x98FF,0x98F5,INVALC,0x98EC,0x98F1,INVALC,INVALC,0x999A, + INVALC,0x9AE2,0x9B3D,0x9B5D,0x9CE8,INVALC,0x9CEB,0x9CEF, + 0x9CEE,0x9E81,0x9F14,0x50D0,0x50D9,0x50DC,0x50D8,INVALC, + 0x50E1,0x50EB,INVALC,INVALC,0x50F4,0x50E2,0x50DE,INVALC, + INVALC,INVALC,0x51F4,INVALC,INVALC,INVALC,0x52ED,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 71, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x52EA,INVALC,0x5332,INVALC,0x53AE,0x53B0,INVALC, + 0x55FB,0x5603,0x560B,INVALC,0x5607,INVALC,0x55F8,INVALC, + 0x5628,0x561E,INVALC,0x5618,0x5611,0x5651,0x5605,0x5717, + 0x5892,INVALC,0x588C,INVALC,0x5878,0x5884,0x5873,0x58AD, + 0x5897,0x5895,0x5877,0x5872,0x5896,0x588D,0x5910,INVALC, + 0x596C,INVALC,0x5AE7,INVALC,0x5AE4,INVALC,INVALC,0x5AEF, + 0x5626,INVALC,INVALC,0x5AF0,0x5D7B,INVALC,0x5D83,INVALC, + INVALC,0x5D8B,0x5D8C,INVALC,0x5D78,0x5E52,INVALC,INVALC, + 0x5ED0,0x5ECF,INVALC,0x5FB3,0x5FB4,INVALC,INVALC,INVALC, + 0x617B,INVALC,0x616F,0x6181,0x613C,0x6142,0x6138,0x6133, + INVALC,0x6160,0x6169,0x617D,0x6186,0x622C,0x6228,INVALC, + 0x644C,INVALC,0x6457,0x647C,INVALC,INVALC,0x6455,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 72, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6462,0x6471,0x646A,0x6456,0x643B,0x6481,INVALC, + 0x644F,0x647E,0x6464,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6571,INVALC,INVALC,0x66A5,0x669A,0x669C,INVALC,0x66A6, + INVALC,0x66A4,0x698F,0x69C5,0x69C8,0x6992,0x69B2,INVALC, + INVALC,INVALC,0x69E3,0x69C0,0x69D6,0x69D1,0x699F,0x69A2, + 0x69D2,INVALC,INVALC,INVALC,0x69E1,0x69D5,0x699D,INVALC, + INVALC,0x6998,INVALC,0x6B74,0x6BA1,INVALC,0x6EF0,0x6EF3, + INVALC,INVALC,0x6F1B,0x6F0C,0x6F1D,0x6F34,0x6F28,0x6F17, + INVALC,0x6F44,0x6F42,0x6F04,0x6F11,0x6EFA,0x6F4A,0x7191, + 0x718E,INVALC,0x718B,0x718D,0x717F,0x718C,0x717E,0x717C, + 0x7183,INVALC,0x7188,INVALC,INVALC,0x7294,INVALC,0x7355, + 0x7353,0x734F,0x7354,0x746C,0x7465,0x7466,0x7461,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 73, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x746B,0x7468,0x7476,INVALC,0x7460,INVALC,0x7474, + 0x7506,0x760E,INVALC,0x7607,INVALC,INVALC,0x76B9,INVALC, + 0x76B7,0x76E2,INVALC,0x7774,0x7777,0x7776,0x7775,INVALC, + 0x7778,0x7771,INVALC,0x777A,0x715B,0x777B,0x78A6,0x78AE, + 0x78B8,INVALC,INVALC,INVALC,0x78B1,0x78AF,INVALC,0x7989, + 0x7987,INVALC,INVALC,0x7A29,INVALC,0x7A2A,INVALC,0x7A2D, + 0x7A2C,INVALC,0x7A32,INVALC,0x7AEC,0x7AF0,0x7B81,0x7B9E, + 0x7B83,INVALC,0x7B92,INVALC,0x7BA3,0x7B9F,0x7B93,INVALC, + 0x7B86,0x7CB8,0x7CB7,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7DC8,0x7DB6,INVALC,0x7DD1,INVALC,0x7DA8,0x7DAB,INVALC, + 0x7DB3,0x7DCD,INVALC,0x7DCF,0x7DA4,INVALC,INVALC,0x7F41, + 0x7F6F,0x7F71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 74, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x8023,0x805B,INVALC,0x8061,0x805F,0x8181, + INVALC,INVALC,0x8184,0x8213,INVALC,0x824A,0x824C,INVALC, + INVALC,INVALC,0x84BD,0x8495,INVALC,0x8492,0x84C3,INVALC, + 0x8496,0x84A5,0x84B5,0x84B3,0x84A3,0x84E4,0x84D8,0x84D5, + INVALC,0x84B7,0x84AD,0x84DA,0x8493,0x8736,INVALC,INVALC, + INVALC,0x873D,0x872B,0x8747,0x8739,INVALC,0x8745,0x871D, + INVALC,0x88FF,0x88EA,INVALC,0x88F5,INVALC,0x8900,0x88ED, + 0x8903,0x88E9,INVALC,INVALC,0x89EA,INVALC,0x8A9B,0x8A8E, + 0x8AA2,INVALC,0x8A9C,0x8A94,0x8A90,0x8AA9,0x8AAC,INVALC, + 0x8A9F,INVALC,INVALC,0x8A9D,INVALC,0x8C67,INVALC,INVALC, + 0x8CD0,0x8CD6,0x8CD4,0x8D98,0x8D9A,0x8D97,INVALC,INVALC, + INVALC,0x8E0B,0x8E08,0x8E01,0x8EB4,0x8EB3,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 75, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8FA1,0x8FA2,INVALC,0x905A,INVALC,0x9061,0x905F, + INVALC,INVALC,0x9125,0x917B,0x9176,0x917C,INVALC,0x9289, + 0x92F6,0x92B1,0x92AD,0x9292,0x9281,0x9284,INVALC,0x92AE, + 0x9290,0x929E,INVALC,INVALC,INVALC,0x95A2,0x95A7,INVALC, + INVALC,INVALC,INVALC,INVALC,0x96A0,0x969D,0x969F,0x96D0, + INVALC,0x96D1,INVALC,INVALC,0x9759,INVALC,0x9764,INVALC, + INVALC,INVALC,0x9819,INVALC,0x9814,0x9815,0x981A,INVALC, + INVALC,INVALC,INVALC,0x9906,INVALC,0x98F8,0x9901,INVALC, + 0x99BE,0x99BC,0x99B7,0x99B6,0x99C0,INVALC,0x99B8,INVALC, + INVALC,INVALC,0x99C4,INVALC,0x99BF,INVALC,0x9ADA,0x9AE4, + 0x9AE9,0x9AE8,0x9AEA,0x9AE5,INVALC,0x9B26,INVALC,INVALC, + 0x9B40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 76, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x9EBD,INVALC,INVALC,INVALC,INVALC,0x510E, + INVALC,0x50F7,INVALC,0x50FC,0x510D,0x5101,0x51DA,0x51D9, + 0x51DB,0x5286,0x528E,0x52EE,0x5333,0x53B1,INVALC,0x5647, + 0x562D,0x5654,INVALC,0x564B,0x5652,0x5631,0x5644,0x5656, + 0x5650,0x562B,INVALC,0x564D,0x5637,0x564F,0x58A2,0x58B7, + INVALC,0x58B2,INVALC,0x58AA,0x58B5,0x58B0,INVALC,0x58B4, + 0x58A4,0x58A7,INVALC,0x5926,0x5AFE,INVALC,0x5B04,INVALC, + 0x5AFC,INVALC,0x5B06,0x5B0A,0x5AFA,0x5B0D,0x5B00,0x5B0E, + INVALC,INVALC,INVALC,0x5D91,INVALC,0x5D8F,0x5D90,0x5D98, + 0x5DA4,0x5D9B,0x5DA3,0x5D96,0x5DE4,0x5E5A,INVALC,INVALC, + 0x5E5E,INVALC,0x5FB8,0x6157,0x615C,0x61A6,0x6195,0x6188, + INVALC,0x61A3,0x618F,INVALC,0x6164,INVALC,0x6159,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 77, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6178,INVALC,0x6185,0x6187,0x619E,INVALC,INVALC, + 0x6198,0x619C,INVALC,INVALC,0x622F,0x6480,0x649B,0x648E, + 0x648D,0x6494,0x64C6,INVALC,0x64A8,0x6483,INVALC,0x64B9, + 0x6486,0x64B4,0x64AF,0x6491,INVALC,0x64AA,0x64A1,0x64A7, + 0x66B6,0x66B3,INVALC,0x66BC,0x66AC,INVALC,0x66AD,0x6A0E, + INVALC,0x6A1C,0x6A1A,INVALC,INVALC,0x6A0B,INVALC,0x69EF, + 0x6A0C,0x69F0,0x6A22,INVALC,0x69D8,INVALC,0x6A12,0x69FA, + INVALC,0x6A2A,INVALC,0x6A10,INVALC,INVALC,0x6A29,0x69F9, + 0x69EA,0x6A2C,0x6A24,INVALC,0x69E9,0x6B52,0x6B4F,0x6B53, + INVALC,INVALC,0x6F10,0x6F65,0x6F75,INVALC,INVALC,INVALC, + INVALC,0x6FD0,INVALC,0x6F5C,0x6F3D,0x6F71,INVALC,0x6F91, + 0x6F0B,0x6F79,0x6F81,0x6F8F,INVALC,0x6F59,0x6F74,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 78, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x71AE,INVALC,0x71A3,0x71AD,INVALC,INVALC, + 0x71AB,0x71A6,0x71A2,INVALC,0x52F2,0x7257,0x7255,0x7299, + 0x734B,0x747A,INVALC,INVALC,INVALC,0x748C,0x7484,INVALC, + INVALC,0x7482,0x7493,0x747B,INVALC,0x7509,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x778A,INVALC,0x7790,INVALC, + 0x78C6,0x78D3,0x78C0,0x78D2,0x78C7,0x78C2,INVALC,0x799F, + 0x799D,0x799E,INVALC,0x7A41,INVALC,0x7A38,0x7A3A,0x7A42, + INVALC,INVALC,0x7A3E,0x7AB0,0x7BAE,0x7BB3,INVALC,INVALC, + 0x7BBF,INVALC,INVALC,0x7BCD,INVALC,0x7BB2,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7CC4,0x7CCD,0x7CC2, + 0x7CC6,0x7CC3,0x7CC9,0x7CC7,INVALC,0x7DF8,INVALC,0x7DED, + 0x7DE2,INVALC,INVALC,INVALC,0x7DDC,0x7E02,0x7E01,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7DD6,INVALC,0x7DE4,0x7DFE,INVALC,0x7E00, + 0x7DFC,0x7DFD,INVALC,0x7DF5,0x7DFF,INVALC,0x7DEB,0x7DE5, + 0x7F78,0x7FAE,0x7FE7,INVALC,0x8065,0x806A,0x8066,0x8068, + 0x806B,0x8194,0x81A1,0x8192,0x8196,0x8193,INVALC,INVALC, + 0x8501,INVALC,0x84F8,INVALC,0x84F5,INVALC,0x8504,INVALC, + INVALC,INVALC,INVALC,0x851B,0x8503,0x8533,0x8534,0x84ED, + INVALC,INVALC,0x8535,INVALC,0x8505,INVALC,INVALC,INVALC, + INVALC,0x877D,INVALC,INVALC,INVALC,0x8771,INVALC,0x885C, + 0x88E6,0x890F,0x891B,INVALC,0x89A9,0x89A5,0x89EE,0x8AB1, + INVALC,0x8ACC,0x8ACE,INVALC,0x8AB7,INVALC,0x8AB5,0x8AE9, + 0x8AB4,INVALC,0x8AB3,0x8AC1,0x8AAF,0x8ACA,0x8AD0,INVALC, + INVALC,INVALC,0x8C8E,INVALC,INVALC,0x8CE9,0x8CDB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x8CEB,0x8DA4,INVALC,0x8DA2,0x8D9D,INVALC, + INVALC,INVALC,INVALC,0x8E2A,0x8E28,INVALC,INVALC,0x8EB8, + 0x8EB6,0x8EB9,0x8EB7,0x8F22,0x8F2B,0x8F27,0x8F19,0x8FA4, + INVALC,0x8FB3,INVALC,0x9071,0x906A,INVALC,INVALC,0x9188, + 0x918C,0x92BF,0x92B8,0x92BE,0x92DC,0x92E5,INVALC,INVALC, + 0x92D4,0x92D6,INVALC,0x92DA,0x92ED,0x92F3,0x92DB,INVALC, + 0x92B9,0x92E2,0x92EB,0x95AF,INVALC,0x95B2,0x95B3,INVALC, + INVALC,INVALC,0x96A3,0x96A5,INVALC,INVALC,INVALC,INVALC, + 0x970A,INVALC,0x9787,0x9789,0x978C,0x97EF,0x982A,0x9822, + INVALC,0x981F,INVALC,0x9919,INVALC,0x99CA,0x99DA,INVALC, + INVALC,INVALC,0x99DE,0x99C8,0x99E0,INVALC,0x9AB6,0x9AB5, + INVALC,0x9AF4,INVALC,0x9B6B,0x9B69,0x9B72,0x9B63,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x9D0D,INVALC,0x9D01,0x9D0C,INVALC,0x9CF8, + INVALC,INVALC,0x9CFE,0x9D02,0x9E84,INVALC,0x9EAB,0x9EAA, + 0x511D,0x5116,INVALC,0x512B,0x511E,0x511B,0x5290,0x5294, + 0x5314,INVALC,INVALC,0x5667,INVALC,0x567B,INVALC,0x565F, + 0x5661,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x58C3,0x58CA,0x58BB,0x58C0,0x58C4,0x5901,0x5B1F,0x5B18, + 0x5B11,0x5B15,INVALC,0x5B12,0x5B1C,INVALC,0x5B22,0x5B79, + 0x5DA6,INVALC,0x5DB3,0x5DAB,0x5EEA,INVALC,0x5F5B,INVALC, + INVALC,0x61B7,0x61CE,0x61B9,0x61BD,0x61CF,0x61C0,0x6199, + 0x6197,INVALC,0x61BB,0x61D0,0x61C4,0x6231,INVALC,0x64D3, + 0x64C0,INVALC,INVALC,INVALC,INVALC,0x64DC,0x64D1,0x64C8, + INVALC,0x64D5,0x66C3,INVALC,INVALC,0x66BF,0x66C5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x66CD,0x66C1,0x6706,INVALC,0x6724,0x6A63, + 0x6A42,0x6A52,INVALC,0x6A43,0x6A33,INVALC,0x6A6C,0x6A57, + INVALC,0x6A4C,0x6A6E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A37,INVALC,0x6A71,0x6A4A,0x6A36,INVALC,0x6A53,INVALC, + 0x6A45,0x6A70,INVALC,INVALC,0x6A5C,0x6B58,0x6B57,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6FBB,INVALC,INVALC, + 0x6FBE,INVALC,INVALC,INVALC,0x6FB5,0x6FD3,0x6F9F,INVALC, + 0x6FB7,0x6FF5,0x71B7,INVALC,0x71BB,INVALC,0x71D1,INVALC, + 0x71BA,INVALC,0x71B6,0x71CC,INVALC,INVALC,0x71D3,0x749B, + INVALC,INVALC,0x7496,0x74A2,0x749D,0x750A,0x750E,INVALC, + 0x7581,0x762C,0x7637,0x7636,0x763B,INVALC,0x76A1,INVALC, + INVALC,0x7798,INVALC,0x7796,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x78D6,0x78EB,INVALC,0x78DC,INVALC,0x79A5,0x79A9, + 0x9834,0x7A53,0x7A45,INVALC,0x7A4F,INVALC,0x7ABD,0x7ABB, + 0x7AF1,INVALC,INVALC,0x7BEC,0x7BED,INVALC,INVALC,0x7CD3, + INVALC,0x7CE1,INVALC,0x7E19,INVALC,INVALC,INVALC,0x7E27, + 0x7E26,INVALC,INVALC,0x806E,0x81AF,INVALC,INVALC,0x81AD, + INVALC,0x81AA,0x8218,INVALC,INVALC,INVALC,INVALC,0x856F, + 0x854C,INVALC,0x8542,INVALC,0x855C,0x8570,0x855F,INVALC, + 0x855A,0x854B,0x853F,0x878A,INVALC,0x878B,0x87A1,0x878E, + INVALC,INVALC,0x8799,0x885E,0x885F,0x8924,0x89A7,0x8AEA, + 0x8AFD,0x8AF9,0x8AE3,0x8AE5,INVALC,INVALC,0x8AEC,INVALC, + INVALC,INVALC,INVALC,0x8CF2,INVALC,0x8CEF,INVALC,0x8DA6, + INVALC,INVALC,INVALC,0x8E3B,0x8E43,INVALC,0x8E32,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8F31,0x8F30,INVALC,0x8F2D,0x8F3C,0x8FA7,0x8FA5, + INVALC,INVALC,INVALC,0x9137,0x9195,0x918E,INVALC,0x9196, + INVALC,0x9345,0x930A,INVALC,INVALC,0x92FD,0x9317,0x931C, + 0x9307,0x9331,0x9332,0x932C,0x9330,0x9303,0x9305,INVALC, + 0x95C2,INVALC,0x95B8,INVALC,0x95C1,INVALC,INVALC,INVALC, + 0x96AB,0x96B7,INVALC,INVALC,0x9715,0x9714,INVALC,INVALC, + 0x970C,0x9717,INVALC,0x9793,INVALC,0x97D2,INVALC,INVALC, + 0x9836,0x9831,0x9833,0x983C,0x982E,0x983A,INVALC,0x983D, + INVALC,0x98B5,0x9922,0x9923,0x9920,0x991C,0x991D,INVALC, + 0x99A0,INVALC,0x99EF,0x99E8,0x99EB,INVALC,INVALC,INVALC, + 0x99E1,0x99E6,INVALC,INVALC,0x9AF8,0x9AF5,INVALC,INVALC, + 0x9B83,0x9B94,0x9B84,INVALC,0x9B8B,0x9B8F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9B8C,INVALC,0x9B89,INVALC,0x9B8E,INVALC,INVALC, + INVALC,0x9D24,0x9D0F,INVALC,0x9D13,0x9D0A,INVALC,INVALC, + INVALC,INVALC,0x9D2A,0x9D1A,INVALC,0x9D27,0x9D16,0x9D21, + INVALC,0x9E85,0x9EAC,0x9EC6,0x9EC5,0x9ED7,0x9F53,INVALC, + 0x5128,0x5127,0x51DF,INVALC,0x5335,0x53B3,INVALC,0x568A, + 0x567D,0x5689,INVALC,0x58CD,0x58D0,INVALC,0x5B2B,0x5B33, + 0x5B29,0x5B35,0x5B31,0x5B37,0x5C36,0x5DBE,INVALC,0x5DB9, + INVALC,0x5DBB,INVALC,0x61E2,0x61DB,0x61DD,0x61DC,0x61DA, + INVALC,0x61D9,INVALC,INVALC,0x64DF,INVALC,INVALC,0x64E1, + INVALC,0x64EE,INVALC,0x65B5,0x66D4,0x66D5,INVALC,0x66D0, + 0x66D1,0x66CE,0x66D7,INVALC,INVALC,0x6A7D,0x6A8A,INVALC, + 0x6AA7,INVALC,0x6A99,0x6A82,0x6A88,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A86,INVALC,0x6A98,0x6A9D,INVALC,INVALC,0x6A8F, + INVALC,0x6AAA,INVALC,0x6B5D,INVALC,0x6C0A,INVALC,0x6FD7, + 0x6FD6,0x6FE5,INVALC,INVALC,INVALC,0x6FD9,0x6FDA,0x6FEA, + INVALC,0x6FF6,INVALC,INVALC,0x71E3,INVALC,0x71E9,INVALC, + 0x71EB,0x71EF,0x71F3,0x71EA,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7371,INVALC,0x74AE,INVALC,0x74B3,INVALC,0x74AC, + INVALC,INVALC,0x7583,0x7645,0x764E,0x7644,0x76A3,0x76A5, + 0x77A6,0x77A4,INVALC,0x77A9,0x77AF,INVALC,INVALC,INVALC, + 0x78F0,0x78F8,0x78F1,INVALC,0x7A49,INVALC,INVALC,INVALC, + 0x7AC2,0x7AF2,0x7AF3,0x7BFA,INVALC,0x7BF6,0x7BFC,0x7C18, + 0x7C08,0x7C12,INVALC,INVALC,0x7CDB,0x7CDA,INVALC,INVALC, + INVALC,0x7E2C,0x7E4D,INVALC,INVALC,0x7F46,0x7FF6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x802B,0x8074,0x81B8,0x81C8,INVALC,INVALC,INVALC, + 0x8592,0x8593,INVALC,0x857F,0x85AB,0x8597,INVALC,INVALC, + 0x85AC,INVALC,INVALC,INVALC,0x87CE,INVALC,0x87CD,INVALC, + INVALC,0x87C1,0x87B1,0x87C7,INVALC,0x8940,INVALC,0x893F, + 0x8939,INVALC,0x8943,INVALC,INVALC,INVALC,0x89AB,INVALC, + 0x8B1F,0x8B09,0x8B0C,INVALC,INVALC,0x8C40,INVALC,0x8C96, + INVALC,0x8CF6,0x8CF7,INVALC,0x8E46,0x8E4F,INVALC,INVALC, + INVALC,0x8F3D,0x8F41,0x9366,0x9378,0x935D,0x9369,0x9374, + 0x937D,0x936E,0x9372,0x9373,0x9362,0x9348,0x9353,0x935F, + 0x9368,INVALC,0x937F,0x936B,INVALC,0x95C4,INVALC,0x96AF, + 0x96AD,0x96B2,INVALC,INVALC,0x971A,0x971B,INVALC,INVALC, + INVALC,INVALC,0x979B,0x979F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x9840,INVALC, + 0x9847,INVALC,0x98B7,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x99A2,INVALC,INVALC,0x9A00,0x99F3,INVALC,INVALC,0x99F5, + INVALC,INVALC,0x9ABD,0x9B00,0x9B02,INVALC,0x9B34,0x9B49, + 0x9B9F,INVALC,0x9BA3,0x9BCD,0x9B99,0x9B9D,INVALC,INVALC, + 0x9D39,INVALC,0x9D44,INVALC,INVALC,0x9D35,INVALC,INVALC, + 0x9EAF,INVALC,0x512F,INVALC,INVALC,0x9F8E,INVALC,0x569F, + 0x569B,0x569E,0x5696,0x5694,0x56A0,INVALC,0x5B3B,INVALC, + INVALC,0x5B3A,0x5DC1,0x5F4D,0x5F5D,0x61F3,INVALC,INVALC, + INVALC,INVALC,0x64F6,0x64E5,0x64EA,0x64E7,0x6505,INVALC, + 0x64F9,INVALC,INVALC,INVALC,0x6AAB,0x6AED,0x6AB2,0x6AB0, + 0x6AB5,0x6ABE,0x6AC1,0x6AC8,INVALC,0x6AC0,0x6ABC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6AB1,0x6AC4,0x6ABF,INVALC,INVALC,0x7008,0x7003, + 0x6FFD,0x7010,0x7002,0x7013,INVALC,0x71FA,0x7200,0x74B9, + 0x74BC,INVALC,0x765B,0x7651,0x764F,0x76EB,0x77B8,INVALC, + 0x77B9,0x77C1,0x77C0,0x77BE,0x790B,INVALC,0x7907,0x790A, + 0x7908,INVALC,0x790D,0x7906,0x7915,0x79AF,INVALC,INVALC, + INVALC,0x7AF5,INVALC,INVALC,0x7C2E,INVALC,0x7C1B,INVALC, + 0x7C1A,0x7C24,INVALC,INVALC,0x7CE6,0x7CE3,INVALC,INVALC, + 0x7E5D,0x7E4F,0x7E66,0x7E5B,0x7F47,0x7FB4,INVALC,INVALC, + INVALC,0x7FFA,0x802E,INVALC,INVALC,0x81CE,INVALC,INVALC, + 0x8219,INVALC,INVALC,0x85CC,0x85B2,INVALC,0x85BB,0x85C1, + INVALC,INVALC,INVALC,0x87E9,0x87EE,0x87F0,0x87D6,0x880E, + 0x87DA,0x8948,0x894A,0x894E,0x894D,0x89B1,0x89B0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x89B3,INVALC,0x8B38,0x8B32,INVALC,0x8B2D,INVALC, + 0x8B34,INVALC,0x8B29,0x8C74,INVALC,INVALC,0x8D03,INVALC, + INVALC,0x8DA9,0x8E58,INVALC,INVALC,0x8EBF,0x8EC1,0x8F4A, + 0x8FAC,INVALC,0x9089,0x913D,0x913C,0x91A9,0x93A0,INVALC, + 0x9390,INVALC,0x9393,0x938B,0x93AD,0x93BB,0x93B8,INVALC, + INVALC,0x939C,0x95D8,0x95D7,INVALC,INVALC,INVALC,0x975D, + 0x97A9,0x97DA,INVALC,INVALC,INVALC,INVALC,0x9854,INVALC, + 0x9855,0x984B,INVALC,0x983F,0x98B9,INVALC,INVALC,INVALC, + INVALC,0x9938,0x9936,0x9940,INVALC,0x993B,0x9939,0x99A4, + INVALC,INVALC,0x9A08,0x9A0C,INVALC,0x9A10,INVALC,0x9B07, + INVALC,0x9BD2,INVALC,0x9BC2,0x9BBB,0x9BCC,0x9BCB,INVALC, + INVALC,0x9D4D,0x9D63,0x9D4E,INVALC,0x9D50,0x9D55,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x9D5E,INVALC,0x9E90,0x9EB2,0x9EB1,INVALC, + 0x9ECA,0x9F02,0x9F27,0x9F26,INVALC,0x56AF,0x58E0,0x58DC, + INVALC,0x5B39,INVALC,INVALC,0x5B7C,0x5BF3,INVALC,INVALC, + 0x5C6B,0x5DC4,0x650B,0x6508,0x650A,INVALC,INVALC,0x65DC, + INVALC,INVALC,0x66E1,0x66DF,0x6ACE,0x6AD4,0x6AE3,0x6AD7, + 0x6AE2,INVALC,INVALC,INVALC,INVALC,0x6AD8,0x6AD5,0x6AD2, + INVALC,INVALC,0x701E,0x702C,0x7025,0x6FF3,0x7204,0x7208, + 0x7215,INVALC,0x74C4,0x74C9,0x74C7,0x74C8,0x76A9,0x77C6, + 0x77C5,0x7918,0x791A,0x7920,INVALC,0x7A66,0x7A64,0x7A6A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C35,0x7C34, + INVALC,INVALC,0x7E6C,INVALC,0x7E6E,0x7E71,INVALC,0x81D4, + 0x81D6,0x821A,0x8262,0x8265,0x8276,0x85DB,0x85D6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x85E7,INVALC,INVALC,0x85F4,INVALC,0x87FD, + 0x87D5,0x8807,INVALC,0x880F,0x87F8,INVALC,INVALC,0x8987, + INVALC,0x89B5,0x89F5,INVALC,0x8B3F,0x8B43,0x8B4C,INVALC, + 0x8D0B,0x8E6B,0x8E68,0x8E70,0x8E75,0x8E77,INVALC,0x8EC3, + INVALC,0x93E9,0x93EA,0x93CB,0x93C5,0x93C6,INVALC,0x93ED, + 0x93D3,INVALC,0x93E5,INVALC,INVALC,0x93DB,0x93EB,0x93E0, + 0x93C1,INVALC,INVALC,0x95DD,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x97B2,0x97B4,0x97B1, + 0x97B5,0x97F2,INVALC,INVALC,INVALC,0x9856,INVALC,INVALC, + INVALC,0x9944,INVALC,0x9A26,0x9A1F,0x9A18,0x9A21,0x9A17, + INVALC,0x9B09,INVALC,INVALC,0x9BC5,0x9BDF,INVALC,0x9BE3, + INVALC,0x9BE9,0x9BEE,INVALC,INVALC,0x9D66,0x9D7A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x9D6E,0x9D91,0x9D83,0x9D76,0x9D7E,0x9D6D, + INVALC,0x9E95,0x9EE3,INVALC,INVALC,0x9F03,0x9F04,INVALC, + 0x9F17,INVALC,0x5136,INVALC,0x5336,INVALC,0x5B42,INVALC, + INVALC,0x5B44,0x5B46,0x5B7E,0x5DCA,0x5DC8,0x5DCC,0x5EF0, + INVALC,0x6585,0x66E5,0x66E7,INVALC,INVALC,INVALC,0x6AF4, + INVALC,0x6AE9,INVALC,INVALC,INVALC,INVALC,INVALC,0x703D, + INVALC,0x7036,INVALC,0x7216,INVALC,0x7212,0x720F,0x7217, + 0x7211,0x720B,INVALC,INVALC,0x74CD,0x74D0,0x74CC,0x74CE, + 0x74D1,INVALC,0x7589,INVALC,0x7A6F,0x7C4B,0x7C44,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7E7F,0x8B71,INVALC,0x802F, + 0x807A,0x807B,0x807C,INVALC,INVALC,INVALC,0x85FC,0x8610, + 0x8602,INVALC,INVALC,0x85EE,0x8603,INVALC,0x860D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8613,0x8608,0x860F,0x8818,0x8812,INVALC,INVALC, + 0x8967,0x8965,0x89BB,0x8B69,0x8B62,INVALC,0x8B6E,INVALC, + 0x8B61,INVALC,0x8B64,0x8B4D,0x8C51,INVALC,INVALC,0x8E83, + 0x8EC6,INVALC,0x941F,INVALC,0x9404,0x9417,0x9408,0x9405, + INVALC,0x93F3,0x941E,0x9402,0x941A,0x941B,0x9427,0x941C, + INVALC,0x96B5,INVALC,INVALC,0x9733,INVALC,0x9734,0x9731, + 0x97B8,0x97BA,INVALC,0x97FC,INVALC,INVALC,0x98C3,INVALC, + 0x994D,INVALC,0x9A2F,INVALC,INVALC,INVALC,0x9AC9,INVALC, + 0x9AC8,0x9AC4,0x9B2A,0x9B38,0x9B50,INVALC,0x9C0A,0x9BFB, + 0x9C04,0x9BFC,0x9BFE,INVALC,INVALC,INVALC,0x9C02,0x9BF6, + 0x9C1B,0x9BF9,0x9C15,0x9C10,0x9BFF,0x9C00,0x9C0C,INVALC, + INVALC,0x9D95,0x9DA5,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9E98,0x9EC1,INVALC,0x9F5A,0x5164,0x56BB,INVALC, + 0x58E6,0x5B49,0x5BF7,INVALC,INVALC,0x5DD0,INVALC,0x5FC2, + INVALC,0x6511,INVALC,0x6AFF,0x6AFE,0x6AFD,INVALC,0x6B01, + INVALC,INVALC,0x704B,0x704D,0x7047,0x74D3,0x7668,0x7667, + INVALC,INVALC,0x77D1,0x7930,0x7932,0x792E,INVALC,0x9F9D, + 0x7AC9,0x7AC8,INVALC,0x7C56,0x7C51,INVALC,INVALC,INVALC, + 0x7E85,0x7E89,0x7E8E,0x7E84,INVALC,0x826A,0x862B,0x862F, + 0x8628,INVALC,0x8616,0x8615,0x861D,0x881A,INVALC,INVALC, + INVALC,0x89BC,0x8B75,0x8B7C,INVALC,0x8D11,0x8D12,0x8F5C, + 0x91BB,INVALC,0x93F4,INVALC,INVALC,0x942D,INVALC,INVALC, + 0x96E4,0x9737,0x9736,0x9767,0x97BE,0x97BD,0x97E2,0x9868, + 0x9866,0x98C8,0x98CA,0x98C7,0x98DC,INVALC,0x994F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x99A9,0x9A3C,INVALC,0x9A3B,0x9ACE,INVALC,0x9B14, + 0x9B53,INVALC,0x9C2E,INVALC,0x9C1F,INVALC,INVALC,INVALC, + INVALC,0x9DB0,0x9DBD,INVALC,INVALC,0x9DAE,0x9DC4,0x9E7B, + INVALC,INVALC,0x9E9E,INVALC,0x9F05,INVALC,0x9F69,0x9FA1, + 0x56C7,0x571D,0x5B4A,0x5DD3,INVALC,0x5F72,0x6202,INVALC, + 0x6235,0x6527,0x651E,0x651F,INVALC,INVALC,0x6B07,0x6B06, + INVALC,INVALC,0x7054,0x721C,0x7220,0x7AF8,INVALC,0x7C5D, + 0x7C58,INVALC,0x7E92,0x7F4E,INVALC,INVALC,INVALC,0x8827, + INVALC,0x8B81,0x8B83,INVALC,0x8C44,INVALC,INVALC,INVALC, + INVALC,0x9442,0x944D,0x9454,0x944E,INVALC,0x9443,INVALC, + INVALC,0x973C,0x9740,0x97C0,INVALC,INVALC,INVALC,INVALC, + 0x995A,0x9A51,INVALC,0x9ADD,INVALC,INVALC,0x9C38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x9C45,0x9C3A,INVALC,0x9C35,INVALC,INVALC, + INVALC,0x9EF1,INVALC,0x9F93,0x529A,INVALC,INVALC,0x8641, + 0x5DD7,INVALC,0x6528,INVALC,INVALC,INVALC,0x7053,0x7059, + INVALC,0x7221,INVALC,0x766F,0x7937,0x79B5,0x7C62,0x7C5E, + 0x7CF5,INVALC,INVALC,0x863D,INVALC,0x882D,0x8989,0x8B8D, + 0x8B87,0x8B90,0x8D1A,0x8E99,INVALC,INVALC,INVALC,0x945F, + INVALC,INVALC,0x9456,0x9461,0x945B,0x945A,0x945C,0x9465, + INVALC,0x9741,INVALC,INVALC,0x986E,0x986C,0x986D,INVALC, + 0x99AA,0x9A5C,0x9A58,0x9ADE,INVALC,0x9C4F,0x9C51,INVALC, + 0x9C53,INVALC,INVALC,INVALC,0x9DFC,0x9F39,INVALC,0x513E, + INVALC,0x56D2,INVALC,0x5B4F,0x6B14,INVALC,0x7A72,0x7A73, + INVALC,INVALC,INVALC,0x8B91,INVALC,INVALC,0x91BF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x946C,INVALC,INVALC,0x96E6,0x9745,INVALC, + 0x97C8,0x97E4,0x995D,INVALC,0x9B21,INVALC,0x9B2C,0x9B57, + INVALC,INVALC,0x9C5D,0x9C61,0x9C65,0x9E08,INVALC,INVALC, + INVALC,INVALC,INVALC,0x9F45,INVALC,INVALC,0x6205,0x66EF, + 0x6B1B,0x6B1D,0x7225,0x7224,0x7C6D,INVALC,0x8642,0x8649, + INVALC,0x8978,0x898A,0x8B97,INVALC,0x8C9B,0x8D1C,INVALC, + 0x8EA2,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9C6C,INVALC,0x9C6F,INVALC,0x9E0E,INVALC,0x9F08, + 0x9F1D,0x9FA3,INVALC,INVALC,0x5F60,0x6B1C,INVALC,INVALC, + INVALC,0x7CF3,INVALC,0x8B9B,0x8EA7,0x91C4,INVALC,0x947A, + INVALC,INVALC,0x9A61,0x9A63,0x9AD7,0x9C76,INVALC,0x9FA5, + INVALC,0x7067,INVALC,0x72AB,0x864A,0x897D,0x8B9D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8C53,0x8F65,0x947B,INVALC,0x98CD,0x98DD,INVALC, + 0x9B30,0x9E16,INVALC,INVALC,INVALC,INVALC,INVALC,0x96E7, + 0x9E18,0x9EA2,INVALC,0x9F7C,INVALC,0x7E9E,0x9484,INVALC, + 0x9E1C,INVALC,0x7C71,0x97CA,INVALC,INVALC,INVALC,0x9EA3, + INVALC,0x9C7B,0x9F97,INVALC,INVALC,0x9750,INVALC,INVALC, + INVALC,0x5727,0x5C13,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5FC8,INVALC,INVALC,INVALC,INVALC,INVALC,0x6765, + INVALC,INVALC,0x52BD,INVALC,0x5B66,INVALC,0x65F9,0x6788, + 0x6CE6,0x6CCB,INVALC,0x4FBD,0x5F8D,INVALC,0x6018,0x6048, + INVALC,0x6B29,0x70A6,INVALC,0x7706,INVALC,INVALC,INVALC, + 0x5A10,0x5CFC,0x5CFE,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x70C9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x9579,INVALC,0x96BA,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B29,0x8128,INVALC, + 0x8A2E,INVALC,INVALC,INVALC,0x9AD9,INVALC,0x582B,0x5845, + INVALC,0x63FA,INVALC,INVALC,INVALC,0x6E86,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5867,INVALC,0x5BDD,0x656E,INVALC, + INVALC,INVALC,0x8C87,INVALC,0x50D2,0x50DF,INVALC,INVALC, + INVALC,INVALC,0x69BA,INVALC,0x6B9D,INVALC,0x8059,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F8A,INVALC,INVALC,0x7BC3,0x7BC2, + INVALC,INVALC,INVALC,INVALC,0x90F6,INVALC,0x9823,INVALC, + INVALC,INVALC,INVALC,INVALC,0x71CD,0x7499,INVALC,INVALC, + INVALC,INVALC,INVALC,0x9842,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7F84,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x8D0E,INVALC,0x9861,INVALC,INVALC,0x8B73,INVALC,0x9C27, + INVALC,0x9458,0x77D6,0x9B2D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F66,0x4F68,0x4FE7,0x503F,INVALC,0x50A6,0x510F,0x523E, + 0x5324,0x5365,0x539B,0x517F,0x54CB,0x5573,0x5571,0x556B, + 0x55F4,0x5622,0x5620,0x5692,0x56BA,0x5691,0x56B0,0x5759, + 0x578A,0x580F,0x5812,0x5813,0x5847,0x589B,0x5900,0x594D, + 0x5AD1,0x5AD3,0x5B67,0x5C57,0x5C77,0x5CD5,0x5D75,0x5D8E, + 0x5DA5,0x5DB6,0x5DBF,0x5E65,0x5ECD,0x5EED,0x5F94,0x5F9A, + 0x5FBA,0x6125,0x6150,0x62A3,0x6360,0x6364,0x63B6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6403,0x64B6,0x651A,0x7A25,0x5C21,0x66E2,0x6702, + 0x67A4,0x67AC,0x6810,0x6806,0x685E,0x685A,0x692C,0x6929, + 0x6A2D,0x6A77,0x6A7A,0x6ACA,0x6AE6,0x6AF5,0x6B0D,0x6B0E, + 0x6BDC,0x6BDD,0x6BF6,0x6C1E,0x6C63,0x6DA5,0x6E0F,0x6E8A, + 0x6E84,0x6E8B,0x6E7C,0x6F4C,0x6F48,0x6F49,0x6F9D,0x6F99, + 0x6FF8,0x702E,0x702D,0x705C,0x79CC,0x70BF,0x70EA,0x70E5, + 0x7111,0x7112,0x713F,0x7139,0x713B,0x713D,0x7177,0x7175, + 0x7176,0x7171,0x7196,0x7193,0x71B4,0x71DD,0x71DE,0x720E, + 0x5911,0x7218,0x7347,0x7348,0x73EF,0x7412,0x743B,0x74A4, + 0x748D,0x74B4,0x7673,0x7677,0x76BC,0x7819,0x781B,0x783D, + 0x7853,0x7854,0x7858,0x78B7,0x78D8,0x78EE,0x7922,0x794D, + 0x7986,0x7999,0x79A3,0x79BC,0x7AA7,0x7B37,0x7B59,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x4600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7BD0,0x7C2F,0x7C32,0x7C42,0x7C4E,0x7C68,0x7CA9, + 0x7CED,0x7DD0,0x7E07,0x7DD3,0x7E64,0x7F40,INVALC,0x8041, + 0x8063,0x80BB,0x6711,0x6725,0x8248,0x8310,0x8362,0x8312, + 0x8421,0x841E,0x84E2,0x84DE,0x84E1,0x8573,0x85D4,0x85F5, + 0x8637,0x8645,0x8672,0x874A,0x87A9,0x87A5,0x87F5,0x8834, + 0x8850,0x8887,0x8954,0x8984,0x8B03,0x8C52,0x8CD8,0x8D0C, + 0x8D18,0x8DB0,0x8EBC,0x8ED5,0x8FAA,0x909C,INVALC,0x915C, + 0x922B,0x9221,0x9273,0x92F4,0x92F5,0x933F,0x9342,0x9386, + 0x93BE,0x93BC,0x93BD,0x93F1,0x93F2,0x93EF,0x9422,0x9423, + 0x9424,0x9467,0x9466,0x9597,0x95CE,0x95E7,0x973B,0x974D, + 0x98E4,0x9942,0x9B1D,0x9B98,INVALC,0x9D49,0x6449,0x5E71, + 0x5E85,0x61D3,0x990E,0x8002,0x781E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x4700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5528,0x5572,0x55BA,0x55F0,0x55EE,0x56B8,0x56B9, + 0x56C4,0x8053,0x92B0,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE14 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit cns11643_plane14 -> UCS size-optimized table (12822 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_cns11643_plane14[] = +{ + 0x00DE, /* Ranges number */ + 0x01A6, /* Unranged codes number */ + 0x15BF, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x2121, 0x216D, 0x029D, + /* Array index: 0x0006 */ 0x2177, 0x217D, 0x02EA, + /* Array index: 0x0009 */ 0x2222, 0x223F, 0x02F1, + /* Array index: 0x000C */ 0x2247, 0x227E, 0x030F, + /* Array index: 0x000F */ 0x2322, 0x2347, 0x0347, + /* Array index: 0x0012 */ 0x2350, 0x2355, 0x036D, + /* Array index: 0x0015 */ 0x2369, 0x237E, 0x0373, + /* Array index: 0x0018 */ 0x2423, 0x242F, 0x0389, + /* Array index: 0x001B */ 0x2438, 0x2454, 0x0396, + /* Array index: 0x001E */ 0x2457, 0x2467, 0x03B3, + /* Array index: 0x0021 */ 0x2473, 0x247E, 0x03C4, + /* Array index: 0x0024 */ 0x2521, 0x2538, 0x03D0, + /* Array index: 0x0027 */ 0x253E, 0x254E, 0x03E8, + /* Array index: 0x002A */ 0x255A, 0x2568, 0x03F9, + /* Array index: 0x002D */ 0x256B, 0x257D, 0x0408, + /* Array index: 0x0030 */ 0x2621, 0x262A, 0x041B, + /* Array index: 0x0033 */ 0x262E, 0x2639, 0x0425, + /* Array index: 0x0036 */ 0x2641, 0x266B, 0x0431, + /* Array index: 0x0039 */ 0x2673, 0x267E, 0x045C, + /* Array index: 0x003C */ 0x2721, 0x2752, 0x0468, + /* Array index: 0x003F */ 0x2759, 0x277D, 0x049A, + /* Array index: 0x0042 */ 0x2821, 0x282F, 0x04BF, + /* Array index: 0x0045 */ 0x283D, 0x2841, 0x04CE, + /* Array index: 0x0048 */ 0x2848, 0x287A, 0x04D3, + /* Array index: 0x004B */ 0x2925, 0x295A, 0x0506, + /* Array index: 0x004E */ 0x2963, 0x2979, 0x053C, + /* Array index: 0x0051 */ 0x2A21, 0x2A3F, 0x0553, + /* Array index: 0x0054 */ 0x2A47, 0x2A4F, 0x0572, + /* Array index: 0x0057 */ 0x2A54, 0x2A60, 0x057B, + /* Array index: 0x005A */ 0x2A70, 0x2A7E, 0x0588, + /* Array index: 0x005D */ 0x2B21, 0x2B40, 0x0597, + /* Array index: 0x0060 */ 0x2B46, 0x2B5E, 0x05B7, + /* Array index: 0x0063 */ 0x2B63, 0x2B72, 0x05D0, + /* Array index: 0x0066 */ 0x2C21, 0x2C2F, 0x05E0, + /* Array index: 0x0069 */ 0x2C3B, 0x2C4D, 0x05EF, + /* Array index: 0x006C */ 0x2C56, 0x2C63, 0x0602, + /* Array index: 0x006F */ 0x2C6B, 0x2C7E, 0x0610, + /* Array index: 0x0072 */ 0x2D21, 0x2D3D, 0x0624, + /* Array index: 0x0075 */ 0x2D45, 0x2D7E, 0x0641, + /* Array index: 0x0078 */ 0x2E21, 0x2E2B, 0x067B, + /* Array index: 0x007B */ 0x2E32, 0x2E54, 0x0686, + /* Array index: 0x007E */ 0x2E5D, 0x2E6F, 0x06A9, + /* Array index: 0x0081 */ 0x2E74, 0x2E7E, 0x06BC, + /* Array index: 0x0084 */ 0x2F23, 0x2F6F, 0x06C7, + /* Array index: 0x0087 */ 0x2F73, 0x2F7B, 0x0714, + /* Array index: 0x008A */ 0x3027, 0x302B, 0x071D, + /* Array index: 0x008D */ 0x302F, 0x3040, 0x0722, + /* Array index: 0x0090 */ 0x304A, 0x304F, 0x0734, + /* Array index: 0x0093 */ 0x3055, 0x307B, 0x073A, + /* Array index: 0x0096 */ 0x3121, 0x3129, 0x0761, + /* Array index: 0x0099 */ 0x312C, 0x313D, 0x076A, + /* Array index: 0x009C */ 0x3140, 0x317D, 0x077C, + /* Array index: 0x009F */ 0x3221, 0x3231, 0x07BA, + /* Array index: 0x00A2 */ 0x3238, 0x3241, 0x07CB, + /* Array index: 0x00A5 */ 0x3246, 0x3248, 0x07D5, + /* Array index: 0x00A8 */ 0x324D, 0x3252, 0x07D8, + /* Array index: 0x00AB */ 0x325A, 0x327C, 0x07DE, + /* Array index: 0x00AE */ 0x3323, 0x3332, 0x0801, + /* Array index: 0x00B1 */ 0x333B, 0x334F, 0x0811, + /* Array index: 0x00B4 */ 0x3355, 0x335A, 0x0826, + /* Array index: 0x00B7 */ 0x3369, 0x337C, 0x082C, + /* Array index: 0x00BA */ 0x3425, 0x3436, 0x0840, + /* Array index: 0x00BD */ 0x343C, 0x347D, 0x0852, + /* Array index: 0x00C0 */ 0x3527, 0x353C, 0x0894, + /* Array index: 0x00C3 */ 0x3543, 0x355B, 0x08AA, + /* Array index: 0x00C6 */ 0x3560, 0x3563, 0x08C3, + /* Array index: 0x00C9 */ 0x356E, 0x3576, 0x08C7, + /* Array index: 0x00CC */ 0x3622, 0x367D, 0x08D0, + /* Array index: 0x00CF */ 0x3721, 0x373D, 0x092C, + /* Array index: 0x00D2 */ 0x3744, 0x374A, 0x0949, + /* Array index: 0x00D5 */ 0x3750, 0x3759, 0x0950, + /* Array index: 0x00D8 */ 0x375D, 0x377E, 0x095A, + /* Array index: 0x00DB */ 0x3839, 0x3842, 0x097C, + /* Array index: 0x00DE */ 0x3845, 0x3858, 0x0986, + /* Array index: 0x00E1 */ 0x385B, 0x387B, 0x099A, + /* Array index: 0x00E4 */ 0x3929, 0x3941, 0x09BB, + /* Array index: 0x00E7 */ 0x394A, 0x3959, 0x09D4, + /* Array index: 0x00EA */ 0x3967, 0x397E, 0x09E4, + /* Array index: 0x00ED */ 0x3A27, 0x3A3C, 0x09FC, + /* Array index: 0x00F0 */ 0x3A40, 0x3A63, 0x0A12, + /* Array index: 0x00F3 */ 0x3A75, 0x3A7E, 0x0A36, + /* Array index: 0x00F6 */ 0x3B24, 0x3B2E, 0x0A40, + /* Array index: 0x00F9 */ 0x3B33, 0x3B47, 0x0A4B, + /* Array index: 0x00FC */ 0x3B4D, 0x3B68, 0x0A60, + /* Array index: 0x00FF */ 0x3B6D, 0x3B76, 0x0A7C, + /* Array index: 0x0102 */ 0x3B7C, 0x3B7E, 0x0A86, + /* Array index: 0x0105 */ 0x3C23, 0x3C2A, 0x0A89, + /* Array index: 0x0108 */ 0x3C2F, 0x3C5D, 0x0A91, + /* Array index: 0x010B */ 0x3C60, 0x3C74, 0x0AC0, + /* Array index: 0x010E */ 0x3C77, 0x3C7D, 0x0AD5, + /* Array index: 0x0111 */ 0x3D21, 0x3D47, 0x0ADC, + /* Array index: 0x0114 */ 0x3D4F, 0x3D69, 0x0B03, + /* Array index: 0x0117 */ 0x3D70, 0x3D7B, 0x0B1E, + /* Array index: 0x011A */ 0x3E21, 0x3E63, 0x0B2A, + /* Array index: 0x011D */ 0x3E68, 0x3E6A, 0x0B6D, + /* Array index: 0x0120 */ 0x3E7C, 0x3E7E, 0x0B70, + /* Array index: 0x0123 */ 0x3F21, 0x3F24, 0x0B73, + /* Array index: 0x0126 */ 0x3F29, 0x3F59, 0x0B77, + /* Array index: 0x0129 */ 0x3F62, 0x3F69, 0x0BA8, + /* Array index: 0x012C */ 0x3F70, 0x3F75, 0x0BB0, + /* Array index: 0x012F */ 0x4036, 0x4061, 0x0BB6, + /* Array index: 0x0132 */ 0x4071, 0x407D, 0x0BE2, + /* Array index: 0x0135 */ 0x4121, 0x413E, 0x0BEF, + /* Array index: 0x0138 */ 0x414D, 0x4151, 0x0C0D, + /* Array index: 0x013B */ 0x4172, 0x417E, 0x0C12, + /* Array index: 0x013E */ 0x4226, 0x4233, 0x0C1F, + /* Array index: 0x0141 */ 0x4239, 0x4249, 0x0C2D, + /* Array index: 0x0144 */ 0x424E, 0x427E, 0x0C3E, + /* Array index: 0x0147 */ 0x4325, 0x4339, 0x0C6F, + /* Array index: 0x014A */ 0x4346, 0x4355, 0x0C84, + /* Array index: 0x014D */ 0x4360, 0x436A, 0x0C94, + /* Array index: 0x0150 */ 0x4372, 0x4377, 0x0C9F, + /* Array index: 0x0153 */ 0x4422, 0x444F, 0x0CA5, + /* Array index: 0x0156 */ 0x4454, 0x446B, 0x0CD3, + /* Array index: 0x0159 */ 0x4476, 0x447E, 0x0CEB, + /* Array index: 0x015C */ 0x4523, 0x453C, 0x0CF4, + /* Array index: 0x015F */ 0x4557, 0x455C, 0x0D0E, + /* Array index: 0x0162 */ 0x455F, 0x4576, 0x0D14, + /* Array index: 0x0165 */ 0x4625, 0x4664, 0x0D2C, + /* Array index: 0x0168 */ 0x4668, 0x467B, 0x0D6C, + /* Array index: 0x016B */ 0x4721, 0x472A, 0x0D80, + /* Array index: 0x016E */ 0x4733, 0x474E, 0x0D8A, + /* Array index: 0x0171 */ 0x4753, 0x4772, 0x0DA6, + /* Array index: 0x0174 */ 0x4775, 0x477E, 0x0DC6, + /* Array index: 0x0177 */ 0x4821, 0x482B, 0x0DD0, + /* Array index: 0x017A */ 0x4830, 0x4840, 0x0DDB, + /* Array index: 0x017D */ 0x4844, 0x4848, 0x0DEC, + /* Array index: 0x0180 */ 0x4852, 0x4862, 0x0DF1, + /* Array index: 0x0183 */ 0x486D, 0x4879, 0x0E02, + /* Array index: 0x0186 */ 0x4922, 0x492E, 0x0E0F, + /* Array index: 0x0189 */ 0x4932, 0x4959, 0x0E1C, + /* Array index: 0x018C */ 0x495C, 0x4968, 0x0E44, + /* Array index: 0x018F */ 0x4970, 0x497D, 0x0E51, + /* Array index: 0x0192 */ 0x4A26, 0x4A39, 0x0E5F, + /* Array index: 0x0195 */ 0x4A44, 0x4A49, 0x0E73, + /* Array index: 0x0198 */ 0x4A52, 0x4A56, 0x0E79, + /* Array index: 0x019B */ 0x4A5D, 0x4A66, 0x0E7E, + /* Array index: 0x019E */ 0x4A6C, 0x4A75, 0x0E88, + /* Array index: 0x01A1 */ 0x4B29, 0x4B5F, 0x0E92, + /* Array index: 0x01A4 */ 0x4B63, 0x4B6D, 0x0EC9, + /* Array index: 0x01A7 */ 0x4B70, 0x4B7E, 0x0ED4, + /* Array index: 0x01AA */ 0x4C21, 0x4C4A, 0x0EE3, + /* Array index: 0x01AD */ 0x4C4D, 0x4C6C, 0x0F0D, + /* Array index: 0x01B0 */ 0x4C71, 0x4C7E, 0x0F2D, + /* Array index: 0x01B3 */ 0x4D24, 0x4D31, 0x0F3B, + /* Array index: 0x01B6 */ 0x4D35, 0x4D3D, 0x0F49, + /* Array index: 0x01B9 */ 0x4D46, 0x4D5D, 0x0F52, + /* Array index: 0x01BC */ 0x4D6D, 0x4D7E, 0x0F6A, + /* Array index: 0x01BF */ 0x4E24, 0x4E3D, 0x0F7C, + /* Array index: 0x01C2 */ 0x4E4B, 0x4E4F, 0x0F96, + /* Array index: 0x01C5 */ 0x4E5D, 0x4E76, 0x0F9B, + /* Array index: 0x01C8 */ 0x4F22, 0x4F26, 0x0FB5, + /* Array index: 0x01CB */ 0x4F2B, 0x4F56, 0x0FBA, + /* Array index: 0x01CE */ 0x4F60, 0x4F7E, 0x0FE6, + /* Array index: 0x01D1 */ 0x502A, 0x5038, 0x1005, + /* Array index: 0x01D4 */ 0x5048, 0x5070, 0x1014, + /* Array index: 0x01D7 */ 0x5075, 0x507E, 0x103D, + /* Array index: 0x01DA */ 0x5122, 0x5132, 0x1047, + /* Array index: 0x01DD */ 0x5138, 0x5146, 0x1058, + /* Array index: 0x01E0 */ 0x5154, 0x5176, 0x1067, + /* Array index: 0x01E3 */ 0x5224, 0x5234, 0x108A, + /* Array index: 0x01E6 */ 0x5252, 0x526B, 0x109B, + /* Array index: 0x01E9 */ 0x5321, 0x5344, 0x10B5, + /* Array index: 0x01EC */ 0x5358, 0x536C, 0x10D9, + /* Array index: 0x01EF */ 0x5374, 0x537D, 0x10EE, + /* Array index: 0x01F2 */ 0x5429, 0x542D, 0x10F8, + /* Array index: 0x01F5 */ 0x5432, 0x5461, 0x10FD, + /* Array index: 0x01F8 */ 0x5469, 0x547C, 0x112D, + /* Array index: 0x01FB */ 0x552D, 0x5539, 0x1141, + /* Array index: 0x01FE */ 0x553E, 0x5543, 0x114E, + /* Array index: 0x0201 */ 0x5552, 0x5575, 0x1154, + /* Array index: 0x0204 */ 0x5621, 0x5624, 0x1178, + /* Array index: 0x0207 */ 0x5628, 0x562D, 0x117C, + /* Array index: 0x020A */ 0x5639, 0x5642, 0x1182, + /* Array index: 0x020D */ 0x5646, 0x564A, 0x118C, + /* Array index: 0x0210 */ 0x5651, 0x5675, 0x1191, + /* Array index: 0x0213 */ 0x573A, 0x5745, 0x11B6, + /* Array index: 0x0216 */ 0x5755, 0x5765, 0x11C2, + /* Array index: 0x0219 */ 0x576A, 0x577E, 0x11D3, + /* Array index: 0x021C */ 0x5821, 0x5845, 0x11E8, + /* Array index: 0x021F */ 0x5854, 0x585D, 0x120D, + /* Array index: 0x0222 */ 0x586B, 0x587E, 0x1217, + /* Array index: 0x0225 */ 0x5931, 0x5951, 0x122B, + /* Array index: 0x0228 */ 0x5958, 0x595C, 0x124C, + /* Array index: 0x022B */ 0x5961, 0x597E, 0x1251, + /* Array index: 0x022E */ 0x5A22, 0x5A3C, 0x126F, + /* Array index: 0x0231 */ 0x5A42, 0x5A48, 0x128A, + /* Array index: 0x0234 */ 0x5A4D, 0x5A67, 0x1291, + /* Array index: 0x0237 */ 0x5A74, 0x5A7E, 0x12AC, + /* Array index: 0x023A */ 0x5B25, 0x5B2C, 0x12B7, + /* Array index: 0x023D */ 0x5B31, 0x5B50, 0x12BF, + /* Array index: 0x0240 */ 0x5B5D, 0x5B61, 0x12DF, + /* Array index: 0x0243 */ 0x5B69, 0x5B7E, 0x12E4, + /* Array index: 0x0246 */ 0x5C22, 0x5C43, 0x12FA, + /* Array index: 0x0249 */ 0x5C53, 0x5C66, 0x131C, + /* Array index: 0x024C */ 0x5C6C, 0x5C7E, 0x1330, + /* Array index: 0x024F */ 0x5D21, 0x5D49, 0x1343, + /* Array index: 0x0252 */ 0x5D4C, 0x5D53, 0x136C, + /* Array index: 0x0255 */ 0x5D5E, 0x5D7A, 0x1374, + /* Array index: 0x0258 */ 0x5E21, 0x5E2A, 0x1391, + /* Array index: 0x025B */ 0x5E31, 0x5E6A, 0x139B, + /* Array index: 0x025E */ 0x5E70, 0x5E7E, 0x13D5, + /* Array index: 0x0261 */ 0x5F21, 0x5F2C, 0x13E4, + /* Array index: 0x0264 */ 0x5F31, 0x5F37, 0x13F0, + /* Array index: 0x0267 */ 0x5F3C, 0x5F5B, 0x13F7, + /* Array index: 0x026A */ 0x5F69, 0x5F73, 0x1417, + /* Array index: 0x026D */ 0x6039, 0x6040, 0x1422, + /* Array index: 0x0270 */ 0x6043, 0x604B, 0x142A, + /* Array index: 0x0273 */ 0x6052, 0x6068, 0x1433, + /* Array index: 0x0276 */ 0x6073, 0x6077, 0x144A, + /* Array index: 0x0279 */ 0x6125, 0x6135, 0x144F, + /* Array index: 0x027C */ 0x613E, 0x6150, 0x1460, + /* Array index: 0x027F */ 0x615D, 0x6165, 0x1473, + /* Array index: 0x0282 */ 0x6169, 0x617E, 0x147C, + /* Array index: 0x0285 */ 0x6221, 0x6229, 0x1492, + /* Array index: 0x0288 */ 0x622F, 0x623B, 0x149B, + /* Array index: 0x028B */ 0x625C, 0x6272, 0x14A8, + /* Array index: 0x028E */ 0x642F, 0x6433, 0x14BF, + /* Array index: 0x0291 */ 0x6448, 0x647E, 0x14C4, + /* Array index: 0x0294 */ 0x6521, 0x657E, 0x14FB, + /* Array index: 0x0297 */ 0x6621, 0x667C, 0x1559, + /* Array index: 0x029A */ 0x6721, 0x672A, 0x15B5, + /* Ranges content */ + /* Range 0x2121 - 0x216D, array index: 0x029D */ + 0x4E28,0x4E36,0x4E3F,0x4E85,0x4E05,0x4E04,0x5182,0x5196, + 0x5338,0x5369,0x53B6,0x4E2A,0x4E87,0x4E49,0x51E2,0x4E46, + 0x4E8F,0x4EBC,0x4EBE,0x5166,0x51E3,0x5204,0x529C,INVALC, + 0x5902,0x590A,0x5B80,0x5DDB,0x5E7A,0x5E7F,0x5EF4,0x5F50, + 0x5F51,0x5F61,0x961D,INVALC,0x4E63,0x4E62,0x4EA3,0x5185, + 0x4EC5,0x4ECF,0x4ECE,0x4ECC,0x5184,0x5186,INVALC,INVALC, + 0x51E4,0x5205,0x529E,0x529D,0x52FD,0x5300,0x533A,INVALC, + 0x5346,0x535D,0x5386,0x53B7,INVALC,0x53CC,INVALC,0x53CE, + 0x5721,INVALC,0x5E00,0x5F0C,0x6237,0x6238,0x6534,0x6535, + 0x65E0,INVALC,0x738D,0x4E97,0x4EE0, + /* Range 0x2177 - 0x217D, array index: 0x02EA */ + 0x56D8,0x518B,0x518C,0x5199,0x51E5,INVALC,0x520B, + /* Range 0x2222 - 0x223F, array index: 0x02F1 */ + 0x5304,0x5303,0x5307,INVALC,0x531E,0x535F,0x536D,0x5389, + 0x53BA,0x53D0,INVALC,0x53F6,0x53F7,0x53F9,INVALC,0x53F4, + INVALC,INVALC,0x5724,0x5904,0x5918,0x5932,0x5930,0x5934, + INVALC,0x5975,INVALC,0x5B82,0x5BF9,0x5C14, + /* Range 0x2247 - 0x227E, array index: 0x030F */ + 0x5E81,0x5E83,0x5F0D,0x5F52,INVALC,0x5FCA,0x5FC7,0x6239, + INVALC,0x624F,0x65E7,0x672F,0x6B7A,0x6C39,INVALC,INVALC, + 0x6C37,0x6C44,0x6C45,0x738C,0x7592,0x7676,0x9093,0x9092, + INVALC,INVALC,0x4E21,0x4E20,0x4E22,0x4E68,0x4E89,0x4E98, + 0x4EF9,0x4EEF,INVALC,INVALC,0x4EF8,0x4F06,0x4F03,0x4EFC, + 0x4EEE,0x4F16,INVALC,0x4F28,0x4F1C,0x4F07,0x4F1A,0x4EFA, + 0x4F17,0x514A,INVALC,0x5172,INVALC,0x51B4,0x51B3,0x51B2, + /* Range 0x2322 - 0x2347, array index: 0x0347 */ + 0x51E8,INVALC,0x5214,0x520F,0x5215,0x5218,0x52A8,INVALC, + 0x534B,0x534F,INVALC,0x5350,INVALC,0x538B,INVALC,0x53BE, + INVALC,0x53D2,0x5416,0x53FF,INVALC,0x5400,INVALC,0x5405, + 0x5413,0x5415,INVALC,INVALC,0x56E3,0x5735,0x5736,0x5731, + 0x5732,0x58EE,0x5905,0x4E54,INVALC,0x5936, + /* Range 0x2350 - 0x2355, array index: 0x036D */ + 0x5B86,0x5F53,0x5C18,INVALC,0x5C3D,0x5C78, + /* Range 0x2369 - 0x237E, array index: 0x0373 */ + 0x5FDB,INVALC,0x620F,0x625D,0x625F,0x6267,0x6257,0x9F50, + INVALC,0x65EB,0x65EA,INVALC,0x6737,INVALC,0x6732,0x6736, + 0x6B22,0x6BCE,INVALC,0x6C58,0x6C51,0x6C77, + /* Range 0x2423 - 0x242F, array index: 0x0389 */ + 0x6C5A,INVALC,0x6C53,0x706F,0x7072,0x706E,INVALC,INVALC, + 0x7073,0x72B1,0x72B2,INVALC,0x738F, + /* Range 0x2438 - 0x2454, array index: 0x0396 */ + 0x827B,INVALC,0x8D71,0x8FB9,0x9096,0x909A,INVALC,0x4E24, + 0x4E71,INVALC,0x4E9C,0x4F45,0x4F4A,0x4F39,0x4F37,INVALC, + 0x4F32,0x4F42,INVALC,0x4F44,0x4F4B,INVALC,0x4F40,0x4F35, + 0x4F31,0x5151,INVALC,0x5150,0x514E, + /* Range 0x2457 - 0x2467, array index: 0x03B3 */ + 0x519D,INVALC,0x51B5,0x51B8,0x51EC,0x5223,0x5227,0x5226, + 0x521F,0x522B,0x5220,0x52B4,0x52B3,INVALC,0x5325,0x533B, + 0x5374, + /* Range 0x2473 - 0x247E, array index: 0x03C4 */ + 0x5444,0x544C,0x5423,0x541A,0x5432,0x544B,0x5421,INVALC, + 0x5434,0x5449,0x5450,0x5422, + /* Range 0x2521 - 0x2538, array index: 0x03D0 */ + 0x543F,0x5451,0x545A,0x542F,INVALC,0x56E9,0x56F2,0x56F3, + 0x56EF,0x56ED,0x56EC,0x56E6,0x5748,INVALC,0x5744,0x573F, + 0x573C,0x5753,0x5756,INVALC,0x575F,0x5743,0x5758,0x5757, + /* Range 0x253E - 0x254E, array index: 0x03E8 */ + 0x573D,INVALC,0x5742,0x5754,0x5755,0x58F1,0x58F2,0x58F0, + 0x590B,0x9EA6,0x56F1,0x593D,INVALC,0x5994,0x598C,INVALC, + 0x599C, + /* Range 0x255A - 0x2568, array index: 0x03F9 */ + 0x5B8D,INVALC,0x5BFE,0x5BFF,0x5BFD,0x5C2B,INVALC,0x5C84, + 0x5C8E,0x5C9C,INVALC,INVALC,0x5C85,0x5DF5,0x5E09, + /* Range 0x256B - 0x257D, array index: 0x0408 */ + 0x5E0B,INVALC,0x5E92,0x5E90,0x5F03,INVALC,0x5F1E,0x5F63, + INVALC,0x5FE7,0x5FFE,0x5FE6,0x5FDC,0x5FCE,INVALC,0x5FFC, + 0x5FDF,0x5FEC,0x5FF6, + /* Range 0x2621 - 0x262A, array index: 0x041B */ + 0x5FF2,0x5FF0,0x5FF9,INVALC,0x6213,INVALC,INVALC,0x623B, + 0x623C,0x6282, + /* Range 0x262E - 0x2639, array index: 0x0425 */ + 0x6278,0x628B,INVALC,0x629E,0x62A5,0x629B,0x629C,0x6299, + 0x628D,0x6285,0x629D,0x6275, + /* Range 0x2641 - 0x266B, array index: 0x0431 */ + 0x66F5,0x675B,INVALC,0x6754,0x6752,INVALC,0x6758,0x6744, + 0x674A,0x6761,INVALC,0x6C7F,0x6C91,0x6C9E,INVALC,0x6C6E, + 0x6C7C,0x6C9F,0x6C75,INVALC,0x6C56,0x6CA2,0x6C79,INVALC, + 0x6CA1,INVALC,0x6CAA,0x6CA0,INVALC,0x7079,0x7077,0x707E, + INVALC,0x7075,0x707B,0x7264,INVALC,0x72BB,0x72BC,0x72C7, + 0x72B9,0x72BE,0x72B6, + /* Range 0x2673 - 0x267E, array index: 0x045C */ + 0x7593,0x7680,INVALC,0x7683,0x76C0,0x76C1,INVALC,INVALC, + 0x77F4,0x77F5,INVALC,0x7ACC, + /* Range 0x2721 - 0x2752, array index: 0x0468 */ + 0x7ACD,0x7CFA,0x809F,0x8091,0x8097,0x8094,INVALC,0x8286, + 0x828C,INVALC,0x8295,INVALC,0x866C,INVALC,0x8FB5,0x8FBE, + 0x8FC7,INVALC,0x8FC1,0x90A9,0x90A4,INVALC,INVALC,INVALC, + 0x90A8,0x9627,0x9626,0x962B,0x9633,0x9634,0x9629,0x4E3D, + INVALC,0x4E9D,0x4F93,0x4F8A,INVALC,INVALC,0x4F6D,0x4F8E, + 0x4FA0,0x4FA2,0x4FA1,0x4F9F,0x4FA3,INVALC,0x4F72,INVALC, + 0x4F8C,0x5156, + /* Range 0x2759 - 0x277D, array index: 0x049A */ + 0x51ED,0x51FE,0x522F,INVALC,0x523C,0x5234,0x5239,0x52B9, + 0x52B5,0x52BF,0x5355,INVALC,0x5376,0x537A,0x5393,INVALC, + 0x53C1,0x53C2,0x53D5,0x5485,INVALC,0x545F,0x5493,0x5489, + 0x5479,0x9EFE,0x548F,0x5469,0x546D,INVALC,0x5494,0x546A, + 0x548A,INVALC,0x56FD,0x56FB,0x56F8, + /* Range 0x2821 - 0x282F, array index: 0x04BF */ + 0x56FC,0x56F6,0x5765,0x5781,0x5763,0x5767,INVALC,0x576E, + 0x5778,0x577F,INVALC,INVALC,0x58F3,0x594B,0x594C, + /* Range 0x283D - 0x2841, array index: 0x04CE */ + 0x59BF,INVALC,0x59C9,0x59B8,0x59AC, + /* Range 0x2848 - 0x287A, array index: 0x04D3 */ + 0x5B60,INVALC,0x5B96,0x5B9E,0x5B94,0x5B9F,0x5B9D,INVALC, + 0x5C00,0x5C19,INVALC,INVALC,0x5C49,0x5C4A,INVALC,0x5CBB, + 0x5CC1,INVALC,INVALC,INVALC,0x5CB9,0x5C9E,0x5CB4,0x5CBA, + 0x5DF6,0x5E13,0x5E12,0x5E77,INVALC,0x5E98,INVALC,0x5E99, + 0x5E9D,0x5EF8,INVALC,0x5EF9,INVALC,0x5F06,0x5F21,INVALC, + 0x5F25,0x5F55,INVALC,INVALC,INVALC,0x5F84,0x5F83,0x6030, + 0x6007,INVALC,0x6036, + /* Range 0x2925 - 0x295A, array index: 0x0506 */ + 0x62BA,0x62B2,INVALC,0x62B7,0x62E4,0x62A7,INVALC,INVALC, + INVALC,0x62D5,0x62E1,0x62DD,0x62A6,0x62C1,0x62C5,0x62C0, + 0x62DF,0x62E0,0x62DE,INVALC,0x6589,INVALC,0x65A6,0x65BA, + INVALC,0x65FF,INVALC,0x6617,0x6618,0x6601,0x65FE,INVALC, + 0x670C,INVALC,0x676B,0x6796,0x6782,0x678A,INVALC,0x67A3, + INVALC,0x67A2,0x678F,INVALC,0x67F9,0x6780,0x6B26,0x6B27, + 0x6B68,0x6B69,INVALC,0x6B81,0x6BB4,0x6BD1, + /* Range 0x2963 - 0x2979, array index: 0x053C */ + 0x6C97,0x6C6C,0x6CDF,INVALC,0x6CEA,INVALC,0x6CE4,0x6CD8, + 0x6CB2,0x6CCE,0x6CC8,INVALC,0x708B,0x7088,0x7090,0x708F, + INVALC,0x7087,0x7089,0x708D,0x7081,INVALC,0x708C, + /* Range 0x2A21 - 0x2A3F, array index: 0x0553 */ + 0x7265,0x7266,0x7268,INVALC,INVALC,0x72CD,0x72D3,0x72DB, + INVALC,0x72CF,0x73A7,0x73A3,0x739E,INVALC,0x73AF,INVALC, + INVALC,0x73AA,0x739C,INVALC,0x7542,0x7544,0x753B,0x7541, + INVALC,0x759B,0x759E,INVALC,0x79C4,0x79C3,0x79C6, + /* Range 0x2A47 - 0x2A4F, array index: 0x0572 */ + 0x7ACF,0x7C76,0x7C74,0x7CFF,0x7CFC,INVALC,INVALC,0x7F59, + 0x80A8, + /* Range 0x2A54 - 0x2A60, array index: 0x057B */ + 0x80B3,INVALC,0x80A4,0x80B6,0x80A7,0x80AC,INVALC,0x80A6, + 0x5367,0x820E,0x82C4,0x833E,0x829C, + /* Range 0x2A70 - 0x2A7E, array index: 0x0588 */ + 0x8FCC,0x8FD9,0x8FCA,0x8FD8,0x8FCF,0x90B7,INVALC,0x90AD, + 0x90B9,0x9637,INVALC,0x9641,0x963E,0x96B6,0x9751, + /* Range 0x2B21 - 0x2B40, array index: 0x0597 */ + 0x9763,0x4E57,0x4E79,0x4EB2,0x4EB0,0x4EAF,0x4EB1,0x4FD2, + 0x4FD5,INVALC,0x4FBE,0x4FB8,0x4FB0,0x4FB1,0x4FC8,INVALC, + INVALC,0x4FC6,0x4FCC,0x4FE5,0x4FE3,0x4FB4,0x516A,INVALC, + 0x519F,INVALC,0x51C1,INVALC,0x51C2,0x51C3,0x5245,0x5248, + /* Range 0x2B46 - 0x2B5E, array index: 0x05B7 */ + 0x52C5,0x52CA,0x52C4,0x5327,0x5358,0x537D,INVALC,0x53DD, + 0x53DC,0x53DA,0x53D9,0x54B9,INVALC,0x54D0,0x54B4,0x54CA, + INVALC,0x54A3,0x54DA,0x54A4,INVALC,0x54B2,0x549E,0x549F, + 0x54B5, + /* Range 0x2B63 - 0x2B72, array index: 0x05D0 */ + 0x54CC,INVALC,0x5700,0x57AC,0x5791,0x578E,0x578D,0x5792, + 0x57A1,0x5790,0x57A6,0x57A8,INVALC,0x579C,0x5796,0x57A7, + /* Range 0x2C21 - 0x2C2F, array index: 0x05E0 */ + 0x59DF,INVALC,0x59EB,0x59EF,0x59F0,0x59D5,0x5A0D,0x5A04, + 0x59F9,0x5A02,0x59F8,0x59E2,0x59D9,0x59E7,0x5B6A, + /* Range 0x2C3B - 0x2C4D, array index: 0x05EF */ + 0x5CD1,0x5CDC,0x5CE6,0x5CE1,0x5CCD,INVALC,0x5CE2,0x5CDD, + 0x5CE5,0x5DFB,0x5DFA,0x5E1E,INVALC,0x5EA1,INVALC,INVALC, + 0x5EFC,0x5EFB,0x5F2F, + /* Range 0x2C56 - 0x2C63, array index: 0x0602 */ + 0x604E,0x6051,INVALC,INVALC,0x6023,0x6031,0x607C,0x6052, + INVALC,0x6060,0x604A,0x6061,INVALC,0x6218, + /* Range 0x2C6B - 0x2C7E, array index: 0x0610 */ + 0x631F,0x6317,0x62EA,0x6321,0x6304,0x6305,INVALC,0x6531, + 0x6544,0x6540,INVALC,0x6542,0x65BE,INVALC,0x6629,0x661B, + INVALC,0x6623,0x662C,0x661A, + /* Range 0x2D21 - 0x2D3D, array index: 0x0624 */ + 0x6630,0x663B,0x661E,0x6637,0x6638,INVALC,0x670E,INVALC, + INVALC,0x67E8,0x67D6,INVALC,0x67C7,0x67BC,0x6852,0x67BF, + 0x67D5,0x67FE,0x8363,0x67FB,INVALC,0x67B1,0x6801,0x6805, + 0x6800,0x67D7,INVALC,0x6B2A,0x6B6B, + /* Range 0x2D45 - 0x2D7E, array index: 0x0641 */ + 0x6D23,0x6CFF,0x6D14,0x6D05,0x6D13,0x6D06,0x6D21,INVALC, + 0x6D15,0x6CAF,0x6CF4,0x6D02,0x6D45,INVALC,0x6D26,INVALC, + 0x6D44,INVALC,0x6D24,0x70A5,INVALC,0x70A3,INVALC,0x70A2, + 0x70BB,0x70A0,0x70AA,INVALC,INVALC,0x70A8,0x70B6,0x70B2, + 0x70A7,INVALC,INVALC,0x70B9,0x722E,INVALC,0x723C,INVALC, + 0x726D,INVALC,INVALC,0x72E7,0x72ED,INVALC,0x72EC,0x72E5, + 0x72E2,INVALC,0x73C4,0x73BD,0x73CF,0x73C9,0x73C1,0x73D0, + INVALC,0x73CE, + /* Range 0x2E21 - 0x2E2B, array index: 0x067B */ + 0x74ED,0x74EB,INVALC,0x74EF,0x7549,0x7550,0x7546,0x754A, + INVALC,0x754D,0x75A6, + /* Range 0x2E32 - 0x2E54, array index: 0x0686 */ + 0x76C7,0x76FF,INVALC,0x76FD,0x77E6,0x780A,INVALC,0x7804, + 0x780B,0x7807,INVALC,0x7815,0x7808,INVALC,0x79D3,0x79D4, + 0x79D0,0x79D7,0x7A7C,INVALC,INVALC,0x7A7D,0x7A83,0x7A82, + INVALC,0x7AD4,0x7AD5,0x7AD3,0x7AD0,0x7AD2,0x7AFE,0x7AFC, + 0x7C77,0x7C7C,0x7C7B, + /* Range 0x2E5D - 0x2E6F, array index: 0x06A9 */ + 0x7F8F,0x80D3,INVALC,0x80CB,0x80D2,INVALC,0x8109,0x80E2, + 0x80DF,0x80C6,INVALC,0x8224,0x82F7,0x82D8,0x82DD,INVALC, + INVALC,0x82F8,0x82FC, + /* Range 0x2E74 - 0x2E7E, array index: 0x06BC */ + 0x82EE,INVALC,0x82D0,0x830E,0x82E2,0x830B,0x82FD,0x5179, + 0x8676,INVALC,0x8678, + /* Range 0x2F23 - 0x2F6F, array index: 0x06C7 */ + 0x8675,0x867D,INVALC,0x8842,0x8866,INVALC,0x898C,0x8A05, + INVALC,0x8A06,INVALC,0x8C9F,INVALC,0x8FF1,0x8FE7,0x8FE9, + 0x8FEF,0x90C2,0x90BC,INVALC,0x90C6,0x90C0,INVALC,INVALC, + 0x90CD,0x90C9,INVALC,0x90C4,INVALC,0x9581,INVALC,0x9CEC, + 0x5032,0x4FF9,0x501D,0x4FFF,0x5004,0x4FF0,0x5003,INVALC, + 0x5002,0x4FFC,0x4FF2,0x5024,0x5008,0x5036,0x502E,INVALC, + 0x5010,0x5038,0x5039,0x4FFD,0x5056,0x4FFB,0x51A3,0x51A6, + 0x51A1,INVALC,INVALC,0x51C7,0x51C9,0x5260,0x5264,0x5259, + 0x5265,0x5267,0x5257,0x5263,INVALC,0x5253,INVALC,0x52CF, + INVALC,0x52CE,0x52D0,0x52D1,0x52CC, + /* Range 0x2F73 - 0x2F7B, array index: 0x0714 */ + 0x550D,0x54F4,INVALC,0x5513,0x54EF,0x54F5,0x54F9,0x5502, + 0x5500, + /* Range 0x3027 - 0x302B, array index: 0x071D */ + 0x5705,0x57C9,INVALC,0x57B7,0x57CD, + /* Range 0x302F - 0x3040, array index: 0x0722 */ + 0x57BE,0x57BB,INVALC,0x57DB,0x57C8,0x57C4,0x57C5,0x57D1, + 0x57CA,0x57C0,INVALC,INVALC,0x5A21,0x5A2A,INVALC,0x5A1D, + INVALC,0x5A0B, + /* Range 0x304A - 0x304F, array index: 0x0734 */ + 0x5A14,0x5A31,INVALC,0x5A2F,0x5A1A,0x5A12, + /* Range 0x3055 - 0x307B, array index: 0x073A */ + 0x5BBC,0x5BBB,0x5BB7,0x5C05,0x5C06,0x5C52,0x5C53,INVALC, + INVALC,0x5CFA,0x5CEB,INVALC,0x5CF3,0x5CF5,0x5CE9,0x5CEF, + INVALC,0x5E2A,0x5E30,0x5E2E,0x5E2C,0x5E2F,0x5EAF,0x5EA9, + INVALC,0x5EFD,0x5F32,0x5F8E,0x5F93,0x5F8F,0x604F,0x6099, + INVALC,0x607E,INVALC,0x6074,0x604B,0x6073,0x6075, + /* Range 0x3121 - 0x3129, array index: 0x0761 */ + 0x60A9,0x608B,0x60A6,INVALC,0x6093,0x60AE,0x609E,0x60A7, + 0x6245, + /* Range 0x312C - 0x313D, array index: 0x076A */ + 0x632E,INVALC,0x6352,0x6330,0x635B,INVALC,0x6319,0x631B, + INVALC,0x6331,0x635D,0x6337,0x6335,0x6353,INVALC,0x635C, + 0x633F,0x654B, + /* Range 0x3140 - 0x317D, array index: 0x077C */ + 0x658B,INVALC,0x659A,0x6650,0x6646,0x664E,0x6640,INVALC, + 0x664B,0x6648,INVALC,0x6660,0x6644,0x664D,INVALC,0x6837, + 0x6824,INVALC,INVALC,0x681B,0x6836,INVALC,0x682C,0x6819, + 0x6856,0x6847,0x683E,0x681E,INVALC,0x6815,0x6822,0x6827, + 0x6859,0x6858,0x6855,0x6830,0x6823,0x6B2E,0x6B2B,0x6B30, + 0x6B6C,INVALC,0x6B8B,INVALC,0x6BE9,0x6BEA,0x6BE5,0x6D6B, + INVALC,INVALC,0x6D73,0x6D57,INVALC,INVALC,0x6D5D,0x6D56, + 0x6D8F,0x6D5B,0x6D1C,0x6D9A,0x6D9B,0x6D99, + /* Range 0x3221 - 0x3231, array index: 0x07BA */ + 0x6D81,0x6D71,INVALC,INVALC,0x6D72,0x6D5C,0x6D96,0x70C4, + 0x70DB,0x70CC,0x70D0,0x70E3,0x70DF,INVALC,0x70D6,0x70EE, + 0x70D5, + /* Range 0x3238 - 0x3241, array index: 0x07CB */ + 0x72F5,0x7302,INVALC,INVALC,0x73E2,0x73EC,0x73D5,0x73F9, + 0x73DF,0x73E6, + /* Range 0x3246 - 0x3248, array index: 0x07D5 */ + 0x73E4,0x73E1,0x74F3, + /* Range 0x324D - 0x3252, array index: 0x07D8 */ + 0x7556,0x7555,0x7558,0x7557,0x755E,0x75C3, + /* Range 0x325A - 0x327C, array index: 0x07DE */ + 0x76CB,0x76CC,0x772A,INVALC,0x7716,0x770F,INVALC,INVALC, + 0x773F,0x772B,0x770E,0x7724,INVALC,0x7721,0x7718,0x77DD, + INVALC,INVALC,0x7824,0x7836,INVALC,0x7958,0x7959,INVALC, + 0x7962,0x79DA,0x79D9,INVALC,0x79E1,0x79E5,0x79E8,0x79DB, + INVALC,0x79E2,0x79F0, + /* Range 0x3323 - 0x3332, array index: 0x0801 */ + 0x7ADA,0x7ADD,INVALC,0x7ADB,0x7ADC,INVALC,INVALC,0x7B0D, + 0x7B0B,0x7B14,0x7C8E,0x7C86,INVALC,0x7C87,0x7C83,0x7C8B, + /* Range 0x333B - 0x334F, array index: 0x0811 */ + 0x7D25,0x7F62,0x7F93,0x7F99,0x7F97,INVALC,INVALC,0x7FC4, + 0x7FC6,0x800A,INVALC,INVALC,0x8040,0x803C,0x803B,0x80F6, + 0x80FF,0x80EE,0x8104,0x8103,0x8107, + /* Range 0x3355 - 0x335A, array index: 0x0826 */ + 0x822D,INVALC,0x8227,0x8229,0x831F,0x8357, + /* Range 0x3369 - 0x337C, array index: 0x082C */ + 0x8684,0x869F,0x869B,0x8689,0x86A6,0x8692,0x868F,0x86A0, + 0x884F,0x8878,0x887A,0x886E,0x887B,0x8884,0x8873,INVALC, + INVALC,0x8A0D,0x8A0B,0x8A19, + /* Range 0x3425 - 0x3436, array index: 0x0840 */ + 0x8FF9,0x9009,0x9008,INVALC,0x90DE,0x9151,INVALC,INVALC, + 0x91DB,0x91DF,0x91DE,0x91D6,0x91E0,0x9585,0x9660,0x9659, + INVALC,0x9656, + /* Range 0x343C - 0x347D, array index: 0x0852 */ + 0x5042,0x5059,INVALC,0x5044,0x5066,0x5052,0x5054,0x5071, + 0x5050,0x507B,0x507C,0x5058,INVALC,INVALC,0x5079,0x506C, + 0x5078,0x51A8,0x51D1,0x51CF,0x5268,0x5276,0x52D4,INVALC, + 0x53A0,0x53C4,INVALC,0x5558,0x554C,0x5568,INVALC,0x5549, + INVALC,INVALC,0x555D,0x5529,INVALC,0x5554,0x5553,INVALC, + 0x555A,INVALC,0x553A,0x553F,0x552B,0x57EA,INVALC,0x57EF, + INVALC,INVALC,0x57DD,0x57FE,INVALC,0x57DE,0x57E6,INVALC, + 0x57E8,0x57FF,0x5803,0x58F7,0x68A6,0x591F,INVALC,0x595B, + 0x595D,0x595E, + /* Range 0x3527 - 0x353C, array index: 0x0894 */ + 0x5A61,0x5A3A,0x5A6E,0x5A4B,0x5A6B,INVALC,INVALC,0x5A45, + 0x5A4E,0x5A68,0x5A3D,0x5A71,0x5A3F,0x5A6F,0x5A75,INVALC, + 0x5A73,0x5A2C,0x5A59,0x5A54,0x5A4F,0x5A63, + /* Range 0x3543 - 0x355B, array index: 0x08AA */ + 0x5C5B,0x5C61,INVALC,0x5D21,0x5D0A,0x5D09,INVALC,0x5D2C, + 0x5D08,INVALC,INVALC,0x5D2A,0x5D15,INVALC,0x5D10,0x5D13, + INVALC,0x5D2F,0x5D18,INVALC,0x5DE3,0x5E39,0x5E35,0x5E3A, + 0x5E32, + /* Range 0x3560 - 0x3563, array index: 0x08C3 */ + 0x5EBB,0x5EBA,0x5F34,0x5F39, + /* Range 0x356E - 0x3576, array index: 0x08C7 */ + 0x60D7,0x60AA,INVALC,0x60A1,0x60A4,INVALC,0x60EE,INVALC, + 0x60E7, + /* Range 0x3622 - 0x367D, array index: 0x08D0 */ + 0x6379,0x6386,0x6393,INVALC,0x6373,0x636A,INVALC,0x636C, + INVALC,0x637F,INVALC,0x63B2,0x63BA,INVALC,INVALC,0x6366, + 0x6374,INVALC,0x655A,INVALC,0x654E,0x654D,0x658D,0x658E, + 0x65AD,INVALC,0x65C7,0x65CA,INVALC,0x65C9,INVALC,0x65E3, + 0x6657,INVALC,0x6663,0x6667,0x671A,0x6719,0x6716,INVALC, + INVALC,0x689E,0x68B6,0x6898,0x6873,INVALC,0x689A,0x688E, + 0x68B7,0x68DB,0x68A5,0x686C,0x68C1,0x6884,INVALC,INVALC, + 0x6895,0x687A,0x6899,INVALC,0x68B8,0x68B9,0x6870,INVALC, + 0x6B35,INVALC,0x6B90,0x6BBB,0x6BED,INVALC,INVALC,INVALC, + 0x6DC1,0x6DC3,0x6DCE,INVALC,INVALC,0x6DAD,0x6E04,INVALC, + 0x6DB9,INVALC,0x6DE7,INVALC,0x6E08,0x6E06,INVALC,0x6E0A, + 0x6DB0,INVALC,0x6DF8,0x6E0C, + /* Range 0x3721 - 0x373D, array index: 0x092C */ + 0x6DB1,INVALC,0x6E02,0x6E07,0x6E09,0x6E01,0x6E17,0x6DFF, + 0x6E12,INVALC,INVALC,0x7103,0x7107,0x7101,0x70F5,0x70F1, + 0x7108,0x70F2,0x710F,INVALC,0x70FE,INVALC,INVALC,INVALC, + 0x731A,0x7310,0x730E,0x7402,0x73F3, + /* Range 0x3744 - 0x374A, array index: 0x0949 */ + 0x751B,0x7523,0x7561,0x7568,INVALC,0x7567,0x75D3, + /* Range 0x3750 - 0x3759, array index: 0x0950 */ + 0x76D5,0x76D7,0x76D6,0x7730,INVALC,0x7726,INVALC,0x7740, + INVALC,0x771E, + /* Range 0x375D - 0x377E, array index: 0x095A */ + 0x7847,INVALC,0x784B,0x7851,0x784F,0x7842,0x7846,INVALC, + 0x796E,0x796C,0x79F2,INVALC,0x79F1,0x79F5,0x79F3,0x79F9, + INVALC,INVALC,INVALC,0x7A9A,0x7A93,0x7A91,0x7AE1,INVALC, + INVALC,0x7B21,0x7B1C,0x7B16,0x7B17,0x7B36,0x7B1F,INVALC, + 0x7C93,0x7C99, + /* Range 0x3839 - 0x3842, array index: 0x097C */ + 0x801D,INVALC,0x8049,0x8045,0x8044,0x7C9B,INVALC,INVALC, + 0x812A,0x812E, + /* Range 0x3845 - 0x3858, array index: 0x0986 */ + 0x8131,INVALC,0x811A,0x8134,0x8117,INVALC,INVALC,INVALC, + 0x831D,0x8371,0x8384,0x8380,0x8372,0x83A1,INVALC,0x8379, + 0x8391,INVALC,0x839F,0x83AD, + /* Range 0x385B - 0x387B, array index: 0x099A */ + 0x8323,INVALC,0x8385,0x839C,0x83B7,0x8658,0x865A,INVALC, + 0x8657,0x86B2,INVALC,0x86AE,INVALC,INVALC,INVALC,0x8845, + 0x889C,0x8894,0x88A3,0x888F,0x88A5,0x88A9,0x88A6,0x888A, + 0x88A0,0x8890,0x8992,0x8991,0x8994,INVALC,0x8A26,0x8A32, + 0x8A28, + /* Range 0x3929 - 0x3941, array index: 0x09BB */ + 0x8A21,0x8C3A,INVALC,0x8C5B,0x8C58,0x8C7C,INVALC,0x8CA6, + 0x8CAE,0x8CAD,0x8D65,INVALC,0x8D7E,INVALC,0x8D7C,0x8D7F, + 0x8D7A,0x8DBD,INVALC,INVALC,0x8DC0,0x8DBB,0x8EAD,0x8EAF, + 0x8ED6, + /* Range 0x394A - 0x3959, array index: 0x09D4 */ + 0x9012,0x900E,0x9025,INVALC,0x9013,0x90EE,INVALC,0x90AB, + 0x90F7,INVALC,0x9159,0x9154,0x91F2,0x91F0,0x91E5,0x91F6, + /* Range 0x3967 - 0x397E, array index: 0x09E4 */ + 0x98E1,0x98E6,INVALC,0x9EC4,0x9ED2,0x4E80,INVALC,0x4E81, + 0x508F,0x5097,0x5088,0x5089,INVALC,INVALC,0x5081,0x5160, + INVALC,INVALC,0x5E42,0x51D3,INVALC,INVALC,0x51D2,0x51D6, + /* Range 0x3A27 - 0x3A3C, array index: 0x09FC */ + 0x53A8,0x53A6,0x53C5,0x5597,0x55DE,INVALC,INVALC,0x5596, + 0x55B4,INVALC,0x5585,INVALC,0x559B,0x55A0,INVALC,0x5559, + INVALC,0x5586,INVALC,INVALC,0x55AF,0x557A, + /* Range 0x3A40 - 0x3A63, array index: 0x0A12 */ + 0x559E,INVALC,0x55A9,0x570F,0x570E,0x581A,INVALC,0x581F, + INVALC,0x583C,0x5818,0x583E,0x5826,INVALC,0x583A,INVALC, + 0x5822,INVALC,0x58FB,0x5963,0x5964,INVALC,0x5AA8,0x5AA3, + 0x5A82,0x5A88,0x5AA1,0x5A85,0x5A98,INVALC,0x5A99,INVALC, + 0x5A89,0x5A81,0x5A96,0x5A80, + /* Range 0x3A75 - 0x3A7E, array index: 0x0A36 */ + 0x5A79,INVALC,0x5A86,0x5AAB,0x5AAA,0x5AA4,0x5A8D,0x5A7E, + INVALC,0x5BD5, + /* Range 0x3B24 - 0x3B2E, array index: 0x0A40 */ + 0x5C1E,0x5C5F,0x5C5E,0x5D44,0x5D3E,INVALC,0x5D48,0x5D1C, + INVALC,0x5D5B,0x5D4D, + /* Range 0x3B33 - 0x3B47, array index: 0x0A4B */ + 0x5D53,0x5D4F,INVALC,0x5D3B,0x5D46,INVALC,INVALC,0x5E46, + 0x5E47,INVALC,0x5E48,0x5EC0,0x5EBD,0x5EBF,INVALC,0x5F11, + INVALC,0x5F3E,0x5F3B,INVALC,0x5F3A, + /* Range 0x3B4D - 0x3B68, array index: 0x0A60 */ + 0x60EA,INVALC,0x6107,0x6122,0x610C,INVALC,INVALC,0x60B3, + 0x60D6,0x60D2,INVALC,0x60E3,0x60E5,0x60E9,INVALC,INVALC, + 0x6111,0x60FD,INVALC,INVALC,0x611E,0x6120,0x6121,0x621E, + INVALC,0x63E2,0x63DE,0x63E6, + /* Range 0x3B6D - 0x3B76, array index: 0x0A7C */ + 0x63F8,INVALC,0x63FE,0x63C1,0x63BF,0x63F7,0x63D1,0x655F, + 0x6560,0x6561, + /* Range 0x3B7C - 0x3B7E, array index: 0x0A86 */ + 0x667D,0x666B,0x667F, + /* Range 0x3C23 - 0x3C2A, array index: 0x0A89 */ + 0x6673,0x6681,0x666D,0x6669,INVALC,INVALC,0x671E,0x68ED, + /* Range 0x3C2F - 0x3C5D, array index: 0x0A91 */ + 0x6903,INVALC,0x68FE,0x68E5,0x691E,0x6902,INVALC,INVALC, + 0x6909,0x68CA,0x6900,INVALC,0x6901,0x6918,0x68E2,0x68CF, + INVALC,0x692E,0x68C5,0x68FF,INVALC,0x691C,0x68C3,INVALC, + 0x6B6F,INVALC,0x6B6E,INVALC,0x6BBE,INVALC,0x6BF4,0x6C2D, + INVALC,0x6DB6,0x6E75,0x6E1E,INVALC,0x6E18,INVALC,0x6E48, + INVALC,0x6E4F,INVALC,0x6E42,0x6E6A,0x6E70,0x6DFE, + /* Range 0x3C60 - 0x3C74, array index: 0x0AC0 */ + 0x6E6D,INVALC,0x6E7B,0x6E7E,0x6E59,INVALC,0x6E57,INVALC, + 0x6E80,0x6E50,INVALC,0x6E29,0x6E76,0x6E2A,0x6E4C,0x712A, + INVALC,0x7135,0x712C,0x7137,0x711D, + /* Range 0x3C77 - 0x3C7D, array index: 0x0AD5 */ + 0x7138,INVALC,0x7134,0x712B,0x7133,0x7127,0x7124, + /* Range 0x3D21 - 0x3D47, array index: 0x0ADC */ + 0x712D,0x7232,0x7283,0x7282,0x7287,0x7306,0x7324,0x7338, + 0x732A,0x732C,0x732B,INVALC,0x732F,0x7328,0x7417,INVALC, + INVALC,0x7419,0x7438,INVALC,0x741F,0x7414,0x743C,0x73F7, + 0x741C,0x7415,0x7418,0x7439,0x74F9,0x7524,INVALC,INVALC, + INVALC,0x756E,0x756D,0x7571,0x758E,INVALC,0x75E5, + /* Range 0x3D4F - 0x3D69, array index: 0x0B03 */ + 0x76D9,INVALC,0x7748,0x7749,0x7743,INVALC,INVALC,0x7742, + 0x77DF,INVALC,0x7863,0x7876,INVALC,0x785F,0x7866,0x7966, + 0x7971,INVALC,INVALC,0x7976,0x7984,0x7975,0x79FF,0x7A07, + INVALC,0x7A0E,0x7A09, + /* Range 0x3D70 - 0x3D7B, array index: 0x0B1E */ + 0x7AE7,0x7AE2,0x7B55,INVALC,INVALC,0x7B43,0x7B57,0x7B6C, + 0x7B42,0x7B53,INVALC,0x7B41, + /* Range 0x3E21 - 0x3E63, array index: 0x0B2A */ + 0x7CA0,0x7CA6,0x7CA4,0x7D74,INVALC,0x7D59,INVALC,0x7D60, + 0x7D57,0x7D6C,0x7D7E,0x7D64,INVALC,0x7D5A,0x7D5D,INVALC, + INVALC,INVALC,0x7D76,0x7D4D,0x7D75,INVALC,0x7FD3,0x7FD6, + INVALC,INVALC,0x8060,0x804E,0x8145,0x813B,INVALC,0x8148, + 0x8142,0x8149,0x8140,0x8114,0x8141,INVALC,0x81EF,0x81F6, + 0x8203,INVALC,0x83ED,INVALC,0x83DA,0x8418,0x83D2,0x8408, + INVALC,0x8400,INVALC,INVALC,INVALC,0x8417,0x8346,0x8414, + 0x83D3,0x8405,0x841F,0x8402,0x8416,0x83CD,0x83E6,INVALC, + 0x865D,0x86D5,0x86E1, + /* Range 0x3E68 - 0x3E6A, array index: 0x0B6D */ + 0x86EE,0x8847,0x8846, + /* Range 0x3E7C - 0x3E7E, array index: 0x0B70 */ + 0x8A35,0x8A38,0x8A42, + /* Range 0x3F21 - 0x3F24, array index: 0x0B73 */ + 0x8A49,0x8A5D,0x8A4B,0x8A3D, + /* Range 0x3F29 - 0x3F59, array index: 0x0B77 */ + 0x8C60,0x8C5E,0x8C7F,0x8C7E,0x8C83,INVALC,0x8CB1,0x8D87, + INVALC,INVALC,0x8D88,0x8D83,INVALC,INVALC,0x8D86,0x8D8B, + 0x8D82,0x8DCA,0x8DD2,INVALC,INVALC,0x8DD4,0x8DC9,0x8EB0, + INVALC,INVALC,INVALC,0x8EF2,0x8EE4,0x8EF3,0x8EEA,INVALC, + 0x8EFD,INVALC,0x8F9D,0x902B,0x902A,INVALC,0x9028,0x9029, + 0x902C,INVALC,INVALC,0x903A,0x9030,0x9037,0x903B,INVALC, + 0x910A, + /* Range 0x3F62 - 0x3F69, array index: 0x0BA8 */ + 0x9218,0x9222,INVALC,0x921B,0x9208,INVALC,0x920E,0x9213, + /* Range 0x3F70 - 0x3F75, array index: 0x0BB0 */ + 0x968C,0x967B,0x967F,0x9681,INVALC,0x9682, + /* Range 0x4036 - 0x4061, array index: 0x0BB6 */ + 0x50CC,0x50BC,INVALC,0x50AA,0x50B9,INVALC,0x50AB,0x50C3, + 0x50CD,0x517E,0x527E,0x5279,INVALC,INVALC,0x52E1,0x52E0, + 0x52E7,0x5380,0x53AB,0x53AA,0x53A9,0x53E0,0x55EA,INVALC, + 0x55D7,INVALC,INVALC,0x55C1,0x5715,INVALC,0x586C,INVALC, + 0x585C,0x5850,0x5861,0x586A,0x5869,0x5856,0x5860,0x5866, + 0x585F,0x5923,0x5966,0x5968, + /* Range 0x4071 - 0x407D, array index: 0x0BE2 */ + 0x5B74,0x5B76,0x5BDC,0x5BD7,0x5BDA,0x5BDB,INVALC,0x5C20, + 0x5D6D,0x5D66,INVALC,0x5D64,0x5D6E, + /* Range 0x4121 - 0x413E, array index: 0x0BEF */ + 0x5D60,0x5F42,0x5F5A,0x5F6E,INVALC,INVALC,0x6130,0x613A, + 0x612A,0x6143,0x6119,0x6131,INVALC,0x613D,INVALC,INVALC, + INVALC,0x6408,0x6432,0x6438,INVALC,0x6431,INVALC,0x6419, + INVALC,0x6411,INVALC,INVALC,0x6429,0x641D, + /* Range 0x414D - 0x4151, array index: 0x0C0D */ + 0x6570,0x656D,INVALC,0x65E4,0x6693, + /* Range 0x4172 - 0x417E, array index: 0x0C12 */ + 0x6985,0x694D,0x6950,0x6947,0x6967,0x6936,0x6964,0x6961, + INVALC,0x697D,0x6B44,0x6B40,0x6B71, + /* Range 0x4226 - 0x4233, array index: 0x0C1F */ + 0x6BC1,INVALC,0x6BFA,0x6C31,0x6C32,INVALC,INVALC,0x6EB8, + 0x6EA8,INVALC,0x6E91,0x6EBB,INVALC,0x6E9A, + /* Range 0x4239 - 0x4249, array index: 0x0C2D */ + 0x6EB5,0x6E6C,0x6EE8,INVALC,0x6EDD,0x6EDA,0x6EE6,0x6EAC, + INVALC,INVALC,INVALC,0x6ED9,0x6EE3,0x6EE9,0x6EDB,INVALC, + 0x716F, + /* Range 0x424E - 0x427E, array index: 0x0C3E */ + 0x714A,0x716B,INVALC,0x714F,0x7157,0x7174,INVALC,INVALC, + INVALC,0x7145,0x7151,0x716D,INVALC,0x7251,0x7250,0x724E, + INVALC,0x7341,INVALC,0x732E,0x7346,INVALC,0x7427,INVALC, + 0x7448,0x7453,0x743D,INVALC,0x745D,0x7456,INVALC,0x741E, + 0x7447,0x7443,0x7458,0x7449,INVALC,0x744C,0x7445,0x743E, + INVALC,0x7501,0x751E,INVALC,INVALC,0x757A,0x75EE,0x7602, + 0x7697, + /* Range 0x4325 - 0x4339, array index: 0x0C6F */ + 0x775D,0x7764,0x7753,0x7758,0x7882,0x7890,0x788A,INVALC, + 0x787A,0x787D,INVALC,0x788B,0x7878,INVALC,INVALC,0x788D, + 0x7888,0x7892,0x7881,0x797E,0x7983, + /* Range 0x4346 - 0x4355, array index: 0x0C84 */ + 0x7AA1,0x7AA4,INVALC,0x7AE9,0x7AEA,INVALC,0x7B62,0x7B6B, + INVALC,0x7B5E,INVALC,0x7B79,INVALC,INVALC,0x7B6F,0x7B68, + /* Range 0x4360 - 0x436A, array index: 0x0C94 */ + 0x7D8A,INVALC,0x7D8B,0x7D99,0x7D95,INVALC,0x7D87,0x7D78, + 0x7D97,0x7D89,0x7D98, + /* Range 0x4372 - 0x4377, array index: 0x0C9F */ + 0x7FDD,0x8057,INVALC,0x8163,0x816A,0x816C, + /* Range 0x4422 - 0x444F, array index: 0x0CA5 */ + 0x817D,0x816D,INVALC,INVALC,0x8241,0x844F,0x8484,INVALC, + 0x847F,INVALC,0x8448,0x842A,0x847B,0x8472,0x8464,0x842E, + 0x845C,0x8453,INVALC,0x8441,0x84C8,INVALC,0x8462,0x8480, + 0x843E,0x8483,0x8471,INVALC,0x844A,0x8455,0x8458,INVALC, + INVALC,INVALC,0x86FC,0x86FD,0x8715,INVALC,0x8716,0x86FF, + INVALC,INVALC,INVALC,0x8858,0x88CF,0x88E0, + /* Range 0x4454 - 0x446B, array index: 0x0CD3 */ + 0x89E7,0x8A6A,0x8A80,INVALC,0x8A6F,0x8A65,INVALC,0x8A78, + 0x8A7D,0x8A88,INVALC,INVALC,0x8A64,0x8A7E,INVALC,0x8A67, + 0x8C63,0x8C88,INVALC,0x8CCD,INVALC,0x8CC9,INVALC,0x8DED, + /* Range 0x4476 - 0x447E, array index: 0x0CEB */ + 0x8F04,0x8F9E,0x8FA0,0x9043,0x9046,0x9048,0x9045,0x9040, + 0x904C, + /* Range 0x4523 - 0x453C, array index: 0x0CF4 */ + 0x910C,0x9113,0x9115,INVALC,0x916B,0x9167,0x925D,0x9255, + 0x9235,INVALC,0x9259,0x922F,0x923C,0x928F,0x925C,0x926A, + 0x9262,0x925F,0x926B,0x926E,0x923B,0x9244,0x9241,0x959A, + INVALC,0x9599, + /* Range 0x4557 - 0x455C, array index: 0x0D0E */ + 0x98F7,0x98FF,0x98F5,INVALC,0x98EC,0x98F1, + /* Range 0x455F - 0x4576, array index: 0x0D14 */ + 0x999A,INVALC,0x9AE2,0x9B3D,0x9B5D,0x9CE8,INVALC,0x9CEB, + 0x9CEF,0x9CEE,0x9E81,0x9F14,0x50D0,0x50D9,0x50DC,0x50D8, + INVALC,0x50E1,0x50EB,INVALC,INVALC,0x50F4,0x50E2,0x50DE, + /* Range 0x4625 - 0x4664, array index: 0x0D2C */ + 0x53AE,0x53B0,INVALC,0x55FB,0x5603,0x560B,INVALC,0x5607, + INVALC,0x55F8,INVALC,0x5628,0x561E,INVALC,0x5618,0x5611, + 0x5651,0x5605,0x5717,0x5892,INVALC,0x588C,INVALC,0x5878, + 0x5884,0x5873,0x58AD,0x5897,0x5895,0x5877,0x5872,0x5896, + 0x588D,0x5910,INVALC,0x596C,INVALC,0x5AE7,INVALC,0x5AE4, + INVALC,INVALC,0x5AEF,0x5626,INVALC,INVALC,0x5AF0,0x5D7B, + INVALC,0x5D83,INVALC,INVALC,0x5D8B,0x5D8C,INVALC,0x5D78, + 0x5E52,INVALC,INVALC,0x5ED0,0x5ECF,INVALC,0x5FB3,0x5FB4, + /* Range 0x4668 - 0x467B, array index: 0x0D6C */ + 0x617B,INVALC,0x616F,0x6181,0x613C,0x6142,0x6138,0x6133, + INVALC,0x6160,0x6169,0x617D,0x6186,0x622C,0x6228,INVALC, + 0x644C,INVALC,0x6457,0x647C, + /* Range 0x4721 - 0x472A, array index: 0x0D80 */ + 0x6462,0x6471,0x646A,0x6456,0x643B,0x6481,INVALC,0x644F, + 0x647E,0x6464, + /* Range 0x4733 - 0x474E, array index: 0x0D8A */ + 0x66A5,0x669A,0x669C,INVALC,0x66A6,INVALC,0x66A4,0x698F, + 0x69C5,0x69C8,0x6992,0x69B2,INVALC,INVALC,INVALC,0x69E3, + 0x69C0,0x69D6,0x69D1,0x699F,0x69A2,0x69D2,INVALC,INVALC, + INVALC,0x69E1,0x69D5,0x699D, + /* Range 0x4753 - 0x4772, array index: 0x0DA6 */ + 0x6B74,0x6BA1,INVALC,0x6EF0,0x6EF3,INVALC,INVALC,0x6F1B, + 0x6F0C,0x6F1D,0x6F34,0x6F28,0x6F17,INVALC,0x6F44,0x6F42, + 0x6F04,0x6F11,0x6EFA,0x6F4A,0x7191,0x718E,INVALC,0x718B, + 0x718D,0x717F,0x718C,0x717E,0x717C,0x7183,INVALC,0x7188, + /* Range 0x4775 - 0x477E, array index: 0x0DC6 */ + 0x7294,INVALC,0x7355,0x7353,0x734F,0x7354,0x746C,0x7465, + 0x7466,0x7461, + /* Range 0x4821 - 0x482B, array index: 0x0DD0 */ + 0x746B,0x7468,0x7476,INVALC,0x7460,INVALC,0x7474,0x7506, + 0x760E,INVALC,0x7607, + /* Range 0x4830 - 0x4840, array index: 0x0DDB */ + 0x76B7,0x76E2,INVALC,0x7774,0x7777,0x7776,0x7775,INVALC, + 0x7778,0x7771,INVALC,0x777A,0x715B,0x777B,0x78A6,0x78AE, + 0x78B8, + /* Range 0x4844 - 0x4848, array index: 0x0DEC */ + 0x78B1,0x78AF,INVALC,0x7989,0x7987, + /* Range 0x4852 - 0x4862, array index: 0x0DF1 */ + 0x7A32,INVALC,0x7AEC,0x7AF0,0x7B81,0x7B9E,0x7B83,INVALC, + 0x7B92,INVALC,0x7BA3,0x7B9F,0x7B93,INVALC,0x7B86,0x7CB8, + 0x7CB7, + /* Range 0x486D - 0x4879, array index: 0x0E02 */ + 0x7DA8,0x7DAB,INVALC,0x7DB3,0x7DCD,INVALC,0x7DCF,0x7DA4, + INVALC,INVALC,0x7F41,0x7F6F,0x7F71, + /* Range 0x4922 - 0x492E, array index: 0x0E0F */ + 0x8023,0x805B,INVALC,0x8061,0x805F,0x8181,INVALC,INVALC, + 0x8184,0x8213,INVALC,0x824A,0x824C, + /* Range 0x4932 - 0x4959, array index: 0x0E1C */ + 0x84BD,0x8495,INVALC,0x8492,0x84C3,INVALC,0x8496,0x84A5, + 0x84B5,0x84B3,0x84A3,0x84E4,0x84D8,0x84D5,INVALC,0x84B7, + 0x84AD,0x84DA,0x8493,0x8736,INVALC,INVALC,INVALC,0x873D, + 0x872B,0x8747,0x8739,INVALC,0x8745,0x871D,INVALC,0x88FF, + 0x88EA,INVALC,0x88F5,INVALC,0x8900,0x88ED,0x8903,0x88E9, + /* Range 0x495C - 0x4968, array index: 0x0E44 */ + 0x89EA,INVALC,0x8A9B,0x8A8E,0x8AA2,INVALC,0x8A9C,0x8A94, + 0x8A90,0x8AA9,0x8AAC,INVALC,0x8A9F, + /* Range 0x4970 - 0x497D, array index: 0x0E51 */ + 0x8CD0,0x8CD6,0x8CD4,0x8D98,0x8D9A,0x8D97,INVALC,INVALC, + INVALC,0x8E0B,0x8E08,0x8E01,0x8EB4,0x8EB3, + /* Range 0x4A26 - 0x4A39, array index: 0x0E5F */ + 0x9061,0x905F,INVALC,INVALC,0x9125,0x917B,0x9176,0x917C, + INVALC,0x9289,0x92F6,0x92B1,0x92AD,0x9292,0x9281,0x9284, + INVALC,0x92AE,0x9290,0x929E, + /* Range 0x4A44 - 0x4A49, array index: 0x0E73 */ + 0x96A0,0x969D,0x969F,0x96D0,INVALC,0x96D1, + /* Range 0x4A52 - 0x4A56, array index: 0x0E79 */ + 0x9819,INVALC,0x9814,0x9815,0x981A, + /* Range 0x4A5D - 0x4A66, array index: 0x0E7E */ + 0x98F8,0x9901,INVALC,0x99BE,0x99BC,0x99B7,0x99B6,0x99C0, + INVALC,0x99B8, + /* Range 0x4A6C - 0x4A75, array index: 0x0E88 */ + 0x99BF,INVALC,0x9ADA,0x9AE4,0x9AE9,0x9AE8,0x9AEA,0x9AE5, + INVALC,0x9B26, + /* Range 0x4B29 - 0x4B5F, array index: 0x0E92 */ + 0x50F7,INVALC,0x50FC,0x510D,0x5101,0x51DA,0x51D9,0x51DB, + 0x5286,0x528E,0x52EE,0x5333,0x53B1,INVALC,0x5647,0x562D, + 0x5654,INVALC,0x564B,0x5652,0x5631,0x5644,0x5656,0x5650, + 0x562B,INVALC,0x564D,0x5637,0x564F,0x58A2,0x58B7,INVALC, + 0x58B2,INVALC,0x58AA,0x58B5,0x58B0,INVALC,0x58B4,0x58A4, + 0x58A7,INVALC,0x5926,0x5AFE,INVALC,0x5B04,INVALC,0x5AFC, + INVALC,0x5B06,0x5B0A,0x5AFA,0x5B0D,0x5B00,0x5B0E, + /* Range 0x4B63 - 0x4B6D, array index: 0x0EC9 */ + 0x5D91,INVALC,0x5D8F,0x5D90,0x5D98,0x5DA4,0x5D9B,0x5DA3, + 0x5D96,0x5DE4,0x5E5A, + /* Range 0x4B70 - 0x4B7E, array index: 0x0ED4 */ + 0x5E5E,INVALC,0x5FB8,0x6157,0x615C,0x61A6,0x6195,0x6188, + INVALC,0x61A3,0x618F,INVALC,0x6164,INVALC,0x6159, + /* Range 0x4C21 - 0x4C4A, array index: 0x0EE3 */ + 0x6178,INVALC,0x6185,0x6187,0x619E,INVALC,INVALC,0x6198, + 0x619C,INVALC,INVALC,0x622F,0x6480,0x649B,0x648E,0x648D, + 0x6494,0x64C6,INVALC,0x64A8,0x6483,INVALC,0x64B9,0x6486, + 0x64B4,0x64AF,0x6491,INVALC,0x64AA,0x64A1,0x64A7,0x66B6, + 0x66B3,INVALC,0x66BC,0x66AC,INVALC,0x66AD,0x6A0E,INVALC, + 0x6A1C,0x6A1A, + /* Range 0x4C4D - 0x4C6C, array index: 0x0F0D */ + 0x6A0B,INVALC,0x69EF,0x6A0C,0x69F0,0x6A22,INVALC,0x69D8, + INVALC,0x6A12,0x69FA,INVALC,0x6A2A,INVALC,0x6A10,INVALC, + INVALC,0x6A29,0x69F9,0x69EA,0x6A2C,0x6A24,INVALC,0x69E9, + 0x6B52,0x6B4F,0x6B53,INVALC,INVALC,0x6F10,0x6F65,0x6F75, + /* Range 0x4C71 - 0x4C7E, array index: 0x0F2D */ + 0x6FD0,INVALC,0x6F5C,0x6F3D,0x6F71,INVALC,0x6F91,0x6F0B, + 0x6F79,0x6F81,0x6F8F,INVALC,0x6F59,0x6F74, + /* Range 0x4D24 - 0x4D31, array index: 0x0F3B */ + 0x71A3,0x71AD,INVALC,INVALC,0x71AB,0x71A6,0x71A2,INVALC, + 0x52F2,0x7257,0x7255,0x7299,0x734B,0x747A, + /* Range 0x4D35 - 0x4D3D, array index: 0x0F49 */ + 0x748C,0x7484,INVALC,INVALC,0x7482,0x7493,0x747B,INVALC, + 0x7509, + /* Range 0x4D46 - 0x4D5D, array index: 0x0F52 */ + 0x7790,INVALC,0x78C6,0x78D3,0x78C0,0x78D2,0x78C7,0x78C2, + INVALC,0x799F,0x799D,0x799E,INVALC,0x7A41,INVALC,0x7A38, + 0x7A3A,0x7A42,INVALC,INVALC,0x7A3E,0x7AB0,0x7BAE,0x7BB3, + /* Range 0x4D6D - 0x4D7E, array index: 0x0F6A */ + 0x7CC4,0x7CCD,0x7CC2,0x7CC6,0x7CC3,0x7CC9,0x7CC7,INVALC, + 0x7DF8,INVALC,0x7DED,0x7DE2,INVALC,INVALC,INVALC,0x7DDC, + 0x7E02,0x7E01, + /* Range 0x4E24 - 0x4E3D, array index: 0x0F7C */ + 0x7DE4,0x7DFE,INVALC,0x7E00,0x7DFC,0x7DFD,INVALC,0x7DF5, + 0x7DFF,INVALC,0x7DEB,0x7DE5,0x7F78,0x7FAE,0x7FE7,INVALC, + 0x8065,0x806A,0x8066,0x8068,0x806B,0x8194,0x81A1,0x8192, + 0x8196,0x8193, + /* Range 0x4E4B - 0x4E4F, array index: 0x0F96 */ + 0x851B,0x8503,0x8533,0x8534,0x84ED, + /* Range 0x4E5D - 0x4E76, array index: 0x0F9B */ + 0x8771,INVALC,0x885C,0x88E6,0x890F,0x891B,INVALC,0x89A9, + 0x89A5,0x89EE,0x8AB1,INVALC,0x8ACC,0x8ACE,INVALC,0x8AB7, + INVALC,0x8AB5,0x8AE9,0x8AB4,INVALC,0x8AB3,0x8AC1,0x8AAF, + 0x8ACA,0x8AD0, + /* Range 0x4F22 - 0x4F26, array index: 0x0FB5 */ + 0x8CEB,0x8DA4,INVALC,0x8DA2,0x8D9D, + /* Range 0x4F2B - 0x4F56, array index: 0x0FBA */ + 0x8E2A,0x8E28,INVALC,INVALC,0x8EB8,0x8EB6,0x8EB9,0x8EB7, + 0x8F22,0x8F2B,0x8F27,0x8F19,0x8FA4,INVALC,0x8FB3,INVALC, + 0x9071,0x906A,INVALC,INVALC,0x9188,0x918C,0x92BF,0x92B8, + 0x92BE,0x92DC,0x92E5,INVALC,INVALC,0x92D4,0x92D6,INVALC, + 0x92DA,0x92ED,0x92F3,0x92DB,INVALC,0x92B9,0x92E2,0x92EB, + 0x95AF,INVALC,0x95B2,0x95B3, + /* Range 0x4F60 - 0x4F7E, array index: 0x0FE6 */ + 0x970A,INVALC,0x9787,0x9789,0x978C,0x97EF,0x982A,0x9822, + INVALC,0x981F,INVALC,0x9919,INVALC,0x99CA,0x99DA,INVALC, + INVALC,INVALC,0x99DE,0x99C8,0x99E0,INVALC,0x9AB6,0x9AB5, + INVALC,0x9AF4,INVALC,0x9B6B,0x9B69,0x9B72,0x9B63, + /* Range 0x502A - 0x5038, array index: 0x1005 */ + 0x9CFE,0x9D02,0x9E84,INVALC,0x9EAB,0x9EAA,0x511D,0x5116, + INVALC,0x512B,0x511E,0x511B,0x5290,0x5294,0x5314, + /* Range 0x5048 - 0x5070, array index: 0x1014 */ + 0x58C3,0x58CA,0x58BB,0x58C0,0x58C4,0x5901,0x5B1F,0x5B18, + 0x5B11,0x5B15,INVALC,0x5B12,0x5B1C,INVALC,0x5B22,0x5B79, + 0x5DA6,INVALC,0x5DB3,0x5DAB,0x5EEA,INVALC,0x5F5B,INVALC, + INVALC,0x61B7,0x61CE,0x61B9,0x61BD,0x61CF,0x61C0,0x6199, + 0x6197,INVALC,0x61BB,0x61D0,0x61C4,0x6231,INVALC,0x64D3, + 0x64C0, + /* Range 0x5075 - 0x507E, array index: 0x103D */ + 0x64DC,0x64D1,0x64C8,INVALC,0x64D5,0x66C3,INVALC,INVALC, + 0x66BF,0x66C5, + /* Range 0x5122 - 0x5132, array index: 0x1047 */ + 0x66CD,0x66C1,0x6706,INVALC,0x6724,0x6A63,0x6A42,0x6A52, + INVALC,0x6A43,0x6A33,INVALC,0x6A6C,0x6A57,INVALC,0x6A4C, + 0x6A6E, + /* Range 0x5138 - 0x5146, array index: 0x1058 */ + 0x6A37,INVALC,0x6A71,0x6A4A,0x6A36,INVALC,0x6A53,INVALC, + 0x6A45,0x6A70,INVALC,INVALC,0x6A5C,0x6B58,0x6B57, + /* Range 0x5154 - 0x5176, array index: 0x1067 */ + 0x6FB5,0x6FD3,0x6F9F,INVALC,0x6FB7,0x6FF5,0x71B7,INVALC, + 0x71BB,INVALC,0x71D1,INVALC,0x71BA,INVALC,0x71B6,0x71CC, + INVALC,INVALC,0x71D3,0x749B,INVALC,INVALC,0x7496,0x74A2, + 0x749D,0x750A,0x750E,INVALC,0x7581,0x762C,0x7637,0x7636, + 0x763B,INVALC,0x76A1, + /* Range 0x5224 - 0x5234, array index: 0x108A */ + 0x78DC,INVALC,0x79A5,0x79A9,0x9834,0x7A53,0x7A45,INVALC, + 0x7A4F,INVALC,0x7ABD,0x7ABB,0x7AF1,INVALC,INVALC,0x7BEC, + 0x7BED, + /* Range 0x5252 - 0x526B, array index: 0x109B */ + 0x8542,INVALC,0x855C,0x8570,0x855F,INVALC,0x855A,0x854B, + 0x853F,0x878A,INVALC,0x878B,0x87A1,0x878E,INVALC,INVALC, + 0x8799,0x885E,0x885F,0x8924,0x89A7,0x8AEA,0x8AFD,0x8AF9, + 0x8AE3,0x8AE5, + /* Range 0x5321 - 0x5344, array index: 0x10B5 */ + 0x8F31,0x8F30,INVALC,0x8F2D,0x8F3C,0x8FA7,0x8FA5,INVALC, + INVALC,INVALC,0x9137,0x9195,0x918E,INVALC,0x9196,INVALC, + 0x9345,0x930A,INVALC,INVALC,0x92FD,0x9317,0x931C,0x9307, + 0x9331,0x9332,0x932C,0x9330,0x9303,0x9305,INVALC,0x95C2, + INVALC,0x95B8,INVALC,0x95C1, + /* Range 0x5358 - 0x536C, array index: 0x10D9 */ + 0x9836,0x9831,0x9833,0x983C,0x982E,0x983A,INVALC,0x983D, + INVALC,0x98B5,0x9922,0x9923,0x9920,0x991C,0x991D,INVALC, + 0x99A0,INVALC,0x99EF,0x99E8,0x99EB, + /* Range 0x5374 - 0x537D, array index: 0x10EE */ + 0x9AF8,0x9AF5,INVALC,INVALC,0x9B83,0x9B94,0x9B84,INVALC, + 0x9B8B,0x9B8F, + /* Range 0x5429 - 0x542D, array index: 0x10F8 */ + 0x9D24,0x9D0F,INVALC,0x9D13,0x9D0A, + /* Range 0x5432 - 0x5461, array index: 0x10FD */ + 0x9D2A,0x9D1A,INVALC,0x9D27,0x9D16,0x9D21,INVALC,0x9E85, + 0x9EAC,0x9EC6,0x9EC5,0x9ED7,0x9F53,INVALC,0x5128,0x5127, + 0x51DF,INVALC,0x5335,0x53B3,INVALC,0x568A,0x567D,0x5689, + INVALC,0x58CD,0x58D0,INVALC,0x5B2B,0x5B33,0x5B29,0x5B35, + 0x5B31,0x5B37,0x5C36,0x5DBE,INVALC,0x5DB9,INVALC,0x5DBB, + INVALC,0x61E2,0x61DB,0x61DD,0x61DC,0x61DA,INVALC,0x61D9, + /* Range 0x5469 - 0x547C, array index: 0x112D */ + 0x64EE,INVALC,0x65B5,0x66D4,0x66D5,INVALC,0x66D0,0x66D1, + 0x66CE,0x66D7,INVALC,INVALC,0x6A7D,0x6A8A,INVALC,0x6AA7, + INVALC,0x6A99,0x6A82,0x6A88, + /* Range 0x552D - 0x5539, array index: 0x1141 */ + 0x6C0A,INVALC,0x6FD7,0x6FD6,0x6FE5,INVALC,INVALC,INVALC, + 0x6FD9,0x6FDA,0x6FEA,INVALC,0x6FF6, + /* Range 0x553E - 0x5543, array index: 0x114E */ + 0x71E9,INVALC,0x71EB,0x71EF,0x71F3,0x71EA, + /* Range 0x5552 - 0x5575, array index: 0x1154 */ + 0x7583,0x7645,0x764E,0x7644,0x76A3,0x76A5,0x77A6,0x77A4, + INVALC,0x77A9,0x77AF,INVALC,INVALC,INVALC,0x78F0,0x78F8, + 0x78F1,INVALC,0x7A49,INVALC,INVALC,INVALC,0x7AC2,0x7AF2, + 0x7AF3,0x7BFA,INVALC,0x7BF6,0x7BFC,0x7C18,0x7C08,0x7C12, + INVALC,INVALC,0x7CDB,0x7CDA, + /* Range 0x5621 - 0x5624, array index: 0x1178 */ + 0x802B,0x8074,0x81B8,0x81C8, + /* Range 0x5628 - 0x562D, array index: 0x117C */ + 0x8592,0x8593,INVALC,0x857F,0x85AB,0x8597, + /* Range 0x5639 - 0x5642, array index: 0x1182 */ + 0x87C1,0x87B1,0x87C7,INVALC,0x8940,INVALC,0x893F,0x8939, + INVALC,0x8943, + /* Range 0x5646 - 0x564A, array index: 0x118C */ + 0x89AB,INVALC,0x8B1F,0x8B09,0x8B0C, + /* Range 0x5651 - 0x5675, array index: 0x1191 */ + 0x8CF6,0x8CF7,INVALC,0x8E46,0x8E4F,INVALC,INVALC,INVALC, + 0x8F3D,0x8F41,0x9366,0x9378,0x935D,0x9369,0x9374,0x937D, + 0x936E,0x9372,0x9373,0x9362,0x9348,0x9353,0x935F,0x9368, + INVALC,0x937F,0x936B,INVALC,0x95C4,INVALC,0x96AF,0x96AD, + 0x96B2,INVALC,INVALC,0x971A,0x971B, + /* Range 0x573A - 0x5745, array index: 0x11B6 */ + 0x9ABD,0x9B00,0x9B02,INVALC,0x9B34,0x9B49,0x9B9F,INVALC, + 0x9BA3,0x9BCD,0x9B99,0x9B9D, + /* Range 0x5755 - 0x5765, array index: 0x11C2 */ + 0x9F8E,INVALC,0x569F,0x569B,0x569E,0x5696,0x5694,0x56A0, + INVALC,0x5B3B,INVALC,INVALC,0x5B3A,0x5DC1,0x5F4D,0x5F5D, + 0x61F3, + /* Range 0x576A - 0x577E, array index: 0x11D3 */ + 0x64F6,0x64E5,0x64EA,0x64E7,0x6505,INVALC,0x64F9,INVALC, + INVALC,INVALC,0x6AAB,0x6AED,0x6AB2,0x6AB0,0x6AB5,0x6ABE, + 0x6AC1,0x6AC8,INVALC,0x6AC0,0x6ABC, + /* Range 0x5821 - 0x5845, array index: 0x11E8 */ + 0x6AB1,0x6AC4,0x6ABF,INVALC,INVALC,0x7008,0x7003,0x6FFD, + 0x7010,0x7002,0x7013,INVALC,0x71FA,0x7200,0x74B9,0x74BC, + INVALC,0x765B,0x7651,0x764F,0x76EB,0x77B8,INVALC,0x77B9, + 0x77C1,0x77C0,0x77BE,0x790B,INVALC,0x7907,0x790A,0x7908, + INVALC,0x790D,0x7906,0x7915,0x79AF, + /* Range 0x5854 - 0x585D, array index: 0x120D */ + 0x7CE6,0x7CE3,INVALC,INVALC,0x7E5D,0x7E4F,0x7E66,0x7E5B, + 0x7F47,0x7FB4, + /* Range 0x586B - 0x587E, array index: 0x1217 */ + 0x85CC,0x85B2,INVALC,0x85BB,0x85C1,INVALC,INVALC,INVALC, + 0x87E9,0x87EE,0x87F0,0x87D6,0x880E,0x87DA,0x8948,0x894A, + 0x894E,0x894D,0x89B1,0x89B0, + /* Range 0x5931 - 0x5951, array index: 0x122B */ + 0x8DA9,0x8E58,INVALC,INVALC,0x8EBF,0x8EC1,0x8F4A,0x8FAC, + INVALC,0x9089,0x913D,0x913C,0x91A9,0x93A0,INVALC,0x9390, + INVALC,0x9393,0x938B,0x93AD,0x93BB,0x93B8,INVALC,INVALC, + 0x939C,0x95D8,0x95D7,INVALC,INVALC,INVALC,0x975D,0x97A9, + 0x97DA, + /* Range 0x5958 - 0x595C, array index: 0x124C */ + 0x9855,0x984B,INVALC,0x983F,0x98B9, + /* Range 0x5961 - 0x597E, array index: 0x1251 */ + 0x9938,0x9936,0x9940,INVALC,0x993B,0x9939,0x99A4,INVALC, + INVALC,0x9A08,0x9A0C,INVALC,0x9A10,INVALC,0x9B07,INVALC, + 0x9BD2,INVALC,0x9BC2,0x9BBB,0x9BCC,0x9BCB,INVALC,INVALC, + 0x9D4D,0x9D63,0x9D4E,INVALC,0x9D50,0x9D55, + /* Range 0x5A22 - 0x5A3C, array index: 0x126F */ + 0x9D5E,INVALC,0x9E90,0x9EB2,0x9EB1,INVALC,0x9ECA,0x9F02, + 0x9F27,0x9F26,INVALC,0x56AF,0x58E0,0x58DC,INVALC,0x5B39, + INVALC,INVALC,0x5B7C,0x5BF3,INVALC,INVALC,0x5C6B,0x5DC4, + 0x650B,0x6508,0x650A, + /* Range 0x5A42 - 0x5A48, array index: 0x128A */ + 0x66E1,0x66DF,0x6ACE,0x6AD4,0x6AE3,0x6AD7,0x6AE2, + /* Range 0x5A4D - 0x5A67, array index: 0x1291 */ + 0x6AD8,0x6AD5,0x6AD2,INVALC,INVALC,0x701E,0x702C,0x7025, + 0x6FF3,0x7204,0x7208,0x7215,INVALC,0x74C4,0x74C9,0x74C7, + 0x74C8,0x76A9,0x77C6,0x77C5,0x7918,0x791A,0x7920,INVALC, + 0x7A66,0x7A64,0x7A6A, + /* Range 0x5A74 - 0x5A7E, array index: 0x12AC */ + 0x7E6E,0x7E71,INVALC,0x81D4,0x81D6,0x821A,0x8262,0x8265, + 0x8276,0x85DB,0x85D6, + /* Range 0x5B25 - 0x5B2C, array index: 0x12B7 */ + 0x85F4,INVALC,0x87FD,0x87D5,0x8807,INVALC,0x880F,0x87F8, + /* Range 0x5B31 - 0x5B50, array index: 0x12BF */ + 0x89B5,0x89F5,INVALC,0x8B3F,0x8B43,0x8B4C,INVALC,0x8D0B, + 0x8E6B,0x8E68,0x8E70,0x8E75,0x8E77,INVALC,0x8EC3,INVALC, + 0x93E9,0x93EA,0x93CB,0x93C5,0x93C6,INVALC,0x93ED,0x93D3, + INVALC,0x93E5,INVALC,INVALC,0x93DB,0x93EB,0x93E0,0x93C1, + /* Range 0x5B5D - 0x5B61, array index: 0x12DF */ + 0x97B2,0x97B4,0x97B1,0x97B5,0x97F2, + /* Range 0x5B69 - 0x5B7E, array index: 0x12E4 */ + 0x9944,INVALC,0x9A26,0x9A1F,0x9A18,0x9A21,0x9A17,INVALC, + 0x9B09,INVALC,INVALC,0x9BC5,0x9BDF,INVALC,0x9BE3,INVALC, + 0x9BE9,0x9BEE,INVALC,INVALC,0x9D66,0x9D7A, + /* Range 0x5C22 - 0x5C43, array index: 0x12FA */ + 0x9D6E,0x9D91,0x9D83,0x9D76,0x9D7E,0x9D6D,INVALC,0x9E95, + 0x9EE3,INVALC,INVALC,0x9F03,0x9F04,INVALC,0x9F17,INVALC, + 0x5136,INVALC,0x5336,INVALC,0x5B42,INVALC,INVALC,0x5B44, + 0x5B46,0x5B7E,0x5DCA,0x5DC8,0x5DCC,0x5EF0,INVALC,0x6585, + 0x66E5,0x66E7, + /* Range 0x5C53 - 0x5C66, array index: 0x131C */ + 0x7216,INVALC,0x7212,0x720F,0x7217,0x7211,0x720B,INVALC, + INVALC,0x74CD,0x74D0,0x74CC,0x74CE,0x74D1,INVALC,0x7589, + INVALC,0x7A6F,0x7C4B,0x7C44, + /* Range 0x5C6C - 0x5C7E, array index: 0x1330 */ + 0x7E7F,0x8B71,INVALC,0x802F,0x807A,0x807B,0x807C,INVALC, + INVALC,INVALC,0x85FC,0x8610,0x8602,INVALC,INVALC,0x85EE, + 0x8603,INVALC,0x860D, + /* Range 0x5D21 - 0x5D49, array index: 0x1343 */ + 0x8613,0x8608,0x860F,0x8818,0x8812,INVALC,INVALC,0x8967, + 0x8965,0x89BB,0x8B69,0x8B62,INVALC,0x8B6E,INVALC,0x8B61, + INVALC,0x8B64,0x8B4D,0x8C51,INVALC,INVALC,0x8E83,0x8EC6, + INVALC,0x941F,INVALC,0x9404,0x9417,0x9408,0x9405,INVALC, + 0x93F3,0x941E,0x9402,0x941A,0x941B,0x9427,0x941C,INVALC, + 0x96B5, + /* Range 0x5D4C - 0x5D53, array index: 0x136C */ + 0x9733,INVALC,0x9734,0x9731,0x97B8,0x97BA,INVALC,0x97FC, + /* Range 0x5D5E - 0x5D7A, array index: 0x1374 */ + 0x9AC9,INVALC,0x9AC8,0x9AC4,0x9B2A,0x9B38,0x9B50,INVALC, + 0x9C0A,0x9BFB,0x9C04,0x9BFC,0x9BFE,INVALC,INVALC,INVALC, + 0x9C02,0x9BF6,0x9C1B,0x9BF9,0x9C15,0x9C10,0x9BFF,0x9C00, + 0x9C0C,INVALC,INVALC,0x9D95,0x9DA5, + /* Range 0x5E21 - 0x5E2A, array index: 0x1391 */ + 0x9E98,0x9EC1,INVALC,0x9F5A,0x5164,0x56BB,INVALC,0x58E6, + 0x5B49,0x5BF7, + /* Range 0x5E31 - 0x5E6A, array index: 0x139B */ + 0x6511,INVALC,0x6AFF,0x6AFE,0x6AFD,INVALC,0x6B01,INVALC, + INVALC,0x704B,0x704D,0x7047,0x74D3,0x7668,0x7667,INVALC, + INVALC,0x77D1,0x7930,0x7932,0x792E,INVALC,0x9F9D,0x7AC9, + 0x7AC8,INVALC,0x7C56,0x7C51,INVALC,INVALC,INVALC,0x7E85, + 0x7E89,0x7E8E,0x7E84,INVALC,0x826A,0x862B,0x862F,0x8628, + INVALC,0x8616,0x8615,0x861D,0x881A,INVALC,INVALC,INVALC, + 0x89BC,0x8B75,0x8B7C,INVALC,0x8D11,0x8D12,0x8F5C,0x91BB, + INVALC,0x93F4, + /* Range 0x5E70 - 0x5E7E, array index: 0x13D5 */ + 0x96E4,0x9737,0x9736,0x9767,0x97BE,0x97BD,0x97E2,0x9868, + 0x9866,0x98C8,0x98CA,0x98C7,0x98DC,INVALC,0x994F, + /* Range 0x5F21 - 0x5F2C, array index: 0x13E4 */ + 0x99A9,0x9A3C,INVALC,0x9A3B,0x9ACE,INVALC,0x9B14,0x9B53, + INVALC,0x9C2E,INVALC,0x9C1F, + /* Range 0x5F31 - 0x5F37, array index: 0x13F0 */ + 0x9DB0,0x9DBD,INVALC,INVALC,0x9DAE,0x9DC4,0x9E7B, + /* Range 0x5F3C - 0x5F5B, array index: 0x13F7 */ + 0x9F05,INVALC,0x9F69,0x9FA1,0x56C7,0x571D,0x5B4A,0x5DD3, + INVALC,0x5F72,0x6202,INVALC,0x6235,0x6527,0x651E,0x651F, + INVALC,INVALC,0x6B07,0x6B06,INVALC,INVALC,0x7054,0x721C, + 0x7220,0x7AF8,INVALC,0x7C5D,0x7C58,INVALC,0x7E92,0x7F4E, + /* Range 0x5F69 - 0x5F73, array index: 0x1417 */ + 0x9442,0x944D,0x9454,0x944E,INVALC,0x9443,INVALC,INVALC, + 0x973C,0x9740,0x97C0, + /* Range 0x6039 - 0x6040, array index: 0x1422 */ + 0x7221,INVALC,0x766F,0x7937,0x79B5,0x7C62,0x7C5E,0x7CF5, + /* Range 0x6043 - 0x604B, array index: 0x142A */ + 0x863D,INVALC,0x882D,0x8989,0x8B8D,0x8B87,0x8B90,0x8D1A, + 0x8E99, + /* Range 0x6052 - 0x6068, array index: 0x1433 */ + 0x9456,0x9461,0x945B,0x945A,0x945C,0x9465,INVALC,0x9741, + INVALC,INVALC,0x986E,0x986C,0x986D,INVALC,0x99AA,0x9A5C, + 0x9A58,0x9ADE,INVALC,0x9C4F,0x9C51,INVALC,0x9C53, + /* Range 0x6073 - 0x6077, array index: 0x144A */ + 0x5B4F,0x6B14,INVALC,0x7A72,0x7A73, + /* Range 0x6125 - 0x6135, array index: 0x144F */ + 0x96E6,0x9745,INVALC,0x97C8,0x97E4,0x995D,INVALC,0x9B21, + INVALC,0x9B2C,0x9B57,INVALC,INVALC,0x9C5D,0x9C61,0x9C65, + 0x9E08, + /* Range 0x613E - 0x6150, array index: 0x1460 */ + 0x6205,0x66EF,0x6B1B,0x6B1D,0x7225,0x7224,0x7C6D,INVALC, + 0x8642,0x8649,INVALC,0x8978,0x898A,0x8B97,INVALC,0x8C9B, + 0x8D1C,INVALC,0x8EA2, + /* Range 0x615D - 0x6165, array index: 0x1473 */ + 0x9E0E,INVALC,0x9F08,0x9F1D,0x9FA3,INVALC,INVALC,0x5F60, + 0x6B1C, + /* Range 0x6169 - 0x617E, array index: 0x147C */ + 0x7CF3,INVALC,0x8B9B,0x8EA7,0x91C4,INVALC,0x947A,INVALC, + INVALC,0x9A61,0x9A63,0x9AD7,0x9C76,INVALC,0x9FA5,INVALC, + 0x7067,INVALC,0x72AB,0x864A,0x897D,0x8B9D, + /* Range 0x6221 - 0x6229, array index: 0x1492 */ + 0x8C53,0x8F65,0x947B,INVALC,0x98CD,0x98DD,INVALC,0x9B30, + 0x9E16, + /* Range 0x622F - 0x623B, array index: 0x149B */ + 0x96E7,0x9E18,0x9EA2,INVALC,0x9F7C,INVALC,0x7E9E,0x9484, + INVALC,0x9E1C,INVALC,0x7C71,0x97CA, + /* Range 0x625C - 0x6272, array index: 0x14A8 */ + 0x5B66,INVALC,0x65F9,0x6788,0x6CE6,0x6CCB,INVALC,0x4FBD, + 0x5F8D,INVALC,0x6018,0x6048,INVALC,0x6B29,0x70A6,INVALC, + 0x7706,INVALC,INVALC,INVALC,0x5A10,0x5CFC,0x5CFE, + /* Range 0x642F - 0x6433, array index: 0x14BF */ + 0x9C27,INVALC,0x9458,0x77D6,0x9B2D, + /* Range 0x6448 - 0x647E, array index: 0x14C4 */ + 0x4F66,0x4F68,0x4FE7,0x503F,INVALC,0x50A6,0x510F,0x523E, + 0x5324,0x5365,0x539B,0x517F,0x54CB,0x5573,0x5571,0x556B, + 0x55F4,0x5622,0x5620,0x5692,0x56BA,0x5691,0x56B0,0x5759, + 0x578A,0x580F,0x5812,0x5813,0x5847,0x589B,0x5900,0x594D, + 0x5AD1,0x5AD3,0x5B67,0x5C57,0x5C77,0x5CD5,0x5D75,0x5D8E, + 0x5DA5,0x5DB6,0x5DBF,0x5E65,0x5ECD,0x5EED,0x5F94,0x5F9A, + 0x5FBA,0x6125,0x6150,0x62A3,0x6360,0x6364,0x63B6, + /* Range 0x6521 - 0x657E, array index: 0x14FB */ + 0x6403,0x64B6,0x651A,0x7A25,0x5C21,0x66E2,0x6702,0x67A4, + 0x67AC,0x6810,0x6806,0x685E,0x685A,0x692C,0x6929,0x6A2D, + 0x6A77,0x6A7A,0x6ACA,0x6AE6,0x6AF5,0x6B0D,0x6B0E,0x6BDC, + 0x6BDD,0x6BF6,0x6C1E,0x6C63,0x6DA5,0x6E0F,0x6E8A,0x6E84, + 0x6E8B,0x6E7C,0x6F4C,0x6F48,0x6F49,0x6F9D,0x6F99,0x6FF8, + 0x702E,0x702D,0x705C,0x79CC,0x70BF,0x70EA,0x70E5,0x7111, + 0x7112,0x713F,0x7139,0x713B,0x713D,0x7177,0x7175,0x7176, + 0x7171,0x7196,0x7193,0x71B4,0x71DD,0x71DE,0x720E,0x5911, + 0x7218,0x7347,0x7348,0x73EF,0x7412,0x743B,0x74A4,0x748D, + 0x74B4,0x7673,0x7677,0x76BC,0x7819,0x781B,0x783D,0x7853, + 0x7854,0x7858,0x78B7,0x78D8,0x78EE,0x7922,0x794D,0x7986, + 0x7999,0x79A3,0x79BC,0x7AA7,0x7B37,0x7B59, + /* Range 0x6621 - 0x667C, array index: 0x1559 */ + 0x7BD0,0x7C2F,0x7C32,0x7C42,0x7C4E,0x7C68,0x7CA9,0x7CED, + 0x7DD0,0x7E07,0x7DD3,0x7E64,0x7F40,INVALC,0x8041,0x8063, + 0x80BB,0x6711,0x6725,0x8248,0x8310,0x8362,0x8312,0x8421, + 0x841E,0x84E2,0x84DE,0x84E1,0x8573,0x85D4,0x85F5,0x8637, + 0x8645,0x8672,0x874A,0x87A9,0x87A5,0x87F5,0x8834,0x8850, + 0x8887,0x8954,0x8984,0x8B03,0x8C52,0x8CD8,0x8D0C,0x8D18, + 0x8DB0,0x8EBC,0x8ED5,0x8FAA,0x909C,INVALC,0x915C,0x922B, + 0x9221,0x9273,0x92F4,0x92F5,0x933F,0x9342,0x9386,0x93BE, + 0x93BC,0x93BD,0x93F1,0x93F2,0x93EF,0x9422,0x9423,0x9424, + 0x9467,0x9466,0x9597,0x95CE,0x95E7,0x973B,0x974D,0x98E4, + 0x9942,0x9B1D,0x9B98,INVALC,0x9D49,0x6449,0x5E71,0x5E85, + 0x61D3,0x990E,0x8002,0x781E, + /* Range 0x6721 - 0x672A, array index: 0x15B5 */ + 0x5528,0x5572,0x55BA,0x55F0,0x55EE,0x56B8,0x56B9,0x56C4, + 0x8053,0x92B0, + /* Unranged codes (222 codes) */ + /* Array index: 0x15BF */ 0x2170,0x4EE7, + /* Array index: 0x15BF */ 0x2172,0x4EE6, + /* Array index: 0x15BF */ 0x234B,0x597A, + /* Array index: 0x15BF */ 0x234D,0x5986, + /* Array index: 0x15BF */ 0x235A,0x5C80, + /* Array index: 0x15BF */ 0x235C,0x5E08, + /* Array index: 0x15BF */ 0x2361,0x5EF5, + /* Array index: 0x15BF */ 0x2362,0x5F0E, + /* Array index: 0x15BF */ 0x2366,0x5FD3, + /* Array index: 0x15BF */ 0x2367,0x5FDA, + /* Array index: 0x15BF */ 0x2421,0x6C3C, + /* Array index: 0x15BF */ 0x2433,0x793C, + /* Array index: 0x15BF */ 0x2435,0x808D, + /* Array index: 0x15BF */ 0x2436,0x808E, + /* Array index: 0x15BF */ 0x246D,0x544D, + /* Array index: 0x15BF */ 0x2470,0x543A, + /* Array index: 0x15BF */ 0x253C,0x5746, + /* Array index: 0x15BF */ 0x2551,0x599F, + /* Array index: 0x15BF */ 0x2553,0x599B, + /* Array index: 0x15BF */ 0x2555,0x5989, + /* Array index: 0x15BF */ 0x2556,0x599A, + /* Array index: 0x15BF */ 0x2558,0x6588, + /* Array index: 0x15BF */ 0x263D,0x65F6, + /* Array index: 0x15BF */ 0x266E,0x7398, + /* Array index: 0x15BF */ 0x2755,0x5190, + /* Array index: 0x15BF */ 0x2833,0x59AD, + /* Array index: 0x15BF */ 0x2835,0x59C4, + /* Array index: 0x15BF */ 0x2837,0x59C2, + /* Array index: 0x15BF */ 0x2838,0x59B0, + /* Array index: 0x15BF */ 0x2845,0x59B7, + /* Array index: 0x15BF */ 0x2846,0x59D7, + /* Array index: 0x15BF */ 0x287E,0x5FE9, + /* Array index: 0x15BF */ 0x2921,0x603D, + /* Array index: 0x15BF */ 0x2922,0x6008, + /* Array index: 0x15BF */ 0x295D,0x6C1C, + /* Array index: 0x15BF */ 0x297C,0x7240, + /* Array index: 0x15BF */ 0x2A42,0x79C7, + /* Array index: 0x15BF */ 0x2A44,0x79CA, + /* Array index: 0x15BF */ 0x2A52,0x80B0, + /* Array index: 0x15BF */ 0x2A66,0x82AA, + /* Array index: 0x15BF */ 0x2A68,0x82C9, + /* Array index: 0x15BF */ 0x2A6B,0x82A6, + /* Array index: 0x15BF */ 0x2A6C,0x82B2, + /* Array index: 0x15BF */ 0x2B43,0x524F, + /* Array index: 0x15BF */ 0x2B61,0x54CD, + /* Array index: 0x15BF */ 0x2B77,0x58F5, + /* Array index: 0x15BF */ 0x2B79,0x5909, + /* Array index: 0x15BF */ 0x2B7A,0x5908, + /* Array index: 0x15BF */ 0x2B7C,0x5952, + /* Array index: 0x15BF */ 0x2C32,0x5BAB, + /* Array index: 0x15BF */ 0x2C34,0x5C1B, + /* Array index: 0x15BF */ 0x2C35,0x5C2F, + /* Array index: 0x15BF */ 0x2C37,0x663C, + /* Array index: 0x15BF */ 0x2C50,0x5F66, + /* Array index: 0x15BF */ 0x2C54,0x605C, + /* Array index: 0x15BF */ 0x2D42,0x6BE1, + /* Array index: 0x15BF */ 0x2E2F,0x75A8, + /* Array index: 0x15BF */ 0x2E72,0x82E9, + /* Array index: 0x15BF */ 0x2F7E,0x5518, + /* Array index: 0x15BF */ 0x3021,0x54F0, + /* Array index: 0x15BF */ 0x3022,0x54F6, + /* Array index: 0x15BF */ 0x3025,0x5519, + /* Array index: 0x15BF */ 0x3045,0x5A22, + /* Array index: 0x15BF */ 0x3048,0x5A24, + /* Array index: 0x15BF */ 0x3052,0x5A26, + /* Array index: 0x15BF */ 0x307E,0x6056, + /* Array index: 0x15BF */ 0x3236,0x727A, + /* Array index: 0x15BF */ 0x3255,0x75B4, + /* Array index: 0x15BF */ 0x3257,0x75B1, + /* Array index: 0x15BF */ 0x3337,0x7D24, + /* Array index: 0x15BF */ 0x3352,0x80F7, + /* Array index: 0x15BF */ 0x335F,0x8321, + /* Array index: 0x15BF */ 0x3362,0x8318, + /* Array index: 0x15BF */ 0x3363,0x8358, + /* Array index: 0x15BF */ 0x3439,0x96BD, + /* Array index: 0x15BF */ 0x3522,0x5A2B, + /* Array index: 0x15BF */ 0x3524,0x5A3B, + /* Array index: 0x15BF */ 0x353F,0x5BC8, + /* Array index: 0x15BF */ 0x3541,0x5BC3, + /* Array index: 0x15BF */ 0x3568,0x6098, + /* Array index: 0x15BF */ 0x356A,0x60D0, + /* Array index: 0x15BF */ 0x3579,0x60DE, + /* Array index: 0x15BF */ 0x357C,0x637E, + /* Array index: 0x15BF */ 0x357D,0x638B, + /* Array index: 0x15BF */ 0x3740,0x73FB, + /* Array index: 0x15BF */ 0x374D,0x7690, + /* Array index: 0x15BF */ 0x3821,0x7C9A, + /* Array index: 0x15BF */ 0x3822,0x7C9C, + /* Array index: 0x15BF */ 0x3824,0x7D49, + /* Array index: 0x15BF */ 0x3826,0x7D34, + /* Array index: 0x15BF */ 0x3827,0x7D37, + /* Array index: 0x15BF */ 0x3829,0x7D2D, + /* Array index: 0x15BF */ 0x382B,0x7D4C, + /* Array index: 0x15BF */ 0x382E,0x7D48, + /* Array index: 0x15BF */ 0x3831,0x7F3B, + /* Array index: 0x15BF */ 0x3836,0x8008, + /* Array index: 0x15BF */ 0x3837,0x801A, + /* Array index: 0x15BF */ 0x387E,0x8A1C, + /* Array index: 0x15BF */ 0x3922,0x8A2B, + /* Array index: 0x15BF */ 0x3923,0x8A20, + /* Array index: 0x15BF */ 0x3925,0x8A29, + /* Array index: 0x15BF */ 0x3947,0x8ED9, + /* Array index: 0x15BF */ 0x395C,0x9587, + /* Array index: 0x15BF */ 0x395E,0x965A, + /* Array index: 0x15BF */ 0x3961,0x966E, + /* Array index: 0x15BF */ 0x3965,0x9679, + /* Array index: 0x15BF */ 0x3A21,0x5273, + /* Array index: 0x15BF */ 0x3A23,0x5270, + /* Array index: 0x15BF */ 0x3A66,0x5A91, + /* Array index: 0x15BF */ 0x3A6B,0x5ACF, + /* Array index: 0x15BF */ 0x3A72,0x5A87, + /* Array index: 0x15BF */ 0x3A73,0x5AA0, + /* Array index: 0x15BF */ 0x3B31,0x5D57, + /* Array index: 0x15BF */ 0x3B4B,0x5FA7, + /* Array index: 0x15BF */ 0x3B79,0x65D1, + /* Array index: 0x15BF */ 0x3D4C,0x7694, + /* Array index: 0x15BF */ 0x3D4D,0x76B3, + /* Array index: 0x15BF */ 0x3D7E,0x7CA7, + /* Array index: 0x15BF */ 0x3E6D,0x88BB, + /* Array index: 0x15BF */ 0x3E6F,0x88BF, + /* Array index: 0x15BF */ 0x3E70,0x88B4, + /* Array index: 0x15BF */ 0x3E72,0x88B5, + /* Array index: 0x15BF */ 0x3E74,0x899A, + /* Array index: 0x15BF */ 0x3E75,0x8A43, + /* Array index: 0x15BF */ 0x3E78,0x8A5A, + /* Array index: 0x15BF */ 0x3F5D,0x91FE, + /* Array index: 0x15BF */ 0x3F5E,0x9220, + /* Array index: 0x15BF */ 0x3F60,0x920B, + /* Array index: 0x15BF */ 0x3F6C,0x9595, + /* Array index: 0x15BF */ 0x3F7B,0x96EE, + /* Array index: 0x15BF */ 0x3F7C,0x96ED, + /* Array index: 0x15BF */ 0x3F7E,0x96EC, + /* Array index: 0x15BF */ 0x4021,0x975F, + /* Array index: 0x15BF */ 0x4022,0x976F, + /* Array index: 0x15BF */ 0x4024,0x976D, + /* Array index: 0x15BF */ 0x402B,0x98F0, + /* Array index: 0x15BF */ 0x402F,0x9AA9, + /* Array index: 0x15BF */ 0x4032,0x9AE0, + /* Array index: 0x15BF */ 0x4033,0x4EB7, + /* Array index: 0x15BF */ 0x4064,0x5ACE, + /* Array index: 0x15BF */ 0x4066,0x5AC5, + /* Array index: 0x15BF */ 0x4067,0x5AC3, + /* Array index: 0x15BF */ 0x406A,0x5AD0, + /* Array index: 0x15BF */ 0x4142,0x643C, + /* Array index: 0x15BF */ 0x4144,0x6446, + /* Array index: 0x15BF */ 0x4145,0x6447, + /* Array index: 0x15BF */ 0x4148,0x643A, + /* Array index: 0x15BF */ 0x4149,0x6407, + /* Array index: 0x15BF */ 0x414B,0x656B, + /* Array index: 0x15BF */ 0x4156,0x668F, + /* Array index: 0x15BF */ 0x4159,0x6692, + /* Array index: 0x15BF */ 0x415B,0x668E, + /* Array index: 0x15BF */ 0x415D,0x6946, + /* Array index: 0x15BF */ 0x4165,0x6931, + /* Array index: 0x15BF */ 0x4168,0x693E, + /* Array index: 0x15BF */ 0x416A,0x697C, + /* Array index: 0x15BF */ 0x416B,0x6943, + /* Array index: 0x15BF */ 0x416D,0x6973, + /* Array index: 0x15BF */ 0x416F,0x6955, + /* Array index: 0x15BF */ 0x4221,0x6B73, + /* Array index: 0x15BF */ 0x4222,0x6B9C, + /* Array index: 0x15BF */ 0x4236,0x6EA9, + /* Array index: 0x15BF */ 0x424C,0x7148, + /* Array index: 0x15BF */ 0x4321,0x7698, + /* Array index: 0x15BF */ 0x433D,0x7980, + /* Array index: 0x15BF */ 0x4341,0x7A0F, + /* Array index: 0x15BF */ 0x4344,0x7A1D, + /* Array index: 0x15BF */ 0x4358,0x7CAE, + /* Array index: 0x15BF */ 0x435C,0x7CB0, + /* Array index: 0x15BF */ 0x435E,0x7D90, + /* Array index: 0x15BF */ 0x436E,0x7FA3, + /* Array index: 0x15BF */ 0x437B,0x815D, + /* Array index: 0x15BF */ 0x437C,0x8175, + /* Array index: 0x15BF */ 0x437E,0x815F, + /* Array index: 0x15BF */ 0x4473,0x8EB1, + /* Array index: 0x15BF */ 0x4540,0x968F, + /* Array index: 0x15BF */ 0x4542,0x9696, + /* Array index: 0x15BF */ 0x4546,0x96F4, + /* Array index: 0x15BF */ 0x4547,0x96FC, + /* Array index: 0x15BF */ 0x4549,0x9755, + /* Array index: 0x15BF */ 0x454B,0x9779, + /* Array index: 0x15BF */ 0x454F,0x97EE, + /* Array index: 0x15BF */ 0x4550,0x97F5, + /* Array index: 0x15BF */ 0x4552,0x980B, + /* Array index: 0x15BF */ 0x4554,0x98F3, + /* Array index: 0x15BF */ 0x457A,0x51F4, + /* Array index: 0x15BF */ 0x457E,0x52ED, + /* Array index: 0x15BF */ 0x4621,0x52EA, + /* Array index: 0x15BF */ 0x4623,0x5332, + /* Array index: 0x15BF */ 0x467E,0x6455, + /* Array index: 0x15BF */ 0x4730,0x6571, + /* Array index: 0x15BF */ 0x4751,0x6998, + /* Array index: 0x15BF */ 0x482E,0x76B9, + /* Array index: 0x15BF */ 0x484B,0x7A29, + /* Array index: 0x15BF */ 0x484D,0x7A2A, + /* Array index: 0x15BF */ 0x484F,0x7A2D, + /* Array index: 0x15BF */ 0x4850,0x7A2C, + /* Array index: 0x15BF */ 0x4868,0x7DC8, + /* Array index: 0x15BF */ 0x4869,0x7DB6, + /* Array index: 0x15BF */ 0x486B,0x7DD1, + /* Array index: 0x15BF */ 0x496B,0x8A9D, + /* Array index: 0x15BF */ 0x496D,0x8C67, + /* Array index: 0x15BF */ 0x4A21,0x8FA1, + /* Array index: 0x15BF */ 0x4A22,0x8FA2, + /* Array index: 0x15BF */ 0x4A24,0x905A, + /* Array index: 0x15BF */ 0x4A3D,0x95A2, + /* Array index: 0x15BF */ 0x4A3E,0x95A7, + /* Array index: 0x15BF */ 0x4A4C,0x9759, + /* Array index: 0x15BF */ 0x4A4E,0x9764, + /* Array index: 0x15BF */ 0x4A5B,0x9906, + /* Array index: 0x15BF */ 0x4A6A,0x99C4, + /* Array index: 0x15BF */ 0x4A78,0x9B40, + /* Array index: 0x15BF */ 0x4B22,0x9EBD, + /* Array index: 0x15BF */ 0x4B27,0x510E, + /* Array index: 0x15BF */ 0x4D22,0x71AE, + /* Array index: 0x15BF */ 0x4D44,0x778A, + /* Array index: 0x15BF */ 0x4D60,0x7BBF, + /* Array index: 0x15BF */ 0x4D63,0x7BCD, + /* Array index: 0x15BF */ 0x4D65,0x7BB2, + /* Array index: 0x15BF */ 0x4E22,0x7DD6, + /* Array index: 0x15BF */ 0x4E40,0x8501, + /* Array index: 0x15BF */ 0x4E42,0x84F8, + /* Array index: 0x15BF */ 0x4E44,0x84F5, + /* Array index: 0x15BF */ 0x4E46,0x8504, + /* Array index: 0x15BF */ 0x4E52,0x8535, + /* Array index: 0x15BF */ 0x4E54,0x8505, + /* Array index: 0x15BF */ 0x4E59,0x877D, + /* Array index: 0x15BF */ 0x4E7A,0x8C8E, + /* Array index: 0x15BF */ 0x4E7D,0x8CE9, + /* Array index: 0x15BF */ 0x4E7E,0x8CDB, + /* Array index: 0x15BF */ 0x4F5A,0x96A3, + /* Array index: 0x15BF */ 0x4F5B,0x96A5, + /* Array index: 0x15BF */ 0x5022,0x9D0D, + /* Array index: 0x15BF */ 0x5024,0x9D01, + /* Array index: 0x15BF */ 0x5025,0x9D0C, + /* Array index: 0x15BF */ 0x5027,0x9CF8, + /* Array index: 0x15BF */ 0x503B,0x5667, + /* Array index: 0x15BF */ 0x503D,0x567B, + /* Array index: 0x15BF */ 0x503F,0x565F, + /* Array index: 0x15BF */ 0x5040,0x5661, + /* Array index: 0x15BF */ 0x514D,0x6FBB, + /* Array index: 0x15BF */ 0x5150,0x6FBE, + /* Array index: 0x15BF */ 0x5179,0x7798, + /* Array index: 0x15BF */ 0x517B,0x7796, + /* Array index: 0x15BF */ 0x5221,0x78D6, + /* Array index: 0x15BF */ 0x5222,0x78EB, + /* Array index: 0x15BF */ 0x5237,0x7CD3, + /* Array index: 0x15BF */ 0x5239,0x7CE1, + /* Array index: 0x15BF */ 0x523B,0x7E19, + /* Array index: 0x15BF */ 0x523F,0x7E27, + /* Array index: 0x15BF */ 0x5240,0x7E26, + /* Array index: 0x15BF */ 0x5243,0x806E, + /* Array index: 0x15BF */ 0x5244,0x81AF, + /* Array index: 0x15BF */ 0x5247,0x81AD, + /* Array index: 0x15BF */ 0x5249,0x81AA, + /* Array index: 0x15BF */ 0x524A,0x8218, + /* Array index: 0x15BF */ 0x524F,0x856F, + /* Array index: 0x15BF */ 0x5250,0x854C, + /* Array index: 0x15BF */ 0x526E,0x8AEC, + /* Array index: 0x15BF */ 0x5273,0x8CF2, + /* Array index: 0x15BF */ 0x5275,0x8CEF, + /* Array index: 0x15BF */ 0x5277,0x8DA6, + /* Array index: 0x15BF */ 0x527B,0x8E3B, + /* Array index: 0x15BF */ 0x527C,0x8E43, + /* Array index: 0x15BF */ 0x527E,0x8E32, + /* Array index: 0x15BF */ 0x5348,0x96AB, + /* Array index: 0x15BF */ 0x5349,0x96B7, + /* Array index: 0x15BF */ 0x534C,0x9715, + /* Array index: 0x15BF */ 0x534D,0x9714, + /* Array index: 0x15BF */ 0x5350,0x970C, + /* Array index: 0x15BF */ 0x5351,0x9717, + /* Array index: 0x15BF */ 0x5353,0x9793, + /* Array index: 0x15BF */ 0x5355,0x97D2, + /* Array index: 0x15BF */ 0x5370,0x99E1, + /* Array index: 0x15BF */ 0x5371,0x99E6, + /* Array index: 0x15BF */ 0x5421,0x9B8C, + /* Array index: 0x15BF */ 0x5423,0x9B89, + /* Array index: 0x15BF */ 0x5425,0x9B8E, + /* Array index: 0x15BF */ 0x5464,0x64DF, + /* Array index: 0x15BF */ 0x5467,0x64E1, + /* Array index: 0x15BF */ 0x5521,0x6A86, + /* Array index: 0x15BF */ 0x5523,0x6A98, + /* Array index: 0x15BF */ 0x5524,0x6A9D, + /* Array index: 0x15BF */ 0x5527,0x6A8F, + /* Array index: 0x15BF */ 0x5529,0x6AAA, + /* Array index: 0x15BF */ 0x552B,0x6B5D, + /* Array index: 0x15BF */ 0x553C,0x71E3, + /* Array index: 0x15BF */ 0x5549,0x7371, + /* Array index: 0x15BF */ 0x554B,0x74AE, + /* Array index: 0x15BF */ 0x554D,0x74B3, + /* Array index: 0x15BF */ 0x554F,0x74AC, + /* Array index: 0x15BF */ 0x5579,0x7E2C, + /* Array index: 0x15BF */ 0x557A,0x7E4D, + /* Array index: 0x15BF */ 0x557D,0x7F46, + /* Array index: 0x15BF */ 0x557E,0x7FF6, + /* Array index: 0x15BF */ 0x5630,0x85AC, + /* Array index: 0x15BF */ 0x5634,0x87CE, + /* Array index: 0x15BF */ 0x5636,0x87CD, + /* Array index: 0x15BF */ 0x564D,0x8C40, + /* Array index: 0x15BF */ 0x564F,0x8C96, + /* Array index: 0x15BF */ 0x567A,0x979B, + /* Array index: 0x15BF */ 0x567B,0x979F, + /* Array index: 0x15BF */ 0x5726,0x9840, + /* Array index: 0x15BF */ 0x5728,0x9847, + /* Array index: 0x15BF */ 0x572A,0x98B7, + /* Array index: 0x15BF */ 0x5730,0x99A2, + /* Array index: 0x15BF */ 0x5733,0x9A00, + /* Array index: 0x15BF */ 0x5734,0x99F3, + /* Array index: 0x15BF */ 0x5737,0x99F5, + /* Array index: 0x15BF */ 0x5748,0x9D39, + /* Array index: 0x15BF */ 0x574A,0x9D44, + /* Array index: 0x15BF */ 0x574D,0x9D35, + /* Array index: 0x15BF */ 0x5750,0x9EAF, + /* Array index: 0x15BF */ 0x5752,0x512F, + /* Array index: 0x15BF */ 0x5849,0x7AF5, + /* Array index: 0x15BF */ 0x584C,0x7C2E, + /* Array index: 0x15BF */ 0x584E,0x7C1B, + /* Array index: 0x15BF */ 0x5850,0x7C1A, + /* Array index: 0x15BF */ 0x5851,0x7C24, + /* Array index: 0x15BF */ 0x5861,0x7FFA, + /* Array index: 0x15BF */ 0x5862,0x802E, + /* Array index: 0x15BF */ 0x5865,0x81CE, + /* Array index: 0x15BF */ 0x5868,0x8219, + /* Array index: 0x15BF */ 0x5921,0x89B3, + /* Array index: 0x15BF */ 0x5923,0x8B38, + /* Array index: 0x15BF */ 0x5924,0x8B32, + /* Array index: 0x15BF */ 0x5926,0x8B2D, + /* Array index: 0x15BF */ 0x5928,0x8B34, + /* Array index: 0x15BF */ 0x592A,0x8B29, + /* Array index: 0x15BF */ 0x592B,0x8C74, + /* Array index: 0x15BF */ 0x592E,0x8D03, + /* Array index: 0x15BF */ 0x5956,0x9854, + /* Array index: 0x15BF */ 0x5A3F,0x65DC, + /* Array index: 0x15BF */ 0x5A6E,0x7C35, + /* Array index: 0x15BF */ 0x5A6F,0x7C34, + /* Array index: 0x15BF */ 0x5A72,0x7E6C, + /* Array index: 0x15BF */ 0x5B22,0x85E7, + /* Array index: 0x15BF */ 0x5B2F,0x8987, + /* Array index: 0x15BF */ 0x5B53,0x95DD, + /* Array index: 0x15BF */ 0x5B65,0x9856, + /* Array index: 0x15BF */ 0x5C47,0x6AF4, + /* Array index: 0x15BF */ 0x5C49,0x6AE9, + /* Array index: 0x15BF */ 0x5C4F,0x703D, + /* Array index: 0x15BF */ 0x5C51,0x7036, + /* Array index: 0x15BF */ 0x5D56,0x98C3, + /* Array index: 0x15BF */ 0x5D58,0x994D, + /* Array index: 0x15BF */ 0x5D5A,0x9A2F, + /* Array index: 0x15BF */ 0x5E2D,0x5DD0, + /* Array index: 0x15BF */ 0x5E2F,0x5FC2, + /* Array index: 0x15BF */ 0x5E6D,0x942D, + /* Array index: 0x15BF */ 0x5F3A,0x9E9E, + /* Array index: 0x15BF */ 0x5F5F,0x8827, + /* Array index: 0x15BF */ 0x5F61,0x8B81, + /* Array index: 0x15BF */ 0x5F62,0x8B83, + /* Array index: 0x15BF */ 0x5F64,0x8C44, + /* Array index: 0x15BF */ 0x5F78,0x995A, + /* Array index: 0x15BF */ 0x5F79,0x9A51, + /* Array index: 0x15BF */ 0x5F7B,0x9ADD, + /* Array index: 0x15BF */ 0x5F7E,0x9C38, + /* Array index: 0x15BF */ 0x6022,0x9C45, + /* Array index: 0x15BF */ 0x6023,0x9C3A, + /* Array index: 0x15BF */ 0x6025,0x9C35, + /* Array index: 0x15BF */ 0x6029,0x9EF1, + /* Array index: 0x15BF */ 0x602B,0x9F93, + /* Array index: 0x15BF */ 0x602C,0x529A, + /* Array index: 0x15BF */ 0x602F,0x8641, + /* Array index: 0x15BF */ 0x6030,0x5DD7, + /* Array index: 0x15BF */ 0x6032,0x6528, + /* Array index: 0x15BF */ 0x6036,0x7053, + /* Array index: 0x15BF */ 0x6037,0x7059, + /* Array index: 0x15BF */ 0x604F,0x945F, + /* Array index: 0x15BF */ 0x606C,0x9DFC, + /* Array index: 0x15BF */ 0x606D,0x9F39, + /* Array index: 0x15BF */ 0x606F,0x513E, + /* Array index: 0x15BF */ 0x6071,0x56D2, + /* Array index: 0x15BF */ 0x607B,0x8B91, + /* Array index: 0x15BF */ 0x607E,0x91BF, + /* Array index: 0x15BF */ 0x6122,0x946C, + /* Array index: 0x15BF */ 0x613B,0x9F45, + /* Array index: 0x15BF */ 0x6159,0x9C6C, + /* Array index: 0x15BF */ 0x615B,0x9C6F, + /* Array index: 0x15BF */ 0x623F,0x9EA3, + /* Array index: 0x15BF */ 0x6241,0x9C7B, + /* Array index: 0x15BF */ 0x6242,0x9F97, + /* Array index: 0x15BF */ 0x6245,0x9750, + /* Array index: 0x15BF */ 0x6249,0x5727, + /* Array index: 0x15BF */ 0x624A,0x5C13, + /* Array index: 0x15BF */ 0x6251,0x5FC8, + /* Array index: 0x15BF */ 0x6257,0x6765, + /* Array index: 0x15BF */ 0x625A,0x52BD, + /* Array index: 0x15BF */ 0x6279,0x70C9, + /* Array index: 0x15BF */ 0x6323,0x9579, + /* Array index: 0x15BF */ 0x6325,0x96BA, + /* Array index: 0x15BF */ 0x632D,0x7B29, + /* Array index: 0x15BF */ 0x632E,0x8128, + /* Array index: 0x15BF */ 0x6330,0x8A2E, + /* Array index: 0x15BF */ 0x6334,0x9AD9, + /* Array index: 0x15BF */ 0x6336,0x582B, + /* Array index: 0x15BF */ 0x6337,0x5845, + /* Array index: 0x15BF */ 0x6339,0x63FA, + /* Array index: 0x15BF */ 0x633D,0x6E86, + /* Array index: 0x15BF */ 0x6343,0x5867, + /* Array index: 0x15BF */ 0x6345,0x5BDD, + /* Array index: 0x15BF */ 0x6346,0x656E, + /* Array index: 0x15BF */ 0x634A,0x8C87, + /* Array index: 0x15BF */ 0x634C,0x50D2, + /* Array index: 0x15BF */ 0x634D,0x50DF, + /* Array index: 0x15BF */ 0x6352,0x69BA, + /* Array index: 0x15BF */ 0x6354,0x6B9D, + /* Array index: 0x15BF */ 0x6356,0x8059, + /* Array index: 0x15BF */ 0x6363,0x6F8A, + /* Array index: 0x15BF */ 0x6366,0x7BC3, + /* Array index: 0x15BF */ 0x6367,0x7BC2, + /* Array index: 0x15BF */ 0x636C,0x90F6, + /* Array index: 0x15BF */ 0x636E,0x9823, + /* Array index: 0x15BF */ 0x6374,0x71CD, + /* Array index: 0x15BF */ 0x6375,0x7499, + /* Array index: 0x15BF */ 0x637B,0x9842, + /* Array index: 0x15BF */ 0x6422,0x7F84, + /* Array index: 0x15BF */ 0x6428,0x8D0E, + /* Array index: 0x15BF */ 0x642A,0x9861, + /* Array index: 0x15BF */ 0x642D,0x8B73, +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE14 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> cns11643_plane14 speed-optimized table (42496 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_cns11643_plane14[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x0100,0x0200, + 0x0300,0x0400,0x0500,0x0600,0x0700,0x0800,0x0900,0x0A00, + 0x0B00,0x0C00,0x0D00,0x0E00,0x0F00,0x1000,0x1100,0x1200, + 0x1300,0x1400,0x1500,0x1600,0x1700,0x1800,0x1900,0x1A00, + 0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,0x2000,0x2100,0x2200, + 0x2300,0x2400,0x2500,0x2600,0x2700,0x2800,0x2900,0x2A00, + 0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000,0x3100,0x3200, + 0x3300,0x3400,0x3500,0x3600,0x3700,0x3800,0x3900,0x3A00, + 0x3B00,0x3C00,0x3D00,0x3E00,0x3F00,0x4000,0x4100,0x4200, + 0x4300,0x4400,0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00, + 0x4B00,0x4C00,0x4D00,0x4E00,0x4F00,0x5000,0x5100,0x5200, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 79, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,0x2126,0x2125,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2262,0x2261,0x2263,INVALC,0x243F,INVALC,INVALC,INVALC, + 0x2121,INVALC,0x212C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2122,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2740,INVALC,0x2123, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2130,INVALC, + INVALC,0x212E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2345,INVALC,INVALC,0x2B22, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2146,0x2145,INVALC,INVALC,INVALC,INVALC, + 0x2264,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2440,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2B23,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x396C,0x396E,INVALC,INVALC,INVALC,0x2124,INVALC,0x212D, + INVALC,0x2265,INVALC,INVALC,INVALC,INVALC,INVALC,0x2131, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x216C, + 0x2266,INVALC,INVALC,INVALC,0x2442,0x2742,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2147,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B26, + 0x2B25,0x2B27,0x2B24,INVALC,INVALC,INVALC,INVALC,0x4033, + INVALC,INVALC,INVALC,INVALC,0x2132,INVALC,0x2133,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2149,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x214C,INVALC,0x214B,0x214A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x216D,INVALC,INVALC,INVALC,INVALC,INVALC,0x2172,0x2170, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x226F,0x2268, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x226B,0x2267,0x2276,INVALC,0x226E,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x0200 */ + INVALC,INVALC,INVALC,0x226D,INVALC,INVALC,0x226C,0x2274, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2270,0x2277, + INVALC,INVALC,0x2275,INVALC,0x2273,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2272,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2450,0x2448,INVALC,INVALC,0x244F,INVALC,0x2446, + INVALC,0x2445,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x244E,INVALC,0x2449,INVALC,0x244B,0x2443,INVALC,INVALC, + INVALC,INVALC,0x2444,0x244C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6448,INVALC, + 0x6449,INVALC,INVALC,INVALC,INVALC,0x2747,INVALC,INVALC, + INVALC,INVALC,0x274F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2744,INVALC,0x2751,INVALC,0x2748,INVALC, + INVALC,INVALC,INVALC,0x2743,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x274C, + 0x2749,0x274B,0x274A,0x274D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2B2D,0x2B2E,INVALC,INVALC,0x2B36,INVALC,INVALC,INVALC, + 0x2B2C,INVALC,INVALC,INVALC,INVALC,0x6263,0x2B2B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B32,INVALC, + 0x2B2F,INVALC,INVALC,INVALC,0x2B33,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2B28,INVALC,INVALC,0x2B29,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2B35,INVALC,0x2B34,INVALC,0x644A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2F48,INVALC,0x2F4D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2F44,INVALC,0x2F58,0x2F4C,0x2F56,INVALC,0x2F46, + /* Block 81, Array index 0x0300 */ + INVALC,INVALC,0x2F4B,0x2F49,0x2F47,INVALC,INVALC,INVALC, + 0x2F4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2F53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2F45,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2F4E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2F51,INVALC, + INVALC,INVALC,0x2F43,INVALC,INVALC,INVALC,0x2F50,INVALC, + 0x2F54,0x2F55,INVALC,INVALC,INVALC,INVALC,INVALC,0x644B, + INVALC,INVALC,0x343C,INVALC,0x343F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3444,INVALC,0x3441,INVALC,0x3442,INVALC,0x2F57,INVALC, + 0x3447,0x343D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3440,INVALC, + INVALC,INVALC,INVALC,INVALC,0x344B,INVALC,INVALC,INVALC, + INVALC,0x3443,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x344C,0x344A,INVALC,0x3445,0x3446,INVALC,INVALC,INVALC, + INVALC,0x3975,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3971,0x3972,INVALC,INVALC,INVALC,INVALC,INVALC,0x396F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3970, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x644D,INVALC, + INVALC,INVALC,0x4039,0x403C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x403A,INVALC,INVALC,0x4037,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x403D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4036,0x403E,INVALC,INVALC, + 0x456B,INVALC,0x634C,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x456E,0x456C,INVALC,INVALC,0x456D,INVALC,0x4576,0x634D, + INVALC,0x4570,0x4575,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4571,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4574,INVALC,INVALC,0x4B29, + INVALC,INVALC,INVALC,INVALC,0x4B2B,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x0400 */ + INVALC,0x4B2D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B2C,0x4B27,0x644E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5031,INVALC, + INVALC,INVALC,INVALC,0x5035,INVALC,0x5030,0x5034,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5441, + 0x5440,INVALC,INVALC,0x5033,INVALC,INVALC,INVALC,0x5752, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C32,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x606F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2278,INVALC,INVALC,INVALC,0x2454,INVALC, + 0x2453,0x2451,INVALC,INVALC,INVALC,INVALC,0x2752,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3976,INVALC,INVALC,INVALC,0x5E25,INVALC,0x2134,INVALC, + INVALC,INVALC,0x2B37,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x227A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2E7B,INVALC,INVALC,INVALC,INVALC,0x403F,0x6453, + INVALC,INVALC,0x2127,INVALC,0x214D,0x2148,0x214E,INVALC, + INVALC,INVALC,INVALC,0x2178,0x2179,INVALC,INVALC,INVALC, + 0x2755,INVALC,INVALC,INVALC,INVALC,INVALC,0x2128,INVALC, + INVALC,0x217A,INVALC,INVALC,INVALC,0x2457,INVALC,0x2B39, + INVALC,0x2F5B,INVALC,0x2F59,INVALC,INVALC,0x2F5A,INVALC, + 0x344D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x227E,0x227D,0x227C,0x2459,INVALC,INVALC, + 0x245A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2B3B,0x2B3D,0x2B3E,INVALC,INVALC,INVALC,0x2F5E, + INVALC,0x2F5F,INVALC,INVALC,INVALC,INVALC,INVALC,0x344F, + INVALC,0x344E,0x397D,0x397A,INVALC,INVALC,0x397E,INVALC, + INVALC,0x4B2F,0x4B2E,0x4B30,INVALC,INVALC,INVALC,0x5442, + INVALC,INVALC,0x212F,0x2135,0x2151,0x217B,INVALC,INVALC, + 0x2322,INVALC,INVALC,INVALC,0x245B,0x2759,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x457A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x275A,INVALC, + /* Block 83, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,0x2136,0x2152,INVALC,INVALC, + INVALC,INVALC,INVALC,0x217D,INVALC,INVALC,INVALC,0x2325, + INVALC,INVALC,INVALC,INVALC,0x2324,0x2326,INVALC,INVALC, + 0x2327,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x245F, + 0x2461,INVALC,INVALC,0x245C,INVALC,INVALC,0x245E,0x245D, + INVALC,INVALC,INVALC,0x2460,INVALC,INVALC,INVALC,0x275B, + INVALC,INVALC,INVALC,INVALC,0x275E,INVALC,INVALC,INVALC, + INVALC,0x275F,INVALC,INVALC,0x275D,INVALC,0x644F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2B3F,INVALC,INVALC, + 0x2B40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B43, + INVALC,INVALC,INVALC,0x2F68,INVALC,INVALC,INVALC,0x2F65, + INVALC,0x2F62,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2F60,INVALC,INVALC,0x2F66,0x2F61,0x2F63,INVALC,0x2F64, + 0x3450,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A23,INVALC,INVALC,0x3A21,INVALC,INVALC,0x3451,INVALC, + INVALC,0x4041,INVALC,INVALC,INVALC,INVALC,0x4040,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B31,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B32,INVALC, + 0x5036,INVALC,INVALC,INVALC,0x5037,INVALC,INVALC,INVALC, + INVALC,INVALC,0x602C,INVALC,0x2137,0x2154,0x2153,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2328,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2463,0x2462,0x2761,INVALC,INVALC, + INVALC,0x2760,INVALC,INVALC,INVALC,0x625A,INVALC,0x2762, + INVALC,INVALC,INVALC,INVALC,0x2B48,0x2B46,INVALC,INVALC, + INVALC,INVALC,0x2B47,INVALC,0x2F6F,INVALC,0x2F6C,0x2F6A, + 0x2F6D,0x2F6E,INVALC,INVALC,0x3452,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4045,0x4044,INVALC,INVALC,INVALC,INVALC,INVALC,0x4046, + INVALC,INVALC,0x4621,INVALC,INVALC,0x457E,0x4B33,INVALC, + INVALC,INVALC,0x4D2C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2155,INVALC,INVALC, + /* Block 84, Array index 0x0600 */ + 0x2156,INVALC,INVALC,0x2223,0x2222,INVALC,INVALC,0x2224, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5038,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2226,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6450,0x2465,INVALC,0x2B49, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4623,0x4B34,INVALC,0x5444,0x5C34,INVALC, + 0x2129,INVALC,0x2157,0x2466,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2159,INVALC, + INVALC,INVALC,INVALC,0x232A,INVALC,INVALC,INVALC,0x232B, + 0x232D,INVALC,INVALC,INVALC,INVALC,0x2763,INVALC,INVALC, + 0x2B4A,INVALC,INVALC,INVALC,INVALC,0x215A,INVALC,0x2227, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6451,INVALC,0x2A5C, + INVALC,0x212A,INVALC,INVALC,INVALC,0x2228,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2467,INVALC,0x2765,INVALC, + INVALC,INVALC,0x2766,INVALC,INVALC,0x2B4B,INVALC,INVALC, + 0x4047,INVALC,INVALC,INVALC,INVALC,INVALC,0x215B,INVALC, + INVALC,0x2229,INVALC,0x232F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2767,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6452,INVALC,INVALC,INVALC,INVALC, + 0x3454,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A28,INVALC, + 0x3A27,0x404A,0x4049,0x4048,INVALC,INVALC,0x4625,INVALC, + 0x4626,0x4B35,INVALC,0x5445,INVALC,INVALC,0x212B,0x215C, + INVALC,INVALC,0x222A,INVALC,INVALC,INVALC,0x2331,INVALC, + INVALC,0x2769,0x276A,INVALC,0x3455,0x3A29,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x215E,INVALC,0x2160,INVALC, + 0x222B,INVALC,0x2333,INVALC,INVALC,0x276B,INVALC,INVALC, + INVALC,0x2B50,0x2B4F,INVALC,0x2B4E,0x2B4D,INVALC,INVALC, + 0x404B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2231,INVALC,0x222D,0x222E, + INVALC,0x222F,INVALC,INVALC,INVALC,INVALC,INVALC,0x2335, + /* Block 85, Array index 0x0700 */ + 0x2337,INVALC,INVALC,INVALC,INVALC,0x2339,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x233A,INVALC,0x233B,0x2334,INVALC, + INVALC,INVALC,0x2476,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2479,0x247E,0x2475,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2524, + INVALC,INVALC,0x2477,INVALC,0x247B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2470,INVALC,INVALC,INVALC,INVALC,0x2521, + INVALC,INVALC,INVALC,INVALC,0x2473,INVALC,INVALC,INVALC, + INVALC,0x247C,INVALC,0x2478,0x2474,0x246D,INVALC,INVALC, + 0x247D,0x2522,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2523,INVALC,INVALC,INVALC,INVALC,0x276E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2774,0x2778,INVALC,INVALC,0x2775,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2771,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x276C,INVALC,INVALC, + INVALC,0x2770,0x2779,INVALC,INVALC,INVALC,INVALC,0x2773, + INVALC,INVALC,INVALC,0x276F,0x2777,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B5C,0x2B5D, + INVALC,INVALC,INVALC,0x2B57,0x2B59,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2B5B,INVALC,0x2B54,0x2B5E,INVALC,INVALC, + INVALC,0x2B51,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2B55,0x6454,0x2B63,0x2B61,INVALC,INVALC, + 0x2B53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2B58,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2F77, + 0x3021,INVALC,INVALC,INVALC,0x2F74,0x2F78,0x3022,INVALC, + INVALC,0x2F79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x0800 */ + 0x2F7B,INVALC,0x2F7A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2F73,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2F76,INVALC,INVALC,INVALC,INVALC, + 0x2F7E,0x3025,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6721,0x345F,INVALC,0x3468,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3466,INVALC,INVALC,INVALC,INVALC,0x3467, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x345B,INVALC,INVALC,0x3458,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3462,0x3461,INVALC,INVALC,INVALC, + 0x3457,0x3A36,0x3464,INVALC,INVALC,0x345E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3459,INVALC,INVALC,0x6457,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6456,0x6722,0x6455,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A3C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A31,0x3A38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A2E,0x3A2A, + INVALC,INVALC,INVALC,0x3A33,INVALC,INVALC,0x3A40,INVALC, + 0x3A34,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3A42,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A3B, + INVALC,INVALC,INVALC,INVALC,0x3A2F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6723,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4051,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x404E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A2B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x404C,INVALC,INVALC,INVALC,0x6725,INVALC, + 0x6724,INVALC,INVALC,INVALC,0x6458,INVALC,INVALC,INVALC, + 0x462E,INVALC,INVALC,0x4628,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x0900 */ + INVALC,INVALC,INVALC,0x4629,INVALC,0x4636,INVALC,0x462C, + INVALC,INVALC,INVALC,0x462A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4634,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4633,INVALC,INVALC,INVALC,INVALC,INVALC,0x4631,INVALC, + 0x645A,INVALC,0x6459,INVALC,INVALC,INVALC,0x4650,INVALC, + 0x4630,INVALC,INVALC,0x4B41,INVALC,0x4B38,INVALC,INVALC, + INVALC,0x4B3D,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B3E,INVALC,INVALC,0x4B37, + INVALC,INVALC,INVALC,0x4B3B,INVALC,0x4B43,INVALC,0x4B45, + 0x4B40,0x4635,0x4B3C,INVALC,0x4B39,INVALC,0x4B3F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x503F, + INVALC,0x5040,INVALC,INVALC,INVALC,INVALC,INVALC,0x503B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x503D,INVALC,0x5448,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5449,0x5447,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x645D,0x645B,INVALC,0x575B,INVALC,0x575A,INVALC, + INVALC,INVALC,INVALC,0x5758,INVALC,INVALC,0x5759,0x5757, + 0x575C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A2D, + 0x645E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6726,0x6727,0x645C,0x5E26,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6728,INVALC,INVALC,0x5F40, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6071,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2177,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x233E,INVALC,INVALC,0x252C,INVALC, + INVALC,0x2526,INVALC,INVALC,0x252B,0x252A,INVALC,0x2529, + INVALC,0x2548,0x2527,0x2528,INVALC,INVALC,0x2822,INVALC, + 0x277D,INVALC,INVALC,0x277C,0x2821,0x277B,INVALC,INVALC, + /* Block 88, Array index 0x0A00 */ + 0x2B65,INVALC,INVALC,INVALC,INVALC,0x3027,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A44,0x3A43, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4052,INVALC,0x4637, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F41,INVALC,INVALC, + INVALC,0x2161,INVALC,INVALC,0x2234,INVALC,INVALC,0x6249, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2341,0x2342,INVALC,INVALC,0x233F,0x2340,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2531,0x253E,INVALC,0x2530, + INVALC,INVALC,0x2540,0x2536,0x252F,INVALC,0x253C,INVALC, + 0x252D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2532,0x2541,0x2542,0x2533,0x2538, + 0x2537,0x645F,INVALC,INVALC,INVALC,INVALC,INVALC,0x2535, + INVALC,INVALC,INVALC,0x2825,INVALC,0x2823,INVALC,0x2826, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2828,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2829,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x282A, + INVALC,0x2824,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6460,INVALC,INVALC,0x2B69,0x2B68,INVALC, + 0x2B6C,0x2B67,0x2B6A,INVALC,INVALC,INVALC,0x2B71,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2B70,INVALC,INVALC,INVALC, + INVALC,0x2B6B,INVALC,INVALC,INVALC,INVALC,0x2B6D,0x2B72, + 0x2B6E,INVALC,INVALC,INVALC,0x2B66,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x302A, + INVALC,INVALC,INVALC,0x3030,INVALC,INVALC,0x302F,INVALC, + 0x3038,INVALC,INVALC,INVALC,0x3034,0x3035,INVALC,INVALC, + 0x3033,0x3028,0x3037,INVALC,INVALC,0x302B,INVALC,INVALC, + INVALC,0x3036,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3032,INVALC,0x346E,0x3471,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3472,INVALC, + 0x3474,INVALC,0x3469,INVALC,INVALC,INVALC,INVALC,0x346B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x346F,0x3475, + /* Block 89, Array index 0x0B00 */ + INVALC,INVALC,INVALC,0x3476,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6461, + INVALC,INVALC,0x6462,0x6463,INVALC,INVALC,INVALC,INVALC, + 0x3A4A,INVALC,0x3A45,INVALC,INVALC,INVALC,INVALC,0x3A47, + INVALC,INVALC,0x3A50,INVALC,INVALC,INVALC,0x3A4C,INVALC, + INVALC,INVALC,INVALC,0x6336,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A4E,INVALC,0x3A49,INVALC,0x3A4B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6337,INVALC,0x6464, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4057,INVALC,INVALC,INVALC,INVALC,INVALC,0x405B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4056,INVALC,INVALC,0x405E, + 0x405C,0x4058,INVALC,INVALC,INVALC,INVALC,0x405D,0x6343, + INVALC,0x405A,0x4059,INVALC,0x4054,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4643,0x463E,INVALC,INVALC,INVALC,0x4642, + 0x463C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x463D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x463A,0x4645,INVALC,INVALC, + INVALC,INVALC,0x4638,INVALC,INVALC,0x4641,0x4644,0x4640, + INVALC,INVALC,INVALC,0x6465,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B46,INVALC,0x4B50,INVALC,INVALC,0x4B51, + INVALC,INVALC,0x4B4B,INVALC,INVALC,0x463F,INVALC,INVALC, + 0x4B4D,INVALC,0x4B49,INVALC,0x4B4F,0x4B4C,INVALC,0x4B47, + INVALC,INVALC,INVALC,0x504A,INVALC,INVALC,INVALC,INVALC, + 0x504B,INVALC,INVALC,0x5048,0x504C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5049,INVALC,INVALC,0x544B,INVALC,INVALC, + 0x544C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A2F,INVALC,INVALC,INVALC, + 0x5A2E,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E28,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2343,INVALC, + 0x2545,0x2543,0x2544,0x282D,INVALC,0x2B77,INVALC,0x3477, + INVALC,INVALC,INVALC,0x3A52,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x0C00 */ + 0x6466,0x504D,0x2139,INVALC,0x2235,0x2344,INVALC,INVALC, + 0x2B7A,0x2B79,0x213A,0x2546,INVALC,INVALC,INVALC,INVALC, + 0x4646,0x6560,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2236,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3479, + INVALC,INVALC,INVALC,0x405F,INVALC,INVALC,0x4B53,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2238,INVALC,0x2237,INVALC,0x2239,INVALC,0x2347,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2549,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x282E,0x282F,0x6467,INVALC,INVALC, + INVALC,INVALC,0x2B7C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x347B,INVALC,0x347C,0x347D,INVALC, + INVALC,INVALC,INVALC,0x3A53,0x3A54,INVALC,0x4060,INVALC, + 0x4061,INVALC,INVALC,INVALC,0x4648,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x223B,INVALC,INVALC, + INVALC,INVALC,0x234B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x234D,INVALC, + INVALC,0x2555,INVALC,INVALC,0x254C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x254B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2556,0x2553,0x254E,INVALC,INVALC,0x2551, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2841,0x2833,INVALC,INVALC, + 0x2838,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2845, + 0x2840,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x283D, + INVALC,INVALC,0x2837,INVALC,0x2835,INVALC,INVALC,INVALC, + INVALC,0x283F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2C26,INVALC,0x2846, + INVALC,0x2C2D,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C21, + INVALC,INVALC,0x2C2C,INVALC,INVALC,INVALC,INVALC,0x2C2E, + INVALC,INVALC,INVALC,0x2C23,INVALC,INVALC,INVALC,0x2C24, + 0x2C25,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2C2B,0x2C29,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x0D00 */ + INVALC,INVALC,0x2C2A,INVALC,0x2C28,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3040,INVALC,0x2C27,INVALC,INVALC, + 0x6270,INVALC,0x304F,INVALC,0x304A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x304E,INVALC,INVALC,0x303E,INVALC,INVALC, + INVALC,0x303B,0x3045,INVALC,0x3048,INVALC,0x3052,INVALC, + INVALC,INVALC,0x303C,0x3522,0x3538,INVALC,INVALC,0x304D, + INVALC,0x304B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3528,0x3524,INVALC,0x3531,INVALC,0x3533, + INVALC,INVALC,INVALC,INVALC,INVALC,0x352E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x352A,INVALC,INVALC,0x352F,0x353B, + INVALC,INVALC,INVALC,INVALC,0x353A,INVALC,INVALC,INVALC, + INVALC,0x3539,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3527,INVALC,0x353C,INVALC,INVALC,INVALC,INVALC, + 0x3530,INVALC,INVALC,0x352B,INVALC,INVALC,0x3529,0x3534, + INVALC,0x3532,INVALC,0x3537,INVALC,0x3535,INVALC,INVALC, + INVALC,0x3A75,INVALC,INVALC,INVALC,INVALC,0x3A7C,INVALC, + 0x3A63,0x3A61,0x3A58,INVALC,INVALC,0x3A5B,0x3A77,0x3A72, + 0x3A59,0x3A60,INVALC,INVALC,INVALC,0x3A7B,INVALC,INVALC, + INVALC,0x3A66,INVALC,INVALC,INVALC,INVALC,0x3A62,INVALC, + 0x3A5C,0x3A5E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A73,0x3A5A,INVALC,0x3A57,0x3A7A,INVALC,INVALC,INVALC, + 0x3A56,INVALC,0x3A79,0x3A78,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4067,INVALC,0x4066,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4064,0x3A6B, + 0x406A,0x6468,INVALC,0x6469,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x464C,INVALC,INVALC,0x464A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x464F, + 0x4653,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B5C,INVALC,0x4B58,INVALC,0x4B54,INVALC, + /* Block 92, Array index 0x0E00 */ + 0x4B5E,INVALC,INVALC,INVALC,0x4B56,INVALC,0x4B5A,INVALC, + INVALC,INVALC,0x4B5B,INVALC,INVALC,0x4B5D,0x4B5F,INVALC, + INVALC,0x5050,0x5053,INVALC,INVALC,0x5051,INVALC,INVALC, + 0x504F,INVALC,INVALC,INVALC,0x5054,INVALC,INVALC,0x504E, + INVALC,INVALC,0x5056,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5450,INVALC,0x544E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5452,INVALC,0x544F,INVALC,0x5451,INVALC,0x5453, + INVALC,0x5A31,0x5761,0x575E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C36,INVALC,0x5C39,INVALC,0x5C3A,INVALC, + INVALC,0x5E29,0x5F42,INVALC,INVALC,INVALC,INVALC,0x6073, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2848,INVALC,INVALC,INVALC,INVALC,INVALC,0x625C,0x646A, + INVALC,INVALC,0x2C2F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4071,INVALC,0x4072,INVALC, + INVALC,0x5057,INVALC,INVALC,0x5A34,INVALC,0x5C3B,INVALC, + 0x213B,INVALC,0x223D,INVALC,INVALC,INVALC,0x2350,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x255A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x284C,INVALC,0x284A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x284E,0x284B,0x284D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2C32,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3057, + INVALC,INVALC,INVALC,0x3056,0x3055,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3541,INVALC,INVALC,INVALC,INVALC, + 0x353F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A7E,INVALC,0x4074, + INVALC,INVALC,0x4075,0x4076,0x4073,0x6345,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A35,INVALC,INVALC,INVALC,0x5E2A, + INVALC,0x223E,INVALC,INVALC,INVALC,0x255E,0x255C,0x255D, + /* Block 93, Array index 0x0F00 */ + 0x2850,INVALC,INVALC,INVALC,INVALC,0x3058,0x3059,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x624A,0x223F,INVALC,INVALC,INVALC, + 0x2352,0x2851,INVALC,0x2C34,INVALC,INVALC,0x3B24,INVALC, + 0x4078,0x6525,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x255F,INVALC,INVALC,INVALC,0x2C35, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5454,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2354,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2854,0x2855,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x305A,0x305B,INVALC,INVALC,INVALC,0x646B, + INVALC,INVALC,INVALC,0x3543,INVALC,INVALC,0x3B26,0x3B25, + INVALC,0x3544,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A38,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x646C, + 0x2355,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x235A,INVALC,INVALC,INVALC,0x2561,0x2566,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2562,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2563,INVALC,0x285D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x285E,INVALC,INVALC,INVALC, + INVALC,0x285C,0x285F,0x2857,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2858,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2C3F,INVALC,INVALC, + INVALC,0x2C3B,INVALC,INVALC,INVALC,0x646D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2C3C,0x2C42,INVALC,INVALC, + INVALC,0x2C3E,0x2C41,INVALC,INVALC,0x2C43,0x2C3D,INVALC, + INVALC,0x3063,INVALC,0x305F,INVALC,INVALC,INVALC,0x3064, + INVALC,INVALC,INVALC,0x3061,INVALC,0x3062,INVALC,INVALC, + INVALC,INVALC,0x305E,INVALC,0x6271,INVALC,0x6272,INVALC, + /* Block 94, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x354B,0x3548,0x3547,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3551,INVALC,INVALC,0x3552,INVALC,0x354F,INVALC,INVALC, + 0x3555,INVALC,INVALC,INVALC,0x3B2B,INVALC,INVALC,INVALC, + INVALC,0x3546,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x354E,INVALC,0x354A,INVALC,INVALC,0x3554, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B36,INVALC,INVALC,0x3B28,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B27,INVALC,0x3B37,INVALC, + 0x3B2A,INVALC,INVALC,INVALC,INVALC,0x3B2E,INVALC,0x3B34, + INVALC,INVALC,INVALC,0x3B33,INVALC,INVALC,INVALC,0x3B31, + INVALC,INVALC,INVALC,0x3B2D,INVALC,INVALC,INVALC,INVALC, + 0x4121,INVALC,INVALC,INVALC,0x407C,INVALC,0x407A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4079,0x407D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x646E,INVALC,INVALC, + 0x465C,INVALC,INVALC,0x4654,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4656,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4659,0x465A,INVALC,0x646F,0x4B65, + 0x4B66,0x4B63,INVALC,INVALC,INVALC,INVALC,0x4B6B,INVALC, + 0x4B67,INVALC,INVALC,0x4B69,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B6A,0x4B68,0x6470,0x5058,INVALC, + INVALC,INVALC,INVALC,0x505B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x505A,INVALC,INVALC,0x6471,INVALC, + INVALC,0x5457,INVALC,0x5459,INVALC,INVALC,0x5455,0x6472, + INVALC,0x5762,INVALC,INVALC,0x5A39,INVALC,INVALC,INVALC, + 0x5C3D,INVALC,0x5C3C,INVALC,0x5C3E,INVALC,INVALC,INVALC, + 0x5E2D,INVALC,INVALC,0x5F43,INVALC,INVALC,INVALC,0x6030, + INVALC,INVALC,INVALC,0x213C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3557,0x4B6C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2567,0x2860,INVALC, + INVALC,INVALC,0x2C45,0x2C44,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x1100 */ + 0x2163,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x235C,0x2568,INVALC,0x256B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2862,0x2861,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C46,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3066,INVALC,0x3069,INVALC,0x3068,0x306A, + 0x3067,INVALC,0x355B,INVALC,INVALC,0x3559,INVALC,INVALC, + INVALC,0x3558,0x355A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3979,INVALC,INVALC,INVALC,0x3B3A,0x3B3B, + 0x3B3D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x465D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B6D,INVALC,INVALC,INVALC,0x4B70,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6473,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6677,INVALC,INVALC,INVALC,INVALC,INVALC,0x2863, + INVALC,INVALC,0x213D,INVALC,INVALC,INVALC,INVALC,0x213E, + INVALC,0x2247,INVALC,0x2248,INVALC,0x6678,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x256E,INVALC,0x256D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2865,0x2867,INVALC,INVALC,INVALC,0x2868,INVALC,INVALC, + INVALC,0x2C48,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x306C,INVALC,INVALC,INVALC,INVALC,INVALC,0x306B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3561,0x3560,INVALC,0x3B3F,INVALC,0x3B40, + 0x3B3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6474,INVALC,0x4661, + 0x4660,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x505C,INVALC,INVALC,0x6475,INVALC,INVALC, + 0x5C3F,INVALC,INVALC,INVALC,0x213F,0x2361,INVALC,INVALC, + 0x2869,0x286B,INVALC,0x2C4C,0x2C4B,0x306E,INVALC,INVALC, + /* Block 96, Array index 0x1200 */ + INVALC,INVALC,INVALC,0x256F,INVALC,INVALC,0x286D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2164,0x2249,0x2362,INVALC, + INVALC,0x3B42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2571,INVALC, + INVALC,0x286E,INVALC,INVALC,INVALC,0x2870,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C4D, + INVALC,INVALC,0x306F,INVALC,0x3562,INVALC,INVALC,INVALC, + INVALC,0x3563,0x3B47,0x3B45,INVALC,INVALC,0x3B44,INVALC, + INVALC,INVALC,0x4122,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5763,INVALC,INVALC, + 0x2140,0x2141,0x224A,0x2351,INVALC,0x2871,INVALC,INVALC, + INVALC,INVALC,0x4123,0x505E,INVALC,0x5764,INVALC,INVALC, + 0x6164,0x2142,INVALC,0x2572,INVALC,INVALC,0x2C50,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4124,INVALC, + INVALC,INVALC,0x5F45,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2876,0x2875,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6264,0x3070,0x3072, + INVALC,INVALC,INVALC,0x3071,0x6476,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6477,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B4B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4663,0x4664,INVALC,INVALC,INVALC, + 0x4B72,INVALC,0x6478,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E2F,INVALC,INVALC,INVALC,INVALC,0x224D, + 0x6251,INVALC,0x224C,INVALC,INVALC,INVALC,0x2578,INVALC, + INVALC,INVALC,INVALC,0x2366,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2367,0x2369,0x2577,INVALC,INVALC,0x257B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2576,0x2574, + INVALC,0x287E,INVALC,INVALC,0x257C,INVALC,INVALC,INVALC, + 0x2622,INVALC,0x2621,INVALC,INVALC,INVALC,0x257D,INVALC, + INVALC,0x2623,INVALC,INVALC,0x257A,INVALC,0x2575,INVALC, + /* Block 97, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2878, + 0x2922,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6266,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2C5A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2877,0x2C5B,INVALC,INVALC,INVALC,INVALC,0x287A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2921,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6267,INVALC,0x2C60,0x3079,INVALC,INVALC,0x2C56,0x3073, + INVALC,0x2C57,0x2C5D,INVALC,INVALC,INVALC,0x307E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2C54,INVALC,INVALC,INVALC, + 0x2C5F,0x2C61,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x307A,0x3078,0x307B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2C5C,INVALC,0x3076,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3122,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3125,INVALC,INVALC,INVALC,INVALC, + 0x3568,0x3074,INVALC,INVALC,INVALC,INVALC,0x3127,INVALC, + INVALC,0x3571,INVALC,INVALC,0x3572,INVALC,0x3123,0x3128, + INVALC,0x3121,0x356F,INVALC,INVALC,INVALC,0x3126,INVALC, + INVALC,INVALC,INVALC,0x3B54,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x356A,INVALC,0x3B56,INVALC,INVALC,INVALC,0x3B55,0x356E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3579,INVALC, + INVALC,INVALC,INVALC,0x3B58,INVALC,0x3B59,INVALC,0x3576, + INVALC,0x3B5A,0x3B4D,INVALC,INVALC,INVALC,0x3574,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B5E,INVALC,INVALC, + /* Block 98, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B4F, + INVALC,INVALC,INVALC,INVALC,0x3B51,INVALC,INVALC,INVALC, + INVALC,0x3B5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x412B,INVALC,INVALC,INVALC,INVALC,0x3B61,INVALC, + 0x3B62,0x3B63,0x3B50,INVALC,INVALC,0x6479,INVALC,INVALC, + INVALC,INVALC,0x4129,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4127,0x412C,INVALC,0x466F,INVALC,INVALC,INVALC,INVALC, + 0x466E,INVALC,0x4128,INVALC,0x466C,0x412E,INVALC,INVALC, + INVALC,INVALC,0x466D,0x412A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x647A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B73, + INVALC,0x4B7E,INVALC,INVALC,0x4B74,INVALC,INVALC,INVALC, + 0x4671,INVALC,INVALC,INVALC,0x4B7C,INVALC,INVALC,INVALC, + INVALC,0x4672,INVALC,INVALC,INVALC,INVALC,INVALC,0x466A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C21,INVALC,INVALC,0x4668,INVALC,0x4673,INVALC,INVALC, + INVALC,0x466B,INVALC,INVALC,INVALC,0x4C23,0x4674,0x4C24, + 0x4B77,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B7A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B76,INVALC,0x5068, + 0x4C28,0x5067,INVALC,INVALC,0x4C29,INVALC,0x4C25,INVALC, + INVALC,INVALC,INVALC,0x4B79,INVALC,INVALC,0x4B75,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5061, + INVALC,0x5063,INVALC,0x506A,INVALC,0x5064,INVALC,INVALC, + 0x5066,INVALC,INVALC,INVALC,0x506C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5062,0x5065, + 0x506B,INVALC,INVALC,0x6679,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5461,0x545F,0x545C,0x545E,0x545D,INVALC,INVALC, + INVALC,INVALC,0x545B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5765,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x1500 */ + INVALC,INVALC,0x5F46,INVALC,INVALC,0x613E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x236B, + INVALC,INVALC,INVALC,0x2625,INVALC,INVALC,INVALC,INVALC, + 0x2C63,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B64,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4676,INVALC,INVALC,INVALC,0x4675,INVALC,INVALC,0x4C2C, + INVALC,0x506D,INVALC,INVALC,INVALC,0x5F48,INVALC,0x2165, + 0x2166,0x224E,INVALC,0x2628,0x2629,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3129,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2250, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x236F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x236C,INVALC,0x236D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x236E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2639,INVALC,INVALC, + 0x262E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x262A,INVALC,INVALC,0x2637,INVALC,INVALC, + INVALC,INVALC,INVALC,0x262F,INVALC,0x2636,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2635,INVALC,0x2633,0x2634,0x2638,0x2631,INVALC, + INVALC,INVALC,INVALC,0x647B,INVALC,0x2632,0x2931,0x292A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2926,INVALC,INVALC,INVALC,INVALC,0x2928, + INVALC,INVALC,0x2925,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2934,0x2932,INVALC,INVALC,INVALC,0x2933,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x292E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2930,0x2937,0x2935, + 0x2936,0x292F,INVALC,INVALC,0x2929,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2C6D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,0x2C6F,0x2C70,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C6C, + INVALC,0x3132,INVALC,0x3133,INVALC,INVALC,INVALC,0x2C6B, + INVALC,0x2C6E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x312C,INVALC, + 0x312F,0x3135,INVALC,INVALC,INVALC,0x3138,INVALC,0x3137, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x313C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x312E,0x3139,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3130,0x313B,0x3136,INVALC,INVALC, + 0x647C,INVALC,INVALC,INVALC,0x647D,INVALC,0x3631,INVALC, + INVALC,INVALC,0x3627,INVALC,0x3629,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3626,0x3632,INVALC,INVALC,INVALC, + INVALC,0x3622,INVALC,INVALC,INVALC,INVALC,0x357C,0x362B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3623,INVALC, + INVALC,INVALC,INVALC,0x357D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3624,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x362D,INVALC,INVALC,INVALC,0x647E,INVALC, + INVALC,INVALC,0x362E,INVALC,INVALC,INVALC,INVALC,0x3B71, + INVALC,0x3B70,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B67,INVALC, + INVALC,INVALC,0x3B66,INVALC,INVALC,INVALC,0x3B68,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B72, + 0x3B6D,INVALC,0x6339,INVALC,INVALC,INVALC,0x3B6F,INVALC, + /* Block 101, Array index 0x1700 */ + INVALC,INVALC,INVALC,0x6521,INVALC,INVALC,INVALC,0x4149, + 0x4132,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x413A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4138,INVALC,INVALC,INVALC,0x413E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x413D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4136,0x4133,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4134,INVALC,0x4148,0x4725,0x4142,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4144,0x4145, + INVALC,0x6676,INVALC,INVALC,0x4678,INVALC,INVALC,0x4728, + INVALC,INVALC,INVALC,INVALC,INVALC,0x467E,0x4724,0x467A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4721,INVALC,0x472A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4723,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4722,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x467B,INVALC,0x4729,INVALC, + 0x4C2D,0x4726,INVALC,0x4C35,INVALC,INVALC,0x4C38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C30,0x4C2F,INVALC, + INVALC,0x4C3B,INVALC,INVALC,0x4C31,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4C2E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C3E,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C3F, + 0x4C34,INVALC,0x4C3D,INVALC,INVALC,INVALC,INVALC,0x4C3A, + INVALC,INVALC,INVALC,INVALC,0x4C39,INVALC,0x6522,INVALC, + INVALC,0x4C37,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5070,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C32,INVALC, + 0x5077,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5076,INVALC,0x506F,INVALC,0x5079,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5075,INVALC,INVALC,0x5464, + INVALC,0x5467,INVALC,INVALC,INVALC,0x576B,INVALC,0x576D, + INVALC,INVALC,0x576C,INVALC,INVALC,INVALC,0x5469,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x576A,INVALC, + INVALC,0x5770,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x576E,INVALC,INVALC, + 0x5A3B,INVALC,0x5A3C,0x5A3A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6523,INVALC,INVALC,INVALC,0x5F4A,0x5F4B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F49, + 0x6032,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2C72,INVALC,INVALC,0x2167,0x2168,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2C74,INVALC,0x2C76,INVALC,0x2C73,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x313D,INVALC,0x3637,0x3636,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3634,INVALC,INVALC,INVALC,INVALC,0x3B74, + 0x3B75,0x3B76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x414B,INVALC,0x414E,0x6346,INVALC, + 0x414D,0x4730,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C41,INVALC,INVALC, + 0x2558,0x2939,INVALC,0x3140,INVALC,0x3638,0x3639,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3142,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x293B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x363A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x546B,INVALC,INVALC, + INVALC,INVALC,0x293C,INVALC,INVALC,INVALC,0x2C77,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x363C, + INVALC,0x363F,0x363D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A3F,INVALC,INVALC,INVALC, + 0x2169,INVALC,INVALC,0x3641,0x4150,INVALC,INVALC,0x2251, + INVALC,INVALC,0x2373,0x2372,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x263D,INVALC, + INVALC,0x625E,INVALC,INVALC,INVALC,INVALC,0x2943,0x293E, + /* Block 103, Array index 0x1900 */ + INVALC,0x2942,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2940, + 0x2941,INVALC,0x2C7E,0x2C7A,INVALC,INVALC,0x2D23,INVALC, + INVALC,INVALC,INVALC,0x2C7C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2C79,INVALC,INVALC,0x2C7D,INVALC,INVALC,INVALC, + 0x2D21,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D24, + 0x2D25,INVALC,INVALC,0x2D22,0x2C37,INVALC,INVALC,INVALC, + 0x3146,INVALC,INVALC,INVALC,0x314C,INVALC,0x3144,INVALC, + 0x3149,INVALC,INVALC,0x3148,INVALC,0x314D,0x3145,INVALC, + 0x3143,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3642, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x314B,INVALC,INVALC,0x3644,INVALC,INVALC,INVALC,0x3645, + INVALC,0x3C26,INVALC,0x3B7D,INVALC,0x3C25,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3C23,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B7C,INVALC,0x3B7E, + INVALC,0x3C24,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x415B,0x4156, + INVALC,INVALC,0x4159,0x4151,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4734,INVALC,0x4735,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4739,0x4733,0x4737,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C44,0x4C46,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4C41,INVALC,INVALC,0x4C40,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C43,INVALC,INVALC,0x507D, + INVALC,0x5123,INVALC,0x507A,INVALC,0x507E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5122,0x5471,INVALC, + 0x546F,0x5470,INVALC,INVALC,0x546C,0x546D,INVALC,0x5472, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A43, + INVALC,0x5A42,0x6526,INVALC,INVALC,0x5C42,INVALC,0x5C43, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x613F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2641,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x1A00 */ + INVALC,INVALC,0x6527,INVALC,INVALC,INVALC,0x5124,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2945,INVALC,0x2D27,INVALC, + INVALC,0x6632,INVALC,INVALC,INVALC,INVALC,0x3648,INVALC, + INVALC,0x3647,0x3646,INVALC,INVALC,INVALC,0x3C29,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5126,0x6633,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2252, + INVALC,INVALC,0x2377,INVALC,INVALC,INVALC,0x2378,0x2375, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2648,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2649,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2645,INVALC,0x2644,INVALC,INVALC,INVALC, + 0x2647,INVALC,INVALC,0x2642,INVALC,INVALC,INVALC,INVALC, + INVALC,0x264A,INVALC,INVALC,INVALC,0x6257,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2947,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2952,INVALC,0x2949,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x625F,INVALC,0x294A,INVALC,INVALC,INVALC,INVALC,0x294F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2948,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x294E,0x294C,0x6528,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6529,INVALC,INVALC,INVALC, + INVALC,0x2D36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2D2E,INVALC,INVALC,0x2D30, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D2D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2D31,0x2D2B,0x2D3A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2D2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2951,INVALC,0x2D34,INVALC,INVALC,0x2D32,INVALC, + /* Block 105, Array index 0x1B00 */ + 0x2D39,0x2D37,INVALC,INVALC,INVALC,0x2D38,0x652B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x652A,INVALC,INVALC,INVALC,INVALC,0x315D,INVALC,INVALC, + INVALC,0x3157,INVALC,0x3153,INVALC,INVALC,0x315B,INVALC, + INVALC,INVALC,0x315E,0x3164,0x3150,INVALC,INVALC,0x315F, + INVALC,INVALC,INVALC,INVALC,0x3156,INVALC,INVALC,INVALC, + 0x3163,INVALC,INVALC,INVALC,INVALC,INVALC,0x3154,0x314F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x315A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3159, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2D2F,INVALC,INVALC,0x3162,0x3158,INVALC, + 0x3161,0x3160,0x652D,INVALC,INVALC,INVALC,0x652C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3655,INVALC,INVALC,INVALC, + 0x3660,INVALC,INVALC,0x364E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x365B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3657,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3651,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x365A,INVALC,INVALC, + 0x364D,0x365C,0x3650,INVALC,INVALC,INVALC,0x364B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3654,0x3478,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x364C,0x3652, + 0x365E,0x365F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3656,INVALC,0x3C45,INVALC,0x3C41,INVALC,INVALC, + INVALC,INVALC,0x3C38,INVALC,INVALC,INVALC,INVALC,0x3C3E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3653,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C3D,INVALC,INVALC,0x3C32,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C2A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C31,0x3C42, + /* Block 106, Array index 0x1C00 */ + 0x3C39,0x3C3B,0x3C34,0x3C2F,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3C37,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C3C,INVALC,INVALC,INVALC,0x3C44,INVALC,0x3C33,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x652F,INVALC,INVALC,0x652E,INVALC,0x3C40,INVALC, + INVALC,0x4165,INVALC,INVALC,INVALC,INVALC,0x4177,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4168,INVALC, + INVALC,INVALC,INVALC,0x416B,INVALC,INVALC,0x415D,0x4175, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4173,INVALC,INVALC, + 0x4174,INVALC,INVALC,INVALC,INVALC,0x416F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4179,INVALC,INVALC,0x4178,INVALC,INVALC,0x4176, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x416D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x416A,0x417B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4172,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x473A, + INVALC,INVALC,0x473D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4751,INVALC,INVALC,INVALC,INVALC,0x474E,INVALC,0x4746, + INVALC,INVALC,0x4747,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x473E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6352,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4743,INVALC,INVALC,INVALC,INVALC,0x473B,INVALC,INVALC, + 0x473C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4745,0x4748,INVALC,INVALC,0x474D,0x4744,INVALC, + 0x4C54,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x474C,INVALC,0x4742,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C64,0x4C60,INVALC,INVALC,INVALC,INVALC,0x4C4F, + 0x4C51,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C5F,0x4C57,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 107, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4C4D,0x4C50,INVALC,0x4C47,INVALC, + 0x4C5B,INVALC,0x4C56,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C4A,INVALC,0x4C49,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C52,INVALC,0x4C62,INVALC,INVALC,INVALC, + INVALC,0x4C5E,0x4C59,INVALC,0x4C61,0x6530,INVALC,INVALC, + INVALC,INVALC,INVALC,0x512C,INVALC,INVALC,0x513C,0x5138, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5128,0x512B,INVALC,0x5140,INVALC,INVALC, + INVALC,INVALC,0x513B,INVALC,0x5131,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5129,0x513E,INVALC,INVALC,INVALC,0x512F, + INVALC,INVALC,INVALC,INVALC,0x5144,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5127,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x512E,INVALC,0x5132,INVALC, + 0x5141,0x513A,INVALC,INVALC,INVALC,INVALC,INVALC,0x6531, + INVALC,INVALC,0x6532,INVALC,INVALC,0x5475,INVALC,INVALC, + INVALC,INVALC,0x547B,INVALC,INVALC,INVALC,0x5521,INVALC, + 0x547C,INVALC,0x5476,INVALC,INVALC,INVALC,INVALC,0x5527, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5523,0x547A,INVALC,INVALC,INVALC,0x5524,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5478, + INVALC,INVALC,0x5529,0x5774,INVALC,INVALC,INVALC,INVALC, + 0x5777,0x5821,0x5776,INVALC,INVALC,0x5778,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x577E,INVALC,0x5779,0x5823, + 0x577D,0x577A,INVALC,INVALC,0x5822,INVALC,INVALC,INVALC, + 0x577B,INVALC,0x6533,INVALC,INVALC,INVALC,0x5A44,INVALC, + INVALC,INVALC,0x5A4F,INVALC,0x5A45,0x5A4E,INVALC,0x5A47, + 0x5A4D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A48,0x5A46,INVALC,INVALC,0x6534,INVALC, + INVALC,0x5C49,INVALC,INVALC,INVALC,0x5775,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C47,0x6535,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E35,0x5E34,0x5E33, + /* Block 108, Array index 0x1E00 */ + INVALC,0x5E37,INVALC,INVALC,INVALC,INVALC,0x5F4F,0x5F4E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6536,0x6537,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6074,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6140,0x6165,0x6141,INVALC,INVALC, + INVALC,INVALC,0x2379,INVALC,INVALC,INVALC,0x2953,0x2954, + INVALC,0x6269,0x2D3C,0x3166,INVALC,INVALC,0x3165,INVALC, + 0x3167,INVALC,INVALC,INVALC,INVALC,0x3662,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x417D,INVALC,INVALC,INVALC,0x417C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C66, + INVALC,INVALC,0x4C65,0x4C67,INVALC,INVALC,INVALC,0x5146, + 0x5145,INVALC,INVALC,INVALC,INVALC,0x552B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2955,0x2956,INVALC,0x2D3D,0x3168,INVALC,0x3C49,0x3C47, + INVALC,0x417E,INVALC,0x4221,0x4753,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2253,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2958,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x316A,INVALC,INVALC,INVALC,INVALC, + 0x3664,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4222,0x6354,INVALC,INVALC, + INVALC,0x4754,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2959,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3665,INVALC,INVALC,0x3C4B,INVALC, + INVALC,0x4226,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x237A,INVALC, + INVALC,0x295A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6538,0x6539,INVALC,INVALC, + INVALC,0x2D42,INVALC,INVALC,INVALC,0x316E,INVALC,INVALC, + INVALC,0x316C,0x316D,INVALC,INVALC,0x3666,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C4D,INVALC,0x653A,INVALC, + INVALC,INVALC,0x4228,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x552D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x295D,INVALC,0x653B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C4E,INVALC,INVALC, + INVALC,0x4229,0x422A,INVALC,INVALC,INVALC,INVALC,0x2257, + INVALC,0x2254,INVALC,INVALC,0x2421,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2258,0x2259,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x237D,INVALC,0x2425,INVALC,INVALC,0x2655,INVALC, + 0x237C,INVALC,0x2423,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x653C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2964,INVALC,0x2650,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2653,INVALC,0x237E, + INVALC,0x2657,INVALC,INVALC,0x2651,INVALC,INVALC,0x264C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x264D,INVALC,INVALC,INVALC,INVALC,INVALC,0x2963, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x264E,0x2652, + 0x265C,0x2659,0x2656,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x265B,INVALC,INVALC,INVALC,INVALC,0x2D4E, + INVALC,INVALC,0x296B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x296D,INVALC,INVALC,0x6261,INVALC,INVALC,0x296C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x296A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2965, + INVALC,INVALC,INVALC,INVALC,0x2969,INVALC,0x6260,INVALC, + INVALC,INVALC,0x2967,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2D4F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D46, + /* Block 110, Array index 0x2000 */ + INVALC,INVALC,0x2D50,INVALC,INVALC,0x2D48,0x2D4A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2D49,0x2D47,0x2D4D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x317A,INVALC,INVALC,INVALC, + INVALC,0x2D4B,INVALC,0x2D45,0x2D57,INVALC,0x2D53,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2D55,0x2D51,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3177,0x3173, + INVALC,INVALC,INVALC,0x3179,0x3226,0x3176,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x316F,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3222,0x3225,0x3172,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3221,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3178, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3227,INVALC, + INVALC,0x317D,0x317B,0x317C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x653D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x366F,INVALC,INVALC, + 0x367A,0x3721,INVALC,INVALC,INVALC,INVALC,0x3C50,INVALC, + INVALC,0x3672,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x366A,INVALC,0x366B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x366C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3674, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x367C,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C5D,0x3728, + /* Block 111, Array index 0x2100 */ + INVALC,0x3726,0x3723,INVALC,0x3670,INVALC,0x3677,0x3724, + 0x3676,0x3725,0x3679,INVALC,0x367D,INVALC,INVALC,0x653E, + INVALC,INVALC,0x3729,INVALC,INVALC,INVALC,INVALC,0x3727, + 0x3C54,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C52,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3C6B,0x3C6D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C5A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C56,INVALC,INVALC,INVALC,0x3C6E,INVALC,INVALC,0x3C58, + 0x3C69,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C66, + INVALC,0x3C64,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C5B,INVALC,0x423A,0x3C60,INVALC,INVALC, + 0x3C5C,INVALC,INVALC,INVALC,INVALC,0x3C51,0x3C6C,INVALC, + INVALC,INVALC,INVALC,0x3C62,0x6542,INVALC,0x3C63,INVALC, + 0x3C68,INVALC,INVALC,INVALC,0x6540,INVALC,0x633D,INVALC, + INVALC,INVALC,0x653F,0x6541,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4230,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4233,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x422E,0x4236,INVALC,INVALC,0x4240,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4239,INVALC,INVALC, + 0x422D,INVALC,INVALC,0x4231,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4244,0x423E,0x4247,INVALC,0x423D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4245,INVALC,INVALC,0x423F,INVALC, + 0x423B,0x4246,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4756,INVALC,INVALC,0x4757,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4765,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 112, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,0x4763,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4C78,0x475B,INVALC,INVALC,INVALC, + 0x4C6A,0x4764,INVALC,INVALC,INVALC,INVALC,INVALC,0x475F, + INVALC,INVALC,INVALC,0x475A,INVALC,0x475C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x475E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x475D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C74,INVALC,INVALC, + INVALC,INVALC,0x4762,INVALC,0x4761,INVALC,INVALC,INVALC, + 0x6544,0x6545,0x4766,INVALC,0x6543,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C7D,INVALC,INVALC,0x4C73,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C6B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C75,INVALC,INVALC,0x4C7E,0x4C6C,INVALC,INVALC, + INVALC,0x4C79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C7A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6363,INVALC,INVALC,INVALC,INVALC,0x4C7B, + INVALC,0x4C77,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6547,INVALC,INVALC,INVALC,0x6546,INVALC,0x5156, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5154,INVALC,0x5158, + INVALC,INVALC,INVALC,0x514D,INVALC,INVALC,0x5150,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C71,INVALC,INVALC,0x5155,INVALC,INVALC,0x5530,0x552F, + INVALC,0x5535,0x5536,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5531,INVALC,INVALC, + INVALC,INVALC,0x5537,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A55,INVALC,0x5159,0x5539,INVALC, + 0x6548,INVALC,INVALC,INVALC,INVALC,0x5828,INVALC,INVALC, + /* Block 113, Array index 0x2300 */ + INVALC,INVALC,0x582A,0x5827,INVALC,INVALC,INVALC,INVALC, + 0x5826,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5829,INVALC,INVALC,0x582B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A52,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A54,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A53,0x654A,0x6549,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C4F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E3C, + INVALC,INVALC,INVALC,0x5E3A,INVALC,0x5E3B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6036,0x5F52,INVALC,INVALC,INVALC, + INVALC,0x6037,INVALC,INVALC,0x654B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6179, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2428,0x2426, + INVALC,INVALC,0x2427,0x242B,INVALC,0x2662,INVALC,0x265F, + INVALC,0x265E,INVALC,0x2663,INVALC,INVALC,0x2660,INVALC, + INVALC,0x2977,INVALC,INVALC,INVALC,INVALC,INVALC,0x2974, + 0x2970,0x2975,INVALC,0x296F,0x2979,0x2976,INVALC,0x2972, + 0x2971,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2D5E,INVALC,0x2D5C,0x2D5A,INVALC,0x2D58,0x626A,0x2D65, + 0x2D62,INVALC,0x2D5F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2D64,INVALC,INVALC,INVALC,0x2D63,INVALC, + INVALC,0x2D68,INVALC,0x2D5D,INVALC,INVALC,INVALC,0x654D, + INVALC,INVALC,INVALC,INVALC,0x3228,INVALC,INVALC,INVALC, + INVALC,0x6279,INVALC,INVALC,0x322A,INVALC,INVALC,INVALC, + 0x322B,INVALC,INVALC,INVALC,INVALC,0x3231,0x322F,INVALC, + INVALC,INVALC,INVALC,0x3229,INVALC,INVALC,INVALC,0x322D, + INVALC,INVALC,INVALC,0x322C,INVALC,0x654F,INVALC,INVALC, + INVALC,INVALC,0x654E,INVALC,INVALC,INVALC,0x3230,INVALC, + INVALC,0x3730,0x3732,INVALC,INVALC,0x372F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3735,INVALC, + /* Block 114, Array index 0x2400 */ + INVALC,0x372E,INVALC,0x372C,INVALC,INVALC,INVALC,0x372D, + 0x3731,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3733, + INVALC,0x6550,0x6551,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C74,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C7D,INVALC,INVALC,0x3C7C, + INVALC,INVALC,0x3C6F,0x3C7A,0x3C72,0x3D21,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3C7B,0x3C79,0x3C71,INVALC,0x3C73, + 0x3C77,0x6553,INVALC,0x6554,INVALC,0x6555,INVALC,0x6552, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4257,INVALC,INVALC, + 0x424C,INVALC,0x424E,INVALC,INVALC,INVALC,INVALC,0x4251, + INVALC,0x4258,INVALC,INVALC,INVALC,INVALC,INVALC,0x4252, + INVALC,INVALC,INVALC,0x483C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x424F,INVALC,0x4259,INVALC,0x4249, + INVALC,0x6559,INVALC,INVALC,0x4253,0x6557,0x6558,0x6556, + INVALC,INVALC,INVALC,INVALC,0x476F,INVALC,0x476E,0x476C, + INVALC,INVALC,INVALC,0x4770,INVALC,INVALC,INVALC,INVALC, + 0x4772,INVALC,INVALC,0x476A,0x476D,0x476B,0x4768,INVALC, + INVALC,0x4767,INVALC,0x655B,INVALC,INVALC,0x655A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D2A,0x4D24,INVALC,INVALC,0x4D29,INVALC, + INVALC,INVALC,INVALC,0x4D28,INVALC,0x4D25,0x4D22,INVALC, + INVALC,INVALC,INVALC,INVALC,0x655C,INVALC,0x5162,0x515A, + INVALC,INVALC,0x5160,0x515C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5163,0x6374,INVALC,INVALC, + INVALC,0x515E,INVALC,0x5166,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x655D,0x655E,INVALC, + INVALC,INVALC,INVALC,0x553C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x553E,0x5543,0x5540,INVALC,INVALC,INVALC,0x5541, + INVALC,INVALC,INVALC,0x5542,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x582D,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 115, Array index 0x2500 */ + 0x582E,INVALC,INVALC,INVALC,0x5A56,INVALC,INVALC,INVALC, + 0x5A57,INVALC,INVALC,0x5C59,INVALC,INVALC,0x655F,0x5C56, + INVALC,0x5C58,0x5C55,INVALC,INVALC,0x5A58,0x5C53,0x5C57, + 0x6561,INVALC,INVALC,INVALC,0x5F53,INVALC,INVALC,INVALC, + 0x5F54,0x6039,INVALC,INVALC,0x6143,0x6142,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D69,INVALC, + INVALC,INVALC,0x3D22,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2D6B,INVALC,INVALC,INVALC, + 0x297C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x425D,INVALC, + 0x425C,0x425B,INVALC,INVALC,INVALC,0x4D2E,INVALC,0x4D2D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2664,0x2A21,0x2A22,INVALC, + 0x2A23,INVALC,INVALC,INVALC,INVALC,0x2D6D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3236,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3D24,0x3D23,INVALC,INVALC,INVALC,0x3D25, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4775,INVALC,INVALC,INVALC, + INVALC,0x4D2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x617B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x242C,0x242D,INVALC,INVALC,INVALC,0x266B,INVALC, + INVALC,0x2669,INVALC,0x2666,0x2667,INVALC,0x266A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2668, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2A26,INVALC,0x2A2A, + INVALC,INVALC,INVALC,0x2A27,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A28,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2D75,INVALC,INVALC,0x2D74,INVALC,0x2D70, + INVALC,INVALC,INVALC,INVALC,0x2D73,0x2D71,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3238,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 116, Array index 0x2600 */ + INVALC,INVALC,0x3239,INVALC,INVALC,INVALC,0x3D26,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x373B,INVALC, + 0x373A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3739,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D27,INVALC,INVALC,INVALC, + 0x3D2E,INVALC,0x3D29,0x3D2B,0x3D2A,INVALC,0x4261,0x3D2D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D28,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x425F,INVALC,INVALC,INVALC,INVALC,0x4262,0x6562, + 0x6563,INVALC,INVALC,0x4D30,INVALC,INVALC,INVALC,0x4779, + INVALC,INVALC,INVALC,0x4778,0x477A,0x4777,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5549,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x225A,0x216B,INVALC,0x242F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x266E,INVALC,INVALC,INVALC,0x2A33,INVALC,0x2A2D,INVALC, + INVALC,INVALC,INVALC,0x2A2C,INVALC,INVALC,INVALC,0x2A2B, + INVALC,INVALC,0x2A32,INVALC,INVALC,INVALC,INVALC,0x2A2F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2D78,INVALC,INVALC, + INVALC,0x2D7B,INVALC,INVALC,0x2D77,INVALC,INVALC,INVALC, + INVALC,0x2D7A,INVALC,INVALC,INVALC,INVALC,0x2D7E,0x2D79, + 0x2D7C,INVALC,INVALC,INVALC,INVALC,0x323E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3240, + INVALC,0x3247,0x323C,INVALC,0x3246,INVALC,0x3241,INVALC, + INVALC,INVALC,INVALC,INVALC,0x323D,INVALC,INVALC,0x6564, + INVALC,INVALC,INVALC,0x373D,INVALC,INVALC,INVALC,0x3D38, + INVALC,0x323F,INVALC,0x3740,INVALC,INVALC,INVALC,INVALC, + /* Block 117, Array index 0x2700 */ + INVALC,INVALC,0x373C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6565,INVALC,0x3D36,0x3D3A,INVALC,0x3D2F, + 0x3D3B,0x3D32,INVALC,INVALC,0x3D39,INVALC,0x426D,0x3D35, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4264, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D33,0x3D3C,INVALC,0x6566,0x3D37,0x4268,0x4275,INVALC, + INVALC,INVALC,INVALC,0x426F,INVALC,0x4274,INVALC,0x426E, + 0x4266,0x4271,INVALC,INVALC,0x4273,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4267,INVALC,INVALC,0x426B,INVALC, + 0x4270,INVALC,INVALC,INVALC,INVALC,0x426A,INVALC,INVALC, + 0x4825,0x477E,INVALC,INVALC,INVALC,0x477C,0x477D,INVALC, + 0x4822,INVALC,INVALC,0x4821,0x477B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4827,INVALC,0x4823,INVALC, + INVALC,INVALC,0x4D31,0x4D3B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D39,INVALC,0x4D36,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D35,0x6568,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D3A,INVALC,INVALC,0x516A,INVALC, + INVALC,0x6375,INVALC,0x5167,INVALC,0x516C,INVALC,INVALC, + INVALC,INVALC,0x516B,INVALC,0x6567,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x554F,INVALC,0x554B,INVALC, + INVALC,INVALC,INVALC,0x554D,0x6569,INVALC,INVALC,INVALC, + INVALC,0x582F,INVALC,INVALC,0x5830,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A5A,INVALC,INVALC,0x5A5C, + 0x5A5D,0x5A5B,INVALC,INVALC,0x5C5E,0x5C5C,0x5C5F,INVALC, + 0x5C5D,0x5C60,INVALC,0x5E3D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2E22,INVALC,0x2E21,INVALC,0x2E24, + INVALC,INVALC,INVALC,0x3248,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D3D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 118, Array index 0x2800 */ + INVALC,0x4277,INVALC,INVALC,INVALC,INVALC,0x4828,INVALC, + INVALC,0x4D3D,0x516D,INVALC,INVALC,INVALC,0x516E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3744,INVALC,INVALC,0x4278,INVALC, + INVALC,INVALC,INVALC,0x3745,0x3D3E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A37,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2A38,0x2A35,INVALC,0x2A36,INVALC,0x2E27,INVALC, + INVALC,0x2E25,0x2E28,INVALC,INVALC,0x2E2A,INVALC,INVALC, + 0x2E26,INVALC,INVALC,INVALC,INVALC,0x324E,0x324D,0x3250, + 0x324F,INVALC,INVALC,INVALC,INVALC,INVALC,0x3251,INVALC, + INVALC,0x3746,INVALC,INVALC,INVALC,INVALC,INVALC,0x3749, + 0x3747,INVALC,INVALC,INVALC,INVALC,0x3D43,0x3D42,INVALC, + INVALC,0x3D44,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x427B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5170,INVALC,0x5552,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C62,INVALC,INVALC,INVALC,INVALC,0x3D45,INVALC, + INVALC,INVALC,0x225B,0x2673,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A3A,INVALC,INVALC,0x2A3B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E2B,INVALC, + 0x2E2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3257,INVALC,INVALC,0x3255,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3252,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x374A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D47,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x427C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 119, Array index 0x2900 */ + INVALC,INVALC,0x427D,INVALC,INVALC,INVALC,INVALC,0x482B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4829,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5171,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5173,0x5172, + INVALC,INVALC,INVALC,0x5174,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5555,0x5553,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5554,0x5834, + INVALC,0x5833,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5832,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E3F, + 0x5E3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x603B, + INVALC,INVALC,INVALC,0x656A,INVALC,INVALC,0x225C,0x656B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2674,INVALC,INVALC,0x2676,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x374D,INVALC,INVALC,INVALC,0x3D4C,INVALC,INVALC,0x427E, + 0x4321,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5176,INVALC,0x5556,INVALC,0x5557,INVALC,INVALC, + INVALC,0x5A5E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D4D,INVALC,INVALC,INVALC,0x4830, + INVALC,0x482E,INVALC,INVALC,0x656C,INVALC,INVALC,INVALC, + 0x2677,0x2678,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E32, + INVALC,INVALC,INVALC,0x325A,0x325B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3750,0x3752,0x3751, + INVALC,0x3D4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4831,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5835,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2E35,INVALC,0x2E33, + /* Block 120, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x626C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3264,0x325F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x325E,INVALC, + 0x3268,INVALC,INVALC,INVALC,INVALC,INVALC,0x3759,INVALC, + INVALC,0x3267,INVALC,INVALC,0x3265,INVALC,0x3755,INVALC, + INVALC,INVALC,0x325C,0x3263,INVALC,INVALC,INVALC,INVALC, + 0x3753,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3262, + 0x3757,INVALC,0x3D56,0x3D53,INVALC,INVALC,INVALC,INVALC, + 0x3D51,0x3D52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4327,INVALC,INVALC,INVALC,INVALC, + 0x4328,INVALC,INVALC,INVALC,INVALC,0x4325,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4326,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4839,INVALC,INVALC,0x4833,0x4836,0x4835,0x4834, + 0x4838,INVALC,0x483B,0x483D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D44,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D46,INVALC,INVALC,INVALC,INVALC,INVALC,0x517B,INVALC, + 0x5179,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5559,INVALC,0x5558,INVALC, + INVALC,0x555B,INVALC,INVALC,INVALC,INVALC,INVALC,0x555C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5836,0x5838,INVALC,INVALC,INVALC,INVALC,0x583B,INVALC, + 0x583A,0x5839,INVALC,INVALC,INVALC,0x5A60,0x5A5F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E42,INVALC,INVALC,INVALC,INVALC,0x6432,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3269,INVALC,0x3D57, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E36,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x267B,0x267C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,0x2E39,INVALC,INVALC,0x2E3B, + 0x2E3E,INVALC,0x2E37,0x2E3A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2E3D,INVALC,INVALC, + INVALC,0x656D,INVALC,0x656E,INVALC,INVALC,0x667C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x326C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x326D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x656F,INVALC,INVALC, + INVALC,INVALC,0x3762,INVALC,INVALC,INVALC,0x3763,0x375D, + INVALC,INVALC,INVALC,0x375F,INVALC,INVALC,INVALC,0x3761, + INVALC,0x3760,INVALC,0x6570,0x6571,INVALC,INVALC,INVALC, + 0x6572,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D5C, + INVALC,INVALC,INVALC,0x3D59,INVALC,INVALC,0x3D5D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D5A,INVALC, + 0x4331,INVALC,0x432D,INVALC,INVALC,0x432E,INVALC,INVALC, + INVALC,0x4337,0x4329,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4335,INVALC,0x432B,0x4330,INVALC,0x4334,INVALC,INVALC, + 0x432A,INVALC,0x4336,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x483E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x483F,0x4845, + INVALC,0x4844,INVALC,INVALC,INVALC,INVALC,INVALC,0x6573, + 0x4840,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D4A,INVALC,0x4D4D,INVALC,INVALC,INVALC,0x4D48,0x4D4C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D4B,0x4D49,INVALC,INVALC,0x5221,INVALC, + 0x6574,INVALC,INVALC,INVALC,0x5224,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5222,INVALC,INVALC,0x6575,INVALC, + 0x5560,0x5562,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5561,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 122, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5843,0x583E, + 0x5840,INVALC,0x583F,0x583C,INVALC,0x5842,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5844,INVALC,INVALC, + 0x5A61,INVALC,0x5A62,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A63,INVALC,0x6576,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E45,INVALC, + 0x5E43,INVALC,0x5E44,INVALC,INVALC,INVALC,INVALC,0x603C, + INVALC,INVALC,INVALC,INVALC,0x2433,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6577,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x326F,0x3270,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3272,INVALC,INVALC,INVALC,0x3D5E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3766,INVALC,0x3765,INVALC, + INVALC,0x3D5F,INVALC,INVALC,INVALC,0x3D64,0x3D62,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4338,INVALC, + 0x433D,INVALC,INVALC,0x4339,0x3D63,INVALC,0x6578,0x4848, + INVALC,0x4847,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6579,INVALC,INVALC,INVALC,0x4D50,0x4D51,0x4D4F, + INVALC,INVALC,INVALC,0x657A,INVALC,0x5226,INVALC,INVALC, + INVALC,0x5227,INVALC,INVALC,INVALC,INVALC,INVALC,0x5845, + INVALC,INVALC,INVALC,INVALC,INVALC,0x603D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x657B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A3E,0x2A3D,INVALC,0x2A3F,0x2A42, + INVALC,INVALC,0x2A44,INVALC,0x654C,INVALC,INVALC,INVALC, + 0x2E42,INVALC,INVALC,0x2E40,0x2E41,INVALC,INVALC,0x2E43, + INVALC,0x3274,0x3273,0x3279,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3276,0x327B,INVALC,INVALC,0x3277,INVALC,INVALC, + 0x3278,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x327C,0x3769,0x3767,0x376B,INVALC,0x376A,INVALC,INVALC, + INVALC,0x376C,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D65, + /* Block 123, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D66, + INVALC,0x3D69,INVALC,INVALC,INVALC,INVALC,0x3D68,0x4341, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4344,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6524,INVALC,INVALC, + INVALC,0x484B,0x484D,INVALC,0x4850,0x484F,INVALC,INVALC, + INVALC,INVALC,0x4852,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D55,INVALC,0x4D56,INVALC,INVALC,INVALC,0x4D5A,INVALC, + INVALC,0x4D53,0x4D57,INVALC,INVALC,0x522A,INVALC,INVALC, + INVALC,0x5564,INVALC,INVALC,INVALC,INVALC,INVALC,0x522C, + INVALC,INVALC,INVALC,0x5229,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A66,INVALC,0x5A65,INVALC, + INVALC,INVALC,0x5A67,INVALC,INVALC,INVALC,INVALC,0x5C64, + INVALC,INVALC,0x6076,0x6077,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2E44,0x2E47,INVALC,INVALC, + INVALC,INVALC,0x2E49,0x2E48,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3772,INVALC,0x3771,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3770,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4346,INVALC,INVALC,0x4347,INVALC,INVALC,0x657C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D5B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x522F,INVALC,0x522E,INVALC,INVALC, + INVALC,INVALC,0x5568,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E49,0x5E48,INVALC,INVALC,0x267E,0x2721,INVALC,0x2A47, + 0x2E4E,INVALC,0x2E4F,0x2E4D,0x2E4B,0x2E4C,INVALC,INVALC, + INVALC,INVALC,0x3323,0x3326,0x3327,0x3324,INVALC,INVALC, + INVALC,0x3773,0x3D71,INVALC,INVALC,INVALC,INVALC,0x3D70, + INVALC,0x4349,0x434A,INVALC,0x4854,INVALC,INVALC,INVALC, + 0x4855,0x5230,0x5569,0x556A,INVALC,0x5849,INVALC,INVALC, + 0x5F55,INVALC,INVALC,INVALC,0x2E51,INVALC,0x2E50,INVALC, + /* Block 124, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x332B,INVALC,0x332A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x332C,INVALC,0x3778,0x3779, + INVALC,INVALC,INVALC,INVALC,0x3777,INVALC,INVALC,0x377B, + INVALC,0x3776,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x632D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x377A,0x657D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D7B,0x3D78,0x3D75,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D79,INVALC,0x3D72,INVALC,0x3D76, + INVALC,0x657E,INVALC,INVALC,INVALC,INVALC,0x434F,INVALC, + INVALC,INVALC,0x434C,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4355,INVALC,INVALC,0x434D,0x3D77,INVALC,INVALC,0x4354, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4351,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4856,INVALC,0x4858,INVALC,INVALC,0x4860,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x485A,0x485E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4857,0x485D, + INVALC,INVALC,INVALC,0x485C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D5C,INVALC, + INVALC,INVALC,0x4D65,0x4D5D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D60, + INVALC,INVALC,0x6367,0x6366,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D63,INVALC,INVALC, + 0x6621,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5233,0x5234,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x556D,INVALC, + INVALC,INVALC,0x556B,INVALC,0x556E,INVALC,INVALC,INVALC, + /* Block 125, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5570,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5571,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x556F,INVALC,0x5850,0x584E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5851,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x584C,0x6622, + INVALC,INVALC,0x6623,INVALC,0x5A6F,0x5A6E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6624,INVALC,0x5C66,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C65,INVALC,INVALC,0x6625,INVALC, + INVALC,0x5E4C,INVALC,INVALC,INVALC,INVALC,0x5E4B,INVALC, + 0x5F58,INVALC,INVALC,INVALC,INVALC,0x5F57,0x603F,INVALC, + INVALC,INVALC,0x603E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6626,INVALC,INVALC,INVALC,INVALC,0x6144,INVALC,INVALC, + INVALC,0x623A,INVALC,INVALC,0x2A49,INVALC,0x2A48,0x2E52, + INVALC,INVALC,INVALC,0x2E54,0x2E53,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3331,INVALC,INVALC,0x332E,0x3330, + INVALC,INVALC,INVALC,0x3332,INVALC,INVALC,0x332D,INVALC, + INVALC,INVALC,INVALC,0x377D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x377E,0x3821,0x383E,0x3822,INVALC,INVALC,INVALC, + 0x3E21,INVALC,INVALC,INVALC,0x3E23,INVALC,0x3E22,0x3D7E, + INVALC,0x6627,INVALC,INVALC,INVALC,INVALC,0x4358,INVALC, + 0x435C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4862, + 0x4861,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D6F,0x4D71,0x4D6D,INVALC,0x4D70,0x4D73, + INVALC,0x4D72,INVALC,INVALC,INVALC,0x4D6E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5237,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5575,0x5574,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5239,INVALC,0x5855,INVALC,INVALC,0x5854,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6628,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6169,INVALC,0x6040,INVALC,INVALC, + INVALC,INVALC,0x2722,INVALC,0x2A4B,INVALC,INVALC,0x2A4A, + /* Block 126, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3337,0x333B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3829,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3826,INVALC,INVALC,0x3827, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x382E,0x3824,INVALC,INVALC,0x382B,0x3E34,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E29, + INVALC,0x3E26,0x3E2E,INVALC,INVALC,0x3E2F,INVALC,INVALC, + 0x3E28,INVALC,INVALC,INVALC,0x3E2C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E2A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E24,0x3E35,0x3E33,INVALC, + 0x4367,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E2B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4366, + INVALC,0x4369,0x4360,0x4362,INVALC,INVALC,INVALC,INVALC, + 0x435E,INVALC,INVALC,INVALC,INVALC,0x4364,INVALC,0x4368, + 0x436A,0x4363,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4874,INVALC,INVALC,INVALC, + 0x486D,INVALC,INVALC,0x486E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4870,INVALC,INVALC,0x4869,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4868,INVALC,INVALC,INVALC,INVALC,0x4871,INVALC,0x4873, + 0x6629,0x486B,INVALC,0x662B,INVALC,INVALC,0x4E22,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D7C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D78,INVALC,0x4E24,0x4E2F,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E2E,INVALC,0x4D77,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E2B,INVALC,INVALC, + 0x4D75,INVALC,INVALC,INVALC,0x4E28,0x4E29,0x4E25,0x4E2C, + /* Block 127, Array index 0x3100 */ + 0x4E27,0x4D7E,0x4D7D,INVALC,INVALC,INVALC,INVALC,0x662A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x523B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5240,0x523F, + INVALC,INVALC,INVALC,INVALC,0x5579,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x557A,INVALC,0x5859, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x585B,INVALC,0x5858,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x662C,INVALC,0x585A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A72,INVALC,0x5A74,INVALC, + INVALC,0x5A75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C6C, + INVALC,INVALC,INVALC,INVALC,0x5E53,0x5E50,INVALC,INVALC, + INVALC,0x5E51,INVALC,INVALC,INVALC,INVALC,0x5E52,INVALC, + INVALC,INVALC,0x5F5A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6235,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3831,INVALC,INVALC,INVALC,INVALC, + 0x662D,0x4877,INVALC,INVALC,INVALC,INVALC,0x557D,0x585C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F5B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2A4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x333C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4878, + INVALC,0x4879,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6422,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E5D, + INVALC,INVALC,INVALC,0x333D,INVALC,INVALC,INVALC,0x333F, + INVALC,0x333E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x436E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E31,INVALC, + INVALC,INVALC,INVALC,INVALC,0x585D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3342,INVALC,0x3343,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3E37,INVALC,INVALC,0x3E38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4372,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E32, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x557E,INVALC, + INVALC,INVALC,0x5861,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 129, Array index 0x3300 */ + INVALC,INVALC,0x667B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3836,INVALC,0x3344,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3837,INVALC,INVALC,0x3839,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4922,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5621,INVALC,INVALC,0x5862,0x5C6F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3349,0x3348,INVALC,INVALC,INVALC, + 0x3347,0x662F,INVALC,INVALC,0x383D,0x383C,INVALC,INVALC, + INVALC,0x383B,INVALC,INVALC,INVALC,INVALC,0x3E3C,INVALC, + INVALC,INVALC,INVALC,0x6729,INVALC,INVALC,INVALC,0x4373, + INVALC,0x6356,INVALC,0x4923,INVALC,INVALC,INVALC,0x4926, + 0x3E3B,0x4925,INVALC,0x6630,INVALC,0x4E34,0x4E36,INVALC, + 0x4E37,INVALC,0x4E35,0x4E38,INVALC,INVALC,0x5243,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5622,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C70,0x5C71,0x5C72,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2435,0x2436,INVALC, + INVALC,0x2724,INVALC,INVALC,0x2726,INVALC,INVALC,0x2725, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2723, + INVALC,INVALC,INVALC,INVALC,0x2A56,INVALC,0x2A5B,0x2A58, + 0x2A4F,INVALC,INVALC,INVALC,0x2A59,INVALC,INVALC,INVALC, + 0x2A52,INVALC,INVALC,0x2A54,INVALC,INVALC,0x2A57,INVALC, + INVALC,INVALC,INVALC,0x6631,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E66,INVALC, + INVALC,INVALC,INVALC,0x2E60,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2E61,0x2E5E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E65, + INVALC,INVALC,0x2E64,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x334C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x334A,0x3352, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x334B, + /* Block 130, Array index 0x3400 */ + INVALC,INVALC,INVALC,0x334E,0x334D,INVALC,INVALC,0x334F, + INVALC,0x2E63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E44,INVALC,INVALC,0x3849, + INVALC,INVALC,0x3847,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x632E,INVALC,0x3841,INVALC,INVALC,INVALC,0x3842,INVALC, + INVALC,0x3845,INVALC,INVALC,0x3848,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3E3E,INVALC,INVALC,INVALC,INVALC, + 0x3E43,0x3E45,0x3E41,INVALC,INVALC,0x3E3D,INVALC,INVALC, + 0x3E40,0x3E42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x437B,INVALC,0x437E, + INVALC,INVALC,INVALC,0x4375,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4376,INVALC,0x4377,0x4423,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x437C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4422,INVALC,INVALC, + INVALC,0x4927,INVALC,INVALC,0x492A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E3B,0x4E3D,0x4E39,INVALC,0x4E3C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5249,INVALC,INVALC,0x5247,INVALC,0x5244, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5623,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5624,INVALC,INVALC,INVALC,INVALC,INVALC,0x5865,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A77,INVALC,0x5A78,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E47, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E48,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 131, Array index 0x3500 */ + INVALC,INVALC,INVALC,0x3E49,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A5D,INVALC, + INVALC,INVALC,INVALC,0x492B,INVALC,INVALC,INVALC,INVALC, + 0x524A,0x5868,0x5A79,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2E68,INVALC,INVALC,0x3357, + INVALC,0x3358,INVALC,INVALC,INVALC,0x3355,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4426,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6634,INVALC,0x492D,INVALC,0x492E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A7A,INVALC,INVALC,0x5A7B,INVALC,INVALC, + INVALC,INVALC,0x5E55,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A7C,INVALC, + INVALC,INVALC,INVALC,0x2438,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2728,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2729,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x272B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2A60,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A6B,INVALC, + INVALC,INVALC,0x2A66,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2A6C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2A5E,INVALC,INVALC,INVALC, + INVALC,0x2A68,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2E76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2E6A,INVALC,INVALC,INVALC,INVALC,0x2E6B,INVALC,INVALC, + INVALC,INVALC,0x2E78,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2E72,INVALC,INVALC,INVALC,INVALC,0x2E74,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E69, + 0x2E6E,INVALC,INVALC,INVALC,0x2E6F,0x2E7A,INVALC,INVALC, + /* Block 132, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2E79,INVALC,INVALC,0x2E77,INVALC, + 0x6635,INVALC,0x6637,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3362,INVALC,INVALC,INVALC,INVALC,0x384D,INVALC,0x3359, + INVALC,0x335F,INVALC,0x385B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A5F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E57,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x335A, + 0x3363,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6636,0x2D33,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x384E,0x3851,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3854,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3850,INVALC,INVALC,INVALC,0x384F,0x385D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3855,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x385E,INVALC,INVALC,0x3857, + INVALC,0x3852,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3858,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x385F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E5E,INVALC,INVALC, + INVALC,INVALC,0x3E4F,0x3E59,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E4D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E5F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E4B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 133, Array index 0x3700 */ + 0x3E52,INVALC,0x3E5C,INVALC,INVALC,0x3E5A,INVALC,INVALC, + 0x3E50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E58,INVALC,0x3E5D,0x3E56, + 0x3E4E,INVALC,INVALC,INVALC,INVALC,INVALC,0x6639,0x3E5B, + INVALC,0x6638,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x442D,INVALC,INVALC,INVALC,0x4431,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x443A,INVALC, + INVALC,0x4435,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x442C,INVALC,0x443E,INVALC,INVALC,INVALC,INVALC,0x4427, + INVALC,INVALC,INVALC,0x4433,INVALC,0x443F,INVALC,INVALC, + 0x4440,INVALC,INVALC,INVALC,0x4432,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4438,INVALC,0x4430,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x443C,0x442F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x442E,INVALC,INVALC,INVALC,0x442A, + 0x4439,INVALC,INVALC,0x443B,0x4428,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4935,0x4944,INVALC,0x4933,0x4938,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x493C,INVALC,0x4939,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4942,INVALC,INVALC, + INVALC,INVALC,INVALC,0x493B,INVALC,0x493A,INVALC,0x4941, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4932,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4936,INVALC,INVALC,INVALC,INVALC, + 0x4436,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x493F,INVALC,INVALC, + 0x493E,INVALC,0x4943,INVALC,INVALC,INVALC,0x663B,INVALC, + INVALC,0x663C,0x663A,INVALC,0x493D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E4F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E44,INVALC,INVALC, + 0x4E42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 134, Array index 0x3800 */ + INVALC,0x4E40,INVALC,0x4E4C,0x4E46,0x4E54,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E4B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E4D,0x4E4E,0x4E52,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x525A, + INVALC,INVALC,0x5252,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5259,0x5250,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5258,INVALC,0x5254,INVALC,INVALC,0x5256, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x524F, + 0x5255,INVALC,INVALC,0x663D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x562B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5628,0x5629,INVALC,INVALC,INVALC,0x562D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x562C,0x5630,INVALC,INVALC,INVALC, + INVALC,INVALC,0x586C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x586E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x586F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x586B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x663E,INVALC,0x5A7E,INVALC, + INVALC,INVALC,INVALC,0x5A7D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B22, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C7B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B25,0x663F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C76,INVALC,INVALC,INVALC, + /* Block 135, Array index 0x3900 */ + INVALC,INVALC,0x5C78,0x5C7C,INVALC,INVALC,INVALC,INVALC, + 0x5D22,INVALC,INVALC,INVALC,INVALC,0x5C7E,INVALC,0x5D23, + 0x5C77,INVALC,INVALC,0x5D21,INVALC,0x5E5B,0x5E5A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E5C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E58,INVALC,INVALC,0x5E56,INVALC,INVALC,INVALC,0x5E57, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6640, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6043,INVALC,INVALC, + INVALC,0x602F,0x6146,INVALC,INVALC,0x6641,INVALC,INVALC, + INVALC,0x6147,0x617C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3863, + 0x3860,INVALC,0x3861,INVALC,INVALC,0x3E61,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x272D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6642,INVALC,INVALC,0x2F23,0x2E7C,INVALC, + 0x2E7E,INVALC,INVALC,INVALC,INVALC,0x2F24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3369,INVALC,INVALC,INVALC, + INVALC,0x336C,INVALC,INVALC,INVALC,INVALC,INVALC,0x336F, + INVALC,INVALC,0x336E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x336B,INVALC,INVALC,INVALC,0x336A, + 0x3370,INVALC,INVALC,INVALC,INVALC,INVALC,0x336D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3866,INVALC, + INVALC,INVALC,0x3864,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E62,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3E63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E68,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4444,0x4445,INVALC,0x4449, + /* Block 136, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4446,0x4448,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x494F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x494A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4945,INVALC, + INVALC,0x494C,INVALC,INVALC,INVALC,0x4949,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x494E,INVALC,0x494B, + INVALC,INVALC,0x6643,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E59,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x525B,0x525D,INVALC,INVALC,0x525F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5262,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x525E,INVALC,INVALC,INVALC,0x6645,INVALC,INVALC, + INVALC,0x6644,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x563A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5639,INVALC,INVALC,INVALC,INVALC,INVALC,0x563B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5636,0x5634,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B28,0x5876,INVALC, + INVALC,INVALC,0x5878,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5873,INVALC,INVALC,INVALC,INVALC,0x5874,INVALC, + 0x5875,INVALC,INVALC,INVALC,INVALC,0x6646,INVALC,INVALC, + 0x5B2C,INVALC,INVALC,INVALC,INVALC,0x5B27,INVALC,INVALC, + /* Block 137, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B29, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5877,0x5B2B, + INVALC,INVALC,0x5D25,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D24,INVALC,0x5E5D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F5F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6045,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6647,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2F26,INVALC,INVALC,0x386A,0x3E6A,0x3E69, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3371, + 0x6648,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x444D,INVALC,INVALC,INVALC,0x4E5F,INVALC,0x5263,0x5264, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2F27,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3374,INVALC, + INVALC,INVALC,INVALC,0x3377,INVALC,INVALC,INVALC,INVALC, + 0x3372,INVALC,0x3373,0x3375,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3376,INVALC,INVALC,0x6649, + INVALC,INVALC,0x3872,INVALC,INVALC,INVALC,INVALC,0x386E, + 0x3874,INVALC,INVALC,INVALC,0x386C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x386B,INVALC,INVALC,INVALC, + 0x3873,INVALC,INVALC,0x386D,INVALC,0x386F,0x3871,INVALC, + INVALC,0x3870,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E70,0x3E72,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3E6D,INVALC,INVALC,INVALC,0x3E6F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x444E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x444F,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E60,INVALC, + INVALC,0x4959,0x4952,INVALC,INVALC,0x4957,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4954,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4951, + /* Block 138, Array index 0x3C00 */ + 0x4956,INVALC,INVALC,0x4958,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E61, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E62,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5265,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5640,INVALC,INVALC,INVALC,INVALC,INVALC,0x563F, + 0x563D,INVALC,INVALC,0x5642,INVALC,INVALC,INVALC,INVALC, + 0x5879,INVALC,0x587A,INVALC,INVALC,0x587C,0x587B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x664A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D29,INVALC,0x5D28, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6149,INVALC,INVALC,INVALC,INVALC,0x617D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x664B,INVALC,INVALC,0x5B2F, + INVALC,0x6046,0x614A,INVALC,0x2F29,INVALC,INVALC,INVALC, + INVALC,0x3876,0x3875,INVALC,0x3877,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E74,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E65,INVALC,0x5266, + INVALC,0x4E64,INVALC,0x5646,INVALC,INVALC,INVALC,INVALC, + 0x587E,0x587D,INVALC,0x5921,INVALC,0x5B31,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D2A,0x5E61,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4454, + INVALC,INVALC,0x495C,INVALC,INVALC,INVALC,0x4E66,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B32,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 139, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x2F2A,0x2F2C,INVALC, + INVALC,INVALC,INVALC,0x337B,INVALC,0x337A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x337C,INVALC,INVALC,0x387E,INVALC,INVALC,INVALC, + 0x3923,0x3929,INVALC,INVALC,INVALC,INVALC,0x3879,INVALC, + 0x387B,0x3925,INVALC,0x3922,INVALC,INVALC,0x6330,INVALC, + INVALC,INVALC,0x387A,INVALC,INVALC,0x3E7C,INVALC,INVALC, + 0x3E7D,INVALC,INVALC,INVALC,INVALC,0x3F24,INVALC,INVALC, + INVALC,INVALC,0x3E7E,0x3E75,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F21,INVALC,0x3F23,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E78,INVALC,INVALC,0x3F22,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4460,0x4459,INVALC,0x4463, + INVALC,INVALC,0x4455,INVALC,INVALC,INVALC,INVALC,0x4458, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x445B,INVALC,INVALC,INVALC,INVALC,0x445C,0x4461,INVALC, + 0x4456,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x445D,INVALC,INVALC,INVALC,INVALC,INVALC,0x495F,INVALC, + 0x4964,INVALC,INVALC,INVALC,0x4963,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x495E,0x4962,0x496B,INVALC,0x4968, + INVALC,INVALC,0x4960,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4965,INVALC,INVALC,0x4966,INVALC,INVALC,0x4E74, + INVALC,0x4E67,INVALC,0x4E72,0x4E70,0x4E6E,INVALC,0x4E6C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E75,INVALC,0x4E69,INVALC,0x4E6A,INVALC, + 0x4E76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x526A,INVALC,0x526B,INVALC,INVALC, + INVALC,0x4E6F,0x5267,INVALC,0x526E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5269,INVALC,INVALC,INVALC,0x5268,INVALC,INVALC, + /* Block 140, Array index 0x3E00 */ + INVALC,INVALC,INVALC,0x664C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5649,INVALC,INVALC,0x564A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5648, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x592A,INVALC,INVALC,INVALC,0x5926,INVALC,INVALC, + INVALC,INVALC,0x5924,INVALC,0x5928,INVALC,INVALC,INVALC, + 0x5923,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B34, + INVALC,INVALC,INVALC,0x5B35,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B36,0x5D33,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D30,0x5D2C,INVALC,0x5D32,INVALC,INVALC,INVALC, + INVALC,0x5D2B,INVALC,INVALC,INVALC,INVALC,0x5D2E,INVALC, + INVALC,0x5C6D,INVALC,0x642D,INVALC,0x5E62,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E63,INVALC,INVALC,INVALC, + INVALC,0x5F61,INVALC,0x5F62,INVALC,INVALC,INVALC,0x6048, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6047,INVALC,INVALC, + 0x6049,0x607B,INVALC,INVALC,INVALC,INVALC,INVALC,0x614B, + INVALC,INVALC,INVALC,0x616B,INVALC,0x617E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x392A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x564D,INVALC,INVALC,INVALC,0x5F64,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D34,0x664D,0x6221,INVALC,INVALC,INVALC,INVALC, + 0x392D,INVALC,INVALC,0x392C,INVALC,INVALC,0x3F2A,INVALC, + 0x3F29,INVALC,INVALC,0x4464,INVALC,INVALC,INVALC,0x496D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x592B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x392E,INVALC,0x3F2C,0x3F2B, + INVALC,INVALC,INVALC,0x3F2D,INVALC,INVALC,INVALC,0x634A, + 0x4465,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E7A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x564F,INVALC, + INVALC,INVALC,INVALC,0x614D,INVALC,INVALC,INVALC,0x2F2E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3930,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3932,0x3931,INVALC, + INVALC,0x3F2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4469,INVALC,INVALC,INVALC,0x4467,INVALC,INVALC, + 0x4970,INVALC,INVALC,INVALC,0x4972,INVALC,0x4971,INVALC, + 0x664E,INVALC,INVALC,0x4E7E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E7D,INVALC,0x4F22,INVALC,INVALC,INVALC,0x5275, + INVALC,INVALC,0x5273,INVALC,INVALC,INVALC,0x5651,0x5652, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 142, Array index 0x4000 */ + INVALC,INVALC,INVALC,0x592E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B38,0x664F,INVALC,0x6428,INVALC, + INVALC,0x5E65,0x5E66,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6650,INVALC,0x604A,INVALC,0x614E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3933,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x243A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3939,INVALC,0x3937,INVALC,0x3935,0x3938, + INVALC,INVALC,0x3F39,0x3F34,INVALC,INVALC,0x3F37,0x3F30, + 0x3F33,INVALC,INVALC,0x3F38,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4975, + 0x4973,INVALC,0x4974,INVALC,INVALC,0x4F26,INVALC,INVALC, + INVALC,INVALC,0x4F25,INVALC,0x4F23,INVALC,0x5277,INVALC, + INVALC,0x5931,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6651,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x393E,INVALC,0x393A,INVALC,INVALC, + 0x393D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F3F,0x3F3A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F3B,INVALC,0x3F3E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x446B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 143, Array index 0x4100 */ + INVALC,0x497B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x497A,INVALC,INVALC,0x4979,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F2C,INVALC,0x4F2B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x527E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x527B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x527C,INVALC,INVALC,0x5654,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5655, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5932,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B3A,INVALC,INVALC,0x5B39,INVALC,INVALC,INVALC,INVALC, + 0x5B3B,INVALC,INVALC,INVALC,INVALC,0x5B3C,INVALC,0x5B3D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D37,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x604B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6150,INVALC,INVALC,INVALC,INVALC,0x616C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x393F,INVALC,0x3940, + 0x3F40,0x4473,INVALC,0x497D,0x497C,INVALC,0x4F30,0x4F32, + 0x4F2F,0x4F31,INVALC,INVALC,0x6652,INVALC,INVALC,0x5935, + INVALC,0x5936,INVALC,0x5B3F,INVALC,INVALC,0x5D38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6653,0x3941,INVALC, + INVALC,0x3947,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F45,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F47,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F44,0x3F46,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F49,INVALC,INVALC, + /* Block 144, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,0x4476,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F33,INVALC,INVALC,INVALC,INVALC,0x4F35, + INVALC,INVALC,INVALC,0x4F34,INVALC,0x5324,INVALC,INVALC, + 0x5322,0x5321,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5325,0x5659,INVALC,INVALC, + INVALC,0x565A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5937,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E67,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6222,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F4B,0x4477,INVALC, + 0x4478,0x4A21,0x4A22,INVALC,0x4F37,0x5327,INVALC,0x5326, + INVALC,INVALC,0x6654,INVALC,0x5938,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F39,INVALC,0x272F,INVALC,INVALC, + INVALC,0x243B,INVALC,INVALC,INVALC,INVALC,0x2730,INVALC, + INVALC,0x2733,INVALC,INVALC,INVALC,INVALC,INVALC,0x2731, + INVALC,INVALC,0x2A72,INVALC,0x2A70,INVALC,INVALC,0x2A74, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2A73,0x2A71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2F31, + INVALC,0x2F32,INVALC,INVALC,INVALC,INVALC,INVALC,0x2F33, + INVALC,0x2F30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3425,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 145, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3427,0x3426,INVALC,INVALC,INVALC,INVALC,0x394B,INVALC, + INVALC,INVALC,0x394A,0x394E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x394C,INVALC,INVALC, + 0x3F4F,0x3F50,0x3F4D,0x3F4C,0x3F51,INVALC,INVALC,INVALC, + 0x3F55,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F56, + INVALC,INVALC,0x3F54,0x3F57,INVALC,INVALC,INVALC,INVALC, + 0x447D,INVALC,INVALC,0x4479,INVALC,0x447C,0x447A,INVALC, + 0x447B,INVALC,INVALC,INVALC,0x447E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A24,INVALC,INVALC,INVALC,INVALC,0x4A27, + INVALC,0x4A26,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F3C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F3B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x593A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x225E,0x225D,INVALC,INVALC,0x243C,INVALC, + INVALC,INVALC,0x243D,INVALC,0x6655,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2735,INVALC,INVALC,INVALC, + 0x2739,0x2734,INVALC,0x3951,INVALC,0x2A77,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A75, + INVALC,0x2A78,INVALC,INVALC,0x2F35,INVALC,INVALC,INVALC, + 0x2F38,INVALC,0x2F34,INVALC,0x2F3E,INVALC,0x2F37,INVALC, + INVALC,0x2F3C,INVALC,INVALC,INVALC,0x2F3B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3429,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x394F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x636C,0x3952, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 146, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F59,INVALC,0x4523,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4524,INVALC,0x4525,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A2A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x532B, + INVALC,INVALC,INVALC,INVALC,0x593C,0x593B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x342A,INVALC,INVALC,0x3955,INVALC,INVALC,INVALC, + INVALC,0x3954,INVALC,INVALC,0x6657,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4528, + INVALC,INVALC,INVALC,0x4527,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A2C,INVALC, + INVALC,INVALC,INVALC,0x4A2B,0x4A2D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F3F,INVALC,INVALC,INVALC,0x4F40,INVALC,0x532D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x532C,0x532F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x593D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E68,INVALC,INVALC,INVALC,0x607E, + INVALC,INVALC,INVALC,INVALC,0x616D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3430,INVALC, + INVALC,INVALC,INVALC,0x342D,INVALC,INVALC,0x342F,0x342E, + 0x3431,INVALC,INVALC,INVALC,INVALC,0x3958,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3957,INVALC,0x3956,INVALC,INVALC,INVALC,0x3959,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F5D,INVALC, + /* Block 147, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F66,INVALC,INVALC,0x3F60,INVALC,INVALC,0x3F68,INVALC, + INVALC,INVALC,INVALC,0x3F69,INVALC,INVALC,INVALC,INVALC, + 0x3F62,INVALC,INVALC,0x3F65,INVALC,INVALC,INVALC,INVALC, + 0x3F5E,0x6659,0x3F63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6658,INVALC,INVALC,INVALC,0x452E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x452B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4537,0x452F,INVALC,INVALC,INVALC, + INVALC,0x4539,INVALC,INVALC,0x4538,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x452A,INVALC,INVALC, + INVALC,0x452D,INVALC,INVALC,0x4531,0x4529,INVALC,0x4534, + INVALC,INVALC,0x4533,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4532,0x4535,INVALC,INVALC,0x4536,INVALC, + INVALC,INVALC,INVALC,0x665A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A34,INVALC,INVALC,0x4A35,INVALC,INVALC,INVALC, + INVALC,0x4A2F,INVALC,INVALC,INVALC,INVALC,INVALC,0x4530, + 0x4A38,INVALC,0x4A33,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A39,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A32,0x4A37,INVALC, + 0x672A,0x4A31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F42,0x4F50,INVALC,INVALC,INVALC,INVALC,0x4F43,0x4F41, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F48,INVALC,0x4F49,INVALC, + INVALC,INVALC,0x4F4B,0x4F4E,0x4F44,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F51,INVALC,INVALC,0x4F45,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F52,INVALC,0x4F4C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F4D,0x665B,0x665C,0x4A30,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5335,INVALC,INVALC, + /* Block 148, Array index 0x4600 */ + INVALC,INVALC,INVALC,0x533D,INVALC,0x533E,INVALC,0x5338, + INVALC,INVALC,0x5332,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5336, + INVALC,INVALC,INVALC,INVALC,0x5337,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x533B,INVALC,INVALC,INVALC, + 0x533C,0x5339,0x533A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x665D, + INVALC,INVALC,0x665E,INVALC,INVALC,0x5331,INVALC,INVALC, + 0x5665,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5666,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x565D,INVALC,0x5667, + INVALC,INVALC,0x5664,INVALC,INVALC,INVALC,0x565B,INVALC, + 0x5668,0x565E,INVALC,0x566B,INVALC,INVALC,0x5661,INVALC, + INVALC,INVALC,0x5662,0x5663,0x565F,INVALC,INVALC,INVALC, + 0x565C,INVALC,INVALC,INVALC,INVALC,0x5660,INVALC,0x566A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x665F,INVALC, + INVALC,INVALC,INVALC,0x5943,INVALC,INVALC,INVALC,INVALC, + 0x5940,INVALC,INVALC,0x5942,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5949,INVALC,INVALC,INVALC, + 0x593E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5944,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5946,INVALC,INVALC,0x5945,0x6661,0x6662,0x6660,INVALC, + INVALC,0x5B50,INVALC,INVALC,INVALC,0x5B44,0x5B45,INVALC, + INVALC,INVALC,INVALC,0x5B43,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B48,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B4D,INVALC,INVALC,INVALC,INVALC, + 0x5B4F,INVALC,INVALC,INVALC,INVALC,0x5B4A,INVALC,INVALC, + INVALC,0x5B41,0x5B42,0x5B4E,INVALC,0x5B47,INVALC,0x6665, + INVALC,0x6663,0x6664,0x5D41,0x5E6A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 149, Array index 0x4700 */ + INVALC,INVALC,0x5D43,INVALC,0x5D3C,0x5D3F,INVALC,INVALC, + 0x5D3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D3D, + INVALC,INVALC,0x5D44,0x5D45,0x5D47,INVALC,0x5D42,0x5D3A, + INVALC,INVALC,0x6666,0x6667,0x6668,INVALC,INVALC,0x5D46, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E6D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F69,0x5F6E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F6A,0x5F6C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F6B,INVALC,0x6052,INVALC, + 0x6431,INVALC,0x6055,0x6054,0x6056,INVALC,INVALC,0x604F, + INVALC,0x6053,INVALC,INVALC,INVALC,0x6057,0x666A,0x6669, + INVALC,INVALC,INVALC,INVALC,0x6122,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x616F,0x6223,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6236,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6323,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2F40,INVALC,INVALC,INVALC,0x3432,INVALC,0x395C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F6C,INVALC,0x666B, + INVALC,0x453C,0x453A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A3D,INVALC,INVALC,INVALC,INVALC,0x4A3E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F53, + INVALC,INVALC,0x4F55,0x4F56,INVALC,INVALC,INVALC,INVALC, + 0x5342,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5344,0x5340,INVALC,0x566D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x666C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x594B, + 0x594A,INVALC,INVALC,INVALC,INVALC,0x5B53,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x666D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2143,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x273B,0x273A, + INVALC,0x273F,INVALC,0x273C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x273D,0x273E,INVALC,INVALC,0x2A79, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A7C,INVALC, + INVALC,0x2A7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3436,INVALC, + INVALC,0x3434,0x395E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3433,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3961,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3965,INVALC,0x3F71,INVALC,INVALC,INVALC,0x3F72, + INVALC,0x3F73,0x3F75,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F70,INVALC,INVALC,0x4540, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4542,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A45,INVALC,0x4A46, + 0x4A44,INVALC,INVALC,0x4F5A,INVALC,0x4F5B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5348,INVALC,0x5670,INVALC,0x566F, + INVALC,INVALC,0x5671,INVALC,INVALC,0x5D49,0x2A7D,0x5349, + INVALC,INVALC,0x6325,INVALC,INVALC,0x3439,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A47,0x4A49,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E70,INVALC,0x6125,0x622F, + INVALC,INVALC,INVALC,INVALC,0x3F7E,0x3F7C,0x3F7B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4546,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4547,INVALC,INVALC,INVALC, + /* Block 152, Array index 0x4A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F60,INVALC,0x5350,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x534D,0x534C,INVALC,0x5351, + INVALC,INVALC,0x5674,0x5675,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D4F,INVALC,0x5D4C,0x5D4E,INVALC,0x5E72,0x5E71, + INVALC,INVALC,INVALC,0x666E,0x5F71,INVALC,INVALC,INVALC, + 0x5F72,0x6059,INVALC,INVALC,INVALC,0x6126,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x666F,INVALC,INVALC, + 0x6245,0x2A7E,INVALC,INVALC,INVALC,0x4549,INVALC,INVALC, + INVALC,0x4A4C,INVALC,INVALC,INVALC,0x594F,INVALC,0x4021, + INVALC,INVALC,INVALC,0x2B21,0x4A4E,INVALC,INVALC,0x5E73, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4024,INVALC,0x4022, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x454B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F62, + INVALC,0x4F63,INVALC,INVALC,0x4F64,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5353,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x567A,INVALC,INVALC,INVALC,0x567B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5950,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B5F,0x5B5D,INVALC,0x5B5E,0x5B60,INVALC,INVALC, + 0x5D50,INVALC,0x5D51,INVALC,INVALC,0x5E75,0x5E74,INVALC, + 0x5F73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6128,INVALC,0x623B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5355,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5951,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E76,INVALC,0x6129,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x454F,0x4F65, + INVALC,INVALC,0x5B61,INVALC,INVALC,0x4550,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D53,INVALC,INVALC,INVALC, + /* Block 153, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4552,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A54,0x4A55,INVALC,INVALC, + INVALC,0x4A52,0x4A56,INVALC,INVALC,INVALC,INVALC,0x4F69, + INVALC,INVALC,0x4F67,0x636E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F66,INVALC,INVALC,INVALC,0x535C,INVALC, + INVALC,0x5359,INVALC,0x535A,0x5228,INVALC,0x5358,INVALC, + INVALC,INVALC,0x535D,INVALC,0x535B,0x535F,INVALC,0x595B, + 0x5726,INVALC,0x637B,INVALC,INVALC,INVALC,INVALC,0x5728, + INVALC,INVALC,INVALC,0x5959,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5956,0x5958,0x5B65,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x642A,INVALC,INVALC,INVALC,INVALC,0x5E78,INVALC, + 0x5E77,INVALC,INVALC,INVALC,0x605D,0x605E,0x605C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5361,INVALC,0x572A, + INVALC,0x595C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D56,INVALC,INVALC,INVALC,0x5E7B, + 0x5E79,INVALC,0x5E7A,INVALC,INVALC,0x6225,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E7C,0x6226,INVALC,INVALC, + INVALC,0x3967,INVALC,INVALC,0x6670,INVALC,0x3968,INVALC, + INVALC,INVALC,INVALC,INVALC,0x455B,INVALC,INVALC,INVALC, + 0x402B,0x455C,INVALC,0x4554,INVALC,0x4559,INVALC,0x4557, + 0x4A5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4558, + /* Block 154, Array index 0x4C00 */ + INVALC,0x4A5E,INVALC,INVALC,INVALC,INVALC,0x4A5B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x667A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F6B,INVALC,INVALC,0x5365,0x5366,INVALC,INVALC, + 0x5364,INVALC,0x5362,0x5363,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5962,INVALC, + 0x5961,0x5966,INVALC,0x5965,INVALC,INVALC,INVALC,INVALC, + 0x5963,INVALC,0x6671,INVALC,0x5B69,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D58,INVALC,0x5E7E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F78,INVALC,INVALC,0x612A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x455F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5368,INVALC,0x5730,INVALC,0x5967,INVALC,INVALC,INVALC, + INVALC,0x5F21,0x6060,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A63,0x4A62, + 0x4A66,INVALC,INVALC,INVALC,0x4A61,INVALC,0x4A60,0x4A6C, + 0x4A64,INVALC,INVALC,INVALC,0x4A6A,INVALC,INVALC,INVALC, + 0x4F73,INVALC,0x4F6D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F6E,INVALC,INVALC,INVALC,0x4F72,INVALC, + 0x4F74,0x5370,INVALC,INVALC,INVALC,INVALC,0x5371,INVALC, + 0x536B,INVALC,INVALC,0x536C,INVALC,INVALC,INVALC,0x536A, + INVALC,INVALC,INVALC,0x5734,INVALC,0x5737,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 155, Array index 0x4D00 */ + 0x5733,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x596A,INVALC,INVALC,INVALC,0x596B,INVALC,INVALC,INVALC, + 0x596D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B6F, + 0x5B6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B6C, + INVALC,0x5B6E,INVALC,INVALC,INVALC,INVALC,0x5B6B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D5A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5F24,0x5F22,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6062,INVALC,INVALC,INVALC,0x6061,INVALC,INVALC,INVALC, + INVALC,0x6172,INVALC,0x6173,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x402F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F77,0x4F76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x573A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D61,INVALC,INVALC,INVALC, + 0x5D60,0x5D5E,INVALC,INVALC,INVALC,INVALC,0x5F25,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6174, + INVALC,0x6334,0x4A6E,INVALC,INVALC,0x5F7B,0x6063,INVALC, + 0x4032,INVALC,0x4561,INVALC,0x4A6F,0x4A73,INVALC,INVALC, + 0x4A71,0x4A70,0x4A72,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F79,0x5375,INVALC,INVALC, + 0x5374,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 156, Array index 0x4E00 */ + 0x573B,INVALC,0x573C,INVALC,INVALC,INVALC,INVALC,0x596F, + INVALC,0x5B71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F27,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6672,INVALC,INVALC, + INVALC,0x612C,INVALC,INVALC,INVALC,INVALC,0x4A75,INVALC, + INVALC,INVALC,0x5D62,INVALC,0x612E,0x6433,INVALC,INVALC, + 0x6228,INVALC,INVALC,INVALC,0x573E,INVALC,INVALC,INVALC, + 0x5D63,INVALC,INVALC,INVALC,INVALC,0x4562,INVALC,INVALC, + 0x4A78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x573F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D64,INVALC,INVALC,0x5F28,INVALC,INVALC,INVALC,0x612F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4563,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F7E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F7C,INVALC,0x4F7B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F7D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5378,0x537A,INVALC,INVALC,INVALC, + INVALC,0x5423,INVALC,0x537C,0x5421,INVALC,0x5425,0x537D, + INVALC,INVALC,INVALC,INVALC,0x5379,INVALC,INVALC,INVALC, + 0x6673,0x5744,INVALC,INVALC,INVALC,0x5745,INVALC,0x5740, + INVALC,INVALC,INVALC,0x5742,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5974,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5973,INVALC,INVALC,0x5B74,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5976,0x5975,0x5743,INVALC,INVALC, + INVALC,INVALC,0x5971,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B75, + INVALC,INVALC,INVALC,0x5B77,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B79,INVALC,INVALC,INVALC,INVALC,0x5B7A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D6F,INVALC, + INVALC,0x5D71,INVALC,0x5D67,0x5D69,INVALC,0x5D6A,0x5D74, + /* Block 157, Array index 0x4F00 */ + 0x5D75,INVALC,0x5D6E,INVALC,0x5D68,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D66,INVALC,0x5D76,INVALC,INVALC,INVALC, + 0x5D73,INVALC,INVALC,INVALC,INVALC,0x5D72,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D70,INVALC,INVALC,INVALC,0x5F2C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x642F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F2A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6025,INVALC,INVALC, + 0x5F7E,INVALC,0x6023,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6022,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6065, + INVALC,0x6066,INVALC,0x6068,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6132,INVALC,INVALC, + INVALC,0x6133,INVALC,INVALC,INVALC,0x6134,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6159,INVALC,INVALC,0x615B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6175,INVALC, + INVALC,INVALC,INVALC,0x6241,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4564,INVALC,INVALC,0x4566,0x2F42,INVALC,0x4568,0x4567, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5027,INVALC,INVALC,INVALC,INVALC,INVALC,0x502A,INVALC, + /* Block 158, Array index 0x5000 */ + INVALC,0x5024,0x502B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x542D,INVALC,0x5025,0x5022,INVALC,0x542A, + INVALC,INVALC,INVALC,0x542C,INVALC,INVALC,0x5436,INVALC, + INVALC,INVALC,0x5433,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5437,INVALC,INVALC,0x5429,INVALC,INVALC,0x5435, + INVALC,INVALC,0x5432,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x574D,INVALC,INVALC, + INVALC,0x5748,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x574A,INVALC,INVALC,INVALC, + INVALC,0x6675,INVALC,INVALC,INVALC,0x5979,0x597B,INVALC, + 0x597D,INVALC,INVALC,INVALC,INVALC,0x597E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A22,INVALC, + INVALC,INVALC,INVALC,0x597A,INVALC,INVALC,0x5B7D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C27,0x5C22,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C25,INVALC, + INVALC,INVALC,0x5B7E,INVALC,INVALC,INVALC,0x5C26,INVALC, + INVALC,INVALC,INVALC,0x5C24,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C23,INVALC,INVALC,INVALC,0x5D79,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D7A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F35,INVALC, + 0x5F31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F32,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F36,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x606C,INVALC,INVALC,INVALC, + /* Block 159, Array index 0x5100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6135,INVALC,INVALC,INVALC,INVALC,INVALC,0x615D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6229,INVALC, + 0x6230,INVALC,INVALC,INVALC,0x6238,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5F37,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4569,INVALC,INVALC,0x502C,0x5439,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A24,INVALC,INVALC,INVALC,INVALC,0x5C29,INVALC,INVALC, + 0x5E21,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F3A,INVALC, + INVALC,INVALC,0x6231,0x623F,INVALC,INVALC,0x2547,INVALC, + INVALC,INVALC,0x502F,0x502E,0x543A,INVALC,INVALC,0x5750, + INVALC,0x5A26,0x5A25,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B22,INVALC,INVALC, + INVALC,0x5E22,INVALC,INVALC,0x396A,0x543C,0x543B,INVALC, + INVALC,INVALC,0x5A28,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x396B,INVALC,INVALC,INVALC,INVALC,0x543D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C2A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6029,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2772,INVALC, + /* Block 160, Array index 0x5200 */ + INVALC,INVALC,0x5A29,0x5C2D,0x5C2E,0x5F3C,INVALC,INVALC, + 0x615F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x456A,INVALC,INVALC,0x5C30, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6160,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A2B,0x5A2A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x606D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x613B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2370,INVALC,INVALC,0x543E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E24,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6233,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5755,INVALC, + INVALC,INVALC,INVALC,0x602B,INVALC,INVALC,INVALC,0x6242, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E47,INVALC,INVALC, + INVALC,0x5F3F,INVALC,0x6161,INVALC,0x6177,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_CNS11643_PLANE14 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> cns11643_plane14 size-optimized table (16576 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_cns11643_plane14[] = +{ + 0x00C5, /* Ranges number */ + 0x0D04, /* Unranged codes number */ + 0x0658, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x4E20, 0x4E24, 0x0252, + /* Array index: 0x0006 */ 0x4EAF, 0x4EB2, 0x0257, + /* Array index: 0x0009 */ 0x4EF8, 0x4EFC, 0x025B, + /* Array index: 0x000C */ 0x4F9F, 0x4FA3, 0x0260, + /* Array index: 0x000F */ 0x4FF9, 0x5004, 0x0265, + /* Array index: 0x0012 */ 0x5078, 0x507C, 0x0271, + /* Array index: 0x0015 */ 0x50DE, 0x50E2, 0x0276, + /* Array index: 0x0018 */ 0x510D, 0x510F, 0x027B, + /* Array index: 0x001B */ 0x5182, 0x5186, 0x027E, + /* Array index: 0x001E */ 0x51B2, 0x51B5, 0x0283, + /* Array index: 0x0021 */ 0x51C1, 0x51C3, 0x0287, + /* Array index: 0x0024 */ 0x51CF, 0x51D3, 0x028A, + /* Array index: 0x0027 */ 0x51D9, 0x51DB, 0x028F, + /* Array index: 0x002A */ 0x51E2, 0x51E5, 0x0292, + /* Array index: 0x002D */ 0x5263, 0x5268, 0x0296, + /* Array index: 0x0030 */ 0x529A, 0x529E, 0x029C, + /* Array index: 0x0033 */ 0x52B3, 0x52B5, 0x02A1, + /* Array index: 0x0036 */ 0x52CC, 0x52D1, 0x02A4, + /* Array index: 0x0039 */ 0x5332, 0x533B, 0x02AA, + /* Array index: 0x003C */ 0x53A6, 0x53AB, 0x02B4, + /* Array index: 0x003F */ 0x53C1, 0x53C5, 0x02BA, + /* Array index: 0x0042 */ 0x53D9, 0x53DD, 0x02BF, + /* Array index: 0x0045 */ 0x5421, 0x5423, 0x02C4, + /* Array index: 0x0048 */ 0x5449, 0x5451, 0x02C7, + /* Array index: 0x004B */ 0x54CA, 0x54CD, 0x02D0, + /* Array index: 0x004E */ 0x54F4, 0x54F6, 0x02D4, + /* Array index: 0x0051 */ 0x5558, 0x555A, 0x02D7, + /* Array index: 0x0054 */ 0x5571, 0x5573, 0x02DA, + /* Array index: 0x0057 */ 0x564D, 0x5656, 0x02DD, + /* Array index: 0x005A */ 0x569E, 0x56A0, 0x02E7, + /* Array index: 0x005D */ 0x56B8, 0x56BB, 0x02EA, + /* Array index: 0x0060 */ 0x56EF, 0x56F3, 0x02EE, + /* Array index: 0x0063 */ 0x56FB, 0x56FD, 0x02F3, + /* Array index: 0x0066 */ 0x5742, 0x5748, 0x02F6, + /* Array index: 0x0069 */ 0x5753, 0x5759, 0x02FD, + /* Array index: 0x006C */ 0x578D, 0x5792, 0x0304, + /* Array index: 0x006F */ 0x57A6, 0x57A8, 0x030A, + /* Array index: 0x0072 */ 0x57C4, 0x57CA, 0x030D, + /* Array index: 0x0075 */ 0x585F, 0x5861, 0x0314, + /* Array index: 0x0078 */ 0x5866, 0x586C, 0x0317, + /* Array index: 0x007B */ 0x5895, 0x5897, 0x031E, + /* Array index: 0x007E */ 0x58EE, 0x58F7, 0x0321, + /* Array index: 0x0081 */ 0x5900, 0x590B, 0x032B, + /* Array index: 0x0084 */ 0x594B, 0x594D, 0x0337, + /* Array index: 0x0087 */ 0x599A, 0x599C, 0x033A, + /* Array index: 0x008A */ 0x5A2A, 0x5A2C, 0x033D, + /* Array index: 0x008D */ 0x5A7E, 0x5A89, 0x0340, + /* Array index: 0x0090 */ 0x5AA0, 0x5AA4, 0x034C, + /* Array index: 0x0093 */ 0x5ACE, 0x5AD3, 0x0351, + /* Array index: 0x0096 */ 0x5B37, 0x5B3B, 0x0357, + /* Array index: 0x0099 */ 0x5B9D, 0x5B9F, 0x035C, + /* Array index: 0x009C */ 0x5BDA, 0x5BDD, 0x035F, + /* Array index: 0x009F */ 0x5BFD, 0x5C00, 0x0363, + /* Array index: 0x00A2 */ 0x5CB9, 0x5CBB, 0x0367, + /* Array index: 0x00A5 */ 0x5D08, 0x5D0A, 0x036A, + /* Array index: 0x00A8 */ 0x5D8B, 0x5D91, 0x036D, + /* Array index: 0x00AB */ 0x5DA3, 0x5DA6, 0x0374, + /* Array index: 0x00AE */ 0x5E2C, 0x5E32, 0x0378, + /* Array index: 0x00B1 */ 0x5E46, 0x5E48, 0x037F, + /* Array index: 0x00B4 */ 0x5EF8, 0x5EFD, 0x0382, + /* Array index: 0x00B7 */ 0x5F0C, 0x5F0E, 0x0388, + /* Array index: 0x00BA */ 0x5F39, 0x5F3B, 0x038B, + /* Array index: 0x00BD */ 0x5F50, 0x5F55, 0x038E, + /* Array index: 0x00C0 */ 0x5F8D, 0x5F8F, 0x0394, + /* Array index: 0x00C3 */ 0x5FDA, 0x5FDC, 0x0397, + /* Array index: 0x00C6 */ 0x604E, 0x6052, 0x039A, + /* Array index: 0x00C9 */ 0x6073, 0x6075, 0x039F, + /* Array index: 0x00CC */ 0x60A6, 0x60AA, 0x03A2, + /* Array index: 0x00CF */ 0x611E, 0x6122, 0x03A7, + /* Array index: 0x00D2 */ 0x6185, 0x6188, 0x03AC, + /* Array index: 0x00D5 */ 0x6195, 0x6199, 0x03B0, + /* Array index: 0x00D8 */ 0x61CE, 0x61D0, 0x03B5, + /* Array index: 0x00DB */ 0x61D9, 0x61DD, 0x03B8, + /* Array index: 0x00DE */ 0x6235, 0x623C, 0x03BD, + /* Array index: 0x00E1 */ 0x6299, 0x629E, 0x03C5, + /* Array index: 0x00E4 */ 0x62A3, 0x62A7, 0x03CB, + /* Array index: 0x00E7 */ 0x62DD, 0x62E1, 0x03D0, + /* Array index: 0x00EA */ 0x635B, 0x635D, 0x03D5, + /* Array index: 0x00ED */ 0x6438, 0x643C, 0x03D8, + /* Array index: 0x00F0 */ 0x6455, 0x6457, 0x03DD, + /* Array index: 0x00F3 */ 0x655F, 0x6561, 0x03E0, + /* Array index: 0x00F6 */ 0x656D, 0x6571, 0x03E3, + /* Array index: 0x00F9 */ 0x6617, 0x661B, 0x03E8, + /* Array index: 0x00FC */ 0x66A4, 0x66A6, 0x03ED, + /* Array index: 0x00FF */ 0x66CD, 0x66D7, 0x03F0, + /* Array index: 0x0102 */ 0x67A2, 0x67A4, 0x03FB, + /* Array index: 0x0105 */ 0x67D5, 0x67D7, 0x03FE, + /* Array index: 0x0108 */ 0x6822, 0x6824, 0x0401, + /* Array index: 0x010B */ 0x6855, 0x685A, 0x0404, + /* Array index: 0x010E */ 0x6898, 0x689A, 0x040A, + /* Array index: 0x0111 */ 0x68B6, 0x68B9, 0x040D, + /* Array index: 0x0114 */ 0x68FE, 0x6903, 0x0411, + /* Array index: 0x0117 */ 0x6A29, 0x6A2D, 0x0417, + /* Array index: 0x011A */ 0x6AB0, 0x6AB2, 0x041C, + /* Array index: 0x011D */ 0x6ABC, 0x6AC1, 0x041F, + /* Array index: 0x0120 */ 0x6AD4, 0x6AD8, 0x0425, + /* Array index: 0x0123 */ 0x6AFD, 0x6B01, 0x042A, + /* Array index: 0x0126 */ 0x6B1B, 0x6B1D, 0x042F, + /* Array index: 0x0129 */ 0x6B26, 0x6B2B, 0x0432, + /* Array index: 0x012C */ 0x6B68, 0x6B74, 0x0438, + /* Array index: 0x012F */ 0x6C9E, 0x6CA2, 0x0445, + /* Array index: 0x0132 */ 0x6D13, 0x6D15, 0x044A, + /* Array index: 0x0135 */ 0x6D5B, 0x6D5D, 0x044D, + /* Array index: 0x0138 */ 0x6D71, 0x6D73, 0x0450, + /* Array index: 0x013B */ 0x6D99, 0x6D9B, 0x0453, + /* Array index: 0x013E */ 0x6DFE, 0x6E0C, 0x0456, + /* Array index: 0x0141 */ 0x6ED9, 0x6EDD, 0x0465, + /* Array index: 0x0144 */ 0x6F48, 0x6F4C, 0x046A, + /* Array index: 0x0147 */ 0x6FD6, 0x6FDA, 0x046F, + /* Array index: 0x014A */ 0x702C, 0x702E, 0x0474, + /* Array index: 0x014D */ 0x7087, 0x7090, 0x0477, + /* Array index: 0x0150 */ 0x70A2, 0x70AA, 0x0481, + /* Array index: 0x0153 */ 0x712A, 0x712D, 0x048A, + /* Array index: 0x0156 */ 0x7133, 0x713F, 0x048E, + /* Array index: 0x0159 */ 0x7174, 0x7177, 0x049B, + /* Array index: 0x015C */ 0x718B, 0x718E, 0x049F, + /* Array index: 0x015F */ 0x71E9, 0x71EB, 0x04A3, + /* Array index: 0x0162 */ 0x720E, 0x7218, 0x04A6, + /* Array index: 0x0165 */ 0x7264, 0x7268, 0x04B1, + /* Array index: 0x0168 */ 0x7328, 0x732F, 0x04B6, + /* Array index: 0x016B */ 0x7346, 0x7348, 0x04BE, + /* Array index: 0x016E */ 0x7353, 0x7355, 0x04C1, + /* Array index: 0x0171 */ 0x73CE, 0x73D0, 0x04C4, + /* Array index: 0x0174 */ 0x7414, 0x7419, 0x04C7, + /* Array index: 0x0177 */ 0x7438, 0x743E, 0x04CD, + /* Array index: 0x017A */ 0x7445, 0x7449, 0x04D4, + /* Array index: 0x017D */ 0x74C7, 0x74D3, 0x04D9, + /* Array index: 0x0180 */ 0x7555, 0x7558, 0x04E6, + /* Array index: 0x0183 */ 0x76D5, 0x76D9, 0x04EA, + /* Array index: 0x0186 */ 0x773F, 0x7743, 0x04EF, + /* Array index: 0x0189 */ 0x7774, 0x777B, 0x04F4, + /* Array index: 0x018C */ 0x7807, 0x780B, 0x04FC, + /* Array index: 0x018F */ 0x7906, 0x790D, 0x0501, + /* Array index: 0x0192 */ 0x7983, 0x7989, 0x0509, + /* Array index: 0x0195 */ 0x799D, 0x799F, 0x0510, + /* Array index: 0x0198 */ 0x79C3, 0x79C7, 0x0513, + /* Array index: 0x019B */ 0x79D7, 0x79DB, 0x0518, + /* Array index: 0x019E */ 0x79F0, 0x79F5, 0x051D, + /* Array index: 0x01A1 */ 0x7A29, 0x7A2D, 0x0523, + /* Array index: 0x01A4 */ 0x7ACC, 0x7AD5, 0x0528, + /* Array index: 0x01A7 */ 0x7ADA, 0x7ADD, 0x0532, + /* Array index: 0x01AA */ 0x7AF0, 0x7AF5, 0x0536, + /* Array index: 0x01AD */ 0x7B41, 0x7B43, 0x053C, + /* Array index: 0x01B0 */ 0x7C99, 0x7C9C, 0x053F, + /* Array index: 0x01B3 */ 0x7CC2, 0x7CC9, 0x0543, + /* Array index: 0x01B6 */ 0x7D74, 0x7D78, 0x054B, + /* Array index: 0x01B9 */ 0x7D87, 0x7D8B, 0x0550, + /* Array index: 0x01BC */ 0x7D95, 0x7D99, 0x0555, + /* Array index: 0x01BF */ 0x7DCD, 0x7DD3, 0x055A, + /* Array index: 0x01C2 */ 0x7DFC, 0x7E02, 0x0561, + /* Array index: 0x01C5 */ 0x805F, 0x806B, 0x0568, + /* Array index: 0x01C8 */ 0x807A, 0x807C, 0x0575, + /* Array index: 0x01CB */ 0x80A4, 0x80A8, 0x0578, + /* Array index: 0x01CE */ 0x8140, 0x8142, 0x057D, + /* Array index: 0x01D1 */ 0x8192, 0x8196, 0x0580, + /* Array index: 0x01D4 */ 0x8218, 0x821A, 0x0585, + /* Array index: 0x01D7 */ 0x8414, 0x8418, 0x0588, + /* Array index: 0x01DA */ 0x8492, 0x8496, 0x058D, + /* Array index: 0x01DD */ 0x8501, 0x8505, 0x0592, + /* Array index: 0x01E0 */ 0x8533, 0x8535, 0x0597, + /* Array index: 0x01E3 */ 0x8845, 0x8847, 0x059A, + /* Array index: 0x01E6 */ 0x8A9B, 0x8A9F, 0x059D, + /* Array index: 0x01E9 */ 0x8AB1, 0x8AB7, 0x05A2, + /* Array index: 0x01EC */ 0x8C51, 0x8C53, 0x05A9, + /* Array index: 0x01EF */ 0x8D82, 0x8D88, 0x05AC, + /* Array index: 0x01F2 */ 0x8EAD, 0x8EB9, 0x05B3, + /* Array index: 0x01F5 */ 0x8F9D, 0x8FA7, 0x05C0, + /* Array index: 0x01F8 */ 0x9028, 0x902C, 0x05CB, + /* Array index: 0x01FB */ 0x91DE, 0x91E0, 0x05D0, + /* Array index: 0x01FE */ 0x9220, 0x9222, 0x05D3, + /* Array index: 0x0201 */ 0x92AD, 0x92B1, 0x05D6, + /* Array index: 0x0204 */ 0x92DA, 0x92DC, 0x05DB, + /* Array index: 0x0207 */ 0x92F3, 0x92F6, 0x05DE, + /* Array index: 0x020A */ 0x9330, 0x9332, 0x05E2, + /* Array index: 0x020D */ 0x9372, 0x9374, 0x05E5, + /* Array index: 0x0210 */ 0x93BB, 0x93BE, 0x05E8, + /* Array index: 0x0213 */ 0x93E9, 0x93F4, 0x05EC, + /* Array index: 0x0216 */ 0x941A, 0x9424, 0x05F8, + /* Array index: 0x0219 */ 0x9458, 0x945C, 0x0603, + /* Array index: 0x021C */ 0x9465, 0x9467, 0x0608, + /* Array index: 0x021F */ 0x96B5, 0x96B7, 0x060B, + /* Array index: 0x0222 */ 0x96EC, 0x96EE, 0x060E, + /* Array index: 0x0225 */ 0x9733, 0x9737, 0x0611, + /* Array index: 0x0228 */ 0x97B1, 0x97B5, 0x0616, + /* Array index: 0x022B */ 0x983C, 0x9842, 0x061B, + /* Array index: 0x022E */ 0x9854, 0x9856, 0x0622, + /* Array index: 0x0231 */ 0x986C, 0x986E, 0x0625, + /* Array index: 0x0234 */ 0x99B6, 0x99B8, 0x0628, + /* Array index: 0x0237 */ 0x99BC, 0x99C0, 0x062B, + /* Array index: 0x023A */ 0x9AE4, 0x9AEA, 0x0630, + /* Array index: 0x023D */ 0x9B8B, 0x9B8F, 0x0637, + /* Array index: 0x0240 */ 0x9BCB, 0x9BCD, 0x063C, + /* Array index: 0x0243 */ 0x9BFB, 0x9C04, 0x063F, + /* Array index: 0x0246 */ 0x9CEB, 0x9CEF, 0x0649, + /* Array index: 0x0249 */ 0x9EAA, 0x9EAC, 0x064E, + /* Array index: 0x024C */ 0x9EC4, 0x9EC6, 0x0651, + /* Array index: 0x024F */ 0x9F02, 0x9F05, 0x0654, + /* Ranges content */ + /* Range 0x4E20 - 0x4E24, array index: 0x0252 */ + 0x2262,0x2261,0x2263,INVALC,0x243F, + /* Range 0x4EAF - 0x4EB2, array index: 0x0257 */ + 0x2B26,0x2B25,0x2B27,0x2B24, + /* Range 0x4EF8 - 0x4EFC, array index: 0x025B */ + 0x226B,0x2267,0x2276,INVALC,0x226E, + /* Range 0x4F9F - 0x4FA3, array index: 0x0260 */ + 0x274C,0x2749,0x274B,0x274A,0x274D, + /* Range 0x4FF9 - 0x5004, array index: 0x0265 */ + 0x2F44,INVALC,0x2F58,0x2F4C,0x2F56,INVALC,0x2F46,INVALC, + INVALC,0x2F4B,0x2F49,0x2F47, + /* Range 0x5078 - 0x507C, array index: 0x0271 */ + 0x344C,0x344A,INVALC,0x3445,0x3446, + /* Range 0x50DE - 0x50E2, array index: 0x0276 */ + 0x4576,0x634D,INVALC,0x4570,0x4575, + /* Range 0x510D - 0x510F, array index: 0x027B */ + 0x4B2C,0x4B27,0x644E, + /* Range 0x5182 - 0x5186, array index: 0x027E */ + 0x2127,INVALC,0x214D,0x2148,0x214E, + /* Range 0x51B2 - 0x51B5, array index: 0x0283 */ + 0x227E,0x227D,0x227C,0x2459, + /* Range 0x51C1 - 0x51C3, array index: 0x0287 */ + 0x2B3B,0x2B3D,0x2B3E, + /* Range 0x51CF - 0x51D3, array index: 0x028A */ + 0x344F,INVALC,0x344E,0x397D,0x397A, + /* Range 0x51D9 - 0x51DB, array index: 0x028F */ + 0x4B2F,0x4B2E,0x4B30, + /* Range 0x51E2 - 0x51E5, array index: 0x0292 */ + 0x212F,0x2135,0x2151,0x217B, + /* Range 0x5263 - 0x5268, array index: 0x0296 */ + 0x2F66,0x2F61,0x2F63,INVALC,0x2F64,0x3450, + /* Range 0x529A - 0x529E, array index: 0x029C */ + 0x602C,INVALC,0x2137,0x2154,0x2153, + /* Range 0x52B3 - 0x52B5, array index: 0x02A1 */ + 0x2463,0x2462,0x2761, + /* Range 0x52CC - 0x52D1, array index: 0x02A4 */ + 0x2F6F,INVALC,0x2F6C,0x2F6A,0x2F6D,0x2F6E, + /* Range 0x5332 - 0x533B, array index: 0x02AA */ + 0x4623,0x4B34,INVALC,0x5444,0x5C34,INVALC,0x2129,INVALC, + 0x2157,0x2466, + /* Range 0x53A6 - 0x53AB, array index: 0x02B4 */ + 0x3A28,INVALC,0x3A27,0x404A,0x4049,0x4048, + /* Range 0x53C1 - 0x53C5, array index: 0x02BA */ + 0x2769,0x276A,INVALC,0x3455,0x3A29, + /* Range 0x53D9 - 0x53DD, array index: 0x02BF */ + 0x2B50,0x2B4F,INVALC,0x2B4E,0x2B4D, + /* Range 0x5421 - 0x5423, array index: 0x02C4 */ + 0x2479,0x247E,0x2475, + /* Range 0x5449 - 0x5451, array index: 0x02C7 */ + 0x247C,INVALC,0x2478,0x2474,0x246D,INVALC,INVALC,0x247D, + 0x2522, + /* Range 0x54CA - 0x54CD, array index: 0x02D0 */ + 0x2B55,0x6454,0x2B63,0x2B61, + /* Range 0x54F4 - 0x54F6, array index: 0x02D4 */ + 0x2F74,0x2F78,0x3022, + /* Range 0x5558 - 0x555A, array index: 0x02D7 */ + 0x3457,0x3A36,0x3464, + /* Range 0x5571 - 0x5573, array index: 0x02DA */ + 0x6456,0x6722,0x6455, + /* Range 0x564D - 0x5656, array index: 0x02DD */ + 0x4B43,INVALC,0x4B45,0x4B40,0x4635,0x4B3C,INVALC,0x4B39, + INVALC,0x4B3F, + /* Range 0x569E - 0x56A0, array index: 0x02E7 */ + 0x5759,0x5757,0x575C, + /* Range 0x56B8 - 0x56BB, array index: 0x02EA */ + 0x6726,0x6727,0x645C,0x5E26, + /* Range 0x56EF - 0x56F3, array index: 0x02EE */ + 0x2529,INVALC,0x2548,0x2527,0x2528, + /* Range 0x56FB - 0x56FD, array index: 0x02F3 */ + 0x277C,0x2821,0x277B, + /* Range 0x5742 - 0x5748, array index: 0x02F6 */ + 0x2540,0x2536,0x252F,INVALC,0x253C,INVALC,0x252D, + /* Range 0x5753 - 0x5759, array index: 0x02FD */ + 0x2532,0x2541,0x2542,0x2533,0x2538,0x2537,0x645F, + /* Range 0x578D - 0x5792, array index: 0x0304 */ + 0x2B69,0x2B68,INVALC,0x2B6C,0x2B67,0x2B6A, + /* Range 0x57A6 - 0x57A8, array index: 0x030A */ + 0x2B6D,0x2B72,0x2B6E, + /* Range 0x57C4 - 0x57CA, array index: 0x030D */ + 0x3034,0x3035,INVALC,INVALC,0x3033,0x3028,0x3037, + /* Range 0x585F - 0x5861, array index: 0x0314 */ + 0x405E,0x405C,0x4058, + /* Range 0x5866 - 0x586C, array index: 0x0317 */ + 0x405D,0x6343,INVALC,0x405A,0x4059,INVALC,0x4054, + /* Range 0x5895 - 0x5897, array index: 0x031E */ + 0x4641,0x4644,0x4640, + /* Range 0x58EE - 0x58F7, array index: 0x0321 */ + 0x2343,INVALC,0x2545,0x2543,0x2544,0x282D,INVALC,0x2B77, + INVALC,0x3477, + /* Range 0x5900 - 0x590B, array index: 0x032B */ + 0x6466,0x504D,0x2139,INVALC,0x2235,0x2344,INVALC,INVALC, + 0x2B7A,0x2B79,0x213A,0x2546, + /* Range 0x594B - 0x594D, array index: 0x0337 */ + 0x282E,0x282F,0x6467, + /* Range 0x599A - 0x599C, array index: 0x033A */ + 0x2556,0x2553,0x254E, + /* Range 0x5A2A - 0x5A2C, array index: 0x033D */ + 0x303C,0x3522,0x3538, + /* Range 0x5A7E - 0x5A89, array index: 0x0340 */ + 0x3A7C,INVALC,0x3A63,0x3A61,0x3A58,INVALC,INVALC,0x3A5B, + 0x3A77,0x3A72,0x3A59,0x3A60, + /* Range 0x5AA0 - 0x5AA4, array index: 0x034C */ + 0x3A73,0x3A5A,INVALC,0x3A57,0x3A7A, + /* Range 0x5ACE - 0x5AD3, array index: 0x0351 */ + 0x4064,0x3A6B,0x406A,0x6468,INVALC,0x6469, + /* Range 0x5B37 - 0x5B3B, array index: 0x0357 */ + 0x5453,INVALC,0x5A31,0x5761,0x575E, + /* Range 0x5B9D - 0x5B9F, array index: 0x035C */ + 0x284E,0x284B,0x284D, + /* Range 0x5BDA - 0x5BDD, array index: 0x035F */ + 0x4075,0x4076,0x4073,0x6345, + /* Range 0x5BFD - 0x5C00, array index: 0x0363 */ + 0x255E,0x255C,0x255D,0x2850, + /* Range 0x5CB9 - 0x5CBB, array index: 0x0367 */ + 0x285C,0x285F,0x2857, + /* Range 0x5D08 - 0x5D0A, array index: 0x036A */ + 0x354B,0x3548,0x3547, + /* Range 0x5D8B - 0x5D91, array index: 0x036D */ + 0x4659,0x465A,INVALC,0x646F,0x4B65,0x4B66,0x4B63, + /* Range 0x5DA3 - 0x5DA6, array index: 0x0374 */ + 0x4B6A,0x4B68,0x6470,0x5058, + /* Range 0x5E2C - 0x5E32, array index: 0x0378 */ + 0x3069,INVALC,0x3068,0x306A,0x3067,INVALC,0x355B, + /* Range 0x5E46 - 0x5E48, array index: 0x037F */ + 0x3B3A,0x3B3B,0x3B3D, + /* Range 0x5EF8 - 0x5EFD, array index: 0x0382 */ + 0x2869,0x286B,INVALC,0x2C4C,0x2C4B,0x306E, + /* Range 0x5F0C - 0x5F0E, array index: 0x0388 */ + 0x2164,0x2249,0x2362, + /* Range 0x5F39 - 0x5F3B, array index: 0x038B */ + 0x3563,0x3B47,0x3B45, + /* Range 0x5F50 - 0x5F55, array index: 0x038E */ + 0x2140,0x2141,0x224A,0x2351,INVALC,0x2871, + /* Range 0x5F8D - 0x5F8F, array index: 0x0394 */ + 0x6264,0x3070,0x3072, + /* Range 0x5FDA - 0x5FDC, array index: 0x0397 */ + 0x2367,0x2369,0x2577, + /* Range 0x604E - 0x6052, array index: 0x039A */ + 0x2C56,0x3073,INVALC,0x2C57,0x2C5D, + /* Range 0x6073 - 0x6075, array index: 0x039F */ + 0x307A,0x3078,0x307B, + /* Range 0x60A6 - 0x60AA, array index: 0x03A2 */ + 0x3123,0x3128,INVALC,0x3121,0x356F, + /* Range 0x611E - 0x6122, array index: 0x03A7 */ + 0x3B61,INVALC,0x3B62,0x3B63,0x3B50, + /* Range 0x6185 - 0x6188, array index: 0x03AC */ + 0x4C23,0x4674,0x4C24,0x4B77, + /* Range 0x6195 - 0x6199, array index: 0x03B0 */ + 0x4B76,INVALC,0x5068,0x4C28,0x5067, + /* Range 0x61CE - 0x61D0, array index: 0x03B5 */ + 0x5062,0x5065,0x506B, + /* Range 0x61D9 - 0x61DD, array index: 0x03B8 */ + 0x5461,0x545F,0x545C,0x545E,0x545D, + /* Range 0x6235 - 0x623C, array index: 0x03BD */ + 0x5F48,INVALC,0x2165,0x2166,0x224E,INVALC,0x2628,0x2629, + /* Range 0x6299 - 0x629E, array index: 0x03C5 */ + 0x2635,INVALC,0x2633,0x2634,0x2638,0x2631, + /* Range 0x62A3 - 0x62A7, array index: 0x03CB */ + 0x647B,INVALC,0x2632,0x2931,0x292A, + /* Range 0x62DD - 0x62E1, array index: 0x03D0 */ + 0x2930,0x2937,0x2935,0x2936,0x292F, + /* Range 0x635B - 0x635D, array index: 0x03D5 */ + 0x3130,0x313B,0x3136, + /* Range 0x6438 - 0x643C, array index: 0x03D8 */ + 0x4134,INVALC,0x4148,0x4725,0x4142, + /* Range 0x6455 - 0x6457, array index: 0x03DD */ + 0x467E,0x4724,0x467A, + /* Range 0x655F - 0x6561, array index: 0x03E0 */ + 0x3B74,0x3B75,0x3B76, + /* Range 0x656D - 0x6571, array index: 0x03E3 */ + 0x414E,0x6346,INVALC,0x414D,0x4730, + /* Range 0x6617 - 0x661B, array index: 0x03E8 */ + 0x2940,0x2941,INVALC,0x2C7E,0x2C7A, + /* Range 0x66A4 - 0x66A6, array index: 0x03ED */ + 0x4739,0x4733,0x4737, + /* Range 0x66CD - 0x66D7, array index: 0x03F0 */ + 0x5122,0x5471,INVALC,0x546F,0x5470,INVALC,INVALC,0x546C, + 0x546D,INVALC,0x5472, + /* Range 0x67A2 - 0x67A4, array index: 0x03FB */ + 0x294E,0x294C,0x6528, + /* Range 0x67D5 - 0x67D7, array index: 0x03FE */ + 0x2D31,0x2D2B,0x2D3A, + /* Range 0x6822 - 0x6824, array index: 0x0401 */ + 0x315E,0x3164,0x3150, + /* Range 0x6855 - 0x685A, array index: 0x0404 */ + 0x3162,0x3158,INVALC,0x3161,0x3160,0x652D, + /* Range 0x6898 - 0x689A, array index: 0x040A */ + 0x364D,0x365C,0x3650, + /* Range 0x68B6 - 0x68B9, array index: 0x040D */ + 0x364C,0x3652,0x365E,0x365F, + /* Range 0x68FE - 0x6903, array index: 0x0411 */ + 0x3C31,0x3C42,0x3C39,0x3C3B,0x3C34,0x3C2F, + /* Range 0x6A29 - 0x6A2D, array index: 0x0417 */ + 0x4C5E,0x4C59,INVALC,0x4C61,0x6530, + /* Range 0x6AB0 - 0x6AB2, array index: 0x041C */ + 0x5777,0x5821,0x5776, + /* Range 0x6ABC - 0x6AC1, array index: 0x041F */ + 0x577E,INVALC,0x5779,0x5823,0x577D,0x577A, + /* Range 0x6AD4 - 0x6AD8, array index: 0x0425 */ + 0x5A45,0x5A4E,INVALC,0x5A47,0x5A4D, + /* Range 0x6AFD - 0x6B01, array index: 0x042A */ + 0x5E35,0x5E34,0x5E33,INVALC,0x5E37, + /* Range 0x6B1B - 0x6B1D, array index: 0x042F */ + 0x6140,0x6165,0x6141, + /* Range 0x6B26 - 0x6B2B, array index: 0x0432 */ + 0x2953,0x2954,INVALC,0x6269,0x2D3C,0x3166, + /* Range 0x6B68 - 0x6B74, array index: 0x0438 */ + 0x2955,0x2956,INVALC,0x2D3D,0x3168,INVALC,0x3C49,0x3C47, + INVALC,0x417E,INVALC,0x4221,0x4753, + /* Range 0x6C9E - 0x6CA2, array index: 0x0445 */ + 0x264E,0x2652,0x265C,0x2659,0x2656, + /* Range 0x6D13 - 0x6D15, array index: 0x044A */ + 0x2D49,0x2D47,0x2D4D, + /* Range 0x6D5B - 0x6D5D, array index: 0x044D */ + 0x3179,0x3226,0x3176, + /* Range 0x6D71 - 0x6D73, array index: 0x0450 */ + 0x3222,0x3225,0x3172, + /* Range 0x6D99 - 0x6D9B, array index: 0x0453 */ + 0x317D,0x317B,0x317C, + /* Range 0x6DFE - 0x6E0C, array index: 0x0456 */ + 0x3C5D,0x3728,INVALC,0x3726,0x3723,INVALC,0x3670,INVALC, + 0x3677,0x3724,0x3676,0x3725,0x3679,INVALC,0x367D, + /* Range 0x6ED9 - 0x6EDD, array index: 0x0465 */ + 0x4244,0x423E,0x4247,INVALC,0x423D, + /* Range 0x6F48 - 0x6F4C, array index: 0x046A */ + 0x6544,0x6545,0x4766,INVALC,0x6543, + /* Range 0x6FD6 - 0x6FDA, array index: 0x046F */ + 0x5530,0x552F,INVALC,0x5535,0x5536, + /* Range 0x702C - 0x702E, array index: 0x0474 */ + 0x5A53,0x654A,0x6549, + /* Range 0x7087 - 0x7090, array index: 0x0477 */ + 0x2974,0x2970,0x2975,INVALC,0x296F,0x2979,0x2976,INVALC, + 0x2972,0x2971, + /* Range 0x70A2 - 0x70AA, array index: 0x0481 */ + 0x2D5C,0x2D5A,INVALC,0x2D58,0x626A,0x2D65,0x2D62,INVALC, + 0x2D5F, + /* Range 0x712A - 0x712D, array index: 0x048A */ + 0x3C6F,0x3C7A,0x3C72,0x3D21, + /* Range 0x7133 - 0x713F, array index: 0x048E */ + 0x3C7B,0x3C79,0x3C71,INVALC,0x3C73,0x3C77,0x6553,INVALC, + 0x6554,INVALC,0x6555,INVALC,0x6552, + /* Range 0x7174 - 0x7177, array index: 0x049B */ + 0x4253,0x6557,0x6558,0x6556, + /* Range 0x718B - 0x718E, array index: 0x049F */ + 0x476A,0x476D,0x476B,0x4768, + /* Range 0x71E9 - 0x71EB, array index: 0x04A3 */ + 0x553E,0x5543,0x5540, + /* Range 0x720E - 0x7218, array index: 0x04A6 */ + 0x655F,0x5C56,INVALC,0x5C58,0x5C55,INVALC,INVALC,0x5A58, + 0x5C53,0x5C57,0x6561, + /* Range 0x7264 - 0x7268, array index: 0x04B1 */ + 0x2664,0x2A21,0x2A22,INVALC,0x2A23, + /* Range 0x7328 - 0x732F, array index: 0x04B6 */ + 0x3D2E,INVALC,0x3D29,0x3D2B,0x3D2A,INVALC,0x4261,0x3D2D, + /* Range 0x7346 - 0x7348, array index: 0x04BE */ + 0x4262,0x6562,0x6563, + /* Range 0x7353 - 0x7355, array index: 0x04C1 */ + 0x4778,0x477A,0x4777, + /* Range 0x73CE - 0x73D0, array index: 0x04C4 */ + 0x2D7E,0x2D79,0x2D7C, + /* Range 0x7414 - 0x7419, array index: 0x04C7 */ + 0x3D36,0x3D3A,INVALC,0x3D2F,0x3D3B,0x3D32, + /* Range 0x7438 - 0x743E, array index: 0x04CD */ + 0x3D33,0x3D3C,INVALC,0x6566,0x3D37,0x4268,0x4275, + /* Range 0x7445 - 0x7449, array index: 0x04D4 */ + 0x4274,INVALC,0x426E,0x4266,0x4271, + /* Range 0x74C7 - 0x74D3, array index: 0x04D9 */ + 0x5A5C,0x5A5D,0x5A5B,INVALC,INVALC,0x5C5E,0x5C5C,0x5C5F, + INVALC,0x5C5D,0x5C60,INVALC,0x5E3D, + /* Range 0x7555 - 0x7558, array index: 0x04E6 */ + 0x324E,0x324D,0x3250,0x324F, + /* Range 0x76D5 - 0x76D9, array index: 0x04EA */ + 0x3750,0x3752,0x3751,INVALC,0x3D4F, + /* Range 0x773F - 0x7743, array index: 0x04EF */ + 0x3262,0x3757,INVALC,0x3D56,0x3D53, + /* Range 0x7774 - 0x777B, array index: 0x04F4 */ + 0x4833,0x4836,0x4835,0x4834,0x4838,INVALC,0x483B,0x483D, + /* Range 0x7807 - 0x780B, array index: 0x04FC */ + 0x2E3B,0x2E3E,INVALC,0x2E37,0x2E3A, + /* Range 0x7906 - 0x790D, array index: 0x0501 */ + 0x5843,0x583E,0x5840,INVALC,0x583F,0x583C,INVALC,0x5842, + /* Range 0x7983 - 0x7989, array index: 0x0509 */ + 0x4339,0x3D63,INVALC,0x6578,0x4848,INVALC,0x4847, + /* Range 0x799D - 0x799F, array index: 0x0510 */ + 0x4D50,0x4D51,0x4D4F, + /* Range 0x79C3 - 0x79C7, array index: 0x0513 */ + 0x2A3E,0x2A3D,INVALC,0x2A3F,0x2A42, + /* Range 0x79D7 - 0x79DB, array index: 0x0518 */ + 0x2E43,INVALC,0x3274,0x3273,0x3279, + /* Range 0x79F0 - 0x79F5, array index: 0x051D */ + 0x327C,0x3769,0x3767,0x376B,INVALC,0x376A, + /* Range 0x7A29 - 0x7A2D, array index: 0x0523 */ + 0x484B,0x484D,INVALC,0x4850,0x484F, + /* Range 0x7ACC - 0x7AD5, array index: 0x0528 */ + 0x267E,0x2721,INVALC,0x2A47,0x2E4E,INVALC,0x2E4F,0x2E4D, + 0x2E4B,0x2E4C, + /* Range 0x7ADA - 0x7ADD, array index: 0x0532 */ + 0x3323,0x3326,0x3327,0x3324, + /* Range 0x7AF0 - 0x7AF5, array index: 0x0536 */ + 0x4855,0x5230,0x5569,0x556A,INVALC,0x5849, + /* Range 0x7B41 - 0x7B43, array index: 0x053C */ + 0x3D7B,0x3D78,0x3D75, + /* Range 0x7C99 - 0x7C9C, array index: 0x053F */ + 0x377E,0x3821,0x383E,0x3822, + /* Range 0x7CC2 - 0x7CC9, array index: 0x0543 */ + 0x4D6F,0x4D71,0x4D6D,INVALC,0x4D70,0x4D73,INVALC,0x4D72, + /* Range 0x7D74 - 0x7D78, array index: 0x054B */ + 0x3E24,0x3E35,0x3E33,INVALC,0x4367, + /* Range 0x7D87 - 0x7D8B, array index: 0x0550 */ + 0x4366,INVALC,0x4369,0x4360,0x4362, + /* Range 0x7D95 - 0x7D99, array index: 0x0555 */ + 0x4364,INVALC,0x4368,0x436A,0x4363, + /* Range 0x7DCD - 0x7DD3, array index: 0x055A */ + 0x4871,INVALC,0x4873,0x6629,0x486B,INVALC,0x662B, + /* Range 0x7DFC - 0x7E02, array index: 0x0561 */ + 0x4E28,0x4E29,0x4E25,0x4E2C,0x4E27,0x4D7E,0x4D7D, + /* Range 0x805F - 0x806B, array index: 0x0568 */ + 0x4926,0x3E3B,0x4925,INVALC,0x6630,INVALC,0x4E34,0x4E36, + INVALC,0x4E37,INVALC,0x4E35,0x4E38, + /* Range 0x807A - 0x807C, array index: 0x0575 */ + 0x5C70,0x5C71,0x5C72, + /* Range 0x80A4 - 0x80A8, array index: 0x0578 */ + 0x2A56,INVALC,0x2A5B,0x2A58,0x2A4F, + /* Range 0x8140 - 0x8142, array index: 0x057D */ + 0x3E43,0x3E45,0x3E41, + /* Range 0x8192 - 0x8196, array index: 0x0580 */ + 0x4E3B,0x4E3D,0x4E39,INVALC,0x4E3C, + /* Range 0x8218 - 0x821A, array index: 0x0585 */ + 0x524A,0x5868,0x5A79, + /* Range 0x8414 - 0x8418, array index: 0x0588 */ + 0x3E58,INVALC,0x3E5D,0x3E56,0x3E4E, + /* Range 0x8492 - 0x8496, array index: 0x058D */ + 0x4935,0x4944,INVALC,0x4933,0x4938, + /* Range 0x8501 - 0x8505, array index: 0x0592 */ + 0x4E40,INVALC,0x4E4C,0x4E46,0x4E54, + /* Range 0x8533 - 0x8535, array index: 0x0597 */ + 0x4E4D,0x4E4E,0x4E52, + /* Range 0x8845 - 0x8847, array index: 0x059A */ + 0x386A,0x3E6A,0x3E69, + /* Range 0x8A9B - 0x8A9F, array index: 0x059D */ + 0x495E,0x4962,0x496B,INVALC,0x4968, + /* Range 0x8AB1 - 0x8AB7, array index: 0x05A2 */ + 0x4E67,INVALC,0x4E72,0x4E70,0x4E6E,INVALC,0x4E6C, + /* Range 0x8C51 - 0x8C53, array index: 0x05A9 */ + 0x5D34,0x664D,0x6221, + /* Range 0x8D82 - 0x8D88, array index: 0x05AC */ + 0x3F39,0x3F34,INVALC,INVALC,0x3F37,0x3F30,0x3F33, + /* Range 0x8EAD - 0x8EB9, array index: 0x05B3 */ + 0x393F,INVALC,0x3940,0x3F40,0x4473,INVALC,0x497D,0x497C, + INVALC,0x4F30,0x4F32,0x4F2F,0x4F31, + /* Range 0x8F9D - 0x8FA7, array index: 0x05C0 */ + 0x3F4B,0x4477,INVALC,0x4478,0x4A21,0x4A22,INVALC,0x4F37, + 0x5327,INVALC,0x5326, + /* Range 0x9028 - 0x902C, array index: 0x05CB */ + 0x3F4F,0x3F50,0x3F4D,0x3F4C,0x3F51, + /* Range 0x91DE - 0x91E0, array index: 0x05D0 */ + 0x342F,0x342E,0x3431, + /* Range 0x9220 - 0x9222, array index: 0x05D3 */ + 0x3F5E,0x6659,0x3F63, + /* Range 0x92AD - 0x92B1, array index: 0x05D6 */ + 0x4A32,0x4A37,INVALC,0x672A,0x4A31, + /* Range 0x92DA - 0x92DC, array index: 0x05DB */ + 0x4F4B,0x4F4E,0x4F44, + /* Range 0x92F3 - 0x92F6, array index: 0x05DE */ + 0x4F4D,0x665B,0x665C,0x4A30, + /* Range 0x9330 - 0x9332, array index: 0x05E2 */ + 0x533C,0x5339,0x533A, + /* Range 0x9372 - 0x9374, array index: 0x05E5 */ + 0x5662,0x5663,0x565F, + /* Range 0x93BB - 0x93BE, array index: 0x05E8 */ + 0x5945,0x6661,0x6662,0x6660, + /* Range 0x93E9 - 0x93F4, array index: 0x05EC */ + 0x5B41,0x5B42,0x5B4E,INVALC,0x5B47,INVALC,0x6665,INVALC, + 0x6663,0x6664,0x5D41,0x5E6A, + /* Range 0x941A - 0x9424, array index: 0x05F8 */ + 0x5D44,0x5D45,0x5D47,INVALC,0x5D42,0x5D3A,INVALC,INVALC, + 0x6666,0x6667,0x6668, + /* Range 0x9458 - 0x945C, array index: 0x0603 */ + 0x6431,INVALC,0x6055,0x6054,0x6056, + /* Range 0x9465 - 0x9467, array index: 0x0608 */ + 0x6057,0x666A,0x6669, + /* Range 0x96B5 - 0x96B7, array index: 0x060B */ + 0x5D49,0x2A7D,0x5349, + /* Range 0x96EC - 0x96EE, array index: 0x060E */ + 0x3F7E,0x3F7C,0x3F7B, + /* Range 0x9733 - 0x9737, array index: 0x0611 */ + 0x5D4C,0x5D4E,INVALC,0x5E72,0x5E71, + /* Range 0x97B1 - 0x97B5, array index: 0x0616 */ + 0x5B5F,0x5B5D,INVALC,0x5B5E,0x5B60, + /* Range 0x983C - 0x9842, array index: 0x061B */ + 0x535B,0x535F,INVALC,0x595B,0x5726,INVALC,0x637B, + /* Range 0x9854 - 0x9856, array index: 0x0622 */ + 0x5956,0x5958,0x5B65, + /* Range 0x986C - 0x986E, array index: 0x0625 */ + 0x605D,0x605E,0x605C, + /* Range 0x99B6 - 0x99B8, array index: 0x0628 */ + 0x4A63,0x4A62,0x4A66, + /* Range 0x99BC - 0x99C0, array index: 0x062B */ + 0x4A61,INVALC,0x4A60,0x4A6C,0x4A64, + /* Range 0x9AE4 - 0x9AEA, array index: 0x0630 */ + 0x4A6F,0x4A73,INVALC,INVALC,0x4A71,0x4A70,0x4A72, + /* Range 0x9B8B - 0x9B8F, array index: 0x0637 */ + 0x537C,0x5421,INVALC,0x5425,0x537D, + /* Range 0x9BCB - 0x9BCD, array index: 0x063C */ + 0x5976,0x5975,0x5743, + /* Range 0x9BFB - 0x9C04, array index: 0x063F */ + 0x5D67,0x5D69,INVALC,0x5D6A,0x5D74,0x5D75,INVALC,0x5D6E, + INVALC,0x5D68, + /* Range 0x9CEB - 0x9CEF, array index: 0x0649 */ + 0x4566,0x2F42,INVALC,0x4568,0x4567, + /* Range 0x9EAA - 0x9EAC, array index: 0x064E */ + 0x502F,0x502E,0x543A, + /* Range 0x9EC4 - 0x9EC6, array index: 0x0651 */ + 0x396A,0x543C,0x543B, + /* Range 0x9F02 - 0x9F05, array index: 0x0654 */ + 0x5A29,0x5C2D,0x5C2E,0x5F3C, + /* Unranged codes (197 codes) */ + /* Array index: 0x0658 */ 0x4E04,0x2126, + /* Array index: 0x0658 */ 0x4E05,0x2125, + /* Array index: 0x0658 */ 0x4E28,0x2121, + /* Array index: 0x0658 */ 0x4E2A,0x212C, + /* Array index: 0x0658 */ 0x4E36,0x2122, + /* Array index: 0x0658 */ 0x4E3D,0x2740, + /* Array index: 0x0658 */ 0x4E3F,0x2123, + /* Array index: 0x0658 */ 0x4E46,0x2130, + /* Array index: 0x0658 */ 0x4E49,0x212E, + /* Array index: 0x0658 */ 0x4E54,0x2345, + /* Array index: 0x0658 */ 0x4E57,0x2B22, + /* Array index: 0x0658 */ 0x4E62,0x2146, + /* Array index: 0x0658 */ 0x4E63,0x2145, + /* Array index: 0x0658 */ 0x4E68,0x2264, + /* Array index: 0x0658 */ 0x4E71,0x2440, + /* Array index: 0x0658 */ 0x4E79,0x2B23, + /* Array index: 0x0658 */ 0x4E80,0x396C, + /* Array index: 0x0658 */ 0x4E81,0x396E, + /* Array index: 0x0658 */ 0x4E85,0x2124, + /* Array index: 0x0658 */ 0x4E87,0x212D, + /* Array index: 0x0658 */ 0x4E89,0x2265, + /* Array index: 0x0658 */ 0x4E8F,0x2131, + /* Array index: 0x0658 */ 0x4E97,0x216C, + /* Array index: 0x0658 */ 0x4E98,0x2266, + /* Array index: 0x0658 */ 0x4E9C,0x2442, + /* Array index: 0x0658 */ 0x4E9D,0x2742, + /* Array index: 0x0658 */ 0x4EA3,0x2147, + /* Array index: 0x0658 */ 0x4EB7,0x4033, + /* Array index: 0x0658 */ 0x4EBC,0x2132, + /* Array index: 0x0658 */ 0x4EBE,0x2133, + /* Array index: 0x0658 */ 0x4EC5,0x2149, + /* Array index: 0x0658 */ 0x4ECC,0x214C, + /* Array index: 0x0658 */ 0x4ECE,0x214B, + /* Array index: 0x0658 */ 0x4ECF,0x214A, + /* Array index: 0x0658 */ 0x4EE0,0x216D, + /* Array index: 0x0658 */ 0x4EE6,0x2172, + /* Array index: 0x0658 */ 0x4EE7,0x2170, + /* Array index: 0x0658 */ 0x4EEE,0x226F, + /* Array index: 0x0658 */ 0x4EEF,0x2268, + /* Array index: 0x0658 */ 0x4F03,0x226D, + /* Array index: 0x0658 */ 0x4F06,0x226C, + /* Array index: 0x0658 */ 0x4F07,0x2274, + /* Array index: 0x0658 */ 0x4F16,0x2270, + /* Array index: 0x0658 */ 0x4F17,0x2277, + /* Array index: 0x0658 */ 0x4F1A,0x2275, + /* Array index: 0x0658 */ 0x4F1C,0x2273, + /* Array index: 0x0658 */ 0x4F28,0x2272, + /* Array index: 0x0658 */ 0x4F31,0x2450, + /* Array index: 0x0658 */ 0x4F32,0x2448, + /* Array index: 0x0658 */ 0x4F35,0x244F, + /* Array index: 0x0658 */ 0x4F37,0x2446, + /* Array index: 0x0658 */ 0x4F39,0x2445, + /* Array index: 0x0658 */ 0x4F40,0x244E, + /* Array index: 0x0658 */ 0x4F42,0x2449, + /* Array index: 0x0658 */ 0x4F44,0x244B, + /* Array index: 0x0658 */ 0x4F45,0x2443, + /* Array index: 0x0658 */ 0x4F4A,0x2444, + /* Array index: 0x0658 */ 0x4F4B,0x244C, + /* Array index: 0x0658 */ 0x4F66,0x6448, + /* Array index: 0x0658 */ 0x4F68,0x6449, + /* Array index: 0x0658 */ 0x4F6D,0x2747, + /* Array index: 0x0658 */ 0x4F72,0x274F, + /* Array index: 0x0658 */ 0x4F8A,0x2744, + /* Array index: 0x0658 */ 0x4F8C,0x2751, + /* Array index: 0x0658 */ 0x4F8E,0x2748, + /* Array index: 0x0658 */ 0x4F93,0x2743, + /* Array index: 0x0658 */ 0x4FB0,0x2B2D, + /* Array index: 0x0658 */ 0x4FB1,0x2B2E, + /* Array index: 0x0658 */ 0x4FB4,0x2B36, + /* Array index: 0x0658 */ 0x4FB8,0x2B2C, + /* Array index: 0x0658 */ 0x4FBD,0x6263, + /* Array index: 0x0658 */ 0x4FBE,0x2B2B, + /* Array index: 0x0658 */ 0x4FC6,0x2B32, + /* Array index: 0x0658 */ 0x4FC8,0x2B2F, + /* Array index: 0x0658 */ 0x4FCC,0x2B33, + /* Array index: 0x0658 */ 0x4FD2,0x2B28, + /* Array index: 0x0658 */ 0x4FD5,0x2B29, + /* Array index: 0x0658 */ 0x4FE3,0x2B35, + /* Array index: 0x0658 */ 0x4FE5,0x2B34, + /* Array index: 0x0658 */ 0x4FE7,0x644A, + /* Array index: 0x0658 */ 0x4FF0,0x2F48, + /* Array index: 0x0658 */ 0x4FF2,0x2F4D, + /* Array index: 0x0658 */ 0x5008,0x2F4F, + /* Array index: 0x0658 */ 0x5010,0x2F53, + /* Array index: 0x0658 */ 0x501D,0x2F45, + /* Array index: 0x0658 */ 0x5024,0x2F4E, + /* Array index: 0x0658 */ 0x502E,0x2F51, + /* Array index: 0x0658 */ 0x5032,0x2F43, + /* Array index: 0x0658 */ 0x5036,0x2F50, + /* Array index: 0x0658 */ 0x5038,0x2F54, + /* Array index: 0x0658 */ 0x5039,0x2F55, + /* Array index: 0x0658 */ 0x503F,0x644B, + /* Array index: 0x0658 */ 0x5042,0x343C, + /* Array index: 0x0658 */ 0x5044,0x343F, + /* Array index: 0x0658 */ 0x5050,0x3444, + /* Array index: 0x0658 */ 0x5052,0x3441, + /* Array index: 0x0658 */ 0x5054,0x3442, + /* Array index: 0x0658 */ 0x5056,0x2F57, + /* Array index: 0x0658 */ 0x5058,0x3447, + /* Array index: 0x0658 */ 0x5059,0x343D, + /* Array index: 0x0658 */ 0x5066,0x3440, + /* Array index: 0x0658 */ 0x506C,0x344B, + /* Array index: 0x0658 */ 0x5071,0x3443, + /* Array index: 0x0658 */ 0x5081,0x3975, + /* Array index: 0x0658 */ 0x5088,0x3971, + /* Array index: 0x0658 */ 0x5089,0x3972, + /* Array index: 0x0658 */ 0x508F,0x396F, + /* Array index: 0x0658 */ 0x5097,0x3970, + /* Array index: 0x0658 */ 0x50A6,0x644D, + /* Array index: 0x0658 */ 0x50AA,0x4039, + /* Array index: 0x0658 */ 0x50AB,0x403C, + /* Array index: 0x0658 */ 0x50B9,0x403A, + /* Array index: 0x0658 */ 0x50BC,0x4037, + /* Array index: 0x0658 */ 0x50C3,0x403D, + /* Array index: 0x0658 */ 0x50CC,0x4036, + /* Array index: 0x0658 */ 0x50CD,0x403E, + /* Array index: 0x0658 */ 0x50D0,0x456B, + /* Array index: 0x0658 */ 0x50D2,0x634C, + /* Array index: 0x0658 */ 0x50D8,0x456E, + /* Array index: 0x0658 */ 0x50D9,0x456C, + /* Array index: 0x0658 */ 0x50DC,0x456D, + /* Array index: 0x0658 */ 0x50EB,0x4571, + /* Array index: 0x0658 */ 0x50F4,0x4574, + /* Array index: 0x0658 */ 0x50F7,0x4B29, + /* Array index: 0x0658 */ 0x50FC,0x4B2B, + /* Array index: 0x0658 */ 0x5101,0x4B2D, + /* Array index: 0x0658 */ 0x5116,0x5031, + /* Array index: 0x0658 */ 0x511B,0x5035, + /* Array index: 0x0658 */ 0x511D,0x5030, + /* Array index: 0x0658 */ 0x511E,0x5034, + /* Array index: 0x0658 */ 0x5127,0x5441, + /* Array index: 0x0658 */ 0x5128,0x5440, + /* Array index: 0x0658 */ 0x512B,0x5033, + /* Array index: 0x0658 */ 0x512F,0x5752, + /* Array index: 0x0658 */ 0x5136,0x5C32, + /* Array index: 0x0658 */ 0x513E,0x606F, + /* Array index: 0x0658 */ 0x514A,0x2278, + /* Array index: 0x0658 */ 0x514E,0x2454, + /* Array index: 0x0658 */ 0x5150,0x2453, + /* Array index: 0x0658 */ 0x5151,0x2451, + /* Array index: 0x0658 */ 0x5156,0x2752, + /* Array index: 0x0658 */ 0x5160,0x3976, + /* Array index: 0x0658 */ 0x5164,0x5E25, + /* Array index: 0x0658 */ 0x5166,0x2134, + /* Array index: 0x0658 */ 0x516A,0x2B37, + /* Array index: 0x0658 */ 0x5172,0x227A, + /* Array index: 0x0658 */ 0x5179,0x2E7B, + /* Array index: 0x0658 */ 0x517E,0x403F, + /* Array index: 0x0658 */ 0x517F,0x6453, + /* Array index: 0x0658 */ 0x518B,0x2178, + /* Array index: 0x0658 */ 0x518C,0x2179, + /* Array index: 0x0658 */ 0x5190,0x2755, + /* Array index: 0x0658 */ 0x5196,0x2128, + /* Array index: 0x0658 */ 0x5199,0x217A, + /* Array index: 0x0658 */ 0x519D,0x2457, + /* Array index: 0x0658 */ 0x519F,0x2B39, + /* Array index: 0x0658 */ 0x51A1,0x2F5B, + /* Array index: 0x0658 */ 0x51A3,0x2F59, + /* Array index: 0x0658 */ 0x51A6,0x2F5A, + /* Array index: 0x0658 */ 0x51A8,0x344D, + /* Array index: 0x0658 */ 0x51B8,0x245A, + /* Array index: 0x0658 */ 0x51C7,0x2F5E, + /* Array index: 0x0658 */ 0x51C9,0x2F5F, + /* Array index: 0x0658 */ 0x51D6,0x397E, + /* Array index: 0x0658 */ 0x51DF,0x5442, + /* Array index: 0x0658 */ 0x51E8,0x2322, + /* Array index: 0x0658 */ 0x51EC,0x245B, + /* Array index: 0x0658 */ 0x51ED,0x2759, + /* Array index: 0x0658 */ 0x51F4,0x457A, + /* Array index: 0x0658 */ 0x51FE,0x275A, + /* Array index: 0x0658 */ 0x5204,0x2136, + /* Array index: 0x0658 */ 0x5205,0x2152, + /* Array index: 0x0658 */ 0x520B,0x217D, + /* Array index: 0x0658 */ 0x520F,0x2325, + /* Array index: 0x0658 */ 0x5214,0x2324, + /* Array index: 0x0658 */ 0x5215,0x2326, + /* Array index: 0x0658 */ 0x5218,0x2327, + /* Array index: 0x0658 */ 0x521F,0x245F, + /* Array index: 0x0658 */ 0x5220,0x2461, + /* Array index: 0x0658 */ 0x5223,0x245C, + /* Array index: 0x0658 */ 0x5226,0x245E, + /* Array index: 0x0658 */ 0x5227,0x245D, + /* Array index: 0x0658 */ 0x522B,0x2460, + /* Array index: 0x0658 */ 0x522F,0x275B, + /* Array index: 0x0658 */ 0x5234,0x275E, + /* Array index: 0x0658 */ 0x5239,0x275F, + /* Array index: 0x0658 */ 0x523C,0x275D, + /* Array index: 0x0658 */ 0x523E,0x644F, + /* Array index: 0x0658 */ 0x5245,0x2B3F, + /* Array index: 0x0658 */ 0x5248,0x2B40, + /* Array index: 0x0658 */ 0x524F,0x2B43, + /* Array index: 0x0658 */ 0x5253,0x2F68, + /* Array index: 0x0658 */ 0x5257,0x2F65, + /* Array index: 0x0658 */ 0x5259,0x2F62, + /* Array index: 0x0658 */ 0x5260,0x2F60, + /* Array index: 0x0658 */ 0x5270,0x3A23, + /* Array index: 0x0658 */ 0x5273,0x3A21, + /* Array index: 0x0658 */ 0x5276,0x3451, + /* Array index: 0x0658 */ 0x5279,0x4041, + /* Array index: 0x0658 */ 0x527E,0x4040, + /* Array index: 0x0658 */ 0x5286,0x4B31, + /* Array index: 0x0658 */ 0x528E,0x4B32, + /* Array index: 0x0658 */ 0x5290,0x5036, + /* Array index: 0x0658 */ 0x5294,0x5037, + /* Array index: 0x0658 */ 0x52A8,0x2328, + /* Array index: 0x0658 */ 0x52B9,0x2760, + /* Array index: 0x0658 */ 0x52BD,0x625A, + /* Array index: 0x0658 */ 0x52BF,0x2762, + /* Array index: 0x0658 */ 0x52C4,0x2B48, + /* Array index: 0x0658 */ 0x52C5,0x2B46, + /* Array index: 0x0658 */ 0x52CA,0x2B47, + /* Array index: 0x0658 */ 0x52D4,0x3452, + /* Array index: 0x0658 */ 0x52E0,0x4045, + /* Array index: 0x0658 */ 0x52E1,0x4044, + /* Array index: 0x0658 */ 0x52E7,0x4046, + /* Array index: 0x0658 */ 0x52EA,0x4621, + /* Array index: 0x0658 */ 0x52ED,0x457E, + /* Array index: 0x0658 */ 0x52EE,0x4B33, + /* Array index: 0x0658 */ 0x52F2,0x4D2C, + /* Array index: 0x0658 */ 0x52FD,0x2155, + /* Array index: 0x0658 */ 0x5300,0x2156, + /* Array index: 0x0658 */ 0x5303,0x2223, + /* Array index: 0x0658 */ 0x5304,0x2222, + /* Array index: 0x0658 */ 0x5307,0x2224, + /* Array index: 0x0658 */ 0x5314,0x5038, + /* Array index: 0x0658 */ 0x531E,0x2226, + /* Array index: 0x0658 */ 0x5324,0x6450, + /* Array index: 0x0658 */ 0x5325,0x2465, + /* Array index: 0x0658 */ 0x5327,0x2B49, + /* Array index: 0x0658 */ 0x5346,0x2159, + /* Array index: 0x0658 */ 0x534B,0x232A, + /* Array index: 0x0658 */ 0x534F,0x232B, + /* Array index: 0x0658 */ 0x5350,0x232D, + /* Array index: 0x0658 */ 0x5355,0x2763, + /* Array index: 0x0658 */ 0x5358,0x2B4A, + /* Array index: 0x0658 */ 0x535D,0x215A, + /* Array index: 0x0658 */ 0x535F,0x2227, + /* Array index: 0x0658 */ 0x5365,0x6451, + /* Array index: 0x0658 */ 0x5367,0x2A5C, + /* Array index: 0x0658 */ 0x5369,0x212A, + /* Array index: 0x0658 */ 0x536D,0x2228, + /* Array index: 0x0658 */ 0x5374,0x2467, + /* Array index: 0x0658 */ 0x5376,0x2765, + /* Array index: 0x0658 */ 0x537A,0x2766, + /* Array index: 0x0658 */ 0x537D,0x2B4B, + /* Array index: 0x0658 */ 0x5380,0x4047, + /* Array index: 0x0658 */ 0x5386,0x215B, + /* Array index: 0x0658 */ 0x5389,0x2229, + /* Array index: 0x0658 */ 0x538B,0x232F, + /* Array index: 0x0658 */ 0x5393,0x2767, + /* Array index: 0x0658 */ 0x539B,0x6452, + /* Array index: 0x0658 */ 0x53A0,0x3454, + /* Array index: 0x0658 */ 0x53AE,0x4625, + /* Array index: 0x0658 */ 0x53B0,0x4626, + /* Array index: 0x0658 */ 0x53B1,0x4B35, + /* Array index: 0x0658 */ 0x53B3,0x5445, + /* Array index: 0x0658 */ 0x53B6,0x212B, + /* Array index: 0x0658 */ 0x53B7,0x215C, + /* Array index: 0x0658 */ 0x53BA,0x222A, + /* Array index: 0x0658 */ 0x53BE,0x2331, + /* Array index: 0x0658 */ 0x53CC,0x215E, + /* Array index: 0x0658 */ 0x53CE,0x2160, + /* Array index: 0x0658 */ 0x53D0,0x222B, + /* Array index: 0x0658 */ 0x53D2,0x2333, + /* Array index: 0x0658 */ 0x53D5,0x276B, + /* Array index: 0x0658 */ 0x53E0,0x404B, + /* Array index: 0x0658 */ 0x53F4,0x2231, + /* Array index: 0x0658 */ 0x53F6,0x222D, + /* Array index: 0x0658 */ 0x53F7,0x222E, + /* Array index: 0x0658 */ 0x53F9,0x222F, + /* Array index: 0x0658 */ 0x53FF,0x2335, + /* Array index: 0x0658 */ 0x5400,0x2337, + /* Array index: 0x0658 */ 0x5405,0x2339, + /* Array index: 0x0658 */ 0x5413,0x233A, + /* Array index: 0x0658 */ 0x5415,0x233B, + /* Array index: 0x0658 */ 0x5416,0x2334, + /* Array index: 0x0658 */ 0x541A,0x2476, + /* Array index: 0x0658 */ 0x542F,0x2524, + /* Array index: 0x0658 */ 0x5432,0x2477, + /* Array index: 0x0658 */ 0x5434,0x247B, + /* Array index: 0x0658 */ 0x543A,0x2470, + /* Array index: 0x0658 */ 0x543F,0x2521, + /* Array index: 0x0658 */ 0x5444,0x2473, + /* Array index: 0x0658 */ 0x545A,0x2523, + /* Array index: 0x0658 */ 0x545F,0x276E, + /* Array index: 0x0658 */ 0x5469,0x2774, + /* Array index: 0x0658 */ 0x546A,0x2778, + /* Array index: 0x0658 */ 0x546D,0x2775, + /* Array index: 0x0658 */ 0x5479,0x2771, + /* Array index: 0x0658 */ 0x5485,0x276C, + /* Array index: 0x0658 */ 0x5489,0x2770, + /* Array index: 0x0658 */ 0x548A,0x2779, + /* Array index: 0x0658 */ 0x548F,0x2773, + /* Array index: 0x0658 */ 0x5493,0x276F, + /* Array index: 0x0658 */ 0x5494,0x2777, + /* Array index: 0x0658 */ 0x549E,0x2B5C, + /* Array index: 0x0658 */ 0x549F,0x2B5D, + /* Array index: 0x0658 */ 0x54A3,0x2B57, + /* Array index: 0x0658 */ 0x54A4,0x2B59, + /* Array index: 0x0658 */ 0x54B2,0x2B5B, + /* Array index: 0x0658 */ 0x54B4,0x2B54, + /* Array index: 0x0658 */ 0x54B5,0x2B5E, + /* Array index: 0x0658 */ 0x54B9,0x2B51, + /* Array index: 0x0658 */ 0x54D0,0x2B53, + /* Array index: 0x0658 */ 0x54DA,0x2B58, + /* Array index: 0x0658 */ 0x54EF,0x2F77, + /* Array index: 0x0658 */ 0x54F0,0x3021, + /* Array index: 0x0658 */ 0x54F9,0x2F79, + /* Array index: 0x0658 */ 0x5500,0x2F7B, + /* Array index: 0x0658 */ 0x5502,0x2F7A, + /* Array index: 0x0658 */ 0x550D,0x2F73, + /* Array index: 0x0658 */ 0x5513,0x2F76, + /* Array index: 0x0658 */ 0x5518,0x2F7E, + /* Array index: 0x0658 */ 0x5519,0x3025, + /* Array index: 0x0658 */ 0x5528,0x6721, + /* Array index: 0x0658 */ 0x5529,0x345F, + /* Array index: 0x0658 */ 0x552B,0x3468, + /* Array index: 0x0658 */ 0x553A,0x3466, + /* Array index: 0x0658 */ 0x553F,0x3467, + /* Array index: 0x0658 */ 0x5549,0x345B, + /* Array index: 0x0658 */ 0x554C,0x3458, + /* Array index: 0x0658 */ 0x5553,0x3462, + /* Array index: 0x0658 */ 0x5554,0x3461, + /* Array index: 0x0658 */ 0x555D,0x345E, + /* Array index: 0x0658 */ 0x5568,0x3459, + /* Array index: 0x0658 */ 0x556B,0x6457, + /* Array index: 0x0658 */ 0x557A,0x3A3C, + /* Array index: 0x0658 */ 0x5585,0x3A31, + /* Array index: 0x0658 */ 0x5586,0x3A38, + /* Array index: 0x0658 */ 0x5596,0x3A2E, + /* Array index: 0x0658 */ 0x5597,0x3A2A, + /* Array index: 0x0658 */ 0x559B,0x3A33, + /* Array index: 0x0658 */ 0x559E,0x3A40, + /* Array index: 0x0658 */ 0x55A0,0x3A34, + /* Array index: 0x0658 */ 0x55A9,0x3A42, + /* Array index: 0x0658 */ 0x55AF,0x3A3B, + /* Array index: 0x0658 */ 0x55B4,0x3A2F, + /* Array index: 0x0658 */ 0x55BA,0x6723, + /* Array index: 0x0658 */ 0x55C1,0x4051, + /* Array index: 0x0658 */ 0x55D7,0x404E, + /* Array index: 0x0658 */ 0x55DE,0x3A2B, + /* Array index: 0x0658 */ 0x55EA,0x404C, + /* Array index: 0x0658 */ 0x55EE,0x6725, + /* Array index: 0x0658 */ 0x55F0,0x6724, + /* Array index: 0x0658 */ 0x55F4,0x6458, + /* Array index: 0x0658 */ 0x55F8,0x462E, + /* Array index: 0x0658 */ 0x55FB,0x4628, + /* Array index: 0x0658 */ 0x5603,0x4629, + /* Array index: 0x0658 */ 0x5605,0x4636, + /* Array index: 0x0658 */ 0x5607,0x462C, + /* Array index: 0x0658 */ 0x560B,0x462A, + /* Array index: 0x0658 */ 0x5611,0x4634, + /* Array index: 0x0658 */ 0x5618,0x4633, + /* Array index: 0x0658 */ 0x561E,0x4631, + /* Array index: 0x0658 */ 0x5620,0x645A, + /* Array index: 0x0658 */ 0x5622,0x6459, + /* Array index: 0x0658 */ 0x5626,0x4650, + /* Array index: 0x0658 */ 0x5628,0x4630, + /* Array index: 0x0658 */ 0x562B,0x4B41, + /* Array index: 0x0658 */ 0x562D,0x4B38, + /* Array index: 0x0658 */ 0x5631,0x4B3D, + /* Array index: 0x0658 */ 0x5637,0x4B44, + /* Array index: 0x0658 */ 0x5644,0x4B3E, + /* Array index: 0x0658 */ 0x5647,0x4B37, + /* Array index: 0x0658 */ 0x564B,0x4B3B, + /* Array index: 0x0658 */ 0x565F,0x503F, + /* Array index: 0x0658 */ 0x5661,0x5040, + /* Array index: 0x0658 */ 0x5667,0x503B, + /* Array index: 0x0658 */ 0x567B,0x503D, + /* Array index: 0x0658 */ 0x567D,0x5448, + /* Array index: 0x0658 */ 0x5689,0x5449, + /* Array index: 0x0658 */ 0x568A,0x5447, + /* Array index: 0x0658 */ 0x5691,0x645D, + /* Array index: 0x0658 */ 0x5692,0x645B, + /* Array index: 0x0658 */ 0x5694,0x575B, + /* Array index: 0x0658 */ 0x5696,0x575A, + /* Array index: 0x0658 */ 0x569B,0x5758, + /* Array index: 0x0658 */ 0x56AF,0x5A2D, + /* Array index: 0x0658 */ 0x56B0,0x645E, + /* Array index: 0x0658 */ 0x56C4,0x6728, + /* Array index: 0x0658 */ 0x56C7,0x5F40, + /* Array index: 0x0658 */ 0x56D2,0x6071, + /* Array index: 0x0658 */ 0x56D8,0x2177, + /* Array index: 0x0658 */ 0x56E3,0x233E, + /* Array index: 0x0658 */ 0x56E6,0x252C, + /* Array index: 0x0658 */ 0x56E9,0x2526, + /* Array index: 0x0658 */ 0x56EC,0x252B, + /* Array index: 0x0658 */ 0x56ED,0x252A, + /* Array index: 0x0658 */ 0x56F6,0x2822, + /* Array index: 0x0658 */ 0x56F8,0x277D, + /* Array index: 0x0658 */ 0x5700,0x2B65, + /* Array index: 0x0658 */ 0x5705,0x3027, + /* Array index: 0x0658 */ 0x570E,0x3A44, + /* Array index: 0x0658 */ 0x570F,0x3A43, + /* Array index: 0x0658 */ 0x5715,0x4052, + /* Array index: 0x0658 */ 0x5717,0x4637, + /* Array index: 0x0658 */ 0x571D,0x5F41, + /* Array index: 0x0658 */ 0x5721,0x2161, + /* Array index: 0x0658 */ 0x5724,0x2234, + /* Array index: 0x0658 */ 0x5727,0x6249, + /* Array index: 0x0658 */ 0x5731,0x2341, + /* Array index: 0x0658 */ 0x5732,0x2342, + /* Array index: 0x0658 */ 0x5735,0x233F, + /* Array index: 0x0658 */ 0x5736,0x2340, + /* Array index: 0x0658 */ 0x573C,0x2531, + /* Array index: 0x0658 */ 0x573D,0x253E, + /* Array index: 0x0658 */ 0x573F,0x2530, + /* Array index: 0x0658 */ 0x575F,0x2535, + /* Array index: 0x0658 */ 0x5763,0x2825, + /* Array index: 0x0658 */ 0x5765,0x2823, + /* Array index: 0x0658 */ 0x5767,0x2826, + /* Array index: 0x0658 */ 0x576E,0x2828, + /* Array index: 0x0658 */ 0x5778,0x2829, + /* Array index: 0x0658 */ 0x577F,0x282A, + /* Array index: 0x0658 */ 0x5781,0x2824, + /* Array index: 0x0658 */ 0x578A,0x6460, + /* Array index: 0x0658 */ 0x5796,0x2B71, + /* Array index: 0x0658 */ 0x579C,0x2B70, + /* Array index: 0x0658 */ 0x57A1,0x2B6B, + /* Array index: 0x0658 */ 0x57AC,0x2B66, + /* Array index: 0x0658 */ 0x57B7,0x302A, + /* Array index: 0x0658 */ 0x57BB,0x3030, + /* Array index: 0x0658 */ 0x57BE,0x302F, + /* Array index: 0x0658 */ 0x57C0,0x3038, + /* Array index: 0x0658 */ 0x57CD,0x302B, + /* Array index: 0x0658 */ 0x57D1,0x3036, + /* Array index: 0x0658 */ 0x57DB,0x3032, + /* Array index: 0x0658 */ 0x57DD,0x346E, + /* Array index: 0x0658 */ 0x57DE,0x3471, + /* Array index: 0x0658 */ 0x57E6,0x3472, + /* Array index: 0x0658 */ 0x57E8,0x3474, + /* Array index: 0x0658 */ 0x57EA,0x3469, + /* Array index: 0x0658 */ 0x57EF,0x346B, + /* Array index: 0x0658 */ 0x57FE,0x346F, + /* Array index: 0x0658 */ 0x57FF,0x3475, + /* Array index: 0x0658 */ 0x5803,0x3476, + /* Array index: 0x0658 */ 0x580F,0x6461, + /* Array index: 0x0658 */ 0x5812,0x6462, + /* Array index: 0x0658 */ 0x5813,0x6463, + /* Array index: 0x0658 */ 0x5818,0x3A4A, + /* Array index: 0x0658 */ 0x581A,0x3A45, + /* Array index: 0x0658 */ 0x581F,0x3A47, + /* Array index: 0x0658 */ 0x5822,0x3A50, + /* Array index: 0x0658 */ 0x5826,0x3A4C, + /* Array index: 0x0658 */ 0x582B,0x6336, + /* Array index: 0x0658 */ 0x583A,0x3A4E, + /* Array index: 0x0658 */ 0x583C,0x3A49, + /* Array index: 0x0658 */ 0x583E,0x3A4B, + /* Array index: 0x0658 */ 0x5845,0x6337, + /* Array index: 0x0658 */ 0x5847,0x6464, + /* Array index: 0x0658 */ 0x5850,0x4057, + /* Array index: 0x0658 */ 0x5856,0x405B, + /* Array index: 0x0658 */ 0x585C,0x4056, + /* Array index: 0x0658 */ 0x5872,0x4643, + /* Array index: 0x0658 */ 0x5873,0x463E, + /* Array index: 0x0658 */ 0x5877,0x4642, + /* Array index: 0x0658 */ 0x5878,0x463C, + /* Array index: 0x0658 */ 0x5884,0x463D, + /* Array index: 0x0658 */ 0x588C,0x463A, + /* Array index: 0x0658 */ 0x588D,0x4645, + /* Array index: 0x0658 */ 0x5892,0x4638, + /* Array index: 0x0658 */ 0x589B,0x6465, + /* Array index: 0x0658 */ 0x58A2,0x4B46, + /* Array index: 0x0658 */ 0x58A4,0x4B50, + /* Array index: 0x0658 */ 0x58A7,0x4B51, + /* Array index: 0x0658 */ 0x58AA,0x4B4B, + /* Array index: 0x0658 */ 0x58AD,0x463F, + /* Array index: 0x0658 */ 0x58B0,0x4B4D, + /* Array index: 0x0658 */ 0x58B2,0x4B49, + /* Array index: 0x0658 */ 0x58B4,0x4B4F, + /* Array index: 0x0658 */ 0x58B5,0x4B4C, + /* Array index: 0x0658 */ 0x58B7,0x4B47, + /* Array index: 0x0658 */ 0x58BB,0x504A, + /* Array index: 0x0658 */ 0x58C0,0x504B, + /* Array index: 0x0658 */ 0x58C3,0x5048, + /* Array index: 0x0658 */ 0x58C4,0x504C, + /* Array index: 0x0658 */ 0x58CA,0x5049, + /* Array index: 0x0658 */ 0x58CD,0x544B, + /* Array index: 0x0658 */ 0x58D0,0x544C, + /* Array index: 0x0658 */ 0x58DC,0x5A2F, + /* Array index: 0x0658 */ 0x58E0,0x5A2E, + /* Array index: 0x0658 */ 0x58E6,0x5E28, + /* Array index: 0x0658 */ 0x58FB,0x3A52, + /* Array index: 0x0658 */ 0x5910,0x4646, + /* Array index: 0x0658 */ 0x5911,0x6560, + /* Array index: 0x0658 */ 0x5918,0x2236, + /* Array index: 0x0658 */ 0x591F,0x3479, + /* Array index: 0x0658 */ 0x5923,0x405F, + /* Array index: 0x0658 */ 0x5926,0x4B53, + /* Array index: 0x0658 */ 0x5930,0x2238, + /* Array index: 0x0658 */ 0x5932,0x2237, + /* Array index: 0x0658 */ 0x5934,0x2239, + /* Array index: 0x0658 */ 0x5936,0x2347, + /* Array index: 0x0658 */ 0x593D,0x2549, + /* Array index: 0x0658 */ 0x5952,0x2B7C, + /* Array index: 0x0658 */ 0x595B,0x347B, + /* Array index: 0x0658 */ 0x595D,0x347C, + /* Array index: 0x0658 */ 0x595E,0x347D, + /* Array index: 0x0658 */ 0x5963,0x3A53, + /* Array index: 0x0658 */ 0x5964,0x3A54, + /* Array index: 0x0658 */ 0x5966,0x4060, + /* Array index: 0x0658 */ 0x5968,0x4061, + /* Array index: 0x0658 */ 0x596C,0x4648, + /* Array index: 0x0658 */ 0x5975,0x223B, + /* Array index: 0x0658 */ 0x597A,0x234B, + /* Array index: 0x0658 */ 0x5986,0x234D, + /* Array index: 0x0658 */ 0x5989,0x2555, + /* Array index: 0x0658 */ 0x598C,0x254C, + /* Array index: 0x0658 */ 0x5994,0x254B, + /* Array index: 0x0658 */ 0x599F,0x2551, + /* Array index: 0x0658 */ 0x59AC,0x2841, + /* Array index: 0x0658 */ 0x59AD,0x2833, + /* Array index: 0x0658 */ 0x59B0,0x2838, + /* Array index: 0x0658 */ 0x59B7,0x2845, + /* Array index: 0x0658 */ 0x59B8,0x2840, + /* Array index: 0x0658 */ 0x59BF,0x283D, + /* Array index: 0x0658 */ 0x59C2,0x2837, + /* Array index: 0x0658 */ 0x59C4,0x2835, + /* Array index: 0x0658 */ 0x59C9,0x283F, + /* Array index: 0x0658 */ 0x59D5,0x2C26, + /* Array index: 0x0658 */ 0x59D7,0x2846, + /* Array index: 0x0658 */ 0x59D9,0x2C2D, + /* Array index: 0x0658 */ 0x59DF,0x2C21, + /* Array index: 0x0658 */ 0x59E2,0x2C2C, + /* Array index: 0x0658 */ 0x59E7,0x2C2E, + /* Array index: 0x0658 */ 0x59EB,0x2C23, + /* Array index: 0x0658 */ 0x59EF,0x2C24, + /* Array index: 0x0658 */ 0x59F0,0x2C25, + /* Array index: 0x0658 */ 0x59F8,0x2C2B, + /* Array index: 0x0658 */ 0x59F9,0x2C29, + /* Array index: 0x0658 */ 0x5A02,0x2C2A, + /* Array index: 0x0658 */ 0x5A04,0x2C28, + /* Array index: 0x0658 */ 0x5A0B,0x3040, + /* Array index: 0x0658 */ 0x5A0D,0x2C27, + /* Array index: 0x0658 */ 0x5A10,0x6270, + /* Array index: 0x0658 */ 0x5A12,0x304F, + /* Array index: 0x0658 */ 0x5A14,0x304A, + /* Array index: 0x0658 */ 0x5A1A,0x304E, + /* Array index: 0x0658 */ 0x5A1D,0x303E, + /* Array index: 0x0658 */ 0x5A21,0x303B, + /* Array index: 0x0658 */ 0x5A22,0x3045, + /* Array index: 0x0658 */ 0x5A24,0x3048, + /* Array index: 0x0658 */ 0x5A26,0x3052, + /* Array index: 0x0658 */ 0x5A2F,0x304D, + /* Array index: 0x0658 */ 0x5A31,0x304B, + /* Array index: 0x0658 */ 0x5A3A,0x3528, + /* Array index: 0x0658 */ 0x5A3B,0x3524, + /* Array index: 0x0658 */ 0x5A3D,0x3531, + /* Array index: 0x0658 */ 0x5A3F,0x3533, + /* Array index: 0x0658 */ 0x5A45,0x352E, + /* Array index: 0x0658 */ 0x5A4B,0x352A, + /* Array index: 0x0658 */ 0x5A4E,0x352F, + /* Array index: 0x0658 */ 0x5A4F,0x353B, + /* Array index: 0x0658 */ 0x5A54,0x353A, + /* Array index: 0x0658 */ 0x5A59,0x3539, + /* Array index: 0x0658 */ 0x5A61,0x3527, + /* Array index: 0x0658 */ 0x5A63,0x353C, + /* Array index: 0x0658 */ 0x5A68,0x3530, + /* Array index: 0x0658 */ 0x5A6B,0x352B, + /* Array index: 0x0658 */ 0x5A6E,0x3529, + /* Array index: 0x0658 */ 0x5A6F,0x3534, + /* Array index: 0x0658 */ 0x5A71,0x3532, + /* Array index: 0x0658 */ 0x5A73,0x3537, + /* Array index: 0x0658 */ 0x5A75,0x3535, + /* Array index: 0x0658 */ 0x5A79,0x3A75, + /* Array index: 0x0658 */ 0x5A8D,0x3A7B, + /* Array index: 0x0658 */ 0x5A91,0x3A66, + /* Array index: 0x0658 */ 0x5A96,0x3A62, + /* Array index: 0x0658 */ 0x5A98,0x3A5C, + /* Array index: 0x0658 */ 0x5A99,0x3A5E, + /* Array index: 0x0658 */ 0x5AA8,0x3A56, + /* Array index: 0x0658 */ 0x5AAA,0x3A79, + /* Array index: 0x0658 */ 0x5AAB,0x3A78, + /* Array index: 0x0658 */ 0x5AC3,0x4067, + /* Array index: 0x0658 */ 0x5AC5,0x4066, + /* Array index: 0x0658 */ 0x5AE4,0x464C, + /* Array index: 0x0658 */ 0x5AE7,0x464A, + /* Array index: 0x0658 */ 0x5AEF,0x464F, + /* Array index: 0x0658 */ 0x5AF0,0x4653, + /* Array index: 0x0658 */ 0x5AFA,0x4B5C, + /* Array index: 0x0658 */ 0x5AFC,0x4B58, + /* Array index: 0x0658 */ 0x5AFE,0x4B54, + /* Array index: 0x0658 */ 0x5B00,0x4B5E, + /* Array index: 0x0658 */ 0x5B04,0x4B56, + /* Array index: 0x0658 */ 0x5B06,0x4B5A, + /* Array index: 0x0658 */ 0x5B0A,0x4B5B, + /* Array index: 0x0658 */ 0x5B0D,0x4B5D, + /* Array index: 0x0658 */ 0x5B0E,0x4B5F, + /* Array index: 0x0658 */ 0x5B11,0x5050, + /* Array index: 0x0658 */ 0x5B12,0x5053, + /* Array index: 0x0658 */ 0x5B15,0x5051, + /* Array index: 0x0658 */ 0x5B18,0x504F, + /* Array index: 0x0658 */ 0x5B1C,0x5054, + /* Array index: 0x0658 */ 0x5B1F,0x504E, + /* Array index: 0x0658 */ 0x5B22,0x5056, + /* Array index: 0x0658 */ 0x5B29,0x5450, + /* Array index: 0x0658 */ 0x5B2B,0x544E, + /* Array index: 0x0658 */ 0x5B31,0x5452, + /* Array index: 0x0658 */ 0x5B33,0x544F, + /* Array index: 0x0658 */ 0x5B35,0x5451, + /* Array index: 0x0658 */ 0x5B42,0x5C36, + /* Array index: 0x0658 */ 0x5B44,0x5C39, + /* Array index: 0x0658 */ 0x5B46,0x5C3A, + /* Array index: 0x0658 */ 0x5B49,0x5E29, + /* Array index: 0x0658 */ 0x5B4A,0x5F42, + /* Array index: 0x0658 */ 0x5B4F,0x6073, + /* Array index: 0x0658 */ 0x5B60,0x2848, + /* Array index: 0x0658 */ 0x5B66,0x625C, + /* Array index: 0x0658 */ 0x5B67,0x646A, + /* Array index: 0x0658 */ 0x5B6A,0x2C2F, + /* Array index: 0x0658 */ 0x5B74,0x4071, + /* Array index: 0x0658 */ 0x5B76,0x4072, + /* Array index: 0x0658 */ 0x5B79,0x5057, + /* Array index: 0x0658 */ 0x5B7C,0x5A34, + /* Array index: 0x0658 */ 0x5B7E,0x5C3B, + /* Array index: 0x0658 */ 0x5B80,0x213B, + /* Array index: 0x0658 */ 0x5B82,0x223D, + /* Array index: 0x0658 */ 0x5B86,0x2350, + /* Array index: 0x0658 */ 0x5B8D,0x255A, + /* Array index: 0x0658 */ 0x5B94,0x284C, + /* Array index: 0x0658 */ 0x5B96,0x284A, + /* Array index: 0x0658 */ 0x5BAB,0x2C32, + /* Array index: 0x0658 */ 0x5BB7,0x3057, + /* Array index: 0x0658 */ 0x5BBB,0x3056, + /* Array index: 0x0658 */ 0x5BBC,0x3055, + /* Array index: 0x0658 */ 0x5BC3,0x3541, + /* Array index: 0x0658 */ 0x5BC8,0x353F, + /* Array index: 0x0658 */ 0x5BD5,0x3A7E, + /* Array index: 0x0658 */ 0x5BD7,0x4074, + /* Array index: 0x0658 */ 0x5BF3,0x5A35, + /* Array index: 0x0658 */ 0x5BF7,0x5E2A, + /* Array index: 0x0658 */ 0x5BF9,0x223E, + /* Array index: 0x0658 */ 0x5C05,0x3058, + /* Array index: 0x0658 */ 0x5C06,0x3059, + /* Array index: 0x0658 */ 0x5C13,0x624A, + /* Array index: 0x0658 */ 0x5C14,0x223F, + /* Array index: 0x0658 */ 0x5C18,0x2352, + /* Array index: 0x0658 */ 0x5C19,0x2851, + /* Array index: 0x0658 */ 0x5C1B,0x2C34, + /* Array index: 0x0658 */ 0x5C1E,0x3B24, + /* Array index: 0x0658 */ 0x5C20,0x4078, + /* Array index: 0x0658 */ 0x5C21,0x6525, + /* Array index: 0x0658 */ 0x5C2B,0x255F, + /* Array index: 0x0658 */ 0x5C2F,0x2C35, + /* Array index: 0x0658 */ 0x5C36,0x5454, + /* Array index: 0x0658 */ 0x5C3D,0x2354, + /* Array index: 0x0658 */ 0x5C49,0x2854, + /* Array index: 0x0658 */ 0x5C4A,0x2855, + /* Array index: 0x0658 */ 0x5C52,0x305A, + /* Array index: 0x0658 */ 0x5C53,0x305B, + /* Array index: 0x0658 */ 0x5C57,0x646B, + /* Array index: 0x0658 */ 0x5C5B,0x3543, + /* Array index: 0x0658 */ 0x5C5E,0x3B26, + /* Array index: 0x0658 */ 0x5C5F,0x3B25, + /* Array index: 0x0658 */ 0x5C61,0x3544, + /* Array index: 0x0658 */ 0x5C6B,0x5A38, + /* Array index: 0x0658 */ 0x5C77,0x646C, + /* Array index: 0x0658 */ 0x5C78,0x2355, + /* Array index: 0x0658 */ 0x5C80,0x235A, + /* Array index: 0x0658 */ 0x5C84,0x2561, + /* Array index: 0x0658 */ 0x5C85,0x2566, + /* Array index: 0x0658 */ 0x5C8E,0x2562, + /* Array index: 0x0658 */ 0x5C9C,0x2563, + /* Array index: 0x0658 */ 0x5C9E,0x285D, + /* Array index: 0x0658 */ 0x5CB4,0x285E, + /* Array index: 0x0658 */ 0x5CC1,0x2858, + /* Array index: 0x0658 */ 0x5CCD,0x2C3F, + /* Array index: 0x0658 */ 0x5CD1,0x2C3B, + /* Array index: 0x0658 */ 0x5CD5,0x646D, + /* Array index: 0x0658 */ 0x5CDC,0x2C3C, + /* Array index: 0x0658 */ 0x5CDD,0x2C42, + /* Array index: 0x0658 */ 0x5CE1,0x2C3E, + /* Array index: 0x0658 */ 0x5CE2,0x2C41, + /* Array index: 0x0658 */ 0x5CE5,0x2C43, + /* Array index: 0x0658 */ 0x5CE6,0x2C3D, + /* Array index: 0x0658 */ 0x5CE9,0x3063, + /* Array index: 0x0658 */ 0x5CEB,0x305F, + /* Array index: 0x0658 */ 0x5CEF,0x3064, + /* Array index: 0x0658 */ 0x5CF3,0x3061, + /* Array index: 0x0658 */ 0x5CF5,0x3062, + /* Array index: 0x0658 */ 0x5CFA,0x305E, + /* Array index: 0x0658 */ 0x5CFC,0x6271, + /* Array index: 0x0658 */ 0x5CFE,0x6272, + /* Array index: 0x0658 */ 0x5D10,0x3551, + /* Array index: 0x0658 */ 0x5D13,0x3552, + /* Array index: 0x0658 */ 0x5D15,0x354F, + /* Array index: 0x0658 */ 0x5D18,0x3555, + /* Array index: 0x0658 */ 0x5D1C,0x3B2B, + /* Array index: 0x0658 */ 0x5D21,0x3546, + /* Array index: 0x0658 */ 0x5D2A,0x354E, + /* Array index: 0x0658 */ 0x5D2C,0x354A, + /* Array index: 0x0658 */ 0x5D2F,0x3554, + /* Array index: 0x0658 */ 0x5D3B,0x3B36, + /* Array index: 0x0658 */ 0x5D3E,0x3B28, + /* Array index: 0x0658 */ 0x5D44,0x3B27, + /* Array index: 0x0658 */ 0x5D46,0x3B37, + /* Array index: 0x0658 */ 0x5D48,0x3B2A, + /* Array index: 0x0658 */ 0x5D4D,0x3B2E, + /* Array index: 0x0658 */ 0x5D4F,0x3B34, + /* Array index: 0x0658 */ 0x5D53,0x3B33, + /* Array index: 0x0658 */ 0x5D57,0x3B31, + /* Array index: 0x0658 */ 0x5D5B,0x3B2D, + /* Array index: 0x0658 */ 0x5D60,0x4121, + /* Array index: 0x0658 */ 0x5D64,0x407C, + /* Array index: 0x0658 */ 0x5D66,0x407A, + /* Array index: 0x0658 */ 0x5D6D,0x4079, + /* Array index: 0x0658 */ 0x5D6E,0x407D, + /* Array index: 0x0658 */ 0x5D75,0x646E, + /* Array index: 0x0658 */ 0x5D78,0x465C, + /* Array index: 0x0658 */ 0x5D7B,0x4654, + /* Array index: 0x0658 */ 0x5D83,0x4656, + /* Array index: 0x0658 */ 0x5D96,0x4B6B, + /* Array index: 0x0658 */ 0x5D98,0x4B67, + /* Array index: 0x0658 */ 0x5D9B,0x4B69, + /* Array index: 0x0658 */ 0x5DAB,0x505B, + /* Array index: 0x0658 */ 0x5DB3,0x505A, + /* Array index: 0x0658 */ 0x5DB6,0x6471, + /* Array index: 0x0658 */ 0x5DB9,0x5457, + /* Array index: 0x0658 */ 0x5DBB,0x5459, + /* Array index: 0x0658 */ 0x5DBE,0x5455, + /* Array index: 0x0658 */ 0x5DBF,0x6472, + /* Array index: 0x0658 */ 0x5DC1,0x5762, + /* Array index: 0x0658 */ 0x5DC4,0x5A39, + /* Array index: 0x0658 */ 0x5DC8,0x5C3D, + /* Array index: 0x0658 */ 0x5DCA,0x5C3C, + /* Array index: 0x0658 */ 0x5DCC,0x5C3E, + /* Array index: 0x0658 */ 0x5DD0,0x5E2D, + /* Array index: 0x0658 */ 0x5DD3,0x5F43, + /* Array index: 0x0658 */ 0x5DD7,0x6030, + /* Array index: 0x0658 */ 0x5DDB,0x213C, + /* Array index: 0x0658 */ 0x5DE3,0x3557, + /* Array index: 0x0658 */ 0x5DE4,0x4B6C, + /* Array index: 0x0658 */ 0x5DF5,0x2567, + /* Array index: 0x0658 */ 0x5DF6,0x2860, + /* Array index: 0x0658 */ 0x5DFA,0x2C45, + /* Array index: 0x0658 */ 0x5DFB,0x2C44, + /* Array index: 0x0658 */ 0x5E00,0x2163, + /* Array index: 0x0658 */ 0x5E08,0x235C, + /* Array index: 0x0658 */ 0x5E09,0x2568, + /* Array index: 0x0658 */ 0x5E0B,0x256B, + /* Array index: 0x0658 */ 0x5E12,0x2862, + /* Array index: 0x0658 */ 0x5E13,0x2861, + /* Array index: 0x0658 */ 0x5E1E,0x2C46, + /* Array index: 0x0658 */ 0x5E2A,0x3066, + /* Array index: 0x0658 */ 0x5E35,0x3559, + /* Array index: 0x0658 */ 0x5E39,0x3558, + /* Array index: 0x0658 */ 0x5E3A,0x355A, + /* Array index: 0x0658 */ 0x5E42,0x3979, + /* Array index: 0x0658 */ 0x5E52,0x465D, + /* Array index: 0x0658 */ 0x5E5A,0x4B6D, + /* Array index: 0x0658 */ 0x5E5E,0x4B70, + /* Array index: 0x0658 */ 0x5E65,0x6473, + /* Array index: 0x0658 */ 0x5E71,0x6677, + /* Array index: 0x0658 */ 0x5E77,0x2863, + /* Array index: 0x0658 */ 0x5E7A,0x213D, + /* Array index: 0x0658 */ 0x5E7F,0x213E, + /* Array index: 0x0658 */ 0x5E81,0x2247, + /* Array index: 0x0658 */ 0x5E83,0x2248, + /* Array index: 0x0658 */ 0x5E85,0x6678, + /* Array index: 0x0658 */ 0x5E90,0x256E, + /* Array index: 0x0658 */ 0x5E92,0x256D, + /* Array index: 0x0658 */ 0x5E98,0x2865, + /* Array index: 0x0658 */ 0x5E99,0x2867, + /* Array index: 0x0658 */ 0x5E9D,0x2868, + /* Array index: 0x0658 */ 0x5EA1,0x2C48, + /* Array index: 0x0658 */ 0x5EA9,0x306C, + /* Array index: 0x0658 */ 0x5EAF,0x306B, + /* Array index: 0x0658 */ 0x5EBA,0x3561, + /* Array index: 0x0658 */ 0x5EBB,0x3560, + /* Array index: 0x0658 */ 0x5EBD,0x3B3F, + /* Array index: 0x0658 */ 0x5EBF,0x3B40, + /* Array index: 0x0658 */ 0x5EC0,0x3B3E, + /* Array index: 0x0658 */ 0x5ECD,0x6474, + /* Array index: 0x0658 */ 0x5ECF,0x4661, + /* Array index: 0x0658 */ 0x5ED0,0x4660, + /* Array index: 0x0658 */ 0x5EEA,0x505C, + /* Array index: 0x0658 */ 0x5EED,0x6475, + /* Array index: 0x0658 */ 0x5EF0,0x5C3F, + /* Array index: 0x0658 */ 0x5EF4,0x213F, + /* Array index: 0x0658 */ 0x5EF5,0x2361, + /* Array index: 0x0658 */ 0x5F03,0x256F, + /* Array index: 0x0658 */ 0x5F06,0x286D, + /* Array index: 0x0658 */ 0x5F11,0x3B42, + /* Array index: 0x0658 */ 0x5F1E,0x2571, + /* Array index: 0x0658 */ 0x5F21,0x286E, + /* Array index: 0x0658 */ 0x5F25,0x2870, + /* Array index: 0x0658 */ 0x5F2F,0x2C4D, + /* Array index: 0x0658 */ 0x5F32,0x306F, + /* Array index: 0x0658 */ 0x5F34,0x3562, + /* Array index: 0x0658 */ 0x5F3E,0x3B44, + /* Array index: 0x0658 */ 0x5F42,0x4122, + /* Array index: 0x0658 */ 0x5F4D,0x5763, + /* Array index: 0x0658 */ 0x5F5A,0x4123, + /* Array index: 0x0658 */ 0x5F5B,0x505E, + /* Array index: 0x0658 */ 0x5F5D,0x5764, + /* Array index: 0x0658 */ 0x5F60,0x6164, + /* Array index: 0x0658 */ 0x5F61,0x2142, + /* Array index: 0x0658 */ 0x5F63,0x2572, + /* Array index: 0x0658 */ 0x5F66,0x2C50, + /* Array index: 0x0658 */ 0x5F6E,0x4124, + /* Array index: 0x0658 */ 0x5F72,0x5F45, + /* Array index: 0x0658 */ 0x5F83,0x2876, + /* Array index: 0x0658 */ 0x5F84,0x2875, + /* Array index: 0x0658 */ 0x5F93,0x3071, + /* Array index: 0x0658 */ 0x5F94,0x6476, + /* Array index: 0x0658 */ 0x5F9A,0x6477, + /* Array index: 0x0658 */ 0x5FA7,0x3B4B, + /* Array index: 0x0658 */ 0x5FB3,0x4663, + /* Array index: 0x0658 */ 0x5FB4,0x4664, + /* Array index: 0x0658 */ 0x5FB8,0x4B72, + /* Array index: 0x0658 */ 0x5FBA,0x6478, + /* Array index: 0x0658 */ 0x5FC2,0x5E2F, + /* Array index: 0x0658 */ 0x5FC7,0x224D, + /* Array index: 0x0658 */ 0x5FC8,0x6251, + /* Array index: 0x0658 */ 0x5FCA,0x224C, + /* Array index: 0x0658 */ 0x5FCE,0x2578, + /* Array index: 0x0658 */ 0x5FD3,0x2366, + /* Array index: 0x0658 */ 0x5FDF,0x257B, + /* Array index: 0x0658 */ 0x5FE6,0x2576, + /* Array index: 0x0658 */ 0x5FE7,0x2574, + /* Array index: 0x0658 */ 0x5FE9,0x287E, + /* Array index: 0x0658 */ 0x5FEC,0x257C, + /* Array index: 0x0658 */ 0x5FF0,0x2622, + /* Array index: 0x0658 */ 0x5FF2,0x2621, + /* Array index: 0x0658 */ 0x5FF6,0x257D, + /* Array index: 0x0658 */ 0x5FF9,0x2623, + /* Array index: 0x0658 */ 0x5FFC,0x257A, + /* Array index: 0x0658 */ 0x5FFE,0x2575, + /* Array index: 0x0658 */ 0x6007,0x2878, + /* Array index: 0x0658 */ 0x6008,0x2922, + /* Array index: 0x0658 */ 0x6018,0x6266, + /* Array index: 0x0658 */ 0x6023,0x2C5A, + /* Array index: 0x0658 */ 0x6030,0x2877, + /* Array index: 0x0658 */ 0x6031,0x2C5B, + /* Array index: 0x0658 */ 0x6036,0x287A, + /* Array index: 0x0658 */ 0x603D,0x2921, + /* Array index: 0x0658 */ 0x6048,0x6267, + /* Array index: 0x0658 */ 0x604A,0x2C60, + /* Array index: 0x0658 */ 0x604B,0x3079, + /* Array index: 0x0658 */ 0x6056,0x307E, + /* Array index: 0x0658 */ 0x605C,0x2C54, + /* Array index: 0x0658 */ 0x6060,0x2C5F, + /* Array index: 0x0658 */ 0x6061,0x2C61, + /* Array index: 0x0658 */ 0x607C,0x2C5C, + /* Array index: 0x0658 */ 0x607E,0x3076, + /* Array index: 0x0658 */ 0x608B,0x3122, + /* Array index: 0x0658 */ 0x6093,0x3125, + /* Array index: 0x0658 */ 0x6098,0x3568, + /* Array index: 0x0658 */ 0x6099,0x3074, + /* Array index: 0x0658 */ 0x609E,0x3127, + /* Array index: 0x0658 */ 0x60A1,0x3571, + /* Array index: 0x0658 */ 0x60A4,0x3572, + /* Array index: 0x0658 */ 0x60AE,0x3126, + /* Array index: 0x0658 */ 0x60B3,0x3B54, + /* Array index: 0x0658 */ 0x60D0,0x356A, + /* Array index: 0x0658 */ 0x60D2,0x3B56, + /* Array index: 0x0658 */ 0x60D6,0x3B55, + /* Array index: 0x0658 */ 0x60D7,0x356E, + /* Array index: 0x0658 */ 0x60DE,0x3579, + /* Array index: 0x0658 */ 0x60E3,0x3B58, + /* Array index: 0x0658 */ 0x60E5,0x3B59, + /* Array index: 0x0658 */ 0x60E7,0x3576, + /* Array index: 0x0658 */ 0x60E9,0x3B5A, + /* Array index: 0x0658 */ 0x60EA,0x3B4D, + /* Array index: 0x0658 */ 0x60EE,0x3574, + /* Array index: 0x0658 */ 0x60FD,0x3B5E, + /* Array index: 0x0658 */ 0x6107,0x3B4F, + /* Array index: 0x0658 */ 0x610C,0x3B51, + /* Array index: 0x0658 */ 0x6111,0x3B5D, + /* Array index: 0x0658 */ 0x6119,0x412B, + /* Array index: 0x0658 */ 0x6125,0x6479, + /* Array index: 0x0658 */ 0x612A,0x4129, + /* Array index: 0x0658 */ 0x6130,0x4127, + /* Array index: 0x0658 */ 0x6131,0x412C, + /* Array index: 0x0658 */ 0x6133,0x466F, + /* Array index: 0x0658 */ 0x6138,0x466E, + /* Array index: 0x0658 */ 0x613A,0x4128, + /* Array index: 0x0658 */ 0x613C,0x466C, + /* Array index: 0x0658 */ 0x613D,0x412E, + /* Array index: 0x0658 */ 0x6142,0x466D, + /* Array index: 0x0658 */ 0x6143,0x412A, + /* Array index: 0x0658 */ 0x6150,0x647A, + /* Array index: 0x0658 */ 0x6157,0x4B73, + /* Array index: 0x0658 */ 0x6159,0x4B7E, + /* Array index: 0x0658 */ 0x615C,0x4B74, + /* Array index: 0x0658 */ 0x6160,0x4671, + /* Array index: 0x0658 */ 0x6164,0x4B7C, + /* Array index: 0x0658 */ 0x6169,0x4672, + /* Array index: 0x0658 */ 0x616F,0x466A, + /* Array index: 0x0658 */ 0x6178,0x4C21, + /* Array index: 0x0658 */ 0x617B,0x4668, + /* Array index: 0x0658 */ 0x617D,0x4673, + /* Array index: 0x0658 */ 0x6181,0x466B, + /* Array index: 0x0658 */ 0x618F,0x4B7A, + /* Array index: 0x0658 */ 0x619C,0x4C29, + /* Array index: 0x0658 */ 0x619E,0x4C25, + /* Array index: 0x0658 */ 0x61A3,0x4B79, + /* Array index: 0x0658 */ 0x61A6,0x4B75, + /* Array index: 0x0658 */ 0x61B7,0x5061, + /* Array index: 0x0658 */ 0x61B9,0x5063, + /* Array index: 0x0658 */ 0x61BB,0x506A, + /* Array index: 0x0658 */ 0x61BD,0x5064, + /* Array index: 0x0658 */ 0x61C0,0x5066, + /* Array index: 0x0658 */ 0x61C4,0x506C, + /* Array index: 0x0658 */ 0x61D3,0x6679, + /* Array index: 0x0658 */ 0x61E2,0x545B, + /* Array index: 0x0658 */ 0x61F3,0x5765, + /* Array index: 0x0658 */ 0x6202,0x5F46, + /* Array index: 0x0658 */ 0x6205,0x613E, + /* Array index: 0x0658 */ 0x620F,0x236B, + /* Array index: 0x0658 */ 0x6213,0x2625, + /* Array index: 0x0658 */ 0x6218,0x2C63, + /* Array index: 0x0658 */ 0x621E,0x3B64, + /* Array index: 0x0658 */ 0x6228,0x4676, + /* Array index: 0x0658 */ 0x622C,0x4675, + /* Array index: 0x0658 */ 0x622F,0x4C2C, + /* Array index: 0x0658 */ 0x6231,0x506D, + /* Array index: 0x0658 */ 0x6245,0x3129, + /* Array index: 0x0658 */ 0x624F,0x2250, + /* Array index: 0x0658 */ 0x6257,0x236F, + /* Array index: 0x0658 */ 0x625D,0x236C, + /* Array index: 0x0658 */ 0x625F,0x236D, + /* Array index: 0x0658 */ 0x6267,0x236E, + /* Array index: 0x0658 */ 0x6275,0x2639, + /* Array index: 0x0658 */ 0x6278,0x262E, + /* Array index: 0x0658 */ 0x6282,0x262A, + /* Array index: 0x0658 */ 0x6285,0x2637, + /* Array index: 0x0658 */ 0x628B,0x262F, + /* Array index: 0x0658 */ 0x628D,0x2636, + /* Array index: 0x0658 */ 0x62B2,0x2926, + /* Array index: 0x0658 */ 0x62B7,0x2928, + /* Array index: 0x0658 */ 0x62BA,0x2925, + /* Array index: 0x0658 */ 0x62C0,0x2934, + /* Array index: 0x0658 */ 0x62C1,0x2932, + /* Array index: 0x0658 */ 0x62C5,0x2933, + /* Array index: 0x0658 */ 0x62D5,0x292E, + /* Array index: 0x0658 */ 0x62E4,0x2929, + /* Array index: 0x0658 */ 0x62EA,0x2C6D, + /* Array index: 0x0658 */ 0x6304,0x2C6F, + /* Array index: 0x0658 */ 0x6305,0x2C70, + /* Array index: 0x0658 */ 0x6317,0x2C6C, + /* Array index: 0x0658 */ 0x6319,0x3132, + /* Array index: 0x0658 */ 0x631B,0x3133, + /* Array index: 0x0658 */ 0x631F,0x2C6B, + /* Array index: 0x0658 */ 0x6321,0x2C6E, + /* Array index: 0x0658 */ 0x632E,0x312C, + /* Array index: 0x0658 */ 0x6330,0x312F, + /* Array index: 0x0658 */ 0x6331,0x3135, + /* Array index: 0x0658 */ 0x6335,0x3138, + /* Array index: 0x0658 */ 0x6337,0x3137, + /* Array index: 0x0658 */ 0x633F,0x313C, + /* Array index: 0x0658 */ 0x6352,0x312E, + /* Array index: 0x0658 */ 0x6353,0x3139, + /* Array index: 0x0658 */ 0x6360,0x647C, + /* Array index: 0x0658 */ 0x6364,0x647D, + /* Array index: 0x0658 */ 0x6366,0x3631, + /* Array index: 0x0658 */ 0x636A,0x3627, + /* Array index: 0x0658 */ 0x636C,0x3629, + /* Array index: 0x0658 */ 0x6373,0x3626, + /* Array index: 0x0658 */ 0x6374,0x3632, + /* Array index: 0x0658 */ 0x6379,0x3622, + /* Array index: 0x0658 */ 0x637E,0x357C, + /* Array index: 0x0658 */ 0x637F,0x362B, + /* Array index: 0x0658 */ 0x6386,0x3623, + /* Array index: 0x0658 */ 0x638B,0x357D, + /* Array index: 0x0658 */ 0x6393,0x3624, + /* Array index: 0x0658 */ 0x63B2,0x362D, + /* Array index: 0x0658 */ 0x63B6,0x647E, + /* Array index: 0x0658 */ 0x63BA,0x362E, + /* Array index: 0x0658 */ 0x63BF,0x3B71, + /* Array index: 0x0658 */ 0x63C1,0x3B70, + /* Array index: 0x0658 */ 0x63D1,0x3B73, + /* Array index: 0x0658 */ 0x63DE,0x3B67, + /* Array index: 0x0658 */ 0x63E2,0x3B66, + /* Array index: 0x0658 */ 0x63E6,0x3B68, + /* Array index: 0x0658 */ 0x63F7,0x3B72, + /* Array index: 0x0658 */ 0x63F8,0x3B6D, + /* Array index: 0x0658 */ 0x63FA,0x6339, + /* Array index: 0x0658 */ 0x63FE,0x3B6F, + /* Array index: 0x0658 */ 0x6403,0x6521, + /* Array index: 0x0658 */ 0x6407,0x4149, + /* Array index: 0x0658 */ 0x6408,0x4132, + /* Array index: 0x0658 */ 0x6411,0x413A, + /* Array index: 0x0658 */ 0x6419,0x4138, + /* Array index: 0x0658 */ 0x641D,0x413E, + /* Array index: 0x0658 */ 0x6429,0x413D, + /* Array index: 0x0658 */ 0x6431,0x4136, + /* Array index: 0x0658 */ 0x6432,0x4133, + /* Array index: 0x0658 */ 0x6446,0x4144, + /* Array index: 0x0658 */ 0x6447,0x4145, + /* Array index: 0x0658 */ 0x6449,0x6676, + /* Array index: 0x0658 */ 0x644C,0x4678, + /* Array index: 0x0658 */ 0x644F,0x4728, + /* Array index: 0x0658 */ 0x6462,0x4721, + /* Array index: 0x0658 */ 0x6464,0x472A, + /* Array index: 0x0658 */ 0x646A,0x4723, + /* Array index: 0x0658 */ 0x6471,0x4722, + /* Array index: 0x0658 */ 0x647C,0x467B, + /* Array index: 0x0658 */ 0x647E,0x4729, + /* Array index: 0x0658 */ 0x6480,0x4C2D, + /* Array index: 0x0658 */ 0x6481,0x4726, + /* Array index: 0x0658 */ 0x6483,0x4C35, + /* Array index: 0x0658 */ 0x6486,0x4C38, + /* Array index: 0x0658 */ 0x648D,0x4C30, + /* Array index: 0x0658 */ 0x648E,0x4C2F, + /* Array index: 0x0658 */ 0x6491,0x4C3B, + /* Array index: 0x0658 */ 0x6494,0x4C31, + /* Array index: 0x0658 */ 0x649B,0x4C2E, + /* Array index: 0x0658 */ 0x64A1,0x4C3E, + /* Array index: 0x0658 */ 0x64A7,0x4C3F, + /* Array index: 0x0658 */ 0x64A8,0x4C34, + /* Array index: 0x0658 */ 0x64AA,0x4C3D, + /* Array index: 0x0658 */ 0x64AF,0x4C3A, + /* Array index: 0x0658 */ 0x64B4,0x4C39, + /* Array index: 0x0658 */ 0x64B6,0x6522, + /* Array index: 0x0658 */ 0x64B9,0x4C37, + /* Array index: 0x0658 */ 0x64C0,0x5070, + /* Array index: 0x0658 */ 0x64C6,0x4C32, + /* Array index: 0x0658 */ 0x64C8,0x5077, + /* Array index: 0x0658 */ 0x64D1,0x5076, + /* Array index: 0x0658 */ 0x64D3,0x506F, + /* Array index: 0x0658 */ 0x64D5,0x5079, + /* Array index: 0x0658 */ 0x64DC,0x5075, + /* Array index: 0x0658 */ 0x64DF,0x5464, + /* Array index: 0x0658 */ 0x64E1,0x5467, + /* Array index: 0x0658 */ 0x64E5,0x576B, + /* Array index: 0x0658 */ 0x64E7,0x576D, + /* Array index: 0x0658 */ 0x64EA,0x576C, + /* Array index: 0x0658 */ 0x64EE,0x5469, + /* Array index: 0x0658 */ 0x64F6,0x576A, + /* Array index: 0x0658 */ 0x64F9,0x5770, + /* Array index: 0x0658 */ 0x6505,0x576E, + /* Array index: 0x0658 */ 0x6508,0x5A3B, + /* Array index: 0x0658 */ 0x650A,0x5A3C, + /* Array index: 0x0658 */ 0x650B,0x5A3A, + /* Array index: 0x0658 */ 0x6511,0x5E31, + /* Array index: 0x0658 */ 0x651A,0x6523, + /* Array index: 0x0658 */ 0x651E,0x5F4A, + /* Array index: 0x0658 */ 0x651F,0x5F4B, + /* Array index: 0x0658 */ 0x6527,0x5F49, + /* Array index: 0x0658 */ 0x6528,0x6032, + /* Array index: 0x0658 */ 0x6531,0x2C72, + /* Array index: 0x0658 */ 0x6534,0x2167, + /* Array index: 0x0658 */ 0x6535,0x2168, + /* Array index: 0x0658 */ 0x6540,0x2C74, + /* Array index: 0x0658 */ 0x6542,0x2C76, + /* Array index: 0x0658 */ 0x6544,0x2C73, + /* Array index: 0x0658 */ 0x654B,0x313D, + /* Array index: 0x0658 */ 0x654D,0x3637, + /* Array index: 0x0658 */ 0x654E,0x3636, + /* Array index: 0x0658 */ 0x655A,0x3634, + /* Array index: 0x0658 */ 0x656B,0x414B, + /* Array index: 0x0658 */ 0x6585,0x5C41, + /* Array index: 0x0658 */ 0x6588,0x2558, + /* Array index: 0x0658 */ 0x6589,0x2939, + /* Array index: 0x0658 */ 0x658B,0x3140, + /* Array index: 0x0658 */ 0x658D,0x3638, + /* Array index: 0x0658 */ 0x658E,0x3639, + /* Array index: 0x0658 */ 0x659A,0x3142, + /* Array index: 0x0658 */ 0x65A6,0x293B, + /* Array index: 0x0658 */ 0x65AD,0x363A, + /* Array index: 0x0658 */ 0x65B5,0x546B, + /* Array index: 0x0658 */ 0x65BA,0x293C, + /* Array index: 0x0658 */ 0x65BE,0x2C77, + /* Array index: 0x0658 */ 0x65C7,0x363C, + /* Array index: 0x0658 */ 0x65C9,0x363F, + /* Array index: 0x0658 */ 0x65CA,0x363D, + /* Array index: 0x0658 */ 0x65D1,0x3B79, + /* Array index: 0x0658 */ 0x65DC,0x5A3F, + /* Array index: 0x0658 */ 0x65E0,0x2169, + /* Array index: 0x0658 */ 0x65E3,0x3641, + /* Array index: 0x0658 */ 0x65E4,0x4150, + /* Array index: 0x0658 */ 0x65E7,0x2251, + /* Array index: 0x0658 */ 0x65EA,0x2373, + /* Array index: 0x0658 */ 0x65EB,0x2372, + /* Array index: 0x0658 */ 0x65F6,0x263D, + /* Array index: 0x0658 */ 0x65F9,0x625E, + /* Array index: 0x0658 */ 0x65FE,0x2943, + /* Array index: 0x0658 */ 0x65FF,0x293E, + /* Array index: 0x0658 */ 0x6601,0x2942, + /* Array index: 0x0658 */ 0x661E,0x2D23, + /* Array index: 0x0658 */ 0x6623,0x2C7C, + /* Array index: 0x0658 */ 0x6629,0x2C79, + /* Array index: 0x0658 */ 0x662C,0x2C7D, + /* Array index: 0x0658 */ 0x6630,0x2D21, + /* Array index: 0x0658 */ 0x6637,0x2D24, + /* Array index: 0x0658 */ 0x6638,0x2D25, + /* Array index: 0x0658 */ 0x663B,0x2D22, + /* Array index: 0x0658 */ 0x663C,0x2C37, + /* Array index: 0x0658 */ 0x6640,0x3146, + /* Array index: 0x0658 */ 0x6644,0x314C, + /* Array index: 0x0658 */ 0x6646,0x3144, + /* Array index: 0x0658 */ 0x6648,0x3149, + /* Array index: 0x0658 */ 0x664B,0x3148, + /* Array index: 0x0658 */ 0x664D,0x314D, + /* Array index: 0x0658 */ 0x664E,0x3145, + /* Array index: 0x0658 */ 0x6650,0x3143, + /* Array index: 0x0658 */ 0x6657,0x3642, + /* Array index: 0x0658 */ 0x6660,0x314B, + /* Array index: 0x0658 */ 0x6663,0x3644, + /* Array index: 0x0658 */ 0x6667,0x3645, + /* Array index: 0x0658 */ 0x6669,0x3C26, + /* Array index: 0x0658 */ 0x666B,0x3B7D, + /* Array index: 0x0658 */ 0x666D,0x3C25, + /* Array index: 0x0658 */ 0x6673,0x3C23, + /* Array index: 0x0658 */ 0x667D,0x3B7C, + /* Array index: 0x0658 */ 0x667F,0x3B7E, + /* Array index: 0x0658 */ 0x6681,0x3C24, + /* Array index: 0x0658 */ 0x668E,0x415B, + /* Array index: 0x0658 */ 0x668F,0x4156, + /* Array index: 0x0658 */ 0x6692,0x4159, + /* Array index: 0x0658 */ 0x6693,0x4151, + /* Array index: 0x0658 */ 0x669A,0x4734, + /* Array index: 0x0658 */ 0x669C,0x4735, + /* Array index: 0x0658 */ 0x66AC,0x4C44, + /* Array index: 0x0658 */ 0x66AD,0x4C46, + /* Array index: 0x0658 */ 0x66B3,0x4C41, + /* Array index: 0x0658 */ 0x66B6,0x4C40, + /* Array index: 0x0658 */ 0x66BC,0x4C43, + /* Array index: 0x0658 */ 0x66BF,0x507D, + /* Array index: 0x0658 */ 0x66C1,0x5123, + /* Array index: 0x0658 */ 0x66C3,0x507A, + /* Array index: 0x0658 */ 0x66C5,0x507E, + /* Array index: 0x0658 */ 0x66DF,0x5A43, + /* Array index: 0x0658 */ 0x66E1,0x5A42, + /* Array index: 0x0658 */ 0x66E2,0x6526, + /* Array index: 0x0658 */ 0x66E5,0x5C42, + /* Array index: 0x0658 */ 0x66E7,0x5C43, + /* Array index: 0x0658 */ 0x66EF,0x613F, + /* Array index: 0x0658 */ 0x66F5,0x2641, + /* Array index: 0x0658 */ 0x6702,0x6527, + /* Array index: 0x0658 */ 0x6706,0x5124, + /* Array index: 0x0658 */ 0x670C,0x2945, + /* Array index: 0x0658 */ 0x670E,0x2D27, + /* Array index: 0x0658 */ 0x6711,0x6632, + /* Array index: 0x0658 */ 0x6716,0x3648, + /* Array index: 0x0658 */ 0x6719,0x3647, + /* Array index: 0x0658 */ 0x671A,0x3646, + /* Array index: 0x0658 */ 0x671E,0x3C29, + /* Array index: 0x0658 */ 0x6724,0x5126, + /* Array index: 0x0658 */ 0x6725,0x6633, + /* Array index: 0x0658 */ 0x672F,0x2252, + /* Array index: 0x0658 */ 0x6732,0x2377, + /* Array index: 0x0658 */ 0x6736,0x2378, + /* Array index: 0x0658 */ 0x6737,0x2375, + /* Array index: 0x0658 */ 0x6744,0x2648, + /* Array index: 0x0658 */ 0x674A,0x2649, + /* Array index: 0x0658 */ 0x6752,0x2645, + /* Array index: 0x0658 */ 0x6754,0x2644, + /* Array index: 0x0658 */ 0x6758,0x2647, + /* Array index: 0x0658 */ 0x675B,0x2642, + /* Array index: 0x0658 */ 0x6761,0x264A, + /* Array index: 0x0658 */ 0x6765,0x6257, + /* Array index: 0x0658 */ 0x676B,0x2947, + /* Array index: 0x0658 */ 0x6780,0x2952, + /* Array index: 0x0658 */ 0x6782,0x2949, + /* Array index: 0x0658 */ 0x6788,0x625F, + /* Array index: 0x0658 */ 0x678A,0x294A, + /* Array index: 0x0658 */ 0x678F,0x294F, + /* Array index: 0x0658 */ 0x6796,0x2948, + /* Array index: 0x0658 */ 0x67AC,0x6529, + /* Array index: 0x0658 */ 0x67B1,0x2D36, + /* Array index: 0x0658 */ 0x67BC,0x2D2E, + /* Array index: 0x0658 */ 0x67BF,0x2D30, + /* Array index: 0x0658 */ 0x67C7,0x2D2D, + /* Array index: 0x0658 */ 0x67E8,0x2D2A, + /* Array index: 0x0658 */ 0x67F9,0x2951, + /* Array index: 0x0658 */ 0x67FB,0x2D34, + /* Array index: 0x0658 */ 0x67FE,0x2D32, + /* Array index: 0x0658 */ 0x6800,0x2D39, + /* Array index: 0x0658 */ 0x6801,0x2D37, + /* Array index: 0x0658 */ 0x6805,0x2D38, + /* Array index: 0x0658 */ 0x6806,0x652B, + /* Array index: 0x0658 */ 0x6810,0x652A, + /* Array index: 0x0658 */ 0x6815,0x315D, + /* Array index: 0x0658 */ 0x6819,0x3157, + /* Array index: 0x0658 */ 0x681B,0x3153, + /* Array index: 0x0658 */ 0x681E,0x315B, + /* Array index: 0x0658 */ 0x6827,0x315F, + /* Array index: 0x0658 */ 0x682C,0x3156, + /* Array index: 0x0658 */ 0x6830,0x3163, + /* Array index: 0x0658 */ 0x6836,0x3154, + /* Array index: 0x0658 */ 0x6837,0x314F, + /* Array index: 0x0658 */ 0x683E,0x315A, + /* Array index: 0x0658 */ 0x6847,0x3159, + /* Array index: 0x0658 */ 0x6852,0x2D2F, + /* Array index: 0x0658 */ 0x685E,0x652C, + /* Array index: 0x0658 */ 0x686C,0x3655, + /* Array index: 0x0658 */ 0x6870,0x3660, + /* Array index: 0x0658 */ 0x6873,0x364E, + /* Array index: 0x0658 */ 0x687A,0x365B, + /* Array index: 0x0658 */ 0x6884,0x3657, + /* Array index: 0x0658 */ 0x688E,0x3651, + /* Array index: 0x0658 */ 0x6895,0x365A, + /* Array index: 0x0658 */ 0x689E,0x364B, + /* Array index: 0x0658 */ 0x68A5,0x3654, + /* Array index: 0x0658 */ 0x68A6,0x3478, + /* Array index: 0x0658 */ 0x68C1,0x3656, + /* Array index: 0x0658 */ 0x68C3,0x3C45, + /* Array index: 0x0658 */ 0x68C5,0x3C41, + /* Array index: 0x0658 */ 0x68CA,0x3C38, + /* Array index: 0x0658 */ 0x68CF,0x3C3E, + /* Array index: 0x0658 */ 0x68DB,0x3653, + /* Array index: 0x0658 */ 0x68E2,0x3C3D, + /* Array index: 0x0658 */ 0x68E5,0x3C32, + /* Array index: 0x0658 */ 0x68ED,0x3C2A, + /* Array index: 0x0658 */ 0x6909,0x3C37, + /* Array index: 0x0658 */ 0x6918,0x3C3C, + /* Array index: 0x0658 */ 0x691C,0x3C44, + /* Array index: 0x0658 */ 0x691E,0x3C33, + /* Array index: 0x0658 */ 0x6929,0x652F, + /* Array index: 0x0658 */ 0x692C,0x652E, + /* Array index: 0x0658 */ 0x692E,0x3C40, + /* Array index: 0x0658 */ 0x6931,0x4165, + /* Array index: 0x0658 */ 0x6936,0x4177, + /* Array index: 0x0658 */ 0x693E,0x4168, + /* Array index: 0x0658 */ 0x6943,0x416B, + /* Array index: 0x0658 */ 0x6946,0x415D, + /* Array index: 0x0658 */ 0x6947,0x4175, + /* Array index: 0x0658 */ 0x694D,0x4173, + /* Array index: 0x0658 */ 0x6950,0x4174, + /* Array index: 0x0658 */ 0x6955,0x416F, + /* Array index: 0x0658 */ 0x6961,0x4179, + /* Array index: 0x0658 */ 0x6964,0x4178, + /* Array index: 0x0658 */ 0x6967,0x4176, + /* Array index: 0x0658 */ 0x6973,0x416D, + /* Array index: 0x0658 */ 0x697C,0x416A, + /* Array index: 0x0658 */ 0x697D,0x417B, + /* Array index: 0x0658 */ 0x6985,0x4172, + /* Array index: 0x0658 */ 0x698F,0x473A, + /* Array index: 0x0658 */ 0x6992,0x473D, + /* Array index: 0x0658 */ 0x6998,0x4751, + /* Array index: 0x0658 */ 0x699D,0x474E, + /* Array index: 0x0658 */ 0x699F,0x4746, + /* Array index: 0x0658 */ 0x69A2,0x4747, + /* Array index: 0x0658 */ 0x69B2,0x473E, + /* Array index: 0x0658 */ 0x69BA,0x6352, + /* Array index: 0x0658 */ 0x69C0,0x4743, + /* Array index: 0x0658 */ 0x69C5,0x473B, + /* Array index: 0x0658 */ 0x69C8,0x473C, + /* Array index: 0x0658 */ 0x69D1,0x4745, + /* Array index: 0x0658 */ 0x69D2,0x4748, + /* Array index: 0x0658 */ 0x69D5,0x474D, + /* Array index: 0x0658 */ 0x69D6,0x4744, + /* Array index: 0x0658 */ 0x69D8,0x4C54, + /* Array index: 0x0658 */ 0x69E1,0x474C, + /* Array index: 0x0658 */ 0x69E3,0x4742, + /* Array index: 0x0658 */ 0x69E9,0x4C64, + /* Array index: 0x0658 */ 0x69EA,0x4C60, + /* Array index: 0x0658 */ 0x69EF,0x4C4F, + /* Array index: 0x0658 */ 0x69F0,0x4C51, + /* Array index: 0x0658 */ 0x69F9,0x4C5F, + /* Array index: 0x0658 */ 0x69FA,0x4C57, + /* Array index: 0x0658 */ 0x6A0B,0x4C4D, + /* Array index: 0x0658 */ 0x6A0C,0x4C50, + /* Array index: 0x0658 */ 0x6A0E,0x4C47, + /* Array index: 0x0658 */ 0x6A10,0x4C5B, + /* Array index: 0x0658 */ 0x6A12,0x4C56, + /* Array index: 0x0658 */ 0x6A1A,0x4C4A, + /* Array index: 0x0658 */ 0x6A1C,0x4C49, + /* Array index: 0x0658 */ 0x6A22,0x4C52, + /* Array index: 0x0658 */ 0x6A24,0x4C62, + /* Array index: 0x0658 */ 0x6A33,0x512C, + /* Array index: 0x0658 */ 0x6A36,0x513C, + /* Array index: 0x0658 */ 0x6A37,0x5138, + /* Array index: 0x0658 */ 0x6A42,0x5128, + /* Array index: 0x0658 */ 0x6A43,0x512B, + /* Array index: 0x0658 */ 0x6A45,0x5140, + /* Array index: 0x0658 */ 0x6A4A,0x513B, + /* Array index: 0x0658 */ 0x6A4C,0x5131, + /* Array index: 0x0658 */ 0x6A52,0x5129, + /* Array index: 0x0658 */ 0x6A53,0x513E, + /* Array index: 0x0658 */ 0x6A57,0x512F, + /* Array index: 0x0658 */ 0x6A5C,0x5144, + /* Array index: 0x0658 */ 0x6A63,0x5127, + /* Array index: 0x0658 */ 0x6A6C,0x512E, + /* Array index: 0x0658 */ 0x6A6E,0x5132, + /* Array index: 0x0658 */ 0x6A70,0x5141, + /* Array index: 0x0658 */ 0x6A71,0x513A, + /* Array index: 0x0658 */ 0x6A77,0x6531, + /* Array index: 0x0658 */ 0x6A7A,0x6532, + /* Array index: 0x0658 */ 0x6A7D,0x5475, + /* Array index: 0x0658 */ 0x6A82,0x547B, + /* Array index: 0x0658 */ 0x6A86,0x5521, + /* Array index: 0x0658 */ 0x6A88,0x547C, + /* Array index: 0x0658 */ 0x6A8A,0x5476, + /* Array index: 0x0658 */ 0x6A8F,0x5527, + /* Array index: 0x0658 */ 0x6A98,0x5523, + /* Array index: 0x0658 */ 0x6A99,0x547A, + /* Array index: 0x0658 */ 0x6A9D,0x5524, + /* Array index: 0x0658 */ 0x6AA7,0x5478, + /* Array index: 0x0658 */ 0x6AAA,0x5529, + /* Array index: 0x0658 */ 0x6AAB,0x5774, + /* Array index: 0x0658 */ 0x6AB5,0x5778, + /* Array index: 0x0658 */ 0x6AC4,0x5822, + /* Array index: 0x0658 */ 0x6AC8,0x577B, + /* Array index: 0x0658 */ 0x6ACA,0x6533, + /* Array index: 0x0658 */ 0x6ACE,0x5A44, + /* Array index: 0x0658 */ 0x6AD2,0x5A4F, + /* Array index: 0x0658 */ 0x6AE2,0x5A48, + /* Array index: 0x0658 */ 0x6AE3,0x5A46, + /* Array index: 0x0658 */ 0x6AE6,0x6534, + /* Array index: 0x0658 */ 0x6AE9,0x5C49, + /* Array index: 0x0658 */ 0x6AED,0x5775, + /* Array index: 0x0658 */ 0x6AF4,0x5C47, + /* Array index: 0x0658 */ 0x6AF5,0x6535, + /* Array index: 0x0658 */ 0x6B06,0x5F4F, + /* Array index: 0x0658 */ 0x6B07,0x5F4E, + /* Array index: 0x0658 */ 0x6B0D,0x6536, + /* Array index: 0x0658 */ 0x6B0E,0x6537, + /* Array index: 0x0658 */ 0x6B14,0x6074, + /* Array index: 0x0658 */ 0x6B22,0x2379, + /* Array index: 0x0658 */ 0x6B2E,0x3165, + /* Array index: 0x0658 */ 0x6B30,0x3167, + /* Array index: 0x0658 */ 0x6B35,0x3662, + /* Array index: 0x0658 */ 0x6B40,0x417D, + /* Array index: 0x0658 */ 0x6B44,0x417C, + /* Array index: 0x0658 */ 0x6B4F,0x4C66, + /* Array index: 0x0658 */ 0x6B52,0x4C65, + /* Array index: 0x0658 */ 0x6B53,0x4C67, + /* Array index: 0x0658 */ 0x6B57,0x5146, + /* Array index: 0x0658 */ 0x6B58,0x5145, + /* Array index: 0x0658 */ 0x6B5D,0x552B, + /* Array index: 0x0658 */ 0x6B7A,0x2253, + /* Array index: 0x0658 */ 0x6B81,0x2958, + /* Array index: 0x0658 */ 0x6B8B,0x316A, + /* Array index: 0x0658 */ 0x6B90,0x3664, + /* Array index: 0x0658 */ 0x6B9C,0x4222, + /* Array index: 0x0658 */ 0x6B9D,0x6354, + /* Array index: 0x0658 */ 0x6BA1,0x4754, + /* Array index: 0x0658 */ 0x6BB4,0x2959, + /* Array index: 0x0658 */ 0x6BBB,0x3665, + /* Array index: 0x0658 */ 0x6BBE,0x3C4B, + /* Array index: 0x0658 */ 0x6BC1,0x4226, + /* Array index: 0x0658 */ 0x6BCE,0x237A, + /* Array index: 0x0658 */ 0x6BD1,0x295A, + /* Array index: 0x0658 */ 0x6BDC,0x6538, + /* Array index: 0x0658 */ 0x6BDD,0x6539, + /* Array index: 0x0658 */ 0x6BE1,0x2D42, + /* Array index: 0x0658 */ 0x6BE5,0x316E, + /* Array index: 0x0658 */ 0x6BE9,0x316C, + /* Array index: 0x0658 */ 0x6BEA,0x316D, + /* Array index: 0x0658 */ 0x6BED,0x3666, + /* Array index: 0x0658 */ 0x6BF4,0x3C4D, + /* Array index: 0x0658 */ 0x6BF6,0x653A, + /* Array index: 0x0658 */ 0x6BFA,0x4228, + /* Array index: 0x0658 */ 0x6C0A,0x552D, + /* Array index: 0x0658 */ 0x6C1C,0x295D, + /* Array index: 0x0658 */ 0x6C1E,0x653B, + /* Array index: 0x0658 */ 0x6C2D,0x3C4E, + /* Array index: 0x0658 */ 0x6C31,0x4229, + /* Array index: 0x0658 */ 0x6C32,0x422A, + /* Array index: 0x0658 */ 0x6C37,0x2257, + /* Array index: 0x0658 */ 0x6C39,0x2254, + /* Array index: 0x0658 */ 0x6C3C,0x2421, + /* Array index: 0x0658 */ 0x6C44,0x2258, + /* Array index: 0x0658 */ 0x6C45,0x2259, + /* Array index: 0x0658 */ 0x6C51,0x237D, + /* Array index: 0x0658 */ 0x6C53,0x2425, + /* Array index: 0x0658 */ 0x6C56,0x2655, + /* Array index: 0x0658 */ 0x6C58,0x237C, + /* Array index: 0x0658 */ 0x6C5A,0x2423, + /* Array index: 0x0658 */ 0x6C63,0x653C, + /* Array index: 0x0658 */ 0x6C6C,0x2964, + /* Array index: 0x0658 */ 0x6C6E,0x2650, + /* Array index: 0x0658 */ 0x6C75,0x2653, + /* Array index: 0x0658 */ 0x6C77,0x237E, + /* Array index: 0x0658 */ 0x6C79,0x2657, + /* Array index: 0x0658 */ 0x6C7C,0x2651, + /* Array index: 0x0658 */ 0x6C7F,0x264C, + /* Array index: 0x0658 */ 0x6C91,0x264D, + /* Array index: 0x0658 */ 0x6C97,0x2963, + /* Array index: 0x0658 */ 0x6CAA,0x265B, + /* Array index: 0x0658 */ 0x6CAF,0x2D4E, + /* Array index: 0x0658 */ 0x6CB2,0x296B, + /* Array index: 0x0658 */ 0x6CC8,0x296D, + /* Array index: 0x0658 */ 0x6CCB,0x6261, + /* Array index: 0x0658 */ 0x6CCE,0x296C, + /* Array index: 0x0658 */ 0x6CD8,0x296A, + /* Array index: 0x0658 */ 0x6CDF,0x2965, + /* Array index: 0x0658 */ 0x6CE4,0x2969, + /* Array index: 0x0658 */ 0x6CE6,0x6260, + /* Array index: 0x0658 */ 0x6CEA,0x2967, + /* Array index: 0x0658 */ 0x6CF4,0x2D4F, + /* Array index: 0x0658 */ 0x6CFF,0x2D46, + /* Array index: 0x0658 */ 0x6D02,0x2D50, + /* Array index: 0x0658 */ 0x6D05,0x2D48, + /* Array index: 0x0658 */ 0x6D06,0x2D4A, + /* Array index: 0x0658 */ 0x6D1C,0x317A, + /* Array index: 0x0658 */ 0x6D21,0x2D4B, + /* Array index: 0x0658 */ 0x6D23,0x2D45, + /* Array index: 0x0658 */ 0x6D24,0x2D57, + /* Array index: 0x0658 */ 0x6D26,0x2D53, + /* Array index: 0x0658 */ 0x6D44,0x2D55, + /* Array index: 0x0658 */ 0x6D45,0x2D51, + /* Array index: 0x0658 */ 0x6D56,0x3177, + /* Array index: 0x0658 */ 0x6D57,0x3173, + /* Array index: 0x0658 */ 0x6D6B,0x316F, + /* Array index: 0x0658 */ 0x6D81,0x3221, + /* Array index: 0x0658 */ 0x6D8F,0x3178, + /* Array index: 0x0658 */ 0x6D96,0x3227, + /* Array index: 0x0658 */ 0x6DA5,0x653D, + /* Array index: 0x0658 */ 0x6DAD,0x366F, + /* Array index: 0x0658 */ 0x6DB0,0x367A, + /* Array index: 0x0658 */ 0x6DB1,0x3721, + /* Array index: 0x0658 */ 0x6DB6,0x3C50, + /* Array index: 0x0658 */ 0x6DB9,0x3672, + /* Array index: 0x0658 */ 0x6DC1,0x366A, + /* Array index: 0x0658 */ 0x6DC3,0x366B, + /* Array index: 0x0658 */ 0x6DCE,0x366C, + /* Array index: 0x0658 */ 0x6DE7,0x3674, + /* Array index: 0x0658 */ 0x6DF8,0x367C, + /* Array index: 0x0658 */ 0x6E0F,0x653E, + /* Array index: 0x0658 */ 0x6E12,0x3729, + /* Array index: 0x0658 */ 0x6E17,0x3727, + /* Array index: 0x0658 */ 0x6E18,0x3C54, + /* Array index: 0x0658 */ 0x6E1E,0x3C52, + /* Array index: 0x0658 */ 0x6E29,0x3C6B, + /* Array index: 0x0658 */ 0x6E2A,0x3C6D, + /* Array index: 0x0658 */ 0x6E42,0x3C5A, + /* Array index: 0x0658 */ 0x6E48,0x3C56, + /* Array index: 0x0658 */ 0x6E4C,0x3C6E, + /* Array index: 0x0658 */ 0x6E4F,0x3C58, + /* Array index: 0x0658 */ 0x6E50,0x3C69, + /* Array index: 0x0658 */ 0x6E57,0x3C66, + /* Array index: 0x0658 */ 0x6E59,0x3C64, + /* Array index: 0x0658 */ 0x6E6A,0x3C5B, + /* Array index: 0x0658 */ 0x6E6C,0x423A, + /* Array index: 0x0658 */ 0x6E6D,0x3C60, + /* Array index: 0x0658 */ 0x6E70,0x3C5C, + /* Array index: 0x0658 */ 0x6E75,0x3C51, + /* Array index: 0x0658 */ 0x6E76,0x3C6C, + /* Array index: 0x0658 */ 0x6E7B,0x3C62, + /* Array index: 0x0658 */ 0x6E7C,0x6542, + /* Array index: 0x0658 */ 0x6E7E,0x3C63, + /* Array index: 0x0658 */ 0x6E80,0x3C68, + /* Array index: 0x0658 */ 0x6E84,0x6540, + /* Array index: 0x0658 */ 0x6E86,0x633D, + /* Array index: 0x0658 */ 0x6E8A,0x653F, + /* Array index: 0x0658 */ 0x6E8B,0x6541, + /* Array index: 0x0658 */ 0x6E91,0x4230, + /* Array index: 0x0658 */ 0x6E9A,0x4233, + /* Array index: 0x0658 */ 0x6EA8,0x422E, + /* Array index: 0x0658 */ 0x6EA9,0x4236, + /* Array index: 0x0658 */ 0x6EAC,0x4240, + /* Array index: 0x0658 */ 0x6EB5,0x4239, + /* Array index: 0x0658 */ 0x6EB8,0x422D, + /* Array index: 0x0658 */ 0x6EBB,0x4231, + /* Array index: 0x0658 */ 0x6EE3,0x4245, + /* Array index: 0x0658 */ 0x6EE6,0x423F, + /* Array index: 0x0658 */ 0x6EE8,0x423B, + /* Array index: 0x0658 */ 0x6EE9,0x4246, + /* Array index: 0x0658 */ 0x6EF0,0x4756, + /* Array index: 0x0658 */ 0x6EF3,0x4757, + /* Array index: 0x0658 */ 0x6EFA,0x4765, + /* Array index: 0x0658 */ 0x6F04,0x4763, + /* Array index: 0x0658 */ 0x6F0B,0x4C78, + /* Array index: 0x0658 */ 0x6F0C,0x475B, + /* Array index: 0x0658 */ 0x6F10,0x4C6A, + /* Array index: 0x0658 */ 0x6F11,0x4764, + /* Array index: 0x0658 */ 0x6F17,0x475F, + /* Array index: 0x0658 */ 0x6F1B,0x475A, + /* Array index: 0x0658 */ 0x6F1D,0x475C, + /* Array index: 0x0658 */ 0x6F28,0x475E, + /* Array index: 0x0658 */ 0x6F34,0x475D, + /* Array index: 0x0658 */ 0x6F3D,0x4C74, + /* Array index: 0x0658 */ 0x6F42,0x4762, + /* Array index: 0x0658 */ 0x6F44,0x4761, + /* Array index: 0x0658 */ 0x6F59,0x4C7D, + /* Array index: 0x0658 */ 0x6F5C,0x4C73, + /* Array index: 0x0658 */ 0x6F65,0x4C6B, + /* Array index: 0x0658 */ 0x6F71,0x4C75, + /* Array index: 0x0658 */ 0x6F74,0x4C7E, + /* Array index: 0x0658 */ 0x6F75,0x4C6C, + /* Array index: 0x0658 */ 0x6F79,0x4C79, + /* Array index: 0x0658 */ 0x6F81,0x4C7A, + /* Array index: 0x0658 */ 0x6F8A,0x6363, + /* Array index: 0x0658 */ 0x6F8F,0x4C7B, + /* Array index: 0x0658 */ 0x6F91,0x4C77, + /* Array index: 0x0658 */ 0x6F99,0x6547, + /* Array index: 0x0658 */ 0x6F9D,0x6546, + /* Array index: 0x0658 */ 0x6F9F,0x5156, + /* Array index: 0x0658 */ 0x6FB5,0x5154, + /* Array index: 0x0658 */ 0x6FB7,0x5158, + /* Array index: 0x0658 */ 0x6FBB,0x514D, + /* Array index: 0x0658 */ 0x6FBE,0x5150, + /* Array index: 0x0658 */ 0x6FD0,0x4C71, + /* Array index: 0x0658 */ 0x6FD3,0x5155, + /* Array index: 0x0658 */ 0x6FE5,0x5531, + /* Array index: 0x0658 */ 0x6FEA,0x5537, + /* Array index: 0x0658 */ 0x6FF3,0x5A55, + /* Array index: 0x0658 */ 0x6FF5,0x5159, + /* Array index: 0x0658 */ 0x6FF6,0x5539, + /* Array index: 0x0658 */ 0x6FF8,0x6548, + /* Array index: 0x0658 */ 0x6FFD,0x5828, + /* Array index: 0x0658 */ 0x7002,0x582A, + /* Array index: 0x0658 */ 0x7003,0x5827, + /* Array index: 0x0658 */ 0x7008,0x5826, + /* Array index: 0x0658 */ 0x7010,0x5829, + /* Array index: 0x0658 */ 0x7013,0x582B, + /* Array index: 0x0658 */ 0x701E,0x5A52, + /* Array index: 0x0658 */ 0x7025,0x5A54, + /* Array index: 0x0658 */ 0x7036,0x5C51, + /* Array index: 0x0658 */ 0x703D,0x5C4F, + /* Array index: 0x0658 */ 0x7047,0x5E3C, + /* Array index: 0x0658 */ 0x704B,0x5E3A, + /* Array index: 0x0658 */ 0x704D,0x5E3B, + /* Array index: 0x0658 */ 0x7053,0x6036, + /* Array index: 0x0658 */ 0x7054,0x5F52, + /* Array index: 0x0658 */ 0x7059,0x6037, + /* Array index: 0x0658 */ 0x705C,0x654B, + /* Array index: 0x0658 */ 0x7067,0x6179, + /* Array index: 0x0658 */ 0x706E,0x2428, + /* Array index: 0x0658 */ 0x706F,0x2426, + /* Array index: 0x0658 */ 0x7072,0x2427, + /* Array index: 0x0658 */ 0x7073,0x242B, + /* Array index: 0x0658 */ 0x7075,0x2662, + /* Array index: 0x0658 */ 0x7077,0x265F, + /* Array index: 0x0658 */ 0x7079,0x265E, + /* Array index: 0x0658 */ 0x707B,0x2663, + /* Array index: 0x0658 */ 0x707E,0x2660, + /* Array index: 0x0658 */ 0x7081,0x2977, + /* Array index: 0x0658 */ 0x70A0,0x2D5E, + /* Array index: 0x0658 */ 0x70B2,0x2D64, + /* Array index: 0x0658 */ 0x70B6,0x2D63, + /* Array index: 0x0658 */ 0x70B9,0x2D68, + /* Array index: 0x0658 */ 0x70BB,0x2D5D, + /* Array index: 0x0658 */ 0x70BF,0x654D, + /* Array index: 0x0658 */ 0x70C4,0x3228, + /* Array index: 0x0658 */ 0x70C9,0x6279, + /* Array index: 0x0658 */ 0x70CC,0x322A, + /* Array index: 0x0658 */ 0x70D0,0x322B, + /* Array index: 0x0658 */ 0x70D5,0x3231, + /* Array index: 0x0658 */ 0x70D6,0x322F, + /* Array index: 0x0658 */ 0x70DB,0x3229, + /* Array index: 0x0658 */ 0x70DF,0x322D, + /* Array index: 0x0658 */ 0x70E3,0x322C, + /* Array index: 0x0658 */ 0x70E5,0x654F, + /* Array index: 0x0658 */ 0x70EA,0x654E, + /* Array index: 0x0658 */ 0x70EE,0x3230, + /* Array index: 0x0658 */ 0x70F1,0x3730, + /* Array index: 0x0658 */ 0x70F2,0x3732, + /* Array index: 0x0658 */ 0x70F5,0x372F, + /* Array index: 0x0658 */ 0x70FE,0x3735, + /* Array index: 0x0658 */ 0x7101,0x372E, + /* Array index: 0x0658 */ 0x7103,0x372C, + /* Array index: 0x0658 */ 0x7107,0x372D, + /* Array index: 0x0658 */ 0x7108,0x3731, + /* Array index: 0x0658 */ 0x710F,0x3733, + /* Array index: 0x0658 */ 0x7111,0x6550, + /* Array index: 0x0658 */ 0x7112,0x6551, + /* Array index: 0x0658 */ 0x711D,0x3C74, + /* Array index: 0x0658 */ 0x7124,0x3C7D, + /* Array index: 0x0658 */ 0x7127,0x3C7C, + /* Array index: 0x0658 */ 0x7145,0x4257, + /* Array index: 0x0658 */ 0x7148,0x424C, + /* Array index: 0x0658 */ 0x714A,0x424E, + /* Array index: 0x0658 */ 0x714F,0x4251, + /* Array index: 0x0658 */ 0x7151,0x4258, + /* Array index: 0x0658 */ 0x7157,0x4252, + /* Array index: 0x0658 */ 0x715B,0x483C, + /* Array index: 0x0658 */ 0x716B,0x424F, + /* Array index: 0x0658 */ 0x716D,0x4259, + /* Array index: 0x0658 */ 0x716F,0x4249, + /* Array index: 0x0658 */ 0x7171,0x6559, + /* Array index: 0x0658 */ 0x717C,0x476F, + /* Array index: 0x0658 */ 0x717E,0x476E, + /* Array index: 0x0658 */ 0x717F,0x476C, + /* Array index: 0x0658 */ 0x7183,0x4770, + /* Array index: 0x0658 */ 0x7188,0x4772, + /* Array index: 0x0658 */ 0x7191,0x4767, + /* Array index: 0x0658 */ 0x7193,0x655B, + /* Array index: 0x0658 */ 0x7196,0x655A, + /* Array index: 0x0658 */ 0x71A2,0x4D2A, + /* Array index: 0x0658 */ 0x71A3,0x4D24, + /* Array index: 0x0658 */ 0x71A6,0x4D29, + /* Array index: 0x0658 */ 0x71AB,0x4D28, + /* Array index: 0x0658 */ 0x71AD,0x4D25, + /* Array index: 0x0658 */ 0x71AE,0x4D22, + /* Array index: 0x0658 */ 0x71B4,0x655C, + /* Array index: 0x0658 */ 0x71B6,0x5162, + /* Array index: 0x0658 */ 0x71B7,0x515A, + /* Array index: 0x0658 */ 0x71BA,0x5160, + /* Array index: 0x0658 */ 0x71BB,0x515C, + /* Array index: 0x0658 */ 0x71CC,0x5163, + /* Array index: 0x0658 */ 0x71CD,0x6374, + /* Array index: 0x0658 */ 0x71D1,0x515E, + /* Array index: 0x0658 */ 0x71D3,0x5166, + /* Array index: 0x0658 */ 0x71DD,0x655D, + /* Array index: 0x0658 */ 0x71DE,0x655E, + /* Array index: 0x0658 */ 0x71E3,0x553C, + /* Array index: 0x0658 */ 0x71EF,0x5541, + /* Array index: 0x0658 */ 0x71F3,0x5542, + /* Array index: 0x0658 */ 0x71FA,0x582D, + /* Array index: 0x0658 */ 0x7200,0x582E, + /* Array index: 0x0658 */ 0x7204,0x5A56, + /* Array index: 0x0658 */ 0x7208,0x5A57, + /* Array index: 0x0658 */ 0x720B,0x5C59, + /* Array index: 0x0658 */ 0x721C,0x5F53, + /* Array index: 0x0658 */ 0x7220,0x5F54, + /* Array index: 0x0658 */ 0x7221,0x6039, + /* Array index: 0x0658 */ 0x7224,0x6143, + /* Array index: 0x0658 */ 0x7225,0x6142, + /* Array index: 0x0658 */ 0x722E,0x2D69, + /* Array index: 0x0658 */ 0x7232,0x3D22, + /* Array index: 0x0658 */ 0x723C,0x2D6B, + /* Array index: 0x0658 */ 0x7240,0x297C, + /* Array index: 0x0658 */ 0x724E,0x425D, + /* Array index: 0x0658 */ 0x7250,0x425C, + /* Array index: 0x0658 */ 0x7251,0x425B, + /* Array index: 0x0658 */ 0x7255,0x4D2E, + /* Array index: 0x0658 */ 0x7257,0x4D2D, + /* Array index: 0x0658 */ 0x726D,0x2D6D, + /* Array index: 0x0658 */ 0x727A,0x3236, + /* Array index: 0x0658 */ 0x7282,0x3D24, + /* Array index: 0x0658 */ 0x7283,0x3D23, + /* Array index: 0x0658 */ 0x7287,0x3D25, + /* Array index: 0x0658 */ 0x7294,0x4775, + /* Array index: 0x0658 */ 0x7299,0x4D2F, + /* Array index: 0x0658 */ 0x72AB,0x617B, + /* Array index: 0x0658 */ 0x72B1,0x242C, + /* Array index: 0x0658 */ 0x72B2,0x242D, + /* Array index: 0x0658 */ 0x72B6,0x266B, + /* Array index: 0x0658 */ 0x72B9,0x2669, + /* Array index: 0x0658 */ 0x72BB,0x2666, + /* Array index: 0x0658 */ 0x72BC,0x2667, + /* Array index: 0x0658 */ 0x72BE,0x266A, + /* Array index: 0x0658 */ 0x72C7,0x2668, + /* Array index: 0x0658 */ 0x72CD,0x2A26, + /* Array index: 0x0658 */ 0x72CF,0x2A2A, + /* Array index: 0x0658 */ 0x72D3,0x2A27, + /* Array index: 0x0658 */ 0x72DB,0x2A28, + /* Array index: 0x0658 */ 0x72E2,0x2D75, + /* Array index: 0x0658 */ 0x72E5,0x2D74, + /* Array index: 0x0658 */ 0x72E7,0x2D70, + /* Array index: 0x0658 */ 0x72EC,0x2D73, + /* Array index: 0x0658 */ 0x72ED,0x2D71, + /* Array index: 0x0658 */ 0x72F5,0x3238, + /* Array index: 0x0658 */ 0x7302,0x3239, + /* Array index: 0x0658 */ 0x7306,0x3D26, + /* Array index: 0x0658 */ 0x730E,0x373B, + /* Array index: 0x0658 */ 0x7310,0x373A, + /* Array index: 0x0658 */ 0x731A,0x3739, + /* Array index: 0x0658 */ 0x7324,0x3D27, + /* Array index: 0x0658 */ 0x7338,0x3D28, + /* Array index: 0x0658 */ 0x7341,0x425F, + /* Array index: 0x0658 */ 0x734B,0x4D30, + /* Array index: 0x0658 */ 0x734F,0x4779, + /* Array index: 0x0658 */ 0x7371,0x5549, + /* Array index: 0x0658 */ 0x738C,0x225A, + /* Array index: 0x0658 */ 0x738D,0x216B, + /* Array index: 0x0658 */ 0x738F,0x242F, + /* Array index: 0x0658 */ 0x7398,0x266E, + /* Array index: 0x0658 */ 0x739C,0x2A33, + /* Array index: 0x0658 */ 0x739E,0x2A2D, + /* Array index: 0x0658 */ 0x73A3,0x2A2C, + /* Array index: 0x0658 */ 0x73A7,0x2A2B, + /* Array index: 0x0658 */ 0x73AA,0x2A32, + /* Array index: 0x0658 */ 0x73AF,0x2A2F, + /* Array index: 0x0658 */ 0x73BD,0x2D78, + /* Array index: 0x0658 */ 0x73C1,0x2D7B, + /* Array index: 0x0658 */ 0x73C4,0x2D77, + /* Array index: 0x0658 */ 0x73C9,0x2D7A, + /* Array index: 0x0658 */ 0x73D5,0x323E, + /* Array index: 0x0658 */ 0x73DF,0x3240, + /* Array index: 0x0658 */ 0x73E1,0x3247, + /* Array index: 0x0658 */ 0x73E2,0x323C, + /* Array index: 0x0658 */ 0x73E4,0x3246, + /* Array index: 0x0658 */ 0x73E6,0x3241, + /* Array index: 0x0658 */ 0x73EC,0x323D, + /* Array index: 0x0658 */ 0x73EF,0x6564, + /* Array index: 0x0658 */ 0x73F3,0x373D, + /* Array index: 0x0658 */ 0x73F7,0x3D38, + /* Array index: 0x0658 */ 0x73F9,0x323F, + /* Array index: 0x0658 */ 0x73FB,0x3740, + /* Array index: 0x0658 */ 0x7402,0x373C, + /* Array index: 0x0658 */ 0x7412,0x6565, + /* Array index: 0x0658 */ 0x741C,0x3D39, + /* Array index: 0x0658 */ 0x741E,0x426D, + /* Array index: 0x0658 */ 0x741F,0x3D35, + /* Array index: 0x0658 */ 0x7427,0x4264, + /* Array index: 0x0658 */ 0x7443,0x426F, + /* Array index: 0x0658 */ 0x744C,0x4273, + /* Array index: 0x0658 */ 0x7453,0x4267, + /* Array index: 0x0658 */ 0x7456,0x426B, + /* Array index: 0x0658 */ 0x7458,0x4270, + /* Array index: 0x0658 */ 0x745D,0x426A, + /* Array index: 0x0658 */ 0x7460,0x4825, + /* Array index: 0x0658 */ 0x7461,0x477E, + /* Array index: 0x0658 */ 0x7465,0x477C, + /* Array index: 0x0658 */ 0x7466,0x477D, + /* Array index: 0x0658 */ 0x7468,0x4822, + /* Array index: 0x0658 */ 0x746B,0x4821, + /* Array index: 0x0658 */ 0x746C,0x477B, + /* Array index: 0x0658 */ 0x7474,0x4827, + /* Array index: 0x0658 */ 0x7476,0x4823, + /* Array index: 0x0658 */ 0x747A,0x4D31, + /* Array index: 0x0658 */ 0x747B,0x4D3B, + /* Array index: 0x0658 */ 0x7482,0x4D39, + /* Array index: 0x0658 */ 0x7484,0x4D36, + /* Array index: 0x0658 */ 0x748C,0x4D35, + /* Array index: 0x0658 */ 0x748D,0x6568, + /* Array index: 0x0658 */ 0x7493,0x4D3A, + /* Array index: 0x0658 */ 0x7496,0x516A, + /* Array index: 0x0658 */ 0x7499,0x6375, + /* Array index: 0x0658 */ 0x749B,0x5167, + /* Array index: 0x0658 */ 0x749D,0x516C, + /* Array index: 0x0658 */ 0x74A2,0x516B, + /* Array index: 0x0658 */ 0x74A4,0x6567, + /* Array index: 0x0658 */ 0x74AC,0x554F, + /* Array index: 0x0658 */ 0x74AE,0x554B, + /* Array index: 0x0658 */ 0x74B3,0x554D, + /* Array index: 0x0658 */ 0x74B4,0x6569, + /* Array index: 0x0658 */ 0x74B9,0x582F, + /* Array index: 0x0658 */ 0x74BC,0x5830, + /* Array index: 0x0658 */ 0x74C4,0x5A5A, + /* Array index: 0x0658 */ 0x74EB,0x2E22, + /* Array index: 0x0658 */ 0x74ED,0x2E21, + /* Array index: 0x0658 */ 0x74EF,0x2E24, + /* Array index: 0x0658 */ 0x74F3,0x3248, + /* Array index: 0x0658 */ 0x74F9,0x3D3D, + /* Array index: 0x0658 */ 0x7501,0x4277, + /* Array index: 0x0658 */ 0x7506,0x4828, + /* Array index: 0x0658 */ 0x7509,0x4D3D, + /* Array index: 0x0658 */ 0x750A,0x516D, + /* Array index: 0x0658 */ 0x750E,0x516E, + /* Array index: 0x0658 */ 0x751B,0x3744, + /* Array index: 0x0658 */ 0x751E,0x4278, + /* Array index: 0x0658 */ 0x7523,0x3745, + /* Array index: 0x0658 */ 0x7524,0x3D3E, + /* Array index: 0x0658 */ 0x753B,0x2A37, + /* Array index: 0x0658 */ 0x7541,0x2A38, + /* Array index: 0x0658 */ 0x7542,0x2A35, + /* Array index: 0x0658 */ 0x7544,0x2A36, + /* Array index: 0x0658 */ 0x7546,0x2E27, + /* Array index: 0x0658 */ 0x7549,0x2E25, + /* Array index: 0x0658 */ 0x754A,0x2E28, + /* Array index: 0x0658 */ 0x754D,0x2E2A, + /* Array index: 0x0658 */ 0x7550,0x2E26, + /* Array index: 0x0658 */ 0x755E,0x3251, + /* Array index: 0x0658 */ 0x7561,0x3746, + /* Array index: 0x0658 */ 0x7567,0x3749, + /* Array index: 0x0658 */ 0x7568,0x3747, + /* Array index: 0x0658 */ 0x756D,0x3D43, + /* Array index: 0x0658 */ 0x756E,0x3D42, + /* Array index: 0x0658 */ 0x7571,0x3D44, + /* Array index: 0x0658 */ 0x757A,0x427B, + /* Array index: 0x0658 */ 0x7581,0x5170, + /* Array index: 0x0658 */ 0x7583,0x5552, + /* Array index: 0x0658 */ 0x7589,0x5C62, + /* Array index: 0x0658 */ 0x758E,0x3D45, + /* Array index: 0x0658 */ 0x7592,0x225B, + /* Array index: 0x0658 */ 0x7593,0x2673, + /* Array index: 0x0658 */ 0x759B,0x2A3A, + /* Array index: 0x0658 */ 0x759E,0x2A3B, + /* Array index: 0x0658 */ 0x75A6,0x2E2B, + /* Array index: 0x0658 */ 0x75A8,0x2E2F, + /* Array index: 0x0658 */ 0x75B1,0x3257, + /* Array index: 0x0658 */ 0x75B4,0x3255, + /* Array index: 0x0658 */ 0x75C3,0x3252, + /* Array index: 0x0658 */ 0x75D3,0x374A, + /* Array index: 0x0658 */ 0x75E5,0x3D47, + /* Array index: 0x0658 */ 0x75EE,0x427C, + /* Array index: 0x0658 */ 0x7602,0x427D, + /* Array index: 0x0658 */ 0x7607,0x482B, + /* Array index: 0x0658 */ 0x760E,0x4829, + /* Array index: 0x0658 */ 0x762C,0x5171, + /* Array index: 0x0658 */ 0x7636,0x5173, + /* Array index: 0x0658 */ 0x7637,0x5172, + /* Array index: 0x0658 */ 0x763B,0x5174, + /* Array index: 0x0658 */ 0x7644,0x5555, + /* Array index: 0x0658 */ 0x7645,0x5553, + /* Array index: 0x0658 */ 0x764E,0x5554, + /* Array index: 0x0658 */ 0x764F,0x5834, + /* Array index: 0x0658 */ 0x7651,0x5833, + /* Array index: 0x0658 */ 0x765B,0x5832, + /* Array index: 0x0658 */ 0x7667,0x5E3F, + /* Array index: 0x0658 */ 0x7668,0x5E3E, + /* Array index: 0x0658 */ 0x766F,0x603B, + /* Array index: 0x0658 */ 0x7673,0x656A, + /* Array index: 0x0658 */ 0x7676,0x225C, + /* Array index: 0x0658 */ 0x7677,0x656B, + /* Array index: 0x0658 */ 0x7680,0x2674, + /* Array index: 0x0658 */ 0x7683,0x2676, + /* Array index: 0x0658 */ 0x7690,0x374D, + /* Array index: 0x0658 */ 0x7694,0x3D4C, + /* Array index: 0x0658 */ 0x7697,0x427E, + /* Array index: 0x0658 */ 0x7698,0x4321, + /* Array index: 0x0658 */ 0x76A1,0x5176, + /* Array index: 0x0658 */ 0x76A3,0x5556, + /* Array index: 0x0658 */ 0x76A5,0x5557, + /* Array index: 0x0658 */ 0x76A9,0x5A5E, + /* Array index: 0x0658 */ 0x76B3,0x3D4D, + /* Array index: 0x0658 */ 0x76B7,0x4830, + /* Array index: 0x0658 */ 0x76B9,0x482E, + /* Array index: 0x0658 */ 0x76BC,0x656C, + /* Array index: 0x0658 */ 0x76C0,0x2677, + /* Array index: 0x0658 */ 0x76C1,0x2678, + /* Array index: 0x0658 */ 0x76C7,0x2E32, + /* Array index: 0x0658 */ 0x76CB,0x325A, + /* Array index: 0x0658 */ 0x76CC,0x325B, + /* Array index: 0x0658 */ 0x76E2,0x4831, + /* Array index: 0x0658 */ 0x76EB,0x5835, + /* Array index: 0x0658 */ 0x76FD,0x2E35, + /* Array index: 0x0658 */ 0x76FF,0x2E33, + /* Array index: 0x0658 */ 0x7706,0x626C, + /* Array index: 0x0658 */ 0x770E,0x3264, + /* Array index: 0x0658 */ 0x770F,0x325F, + /* Array index: 0x0658 */ 0x7716,0x325E, + /* Array index: 0x0658 */ 0x7718,0x3268, + /* Array index: 0x0658 */ 0x771E,0x3759, + /* Array index: 0x0658 */ 0x7721,0x3267, + /* Array index: 0x0658 */ 0x7724,0x3265, + /* Array index: 0x0658 */ 0x7726,0x3755, + /* Array index: 0x0658 */ 0x772A,0x325C, + /* Array index: 0x0658 */ 0x772B,0x3263, + /* Array index: 0x0658 */ 0x7730,0x3753, + /* Array index: 0x0658 */ 0x7748,0x3D51, + /* Array index: 0x0658 */ 0x7749,0x3D52, + /* Array index: 0x0658 */ 0x7753,0x4327, + /* Array index: 0x0658 */ 0x7758,0x4328, + /* Array index: 0x0658 */ 0x775D,0x4325, + /* Array index: 0x0658 */ 0x7764,0x4326, + /* Array index: 0x0658 */ 0x7771,0x4839, + /* Array index: 0x0658 */ 0x778A,0x4D44, + /* Array index: 0x0658 */ 0x7790,0x4D46, + /* Array index: 0x0658 */ 0x7796,0x517B, + /* Array index: 0x0658 */ 0x7798,0x5179, + /* Array index: 0x0658 */ 0x77A4,0x5559, + /* Array index: 0x0658 */ 0x77A6,0x5558, + /* Array index: 0x0658 */ 0x77A9,0x555B, + /* Array index: 0x0658 */ 0x77AF,0x555C, + /* Array index: 0x0658 */ 0x77B8,0x5836, + /* Array index: 0x0658 */ 0x77B9,0x5838, + /* Array index: 0x0658 */ 0x77BE,0x583B, + /* Array index: 0x0658 */ 0x77C0,0x583A, + /* Array index: 0x0658 */ 0x77C1,0x5839, + /* Array index: 0x0658 */ 0x77C5,0x5A60, + /* Array index: 0x0658 */ 0x77C6,0x5A5F, + /* Array index: 0x0658 */ 0x77D1,0x5E42, + /* Array index: 0x0658 */ 0x77D6,0x6432, + /* Array index: 0x0658 */ 0x77DD,0x3269, + /* Array index: 0x0658 */ 0x77DF,0x3D57, + /* Array index: 0x0658 */ 0x77E6,0x2E36, + /* Array index: 0x0658 */ 0x77F4,0x267B, + /* Array index: 0x0658 */ 0x77F5,0x267C, + /* Array index: 0x0658 */ 0x7804,0x2E39, + /* Array index: 0x0658 */ 0x7815,0x2E3D, + /* Array index: 0x0658 */ 0x7819,0x656D, + /* Array index: 0x0658 */ 0x781B,0x656E, + /* Array index: 0x0658 */ 0x781E,0x667C, + /* Array index: 0x0658 */ 0x7824,0x326C, + /* Array index: 0x0658 */ 0x7836,0x326D, + /* Array index: 0x0658 */ 0x783D,0x656F, + /* Array index: 0x0658 */ 0x7842,0x3762, + /* Array index: 0x0658 */ 0x7846,0x3763, + /* Array index: 0x0658 */ 0x7847,0x375D, + /* Array index: 0x0658 */ 0x784B,0x375F, + /* Array index: 0x0658 */ 0x784F,0x3761, + /* Array index: 0x0658 */ 0x7851,0x3760, + /* Array index: 0x0658 */ 0x7853,0x6570, + /* Array index: 0x0658 */ 0x7854,0x6571, + /* Array index: 0x0658 */ 0x7858,0x6572, + /* Array index: 0x0658 */ 0x785F,0x3D5C, + /* Array index: 0x0658 */ 0x7863,0x3D59, + /* Array index: 0x0658 */ 0x7866,0x3D5D, + /* Array index: 0x0658 */ 0x7876,0x3D5A, + /* Array index: 0x0658 */ 0x7878,0x4331, + /* Array index: 0x0658 */ 0x787A,0x432D, + /* Array index: 0x0658 */ 0x787D,0x432E, + /* Array index: 0x0658 */ 0x7881,0x4337, + /* Array index: 0x0658 */ 0x7882,0x4329, + /* Array index: 0x0658 */ 0x7888,0x4335, + /* Array index: 0x0658 */ 0x788A,0x432B, + /* Array index: 0x0658 */ 0x788B,0x4330, + /* Array index: 0x0658 */ 0x788D,0x4334, + /* Array index: 0x0658 */ 0x7890,0x432A, + /* Array index: 0x0658 */ 0x7892,0x4336, + /* Array index: 0x0658 */ 0x78A6,0x483E, + /* Array index: 0x0658 */ 0x78AE,0x483F, + /* Array index: 0x0658 */ 0x78AF,0x4845, + /* Array index: 0x0658 */ 0x78B1,0x4844, + /* Array index: 0x0658 */ 0x78B7,0x6573, + /* Array index: 0x0658 */ 0x78B8,0x4840, + /* Array index: 0x0658 */ 0x78C0,0x4D4A, + /* Array index: 0x0658 */ 0x78C2,0x4D4D, + /* Array index: 0x0658 */ 0x78C6,0x4D48, + /* Array index: 0x0658 */ 0x78C7,0x4D4C, + /* Array index: 0x0658 */ 0x78D2,0x4D4B, + /* Array index: 0x0658 */ 0x78D3,0x4D49, + /* Array index: 0x0658 */ 0x78D6,0x5221, + /* Array index: 0x0658 */ 0x78D8,0x6574, + /* Array index: 0x0658 */ 0x78DC,0x5224, + /* Array index: 0x0658 */ 0x78EB,0x5222, + /* Array index: 0x0658 */ 0x78EE,0x6575, + /* Array index: 0x0658 */ 0x78F0,0x5560, + /* Array index: 0x0658 */ 0x78F1,0x5562, + /* Array index: 0x0658 */ 0x78F8,0x5561, + /* Array index: 0x0658 */ 0x7915,0x5844, + /* Array index: 0x0658 */ 0x7918,0x5A61, + /* Array index: 0x0658 */ 0x791A,0x5A62, + /* Array index: 0x0658 */ 0x7920,0x5A63, + /* Array index: 0x0658 */ 0x7922,0x6576, + /* Array index: 0x0658 */ 0x792E,0x5E45, + /* Array index: 0x0658 */ 0x7930,0x5E43, + /* Array index: 0x0658 */ 0x7932,0x5E44, + /* Array index: 0x0658 */ 0x7937,0x603C, + /* Array index: 0x0658 */ 0x793C,0x2433, + /* Array index: 0x0658 */ 0x794D,0x6577, + /* Array index: 0x0658 */ 0x7958,0x326F, + /* Array index: 0x0658 */ 0x7959,0x3270, + /* Array index: 0x0658 */ 0x7962,0x3272, + /* Array index: 0x0658 */ 0x7966,0x3D5E, + /* Array index: 0x0658 */ 0x796C,0x3766, + /* Array index: 0x0658 */ 0x796E,0x3765, + /* Array index: 0x0658 */ 0x7971,0x3D5F, + /* Array index: 0x0658 */ 0x7975,0x3D64, + /* Array index: 0x0658 */ 0x7976,0x3D62, + /* Array index: 0x0658 */ 0x797E,0x4338, + /* Array index: 0x0658 */ 0x7980,0x433D, + /* Array index: 0x0658 */ 0x7999,0x6579, + /* Array index: 0x0658 */ 0x79A3,0x657A, + /* Array index: 0x0658 */ 0x79A5,0x5226, + /* Array index: 0x0658 */ 0x79A9,0x5227, + /* Array index: 0x0658 */ 0x79AF,0x5845, + /* Array index: 0x0658 */ 0x79B5,0x603D, + /* Array index: 0x0658 */ 0x79BC,0x657B, + /* Array index: 0x0658 */ 0x79CA,0x2A44, + /* Array index: 0x0658 */ 0x79CC,0x654C, + /* Array index: 0x0658 */ 0x79D0,0x2E42, + /* Array index: 0x0658 */ 0x79D3,0x2E40, + /* Array index: 0x0658 */ 0x79D4,0x2E41, + /* Array index: 0x0658 */ 0x79E1,0x3276, + /* Array index: 0x0658 */ 0x79E2,0x327B, + /* Array index: 0x0658 */ 0x79E5,0x3277, + /* Array index: 0x0658 */ 0x79E8,0x3278, + /* Array index: 0x0658 */ 0x79F9,0x376C, + /* Array index: 0x0658 */ 0x79FF,0x3D65, + /* Array index: 0x0658 */ 0x7A07,0x3D66, + /* Array index: 0x0658 */ 0x7A09,0x3D69, + /* Array index: 0x0658 */ 0x7A0E,0x3D68, + /* Array index: 0x0658 */ 0x7A0F,0x4341, + /* Array index: 0x0658 */ 0x7A1D,0x4344, + /* Array index: 0x0658 */ 0x7A25,0x6524, + /* Array index: 0x0658 */ 0x7A32,0x4852, + /* Array index: 0x0658 */ 0x7A38,0x4D55, + /* Array index: 0x0658 */ 0x7A3A,0x4D56, + /* Array index: 0x0658 */ 0x7A3E,0x4D5A, + /* Array index: 0x0658 */ 0x7A41,0x4D53, + /* Array index: 0x0658 */ 0x7A42,0x4D57, + /* Array index: 0x0658 */ 0x7A45,0x522A, + /* Array index: 0x0658 */ 0x7A49,0x5564, + /* Array index: 0x0658 */ 0x7A4F,0x522C, + /* Array index: 0x0658 */ 0x7A53,0x5229, + /* Array index: 0x0658 */ 0x7A64,0x5A66, + /* Array index: 0x0658 */ 0x7A66,0x5A65, + /* Array index: 0x0658 */ 0x7A6A,0x5A67, + /* Array index: 0x0658 */ 0x7A6F,0x5C64, + /* Array index: 0x0658 */ 0x7A72,0x6076, + /* Array index: 0x0658 */ 0x7A73,0x6077, + /* Array index: 0x0658 */ 0x7A7C,0x2E44, + /* Array index: 0x0658 */ 0x7A7D,0x2E47, + /* Array index: 0x0658 */ 0x7A82,0x2E49, + /* Array index: 0x0658 */ 0x7A83,0x2E48, + /* Array index: 0x0658 */ 0x7A91,0x3772, + /* Array index: 0x0658 */ 0x7A93,0x3771, + /* Array index: 0x0658 */ 0x7A9A,0x3770, + /* Array index: 0x0658 */ 0x7AA1,0x4346, + /* Array index: 0x0658 */ 0x7AA4,0x4347, + /* Array index: 0x0658 */ 0x7AA7,0x657C, + /* Array index: 0x0658 */ 0x7AB0,0x4D5B, + /* Array index: 0x0658 */ 0x7ABB,0x522F, + /* Array index: 0x0658 */ 0x7ABD,0x522E, + /* Array index: 0x0658 */ 0x7AC2,0x5568, + /* Array index: 0x0658 */ 0x7AC8,0x5E49, + /* Array index: 0x0658 */ 0x7AC9,0x5E48, + /* Array index: 0x0658 */ 0x7AE1,0x3773, + /* Array index: 0x0658 */ 0x7AE2,0x3D71, + /* Array index: 0x0658 */ 0x7AE7,0x3D70, + /* Array index: 0x0658 */ 0x7AE9,0x4349, + /* Array index: 0x0658 */ 0x7AEA,0x434A, + /* Array index: 0x0658 */ 0x7AEC,0x4854, + /* Array index: 0x0658 */ 0x7AF8,0x5F55, + /* Array index: 0x0658 */ 0x7AFC,0x2E51, + /* Array index: 0x0658 */ 0x7AFE,0x2E50, + /* Array index: 0x0658 */ 0x7B0B,0x332B, + /* Array index: 0x0658 */ 0x7B0D,0x332A, + /* Array index: 0x0658 */ 0x7B14,0x332C, + /* Array index: 0x0658 */ 0x7B16,0x3778, + /* Array index: 0x0658 */ 0x7B17,0x3779, + /* Array index: 0x0658 */ 0x7B1C,0x3777, + /* Array index: 0x0658 */ 0x7B1F,0x377B, + /* Array index: 0x0658 */ 0x7B21,0x3776, + /* Array index: 0x0658 */ 0x7B29,0x632D, + /* Array index: 0x0658 */ 0x7B36,0x377A, + /* Array index: 0x0658 */ 0x7B37,0x657D, + /* Array index: 0x0658 */ 0x7B53,0x3D79, + /* Array index: 0x0658 */ 0x7B55,0x3D72, + /* Array index: 0x0658 */ 0x7B57,0x3D76, + /* Array index: 0x0658 */ 0x7B59,0x657E, + /* Array index: 0x0658 */ 0x7B5E,0x434F, + /* Array index: 0x0658 */ 0x7B62,0x434C, + /* Array index: 0x0658 */ 0x7B68,0x4355, + /* Array index: 0x0658 */ 0x7B6B,0x434D, + /* Array index: 0x0658 */ 0x7B6C,0x3D77, + /* Array index: 0x0658 */ 0x7B6F,0x4354, + /* Array index: 0x0658 */ 0x7B79,0x4351, + /* Array index: 0x0658 */ 0x7B81,0x4856, + /* Array index: 0x0658 */ 0x7B83,0x4858, + /* Array index: 0x0658 */ 0x7B86,0x4860, + /* Array index: 0x0658 */ 0x7B92,0x485A, + /* Array index: 0x0658 */ 0x7B93,0x485E, + /* Array index: 0x0658 */ 0x7B9E,0x4857, + /* Array index: 0x0658 */ 0x7B9F,0x485D, + /* Array index: 0x0658 */ 0x7BA3,0x485C, + /* Array index: 0x0658 */ 0x7BAE,0x4D5C, + /* Array index: 0x0658 */ 0x7BB2,0x4D65, + /* Array index: 0x0658 */ 0x7BB3,0x4D5D, + /* Array index: 0x0658 */ 0x7BBF,0x4D60, + /* Array index: 0x0658 */ 0x7BC2,0x6367, + /* Array index: 0x0658 */ 0x7BC3,0x6366, + /* Array index: 0x0658 */ 0x7BCD,0x4D63, + /* Array index: 0x0658 */ 0x7BD0,0x6621, + /* Array index: 0x0658 */ 0x7BEC,0x5233, + /* Array index: 0x0658 */ 0x7BED,0x5234, + /* Array index: 0x0658 */ 0x7BF6,0x556D, + /* Array index: 0x0658 */ 0x7BFA,0x556B, + /* Array index: 0x0658 */ 0x7BFC,0x556E, + /* Array index: 0x0658 */ 0x7C08,0x5570, + /* Array index: 0x0658 */ 0x7C12,0x5571, + /* Array index: 0x0658 */ 0x7C18,0x556F, + /* Array index: 0x0658 */ 0x7C1A,0x5850, + /* Array index: 0x0658 */ 0x7C1B,0x584E, + /* Array index: 0x0658 */ 0x7C24,0x5851, + /* Array index: 0x0658 */ 0x7C2E,0x584C, + /* Array index: 0x0658 */ 0x7C2F,0x6622, + /* Array index: 0x0658 */ 0x7C32,0x6623, + /* Array index: 0x0658 */ 0x7C34,0x5A6F, + /* Array index: 0x0658 */ 0x7C35,0x5A6E, + /* Array index: 0x0658 */ 0x7C42,0x6624, + /* Array index: 0x0658 */ 0x7C44,0x5C66, + /* Array index: 0x0658 */ 0x7C4B,0x5C65, + /* Array index: 0x0658 */ 0x7C4E,0x6625, + /* Array index: 0x0658 */ 0x7C51,0x5E4C, + /* Array index: 0x0658 */ 0x7C56,0x5E4B, + /* Array index: 0x0658 */ 0x7C58,0x5F58, + /* Array index: 0x0658 */ 0x7C5D,0x5F57, + /* Array index: 0x0658 */ 0x7C5E,0x603F, + /* Array index: 0x0658 */ 0x7C62,0x603E, + /* Array index: 0x0658 */ 0x7C68,0x6626, + /* Array index: 0x0658 */ 0x7C6D,0x6144, + /* Array index: 0x0658 */ 0x7C71,0x623A, + /* Array index: 0x0658 */ 0x7C74,0x2A49, + /* Array index: 0x0658 */ 0x7C76,0x2A48, + /* Array index: 0x0658 */ 0x7C77,0x2E52, + /* Array index: 0x0658 */ 0x7C7B,0x2E54, + /* Array index: 0x0658 */ 0x7C7C,0x2E53, + /* Array index: 0x0658 */ 0x7C83,0x3331, + /* Array index: 0x0658 */ 0x7C86,0x332E, + /* Array index: 0x0658 */ 0x7C87,0x3330, + /* Array index: 0x0658 */ 0x7C8B,0x3332, + /* Array index: 0x0658 */ 0x7C8E,0x332D, + /* Array index: 0x0658 */ 0x7C93,0x377D, + /* Array index: 0x0658 */ 0x7CA0,0x3E21, + /* Array index: 0x0658 */ 0x7CA4,0x3E23, + /* Array index: 0x0658 */ 0x7CA6,0x3E22, + /* Array index: 0x0658 */ 0x7CA7,0x3D7E, + /* Array index: 0x0658 */ 0x7CA9,0x6627, + /* Array index: 0x0658 */ 0x7CAE,0x4358, + /* Array index: 0x0658 */ 0x7CB0,0x435C, + /* Array index: 0x0658 */ 0x7CB7,0x4862, + /* Array index: 0x0658 */ 0x7CB8,0x4861, + /* Array index: 0x0658 */ 0x7CCD,0x4D6E, + /* Array index: 0x0658 */ 0x7CD3,0x5237, + /* Array index: 0x0658 */ 0x7CDA,0x5575, + /* Array index: 0x0658 */ 0x7CDB,0x5574, + /* Array index: 0x0658 */ 0x7CE1,0x5239, + /* Array index: 0x0658 */ 0x7CE3,0x5855, + /* Array index: 0x0658 */ 0x7CE6,0x5854, + /* Array index: 0x0658 */ 0x7CED,0x6628, + /* Array index: 0x0658 */ 0x7CF3,0x6169, + /* Array index: 0x0658 */ 0x7CF5,0x6040, + /* Array index: 0x0658 */ 0x7CFA,0x2722, + /* Array index: 0x0658 */ 0x7CFC,0x2A4B, + /* Array index: 0x0658 */ 0x7CFF,0x2A4A, + /* Array index: 0x0658 */ 0x7D24,0x3337, + /* Array index: 0x0658 */ 0x7D25,0x333B, + /* Array index: 0x0658 */ 0x7D2D,0x3829, + /* Array index: 0x0658 */ 0x7D34,0x3826, + /* Array index: 0x0658 */ 0x7D37,0x3827, + /* Array index: 0x0658 */ 0x7D48,0x382E, + /* Array index: 0x0658 */ 0x7D49,0x3824, + /* Array index: 0x0658 */ 0x7D4C,0x382B, + /* Array index: 0x0658 */ 0x7D4D,0x3E34, + /* Array index: 0x0658 */ 0x7D57,0x3E29, + /* Array index: 0x0658 */ 0x7D59,0x3E26, + /* Array index: 0x0658 */ 0x7D5A,0x3E2E, + /* Array index: 0x0658 */ 0x7D5D,0x3E2F, + /* Array index: 0x0658 */ 0x7D60,0x3E28, + /* Array index: 0x0658 */ 0x7D64,0x3E2C, + /* Array index: 0x0658 */ 0x7D6C,0x3E2A, + /* Array index: 0x0658 */ 0x7D7E,0x3E2B, + /* Array index: 0x0658 */ 0x7D90,0x435E, + /* Array index: 0x0658 */ 0x7DA4,0x4874, + /* Array index: 0x0658 */ 0x7DA8,0x486D, + /* Array index: 0x0658 */ 0x7DAB,0x486E, + /* Array index: 0x0658 */ 0x7DB3,0x4870, + /* Array index: 0x0658 */ 0x7DB6,0x4869, + /* Array index: 0x0658 */ 0x7DC8,0x4868, + /* Array index: 0x0658 */ 0x7DD6,0x4E22, + /* Array index: 0x0658 */ 0x7DDC,0x4D7C, + /* Array index: 0x0658 */ 0x7DE2,0x4D78, + /* Array index: 0x0658 */ 0x7DE4,0x4E24, + /* Array index: 0x0658 */ 0x7DE5,0x4E2F, + /* Array index: 0x0658 */ 0x7DEB,0x4E2E, + /* Array index: 0x0658 */ 0x7DED,0x4D77, + /* Array index: 0x0658 */ 0x7DF5,0x4E2B, + /* Array index: 0x0658 */ 0x7DF8,0x4D75, + /* Array index: 0x0658 */ 0x7E07,0x662A, + /* Array index: 0x0658 */ 0x7E19,0x523B, + /* Array index: 0x0658 */ 0x7E26,0x5240, + /* Array index: 0x0658 */ 0x7E27,0x523F, + /* Array index: 0x0658 */ 0x7E2C,0x5579, + /* Array index: 0x0658 */ 0x7E4D,0x557A, + /* Array index: 0x0658 */ 0x7E4F,0x5859, + /* Array index: 0x0658 */ 0x7E5B,0x585B, + /* Array index: 0x0658 */ 0x7E5D,0x5858, + /* Array index: 0x0658 */ 0x7E64,0x662C, + /* Array index: 0x0658 */ 0x7E66,0x585A, + /* Array index: 0x0658 */ 0x7E6C,0x5A72, + /* Array index: 0x0658 */ 0x7E6E,0x5A74, + /* Array index: 0x0658 */ 0x7E71,0x5A75, + /* Array index: 0x0658 */ 0x7E7F,0x5C6C, + /* Array index: 0x0658 */ 0x7E84,0x5E53, + /* Array index: 0x0658 */ 0x7E85,0x5E50, + /* Array index: 0x0658 */ 0x7E89,0x5E51, + /* Array index: 0x0658 */ 0x7E8E,0x5E52, + /* Array index: 0x0658 */ 0x7E92,0x5F5A, + /* Array index: 0x0658 */ 0x7E9E,0x6235, + /* Array index: 0x0658 */ 0x7F3B,0x3831, + /* Array index: 0x0658 */ 0x7F40,0x662D, + /* Array index: 0x0658 */ 0x7F41,0x4877, + /* Array index: 0x0658 */ 0x7F46,0x557D, + /* Array index: 0x0658 */ 0x7F47,0x585C, + /* Array index: 0x0658 */ 0x7F4E,0x5F5B, + /* Array index: 0x0658 */ 0x7F59,0x2A4E, + /* Array index: 0x0658 */ 0x7F62,0x333C, + /* Array index: 0x0658 */ 0x7F6F,0x4878, + /* Array index: 0x0658 */ 0x7F71,0x4879, + /* Array index: 0x0658 */ 0x7F78,0x4E30, + /* Array index: 0x0658 */ 0x7F84,0x6422, + /* Array index: 0x0658 */ 0x7F8F,0x2E5D, + /* Array index: 0x0658 */ 0x7F93,0x333D, + /* Array index: 0x0658 */ 0x7F97,0x333F, + /* Array index: 0x0658 */ 0x7F99,0x333E, + /* Array index: 0x0658 */ 0x7FA3,0x436E, + /* Array index: 0x0658 */ 0x7FAE,0x4E31, + /* Array index: 0x0658 */ 0x7FB4,0x585D, + /* Array index: 0x0658 */ 0x7FC4,0x3342, + /* Array index: 0x0658 */ 0x7FC6,0x3343, + /* Array index: 0x0658 */ 0x7FD3,0x3E37, + /* Array index: 0x0658 */ 0x7FD6,0x3E38, + /* Array index: 0x0658 */ 0x7FDD,0x4372, + /* Array index: 0x0658 */ 0x7FE7,0x4E32, + /* Array index: 0x0658 */ 0x7FF6,0x557E, + /* Array index: 0x0658 */ 0x7FFA,0x5861, + /* Array index: 0x0658 */ 0x8002,0x667B, + /* Array index: 0x0658 */ 0x8008,0x3836, + /* Array index: 0x0658 */ 0x800A,0x3344, + /* Array index: 0x0658 */ 0x801A,0x3837, + /* Array index: 0x0658 */ 0x801D,0x3839, + /* Array index: 0x0658 */ 0x8023,0x4922, + /* Array index: 0x0658 */ 0x802B,0x5621, + /* Array index: 0x0658 */ 0x802E,0x5862, + /* Array index: 0x0658 */ 0x802F,0x5C6F, + /* Array index: 0x0658 */ 0x803B,0x3349, + /* Array index: 0x0658 */ 0x803C,0x3348, + /* Array index: 0x0658 */ 0x8040,0x3347, + /* Array index: 0x0658 */ 0x8041,0x662F, + /* Array index: 0x0658 */ 0x8044,0x383D, + /* Array index: 0x0658 */ 0x8045,0x383C, + /* Array index: 0x0658 */ 0x8049,0x383B, + /* Array index: 0x0658 */ 0x804E,0x3E3C, + /* Array index: 0x0658 */ 0x8053,0x6729, + /* Array index: 0x0658 */ 0x8057,0x4373, + /* Array index: 0x0658 */ 0x8059,0x6356, + /* Array index: 0x0658 */ 0x805B,0x4923, + /* Array index: 0x0658 */ 0x806E,0x5243, + /* Array index: 0x0658 */ 0x8074,0x5622, + /* Array index: 0x0658 */ 0x808D,0x2435, + /* Array index: 0x0658 */ 0x808E,0x2436, + /* Array index: 0x0658 */ 0x8091,0x2724, + /* Array index: 0x0658 */ 0x8094,0x2726, + /* Array index: 0x0658 */ 0x8097,0x2725, + /* Array index: 0x0658 */ 0x809F,0x2723, + /* Array index: 0x0658 */ 0x80AC,0x2A59, + /* Array index: 0x0658 */ 0x80B0,0x2A52, + /* Array index: 0x0658 */ 0x80B3,0x2A54, + /* Array index: 0x0658 */ 0x80B6,0x2A57, + /* Array index: 0x0658 */ 0x80BB,0x6631, + /* Array index: 0x0658 */ 0x80C6,0x2E66, + /* Array index: 0x0658 */ 0x80CB,0x2E60, + /* Array index: 0x0658 */ 0x80D2,0x2E61, + /* Array index: 0x0658 */ 0x80D3,0x2E5E, + /* Array index: 0x0658 */ 0x80DF,0x2E65, + /* Array index: 0x0658 */ 0x80E2,0x2E64, + /* Array index: 0x0658 */ 0x80EE,0x334C, + /* Array index: 0x0658 */ 0x80F6,0x334A, + /* Array index: 0x0658 */ 0x80F7,0x3352, + /* Array index: 0x0658 */ 0x80FF,0x334B, + /* Array index: 0x0658 */ 0x8103,0x334E, + /* Array index: 0x0658 */ 0x8104,0x334D, + /* Array index: 0x0658 */ 0x8107,0x334F, + /* Array index: 0x0658 */ 0x8109,0x2E63, + /* Array index: 0x0658 */ 0x8114,0x3E44, + /* Array index: 0x0658 */ 0x8117,0x3849, + /* Array index: 0x0658 */ 0x811A,0x3847, + /* Array index: 0x0658 */ 0x8128,0x632E, + /* Array index: 0x0658 */ 0x812A,0x3841, + /* Array index: 0x0658 */ 0x812E,0x3842, + /* Array index: 0x0658 */ 0x8131,0x3845, + /* Array index: 0x0658 */ 0x8134,0x3848, + /* Array index: 0x0658 */ 0x813B,0x3E3E, + /* Array index: 0x0658 */ 0x8145,0x3E3D, + /* Array index: 0x0658 */ 0x8148,0x3E40, + /* Array index: 0x0658 */ 0x8149,0x3E42, + /* Array index: 0x0658 */ 0x815D,0x437B, + /* Array index: 0x0658 */ 0x815F,0x437E, + /* Array index: 0x0658 */ 0x8163,0x4375, + /* Array index: 0x0658 */ 0x816A,0x4376, + /* Array index: 0x0658 */ 0x816C,0x4377, + /* Array index: 0x0658 */ 0x816D,0x4423, + /* Array index: 0x0658 */ 0x8175,0x437C, + /* Array index: 0x0658 */ 0x817D,0x4422, + /* Array index: 0x0658 */ 0x8181,0x4927, + /* Array index: 0x0658 */ 0x8184,0x492A, + /* Array index: 0x0658 */ 0x81A1,0x4E3A, + /* Array index: 0x0658 */ 0x81AA,0x5249, + /* Array index: 0x0658 */ 0x81AD,0x5247, + /* Array index: 0x0658 */ 0x81AF,0x5244, + /* Array index: 0x0658 */ 0x81B8,0x5623, + /* Array index: 0x0658 */ 0x81C8,0x5624, + /* Array index: 0x0658 */ 0x81CE,0x5865, + /* Array index: 0x0658 */ 0x81D4,0x5A77, + /* Array index: 0x0658 */ 0x81D6,0x5A78, + /* Array index: 0x0658 */ 0x81EF,0x3E47, + /* Array index: 0x0658 */ 0x81F6,0x3E48, + /* Array index: 0x0658 */ 0x8203,0x3E49, + /* Array index: 0x0658 */ 0x820E,0x2A5D, + /* Array index: 0x0658 */ 0x8213,0x492B, + /* Array index: 0x0658 */ 0x8224,0x2E68, + /* Array index: 0x0658 */ 0x8227,0x3357, + /* Array index: 0x0658 */ 0x8229,0x3358, + /* Array index: 0x0658 */ 0x822D,0x3355, + /* Array index: 0x0658 */ 0x8241,0x4426, + /* Array index: 0x0658 */ 0x8248,0x6634, + /* Array index: 0x0658 */ 0x824A,0x492D, + /* Array index: 0x0658 */ 0x824C,0x492E, + /* Array index: 0x0658 */ 0x8262,0x5A7A, + /* Array index: 0x0658 */ 0x8265,0x5A7B, + /* Array index: 0x0658 */ 0x826A,0x5E55, + /* Array index: 0x0658 */ 0x8276,0x5A7C, + /* Array index: 0x0658 */ 0x827B,0x2438, + /* Array index: 0x0658 */ 0x8286,0x2728, + /* Array index: 0x0658 */ 0x828C,0x2729, + /* Array index: 0x0658 */ 0x8295,0x272B, + /* Array index: 0x0658 */ 0x829C,0x2A60, + /* Array index: 0x0658 */ 0x82A6,0x2A6B, + /* Array index: 0x0658 */ 0x82AA,0x2A66, + /* Array index: 0x0658 */ 0x82B2,0x2A6C, + /* Array index: 0x0658 */ 0x82C4,0x2A5E, + /* Array index: 0x0658 */ 0x82C9,0x2A68, + /* Array index: 0x0658 */ 0x82D0,0x2E76, + /* Array index: 0x0658 */ 0x82D8,0x2E6A, + /* Array index: 0x0658 */ 0x82DD,0x2E6B, + /* Array index: 0x0658 */ 0x82E2,0x2E78, + /* Array index: 0x0658 */ 0x82E9,0x2E72, + /* Array index: 0x0658 */ 0x82EE,0x2E74, + /* Array index: 0x0658 */ 0x82F7,0x2E69, + /* Array index: 0x0658 */ 0x82F8,0x2E6E, + /* Array index: 0x0658 */ 0x82FC,0x2E6F, + /* Array index: 0x0658 */ 0x82FD,0x2E7A, + /* Array index: 0x0658 */ 0x830B,0x2E79, + /* Array index: 0x0658 */ 0x830E,0x2E77, + /* Array index: 0x0658 */ 0x8310,0x6635, + /* Array index: 0x0658 */ 0x8312,0x6637, + /* Array index: 0x0658 */ 0x8318,0x3362, + /* Array index: 0x0658 */ 0x831D,0x384D, + /* Array index: 0x0658 */ 0x831F,0x3359, + /* Array index: 0x0658 */ 0x8321,0x335F, + /* Array index: 0x0658 */ 0x8323,0x385B, + /* Array index: 0x0658 */ 0x833E,0x2A5F, + /* Array index: 0x0658 */ 0x8346,0x3E57, + /* Array index: 0x0658 */ 0x8357,0x335A, + /* Array index: 0x0658 */ 0x8358,0x3363, + /* Array index: 0x0658 */ 0x8362,0x6636, + /* Array index: 0x0658 */ 0x8363,0x2D33, + /* Array index: 0x0658 */ 0x8371,0x384E, + /* Array index: 0x0658 */ 0x8372,0x3851, + /* Array index: 0x0658 */ 0x8379,0x3854, + /* Array index: 0x0658 */ 0x8380,0x3850, + /* Array index: 0x0658 */ 0x8384,0x384F, + /* Array index: 0x0658 */ 0x8385,0x385D, + /* Array index: 0x0658 */ 0x8391,0x3855, + /* Array index: 0x0658 */ 0x839C,0x385E, + /* Array index: 0x0658 */ 0x839F,0x3857, + /* Array index: 0x0658 */ 0x83A1,0x3852, + /* Array index: 0x0658 */ 0x83AD,0x3858, + /* Array index: 0x0658 */ 0x83B7,0x385F, + /* Array index: 0x0658 */ 0x83CD,0x3E5E, + /* Array index: 0x0658 */ 0x83D2,0x3E4F, + /* Array index: 0x0658 */ 0x83D3,0x3E59, + /* Array index: 0x0658 */ 0x83DA,0x3E4D, + /* Array index: 0x0658 */ 0x83E6,0x3E5F, + /* Array index: 0x0658 */ 0x83ED,0x3E4B, + /* Array index: 0x0658 */ 0x8400,0x3E52, + /* Array index: 0x0658 */ 0x8402,0x3E5C, + /* Array index: 0x0658 */ 0x8405,0x3E5A, + /* Array index: 0x0658 */ 0x8408,0x3E50, + /* Array index: 0x0658 */ 0x841E,0x6639, + /* Array index: 0x0658 */ 0x841F,0x3E5B, + /* Array index: 0x0658 */ 0x8421,0x6638, + /* Array index: 0x0658 */ 0x842A,0x442D, + /* Array index: 0x0658 */ 0x842E,0x4431, + /* Array index: 0x0658 */ 0x843E,0x443A, + /* Array index: 0x0658 */ 0x8441,0x4435, + /* Array index: 0x0658 */ 0x8448,0x442C, + /* Array index: 0x0658 */ 0x844A,0x443E, + /* Array index: 0x0658 */ 0x844F,0x4427, + /* Array index: 0x0658 */ 0x8453,0x4433, + /* Array index: 0x0658 */ 0x8455,0x443F, + /* Array index: 0x0658 */ 0x8458,0x4440, + /* Array index: 0x0658 */ 0x845C,0x4432, + /* Array index: 0x0658 */ 0x8462,0x4438, + /* Array index: 0x0658 */ 0x8464,0x4430, + /* Array index: 0x0658 */ 0x8471,0x443C, + /* Array index: 0x0658 */ 0x8472,0x442F, + /* Array index: 0x0658 */ 0x847B,0x442E, + /* Array index: 0x0658 */ 0x847F,0x442A, + /* Array index: 0x0658 */ 0x8480,0x4439, + /* Array index: 0x0658 */ 0x8483,0x443B, + /* Array index: 0x0658 */ 0x8484,0x4428, + /* Array index: 0x0658 */ 0x84A3,0x493C, + /* Array index: 0x0658 */ 0x84A5,0x4939, + /* Array index: 0x0658 */ 0x84AD,0x4942, + /* Array index: 0x0658 */ 0x84B3,0x493B, + /* Array index: 0x0658 */ 0x84B5,0x493A, + /* Array index: 0x0658 */ 0x84B7,0x4941, + /* Array index: 0x0658 */ 0x84BD,0x4932, + /* Array index: 0x0658 */ 0x84C3,0x4936, + /* Array index: 0x0658 */ 0x84C8,0x4436, + /* Array index: 0x0658 */ 0x84D5,0x493F, + /* Array index: 0x0658 */ 0x84D8,0x493E, + /* Array index: 0x0658 */ 0x84DA,0x4943, + /* Array index: 0x0658 */ 0x84DE,0x663B, + /* Array index: 0x0658 */ 0x84E1,0x663C, + /* Array index: 0x0658 */ 0x84E2,0x663A, + /* Array index: 0x0658 */ 0x84E4,0x493D, + /* Array index: 0x0658 */ 0x84ED,0x4E4F, + /* Array index: 0x0658 */ 0x84F5,0x4E44, + /* Array index: 0x0658 */ 0x84F8,0x4E42, + /* Array index: 0x0658 */ 0x851B,0x4E4B, + /* Array index: 0x0658 */ 0x853F,0x525A, + /* Array index: 0x0658 */ 0x8542,0x5252, + /* Array index: 0x0658 */ 0x854B,0x5259, + /* Array index: 0x0658 */ 0x854C,0x5250, + /* Array index: 0x0658 */ 0x855A,0x5258, + /* Array index: 0x0658 */ 0x855C,0x5254, + /* Array index: 0x0658 */ 0x855F,0x5256, + /* Array index: 0x0658 */ 0x856F,0x524F, + /* Array index: 0x0658 */ 0x8570,0x5255, + /* Array index: 0x0658 */ 0x8573,0x663D, + /* Array index: 0x0658 */ 0x857F,0x562B, + /* Array index: 0x0658 */ 0x8592,0x5628, + /* Array index: 0x0658 */ 0x8593,0x5629, + /* Array index: 0x0658 */ 0x8597,0x562D, + /* Array index: 0x0658 */ 0x85AB,0x562C, + /* Array index: 0x0658 */ 0x85AC,0x5630, + /* Array index: 0x0658 */ 0x85B2,0x586C, + /* Array index: 0x0658 */ 0x85BB,0x586E, + /* Array index: 0x0658 */ 0x85C1,0x586F, + /* Array index: 0x0658 */ 0x85CC,0x586B, + /* Array index: 0x0658 */ 0x85D4,0x663E, + /* Array index: 0x0658 */ 0x85D6,0x5A7E, + /* Array index: 0x0658 */ 0x85DB,0x5A7D, + /* Array index: 0x0658 */ 0x85E7,0x5B22, + /* Array index: 0x0658 */ 0x85EE,0x5C7B, + /* Array index: 0x0658 */ 0x85F4,0x5B25, + /* Array index: 0x0658 */ 0x85F5,0x663F, + /* Array index: 0x0658 */ 0x85FC,0x5C76, + /* Array index: 0x0658 */ 0x8602,0x5C78, + /* Array index: 0x0658 */ 0x8603,0x5C7C, + /* Array index: 0x0658 */ 0x8608,0x5D22, + /* Array index: 0x0658 */ 0x860D,0x5C7E, + /* Array index: 0x0658 */ 0x860F,0x5D23, + /* Array index: 0x0658 */ 0x8610,0x5C77, + /* Array index: 0x0658 */ 0x8613,0x5D21, + /* Array index: 0x0658 */ 0x8615,0x5E5B, + /* Array index: 0x0658 */ 0x8616,0x5E5A, + /* Array index: 0x0658 */ 0x861D,0x5E5C, + /* Array index: 0x0658 */ 0x8628,0x5E58, + /* Array index: 0x0658 */ 0x862B,0x5E56, + /* Array index: 0x0658 */ 0x862F,0x5E57, + /* Array index: 0x0658 */ 0x8637,0x6640, + /* Array index: 0x0658 */ 0x863D,0x6043, + /* Array index: 0x0658 */ 0x8641,0x602F, + /* Array index: 0x0658 */ 0x8642,0x6146, + /* Array index: 0x0658 */ 0x8645,0x6641, + /* Array index: 0x0658 */ 0x8649,0x6147, + /* Array index: 0x0658 */ 0x864A,0x617C, + /* Array index: 0x0658 */ 0x8657,0x3863, + /* Array index: 0x0658 */ 0x8658,0x3860, + /* Array index: 0x0658 */ 0x865A,0x3861, + /* Array index: 0x0658 */ 0x865D,0x3E61, + /* Array index: 0x0658 */ 0x866C,0x272D, + /* Array index: 0x0658 */ 0x8672,0x6642, + /* Array index: 0x0658 */ 0x8675,0x2F23, + /* Array index: 0x0658 */ 0x8676,0x2E7C, + /* Array index: 0x0658 */ 0x8678,0x2E7E, + /* Array index: 0x0658 */ 0x867D,0x2F24, + /* Array index: 0x0658 */ 0x8684,0x3369, + /* Array index: 0x0658 */ 0x8689,0x336C, + /* Array index: 0x0658 */ 0x868F,0x336F, + /* Array index: 0x0658 */ 0x8692,0x336E, + /* Array index: 0x0658 */ 0x869B,0x336B, + /* Array index: 0x0658 */ 0x869F,0x336A, + /* Array index: 0x0658 */ 0x86A0,0x3370, + /* Array index: 0x0658 */ 0x86A6,0x336D, + /* Array index: 0x0658 */ 0x86AE,0x3866, + /* Array index: 0x0658 */ 0x86B2,0x3864, + /* Array index: 0x0658 */ 0x86D5,0x3E62, + /* Array index: 0x0658 */ 0x86E1,0x3E63, + /* Array index: 0x0658 */ 0x86EE,0x3E68, + /* Array index: 0x0658 */ 0x86FC,0x4444, + /* Array index: 0x0658 */ 0x86FD,0x4445, + /* Array index: 0x0658 */ 0x86FF,0x4449, + /* Array index: 0x0658 */ 0x8715,0x4446, + /* Array index: 0x0658 */ 0x8716,0x4448, + /* Array index: 0x0658 */ 0x871D,0x494F, + /* Array index: 0x0658 */ 0x872B,0x494A, + /* Array index: 0x0658 */ 0x8736,0x4945, + /* Array index: 0x0658 */ 0x8739,0x494C, + /* Array index: 0x0658 */ 0x873D,0x4949, + /* Array index: 0x0658 */ 0x8745,0x494E, + /* Array index: 0x0658 */ 0x8747,0x494B, + /* Array index: 0x0658 */ 0x874A,0x6643, + /* Array index: 0x0658 */ 0x8771,0x4E5D, + /* Array index: 0x0658 */ 0x877D,0x4E59, + /* Array index: 0x0658 */ 0x878A,0x525B, + /* Array index: 0x0658 */ 0x878B,0x525D, + /* Array index: 0x0658 */ 0x878E,0x525F, + /* Array index: 0x0658 */ 0x8799,0x5262, + /* Array index: 0x0658 */ 0x87A1,0x525E, + /* Array index: 0x0658 */ 0x87A5,0x6645, + /* Array index: 0x0658 */ 0x87A9,0x6644, + /* Array index: 0x0658 */ 0x87B1,0x563A, + /* Array index: 0x0658 */ 0x87C1,0x5639, + /* Array index: 0x0658 */ 0x87C7,0x563B, + /* Array index: 0x0658 */ 0x87CD,0x5636, + /* Array index: 0x0658 */ 0x87CE,0x5634, + /* Array index: 0x0658 */ 0x87D5,0x5B28, + /* Array index: 0x0658 */ 0x87D6,0x5876, + /* Array index: 0x0658 */ 0x87DA,0x5878, + /* Array index: 0x0658 */ 0x87E9,0x5873, + /* Array index: 0x0658 */ 0x87EE,0x5874, + /* Array index: 0x0658 */ 0x87F0,0x5875, + /* Array index: 0x0658 */ 0x87F5,0x6646, + /* Array index: 0x0658 */ 0x87F8,0x5B2C, + /* Array index: 0x0658 */ 0x87FD,0x5B27, + /* Array index: 0x0658 */ 0x8807,0x5B29, + /* Array index: 0x0658 */ 0x880E,0x5877, + /* Array index: 0x0658 */ 0x880F,0x5B2B, + /* Array index: 0x0658 */ 0x8812,0x5D25, + /* Array index: 0x0658 */ 0x8818,0x5D24, + /* Array index: 0x0658 */ 0x881A,0x5E5D, + /* Array index: 0x0658 */ 0x8827,0x5F5F, + /* Array index: 0x0658 */ 0x882D,0x6045, + /* Array index: 0x0658 */ 0x8834,0x6647, + /* Array index: 0x0658 */ 0x8842,0x2F26, + /* Array index: 0x0658 */ 0x884F,0x3371, + /* Array index: 0x0658 */ 0x8850,0x6648, + /* Array index: 0x0658 */ 0x8858,0x444D, + /* Array index: 0x0658 */ 0x885C,0x4E5F, + /* Array index: 0x0658 */ 0x885E,0x5263, + /* Array index: 0x0658 */ 0x885F,0x5264, + /* Array index: 0x0658 */ 0x8866,0x2F27, + /* Array index: 0x0658 */ 0x886E,0x3374, + /* Array index: 0x0658 */ 0x8873,0x3377, + /* Array index: 0x0658 */ 0x8878,0x3372, + /* Array index: 0x0658 */ 0x887A,0x3373, + /* Array index: 0x0658 */ 0x887B,0x3375, + /* Array index: 0x0658 */ 0x8884,0x3376, + /* Array index: 0x0658 */ 0x8887,0x6649, + /* Array index: 0x0658 */ 0x888A,0x3872, + /* Array index: 0x0658 */ 0x888F,0x386E, + /* Array index: 0x0658 */ 0x8890,0x3874, + /* Array index: 0x0658 */ 0x8894,0x386C, + /* Array index: 0x0658 */ 0x889C,0x386B, + /* Array index: 0x0658 */ 0x88A0,0x3873, + /* Array index: 0x0658 */ 0x88A3,0x386D, + /* Array index: 0x0658 */ 0x88A5,0x386F, + /* Array index: 0x0658 */ 0x88A6,0x3871, + /* Array index: 0x0658 */ 0x88A9,0x3870, + /* Array index: 0x0658 */ 0x88B4,0x3E70, + /* Array index: 0x0658 */ 0x88B5,0x3E72, + /* Array index: 0x0658 */ 0x88BB,0x3E6D, + /* Array index: 0x0658 */ 0x88BF,0x3E6F, + /* Array index: 0x0658 */ 0x88CF,0x444E, + /* Array index: 0x0658 */ 0x88E0,0x444F, + /* Array index: 0x0658 */ 0x88E6,0x4E60, + /* Array index: 0x0658 */ 0x88E9,0x4959, + /* Array index: 0x0658 */ 0x88EA,0x4952, + /* Array index: 0x0658 */ 0x88ED,0x4957, + /* Array index: 0x0658 */ 0x88F5,0x4954, + /* Array index: 0x0658 */ 0x88FF,0x4951, + /* Array index: 0x0658 */ 0x8900,0x4956, + /* Array index: 0x0658 */ 0x8903,0x4958, + /* Array index: 0x0658 */ 0x890F,0x4E61, + /* Array index: 0x0658 */ 0x891B,0x4E62, + /* Array index: 0x0658 */ 0x8924,0x5265, + /* Array index: 0x0658 */ 0x8939,0x5640, + /* Array index: 0x0658 */ 0x893F,0x563F, + /* Array index: 0x0658 */ 0x8940,0x563D, + /* Array index: 0x0658 */ 0x8943,0x5642, + /* Array index: 0x0658 */ 0x8948,0x5879, + /* Array index: 0x0658 */ 0x894A,0x587A, + /* Array index: 0x0658 */ 0x894D,0x587C, + /* Array index: 0x0658 */ 0x894E,0x587B, + /* Array index: 0x0658 */ 0x8954,0x664A, + /* Array index: 0x0658 */ 0x8965,0x5D29, + /* Array index: 0x0658 */ 0x8967,0x5D28, + /* Array index: 0x0658 */ 0x8978,0x6149, + /* Array index: 0x0658 */ 0x897D,0x617D, + /* Array index: 0x0658 */ 0x8984,0x664B, + /* Array index: 0x0658 */ 0x8987,0x5B2F, + /* Array index: 0x0658 */ 0x8989,0x6046, + /* Array index: 0x0658 */ 0x898A,0x614A, + /* Array index: 0x0658 */ 0x898C,0x2F29, + /* Array index: 0x0658 */ 0x8991,0x3876, + /* Array index: 0x0658 */ 0x8992,0x3875, + /* Array index: 0x0658 */ 0x8994,0x3877, + /* Array index: 0x0658 */ 0x899A,0x3E74, + /* Array index: 0x0658 */ 0x89A5,0x4E65, + /* Array index: 0x0658 */ 0x89A7,0x5266, + /* Array index: 0x0658 */ 0x89A9,0x4E64, + /* Array index: 0x0658 */ 0x89AB,0x5646, + /* Array index: 0x0658 */ 0x89B0,0x587E, + /* Array index: 0x0658 */ 0x89B1,0x587D, + /* Array index: 0x0658 */ 0x89B3,0x5921, + /* Array index: 0x0658 */ 0x89B5,0x5B31, + /* Array index: 0x0658 */ 0x89BB,0x5D2A, + /* Array index: 0x0658 */ 0x89BC,0x5E61, + /* Array index: 0x0658 */ 0x89E7,0x4454, + /* Array index: 0x0658 */ 0x89EA,0x495C, + /* Array index: 0x0658 */ 0x89EE,0x4E66, + /* Array index: 0x0658 */ 0x89F5,0x5B32, + /* Array index: 0x0658 */ 0x8A05,0x2F2A, + /* Array index: 0x0658 */ 0x8A06,0x2F2C, + /* Array index: 0x0658 */ 0x8A0B,0x337B, + /* Array index: 0x0658 */ 0x8A0D,0x337A, + /* Array index: 0x0658 */ 0x8A19,0x337C, + /* Array index: 0x0658 */ 0x8A1C,0x387E, + /* Array index: 0x0658 */ 0x8A20,0x3923, + /* Array index: 0x0658 */ 0x8A21,0x3929, + /* Array index: 0x0658 */ 0x8A26,0x3879, + /* Array index: 0x0658 */ 0x8A28,0x387B, + /* Array index: 0x0658 */ 0x8A29,0x3925, + /* Array index: 0x0658 */ 0x8A2B,0x3922, + /* Array index: 0x0658 */ 0x8A2E,0x6330, + /* Array index: 0x0658 */ 0x8A32,0x387A, + /* Array index: 0x0658 */ 0x8A35,0x3E7C, + /* Array index: 0x0658 */ 0x8A38,0x3E7D, + /* Array index: 0x0658 */ 0x8A3D,0x3F24, + /* Array index: 0x0658 */ 0x8A42,0x3E7E, + /* Array index: 0x0658 */ 0x8A43,0x3E75, + /* Array index: 0x0658 */ 0x8A49,0x3F21, + /* Array index: 0x0658 */ 0x8A4B,0x3F23, + /* Array index: 0x0658 */ 0x8A5A,0x3E78, + /* Array index: 0x0658 */ 0x8A5D,0x3F22, + /* Array index: 0x0658 */ 0x8A64,0x4460, + /* Array index: 0x0658 */ 0x8A65,0x4459, + /* Array index: 0x0658 */ 0x8A67,0x4463, + /* Array index: 0x0658 */ 0x8A6A,0x4455, + /* Array index: 0x0658 */ 0x8A6F,0x4458, + /* Array index: 0x0658 */ 0x8A78,0x445B, + /* Array index: 0x0658 */ 0x8A7D,0x445C, + /* Array index: 0x0658 */ 0x8A7E,0x4461, + /* Array index: 0x0658 */ 0x8A80,0x4456, + /* Array index: 0x0658 */ 0x8A88,0x445D, + /* Array index: 0x0658 */ 0x8A8E,0x495F, + /* Array index: 0x0658 */ 0x8A90,0x4964, + /* Array index: 0x0658 */ 0x8A94,0x4963, + /* Array index: 0x0658 */ 0x8AA2,0x4960, + /* Array index: 0x0658 */ 0x8AA9,0x4965, + /* Array index: 0x0658 */ 0x8AAC,0x4966, + /* Array index: 0x0658 */ 0x8AAF,0x4E74, + /* Array index: 0x0658 */ 0x8AC1,0x4E73, + /* Array index: 0x0658 */ 0x8ACA,0x4E75, + /* Array index: 0x0658 */ 0x8ACC,0x4E69, + /* Array index: 0x0658 */ 0x8ACE,0x4E6A, + /* Array index: 0x0658 */ 0x8AD0,0x4E76, + /* Array index: 0x0658 */ 0x8AE3,0x526A, + /* Array index: 0x0658 */ 0x8AE5,0x526B, + /* Array index: 0x0658 */ 0x8AE9,0x4E6F, + /* Array index: 0x0658 */ 0x8AEA,0x5267, + /* Array index: 0x0658 */ 0x8AEC,0x526E, + /* Array index: 0x0658 */ 0x8AF9,0x5269, + /* Array index: 0x0658 */ 0x8AFD,0x5268, + /* Array index: 0x0658 */ 0x8B03,0x664C, + /* Array index: 0x0658 */ 0x8B09,0x5649, + /* Array index: 0x0658 */ 0x8B0C,0x564A, + /* Array index: 0x0658 */ 0x8B1F,0x5648, + /* Array index: 0x0658 */ 0x8B29,0x592A, + /* Array index: 0x0658 */ 0x8B2D,0x5926, + /* Array index: 0x0658 */ 0x8B32,0x5924, + /* Array index: 0x0658 */ 0x8B34,0x5928, + /* Array index: 0x0658 */ 0x8B38,0x5923, + /* Array index: 0x0658 */ 0x8B3F,0x5B34, + /* Array index: 0x0658 */ 0x8B43,0x5B35, + /* Array index: 0x0658 */ 0x8B4C,0x5B36, + /* Array index: 0x0658 */ 0x8B4D,0x5D33, + /* Array index: 0x0658 */ 0x8B61,0x5D30, + /* Array index: 0x0658 */ 0x8B62,0x5D2C, + /* Array index: 0x0658 */ 0x8B64,0x5D32, + /* Array index: 0x0658 */ 0x8B69,0x5D2B, + /* Array index: 0x0658 */ 0x8B6E,0x5D2E, + /* Array index: 0x0658 */ 0x8B71,0x5C6D, + /* Array index: 0x0658 */ 0x8B73,0x642D, + /* Array index: 0x0658 */ 0x8B75,0x5E62, + /* Array index: 0x0658 */ 0x8B7C,0x5E63, + /* Array index: 0x0658 */ 0x8B81,0x5F61, + /* Array index: 0x0658 */ 0x8B83,0x5F62, + /* Array index: 0x0658 */ 0x8B87,0x6048, + /* Array index: 0x0658 */ 0x8B8D,0x6047, + /* Array index: 0x0658 */ 0x8B90,0x6049, + /* Array index: 0x0658 */ 0x8B91,0x607B, + /* Array index: 0x0658 */ 0x8B97,0x614B, + /* Array index: 0x0658 */ 0x8B9B,0x616B, + /* Array index: 0x0658 */ 0x8B9D,0x617E, + /* Array index: 0x0658 */ 0x8C3A,0x392A, + /* Array index: 0x0658 */ 0x8C40,0x564D, + /* Array index: 0x0658 */ 0x8C44,0x5F64, + /* Array index: 0x0658 */ 0x8C58,0x392D, + /* Array index: 0x0658 */ 0x8C5B,0x392C, + /* Array index: 0x0658 */ 0x8C5E,0x3F2A, + /* Array index: 0x0658 */ 0x8C60,0x3F29, + /* Array index: 0x0658 */ 0x8C63,0x4464, + /* Array index: 0x0658 */ 0x8C67,0x496D, + /* Array index: 0x0658 */ 0x8C74,0x592B, + /* Array index: 0x0658 */ 0x8C7C,0x392E, + /* Array index: 0x0658 */ 0x8C7E,0x3F2C, + /* Array index: 0x0658 */ 0x8C7F,0x3F2B, + /* Array index: 0x0658 */ 0x8C83,0x3F2D, + /* Array index: 0x0658 */ 0x8C87,0x634A, + /* Array index: 0x0658 */ 0x8C88,0x4465, + /* Array index: 0x0658 */ 0x8C8E,0x4E7A, + /* Array index: 0x0658 */ 0x8C96,0x564F, + /* Array index: 0x0658 */ 0x8C9B,0x614D, + /* Array index: 0x0658 */ 0x8C9F,0x2F2E, + /* Array index: 0x0658 */ 0x8CA6,0x3930, + /* Array index: 0x0658 */ 0x8CAD,0x3932, + /* Array index: 0x0658 */ 0x8CAE,0x3931, + /* Array index: 0x0658 */ 0x8CB1,0x3F2F, + /* Array index: 0x0658 */ 0x8CC9,0x4469, + /* Array index: 0x0658 */ 0x8CCD,0x4467, + /* Array index: 0x0658 */ 0x8CD0,0x4970, + /* Array index: 0x0658 */ 0x8CD4,0x4972, + /* Array index: 0x0658 */ 0x8CD6,0x4971, + /* Array index: 0x0658 */ 0x8CD8,0x664E, + /* Array index: 0x0658 */ 0x8CDB,0x4E7E, + /* Array index: 0x0658 */ 0x8CE9,0x4E7D, + /* Array index: 0x0658 */ 0x8CEB,0x4F22, + /* Array index: 0x0658 */ 0x8CEF,0x5275, + /* Array index: 0x0658 */ 0x8CF2,0x5273, + /* Array index: 0x0658 */ 0x8CF6,0x5651, + /* Array index: 0x0658 */ 0x8CF7,0x5652, + /* Array index: 0x0658 */ 0x8D03,0x592E, + /* Array index: 0x0658 */ 0x8D0B,0x5B38, + /* Array index: 0x0658 */ 0x8D0C,0x664F, + /* Array index: 0x0658 */ 0x8D0E,0x6428, + /* Array index: 0x0658 */ 0x8D11,0x5E65, + /* Array index: 0x0658 */ 0x8D12,0x5E66, + /* Array index: 0x0658 */ 0x8D18,0x6650, + /* Array index: 0x0658 */ 0x8D1A,0x604A, + /* Array index: 0x0658 */ 0x8D1C,0x614E, + /* Array index: 0x0658 */ 0x8D65,0x3933, + /* Array index: 0x0658 */ 0x8D71,0x243A, + /* Array index: 0x0658 */ 0x8D7A,0x3939, + /* Array index: 0x0658 */ 0x8D7C,0x3937, + /* Array index: 0x0658 */ 0x8D7E,0x3935, + /* Array index: 0x0658 */ 0x8D7F,0x3938, + /* Array index: 0x0658 */ 0x8D8B,0x3F38, + /* Array index: 0x0658 */ 0x8D97,0x4975, + /* Array index: 0x0658 */ 0x8D98,0x4973, + /* Array index: 0x0658 */ 0x8D9A,0x4974, + /* Array index: 0x0658 */ 0x8D9D,0x4F26, + /* Array index: 0x0658 */ 0x8DA2,0x4F25, + /* Array index: 0x0658 */ 0x8DA4,0x4F23, + /* Array index: 0x0658 */ 0x8DA6,0x5277, + /* Array index: 0x0658 */ 0x8DA9,0x5931, + /* Array index: 0x0658 */ 0x8DB0,0x6651, + /* Array index: 0x0658 */ 0x8DBB,0x393E, + /* Array index: 0x0658 */ 0x8DBD,0x393A, + /* Array index: 0x0658 */ 0x8DC0,0x393D, + /* Array index: 0x0658 */ 0x8DC9,0x3F3F, + /* Array index: 0x0658 */ 0x8DCA,0x3F3A, + /* Array index: 0x0658 */ 0x8DD2,0x3F3B, + /* Array index: 0x0658 */ 0x8DD4,0x3F3E, + /* Array index: 0x0658 */ 0x8DED,0x446B, + /* Array index: 0x0658 */ 0x8E01,0x497B, + /* Array index: 0x0658 */ 0x8E08,0x497A, + /* Array index: 0x0658 */ 0x8E0B,0x4979, + /* Array index: 0x0658 */ 0x8E28,0x4F2C, + /* Array index: 0x0658 */ 0x8E2A,0x4F2B, + /* Array index: 0x0658 */ 0x8E32,0x527E, + /* Array index: 0x0658 */ 0x8E3B,0x527B, + /* Array index: 0x0658 */ 0x8E43,0x527C, + /* Array index: 0x0658 */ 0x8E46,0x5654, + /* Array index: 0x0658 */ 0x8E4F,0x5655, + /* Array index: 0x0658 */ 0x8E58,0x5932, + /* Array index: 0x0658 */ 0x8E68,0x5B3A, + /* Array index: 0x0658 */ 0x8E6B,0x5B39, + /* Array index: 0x0658 */ 0x8E70,0x5B3B, + /* Array index: 0x0658 */ 0x8E75,0x5B3C, + /* Array index: 0x0658 */ 0x8E77,0x5B3D, + /* Array index: 0x0658 */ 0x8E83,0x5D37, + /* Array index: 0x0658 */ 0x8E99,0x604B, + /* Array index: 0x0658 */ 0x8EA2,0x6150, + /* Array index: 0x0658 */ 0x8EA7,0x616C, + /* Array index: 0x0658 */ 0x8EBC,0x6652, + /* Array index: 0x0658 */ 0x8EBF,0x5935, + /* Array index: 0x0658 */ 0x8EC1,0x5936, + /* Array index: 0x0658 */ 0x8EC3,0x5B3F, + /* Array index: 0x0658 */ 0x8EC6,0x5D38, + /* Array index: 0x0658 */ 0x8ED5,0x6653, + /* Array index: 0x0658 */ 0x8ED6,0x3941, + /* Array index: 0x0658 */ 0x8ED9,0x3947, + /* Array index: 0x0658 */ 0x8EE4,0x3F45, + /* Array index: 0x0658 */ 0x8EEA,0x3F47, + /* Array index: 0x0658 */ 0x8EF2,0x3F44, + /* Array index: 0x0658 */ 0x8EF3,0x3F46, + /* Array index: 0x0658 */ 0x8EFD,0x3F49, + /* Array index: 0x0658 */ 0x8F04,0x4476, + /* Array index: 0x0658 */ 0x8F19,0x4F36, + /* Array index: 0x0658 */ 0x8F22,0x4F33, + /* Array index: 0x0658 */ 0x8F27,0x4F35, + /* Array index: 0x0658 */ 0x8F2B,0x4F34, + /* Array index: 0x0658 */ 0x8F2D,0x5324, + /* Array index: 0x0658 */ 0x8F30,0x5322, + /* Array index: 0x0658 */ 0x8F31,0x5321, + /* Array index: 0x0658 */ 0x8F3C,0x5325, + /* Array index: 0x0658 */ 0x8F3D,0x5659, + /* Array index: 0x0658 */ 0x8F41,0x565A, + /* Array index: 0x0658 */ 0x8F4A,0x5937, + /* Array index: 0x0658 */ 0x8F5C,0x5E67, + /* Array index: 0x0658 */ 0x8F65,0x6222, + /* Array index: 0x0658 */ 0x8FAA,0x6654, + /* Array index: 0x0658 */ 0x8FAC,0x5938, + /* Array index: 0x0658 */ 0x8FB3,0x4F39, + /* Array index: 0x0658 */ 0x8FB5,0x272F, + /* Array index: 0x0658 */ 0x8FB9,0x243B, + /* Array index: 0x0658 */ 0x8FBE,0x2730, + /* Array index: 0x0658 */ 0x8FC1,0x2733, + /* Array index: 0x0658 */ 0x8FC7,0x2731, + /* Array index: 0x0658 */ 0x8FCA,0x2A72, + /* Array index: 0x0658 */ 0x8FCC,0x2A70, + /* Array index: 0x0658 */ 0x8FCF,0x2A74, + /* Array index: 0x0658 */ 0x8FD8,0x2A73, + /* Array index: 0x0658 */ 0x8FD9,0x2A71, + /* Array index: 0x0658 */ 0x8FE7,0x2F31, + /* Array index: 0x0658 */ 0x8FE9,0x2F32, + /* Array index: 0x0658 */ 0x8FEF,0x2F33, + /* Array index: 0x0658 */ 0x8FF1,0x2F30, + /* Array index: 0x0658 */ 0x8FF9,0x3425, + /* Array index: 0x0658 */ 0x9008,0x3427, + /* Array index: 0x0658 */ 0x9009,0x3426, + /* Array index: 0x0658 */ 0x900E,0x394B, + /* Array index: 0x0658 */ 0x9012,0x394A, + /* Array index: 0x0658 */ 0x9013,0x394E, + /* Array index: 0x0658 */ 0x9025,0x394C, + /* Array index: 0x0658 */ 0x9030,0x3F55, + /* Array index: 0x0658 */ 0x9037,0x3F56, + /* Array index: 0x0658 */ 0x903A,0x3F54, + /* Array index: 0x0658 */ 0x903B,0x3F57, + /* Array index: 0x0658 */ 0x9040,0x447D, + /* Array index: 0x0658 */ 0x9043,0x4479, + /* Array index: 0x0658 */ 0x9045,0x447C, + /* Array index: 0x0658 */ 0x9046,0x447A, + /* Array index: 0x0658 */ 0x9048,0x447B, + /* Array index: 0x0658 */ 0x904C,0x447E, + /* Array index: 0x0658 */ 0x905A,0x4A24, + /* Array index: 0x0658 */ 0x905F,0x4A27, + /* Array index: 0x0658 */ 0x9061,0x4A26, + /* Array index: 0x0658 */ 0x906A,0x4F3C, + /* Array index: 0x0658 */ 0x9071,0x4F3B, + /* Array index: 0x0658 */ 0x9089,0x593A, + /* Array index: 0x0658 */ 0x9092,0x225E, + /* Array index: 0x0658 */ 0x9093,0x225D, + /* Array index: 0x0658 */ 0x9096,0x243C, + /* Array index: 0x0658 */ 0x909A,0x243D, + /* Array index: 0x0658 */ 0x909C,0x6655, + /* Array index: 0x0658 */ 0x90A4,0x2735, + /* Array index: 0x0658 */ 0x90A8,0x2739, + /* Array index: 0x0658 */ 0x90A9,0x2734, + /* Array index: 0x0658 */ 0x90AB,0x3951, + /* Array index: 0x0658 */ 0x90AD,0x2A77, + /* Array index: 0x0658 */ 0x90B7,0x2A75, + /* Array index: 0x0658 */ 0x90B9,0x2A78, + /* Array index: 0x0658 */ 0x90BC,0x2F35, + /* Array index: 0x0658 */ 0x90C0,0x2F38, + /* Array index: 0x0658 */ 0x90C2,0x2F34, + /* Array index: 0x0658 */ 0x90C4,0x2F3E, + /* Array index: 0x0658 */ 0x90C6,0x2F37, + /* Array index: 0x0658 */ 0x90C9,0x2F3C, + /* Array index: 0x0658 */ 0x90CD,0x2F3B, + /* Array index: 0x0658 */ 0x90DE,0x3429, + /* Array index: 0x0658 */ 0x90EE,0x394F, + /* Array index: 0x0658 */ 0x90F6,0x636C, + /* Array index: 0x0658 */ 0x90F7,0x3952, + /* Array index: 0x0658 */ 0x910A,0x3F59, + /* Array index: 0x0658 */ 0x910C,0x4523, + /* Array index: 0x0658 */ 0x9113,0x4524, + /* Array index: 0x0658 */ 0x9115,0x4525, + /* Array index: 0x0658 */ 0x9125,0x4A2A, + /* Array index: 0x0658 */ 0x9137,0x532B, + /* Array index: 0x0658 */ 0x913C,0x593C, + /* Array index: 0x0658 */ 0x913D,0x593B, + /* Array index: 0x0658 */ 0x9151,0x342A, + /* Array index: 0x0658 */ 0x9154,0x3955, + /* Array index: 0x0658 */ 0x9159,0x3954, + /* Array index: 0x0658 */ 0x915C,0x6657, + /* Array index: 0x0658 */ 0x9167,0x4528, + /* Array index: 0x0658 */ 0x916B,0x4527, + /* Array index: 0x0658 */ 0x9176,0x4A2C, + /* Array index: 0x0658 */ 0x917B,0x4A2B, + /* Array index: 0x0658 */ 0x917C,0x4A2D, + /* Array index: 0x0658 */ 0x9188,0x4F3F, + /* Array index: 0x0658 */ 0x918C,0x4F40, + /* Array index: 0x0658 */ 0x918E,0x532D, + /* Array index: 0x0658 */ 0x9195,0x532C, + /* Array index: 0x0658 */ 0x9196,0x532F, + /* Array index: 0x0658 */ 0x91A9,0x593D, + /* Array index: 0x0658 */ 0x91BB,0x5E68, + /* Array index: 0x0658 */ 0x91BF,0x607E, + /* Array index: 0x0658 */ 0x91C4,0x616D, + /* Array index: 0x0658 */ 0x91D6,0x3430, + /* Array index: 0x0658 */ 0x91DB,0x342D, + /* Array index: 0x0658 */ 0x91E5,0x3958, + /* Array index: 0x0658 */ 0x91F0,0x3957, + /* Array index: 0x0658 */ 0x91F2,0x3956, + /* Array index: 0x0658 */ 0x91F6,0x3959, + /* Array index: 0x0658 */ 0x91FE,0x3F5D, + /* Array index: 0x0658 */ 0x9208,0x3F66, + /* Array index: 0x0658 */ 0x920B,0x3F60, + /* Array index: 0x0658 */ 0x920E,0x3F68, + /* Array index: 0x0658 */ 0x9213,0x3F69, + /* Array index: 0x0658 */ 0x9218,0x3F62, + /* Array index: 0x0658 */ 0x921B,0x3F65, + /* Array index: 0x0658 */ 0x922B,0x6658, + /* Array index: 0x0658 */ 0x922F,0x452E, + /* Array index: 0x0658 */ 0x9235,0x452B, + /* Array index: 0x0658 */ 0x923B,0x4537, + /* Array index: 0x0658 */ 0x923C,0x452F, + /* Array index: 0x0658 */ 0x9241,0x4539, + /* Array index: 0x0658 */ 0x9244,0x4538, + /* Array index: 0x0658 */ 0x9255,0x452A, + /* Array index: 0x0658 */ 0x9259,0x452D, + /* Array index: 0x0658 */ 0x925C,0x4531, + /* Array index: 0x0658 */ 0x925D,0x4529, + /* Array index: 0x0658 */ 0x925F,0x4534, + /* Array index: 0x0658 */ 0x9262,0x4533, + /* Array index: 0x0658 */ 0x926A,0x4532, + /* Array index: 0x0658 */ 0x926B,0x4535, + /* Array index: 0x0658 */ 0x926E,0x4536, + /* Array index: 0x0658 */ 0x9273,0x665A, + /* Array index: 0x0658 */ 0x9281,0x4A34, + /* Array index: 0x0658 */ 0x9284,0x4A35, + /* Array index: 0x0658 */ 0x9289,0x4A2F, + /* Array index: 0x0658 */ 0x928F,0x4530, + /* Array index: 0x0658 */ 0x9290,0x4A38, + /* Array index: 0x0658 */ 0x9292,0x4A33, + /* Array index: 0x0658 */ 0x929E,0x4A39, + /* Array index: 0x0658 */ 0x92B8,0x4F42, + /* Array index: 0x0658 */ 0x92B9,0x4F50, + /* Array index: 0x0658 */ 0x92BE,0x4F43, + /* Array index: 0x0658 */ 0x92BF,0x4F41, + /* Array index: 0x0658 */ 0x92D4,0x4F48, + /* Array index: 0x0658 */ 0x92D6,0x4F49, + /* Array index: 0x0658 */ 0x92E2,0x4F51, + /* Array index: 0x0658 */ 0x92E5,0x4F45, + /* Array index: 0x0658 */ 0x92EB,0x4F52, + /* Array index: 0x0658 */ 0x92ED,0x4F4C, + /* Array index: 0x0658 */ 0x92FD,0x5335, + /* Array index: 0x0658 */ 0x9303,0x533D, + /* Array index: 0x0658 */ 0x9305,0x533E, + /* Array index: 0x0658 */ 0x9307,0x5338, + /* Array index: 0x0658 */ 0x930A,0x5332, + /* Array index: 0x0658 */ 0x9317,0x5336, + /* Array index: 0x0658 */ 0x931C,0x5337, + /* Array index: 0x0658 */ 0x932C,0x533B, + /* Array index: 0x0658 */ 0x933F,0x665D, + /* Array index: 0x0658 */ 0x9342,0x665E, + /* Array index: 0x0658 */ 0x9345,0x5331, + /* Array index: 0x0658 */ 0x9348,0x5665, + /* Array index: 0x0658 */ 0x9353,0x5666, + /* Array index: 0x0658 */ 0x935D,0x565D, + /* Array index: 0x0658 */ 0x935F,0x5667, + /* Array index: 0x0658 */ 0x9362,0x5664, + /* Array index: 0x0658 */ 0x9366,0x565B, + /* Array index: 0x0658 */ 0x9368,0x5668, + /* Array index: 0x0658 */ 0x9369,0x565E, + /* Array index: 0x0658 */ 0x936B,0x566B, + /* Array index: 0x0658 */ 0x936E,0x5661, + /* Array index: 0x0658 */ 0x9378,0x565C, + /* Array index: 0x0658 */ 0x937D,0x5660, + /* Array index: 0x0658 */ 0x937F,0x566A, + /* Array index: 0x0658 */ 0x9386,0x665F, + /* Array index: 0x0658 */ 0x938B,0x5943, + /* Array index: 0x0658 */ 0x9390,0x5940, + /* Array index: 0x0658 */ 0x9393,0x5942, + /* Array index: 0x0658 */ 0x939C,0x5949, + /* Array index: 0x0658 */ 0x93A0,0x593E, + /* Array index: 0x0658 */ 0x93AD,0x5944, + /* Array index: 0x0658 */ 0x93B8,0x5946, + /* Array index: 0x0658 */ 0x93C1,0x5B50, + /* Array index: 0x0658 */ 0x93C5,0x5B44, + /* Array index: 0x0658 */ 0x93C6,0x5B45, + /* Array index: 0x0658 */ 0x93CB,0x5B43, + /* Array index: 0x0658 */ 0x93D3,0x5B48, + /* Array index: 0x0658 */ 0x93DB,0x5B4D, + /* Array index: 0x0658 */ 0x93E0,0x5B4F, + /* Array index: 0x0658 */ 0x93E5,0x5B4A, + /* Array index: 0x0658 */ 0x9402,0x5D43, + /* Array index: 0x0658 */ 0x9404,0x5D3C, + /* Array index: 0x0658 */ 0x9405,0x5D3F, + /* Array index: 0x0658 */ 0x9408,0x5D3E, + /* Array index: 0x0658 */ 0x9417,0x5D3D, + /* Array index: 0x0658 */ 0x9427,0x5D46, + /* Array index: 0x0658 */ 0x942D,0x5E6D, + /* Array index: 0x0658 */ 0x9442,0x5F69, + /* Array index: 0x0658 */ 0x9443,0x5F6E, + /* Array index: 0x0658 */ 0x944D,0x5F6A, + /* Array index: 0x0658 */ 0x944E,0x5F6C, + /* Array index: 0x0658 */ 0x9454,0x5F6B, + /* Array index: 0x0658 */ 0x9456,0x6052, + /* Array index: 0x0658 */ 0x945F,0x604F, + /* Array index: 0x0658 */ 0x9461,0x6053, + /* Array index: 0x0658 */ 0x946C,0x6122, + /* Array index: 0x0658 */ 0x947A,0x616F, + /* Array index: 0x0658 */ 0x947B,0x6223, + /* Array index: 0x0658 */ 0x9484,0x6236, + /* Array index: 0x0658 */ 0x9579,0x6323, + /* Array index: 0x0658 */ 0x9581,0x2F40, + /* Array index: 0x0658 */ 0x9585,0x3432, + /* Array index: 0x0658 */ 0x9587,0x395C, + /* Array index: 0x0658 */ 0x9595,0x3F6C, + /* Array index: 0x0658 */ 0x9597,0x666B, + /* Array index: 0x0658 */ 0x9599,0x453C, + /* Array index: 0x0658 */ 0x959A,0x453A, + /* Array index: 0x0658 */ 0x95A2,0x4A3D, + /* Array index: 0x0658 */ 0x95A7,0x4A3E, + /* Array index: 0x0658 */ 0x95AF,0x4F53, + /* Array index: 0x0658 */ 0x95B2,0x4F55, + /* Array index: 0x0658 */ 0x95B3,0x4F56, + /* Array index: 0x0658 */ 0x95B8,0x5342, + /* Array index: 0x0658 */ 0x95C1,0x5344, + /* Array index: 0x0658 */ 0x95C2,0x5340, + /* Array index: 0x0658 */ 0x95C4,0x566D, + /* Array index: 0x0658 */ 0x95CE,0x666C, + /* Array index: 0x0658 */ 0x95D7,0x594B, + /* Array index: 0x0658 */ 0x95D8,0x594A, + /* Array index: 0x0658 */ 0x95DD,0x5B53, + /* Array index: 0x0658 */ 0x95E7,0x666D, + /* Array index: 0x0658 */ 0x961D,0x2143, + /* Array index: 0x0658 */ 0x9626,0x273B, + /* Array index: 0x0658 */ 0x9627,0x273A, + /* Array index: 0x0658 */ 0x9629,0x273F, + /* Array index: 0x0658 */ 0x962B,0x273C, + /* Array index: 0x0658 */ 0x9633,0x273D, + /* Array index: 0x0658 */ 0x9634,0x273E, + /* Array index: 0x0658 */ 0x9637,0x2A79, + /* Array index: 0x0658 */ 0x963E,0x2A7C, + /* Array index: 0x0658 */ 0x9641,0x2A7B, + /* Array index: 0x0658 */ 0x9656,0x3436, + /* Array index: 0x0658 */ 0x9659,0x3434, + /* Array index: 0x0658 */ 0x965A,0x395E, + /* Array index: 0x0658 */ 0x9660,0x3433, + /* Array index: 0x0658 */ 0x966E,0x3961, + /* Array index: 0x0658 */ 0x9679,0x3965, + /* Array index: 0x0658 */ 0x967B,0x3F71, + /* Array index: 0x0658 */ 0x967F,0x3F72, + /* Array index: 0x0658 */ 0x9681,0x3F73, + /* Array index: 0x0658 */ 0x9682,0x3F75, + /* Array index: 0x0658 */ 0x968C,0x3F70, + /* Array index: 0x0658 */ 0x968F,0x4540, + /* Array index: 0x0658 */ 0x9696,0x4542, + /* Array index: 0x0658 */ 0x969D,0x4A45, + /* Array index: 0x0658 */ 0x969F,0x4A46, + /* Array index: 0x0658 */ 0x96A0,0x4A44, + /* Array index: 0x0658 */ 0x96A3,0x4F5A, + /* Array index: 0x0658 */ 0x96A5,0x4F5B, + /* Array index: 0x0658 */ 0x96AB,0x5348, + /* Array index: 0x0658 */ 0x96AD,0x5670, + /* Array index: 0x0658 */ 0x96AF,0x566F, + /* Array index: 0x0658 */ 0x96B2,0x5671, + /* Array index: 0x0658 */ 0x96BA,0x6325, + /* Array index: 0x0658 */ 0x96BD,0x3439, + /* Array index: 0x0658 */ 0x96D0,0x4A47, + /* Array index: 0x0658 */ 0x96D1,0x4A49, + /* Array index: 0x0658 */ 0x96E4,0x5E70, + /* Array index: 0x0658 */ 0x96E6,0x6125, + /* Array index: 0x0658 */ 0x96E7,0x622F, + /* Array index: 0x0658 */ 0x96F4,0x4546, + /* Array index: 0x0658 */ 0x96FC,0x4547, + /* Array index: 0x0658 */ 0x970A,0x4F60, + /* Array index: 0x0658 */ 0x970C,0x5350, + /* Array index: 0x0658 */ 0x9714,0x534D, + /* Array index: 0x0658 */ 0x9715,0x534C, + /* Array index: 0x0658 */ 0x9717,0x5351, + /* Array index: 0x0658 */ 0x971A,0x5674, + /* Array index: 0x0658 */ 0x971B,0x5675, + /* Array index: 0x0658 */ 0x9731,0x5D4F, + /* Array index: 0x0658 */ 0x973B,0x666E, + /* Array index: 0x0658 */ 0x973C,0x5F71, + /* Array index: 0x0658 */ 0x9740,0x5F72, + /* Array index: 0x0658 */ 0x9741,0x6059, + /* Array index: 0x0658 */ 0x9745,0x6126, + /* Array index: 0x0658 */ 0x974D,0x666F, + /* Array index: 0x0658 */ 0x9750,0x6245, + /* Array index: 0x0658 */ 0x9751,0x2A7E, + /* Array index: 0x0658 */ 0x9755,0x4549, + /* Array index: 0x0658 */ 0x9759,0x4A4C, + /* Array index: 0x0658 */ 0x975D,0x594F, + /* Array index: 0x0658 */ 0x975F,0x4021, + /* Array index: 0x0658 */ 0x9763,0x2B21, + /* Array index: 0x0658 */ 0x9764,0x4A4E, + /* Array index: 0x0658 */ 0x9767,0x5E73, + /* Array index: 0x0658 */ 0x976D,0x4024, + /* Array index: 0x0658 */ 0x976F,0x4022, + /* Array index: 0x0658 */ 0x9779,0x454B, + /* Array index: 0x0658 */ 0x9787,0x4F62, + /* Array index: 0x0658 */ 0x9789,0x4F63, + /* Array index: 0x0658 */ 0x978C,0x4F64, + /* Array index: 0x0658 */ 0x9793,0x5353, + /* Array index: 0x0658 */ 0x979B,0x567A, + /* Array index: 0x0658 */ 0x979F,0x567B, + /* Array index: 0x0658 */ 0x97A9,0x5950, + /* Array index: 0x0658 */ 0x97B8,0x5D50, + /* Array index: 0x0658 */ 0x97BA,0x5D51, + /* Array index: 0x0658 */ 0x97BD,0x5E75, + /* Array index: 0x0658 */ 0x97BE,0x5E74, + /* Array index: 0x0658 */ 0x97C0,0x5F73, + /* Array index: 0x0658 */ 0x97C8,0x6128, + /* Array index: 0x0658 */ 0x97CA,0x623B, + /* Array index: 0x0658 */ 0x97D2,0x5355, + /* Array index: 0x0658 */ 0x97DA,0x5951, + /* Array index: 0x0658 */ 0x97E2,0x5E76, + /* Array index: 0x0658 */ 0x97E4,0x6129, + /* Array index: 0x0658 */ 0x97EE,0x454F, + /* Array index: 0x0658 */ 0x97EF,0x4F65, + /* Array index: 0x0658 */ 0x97F2,0x5B61, + /* Array index: 0x0658 */ 0x97F5,0x4550, + /* Array index: 0x0658 */ 0x97FC,0x5D53, + /* Array index: 0x0658 */ 0x980B,0x4552, + /* Array index: 0x0658 */ 0x9814,0x4A54, + /* Array index: 0x0658 */ 0x9815,0x4A55, + /* Array index: 0x0658 */ 0x9819,0x4A52, + /* Array index: 0x0658 */ 0x981A,0x4A56, + /* Array index: 0x0658 */ 0x981F,0x4F69, + /* Array index: 0x0658 */ 0x9822,0x4F67, + /* Array index: 0x0658 */ 0x9823,0x636E, + /* Array index: 0x0658 */ 0x982A,0x4F66, + /* Array index: 0x0658 */ 0x982E,0x535C, + /* Array index: 0x0658 */ 0x9831,0x5359, + /* Array index: 0x0658 */ 0x9833,0x535A, + /* Array index: 0x0658 */ 0x9834,0x5228, + /* Array index: 0x0658 */ 0x9836,0x5358, + /* Array index: 0x0658 */ 0x983A,0x535D, + /* Array index: 0x0658 */ 0x9847,0x5728, + /* Array index: 0x0658 */ 0x984B,0x5959, + /* Array index: 0x0658 */ 0x9861,0x642A, + /* Array index: 0x0658 */ 0x9866,0x5E78, + /* Array index: 0x0658 */ 0x9868,0x5E77, + /* Array index: 0x0658 */ 0x98B5,0x5361, + /* Array index: 0x0658 */ 0x98B7,0x572A, + /* Array index: 0x0658 */ 0x98B9,0x595C, + /* Array index: 0x0658 */ 0x98C3,0x5D56, + /* Array index: 0x0658 */ 0x98C7,0x5E7B, + /* Array index: 0x0658 */ 0x98C8,0x5E79, + /* Array index: 0x0658 */ 0x98CA,0x5E7A, + /* Array index: 0x0658 */ 0x98CD,0x6225, + /* Array index: 0x0658 */ 0x98DC,0x5E7C, + /* Array index: 0x0658 */ 0x98DD,0x6226, + /* Array index: 0x0658 */ 0x98E1,0x3967, + /* Array index: 0x0658 */ 0x98E4,0x6670, + /* Array index: 0x0658 */ 0x98E6,0x3968, + /* Array index: 0x0658 */ 0x98EC,0x455B, + /* Array index: 0x0658 */ 0x98F0,0x402B, + /* Array index: 0x0658 */ 0x98F1,0x455C, + /* Array index: 0x0658 */ 0x98F3,0x4554, + /* Array index: 0x0658 */ 0x98F5,0x4559, + /* Array index: 0x0658 */ 0x98F7,0x4557, + /* Array index: 0x0658 */ 0x98F8,0x4A5D, + /* Array index: 0x0658 */ 0x98FF,0x4558, + /* Array index: 0x0658 */ 0x9901,0x4A5E, + /* Array index: 0x0658 */ 0x9906,0x4A5B, + /* Array index: 0x0658 */ 0x990E,0x667A, + /* Array index: 0x0658 */ 0x9919,0x4F6B, + /* Array index: 0x0658 */ 0x991C,0x5365, + /* Array index: 0x0658 */ 0x991D,0x5366, + /* Array index: 0x0658 */ 0x9920,0x5364, + /* Array index: 0x0658 */ 0x9922,0x5362, + /* Array index: 0x0658 */ 0x9923,0x5363, + /* Array index: 0x0658 */ 0x9936,0x5962, + /* Array index: 0x0658 */ 0x9938,0x5961, + /* Array index: 0x0658 */ 0x9939,0x5966, + /* Array index: 0x0658 */ 0x993B,0x5965, + /* Array index: 0x0658 */ 0x9940,0x5963, + /* Array index: 0x0658 */ 0x9942,0x6671, + /* Array index: 0x0658 */ 0x9944,0x5B69, + /* Array index: 0x0658 */ 0x994D,0x5D58, + /* Array index: 0x0658 */ 0x994F,0x5E7E, + /* Array index: 0x0658 */ 0x995A,0x5F78, + /* Array index: 0x0658 */ 0x995D,0x612A, + /* Array index: 0x0658 */ 0x999A,0x455F, + /* Array index: 0x0658 */ 0x99A0,0x5368, + /* Array index: 0x0658 */ 0x99A2,0x5730, + /* Array index: 0x0658 */ 0x99A4,0x5967, + /* Array index: 0x0658 */ 0x99A9,0x5F21, + /* Array index: 0x0658 */ 0x99AA,0x6060, + /* Array index: 0x0658 */ 0x99C4,0x4A6A, + /* Array index: 0x0658 */ 0x99C8,0x4F73, + /* Array index: 0x0658 */ 0x99CA,0x4F6D, + /* Array index: 0x0658 */ 0x99DA,0x4F6E, + /* Array index: 0x0658 */ 0x99DE,0x4F72, + /* Array index: 0x0658 */ 0x99E0,0x4F74, + /* Array index: 0x0658 */ 0x99E1,0x5370, + /* Array index: 0x0658 */ 0x99E6,0x5371, + /* Array index: 0x0658 */ 0x99E8,0x536B, + /* Array index: 0x0658 */ 0x99EB,0x536C, + /* Array index: 0x0658 */ 0x99EF,0x536A, + /* Array index: 0x0658 */ 0x99F3,0x5734, + /* Array index: 0x0658 */ 0x99F5,0x5737, + /* Array index: 0x0658 */ 0x9A00,0x5733, + /* Array index: 0x0658 */ 0x9A08,0x596A, + /* Array index: 0x0658 */ 0x9A0C,0x596B, + /* Array index: 0x0658 */ 0x9A10,0x596D, + /* Array index: 0x0658 */ 0x9A17,0x5B6F, + /* Array index: 0x0658 */ 0x9A18,0x5B6D, + /* Array index: 0x0658 */ 0x9A1F,0x5B6C, + /* Array index: 0x0658 */ 0x9A21,0x5B6E, + /* Array index: 0x0658 */ 0x9A26,0x5B6B, + /* Array index: 0x0658 */ 0x9A2F,0x5D5A, + /* Array index: 0x0658 */ 0x9A3B,0x5F24, + /* Array index: 0x0658 */ 0x9A3C,0x5F22, + /* Array index: 0x0658 */ 0x9A51,0x5F79, + /* Array index: 0x0658 */ 0x9A58,0x6062, + /* Array index: 0x0658 */ 0x9A5C,0x6061, + /* Array index: 0x0658 */ 0x9A61,0x6172, + /* Array index: 0x0658 */ 0x9A63,0x6173, + /* Array index: 0x0658 */ 0x9AA9,0x402F, + /* Array index: 0x0658 */ 0x9AB5,0x4F77, + /* Array index: 0x0658 */ 0x9AB6,0x4F76, + /* Array index: 0x0658 */ 0x9ABD,0x573A, + /* Array index: 0x0658 */ 0x9AC4,0x5D61, + /* Array index: 0x0658 */ 0x9AC8,0x5D60, + /* Array index: 0x0658 */ 0x9AC9,0x5D5E, + /* Array index: 0x0658 */ 0x9ACE,0x5F25, + /* Array index: 0x0658 */ 0x9AD7,0x6174, + /* Array index: 0x0658 */ 0x9AD9,0x6334, + /* Array index: 0x0658 */ 0x9ADA,0x4A6E, + /* Array index: 0x0658 */ 0x9ADD,0x5F7B, + /* Array index: 0x0658 */ 0x9ADE,0x6063, + /* Array index: 0x0658 */ 0x9AE0,0x4032, + /* Array index: 0x0658 */ 0x9AE2,0x4561, + /* Array index: 0x0658 */ 0x9AF4,0x4F79, + /* Array index: 0x0658 */ 0x9AF5,0x5375, + /* Array index: 0x0658 */ 0x9AF8,0x5374, + /* Array index: 0x0658 */ 0x9B00,0x573B, + /* Array index: 0x0658 */ 0x9B02,0x573C, + /* Array index: 0x0658 */ 0x9B07,0x596F, + /* Array index: 0x0658 */ 0x9B09,0x5B71, + /* Array index: 0x0658 */ 0x9B14,0x5F27, + /* Array index: 0x0658 */ 0x9B1D,0x6672, + /* Array index: 0x0658 */ 0x9B21,0x612C, + /* Array index: 0x0658 */ 0x9B26,0x4A75, + /* Array index: 0x0658 */ 0x9B2A,0x5D62, + /* Array index: 0x0658 */ 0x9B2C,0x612E, + /* Array index: 0x0658 */ 0x9B2D,0x6433, + /* Array index: 0x0658 */ 0x9B30,0x6228, + /* Array index: 0x0658 */ 0x9B34,0x573E, + /* Array index: 0x0658 */ 0x9B38,0x5D63, + /* Array index: 0x0658 */ 0x9B3D,0x4562, + /* Array index: 0x0658 */ 0x9B40,0x4A78, + /* Array index: 0x0658 */ 0x9B49,0x573F, + /* Array index: 0x0658 */ 0x9B50,0x5D64, + /* Array index: 0x0658 */ 0x9B53,0x5F28, + /* Array index: 0x0658 */ 0x9B57,0x612F, + /* Array index: 0x0658 */ 0x9B5D,0x4563, + /* Array index: 0x0658 */ 0x9B63,0x4F7E, + /* Array index: 0x0658 */ 0x9B69,0x4F7C, + /* Array index: 0x0658 */ 0x9B6B,0x4F7B, + /* Array index: 0x0658 */ 0x9B72,0x4F7D, + /* Array index: 0x0658 */ 0x9B83,0x5378, + /* Array index: 0x0658 */ 0x9B84,0x537A, + /* Array index: 0x0658 */ 0x9B89,0x5423, + /* Array index: 0x0658 */ 0x9B94,0x5379, + /* Array index: 0x0658 */ 0x9B98,0x6673, + /* Array index: 0x0658 */ 0x9B99,0x5744, + /* Array index: 0x0658 */ 0x9B9D,0x5745, + /* Array index: 0x0658 */ 0x9B9F,0x5740, + /* Array index: 0x0658 */ 0x9BA3,0x5742, + /* Array index: 0x0658 */ 0x9BBB,0x5974, + /* Array index: 0x0658 */ 0x9BC2,0x5973, + /* Array index: 0x0658 */ 0x9BC5,0x5B74, + /* Array index: 0x0658 */ 0x9BD2,0x5971, + /* Array index: 0x0658 */ 0x9BDF,0x5B75, + /* Array index: 0x0658 */ 0x9BE3,0x5B77, + /* Array index: 0x0658 */ 0x9BE9,0x5B79, + /* Array index: 0x0658 */ 0x9BEE,0x5B7A, + /* Array index: 0x0658 */ 0x9BF6,0x5D6F, + /* Array index: 0x0658 */ 0x9BF9,0x5D71, + /* Array index: 0x0658 */ 0x9C0A,0x5D66, + /* Array index: 0x0658 */ 0x9C0C,0x5D76, + /* Array index: 0x0658 */ 0x9C10,0x5D73, + /* Array index: 0x0658 */ 0x9C15,0x5D72, + /* Array index: 0x0658 */ 0x9C1B,0x5D70, + /* Array index: 0x0658 */ 0x9C1F,0x5F2C, + /* Array index: 0x0658 */ 0x9C27,0x642F, + /* Array index: 0x0658 */ 0x9C2E,0x5F2A, + /* Array index: 0x0658 */ 0x9C35,0x6025, + /* Array index: 0x0658 */ 0x9C38,0x5F7E, + /* Array index: 0x0658 */ 0x9C3A,0x6023, + /* Array index: 0x0658 */ 0x9C45,0x6022, + /* Array index: 0x0658 */ 0x9C4F,0x6065, + /* Array index: 0x0658 */ 0x9C51,0x6066, + /* Array index: 0x0658 */ 0x9C53,0x6068, + /* Array index: 0x0658 */ 0x9C5D,0x6132, + /* Array index: 0x0658 */ 0x9C61,0x6133, + /* Array index: 0x0658 */ 0x9C65,0x6134, + /* Array index: 0x0658 */ 0x9C6C,0x6159, + /* Array index: 0x0658 */ 0x9C6F,0x615B, + /* Array index: 0x0658 */ 0x9C76,0x6175, + /* Array index: 0x0658 */ 0x9C7B,0x6241, + /* Array index: 0x0658 */ 0x9CE8,0x4564, + /* Array index: 0x0658 */ 0x9CF8,0x5027, + /* Array index: 0x0658 */ 0x9CFE,0x502A, + /* Array index: 0x0658 */ 0x9D01,0x5024, + /* Array index: 0x0658 */ 0x9D02,0x502B, + /* Array index: 0x0658 */ 0x9D0A,0x542D, + /* Array index: 0x0658 */ 0x9D0C,0x5025, + /* Array index: 0x0658 */ 0x9D0D,0x5022, + /* Array index: 0x0658 */ 0x9D0F,0x542A, + /* Array index: 0x0658 */ 0x9D13,0x542C, + /* Array index: 0x0658 */ 0x9D16,0x5436, + /* Array index: 0x0658 */ 0x9D1A,0x5433, + /* Array index: 0x0658 */ 0x9D21,0x5437, + /* Array index: 0x0658 */ 0x9D24,0x5429, + /* Array index: 0x0658 */ 0x9D27,0x5435, + /* Array index: 0x0658 */ 0x9D2A,0x5432, + /* Array index: 0x0658 */ 0x9D35,0x574D, + /* Array index: 0x0658 */ 0x9D39,0x5748, + /* Array index: 0x0658 */ 0x9D44,0x574A, + /* Array index: 0x0658 */ 0x9D49,0x6675, + /* Array index: 0x0658 */ 0x9D4D,0x5979, + /* Array index: 0x0658 */ 0x9D4E,0x597B, + /* Array index: 0x0658 */ 0x9D50,0x597D, + /* Array index: 0x0658 */ 0x9D55,0x597E, + /* Array index: 0x0658 */ 0x9D5E,0x5A22, + /* Array index: 0x0658 */ 0x9D63,0x597A, + /* Array index: 0x0658 */ 0x9D66,0x5B7D, + /* Array index: 0x0658 */ 0x9D6D,0x5C27, + /* Array index: 0x0658 */ 0x9D6E,0x5C22, + /* Array index: 0x0658 */ 0x9D76,0x5C25, + /* Array index: 0x0658 */ 0x9D7A,0x5B7E, + /* Array index: 0x0658 */ 0x9D7E,0x5C26, + /* Array index: 0x0658 */ 0x9D83,0x5C24, + /* Array index: 0x0658 */ 0x9D91,0x5C23, + /* Array index: 0x0658 */ 0x9D95,0x5D79, + /* Array index: 0x0658 */ 0x9DA5,0x5D7A, + /* Array index: 0x0658 */ 0x9DAE,0x5F35, + /* Array index: 0x0658 */ 0x9DB0,0x5F31, + /* Array index: 0x0658 */ 0x9DBD,0x5F32, + /* Array index: 0x0658 */ 0x9DC4,0x5F36, + /* Array index: 0x0658 */ 0x9DFC,0x606C, + /* Array index: 0x0658 */ 0x9E08,0x6135, + /* Array index: 0x0658 */ 0x9E0E,0x615D, + /* Array index: 0x0658 */ 0x9E16,0x6229, + /* Array index: 0x0658 */ 0x9E18,0x6230, + /* Array index: 0x0658 */ 0x9E1C,0x6238, + /* Array index: 0x0658 */ 0x9E7B,0x5F37, + /* Array index: 0x0658 */ 0x9E81,0x4569, + /* Array index: 0x0658 */ 0x9E84,0x502C, + /* Array index: 0x0658 */ 0x9E85,0x5439, + /* Array index: 0x0658 */ 0x9E90,0x5A24, + /* Array index: 0x0658 */ 0x9E95,0x5C29, + /* Array index: 0x0658 */ 0x9E98,0x5E21, + /* Array index: 0x0658 */ 0x9E9E,0x5F3A, + /* Array index: 0x0658 */ 0x9EA2,0x6231, + /* Array index: 0x0658 */ 0x9EA3,0x623F, + /* Array index: 0x0658 */ 0x9EA6,0x2547, + /* Array index: 0x0658 */ 0x9EAF,0x5750, + /* Array index: 0x0658 */ 0x9EB1,0x5A26, + /* Array index: 0x0658 */ 0x9EB2,0x5A25, + /* Array index: 0x0658 */ 0x9EBD,0x4B22, + /* Array index: 0x0658 */ 0x9EC1,0x5E22, + /* Array index: 0x0658 */ 0x9ECA,0x5A28, + /* Array index: 0x0658 */ 0x9ED2,0x396B, + /* Array index: 0x0658 */ 0x9ED7,0x543D, + /* Array index: 0x0658 */ 0x9EE3,0x5C2A, + /* Array index: 0x0658 */ 0x9EF1,0x6029, + /* Array index: 0x0658 */ 0x9EFE,0x2772, + /* Array index: 0x0658 */ 0x9F08,0x615F, + /* Array index: 0x0658 */ 0x9F14,0x456A, + /* Array index: 0x0658 */ 0x9F17,0x5C30, + /* Array index: 0x0658 */ 0x9F1D,0x6160, + /* Array index: 0x0658 */ 0x9F26,0x5A2B, + /* Array index: 0x0658 */ 0x9F27,0x5A2A, + /* Array index: 0x0658 */ 0x9F39,0x606D, + /* Array index: 0x0658 */ 0x9F45,0x613B, + /* Array index: 0x0658 */ 0x9F50,0x2370, + /* Array index: 0x0658 */ 0x9F53,0x543E, + /* Array index: 0x0658 */ 0x9F5A,0x5E24, + /* Array index: 0x0658 */ 0x9F69,0x5F3E, + /* Array index: 0x0658 */ 0x9F7C,0x6233, + /* Array index: 0x0658 */ 0x9F8E,0x5755, + /* Array index: 0x0658 */ 0x9F93,0x602B, + /* Array index: 0x0658 */ 0x9F97,0x6242, + /* Array index: 0x0658 */ 0x9F9D,0x5E47, + /* Array index: 0x0658 */ 0x9FA1,0x5F3F, + /* Array index: 0x0658 */ 0x9FA3,0x6161, + /* Array index: 0x0658 */ 0x9FA5,0x6177, +}; + +#endif /* ICONV_FROM_UCS_CCS_CNS11643_PLANE14 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * cns11643_plane14 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cns11643_plane14 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CNS11643_PLANE14, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_cns11643_plane14, /* UCS -> cns11643_plane14 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE14) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_cns11643_plane14, /* UCS -> cns11643_plane14 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_cns11643_plane14 /* cns11643_plane14 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_CNS11643_PLANE14) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_cns11643_plane14 /* cns11643_plane14 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE14) || ... */ + diff --git a/lib/iconv/ccs/cns11643_plane2.c b/lib/iconv/ccs/cns11643_plane2.c new file mode 100644 index 0000000..15c287f --- /dev/null +++ b/lib/iconv/ccs/cns11643_plane2.c @@ -0,0 +1,11948 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cns11643_plane2 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + || defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit cns11643_plane2 -> UCS speed-optimized table (42496 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_cns11643_plane2[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700, + 0x0800,0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00,0x0F00, + 0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700, + 0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00, + 0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700, + 0x2800,0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00, + 0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700, + 0x3800,0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00,0x3F00, + 0x4000,0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700, + 0x4800,0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00,0x4F00, + 0x5000,0x5100,0x5200,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 34, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C, + 0x4E47,0x4E8D,0x56D7,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E, + 0x4E2E,0x4E93,0x4EC2,0x4EC9,0x4EC8,0x5198,0x52FC,0x536C, + 0x53B9,0x5720,0x5903,0x592C,0x5C10,0x5DFF,0x65E1,0x6BB3, + 0x6BCC,0x6C14,0x723F,0x4E31,0x4E3C,0x4EE8,0x4EDC,0x4EE9, + 0x4EE1,0x4EDD,0x4EDA,0x520C,0x5209,0x531C,0x534C,0x5722, + 0x5723,0x5917,0x592F,0x5B81,0x5B84,0x5C12,0x5C3B,0x5C74, + 0x5C73,0x5E04,0x5E80,0x5E82,0x5FC9,0x6209,0x6250,0x6C15, + 0x6C36,0x6C43,0x6C3F,0x6C3B,0x72AE,0x72B0,0x738A,0x79B8, + 0x808A,0x961E,0x4F0E,0x4F18,0x4F2C,0x4EF5,0x4F14,0x4EF1, + 0x4F00,0x4EF7,0x4F08,0x4F1D,0x4F02,0x4F05,0x4F22,0x4F13, + 0x4F04,0x4EF4,0x4F12,0x51B1,0x5213,0x5210,0x52A6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5322,0x531F,0x534D,0x538A,0x5407,0x56E1,0x56DF, + 0x572E,0x572A,0x5734,0x593C,0x5980,0x597C,0x5985,0x597B, + 0x597E,0x5977,0x597F,0x5B56,0x5C15,0x5C25,0x5C7C,0x5C7A, + 0x5C7B,0x5C7E,0x5DDF,0x5E75,0x5E84,0x5F02,0x5F1A,0x5F74, + 0x5FD5,0x5FD4,0x5FCF,0x625C,0x625E,0x6264,0x6261,0x6266, + 0x6262,0x6259,0x6260,0x625A,0x6265,0x6537,0x65EF,0x65EE, + 0x673E,0x6739,0x6738,0x673B,0x673A,0x673F,0x673C,0x6733, + 0x6C18,0x6C46,0x6C52,0x6C5C,0x6C4F,0x6C4A,0x6C54,0x6C4B, + 0x6C4C,0x7071,0x725E,0x72B4,0x72B5,0x738E,0x752A,0x767F, + 0x7A75,0x7F51,0x8278,0x827C,0x8280,0x827D,0x827F,0x864D, + 0x897E,0x9099,0x9097,0x9098,0x909B,0x9094,0x9622,0x9624, + 0x9620,0x9623,0x4F56,0x4F3B,0x4F62,0x4F49,0x4F53,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F64,0x4F3E,0x4F67,0x4F52,0x4F5F,0x4F41,0x4F58, + 0x4F2D,0x4F33,0x4F3F,0x4F61,0x518F,0x51B9,0x521C,0x521E, + 0x5221,0x52AD,0x52AE,0x5309,0x5363,0x5372,0x538E,0x538F, + 0x5430,0x5437,0x542A,0x5454,0x5445,0x5419,0x541C,0x5425, + 0x5418,0x543D,0x544F,0x5441,0x5428,0x5424,0x5447,0x56EE, + 0x56E7,0x56E5,0x5741,0x5745,0x574C,0x5749,0x574B,0x5752, + 0x5906,0x5940,0x59A6,0x5998,0x59A0,0x5997,0x598E,0x59A2, + 0x5990,0x598F,0x59A7,0x59A1,0x5B8E,0x5B92,0x5C28,0x5C2A, + 0x5C8D,0x5C8F,0x5C88,0x5C8B,0x5C89,0x5C92,0x5C8A,0x5C86, + 0x5C93,0x5C95,0x5DE0,0x5E0A,0x5E0E,0x5E8B,0x5E89,0x5E8C, + 0x5E88,0x5E8D,0x5F05,0x5F1D,0x5F78,0x5F76,0x5FD2,0x5FD1, + 0x5FD0,0x5FED,0x5FE8,0x5FEE,0x5FF3,0x5FE1,0x5FE4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5FE3,0x5FFA,0x5FEF,0x5FF7,0x5FFB,0x6000,0x5FF4, + 0x623A,0x6283,0x628C,0x628E,0x628F,0x6294,0x6287,0x6271, + 0x627B,0x627A,0x6270,0x6281,0x6288,0x6277,0x627D,0x6272, + 0x6274,0x65F0,0x65F4,0x65F3,0x65F2,0x65F5,0x6745,0x6747, + 0x6759,0x6755,0x674C,0x6748,0x675D,0x674D,0x675A,0x674B, + 0x6BD0,0x6C19,0x6C1A,0x6C78,0x6C67,0x6C6B,0x6C84,0x6C8B, + 0x6C8F,0x6C71,0x6C6F,0x6C69,0x6C9A,0x6C6D,0x6C87,0x6C95, + 0x6C9C,0x6C66,0x6C73,0x6C65,0x6C7B,0x6C8E,0x7074,0x707A, + 0x7263,0x72BF,0x72BD,0x72C3,0x72C6,0x72C1,0x72BA,0x72C5, + 0x7395,0x7397,0x7393,0x7394,0x7392,0x753A,0x7539,0x7594, + 0x7595,0x7681,0x793D,0x8034,0x8095,0x8099,0x8090,0x8092, + 0x809C,0x8290,0x828F,0x8285,0x828E,0x8291,0x8293,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x828A,0x8283,0x8284,0x8C78,0x8FC9,0x8FBF,0x909F, + 0x90A1,0x90A5,0x909E,0x90A7,0x90A0,0x9630,0x9628,0x962F, + 0x962D,0x4E33,0x4F98,0x4F7C,0x4F85,0x4F7D,0x4F80,0x4F87, + 0x4F76,0x4F74,0x4F89,0x4F84,0x4F77,0x4F4C,0x4F97,0x4F6A, + 0x4F9A,0x4F79,0x4F81,0x4F78,0x4F90,0x4F9C,0x4F94,0x4F9E, + 0x4F92,0x4F82,0x4F95,0x4F6B,0x4F6E,0x519E,0x51BC,0x51BE, + 0x5235,0x5232,0x5233,0x5246,0x5231,0x52BC,0x530A,0x530B, + 0x533C,0x5392,0x5394,0x5487,0x547F,0x5481,0x5491,0x5482, + 0x5488,0x546B,0x547A,0x547E,0x5465,0x546C,0x5474,0x5466, + 0x548D,0x546F,0x5461,0x5460,0x5498,0x5463,0x5467,0x5464, + 0x56F7,0x56F9,0x576F,0x5772,0x576D,0x576B,0x5771,0x5770, + 0x5776,0x5780,0x5775,0x577B,0x5773,0x5774,0x5762,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5768,0x577D,0x590C,0x5945,0x59B5,0x59BA,0x59CF, + 0x59CE,0x59B2,0x59CC,0x59C1,0x59B6,0x59BC,0x59C3,0x59D6, + 0x59B1,0x59BD,0x59C0,0x59C8,0x59B4,0x59C7,0x5B62,0x5B65, + 0x5B93,0x5B95,0x5C44,0x5C47,0x5CAE,0x5CA4,0x5CA0,0x5CB5, + 0x5CAF,0x5CA8,0x5CAC,0x5C9F,0x5CA3,0x5CAD,0x5CA2,0x5CAA, + 0x5CA7,0x5C9D,0x5CA5,0x5CB6,0x5CB0,0x5CA6,0x5E17,0x5E14, + 0x5E19,0x5F28,0x5F22,0x5F23,0x5F24,0x5F54,0x5F82,0x5F7E, + 0x5F7D,0x5FDE,0x5FE5,0x602D,0x6026,0x6019,0x6032,0x600B, + 0x6034,0x600A,0x6017,0x6033,0x601A,0x601E,0x602C,0x6022, + 0x600D,0x6010,0x602E,0x6013,0x6011,0x600C,0x6009,0x601C, + 0x6214,0x623D,0x62AD,0x62B4,0x62D1,0x62BE,0x62AA,0x62B6, + 0x62CA,0x62AE,0x62B3,0x62AF,0x62BB,0x62A9,0x62B0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 40, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x62B8,0x653D,0x65A8,0x65BB,0x6609,0x65FC,0x6604, + 0x6612,0x6608,0x65FB,0x6603,0x660B,0x660D,0x6605,0x65FD, + 0x6611,0x6610,0x66F6,0x670A,0x6785,0x676C,0x678E,0x6792, + 0x6776,0x677B,0x6798,0x6786,0x6784,0x6774,0x678D,0x678C, + 0x677A,0x679F,0x6791,0x6799,0x6783,0x677D,0x6781,0x6778, + 0x6779,0x6794,0x6B25,0x6B80,0x6B7E,0x6BDE,0x6C1D,0x6C93, + 0x6CEC,0x6CEB,0x6CEE,0x6CD9,0x6CB6,0x6CD4,0x6CAD,0x6CE7, + 0x6CB7,0x6CD0,0x6CC2,0x6CBA,0x6CC3,0x6CC6,0x6CED,0x6CF2, + 0x6CD2,0x6CDD,0x6CB4,0x6C8A,0x6C9D,0x6C80,0x6CDE,0x6CC0, + 0x6D30,0x6CCD,0x6CC7,0x6CB0,0x6CF9,0x6CCF,0x6CE9,0x6CD1, + 0x7094,0x7098,0x7085,0x7093,0x7086,0x7084,0x7091,0x7096, + 0x7082,0x709A,0x7083,0x726A,0x72D6,0x72CB,0x72D8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 41, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x72C9,0x72DC,0x72D2,0x72D4,0x72DA,0x72CC,0x72D1, + 0x73A4,0x73A1,0x73AD,0x73A6,0x73A2,0x73A0,0x73AC,0x739D, + 0x74DD,0x74E8,0x753F,0x7540,0x753E,0x758C,0x7598,0x76AF, + 0x76F3,0x76F1,0x76F0,0x76F5,0x77F8,0x77FC,0x77F9,0x77FB, + 0x77FA,0x77F7,0x7942,0x793F,0x79C5,0x7A78,0x7A7B,0x7AFB, + 0x7C75,0x7CFD,0x8035,0x808F,0x80AE,0x80A3,0x80B8,0x80B5, + 0x80AD,0x8220,0x82A0,0x82C0,0x82AB,0x829A,0x8298,0x829B, + 0x82B5,0x82A7,0x82AE,0x82BC,0x829E,0x82BA,0x82B4,0x82A8, + 0x82A1,0x82A9,0x82C2,0x82A4,0x82C3,0x82B6,0x82A2,0x8670, + 0x866F,0x866D,0x866E,0x8C56,0x8FD2,0x8FCB,0x8FD3,0x8FCD, + 0x8FD6,0x8FD5,0x8FD7,0x90B2,0x90B4,0x90AF,0x90B3,0x90B0, + 0x9639,0x963D,0x963C,0x963A,0x9643,0x4FCD,0x4FC5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 42, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4FD3,0x4FB2,0x4FC9,0x4FCB,0x4FC1,0x4FD4,0x4FDC, + 0x4FD9,0x4FBB,0x4FB3,0x4FDB,0x4FC7,0x4FD6,0x4FBA,0x4FC0, + 0x4FB9,0x4FEC,0x5244,0x5249,0x52C0,0x52C2,0x533D,0x537C, + 0x5397,0x5396,0x5399,0x5398,0x54BA,0x54A1,0x54AD,0x54A5, + 0x54CF,0x54C3,0x830D,0x54B7,0x54AE,0x54D6,0x54B6,0x54C5, + 0x54C6,0x54A0,0x5470,0x54BC,0x54A2,0x54BE,0x5472,0x54DE, + 0x54B0,0x57B5,0x579E,0x579F,0x57A4,0x578C,0x5797,0x579D, + 0x579B,0x5794,0x5798,0x578F,0x5799,0x57A5,0x579A,0x5795, + 0x58F4,0x590D,0x5953,0x59E1,0x59DE,0x59EE,0x5A00,0x59F1, + 0x59DD,0x59FA,0x59FD,0x59FC,0x59F6,0x59E4,0x59F2,0x59F7, + 0x59DB,0x59E9,0x59F3,0x59F5,0x59E0,0x59FE,0x59F4,0x59ED, + 0x5BA8,0x5C4C,0x5CD0,0x5CD8,0x5CCC,0x5CD7,0x5CCB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 43, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5CDB,0x5CDE,0x5CDA,0x5CC9,0x5CC7,0x5CCA,0x5CD6, + 0x5CD3,0x5CD4,0x5CCF,0x5CC8,0x5CC6,0x5CCE,0x5CDF,0x5CF8, + 0x5DF9,0x5E21,0x5E22,0x5E23,0x5E20,0x5E24,0x5EB0,0x5EA4, + 0x5EA2,0x5E9B,0x5EA3,0x5EA5,0x5F07,0x5F2E,0x5F56,0x5F86, + 0x6037,0x6039,0x6054,0x6072,0x605E,0x6045,0x6053,0x6047, + 0x6049,0x605B,0x604C,0x6040,0x6042,0x605F,0x6024,0x6044, + 0x6058,0x6066,0x606E,0x6242,0x6243,0x62CF,0x630D,0x630B, + 0x62F5,0x630E,0x6303,0x62EB,0x62F9,0x630F,0x630C,0x62F8, + 0x62F6,0x6300,0x6313,0x6314,0x62FA,0x6315,0x62FB,0x62F0, + 0x6541,0x6543,0x65AA,0x65BF,0x6636,0x6621,0x6632,0x6635, + 0x661C,0x6626,0x6622,0x6633,0x662B,0x663A,0x661D,0x6634, + 0x6639,0x662E,0x670F,0x6710,0x67C1,0x67F2,0x67C8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 44, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x67BA,0x67DC,0x67BB,0x67F8,0x67D8,0x67C0,0x67B7, + 0x67C5,0x67EB,0x67E4,0x67DF,0x67B5,0x67CD,0x67B3,0x67F7, + 0x67F6,0x67EE,0x67E3,0x67C2,0x67B9,0x67CE,0x67E7,0x67F0, + 0x67B2,0x67FC,0x67C6,0x67ED,0x67CC,0x67AE,0x67E6,0x67DB, + 0x67FA,0x67C9,0x67CA,0x67C3,0x67EA,0x67CB,0x6B28,0x6B82, + 0x6B84,0x6BB6,0x6BD6,0x6BD8,0x6BE0,0x6C20,0x6C21,0x6D28, + 0x6D34,0x6D2D,0x6D1F,0x6D3C,0x6D3F,0x6D12,0x6D0A,0x6CDA, + 0x6D33,0x6D04,0x6D19,0x6D3A,0x6D1A,0x6D11,0x6D00,0x6D1D, + 0x6D42,0x6D01,0x6D18,0x6D37,0x6D03,0x6D0F,0x6D40,0x6D07, + 0x6D20,0x6D2C,0x6D08,0x6D22,0x6D09,0x6D10,0x70B7,0x709F, + 0x70BE,0x70B1,0x70B0,0x70A1,0x70B4,0x70B5,0x70A9,0x7241, + 0x7249,0x724A,0x726C,0x7270,0x7273,0x726E,0x72CA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 45, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x72E4,0x72E8,0x72EB,0x72DF,0x72EA,0x72E6,0x72E3, + 0x7385,0x73CC,0x73C2,0x73C8,0x73C5,0x73B9,0x73B6,0x73B5, + 0x73B4,0x73EB,0x73BF,0x73C7,0x73BE,0x73C3,0x73C6,0x73B8, + 0x73CB,0x74EC,0x74EE,0x752E,0x7547,0x7548,0x75A7,0x75AA, + 0x7679,0x76C4,0x7708,0x7703,0x7704,0x7705,0x770A,0x76F7, + 0x76FB,0x76FA,0x77E7,0x77E8,0x7806,0x7811,0x7812,0x7805, + 0x7810,0x780F,0x780E,0x7809,0x7803,0x7813,0x794A,0x794C, + 0x794B,0x7945,0x7944,0x79D5,0x79CD,0x79CF,0x79D6,0x79CE, + 0x7A80,0x7A7E,0x7AD1,0x7B00,0x7B01,0x7C7A,0x7C78,0x7C79, + 0x7C7F,0x7C80,0x7C81,0x7D03,0x7D08,0x7D01,0x7F58,0x7F91, + 0x7F8D,0x7FBE,0x8007,0x800E,0x800F,0x8014,0x8037,0x80D8, + 0x80C7,0x80E0,0x80D1,0x80C8,0x80C2,0x80D0,0x80C5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 46, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x80E3,0x80D9,0x80DC,0x80CA,0x80D5,0x80C9,0x80CF, + 0x80D7,0x80E6,0x80CD,0x81FF,0x8221,0x8294,0x82D9,0x82FE, + 0x82F9,0x8307,0x82E8,0x8300,0x82D5,0x833A,0x82EB,0x82D6, + 0x82F4,0x82EC,0x82E1,0x82F2,0x82F5,0x830C,0x82FB,0x82F6, + 0x82F0,0x82EA,0x82E4,0x82E0,0x82FA,0x82F3,0x82ED,0x8677, + 0x8674,0x867C,0x8673,0x8841,0x884E,0x8867,0x886A,0x8869, + 0x89D3,0x8A04,0x8A07,0x8D72,0x8FE3,0x8FE1,0x8FEE,0x8FE0, + 0x90F1,0x90BD,0x90BF,0x90D5,0x90C5,0x90BE,0x90C7,0x90CB, + 0x90C8,0x91D4,0x91D3,0x9654,0x964F,0x9651,0x9653,0x964A, + 0x964E,0x501E,0x5005,0x5007,0x5013,0x5022,0x5030,0x501B, + 0x4FF5,0x4FF4,0x5033,0x5037,0x502C,0x4FF6,0x4FF7,0x5017, + 0x501C,0x5020,0x5027,0x5035,0x502F,0x5031,0x500E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 47, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x515A,0x5194,0x5193,0x51CA,0x51C4,0x51C5,0x51C8, + 0x51CE,0x5261,0x525A,0x5252,0x525E,0x525F,0x5255,0x5262, + 0x52CD,0x530E,0x539E,0x5526,0x54E2,0x5517,0x5512,0x54E7, + 0x54F3,0x54E4,0x551A,0x54FF,0x5504,0x5508,0x54EB,0x5511, + 0x5505,0x54F1,0x550A,0x54FB,0x54F7,0x54F8,0x54E0,0x550E, + 0x5503,0x550B,0x5701,0x5702,0x57CC,0x5832,0x57D5,0x57D2, + 0x57BA,0x57C6,0x57BD,0x57BC,0x57B8,0x57B6,0x57BF,0x57C7, + 0x57D0,0x57B9,0x57C1,0x590E,0x594A,0x5A19,0x5A16,0x5A2D, + 0x5A2E,0x5A15,0x5A0F,0x5A17,0x5A0A,0x5A1E,0x5A33,0x5B6C, + 0x5BA7,0x5BAD,0x5BAC,0x5C03,0x5C56,0x5C54,0x5CEC,0x5CFF, + 0x5CEE,0x5CF1,0x5CF7,0x5D00,0x5CF9,0x5E29,0x5E28,0x5EA8, + 0x5EAE,0x5EAA,0x5EAC,0x5F33,0x5F30,0x5F67,0x605D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 48, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x605A,0x6067,0x6041,0x60A2,0x6088,0x6080,0x6092, + 0x6081,0x609D,0x6083,0x6095,0x609B,0x6097,0x6087,0x609C, + 0x608E,0x6219,0x6246,0x62F2,0x6310,0x6356,0x632C,0x6344, + 0x6345,0x6336,0x6343,0x63E4,0x6339,0x634B,0x634A,0x633C, + 0x6329,0x6341,0x6334,0x6358,0x6354,0x6359,0x632D,0x6347, + 0x6333,0x635A,0x6351,0x6338,0x6357,0x6340,0x6348,0x654A, + 0x6546,0x65C6,0x65C3,0x65C4,0x65C2,0x664A,0x665F,0x6647, + 0x6651,0x6712,0x6713,0x681F,0x681A,0x6849,0x6832,0x6833, + 0x683B,0x684B,0x684F,0x6816,0x6831,0x681C,0x6835,0x682B, + 0x682D,0x682F,0x684E,0x6844,0x6834,0x681D,0x6812,0x6814, + 0x6826,0x6828,0x682E,0x684D,0x683A,0x6825,0x6820,0x6B2C, + 0x6B2F,0x6B2D,0x6B31,0x6B34,0x6B6D,0x8082,0x6B88,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6BE6,0x6BE4,0x6BE8,0x6BE3,0x6BE2,0x6BE7,0x6C25, + 0x6D7A,0x6D63,0x6D64,0x6D76,0x6D0D,0x6D61,0x6D92,0x6D58, + 0x6D62,0x6D6D,0x6D6F,0x6D91,0x6D8D,0x6DEF,0x6D7F,0x6D86, + 0x6D5E,0x6D67,0x6D60,0x6D97,0x6D70,0x6D7C,0x6D5F,0x6D82, + 0x6D98,0x6D2F,0x6D68,0x6D8B,0x6D7E,0x6D80,0x6D84,0x6D16, + 0x6D83,0x6D7B,0x6D7D,0x6D75,0x6D90,0x70DC,0x70D3,0x70D1, + 0x70DD,0x70CB,0x7F39,0x70E2,0x70D7,0x70D2,0x70DE,0x70E0, + 0x70D4,0x70CD,0x70C5,0x70C6,0x70C7,0x70DA,0x70CE,0x70E1, + 0x7242,0x7278,0x7277,0x7276,0x7300,0x72FA,0x72F4,0x72FE, + 0x72F6,0x72F3,0x72FB,0x7301,0x73D3,0x73D9,0x73E5,0x73D6, + 0x73BC,0x73E7,0x73E3,0x73E9,0x73DC,0x73D2,0x73DB,0x73D4, + 0x73DD,0x73DA,0x73D7,0x73D8,0x73E8,0x74DE,0x74DF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x74F4,0x74F5,0x7521,0x755B,0x755F,0x75B0,0x75C1, + 0x75BB,0x75C4,0x75C0,0x75BF,0x75B6,0x75BA,0x768A,0x76C9, + 0x771D,0x771B,0x7710,0x7713,0x7712,0x7723,0x7711,0x7715, + 0x7719,0x771A,0x7722,0x7727,0x7823,0x782C,0x7822,0x7835, + 0x782F,0x7828,0x782E,0x782B,0x7821,0x7829,0x7833,0x782A, + 0x7831,0x7954,0x795B,0x794F,0x795C,0x7953,0x7952,0x7951, + 0x79EB,0x79EC,0x79E0,0x79EE,0x79ED,0x79EA,0x79DC,0x79DE, + 0x79DD,0x7A86,0x7A89,0x7A85,0x7A8B,0x7A8C,0x7A8A,0x7A87, + 0x7AD8,0x7B10,0x7B04,0x7B13,0x7B05,0x7B0F,0x7B08,0x7B0A, + 0x7B0E,0x7B09,0x7B12,0x7C84,0x7C91,0x7C8A,0x7C8C,0x7C88, + 0x7C8D,0x7C85,0x7D1E,0x7D1D,0x7D11,0x7D0E,0x7D18,0x7D16, + 0x7D13,0x7D1F,0x7D12,0x7D0F,0x7D0C,0x7F5C,0x7F61,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7F5E,0x7F60,0x7F5D,0x7F5B,0x7F96,0x7F92,0x7FC3, + 0x7FC2,0x7FC0,0x8016,0x803E,0x8039,0x80FA,0x80F2,0x80F9, + 0x80F5,0x8101,0x80FB,0x8100,0x8201,0x822F,0x8225,0x8333, + 0x832D,0x8344,0x8319,0x8351,0x8325,0x8356,0x833F,0x8341, + 0x8326,0x831C,0x8322,0x8342,0x834E,0x831B,0x832A,0x8308, + 0x833C,0x834D,0x8316,0x8324,0x8320,0x8337,0x832F,0x8329, + 0x8347,0x8345,0x834C,0x8353,0x831E,0x832C,0x834B,0x8327, + 0x8348,0x8653,0x8652,0x86A2,0x86A8,0x8696,0x868D,0x8691, + 0x869E,0x8687,0x8697,0x8686,0x868B,0x869A,0x8685,0x86A5, + 0x8699,0x86A1,0x86A7,0x8695,0x8698,0x868E,0x869D,0x8690, + 0x8694,0x8843,0x8844,0x886D,0x8875,0x8876,0x8872,0x8880, + 0x8871,0x887F,0x886F,0x8883,0x887E,0x8874,0x887C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8A12,0x8C47,0x8C57,0x8C7B,0x8CA4,0x8CA3,0x8D76, + 0x8D78,0x8DB5,0x8DB7,0x8DB6,0x8ED1,0x8ED3,0x8FFE,0x8FF5, + 0x9002,0x8FFF,0x8FFB,0x9004,0x8FFC,0x8FF6,0x90D6,0x90E0, + 0x90D9,0x90DA,0x90E3,0x90DF,0x90E5,0x90D8,0x90DB,0x90D7, + 0x90DC,0x90E4,0x9150,0x914E,0x914F,0x91D5,0x91E2,0x91DA, + 0x965C,0x965F,0x96BC,0x98E3,0x9ADF,0x9B2F,0x4E7F,0x5070, + 0x506A,0x5061,0x505E,0x5060,0x5053,0x504B,0x505D,0x5072, + 0x5048,0x504D,0x5041,0x505B,0x504A,0x5062,0x5015,0x5045, + 0x505F,0x5069,0x506B,0x5063,0x5064,0x5046,0x5040,0x506E, + 0x5073,0x5057,0x5051,0x51D0,0x526B,0x526D,0x526C,0x526E, + 0x52D6,0x52D3,0x532D,0x539C,0x5575,0x5576,0x553C,0x554D, + 0x5550,0x5534,0x552A,0x5551,0x5562,0x5536,0x5535,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 53, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5530,0x5552,0x5545,0x550C,0x5532,0x5565,0x554E, + 0x5539,0x5548,0x552D,0x553B,0x5540,0x554B,0x570A,0x5707, + 0x57FB,0x5814,0x57E2,0x57F6,0x57DC,0x57F4,0x5800,0x57ED, + 0x57FD,0x5808,0x57F8,0x580B,0x57F3,0x57CF,0x5807,0x57EE, + 0x57E3,0x57F2,0x57E5,0x57EC,0x57E1,0x580E,0x57FC,0x5810, + 0x57E7,0x5801,0x580C,0x57F1,0x57E9,0x57F0,0x580D,0x5804, + 0x595C,0x5A60,0x5A58,0x5A55,0x5A67,0x5A5E,0x5A38,0x5A35, + 0x5A6D,0x5A50,0x5A5F,0x5A65,0x5A6C,0x5A53,0x5A64,0x5A57, + 0x5A43,0x5A5D,0x5A52,0x5A44,0x5A5B,0x5A48,0x5A8E,0x5A3E, + 0x5A4D,0x5A39,0x5A4C,0x5A70,0x5A69,0x5A47,0x5A51,0x5A56, + 0x5A42,0x5A5C,0x5B72,0x5B6E,0x5BC1,0x5BC0,0x5C59,0x5D1E, + 0x5D0B,0x5D1D,0x5D1A,0x5D20,0x5D0C,0x5D28,0x5D0D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 54, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D26,0x5D25,0x5D0F,0x5D30,0x5D12,0x5D23,0x5D1F, + 0x5D2E,0x5E3E,0x5E34,0x5EB1,0x5EB4,0x5EB9,0x5EB2,0x5EB3, + 0x5F36,0x5F38,0x5F9B,0x5F96,0x5F9F,0x608A,0x6090,0x6086, + 0x60BE,0x60B0,0x60BA,0x60D3,0x60D4,0x60CF,0x60E4,0x60D9, + 0x60DD,0x60C8,0x60B1,0x60DB,0x60B7,0x60CA,0x60BF,0x60C3, + 0x60CD,0x60C0,0x6332,0x6365,0x638A,0x6382,0x637D,0x63BD, + 0x639E,0x63AD,0x639D,0x6397,0x63AB,0x638E,0x636F,0x6387, + 0x6390,0x636E,0x63AF,0x6375,0x639C,0x636D,0x63AE,0x637C, + 0x63A4,0x633B,0x639F,0x6378,0x6385,0x6381,0x6391,0x638D, + 0x6370,0x6553,0x65CD,0x6665,0x6661,0x665B,0x6659,0x665C, + 0x6662,0x6718,0x6879,0x6887,0x6890,0x689C,0x686D,0x686E, + 0x68AE,0x68AB,0x6956,0x686F,0x68A3,0x68AC,0x68A9,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 55, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6875,0x6874,0x68B2,0x688F,0x6877,0x6892,0x687C, + 0x686B,0x6872,0x68AA,0x6880,0x6871,0x687E,0x689B,0x6896, + 0x688B,0x68A0,0x6889,0x68A4,0x6878,0x687B,0x6891,0x688C, + 0x688A,0x687D,0x6B36,0x6B33,0x6B37,0x6B38,0x6B91,0x6B8F, + 0x6B8D,0x6B8E,0x6B8C,0x6C2A,0x6DC0,0x6DAB,0x6DB4,0x6DB3, + 0x6E74,0x6DAC,0x6DE9,0x6DE2,0x6DB7,0x6DF6,0x6DD4,0x6E00, + 0x6DC8,0x6DE0,0x6DDF,0x6DD6,0x6DBE,0x6DE5,0x6DDC,0x6DDD, + 0x6DDB,0x6DF4,0x6DCA,0x6DBD,0x6DED,0x6DF0,0x6DBA,0x6DD5, + 0x6DC2,0x6DCF,0x6DC9,0x6DD0,0x6DF2,0x6DD3,0x6DFD,0x6DD7, + 0x6DCD,0x6DE3,0x6DBB,0x70FA,0x710D,0x70F7,0x7117,0x70F4, + 0x710C,0x70F0,0x7104,0x70F3,0x7110,0x70FC,0x70FF,0x7106, + 0x7113,0x7100,0x70F8,0x70F6,0x710B,0x7102,0x710E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 56, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x727E,0x727B,0x727C,0x727F,0x731D,0x7317,0x7307, + 0x7311,0x7318,0x730A,0x7308,0x72FF,0x730F,0x731E,0x7388, + 0x73F6,0x73F8,0x73F5,0x7404,0x7401,0x73FD,0x7407,0x7400, + 0x73FA,0x73FC,0x73FF,0x740C,0x740B,0x73F4,0x7408,0x7564, + 0x7563,0x75CE,0x75D2,0x75CF,0x75CB,0x75CC,0x75D1,0x75D0, + 0x768F,0x7689,0x76D3,0x7739,0x772F,0x772D,0x7731,0x7732, + 0x7734,0x7733,0x773D,0x7725,0x773B,0x7735,0x7848,0x7852, + 0x7849,0x784D,0x784A,0x784C,0x7826,0x7845,0x7850,0x7964, + 0x7967,0x7969,0x796A,0x7963,0x796B,0x7961,0x79BB,0x79FA, + 0x79F8,0x79F6,0x79F7,0x7A8F,0x7A94,0x7A90,0x7B35,0x7B3B, + 0x7B34,0x7B25,0x7B30,0x7B22,0x7B24,0x7B33,0x7B18,0x7B2A, + 0x7B1D,0x7B31,0x7B2B,0x7B2D,0x7B2F,0x7B32,0x7B38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 57, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B1A,0x7B23,0x7C94,0x7C98,0x7C96,0x7CA3,0x7D35, + 0x7D3D,0x7D38,0x7D36,0x7D3A,0x7D45,0x7D2C,0x7D29,0x7D41, + 0x7D47,0x7D3E,0x7D3F,0x7D4A,0x7D3B,0x7D28,0x7F63,0x7F95, + 0x7F9C,0x7F9D,0x7F9B,0x7FCA,0x7FCB,0x7FCD,0x7FD0,0x7FD1, + 0x7FC7,0x7FCF,0x7FC9,0x801F,0x801E,0x801B,0x8047,0x8043, + 0x8048,0x8118,0x8125,0x8119,0x811B,0x812D,0x811F,0x812C, + 0x811E,0x8121,0x8115,0x8127,0x811D,0x8122,0x8211,0x8238, + 0x8233,0x823A,0x8234,0x8232,0x8274,0x8390,0x83A3,0x83A8, + 0x838D,0x837A,0x8373,0x83A4,0x8374,0x838F,0x8381,0x8395, + 0x8399,0x8375,0x8394,0x83A9,0x837D,0x8383,0x838C,0x839D, + 0x839B,0x83AA,0x838B,0x837E,0x83A5,0x83AF,0x8388,0x8397, + 0x83B0,0x837F,0x83A6,0x8387,0x83AE,0x8376,0x8659,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 58, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8656,0x86BF,0x86B7,0x86C2,0x86C1,0x86C5,0x86BA, + 0x86B0,0x86C8,0x86B9,0x86B3,0x86B8,0x86CC,0x86B4,0x86BB, + 0x86BC,0x86C3,0x86BD,0x86BE,0x8852,0x8889,0x8895,0x88A8, + 0x88A2,0x88AA,0x889A,0x8891,0x88A1,0x889F,0x8898,0x88A7, + 0x8899,0x889B,0x8897,0x88A4,0x88AC,0x888C,0x8893,0x888E, + 0x8982,0x89D6,0x89D9,0x89D5,0x8A30,0x8A27,0x8A2C,0x8A1E, + 0x8C39,0x8C3B,0x8C5C,0x8C5D,0x8C7D,0x8CA5,0x8D7D,0x8D7B, + 0x8D79,0x8DBC,0x8DC2,0x8DB9,0x8DBF,0x8DC1,0x8ED8,0x8EDE, + 0x8EDD,0x8EDC,0x8ED7,0x8EE0,0x8EE1,0x9024,0x900B,0x9011, + 0x901C,0x900C,0x9021,0x90EF,0x90EA,0x90F0,0x90F4,0x90F2, + 0x90F3,0x90D4,0x90EB,0x90EC,0x90E9,0x9156,0x9158,0x915A, + 0x9153,0x9155,0x91EC,0x91F4,0x91F1,0x91F3,0x91F8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 59, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x91E4,0x91F9,0x91EA,0x91EB,0x91F7,0x91E8,0x91EE, + 0x957A,0x9586,0x9588,0x967C,0x966D,0x966B,0x9671,0x966F, + 0x96BF,0x976A,0x9804,0x98E5,0x9997,0x509B,0x5095,0x5094, + 0x509E,0x508B,0x50A3,0x5083,0x508C,0x508E,0x509D,0x5068, + 0x509C,0x5092,0x5082,0x5087,0x515F,0x51D4,0x5312,0x5311, + 0x53A4,0x53A7,0x5591,0x55A8,0x55A5,0x55AD,0x5577,0x5645, + 0x55A2,0x5593,0x5588,0x558F,0x55B5,0x5581,0x55A3,0x5592, + 0x55A4,0x557D,0x558C,0x55A6,0x557F,0x5595,0x55A1,0x558E, + 0x570C,0x5829,0x5837,0x5819,0x581E,0x5827,0x5823,0x5828, + 0x57F5,0x5848,0x5825,0x581C,0x581B,0x5833,0x583F,0x5836, + 0x582E,0x5839,0x5838,0x582D,0x582C,0x583B,0x5961,0x5AAF, + 0x5A94,0x5A9F,0x5A7A,0x5AA2,0x5A9E,0x5A78,0x5AA6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 60, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A7C,0x5AA5,0x5AAC,0x5A95,0x5AAE,0x5A37,0x5A84, + 0x5A8A,0x5A97,0x5A83,0x5A8B,0x5AA9,0x5A7B,0x5A7D,0x5A8C, + 0x5A9C,0x5A8F,0x5A93,0x5A9D,0x5BEA,0x5BCD,0x5BCB,0x5BD4, + 0x5BD1,0x5BCA,0x5BCE,0x5C0C,0x5C30,0x5D37,0x5D43,0x5D6B, + 0x5D41,0x5D4B,0x5D3F,0x5D35,0x5D51,0x5D4E,0x5D55,0x5D33, + 0x5D3A,0x5D52,0x5D3D,0x5D31,0x5D59,0x5D42,0x5D39,0x5D49, + 0x5D38,0x5D3C,0x5D32,0x5D36,0x5D40,0x5D45,0x5E44,0x5E41, + 0x5F58,0x5FA6,0x5FA5,0x5FAB,0x60C9,0x60B9,0x60CC,0x60E2, + 0x60CE,0x60C4,0x6114,0x60F2,0x610A,0x6116,0x6105,0x60F5, + 0x6113,0x60F8,0x60FC,0x60FE,0x60C1,0x6103,0x6118,0x611D, + 0x6110,0x60FF,0x6104,0x610B,0x624A,0x6394,0x63B1,0x63B0, + 0x63CE,0x63E5,0x63E8,0x63EF,0x63C3,0x649D,0x63F3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 61, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x63CA,0x63E0,0x63F6,0x63D5,0x63F2,0x63F5,0x6461, + 0x63DF,0x63BE,0x63DD,0x63DC,0x63C4,0x63D8,0x63D3,0x63C2, + 0x63C7,0x63CC,0x63CB,0x63C8,0x63F0,0x63D7,0x63D9,0x6532, + 0x6567,0x656A,0x6564,0x655C,0x6568,0x6565,0x658C,0x659D, + 0x659E,0x65AE,0x65D0,0x65D2,0x667C,0x666C,0x667B,0x6680, + 0x6671,0x6679,0x666A,0x6672,0x6701,0x690C,0x68D3,0x6904, + 0x68DC,0x692A,0x68EC,0x68EA,0x68F1,0x690F,0x68D6,0x68F7, + 0x68EB,0x68E4,0x68F6,0x6913,0x6910,0x68F3,0x68E1,0x6907, + 0x68CC,0x6908,0x6970,0x68B4,0x6911,0x68EF,0x68C6,0x6914, + 0x68F8,0x68D0,0x68FD,0x68FC,0x68E8,0x690B,0x690A,0x6917, + 0x68CE,0x68C8,0x68DD,0x68DE,0x68E6,0x68F4,0x68D1,0x6906, + 0x68D4,0x68E9,0x6915,0x6925,0x68C7,0x6B39,0x6B3B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 62, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B3F,0x6B3C,0x6B94,0x6B97,0x6B99,0x6B95,0x6BBD, + 0x6BF0,0x6BF2,0x6BF3,0x6C30,0x6DFC,0x6E46,0x6E47,0x6E1F, + 0x6E49,0x6E88,0x6E3C,0x6E3D,0x6E45,0x6E62,0x6E2B,0x6E3F, + 0x6E41,0x6E5D,0x6E73,0x6E1C,0x6E33,0x6E4B,0x6E40,0x6E51, + 0x6E3B,0x6E03,0x6E2E,0x6E5E,0x6E68,0x6E5C,0x6E61,0x6E31, + 0x6E28,0x6E60,0x6E71,0x6E6B,0x6E39,0x6E22,0x6E30,0x6E53, + 0x6E65,0x6E27,0x6E78,0x6E64,0x6E77,0x6E55,0x6E79,0x6E52, + 0x6E66,0x6E35,0x6E36,0x6E5A,0x7120,0x711E,0x712F,0x70FB, + 0x712E,0x7131,0x7123,0x7125,0x7122,0x7132,0x711F,0x7128, + 0x713A,0x711B,0x724B,0x725A,0x7288,0x7289,0x7286,0x7285, + 0x728B,0x7312,0x730B,0x7330,0x7322,0x7331,0x7333,0x7327, + 0x7332,0x732D,0x7326,0x7323,0x7335,0x730C,0x742E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 63, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x742C,0x7430,0x742B,0x7416,0x741A,0x7421,0x742D, + 0x7431,0x7424,0x7423,0x741D,0x7429,0x7420,0x7432,0x74FB, + 0x752F,0x756F,0x756C,0x75E7,0x75DA,0x75E1,0x75E6,0x75DD, + 0x75DF,0x75E4,0x75D7,0x7695,0x7692,0x76DA,0x7746,0x7747, + 0x7744,0x774D,0x7745,0x774A,0x774E,0x774B,0x774C,0x77DE, + 0x77EC,0x7860,0x7864,0x7865,0x785C,0x786D,0x7871,0x786A, + 0x786E,0x7870,0x7869,0x7868,0x785E,0x7862,0x7974,0x7973, + 0x7972,0x7970,0x7A02,0x7A0A,0x7A03,0x7A0C,0x7A04,0x7A99, + 0x7AE6,0x7AE4,0x7B4A,0x7B47,0x7B44,0x7B48,0x7B4C,0x7B4E, + 0x7B40,0x7B58,0x7B45,0x7CA2,0x7C9E,0x7CA8,0x7CA1,0x7D58, + 0x7D6F,0x7D63,0x7D53,0x7D56,0x7D67,0x7D6A,0x7D4F,0x7D6D, + 0x7D5C,0x7D6B,0x7D52,0x7D54,0x7D69,0x7D51,0x7D5F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 64, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D4E,0x7F3E,0x7F3F,0x7F65,0x7F66,0x7FA2,0x7FA0, + 0x7FA1,0x7FD7,0x8051,0x804F,0x8050,0x80FE,0x80D4,0x8143, + 0x814A,0x8152,0x814F,0x8147,0x813D,0x814D,0x813A,0x81E6, + 0x81EE,0x81F7,0x81F8,0x81F9,0x8204,0x823C,0x823D,0x823F, + 0x8275,0x833B,0x83CF,0x83F9,0x8423,0x83C0,0x83E8,0x8412, + 0x83E7,0x83E4,0x83FC,0x83F6,0x8410,0x83C6,0x83C8,0x83EB, + 0x83E3,0x83BF,0x8401,0x83DD,0x83E5,0x83D8,0x83FF,0x83E1, + 0x83CB,0x83CE,0x83D6,0x83F5,0x83C9,0x8409,0x840F,0x83DE, + 0x8411,0x8406,0x83C2,0x83F3,0x83D5,0x83FA,0x83C7,0x83D1, + 0x83EA,0x8413,0x839A,0x83C3,0x83EC,0x83EE,0x83C4,0x83FB, + 0x83D7,0x83E2,0x841B,0x83DB,0x83FE,0x86D8,0x86E2,0x86E6, + 0x86D3,0x86E3,0x86DA,0x86EA,0x86DD,0x86EB,0x86DC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 65, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x86EC,0x86E9,0x86D7,0x86E8,0x86D1,0x8848,0x8856, + 0x8855,0x88BA,0x88D7,0x88B9,0x88B8,0x88C0,0x88BE,0x88B6, + 0x88BC,0x88B7,0x88BD,0x88B2,0x8901,0x88C9,0x8995,0x8998, + 0x8997,0x89DD,0x89DA,0x89DB,0x8A4E,0x8A4D,0x8A39,0x8A59, + 0x8A40,0x8A57,0x8A58,0x8A44,0x8A45,0x8A52,0x8A48,0x8A51, + 0x8A4A,0x8A4C,0x8A4F,0x8C5F,0x8C81,0x8C80,0x8CBA,0x8CBE, + 0x8CB0,0x8CB9,0x8CB5,0x8D84,0x8D80,0x8D89,0x8DD8,0x8DD3, + 0x8DCD,0x8DC7,0x8DD6,0x8DDC,0x8DCF,0x8DD5,0x8DD9,0x8DC8, + 0x8DD7,0x8DC5,0x8EEF,0x8EF7,0x8EFA,0x8EF9,0x8EE6,0x8EEE, + 0x8EE5,0x8EF5,0x8EE7,0x8EE8,0x8EF6,0x8EEB,0x8EF1,0x8EEC, + 0x8EF4,0x8EE9,0x902D,0x9034,0x902F,0x9106,0x912C,0x9104, + 0x90FF,0x90FC,0x9108,0x90F9,0x90FB,0x9101,0x9100,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 66, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9107,0x9105,0x9103,0x9161,0x9164,0x915F,0x9162, + 0x9160,0x9201,0x920A,0x9225,0x9203,0x921A,0x9226,0x920F, + 0x920C,0x9200,0x9212,0x91FF,0x91FD,0x9206,0x9204,0x9227, + 0x9202,0x921C,0x9224,0x9219,0x9217,0x9205,0x9216,0x957B, + 0x958D,0x958C,0x9590,0x9687,0x967E,0x9688,0x9689,0x9683, + 0x9680,0x96C2,0x96C8,0x96C3,0x96F1,0x96F0,0x976C,0x9770, + 0x976E,0x9807,0x98A9,0x98EB,0x9CE6,0x9EF9,0x4E83,0x4E84, + 0x4EB6,0x50BD,0x50BF,0x50C6,0x50AE,0x50C4,0x50CA,0x50B4, + 0x50C8,0x50C2,0x50B0,0x50C1,0x50BA,0x50B1,0x50CB,0x50C9, + 0x50B6,0x50B8,0x51D7,0x527A,0x5278,0x527B,0x527C,0x55C3, + 0x55DB,0x55CC,0x55D0,0x55CB,0x55CA,0x55DD,0x55C0,0x55D4, + 0x55C4,0x55E9,0x55BF,0x55D2,0x558D,0x55CF,0x55D5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 67, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x55E2,0x55D6,0x55C8,0x55F2,0x55CD,0x55D9,0x55C2, + 0x5714,0x5853,0x5868,0x5864,0x584F,0x584D,0x5849,0x586F, + 0x5855,0x584E,0x585D,0x5859,0x5865,0x585B,0x583D,0x5863, + 0x5871,0x58FC,0x5AC7,0x5AC4,0x5ACB,0x5ABA,0x5AB8,0x5AB1, + 0x5AB5,0x5AB0,0x5ABF,0x5AC8,0x5ABB,0x5AC6,0x5AB7,0x5AC0, + 0x5ACA,0x5AB4,0x5AB6,0x5ACD,0x5AB9,0x5A90,0x5BD6,0x5BD8, + 0x5BD9,0x5C1F,0x5C33,0x5D71,0x5D63,0x5D4A,0x5D65,0x5D72, + 0x5D6C,0x5D5E,0x5D68,0x5D67,0x5D62,0x5DF0,0x5E4F,0x5E4E, + 0x5E4A,0x5E4D,0x5E4B,0x5EC5,0x5ECC,0x5EC6,0x5ECB,0x5EC7, + 0x5F40,0x5FAF,0x5FAD,0x60F7,0x6149,0x614A,0x612B,0x6145, + 0x6136,0x6132,0x612E,0x6146,0x612F,0x614F,0x6129,0x6140, + 0x6220,0x9168,0x6223,0x6225,0x6224,0x63C5,0x63F1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 68, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x63EB,0x6410,0x6412,0x6409,0x6420,0x6424,0x6433, + 0x6443,0x641F,0x6415,0x6418,0x6439,0x6437,0x6422,0x6423, + 0x640C,0x6426,0x6430,0x6428,0x6441,0x6435,0x642F,0x640A, + 0x641A,0x6440,0x6425,0x6427,0x640B,0x63E7,0x641B,0x642E, + 0x6421,0x640E,0x656F,0x6592,0x65D3,0x6686,0x668C,0x6695, + 0x6690,0x668B,0x668A,0x6699,0x6694,0x6678,0x6720,0x6966, + 0x695F,0x6938,0x694E,0x6962,0x6971,0x693F,0x6945,0x696A, + 0x6939,0x6942,0x6957,0x6959,0x697A,0x6948,0x6949,0x6935, + 0x696C,0x6933,0x693D,0x6965,0x68F0,0x6978,0x6934,0x6969, + 0x6940,0x696F,0x6944,0x6976,0x6958,0x6941,0x6974,0x694C, + 0x693B,0x694B,0x6937,0x695C,0x694F,0x6951,0x6932,0x6952, + 0x692F,0x697B,0x693C,0x6B46,0x6B45,0x6B43,0x6B42,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 69, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B48,0x6B41,0x6B9B,0x6BFB,0x6BFC,0x6BF9,0x6BF7, + 0x6BF8,0x6E9B,0x6ED6,0x6EC8,0x6E8F,0x6EC0,0x6E9F,0x6E93, + 0x6E94,0x6EA0,0x6EB1,0x6EB9,0x6EC6,0x6ED2,0x6EBD,0x6EC1, + 0x6E9E,0x6EC9,0x6EB7,0x6EB0,0x6ECD,0x6EA6,0x6ECF,0x6EB2, + 0x6EBE,0x6EC3,0x6EDC,0x6ED8,0x6E99,0x6E92,0x6E8E,0x6E8D, + 0x6EA4,0x6EA1,0x6EBF,0x6EB3,0x6ED0,0x6ECA,0x6E97,0x6EAE, + 0x6EA3,0x7147,0x7154,0x7152,0x7163,0x7160,0x7141,0x715D, + 0x7162,0x7172,0x7178,0x716A,0x7161,0x7142,0x7158,0x7143, + 0x714B,0x7170,0x715F,0x7150,0x7153,0x7144,0x714D,0x715A, + 0x724F,0x728D,0x728C,0x7291,0x7290,0x728E,0x733C,0x7342, + 0x733B,0x733A,0x7340,0x734A,0x7349,0x7444,0x744A,0x744B, + 0x7452,0x7451,0x7457,0x7440,0x744F,0x7450,0x744E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 70, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7442,0x7446,0x744D,0x7454,0x74E1,0x74FF,0x74FE, + 0x74FD,0x751D,0x7579,0x7577,0x6983,0x75EF,0x760F,0x7603, + 0x75F7,0x75FE,0x75FC,0x75F9,0x75F8,0x7610,0x75FB,0x75F6, + 0x75ED,0x75F5,0x75FD,0x7699,0x76B5,0x76DD,0x7755,0x775F, + 0x7760,0x7752,0x7756,0x775A,0x7769,0x7767,0x7754,0x7759, + 0x776D,0x77E0,0x7887,0x789A,0x7894,0x788F,0x7884,0x7895, + 0x7885,0x7886,0x78A1,0x7883,0x7879,0x7899,0x7880,0x7896, + 0x787B,0x797C,0x7982,0x797D,0x7979,0x7A11,0x7A18,0x7A19, + 0x7A12,0x7A17,0x7A15,0x7A22,0x7A13,0x7A1B,0x7A10,0x7AA3, + 0x7AA2,0x7A9E,0x7AEB,0x7B66,0x7B64,0x7B6D,0x7B74,0x7B69, + 0x7B72,0x7B65,0x7B73,0x7B71,0x7B70,0x7B61,0x7B78,0x7B76, + 0x7B63,0x7CB2,0x7CB4,0x7CAF,0x7D88,0x7D86,0x7D80,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 71, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D8D,0x7D7F,0x7D85,0x7D7A,0x7D8E,0x7D7B,0x7D83, + 0x7D7C,0x7D8C,0x7D94,0x7D84,0x7D7D,0x7D92,0x7F6D,0x7F6B, + 0x7F67,0x7F68,0x7F6C,0x7FA6,0x7FA5,0x7FA7,0x7FDB,0x7FDC, + 0x8021,0x8164,0x8160,0x8177,0x815C,0x8169,0x815B,0x8162, + 0x8172,0x6721,0x815E,0x8176,0x8167,0x816F,0x8144,0x8161, + 0x821D,0x8249,0x8244,0x8240,0x8242,0x8245,0x84F1,0x843F, + 0x8456,0x8476,0x8479,0x848F,0x848D,0x8465,0x8451,0x8440, + 0x8486,0x8467,0x8430,0x844D,0x847D,0x845A,0x8459,0x8474, + 0x8473,0x845D,0x8507,0x845E,0x8437,0x843A,0x8434,0x847A, + 0x8443,0x8478,0x8432,0x8445,0x8429,0x83D9,0x844B,0x842F, + 0x8442,0x842D,0x845F,0x8470,0x8439,0x844E,0x844C,0x8452, + 0x846F,0x84C5,0x848E,0x843B,0x8447,0x8436,0x8433,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 72, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8468,0x847E,0x8444,0x842B,0x8460,0x8454,0x846E, + 0x8450,0x870B,0x8704,0x86F7,0x870C,0x86FA,0x86D6,0x86F5, + 0x874D,0x86F8,0x870E,0x8709,0x8701,0x86F6,0x870D,0x8705, + 0x88D6,0x88CB,0x88CD,0x88CE,0x88DE,0x88DB,0x88DA,0x88CC, + 0x88D0,0x8985,0x899B,0x89DF,0x89E5,0x89E4,0x89E1,0x89E0, + 0x89E2,0x89DC,0x89E6,0x8A76,0x8A86,0x8A7F,0x8A61,0x8A3F, + 0x8A77,0x8A82,0x8A84,0x8A75,0x8A83,0x8A81,0x8A74,0x8A7A, + 0x8C3C,0x8C4B,0x8C4A,0x8C65,0x8C64,0x8C66,0x8C86,0x8C84, + 0x8C85,0x8CCC,0x8D68,0x8D69,0x8D91,0x8D8C,0x8D8E,0x8D8F, + 0x8D8D,0x8D93,0x8D94,0x8D90,0x8D92,0x8DF0,0x8DE0,0x8DEC, + 0x8DF1,0x8DEE,0x8DD0,0x8DE9,0x8DE3,0x8DE2,0x8DE7,0x8DF2, + 0x8DEB,0x8DF4,0x8F06,0x8EFF,0x8F01,0x8F00,0x8F05,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 73, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8F07,0x8F08,0x8F02,0x8F0B,0x9052,0x903F,0x9044, + 0x9049,0x903D,0x9110,0x910D,0x910F,0x9111,0x9116,0x9114, + 0x910B,0x910E,0x916E,0x916F,0x9248,0x9252,0x9230,0x923A, + 0x9266,0x9233,0x9265,0x925E,0x9283,0x922E,0x924A,0x9246, + 0x926D,0x926C,0x924F,0x9260,0x9267,0x926F,0x9236,0x9261, + 0x9270,0x9231,0x9254,0x9263,0x9250,0x9272,0x924E,0x9253, + 0x924C,0x9256,0x9232,0x959F,0x959C,0x959E,0x959B,0x9692, + 0x9693,0x9691,0x9697,0x96CE,0x96FA,0x96FD,0x96F8,0x96F5, + 0x9773,0x9777,0x9778,0x9772,0x980F,0x980D,0x980E,0x98AC, + 0x98F6,0x98F9,0x99AF,0x99B2,0x99B0,0x99B5,0x9AAD,0x9AAB, + 0x9B5B,0x9CEA,0x9CED,0x9CE7,0x9E80,0x9EFD,0x50E6,0x50D4, + 0x50D7,0x50E8,0x50F3,0x50DB,0x50EA,0x50DD,0x50E4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 74, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x50D3,0x50EC,0x50F0,0x50EF,0x50E3,0x50E0,0x51D8, + 0x5280,0x5281,0x52E9,0x52EB,0x5330,0x53AC,0x5627,0x5615, + 0x560C,0x5612,0x55FC,0x560F,0x561C,0x5601,0x5613,0x5602, + 0x55FA,0x561D,0x5604,0x55FF,0x55F9,0x5889,0x587C,0x5890, + 0x5898,0x5886,0x5881,0x587F,0x5874,0x588B,0x587A,0x5887, + 0x5891,0x588E,0x5876,0x5882,0x5888,0x587B,0x5894,0x588F, + 0x58FE,0x596B,0x5ADC,0x5AEE,0x5AE5,0x5AD5,0x5AEA,0x5ADA, + 0x5AED,0x5AEB,0x5AF3,0x5AE2,0x5AE0,0x5ADB,0x5AEC,0x5ADE, + 0x5ADD,0x5AD9,0x5AE8,0x5ADF,0x5B77,0x5BE0,0x5BE3,0x5C63, + 0x5D82,0x5D80,0x5D7D,0x5D86,0x5D7A,0x5D81,0x5D77,0x5D8A, + 0x5D89,0x5D88,0x5D7E,0x5D7C,0x5D8D,0x5D79,0x5D7F,0x5E58, + 0x5E59,0x5E53,0x5ED8,0x5ED1,0x5ED7,0x5ECE,0x5EDC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 75, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5ED5,0x5ED9,0x5ED2,0x5ED4,0x5F44,0x5F43,0x5F6F, + 0x5FB6,0x612C,0x6128,0x6141,0x615E,0x6171,0x6173,0x6152, + 0x6153,0x6172,0x616C,0x6180,0x6174,0x6154,0x617A,0x615B, + 0x6165,0x613B,0x616A,0x6161,0x6156,0x6229,0x6227,0x622B, + 0x642B,0x644D,0x645B,0x645D,0x6474,0x6476,0x6472,0x6473, + 0x647D,0x6475,0x6466,0x64A6,0x644E,0x6482,0x645E,0x645C, + 0x644B,0x6453,0x6460,0x6450,0x647F,0x643F,0x646C,0x646B, + 0x6459,0x6465,0x6477,0x6573,0x65A0,0x66A1,0x66A0,0x669F, + 0x6705,0x6704,0x6722,0x69B1,0x69B6,0x69C9,0x69A0,0x69CE, + 0x6996,0x69B0,0x69AC,0x69BC,0x6991,0x6999,0x698E,0x69A7, + 0x698D,0x69A9,0x69BE,0x69AF,0x69BF,0x69C4,0x69BD,0x69A4, + 0x69D4,0x69B9,0x69CA,0x699A,0x69CF,0x69B3,0x6993,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 76, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x69AA,0x69A1,0x699E,0x69D9,0x6997,0x6990,0x69C2, + 0x69B5,0x69A5,0x69C6,0x6B4A,0x6B4D,0x6B4B,0x6B9E,0x6B9F, + 0x6BA0,0x6BC3,0x6BC4,0x6BFE,0x6ECE,0x6EF5,0x6EF1,0x6F03, + 0x6F25,0x6EF8,0x6F37,0x6EFB,0x6F2E,0x6F09,0x6F4E,0x6F19, + 0x6F1A,0x6F27,0x6F18,0x6F3B,0x6F12,0x6EED,0x6F0A,0x6F36, + 0x6F73,0x6EF9,0x6EEE,0x6F2D,0x6F40,0x6F30,0x6F3C,0x6F35, + 0x6EEB,0x6F07,0x6F0E,0x6F43,0x6F05,0x6EFD,0x6EF6,0x6F39, + 0x6F1C,0x6EFC,0x6F3A,0x6F1F,0x6F0D,0x6F1E,0x6F08,0x6F21, + 0x7187,0x7190,0x7189,0x7180,0x7185,0x7182,0x718F,0x717B, + 0x7186,0x7181,0x7197,0x7244,0x7253,0x7297,0x7295,0x7293, + 0x7343,0x734D,0x7351,0x734C,0x7462,0x7473,0x7471,0x7475, + 0x7472,0x7467,0x746E,0x7500,0x7502,0x7503,0x757D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 77, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7590,0x7616,0x7608,0x760C,0x7615,0x7611,0x760A, + 0x7614,0x76B8,0x7781,0x777C,0x7785,0x7782,0x776E,0x7780, + 0x776F,0x777E,0x7783,0x78B2,0x78AA,0x78B4,0x78AD,0x78A8, + 0x787E,0x78AB,0x789E,0x78A5,0x78A0,0x78AC,0x78A2,0x78A4, + 0x7998,0x798A,0x798B,0x7996,0x7995,0x7994,0x7993,0x7997, + 0x7988,0x7992,0x7990,0x7A2B,0x7A4A,0x7A30,0x7A2F,0x7A28, + 0x7A26,0x7AA8,0x7AAB,0x7AAC,0x7AEE,0x7B88,0x7B9C,0x7B8A, + 0x7B91,0x7B90,0x7B96,0x7B8D,0x7B8C,0x7B9B,0x7B8E,0x7B85, + 0x7B98,0x5284,0x7B99,0x7BA4,0x7B82,0x7CBB,0x7CBF,0x7CBC, + 0x7CBA,0x7DA7,0x7DB7,0x7DC2,0x7DA3,0x7DAA,0x7DC1,0x7DC0, + 0x7DC5,0x7D9D,0x7DCE,0x7DC4,0x7DC6,0x7DCB,0x7DCC,0x7DAF, + 0x7DB9,0x7D96,0x7DBC,0x7D9F,0x7DA6,0x7DAE,0x7DA9,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 78, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7DA1,0x7DC9,0x7F73,0x7FE2,0x7FE3,0x7FE5,0x7FDE, + 0x8024,0x805D,0x805C,0x8189,0x8186,0x8183,0x8187,0x818D, + 0x818C,0x818B,0x8215,0x8497,0x84A4,0x84A1,0x849F,0x84BA, + 0x84CE,0x84C2,0x84AC,0x84AE,0x84AB,0x84B9,0x84B4,0x84C1, + 0x84CD,0x84AA,0x849A,0x84B1,0x84D0,0x849D,0x84A7,0x84BB, + 0x84A2,0x8494,0x84C7,0x84CC,0x849B,0x84A9,0x84AF,0x84A8, + 0x84D6,0x8498,0x84B6,0x84CF,0x84A0,0x84D7,0x84D4,0x84D2, + 0x84DB,0x84B0,0x8491,0x8661,0x8733,0x8723,0x8728,0x876B, + 0x8740,0x872E,0x871E,0x8721,0x8719,0x871B,0x8743,0x872C, + 0x8741,0x873E,0x8746,0x8720,0x8732,0x872A,0x872D,0x873C, + 0x8712,0x873A,0x8731,0x8735,0x8742,0x8726,0x8727,0x8738, + 0x8724,0x871A,0x8730,0x8711,0x88F7,0x88E7,0x88F1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x88F2,0x88FA,0x88FE,0x88EE,0x88FC,0x88F6,0x88FB, + 0x88F0,0x88EC,0x88EB,0x899D,0x89A1,0x899F,0x899E,0x89E9, + 0x89EB,0x89E8,0x8AAB,0x8A99,0x8A8B,0x8A92,0x8A8F,0x8A96, + 0x8C3D,0x8C68,0x8C69,0x8CD5,0x8CCF,0x8CD7,0x8D96,0x8E09, + 0x8E02,0x8DFF,0x8E0D,0x8DFD,0x8E0A,0x8E03,0x8E07,0x8E06, + 0x8E05,0x8DFE,0x8E00,0x8E04,0x8F10,0x8F11,0x8F0E,0x8F0D, + 0x9123,0x911C,0x9120,0x9122,0x911F,0x911D,0x911A,0x9124, + 0x9121,0x911B,0x917A,0x9172,0x9179,0x9173,0x92A5,0x92A4, + 0x9276,0x929B,0x927A,0x92A0,0x9294,0x92AA,0x928D,0x92A6, + 0x929A,0x92AB,0x9279,0x9297,0x927F,0x92A3,0x92EE,0x928E, + 0x9282,0x9295,0x92A2,0x927D,0x9288,0x92A1,0x928A,0x9286, + 0x928C,0x9299,0x92A7,0x927E,0x9287,0x92A9,0x929D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x928B,0x922D,0x969E,0x96A1,0x96FF,0x9758,0x977D, + 0x977A,0x977E,0x9783,0x9780,0x9782,0x977B,0x9784,0x9781, + 0x977F,0x97CE,0x97CD,0x9816,0x98AD,0x98AE,0x9902,0x9900, + 0x9907,0x999D,0x999C,0x99C3,0x99B9,0x99BB,0x99BA,0x99C2, + 0x99BD,0x99C7,0x9AB1,0x9AE3,0x9AE7,0x9B3E,0x9B3F,0x9B60, + 0x9B61,0x9B5F,0x9CF1,0x9CF2,0x9CF5,0x9EA7,0x50FF,0x5103, + 0x5130,0x50F8,0x5106,0x5107,0x50F6,0x50FE,0x510B,0x510C, + 0x50FD,0x510A,0x528B,0x528C,0x52F1,0x52EF,0x5648,0x5642, + 0x564C,0x5635,0x5641,0x564A,0x5649,0x5646,0x5658,0x565A, + 0x5640,0x5633,0x563D,0x562C,0x563E,0x5638,0x562A,0x563A, + 0x571A,0x58AB,0x589D,0x58B1,0x58A0,0x58A3,0x58AF,0x58AC, + 0x58A5,0x58A1,0x58FF,0x5AFF,0x5AF4,0x5AFD,0x5AF7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5AF6,0x5B03,0x5AF8,0x5B02,0x5AF9,0x5B01,0x5B07, + 0x5B05,0x5B0F,0x5C67,0x5D99,0x5D97,0x5D9F,0x5D92,0x5DA2, + 0x5D93,0x5D95,0x5DA0,0x5D9C,0x5DA1,0x5D9A,0x5D9E,0x5E69, + 0x5E5D,0x5E60,0x5E5C,0x7DF3,0x5EDB,0x5EDE,0x5EE1,0x5F49, + 0x5FB2,0x618B,0x6183,0x6179,0x61B1,0x61B0,0x61A2,0x6189, + 0x619B,0x6193,0x61AF,0x61AD,0x619F,0x6192,0x61AA,0x61A1, + 0x618D,0x6166,0x61B3,0x622D,0x646E,0x6470,0x6496,0x64A0, + 0x6485,0x6497,0x649C,0x648F,0x648B,0x648A,0x648C,0x64A3, + 0x649F,0x6468,0x64B1,0x6498,0x6576,0x657A,0x6579,0x657B, + 0x65B2,0x65B3,0x66B5,0x66B0,0x66A9,0x66B2,0x66B7,0x66AA, + 0x66AF,0x6A00,0x6A06,0x6A17,0x69E5,0x69F8,0x6A15,0x69F1, + 0x69E4,0x6A20,0x69FF,0x69EC,0x69E2,0x6A1B,0x6A1D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x69FE,0x6A27,0x69F2,0x69EE,0x6A14,0x69F7,0x69E7, + 0x6A40,0x6A08,0x69E6,0x69FB,0x6A0D,0x69FC,0x69EB,0x6A09, + 0x6A04,0x6A18,0x6A25,0x6A0F,0x69F6,0x6A26,0x6A07,0x69F4, + 0x6A16,0x6B51,0x6BA5,0x6BA3,0x6BA2,0x6BA6,0x6C01,0x6C00, + 0x6BFF,0x6C02,0x6F41,0x6F26,0x6F7E,0x6F87,0x6FC6,0x6F92, + 0x6F8D,0x6F89,0x6F8C,0x6F62,0x6F4F,0x6F85,0x6F5A,0x6F96, + 0x6F76,0x6F6C,0x6F82,0x6F55,0x6F72,0x6F52,0x6F50,0x6F57, + 0x6F94,0x6F93,0x6F5D,0x6F00,0x6F61,0x6F6B,0x6F7D,0x6F67, + 0x6F90,0x6F53,0x6F8B,0x6F69,0x6F7F,0x6F95,0x6F63,0x6F77, + 0x6F6A,0x6F7B,0x71B2,0x71AF,0x719B,0x71B0,0x71A0,0x719A, + 0x71A9,0x71B5,0x719D,0x71A5,0x719E,0x71A4,0x71A1,0x71AA, + 0x719C,0x71A7,0x71B3,0x7298,0x729A,0x7358,0x7352,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x735E,0x735F,0x7360,0x735D,0x735B,0x7361,0x735A, + 0x7359,0x7362,0x7487,0x7489,0x748A,0x7486,0x7481,0x747D, + 0x7485,0x7488,0x747C,0x7479,0x7508,0x7507,0x757E,0x7625, + 0x761E,0x7619,0x761D,0x761C,0x7623,0x761A,0x7628,0x761B, + 0x769C,0x769D,0x769E,0x769B,0x778D,0x778F,0x7789,0x7788, + 0x78CD,0x78BB,0x78CF,0x78CC,0x78D1,0x78CE,0x78D4,0x78C8, + 0x78C3,0x78C4,0x78C9,0x799A,0x79A1,0x79A0,0x799C,0x79A2, + 0x799B,0x6B76,0x7A39,0x7AB2,0x7AB4,0x7AB3,0x7BB7,0x7BCB, + 0x7BBE,0x7BAC,0x7BCE,0x7BAF,0x7BB9,0x7BCA,0x7BB5,0x7CC5, + 0x7CC8,0x7CCC,0x7CCB,0x7DF7,0x7DDB,0x7DEA,0x7DE7,0x7DD7, + 0x7DE1,0x7E03,0x7DFA,0x7DE6,0x7DF6,0x7DF1,0x7DF0,0x7DEE, + 0x7DDF,0x7F76,0x7FAC,0x7FB0,0x7FAD,0x7FED,0x7FEB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7FEA,0x7FEC,0x7FE6,0x7FE8,0x8064,0x8067,0x81A3, + 0x819F,0x819E,0x8195,0x81A2,0x8199,0x8197,0x8216,0x824F, + 0x8253,0x8252,0x8250,0x824E,0x8251,0x8524,0x853B,0x850F, + 0x8500,0x8529,0x850E,0x8509,0x850D,0x851F,0x850A,0x8527, + 0x851C,0x84FB,0x852B,0x84FA,0x8508,0x850C,0x84F4,0x852A, + 0x84F2,0x8515,0x84F7,0x84EB,0x84F3,0x84FC,0x8512,0x84EA, + 0x84E9,0x8516,0x84FE,0x8528,0x851D,0x852E,0x8502,0x84FD, + 0x851E,0x84F6,0x8531,0x8526,0x84E7,0x84E8,0x84F0,0x84EF, + 0x84F9,0x8518,0x8520,0x8530,0x850B,0x8519,0x852F,0x8662, + 0x8756,0x8763,0x8764,0x8777,0x87E1,0x8773,0x8758,0x8754, + 0x875B,0x8752,0x8761,0x875A,0x8751,0x875E,0x876D,0x876A, + 0x8750,0x874E,0x875F,0x875D,0x876F,0x876C,0x877A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x876E,0x875C,0x8765,0x874F,0x877B,0x8775,0x8762, + 0x8767,0x8769,0x885A,0x8905,0x890C,0x8914,0x890B,0x8917, + 0x8918,0x8919,0x8906,0x8916,0x8911,0x890E,0x8909,0x89A2, + 0x89A4,0x89A3,0x89ED,0x89F0,0x89EC,0x8ACF,0x8AC6,0x8AB8, + 0x8AD3,0x8AD1,0x8AD4,0x8AD5,0x8ABB,0x8AD7,0x8ABE,0x8AC0, + 0x8AC5,0x8AD8,0x8AC3,0x8ABA,0x8ABD,0x8AD9,0x8C3E,0x8C4D, + 0x8C8F,0x8CE5,0x8CDF,0x8CD9,0x8CE8,0x8CDA,0x8CDD,0x8CE7, + 0x8DA0,0x8D9C,0x8DA1,0x8D9B,0x8E20,0x8E23,0x8E25,0x8E24, + 0x8E2E,0x8E15,0x8E1B,0x8E16,0x8E11,0x8E19,0x8E26,0x8E27, + 0x8E14,0x8E12,0x8E18,0x8E13,0x8E1C,0x8E17,0x8E1A,0x8F2C, + 0x8F24,0x8F18,0x8F1A,0x8F20,0x8F23,0x8F16,0x8F17,0x9073, + 0x9070,0x906F,0x9067,0x906B,0x912F,0x912B,0x9129,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x912A,0x9132,0x9126,0x912E,0x9185,0x9186,0x918A, + 0x9181,0x9182,0x9184,0x9180,0x92D0,0x92C3,0x92C4,0x92C0, + 0x92D9,0x92B6,0x92CF,0x92F1,0x92DF,0x92D8,0x92E9,0x92D7, + 0x92DD,0x92CC,0x92EF,0x92C2,0x92E8,0x92CA,0x92C8,0x92CE, + 0x92E6,0x92CD,0x92D5,0x92C9,0x92E0,0x92DE,0x92E7,0x92D1, + 0x92D3,0x92B5,0x92E1,0x9325,0x92C6,0x92B4,0x957C,0x95AC, + 0x95AB,0x95AE,0x95B0,0x96A4,0x96A2,0x96D3,0x9705,0x9708, + 0x9702,0x975A,0x978A,0x978E,0x9788,0x97D0,0x97CF,0x981E, + 0x981D,0x9826,0x9829,0x9828,0x9820,0x981B,0x9827,0x98B2, + 0x9908,0x98FA,0x9911,0x9914,0x9916,0x9917,0x9915,0x99DC, + 0x99CD,0x99CF,0x99D3,0x99D4,0x99CE,0x99C9,0x99D6,0x99D8, + 0x99CB,0x99D7,0x99CC,0x9AB3,0x9AEC,0x9AEB,0x9AF3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9AF2,0x9AF1,0x9B46,0x9B43,0x9B67,0x9B74,0x9B71, + 0x9B66,0x9B76,0x9B75,0x9B70,0x9B68,0x9B64,0x9B6C,0x9CFC, + 0x9CFA,0x9CFD,0x9CFF,0x9CF7,0x9D07,0x9D00,0x9CF9,0x9CFB, + 0x9D08,0x9D05,0x9D04,0x9E83,0x9ED3,0x9F0F,0x9F10,0x511C, + 0x5113,0x5117,0x511A,0x5111,0x51DE,0x5334,0x53E1,0x5670, + 0x5660,0x566E,0x5673,0x5666,0x5663,0x566D,0x5672,0x565E, + 0x5677,0x571C,0x571B,0x58C8,0x58BD,0x58C9,0x58BF,0x58BA, + 0x58C2,0x58BC,0x58C6,0x5B17,0x5B19,0x5B1B,0x5B21,0x5B14, + 0x5B13,0x5B10,0x5B16,0x5B28,0x5B1A,0x5B20,0x5B1E,0x5BEF, + 0x5DAC,0x5DB1,0x5DA9,0x5DA7,0x5DB5,0x5DB0,0x5DAE,0x5DAA, + 0x5DA8,0x5DB2,0x5DAD,0x5DAF,0x5DB4,0x5E67,0x5E68,0x5E66, + 0x5E6F,0x5EE9,0x5EE7,0x5EE6,0x5EE8,0x5EE5,0x5F4B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5FBC,0x5FBB,0x619D,0x61A8,0x6196,0x61C5,0x61B4, + 0x61C6,0x61C1,0x61CC,0x61BA,0x61BF,0x61B8,0x618C,0x64D7, + 0x64D6,0x64D0,0x64CF,0x64C9,0x64BD,0x6489,0x64C3,0x64DB, + 0x64F3,0x64D9,0x6533,0x657F,0x657C,0x65A2,0x66C8,0x66BE, + 0x66C0,0x66CA,0x66CB,0x66CF,0x66BD,0x66BB,0x66BA,0x66CC, + 0x6723,0x6A34,0x6A66,0x6A49,0x6A67,0x6A32,0x6A68,0x6A3E, + 0x6A5D,0x6A6D,0x6A76,0x6A5B,0x6A51,0x6A28,0x6A5A,0x6A3B, + 0x6A3F,0x6A41,0x6A6A,0x6A64,0x6A50,0x6A4F,0x6A54,0x6A6F, + 0x6A69,0x6A60,0x6A3C,0x6A5E,0x6A56,0x6A55,0x6A4D,0x6A4E, + 0x6A46,0x6B55,0x6B54,0x6B56,0x6BA7,0x6BAA,0x6BAB,0x6BC8, + 0x6BC7,0x6C04,0x6C03,0x6C06,0x6FAD,0x6FCB,0x6FA3,0x6FC7, + 0x6FBC,0x6FCE,0x6FC8,0x6F5E,0x6FC4,0x6FBD,0x6F9E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6FCA,0x6FA8,0x7004,0x6FA5,0x6FAE,0x6FBA,0x6FAC, + 0x6FAA,0x6FCF,0x6FBF,0x6FB8,0x6FA2,0x6FC9,0x6FAB,0x6FCD, + 0x6FAF,0x6FB2,0x6FB0,0x71C5,0x71C2,0x71BF,0x71B8,0x71D6, + 0x71C0,0x71C1,0x71CB,0x71D4,0x71CA,0x71C7,0x71CF,0x71BD, + 0x71D8,0x71BC,0x71C6,0x71DA,0x71DB,0x729D,0x729E,0x7369, + 0x7366,0x7367,0x736C,0x7365,0x736B,0x736A,0x747F,0x749A, + 0x74A0,0x7494,0x7492,0x7495,0x74A1,0x750B,0x7580,0x762F, + 0x762D,0x7631,0x763D,0x7633,0x763C,0x7635,0x7632,0x7630, + 0x76BB,0x76E6,0x779A,0x779D,0x77A1,0x779C,0x779B,0x77A2, + 0x77A3,0x7795,0x7799,0x7797,0x78DD,0x78E9,0x78E5,0x78EA, + 0x78DE,0x78E3,0x78DB,0x78E1,0x78E2,0x78ED,0x78DF,0x78E0, + 0x79A4,0x7A44,0x7A48,0x7A47,0x7AB6,0x7AB8,0x7AB5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7AB1,0x7AB7,0x7BDE,0x7BE3,0x7BE7,0x7BDD,0x7BD5, + 0x7BE5,0x7BDA,0x7BE8,0x7BF9,0x7BD4,0x7BEA,0x7BE2,0x7BDC, + 0x7BEB,0x7BD8,0x7BDF,0x7CD2,0x7CD4,0x7CD7,0x7CD0,0x7CD1, + 0x7E12,0x7E21,0x7E17,0x7E0C,0x7E1F,0x7E20,0x7E13,0x7E0E, + 0x7E1C,0x7E15,0x7E1A,0x7E22,0x7E0B,0x7E0F,0x7E16,0x7E0D, + 0x7E14,0x7E25,0x7E24,0x7F43,0x7F7B,0x7F7C,0x7F7A,0x7FB1, + 0x7FEF,0x802A,0x8029,0x806C,0x81B1,0x81A6,0x81AE,0x81B9, + 0x81B5,0x81AB,0x81B0,0x81AC,0x81B4,0x81B2,0x81B7,0x81A7, + 0x81F2,0x8255,0x8256,0x8257,0x8556,0x8545,0x856B,0x854D, + 0x8553,0x8561,0x8558,0x8540,0x8546,0x8564,0x8541,0x8562, + 0x8544,0x8551,0x8547,0x8563,0x853E,0x855B,0x8571,0x854E, + 0x856E,0x8575,0x8555,0x8567,0x8560,0x858C,0x8566,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x855D,0x8554,0x8565,0x856C,0x8663,0x8665,0x8664, + 0x87A4,0x879B,0x878F,0x8797,0x8793,0x8792,0x8788,0x8781, + 0x8796,0x8798,0x8779,0x8787,0x87A3,0x8785,0x8790,0x8791, + 0x879D,0x8784,0x8794,0x879C,0x879A,0x8789,0x891E,0x8926, + 0x8930,0x892D,0x892E,0x8927,0x8931,0x8922,0x8929,0x8923, + 0x892F,0x892C,0x891F,0x89F1,0x8AE0,0x8AE2,0x8AF2,0x8AF4, + 0x8AF5,0x8ADD,0x8B14,0x8AE4,0x8ADF,0x8AF0,0x8AC8,0x8ADE, + 0x8AE1,0x8AE8,0x8AFF,0x8AEF,0x8AFB,0x8C91,0x8C92,0x8C90, + 0x8CF5,0x8CEE,0x8CF1,0x8CF0,0x8CF3,0x8D6C,0x8D6E,0x8DA5, + 0x8DA7,0x8E33,0x8E3E,0x8E38,0x8E40,0x8E45,0x8E36,0x8E3C, + 0x8E3D,0x8E41,0x8E30,0x8E3F,0x8EBD,0x8F36,0x8F2E,0x8F35, + 0x8F32,0x8F39,0x8F37,0x8F34,0x9076,0x9079,0x907B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9086,0x90FA,0x9133,0x9135,0x9136,0x9193,0x9190, + 0x9191,0x918D,0x918F,0x9327,0x931E,0x9308,0x931F,0x9306, + 0x930F,0x937A,0x9338,0x933C,0x931B,0x9323,0x9312,0x9301, + 0x9346,0x932D,0x930E,0x930D,0x92CB,0x931D,0x92FA,0x9313, + 0x92F9,0x92F7,0x9334,0x9302,0x9324,0x92FF,0x9329,0x9339, + 0x9335,0x932A,0x9314,0x930C,0x930B,0x92FE,0x9309,0x9300, + 0x92FB,0x9316,0x95BC,0x95CD,0x95BE,0x95B9,0x95BA,0x95B6, + 0x95BF,0x95B5,0x95BD,0x96A9,0x96D4,0x970B,0x9712,0x9710, + 0x9799,0x9797,0x9794,0x97F0,0x97F8,0x9835,0x982F,0x9832, + 0x9924,0x991F,0x9927,0x9929,0x999E,0x99EE,0x99EC,0x99E5, + 0x99E4,0x99F0,0x99E3,0x99EA,0x99E9,0x99E7,0x9AB9,0x9ABF, + 0x9AB4,0x9ABB,0x9AF6,0x9AFA,0x9AF9,0x9AF7,0x9B33,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9B80,0x9B85,0x9B87,0x9B7C,0x9B7E,0x9B7B,0x9B82, + 0x9B93,0x9B92,0x9B90,0x9B7A,0x9B95,0x9B7D,0x9B88,0x9D25, + 0x9D17,0x9D20,0x9D1E,0x9D14,0x9D29,0x9D1D,0x9D18,0x9D22, + 0x9D10,0x9D19,0x9D1F,0x9E88,0x9E86,0x9E87,0x9EAE,0x9EAD, + 0x9ED5,0x9ED6,0x9EFA,0x9F12,0x9F3D,0x5126,0x5125,0x5122, + 0x5124,0x5120,0x5129,0x52F4,0x5693,0x568C,0x568D,0x5686, + 0x5684,0x5683,0x567E,0x5682,0x567F,0x5681,0x58D6,0x58D4, + 0x58CF,0x58D2,0x5B2D,0x5B25,0x5B32,0x5B23,0x5B2C,0x5B27, + 0x5B26,0x5B2F,0x5B2E,0x5B7B,0x5BF1,0x5BF2,0x5DB7,0x5E6C, + 0x5E6A,0x5FBE,0x61C3,0x61B5,0x61BC,0x61E7,0x61E0,0x61E5, + 0x61E4,0x61E8,0x61DE,0x64EF,0x64E9,0x64E3,0x64EB,0x64E4, + 0x64E8,0x6581,0x6580,0x65B6,0x65DA,0x66D2,0x6A8D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A96,0x6A81,0x6AA5,0x6A89,0x6A9F,0x6A9B,0x6AA1, + 0x6A9E,0x6A87,0x6A93,0x6A8E,0x6A95,0x6A83,0x6AA8,0x6AA4, + 0x6A91,0x6A7F,0x6AA6,0x6A9A,0x6A85,0x6A8C,0x6A92,0x6B5B, + 0x6BAD,0x6C09,0x6FCC,0x6FA9,0x6FF4,0x6FD4,0x6FE3,0x6FDC, + 0x6FED,0x6FE7,0x6FE6,0x6FDE,0x6FF2,0x6FDD,0x6FE2,0x6FE8, + 0x71E1,0x71F1,0x71E8,0x71F2,0x71E4,0x71F0,0x71E2,0x7373, + 0x736E,0x736F,0x7497,0x74B2,0x74AB,0x7490,0x74AA,0x74AD, + 0x74B1,0x74A5,0x74AF,0x7510,0x7511,0x7512,0x750F,0x7584, + 0x7643,0x7648,0x7649,0x7647,0x76A4,0x76E9,0x77B5,0x77AB, + 0x77B2,0x77B7,0x77B6,0x77B4,0x77B1,0x77A8,0x77F0,0x78F3, + 0x78FD,0x7902,0x78FB,0x78FC,0x78FF,0x78F2,0x7905,0x78F9, + 0x78FE,0x7904,0x79AB,0x79A8,0x7A5C,0x7A5B,0x7A56,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A58,0x7A54,0x7A5A,0x7ABE,0x7AC0,0x7AC1,0x7C05, + 0x7C0F,0x7BF2,0x7C00,0x7BFF,0x7BFB,0x7C0E,0x7BF4,0x7C0B, + 0x7BF3,0x7C02,0x7C09,0x7C03,0x7C01,0x7BF8,0x7BFD,0x7C06, + 0x7BF0,0x7BF1,0x7C10,0x7C0A,0x7CE8,0x7E2D,0x7E3C,0x7E42, + 0x7E33,0x9848,0x7E38,0x7E2A,0x7E49,0x7E40,0x7E47,0x7E29, + 0x7E4C,0x7E30,0x7E3B,0x7E36,0x7E44,0x7E3A,0x7F45,0x7F7F, + 0x7F7E,0x7F7D,0x7FF4,0x7FF2,0x802C,0x81BB,0x81C4,0x81CC, + 0x81CA,0x81C5,0x81C7,0x81BC,0x81E9,0x825B,0x825A,0x825C, + 0x8583,0x8580,0x858F,0x85A7,0x8595,0x85A0,0x858B,0x85A3, + 0x857B,0x85A4,0x859A,0x859E,0x8577,0x857C,0x8589,0x85A1, + 0x857A,0x8578,0x8557,0x858E,0x8596,0x8586,0x858D,0x8599, + 0x859D,0x8581,0x85A2,0x8582,0x8588,0x8585,0x8579,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8576,0x8598,0x8590,0x859F,0x8668,0x87BE,0x87AA, + 0x87AD,0x87C5,0x87B0,0x87AC,0x87B9,0x87B5,0x87BC,0x87AE, + 0x87C9,0x87C3,0x87C2,0x87CC,0x87B7,0x87AF,0x87C4,0x87CA, + 0x87B4,0x87B6,0x87BF,0x87B8,0x87BD,0x87DE,0x87B2,0x8935, + 0x8933,0x893C,0x893E,0x8941,0x8952,0x8937,0x8942,0x89AD, + 0x89AF,0x89AE,0x89F2,0x89F3,0x8B1E,0x8B18,0x8B16,0x8B11, + 0x8B05,0x8B0B,0x8B22,0x8B0F,0x8B12,0x8B15,0x8B07,0x8B0D, + 0x8B08,0x8B06,0x8B1C,0x8B13,0x8B1A,0x8C4F,0x8C70,0x8C72, + 0x8C71,0x8C6F,0x8C95,0x8C94,0x8CF9,0x8D6F,0x8E4E,0x8E4D, + 0x8E53,0x8E50,0x8E4C,0x8E47,0x8F43,0x8F40,0x9085,0x907E, + 0x9138,0x919A,0x91A2,0x919B,0x9199,0x919F,0x91A1,0x919D, + 0x91A0,0x93A1,0x9383,0x93AF,0x9364,0x9356,0x9347,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x937C,0x9358,0x935C,0x9376,0x9349,0x9350,0x9351, + 0x9360,0x936D,0x938F,0x934C,0x936A,0x9379,0x9357,0x9355, + 0x9352,0x934F,0x9371,0x9377,0x937B,0x9361,0x935E,0x9363, + 0x9367,0x934E,0x9359,0x95C7,0x95C0,0x95C9,0x95C3,0x95C5, + 0x95B7,0x96AE,0x96B0,0x96AC,0x9720,0x971F,0x9718,0x971D, + 0x9719,0x979A,0x97A1,0x979C,0x979E,0x979D,0x97D5,0x97D4, + 0x97F1,0x9841,0x9844,0x984A,0x9849,0x9845,0x9843,0x9925, + 0x992B,0x992C,0x992A,0x9933,0x9932,0x992F,0x992D,0x9931, + 0x9930,0x9998,0x99A3,0x99A1,0x9A02,0x99FA,0x99F4,0x99F7, + 0x99F9,0x99F8,0x99F6,0x99FB,0x99FD,0x99FE,0x99FC,0x9A03, + 0x9ABE,0x9AFE,0x9AFD,0x9B01,0x9AFC,0x9B48,0x9B9A,0x9BA8, + 0x9B9E,0x9B9B,0x9BA6,0x9BA1,0x9BA5,0x9BA4,0x9B86,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9BA2,0x9BA0,0x9BAF,0x9D33,0x9D41,0x9D67,0x9D36, + 0x9D2E,0x9D2F,0x9D31,0x9D38,0x9D30,0x9D45,0x9D42,0x9D43, + 0x9D3E,0x9D37,0x9D40,0x9D3D,0x7FF5,0x9D2D,0x9E8A,0x9E89, + 0x9E8D,0x9EB0,0x9EC8,0x9EDA,0x9EFB,0x9EFF,0x9F24,0x9F23, + 0x9F22,0x9F54,0x9FA0,0x5131,0x512D,0x512E,0x5698,0x569C, + 0x5697,0x569A,0x569D,0x5699,0x5970,0x5B3C,0x5C69,0x5C6A, + 0x5DC0,0x5E6D,0x5E6E,0x61D8,0x61DF,0x61ED,0x61EE,0x61F1, + 0x61EA,0x61F0,0x61EB,0x61D6,0x61E9,0x64FF,0x6504,0x64FD, + 0x64F8,0x6501,0x6503,0x64FC,0x6594,0x65DB,0x66DA,0x66DB, + 0x66D8,0x6AC5,0x6AB9,0x6ABD,0x6AE1,0x6AC6,0x6ABA,0x6AB6, + 0x6AB7,0x6AC7,0x6AB4,0x6AAD,0x6B5E,0x6BC9,0x6C0B,0x7007, + 0x700C,0x700D,0x7001,0x7005,0x7014,0x700E,0x6FFF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7000,0x6FFB,0x7026,0x6FFC,0x6FF7,0x700A,0x7201, + 0x71FF,0x71F9,0x7203,0x71FD,0x7376,0x74B8,0x74C0,0x74B5, + 0x74C1,0x74BE,0x74B6,0x74BB,0x74C2,0x7514,0x7513,0x765C, + 0x7664,0x7659,0x7650,0x7653,0x7657,0x765A,0x76A6,0x76BD, + 0x76EC,0x77C2,0x77BA,0x790C,0x7913,0x7914,0x7909,0x7910, + 0x7912,0x7911,0x79AD,0x79AC,0x7A5F,0x7C1C,0x7C29,0x7C19, + 0x7C20,0x7C1F,0x7C2D,0x7C1D,0x7C26,0x7C28,0x7C22,0x7C25, + 0x7C30,0x7E5C,0x7E50,0x7E56,0x7E63,0x7E58,0x7E62,0x7E5F, + 0x7E51,0x7E60,0x7E57,0x7E53,0x7FB5,0x7FB3,0x7FF7,0x7FF8, + 0x8075,0x81D1,0x81D2,0x81D0,0x825F,0x825E,0x85B4,0x85C6, + 0x85C0,0x85C3,0x85C2,0x85B3,0x85B5,0x85BD,0x85C7,0x85C4, + 0x85BF,0x85CB,0x85CE,0x85C8,0x85C5,0x85B1,0x85B6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x85D2,0x8624,0x85B8,0x85B7,0x85BE,0x8669,0x87E7, + 0x87E6,0x87E2,0x87DB,0x87EB,0x87EA,0x87E5,0x87DF,0x87F3, + 0x87E4,0x87D4,0x87DC,0x87D3,0x87ED,0x87D8,0x87E3,0x87D7, + 0x87D9,0x8801,0x87F4,0x87E8,0x87DD,0x8953,0x894B,0x894F, + 0x894C,0x8946,0x8950,0x8951,0x8949,0x8B2A,0x8B27,0x8B23, + 0x8B33,0x8B30,0x8B35,0x8B47,0x8B2F,0x8B3C,0x8B3E,0x8B31, + 0x8B25,0x8B37,0x8B26,0x8B36,0x8B2E,0x8B24,0x8B3B,0x8B3D, + 0x8B3A,0x8C42,0x8C75,0x8C99,0x8C98,0x8C97,0x8CFE,0x8D04, + 0x8D02,0x8D00,0x8E5C,0x8E62,0x8E60,0x8E57,0x8E56,0x8E5E, + 0x8E65,0x8E67,0x8E5B,0x8E5A,0x8E61,0x8E5D,0x8E69,0x8E54, + 0x8F46,0x8F47,0x8F48,0x8F4B,0x9128,0x913A,0x913B,0x913E, + 0x91A8,0x91A5,0x91A7,0x91AF,0x91AA,0x93B5,0x938C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9392,0x93B7,0x939B,0x939D,0x9389,0x93A7,0x938E, + 0x93AA,0x939E,0x93A6,0x9395,0x9388,0x9399,0x939F,0x9380, + 0x938D,0x93B1,0x9391,0x93B2,0x93A4,0x93A8,0x93B4,0x93A3, + 0x95D2,0x95D3,0x95D1,0x96B3,0x96D7,0x96DA,0x5DC2,0x96DF, + 0x96D8,0x96DD,0x9723,0x9722,0x9725,0x97AC,0x97AE,0x97A8, + 0x97AB,0x97A4,0x97AA,0x97A2,0x97A5,0x97D7,0x97D9,0x97D6, + 0x97D8,0x97FA,0x9850,0x9851,0x9852,0x98B8,0x9941,0x993C, + 0x993A,0x9A0F,0x9A0B,0x9A09,0x9A0D,0x9A04,0x9A11,0x9A0A, + 0x9A05,0x9A07,0x9A06,0x9AC0,0x9ADC,0x9B08,0x9B04,0x9B05, + 0x9B29,0x9B35,0x9B4A,0x9B4C,0x9B4B,0x9BC7,0x9BC6,0x9BC3, + 0x9BBF,0x9BC1,0x9BB5,0x9BB8,0x9BD3,0x9BB6,0x9BC4,0x9BB9, + 0x9BBD,0x9D5C,0x9D53,0x9D4F,0x9D4A,0x9D5B,0x9D4B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9D59,0x9D56,0x9D4C,0x9D57,0x9D52,0x9D54,0x9D5F, + 0x9D58,0x9D5A,0x9E8E,0x9E8C,0x9EDF,0x9F01,0x9F00,0x9F16, + 0x9F25,0x9F2B,0x9F2A,0x9F29,0x9F28,0x9F4C,0x9F55,0x5134, + 0x5135,0x5296,0x52F7,0x53B4,0x56AB,0x56AD,0x56A6,0x56A7, + 0x56AA,0x56AC,0x58DA,0x58DD,0x58DB,0x5912,0x5B3D,0x5B3E, + 0x5B3F,0x5DC3,0x5E70,0x5FBF,0x61FB,0x6507,0x6510,0x650D, + 0x6509,0x650C,0x650E,0x6584,0x65DE,0x65DD,0x66DE,0x6AE7, + 0x6AE0,0x6ACC,0x6AD1,0x6AD9,0x6ACB,0x6ADF,0x6ADC,0x6AD0, + 0x6AEB,0x6ACF,0x6ACD,0x6ADE,0x6B60,0x6BB0,0x6C0C,0x7019, + 0x7027,0x7020,0x7016,0x702B,0x7021,0x7022,0x7023,0x7029, + 0x7017,0x7024,0x701C,0x720C,0x720A,0x7207,0x7202,0x7205, + 0x72A5,0x72A6,0x72A4,0x72A3,0x72A1,0x74CB,0x74C5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x4600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x74B7,0x74C3,0x7516,0x7660,0x77C9,0x77CA,0x77C4, + 0x77F1,0x791D,0x791B,0x7921,0x791C,0x7917,0x791E,0x79B0, + 0x7A67,0x7A68,0x7C33,0x7C3C,0x7C39,0x7C2C,0x7C3B,0x7CEC, + 0x7CEA,0x7E76,0x7E75,0x7E78,0x7E70,0x7E77,0x7E6F,0x7E7A, + 0x7E72,0x7E74,0x7E68,0x7F4B,0x7F4A,0x7F83,0x7F86,0x7FB7, + 0x7FFD,0x7FFE,0x8078,0x81D7,0x81D5,0x820B,0x8264,0x8261, + 0x8263,0x85EB,0x85F1,0x85ED,0x85D9,0x85E1,0x85E8,0x85DA, + 0x85D7,0x85EC,0x85F2,0x85F8,0x85D8,0x85DF,0x85E3,0x85DC, + 0x85D1,0x85F0,0x85E6,0x85EF,0x85DE,0x85E2,0x8800,0x87FA, + 0x8803,0x87F6,0x87F7,0x8809,0x880C,0x880B,0x8806,0x87FC, + 0x8808,0x87FF,0x880A,0x8802,0x8962,0x895A,0x895B,0x8957, + 0x8961,0x895C,0x8958,0x895D,0x8959,0x8988,0x89B7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x4700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x89B6,0x89F6,0x8B50,0x8B48,0x8B4A,0x8B40,0x8B53, + 0x8B56,0x8B54,0x8B4B,0x8B55,0x8B51,0x8B42,0x8B52,0x8B57, + 0x8C43,0x8C77,0x8C76,0x8C9A,0x8D06,0x8D07,0x8D09,0x8DAC, + 0x8DAA,0x8DAD,0x8DAB,0x8E6D,0x8E78,0x8E73,0x8E6A,0x8E6F, + 0x8E7B,0x8EC2,0x8F52,0x8F51,0x8F4F,0x8F50,0x8F53,0x8FB4, + 0x9140,0x913F,0x91B0,0x91AD,0x93DE,0x93C7,0x93CF,0x93C2, + 0x93DA,0x93D0,0x93F9,0x93EC,0x93CC,0x93D9,0x93A9,0x93E6, + 0x93CA,0x93D4,0x93EE,0x93E3,0x93D5,0x93C4,0x93CE,0x93C0, + 0x93D2,0x93A5,0x93E7,0x957D,0x95DA,0x95DB,0x96E1,0x9729, + 0x972B,0x972C,0x9728,0x9726,0x97B3,0x97B7,0x97B6,0x97DD, + 0x97DE,0x97DF,0x985C,0x9859,0x985D,0x9857,0x98BF,0x98BD, + 0x98BB,0x98BE,0x9948,0x9947,0x9943,0x99A6,0x99A7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9A1A,0x9A15,0x9A25,0x9A1D,0x9A24,0x9A1B,0x9A22, + 0x9A20,0x9A27,0x9A23,0x9A1E,0x9A1C,0x9A14,0x9AC2,0x9B0B, + 0x9B0A,0x9B0E,0x9B0C,0x9B37,0x9BEA,0x9BEB,0x9BE0,0x9BDE, + 0x9BE4,0x9BE6,0x9BE2,0x9BF0,0x9BD4,0x9BD7,0x9BEC,0x9BDC, + 0x9BD9,0x9BE5,0x9BD5,0x9BE1,0x9BDA,0x9D77,0x9D81,0x9D8A, + 0x9D84,0x9D88,0x9D71,0x9D80,0x9D78,0x9D86,0x9D8B,0x9D8C, + 0x9D7D,0x9D6B,0x9D74,0x9D75,0x9D70,0x9D69,0x9D85,0x9D73, + 0x9D7B,0x9D82,0x9D6F,0x9D79,0x9D7F,0x9D87,0x9D68,0x9E94, + 0x9E91,0x9EC0,0x9EFC,0x9F2D,0x9F40,0x9F41,0x9F4D,0x9F56, + 0x9F57,0x9F58,0x5337,0x56B2,0x56B5,0x56B3,0x58E3,0x5B45, + 0x5DC6,0x5DC7,0x5EEE,0x5EEF,0x5FC0,0x5FC1,0x61F9,0x6517, + 0x6516,0x6515,0x6513,0x65DF,0x66E8,0x66E3,0x66E4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6AF3,0x6AF0,0x6AEA,0x6AE8,0x6AF9,0x6AF1,0x6AEE, + 0x6AEF,0x703C,0x7035,0x702F,0x7037,0x7034,0x7031,0x7042, + 0x7038,0x703F,0x703A,0x7039,0x702A,0x7040,0x703B,0x7033, + 0x7041,0x7213,0x7214,0x72A8,0x737D,0x737C,0x74BA,0x76AB, + 0x76AA,0x76BE,0x76ED,0x77CC,0x77CE,0x77CF,0x77CD,0x77F2, + 0x7925,0x7923,0x7927,0x7928,0x7924,0x7929,0x79B2,0x7A6E, + 0x7A6C,0x7A6D,0x7AF7,0x7C49,0x7C48,0x7C4A,0x7C47,0x7C45, + 0x7CEE,0x7E7B,0x7E7E,0x7E81,0x7E80,0x7FBA,0x7FFF,0x8079, + 0x81DB,0x81D9,0x8268,0x8269,0x8622,0x85FF,0x8601,0x85FE, + 0x861B,0x8600,0x85F6,0x8604,0x8609,0x8605,0x860C,0x85FD, + 0x8819,0x8810,0x8811,0x8817,0x8813,0x8816,0x8963,0x8966, + 0x89B9,0x89F7,0x8B60,0x8B6A,0x8B5D,0x8B68,0x8B63,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 107, Array index 0x4A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8B65,0x8B67,0x8B6D,0x8DAE,0x8E86,0x8E88,0x8E84, + 0x8F59,0x8F56,0x8F57,0x8F55,0x8F58,0x8F5A,0x908D,0x9143, + 0x9141,0x91B7,0x91B5,0x91B2,0x91B3,0x940B,0x9413,0x93FB, + 0x9420,0x940F,0x9414,0x93FE,0x9415,0x9410,0x9428,0x9419, + 0x940D,0x93F5,0x9400,0x93F7,0x9407,0x940E,0x9416,0x9412, + 0x93FA,0x9409,0x93F8,0x943C,0x940A,0x93FF,0x93FC,0x940C, + 0x93F6,0x9411,0x9406,0x95DE,0x95E0,0x95DF,0x972E,0x972F, + 0x97B9,0x97BB,0x97FD,0x97FE,0x9860,0x9862,0x9863,0x985F, + 0x98C1,0x98C2,0x9950,0x994E,0x9959,0x994C,0x994B,0x9953, + 0x9A32,0x9A34,0x9A31,0x9A2C,0x9A2A,0x9A36,0x9A29,0x9A2E, + 0x9A38,0x9A2D,0x9AC7,0x9ACA,0x9AC6,0x9B10,0x9B12,0x9B11, + 0x9C0B,0x9C08,0x9BF7,0x9C05,0x9C12,0x9BF8,0x9C40,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9C07,0x9C0E,0x9C06,0x9C17,0x9C14,0x9C09,0x9D9F, + 0x9D99,0x9DA4,0x9D9D,0x9D92,0x9D98,0x9D90,0x9D9B,0x9DA0, + 0x9D94,0x9D9C,0x9DAA,0x9D97,0x9DA1,0x9D9A,0x9DA2,0x9DA8, + 0x9D9E,0x9DA3,0x9DBF,0x9DA9,0x9D96,0x9DA6,0x9DA7,0x9E99, + 0x9E9B,0x9E9A,0x9EE5,0x9EE4,0x9EE7,0x9EE6,0x9F30,0x9F2E, + 0x9F5B,0x9F60,0x9F5E,0x9F5D,0x9F59,0x9F91,0x513A,0x5139, + 0x5298,0x5297,0x56C3,0x56BD,0x56BE,0x5B48,0x5B47,0x5DCB, + 0x5DCF,0x5EF1,0x61FD,0x651B,0x6B02,0x6AFC,0x6B03,0x6AF8, + 0x6B00,0x7043,0x7044,0x704A,0x7048,0x7049,0x7045,0x7046, + 0x721D,0x721A,0x7219,0x737E,0x7517,0x766A,0x77D0,0x792D, + 0x7931,0x792F,0x7C54,0x7C53,0x7CF2,0x7E8A,0x7E87,0x7E88, + 0x7E8B,0x7E86,0x7E8D,0x7F4D,0x7FBB,0x8030,0x81DD,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x4C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8618,0x862A,0x8626,0x861F,0x8623,0x861C,0x8619, + 0x8627,0x862E,0x8621,0x8620,0x8629,0x861E,0x8625,0x8829, + 0x881D,0x881B,0x8820,0x8824,0x881C,0x882B,0x884A,0x896D, + 0x8969,0x896E,0x896B,0x89FA,0x8B79,0x8B78,0x8B45,0x8B7A, + 0x8B7B,0x8D10,0x8D14,0x8DAF,0x8E8E,0x8E8C,0x8F5E,0x8F5B, + 0x8F5D,0x9146,0x9144,0x9145,0x91B9,0x943F,0x943B,0x9436, + 0x9429,0x943D,0x9430,0x9439,0x942A,0x9437,0x942C,0x9440, + 0x9431,0x95E5,0x95E4,0x95E3,0x9735,0x973A,0x97BF,0x97E1, + 0x9864,0x98C9,0x98C6,0x98C0,0x9958,0x9956,0x9A39,0x9A3D, + 0x9A46,0x9A44,0x9A42,0x9A41,0x9A3A,0x9A3F,0x9ACD,0x9B15, + 0x9B17,0x9B18,0x9B16,0x9B3A,0x9B52,0x9C2B,0x9C1D,0x9C1C, + 0x9C2C,0x9C23,0x9C28,0x9C29,0x9C24,0x9C21,0x9DB7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x4D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9DB6,0x9DBC,0x9DC1,0x9DC7,0x9DCA,0x9DCF,0x9DBE, + 0x9DC5,0x9DC3,0x9DBB,0x9DB5,0x9DCE,0x9DB9,0x9DBA,0x9DAC, + 0x9DC8,0x9DB1,0x9DAD,0x9DCC,0x9DB3,0x9DCD,0x9DB2,0x9E7A, + 0x9E9C,0x9EEB,0x9EEE,0x9EED,0x9F1B,0x9F18,0x9F1A,0x9F31, + 0x9F4E,0x9F65,0x9F64,0x9F92,0x4EB9,0x56C6,0x56C5,0x56CB, + 0x5971,0x5B4B,0x5B4C,0x5DD5,0x5DD1,0x5EF2,0x6521,0x6520, + 0x6526,0x6522,0x6B0B,0x6B08,0x6B09,0x6C0D,0x7055,0x7056, + 0x7057,0x7052,0x721E,0x721F,0x72A9,0x737F,0x74D8,0x74D5, + 0x74D9,0x74D7,0x766D,0x76AD,0x7935,0x79B4,0x7A70,0x7A71, + 0x7C57,0x7C5C,0x7C59,0x7C5B,0x7C5A,0x7CF4,0x7CF1,0x7E91, + 0x7F4F,0x7F87,0x81DE,0x826B,0x8634,0x8635,0x8633,0x862C, + 0x8632,0x8636,0x882C,0x8828,0x8826,0x882A,0x8825,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x4E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8971,0x89BF,0x89BE,0x89FB,0x8B7E,0x8B84,0x8B82, + 0x8B86,0x8B85,0x8B7F,0x8D15,0x8E95,0x8E94,0x8E9A,0x8E92, + 0x8E90,0x8E96,0x8E97,0x8F60,0x8F62,0x9147,0x944C,0x9450, + 0x944A,0x944B,0x944F,0x9447,0x9445,0x9448,0x9449,0x9446, + 0x973F,0x97E3,0x986A,0x9869,0x98CB,0x9954,0x995B,0x9A4E, + 0x9A53,0x9A54,0x9A4C,0x9A4F,0x9A48,0x9A4A,0x9A49,0x9A52, + 0x9A50,0x9AD0,0x9B19,0x9B2B,0x9B3B,0x9B56,0x9B55,0x9C46, + 0x9C48,0x9C3F,0x9C44,0x9C39,0x9C33,0x9C41,0x9C3C,0x9C37, + 0x9C34,0x9C32,0x9C3D,0x9C36,0x9DDB,0x9DD2,0x9DDE,0x9DDA, + 0x9DCB,0x9DD0,0x9DDC,0x9DD1,0x9DDF,0x9DE9,0x9DD9,0x9DD8, + 0x9DD6,0x9DF5,0x9DD5,0x9DDD,0x9EB6,0x9EF0,0x9F35,0x9F33, + 0x9F32,0x9F42,0x9F6B,0x9F95,0x9FA2,0x513D,0x5299,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 112, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x58E8,0x58E7,0x5972,0x5B4D,0x5DD8,0x882F,0x5F4F, + 0x6201,0x6203,0x6204,0x6529,0x6525,0x6596,0x66EB,0x6B11, + 0x6B12,0x6B0F,0x6BCA,0x705B,0x705A,0x7222,0x7382,0x7381, + 0x7383,0x7670,0x77D4,0x7C67,0x7C66,0x7E95,0x826C,0x863A, + 0x8640,0x8639,0x863C,0x8631,0x863B,0x863E,0x8830,0x8832, + 0x882E,0x8833,0x8976,0x8974,0x8973,0x89FE,0x8B8C,0x8B8E, + 0x8B8B,0x8B88,0x8C45,0x8D19,0x8E98,0x8F64,0x8F63,0x91BC, + 0x9462,0x9455,0x945D,0x9457,0x945E,0x97C4,0x97C5,0x9800, + 0x9A56,0x9A59,0x9B1E,0x9B1F,0x9B20,0x9C52,0x9C58,0x9C50, + 0x9C4A,0x9C4D,0x9C4B,0x9C55,0x9C59,0x9C4C,0x9C4E,0x9DFB, + 0x9DF7,0x9DEF,0x9DE3,0x9DEB,0x9DF8,0x9DE4,0x9DF6,0x9DE1, + 0x9DEE,0x9DE6,0x9DF2,0x9DF0,0x9DE2,0x9DEC,0x9DF4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 113, Array index 0x5000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9DF3,0x9DE8,0x9DED,0x9EC2,0x9ED0,0x9EF2,0x9EF3, + 0x9F06,0x9F1C,0x9F38,0x9F37,0x9F36,0x9F43,0x9F4F,0x9F71, + 0x9F70,0x9F6E,0x9F6F,0x56D3,0x56CD,0x5B4E,0x5C6D,0x652D, + 0x66ED,0x66EE,0x6B13,0x705F,0x7061,0x705D,0x7060,0x7223, + 0x74DB,0x74E5,0x77D5,0x7938,0x79B7,0x79B6,0x7C6A,0x7E97, + 0x7F89,0x826D,0x8643,0x8838,0x8837,0x8835,0x884B,0x8B94, + 0x8B95,0x8E9E,0x8E9F,0x8EA0,0x8E9D,0x91BE,0x91BD,0x91C2, + 0x946B,0x9468,0x9469,0x96E5,0x9746,0x9743,0x9747,0x97C7, + 0x97E5,0x9A5E,0x9AD5,0x9B59,0x9C63,0x9C67,0x9C66,0x9C62, + 0x9C5E,0x9C60,0x9E02,0x9DFE,0x9E07,0x9E03,0x9E06,0x9E05, + 0x9E00,0x9E01,0x9E09,0x9DFF,0x9DFD,0x9E04,0x9EA0,0x9F1E, + 0x9F46,0x9F74,0x9F75,0x9F76,0x56D4,0x652E,0x65B8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 114, Array index 0x5100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B18,0x6B19,0x6B17,0x6B1A,0x7062,0x7226,0x72AA, + 0x77D8,0x77D9,0x7939,0x7C69,0x7C6B,0x7CF6,0x7E9A,0x7E98, + 0x7E9B,0x7E99,0x81E0,0x81E1,0x8646,0x8647,0x8648,0x8979, + 0x897A,0x897C,0x897B,0x89FF,0x8B98,0x8B99,0x8EA5,0x8EA4, + 0x8EA3,0x946E,0x946D,0x946F,0x9471,0x9473,0x9749,0x9872, + 0x995F,0x9C68,0x9C6E,0x9C6D,0x9E0B,0x9E0D,0x9E10,0x9E0F, + 0x9E12,0x9E11,0x9EA1,0x9EF5,0x9F09,0x9F47,0x9F78,0x9F7B, + 0x9F7A,0x9F79,0x571E,0x7066,0x7C6F,0x883C,0x8DB2,0x8EA6, + 0x91C3,0x9474,0x9478,0x9476,0x9475,0x9A60,0x9B2E,0x9C74, + 0x9C73,0x9C71,0x9C75,0x9E14,0x9E13,0x9EF6,0x9F0A,0x9FA4, + 0x7068,0x7065,0x7CF7,0x866A,0x883E,0x883D,0x883F,0x8B9E, + 0x8C9C,0x8EA9,0x8EC9,0x974B,0x9873,0x9874,0x98CC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 115, Array index 0x5200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9961,0x99AB,0x9A64,0x9A66,0x9A67,0x9B24,0x9E15, + 0x9E17,0x9F48,0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482, + 0x9480,0x9481,0x9A69,0x9A68,0x9E19,0x864B,0x8B9F,0x9483, + 0x9C79,0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D,0x7069,0x706A, + 0x7229,0x9EA4,0x9F7E,0x9F49,0x9F98,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE2 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit cns11643_plane2 -> UCS size-optimized table (15798 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_cns11643_plane2[] = +{ + 0x0052, /* Ranges number */ + 0x0000, /* Unranged codes number */ + 0x1EDB, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x2121, 0x217E, 0x00F9, + /* Array index: 0x0006 */ 0x2221, 0x227E, 0x0157, + /* Array index: 0x0009 */ 0x2321, 0x237E, 0x01B5, + /* Array index: 0x000C */ 0x2421, 0x247E, 0x0213, + /* Array index: 0x000F */ 0x2521, 0x257E, 0x0271, + /* Array index: 0x0012 */ 0x2621, 0x267E, 0x02CF, + /* Array index: 0x0015 */ 0x2721, 0x277E, 0x032D, + /* Array index: 0x0018 */ 0x2821, 0x287E, 0x038B, + /* Array index: 0x001B */ 0x2921, 0x297E, 0x03E9, + /* Array index: 0x001E */ 0x2A21, 0x2A7E, 0x0447, + /* Array index: 0x0021 */ 0x2B21, 0x2B7E, 0x04A5, + /* Array index: 0x0024 */ 0x2C21, 0x2C7E, 0x0503, + /* Array index: 0x0027 */ 0x2D21, 0x2D7E, 0x0561, + /* Array index: 0x002A */ 0x2E21, 0x2E7E, 0x05BF, + /* Array index: 0x002D */ 0x2F21, 0x2F7E, 0x061D, + /* Array index: 0x0030 */ 0x3021, 0x307E, 0x067B, + /* Array index: 0x0033 */ 0x3121, 0x317E, 0x06D9, + /* Array index: 0x0036 */ 0x3221, 0x327E, 0x0737, + /* Array index: 0x0039 */ 0x3321, 0x337E, 0x0795, + /* Array index: 0x003C */ 0x3421, 0x347E, 0x07F3, + /* Array index: 0x003F */ 0x3521, 0x357E, 0x0851, + /* Array index: 0x0042 */ 0x3621, 0x367E, 0x08AF, + /* Array index: 0x0045 */ 0x3721, 0x377E, 0x090D, + /* Array index: 0x0048 */ 0x3821, 0x387E, 0x096B, + /* Array index: 0x004B */ 0x3921, 0x397E, 0x09C9, + /* Array index: 0x004E */ 0x3A21, 0x3A7E, 0x0A27, + /* Array index: 0x0051 */ 0x3B21, 0x3B7E, 0x0A85, + /* Array index: 0x0054 */ 0x3C21, 0x3C7E, 0x0AE3, + /* Array index: 0x0057 */ 0x3D21, 0x3D7E, 0x0B41, + /* Array index: 0x005A */ 0x3E21, 0x3E7E, 0x0B9F, + /* Array index: 0x005D */ 0x3F21, 0x3F7E, 0x0BFD, + /* Array index: 0x0060 */ 0x4021, 0x407E, 0x0C5B, + /* Array index: 0x0063 */ 0x4121, 0x417E, 0x0CB9, + /* Array index: 0x0066 */ 0x4221, 0x427E, 0x0D17, + /* Array index: 0x0069 */ 0x4321, 0x437E, 0x0D75, + /* Array index: 0x006C */ 0x4421, 0x447E, 0x0DD3, + /* Array index: 0x006F */ 0x4521, 0x457E, 0x0E31, + /* Array index: 0x0072 */ 0x4621, 0x467E, 0x0E8F, + /* Array index: 0x0075 */ 0x4721, 0x477E, 0x0EED, + /* Array index: 0x0078 */ 0x4821, 0x487E, 0x0F4B, + /* Array index: 0x007B */ 0x4921, 0x497E, 0x0FA9, + /* Array index: 0x007E */ 0x4A21, 0x4A7E, 0x1007, + /* Array index: 0x0081 */ 0x4B21, 0x4B7E, 0x1065, + /* Array index: 0x0084 */ 0x4C21, 0x4C7E, 0x10C3, + /* Array index: 0x0087 */ 0x4D21, 0x4D7E, 0x1121, + /* Array index: 0x008A */ 0x4E21, 0x4E7E, 0x117F, + /* Array index: 0x008D */ 0x4F21, 0x4F7E, 0x11DD, + /* Array index: 0x0090 */ 0x5021, 0x507E, 0x123B, + /* Array index: 0x0093 */ 0x5121, 0x517E, 0x1299, + /* Array index: 0x0096 */ 0x5221, 0x527E, 0x12F7, + /* Array index: 0x0099 */ 0x5321, 0x537E, 0x1355, + /* Array index: 0x009C */ 0x5421, 0x547E, 0x13B3, + /* Array index: 0x009F */ 0x5521, 0x557E, 0x1411, + /* Array index: 0x00A2 */ 0x5621, 0x567E, 0x146F, + /* Array index: 0x00A5 */ 0x5721, 0x577E, 0x14CD, + /* Array index: 0x00A8 */ 0x5821, 0x587E, 0x152B, + /* Array index: 0x00AB */ 0x5921, 0x597E, 0x1589, + /* Array index: 0x00AE */ 0x5A21, 0x5A7E, 0x15E7, + /* Array index: 0x00B1 */ 0x5B21, 0x5B7E, 0x1645, + /* Array index: 0x00B4 */ 0x5C21, 0x5C7E, 0x16A3, + /* Array index: 0x00B7 */ 0x5D21, 0x5D7E, 0x1701, + /* Array index: 0x00BA */ 0x5E21, 0x5E7E, 0x175F, + /* Array index: 0x00BD */ 0x5F21, 0x5F7E, 0x17BD, + /* Array index: 0x00C0 */ 0x6021, 0x607E, 0x181B, + /* Array index: 0x00C3 */ 0x6121, 0x617E, 0x1879, + /* Array index: 0x00C6 */ 0x6221, 0x627E, 0x18D7, + /* Array index: 0x00C9 */ 0x6321, 0x637E, 0x1935, + /* Array index: 0x00CC */ 0x6421, 0x647E, 0x1993, + /* Array index: 0x00CF */ 0x6521, 0x657E, 0x19F1, + /* Array index: 0x00D2 */ 0x6621, 0x667E, 0x1A4F, + /* Array index: 0x00D5 */ 0x6721, 0x677E, 0x1AAD, + /* Array index: 0x00D8 */ 0x6821, 0x687E, 0x1B0B, + /* Array index: 0x00DB */ 0x6921, 0x697E, 0x1B69, + /* Array index: 0x00DE */ 0x6A21, 0x6A7E, 0x1BC7, + /* Array index: 0x00E1 */ 0x6B21, 0x6B7E, 0x1C25, + /* Array index: 0x00E4 */ 0x6C21, 0x6C7E, 0x1C83, + /* Array index: 0x00E7 */ 0x6D21, 0x6D7E, 0x1CE1, + /* Array index: 0x00EA */ 0x6E21, 0x6E7E, 0x1D3F, + /* Array index: 0x00ED */ 0x6F21, 0x6F7E, 0x1D9D, + /* Array index: 0x00F0 */ 0x7021, 0x707E, 0x1DFB, + /* Array index: 0x00F3 */ 0x7121, 0x717E, 0x1E59, + /* Array index: 0x00F6 */ 0x7221, 0x7244, 0x1EB7, + /* Ranges content */ + /* Range 0x2121 - 0x217E, array index: 0x00F9 */ + 0x4E42,0x4E5C,0x51F5,0x531A,0x5382,0x4E07,0x4E0C,0x4E47, + 0x4E8D,0x56D7,0x5C6E,0x5F73,0x4E0F,0x5187,0x4E0E,0x4E2E, + 0x4E93,0x4EC2,0x4EC9,0x4EC8,0x5198,0x52FC,0x536C,0x53B9, + 0x5720,0x5903,0x592C,0x5C10,0x5DFF,0x65E1,0x6BB3,0x6BCC, + 0x6C14,0x723F,0x4E31,0x4E3C,0x4EE8,0x4EDC,0x4EE9,0x4EE1, + 0x4EDD,0x4EDA,0x520C,0x5209,0x531C,0x534C,0x5722,0x5723, + 0x5917,0x592F,0x5B81,0x5B84,0x5C12,0x5C3B,0x5C74,0x5C73, + 0x5E04,0x5E80,0x5E82,0x5FC9,0x6209,0x6250,0x6C15,0x6C36, + 0x6C43,0x6C3F,0x6C3B,0x72AE,0x72B0,0x738A,0x79B8,0x808A, + 0x961E,0x4F0E,0x4F18,0x4F2C,0x4EF5,0x4F14,0x4EF1,0x4F00, + 0x4EF7,0x4F08,0x4F1D,0x4F02,0x4F05,0x4F22,0x4F13,0x4F04, + 0x4EF4,0x4F12,0x51B1,0x5213,0x5210,0x52A6, + /* Range 0x2221 - 0x227E, array index: 0x0157 */ + 0x5322,0x531F,0x534D,0x538A,0x5407,0x56E1,0x56DF,0x572E, + 0x572A,0x5734,0x593C,0x5980,0x597C,0x5985,0x597B,0x597E, + 0x5977,0x597F,0x5B56,0x5C15,0x5C25,0x5C7C,0x5C7A,0x5C7B, + 0x5C7E,0x5DDF,0x5E75,0x5E84,0x5F02,0x5F1A,0x5F74,0x5FD5, + 0x5FD4,0x5FCF,0x625C,0x625E,0x6264,0x6261,0x6266,0x6262, + 0x6259,0x6260,0x625A,0x6265,0x6537,0x65EF,0x65EE,0x673E, + 0x6739,0x6738,0x673B,0x673A,0x673F,0x673C,0x6733,0x6C18, + 0x6C46,0x6C52,0x6C5C,0x6C4F,0x6C4A,0x6C54,0x6C4B,0x6C4C, + 0x7071,0x725E,0x72B4,0x72B5,0x738E,0x752A,0x767F,0x7A75, + 0x7F51,0x8278,0x827C,0x8280,0x827D,0x827F,0x864D,0x897E, + 0x9099,0x9097,0x9098,0x909B,0x9094,0x9622,0x9624,0x9620, + 0x9623,0x4F56,0x4F3B,0x4F62,0x4F49,0x4F53, + /* Range 0x2321 - 0x237E, array index: 0x01B5 */ + 0x4F64,0x4F3E,0x4F67,0x4F52,0x4F5F,0x4F41,0x4F58,0x4F2D, + 0x4F33,0x4F3F,0x4F61,0x518F,0x51B9,0x521C,0x521E,0x5221, + 0x52AD,0x52AE,0x5309,0x5363,0x5372,0x538E,0x538F,0x5430, + 0x5437,0x542A,0x5454,0x5445,0x5419,0x541C,0x5425,0x5418, + 0x543D,0x544F,0x5441,0x5428,0x5424,0x5447,0x56EE,0x56E7, + 0x56E5,0x5741,0x5745,0x574C,0x5749,0x574B,0x5752,0x5906, + 0x5940,0x59A6,0x5998,0x59A0,0x5997,0x598E,0x59A2,0x5990, + 0x598F,0x59A7,0x59A1,0x5B8E,0x5B92,0x5C28,0x5C2A,0x5C8D, + 0x5C8F,0x5C88,0x5C8B,0x5C89,0x5C92,0x5C8A,0x5C86,0x5C93, + 0x5C95,0x5DE0,0x5E0A,0x5E0E,0x5E8B,0x5E89,0x5E8C,0x5E88, + 0x5E8D,0x5F05,0x5F1D,0x5F78,0x5F76,0x5FD2,0x5FD1,0x5FD0, + 0x5FED,0x5FE8,0x5FEE,0x5FF3,0x5FE1,0x5FE4, + /* Range 0x2421 - 0x247E, array index: 0x0213 */ + 0x5FE3,0x5FFA,0x5FEF,0x5FF7,0x5FFB,0x6000,0x5FF4,0x623A, + 0x6283,0x628C,0x628E,0x628F,0x6294,0x6287,0x6271,0x627B, + 0x627A,0x6270,0x6281,0x6288,0x6277,0x627D,0x6272,0x6274, + 0x65F0,0x65F4,0x65F3,0x65F2,0x65F5,0x6745,0x6747,0x6759, + 0x6755,0x674C,0x6748,0x675D,0x674D,0x675A,0x674B,0x6BD0, + 0x6C19,0x6C1A,0x6C78,0x6C67,0x6C6B,0x6C84,0x6C8B,0x6C8F, + 0x6C71,0x6C6F,0x6C69,0x6C9A,0x6C6D,0x6C87,0x6C95,0x6C9C, + 0x6C66,0x6C73,0x6C65,0x6C7B,0x6C8E,0x7074,0x707A,0x7263, + 0x72BF,0x72BD,0x72C3,0x72C6,0x72C1,0x72BA,0x72C5,0x7395, + 0x7397,0x7393,0x7394,0x7392,0x753A,0x7539,0x7594,0x7595, + 0x7681,0x793D,0x8034,0x8095,0x8099,0x8090,0x8092,0x809C, + 0x8290,0x828F,0x8285,0x828E,0x8291,0x8293, + /* Range 0x2521 - 0x257E, array index: 0x0271 */ + 0x828A,0x8283,0x8284,0x8C78,0x8FC9,0x8FBF,0x909F,0x90A1, + 0x90A5,0x909E,0x90A7,0x90A0,0x9630,0x9628,0x962F,0x962D, + 0x4E33,0x4F98,0x4F7C,0x4F85,0x4F7D,0x4F80,0x4F87,0x4F76, + 0x4F74,0x4F89,0x4F84,0x4F77,0x4F4C,0x4F97,0x4F6A,0x4F9A, + 0x4F79,0x4F81,0x4F78,0x4F90,0x4F9C,0x4F94,0x4F9E,0x4F92, + 0x4F82,0x4F95,0x4F6B,0x4F6E,0x519E,0x51BC,0x51BE,0x5235, + 0x5232,0x5233,0x5246,0x5231,0x52BC,0x530A,0x530B,0x533C, + 0x5392,0x5394,0x5487,0x547F,0x5481,0x5491,0x5482,0x5488, + 0x546B,0x547A,0x547E,0x5465,0x546C,0x5474,0x5466,0x548D, + 0x546F,0x5461,0x5460,0x5498,0x5463,0x5467,0x5464,0x56F7, + 0x56F9,0x576F,0x5772,0x576D,0x576B,0x5771,0x5770,0x5776, + 0x5780,0x5775,0x577B,0x5773,0x5774,0x5762, + /* Range 0x2621 - 0x267E, array index: 0x02CF */ + 0x5768,0x577D,0x590C,0x5945,0x59B5,0x59BA,0x59CF,0x59CE, + 0x59B2,0x59CC,0x59C1,0x59B6,0x59BC,0x59C3,0x59D6,0x59B1, + 0x59BD,0x59C0,0x59C8,0x59B4,0x59C7,0x5B62,0x5B65,0x5B93, + 0x5B95,0x5C44,0x5C47,0x5CAE,0x5CA4,0x5CA0,0x5CB5,0x5CAF, + 0x5CA8,0x5CAC,0x5C9F,0x5CA3,0x5CAD,0x5CA2,0x5CAA,0x5CA7, + 0x5C9D,0x5CA5,0x5CB6,0x5CB0,0x5CA6,0x5E17,0x5E14,0x5E19, + 0x5F28,0x5F22,0x5F23,0x5F24,0x5F54,0x5F82,0x5F7E,0x5F7D, + 0x5FDE,0x5FE5,0x602D,0x6026,0x6019,0x6032,0x600B,0x6034, + 0x600A,0x6017,0x6033,0x601A,0x601E,0x602C,0x6022,0x600D, + 0x6010,0x602E,0x6013,0x6011,0x600C,0x6009,0x601C,0x6214, + 0x623D,0x62AD,0x62B4,0x62D1,0x62BE,0x62AA,0x62B6,0x62CA, + 0x62AE,0x62B3,0x62AF,0x62BB,0x62A9,0x62B0, + /* Range 0x2721 - 0x277E, array index: 0x032D */ + 0x62B8,0x653D,0x65A8,0x65BB,0x6609,0x65FC,0x6604,0x6612, + 0x6608,0x65FB,0x6603,0x660B,0x660D,0x6605,0x65FD,0x6611, + 0x6610,0x66F6,0x670A,0x6785,0x676C,0x678E,0x6792,0x6776, + 0x677B,0x6798,0x6786,0x6784,0x6774,0x678D,0x678C,0x677A, + 0x679F,0x6791,0x6799,0x6783,0x677D,0x6781,0x6778,0x6779, + 0x6794,0x6B25,0x6B80,0x6B7E,0x6BDE,0x6C1D,0x6C93,0x6CEC, + 0x6CEB,0x6CEE,0x6CD9,0x6CB6,0x6CD4,0x6CAD,0x6CE7,0x6CB7, + 0x6CD0,0x6CC2,0x6CBA,0x6CC3,0x6CC6,0x6CED,0x6CF2,0x6CD2, + 0x6CDD,0x6CB4,0x6C8A,0x6C9D,0x6C80,0x6CDE,0x6CC0,0x6D30, + 0x6CCD,0x6CC7,0x6CB0,0x6CF9,0x6CCF,0x6CE9,0x6CD1,0x7094, + 0x7098,0x7085,0x7093,0x7086,0x7084,0x7091,0x7096,0x7082, + 0x709A,0x7083,0x726A,0x72D6,0x72CB,0x72D8, + /* Range 0x2821 - 0x287E, array index: 0x038B */ + 0x72C9,0x72DC,0x72D2,0x72D4,0x72DA,0x72CC,0x72D1,0x73A4, + 0x73A1,0x73AD,0x73A6,0x73A2,0x73A0,0x73AC,0x739D,0x74DD, + 0x74E8,0x753F,0x7540,0x753E,0x758C,0x7598,0x76AF,0x76F3, + 0x76F1,0x76F0,0x76F5,0x77F8,0x77FC,0x77F9,0x77FB,0x77FA, + 0x77F7,0x7942,0x793F,0x79C5,0x7A78,0x7A7B,0x7AFB,0x7C75, + 0x7CFD,0x8035,0x808F,0x80AE,0x80A3,0x80B8,0x80B5,0x80AD, + 0x8220,0x82A0,0x82C0,0x82AB,0x829A,0x8298,0x829B,0x82B5, + 0x82A7,0x82AE,0x82BC,0x829E,0x82BA,0x82B4,0x82A8,0x82A1, + 0x82A9,0x82C2,0x82A4,0x82C3,0x82B6,0x82A2,0x8670,0x866F, + 0x866D,0x866E,0x8C56,0x8FD2,0x8FCB,0x8FD3,0x8FCD,0x8FD6, + 0x8FD5,0x8FD7,0x90B2,0x90B4,0x90AF,0x90B3,0x90B0,0x9639, + 0x963D,0x963C,0x963A,0x9643,0x4FCD,0x4FC5, + /* Range 0x2921 - 0x297E, array index: 0x03E9 */ + 0x4FD3,0x4FB2,0x4FC9,0x4FCB,0x4FC1,0x4FD4,0x4FDC,0x4FD9, + 0x4FBB,0x4FB3,0x4FDB,0x4FC7,0x4FD6,0x4FBA,0x4FC0,0x4FB9, + 0x4FEC,0x5244,0x5249,0x52C0,0x52C2,0x533D,0x537C,0x5397, + 0x5396,0x5399,0x5398,0x54BA,0x54A1,0x54AD,0x54A5,0x54CF, + 0x54C3,0x830D,0x54B7,0x54AE,0x54D6,0x54B6,0x54C5,0x54C6, + 0x54A0,0x5470,0x54BC,0x54A2,0x54BE,0x5472,0x54DE,0x54B0, + 0x57B5,0x579E,0x579F,0x57A4,0x578C,0x5797,0x579D,0x579B, + 0x5794,0x5798,0x578F,0x5799,0x57A5,0x579A,0x5795,0x58F4, + 0x590D,0x5953,0x59E1,0x59DE,0x59EE,0x5A00,0x59F1,0x59DD, + 0x59FA,0x59FD,0x59FC,0x59F6,0x59E4,0x59F2,0x59F7,0x59DB, + 0x59E9,0x59F3,0x59F5,0x59E0,0x59FE,0x59F4,0x59ED,0x5BA8, + 0x5C4C,0x5CD0,0x5CD8,0x5CCC,0x5CD7,0x5CCB, + /* Range 0x2A21 - 0x2A7E, array index: 0x0447 */ + 0x5CDB,0x5CDE,0x5CDA,0x5CC9,0x5CC7,0x5CCA,0x5CD6,0x5CD3, + 0x5CD4,0x5CCF,0x5CC8,0x5CC6,0x5CCE,0x5CDF,0x5CF8,0x5DF9, + 0x5E21,0x5E22,0x5E23,0x5E20,0x5E24,0x5EB0,0x5EA4,0x5EA2, + 0x5E9B,0x5EA3,0x5EA5,0x5F07,0x5F2E,0x5F56,0x5F86,0x6037, + 0x6039,0x6054,0x6072,0x605E,0x6045,0x6053,0x6047,0x6049, + 0x605B,0x604C,0x6040,0x6042,0x605F,0x6024,0x6044,0x6058, + 0x6066,0x606E,0x6242,0x6243,0x62CF,0x630D,0x630B,0x62F5, + 0x630E,0x6303,0x62EB,0x62F9,0x630F,0x630C,0x62F8,0x62F6, + 0x6300,0x6313,0x6314,0x62FA,0x6315,0x62FB,0x62F0,0x6541, + 0x6543,0x65AA,0x65BF,0x6636,0x6621,0x6632,0x6635,0x661C, + 0x6626,0x6622,0x6633,0x662B,0x663A,0x661D,0x6634,0x6639, + 0x662E,0x670F,0x6710,0x67C1,0x67F2,0x67C8, + /* Range 0x2B21 - 0x2B7E, array index: 0x04A5 */ + 0x67BA,0x67DC,0x67BB,0x67F8,0x67D8,0x67C0,0x67B7,0x67C5, + 0x67EB,0x67E4,0x67DF,0x67B5,0x67CD,0x67B3,0x67F7,0x67F6, + 0x67EE,0x67E3,0x67C2,0x67B9,0x67CE,0x67E7,0x67F0,0x67B2, + 0x67FC,0x67C6,0x67ED,0x67CC,0x67AE,0x67E6,0x67DB,0x67FA, + 0x67C9,0x67CA,0x67C3,0x67EA,0x67CB,0x6B28,0x6B82,0x6B84, + 0x6BB6,0x6BD6,0x6BD8,0x6BE0,0x6C20,0x6C21,0x6D28,0x6D34, + 0x6D2D,0x6D1F,0x6D3C,0x6D3F,0x6D12,0x6D0A,0x6CDA,0x6D33, + 0x6D04,0x6D19,0x6D3A,0x6D1A,0x6D11,0x6D00,0x6D1D,0x6D42, + 0x6D01,0x6D18,0x6D37,0x6D03,0x6D0F,0x6D40,0x6D07,0x6D20, + 0x6D2C,0x6D08,0x6D22,0x6D09,0x6D10,0x70B7,0x709F,0x70BE, + 0x70B1,0x70B0,0x70A1,0x70B4,0x70B5,0x70A9,0x7241,0x7249, + 0x724A,0x726C,0x7270,0x7273,0x726E,0x72CA, + /* Range 0x2C21 - 0x2C7E, array index: 0x0503 */ + 0x72E4,0x72E8,0x72EB,0x72DF,0x72EA,0x72E6,0x72E3,0x7385, + 0x73CC,0x73C2,0x73C8,0x73C5,0x73B9,0x73B6,0x73B5,0x73B4, + 0x73EB,0x73BF,0x73C7,0x73BE,0x73C3,0x73C6,0x73B8,0x73CB, + 0x74EC,0x74EE,0x752E,0x7547,0x7548,0x75A7,0x75AA,0x7679, + 0x76C4,0x7708,0x7703,0x7704,0x7705,0x770A,0x76F7,0x76FB, + 0x76FA,0x77E7,0x77E8,0x7806,0x7811,0x7812,0x7805,0x7810, + 0x780F,0x780E,0x7809,0x7803,0x7813,0x794A,0x794C,0x794B, + 0x7945,0x7944,0x79D5,0x79CD,0x79CF,0x79D6,0x79CE,0x7A80, + 0x7A7E,0x7AD1,0x7B00,0x7B01,0x7C7A,0x7C78,0x7C79,0x7C7F, + 0x7C80,0x7C81,0x7D03,0x7D08,0x7D01,0x7F58,0x7F91,0x7F8D, + 0x7FBE,0x8007,0x800E,0x800F,0x8014,0x8037,0x80D8,0x80C7, + 0x80E0,0x80D1,0x80C8,0x80C2,0x80D0,0x80C5, + /* Range 0x2D21 - 0x2D7E, array index: 0x0561 */ + 0x80E3,0x80D9,0x80DC,0x80CA,0x80D5,0x80C9,0x80CF,0x80D7, + 0x80E6,0x80CD,0x81FF,0x8221,0x8294,0x82D9,0x82FE,0x82F9, + 0x8307,0x82E8,0x8300,0x82D5,0x833A,0x82EB,0x82D6,0x82F4, + 0x82EC,0x82E1,0x82F2,0x82F5,0x830C,0x82FB,0x82F6,0x82F0, + 0x82EA,0x82E4,0x82E0,0x82FA,0x82F3,0x82ED,0x8677,0x8674, + 0x867C,0x8673,0x8841,0x884E,0x8867,0x886A,0x8869,0x89D3, + 0x8A04,0x8A07,0x8D72,0x8FE3,0x8FE1,0x8FEE,0x8FE0,0x90F1, + 0x90BD,0x90BF,0x90D5,0x90C5,0x90BE,0x90C7,0x90CB,0x90C8, + 0x91D4,0x91D3,0x9654,0x964F,0x9651,0x9653,0x964A,0x964E, + 0x501E,0x5005,0x5007,0x5013,0x5022,0x5030,0x501B,0x4FF5, + 0x4FF4,0x5033,0x5037,0x502C,0x4FF6,0x4FF7,0x5017,0x501C, + 0x5020,0x5027,0x5035,0x502F,0x5031,0x500E, + /* Range 0x2E21 - 0x2E7E, array index: 0x05BF */ + 0x515A,0x5194,0x5193,0x51CA,0x51C4,0x51C5,0x51C8,0x51CE, + 0x5261,0x525A,0x5252,0x525E,0x525F,0x5255,0x5262,0x52CD, + 0x530E,0x539E,0x5526,0x54E2,0x5517,0x5512,0x54E7,0x54F3, + 0x54E4,0x551A,0x54FF,0x5504,0x5508,0x54EB,0x5511,0x5505, + 0x54F1,0x550A,0x54FB,0x54F7,0x54F8,0x54E0,0x550E,0x5503, + 0x550B,0x5701,0x5702,0x57CC,0x5832,0x57D5,0x57D2,0x57BA, + 0x57C6,0x57BD,0x57BC,0x57B8,0x57B6,0x57BF,0x57C7,0x57D0, + 0x57B9,0x57C1,0x590E,0x594A,0x5A19,0x5A16,0x5A2D,0x5A2E, + 0x5A15,0x5A0F,0x5A17,0x5A0A,0x5A1E,0x5A33,0x5B6C,0x5BA7, + 0x5BAD,0x5BAC,0x5C03,0x5C56,0x5C54,0x5CEC,0x5CFF,0x5CEE, + 0x5CF1,0x5CF7,0x5D00,0x5CF9,0x5E29,0x5E28,0x5EA8,0x5EAE, + 0x5EAA,0x5EAC,0x5F33,0x5F30,0x5F67,0x605D, + /* Range 0x2F21 - 0x2F7E, array index: 0x061D */ + 0x605A,0x6067,0x6041,0x60A2,0x6088,0x6080,0x6092,0x6081, + 0x609D,0x6083,0x6095,0x609B,0x6097,0x6087,0x609C,0x608E, + 0x6219,0x6246,0x62F2,0x6310,0x6356,0x632C,0x6344,0x6345, + 0x6336,0x6343,0x63E4,0x6339,0x634B,0x634A,0x633C,0x6329, + 0x6341,0x6334,0x6358,0x6354,0x6359,0x632D,0x6347,0x6333, + 0x635A,0x6351,0x6338,0x6357,0x6340,0x6348,0x654A,0x6546, + 0x65C6,0x65C3,0x65C4,0x65C2,0x664A,0x665F,0x6647,0x6651, + 0x6712,0x6713,0x681F,0x681A,0x6849,0x6832,0x6833,0x683B, + 0x684B,0x684F,0x6816,0x6831,0x681C,0x6835,0x682B,0x682D, + 0x682F,0x684E,0x6844,0x6834,0x681D,0x6812,0x6814,0x6826, + 0x6828,0x682E,0x684D,0x683A,0x6825,0x6820,0x6B2C,0x6B2F, + 0x6B2D,0x6B31,0x6B34,0x6B6D,0x8082,0x6B88, + /* Range 0x3021 - 0x307E, array index: 0x067B */ + 0x6BE6,0x6BE4,0x6BE8,0x6BE3,0x6BE2,0x6BE7,0x6C25,0x6D7A, + 0x6D63,0x6D64,0x6D76,0x6D0D,0x6D61,0x6D92,0x6D58,0x6D62, + 0x6D6D,0x6D6F,0x6D91,0x6D8D,0x6DEF,0x6D7F,0x6D86,0x6D5E, + 0x6D67,0x6D60,0x6D97,0x6D70,0x6D7C,0x6D5F,0x6D82,0x6D98, + 0x6D2F,0x6D68,0x6D8B,0x6D7E,0x6D80,0x6D84,0x6D16,0x6D83, + 0x6D7B,0x6D7D,0x6D75,0x6D90,0x70DC,0x70D3,0x70D1,0x70DD, + 0x70CB,0x7F39,0x70E2,0x70D7,0x70D2,0x70DE,0x70E0,0x70D4, + 0x70CD,0x70C5,0x70C6,0x70C7,0x70DA,0x70CE,0x70E1,0x7242, + 0x7278,0x7277,0x7276,0x7300,0x72FA,0x72F4,0x72FE,0x72F6, + 0x72F3,0x72FB,0x7301,0x73D3,0x73D9,0x73E5,0x73D6,0x73BC, + 0x73E7,0x73E3,0x73E9,0x73DC,0x73D2,0x73DB,0x73D4,0x73DD, + 0x73DA,0x73D7,0x73D8,0x73E8,0x74DE,0x74DF, + /* Range 0x3121 - 0x317E, array index: 0x06D9 */ + 0x74F4,0x74F5,0x7521,0x755B,0x755F,0x75B0,0x75C1,0x75BB, + 0x75C4,0x75C0,0x75BF,0x75B6,0x75BA,0x768A,0x76C9,0x771D, + 0x771B,0x7710,0x7713,0x7712,0x7723,0x7711,0x7715,0x7719, + 0x771A,0x7722,0x7727,0x7823,0x782C,0x7822,0x7835,0x782F, + 0x7828,0x782E,0x782B,0x7821,0x7829,0x7833,0x782A,0x7831, + 0x7954,0x795B,0x794F,0x795C,0x7953,0x7952,0x7951,0x79EB, + 0x79EC,0x79E0,0x79EE,0x79ED,0x79EA,0x79DC,0x79DE,0x79DD, + 0x7A86,0x7A89,0x7A85,0x7A8B,0x7A8C,0x7A8A,0x7A87,0x7AD8, + 0x7B10,0x7B04,0x7B13,0x7B05,0x7B0F,0x7B08,0x7B0A,0x7B0E, + 0x7B09,0x7B12,0x7C84,0x7C91,0x7C8A,0x7C8C,0x7C88,0x7C8D, + 0x7C85,0x7D1E,0x7D1D,0x7D11,0x7D0E,0x7D18,0x7D16,0x7D13, + 0x7D1F,0x7D12,0x7D0F,0x7D0C,0x7F5C,0x7F61, + /* Range 0x3221 - 0x327E, array index: 0x0737 */ + 0x7F5E,0x7F60,0x7F5D,0x7F5B,0x7F96,0x7F92,0x7FC3,0x7FC2, + 0x7FC0,0x8016,0x803E,0x8039,0x80FA,0x80F2,0x80F9,0x80F5, + 0x8101,0x80FB,0x8100,0x8201,0x822F,0x8225,0x8333,0x832D, + 0x8344,0x8319,0x8351,0x8325,0x8356,0x833F,0x8341,0x8326, + 0x831C,0x8322,0x8342,0x834E,0x831B,0x832A,0x8308,0x833C, + 0x834D,0x8316,0x8324,0x8320,0x8337,0x832F,0x8329,0x8347, + 0x8345,0x834C,0x8353,0x831E,0x832C,0x834B,0x8327,0x8348, + 0x8653,0x8652,0x86A2,0x86A8,0x8696,0x868D,0x8691,0x869E, + 0x8687,0x8697,0x8686,0x868B,0x869A,0x8685,0x86A5,0x8699, + 0x86A1,0x86A7,0x8695,0x8698,0x868E,0x869D,0x8690,0x8694, + 0x8843,0x8844,0x886D,0x8875,0x8876,0x8872,0x8880,0x8871, + 0x887F,0x886F,0x8883,0x887E,0x8874,0x887C, + /* Range 0x3321 - 0x337E, array index: 0x0795 */ + 0x8A12,0x8C47,0x8C57,0x8C7B,0x8CA4,0x8CA3,0x8D76,0x8D78, + 0x8DB5,0x8DB7,0x8DB6,0x8ED1,0x8ED3,0x8FFE,0x8FF5,0x9002, + 0x8FFF,0x8FFB,0x9004,0x8FFC,0x8FF6,0x90D6,0x90E0,0x90D9, + 0x90DA,0x90E3,0x90DF,0x90E5,0x90D8,0x90DB,0x90D7,0x90DC, + 0x90E4,0x9150,0x914E,0x914F,0x91D5,0x91E2,0x91DA,0x965C, + 0x965F,0x96BC,0x98E3,0x9ADF,0x9B2F,0x4E7F,0x5070,0x506A, + 0x5061,0x505E,0x5060,0x5053,0x504B,0x505D,0x5072,0x5048, + 0x504D,0x5041,0x505B,0x504A,0x5062,0x5015,0x5045,0x505F, + 0x5069,0x506B,0x5063,0x5064,0x5046,0x5040,0x506E,0x5073, + 0x5057,0x5051,0x51D0,0x526B,0x526D,0x526C,0x526E,0x52D6, + 0x52D3,0x532D,0x539C,0x5575,0x5576,0x553C,0x554D,0x5550, + 0x5534,0x552A,0x5551,0x5562,0x5536,0x5535, + /* Range 0x3421 - 0x347E, array index: 0x07F3 */ + 0x5530,0x5552,0x5545,0x550C,0x5532,0x5565,0x554E,0x5539, + 0x5548,0x552D,0x553B,0x5540,0x554B,0x570A,0x5707,0x57FB, + 0x5814,0x57E2,0x57F6,0x57DC,0x57F4,0x5800,0x57ED,0x57FD, + 0x5808,0x57F8,0x580B,0x57F3,0x57CF,0x5807,0x57EE,0x57E3, + 0x57F2,0x57E5,0x57EC,0x57E1,0x580E,0x57FC,0x5810,0x57E7, + 0x5801,0x580C,0x57F1,0x57E9,0x57F0,0x580D,0x5804,0x595C, + 0x5A60,0x5A58,0x5A55,0x5A67,0x5A5E,0x5A38,0x5A35,0x5A6D, + 0x5A50,0x5A5F,0x5A65,0x5A6C,0x5A53,0x5A64,0x5A57,0x5A43, + 0x5A5D,0x5A52,0x5A44,0x5A5B,0x5A48,0x5A8E,0x5A3E,0x5A4D, + 0x5A39,0x5A4C,0x5A70,0x5A69,0x5A47,0x5A51,0x5A56,0x5A42, + 0x5A5C,0x5B72,0x5B6E,0x5BC1,0x5BC0,0x5C59,0x5D1E,0x5D0B, + 0x5D1D,0x5D1A,0x5D20,0x5D0C,0x5D28,0x5D0D, + /* Range 0x3521 - 0x357E, array index: 0x0851 */ + 0x5D26,0x5D25,0x5D0F,0x5D30,0x5D12,0x5D23,0x5D1F,0x5D2E, + 0x5E3E,0x5E34,0x5EB1,0x5EB4,0x5EB9,0x5EB2,0x5EB3,0x5F36, + 0x5F38,0x5F9B,0x5F96,0x5F9F,0x608A,0x6090,0x6086,0x60BE, + 0x60B0,0x60BA,0x60D3,0x60D4,0x60CF,0x60E4,0x60D9,0x60DD, + 0x60C8,0x60B1,0x60DB,0x60B7,0x60CA,0x60BF,0x60C3,0x60CD, + 0x60C0,0x6332,0x6365,0x638A,0x6382,0x637D,0x63BD,0x639E, + 0x63AD,0x639D,0x6397,0x63AB,0x638E,0x636F,0x6387,0x6390, + 0x636E,0x63AF,0x6375,0x639C,0x636D,0x63AE,0x637C,0x63A4, + 0x633B,0x639F,0x6378,0x6385,0x6381,0x6391,0x638D,0x6370, + 0x6553,0x65CD,0x6665,0x6661,0x665B,0x6659,0x665C,0x6662, + 0x6718,0x6879,0x6887,0x6890,0x689C,0x686D,0x686E,0x68AE, + 0x68AB,0x6956,0x686F,0x68A3,0x68AC,0x68A9, + /* Range 0x3621 - 0x367E, array index: 0x08AF */ + 0x6875,0x6874,0x68B2,0x688F,0x6877,0x6892,0x687C,0x686B, + 0x6872,0x68AA,0x6880,0x6871,0x687E,0x689B,0x6896,0x688B, + 0x68A0,0x6889,0x68A4,0x6878,0x687B,0x6891,0x688C,0x688A, + 0x687D,0x6B36,0x6B33,0x6B37,0x6B38,0x6B91,0x6B8F,0x6B8D, + 0x6B8E,0x6B8C,0x6C2A,0x6DC0,0x6DAB,0x6DB4,0x6DB3,0x6E74, + 0x6DAC,0x6DE9,0x6DE2,0x6DB7,0x6DF6,0x6DD4,0x6E00,0x6DC8, + 0x6DE0,0x6DDF,0x6DD6,0x6DBE,0x6DE5,0x6DDC,0x6DDD,0x6DDB, + 0x6DF4,0x6DCA,0x6DBD,0x6DED,0x6DF0,0x6DBA,0x6DD5,0x6DC2, + 0x6DCF,0x6DC9,0x6DD0,0x6DF2,0x6DD3,0x6DFD,0x6DD7,0x6DCD, + 0x6DE3,0x6DBB,0x70FA,0x710D,0x70F7,0x7117,0x70F4,0x710C, + 0x70F0,0x7104,0x70F3,0x7110,0x70FC,0x70FF,0x7106,0x7113, + 0x7100,0x70F8,0x70F6,0x710B,0x7102,0x710E, + /* Range 0x3721 - 0x377E, array index: 0x090D */ + 0x727E,0x727B,0x727C,0x727F,0x731D,0x7317,0x7307,0x7311, + 0x7318,0x730A,0x7308,0x72FF,0x730F,0x731E,0x7388,0x73F6, + 0x73F8,0x73F5,0x7404,0x7401,0x73FD,0x7407,0x7400,0x73FA, + 0x73FC,0x73FF,0x740C,0x740B,0x73F4,0x7408,0x7564,0x7563, + 0x75CE,0x75D2,0x75CF,0x75CB,0x75CC,0x75D1,0x75D0,0x768F, + 0x7689,0x76D3,0x7739,0x772F,0x772D,0x7731,0x7732,0x7734, + 0x7733,0x773D,0x7725,0x773B,0x7735,0x7848,0x7852,0x7849, + 0x784D,0x784A,0x784C,0x7826,0x7845,0x7850,0x7964,0x7967, + 0x7969,0x796A,0x7963,0x796B,0x7961,0x79BB,0x79FA,0x79F8, + 0x79F6,0x79F7,0x7A8F,0x7A94,0x7A90,0x7B35,0x7B3B,0x7B34, + 0x7B25,0x7B30,0x7B22,0x7B24,0x7B33,0x7B18,0x7B2A,0x7B1D, + 0x7B31,0x7B2B,0x7B2D,0x7B2F,0x7B32,0x7B38, + /* Range 0x3821 - 0x387E, array index: 0x096B */ + 0x7B1A,0x7B23,0x7C94,0x7C98,0x7C96,0x7CA3,0x7D35,0x7D3D, + 0x7D38,0x7D36,0x7D3A,0x7D45,0x7D2C,0x7D29,0x7D41,0x7D47, + 0x7D3E,0x7D3F,0x7D4A,0x7D3B,0x7D28,0x7F63,0x7F95,0x7F9C, + 0x7F9D,0x7F9B,0x7FCA,0x7FCB,0x7FCD,0x7FD0,0x7FD1,0x7FC7, + 0x7FCF,0x7FC9,0x801F,0x801E,0x801B,0x8047,0x8043,0x8048, + 0x8118,0x8125,0x8119,0x811B,0x812D,0x811F,0x812C,0x811E, + 0x8121,0x8115,0x8127,0x811D,0x8122,0x8211,0x8238,0x8233, + 0x823A,0x8234,0x8232,0x8274,0x8390,0x83A3,0x83A8,0x838D, + 0x837A,0x8373,0x83A4,0x8374,0x838F,0x8381,0x8395,0x8399, + 0x8375,0x8394,0x83A9,0x837D,0x8383,0x838C,0x839D,0x839B, + 0x83AA,0x838B,0x837E,0x83A5,0x83AF,0x8388,0x8397,0x83B0, + 0x837F,0x83A6,0x8387,0x83AE,0x8376,0x8659, + /* Range 0x3921 - 0x397E, array index: 0x09C9 */ + 0x8656,0x86BF,0x86B7,0x86C2,0x86C1,0x86C5,0x86BA,0x86B0, + 0x86C8,0x86B9,0x86B3,0x86B8,0x86CC,0x86B4,0x86BB,0x86BC, + 0x86C3,0x86BD,0x86BE,0x8852,0x8889,0x8895,0x88A8,0x88A2, + 0x88AA,0x889A,0x8891,0x88A1,0x889F,0x8898,0x88A7,0x8899, + 0x889B,0x8897,0x88A4,0x88AC,0x888C,0x8893,0x888E,0x8982, + 0x89D6,0x89D9,0x89D5,0x8A30,0x8A27,0x8A2C,0x8A1E,0x8C39, + 0x8C3B,0x8C5C,0x8C5D,0x8C7D,0x8CA5,0x8D7D,0x8D7B,0x8D79, + 0x8DBC,0x8DC2,0x8DB9,0x8DBF,0x8DC1,0x8ED8,0x8EDE,0x8EDD, + 0x8EDC,0x8ED7,0x8EE0,0x8EE1,0x9024,0x900B,0x9011,0x901C, + 0x900C,0x9021,0x90EF,0x90EA,0x90F0,0x90F4,0x90F2,0x90F3, + 0x90D4,0x90EB,0x90EC,0x90E9,0x9156,0x9158,0x915A,0x9153, + 0x9155,0x91EC,0x91F4,0x91F1,0x91F3,0x91F8, + /* Range 0x3A21 - 0x3A7E, array index: 0x0A27 */ + 0x91E4,0x91F9,0x91EA,0x91EB,0x91F7,0x91E8,0x91EE,0x957A, + 0x9586,0x9588,0x967C,0x966D,0x966B,0x9671,0x966F,0x96BF, + 0x976A,0x9804,0x98E5,0x9997,0x509B,0x5095,0x5094,0x509E, + 0x508B,0x50A3,0x5083,0x508C,0x508E,0x509D,0x5068,0x509C, + 0x5092,0x5082,0x5087,0x515F,0x51D4,0x5312,0x5311,0x53A4, + 0x53A7,0x5591,0x55A8,0x55A5,0x55AD,0x5577,0x5645,0x55A2, + 0x5593,0x5588,0x558F,0x55B5,0x5581,0x55A3,0x5592,0x55A4, + 0x557D,0x558C,0x55A6,0x557F,0x5595,0x55A1,0x558E,0x570C, + 0x5829,0x5837,0x5819,0x581E,0x5827,0x5823,0x5828,0x57F5, + 0x5848,0x5825,0x581C,0x581B,0x5833,0x583F,0x5836,0x582E, + 0x5839,0x5838,0x582D,0x582C,0x583B,0x5961,0x5AAF,0x5A94, + 0x5A9F,0x5A7A,0x5AA2,0x5A9E,0x5A78,0x5AA6, + /* Range 0x3B21 - 0x3B7E, array index: 0x0A85 */ + 0x5A7C,0x5AA5,0x5AAC,0x5A95,0x5AAE,0x5A37,0x5A84,0x5A8A, + 0x5A97,0x5A83,0x5A8B,0x5AA9,0x5A7B,0x5A7D,0x5A8C,0x5A9C, + 0x5A8F,0x5A93,0x5A9D,0x5BEA,0x5BCD,0x5BCB,0x5BD4,0x5BD1, + 0x5BCA,0x5BCE,0x5C0C,0x5C30,0x5D37,0x5D43,0x5D6B,0x5D41, + 0x5D4B,0x5D3F,0x5D35,0x5D51,0x5D4E,0x5D55,0x5D33,0x5D3A, + 0x5D52,0x5D3D,0x5D31,0x5D59,0x5D42,0x5D39,0x5D49,0x5D38, + 0x5D3C,0x5D32,0x5D36,0x5D40,0x5D45,0x5E44,0x5E41,0x5F58, + 0x5FA6,0x5FA5,0x5FAB,0x60C9,0x60B9,0x60CC,0x60E2,0x60CE, + 0x60C4,0x6114,0x60F2,0x610A,0x6116,0x6105,0x60F5,0x6113, + 0x60F8,0x60FC,0x60FE,0x60C1,0x6103,0x6118,0x611D,0x6110, + 0x60FF,0x6104,0x610B,0x624A,0x6394,0x63B1,0x63B0,0x63CE, + 0x63E5,0x63E8,0x63EF,0x63C3,0x649D,0x63F3, + /* Range 0x3C21 - 0x3C7E, array index: 0x0AE3 */ + 0x63CA,0x63E0,0x63F6,0x63D5,0x63F2,0x63F5,0x6461,0x63DF, + 0x63BE,0x63DD,0x63DC,0x63C4,0x63D8,0x63D3,0x63C2,0x63C7, + 0x63CC,0x63CB,0x63C8,0x63F0,0x63D7,0x63D9,0x6532,0x6567, + 0x656A,0x6564,0x655C,0x6568,0x6565,0x658C,0x659D,0x659E, + 0x65AE,0x65D0,0x65D2,0x667C,0x666C,0x667B,0x6680,0x6671, + 0x6679,0x666A,0x6672,0x6701,0x690C,0x68D3,0x6904,0x68DC, + 0x692A,0x68EC,0x68EA,0x68F1,0x690F,0x68D6,0x68F7,0x68EB, + 0x68E4,0x68F6,0x6913,0x6910,0x68F3,0x68E1,0x6907,0x68CC, + 0x6908,0x6970,0x68B4,0x6911,0x68EF,0x68C6,0x6914,0x68F8, + 0x68D0,0x68FD,0x68FC,0x68E8,0x690B,0x690A,0x6917,0x68CE, + 0x68C8,0x68DD,0x68DE,0x68E6,0x68F4,0x68D1,0x6906,0x68D4, + 0x68E9,0x6915,0x6925,0x68C7,0x6B39,0x6B3B, + /* Range 0x3D21 - 0x3D7E, array index: 0x0B41 */ + 0x6B3F,0x6B3C,0x6B94,0x6B97,0x6B99,0x6B95,0x6BBD,0x6BF0, + 0x6BF2,0x6BF3,0x6C30,0x6DFC,0x6E46,0x6E47,0x6E1F,0x6E49, + 0x6E88,0x6E3C,0x6E3D,0x6E45,0x6E62,0x6E2B,0x6E3F,0x6E41, + 0x6E5D,0x6E73,0x6E1C,0x6E33,0x6E4B,0x6E40,0x6E51,0x6E3B, + 0x6E03,0x6E2E,0x6E5E,0x6E68,0x6E5C,0x6E61,0x6E31,0x6E28, + 0x6E60,0x6E71,0x6E6B,0x6E39,0x6E22,0x6E30,0x6E53,0x6E65, + 0x6E27,0x6E78,0x6E64,0x6E77,0x6E55,0x6E79,0x6E52,0x6E66, + 0x6E35,0x6E36,0x6E5A,0x7120,0x711E,0x712F,0x70FB,0x712E, + 0x7131,0x7123,0x7125,0x7122,0x7132,0x711F,0x7128,0x713A, + 0x711B,0x724B,0x725A,0x7288,0x7289,0x7286,0x7285,0x728B, + 0x7312,0x730B,0x7330,0x7322,0x7331,0x7333,0x7327,0x7332, + 0x732D,0x7326,0x7323,0x7335,0x730C,0x742E, + /* Range 0x3E21 - 0x3E7E, array index: 0x0B9F */ + 0x742C,0x7430,0x742B,0x7416,0x741A,0x7421,0x742D,0x7431, + 0x7424,0x7423,0x741D,0x7429,0x7420,0x7432,0x74FB,0x752F, + 0x756F,0x756C,0x75E7,0x75DA,0x75E1,0x75E6,0x75DD,0x75DF, + 0x75E4,0x75D7,0x7695,0x7692,0x76DA,0x7746,0x7747,0x7744, + 0x774D,0x7745,0x774A,0x774E,0x774B,0x774C,0x77DE,0x77EC, + 0x7860,0x7864,0x7865,0x785C,0x786D,0x7871,0x786A,0x786E, + 0x7870,0x7869,0x7868,0x785E,0x7862,0x7974,0x7973,0x7972, + 0x7970,0x7A02,0x7A0A,0x7A03,0x7A0C,0x7A04,0x7A99,0x7AE6, + 0x7AE4,0x7B4A,0x7B47,0x7B44,0x7B48,0x7B4C,0x7B4E,0x7B40, + 0x7B58,0x7B45,0x7CA2,0x7C9E,0x7CA8,0x7CA1,0x7D58,0x7D6F, + 0x7D63,0x7D53,0x7D56,0x7D67,0x7D6A,0x7D4F,0x7D6D,0x7D5C, + 0x7D6B,0x7D52,0x7D54,0x7D69,0x7D51,0x7D5F, + /* Range 0x3F21 - 0x3F7E, array index: 0x0BFD */ + 0x7D4E,0x7F3E,0x7F3F,0x7F65,0x7F66,0x7FA2,0x7FA0,0x7FA1, + 0x7FD7,0x8051,0x804F,0x8050,0x80FE,0x80D4,0x8143,0x814A, + 0x8152,0x814F,0x8147,0x813D,0x814D,0x813A,0x81E6,0x81EE, + 0x81F7,0x81F8,0x81F9,0x8204,0x823C,0x823D,0x823F,0x8275, + 0x833B,0x83CF,0x83F9,0x8423,0x83C0,0x83E8,0x8412,0x83E7, + 0x83E4,0x83FC,0x83F6,0x8410,0x83C6,0x83C8,0x83EB,0x83E3, + 0x83BF,0x8401,0x83DD,0x83E5,0x83D8,0x83FF,0x83E1,0x83CB, + 0x83CE,0x83D6,0x83F5,0x83C9,0x8409,0x840F,0x83DE,0x8411, + 0x8406,0x83C2,0x83F3,0x83D5,0x83FA,0x83C7,0x83D1,0x83EA, + 0x8413,0x839A,0x83C3,0x83EC,0x83EE,0x83C4,0x83FB,0x83D7, + 0x83E2,0x841B,0x83DB,0x83FE,0x86D8,0x86E2,0x86E6,0x86D3, + 0x86E3,0x86DA,0x86EA,0x86DD,0x86EB,0x86DC, + /* Range 0x4021 - 0x407E, array index: 0x0C5B */ + 0x86EC,0x86E9,0x86D7,0x86E8,0x86D1,0x8848,0x8856,0x8855, + 0x88BA,0x88D7,0x88B9,0x88B8,0x88C0,0x88BE,0x88B6,0x88BC, + 0x88B7,0x88BD,0x88B2,0x8901,0x88C9,0x8995,0x8998,0x8997, + 0x89DD,0x89DA,0x89DB,0x8A4E,0x8A4D,0x8A39,0x8A59,0x8A40, + 0x8A57,0x8A58,0x8A44,0x8A45,0x8A52,0x8A48,0x8A51,0x8A4A, + 0x8A4C,0x8A4F,0x8C5F,0x8C81,0x8C80,0x8CBA,0x8CBE,0x8CB0, + 0x8CB9,0x8CB5,0x8D84,0x8D80,0x8D89,0x8DD8,0x8DD3,0x8DCD, + 0x8DC7,0x8DD6,0x8DDC,0x8DCF,0x8DD5,0x8DD9,0x8DC8,0x8DD7, + 0x8DC5,0x8EEF,0x8EF7,0x8EFA,0x8EF9,0x8EE6,0x8EEE,0x8EE5, + 0x8EF5,0x8EE7,0x8EE8,0x8EF6,0x8EEB,0x8EF1,0x8EEC,0x8EF4, + 0x8EE9,0x902D,0x9034,0x902F,0x9106,0x912C,0x9104,0x90FF, + 0x90FC,0x9108,0x90F9,0x90FB,0x9101,0x9100, + /* Range 0x4121 - 0x417E, array index: 0x0CB9 */ + 0x9107,0x9105,0x9103,0x9161,0x9164,0x915F,0x9162,0x9160, + 0x9201,0x920A,0x9225,0x9203,0x921A,0x9226,0x920F,0x920C, + 0x9200,0x9212,0x91FF,0x91FD,0x9206,0x9204,0x9227,0x9202, + 0x921C,0x9224,0x9219,0x9217,0x9205,0x9216,0x957B,0x958D, + 0x958C,0x9590,0x9687,0x967E,0x9688,0x9689,0x9683,0x9680, + 0x96C2,0x96C8,0x96C3,0x96F1,0x96F0,0x976C,0x9770,0x976E, + 0x9807,0x98A9,0x98EB,0x9CE6,0x9EF9,0x4E83,0x4E84,0x4EB6, + 0x50BD,0x50BF,0x50C6,0x50AE,0x50C4,0x50CA,0x50B4,0x50C8, + 0x50C2,0x50B0,0x50C1,0x50BA,0x50B1,0x50CB,0x50C9,0x50B6, + 0x50B8,0x51D7,0x527A,0x5278,0x527B,0x527C,0x55C3,0x55DB, + 0x55CC,0x55D0,0x55CB,0x55CA,0x55DD,0x55C0,0x55D4,0x55C4, + 0x55E9,0x55BF,0x55D2,0x558D,0x55CF,0x55D5, + /* Range 0x4221 - 0x427E, array index: 0x0D17 */ + 0x55E2,0x55D6,0x55C8,0x55F2,0x55CD,0x55D9,0x55C2,0x5714, + 0x5853,0x5868,0x5864,0x584F,0x584D,0x5849,0x586F,0x5855, + 0x584E,0x585D,0x5859,0x5865,0x585B,0x583D,0x5863,0x5871, + 0x58FC,0x5AC7,0x5AC4,0x5ACB,0x5ABA,0x5AB8,0x5AB1,0x5AB5, + 0x5AB0,0x5ABF,0x5AC8,0x5ABB,0x5AC6,0x5AB7,0x5AC0,0x5ACA, + 0x5AB4,0x5AB6,0x5ACD,0x5AB9,0x5A90,0x5BD6,0x5BD8,0x5BD9, + 0x5C1F,0x5C33,0x5D71,0x5D63,0x5D4A,0x5D65,0x5D72,0x5D6C, + 0x5D5E,0x5D68,0x5D67,0x5D62,0x5DF0,0x5E4F,0x5E4E,0x5E4A, + 0x5E4D,0x5E4B,0x5EC5,0x5ECC,0x5EC6,0x5ECB,0x5EC7,0x5F40, + 0x5FAF,0x5FAD,0x60F7,0x6149,0x614A,0x612B,0x6145,0x6136, + 0x6132,0x612E,0x6146,0x612F,0x614F,0x6129,0x6140,0x6220, + 0x9168,0x6223,0x6225,0x6224,0x63C5,0x63F1, + /* Range 0x4321 - 0x437E, array index: 0x0D75 */ + 0x63EB,0x6410,0x6412,0x6409,0x6420,0x6424,0x6433,0x6443, + 0x641F,0x6415,0x6418,0x6439,0x6437,0x6422,0x6423,0x640C, + 0x6426,0x6430,0x6428,0x6441,0x6435,0x642F,0x640A,0x641A, + 0x6440,0x6425,0x6427,0x640B,0x63E7,0x641B,0x642E,0x6421, + 0x640E,0x656F,0x6592,0x65D3,0x6686,0x668C,0x6695,0x6690, + 0x668B,0x668A,0x6699,0x6694,0x6678,0x6720,0x6966,0x695F, + 0x6938,0x694E,0x6962,0x6971,0x693F,0x6945,0x696A,0x6939, + 0x6942,0x6957,0x6959,0x697A,0x6948,0x6949,0x6935,0x696C, + 0x6933,0x693D,0x6965,0x68F0,0x6978,0x6934,0x6969,0x6940, + 0x696F,0x6944,0x6976,0x6958,0x6941,0x6974,0x694C,0x693B, + 0x694B,0x6937,0x695C,0x694F,0x6951,0x6932,0x6952,0x692F, + 0x697B,0x693C,0x6B46,0x6B45,0x6B43,0x6B42, + /* Range 0x4421 - 0x447E, array index: 0x0DD3 */ + 0x6B48,0x6B41,0x6B9B,0x6BFB,0x6BFC,0x6BF9,0x6BF7,0x6BF8, + 0x6E9B,0x6ED6,0x6EC8,0x6E8F,0x6EC0,0x6E9F,0x6E93,0x6E94, + 0x6EA0,0x6EB1,0x6EB9,0x6EC6,0x6ED2,0x6EBD,0x6EC1,0x6E9E, + 0x6EC9,0x6EB7,0x6EB0,0x6ECD,0x6EA6,0x6ECF,0x6EB2,0x6EBE, + 0x6EC3,0x6EDC,0x6ED8,0x6E99,0x6E92,0x6E8E,0x6E8D,0x6EA4, + 0x6EA1,0x6EBF,0x6EB3,0x6ED0,0x6ECA,0x6E97,0x6EAE,0x6EA3, + 0x7147,0x7154,0x7152,0x7163,0x7160,0x7141,0x715D,0x7162, + 0x7172,0x7178,0x716A,0x7161,0x7142,0x7158,0x7143,0x714B, + 0x7170,0x715F,0x7150,0x7153,0x7144,0x714D,0x715A,0x724F, + 0x728D,0x728C,0x7291,0x7290,0x728E,0x733C,0x7342,0x733B, + 0x733A,0x7340,0x734A,0x7349,0x7444,0x744A,0x744B,0x7452, + 0x7451,0x7457,0x7440,0x744F,0x7450,0x744E, + /* Range 0x4521 - 0x457E, array index: 0x0E31 */ + 0x7442,0x7446,0x744D,0x7454,0x74E1,0x74FF,0x74FE,0x74FD, + 0x751D,0x7579,0x7577,0x6983,0x75EF,0x760F,0x7603,0x75F7, + 0x75FE,0x75FC,0x75F9,0x75F8,0x7610,0x75FB,0x75F6,0x75ED, + 0x75F5,0x75FD,0x7699,0x76B5,0x76DD,0x7755,0x775F,0x7760, + 0x7752,0x7756,0x775A,0x7769,0x7767,0x7754,0x7759,0x776D, + 0x77E0,0x7887,0x789A,0x7894,0x788F,0x7884,0x7895,0x7885, + 0x7886,0x78A1,0x7883,0x7879,0x7899,0x7880,0x7896,0x787B, + 0x797C,0x7982,0x797D,0x7979,0x7A11,0x7A18,0x7A19,0x7A12, + 0x7A17,0x7A15,0x7A22,0x7A13,0x7A1B,0x7A10,0x7AA3,0x7AA2, + 0x7A9E,0x7AEB,0x7B66,0x7B64,0x7B6D,0x7B74,0x7B69,0x7B72, + 0x7B65,0x7B73,0x7B71,0x7B70,0x7B61,0x7B78,0x7B76,0x7B63, + 0x7CB2,0x7CB4,0x7CAF,0x7D88,0x7D86,0x7D80, + /* Range 0x4621 - 0x467E, array index: 0x0E8F */ + 0x7D8D,0x7D7F,0x7D85,0x7D7A,0x7D8E,0x7D7B,0x7D83,0x7D7C, + 0x7D8C,0x7D94,0x7D84,0x7D7D,0x7D92,0x7F6D,0x7F6B,0x7F67, + 0x7F68,0x7F6C,0x7FA6,0x7FA5,0x7FA7,0x7FDB,0x7FDC,0x8021, + 0x8164,0x8160,0x8177,0x815C,0x8169,0x815B,0x8162,0x8172, + 0x6721,0x815E,0x8176,0x8167,0x816F,0x8144,0x8161,0x821D, + 0x8249,0x8244,0x8240,0x8242,0x8245,0x84F1,0x843F,0x8456, + 0x8476,0x8479,0x848F,0x848D,0x8465,0x8451,0x8440,0x8486, + 0x8467,0x8430,0x844D,0x847D,0x845A,0x8459,0x8474,0x8473, + 0x845D,0x8507,0x845E,0x8437,0x843A,0x8434,0x847A,0x8443, + 0x8478,0x8432,0x8445,0x8429,0x83D9,0x844B,0x842F,0x8442, + 0x842D,0x845F,0x8470,0x8439,0x844E,0x844C,0x8452,0x846F, + 0x84C5,0x848E,0x843B,0x8447,0x8436,0x8433, + /* Range 0x4721 - 0x477E, array index: 0x0EED */ + 0x8468,0x847E,0x8444,0x842B,0x8460,0x8454,0x846E,0x8450, + 0x870B,0x8704,0x86F7,0x870C,0x86FA,0x86D6,0x86F5,0x874D, + 0x86F8,0x870E,0x8709,0x8701,0x86F6,0x870D,0x8705,0x88D6, + 0x88CB,0x88CD,0x88CE,0x88DE,0x88DB,0x88DA,0x88CC,0x88D0, + 0x8985,0x899B,0x89DF,0x89E5,0x89E4,0x89E1,0x89E0,0x89E2, + 0x89DC,0x89E6,0x8A76,0x8A86,0x8A7F,0x8A61,0x8A3F,0x8A77, + 0x8A82,0x8A84,0x8A75,0x8A83,0x8A81,0x8A74,0x8A7A,0x8C3C, + 0x8C4B,0x8C4A,0x8C65,0x8C64,0x8C66,0x8C86,0x8C84,0x8C85, + 0x8CCC,0x8D68,0x8D69,0x8D91,0x8D8C,0x8D8E,0x8D8F,0x8D8D, + 0x8D93,0x8D94,0x8D90,0x8D92,0x8DF0,0x8DE0,0x8DEC,0x8DF1, + 0x8DEE,0x8DD0,0x8DE9,0x8DE3,0x8DE2,0x8DE7,0x8DF2,0x8DEB, + 0x8DF4,0x8F06,0x8EFF,0x8F01,0x8F00,0x8F05, + /* Range 0x4821 - 0x487E, array index: 0x0F4B */ + 0x8F07,0x8F08,0x8F02,0x8F0B,0x9052,0x903F,0x9044,0x9049, + 0x903D,0x9110,0x910D,0x910F,0x9111,0x9116,0x9114,0x910B, + 0x910E,0x916E,0x916F,0x9248,0x9252,0x9230,0x923A,0x9266, + 0x9233,0x9265,0x925E,0x9283,0x922E,0x924A,0x9246,0x926D, + 0x926C,0x924F,0x9260,0x9267,0x926F,0x9236,0x9261,0x9270, + 0x9231,0x9254,0x9263,0x9250,0x9272,0x924E,0x9253,0x924C, + 0x9256,0x9232,0x959F,0x959C,0x959E,0x959B,0x9692,0x9693, + 0x9691,0x9697,0x96CE,0x96FA,0x96FD,0x96F8,0x96F5,0x9773, + 0x9777,0x9778,0x9772,0x980F,0x980D,0x980E,0x98AC,0x98F6, + 0x98F9,0x99AF,0x99B2,0x99B0,0x99B5,0x9AAD,0x9AAB,0x9B5B, + 0x9CEA,0x9CED,0x9CE7,0x9E80,0x9EFD,0x50E6,0x50D4,0x50D7, + 0x50E8,0x50F3,0x50DB,0x50EA,0x50DD,0x50E4, + /* Range 0x4921 - 0x497E, array index: 0x0FA9 */ + 0x50D3,0x50EC,0x50F0,0x50EF,0x50E3,0x50E0,0x51D8,0x5280, + 0x5281,0x52E9,0x52EB,0x5330,0x53AC,0x5627,0x5615,0x560C, + 0x5612,0x55FC,0x560F,0x561C,0x5601,0x5613,0x5602,0x55FA, + 0x561D,0x5604,0x55FF,0x55F9,0x5889,0x587C,0x5890,0x5898, + 0x5886,0x5881,0x587F,0x5874,0x588B,0x587A,0x5887,0x5891, + 0x588E,0x5876,0x5882,0x5888,0x587B,0x5894,0x588F,0x58FE, + 0x596B,0x5ADC,0x5AEE,0x5AE5,0x5AD5,0x5AEA,0x5ADA,0x5AED, + 0x5AEB,0x5AF3,0x5AE2,0x5AE0,0x5ADB,0x5AEC,0x5ADE,0x5ADD, + 0x5AD9,0x5AE8,0x5ADF,0x5B77,0x5BE0,0x5BE3,0x5C63,0x5D82, + 0x5D80,0x5D7D,0x5D86,0x5D7A,0x5D81,0x5D77,0x5D8A,0x5D89, + 0x5D88,0x5D7E,0x5D7C,0x5D8D,0x5D79,0x5D7F,0x5E58,0x5E59, + 0x5E53,0x5ED8,0x5ED1,0x5ED7,0x5ECE,0x5EDC, + /* Range 0x4A21 - 0x4A7E, array index: 0x1007 */ + 0x5ED5,0x5ED9,0x5ED2,0x5ED4,0x5F44,0x5F43,0x5F6F,0x5FB6, + 0x612C,0x6128,0x6141,0x615E,0x6171,0x6173,0x6152,0x6153, + 0x6172,0x616C,0x6180,0x6174,0x6154,0x617A,0x615B,0x6165, + 0x613B,0x616A,0x6161,0x6156,0x6229,0x6227,0x622B,0x642B, + 0x644D,0x645B,0x645D,0x6474,0x6476,0x6472,0x6473,0x647D, + 0x6475,0x6466,0x64A6,0x644E,0x6482,0x645E,0x645C,0x644B, + 0x6453,0x6460,0x6450,0x647F,0x643F,0x646C,0x646B,0x6459, + 0x6465,0x6477,0x6573,0x65A0,0x66A1,0x66A0,0x669F,0x6705, + 0x6704,0x6722,0x69B1,0x69B6,0x69C9,0x69A0,0x69CE,0x6996, + 0x69B0,0x69AC,0x69BC,0x6991,0x6999,0x698E,0x69A7,0x698D, + 0x69A9,0x69BE,0x69AF,0x69BF,0x69C4,0x69BD,0x69A4,0x69D4, + 0x69B9,0x69CA,0x699A,0x69CF,0x69B3,0x6993, + /* Range 0x4B21 - 0x4B7E, array index: 0x1065 */ + 0x69AA,0x69A1,0x699E,0x69D9,0x6997,0x6990,0x69C2,0x69B5, + 0x69A5,0x69C6,0x6B4A,0x6B4D,0x6B4B,0x6B9E,0x6B9F,0x6BA0, + 0x6BC3,0x6BC4,0x6BFE,0x6ECE,0x6EF5,0x6EF1,0x6F03,0x6F25, + 0x6EF8,0x6F37,0x6EFB,0x6F2E,0x6F09,0x6F4E,0x6F19,0x6F1A, + 0x6F27,0x6F18,0x6F3B,0x6F12,0x6EED,0x6F0A,0x6F36,0x6F73, + 0x6EF9,0x6EEE,0x6F2D,0x6F40,0x6F30,0x6F3C,0x6F35,0x6EEB, + 0x6F07,0x6F0E,0x6F43,0x6F05,0x6EFD,0x6EF6,0x6F39,0x6F1C, + 0x6EFC,0x6F3A,0x6F1F,0x6F0D,0x6F1E,0x6F08,0x6F21,0x7187, + 0x7190,0x7189,0x7180,0x7185,0x7182,0x718F,0x717B,0x7186, + 0x7181,0x7197,0x7244,0x7253,0x7297,0x7295,0x7293,0x7343, + 0x734D,0x7351,0x734C,0x7462,0x7473,0x7471,0x7475,0x7472, + 0x7467,0x746E,0x7500,0x7502,0x7503,0x757D, + /* Range 0x4C21 - 0x4C7E, array index: 0x10C3 */ + 0x7590,0x7616,0x7608,0x760C,0x7615,0x7611,0x760A,0x7614, + 0x76B8,0x7781,0x777C,0x7785,0x7782,0x776E,0x7780,0x776F, + 0x777E,0x7783,0x78B2,0x78AA,0x78B4,0x78AD,0x78A8,0x787E, + 0x78AB,0x789E,0x78A5,0x78A0,0x78AC,0x78A2,0x78A4,0x7998, + 0x798A,0x798B,0x7996,0x7995,0x7994,0x7993,0x7997,0x7988, + 0x7992,0x7990,0x7A2B,0x7A4A,0x7A30,0x7A2F,0x7A28,0x7A26, + 0x7AA8,0x7AAB,0x7AAC,0x7AEE,0x7B88,0x7B9C,0x7B8A,0x7B91, + 0x7B90,0x7B96,0x7B8D,0x7B8C,0x7B9B,0x7B8E,0x7B85,0x7B98, + 0x5284,0x7B99,0x7BA4,0x7B82,0x7CBB,0x7CBF,0x7CBC,0x7CBA, + 0x7DA7,0x7DB7,0x7DC2,0x7DA3,0x7DAA,0x7DC1,0x7DC0,0x7DC5, + 0x7D9D,0x7DCE,0x7DC4,0x7DC6,0x7DCB,0x7DCC,0x7DAF,0x7DB9, + 0x7D96,0x7DBC,0x7D9F,0x7DA6,0x7DAE,0x7DA9, + /* Range 0x4D21 - 0x4D7E, array index: 0x1121 */ + 0x7DA1,0x7DC9,0x7F73,0x7FE2,0x7FE3,0x7FE5,0x7FDE,0x8024, + 0x805D,0x805C,0x8189,0x8186,0x8183,0x8187,0x818D,0x818C, + 0x818B,0x8215,0x8497,0x84A4,0x84A1,0x849F,0x84BA,0x84CE, + 0x84C2,0x84AC,0x84AE,0x84AB,0x84B9,0x84B4,0x84C1,0x84CD, + 0x84AA,0x849A,0x84B1,0x84D0,0x849D,0x84A7,0x84BB,0x84A2, + 0x8494,0x84C7,0x84CC,0x849B,0x84A9,0x84AF,0x84A8,0x84D6, + 0x8498,0x84B6,0x84CF,0x84A0,0x84D7,0x84D4,0x84D2,0x84DB, + 0x84B0,0x8491,0x8661,0x8733,0x8723,0x8728,0x876B,0x8740, + 0x872E,0x871E,0x8721,0x8719,0x871B,0x8743,0x872C,0x8741, + 0x873E,0x8746,0x8720,0x8732,0x872A,0x872D,0x873C,0x8712, + 0x873A,0x8731,0x8735,0x8742,0x8726,0x8727,0x8738,0x8724, + 0x871A,0x8730,0x8711,0x88F7,0x88E7,0x88F1, + /* Range 0x4E21 - 0x4E7E, array index: 0x117F */ + 0x88F2,0x88FA,0x88FE,0x88EE,0x88FC,0x88F6,0x88FB,0x88F0, + 0x88EC,0x88EB,0x899D,0x89A1,0x899F,0x899E,0x89E9,0x89EB, + 0x89E8,0x8AAB,0x8A99,0x8A8B,0x8A92,0x8A8F,0x8A96,0x8C3D, + 0x8C68,0x8C69,0x8CD5,0x8CCF,0x8CD7,0x8D96,0x8E09,0x8E02, + 0x8DFF,0x8E0D,0x8DFD,0x8E0A,0x8E03,0x8E07,0x8E06,0x8E05, + 0x8DFE,0x8E00,0x8E04,0x8F10,0x8F11,0x8F0E,0x8F0D,0x9123, + 0x911C,0x9120,0x9122,0x911F,0x911D,0x911A,0x9124,0x9121, + 0x911B,0x917A,0x9172,0x9179,0x9173,0x92A5,0x92A4,0x9276, + 0x929B,0x927A,0x92A0,0x9294,0x92AA,0x928D,0x92A6,0x929A, + 0x92AB,0x9279,0x9297,0x927F,0x92A3,0x92EE,0x928E,0x9282, + 0x9295,0x92A2,0x927D,0x9288,0x92A1,0x928A,0x9286,0x928C, + 0x9299,0x92A7,0x927E,0x9287,0x92A9,0x929D, + /* Range 0x4F21 - 0x4F7E, array index: 0x11DD */ + 0x928B,0x922D,0x969E,0x96A1,0x96FF,0x9758,0x977D,0x977A, + 0x977E,0x9783,0x9780,0x9782,0x977B,0x9784,0x9781,0x977F, + 0x97CE,0x97CD,0x9816,0x98AD,0x98AE,0x9902,0x9900,0x9907, + 0x999D,0x999C,0x99C3,0x99B9,0x99BB,0x99BA,0x99C2,0x99BD, + 0x99C7,0x9AB1,0x9AE3,0x9AE7,0x9B3E,0x9B3F,0x9B60,0x9B61, + 0x9B5F,0x9CF1,0x9CF2,0x9CF5,0x9EA7,0x50FF,0x5103,0x5130, + 0x50F8,0x5106,0x5107,0x50F6,0x50FE,0x510B,0x510C,0x50FD, + 0x510A,0x528B,0x528C,0x52F1,0x52EF,0x5648,0x5642,0x564C, + 0x5635,0x5641,0x564A,0x5649,0x5646,0x5658,0x565A,0x5640, + 0x5633,0x563D,0x562C,0x563E,0x5638,0x562A,0x563A,0x571A, + 0x58AB,0x589D,0x58B1,0x58A0,0x58A3,0x58AF,0x58AC,0x58A5, + 0x58A1,0x58FF,0x5AFF,0x5AF4,0x5AFD,0x5AF7, + /* Range 0x5021 - 0x507E, array index: 0x123B */ + 0x5AF6,0x5B03,0x5AF8,0x5B02,0x5AF9,0x5B01,0x5B07,0x5B05, + 0x5B0F,0x5C67,0x5D99,0x5D97,0x5D9F,0x5D92,0x5DA2,0x5D93, + 0x5D95,0x5DA0,0x5D9C,0x5DA1,0x5D9A,0x5D9E,0x5E69,0x5E5D, + 0x5E60,0x5E5C,0x7DF3,0x5EDB,0x5EDE,0x5EE1,0x5F49,0x5FB2, + 0x618B,0x6183,0x6179,0x61B1,0x61B0,0x61A2,0x6189,0x619B, + 0x6193,0x61AF,0x61AD,0x619F,0x6192,0x61AA,0x61A1,0x618D, + 0x6166,0x61B3,0x622D,0x646E,0x6470,0x6496,0x64A0,0x6485, + 0x6497,0x649C,0x648F,0x648B,0x648A,0x648C,0x64A3,0x649F, + 0x6468,0x64B1,0x6498,0x6576,0x657A,0x6579,0x657B,0x65B2, + 0x65B3,0x66B5,0x66B0,0x66A9,0x66B2,0x66B7,0x66AA,0x66AF, + 0x6A00,0x6A06,0x6A17,0x69E5,0x69F8,0x6A15,0x69F1,0x69E4, + 0x6A20,0x69FF,0x69EC,0x69E2,0x6A1B,0x6A1D, + /* Range 0x5121 - 0x517E, array index: 0x1299 */ + 0x69FE,0x6A27,0x69F2,0x69EE,0x6A14,0x69F7,0x69E7,0x6A40, + 0x6A08,0x69E6,0x69FB,0x6A0D,0x69FC,0x69EB,0x6A09,0x6A04, + 0x6A18,0x6A25,0x6A0F,0x69F6,0x6A26,0x6A07,0x69F4,0x6A16, + 0x6B51,0x6BA5,0x6BA3,0x6BA2,0x6BA6,0x6C01,0x6C00,0x6BFF, + 0x6C02,0x6F41,0x6F26,0x6F7E,0x6F87,0x6FC6,0x6F92,0x6F8D, + 0x6F89,0x6F8C,0x6F62,0x6F4F,0x6F85,0x6F5A,0x6F96,0x6F76, + 0x6F6C,0x6F82,0x6F55,0x6F72,0x6F52,0x6F50,0x6F57,0x6F94, + 0x6F93,0x6F5D,0x6F00,0x6F61,0x6F6B,0x6F7D,0x6F67,0x6F90, + 0x6F53,0x6F8B,0x6F69,0x6F7F,0x6F95,0x6F63,0x6F77,0x6F6A, + 0x6F7B,0x71B2,0x71AF,0x719B,0x71B0,0x71A0,0x719A,0x71A9, + 0x71B5,0x719D,0x71A5,0x719E,0x71A4,0x71A1,0x71AA,0x719C, + 0x71A7,0x71B3,0x7298,0x729A,0x7358,0x7352, + /* Range 0x5221 - 0x527E, array index: 0x12F7 */ + 0x735E,0x735F,0x7360,0x735D,0x735B,0x7361,0x735A,0x7359, + 0x7362,0x7487,0x7489,0x748A,0x7486,0x7481,0x747D,0x7485, + 0x7488,0x747C,0x7479,0x7508,0x7507,0x757E,0x7625,0x761E, + 0x7619,0x761D,0x761C,0x7623,0x761A,0x7628,0x761B,0x769C, + 0x769D,0x769E,0x769B,0x778D,0x778F,0x7789,0x7788,0x78CD, + 0x78BB,0x78CF,0x78CC,0x78D1,0x78CE,0x78D4,0x78C8,0x78C3, + 0x78C4,0x78C9,0x799A,0x79A1,0x79A0,0x799C,0x79A2,0x799B, + 0x6B76,0x7A39,0x7AB2,0x7AB4,0x7AB3,0x7BB7,0x7BCB,0x7BBE, + 0x7BAC,0x7BCE,0x7BAF,0x7BB9,0x7BCA,0x7BB5,0x7CC5,0x7CC8, + 0x7CCC,0x7CCB,0x7DF7,0x7DDB,0x7DEA,0x7DE7,0x7DD7,0x7DE1, + 0x7E03,0x7DFA,0x7DE6,0x7DF6,0x7DF1,0x7DF0,0x7DEE,0x7DDF, + 0x7F76,0x7FAC,0x7FB0,0x7FAD,0x7FED,0x7FEB, + /* Range 0x5321 - 0x537E, array index: 0x1355 */ + 0x7FEA,0x7FEC,0x7FE6,0x7FE8,0x8064,0x8067,0x81A3,0x819F, + 0x819E,0x8195,0x81A2,0x8199,0x8197,0x8216,0x824F,0x8253, + 0x8252,0x8250,0x824E,0x8251,0x8524,0x853B,0x850F,0x8500, + 0x8529,0x850E,0x8509,0x850D,0x851F,0x850A,0x8527,0x851C, + 0x84FB,0x852B,0x84FA,0x8508,0x850C,0x84F4,0x852A,0x84F2, + 0x8515,0x84F7,0x84EB,0x84F3,0x84FC,0x8512,0x84EA,0x84E9, + 0x8516,0x84FE,0x8528,0x851D,0x852E,0x8502,0x84FD,0x851E, + 0x84F6,0x8531,0x8526,0x84E7,0x84E8,0x84F0,0x84EF,0x84F9, + 0x8518,0x8520,0x8530,0x850B,0x8519,0x852F,0x8662,0x8756, + 0x8763,0x8764,0x8777,0x87E1,0x8773,0x8758,0x8754,0x875B, + 0x8752,0x8761,0x875A,0x8751,0x875E,0x876D,0x876A,0x8750, + 0x874E,0x875F,0x875D,0x876F,0x876C,0x877A, + /* Range 0x5421 - 0x547E, array index: 0x13B3 */ + 0x876E,0x875C,0x8765,0x874F,0x877B,0x8775,0x8762,0x8767, + 0x8769,0x885A,0x8905,0x890C,0x8914,0x890B,0x8917,0x8918, + 0x8919,0x8906,0x8916,0x8911,0x890E,0x8909,0x89A2,0x89A4, + 0x89A3,0x89ED,0x89F0,0x89EC,0x8ACF,0x8AC6,0x8AB8,0x8AD3, + 0x8AD1,0x8AD4,0x8AD5,0x8ABB,0x8AD7,0x8ABE,0x8AC0,0x8AC5, + 0x8AD8,0x8AC3,0x8ABA,0x8ABD,0x8AD9,0x8C3E,0x8C4D,0x8C8F, + 0x8CE5,0x8CDF,0x8CD9,0x8CE8,0x8CDA,0x8CDD,0x8CE7,0x8DA0, + 0x8D9C,0x8DA1,0x8D9B,0x8E20,0x8E23,0x8E25,0x8E24,0x8E2E, + 0x8E15,0x8E1B,0x8E16,0x8E11,0x8E19,0x8E26,0x8E27,0x8E14, + 0x8E12,0x8E18,0x8E13,0x8E1C,0x8E17,0x8E1A,0x8F2C,0x8F24, + 0x8F18,0x8F1A,0x8F20,0x8F23,0x8F16,0x8F17,0x9073,0x9070, + 0x906F,0x9067,0x906B,0x912F,0x912B,0x9129, + /* Range 0x5521 - 0x557E, array index: 0x1411 */ + 0x912A,0x9132,0x9126,0x912E,0x9185,0x9186,0x918A,0x9181, + 0x9182,0x9184,0x9180,0x92D0,0x92C3,0x92C4,0x92C0,0x92D9, + 0x92B6,0x92CF,0x92F1,0x92DF,0x92D8,0x92E9,0x92D7,0x92DD, + 0x92CC,0x92EF,0x92C2,0x92E8,0x92CA,0x92C8,0x92CE,0x92E6, + 0x92CD,0x92D5,0x92C9,0x92E0,0x92DE,0x92E7,0x92D1,0x92D3, + 0x92B5,0x92E1,0x9325,0x92C6,0x92B4,0x957C,0x95AC,0x95AB, + 0x95AE,0x95B0,0x96A4,0x96A2,0x96D3,0x9705,0x9708,0x9702, + 0x975A,0x978A,0x978E,0x9788,0x97D0,0x97CF,0x981E,0x981D, + 0x9826,0x9829,0x9828,0x9820,0x981B,0x9827,0x98B2,0x9908, + 0x98FA,0x9911,0x9914,0x9916,0x9917,0x9915,0x99DC,0x99CD, + 0x99CF,0x99D3,0x99D4,0x99CE,0x99C9,0x99D6,0x99D8,0x99CB, + 0x99D7,0x99CC,0x9AB3,0x9AEC,0x9AEB,0x9AF3, + /* Range 0x5621 - 0x567E, array index: 0x146F */ + 0x9AF2,0x9AF1,0x9B46,0x9B43,0x9B67,0x9B74,0x9B71,0x9B66, + 0x9B76,0x9B75,0x9B70,0x9B68,0x9B64,0x9B6C,0x9CFC,0x9CFA, + 0x9CFD,0x9CFF,0x9CF7,0x9D07,0x9D00,0x9CF9,0x9CFB,0x9D08, + 0x9D05,0x9D04,0x9E83,0x9ED3,0x9F0F,0x9F10,0x511C,0x5113, + 0x5117,0x511A,0x5111,0x51DE,0x5334,0x53E1,0x5670,0x5660, + 0x566E,0x5673,0x5666,0x5663,0x566D,0x5672,0x565E,0x5677, + 0x571C,0x571B,0x58C8,0x58BD,0x58C9,0x58BF,0x58BA,0x58C2, + 0x58BC,0x58C6,0x5B17,0x5B19,0x5B1B,0x5B21,0x5B14,0x5B13, + 0x5B10,0x5B16,0x5B28,0x5B1A,0x5B20,0x5B1E,0x5BEF,0x5DAC, + 0x5DB1,0x5DA9,0x5DA7,0x5DB5,0x5DB0,0x5DAE,0x5DAA,0x5DA8, + 0x5DB2,0x5DAD,0x5DAF,0x5DB4,0x5E67,0x5E68,0x5E66,0x5E6F, + 0x5EE9,0x5EE7,0x5EE6,0x5EE8,0x5EE5,0x5F4B, + /* Range 0x5721 - 0x577E, array index: 0x14CD */ + 0x5FBC,0x5FBB,0x619D,0x61A8,0x6196,0x61C5,0x61B4,0x61C6, + 0x61C1,0x61CC,0x61BA,0x61BF,0x61B8,0x618C,0x64D7,0x64D6, + 0x64D0,0x64CF,0x64C9,0x64BD,0x6489,0x64C3,0x64DB,0x64F3, + 0x64D9,0x6533,0x657F,0x657C,0x65A2,0x66C8,0x66BE,0x66C0, + 0x66CA,0x66CB,0x66CF,0x66BD,0x66BB,0x66BA,0x66CC,0x6723, + 0x6A34,0x6A66,0x6A49,0x6A67,0x6A32,0x6A68,0x6A3E,0x6A5D, + 0x6A6D,0x6A76,0x6A5B,0x6A51,0x6A28,0x6A5A,0x6A3B,0x6A3F, + 0x6A41,0x6A6A,0x6A64,0x6A50,0x6A4F,0x6A54,0x6A6F,0x6A69, + 0x6A60,0x6A3C,0x6A5E,0x6A56,0x6A55,0x6A4D,0x6A4E,0x6A46, + 0x6B55,0x6B54,0x6B56,0x6BA7,0x6BAA,0x6BAB,0x6BC8,0x6BC7, + 0x6C04,0x6C03,0x6C06,0x6FAD,0x6FCB,0x6FA3,0x6FC7,0x6FBC, + 0x6FCE,0x6FC8,0x6F5E,0x6FC4,0x6FBD,0x6F9E, + /* Range 0x5821 - 0x587E, array index: 0x152B */ + 0x6FCA,0x6FA8,0x7004,0x6FA5,0x6FAE,0x6FBA,0x6FAC,0x6FAA, + 0x6FCF,0x6FBF,0x6FB8,0x6FA2,0x6FC9,0x6FAB,0x6FCD,0x6FAF, + 0x6FB2,0x6FB0,0x71C5,0x71C2,0x71BF,0x71B8,0x71D6,0x71C0, + 0x71C1,0x71CB,0x71D4,0x71CA,0x71C7,0x71CF,0x71BD,0x71D8, + 0x71BC,0x71C6,0x71DA,0x71DB,0x729D,0x729E,0x7369,0x7366, + 0x7367,0x736C,0x7365,0x736B,0x736A,0x747F,0x749A,0x74A0, + 0x7494,0x7492,0x7495,0x74A1,0x750B,0x7580,0x762F,0x762D, + 0x7631,0x763D,0x7633,0x763C,0x7635,0x7632,0x7630,0x76BB, + 0x76E6,0x779A,0x779D,0x77A1,0x779C,0x779B,0x77A2,0x77A3, + 0x7795,0x7799,0x7797,0x78DD,0x78E9,0x78E5,0x78EA,0x78DE, + 0x78E3,0x78DB,0x78E1,0x78E2,0x78ED,0x78DF,0x78E0,0x79A4, + 0x7A44,0x7A48,0x7A47,0x7AB6,0x7AB8,0x7AB5, + /* Range 0x5921 - 0x597E, array index: 0x1589 */ + 0x7AB1,0x7AB7,0x7BDE,0x7BE3,0x7BE7,0x7BDD,0x7BD5,0x7BE5, + 0x7BDA,0x7BE8,0x7BF9,0x7BD4,0x7BEA,0x7BE2,0x7BDC,0x7BEB, + 0x7BD8,0x7BDF,0x7CD2,0x7CD4,0x7CD7,0x7CD0,0x7CD1,0x7E12, + 0x7E21,0x7E17,0x7E0C,0x7E1F,0x7E20,0x7E13,0x7E0E,0x7E1C, + 0x7E15,0x7E1A,0x7E22,0x7E0B,0x7E0F,0x7E16,0x7E0D,0x7E14, + 0x7E25,0x7E24,0x7F43,0x7F7B,0x7F7C,0x7F7A,0x7FB1,0x7FEF, + 0x802A,0x8029,0x806C,0x81B1,0x81A6,0x81AE,0x81B9,0x81B5, + 0x81AB,0x81B0,0x81AC,0x81B4,0x81B2,0x81B7,0x81A7,0x81F2, + 0x8255,0x8256,0x8257,0x8556,0x8545,0x856B,0x854D,0x8553, + 0x8561,0x8558,0x8540,0x8546,0x8564,0x8541,0x8562,0x8544, + 0x8551,0x8547,0x8563,0x853E,0x855B,0x8571,0x854E,0x856E, + 0x8575,0x8555,0x8567,0x8560,0x858C,0x8566, + /* Range 0x5A21 - 0x5A7E, array index: 0x15E7 */ + 0x855D,0x8554,0x8565,0x856C,0x8663,0x8665,0x8664,0x87A4, + 0x879B,0x878F,0x8797,0x8793,0x8792,0x8788,0x8781,0x8796, + 0x8798,0x8779,0x8787,0x87A3,0x8785,0x8790,0x8791,0x879D, + 0x8784,0x8794,0x879C,0x879A,0x8789,0x891E,0x8926,0x8930, + 0x892D,0x892E,0x8927,0x8931,0x8922,0x8929,0x8923,0x892F, + 0x892C,0x891F,0x89F1,0x8AE0,0x8AE2,0x8AF2,0x8AF4,0x8AF5, + 0x8ADD,0x8B14,0x8AE4,0x8ADF,0x8AF0,0x8AC8,0x8ADE,0x8AE1, + 0x8AE8,0x8AFF,0x8AEF,0x8AFB,0x8C91,0x8C92,0x8C90,0x8CF5, + 0x8CEE,0x8CF1,0x8CF0,0x8CF3,0x8D6C,0x8D6E,0x8DA5,0x8DA7, + 0x8E33,0x8E3E,0x8E38,0x8E40,0x8E45,0x8E36,0x8E3C,0x8E3D, + 0x8E41,0x8E30,0x8E3F,0x8EBD,0x8F36,0x8F2E,0x8F35,0x8F32, + 0x8F39,0x8F37,0x8F34,0x9076,0x9079,0x907B, + /* Range 0x5B21 - 0x5B7E, array index: 0x1645 */ + 0x9086,0x90FA,0x9133,0x9135,0x9136,0x9193,0x9190,0x9191, + 0x918D,0x918F,0x9327,0x931E,0x9308,0x931F,0x9306,0x930F, + 0x937A,0x9338,0x933C,0x931B,0x9323,0x9312,0x9301,0x9346, + 0x932D,0x930E,0x930D,0x92CB,0x931D,0x92FA,0x9313,0x92F9, + 0x92F7,0x9334,0x9302,0x9324,0x92FF,0x9329,0x9339,0x9335, + 0x932A,0x9314,0x930C,0x930B,0x92FE,0x9309,0x9300,0x92FB, + 0x9316,0x95BC,0x95CD,0x95BE,0x95B9,0x95BA,0x95B6,0x95BF, + 0x95B5,0x95BD,0x96A9,0x96D4,0x970B,0x9712,0x9710,0x9799, + 0x9797,0x9794,0x97F0,0x97F8,0x9835,0x982F,0x9832,0x9924, + 0x991F,0x9927,0x9929,0x999E,0x99EE,0x99EC,0x99E5,0x99E4, + 0x99F0,0x99E3,0x99EA,0x99E9,0x99E7,0x9AB9,0x9ABF,0x9AB4, + 0x9ABB,0x9AF6,0x9AFA,0x9AF9,0x9AF7,0x9B33, + /* Range 0x5C21 - 0x5C7E, array index: 0x16A3 */ + 0x9B80,0x9B85,0x9B87,0x9B7C,0x9B7E,0x9B7B,0x9B82,0x9B93, + 0x9B92,0x9B90,0x9B7A,0x9B95,0x9B7D,0x9B88,0x9D25,0x9D17, + 0x9D20,0x9D1E,0x9D14,0x9D29,0x9D1D,0x9D18,0x9D22,0x9D10, + 0x9D19,0x9D1F,0x9E88,0x9E86,0x9E87,0x9EAE,0x9EAD,0x9ED5, + 0x9ED6,0x9EFA,0x9F12,0x9F3D,0x5126,0x5125,0x5122,0x5124, + 0x5120,0x5129,0x52F4,0x5693,0x568C,0x568D,0x5686,0x5684, + 0x5683,0x567E,0x5682,0x567F,0x5681,0x58D6,0x58D4,0x58CF, + 0x58D2,0x5B2D,0x5B25,0x5B32,0x5B23,0x5B2C,0x5B27,0x5B26, + 0x5B2F,0x5B2E,0x5B7B,0x5BF1,0x5BF2,0x5DB7,0x5E6C,0x5E6A, + 0x5FBE,0x61C3,0x61B5,0x61BC,0x61E7,0x61E0,0x61E5,0x61E4, + 0x61E8,0x61DE,0x64EF,0x64E9,0x64E3,0x64EB,0x64E4,0x64E8, + 0x6581,0x6580,0x65B6,0x65DA,0x66D2,0x6A8D, + /* Range 0x5D21 - 0x5D7E, array index: 0x1701 */ + 0x6A96,0x6A81,0x6AA5,0x6A89,0x6A9F,0x6A9B,0x6AA1,0x6A9E, + 0x6A87,0x6A93,0x6A8E,0x6A95,0x6A83,0x6AA8,0x6AA4,0x6A91, + 0x6A7F,0x6AA6,0x6A9A,0x6A85,0x6A8C,0x6A92,0x6B5B,0x6BAD, + 0x6C09,0x6FCC,0x6FA9,0x6FF4,0x6FD4,0x6FE3,0x6FDC,0x6FED, + 0x6FE7,0x6FE6,0x6FDE,0x6FF2,0x6FDD,0x6FE2,0x6FE8,0x71E1, + 0x71F1,0x71E8,0x71F2,0x71E4,0x71F0,0x71E2,0x7373,0x736E, + 0x736F,0x7497,0x74B2,0x74AB,0x7490,0x74AA,0x74AD,0x74B1, + 0x74A5,0x74AF,0x7510,0x7511,0x7512,0x750F,0x7584,0x7643, + 0x7648,0x7649,0x7647,0x76A4,0x76E9,0x77B5,0x77AB,0x77B2, + 0x77B7,0x77B6,0x77B4,0x77B1,0x77A8,0x77F0,0x78F3,0x78FD, + 0x7902,0x78FB,0x78FC,0x78FF,0x78F2,0x7905,0x78F9,0x78FE, + 0x7904,0x79AB,0x79A8,0x7A5C,0x7A5B,0x7A56, + /* Range 0x5E21 - 0x5E7E, array index: 0x175F */ + 0x7A58,0x7A54,0x7A5A,0x7ABE,0x7AC0,0x7AC1,0x7C05,0x7C0F, + 0x7BF2,0x7C00,0x7BFF,0x7BFB,0x7C0E,0x7BF4,0x7C0B,0x7BF3, + 0x7C02,0x7C09,0x7C03,0x7C01,0x7BF8,0x7BFD,0x7C06,0x7BF0, + 0x7BF1,0x7C10,0x7C0A,0x7CE8,0x7E2D,0x7E3C,0x7E42,0x7E33, + 0x9848,0x7E38,0x7E2A,0x7E49,0x7E40,0x7E47,0x7E29,0x7E4C, + 0x7E30,0x7E3B,0x7E36,0x7E44,0x7E3A,0x7F45,0x7F7F,0x7F7E, + 0x7F7D,0x7FF4,0x7FF2,0x802C,0x81BB,0x81C4,0x81CC,0x81CA, + 0x81C5,0x81C7,0x81BC,0x81E9,0x825B,0x825A,0x825C,0x8583, + 0x8580,0x858F,0x85A7,0x8595,0x85A0,0x858B,0x85A3,0x857B, + 0x85A4,0x859A,0x859E,0x8577,0x857C,0x8589,0x85A1,0x857A, + 0x8578,0x8557,0x858E,0x8596,0x8586,0x858D,0x8599,0x859D, + 0x8581,0x85A2,0x8582,0x8588,0x8585,0x8579, + /* Range 0x5F21 - 0x5F7E, array index: 0x17BD */ + 0x8576,0x8598,0x8590,0x859F,0x8668,0x87BE,0x87AA,0x87AD, + 0x87C5,0x87B0,0x87AC,0x87B9,0x87B5,0x87BC,0x87AE,0x87C9, + 0x87C3,0x87C2,0x87CC,0x87B7,0x87AF,0x87C4,0x87CA,0x87B4, + 0x87B6,0x87BF,0x87B8,0x87BD,0x87DE,0x87B2,0x8935,0x8933, + 0x893C,0x893E,0x8941,0x8952,0x8937,0x8942,0x89AD,0x89AF, + 0x89AE,0x89F2,0x89F3,0x8B1E,0x8B18,0x8B16,0x8B11,0x8B05, + 0x8B0B,0x8B22,0x8B0F,0x8B12,0x8B15,0x8B07,0x8B0D,0x8B08, + 0x8B06,0x8B1C,0x8B13,0x8B1A,0x8C4F,0x8C70,0x8C72,0x8C71, + 0x8C6F,0x8C95,0x8C94,0x8CF9,0x8D6F,0x8E4E,0x8E4D,0x8E53, + 0x8E50,0x8E4C,0x8E47,0x8F43,0x8F40,0x9085,0x907E,0x9138, + 0x919A,0x91A2,0x919B,0x9199,0x919F,0x91A1,0x919D,0x91A0, + 0x93A1,0x9383,0x93AF,0x9364,0x9356,0x9347, + /* Range 0x6021 - 0x607E, array index: 0x181B */ + 0x937C,0x9358,0x935C,0x9376,0x9349,0x9350,0x9351,0x9360, + 0x936D,0x938F,0x934C,0x936A,0x9379,0x9357,0x9355,0x9352, + 0x934F,0x9371,0x9377,0x937B,0x9361,0x935E,0x9363,0x9367, + 0x934E,0x9359,0x95C7,0x95C0,0x95C9,0x95C3,0x95C5,0x95B7, + 0x96AE,0x96B0,0x96AC,0x9720,0x971F,0x9718,0x971D,0x9719, + 0x979A,0x97A1,0x979C,0x979E,0x979D,0x97D5,0x97D4,0x97F1, + 0x9841,0x9844,0x984A,0x9849,0x9845,0x9843,0x9925,0x992B, + 0x992C,0x992A,0x9933,0x9932,0x992F,0x992D,0x9931,0x9930, + 0x9998,0x99A3,0x99A1,0x9A02,0x99FA,0x99F4,0x99F7,0x99F9, + 0x99F8,0x99F6,0x99FB,0x99FD,0x99FE,0x99FC,0x9A03,0x9ABE, + 0x9AFE,0x9AFD,0x9B01,0x9AFC,0x9B48,0x9B9A,0x9BA8,0x9B9E, + 0x9B9B,0x9BA6,0x9BA1,0x9BA5,0x9BA4,0x9B86, + /* Range 0x6121 - 0x617E, array index: 0x1879 */ + 0x9BA2,0x9BA0,0x9BAF,0x9D33,0x9D41,0x9D67,0x9D36,0x9D2E, + 0x9D2F,0x9D31,0x9D38,0x9D30,0x9D45,0x9D42,0x9D43,0x9D3E, + 0x9D37,0x9D40,0x9D3D,0x7FF5,0x9D2D,0x9E8A,0x9E89,0x9E8D, + 0x9EB0,0x9EC8,0x9EDA,0x9EFB,0x9EFF,0x9F24,0x9F23,0x9F22, + 0x9F54,0x9FA0,0x5131,0x512D,0x512E,0x5698,0x569C,0x5697, + 0x569A,0x569D,0x5699,0x5970,0x5B3C,0x5C69,0x5C6A,0x5DC0, + 0x5E6D,0x5E6E,0x61D8,0x61DF,0x61ED,0x61EE,0x61F1,0x61EA, + 0x61F0,0x61EB,0x61D6,0x61E9,0x64FF,0x6504,0x64FD,0x64F8, + 0x6501,0x6503,0x64FC,0x6594,0x65DB,0x66DA,0x66DB,0x66D8, + 0x6AC5,0x6AB9,0x6ABD,0x6AE1,0x6AC6,0x6ABA,0x6AB6,0x6AB7, + 0x6AC7,0x6AB4,0x6AAD,0x6B5E,0x6BC9,0x6C0B,0x7007,0x700C, + 0x700D,0x7001,0x7005,0x7014,0x700E,0x6FFF, + /* Range 0x6221 - 0x627E, array index: 0x18D7 */ + 0x7000,0x6FFB,0x7026,0x6FFC,0x6FF7,0x700A,0x7201,0x71FF, + 0x71F9,0x7203,0x71FD,0x7376,0x74B8,0x74C0,0x74B5,0x74C1, + 0x74BE,0x74B6,0x74BB,0x74C2,0x7514,0x7513,0x765C,0x7664, + 0x7659,0x7650,0x7653,0x7657,0x765A,0x76A6,0x76BD,0x76EC, + 0x77C2,0x77BA,0x790C,0x7913,0x7914,0x7909,0x7910,0x7912, + 0x7911,0x79AD,0x79AC,0x7A5F,0x7C1C,0x7C29,0x7C19,0x7C20, + 0x7C1F,0x7C2D,0x7C1D,0x7C26,0x7C28,0x7C22,0x7C25,0x7C30, + 0x7E5C,0x7E50,0x7E56,0x7E63,0x7E58,0x7E62,0x7E5F,0x7E51, + 0x7E60,0x7E57,0x7E53,0x7FB5,0x7FB3,0x7FF7,0x7FF8,0x8075, + 0x81D1,0x81D2,0x81D0,0x825F,0x825E,0x85B4,0x85C6,0x85C0, + 0x85C3,0x85C2,0x85B3,0x85B5,0x85BD,0x85C7,0x85C4,0x85BF, + 0x85CB,0x85CE,0x85C8,0x85C5,0x85B1,0x85B6, + /* Range 0x6321 - 0x637E, array index: 0x1935 */ + 0x85D2,0x8624,0x85B8,0x85B7,0x85BE,0x8669,0x87E7,0x87E6, + 0x87E2,0x87DB,0x87EB,0x87EA,0x87E5,0x87DF,0x87F3,0x87E4, + 0x87D4,0x87DC,0x87D3,0x87ED,0x87D8,0x87E3,0x87D7,0x87D9, + 0x8801,0x87F4,0x87E8,0x87DD,0x8953,0x894B,0x894F,0x894C, + 0x8946,0x8950,0x8951,0x8949,0x8B2A,0x8B27,0x8B23,0x8B33, + 0x8B30,0x8B35,0x8B47,0x8B2F,0x8B3C,0x8B3E,0x8B31,0x8B25, + 0x8B37,0x8B26,0x8B36,0x8B2E,0x8B24,0x8B3B,0x8B3D,0x8B3A, + 0x8C42,0x8C75,0x8C99,0x8C98,0x8C97,0x8CFE,0x8D04,0x8D02, + 0x8D00,0x8E5C,0x8E62,0x8E60,0x8E57,0x8E56,0x8E5E,0x8E65, + 0x8E67,0x8E5B,0x8E5A,0x8E61,0x8E5D,0x8E69,0x8E54,0x8F46, + 0x8F47,0x8F48,0x8F4B,0x9128,0x913A,0x913B,0x913E,0x91A8, + 0x91A5,0x91A7,0x91AF,0x91AA,0x93B5,0x938C, + /* Range 0x6421 - 0x647E, array index: 0x1993 */ + 0x9392,0x93B7,0x939B,0x939D,0x9389,0x93A7,0x938E,0x93AA, + 0x939E,0x93A6,0x9395,0x9388,0x9399,0x939F,0x9380,0x938D, + 0x93B1,0x9391,0x93B2,0x93A4,0x93A8,0x93B4,0x93A3,0x95D2, + 0x95D3,0x95D1,0x96B3,0x96D7,0x96DA,0x5DC2,0x96DF,0x96D8, + 0x96DD,0x9723,0x9722,0x9725,0x97AC,0x97AE,0x97A8,0x97AB, + 0x97A4,0x97AA,0x97A2,0x97A5,0x97D7,0x97D9,0x97D6,0x97D8, + 0x97FA,0x9850,0x9851,0x9852,0x98B8,0x9941,0x993C,0x993A, + 0x9A0F,0x9A0B,0x9A09,0x9A0D,0x9A04,0x9A11,0x9A0A,0x9A05, + 0x9A07,0x9A06,0x9AC0,0x9ADC,0x9B08,0x9B04,0x9B05,0x9B29, + 0x9B35,0x9B4A,0x9B4C,0x9B4B,0x9BC7,0x9BC6,0x9BC3,0x9BBF, + 0x9BC1,0x9BB5,0x9BB8,0x9BD3,0x9BB6,0x9BC4,0x9BB9,0x9BBD, + 0x9D5C,0x9D53,0x9D4F,0x9D4A,0x9D5B,0x9D4B, + /* Range 0x6521 - 0x657E, array index: 0x19F1 */ + 0x9D59,0x9D56,0x9D4C,0x9D57,0x9D52,0x9D54,0x9D5F,0x9D58, + 0x9D5A,0x9E8E,0x9E8C,0x9EDF,0x9F01,0x9F00,0x9F16,0x9F25, + 0x9F2B,0x9F2A,0x9F29,0x9F28,0x9F4C,0x9F55,0x5134,0x5135, + 0x5296,0x52F7,0x53B4,0x56AB,0x56AD,0x56A6,0x56A7,0x56AA, + 0x56AC,0x58DA,0x58DD,0x58DB,0x5912,0x5B3D,0x5B3E,0x5B3F, + 0x5DC3,0x5E70,0x5FBF,0x61FB,0x6507,0x6510,0x650D,0x6509, + 0x650C,0x650E,0x6584,0x65DE,0x65DD,0x66DE,0x6AE7,0x6AE0, + 0x6ACC,0x6AD1,0x6AD9,0x6ACB,0x6ADF,0x6ADC,0x6AD0,0x6AEB, + 0x6ACF,0x6ACD,0x6ADE,0x6B60,0x6BB0,0x6C0C,0x7019,0x7027, + 0x7020,0x7016,0x702B,0x7021,0x7022,0x7023,0x7029,0x7017, + 0x7024,0x701C,0x720C,0x720A,0x7207,0x7202,0x7205,0x72A5, + 0x72A6,0x72A4,0x72A3,0x72A1,0x74CB,0x74C5, + /* Range 0x6621 - 0x667E, array index: 0x1A4F */ + 0x74B7,0x74C3,0x7516,0x7660,0x77C9,0x77CA,0x77C4,0x77F1, + 0x791D,0x791B,0x7921,0x791C,0x7917,0x791E,0x79B0,0x7A67, + 0x7A68,0x7C33,0x7C3C,0x7C39,0x7C2C,0x7C3B,0x7CEC,0x7CEA, + 0x7E76,0x7E75,0x7E78,0x7E70,0x7E77,0x7E6F,0x7E7A,0x7E72, + 0x7E74,0x7E68,0x7F4B,0x7F4A,0x7F83,0x7F86,0x7FB7,0x7FFD, + 0x7FFE,0x8078,0x81D7,0x81D5,0x820B,0x8264,0x8261,0x8263, + 0x85EB,0x85F1,0x85ED,0x85D9,0x85E1,0x85E8,0x85DA,0x85D7, + 0x85EC,0x85F2,0x85F8,0x85D8,0x85DF,0x85E3,0x85DC,0x85D1, + 0x85F0,0x85E6,0x85EF,0x85DE,0x85E2,0x8800,0x87FA,0x8803, + 0x87F6,0x87F7,0x8809,0x880C,0x880B,0x8806,0x87FC,0x8808, + 0x87FF,0x880A,0x8802,0x8962,0x895A,0x895B,0x8957,0x8961, + 0x895C,0x8958,0x895D,0x8959,0x8988,0x89B7, + /* Range 0x6721 - 0x677E, array index: 0x1AAD */ + 0x89B6,0x89F6,0x8B50,0x8B48,0x8B4A,0x8B40,0x8B53,0x8B56, + 0x8B54,0x8B4B,0x8B55,0x8B51,0x8B42,0x8B52,0x8B57,0x8C43, + 0x8C77,0x8C76,0x8C9A,0x8D06,0x8D07,0x8D09,0x8DAC,0x8DAA, + 0x8DAD,0x8DAB,0x8E6D,0x8E78,0x8E73,0x8E6A,0x8E6F,0x8E7B, + 0x8EC2,0x8F52,0x8F51,0x8F4F,0x8F50,0x8F53,0x8FB4,0x9140, + 0x913F,0x91B0,0x91AD,0x93DE,0x93C7,0x93CF,0x93C2,0x93DA, + 0x93D0,0x93F9,0x93EC,0x93CC,0x93D9,0x93A9,0x93E6,0x93CA, + 0x93D4,0x93EE,0x93E3,0x93D5,0x93C4,0x93CE,0x93C0,0x93D2, + 0x93A5,0x93E7,0x957D,0x95DA,0x95DB,0x96E1,0x9729,0x972B, + 0x972C,0x9728,0x9726,0x97B3,0x97B7,0x97B6,0x97DD,0x97DE, + 0x97DF,0x985C,0x9859,0x985D,0x9857,0x98BF,0x98BD,0x98BB, + 0x98BE,0x9948,0x9947,0x9943,0x99A6,0x99A7, + /* Range 0x6821 - 0x687E, array index: 0x1B0B */ + 0x9A1A,0x9A15,0x9A25,0x9A1D,0x9A24,0x9A1B,0x9A22,0x9A20, + 0x9A27,0x9A23,0x9A1E,0x9A1C,0x9A14,0x9AC2,0x9B0B,0x9B0A, + 0x9B0E,0x9B0C,0x9B37,0x9BEA,0x9BEB,0x9BE0,0x9BDE,0x9BE4, + 0x9BE6,0x9BE2,0x9BF0,0x9BD4,0x9BD7,0x9BEC,0x9BDC,0x9BD9, + 0x9BE5,0x9BD5,0x9BE1,0x9BDA,0x9D77,0x9D81,0x9D8A,0x9D84, + 0x9D88,0x9D71,0x9D80,0x9D78,0x9D86,0x9D8B,0x9D8C,0x9D7D, + 0x9D6B,0x9D74,0x9D75,0x9D70,0x9D69,0x9D85,0x9D73,0x9D7B, + 0x9D82,0x9D6F,0x9D79,0x9D7F,0x9D87,0x9D68,0x9E94,0x9E91, + 0x9EC0,0x9EFC,0x9F2D,0x9F40,0x9F41,0x9F4D,0x9F56,0x9F57, + 0x9F58,0x5337,0x56B2,0x56B5,0x56B3,0x58E3,0x5B45,0x5DC6, + 0x5DC7,0x5EEE,0x5EEF,0x5FC0,0x5FC1,0x61F9,0x6517,0x6516, + 0x6515,0x6513,0x65DF,0x66E8,0x66E3,0x66E4, + /* Range 0x6921 - 0x697E, array index: 0x1B69 */ + 0x6AF3,0x6AF0,0x6AEA,0x6AE8,0x6AF9,0x6AF1,0x6AEE,0x6AEF, + 0x703C,0x7035,0x702F,0x7037,0x7034,0x7031,0x7042,0x7038, + 0x703F,0x703A,0x7039,0x702A,0x7040,0x703B,0x7033,0x7041, + 0x7213,0x7214,0x72A8,0x737D,0x737C,0x74BA,0x76AB,0x76AA, + 0x76BE,0x76ED,0x77CC,0x77CE,0x77CF,0x77CD,0x77F2,0x7925, + 0x7923,0x7927,0x7928,0x7924,0x7929,0x79B2,0x7A6E,0x7A6C, + 0x7A6D,0x7AF7,0x7C49,0x7C48,0x7C4A,0x7C47,0x7C45,0x7CEE, + 0x7E7B,0x7E7E,0x7E81,0x7E80,0x7FBA,0x7FFF,0x8079,0x81DB, + 0x81D9,0x8268,0x8269,0x8622,0x85FF,0x8601,0x85FE,0x861B, + 0x8600,0x85F6,0x8604,0x8609,0x8605,0x860C,0x85FD,0x8819, + 0x8810,0x8811,0x8817,0x8813,0x8816,0x8963,0x8966,0x89B9, + 0x89F7,0x8B60,0x8B6A,0x8B5D,0x8B68,0x8B63, + /* Range 0x6A21 - 0x6A7E, array index: 0x1BC7 */ + 0x8B65,0x8B67,0x8B6D,0x8DAE,0x8E86,0x8E88,0x8E84,0x8F59, + 0x8F56,0x8F57,0x8F55,0x8F58,0x8F5A,0x908D,0x9143,0x9141, + 0x91B7,0x91B5,0x91B2,0x91B3,0x940B,0x9413,0x93FB,0x9420, + 0x940F,0x9414,0x93FE,0x9415,0x9410,0x9428,0x9419,0x940D, + 0x93F5,0x9400,0x93F7,0x9407,0x940E,0x9416,0x9412,0x93FA, + 0x9409,0x93F8,0x943C,0x940A,0x93FF,0x93FC,0x940C,0x93F6, + 0x9411,0x9406,0x95DE,0x95E0,0x95DF,0x972E,0x972F,0x97B9, + 0x97BB,0x97FD,0x97FE,0x9860,0x9862,0x9863,0x985F,0x98C1, + 0x98C2,0x9950,0x994E,0x9959,0x994C,0x994B,0x9953,0x9A32, + 0x9A34,0x9A31,0x9A2C,0x9A2A,0x9A36,0x9A29,0x9A2E,0x9A38, + 0x9A2D,0x9AC7,0x9ACA,0x9AC6,0x9B10,0x9B12,0x9B11,0x9C0B, + 0x9C08,0x9BF7,0x9C05,0x9C12,0x9BF8,0x9C40, + /* Range 0x6B21 - 0x6B7E, array index: 0x1C25 */ + 0x9C07,0x9C0E,0x9C06,0x9C17,0x9C14,0x9C09,0x9D9F,0x9D99, + 0x9DA4,0x9D9D,0x9D92,0x9D98,0x9D90,0x9D9B,0x9DA0,0x9D94, + 0x9D9C,0x9DAA,0x9D97,0x9DA1,0x9D9A,0x9DA2,0x9DA8,0x9D9E, + 0x9DA3,0x9DBF,0x9DA9,0x9D96,0x9DA6,0x9DA7,0x9E99,0x9E9B, + 0x9E9A,0x9EE5,0x9EE4,0x9EE7,0x9EE6,0x9F30,0x9F2E,0x9F5B, + 0x9F60,0x9F5E,0x9F5D,0x9F59,0x9F91,0x513A,0x5139,0x5298, + 0x5297,0x56C3,0x56BD,0x56BE,0x5B48,0x5B47,0x5DCB,0x5DCF, + 0x5EF1,0x61FD,0x651B,0x6B02,0x6AFC,0x6B03,0x6AF8,0x6B00, + 0x7043,0x7044,0x704A,0x7048,0x7049,0x7045,0x7046,0x721D, + 0x721A,0x7219,0x737E,0x7517,0x766A,0x77D0,0x792D,0x7931, + 0x792F,0x7C54,0x7C53,0x7CF2,0x7E8A,0x7E87,0x7E88,0x7E8B, + 0x7E86,0x7E8D,0x7F4D,0x7FBB,0x8030,0x81DD, + /* Range 0x6C21 - 0x6C7E, array index: 0x1C83 */ + 0x8618,0x862A,0x8626,0x861F,0x8623,0x861C,0x8619,0x8627, + 0x862E,0x8621,0x8620,0x8629,0x861E,0x8625,0x8829,0x881D, + 0x881B,0x8820,0x8824,0x881C,0x882B,0x884A,0x896D,0x8969, + 0x896E,0x896B,0x89FA,0x8B79,0x8B78,0x8B45,0x8B7A,0x8B7B, + 0x8D10,0x8D14,0x8DAF,0x8E8E,0x8E8C,0x8F5E,0x8F5B,0x8F5D, + 0x9146,0x9144,0x9145,0x91B9,0x943F,0x943B,0x9436,0x9429, + 0x943D,0x9430,0x9439,0x942A,0x9437,0x942C,0x9440,0x9431, + 0x95E5,0x95E4,0x95E3,0x9735,0x973A,0x97BF,0x97E1,0x9864, + 0x98C9,0x98C6,0x98C0,0x9958,0x9956,0x9A39,0x9A3D,0x9A46, + 0x9A44,0x9A42,0x9A41,0x9A3A,0x9A3F,0x9ACD,0x9B15,0x9B17, + 0x9B18,0x9B16,0x9B3A,0x9B52,0x9C2B,0x9C1D,0x9C1C,0x9C2C, + 0x9C23,0x9C28,0x9C29,0x9C24,0x9C21,0x9DB7, + /* Range 0x6D21 - 0x6D7E, array index: 0x1CE1 */ + 0x9DB6,0x9DBC,0x9DC1,0x9DC7,0x9DCA,0x9DCF,0x9DBE,0x9DC5, + 0x9DC3,0x9DBB,0x9DB5,0x9DCE,0x9DB9,0x9DBA,0x9DAC,0x9DC8, + 0x9DB1,0x9DAD,0x9DCC,0x9DB3,0x9DCD,0x9DB2,0x9E7A,0x9E9C, + 0x9EEB,0x9EEE,0x9EED,0x9F1B,0x9F18,0x9F1A,0x9F31,0x9F4E, + 0x9F65,0x9F64,0x9F92,0x4EB9,0x56C6,0x56C5,0x56CB,0x5971, + 0x5B4B,0x5B4C,0x5DD5,0x5DD1,0x5EF2,0x6521,0x6520,0x6526, + 0x6522,0x6B0B,0x6B08,0x6B09,0x6C0D,0x7055,0x7056,0x7057, + 0x7052,0x721E,0x721F,0x72A9,0x737F,0x74D8,0x74D5,0x74D9, + 0x74D7,0x766D,0x76AD,0x7935,0x79B4,0x7A70,0x7A71,0x7C57, + 0x7C5C,0x7C59,0x7C5B,0x7C5A,0x7CF4,0x7CF1,0x7E91,0x7F4F, + 0x7F87,0x81DE,0x826B,0x8634,0x8635,0x8633,0x862C,0x8632, + 0x8636,0x882C,0x8828,0x8826,0x882A,0x8825, + /* Range 0x6E21 - 0x6E7E, array index: 0x1D3F */ + 0x8971,0x89BF,0x89BE,0x89FB,0x8B7E,0x8B84,0x8B82,0x8B86, + 0x8B85,0x8B7F,0x8D15,0x8E95,0x8E94,0x8E9A,0x8E92,0x8E90, + 0x8E96,0x8E97,0x8F60,0x8F62,0x9147,0x944C,0x9450,0x944A, + 0x944B,0x944F,0x9447,0x9445,0x9448,0x9449,0x9446,0x973F, + 0x97E3,0x986A,0x9869,0x98CB,0x9954,0x995B,0x9A4E,0x9A53, + 0x9A54,0x9A4C,0x9A4F,0x9A48,0x9A4A,0x9A49,0x9A52,0x9A50, + 0x9AD0,0x9B19,0x9B2B,0x9B3B,0x9B56,0x9B55,0x9C46,0x9C48, + 0x9C3F,0x9C44,0x9C39,0x9C33,0x9C41,0x9C3C,0x9C37,0x9C34, + 0x9C32,0x9C3D,0x9C36,0x9DDB,0x9DD2,0x9DDE,0x9DDA,0x9DCB, + 0x9DD0,0x9DDC,0x9DD1,0x9DDF,0x9DE9,0x9DD9,0x9DD8,0x9DD6, + 0x9DF5,0x9DD5,0x9DDD,0x9EB6,0x9EF0,0x9F35,0x9F33,0x9F32, + 0x9F42,0x9F6B,0x9F95,0x9FA2,0x513D,0x5299, + /* Range 0x6F21 - 0x6F7E, array index: 0x1D9D */ + 0x58E8,0x58E7,0x5972,0x5B4D,0x5DD8,0x882F,0x5F4F,0x6201, + 0x6203,0x6204,0x6529,0x6525,0x6596,0x66EB,0x6B11,0x6B12, + 0x6B0F,0x6BCA,0x705B,0x705A,0x7222,0x7382,0x7381,0x7383, + 0x7670,0x77D4,0x7C67,0x7C66,0x7E95,0x826C,0x863A,0x8640, + 0x8639,0x863C,0x8631,0x863B,0x863E,0x8830,0x8832,0x882E, + 0x8833,0x8976,0x8974,0x8973,0x89FE,0x8B8C,0x8B8E,0x8B8B, + 0x8B88,0x8C45,0x8D19,0x8E98,0x8F64,0x8F63,0x91BC,0x9462, + 0x9455,0x945D,0x9457,0x945E,0x97C4,0x97C5,0x9800,0x9A56, + 0x9A59,0x9B1E,0x9B1F,0x9B20,0x9C52,0x9C58,0x9C50,0x9C4A, + 0x9C4D,0x9C4B,0x9C55,0x9C59,0x9C4C,0x9C4E,0x9DFB,0x9DF7, + 0x9DEF,0x9DE3,0x9DEB,0x9DF8,0x9DE4,0x9DF6,0x9DE1,0x9DEE, + 0x9DE6,0x9DF2,0x9DF0,0x9DE2,0x9DEC,0x9DF4, + /* Range 0x7021 - 0x707E, array index: 0x1DFB */ + 0x9DF3,0x9DE8,0x9DED,0x9EC2,0x9ED0,0x9EF2,0x9EF3,0x9F06, + 0x9F1C,0x9F38,0x9F37,0x9F36,0x9F43,0x9F4F,0x9F71,0x9F70, + 0x9F6E,0x9F6F,0x56D3,0x56CD,0x5B4E,0x5C6D,0x652D,0x66ED, + 0x66EE,0x6B13,0x705F,0x7061,0x705D,0x7060,0x7223,0x74DB, + 0x74E5,0x77D5,0x7938,0x79B7,0x79B6,0x7C6A,0x7E97,0x7F89, + 0x826D,0x8643,0x8838,0x8837,0x8835,0x884B,0x8B94,0x8B95, + 0x8E9E,0x8E9F,0x8EA0,0x8E9D,0x91BE,0x91BD,0x91C2,0x946B, + 0x9468,0x9469,0x96E5,0x9746,0x9743,0x9747,0x97C7,0x97E5, + 0x9A5E,0x9AD5,0x9B59,0x9C63,0x9C67,0x9C66,0x9C62,0x9C5E, + 0x9C60,0x9E02,0x9DFE,0x9E07,0x9E03,0x9E06,0x9E05,0x9E00, + 0x9E01,0x9E09,0x9DFF,0x9DFD,0x9E04,0x9EA0,0x9F1E,0x9F46, + 0x9F74,0x9F75,0x9F76,0x56D4,0x652E,0x65B8, + /* Range 0x7121 - 0x717E, array index: 0x1E59 */ + 0x6B18,0x6B19,0x6B17,0x6B1A,0x7062,0x7226,0x72AA,0x77D8, + 0x77D9,0x7939,0x7C69,0x7C6B,0x7CF6,0x7E9A,0x7E98,0x7E9B, + 0x7E99,0x81E0,0x81E1,0x8646,0x8647,0x8648,0x8979,0x897A, + 0x897C,0x897B,0x89FF,0x8B98,0x8B99,0x8EA5,0x8EA4,0x8EA3, + 0x946E,0x946D,0x946F,0x9471,0x9473,0x9749,0x9872,0x995F, + 0x9C68,0x9C6E,0x9C6D,0x9E0B,0x9E0D,0x9E10,0x9E0F,0x9E12, + 0x9E11,0x9EA1,0x9EF5,0x9F09,0x9F47,0x9F78,0x9F7B,0x9F7A, + 0x9F79,0x571E,0x7066,0x7C6F,0x883C,0x8DB2,0x8EA6,0x91C3, + 0x9474,0x9478,0x9476,0x9475,0x9A60,0x9B2E,0x9C74,0x9C73, + 0x9C71,0x9C75,0x9E14,0x9E13,0x9EF6,0x9F0A,0x9FA4,0x7068, + 0x7065,0x7CF7,0x866A,0x883E,0x883D,0x883F,0x8B9E,0x8C9C, + 0x8EA9,0x8EC9,0x974B,0x9873,0x9874,0x98CC, + /* Range 0x7221 - 0x7244, array index: 0x1EB7 */ + 0x9961,0x99AB,0x9A64,0x9A66,0x9A67,0x9B24,0x9E15,0x9E17, + 0x9F48,0x6207,0x6B1E,0x7227,0x864C,0x8EA8,0x9482,0x9480, + 0x9481,0x9A69,0x9A68,0x9E19,0x864B,0x8B9F,0x9483,0x9C79, + 0x9EB7,0x7675,0x9A6B,0x9C7A,0x9E1D,0x7069,0x706A,0x7229, + 0x9EA4,0x9F7E,0x9F49,0x9F98, + /* Unranged codes (82 codes) */ +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE2 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> cns11643_plane2 speed-optimized table (42496 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_cns11643_plane2[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x0100,0x0200, + 0x0300,0x0400,0x0500,0x0600,0x0700,0x0800,0x0900,0x0A00, + 0x0B00,0x0C00,0x0D00,0x0E00,0x0F00,0x1000,0x1100,0x1200, + 0x1300,0x1400,0x1500,0x1600,0x1700,0x1800,0x1900,0x1A00, + 0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,0x2000,0x2100,0x2200, + 0x2300,0x2400,0x2500,0x2600,0x2700,0x2800,0x2900,0x2A00, + 0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000,0x3100,0x3200, + 0x3300,0x3400,0x3500,0x3600,0x3700,0x3800,0x3900,0x3A00, + 0x3B00,0x3C00,0x3D00,0x3E00,0x3F00,0x4000,0x4100,0x4200, + 0x4300,0x4400,0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00, + 0x4B00,0x4C00,0x4D00,0x4E00,0x4F00,0x5000,0x5100,0x5200, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 79, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2126, + INVALC,INVALC,INVALC,INVALC,0x2127,INVALC,0x212F,0x212D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2130,INVALC, + INVALC,0x2143,INVALC,0x2531,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2144,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2121,INVALC,INVALC,INVALC,INVALC,0x2128, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2122,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x334E, + INVALC,INVALC,INVALC,0x4156,0x4157,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2129,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2131,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4158,INVALC, + INVALC,0x6D44,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2132,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2134,0x2133,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x214A,INVALC,0x2146,0x2149,INVALC,INVALC, + INVALC,0x2148,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2145,0x2147,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x216F,INVALC,INVALC,0x2179,0x216D,INVALC,0x2171, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x0200 */ + 0x2170,INVALC,0x2174,INVALC,0x2178,0x2175,INVALC,INVALC, + 0x2172,INVALC,INVALC,INVALC,INVALC,INVALC,0x216A,INVALC, + INVALC,INVALC,0x217A,0x2177,0x216E,INVALC,INVALC,INVALC, + 0x216B,INVALC,INVALC,INVALC,INVALC,0x2173,INVALC,INVALC, + INVALC,INVALC,0x2176,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x216C,0x2328,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2329,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x227B,INVALC,INVALC,0x2322,0x232A, + INVALC,0x2326,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x227D,INVALC,INVALC,0x253D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2324,0x227E,INVALC,INVALC,0x227A,INVALC, + 0x2327,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2325, + INVALC,0x232B,0x227C,INVALC,0x2321,INVALC,INVALC,0x2323, + INVALC,INVALC,0x253F,0x254B,INVALC,INVALC,0x254C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2539,INVALC,0x2538,0x253C, + 0x2543,0x2541,INVALC,INVALC,0x2533,0x2535,INVALC,INVALC, + 0x2536,0x2542,0x2549,INVALC,0x253B,0x2534,INVALC,0x2537, + INVALC,0x253A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2544,INVALC,0x2548,INVALC,0x2546,0x254A,INVALC,0x253E, + 0x2532,INVALC,0x2540,INVALC,0x2545,INVALC,0x2547,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2922,0x292A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2930,0x292E,0x2929,INVALC,INVALC,INVALC,INVALC, + 0x292F,0x2925,INVALC,INVALC,INVALC,0x287E,INVALC,0x292C, + INVALC,0x2923,INVALC,0x2924,INVALC,0x287D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2921,0x2926,INVALC,0x292D,INVALC, + INVALC,0x2928,INVALC,0x292B,0x2927,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2931,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2D71,0x2D70,0x2D75,0x2D76, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x2D6A,INVALC,0x2D6B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D7E,INVALC, + INVALC,INVALC,INVALC,0x2D6C,INVALC,0x335E,INVALC,0x2D77, + INVALC,INVALC,INVALC,0x2D6F,0x2D78,INVALC,0x2D69,INVALC, + 0x2D79,INVALC,0x2D6D,INVALC,INVALC,INVALC,INVALC,0x2D7A, + INVALC,INVALC,INVALC,INVALC,0x2D74,INVALC,INVALC,0x2D7C, + 0x2D6E,0x2D7D,INVALC,0x2D72,INVALC,0x2D7B,INVALC,0x2D73, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3366,0x335A,INVALC,INVALC,INVALC,0x335F,0x3365,INVALC, + 0x3358,INVALC,0x335C,0x3355,INVALC,0x3359,INVALC,INVALC, + INVALC,0x336A,INVALC,0x3354,INVALC,INVALC,INVALC,0x3369, + INVALC,INVALC,INVALC,0x335B,INVALC,0x3356,0x3352,0x3360, + 0x3353,0x3351,0x335D,0x3363,0x3364,INVALC,INVALC,INVALC, + 0x3A3F,0x3361,0x3350,0x3362,INVALC,INVALC,0x3367,INVALC, + 0x334F,INVALC,0x3357,0x3368,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A42,0x3A3B,INVALC,INVALC,INVALC,0x3A43, + INVALC,INVALC,INVALC,0x3A39,0x3A3C,INVALC,0x3A3D,INVALC, + INVALC,INVALC,0x3A41,INVALC,0x3A37,0x3A36,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3A35,0x3A40,0x3A3E,0x3A38,INVALC, + INVALC,INVALC,INVALC,0x3A3A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x415C,INVALC, + 0x4162,0x4165,INVALC,INVALC,0x415F,INVALC,0x4168,INVALC, + 0x4169,INVALC,0x4164,INVALC,INVALC,0x4159,INVALC,0x415A, + INVALC,0x4163,0x4161,INVALC,0x415D,INVALC,0x415B,INVALC, + 0x4160,0x4167,0x415E,0x4166,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4921,0x4877,INVALC,INVALC,0x4878, + INVALC,INVALC,INVALC,0x487B,INVALC,0x487D,INVALC,INVALC, + 0x4926,INVALC,INVALC,0x4925,0x487E,INVALC,0x4876,INVALC, + 0x4879,INVALC,0x487C,INVALC,0x4922,INVALC,INVALC,0x4924, + 0x4923,INVALC,INVALC,0x487A,INVALC,INVALC,0x4F54,INVALC, + 0x4F51,INVALC,INVALC,INVALC,INVALC,0x4F58,0x4F55,0x4F4E, + /* Block 82, Array index 0x0400 */ + INVALC,INVALC,INVALC,0x4F4F,INVALC,INVALC,0x4F52,0x4F53, + INVALC,INVALC,0x4F59,0x4F56,0x4F57,INVALC,INVALC,INVALC, + INVALC,0x5643,INVALC,0x5640,INVALC,INVALC,INVALC,0x5641, + INVALC,INVALC,0x5642,INVALC,0x563F,INVALC,INVALC,INVALC, + 0x5C49,INVALC,0x5C47,INVALC,0x5C48,0x5C46,0x5C45,INVALC, + INVALC,0x5C4A,INVALC,INVALC,INVALC,0x6144,0x6145,INVALC, + 0x4F50,0x6143,INVALC,INVALC,0x6537,0x6538,INVALC,INVALC, + INVALC,0x6B4F,0x6B4E,INVALC,INVALC,0x6E7D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2E21,INVALC,INVALC,INVALC,INVALC,0x3A44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x212E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x232C, + INVALC,INVALC,INVALC,0x2E23,0x2E22,INVALC,INVALC,INVALC, + 0x2135,INVALC,INVALC,INVALC,INVALC,INVALC,0x254D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x217B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x232D,INVALC,INVALC,0x254E,INVALC,0x254F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2E25,0x2E26,INVALC,INVALC, + 0x2E27,INVALC,0x2E24,INVALC,INVALC,INVALC,0x2E28,INVALC, + 0x336B,INVALC,INVALC,INVALC,0x3A45,INVALC,INVALC,0x416A, + 0x4927,INVALC,INVALC,INVALC,INVALC,INVALC,0x5644,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2123,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x214C,INVALC,INVALC,0x214B,INVALC,INVALC,INVALC, + 0x217D,INVALC,INVALC,0x217C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x232E,INVALC,0x232F,INVALC, + INVALC,0x2330,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2554,0x2551,0x2552,INVALC,0x2550,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2932,INVALC,0x2553,INVALC, + INVALC,0x2933,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2E2B,INVALC,INVALC,0x2E2E,INVALC,INVALC, + INVALC,INVALC,0x2E2A,INVALC,INVALC,INVALC,0x2E2C,0x2E2D, + INVALC,0x2E29,0x2E2F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x336C,0x336E,0x336D,0x336F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x416C,INVALC,0x416B,0x416D,0x416E,INVALC,INVALC,INVALC, + 0x4928,0x4929,INVALC,INVALC,0x4C61,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F5A,0x4F5B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6539,0x6B51, + 0x6B50,0x6E7E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x217E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2331,0x2332,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2555,INVALC,INVALC,INVALC, + 0x2934,INVALC,0x2935,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2E30,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3371,INVALC,INVALC,0x3370,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x492A,INVALC,0x492B,INVALC,INVALC,INVALC,0x4F5D, + INVALC,0x4F5C,INVALC,INVALC,0x5C4B,INVALC,INVALC,0x653A, + INVALC,INVALC,INVALC,INVALC,0x2136,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2333,0x2556,0x2557,INVALC,INVALC,0x2E31,INVALC, + INVALC,0x3A47,0x3A46,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2124,INVALC,0x214D,INVALC,INVALC,0x2222, + INVALC,INVALC,0x2221,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3372,INVALC,INVALC, + 0x492C,INVALC,INVALC,INVALC,0x5645,INVALC,INVALC,0x686A, + INVALC,INVALC,INVALC,INVALC,0x2558,0x2936,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x214E,0x2223,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2334,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2137,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2335,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2937,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2125,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2224,INVALC,INVALC,INVALC,0x2336,0x2337, + INVALC,INVALC,0x2559,INVALC,0x255A,INVALC,0x2939,0x2938, + 0x293B,0x293A,INVALC,INVALC,0x3373,INVALC,0x2E32,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A48,INVALC,INVALC,0x3A49, + INVALC,INVALC,INVALC,INVALC,0x492D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x653B,INVALC,INVALC,INVALC, + INVALC,0x2138,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5646,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2225, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2340,0x233D,INVALC,INVALC,0x233E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2345,0x233F,INVALC,INVALC, + 0x2344,INVALC,0x233A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2338,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2339, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2341,INVALC,INVALC, + INVALC,0x2343,INVALC,INVALC,INVALC,0x233C,INVALC,0x2346, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2342, + INVALC,INVALC,INVALC,INVALC,0x233B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x256B,0x256A,INVALC,0x256D,0x256F,0x2564,0x2567,0x256E, + INVALC,INVALC,INVALC,0x2561,0x2565,INVALC,INVALC,0x2569, + 0x294A,INVALC,0x294E,INVALC,0x2566,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2562,INVALC,INVALC,INVALC,0x2563,0x255C, + INVALC,0x255D,0x255F,INVALC,INVALC,INVALC,INVALC,0x255B, + 0x2560,INVALC,INVALC,INVALC,INVALC,0x2568,INVALC,INVALC, + INVALC,0x255E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x256C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2949,0x293D,0x294C,INVALC,INVALC,0x293F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x293E,0x2944,INVALC, + 0x2950,INVALC,INVALC,INVALC,INVALC,INVALC,0x2946,0x2943, + INVALC,INVALC,0x293C,INVALC,0x294B,INVALC,0x294D,INVALC, + INVALC,INVALC,INVALC,0x2941,INVALC,0x2947,0x2948,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2940, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2945,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x294F,INVALC, + 0x2E46,INVALC,0x2E34,INVALC,0x2E39,INVALC,INVALC,0x2E37, + INVALC,INVALC,INVALC,0x2E3E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2E41,INVALC,0x2E38,INVALC,INVALC,INVALC,0x2E44, + 0x2E45,INVALC,INVALC,0x2E43,INVALC,INVALC,INVALC,0x2E3B, + /* Block 86, Array index 0x0800 */ + INVALC,INVALC,INVALC,0x2E48,0x2E3C,0x2E40,INVALC,INVALC, + 0x2E3D,INVALC,0x2E42,0x2E49,0x3424,INVALC,0x2E47,INVALC, + INVALC,0x2E3F,0x2E36,INVALC,INVALC,INVALC,INVALC,0x2E35, + INVALC,INVALC,0x2E3A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E33,INVALC, + INVALC,INVALC,0x337A,INVALC,INVALC,0x342A,INVALC,INVALC, + 0x3421,INVALC,0x3425,INVALC,0x3379,0x337E,0x337D,INVALC, + INVALC,0x3428,INVALC,0x342B,0x3376,INVALC,INVALC,INVALC, + 0x342C,INVALC,INVALC,INVALC,INVALC,0x3423,INVALC,INVALC, + 0x3429,INVALC,INVALC,0x342D,INVALC,0x3377,0x3427,INVALC, + 0x3378,0x337B,0x3422,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x337C,INVALC,INVALC,0x3426,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3374,0x3375,0x3A4E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A59,INVALC,0x3A5C, + INVALC,0x3A55,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A52,INVALC,INVALC,INVALC,0x3A5A,0x417C,0x3A5F,0x3A53, + INVALC,0x3A4A,0x3A57,0x3A51,INVALC,0x3A5D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3A5E,0x3A50,0x3A56,0x3A58,0x3A4C,0x3A5B,INVALC, + 0x3A4B,INVALC,INVALC,INVALC,INVALC,0x3A4D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A54,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x417A, + 0x4176,INVALC,0x4227,0x416F,0x4178,INVALC,INVALC,INVALC, + 0x4223,INVALC,0x4174,0x4173,0x4171,0x4225,INVALC,0x417D, + 0x4172,INVALC,0x417B,INVALC,0x4177,0x417E,0x4222,INVALC, + INVALC,0x4226,INVALC,0x4170,INVALC,0x4175,INVALC,INVALC, + INVALC,INVALC,0x4221,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4179,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4224,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x493C,0x4938,INVALC,0x4932,INVALC,INVALC,0x493B, + /* Block 87, Array index 0x0900 */ + INVALC,0x4935,0x4937,INVALC,0x493A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4930,INVALC,INVALC,0x4933, + INVALC,INVALC,0x4931,0x4936,INVALC,0x492F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4934,0x4939,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x492E, + INVALC,INVALC,0x4F6E,INVALC,0x4F6B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F69,INVALC,0x4F61,INVALC,INVALC, + 0x4F6D,INVALC,0x4F6F,INVALC,INVALC,0x4F6A,0x4F6C,INVALC, + 0x4F68,0x4F62,0x4F5F,INVALC,INVALC,0x3A4F,0x4F65,INVALC, + 0x4F5E,0x4F64,0x4F63,INVALC,0x4F60,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F66,INVALC,0x4F67,INVALC,INVALC,INVALC,0x564F,INVALC, + 0x5648,INVALC,INVALC,0x564C,INVALC,INVALC,0x564B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x564D,0x5649,INVALC, + 0x5647,INVALC,0x564E,0x564A,INVALC,INVALC,INVALC,0x5650, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C52,0x5C54, + INVALC,0x5C55,0x5C53,0x5C51,0x5C50,INVALC,0x5C4F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C4D,0x5C4E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C4C,INVALC,INVALC,INVALC,0x6148, + 0x6146,0x614B,0x6149,INVALC,0x6147,0x614A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x653E,0x653F, + INVALC,INVALC,0x6540,0x653C,0x6541,0x653D,INVALC,INVALC, + INVALC,INVALC,0x686B,0x686D,INVALC,0x686C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6B53,0x6B54,INVALC, + INVALC,INVALC,INVALC,0x6B52,INVALC,0x6D46,0x6D45,INVALC, + INVALC,INVALC,INVALC,0x6D47,INVALC,0x7034,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7033,0x707C,INVALC,INVALC,0x212A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2227, + INVALC,0x2226,INVALC,INVALC,INVALC,0x2349,INVALC,0x2348, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2347,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2570, + INVALC,0x2571,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x0A00 */ + INVALC,0x2E4A,0x2E4B,INVALC,INVALC,INVALC,INVALC,0x342F, + INVALC,INVALC,0x342E,INVALC,0x3A60,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4228,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F70,0x5652,0x5651,INVALC,0x715A,INVALC, + 0x2139,INVALC,0x214F,0x2150,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2229,INVALC,INVALC,INVALC,0x2228,INVALC, + INVALC,INVALC,INVALC,INVALC,0x222A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x234A,INVALC,INVALC,INVALC,0x234B,INVALC,INVALC, + INVALC,0x234D,INVALC,0x234E,0x234C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x234F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x257E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2621,INVALC,INVALC,0x2575,INVALC,0x2574,INVALC,0x2572, + 0x2577,0x2576,0x2573,0x257C,0x257D,0x257A,0x2578,INVALC, + INVALC,INVALC,INVALC,0x257B,INVALC,0x2622,INVALC,INVALC, + 0x2579,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2955,INVALC,INVALC,0x295B, + INVALC,INVALC,INVALC,INVALC,0x2959,0x295F,INVALC,0x2956, + 0x295A,0x295C,0x295E,0x2958,INVALC,0x2957,0x2952,0x2953, + INVALC,INVALC,INVALC,INVALC,0x2954,0x295D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2951,0x2E55,INVALC, + 0x2E54,0x2E59,0x2E50,INVALC,0x2E53,0x2E52,INVALC,0x2E56, + INVALC,0x2E5A,INVALC,INVALC,INVALC,INVALC,0x2E51,0x2E57, + INVALC,INVALC,INVALC,INVALC,0x2E4C,INVALC,INVALC,0x343D, + 0x2E58,INVALC,0x2E4F,INVALC,INVALC,0x2E4E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3434,INVALC,INVALC,INVALC, + INVALC,0x3444,0x3432,0x3440,INVALC,0x3442,INVALC,0x3448, + INVALC,0x344C,INVALC,INVALC,0x3443,0x3437,0x343F,INVALC, + 0x344D,0x344B,0x3441,0x343C,0x3435,0x3A68,0x3433,INVALC, + 0x343A,INVALC,INVALC,0x3430,0x3446,0x3438,INVALC,INVALC, + /* Block 89, Array index 0x0B00 */ + 0x3436,0x3449,INVALC,INVALC,0x344F,INVALC,INVALC,0x343E, + 0x3439,INVALC,INVALC,0x343B,0x344A,0x344E,0x3445,INVALC, + 0x3447,INVALC,INVALC,INVALC,0x3431,INVALC,INVALC,INVALC, + INVALC,0x3A63,INVALC,0x3A6C,0x3A6B,INVALC,0x3A64,INVALC, + INVALC,INVALC,INVALC,0x3A66,INVALC,0x3A6A,INVALC,0x3A65, + 0x3A67,0x3A61,INVALC,INVALC,0x3A74,0x3A73,0x3A70,INVALC, + INVALC,INVALC,0x2E4D,0x3A6D,INVALC,INVALC,0x3A6F,0x3A62, + 0x3A72,0x3A71,INVALC,0x3A75,INVALC,0x4236,INVALC,0x3A6E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A69,0x422E,INVALC,INVALC,INVALC,0x422D,0x4231,0x422C, + INVALC,INVALC,INVALC,0x4229,INVALC,0x4230,INVALC,INVALC, + INVALC,0x4233,INVALC,0x4235,INVALC,0x4232,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4237,0x422B,0x4234,INVALC,INVALC, + 0x422A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x422F, + INVALC,0x4238,INVALC,INVALC,0x4944,INVALC,0x494A,INVALC, + INVALC,INVALC,0x4946,0x494D,0x493E,INVALC,INVALC,0x4943, + INVALC,0x4942,0x494B,INVALC,INVALC,INVALC,0x4941,0x4947, + 0x494C,0x493D,INVALC,0x4945,INVALC,INVALC,0x4949,0x494F, + 0x493F,0x4948,INVALC,INVALC,0x494E,INVALC,INVALC,INVALC, + 0x4940,INVALC,INVALC,INVALC,INVALC,0x4F72,INVALC,INVALC, + 0x4F74,0x4F79,INVALC,0x4F75,INVALC,0x4F78,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F71,0x4F77,INVALC,INVALC,0x4F76, + INVALC,0x4F73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5657,INVALC,0x5659,0x5654,INVALC,0x5656, + INVALC,INVALC,0x5658,INVALC,INVALC,INVALC,0x565A,INVALC, + 0x5653,0x5655,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C58, + INVALC,INVALC,0x5C59,INVALC,0x5C57,INVALC,0x5C56,INVALC, + INVALC,INVALC,0x6542,0x6544,INVALC,0x6543,INVALC,INVALC, + INVALC,INVALC,INVALC,0x686E,INVALC,INVALC,INVALC,0x6F22, + 0x6F21,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2960,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4239,INVALC,0x4950,0x4F7A, + /* Block 90, Array index 0x0C00 */ + INVALC,INVALC,INVALC,0x213A,INVALC,INVALC,0x2350,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2623,0x2961,0x2E5B,INVALC, + INVALC,INVALC,0x6545,INVALC,INVALC,INVALC,INVALC,0x2151, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x213B,INVALC,INVALC,0x2152, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x222B,INVALC,INVALC,INVALC, + 0x2351,INVALC,INVALC,INVALC,INVALC,0x2624,INVALC,INVALC, + INVALC,INVALC,0x2E5C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2962,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3450,INVALC,INVALC,INVALC, + INVALC,0x3A76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4951,INVALC,INVALC,INVALC,INVALC, + 0x614C,0x6D48,0x6F23,INVALC,INVALC,INVALC,INVALC,0x2231, + INVALC,INVALC,INVALC,0x222F,0x222D,INVALC,0x2230,0x2232, + 0x222C,INVALC,INVALC,INVALC,INVALC,0x222E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2356,0x2359, + 0x2358,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2355, + 0x2353,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2354,0x235B,0x2357,INVALC,INVALC,INVALC,0x2352,0x235A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2630,0x2629,INVALC,0x2634,0x2625,0x262C,INVALC, + INVALC,INVALC,0x2626,INVALC,0x262D,0x2631,INVALC,INVALC, + 0x2632,0x262B,INVALC,0x262E,INVALC,INVALC,INVALC,0x2635, + 0x2633,INVALC,INVALC,INVALC,0x262A,INVALC,0x2628,0x2627, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x262F,INVALC, + INVALC,INVALC,INVALC,0x2970,INVALC,0x2968,0x2964,INVALC, + 0x2974,0x2963,INVALC,INVALC,0x296D,INVALC,INVALC,INVALC, + INVALC,0x2971,INVALC,INVALC,INVALC,0x2977,0x2965,INVALC, + INVALC,0x2967,0x296E,0x2972,0x2976,0x2973,0x296C,0x296F, + INVALC,INVALC,0x2969,INVALC,0x296B,0x296A,0x2975,INVALC, + /* Block 91, Array index 0x0D00 */ + 0x2966,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2E64,INVALC,INVALC,INVALC,INVALC,0x2E62, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2E61,0x2E5E,0x2E63, + INVALC,0x2E5D,INVALC,INVALC,INVALC,INVALC,0x2E65,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2E5F,0x2E60,INVALC, + INVALC,INVALC,INVALC,0x2E66,INVALC,0x3457,INVALC,0x3B26, + 0x3456,0x3469,INVALC,INVALC,INVALC,INVALC,0x3467,INVALC, + INVALC,INVALC,0x3470,0x3460,0x3463,INVALC,INVALC,0x346D, + 0x3465,INVALC,INVALC,INVALC,0x346A,0x3468,INVALC,INVALC, + 0x3459,0x346E,0x3462,0x345D,INVALC,0x3453,0x346F,0x345F, + 0x3452,INVALC,INVALC,0x3464,0x3471,0x3461,0x3455,0x345A, + 0x3451,INVALC,INVALC,INVALC,0x345E,0x345B,INVALC,0x3454, + INVALC,0x346C,INVALC,INVALC,0x345C,0x3458,INVALC,INVALC, + 0x346B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A7D,INVALC,0x3A7A,0x3B2D,0x3B21,0x3B2E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B2A,0x3B27,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B28,0x3B2B,0x3B2F,INVALC,0x3466,0x3B31, + 0x424D,INVALC,INVALC,0x3B32,0x3A78,0x3B24,INVALC,0x3B29, + INVALC,INVALC,INVALC,INVALC,0x3B30,0x3B33,0x3A7C,0x3A79, + INVALC,INVALC,0x3A7B,INVALC,INVALC,0x3B22,0x3A7E,INVALC, + INVALC,0x3B2C,INVALC,INVALC,0x3B23,INVALC,0x3B25,0x3A77, + 0x4241,0x423F,INVALC,INVALC,0x4249,0x4240,0x424A,0x4246, + 0x423E,0x424C,0x423D,0x4244,INVALC,INVALC,INVALC,0x4242, + 0x4247,INVALC,INVALC,INVALC,0x423B,INVALC,0x4245,0x423A, + 0x4243,INVALC,0x4248,0x423C,INVALC,0x424B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4955,INVALC,INVALC, + INVALC,0x4961,0x4957,0x495D,0x4952,0x4960,0x495F,0x4963, + 0x495C,INVALC,0x495B,INVALC,INVALC,0x4954,INVALC,INVALC, + 0x4962,INVALC,0x4956,0x4959,0x495E,0x4958,0x4953,INVALC, + INVALC,INVALC,INVALC,0x495A,0x4F7C,INVALC,0x5021,0x4F7E, + 0x5023,0x5025,INVALC,INVALC,INVALC,0x4F7D,INVALC,0x4F7B, + /* Block 92, Array index 0x0E00 */ + INVALC,0x5026,0x5024,0x5022,INVALC,0x5028,INVALC,0x5027, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5029, + 0x5661,INVALC,INVALC,0x5660,0x565F,INVALC,0x5662,0x565B, + INVALC,0x565C,0x5664,0x565D,INVALC,INVALC,0x5666,INVALC, + 0x5665,0x565E,INVALC,0x5C5D,INVALC,0x5C5B,0x5C60,0x5C5F, + 0x5663,INVALC,INVALC,INVALC,0x5C5E,0x5C5A,0x5C62,0x5C61, + INVALC,INVALC,0x5C5C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x614D,0x6546,0x6547,0x6548, + INVALC,INVALC,INVALC,INVALC,INVALC,0x686F,INVALC,0x6B56, + 0x6B55,INVALC,INVALC,0x6D49,0x6D4A,0x6F24,0x7035,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2233,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2636,INVALC,INVALC,0x2637,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2E67,INVALC,0x3473,INVALC, + INVALC,INVALC,0x3472,INVALC,INVALC,INVALC,INVALC,0x4964, + INVALC,INVALC,INVALC,0x5C63,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2153,INVALC,INVALC,0x2154,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x235C,INVALC, + INVALC,INVALC,0x235D,0x2638,INVALC,0x2639,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E68, + 0x2978,INVALC,INVALC,INVALC,0x2E6A,0x2E69,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3475,0x3474,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B39,0x3B36,INVALC,0x3B35,0x3B3A,INVALC, + INVALC,0x3B38,INVALC,INVALC,0x3B37,INVALC,0x424E,INVALC, + 0x424F,0x4250,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4965,INVALC,INVALC,0x4966,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B34,INVALC,INVALC,INVALC,INVALC,0x5667, + INVALC,0x5C64,0x5C65,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x0F00 */ + INVALC,INVALC,INVALC,0x2E6B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B3B,INVALC,INVALC,INVALC, + 0x213C,INVALC,0x2155,INVALC,INVALC,0x2234,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4251, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2235,INVALC,INVALC, + 0x235E,INVALC,0x235F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B3C,INVALC,INVALC,0x4252,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2156,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x263A,INVALC,INVALC,0x263B, + INVALC,INVALC,INVALC,INVALC,0x2979,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2E6D,INVALC,0x2E6C,INVALC, + INVALC,0x3476,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4967,INVALC,INVALC,INVALC,0x502A, + INVALC,0x614E,0x614F,INVALC,INVALC,0x7036,0x212B,INVALC, + INVALC,INVALC,INVALC,0x2158,0x2157,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2237,0x2238,0x2236,INVALC,0x2239,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2367,INVALC, + 0x2362,0x2364,0x2366,0x2363,INVALC,0x2360,INVALC,0x2361, + INVALC,INVALC,0x2365,0x2368,INVALC,0x2369,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2649,INVALC,0x2643, + 0x263E,INVALC,0x2646,0x2644,0x263D,0x264A,0x264D,0x2648, + 0x2641,INVALC,0x2647,INVALC,0x2642,0x2645,0x263C,0x2640, + 0x264C,INVALC,INVALC,INVALC,INVALC,0x263F,0x264B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A2C,0x2A25, + 0x2A2B,0x2A24,0x2A26,0x297E,0x297C,INVALC,0x2A2D,0x2A2A, + 0x297A,INVALC,INVALC,0x2A28,0x2A29,INVALC,0x2A27,0x297D, + 0x297B,INVALC,0x2A23,0x2A21,INVALC,INVALC,0x2A22,0x2A2E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2E6E,INVALC,0x2E70,INVALC, + INVALC,0x2E71,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E72, + 0x2A2F,0x2E74,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E6F, + /* Block 94, Array index 0x1000 */ + 0x2E73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3478,0x347C,0x347E,INVALC,0x3523, + INVALC,INVALC,0x3525,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x347A,INVALC,INVALC,0x3479,0x3477,0x3527, + 0x347B,INVALC,INVALC,0x3526,INVALC,0x3522,0x3521,INVALC, + 0x347D,INVALC,INVALC,INVALC,INVALC,INVALC,0x3528,INVALC, + 0x3524,0x3B4B,0x3B52,0x3B47,INVALC,0x3B43,0x3B53,0x3B3D, + 0x3B50,0x3B4E,0x3B48,INVALC,0x3B51,0x3B4A,INVALC,0x3B42, + 0x3B54,0x3B40,0x3B4D,0x3B3E,INVALC,0x3B55,INVALC,INVALC, + INVALC,0x3B4F,0x4255,0x3B41,INVALC,INVALC,0x3B45,INVALC, + INVALC,0x3B44,0x3B49,INVALC,INVALC,0x3B46,INVALC,INVALC, + INVALC,0x3B4C,INVALC,INVALC,INVALC,INVALC,0x4259,INVALC, + INVALC,INVALC,0x425C,0x4254,INVALC,0x4256,INVALC,0x425B, + 0x425A,INVALC,INVALC,0x3B3F,0x4258,INVALC,INVALC,INVALC, + INVALC,0x4253,0x4257,INVALC,INVALC,INVALC,INVALC,0x496E, + INVALC,0x4975,0x496C,INVALC,0x4973,0x496A,0x4972,0x4976, + 0x4969,0x496D,0x4968,INVALC,INVALC,INVALC,0x496B,INVALC, + 0x4971,0x4970,0x496F,INVALC,INVALC,0x4974,INVALC,INVALC, + INVALC,INVALC,0x502E,0x5030,INVALC,0x5031,INVALC,0x502C, + INVALC,0x502B,0x5035,INVALC,0x5033,INVALC,0x5036,0x502D, + 0x5032,0x5034,0x502F,INVALC,INVALC,INVALC,INVALC,0x566B, + 0x5670,0x566A,0x566F,INVALC,0x5668,0x5672,0x566E,0x5673, + 0x566D,0x5669,0x5671,INVALC,0x5674,0x566C,INVALC,0x5C66, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6150,INVALC,0x643E,0x6549,INVALC,INVALC,0x6870,0x6871, + INVALC,INVALC,INVALC,0x6B57,INVALC,INVALC,INVALC,0x6B58, + INVALC,0x6D4C,INVALC,INVALC,INVALC,0x6D4B,INVALC,INVALC, + 0x6F25,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x223A, + 0x236A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x425D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2A30,INVALC,INVALC,INVALC,INVALC,INVALC,0x213D, + /* Block 95, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,0x2159,INVALC,INVALC,INVALC, + INVALC,INVALC,0x236B,INVALC,INVALC,INVALC,0x236C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x264F,INVALC,INVALC,0x264E, + INVALC,0x2650,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2A34,0x2A31,0x2A32,0x2A33,0x2A35,INVALC,INVALC,INVALC, + 0x2E76,0x2E75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x352A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3529,INVALC, + INVALC,0x3B57,INVALC,INVALC,0x3B56,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4260,0x4262,INVALC,0x4261,0x425F,0x425E, + INVALC,INVALC,INVALC,0x4979,INVALC,INVALC,INVALC,INVALC, + 0x4977,0x4978,INVALC,INVALC,0x503A,0x5038,INVALC,INVALC, + 0x5039,INVALC,INVALC,INVALC,INVALC,INVALC,0x5677,0x5675, + 0x5676,0x5037,0x5C68,INVALC,0x5C67,0x6151,0x6152,0x5678, + 0x654A,INVALC,INVALC,INVALC,INVALC,0x223B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x215A,INVALC,0x215B,INVALC,0x223C,INVALC,INVALC,INVALC, + 0x2370,0x236E,INVALC,0x236D,0x236F,0x2371,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A39,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2A38,0x2A3A,0x2A37,0x2A3B,INVALC,INVALC, + 0x2E77,INVALC,0x2E79,INVALC,0x2E7A,INVALC,0x2E78,INVALC, + 0x2A36,0x352B,0x352E,0x352F,0x352C,INVALC,INVALC,INVALC, + INVALC,0x352D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4263,0x4265,0x4267, + INVALC,INVALC,INVALC,0x4266,0x4264,INVALC,0x497D,INVALC, + INVALC,0x497B,0x4A23,INVALC,0x4A24,0x4A21,INVALC,0x497C, + 0x497A,0x4A22,INVALC,0x503C,0x497E,INVALC,0x503D,INVALC, + INVALC,0x503E,INVALC,INVALC,INVALC,0x567D,0x567B,0x567A, + 0x567C,0x5679,INVALC,INVALC,INVALC,INVALC,0x6872,0x6873, + INVALC,0x6B59,0x6D4D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x1200 */ + INVALC,INVALC,0x223D,INVALC,INVALC,0x2372,INVALC,0x2A3C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x223E,INVALC,INVALC,0x2373,INVALC,INVALC, + INVALC,INVALC,0x2652,0x2653,0x2654,INVALC,INVALC,INVALC, + 0x2651,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A3D,INVALC, + 0x2E7C,INVALC,INVALC,0x2E7B,INVALC,INVALC,0x3530,INVALC, + 0x3531,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4268,INVALC,INVALC,0x4A26,0x4A25,INVALC,INVALC,INVALC, + INVALC,0x503F,INVALC,0x567E,INVALC,INVALC,INVALC,0x6F27, + INVALC,INVALC,INVALC,INVALC,0x2655,INVALC,0x2A3E,INVALC, + 0x3B58,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2E7D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A27, + INVALC,INVALC,INVALC,0x212C,0x223F,INVALC,0x2375,INVALC, + 0x2374,INVALC,INVALC,INVALC,INVALC,0x2658,0x2657,INVALC, + INVALC,INVALC,0x2656,INVALC,INVALC,INVALC,0x2A3F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3533,INVALC, + INVALC,INVALC,INVALC,0x3532,INVALC,INVALC,INVALC,0x3534, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B5A,0x3B59,INVALC, + INVALC,INVALC,INVALC,0x3B5B,INVALC,0x426A,INVALC,0x4269, + INVALC,INVALC,0x5040,INVALC,INVALC,INVALC,0x4A28,INVALC, + INVALC,INVALC,INVALC,0x5722,0x5721,INVALC,0x5C69,0x654B, + 0x6874,0x6875,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x215C,INVALC,INVALC,INVALC,INVALC,INVALC,0x2242, + 0x2378,0x2377,0x2376,INVALC,0x2241,0x2240,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2659,INVALC, + INVALC,0x237D,INVALC,0x2421,0x237E,0x265A,INVALC,INVALC, + 0x237A,INVALC,INVALC,INVALC,INVALC,0x2379,0x237B,0x2423, + INVALC,INVALC,INVALC,0x237C,0x2427,INVALC,INVALC,0x2424, + INVALC,INVALC,0x2422,0x2425,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x1300 */ + 0x2426,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x266E,0x2661,0x265F,0x266D,0x2668,INVALC,INVALC, + 0x2669,0x266C,INVALC,0x266B,INVALC,INVALC,INVALC,0x2662, + INVALC,0x265D,0x2664,INVALC,0x266F,INVALC,0x2665,INVALC, + INVALC,INVALC,0x2667,INVALC,0x2A4E,INVALC,0x265C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2666,0x265B,0x266A,INVALC, + INVALC,INVALC,0x265E,0x2663,0x2660,INVALC,INVALC,0x2A40, + INVALC,0x2A41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2A4B,0x2F23,0x2A4C,INVALC,0x2A4F,0x2A45,INVALC,0x2A47, + INVALC,0x2A48,INVALC,INVALC,0x2A4A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A46,0x2A42,INVALC,INVALC,INVALC, + 0x2A50,INVALC,0x2F21,0x2A49,INVALC,0x2E7E,0x2A44,0x2A4D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A51,0x2F22, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2A52,INVALC, + INVALC,INVALC,0x2A43,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2F26,0x2F28,INVALC,0x2F2A,INVALC,INVALC,0x3537,0x2F2E, + 0x2F25,INVALC,0x3535,INVALC,INVALC,INVALC,0x2F30,INVALC, + 0x3536,INVALC,0x2F27,INVALC,INVALC,0x2F2B,INVALC,0x2F2D, + INVALC,INVALC,INVALC,0x2F2C,0x2F2F,0x2F29,INVALC,INVALC, + INVALC,INVALC,0x2F24,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3539,0x3542,INVALC,INVALC,INVALC,INVALC,INVALC,0x3544, + INVALC,0x3B5D,0x353A,INVALC,INVALC,INVALC,0x3538,0x3546, + 0x3549,0x3B6C,INVALC,0x3547,0x3B61,INVALC,INVALC,INVALC, + 0x3541,0x3B5C,0x3545,INVALC,0x3B5E,0x3548,0x3B60,0x353D, + INVALC,INVALC,INVALC,0x353B,0x353C,INVALC,INVALC,INVALC, + INVALC,0x353F,INVALC,0x3543,INVALC,0x3540,INVALC,INVALC, + INVALC,INVALC,0x3B5F,INVALC,0x353E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B63,INVALC,INVALC,0x3B67,INVALC,0x426B, + 0x3B69,INVALC,INVALC,INVALC,0x3B6A,INVALC,0x3B6B,0x3B71, + /* Block 98, Array index 0x1400 */ + INVALC,INVALC,INVALC,0x3B6D,0x3B72,0x3B66,INVALC,INVALC, + INVALC,INVALC,0x3B64,0x3B73,INVALC,INVALC,INVALC,INVALC, + 0x3B70,INVALC,INVALC,0x3B68,0x3B62,INVALC,0x3B65,INVALC, + 0x3B6E,INVALC,INVALC,INVALC,INVALC,0x3B6F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A2A,0x4276,INVALC,0x426E,0x4A29,INVALC,0x4272,0x4274, + INVALC,INVALC,0x4271,INVALC,INVALC,INVALC,0x4270,INVALC, + INVALC,INVALC,INVALC,0x4A39,INVALC,INVALC,INVALC,INVALC, + 0x4277,0x4A2B,INVALC,INVALC,INVALC,0x426F,0x4273,INVALC, + INVALC,0x426C,0x426D,INVALC,INVALC,INVALC,INVALC,0x4275, + INVALC,INVALC,0x4A2F,0x4A30,0x4A35,INVALC,0x4A3C,INVALC, + INVALC,INVALC,INVALC,0x4A37,INVALC,INVALC,0x4A2C,INVALC, + INVALC,0x4A3B,INVALC,INVALC,INVALC,0x4A38,0x5051,INVALC, + INVALC,INVALC,0x4A3A,INVALC,0x4A32,INVALC,INVALC,INVALC, + INVALC,0x4A2D,0x4A31,0x4A2E,0x4A34,INVALC,INVALC,INVALC, + INVALC,0x5043,0x4A36,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A33,INVALC,INVALC,0x5042,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5047,INVALC,0x5041,0x572E,0x5050,INVALC,INVALC, + INVALC,INVALC,0x504D,0x5049,INVALC,INVALC,0x5725,INVALC, + INVALC,INVALC,INVALC,0x5048,INVALC,0x5723,INVALC,0x504C, + INVALC,0x504F,0x5046,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5724,INVALC,0x504E,INVALC,INVALC,0x504B,INVALC,0x504A, + 0x5045,0x5044,INVALC,0x5052,0x5727,0x5C6B,INVALC,INVALC, + 0x572D,INVALC,0x572B,INVALC,0x5C6C,INVALC,INVALC,0x572C, + INVALC,0x5729,INVALC,0x5C6A,INVALC,0x5726,0x5728,INVALC, + INVALC,INVALC,INVALC,INVALC,0x572A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x615B,INVALC, + 0x6153,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C72,0x6154, + 0x5C6E,INVALC,INVALC,INVALC,0x5C70,0x5C6F,INVALC,0x5C6D, + 0x5C71,0x615C,0x6158,0x615A,INVALC,0x6155,0x6156,INVALC, + 0x6159,0x6157,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6876,INVALC,0x654C,INVALC,0x6B5A,INVALC,INVALC, + /* Block 99, Array index 0x1500 */ + INVALC,0x6F28,INVALC,0x6F29,0x6F2A,INVALC,INVALC,0x722A, + INVALC,0x215D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2670,INVALC,INVALC,INVALC, + INVALC,0x2F31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4278,INVALC,INVALC,0x427A,0x427C,0x427B,INVALC,0x4A3E, + INVALC,0x4A3D,INVALC,0x4A3F,INVALC,0x5053,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2428,INVALC,INVALC,0x2671,INVALC,INVALC, + INVALC,INVALC,0x2A53,0x2A54,INVALC,INVALC,0x2F32,INVALC, + INVALC,INVALC,0x3B74,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x215E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2249,0x224B,INVALC,0x2243,INVALC,0x2244,INVALC, + 0x224A,0x2246,0x2248,INVALC,0x2245,0x224C,0x2247,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2432,0x242F,0x2437,INVALC,0x2438,INVALC,INVALC,0x2435, + INVALC,INVALC,0x2431,0x2430,INVALC,0x2436,INVALC,INVALC, + INVALC,0x2433,INVALC,0x2429,INVALC,INVALC,INVALC,0x242E, + 0x2434,INVALC,INVALC,INVALC,0x242A,INVALC,0x242B,0x242C, + INVALC,INVALC,INVALC,INVALC,0x242D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x267D,0x2676,INVALC,INVALC,0x2672,0x2679,0x267B, + 0x267E,INVALC,INVALC,0x267A,0x2673,INVALC,0x2677,INVALC, + 0x2721,INVALC,INVALC,0x267C,INVALC,INVALC,0x2675,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2678,INVALC,INVALC,INVALC,INVALC,0x2A55, + INVALC,0x2674,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A5B,INVALC,INVALC,INVALC,INVALC, + 0x2A67,INVALC,0x2F33,INVALC,INVALC,0x2A58,0x2A60,INVALC, + 0x2A5F,0x2A5C,0x2A64,0x2A66,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x1600 */ + 0x2A61,INVALC,INVALC,0x2A5A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2A57,0x2A5E,0x2A56,0x2A59,0x2A5D, + 0x2F34,INVALC,INVALC,0x2A62,0x2A63,0x2A65,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2F40,INVALC,INVALC,0x2F36,0x2F46,INVALC,INVALC, + INVALC,INVALC,0x354A,0x2F48,0x2F42,INVALC,0x2F39,INVALC, + 0x2F4B,0x2F3C,INVALC,0x3561,0x2F3F,INVALC,INVALC,INVALC, + 0x2F4D,0x2F41,INVALC,0x2F3A,0x2F37,0x2F38,INVALC,0x2F47, + 0x2F4E,INVALC,0x2F3E,0x2F3D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2F4A,INVALC,INVALC,0x2F44,INVALC,0x2F35,0x2F4C, + 0x2F43,0x2F45,0x2F49,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x354B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x355D,0x3559,0x3556, + 0x3568,INVALC,INVALC,INVALC,INVALC,0x355B,INVALC,INVALC, + 0x3563,INVALC,INVALC,INVALC,0x355F,0x354E,INVALC,INVALC, + INVALC,0x3565,0x354D,INVALC,INVALC,0x3564,INVALC,0x3557, + INVALC,INVALC,0x354C,INVALC,INVALC,0x3567,0x3555,INVALC, + 0x3558,0x3566,INVALC,INVALC,0x3B75,INVALC,INVALC,0x3553, + INVALC,INVALC,INVALC,INVALC,0x355C,0x3552,0x3550,0x3562, + INVALC,INVALC,INVALC,INVALC,0x3560,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3554,INVALC,0x3551,0x355E,0x355A, + 0x3B77,0x3B76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x354F,0x3C29,INVALC, + INVALC,INVALC,0x3C2F,0x3B7C,0x3C2C,0x427D,INVALC,0x3C30, + 0x3C33,INVALC,0x3C21,0x3C32,0x3C31,INVALC,0x3B78,INVALC, + INVALC,INVALC,INVALC,0x3C2E,INVALC,0x3C24,INVALC,0x3C35, + 0x3C2D,0x3C36,INVALC,INVALC,0x3C2B,0x3C2A,INVALC,0x3C28, + 0x3C22,INVALC,INVALC,INVALC,0x2F3B,0x3B79,INVALC,0x433D, + 0x3B7A,INVALC,INVALC,0x4321,INVALC,INVALC,INVALC,0x3B7B, + 0x3C34,0x427E,0x3C25,0x3B7E,INVALC,0x3C26,0x3C23,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4324,0x4337,0x433C,0x4330,INVALC,0x4341,INVALC, + 0x4322,INVALC,0x4323,INVALC,INVALC,0x432A,INVALC,INVALC, + 0x432B,INVALC,0x4338,0x433E,INVALC,INVALC,INVALC,0x4329, + 0x4325,0x4340,0x432E,0x432F,0x4326,0x433A,0x4331,0x433B, + 0x4333,INVALC,INVALC,0x4A40,INVALC,INVALC,0x433F,0x4336, + 0x4332,INVALC,INVALC,0x4327,INVALC,0x4335,INVALC,0x432D, + INVALC,0x432C,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A55, + 0x4339,0x4334,INVALC,0x4328,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A50,INVALC,0x4A41,0x4A4C,INVALC, + 0x4A53,INVALC,INVALC,0x4A51,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A58,INVALC,0x4A42,0x4A4F,0x4A43,0x4A4E,INVALC, + 0x4A52,0x3C27,INVALC,INVALC,INVALC,0x4A59,0x4A4A,INVALC, + 0x5061,INVALC,INVALC,0x4A57,0x4A56,INVALC,0x5054,INVALC, + 0x5055,INVALC,0x4A46,0x4A47,0x4A44,0x4A49,0x4A45,0x4A5A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A48,INVALC,0x4A54, + INVALC,INVALC,0x4A4D,INVALC,INVALC,0x5058,INVALC,INVALC, + INVALC,0x5735,0x505D,0x505C,0x505E,INVALC,INVALC,0x505B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5056,0x5059, + 0x5063,INVALC,INVALC,INVALC,0x505A,0x3B7D,INVALC,0x5060, + 0x5057,INVALC,INVALC,0x505F,INVALC,INVALC,0x4A4B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5062,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5734,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5736,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5733,INVALC,INVALC,INVALC,INVALC,INVALC,0x5732, + 0x5731,INVALC,INVALC,INVALC,INVALC,INVALC,0x5730,0x572F, + INVALC,0x5739,INVALC,0x5737,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C75,0x5C77,INVALC,INVALC,INVALC, + 0x5C78,0x5C74,INVALC,0x5C76,INVALC,INVALC,INVALC,0x5C73, + INVALC,INVALC,INVALC,0x5738,INVALC,INVALC,INVALC,INVALC, + 0x6160,INVALC,INVALC,INVALC,0x6163,0x615F,INVALC,0x615D, + /* Block 102, Array index 0x1800 */ + INVALC,0x6161,INVALC,0x6162,0x615E,INVALC,INVALC,0x654D, + INVALC,0x6550,INVALC,INVALC,0x6551,0x654F,0x6552,INVALC, + 0x654E,INVALC,INVALC,0x687A,INVALC,0x6879,0x6878,0x6877, + INVALC,INVALC,INVALC,0x6B5B,INVALC,INVALC,INVALC,INVALC, + 0x6D4F,0x6D4E,0x6D51,INVALC,INVALC,0x6F2C,0x6D50,INVALC, + INVALC,0x6F2B,INVALC,INVALC,INVALC,0x7037,0x707D,INVALC, + INVALC,INVALC,0x3C37,0x573A,INVALC,INVALC,INVALC,0x224D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2722,INVALC,INVALC, + INVALC,0x2A68,INVALC,0x2A69,INVALC,INVALC,0x2F50,INVALC, + INVALC,INVALC,0x2F4F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3569,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C3B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C3A,0x3C3D,INVALC,0x3C38, + 0x3C3C,INVALC,0x3C39,INVALC,INVALC,INVALC,INVALC,0x4342, + INVALC,INVALC,INVALC,0x4A5B,INVALC,INVALC,0x5064,INVALC, + INVALC,0x5066,0x5065,0x5067,0x573C,INVALC,INVALC,0x573B, + 0x5C7A,0x5C79,INVALC,INVALC,0x6553,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C3E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4343,INVALC,0x6164,INVALC,0x6F2D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C3F,0x3C40,INVALC, + 0x4A5C,INVALC,0x573D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2723,INVALC,0x2A6A,INVALC,INVALC,INVALC,0x3C41,INVALC, + INVALC,INVALC,0x5068,0x5069,INVALC,INVALC,0x5C7B,INVALC, + 0x707E,INVALC,INVALC,0x2724,INVALC,INVALC,INVALC,0x2A6B, + INVALC,INVALC,0x2F54,0x2F52,0x2F53,INVALC,0x2F51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x356A,INVALC,INVALC, + 0x3C42,INVALC,0x3C43,0x4344,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C7C,0x6165,INVALC,0x6555,0x6554,0x687B, + INVALC,0x213E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x224F,0x224E, + 0x2439,INVALC,0x243C,0x243B,0x243A,0x243D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x272A,0x2726,0x272F,INVALC,INVALC, + /* Block 103, Array index 0x1900 */ + INVALC,INVALC,INVALC,0x272B,0x2727,0x272E,INVALC,INVALC, + 0x2729,0x2725,INVALC,0x272C,INVALC,0x272D,INVALC,INVALC, + 0x2731,0x2730,0x2728,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2A70,0x2A76,INVALC,INVALC, + INVALC,0x2A6D,0x2A72,INVALC,INVALC,INVALC,0x2A71,INVALC, + INVALC,INVALC,INVALC,0x2A74,INVALC,INVALC,0x2A79,INVALC, + INVALC,INVALC,0x2A6E,0x2A73,0x2A77,0x2A6F,0x2A6C,INVALC, + INVALC,0x2A78,0x2A75,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2F57, + INVALC,INVALC,0x2F55,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2F58,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x356E,INVALC,0x356D,0x356F,INVALC,INVALC,0x2F56, + INVALC,0x356C,0x3570,INVALC,INVALC,0x356B,INVALC,INVALC, + INVALC,INVALC,0x3C4A,INVALC,0x3C45,INVALC,INVALC,INVALC, + INVALC,0x3C48,0x3C4B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x434D,0x3C49,INVALC,0x3C46,0x3C44,INVALC,INVALC,INVALC, + 0x3C47,INVALC,INVALC,INVALC,INVALC,INVALC,0x4345,INVALC, + INVALC,INVALC,0x434A,0x4349,0x4346,INVALC,INVALC,INVALC, + 0x4348,INVALC,INVALC,INVALC,0x434C,0x4347,INVALC,INVALC, + INVALC,0x434B,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A5F, + 0x4A5E,0x4A5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x506C,0x506F,INVALC,INVALC,INVALC,INVALC,0x5070, + 0x506B,INVALC,0x506D,INVALC,INVALC,0x506A,INVALC,0x506E, + INVALC,INVALC,0x5746,0x5745,INVALC,0x5744,0x573F,INVALC, + 0x5740,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x573E,INVALC,0x5741,0x5742,0x5747,INVALC,INVALC,0x5743, + INVALC,INVALC,0x5C7D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6168,INVALC,0x6166,0x6167,INVALC,INVALC,0x6556,INVALC, + INVALC,INVALC,INVALC,0x687D,0x687E,INVALC,INVALC,INVALC, + 0x687C,INVALC,INVALC,0x6F2E,INVALC,0x7038,0x7039,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2732,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x1A00 */ + INVALC,0x3C4C,INVALC,INVALC,0x4A61,0x4A60,INVALC,INVALC, + INVALC,INVALC,0x2733,INVALC,INVALC,INVALC,INVALC,0x2A7A, + 0x2A7B,INVALC,0x2F59,0x2F5A,INVALC,INVALC,INVALC,INVALC, + 0x3571,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x434E,0x4641,0x4A62,0x5748,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2257,INVALC,INVALC,INVALC,INVALC, + 0x2252,0x2251,0x2254,0x2253,0x2256,INVALC,0x2250,0x2255, + INVALC,INVALC,INVALC,INVALC,INVALC,0x243E,INVALC,0x243F, + 0x2443,INVALC,INVALC,0x2447,0x2442,0x2445,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2441,INVALC,INVALC, + INVALC,0x2440,0x2446,INVALC,INVALC,0x2444,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2735,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x273D,INVALC,0x2738,INVALC, + 0x2747,0x2748,0x2740,0x2739,INVALC,0x2745,INVALC,INVALC, + INVALC,0x2746,INVALC,0x2744,0x273C,0x2734,0x273B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x273F,0x273E,0x2736,INVALC, + INVALC,0x2742,0x2737,INVALC,0x2749,INVALC,INVALC,INVALC, + 0x273A,0x2743,INVALC,INVALC,INVALC,INVALC,INVALC,0x2741, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B3D,INVALC, + INVALC,INVALC,0x2B38,0x2B2E,INVALC,0x2B2C,INVALC,0x2B27, + INVALC,0x2B34,0x2B21,0x2B23,INVALC,INVALC,INVALC,INVALC, + 0x2B26,0x2A7C,0x2B33,0x2B43,INVALC,0x2B28,0x2B3A,INVALC, + 0x2A7E,0x2B41,0x2B42,0x2B45,0x2B3C,0x2B2D,0x2B35,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2B25,INVALC,INVALC,0x2B3F,0x2B22,INVALC,INVALC,0x2B2B, + INVALC,INVALC,INVALC,0x2B32,0x2B2A,INVALC,0x2B3E,0x2B36, + INVALC,INVALC,0x2B44,0x2B29,INVALC,0x2B3B,0x2B31,INVALC, + 0x2B37,INVALC,0x2A7D,INVALC,INVALC,INVALC,0x2B30,0x2B2F, + 0x2B24,INVALC,0x2B40,INVALC,0x2B39,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2F6E,INVALC,0x2F6F,INVALC,0x2F63,INVALC, + INVALC,INVALC,0x2F5C,INVALC,0x2F65,0x2F6D,INVALC,0x2F5B, + 0x2F76,INVALC,INVALC,INVALC,INVALC,0x2F75,0x2F70,INVALC, + 0x2F71,INVALC,INVALC,0x2F67,INVALC,0x2F68,0x2F72,0x2F69, + INVALC,0x2F64,0x2F5E,0x2F5F,0x2F6C,0x2F66,INVALC,INVALC, + INVALC,INVALC,0x2F74,0x2F60,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2F6B,INVALC,INVALC,INVALC, + INVALC,0x2F5D,INVALC,0x2F61,INVALC,0x2F73,0x2F6A,0x2F62, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3628,INVALC,0x3576,0x3577,0x357B, + INVALC,0x362C,0x3629,INVALC,0x3622,0x3621,INVALC,0x3625, + 0x3634,0x3572,INVALC,0x3635,0x3627,0x3639,0x362D,INVALC, + 0x362B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3573, + INVALC,0x3632,0x3638,0x3630,0x3637,INVALC,INVALC,0x3624, + 0x3574,0x3636,0x3626,INVALC,INVALC,INVALC,0x362F,INVALC, + INVALC,INVALC,INVALC,0x362E,0x3575,INVALC,INVALC,INVALC, + 0x3631,INVALC,INVALC,0x357C,0x3633,INVALC,INVALC,INVALC, + INVALC,0x357E,0x362A,0x3579,0x357D,INVALC,0x3578,INVALC, + INVALC,INVALC,0x3623,INVALC,0x3C63,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C66,0x3C7C, + 0x3C71,INVALC,INVALC,INVALC,0x3C60,INVALC,0x3C70,INVALC, + 0x3C69,0x3C76,INVALC,0x3C4E,0x3C78,INVALC,0x3C56,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C50,0x3C72,0x3C73,INVALC, + INVALC,0x3C5E,INVALC,INVALC,0x3C59,INVALC,0x3C74,INVALC, + 0x3C6C,0x3C79,0x3C53,0x3C58,0x3C52,INVALC,INVALC,0x3C65, + 0x4364,0x3C54,INVALC,0x3C5D,0x3C75,INVALC,0x3C5A,0x3C57, + 0x3C68,INVALC,INVALC,INVALC,0x3C6B,0x3C6A,INVALC,INVALC, + /* Block 106, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,0x3C4F,INVALC,0x3C77,0x3C5F, + 0x3C61,INVALC,0x3C6E,0x3C6D,0x3C4D,INVALC,INVALC,0x3C55, + 0x3C5C,0x3C64,INVALC,0x3C5B,0x3C67,0x3C7A,INVALC,0x3C6F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C7B,INVALC,INVALC, + INVALC,INVALC,0x3C51,INVALC,INVALC,INVALC,INVALC,0x4378, + INVALC,INVALC,0x4376,0x4361,0x4366,0x435F,INVALC,0x4372, + 0x4351,0x4358,INVALC,0x4370,0x437A,0x4362,INVALC,0x4355, + 0x4368,0x436D,0x4359,INVALC,0x436A,0x4356,INVALC,INVALC, + 0x435D,0x435E,INVALC,0x4371,0x436F,INVALC,0x4352,0x4374, + INVALC,0x4375,0x4377,INVALC,INVALC,INVALC,0x357A,0x435A, + 0x436C,0x435B,INVALC,INVALC,0x4373,INVALC,INVALC,0x4350, + INVALC,INVALC,0x4353,INVALC,INVALC,0x4363,0x434F,INVALC, + INVALC,0x4367,0x4357,INVALC,0x4360,INVALC,INVALC,0x4369, + 0x3C62,0x4354,INVALC,INVALC,0x436E,INVALC,0x436B,INVALC, + 0x4365,INVALC,0x435C,0x4379,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x452C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A70,0x4A6E,INVALC, + 0x4B26,0x4A6C,INVALC,0x4A7E,INVALC,INVALC,0x4A68,0x4B25, + INVALC,0x4A6D,0x4A7B,INVALC,INVALC,INVALC,0x4B23,INVALC, + 0x4A66,0x4B22,INVALC,INVALC,0x4A77,0x4B29,INVALC,0x4A6F, + INVALC,0x4A71,0x4B21,INVALC,0x4A6A,INVALC,INVALC,0x4A73, + 0x4A69,0x4A63,INVALC,0x4A7D,INVALC,0x4B28,0x4A64,INVALC, + INVALC,0x4A79,INVALC,INVALC,0x4A6B,0x4A76,0x4A72,0x4A74, + INVALC,INVALC,0x4B27,INVALC,0x4A75,INVALC,0x4B2A,INVALC, + INVALC,0x4A65,0x4A7A,INVALC,INVALC,INVALC,0x4A67,0x4A7C, + INVALC,INVALC,INVALC,INVALC,0x4A78,INVALC,INVALC,INVALC, + INVALC,0x4B24,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x507C,INVALC,0x5078,0x5074,0x512A,0x5127, + INVALC,INVALC,INVALC,0x512E,0x507B,INVALC,0x5124,INVALC, + INVALC,0x5077,0x5123,INVALC,0x5137,INVALC,0x5134,0x5126, + 0x5075,INVALC,INVALC,0x512B,0x512D,INVALC,0x5121,0x507A, + /* Block 107, Array index 0x1D00 */ + 0x5071,INVALC,INVALC,INVALC,0x5130,INVALC,0x5072,0x5136, + 0x5129,0x512F,INVALC,INVALC,INVALC,0x512C,INVALC,0x5133, + INVALC,INVALC,INVALC,INVALC,0x5125,0x5076,0x5138,0x5073, + 0x5131,INVALC,INVALC,0x507D,INVALC,0x507E,INVALC,INVALC, + 0x5079,INVALC,INVALC,INVALC,INVALC,0x5132,0x5135,0x5122, + 0x5755,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x574D,INVALC,0x5749,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5757,0x5762,INVALC,0x574F,0x5758, + 0x5128,0x5759,INVALC,INVALC,INVALC,INVALC,0x5768,INVALC, + INVALC,0x574B,INVALC,INVALC,INVALC,0x5766,0x5767,0x575D, + 0x575C,0x5754,INVALC,INVALC,0x575E,0x5765,0x5764,INVALC, + INVALC,INVALC,0x5756,0x5753,INVALC,0x5750,0x5763,INVALC, + 0x5761,INVALC,INVALC,INVALC,0x575B,INVALC,0x574A,0x574C, + 0x574E,0x5760,0x575A,INVALC,INVALC,0x5751,INVALC,0x575F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5752,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D31, + INVALC,0x5D22,INVALC,0x5D2D,INVALC,0x5D34,INVALC,0x5D29, + INVALC,0x5D24,INVALC,INVALC,0x5D35,0x5C7E,0x5D2B,INVALC, + INVALC,0x5D30,0x5D36,0x5D2A,INVALC,0x5D2C,0x5D21,INVALC, + INVALC,INVALC,0x5D33,0x5D26,INVALC,INVALC,0x5D28,0x5D25, + INVALC,0x5D27,INVALC,INVALC,0x5D2F,0x5D23,0x5D32,INVALC, + 0x5D2E,INVALC,INVALC,INVALC,INVALC,0x6173,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6172,INVALC,0x616F,0x6170, + INVALC,0x616A,0x616E,INVALC,INVALC,0x616B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6169,0x616D,0x6171, + INVALC,INVALC,INVALC,0x655C,0x6559,0x6562,INVALC,0x6561, + 0x655F,0x655A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x655B,INVALC,INVALC,0x655E,INVALC,0x6563,0x655D, + 0x6558,0x616C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6557, + 0x6924,INVALC,0x6923,0x6560,INVALC,INVALC,0x6927,0x6928, + 0x6922,0x6926,INVALC,0x6921,INVALC,INVALC,INVALC,INVALC, + 0x6B5F,0x6925,INVALC,INVALC,0x6B5D,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x1E00 */ + 0x6B60,INVALC,0x6B5C,0x6B5E,INVALC,INVALC,INVALC,INVALC, + 0x6D53,0x6D54,INVALC,0x6D52,INVALC,INVALC,INVALC,0x6F31, + INVALC,0x6F2F,0x6F30,0x703A,INVALC,INVALC,INVALC,0x7123, + 0x7121,0x7122,0x7124,INVALC,INVALC,INVALC,0x722B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x274A,INVALC,INVALC, + 0x2B46,INVALC,INVALC,INVALC,0x2F77,0x2F79,INVALC,0x2F78, + INVALC,0x2F7A,INVALC,0x363B,0x2F7B,INVALC,0x363A,0x363C, + 0x363D,0x3C7D,INVALC,0x3C7E,0x3D22,INVALC,INVALC,0x3D21, + INVALC,0x4422,0x437E,0x437D,INVALC,0x437C,0x437B,INVALC, + 0x4421,INVALC,0x4B2B,0x4B2D,INVALC,0x4B2C,INVALC,INVALC, + INVALC,0x5139,INVALC,INVALC,0x576A,0x5769,0x576B,INVALC, + INVALC,INVALC,INVALC,0x5D37,INVALC,INVALC,0x6174,INVALC, + 0x6564,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2F7C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5259,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x274C,INVALC, + 0x274B,INVALC,0x2B47,INVALC,0x2B48,INVALC,INVALC,INVALC, + 0x2F7E,INVALC,INVALC,INVALC,0x3642,0x3640,0x3641,0x363F, + INVALC,0x363E,INVALC,INVALC,0x3D23,0x3D26,INVALC,0x3D24, + INVALC,0x3D25,INVALC,0x4423,INVALC,INVALC,0x4B2E,0x4B2F, + 0x4B30,INVALC,0x513C,0x513B,INVALC,0x513A,0x513D,0x576C, + INVALC,INVALC,0x576D,0x576E,INVALC,0x5D38,INVALC,INVALC, + 0x6565,INVALC,INVALC,0x213F,INVALC,INVALC,0x2B49,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D27,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B31,0x4B32,INVALC,INVALC,0x5770, + 0x576F,0x6175,0x6F32,INVALC,0x2140,INVALC,INVALC,INVALC, + 0x2448,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B4A,INVALC, + 0x2B4B,INVALC,INVALC,INVALC,INVALC,INVALC,0x274D,INVALC, + 0x2B4C,INVALC,0x3025,0x3024,0x3022,INVALC,0x3021,0x3026, + 0x3023,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D28,INVALC,0x3D29,0x3D2A,INVALC,INVALC,INVALC,0x4427, + 0x4428,0x4426,INVALC,0x4424,0x4425,INVALC,0x4B33,0x5140, + /* Block 109, Array index 0x1F00 */ + 0x513F,0x513E,0x5141,0x5772,0x5771,INVALC,0x5773,INVALC, + INVALC,0x5D39,INVALC,0x6176,0x6566,0x6D55,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2141,0x215F,INVALC,INVALC, + 0x2258,0x2449,0x244A,INVALC,INVALC,0x274E,INVALC,INVALC, + 0x2B4D,0x2B4E,INVALC,INVALC,INVALC,0x3027,INVALC,INVALC, + INVALC,INVALC,0x3643,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D2B,INVALC,INVALC,INVALC,INVALC,INVALC,0x2160,INVALC, + INVALC,INVALC,INVALC,0x2163,INVALC,INVALC,INVALC,0x2162, + INVALC,INVALC,INVALC,0x2161,INVALC,INVALC,0x2259,INVALC, + INVALC,INVALC,0x225D,0x225F,0x2260,INVALC,INVALC,0x225C, + INVALC,INVALC,0x225A,INVALC,0x225E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x225B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x245B,0x2459,0x244C, + INVALC,0x2453,INVALC,0x244D,INVALC,0x2455,INVALC,0x2452, + INVALC,0x2451,INVALC,0x245A,INVALC,INVALC,INVALC,INVALC, + 0x244B,INVALC,INVALC,0x245C,INVALC,INVALC,INVALC,INVALC, + 0x2765,INVALC,INVALC,INVALC,0x244E,INVALC,INVALC,0x2456, + INVALC,INVALC,0x2763,0x244F,INVALC,INVALC,0x245D,0x2450, + INVALC,INVALC,INVALC,0x274F,INVALC,0x2457,INVALC,INVALC, + INVALC,INVALC,0x2454,INVALC,0x2458,0x2764,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2756,INVALC,INVALC, + 0x276B,INVALC,INVALC,INVALC,0x2762,INVALC,0x2754,0x2758, + INVALC,INVALC,0x275B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2767,INVALC,0x275A,0x275C,INVALC,INVALC,0x275D,0x276A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2769,INVALC,0x276D, + 0x2759,0x276F,0x2760,INVALC,0x2755,INVALC,INVALC,INVALC, + INVALC,0x2753,0x2B57,INVALC,INVALC,0x2761,0x2766,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2757, + INVALC,0x276E,INVALC,0x2751,0x2750,0x275E,0x2752,INVALC, + INVALC,INVALC,0x275F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x276C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x2000 */ + 0x2B5E,0x2B61,INVALC,0x2B64,0x2B59,INVALC,INVALC,0x2B67, + 0x2B6A,0x2B6C,0x2B56,INVALC,INVALC,0x302C,INVALC,0x2B65, + 0x2B6D,0x2B5D,0x2B55,INVALC,INVALC,INVALC,0x3047,INVALC, + 0x2B62,0x2B5A,0x2B5C,INVALC,INVALC,0x2B5F,INVALC,0x2B52, + 0x2B68,INVALC,0x2B6B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2B4F,INVALC,INVALC,INVALC,0x2B69,0x2B51,INVALC,0x3041, + 0x2768,INVALC,INVALC,0x2B58,0x2B50,INVALC,INVALC,0x2B63, + INVALC,INVALC,0x2B5B,INVALC,0x2B53,INVALC,INVALC,0x2B54, + 0x2B66,INVALC,0x2B60,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x302F,INVALC,INVALC,INVALC,INVALC,INVALC,0x3038,0x303E, + 0x303A,0x302D,0x3030,0x3029,0x302A,INVALC,INVALC,0x3039, + 0x3042,INVALC,INVALC,INVALC,INVALC,0x3031,INVALC,0x3032, + 0x303C,INVALC,INVALC,INVALC,INVALC,0x304B,0x302B,INVALC, + INVALC,INVALC,0x3028,0x3049,0x303D,0x304A,0x3044,0x3036, + 0x3045,INVALC,0x303F,0x3048,0x3046,INVALC,0x3037,INVALC, + INVALC,INVALC,INVALC,0x3043,INVALC,0x3034,INVALC,INVALC, + 0x304C,0x3033,0x302E,INVALC,INVALC,INVALC,INVALC,0x303B, + 0x3040,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3645,0x3649,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3647,0x3646,INVALC,INVALC,0x364C, + INVALC,INVALC,0x365E,0x366A,INVALC,0x365B,0x3654,INVALC, + 0x3644,INVALC,0x3660,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3650,0x3662,0x365A,INVALC,INVALC,0x3668,INVALC,0x3661, + 0x3663,INVALC,INVALC,0x3665,0x364E,0x365F,0x3653,0x3667, + INVALC,INVALC,INVALC,0x3658,0x3656,0x3657,INVALC,0x3652, + 0x3651,INVALC,0x364B,0x3669,INVALC,0x3655,INVALC,INVALC, + INVALC,0x364A,INVALC,INVALC,INVALC,0x365C,INVALC,0x3035, + 0x365D,INVALC,0x3664,INVALC,0x3659,INVALC,0x364D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D2C,0x3666,INVALC,INVALC, + /* Block 111, Array index 0x2100 */ + 0x364F,INVALC,INVALC,0x3D41,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D3B,INVALC,INVALC,0x3D2F, + INVALC,INVALC,0x3D4D,INVALC,INVALC,INVALC,INVALC,0x3D51, + 0x3D48,INVALC,INVALC,0x3D36,INVALC,INVALC,0x3D42,INVALC, + 0x3D4E,0x3D47,INVALC,0x3D3C,INVALC,0x3D59,0x3D5A,INVALC, + INVALC,0x3D4C,INVALC,0x3D40,0x3D32,0x3D33,INVALC,0x3D37, + 0x3D3E,0x3D38,INVALC,INVALC,INVALC,0x3D34,0x3D2D,0x3D2E, + INVALC,0x3D30,INVALC,0x3D3D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D3F,0x3D57,0x3D4F,INVALC,0x3D55,INVALC,INVALC, + INVALC,INVALC,0x3D5B,INVALC,0x3D45,0x3D39,0x3D43,INVALC, + 0x3D49,0x3D46,0x3D35,INVALC,0x3D53,0x3D50,0x3D58,INVALC, + 0x3D44,INVALC,INVALC,0x3D4B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D4A,INVALC,0x3D3A,0x3648,INVALC,INVALC,0x3D54, + 0x3D52,0x3D56,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D31,INVALC,INVALC,INVALC,INVALC,0x4447,0x4446,0x442C, + INVALC,INVALC,0x4445,0x442F,0x4430,INVALC,INVALC,0x444E, + INVALC,0x4444,INVALC,0x4429,INVALC,INVALC,0x4438,0x442E, + 0x4431,0x4449,INVALC,0x4450,0x4448,INVALC,0x443D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x444F,INVALC, + 0x443B,0x4432,0x443F,0x444B,INVALC,INVALC,INVALC,0x443A, + INVALC,0x4433,INVALC,INVALC,INVALC,0x4436,0x4440,0x444A, + 0x442D,0x4437,INVALC,0x4441,INVALC,INVALC,0x4434,INVALC, + 0x442B,0x4439,0x444D,INVALC,INVALC,0x443C,0x4B34,0x443E, + 0x444C,INVALC,0x4435,INVALC,INVALC,INVALC,0x442A,INVALC, + 0x4443,INVALC,INVALC,INVALC,0x4442,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B50,INVALC,0x4B45,0x4B4A,INVALC, + INVALC,0x4B36,INVALC,INVALC,INVALC,0x4B35,0x4B56,INVALC, + 0x4B39,0x4B49,INVALC,0x4B3B,0x4B59,0x4B55,INVALC,INVALC, + /* Block 112, Array index 0x2200 */ + 0x515B,INVALC,INVALC,0x4B37,INVALC,0x4B54,INVALC,0x4B51, + 0x4B5E,0x4B3D,0x4B46,INVALC,INVALC,0x4B5C,0x4B52,INVALC, + INVALC,INVALC,0x4B44,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4B42,0x4B3F,0x4B40,INVALC,0x4B58,INVALC,0x4B5D,0x4B5B, + INVALC,0x4B5F,INVALC,INVALC,INVALC,0x4B38,0x5143,0x4B41, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B4B,0x4B3C,INVALC, + 0x4B4D,INVALC,INVALC,INVALC,INVALC,0x4B4F,0x4B47,0x4B3A, + INVALC,0x4B57,0x4B5A,0x4B43,0x4B4E,INVALC,INVALC,INVALC, + 0x4B4C,0x5142,INVALC,0x4B53,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B3E,0x514C, + 0x5156,INVALC,0x5155,0x5161,INVALC,0x5153,INVALC,0x5157, + INVALC,INVALC,0x514E,INVALC,INVALC,0x515A,0x577B,INVALC, + INVALC,0x515C,0x514B,0x5166,INVALC,INVALC,INVALC,0x515F, + INVALC,0x5163,0x5168,0x515D,0x5151,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5154,0x4B48,INVALC,INVALC,0x5150,0x5167, + INVALC,INVALC,INVALC,0x5169,INVALC,0x515E,0x5144,0x5164, + INVALC,INVALC,0x5152,INVALC,INVALC,0x514D,INVALC,0x5145, + INVALC,0x5149,INVALC,0x5162,0x514A,0x5148,INVALC,INVALC, + 0x5160,INVALC,0x5147,0x5159,0x5158,0x5165,0x514F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x577E,INVALC, + INVALC,INVALC,0x582C,0x5776,INVALC,0x5824,INVALC,INVALC, + 0x5822,0x5D3B,0x5828,0x582E,0x5827,0x5774,0x5825,0x5830, + 0x5832,INVALC,0x5831,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x582B,INVALC,0x5826,INVALC,0x5778,0x577D,INVALC,0x582A, + INVALC,INVALC,INVALC,INVALC,0x577C,INVALC,0x5146,0x5777, + 0x577A,0x582D,0x5821,0x5775,0x5D3A,0x582F,0x5779,0x5829, + INVALC,INVALC,INVALC,INVALC,0x5D3D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D3F,0x5D45,0x5D43,INVALC, + INVALC,INVALC,0x5D46,0x5D3E,INVALC,INVALC,0x5D42,0x5D41, + 0x5D47,INVALC,INVALC,INVALC,INVALC,0x5D40,INVALC,INVALC, + INVALC,INVALC,0x5D44,INVALC,0x5D3C,INVALC,INVALC,0x6225, + INVALC,INVALC,INVALC,0x6222,0x6224,INVALC,INVALC,0x617E, + /* Block 113, Array index 0x2300 */ + 0x6221,0x617A,INVALC,INVALC,0x5823,0x617B,INVALC,0x6177, + INVALC,INVALC,0x6226,INVALC,0x6178,0x6179,0x617D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x617C,INVALC,0x656A,0x6570, + INVALC,0x6567,INVALC,INVALC,0x6572,INVALC,INVALC,INVALC, + 0x6569,0x656C,0x656D,0x656E,0x6571,INVALC,0x6223,0x6568, + INVALC,0x656F,0x6934,0x656B,INVALC,INVALC,INVALC,0x692B, + INVALC,0x692E,INVALC,0x6937,0x692D,0x692A,INVALC,0x692C, + 0x6930,0x6933,0x6932,0x6936,0x6929,INVALC,INVALC,0x6931, + 0x6935,0x6938,0x692F,0x6B61,0x6B62,0x6B66,0x6B67,INVALC, + 0x6B64,0x6B65,0x6B63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D59,INVALC,INVALC,0x6D56,0x6D57,0x6D58, + INVALC,INVALC,0x6F34,0x6F33,INVALC,0x703D,INVALC,0x703B, + 0x703E,0x703C,0x7125,INVALC,INVALC,0x7171,0x715B,INVALC, + 0x7170,0x723E,0x723F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2261,INVALC,INVALC,0x245E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x245F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2778,0x277A,0x2775,0x2772,0x2774,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2776,INVALC,0x2773,0x2770,INVALC,0x2777,INVALC, + 0x2771,INVALC,0x2779,INVALC,INVALC,INVALC,INVALC,0x2B6F, + INVALC,0x2B73,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2B76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2B72,0x2B71,INVALC,INVALC,0x2B74,0x2B75,INVALC,0x2B6E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2B70,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x305A,0x305B,0x305C, + INVALC,INVALC,INVALC,0x3051,INVALC,0x3059,0x305E,INVALC, + INVALC,0x304F,0x3055,0x304E,0x3058,INVALC,INVALC,0x3054, + INVALC,INVALC,0x305D,INVALC,0x304D,0x3050,0x3056,INVALC, + 0x3057,0x305F,0x3053,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3671,INVALC,INVALC,0x3673,0x366F,INVALC,0x367B,0x366D, + 0x367A,INVALC,0x366B,0x3D5F,0x3675,INVALC,INVALC,0x3676, + /* Block 114, Array index 0x2400 */ + 0x3679,INVALC,0x367D,INVALC,0x3672,INVALC,0x3677,INVALC, + INVALC,INVALC,INVALC,0x367C,0x3670,0x366C,0x367E,INVALC, + 0x3674,INVALC,INVALC,0x3678,INVALC,INVALC,INVALC,0x366E, + INVALC,INVALC,INVALC,0x3D69,INVALC,INVALC,0x3D5D,0x3D66, + 0x3D5C,INVALC,0x3D64,0x3D62,INVALC,0x3D63,INVALC,INVALC, + 0x3D67,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D60,0x3D5E, + INVALC,0x3D61,0x3D65,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3D68,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4456,0x445D,0x445F,0x4465,INVALC,INVALC,0x4451, + INVALC,INVALC,INVALC,0x4460,INVALC,0x4466,INVALC,INVALC, + 0x4463,INVALC,0x4453,0x4464,0x4452,INVALC,INVALC,INVALC, + 0x445E,INVALC,0x4467,INVALC,INVALC,0x4457,INVALC,0x4462, + 0x4455,0x445C,0x4458,0x4454,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x445B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4461,INVALC,0x4459,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x445A,INVALC,INVALC,0x4B67,INVALC,INVALC,INVALC,INVALC, + 0x4B63,0x4B69,0x4B65,INVALC,INVALC,0x4B64,0x4B68,0x4B60, + INVALC,0x4B62,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B66, + 0x4B61,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B6A, + INVALC,INVALC,0x516F,0x516C,0x5178,0x5172,0x5174,INVALC, + 0x516E,0x5176,INVALC,INVALC,0x5175,0x5173,INVALC,0x5179, + INVALC,0x5170,0x5177,INVALC,INVALC,INVALC,INVALC,0x516B, + 0x516D,INVALC,0x516A,0x517A,INVALC,0x5171,INVALC,INVALC, + 0x5836,INVALC,INVALC,INVALC,0x5841,0x583F,INVALC,0x5835, + 0x5838,0x5839,0x5834,INVALC,INVALC,0x5833,0x5842,0x583D, + INVALC,INVALC,0x583C,0x583A,INVALC,INVALC,INVALC,0x583E, + INVALC,INVALC,INVALC,INVALC,0x583B,INVALC,0x5837,INVALC, + 0x5840,INVALC,0x5843,0x5844,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D48,0x5D4E,INVALC,0x5D4C,INVALC,INVALC,INVALC, + 0x5D4A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D4D,0x5D49,0x5D4B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6229,INVALC,INVALC,INVALC,0x622B,INVALC,0x6228, + /* Block 115, Array index 0x2500 */ + INVALC,0x6227,0x6576,0x622A,INVALC,0x6577,INVALC,0x6575, + INVALC,INVALC,0x6574,INVALC,0x6573,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6939,0x693A,INVALC,INVALC,INVALC, + INVALC,0x6B6A,0x6B69,INVALC,INVALC,0x6B68,0x6D5A,0x6D5B, + INVALC,INVALC,0x6F35,0x703F,INVALC,INVALC,0x7126,0x722C, + INVALC,0x7240,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2142, + INVALC,0x2B77,0x3060,INVALC,0x4B6B,INVALC,INVALC,INVALC, + INVALC,0x2B78,0x2B79,0x3D6A,INVALC,INVALC,INVALC,0x4468, + INVALC,INVALC,INVALC,0x4B6C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3D6B,INVALC,INVALC,INVALC,0x2262,INVALC, + INVALC,INVALC,INVALC,0x2460,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x277B,INVALC,0x2B7A,INVALC,0x2B7D,INVALC, + 0x2B7B,INVALC,INVALC,0x2B7C,INVALC,INVALC,0x3063,0x3062, + 0x3061,INVALC,INVALC,0x3722,0x3723,INVALC,0x3721,0x3724, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D6F,0x3D6E,INVALC, + 0x3D6C,0x3D6D,INVALC,0x3D70,0x446A,0x4469,0x446D,INVALC, + 0x446C,0x446B,INVALC,0x4B6F,INVALC,0x4B6E,INVALC,0x4B6D, + 0x517B,INVALC,0x517C,INVALC,INVALC,0x5845,0x5846,INVALC, + INVALC,0x657C,INVALC,0x657B,0x657A,0x6578,0x6579,INVALC, + 0x693B,0x6D5C,0x7127,INVALC,INVALC,INVALC,0x2164,INVALC, + 0x2165,INVALC,INVALC,INVALC,0x2263,0x2264,INVALC,INVALC, + INVALC,INVALC,0x2466,INVALC,INVALC,0x2462,INVALC,0x2461, + INVALC,0x2465,INVALC,0x2463,INVALC,0x2467,0x2464,INVALC, + INVALC,0x2821,0x2B7E,0x277D,0x2826,INVALC,INVALC,INVALC, + INVALC,0x2827,0x2823,INVALC,0x2824,INVALC,0x277C,INVALC, + 0x277E,INVALC,0x2825,INVALC,0x2822,INVALC,INVALC,0x2C24, + INVALC,INVALC,INVALC,0x2C27,0x2C21,INVALC,0x2C26,INVALC, + 0x2C22,INVALC,0x2C25,0x2C23,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3069,0x3066,INVALC,0x3068,INVALC, + INVALC,INVALC,0x3065,0x306A,INVALC,INVALC,0x3067,0x372C, + /* Block 116, Array index 0x2600 */ + 0x3064,0x306B,INVALC,INVALC,INVALC,INVALC,INVALC,0x3727, + 0x372B,INVALC,0x372A,0x3D72,0x3D7D,INVALC,INVALC,0x372D, + INVALC,0x3728,0x3D71,INVALC,INVALC,INVALC,INVALC,0x3726, + 0x3729,INVALC,INVALC,INVALC,INVALC,0x3725,0x372E,INVALC, + INVALC,INVALC,0x3D74,0x3D7B,INVALC,INVALC,0x3D7A,0x3D77, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D79,INVALC,INVALC, + 0x3D73,0x3D75,0x3D78,0x3D76,INVALC,0x3D7C,INVALC,INVALC, + INVALC,INVALC,0x4471,0x4470,0x446E,INVALC,INVALC,INVALC, + 0x4472,INVALC,0x446F,0x4B70,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4474,0x4473,INVALC,0x4B73,0x4B71,INVALC,INVALC, + INVALC,0x4B72,0x517E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x517D,0x5228,0x5227,0x5225,INVALC,0x5224,0x5221,0x5222, + 0x5223,0x5226,0x5229,INVALC,INVALC,0x584B,0x5848,0x5849, + INVALC,0x5847,0x584D,0x584C,0x584A,INVALC,0x5D50,0x5D51, + INVALC,INVALC,INVALC,0x5D4F,INVALC,INVALC,0x622C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x693D,0x693C,0x6B6B,0x6D5D, + INVALC,0x6F37,0x6F36,0x6F38,INVALC,0x2C28,INVALC,INVALC, + 0x372F,INVALC,0x2166,INVALC,INVALC,INVALC,0x2265,INVALC, + INVALC,INVALC,0x246C,0x246A,0x246B,0x2468,INVALC,0x2469, + INVALC,INVALC,INVALC,INVALC,INVALC,0x282F,INVALC,INVALC, + 0x282D,0x2829,0x282C,INVALC,0x2828,INVALC,0x282B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x282E,0x282A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2C30,0x2C2F,0x2C2E,INVALC, + 0x2C37,0x2C2D,INVALC,INVALC,0x3070,INVALC,0x2C34,0x2C32, + INVALC,INVALC,0x2C2A,0x2C35,INVALC,0x2C2C,0x2C36,0x2C33, + 0x2C2B,INVALC,INVALC,0x2C38,0x2C29,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3075,0x306C,0x3077,INVALC,0x306F,0x307A, + 0x307B,0x306D,0x3079,0x3076,0x3074,0x3078,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3072,INVALC,0x306E,INVALC,0x3071, + 0x307C,0x3073,INVALC,0x2C31,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x373D,0x3732,0x3730,INVALC, + 0x3731,INVALC,0x3738,INVALC,0x3739,0x3735,INVALC,0x373A, + /* Block 117, Array index 0x2700 */ + 0x3737,0x3734,INVALC,INVALC,0x3733,INVALC,INVALC,0x3736, + 0x373E,INVALC,INVALC,0x373C,0x373B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E24,INVALC, + INVALC,INVALC,0x3E25,INVALC,INVALC,0x3E2B,INVALC,INVALC, + 0x3E2D,0x3E26,INVALC,0x3E2A,0x3E29,INVALC,INVALC,INVALC, + INVALC,0x3E2C,INVALC,0x3E23,0x3E21,0x3E27,0x3D7E,INVALC, + 0x3E22,0x3E28,0x3E2E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x447B,INVALC,0x4521,INVALC,0x4475,INVALC,0x4522,INVALC, + INVALC,INVALC,0x4476,0x4477,INVALC,0x4523,0x447E,0x447C, + 0x447D,0x4479,0x4478,INVALC,0x4524,INVALC,INVALC,0x447A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B74,INVALC,INVALC,INVALC,INVALC,0x4B79, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B7A,INVALC, + INVALC,0x4B76,0x4B78,0x4B75,INVALC,0x4B77,INVALC,INVALC, + INVALC,0x5233,INVALC,INVALC,0x5232,0x522F,INVALC,0x584E, + INVALC,0x522E,INVALC,INVALC,INVALC,0x5230,0x522D,0x522A, + 0x5231,0x522B,0x522C,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D55,INVALC,0x5852,INVALC,0x5851,0x5853,INVALC,0x5D52, + INVALC,INVALC,0x584F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5850,0x5854,INVALC,INVALC,INVALC,0x5D59,INVALC,INVALC, + INVALC,INVALC,0x5D56,0x5D54,INVALC,0x5D57,INVALC,0x5D5A, + INVALC,0x5D58,0x5D53,INVALC,INVALC,0x622F,0x6232,0x6621, + 0x622D,INVALC,0x693E,0x6233,INVALC,INVALC,0x6231,INVALC, + 0x622E,0x6230,0x6234,0x6622,INVALC,0x657E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x657D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6D5F,INVALC,0x6D61, + 0x6D5E,0x6D60,INVALC,0x7040,INVALC,0x2830,0x307D,0x307E, + INVALC,0x4525,INVALC,INVALC,INVALC,0x7041,INVALC,INVALC, + 0x2831,INVALC,INVALC,INVALC,0x2C39,INVALC,0x2C3A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3121,0x3122,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3E2F,INVALC,0x4528,0x4527,0x4526, + /* Block 118, Array index 0x2800 */ + 0x4B7B,INVALC,0x4B7C,0x4B7D,INVALC,INVALC,INVALC,0x5235, + 0x5234,INVALC,INVALC,0x5855,INVALC,INVALC,INVALC,0x5D5E, + 0x5D5B,0x5D5C,0x5D5D,0x6236,0x6235,INVALC,0x6623,0x6B6C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4529,INVALC,INVALC, + INVALC,0x3123,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2266,INVALC,INVALC,INVALC,0x2C3B,0x3E30, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x246E,0x246D,INVALC,INVALC,INVALC,0x2834,0x2832, + 0x2833,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C3C, + 0x2C3D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3124,INVALC,INVALC,INVALC,0x3125, + INVALC,INVALC,INVALC,0x3740,0x373F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E32,INVALC,INVALC,0x3E31, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x452B, + INVALC,0x452A,INVALC,INVALC,INVALC,0x4B7E,0x5236,INVALC, + 0x5856,INVALC,INVALC,INVALC,0x5D5F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2835,INVALC,INVALC,INVALC, + 0x4C21,INVALC,INVALC,INVALC,0x246F,0x2470,INVALC,INVALC, + 0x2836,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C3E, + INVALC,INVALC,0x2C3F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3126,INVALC,INVALC,INVALC,INVALC,INVALC,0x312C,INVALC, + INVALC,INVALC,0x312D,0x3128,INVALC,INVALC,INVALC,0x312B, + 0x312A,0x3127,INVALC,INVALC,0x3129,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3744,0x3745,INVALC,0x3741,0x3743, + 0x3747,0x3746,0x3742,INVALC,INVALC,INVALC,INVALC,0x3E3A, + INVALC,INVALC,0x3E34,INVALC,INVALC,0x3E37,INVALC,0x3E38, + INVALC,0x3E35,INVALC,INVALC,0x3E39,INVALC,0x3E36,0x3E33, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4538,INVALC,0x452D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4539,0x4537,0x4530, + 0x4534,0x4533,INVALC,0x4536,0x4532,0x453A,0x4531,INVALC, + /* Block 119, Array index 0x2900 */ + INVALC,INVALC,INVALC,0x452F,INVALC,INVALC,INVALC,INVALC, + 0x4C23,INVALC,0x4C27,INVALC,0x4C24,INVALC,INVALC,0x452E, + 0x4535,0x4C26,INVALC,INVALC,0x4C28,0x4C25,0x4C22,INVALC, + INVALC,0x5239,0x523D,0x523F,0x523B,0x523A,0x5238,INVALC, + INVALC,INVALC,INVALC,0x523C,INVALC,0x5237,INVALC,INVALC, + 0x523E,INVALC,INVALC,INVALC,INVALC,0x5858,INVALC,0x5857, + 0x585F,0x5859,0x585E,0x585B,INVALC,0x585D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x585C,0x585A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D60,INVALC,INVALC,INVALC,0x5D63, + 0x5D61,0x5D62,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x623A,INVALC,INVALC,0x623B,INVALC,INVALC,INVALC,0x623C, + INVALC,0x6239,0x623D,INVALC,0x6237,INVALC,INVALC,INVALC, + 0x6624,INVALC,INVALC,INVALC,0x6238,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B6D,INVALC,INVALC,0x6D62,INVALC,INVALC, + 0x6F39,INVALC,INVALC,INVALC,INVALC,0x723A,INVALC,INVALC, + INVALC,0x2C40,INVALC,INVALC,INVALC,INVALC,INVALC,0x2267, + INVALC,0x2471,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3749,0x312E,INVALC,INVALC,INVALC,INVALC,0x3748, + INVALC,INVALC,0x3E3C,INVALC,INVALC,0x3E3B,INVALC,INVALC, + INVALC,0x453B,INVALC,0x5243,0x5240,0x5241,0x5242,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D64,INVALC,0x623E,INVALC, + INVALC,INVALC,0x6940,0x693F,INVALC,0x6D63,INVALC,0x2837, + INVALC,INVALC,INVALC,INVALC,INVALC,0x453C,INVALC,INVALC, + 0x4C29,INVALC,INVALC,0x5860,INVALC,0x623F,0x6941,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2C41,INVALC,INVALC,INVALC, + INVALC,0x312F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x374A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E3D,INVALC,INVALC,0x453D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5861,INVALC, + INVALC,0x5D65,INVALC,INVALC,0x6240,0x6942,INVALC,INVALC, + 0x283A,0x2839,INVALC,0x2838,INVALC,0x283B,INVALC,0x2C47, + INVALC,INVALC,0x2C49,0x2C48,INVALC,INVALC,INVALC,INVALC, + /* Block 120, Array index 0x2A00 */ + INVALC,INVALC,INVALC,0x2C43,0x2C44,0x2C45,INVALC,INVALC, + 0x2C42,INVALC,0x2C46,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3132,0x3136,0x3134,0x3133,INVALC,0x3137,INVALC,INVALC, + INVALC,0x3138,0x3139,0x3131,INVALC,0x3130,INVALC,INVALC, + INVALC,INVALC,0x313A,0x3135,INVALC,0x3753,INVALC,0x313B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x374D,INVALC,0x374C, + INVALC,0x374E,0x374F,0x3751,0x3750,0x3755,INVALC,INVALC, + INVALC,0x374B,INVALC,0x3754,INVALC,0x3752,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E40,0x3E42,0x3E3E,0x3E3F, + INVALC,INVALC,0x3E43,0x3E45,0x3E46,0x3E41,0x3E44,INVALC, + INVALC,INVALC,0x4541,INVALC,0x4546,0x453E,0x4542,INVALC, + INVALC,0x4547,0x4543,INVALC,INVALC,INVALC,INVALC,0x453F, + 0x4540,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4545, + INVALC,0x4544,INVALC,INVALC,INVALC,0x4548,0x4C2E,0x4C30, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C2B,INVALC,0x4C31,INVALC, + 0x4C2F,0x4C2A,0x4C2D,0x4C32,INVALC,0x4C2C,INVALC,INVALC, + 0x5247,0x5246,INVALC,INVALC,INVALC,0x5244,INVALC,0x5245, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5869,INVALC,0x586B, + INVALC,0x586A,0x5862,0x5866,0x5865,0x5863,INVALC,INVALC, + INVALC,0x5864,0x5867,0x5868,INVALC,INVALC,INVALC,INVALC, + 0x5D6D,INVALC,INVALC,0x5D67,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D6C,0x5D68,INVALC,0x5D6B,0x5D66,0x5D6A,0x5D69, + INVALC,INVALC,0x6242,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6241,INVALC,0x6627,INVALC,INVALC,INVALC, + INVALC,0x6625,0x6626,INVALC,0x6943,0x6946,0x6944,0x6945, + 0x6B6E,INVALC,INVALC,INVALC,0x6F3A,0x7042,INVALC,INVALC, + 0x7128,0x7129,INVALC,INVALC,INVALC,INVALC,0x3E47,INVALC, + 0x4549,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C4A, + 0x2C4B,INVALC,INVALC,INVALC,0x3E48,INVALC,INVALC,INVALC, + 0x5D6E,0x6628,0x6947,INVALC,INVALC,INVALC,INVALC,0x2841, + 0x283C,0x283E,0x2840,0x283F,0x283D,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x2B00 */ + INVALC,INVALC,INVALC,0x2C54,INVALC,0x2C4F,0x2C4C,INVALC, + INVALC,0x2C53,INVALC,INVALC,INVALC,INVALC,0x2C52,0x2C51, + 0x2C50,0x2C4D,0x2C4E,0x2C55,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3144,0x313E,0x313C,INVALC,INVALC,0x375C,INVALC, + 0x3141,0x3145,0x3147,0x3143,0x313D,INVALC,0x3142,0x3140, + INVALC,0x3148,INVALC,0x3146,INVALC,0x313F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x375D,INVALC,INVALC, + 0x3756,0x3758,0x375A,INVALC,0x375B,0x3759,INVALC,INVALC, + 0x375E,INVALC,0x3757,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E4C,INVALC,0x3E54,INVALC, + 0x3E49,INVALC,0x3E55,INVALC,0x3E4A,0x3E4B,INVALC,INVALC, + 0x3E53,0x3E52,0x3E4F,INVALC,INVALC,0x3E4D,0x3E50,INVALC, + 0x3E51,0x3E4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4554,INVALC,0x4558,INVALC,INVALC,0x4C38,INVALC, + 0x4556,INVALC,INVALC,0x4553,0x454E,0x4550,0x4551,0x454A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x454D, + INVALC,INVALC,INVALC,INVALC,0x454C,0x454F,0x4557,INVALC, + INVALC,0x4555,0x454B,INVALC,INVALC,INVALC,0x4C3A,INVALC, + 0x4C3C,0x4552,0x4C3E,INVALC,0x4C3F,0x4C3B,INVALC,INVALC, + 0x4C37,INVALC,0x4C34,0x4C39,0x4C3D,0x4C36,INVALC,INVALC, + INVALC,INVALC,0x4C33,INVALC,0x4C35,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5249,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5250,0x5251,INVALC,INVALC,INVALC, + 0x524F,0x5252,INVALC,INVALC,0x524B,0x5248,0x524D,0x524A, + INVALC,0x524C,INVALC,INVALC,0x524E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5872,INVALC,0x586C,0x5870,0x5876, + 0x5877,0x5873,0x5874,0x5871,INVALC,0x586E,INVALC,INVALC, + INVALC,0x586D,0x586F,INVALC,INVALC,0x5875,INVALC,INVALC, + INVALC,INVALC,0x5D75,0x5D6F,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D77,INVALC,0x5D72,0x5D73,0x5D70,0x5D78,0x5D74, + /* Block 122, Array index 0x2C00 */ + INVALC,INVALC,0x5D71,INVALC,0x5D79,0x5D76,INVALC,INVALC, + INVALC,0x6246,INVALC,INVALC,0x6243,INVALC,INVALC,INVALC, + 0x6247,0x6249,0x6248,0x6244,0x6245,INVALC,INVALC,0x662D, + INVALC,INVALC,INVALC,0x662A,0x662C,0x6629,0x662E,INVALC, + INVALC,0x662B,INVALC,0x6949,0x694C,0x6948,INVALC,0x694A, + 0x694B,0x694D,INVALC,INVALC,INVALC,0x6B6F,INVALC,0x6B71, + INVALC,0x6B70,INVALC,INVALC,INVALC,0x6D64,INVALC,INVALC, + 0x7043,0x712A,INVALC,INVALC,INVALC,0x2472,INVALC,0x2843, + INVALC,INVALC,0x2842,INVALC,0x2C5A,0x2C59,INVALC,INVALC, + INVALC,INVALC,0x2C56,0x2C58,0x2C57,INVALC,INVALC,0x314B, + INVALC,0x314F,0x314E,0x314D,0x3149,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x314A,0x314C,INVALC,INVALC,INVALC, + INVALC,0x3765,INVALC,0x3763,0x375F,INVALC,INVALC,0x3760, + INVALC,0x3761,0x3762,0x3764,INVALC,INVALC,INVALC,INVALC, + 0x3E59,INVALC,0x3E58,0x3E57,0x3E56,INVALC,INVALC,INVALC, + INVALC,0x455C,INVALC,INVALC,0x4559,0x455B,INVALC,INVALC, + INVALC,INVALC,0x455A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C48,INVALC,0x4C41,0x4C42,INVALC,INVALC,INVALC,INVALC, + 0x4C4A,INVALC,0x4C49,0x4C46,0x4C45,0x4C44,0x4C43,0x4C47, + 0x4C40,INVALC,0x5253,0x5258,0x5256,INVALC,INVALC,INVALC, + 0x5255,0x5254,0x5257,INVALC,0x5878,INVALC,INVALC,INVALC, + 0x5D7B,INVALC,INVALC,0x5D7A,0x624B,0x624A,INVALC,INVALC, + 0x662F,INVALC,0x694E,INVALC,0x6D65,INVALC,0x7045,0x7044, + 0x2167,INVALC,INVALC,0x3766,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2844,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2C5C,0x2C5F,0x2C5D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2C5B,0x2C5E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3156,0x3158,0x3157,INVALC, + 0x3152,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3155,0x3150,0x3151,0x3154,0x3153,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3769,0x376A, + 0x3768,INVALC,0x3767,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x2D00 */ + INVALC,INVALC,0x3E5A,0x3E5C,0x3E5E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E5B,INVALC,0x3E5D,INVALC,INVALC,INVALC, + 0x4566,0x455D,0x4560,0x4564,INVALC,0x4562,INVALC,0x4561, + 0x455E,0x455F,INVALC,0x4565,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4563,INVALC,INVALC,INVALC,0x4C50,INVALC, + 0x4C4F,INVALC,INVALC,0x4C4B,INVALC,INVALC,INVALC,0x4C4E, + 0x4C4D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x525A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5879,INVALC,INVALC,0x587B, + 0x587A,INVALC,0x4C4C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E22,INVALC,0x5D7E,INVALC, + 0x5E21,INVALC,0x5E23,0x5D7D,0x5D7C,INVALC,INVALC,0x624C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6630, + 0x6631,INVALC,INVALC,INVALC,0x6950,0x6951,0x694F,INVALC, + 0x6D66,0x6D67,INVALC,INVALC,INVALC,0x2268,INVALC,INVALC, + 0x2845,INVALC,INVALC,0x2846,INVALC,INVALC,0x2C61,INVALC, + 0x2C60,INVALC,INVALC,INVALC,INVALC,0x315B,0x3159,0x315F, + INVALC,0x315A,0x315E,0x315C,0x315D,INVALC,INVALC,0x376B, + 0x376D,INVALC,INVALC,INVALC,0x376C,INVALC,INVALC,INVALC, + INVALC,0x3E5F,INVALC,INVALC,INVALC,INVALC,0x4569,INVALC, + INVALC,INVALC,0x4568,0x4567,INVALC,INVALC,INVALC,INVALC, + 0x4C51,INVALC,INVALC,0x4C52,0x4C53,INVALC,INVALC,INVALC, + INVALC,0x5921,0x525B,0x525D,0x525C,0x587E,0x587C,0x5922, + 0x587D,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E24,INVALC, + 0x5E25,0x5E26,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2C62,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3160,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E61,INVALC,0x3E60,INVALC, + INVALC,INVALC,INVALC,0x456A,INVALC,INVALC,0x4C54,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6952, + INVALC,INVALC,INVALC,0x2847,INVALC,INVALC,INVALC,INVALC, + /* Block 124, Array index 0x2E00 */ + 0x2C63,0x2C64,INVALC,INVALC,0x3162,0x3164,INVALC,INVALC, + 0x3166,0x3169,0x3167,INVALC,INVALC,INVALC,0x3168,0x3165, + 0x3161,INVALC,0x316A,0x3163,INVALC,INVALC,INVALC,INVALC, + 0x3776,INVALC,0x3821,INVALC,INVALC,0x3778,INVALC,INVALC, + INVALC,INVALC,0x3773,0x3822,0x3774,0x3771,INVALC,INVALC, + INVALC,INVALC,0x3777,0x377A,INVALC,0x377B,INVALC,0x377C, + 0x3772,0x3779,0x377D,0x3775,0x3770,0x376E,INVALC,INVALC, + 0x377E,INVALC,INVALC,0x376F,INVALC,INVALC,INVALC,INVALC, + 0x3E68,INVALC,INVALC,INVALC,0x3E64,0x3E6A,INVALC,0x3E63, + 0x3E65,INVALC,0x3E62,INVALC,0x3E66,INVALC,0x3E67,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E69,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4575,INVALC,0x4578,0x456C,0x4571,0x456B,INVALC, + INVALC,0x456F,INVALC,INVALC,INVALC,0x456D,INVALC,INVALC, + 0x4574,0x4573,0x4570,0x4572,0x456E,INVALC,0x4577,INVALC, + 0x4576,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C64,INVALC,INVALC,0x4C5F,INVALC,INVALC, + 0x4C55,INVALC,0x4C57,INVALC,0x4C5C,0x4C5B,0x4C5E,INVALC, + 0x4C59,0x4C58,INVALC,INVALC,INVALC,INVALC,0x4C5A,INVALC, + 0x4C60,0x4C62,INVALC,0x4C5D,0x4C56,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C63,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5261,INVALC,INVALC,0x5263, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5266,INVALC,0x525E, + INVALC,0x5264,INVALC,INVALC,INVALC,INVALC,0x5260,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5265,0x525F,INVALC,INVALC,0x5262,INVALC, + INVALC,INVALC,INVALC,INVALC,0x592C,0x5927,INVALC,INVALC, + 0x5931,INVALC,0x5929,INVALC,0x592F,0x5926,0x5923,0x5932, + INVALC,INVALC,0x592E,0x5924,INVALC,0x5928,INVALC,0x5925, + 0x592A,INVALC,0x592D,0x5930,INVALC,INVALC,INVALC,INVALC, + 0x5E38,0x5E39,0x5E29,0x5E30,0x5E2E,INVALC,INVALC,INVALC, + 0x5E35,0x592B,INVALC,0x5E2C,INVALC,0x5E36,INVALC,0x5E2B, + /* Block 125, Array index 0x2F00 */ + 0x5E2A,0x5E34,0x5E31,0x5E33,INVALC,0x5E27,0x5E37,INVALC, + INVALC,0x5E32,0x5E3B,0x5E2F,INVALC,INVALC,0x5E2D,0x5E28, + 0x5E3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x624F,INVALC,INVALC,0x624D,0x6253,INVALC,0x6251, + 0x6250,INVALC,0x6256,INVALC,INVALC,0x6257,0x6254,INVALC, + 0x6255,0x624E,INVALC,INVALC,0x6635,0x6252,INVALC,INVALC, + 0x6258,INVALC,INVALC,0x6632,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6634,INVALC,0x6636,0x6633,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6957,INVALC,0x6956, + 0x6954,0x6953,0x6955,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B73,0x6B72,INVALC,INVALC,0x6D68, + INVALC,0x6D6A,0x6D6C,0x6D6B,0x6D69,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F3C,0x6F3B, + INVALC,0x712B,0x7046,0x712C,INVALC,INVALC,INVALC,0x715C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2848,INVALC,INVALC, + 0x2C66,0x2C67,0x2C65,INVALC,INVALC,INVALC,INVALC,0x2C68, + 0x2C69,0x2C6A,INVALC,INVALC,0x316B,0x3171,INVALC,INVALC, + 0x316F,INVALC,0x316D,INVALC,0x316E,0x3170,INVALC,INVALC, + INVALC,0x316C,INVALC,INVALC,0x3823,INVALC,0x3825,INVALC, + 0x3824,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E6C,INVALC, + INVALC,0x3E6E,0x3E6B,0x3826,INVALC,INVALC,INVALC,INVALC, + 0x3E6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x457B, + INVALC,INVALC,0x4579,INVALC,0x457A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C68,0x4C65,0x4C67,INVALC,INVALC,0x4C66, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5267,INVALC,INVALC, + 0x5268,INVALC,INVALC,0x526A,0x5269,INVALC,INVALC,INVALC, + 0x5936,0x5937,0x5933,INVALC,0x5934,INVALC,INVALC,0x5935, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E3C,INVALC,0x6638,INVALC,0x6637,INVALC,0x6958,INVALC, + INVALC,0x6D6E,0x6B74,INVALC,0x6D6D,INVALC,0x712D,0x7172, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2849,INVALC,INVALC, + /* Block 126, Array index 0x3000 */ + INVALC,0x2C6D,INVALC,0x2C6B,INVALC,INVALC,INVALC,INVALC, + 0x2C6C,INVALC,INVALC,INVALC,0x317C,INVALC,0x3175,0x317B, + INVALC,0x3174,0x317A,0x3178,INVALC,INVALC,0x3177,INVALC, + 0x3176,INVALC,INVALC,INVALC,INVALC,0x3173,0x3172,0x3179, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3835,0x382E,INVALC,INVALC,0x382D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3827,0x382A,INVALC, + 0x3829,INVALC,0x382B,0x3834,INVALC,0x3828,0x3831,0x3832, + INVALC,0x382F,INVALC,INVALC,INVALC,0x382C,INVALC,0x3830, + INVALC,INVALC,0x3833,INVALC,INVALC,INVALC,0x3F21,0x3E76, + INVALC,0x3E7D,0x3E7A,0x3E72,0x3E7B,INVALC,0x3E73,INVALC, + 0x3E6F,INVALC,INVALC,INVALC,0x3E78,INVALC,INVALC,0x3E7E, + INVALC,INVALC,INVALC,0x3E71,INVALC,INVALC,INVALC,0x3E74, + INVALC,0x3E7C,0x3E75,0x3E79,INVALC,0x3E77,INVALC,0x3E70, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4624,0x4626,0x4628,0x462C,INVALC,0x4622, + 0x457E,INVALC,INVALC,0x4627,0x462B,0x4623,0x457D,INVALC, + 0x457C,INVALC,INVALC,INVALC,0x4629,0x4621,0x4625,INVALC, + INVALC,INVALC,0x462D,INVALC,0x462A,INVALC,0x4C79,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C71,INVALC,0x4C7B, + INVALC,0x4D21,INVALC,0x4C6C,INVALC,INVALC,0x4C7C,0x4C69, + INVALC,0x4C7E,0x4C6D,INVALC,INVALC,INVALC,0x4C7D,0x4C77, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C6A, + INVALC,0x4C78,INVALC,INVALC,0x4C7A,INVALC,INVALC,INVALC, + 0x4C6F,0x4C6E,0x4C6B,INVALC,0x4C73,0x4C70,0x4C74,INVALC, + INVALC,0x4D22,INVALC,0x4C75,0x4C76,INVALC,0x4C72,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x526F, + INVALC,INVALC,INVALC,0x526C,INVALC,INVALC,INVALC,0x5278, + INVALC,0x5270,INVALC,INVALC,INVALC,INVALC,0x5273,0x526E, + INVALC,INVALC,0x526D,INVALC,INVALC,INVALC,0x5277,INVALC, + 0x5276,0x5275,INVALC,0x503B,INVALC,INVALC,0x5274,0x526B, + INVALC,INVALC,0x5272,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 127, Array index 0x3100 */ + INVALC,INVALC,INVALC,0x5271,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5944,0x593B,0x5947,0x593F,0x5945, + INVALC,INVALC,0x5938,0x593E,0x5948,0x5941,0x5946,0x593A, + INVALC,INVALC,0x5942,INVALC,0x5940,INVALC,INVALC,0x593C, + 0x593D,0x5939,0x5943,INVALC,0x594A,0x5949,INVALC,INVALC, + INVALC,0x5E47,0x5E43,INVALC,INVALC,0x5E3D,INVALC,INVALC, + 0x5E49,INVALC,INVALC,0x5E40,INVALC,INVALC,0x5E4B,INVALC, + 0x5E42,INVALC,0x5E4D,0x5E4A,0x5E3E,INVALC,INVALC,INVALC, + 0x5E45,INVALC,0x5E3F,INVALC,0x5E4C,INVALC,INVALC,0x5E46, + INVALC,0x5E44,INVALC,INVALC,0x5E48,INVALC,INVALC,INVALC, + 0x625A,0x6260,INVALC,0x6263,INVALC,INVALC,0x625B,0x6262, + 0x625D,INVALC,INVALC,INVALC,0x6259,INVALC,INVALC,0x625F, + 0x6261,INVALC,0x625E,0x625C,INVALC,INVALC,INVALC,INVALC, + 0x6642,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x663E, + 0x663C,INVALC,0x6640,INVALC,0x6641,0x663A,0x6639,0x663D, + 0x663B,INVALC,0x663F,0x6959,INVALC,INVALC,0x695A,INVALC, + 0x695C,0x695B,INVALC,INVALC,INVALC,INVALC,0x6B79,0x6B76, + 0x6B77,INVALC,0x6B75,0x6B78,INVALC,0x6B7A,INVALC,INVALC, + INVALC,0x6D6F,INVALC,INVALC,INVALC,0x6F3D,INVALC,0x7047, + 0x712F,0x7131,0x712E,0x7130,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3052,INVALC,INVALC,INVALC,INVALC,0x3F22,0x3F23, + INVALC,INVALC,INVALC,0x594B,INVALC,0x5E4E,INVALC,INVALC, + INVALC,INVALC,0x6644,0x6643,INVALC,0x6B7B,INVALC,0x6D70, + INVALC,0x2269,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2C6E,INVALC,INVALC,0x3224,0x317D,0x3223,0x3221,INVALC, + 0x3222,0x317E,INVALC,0x3836,INVALC,0x3F24,0x3F25,0x4630, + 0x4631,INVALC,INVALC,0x462F,0x4632,0x462E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D23,INVALC,INVALC,0x5279,INVALC, + INVALC,INVALC,0x594E,0x594C,0x594D,0x5E51,0x5E50,0x5E4F, + INVALC,INVALC,INVALC,0x6645,INVALC,INVALC,0x6646,0x6D71, + INVALC,0x7048,INVALC,INVALC,INVALC,0x2C70,INVALC,INVALC, + INVALC,0x2C6F,0x3226,INVALC,INVALC,0x3837,0x3225,INVALC, + INVALC,INVALC,INVALC,0x383A,0x3838,0x3839,INVALC,INVALC, + 0x3F27,0x3F28,0x3F26,INVALC,INVALC,0x4634,0x4633,0x4635, + INVALC,INVALC,INVALC,INVALC,0x527A,0x527C,INVALC,INVALC, + 0x527B,0x594F,INVALC,0x6265,INVALC,0x6264,INVALC,0x6647, + INVALC,INVALC,0x695D,0x6B7C,INVALC,INVALC,0x2C71,INVALC, + 0x3229,INVALC,0x3228,0x3227,INVALC,INVALC,INVALC,0x3840, + INVALC,0x3842,0x383B,0x383C,INVALC,0x383D,INVALC,0x3841, + 0x383E,0x383F,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F29, + INVALC,INVALC,INVALC,0x4636,0x4637,INVALC,0x4D27,INVALC, + INVALC,INVALC,0x4D24,0x4D25,INVALC,0x4D26,0x5323,INVALC, + 0x5324,INVALC,0x5321,0x527E,0x5322,0x527D,INVALC,0x5950, + INVALC,INVALC,0x5E53,INVALC,0x5E52,0x6134,INVALC,0x6266, + 0x6267,INVALC,INVALC,INVALC,INVALC,0x6648,0x6649,0x695E, + /* Block 129, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C72, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2C73,0x2C74, + INVALC,INVALC,INVALC,INVALC,0x2C75,INVALC,0x322A,INVALC, + INVALC,INVALC,INVALC,0x3845,INVALC,INVALC,0x3844,0x3843, + INVALC,0x4638,INVALC,INVALC,0x4D28,INVALC,INVALC,INVALC, + INVALC,0x5952,0x5951,INVALC,0x5E54,INVALC,INVALC,INVALC, + 0x6B7D,INVALC,INVALC,INVALC,0x2473,0x284A,INVALC,0x2C76, + INVALC,0x322C,INVALC,INVALC,INVALC,INVALC,0x322B,INVALC, + INVALC,INVALC,INVALC,0x3847,INVALC,INVALC,INVALC,0x3846, + 0x3848,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F2B, + 0x3F2C,0x3F2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D2A,0x4D29,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5325,INVALC,INVALC,0x5326, + INVALC,INVALC,INVALC,INVALC,0x5953,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6268,INVALC,INVALC, + 0x664A,0x695F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2F7D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2168,INVALC,INVALC,INVALC,INVALC,0x284B, + 0x2476,INVALC,0x2477,INVALC,INVALC,0x2474,INVALC,INVALC, + INVALC,0x2475,INVALC,INVALC,0x2478,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x284D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2850,0x284C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x284F,INVALC,INVALC, + 0x284E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2C7C,INVALC,INVALC,0x2C7E,INVALC,0x2C78, + 0x2C7B,0x2D26,0x2D24,INVALC,INVALC,0x2D2A,INVALC,0x2D27, + 0x2C7D,0x2C7A,INVALC,INVALC,0x3F2E,0x2D25,INVALC,0x2D28, + 0x2C77,0x2D22,INVALC,INVALC,0x2D23,INVALC,INVALC,INVALC, + 0x2C79,INVALC,INVALC,0x2D21,INVALC,INVALC,0x2D29,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x322E,INVALC,INVALC,0x3230,INVALC,INVALC, + INVALC,0x322F,0x322D,0x3232,INVALC,INVALC,0x3F2D,INVALC, + /* Block 130, Array index 0x3400 */ + 0x3233,0x3231,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3852,INVALC,INVALC, + 0x3849,0x384B,INVALC,0x384C,INVALC,0x3854,0x3850,0x384E, + INVALC,0x3851,0x3855,INVALC,INVALC,0x384A,INVALC,0x3853, + INVALC,INVALC,INVALC,INVALC,0x384F,0x384D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F36,INVALC,INVALC,0x3F34,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F2F,0x4646,INVALC,INVALC,0x3F33, + INVALC,INVALC,0x3F30,INVALC,INVALC,0x3F35,INVALC,0x3F32, + INVALC,INVALC,0x3F31,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x463E,0x463C,INVALC,0x4642,INVALC, + 0x463A,0x4647,0x463F,INVALC,0x4639,INVALC,INVALC,0x4644, + INVALC,0x463D,INVALC,INVALC,INVALC,INVALC,INVALC,0x4645, + INVALC,INVALC,0x4640,INVALC,INVALC,INVALC,0x4643,0x463B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D2D,INVALC,INVALC,0x4D2C,0x4D2E, + INVALC,0x4D2B,INVALC,0x4D31,0x4D30,0x4D2F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x532A,INVALC,0x532D, + INVALC,0x532C,INVALC,INVALC,INVALC,INVALC,0x5329,0x5328, + INVALC,INVALC,0x532B,0x5327,INVALC,INVALC,0x5955,0x595F, + INVALC,INVALC,INVALC,0x5959,0x595B,INVALC,0x5956,INVALC, + 0x595A,0x5954,0x595D,INVALC,0x595C,0x5958,INVALC,0x595E, + INVALC,0x5957,INVALC,0x5E55,0x5E5B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E56,0x5E59,INVALC,0x5E5A, + INVALC,INVALC,0x5E58,INVALC,0x5E57,INVALC,INVALC,INVALC, + 0x626B,0x6269,0x626A,INVALC,INVALC,0x664C,INVALC,0x664B, + INVALC,0x6961,INVALC,0x6960,INVALC,0x6B7E,0x6D72,INVALC, + 0x7132,0x7133,INVALC,INVALC,INVALC,INVALC,0x3F37,INVALC, + INVALC,0x5E5C,INVALC,INVALC,INVALC,INVALC,0x3F38,INVALC, + INVALC,INVALC,0x5960,INVALC,INVALC,INVALC,INVALC,0x3F39, + 0x3F3A,0x3F3B,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D2B, + /* Block 131, Array index 0x3500 */ + INVALC,0x3234,INVALC,INVALC,0x3F3C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x664D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3856,INVALC,INVALC,INVALC,0x4D32,0x532E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4648,INVALC,INVALC, + 0x2851,0x2D2C,INVALC,INVALC,INVALC,0x3236,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3235, + INVALC,INVALC,0x385B,0x3858,0x385A,INVALC,INVALC,INVALC, + 0x3857,INVALC,0x3859,INVALC,0x3F3D,0x3F3E,INVALC,0x3F3F, + 0x464B,INVALC,0x464C,INVALC,0x464A,0x464D,INVALC,INVALC, + INVALC,0x4649,INVALC,INVALC,INVALC,INVALC,0x5333,0x532F, + 0x5332,0x5334,0x5331,0x5330,INVALC,0x5961,0x5962,0x5963, + INVALC,INVALC,0x5E5E,0x5E5D,0x5E5F,INVALC,0x626D,0x626C, + INVALC,0x664F,INVALC,0x6650,0x664E,INVALC,INVALC,INVALC, + 0x6962,0x6963,INVALC,0x6D73,0x6F3E,0x7049,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x385C,0x3F40,INVALC,INVALC, + 0x226A,INVALC,INVALC,INVALC,0x226B,0x226D,INVALC,0x226E, + 0x226C,INVALC,INVALC,0x2522,0x2523,0x247B,INVALC,INVALC, + INVALC,INVALC,0x2521,INVALC,INVALC,INVALC,0x247C,0x247A, + 0x2479,0x247D,INVALC,0x247E,0x2D2D,INVALC,INVALC,INVALC, + 0x2856,INVALC,0x2855,0x2857,INVALC,INVALC,0x285C,INVALC, + 0x2852,0x2860,0x2866,INVALC,0x2863,INVALC,INVALC,0x2859, + 0x285F,0x2861,INVALC,0x2854,INVALC,INVALC,0x285A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x285E,0x2858,0x2865,INVALC, + INVALC,INVALC,0x285D,INVALC,0x285B,INVALC,INVALC,INVALC, + 0x2853,INVALC,0x2862,0x2864,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2D34,0x2D37,INVALC, + INVALC,0x2D2E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2D43,0x2D3A,INVALC,INVALC,0x2D42,INVALC,INVALC,INVALC, + 0x2D32,INVALC,0x2D41,0x2D36,0x2D39,0x2D46,INVALC,INVALC, + 0x2D40,INVALC,0x2D3B,0x2D45,0x2D38,0x2D3C,0x2D3F,INVALC, + INVALC,0x2D30,0x2D44,0x2D3E,INVALC,INVALC,0x2D2F,INVALC, + /* Block 132, Array index 0x3600 */ + 0x2D33,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D31, + 0x3247,INVALC,INVALC,INVALC,0x2D3D,0x2942,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x324A,INVALC, + INVALC,0x323A,INVALC,0x3245,0x3241,INVALC,0x3254,INVALC, + 0x324C,INVALC,0x3242,INVALC,0x324B,0x323C,0x3240,0x3257, + INVALC,0x324F,0x3246,INVALC,0x3255,0x3238,INVALC,0x324E, + INVALC,INVALC,INVALC,0x3237,INVALC,INVALC,INVALC,0x324D, + INVALC,INVALC,0x2D35,0x3F41,0x3248,INVALC,INVALC,0x323E, + INVALC,0x323F,0x3243,INVALC,0x3239,0x3251,INVALC,0x3250, + 0x3258,INVALC,INVALC,0x3256,0x3252,0x3249,0x3244,INVALC, + INVALC,0x323B,INVALC,0x3253,INVALC,INVALC,0x323D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3862,0x3864,0x3869,0x387D,INVALC, + INVALC,INVALC,0x3861,INVALC,INVALC,0x386C,0x3873,0x3879, + INVALC,0x3866,INVALC,0x386D,INVALC,INVALC,INVALC,0x387B, + 0x3876,INVALC,INVALC,0x3872,0x386E,0x3860,INVALC,0x3865, + 0x385D,INVALC,INVALC,INVALC,0x386A,0x3867,INVALC,0x3877, + INVALC,0x3868,0x3F6A,0x3870,INVALC,0x386F,INVALC,INVALC, + INVALC,INVALC,INVALC,0x385E,0x3863,0x3874,0x387A,INVALC, + 0x385F,0x386B,0x3871,INVALC,INVALC,INVALC,0x387C,0x3875, + 0x3878,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F51, + 0x3F45,INVALC,0x3F62,0x3F6B,0x3F6E,INVALC,0x3F4D,0x3F66, + 0x3F4E,0x3F5C,INVALC,0x3F58,INVALC,INVALC,0x3F59,0x3F42, + INVALC,0x3F67,INVALC,INVALC,INVALC,0x3F64,0x3F5A,0x3F70, + 0x3F55,0x466D,INVALC,0x3F73,INVALC,0x3F53,0x3F5F,INVALC, + INVALC,0x3F57,0x3F71,0x3F50,0x3F49,0x3F54,INVALC,0x3F48, + 0x3F46,INVALC,0x3F68,0x3F4F,0x3F6C,INVALC,0x3F6D,INVALC, + INVALC,INVALC,INVALC,0x3F63,INVALC,0x3F5B,0x3F4B,INVALC, + INVALC,0x3F43,0x3F65,0x3F6F,0x3F4A,INVALC,0x3F74,0x3F56, + /* Block 133, Array index 0x3700 */ + INVALC,0x3F52,INVALC,INVALC,INVALC,INVALC,0x3F61,INVALC, + INVALC,0x3F5D,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F5E, + 0x3F4C,0x3F60,0x3F47,0x3F69,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F72,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F44,INVALC,INVALC,INVALC,INVALC, + INVALC,0x466C,INVALC,0x4724,INVALC,0x4671,INVALC,0x466F, + 0x465A,INVALC,0x466A,0x467E,0x4666,INVALC,0x467D,0x4664, + INVALC,0x4674,0x4665,0x467B,INVALC,INVALC,INVALC,0x464F, + 0x4657,INVALC,0x4670,0x4668,0x4723,0x466B,INVALC,0x467C, + INVALC,INVALC,INVALC,0x466E,0x4676,0x465B,0x4675,INVALC, + 0x4728,0x4656,0x4677,INVALC,0x4726,INVALC,0x4650,INVALC, + INVALC,0x465E,0x465D,INVALC,INVALC,0x4661,0x4663,0x4672, + 0x4725,INVALC,INVALC,INVALC,INVALC,0x4655,INVALC,0x4659, + 0x4721,INVALC,INVALC,INVALC,INVALC,INVALC,0x4727,0x4678, + 0x4673,INVALC,INVALC,0x4660,0x465F,INVALC,0x4651,INVALC, + 0x4669,0x4652,0x4667,INVALC,INVALC,0x465C,0x4722,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4658,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4654,0x467A,0x4653, + INVALC,0x4D5A,INVALC,INVALC,0x4D49,INVALC,INVALC,0x4D33, + 0x4D51,INVALC,0x4D42,0x4D4C,INVALC,0x4D45,INVALC,0x4D36, + 0x4D54,0x4D35,0x4D48,INVALC,0x4D34,INVALC,INVALC,0x4D46, + 0x4D4F,0x4D4D,0x4D41,0x4D3C,0x4D3A,INVALC,0x4D3B,0x4D4E, + 0x4D59,0x4D43,INVALC,INVALC,0x4D3E,INVALC,0x4D52,INVALC, + INVALC,0x4D3D,0x4D37,0x4D47,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D3F,0x4D39,INVALC,INVALC,0x4679,INVALC,0x4D4A, + INVALC,INVALC,INVALC,INVALC,0x4D4B,0x4D40,0x4D38,0x4D53, + 0x4D44,INVALC,0x4D57,INVALC,0x4D56,INVALC,0x4D50,0x4D55, + INVALC,INVALC,INVALC,0x4D58,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x535C, + 0x535D,0x5350,0x534F,0x534B,INVALC,INVALC,INVALC,0x535F, + 0x535E,0x464E,0x5348,0x534C,0x5346,INVALC,0x5359,0x534A, + INVALC,0x5360,0x5343,0x5341,0x534D,0x5357,0x5352,INVALC, + /* Block 134, Array index 0x3800 */ + 0x5338,INVALC,0x5356,INVALC,INVALC,INVALC,INVALC,0x4662, + 0x5344,0x533B,0x533E,0x5364,0x5345,0x533C,0x533A,0x5337, + INVALC,INVALC,0x534E,INVALC,INVALC,0x5349,0x5351,INVALC, + 0x5361,0x5365,INVALC,INVALC,0x5340,0x5354,0x5358,0x533D, + 0x5362,INVALC,INVALC,INVALC,0x5335,INVALC,0x535B,0x533F, + 0x5353,0x5339,0x5347,0x5342,INVALC,INVALC,0x5355,0x5366, + 0x5363,0x535A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5336,INVALC,INVALC,0x5974,INVALC, + 0x596B,0x596E,INVALC,INVALC,0x5970,0x5965,0x596C,0x5972, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5967,0x5977,INVALC, + INVALC,0x5971,INVALC,0x5968,0x5A22,0x597A,0x5964,0x5E72, + 0x596A,INVALC,INVALC,0x5975,INVALC,0x5A21,INVALC,INVALC, + 0x597C,0x5969,0x596F,0x5973,0x596D,0x5A23,0x597E,0x597B, + INVALC,INVALC,INVALC,0x5966,0x5A24,INVALC,0x5978,INVALC, + INVALC,0x5976,INVALC,INVALC,INVALC,0x5979,0x5F21,0x5E6C, + 0x5E71,0x5E7E,0x5E70,0x5E68,0x5E6D,INVALC,INVALC,INVALC, + 0x5E61,0x5E79,0x5E7B,0x5E60,INVALC,0x5E7D,0x5E75,INVALC, + 0x5E7C,0x5E6E,INVALC,0x5E66,0x597D,0x5E76,0x5E73,0x5E62, + 0x5F23,INVALC,INVALC,INVALC,INVALC,0x5E64,0x5E74,INVALC, + 0x5F22,0x5E77,0x5E6A,INVALC,INVALC,0x5E78,0x5E6B,0x5F24, + 0x5E65,0x5E6F,0x5E7A,0x5E67,0x5E69,INVALC,INVALC,0x5E63, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x627D,INVALC,0x6273,0x626E,0x6274,0x627E,0x6324, + 0x6323,INVALC,INVALC,INVALC,INVALC,0x6275,0x6325,0x6278, + 0x6270,INVALC,0x6272,0x6271,0x6277,0x627C,0x626F,0x6276, + 0x627B,INVALC,INVALC,0x6279,INVALC,INVALC,0x627A,INVALC, + INVALC,0x6660,0x6321,INVALC,INVALC,INVALC,INVALC,0x6658, + 0x665C,0x6654,0x6657,INVALC,0x665F,INVALC,0x6664,0x665D, + INVALC,0x6655,0x6665,0x665E,INVALC,INVALC,0x6662,INVALC, + 0x6656,INVALC,INVALC,0x6651,0x6659,0x6653,INVALC,0x6663, + 0x6661,0x6652,0x665A,INVALC,INVALC,INVALC,0x696A,INVALC, + 0x665B,INVALC,INVALC,INVALC,INVALC,0x696F,0x6967,0x6965, + /* Block 135, Array index 0x3900 */ + 0x6969,0x6966,INVALC,INVALC,0x696B,0x696D,INVALC,INVALC, + INVALC,0x696C,INVALC,INVALC,0x696E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C21,0x6C27,INVALC,0x6968,0x6C26,INVALC,0x6C2D,0x6C24, + 0x6C2B,0x6C2A,0x6964,0x6C25,0x6322,0x6C2E,0x6C23,0x6C28, + INVALC,0x6C2C,0x6C22,INVALC,0x6D77,INVALC,0x6C29,INVALC, + INVALC,0x6F43,0x6D78,0x6D76,0x6D74,0x6D75,0x6D79,INVALC, + INVALC,0x6F41,0x6F3F,0x6F44,0x6F42,INVALC,0x6F45,INVALC, + 0x6F40,INVALC,INVALC,0x704A,INVALC,INVALC,0x7134,0x7135, + 0x7136,INVALC,INVALC,0x7235,0x722D,0x226F,INVALC,INVALC, + INVALC,INVALC,0x325A,0x3259,INVALC,INVALC,0x3921,INVALC, + INVALC,0x387E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D5B,0x5367,0x5A25,0x5A27,0x5A26,INVALC,INVALC, + 0x5F25,0x6326,0x7173,INVALC,INVALC,0x2869,0x286A,0x2868, + 0x2867,INVALC,INVALC,0x2D4A,0x2D48,INVALC,INVALC,0x2D47, + INVALC,INVALC,INVALC,INVALC,0x2D49,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3266,0x3263,0x3261, + INVALC,INVALC,INVALC,0x3264,INVALC,0x325E,0x326D,INVALC, + 0x326F,0x325F,INVALC,INVALC,0x3270,0x326B,0x325D,0x3262, + 0x326C,0x3268,0x3265,INVALC,INVALC,0x326E,0x3260,INVALC, + INVALC,0x3269,0x325B,INVALC,INVALC,0x3267,INVALC,0x326A, + 0x325C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3928,INVALC,INVALC,0x392B,0x392E,INVALC,INVALC,0x3923, + 0x392C,0x392A,0x3927,0x392F,0x3930,0x3932,0x3933,0x3922, + INVALC,0x3925,0x3924,0x3931,INVALC,0x3926,INVALC,INVALC, + 0x3929,INVALC,INVALC,INVALC,0x392D,INVALC,INVALC,INVALC, + INVALC,0x4025,INVALC,0x3F78,INVALC,INVALC,0x472E,0x4023, + 0x3F75,INVALC,0x3F7A,INVALC,0x3F7E,0x3F7C,INVALC,INVALC, + INVALC,INVALC,0x3F76,0x3F79,INVALC,INVALC,0x3F77,INVALC, + 0x4024,0x4022,0x3F7B,0x3F7D,0x4021,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x472F,0x4735,0x472B, + 0x4731,INVALC,0x472D,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 136, Array index 0x3A00 */ + INVALC,0x4734,INVALC,INVALC,0x472A,0x4737,INVALC,INVALC, + INVALC,0x4733,INVALC,0x4729,0x472C,0x4736,0x4732,INVALC, + INVALC,0x4D7B,0x4D70,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D64,0x4D79,0x4D65,INVALC,INVALC,0x4D62,INVALC, + 0x4D6B,0x4D63,INVALC,0x4D5D,0x4D78,INVALC,0x4D75,0x4D76, + 0x4D5E,INVALC,0x4D6D,INVALC,0x4D67,0x4D6E,0x4D61,INVALC, + 0x4D7A,0x4D72,0x4D6C,0x4D5C,INVALC,0x4D73,INVALC,INVALC, + 0x4D77,INVALC,0x4D71,INVALC,0x4D6F,INVALC,0x4D69,INVALC, + 0x4D60,0x4D68,0x4D74,0x4D66,INVALC,INVALC,0x4D6A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4730,0x5379,0x5424, + 0x5378,0x5374,0x5371,INVALC,0x536F,INVALC,0x5368,INVALC, + 0x536E,INVALC,0x5373,0x5370,0x5422,0x537B,0x5375,0x537A, + INVALC,0x5372,0x5427,0x5369,0x536A,0x5423,INVALC,0x5428, + INVALC,0x5429,0x5377,0x4D5F,0x537D,0x5376,0x5421,0x537C, + INVALC,INVALC,INVALC,0x536D,INVALC,0x5426,INVALC,0x536B, + INVALC,0x5A32,0x537E,0x5425,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A2F,INVALC,INVALC,0x5A39,0x5A35,INVALC,0x5A33, + 0x5A2E,0x5A3D,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A2A, + 0x5A36,0x5A37,0x5A2D,0x5A2C,0x5A3A,INVALC,0x5A30,0x5A2B, + 0x5A31,INVALC,0x5A3C,0x5A29,0x5A3B,0x5A38,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A34,0x5A28,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F27,INVALC,0x5F2B,0x5F28,0x5F2F,0x5F35, + 0x5F2A,INVALC,0x5F3E,INVALC,0x5F38,0x5F2D,0x5F39,0x5F34, + 0x5F3B,0x5F2C,INVALC,INVALC,0x5F2E,0x5F3C,0x5F26,0x5F3A, + INVALC,INVALC,0x5F32,0x5F31,0x5F36,0x5F29,INVALC,INVALC, + INVALC,0x5F30,0x5F37,INVALC,0x5F33,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6333,0x6331,INVALC,INVALC,0x6337, + 0x6335,0x6338,INVALC,0x632A,0x6332,0x633C,0x5F3D,0x632E, + INVALC,0x536C,0x6329,0x6336,0x6330,0x632D,0x6328,0x6327, + 0x633B,INVALC,0x632C,0x632B,INVALC,0x6334,INVALC,INVALC, + INVALC,INVALC,INVALC,0x632F,0x633A,INVALC,0x6669,0x666A, + INVALC,INVALC,0x6667,INVALC,0x666F,INVALC,INVALC,0x6671, + /* Block 137, Array index 0x3B00 */ + 0x6666,0x6339,0x6673,0x6668,INVALC,INVALC,0x666E,INVALC, + 0x6670,0x666B,0x6672,0x666D,0x666C,INVALC,INVALC,INVALC, + 0x6971,0x6972,INVALC,0x6974,INVALC,INVALC,0x6975,0x6973, + INVALC,0x6970,INVALC,0x6C31,0x6C34,0x6C30,INVALC,INVALC, + 0x6C32,INVALC,INVALC,INVALC,0x6C33,0x6D7E,0x6D7C,INVALC, + 0x6D7B,0x6C2F,0x6D7D,0x6C35,0x6D7A,INVALC,0x6F48,0x6F26, + 0x6F46,INVALC,0x6F47,0x6F49,INVALC,0x704D,INVALC,0x704C, + 0x704B,INVALC,INVALC,INVALC,0x715D,0x7175,0x7174,0x7176, + INVALC,0x2D4B,INVALC,0x3271,0x3272,INVALC,INVALC,INVALC, + 0x4026,INVALC,0x6C36,0x704E,INVALC,INVALC,0x2D4C,INVALC, + INVALC,INVALC,0x3934,INVALC,INVALC,0x4028,0x4027,INVALC, + INVALC,INVALC,0x542A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D4D, + INVALC,0x2D4F,0x2D4E,INVALC,INVALC,0x3273,INVALC,0x327A, + INVALC,0x3278,0x3276,INVALC,0x327D,0x3274,0x3275,INVALC, + INVALC,INVALC,INVALC,INVALC,0x327E,INVALC,0x327C,0x3279, + 0x3277,INVALC,INVALC,0x327B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3935,INVALC,INVALC,0x3945,INVALC,0x3947,INVALC, + INVALC,0x393B,INVALC,0x3946,INVALC,0x3936,INVALC,0x3942, + 0x393E,0x3940,0x393A,0x3941,INVALC,INVALC,INVALC,0x393D, + INVALC,0x393C,0x3938,INVALC,0x3943,INVALC,INVALC,0x393F, + 0x3937,INVALC,0x3939,INVALC,0x3944,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4033,INVALC,INVALC,INVALC,0x402F,0x4031, + 0x402C,0x402B,0x4029,INVALC,0x4030,0x4032,0x402E,INVALC, + 0x402D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4035,INVALC,0x4739,0x473F,0x473A,0x473B,INVALC, + 0x4740,INVALC,INVALC,INVALC,INVALC,INVALC,0x4738,0x402A, + INVALC,INVALC,0x473E,0x473D,INVALC,INVALC,0x473C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D7D, + INVALC,INVALC,INVALC,0x4E2A,0x4E29,INVALC,0x4E24,INVALC, + 0x4E28,0x4D7E,0x4E21,INVALC,INVALC,INVALC,0x4E26,0x4D7C, + INVALC,INVALC,0x4E22,0x4E27,0x4E25,INVALC,0x4E23,INVALC, + /* Block 138, Array index 0x3C00 */ + INVALC,0x4034,INVALC,INVALC,INVALC,0x542B,0x5432,INVALC, + INVALC,0x5436,INVALC,0x542E,0x542C,INVALC,0x5435,INVALC, + INVALC,0x5434,INVALC,INVALC,0x542D,INVALC,0x5433,0x542F, + 0x5430,0x5431,INVALC,INVALC,INVALC,INVALC,0x5A3E,0x5A4A, + INVALC,INVALC,0x5A45,0x5A47,INVALC,INVALC,0x5A3F,0x5A43, + INVALC,0x5A46,INVALC,INVALC,0x5A49,0x5A41,0x5A42,0x5A48, + 0x5A40,0x5A44,INVALC,0x5F40,INVALC,0x5F3F,INVALC,0x5F45, + INVALC,INVALC,INVALC,INVALC,0x5F41,INVALC,0x5F42,INVALC, + INVALC,0x5F43,0x5F46,INVALC,INVALC,INVALC,0x6341,INVALC, + INVALC,0x6344,INVALC,0x633E,0x6340,INVALC,INVALC,0x633F, + 0x6342,0x6343,0x5F44,0x633D,INVALC,INVALC,INVALC,0x6677, + 0x667A,0x667C,0x6675,0x6676,0x6679,0x667B,INVALC,INVALC, + INVALC,0x6678,0x6674,0x6976,INVALC,INVALC,0x6977,INVALC, + INVALC,0x6C38,INVALC,0x6C3A,INVALC,0x6C37,0x6C39,INVALC, + INVALC,0x6E21,INVALC,0x6F4C,0x6F4B,INVALC,0x6F4A,INVALC, + INVALC,0x7137,0x7138,0x713A,0x7139,INVALC,0x2270,INVALC, + INVALC,INVALC,0x3948,INVALC,INVALC,0x4741,INVALC,INVALC, + 0x667D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4036,INVALC,0x4038, + 0x4037,INVALC,INVALC,0x4742,INVALC,0x4E2B,0x4E2E,0x4E2D, + INVALC,0x4E2C,0x5437,0x5439,0x5438,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F47,0x5F49,0x5F48, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6721,0x667E, + INVALC,0x6978,INVALC,INVALC,INVALC,INVALC,0x6E23,0x6E22, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2D50,INVALC,0x394B,0x3949,INVALC, + INVALC,0x394A,0x403A,0x403B,0x4749,0x4039,INVALC,0x4743, + 0x4747,0x4746,0x4748,INVALC,0x4745,0x4744,0x474A,INVALC, + 0x4E31,0x4E2F,INVALC,0x4E30,0x543C,0x543A,INVALC,INVALC, + 0x543B,0x5A4B,0x5F4A,0x5F4B,INVALC,INVALC,0x6722,0x6979, + INVALC,INVALC,0x6C3B,0x6E24,INVALC,INVALC,0x6F4D,0x713B, + /* Block 139, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,0x2D51,INVALC,INVALC,0x2D52, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3321,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x394F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x394D, + INVALC,INVALC,INVALC,INVALC,0x394E,INVALC,INVALC,INVALC, + 0x394C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x403E,INVALC,INVALC,INVALC,INVALC,INVALC,0x474F, + 0x4040,INVALC,INVALC,INVALC,0x4043,0x4044,INVALC,INVALC, + 0x4046,INVALC,0x4048,INVALC,0x4049,0x403D,0x403C,0x404A, + INVALC,0x4047,0x4045,INVALC,INVALC,INVALC,INVALC,0x4041, + 0x4042,0x403F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x474E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4756,0x4753,0x474B,0x4750, + INVALC,INVALC,0x4757,INVALC,INVALC,INVALC,INVALC,0x474D, + INVALC,0x4755,0x4751,0x4754,0x4752,INVALC,0x474C,INVALC, + INVALC,INVALC,INVALC,0x4E34,INVALC,INVALC,INVALC,0x4E36, + INVALC,INVALC,0x4E35,INVALC,INVALC,INVALC,0x4E37,INVALC, + INVALC,0x4E33,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E32,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x543F,INVALC,0x544B,0x5444,INVALC,0x544C,0x5446,INVALC, + 0x5447,INVALC,INVALC,0x544A,INVALC,0x5448,0x543E,INVALC, + 0x5A56,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x543D, + INVALC,0x5441,INVALC,0x5440,0x5442,0x5443,INVALC,0x5445, + 0x5449,0x544D,INVALC,INVALC,INVALC,0x5A51,0x5A57,0x5A54, + 0x5A4C,0x5A58,0x5A4D,INVALC,0x5A53,INVALC,INVALC,INVALC, + 0x5A59,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A5B, + 0x5A55,INVALC,0x5A4E,INVALC,0x5A4F,0x5A50,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A5C,INVALC,INVALC,INVALC,0x5A5A, + /* Block 140, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F50,0x5F59,0x5F56, + 0x5F58,INVALC,INVALC,0x5F51,INVALC,0x5F57,INVALC,0x5F53, + INVALC,0x5F4F,0x5F54,0x5F5B,0x5A52,0x5F55,0x5F4E,INVALC, + 0x5F4D,INVALC,0x5F5C,INVALC,0x5F5A,INVALC,0x5F4C,INVALC, + INVALC,INVALC,0x5F52,0x6347,0x6355,0x6350,0x6352,0x6346, + INVALC,INVALC,0x6345,INVALC,INVALC,INVALC,0x6354,0x634C, + 0x6349,0x634F,INVALC,0x6348,INVALC,0x634A,0x6353,0x6351, + INVALC,INVALC,0x6358,0x6356,0x634D,0x6357,0x634E,INVALC, + 0x6726,INVALC,0x672D,INVALC,INVALC,0x6C3E,INVALC,0x634B, + 0x6724,INVALC,0x6725,0x672A,INVALC,INVALC,INVALC,INVALC, + 0x6723,0x672C,0x672E,0x6727,0x6729,0x672B,0x6728,0x672F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x697C,INVALC,INVALC, + 0x697A,INVALC,INVALC,0x697E,INVALC,0x6A21,INVALC,0x6A22, + 0x697D,INVALC,0x697B,INVALC,INVALC,0x6A23,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C3D,0x6C3C,0x6C3F,0x6C40,INVALC,INVALC,0x6E25,0x6E2A, + INVALC,INVALC,0x6E27,INVALC,0x6E26,0x6E29,0x6E28,INVALC, + 0x6F51,INVALC,INVALC,0x6F50,0x6F4E,INVALC,0x6F4F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x704F,0x7050,INVALC,INVALC, + 0x713C,0x713D,INVALC,INVALC,INVALC,INVALC,0x7177,0x7236, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3950,INVALC,0x3951,0x4758,0x4E38,0x544E,INVALC, + INVALC,INVALC,0x6359,0x6730,INVALC,0x6F52,INVALC,0x3322, + INVALC,INVALC,0x475A,0x4759,INVALC,0x544F,INVALC,0x5F5D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x286B,0x3323, + INVALC,INVALC,INVALC,INVALC,0x3952,0x3953,INVALC,0x404B, + INVALC,INVALC,INVALC,INVALC,0x475C,0x475B,0x475D,INVALC, + 0x4E39,0x4E3A,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F61, + 0x5F5E,0x5F60,0x5F5F,INVALC,INVALC,0x635A,0x6732,0x6731, + 0x2524,INVALC,INVALC,0x3324,INVALC,0x3954,INVALC,INVALC, + 0x404D,0x404C,INVALC,INVALC,0x475F,0x4760,0x475E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5450, + 0x5A5F,0x5A5D,0x5A5E,INVALC,0x5F63,0x5F62,INVALC,0x635D, + 0x635C,0x635B,0x6733,INVALC,0x7178,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3326,0x3325,0x3955,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4050,INVALC,INVALC,INVALC,INVALC,0x4052,INVALC,INVALC, + INVALC,0x4051,0x404E,INVALC,INVALC,INVALC,0x404F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4761,INVALC,INVALC,0x4E3C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E3B,INVALC,0x4E3D, + INVALC,0x5453,0x5455,INVALC,INVALC,0x5456,INVALC,0x5452, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5451,INVALC,0x5457, + 0x5454,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A61,INVALC, + 0x5A63,0x5A62,INVALC,0x5A64,INVALC,0x5A60,INVALC,INVALC, + INVALC,0x5F64,INVALC,INVALC,INVALC,INVALC,0x635E,INVALC, + /* Block 142, Array index 0x4000 */ + 0x6361,INVALC,0x6360,INVALC,0x635F,INVALC,0x6734,0x6735, + INVALC,0x6736,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C41,INVALC,INVALC,INVALC,0x6C42,0x6E2B,INVALC,INVALC, + INVALC,0x6F53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4762,0x4763,INVALC,INVALC,0x5A65,INVALC,0x5A66,0x5F65, + INVALC,INVALC,0x2D53,INVALC,INVALC,INVALC,0x3327,INVALC, + 0x3328,0x3958,INVALC,0x3957,INVALC,0x3956,INVALC,INVALC, + 0x4054,INVALC,INVALC,INVALC,0x4053,INVALC,INVALC,INVALC, + INVALC,0x4055,INVALC,INVALC,0x4765,0x4768,0x4766,0x4767, + 0x476B,0x4764,0x476C,0x4769,0x476A,INVALC,0x4E3E,INVALC, + INVALC,INVALC,INVALC,0x545B,0x5459,INVALC,INVALC,INVALC, + 0x5458,0x545A,INVALC,INVALC,INVALC,0x5A67,INVALC,0x5A68, + INVALC,INVALC,0x6738,0x673A,0x6737,0x6739,0x6A24,0x6C43, + INVALC,INVALC,0x715E,INVALC,INVALC,0x3329,0x332B,0x332A, + INVALC,0x395B,INVALC,INVALC,0x3959,INVALC,INVALC,0x395C, + INVALC,0x395D,0x395A,INVALC,INVALC,0x4061,INVALC,0x4059, + 0x405F,INVALC,INVALC,INVALC,INVALC,0x4058,INVALC,0x405C, + 0x4772,INVALC,INVALC,0x4057,INVALC,0x405D,0x405A,0x4060, + 0x4056,0x405E,INVALC,INVALC,0x405B,INVALC,INVALC,INVALC, + 0x476E,INVALC,0x4775,0x4774,INVALC,INVALC,INVALC,0x4776, + INVALC,0x4773,INVALC,0x4778,0x476F,INVALC,0x4771,INVALC, + 0x476D,0x4770,0x4777,INVALC,0x4779,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E43,0x4E49,0x4E41, + /* Block 143, Array index 0x4100 */ + 0x4E4A,INVALC,0x4E40,0x4E45,0x4E4B,0x4E48,0x4E47,0x4E46, + INVALC,0x4E3F,0x4E44,INVALC,INVALC,0x4E42,INVALC,INVALC, + INVALC,0x5464,0x5469,0x546B,0x5468,0x5461,0x5463,0x546D, + 0x546A,0x5465,0x546E,0x5462,0x546C,INVALC,INVALC,INVALC, + 0x545C,INVALC,INVALC,0x545D,0x545F,0x545E,0x5466,0x5467, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5460,INVALC, + 0x5A72,INVALC,INVALC,0x5A69,INVALC,INVALC,0x5A6E,INVALC, + 0x5A6B,INVALC,INVALC,INVALC,0x5A6F,0x5A70,0x5A6A,0x5A73, + 0x5A6C,0x5A71,INVALC,INVALC,INVALC,0x5A6D,INVALC,0x5F6B, + INVALC,INVALC,INVALC,INVALC,0x5F6A,0x5F67,0x5F66,INVALC, + 0x5F69,INVALC,INVALC,0x5F68,0x636F,INVALC,0x6366,0x6365, + INVALC,INVALC,0x636B,0x636A,0x6362,0x636D,0x6367,INVALC, + 0x6364,0x636C,0x6363,INVALC,INVALC,0x6368,INVALC,0x6369, + INVALC,0x636E,0x673E,INVALC,INVALC,0x673B,INVALC,0x673F, + INVALC,INVALC,INVALC,0x673D,INVALC,INVALC,INVALC,INVALC, + 0x673C,INVALC,INVALC,0x6740,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A27,INVALC,0x6A25,INVALC, + 0x6A26,INVALC,INVALC,INVALC,0x6C45,INVALC,0x6C44,INVALC, + 0x6E30,INVALC,0x6E2F,INVALC,0x6E2D,0x6E2C,0x6E31,0x6E32, + 0x6F54,INVALC,0x6E2E,INVALC,INVALC,0x7054,0x7051,0x7052, + 0x7053,INVALC,INVALC,0x7140,0x713F,0x713E,0x715F,INVALC, + 0x722E,0x7179,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A74,INVALC,INVALC, + INVALC,INVALC,0x6741,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x717A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x332C,INVALC,0x332D,INVALC,INVALC,INVALC,0x3962, + 0x395E,INVALC,INVALC,INVALC,0x3961,0x3960,0x395F,INVALC, + 0x3963,0x3964,INVALC,INVALC,INVALC,0x4068,0x4066,0x406A, + 0x406B,0x4071,INVALC,0x406D,0x406F,INVALC,0x4067,0x4062, + INVALC,0x406E,INVALC,INVALC,0x4070,0x4069,0x406C,0x4063, + INVALC,0x4065,0x4064,INVALC,INVALC,INVALC,INVALC,0x477B, + /* Block 144, Array index 0x4200 */ + 0x477D,0x477C,0x4823,INVALC,INVALC,0x477E,0x477A,0x4821, + 0x4822,INVALC,INVALC,0x4824,INVALC,0x4E4F,0x4E4E,INVALC, + 0x4E4C,0x4E4D,INVALC,INVALC,INVALC,INVALC,0x5475,0x5476, + 0x5471,INVALC,0x5472,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5473,INVALC,INVALC,0x5474,0x5470,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x546F,INVALC,0x5A76,INVALC, + INVALC,INVALC,0x5A78,INVALC,0x5A7B,0x5A77,0x5A75,0x5A7A, + INVALC,0x5A79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F6D,INVALC,INVALC,0x5F6C,INVALC,INVALC,0x6370,0x6371, + 0x6372,INVALC,INVALC,0x6373,INVALC,INVALC,INVALC,0x6744, + 0x6745,0x6743,0x6742,0x6746,INVALC,0x6A2B,0x6A29,0x6A2A, + 0x6A2C,0x6A28,0x6A2D,0x6C47,INVALC,0x6C48,0x6C46,INVALC, + 0x6E33,INVALC,0x6E34,0x6F56,0x6F55,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6747,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2526, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2525,INVALC,0x286D,INVALC,0x286F,INVALC,INVALC, + INVALC,INVALC,0x286C,0x286E,INVALC,0x2871,0x2870,0x2872, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2D57,0x2D55,INVALC,0x2D54,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2D56,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x332F,0x3335,INVALC, + INVALC,INVALC,INVALC,0x3332,0x3334,INVALC,0x332E,0x3331, + /* Block 145, Array index 0x4300 */ + INVALC,INVALC,0x3330,INVALC,0x3333,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3966,0x3969,INVALC,INVALC,INVALC, + INVALC,0x3967,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3968,INVALC,INVALC,INVALC, + INVALC,0x396A,INVALC,INVALC,0x3965,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4072,INVALC,0x4074, + INVALC,INVALC,INVALC,INVALC,0x4073,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4829,INVALC,0x4826, + INVALC,INVALC,INVALC,INVALC,0x4827,INVALC,INVALC,INVALC, + INVALC,0x4828,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4825,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x547A, + INVALC,INVALC,INVALC,0x547B,INVALC,INVALC,INVALC,0x5479, + 0x5478,INVALC,INVALC,0x5477,INVALC,INVALC,0x5A7C,INVALC, + INVALC,0x5A7D,INVALC,0x5A7E,INVALC,INVALC,0x5F6F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F6E,0x5B21,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A2E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2275,INVALC,INVALC,0x2272, + 0x2273,0x2271,INVALC,0x2274,INVALC,INVALC,0x252A,0x2527, + 0x252C,0x2528,INVALC,INVALC,INVALC,0x2529,INVALC,0x252B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2875, + 0x2877,INVALC,0x2873,0x2876,0x2874,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2D59,0x2D5D,0x2D5A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2D5C,INVALC,0x2D5E, + 0x2D60,INVALC,INVALC,0x2D5F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3971,0x2D5B,0x3336,0x333F, + 0x333D,0x3338,0x3339,0x333E,0x3340,INVALC,INVALC,0x333B, + 0x3337,INVALC,INVALC,0x333A,0x3341,0x333C,INVALC,INVALC, + INVALC,0x3974,0x396C,0x3972,0x3973,INVALC,INVALC,0x396B, + 0x396D,0x2D58,0x396F,0x3970,0x396E,INVALC,INVALC,INVALC, + INVALC,0x407B,0x5B22,0x407C,0x4079,INVALC,INVALC,0x4078, + /* Block 146, Array index 0x4400 */ + 0x407E,0x407D,INVALC,0x4123,0x4077,0x4122,0x4075,0x4121, + 0x407A,INVALC,INVALC,0x4830,INVALC,0x482B,0x4831,0x482C, + 0x482A,0x482D,INVALC,INVALC,0x482F,INVALC,0x482E,INVALC, + INVALC,INVALC,0x4E56,0x4E59,0x4E51,0x4E55,INVALC,0x4E54, + 0x4E52,0x4E58,0x4E53,0x4E50,0x4E57,INVALC,0x5523,INVALC, + 0x6374,0x547E,0x5521,0x547D,0x4076,INVALC,0x5524,0x547C, + INVALC,INVALC,0x5522,0x5B23,INVALC,0x5B24,0x5B25,INVALC, + 0x5F70,INVALC,0x6375,0x6376,INVALC,INVALC,0x6377,0x6749, + 0x6748,0x6A30,INVALC,0x6A2F,0x6C4A,0x6C4B,0x6C49,0x6E35, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3343,0x3344, + 0x3342,INVALC,INVALC,0x3978,INVALC,0x3979,0x3975,INVALC, + 0x3976,INVALC,0x3977,INVALC,INVALC,INVALC,INVALC,0x4126, + 0x4128,0x4124,0x4127,INVALC,0x4125,INVALC,INVALC,INVALC, + 0x4279,INVALC,INVALC,INVALC,INVALC,INVALC,0x4832,0x4833, + INVALC,INVALC,0x4E5B,0x4E5D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E5C,0x4E5A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x552B,0x5528,0x5529,INVALC,0x552A,0x5525,0x5526,INVALC, + INVALC,INVALC,0x5527,INVALC,INVALC,0x5B29,INVALC,0x5B2A, + 0x5B27,0x5B28,INVALC,0x5B26,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F74,0x5F71,0x5F73,INVALC,0x5F77,INVALC,0x5F75, + 0x5F78,0x5F76,0x5F72,INVALC,INVALC,0x6379,INVALC,0x637A, + 0x6378,INVALC,0x637C,INVALC,INVALC,0x674B,INVALC,0x637B, + 0x674A,INVALC,0x6A33,0x6A34,INVALC,0x6A32,INVALC,0x6A31, + INVALC,0x6C4C,INVALC,INVALC,0x6F57,0x7056,0x7055,INVALC, + INVALC,INVALC,0x7057,0x7160,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2D62,0x2D61,0x3345,INVALC,INVALC, + INVALC,INVALC,0x3347,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3346,INVALC,0x3A21,INVALC,INVALC,INVALC, + 0x3A26,INVALC,0x3A23,0x3A24,0x397A,INVALC,0x3A27,INVALC, + INVALC,0x397C,INVALC,0x397D,0x397B,INVALC,INVALC,0x3A25, + 0x397E,0x3A22,INVALC,INVALC,INVALC,0x4134,INVALC,0x4133, + /* Block 147, Array index 0x4500 */ + 0x4131,0x4129,0x4138,0x412C,0x4136,0x413D,0x4135,INVALC, + INVALC,INVALC,0x412A,INVALC,0x4130,INVALC,INVALC,0x412F, + INVALC,INVALC,0x4132,INVALC,INVALC,INVALC,0x413E,0x413C, + INVALC,0x413B,0x412D,INVALC,0x4139,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x413A,0x412B,0x412E,0x4137, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F22,0x483D,INVALC, + 0x4836,0x4849,0x4852,0x4839,INVALC,INVALC,0x4846,INVALC, + INVALC,INVALC,0x4837,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x483F,INVALC, + 0x4834,INVALC,0x483E,INVALC,0x4850,INVALC,0x484E,0x4842, + 0x484C,INVALC,0x4835,0x484F,0x484A,INVALC,0x4851,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x483B,INVALC, + 0x4843,0x4847,INVALC,0x484B,INVALC,0x483A,0x4838,0x4844, + INVALC,INVALC,INVALC,INVALC,0x4841,0x4840,INVALC,0x4845, + 0x4848,INVALC,0x484D,INVALC,INVALC,INVALC,0x4E60,INVALC, + INVALC,0x4E6A,0x4E62,INVALC,INVALC,0x4E73,0x4E7B,0x4E6C, + INVALC,INVALC,0x4E70,0x483C,INVALC,INVALC,0x4E77,0x4E7C, + 0x4E74,INVALC,0x4E76,0x4F21,0x4E78,0x4E66,0x4E6F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E64,0x4E71,INVALC,0x4E6B, + INVALC,0x4E79,0x4E68,0x4E61,INVALC,0x4E7E,INVALC,INVALC, + 0x4E63,0x4E75,0x4E72,0x4E6D,0x4E5F,0x4E5E,0x4E67,0x4E7A, + INVALC,0x4E7D,0x4E65,0x4E69,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x554D,0x5549,0x5531,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x552F,INVALC,0x553B,0x552D,0x552E,INVALC,0x554C,INVALC, + 0x553E,0x5543,0x553D,0x5B3C,0x5539,0x5541,0x553F,0x5532, + 0x552C,0x5547,INVALC,0x5548,INVALC,0x5542,INVALC,0x5537, + 0x5535,0x5530,INVALC,INVALC,INVALC,0x5538,0x5545,0x5534, + 0x5544,0x554A,INVALC,INVALC,INVALC,INVALC,0x5540,0x5546, + 0x553C,0x5536,INVALC,INVALC,INVALC,INVALC,0x4E6E,0x553A, + INVALC,0x5533,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B41, + INVALC,0x5B40,0x5B3E,0x5B50,INVALC,INVALC,0x5B4D,0x5B45, + /* Block 148, Array index 0x4600 */ + 0x5B4F,0x5B37,0x5B43,INVALC,INVALC,INVALC,0x5B2F,INVALC, + 0x5B2D,0x5B4E,INVALC,0x5B4C,0x5B4B,0x5B3B,0x5B3A,0x5B30, + INVALC,INVALC,0x5B36,0x5B3F,0x5B4A,INVALC,0x5B51,INVALC, + INVALC,INVALC,INVALC,0x5B34,INVALC,0x5B3D,0x5B2C,0x5B2E, + INVALC,INVALC,INVALC,0x5B35,0x5B44,0x554B,INVALC,0x5B2B, + INVALC,0x5B46,0x5B49,INVALC,INVALC,0x5B39,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B42,0x5B48,INVALC,INVALC, + 0x5B32,0x5B47,INVALC,INVALC,0x5B33,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B38,0x5F7E, + INVALC,0x6025,INVALC,INVALC,0x602B,INVALC,0x6039,0x6031, + 0x6026,0x6027,0x6030,INVALC,INVALC,0x602F,0x5F7D,0x602E, + 0x6022,0x603A,INVALC,INVALC,0x6023,INVALC,0x6036,INVALC, + 0x6028,0x6035,INVALC,0x6037,0x5F7C,INVALC,INVALC,0x6038, + INVALC,INVALC,0x602C,INVALC,INVALC,0x6029,INVALC,INVALC, + INVALC,0x6032,INVALC,INVALC,INVALC,INVALC,0x6024,0x6033, + INVALC,0x602D,0x5B31,0x6034,0x6021,INVALC,INVALC,INVALC, + 0x642F,INVALC,INVALC,0x5F7A,INVALC,INVALC,INVALC,INVALC, + 0x642C,0x6425,INVALC,INVALC,0x637E,0x6430,0x6427,0x602A, + INVALC,0x6432,0x6421,INVALC,INVALC,0x642B,INVALC,INVALC, + INVALC,0x642D,INVALC,0x6423,INVALC,0x6424,0x6429,0x642E, + INVALC,0x5F79,INVALC,0x6437,0x6434,0x6761,0x642A,0x6426, + 0x6435,0x6756,0x6428,INVALC,INVALC,INVALC,INVALC,0x5F7B, + INVALC,0x6431,0x6433,INVALC,0x6436,0x637D,INVALC,0x6422, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x675F,INVALC,0x674F,INVALC,0x675D,INVALC,INVALC,0x674D, + INVALC,INVALC,0x6758,INVALC,0x6754,INVALC,0x675E,0x674E, + 0x6751,INVALC,0x6760,INVALC,0x6759,0x675C,INVALC,INVALC, + INVALC,0x6755,0x6750,INVALC,INVALC,INVALC,0x674C,INVALC, + INVALC,INVALC,INVALC,0x675B,INVALC,INVALC,0x6757,0x6762, + INVALC,INVALC,INVALC,INVALC,0x6753,INVALC,0x675A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A41,0x6A50,0x6A43, + 0x6A4A,0x6752,0x6A48,0x6A37,0x6A4E,INVALC,0x6A3B,0x6A4D, + /* Block 149, Array index 0x4700 */ + 0x6A42,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A52,0x6A44, + INVALC,0x6A49,0x6A4C,0x6A35,0x6A4F,0x6A40,0x6A45,0x6A39, + 0x6A3D,0x6A51,0x6A47,0x6A36,0x6A3A,0x6A3C,0x6A46,INVALC, + INVALC,0x6A3F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A3E,0x6C50,0x6C54,INVALC,0x6C56,INVALC,INVALC,INVALC, + 0x6C52,0x6C58,INVALC,INVALC,INVALC,INVALC,0x6C4F,0x6C55, + INVALC,0x6C53,INVALC,0x6C4E,0x6A4B,0x6C51,INVALC,0x6C4D, + 0x6C57,INVALC,INVALC,INVALC,INVALC,0x6E3C,0x6E3F,0x6E3B, + 0x6E3D,0x6E3E,0x6E38,0x6E39,0x6E36,INVALC,INVALC,0x6E3A, + 0x6E37,INVALC,INVALC,INVALC,INVALC,0x6F59,INVALC,0x6F5B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F5A,0x6F5C,INVALC, + INVALC,INVALC,0x6F58,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7059,0x705A,INVALC,0x7058,INVALC,0x7142,0x7141,0x7143, + INVALC,0x7144,INVALC,0x7145,0x7161,0x7164,0x7163,INVALC, + 0x7162,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7230,0x7231,0x722F,0x7237,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A28,0x413F,0x554E,0x6763,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A29,INVALC, + 0x3A2A,INVALC,INVALC,INVALC,0x4141,0x4140,INVALC,INVALC, + 0x4142,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4856,0x4854,INVALC,0x4855,0x4853, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5550,0x554F,INVALC,0x5551,INVALC, + 0x5552,INVALC,INVALC,INVALC,INVALC,0x5B59,0x5B57,0x6040, + INVALC,0x5B55,0x5B56,INVALC,0x5B52,0x5B5A,0x5B54,0x5B58, + 0x603C,INVALC,INVALC,0x603E,INVALC,0x603F,INVALC,0x603B, + INVALC,0x603D,INVALC,INVALC,INVALC,0x5B53,INVALC,INVALC, + INVALC,0x643A,0x6438,0x6439,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6764,0x6765,INVALC,INVALC,0x6A53,0x6A55, + 0x6A54,INVALC,INVALC,0x6C5B,0x6C5A,0x6C59,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2169,INVALC, + 0x2278,INVALC,0x2276,0x2279,0x2277,INVALC,INVALC,INVALC, + 0x252E,INVALC,INVALC,INVALC,INVALC,0x2530,INVALC,0x252F, + 0x252D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2878,0x287B,INVALC,0x287A,0x2879,INVALC,INVALC, + INVALC,INVALC,INVALC,0x287C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2D67,INVALC,INVALC,INVALC,0x2D68,0x2D64, + INVALC,0x2D65,INVALC,0x2D66,0x2D63,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3348,INVALC,INVALC,0x3349, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3A2D,INVALC,0x3A2C,INVALC,0x3A2F, + INVALC,0x3A2E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A2B,INVALC,0x4144,INVALC, + 0x4148,INVALC,INVALC,0x4147,INVALC,INVALC,INVALC,0x4143, + 0x4145,0x4146,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4859,0x4857,0x4858,INVALC,INVALC,INVALC,0x485A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F23,INVALC, + INVALC,0x4F24,0x5554,INVALC,0x5553,INVALC,INVALC,INVALC, + INVALC,0x5B5B,INVALC,INVALC,0x6043,INVALC,0x6041,INVALC, + 0x6042,INVALC,INVALC,0x643B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x334A,INVALC,INVALC,0x3A30, + INVALC,INVALC,0x4149,0x414B,INVALC,INVALC,INVALC,INVALC, + 0x414A,INVALC,INVALC,INVALC,INVALC,INVALC,0x485B,INVALC, + INVALC,INVALC,INVALC,0x5555,0x5B5C,INVALC,INVALC,0x643C, + 0x6440,INVALC,0x643D,INVALC,INVALC,0x6441,INVALC,0x643F, + INVALC,0x6766,INVALC,INVALC,INVALC,0x705B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x414D,0x414C,INVALC,INVALC,INVALC,0x485F,INVALC,INVALC, + 0x485E,INVALC,0x485C,INVALC,INVALC,0x485D,INVALC,0x4F25, + /* Block 152, Array index 0x4A00 */ + INVALC,INVALC,0x5558,INVALC,INVALC,0x5556,INVALC,INVALC, + 0x5557,INVALC,INVALC,0x5B5D,INVALC,INVALC,INVALC,INVALC, + 0x5B5F,INVALC,0x5B5E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6046,0x6048,INVALC,INVALC,INVALC,0x6047,INVALC,0x6045, + 0x6044,INVALC,0x6443,0x6442,INVALC,0x6444,0x676B,INVALC, + 0x676A,0x6767,INVALC,0x6768,0x6769,INVALC,0x6A56,0x6A57, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C5C,INVALC,INVALC, + INVALC,INVALC,0x6C5D,INVALC,INVALC,INVALC,INVALC,0x6E40, + INVALC,INVALC,INVALC,0x705D,INVALC,INVALC,0x705C,0x705E, + INVALC,0x7146,INVALC,0x717B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F26,INVALC,0x5559,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A31,INVALC,0x414E,INVALC,0x4150,INVALC, + 0x414F,INVALC,0x4863,0x4860,INVALC,INVALC,INVALC,0x4861, + 0x4862,INVALC,0x4F28,0x4F2D,INVALC,0x4F27,0x4F29,0x4F30, + 0x4F2B,0x4F2F,0x4F2C,0x4F2A,0x4F2E,INVALC,INVALC,INVALC, + 0x555C,INVALC,0x555A,INVALC,INVALC,INVALC,0x555B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B62,INVALC,INVALC,0x5B61, + INVALC,0x5B60,0x6049,INVALC,0x604B,0x604D,0x604C,INVALC, + INVALC,0x604A,0x644B,INVALC,0x6449,0x644C,INVALC,INVALC, + 0x6447,INVALC,0x644A,0x6448,0x6445,INVALC,0x6446,INVALC, + INVALC,INVALC,INVALC,0x676C,INVALC,INVALC,0x676E,0x676D, + INVALC,0x6A58,INVALC,0x6A59,INVALC,INVALC,INVALC,0x6C5E, + INVALC,INVALC,INVALC,INVALC,0x6F5D,0x6F5E,INVALC,0x705F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F32,0x4F31,0x555E, + 0x555D,INVALC,INVALC,INVALC,0x604F,0x604E,0x644F,0x644D, + 0x6450,0x644E,INVALC,INVALC,INVALC,0x676F,0x6770,0x6771, + INVALC,0x6C5F,INVALC,0x6E41,INVALC,0x7060,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B63,0x6050,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B64,INVALC,0x6451,INVALC,INVALC,0x6A5A,0x6A5B,INVALC, + /* Block 153, Array index 0x4B00 */ + 0x6F5F,INVALC,INVALC,INVALC,0x3A32,INVALC,INVALC,0x4151, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4865,0x4866,0x4864, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F33,INVALC, + INVALC,INVALC,INVALC,0x5565,INVALC,0x5560,0x555F,INVALC, + 0x5564,INVALC,INVALC,INVALC,INVALC,INVALC,0x5561,0x5566, + 0x5563,0x5562,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B66, + INVALC,INVALC,0x5B67,INVALC,INVALC,0x5B65,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6051,INVALC,0x6056,0x6052,0x6055,INVALC,INVALC, + 0x5E41,0x6054,0x6053,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6452,0x6453,0x6454,INVALC,INVALC,INVALC,INVALC,0x6775, + INVALC,0x6773,INVALC,INVALC,0x6772,0x6774,INVALC,0x6A5F, + 0x6A5C,INVALC,0x6A5D,0x6A5E,0x6C60,INVALC,INVALC,INVALC, + INVALC,0x6E43,0x6E42,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7147,0x717C,0x717D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4152,INVALC,INVALC,0x4867,0x4F34,0x4F35,INVALC, + INVALC,INVALC,0x5567,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6455,INVALC,INVALC,0x6778,INVALC,0x6777,0x6779,0x6776, + 0x6C63,0x6A60,0x6A61,INVALC,INVALC,INVALC,0x6C62,INVALC, + INVALC,0x6C61,INVALC,0x6E44,0x717E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x334B,INVALC,0x3A33,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4153,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4868,INVALC, + INVALC,0x4869,0x5569,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 154, Array index 0x4C00 */ + 0x4F37,INVALC,0x4F36,INVALC,INVALC,INVALC,INVALC,0x4F38, + 0x5568,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x556A,INVALC,INVALC,0x556B,0x556E,0x556C,0x556D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B69, + INVALC,INVALC,INVALC,INVALC,0x5B68,0x6057,INVALC,0x5B6A, + INVALC,0x5B6B,0x605A,0x6058,0x6059,0x605E,INVALC,0x605D, + 0x6060,0x605F,0x605C,0x605B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6458,INVALC,0x6457,INVALC,INVALC,INVALC, + INVALC,0x6456,INVALC,0x677C,INVALC,INVALC,INVALC,0x677B, + 0x677A,INVALC,INVALC,0x6A66,0x6A65,INVALC,0x6A63,INVALC, + 0x6A62,INVALC,INVALC,0x6A67,0x6E45,INVALC,0x6C65,INVALC, + 0x6C64,0x6A64,INVALC,0x6E46,INVALC,INVALC,INVALC,0x7148, + INVALC,0x7221,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A34, + 0x6061,INVALC,INVALC,INVALC,0x4F3A,0x4F39,0x5B6C,INVALC, + INVALC,0x6063,INVALC,0x6062,INVALC,INVALC,0x677D,0x677E, + INVALC,INVALC,INVALC,0x7222,INVALC,INVALC,INVALC,0x486A, + 0x486C,INVALC,0x486B,INVALC,INVALC,0x486D,INVALC,INVALC, + INVALC,0x4F3C,0x4F3E,0x4F3D,INVALC,0x4F40,INVALC,INVALC, + INVALC,INVALC,0x4F3F,0x4F3B,INVALC,INVALC,INVALC,0x4F41, + INVALC,0x5575,INVALC,0x5578,0x557A,0x5570,0x5574,0x5571, + INVALC,INVALC,INVALC,0x5572,0x5573,INVALC,0x5576,0x5579, + 0x5577,INVALC,INVALC,INVALC,0x556F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B72,0x5B70,0x5B6F,INVALC,0x5B75, + INVALC,0x5B74,0x5B73,INVALC,0x5B6E,INVALC,0x5B6D,INVALC, + 0x5B71,INVALC,INVALC,INVALC,0x6066,INVALC,0x606A,0x6067, + 0x6069,0x6068,0x6065,0x606B,0x606E,0x606C,0x606D,INVALC, + /* Block 155, Array index 0x4D00 */ + INVALC,INVALC,0x6064,0x606F,0x645D,0x6460,0x6462,0x6461, + INVALC,0x645B,0x645F,0x645A,INVALC,0x645C,INVALC,0x6459, + INVALC,0x645E,INVALC,INVALC,0x682D,0x6822,INVALC,INVALC, + INVALC,INVALC,0x6821,0x6826,0x682C,0x6824,0x682B,INVALC, + 0x6828,INVALC,0x6827,0x682A,0x6825,0x6823,INVALC,0x6829, + INVALC,0x6A6E,0x6A6C,INVALC,0x6A6B,0x6A71,0x6A6F,INVALC, + INVALC,0x6A6A,0x6A68,INVALC,0x6A69,INVALC,0x6A6D,INVALC, + 0x6A70,0x6C66,0x6C6C,INVALC,INVALC,0x6C67,INVALC,0x6C6D, + INVALC,0x6C6B,0x6C6A,INVALC,0x6C69,INVALC,0x6C68,INVALC, + 0x6E4C,0x6E4E,0x6E4D,INVALC,0x6E4A,INVALC,0x6E47,0x6E4B, + 0x6E50,INVALC,0x6E4F,0x6E48,0x6E49,INVALC,0x6F60,INVALC, + INVALC,0x6F61,INVALC,INVALC,INVALC,INVALC,0x7061,INVALC, + 0x7165,INVALC,INVALC,INVALC,0x7223,INVALC,0x7224,0x7225, + 0x7233,0x7232,INVALC,0x723B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x486F,INVALC,0x486E,INVALC,INVALC, + INVALC,0x4F42,INVALC,0x557B,0x5B78,INVALC,INVALC,INVALC, + INVALC,0x5B76,INVALC,0x5B79,INVALC,INVALC,0x6070,0x5B77, + 0x6463,INVALC,0x682E,INVALC,INVALC,INVALC,0x6A74,0x6A72, + INVALC,INVALC,0x6A73,INVALC,INVALC,0x6C6E,INVALC,INVALC, + 0x6E51,INVALC,INVALC,INVALC,INVALC,0x7062,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6464,INVALC,INVALC,0x334C, + INVALC,INVALC,INVALC,0x4F43,INVALC,INVALC,INVALC,0x4F44, + INVALC,INVALC,INVALC,0x557D,0x557C,INVALC,INVALC,INVALC, + INVALC,0x5622,0x5621,0x557E,INVALC,INVALC,0x5B7A,0x5B7D, + INVALC,0x5B7C,0x5B7B,INVALC,0x6074,0x6072,0x6071,INVALC, + /* Block 156, Array index 0x4E00 */ + INVALC,0x6073,INVALC,INVALC,0x6466,0x6467,INVALC,INVALC, + 0x6465,INVALC,0x6830,0x682F,0x6832,INVALC,0x6831,INVALC, + 0x6A75,0x6A77,0x6A76,INVALC,INVALC,0x6C6F,0x6C72,0x6C70, + 0x6C71,0x6E52,INVALC,INVALC,INVALC,INVALC,0x6F62,0x6F63, + 0x6F64,INVALC,INVALC,INVALC,0x7226,INVALC,INVALC,INVALC, + INVALC,0x6468,INVALC,0x6E53,INVALC,INVALC,0x7166,0x334D, + INVALC,INVALC,INVALC,0x5B7E,INVALC,0x6469,INVALC,0x6833, + INVALC,INVALC,0x6C73,0x6E54,INVALC,INVALC,0x4F45,0x4F46, + INVALC,INVALC,INVALC,0x5624,INVALC,INVALC,0x5623,INVALC, + 0x6075,INVALC,0x646A,0x646C,0x646B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C74,INVALC,INVALC,0x6E56,0x6E55,INVALC, + INVALC,0x7063,INVALC,0x4870,INVALC,INVALC,INVALC,0x4F49, + 0x4F47,0x4F48,INVALC,INVALC,0x562D,INVALC,0x5628,0x5625, + 0x562C,INVALC,INVALC,INVALC,0x562E,INVALC,INVALC,INVALC, + 0x562B,0x5627,INVALC,INVALC,0x5626,0x562A,0x5629,INVALC, + INVALC,INVALC,0x5C2B,0x5C26,0x5C24,0x5C2D,0x5C25,INVALC, + 0x5C21,INVALC,0x5C27,INVALC,INVALC,0x5C22,0x607E,0x5C23, + 0x5C2E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C2A,INVALC,0x5C29,0x5C28,INVALC,0x5C2C,INVALC,INVALC, + INVALC,INVALC,0x6076,0x6079,INVALC,INVALC,0x6078,INVALC, + 0x6122,0x607B,0x6121,INVALC,0x607D,0x607C,0x607A,INVALC, + 0x6077,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6123, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6472,0x6475,INVALC, + 0x6473,0x6477,INVALC,INVALC,INVALC,0x6478,INVALC,0x6470, + INVALC,0x6471,INVALC,0x646F,0x6476,INVALC,0x646E,0x646D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6474,0x683C,0x6842,INVALC,0x683D, + INVALC,0x6840,0x6844,INVALC,0x683F,INVALC,0x6837,INVALC, + 0x6836,0x6843,0x683A,INVALC,0x6838,0x6841,0x6839,INVALC, + INVALC,INVALC,0x6834,0x6835,0x683E,INVALC,INVALC,INVALC, + 0x683B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A7A, + 0x6A7D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 157, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A7B,0x6B23,0x6B21, + 0x6A79,0x6B26,INVALC,0x6A78,INVALC,INVALC,0x6B22,INVALC, + INVALC,INVALC,0x6A7C,INVALC,0x6B25,INVALC,INVALC,0x6B24, + INVALC,INVALC,INVALC,INVALC,0x6C77,0x6C76,INVALC,INVALC, + INVALC,0x6C7D,INVALC,0x6C79,0x6C7C,INVALC,INVALC,INVALC, + 0x6C7A,0x6C7B,INVALC,0x6C75,0x6C78,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E61,0x6E5C,0x6E60,INVALC,0x6E63,0x6E5F, + INVALC,0x6E5B,INVALC,INVALC,0x6E5E,0x6E62,INVALC,0x6E59, + 0x6A7E,0x6E5D,INVALC,INVALC,0x6E5A,INVALC,0x6E57,INVALC, + 0x6E58,INVALC,0x6F68,0x6F6A,0x6F6D,0x6F69,0x6F6E,INVALC, + 0x6F67,INVALC,0x6F65,INVALC,INVALC,0x6F6B,INVALC,INVALC, + 0x6F66,0x6F6C,INVALC,INVALC,INVALC,INVALC,0x7068,INVALC, + 0x7069,INVALC,0x7067,0x7064,INVALC,INVALC,0x7066,0x7065, + 0x7149,INVALC,INVALC,INVALC,INVALC,0x714B,0x714A,INVALC, + INVALC,0x7169,INVALC,0x7168,0x7167,0x716A,INVALC,INVALC, + INVALC,0x7238,0x723C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4154,0x4873, + INVALC,INVALC,0x4871,INVALC,INVALC,0x4872,INVALC,INVALC, + INVALC,0x4F4A,0x4F4B,INVALC,INVALC,0x4F4C,INVALC,0x5633, + INVALC,0x5636,0x5630,0x5637,0x562F,0x5631,INVALC,0x5632, + /* Block 158, Array index 0x5000 */ + 0x5635,INVALC,INVALC,INVALC,0x563A,0x5639,INVALC,0x5634, + 0x5638,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C38,INVALC,INVALC,INVALC,0x5C33,INVALC,INVALC,0x5C30, + 0x5C36,0x5C39,INVALC,INVALC,INVALC,0x5C35,0x5C32,0x5C3A, + 0x5C31,INVALC,0x5C37,INVALC,INVALC,0x5C2F,INVALC,INVALC, + INVALC,0x5C34,INVALC,INVALC,INVALC,0x6135,0x6128,0x6129, + 0x612C,0x612A,INVALC,0x6124,INVALC,INVALC,0x6127,0x6131, + 0x612B,INVALC,INVALC,INVALC,INVALC,0x6133,0x6130,INVALC, + 0x6132,0x6125,0x612E,0x612F,INVALC,0x612D,INVALC,INVALC, + INVALC,INVALC,0x647C,0x647E,0x6523,INVALC,INVALC,0x647B, + INVALC,INVALC,0x6525,0x647A,0x6526,INVALC,0x6522,0x6524, + 0x6528,0x6521,0x6529,0x647D,0x6479,INVALC,INVALC,0x6527, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6126, + 0x685E,0x6855,INVALC,0x6851,INVALC,INVALC,INVALC,0x685A, + 0x6854,0x684A,INVALC,0x6857,0x6852,0x6853,INVALC,0x6845, + 0x684C,0x685B,INVALC,0x6858,INVALC,0x6850,INVALC,0x685C, + 0x684B,0x6846,0x6859,INVALC,0x6848,0x6856,0x684D,0x685D, + 0x6849,INVALC,0x6847,0x684E,0x684F,INVALC,INVALC,INVALC, + 0x6B2D,INVALC,0x6B2B,INVALC,0x6B30,INVALC,0x6B3C,0x6B33, + 0x6B2C,0x6B28,0x6B35,0x6B2E,0x6B31,0x6B2A,0x6B38,0x6B27, + 0x6B2F,0x6B34,0x6B36,0x6B39,0x6B29,INVALC,0x6B3D,0x6B3E, + 0x6B37,0x6B3B,0x6B32,INVALC,0x6D2F,0x6D32,INVALC,INVALC, + INVALC,0x6D31,0x6D36,0x6D34,INVALC,0x6D2B,0x6D21,0x6C7E, + INVALC,0x6D2D,0x6D2E,0x6D2A,0x6D22,INVALC,0x6D27,0x6B3A, + INVALC,0x6D23,INVALC,0x6D29,INVALC,0x6D28,INVALC,0x6D24, + 0x6D30,INVALC,0x6D25,0x6E68,0x6D33,0x6D35,0x6D2C,0x6D26, + 0x6E69,0x6E6B,0x6E65,INVALC,INVALC,0x6E72,0x6E70,INVALC, + 0x6E6F,0x6E6E,0x6E67,0x6E64,0x6E6A,0x6E73,0x6E66,0x6E6C, + INVALC,0x6F77,0x6F7C,0x6F72,0x6F75,INVALC,0x6F79,INVALC, + 0x7022,0x6E6D,INVALC,0x6F73,0x6F7D,0x7023,0x6F78,0x6F71, + 0x6F7B,INVALC,0x6F7A,0x7021,0x6F7E,0x6E71,0x6F76,0x6F70, + 0x6F74,INVALC,INVALC,0x6F6F,INVALC,0x7074,0x706B,0x7073, + /* Block 159, Array index 0x5100 */ + 0x7070,0x7071,0x706A,0x706D,0x7075,0x706F,0x706E,0x706C, + INVALC,0x7072,INVALC,0x714C,INVALC,0x714D,INVALC,0x714F, + 0x714E,0x7151,0x7150,0x716C,0x716B,0x7227,INVALC,0x7228, + INVALC,0x7234,INVALC,INVALC,INVALC,0x723D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D37,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4874,INVALC,INVALC,0x563B,INVALC,INVALC,0x5C3C,0x5C3D, + 0x5C3B,0x6137,0x6136,INVALC,0x652B,0x6138,0x652A,INVALC, + INVALC,0x6860,INVALC,INVALC,0x685F,INVALC,INVALC,INVALC, + INVALC,0x6B3F,0x6B41,0x6B40,0x6D38,INVALC,INVALC,INVALC, + 0x7076,0x7152,INVALC,INVALC,0x7241,INVALC,INVALC,0x4F4D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C3F,0x5C3E,INVALC, + 0x6139,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E74,0x7239, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6861,INVALC,0x7024,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x613A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7025,INVALC,INVALC,0x563C,INVALC,0x5C40,0x5C41,INVALC, + INVALC,INVALC,0x613B,INVALC,INVALC,INVALC,INVALC,0x652C, + INVALC,INVALC,INVALC,INVALC,0x6B43,0x6B42,0x6B45,0x6B44, + INVALC,INVALC,INVALC,0x6D39,INVALC,0x6D3B,0x6D3A,INVALC, + 0x6E75,INVALC,0x7026,0x7027,INVALC,0x7153,0x716D,INVALC, + INVALC,0x4155,0x5C42,0x613C,0x6862,0x4875,INVALC,0x613D, + /* Block 160, Array index 0x5200 */ + 0x652E,0x652D,INVALC,INVALC,INVALC,INVALC,0x7028,INVALC, + INVALC,0x7154,0x716E,INVALC,INVALC,INVALC,INVALC,0x563D, + 0x563E,INVALC,0x5C43,INVALC,INVALC,INVALC,0x652F,INVALC, + 0x6D3D,INVALC,0x6D3E,0x6D3C,0x7029,INVALC,0x7077,INVALC, + INVALC,INVALC,0x6140,0x613F,0x613E,0x6530,INVALC,INVALC, + 0x6534,0x6533,0x6532,0x6531,INVALC,0x6863,0x6B47,INVALC, + 0x6B46,0x6D3F,0x6E78,0x6E77,INVALC,0x6E76,0x702C,0x702B, + 0x702A,INVALC,INVALC,INVALC,INVALC,0x5C44,INVALC,INVALC, + 0x6864,0x6865,0x6E79,0x702D,INVALC,INVALC,0x7078,0x7155, + 0x7229,0x7243,INVALC,INVALC,0x6535,0x6866,0x6D40,0x702E, + INVALC,INVALC,INVALC,INVALC,0x6141,0x6536,0x6867,0x6868, + 0x6869,0x6B4C,INVALC,0x6B48,INVALC,0x6B4B,0x6B4A,INVALC, + 0x6B49,INVALC,INVALC,INVALC,0x6D42,0x6D41,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6E7A,INVALC,INVALC,0x7031,0x7032, + 0x7030,0x702F,INVALC,INVALC,0x7079,0x707A,0x707B,INVALC, + 0x7156,0x7159,0x7158,0x7157,INVALC,INVALC,0x7242,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B4D,0x6D43,INVALC,INVALC,0x6E7B,INVALC,INVALC, + 0x7244,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6142,INVALC,0x6E7C,INVALC,0x716F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_CNS11643_PLANE2 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> cns11643_plane2 size-optimized table (27768 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_cns11643_plane2[] = +{ + 0x027E, /* Ranges number */ + 0x0B48, /* Unranged codes number */ + 0x1FAC, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x4F12, 0x4F14, 0x077D, + /* Array index: 0x0006 */ 0x4F74, 0x4F89, 0x0780, + /* Array index: 0x0009 */ 0x4F94, 0x4F9E, 0x0796, + /* Array index: 0x000C */ 0x4FB9, 0x4FBB, 0x07A1, + /* Array index: 0x000F */ 0x4FF4, 0x4FF7, 0x07A4, + /* Array index: 0x0012 */ 0x502F, 0x5037, 0x07A8, + /* Array index: 0x0015 */ 0x505B, 0x506B, 0x07B1, + /* Array index: 0x0018 */ 0x509B, 0x509E, 0x07C2, + /* Array index: 0x001B */ 0x50C6, 0x50CB, 0x07C6, + /* Array index: 0x001E */ 0x50FD, 0x50FF, 0x07CC, + /* Array index: 0x0021 */ 0x5106, 0x510C, 0x07CF, + /* Array index: 0x0024 */ 0x5122, 0x5126, 0x07D6, + /* Array index: 0x0027 */ 0x512D, 0x5135, 0x07DB, + /* Array index: 0x002A */ 0x5231, 0x5235, 0x07E4, + /* Array index: 0x002D */ 0x525E, 0x5262, 0x07E9, + /* Array index: 0x0030 */ 0x526B, 0x526E, 0x07EE, + /* Array index: 0x0033 */ 0x5278, 0x527C, 0x07F2, + /* Array index: 0x0036 */ 0x5296, 0x5299, 0x07F7, + /* Array index: 0x0039 */ 0x5309, 0x530B, 0x07FB, + /* Array index: 0x003C */ 0x5394, 0x5399, 0x07FE, + /* Array index: 0x003F */ 0x5460, 0x5467, 0x0804, + /* Array index: 0x0042 */ 0x547E, 0x5482, 0x080C, + /* Array index: 0x0045 */ 0x54A0, 0x54A2, 0x0811, + /* Array index: 0x0048 */ 0x5503, 0x5505, 0x0814, + /* Array index: 0x004B */ 0x5508, 0x5512, 0x0817, + /* Array index: 0x004E */ 0x5532, 0x5536, 0x0822, + /* Array index: 0x0051 */ 0x554D, 0x5552, 0x0827, + /* Array index: 0x0054 */ 0x5575, 0x5577, 0x082D, + /* Array index: 0x0057 */ 0x558C, 0x5595, 0x0830, + /* Array index: 0x005A */ 0x55A1, 0x55A8, 0x083A, + /* Array index: 0x005D */ 0x55BF, 0x55C4, 0x0842, + /* Array index: 0x0060 */ 0x55C8, 0x55D6, 0x0848, + /* Array index: 0x0063 */ 0x563D, 0x564C, 0x0857, + /* Array index: 0x0066 */ 0x567E, 0x5686, 0x0867, + /* Array index: 0x0069 */ 0x5697, 0x569D, 0x0870, + /* Array index: 0x006C */ 0x56A6, 0x56AD, 0x0877, + /* Array index: 0x006F */ 0x571A, 0x5723, 0x087F, + /* Array index: 0x0072 */ 0x576D, 0x5776, 0x0889, + /* Array index: 0x0075 */ 0x5794, 0x579F, 0x0893, + /* Array index: 0x0078 */ 0x57B5, 0x57C1, 0x089F, + /* Array index: 0x007B */ 0x57E1, 0x5801, 0x08AC, + /* Array index: 0x007E */ 0x5807, 0x5810, 0x08CD, + /* Array index: 0x0081 */ 0x5825, 0x582E, 0x08D7, + /* Array index: 0x0084 */ 0x5832, 0x583F, 0x08E1, + /* Array index: 0x0087 */ 0x584D, 0x584F, 0x08EF, + /* Array index: 0x008A */ 0x5863, 0x5865, 0x08F2, + /* Array index: 0x008D */ 0x587A, 0x587C, 0x08F5, + /* Array index: 0x0090 */ 0x5886, 0x5891, 0x08F8, + /* Array index: 0x0093 */ 0x590C, 0x590E, 0x0904, + /* Array index: 0x0096 */ 0x5970, 0x5972, 0x0907, + /* Array index: 0x0099 */ 0x597B, 0x5980, 0x090A, + /* Array index: 0x009C */ 0x598E, 0x5990, 0x0910, + /* Array index: 0x009F */ 0x59A0, 0x59A2, 0x0913, + /* Array index: 0x00A2 */ 0x59B1, 0x59B6, 0x0916, + /* Array index: 0x00A5 */ 0x59DD, 0x59E1, 0x091C, + /* Array index: 0x00A8 */ 0x59ED, 0x59F7, 0x0921, + /* Array index: 0x00AB */ 0x59FA, 0x5A00, 0x092C, + /* Array index: 0x00AE */ 0x5A15, 0x5A19, 0x0933, + /* Array index: 0x00B1 */ 0x5A35, 0x5A39, 0x0938, + /* Array index: 0x00B4 */ 0x5A42, 0x5A48, 0x093D, + /* Array index: 0x00B7 */ 0x5A4C, 0x5A60, 0x0944, + /* Array index: 0x00BA */ 0x5A78, 0x5A7D, 0x0959, + /* Array index: 0x00BD */ 0x5A8A, 0x5A97, 0x095F, + /* Array index: 0x00C0 */ 0x5A9C, 0x5A9F, 0x096D, + /* Array index: 0x00C3 */ 0x5AAC, 0x5ABB, 0x0971, + /* Array index: 0x00C6 */ 0x5AC4, 0x5ACD, 0x0981, + /* Array index: 0x00C9 */ 0x5AD9, 0x5AE2, 0x098B, + /* Array index: 0x00CC */ 0x5AE8, 0x5AEE, 0x0995, + /* Array index: 0x00CF */ 0x5AF3, 0x5AF9, 0x099C, + /* Array index: 0x00D2 */ 0x5AFF, 0x5B07, 0x09A3, + /* Array index: 0x00D5 */ 0x5B13, 0x5B1B, 0x09AC, + /* Array index: 0x00D8 */ 0x5B23, 0x5B2F, 0x09B5, + /* Array index: 0x00DB */ 0x5B3C, 0x5B3F, 0x09C2, + /* Array index: 0x00DE */ 0x5B47, 0x5B4E, 0x09C6, + /* Array index: 0x00E1 */ 0x5BCA, 0x5BCE, 0x09CE, + /* Array index: 0x00E4 */ 0x5C7A, 0x5C7E, 0x09D3, + /* Array index: 0x00E7 */ 0x5C86, 0x5C95, 0x09D8, + /* Array index: 0x00EA */ 0x5C9F, 0x5CB0, 0x09E8, + /* Array index: 0x00ED */ 0x5CC6, 0x5CDF, 0x09FA, + /* Array index: 0x00F0 */ 0x5CF7, 0x5CF9, 0x0A14, + /* Array index: 0x00F3 */ 0x5D0B, 0x5D0F, 0x0A17, + /* Array index: 0x00F6 */ 0x5D1D, 0x5D20, 0x0A1C, + /* Array index: 0x00F9 */ 0x5D2E, 0x5D4B, 0x0A20, + /* Array index: 0x00FC */ 0x5D79, 0x5D82, 0x0A3E, + /* Array index: 0x00FF */ 0x5D86, 0x5D8A, 0x0A48, + /* Array index: 0x0102 */ 0x5D9C, 0x5DA2, 0x0A4D, + /* Array index: 0x0105 */ 0x5DA7, 0x5DB7, 0x0A54, + /* Array index: 0x0108 */ 0x5E20, 0x5E24, 0x0A65, + /* Array index: 0x010B */ 0x5E4A, 0x5E4F, 0x0A6A, + /* Array index: 0x010E */ 0x5E66, 0x5E70, 0x0A70, + /* Array index: 0x0111 */ 0x5E88, 0x5E8D, 0x0A7B, + /* Array index: 0x0114 */ 0x5EA2, 0x5EA5, 0x0A81, + /* Array index: 0x0117 */ 0x5EAE, 0x5EB4, 0x0A85, + /* Array index: 0x011A */ 0x5EC5, 0x5EC7, 0x0A8C, + /* Array index: 0x011D */ 0x5ED1, 0x5EDE, 0x0A8F, + /* Array index: 0x0120 */ 0x5EE5, 0x5EE9, 0x0A9D, + /* Array index: 0x0123 */ 0x5EEE, 0x5EF2, 0x0AA2, + /* Array index: 0x0126 */ 0x5F22, 0x5F24, 0x0AA7, + /* Array index: 0x0129 */ 0x5FBB, 0x5FC1, 0x0AAA, + /* Array index: 0x012C */ 0x5FCF, 0x5FD5, 0x0AB1, + /* Array index: 0x012F */ 0x5FE1, 0x5FE5, 0x0AB8, + /* Array index: 0x0132 */ 0x5FED, 0x5FEF, 0x0ABD, + /* Array index: 0x0135 */ 0x6009, 0x6013, 0x0AC0, + /* Array index: 0x0138 */ 0x602C, 0x6034, 0x0ACB, + /* Array index: 0x013B */ 0x6040, 0x6049, 0x0AD4, + /* Array index: 0x013E */ 0x605A, 0x605F, 0x0ADE, + /* Array index: 0x0141 */ 0x6086, 0x608A, 0x0AE4, + /* Array index: 0x0144 */ 0x609B, 0x609D, 0x0AE9, + /* Array index: 0x0147 */ 0x60BE, 0x60CF, 0x0AEC, + /* Array index: 0x014A */ 0x6103, 0x6105, 0x0AFE, + /* Array index: 0x014D */ 0x6128, 0x612F, 0x0B01, + /* Array index: 0x0150 */ 0x6152, 0x6156, 0x0B09, + /* Array index: 0x0153 */ 0x6171, 0x6174, 0x0B0E, + /* Array index: 0x0156 */ 0x6189, 0x618D, 0x0B12, + /* Array index: 0x0159 */ 0x61AD, 0x61B5, 0x0B17, + /* Array index: 0x015C */ 0x61DE, 0x61E0, 0x0B20, + /* Array index: 0x015F */ 0x61E4, 0x61F1, 0x0B23, + /* Array index: 0x0162 */ 0x6223, 0x622D, 0x0B31, + /* Array index: 0x0165 */ 0x625E, 0x6266, 0x0B3C, + /* Array index: 0x0168 */ 0x6270, 0x6274, 0x0B45, + /* Array index: 0x016B */ 0x62A9, 0x62B8, 0x0B4A, + /* Array index: 0x016E */ 0x62F5, 0x62FB, 0x0B5A, + /* Array index: 0x0171 */ 0x630B, 0x6315, 0x0B61, + /* Array index: 0x0174 */ 0x6332, 0x633C, 0x0B6C, + /* Array index: 0x0177 */ 0x6340, 0x634B, 0x0B77, + /* Array index: 0x017A */ 0x6354, 0x635A, 0x0B83, + /* Array index: 0x017D */ 0x636D, 0x6370, 0x0B8A, + /* Array index: 0x0180 */ 0x638D, 0x6391, 0x0B8E, + /* Array index: 0x0183 */ 0x639C, 0x639F, 0x0B93, + /* Array index: 0x0186 */ 0x63AB, 0x63B1, 0x0B97, + /* Array index: 0x0189 */ 0x63C2, 0x63CE, 0x0B9E, + /* Array index: 0x018C */ 0x63D5, 0x63E0, 0x0BAB, + /* Array index: 0x018F */ 0x63E4, 0x63E8, 0x0BB7, + /* Array index: 0x0192 */ 0x63EF, 0x63F6, 0x0BBC, + /* Array index: 0x0195 */ 0x6409, 0x6412, 0x0BC4, + /* Array index: 0x0198 */ 0x641F, 0x6428, 0x0BCE, + /* Array index: 0x019B */ 0x642E, 0x6430, 0x0BD8, + /* Array index: 0x019E */ 0x643F, 0x6443, 0x0BDB, + /* Array index: 0x01A1 */ 0x6459, 0x6461, 0x0BE0, + /* Array index: 0x01A4 */ 0x6470, 0x6477, 0x0BE9, + /* Array index: 0x01A7 */ 0x6489, 0x648C, 0x0BF1, + /* Array index: 0x01AA */ 0x6496, 0x6498, 0x0BF5, + /* Array index: 0x01AD */ 0x649C, 0x64A0, 0x0BF8, + /* Array index: 0x01B0 */ 0x650C, 0x6510, 0x0BFD, + /* Array index: 0x01B3 */ 0x6513, 0x6517, 0x0C02, + /* Array index: 0x01B6 */ 0x6520, 0x6526, 0x0C07, + /* Array index: 0x01B9 */ 0x6564, 0x656A, 0x0C0E, + /* Array index: 0x01BC */ 0x6579, 0x6581, 0x0C15, + /* Array index: 0x01BF */ 0x65C2, 0x65C6, 0x0C1E, + /* Array index: 0x01C2 */ 0x65DA, 0x65E1, 0x0C23, + /* Array index: 0x01C5 */ 0x65EE, 0x65F5, 0x0C2B, + /* Array index: 0x01C8 */ 0x65FB, 0x65FD, 0x0C33, + /* Array index: 0x01CB */ 0x6603, 0x6612, 0x0C36, + /* Array index: 0x01CE */ 0x6632, 0x663A, 0x0C46, + /* Array index: 0x01D1 */ 0x6678, 0x667C, 0x0C4F, + /* Array index: 0x01D4 */ 0x668A, 0x668C, 0x0C54, + /* Array index: 0x01D7 */ 0x669F, 0x66A1, 0x0C57, + /* Array index: 0x01DA */ 0x66BA, 0x66C0, 0x0C5A, + /* Array index: 0x01DD */ 0x66C8, 0x66CC, 0x0C61, + /* Array index: 0x01E0 */ 0x670F, 0x6713, 0x0C66, + /* Array index: 0x01E3 */ 0x6720, 0x6723, 0x0C6B, + /* Array index: 0x01E6 */ 0x6738, 0x673F, 0x0C6F, + /* Array index: 0x01E9 */ 0x6747, 0x674D, 0x0C77, + /* Array index: 0x01EC */ 0x6776, 0x677D, 0x0C7E, + /* Array index: 0x01EF */ 0x6781, 0x6786, 0x0C86, + /* Array index: 0x01F2 */ 0x678C, 0x6794, 0x0C8C, + /* Array index: 0x01F5 */ 0x67B7, 0x67BB, 0x0C95, + /* Array index: 0x01F8 */ 0x67C0, 0x67CE, 0x0C9A, + /* Array index: 0x01FB */ 0x67E3, 0x67FC, 0x0CA9, + /* Array index: 0x01FE */ 0x681C, 0x6820, 0x0CC3, + /* Array index: 0x0201 */ 0x682B, 0x6835, 0x0CC8, + /* Array index: 0x0204 */ 0x684B, 0x684F, 0x0CD3, + /* Array index: 0x0207 */ 0x686B, 0x6880, 0x0CD8, + /* Array index: 0x020A */ 0x6887, 0x6892, 0x0CEE, + /* Array index: 0x020D */ 0x68A9, 0x68AE, 0x0CFA, + /* Array index: 0x0210 */ 0x68C6, 0x68C8, 0x0D00, + /* Array index: 0x0213 */ 0x68D0, 0x68D6, 0x0D03, + /* Array index: 0x0216 */ 0x68DC, 0x68DE, 0x0D0A, + /* Array index: 0x0219 */ 0x68E6, 0x68F8, 0x0D0D, + /* Array index: 0x021C */ 0x6904, 0x6917, 0x0D20, + /* Array index: 0x021F */ 0x6932, 0x6959, 0x0D34, + /* Array index: 0x0222 */ 0x696F, 0x6971, 0x0D5C, + /* Array index: 0x0225 */ 0x698D, 0x699A, 0x0D5F, + /* Array index: 0x0228 */ 0x69AF, 0x69B6, 0x0D6D, + /* Array index: 0x022B */ 0x69BC, 0x69BF, 0x0D75, + /* Array index: 0x022E */ 0x69E2, 0x69E7, 0x0D79, + /* Array index: 0x0231 */ 0x69F4, 0x6A00, 0x0D7F, + /* Array index: 0x0234 */ 0x6A04, 0x6A09, 0x0D8C, + /* Array index: 0x0237 */ 0x6A14, 0x6A18, 0x0D92, + /* Array index: 0x023A */ 0x6A25, 0x6A28, 0x0D97, + /* Array index: 0x023D */ 0x6A3B, 0x6A41, 0x0D9B, + /* Array index: 0x0240 */ 0x6A4D, 0x6A56, 0x0DA2, + /* Array index: 0x0243 */ 0x6A5A, 0x6A60, 0x0DAC, + /* Array index: 0x0246 */ 0x6A64, 0x6A6A, 0x0DB3, + /* Array index: 0x0249 */ 0x6A8C, 0x6A96, 0x0DBA, + /* Array index: 0x024C */ 0x6AA4, 0x6AA8, 0x0DC5, + /* Array index: 0x024F */ 0x6AB6, 0x6ABA, 0x0DCA, + /* Array index: 0x0252 */ 0x6AC5, 0x6AD1, 0x0DCF, + /* Array index: 0x0255 */ 0x6ADC, 0x6AE1, 0x0DDC, + /* Array index: 0x0258 */ 0x6AE7, 0x6AF3, 0x0DE2, + /* Array index: 0x025B */ 0x6B0F, 0x6B1A, 0x0DEF, + /* Array index: 0x025E */ 0x6B33, 0x6B3C, 0x0DFB, + /* Array index: 0x0261 */ 0x6B3F, 0x6B4D, 0x0E05, + /* Array index: 0x0264 */ 0x6B54, 0x6B56, 0x0E14, + /* Array index: 0x0267 */ 0x6B8C, 0x6BAD, 0x0E17, + /* Array index: 0x026A */ 0x6BC3, 0x6BCC, 0x0E39, + /* Array index: 0x026D */ 0x6BE0, 0x6BE8, 0x0E43, + /* Array index: 0x0270 */ 0x6BF7, 0x6C06, 0x0E4C, + /* Array index: 0x0273 */ 0x6C09, 0x6C0D, 0x0E5C, + /* Array index: 0x0276 */ 0x6C14, 0x6C1A, 0x0E61, + /* Array index: 0x0279 */ 0x6C4A, 0x6C4C, 0x0E68, + /* Array index: 0x027C */ 0x6C65, 0x6C73, 0x0E6B, + /* Array index: 0x027F */ 0x6CCD, 0x6CD4, 0x0E7A, + /* Array index: 0x0282 */ 0x6CE9, 0x6CEE, 0x0E82, + /* Array index: 0x0285 */ 0x6D00, 0x6D0A, 0x0E88, + /* Array index: 0x0288 */ 0x6D0D, 0x6D12, 0x0E93, + /* Array index: 0x028B */ 0x6D16, 0x6D1A, 0x0E99, + /* Array index: 0x028E */ 0x6D2C, 0x6D34, 0x0E9E, + /* Array index: 0x0291 */ 0x6D5E, 0x6D68, 0x0EA7, + /* Array index: 0x0294 */ 0x6D7A, 0x6D86, 0x0EB2, + /* Array index: 0x0297 */ 0x6D90, 0x6D92, 0x0EBF, + /* Array index: 0x029A */ 0x6DBA, 0x6DC2, 0x0EC2, + /* Array index: 0x029D */ 0x6DC8, 0x6DCA, 0x0ECB, + /* Array index: 0x02A0 */ 0x6DCF, 0x6DE5, 0x0ECE, + /* Array index: 0x02A3 */ 0x6E39, 0x6E4B, 0x0EE5, + /* Array index: 0x02A6 */ 0x6E51, 0x6E55, 0x0EF8, + /* Array index: 0x02A9 */ 0x6E5A, 0x6E68, 0x0EFD, + /* Array index: 0x02AC */ 0x6E73, 0x6E79, 0x0F0C, + /* Array index: 0x02AF */ 0x6E8D, 0x6E94, 0x0F13, + /* Array index: 0x02B2 */ 0x6E9E, 0x6EA6, 0x0F1B, + /* Array index: 0x02B5 */ 0x6EAE, 0x6EB3, 0x0F24, + /* Array index: 0x02B8 */ 0x6EBD, 0x6EC3, 0x0F2A, + /* Array index: 0x02BB */ 0x6EC6, 0x6ED2, 0x0F31, + /* Array index: 0x02BE */ 0x6EF5, 0x6EFD, 0x0F3E, + /* Array index: 0x02C1 */ 0x6F05, 0x6F0E, 0x0F47, + /* Array index: 0x02C4 */ 0x6F18, 0x6F27, 0x0F51, + /* Array index: 0x02C7 */ 0x6F35, 0x6F3C, 0x0F61, + /* Array index: 0x02CA */ 0x6F4E, 0x6F57, 0x0F69, + /* Array index: 0x02CD */ 0x6F5D, 0x6F63, 0x0F73, + /* Array index: 0x02D0 */ 0x6F67, 0x6F6C, 0x0F7A, + /* Array index: 0x02D3 */ 0x6F7B, 0x6F7F, 0x0F80, + /* Array index: 0x02D6 */ 0x6F89, 0x6F8D, 0x0F85, + /* Array index: 0x02D9 */ 0x6F90, 0x6F96, 0x0F8A, + /* Array index: 0x02DC */ 0x6FA8, 0x6FB2, 0x0F91, + /* Array index: 0x02DF */ 0x6FC4, 0x6FCF, 0x0F9C, + /* Array index: 0x02E2 */ 0x6FDC, 0x6FDE, 0x0FA8, + /* Array index: 0x02E5 */ 0x6FE2, 0x6FE8, 0x0FAB, + /* Array index: 0x02E8 */ 0x6FFB, 0x7007, 0x0FB2, + /* Array index: 0x02EB */ 0x700A, 0x700E, 0x0FBF, + /* Array index: 0x02EE */ 0x7020, 0x702B, 0x0FC4, + /* Array index: 0x02F1 */ 0x7031, 0x704A, 0x0FD0, + /* Array index: 0x02F4 */ 0x7055, 0x706A, 0x0FEA, + /* Array index: 0x02F7 */ 0x7082, 0x7086, 0x1000, + /* Array index: 0x02FA */ 0x70C5, 0x70C7, 0x1005, + /* Array index: 0x02FD */ 0x70CD, 0x70D4, 0x1008, + /* Array index: 0x0300 */ 0x70DA, 0x70E2, 0x1010, + /* Array index: 0x0303 */ 0x70F3, 0x7106, 0x1019, + /* Array index: 0x0306 */ 0x710B, 0x7110, 0x102D, + /* Array index: 0x0309 */ 0x711E, 0x7125, 0x1033, + /* Array index: 0x030C */ 0x712E, 0x7132, 0x103B, + /* Array index: 0x030F */ 0x7141, 0x7144, 0x1040, + /* Array index: 0x0312 */ 0x7150, 0x7154, 0x1044, + /* Array index: 0x0315 */ 0x715D, 0x7163, 0x1049, + /* Array index: 0x0318 */ 0x7180, 0x7189, 0x1050, + /* Array index: 0x031B */ 0x719A, 0x71AA, 0x105A, + /* Array index: 0x031E */ 0x71AF, 0x71B5, 0x106B, + /* Array index: 0x0321 */ 0x71BC, 0x71CB, 0x1072, + /* Array index: 0x0324 */ 0x71F0, 0x71F2, 0x1082, + /* Array index: 0x0327 */ 0x71FF, 0x7207, 0x1085, + /* Array index: 0x032A */ 0x7219, 0x7229, 0x108E, + /* Array index: 0x032D */ 0x7249, 0x724B, 0x109F, + /* Array index: 0x0330 */ 0x7276, 0x727F, 0x10A2, + /* Array index: 0x0333 */ 0x7285, 0x729E, 0x10AC, + /* Array index: 0x0336 */ 0x72A1, 0x72AA, 0x10C6, + /* Array index: 0x0339 */ 0x72C5, 0x72CC, 0x10D0, + /* Array index: 0x033C */ 0x72FA, 0x7301, 0x10D8, + /* Array index: 0x033F */ 0x7307, 0x730C, 0x10E0, + /* Array index: 0x0342 */ 0x7330, 0x7335, 0x10E6, + /* Array index: 0x0345 */ 0x733A, 0x733C, 0x10EC, + /* Array index: 0x0348 */ 0x7349, 0x734D, 0x10EF, + /* Array index: 0x034B */ 0x7358, 0x736F, 0x10F4, + /* Array index: 0x034E */ 0x737C, 0x7385, 0x110C, + /* Array index: 0x0351 */ 0x7392, 0x7397, 0x1116, + /* Array index: 0x0354 */ 0x73A0, 0x73A6, 0x111C, + /* Array index: 0x0357 */ 0x73B4, 0x73B9, 0x1123, + /* Array index: 0x035A */ 0x73C2, 0x73CC, 0x1129, + /* Array index: 0x035D */ 0x73D2, 0x73DD, 0x1134, + /* Array index: 0x0360 */ 0x73E5, 0x73EB, 0x1140, + /* Array index: 0x0363 */ 0x73F4, 0x7401, 0x1147, + /* Array index: 0x0366 */ 0x7420, 0x7424, 0x1155, + /* Array index: 0x0369 */ 0x7429, 0x7432, 0x115A, + /* Array index: 0x036C */ 0x744A, 0x7454, 0x1164, + /* Array index: 0x036F */ 0x7471, 0x7475, 0x116F, + /* Array index: 0x0372 */ 0x7485, 0x748A, 0x1174, + /* Array index: 0x0375 */ 0x74B1, 0x74BB, 0x117A, + /* Array index: 0x0378 */ 0x74BE, 0x74C5, 0x1185, + /* Array index: 0x037B */ 0x74D5, 0x74E1, 0x118D, + /* Array index: 0x037E */ 0x74FB, 0x7503, 0x119A, + /* Array index: 0x0381 */ 0x750F, 0x7517, 0x11A3, + /* Array index: 0x0384 */ 0x753E, 0x7540, 0x11AC, + /* Array index: 0x0387 */ 0x75BF, 0x75C1, 0x11AF, + /* Array index: 0x038A */ 0x75CB, 0x75D2, 0x11B2, + /* Array index: 0x038D */ 0x75F5, 0x75FE, 0x11BA, + /* Array index: 0x0390 */ 0x760F, 0x761E, 0x11C4, + /* Array index: 0x0393 */ 0x762D, 0x7635, 0x11D4, + /* Array index: 0x0396 */ 0x7647, 0x7649, 0x11DD, + /* Array index: 0x0399 */ 0x7699, 0x769E, 0x11E0, + /* Array index: 0x039C */ 0x7703, 0x7705, 0x11E6, + /* Array index: 0x039F */ 0x7710, 0x771D, 0x11E9, + /* Array index: 0x03A2 */ 0x772F, 0x7735, 0x11F7, + /* Array index: 0x03A5 */ 0x7744, 0x774E, 0x11FE, + /* Array index: 0x03A8 */ 0x7752, 0x775A, 0x1209, + /* Array index: 0x03AB */ 0x776D, 0x776F, 0x1212, + /* Array index: 0x03AE */ 0x777E, 0x7789, 0x1215, + /* Array index: 0x03B1 */ 0x7797, 0x77A3, 0x1221, + /* Array index: 0x03B4 */ 0x77B1, 0x77B7, 0x122E, + /* Array index: 0x03B7 */ 0x77C9, 0x77D0, 0x1235, + /* Array index: 0x03BA */ 0x77F0, 0x77F2, 0x123D, + /* Array index: 0x03BD */ 0x77F7, 0x77FC, 0x1240, + /* Array index: 0x03C0 */ 0x780E, 0x7813, 0x1246, + /* Array index: 0x03C3 */ 0x7821, 0x7823, 0x124C, + /* Array index: 0x03C6 */ 0x7826, 0x7835, 0x124F, + /* Array index: 0x03C9 */ 0x7848, 0x784D, 0x125F, + /* Array index: 0x03CC */ 0x7864, 0x7871, 0x1265, + /* Array index: 0x03CF */ 0x7883, 0x7887, 0x1273, + /* Array index: 0x03D2 */ 0x7894, 0x789A, 0x1278, + /* Array index: 0x03D5 */ 0x789E, 0x78A5, 0x127F, + /* Array index: 0x03D8 */ 0x78A8, 0x78AD, 0x1287, + /* Array index: 0x03DB */ 0x78C8, 0x78D1, 0x128D, + /* Array index: 0x03DE */ 0x78DB, 0x78E5, 0x1297, + /* Array index: 0x03E1 */ 0x78F9, 0x78FF, 0x12A2, + /* Array index: 0x03E4 */ 0x7910, 0x7914, 0x12A9, + /* Array index: 0x03E7 */ 0x791B, 0x791E, 0x12AE, + /* Array index: 0x03EA */ 0x7921, 0x7929, 0x12B2, + /* Array index: 0x03ED */ 0x794A, 0x794C, 0x12BB, + /* Array index: 0x03F0 */ 0x794F, 0x7954, 0x12BE, + /* Array index: 0x03F3 */ 0x7967, 0x796B, 0x12C4, + /* Array index: 0x03F6 */ 0x7970, 0x7974, 0x12C9, + /* Array index: 0x03F9 */ 0x7990, 0x79A4, 0x12CE, + /* Array index: 0x03FC */ 0x79AB, 0x79AD, 0x12E3, + /* Array index: 0x03FF */ 0x79B4, 0x79B8, 0x12E6, + /* Array index: 0x0402 */ 0x79CD, 0x79CF, 0x12EB, + /* Array index: 0x0405 */ 0x79DC, 0x79E0, 0x12EE, + /* Array index: 0x0408 */ 0x79EA, 0x79EE, 0x12F3, + /* Array index: 0x040B */ 0x79F6, 0x79FA, 0x12F8, + /* Array index: 0x040E */ 0x7A02, 0x7A04, 0x12FD, + /* Array index: 0x0411 */ 0x7A10, 0x7A1B, 0x1300, + /* Array index: 0x0414 */ 0x7A58, 0x7A5C, 0x130C, + /* Array index: 0x0417 */ 0x7A6C, 0x7A71, 0x1311, + /* Array index: 0x041A */ 0x7A85, 0x7A90, 0x1317, + /* Array index: 0x041D */ 0x7AB1, 0x7AB8, 0x1323, + /* Array index: 0x0420 */ 0x7B04, 0x7B13, 0x132B, + /* Array index: 0x0423 */ 0x7B22, 0x7B25, 0x133B, + /* Array index: 0x0426 */ 0x7B2D, 0x7B35, 0x133F, + /* Array index: 0x0429 */ 0x7B44, 0x7B4E, 0x1348, + /* Array index: 0x042C */ 0x7B61, 0x7B66, 0x1353, + /* Array index: 0x042F */ 0x7B70, 0x7B78, 0x1359, + /* Array index: 0x0432 */ 0x7B8A, 0x7B91, 0x1362, + /* Array index: 0x0435 */ 0x7B98, 0x7B9C, 0x136A, + /* Array index: 0x0438 */ 0x7BDA, 0x7BEB, 0x136F, + /* Array index: 0x043B */ 0x7BF0, 0x7BF4, 0x1381, + /* Array index: 0x043E */ 0x7BFD, 0x7C10, 0x1386, + /* Array index: 0x0441 */ 0x7C1C, 0x7C2D, 0x139A, + /* Array index: 0x0444 */ 0x7C45, 0x7C4A, 0x13AC, + /* Array index: 0x0447 */ 0x7C57, 0x7C5C, 0x13B2, + /* Array index: 0x044A */ 0x7C66, 0x7C6B, 0x13B8, + /* Array index: 0x044D */ 0x7C78, 0x7C7A, 0x13BE, + /* Array index: 0x0450 */ 0x7C7F, 0x7C85, 0x13C1, + /* Array index: 0x0453 */ 0x7CA1, 0x7CA3, 0x13C8, + /* Array index: 0x0456 */ 0x7CBA, 0x7CBC, 0x13CB, + /* Array index: 0x0459 */ 0x7CD0, 0x7CD4, 0x13CE, + /* Array index: 0x045C */ 0x7D0E, 0x7D13, 0x13D3, + /* Array index: 0x045F */ 0x7D1D, 0x7D1F, 0x13D9, + /* Array index: 0x0462 */ 0x7D3A, 0x7D41, 0x13DC, + /* Array index: 0x0465 */ 0x7D4E, 0x7D58, 0x13E4, + /* Array index: 0x0468 */ 0x7D67, 0x7D6F, 0x13EF, + /* Array index: 0x046B */ 0x7D7A, 0x7D8E, 0x13F8, + /* Array index: 0x046E */ 0x7DA6, 0x7DAA, 0x140D, + /* Array index: 0x0471 */ 0x7DC0, 0x7DC6, 0x1412, + /* Array index: 0x0474 */ 0x7E0B, 0x7E17, 0x1419, + /* Array index: 0x0477 */ 0x7E1F, 0x7E25, 0x1426, + /* Array index: 0x047A */ 0x7E38, 0x7E3C, 0x142D, + /* Array index: 0x047D */ 0x7E56, 0x7E58, 0x1432, + /* Array index: 0x0480 */ 0x7E5F, 0x7E63, 0x1435, + /* Array index: 0x0483 */ 0x7E72, 0x7E7B, 0x143A, + /* Array index: 0x0486 */ 0x7E86, 0x7E8D, 0x1444, + /* Array index: 0x0489 */ 0x7E95, 0x7E9B, 0x144C, + /* Array index: 0x048C */ 0x7F5B, 0x7F6D, 0x1453, + /* Array index: 0x048F */ 0x7F7A, 0x7F7F, 0x1466, + /* Array index: 0x0492 */ 0x7F9B, 0x7FA7, 0x146C, + /* Array index: 0x0495 */ 0x7FC7, 0x7FD1, 0x1479, + /* Array index: 0x0498 */ 0x7FE2, 0x7FEF, 0x1484, + /* Array index: 0x049B */ 0x7FF4, 0x7FF8, 0x1492, + /* Array index: 0x049E */ 0x7FFD, 0x7FFF, 0x1497, + /* Array index: 0x04A1 */ 0x804F, 0x8051, 0x149A, + /* Array index: 0x04A4 */ 0x80C5, 0x80CA, 0x149D, + /* Array index: 0x04A7 */ 0x80CD, 0x80D9, 0x14A3, + /* Array index: 0x04AA */ 0x80F9, 0x80FB, 0x14B0, + /* Array index: 0x04AD */ 0x811B, 0x8122, 0x14B3, + /* Array index: 0x04B0 */ 0x815E, 0x8164, 0x14BB, + /* Array index: 0x04B3 */ 0x8189, 0x818D, 0x14C2, + /* Array index: 0x04B6 */ 0x81AE, 0x81BC, 0x14C7, + /* Array index: 0x04B9 */ 0x81D0, 0x81D2, 0x14D6, + /* Array index: 0x04BC */ 0x81DD, 0x81E1, 0x14D9, + /* Array index: 0x04BF */ 0x81F7, 0x81F9, 0x14DE, + /* Array index: 0x04C2 */ 0x8232, 0x8234, 0x14E1, + /* Array index: 0x04C5 */ 0x823C, 0x8245, 0x14E4, + /* Array index: 0x04C8 */ 0x824E, 0x8264, 0x14EE, + /* Array index: 0x04CB */ 0x8268, 0x826D, 0x1505, + /* Array index: 0x04CE */ 0x827C, 0x8285, 0x150B, + /* Array index: 0x04D1 */ 0x828E, 0x8294, 0x1515, + /* Array index: 0x04D4 */ 0x829E, 0x82AB, 0x151C, + /* Array index: 0x04D7 */ 0x82B4, 0x82B6, 0x152A, + /* Array index: 0x04DA */ 0x82E8, 0x82ED, 0x152D, + /* Array index: 0x04DD */ 0x82F0, 0x82FB, 0x1533, + /* Array index: 0x04E0 */ 0x8322, 0x832F, 0x153F, + /* Array index: 0x04E3 */ 0x833A, 0x833C, 0x154D, + /* Array index: 0x04E6 */ 0x8341, 0x834E, 0x1550, + /* Array index: 0x04E9 */ 0x8373, 0x8376, 0x155E, + /* Array index: 0x04EC */ 0x837D, 0x8383, 0x1562, + /* Array index: 0x04EF */ 0x8387, 0x8390, 0x1569, + /* Array index: 0x04F2 */ 0x8397, 0x839D, 0x1573, + /* Array index: 0x04F5 */ 0x83A3, 0x83B0, 0x157A, + /* Array index: 0x04F8 */ 0x83BF, 0x83EE, 0x1588, + /* Array index: 0x04FB */ 0x83F5, 0x8401, 0x15B8, + /* Array index: 0x04FE */ 0x840F, 0x8413, 0x15C5, + /* Array index: 0x0501 */ 0x842F, 0x843B, 0x15CA, + /* Array index: 0x0504 */ 0x843F, 0x8460, 0x15D7, + /* Array index: 0x0507 */ 0x846E, 0x847E, 0x15F9, + /* Array index: 0x050A */ 0x848D, 0x8491, 0x160A, + /* Array index: 0x050D */ 0x8497, 0x84B1, 0x160F, + /* Array index: 0x0510 */ 0x84B9, 0x84BB, 0x162A, + /* Array index: 0x0513 */ 0x84CC, 0x84D7, 0x162D, + /* Array index: 0x0516 */ 0x84E7, 0x8502, 0x1639, + /* Array index: 0x0519 */ 0x8507, 0x850F, 0x1655, + /* Array index: 0x051C */ 0x8515, 0x8520, 0x165E, + /* Array index: 0x051F */ 0x8524, 0x8531, 0x166A, + /* Array index: 0x0522 */ 0x8540, 0x8547, 0x1678, + /* Array index: 0x0525 */ 0x8551, 0x8558, 0x1680, + /* Array index: 0x0528 */ 0x8560, 0x8567, 0x1688, + /* Array index: 0x052B */ 0x8575, 0x8590, 0x1690, + /* Array index: 0x052E */ 0x8595, 0x85A4, 0x16AC, + /* Array index: 0x0531 */ 0x85B1, 0x85B8, 0x16BC, + /* Array index: 0x0534 */ 0x85BD, 0x85C8, 0x16C4, + /* Array index: 0x0537 */ 0x85D7, 0x85E3, 0x16D0, + /* Array index: 0x053A */ 0x85EB, 0x85F2, 0x16DD, + /* Array index: 0x053D */ 0x85FD, 0x8605, 0x16E5, + /* Array index: 0x0540 */ 0x8618, 0x8640, 0x16EE, + /* Array index: 0x0543 */ 0x8646, 0x864D, 0x1717, + /* Array index: 0x0546 */ 0x8661, 0x8674, 0x171F, + /* Array index: 0x0549 */ 0x8685, 0x8687, 0x1733, + /* Array index: 0x054C */ 0x868D, 0x86A2, 0x1736, + /* Array index: 0x054F */ 0x86B3, 0x86C5, 0x174C, + /* Array index: 0x0552 */ 0x86D6, 0x86DD, 0x175F, + /* Array index: 0x0555 */ 0x86E6, 0x86EC, 0x1767, + /* Array index: 0x0558 */ 0x86F5, 0x86FA, 0x176E, + /* Array index: 0x055B */ 0x8709, 0x8712, 0x1774, + /* Array index: 0x055E */ 0x8719, 0x871B, 0x177E, + /* Array index: 0x0561 */ 0x8720, 0x8735, 0x1781, + /* Array index: 0x0564 */ 0x873E, 0x8743, 0x1797, + /* Array index: 0x0567 */ 0x874D, 0x876F, 0x179D, + /* Array index: 0x056A */ 0x8777, 0x877B, 0x17C0, + /* Array index: 0x056D */ 0x8784, 0x8789, 0x17C5, + /* Array index: 0x0570 */ 0x878F, 0x879D, 0x17CB, + /* Array index: 0x0573 */ 0x87AA, 0x87C5, 0x17DA, + /* Array index: 0x0576 */ 0x87D3, 0x87ED, 0x17F6, + /* Array index: 0x0579 */ 0x87F3, 0x87F7, 0x1811, + /* Array index: 0x057C */ 0x87FF, 0x8803, 0x1816, + /* Array index: 0x057F */ 0x8806, 0x880C, 0x181B, + /* Array index: 0x0582 */ 0x8819, 0x881D, 0x1822, + /* Array index: 0x0585 */ 0x8824, 0x8844, 0x1827, + /* Array index: 0x0588 */ 0x8871, 0x8876, 0x1848, + /* Array index: 0x058B */ 0x887C, 0x8880, 0x184E, + /* Array index: 0x058E */ 0x8895, 0x889B, 0x1853, + /* Array index: 0x0591 */ 0x88B6, 0x88C0, 0x185A, + /* Array index: 0x0594 */ 0x88C9, 0x88D0, 0x1865, + /* Array index: 0x0597 */ 0x88EE, 0x88F2, 0x186D, + /* Array index: 0x059A */ 0x88F6, 0x88FE, 0x1872, + /* Array index: 0x059D */ 0x8914, 0x8919, 0x187B, + /* Array index: 0x05A0 */ 0x892C, 0x8937, 0x1881, + /* Array index: 0x05A3 */ 0x894B, 0x8963, 0x188D, + /* Array index: 0x05A6 */ 0x8979, 0x897E, 0x18A6, + /* Array index: 0x05A9 */ 0x899B, 0x89A4, 0x18AC, + /* Array index: 0x05AC */ 0x89AD, 0x89AF, 0x18B6, + /* Array index: 0x05AF */ 0x89D5, 0x89FF, 0x18B9, + /* Array index: 0x05B2 */ 0x8A4A, 0x8A52, 0x18E4, + /* Array index: 0x05B5 */ 0x8A57, 0x8A59, 0x18ED, + /* Array index: 0x05B8 */ 0x8A74, 0x8A77, 0x18F0, + /* Array index: 0x05BB */ 0x8A7F, 0x8A86, 0x18F4, + /* Array index: 0x05BE */ 0x8ABA, 0x8AC0, 0x18FC, + /* Array index: 0x05C1 */ 0x8AD1, 0x8AE4, 0x1903, + /* Array index: 0x05C4 */ 0x8B05, 0x8B08, 0x1917, + /* Array index: 0x05C7 */ 0x8B0F, 0x8B27, 0x191B, + /* Array index: 0x05CA */ 0x8B2E, 0x8B42, 0x1934, + /* Array index: 0x05CD */ 0x8B47, 0x8B4B, 0x1949, + /* Array index: 0x05D0 */ 0x8B50, 0x8B57, 0x194E, + /* Array index: 0x05D3 */ 0x8B78, 0x8B7F, 0x1956, + /* Array index: 0x05D6 */ 0x8B82, 0x8B8E, 0x195E, + /* Array index: 0x05D9 */ 0x8C39, 0x8C3E, 0x196B, + /* Array index: 0x05DC */ 0x8C64, 0x8C69, 0x1971, + /* Array index: 0x05DF */ 0x8C6F, 0x8C78, 0x1977, + /* Array index: 0x05E2 */ 0x8C80, 0x8C86, 0x1981, + /* Array index: 0x05E5 */ 0x8C8F, 0x8C9C, 0x1988, + /* Array index: 0x05E8 */ 0x8CA3, 0x8CA5, 0x1996, + /* Array index: 0x05EB */ 0x8D8C, 0x8D96, 0x1999, + /* Array index: 0x05EE */ 0x8DAA, 0x8DAF, 0x19A4, + /* Array index: 0x05F1 */ 0x8DB5, 0x8DB9, 0x19AA, + /* Array index: 0x05F4 */ 0x8DD3, 0x8DD9, 0x19AF, + /* Array index: 0x05F7 */ 0x8DEE, 0x8DF4, 0x19B6, + /* Array index: 0x05FA */ 0x8DFD, 0x8E0A, 0x19BD, + /* Array index: 0x05FD */ 0x8E11, 0x8E1C, 0x19CB, + /* Array index: 0x0600 */ 0x8E23, 0x8E27, 0x19D7, + /* Array index: 0x0603 */ 0x8E3C, 0x8E41, 0x19DC, + /* Array index: 0x0606 */ 0x8E4C, 0x8E62, 0x19E2, + /* Array index: 0x0609 */ 0x8E92, 0x8EA9, 0x19F9, + /* Array index: 0x060C */ 0x8EDC, 0x8EFA, 0x1A11, + /* Array index: 0x060F */ 0x8EFF, 0x8F08, 0x1A30, + /* Array index: 0x0612 */ 0x8F0D, 0x8F11, 0x1A3A, + /* Array index: 0x0615 */ 0x8F16, 0x8F1A, 0x1A3F, + /* Array index: 0x0618 */ 0x8F32, 0x8F39, 0x1A44, + /* Array index: 0x061B */ 0x8F46, 0x8F48, 0x1A4C, + /* Array index: 0x061E */ 0x8F4F, 0x8F64, 0x1A4F, + /* Array index: 0x0621 */ 0x8FD2, 0x8FD7, 0x1A65, + /* Array index: 0x0624 */ 0x8FFB, 0x8FFF, 0x1A6B, + /* Array index: 0x0627 */ 0x9097, 0x90A1, 0x1A70, + /* Array index: 0x062A */ 0x90AF, 0x90B4, 0x1A7B, + /* Array index: 0x062D */ 0x90BD, 0x90BF, 0x1A81, + /* Array index: 0x0630 */ 0x90D4, 0x90F4, 0x1A84, + /* Array index: 0x0633 */ 0x90F9, 0x9108, 0x1AA5, + /* Array index: 0x0636 */ 0x910B, 0x9111, 0x1AB5, + /* Array index: 0x0639 */ 0x911A, 0x9147, 0x1ABC, + /* Array index: 0x063C */ 0x914E, 0x9150, 0x1AEA, + /* Array index: 0x063F */ 0x915F, 0x9164, 0x1AED, + /* Array index: 0x0642 */ 0x9180, 0x9186, 0x1AF3, + /* Array index: 0x0645 */ 0x918D, 0x9193, 0x1AFA, + /* Array index: 0x0648 */ 0x9199, 0x91A2, 0x1B01, + /* Array index: 0x064B */ 0x91AF, 0x91BE, 0x1B0B, + /* Array index: 0x064E */ 0x91D3, 0x91D5, 0x1B1B, + /* Array index: 0x0651 */ 0x91E8, 0x91EE, 0x1B1E, + /* Array index: 0x0654 */ 0x91F3, 0x91F9, 0x1B25, + /* Array index: 0x0657 */ 0x91FD, 0x9206, 0x1B2C, + /* Array index: 0x065A */ 0x9216, 0x921C, 0x1B36, + /* Array index: 0x065D */ 0x9224, 0x9227, 0x1B3D, + /* Array index: 0x0660 */ 0x922D, 0x9233, 0x1B41, + /* Array index: 0x0663 */ 0x924C, 0x9256, 0x1B48, + /* Array index: 0x0666 */ 0x9263, 0x9267, 0x1B53, + /* Array index: 0x0669 */ 0x926C, 0x9272, 0x1B58, + /* Array index: 0x066C */ 0x9279, 0x928E, 0x1B5F, + /* Array index: 0x066F */ 0x9297, 0x92AB, 0x1B75, + /* Array index: 0x0672 */ 0x92B4, 0x92B6, 0x1B8A, + /* Array index: 0x0675 */ 0x92C0, 0x92E1, 0x1B8D, + /* Array index: 0x0678 */ 0x92E6, 0x92E9, 0x1BAF, + /* Array index: 0x067B */ 0x92F7, 0x9302, 0x1BB3, + /* Array index: 0x067E */ 0x9308, 0x9316, 0x1BBF, + /* Array index: 0x0681 */ 0x931B, 0x932A, 0x1BCE, + /* Array index: 0x0684 */ 0x934C, 0x9359, 0x1BDE, + /* Array index: 0x0687 */ 0x9360, 0x9364, 0x1BEC, + /* Array index: 0x068A */ 0x9376, 0x937C, 0x1BF1, + /* Array index: 0x068D */ 0x9388, 0x9392, 0x1BF8, + /* Array index: 0x0690 */ 0x939B, 0x93AA, 0x1C03, + /* Array index: 0x0693 */ 0x93B1, 0x93B7, 0x1C13, + /* Array index: 0x0696 */ 0x93CC, 0x93D5, 0x1C1A, + /* Array index: 0x0699 */ 0x93F5, 0x9400, 0x1C24, + /* Array index: 0x069C */ 0x9406, 0x9416, 0x1C30, + /* Array index: 0x069F */ 0x9428, 0x942C, 0x1C41, + /* Array index: 0x06A2 */ 0x9439, 0x9440, 0x1C46, + /* Array index: 0x06A5 */ 0x9445, 0x9450, 0x1C4E, + /* Array index: 0x06A8 */ 0x946B, 0x9478, 0x1C5A, + /* Array index: 0x06AB */ 0x9480, 0x9483, 0x1C68, + /* Array index: 0x06AE */ 0x957A, 0x957D, 0x1C6C, + /* Array index: 0x06B1 */ 0x959B, 0x959F, 0x1C70, + /* Array index: 0x06B4 */ 0x95B5, 0x95C0, 0x1C75, + /* Array index: 0x06B7 */ 0x95D1, 0x95D3, 0x1C81, + /* Array index: 0x06BA */ 0x95DA, 0x95E5, 0x1C84, + /* Array index: 0x06BD */ 0x9620, 0x9624, 0x1C90, + /* Array index: 0x06C0 */ 0x9639, 0x963D, 0x1C95, + /* Array index: 0x06C3 */ 0x9687, 0x9689, 0x1C9A, + /* Array index: 0x06C6 */ 0x9691, 0x9693, 0x1C9D, + /* Array index: 0x06C9 */ 0x971F, 0x972F, 0x1CA0, + /* Array index: 0x06CC */ 0x9777, 0x9784, 0x1CB1, + /* Array index: 0x06CF */ 0x9799, 0x97A5, 0x1CBF, + /* Array index: 0x06D2 */ 0x97A8, 0x97AE, 0x1CCC, + /* Array index: 0x06D5 */ 0x97CD, 0x97E5, 0x1CD3, + /* Array index: 0x06D8 */ 0x980D, 0x980F, 0x1CEC, + /* Array index: 0x06DB */ 0x9826, 0x9829, 0x1CEF, + /* Array index: 0x06DE */ 0x9841, 0x984A, 0x1CF3, + /* Array index: 0x06E1 */ 0x9850, 0x9852, 0x1CFD, + /* Array index: 0x06E4 */ 0x985C, 0x9864, 0x1D00, + /* Array index: 0x06E7 */ 0x9872, 0x9874, 0x1D09, + /* Array index: 0x06EA */ 0x98AC, 0x98AE, 0x1D0C, + /* Array index: 0x06ED */ 0x98BB, 0x98C2, 0x1D0F, + /* Array index: 0x06F0 */ 0x9914, 0x9917, 0x1D17, + /* Array index: 0x06F3 */ 0x9927, 0x9933, 0x1D1B, + /* Array index: 0x06F6 */ 0x999C, 0x999E, 0x1D28, + /* Array index: 0x06F9 */ 0x99B9, 0x99BD, 0x1D2B, + /* Array index: 0x06FC */ 0x99C9, 0x99CF, 0x1D30, + /* Array index: 0x06FF */ 0x99D3, 0x99D8, 0x1D37, + /* Array index: 0x0702 */ 0x99E3, 0x99F0, 0x1D3D, + /* Array index: 0x0705 */ 0x99F4, 0x9A15, 0x1D4B, + /* Array index: 0x0708 */ 0x9A1A, 0x9A3A, 0x1D6D, + /* Array index: 0x070B */ 0x9A46, 0x9A56, 0x1D8E, + /* Array index: 0x070E */ 0x9A64, 0x9A6B, 0x1D9F, + /* Array index: 0x0711 */ 0x9ABE, 0x9AC2, 0x1DA7, + /* Array index: 0x0714 */ 0x9AF1, 0x9AFE, 0x1DAC, + /* Array index: 0x0717 */ 0x9B08, 0x9B19, 0x1DBA, + /* Array index: 0x071A */ 0x9B1E, 0x9B20, 0x1DCC, + /* Array index: 0x071D */ 0x9B48, 0x9B4C, 0x1DCF, + /* Array index: 0x0720 */ 0x9B5F, 0x9B61, 0x1DD4, + /* Array index: 0x0723 */ 0x9B64, 0x9B68, 0x1DD7, + /* Array index: 0x0726 */ 0x9B70, 0x9B88, 0x1DDC, + /* Array index: 0x0729 */ 0x9B9E, 0x9BA8, 0x1DF5, + /* Array index: 0x072C */ 0x9BB5, 0x9BB9, 0x1E00, + /* Array index: 0x072F */ 0x9BC3, 0x9BC7, 0x1E05, + /* Array index: 0x0732 */ 0x9BD3, 0x9BEC, 0x1E0A, + /* Array index: 0x0735 */ 0x9C05, 0x9C0B, 0x1E24, + /* Array index: 0x0738 */ 0x9C28, 0x9C2C, 0x1E2B, + /* Array index: 0x073B */ 0x9C32, 0x9C41, 0x1E30, + /* Array index: 0x073E */ 0x9C48, 0x9C52, 0x1E40, + /* Array index: 0x0741 */ 0x9C62, 0x9C68, 0x1E4B, + /* Array index: 0x0744 */ 0x9C71, 0x9C75, 0x1E52, + /* Array index: 0x0747 */ 0x9CF7, 0x9D00, 0x1E57, + /* Array index: 0x074A */ 0x9D04, 0x9D08, 0x1E61, + /* Array index: 0x074D */ 0x9D17, 0x9D22, 0x1E66, + /* Array index: 0x0750 */ 0x9D2D, 0x9D38, 0x1E72, + /* Array index: 0x0753 */ 0x9D3D, 0x9D45, 0x1E7E, + /* Array index: 0x0756 */ 0x9D4A, 0x9D4C, 0x1E87, + /* Array index: 0x0759 */ 0x9D52, 0x9D5C, 0x1E8A, + /* Array index: 0x075C */ 0x9D67, 0x9D8C, 0x1E95, + /* Array index: 0x075F */ 0x9D94, 0x9DF8, 0x1EBB, + /* Array index: 0x0762 */ 0x9DFB, 0x9E19, 0x1F20, + /* Array index: 0x0765 */ 0x9E86, 0x9E8E, 0x1F3F, + /* Array index: 0x0768 */ 0x9E99, 0x9E9C, 0x1F48, + /* Array index: 0x076B */ 0x9EE4, 0x9EE7, 0x1F4C, + /* Array index: 0x076E */ 0x9EF2, 0x9F01, 0x1F50, + /* Array index: 0x0771 */ 0x9F18, 0x9F38, 0x1F60, + /* Array index: 0x0774 */ 0x9F40, 0x9F4F, 0x1F81, + /* Array index: 0x0777 */ 0x9F54, 0x9F60, 0x1F91, + /* Array index: 0x077A */ 0x9F6E, 0x9F7B, 0x1F9E, + /* Ranges content */ + /* Range 0x4F12 - 0x4F14, array index: 0x077D */ + 0x217A,0x2177,0x216E, + /* Range 0x4F74 - 0x4F89, array index: 0x0780 */ + 0x2539,INVALC,0x2538,0x253C,0x2543,0x2541,INVALC,INVALC, + 0x2533,0x2535,INVALC,INVALC,0x2536,0x2542,0x2549,INVALC, + 0x253B,0x2534,INVALC,0x2537,INVALC,0x253A, + /* Range 0x4F94 - 0x4F9E, array index: 0x0796 */ + 0x2546,0x254A,INVALC,0x253E,0x2532,INVALC,0x2540,INVALC, + 0x2545,INVALC,0x2547, + /* Range 0x4FB9 - 0x4FBB, array index: 0x07A1 */ + 0x2930,0x292E,0x2929, + /* Range 0x4FF4 - 0x4FF7, array index: 0x07A4 */ + 0x2D71,0x2D70,0x2D75,0x2D76, + /* Range 0x502F - 0x5037, array index: 0x07A8 */ + 0x2D7C,0x2D6E,0x2D7D,INVALC,0x2D72,INVALC,0x2D7B,INVALC, + 0x2D73, + /* Range 0x505B - 0x506B, array index: 0x07B1 */ + 0x335B,INVALC,0x3356,0x3352,0x3360,0x3353,0x3351,0x335D, + 0x3363,0x3364,INVALC,INVALC,INVALC,0x3A3F,0x3361,0x3350, + 0x3362, + /* Range 0x509B - 0x509E, array index: 0x07C2 */ + 0x3A35,0x3A40,0x3A3E,0x3A38, + /* Range 0x50C6 - 0x50CB, array index: 0x07C6 */ + 0x415B,INVALC,0x4160,0x4167,0x415E,0x4166, + /* Range 0x50FD - 0x50FF, array index: 0x07CC */ + 0x4F58,0x4F55,0x4F4E, + /* Range 0x5106 - 0x510C, array index: 0x07CF */ + 0x4F52,0x4F53,INVALC,INVALC,0x4F59,0x4F56,0x4F57, + /* Range 0x5122 - 0x5126, array index: 0x07D6 */ + 0x5C47,INVALC,0x5C48,0x5C46,0x5C45, + /* Range 0x512D - 0x5135, array index: 0x07DB */ + 0x6144,0x6145,INVALC,0x4F50,0x6143,INVALC,INVALC,0x6537, + 0x6538, + /* Range 0x5231 - 0x5235, array index: 0x07E4 */ + 0x2554,0x2551,0x2552,INVALC,0x2550, + /* Range 0x525E - 0x5262, array index: 0x07E9 */ + 0x2E2C,0x2E2D,INVALC,0x2E29,0x2E2F, + /* Range 0x526B - 0x526E, array index: 0x07EE */ + 0x336C,0x336E,0x336D,0x336F, + /* Range 0x5278 - 0x527C, array index: 0x07F2 */ + 0x416C,INVALC,0x416B,0x416D,0x416E, + /* Range 0x5296 - 0x5299, array index: 0x07F7 */ + 0x6539,0x6B51,0x6B50,0x6E7E, + /* Range 0x5309 - 0x530B, array index: 0x07FB */ + 0x2333,0x2556,0x2557, + /* Range 0x5394 - 0x5399, array index: 0x07FE */ + 0x255A,INVALC,0x2939,0x2938,0x293B,0x293A, + /* Range 0x5460 - 0x5467, array index: 0x0804 */ + 0x256B,0x256A,INVALC,0x256D,0x256F,0x2564,0x2567,0x256E, + /* Range 0x547E - 0x5482, array index: 0x080C */ + 0x2563,0x255C,INVALC,0x255D,0x255F, + /* Range 0x54A0 - 0x54A2, array index: 0x0811 */ + 0x2949,0x293D,0x294C, + /* Range 0x5503 - 0x5505, array index: 0x0814 */ + 0x2E48,0x2E3C,0x2E40, + /* Range 0x5508 - 0x5512, array index: 0x0817 */ + 0x2E3D,INVALC,0x2E42,0x2E49,0x3424,INVALC,0x2E47,INVALC, + INVALC,0x2E3F,0x2E36, + /* Range 0x5532 - 0x5536, array index: 0x0822 */ + 0x3425,INVALC,0x3379,0x337E,0x337D, + /* Range 0x554D - 0x5552, array index: 0x0827 */ + 0x3377,0x3427,INVALC,0x3378,0x337B,0x3422, + /* Range 0x5575 - 0x5577, array index: 0x082D */ + 0x3374,0x3375,0x3A4E, + /* Range 0x558C - 0x5595, array index: 0x0830 */ + 0x3A5A,0x417C,0x3A5F,0x3A53,INVALC,0x3A4A,0x3A57,0x3A51, + INVALC,0x3A5D, + /* Range 0x55A1 - 0x55A8, array index: 0x083A */ + 0x3A5E,0x3A50,0x3A56,0x3A58,0x3A4C,0x3A5B,INVALC,0x3A4B, + /* Range 0x55BF - 0x55C4, array index: 0x0842 */ + 0x417A,0x4176,INVALC,0x4227,0x416F,0x4178, + /* Range 0x55C8 - 0x55D6, array index: 0x0848 */ + 0x4223,INVALC,0x4174,0x4173,0x4171,0x4225,INVALC,0x417D, + 0x4172,INVALC,0x417B,INVALC,0x4177,0x417E,0x4222, + /* Range 0x563D - 0x564C, array index: 0x0857 */ + 0x4F6A,0x4F6C,INVALC,0x4F68,0x4F62,0x4F5F,INVALC,INVALC, + 0x3A4F,0x4F65,INVALC,0x4F5E,0x4F64,0x4F63,INVALC,0x4F60, + /* Range 0x567E - 0x5686, array index: 0x0867 */ + 0x5C52,0x5C54,INVALC,0x5C55,0x5C53,0x5C51,0x5C50,INVALC, + 0x5C4F, + /* Range 0x5697 - 0x569D, array index: 0x0870 */ + 0x6148,0x6146,0x614B,0x6149,INVALC,0x6147,0x614A, + /* Range 0x56A6 - 0x56AD, array index: 0x0877 */ + 0x653E,0x653F,INVALC,INVALC,0x6540,0x653C,0x6541,0x653D, + /* Range 0x571A - 0x5723, array index: 0x087F */ + 0x4F70,0x5652,0x5651,INVALC,0x715A,INVALC,0x2139,INVALC, + 0x214F,0x2150, + /* Range 0x576D - 0x5776, array index: 0x0889 */ + 0x2574,INVALC,0x2572,0x2577,0x2576,0x2573,0x257C,0x257D, + 0x257A,0x2578, + /* Range 0x5794 - 0x579F, array index: 0x0893 */ + 0x2959,0x295F,INVALC,0x2956,0x295A,0x295C,0x295E,0x2958, + INVALC,0x2957,0x2952,0x2953, + /* Range 0x57B5 - 0x57C1, array index: 0x089F */ + 0x2951,0x2E55,INVALC,0x2E54,0x2E59,0x2E50,INVALC,0x2E53, + 0x2E52,INVALC,0x2E56,INVALC,0x2E5A, + /* Range 0x57E1 - 0x5801, array index: 0x08AC */ + 0x3444,0x3432,0x3440,INVALC,0x3442,INVALC,0x3448,INVALC, + 0x344C,INVALC,INVALC,0x3443,0x3437,0x343F,INVALC,0x344D, + 0x344B,0x3441,0x343C,0x3435,0x3A68,0x3433,INVALC,0x343A, + INVALC,INVALC,0x3430,0x3446,0x3438,INVALC,INVALC,0x3436, + 0x3449, + /* Range 0x5807 - 0x5810, array index: 0x08CD */ + 0x343E,0x3439,INVALC,INVALC,0x343B,0x344A,0x344E,0x3445, + INVALC,0x3447, + /* Range 0x5825 - 0x582E, array index: 0x08D7 */ + 0x3A6A,INVALC,0x3A65,0x3A67,0x3A61,INVALC,INVALC,0x3A74, + 0x3A73,0x3A70, + /* Range 0x5832 - 0x583F, array index: 0x08E1 */ + 0x2E4D,0x3A6D,INVALC,INVALC,0x3A6F,0x3A62,0x3A72,0x3A71, + INVALC,0x3A75,INVALC,0x4236,INVALC,0x3A6E, + /* Range 0x584D - 0x584F, array index: 0x08EF */ + 0x422D,0x4231,0x422C, + /* Range 0x5863 - 0x5865, array index: 0x08F2 */ + 0x4237,0x422B,0x4234, + /* Range 0x587A - 0x587C, array index: 0x08F5 */ + 0x4946,0x494D,0x493E, + /* Range 0x5886 - 0x5891, array index: 0x08F8 */ + 0x4941,0x4947,0x494C,0x493D,INVALC,0x4945,INVALC,INVALC, + 0x4949,0x494F,0x493F,0x4948, + /* Range 0x590C - 0x590E, array index: 0x0904 */ + 0x2623,0x2961,0x2E5B, + /* Range 0x5970 - 0x5972, array index: 0x0907 */ + 0x614C,0x6D48,0x6F23, + /* Range 0x597B - 0x5980, array index: 0x090A */ + 0x222F,0x222D,INVALC,0x2230,0x2232,0x222C, + /* Range 0x598E - 0x5990, array index: 0x0910 */ + 0x2356,0x2359,0x2358, + /* Range 0x59A0 - 0x59A2, array index: 0x0913 */ + 0x2354,0x235B,0x2357, + /* Range 0x59B1 - 0x59B6, array index: 0x0916 */ + 0x2630,0x2629,INVALC,0x2634,0x2625,0x262C, + /* Range 0x59DD - 0x59E1, array index: 0x091C */ + 0x2968,0x2964,INVALC,0x2974,0x2963, + /* Range 0x59ED - 0x59F7, array index: 0x0921 */ + 0x2977,0x2965,INVALC,INVALC,0x2967,0x296E,0x2972,0x2976, + 0x2973,0x296C,0x296F, + /* Range 0x59FA - 0x5A00, array index: 0x092C */ + 0x2969,INVALC,0x296B,0x296A,0x2975,INVALC,0x2966, + /* Range 0x5A15 - 0x5A19, array index: 0x0933 */ + 0x2E61,0x2E5E,0x2E63,INVALC,0x2E5D, + /* Range 0x5A35 - 0x5A39, array index: 0x0938 */ + 0x3457,INVALC,0x3B26,0x3456,0x3469, + /* Range 0x5A42 - 0x5A48, array index: 0x093D */ + 0x3470,0x3460,0x3463,INVALC,INVALC,0x346D,0x3465, + /* Range 0x5A4C - 0x5A60, array index: 0x0944 */ + 0x346A,0x3468,INVALC,INVALC,0x3459,0x346E,0x3462,0x345D, + INVALC,0x3453,0x346F,0x345F,0x3452,INVALC,INVALC,0x3464, + 0x3471,0x3461,0x3455,0x345A,0x3451, + /* Range 0x5A78 - 0x5A7D, array index: 0x0959 */ + 0x3A7D,INVALC,0x3A7A,0x3B2D,0x3B21,0x3B2E, + /* Range 0x5A8A - 0x5A97, array index: 0x095F */ + 0x3B28,0x3B2B,0x3B2F,INVALC,0x3466,0x3B31,0x424D,INVALC, + INVALC,0x3B32,0x3A78,0x3B24,INVALC,0x3B29, + /* Range 0x5A9C - 0x5A9F, array index: 0x096D */ + 0x3B30,0x3B33,0x3A7C,0x3A79, + /* Range 0x5AAC - 0x5ABB, array index: 0x0971 */ + 0x3B23,INVALC,0x3B25,0x3A77,0x4241,0x423F,INVALC,INVALC, + 0x4249,0x4240,0x424A,0x4246,0x423E,0x424C,0x423D,0x4244, + /* Range 0x5AC4 - 0x5ACD, array index: 0x0981 */ + 0x423B,INVALC,0x4245,0x423A,0x4243,INVALC,0x4248,0x423C, + INVALC,0x424B, + /* Range 0x5AD9 - 0x5AE2, array index: 0x098B */ + 0x4961,0x4957,0x495D,0x4952,0x4960,0x495F,0x4963,0x495C, + INVALC,0x495B, + /* Range 0x5AE8 - 0x5AEE, array index: 0x0995 */ + 0x4962,INVALC,0x4956,0x4959,0x495E,0x4958,0x4953, + /* Range 0x5AF3 - 0x5AF9, array index: 0x099C */ + 0x495A,0x4F7C,INVALC,0x5021,0x4F7E,0x5023,0x5025, + /* Range 0x5AFF - 0x5B07, array index: 0x09A3 */ + 0x4F7B,INVALC,0x5026,0x5024,0x5022,INVALC,0x5028,INVALC, + 0x5027, + /* Range 0x5B13 - 0x5B1B, array index: 0x09AC */ + 0x5660,0x565F,INVALC,0x5662,0x565B,INVALC,0x565C,0x5664, + 0x565D, + /* Range 0x5B23 - 0x5B2F, array index: 0x09B5 */ + 0x5C5D,INVALC,0x5C5B,0x5C60,0x5C5F,0x5663,INVALC,INVALC, + INVALC,0x5C5E,0x5C5A,0x5C62,0x5C61, + /* Range 0x5B3C - 0x5B3F, array index: 0x09C2 */ + 0x614D,0x6546,0x6547,0x6548, + /* Range 0x5B47 - 0x5B4E, array index: 0x09C6 */ + 0x6B56,0x6B55,INVALC,INVALC,0x6D49,0x6D4A,0x6F24,0x7035, + /* Range 0x5BCA - 0x5BCE, array index: 0x09CE */ + 0x3B39,0x3B36,INVALC,0x3B35,0x3B3A, + /* Range 0x5C7A - 0x5C7E, array index: 0x09D3 */ + 0x2237,0x2238,0x2236,INVALC,0x2239, + /* Range 0x5C86 - 0x5C95, array index: 0x09D8 */ + 0x2367,INVALC,0x2362,0x2364,0x2366,0x2363,INVALC,0x2360, + INVALC,0x2361,INVALC,INVALC,0x2365,0x2368,INVALC,0x2369, + /* Range 0x5C9F - 0x5CB0, array index: 0x09E8 */ + 0x2643,0x263E,INVALC,0x2646,0x2644,0x263D,0x264A,0x264D, + 0x2648,0x2641,INVALC,0x2647,INVALC,0x2642,0x2645,0x263C, + 0x2640,0x264C, + /* Range 0x5CC6 - 0x5CDF, array index: 0x09FA */ + 0x2A2C,0x2A25,0x2A2B,0x2A24,0x2A26,0x297E,0x297C,INVALC, + 0x2A2D,0x2A2A,0x297A,INVALC,INVALC,0x2A28,0x2A29,INVALC, + 0x2A27,0x297D,0x297B,INVALC,0x2A23,0x2A21,INVALC,INVALC, + 0x2A22,0x2A2E, + /* Range 0x5CF7 - 0x5CF9, array index: 0x0A14 */ + 0x2E72,0x2A2F,0x2E74, + /* Range 0x5D0B - 0x5D0F, array index: 0x0A17 */ + 0x3478,0x347C,0x347E,INVALC,0x3523, + /* Range 0x5D1D - 0x5D20, array index: 0x0A1C */ + 0x3479,0x3477,0x3527,0x347B, + /* Range 0x5D2E - 0x5D4B, array index: 0x0A20 */ + 0x3528,INVALC,0x3524,0x3B4B,0x3B52,0x3B47,INVALC,0x3B43, + 0x3B53,0x3B3D,0x3B50,0x3B4E,0x3B48,INVALC,0x3B51,0x3B4A, + INVALC,0x3B42,0x3B54,0x3B40,0x3B4D,0x3B3E,INVALC,0x3B55, + INVALC,INVALC,INVALC,0x3B4F,0x4255,0x3B41, + /* Range 0x5D79 - 0x5D82, array index: 0x0A3E */ + 0x4975,0x496C,INVALC,0x4973,0x496A,0x4972,0x4976,0x4969, + 0x496D,0x4968, + /* Range 0x5D86 - 0x5D8A, array index: 0x0A48 */ + 0x496B,INVALC,0x4971,0x4970,0x496F, + /* Range 0x5D9C - 0x5DA2, array index: 0x0A4D */ + 0x5033,INVALC,0x5036,0x502D,0x5032,0x5034,0x502F, + /* Range 0x5DA7 - 0x5DB7, array index: 0x0A54 */ + 0x566B,0x5670,0x566A,0x566F,INVALC,0x5668,0x5672,0x566E, + 0x5673,0x566D,0x5669,0x5671,INVALC,0x5674,0x566C,INVALC, + 0x5C66, + /* Range 0x5E20 - 0x5E24, array index: 0x0A65 */ + 0x2A34,0x2A31,0x2A32,0x2A33,0x2A35, + /* Range 0x5E4A - 0x5E4F, array index: 0x0A6A */ + 0x4260,0x4262,INVALC,0x4261,0x425F,0x425E, + /* Range 0x5E66 - 0x5E70, array index: 0x0A70 */ + 0x5677,0x5675,0x5676,0x5037,0x5C68,INVALC,0x5C67,0x6151, + 0x6152,0x5678,0x654A, + /* Range 0x5E88 - 0x5E8D, array index: 0x0A7B */ + 0x2370,0x236E,INVALC,0x236D,0x236F,0x2371, + /* Range 0x5EA2 - 0x5EA5, array index: 0x0A81 */ + 0x2A38,0x2A3A,0x2A37,0x2A3B, + /* Range 0x5EAE - 0x5EB4, array index: 0x0A85 */ + 0x2E78,INVALC,0x2A36,0x352B,0x352E,0x352F,0x352C, + /* Range 0x5EC5 - 0x5EC7, array index: 0x0A8C */ + 0x4263,0x4265,0x4267, + /* Range 0x5ED1 - 0x5EDE, array index: 0x0A8F */ + 0x497B,0x4A23,INVALC,0x4A24,0x4A21,INVALC,0x497C,0x497A, + 0x4A22,INVALC,0x503C,0x497E,INVALC,0x503D, + /* Range 0x5EE5 - 0x5EE9, array index: 0x0A9D */ + 0x567D,0x567B,0x567A,0x567C,0x5679, + /* Range 0x5EEE - 0x5EF2, array index: 0x0AA2 */ + 0x6872,0x6873,INVALC,0x6B59,0x6D4D, + /* Range 0x5F22 - 0x5F24, array index: 0x0AA7 */ + 0x2652,0x2653,0x2654, + /* Range 0x5FBB - 0x5FC1, array index: 0x0AAA */ + 0x5722,0x5721,INVALC,0x5C69,0x654B,0x6874,0x6875, + /* Range 0x5FCF - 0x5FD5, array index: 0x0AB1 */ + 0x2242,0x2378,0x2377,0x2376,INVALC,0x2241,0x2240, + /* Range 0x5FE1 - 0x5FE5, array index: 0x0AB8 */ + 0x237D,INVALC,0x2421,0x237E,0x265A, + /* Range 0x5FED - 0x5FEF, array index: 0x0ABD */ + 0x2379,0x237B,0x2423, + /* Range 0x6009 - 0x6013, array index: 0x0AC0 */ + 0x266E,0x2661,0x265F,0x266D,0x2668,INVALC,INVALC,0x2669, + 0x266C,INVALC,0x266B, + /* Range 0x602C - 0x6034, array index: 0x0ACB */ + 0x2666,0x265B,0x266A,INVALC,INVALC,INVALC,0x265E,0x2663, + 0x2660, + /* Range 0x6040 - 0x6049, array index: 0x0AD4 */ + 0x2A4B,0x2F23,0x2A4C,INVALC,0x2A4F,0x2A45,INVALC,0x2A47, + INVALC,0x2A48, + /* Range 0x605A - 0x605F, array index: 0x0ADE */ + 0x2F21,0x2A49,INVALC,0x2E7E,0x2A44,0x2A4D, + /* Range 0x6086 - 0x608A, array index: 0x0AE4 */ + 0x3537,0x2F2E,0x2F25,INVALC,0x3535, + /* Range 0x609B - 0x609D, array index: 0x0AE9 */ + 0x2F2C,0x2F2F,0x2F29, + /* Range 0x60BE - 0x60CF, array index: 0x0AEC */ + 0x3538,0x3546,0x3549,0x3B6C,INVALC,0x3547,0x3B61,INVALC, + INVALC,INVALC,0x3541,0x3B5C,0x3545,INVALC,0x3B5E,0x3548, + 0x3B60,0x353D, + /* Range 0x6103 - 0x6105, array index: 0x0AFE */ + 0x3B6D,0x3B72,0x3B66, + /* Range 0x6128 - 0x612F, array index: 0x0B01 */ + 0x4A2A,0x4276,INVALC,0x426E,0x4A29,INVALC,0x4272,0x4274, + /* Range 0x6152 - 0x6156, array index: 0x0B09 */ + 0x4A2F,0x4A30,0x4A35,INVALC,0x4A3C, + /* Range 0x6171 - 0x6174, array index: 0x0B0E */ + 0x4A2D,0x4A31,0x4A2E,0x4A34, + /* Range 0x6189 - 0x618D, array index: 0x0B12 */ + 0x5047,INVALC,0x5041,0x572E,0x5050, + /* Range 0x61AD - 0x61B5, array index: 0x0B17 */ + 0x504B,INVALC,0x504A,0x5045,0x5044,INVALC,0x5052,0x5727, + 0x5C6B, + /* Range 0x61DE - 0x61E0, array index: 0x0B20 */ + 0x5C72,0x6154,0x5C6E, + /* Range 0x61E4 - 0x61F1, array index: 0x0B23 */ + 0x5C70,0x5C6F,INVALC,0x5C6D,0x5C71,0x615C,0x6158,0x615A, + INVALC,0x6155,0x6156,INVALC,0x6159,0x6157, + /* Range 0x6223 - 0x622D, array index: 0x0B31 */ + 0x427A,0x427C,0x427B,INVALC,0x4A3E,INVALC,0x4A3D,INVALC, + 0x4A3F,INVALC,0x5053, + /* Range 0x625E - 0x6266, array index: 0x0B3C */ + 0x2244,INVALC,0x224A,0x2246,0x2248,INVALC,0x2245,0x224C, + 0x2247, + /* Range 0x6270 - 0x6274, array index: 0x0B45 */ + 0x2432,0x242F,0x2437,INVALC,0x2438, + /* Range 0x62A9 - 0x62B8, array index: 0x0B4A */ + 0x267D,0x2676,INVALC,INVALC,0x2672,0x2679,0x267B,0x267E, + INVALC,INVALC,0x267A,0x2673,INVALC,0x2677,INVALC,0x2721, + /* Range 0x62F5 - 0x62FB, array index: 0x0B5A */ + 0x2A58,0x2A60,INVALC,0x2A5F,0x2A5C,0x2A64,0x2A66, + /* Range 0x630B - 0x6315, array index: 0x0B61 */ + 0x2A57,0x2A5E,0x2A56,0x2A59,0x2A5D,0x2F34,INVALC,INVALC, + 0x2A62,0x2A63,0x2A65, + /* Range 0x6332 - 0x633C, array index: 0x0B6C */ + 0x354A,0x2F48,0x2F42,INVALC,0x2F39,INVALC,0x2F4B,0x2F3C, + INVALC,0x3561,0x2F3F, + /* Range 0x6340 - 0x634B, array index: 0x0B77 */ + 0x2F4D,0x2F41,INVALC,0x2F3A,0x2F37,0x2F38,INVALC,0x2F47, + 0x2F4E,INVALC,0x2F3E,0x2F3D, + /* Range 0x6354 - 0x635A, array index: 0x0B83 */ + 0x2F44,INVALC,0x2F35,0x2F4C,0x2F43,0x2F45,0x2F49, + /* Range 0x636D - 0x6370, array index: 0x0B8A */ + 0x355D,0x3559,0x3556,0x3568, + /* Range 0x638D - 0x6391, array index: 0x0B8E */ + 0x3567,0x3555,INVALC,0x3558,0x3566, + /* Range 0x639C - 0x639F, array index: 0x0B93 */ + 0x355C,0x3552,0x3550,0x3562, + /* Range 0x63AB - 0x63B1, array index: 0x0B97 */ + 0x3554,INVALC,0x3551,0x355E,0x355A,0x3B77,0x3B76, + /* Range 0x63C2 - 0x63CE, array index: 0x0B9E */ + 0x3C2F,0x3B7C,0x3C2C,0x427D,INVALC,0x3C30,0x3C33,INVALC, + 0x3C21,0x3C32,0x3C31,INVALC,0x3B78, + /* Range 0x63D5 - 0x63E0, array index: 0x0BAB */ + 0x3C24,INVALC,0x3C35,0x3C2D,0x3C36,INVALC,INVALC,0x3C2B, + 0x3C2A,INVALC,0x3C28,0x3C22, + /* Range 0x63E4 - 0x63E8, array index: 0x0BB7 */ + 0x2F3B,0x3B79,INVALC,0x433D,0x3B7A, + /* Range 0x63EF - 0x63F6, array index: 0x0BBC */ + 0x3B7B,0x3C34,0x427E,0x3C25,0x3B7E,INVALC,0x3C26,0x3C23, + /* Range 0x6409 - 0x6412, array index: 0x0BC4 */ + 0x4324,0x4337,0x433C,0x4330,INVALC,0x4341,INVALC,0x4322, + INVALC,0x4323, + /* Range 0x641F - 0x6428, array index: 0x0BCE */ + 0x4329,0x4325,0x4340,0x432E,0x432F,0x4326,0x433A,0x4331, + 0x433B,0x4333, + /* Range 0x642E - 0x6430, array index: 0x0BD8 */ + 0x433F,0x4336,0x4332, + /* Range 0x643F - 0x6443, array index: 0x0BDB */ + 0x4A55,0x4339,0x4334,INVALC,0x4328, + /* Range 0x6459 - 0x6461, array index: 0x0BE0 */ + 0x4A58,INVALC,0x4A42,0x4A4F,0x4A43,0x4A4E,INVALC,0x4A52, + 0x3C27, + /* Range 0x6470 - 0x6477, array index: 0x0BE9 */ + 0x5055,INVALC,0x4A46,0x4A47,0x4A44,0x4A49,0x4A45,0x4A5A, + /* Range 0x6489 - 0x648C, array index: 0x0BF1 */ + 0x5735,0x505D,0x505C,0x505E, + /* Range 0x6496 - 0x6498, array index: 0x0BF5 */ + 0x5056,0x5059,0x5063, + /* Range 0x649C - 0x64A0, array index: 0x0BF8 */ + 0x505A,0x3B7D,INVALC,0x5060,0x5057, + /* Range 0x650C - 0x6510, array index: 0x0BFD */ + 0x6551,0x654F,0x6552,INVALC,0x654E, + /* Range 0x6513 - 0x6517, array index: 0x0C02 */ + 0x687A,INVALC,0x6879,0x6878,0x6877, + /* Range 0x6520 - 0x6526, array index: 0x0C07 */ + 0x6D4F,0x6D4E,0x6D51,INVALC,INVALC,0x6F2C,0x6D50, + /* Range 0x6564 - 0x656A, array index: 0x0C0E */ + 0x3C3A,0x3C3D,INVALC,0x3C38,0x3C3C,INVALC,0x3C39, + /* Range 0x6579 - 0x6581, array index: 0x0C15 */ + 0x5066,0x5065,0x5067,0x573C,INVALC,INVALC,0x573B,0x5C7A, + 0x5C79, + /* Range 0x65C2 - 0x65C6, array index: 0x0C1E */ + 0x2F54,0x2F52,0x2F53,INVALC,0x2F51, + /* Range 0x65DA - 0x65E1, array index: 0x0C23 */ + 0x5C7C,0x6165,INVALC,0x6555,0x6554,0x687B,INVALC,0x213E, + /* Range 0x65EE - 0x65F5, array index: 0x0C2B */ + 0x224F,0x224E,0x2439,INVALC,0x243C,0x243B,0x243A,0x243D, + /* Range 0x65FB - 0x65FD, array index: 0x0C33 */ + 0x272A,0x2726,0x272F, + /* Range 0x6603 - 0x6612, array index: 0x0C36 */ + 0x272B,0x2727,0x272E,INVALC,INVALC,0x2729,0x2725,INVALC, + 0x272C,INVALC,0x272D,INVALC,INVALC,0x2731,0x2730,0x2728, + /* Range 0x6632 - 0x663A, array index: 0x0C46 */ + 0x2A6E,0x2A73,0x2A77,0x2A6F,0x2A6C,INVALC,INVALC,0x2A78, + 0x2A75, + /* Range 0x6678 - 0x667C, array index: 0x0C4F */ + 0x434D,0x3C49,INVALC,0x3C46,0x3C44, + /* Range 0x668A - 0x668C, array index: 0x0C54 */ + 0x434A,0x4349,0x4346, + /* Range 0x669F - 0x66A1, array index: 0x0C57 */ + 0x4A5F,0x4A5E,0x4A5D, + /* Range 0x66BA - 0x66C0, array index: 0x0C5A */ + 0x5746,0x5745,INVALC,0x5744,0x573F,INVALC,0x5740, + /* Range 0x66C8 - 0x66CC, array index: 0x0C61 */ + 0x573E,INVALC,0x5741,0x5742,0x5747, + /* Range 0x670F - 0x6713, array index: 0x0C66 */ + 0x2A7A,0x2A7B,INVALC,0x2F59,0x2F5A, + /* Range 0x6720 - 0x6723, array index: 0x0C6B */ + 0x434E,0x4641,0x4A62,0x5748, + /* Range 0x6738 - 0x673F, array index: 0x0C6F */ + 0x2252,0x2251,0x2254,0x2253,0x2256,INVALC,0x2250,0x2255, + /* Range 0x6747 - 0x674D, array index: 0x0C77 */ + 0x243F,0x2443,INVALC,INVALC,0x2447,0x2442,0x2445, + /* Range 0x6776 - 0x677D, array index: 0x0C7E */ + 0x2738,INVALC,0x2747,0x2748,0x2740,0x2739,INVALC,0x2745, + /* Range 0x6781 - 0x6786, array index: 0x0C86 */ + 0x2746,INVALC,0x2744,0x273C,0x2734,0x273B, + /* Range 0x678C - 0x6794, array index: 0x0C8C */ + 0x273F,0x273E,0x2736,INVALC,INVALC,0x2742,0x2737,INVALC, + 0x2749, + /* Range 0x67B7 - 0x67BB, array index: 0x0C95 */ + 0x2B27,INVALC,0x2B34,0x2B21,0x2B23, + /* Range 0x67C0 - 0x67CE, array index: 0x0C9A */ + 0x2B26,0x2A7C,0x2B33,0x2B43,INVALC,0x2B28,0x2B3A,INVALC, + 0x2A7E,0x2B41,0x2B42,0x2B45,0x2B3C,0x2B2D,0x2B35, + /* Range 0x67E3 - 0x67FC, array index: 0x0CA9 */ + 0x2B32,0x2B2A,INVALC,0x2B3E,0x2B36,INVALC,INVALC,0x2B44, + 0x2B29,INVALC,0x2B3B,0x2B31,INVALC,0x2B37,INVALC,0x2A7D, + INVALC,INVALC,INVALC,0x2B30,0x2B2F,0x2B24,INVALC,0x2B40, + INVALC,0x2B39, + /* Range 0x681C - 0x6820, array index: 0x0CC3 */ + 0x2F65,0x2F6D,INVALC,0x2F5B,0x2F76, + /* Range 0x682B - 0x6835, array index: 0x0CC8 */ + 0x2F67,INVALC,0x2F68,0x2F72,0x2F69,INVALC,0x2F64,0x2F5E, + 0x2F5F,0x2F6C,0x2F66, + /* Range 0x684B - 0x684F, array index: 0x0CD3 */ + 0x2F61,INVALC,0x2F73,0x2F6A,0x2F62, + /* Range 0x686B - 0x6880, array index: 0x0CD8 */ + 0x3628,INVALC,0x3576,0x3577,0x357B,INVALC,0x362C,0x3629, + INVALC,0x3622,0x3621,INVALC,0x3625,0x3634,0x3572,INVALC, + 0x3635,0x3627,0x3639,0x362D,INVALC,0x362B, + /* Range 0x6887 - 0x6892, array index: 0x0CEE */ + 0x3573,INVALC,0x3632,0x3638,0x3630,0x3637,INVALC,INVALC, + 0x3624,0x3574,0x3636,0x3626, + /* Range 0x68A9 - 0x68AE, array index: 0x0CFA */ + 0x357E,0x362A,0x3579,0x357D,INVALC,0x3578, + /* Range 0x68C6 - 0x68C8, array index: 0x0D00 */ + 0x3C66,0x3C7C,0x3C71, + /* Range 0x68D0 - 0x68D6, array index: 0x0D03 */ + 0x3C69,0x3C76,INVALC,0x3C4E,0x3C78,INVALC,0x3C56, + /* Range 0x68DC - 0x68DE, array index: 0x0D0A */ + 0x3C50,0x3C72,0x3C73, + /* Range 0x68E6 - 0x68F8, array index: 0x0D0D */ + 0x3C74,INVALC,0x3C6C,0x3C79,0x3C53,0x3C58,0x3C52,INVALC, + INVALC,0x3C65,0x4364,0x3C54,INVALC,0x3C5D,0x3C75,INVALC, + 0x3C5A,0x3C57,0x3C68, + /* Range 0x6904 - 0x6917, array index: 0x0D20 */ + 0x3C4F,INVALC,0x3C77,0x3C5F,0x3C61,INVALC,0x3C6E,0x3C6D, + 0x3C4D,INVALC,INVALC,0x3C55,0x3C5C,0x3C64,INVALC,0x3C5B, + 0x3C67,0x3C7A,INVALC,0x3C6F, + /* Range 0x6932 - 0x6959, array index: 0x0D34 */ + 0x4376,0x4361,0x4366,0x435F,INVALC,0x4372,0x4351,0x4358, + INVALC,0x4370,0x437A,0x4362,INVALC,0x4355,0x4368,0x436D, + 0x4359,INVALC,0x436A,0x4356,INVALC,INVALC,0x435D,0x435E, + INVALC,0x4371,0x436F,INVALC,0x4352,0x4374,INVALC,0x4375, + 0x4377,INVALC,INVALC,INVALC,0x357A,0x435A,0x436C,0x435B, + /* Range 0x696F - 0x6971, array index: 0x0D5C */ + 0x4369,0x3C62,0x4354, + /* Range 0x698D - 0x699A, array index: 0x0D5F */ + 0x4A70,0x4A6E,INVALC,0x4B26,0x4A6C,INVALC,0x4A7E,INVALC, + INVALC,0x4A68,0x4B25,INVALC,0x4A6D,0x4A7B, + /* Range 0x69AF - 0x69B6, array index: 0x0D6D */ + 0x4A73,0x4A69,0x4A63,INVALC,0x4A7D,INVALC,0x4B28,0x4A64, + /* Range 0x69BC - 0x69BF, array index: 0x0D75 */ + 0x4A6B,0x4A76,0x4A72,0x4A74, + /* Range 0x69E2 - 0x69E7, array index: 0x0D79 */ + 0x507C,INVALC,0x5078,0x5074,0x512A,0x5127, + /* Range 0x69F4 - 0x6A00, array index: 0x0D7F */ + 0x5137,INVALC,0x5134,0x5126,0x5075,INVALC,INVALC,0x512B, + 0x512D,INVALC,0x5121,0x507A,0x5071, + /* Range 0x6A04 - 0x6A09, array index: 0x0D8C */ + 0x5130,INVALC,0x5072,0x5136,0x5129,0x512F, + /* Range 0x6A14 - 0x6A18, array index: 0x0D92 */ + 0x5125,0x5076,0x5138,0x5073,0x5131, + /* Range 0x6A25 - 0x6A28, array index: 0x0D97 */ + 0x5132,0x5135,0x5122,0x5755, + /* Range 0x6A3B - 0x6A41, array index: 0x0D9B */ + 0x5757,0x5762,INVALC,0x574F,0x5758,0x5128,0x5759, + /* Range 0x6A4D - 0x6A56, array index: 0x0DA2 */ + 0x5766,0x5767,0x575D,0x575C,0x5754,INVALC,INVALC,0x575E, + 0x5765,0x5764, + /* Range 0x6A5A - 0x6A60, array index: 0x0DAC */ + 0x5756,0x5753,INVALC,0x5750,0x5763,INVALC,0x5761, + /* Range 0x6A64 - 0x6A6A, array index: 0x0DB3 */ + 0x575B,INVALC,0x574A,0x574C,0x574E,0x5760,0x575A, + /* Range 0x6A8C - 0x6A96, array index: 0x0DBA */ + 0x5D35,0x5C7E,0x5D2B,INVALC,INVALC,0x5D30,0x5D36,0x5D2A, + INVALC,0x5D2C,0x5D21, + /* Range 0x6AA4 - 0x6AA8, array index: 0x0DC5 */ + 0x5D2F,0x5D23,0x5D32,INVALC,0x5D2E, + /* Range 0x6AB6 - 0x6ABA, array index: 0x0DCA */ + 0x616F,0x6170,INVALC,0x616A,0x616E, + /* Range 0x6AC5 - 0x6AD1, array index: 0x0DCF */ + 0x6169,0x616D,0x6171,INVALC,INVALC,INVALC,0x655C,0x6559, + 0x6562,INVALC,0x6561,0x655F,0x655A, + /* Range 0x6ADC - 0x6AE1, array index: 0x0DDC */ + 0x655E,INVALC,0x6563,0x655D,0x6558,0x616C, + /* Range 0x6AE7 - 0x6AF3, array index: 0x0DE2 */ + 0x6557,0x6924,INVALC,0x6923,0x6560,INVALC,INVALC,0x6927, + 0x6928,0x6922,0x6926,INVALC,0x6921, + /* Range 0x6B0F - 0x6B1A, array index: 0x0DEF */ + 0x6F31,INVALC,0x6F2F,0x6F30,0x703A,INVALC,INVALC,INVALC, + 0x7123,0x7121,0x7122,0x7124, + /* Range 0x6B33 - 0x6B3C, array index: 0x0DFB */ + 0x363B,0x2F7B,INVALC,0x363A,0x363C,0x363D,0x3C7D,INVALC, + 0x3C7E,0x3D22, + /* Range 0x6B3F - 0x6B4D, array index: 0x0E05 */ + 0x3D21,INVALC,0x4422,0x437E,0x437D,INVALC,0x437C,0x437B, + INVALC,0x4421,INVALC,0x4B2B,0x4B2D,INVALC,0x4B2C, + /* Range 0x6B54 - 0x6B56, array index: 0x0E14 */ + 0x576A,0x5769,0x576B, + /* Range 0x6B8C - 0x6BAD, array index: 0x0E17 */ + 0x3642,0x3640,0x3641,0x363F,INVALC,0x363E,INVALC,INVALC, + 0x3D23,0x3D26,INVALC,0x3D24,INVALC,0x3D25,INVALC,0x4423, + INVALC,INVALC,0x4B2E,0x4B2F,0x4B30,INVALC,0x513C,0x513B, + INVALC,0x513A,0x513D,0x576C,INVALC,INVALC,0x576D,0x576E, + INVALC,0x5D38, + /* Range 0x6BC3 - 0x6BCC, array index: 0x0E39 */ + 0x4B31,0x4B32,INVALC,INVALC,0x5770,0x576F,0x6175,0x6F32, + INVALC,0x2140, + /* Range 0x6BE0 - 0x6BE8, array index: 0x0E43 */ + 0x2B4C,INVALC,0x3025,0x3024,0x3022,INVALC,0x3021,0x3026, + 0x3023, + /* Range 0x6BF7 - 0x6C06, array index: 0x0E4C */ + 0x4427,0x4428,0x4426,INVALC,0x4424,0x4425,INVALC,0x4B33, + 0x5140,0x513F,0x513E,0x5141,0x5772,0x5771,INVALC,0x5773, + /* Range 0x6C09 - 0x6C0D, array index: 0x0E5C */ + 0x5D39,INVALC,0x6176,0x6566,0x6D55, + /* Range 0x6C14 - 0x6C1A, array index: 0x0E61 */ + 0x2141,0x215F,INVALC,INVALC,0x2258,0x2449,0x244A, + /* Range 0x6C4A - 0x6C4C, array index: 0x0E68 */ + 0x225D,0x225F,0x2260, + /* Range 0x6C65 - 0x6C73, array index: 0x0E6B */ + 0x245B,0x2459,0x244C,INVALC,0x2453,INVALC,0x244D,INVALC, + 0x2455,INVALC,0x2452,INVALC,0x2451,INVALC,0x245A, + /* Range 0x6CCD - 0x6CD4, array index: 0x0E7A */ + 0x2769,INVALC,0x276D,0x2759,0x276F,0x2760,INVALC,0x2755, + /* Range 0x6CE9 - 0x6CEE, array index: 0x0E82 */ + 0x276E,INVALC,0x2751,0x2750,0x275E,0x2752, + /* Range 0x6D00 - 0x6D0A, array index: 0x0E88 */ + 0x2B5E,0x2B61,INVALC,0x2B64,0x2B59,INVALC,INVALC,0x2B67, + 0x2B6A,0x2B6C,0x2B56, + /* Range 0x6D0D - 0x6D12, array index: 0x0E93 */ + 0x302C,INVALC,0x2B65,0x2B6D,0x2B5D,0x2B55, + /* Range 0x6D16 - 0x6D1A, array index: 0x0E99 */ + 0x3047,INVALC,0x2B62,0x2B5A,0x2B5C, + /* Range 0x6D2C - 0x6D34, array index: 0x0E9E */ + 0x2B69,0x2B51,INVALC,0x3041,0x2768,INVALC,INVALC,0x2B58, + 0x2B50, + /* Range 0x6D5E - 0x6D68, array index: 0x0EA7 */ + 0x3038,0x303E,0x303A,0x302D,0x3030,0x3029,0x302A,INVALC, + INVALC,0x3039,0x3042, + /* Range 0x6D7A - 0x6D86, array index: 0x0EB2 */ + 0x3028,0x3049,0x303D,0x304A,0x3044,0x3036,0x3045,INVALC, + 0x303F,0x3048,0x3046,INVALC,0x3037, + /* Range 0x6D90 - 0x6D92, array index: 0x0EBF */ + 0x304C,0x3033,0x302E, + /* Range 0x6DBA - 0x6DC2, array index: 0x0EC2 */ + 0x365E,0x366A,INVALC,0x365B,0x3654,INVALC,0x3644,INVALC, + 0x3660, + /* Range 0x6DC8 - 0x6DCA, array index: 0x0ECB */ + 0x3650,0x3662,0x365A, + /* Range 0x6DCF - 0x6DE5, array index: 0x0ECE */ + 0x3661,0x3663,INVALC,INVALC,0x3665,0x364E,0x365F,0x3653, + 0x3667,INVALC,INVALC,INVALC,0x3658,0x3656,0x3657,INVALC, + 0x3652,0x3651,INVALC,0x364B,0x3669,INVALC,0x3655, + /* Range 0x6E39 - 0x6E4B, array index: 0x0EE5 */ + 0x3D4C,INVALC,0x3D40,0x3D32,0x3D33,INVALC,0x3D37,0x3D3E, + 0x3D38,INVALC,INVALC,INVALC,0x3D34,0x3D2D,0x3D2E,INVALC, + 0x3D30,INVALC,0x3D3D, + /* Range 0x6E51 - 0x6E55, array index: 0x0EF8 */ + 0x3D3F,0x3D57,0x3D4F,INVALC,0x3D55, + /* Range 0x6E5A - 0x6E68, array index: 0x0EFD */ + 0x3D5B,INVALC,0x3D45,0x3D39,0x3D43,INVALC,0x3D49,0x3D46, + 0x3D35,INVALC,0x3D53,0x3D50,0x3D58,INVALC,0x3D44, + /* Range 0x6E73 - 0x6E79, array index: 0x0F0C */ + 0x3D3A,0x3648,INVALC,INVALC,0x3D54,0x3D52,0x3D56, + /* Range 0x6E8D - 0x6E94, array index: 0x0F13 */ + 0x4447,0x4446,0x442C,INVALC,INVALC,0x4445,0x442F,0x4430, + /* Range 0x6E9E - 0x6EA6, array index: 0x0F1B */ + 0x4438,0x442E,0x4431,0x4449,INVALC,0x4450,0x4448,INVALC, + 0x443D, + /* Range 0x6EAE - 0x6EB3, array index: 0x0F24 */ + 0x444F,INVALC,0x443B,0x4432,0x443F,0x444B, + /* Range 0x6EBD - 0x6EC3, array index: 0x0F2A */ + 0x4436,0x4440,0x444A,0x442D,0x4437,INVALC,0x4441, + /* Range 0x6EC6 - 0x6ED2, array index: 0x0F31 */ + 0x4434,INVALC,0x442B,0x4439,0x444D,INVALC,INVALC,0x443C, + 0x4B34,0x443E,0x444C,INVALC,0x4435, + /* Range 0x6EF5 - 0x6EFD, array index: 0x0F3E */ + 0x4B35,0x4B56,INVALC,0x4B39,0x4B49,INVALC,0x4B3B,0x4B59, + 0x4B55, + /* Range 0x6F05 - 0x6F0E, array index: 0x0F47 */ + 0x4B54,INVALC,0x4B51,0x4B5E,0x4B3D,0x4B46,INVALC,INVALC, + 0x4B5C,0x4B52, + /* Range 0x6F18 - 0x6F27, array index: 0x0F51 */ + 0x4B42,0x4B3F,0x4B40,INVALC,0x4B58,INVALC,0x4B5D,0x4B5B, + INVALC,0x4B5F,INVALC,INVALC,INVALC,0x4B38,0x5143,0x4B41, + /* Range 0x6F35 - 0x6F3C, array index: 0x0F61 */ + 0x4B4F,0x4B47,0x4B3A,INVALC,0x4B57,0x4B5A,0x4B43,0x4B4E, + /* Range 0x6F4E - 0x6F57, array index: 0x0F69 */ + 0x4B3E,0x514C,0x5156,INVALC,0x5155,0x5161,INVALC,0x5153, + INVALC,0x5157, + /* Range 0x6F5D - 0x6F63, array index: 0x0F73 */ + 0x515A,0x577B,INVALC,INVALC,0x515C,0x514B,0x5166, + /* Range 0x6F67 - 0x6F6C, array index: 0x0F7A */ + 0x515F,INVALC,0x5163,0x5168,0x515D,0x5151, + /* Range 0x6F7B - 0x6F7F, array index: 0x0F80 */ + 0x5169,INVALC,0x515E,0x5144,0x5164, + /* Range 0x6F89 - 0x6F8D, array index: 0x0F85 */ + 0x5149,INVALC,0x5162,0x514A,0x5148, + /* Range 0x6F90 - 0x6F96, array index: 0x0F8A */ + 0x5160,INVALC,0x5147,0x5159,0x5158,0x5165,0x514F, + /* Range 0x6FA8 - 0x6FB2, array index: 0x0F91 */ + 0x5822,0x5D3B,0x5828,0x582E,0x5827,0x5774,0x5825,0x5830, + 0x5832,INVALC,0x5831, + /* Range 0x6FC4 - 0x6FCF, array index: 0x0F9C */ + 0x577C,INVALC,0x5146,0x5777,0x577A,0x582D,0x5821,0x5775, + 0x5D3A,0x582F,0x5779,0x5829, + /* Range 0x6FDC - 0x6FDE, array index: 0x0FA8 */ + 0x5D3F,0x5D45,0x5D43, + /* Range 0x6FE2 - 0x6FE8, array index: 0x0FAB */ + 0x5D46,0x5D3E,INVALC,INVALC,0x5D42,0x5D41,0x5D47, + /* Range 0x6FFB - 0x7007, array index: 0x0FB2 */ + 0x6222,0x6224,INVALC,INVALC,0x617E,0x6221,0x617A,INVALC, + INVALC,0x5823,0x617B,INVALC,0x6177, + /* Range 0x700A - 0x700E, array index: 0x0FBF */ + 0x6226,INVALC,0x6178,0x6179,0x617D, + /* Range 0x7020 - 0x702B, array index: 0x0FC4 */ + 0x6569,0x656C,0x656D,0x656E,0x6571,INVALC,0x6223,0x6568, + INVALC,0x656F,0x6934,0x656B, + /* Range 0x7031 - 0x704A, array index: 0x0FD0 */ + 0x692E,INVALC,0x6937,0x692D,0x692A,INVALC,0x692C,0x6930, + 0x6933,0x6932,0x6936,0x6929,INVALC,INVALC,0x6931,0x6935, + 0x6938,0x692F,0x6B61,0x6B62,0x6B66,0x6B67,INVALC,0x6B64, + 0x6B65,0x6B63, + /* Range 0x7055 - 0x706A, array index: 0x0FEA */ + 0x6D56,0x6D57,0x6D58,INVALC,INVALC,0x6F34,0x6F33,INVALC, + 0x703D,INVALC,0x703B,0x703E,0x703C,0x7125,INVALC,INVALC, + 0x7171,0x715B,INVALC,0x7170,0x723E,0x723F, + /* Range 0x7082 - 0x7086, array index: 0x1000 */ + 0x2778,0x277A,0x2775,0x2772,0x2774, + /* Range 0x70C5 - 0x70C7, array index: 0x1005 */ + 0x305A,0x305B,0x305C, + /* Range 0x70CD - 0x70D4, array index: 0x1008 */ + 0x3059,0x305E,INVALC,INVALC,0x304F,0x3055,0x304E,0x3058, + /* Range 0x70DA - 0x70E2, array index: 0x1010 */ + 0x305D,INVALC,0x304D,0x3050,0x3056,INVALC,0x3057,0x305F, + 0x3053, + /* Range 0x70F3 - 0x7106, array index: 0x1019 */ + 0x3673,0x366F,INVALC,0x367B,0x366D,0x367A,INVALC,0x366B, + 0x3D5F,0x3675,INVALC,INVALC,0x3676,0x3679,INVALC,0x367D, + INVALC,0x3672,INVALC,0x3677, + /* Range 0x710B - 0x7110, array index: 0x102D */ + 0x367C,0x3670,0x366C,0x367E,INVALC,0x3674, + /* Range 0x711E - 0x7125, array index: 0x1033 */ + 0x3D5D,0x3D66,0x3D5C,INVALC,0x3D64,0x3D62,INVALC,0x3D63, + /* Range 0x712E - 0x7132, array index: 0x103B */ + 0x3D60,0x3D5E,INVALC,0x3D61,0x3D65, + /* Range 0x7141 - 0x7144, array index: 0x1040 */ + 0x4456,0x445D,0x445F,0x4465, + /* Range 0x7150 - 0x7154, array index: 0x1044 */ + 0x4463,INVALC,0x4453,0x4464,0x4452, + /* Range 0x715D - 0x7163, array index: 0x1049 */ + 0x4457,INVALC,0x4462,0x4455,0x445C,0x4458,0x4454, + /* Range 0x7180 - 0x7189, array index: 0x1050 */ + 0x4B63,0x4B69,0x4B65,INVALC,INVALC,0x4B64,0x4B68,0x4B60, + INVALC,0x4B62, + /* Range 0x719A - 0x71AA, array index: 0x105A */ + 0x516F,0x516C,0x5178,0x5172,0x5174,INVALC,0x516E,0x5176, + INVALC,INVALC,0x5175,0x5173,INVALC,0x5179,INVALC,0x5170, + 0x5177, + /* Range 0x71AF - 0x71B5, array index: 0x106B */ + 0x516B,0x516D,INVALC,0x516A,0x517A,INVALC,0x5171, + /* Range 0x71BC - 0x71CB, array index: 0x1072 */ + 0x5841,0x583F,INVALC,0x5835,0x5838,0x5839,0x5834,INVALC, + INVALC,0x5833,0x5842,0x583D,INVALC,INVALC,0x583C,0x583A, + /* Range 0x71F0 - 0x71F2, array index: 0x1082 */ + 0x5D4D,0x5D49,0x5D4B, + /* Range 0x71FF - 0x7207, array index: 0x1085 */ + 0x6228,INVALC,0x6227,0x6576,0x622A,INVALC,0x6577,INVALC, + 0x6575, + /* Range 0x7219 - 0x7229, array index: 0x108E */ + 0x6B6A,0x6B69,INVALC,INVALC,0x6B68,0x6D5A,0x6D5B,INVALC, + INVALC,0x6F35,0x703F,INVALC,INVALC,0x7126,0x722C,INVALC, + 0x7240, + /* Range 0x7249 - 0x724B, array index: 0x109F */ + 0x2B78,0x2B79,0x3D6A, + /* Range 0x7276 - 0x727F, array index: 0x10A2 */ + 0x3063,0x3062,0x3061,INVALC,INVALC,0x3722,0x3723,INVALC, + 0x3721,0x3724, + /* Range 0x7285 - 0x729E, array index: 0x10AC */ + 0x3D6F,0x3D6E,INVALC,0x3D6C,0x3D6D,INVALC,0x3D70,0x446A, + 0x4469,0x446D,INVALC,0x446C,0x446B,INVALC,0x4B6F,INVALC, + 0x4B6E,INVALC,0x4B6D,0x517B,INVALC,0x517C,INVALC,INVALC, + 0x5845,0x5846, + /* Range 0x72A1 - 0x72AA, array index: 0x10C6 */ + 0x657C,INVALC,0x657B,0x657A,0x6578,0x6579,INVALC,0x693B, + 0x6D5C,0x7127, + /* Range 0x72C5 - 0x72CC, array index: 0x10D0 */ + 0x2467,0x2464,INVALC,INVALC,0x2821,0x2B7E,0x277D,0x2826, + /* Range 0x72FA - 0x7301, array index: 0x10D8 */ + 0x3065,0x306A,INVALC,INVALC,0x3067,0x372C,0x3064,0x306B, + /* Range 0x7307 - 0x730C, array index: 0x10E0 */ + 0x3727,0x372B,INVALC,0x372A,0x3D72,0x3D7D, + /* Range 0x7330 - 0x7335, array index: 0x10E6 */ + 0x3D73,0x3D75,0x3D78,0x3D76,INVALC,0x3D7C, + /* Range 0x733A - 0x733C, array index: 0x10EC */ + 0x4471,0x4470,0x446E, + /* Range 0x7349 - 0x734D, array index: 0x10EF */ + 0x4474,0x4473,INVALC,0x4B73,0x4B71, + /* Range 0x7358 - 0x736F, array index: 0x10F4 */ + 0x517D,0x5228,0x5227,0x5225,INVALC,0x5224,0x5221,0x5222, + 0x5223,0x5226,0x5229,INVALC,INVALC,0x584B,0x5848,0x5849, + INVALC,0x5847,0x584D,0x584C,0x584A,INVALC,0x5D50,0x5D51, + /* Range 0x737C - 0x7385, array index: 0x110C */ + 0x693D,0x693C,0x6B6B,0x6D5D,INVALC,0x6F37,0x6F36,0x6F38, + INVALC,0x2C28, + /* Range 0x7392 - 0x7397, array index: 0x1116 */ + 0x246C,0x246A,0x246B,0x2468,INVALC,0x2469, + /* Range 0x73A0 - 0x73A6, array index: 0x111C */ + 0x282D,0x2829,0x282C,INVALC,0x2828,INVALC,0x282B, + /* Range 0x73B4 - 0x73B9, array index: 0x1123 */ + 0x2C30,0x2C2F,0x2C2E,INVALC,0x2C37,0x2C2D, + /* Range 0x73C2 - 0x73CC, array index: 0x1129 */ + 0x2C2A,0x2C35,INVALC,0x2C2C,0x2C36,0x2C33,0x2C2B,INVALC, + INVALC,0x2C38,0x2C29, + /* Range 0x73D2 - 0x73DD, array index: 0x1134 */ + 0x3075,0x306C,0x3077,INVALC,0x306F,0x307A,0x307B,0x306D, + 0x3079,0x3076,0x3074,0x3078, + /* Range 0x73E5 - 0x73EB, array index: 0x1140 */ + 0x306E,INVALC,0x3071,0x307C,0x3073,INVALC,0x2C31, + /* Range 0x73F4 - 0x7401, array index: 0x1147 */ + 0x373D,0x3732,0x3730,INVALC,0x3731,INVALC,0x3738,INVALC, + 0x3739,0x3735,INVALC,0x373A,0x3737,0x3734, + /* Range 0x7420 - 0x7424, array index: 0x1155 */ + 0x3E2D,0x3E26,INVALC,0x3E2A,0x3E29, + /* Range 0x7429 - 0x7432, array index: 0x115A */ + 0x3E2C,INVALC,0x3E23,0x3E21,0x3E27,0x3D7E,INVALC,0x3E22, + 0x3E28,0x3E2E, + /* Range 0x744A - 0x7454, array index: 0x1164 */ + 0x4476,0x4477,INVALC,0x4523,0x447E,0x447C,0x447D,0x4479, + 0x4478,INVALC,0x4524, + /* Range 0x7471 - 0x7475, array index: 0x116F */ + 0x4B76,0x4B78,0x4B75,INVALC,0x4B77, + /* Range 0x7485 - 0x748A, array index: 0x1174 */ + 0x5230,0x522D,0x522A,0x5231,0x522B,0x522C, + /* Range 0x74B1 - 0x74BB, array index: 0x117A */ + 0x5D58,0x5D53,INVALC,INVALC,0x622F,0x6232,0x6621,0x622D, + INVALC,0x693E,0x6233, + /* Range 0x74BE - 0x74C5, array index: 0x1185 */ + 0x6231,INVALC,0x622E,0x6230,0x6234,0x6622,INVALC,0x657E, + /* Range 0x74D5 - 0x74E1, array index: 0x118D */ + 0x6D5F,INVALC,0x6D61,0x6D5E,0x6D60,INVALC,0x7040,INVALC, + 0x2830,0x307D,0x307E,INVALC,0x4525, + /* Range 0x74FB - 0x7503, array index: 0x119A */ + 0x3E2F,INVALC,0x4528,0x4527,0x4526,0x4B7B,INVALC,0x4B7C, + 0x4B7D, + /* Range 0x750F - 0x7517, array index: 0x11A3 */ + 0x5D5E,0x5D5B,0x5D5C,0x5D5D,0x6236,0x6235,INVALC,0x6623, + 0x6B6C, + /* Range 0x753E - 0x7540, array index: 0x11AC */ + 0x2834,0x2832,0x2833, + /* Range 0x75BF - 0x75C1, array index: 0x11AF */ + 0x312B,0x312A,0x3127, + /* Range 0x75CB - 0x75D2, array index: 0x11B2 */ + 0x3744,0x3745,INVALC,0x3741,0x3743,0x3747,0x3746,0x3742, + /* Range 0x75F5 - 0x75FE, array index: 0x11BA */ + 0x4539,0x4537,0x4530,0x4534,0x4533,INVALC,0x4536,0x4532, + 0x453A,0x4531, + /* Range 0x760F - 0x761E, array index: 0x11C4 */ + 0x452E,0x4535,0x4C26,INVALC,INVALC,0x4C28,0x4C25,0x4C22, + INVALC,INVALC,0x5239,0x523D,0x523F,0x523B,0x523A,0x5238, + /* Range 0x762D - 0x7635, array index: 0x11D4 */ + 0x5858,INVALC,0x5857,0x585F,0x5859,0x585E,0x585B,INVALC, + 0x585D, + /* Range 0x7647 - 0x7649, array index: 0x11DD */ + 0x5D63,0x5D61,0x5D62, + /* Range 0x7699 - 0x769E, array index: 0x11E0 */ + 0x453B,INVALC,0x5243,0x5240,0x5241,0x5242, + /* Range 0x7703 - 0x7705, array index: 0x11E6 */ + 0x2C43,0x2C44,0x2C45, + /* Range 0x7710 - 0x771D, array index: 0x11E9 */ + 0x3132,0x3136,0x3134,0x3133,INVALC,0x3137,INVALC,INVALC, + INVALC,0x3138,0x3139,0x3131,INVALC,0x3130, + /* Range 0x772F - 0x7735, array index: 0x11F7 */ + 0x374C,INVALC,0x374E,0x374F,0x3751,0x3750,0x3755, + /* Range 0x7744 - 0x774E, array index: 0x11FE */ + 0x3E40,0x3E42,0x3E3E,0x3E3F,INVALC,INVALC,0x3E43,0x3E45, + 0x3E46,0x3E41,0x3E44, + /* Range 0x7752 - 0x775A, array index: 0x1209 */ + 0x4541,INVALC,0x4546,0x453E,0x4542,INVALC,INVALC,0x4547, + 0x4543, + /* Range 0x776D - 0x776F, array index: 0x1212 */ + 0x4548,0x4C2E,0x4C30, + /* Range 0x777E - 0x7789, array index: 0x1215 */ + 0x4C31,INVALC,0x4C2F,0x4C2A,0x4C2D,0x4C32,INVALC,0x4C2C, + INVALC,INVALC,0x5247,0x5246, + /* Range 0x7797 - 0x77A3, array index: 0x1221 */ + 0x586B,INVALC,0x586A,0x5862,0x5866,0x5865,0x5863,INVALC, + INVALC,INVALC,0x5864,0x5867,0x5868, + /* Range 0x77B1 - 0x77B7, array index: 0x122E */ + 0x5D6C,0x5D68,INVALC,0x5D6B,0x5D66,0x5D6A,0x5D69, + /* Range 0x77C9 - 0x77D0, array index: 0x1235 */ + 0x6625,0x6626,INVALC,0x6943,0x6946,0x6944,0x6945,0x6B6E, + /* Range 0x77F0 - 0x77F2, array index: 0x123D */ + 0x5D6E,0x6628,0x6947, + /* Range 0x77F7 - 0x77FC, array index: 0x1240 */ + 0x2841,0x283C,0x283E,0x2840,0x283F,0x283D, + /* Range 0x780E - 0x7813, array index: 0x1246 */ + 0x2C52,0x2C51,0x2C50,0x2C4D,0x2C4E,0x2C55, + /* Range 0x7821 - 0x7823, array index: 0x124C */ + 0x3144,0x313E,0x313C, + /* Range 0x7826 - 0x7835, array index: 0x124F */ + 0x375C,INVALC,0x3141,0x3145,0x3147,0x3143,0x313D,INVALC, + 0x3142,0x3140,INVALC,0x3148,INVALC,0x3146,INVALC,0x313F, + /* Range 0x7848 - 0x784D, array index: 0x125F */ + 0x3756,0x3758,0x375A,INVALC,0x375B,0x3759, + /* Range 0x7864 - 0x7871, array index: 0x1265 */ + 0x3E4A,0x3E4B,INVALC,INVALC,0x3E53,0x3E52,0x3E4F,INVALC, + INVALC,0x3E4D,0x3E50,INVALC,0x3E51,0x3E4E, + /* Range 0x7883 - 0x7887, array index: 0x1273 */ + 0x4553,0x454E,0x4550,0x4551,0x454A, + /* Range 0x7894 - 0x789A, array index: 0x1278 */ + 0x454C,0x454F,0x4557,INVALC,INVALC,0x4555,0x454B, + /* Range 0x789E - 0x78A5, array index: 0x127F */ + 0x4C3A,INVALC,0x4C3C,0x4552,0x4C3E,INVALC,0x4C3F,0x4C3B, + /* Range 0x78A8 - 0x78AD, array index: 0x1287 */ + 0x4C37,INVALC,0x4C34,0x4C39,0x4C3D,0x4C36, + /* Range 0x78C8 - 0x78D1, array index: 0x128D */ + 0x524F,0x5252,INVALC,INVALC,0x524B,0x5248,0x524D,0x524A, + INVALC,0x524C, + /* Range 0x78DB - 0x78E5, array index: 0x1297 */ + 0x5872,INVALC,0x586C,0x5870,0x5876,0x5877,0x5873,0x5874, + 0x5871,INVALC,0x586E, + /* Range 0x78F9 - 0x78FF, array index: 0x12A2 */ + 0x5D77,INVALC,0x5D72,0x5D73,0x5D70,0x5D78,0x5D74, + /* Range 0x7910 - 0x7914, array index: 0x12A9 */ + 0x6247,0x6249,0x6248,0x6244,0x6245, + /* Range 0x791B - 0x791E, array index: 0x12AE */ + 0x662A,0x662C,0x6629,0x662E, + /* Range 0x7921 - 0x7929, array index: 0x12B2 */ + 0x662B,INVALC,0x6949,0x694C,0x6948,INVALC,0x694A,0x694B, + 0x694D, + /* Range 0x794A - 0x794C, array index: 0x12BB */ + 0x2C56,0x2C58,0x2C57, + /* Range 0x794F - 0x7954, array index: 0x12BE */ + 0x314B,INVALC,0x314F,0x314E,0x314D,0x3149, + /* Range 0x7967 - 0x796B, array index: 0x12C4 */ + 0x3760,INVALC,0x3761,0x3762,0x3764, + /* Range 0x7970 - 0x7974, array index: 0x12C9 */ + 0x3E59,INVALC,0x3E58,0x3E57,0x3E56, + /* Range 0x7990 - 0x79A4, array index: 0x12CE */ + 0x4C4A,INVALC,0x4C49,0x4C46,0x4C45,0x4C44,0x4C43,0x4C47, + 0x4C40,INVALC,0x5253,0x5258,0x5256,INVALC,INVALC,INVALC, + 0x5255,0x5254,0x5257,INVALC,0x5878, + /* Range 0x79AB - 0x79AD, array index: 0x12E3 */ + 0x5D7A,0x624B,0x624A, + /* Range 0x79B4 - 0x79B8, array index: 0x12E6 */ + 0x6D65,INVALC,0x7045,0x7044,0x2167, + /* Range 0x79CD - 0x79CF, array index: 0x12EB */ + 0x2C5C,0x2C5F,0x2C5D, + /* Range 0x79DC - 0x79E0, array index: 0x12EE */ + 0x3156,0x3158,0x3157,INVALC,0x3152, + /* Range 0x79EA - 0x79EE, array index: 0x12F3 */ + 0x3155,0x3150,0x3151,0x3154,0x3153, + /* Range 0x79F6 - 0x79FA, array index: 0x12F8 */ + 0x3769,0x376A,0x3768,INVALC,0x3767, + /* Range 0x7A02 - 0x7A04, array index: 0x12FD */ + 0x3E5A,0x3E5C,0x3E5E, + /* Range 0x7A10 - 0x7A1B, array index: 0x1300 */ + 0x4566,0x455D,0x4560,0x4564,INVALC,0x4562,INVALC,0x4561, + 0x455E,0x455F,INVALC,0x4565, + /* Range 0x7A58 - 0x7A5C, array index: 0x130C */ + 0x5E21,INVALC,0x5E23,0x5D7D,0x5D7C, + /* Range 0x7A6C - 0x7A71, array index: 0x1311 */ + 0x6950,0x6951,0x694F,INVALC,0x6D66,0x6D67, + /* Range 0x7A85 - 0x7A90, array index: 0x1317 */ + 0x315B,0x3159,0x315F,INVALC,0x315A,0x315E,0x315C,0x315D, + INVALC,INVALC,0x376B,0x376D, + /* Range 0x7AB1 - 0x7AB8, array index: 0x1323 */ + 0x5921,0x525B,0x525D,0x525C,0x587E,0x587C,0x5922,0x587D, + /* Range 0x7B04 - 0x7B13, array index: 0x132B */ + 0x3162,0x3164,INVALC,INVALC,0x3166,0x3169,0x3167,INVALC, + INVALC,INVALC,0x3168,0x3165,0x3161,INVALC,0x316A,0x3163, + /* Range 0x7B22 - 0x7B25, array index: 0x133B */ + 0x3773,0x3822,0x3774,0x3771, + /* Range 0x7B2D - 0x7B35, array index: 0x133F */ + 0x377B,INVALC,0x377C,0x3772,0x3779,0x377D,0x3775,0x3770, + 0x376E, + /* Range 0x7B44 - 0x7B4E, array index: 0x1348 */ + 0x3E64,0x3E6A,INVALC,0x3E63,0x3E65,INVALC,0x3E62,INVALC, + 0x3E66,INVALC,0x3E67, + /* Range 0x7B61 - 0x7B66, array index: 0x1353 */ + 0x4575,INVALC,0x4578,0x456C,0x4571,0x456B, + /* Range 0x7B70 - 0x7B78, array index: 0x1359 */ + 0x4574,0x4573,0x4570,0x4572,0x456E,INVALC,0x4577,INVALC, + 0x4576, + /* Range 0x7B8A - 0x7B91, array index: 0x1362 */ + 0x4C57,INVALC,0x4C5C,0x4C5B,0x4C5E,INVALC,0x4C59,0x4C58, + /* Range 0x7B98 - 0x7B9C, array index: 0x136A */ + 0x4C60,0x4C62,INVALC,0x4C5D,0x4C56, + /* Range 0x7BDA - 0x7BEB, array index: 0x136F */ + 0x5929,INVALC,0x592F,0x5926,0x5923,0x5932,INVALC,INVALC, + 0x592E,0x5924,INVALC,0x5928,INVALC,0x5925,0x592A,INVALC, + 0x592D,0x5930, + /* Range 0x7BF0 - 0x7BF4, array index: 0x1381 */ + 0x5E38,0x5E39,0x5E29,0x5E30,0x5E2E, + /* Range 0x7BFD - 0x7C10, array index: 0x1386 */ + 0x5E36,INVALC,0x5E2B,0x5E2A,0x5E34,0x5E31,0x5E33,INVALC, + 0x5E27,0x5E37,INVALC,INVALC,0x5E32,0x5E3B,0x5E2F,INVALC, + INVALC,0x5E2D,0x5E28,0x5E3A, + /* Range 0x7C1C - 0x7C2D, array index: 0x139A */ + 0x624D,0x6253,INVALC,0x6251,0x6250,INVALC,0x6256,INVALC, + INVALC,0x6257,0x6254,INVALC,0x6255,0x624E,INVALC,INVALC, + 0x6635,0x6252, + /* Range 0x7C45 - 0x7C4A, array index: 0x13AC */ + 0x6957,INVALC,0x6956,0x6954,0x6953,0x6955, + /* Range 0x7C57 - 0x7C5C, array index: 0x13B2 */ + 0x6D68,INVALC,0x6D6A,0x6D6C,0x6D6B,0x6D69, + /* Range 0x7C66 - 0x7C6B, array index: 0x13B8 */ + 0x6F3C,0x6F3B,INVALC,0x712B,0x7046,0x712C, + /* Range 0x7C78 - 0x7C7A, array index: 0x13BE */ + 0x2C66,0x2C67,0x2C65, + /* Range 0x7C7F - 0x7C85, array index: 0x13C1 */ + 0x2C68,0x2C69,0x2C6A,INVALC,INVALC,0x316B,0x3171, + /* Range 0x7CA1 - 0x7CA3, array index: 0x13C8 */ + 0x3E6E,0x3E6B,0x3826, + /* Range 0x7CBA - 0x7CBC, array index: 0x13CB */ + 0x4C68,0x4C65,0x4C67, + /* Range 0x7CD0 - 0x7CD4, array index: 0x13CE */ + 0x5936,0x5937,0x5933,INVALC,0x5934, + /* Range 0x7D0E - 0x7D13, array index: 0x13D3 */ + 0x3175,0x317B,INVALC,0x3174,0x317A,0x3178, + /* Range 0x7D1D - 0x7D1F, array index: 0x13D9 */ + 0x3173,0x3172,0x3179, + /* Range 0x7D3A - 0x7D41, array index: 0x13DC */ + 0x382B,0x3834,INVALC,0x3828,0x3831,0x3832,INVALC,0x382F, + /* Range 0x7D4E - 0x7D58, array index: 0x13E4 */ + 0x3F21,0x3E76,INVALC,0x3E7D,0x3E7A,0x3E72,0x3E7B,INVALC, + 0x3E73,INVALC,0x3E6F, + /* Range 0x7D67 - 0x7D6F, array index: 0x13EF */ + 0x3E74,INVALC,0x3E7C,0x3E75,0x3E79,INVALC,0x3E77,INVALC, + 0x3E70, + /* Range 0x7D7A - 0x7D8E, array index: 0x13F8 */ + 0x4624,0x4626,0x4628,0x462C,INVALC,0x4622,0x457E,INVALC, + INVALC,0x4627,0x462B,0x4623,0x457D,INVALC,0x457C,INVALC, + INVALC,INVALC,0x4629,0x4621,0x4625, + /* Range 0x7DA6 - 0x7DAA, array index: 0x140D */ + 0x4C7C,0x4C69,INVALC,0x4C7E,0x4C6D, + /* Range 0x7DC0 - 0x7DC6, array index: 0x1412 */ + 0x4C6F,0x4C6E,0x4C6B,INVALC,0x4C73,0x4C70,0x4C74, + /* Range 0x7E0B - 0x7E17, array index: 0x1419 */ + 0x5944,0x593B,0x5947,0x593F,0x5945,INVALC,INVALC,0x5938, + 0x593E,0x5948,0x5941,0x5946,0x593A, + /* Range 0x7E1F - 0x7E25, array index: 0x1426 */ + 0x593C,0x593D,0x5939,0x5943,INVALC,0x594A,0x5949, + /* Range 0x7E38 - 0x7E3C, array index: 0x142D */ + 0x5E42,INVALC,0x5E4D,0x5E4A,0x5E3E, + /* Range 0x7E56 - 0x7E58, array index: 0x1432 */ + 0x625B,0x6262,0x625D, + /* Range 0x7E5F - 0x7E63, array index: 0x1435 */ + 0x625F,0x6261,INVALC,0x625E,0x625C, + /* Range 0x7E72 - 0x7E7B, array index: 0x143A */ + 0x6640,INVALC,0x6641,0x663A,0x6639,0x663D,0x663B,INVALC, + 0x663F,0x6959, + /* Range 0x7E86 - 0x7E8D, array index: 0x1444 */ + 0x6B79,0x6B76,0x6B77,INVALC,0x6B75,0x6B78,INVALC,0x6B7A, + /* Range 0x7E95 - 0x7E9B, array index: 0x144C */ + 0x6F3D,INVALC,0x7047,0x712F,0x7131,0x712E,0x7130, + /* Range 0x7F5B - 0x7F6D, array index: 0x1453 */ + 0x3224,0x317D,0x3223,0x3221,INVALC,0x3222,0x317E,INVALC, + 0x3836,INVALC,0x3F24,0x3F25,0x4630,0x4631,INVALC,INVALC, + 0x462F,0x4632,0x462E, + /* Range 0x7F7A - 0x7F7F, array index: 0x1466 */ + 0x594E,0x594C,0x594D,0x5E51,0x5E50,0x5E4F, + /* Range 0x7F9B - 0x7FA7, array index: 0x146C */ + 0x383A,0x3838,0x3839,INVALC,INVALC,0x3F27,0x3F28,0x3F26, + INVALC,INVALC,0x4634,0x4633,0x4635, + /* Range 0x7FC7 - 0x7FD1, array index: 0x1479 */ + 0x3840,INVALC,0x3842,0x383B,0x383C,INVALC,0x383D,INVALC, + 0x3841,0x383E,0x383F, + /* Range 0x7FE2 - 0x7FEF, array index: 0x1484 */ + 0x4D24,0x4D25,INVALC,0x4D26,0x5323,INVALC,0x5324,INVALC, + 0x5321,0x527E,0x5322,0x527D,INVALC,0x5950, + /* Range 0x7FF4 - 0x7FF8, array index: 0x1492 */ + 0x5E52,0x6134,INVALC,0x6266,0x6267, + /* Range 0x7FFD - 0x7FFF, array index: 0x1497 */ + 0x6648,0x6649,0x695E, + /* Range 0x804F - 0x8051, array index: 0x149A */ + 0x3F2B,0x3F2C,0x3F2A, + /* Range 0x80C5 - 0x80CA, array index: 0x149D */ + 0x2C7E,INVALC,0x2C78,0x2C7B,0x2D26,0x2D24, + /* Range 0x80CD - 0x80D9, array index: 0x14A3 */ + 0x2D2A,INVALC,0x2D27,0x2C7D,0x2C7A,INVALC,INVALC,0x3F2E, + 0x2D25,INVALC,0x2D28,0x2C77,0x2D22, + /* Range 0x80F9 - 0x80FB, array index: 0x14B0 */ + 0x322F,0x322D,0x3232, + /* Range 0x811B - 0x8122, array index: 0x14B3 */ + 0x384C,INVALC,0x3854,0x3850,0x384E,INVALC,0x3851,0x3855, + /* Range 0x815E - 0x8164, array index: 0x14BB */ + 0x4642,INVALC,0x463A,0x4647,0x463F,INVALC,0x4639, + /* Range 0x8189 - 0x818D, array index: 0x14C2 */ + 0x4D2B,INVALC,0x4D31,0x4D30,0x4D2F, + /* Range 0x81AE - 0x81BC, array index: 0x14C7 */ + 0x5956,INVALC,0x595A,0x5954,0x595D,INVALC,0x595C,0x5958, + INVALC,0x595E,INVALC,0x5957,INVALC,0x5E55,0x5E5B, + /* Range 0x81D0 - 0x81D2, array index: 0x14D6 */ + 0x626B,0x6269,0x626A, + /* Range 0x81DD - 0x81E1, array index: 0x14D9 */ + 0x6B7E,0x6D72,INVALC,0x7132,0x7133, + /* Range 0x81F7 - 0x81F9, array index: 0x14DE */ + 0x3F39,0x3F3A,0x3F3B, + /* Range 0x8232 - 0x8234, array index: 0x14E1 */ + 0x385B,0x3858,0x385A, + /* Range 0x823C - 0x8245, array index: 0x14E4 */ + 0x3F3D,0x3F3E,INVALC,0x3F3F,0x464B,INVALC,0x464C,INVALC, + 0x464A,0x464D, + /* Range 0x824E - 0x8264, array index: 0x14EE */ + 0x5333,0x532F,0x5332,0x5334,0x5331,0x5330,INVALC,0x5961, + 0x5962,0x5963,INVALC,INVALC,0x5E5E,0x5E5D,0x5E5F,INVALC, + 0x626D,0x626C,INVALC,0x664F,INVALC,0x6650,0x664E, + /* Range 0x8268 - 0x826D, array index: 0x1505 */ + 0x6962,0x6963,INVALC,0x6D73,0x6F3E,0x7049, + /* Range 0x827C - 0x8285, array index: 0x150B */ + 0x226B,0x226D,INVALC,0x226E,0x226C,INVALC,INVALC,0x2522, + 0x2523,0x247B, + /* Range 0x828E - 0x8294, array index: 0x1515 */ + 0x247C,0x247A,0x2479,0x247D,INVALC,0x247E,0x2D2D, + /* Range 0x829E - 0x82AB, array index: 0x151C */ + 0x285C,INVALC,0x2852,0x2860,0x2866,INVALC,0x2863,INVALC, + INVALC,0x2859,0x285F,0x2861,INVALC,0x2854, + /* Range 0x82B4 - 0x82B6, array index: 0x152A */ + 0x285E,0x2858,0x2865, + /* Range 0x82E8 - 0x82ED, array index: 0x152D */ + 0x2D32,INVALC,0x2D41,0x2D36,0x2D39,0x2D46, + /* Range 0x82F0 - 0x82FB, array index: 0x1533 */ + 0x2D40,INVALC,0x2D3B,0x2D45,0x2D38,0x2D3C,0x2D3F,INVALC, + INVALC,0x2D30,0x2D44,0x2D3E, + /* Range 0x8322 - 0x832F, array index: 0x153F */ + 0x3242,INVALC,0x324B,0x323C,0x3240,0x3257,INVALC,0x324F, + 0x3246,INVALC,0x3255,0x3238,INVALC,0x324E, + /* Range 0x833A - 0x833C, array index: 0x154D */ + 0x2D35,0x3F41,0x3248, + /* Range 0x8341 - 0x834E, array index: 0x1550 */ + 0x323F,0x3243,INVALC,0x3239,0x3251,INVALC,0x3250,0x3258, + INVALC,INVALC,0x3256,0x3252,0x3249,0x3244, + /* Range 0x8373 - 0x8376, array index: 0x155E */ + 0x3862,0x3864,0x3869,0x387D, + /* Range 0x837D - 0x8383, array index: 0x1562 */ + 0x386C,0x3873,0x3879,INVALC,0x3866,INVALC,0x386D, + /* Range 0x8387 - 0x8390, array index: 0x1569 */ + 0x387B,0x3876,INVALC,INVALC,0x3872,0x386E,0x3860,INVALC, + 0x3865,0x385D, + /* Range 0x8397 - 0x839D, array index: 0x1573 */ + 0x3877,INVALC,0x3868,0x3F6A,0x3870,INVALC,0x386F, + /* Range 0x83A3 - 0x83B0, array index: 0x157A */ + 0x385E,0x3863,0x3874,0x387A,INVALC,0x385F,0x386B,0x3871, + INVALC,INVALC,INVALC,0x387C,0x3875,0x3878, + /* Range 0x83BF - 0x83EE, array index: 0x1588 */ + 0x3F51,0x3F45,INVALC,0x3F62,0x3F6B,0x3F6E,INVALC,0x3F4D, + 0x3F66,0x3F4E,0x3F5C,INVALC,0x3F58,INVALC,INVALC,0x3F59, + 0x3F42,INVALC,0x3F67,INVALC,INVALC,INVALC,0x3F64,0x3F5A, + 0x3F70,0x3F55,0x466D,INVALC,0x3F73,INVALC,0x3F53,0x3F5F, + INVALC,INVALC,0x3F57,0x3F71,0x3F50,0x3F49,0x3F54,INVALC, + 0x3F48,0x3F46,INVALC,0x3F68,0x3F4F,0x3F6C,INVALC,0x3F6D, + /* Range 0x83F5 - 0x8401, array index: 0x15B8 */ + 0x3F5B,0x3F4B,INVALC,INVALC,0x3F43,0x3F65,0x3F6F,0x3F4A, + INVALC,0x3F74,0x3F56,INVALC,0x3F52, + /* Range 0x840F - 0x8413, array index: 0x15C5 */ + 0x3F5E,0x3F4C,0x3F60,0x3F47,0x3F69, + /* Range 0x842F - 0x843B, array index: 0x15CA */ + 0x466F,0x465A,INVALC,0x466A,0x467E,0x4666,INVALC,0x467D, + 0x4664,INVALC,0x4674,0x4665,0x467B, + /* Range 0x843F - 0x8460, array index: 0x15D7 */ + 0x464F,0x4657,INVALC,0x4670,0x4668,0x4723,0x466B,INVALC, + 0x467C,INVALC,INVALC,INVALC,0x466E,0x4676,0x465B,0x4675, + INVALC,0x4728,0x4656,0x4677,INVALC,0x4726,INVALC,0x4650, + INVALC,INVALC,0x465E,0x465D,INVALC,INVALC,0x4661,0x4663, + 0x4672,0x4725, + /* Range 0x846E - 0x847E, array index: 0x15F9 */ + 0x4727,0x4678,0x4673,INVALC,INVALC,0x4660,0x465F,INVALC, + 0x4651,INVALC,0x4669,0x4652,0x4667,INVALC,INVALC,0x465C, + 0x4722, + /* Range 0x848D - 0x8491, array index: 0x160A */ + 0x4654,0x467A,0x4653,INVALC,0x4D5A, + /* Range 0x8497 - 0x84B1, array index: 0x160F */ + 0x4D33,0x4D51,INVALC,0x4D42,0x4D4C,INVALC,0x4D45,INVALC, + 0x4D36,0x4D54,0x4D35,0x4D48,INVALC,0x4D34,INVALC,INVALC, + 0x4D46,0x4D4F,0x4D4D,0x4D41,0x4D3C,0x4D3A,INVALC,0x4D3B, + 0x4D4E,0x4D59,0x4D43, + /* Range 0x84B9 - 0x84BB, array index: 0x162A */ + 0x4D3D,0x4D37,0x4D47, + /* Range 0x84CC - 0x84D7, array index: 0x162D */ + 0x4D4B,0x4D40,0x4D38,0x4D53,0x4D44,INVALC,0x4D57,INVALC, + 0x4D56,INVALC,0x4D50,0x4D55, + /* Range 0x84E7 - 0x8502, array index: 0x1639 */ + 0x535C,0x535D,0x5350,0x534F,0x534B,INVALC,INVALC,INVALC, + 0x535F,0x535E,0x464E,0x5348,0x534C,0x5346,INVALC,0x5359, + 0x534A,INVALC,0x5360,0x5343,0x5341,0x534D,0x5357,0x5352, + INVALC,0x5338,INVALC,0x5356, + /* Range 0x8507 - 0x850F, array index: 0x1655 */ + 0x4662,0x5344,0x533B,0x533E,0x5364,0x5345,0x533C,0x533A, + 0x5337, + /* Range 0x8515 - 0x8520, array index: 0x165E */ + 0x5349,0x5351,INVALC,0x5361,0x5365,INVALC,INVALC,0x5340, + 0x5354,0x5358,0x533D,0x5362, + /* Range 0x8524 - 0x8531, array index: 0x166A */ + 0x5335,INVALC,0x535B,0x533F,0x5353,0x5339,0x5347,0x5342, + INVALC,INVALC,0x5355,0x5366,0x5363,0x535A, + /* Range 0x8540 - 0x8547, array index: 0x1678 */ + 0x596B,0x596E,INVALC,INVALC,0x5970,0x5965,0x596C,0x5972, + /* Range 0x8551 - 0x8558, array index: 0x1680 */ + 0x5971,INVALC,0x5968,0x5A22,0x597A,0x5964,0x5E72,0x596A, + /* Range 0x8560 - 0x8567, array index: 0x1688 */ + 0x597C,0x5969,0x596F,0x5973,0x596D,0x5A23,0x597E,0x597B, + /* Range 0x8575 - 0x8590, array index: 0x1690 */ + 0x5979,0x5F21,0x5E6C,0x5E71,0x5E7E,0x5E70,0x5E68,0x5E6D, + INVALC,INVALC,INVALC,0x5E61,0x5E79,0x5E7B,0x5E60,INVALC, + 0x5E7D,0x5E75,INVALC,0x5E7C,0x5E6E,INVALC,0x5E66,0x597D, + 0x5E76,0x5E73,0x5E62,0x5F23, + /* Range 0x8595 - 0x85A4, array index: 0x16AC */ + 0x5E64,0x5E74,INVALC,0x5F22,0x5E77,0x5E6A,INVALC,INVALC, + 0x5E78,0x5E6B,0x5F24,0x5E65,0x5E6F,0x5E7A,0x5E67,0x5E69, + /* Range 0x85B1 - 0x85B8, array index: 0x16BC */ + 0x627D,INVALC,0x6273,0x626E,0x6274,0x627E,0x6324,0x6323, + /* Range 0x85BD - 0x85C8, array index: 0x16C4 */ + 0x6275,0x6325,0x6278,0x6270,INVALC,0x6272,0x6271,0x6277, + 0x627C,0x626F,0x6276,0x627B, + /* Range 0x85D7 - 0x85E3, array index: 0x16D0 */ + 0x6658,0x665C,0x6654,0x6657,INVALC,0x665F,INVALC,0x6664, + 0x665D,INVALC,0x6655,0x6665,0x665E, + /* Range 0x85EB - 0x85F2, array index: 0x16DD */ + 0x6651,0x6659,0x6653,INVALC,0x6663,0x6661,0x6652,0x665A, + /* Range 0x85FD - 0x8605, array index: 0x16E5 */ + 0x696F,0x6967,0x6965,0x6969,0x6966,INVALC,INVALC,0x696B, + 0x696D, + /* Range 0x8618 - 0x8640, array index: 0x16EE */ + 0x6C21,0x6C27,INVALC,0x6968,0x6C26,INVALC,0x6C2D,0x6C24, + 0x6C2B,0x6C2A,0x6964,0x6C25,0x6322,0x6C2E,0x6C23,0x6C28, + INVALC,0x6C2C,0x6C22,INVALC,0x6D77,INVALC,0x6C29,INVALC, + INVALC,0x6F43,0x6D78,0x6D76,0x6D74,0x6D75,0x6D79,INVALC, + INVALC,0x6F41,0x6F3F,0x6F44,0x6F42,INVALC,0x6F45,INVALC, + 0x6F40, + /* Range 0x8646 - 0x864D, array index: 0x1717 */ + 0x7134,0x7135,0x7136,INVALC,INVALC,0x7235,0x722D,0x226F, + /* Range 0x8661 - 0x8674, array index: 0x171F */ + 0x4D5B,0x5367,0x5A25,0x5A27,0x5A26,INVALC,INVALC,0x5F25, + 0x6326,0x7173,INVALC,INVALC,0x2869,0x286A,0x2868,0x2867, + INVALC,INVALC,0x2D4A,0x2D48, + /* Range 0x8685 - 0x8687, array index: 0x1733 */ + 0x3266,0x3263,0x3261, + /* Range 0x868D - 0x86A2, array index: 0x1736 */ + 0x325E,0x326D,INVALC,0x326F,0x325F,INVALC,INVALC,0x3270, + 0x326B,0x325D,0x3262,0x326C,0x3268,0x3265,INVALC,INVALC, + 0x326E,0x3260,INVALC,INVALC,0x3269,0x325B, + /* Range 0x86B3 - 0x86C5, array index: 0x174C */ + 0x392B,0x392E,INVALC,INVALC,0x3923,0x392C,0x392A,0x3927, + 0x392F,0x3930,0x3932,0x3933,0x3922,INVALC,0x3925,0x3924, + 0x3931,INVALC,0x3926, + /* Range 0x86D6 - 0x86DD, array index: 0x175F */ + 0x472E,0x4023,0x3F75,INVALC,0x3F7A,INVALC,0x3F7E,0x3F7C, + /* Range 0x86E6 - 0x86EC, array index: 0x1767 */ + 0x3F77,INVALC,0x4024,0x4022,0x3F7B,0x3F7D,0x4021, + /* Range 0x86F5 - 0x86FA, array index: 0x176E */ + 0x472F,0x4735,0x472B,0x4731,INVALC,0x472D, + /* Range 0x8709 - 0x8712, array index: 0x1774 */ + 0x4733,INVALC,0x4729,0x472C,0x4736,0x4732,INVALC,INVALC, + 0x4D7B,0x4D70, + /* Range 0x8719 - 0x871B, array index: 0x177E */ + 0x4D64,0x4D79,0x4D65, + /* Range 0x8720 - 0x8735, array index: 0x1781 */ + 0x4D6B,0x4D63,INVALC,0x4D5D,0x4D78,INVALC,0x4D75,0x4D76, + 0x4D5E,INVALC,0x4D6D,INVALC,0x4D67,0x4D6E,0x4D61,INVALC, + 0x4D7A,0x4D72,0x4D6C,0x4D5C,INVALC,0x4D73, + /* Range 0x873E - 0x8743, array index: 0x1797 */ + 0x4D69,INVALC,0x4D60,0x4D68,0x4D74,0x4D66, + /* Range 0x874D - 0x876F, array index: 0x179D */ + 0x4730,0x5379,0x5424,0x5378,0x5374,0x5371,INVALC,0x536F, + INVALC,0x5368,INVALC,0x536E,INVALC,0x5373,0x5370,0x5422, + 0x537B,0x5375,0x537A,INVALC,0x5372,0x5427,0x5369,0x536A, + 0x5423,INVALC,0x5428,INVALC,0x5429,0x5377,0x4D5F,0x537D, + 0x5376,0x5421,0x537C, + /* Range 0x8777 - 0x877B, array index: 0x17C0 */ + 0x536B,INVALC,0x5A32,0x537E,0x5425, + /* Range 0x8784 - 0x8789, array index: 0x17C5 */ + 0x5A39,0x5A35,INVALC,0x5A33,0x5A2E,0x5A3D, + /* Range 0x878F - 0x879D, array index: 0x17CB */ + 0x5A2A,0x5A36,0x5A37,0x5A2D,0x5A2C,0x5A3A,INVALC,0x5A30, + 0x5A2B,0x5A31,INVALC,0x5A3C,0x5A29,0x5A3B,0x5A38, + /* Range 0x87AA - 0x87C5, array index: 0x17DA */ + 0x5F27,INVALC,0x5F2B,0x5F28,0x5F2F,0x5F35,0x5F2A,INVALC, + 0x5F3E,INVALC,0x5F38,0x5F2D,0x5F39,0x5F34,0x5F3B,0x5F2C, + INVALC,INVALC,0x5F2E,0x5F3C,0x5F26,0x5F3A,INVALC,INVALC, + 0x5F32,0x5F31,0x5F36,0x5F29, + /* Range 0x87D3 - 0x87ED, array index: 0x17F6 */ + 0x6333,0x6331,INVALC,INVALC,0x6337,0x6335,0x6338,INVALC, + 0x632A,0x6332,0x633C,0x5F3D,0x632E,INVALC,0x536C,0x6329, + 0x6336,0x6330,0x632D,0x6328,0x6327,0x633B,INVALC,0x632C, + 0x632B,INVALC,0x6334, + /* Range 0x87F3 - 0x87F7, array index: 0x1811 */ + 0x632F,0x633A,INVALC,0x6669,0x666A, + /* Range 0x87FF - 0x8803, array index: 0x1816 */ + 0x6671,0x6666,0x6339,0x6673,0x6668, + /* Range 0x8806 - 0x880C, array index: 0x181B */ + 0x666E,INVALC,0x6670,0x666B,0x6672,0x666D,0x666C, + /* Range 0x8819 - 0x881D, array index: 0x1822 */ + 0x6970,INVALC,0x6C31,0x6C34,0x6C30, + /* Range 0x8824 - 0x8844, array index: 0x1827 */ + 0x6C33,0x6D7E,0x6D7C,INVALC,0x6D7B,0x6C2F,0x6D7D,0x6C35, + 0x6D7A,INVALC,0x6F48,0x6F26,0x6F46,INVALC,0x6F47,0x6F49, + INVALC,0x704D,INVALC,0x704C,0x704B,INVALC,INVALC,INVALC, + 0x715D,0x7175,0x7174,0x7176,INVALC,0x2D4B,INVALC,0x3271, + 0x3272, + /* Range 0x8871 - 0x8876, array index: 0x1848 */ + 0x3278,0x3276,INVALC,0x327D,0x3274,0x3275, + /* Range 0x887C - 0x8880, array index: 0x184E */ + 0x327E,INVALC,0x327C,0x3279,0x3277, + /* Range 0x8895 - 0x889B, array index: 0x1853 */ + 0x3936,INVALC,0x3942,0x393E,0x3940,0x393A,0x3941, + /* Range 0x88B6 - 0x88C0, array index: 0x185A */ + 0x402F,0x4031,0x402C,0x402B,0x4029,INVALC,0x4030,0x4032, + 0x402E,INVALC,0x402D, + /* Range 0x88C9 - 0x88D0, array index: 0x1865 */ + 0x4035,INVALC,0x4739,0x473F,0x473A,0x473B,INVALC,0x4740, + /* Range 0x88EE - 0x88F2, array index: 0x186D */ + 0x4E24,INVALC,0x4E28,0x4D7E,0x4E21, + /* Range 0x88F6 - 0x88FE, array index: 0x1872 */ + 0x4E26,0x4D7C,INVALC,INVALC,0x4E22,0x4E27,0x4E25,INVALC, + 0x4E23, + /* Range 0x8914 - 0x8919, array index: 0x187B */ + 0x542D,INVALC,0x5433,0x542F,0x5430,0x5431, + /* Range 0x892C - 0x8937, array index: 0x1881 */ + 0x5A49,0x5A41,0x5A42,0x5A48,0x5A40,0x5A44,INVALC,0x5F40, + INVALC,0x5F3F,INVALC,0x5F45, + /* Range 0x894B - 0x8963, array index: 0x188D */ + 0x633E,0x6340,INVALC,INVALC,0x633F,0x6342,0x6343,0x5F44, + 0x633D,INVALC,INVALC,INVALC,0x6677,0x667A,0x667C,0x6675, + 0x6676,0x6679,0x667B,INVALC,INVALC,INVALC,0x6678,0x6674, + 0x6976, + /* Range 0x8979 - 0x897E, array index: 0x18A6 */ + 0x7137,0x7138,0x713A,0x7139,INVALC,0x2270, + /* Range 0x899B - 0x89A4, array index: 0x18AC */ + 0x4742,INVALC,0x4E2B,0x4E2E,0x4E2D,INVALC,0x4E2C,0x5437, + 0x5439,0x5438, + /* Range 0x89AD - 0x89AF, array index: 0x18B6 */ + 0x5F47,0x5F49,0x5F48, + /* Range 0x89D5 - 0x89FF, array index: 0x18B9 */ + 0x394B,0x3949,INVALC,INVALC,0x394A,0x403A,0x403B,0x4749, + 0x4039,INVALC,0x4743,0x4747,0x4746,0x4748,INVALC,0x4745, + 0x4744,0x474A,INVALC,0x4E31,0x4E2F,INVALC,0x4E30,0x543C, + 0x543A,INVALC,INVALC,0x543B,0x5A4B,0x5F4A,0x5F4B,INVALC, + INVALC,0x6722,0x6979,INVALC,INVALC,0x6C3B,0x6E24,INVALC, + INVALC,0x6F4D,0x713B, + /* Range 0x8A4A - 0x8A52, array index: 0x18E4 */ + 0x4048,INVALC,0x4049,0x403D,0x403C,0x404A,INVALC,0x4047, + 0x4045, + /* Range 0x8A57 - 0x8A59, array index: 0x18ED */ + 0x4041,0x4042,0x403F, + /* Range 0x8A74 - 0x8A77, array index: 0x18F0 */ + 0x4756,0x4753,0x474B,0x4750, + /* Range 0x8A7F - 0x8A86, array index: 0x18F4 */ + 0x474D,INVALC,0x4755,0x4751,0x4754,0x4752,INVALC,0x474C, + /* Range 0x8ABA - 0x8AC0, array index: 0x18FC */ + 0x544B,0x5444,INVALC,0x544C,0x5446,INVALC,0x5447, + /* Range 0x8AD1 - 0x8AE4, array index: 0x1903 */ + 0x5441,INVALC,0x5440,0x5442,0x5443,INVALC,0x5445,0x5449, + 0x544D,INVALC,INVALC,INVALC,0x5A51,0x5A57,0x5A54,0x5A4C, + 0x5A58,0x5A4D,INVALC,0x5A53, + /* Range 0x8B05 - 0x8B08, array index: 0x1917 */ + 0x5F50,0x5F59,0x5F56,0x5F58, + /* Range 0x8B0F - 0x8B27, array index: 0x191B */ + 0x5F53,INVALC,0x5F4F,0x5F54,0x5F5B,0x5A52,0x5F55,0x5F4E, + INVALC,0x5F4D,INVALC,0x5F5C,INVALC,0x5F5A,INVALC,0x5F4C, + INVALC,INVALC,INVALC,0x5F52,0x6347,0x6355,0x6350,0x6352, + 0x6346, + /* Range 0x8B2E - 0x8B42, array index: 0x1934 */ + 0x6354,0x634C,0x6349,0x634F,INVALC,0x6348,INVALC,0x634A, + 0x6353,0x6351,INVALC,INVALC,0x6358,0x6356,0x634D,0x6357, + 0x634E,INVALC,0x6726,INVALC,0x672D, + /* Range 0x8B47 - 0x8B4B, array index: 0x1949 */ + 0x634B,0x6724,INVALC,0x6725,0x672A, + /* Range 0x8B50 - 0x8B57, array index: 0x194E */ + 0x6723,0x672C,0x672E,0x6727,0x6729,0x672B,0x6728,0x672F, + /* Range 0x8B78 - 0x8B7F, array index: 0x1956 */ + 0x6C3D,0x6C3C,0x6C3F,0x6C40,INVALC,INVALC,0x6E25,0x6E2A, + /* Range 0x8B82 - 0x8B8E, array index: 0x195E */ + 0x6E27,INVALC,0x6E26,0x6E29,0x6E28,INVALC,0x6F51,INVALC, + INVALC,0x6F50,0x6F4E,INVALC,0x6F4F, + /* Range 0x8C39 - 0x8C3E, array index: 0x196B */ + 0x3950,INVALC,0x3951,0x4758,0x4E38,0x544E, + /* Range 0x8C64 - 0x8C69, array index: 0x1971 */ + 0x475C,0x475B,0x475D,INVALC,0x4E39,0x4E3A, + /* Range 0x8C6F - 0x8C78, array index: 0x1977 */ + 0x5F61,0x5F5E,0x5F60,0x5F5F,INVALC,INVALC,0x635A,0x6732, + 0x6731,0x2524, + /* Range 0x8C80 - 0x8C86, array index: 0x1981 */ + 0x404D,0x404C,INVALC,INVALC,0x475F,0x4760,0x475E, + /* Range 0x8C8F - 0x8C9C, array index: 0x1988 */ + 0x5450,0x5A5F,0x5A5D,0x5A5E,INVALC,0x5F63,0x5F62,INVALC, + 0x635D,0x635C,0x635B,0x6733,INVALC,0x7178, + /* Range 0x8CA3 - 0x8CA5, array index: 0x1996 */ + 0x3326,0x3325,0x3955, + /* Range 0x8D8C - 0x8D96, array index: 0x1999 */ + 0x4765,0x4768,0x4766,0x4767,0x476B,0x4764,0x476C,0x4769, + 0x476A,INVALC,0x4E3E, + /* Range 0x8DAA - 0x8DAF, array index: 0x19A4 */ + 0x6738,0x673A,0x6737,0x6739,0x6A24,0x6C43, + /* Range 0x8DB5 - 0x8DB9, array index: 0x19AA */ + 0x3329,0x332B,0x332A,INVALC,0x395B, + /* Range 0x8DD3 - 0x8DD9, array index: 0x19AF */ + 0x4057,INVALC,0x405D,0x405A,0x4060,0x4056,0x405E, + /* Range 0x8DEE - 0x8DF4, array index: 0x19B6 */ + 0x4771,INVALC,0x476D,0x4770,0x4777,INVALC,0x4779, + /* Range 0x8DFD - 0x8E0A, array index: 0x19BD */ + 0x4E43,0x4E49,0x4E41,0x4E4A,INVALC,0x4E40,0x4E45,0x4E4B, + 0x4E48,0x4E47,0x4E46,INVALC,0x4E3F,0x4E44, + /* Range 0x8E11 - 0x8E1C, array index: 0x19CB */ + 0x5464,0x5469,0x546B,0x5468,0x5461,0x5463,0x546D,0x546A, + 0x5465,0x546E,0x5462,0x546C, + /* Range 0x8E23 - 0x8E27, array index: 0x19D7 */ + 0x545D,0x545F,0x545E,0x5466,0x5467, + /* Range 0x8E3C - 0x8E41, array index: 0x19DC */ + 0x5A6F,0x5A70,0x5A6A,0x5A73,0x5A6C,0x5A71, + /* Range 0x8E4C - 0x8E62, array index: 0x19E2 */ + 0x5F6A,0x5F67,0x5F66,INVALC,0x5F69,INVALC,INVALC,0x5F68, + 0x636F,INVALC,0x6366,0x6365,INVALC,INVALC,0x636B,0x636A, + 0x6362,0x636D,0x6367,INVALC,0x6364,0x636C,0x6363, + /* Range 0x8E92 - 0x8EA9, array index: 0x19F9 */ + 0x6E2F,INVALC,0x6E2D,0x6E2C,0x6E31,0x6E32,0x6F54,INVALC, + 0x6E2E,INVALC,INVALC,0x7054,0x7051,0x7052,0x7053,INVALC, + INVALC,0x7140,0x713F,0x713E,0x715F,INVALC,0x722E,0x7179, + /* Range 0x8EDC - 0x8EFA, array index: 0x1A11 */ + 0x3961,0x3960,0x395F,INVALC,0x3963,0x3964,INVALC,INVALC, + INVALC,0x4068,0x4066,0x406A,0x406B,0x4071,INVALC,0x406D, + 0x406F,INVALC,0x4067,0x4062,INVALC,0x406E,INVALC,INVALC, + 0x4070,0x4069,0x406C,0x4063,INVALC,0x4065,0x4064, + /* Range 0x8EFF - 0x8F08, array index: 0x1A30 */ + 0x477B,0x477D,0x477C,0x4823,INVALC,INVALC,0x477E,0x477A, + 0x4821,0x4822, + /* Range 0x8F0D - 0x8F11, array index: 0x1A3A */ + 0x4E4F,0x4E4E,INVALC,0x4E4C,0x4E4D, + /* Range 0x8F16 - 0x8F1A, array index: 0x1A3F */ + 0x5475,0x5476,0x5471,INVALC,0x5472, + /* Range 0x8F32 - 0x8F39, array index: 0x1A44 */ + 0x5A78,INVALC,0x5A7B,0x5A77,0x5A75,0x5A7A,INVALC,0x5A79, + /* Range 0x8F46 - 0x8F48, array index: 0x1A4C */ + 0x6370,0x6371,0x6372, + /* Range 0x8F4F - 0x8F64, array index: 0x1A4F */ + 0x6744,0x6745,0x6743,0x6742,0x6746,INVALC,0x6A2B,0x6A29, + 0x6A2A,0x6A2C,0x6A28,0x6A2D,0x6C47,INVALC,0x6C48,0x6C46, + INVALC,0x6E33,INVALC,0x6E34,0x6F56,0x6F55, + /* Range 0x8FD2 - 0x8FD7, array index: 0x1A65 */ + 0x286C,0x286E,INVALC,0x2871,0x2870,0x2872, + /* Range 0x8FFB - 0x8FFF, array index: 0x1A6B */ + 0x3332,0x3334,INVALC,0x332E,0x3331, + /* Range 0x9097 - 0x90A1, array index: 0x1A70 */ + 0x2272,0x2273,0x2271,INVALC,0x2274,INVALC,INVALC,0x252A, + 0x2527,0x252C,0x2528, + /* Range 0x90AF - 0x90B4, array index: 0x1A7B */ + 0x2875,0x2877,INVALC,0x2873,0x2876,0x2874, + /* Range 0x90BD - 0x90BF, array index: 0x1A81 */ + 0x2D59,0x2D5D,0x2D5A, + /* Range 0x90D4 - 0x90F4, array index: 0x1A84 */ + 0x3971,0x2D5B,0x3336,0x333F,0x333D,0x3338,0x3339,0x333E, + 0x3340,INVALC,INVALC,0x333B,0x3337,INVALC,INVALC,0x333A, + 0x3341,0x333C,INVALC,INVALC,INVALC,0x3974,0x396C,0x3972, + 0x3973,INVALC,INVALC,0x396B,0x396D,0x2D58,0x396F,0x3970, + 0x396E, + /* Range 0x90F9 - 0x9108, array index: 0x1AA5 */ + 0x407B,0x5B22,0x407C,0x4079,INVALC,INVALC,0x4078,0x407E, + 0x407D,INVALC,0x4123,0x4077,0x4122,0x4075,0x4121,0x407A, + /* Range 0x910B - 0x9111, array index: 0x1AB5 */ + 0x4830,INVALC,0x482B,0x4831,0x482C,0x482A,0x482D, + /* Range 0x911A - 0x9147, array index: 0x1ABC */ + 0x4E56,0x4E59,0x4E51,0x4E55,INVALC,0x4E54,0x4E52,0x4E58, + 0x4E53,0x4E50,0x4E57,INVALC,0x5523,INVALC,0x6374,0x547E, + 0x5521,0x547D,0x4076,INVALC,0x5524,0x547C,INVALC,INVALC, + 0x5522,0x5B23,INVALC,0x5B24,0x5B25,INVALC,0x5F70,INVALC, + 0x6375,0x6376,INVALC,INVALC,0x6377,0x6749,0x6748,0x6A30, + INVALC,0x6A2F,0x6C4A,0x6C4B,0x6C49,0x6E35, + /* Range 0x914E - 0x9150, array index: 0x1AEA */ + 0x3343,0x3344,0x3342, + /* Range 0x915F - 0x9164, array index: 0x1AED */ + 0x4126,0x4128,0x4124,0x4127,INVALC,0x4125, + /* Range 0x9180 - 0x9186, array index: 0x1AF3 */ + 0x552B,0x5528,0x5529,INVALC,0x552A,0x5525,0x5526, + /* Range 0x918D - 0x9193, array index: 0x1AFA */ + 0x5B29,INVALC,0x5B2A,0x5B27,0x5B28,INVALC,0x5B26, + /* Range 0x9199 - 0x91A2, array index: 0x1B01 */ + 0x5F74,0x5F71,0x5F73,INVALC,0x5F77,INVALC,0x5F75,0x5F78, + 0x5F76,0x5F72, + /* Range 0x91AF - 0x91BE, array index: 0x1B0B */ + 0x637B,0x674A,INVALC,0x6A33,0x6A34,INVALC,0x6A32,INVALC, + 0x6A31,INVALC,0x6C4C,INVALC,INVALC,0x6F57,0x7056,0x7055, + /* Range 0x91D3 - 0x91D5, array index: 0x1B1B */ + 0x2D62,0x2D61,0x3345, + /* Range 0x91E8 - 0x91EE, array index: 0x1B1E */ + 0x3A26,INVALC,0x3A23,0x3A24,0x397A,INVALC,0x3A27, + /* Range 0x91F3 - 0x91F9, array index: 0x1B25 */ + 0x397D,0x397B,INVALC,INVALC,0x3A25,0x397E,0x3A22, + /* Range 0x91FD - 0x9206, array index: 0x1B2C */ + 0x4134,INVALC,0x4133,0x4131,0x4129,0x4138,0x412C,0x4136, + 0x413D,0x4135, + /* Range 0x9216 - 0x921C, array index: 0x1B36 */ + 0x413E,0x413C,INVALC,0x413B,0x412D,INVALC,0x4139, + /* Range 0x9224 - 0x9227, array index: 0x1B3D */ + 0x413A,0x412B,0x412E,0x4137, + /* Range 0x922D - 0x9233, array index: 0x1B41 */ + 0x4F22,0x483D,INVALC,0x4836,0x4849,0x4852,0x4839, + /* Range 0x924C - 0x9256, array index: 0x1B48 */ + 0x4850,INVALC,0x484E,0x4842,0x484C,INVALC,0x4835,0x484F, + 0x484A,INVALC,0x4851, + /* Range 0x9263 - 0x9267, array index: 0x1B53 */ + 0x484B,INVALC,0x483A,0x4838,0x4844, + /* Range 0x926C - 0x9272, array index: 0x1B58 */ + 0x4841,0x4840,INVALC,0x4845,0x4848,INVALC,0x484D, + /* Range 0x9279 - 0x928E, array index: 0x1B5F */ + 0x4E6A,0x4E62,INVALC,INVALC,0x4E73,0x4E7B,0x4E6C,INVALC, + INVALC,0x4E70,0x483C,INVALC,INVALC,0x4E77,0x4E7C,0x4E74, + INVALC,0x4E76,0x4F21,0x4E78,0x4E66,0x4E6F, + /* Range 0x9297 - 0x92AB, array index: 0x1B75 */ + 0x4E6B,INVALC,0x4E79,0x4E68,0x4E61,INVALC,0x4E7E,INVALC, + INVALC,0x4E63,0x4E75,0x4E72,0x4E6D,0x4E5F,0x4E5E,0x4E67, + 0x4E7A,INVALC,0x4E7D,0x4E65,0x4E69, + /* Range 0x92B4 - 0x92B6, array index: 0x1B8A */ + 0x554D,0x5549,0x5531, + /* Range 0x92C0 - 0x92E1, array index: 0x1B8D */ + 0x552F,INVALC,0x553B,0x552D,0x552E,INVALC,0x554C,INVALC, + 0x553E,0x5543,0x553D,0x5B3C,0x5539,0x5541,0x553F,0x5532, + 0x552C,0x5547,INVALC,0x5548,INVALC,0x5542,INVALC,0x5537, + 0x5535,0x5530,INVALC,INVALC,INVALC,0x5538,0x5545,0x5534, + 0x5544,0x554A, + /* Range 0x92E6 - 0x92E9, array index: 0x1BAF */ + 0x5540,0x5546,0x553C,0x5536, + /* Range 0x92F7 - 0x9302, array index: 0x1BB3 */ + 0x5B41,INVALC,0x5B40,0x5B3E,0x5B50,INVALC,INVALC,0x5B4D, + 0x5B45,0x5B4F,0x5B37,0x5B43, + /* Range 0x9308 - 0x9316, array index: 0x1BBF */ + 0x5B2D,0x5B4E,INVALC,0x5B4C,0x5B4B,0x5B3B,0x5B3A,0x5B30, + INVALC,INVALC,0x5B36,0x5B3F,0x5B4A,INVALC,0x5B51, + /* Range 0x931B - 0x932A, array index: 0x1BCE */ + 0x5B34,INVALC,0x5B3D,0x5B2C,0x5B2E,INVALC,INVALC,INVALC, + 0x5B35,0x5B44,0x554B,INVALC,0x5B2B,INVALC,0x5B46,0x5B49, + /* Range 0x934C - 0x9359, array index: 0x1BDE */ + 0x602B,INVALC,0x6039,0x6031,0x6026,0x6027,0x6030,INVALC, + INVALC,0x602F,0x5F7D,0x602E,0x6022,0x603A, + /* Range 0x9360 - 0x9364, array index: 0x1BEC */ + 0x6028,0x6035,INVALC,0x6037,0x5F7C, + /* Range 0x9376 - 0x937C, array index: 0x1BF1 */ + 0x6024,0x6033,INVALC,0x602D,0x5B31,0x6034,0x6021, + /* Range 0x9388 - 0x9392, array index: 0x1BF8 */ + 0x642C,0x6425,INVALC,INVALC,0x637E,0x6430,0x6427,0x602A, + INVALC,0x6432,0x6421, + /* Range 0x939B - 0x93AA, array index: 0x1C03 */ + 0x6423,INVALC,0x6424,0x6429,0x642E,INVALC,0x5F79,INVALC, + 0x6437,0x6434,0x6761,0x642A,0x6426,0x6435,0x6756,0x6428, + /* Range 0x93B1 - 0x93B7, array index: 0x1C13 */ + 0x6431,0x6433,INVALC,0x6436,0x637D,INVALC,0x6422, + /* Range 0x93CC - 0x93D5, array index: 0x1C1A */ + 0x6754,INVALC,0x675E,0x674E,0x6751,INVALC,0x6760,INVALC, + 0x6759,0x675C, + /* Range 0x93F5 - 0x9400, array index: 0x1C24 */ + 0x6A41,0x6A50,0x6A43,0x6A4A,0x6752,0x6A48,0x6A37,0x6A4E, + INVALC,0x6A3B,0x6A4D,0x6A42, + /* Range 0x9406 - 0x9416, array index: 0x1C30 */ + 0x6A52,0x6A44,INVALC,0x6A49,0x6A4C,0x6A35,0x6A4F,0x6A40, + 0x6A45,0x6A39,0x6A3D,0x6A51,0x6A47,0x6A36,0x6A3A,0x6A3C, + 0x6A46, + /* Range 0x9428 - 0x942C, array index: 0x1C41 */ + 0x6A3E,0x6C50,0x6C54,INVALC,0x6C56, + /* Range 0x9439 - 0x9440, array index: 0x1C46 */ + 0x6C53,INVALC,0x6C4E,0x6A4B,0x6C51,INVALC,0x6C4D,0x6C57, + /* Range 0x9445 - 0x9450, array index: 0x1C4E */ + 0x6E3C,0x6E3F,0x6E3B,0x6E3D,0x6E3E,0x6E38,0x6E39,0x6E36, + INVALC,INVALC,0x6E3A,0x6E37, + /* Range 0x946B - 0x9478, array index: 0x1C5A */ + 0x7058,INVALC,0x7142,0x7141,0x7143,INVALC,0x7144,INVALC, + 0x7145,0x7161,0x7164,0x7163,INVALC,0x7162, + /* Range 0x9480 - 0x9483, array index: 0x1C68 */ + 0x7230,0x7231,0x722F,0x7237, + /* Range 0x957A - 0x957D, array index: 0x1C6C */ + 0x3A28,0x413F,0x554E,0x6763, + /* Range 0x959B - 0x959F, array index: 0x1C70 */ + 0x4856,0x4854,INVALC,0x4855,0x4853, + /* Range 0x95B5 - 0x95C0, array index: 0x1C75 */ + 0x5B59,0x5B57,0x6040,INVALC,0x5B55,0x5B56,INVALC,0x5B52, + 0x5B5A,0x5B54,0x5B58,0x603C, + /* Range 0x95D1 - 0x95D3, array index: 0x1C81 */ + 0x643A,0x6438,0x6439, + /* Range 0x95DA - 0x95E5, array index: 0x1C84 */ + 0x6764,0x6765,INVALC,INVALC,0x6A53,0x6A55,0x6A54,INVALC, + INVALC,0x6C5B,0x6C5A,0x6C59, + /* Range 0x9620 - 0x9624, array index: 0x1C90 */ + 0x2278,INVALC,0x2276,0x2279,0x2277, + /* Range 0x9639 - 0x963D, array index: 0x1C95 */ + 0x2878,0x287B,INVALC,0x287A,0x2879, + /* Range 0x9687 - 0x9689, array index: 0x1C9A */ + 0x4143,0x4145,0x4146, + /* Range 0x9691 - 0x9693, array index: 0x1C9D */ + 0x4859,0x4857,0x4858, + /* Range 0x971F - 0x972F, array index: 0x1CA0 */ + 0x6045,0x6044,INVALC,0x6443,0x6442,INVALC,0x6444,0x676B, + INVALC,0x676A,0x6767,INVALC,0x6768,0x6769,INVALC,0x6A56, + 0x6A57, + /* Range 0x9777 - 0x9784, array index: 0x1CB1 */ + 0x4861,0x4862,INVALC,0x4F28,0x4F2D,INVALC,0x4F27,0x4F29, + 0x4F30,0x4F2B,0x4F2F,0x4F2C,0x4F2A,0x4F2E, + /* Range 0x9799 - 0x97A5, array index: 0x1CBF */ + 0x5B60,0x6049,INVALC,0x604B,0x604D,0x604C,INVALC,INVALC, + 0x604A,0x644B,INVALC,0x6449,0x644C, + /* Range 0x97A8 - 0x97AE, array index: 0x1CCC */ + 0x6447,INVALC,0x644A,0x6448,0x6445,INVALC,0x6446, + /* Range 0x97CD - 0x97E5, array index: 0x1CD3 */ + 0x4F32,0x4F31,0x555E,0x555D,INVALC,INVALC,INVALC,0x604F, + 0x604E,0x644F,0x644D,0x6450,0x644E,INVALC,INVALC,INVALC, + 0x676F,0x6770,0x6771,INVALC,0x6C5F,INVALC,0x6E41,INVALC, + 0x7060, + /* Range 0x980D - 0x980F, array index: 0x1CEC */ + 0x4865,0x4866,0x4864, + /* Range 0x9826 - 0x9829, array index: 0x1CEF */ + 0x5561,0x5566,0x5563,0x5562, + /* Range 0x9841 - 0x984A, array index: 0x1CF3 */ + 0x6051,INVALC,0x6056,0x6052,0x6055,INVALC,INVALC,0x5E41, + 0x6054,0x6053, + /* Range 0x9850 - 0x9852, array index: 0x1CFD */ + 0x6452,0x6453,0x6454, + /* Range 0x985C - 0x9864, array index: 0x1D00 */ + 0x6772,0x6774,INVALC,0x6A5F,0x6A5C,INVALC,0x6A5D,0x6A5E, + 0x6C60, + /* Range 0x9872 - 0x9874, array index: 0x1D09 */ + 0x7147,0x717C,0x717D, + /* Range 0x98AC - 0x98AE, array index: 0x1D0C */ + 0x4867,0x4F34,0x4F35, + /* Range 0x98BB - 0x98C2, array index: 0x1D0F */ + 0x6778,INVALC,0x6777,0x6779,0x6776,0x6C63,0x6A60,0x6A61, + /* Range 0x9914 - 0x9917, array index: 0x1D17 */ + 0x556B,0x556E,0x556C,0x556D, + /* Range 0x9927 - 0x9933, array index: 0x1D1B */ + 0x5B6A,INVALC,0x5B6B,0x605A,0x6058,0x6059,0x605E,INVALC, + 0x605D,0x6060,0x605F,0x605C,0x605B, + /* Range 0x999C - 0x999E, array index: 0x1D28 */ + 0x4F3A,0x4F39,0x5B6C, + /* Range 0x99B9 - 0x99BD, array index: 0x1D2B */ + 0x4F3C,0x4F3E,0x4F3D,INVALC,0x4F40, + /* Range 0x99C9 - 0x99CF, array index: 0x1D30 */ + 0x5575,INVALC,0x5578,0x557A,0x5570,0x5574,0x5571, + /* Range 0x99D3 - 0x99D8, array index: 0x1D37 */ + 0x5572,0x5573,INVALC,0x5576,0x5579,0x5577, + /* Range 0x99E3 - 0x99F0, array index: 0x1D3D */ + 0x5B72,0x5B70,0x5B6F,INVALC,0x5B75,INVALC,0x5B74,0x5B73, + INVALC,0x5B6E,INVALC,0x5B6D,INVALC,0x5B71, + /* Range 0x99F4 - 0x9A15, array index: 0x1D4B */ + 0x6066,INVALC,0x606A,0x6067,0x6069,0x6068,0x6065,0x606B, + 0x606E,0x606C,0x606D,INVALC,INVALC,INVALC,0x6064,0x606F, + 0x645D,0x6460,0x6462,0x6461,INVALC,0x645B,0x645F,0x645A, + INVALC,0x645C,INVALC,0x6459,INVALC,0x645E,INVALC,INVALC, + 0x682D,0x6822, + /* Range 0x9A1A - 0x9A3A, array index: 0x1D6D */ + 0x6821,0x6826,0x682C,0x6824,0x682B,INVALC,0x6828,INVALC, + 0x6827,0x682A,0x6825,0x6823,INVALC,0x6829,INVALC,0x6A6E, + 0x6A6C,INVALC,0x6A6B,0x6A71,0x6A6F,INVALC,INVALC,0x6A6A, + 0x6A68,INVALC,0x6A69,INVALC,0x6A6D,INVALC,0x6A70,0x6C66, + 0x6C6C, + /* Range 0x9A46 - 0x9A56, array index: 0x1D8E */ + 0x6C68,INVALC,0x6E4C,0x6E4E,0x6E4D,INVALC,0x6E4A,INVALC, + 0x6E47,0x6E4B,0x6E50,INVALC,0x6E4F,0x6E48,0x6E49,INVALC, + 0x6F60, + /* Range 0x9A64 - 0x9A6B, array index: 0x1D9F */ + 0x7223,INVALC,0x7224,0x7225,0x7233,0x7232,INVALC,0x723B, + /* Range 0x9ABE - 0x9AC2, array index: 0x1DA7 */ + 0x6070,0x5B77,0x6463,INVALC,0x682E, + /* Range 0x9AF1 - 0x9AFE, array index: 0x1DAC */ + 0x5622,0x5621,0x557E,INVALC,INVALC,0x5B7A,0x5B7D,INVALC, + 0x5B7C,0x5B7B,INVALC,0x6074,0x6072,0x6071, + /* Range 0x9B08 - 0x9B19, array index: 0x1DBA */ + 0x6465,INVALC,0x6830,0x682F,0x6832,INVALC,0x6831,INVALC, + 0x6A75,0x6A77,0x6A76,INVALC,INVALC,0x6C6F,0x6C72,0x6C70, + 0x6C71,0x6E52, + /* Range 0x9B1E - 0x9B20, array index: 0x1DCC */ + 0x6F62,0x6F63,0x6F64, + /* Range 0x9B48 - 0x9B4C, array index: 0x1DCF */ + 0x6075,INVALC,0x646A,0x646C,0x646B, + /* Range 0x9B5F - 0x9B61, array index: 0x1DD4 */ + 0x4F49,0x4F47,0x4F48, + /* Range 0x9B64 - 0x9B68, array index: 0x1DD7 */ + 0x562D,INVALC,0x5628,0x5625,0x562C, + /* Range 0x9B70 - 0x9B88, array index: 0x1DDC */ + 0x562B,0x5627,INVALC,INVALC,0x5626,0x562A,0x5629,INVALC, + INVALC,INVALC,0x5C2B,0x5C26,0x5C24,0x5C2D,0x5C25,INVALC, + 0x5C21,INVALC,0x5C27,INVALC,INVALC,0x5C22,0x607E,0x5C23, + 0x5C2E, + /* Range 0x9B9E - 0x9BA8, array index: 0x1DF5 */ + 0x6078,INVALC,0x6122,0x607B,0x6121,INVALC,0x607D,0x607C, + 0x607A,INVALC,0x6077, + /* Range 0x9BB5 - 0x9BB9, array index: 0x1E00 */ + 0x6472,0x6475,INVALC,0x6473,0x6477, + /* Range 0x9BC3 - 0x9BC7, array index: 0x1E05 */ + 0x646F,0x6476,INVALC,0x646E,0x646D, + /* Range 0x9BD3 - 0x9BEC, array index: 0x1E0A */ + 0x6474,0x683C,0x6842,INVALC,0x683D,INVALC,0x6840,0x6844, + INVALC,0x683F,INVALC,0x6837,INVALC,0x6836,0x6843,0x683A, + INVALC,0x6838,0x6841,0x6839,INVALC,INVALC,INVALC,0x6834, + 0x6835,0x683E, + /* Range 0x9C05 - 0x9C0B, array index: 0x1E24 */ + 0x6A7B,0x6B23,0x6B21,0x6A79,0x6B26,INVALC,0x6A78, + /* Range 0x9C28 - 0x9C2C, array index: 0x1E2B */ + 0x6C7A,0x6C7B,INVALC,0x6C75,0x6C78, + /* Range 0x9C32 - 0x9C41, array index: 0x1E30 */ + 0x6E61,0x6E5C,0x6E60,INVALC,0x6E63,0x6E5F,INVALC,0x6E5B, + INVALC,INVALC,0x6E5E,0x6E62,INVALC,0x6E59,0x6A7E,0x6E5D, + /* Range 0x9C48 - 0x9C52, array index: 0x1E40 */ + 0x6E58,INVALC,0x6F68,0x6F6A,0x6F6D,0x6F69,0x6F6E,INVALC, + 0x6F67,INVALC,0x6F65, + /* Range 0x9C62 - 0x9C68, array index: 0x1E4B */ + 0x7067,0x7064,INVALC,INVALC,0x7066,0x7065,0x7149, + /* Range 0x9C71 - 0x9C75, array index: 0x1E52 */ + 0x7169,INVALC,0x7168,0x7167,0x716A, + /* Range 0x9CF7 - 0x9D00, array index: 0x1E57 */ + 0x5633,INVALC,0x5636,0x5630,0x5637,0x562F,0x5631,INVALC, + 0x5632,0x5635, + /* Range 0x9D04 - 0x9D08, array index: 0x1E61 */ + 0x563A,0x5639,INVALC,0x5634,0x5638, + /* Range 0x9D17 - 0x9D22, array index: 0x1E66 */ + 0x5C30,0x5C36,0x5C39,INVALC,INVALC,INVALC,0x5C35,0x5C32, + 0x5C3A,0x5C31,INVALC,0x5C37, + /* Range 0x9D2D - 0x9D38, array index: 0x1E72 */ + 0x6135,0x6128,0x6129,0x612C,0x612A,INVALC,0x6124,INVALC, + INVALC,0x6127,0x6131,0x612B, + /* Range 0x9D3D - 0x9D45, array index: 0x1E7E */ + 0x6133,0x6130,INVALC,0x6132,0x6125,0x612E,0x612F,INVALC, + 0x612D, + /* Range 0x9D4A - 0x9D4C, array index: 0x1E87 */ + 0x647C,0x647E,0x6523, + /* Range 0x9D52 - 0x9D5C, array index: 0x1E8A */ + 0x6525,0x647A,0x6526,INVALC,0x6522,0x6524,0x6528,0x6521, + 0x6529,0x647D,0x6479, + /* Range 0x9D67 - 0x9D8C, array index: 0x1E95 */ + 0x6126,0x685E,0x6855,INVALC,0x6851,INVALC,INVALC,INVALC, + 0x685A,0x6854,0x684A,INVALC,0x6857,0x6852,0x6853,INVALC, + 0x6845,0x684C,0x685B,INVALC,0x6858,INVALC,0x6850,INVALC, + 0x685C,0x684B,0x6846,0x6859,INVALC,0x6848,0x6856,0x684D, + 0x685D,0x6849,INVALC,0x6847,0x684E,0x684F, + /* Range 0x9D94 - 0x9DF8, array index: 0x1EBB */ + 0x6B30,INVALC,0x6B3C,0x6B33,0x6B2C,0x6B28,0x6B35,0x6B2E, + 0x6B31,0x6B2A,0x6B38,0x6B27,0x6B2F,0x6B34,0x6B36,0x6B39, + 0x6B29,INVALC,0x6B3D,0x6B3E,0x6B37,0x6B3B,0x6B32,INVALC, + 0x6D2F,0x6D32,INVALC,INVALC,INVALC,0x6D31,0x6D36,0x6D34, + INVALC,0x6D2B,0x6D21,0x6C7E,INVALC,0x6D2D,0x6D2E,0x6D2A, + 0x6D22,INVALC,0x6D27,0x6B3A,INVALC,0x6D23,INVALC,0x6D29, + INVALC,0x6D28,INVALC,0x6D24,0x6D30,INVALC,0x6D25,0x6E68, + 0x6D33,0x6D35,0x6D2C,0x6D26,0x6E69,0x6E6B,0x6E65,INVALC, + INVALC,0x6E72,0x6E70,INVALC,0x6E6F,0x6E6E,0x6E67,0x6E64, + 0x6E6A,0x6E73,0x6E66,0x6E6C,INVALC,0x6F77,0x6F7C,0x6F72, + 0x6F75,INVALC,0x6F79,INVALC,0x7022,0x6E6D,INVALC,0x6F73, + 0x6F7D,0x7023,0x6F78,0x6F71,0x6F7B,INVALC,0x6F7A,0x7021, + 0x6F7E,0x6E71,0x6F76,0x6F70,0x6F74, + /* Range 0x9DFB - 0x9E19, array index: 0x1F20 */ + 0x6F6F,INVALC,0x7074,0x706B,0x7073,0x7070,0x7071,0x706A, + 0x706D,0x7075,0x706F,0x706E,0x706C,INVALC,0x7072,INVALC, + 0x714C,INVALC,0x714D,INVALC,0x714F,0x714E,0x7151,0x7150, + 0x716C,0x716B,0x7227,INVALC,0x7228,INVALC,0x7234, + /* Range 0x9E86 - 0x9E8E, array index: 0x1F3F */ + 0x5C3C,0x5C3D,0x5C3B,0x6137,0x6136,INVALC,0x652B,0x6138, + 0x652A, + /* Range 0x9E99 - 0x9E9C, array index: 0x1F48 */ + 0x6B3F,0x6B41,0x6B40,0x6D38, + /* Range 0x9EE4 - 0x9EE7, array index: 0x1F4C */ + 0x6B43,0x6B42,0x6B45,0x6B44, + /* Range 0x9EF2 - 0x9F01, array index: 0x1F50 */ + 0x7026,0x7027,INVALC,0x7153,0x716D,INVALC,INVALC,0x4155, + 0x5C42,0x613C,0x6862,0x4875,INVALC,0x613D,0x652E,0x652D, + /* Range 0x9F18 - 0x9F38, array index: 0x1F60 */ + 0x6D3D,INVALC,0x6D3E,0x6D3C,0x7029,INVALC,0x7077,INVALC, + INVALC,INVALC,0x6140,0x613F,0x613E,0x6530,INVALC,INVALC, + 0x6534,0x6533,0x6532,0x6531,INVALC,0x6863,0x6B47,INVALC, + 0x6B46,0x6D3F,0x6E78,0x6E77,INVALC,0x6E76,0x702C,0x702B, + 0x702A, + /* Range 0x9F40 - 0x9F4F, array index: 0x1F81 */ + 0x6864,0x6865,0x6E79,0x702D,INVALC,INVALC,0x7078,0x7155, + 0x7229,0x7243,INVALC,INVALC,0x6535,0x6866,0x6D40,0x702E, + /* Range 0x9F54 - 0x9F60, array index: 0x1F91 */ + 0x6141,0x6536,0x6867,0x6868,0x6869,0x6B4C,INVALC,0x6B48, + INVALC,0x6B4B,0x6B4A,INVALC,0x6B49, + /* Range 0x9F6E - 0x9F7B, array index: 0x1F9E */ + 0x7031,0x7032,0x7030,0x702F,INVALC,INVALC,0x7079,0x707A, + 0x707B,INVALC,0x7156,0x7159,0x7158,0x7157, + /* Unranged codes (638 codes) */ + /* Array index: 0x1FAC */ 0x4E07,0x2126, + /* Array index: 0x1FAC */ 0x4E0C,0x2127, + /* Array index: 0x1FAC */ 0x4E0E,0x212F, + /* Array index: 0x1FAC */ 0x4E0F,0x212D, + /* Array index: 0x1FAC */ 0x4E2E,0x2130, + /* Array index: 0x1FAC */ 0x4E31,0x2143, + /* Array index: 0x1FAC */ 0x4E33,0x2531, + /* Array index: 0x1FAC */ 0x4E3C,0x2144, + /* Array index: 0x1FAC */ 0x4E42,0x2121, + /* Array index: 0x1FAC */ 0x4E47,0x2128, + /* Array index: 0x1FAC */ 0x4E5C,0x2122, + /* Array index: 0x1FAC */ 0x4E7F,0x334E, + /* Array index: 0x1FAC */ 0x4E83,0x4156, + /* Array index: 0x1FAC */ 0x4E84,0x4157, + /* Array index: 0x1FAC */ 0x4E8D,0x2129, + /* Array index: 0x1FAC */ 0x4E93,0x2131, + /* Array index: 0x1FAC */ 0x4EB6,0x4158, + /* Array index: 0x1FAC */ 0x4EB9,0x6D44, + /* Array index: 0x1FAC */ 0x4EC2,0x2132, + /* Array index: 0x1FAC */ 0x4EC8,0x2134, + /* Array index: 0x1FAC */ 0x4EC9,0x2133, + /* Array index: 0x1FAC */ 0x4EDA,0x214A, + /* Array index: 0x1FAC */ 0x4EDC,0x2146, + /* Array index: 0x1FAC */ 0x4EDD,0x2149, + /* Array index: 0x1FAC */ 0x4EE1,0x2148, + /* Array index: 0x1FAC */ 0x4EE8,0x2145, + /* Array index: 0x1FAC */ 0x4EE9,0x2147, + /* Array index: 0x1FAC */ 0x4EF1,0x216F, + /* Array index: 0x1FAC */ 0x4EF4,0x2179, + /* Array index: 0x1FAC */ 0x4EF5,0x216D, + /* Array index: 0x1FAC */ 0x4EF7,0x2171, + /* Array index: 0x1FAC */ 0x4F00,0x2170, + /* Array index: 0x1FAC */ 0x4F02,0x2174, + /* Array index: 0x1FAC */ 0x4F04,0x2178, + /* Array index: 0x1FAC */ 0x4F05,0x2175, + /* Array index: 0x1FAC */ 0x4F08,0x2172, + /* Array index: 0x1FAC */ 0x4F0E,0x216A, + /* Array index: 0x1FAC */ 0x4F18,0x216B, + /* Array index: 0x1FAC */ 0x4F1D,0x2173, + /* Array index: 0x1FAC */ 0x4F22,0x2176, + /* Array index: 0x1FAC */ 0x4F2C,0x216C, + /* Array index: 0x1FAC */ 0x4F2D,0x2328, + /* Array index: 0x1FAC */ 0x4F33,0x2329, + /* Array index: 0x1FAC */ 0x4F3B,0x227B, + /* Array index: 0x1FAC */ 0x4F3E,0x2322, + /* Array index: 0x1FAC */ 0x4F3F,0x232A, + /* Array index: 0x1FAC */ 0x4F41,0x2326, + /* Array index: 0x1FAC */ 0x4F49,0x227D, + /* Array index: 0x1FAC */ 0x4F4C,0x253D, + /* Array index: 0x1FAC */ 0x4F52,0x2324, + /* Array index: 0x1FAC */ 0x4F53,0x227E, + /* Array index: 0x1FAC */ 0x4F56,0x227A, + /* Array index: 0x1FAC */ 0x4F58,0x2327, + /* Array index: 0x1FAC */ 0x4F5F,0x2325, + /* Array index: 0x1FAC */ 0x4F61,0x232B, + /* Array index: 0x1FAC */ 0x4F62,0x227C, + /* Array index: 0x1FAC */ 0x4F64,0x2321, + /* Array index: 0x1FAC */ 0x4F67,0x2323, + /* Array index: 0x1FAC */ 0x4F6A,0x253F, + /* Array index: 0x1FAC */ 0x4F6B,0x254B, + /* Array index: 0x1FAC */ 0x4F6E,0x254C, + /* Array index: 0x1FAC */ 0x4F90,0x2544, + /* Array index: 0x1FAC */ 0x4F92,0x2548, + /* Array index: 0x1FAC */ 0x4FB2,0x2922, + /* Array index: 0x1FAC */ 0x4FB3,0x292A, + /* Array index: 0x1FAC */ 0x4FC0,0x292F, + /* Array index: 0x1FAC */ 0x4FC1,0x2925, + /* Array index: 0x1FAC */ 0x4FC5,0x287E, + /* Array index: 0x1FAC */ 0x4FC7,0x292C, + /* Array index: 0x1FAC */ 0x4FC9,0x2923, + /* Array index: 0x1FAC */ 0x4FCB,0x2924, + /* Array index: 0x1FAC */ 0x4FCD,0x287D, + /* Array index: 0x1FAC */ 0x4FD3,0x2921, + /* Array index: 0x1FAC */ 0x4FD4,0x2926, + /* Array index: 0x1FAC */ 0x4FD6,0x292D, + /* Array index: 0x1FAC */ 0x4FD9,0x2928, + /* Array index: 0x1FAC */ 0x4FDB,0x292B, + /* Array index: 0x1FAC */ 0x4FDC,0x2927, + /* Array index: 0x1FAC */ 0x4FEC,0x2931, + /* Array index: 0x1FAC */ 0x5005,0x2D6A, + /* Array index: 0x1FAC */ 0x5007,0x2D6B, + /* Array index: 0x1FAC */ 0x500E,0x2D7E, + /* Array index: 0x1FAC */ 0x5013,0x2D6C, + /* Array index: 0x1FAC */ 0x5015,0x335E, + /* Array index: 0x1FAC */ 0x5017,0x2D77, + /* Array index: 0x1FAC */ 0x501B,0x2D6F, + /* Array index: 0x1FAC */ 0x501C,0x2D78, + /* Array index: 0x1FAC */ 0x501E,0x2D69, + /* Array index: 0x1FAC */ 0x5020,0x2D79, + /* Array index: 0x1FAC */ 0x5022,0x2D6D, + /* Array index: 0x1FAC */ 0x5027,0x2D7A, + /* Array index: 0x1FAC */ 0x502C,0x2D74, + /* Array index: 0x1FAC */ 0x5040,0x3366, + /* Array index: 0x1FAC */ 0x5041,0x335A, + /* Array index: 0x1FAC */ 0x5045,0x335F, + /* Array index: 0x1FAC */ 0x5046,0x3365, + /* Array index: 0x1FAC */ 0x5048,0x3358, + /* Array index: 0x1FAC */ 0x504A,0x335C, + /* Array index: 0x1FAC */ 0x504B,0x3355, + /* Array index: 0x1FAC */ 0x504D,0x3359, + /* Array index: 0x1FAC */ 0x5051,0x336A, + /* Array index: 0x1FAC */ 0x5053,0x3354, + /* Array index: 0x1FAC */ 0x5057,0x3369, + /* Array index: 0x1FAC */ 0x506E,0x3367, + /* Array index: 0x1FAC */ 0x5070,0x334F, + /* Array index: 0x1FAC */ 0x5072,0x3357, + /* Array index: 0x1FAC */ 0x5073,0x3368, + /* Array index: 0x1FAC */ 0x5082,0x3A42, + /* Array index: 0x1FAC */ 0x5083,0x3A3B, + /* Array index: 0x1FAC */ 0x5087,0x3A43, + /* Array index: 0x1FAC */ 0x508B,0x3A39, + /* Array index: 0x1FAC */ 0x508C,0x3A3C, + /* Array index: 0x1FAC */ 0x508E,0x3A3D, + /* Array index: 0x1FAC */ 0x5092,0x3A41, + /* Array index: 0x1FAC */ 0x5094,0x3A37, + /* Array index: 0x1FAC */ 0x5095,0x3A36, + /* Array index: 0x1FAC */ 0x50A3,0x3A3A, + /* Array index: 0x1FAC */ 0x50AE,0x415C, + /* Array index: 0x1FAC */ 0x50B0,0x4162, + /* Array index: 0x1FAC */ 0x50B1,0x4165, + /* Array index: 0x1FAC */ 0x50B4,0x415F, + /* Array index: 0x1FAC */ 0x50B6,0x4168, + /* Array index: 0x1FAC */ 0x50B8,0x4169, + /* Array index: 0x1FAC */ 0x50BA,0x4164, + /* Array index: 0x1FAC */ 0x50BD,0x4159, + /* Array index: 0x1FAC */ 0x50BF,0x415A, + /* Array index: 0x1FAC */ 0x50C1,0x4163, + /* Array index: 0x1FAC */ 0x50C2,0x4161, + /* Array index: 0x1FAC */ 0x50C4,0x415D, + /* Array index: 0x1FAC */ 0x50D3,0x4921, + /* Array index: 0x1FAC */ 0x50D4,0x4877, + /* Array index: 0x1FAC */ 0x50D7,0x4878, + /* Array index: 0x1FAC */ 0x50DB,0x487B, + /* Array index: 0x1FAC */ 0x50DD,0x487D, + /* Array index: 0x1FAC */ 0x50E0,0x4926, + /* Array index: 0x1FAC */ 0x50E3,0x4925, + /* Array index: 0x1FAC */ 0x50E4,0x487E, + /* Array index: 0x1FAC */ 0x50E6,0x4876, + /* Array index: 0x1FAC */ 0x50E8,0x4879, + /* Array index: 0x1FAC */ 0x50EA,0x487C, + /* Array index: 0x1FAC */ 0x50EC,0x4922, + /* Array index: 0x1FAC */ 0x50EF,0x4924, + /* Array index: 0x1FAC */ 0x50F0,0x4923, + /* Array index: 0x1FAC */ 0x50F3,0x487A, + /* Array index: 0x1FAC */ 0x50F6,0x4F54, + /* Array index: 0x1FAC */ 0x50F8,0x4F51, + /* Array index: 0x1FAC */ 0x5103,0x4F4F, + /* Array index: 0x1FAC */ 0x5111,0x5643, + /* Array index: 0x1FAC */ 0x5113,0x5640, + /* Array index: 0x1FAC */ 0x5117,0x5641, + /* Array index: 0x1FAC */ 0x511A,0x5642, + /* Array index: 0x1FAC */ 0x511C,0x563F, + /* Array index: 0x1FAC */ 0x5120,0x5C49, + /* Array index: 0x1FAC */ 0x5129,0x5C4A, + /* Array index: 0x1FAC */ 0x5139,0x6B4F, + /* Array index: 0x1FAC */ 0x513A,0x6B4E, + /* Array index: 0x1FAC */ 0x513D,0x6E7D, + /* Array index: 0x1FAC */ 0x515A,0x2E21, + /* Array index: 0x1FAC */ 0x515F,0x3A44, + /* Array index: 0x1FAC */ 0x5187,0x212E, + /* Array index: 0x1FAC */ 0x518F,0x232C, + /* Array index: 0x1FAC */ 0x5193,0x2E23, + /* Array index: 0x1FAC */ 0x5194,0x2E22, + /* Array index: 0x1FAC */ 0x5198,0x2135, + /* Array index: 0x1FAC */ 0x519E,0x254D, + /* Array index: 0x1FAC */ 0x51B1,0x217B, + /* Array index: 0x1FAC */ 0x51B9,0x232D, + /* Array index: 0x1FAC */ 0x51BC,0x254E, + /* Array index: 0x1FAC */ 0x51BE,0x254F, + /* Array index: 0x1FAC */ 0x51C4,0x2E25, + /* Array index: 0x1FAC */ 0x51C5,0x2E26, + /* Array index: 0x1FAC */ 0x51C8,0x2E27, + /* Array index: 0x1FAC */ 0x51CA,0x2E24, + /* Array index: 0x1FAC */ 0x51CE,0x2E28, + /* Array index: 0x1FAC */ 0x51D0,0x336B, + /* Array index: 0x1FAC */ 0x51D4,0x3A45, + /* Array index: 0x1FAC */ 0x51D7,0x416A, + /* Array index: 0x1FAC */ 0x51D8,0x4927, + /* Array index: 0x1FAC */ 0x51DE,0x5644, + /* Array index: 0x1FAC */ 0x51F5,0x2123, + /* Array index: 0x1FAC */ 0x5209,0x214C, + /* Array index: 0x1FAC */ 0x520C,0x214B, + /* Array index: 0x1FAC */ 0x5210,0x217D, + /* Array index: 0x1FAC */ 0x5213,0x217C, + /* Array index: 0x1FAC */ 0x521C,0x232E, + /* Array index: 0x1FAC */ 0x521E,0x232F, + /* Array index: 0x1FAC */ 0x5221,0x2330, + /* Array index: 0x1FAC */ 0x5244,0x2932, + /* Array index: 0x1FAC */ 0x5246,0x2553, + /* Array index: 0x1FAC */ 0x5249,0x2933, + /* Array index: 0x1FAC */ 0x5252,0x2E2B, + /* Array index: 0x1FAC */ 0x5255,0x2E2E, + /* Array index: 0x1FAC */ 0x525A,0x2E2A, + /* Array index: 0x1FAC */ 0x5280,0x4928, + /* Array index: 0x1FAC */ 0x5281,0x4929, + /* Array index: 0x1FAC */ 0x5284,0x4C61, + /* Array index: 0x1FAC */ 0x528B,0x4F5A, + /* Array index: 0x1FAC */ 0x528C,0x4F5B, + /* Array index: 0x1FAC */ 0x52A6,0x217E, + /* Array index: 0x1FAC */ 0x52AD,0x2331, + /* Array index: 0x1FAC */ 0x52AE,0x2332, + /* Array index: 0x1FAC */ 0x52BC,0x2555, + /* Array index: 0x1FAC */ 0x52C0,0x2934, + /* Array index: 0x1FAC */ 0x52C2,0x2935, + /* Array index: 0x1FAC */ 0x52CD,0x2E30, + /* Array index: 0x1FAC */ 0x52D3,0x3371, + /* Array index: 0x1FAC */ 0x52D6,0x3370, + /* Array index: 0x1FAC */ 0x52E9,0x492A, + /* Array index: 0x1FAC */ 0x52EB,0x492B, + /* Array index: 0x1FAC */ 0x52EF,0x4F5D, + /* Array index: 0x1FAC */ 0x52F1,0x4F5C, + /* Array index: 0x1FAC */ 0x52F4,0x5C4B, + /* Array index: 0x1FAC */ 0x52F7,0x653A, + /* Array index: 0x1FAC */ 0x52FC,0x2136, + /* Array index: 0x1FAC */ 0x530E,0x2E31, + /* Array index: 0x1FAC */ 0x5311,0x3A47, + /* Array index: 0x1FAC */ 0x5312,0x3A46, + /* Array index: 0x1FAC */ 0x531A,0x2124, + /* Array index: 0x1FAC */ 0x531C,0x214D, + /* Array index: 0x1FAC */ 0x531F,0x2222, + /* Array index: 0x1FAC */ 0x5322,0x2221, + /* Array index: 0x1FAC */ 0x532D,0x3372, + /* Array index: 0x1FAC */ 0x5330,0x492C, + /* Array index: 0x1FAC */ 0x5334,0x5645, + /* Array index: 0x1FAC */ 0x5337,0x686A, + /* Array index: 0x1FAC */ 0x533C,0x2558, + /* Array index: 0x1FAC */ 0x533D,0x2936, + /* Array index: 0x1FAC */ 0x534C,0x214E, + /* Array index: 0x1FAC */ 0x534D,0x2223, + /* Array index: 0x1FAC */ 0x5363,0x2334, + /* Array index: 0x1FAC */ 0x536C,0x2137, + /* Array index: 0x1FAC */ 0x5372,0x2335, + /* Array index: 0x1FAC */ 0x537C,0x2937, + /* Array index: 0x1FAC */ 0x5382,0x2125, + /* Array index: 0x1FAC */ 0x538A,0x2224, + /* Array index: 0x1FAC */ 0x538E,0x2336, + /* Array index: 0x1FAC */ 0x538F,0x2337, + /* Array index: 0x1FAC */ 0x5392,0x2559, + /* Array index: 0x1FAC */ 0x539C,0x3373, + /* Array index: 0x1FAC */ 0x539E,0x2E32, + /* Array index: 0x1FAC */ 0x53A4,0x3A48, + /* Array index: 0x1FAC */ 0x53A7,0x3A49, + /* Array index: 0x1FAC */ 0x53AC,0x492D, + /* Array index: 0x1FAC */ 0x53B4,0x653B, + /* Array index: 0x1FAC */ 0x53B9,0x2138, + /* Array index: 0x1FAC */ 0x53E1,0x5646, + /* Array index: 0x1FAC */ 0x5407,0x2225, + /* Array index: 0x1FAC */ 0x5418,0x2340, + /* Array index: 0x1FAC */ 0x5419,0x233D, + /* Array index: 0x1FAC */ 0x541C,0x233E, + /* Array index: 0x1FAC */ 0x5424,0x2345, + /* Array index: 0x1FAC */ 0x5425,0x233F, + /* Array index: 0x1FAC */ 0x5428,0x2344, + /* Array index: 0x1FAC */ 0x542A,0x233A, + /* Array index: 0x1FAC */ 0x5430,0x2338, + /* Array index: 0x1FAC */ 0x5437,0x2339, + /* Array index: 0x1FAC */ 0x543D,0x2341, + /* Array index: 0x1FAC */ 0x5441,0x2343, + /* Array index: 0x1FAC */ 0x5445,0x233C, + /* Array index: 0x1FAC */ 0x5447,0x2346, + /* Array index: 0x1FAC */ 0x544F,0x2342, + /* Array index: 0x1FAC */ 0x5454,0x233B, + /* Array index: 0x1FAC */ 0x546B,0x2561, + /* Array index: 0x1FAC */ 0x546C,0x2565, + /* Array index: 0x1FAC */ 0x546F,0x2569, + /* Array index: 0x1FAC */ 0x5470,0x294A, + /* Array index: 0x1FAC */ 0x5472,0x294E, + /* Array index: 0x1FAC */ 0x5474,0x2566, + /* Array index: 0x1FAC */ 0x547A,0x2562, + /* Array index: 0x1FAC */ 0x5487,0x255B, + /* Array index: 0x1FAC */ 0x5488,0x2560, + /* Array index: 0x1FAC */ 0x548D,0x2568, + /* Array index: 0x1FAC */ 0x5491,0x255E, + /* Array index: 0x1FAC */ 0x5498,0x256C, + /* Array index: 0x1FAC */ 0x54A5,0x293F, + /* Array index: 0x1FAC */ 0x54AD,0x293E, + /* Array index: 0x1FAC */ 0x54AE,0x2944, + /* Array index: 0x1FAC */ 0x54B0,0x2950, + /* Array index: 0x1FAC */ 0x54B6,0x2946, + /* Array index: 0x1FAC */ 0x54B7,0x2943, + /* Array index: 0x1FAC */ 0x54BA,0x293C, + /* Array index: 0x1FAC */ 0x54BC,0x294B, + /* Array index: 0x1FAC */ 0x54BE,0x294D, + /* Array index: 0x1FAC */ 0x54C3,0x2941, + /* Array index: 0x1FAC */ 0x54C5,0x2947, + /* Array index: 0x1FAC */ 0x54C6,0x2948, + /* Array index: 0x1FAC */ 0x54CF,0x2940, + /* Array index: 0x1FAC */ 0x54D6,0x2945, + /* Array index: 0x1FAC */ 0x54DE,0x294F, + /* Array index: 0x1FAC */ 0x54E0,0x2E46, + /* Array index: 0x1FAC */ 0x54E2,0x2E34, + /* Array index: 0x1FAC */ 0x54E4,0x2E39, + /* Array index: 0x1FAC */ 0x54E7,0x2E37, + /* Array index: 0x1FAC */ 0x54EB,0x2E3E, + /* Array index: 0x1FAC */ 0x54F1,0x2E41, + /* Array index: 0x1FAC */ 0x54F3,0x2E38, + /* Array index: 0x1FAC */ 0x54F7,0x2E44, + /* Array index: 0x1FAC */ 0x54F8,0x2E45, + /* Array index: 0x1FAC */ 0x54FB,0x2E43, + /* Array index: 0x1FAC */ 0x54FF,0x2E3B, + /* Array index: 0x1FAC */ 0x5517,0x2E35, + /* Array index: 0x1FAC */ 0x551A,0x2E3A, + /* Array index: 0x1FAC */ 0x5526,0x2E33, + /* Array index: 0x1FAC */ 0x552A,0x337A, + /* Array index: 0x1FAC */ 0x552D,0x342A, + /* Array index: 0x1FAC */ 0x5530,0x3421, + /* Array index: 0x1FAC */ 0x5539,0x3428, + /* Array index: 0x1FAC */ 0x553B,0x342B, + /* Array index: 0x1FAC */ 0x553C,0x3376, + /* Array index: 0x1FAC */ 0x5540,0x342C, + /* Array index: 0x1FAC */ 0x5545,0x3423, + /* Array index: 0x1FAC */ 0x5548,0x3429, + /* Array index: 0x1FAC */ 0x554B,0x342D, + /* Array index: 0x1FAC */ 0x5562,0x337C, + /* Array index: 0x1FAC */ 0x5565,0x3426, + /* Array index: 0x1FAC */ 0x557D,0x3A59, + /* Array index: 0x1FAC */ 0x557F,0x3A5C, + /* Array index: 0x1FAC */ 0x5581,0x3A55, + /* Array index: 0x1FAC */ 0x5588,0x3A52, + /* Array index: 0x1FAC */ 0x55AD,0x3A4D, + /* Array index: 0x1FAC */ 0x55B5,0x3A54, + /* Array index: 0x1FAC */ 0x55D9,0x4226, + /* Array index: 0x1FAC */ 0x55DB,0x4170, + /* Array index: 0x1FAC */ 0x55DD,0x4175, + /* Array index: 0x1FAC */ 0x55E2,0x4221, + /* Array index: 0x1FAC */ 0x55E9,0x4179, + /* Array index: 0x1FAC */ 0x55F2,0x4224, + /* Array index: 0x1FAC */ 0x55F9,0x493C, + /* Array index: 0x1FAC */ 0x55FA,0x4938, + /* Array index: 0x1FAC */ 0x55FC,0x4932, + /* Array index: 0x1FAC */ 0x55FF,0x493B, + /* Array index: 0x1FAC */ 0x5601,0x4935, + /* Array index: 0x1FAC */ 0x5602,0x4937, + /* Array index: 0x1FAC */ 0x5604,0x493A, + /* Array index: 0x1FAC */ 0x560C,0x4930, + /* Array index: 0x1FAC */ 0x560F,0x4933, + /* Array index: 0x1FAC */ 0x5612,0x4931, + /* Array index: 0x1FAC */ 0x5613,0x4936, + /* Array index: 0x1FAC */ 0x5615,0x492F, + /* Array index: 0x1FAC */ 0x561C,0x4934, + /* Array index: 0x1FAC */ 0x561D,0x4939, + /* Array index: 0x1FAC */ 0x5627,0x492E, + /* Array index: 0x1FAC */ 0x562A,0x4F6E, + /* Array index: 0x1FAC */ 0x562C,0x4F6B, + /* Array index: 0x1FAC */ 0x5633,0x4F69, + /* Array index: 0x1FAC */ 0x5635,0x4F61, + /* Array index: 0x1FAC */ 0x5638,0x4F6D, + /* Array index: 0x1FAC */ 0x563A,0x4F6F, + /* Array index: 0x1FAC */ 0x5658,0x4F66, + /* Array index: 0x1FAC */ 0x565A,0x4F67, + /* Array index: 0x1FAC */ 0x565E,0x564F, + /* Array index: 0x1FAC */ 0x5660,0x5648, + /* Array index: 0x1FAC */ 0x5663,0x564C, + /* Array index: 0x1FAC */ 0x5666,0x564B, + /* Array index: 0x1FAC */ 0x566D,0x564D, + /* Array index: 0x1FAC */ 0x566E,0x5649, + /* Array index: 0x1FAC */ 0x5670,0x5647, + /* Array index: 0x1FAC */ 0x5672,0x564E, + /* Array index: 0x1FAC */ 0x5673,0x564A, + /* Array index: 0x1FAC */ 0x5677,0x5650, + /* Array index: 0x1FAC */ 0x568C,0x5C4D, + /* Array index: 0x1FAC */ 0x568D,0x5C4E, + /* Array index: 0x1FAC */ 0x5693,0x5C4C, + /* Array index: 0x1FAC */ 0x56B2,0x686B, + /* Array index: 0x1FAC */ 0x56B3,0x686D, + /* Array index: 0x1FAC */ 0x56B5,0x686C, + /* Array index: 0x1FAC */ 0x56BD,0x6B53, + /* Array index: 0x1FAC */ 0x56BE,0x6B54, + /* Array index: 0x1FAC */ 0x56C3,0x6B52, + /* Array index: 0x1FAC */ 0x56C5,0x6D46, + /* Array index: 0x1FAC */ 0x56C6,0x6D45, + /* Array index: 0x1FAC */ 0x56CB,0x6D47, + /* Array index: 0x1FAC */ 0x56CD,0x7034, + /* Array index: 0x1FAC */ 0x56D3,0x7033, + /* Array index: 0x1FAC */ 0x56D4,0x707C, + /* Array index: 0x1FAC */ 0x56D7,0x212A, + /* Array index: 0x1FAC */ 0x56DF,0x2227, + /* Array index: 0x1FAC */ 0x56E1,0x2226, + /* Array index: 0x1FAC */ 0x56E5,0x2349, + /* Array index: 0x1FAC */ 0x56E7,0x2348, + /* Array index: 0x1FAC */ 0x56EE,0x2347, + /* Array index: 0x1FAC */ 0x56F7,0x2570, + /* Array index: 0x1FAC */ 0x56F9,0x2571, + /* Array index: 0x1FAC */ 0x5701,0x2E4A, + /* Array index: 0x1FAC */ 0x5702,0x2E4B, + /* Array index: 0x1FAC */ 0x5707,0x342F, + /* Array index: 0x1FAC */ 0x570A,0x342E, + /* Array index: 0x1FAC */ 0x570C,0x3A60, + /* Array index: 0x1FAC */ 0x5714,0x4228, + /* Array index: 0x1FAC */ 0x572A,0x2229, + /* Array index: 0x1FAC */ 0x572E,0x2228, + /* Array index: 0x1FAC */ 0x5734,0x222A, + /* Array index: 0x1FAC */ 0x5741,0x234A, + /* Array index: 0x1FAC */ 0x5745,0x234B, + /* Array index: 0x1FAC */ 0x5749,0x234D, + /* Array index: 0x1FAC */ 0x574B,0x234E, + /* Array index: 0x1FAC */ 0x574C,0x234C, + /* Array index: 0x1FAC */ 0x5752,0x234F, + /* Array index: 0x1FAC */ 0x5762,0x257E, + /* Array index: 0x1FAC */ 0x5768,0x2621, + /* Array index: 0x1FAC */ 0x576B,0x2575, + /* Array index: 0x1FAC */ 0x577B,0x257B, + /* Array index: 0x1FAC */ 0x577D,0x2622, + /* Array index: 0x1FAC */ 0x5780,0x2579, + /* Array index: 0x1FAC */ 0x578C,0x2955, + /* Array index: 0x1FAC */ 0x578F,0x295B, + /* Array index: 0x1FAC */ 0x57A4,0x2954, + /* Array index: 0x1FAC */ 0x57A5,0x295D, + /* Array index: 0x1FAC */ 0x57C6,0x2E51, + /* Array index: 0x1FAC */ 0x57C7,0x2E57, + /* Array index: 0x1FAC */ 0x57CC,0x2E4C, + /* Array index: 0x1FAC */ 0x57CF,0x343D, + /* Array index: 0x1FAC */ 0x57D0,0x2E58, + /* Array index: 0x1FAC */ 0x57D2,0x2E4F, + /* Array index: 0x1FAC */ 0x57D5,0x2E4E, + /* Array index: 0x1FAC */ 0x57DC,0x3434, + /* Array index: 0x1FAC */ 0x5804,0x344F, + /* Array index: 0x1FAC */ 0x5814,0x3431, + /* Array index: 0x1FAC */ 0x5819,0x3A63, + /* Array index: 0x1FAC */ 0x581B,0x3A6C, + /* Array index: 0x1FAC */ 0x581C,0x3A6B, + /* Array index: 0x1FAC */ 0x581E,0x3A64, + /* Array index: 0x1FAC */ 0x5823,0x3A66, + /* Array index: 0x1FAC */ 0x5848,0x3A69, + /* Array index: 0x1FAC */ 0x5849,0x422E, + /* Array index: 0x1FAC */ 0x5853,0x4229, + /* Array index: 0x1FAC */ 0x5855,0x4230, + /* Array index: 0x1FAC */ 0x5859,0x4233, + /* Array index: 0x1FAC */ 0x585B,0x4235, + /* Array index: 0x1FAC */ 0x585D,0x4232, + /* Array index: 0x1FAC */ 0x5868,0x422A, + /* Array index: 0x1FAC */ 0x586F,0x422F, + /* Array index: 0x1FAC */ 0x5871,0x4238, + /* Array index: 0x1FAC */ 0x5874,0x4944, + /* Array index: 0x1FAC */ 0x5876,0x494A, + /* Array index: 0x1FAC */ 0x587F,0x4943, + /* Array index: 0x1FAC */ 0x5881,0x4942, + /* Array index: 0x1FAC */ 0x5882,0x494B, + /* Array index: 0x1FAC */ 0x5894,0x494E, + /* Array index: 0x1FAC */ 0x5898,0x4940, + /* Array index: 0x1FAC */ 0x589D,0x4F72, + /* Array index: 0x1FAC */ 0x58A0,0x4F74, + /* Array index: 0x1FAC */ 0x58A1,0x4F79, + /* Array index: 0x1FAC */ 0x58A3,0x4F75, + /* Array index: 0x1FAC */ 0x58A5,0x4F78, + /* Array index: 0x1FAC */ 0x58AB,0x4F71, + /* Array index: 0x1FAC */ 0x58AC,0x4F77, + /* Array index: 0x1FAC */ 0x58AF,0x4F76, + /* Array index: 0x1FAC */ 0x58B1,0x4F73, + /* Array index: 0x1FAC */ 0x58BA,0x5657, + /* Array index: 0x1FAC */ 0x58BC,0x5659, + /* Array index: 0x1FAC */ 0x58BD,0x5654, + /* Array index: 0x1FAC */ 0x58BF,0x5656, + /* Array index: 0x1FAC */ 0x58C2,0x5658, + /* Array index: 0x1FAC */ 0x58C6,0x565A, + /* Array index: 0x1FAC */ 0x58C8,0x5653, + /* Array index: 0x1FAC */ 0x58C9,0x5655, + /* Array index: 0x1FAC */ 0x58CF,0x5C58, + /* Array index: 0x1FAC */ 0x58D2,0x5C59, + /* Array index: 0x1FAC */ 0x58D4,0x5C57, + /* Array index: 0x1FAC */ 0x58D6,0x5C56, + /* Array index: 0x1FAC */ 0x58DA,0x6542, + /* Array index: 0x1FAC */ 0x58DB,0x6544, + /* Array index: 0x1FAC */ 0x58DD,0x6543, + /* Array index: 0x1FAC */ 0x58E3,0x686E, + /* Array index: 0x1FAC */ 0x58E7,0x6F22, + /* Array index: 0x1FAC */ 0x58E8,0x6F21, + /* Array index: 0x1FAC */ 0x58F4,0x2960, + /* Array index: 0x1FAC */ 0x58FC,0x4239, + /* Array index: 0x1FAC */ 0x58FE,0x4950, + /* Array index: 0x1FAC */ 0x58FF,0x4F7A, + /* Array index: 0x1FAC */ 0x5903,0x213A, + /* Array index: 0x1FAC */ 0x5906,0x2350, + /* Array index: 0x1FAC */ 0x5912,0x6545, + /* Array index: 0x1FAC */ 0x5917,0x2151, + /* Array index: 0x1FAC */ 0x592C,0x213B, + /* Array index: 0x1FAC */ 0x592F,0x2152, + /* Array index: 0x1FAC */ 0x593C,0x222B, + /* Array index: 0x1FAC */ 0x5940,0x2351, + /* Array index: 0x1FAC */ 0x5945,0x2624, + /* Array index: 0x1FAC */ 0x594A,0x2E5C, + /* Array index: 0x1FAC */ 0x5953,0x2962, + /* Array index: 0x1FAC */ 0x595C,0x3450, + /* Array index: 0x1FAC */ 0x5961,0x3A76, + /* Array index: 0x1FAC */ 0x596B,0x4951, + /* Array index: 0x1FAC */ 0x5977,0x2231, + /* Array index: 0x1FAC */ 0x5985,0x222E, + /* Array index: 0x1FAC */ 0x5997,0x2355, + /* Array index: 0x1FAC */ 0x5998,0x2353, + /* Array index: 0x1FAC */ 0x59A6,0x2352, + /* Array index: 0x1FAC */ 0x59A7,0x235A, + /* Array index: 0x1FAC */ 0x59BA,0x2626, + /* Array index: 0x1FAC */ 0x59BC,0x262D, + /* Array index: 0x1FAC */ 0x59BD,0x2631, + /* Array index: 0x1FAC */ 0x59C0,0x2632, + /* Array index: 0x1FAC */ 0x59C1,0x262B, + /* Array index: 0x1FAC */ 0x59C3,0x262E, + /* Array index: 0x1FAC */ 0x59C7,0x2635, + /* Array index: 0x1FAC */ 0x59C8,0x2633, + /* Array index: 0x1FAC */ 0x59CC,0x262A, + /* Array index: 0x1FAC */ 0x59CE,0x2628, + /* Array index: 0x1FAC */ 0x59CF,0x2627, + /* Array index: 0x1FAC */ 0x59D6,0x262F, + /* Array index: 0x1FAC */ 0x59DB,0x2970, + /* Array index: 0x1FAC */ 0x59E4,0x296D, + /* Array index: 0x1FAC */ 0x59E9,0x2971, + /* Array index: 0x1FAC */ 0x5A0A,0x2E64, + /* Array index: 0x1FAC */ 0x5A0F,0x2E62, + /* Array index: 0x1FAC */ 0x5A1E,0x2E65, + /* Array index: 0x1FAC */ 0x5A2D,0x2E5F, + /* Array index: 0x1FAC */ 0x5A2E,0x2E60, + /* Array index: 0x1FAC */ 0x5A33,0x2E66, + /* Array index: 0x1FAC */ 0x5A3E,0x3467, + /* Array index: 0x1FAC */ 0x5A64,0x345E, + /* Array index: 0x1FAC */ 0x5A65,0x345B, + /* Array index: 0x1FAC */ 0x5A67,0x3454, + /* Array index: 0x1FAC */ 0x5A69,0x346C, + /* Array index: 0x1FAC */ 0x5A6C,0x345C, + /* Array index: 0x1FAC */ 0x5A6D,0x3458, + /* Array index: 0x1FAC */ 0x5A70,0x346B, + /* Array index: 0x1FAC */ 0x5A83,0x3B2A, + /* Array index: 0x1FAC */ 0x5A84,0x3B27, + /* Array index: 0x1FAC */ 0x5AA2,0x3A7B, + /* Array index: 0x1FAC */ 0x5AA5,0x3B22, + /* Array index: 0x1FAC */ 0x5AA6,0x3A7E, + /* Array index: 0x1FAC */ 0x5AA9,0x3B2C, + /* Array index: 0x1FAC */ 0x5ABF,0x4242, + /* Array index: 0x1FAC */ 0x5AC0,0x4247, + /* Array index: 0x1FAC */ 0x5AD5,0x4955, + /* Array index: 0x1FAC */ 0x5AE5,0x4954, + /* Array index: 0x1FAC */ 0x5AFD,0x4F7D, + /* Array index: 0x1FAC */ 0x5B0F,0x5029, + /* Array index: 0x1FAC */ 0x5B10,0x5661, + /* Array index: 0x1FAC */ 0x5B1E,0x5666, + /* Array index: 0x1FAC */ 0x5B20,0x5665, + /* Array index: 0x1FAC */ 0x5B21,0x565E, + /* Array index: 0x1FAC */ 0x5B32,0x5C5C, + /* Array index: 0x1FAC */ 0x5B45,0x686F, + /* Array index: 0x1FAC */ 0x5B56,0x2233, + /* Array index: 0x1FAC */ 0x5B62,0x2636, + /* Array index: 0x1FAC */ 0x5B65,0x2637, + /* Array index: 0x1FAC */ 0x5B6C,0x2E67, + /* Array index: 0x1FAC */ 0x5B6E,0x3473, + /* Array index: 0x1FAC */ 0x5B72,0x3472, + /* Array index: 0x1FAC */ 0x5B77,0x4964, + /* Array index: 0x1FAC */ 0x5B7B,0x5C63, + /* Array index: 0x1FAC */ 0x5B81,0x2153, + /* Array index: 0x1FAC */ 0x5B84,0x2154, + /* Array index: 0x1FAC */ 0x5B8E,0x235C, + /* Array index: 0x1FAC */ 0x5B92,0x235D, + /* Array index: 0x1FAC */ 0x5B93,0x2638, + /* Array index: 0x1FAC */ 0x5B95,0x2639, + /* Array index: 0x1FAC */ 0x5BA7,0x2E68, + /* Array index: 0x1FAC */ 0x5BA8,0x2978, + /* Array index: 0x1FAC */ 0x5BAC,0x2E6A, + /* Array index: 0x1FAC */ 0x5BAD,0x2E69, + /* Array index: 0x1FAC */ 0x5BC0,0x3475, + /* Array index: 0x1FAC */ 0x5BC1,0x3474, + /* Array index: 0x1FAC */ 0x5BD1,0x3B38, + /* Array index: 0x1FAC */ 0x5BD4,0x3B37, + /* Array index: 0x1FAC */ 0x5BD6,0x424E, + /* Array index: 0x1FAC */ 0x5BD8,0x424F, + /* Array index: 0x1FAC */ 0x5BD9,0x4250, + /* Array index: 0x1FAC */ 0x5BE0,0x4965, + /* Array index: 0x1FAC */ 0x5BE3,0x4966, + /* Array index: 0x1FAC */ 0x5BEA,0x3B34, + /* Array index: 0x1FAC */ 0x5BEF,0x5667, + /* Array index: 0x1FAC */ 0x5BF1,0x5C64, + /* Array index: 0x1FAC */ 0x5BF2,0x5C65, + /* Array index: 0x1FAC */ 0x5C03,0x2E6B, + /* Array index: 0x1FAC */ 0x5C0C,0x3B3B, + /* Array index: 0x1FAC */ 0x5C10,0x213C, + /* Array index: 0x1FAC */ 0x5C12,0x2155, + /* Array index: 0x1FAC */ 0x5C15,0x2234, + /* Array index: 0x1FAC */ 0x5C1F,0x4251, + /* Array index: 0x1FAC */ 0x5C25,0x2235, + /* Array index: 0x1FAC */ 0x5C28,0x235E, + /* Array index: 0x1FAC */ 0x5C2A,0x235F, + /* Array index: 0x1FAC */ 0x5C30,0x3B3C, + /* Array index: 0x1FAC */ 0x5C33,0x4252, + /* Array index: 0x1FAC */ 0x5C3B,0x2156, + /* Array index: 0x1FAC */ 0x5C44,0x263A, + /* Array index: 0x1FAC */ 0x5C47,0x263B, + /* Array index: 0x1FAC */ 0x5C4C,0x2979, + /* Array index: 0x1FAC */ 0x5C54,0x2E6D, + /* Array index: 0x1FAC */ 0x5C56,0x2E6C, + /* Array index: 0x1FAC */ 0x5C59,0x3476, + /* Array index: 0x1FAC */ 0x5C63,0x4967, + /* Array index: 0x1FAC */ 0x5C67,0x502A, + /* Array index: 0x1FAC */ 0x5C69,0x614E, + /* Array index: 0x1FAC */ 0x5C6A,0x614F, + /* Array index: 0x1FAC */ 0x5C6D,0x7036, + /* Array index: 0x1FAC */ 0x5C6E,0x212B, + /* Array index: 0x1FAC */ 0x5C73,0x2158, + /* Array index: 0x1FAC */ 0x5C74,0x2157, + /* Array index: 0x1FAC */ 0x5C9D,0x2649, + /* Array index: 0x1FAC */ 0x5CB5,0x263F, + /* Array index: 0x1FAC */ 0x5CB6,0x264B, + /* Array index: 0x1FAC */ 0x5CEC,0x2E6E, + /* Array index: 0x1FAC */ 0x5CEE,0x2E70, + /* Array index: 0x1FAC */ 0x5CF1,0x2E71, + /* Array index: 0x1FAC */ 0x5CFF,0x2E6F, + /* Array index: 0x1FAC */ 0x5D00,0x2E73, + /* Array index: 0x1FAC */ 0x5D12,0x3525, + /* Array index: 0x1FAC */ 0x5D1A,0x347A, + /* Array index: 0x1FAC */ 0x5D23,0x3526, + /* Array index: 0x1FAC */ 0x5D25,0x3522, + /* Array index: 0x1FAC */ 0x5D26,0x3521, + /* Array index: 0x1FAC */ 0x5D28,0x347D, + /* Array index: 0x1FAC */ 0x5D4E,0x3B45, + /* Array index: 0x1FAC */ 0x5D51,0x3B44, + /* Array index: 0x1FAC */ 0x5D52,0x3B49, + /* Array index: 0x1FAC */ 0x5D55,0x3B46, + /* Array index: 0x1FAC */ 0x5D59,0x3B4C, + /* Array index: 0x1FAC */ 0x5D5E,0x4259, + /* Array index: 0x1FAC */ 0x5D62,0x425C, + /* Array index: 0x1FAC */ 0x5D63,0x4254, + /* Array index: 0x1FAC */ 0x5D65,0x4256, + /* Array index: 0x1FAC */ 0x5D67,0x425B, + /* Array index: 0x1FAC */ 0x5D68,0x425A, + /* Array index: 0x1FAC */ 0x5D6B,0x3B3F, + /* Array index: 0x1FAC */ 0x5D6C,0x4258, + /* Array index: 0x1FAC */ 0x5D71,0x4253, + /* Array index: 0x1FAC */ 0x5D72,0x4257, + /* Array index: 0x1FAC */ 0x5D77,0x496E, + /* Array index: 0x1FAC */ 0x5D8D,0x4974, + /* Array index: 0x1FAC */ 0x5D92,0x502E, + /* Array index: 0x1FAC */ 0x5D93,0x5030, + /* Array index: 0x1FAC */ 0x5D95,0x5031, + /* Array index: 0x1FAC */ 0x5D97,0x502C, + /* Array index: 0x1FAC */ 0x5D99,0x502B, + /* Array index: 0x1FAC */ 0x5D9A,0x5035, + /* Array index: 0x1FAC */ 0x5DC0,0x6150, + /* Array index: 0x1FAC */ 0x5DC2,0x643E, + /* Array index: 0x1FAC */ 0x5DC3,0x6549, + /* Array index: 0x1FAC */ 0x5DC6,0x6870, + /* Array index: 0x1FAC */ 0x5DC7,0x6871, + /* Array index: 0x1FAC */ 0x5DCB,0x6B57, + /* Array index: 0x1FAC */ 0x5DCF,0x6B58, + /* Array index: 0x1FAC */ 0x5DD1,0x6D4C, + /* Array index: 0x1FAC */ 0x5DD5,0x6D4B, + /* Array index: 0x1FAC */ 0x5DD8,0x6F25, + /* Array index: 0x1FAC */ 0x5DDF,0x223A, + /* Array index: 0x1FAC */ 0x5DE0,0x236A, + /* Array index: 0x1FAC */ 0x5DF0,0x425D, + /* Array index: 0x1FAC */ 0x5DF9,0x2A30, + /* Array index: 0x1FAC */ 0x5DFF,0x213D, + /* Array index: 0x1FAC */ 0x5E04,0x2159, + /* Array index: 0x1FAC */ 0x5E0A,0x236B, + /* Array index: 0x1FAC */ 0x5E0E,0x236C, + /* Array index: 0x1FAC */ 0x5E14,0x264F, + /* Array index: 0x1FAC */ 0x5E17,0x264E, + /* Array index: 0x1FAC */ 0x5E19,0x2650, + /* Array index: 0x1FAC */ 0x5E28,0x2E76, + /* Array index: 0x1FAC */ 0x5E29,0x2E75, + /* Array index: 0x1FAC */ 0x5E34,0x352A, + /* Array index: 0x1FAC */ 0x5E3E,0x3529, + /* Array index: 0x1FAC */ 0x5E41,0x3B57, + /* Array index: 0x1FAC */ 0x5E44,0x3B56, + /* Array index: 0x1FAC */ 0x5E53,0x4979, + /* Array index: 0x1FAC */ 0x5E58,0x4977, + /* Array index: 0x1FAC */ 0x5E59,0x4978, + /* Array index: 0x1FAC */ 0x5E5C,0x503A, + /* Array index: 0x1FAC */ 0x5E5D,0x5038, + /* Array index: 0x1FAC */ 0x5E60,0x5039, + /* Array index: 0x1FAC */ 0x5E75,0x223B, + /* Array index: 0x1FAC */ 0x5E80,0x215A, + /* Array index: 0x1FAC */ 0x5E82,0x215B, + /* Array index: 0x1FAC */ 0x5E84,0x223C, + /* Array index: 0x1FAC */ 0x5E9B,0x2A39, + /* Array index: 0x1FAC */ 0x5EA8,0x2E77, + /* Array index: 0x1FAC */ 0x5EAA,0x2E79, + /* Array index: 0x1FAC */ 0x5EAC,0x2E7A, + /* Array index: 0x1FAC */ 0x5EB9,0x352D, + /* Array index: 0x1FAC */ 0x5ECB,0x4266, + /* Array index: 0x1FAC */ 0x5ECC,0x4264, + /* Array index: 0x1FAC */ 0x5ECE,0x497D, + /* Array index: 0x1FAC */ 0x5EE1,0x503E, + /* Array index: 0x1FAC */ 0x5F02,0x223D, + /* Array index: 0x1FAC */ 0x5F05,0x2372, + /* Array index: 0x1FAC */ 0x5F07,0x2A3C, + /* Array index: 0x1FAC */ 0x5F1A,0x223E, + /* Array index: 0x1FAC */ 0x5F1D,0x2373, + /* Array index: 0x1FAC */ 0x5F28,0x2651, + /* Array index: 0x1FAC */ 0x5F2E,0x2A3D, + /* Array index: 0x1FAC */ 0x5F30,0x2E7C, + /* Array index: 0x1FAC */ 0x5F33,0x2E7B, + /* Array index: 0x1FAC */ 0x5F36,0x3530, + /* Array index: 0x1FAC */ 0x5F38,0x3531, + /* Array index: 0x1FAC */ 0x5F40,0x4268, + /* Array index: 0x1FAC */ 0x5F43,0x4A26, + /* Array index: 0x1FAC */ 0x5F44,0x4A25, + /* Array index: 0x1FAC */ 0x5F49,0x503F, + /* Array index: 0x1FAC */ 0x5F4B,0x567E, + /* Array index: 0x1FAC */ 0x5F4F,0x6F27, + /* Array index: 0x1FAC */ 0x5F54,0x2655, + /* Array index: 0x1FAC */ 0x5F56,0x2A3E, + /* Array index: 0x1FAC */ 0x5F58,0x3B58, + /* Array index: 0x1FAC */ 0x5F67,0x2E7D, + /* Array index: 0x1FAC */ 0x5F6F,0x4A27, + /* Array index: 0x1FAC */ 0x5F73,0x212C, + /* Array index: 0x1FAC */ 0x5F74,0x223F, + /* Array index: 0x1FAC */ 0x5F76,0x2375, + /* Array index: 0x1FAC */ 0x5F78,0x2374, + /* Array index: 0x1FAC */ 0x5F7D,0x2658, + /* Array index: 0x1FAC */ 0x5F7E,0x2657, + /* Array index: 0x1FAC */ 0x5F82,0x2656, + /* Array index: 0x1FAC */ 0x5F86,0x2A3F, + /* Array index: 0x1FAC */ 0x5F96,0x3533, + /* Array index: 0x1FAC */ 0x5F9B,0x3532, + /* Array index: 0x1FAC */ 0x5F9F,0x3534, + /* Array index: 0x1FAC */ 0x5FA5,0x3B5A, + /* Array index: 0x1FAC */ 0x5FA6,0x3B59, + /* Array index: 0x1FAC */ 0x5FAB,0x3B5B, + /* Array index: 0x1FAC */ 0x5FAD,0x426A, + /* Array index: 0x1FAC */ 0x5FAF,0x4269, + /* Array index: 0x1FAC */ 0x5FB2,0x5040, + /* Array index: 0x1FAC */ 0x5FB6,0x4A28, + /* Array index: 0x1FAC */ 0x5FC9,0x215C, + /* Array index: 0x1FAC */ 0x5FDE,0x2659, + /* Array index: 0x1FAC */ 0x5FE8,0x237A, + /* Array index: 0x1FAC */ 0x5FF3,0x237C, + /* Array index: 0x1FAC */ 0x5FF4,0x2427, + /* Array index: 0x1FAC */ 0x5FF7,0x2424, + /* Array index: 0x1FAC */ 0x5FFA,0x2422, + /* Array index: 0x1FAC */ 0x5FFB,0x2425, + /* Array index: 0x1FAC */ 0x6000,0x2426, + /* Array index: 0x1FAC */ 0x6017,0x2662, + /* Array index: 0x1FAC */ 0x6019,0x265D, + /* Array index: 0x1FAC */ 0x601A,0x2664, + /* Array index: 0x1FAC */ 0x601C,0x266F, + /* Array index: 0x1FAC */ 0x601E,0x2665, + /* Array index: 0x1FAC */ 0x6022,0x2667, + /* Array index: 0x1FAC */ 0x6024,0x2A4E, + /* Array index: 0x1FAC */ 0x6026,0x265C, + /* Array index: 0x1FAC */ 0x6037,0x2A40, + /* Array index: 0x1FAC */ 0x6039,0x2A41, + /* Array index: 0x1FAC */ 0x604C,0x2A4A, + /* Array index: 0x1FAC */ 0x6053,0x2A46, + /* Array index: 0x1FAC */ 0x6054,0x2A42, + /* Array index: 0x1FAC */ 0x6058,0x2A50, + /* Array index: 0x1FAC */ 0x6066,0x2A51, + /* Array index: 0x1FAC */ 0x6067,0x2F22, + /* Array index: 0x1FAC */ 0x606E,0x2A52, + /* Array index: 0x1FAC */ 0x6072,0x2A43, + /* Array index: 0x1FAC */ 0x6080,0x2F26, + /* Array index: 0x1FAC */ 0x6081,0x2F28, + /* Array index: 0x1FAC */ 0x6083,0x2F2A, + /* Array index: 0x1FAC */ 0x608E,0x2F30, + /* Array index: 0x1FAC */ 0x6090,0x3536, + /* Array index: 0x1FAC */ 0x6092,0x2F27, + /* Array index: 0x1FAC */ 0x6095,0x2F2B, + /* Array index: 0x1FAC */ 0x6097,0x2F2D, + /* Array index: 0x1FAC */ 0x60A2,0x2F24, + /* Array index: 0x1FAC */ 0x60B0,0x3539, + /* Array index: 0x1FAC */ 0x60B1,0x3542, + /* Array index: 0x1FAC */ 0x60B7,0x3544, + /* Array index: 0x1FAC */ 0x60B9,0x3B5D, + /* Array index: 0x1FAC */ 0x60BA,0x353A, + /* Array index: 0x1FAC */ 0x60D3,0x353B, + /* Array index: 0x1FAC */ 0x60D4,0x353C, + /* Array index: 0x1FAC */ 0x60D9,0x353F, + /* Array index: 0x1FAC */ 0x60DB,0x3543, + /* Array index: 0x1FAC */ 0x60DD,0x3540, + /* Array index: 0x1FAC */ 0x60E2,0x3B5F, + /* Array index: 0x1FAC */ 0x60E4,0x353E, + /* Array index: 0x1FAC */ 0x60F2,0x3B63, + /* Array index: 0x1FAC */ 0x60F5,0x3B67, + /* Array index: 0x1FAC */ 0x60F7,0x426B, + /* Array index: 0x1FAC */ 0x60F8,0x3B69, + /* Array index: 0x1FAC */ 0x60FC,0x3B6A, + /* Array index: 0x1FAC */ 0x60FE,0x3B6B, + /* Array index: 0x1FAC */ 0x60FF,0x3B71, + /* Array index: 0x1FAC */ 0x610A,0x3B64, + /* Array index: 0x1FAC */ 0x610B,0x3B73, + /* Array index: 0x1FAC */ 0x6110,0x3B70, + /* Array index: 0x1FAC */ 0x6113,0x3B68, + /* Array index: 0x1FAC */ 0x6114,0x3B62, + /* Array index: 0x1FAC */ 0x6116,0x3B65, + /* Array index: 0x1FAC */ 0x6118,0x3B6E, + /* Array index: 0x1FAC */ 0x611D,0x3B6F, + /* Array index: 0x1FAC */ 0x6132,0x4271, + /* Array index: 0x1FAC */ 0x6136,0x4270, + /* Array index: 0x1FAC */ 0x613B,0x4A39, + /* Array index: 0x1FAC */ 0x6140,0x4277, + /* Array index: 0x1FAC */ 0x6141,0x4A2B, + /* Array index: 0x1FAC */ 0x6145,0x426F, + /* Array index: 0x1FAC */ 0x6146,0x4273, + /* Array index: 0x1FAC */ 0x6149,0x426C, + /* Array index: 0x1FAC */ 0x614A,0x426D, + /* Array index: 0x1FAC */ 0x614F,0x4275, + /* Array index: 0x1FAC */ 0x615B,0x4A37, + /* Array index: 0x1FAC */ 0x615E,0x4A2C, + /* Array index: 0x1FAC */ 0x6161,0x4A3B, + /* Array index: 0x1FAC */ 0x6165,0x4A38, + /* Array index: 0x1FAC */ 0x6166,0x5051, + /* Array index: 0x1FAC */ 0x616A,0x4A3A, + /* Array index: 0x1FAC */ 0x616C,0x4A32, + /* Array index: 0x1FAC */ 0x6179,0x5043, + /* Array index: 0x1FAC */ 0x617A,0x4A36, + /* Array index: 0x1FAC */ 0x6180,0x4A33, + /* Array index: 0x1FAC */ 0x6183,0x5042, + /* Array index: 0x1FAC */ 0x6192,0x504D, + /* Array index: 0x1FAC */ 0x6193,0x5049, + /* Array index: 0x1FAC */ 0x6196,0x5725, + /* Array index: 0x1FAC */ 0x619B,0x5048, + /* Array index: 0x1FAC */ 0x619D,0x5723, + /* Array index: 0x1FAC */ 0x619F,0x504C, + /* Array index: 0x1FAC */ 0x61A1,0x504F, + /* Array index: 0x1FAC */ 0x61A2,0x5046, + /* Array index: 0x1FAC */ 0x61A8,0x5724, + /* Array index: 0x1FAC */ 0x61AA,0x504E, + /* Array index: 0x1FAC */ 0x61B8,0x572D, + /* Array index: 0x1FAC */ 0x61BA,0x572B, + /* Array index: 0x1FAC */ 0x61BC,0x5C6C, + /* Array index: 0x1FAC */ 0x61BF,0x572C, + /* Array index: 0x1FAC */ 0x61C1,0x5729, + /* Array index: 0x1FAC */ 0x61C3,0x5C6A, + /* Array index: 0x1FAC */ 0x61C5,0x5726, + /* Array index: 0x1FAC */ 0x61C6,0x5728, + /* Array index: 0x1FAC */ 0x61CC,0x572A, + /* Array index: 0x1FAC */ 0x61D6,0x615B, + /* Array index: 0x1FAC */ 0x61D8,0x6153, + /* Array index: 0x1FAC */ 0x61F9,0x6876, + /* Array index: 0x1FAC */ 0x61FB,0x654C, + /* Array index: 0x1FAC */ 0x61FD,0x6B5A, + /* Array index: 0x1FAC */ 0x6201,0x6F28, + /* Array index: 0x1FAC */ 0x6203,0x6F29, + /* Array index: 0x1FAC */ 0x6204,0x6F2A, + /* Array index: 0x1FAC */ 0x6207,0x722A, + /* Array index: 0x1FAC */ 0x6209,0x215D, + /* Array index: 0x1FAC */ 0x6214,0x2670, + /* Array index: 0x1FAC */ 0x6219,0x2F31, + /* Array index: 0x1FAC */ 0x6220,0x4278, + /* Array index: 0x1FAC */ 0x623A,0x2428, + /* Array index: 0x1FAC */ 0x623D,0x2671, + /* Array index: 0x1FAC */ 0x6242,0x2A53, + /* Array index: 0x1FAC */ 0x6243,0x2A54, + /* Array index: 0x1FAC */ 0x6246,0x2F32, + /* Array index: 0x1FAC */ 0x624A,0x3B74, + /* Array index: 0x1FAC */ 0x6250,0x215E, + /* Array index: 0x1FAC */ 0x6259,0x2249, + /* Array index: 0x1FAC */ 0x625A,0x224B, + /* Array index: 0x1FAC */ 0x625C,0x2243, + /* Array index: 0x1FAC */ 0x6277,0x2435, + /* Array index: 0x1FAC */ 0x627A,0x2431, + /* Array index: 0x1FAC */ 0x627B,0x2430, + /* Array index: 0x1FAC */ 0x627D,0x2436, + /* Array index: 0x1FAC */ 0x6281,0x2433, + /* Array index: 0x1FAC */ 0x6283,0x2429, + /* Array index: 0x1FAC */ 0x6287,0x242E, + /* Array index: 0x1FAC */ 0x6288,0x2434, + /* Array index: 0x1FAC */ 0x628C,0x242A, + /* Array index: 0x1FAC */ 0x628E,0x242B, + /* Array index: 0x1FAC */ 0x628F,0x242C, + /* Array index: 0x1FAC */ 0x6294,0x242D, + /* Array index: 0x1FAC */ 0x62BB,0x267C, + /* Array index: 0x1FAC */ 0x62BE,0x2675, + /* Array index: 0x1FAC */ 0x62CA,0x2678, + /* Array index: 0x1FAC */ 0x62CF,0x2A55, + /* Array index: 0x1FAC */ 0x62D1,0x2674, + /* Array index: 0x1FAC */ 0x62EB,0x2A5B, + /* Array index: 0x1FAC */ 0x62F0,0x2A67, + /* Array index: 0x1FAC */ 0x62F2,0x2F33, + /* Array index: 0x1FAC */ 0x6300,0x2A61, + /* Array index: 0x1FAC */ 0x6303,0x2A5A, + /* Array index: 0x1FAC */ 0x6329,0x2F40, + /* Array index: 0x1FAC */ 0x632C,0x2F36, + /* Array index: 0x1FAC */ 0x632D,0x2F46, + /* Array index: 0x1FAC */ 0x6351,0x2F4A, + /* Array index: 0x1FAC */ 0x6365,0x354B, + /* Array index: 0x1FAC */ 0x6375,0x355B, + /* Array index: 0x1FAC */ 0x6378,0x3563, + /* Array index: 0x1FAC */ 0x637C,0x355F, + /* Array index: 0x1FAC */ 0x637D,0x354E, + /* Array index: 0x1FAC */ 0x6381,0x3565, + /* Array index: 0x1FAC */ 0x6382,0x354D, + /* Array index: 0x1FAC */ 0x6385,0x3564, + /* Array index: 0x1FAC */ 0x6387,0x3557, + /* Array index: 0x1FAC */ 0x638A,0x354C, + /* Array index: 0x1FAC */ 0x6394,0x3B75, + /* Array index: 0x1FAC */ 0x6397,0x3553, + /* Array index: 0x1FAC */ 0x63A4,0x3560, + /* Array index: 0x1FAC */ 0x63BD,0x354F, + /* Array index: 0x1FAC */ 0x63BE,0x3C29, + /* Array index: 0x1FAC */ 0x63D3,0x3C2E, + /* Array index: 0x1FAC */ 0x63EB,0x4321, + /* Array index: 0x1FAC */ 0x6415,0x432A, + /* Array index: 0x1FAC */ 0x6418,0x432B, + /* Array index: 0x1FAC */ 0x641A,0x4338, + /* Array index: 0x1FAC */ 0x641B,0x433E, + /* Array index: 0x1FAC */ 0x642B,0x4A40, + /* Array index: 0x1FAC */ 0x6433,0x4327, + /* Array index: 0x1FAC */ 0x6435,0x4335, + /* Array index: 0x1FAC */ 0x6437,0x432D, + /* Array index: 0x1FAC */ 0x6439,0x432C, + /* Array index: 0x1FAC */ 0x644B,0x4A50, + /* Array index: 0x1FAC */ 0x644D,0x4A41, + /* Array index: 0x1FAC */ 0x644E,0x4A4C, + /* Array index: 0x1FAC */ 0x6450,0x4A53, + /* Array index: 0x1FAC */ 0x6453,0x4A51, + /* Array index: 0x1FAC */ 0x6465,0x4A59, + /* Array index: 0x1FAC */ 0x6466,0x4A4A, + /* Array index: 0x1FAC */ 0x6468,0x5061, + /* Array index: 0x1FAC */ 0x646B,0x4A57, + /* Array index: 0x1FAC */ 0x646C,0x4A56, + /* Array index: 0x1FAC */ 0x646E,0x5054, + /* Array index: 0x1FAC */ 0x647D,0x4A48, + /* Array index: 0x1FAC */ 0x647F,0x4A54, + /* Array index: 0x1FAC */ 0x6482,0x4A4D, + /* Array index: 0x1FAC */ 0x6485,0x5058, + /* Array index: 0x1FAC */ 0x648F,0x505B, + /* Array index: 0x1FAC */ 0x64A3,0x505F, + /* Array index: 0x1FAC */ 0x64A6,0x4A4B, + /* Array index: 0x1FAC */ 0x64B1,0x5062, + /* Array index: 0x1FAC */ 0x64BD,0x5734, + /* Array index: 0x1FAC */ 0x64C3,0x5736, + /* Array index: 0x1FAC */ 0x64C9,0x5733, + /* Array index: 0x1FAC */ 0x64CF,0x5732, + /* Array index: 0x1FAC */ 0x64D0,0x5731, + /* Array index: 0x1FAC */ 0x64D6,0x5730, + /* Array index: 0x1FAC */ 0x64D7,0x572F, + /* Array index: 0x1FAC */ 0x64D9,0x5739, + /* Array index: 0x1FAC */ 0x64DB,0x5737, + /* Array index: 0x1FAC */ 0x64E3,0x5C75, + /* Array index: 0x1FAC */ 0x64E4,0x5C77, + /* Array index: 0x1FAC */ 0x64E8,0x5C78, + /* Array index: 0x1FAC */ 0x64E9,0x5C74, + /* Array index: 0x1FAC */ 0x64EB,0x5C76, + /* Array index: 0x1FAC */ 0x64EF,0x5C73, + /* Array index: 0x1FAC */ 0x64F3,0x5738, + /* Array index: 0x1FAC */ 0x64F8,0x6160, + /* Array index: 0x1FAC */ 0x64FC,0x6163, + /* Array index: 0x1FAC */ 0x64FD,0x615F, + /* Array index: 0x1FAC */ 0x64FF,0x615D, + /* Array index: 0x1FAC */ 0x6501,0x6161, + /* Array index: 0x1FAC */ 0x6503,0x6162, + /* Array index: 0x1FAC */ 0x6504,0x615E, + /* Array index: 0x1FAC */ 0x6507,0x654D, + /* Array index: 0x1FAC */ 0x6509,0x6550, + /* Array index: 0x1FAC */ 0x651B,0x6B5B, + /* Array index: 0x1FAC */ 0x6529,0x6F2B, + /* Array index: 0x1FAC */ 0x652D,0x7037, + /* Array index: 0x1FAC */ 0x652E,0x707D, + /* Array index: 0x1FAC */ 0x6532,0x3C37, + /* Array index: 0x1FAC */ 0x6533,0x573A, + /* Array index: 0x1FAC */ 0x6537,0x224D, + /* Array index: 0x1FAC */ 0x653D,0x2722, + /* Array index: 0x1FAC */ 0x6541,0x2A68, + /* Array index: 0x1FAC */ 0x6543,0x2A69, + /* Array index: 0x1FAC */ 0x6546,0x2F50, + /* Array index: 0x1FAC */ 0x654A,0x2F4F, + /* Array index: 0x1FAC */ 0x6553,0x3569, + /* Array index: 0x1FAC */ 0x655C,0x3C3B, + /* Array index: 0x1FAC */ 0x656F,0x4342, + /* Array index: 0x1FAC */ 0x6573,0x4A5B, + /* Array index: 0x1FAC */ 0x6576,0x5064, + /* Array index: 0x1FAC */ 0x6584,0x6553, + /* Array index: 0x1FAC */ 0x658C,0x3C3E, + /* Array index: 0x1FAC */ 0x6592,0x4343, + /* Array index: 0x1FAC */ 0x6594,0x6164, + /* Array index: 0x1FAC */ 0x6596,0x6F2D, + /* Array index: 0x1FAC */ 0x659D,0x3C3F, + /* Array index: 0x1FAC */ 0x659E,0x3C40, + /* Array index: 0x1FAC */ 0x65A0,0x4A5C, + /* Array index: 0x1FAC */ 0x65A2,0x573D, + /* Array index: 0x1FAC */ 0x65A8,0x2723, + /* Array index: 0x1FAC */ 0x65AA,0x2A6A, + /* Array index: 0x1FAC */ 0x65AE,0x3C41, + /* Array index: 0x1FAC */ 0x65B2,0x5068, + /* Array index: 0x1FAC */ 0x65B3,0x5069, + /* Array index: 0x1FAC */ 0x65B6,0x5C7B, + /* Array index: 0x1FAC */ 0x65B8,0x707E, + /* Array index: 0x1FAC */ 0x65BB,0x2724, + /* Array index: 0x1FAC */ 0x65BF,0x2A6B, + /* Array index: 0x1FAC */ 0x65CD,0x356A, + /* Array index: 0x1FAC */ 0x65D0,0x3C42, + /* Array index: 0x1FAC */ 0x65D2,0x3C43, + /* Array index: 0x1FAC */ 0x65D3,0x4344, + /* Array index: 0x1FAC */ 0x661C,0x2A70, + /* Array index: 0x1FAC */ 0x661D,0x2A76, + /* Array index: 0x1FAC */ 0x6621,0x2A6D, + /* Array index: 0x1FAC */ 0x6622,0x2A72, + /* Array index: 0x1FAC */ 0x6626,0x2A71, + /* Array index: 0x1FAC */ 0x662B,0x2A74, + /* Array index: 0x1FAC */ 0x662E,0x2A79, + /* Array index: 0x1FAC */ 0x6647,0x2F57, + /* Array index: 0x1FAC */ 0x664A,0x2F55, + /* Array index: 0x1FAC */ 0x6651,0x2F58, + /* Array index: 0x1FAC */ 0x6659,0x356E, + /* Array index: 0x1FAC */ 0x665B,0x356D, + /* Array index: 0x1FAC */ 0x665C,0x356F, + /* Array index: 0x1FAC */ 0x665F,0x2F56, + /* Array index: 0x1FAC */ 0x6661,0x356C, + /* Array index: 0x1FAC */ 0x6662,0x3570, + /* Array index: 0x1FAC */ 0x6665,0x356B, + /* Array index: 0x1FAC */ 0x666A,0x3C4A, + /* Array index: 0x1FAC */ 0x666C,0x3C45, + /* Array index: 0x1FAC */ 0x6671,0x3C48, + /* Array index: 0x1FAC */ 0x6672,0x3C4B, + /* Array index: 0x1FAC */ 0x6680,0x3C47, + /* Array index: 0x1FAC */ 0x6686,0x4345, + /* Array index: 0x1FAC */ 0x6690,0x4348, + /* Array index: 0x1FAC */ 0x6694,0x434C, + /* Array index: 0x1FAC */ 0x6695,0x4347, + /* Array index: 0x1FAC */ 0x6699,0x434B, + /* Array index: 0x1FAC */ 0x66A9,0x506C, + /* Array index: 0x1FAC */ 0x66AA,0x506F, + /* Array index: 0x1FAC */ 0x66AF,0x5070, + /* Array index: 0x1FAC */ 0x66B0,0x506B, + /* Array index: 0x1FAC */ 0x66B2,0x506D, + /* Array index: 0x1FAC */ 0x66B5,0x506A, + /* Array index: 0x1FAC */ 0x66B7,0x506E, + /* Array index: 0x1FAC */ 0x66CF,0x5743, + /* Array index: 0x1FAC */ 0x66D2,0x5C7D, + /* Array index: 0x1FAC */ 0x66D8,0x6168, + /* Array index: 0x1FAC */ 0x66DA,0x6166, + /* Array index: 0x1FAC */ 0x66DB,0x6167, + /* Array index: 0x1FAC */ 0x66DE,0x6556, + /* Array index: 0x1FAC */ 0x66E3,0x687D, + /* Array index: 0x1FAC */ 0x66E4,0x687E, + /* Array index: 0x1FAC */ 0x66E8,0x687C, + /* Array index: 0x1FAC */ 0x66EB,0x6F2E, + /* Array index: 0x1FAC */ 0x66ED,0x7038, + /* Array index: 0x1FAC */ 0x66EE,0x7039, + /* Array index: 0x1FAC */ 0x66F6,0x2732, + /* Array index: 0x1FAC */ 0x6701,0x3C4C, + /* Array index: 0x1FAC */ 0x6704,0x4A61, + /* Array index: 0x1FAC */ 0x6705,0x4A60, + /* Array index: 0x1FAC */ 0x670A,0x2733, + /* Array index: 0x1FAC */ 0x6718,0x3571, + /* Array index: 0x1FAC */ 0x6733,0x2257, + /* Array index: 0x1FAC */ 0x6745,0x243E, + /* Array index: 0x1FAC */ 0x6755,0x2441, + /* Array index: 0x1FAC */ 0x6759,0x2440, + /* Array index: 0x1FAC */ 0x675A,0x2446, + /* Array index: 0x1FAC */ 0x675D,0x2444, + /* Array index: 0x1FAC */ 0x676C,0x2735, + /* Array index: 0x1FAC */ 0x6774,0x273D, + /* Array index: 0x1FAC */ 0x6798,0x273A, + /* Array index: 0x1FAC */ 0x6799,0x2743, + /* Array index: 0x1FAC */ 0x679F,0x2741, + /* Array index: 0x1FAC */ 0x67AE,0x2B3D, + /* Array index: 0x1FAC */ 0x67B2,0x2B38, + /* Array index: 0x1FAC */ 0x67B3,0x2B2E, + /* Array index: 0x1FAC */ 0x67B5,0x2B2C, + /* Array index: 0x1FAC */ 0x67D8,0x2B25, + /* Array index: 0x1FAC */ 0x67DB,0x2B3F, + /* Array index: 0x1FAC */ 0x67DC,0x2B22, + /* Array index: 0x1FAC */ 0x67DF,0x2B2B, + /* Array index: 0x1FAC */ 0x6812,0x2F6E, + /* Array index: 0x1FAC */ 0x6814,0x2F6F, + /* Array index: 0x1FAC */ 0x6816,0x2F63, + /* Array index: 0x1FAC */ 0x681A,0x2F5C, + /* Array index: 0x1FAC */ 0x6825,0x2F75, + /* Array index: 0x1FAC */ 0x6826,0x2F70, + /* Array index: 0x1FAC */ 0x6828,0x2F71, + /* Array index: 0x1FAC */ 0x683A,0x2F74, + /* Array index: 0x1FAC */ 0x683B,0x2F60, + /* Array index: 0x1FAC */ 0x6844,0x2F6B, + /* Array index: 0x1FAC */ 0x6849,0x2F5D, + /* Array index: 0x1FAC */ 0x6896,0x362F, + /* Array index: 0x1FAC */ 0x689B,0x362E, + /* Array index: 0x1FAC */ 0x689C,0x3575, + /* Array index: 0x1FAC */ 0x68A0,0x3631, + /* Array index: 0x1FAC */ 0x68A3,0x357C, + /* Array index: 0x1FAC */ 0x68A4,0x3633, + /* Array index: 0x1FAC */ 0x68B2,0x3623, + /* Array index: 0x1FAC */ 0x68B4,0x3C63, + /* Array index: 0x1FAC */ 0x68CC,0x3C60, + /* Array index: 0x1FAC */ 0x68CE,0x3C70, + /* Array index: 0x1FAC */ 0x68E1,0x3C5E, + /* Array index: 0x1FAC */ 0x68E4,0x3C59, + /* Array index: 0x1FAC */ 0x68FC,0x3C6B, + /* Array index: 0x1FAC */ 0x68FD,0x3C6A, + /* Array index: 0x1FAC */ 0x6925,0x3C7B, + /* Array index: 0x1FAC */ 0x692A,0x3C51, + /* Array index: 0x1FAC */ 0x692F,0x4378, + /* Array index: 0x1FAC */ 0x695C,0x4373, + /* Array index: 0x1FAC */ 0x695F,0x4350, + /* Array index: 0x1FAC */ 0x6962,0x4353, + /* Array index: 0x1FAC */ 0x6965,0x4363, + /* Array index: 0x1FAC */ 0x6966,0x434F, + /* Array index: 0x1FAC */ 0x6969,0x4367, + /* Array index: 0x1FAC */ 0x696A,0x4357, + /* Array index: 0x1FAC */ 0x696C,0x4360, + /* Array index: 0x1FAC */ 0x6974,0x436E, + /* Array index: 0x1FAC */ 0x6976,0x436B, + /* Array index: 0x1FAC */ 0x6978,0x4365, + /* Array index: 0x1FAC */ 0x697A,0x435C, + /* Array index: 0x1FAC */ 0x697B,0x4379, + /* Array index: 0x1FAC */ 0x6983,0x452C, + /* Array index: 0x1FAC */ 0x699E,0x4B23, + /* Array index: 0x1FAC */ 0x69A0,0x4A66, + /* Array index: 0x1FAC */ 0x69A1,0x4B22, + /* Array index: 0x1FAC */ 0x69A4,0x4A77, + /* Array index: 0x1FAC */ 0x69A5,0x4B29, + /* Array index: 0x1FAC */ 0x69A7,0x4A6F, + /* Array index: 0x1FAC */ 0x69A9,0x4A71, + /* Array index: 0x1FAC */ 0x69AA,0x4B21, + /* Array index: 0x1FAC */ 0x69AC,0x4A6A, + /* Array index: 0x1FAC */ 0x69B9,0x4A79, + /* Array index: 0x1FAC */ 0x69C2,0x4B27, + /* Array index: 0x1FAC */ 0x69C4,0x4A75, + /* Array index: 0x1FAC */ 0x69C6,0x4B2A, + /* Array index: 0x1FAC */ 0x69C9,0x4A65, + /* Array index: 0x1FAC */ 0x69CA,0x4A7A, + /* Array index: 0x1FAC */ 0x69CE,0x4A67, + /* Array index: 0x1FAC */ 0x69CF,0x4A7C, + /* Array index: 0x1FAC */ 0x69D4,0x4A78, + /* Array index: 0x1FAC */ 0x69D9,0x4B24, + /* Array index: 0x1FAC */ 0x69EB,0x512E, + /* Array index: 0x1FAC */ 0x69EC,0x507B, + /* Array index: 0x1FAC */ 0x69EE,0x5124, + /* Array index: 0x1FAC */ 0x69F1,0x5077, + /* Array index: 0x1FAC */ 0x69F2,0x5123, + /* Array index: 0x1FAC */ 0x6A0D,0x512C, + /* Array index: 0x1FAC */ 0x6A0F,0x5133, + /* Array index: 0x1FAC */ 0x6A1B,0x507D, + /* Array index: 0x1FAC */ 0x6A1D,0x507E, + /* Array index: 0x1FAC */ 0x6A20,0x5079, + /* Array index: 0x1FAC */ 0x6A32,0x574D, + /* Array index: 0x1FAC */ 0x6A34,0x5749, + /* Array index: 0x1FAC */ 0x6A46,0x5768, + /* Array index: 0x1FAC */ 0x6A49,0x574B, + /* Array index: 0x1FAC */ 0x6A6D,0x5751, + /* Array index: 0x1FAC */ 0x6A6F,0x575F, + /* Array index: 0x1FAC */ 0x6A76,0x5752, + /* Array index: 0x1FAC */ 0x6A7F,0x5D31, + /* Array index: 0x1FAC */ 0x6A81,0x5D22, + /* Array index: 0x1FAC */ 0x6A83,0x5D2D, + /* Array index: 0x1FAC */ 0x6A85,0x5D34, + /* Array index: 0x1FAC */ 0x6A87,0x5D29, + /* Array index: 0x1FAC */ 0x6A89,0x5D24, + /* Array index: 0x1FAC */ 0x6A9A,0x5D33, + /* Array index: 0x1FAC */ 0x6A9B,0x5D26, + /* Array index: 0x1FAC */ 0x6A9E,0x5D28, + /* Array index: 0x1FAC */ 0x6A9F,0x5D25, + /* Array index: 0x1FAC */ 0x6AA1,0x5D27, + /* Array index: 0x1FAC */ 0x6AAD,0x6173, + /* Array index: 0x1FAC */ 0x6AB4,0x6172, + /* Array index: 0x1FAC */ 0x6ABD,0x616B, + /* Array index: 0x1FAC */ 0x6AD9,0x655B, + /* Array index: 0x1FAC */ 0x6AF8,0x6B5F, + /* Array index: 0x1FAC */ 0x6AF9,0x6925, + /* Array index: 0x1FAC */ 0x6AFC,0x6B5D, + /* Array index: 0x1FAC */ 0x6B00,0x6B60, + /* Array index: 0x1FAC */ 0x6B02,0x6B5C, + /* Array index: 0x1FAC */ 0x6B03,0x6B5E, + /* Array index: 0x1FAC */ 0x6B08,0x6D53, + /* Array index: 0x1FAC */ 0x6B09,0x6D54, + /* Array index: 0x1FAC */ 0x6B0B,0x6D52, + /* Array index: 0x1FAC */ 0x6B1E,0x722B, + /* Array index: 0x1FAC */ 0x6B25,0x274A, + /* Array index: 0x1FAC */ 0x6B28,0x2B46, + /* Array index: 0x1FAC */ 0x6B2C,0x2F77, + /* Array index: 0x1FAC */ 0x6B2D,0x2F79, + /* Array index: 0x1FAC */ 0x6B2F,0x2F78, + /* Array index: 0x1FAC */ 0x6B31,0x2F7A, + /* Array index: 0x1FAC */ 0x6B51,0x5139, + /* Array index: 0x1FAC */ 0x6B5B,0x5D37, + /* Array index: 0x1FAC */ 0x6B5E,0x6174, + /* Array index: 0x1FAC */ 0x6B60,0x6564, + /* Array index: 0x1FAC */ 0x6B6D,0x2F7C, + /* Array index: 0x1FAC */ 0x6B76,0x5259, + /* Array index: 0x1FAC */ 0x6B7E,0x274C, + /* Array index: 0x1FAC */ 0x6B80,0x274B, + /* Array index: 0x1FAC */ 0x6B82,0x2B47, + /* Array index: 0x1FAC */ 0x6B84,0x2B48, + /* Array index: 0x1FAC */ 0x6B88,0x2F7E, + /* Array index: 0x1FAC */ 0x6BB0,0x6565, + /* Array index: 0x1FAC */ 0x6BB3,0x213F, + /* Array index: 0x1FAC */ 0x6BB6,0x2B49, + /* Array index: 0x1FAC */ 0x6BBD,0x3D27, + /* Array index: 0x1FAC */ 0x6BD0,0x2448, + /* Array index: 0x1FAC */ 0x6BD6,0x2B4A, + /* Array index: 0x1FAC */ 0x6BD8,0x2B4B, + /* Array index: 0x1FAC */ 0x6BDE,0x274D, + /* Array index: 0x1FAC */ 0x6BF0,0x3D28, + /* Array index: 0x1FAC */ 0x6BF2,0x3D29, + /* Array index: 0x1FAC */ 0x6BF3,0x3D2A, + /* Array index: 0x1FAC */ 0x6C1D,0x274E, + /* Array index: 0x1FAC */ 0x6C20,0x2B4D, + /* Array index: 0x1FAC */ 0x6C21,0x2B4E, + /* Array index: 0x1FAC */ 0x6C25,0x3027, + /* Array index: 0x1FAC */ 0x6C2A,0x3643, + /* Array index: 0x1FAC */ 0x6C30,0x3D2B, + /* Array index: 0x1FAC */ 0x6C36,0x2160, + /* Array index: 0x1FAC */ 0x6C3B,0x2163, + /* Array index: 0x1FAC */ 0x6C3F,0x2162, + /* Array index: 0x1FAC */ 0x6C43,0x2161, + /* Array index: 0x1FAC */ 0x6C46,0x2259, + /* Array index: 0x1FAC */ 0x6C4F,0x225C, + /* Array index: 0x1FAC */ 0x6C52,0x225A, + /* Array index: 0x1FAC */ 0x6C54,0x225E, + /* Array index: 0x1FAC */ 0x6C5C,0x225B, + /* Array index: 0x1FAC */ 0x6C78,0x244B, + /* Array index: 0x1FAC */ 0x6C7B,0x245C, + /* Array index: 0x1FAC */ 0x6C80,0x2765, + /* Array index: 0x1FAC */ 0x6C84,0x244E, + /* Array index: 0x1FAC */ 0x6C87,0x2456, + /* Array index: 0x1FAC */ 0x6C8A,0x2763, + /* Array index: 0x1FAC */ 0x6C8B,0x244F, + /* Array index: 0x1FAC */ 0x6C8E,0x245D, + /* Array index: 0x1FAC */ 0x6C8F,0x2450, + /* Array index: 0x1FAC */ 0x6C93,0x274F, + /* Array index: 0x1FAC */ 0x6C95,0x2457, + /* Array index: 0x1FAC */ 0x6C9A,0x2454, + /* Array index: 0x1FAC */ 0x6C9C,0x2458, + /* Array index: 0x1FAC */ 0x6C9D,0x2764, + /* Array index: 0x1FAC */ 0x6CAD,0x2756, + /* Array index: 0x1FAC */ 0x6CB0,0x276B, + /* Array index: 0x1FAC */ 0x6CB4,0x2762, + /* Array index: 0x1FAC */ 0x6CB6,0x2754, + /* Array index: 0x1FAC */ 0x6CB7,0x2758, + /* Array index: 0x1FAC */ 0x6CBA,0x275B, + /* Array index: 0x1FAC */ 0x6CC0,0x2767, + /* Array index: 0x1FAC */ 0x6CC2,0x275A, + /* Array index: 0x1FAC */ 0x6CC3,0x275C, + /* Array index: 0x1FAC */ 0x6CC6,0x275D, + /* Array index: 0x1FAC */ 0x6CC7,0x276A, + /* Array index: 0x1FAC */ 0x6CD9,0x2753, + /* Array index: 0x1FAC */ 0x6CDA,0x2B57, + /* Array index: 0x1FAC */ 0x6CDD,0x2761, + /* Array index: 0x1FAC */ 0x6CDE,0x2766, + /* Array index: 0x1FAC */ 0x6CE7,0x2757, + /* Array index: 0x1FAC */ 0x6CF2,0x275F, + /* Array index: 0x1FAC */ 0x6CF9,0x276C, + /* Array index: 0x1FAC */ 0x6D1D,0x2B5F, + /* Array index: 0x1FAC */ 0x6D1F,0x2B52, + /* Array index: 0x1FAC */ 0x6D20,0x2B68, + /* Array index: 0x1FAC */ 0x6D22,0x2B6B, + /* Array index: 0x1FAC */ 0x6D28,0x2B4F, + /* Array index: 0x1FAC */ 0x6D37,0x2B63, + /* Array index: 0x1FAC */ 0x6D3A,0x2B5B, + /* Array index: 0x1FAC */ 0x6D3C,0x2B53, + /* Array index: 0x1FAC */ 0x6D3F,0x2B54, + /* Array index: 0x1FAC */ 0x6D40,0x2B66, + /* Array index: 0x1FAC */ 0x6D42,0x2B60, + /* Array index: 0x1FAC */ 0x6D58,0x302F, + /* Array index: 0x1FAC */ 0x6D6D,0x3031, + /* Array index: 0x1FAC */ 0x6D6F,0x3032, + /* Array index: 0x1FAC */ 0x6D70,0x303C, + /* Array index: 0x1FAC */ 0x6D75,0x304B, + /* Array index: 0x1FAC */ 0x6D76,0x302B, + /* Array index: 0x1FAC */ 0x6D8B,0x3043, + /* Array index: 0x1FAC */ 0x6D8D,0x3034, + /* Array index: 0x1FAC */ 0x6D97,0x303B, + /* Array index: 0x1FAC */ 0x6D98,0x3040, + /* Array index: 0x1FAC */ 0x6DAB,0x3645, + /* Array index: 0x1FAC */ 0x6DAC,0x3649, + /* Array index: 0x1FAC */ 0x6DB3,0x3647, + /* Array index: 0x1FAC */ 0x6DB4,0x3646, + /* Array index: 0x1FAC */ 0x6DB7,0x364C, + /* Array index: 0x1FAC */ 0x6DCD,0x3668, + /* Array index: 0x1FAC */ 0x6DE9,0x364A, + /* Array index: 0x1FAC */ 0x6DED,0x365C, + /* Array index: 0x1FAC */ 0x6DEF,0x3035, + /* Array index: 0x1FAC */ 0x6DF0,0x365D, + /* Array index: 0x1FAC */ 0x6DF2,0x3664, + /* Array index: 0x1FAC */ 0x6DF4,0x3659, + /* Array index: 0x1FAC */ 0x6DF6,0x364D, + /* Array index: 0x1FAC */ 0x6DFC,0x3D2C, + /* Array index: 0x1FAC */ 0x6DFD,0x3666, + /* Array index: 0x1FAC */ 0x6E00,0x364F, + /* Array index: 0x1FAC */ 0x6E03,0x3D41, + /* Array index: 0x1FAC */ 0x6E1C,0x3D3B, + /* Array index: 0x1FAC */ 0x6E1F,0x3D2F, + /* Array index: 0x1FAC */ 0x6E22,0x3D4D, + /* Array index: 0x1FAC */ 0x6E27,0x3D51, + /* Array index: 0x1FAC */ 0x6E28,0x3D48, + /* Array index: 0x1FAC */ 0x6E2B,0x3D36, + /* Array index: 0x1FAC */ 0x6E2E,0x3D42, + /* Array index: 0x1FAC */ 0x6E30,0x3D4E, + /* Array index: 0x1FAC */ 0x6E31,0x3D47, + /* Array index: 0x1FAC */ 0x6E33,0x3D3C, + /* Array index: 0x1FAC */ 0x6E35,0x3D59, + /* Array index: 0x1FAC */ 0x6E36,0x3D5A, + /* Array index: 0x1FAC */ 0x6E6B,0x3D4B, + /* Array index: 0x1FAC */ 0x6E71,0x3D4A, + /* Array index: 0x1FAC */ 0x6E88,0x3D31, + /* Array index: 0x1FAC */ 0x6E97,0x444E, + /* Array index: 0x1FAC */ 0x6E99,0x4444, + /* Array index: 0x1FAC */ 0x6E9B,0x4429, + /* Array index: 0x1FAC */ 0x6EB7,0x443A, + /* Array index: 0x1FAC */ 0x6EB9,0x4433, + /* Array index: 0x1FAC */ 0x6ED6,0x442A, + /* Array index: 0x1FAC */ 0x6ED8,0x4443, + /* Array index: 0x1FAC */ 0x6EDC,0x4442, + /* Array index: 0x1FAC */ 0x6EEB,0x4B50, + /* Array index: 0x1FAC */ 0x6EED,0x4B45, + /* Array index: 0x1FAC */ 0x6EEE,0x4B4A, + /* Array index: 0x1FAC */ 0x6EF1,0x4B36, + /* Array index: 0x1FAC */ 0x6F00,0x515B, + /* Array index: 0x1FAC */ 0x6F03,0x4B37, + /* Array index: 0x1FAC */ 0x6F12,0x4B44, + /* Array index: 0x1FAC */ 0x6F2D,0x4B4B, + /* Array index: 0x1FAC */ 0x6F2E,0x4B3C, + /* Array index: 0x1FAC */ 0x6F30,0x4B4D, + /* Array index: 0x1FAC */ 0x6F40,0x4B4C, + /* Array index: 0x1FAC */ 0x6F41,0x5142, + /* Array index: 0x1FAC */ 0x6F43,0x4B53, + /* Array index: 0x1FAC */ 0x6F5A,0x514E, + /* Array index: 0x1FAC */ 0x6F72,0x5154, + /* Array index: 0x1FAC */ 0x6F73,0x4B48, + /* Array index: 0x1FAC */ 0x6F76,0x5150, + /* Array index: 0x1FAC */ 0x6F77,0x5167, + /* Array index: 0x1FAC */ 0x6F82,0x5152, + /* Array index: 0x1FAC */ 0x6F85,0x514D, + /* Array index: 0x1FAC */ 0x6F87,0x5145, + /* Array index: 0x1FAC */ 0x6F9E,0x577E, + /* Array index: 0x1FAC */ 0x6FA2,0x582C, + /* Array index: 0x1FAC */ 0x6FA3,0x5776, + /* Array index: 0x1FAC */ 0x6FA5,0x5824, + /* Array index: 0x1FAC */ 0x6FB8,0x582B, + /* Array index: 0x1FAC */ 0x6FBA,0x5826, + /* Array index: 0x1FAC */ 0x6FBC,0x5778, + /* Array index: 0x1FAC */ 0x6FBD,0x577D, + /* Array index: 0x1FAC */ 0x6FBF,0x582A, + /* Array index: 0x1FAC */ 0x6FD4,0x5D3D, + /* Array index: 0x1FAC */ 0x6FED,0x5D40, + /* Array index: 0x1FAC */ 0x6FF2,0x5D44, + /* Array index: 0x1FAC */ 0x6FF4,0x5D3C, + /* Array index: 0x1FAC */ 0x6FF7,0x6225, + /* Array index: 0x1FAC */ 0x7014,0x617C, + /* Array index: 0x1FAC */ 0x7016,0x656A, + /* Array index: 0x1FAC */ 0x7017,0x6570, + /* Array index: 0x1FAC */ 0x7019,0x6567, + /* Array index: 0x1FAC */ 0x701C,0x6572, + /* Array index: 0x1FAC */ 0x702F,0x692B, + /* Array index: 0x1FAC */ 0x7052,0x6D59, + /* Array index: 0x1FAC */ 0x7071,0x2261, + /* Array index: 0x1FAC */ 0x7074,0x245E, + /* Array index: 0x1FAC */ 0x707A,0x245F, + /* Array index: 0x1FAC */ 0x7091,0x2776, + /* Array index: 0x1FAC */ 0x7093,0x2773, + /* Array index: 0x1FAC */ 0x7094,0x2770, + /* Array index: 0x1FAC */ 0x7096,0x2777, + /* Array index: 0x1FAC */ 0x7098,0x2771, + /* Array index: 0x1FAC */ 0x709A,0x2779, + /* Array index: 0x1FAC */ 0x709F,0x2B6F, + /* Array index: 0x1FAC */ 0x70A1,0x2B73, + /* Array index: 0x1FAC */ 0x70A9,0x2B76, + /* Array index: 0x1FAC */ 0x70B0,0x2B72, + /* Array index: 0x1FAC */ 0x70B1,0x2B71, + /* Array index: 0x1FAC */ 0x70B4,0x2B74, + /* Array index: 0x1FAC */ 0x70B5,0x2B75, + /* Array index: 0x1FAC */ 0x70B7,0x2B6E, + /* Array index: 0x1FAC */ 0x70BE,0x2B70, + /* Array index: 0x1FAC */ 0x70CB,0x3051, + /* Array index: 0x1FAC */ 0x70D7,0x3054, + /* Array index: 0x1FAC */ 0x70F0,0x3671, + /* Array index: 0x1FAC */ 0x7113,0x3678, + /* Array index: 0x1FAC */ 0x7117,0x366E, + /* Array index: 0x1FAC */ 0x711B,0x3D69, + /* Array index: 0x1FAC */ 0x7128,0x3D67, + /* Array index: 0x1FAC */ 0x713A,0x3D68, + /* Array index: 0x1FAC */ 0x7147,0x4451, + /* Array index: 0x1FAC */ 0x714B,0x4460, + /* Array index: 0x1FAC */ 0x714D,0x4466, + /* Array index: 0x1FAC */ 0x7158,0x445E, + /* Array index: 0x1FAC */ 0x715A,0x4467, + /* Array index: 0x1FAC */ 0x716A,0x445B, + /* Array index: 0x1FAC */ 0x7170,0x4461, + /* Array index: 0x1FAC */ 0x7172,0x4459, + /* Array index: 0x1FAC */ 0x7178,0x445A, + /* Array index: 0x1FAC */ 0x717B,0x4B67, + /* Array index: 0x1FAC */ 0x718F,0x4B66, + /* Array index: 0x1FAC */ 0x7190,0x4B61, + /* Array index: 0x1FAC */ 0x7197,0x4B6A, + /* Array index: 0x1FAC */ 0x71B8,0x5836, + /* Array index: 0x1FAC */ 0x71CF,0x583E, + /* Array index: 0x1FAC */ 0x71D4,0x583B, + /* Array index: 0x1FAC */ 0x71D6,0x5837, + /* Array index: 0x1FAC */ 0x71D8,0x5840, + /* Array index: 0x1FAC */ 0x71DA,0x5843, + /* Array index: 0x1FAC */ 0x71DB,0x5844, + /* Array index: 0x1FAC */ 0x71E1,0x5D48, + /* Array index: 0x1FAC */ 0x71E2,0x5D4E, + /* Array index: 0x1FAC */ 0x71E4,0x5D4C, + /* Array index: 0x1FAC */ 0x71E8,0x5D4A, + /* Array index: 0x1FAC */ 0x71F9,0x6229, + /* Array index: 0x1FAC */ 0x71FD,0x622B, + /* Array index: 0x1FAC */ 0x720A,0x6574, + /* Array index: 0x1FAC */ 0x720C,0x6573, + /* Array index: 0x1FAC */ 0x7213,0x6939, + /* Array index: 0x1FAC */ 0x7214,0x693A, + /* Array index: 0x1FAC */ 0x723F,0x2142, + /* Array index: 0x1FAC */ 0x7241,0x2B77, + /* Array index: 0x1FAC */ 0x7242,0x3060, + /* Array index: 0x1FAC */ 0x7244,0x4B6B, + /* Array index: 0x1FAC */ 0x724F,0x4468, + /* Array index: 0x1FAC */ 0x7253,0x4B6C, + /* Array index: 0x1FAC */ 0x725A,0x3D6B, + /* Array index: 0x1FAC */ 0x725E,0x2262, + /* Array index: 0x1FAC */ 0x7263,0x2460, + /* Array index: 0x1FAC */ 0x726A,0x277B, + /* Array index: 0x1FAC */ 0x726C,0x2B7A, + /* Array index: 0x1FAC */ 0x726E,0x2B7D, + /* Array index: 0x1FAC */ 0x7270,0x2B7B, + /* Array index: 0x1FAC */ 0x7273,0x2B7C, + /* Array index: 0x1FAC */ 0x72AE,0x2164, + /* Array index: 0x1FAC */ 0x72B0,0x2165, + /* Array index: 0x1FAC */ 0x72B4,0x2263, + /* Array index: 0x1FAC */ 0x72B5,0x2264, + /* Array index: 0x1FAC */ 0x72BA,0x2466, + /* Array index: 0x1FAC */ 0x72BD,0x2462, + /* Array index: 0x1FAC */ 0x72BF,0x2461, + /* Array index: 0x1FAC */ 0x72C1,0x2465, + /* Array index: 0x1FAC */ 0x72C3,0x2463, + /* Array index: 0x1FAC */ 0x72D1,0x2827, + /* Array index: 0x1FAC */ 0x72D2,0x2823, + /* Array index: 0x1FAC */ 0x72D4,0x2824, + /* Array index: 0x1FAC */ 0x72D6,0x277C, + /* Array index: 0x1FAC */ 0x72D8,0x277E, + /* Array index: 0x1FAC */ 0x72DA,0x2825, + /* Array index: 0x1FAC */ 0x72DC,0x2822, + /* Array index: 0x1FAC */ 0x72DF,0x2C24, + /* Array index: 0x1FAC */ 0x72E3,0x2C27, + /* Array index: 0x1FAC */ 0x72E4,0x2C21, + /* Array index: 0x1FAC */ 0x72E6,0x2C26, + /* Array index: 0x1FAC */ 0x72E8,0x2C22, + /* Array index: 0x1FAC */ 0x72EA,0x2C25, + /* Array index: 0x1FAC */ 0x72EB,0x2C23, + /* Array index: 0x1FAC */ 0x72F3,0x3069, + /* Array index: 0x1FAC */ 0x72F4,0x3066, + /* Array index: 0x1FAC */ 0x72F6,0x3068, + /* Array index: 0x1FAC */ 0x730F,0x372D, + /* Array index: 0x1FAC */ 0x7311,0x3728, + /* Array index: 0x1FAC */ 0x7312,0x3D71, + /* Array index: 0x1FAC */ 0x7317,0x3726, + /* Array index: 0x1FAC */ 0x7318,0x3729, + /* Array index: 0x1FAC */ 0x731D,0x3725, + /* Array index: 0x1FAC */ 0x731E,0x372E, + /* Array index: 0x1FAC */ 0x7322,0x3D74, + /* Array index: 0x1FAC */ 0x7323,0x3D7B, + /* Array index: 0x1FAC */ 0x7326,0x3D7A, + /* Array index: 0x1FAC */ 0x7327,0x3D77, + /* Array index: 0x1FAC */ 0x732D,0x3D79, + /* Array index: 0x1FAC */ 0x7340,0x4472, + /* Array index: 0x1FAC */ 0x7342,0x446F, + /* Array index: 0x1FAC */ 0x7343,0x4B70, + /* Array index: 0x1FAC */ 0x7351,0x4B72, + /* Array index: 0x1FAC */ 0x7352,0x517E, + /* Array index: 0x1FAC */ 0x7373,0x5D4F, + /* Array index: 0x1FAC */ 0x7376,0x622C, + /* Array index: 0x1FAC */ 0x7388,0x372F, + /* Array index: 0x1FAC */ 0x738A,0x2166, + /* Array index: 0x1FAC */ 0x738E,0x2265, + /* Array index: 0x1FAC */ 0x739D,0x282F, + /* Array index: 0x1FAC */ 0x73AC,0x282E, + /* Array index: 0x1FAC */ 0x73AD,0x282A, + /* Array index: 0x1FAC */ 0x73BC,0x3070, + /* Array index: 0x1FAC */ 0x73BE,0x2C34, + /* Array index: 0x1FAC */ 0x73BF,0x2C32, + /* Array index: 0x1FAC */ 0x73E3,0x3072, + /* Array index: 0x1FAC */ 0x7404,0x3733, + /* Array index: 0x1FAC */ 0x7407,0x3736, + /* Array index: 0x1FAC */ 0x7408,0x373E, + /* Array index: 0x1FAC */ 0x740B,0x373C, + /* Array index: 0x1FAC */ 0x740C,0x373B, + /* Array index: 0x1FAC */ 0x7416,0x3E24, + /* Array index: 0x1FAC */ 0x741A,0x3E25, + /* Array index: 0x1FAC */ 0x741D,0x3E2B, + /* Array index: 0x1FAC */ 0x7440,0x447B, + /* Array index: 0x1FAC */ 0x7442,0x4521, + /* Array index: 0x1FAC */ 0x7444,0x4475, + /* Array index: 0x1FAC */ 0x7446,0x4522, + /* Array index: 0x1FAC */ 0x7457,0x447A, + /* Array index: 0x1FAC */ 0x7462,0x4B74, + /* Array index: 0x1FAC */ 0x7467,0x4B79, + /* Array index: 0x1FAC */ 0x746E,0x4B7A, + /* Array index: 0x1FAC */ 0x7479,0x5233, + /* Array index: 0x1FAC */ 0x747C,0x5232, + /* Array index: 0x1FAC */ 0x747D,0x522F, + /* Array index: 0x1FAC */ 0x747F,0x584E, + /* Array index: 0x1FAC */ 0x7481,0x522E, + /* Array index: 0x1FAC */ 0x7490,0x5D55, + /* Array index: 0x1FAC */ 0x7492,0x5852, + /* Array index: 0x1FAC */ 0x7494,0x5851, + /* Array index: 0x1FAC */ 0x7495,0x5853, + /* Array index: 0x1FAC */ 0x7497,0x5D52, + /* Array index: 0x1FAC */ 0x749A,0x584F, + /* Array index: 0x1FAC */ 0x74A0,0x5850, + /* Array index: 0x1FAC */ 0x74A1,0x5854, + /* Array index: 0x1FAC */ 0x74A5,0x5D59, + /* Array index: 0x1FAC */ 0x74AA,0x5D56, + /* Array index: 0x1FAC */ 0x74AB,0x5D54, + /* Array index: 0x1FAC */ 0x74AD,0x5D57, + /* Array index: 0x1FAC */ 0x74AF,0x5D5A, + /* Array index: 0x1FAC */ 0x74CB,0x657D, + /* Array index: 0x1FAC */ 0x74E5,0x7041, + /* Array index: 0x1FAC */ 0x74E8,0x2831, + /* Array index: 0x1FAC */ 0x74EC,0x2C39, + /* Array index: 0x1FAC */ 0x74EE,0x2C3A, + /* Array index: 0x1FAC */ 0x74F4,0x3121, + /* Array index: 0x1FAC */ 0x74F5,0x3122, + /* Array index: 0x1FAC */ 0x7507,0x5235, + /* Array index: 0x1FAC */ 0x7508,0x5234, + /* Array index: 0x1FAC */ 0x750B,0x5855, + /* Array index: 0x1FAC */ 0x751D,0x4529, + /* Array index: 0x1FAC */ 0x7521,0x3123, + /* Array index: 0x1FAC */ 0x752A,0x2266, + /* Array index: 0x1FAC */ 0x752E,0x2C3B, + /* Array index: 0x1FAC */ 0x752F,0x3E30, + /* Array index: 0x1FAC */ 0x7539,0x246E, + /* Array index: 0x1FAC */ 0x753A,0x246D, + /* Array index: 0x1FAC */ 0x7547,0x2C3C, + /* Array index: 0x1FAC */ 0x7548,0x2C3D, + /* Array index: 0x1FAC */ 0x755B,0x3124, + /* Array index: 0x1FAC */ 0x755F,0x3125, + /* Array index: 0x1FAC */ 0x7563,0x3740, + /* Array index: 0x1FAC */ 0x7564,0x373F, + /* Array index: 0x1FAC */ 0x756C,0x3E32, + /* Array index: 0x1FAC */ 0x756F,0x3E31, + /* Array index: 0x1FAC */ 0x7577,0x452B, + /* Array index: 0x1FAC */ 0x7579,0x452A, + /* Array index: 0x1FAC */ 0x757D,0x4B7E, + /* Array index: 0x1FAC */ 0x757E,0x5236, + /* Array index: 0x1FAC */ 0x7580,0x5856, + /* Array index: 0x1FAC */ 0x7584,0x5D5F, + /* Array index: 0x1FAC */ 0x758C,0x2835, + /* Array index: 0x1FAC */ 0x7590,0x4C21, + /* Array index: 0x1FAC */ 0x7594,0x246F, + /* Array index: 0x1FAC */ 0x7595,0x2470, + /* Array index: 0x1FAC */ 0x7598,0x2836, + /* Array index: 0x1FAC */ 0x75A7,0x2C3E, + /* Array index: 0x1FAC */ 0x75AA,0x2C3F, + /* Array index: 0x1FAC */ 0x75B0,0x3126, + /* Array index: 0x1FAC */ 0x75B6,0x312C, + /* Array index: 0x1FAC */ 0x75BA,0x312D, + /* Array index: 0x1FAC */ 0x75BB,0x3128, + /* Array index: 0x1FAC */ 0x75C4,0x3129, + /* Array index: 0x1FAC */ 0x75D7,0x3E3A, + /* Array index: 0x1FAC */ 0x75DA,0x3E34, + /* Array index: 0x1FAC */ 0x75DD,0x3E37, + /* Array index: 0x1FAC */ 0x75DF,0x3E38, + /* Array index: 0x1FAC */ 0x75E1,0x3E35, + /* Array index: 0x1FAC */ 0x75E4,0x3E39, + /* Array index: 0x1FAC */ 0x75E6,0x3E36, + /* Array index: 0x1FAC */ 0x75E7,0x3E33, + /* Array index: 0x1FAC */ 0x75ED,0x4538, + /* Array index: 0x1FAC */ 0x75EF,0x452D, + /* Array index: 0x1FAC */ 0x7603,0x452F, + /* Array index: 0x1FAC */ 0x7608,0x4C23, + /* Array index: 0x1FAC */ 0x760A,0x4C27, + /* Array index: 0x1FAC */ 0x760C,0x4C24, + /* Array index: 0x1FAC */ 0x7623,0x523C, + /* Array index: 0x1FAC */ 0x7625,0x5237, + /* Array index: 0x1FAC */ 0x7628,0x523E, + /* Array index: 0x1FAC */ 0x763C,0x585C, + /* Array index: 0x1FAC */ 0x763D,0x585A, + /* Array index: 0x1FAC */ 0x7643,0x5D60, + /* Array index: 0x1FAC */ 0x7650,0x623A, + /* Array index: 0x1FAC */ 0x7653,0x623B, + /* Array index: 0x1FAC */ 0x7657,0x623C, + /* Array index: 0x1FAC */ 0x7659,0x6239, + /* Array index: 0x1FAC */ 0x765A,0x623D, + /* Array index: 0x1FAC */ 0x765C,0x6237, + /* Array index: 0x1FAC */ 0x7660,0x6624, + /* Array index: 0x1FAC */ 0x7664,0x6238, + /* Array index: 0x1FAC */ 0x766A,0x6B6D, + /* Array index: 0x1FAC */ 0x766D,0x6D62, + /* Array index: 0x1FAC */ 0x7670,0x6F39, + /* Array index: 0x1FAC */ 0x7675,0x723A, + /* Array index: 0x1FAC */ 0x7679,0x2C40, + /* Array index: 0x1FAC */ 0x767F,0x2267, + /* Array index: 0x1FAC */ 0x7681,0x2471, + /* Array index: 0x1FAC */ 0x7689,0x3749, + /* Array index: 0x1FAC */ 0x768A,0x312E, + /* Array index: 0x1FAC */ 0x768F,0x3748, + /* Array index: 0x1FAC */ 0x7692,0x3E3C, + /* Array index: 0x1FAC */ 0x7695,0x3E3B, + /* Array index: 0x1FAC */ 0x76A4,0x5D64, + /* Array index: 0x1FAC */ 0x76A6,0x623E, + /* Array index: 0x1FAC */ 0x76AA,0x6940, + /* Array index: 0x1FAC */ 0x76AB,0x693F, + /* Array index: 0x1FAC */ 0x76AD,0x6D63, + /* Array index: 0x1FAC */ 0x76AF,0x2837, + /* Array index: 0x1FAC */ 0x76B5,0x453C, + /* Array index: 0x1FAC */ 0x76B8,0x4C29, + /* Array index: 0x1FAC */ 0x76BB,0x5860, + /* Array index: 0x1FAC */ 0x76BD,0x623F, + /* Array index: 0x1FAC */ 0x76BE,0x6941, + /* Array index: 0x1FAC */ 0x76C4,0x2C41, + /* Array index: 0x1FAC */ 0x76C9,0x312F, + /* Array index: 0x1FAC */ 0x76D3,0x374A, + /* Array index: 0x1FAC */ 0x76DA,0x3E3D, + /* Array index: 0x1FAC */ 0x76DD,0x453D, + /* Array index: 0x1FAC */ 0x76E6,0x5861, + /* Array index: 0x1FAC */ 0x76E9,0x5D65, + /* Array index: 0x1FAC */ 0x76EC,0x6240, + /* Array index: 0x1FAC */ 0x76ED,0x6942, + /* Array index: 0x1FAC */ 0x76F0,0x283A, + /* Array index: 0x1FAC */ 0x76F1,0x2839, + /* Array index: 0x1FAC */ 0x76F3,0x2838, + /* Array index: 0x1FAC */ 0x76F5,0x283B, + /* Array index: 0x1FAC */ 0x76F7,0x2C47, + /* Array index: 0x1FAC */ 0x76FA,0x2C49, + /* Array index: 0x1FAC */ 0x76FB,0x2C48, + /* Array index: 0x1FAC */ 0x7708,0x2C42, + /* Array index: 0x1FAC */ 0x770A,0x2C46, + /* Array index: 0x1FAC */ 0x7722,0x313A, + /* Array index: 0x1FAC */ 0x7723,0x3135, + /* Array index: 0x1FAC */ 0x7725,0x3753, + /* Array index: 0x1FAC */ 0x7727,0x313B, + /* Array index: 0x1FAC */ 0x772D,0x374D, + /* Array index: 0x1FAC */ 0x7739,0x374B, + /* Array index: 0x1FAC */ 0x773B,0x3754, + /* Array index: 0x1FAC */ 0x773D,0x3752, + /* Array index: 0x1FAC */ 0x775F,0x453F, + /* Array index: 0x1FAC */ 0x7760,0x4540, + /* Array index: 0x1FAC */ 0x7767,0x4545, + /* Array index: 0x1FAC */ 0x7769,0x4544, + /* Array index: 0x1FAC */ 0x777C,0x4C2B, + /* Array index: 0x1FAC */ 0x778D,0x5244, + /* Array index: 0x1FAC */ 0x778F,0x5245, + /* Array index: 0x1FAC */ 0x7795,0x5869, + /* Array index: 0x1FAC */ 0x77A8,0x5D6D, + /* Array index: 0x1FAC */ 0x77AB,0x5D67, + /* Array index: 0x1FAC */ 0x77BA,0x6242, + /* Array index: 0x1FAC */ 0x77C2,0x6241, + /* Array index: 0x1FAC */ 0x77C4,0x6627, + /* Array index: 0x1FAC */ 0x77D4,0x6F3A, + /* Array index: 0x1FAC */ 0x77D5,0x7042, + /* Array index: 0x1FAC */ 0x77D8,0x7128, + /* Array index: 0x1FAC */ 0x77D9,0x7129, + /* Array index: 0x1FAC */ 0x77DE,0x3E47, + /* Array index: 0x1FAC */ 0x77E0,0x4549, + /* Array index: 0x1FAC */ 0x77E7,0x2C4A, + /* Array index: 0x1FAC */ 0x77E8,0x2C4B, + /* Array index: 0x1FAC */ 0x77EC,0x3E48, + /* Array index: 0x1FAC */ 0x7803,0x2C54, + /* Array index: 0x1FAC */ 0x7805,0x2C4F, + /* Array index: 0x1FAC */ 0x7806,0x2C4C, + /* Array index: 0x1FAC */ 0x7809,0x2C53, + /* Array index: 0x1FAC */ 0x7845,0x375D, + /* Array index: 0x1FAC */ 0x7850,0x375E, + /* Array index: 0x1FAC */ 0x7852,0x3757, + /* Array index: 0x1FAC */ 0x785C,0x3E4C, + /* Array index: 0x1FAC */ 0x785E,0x3E54, + /* Array index: 0x1FAC */ 0x7860,0x3E49, + /* Array index: 0x1FAC */ 0x7862,0x3E55, + /* Array index: 0x1FAC */ 0x7879,0x4554, + /* Array index: 0x1FAC */ 0x787B,0x4558, + /* Array index: 0x1FAC */ 0x787E,0x4C38, + /* Array index: 0x1FAC */ 0x7880,0x4556, + /* Array index: 0x1FAC */ 0x788F,0x454D, + /* Array index: 0x1FAC */ 0x78B2,0x4C33, + /* Array index: 0x1FAC */ 0x78B4,0x4C35, + /* Array index: 0x1FAC */ 0x78BB,0x5249, + /* Array index: 0x1FAC */ 0x78C3,0x5250, + /* Array index: 0x1FAC */ 0x78C4,0x5251, + /* Array index: 0x1FAC */ 0x78D4,0x524E, + /* Array index: 0x1FAC */ 0x78E9,0x586D, + /* Array index: 0x1FAC */ 0x78EA,0x586F, + /* Array index: 0x1FAC */ 0x78ED,0x5875, + /* Array index: 0x1FAC */ 0x78F2,0x5D75, + /* Array index: 0x1FAC */ 0x78F3,0x5D6F, + /* Array index: 0x1FAC */ 0x7902,0x5D71, + /* Array index: 0x1FAC */ 0x7904,0x5D79, + /* Array index: 0x1FAC */ 0x7905,0x5D76, + /* Array index: 0x1FAC */ 0x7909,0x6246, + /* Array index: 0x1FAC */ 0x790C,0x6243, + /* Array index: 0x1FAC */ 0x7917,0x662D, + /* Array index: 0x1FAC */ 0x792D,0x6B6F, + /* Array index: 0x1FAC */ 0x792F,0x6B71, + /* Array index: 0x1FAC */ 0x7931,0x6B70, + /* Array index: 0x1FAC */ 0x7935,0x6D64, + /* Array index: 0x1FAC */ 0x7938,0x7043, + /* Array index: 0x1FAC */ 0x7939,0x712A, + /* Array index: 0x1FAC */ 0x793D,0x2472, + /* Array index: 0x1FAC */ 0x793F,0x2843, + /* Array index: 0x1FAC */ 0x7942,0x2842, + /* Array index: 0x1FAC */ 0x7944,0x2C5A, + /* Array index: 0x1FAC */ 0x7945,0x2C59, + /* Array index: 0x1FAC */ 0x795B,0x314A, + /* Array index: 0x1FAC */ 0x795C,0x314C, + /* Array index: 0x1FAC */ 0x7961,0x3765, + /* Array index: 0x1FAC */ 0x7963,0x3763, + /* Array index: 0x1FAC */ 0x7964,0x375F, + /* Array index: 0x1FAC */ 0x7979,0x455C, + /* Array index: 0x1FAC */ 0x797C,0x4559, + /* Array index: 0x1FAC */ 0x797D,0x455B, + /* Array index: 0x1FAC */ 0x7982,0x455A, + /* Array index: 0x1FAC */ 0x7988,0x4C48, + /* Array index: 0x1FAC */ 0x798A,0x4C41, + /* Array index: 0x1FAC */ 0x798B,0x4C42, + /* Array index: 0x1FAC */ 0x79A8,0x5D7B, + /* Array index: 0x1FAC */ 0x79B0,0x662F, + /* Array index: 0x1FAC */ 0x79B2,0x694E, + /* Array index: 0x1FAC */ 0x79BB,0x3766, + /* Array index: 0x1FAC */ 0x79C5,0x2844, + /* Array index: 0x1FAC */ 0x79D5,0x2C5B, + /* Array index: 0x1FAC */ 0x79D6,0x2C5E, + /* Array index: 0x1FAC */ 0x7A0A,0x3E5B, + /* Array index: 0x1FAC */ 0x7A0C,0x3E5D, + /* Array index: 0x1FAC */ 0x7A22,0x4563, + /* Array index: 0x1FAC */ 0x7A26,0x4C50, + /* Array index: 0x1FAC */ 0x7A28,0x4C4F, + /* Array index: 0x1FAC */ 0x7A2B,0x4C4B, + /* Array index: 0x1FAC */ 0x7A2F,0x4C4E, + /* Array index: 0x1FAC */ 0x7A30,0x4C4D, + /* Array index: 0x1FAC */ 0x7A39,0x525A, + /* Array index: 0x1FAC */ 0x7A44,0x5879, + /* Array index: 0x1FAC */ 0x7A47,0x587B, + /* Array index: 0x1FAC */ 0x7A48,0x587A, + /* Array index: 0x1FAC */ 0x7A4A,0x4C4C, + /* Array index: 0x1FAC */ 0x7A54,0x5E22, + /* Array index: 0x1FAC */ 0x7A56,0x5D7E, + /* Array index: 0x1FAC */ 0x7A5F,0x624C, + /* Array index: 0x1FAC */ 0x7A67,0x6630, + /* Array index: 0x1FAC */ 0x7A68,0x6631, + /* Array index: 0x1FAC */ 0x7A75,0x2268, + /* Array index: 0x1FAC */ 0x7A78,0x2845, + /* Array index: 0x1FAC */ 0x7A7B,0x2846, + /* Array index: 0x1FAC */ 0x7A7E,0x2C61, + /* Array index: 0x1FAC */ 0x7A80,0x2C60, + /* Array index: 0x1FAC */ 0x7A94,0x376C, + /* Array index: 0x1FAC */ 0x7A99,0x3E5F, + /* Array index: 0x1FAC */ 0x7A9E,0x4569, + /* Array index: 0x1FAC */ 0x7AA2,0x4568, + /* Array index: 0x1FAC */ 0x7AA3,0x4567, + /* Array index: 0x1FAC */ 0x7AA8,0x4C51, + /* Array index: 0x1FAC */ 0x7AAB,0x4C52, + /* Array index: 0x1FAC */ 0x7AAC,0x4C53, + /* Array index: 0x1FAC */ 0x7ABE,0x5E24, + /* Array index: 0x1FAC */ 0x7AC0,0x5E25, + /* Array index: 0x1FAC */ 0x7AC1,0x5E26, + /* Array index: 0x1FAC */ 0x7AD1,0x2C62, + /* Array index: 0x1FAC */ 0x7AD8,0x3160, + /* Array index: 0x1FAC */ 0x7AE4,0x3E61, + /* Array index: 0x1FAC */ 0x7AE6,0x3E60, + /* Array index: 0x1FAC */ 0x7AEB,0x456A, + /* Array index: 0x1FAC */ 0x7AEE,0x4C54, + /* Array index: 0x1FAC */ 0x7AF7,0x6952, + /* Array index: 0x1FAC */ 0x7AFB,0x2847, + /* Array index: 0x1FAC */ 0x7B00,0x2C63, + /* Array index: 0x1FAC */ 0x7B01,0x2C64, + /* Array index: 0x1FAC */ 0x7B18,0x3776, + /* Array index: 0x1FAC */ 0x7B1A,0x3821, + /* Array index: 0x1FAC */ 0x7B1D,0x3778, + /* Array index: 0x1FAC */ 0x7B2A,0x3777, + /* Array index: 0x1FAC */ 0x7B2B,0x377A, + /* Array index: 0x1FAC */ 0x7B38,0x377E, + /* Array index: 0x1FAC */ 0x7B3B,0x376F, + /* Array index: 0x1FAC */ 0x7B40,0x3E68, + /* Array index: 0x1FAC */ 0x7B58,0x3E69, + /* Array index: 0x1FAC */ 0x7B69,0x456F, + /* Array index: 0x1FAC */ 0x7B6D,0x456D, + /* Array index: 0x1FAC */ 0x7B82,0x4C64, + /* Array index: 0x1FAC */ 0x7B85,0x4C5F, + /* Array index: 0x1FAC */ 0x7B88,0x4C55, + /* Array index: 0x1FAC */ 0x7B96,0x4C5A, + /* Array index: 0x1FAC */ 0x7BA4,0x4C63, + /* Array index: 0x1FAC */ 0x7BAC,0x5261, + /* Array index: 0x1FAC */ 0x7BAF,0x5263, + /* Array index: 0x1FAC */ 0x7BB5,0x5266, + /* Array index: 0x1FAC */ 0x7BB7,0x525E, + /* Array index: 0x1FAC */ 0x7BB9,0x5264, + /* Array index: 0x1FAC */ 0x7BBE,0x5260, + /* Array index: 0x1FAC */ 0x7BCA,0x5265, + /* Array index: 0x1FAC */ 0x7BCB,0x525F, + /* Array index: 0x1FAC */ 0x7BCE,0x5262, + /* Array index: 0x1FAC */ 0x7BD4,0x592C, + /* Array index: 0x1FAC */ 0x7BD5,0x5927, + /* Array index: 0x1FAC */ 0x7BD8,0x5931, + /* Array index: 0x1FAC */ 0x7BF8,0x5E35, + /* Array index: 0x1FAC */ 0x7BF9,0x592B, + /* Array index: 0x1FAC */ 0x7BFB,0x5E2C, + /* Array index: 0x1FAC */ 0x7C19,0x624F, + /* Array index: 0x1FAC */ 0x7C30,0x6258, + /* Array index: 0x1FAC */ 0x7C33,0x6632, + /* Array index: 0x1FAC */ 0x7C39,0x6634, + /* Array index: 0x1FAC */ 0x7C3B,0x6636, + /* Array index: 0x1FAC */ 0x7C3C,0x6633, + /* Array index: 0x1FAC */ 0x7C53,0x6B73, + /* Array index: 0x1FAC */ 0x7C54,0x6B72, + /* Array index: 0x1FAC */ 0x7C6F,0x715C, + /* Array index: 0x1FAC */ 0x7C75,0x2848, + /* Array index: 0x1FAC */ 0x7C88,0x316F, + /* Array index: 0x1FAC */ 0x7C8A,0x316D, + /* Array index: 0x1FAC */ 0x7C8C,0x316E, + /* Array index: 0x1FAC */ 0x7C8D,0x3170, + /* Array index: 0x1FAC */ 0x7C91,0x316C, + /* Array index: 0x1FAC */ 0x7C94,0x3823, + /* Array index: 0x1FAC */ 0x7C96,0x3825, + /* Array index: 0x1FAC */ 0x7C98,0x3824, + /* Array index: 0x1FAC */ 0x7C9E,0x3E6C, + /* Array index: 0x1FAC */ 0x7CA8,0x3E6D, + /* Array index: 0x1FAC */ 0x7CAF,0x457B, + /* Array index: 0x1FAC */ 0x7CB2,0x4579, + /* Array index: 0x1FAC */ 0x7CB4,0x457A, + /* Array index: 0x1FAC */ 0x7CBF,0x4C66, + /* Array index: 0x1FAC */ 0x7CC5,0x5267, + /* Array index: 0x1FAC */ 0x7CC8,0x5268, + /* Array index: 0x1FAC */ 0x7CCB,0x526A, + /* Array index: 0x1FAC */ 0x7CCC,0x5269, + /* Array index: 0x1FAC */ 0x7CD7,0x5935, + /* Array index: 0x1FAC */ 0x7CE8,0x5E3C, + /* Array index: 0x1FAC */ 0x7CEA,0x6638, + /* Array index: 0x1FAC */ 0x7CEC,0x6637, + /* Array index: 0x1FAC */ 0x7CEE,0x6958, + /* Array index: 0x1FAC */ 0x7CF1,0x6D6E, + /* Array index: 0x1FAC */ 0x7CF2,0x6B74, + /* Array index: 0x1FAC */ 0x7CF4,0x6D6D, + /* Array index: 0x1FAC */ 0x7CF6,0x712D, + /* Array index: 0x1FAC */ 0x7CF7,0x7172, + /* Array index: 0x1FAC */ 0x7CFD,0x2849, + /* Array index: 0x1FAC */ 0x7D01,0x2C6D, + /* Array index: 0x1FAC */ 0x7D03,0x2C6B, + /* Array index: 0x1FAC */ 0x7D08,0x2C6C, + /* Array index: 0x1FAC */ 0x7D0C,0x317C, + /* Array index: 0x1FAC */ 0x7D16,0x3177, + /* Array index: 0x1FAC */ 0x7D18,0x3176, + /* Array index: 0x1FAC */ 0x7D28,0x3835, + /* Array index: 0x1FAC */ 0x7D29,0x382E, + /* Array index: 0x1FAC */ 0x7D2C,0x382D, + /* Array index: 0x1FAC */ 0x7D35,0x3827, + /* Array index: 0x1FAC */ 0x7D36,0x382A, + /* Array index: 0x1FAC */ 0x7D38,0x3829, + /* Array index: 0x1FAC */ 0x7D45,0x382C, + /* Array index: 0x1FAC */ 0x7D47,0x3830, + /* Array index: 0x1FAC */ 0x7D4A,0x3833, + /* Array index: 0x1FAC */ 0x7D5C,0x3E78, + /* Array index: 0x1FAC */ 0x7D5F,0x3E7E, + /* Array index: 0x1FAC */ 0x7D63,0x3E71, + /* Array index: 0x1FAC */ 0x7D92,0x462D, + /* Array index: 0x1FAC */ 0x7D94,0x462A, + /* Array index: 0x1FAC */ 0x7D96,0x4C79, + /* Array index: 0x1FAC */ 0x7D9D,0x4C71, + /* Array index: 0x1FAC */ 0x7D9F,0x4C7B, + /* Array index: 0x1FAC */ 0x7DA1,0x4D21, + /* Array index: 0x1FAC */ 0x7DA3,0x4C6C, + /* Array index: 0x1FAC */ 0x7DAE,0x4C7D, + /* Array index: 0x1FAC */ 0x7DAF,0x4C77, + /* Array index: 0x1FAC */ 0x7DB7,0x4C6A, + /* Array index: 0x1FAC */ 0x7DB9,0x4C78, + /* Array index: 0x1FAC */ 0x7DBC,0x4C7A, + /* Array index: 0x1FAC */ 0x7DC9,0x4D22, + /* Array index: 0x1FAC */ 0x7DCB,0x4C75, + /* Array index: 0x1FAC */ 0x7DCC,0x4C76, + /* Array index: 0x1FAC */ 0x7DCE,0x4C72, + /* Array index: 0x1FAC */ 0x7DD7,0x526F, + /* Array index: 0x1FAC */ 0x7DDB,0x526C, + /* Array index: 0x1FAC */ 0x7DDF,0x5278, + /* Array index: 0x1FAC */ 0x7DE1,0x5270, + /* Array index: 0x1FAC */ 0x7DE6,0x5273, + /* Array index: 0x1FAC */ 0x7DE7,0x526E, + /* Array index: 0x1FAC */ 0x7DEA,0x526D, + /* Array index: 0x1FAC */ 0x7DEE,0x5277, + /* Array index: 0x1FAC */ 0x7DF0,0x5276, + /* Array index: 0x1FAC */ 0x7DF1,0x5275, + /* Array index: 0x1FAC */ 0x7DF3,0x503B, + /* Array index: 0x1FAC */ 0x7DF6,0x5274, + /* Array index: 0x1FAC */ 0x7DF7,0x526B, + /* Array index: 0x1FAC */ 0x7DFA,0x5272, + /* Array index: 0x1FAC */ 0x7E03,0x5271, + /* Array index: 0x1FAC */ 0x7E1A,0x5942, + /* Array index: 0x1FAC */ 0x7E1C,0x5940, + /* Array index: 0x1FAC */ 0x7E29,0x5E47, + /* Array index: 0x1FAC */ 0x7E2A,0x5E43, + /* Array index: 0x1FAC */ 0x7E2D,0x5E3D, + /* Array index: 0x1FAC */ 0x7E30,0x5E49, + /* Array index: 0x1FAC */ 0x7E33,0x5E40, + /* Array index: 0x1FAC */ 0x7E36,0x5E4B, + /* Array index: 0x1FAC */ 0x7E40,0x5E45, + /* Array index: 0x1FAC */ 0x7E42,0x5E3F, + /* Array index: 0x1FAC */ 0x7E44,0x5E4C, + /* Array index: 0x1FAC */ 0x7E47,0x5E46, + /* Array index: 0x1FAC */ 0x7E49,0x5E44, + /* Array index: 0x1FAC */ 0x7E4C,0x5E48, + /* Array index: 0x1FAC */ 0x7E50,0x625A, + /* Array index: 0x1FAC */ 0x7E51,0x6260, + /* Array index: 0x1FAC */ 0x7E53,0x6263, + /* Array index: 0x1FAC */ 0x7E5C,0x6259, + /* Array index: 0x1FAC */ 0x7E68,0x6642, + /* Array index: 0x1FAC */ 0x7E6F,0x663E, + /* Array index: 0x1FAC */ 0x7E70,0x663C, + /* Array index: 0x1FAC */ 0x7E7E,0x695A, + /* Array index: 0x1FAC */ 0x7E80,0x695C, + /* Array index: 0x1FAC */ 0x7E81,0x695B, + /* Array index: 0x1FAC */ 0x7E91,0x6D6F, + /* Array index: 0x1FAC */ 0x7F39,0x3052, + /* Array index: 0x1FAC */ 0x7F3E,0x3F22, + /* Array index: 0x1FAC */ 0x7F3F,0x3F23, + /* Array index: 0x1FAC */ 0x7F43,0x594B, + /* Array index: 0x1FAC */ 0x7F45,0x5E4E, + /* Array index: 0x1FAC */ 0x7F4A,0x6644, + /* Array index: 0x1FAC */ 0x7F4B,0x6643, + /* Array index: 0x1FAC */ 0x7F4D,0x6B7B, + /* Array index: 0x1FAC */ 0x7F4F,0x6D70, + /* Array index: 0x1FAC */ 0x7F51,0x2269, + /* Array index: 0x1FAC */ 0x7F58,0x2C6E, + /* Array index: 0x1FAC */ 0x7F73,0x4D23, + /* Array index: 0x1FAC */ 0x7F76,0x5279, + /* Array index: 0x1FAC */ 0x7F83,0x6645, + /* Array index: 0x1FAC */ 0x7F86,0x6646, + /* Array index: 0x1FAC */ 0x7F87,0x6D71, + /* Array index: 0x1FAC */ 0x7F89,0x7048, + /* Array index: 0x1FAC */ 0x7F8D,0x2C70, + /* Array index: 0x1FAC */ 0x7F91,0x2C6F, + /* Array index: 0x1FAC */ 0x7F92,0x3226, + /* Array index: 0x1FAC */ 0x7F95,0x3837, + /* Array index: 0x1FAC */ 0x7F96,0x3225, + /* Array index: 0x1FAC */ 0x7FAC,0x527A, + /* Array index: 0x1FAC */ 0x7FAD,0x527C, + /* Array index: 0x1FAC */ 0x7FB0,0x527B, + /* Array index: 0x1FAC */ 0x7FB1,0x594F, + /* Array index: 0x1FAC */ 0x7FB3,0x6265, + /* Array index: 0x1FAC */ 0x7FB5,0x6264, + /* Array index: 0x1FAC */ 0x7FB7,0x6647, + /* Array index: 0x1FAC */ 0x7FBA,0x695D, + /* Array index: 0x1FAC */ 0x7FBB,0x6B7C, + /* Array index: 0x1FAC */ 0x7FBE,0x2C71, + /* Array index: 0x1FAC */ 0x7FC0,0x3229, + /* Array index: 0x1FAC */ 0x7FC2,0x3228, + /* Array index: 0x1FAC */ 0x7FC3,0x3227, + /* Array index: 0x1FAC */ 0x7FD7,0x3F29, + /* Array index: 0x1FAC */ 0x7FDB,0x4636, + /* Array index: 0x1FAC */ 0x7FDC,0x4637, + /* Array index: 0x1FAC */ 0x7FDE,0x4D27, + /* Array index: 0x1FAC */ 0x7FF2,0x5E53, + /* Array index: 0x1FAC */ 0x8007,0x2C72, + /* Array index: 0x1FAC */ 0x800E,0x2C73, + /* Array index: 0x1FAC */ 0x800F,0x2C74, + /* Array index: 0x1FAC */ 0x8014,0x2C75, + /* Array index: 0x1FAC */ 0x8016,0x322A, + /* Array index: 0x1FAC */ 0x801B,0x3845, + /* Array index: 0x1FAC */ 0x801E,0x3844, + /* Array index: 0x1FAC */ 0x801F,0x3843, + /* Array index: 0x1FAC */ 0x8021,0x4638, + /* Array index: 0x1FAC */ 0x8024,0x4D28, + /* Array index: 0x1FAC */ 0x8029,0x5952, + /* Array index: 0x1FAC */ 0x802A,0x5951, + /* Array index: 0x1FAC */ 0x802C,0x5E54, + /* Array index: 0x1FAC */ 0x8030,0x6B7D, + /* Array index: 0x1FAC */ 0x8034,0x2473, + /* Array index: 0x1FAC */ 0x8035,0x284A, + /* Array index: 0x1FAC */ 0x8037,0x2C76, + /* Array index: 0x1FAC */ 0x8039,0x322C, + /* Array index: 0x1FAC */ 0x803E,0x322B, + /* Array index: 0x1FAC */ 0x8043,0x3847, + /* Array index: 0x1FAC */ 0x8047,0x3846, + /* Array index: 0x1FAC */ 0x8048,0x3848, + /* Array index: 0x1FAC */ 0x805C,0x4D2A, + /* Array index: 0x1FAC */ 0x805D,0x4D29, + /* Array index: 0x1FAC */ 0x8064,0x5325, + /* Array index: 0x1FAC */ 0x8067,0x5326, + /* Array index: 0x1FAC */ 0x806C,0x5953, + /* Array index: 0x1FAC */ 0x8075,0x6268, + /* Array index: 0x1FAC */ 0x8078,0x664A, + /* Array index: 0x1FAC */ 0x8079,0x695F, + /* Array index: 0x1FAC */ 0x8082,0x2F7D, + /* Array index: 0x1FAC */ 0x808A,0x2168, + /* Array index: 0x1FAC */ 0x808F,0x284B, + /* Array index: 0x1FAC */ 0x8090,0x2476, + /* Array index: 0x1FAC */ 0x8092,0x2477, + /* Array index: 0x1FAC */ 0x8095,0x2474, + /* Array index: 0x1FAC */ 0x8099,0x2475, + /* Array index: 0x1FAC */ 0x809C,0x2478, + /* Array index: 0x1FAC */ 0x80A3,0x284D, + /* Array index: 0x1FAC */ 0x80AD,0x2850, + /* Array index: 0x1FAC */ 0x80AE,0x284C, + /* Array index: 0x1FAC */ 0x80B5,0x284F, + /* Array index: 0x1FAC */ 0x80B8,0x284E, + /* Array index: 0x1FAC */ 0x80C2,0x2C7C, + /* Array index: 0x1FAC */ 0x80DC,0x2D23, + /* Array index: 0x1FAC */ 0x80E0,0x2C79, + /* Array index: 0x1FAC */ 0x80E3,0x2D21, + /* Array index: 0x1FAC */ 0x80E6,0x2D29, + /* Array index: 0x1FAC */ 0x80F2,0x322E, + /* Array index: 0x1FAC */ 0x80F5,0x3230, + /* Array index: 0x1FAC */ 0x80FE,0x3F2D, + /* Array index: 0x1FAC */ 0x8100,0x3233, + /* Array index: 0x1FAC */ 0x8101,0x3231, + /* Array index: 0x1FAC */ 0x8115,0x3852, + /* Array index: 0x1FAC */ 0x8118,0x3849, + /* Array index: 0x1FAC */ 0x8119,0x384B, + /* Array index: 0x1FAC */ 0x8125,0x384A, + /* Array index: 0x1FAC */ 0x8127,0x3853, + /* Array index: 0x1FAC */ 0x812C,0x384F, + /* Array index: 0x1FAC */ 0x812D,0x384D, + /* Array index: 0x1FAC */ 0x813A,0x3F36, + /* Array index: 0x1FAC */ 0x813D,0x3F34, + /* Array index: 0x1FAC */ 0x8143,0x3F2F, + /* Array index: 0x1FAC */ 0x8144,0x4646, + /* Array index: 0x1FAC */ 0x8147,0x3F33, + /* Array index: 0x1FAC */ 0x814A,0x3F30, + /* Array index: 0x1FAC */ 0x814D,0x3F35, + /* Array index: 0x1FAC */ 0x814F,0x3F32, + /* Array index: 0x1FAC */ 0x8152,0x3F31, + /* Array index: 0x1FAC */ 0x815B,0x463E, + /* Array index: 0x1FAC */ 0x815C,0x463C, + /* Array index: 0x1FAC */ 0x8167,0x4644, + /* Array index: 0x1FAC */ 0x8169,0x463D, + /* Array index: 0x1FAC */ 0x816F,0x4645, + /* Array index: 0x1FAC */ 0x8172,0x4640, + /* Array index: 0x1FAC */ 0x8176,0x4643, + /* Array index: 0x1FAC */ 0x8177,0x463B, + /* Array index: 0x1FAC */ 0x8183,0x4D2D, + /* Array index: 0x1FAC */ 0x8186,0x4D2C, + /* Array index: 0x1FAC */ 0x8187,0x4D2E, + /* Array index: 0x1FAC */ 0x8195,0x532A, + /* Array index: 0x1FAC */ 0x8197,0x532D, + /* Array index: 0x1FAC */ 0x8199,0x532C, + /* Array index: 0x1FAC */ 0x819E,0x5329, + /* Array index: 0x1FAC */ 0x819F,0x5328, + /* Array index: 0x1FAC */ 0x81A2,0x532B, + /* Array index: 0x1FAC */ 0x81A3,0x5327, + /* Array index: 0x1FAC */ 0x81A6,0x5955, + /* Array index: 0x1FAC */ 0x81A7,0x595F, + /* Array index: 0x1FAC */ 0x81AB,0x5959, + /* Array index: 0x1FAC */ 0x81AC,0x595B, + /* Array index: 0x1FAC */ 0x81C4,0x5E56, + /* Array index: 0x1FAC */ 0x81C5,0x5E59, + /* Array index: 0x1FAC */ 0x81C7,0x5E5A, + /* Array index: 0x1FAC */ 0x81CA,0x5E58, + /* Array index: 0x1FAC */ 0x81CC,0x5E57, + /* Array index: 0x1FAC */ 0x81D5,0x664C, + /* Array index: 0x1FAC */ 0x81D7,0x664B, + /* Array index: 0x1FAC */ 0x81D9,0x6961, + /* Array index: 0x1FAC */ 0x81DB,0x6960, + /* Array index: 0x1FAC */ 0x81E6,0x3F37, + /* Array index: 0x1FAC */ 0x81E9,0x5E5C, + /* Array index: 0x1FAC */ 0x81EE,0x3F38, + /* Array index: 0x1FAC */ 0x81F2,0x5960, + /* Array index: 0x1FAC */ 0x81FF,0x2D2B, + /* Array index: 0x1FAC */ 0x8201,0x3234, + /* Array index: 0x1FAC */ 0x8204,0x3F3C, + /* Array index: 0x1FAC */ 0x820B,0x664D, + /* Array index: 0x1FAC */ 0x8211,0x3856, + /* Array index: 0x1FAC */ 0x8215,0x4D32, + /* Array index: 0x1FAC */ 0x8216,0x532E, + /* Array index: 0x1FAC */ 0x821D,0x4648, + /* Array index: 0x1FAC */ 0x8220,0x2851, + /* Array index: 0x1FAC */ 0x8221,0x2D2C, + /* Array index: 0x1FAC */ 0x8225,0x3236, + /* Array index: 0x1FAC */ 0x822F,0x3235, + /* Array index: 0x1FAC */ 0x8238,0x3857, + /* Array index: 0x1FAC */ 0x823A,0x3859, + /* Array index: 0x1FAC */ 0x8249,0x4649, + /* Array index: 0x1FAC */ 0x8274,0x385C, + /* Array index: 0x1FAC */ 0x8275,0x3F40, + /* Array index: 0x1FAC */ 0x8278,0x226A, + /* Array index: 0x1FAC */ 0x828A,0x2521, + /* Array index: 0x1FAC */ 0x8298,0x2856, + /* Array index: 0x1FAC */ 0x829A,0x2855, + /* Array index: 0x1FAC */ 0x829B,0x2857, + /* Array index: 0x1FAC */ 0x82AE,0x285A, + /* Array index: 0x1FAC */ 0x82BA,0x285D, + /* Array index: 0x1FAC */ 0x82BC,0x285B, + /* Array index: 0x1FAC */ 0x82C0,0x2853, + /* Array index: 0x1FAC */ 0x82C2,0x2862, + /* Array index: 0x1FAC */ 0x82C3,0x2864, + /* Array index: 0x1FAC */ 0x82D5,0x2D34, + /* Array index: 0x1FAC */ 0x82D6,0x2D37, + /* Array index: 0x1FAC */ 0x82D9,0x2D2E, + /* Array index: 0x1FAC */ 0x82E0,0x2D43, + /* Array index: 0x1FAC */ 0x82E1,0x2D3A, + /* Array index: 0x1FAC */ 0x82E4,0x2D42, + /* Array index: 0x1FAC */ 0x82FE,0x2D2F, + /* Array index: 0x1FAC */ 0x8300,0x2D33, + /* Array index: 0x1FAC */ 0x8307,0x2D31, + /* Array index: 0x1FAC */ 0x8308,0x3247, + /* Array index: 0x1FAC */ 0x830C,0x2D3D, + /* Array index: 0x1FAC */ 0x830D,0x2942, + /* Array index: 0x1FAC */ 0x8316,0x324A, + /* Array index: 0x1FAC */ 0x8319,0x323A, + /* Array index: 0x1FAC */ 0x831B,0x3245, + /* Array index: 0x1FAC */ 0x831C,0x3241, + /* Array index: 0x1FAC */ 0x831E,0x3254, + /* Array index: 0x1FAC */ 0x8320,0x324C, + /* Array index: 0x1FAC */ 0x8333,0x3237, + /* Array index: 0x1FAC */ 0x8337,0x324D, + /* Array index: 0x1FAC */ 0x833F,0x323E, + /* Array index: 0x1FAC */ 0x8351,0x323B, + /* Array index: 0x1FAC */ 0x8353,0x3253, + /* Array index: 0x1FAC */ 0x8356,0x323D, + /* Array index: 0x1FAC */ 0x837A,0x3861, + /* Array index: 0x1FAC */ 0x8394,0x386A, + /* Array index: 0x1FAC */ 0x8395,0x3867, + /* Array index: 0x1FAC */ 0x83F3,0x3F63, + /* Array index: 0x1FAC */ 0x8406,0x3F61, + /* Array index: 0x1FAC */ 0x8409,0x3F5D, + /* Array index: 0x1FAC */ 0x841B,0x3F72, + /* Array index: 0x1FAC */ 0x8423,0x3F44, + /* Array index: 0x1FAC */ 0x8429,0x466C, + /* Array index: 0x1FAC */ 0x842B,0x4724, + /* Array index: 0x1FAC */ 0x842D,0x4671, + /* Array index: 0x1FAC */ 0x8465,0x4655, + /* Array index: 0x1FAC */ 0x8467,0x4659, + /* Array index: 0x1FAC */ 0x8468,0x4721, + /* Array index: 0x1FAC */ 0x8486,0x4658, + /* Array index: 0x1FAC */ 0x8494,0x4D49, + /* Array index: 0x1FAC */ 0x84B4,0x4D3E, + /* Array index: 0x1FAC */ 0x84B6,0x4D52, + /* Array index: 0x1FAC */ 0x84C1,0x4D3F, + /* Array index: 0x1FAC */ 0x84C2,0x4D39, + /* Array index: 0x1FAC */ 0x84C5,0x4679, + /* Array index: 0x1FAC */ 0x84C7,0x4D4A, + /* Array index: 0x1FAC */ 0x84DB,0x4D58, + /* Array index: 0x1FAC */ 0x8512,0x534E, + /* Array index: 0x1FAC */ 0x853B,0x5336, + /* Array index: 0x1FAC */ 0x853E,0x5974, + /* Array index: 0x1FAC */ 0x854D,0x5967, + /* Array index: 0x1FAC */ 0x854E,0x5977, + /* Array index: 0x1FAC */ 0x855B,0x5975, + /* Array index: 0x1FAC */ 0x855D,0x5A21, + /* Array index: 0x1FAC */ 0x856B,0x5966, + /* Array index: 0x1FAC */ 0x856C,0x5A24, + /* Array index: 0x1FAC */ 0x856E,0x5978, + /* Array index: 0x1FAC */ 0x8571,0x5976, + /* Array index: 0x1FAC */ 0x85A7,0x5E63, + /* Array index: 0x1FAC */ 0x85CB,0x6279, + /* Array index: 0x1FAC */ 0x85CE,0x627A, + /* Array index: 0x1FAC */ 0x85D1,0x6660, + /* Array index: 0x1FAC */ 0x85D2,0x6321, + /* Array index: 0x1FAC */ 0x85E6,0x6662, + /* Array index: 0x1FAC */ 0x85E8,0x6656, + /* Array index: 0x1FAC */ 0x85F6,0x696A, + /* Array index: 0x1FAC */ 0x85F8,0x665B, + /* Array index: 0x1FAC */ 0x8609,0x696C, + /* Array index: 0x1FAC */ 0x860C,0x696E, + /* Array index: 0x1FAC */ 0x8643,0x704A, + /* Array index: 0x1FAC */ 0x8652,0x325A, + /* Array index: 0x1FAC */ 0x8653,0x3259, + /* Array index: 0x1FAC */ 0x8656,0x3921, + /* Array index: 0x1FAC */ 0x8659,0x387E, + /* Array index: 0x1FAC */ 0x8677,0x2D47, + /* Array index: 0x1FAC */ 0x867C,0x2D49, + /* Array index: 0x1FAC */ 0x868B,0x3264, + /* Array index: 0x1FAC */ 0x86A5,0x3267, + /* Array index: 0x1FAC */ 0x86A7,0x326A, + /* Array index: 0x1FAC */ 0x86A8,0x325C, + /* Array index: 0x1FAC */ 0x86B0,0x3928, + /* Array index: 0x1FAC */ 0x86C8,0x3929, + /* Array index: 0x1FAC */ 0x86CC,0x392D, + /* Array index: 0x1FAC */ 0x86D1,0x4025, + /* Array index: 0x1FAC */ 0x86D3,0x3F78, + /* Array index: 0x1FAC */ 0x86E2,0x3F76, + /* Array index: 0x1FAC */ 0x86E3,0x3F79, + /* Array index: 0x1FAC */ 0x8701,0x4734, + /* Array index: 0x1FAC */ 0x8704,0x472A, + /* Array index: 0x1FAC */ 0x8705,0x4737, + /* Array index: 0x1FAC */ 0x871E,0x4D62, + /* Array index: 0x1FAC */ 0x8738,0x4D77, + /* Array index: 0x1FAC */ 0x873A,0x4D71, + /* Array index: 0x1FAC */ 0x873C,0x4D6F, + /* Array index: 0x1FAC */ 0x8746,0x4D6A, + /* Array index: 0x1FAC */ 0x8773,0x536D, + /* Array index: 0x1FAC */ 0x8775,0x5426, + /* Array index: 0x1FAC */ 0x8781,0x5A2F, + /* Array index: 0x1FAC */ 0x87A3,0x5A34, + /* Array index: 0x1FAC */ 0x87A4,0x5A28, + /* Array index: 0x1FAC */ 0x87C9,0x5F30, + /* Array index: 0x1FAC */ 0x87CA,0x5F37, + /* Array index: 0x1FAC */ 0x87CC,0x5F33, + /* Array index: 0x1FAC */ 0x87FA,0x6667, + /* Array index: 0x1FAC */ 0x87FC,0x666F, + /* Array index: 0x1FAC */ 0x8810,0x6971, + /* Array index: 0x1FAC */ 0x8811,0x6972, + /* Array index: 0x1FAC */ 0x8813,0x6974, + /* Array index: 0x1FAC */ 0x8816,0x6975, + /* Array index: 0x1FAC */ 0x8817,0x6973, + /* Array index: 0x1FAC */ 0x8820,0x6C32, + /* Array index: 0x1FAC */ 0x8848,0x4026, + /* Array index: 0x1FAC */ 0x884A,0x6C36, + /* Array index: 0x1FAC */ 0x884B,0x704E, + /* Array index: 0x1FAC */ 0x884E,0x2D4C, + /* Array index: 0x1FAC */ 0x8852,0x3934, + /* Array index: 0x1FAC */ 0x8855,0x4028, + /* Array index: 0x1FAC */ 0x8856,0x4027, + /* Array index: 0x1FAC */ 0x885A,0x542A, + /* Array index: 0x1FAC */ 0x8867,0x2D4D, + /* Array index: 0x1FAC */ 0x8869,0x2D4F, + /* Array index: 0x1FAC */ 0x886A,0x2D4E, + /* Array index: 0x1FAC */ 0x886D,0x3273, + /* Array index: 0x1FAC */ 0x886F,0x327A, + /* Array index: 0x1FAC */ 0x8883,0x327B, + /* Array index: 0x1FAC */ 0x8889,0x3935, + /* Array index: 0x1FAC */ 0x888C,0x3945, + /* Array index: 0x1FAC */ 0x888E,0x3947, + /* Array index: 0x1FAC */ 0x8891,0x393B, + /* Array index: 0x1FAC */ 0x8893,0x3946, + /* Array index: 0x1FAC */ 0x889F,0x393D, + /* Array index: 0x1FAC */ 0x88A1,0x393C, + /* Array index: 0x1FAC */ 0x88A2,0x3938, + /* Array index: 0x1FAC */ 0x88A4,0x3943, + /* Array index: 0x1FAC */ 0x88A7,0x393F, + /* Array index: 0x1FAC */ 0x88A8,0x3937, + /* Array index: 0x1FAC */ 0x88AA,0x3939, + /* Array index: 0x1FAC */ 0x88AC,0x3944, + /* Array index: 0x1FAC */ 0x88B2,0x4033, + /* Array index: 0x1FAC */ 0x88D6,0x4738, + /* Array index: 0x1FAC */ 0x88D7,0x402A, + /* Array index: 0x1FAC */ 0x88DA,0x473E, + /* Array index: 0x1FAC */ 0x88DB,0x473D, + /* Array index: 0x1FAC */ 0x88DE,0x473C, + /* Array index: 0x1FAC */ 0x88E7,0x4D7D, + /* Array index: 0x1FAC */ 0x88EB,0x4E2A, + /* Array index: 0x1FAC */ 0x88EC,0x4E29, + /* Array index: 0x1FAC */ 0x8901,0x4034, + /* Array index: 0x1FAC */ 0x8905,0x542B, + /* Array index: 0x1FAC */ 0x8906,0x5432, + /* Array index: 0x1FAC */ 0x8909,0x5436, + /* Array index: 0x1FAC */ 0x890B,0x542E, + /* Array index: 0x1FAC */ 0x890C,0x542C, + /* Array index: 0x1FAC */ 0x890E,0x5435, + /* Array index: 0x1FAC */ 0x8911,0x5434, + /* Array index: 0x1FAC */ 0x891E,0x5A3E, + /* Array index: 0x1FAC */ 0x891F,0x5A4A, + /* Array index: 0x1FAC */ 0x8922,0x5A45, + /* Array index: 0x1FAC */ 0x8923,0x5A47, + /* Array index: 0x1FAC */ 0x8926,0x5A3F, + /* Array index: 0x1FAC */ 0x8927,0x5A43, + /* Array index: 0x1FAC */ 0x8929,0x5A46, + /* Array index: 0x1FAC */ 0x893C,0x5F41, + /* Array index: 0x1FAC */ 0x893E,0x5F42, + /* Array index: 0x1FAC */ 0x8941,0x5F43, + /* Array index: 0x1FAC */ 0x8942,0x5F46, + /* Array index: 0x1FAC */ 0x8946,0x6341, + /* Array index: 0x1FAC */ 0x8949,0x6344, + /* Array index: 0x1FAC */ 0x8966,0x6977, + /* Array index: 0x1FAC */ 0x8969,0x6C38, + /* Array index: 0x1FAC */ 0x896B,0x6C3A, + /* Array index: 0x1FAC */ 0x896D,0x6C37, + /* Array index: 0x1FAC */ 0x896E,0x6C39, + /* Array index: 0x1FAC */ 0x8971,0x6E21, + /* Array index: 0x1FAC */ 0x8973,0x6F4C, + /* Array index: 0x1FAC */ 0x8974,0x6F4B, + /* Array index: 0x1FAC */ 0x8976,0x6F4A, + /* Array index: 0x1FAC */ 0x8982,0x3948, + /* Array index: 0x1FAC */ 0x8985,0x4741, + /* Array index: 0x1FAC */ 0x8988,0x667D, + /* Array index: 0x1FAC */ 0x8995,0x4036, + /* Array index: 0x1FAC */ 0x8997,0x4038, + /* Array index: 0x1FAC */ 0x8998,0x4037, + /* Array index: 0x1FAC */ 0x89B6,0x6721, + /* Array index: 0x1FAC */ 0x89B7,0x667E, + /* Array index: 0x1FAC */ 0x89B9,0x6978, + /* Array index: 0x1FAC */ 0x89BE,0x6E23, + /* Array index: 0x1FAC */ 0x89BF,0x6E22, + /* Array index: 0x1FAC */ 0x89D3,0x2D50, + /* Array index: 0x1FAC */ 0x8A04,0x2D51, + /* Array index: 0x1FAC */ 0x8A07,0x2D52, + /* Array index: 0x1FAC */ 0x8A12,0x3321, + /* Array index: 0x1FAC */ 0x8A1E,0x394F, + /* Array index: 0x1FAC */ 0x8A27,0x394D, + /* Array index: 0x1FAC */ 0x8A2C,0x394E, + /* Array index: 0x1FAC */ 0x8A30,0x394C, + /* Array index: 0x1FAC */ 0x8A39,0x403E, + /* Array index: 0x1FAC */ 0x8A3F,0x474F, + /* Array index: 0x1FAC */ 0x8A40,0x4040, + /* Array index: 0x1FAC */ 0x8A44,0x4043, + /* Array index: 0x1FAC */ 0x8A45,0x4044, + /* Array index: 0x1FAC */ 0x8A48,0x4046, + /* Array index: 0x1FAC */ 0x8A61,0x474E, + /* Array index: 0x1FAC */ 0x8A7A,0x4757, + /* Array index: 0x1FAC */ 0x8A8B,0x4E34, + /* Array index: 0x1FAC */ 0x8A8F,0x4E36, + /* Array index: 0x1FAC */ 0x8A92,0x4E35, + /* Array index: 0x1FAC */ 0x8A96,0x4E37, + /* Array index: 0x1FAC */ 0x8A99,0x4E33, + /* Array index: 0x1FAC */ 0x8AAB,0x4E32, + /* Array index: 0x1FAC */ 0x8AB8,0x543F, + /* Array index: 0x1FAC */ 0x8AC3,0x544A, + /* Array index: 0x1FAC */ 0x8AC5,0x5448, + /* Array index: 0x1FAC */ 0x8AC6,0x543E, + /* Array index: 0x1FAC */ 0x8AC8,0x5A56, + /* Array index: 0x1FAC */ 0x8ACF,0x543D, + /* Array index: 0x1FAC */ 0x8AE8,0x5A59, + /* Array index: 0x1FAC */ 0x8AEF,0x5A5B, + /* Array index: 0x1FAC */ 0x8AF0,0x5A55, + /* Array index: 0x1FAC */ 0x8AF2,0x5A4E, + /* Array index: 0x1FAC */ 0x8AF4,0x5A4F, + /* Array index: 0x1FAC */ 0x8AF5,0x5A50, + /* Array index: 0x1FAC */ 0x8AFB,0x5A5C, + /* Array index: 0x1FAC */ 0x8AFF,0x5A5A, + /* Array index: 0x1FAC */ 0x8B0B,0x5F51, + /* Array index: 0x1FAC */ 0x8B0D,0x5F57, + /* Array index: 0x1FAC */ 0x8B2A,0x6345, + /* Array index: 0x1FAC */ 0x8B45,0x6C3E, + /* Array index: 0x1FAC */ 0x8B5D,0x697C, + /* Array index: 0x1FAC */ 0x8B60,0x697A, + /* Array index: 0x1FAC */ 0x8B63,0x697E, + /* Array index: 0x1FAC */ 0x8B65,0x6A21, + /* Array index: 0x1FAC */ 0x8B67,0x6A22, + /* Array index: 0x1FAC */ 0x8B68,0x697D, + /* Array index: 0x1FAC */ 0x8B6A,0x697B, + /* Array index: 0x1FAC */ 0x8B6D,0x6A23, + /* Array index: 0x1FAC */ 0x8B94,0x704F, + /* Array index: 0x1FAC */ 0x8B95,0x7050, + /* Array index: 0x1FAC */ 0x8B98,0x713C, + /* Array index: 0x1FAC */ 0x8B99,0x713D, + /* Array index: 0x1FAC */ 0x8B9E,0x7177, + /* Array index: 0x1FAC */ 0x8B9F,0x7236, + /* Array index: 0x1FAC */ 0x8C42,0x6359, + /* Array index: 0x1FAC */ 0x8C43,0x6730, + /* Array index: 0x1FAC */ 0x8C45,0x6F52, + /* Array index: 0x1FAC */ 0x8C47,0x3322, + /* Array index: 0x1FAC */ 0x8C4A,0x475A, + /* Array index: 0x1FAC */ 0x8C4B,0x4759, + /* Array index: 0x1FAC */ 0x8C4D,0x544F, + /* Array index: 0x1FAC */ 0x8C4F,0x5F5D, + /* Array index: 0x1FAC */ 0x8C56,0x286B, + /* Array index: 0x1FAC */ 0x8C57,0x3323, + /* Array index: 0x1FAC */ 0x8C5C,0x3952, + /* Array index: 0x1FAC */ 0x8C5D,0x3953, + /* Array index: 0x1FAC */ 0x8C5F,0x404B, + /* Array index: 0x1FAC */ 0x8C7B,0x3324, + /* Array index: 0x1FAC */ 0x8C7D,0x3954, + /* Array index: 0x1FAC */ 0x8CB0,0x4050, + /* Array index: 0x1FAC */ 0x8CB5,0x4052, + /* Array index: 0x1FAC */ 0x8CB9,0x4051, + /* Array index: 0x1FAC */ 0x8CBA,0x404E, + /* Array index: 0x1FAC */ 0x8CBE,0x404F, + /* Array index: 0x1FAC */ 0x8CCC,0x4761, + /* Array index: 0x1FAC */ 0x8CCF,0x4E3C, + /* Array index: 0x1FAC */ 0x8CD5,0x4E3B, + /* Array index: 0x1FAC */ 0x8CD7,0x4E3D, + /* Array index: 0x1FAC */ 0x8CD9,0x5453, + /* Array index: 0x1FAC */ 0x8CDA,0x5455, + /* Array index: 0x1FAC */ 0x8CDD,0x5456, + /* Array index: 0x1FAC */ 0x8CDF,0x5452, + /* Array index: 0x1FAC */ 0x8CE5,0x5451, + /* Array index: 0x1FAC */ 0x8CE7,0x5457, + /* Array index: 0x1FAC */ 0x8CE8,0x5454, + /* Array index: 0x1FAC */ 0x8CEE,0x5A61, + /* Array index: 0x1FAC */ 0x8CF0,0x5A63, + /* Array index: 0x1FAC */ 0x8CF1,0x5A62, + /* Array index: 0x1FAC */ 0x8CF3,0x5A64, + /* Array index: 0x1FAC */ 0x8CF5,0x5A60, + /* Array index: 0x1FAC */ 0x8CF9,0x5F64, + /* Array index: 0x1FAC */ 0x8CFE,0x635E, + /* Array index: 0x1FAC */ 0x8D00,0x6361, + /* Array index: 0x1FAC */ 0x8D02,0x6360, + /* Array index: 0x1FAC */ 0x8D04,0x635F, + /* Array index: 0x1FAC */ 0x8D06,0x6734, + /* Array index: 0x1FAC */ 0x8D07,0x6735, + /* Array index: 0x1FAC */ 0x8D09,0x6736, + /* Array index: 0x1FAC */ 0x8D10,0x6C41, + /* Array index: 0x1FAC */ 0x8D14,0x6C42, + /* Array index: 0x1FAC */ 0x8D15,0x6E2B, + /* Array index: 0x1FAC */ 0x8D19,0x6F53, + /* Array index: 0x1FAC */ 0x8D68,0x4762, + /* Array index: 0x1FAC */ 0x8D69,0x4763, + /* Array index: 0x1FAC */ 0x8D6C,0x5A65, + /* Array index: 0x1FAC */ 0x8D6E,0x5A66, + /* Array index: 0x1FAC */ 0x8D6F,0x5F65, + /* Array index: 0x1FAC */ 0x8D72,0x2D53, + /* Array index: 0x1FAC */ 0x8D76,0x3327, + /* Array index: 0x1FAC */ 0x8D78,0x3328, + /* Array index: 0x1FAC */ 0x8D79,0x3958, + /* Array index: 0x1FAC */ 0x8D7B,0x3957, + /* Array index: 0x1FAC */ 0x8D7D,0x3956, + /* Array index: 0x1FAC */ 0x8D80,0x4054, + /* Array index: 0x1FAC */ 0x8D84,0x4053, + /* Array index: 0x1FAC */ 0x8D89,0x4055, + /* Array index: 0x1FAC */ 0x8D9B,0x545B, + /* Array index: 0x1FAC */ 0x8D9C,0x5459, + /* Array index: 0x1FAC */ 0x8DA0,0x5458, + /* Array index: 0x1FAC */ 0x8DA1,0x545A, + /* Array index: 0x1FAC */ 0x8DA5,0x5A67, + /* Array index: 0x1FAC */ 0x8DA7,0x5A68, + /* Array index: 0x1FAC */ 0x8DB2,0x715E, + /* Array index: 0x1FAC */ 0x8DBC,0x3959, + /* Array index: 0x1FAC */ 0x8DBF,0x395C, + /* Array index: 0x1FAC */ 0x8DC1,0x395D, + /* Array index: 0x1FAC */ 0x8DC2,0x395A, + /* Array index: 0x1FAC */ 0x8DC5,0x4061, + /* Array index: 0x1FAC */ 0x8DC7,0x4059, + /* Array index: 0x1FAC */ 0x8DC8,0x405F, + /* Array index: 0x1FAC */ 0x8DCD,0x4058, + /* Array index: 0x1FAC */ 0x8DCF,0x405C, + /* Array index: 0x1FAC */ 0x8DD0,0x4772, + /* Array index: 0x1FAC */ 0x8DDC,0x405B, + /* Array index: 0x1FAC */ 0x8DE0,0x476E, + /* Array index: 0x1FAC */ 0x8DE2,0x4775, + /* Array index: 0x1FAC */ 0x8DE3,0x4774, + /* Array index: 0x1FAC */ 0x8DE7,0x4776, + /* Array index: 0x1FAC */ 0x8DE9,0x4773, + /* Array index: 0x1FAC */ 0x8DEB,0x4778, + /* Array index: 0x1FAC */ 0x8DEC,0x476F, + /* Array index: 0x1FAC */ 0x8E0D,0x4E42, + /* Array index: 0x1FAC */ 0x8E20,0x545C, + /* Array index: 0x1FAC */ 0x8E2E,0x5460, + /* Array index: 0x1FAC */ 0x8E30,0x5A72, + /* Array index: 0x1FAC */ 0x8E33,0x5A69, + /* Array index: 0x1FAC */ 0x8E36,0x5A6E, + /* Array index: 0x1FAC */ 0x8E38,0x5A6B, + /* Array index: 0x1FAC */ 0x8E45,0x5A6D, + /* Array index: 0x1FAC */ 0x8E47,0x5F6B, + /* Array index: 0x1FAC */ 0x8E65,0x6368, + /* Array index: 0x1FAC */ 0x8E67,0x6369, + /* Array index: 0x1FAC */ 0x8E69,0x636E, + /* Array index: 0x1FAC */ 0x8E6A,0x673E, + /* Array index: 0x1FAC */ 0x8E6D,0x673B, + /* Array index: 0x1FAC */ 0x8E6F,0x673F, + /* Array index: 0x1FAC */ 0x8E73,0x673D, + /* Array index: 0x1FAC */ 0x8E78,0x673C, + /* Array index: 0x1FAC */ 0x8E7B,0x6740, + /* Array index: 0x1FAC */ 0x8E84,0x6A27, + /* Array index: 0x1FAC */ 0x8E86,0x6A25, + /* Array index: 0x1FAC */ 0x8E88,0x6A26, + /* Array index: 0x1FAC */ 0x8E8C,0x6C45, + /* Array index: 0x1FAC */ 0x8E8E,0x6C44, + /* Array index: 0x1FAC */ 0x8E90,0x6E30, + /* Array index: 0x1FAC */ 0x8EBD,0x5A74, + /* Array index: 0x1FAC */ 0x8EC2,0x6741, + /* Array index: 0x1FAC */ 0x8EC9,0x717A, + /* Array index: 0x1FAC */ 0x8ED1,0x332C, + /* Array index: 0x1FAC */ 0x8ED3,0x332D, + /* Array index: 0x1FAC */ 0x8ED7,0x3962, + /* Array index: 0x1FAC */ 0x8ED8,0x395E, + /* Array index: 0x1FAC */ 0x8F0B,0x4824, + /* Array index: 0x1FAC */ 0x8F20,0x5473, + /* Array index: 0x1FAC */ 0x8F23,0x5474, + /* Array index: 0x1FAC */ 0x8F24,0x5470, + /* Array index: 0x1FAC */ 0x8F2C,0x546F, + /* Array index: 0x1FAC */ 0x8F2E,0x5A76, + /* Array index: 0x1FAC */ 0x8F40,0x5F6D, + /* Array index: 0x1FAC */ 0x8F43,0x5F6C, + /* Array index: 0x1FAC */ 0x8F4B,0x6373, + /* Array index: 0x1FAC */ 0x8FB4,0x6747, + /* Array index: 0x1FAC */ 0x8FBF,0x2526, + /* Array index: 0x1FAC */ 0x8FC9,0x2525, + /* Array index: 0x1FAC */ 0x8FCB,0x286D, + /* Array index: 0x1FAC */ 0x8FCD,0x286F, + /* Array index: 0x1FAC */ 0x8FE0,0x2D57, + /* Array index: 0x1FAC */ 0x8FE1,0x2D55, + /* Array index: 0x1FAC */ 0x8FE3,0x2D54, + /* Array index: 0x1FAC */ 0x8FEE,0x2D56, + /* Array index: 0x1FAC */ 0x8FF5,0x332F, + /* Array index: 0x1FAC */ 0x8FF6,0x3335, + /* Array index: 0x1FAC */ 0x9002,0x3330, + /* Array index: 0x1FAC */ 0x9004,0x3333, + /* Array index: 0x1FAC */ 0x900B,0x3966, + /* Array index: 0x1FAC */ 0x900C,0x3969, + /* Array index: 0x1FAC */ 0x9011,0x3967, + /* Array index: 0x1FAC */ 0x901C,0x3968, + /* Array index: 0x1FAC */ 0x9021,0x396A, + /* Array index: 0x1FAC */ 0x9024,0x3965, + /* Array index: 0x1FAC */ 0x902D,0x4072, + /* Array index: 0x1FAC */ 0x902F,0x4074, + /* Array index: 0x1FAC */ 0x9034,0x4073, + /* Array index: 0x1FAC */ 0x903D,0x4829, + /* Array index: 0x1FAC */ 0x903F,0x4826, + /* Array index: 0x1FAC */ 0x9044,0x4827, + /* Array index: 0x1FAC */ 0x9049,0x4828, + /* Array index: 0x1FAC */ 0x9052,0x4825, + /* Array index: 0x1FAC */ 0x9067,0x547A, + /* Array index: 0x1FAC */ 0x906B,0x547B, + /* Array index: 0x1FAC */ 0x906F,0x5479, + /* Array index: 0x1FAC */ 0x9070,0x5478, + /* Array index: 0x1FAC */ 0x9073,0x5477, + /* Array index: 0x1FAC */ 0x9076,0x5A7C, + /* Array index: 0x1FAC */ 0x9079,0x5A7D, + /* Array index: 0x1FAC */ 0x907B,0x5A7E, + /* Array index: 0x1FAC */ 0x907E,0x5F6F, + /* Array index: 0x1FAC */ 0x9085,0x5F6E, + /* Array index: 0x1FAC */ 0x9086,0x5B21, + /* Array index: 0x1FAC */ 0x908D,0x6A2E, + /* Array index: 0x1FAC */ 0x9094,0x2275, + /* Array index: 0x1FAC */ 0x90A5,0x2529, + /* Array index: 0x1FAC */ 0x90A7,0x252B, + /* Array index: 0x1FAC */ 0x90C5,0x2D5C, + /* Array index: 0x1FAC */ 0x90C7,0x2D5E, + /* Array index: 0x1FAC */ 0x90C8,0x2D60, + /* Array index: 0x1FAC */ 0x90CB,0x2D5F, + /* Array index: 0x1FAC */ 0x9114,0x482F, + /* Array index: 0x1FAC */ 0x9116,0x482E, + /* Array index: 0x1FAC */ 0x9153,0x3978, + /* Array index: 0x1FAC */ 0x9155,0x3979, + /* Array index: 0x1FAC */ 0x9156,0x3975, + /* Array index: 0x1FAC */ 0x9158,0x3976, + /* Array index: 0x1FAC */ 0x915A,0x3977, + /* Array index: 0x1FAC */ 0x9168,0x4279, + /* Array index: 0x1FAC */ 0x916E,0x4832, + /* Array index: 0x1FAC */ 0x916F,0x4833, + /* Array index: 0x1FAC */ 0x9172,0x4E5B, + /* Array index: 0x1FAC */ 0x9173,0x4E5D, + /* Array index: 0x1FAC */ 0x9179,0x4E5C, + /* Array index: 0x1FAC */ 0x917A,0x4E5A, + /* Array index: 0x1FAC */ 0x918A,0x5527, + /* Array index: 0x1FAC */ 0x91A5,0x6379, + /* Array index: 0x1FAC */ 0x91A7,0x637A, + /* Array index: 0x1FAC */ 0x91A8,0x6378, + /* Array index: 0x1FAC */ 0x91AA,0x637C, + /* Array index: 0x1FAC */ 0x91AD,0x674B, + /* Array index: 0x1FAC */ 0x91C2,0x7057, + /* Array index: 0x1FAC */ 0x91C3,0x7160, + /* Array index: 0x1FAC */ 0x91DA,0x3347, + /* Array index: 0x1FAC */ 0x91E2,0x3346, + /* Array index: 0x1FAC */ 0x91E4,0x3A21, + /* Array index: 0x1FAC */ 0x91F1,0x397C, + /* Array index: 0x1FAC */ 0x920A,0x412A, + /* Array index: 0x1FAC */ 0x920C,0x4130, + /* Array index: 0x1FAC */ 0x920F,0x412F, + /* Array index: 0x1FAC */ 0x9212,0x4132, + /* Array index: 0x1FAC */ 0x9236,0x4846, + /* Array index: 0x1FAC */ 0x923A,0x4837, + /* Array index: 0x1FAC */ 0x9246,0x483F, + /* Array index: 0x1FAC */ 0x9248,0x4834, + /* Array index: 0x1FAC */ 0x924A,0x483E, + /* Array index: 0x1FAC */ 0x925E,0x483B, + /* Array index: 0x1FAC */ 0x9260,0x4843, + /* Array index: 0x1FAC */ 0x9261,0x4847, + /* Array index: 0x1FAC */ 0x9276,0x4E60, + /* Array index: 0x1FAC */ 0x9294,0x4E64, + /* Array index: 0x1FAC */ 0x9295,0x4E71, + /* Array index: 0x1FAC */ 0x92EE,0x4E6E, + /* Array index: 0x1FAC */ 0x92EF,0x553A, + /* Array index: 0x1FAC */ 0x92F1,0x5533, + /* Array index: 0x1FAC */ 0x9306,0x5B2F, + /* Array index: 0x1FAC */ 0x932D,0x5B39, + /* Array index: 0x1FAC */ 0x9334,0x5B42, + /* Array index: 0x1FAC */ 0x9335,0x5B48, + /* Array index: 0x1FAC */ 0x9338,0x5B32, + /* Array index: 0x1FAC */ 0x9339,0x5B47, + /* Array index: 0x1FAC */ 0x933C,0x5B33, + /* Array index: 0x1FAC */ 0x9346,0x5B38, + /* Array index: 0x1FAC */ 0x9347,0x5F7E, + /* Array index: 0x1FAC */ 0x9349,0x6025, + /* Array index: 0x1FAC */ 0x935C,0x6023, + /* Array index: 0x1FAC */ 0x935E,0x6036, + /* Array index: 0x1FAC */ 0x9367,0x6038, + /* Array index: 0x1FAC */ 0x936A,0x602C, + /* Array index: 0x1FAC */ 0x936D,0x6029, + /* Array index: 0x1FAC */ 0x9371,0x6032, + /* Array index: 0x1FAC */ 0x9380,0x642F, + /* Array index: 0x1FAC */ 0x9383,0x5F7A, + /* Array index: 0x1FAC */ 0x9395,0x642B, + /* Array index: 0x1FAC */ 0x9399,0x642D, + /* Array index: 0x1FAC */ 0x93AF,0x5F7B, + /* Array index: 0x1FAC */ 0x93C0,0x675F, + /* Array index: 0x1FAC */ 0x93C2,0x674F, + /* Array index: 0x1FAC */ 0x93C4,0x675D, + /* Array index: 0x1FAC */ 0x93C7,0x674D, + /* Array index: 0x1FAC */ 0x93CA,0x6758, + /* Array index: 0x1FAC */ 0x93D9,0x6755, + /* Array index: 0x1FAC */ 0x93DA,0x6750, + /* Array index: 0x1FAC */ 0x93DE,0x674C, + /* Array index: 0x1FAC */ 0x93E3,0x675B, + /* Array index: 0x1FAC */ 0x93E6,0x6757, + /* Array index: 0x1FAC */ 0x93E7,0x6762, + /* Array index: 0x1FAC */ 0x93EC,0x6753, + /* Array index: 0x1FAC */ 0x93EE,0x675A, + /* Array index: 0x1FAC */ 0x9419,0x6A3F, + /* Array index: 0x1FAC */ 0x9420,0x6A38, + /* Array index: 0x1FAC */ 0x9430,0x6C52, + /* Array index: 0x1FAC */ 0x9431,0x6C58, + /* Array index: 0x1FAC */ 0x9436,0x6C4F, + /* Array index: 0x1FAC */ 0x9437,0x6C55, + /* Array index: 0x1FAC */ 0x9455,0x6F59, + /* Array index: 0x1FAC */ 0x9457,0x6F5B, + /* Array index: 0x1FAC */ 0x945D,0x6F5A, + /* Array index: 0x1FAC */ 0x945E,0x6F5C, + /* Array index: 0x1FAC */ 0x9462,0x6F58, + /* Array index: 0x1FAC */ 0x9468,0x7059, + /* Array index: 0x1FAC */ 0x9469,0x705A, + /* Array index: 0x1FAC */ 0x9586,0x3A29, + /* Array index: 0x1FAC */ 0x9588,0x3A2A, + /* Array index: 0x1FAC */ 0x958C,0x4141, + /* Array index: 0x1FAC */ 0x958D,0x4140, + /* Array index: 0x1FAC */ 0x9590,0x4142, + /* Array index: 0x1FAC */ 0x95AB,0x5550, + /* Array index: 0x1FAC */ 0x95AC,0x554F, + /* Array index: 0x1FAC */ 0x95AE,0x5551, + /* Array index: 0x1FAC */ 0x95B0,0x5552, + /* Array index: 0x1FAC */ 0x95C3,0x603E, + /* Array index: 0x1FAC */ 0x95C5,0x603F, + /* Array index: 0x1FAC */ 0x95C7,0x603B, + /* Array index: 0x1FAC */ 0x95C9,0x603D, + /* Array index: 0x1FAC */ 0x95CD,0x5B53, + /* Array index: 0x1FAC */ 0x961E,0x2169, + /* Array index: 0x1FAC */ 0x9628,0x252E, + /* Array index: 0x1FAC */ 0x962D,0x2530, + /* Array index: 0x1FAC */ 0x962F,0x252F, + /* Array index: 0x1FAC */ 0x9630,0x252D, + /* Array index: 0x1FAC */ 0x9643,0x287C, + /* Array index: 0x1FAC */ 0x964A,0x2D67, + /* Array index: 0x1FAC */ 0x964E,0x2D68, + /* Array index: 0x1FAC */ 0x964F,0x2D64, + /* Array index: 0x1FAC */ 0x9651,0x2D65, + /* Array index: 0x1FAC */ 0x9653,0x2D66, + /* Array index: 0x1FAC */ 0x9654,0x2D63, + /* Array index: 0x1FAC */ 0x965C,0x3348, + /* Array index: 0x1FAC */ 0x965F,0x3349, + /* Array index: 0x1FAC */ 0x966B,0x3A2D, + /* Array index: 0x1FAC */ 0x966D,0x3A2C, + /* Array index: 0x1FAC */ 0x966F,0x3A2F, + /* Array index: 0x1FAC */ 0x9671,0x3A2E, + /* Array index: 0x1FAC */ 0x967C,0x3A2B, + /* Array index: 0x1FAC */ 0x967E,0x4144, + /* Array index: 0x1FAC */ 0x9680,0x4148, + /* Array index: 0x1FAC */ 0x9683,0x4147, + /* Array index: 0x1FAC */ 0x9697,0x485A, + /* Array index: 0x1FAC */ 0x969E,0x4F23, + /* Array index: 0x1FAC */ 0x96A1,0x4F24, + /* Array index: 0x1FAC */ 0x96A2,0x5554, + /* Array index: 0x1FAC */ 0x96A4,0x5553, + /* Array index: 0x1FAC */ 0x96A9,0x5B5B, + /* Array index: 0x1FAC */ 0x96AC,0x6043, + /* Array index: 0x1FAC */ 0x96AE,0x6041, + /* Array index: 0x1FAC */ 0x96B0,0x6042, + /* Array index: 0x1FAC */ 0x96B3,0x643B, + /* Array index: 0x1FAC */ 0x96BC,0x334A, + /* Array index: 0x1FAC */ 0x96BF,0x3A30, + /* Array index: 0x1FAC */ 0x96C2,0x4149, + /* Array index: 0x1FAC */ 0x96C3,0x414B, + /* Array index: 0x1FAC */ 0x96C8,0x414A, + /* Array index: 0x1FAC */ 0x96CE,0x485B, + /* Array index: 0x1FAC */ 0x96D3,0x5555, + /* Array index: 0x1FAC */ 0x96D4,0x5B5C, + /* Array index: 0x1FAC */ 0x96D7,0x643C, + /* Array index: 0x1FAC */ 0x96D8,0x6440, + /* Array index: 0x1FAC */ 0x96DA,0x643D, + /* Array index: 0x1FAC */ 0x96DD,0x6441, + /* Array index: 0x1FAC */ 0x96DF,0x643F, + /* Array index: 0x1FAC */ 0x96E1,0x6766, + /* Array index: 0x1FAC */ 0x96E5,0x705B, + /* Array index: 0x1FAC */ 0x96F0,0x414D, + /* Array index: 0x1FAC */ 0x96F1,0x414C, + /* Array index: 0x1FAC */ 0x96F5,0x485F, + /* Array index: 0x1FAC */ 0x96F8,0x485E, + /* Array index: 0x1FAC */ 0x96FA,0x485C, + /* Array index: 0x1FAC */ 0x96FD,0x485D, + /* Array index: 0x1FAC */ 0x96FF,0x4F25, + /* Array index: 0x1FAC */ 0x9702,0x5558, + /* Array index: 0x1FAC */ 0x9705,0x5556, + /* Array index: 0x1FAC */ 0x9708,0x5557, + /* Array index: 0x1FAC */ 0x970B,0x5B5D, + /* Array index: 0x1FAC */ 0x9710,0x5B5F, + /* Array index: 0x1FAC */ 0x9712,0x5B5E, + /* Array index: 0x1FAC */ 0x9718,0x6046, + /* Array index: 0x1FAC */ 0x9719,0x6048, + /* Array index: 0x1FAC */ 0x971D,0x6047, + /* Array index: 0x1FAC */ 0x9735,0x6C5C, + /* Array index: 0x1FAC */ 0x973A,0x6C5D, + /* Array index: 0x1FAC */ 0x973F,0x6E40, + /* Array index: 0x1FAC */ 0x9743,0x705D, + /* Array index: 0x1FAC */ 0x9746,0x705C, + /* Array index: 0x1FAC */ 0x9747,0x705E, + /* Array index: 0x1FAC */ 0x9749,0x7146, + /* Array index: 0x1FAC */ 0x974B,0x717B, + /* Array index: 0x1FAC */ 0x9758,0x4F26, + /* Array index: 0x1FAC */ 0x975A,0x5559, + /* Array index: 0x1FAC */ 0x976A,0x3A31, + /* Array index: 0x1FAC */ 0x976C,0x414E, + /* Array index: 0x1FAC */ 0x976E,0x4150, + /* Array index: 0x1FAC */ 0x9770,0x414F, + /* Array index: 0x1FAC */ 0x9772,0x4863, + /* Array index: 0x1FAC */ 0x9773,0x4860, + /* Array index: 0x1FAC */ 0x9788,0x555C, + /* Array index: 0x1FAC */ 0x978A,0x555A, + /* Array index: 0x1FAC */ 0x978E,0x555B, + /* Array index: 0x1FAC */ 0x9794,0x5B62, + /* Array index: 0x1FAC */ 0x9797,0x5B61, + /* Array index: 0x1FAC */ 0x97B3,0x676C, + /* Array index: 0x1FAC */ 0x97B6,0x676E, + /* Array index: 0x1FAC */ 0x97B7,0x676D, + /* Array index: 0x1FAC */ 0x97B9,0x6A58, + /* Array index: 0x1FAC */ 0x97BB,0x6A59, + /* Array index: 0x1FAC */ 0x97BF,0x6C5E, + /* Array index: 0x1FAC */ 0x97C4,0x6F5D, + /* Array index: 0x1FAC */ 0x97C5,0x6F5E, + /* Array index: 0x1FAC */ 0x97C7,0x705F, + /* Array index: 0x1FAC */ 0x97F0,0x5B63, + /* Array index: 0x1FAC */ 0x97F1,0x6050, + /* Array index: 0x1FAC */ 0x97F8,0x5B64, + /* Array index: 0x1FAC */ 0x97FA,0x6451, + /* Array index: 0x1FAC */ 0x97FD,0x6A5A, + /* Array index: 0x1FAC */ 0x97FE,0x6A5B, + /* Array index: 0x1FAC */ 0x9800,0x6F5F, + /* Array index: 0x1FAC */ 0x9804,0x3A32, + /* Array index: 0x1FAC */ 0x9807,0x4151, + /* Array index: 0x1FAC */ 0x9816,0x4F33, + /* Array index: 0x1FAC */ 0x981B,0x5565, + /* Array index: 0x1FAC */ 0x981D,0x5560, + /* Array index: 0x1FAC */ 0x981E,0x555F, + /* Array index: 0x1FAC */ 0x9820,0x5564, + /* Array index: 0x1FAC */ 0x982F,0x5B66, + /* Array index: 0x1FAC */ 0x9832,0x5B67, + /* Array index: 0x1FAC */ 0x9835,0x5B65, + /* Array index: 0x1FAC */ 0x9857,0x6775, + /* Array index: 0x1FAC */ 0x9859,0x6773, + /* Array index: 0x1FAC */ 0x9869,0x6E43, + /* Array index: 0x1FAC */ 0x986A,0x6E42, + /* Array index: 0x1FAC */ 0x98A9,0x4152, + /* Array index: 0x1FAC */ 0x98B2,0x5567, + /* Array index: 0x1FAC */ 0x98B8,0x6455, + /* Array index: 0x1FAC */ 0x98C6,0x6C62, + /* Array index: 0x1FAC */ 0x98C9,0x6C61, + /* Array index: 0x1FAC */ 0x98CB,0x6E44, + /* Array index: 0x1FAC */ 0x98CC,0x717E, + /* Array index: 0x1FAC */ 0x98E3,0x334B, + /* Array index: 0x1FAC */ 0x98E5,0x3A33, + /* Array index: 0x1FAC */ 0x98EB,0x4153, + /* Array index: 0x1FAC */ 0x98F6,0x4868, + /* Array index: 0x1FAC */ 0x98F9,0x4869, + /* Array index: 0x1FAC */ 0x98FA,0x5569, + /* Array index: 0x1FAC */ 0x9900,0x4F37, + /* Array index: 0x1FAC */ 0x9902,0x4F36, + /* Array index: 0x1FAC */ 0x9907,0x4F38, + /* Array index: 0x1FAC */ 0x9908,0x5568, + /* Array index: 0x1FAC */ 0x9911,0x556A, + /* Array index: 0x1FAC */ 0x991F,0x5B69, + /* Array index: 0x1FAC */ 0x9924,0x5B68, + /* Array index: 0x1FAC */ 0x9925,0x6057, + /* Array index: 0x1FAC */ 0x993A,0x6458, + /* Array index: 0x1FAC */ 0x993C,0x6457, + /* Array index: 0x1FAC */ 0x9941,0x6456, + /* Array index: 0x1FAC */ 0x9943,0x677C, + /* Array index: 0x1FAC */ 0x9947,0x677B, + /* Array index: 0x1FAC */ 0x9948,0x677A, + /* Array index: 0x1FAC */ 0x994B,0x6A66, + /* Array index: 0x1FAC */ 0x994C,0x6A65, + /* Array index: 0x1FAC */ 0x994E,0x6A63, + /* Array index: 0x1FAC */ 0x9950,0x6A62, + /* Array index: 0x1FAC */ 0x9953,0x6A67, + /* Array index: 0x1FAC */ 0x9954,0x6E45, + /* Array index: 0x1FAC */ 0x9956,0x6C65, + /* Array index: 0x1FAC */ 0x9958,0x6C64, + /* Array index: 0x1FAC */ 0x9959,0x6A64, + /* Array index: 0x1FAC */ 0x995B,0x6E46, + /* Array index: 0x1FAC */ 0x995F,0x7148, + /* Array index: 0x1FAC */ 0x9961,0x7221, + /* Array index: 0x1FAC */ 0x9997,0x3A34, + /* Array index: 0x1FAC */ 0x9998,0x6061, + /* Array index: 0x1FAC */ 0x99A1,0x6063, + /* Array index: 0x1FAC */ 0x99A3,0x6062, + /* Array index: 0x1FAC */ 0x99A6,0x677D, + /* Array index: 0x1FAC */ 0x99A7,0x677E, + /* Array index: 0x1FAC */ 0x99AB,0x7222, + /* Array index: 0x1FAC */ 0x99AF,0x486A, + /* Array index: 0x1FAC */ 0x99B0,0x486C, + /* Array index: 0x1FAC */ 0x99B2,0x486B, + /* Array index: 0x1FAC */ 0x99B5,0x486D, + /* Array index: 0x1FAC */ 0x99C2,0x4F3F, + /* Array index: 0x1FAC */ 0x99C3,0x4F3B, + /* Array index: 0x1FAC */ 0x99C7,0x4F41, + /* Array index: 0x1FAC */ 0x99DC,0x556F, + /* Array index: 0x1FAC */ 0x9A3D,0x6C67, + /* Array index: 0x1FAC */ 0x9A3F,0x6C6D, + /* Array index: 0x1FAC */ 0x9A41,0x6C6B, + /* Array index: 0x1FAC */ 0x9A42,0x6C6A, + /* Array index: 0x1FAC */ 0x9A44,0x6C69, + /* Array index: 0x1FAC */ 0x9A59,0x6F61, + /* Array index: 0x1FAC */ 0x9A5E,0x7061, + /* Array index: 0x1FAC */ 0x9A60,0x7165, + /* Array index: 0x1FAC */ 0x9AAB,0x486F, + /* Array index: 0x1FAC */ 0x9AAD,0x486E, + /* Array index: 0x1FAC */ 0x9AB1,0x4F42, + /* Array index: 0x1FAC */ 0x9AB3,0x557B, + /* Array index: 0x1FAC */ 0x9AB4,0x5B78, + /* Array index: 0x1FAC */ 0x9AB9,0x5B76, + /* Array index: 0x1FAC */ 0x9ABB,0x5B79, + /* Array index: 0x1FAC */ 0x9AC6,0x6A74, + /* Array index: 0x1FAC */ 0x9AC7,0x6A72, + /* Array index: 0x1FAC */ 0x9ACA,0x6A73, + /* Array index: 0x1FAC */ 0x9ACD,0x6C6E, + /* Array index: 0x1FAC */ 0x9AD0,0x6E51, + /* Array index: 0x1FAC */ 0x9AD5,0x7062, + /* Array index: 0x1FAC */ 0x9ADC,0x6464, + /* Array index: 0x1FAC */ 0x9ADF,0x334C, + /* Array index: 0x1FAC */ 0x9AE3,0x4F43, + /* Array index: 0x1FAC */ 0x9AE7,0x4F44, + /* Array index: 0x1FAC */ 0x9AEB,0x557D, + /* Array index: 0x1FAC */ 0x9AEC,0x557C, + /* Array index: 0x1FAC */ 0x9B01,0x6073, + /* Array index: 0x1FAC */ 0x9B04,0x6466, + /* Array index: 0x1FAC */ 0x9B05,0x6467, + /* Array index: 0x1FAC */ 0x9B24,0x7226, + /* Array index: 0x1FAC */ 0x9B29,0x6468, + /* Array index: 0x1FAC */ 0x9B2B,0x6E53, + /* Array index: 0x1FAC */ 0x9B2E,0x7166, + /* Array index: 0x1FAC */ 0x9B2F,0x334D, + /* Array index: 0x1FAC */ 0x9B33,0x5B7E, + /* Array index: 0x1FAC */ 0x9B35,0x6469, + /* Array index: 0x1FAC */ 0x9B37,0x6833, + /* Array index: 0x1FAC */ 0x9B3A,0x6C73, + /* Array index: 0x1FAC */ 0x9B3B,0x6E54, + /* Array index: 0x1FAC */ 0x9B3E,0x4F45, + /* Array index: 0x1FAC */ 0x9B3F,0x4F46, + /* Array index: 0x1FAC */ 0x9B43,0x5624, + /* Array index: 0x1FAC */ 0x9B46,0x5623, + /* Array index: 0x1FAC */ 0x9B52,0x6C74, + /* Array index: 0x1FAC */ 0x9B55,0x6E56, + /* Array index: 0x1FAC */ 0x9B56,0x6E55, + /* Array index: 0x1FAC */ 0x9B59,0x7063, + /* Array index: 0x1FAC */ 0x9B5B,0x4870, + /* Array index: 0x1FAC */ 0x9B6C,0x562E, + /* Array index: 0x1FAC */ 0x9B90,0x5C2A, + /* Array index: 0x1FAC */ 0x9B92,0x5C29, + /* Array index: 0x1FAC */ 0x9B93,0x5C28, + /* Array index: 0x1FAC */ 0x9B95,0x5C2C, + /* Array index: 0x1FAC */ 0x9B9A,0x6076, + /* Array index: 0x1FAC */ 0x9B9B,0x6079, + /* Array index: 0x1FAC */ 0x9BAF,0x6123, + /* Array index: 0x1FAC */ 0x9BBD,0x6478, + /* Array index: 0x1FAC */ 0x9BBF,0x6470, + /* Array index: 0x1FAC */ 0x9BC1,0x6471, + /* Array index: 0x1FAC */ 0x9BF0,0x683B, + /* Array index: 0x1FAC */ 0x9BF7,0x6A7A, + /* Array index: 0x1FAC */ 0x9BF8,0x6A7D, + /* Array index: 0x1FAC */ 0x9C0E,0x6B22, + /* Array index: 0x1FAC */ 0x9C12,0x6A7C, + /* Array index: 0x1FAC */ 0x9C14,0x6B25, + /* Array index: 0x1FAC */ 0x9C17,0x6B24, + /* Array index: 0x1FAC */ 0x9C1C,0x6C77, + /* Array index: 0x1FAC */ 0x9C1D,0x6C76, + /* Array index: 0x1FAC */ 0x9C21,0x6C7D, + /* Array index: 0x1FAC */ 0x9C23,0x6C79, + /* Array index: 0x1FAC */ 0x9C24,0x6C7C, + /* Array index: 0x1FAC */ 0x9C44,0x6E5A, + /* Array index: 0x1FAC */ 0x9C46,0x6E57, + /* Array index: 0x1FAC */ 0x9C55,0x6F6B, + /* Array index: 0x1FAC */ 0x9C58,0x6F66, + /* Array index: 0x1FAC */ 0x9C59,0x6F6C, + /* Array index: 0x1FAC */ 0x9C5E,0x7068, + /* Array index: 0x1FAC */ 0x9C60,0x7069, + /* Array index: 0x1FAC */ 0x9C6D,0x714B, + /* Array index: 0x1FAC */ 0x9C6E,0x714A, + /* Array index: 0x1FAC */ 0x9C79,0x7238, + /* Array index: 0x1FAC */ 0x9C7A,0x723C, + /* Array index: 0x1FAC */ 0x9CE6,0x4154, + /* Array index: 0x1FAC */ 0x9CE7,0x4873, + /* Array index: 0x1FAC */ 0x9CEA,0x4871, + /* Array index: 0x1FAC */ 0x9CED,0x4872, + /* Array index: 0x1FAC */ 0x9CF1,0x4F4A, + /* Array index: 0x1FAC */ 0x9CF2,0x4F4B, + /* Array index: 0x1FAC */ 0x9CF5,0x4F4C, + /* Array index: 0x1FAC */ 0x9D10,0x5C38, + /* Array index: 0x1FAC */ 0x9D14,0x5C33, + /* Array index: 0x1FAC */ 0x9D25,0x5C2F, + /* Array index: 0x1FAC */ 0x9D29,0x5C34, + /* Array index: 0x1FAC */ 0x9D4F,0x647B, + /* Array index: 0x1FAC */ 0x9D5F,0x6527, + /* Array index: 0x1FAC */ 0x9D90,0x6B2D, + /* Array index: 0x1FAC */ 0x9D92,0x6B2B, + /* Array index: 0x1FAC */ 0x9E1D,0x723D, + /* Array index: 0x1FAC */ 0x9E7A,0x6D37, + /* Array index: 0x1FAC */ 0x9E80,0x4874, + /* Array index: 0x1FAC */ 0x9E83,0x563B, + /* Array index: 0x1FAC */ 0x9E91,0x6860, + /* Array index: 0x1FAC */ 0x9E94,0x685F, + /* Array index: 0x1FAC */ 0x9EA0,0x7076, + /* Array index: 0x1FAC */ 0x9EA1,0x7152, + /* Array index: 0x1FAC */ 0x9EA4,0x7241, + /* Array index: 0x1FAC */ 0x9EA7,0x4F4D, + /* Array index: 0x1FAC */ 0x9EAD,0x5C3F, + /* Array index: 0x1FAC */ 0x9EAE,0x5C3E, + /* Array index: 0x1FAC */ 0x9EB0,0x6139, + /* Array index: 0x1FAC */ 0x9EB6,0x6E74, + /* Array index: 0x1FAC */ 0x9EB7,0x7239, + /* Array index: 0x1FAC */ 0x9EC0,0x6861, + /* Array index: 0x1FAC */ 0x9EC2,0x7024, + /* Array index: 0x1FAC */ 0x9EC8,0x613A, + /* Array index: 0x1FAC */ 0x9ED0,0x7025, + /* Array index: 0x1FAC */ 0x9ED3,0x563C, + /* Array index: 0x1FAC */ 0x9ED5,0x5C40, + /* Array index: 0x1FAC */ 0x9ED6,0x5C41, + /* Array index: 0x1FAC */ 0x9EDA,0x613B, + /* Array index: 0x1FAC */ 0x9EDF,0x652C, + /* Array index: 0x1FAC */ 0x9EEB,0x6D39, + /* Array index: 0x1FAC */ 0x9EED,0x6D3B, + /* Array index: 0x1FAC */ 0x9EEE,0x6D3A, + /* Array index: 0x1FAC */ 0x9EF0,0x6E75, + /* Array index: 0x1FAC */ 0x9F06,0x7028, + /* Array index: 0x1FAC */ 0x9F09,0x7154, + /* Array index: 0x1FAC */ 0x9F0A,0x716E, + /* Array index: 0x1FAC */ 0x9F0F,0x563D, + /* Array index: 0x1FAC */ 0x9F10,0x563E, + /* Array index: 0x1FAC */ 0x9F12,0x5C43, + /* Array index: 0x1FAC */ 0x9F16,0x652F, + /* Array index: 0x1FAC */ 0x9F3D,0x5C44, + /* Array index: 0x1FAC */ 0x9F64,0x6D42, + /* Array index: 0x1FAC */ 0x9F65,0x6D41, + /* Array index: 0x1FAC */ 0x9F6B,0x6E7A, + /* Array index: 0x1FAC */ 0x9F7E,0x7242, + /* Array index: 0x1FAC */ 0x9F91,0x6B4D, + /* Array index: 0x1FAC */ 0x9F92,0x6D43, + /* Array index: 0x1FAC */ 0x9F95,0x6E7B, + /* Array index: 0x1FAC */ 0x9F98,0x7244, + /* Array index: 0x1FAC */ 0x9FA0,0x6142, + /* Array index: 0x1FAC */ 0x9FA2,0x6E7C, + /* Array index: 0x1FAC */ 0x9FA4,0x716F, +}; + +#endif /* ICONV_FROM_UCS_CCS_CNS11643_PLANE2 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * cns11643_plane2 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cns11643_plane2 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CNS11643_PLANE2, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_cns11643_plane2, /* UCS -> cns11643_plane2 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_CNS11643_PLANE2) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_cns11643_plane2, /* UCS -> cns11643_plane2 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_cns11643_plane2 /* cns11643_plane2 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_CNS11643_PLANE2) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_cns11643_plane2 /* cns11643_plane2 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CNS11643_PLANE2) || ... */ + diff --git a/lib/iconv/ccs/cp775.c b/lib/iconv/ccs/cp775.c new file mode 100644 index 0000000..f7c4af5 --- /dev/null +++ b/lib/iconv/ccs/cp775.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cp775 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CP775) \ + || defined (ICONV_FROM_UCS_CCS_CP775) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit cp775 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CP775) + +static const __uint16_t +to_ucs_speed_cp775[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0106,0x00FC,0x00E9,0x0101,0x00E4,0x0123,0x00E5,0x0107, + 0x0142,0x0113,0x0156,0x0157,0x012B,0x0179,0x00C4,0x00C5, + 0x00C9,0x00E6,0x00C6,0x014D,0x00F6,0x0122,0x00A2,0x015A, + 0x015B,0x00D6,0x00DC,0x00F8,0x00A3,0x00D8,0x00D7,0x00A4, + 0x0100,0x012A,0x00F3,0x017B,0x017C,0x017A,0x201D,0x00A6, + 0x00A9,0x00AE,0x00AC,0x00BD,0x00BC,0x0141,0x00AB,0x00BB, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x0104,0x010C,0x0118, + 0x0116,0x2563,0x2551,0x2557,0x255D,0x012E,0x0160,0x2510, + 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x0172,0x016A, + 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x017D, + 0x0105,0x010D,0x0119,0x0117,0x012F,0x0161,0x0173,0x016B, + 0x017E,0x2518,0x250C,0x2588,0x2584,0x258C,0x2590,0x2580, + 0x00D3,0x00DF,0x014C,0x0143,0x00F5,0x00D5,0x00B5,0x0144, + 0x0136,0x0137,0x013B,0x013C,0x0146,0x0112,0x0145,0x2019, + 0x00AD,0x00B1,0x201C,0x00BE,0x00B6,0x00A7,0x00F7,0x201E, + 0x00B0,0x2219,0x00B7,0x00B9,0x00B3,0x00B2,0x25A0,0x00A0, + +}; + +#endif /* ICONV_TO_UCS_CCS_CP775 */ + +/* + * 8-bit UCS -> cp775 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CP775) + +static const unsigned char +from_ucs_speed_cp775[] = +{ + W(0x00A0), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(0x0502),W(INVBLK), + W(INVBLK),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x96,0x9C,0x9F,0xFF,0xA7,0xF5, + 0xFF,0xA8,0xFF,0xAE,0xAA,0xF0,0xA9,0xFF, + 0xF8,0xF1,0xFD,0xFC,0xFF,0xE6,0xF4,0xFA, + 0xFF,0xFB,0xFF,0xAF,0xAC,0xAB,0xF3,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x8E,0x8F,0x92,0xFF, + 0xFF,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xE0,0xFF,0xE5,0x99,0x9E, + 0x9D,0xFF,0xFF,0xFF,0x9A,0xFF,0xFF,0xE1, + 0xFF,0xFF,0xFF,0xFF,0x84,0x86,0x91,0xFF, + 0xFF,0x82,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xA2,0xFF,0xE4,0x94,0xF6, + 0x9B,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xA0,0x83,0xFF,0xFF,0xB5,0xD0,0x80,0x87, + 0xFF,0xFF,0xFF,0xFF,0xB6,0xD1,0xFF,0xFF, + 0xFF,0xFF,0xED,0x89,0xFF,0xFF,0xB8,0xD3, + 0xB7,0xD2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x95,0x85,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xA1,0x8C,0xFF,0xFF,0xBD,0xD4, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE8,0xE9, + 0xFF,0xFF,0xFF,0xEA,0xEB,0xFF,0xFF,0xFF, + 0xFF,0xAD,0x88,0xE3,0xE7,0xEE,0xEC,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xE2,0x93,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8A,0x8B, + 0xFF,0xFF,0x97,0x98,0xFF,0xFF,0xFF,0xFF, + 0xBE,0xD5,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xC7,0xD7,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xC6,0xD6,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8D,0xA5,0xA3,0xA4,0xCF,0xD8,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xEF,0xFF,0xFF,0xF2,0xA6,0xF7,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 35, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xF9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0602 */ + 0xC4,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDA,0xFF,0xFF,0xFF, + 0xBF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF, + 0xD9,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC2,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC5,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0xBA,0xFF,0xFF,0xC9,0xFF,0xFF,0xBB, + 0xFF,0xFF,0xC8,0xFF,0xFF,0xBC,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xB9,0xFF,0xFF,0xCB,0xFF, + 0xFF,0xCA,0xFF,0xFF,0xCE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDF,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xFF, + 0xDB,0xFF,0xFF,0xFF,0xDD,0xFF,0xFF,0xFF, + 0xDE,0xB0,0xB1,0xB2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_CP775 */ + +/* + * cp775 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cp775 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CP775, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_CP775) + (__uint16_t *)&from_ucs_speed_cp775, /* UCS -> cp775 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_CP775) + (__uint16_t *)&to_ucs_speed_cp775 /* cp775 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CP775) || ... */ + diff --git a/lib/iconv/ccs/cp850.c b/lib/iconv/ccs/cp850.c new file mode 100644 index 0000000..57f5906 --- /dev/null +++ b/lib/iconv/ccs/cp850.c @@ -0,0 +1,308 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cp850 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CP850) \ + || defined (ICONV_FROM_UCS_CCS_CP850) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit cp850 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CP850) + +static const __uint16_t +to_ucs_speed_cp850[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x00C7,0x00FC,0x00E9,0x00E2,0x00E4,0x00E0,0x00E5,0x00E7, + 0x00EA,0x00EB,0x00E8,0x00EF,0x00EE,0x00EC,0x00C4,0x00C5, + 0x00C9,0x00E6,0x00C6,0x00F4,0x00F6,0x00F2,0x00FB,0x00F9, + 0x00FF,0x00D6,0x00DC,0x00F8,0x00A3,0x00D8,0x00D7,0x0192, + 0x00E1,0x00ED,0x00F3,0x00FA,0x00F1,0x00D1,0x00AA,0x00BA, + 0x00BF,0x00AE,0x00AC,0x00BD,0x00BC,0x00A1,0x00AB,0x00BB, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x00C1,0x00C2,0x00C0, + 0x00A9,0x2563,0x2551,0x2557,0x255D,0x00A2,0x00A5,0x2510, + 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x00E3,0x00C3, + 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x00A4, + 0x00F0,0x00D0,0x00CA,0x00CB,0x00C8,0x0131,0x00CD,0x00CE, + 0x00CF,0x2518,0x250C,0x2588,0x2584,0x00A6,0x00CC,0x2580, + 0x00D3,0x00DF,0x00D4,0x00D2,0x00F5,0x00D5,0x00B5,0x00FE, + 0x00DE,0x00DA,0x00DB,0x00D9,0x00FD,0x00DD,0x00AF,0x00B4, + 0x00AD,0x00B1,0x2017,0x00BE,0x00B6,0x00A7,0x00F7,0x00B8, + 0x00B0,0x00A8,0x00B7,0x00B9,0x00B3,0x00B2,0x25A0,0x00A0, + +}; + +#endif /* ICONV_TO_UCS_CCS_CP850 */ + +/* + * 8-bit UCS -> cp850 speed-optimized table (1538 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CP850) + +static const unsigned char +from_ucs_speed_cp850[] = +{ + W(0x00A0), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0502),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xAD,0xBD,0x9C,0xCF,0xBE,0xDD,0xF5, + 0xF9,0xB8,0xA6,0xAE,0xAA,0xF0,0xA9,0xEE, + 0xF8,0xF1,0xFD,0xFC,0xEF,0xE6,0xF4,0xFA, + 0xF7,0xFB,0xA7,0xAF,0xAC,0xAB,0xF3,0xA8, + 0xB7,0xB5,0xB6,0xC7,0x8E,0x8F,0x92,0x80, + 0xD4,0x90,0xD2,0xD3,0xDE,0xD6,0xD7,0xD8, + 0xD1,0xA5,0xE3,0xE0,0xE2,0xE5,0x99,0x9E, + 0x9D,0xEB,0xE9,0xEA,0x9A,0xED,0xE8,0xE1, + 0x85,0xA0,0x83,0xC6,0x84,0x86,0x91,0x87, + 0x8A,0x82,0x88,0x89,0x8D,0xA1,0x8C,0x8B, + 0xD0,0xA4,0x95,0xA2,0x93,0xE4,0x94,0xF6, + 0x9B,0x97,0xA3,0x96,0x81,0xEC,0xE7,0x98, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xD5,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF2, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0502 */ + 0xC4,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDA,0xFF,0xFF,0xFF, + 0xBF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF, + 0xD9,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC2,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC5,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0xBA,0xFF,0xFF,0xC9,0xFF,0xFF,0xBB, + 0xFF,0xFF,0xC8,0xFF,0xFF,0xBC,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xB9,0xFF,0xFF,0xCB,0xFF, + 0xFF,0xCA,0xFF,0xFF,0xCE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDF,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xFF, + 0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xB0,0xB1,0xB2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_CP850 */ + +/* + * cp850 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cp850 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CP850, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_CP850) + (__uint16_t *)&from_ucs_speed_cp850, /* UCS -> cp850 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_CP850) + (__uint16_t *)&to_ucs_speed_cp850 /* cp850 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CP850) || ... */ + diff --git a/lib/iconv/ccs/cp852.c b/lib/iconv/ccs/cp852.c new file mode 100644 index 0000000..c622da4 --- /dev/null +++ b/lib/iconv/ccs/cp852.c @@ -0,0 +1,308 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cp852 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CP852) \ + || defined (ICONV_FROM_UCS_CCS_CP852) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit cp852 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CP852) + +static const __uint16_t +to_ucs_speed_cp852[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x00C7,0x00FC,0x00E9,0x00E2,0x00E4,0x016F,0x0107,0x00E7, + 0x0142,0x00EB,0x0150,0x0151,0x00EE,0x0179,0x00C4,0x0106, + 0x00C9,0x0139,0x013A,0x00F4,0x00F6,0x013D,0x013E,0x015A, + 0x015B,0x00D6,0x00DC,0x0164,0x0165,0x0141,0x00D7,0x010D, + 0x00E1,0x00ED,0x00F3,0x00FA,0x0104,0x0105,0x017D,0x017E, + 0x0118,0x0119,0x00AC,0x017A,0x010C,0x015F,0x00AB,0x00BB, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x00C1,0x00C2,0x011A, + 0x015E,0x2563,0x2551,0x2557,0x255D,0x017B,0x017C,0x2510, + 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x0102,0x0103, + 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x00A4, + 0x0111,0x0110,0x010E,0x00CB,0x010F,0x0147,0x00CD,0x00CE, + 0x011B,0x2518,0x250C,0x2588,0x2584,0x0162,0x016E,0x2580, + 0x00D3,0x00DF,0x00D4,0x0143,0x0144,0x0148,0x0160,0x0161, + 0x0154,0x00DA,0x0155,0x0170,0x00FD,0x00DD,0x0163,0x00B4, + 0x00AD,0x02DD,0x02DB,0x02C7,0x02D8,0x00A7,0x00F7,0x00B8, + 0x00B0,0x00A8,0x02D9,0x0171,0x0158,0x0159,0x25A0,0x00A0, + +}; + +#endif /* ICONV_TO_UCS_CCS_CP852 */ + +/* + * 8-bit UCS -> cp852 speed-optimized table (1538 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CP852) + +static const unsigned char +from_ucs_speed_cp852[] = +{ + W(0x00A0), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0502),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xF5, + 0xF9,0xFF,0xFF,0xAE,0xAA,0xF0,0xFF,0xFF, + 0xF8,0xFF,0xFF,0xFF,0xEF,0xFF,0xFF,0xFF, + 0xF7,0xFF,0xFF,0xAF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xB5,0xB6,0xFF,0x8E,0xFF,0xFF,0x80, + 0xFF,0x90,0xFF,0xD3,0xFF,0xD6,0xD7,0xFF, + 0xFF,0xFF,0xFF,0xE0,0xE2,0xFF,0x99,0x9E, + 0xFF,0xFF,0xE9,0xFF,0x9A,0xED,0xFF,0xE1, + 0xFF,0xA0,0x83,0xFF,0x84,0xFF,0xFF,0x87, + 0xFF,0x82,0xFF,0x89,0xFF,0xA1,0x8C,0xFF, + 0xFF,0xFF,0xFF,0xA2,0x93,0xFF,0x94,0xF6, + 0xFF,0xFF,0xA3,0xFF,0x81,0xEC,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xC6,0xC7,0xA4,0xA5,0x8F,0x86, + 0xFF,0xFF,0xFF,0xFF,0xAC,0x9F,0xD2,0xD4, + 0xD1,0xD0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA8,0xA9,0xB7,0xD8,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x91,0x92,0xFF,0xFF,0x95,0x96,0xFF, + 0xFF,0x9D,0x88,0xE3,0xE4,0xFF,0xFF,0xD5, + 0xE5,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8A,0x8B,0xFF,0xFF,0xE8,0xEA,0xFF,0xFF, + 0xFC,0xFD,0x97,0x98,0xFF,0xFF,0xB8,0xAD, + 0xE6,0xE7,0xDD,0xEE,0x9B,0x9C,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDE,0x85, + 0xEB,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8D,0xAB,0xBD,0xBE,0xA6,0xA7,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xF4,0xFA,0xFF,0xF2,0xFF,0xF1,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0502 */ + 0xC4,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDA,0xFF,0xFF,0xFF, + 0xBF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF, + 0xD9,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC2,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC5,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0xBA,0xFF,0xFF,0xC9,0xFF,0xFF,0xBB, + 0xFF,0xFF,0xC8,0xFF,0xFF,0xBC,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xB9,0xFF,0xFF,0xCB,0xFF, + 0xFF,0xCA,0xFF,0xFF,0xCE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDF,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xFF, + 0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xB0,0xB1,0xB2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_CP852 */ + +/* + * cp852 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cp852 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CP852, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_CP852) + (__uint16_t *)&from_ucs_speed_cp852, /* UCS -> cp852 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_CP852) + (__uint16_t *)&to_ucs_speed_cp852 /* cp852 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CP852) || ... */ + diff --git a/lib/iconv/ccs/cp855.c b/lib/iconv/ccs/cp855.c new file mode 100644 index 0000000..41c52ed --- /dev/null +++ b/lib/iconv/ccs/cp855.c @@ -0,0 +1,308 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cp855 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CP855) \ + || defined (ICONV_FROM_UCS_CCS_CP855) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit cp855 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CP855) + +static const __uint16_t +to_ucs_speed_cp855[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0452,0x0402,0x0453,0x0403,0x0451,0x0401,0x0454,0x0404, + 0x0455,0x0405,0x0456,0x0406,0x0457,0x0407,0x0458,0x0408, + 0x0459,0x0409,0x045A,0x040A,0x045B,0x040B,0x045C,0x040C, + 0x045E,0x040E,0x045F,0x040F,0x044E,0x042E,0x044A,0x042A, + 0x0430,0x0410,0x0431,0x0411,0x0446,0x0426,0x0434,0x0414, + 0x0435,0x0415,0x0444,0x0424,0x0433,0x0413,0x00AB,0x00BB, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x0445,0x0425,0x0438, + 0x0418,0x2563,0x2551,0x2557,0x255D,0x0439,0x0419,0x2510, + 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x043A,0x041A, + 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x00A4, + 0x043B,0x041B,0x043C,0x041C,0x043D,0x041D,0x043E,0x041E, + 0x043F,0x2518,0x250C,0x2588,0x2584,0x041F,0x044F,0x2580, + 0x042F,0x0440,0x0420,0x0441,0x0421,0x0442,0x0422,0x0443, + 0x0423,0x0436,0x0416,0x0432,0x0412,0x044C,0x042C,0x2116, + 0x00AD,0x044B,0x042B,0x0437,0x0417,0x0448,0x0428,0x044D, + 0x042D,0x0449,0x0429,0x0447,0x0427,0x00A7,0x25A0,0x00A0, + +}; + +#endif /* ICONV_TO_UCS_CCS_CP855 */ + +/* + * 8-bit UCS -> cp855 speed-optimized table (1538 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CP855) + +static const unsigned char +from_ucs_speed_cp855[] = +{ + W(0x00A0), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0402),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0502),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xCF,0xFF,0xFF,0xFD, + 0xFF,0xFF,0xFF,0xAE,0xFF,0xF0,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xAF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0x85,0x81,0x83,0x87,0x89,0x8B,0x8D, + 0x8F,0x91,0x93,0x95,0x97,0xFF,0x99,0x9B, + 0xA1,0xA3,0xEC,0xAD,0xA7,0xA9,0xEA,0xF4, + 0xB8,0xBE,0xC7,0xD1,0xD3,0xD5,0xD7,0xDD, + 0xE2,0xE4,0xE6,0xE8,0xAB,0xB6,0xA5,0xFC, + 0xF6,0xFA,0x9F,0xF2,0xEE,0xF8,0x9D,0xE0, + 0xA0,0xA2,0xEB,0xAC,0xA6,0xA8,0xE9,0xF3, + 0xB7,0xBD,0xC6,0xD0,0xD2,0xD4,0xD6,0xD8, + 0xE1,0xE3,0xE5,0xE7,0xAA,0xB5,0xA4,0xFB, + 0xF5,0xF9,0x9E,0xF1,0xED,0xF7,0x9C,0xDE, + 0xFF,0x84,0x80,0x82,0x86,0x88,0x8A,0x8C, + 0x8E,0x90,0x92,0x94,0x96,0xFF,0x98,0x9A, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0502 */ + 0xC4,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDA,0xFF,0xFF,0xFF, + 0xBF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF, + 0xD9,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC2,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC5,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0xBA,0xFF,0xFF,0xC9,0xFF,0xFF,0xBB, + 0xFF,0xFF,0xC8,0xFF,0xFF,0xBC,0xFF,0xFF, + 0xCC,0xFF,0xFF,0xB9,0xFF,0xFF,0xCB,0xFF, + 0xFF,0xCA,0xFF,0xFF,0xCE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDF,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xFF, + 0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xB0,0xB1,0xB2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_CP855 */ + +/* + * cp855 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cp855 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CP855, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_CP855) + (__uint16_t *)&from_ucs_speed_cp855, /* UCS -> cp855 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_CP855) + (__uint16_t *)&to_ucs_speed_cp855 /* cp855 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CP855) || ... */ + diff --git a/lib/iconv/ccs/cp866.c b/lib/iconv/ccs/cp866.c new file mode 100644 index 0000000..c1dacd8 --- /dev/null +++ b/lib/iconv/ccs/cp866.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for cp866 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_CP866) \ + || defined (ICONV_FROM_UCS_CCS_CP866) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit cp866 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_CP866) + +static const __uint16_t +to_ucs_speed_cp866[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, + 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, + 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, + 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, + 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, + 0x2555,0x2563,0x2551,0x2557,0x255D,0x255C,0x255B,0x2510, + 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x255E,0x255F, + 0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x2567, + 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256B, + 0x256A,0x2518,0x250C,0x2588,0x2584,0x258C,0x2590,0x2580, + 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, + 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F, + 0x0401,0x0451,0x0404,0x0454,0x0407,0x0457,0x040E,0x045E, + 0x00B0,0x2219,0x00B7,0x221A,0x2116,0x00A4,0x25A0,0x00A0, + +}; + +#endif /* ICONV_TO_UCS_CCS_CP866 */ + +/* + * 8-bit UCS -> cp866 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_CP866) + +static const unsigned char +from_ucs_speed_cp866[] = +{ + W(0x00A0), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0402),W(0x0502),W(INVBLK), + W(INVBLK),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFD,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xF0,0xFF,0xFF,0xF2,0xFF,0xFF,0xF4, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF6,0xFF, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xFF,0xF1,0xFF,0xFF,0xF3,0xFF,0xFF,0xF5, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 35, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xF9,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0602 */ + 0xC4,0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDA,0xFF,0xFF,0xFF, + 0xBF,0xFF,0xFF,0xFF,0xC0,0xFF,0xFF,0xFF, + 0xD9,0xFF,0xFF,0xFF,0xC3,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC2,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC1,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC5,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCD,0xBA,0xD5,0xD6,0xC9,0xB8,0xB7,0xBB, + 0xD4,0xD3,0xC8,0xBE,0xBD,0xBC,0xC6,0xC7, + 0xCC,0xB5,0xB6,0xB9,0xD1,0xD2,0xCB,0xCF, + 0xD0,0xCA,0xD8,0xD7,0xCE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDF,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xFF, + 0xDB,0xFF,0xFF,0xFF,0xDD,0xFF,0xFF,0xFF, + 0xDE,0xB0,0xB1,0xB2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_CP866 */ + +/* + * cp866 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_cp866 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_CP866, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_CP866) + (__uint16_t *)&from_ucs_speed_cp866, /* UCS -> cp866 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_CP866) + (__uint16_t *)&to_ucs_speed_cp866 /* cp866 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_CP866) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_1.c b/lib/iconv/ccs/iso_8859_1.c new file mode 100644 index 0000000..775bca6 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_1.c @@ -0,0 +1,209 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_1 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_1) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_1) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_1 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_1) + +static const __uint16_t +to_ucs_speed_iso_8859_1[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, + 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, + 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_1 */ + +/* + * 8-bit UCS -> iso_8859_1 speed-optimized table (770 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_1) + +static const unsigned char +from_ucs_speed_iso_8859_1[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_1 */ + +/* + * iso_8859_1 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_1 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_1, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_1) + (__uint16_t *)&from_ucs_speed_iso_8859_1, /* UCS -> iso_8859_1 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_1) + (__uint16_t *)&to_ucs_speed_iso_8859_1 /* iso_8859_1 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_1) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_10.c b/lib/iconv/ccs/iso_8859_10.c new file mode 100644 index 0000000..b221a6a --- /dev/null +++ b/lib/iconv/ccs/iso_8859_10.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_10 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_10) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_10) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_10 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_10) + +static const __uint16_t +to_ucs_speed_iso_8859_10[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0104,0x0112,0x0122,0x012A,0x0128,0x0136,0x00A7, + 0x013B,0x0110,0x0160,0x0166,0x017D,0x00AD,0x016A,0x014A, + 0x00B0,0x0105,0x0113,0x0123,0x012B,0x0129,0x0137,0x00B7, + 0x013C,0x0111,0x0161,0x0167,0x017E,0x2015,0x016B,0x014B, + 0x0100,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x012E, + 0x010C,0x00C9,0x0118,0x00CB,0x0116,0x00CD,0x00CE,0x00CF, + 0x00D0,0x0145,0x014C,0x00D3,0x00D4,0x00D5,0x00D6,0x0168, + 0x00D8,0x0172,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, + 0x0101,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x012F, + 0x010D,0x00E9,0x0119,0x00EB,0x0117,0x00ED,0x00EE,0x00EF, + 0x00F0,0x0146,0x014D,0x00F3,0x00F4,0x00F5,0x00F6,0x0169, + 0x00F8,0x0173,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x0138, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_10 */ + +/* + * 8-bit UCS -> iso_8859_10 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_10) + +static const unsigned char +from_ucs_speed_iso_8859_10[] = +{ + W(0x0138), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xFF, + 0xB0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xFF, + 0xFF,0xC9,0xFF,0xCB,0xFF,0xCD,0xCE,0xCF, + 0xD0,0xFF,0xFF,0xD3,0xD4,0xD5,0xD6,0xFF, + 0xD8,0xFF,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xFF,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xFF, + 0xFF,0xE9,0xFF,0xEB,0xFF,0xED,0xEE,0xEF, + 0xF0,0xFF,0xFF,0xF3,0xF4,0xF5,0xF6,0xFF, + 0xF8,0xFF,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Block 2, Array index 0x0302 */ + 0xC0,0xE0,0xFF,0xFF,0xA1,0xB1,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC8,0xE8,0xFF,0xFF, + 0xA9,0xB9,0xA2,0xB2,0xFF,0xFF,0xCC,0xEC, + 0xCA,0xEA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xA3,0xB3,0xFF,0xFF,0xFF,0xFF, + 0xA5,0xB5,0xA4,0xB4,0xFF,0xFF,0xC7,0xE7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA6,0xB6, + 0xFF,0xFF,0xFF,0xA8,0xB8,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xD1,0xF1,0xFF, + 0xFF,0xFF,0xAF,0xBF,0xD2,0xF2,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xAA,0xBA,0xFF,0xFF,0xFF,0xFF,0xAB,0xBB, + 0xD7,0xF7,0xAE,0xBE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xD9,0xF9,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAC,0xBC,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xBD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_10 */ + +/* + * iso_8859_10 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_10 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_10, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_10) + (__uint16_t *)&from_ucs_speed_iso_8859_10, /* UCS -> iso_8859_10 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_10) + (__uint16_t *)&to_ucs_speed_iso_8859_10 /* iso_8859_10 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_10) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_11.c b/lib/iconv/ccs/iso_8859_11.c new file mode 100644 index 0000000..ebb5ec6 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_11.c @@ -0,0 +1,242 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_11 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_11) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_11) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_11 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_11) + +static const __uint16_t +to_ucs_speed_iso_8859_11[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0E01,0x0E02,0x0E03,0x0E04,0x0E05,0x0E06,0x0E07, + 0x0E08,0x0E09,0x0E0A,0x0E0B,0x0E0C,0x0E0D,0x0E0E,0x0E0F, + 0x0E10,0x0E11,0x0E12,0x0E13,0x0E14,0x0E15,0x0E16,0x0E17, + 0x0E18,0x0E19,0x0E1A,0x0E1B,0x0E1C,0x0E1D,0x0E1E,0x0E1F, + 0x0E20,0x0E21,0x0E22,0x0E23,0x0E24,0x0E25,0x0E26,0x0E27, + 0x0E28,0x0E29,0x0E2A,0x0E2B,0x0E2C,0x0E2D,0x0E2E,0x0E2F, + 0x0E30,0x0E31,0x0E32,0x0E33,0x0E34,0x0E35,0x0E36,0x0E37, + 0x0E38,0x0E39,0x0E3A,INVALC,INVALC,INVALC,INVALC,0x0E3F, + 0x0E40,0x0E41,0x0E42,0x0E43,0x0E44,0x0E45,0x0E46,0x0E47, + 0x0E48,0x0E49,0x0E4A,0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0E4F, + 0x0E50,0x0E51,0x0E52,0x0E53,0x0E54,0x0E55,0x0E56,0x0E57, + 0x0E58,0x0E59,0x0E5A,0x0E5B,INVALC,INVALC,INVALC,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_11 */ + +/* + * 8-bit UCS -> iso_8859_11 speed-optimized table (1026 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_11) + +static const unsigned char +from_ucs_speed_iso_8859_11[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(0x0302),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 15, Array index 0x0302 */ + 0xFF,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xFF,0xFF,0xFF,0xFF,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_11 */ + +/* + * iso_8859_11 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_11 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_11, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_11) + (__uint16_t *)&from_ucs_speed_iso_8859_11, /* UCS -> iso_8859_11 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_11) + (__uint16_t *)&to_ucs_speed_iso_8859_11 /* iso_8859_11 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_11) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_13.c b/lib/iconv/ccs/iso_8859_13.c new file mode 100644 index 0000000..3905cef --- /dev/null +++ b/lib/iconv/ccs/iso_8859_13.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_13 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_13) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_13) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_13 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_13) + +static const __uint16_t +to_ucs_speed_iso_8859_13[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x201D,0x00A2,0x00A3,0x00A4,0x201E,0x00A6,0x00A7, + 0x00D8,0x00A9,0x0156,0x00AB,0x00AC,0x00AD,0x00AE,0x00C6, + 0x00B0,0x00B1,0x00B2,0x00B3,0x201C,0x00B5,0x00B6,0x00B7, + 0x00F8,0x00B9,0x0157,0x00BB,0x00BC,0x00BD,0x00BE,0x00E6, + 0x0104,0x012E,0x0100,0x0106,0x00C4,0x00C5,0x0118,0x0112, + 0x010C,0x00C9,0x0179,0x0116,0x0122,0x0136,0x012A,0x013B, + 0x0160,0x0143,0x0145,0x00D3,0x014C,0x00D5,0x00D6,0x00D7, + 0x0172,0x0141,0x015A,0x016A,0x00DC,0x017B,0x017D,0x00DF, + 0x0105,0x012F,0x0101,0x0107,0x00E4,0x00E5,0x0119,0x0113, + 0x010D,0x00E9,0x017A,0x0117,0x0123,0x0137,0x012B,0x013C, + 0x0161,0x0144,0x0146,0x00F3,0x014D,0x00F5,0x00F6,0x00F7, + 0x0173,0x0142,0x015B,0x016B,0x00FC,0x017C,0x017E,0x2019, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_13 */ + +/* + * 8-bit UCS -> iso_8859_13 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_13) + +static const unsigned char +from_ucs_speed_iso_8859_13[] = +{ + W(0x2019), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xA2,0xA3,0xA4,0xFF,0xA6,0xA7, + 0xFF,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xFF, + 0xB0,0xB1,0xB2,0xB3,0xFF,0xB5,0xB6,0xB7, + 0xFF,0xB9,0xFF,0xBB,0xBC,0xBD,0xBE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC4,0xC5,0xAF,0xFF, + 0xFF,0xC9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xD3,0xFF,0xD5,0xD6,0xD7, + 0xA8,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xDF, + 0xFF,0xFF,0xFF,0xFF,0xE4,0xE5,0xBF,0xFF, + 0xFF,0xE9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xF3,0xFF,0xF5,0xF6,0xF7, + 0xB8,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xC2,0xE2,0xFF,0xFF,0xC0,0xE0,0xC3,0xE3, + 0xFF,0xFF,0xFF,0xFF,0xC8,0xE8,0xFF,0xFF, + 0xFF,0xFF,0xC7,0xE7,0xFF,0xFF,0xCB,0xEB, + 0xC6,0xE6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xCC,0xEC,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xCE,0xEE,0xFF,0xFF,0xC1,0xE1, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCD,0xED, + 0xFF,0xFF,0xFF,0xCF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xD9,0xF9,0xD1,0xF1,0xD2,0xF2,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xD4,0xF4,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xAA,0xBA, + 0xFF,0xFF,0xDA,0xFA,0xFF,0xFF,0xFF,0xFF, + 0xD0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xDB,0xFB,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xD8,0xF8,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xCA,0xEA,0xDD,0xFD,0xDE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xA1,0xA5,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_13 */ + +/* + * iso_8859_13 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_13 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_13, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_13) + (__uint16_t *)&from_ucs_speed_iso_8859_13, /* UCS -> iso_8859_13 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_13) + (__uint16_t *)&to_ucs_speed_iso_8859_13 /* iso_8859_13 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_13) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_14.c b/lib/iconv/ccs/iso_8859_14.c new file mode 100644 index 0000000..114d2df --- /dev/null +++ b/lib/iconv/ccs/iso_8859_14.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_14 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_14) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_14) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_14 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_14) + +static const __uint16_t +to_ucs_speed_iso_8859_14[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x1E02,0x1E03,0x00A3,0x010A,0x010B,0x1E0A,0x00A7, + 0x1E80,0x00A9,0x1E82,0x1E0B,0x1EF2,0x00AD,0x00AE,0x0178, + 0x1E1E,0x1E1F,0x0120,0x0121,0x1E40,0x1E41,0x00B6,0x1E56, + 0x1E81,0x1E57,0x1E83,0x1E60,0x1EF3,0x1E84,0x1E85,0x1E61, + 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + 0x0174,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x1E6A, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x0176,0x00DF, + 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + 0x0175,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x1E6B, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x0177,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_14 */ + +/* + * 8-bit UCS -> iso_8859_14 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_14) + +static const unsigned char +from_ucs_speed_iso_8859_14[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xA3,0xFF,0xFF,0xFF,0xA7, + 0xFF,0xA9,0xFF,0xFF,0xFF,0xAD,0xAE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB6,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xFF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xFF, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFF,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xFF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xFF, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xA4,0xA5,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB2,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xD0,0xF0,0xDE,0xFE, + 0xAF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 31, Array index 0x0402 */ + 0xFF,0xFF,0xA1,0xA2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xA6,0xAB,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB0,0xB1, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xB4,0xB5,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB7,0xB9, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBB,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xD7,0xF7,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA8,0xB8,0xAA,0xBA,0xBD,0xBE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xAC,0xBC,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_14 */ + +/* + * iso_8859_14 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_14 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_14, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_14) + (__uint16_t *)&from_ucs_speed_iso_8859_14, /* UCS -> iso_8859_14 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_14) + (__uint16_t *)&to_ucs_speed_iso_8859_14 /* iso_8859_14 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_14) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_15.c b/lib/iconv/ccs/iso_8859_15.c new file mode 100644 index 0000000..52dff02 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_15.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_15 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_15) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_15) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_15 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_15) + +static const __uint16_t +to_ucs_speed_iso_8859_15[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A1,0x00A2,0x00A3,0x20AC,0x00A5,0x0160,0x00A7, + 0x0161,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x017D,0x00B5,0x00B6,0x00B7, + 0x017E,0x00B9,0x00BA,0x00BB,0x0152,0x0153,0x0178,0x00BF, + 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, + 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_15 */ + +/* + * 8-bit UCS -> iso_8859_15 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_15) + +static const unsigned char +from_ucs_speed_iso_8859_15[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xFF,0xA5,0xFF,0xA7, + 0xFF,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xFF,0xB5,0xB6,0xB7, + 0xFF,0xB9,0xBA,0xBB,0xFF,0xFF,0xFF,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xBC,0xBD,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA6,0xA8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBE,0xFF,0xFF,0xFF,0xFF,0xB4,0xB8,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xA4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_15 */ + +/* + * iso_8859_15 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_15 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_15, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_15) + (__uint16_t *)&from_ucs_speed_iso_8859_15, /* UCS -> iso_8859_15 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_15) + (__uint16_t *)&to_ucs_speed_iso_8859_15 /* iso_8859_15 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_15) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_2.c b/lib/iconv/ccs/iso_8859_2.c new file mode 100644 index 0000000..ecb374e --- /dev/null +++ b/lib/iconv/ccs/iso_8859_2.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_2 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_2) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_2) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_2 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_2) + +static const __uint16_t +to_ucs_speed_iso_8859_2[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7, + 0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B, + 0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7, + 0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C, + 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, + 0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E, + 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7, + 0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF, + 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, + 0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, + 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7, + 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_2 */ + +/* + * 8-bit UCS -> iso_8859_2 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_2) + +static const unsigned char +from_ucs_speed_iso_8859_2[] = +{ + W(0x02D9), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xA4,0xFF,0xFF,0xA7, + 0xA8,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xFF, + 0xB0,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xB8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xC1,0xC2,0xFF,0xC4,0xFF,0xFF,0xC7, + 0xFF,0xC9,0xFF,0xCB,0xFF,0xCD,0xCE,0xFF, + 0xFF,0xFF,0xFF,0xD3,0xD4,0xFF,0xD6,0xD7, + 0xFF,0xFF,0xDA,0xFF,0xDC,0xDD,0xFF,0xDF, + 0xFF,0xE1,0xE2,0xFF,0xE4,0xFF,0xFF,0xE7, + 0xFF,0xE9,0xFF,0xEB,0xFF,0xED,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xF3,0xF4,0xFF,0xF6,0xF7, + 0xFF,0xFF,0xFA,0xFF,0xFC,0xFD,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xC3,0xE3,0xA1,0xB1,0xC6,0xE6, + 0xFF,0xFF,0xFF,0xFF,0xC8,0xE8,0xCF,0xEF, + 0xD0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCA,0xEA,0xCC,0xEC,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xC5,0xE5,0xFF,0xFF,0xA5,0xB5,0xFF, + 0xFF,0xA3,0xB3,0xD1,0xF1,0xFF,0xFF,0xD2, + 0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD5,0xF5,0xFF,0xFF,0xC0,0xE0,0xFF,0xFF, + 0xD8,0xF8,0xA6,0xB6,0xFF,0xFF,0xAA,0xBA, + 0xA9,0xB9,0xDE,0xFE,0xAB,0xBB,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD9,0xF9, + 0xDB,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xAC,0xBC,0xAF,0xBF,0xAE,0xBE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA2,0xFF,0xFF,0xB2,0xFF,0xBD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_2 */ + +/* + * iso_8859_2 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_2 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_2, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_2) + (__uint16_t *)&from_ucs_speed_iso_8859_2, /* UCS -> iso_8859_2 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_2) + (__uint16_t *)&to_ucs_speed_iso_8859_2 /* iso_8859_2 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_2) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_3.c b/lib/iconv/ccs/iso_8859_3.c new file mode 100644 index 0000000..6f80034 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_3.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_3 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_3) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_3) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_3 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_3) + +static const __uint16_t +to_ucs_speed_iso_8859_3[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0126,0x02D8,0x00A3,0x00A4,INVALC,0x0124,0x00A7, + 0x00A8,0x0130,0x015E,0x011E,0x0134,0x00AD,INVALC,0x017B, + 0x00B0,0x0127,0x00B2,0x00B3,0x00B4,0x00B5,0x0125,0x00B7, + 0x00B8,0x0131,0x015F,0x011F,0x0135,0x00BD,INVALC,0x017C, + 0x00C0,0x00C1,0x00C2,INVALC,0x00C4,0x010A,0x0108,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + INVALC,0x00D1,0x00D2,0x00D3,0x00D4,0x0120,0x00D6,0x00D7, + 0x011C,0x00D9,0x00DA,0x00DB,0x00DC,0x016C,0x015C,0x00DF, + 0x00E0,0x00E1,0x00E2,INVALC,0x00E4,0x010B,0x0109,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + INVALC,0x00F1,0x00F2,0x00F3,0x00F4,0x0121,0x00F6,0x00F7, + 0x011D,0x00F9,0x00FA,0x00FB,0x00FC,0x016D,0x015D,0x02D9, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_3 */ + +/* + * 8-bit UCS -> iso_8859_3 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_3) + +static const unsigned char +from_ucs_speed_iso_8859_3[] = +{ + W(0x02D9), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xA3,0xA4,0xFF,0xFF,0xA7, + 0xA8,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xFF, + 0xB0,0xFF,0xB2,0xB3,0xB4,0xB5,0xFF,0xB7, + 0xB8,0xFF,0xFF,0xFF,0xFF,0xBD,0xFF,0xFF, + 0xC0,0xC1,0xC2,0xFF,0xC4,0xFF,0xFF,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xFF,0xD1,0xD2,0xD3,0xD4,0xFF,0xD6,0xD7, + 0xFF,0xD9,0xDA,0xDB,0xDC,0xFF,0xFF,0xDF, + 0xE0,0xE1,0xE2,0xFF,0xE4,0xFF,0xFF,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xFF,0xF1,0xF2,0xF3,0xF4,0xFF,0xF6,0xF7, + 0xFF,0xF9,0xFA,0xFB,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC6,0xE6,0xC5,0xE5,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xD8,0xF8,0xAB,0xBB, + 0xD5,0xF5,0xFF,0xFF,0xA6,0xB6,0xA1,0xB1, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA9,0xB9,0xFF,0xFF,0xAC,0xBC,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDE,0xFE,0xAA,0xBA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xDD,0xFD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xAF,0xBF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_3 */ + +/* + * iso_8859_3 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_3 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_3, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_3) + (__uint16_t *)&from_ucs_speed_iso_8859_3, /* UCS -> iso_8859_3 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_3) + (__uint16_t *)&to_ucs_speed_iso_8859_3 /* iso_8859_3 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_3) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_4.c b/lib/iconv/ccs/iso_8859_4.c new file mode 100644 index 0000000..b080e2d --- /dev/null +++ b/lib/iconv/ccs/iso_8859_4.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_4 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_4) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_4) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_4 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_4) + +static const __uint16_t +to_ucs_speed_iso_8859_4[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0104,0x0138,0x0156,0x00A4,0x0128,0x013B,0x00A7, + 0x00A8,0x0160,0x0112,0x0122,0x0166,0x00AD,0x017D,0x00AF, + 0x00B0,0x0105,0x02DB,0x0157,0x00B4,0x0129,0x013C,0x02C7, + 0x00B8,0x0161,0x0113,0x0123,0x0167,0x014A,0x017E,0x014B, + 0x0100,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x012E, + 0x010C,0x00C9,0x0118,0x00CB,0x0116,0x00CD,0x00CE,0x012A, + 0x0110,0x0145,0x014C,0x0136,0x00D4,0x00D5,0x00D6,0x00D7, + 0x00D8,0x0172,0x00DA,0x00DB,0x00DC,0x0168,0x016A,0x00DF, + 0x0101,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x012F, + 0x010D,0x00E9,0x0119,0x00EB,0x0117,0x00ED,0x00EE,0x012B, + 0x0111,0x0146,0x014D,0x0137,0x00F4,0x00F5,0x00F6,0x00F7, + 0x00F8,0x0173,0x00FA,0x00FB,0x00FC,0x0169,0x016B,0x02D9, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_4 */ + +/* + * 8-bit UCS -> iso_8859_4 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_4) + +static const unsigned char +from_ucs_speed_iso_8859_4[] = +{ + W(0x02D9), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xA4,0xFF,0xFF,0xA7, + 0xA8,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xAF, + 0xB0,0xFF,0xFF,0xFF,0xB4,0xFF,0xFF,0xFF, + 0xB8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xFF, + 0xFF,0xC9,0xFF,0xCB,0xFF,0xCD,0xCE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xFF,0xDA,0xDB,0xDC,0xFF,0xFF,0xDF, + 0xFF,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xFF, + 0xFF,0xE9,0xFF,0xEB,0xFF,0xED,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xFF,0xFA,0xFB,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xC0,0xE0,0xFF,0xFF,0xA1,0xB1,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC8,0xE8,0xFF,0xFF, + 0xD0,0xF0,0xAA,0xBA,0xFF,0xFF,0xCC,0xEC, + 0xCA,0xEA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xAB,0xBB,0xFF,0xFF,0xFF,0xFF, + 0xA5,0xB5,0xCF,0xEF,0xFF,0xFF,0xC7,0xE7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD3,0xF3, + 0xA2,0xFF,0xFF,0xA6,0xB6,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xD1,0xF1,0xFF, + 0xFF,0xFF,0xBD,0xBF,0xD2,0xF2,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA3,0xB3, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA9,0xB9,0xFF,0xFF,0xFF,0xFF,0xAC,0xBC, + 0xDD,0xFD,0xDE,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xD9,0xF9,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAE,0xBE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xB2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_4 */ + +/* + * iso_8859_4 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_4 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_4, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_4) + (__uint16_t *)&from_ucs_speed_iso_8859_4, /* UCS -> iso_8859_4 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_4) + (__uint16_t *)&to_ucs_speed_iso_8859_4 /* iso_8859_4 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_4) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_5.c b/lib/iconv/ccs/iso_8859_5.c new file mode 100644 index 0000000..b4b0c3f --- /dev/null +++ b/lib/iconv/ccs/iso_8859_5.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_5 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_5) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_5) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_5 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_5) + +static const __uint16_t +to_ucs_speed_iso_8859_5[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,0x00AD,0x040E,0x040F, + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, + 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, + 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, + 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, + 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, + 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, + 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F, + 0x2116,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457, + 0x0458,0x0459,0x045A,0x045B,0x045C,0x00A7,0x045E,0x045F, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_5 */ + +/* + * 8-bit UCS -> iso_8859_5 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_5) + +static const unsigned char +from_ucs_speed_iso_8859_5[] = +{ + W(0x045F), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0402),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xFF,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xFF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_5 */ + +/* + * iso_8859_5 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_5 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_5, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_5) + (__uint16_t *)&from_ucs_speed_iso_8859_5, /* UCS -> iso_8859_5 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_5) + (__uint16_t *)&to_ucs_speed_iso_8859_5 /* iso_8859_5 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_5) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_6.c b/lib/iconv/ccs/iso_8859_6.c new file mode 100644 index 0000000..9967841 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_6.c @@ -0,0 +1,242 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_6 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_6) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_6) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_6 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_6) + +static const __uint16_t +to_ucs_speed_iso_8859_6[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,INVALC,INVALC,INVALC,0x00A4,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x060C,0x00AD,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x061B,INVALC,INVALC,INVALC,0x061F, + INVALC,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627, + 0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F, + 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x0637, + 0x0638,0x0639,0x063A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x0640,0x0641,0x0642,0x0643,0x0644,0x0645,0x0646,0x0647, + 0x0648,0x0649,0x064A,0x064B,0x064C,0x064D,0x064E,0x064F, + 0x0650,0x0651,0x0652,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_6 */ + +/* + * 8-bit UCS -> iso_8859_6 speed-optimized table (1026 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_6) + +static const unsigned char +from_ucs_speed_iso_8859_6[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(0x0302),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xA4,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 7, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xAC,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xBB,0xFF,0xFF,0xFF,0xBF, + 0xFF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_6 */ + +/* + * iso_8859_6 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_6 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_6, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_6) + (__uint16_t *)&from_ucs_speed_iso_8859_6, /* UCS -> iso_8859_6 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_6) + (__uint16_t *)&to_ucs_speed_iso_8859_6 /* iso_8859_6 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_6) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_7.c b/lib/iconv/ccs/iso_8859_7.c new file mode 100644 index 0000000..41d3400 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_7.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_7 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_7) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_7) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_7 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_7) + +static const __uint16_t +to_ucs_speed_iso_8859_7[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x2018,0x2019,0x00A3,INVALC,INVALC,0x00A6,0x00A7, + 0x00A8,0x00A9,INVALC,0x00AB,0x00AC,0x00AD,INVALC,0x2015, + 0x00B0,0x00B1,0x00B2,0x00B3,0x0384,0x0385,0x0386,0x00B7, + 0x0388,0x0389,0x038A,0x00BB,0x038C,0x00BD,0x038E,0x038F, + 0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, + 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,INVALC,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7, + 0x03A8,0x03A9,0x03AA,0x03AB,0x03AC,0x03AD,0x03AE,0x03AF, + 0x03B0,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7, + 0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF, + 0x03C0,0x03C1,0x03C2,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7, + 0x03C8,0x03C9,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_7 */ + +/* + * 8-bit UCS -> iso_8859_7 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_7) + +static const unsigned char +from_ucs_speed_iso_8859_7[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(0x0302), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xA3,0xFF,0xFF,0xA6,0xA7, + 0xA8,0xA9,0xFF,0xAB,0xAC,0xAD,0xFF,0xFF, + 0xB0,0xB1,0xB2,0xB3,0xFF,0xFF,0xFF,0xB7, + 0xFF,0xFF,0xFF,0xBB,0xFF,0xBD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 4, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xB5,0xB6,0xFF, + 0xB8,0xB9,0xBA,0xFF,0xBC,0xFF,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xFF,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAF,0xFF,0xFF, + 0xA1,0xA2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_7 */ + +/* + * iso_8859_7 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_7 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_7, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_7) + (__uint16_t *)&from_ucs_speed_iso_8859_7, /* UCS -> iso_8859_7 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_7) + (__uint16_t *)&to_ucs_speed_iso_8859_7 /* iso_8859_7 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_7) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_8.c b/lib/iconv/ccs/iso_8859_8.c new file mode 100644 index 0000000..029a4b8 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_8.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_8 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_8) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_8) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_8 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_8) + +static const __uint16_t +to_ucs_speed_iso_8859_8[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,INVALC,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00D7,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00F7,0x00BB,0x00BC,0x00BD,0x00BE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2017, + 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7, + 0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF, + 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7, + 0x05E8,0x05E9,0x05EA,INVALC,INVALC,0x200E,0x200F,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_8 */ + +/* + * 8-bit UCS -> iso_8859_8 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_8) + +static const unsigned char +from_ucs_speed_iso_8859_8[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xFF,0xBB,0xBC,0xBD,0xBE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xAA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 6, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_8 */ + +/* + * iso_8859_8 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_8 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_8, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_8) + (__uint16_t *)&from_ucs_speed_iso_8859_8, /* UCS -> iso_8859_8 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_8) + (__uint16_t *)&to_ucs_speed_iso_8859_8 /* iso_8859_8 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_8) || ... */ + diff --git a/lib/iconv/ccs/iso_8859_9.c b/lib/iconv/ccs/iso_8859_9.c new file mode 100644 index 0000000..b787b98 --- /dev/null +++ b/lib/iconv/ccs/iso_8859_9.c @@ -0,0 +1,242 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_8859_9 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_8859_9) \ + || defined (ICONV_FROM_UCS_CCS_ISO_8859_9) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_8859_9 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_9) + +static const __uint16_t +to_ucs_speed_iso_8859_9[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, + 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + 0x011E,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x0130,0x015E,0x00DF, + 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + 0x011F,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x0131,0x015F,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_9 */ + +/* + * 8-bit UCS -> iso_8859_9 speed-optimized table (1026 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_9) + +static const unsigned char +from_ucs_speed_iso_8859_9[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xFF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xFF,0xFF,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xFF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD0,0xF0, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDE,0xFE, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_8859_9 */ + +/* + * iso_8859_9 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_8859_9 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_8859_9, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_8859_9) + (__uint16_t *)&from_ucs_speed_iso_8859_9, /* UCS -> iso_8859_9 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_8859_9) + (__uint16_t *)&to_ucs_speed_iso_8859_9 /* iso_8859_9 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_8859_9) || ... */ + diff --git a/lib/iconv/ccs/iso_ir_111.c b/lib/iconv/ccs/iso_ir_111.c new file mode 100644 index 0000000..7d05ef4 --- /dev/null +++ b/lib/iconv/ccs/iso_ir_111.c @@ -0,0 +1,275 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for iso_ir_111 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_ISO_IR_111) \ + || defined (ICONV_FROM_UCS_CCS_ISO_IR_111) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit iso_ir_111 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_ISO_IR_111) + +static const __uint16_t +to_ucs_speed_iso_ir_111[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087, + 0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F, + 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097, + 0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F, + 0x00A0,0x0452,0x0453,0x0451,0x0454,0x0455,0x0456,0x0457, + 0x0458,0x0459,0x045A,0x045B,0x045C,0x00AD,0x045E,0x045F, + 0x2116,0x0402,0x0403,0x0401,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,0x00A4,0x040E,0x040F, + 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, + 0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, + 0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, + 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, + 0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, + 0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A, + +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_IR_111 */ + +/* + * 8-bit UCS -> iso_ir_111 speed-optimized table (1282 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_ISO_IR_111) + +static const unsigned char +from_ucs_speed_iso_ir_111[] = +{ + W(0x042A), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(0x0402),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xFF,0xFF,0xFF,0xBD,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xAD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xB3,0xB1,0xB2,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xFF,0xBE,0xBF, + 0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA, + 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0, + 0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE, + 0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1, + 0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA, + 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0, + 0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE, + 0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1, + 0xFF,0xA3,0xA1,0xA2,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xFF,0xAE,0xAF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB0,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_ISO_IR_111 */ + +/* + * iso_ir_111 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_iso_ir_111 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_ISO_IR_111, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_ISO_IR_111) + (__uint16_t *)&from_ucs_speed_iso_ir_111, /* UCS -> iso_ir_111 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_ISO_IR_111) + (__uint16_t *)&to_ucs_speed_iso_ir_111 /* iso_ir_111 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_ISO_IR_111) || ... */ + diff --git a/lib/iconv/ccs/jis_x0201_1976.c b/lib/iconv/ccs/jis_x0201_1976.c new file mode 100644 index 0000000..ca94986 --- /dev/null +++ b/lib/iconv/ccs/jis_x0201_1976.c @@ -0,0 +1,209 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for jis_x0201_1976 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_JIS_X0201_1976) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0201_1976) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit jis_x0201_1976 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_JIS_X0201_1976) + +static const __uint16_t +to_ucs_speed_jis_x0201_1976[] = +{ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFF61,0xFF62,0xFF63,0xFF64,0xFF65,0xFF66,0xFF67, + 0xFF68,0xFF69,0xFF6A,0xFF6B,0xFF6C,0xFF6D,0xFF6E,0xFF6F, + 0xFF70,0xFF71,0xFF72,0xFF73,0xFF74,0xFF75,0xFF76,0xFF77, + 0xFF78,0xFF79,0xFF7A,0xFF7B,0xFF7C,0xFF7D,0xFF7E,0xFF7F, + 0xFF80,0xFF81,0xFF82,0xFF83,0xFF84,0xFF85,0xFF86,0xFF87, + 0xFF88,0xFF89,0xFF8A,0xFF8B,0xFF8C,0xFF8D,0xFF8E,0xFF8F, + 0xFF90,0xFF91,0xFF92,0xFF93,0xFF94,0xFF95,0xFF96,0xFF97, + 0xFF98,0xFF99,0xFF9A,0xFF9B,0xFF9C,0xFF9D,0xFF9E,0xFF9F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0201_1976 */ + +/* + * 8-bit UCS -> jis_x0201_1976 speed-optimized table (770 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_JIS_X0201_1976) + +static const unsigned char +from_ucs_speed_jis_x0201_1976[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(0x0202), + /* Block 256, Array index 0x0202 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_JIS_X0201_1976 */ + +/* + * jis_x0201_1976 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_jis_x0201_1976 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_JIS_X0201_1976, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_JIS_X0201_1976) + (__uint16_t *)&from_ucs_speed_jis_x0201_1976, /* UCS -> jis_x0201_1976 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_JIS_X0201_1976) + (__uint16_t *)&to_ucs_speed_jis_x0201_1976 /* jis_x0201_1976 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0201_1976) || ... */ + diff --git a/lib/iconv/ccs/jis_x0208_1990.c b/lib/iconv/ccs/jis_x0208_1990.c new file mode 100644 index 0000000..070e0e4 --- /dev/null +++ b/lib/iconv/ccs/jis_x0208_1990.c @@ -0,0 +1,12161 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for jis_x0208_1990 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit jis_x0208_1990 -> UCS speed-optimized table (39936 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_jis_x0208_1990[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700, + 0x0800,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00,0x0F00,0x1000, + 0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700,0x1800, + 0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,0x2000, + 0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700,0x2800, + 0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000, + 0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700,0x3800, + 0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00,0x3F00,0x4000, + 0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,0x4800, + 0x4900,0x4A00,0x4B00,0x4C00,0x4D00,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 34, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3000,0x3001,0x3002,0xFF0C,0xFF0E,0x30FB,0xFF1A, + 0xFF1B,0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8, + 0xFF3E,0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003, + 0x4EDD,0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F, + 0x005C,0x301C,0x2016,0xFF5C,0x2026,0x2025,0x2018,0x2019, + 0x201C,0x201D,0xFF08,0xFF09,0x3014,0x3015,0xFF3B,0xFF3D, + 0xFF5B,0xFF5D,0x3008,0x3009,0x300A,0x300B,0x300C,0x300D, + 0x300E,0x300F,0x3010,0x3011,0xFF0B,0x2212,0x00B1,0x00D7, + 0x00F7,0xFF1D,0x2260,0xFF1C,0xFF1E,0x2266,0x2267,0x221E, + 0x2234,0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFFE5, + 0xFF04,0x00A2,0x00A3,0xFF05,0xFF03,0xFF06,0xFF0A,0xFF20, + 0x00A7,0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x25C6,0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,0x25BC, + 0x203B,0x3012,0x2192,0x2190,0x2191,0x2193,0x3013,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2208,0x220B,0x2286,0x2287,0x2282,0x2283, + 0x222A,0x2229,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2227,0x2228,0x00AC,0x21D2,0x21D4,0x2200, + 0x2203,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2220,0x22A5,0x2312,0x2202, + 0x2207,0x2261,0x2252,0x226A,0x226B,0x221A,0x223D,0x221D, + 0x2235,0x222B,0x222C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x212B,0x2030,0x266F,0x266D,0x266A,0x2020, + 0x2021,0x00B6,INVALC,INVALC,INVALC,INVALC,0x25EF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, + 0xFF18,0xFF19,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, + 0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, + 0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, + 0xFF38,0xFF39,0xFF3A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, + 0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, + 0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57, + 0xFF58,0xFF59,0xFF5A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047, + 0x3048,0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F, + 0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057, + 0x3058,0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F, + 0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067, + 0x3068,0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F, + 0x3070,0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077, + 0x3078,0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F, + 0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087, + 0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F, + 0x3090,0x3091,0x3092,0x3093,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7, + 0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF, + 0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7, + 0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF, + 0x30C0,0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7, + 0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF, + 0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7, + 0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, + 0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7, + 0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF, + 0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, + 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8, + 0x03A9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7, + 0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF, + 0x03C0,0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8, + 0x03C9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 40, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401, + 0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D, + 0x041E,0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425, + 0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D, + 0x042E,0x042F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451, + 0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D, + 0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445, + 0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D, + 0x044E,0x044F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 41, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2500,0x2502,0x250C,0x2510,0x2518,0x2514,0x251C, + 0x252C,0x2524,0x2534,0x253C,0x2501,0x2503,0x250F,0x2513, + 0x251B,0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,0x2520, + 0x252F,0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538, + 0x2542,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E9C,0x5516,0x5A03,0x963F,0x54C0,0x611B,0x6328, + 0x59F6,0x9022,0x8475,0x831C,0x7A50,0x60AA,0x63E1,0x6E25, + 0x65ED,0x8466,0x82A6,0x9BF5,0x6893,0x5727,0x65A1,0x6271, + 0x5B9B,0x59D0,0x867B,0x98F4,0x7D62,0x7DBE,0x9B8E,0x6216, + 0x7C9F,0x88B7,0x5B89,0x5EB5,0x6309,0x6697,0x6848,0x95C7, + 0x978D,0x674F,0x4EE5,0x4F0A,0x4F4D,0x4F9D,0x5049,0x56F2, + 0x5937,0x59D4,0x5A01,0x5C09,0x60DF,0x610F,0x6170,0x6613, + 0x6905,0x70BA,0x754F,0x7570,0x79FB,0x7DAD,0x7DEF,0x80C3, + 0x840E,0x8863,0x8B02,0x9055,0x907A,0x533B,0x4E95,0x4EA5, + 0x57DF,0x80B2,0x90C1,0x78EF,0x4E00,0x58F1,0x6EA2,0x9038, + 0x7A32,0x8328,0x828B,0x9C2F,0x5141,0x5370,0x54BD,0x54E1, + 0x56E0,0x59FB,0x5F15,0x98F2,0x6DEB,0x80E4,0x852D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9662,0x9670,0x96A0,0x97FB,0x540B,0x53F3,0x5B87, + 0x70CF,0x7FBD,0x8FC2,0x96E8,0x536F,0x9D5C,0x7ABA,0x4E11, + 0x7893,0x81FC,0x6E26,0x5618,0x5504,0x6B1D,0x851A,0x9C3B, + 0x59E5,0x53A9,0x6D66,0x74DC,0x958F,0x5642,0x4E91,0x904B, + 0x96F2,0x834F,0x990C,0x53E1,0x55B6,0x5B30,0x5F71,0x6620, + 0x66F3,0x6804,0x6C38,0x6CF3,0x6D29,0x745B,0x76C8,0x7A4E, + 0x9834,0x82F1,0x885B,0x8A60,0x92ED,0x6DB2,0x75AB,0x76CA, + 0x99C5,0x60A6,0x8B01,0x8D8A,0x95B2,0x698E,0x53AD,0x5186, + 0x5712,0x5830,0x5944,0x5BB4,0x5EF6,0x6028,0x63A9,0x63F4, + 0x6CBF,0x6F14,0x708E,0x7114,0x7159,0x71D5,0x733F,0x7E01, + 0x8276,0x82D1,0x8597,0x9060,0x925B,0x9D1B,0x5869,0x65BC, + 0x6C5A,0x7525,0x51F9,0x592E,0x5965,0x5F80,0x5FDC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x62BC,0x65FA,0x6A2A,0x6B27,0x6BB4,0x738B,0x7FC1, + 0x8956,0x9D2C,0x9D0E,0x9EC4,0x5CA1,0x6C96,0x837B,0x5104, + 0x5C4B,0x61B6,0x81C6,0x6876,0x7261,0x4E59,0x4FFA,0x5378, + 0x6069,0x6E29,0x7A4F,0x97F3,0x4E0B,0x5316,0x4EEE,0x4F55, + 0x4F3D,0x4FA1,0x4F73,0x52A0,0x53EF,0x5609,0x590F,0x5AC1, + 0x5BB6,0x5BE1,0x79D1,0x6687,0x679C,0x67B6,0x6B4C,0x6CB3, + 0x706B,0x73C2,0x798D,0x79BE,0x7A3C,0x7B87,0x82B1,0x82DB, + 0x8304,0x8377,0x83EF,0x83D3,0x8766,0x8AB2,0x5629,0x8CA8, + 0x8FE6,0x904E,0x971E,0x868A,0x4FC4,0x5CE8,0x6211,0x7259, + 0x753B,0x81E5,0x82BD,0x86FE,0x8CC0,0x96C5,0x9913,0x99D5, + 0x4ECB,0x4F1A,0x89E3,0x56DE,0x584A,0x58CA,0x5EFB,0x5FEB, + 0x602A,0x6094,0x6062,0x61D0,0x6212,0x62D0,0x6539,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9B41,0x6666,0x68B0,0x6D77,0x7070,0x754C,0x7686, + 0x7D75,0x82A5,0x87F9,0x958B,0x968E,0x8C9D,0x51F1,0x52BE, + 0x5916,0x54B3,0x5BB3,0x5D16,0x6168,0x6982,0x6DAF,0x788D, + 0x84CB,0x8857,0x8A72,0x93A7,0x9AB8,0x6D6C,0x99A8,0x86D9, + 0x57A3,0x67FF,0x86CE,0x920E,0x5283,0x5687,0x5404,0x5ED3, + 0x62E1,0x64B9,0x683C,0x6838,0x6BBB,0x7372,0x78BA,0x7A6B, + 0x899A,0x89D2,0x8D6B,0x8F03,0x90ED,0x95A3,0x9694,0x9769, + 0x5B66,0x5CB3,0x697D,0x984D,0x984E,0x639B,0x7B20,0x6A2B, + 0x6A7F,0x68B6,0x9C0D,0x6F5F,0x5272,0x559D,0x6070,0x62EC, + 0x6D3B,0x6E07,0x6ED1,0x845B,0x8910,0x8F44,0x4E14,0x9C39, + 0x53F6,0x691B,0x6A3A,0x9784,0x682A,0x515C,0x7AC3,0x84B2, + 0x91DC,0x938C,0x565B,0x9D28,0x6822,0x8305,0x8431,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 53, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7CA5,0x5208,0x82C5,0x74E6,0x4E7E,0x4F83,0x51A0, + 0x5BD2,0x520A,0x52D8,0x52E7,0x5DFB,0x559A,0x582A,0x59E6, + 0x5B8C,0x5B98,0x5BDB,0x5E72,0x5E79,0x60A3,0x611F,0x6163, + 0x61BE,0x63DB,0x6562,0x67D1,0x6853,0x68FA,0x6B3E,0x6B53, + 0x6C57,0x6F22,0x6F97,0x6F45,0x74B0,0x7518,0x76E3,0x770B, + 0x7AFF,0x7BA1,0x7C21,0x7DE9,0x7F36,0x7FF0,0x809D,0x8266, + 0x839E,0x89B3,0x8ACC,0x8CAB,0x9084,0x9451,0x9593,0x9591, + 0x95A2,0x9665,0x97D3,0x9928,0x8218,0x4E38,0x542B,0x5CB8, + 0x5DCC,0x73A9,0x764C,0x773C,0x5CA9,0x7FEB,0x8D0B,0x96C1, + 0x9811,0x9854,0x9858,0x4F01,0x4F0E,0x5371,0x559C,0x5668, + 0x57FA,0x5947,0x5B09,0x5BC4,0x5C90,0x5E0C,0x5E7E,0x5FCC, + 0x63EE,0x673A,0x65D7,0x65E2,0x671F,0x68CB,0x68C4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 54, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A5F,0x5E30,0x6BC5,0x6C17,0x6C7D,0x757F,0x7948, + 0x5B63,0x7A00,0x7D00,0x5FBD,0x898F,0x8A18,0x8CB4,0x8D77, + 0x8ECC,0x8F1D,0x98E2,0x9A0E,0x9B3C,0x4E80,0x507D,0x5100, + 0x5993,0x5B9C,0x622F,0x6280,0x64EC,0x6B3A,0x72A0,0x7591, + 0x7947,0x7FA9,0x87FB,0x8ABC,0x8B70,0x63AC,0x83CA,0x97A0, + 0x5409,0x5403,0x55AB,0x6854,0x6A58,0x8A70,0x7827,0x6775, + 0x9ECD,0x5374,0x5BA2,0x811A,0x8650,0x9006,0x4E18,0x4E45, + 0x4EC7,0x4F11,0x53CA,0x5438,0x5BAE,0x5F13,0x6025,0x6551, + 0x673D,0x6C42,0x6C72,0x6CE3,0x7078,0x7403,0x7A76,0x7AAE, + 0x7B08,0x7D1A,0x7CFE,0x7D66,0x65E7,0x725B,0x53BB,0x5C45, + 0x5DE8,0x62D2,0x62E0,0x6319,0x6E20,0x865A,0x8A31,0x8DDD, + 0x92F8,0x6F01,0x79A6,0x9B5A,0x4EA8,0x4EAB,0x4EAC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 55, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F9B,0x4FA0,0x50D1,0x5147,0x7AF6,0x5171,0x51F6, + 0x5354,0x5321,0x537F,0x53EB,0x55AC,0x5883,0x5CE1,0x5F37, + 0x5F4A,0x602F,0x6050,0x606D,0x631F,0x6559,0x6A4B,0x6CC1, + 0x72C2,0x72ED,0x77EF,0x80F8,0x8105,0x8208,0x854E,0x90F7, + 0x93E1,0x97FF,0x9957,0x9A5A,0x4EF0,0x51DD,0x5C2D,0x6681, + 0x696D,0x5C40,0x66F2,0x6975,0x7389,0x6850,0x7C81,0x50C5, + 0x52E4,0x5747,0x5DFE,0x9326,0x65A4,0x6B23,0x6B3D,0x7434, + 0x7981,0x79BD,0x7B4B,0x7DCA,0x82B9,0x83CC,0x887F,0x895F, + 0x8B39,0x8FD1,0x91D1,0x541F,0x9280,0x4E5D,0x5036,0x53E5, + 0x533A,0x72D7,0x7396,0x77E9,0x82E6,0x8EAF,0x99C6,0x99C8, + 0x99D2,0x5177,0x611A,0x865E,0x55B0,0x7A7A,0x5076,0x5BD3, + 0x9047,0x9685,0x4E32,0x6ADB,0x91E7,0x5C51,0x5C48,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 56, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6398,0x7A9F,0x6C93,0x9774,0x8F61,0x7AAA,0x718A, + 0x9688,0x7C82,0x6817,0x7E70,0x6851,0x936C,0x52F2,0x541B, + 0x85AB,0x8A13,0x7FA4,0x8ECD,0x90E1,0x5366,0x8888,0x7941, + 0x4FC2,0x50BE,0x5211,0x5144,0x5553,0x572D,0x73EA,0x578B, + 0x5951,0x5F62,0x5F84,0x6075,0x6176,0x6167,0x61A9,0x63B2, + 0x643A,0x656C,0x666F,0x6842,0x6E13,0x7566,0x7A3D,0x7CFB, + 0x7D4C,0x7D99,0x7E4B,0x7F6B,0x830E,0x834A,0x86CD,0x8A08, + 0x8A63,0x8B66,0x8EFD,0x981A,0x9D8F,0x82B8,0x8FCE,0x9BE8, + 0x5287,0x621F,0x6483,0x6FC0,0x9699,0x6841,0x5091,0x6B20, + 0x6C7A,0x6F54,0x7A74,0x7D50,0x8840,0x8A23,0x6708,0x4EF6, + 0x5039,0x5026,0x5065,0x517C,0x5238,0x5263,0x55A7,0x570F, + 0x5805,0x5ACC,0x5EFA,0x61B2,0x61F8,0x62F3,0x6372,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 57, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x691C,0x6A29,0x727D,0x72AC,0x732E,0x7814,0x786F, + 0x7D79,0x770C,0x80A9,0x898B,0x8B19,0x8CE2,0x8ED2,0x9063, + 0x9375,0x967A,0x9855,0x9A13,0x9E78,0x5143,0x539F,0x53B3, + 0x5E7B,0x5F26,0x6E1B,0x6E90,0x7384,0x73FE,0x7D43,0x8237, + 0x8A00,0x8AFA,0x9650,0x4E4E,0x500B,0x53E4,0x547C,0x56FA, + 0x59D1,0x5B64,0x5DF1,0x5EAB,0x5F27,0x6238,0x6545,0x67AF, + 0x6E56,0x72D0,0x7CCA,0x88B4,0x80A1,0x80E1,0x83F0,0x864E, + 0x8A87,0x8DE8,0x9237,0x96C7,0x9867,0x9F13,0x4E94,0x4E92, + 0x4F0D,0x5348,0x5449,0x543E,0x5A2F,0x5F8C,0x5FA1,0x609F, + 0x68A7,0x6A8E,0x745A,0x7881,0x8A9E,0x8AA4,0x8B77,0x9190, + 0x4E5E,0x9BC9,0x4EA4,0x4F7C,0x4FAF,0x5019,0x5016,0x5149, + 0x516C,0x529F,0x52B9,0x52FE,0x539A,0x53E3,0x5411,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 58, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x540E,0x5589,0x5751,0x57A2,0x597D,0x5B54,0x5B5D, + 0x5B8F,0x5DE5,0x5DE7,0x5DF7,0x5E78,0x5E83,0x5E9A,0x5EB7, + 0x5F18,0x6052,0x614C,0x6297,0x62D8,0x63A7,0x653B,0x6602, + 0x6643,0x66F4,0x676D,0x6821,0x6897,0x69CB,0x6C5F,0x6D2A, + 0x6D69,0x6E2F,0x6E9D,0x7532,0x7687,0x786C,0x7A3F,0x7CE0, + 0x7D05,0x7D18,0x7D5E,0x7DB1,0x8015,0x8003,0x80AF,0x80B1, + 0x8154,0x818F,0x822A,0x8352,0x884C,0x8861,0x8B1B,0x8CA2, + 0x8CFC,0x90CA,0x9175,0x9271,0x783F,0x92FC,0x95A4,0x964D, + 0x9805,0x9999,0x9AD8,0x9D3B,0x525B,0x52AB,0x53F7,0x5408, + 0x58D5,0x62F7,0x6FE0,0x8C6A,0x8F5F,0x9EB9,0x514B,0x523B, + 0x544A,0x56FD,0x7A40,0x9177,0x9D60,0x9ED2,0x7344,0x6F09, + 0x8170,0x7511,0x5FFD,0x60DA,0x9AA8,0x72DB,0x8FBC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 59, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B64,0x9803,0x4ECA,0x56F0,0x5764,0x58BE,0x5A5A, + 0x6068,0x61C7,0x660F,0x6606,0x6839,0x68B1,0x6DF7,0x75D5, + 0x7D3A,0x826E,0x9B42,0x4E9B,0x4F50,0x53C9,0x5506,0x5D6F, + 0x5DE6,0x5DEE,0x67FB,0x6C99,0x7473,0x7802,0x8A50,0x9396, + 0x88DF,0x5750,0x5EA7,0x632B,0x50B5,0x50AC,0x518D,0x6700, + 0x54C9,0x585E,0x59BB,0x5BB0,0x5F69,0x624D,0x63A1,0x683D, + 0x6B73,0x6E08,0x707D,0x91C7,0x7280,0x7815,0x7826,0x796D, + 0x658E,0x7D30,0x83DC,0x88C1,0x8F09,0x969B,0x5264,0x5728, + 0x6750,0x7F6A,0x8CA1,0x51B4,0x5742,0x962A,0x583A,0x698A, + 0x80B4,0x54B2,0x5D0E,0x57FC,0x7895,0x9DFA,0x4F5C,0x524A, + 0x548B,0x643E,0x6628,0x6714,0x67F5,0x7A84,0x7B56,0x7D22, + 0x932F,0x685C,0x9BAD,0x7B39,0x5319,0x518A,0x5237,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 60, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5BDF,0x62F6,0x64AE,0x64E6,0x672D,0x6BBA,0x85A9, + 0x96D1,0x7690,0x9BD6,0x634C,0x9306,0x9BAB,0x76BF,0x6652, + 0x4E09,0x5098,0x53C2,0x5C71,0x60E8,0x6492,0x6563,0x685F, + 0x71E6,0x73CA,0x7523,0x7B97,0x7E82,0x8695,0x8B83,0x8CDB, + 0x9178,0x9910,0x65AC,0x66AB,0x6B8B,0x4ED5,0x4ED4,0x4F3A, + 0x4F7F,0x523A,0x53F8,0x53F2,0x55E3,0x56DB,0x58EB,0x59CB, + 0x59C9,0x59FF,0x5B50,0x5C4D,0x5E02,0x5E2B,0x5FD7,0x601D, + 0x6307,0x652F,0x5B5C,0x65AF,0x65BD,0x65E8,0x679D,0x6B62, + 0x6B7B,0x6C0F,0x7345,0x7949,0x79C1,0x7CF8,0x7D19,0x7D2B, + 0x80A2,0x8102,0x81F3,0x8996,0x8A5E,0x8A69,0x8A66,0x8A8C, + 0x8AEE,0x8CC7,0x8CDC,0x96CC,0x98FC,0x6B6F,0x4E8B,0x4F3C, + 0x4F8D,0x5150,0x5B57,0x5BFA,0x6148,0x6301,0x6642,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 61, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B21,0x6ECB,0x6CBB,0x723E,0x74BD,0x75D4,0x78C1, + 0x793A,0x800C,0x8033,0x81EA,0x8494,0x8F9E,0x6C50,0x9E7F, + 0x5F0F,0x8B58,0x9D2B,0x7AFA,0x8EF8,0x5B8D,0x96EB,0x4E03, + 0x53F1,0x57F7,0x5931,0x5AC9,0x5BA4,0x6089,0x6E7F,0x6F06, + 0x75BE,0x8CEA,0x5B9F,0x8500,0x7BE0,0x5072,0x67F4,0x829D, + 0x5C61,0x854A,0x7E1E,0x820E,0x5199,0x5C04,0x6368,0x8D66, + 0x659C,0x716E,0x793E,0x7D17,0x8005,0x8B1D,0x8ECA,0x906E, + 0x86C7,0x90AA,0x501F,0x52FA,0x5C3A,0x6753,0x707C,0x7235, + 0x914C,0x91C8,0x932B,0x82E5,0x5BC2,0x5F31,0x60F9,0x4E3B, + 0x53D6,0x5B88,0x624B,0x6731,0x6B8A,0x72E9,0x73E0,0x7A2E, + 0x816B,0x8DA3,0x9152,0x9996,0x5112,0x53D7,0x546A,0x5BFF, + 0x6388,0x6A39,0x7DAC,0x9700,0x56DA,0x53CE,0x5468,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 62, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B97,0x5C31,0x5DDE,0x4FEE,0x6101,0x62FE,0x6D32, + 0x79C0,0x79CB,0x7D42,0x7E4D,0x7FD2,0x81ED,0x821F,0x8490, + 0x8846,0x8972,0x8B90,0x8E74,0x8F2F,0x9031,0x914B,0x916C, + 0x96C6,0x919C,0x4EC0,0x4F4F,0x5145,0x5341,0x5F93,0x620E, + 0x67D4,0x6C41,0x6E0B,0x7363,0x7E26,0x91CD,0x9283,0x53D4, + 0x5919,0x5BBF,0x6DD1,0x795D,0x7E2E,0x7C9B,0x587E,0x719F, + 0x51FA,0x8853,0x8FF0,0x4FCA,0x5CFB,0x6625,0x77AC,0x7AE3, + 0x821C,0x99FF,0x51C6,0x5FAA,0x65EC,0x696F,0x6B89,0x6DF3, + 0x6E96,0x6F64,0x76FE,0x7D14,0x5DE1,0x9075,0x9187,0x9806, + 0x51E6,0x521D,0x6240,0x6691,0x66D9,0x6E1A,0x5EB6,0x7DD2, + 0x7F72,0x66F8,0x85AF,0x85F7,0x8AF8,0x52A9,0x53D9,0x5973, + 0x5E8F,0x5F90,0x6055,0x92E4,0x9664,0x50B7,0x511F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 63, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x52DD,0x5320,0x5347,0x53EC,0x54E8,0x5546,0x5531, + 0x5617,0x5968,0x59BE,0x5A3C,0x5BB5,0x5C06,0x5C0F,0x5C11, + 0x5C1A,0x5E84,0x5E8A,0x5EE0,0x5F70,0x627F,0x6284,0x62DB, + 0x638C,0x6377,0x6607,0x660C,0x662D,0x6676,0x677E,0x68A2, + 0x6A1F,0x6A35,0x6CBC,0x6D88,0x6E09,0x6E58,0x713C,0x7126, + 0x7167,0x75C7,0x7701,0x785D,0x7901,0x7965,0x79F0,0x7AE0, + 0x7B11,0x7CA7,0x7D39,0x8096,0x83D6,0x848B,0x8549,0x885D, + 0x88F3,0x8A1F,0x8A3C,0x8A54,0x8A73,0x8C61,0x8CDE,0x91A4, + 0x9266,0x937E,0x9418,0x969C,0x9798,0x4E0A,0x4E08,0x4E1E, + 0x4E57,0x5197,0x5270,0x57CE,0x5834,0x58CC,0x5B22,0x5E38, + 0x60C5,0x64FE,0x6761,0x6756,0x6D44,0x72B6,0x7573,0x7A63, + 0x84B8,0x8B72,0x91B8,0x9320,0x5631,0x57F4,0x98FE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 64, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x62ED,0x690D,0x6B96,0x71ED,0x7E54,0x8077,0x8272, + 0x89E6,0x98DF,0x8755,0x8FB1,0x5C3B,0x4F38,0x4FE1,0x4FB5, + 0x5507,0x5A20,0x5BDD,0x5BE9,0x5FC3,0x614E,0x632F,0x65B0, + 0x664B,0x68EE,0x699B,0x6D78,0x6DF1,0x7533,0x75B9,0x771F, + 0x795E,0x79E6,0x7D33,0x81E3,0x82AF,0x85AA,0x89AA,0x8A3A, + 0x8EAB,0x8F9B,0x9032,0x91DD,0x9707,0x4EBA,0x4EC1,0x5203, + 0x5875,0x58EC,0x5C0B,0x751A,0x5C3D,0x814E,0x8A0A,0x8FC5, + 0x9663,0x976D,0x7B25,0x8ACF,0x9808,0x9162,0x56F3,0x53A8, + 0x9017,0x5439,0x5782,0x5E25,0x63A8,0x6C34,0x708A,0x7761, + 0x7C8B,0x7FE0,0x8870,0x9042,0x9154,0x9310,0x9318,0x968F, + 0x745E,0x9AC4,0x5D07,0x5D69,0x6570,0x67A2,0x8DA8,0x96DB, + 0x636E,0x6749,0x6919,0x83C5,0x9817,0x96C0,0x88FE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 65, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F84,0x647A,0x5BF8,0x4E16,0x702C,0x755D,0x662F, + 0x51C4,0x5236,0x52E2,0x59D3,0x5F81,0x6027,0x6210,0x653F, + 0x6574,0x661F,0x6674,0x68F2,0x6816,0x6B63,0x6E05,0x7272, + 0x751F,0x76DB,0x7CBE,0x8056,0x58F0,0x88FD,0x897F,0x8AA0, + 0x8A93,0x8ACB,0x901D,0x9192,0x9752,0x9759,0x6589,0x7A0E, + 0x8106,0x96BB,0x5E2D,0x60DC,0x621A,0x65A5,0x6614,0x6790, + 0x77F3,0x7A4D,0x7C4D,0x7E3E,0x810A,0x8CAC,0x8D64,0x8DE1, + 0x8E5F,0x78A9,0x5207,0x62D9,0x63A5,0x6442,0x6298,0x8A2D, + 0x7A83,0x7BC0,0x8AAC,0x96EA,0x7D76,0x820C,0x8749,0x4ED9, + 0x5148,0x5343,0x5360,0x5BA3,0x5C02,0x5C16,0x5DDD,0x6226, + 0x6247,0x64B0,0x6813,0x6834,0x6CC9,0x6D45,0x6D17,0x67D3, + 0x6F5C,0x714E,0x717D,0x65CB,0x7A7F,0x7BAD,0x7DDA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 66, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7E4A,0x7FA8,0x817A,0x821B,0x8239,0x85A6,0x8A6E, + 0x8CCE,0x8DF5,0x9078,0x9077,0x92AD,0x9291,0x9583,0x9BAE, + 0x524D,0x5584,0x6F38,0x7136,0x5168,0x7985,0x7E55,0x81B3, + 0x7CCE,0x564C,0x5851,0x5CA8,0x63AA,0x66FE,0x66FD,0x695A, + 0x72D9,0x758F,0x758E,0x790E,0x7956,0x79DF,0x7C97,0x7D20, + 0x7D44,0x8607,0x8A34,0x963B,0x9061,0x9F20,0x50E7,0x5275, + 0x53CC,0x53E2,0x5009,0x55AA,0x58EE,0x594F,0x723D,0x5B8B, + 0x5C64,0x531D,0x60E3,0x60F3,0x635C,0x6383,0x633F,0x63BB, + 0x64CD,0x65E9,0x66F9,0x5DE3,0x69CD,0x69FD,0x6F15,0x71E5, + 0x4E89,0x75E9,0x76F8,0x7A93,0x7CDF,0x7DCF,0x7D9C,0x8061, + 0x8349,0x8358,0x846C,0x84BC,0x85FB,0x88C5,0x8D70,0x9001, + 0x906D,0x9397,0x971C,0x9A12,0x50CF,0x5897,0x618E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 67, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x81D3,0x8535,0x8D08,0x9020,0x4FC3,0x5074,0x5247, + 0x5373,0x606F,0x6349,0x675F,0x6E2C,0x8DB3,0x901F,0x4FD7, + 0x5C5E,0x8CCA,0x65CF,0x7D9A,0x5352,0x8896,0x5176,0x63C3, + 0x5B58,0x5B6B,0x5C0A,0x640D,0x6751,0x905C,0x4ED6,0x591A, + 0x592A,0x6C70,0x8A51,0x553E,0x5815,0x59A5,0x60F0,0x6253, + 0x67C1,0x8235,0x6955,0x9640,0x99C4,0x9A28,0x4F53,0x5806, + 0x5BFE,0x8010,0x5CB1,0x5E2F,0x5F85,0x6020,0x614B,0x6234, + 0x66FF,0x6CF0,0x6EDE,0x80CE,0x817F,0x82D4,0x888B,0x8CB8, + 0x9000,0x902E,0x968A,0x9EDB,0x9BDB,0x4EE3,0x53F0,0x5927, + 0x7B2C,0x918D,0x984C,0x9DF9,0x6EDD,0x7027,0x5353,0x5544, + 0x5B85,0x6258,0x629E,0x62D3,0x6CA2,0x6FEF,0x7422,0x8A17, + 0x9438,0x6FC1,0x8AFE,0x8338,0x51E7,0x86F8,0x53EA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 68, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x53E9,0x4F46,0x9054,0x8FB0,0x596A,0x8131,0x5DFD, + 0x7AEA,0x8FBF,0x68DA,0x8C37,0x72F8,0x9C48,0x6A3D,0x8AB0, + 0x4E39,0x5358,0x5606,0x5766,0x62C5,0x63A2,0x65E6,0x6B4E, + 0x6DE1,0x6E5B,0x70AD,0x77ED,0x7AEF,0x7BAA,0x7DBB,0x803D, + 0x80C6,0x86CB,0x8A95,0x935B,0x56E3,0x58C7,0x5F3E,0x65AD, + 0x6696,0x6A80,0x6BB5,0x7537,0x8AC7,0x5024,0x77E5,0x5730, + 0x5F1B,0x6065,0x667A,0x6C60,0x75F4,0x7A1A,0x7F6E,0x81F4, + 0x8718,0x9045,0x99B3,0x7BC9,0x755C,0x7AF9,0x7B51,0x84C4, + 0x9010,0x79E9,0x7A92,0x8336,0x5AE1,0x7740,0x4E2D,0x4EF2, + 0x5B99,0x5FE0,0x62BD,0x663C,0x67F1,0x6CE8,0x866B,0x8877, + 0x8A3B,0x914E,0x92F3,0x99D0,0x6A17,0x7026,0x732A,0x82E7, + 0x8457,0x8CAF,0x4E01,0x5146,0x51CB,0x558B,0x5BF5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 69, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E16,0x5E33,0x5E81,0x5F14,0x5F35,0x5F6B,0x5FB4, + 0x61F2,0x6311,0x66A2,0x671D,0x6F6E,0x7252,0x753A,0x773A, + 0x8074,0x8139,0x8178,0x8776,0x8ABF,0x8ADC,0x8D85,0x8DF3, + 0x929A,0x9577,0x9802,0x9CE5,0x52C5,0x6357,0x76F4,0x6715, + 0x6C88,0x73CD,0x8CC3,0x93AE,0x9673,0x6D25,0x589C,0x690E, + 0x69CC,0x8FFD,0x939A,0x75DB,0x901A,0x585A,0x6802,0x63B4, + 0x69FB,0x4F43,0x6F2C,0x67D8,0x8FBB,0x8526,0x7DB4,0x9354, + 0x693F,0x6F70,0x576A,0x58F7,0x5B2C,0x7D2C,0x722A,0x540A, + 0x91E3,0x9DB4,0x4EAD,0x4F4E,0x505C,0x5075,0x5243,0x8C9E, + 0x5448,0x5824,0x5B9A,0x5E1D,0x5E95,0x5EAD,0x5EF7,0x5F1F, + 0x608C,0x62B5,0x633A,0x63D0,0x68AF,0x6C40,0x7887,0x798E, + 0x7A0B,0x7DE0,0x8247,0x8A02,0x8AE6,0x8E44,0x9013,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 70, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x90B8,0x912D,0x91D8,0x9F0E,0x6CE5,0x6458,0x64E2, + 0x6575,0x6EF4,0x7684,0x7B1B,0x9069,0x93D1,0x6EBA,0x54F2, + 0x5FB9,0x64A4,0x8F4D,0x8FED,0x9244,0x5178,0x586B,0x5929, + 0x5C55,0x5E97,0x6DFB,0x7E8F,0x751C,0x8CBC,0x8EE2,0x985B, + 0x70B9,0x4F1D,0x6BBF,0x6FB1,0x7530,0x96FB,0x514E,0x5410, + 0x5835,0x5857,0x59AC,0x5C60,0x5F92,0x6597,0x675C,0x6E21, + 0x767B,0x83DF,0x8CED,0x9014,0x90FD,0x934D,0x7825,0x783A, + 0x52AA,0x5EA6,0x571F,0x5974,0x6012,0x5012,0x515A,0x51AC, + 0x51CD,0x5200,0x5510,0x5854,0x5858,0x5957,0x5B95,0x5CF6, + 0x5D8B,0x60BC,0x6295,0x642D,0x6771,0x6843,0x68BC,0x68DF, + 0x76D7,0x6DD8,0x6E6F,0x6D9B,0x706F,0x71C8,0x5F53,0x75D8, + 0x7977,0x7B49,0x7B54,0x7B52,0x7CD6,0x7D71,0x5230,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 71, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8463,0x8569,0x85E4,0x8A0E,0x8B04,0x8C46,0x8E0F, + 0x9003,0x900F,0x9419,0x9676,0x982D,0x9A30,0x95D8,0x50CD, + 0x52D5,0x540C,0x5802,0x5C0E,0x61A7,0x649E,0x6D1E,0x77B3, + 0x7AE5,0x80F4,0x8404,0x9053,0x9285,0x5CE0,0x9D07,0x533F, + 0x5F97,0x5FB3,0x6D9C,0x7279,0x7763,0x79BF,0x7BE4,0x6BD2, + 0x72EC,0x8AAD,0x6803,0x6A61,0x51F8,0x7A81,0x6934,0x5C4A, + 0x9CF6,0x82EB,0x5BC5,0x9149,0x701E,0x5678,0x5C6F,0x60C7, + 0x6566,0x6C8C,0x8C5A,0x9041,0x9813,0x5451,0x66C7,0x920D, + 0x5948,0x90A3,0x5185,0x4E4D,0x51EA,0x8599,0x8B0E,0x7058, + 0x637A,0x934B,0x6962,0x99B4,0x7E04,0x7577,0x5357,0x6960, + 0x8EDF,0x96E3,0x6C5D,0x4E8C,0x5C3C,0x5F10,0x8FE9,0x5302, + 0x8CD1,0x8089,0x8679,0x5EFF,0x65E5,0x4E73,0x5165,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 72, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5982,0x5C3F,0x97EE,0x4EFB,0x598A,0x5FCD,0x8A8D, + 0x6FE1,0x79B0,0x7962,0x5BE7,0x8471,0x732B,0x71B1,0x5E74, + 0x5FF5,0x637B,0x649A,0x71C3,0x7C98,0x4E43,0x5EFC,0x4E4B, + 0x57DC,0x56A2,0x60A9,0x6FC3,0x7D0D,0x80FD,0x8133,0x81BF, + 0x8FB2,0x8997,0x86A4,0x5DF4,0x628A,0x64AD,0x8987,0x6777, + 0x6CE2,0x6D3E,0x7436,0x7834,0x5A46,0x7F75,0x82AD,0x99AC, + 0x4FF3,0x5EC3,0x62DD,0x6392,0x6557,0x676F,0x76C3,0x724C, + 0x80CC,0x80BA,0x8F29,0x914D,0x500D,0x57F9,0x5A92,0x6885, + 0x6973,0x7164,0x72FD,0x8CB7,0x58F2,0x8CE0,0x966A,0x9019, + 0x877F,0x79E4,0x77E7,0x8429,0x4F2F,0x5265,0x535A,0x62CD, + 0x67CF,0x6CCA,0x767D,0x7B94,0x7C95,0x8236,0x8584,0x8FEB, + 0x66DD,0x6F20,0x7206,0x7E1B,0x83AB,0x99C1,0x9EA6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 73, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x51FD,0x7BB1,0x7872,0x7BB8,0x8087,0x7B48,0x6AE8, + 0x5E61,0x808C,0x7551,0x7560,0x516B,0x9262,0x6E8C,0x767A, + 0x9197,0x9AEA,0x4F10,0x7F70,0x629C,0x7B4F,0x95A5,0x9CE9, + 0x567A,0x5859,0x86E4,0x96BC,0x4F34,0x5224,0x534A,0x53CD, + 0x53DB,0x5E06,0x642C,0x6591,0x677F,0x6C3E,0x6C4E,0x7248, + 0x72AF,0x73ED,0x7554,0x7E41,0x822C,0x85E9,0x8CA9,0x7BC4, + 0x91C6,0x7169,0x9812,0x98EF,0x633D,0x6669,0x756A,0x76E4, + 0x78D0,0x8543,0x86EE,0x532A,0x5351,0x5426,0x5983,0x5E87, + 0x5F7C,0x60B2,0x6249,0x6279,0x62AB,0x6590,0x6BD4,0x6CCC, + 0x75B2,0x76AE,0x7891,0x79D8,0x7DCB,0x7F77,0x80A5,0x88AB, + 0x8AB9,0x8CBB,0x907F,0x975E,0x98DB,0x6A0B,0x7C38,0x5099, + 0x5C3E,0x5FAE,0x6787,0x6BD8,0x7435,0x7709,0x7F8E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 74, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9F3B,0x67CA,0x7A17,0x5339,0x758B,0x9AED,0x5F66, + 0x819D,0x83F1,0x8098,0x5F3C,0x5FC5,0x7562,0x7B46,0x903C, + 0x6867,0x59EB,0x5A9B,0x7D10,0x767E,0x8B2C,0x4FF5,0x5F6A, + 0x6A19,0x6C37,0x6F02,0x74E2,0x7968,0x8868,0x8A55,0x8C79, + 0x5EDF,0x63CF,0x75C5,0x79D2,0x82D7,0x9328,0x92F2,0x849C, + 0x86ED,0x9C2D,0x54C1,0x5F6C,0x658C,0x6D5C,0x7015,0x8CA7, + 0x8CD3,0x983B,0x654F,0x74F6,0x4E0D,0x4ED8,0x57E0,0x592B, + 0x5A66,0x5BCC,0x51A8,0x5E03,0x5E9C,0x6016,0x6276,0x6577, + 0x65A7,0x666E,0x6D6E,0x7236,0x7B26,0x8150,0x819A,0x8299, + 0x8B5C,0x8CA0,0x8CE6,0x8D74,0x961C,0x9644,0x4FAE,0x64AB, + 0x6B66,0x821E,0x8461,0x856A,0x90E8,0x5C01,0x6953,0x98A8, + 0x847A,0x8557,0x4F0F,0x526F,0x5FA9,0x5E45,0x670D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 75, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x798F,0x8179,0x8907,0x8986,0x6DF5,0x5F17,0x6255, + 0x6CB8,0x4ECF,0x7269,0x9B92,0x5206,0x543B,0x5674,0x58B3, + 0x61A4,0x626E,0x711A,0x596E,0x7C89,0x7CDE,0x7D1B,0x96F0, + 0x6587,0x805E,0x4E19,0x4F75,0x5175,0x5840,0x5E63,0x5E73, + 0x5F0A,0x67C4,0x4E26,0x853D,0x9589,0x965B,0x7C73,0x9801, + 0x50FB,0x58C1,0x7656,0x78A7,0x5225,0x77A5,0x8511,0x7B86, + 0x504F,0x5909,0x7247,0x7BC7,0x7DE8,0x8FBA,0x8FD4,0x904D, + 0x4FBF,0x52C9,0x5A29,0x5F01,0x97AD,0x4FDD,0x8217,0x92EA, + 0x5703,0x6355,0x6B69,0x752B,0x88DC,0x8F14,0x7A42,0x52DF, + 0x5893,0x6155,0x620A,0x66AE,0x6BCD,0x7C3F,0x83E9,0x5023, + 0x4FF8,0x5305,0x5446,0x5831,0x5949,0x5B9D,0x5CF0,0x5CEF, + 0x5D29,0x5E96,0x62B1,0x6367,0x653E,0x65B9,0x670B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 76, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6CD5,0x6CE1,0x70F9,0x7832,0x7E2B,0x80DE,0x82B3, + 0x840C,0x84EC,0x8702,0x8912,0x8A2A,0x8C4A,0x90A6,0x92D2, + 0x98FD,0x9CF3,0x9D6C,0x4E4F,0x4EA1,0x508D,0x5256,0x574A, + 0x59A8,0x5E3D,0x5FD8,0x5FD9,0x623F,0x66B4,0x671B,0x67D0, + 0x68D2,0x5192,0x7D21,0x80AA,0x81A8,0x8B00,0x8C8C,0x8CBF, + 0x927E,0x9632,0x5420,0x982C,0x5317,0x50D5,0x535C,0x58A8, + 0x64B2,0x6734,0x7267,0x7766,0x7A46,0x91E6,0x52C3,0x6CA1, + 0x6B86,0x5800,0x5E4C,0x5954,0x672C,0x7FFB,0x51E1,0x76C6, + 0x6469,0x78E8,0x9B54,0x9EBB,0x57CB,0x59B9,0x6627,0x679A, + 0x6BCE,0x54E9,0x69D9,0x5E55,0x819C,0x6795,0x9BAA,0x67FE, + 0x9C52,0x685D,0x4EA6,0x4FE3,0x53C8,0x62B9,0x672B,0x6CAB, + 0x8FC4,0x4FAD,0x7E6D,0x9EBF,0x4E07,0x6162,0x6E80,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 77, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F2B,0x8513,0x5473,0x672A,0x9B45,0x5DF3,0x7B95, + 0x5CAC,0x5BC6,0x871C,0x6E4A,0x84D1,0x7A14,0x8108,0x5999, + 0x7C8D,0x6C11,0x7720,0x52D9,0x5922,0x7121,0x725F,0x77DB, + 0x9727,0x9D61,0x690B,0x5A7F,0x5A18,0x51A5,0x540D,0x547D, + 0x660E,0x76DF,0x8FF7,0x9298,0x9CF4,0x59EA,0x725D,0x6EC5, + 0x514D,0x68C9,0x7DBF,0x7DEC,0x9762,0x9EBA,0x6478,0x6A21, + 0x8302,0x5984,0x5B5F,0x6BDB,0x731B,0x76F2,0x7DB2,0x8017, + 0x8499,0x5132,0x6728,0x9ED9,0x76EE,0x6762,0x52FF,0x9905, + 0x5C24,0x623B,0x7C7E,0x8CB0,0x554F,0x60B6,0x7D0B,0x9580, + 0x5301,0x4E5F,0x51B6,0x591C,0x723A,0x8036,0x91CE,0x5F25, + 0x77E2,0x5384,0x5F79,0x7D04,0x85AC,0x8A33,0x8E8D,0x9756, + 0x67F3,0x85AE,0x9453,0x6109,0x6108,0x6CB9,0x7652,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 78, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8AED,0x8F38,0x552F,0x4F51,0x512A,0x52C7,0x53CB, + 0x5BA5,0x5E7D,0x60A0,0x6182,0x63D6,0x6709,0x67DA,0x6E67, + 0x6D8C,0x7336,0x7337,0x7531,0x7950,0x88D5,0x8A98,0x904A, + 0x9091,0x90F5,0x96C4,0x878D,0x5915,0x4E88,0x4F59,0x4E0E, + 0x8A89,0x8F3F,0x9810,0x50AD,0x5E7C,0x5996,0x5BB9,0x5EB8, + 0x63DA,0x63FA,0x64C1,0x66DC,0x694A,0x69D8,0x6D0B,0x6EB6, + 0x7194,0x7528,0x7AAF,0x7F8A,0x8000,0x8449,0x84C9,0x8981, + 0x8B21,0x8E0A,0x9065,0x967D,0x990A,0x617E,0x6291,0x6B32, + 0x6C83,0x6D74,0x7FCC,0x7FFC,0x6DC0,0x7F85,0x87BA,0x88F8, + 0x6765,0x83B1,0x983C,0x96F7,0x6D1B,0x7D61,0x843D,0x916A, + 0x4E71,0x5375,0x5D50,0x6B04,0x6FEB,0x85CD,0x862D,0x89A7, + 0x5229,0x540F,0x5C65,0x674E,0x68A8,0x7406,0x7483,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x75E2,0x88CF,0x88E1,0x91CC,0x96E2,0x9678,0x5F8B, + 0x7387,0x7ACB,0x844E,0x63A0,0x7565,0x5289,0x6D41,0x6E9C, + 0x7409,0x7559,0x786B,0x7C92,0x9686,0x7ADC,0x9F8D,0x4FB6, + 0x616E,0x65C5,0x865C,0x4E86,0x4EAE,0x50DA,0x4E21,0x51CC, + 0x5BEE,0x6599,0x6881,0x6DBC,0x731F,0x7642,0x77AD,0x7A1C, + 0x7CE7,0x826F,0x8AD2,0x907C,0x91CF,0x9675,0x9818,0x529B, + 0x7DD1,0x502B,0x5398,0x6797,0x6DCB,0x71D0,0x7433,0x81E8, + 0x8F2A,0x96A3,0x9C57,0x9E9F,0x7460,0x5841,0x6D99,0x7D2F, + 0x985E,0x4EE4,0x4F36,0x4F8B,0x51B7,0x52B1,0x5DBA,0x601C, + 0x73B2,0x793C,0x82D3,0x9234,0x96B7,0x96F6,0x970A,0x9E97, + 0x9F62,0x66A6,0x6B74,0x5217,0x52A3,0x70C8,0x88C2,0x5EC9, + 0x604B,0x6190,0x6F23,0x7149,0x7C3E,0x7DF4,0x806F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x84EE,0x9023,0x932C,0x5442,0x9B6F,0x6AD3,0x7089, + 0x8CC2,0x8DEF,0x9732,0x52B4,0x5A41,0x5ECA,0x5F04,0x6717, + 0x697C,0x6994,0x6D6A,0x6F0F,0x7262,0x72FC,0x7BED,0x8001, + 0x807E,0x874B,0x90CE,0x516D,0x9E93,0x7984,0x808B,0x9332, + 0x8AD6,0x502D,0x548C,0x8A71,0x6B6A,0x8CC4,0x8107,0x60D1, + 0x67A0,0x9DF2,0x4E99,0x4E98,0x9C10,0x8A6B,0x85C1,0x8568, + 0x6900,0x6E7E,0x7897,0x8155,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F0C,0x4E10,0x4E15,0x4E2A,0x4E31,0x4E36,0x4E3C, + 0x4E3F,0x4E42,0x4E56,0x4E58,0x4E82,0x4E85,0x8C6B,0x4E8A, + 0x8212,0x5F0D,0x4E8E,0x4E9E,0x4E9F,0x4EA0,0x4EA2,0x4EB0, + 0x4EB3,0x4EB6,0x4ECE,0x4ECD,0x4EC4,0x4EC6,0x4EC2,0x4ED7, + 0x4EDE,0x4EED,0x4EDF,0x4EF7,0x4F09,0x4F5A,0x4F30,0x4F5B, + 0x4F5D,0x4F57,0x4F47,0x4F76,0x4F88,0x4F8F,0x4F98,0x4F7B, + 0x4F69,0x4F70,0x4F91,0x4F6F,0x4F86,0x4F96,0x5118,0x4FD4, + 0x4FDF,0x4FCE,0x4FD8,0x4FDB,0x4FD1,0x4FDA,0x4FD0,0x4FE4, + 0x4FE5,0x501A,0x5028,0x5014,0x502A,0x5025,0x5005,0x4F1C, + 0x4FF6,0x5021,0x5029,0x502C,0x4FFE,0x4FEF,0x5011,0x5006, + 0x5043,0x5047,0x6703,0x5055,0x5050,0x5048,0x505A,0x5056, + 0x506C,0x5078,0x5080,0x509A,0x5085,0x50B4,0x50B2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x50C9,0x50CA,0x50B3,0x50C2,0x50D6,0x50DE,0x50E5, + 0x50ED,0x50E3,0x50EE,0x50F9,0x50F5,0x5109,0x5101,0x5102, + 0x5116,0x5115,0x5114,0x511A,0x5121,0x513A,0x5137,0x513C, + 0x513B,0x513F,0x5140,0x5152,0x514C,0x5154,0x5162,0x7AF8, + 0x5169,0x516A,0x516E,0x5180,0x5182,0x56D8,0x518C,0x5189, + 0x518F,0x5191,0x5193,0x5195,0x5196,0x51A4,0x51A6,0x51A2, + 0x51A9,0x51AA,0x51AB,0x51B3,0x51B1,0x51B2,0x51B0,0x51B5, + 0x51BD,0x51C5,0x51C9,0x51DB,0x51E0,0x8655,0x51E9,0x51ED, + 0x51F0,0x51F5,0x51FE,0x5204,0x520B,0x5214,0x520E,0x5227, + 0x522A,0x522E,0x5233,0x5239,0x524F,0x5244,0x524B,0x524C, + 0x525E,0x5254,0x526A,0x5274,0x5269,0x5273,0x527F,0x527D, + 0x528D,0x5294,0x5292,0x5271,0x5288,0x5291,0x8FA8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8FA7,0x52AC,0x52AD,0x52BC,0x52B5,0x52C1,0x52CD, + 0x52D7,0x52DE,0x52E3,0x52E6,0x98ED,0x52E0,0x52F3,0x52F5, + 0x52F8,0x52F9,0x5306,0x5308,0x7538,0x530D,0x5310,0x530F, + 0x5315,0x531A,0x5323,0x532F,0x5331,0x5333,0x5338,0x5340, + 0x5346,0x5345,0x4E17,0x5349,0x534D,0x51D6,0x535E,0x5369, + 0x536E,0x5918,0x537B,0x5377,0x5382,0x5396,0x53A0,0x53A6, + 0x53A5,0x53AE,0x53B0,0x53B6,0x53C3,0x7C12,0x96D9,0x53DF, + 0x66FC,0x71EE,0x53EE,0x53E8,0x53ED,0x53FA,0x5401,0x543D, + 0x5440,0x542C,0x542D,0x543C,0x542E,0x5436,0x5429,0x541D, + 0x544E,0x548F,0x5475,0x548E,0x545F,0x5471,0x5477,0x5470, + 0x5492,0x547B,0x5480,0x5476,0x5484,0x5490,0x5486,0x54C7, + 0x54A2,0x54B8,0x54A5,0x54AC,0x54C4,0x54C8,0x54A8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x54AB,0x54C2,0x54A4,0x54BE,0x54BC,0x54D8,0x54E5, + 0x54E6,0x550F,0x5514,0x54FD,0x54EE,0x54ED,0x54FA,0x54E2, + 0x5539,0x5540,0x5563,0x554C,0x552E,0x555C,0x5545,0x5556, + 0x5557,0x5538,0x5533,0x555D,0x5599,0x5580,0x54AF,0x558A, + 0x559F,0x557B,0x557E,0x5598,0x559E,0x55AE,0x557C,0x5583, + 0x55A9,0x5587,0x55A8,0x55DA,0x55C5,0x55DF,0x55C4,0x55DC, + 0x55E4,0x55D4,0x5614,0x55F7,0x5616,0x55FE,0x55FD,0x561B, + 0x55F9,0x564E,0x5650,0x71DF,0x5634,0x5636,0x5632,0x5638, + 0x566B,0x5664,0x562F,0x566C,0x566A,0x5686,0x5680,0x568A, + 0x56A0,0x5694,0x568F,0x56A5,0x56AE,0x56B6,0x56B4,0x56C2, + 0x56BC,0x56C1,0x56C3,0x56C0,0x56C8,0x56CE,0x56D1,0x56D3, + 0x56D7,0x56EE,0x56F9,0x5700,0x56FF,0x5704,0x5709,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5708,0x570B,0x570D,0x5713,0x5718,0x5716,0x55C7, + 0x571C,0x5726,0x5737,0x5738,0x574E,0x573B,0x5740,0x574F, + 0x5769,0x57C0,0x5788,0x5761,0x577F,0x5789,0x5793,0x57A0, + 0x57B3,0x57A4,0x57AA,0x57B0,0x57C3,0x57C6,0x57D4,0x57D2, + 0x57D3,0x580A,0x57D6,0x57E3,0x580B,0x5819,0x581D,0x5872, + 0x5821,0x5862,0x584B,0x5870,0x6BC0,0x5852,0x583D,0x5879, + 0x5885,0x58B9,0x589F,0x58AB,0x58BA,0x58DE,0x58BB,0x58B8, + 0x58AE,0x58C5,0x58D3,0x58D1,0x58D7,0x58D9,0x58D8,0x58E5, + 0x58DC,0x58E4,0x58DF,0x58EF,0x58FA,0x58F9,0x58FB,0x58FC, + 0x58FD,0x5902,0x590A,0x5910,0x591B,0x68A6,0x5925,0x592C, + 0x592D,0x5932,0x5938,0x593E,0x7AD2,0x5955,0x5950,0x594E, + 0x595A,0x5958,0x5962,0x5960,0x5967,0x596C,0x5969,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5978,0x5981,0x599D,0x4F5E,0x4FAB,0x59A3,0x59B2, + 0x59C6,0x59E8,0x59DC,0x598D,0x59D9,0x59DA,0x5A25,0x5A1F, + 0x5A11,0x5A1C,0x5A09,0x5A1A,0x5A40,0x5A6C,0x5A49,0x5A35, + 0x5A36,0x5A62,0x5A6A,0x5A9A,0x5ABC,0x5ABE,0x5ACB,0x5AC2, + 0x5ABD,0x5AE3,0x5AD7,0x5AE6,0x5AE9,0x5AD6,0x5AFA,0x5AFB, + 0x5B0C,0x5B0B,0x5B16,0x5B32,0x5AD0,0x5B2A,0x5B36,0x5B3E, + 0x5B43,0x5B45,0x5B40,0x5B51,0x5B55,0x5B5A,0x5B5B,0x5B65, + 0x5B69,0x5B70,0x5B73,0x5B75,0x5B78,0x6588,0x5B7A,0x5B80, + 0x5B83,0x5BA6,0x5BB8,0x5BC3,0x5BC7,0x5BC9,0x5BD4,0x5BD0, + 0x5BE4,0x5BE6,0x5BE2,0x5BDE,0x5BE5,0x5BEB,0x5BF0,0x5BF6, + 0x5BF3,0x5C05,0x5C07,0x5C08,0x5C0D,0x5C13,0x5C20,0x5C22, + 0x5C28,0x5C38,0x5C39,0x5C41,0x5C46,0x5C4E,0x5C53,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C50,0x5C4F,0x5B71,0x5C6C,0x5C6E,0x4E62,0x5C76, + 0x5C79,0x5C8C,0x5C91,0x5C94,0x599B,0x5CAB,0x5CBB,0x5CB6, + 0x5CBC,0x5CB7,0x5CC5,0x5CBE,0x5CC7,0x5CD9,0x5CE9,0x5CFD, + 0x5CFA,0x5CED,0x5D8C,0x5CEA,0x5D0B,0x5D15,0x5D17,0x5D5C, + 0x5D1F,0x5D1B,0x5D11,0x5D14,0x5D22,0x5D1A,0x5D19,0x5D18, + 0x5D4C,0x5D52,0x5D4E,0x5D4B,0x5D6C,0x5D73,0x5D76,0x5D87, + 0x5D84,0x5D82,0x5DA2,0x5D9D,0x5DAC,0x5DAE,0x5DBD,0x5D90, + 0x5DB7,0x5DBC,0x5DC9,0x5DCD,0x5DD3,0x5DD2,0x5DD6,0x5DDB, + 0x5DEB,0x5DF2,0x5DF5,0x5E0B,0x5E1A,0x5E19,0x5E11,0x5E1B, + 0x5E36,0x5E37,0x5E44,0x5E43,0x5E40,0x5E4E,0x5E57,0x5E54, + 0x5E5F,0x5E62,0x5E64,0x5E47,0x5E75,0x5E76,0x5E7A,0x9EBC, + 0x5E7F,0x5EA0,0x5EC1,0x5EC2,0x5EC8,0x5ED0,0x5ECF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5ED6,0x5EE3,0x5EDD,0x5EDA,0x5EDB,0x5EE2,0x5EE1, + 0x5EE8,0x5EE9,0x5EEC,0x5EF1,0x5EF3,0x5EF0,0x5EF4,0x5EF8, + 0x5EFE,0x5F03,0x5F09,0x5F5D,0x5F5C,0x5F0B,0x5F11,0x5F16, + 0x5F29,0x5F2D,0x5F38,0x5F41,0x5F48,0x5F4C,0x5F4E,0x5F2F, + 0x5F51,0x5F56,0x5F57,0x5F59,0x5F61,0x5F6D,0x5F73,0x5F77, + 0x5F83,0x5F82,0x5F7F,0x5F8A,0x5F88,0x5F91,0x5F87,0x5F9E, + 0x5F99,0x5F98,0x5FA0,0x5FA8,0x5FAD,0x5FBC,0x5FD6,0x5FFB, + 0x5FE4,0x5FF8,0x5FF1,0x5FDD,0x60B3,0x5FFF,0x6021,0x6060, + 0x6019,0x6010,0x6029,0x600E,0x6031,0x601B,0x6015,0x602B, + 0x6026,0x600F,0x603A,0x605A,0x6041,0x606A,0x6077,0x605F, + 0x604A,0x6046,0x604D,0x6063,0x6043,0x6064,0x6042,0x606C, + 0x606B,0x6059,0x6081,0x608D,0x60E7,0x6083,0x609A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6084,0x609B,0x6096,0x6097,0x6092,0x60A7,0x608B, + 0x60E1,0x60B8,0x60E0,0x60D3,0x60B4,0x5FF0,0x60BD,0x60C6, + 0x60B5,0x60D8,0x614D,0x6115,0x6106,0x60F6,0x60F7,0x6100, + 0x60F4,0x60FA,0x6103,0x6121,0x60FB,0x60F1,0x610D,0x610E, + 0x6147,0x613E,0x6128,0x6127,0x614A,0x613F,0x613C,0x612C, + 0x6134,0x613D,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159, + 0x615A,0x616B,0x6174,0x616F,0x6165,0x6171,0x615F,0x615D, + 0x6153,0x6175,0x6199,0x6196,0x6187,0x61AC,0x6194,0x619A, + 0x618A,0x6191,0x61AB,0x61AE,0x61CC,0x61CA,0x61C9,0x61F7, + 0x61C8,0x61C3,0x61C6,0x61BA,0x61CB,0x7F79,0x61CD,0x61E6, + 0x61E3,0x61F6,0x61FA,0x61F4,0x61FF,0x61FD,0x61FC,0x61FE, + 0x6200,0x6208,0x6209,0x620D,0x620C,0x6214,0x621B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x621E,0x6221,0x622A,0x622E,0x6230,0x6232,0x6233, + 0x6241,0x624E,0x625E,0x6263,0x625B,0x6260,0x6268,0x627C, + 0x6282,0x6289,0x627E,0x6292,0x6293,0x6296,0x62D4,0x6283, + 0x6294,0x62D7,0x62D1,0x62BB,0x62CF,0x62FF,0x62C6,0x64D4, + 0x62C8,0x62DC,0x62CC,0x62CA,0x62C2,0x62C7,0x629B,0x62C9, + 0x630C,0x62EE,0x62F1,0x6327,0x6302,0x6308,0x62EF,0x62F5, + 0x6350,0x633E,0x634D,0x641C,0x634F,0x6396,0x638E,0x6380, + 0x63AB,0x6376,0x63A3,0x638F,0x6389,0x639F,0x63B5,0x636B, + 0x6369,0x63BE,0x63E9,0x63C0,0x63C6,0x63E3,0x63C9,0x63D2, + 0x63F6,0x63C4,0x6416,0x6434,0x6406,0x6413,0x6426,0x6436, + 0x651D,0x6417,0x6428,0x640F,0x6467,0x646F,0x6476,0x644E, + 0x652A,0x6495,0x6493,0x64A5,0x64A9,0x6488,0x64BC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x64DA,0x64D2,0x64C5,0x64C7,0x64BB,0x64D8,0x64C2, + 0x64F1,0x64E7,0x8209,0x64E0,0x64E1,0x62AC,0x64E3,0x64EF, + 0x652C,0x64F6,0x64F4,0x64F2,0x64FA,0x6500,0x64FD,0x6518, + 0x651C,0x6505,0x6524,0x6523,0x652B,0x6534,0x6535,0x6537, + 0x6536,0x6538,0x754B,0x6548,0x6556,0x6555,0x654D,0x6558, + 0x655E,0x655D,0x6572,0x6578,0x6582,0x6583,0x8B8A,0x659B, + 0x659F,0x65AB,0x65B7,0x65C3,0x65C6,0x65C1,0x65C4,0x65CC, + 0x65D2,0x65DB,0x65D9,0x65E0,0x65E1,0x65F1,0x6772,0x660A, + 0x6603,0x65FB,0x6773,0x6635,0x6636,0x6634,0x661C,0x664F, + 0x6644,0x6649,0x6641,0x665E,0x665D,0x6664,0x6667,0x6668, + 0x665F,0x6662,0x6670,0x6683,0x6688,0x668E,0x6689,0x6684, + 0x6698,0x669D,0x66C1,0x66B9,0x66C9,0x66BE,0x66BC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x66C4,0x66B8,0x66D6,0x66DA,0x66E0,0x663F,0x66E6, + 0x66E9,0x66F0,0x66F5,0x66F7,0x670F,0x6716,0x671E,0x6726, + 0x6727,0x9738,0x672E,0x673F,0x6736,0x6741,0x6738,0x6737, + 0x6746,0x675E,0x6760,0x6759,0x6763,0x6764,0x6789,0x6770, + 0x67A9,0x677C,0x676A,0x678C,0x678B,0x67A6,0x67A1,0x6785, + 0x67B7,0x67EF,0x67B4,0x67EC,0x67B3,0x67E9,0x67B8,0x67E4, + 0x67DE,0x67DD,0x67E2,0x67EE,0x67B9,0x67CE,0x67C6,0x67E7, + 0x6A9C,0x681E,0x6846,0x6829,0x6840,0x684D,0x6832,0x684E, + 0x68B3,0x682B,0x6859,0x6863,0x6877,0x687F,0x689F,0x688F, + 0x68AD,0x6894,0x689D,0x689B,0x6883,0x6AAE,0x68B9,0x6874, + 0x68B5,0x68A0,0x68BA,0x690F,0x688D,0x687E,0x6901,0x68CA, + 0x6908,0x68D8,0x6922,0x6926,0x68E1,0x690C,0x68CD,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x68D4,0x68E7,0x68D5,0x6936,0x6912,0x6904,0x68D7, + 0x68E3,0x6925,0x68F9,0x68E0,0x68EF,0x6928,0x692A,0x691A, + 0x6923,0x6921,0x68C6,0x6979,0x6977,0x695C,0x6978,0x696B, + 0x6954,0x697E,0x696E,0x6939,0x6974,0x693D,0x6959,0x6930, + 0x6961,0x695E,0x695D,0x6981,0x696A,0x69B2,0x69AE,0x69D0, + 0x69BF,0x69C1,0x69D3,0x69BE,0x69CE,0x5BE8,0x69CA,0x69DD, + 0x69BB,0x69C3,0x69A7,0x6A2E,0x6991,0x69A0,0x699C,0x6995, + 0x69B4,0x69DE,0x69E8,0x6A02,0x6A1B,0x69FF,0x6B0A,0x69F9, + 0x69F2,0x69E7,0x6A05,0x69B1,0x6A1E,0x69ED,0x6A14,0x69EB, + 0x6A0A,0x6A12,0x6AC1,0x6A23,0x6A13,0x6A44,0x6A0C,0x6A72, + 0x6A36,0x6A78,0x6A47,0x6A62,0x6A59,0x6A66,0x6A48,0x6A38, + 0x6A22,0x6A90,0x6A8D,0x6AA0,0x6A84,0x6AA2,0x6AA3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A97,0x8617,0x6ABB,0x6AC3,0x6AC2,0x6AB8,0x6AB3, + 0x6AAC,0x6ADE,0x6AD1,0x6ADF,0x6AAA,0x6ADA,0x6AEA,0x6AFB, + 0x6B05,0x8616,0x6AFA,0x6B12,0x6B16,0x9B31,0x6B1F,0x6B38, + 0x6B37,0x76DC,0x6B39,0x98EE,0x6B47,0x6B43,0x6B49,0x6B50, + 0x6B59,0x6B54,0x6B5B,0x6B5F,0x6B61,0x6B78,0x6B79,0x6B7F, + 0x6B80,0x6B84,0x6B83,0x6B8D,0x6B98,0x6B95,0x6B9E,0x6BA4, + 0x6BAA,0x6BAB,0x6BAF,0x6BB2,0x6BB1,0x6BB3,0x6BB7,0x6BBC, + 0x6BC6,0x6BCB,0x6BD3,0x6BDF,0x6BEC,0x6BEB,0x6BF3,0x6BEF, + 0x9EBE,0x6C08,0x6C13,0x6C14,0x6C1B,0x6C24,0x6C23,0x6C5E, + 0x6C55,0x6C62,0x6C6A,0x6C82,0x6C8D,0x6C9A,0x6C81,0x6C9B, + 0x6C7E,0x6C68,0x6C73,0x6C92,0x6C90,0x6CC4,0x6CF1,0x6CD3, + 0x6CBD,0x6CD7,0x6CC5,0x6CDD,0x6CAE,0x6CB1,0x6CBE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6CBA,0x6CDB,0x6CEF,0x6CD9,0x6CEA,0x6D1F,0x884D, + 0x6D36,0x6D2B,0x6D3D,0x6D38,0x6D19,0x6D35,0x6D33,0x6D12, + 0x6D0C,0x6D63,0x6D93,0x6D64,0x6D5A,0x6D79,0x6D59,0x6D8E, + 0x6D95,0x6FE4,0x6D85,0x6DF9,0x6E15,0x6E0A,0x6DB5,0x6DC7, + 0x6DE6,0x6DB8,0x6DC6,0x6DEC,0x6DDE,0x6DCC,0x6DE8,0x6DD2, + 0x6DC5,0x6DFA,0x6DD9,0x6DE4,0x6DD5,0x6DEA,0x6DEE,0x6E2D, + 0x6E6E,0x6E2E,0x6E19,0x6E72,0x6E5F,0x6E3E,0x6E23,0x6E6B, + 0x6E2B,0x6E76,0x6E4D,0x6E1F,0x6E43,0x6E3A,0x6E4E,0x6E24, + 0x6EFF,0x6E1D,0x6E38,0x6E82,0x6EAA,0x6E98,0x6EC9,0x6EB7, + 0x6ED3,0x6EBD,0x6EAF,0x6EC4,0x6EB2,0x6ED4,0x6ED5,0x6E8F, + 0x6EA5,0x6EC2,0x6E9F,0x6F41,0x6F11,0x704C,0x6EEC,0x6EF8, + 0x6EFE,0x6F3F,0x6EF2,0x6F31,0x6EEF,0x6F32,0x6ECC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F3E,0x6F13,0x6EF7,0x6F86,0x6F7A,0x6F78,0x6F81, + 0x6F80,0x6F6F,0x6F5B,0x6FF3,0x6F6D,0x6F82,0x6F7C,0x6F58, + 0x6F8E,0x6F91,0x6FC2,0x6F66,0x6FB3,0x6FA3,0x6FA1,0x6FA4, + 0x6FB9,0x6FC6,0x6FAA,0x6FDF,0x6FD5,0x6FEC,0x6FD4,0x6FD8, + 0x6FF1,0x6FEE,0x6FDB,0x7009,0x700B,0x6FFA,0x7011,0x7001, + 0x700F,0x6FFE,0x701B,0x701A,0x6F74,0x701D,0x7018,0x701F, + 0x7030,0x703E,0x7032,0x7051,0x7063,0x7099,0x7092,0x70AF, + 0x70F1,0x70AC,0x70B8,0x70B3,0x70AE,0x70DF,0x70CB,0x70DD, + 0x70D9,0x7109,0x70FD,0x711C,0x7119,0x7165,0x7155,0x7188, + 0x7166,0x7162,0x714C,0x7156,0x716C,0x718F,0x71FB,0x7184, + 0x7195,0x71A8,0x71AC,0x71D7,0x71B9,0x71BE,0x71D2,0x71C9, + 0x71D4,0x71CE,0x71E0,0x71EC,0x71E7,0x71F5,0x71FC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x71F9,0x71FF,0x720D,0x7210,0x721B,0x7228,0x722D, + 0x722C,0x7230,0x7232,0x723B,0x723C,0x723F,0x7240,0x7246, + 0x724B,0x7258,0x7274,0x727E,0x7282,0x7281,0x7287,0x7292, + 0x7296,0x72A2,0x72A7,0x72B9,0x72B2,0x72C3,0x72C6,0x72C4, + 0x72CE,0x72D2,0x72E2,0x72E0,0x72E1,0x72F9,0x72F7,0x500F, + 0x7317,0x730A,0x731C,0x7316,0x731D,0x7334,0x732F,0x7329, + 0x7325,0x733E,0x734E,0x734F,0x9ED8,0x7357,0x736A,0x7368, + 0x7370,0x7378,0x7375,0x737B,0x737A,0x73C8,0x73B3,0x73CE, + 0x73BB,0x73C0,0x73E5,0x73EE,0x73DE,0x74A2,0x7405,0x746F, + 0x7425,0x73F8,0x7432,0x743A,0x7455,0x743F,0x745F,0x7459, + 0x7441,0x745C,0x7469,0x7470,0x7463,0x746A,0x7476,0x747E, + 0x748B,0x749E,0x74A7,0x74CA,0x74CF,0x74D4,0x73F1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x74E0,0x74E3,0x74E7,0x74E9,0x74EE,0x74F2,0x74F0, + 0x74F1,0x74F8,0x74F7,0x7504,0x7503,0x7505,0x750C,0x750E, + 0x750D,0x7515,0x7513,0x751E,0x7526,0x752C,0x753C,0x7544, + 0x754D,0x754A,0x7549,0x755B,0x7546,0x755A,0x7569,0x7564, + 0x7567,0x756B,0x756D,0x7578,0x7576,0x7586,0x7587,0x7574, + 0x758A,0x7589,0x7582,0x7594,0x759A,0x759D,0x75A5,0x75A3, + 0x75C2,0x75B3,0x75C3,0x75B5,0x75BD,0x75B8,0x75BC,0x75B1, + 0x75CD,0x75CA,0x75D2,0x75D9,0x75E3,0x75DE,0x75FE,0x75FF, + 0x75FC,0x7601,0x75F0,0x75FA,0x75F2,0x75F3,0x760B,0x760D, + 0x7609,0x761F,0x7627,0x7620,0x7621,0x7622,0x7624,0x7634, + 0x7630,0x763B,0x7647,0x7648,0x7646,0x765C,0x7658,0x7661, + 0x7662,0x7668,0x7669,0x766A,0x7667,0x766C,0x7670,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7672,0x7676,0x7678,0x767C,0x7680,0x7683,0x7688, + 0x768B,0x768E,0x7696,0x7693,0x7699,0x769A,0x76B0,0x76B4, + 0x76B8,0x76B9,0x76BA,0x76C2,0x76CD,0x76D6,0x76D2,0x76DE, + 0x76E1,0x76E5,0x76E7,0x76EA,0x862F,0x76FB,0x7708,0x7707, + 0x7704,0x7729,0x7724,0x771E,0x7725,0x7726,0x771B,0x7737, + 0x7738,0x7747,0x775A,0x7768,0x776B,0x775B,0x7765,0x777F, + 0x777E,0x7779,0x778E,0x778B,0x7791,0x77A0,0x779E,0x77B0, + 0x77B6,0x77B9,0x77BF,0x77BC,0x77BD,0x77BB,0x77C7,0x77CD, + 0x77D7,0x77DA,0x77DC,0x77E3,0x77EE,0x77FC,0x780C,0x7812, + 0x7926,0x7820,0x792A,0x7845,0x788E,0x7874,0x7886,0x787C, + 0x789A,0x788C,0x78A3,0x78B5,0x78AA,0x78AF,0x78D1,0x78C6, + 0x78CB,0x78D4,0x78BE,0x78BC,0x78C5,0x78CA,0x78EC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x78E7,0x78DA,0x78FD,0x78F4,0x7907,0x7912,0x7911, + 0x7919,0x792C,0x792B,0x7940,0x7960,0x7957,0x795F,0x795A, + 0x7955,0x7953,0x797A,0x797F,0x798A,0x799D,0x79A7,0x9F4B, + 0x79AA,0x79AE,0x79B3,0x79B9,0x79BA,0x79C9,0x79D5,0x79E7, + 0x79EC,0x79E1,0x79E3,0x7A08,0x7A0D,0x7A18,0x7A19,0x7A20, + 0x7A1F,0x7980,0x7A31,0x7A3B,0x7A3E,0x7A37,0x7A43,0x7A57, + 0x7A49,0x7A61,0x7A62,0x7A69,0x9F9D,0x7A70,0x7A79,0x7A7D, + 0x7A88,0x7A97,0x7A95,0x7A98,0x7A96,0x7AA9,0x7AC8,0x7AB0, + 0x7AB6,0x7AC5,0x7AC4,0x7ABF,0x9083,0x7AC7,0x7ACA,0x7ACD, + 0x7ACF,0x7AD5,0x7AD3,0x7AD9,0x7ADA,0x7ADD,0x7AE1,0x7AE2, + 0x7AE6,0x7AED,0x7AF0,0x7B02,0x7B0F,0x7B0A,0x7B06,0x7B33, + 0x7B18,0x7B19,0x7B1E,0x7B35,0x7B28,0x7B36,0x7B50,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B7A,0x7B04,0x7B4D,0x7B0B,0x7B4C,0x7B45,0x7B75, + 0x7B65,0x7B74,0x7B67,0x7B70,0x7B71,0x7B6C,0x7B6E,0x7B9D, + 0x7B98,0x7B9F,0x7B8D,0x7B9C,0x7B9A,0x7B8B,0x7B92,0x7B8F, + 0x7B5D,0x7B99,0x7BCB,0x7BC1,0x7BCC,0x7BCF,0x7BB4,0x7BC6, + 0x7BDD,0x7BE9,0x7C11,0x7C14,0x7BE6,0x7BE5,0x7C60,0x7C00, + 0x7C07,0x7C13,0x7BF3,0x7BF7,0x7C17,0x7C0D,0x7BF6,0x7C23, + 0x7C27,0x7C2A,0x7C1F,0x7C37,0x7C2B,0x7C3D,0x7C4C,0x7C43, + 0x7C54,0x7C4F,0x7C40,0x7C50,0x7C58,0x7C5F,0x7C64,0x7C56, + 0x7C65,0x7C6C,0x7C75,0x7C83,0x7C90,0x7CA4,0x7CAD,0x7CA2, + 0x7CAB,0x7CA1,0x7CA8,0x7CB3,0x7CB2,0x7CB1,0x7CAE,0x7CB9, + 0x7CBD,0x7CC0,0x7CC5,0x7CC2,0x7CD8,0x7CD2,0x7CDC,0x7CE2, + 0x9B3B,0x7CEF,0x7CF2,0x7CF4,0x7CF6,0x7CFA,0x7D06,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D02,0x7D1C,0x7D15,0x7D0A,0x7D45,0x7D4B,0x7D2E, + 0x7D32,0x7D3F,0x7D35,0x7D46,0x7D73,0x7D56,0x7D4E,0x7D72, + 0x7D68,0x7D6E,0x7D4F,0x7D63,0x7D93,0x7D89,0x7D5B,0x7D8F, + 0x7D7D,0x7D9B,0x7DBA,0x7DAE,0x7DA3,0x7DB5,0x7DC7,0x7DBD, + 0x7DAB,0x7E3D,0x7DA2,0x7DAF,0x7DDC,0x7DB8,0x7D9F,0x7DB0, + 0x7DD8,0x7DDD,0x7DE4,0x7DDE,0x7DFB,0x7DF2,0x7DE1,0x7E05, + 0x7E0A,0x7E23,0x7E21,0x7E12,0x7E31,0x7E1F,0x7E09,0x7E0B, + 0x7E22,0x7E46,0x7E66,0x7E3B,0x7E35,0x7E39,0x7E43,0x7E37, + 0x7E32,0x7E3A,0x7E67,0x7E5D,0x7E56,0x7E5E,0x7E59,0x7E5A, + 0x7E79,0x7E6A,0x7E69,0x7E7C,0x7E7B,0x7E83,0x7DD5,0x7E7D, + 0x8FAE,0x7E7F,0x7E88,0x7E89,0x7E8C,0x7E92,0x7E90,0x7E93, + 0x7E94,0x7E96,0x7E8E,0x7E9B,0x7E9C,0x7F38,0x7F3A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7F45,0x7F4C,0x7F4D,0x7F4E,0x7F50,0x7F51,0x7F55, + 0x7F54,0x7F58,0x7F5F,0x7F60,0x7F68,0x7F69,0x7F67,0x7F78, + 0x7F82,0x7F86,0x7F83,0x7F88,0x7F87,0x7F8C,0x7F94,0x7F9E, + 0x7F9D,0x7F9A,0x7FA3,0x7FAF,0x7FB2,0x7FB9,0x7FAE,0x7FB6, + 0x7FB8,0x8B71,0x7FC5,0x7FC6,0x7FCA,0x7FD5,0x7FD4,0x7FE1, + 0x7FE6,0x7FE9,0x7FF3,0x7FF9,0x98DC,0x8006,0x8004,0x800B, + 0x8012,0x8018,0x8019,0x801C,0x8021,0x8028,0x803F,0x803B, + 0x804A,0x8046,0x8052,0x8058,0x805A,0x805F,0x8062,0x8068, + 0x8073,0x8072,0x8070,0x8076,0x8079,0x807D,0x807F,0x8084, + 0x8086,0x8085,0x809B,0x8093,0x809A,0x80AD,0x5190,0x80AC, + 0x80DB,0x80E5,0x80D9,0x80DD,0x80C4,0x80DA,0x80D6,0x8109, + 0x80EF,0x80F1,0x811B,0x8129,0x8123,0x812F,0x814B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x968B,0x8146,0x813E,0x8153,0x8151,0x80FC,0x8171, + 0x816E,0x8165,0x8166,0x8174,0x8183,0x8188,0x818A,0x8180, + 0x8182,0x81A0,0x8195,0x81A4,0x81A3,0x815F,0x8193,0x81A9, + 0x81B0,0x81B5,0x81BE,0x81B8,0x81BD,0x81C0,0x81C2,0x81BA, + 0x81C9,0x81CD,0x81D1,0x81D9,0x81D8,0x81C8,0x81DA,0x81DF, + 0x81E0,0x81E7,0x81FA,0x81FB,0x81FE,0x8201,0x8202,0x8205, + 0x8207,0x820A,0x820D,0x8210,0x8216,0x8229,0x822B,0x8238, + 0x8233,0x8240,0x8259,0x8258,0x825D,0x825A,0x825F,0x8264, + 0x8262,0x8268,0x826A,0x826B,0x822E,0x8271,0x8277,0x8278, + 0x827E,0x828D,0x8292,0x82AB,0x829F,0x82BB,0x82AC,0x82E1, + 0x82E3,0x82DF,0x82D2,0x82F4,0x82F3,0x82FA,0x8393,0x8303, + 0x82FB,0x82F9,0x82DE,0x8306,0x82DC,0x8309,0x82D9,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,0x8339, + 0x8350,0x8345,0x832F,0x832B,0x8317,0x8318,0x8385,0x839A, + 0x83AA,0x839F,0x83A2,0x8396,0x8323,0x838E,0x8387,0x838A, + 0x837C,0x83B5,0x8373,0x8375,0x83A0,0x8389,0x83A8,0x83F4, + 0x8413,0x83EB,0x83CE,0x83FD,0x8403,0x83D8,0x840B,0x83C1, + 0x83F7,0x8407,0x83E0,0x83F2,0x840D,0x8422,0x8420,0x83BD, + 0x8438,0x8506,0x83FB,0x846D,0x842A,0x843C,0x855A,0x8484, + 0x8477,0x846B,0x84AD,0x846E,0x8482,0x8469,0x8446,0x842C, + 0x846F,0x8479,0x8435,0x84CA,0x8462,0x84B9,0x84BF,0x849F, + 0x84D9,0x84CD,0x84BB,0x84DA,0x84D0,0x84C1,0x84C6,0x84D6, + 0x84A1,0x8521,0x84FF,0x84F4,0x8517,0x8518,0x852C,0x851F, + 0x8515,0x8514,0x84FC,0x8540,0x8563,0x8558,0x8548,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8541,0x8602,0x854B,0x8555,0x8580,0x85A4,0x8588, + 0x8591,0x858A,0x85A8,0x856D,0x8594,0x859B,0x85EA,0x8587, + 0x859C,0x8577,0x857E,0x8590,0x85C9,0x85BA,0x85CF,0x85B9, + 0x85D0,0x85D5,0x85DD,0x85E5,0x85DC,0x85F9,0x860A,0x8613, + 0x860B,0x85FE,0x85FA,0x8606,0x8622,0x861A,0x8630,0x863F, + 0x864D,0x4E55,0x8654,0x865F,0x8667,0x8671,0x8693,0x86A3, + 0x86A9,0x86AA,0x868B,0x868C,0x86B6,0x86AF,0x86C4,0x86C6, + 0x86B0,0x86C9,0x8823,0x86AB,0x86D4,0x86DE,0x86E9,0x86EC, + 0x86DF,0x86DB,0x86EF,0x8712,0x8706,0x8708,0x8700,0x8703, + 0x86FB,0x8711,0x8709,0x870D,0x86F9,0x870A,0x8734,0x873F, + 0x8737,0x873B,0x8725,0x8729,0x871A,0x8760,0x875F,0x8778, + 0x874C,0x874E,0x8774,0x8757,0x8768,0x876E,0x8759,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 107, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8753,0x8763,0x876A,0x8805,0x87A2,0x879F,0x8782, + 0x87AF,0x87CB,0x87BD,0x87C0,0x87D0,0x96D6,0x87AB,0x87C4, + 0x87B3,0x87C7,0x87C6,0x87BB,0x87EF,0x87F2,0x87E0,0x880F, + 0x880D,0x87FE,0x87F6,0x87F7,0x880E,0x87D2,0x8811,0x8816, + 0x8815,0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,0x883B, + 0x8844,0x8842,0x8852,0x8859,0x885E,0x8862,0x886B,0x8881, + 0x887E,0x889E,0x8875,0x887D,0x88B5,0x8872,0x8882,0x8897, + 0x8892,0x88AE,0x8899,0x88A2,0x888D,0x88A4,0x88B0,0x88BF, + 0x88B1,0x88C3,0x88C4,0x88D4,0x88D8,0x88D9,0x88DD,0x88F9, + 0x8902,0x88FC,0x88F4,0x88E8,0x88F2,0x8904,0x890C,0x890A, + 0x8913,0x8943,0x891E,0x8925,0x892A,0x892B,0x8941,0x8944, + 0x893B,0x8936,0x8938,0x894C,0x891D,0x8960,0x895E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8966,0x8964,0x896D,0x896A,0x896F,0x8974,0x8977, + 0x897E,0x8983,0x8988,0x898A,0x8993,0x8998,0x89A1,0x89A9, + 0x89A6,0x89AC,0x89AF,0x89B2,0x89BA,0x89BD,0x89BF,0x89C0, + 0x89DA,0x89DC,0x89DD,0x89E7,0x89F4,0x89F8,0x8A03,0x8A16, + 0x8A10,0x8A0C,0x8A1B,0x8A1D,0x8A25,0x8A36,0x8A41,0x8A5B, + 0x8A52,0x8A46,0x8A48,0x8A7C,0x8A6D,0x8A6C,0x8A62,0x8A85, + 0x8A82,0x8A84,0x8AA8,0x8AA1,0x8A91,0x8AA5,0x8AA6,0x8A9A, + 0x8AA3,0x8AC4,0x8ACD,0x8AC2,0x8ADA,0x8AEB,0x8AF3,0x8AE7, + 0x8AE4,0x8AF1,0x8B14,0x8AE0,0x8AE2,0x8AF7,0x8ADE,0x8ADB, + 0x8B0C,0x8B07,0x8B1A,0x8AE1,0x8B16,0x8B10,0x8B17,0x8B20, + 0x8B33,0x97AB,0x8B26,0x8B2B,0x8B3E,0x8B28,0x8B41,0x8B4C, + 0x8B4F,0x8B4E,0x8B49,0x8B56,0x8B5B,0x8B5A,0x8B6B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8B5F,0x8B6C,0x8B6F,0x8B74,0x8B7D,0x8B80,0x8B8C, + 0x8B8E,0x8B92,0x8B93,0x8B96,0x8B99,0x8B9A,0x8C3A,0x8C41, + 0x8C3F,0x8C48,0x8C4C,0x8C4E,0x8C50,0x8C55,0x8C62,0x8C6C, + 0x8C78,0x8C7A,0x8C82,0x8C89,0x8C85,0x8C8A,0x8C8D,0x8C8E, + 0x8C94,0x8C7C,0x8C98,0x621D,0x8CAD,0x8CAA,0x8CBD,0x8CB2, + 0x8CB3,0x8CAE,0x8CB6,0x8CC8,0x8CC1,0x8CE4,0x8CE3,0x8CDA, + 0x8CFD,0x8CFA,0x8CFB,0x8D04,0x8D05,0x8D0A,0x8D07,0x8D0F, + 0x8D0D,0x8D10,0x9F4E,0x8D13,0x8CCD,0x8D14,0x8D16,0x8D67, + 0x8D6D,0x8D71,0x8D73,0x8D81,0x8D99,0x8DC2,0x8DBE,0x8DBA, + 0x8DCF,0x8DDA,0x8DD6,0x8DCC,0x8DDB,0x8DCB,0x8DEA,0x8DEB, + 0x8DDF,0x8DE3,0x8DFC,0x8E08,0x8E09,0x8DFF,0x8E1D,0x8E1E, + 0x8E10,0x8E1F,0x8E42,0x8E35,0x8E30,0x8E34,0x8E4A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x4600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8E47,0x8E49,0x8E4C,0x8E50,0x8E48,0x8E59,0x8E64, + 0x8E60,0x8E2A,0x8E63,0x8E55,0x8E76,0x8E72,0x8E7C,0x8E81, + 0x8E87,0x8E85,0x8E84,0x8E8B,0x8E8A,0x8E93,0x8E91,0x8E94, + 0x8E99,0x8EAA,0x8EA1,0x8EAC,0x8EB0,0x8EC6,0x8EB1,0x8EBE, + 0x8EC5,0x8EC8,0x8ECB,0x8EDB,0x8EE3,0x8EFC,0x8EFB,0x8EEB, + 0x8EFE,0x8F0A,0x8F05,0x8F15,0x8F12,0x8F19,0x8F13,0x8F1C, + 0x8F1F,0x8F1B,0x8F0C,0x8F26,0x8F33,0x8F3B,0x8F39,0x8F45, + 0x8F42,0x8F3E,0x8F4C,0x8F49,0x8F46,0x8F4E,0x8F57,0x8F5C, + 0x8F62,0x8F63,0x8F64,0x8F9C,0x8F9F,0x8FA3,0x8FAD,0x8FAF, + 0x8FB7,0x8FDA,0x8FE5,0x8FE2,0x8FEA,0x8FEF,0x9087,0x8FF4, + 0x9005,0x8FF9,0x8FFA,0x9011,0x9015,0x9021,0x900D,0x901E, + 0x9016,0x900B,0x9027,0x9036,0x9035,0x9039,0x8FF8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x4700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x904F,0x9050,0x9051,0x9052,0x900E,0x9049,0x903E, + 0x9056,0x9058,0x905E,0x9068,0x906F,0x9076,0x96A8,0x9072, + 0x9082,0x907D,0x9081,0x9080,0x908A,0x9089,0x908F,0x90A8, + 0x90AF,0x90B1,0x90B5,0x90E2,0x90E4,0x6248,0x90DB,0x9102, + 0x9112,0x9119,0x9132,0x9130,0x914A,0x9156,0x9158,0x9163, + 0x9165,0x9169,0x9173,0x9172,0x918B,0x9189,0x9182,0x91A2, + 0x91AB,0x91AF,0x91AA,0x91B5,0x91B4,0x91BA,0x91C0,0x91C1, + 0x91C9,0x91CB,0x91D0,0x91D6,0x91DF,0x91E1,0x91DB,0x91FC, + 0x91F5,0x91F6,0x921E,0x91FF,0x9214,0x922C,0x9215,0x9211, + 0x925E,0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923F, + 0x924B,0x9250,0x929C,0x9296,0x9293,0x929B,0x925A,0x92CF, + 0x92B9,0x92B7,0x92E9,0x930F,0x92FA,0x9344,0x932E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 112, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9319,0x9322,0x931A,0x9323,0x933A,0x9335,0x933B, + 0x935C,0x9360,0x937C,0x936E,0x9356,0x93B0,0x93AC,0x93AD, + 0x9394,0x93B9,0x93D6,0x93D7,0x93E8,0x93E5,0x93D8,0x93C3, + 0x93DD,0x93D0,0x93C8,0x93E4,0x941A,0x9414,0x9413,0x9403, + 0x9407,0x9410,0x9436,0x942B,0x9435,0x9421,0x943A,0x9441, + 0x9452,0x9444,0x945B,0x9460,0x9462,0x945E,0x946A,0x9229, + 0x9470,0x9475,0x9477,0x947D,0x945A,0x947C,0x947E,0x9481, + 0x947F,0x9582,0x9587,0x958A,0x9594,0x9596,0x9598,0x9599, + 0x95A0,0x95A8,0x95A7,0x95AD,0x95BC,0x95BB,0x95B9,0x95BE, + 0x95CA,0x6FF6,0x95C3,0x95CD,0x95CC,0x95D5,0x95D4,0x95D6, + 0x95DC,0x95E1,0x95E5,0x95E2,0x9621,0x9628,0x962E,0x962F, + 0x9642,0x964C,0x964F,0x964B,0x9677,0x965C,0x965E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 113, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x965D,0x965F,0x9666,0x9672,0x966C,0x968D,0x9698, + 0x9695,0x9697,0x96AA,0x96A7,0x96B1,0x96B2,0x96B0,0x96B4, + 0x96B6,0x96B8,0x96B9,0x96CE,0x96CB,0x96C9,0x96CD,0x894D, + 0x96DC,0x970D,0x96D5,0x96F9,0x9704,0x9706,0x9708,0x9713, + 0x970E,0x9711,0x970F,0x9716,0x9719,0x9724,0x972A,0x9730, + 0x9739,0x973D,0x973E,0x9744,0x9746,0x9748,0x9742,0x9749, + 0x975C,0x9760,0x9764,0x9766,0x9768,0x52D2,0x976B,0x9771, + 0x9779,0x9785,0x977C,0x9781,0x977A,0x9786,0x978B,0x978F, + 0x9790,0x979C,0x97A8,0x97A6,0x97A3,0x97B3,0x97B4,0x97C3, + 0x97C6,0x97C8,0x97CB,0x97DC,0x97ED,0x9F4F,0x97F2,0x7ADF, + 0x97F6,0x97F5,0x980F,0x980C,0x9838,0x9824,0x9821,0x9837, + 0x983D,0x9846,0x984F,0x984B,0x986B,0x986F,0x9870,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 114, Array index 0x4A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9871,0x9874,0x9873,0x98AA,0x98AF,0x98B1,0x98B6, + 0x98C4,0x98C3,0x98C6,0x98E9,0x98EB,0x9903,0x9909,0x9912, + 0x9914,0x9918,0x9921,0x991D,0x991E,0x9924,0x9920,0x992C, + 0x992E,0x993D,0x993E,0x9942,0x9949,0x9945,0x9950,0x994B, + 0x9951,0x9952,0x994C,0x9955,0x9997,0x9998,0x99A5,0x99AD, + 0x99AE,0x99BC,0x99DF,0x99DB,0x99DD,0x99D8,0x99D1,0x99ED, + 0x99EE,0x99F1,0x99F2,0x99FB,0x99F8,0x9A01,0x9A0F,0x9A05, + 0x99E2,0x9A19,0x9A2B,0x9A37,0x9A45,0x9A42,0x9A40,0x9A43, + 0x9A3E,0x9A55,0x9A4D,0x9A5B,0x9A57,0x9A5F,0x9A62,0x9A65, + 0x9A64,0x9A69,0x9A6B,0x9A6A,0x9AAD,0x9AB0,0x9ABC,0x9AC0, + 0x9ACF,0x9AD1,0x9AD3,0x9AD4,0x9ADE,0x9ADF,0x9AE2,0x9AE3, + 0x9AE6,0x9AEF,0x9AEB,0x9AEE,0x9AF4,0x9AF1,0x9AF7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 115, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9AFB,0x9B06,0x9B18,0x9B1A,0x9B1F,0x9B22,0x9B23, + 0x9B25,0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2E,0x9B2F,0x9B32, + 0x9B44,0x9B43,0x9B4F,0x9B4D,0x9B4E,0x9B51,0x9B58,0x9B74, + 0x9B93,0x9B83,0x9B91,0x9B96,0x9B97,0x9B9F,0x9BA0,0x9BA8, + 0x9BB4,0x9BC0,0x9BCA,0x9BB9,0x9BC6,0x9BCF,0x9BD1,0x9BD2, + 0x9BE3,0x9BE2,0x9BE4,0x9BD4,0x9BE1,0x9C3A,0x9BF2,0x9BF1, + 0x9BF0,0x9C15,0x9C14,0x9C09,0x9C13,0x9C0C,0x9C06,0x9C08, + 0x9C12,0x9C0A,0x9C04,0x9C2E,0x9C1B,0x9C25,0x9C24,0x9C21, + 0x9C30,0x9C47,0x9C32,0x9C46,0x9C3E,0x9C5A,0x9C60,0x9C67, + 0x9C76,0x9C78,0x9CE7,0x9CEC,0x9CF0,0x9D09,0x9D08,0x9CEB, + 0x9D03,0x9D06,0x9D2A,0x9D26,0x9DAF,0x9D23,0x9D1F,0x9D44, + 0x9D15,0x9D12,0x9D41,0x9D3F,0x9D3E,0x9D46,0x9D48,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 116, Array index 0x4C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9D5D,0x9D5E,0x9D64,0x9D51,0x9D50,0x9D59,0x9D72, + 0x9D89,0x9D87,0x9DAB,0x9D6F,0x9D7A,0x9D9A,0x9DA4,0x9DA9, + 0x9DB2,0x9DC4,0x9DC1,0x9DBB,0x9DB8,0x9DBA,0x9DC6,0x9DCF, + 0x9DC2,0x9DD9,0x9DD3,0x9DF8,0x9DE6,0x9DED,0x9DEF,0x9DFD, + 0x9E1A,0x9E1B,0x9E1E,0x9E75,0x9E79,0x9E7D,0x9E81,0x9E88, + 0x9E8B,0x9E8C,0x9E92,0x9E95,0x9E91,0x9E9D,0x9EA5,0x9EA9, + 0x9EB8,0x9EAA,0x9EAD,0x9761,0x9ECC,0x9ECE,0x9ECF,0x9ED0, + 0x9ED4,0x9EDC,0x9EDE,0x9EDD,0x9EE0,0x9EE5,0x9EE8,0x9EEF, + 0x9EF4,0x9EF6,0x9EF7,0x9EF9,0x9EFB,0x9EFC,0x9EFD,0x9F07, + 0x9F08,0x76B7,0x9F15,0x9F21,0x9F2C,0x9F3E,0x9F4A,0x9F52, + 0x9F54,0x9F63,0x9F5F,0x9F60,0x9F61,0x9F66,0x9F67,0x9F6C, + 0x9F6A,0x9F77,0x9F72,0x9F76,0x9F95,0x9F9C,0x9FA0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 117, Array index 0x4D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x582F,0x69C7,0x9059,0x7464,0x51DC,0x7199,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0208_1990 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit jis_x0208_1990 -> UCS size-optimized table (14276 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_jis_x0208_1990[] = +{ + 0x0055, /* Ranges number */ + 0x0001, /* Unranged codes number */ + 0x1BE0, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x2121, 0x217E, 0x0102, + /* Array index: 0x0006 */ 0x2221, 0x222E, 0x0160, + /* Array index: 0x0009 */ 0x223A, 0x2241, 0x016E, + /* Array index: 0x000C */ 0x224A, 0x2250, 0x0176, + /* Array index: 0x000F */ 0x225C, 0x226A, 0x017D, + /* Array index: 0x0012 */ 0x2272, 0x2279, 0x018C, + /* Array index: 0x0015 */ 0x2330, 0x2339, 0x0194, + /* Array index: 0x0018 */ 0x2341, 0x235A, 0x019E, + /* Array index: 0x001B */ 0x2361, 0x237A, 0x01B8, + /* Array index: 0x001E */ 0x2421, 0x2473, 0x01D2, + /* Array index: 0x0021 */ 0x2521, 0x2576, 0x0225, + /* Array index: 0x0024 */ 0x2621, 0x2638, 0x027B, + /* Array index: 0x0027 */ 0x2641, 0x2658, 0x0293, + /* Array index: 0x002A */ 0x2721, 0x2741, 0x02AB, + /* Array index: 0x002D */ 0x2751, 0x2771, 0x02CC, + /* Array index: 0x0030 */ 0x2821, 0x2840, 0x02ED, + /* Array index: 0x0033 */ 0x3021, 0x307E, 0x030D, + /* Array index: 0x0036 */ 0x3121, 0x317E, 0x036B, + /* Array index: 0x0039 */ 0x3221, 0x327E, 0x03C9, + /* Array index: 0x003C */ 0x3321, 0x337E, 0x0427, + /* Array index: 0x003F */ 0x3421, 0x347E, 0x0485, + /* Array index: 0x0042 */ 0x3521, 0x357E, 0x04E3, + /* Array index: 0x0045 */ 0x3621, 0x367E, 0x0541, + /* Array index: 0x0048 */ 0x3721, 0x377E, 0x059F, + /* Array index: 0x004B */ 0x3821, 0x387E, 0x05FD, + /* Array index: 0x004E */ 0x3921, 0x397E, 0x065B, + /* Array index: 0x0051 */ 0x3A21, 0x3A7E, 0x06B9, + /* Array index: 0x0054 */ 0x3B21, 0x3B7E, 0x0717, + /* Array index: 0x0057 */ 0x3C21, 0x3C7E, 0x0775, + /* Array index: 0x005A */ 0x3D21, 0x3D7E, 0x07D3, + /* Array index: 0x005D */ 0x3E21, 0x3E7E, 0x0831, + /* Array index: 0x0060 */ 0x3F21, 0x3F7E, 0x088F, + /* Array index: 0x0063 */ 0x4021, 0x407E, 0x08ED, + /* Array index: 0x0066 */ 0x4121, 0x417E, 0x094B, + /* Array index: 0x0069 */ 0x4221, 0x427E, 0x09A9, + /* Array index: 0x006C */ 0x4321, 0x437E, 0x0A07, + /* Array index: 0x006F */ 0x4421, 0x447E, 0x0A65, + /* Array index: 0x0072 */ 0x4521, 0x457E, 0x0AC3, + /* Array index: 0x0075 */ 0x4621, 0x467E, 0x0B21, + /* Array index: 0x0078 */ 0x4721, 0x477E, 0x0B7F, + /* Array index: 0x007B */ 0x4821, 0x487E, 0x0BDD, + /* Array index: 0x007E */ 0x4921, 0x497E, 0x0C3B, + /* Array index: 0x0081 */ 0x4A21, 0x4A7E, 0x0C99, + /* Array index: 0x0084 */ 0x4B21, 0x4B7E, 0x0CF7, + /* Array index: 0x0087 */ 0x4C21, 0x4C7E, 0x0D55, + /* Array index: 0x008A */ 0x4D21, 0x4D7E, 0x0DB3, + /* Array index: 0x008D */ 0x4E21, 0x4E7E, 0x0E11, + /* Array index: 0x0090 */ 0x4F21, 0x4F53, 0x0E6F, + /* Array index: 0x0093 */ 0x5021, 0x507E, 0x0EA2, + /* Array index: 0x0096 */ 0x5121, 0x517E, 0x0F00, + /* Array index: 0x0099 */ 0x5221, 0x527E, 0x0F5E, + /* Array index: 0x009C */ 0x5321, 0x537E, 0x0FBC, + /* Array index: 0x009F */ 0x5421, 0x547E, 0x101A, + /* Array index: 0x00A2 */ 0x5521, 0x557E, 0x1078, + /* Array index: 0x00A5 */ 0x5621, 0x567E, 0x10D6, + /* Array index: 0x00A8 */ 0x5721, 0x577E, 0x1134, + /* Array index: 0x00AB */ 0x5821, 0x587E, 0x1192, + /* Array index: 0x00AE */ 0x5921, 0x597E, 0x11F0, + /* Array index: 0x00B1 */ 0x5A21, 0x5A7E, 0x124E, + /* Array index: 0x00B4 */ 0x5B21, 0x5B7E, 0x12AC, + /* Array index: 0x00B7 */ 0x5C21, 0x5C7E, 0x130A, + /* Array index: 0x00BA */ 0x5D21, 0x5D7E, 0x1368, + /* Array index: 0x00BD */ 0x5E21, 0x5E7E, 0x13C6, + /* Array index: 0x00C0 */ 0x5F21, 0x5F7E, 0x1424, + /* Array index: 0x00C3 */ 0x6021, 0x607E, 0x1482, + /* Array index: 0x00C6 */ 0x6121, 0x617E, 0x14E0, + /* Array index: 0x00C9 */ 0x6221, 0x627E, 0x153E, + /* Array index: 0x00CC */ 0x6321, 0x637E, 0x159C, + /* Array index: 0x00CF */ 0x6421, 0x647E, 0x15FA, + /* Array index: 0x00D2 */ 0x6521, 0x657E, 0x1658, + /* Array index: 0x00D5 */ 0x6621, 0x667E, 0x16B6, + /* Array index: 0x00D8 */ 0x6721, 0x677E, 0x1714, + /* Array index: 0x00DB */ 0x6821, 0x687E, 0x1772, + /* Array index: 0x00DE */ 0x6921, 0x697E, 0x17D0, + /* Array index: 0x00E1 */ 0x6A21, 0x6A7E, 0x182E, + /* Array index: 0x00E4 */ 0x6B21, 0x6B7E, 0x188C, + /* Array index: 0x00E7 */ 0x6C21, 0x6C7E, 0x18EA, + /* Array index: 0x00EA */ 0x6D21, 0x6D7E, 0x1948, + /* Array index: 0x00ED */ 0x6E21, 0x6E7E, 0x19A6, + /* Array index: 0x00F0 */ 0x6F21, 0x6F7E, 0x1A04, + /* Array index: 0x00F3 */ 0x7021, 0x707E, 0x1A62, + /* Array index: 0x00F6 */ 0x7121, 0x717E, 0x1AC0, + /* Array index: 0x00F9 */ 0x7221, 0x727E, 0x1B1E, + /* Array index: 0x00FC */ 0x7321, 0x737E, 0x1B7C, + /* Array index: 0x00FF */ 0x7421, 0x7426, 0x1BDA, + /* Ranges content */ + /* Range 0x2121 - 0x217E, array index: 0x0102 */ + 0x3000,0x3001,0x3002,0xFF0C,0xFF0E,0x30FB,0xFF1A,0xFF1B, + 0xFF1F,0xFF01,0x309B,0x309C,0x00B4,0xFF40,0x00A8,0xFF3E, + 0xFFE3,0xFF3F,0x30FD,0x30FE,0x309D,0x309E,0x3003,0x4EDD, + 0x3005,0x3006,0x3007,0x30FC,0x2015,0x2010,0xFF0F,0x005C, + 0x301C,0x2016,0xFF5C,0x2026,0x2025,0x2018,0x2019,0x201C, + 0x201D,0xFF08,0xFF09,0x3014,0x3015,0xFF3B,0xFF3D,0xFF5B, + 0xFF5D,0x3008,0x3009,0x300A,0x300B,0x300C,0x300D,0x300E, + 0x300F,0x3010,0x3011,0xFF0B,0x2212,0x00B1,0x00D7,0x00F7, + 0xFF1D,0x2260,0xFF1C,0xFF1E,0x2266,0x2267,0x221E,0x2234, + 0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFFE5,0xFF04, + 0x00A2,0x00A3,0xFF05,0xFF03,0xFF06,0xFF0A,0xFF20,0x00A7, + 0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7, + /* Range 0x2221 - 0x222E, array index: 0x0160 */ + 0x25C6,0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,0x25BC,0x203B, + 0x3012,0x2192,0x2190,0x2191,0x2193,0x3013, + /* Range 0x223A - 0x2241, array index: 0x016E */ + 0x2208,0x220B,0x2286,0x2287,0x2282,0x2283,0x222A,0x2229, + /* Range 0x224A - 0x2250, array index: 0x0176 */ + 0x2227,0x2228,0x00AC,0x21D2,0x21D4,0x2200,0x2203, + /* Range 0x225C - 0x226A, array index: 0x017D */ + 0x2220,0x22A5,0x2312,0x2202,0x2207,0x2261,0x2252,0x226A, + 0x226B,0x221A,0x223D,0x221D,0x2235,0x222B,0x222C, + /* Range 0x2272 - 0x2279, array index: 0x018C */ + 0x212B,0x2030,0x266F,0x266D,0x266A,0x2020,0x2021,0x00B6, + /* Range 0x2330 - 0x2339, array index: 0x0194 */ + 0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, + 0xFF18,0xFF19, + /* Range 0x2341 - 0x235A, array index: 0x019E */ + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, + 0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, + 0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, + 0xFF39,0xFF3A, + /* Range 0x2361 - 0x237A, array index: 0x01B8 */ + 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48, + 0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50, + 0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58, + 0xFF59,0xFF5A, + /* Range 0x2421 - 0x2473, array index: 0x01D2 */ + 0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048, + 0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050, + 0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058, + 0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060, + 0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068, + 0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070, + 0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078, + 0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080, + 0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088, + 0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090, + 0x3091,0x3092,0x3093, + /* Range 0x2521 - 0x2576, array index: 0x0225 */ + 0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, + 0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, + 0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, + 0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, + 0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, + 0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, + 0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, + 0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0, + 0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8, + 0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0, + 0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, + /* Range 0x2621 - 0x2638, array index: 0x027B */ + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398, + 0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0, + 0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + /* Range 0x2641 - 0x2658, array index: 0x0293 */ + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8, + 0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9, + /* Range 0x2721 - 0x2741, array index: 0x02AB */ + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, + 0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, + 0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, + 0x042F, + /* Range 0x2751 - 0x2771, array index: 0x02CC */ + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, + 0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, + 0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, + 0x044F, + /* Range 0x2821 - 0x2840, array index: 0x02ED */ + 0x2500,0x2502,0x250C,0x2510,0x2518,0x2514,0x251C,0x252C, + 0x2524,0x2534,0x253C,0x2501,0x2503,0x250F,0x2513,0x251B, + 0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,0x2520,0x252F, + 0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542, + /* Range 0x3021 - 0x307E, array index: 0x030D */ + 0x4E9C,0x5516,0x5A03,0x963F,0x54C0,0x611B,0x6328,0x59F6, + 0x9022,0x8475,0x831C,0x7A50,0x60AA,0x63E1,0x6E25,0x65ED, + 0x8466,0x82A6,0x9BF5,0x6893,0x5727,0x65A1,0x6271,0x5B9B, + 0x59D0,0x867B,0x98F4,0x7D62,0x7DBE,0x9B8E,0x6216,0x7C9F, + 0x88B7,0x5B89,0x5EB5,0x6309,0x6697,0x6848,0x95C7,0x978D, + 0x674F,0x4EE5,0x4F0A,0x4F4D,0x4F9D,0x5049,0x56F2,0x5937, + 0x59D4,0x5A01,0x5C09,0x60DF,0x610F,0x6170,0x6613,0x6905, + 0x70BA,0x754F,0x7570,0x79FB,0x7DAD,0x7DEF,0x80C3,0x840E, + 0x8863,0x8B02,0x9055,0x907A,0x533B,0x4E95,0x4EA5,0x57DF, + 0x80B2,0x90C1,0x78EF,0x4E00,0x58F1,0x6EA2,0x9038,0x7A32, + 0x8328,0x828B,0x9C2F,0x5141,0x5370,0x54BD,0x54E1,0x56E0, + 0x59FB,0x5F15,0x98F2,0x6DEB,0x80E4,0x852D, + /* Range 0x3121 - 0x317E, array index: 0x036B */ + 0x9662,0x9670,0x96A0,0x97FB,0x540B,0x53F3,0x5B87,0x70CF, + 0x7FBD,0x8FC2,0x96E8,0x536F,0x9D5C,0x7ABA,0x4E11,0x7893, + 0x81FC,0x6E26,0x5618,0x5504,0x6B1D,0x851A,0x9C3B,0x59E5, + 0x53A9,0x6D66,0x74DC,0x958F,0x5642,0x4E91,0x904B,0x96F2, + 0x834F,0x990C,0x53E1,0x55B6,0x5B30,0x5F71,0x6620,0x66F3, + 0x6804,0x6C38,0x6CF3,0x6D29,0x745B,0x76C8,0x7A4E,0x9834, + 0x82F1,0x885B,0x8A60,0x92ED,0x6DB2,0x75AB,0x76CA,0x99C5, + 0x60A6,0x8B01,0x8D8A,0x95B2,0x698E,0x53AD,0x5186,0x5712, + 0x5830,0x5944,0x5BB4,0x5EF6,0x6028,0x63A9,0x63F4,0x6CBF, + 0x6F14,0x708E,0x7114,0x7159,0x71D5,0x733F,0x7E01,0x8276, + 0x82D1,0x8597,0x9060,0x925B,0x9D1B,0x5869,0x65BC,0x6C5A, + 0x7525,0x51F9,0x592E,0x5965,0x5F80,0x5FDC, + /* Range 0x3221 - 0x327E, array index: 0x03C9 */ + 0x62BC,0x65FA,0x6A2A,0x6B27,0x6BB4,0x738B,0x7FC1,0x8956, + 0x9D2C,0x9D0E,0x9EC4,0x5CA1,0x6C96,0x837B,0x5104,0x5C4B, + 0x61B6,0x81C6,0x6876,0x7261,0x4E59,0x4FFA,0x5378,0x6069, + 0x6E29,0x7A4F,0x97F3,0x4E0B,0x5316,0x4EEE,0x4F55,0x4F3D, + 0x4FA1,0x4F73,0x52A0,0x53EF,0x5609,0x590F,0x5AC1,0x5BB6, + 0x5BE1,0x79D1,0x6687,0x679C,0x67B6,0x6B4C,0x6CB3,0x706B, + 0x73C2,0x798D,0x79BE,0x7A3C,0x7B87,0x82B1,0x82DB,0x8304, + 0x8377,0x83EF,0x83D3,0x8766,0x8AB2,0x5629,0x8CA8,0x8FE6, + 0x904E,0x971E,0x868A,0x4FC4,0x5CE8,0x6211,0x7259,0x753B, + 0x81E5,0x82BD,0x86FE,0x8CC0,0x96C5,0x9913,0x99D5,0x4ECB, + 0x4F1A,0x89E3,0x56DE,0x584A,0x58CA,0x5EFB,0x5FEB,0x602A, + 0x6094,0x6062,0x61D0,0x6212,0x62D0,0x6539, + /* Range 0x3321 - 0x337E, array index: 0x0427 */ + 0x9B41,0x6666,0x68B0,0x6D77,0x7070,0x754C,0x7686,0x7D75, + 0x82A5,0x87F9,0x958B,0x968E,0x8C9D,0x51F1,0x52BE,0x5916, + 0x54B3,0x5BB3,0x5D16,0x6168,0x6982,0x6DAF,0x788D,0x84CB, + 0x8857,0x8A72,0x93A7,0x9AB8,0x6D6C,0x99A8,0x86D9,0x57A3, + 0x67FF,0x86CE,0x920E,0x5283,0x5687,0x5404,0x5ED3,0x62E1, + 0x64B9,0x683C,0x6838,0x6BBB,0x7372,0x78BA,0x7A6B,0x899A, + 0x89D2,0x8D6B,0x8F03,0x90ED,0x95A3,0x9694,0x9769,0x5B66, + 0x5CB3,0x697D,0x984D,0x984E,0x639B,0x7B20,0x6A2B,0x6A7F, + 0x68B6,0x9C0D,0x6F5F,0x5272,0x559D,0x6070,0x62EC,0x6D3B, + 0x6E07,0x6ED1,0x845B,0x8910,0x8F44,0x4E14,0x9C39,0x53F6, + 0x691B,0x6A3A,0x9784,0x682A,0x515C,0x7AC3,0x84B2,0x91DC, + 0x938C,0x565B,0x9D28,0x6822,0x8305,0x8431, + /* Range 0x3421 - 0x347E, array index: 0x0485 */ + 0x7CA5,0x5208,0x82C5,0x74E6,0x4E7E,0x4F83,0x51A0,0x5BD2, + 0x520A,0x52D8,0x52E7,0x5DFB,0x559A,0x582A,0x59E6,0x5B8C, + 0x5B98,0x5BDB,0x5E72,0x5E79,0x60A3,0x611F,0x6163,0x61BE, + 0x63DB,0x6562,0x67D1,0x6853,0x68FA,0x6B3E,0x6B53,0x6C57, + 0x6F22,0x6F97,0x6F45,0x74B0,0x7518,0x76E3,0x770B,0x7AFF, + 0x7BA1,0x7C21,0x7DE9,0x7F36,0x7FF0,0x809D,0x8266,0x839E, + 0x89B3,0x8ACC,0x8CAB,0x9084,0x9451,0x9593,0x9591,0x95A2, + 0x9665,0x97D3,0x9928,0x8218,0x4E38,0x542B,0x5CB8,0x5DCC, + 0x73A9,0x764C,0x773C,0x5CA9,0x7FEB,0x8D0B,0x96C1,0x9811, + 0x9854,0x9858,0x4F01,0x4F0E,0x5371,0x559C,0x5668,0x57FA, + 0x5947,0x5B09,0x5BC4,0x5C90,0x5E0C,0x5E7E,0x5FCC,0x63EE, + 0x673A,0x65D7,0x65E2,0x671F,0x68CB,0x68C4, + /* Range 0x3521 - 0x357E, array index: 0x04E3 */ + 0x6A5F,0x5E30,0x6BC5,0x6C17,0x6C7D,0x757F,0x7948,0x5B63, + 0x7A00,0x7D00,0x5FBD,0x898F,0x8A18,0x8CB4,0x8D77,0x8ECC, + 0x8F1D,0x98E2,0x9A0E,0x9B3C,0x4E80,0x507D,0x5100,0x5993, + 0x5B9C,0x622F,0x6280,0x64EC,0x6B3A,0x72A0,0x7591,0x7947, + 0x7FA9,0x87FB,0x8ABC,0x8B70,0x63AC,0x83CA,0x97A0,0x5409, + 0x5403,0x55AB,0x6854,0x6A58,0x8A70,0x7827,0x6775,0x9ECD, + 0x5374,0x5BA2,0x811A,0x8650,0x9006,0x4E18,0x4E45,0x4EC7, + 0x4F11,0x53CA,0x5438,0x5BAE,0x5F13,0x6025,0x6551,0x673D, + 0x6C42,0x6C72,0x6CE3,0x7078,0x7403,0x7A76,0x7AAE,0x7B08, + 0x7D1A,0x7CFE,0x7D66,0x65E7,0x725B,0x53BB,0x5C45,0x5DE8, + 0x62D2,0x62E0,0x6319,0x6E20,0x865A,0x8A31,0x8DDD,0x92F8, + 0x6F01,0x79A6,0x9B5A,0x4EA8,0x4EAB,0x4EAC, + /* Range 0x3621 - 0x367E, array index: 0x0541 */ + 0x4F9B,0x4FA0,0x50D1,0x5147,0x7AF6,0x5171,0x51F6,0x5354, + 0x5321,0x537F,0x53EB,0x55AC,0x5883,0x5CE1,0x5F37,0x5F4A, + 0x602F,0x6050,0x606D,0x631F,0x6559,0x6A4B,0x6CC1,0x72C2, + 0x72ED,0x77EF,0x80F8,0x8105,0x8208,0x854E,0x90F7,0x93E1, + 0x97FF,0x9957,0x9A5A,0x4EF0,0x51DD,0x5C2D,0x6681,0x696D, + 0x5C40,0x66F2,0x6975,0x7389,0x6850,0x7C81,0x50C5,0x52E4, + 0x5747,0x5DFE,0x9326,0x65A4,0x6B23,0x6B3D,0x7434,0x7981, + 0x79BD,0x7B4B,0x7DCA,0x82B9,0x83CC,0x887F,0x895F,0x8B39, + 0x8FD1,0x91D1,0x541F,0x9280,0x4E5D,0x5036,0x53E5,0x533A, + 0x72D7,0x7396,0x77E9,0x82E6,0x8EAF,0x99C6,0x99C8,0x99D2, + 0x5177,0x611A,0x865E,0x55B0,0x7A7A,0x5076,0x5BD3,0x9047, + 0x9685,0x4E32,0x6ADB,0x91E7,0x5C51,0x5C48, + /* Range 0x3721 - 0x377E, array index: 0x059F */ + 0x6398,0x7A9F,0x6C93,0x9774,0x8F61,0x7AAA,0x718A,0x9688, + 0x7C82,0x6817,0x7E70,0x6851,0x936C,0x52F2,0x541B,0x85AB, + 0x8A13,0x7FA4,0x8ECD,0x90E1,0x5366,0x8888,0x7941,0x4FC2, + 0x50BE,0x5211,0x5144,0x5553,0x572D,0x73EA,0x578B,0x5951, + 0x5F62,0x5F84,0x6075,0x6176,0x6167,0x61A9,0x63B2,0x643A, + 0x656C,0x666F,0x6842,0x6E13,0x7566,0x7A3D,0x7CFB,0x7D4C, + 0x7D99,0x7E4B,0x7F6B,0x830E,0x834A,0x86CD,0x8A08,0x8A63, + 0x8B66,0x8EFD,0x981A,0x9D8F,0x82B8,0x8FCE,0x9BE8,0x5287, + 0x621F,0x6483,0x6FC0,0x9699,0x6841,0x5091,0x6B20,0x6C7A, + 0x6F54,0x7A74,0x7D50,0x8840,0x8A23,0x6708,0x4EF6,0x5039, + 0x5026,0x5065,0x517C,0x5238,0x5263,0x55A7,0x570F,0x5805, + 0x5ACC,0x5EFA,0x61B2,0x61F8,0x62F3,0x6372, + /* Range 0x3821 - 0x387E, array index: 0x05FD */ + 0x691C,0x6A29,0x727D,0x72AC,0x732E,0x7814,0x786F,0x7D79, + 0x770C,0x80A9,0x898B,0x8B19,0x8CE2,0x8ED2,0x9063,0x9375, + 0x967A,0x9855,0x9A13,0x9E78,0x5143,0x539F,0x53B3,0x5E7B, + 0x5F26,0x6E1B,0x6E90,0x7384,0x73FE,0x7D43,0x8237,0x8A00, + 0x8AFA,0x9650,0x4E4E,0x500B,0x53E4,0x547C,0x56FA,0x59D1, + 0x5B64,0x5DF1,0x5EAB,0x5F27,0x6238,0x6545,0x67AF,0x6E56, + 0x72D0,0x7CCA,0x88B4,0x80A1,0x80E1,0x83F0,0x864E,0x8A87, + 0x8DE8,0x9237,0x96C7,0x9867,0x9F13,0x4E94,0x4E92,0x4F0D, + 0x5348,0x5449,0x543E,0x5A2F,0x5F8C,0x5FA1,0x609F,0x68A7, + 0x6A8E,0x745A,0x7881,0x8A9E,0x8AA4,0x8B77,0x9190,0x4E5E, + 0x9BC9,0x4EA4,0x4F7C,0x4FAF,0x5019,0x5016,0x5149,0x516C, + 0x529F,0x52B9,0x52FE,0x539A,0x53E3,0x5411, + /* Range 0x3921 - 0x397E, array index: 0x065B */ + 0x540E,0x5589,0x5751,0x57A2,0x597D,0x5B54,0x5B5D,0x5B8F, + 0x5DE5,0x5DE7,0x5DF7,0x5E78,0x5E83,0x5E9A,0x5EB7,0x5F18, + 0x6052,0x614C,0x6297,0x62D8,0x63A7,0x653B,0x6602,0x6643, + 0x66F4,0x676D,0x6821,0x6897,0x69CB,0x6C5F,0x6D2A,0x6D69, + 0x6E2F,0x6E9D,0x7532,0x7687,0x786C,0x7A3F,0x7CE0,0x7D05, + 0x7D18,0x7D5E,0x7DB1,0x8015,0x8003,0x80AF,0x80B1,0x8154, + 0x818F,0x822A,0x8352,0x884C,0x8861,0x8B1B,0x8CA2,0x8CFC, + 0x90CA,0x9175,0x9271,0x783F,0x92FC,0x95A4,0x964D,0x9805, + 0x9999,0x9AD8,0x9D3B,0x525B,0x52AB,0x53F7,0x5408,0x58D5, + 0x62F7,0x6FE0,0x8C6A,0x8F5F,0x9EB9,0x514B,0x523B,0x544A, + 0x56FD,0x7A40,0x9177,0x9D60,0x9ED2,0x7344,0x6F09,0x8170, + 0x7511,0x5FFD,0x60DA,0x9AA8,0x72DB,0x8FBC, + /* Range 0x3A21 - 0x3A7E, array index: 0x06B9 */ + 0x6B64,0x9803,0x4ECA,0x56F0,0x5764,0x58BE,0x5A5A,0x6068, + 0x61C7,0x660F,0x6606,0x6839,0x68B1,0x6DF7,0x75D5,0x7D3A, + 0x826E,0x9B42,0x4E9B,0x4F50,0x53C9,0x5506,0x5D6F,0x5DE6, + 0x5DEE,0x67FB,0x6C99,0x7473,0x7802,0x8A50,0x9396,0x88DF, + 0x5750,0x5EA7,0x632B,0x50B5,0x50AC,0x518D,0x6700,0x54C9, + 0x585E,0x59BB,0x5BB0,0x5F69,0x624D,0x63A1,0x683D,0x6B73, + 0x6E08,0x707D,0x91C7,0x7280,0x7815,0x7826,0x796D,0x658E, + 0x7D30,0x83DC,0x88C1,0x8F09,0x969B,0x5264,0x5728,0x6750, + 0x7F6A,0x8CA1,0x51B4,0x5742,0x962A,0x583A,0x698A,0x80B4, + 0x54B2,0x5D0E,0x57FC,0x7895,0x9DFA,0x4F5C,0x524A,0x548B, + 0x643E,0x6628,0x6714,0x67F5,0x7A84,0x7B56,0x7D22,0x932F, + 0x685C,0x9BAD,0x7B39,0x5319,0x518A,0x5237, + /* Range 0x3B21 - 0x3B7E, array index: 0x0717 */ + 0x5BDF,0x62F6,0x64AE,0x64E6,0x672D,0x6BBA,0x85A9,0x96D1, + 0x7690,0x9BD6,0x634C,0x9306,0x9BAB,0x76BF,0x6652,0x4E09, + 0x5098,0x53C2,0x5C71,0x60E8,0x6492,0x6563,0x685F,0x71E6, + 0x73CA,0x7523,0x7B97,0x7E82,0x8695,0x8B83,0x8CDB,0x9178, + 0x9910,0x65AC,0x66AB,0x6B8B,0x4ED5,0x4ED4,0x4F3A,0x4F7F, + 0x523A,0x53F8,0x53F2,0x55E3,0x56DB,0x58EB,0x59CB,0x59C9, + 0x59FF,0x5B50,0x5C4D,0x5E02,0x5E2B,0x5FD7,0x601D,0x6307, + 0x652F,0x5B5C,0x65AF,0x65BD,0x65E8,0x679D,0x6B62,0x6B7B, + 0x6C0F,0x7345,0x7949,0x79C1,0x7CF8,0x7D19,0x7D2B,0x80A2, + 0x8102,0x81F3,0x8996,0x8A5E,0x8A69,0x8A66,0x8A8C,0x8AEE, + 0x8CC7,0x8CDC,0x96CC,0x98FC,0x6B6F,0x4E8B,0x4F3C,0x4F8D, + 0x5150,0x5B57,0x5BFA,0x6148,0x6301,0x6642, + /* Range 0x3C21 - 0x3C7E, array index: 0x0775 */ + 0x6B21,0x6ECB,0x6CBB,0x723E,0x74BD,0x75D4,0x78C1,0x793A, + 0x800C,0x8033,0x81EA,0x8494,0x8F9E,0x6C50,0x9E7F,0x5F0F, + 0x8B58,0x9D2B,0x7AFA,0x8EF8,0x5B8D,0x96EB,0x4E03,0x53F1, + 0x57F7,0x5931,0x5AC9,0x5BA4,0x6089,0x6E7F,0x6F06,0x75BE, + 0x8CEA,0x5B9F,0x8500,0x7BE0,0x5072,0x67F4,0x829D,0x5C61, + 0x854A,0x7E1E,0x820E,0x5199,0x5C04,0x6368,0x8D66,0x659C, + 0x716E,0x793E,0x7D17,0x8005,0x8B1D,0x8ECA,0x906E,0x86C7, + 0x90AA,0x501F,0x52FA,0x5C3A,0x6753,0x707C,0x7235,0x914C, + 0x91C8,0x932B,0x82E5,0x5BC2,0x5F31,0x60F9,0x4E3B,0x53D6, + 0x5B88,0x624B,0x6731,0x6B8A,0x72E9,0x73E0,0x7A2E,0x816B, + 0x8DA3,0x9152,0x9996,0x5112,0x53D7,0x546A,0x5BFF,0x6388, + 0x6A39,0x7DAC,0x9700,0x56DA,0x53CE,0x5468, + /* Range 0x3D21 - 0x3D7E, array index: 0x07D3 */ + 0x5B97,0x5C31,0x5DDE,0x4FEE,0x6101,0x62FE,0x6D32,0x79C0, + 0x79CB,0x7D42,0x7E4D,0x7FD2,0x81ED,0x821F,0x8490,0x8846, + 0x8972,0x8B90,0x8E74,0x8F2F,0x9031,0x914B,0x916C,0x96C6, + 0x919C,0x4EC0,0x4F4F,0x5145,0x5341,0x5F93,0x620E,0x67D4, + 0x6C41,0x6E0B,0x7363,0x7E26,0x91CD,0x9283,0x53D4,0x5919, + 0x5BBF,0x6DD1,0x795D,0x7E2E,0x7C9B,0x587E,0x719F,0x51FA, + 0x8853,0x8FF0,0x4FCA,0x5CFB,0x6625,0x77AC,0x7AE3,0x821C, + 0x99FF,0x51C6,0x5FAA,0x65EC,0x696F,0x6B89,0x6DF3,0x6E96, + 0x6F64,0x76FE,0x7D14,0x5DE1,0x9075,0x9187,0x9806,0x51E6, + 0x521D,0x6240,0x6691,0x66D9,0x6E1A,0x5EB6,0x7DD2,0x7F72, + 0x66F8,0x85AF,0x85F7,0x8AF8,0x52A9,0x53D9,0x5973,0x5E8F, + 0x5F90,0x6055,0x92E4,0x9664,0x50B7,0x511F, + /* Range 0x3E21 - 0x3E7E, array index: 0x0831 */ + 0x52DD,0x5320,0x5347,0x53EC,0x54E8,0x5546,0x5531,0x5617, + 0x5968,0x59BE,0x5A3C,0x5BB5,0x5C06,0x5C0F,0x5C11,0x5C1A, + 0x5E84,0x5E8A,0x5EE0,0x5F70,0x627F,0x6284,0x62DB,0x638C, + 0x6377,0x6607,0x660C,0x662D,0x6676,0x677E,0x68A2,0x6A1F, + 0x6A35,0x6CBC,0x6D88,0x6E09,0x6E58,0x713C,0x7126,0x7167, + 0x75C7,0x7701,0x785D,0x7901,0x7965,0x79F0,0x7AE0,0x7B11, + 0x7CA7,0x7D39,0x8096,0x83D6,0x848B,0x8549,0x885D,0x88F3, + 0x8A1F,0x8A3C,0x8A54,0x8A73,0x8C61,0x8CDE,0x91A4,0x9266, + 0x937E,0x9418,0x969C,0x9798,0x4E0A,0x4E08,0x4E1E,0x4E57, + 0x5197,0x5270,0x57CE,0x5834,0x58CC,0x5B22,0x5E38,0x60C5, + 0x64FE,0x6761,0x6756,0x6D44,0x72B6,0x7573,0x7A63,0x84B8, + 0x8B72,0x91B8,0x9320,0x5631,0x57F4,0x98FE, + /* Range 0x3F21 - 0x3F7E, array index: 0x088F */ + 0x62ED,0x690D,0x6B96,0x71ED,0x7E54,0x8077,0x8272,0x89E6, + 0x98DF,0x8755,0x8FB1,0x5C3B,0x4F38,0x4FE1,0x4FB5,0x5507, + 0x5A20,0x5BDD,0x5BE9,0x5FC3,0x614E,0x632F,0x65B0,0x664B, + 0x68EE,0x699B,0x6D78,0x6DF1,0x7533,0x75B9,0x771F,0x795E, + 0x79E6,0x7D33,0x81E3,0x82AF,0x85AA,0x89AA,0x8A3A,0x8EAB, + 0x8F9B,0x9032,0x91DD,0x9707,0x4EBA,0x4EC1,0x5203,0x5875, + 0x58EC,0x5C0B,0x751A,0x5C3D,0x814E,0x8A0A,0x8FC5,0x9663, + 0x976D,0x7B25,0x8ACF,0x9808,0x9162,0x56F3,0x53A8,0x9017, + 0x5439,0x5782,0x5E25,0x63A8,0x6C34,0x708A,0x7761,0x7C8B, + 0x7FE0,0x8870,0x9042,0x9154,0x9310,0x9318,0x968F,0x745E, + 0x9AC4,0x5D07,0x5D69,0x6570,0x67A2,0x8DA8,0x96DB,0x636E, + 0x6749,0x6919,0x83C5,0x9817,0x96C0,0x88FE, + /* Range 0x4021 - 0x407E, array index: 0x08ED */ + 0x6F84,0x647A,0x5BF8,0x4E16,0x702C,0x755D,0x662F,0x51C4, + 0x5236,0x52E2,0x59D3,0x5F81,0x6027,0x6210,0x653F,0x6574, + 0x661F,0x6674,0x68F2,0x6816,0x6B63,0x6E05,0x7272,0x751F, + 0x76DB,0x7CBE,0x8056,0x58F0,0x88FD,0x897F,0x8AA0,0x8A93, + 0x8ACB,0x901D,0x9192,0x9752,0x9759,0x6589,0x7A0E,0x8106, + 0x96BB,0x5E2D,0x60DC,0x621A,0x65A5,0x6614,0x6790,0x77F3, + 0x7A4D,0x7C4D,0x7E3E,0x810A,0x8CAC,0x8D64,0x8DE1,0x8E5F, + 0x78A9,0x5207,0x62D9,0x63A5,0x6442,0x6298,0x8A2D,0x7A83, + 0x7BC0,0x8AAC,0x96EA,0x7D76,0x820C,0x8749,0x4ED9,0x5148, + 0x5343,0x5360,0x5BA3,0x5C02,0x5C16,0x5DDD,0x6226,0x6247, + 0x64B0,0x6813,0x6834,0x6CC9,0x6D45,0x6D17,0x67D3,0x6F5C, + 0x714E,0x717D,0x65CB,0x7A7F,0x7BAD,0x7DDA, + /* Range 0x4121 - 0x417E, array index: 0x094B */ + 0x7E4A,0x7FA8,0x817A,0x821B,0x8239,0x85A6,0x8A6E,0x8CCE, + 0x8DF5,0x9078,0x9077,0x92AD,0x9291,0x9583,0x9BAE,0x524D, + 0x5584,0x6F38,0x7136,0x5168,0x7985,0x7E55,0x81B3,0x7CCE, + 0x564C,0x5851,0x5CA8,0x63AA,0x66FE,0x66FD,0x695A,0x72D9, + 0x758F,0x758E,0x790E,0x7956,0x79DF,0x7C97,0x7D20,0x7D44, + 0x8607,0x8A34,0x963B,0x9061,0x9F20,0x50E7,0x5275,0x53CC, + 0x53E2,0x5009,0x55AA,0x58EE,0x594F,0x723D,0x5B8B,0x5C64, + 0x531D,0x60E3,0x60F3,0x635C,0x6383,0x633F,0x63BB,0x64CD, + 0x65E9,0x66F9,0x5DE3,0x69CD,0x69FD,0x6F15,0x71E5,0x4E89, + 0x75E9,0x76F8,0x7A93,0x7CDF,0x7DCF,0x7D9C,0x8061,0x8349, + 0x8358,0x846C,0x84BC,0x85FB,0x88C5,0x8D70,0x9001,0x906D, + 0x9397,0x971C,0x9A12,0x50CF,0x5897,0x618E, + /* Range 0x4221 - 0x427E, array index: 0x09A9 */ + 0x81D3,0x8535,0x8D08,0x9020,0x4FC3,0x5074,0x5247,0x5373, + 0x606F,0x6349,0x675F,0x6E2C,0x8DB3,0x901F,0x4FD7,0x5C5E, + 0x8CCA,0x65CF,0x7D9A,0x5352,0x8896,0x5176,0x63C3,0x5B58, + 0x5B6B,0x5C0A,0x640D,0x6751,0x905C,0x4ED6,0x591A,0x592A, + 0x6C70,0x8A51,0x553E,0x5815,0x59A5,0x60F0,0x6253,0x67C1, + 0x8235,0x6955,0x9640,0x99C4,0x9A28,0x4F53,0x5806,0x5BFE, + 0x8010,0x5CB1,0x5E2F,0x5F85,0x6020,0x614B,0x6234,0x66FF, + 0x6CF0,0x6EDE,0x80CE,0x817F,0x82D4,0x888B,0x8CB8,0x9000, + 0x902E,0x968A,0x9EDB,0x9BDB,0x4EE3,0x53F0,0x5927,0x7B2C, + 0x918D,0x984C,0x9DF9,0x6EDD,0x7027,0x5353,0x5544,0x5B85, + 0x6258,0x629E,0x62D3,0x6CA2,0x6FEF,0x7422,0x8A17,0x9438, + 0x6FC1,0x8AFE,0x8338,0x51E7,0x86F8,0x53EA, + /* Range 0x4321 - 0x437E, array index: 0x0A07 */ + 0x53E9,0x4F46,0x9054,0x8FB0,0x596A,0x8131,0x5DFD,0x7AEA, + 0x8FBF,0x68DA,0x8C37,0x72F8,0x9C48,0x6A3D,0x8AB0,0x4E39, + 0x5358,0x5606,0x5766,0x62C5,0x63A2,0x65E6,0x6B4E,0x6DE1, + 0x6E5B,0x70AD,0x77ED,0x7AEF,0x7BAA,0x7DBB,0x803D,0x80C6, + 0x86CB,0x8A95,0x935B,0x56E3,0x58C7,0x5F3E,0x65AD,0x6696, + 0x6A80,0x6BB5,0x7537,0x8AC7,0x5024,0x77E5,0x5730,0x5F1B, + 0x6065,0x667A,0x6C60,0x75F4,0x7A1A,0x7F6E,0x81F4,0x8718, + 0x9045,0x99B3,0x7BC9,0x755C,0x7AF9,0x7B51,0x84C4,0x9010, + 0x79E9,0x7A92,0x8336,0x5AE1,0x7740,0x4E2D,0x4EF2,0x5B99, + 0x5FE0,0x62BD,0x663C,0x67F1,0x6CE8,0x866B,0x8877,0x8A3B, + 0x914E,0x92F3,0x99D0,0x6A17,0x7026,0x732A,0x82E7,0x8457, + 0x8CAF,0x4E01,0x5146,0x51CB,0x558B,0x5BF5, + /* Range 0x4421 - 0x447E, array index: 0x0A65 */ + 0x5E16,0x5E33,0x5E81,0x5F14,0x5F35,0x5F6B,0x5FB4,0x61F2, + 0x6311,0x66A2,0x671D,0x6F6E,0x7252,0x753A,0x773A,0x8074, + 0x8139,0x8178,0x8776,0x8ABF,0x8ADC,0x8D85,0x8DF3,0x929A, + 0x9577,0x9802,0x9CE5,0x52C5,0x6357,0x76F4,0x6715,0x6C88, + 0x73CD,0x8CC3,0x93AE,0x9673,0x6D25,0x589C,0x690E,0x69CC, + 0x8FFD,0x939A,0x75DB,0x901A,0x585A,0x6802,0x63B4,0x69FB, + 0x4F43,0x6F2C,0x67D8,0x8FBB,0x8526,0x7DB4,0x9354,0x693F, + 0x6F70,0x576A,0x58F7,0x5B2C,0x7D2C,0x722A,0x540A,0x91E3, + 0x9DB4,0x4EAD,0x4F4E,0x505C,0x5075,0x5243,0x8C9E,0x5448, + 0x5824,0x5B9A,0x5E1D,0x5E95,0x5EAD,0x5EF7,0x5F1F,0x608C, + 0x62B5,0x633A,0x63D0,0x68AF,0x6C40,0x7887,0x798E,0x7A0B, + 0x7DE0,0x8247,0x8A02,0x8AE6,0x8E44,0x9013, + /* Range 0x4521 - 0x457E, array index: 0x0AC3 */ + 0x90B8,0x912D,0x91D8,0x9F0E,0x6CE5,0x6458,0x64E2,0x6575, + 0x6EF4,0x7684,0x7B1B,0x9069,0x93D1,0x6EBA,0x54F2,0x5FB9, + 0x64A4,0x8F4D,0x8FED,0x9244,0x5178,0x586B,0x5929,0x5C55, + 0x5E97,0x6DFB,0x7E8F,0x751C,0x8CBC,0x8EE2,0x985B,0x70B9, + 0x4F1D,0x6BBF,0x6FB1,0x7530,0x96FB,0x514E,0x5410,0x5835, + 0x5857,0x59AC,0x5C60,0x5F92,0x6597,0x675C,0x6E21,0x767B, + 0x83DF,0x8CED,0x9014,0x90FD,0x934D,0x7825,0x783A,0x52AA, + 0x5EA6,0x571F,0x5974,0x6012,0x5012,0x515A,0x51AC,0x51CD, + 0x5200,0x5510,0x5854,0x5858,0x5957,0x5B95,0x5CF6,0x5D8B, + 0x60BC,0x6295,0x642D,0x6771,0x6843,0x68BC,0x68DF,0x76D7, + 0x6DD8,0x6E6F,0x6D9B,0x706F,0x71C8,0x5F53,0x75D8,0x7977, + 0x7B49,0x7B54,0x7B52,0x7CD6,0x7D71,0x5230, + /* Range 0x4621 - 0x467E, array index: 0x0B21 */ + 0x8463,0x8569,0x85E4,0x8A0E,0x8B04,0x8C46,0x8E0F,0x9003, + 0x900F,0x9419,0x9676,0x982D,0x9A30,0x95D8,0x50CD,0x52D5, + 0x540C,0x5802,0x5C0E,0x61A7,0x649E,0x6D1E,0x77B3,0x7AE5, + 0x80F4,0x8404,0x9053,0x9285,0x5CE0,0x9D07,0x533F,0x5F97, + 0x5FB3,0x6D9C,0x7279,0x7763,0x79BF,0x7BE4,0x6BD2,0x72EC, + 0x8AAD,0x6803,0x6A61,0x51F8,0x7A81,0x6934,0x5C4A,0x9CF6, + 0x82EB,0x5BC5,0x9149,0x701E,0x5678,0x5C6F,0x60C7,0x6566, + 0x6C8C,0x8C5A,0x9041,0x9813,0x5451,0x66C7,0x920D,0x5948, + 0x90A3,0x5185,0x4E4D,0x51EA,0x8599,0x8B0E,0x7058,0x637A, + 0x934B,0x6962,0x99B4,0x7E04,0x7577,0x5357,0x6960,0x8EDF, + 0x96E3,0x6C5D,0x4E8C,0x5C3C,0x5F10,0x8FE9,0x5302,0x8CD1, + 0x8089,0x8679,0x5EFF,0x65E5,0x4E73,0x5165, + /* Range 0x4721 - 0x477E, array index: 0x0B7F */ + 0x5982,0x5C3F,0x97EE,0x4EFB,0x598A,0x5FCD,0x8A8D,0x6FE1, + 0x79B0,0x7962,0x5BE7,0x8471,0x732B,0x71B1,0x5E74,0x5FF5, + 0x637B,0x649A,0x71C3,0x7C98,0x4E43,0x5EFC,0x4E4B,0x57DC, + 0x56A2,0x60A9,0x6FC3,0x7D0D,0x80FD,0x8133,0x81BF,0x8FB2, + 0x8997,0x86A4,0x5DF4,0x628A,0x64AD,0x8987,0x6777,0x6CE2, + 0x6D3E,0x7436,0x7834,0x5A46,0x7F75,0x82AD,0x99AC,0x4FF3, + 0x5EC3,0x62DD,0x6392,0x6557,0x676F,0x76C3,0x724C,0x80CC, + 0x80BA,0x8F29,0x914D,0x500D,0x57F9,0x5A92,0x6885,0x6973, + 0x7164,0x72FD,0x8CB7,0x58F2,0x8CE0,0x966A,0x9019,0x877F, + 0x79E4,0x77E7,0x8429,0x4F2F,0x5265,0x535A,0x62CD,0x67CF, + 0x6CCA,0x767D,0x7B94,0x7C95,0x8236,0x8584,0x8FEB,0x66DD, + 0x6F20,0x7206,0x7E1B,0x83AB,0x99C1,0x9EA6, + /* Range 0x4821 - 0x487E, array index: 0x0BDD */ + 0x51FD,0x7BB1,0x7872,0x7BB8,0x8087,0x7B48,0x6AE8,0x5E61, + 0x808C,0x7551,0x7560,0x516B,0x9262,0x6E8C,0x767A,0x9197, + 0x9AEA,0x4F10,0x7F70,0x629C,0x7B4F,0x95A5,0x9CE9,0x567A, + 0x5859,0x86E4,0x96BC,0x4F34,0x5224,0x534A,0x53CD,0x53DB, + 0x5E06,0x642C,0x6591,0x677F,0x6C3E,0x6C4E,0x7248,0x72AF, + 0x73ED,0x7554,0x7E41,0x822C,0x85E9,0x8CA9,0x7BC4,0x91C6, + 0x7169,0x9812,0x98EF,0x633D,0x6669,0x756A,0x76E4,0x78D0, + 0x8543,0x86EE,0x532A,0x5351,0x5426,0x5983,0x5E87,0x5F7C, + 0x60B2,0x6249,0x6279,0x62AB,0x6590,0x6BD4,0x6CCC,0x75B2, + 0x76AE,0x7891,0x79D8,0x7DCB,0x7F77,0x80A5,0x88AB,0x8AB9, + 0x8CBB,0x907F,0x975E,0x98DB,0x6A0B,0x7C38,0x5099,0x5C3E, + 0x5FAE,0x6787,0x6BD8,0x7435,0x7709,0x7F8E, + /* Range 0x4921 - 0x497E, array index: 0x0C3B */ + 0x9F3B,0x67CA,0x7A17,0x5339,0x758B,0x9AED,0x5F66,0x819D, + 0x83F1,0x8098,0x5F3C,0x5FC5,0x7562,0x7B46,0x903C,0x6867, + 0x59EB,0x5A9B,0x7D10,0x767E,0x8B2C,0x4FF5,0x5F6A,0x6A19, + 0x6C37,0x6F02,0x74E2,0x7968,0x8868,0x8A55,0x8C79,0x5EDF, + 0x63CF,0x75C5,0x79D2,0x82D7,0x9328,0x92F2,0x849C,0x86ED, + 0x9C2D,0x54C1,0x5F6C,0x658C,0x6D5C,0x7015,0x8CA7,0x8CD3, + 0x983B,0x654F,0x74F6,0x4E0D,0x4ED8,0x57E0,0x592B,0x5A66, + 0x5BCC,0x51A8,0x5E03,0x5E9C,0x6016,0x6276,0x6577,0x65A7, + 0x666E,0x6D6E,0x7236,0x7B26,0x8150,0x819A,0x8299,0x8B5C, + 0x8CA0,0x8CE6,0x8D74,0x961C,0x9644,0x4FAE,0x64AB,0x6B66, + 0x821E,0x8461,0x856A,0x90E8,0x5C01,0x6953,0x98A8,0x847A, + 0x8557,0x4F0F,0x526F,0x5FA9,0x5E45,0x670D, + /* Range 0x4A21 - 0x4A7E, array index: 0x0C99 */ + 0x798F,0x8179,0x8907,0x8986,0x6DF5,0x5F17,0x6255,0x6CB8, + 0x4ECF,0x7269,0x9B92,0x5206,0x543B,0x5674,0x58B3,0x61A4, + 0x626E,0x711A,0x596E,0x7C89,0x7CDE,0x7D1B,0x96F0,0x6587, + 0x805E,0x4E19,0x4F75,0x5175,0x5840,0x5E63,0x5E73,0x5F0A, + 0x67C4,0x4E26,0x853D,0x9589,0x965B,0x7C73,0x9801,0x50FB, + 0x58C1,0x7656,0x78A7,0x5225,0x77A5,0x8511,0x7B86,0x504F, + 0x5909,0x7247,0x7BC7,0x7DE8,0x8FBA,0x8FD4,0x904D,0x4FBF, + 0x52C9,0x5A29,0x5F01,0x97AD,0x4FDD,0x8217,0x92EA,0x5703, + 0x6355,0x6B69,0x752B,0x88DC,0x8F14,0x7A42,0x52DF,0x5893, + 0x6155,0x620A,0x66AE,0x6BCD,0x7C3F,0x83E9,0x5023,0x4FF8, + 0x5305,0x5446,0x5831,0x5949,0x5B9D,0x5CF0,0x5CEF,0x5D29, + 0x5E96,0x62B1,0x6367,0x653E,0x65B9,0x670B, + /* Range 0x4B21 - 0x4B7E, array index: 0x0CF7 */ + 0x6CD5,0x6CE1,0x70F9,0x7832,0x7E2B,0x80DE,0x82B3,0x840C, + 0x84EC,0x8702,0x8912,0x8A2A,0x8C4A,0x90A6,0x92D2,0x98FD, + 0x9CF3,0x9D6C,0x4E4F,0x4EA1,0x508D,0x5256,0x574A,0x59A8, + 0x5E3D,0x5FD8,0x5FD9,0x623F,0x66B4,0x671B,0x67D0,0x68D2, + 0x5192,0x7D21,0x80AA,0x81A8,0x8B00,0x8C8C,0x8CBF,0x927E, + 0x9632,0x5420,0x982C,0x5317,0x50D5,0x535C,0x58A8,0x64B2, + 0x6734,0x7267,0x7766,0x7A46,0x91E6,0x52C3,0x6CA1,0x6B86, + 0x5800,0x5E4C,0x5954,0x672C,0x7FFB,0x51E1,0x76C6,0x6469, + 0x78E8,0x9B54,0x9EBB,0x57CB,0x59B9,0x6627,0x679A,0x6BCE, + 0x54E9,0x69D9,0x5E55,0x819C,0x6795,0x9BAA,0x67FE,0x9C52, + 0x685D,0x4EA6,0x4FE3,0x53C8,0x62B9,0x672B,0x6CAB,0x8FC4, + 0x4FAD,0x7E6D,0x9EBF,0x4E07,0x6162,0x6E80, + /* Range 0x4C21 - 0x4C7E, array index: 0x0D55 */ + 0x6F2B,0x8513,0x5473,0x672A,0x9B45,0x5DF3,0x7B95,0x5CAC, + 0x5BC6,0x871C,0x6E4A,0x84D1,0x7A14,0x8108,0x5999,0x7C8D, + 0x6C11,0x7720,0x52D9,0x5922,0x7121,0x725F,0x77DB,0x9727, + 0x9D61,0x690B,0x5A7F,0x5A18,0x51A5,0x540D,0x547D,0x660E, + 0x76DF,0x8FF7,0x9298,0x9CF4,0x59EA,0x725D,0x6EC5,0x514D, + 0x68C9,0x7DBF,0x7DEC,0x9762,0x9EBA,0x6478,0x6A21,0x8302, + 0x5984,0x5B5F,0x6BDB,0x731B,0x76F2,0x7DB2,0x8017,0x8499, + 0x5132,0x6728,0x9ED9,0x76EE,0x6762,0x52FF,0x9905,0x5C24, + 0x623B,0x7C7E,0x8CB0,0x554F,0x60B6,0x7D0B,0x9580,0x5301, + 0x4E5F,0x51B6,0x591C,0x723A,0x8036,0x91CE,0x5F25,0x77E2, + 0x5384,0x5F79,0x7D04,0x85AC,0x8A33,0x8E8D,0x9756,0x67F3, + 0x85AE,0x9453,0x6109,0x6108,0x6CB9,0x7652, + /* Range 0x4D21 - 0x4D7E, array index: 0x0DB3 */ + 0x8AED,0x8F38,0x552F,0x4F51,0x512A,0x52C7,0x53CB,0x5BA5, + 0x5E7D,0x60A0,0x6182,0x63D6,0x6709,0x67DA,0x6E67,0x6D8C, + 0x7336,0x7337,0x7531,0x7950,0x88D5,0x8A98,0x904A,0x9091, + 0x90F5,0x96C4,0x878D,0x5915,0x4E88,0x4F59,0x4E0E,0x8A89, + 0x8F3F,0x9810,0x50AD,0x5E7C,0x5996,0x5BB9,0x5EB8,0x63DA, + 0x63FA,0x64C1,0x66DC,0x694A,0x69D8,0x6D0B,0x6EB6,0x7194, + 0x7528,0x7AAF,0x7F8A,0x8000,0x8449,0x84C9,0x8981,0x8B21, + 0x8E0A,0x9065,0x967D,0x990A,0x617E,0x6291,0x6B32,0x6C83, + 0x6D74,0x7FCC,0x7FFC,0x6DC0,0x7F85,0x87BA,0x88F8,0x6765, + 0x83B1,0x983C,0x96F7,0x6D1B,0x7D61,0x843D,0x916A,0x4E71, + 0x5375,0x5D50,0x6B04,0x6FEB,0x85CD,0x862D,0x89A7,0x5229, + 0x540F,0x5C65,0x674E,0x68A8,0x7406,0x7483, + /* Range 0x4E21 - 0x4E7E, array index: 0x0E11 */ + 0x75E2,0x88CF,0x88E1,0x91CC,0x96E2,0x9678,0x5F8B,0x7387, + 0x7ACB,0x844E,0x63A0,0x7565,0x5289,0x6D41,0x6E9C,0x7409, + 0x7559,0x786B,0x7C92,0x9686,0x7ADC,0x9F8D,0x4FB6,0x616E, + 0x65C5,0x865C,0x4E86,0x4EAE,0x50DA,0x4E21,0x51CC,0x5BEE, + 0x6599,0x6881,0x6DBC,0x731F,0x7642,0x77AD,0x7A1C,0x7CE7, + 0x826F,0x8AD2,0x907C,0x91CF,0x9675,0x9818,0x529B,0x7DD1, + 0x502B,0x5398,0x6797,0x6DCB,0x71D0,0x7433,0x81E8,0x8F2A, + 0x96A3,0x9C57,0x9E9F,0x7460,0x5841,0x6D99,0x7D2F,0x985E, + 0x4EE4,0x4F36,0x4F8B,0x51B7,0x52B1,0x5DBA,0x601C,0x73B2, + 0x793C,0x82D3,0x9234,0x96B7,0x96F6,0x970A,0x9E97,0x9F62, + 0x66A6,0x6B74,0x5217,0x52A3,0x70C8,0x88C2,0x5EC9,0x604B, + 0x6190,0x6F23,0x7149,0x7C3E,0x7DF4,0x806F, + /* Range 0x4F21 - 0x4F53, array index: 0x0E6F */ + 0x84EE,0x9023,0x932C,0x5442,0x9B6F,0x6AD3,0x7089,0x8CC2, + 0x8DEF,0x9732,0x52B4,0x5A41,0x5ECA,0x5F04,0x6717,0x697C, + 0x6994,0x6D6A,0x6F0F,0x7262,0x72FC,0x7BED,0x8001,0x807E, + 0x874B,0x90CE,0x516D,0x9E93,0x7984,0x808B,0x9332,0x8AD6, + 0x502D,0x548C,0x8A71,0x6B6A,0x8CC4,0x8107,0x60D1,0x67A0, + 0x9DF2,0x4E99,0x4E98,0x9C10,0x8A6B,0x85C1,0x8568,0x6900, + 0x6E7E,0x7897,0x8155, + /* Range 0x5021 - 0x507E, array index: 0x0EA2 */ + 0x5F0C,0x4E10,0x4E15,0x4E2A,0x4E31,0x4E36,0x4E3C,0x4E3F, + 0x4E42,0x4E56,0x4E58,0x4E82,0x4E85,0x8C6B,0x4E8A,0x8212, + 0x5F0D,0x4E8E,0x4E9E,0x4E9F,0x4EA0,0x4EA2,0x4EB0,0x4EB3, + 0x4EB6,0x4ECE,0x4ECD,0x4EC4,0x4EC6,0x4EC2,0x4ED7,0x4EDE, + 0x4EED,0x4EDF,0x4EF7,0x4F09,0x4F5A,0x4F30,0x4F5B,0x4F5D, + 0x4F57,0x4F47,0x4F76,0x4F88,0x4F8F,0x4F98,0x4F7B,0x4F69, + 0x4F70,0x4F91,0x4F6F,0x4F86,0x4F96,0x5118,0x4FD4,0x4FDF, + 0x4FCE,0x4FD8,0x4FDB,0x4FD1,0x4FDA,0x4FD0,0x4FE4,0x4FE5, + 0x501A,0x5028,0x5014,0x502A,0x5025,0x5005,0x4F1C,0x4FF6, + 0x5021,0x5029,0x502C,0x4FFE,0x4FEF,0x5011,0x5006,0x5043, + 0x5047,0x6703,0x5055,0x5050,0x5048,0x505A,0x5056,0x506C, + 0x5078,0x5080,0x509A,0x5085,0x50B4,0x50B2, + /* Range 0x5121 - 0x517E, array index: 0x0F00 */ + 0x50C9,0x50CA,0x50B3,0x50C2,0x50D6,0x50DE,0x50E5,0x50ED, + 0x50E3,0x50EE,0x50F9,0x50F5,0x5109,0x5101,0x5102,0x5116, + 0x5115,0x5114,0x511A,0x5121,0x513A,0x5137,0x513C,0x513B, + 0x513F,0x5140,0x5152,0x514C,0x5154,0x5162,0x7AF8,0x5169, + 0x516A,0x516E,0x5180,0x5182,0x56D8,0x518C,0x5189,0x518F, + 0x5191,0x5193,0x5195,0x5196,0x51A4,0x51A6,0x51A2,0x51A9, + 0x51AA,0x51AB,0x51B3,0x51B1,0x51B2,0x51B0,0x51B5,0x51BD, + 0x51C5,0x51C9,0x51DB,0x51E0,0x8655,0x51E9,0x51ED,0x51F0, + 0x51F5,0x51FE,0x5204,0x520B,0x5214,0x520E,0x5227,0x522A, + 0x522E,0x5233,0x5239,0x524F,0x5244,0x524B,0x524C,0x525E, + 0x5254,0x526A,0x5274,0x5269,0x5273,0x527F,0x527D,0x528D, + 0x5294,0x5292,0x5271,0x5288,0x5291,0x8FA8, + /* Range 0x5221 - 0x527E, array index: 0x0F5E */ + 0x8FA7,0x52AC,0x52AD,0x52BC,0x52B5,0x52C1,0x52CD,0x52D7, + 0x52DE,0x52E3,0x52E6,0x98ED,0x52E0,0x52F3,0x52F5,0x52F8, + 0x52F9,0x5306,0x5308,0x7538,0x530D,0x5310,0x530F,0x5315, + 0x531A,0x5323,0x532F,0x5331,0x5333,0x5338,0x5340,0x5346, + 0x5345,0x4E17,0x5349,0x534D,0x51D6,0x535E,0x5369,0x536E, + 0x5918,0x537B,0x5377,0x5382,0x5396,0x53A0,0x53A6,0x53A5, + 0x53AE,0x53B0,0x53B6,0x53C3,0x7C12,0x96D9,0x53DF,0x66FC, + 0x71EE,0x53EE,0x53E8,0x53ED,0x53FA,0x5401,0x543D,0x5440, + 0x542C,0x542D,0x543C,0x542E,0x5436,0x5429,0x541D,0x544E, + 0x548F,0x5475,0x548E,0x545F,0x5471,0x5477,0x5470,0x5492, + 0x547B,0x5480,0x5476,0x5484,0x5490,0x5486,0x54C7,0x54A2, + 0x54B8,0x54A5,0x54AC,0x54C4,0x54C8,0x54A8, + /* Range 0x5321 - 0x537E, array index: 0x0FBC */ + 0x54AB,0x54C2,0x54A4,0x54BE,0x54BC,0x54D8,0x54E5,0x54E6, + 0x550F,0x5514,0x54FD,0x54EE,0x54ED,0x54FA,0x54E2,0x5539, + 0x5540,0x5563,0x554C,0x552E,0x555C,0x5545,0x5556,0x5557, + 0x5538,0x5533,0x555D,0x5599,0x5580,0x54AF,0x558A,0x559F, + 0x557B,0x557E,0x5598,0x559E,0x55AE,0x557C,0x5583,0x55A9, + 0x5587,0x55A8,0x55DA,0x55C5,0x55DF,0x55C4,0x55DC,0x55E4, + 0x55D4,0x5614,0x55F7,0x5616,0x55FE,0x55FD,0x561B,0x55F9, + 0x564E,0x5650,0x71DF,0x5634,0x5636,0x5632,0x5638,0x566B, + 0x5664,0x562F,0x566C,0x566A,0x5686,0x5680,0x568A,0x56A0, + 0x5694,0x568F,0x56A5,0x56AE,0x56B6,0x56B4,0x56C2,0x56BC, + 0x56C1,0x56C3,0x56C0,0x56C8,0x56CE,0x56D1,0x56D3,0x56D7, + 0x56EE,0x56F9,0x5700,0x56FF,0x5704,0x5709, + /* Range 0x5421 - 0x547E, array index: 0x101A */ + 0x5708,0x570B,0x570D,0x5713,0x5718,0x5716,0x55C7,0x571C, + 0x5726,0x5737,0x5738,0x574E,0x573B,0x5740,0x574F,0x5769, + 0x57C0,0x5788,0x5761,0x577F,0x5789,0x5793,0x57A0,0x57B3, + 0x57A4,0x57AA,0x57B0,0x57C3,0x57C6,0x57D4,0x57D2,0x57D3, + 0x580A,0x57D6,0x57E3,0x580B,0x5819,0x581D,0x5872,0x5821, + 0x5862,0x584B,0x5870,0x6BC0,0x5852,0x583D,0x5879,0x5885, + 0x58B9,0x589F,0x58AB,0x58BA,0x58DE,0x58BB,0x58B8,0x58AE, + 0x58C5,0x58D3,0x58D1,0x58D7,0x58D9,0x58D8,0x58E5,0x58DC, + 0x58E4,0x58DF,0x58EF,0x58FA,0x58F9,0x58FB,0x58FC,0x58FD, + 0x5902,0x590A,0x5910,0x591B,0x68A6,0x5925,0x592C,0x592D, + 0x5932,0x5938,0x593E,0x7AD2,0x5955,0x5950,0x594E,0x595A, + 0x5958,0x5962,0x5960,0x5967,0x596C,0x5969, + /* Range 0x5521 - 0x557E, array index: 0x1078 */ + 0x5978,0x5981,0x599D,0x4F5E,0x4FAB,0x59A3,0x59B2,0x59C6, + 0x59E8,0x59DC,0x598D,0x59D9,0x59DA,0x5A25,0x5A1F,0x5A11, + 0x5A1C,0x5A09,0x5A1A,0x5A40,0x5A6C,0x5A49,0x5A35,0x5A36, + 0x5A62,0x5A6A,0x5A9A,0x5ABC,0x5ABE,0x5ACB,0x5AC2,0x5ABD, + 0x5AE3,0x5AD7,0x5AE6,0x5AE9,0x5AD6,0x5AFA,0x5AFB,0x5B0C, + 0x5B0B,0x5B16,0x5B32,0x5AD0,0x5B2A,0x5B36,0x5B3E,0x5B43, + 0x5B45,0x5B40,0x5B51,0x5B55,0x5B5A,0x5B5B,0x5B65,0x5B69, + 0x5B70,0x5B73,0x5B75,0x5B78,0x6588,0x5B7A,0x5B80,0x5B83, + 0x5BA6,0x5BB8,0x5BC3,0x5BC7,0x5BC9,0x5BD4,0x5BD0,0x5BE4, + 0x5BE6,0x5BE2,0x5BDE,0x5BE5,0x5BEB,0x5BF0,0x5BF6,0x5BF3, + 0x5C05,0x5C07,0x5C08,0x5C0D,0x5C13,0x5C20,0x5C22,0x5C28, + 0x5C38,0x5C39,0x5C41,0x5C46,0x5C4E,0x5C53, + /* Range 0x5621 - 0x567E, array index: 0x10D6 */ + 0x5C50,0x5C4F,0x5B71,0x5C6C,0x5C6E,0x4E62,0x5C76,0x5C79, + 0x5C8C,0x5C91,0x5C94,0x599B,0x5CAB,0x5CBB,0x5CB6,0x5CBC, + 0x5CB7,0x5CC5,0x5CBE,0x5CC7,0x5CD9,0x5CE9,0x5CFD,0x5CFA, + 0x5CED,0x5D8C,0x5CEA,0x5D0B,0x5D15,0x5D17,0x5D5C,0x5D1F, + 0x5D1B,0x5D11,0x5D14,0x5D22,0x5D1A,0x5D19,0x5D18,0x5D4C, + 0x5D52,0x5D4E,0x5D4B,0x5D6C,0x5D73,0x5D76,0x5D87,0x5D84, + 0x5D82,0x5DA2,0x5D9D,0x5DAC,0x5DAE,0x5DBD,0x5D90,0x5DB7, + 0x5DBC,0x5DC9,0x5DCD,0x5DD3,0x5DD2,0x5DD6,0x5DDB,0x5DEB, + 0x5DF2,0x5DF5,0x5E0B,0x5E1A,0x5E19,0x5E11,0x5E1B,0x5E36, + 0x5E37,0x5E44,0x5E43,0x5E40,0x5E4E,0x5E57,0x5E54,0x5E5F, + 0x5E62,0x5E64,0x5E47,0x5E75,0x5E76,0x5E7A,0x9EBC,0x5E7F, + 0x5EA0,0x5EC1,0x5EC2,0x5EC8,0x5ED0,0x5ECF, + /* Range 0x5721 - 0x577E, array index: 0x1134 */ + 0x5ED6,0x5EE3,0x5EDD,0x5EDA,0x5EDB,0x5EE2,0x5EE1,0x5EE8, + 0x5EE9,0x5EEC,0x5EF1,0x5EF3,0x5EF0,0x5EF4,0x5EF8,0x5EFE, + 0x5F03,0x5F09,0x5F5D,0x5F5C,0x5F0B,0x5F11,0x5F16,0x5F29, + 0x5F2D,0x5F38,0x5F41,0x5F48,0x5F4C,0x5F4E,0x5F2F,0x5F51, + 0x5F56,0x5F57,0x5F59,0x5F61,0x5F6D,0x5F73,0x5F77,0x5F83, + 0x5F82,0x5F7F,0x5F8A,0x5F88,0x5F91,0x5F87,0x5F9E,0x5F99, + 0x5F98,0x5FA0,0x5FA8,0x5FAD,0x5FBC,0x5FD6,0x5FFB,0x5FE4, + 0x5FF8,0x5FF1,0x5FDD,0x60B3,0x5FFF,0x6021,0x6060,0x6019, + 0x6010,0x6029,0x600E,0x6031,0x601B,0x6015,0x602B,0x6026, + 0x600F,0x603A,0x605A,0x6041,0x606A,0x6077,0x605F,0x604A, + 0x6046,0x604D,0x6063,0x6043,0x6064,0x6042,0x606C,0x606B, + 0x6059,0x6081,0x608D,0x60E7,0x6083,0x609A, + /* Range 0x5821 - 0x587E, array index: 0x1192 */ + 0x6084,0x609B,0x6096,0x6097,0x6092,0x60A7,0x608B,0x60E1, + 0x60B8,0x60E0,0x60D3,0x60B4,0x5FF0,0x60BD,0x60C6,0x60B5, + 0x60D8,0x614D,0x6115,0x6106,0x60F6,0x60F7,0x6100,0x60F4, + 0x60FA,0x6103,0x6121,0x60FB,0x60F1,0x610D,0x610E,0x6147, + 0x613E,0x6128,0x6127,0x614A,0x613F,0x613C,0x612C,0x6134, + 0x613D,0x6142,0x6144,0x6173,0x6177,0x6158,0x6159,0x615A, + 0x616B,0x6174,0x616F,0x6165,0x6171,0x615F,0x615D,0x6153, + 0x6175,0x6199,0x6196,0x6187,0x61AC,0x6194,0x619A,0x618A, + 0x6191,0x61AB,0x61AE,0x61CC,0x61CA,0x61C9,0x61F7,0x61C8, + 0x61C3,0x61C6,0x61BA,0x61CB,0x7F79,0x61CD,0x61E6,0x61E3, + 0x61F6,0x61FA,0x61F4,0x61FF,0x61FD,0x61FC,0x61FE,0x6200, + 0x6208,0x6209,0x620D,0x620C,0x6214,0x621B, + /* Range 0x5921 - 0x597E, array index: 0x11F0 */ + 0x621E,0x6221,0x622A,0x622E,0x6230,0x6232,0x6233,0x6241, + 0x624E,0x625E,0x6263,0x625B,0x6260,0x6268,0x627C,0x6282, + 0x6289,0x627E,0x6292,0x6293,0x6296,0x62D4,0x6283,0x6294, + 0x62D7,0x62D1,0x62BB,0x62CF,0x62FF,0x62C6,0x64D4,0x62C8, + 0x62DC,0x62CC,0x62CA,0x62C2,0x62C7,0x629B,0x62C9,0x630C, + 0x62EE,0x62F1,0x6327,0x6302,0x6308,0x62EF,0x62F5,0x6350, + 0x633E,0x634D,0x641C,0x634F,0x6396,0x638E,0x6380,0x63AB, + 0x6376,0x63A3,0x638F,0x6389,0x639F,0x63B5,0x636B,0x6369, + 0x63BE,0x63E9,0x63C0,0x63C6,0x63E3,0x63C9,0x63D2,0x63F6, + 0x63C4,0x6416,0x6434,0x6406,0x6413,0x6426,0x6436,0x651D, + 0x6417,0x6428,0x640F,0x6467,0x646F,0x6476,0x644E,0x652A, + 0x6495,0x6493,0x64A5,0x64A9,0x6488,0x64BC, + /* Range 0x5A21 - 0x5A7E, array index: 0x124E */ + 0x64DA,0x64D2,0x64C5,0x64C7,0x64BB,0x64D8,0x64C2,0x64F1, + 0x64E7,0x8209,0x64E0,0x64E1,0x62AC,0x64E3,0x64EF,0x652C, + 0x64F6,0x64F4,0x64F2,0x64FA,0x6500,0x64FD,0x6518,0x651C, + 0x6505,0x6524,0x6523,0x652B,0x6534,0x6535,0x6537,0x6536, + 0x6538,0x754B,0x6548,0x6556,0x6555,0x654D,0x6558,0x655E, + 0x655D,0x6572,0x6578,0x6582,0x6583,0x8B8A,0x659B,0x659F, + 0x65AB,0x65B7,0x65C3,0x65C6,0x65C1,0x65C4,0x65CC,0x65D2, + 0x65DB,0x65D9,0x65E0,0x65E1,0x65F1,0x6772,0x660A,0x6603, + 0x65FB,0x6773,0x6635,0x6636,0x6634,0x661C,0x664F,0x6644, + 0x6649,0x6641,0x665E,0x665D,0x6664,0x6667,0x6668,0x665F, + 0x6662,0x6670,0x6683,0x6688,0x668E,0x6689,0x6684,0x6698, + 0x669D,0x66C1,0x66B9,0x66C9,0x66BE,0x66BC, + /* Range 0x5B21 - 0x5B7E, array index: 0x12AC */ + 0x66C4,0x66B8,0x66D6,0x66DA,0x66E0,0x663F,0x66E6,0x66E9, + 0x66F0,0x66F5,0x66F7,0x670F,0x6716,0x671E,0x6726,0x6727, + 0x9738,0x672E,0x673F,0x6736,0x6741,0x6738,0x6737,0x6746, + 0x675E,0x6760,0x6759,0x6763,0x6764,0x6789,0x6770,0x67A9, + 0x677C,0x676A,0x678C,0x678B,0x67A6,0x67A1,0x6785,0x67B7, + 0x67EF,0x67B4,0x67EC,0x67B3,0x67E9,0x67B8,0x67E4,0x67DE, + 0x67DD,0x67E2,0x67EE,0x67B9,0x67CE,0x67C6,0x67E7,0x6A9C, + 0x681E,0x6846,0x6829,0x6840,0x684D,0x6832,0x684E,0x68B3, + 0x682B,0x6859,0x6863,0x6877,0x687F,0x689F,0x688F,0x68AD, + 0x6894,0x689D,0x689B,0x6883,0x6AAE,0x68B9,0x6874,0x68B5, + 0x68A0,0x68BA,0x690F,0x688D,0x687E,0x6901,0x68CA,0x6908, + 0x68D8,0x6922,0x6926,0x68E1,0x690C,0x68CD, + /* Range 0x5C21 - 0x5C7E, array index: 0x130A */ + 0x68D4,0x68E7,0x68D5,0x6936,0x6912,0x6904,0x68D7,0x68E3, + 0x6925,0x68F9,0x68E0,0x68EF,0x6928,0x692A,0x691A,0x6923, + 0x6921,0x68C6,0x6979,0x6977,0x695C,0x6978,0x696B,0x6954, + 0x697E,0x696E,0x6939,0x6974,0x693D,0x6959,0x6930,0x6961, + 0x695E,0x695D,0x6981,0x696A,0x69B2,0x69AE,0x69D0,0x69BF, + 0x69C1,0x69D3,0x69BE,0x69CE,0x5BE8,0x69CA,0x69DD,0x69BB, + 0x69C3,0x69A7,0x6A2E,0x6991,0x69A0,0x699C,0x6995,0x69B4, + 0x69DE,0x69E8,0x6A02,0x6A1B,0x69FF,0x6B0A,0x69F9,0x69F2, + 0x69E7,0x6A05,0x69B1,0x6A1E,0x69ED,0x6A14,0x69EB,0x6A0A, + 0x6A12,0x6AC1,0x6A23,0x6A13,0x6A44,0x6A0C,0x6A72,0x6A36, + 0x6A78,0x6A47,0x6A62,0x6A59,0x6A66,0x6A48,0x6A38,0x6A22, + 0x6A90,0x6A8D,0x6AA0,0x6A84,0x6AA2,0x6AA3, + /* Range 0x5D21 - 0x5D7E, array index: 0x1368 */ + 0x6A97,0x8617,0x6ABB,0x6AC3,0x6AC2,0x6AB8,0x6AB3,0x6AAC, + 0x6ADE,0x6AD1,0x6ADF,0x6AAA,0x6ADA,0x6AEA,0x6AFB,0x6B05, + 0x8616,0x6AFA,0x6B12,0x6B16,0x9B31,0x6B1F,0x6B38,0x6B37, + 0x76DC,0x6B39,0x98EE,0x6B47,0x6B43,0x6B49,0x6B50,0x6B59, + 0x6B54,0x6B5B,0x6B5F,0x6B61,0x6B78,0x6B79,0x6B7F,0x6B80, + 0x6B84,0x6B83,0x6B8D,0x6B98,0x6B95,0x6B9E,0x6BA4,0x6BAA, + 0x6BAB,0x6BAF,0x6BB2,0x6BB1,0x6BB3,0x6BB7,0x6BBC,0x6BC6, + 0x6BCB,0x6BD3,0x6BDF,0x6BEC,0x6BEB,0x6BF3,0x6BEF,0x9EBE, + 0x6C08,0x6C13,0x6C14,0x6C1B,0x6C24,0x6C23,0x6C5E,0x6C55, + 0x6C62,0x6C6A,0x6C82,0x6C8D,0x6C9A,0x6C81,0x6C9B,0x6C7E, + 0x6C68,0x6C73,0x6C92,0x6C90,0x6CC4,0x6CF1,0x6CD3,0x6CBD, + 0x6CD7,0x6CC5,0x6CDD,0x6CAE,0x6CB1,0x6CBE, + /* Range 0x5E21 - 0x5E7E, array index: 0x13C6 */ + 0x6CBA,0x6CDB,0x6CEF,0x6CD9,0x6CEA,0x6D1F,0x884D,0x6D36, + 0x6D2B,0x6D3D,0x6D38,0x6D19,0x6D35,0x6D33,0x6D12,0x6D0C, + 0x6D63,0x6D93,0x6D64,0x6D5A,0x6D79,0x6D59,0x6D8E,0x6D95, + 0x6FE4,0x6D85,0x6DF9,0x6E15,0x6E0A,0x6DB5,0x6DC7,0x6DE6, + 0x6DB8,0x6DC6,0x6DEC,0x6DDE,0x6DCC,0x6DE8,0x6DD2,0x6DC5, + 0x6DFA,0x6DD9,0x6DE4,0x6DD5,0x6DEA,0x6DEE,0x6E2D,0x6E6E, + 0x6E2E,0x6E19,0x6E72,0x6E5F,0x6E3E,0x6E23,0x6E6B,0x6E2B, + 0x6E76,0x6E4D,0x6E1F,0x6E43,0x6E3A,0x6E4E,0x6E24,0x6EFF, + 0x6E1D,0x6E38,0x6E82,0x6EAA,0x6E98,0x6EC9,0x6EB7,0x6ED3, + 0x6EBD,0x6EAF,0x6EC4,0x6EB2,0x6ED4,0x6ED5,0x6E8F,0x6EA5, + 0x6EC2,0x6E9F,0x6F41,0x6F11,0x704C,0x6EEC,0x6EF8,0x6EFE, + 0x6F3F,0x6EF2,0x6F31,0x6EEF,0x6F32,0x6ECC, + /* Range 0x5F21 - 0x5F7E, array index: 0x1424 */ + 0x6F3E,0x6F13,0x6EF7,0x6F86,0x6F7A,0x6F78,0x6F81,0x6F80, + 0x6F6F,0x6F5B,0x6FF3,0x6F6D,0x6F82,0x6F7C,0x6F58,0x6F8E, + 0x6F91,0x6FC2,0x6F66,0x6FB3,0x6FA3,0x6FA1,0x6FA4,0x6FB9, + 0x6FC6,0x6FAA,0x6FDF,0x6FD5,0x6FEC,0x6FD4,0x6FD8,0x6FF1, + 0x6FEE,0x6FDB,0x7009,0x700B,0x6FFA,0x7011,0x7001,0x700F, + 0x6FFE,0x701B,0x701A,0x6F74,0x701D,0x7018,0x701F,0x7030, + 0x703E,0x7032,0x7051,0x7063,0x7099,0x7092,0x70AF,0x70F1, + 0x70AC,0x70B8,0x70B3,0x70AE,0x70DF,0x70CB,0x70DD,0x70D9, + 0x7109,0x70FD,0x711C,0x7119,0x7165,0x7155,0x7188,0x7166, + 0x7162,0x714C,0x7156,0x716C,0x718F,0x71FB,0x7184,0x7195, + 0x71A8,0x71AC,0x71D7,0x71B9,0x71BE,0x71D2,0x71C9,0x71D4, + 0x71CE,0x71E0,0x71EC,0x71E7,0x71F5,0x71FC, + /* Range 0x6021 - 0x607E, array index: 0x1482 */ + 0x71F9,0x71FF,0x720D,0x7210,0x721B,0x7228,0x722D,0x722C, + 0x7230,0x7232,0x723B,0x723C,0x723F,0x7240,0x7246,0x724B, + 0x7258,0x7274,0x727E,0x7282,0x7281,0x7287,0x7292,0x7296, + 0x72A2,0x72A7,0x72B9,0x72B2,0x72C3,0x72C6,0x72C4,0x72CE, + 0x72D2,0x72E2,0x72E0,0x72E1,0x72F9,0x72F7,0x500F,0x7317, + 0x730A,0x731C,0x7316,0x731D,0x7334,0x732F,0x7329,0x7325, + 0x733E,0x734E,0x734F,0x9ED8,0x7357,0x736A,0x7368,0x7370, + 0x7378,0x7375,0x737B,0x737A,0x73C8,0x73B3,0x73CE,0x73BB, + 0x73C0,0x73E5,0x73EE,0x73DE,0x74A2,0x7405,0x746F,0x7425, + 0x73F8,0x7432,0x743A,0x7455,0x743F,0x745F,0x7459,0x7441, + 0x745C,0x7469,0x7470,0x7463,0x746A,0x7476,0x747E,0x748B, + 0x749E,0x74A7,0x74CA,0x74CF,0x74D4,0x73F1, + /* Range 0x6121 - 0x617E, array index: 0x14E0 */ + 0x74E0,0x74E3,0x74E7,0x74E9,0x74EE,0x74F2,0x74F0,0x74F1, + 0x74F8,0x74F7,0x7504,0x7503,0x7505,0x750C,0x750E,0x750D, + 0x7515,0x7513,0x751E,0x7526,0x752C,0x753C,0x7544,0x754D, + 0x754A,0x7549,0x755B,0x7546,0x755A,0x7569,0x7564,0x7567, + 0x756B,0x756D,0x7578,0x7576,0x7586,0x7587,0x7574,0x758A, + 0x7589,0x7582,0x7594,0x759A,0x759D,0x75A5,0x75A3,0x75C2, + 0x75B3,0x75C3,0x75B5,0x75BD,0x75B8,0x75BC,0x75B1,0x75CD, + 0x75CA,0x75D2,0x75D9,0x75E3,0x75DE,0x75FE,0x75FF,0x75FC, + 0x7601,0x75F0,0x75FA,0x75F2,0x75F3,0x760B,0x760D,0x7609, + 0x761F,0x7627,0x7620,0x7621,0x7622,0x7624,0x7634,0x7630, + 0x763B,0x7647,0x7648,0x7646,0x765C,0x7658,0x7661,0x7662, + 0x7668,0x7669,0x766A,0x7667,0x766C,0x7670, + /* Range 0x6221 - 0x627E, array index: 0x153E */ + 0x7672,0x7676,0x7678,0x767C,0x7680,0x7683,0x7688,0x768B, + 0x768E,0x7696,0x7693,0x7699,0x769A,0x76B0,0x76B4,0x76B8, + 0x76B9,0x76BA,0x76C2,0x76CD,0x76D6,0x76D2,0x76DE,0x76E1, + 0x76E5,0x76E7,0x76EA,0x862F,0x76FB,0x7708,0x7707,0x7704, + 0x7729,0x7724,0x771E,0x7725,0x7726,0x771B,0x7737,0x7738, + 0x7747,0x775A,0x7768,0x776B,0x775B,0x7765,0x777F,0x777E, + 0x7779,0x778E,0x778B,0x7791,0x77A0,0x779E,0x77B0,0x77B6, + 0x77B9,0x77BF,0x77BC,0x77BD,0x77BB,0x77C7,0x77CD,0x77D7, + 0x77DA,0x77DC,0x77E3,0x77EE,0x77FC,0x780C,0x7812,0x7926, + 0x7820,0x792A,0x7845,0x788E,0x7874,0x7886,0x787C,0x789A, + 0x788C,0x78A3,0x78B5,0x78AA,0x78AF,0x78D1,0x78C6,0x78CB, + 0x78D4,0x78BE,0x78BC,0x78C5,0x78CA,0x78EC, + /* Range 0x6321 - 0x637E, array index: 0x159C */ + 0x78E7,0x78DA,0x78FD,0x78F4,0x7907,0x7912,0x7911,0x7919, + 0x792C,0x792B,0x7940,0x7960,0x7957,0x795F,0x795A,0x7955, + 0x7953,0x797A,0x797F,0x798A,0x799D,0x79A7,0x9F4B,0x79AA, + 0x79AE,0x79B3,0x79B9,0x79BA,0x79C9,0x79D5,0x79E7,0x79EC, + 0x79E1,0x79E3,0x7A08,0x7A0D,0x7A18,0x7A19,0x7A20,0x7A1F, + 0x7980,0x7A31,0x7A3B,0x7A3E,0x7A37,0x7A43,0x7A57,0x7A49, + 0x7A61,0x7A62,0x7A69,0x9F9D,0x7A70,0x7A79,0x7A7D,0x7A88, + 0x7A97,0x7A95,0x7A98,0x7A96,0x7AA9,0x7AC8,0x7AB0,0x7AB6, + 0x7AC5,0x7AC4,0x7ABF,0x9083,0x7AC7,0x7ACA,0x7ACD,0x7ACF, + 0x7AD5,0x7AD3,0x7AD9,0x7ADA,0x7ADD,0x7AE1,0x7AE2,0x7AE6, + 0x7AED,0x7AF0,0x7B02,0x7B0F,0x7B0A,0x7B06,0x7B33,0x7B18, + 0x7B19,0x7B1E,0x7B35,0x7B28,0x7B36,0x7B50, + /* Range 0x6421 - 0x647E, array index: 0x15FA */ + 0x7B7A,0x7B04,0x7B4D,0x7B0B,0x7B4C,0x7B45,0x7B75,0x7B65, + 0x7B74,0x7B67,0x7B70,0x7B71,0x7B6C,0x7B6E,0x7B9D,0x7B98, + 0x7B9F,0x7B8D,0x7B9C,0x7B9A,0x7B8B,0x7B92,0x7B8F,0x7B5D, + 0x7B99,0x7BCB,0x7BC1,0x7BCC,0x7BCF,0x7BB4,0x7BC6,0x7BDD, + 0x7BE9,0x7C11,0x7C14,0x7BE6,0x7BE5,0x7C60,0x7C00,0x7C07, + 0x7C13,0x7BF3,0x7BF7,0x7C17,0x7C0D,0x7BF6,0x7C23,0x7C27, + 0x7C2A,0x7C1F,0x7C37,0x7C2B,0x7C3D,0x7C4C,0x7C43,0x7C54, + 0x7C4F,0x7C40,0x7C50,0x7C58,0x7C5F,0x7C64,0x7C56,0x7C65, + 0x7C6C,0x7C75,0x7C83,0x7C90,0x7CA4,0x7CAD,0x7CA2,0x7CAB, + 0x7CA1,0x7CA8,0x7CB3,0x7CB2,0x7CB1,0x7CAE,0x7CB9,0x7CBD, + 0x7CC0,0x7CC5,0x7CC2,0x7CD8,0x7CD2,0x7CDC,0x7CE2,0x9B3B, + 0x7CEF,0x7CF2,0x7CF4,0x7CF6,0x7CFA,0x7D06, + /* Range 0x6521 - 0x657E, array index: 0x1658 */ + 0x7D02,0x7D1C,0x7D15,0x7D0A,0x7D45,0x7D4B,0x7D2E,0x7D32, + 0x7D3F,0x7D35,0x7D46,0x7D73,0x7D56,0x7D4E,0x7D72,0x7D68, + 0x7D6E,0x7D4F,0x7D63,0x7D93,0x7D89,0x7D5B,0x7D8F,0x7D7D, + 0x7D9B,0x7DBA,0x7DAE,0x7DA3,0x7DB5,0x7DC7,0x7DBD,0x7DAB, + 0x7E3D,0x7DA2,0x7DAF,0x7DDC,0x7DB8,0x7D9F,0x7DB0,0x7DD8, + 0x7DDD,0x7DE4,0x7DDE,0x7DFB,0x7DF2,0x7DE1,0x7E05,0x7E0A, + 0x7E23,0x7E21,0x7E12,0x7E31,0x7E1F,0x7E09,0x7E0B,0x7E22, + 0x7E46,0x7E66,0x7E3B,0x7E35,0x7E39,0x7E43,0x7E37,0x7E32, + 0x7E3A,0x7E67,0x7E5D,0x7E56,0x7E5E,0x7E59,0x7E5A,0x7E79, + 0x7E6A,0x7E69,0x7E7C,0x7E7B,0x7E83,0x7DD5,0x7E7D,0x8FAE, + 0x7E7F,0x7E88,0x7E89,0x7E8C,0x7E92,0x7E90,0x7E93,0x7E94, + 0x7E96,0x7E8E,0x7E9B,0x7E9C,0x7F38,0x7F3A, + /* Range 0x6621 - 0x667E, array index: 0x16B6 */ + 0x7F45,0x7F4C,0x7F4D,0x7F4E,0x7F50,0x7F51,0x7F55,0x7F54, + 0x7F58,0x7F5F,0x7F60,0x7F68,0x7F69,0x7F67,0x7F78,0x7F82, + 0x7F86,0x7F83,0x7F88,0x7F87,0x7F8C,0x7F94,0x7F9E,0x7F9D, + 0x7F9A,0x7FA3,0x7FAF,0x7FB2,0x7FB9,0x7FAE,0x7FB6,0x7FB8, + 0x8B71,0x7FC5,0x7FC6,0x7FCA,0x7FD5,0x7FD4,0x7FE1,0x7FE6, + 0x7FE9,0x7FF3,0x7FF9,0x98DC,0x8006,0x8004,0x800B,0x8012, + 0x8018,0x8019,0x801C,0x8021,0x8028,0x803F,0x803B,0x804A, + 0x8046,0x8052,0x8058,0x805A,0x805F,0x8062,0x8068,0x8073, + 0x8072,0x8070,0x8076,0x8079,0x807D,0x807F,0x8084,0x8086, + 0x8085,0x809B,0x8093,0x809A,0x80AD,0x5190,0x80AC,0x80DB, + 0x80E5,0x80D9,0x80DD,0x80C4,0x80DA,0x80D6,0x8109,0x80EF, + 0x80F1,0x811B,0x8129,0x8123,0x812F,0x814B, + /* Range 0x6721 - 0x677E, array index: 0x1714 */ + 0x968B,0x8146,0x813E,0x8153,0x8151,0x80FC,0x8171,0x816E, + 0x8165,0x8166,0x8174,0x8183,0x8188,0x818A,0x8180,0x8182, + 0x81A0,0x8195,0x81A4,0x81A3,0x815F,0x8193,0x81A9,0x81B0, + 0x81B5,0x81BE,0x81B8,0x81BD,0x81C0,0x81C2,0x81BA,0x81C9, + 0x81CD,0x81D1,0x81D9,0x81D8,0x81C8,0x81DA,0x81DF,0x81E0, + 0x81E7,0x81FA,0x81FB,0x81FE,0x8201,0x8202,0x8205,0x8207, + 0x820A,0x820D,0x8210,0x8216,0x8229,0x822B,0x8238,0x8233, + 0x8240,0x8259,0x8258,0x825D,0x825A,0x825F,0x8264,0x8262, + 0x8268,0x826A,0x826B,0x822E,0x8271,0x8277,0x8278,0x827E, + 0x828D,0x8292,0x82AB,0x829F,0x82BB,0x82AC,0x82E1,0x82E3, + 0x82DF,0x82D2,0x82F4,0x82F3,0x82FA,0x8393,0x8303,0x82FB, + 0x82F9,0x82DE,0x8306,0x82DC,0x8309,0x82D9, + /* Range 0x6821 - 0x687E, array index: 0x1772 */ + 0x8335,0x8334,0x8316,0x8332,0x8331,0x8340,0x8339,0x8350, + 0x8345,0x832F,0x832B,0x8317,0x8318,0x8385,0x839A,0x83AA, + 0x839F,0x83A2,0x8396,0x8323,0x838E,0x8387,0x838A,0x837C, + 0x83B5,0x8373,0x8375,0x83A0,0x8389,0x83A8,0x83F4,0x8413, + 0x83EB,0x83CE,0x83FD,0x8403,0x83D8,0x840B,0x83C1,0x83F7, + 0x8407,0x83E0,0x83F2,0x840D,0x8422,0x8420,0x83BD,0x8438, + 0x8506,0x83FB,0x846D,0x842A,0x843C,0x855A,0x8484,0x8477, + 0x846B,0x84AD,0x846E,0x8482,0x8469,0x8446,0x842C,0x846F, + 0x8479,0x8435,0x84CA,0x8462,0x84B9,0x84BF,0x849F,0x84D9, + 0x84CD,0x84BB,0x84DA,0x84D0,0x84C1,0x84C6,0x84D6,0x84A1, + 0x8521,0x84FF,0x84F4,0x8517,0x8518,0x852C,0x851F,0x8515, + 0x8514,0x84FC,0x8540,0x8563,0x8558,0x8548, + /* Range 0x6921 - 0x697E, array index: 0x17D0 */ + 0x8541,0x8602,0x854B,0x8555,0x8580,0x85A4,0x8588,0x8591, + 0x858A,0x85A8,0x856D,0x8594,0x859B,0x85EA,0x8587,0x859C, + 0x8577,0x857E,0x8590,0x85C9,0x85BA,0x85CF,0x85B9,0x85D0, + 0x85D5,0x85DD,0x85E5,0x85DC,0x85F9,0x860A,0x8613,0x860B, + 0x85FE,0x85FA,0x8606,0x8622,0x861A,0x8630,0x863F,0x864D, + 0x4E55,0x8654,0x865F,0x8667,0x8671,0x8693,0x86A3,0x86A9, + 0x86AA,0x868B,0x868C,0x86B6,0x86AF,0x86C4,0x86C6,0x86B0, + 0x86C9,0x8823,0x86AB,0x86D4,0x86DE,0x86E9,0x86EC,0x86DF, + 0x86DB,0x86EF,0x8712,0x8706,0x8708,0x8700,0x8703,0x86FB, + 0x8711,0x8709,0x870D,0x86F9,0x870A,0x8734,0x873F,0x8737, + 0x873B,0x8725,0x8729,0x871A,0x8760,0x875F,0x8778,0x874C, + 0x874E,0x8774,0x8757,0x8768,0x876E,0x8759, + /* Range 0x6A21 - 0x6A7E, array index: 0x182E */ + 0x8753,0x8763,0x876A,0x8805,0x87A2,0x879F,0x8782,0x87AF, + 0x87CB,0x87BD,0x87C0,0x87D0,0x96D6,0x87AB,0x87C4,0x87B3, + 0x87C7,0x87C6,0x87BB,0x87EF,0x87F2,0x87E0,0x880F,0x880D, + 0x87FE,0x87F6,0x87F7,0x880E,0x87D2,0x8811,0x8816,0x8815, + 0x8822,0x8821,0x8831,0x8836,0x8839,0x8827,0x883B,0x8844, + 0x8842,0x8852,0x8859,0x885E,0x8862,0x886B,0x8881,0x887E, + 0x889E,0x8875,0x887D,0x88B5,0x8872,0x8882,0x8897,0x8892, + 0x88AE,0x8899,0x88A2,0x888D,0x88A4,0x88B0,0x88BF,0x88B1, + 0x88C3,0x88C4,0x88D4,0x88D8,0x88D9,0x88DD,0x88F9,0x8902, + 0x88FC,0x88F4,0x88E8,0x88F2,0x8904,0x890C,0x890A,0x8913, + 0x8943,0x891E,0x8925,0x892A,0x892B,0x8941,0x8944,0x893B, + 0x8936,0x8938,0x894C,0x891D,0x8960,0x895E, + /* Range 0x6B21 - 0x6B7E, array index: 0x188C */ + 0x8966,0x8964,0x896D,0x896A,0x896F,0x8974,0x8977,0x897E, + 0x8983,0x8988,0x898A,0x8993,0x8998,0x89A1,0x89A9,0x89A6, + 0x89AC,0x89AF,0x89B2,0x89BA,0x89BD,0x89BF,0x89C0,0x89DA, + 0x89DC,0x89DD,0x89E7,0x89F4,0x89F8,0x8A03,0x8A16,0x8A10, + 0x8A0C,0x8A1B,0x8A1D,0x8A25,0x8A36,0x8A41,0x8A5B,0x8A52, + 0x8A46,0x8A48,0x8A7C,0x8A6D,0x8A6C,0x8A62,0x8A85,0x8A82, + 0x8A84,0x8AA8,0x8AA1,0x8A91,0x8AA5,0x8AA6,0x8A9A,0x8AA3, + 0x8AC4,0x8ACD,0x8AC2,0x8ADA,0x8AEB,0x8AF3,0x8AE7,0x8AE4, + 0x8AF1,0x8B14,0x8AE0,0x8AE2,0x8AF7,0x8ADE,0x8ADB,0x8B0C, + 0x8B07,0x8B1A,0x8AE1,0x8B16,0x8B10,0x8B17,0x8B20,0x8B33, + 0x97AB,0x8B26,0x8B2B,0x8B3E,0x8B28,0x8B41,0x8B4C,0x8B4F, + 0x8B4E,0x8B49,0x8B56,0x8B5B,0x8B5A,0x8B6B, + /* Range 0x6C21 - 0x6C7E, array index: 0x18EA */ + 0x8B5F,0x8B6C,0x8B6F,0x8B74,0x8B7D,0x8B80,0x8B8C,0x8B8E, + 0x8B92,0x8B93,0x8B96,0x8B99,0x8B9A,0x8C3A,0x8C41,0x8C3F, + 0x8C48,0x8C4C,0x8C4E,0x8C50,0x8C55,0x8C62,0x8C6C,0x8C78, + 0x8C7A,0x8C82,0x8C89,0x8C85,0x8C8A,0x8C8D,0x8C8E,0x8C94, + 0x8C7C,0x8C98,0x621D,0x8CAD,0x8CAA,0x8CBD,0x8CB2,0x8CB3, + 0x8CAE,0x8CB6,0x8CC8,0x8CC1,0x8CE4,0x8CE3,0x8CDA,0x8CFD, + 0x8CFA,0x8CFB,0x8D04,0x8D05,0x8D0A,0x8D07,0x8D0F,0x8D0D, + 0x8D10,0x9F4E,0x8D13,0x8CCD,0x8D14,0x8D16,0x8D67,0x8D6D, + 0x8D71,0x8D73,0x8D81,0x8D99,0x8DC2,0x8DBE,0x8DBA,0x8DCF, + 0x8DDA,0x8DD6,0x8DCC,0x8DDB,0x8DCB,0x8DEA,0x8DEB,0x8DDF, + 0x8DE3,0x8DFC,0x8E08,0x8E09,0x8DFF,0x8E1D,0x8E1E,0x8E10, + 0x8E1F,0x8E42,0x8E35,0x8E30,0x8E34,0x8E4A, + /* Range 0x6D21 - 0x6D7E, array index: 0x1948 */ + 0x8E47,0x8E49,0x8E4C,0x8E50,0x8E48,0x8E59,0x8E64,0x8E60, + 0x8E2A,0x8E63,0x8E55,0x8E76,0x8E72,0x8E7C,0x8E81,0x8E87, + 0x8E85,0x8E84,0x8E8B,0x8E8A,0x8E93,0x8E91,0x8E94,0x8E99, + 0x8EAA,0x8EA1,0x8EAC,0x8EB0,0x8EC6,0x8EB1,0x8EBE,0x8EC5, + 0x8EC8,0x8ECB,0x8EDB,0x8EE3,0x8EFC,0x8EFB,0x8EEB,0x8EFE, + 0x8F0A,0x8F05,0x8F15,0x8F12,0x8F19,0x8F13,0x8F1C,0x8F1F, + 0x8F1B,0x8F0C,0x8F26,0x8F33,0x8F3B,0x8F39,0x8F45,0x8F42, + 0x8F3E,0x8F4C,0x8F49,0x8F46,0x8F4E,0x8F57,0x8F5C,0x8F62, + 0x8F63,0x8F64,0x8F9C,0x8F9F,0x8FA3,0x8FAD,0x8FAF,0x8FB7, + 0x8FDA,0x8FE5,0x8FE2,0x8FEA,0x8FEF,0x9087,0x8FF4,0x9005, + 0x8FF9,0x8FFA,0x9011,0x9015,0x9021,0x900D,0x901E,0x9016, + 0x900B,0x9027,0x9036,0x9035,0x9039,0x8FF8, + /* Range 0x6E21 - 0x6E7E, array index: 0x19A6 */ + 0x904F,0x9050,0x9051,0x9052,0x900E,0x9049,0x903E,0x9056, + 0x9058,0x905E,0x9068,0x906F,0x9076,0x96A8,0x9072,0x9082, + 0x907D,0x9081,0x9080,0x908A,0x9089,0x908F,0x90A8,0x90AF, + 0x90B1,0x90B5,0x90E2,0x90E4,0x6248,0x90DB,0x9102,0x9112, + 0x9119,0x9132,0x9130,0x914A,0x9156,0x9158,0x9163,0x9165, + 0x9169,0x9173,0x9172,0x918B,0x9189,0x9182,0x91A2,0x91AB, + 0x91AF,0x91AA,0x91B5,0x91B4,0x91BA,0x91C0,0x91C1,0x91C9, + 0x91CB,0x91D0,0x91D6,0x91DF,0x91E1,0x91DB,0x91FC,0x91F5, + 0x91F6,0x921E,0x91FF,0x9214,0x922C,0x9215,0x9211,0x925E, + 0x9257,0x9245,0x9249,0x9264,0x9248,0x9295,0x923F,0x924B, + 0x9250,0x929C,0x9296,0x9293,0x929B,0x925A,0x92CF,0x92B9, + 0x92B7,0x92E9,0x930F,0x92FA,0x9344,0x932E, + /* Range 0x6F21 - 0x6F7E, array index: 0x1A04 */ + 0x9319,0x9322,0x931A,0x9323,0x933A,0x9335,0x933B,0x935C, + 0x9360,0x937C,0x936E,0x9356,0x93B0,0x93AC,0x93AD,0x9394, + 0x93B9,0x93D6,0x93D7,0x93E8,0x93E5,0x93D8,0x93C3,0x93DD, + 0x93D0,0x93C8,0x93E4,0x941A,0x9414,0x9413,0x9403,0x9407, + 0x9410,0x9436,0x942B,0x9435,0x9421,0x943A,0x9441,0x9452, + 0x9444,0x945B,0x9460,0x9462,0x945E,0x946A,0x9229,0x9470, + 0x9475,0x9477,0x947D,0x945A,0x947C,0x947E,0x9481,0x947F, + 0x9582,0x9587,0x958A,0x9594,0x9596,0x9598,0x9599,0x95A0, + 0x95A8,0x95A7,0x95AD,0x95BC,0x95BB,0x95B9,0x95BE,0x95CA, + 0x6FF6,0x95C3,0x95CD,0x95CC,0x95D5,0x95D4,0x95D6,0x95DC, + 0x95E1,0x95E5,0x95E2,0x9621,0x9628,0x962E,0x962F,0x9642, + 0x964C,0x964F,0x964B,0x9677,0x965C,0x965E, + /* Range 0x7021 - 0x707E, array index: 0x1A62 */ + 0x965D,0x965F,0x9666,0x9672,0x966C,0x968D,0x9698,0x9695, + 0x9697,0x96AA,0x96A7,0x96B1,0x96B2,0x96B0,0x96B4,0x96B6, + 0x96B8,0x96B9,0x96CE,0x96CB,0x96C9,0x96CD,0x894D,0x96DC, + 0x970D,0x96D5,0x96F9,0x9704,0x9706,0x9708,0x9713,0x970E, + 0x9711,0x970F,0x9716,0x9719,0x9724,0x972A,0x9730,0x9739, + 0x973D,0x973E,0x9744,0x9746,0x9748,0x9742,0x9749,0x975C, + 0x9760,0x9764,0x9766,0x9768,0x52D2,0x976B,0x9771,0x9779, + 0x9785,0x977C,0x9781,0x977A,0x9786,0x978B,0x978F,0x9790, + 0x979C,0x97A8,0x97A6,0x97A3,0x97B3,0x97B4,0x97C3,0x97C6, + 0x97C8,0x97CB,0x97DC,0x97ED,0x9F4F,0x97F2,0x7ADF,0x97F6, + 0x97F5,0x980F,0x980C,0x9838,0x9824,0x9821,0x9837,0x983D, + 0x9846,0x984F,0x984B,0x986B,0x986F,0x9870, + /* Range 0x7121 - 0x717E, array index: 0x1AC0 */ + 0x9871,0x9874,0x9873,0x98AA,0x98AF,0x98B1,0x98B6,0x98C4, + 0x98C3,0x98C6,0x98E9,0x98EB,0x9903,0x9909,0x9912,0x9914, + 0x9918,0x9921,0x991D,0x991E,0x9924,0x9920,0x992C,0x992E, + 0x993D,0x993E,0x9942,0x9949,0x9945,0x9950,0x994B,0x9951, + 0x9952,0x994C,0x9955,0x9997,0x9998,0x99A5,0x99AD,0x99AE, + 0x99BC,0x99DF,0x99DB,0x99DD,0x99D8,0x99D1,0x99ED,0x99EE, + 0x99F1,0x99F2,0x99FB,0x99F8,0x9A01,0x9A0F,0x9A05,0x99E2, + 0x9A19,0x9A2B,0x9A37,0x9A45,0x9A42,0x9A40,0x9A43,0x9A3E, + 0x9A55,0x9A4D,0x9A5B,0x9A57,0x9A5F,0x9A62,0x9A65,0x9A64, + 0x9A69,0x9A6B,0x9A6A,0x9AAD,0x9AB0,0x9ABC,0x9AC0,0x9ACF, + 0x9AD1,0x9AD3,0x9AD4,0x9ADE,0x9ADF,0x9AE2,0x9AE3,0x9AE6, + 0x9AEF,0x9AEB,0x9AEE,0x9AF4,0x9AF1,0x9AF7, + /* Range 0x7221 - 0x727E, array index: 0x1B1E */ + 0x9AFB,0x9B06,0x9B18,0x9B1A,0x9B1F,0x9B22,0x9B23,0x9B25, + 0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2E,0x9B2F,0x9B32,0x9B44, + 0x9B43,0x9B4F,0x9B4D,0x9B4E,0x9B51,0x9B58,0x9B74,0x9B93, + 0x9B83,0x9B91,0x9B96,0x9B97,0x9B9F,0x9BA0,0x9BA8,0x9BB4, + 0x9BC0,0x9BCA,0x9BB9,0x9BC6,0x9BCF,0x9BD1,0x9BD2,0x9BE3, + 0x9BE2,0x9BE4,0x9BD4,0x9BE1,0x9C3A,0x9BF2,0x9BF1,0x9BF0, + 0x9C15,0x9C14,0x9C09,0x9C13,0x9C0C,0x9C06,0x9C08,0x9C12, + 0x9C0A,0x9C04,0x9C2E,0x9C1B,0x9C25,0x9C24,0x9C21,0x9C30, + 0x9C47,0x9C32,0x9C46,0x9C3E,0x9C5A,0x9C60,0x9C67,0x9C76, + 0x9C78,0x9CE7,0x9CEC,0x9CF0,0x9D09,0x9D08,0x9CEB,0x9D03, + 0x9D06,0x9D2A,0x9D26,0x9DAF,0x9D23,0x9D1F,0x9D44,0x9D15, + 0x9D12,0x9D41,0x9D3F,0x9D3E,0x9D46,0x9D48, + /* Range 0x7321 - 0x737E, array index: 0x1B7C */ + 0x9D5D,0x9D5E,0x9D64,0x9D51,0x9D50,0x9D59,0x9D72,0x9D89, + 0x9D87,0x9DAB,0x9D6F,0x9D7A,0x9D9A,0x9DA4,0x9DA9,0x9DB2, + 0x9DC4,0x9DC1,0x9DBB,0x9DB8,0x9DBA,0x9DC6,0x9DCF,0x9DC2, + 0x9DD9,0x9DD3,0x9DF8,0x9DE6,0x9DED,0x9DEF,0x9DFD,0x9E1A, + 0x9E1B,0x9E1E,0x9E75,0x9E79,0x9E7D,0x9E81,0x9E88,0x9E8B, + 0x9E8C,0x9E92,0x9E95,0x9E91,0x9E9D,0x9EA5,0x9EA9,0x9EB8, + 0x9EAA,0x9EAD,0x9761,0x9ECC,0x9ECE,0x9ECF,0x9ED0,0x9ED4, + 0x9EDC,0x9EDE,0x9EDD,0x9EE0,0x9EE5,0x9EE8,0x9EEF,0x9EF4, + 0x9EF6,0x9EF7,0x9EF9,0x9EFB,0x9EFC,0x9EFD,0x9F07,0x9F08, + 0x76B7,0x9F15,0x9F21,0x9F2C,0x9F3E,0x9F4A,0x9F52,0x9F54, + 0x9F63,0x9F5F,0x9F60,0x9F61,0x9F66,0x9F67,0x9F6C,0x9F6A, + 0x9F77,0x9F72,0x9F76,0x9F95,0x9F9C,0x9FA0, + /* Range 0x7421 - 0x7426, array index: 0x1BDA */ + 0x582F,0x69C7,0x9059,0x7464,0x51DC,0x7199, + /* Unranged codes (85 codes) */ + /* Array index: 0x1BE0 */ 0x227E,0x25EF, +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0208_1990 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> jis_x0208_1990 speed-optimized table (48128 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_jis_x0208_1990[] = +{ + /* Heading Block */ + 0x0100,INVBLK,INVBLK,0x0200,0x0300,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0400,0x0500,0x0600,0x0700,INVBLK,0x0800,0x0900,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0A00,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x0B00,0x0C00, + 0x0D00,0x0E00,0x0F00,0x1000,0x1100,0x1200,0x1300,0x1400, + 0x1500,0x1600,0x1700,0x1800,0x1900,0x1A00,0x1B00,0x1C00, + 0x1D00,0x1E00,0x1F00,0x2000,0x2100,0x2200,0x2300,0x2400, + 0x2500,0x2600,0x2700,0x2800,0x2900,0x2A00,0x2B00,0x2C00, + 0x2D00,0x2E00,0x2F00,0x3000,0x3100,0x3200,0x3300,0x3400, + 0x3500,0x3600,0x3700,0x3800,0x3900,0x3A00,0x3B00,0x3C00, + 0x3D00,0x3E00,0x3F00,0x4000,0x4100,0x4200,0x4300,0x4400, + 0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00,0x4B00,0x4C00, + 0x4D00,0x4E00,0x4F00,0x5000,0x5100,0x5200,0x5300,0x5400, + 0x5500,0x5600,0x5700,0x5800,0x5900,0x5A00,0x5B00,0x5C00, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x5D00, + /* Block 1, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2140,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2171,0x2172,INVALC,INVALC,INVALC,0x2178, + 0x212F,INVALC,INVALC,INVALC,0x224C,INVALC,INVALC,INVALC, + 0x216B,0x215E,INVALC,INVALC,0x212D,INVALC,0x2279,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x215F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2160, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 4, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2621,0x2622,0x2623,0x2624,0x2625,0x2626,0x2627, + 0x2628,0x2629,0x262A,0x262B,0x262C,0x262D,0x262E,0x262F, + 0x2630,0x2631,INVALC,0x2632,0x2633,0x2634,0x2635,0x2636, + 0x2637,0x2638,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2641,0x2642,0x2643,0x2644,0x2645,0x2646,0x2647, + 0x2648,0x2649,0x264A,0x264B,0x264C,0x264D,0x264E,0x264F, + 0x2650,0x2651,INVALC,0x2652,0x2653,0x2654,0x2655,0x2656, + 0x2657,0x2658,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 5, Array index 0x0300 */ + INVALC,0x2727,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2721,0x2722,0x2723,0x2724,0x2725,0x2726,0x2728,0x2729, + 0x272A,0x272B,0x272C,0x272D,0x272E,0x272F,0x2730,0x2731, + 0x2732,0x2733,0x2734,0x2735,0x2736,0x2737,0x2738,0x2739, + 0x273A,0x273B,0x273C,0x273D,0x273E,0x273F,0x2740,0x2741, + 0x2751,0x2752,0x2753,0x2754,0x2755,0x2756,0x2758,0x2759, + 0x275A,0x275B,0x275C,0x275D,0x275E,0x275F,0x2760,0x2761, + 0x2762,0x2763,0x2764,0x2765,0x2766,0x2767,0x2768,0x2769, + 0x276A,0x276B,0x276C,0x276D,0x276E,0x276F,0x2770,0x2771, + INVALC,0x2757,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 33, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x213E,INVALC,INVALC,INVALC,INVALC,0x213D,0x2142,INVALC, + 0x2146,0x2147,INVALC,INVALC,0x2148,0x2149,INVALC,INVALC, + 0x2277,0x2278,INVALC,INVALC,INVALC,0x2145,0x2144,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2273,INVALC,0x216C,0x216D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2228,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 34, Array index 0x0500 */ + INVALC,INVALC,INVALC,0x216E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2272,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x222B,0x222C,0x222A,0x222D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x224D,INVALC,0x224E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0600 */ + 0x224F,INVALC,0x225F,0x2250,INVALC,INVALC,INVALC,0x2260, + 0x223A,INVALC,INVALC,0x223B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x215D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2265,INVALC,INVALC,0x2267,0x2167,INVALC, + 0x225C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x224A, + 0x224B,0x2241,0x2240,0x2269,0x226A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2168,0x2268,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2266,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2262,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2162,0x2261,INVALC,INVALC,INVALC,INVALC,0x2165,0x2166, + INVALC,INVALC,0x2263,0x2264,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x223E,0x223F,INVALC,INVALC,0x223C,0x223D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x225D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x225E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0800 */ + 0x2821,0x282C,0x2822,0x282D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2823,INVALC,INVALC,0x282E, + 0x2824,INVALC,INVALC,0x282F,0x2826,INVALC,INVALC,0x2831, + 0x2825,INVALC,INVALC,0x2830,0x2827,0x283C,INVALC,INVALC, + 0x2837,INVALC,INVALC,0x2832,0x2829,0x283E,INVALC,INVALC, + 0x2839,INVALC,INVALC,0x2834,0x2828,INVALC,INVALC,0x2838, + 0x283D,INVALC,INVALC,0x2833,0x282A,INVALC,INVALC,0x283A, + 0x283F,INVALC,INVALC,0x2835,0x282B,INVALC,INVALC,0x283B, + INVALC,INVALC,0x2840,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2836,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2223,0x2222,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2225,0x2224,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2227,0x2226,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2221,0x217E, + INVALC,INVALC,INVALC,0x217B,INVALC,INVALC,0x217D,0x217C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x227E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x217A,0x2179,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x216A,INVALC,0x2169,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2276,INVALC,INVALC,0x2275,INVALC,0x2274, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0A00 */ + 0x2121,0x2122,0x2123,0x2137,INVALC,0x2139,0x213A,0x213B, + 0x2152,0x2153,0x2154,0x2155,0x2156,0x2157,0x2158,0x2159, + 0x215A,0x215B,0x2229,0x222E,0x214C,0x214D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2141,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427, + 0x2428,0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F, + 0x2430,0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437, + 0x2438,0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F, + 0x2440,0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447, + 0x2448,0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F, + 0x2450,0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457, + 0x2458,0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F, + 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, + 0x2468,0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F, + 0x2470,0x2471,0x2472,0x2473,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x212B,0x212C,0x2135,0x2136,INVALC, + INVALC,0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527, + 0x2528,0x2529,0x252A,0x252B,0x252C,0x252D,0x252E,0x252F, + 0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537, + 0x2538,0x2539,0x253A,0x253B,0x253C,0x253D,0x253E,0x253F, + 0x2540,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547, + 0x2548,0x2549,0x254A,0x254B,0x254C,0x254D,0x254E,0x254F, + 0x2550,0x2551,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557, + 0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E,0x255F, + 0x2560,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567, + 0x2568,0x2569,0x256A,0x256B,0x256C,0x256D,0x256E,0x256F, + 0x2570,0x2571,0x2572,0x2573,0x2574,0x2575,0x2576,INVALC, + INVALC,INVALC,INVALC,0x2126,0x213C,0x2133,0x2134,INVALC, + /* Block 79, Array index 0x0B00 */ + 0x306C,0x437A,INVALC,0x3C37,INVALC,INVALC,INVALC,0x4B7C, + 0x3E66,0x3B30,0x3E65,0x323C,INVALC,0x4954,0x4D3F,INVALC, + 0x5022,0x312F,INVALC,INVALC,0x336E,0x5023,0x4024,0x5242, + 0x3556,0x4A3A,INVALC,INVALC,INVALC,INVALC,0x3E67,INVALC, + INVALC,0x4E3E,INVALC,INVALC,INVALC,INVALC,0x4A42,INVALC, + INVALC,INVALC,0x5024,INVALC,INVALC,0x4366,INVALC,INVALC, + INVALC,0x5025,0x367A,INVALC,INVALC,INVALC,0x5026,INVALC, + 0x345D,0x4330,INVALC,0x3C67,0x5027,INVALC,INVALC,0x5028, + INVALC,INVALC,0x5029,0x4735,INVALC,0x3557,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4737,INVALC,0x4663,0x3843,0x4B33, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6949,0x502A,0x3E68, + 0x502B,0x3235,INVALC,INVALC,INVALC,0x3665,0x3870,0x4C69, + INVALC,INVALC,0x5626,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D70,INVALC,0x467D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3425,INVALC, + 0x3535,INVALC,0x502C,INVALC,INVALC,0x502D,0x4E3B,INVALC, + 0x4D3D,0x4168,0x502F,0x3B76,0x4673,INVALC,0x5032,INVALC, + INVALC,0x313E,0x385F,INVALC,0x385E,0x3066,INVALC,INVALC, + 0x4F4B,0x4F4A,INVALC,0x3A33,0x3021,INVALC,0x5033,0x5034, + 0x5035,0x4B34,0x5036,INVALC,0x3872,0x3067,0x4B72,INVALC, + 0x357C,INVALC,INVALC,0x357D,0x357E,0x4462,0x4E3C,INVALC, + 0x5037,INVALC,INVALC,0x5038,INVALC,INVALC,0x5039,INVALC, + INVALC,INVALC,0x3F4D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D3A,0x3F4E,0x503E,INVALC,0x503C,INVALC,0x503D,0x3558, + INVALC,INVALC,0x3A23,0x3270,INVALC,0x503B,0x503A,0x4A29, + INVALC,INVALC,INVALC,INVALC,0x3B46,0x3B45,0x423E,0x503F, + 0x4955,0x4067,INVALC,INVALC,INVALC,0x2138,0x5040,0x5042, + INVALC,INVALC,INVALC,0x4265,0x4E61,0x304A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5041,0x323E,INVALC, + 0x3644,INVALC,0x4367,INVALC,INVALC,INVALC,0x376F,0x5043, + INVALC,INVALC,INVALC,0x4724,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x0C00 */ + INVALC,0x346B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5044,0x304B,INVALC,INVALC,0x3860,0x346C,0x497A, + 0x4832,0x3559,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3271,INVALC,0x5067,0x4541,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x476C, + 0x5046,INVALC,INVALC,INVALC,0x483C,INVALC,0x4E62,INVALC, + 0x3F2D,INVALC,0x3B47,INVALC,0x3B77,0x3240,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4451,INVALC,INVALC,0x4322,0x504A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x304C,0x4463,0x3D3B, + 0x3A34,0x4D24,INVALC,0x424E,INVALC,0x323F,INVALC,0x5049, + INVALC,0x4D3E,0x5045,0x5047,0x3A6E,0x5048,0x5524,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5050,INVALC,INVALC,INVALC,INVALC,INVALC,0x5053, + 0x5051,INVALC,INVALC,0x3242,INVALC,0x4A3B,0x504B,INVALC, + INVALC,INVALC,INVALC,0x504F,0x3873,INVALC,INVALC,0x3B48, + INVALC,INVALC,INVALC,0x3426,INVALC,INVALC,0x5054,INVALC, + 0x504C,INVALC,INVALC,0x4E63,INVALC,0x3B78,INVALC,0x504D, + INVALC,0x5052,INVALC,INVALC,INVALC,INVALC,0x5055,INVALC, + 0x504E,INVALC,INVALC,0x3621,INVALC,0x304D,INVALC,INVALC, + 0x3622,0x3241,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5525,INVALC,0x4B79,0x496E,0x3874, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F2F,0x4E37,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A58, + INVALC,INVALC,0x3738,0x4225,0x3264,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3D53,INVALC,INVALC,INVALC,0x5059,INVALC, + 0x505E,0x505C,INVALC,INVALC,0x5057,INVALC,INVALC,0x422F, + 0x505A,INVALC,0x505D,0x505B,INVALC,0x4A5D,INVALC,0x5058, + INVALC,0x3F2E,INVALC,0x4B73,0x505F,0x5060,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D24,0x506D, + INVALC,INVALC,INVALC,0x4750,INVALC,0x4936,0x5068,INVALC, + 0x4A70,INVALC,0x3236,INVALC,INVALC,INVALC,0x506C,INVALC, + /* Block 81, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x5066,0x506F,INVALC, + INVALC,0x4152,INVALC,0x3844,INVALC,0x475C,INVALC,0x6047, + INVALC,0x506E,0x455D,INVALC,0x5063,INVALC,0x3876,INVALC, + INVALC,0x3875,0x5061,INVALC,INVALC,INVALC,INVALC,0x3C5A, + INVALC,0x5069,INVALC,0x4A6F,0x434D,0x5065,0x3771,INVALC, + 0x5062,0x506A,0x5064,0x4E51,0x506B,0x4F41,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3666,INVALC, + INVALC,0x3770,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5070,INVALC,INVALC,INVALC,0x5071, + 0x5075,0x304E,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A50, + 0x5074,INVALC,INVALC,INVALC,INVALC,0x5073,0x5077,INVALC, + INVALC,INVALC,0x5076,INVALC,0x4464,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3772,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5078,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C45,INVALC,0x4226,0x4465,0x3676,INVALC, + 0x5079,INVALC,INVALC,INVALC,INVALC,0x3536,INVALC,INVALC, + 0x507A,INVALC,INVALC,INVALC,INVALC,0x507C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B35,INVALC,INVALC, + INVALC,0x3766,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B31,0x4877,0x507B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A45,0x4D43,INVALC,INVALC, + INVALC,INVALC,0x507E,0x5123,0x507D,0x3A44,INVALC,0x3D7D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3739,INVALC, + INVALC,INVALC,0x5124,INVALC,INVALC,0x364F,INVALC,INVALC, + INVALC,0x5121,0x5122,INVALC,INVALC,0x462F,INVALC,0x417C, + INVALC,0x3623,INVALC,INVALC,INVALC,0x4B4D,0x5125,INVALC, + INVALC,INVALC,0x4E3D,INVALC,INVALC,INVALC,0x5126,INVALC, + INVALC,INVALC,INVALC,0x5129,INVALC,0x5127,INVALC,0x414E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5128,0x512A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x512C,INVALC,INVALC, + INVALC,0x512B,INVALC,0x4A48,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x0E00 */ + 0x3537,0x512E,0x512F,INVALC,0x322F,INVALC,INVALC,INVALC, + INVALC,0x512D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C74,INVALC,0x5132,0x5131,0x5130,INVALC, + 0x5056,INVALC,0x5133,INVALC,INVALC,INVALC,INVALC,0x3D7E, + INVALC,0x5134,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D25,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C59,INVALC,INVALC,INVALC,INVALC,0x5136, + INVALC,INVALC,0x5135,0x5138,0x5137,INVALC,INVALC,0x5139, + 0x513A,0x3074,INVALC,0x3835,0x373B,0x3D3C,0x437B,0x3624, + 0x4068,0x3877,INVALC,0x396E,0x513C,0x4C48,0x4546,INVALC, + 0x3B79,INVALC,0x513B,INVALC,0x513D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x455E,INVALC,0x3375,INVALC,INVALC,INVALC, + INVALC,INVALC,0x513E,INVALC,INVALC,0x467E,INVALC,INVALC, + 0x4134,0x5140,0x5141,0x482C,0x3878,0x4F3B,0x5142,INVALC, + INVALC,0x3626,INVALC,INVALC,INVALC,0x4A3C,0x4236,0x3671, + 0x4535,INVALC,INVALC,INVALC,0x3773,INVALC,INVALC,INVALC, + 0x5143,INVALC,0x5144,INVALC,INVALC,0x4662,0x315F,INVALC, + INVALC,0x5147,0x3A7D,INVALC,0x5146,0x3A46,INVALC,0x5148, + 0x666E,0x5149,0x4B41,0x514A,INVALC,0x514B,0x514C,0x3E69, + INVALC,0x3C4C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3427,INVALC,0x514F,INVALC,0x514D,0x4C3D,0x514E,INVALC, + 0x495A,0x5150,0x5151,0x5152,0x455F,INVALC,INVALC,INVALC, + 0x5156,0x5154,0x5155,0x5153,0x3A63,0x5157,0x4C6A,0x4E64, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5158,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4028,0x5159,0x3D5A,INVALC, + INVALC,0x515A,INVALC,0x437C,0x4E3F,0x4560,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5245,INVALC, + INVALC,INVALC,INVALC,0x515B,0x7425,0x3645,INVALC,INVALC, + 0x515C,0x4B5E,INVALC,INVALC,INVALC,INVALC,0x3D68,0x427C, + INVALC,0x515E,0x4664,INVALC,INVALC,0x515F,INVALC,INVALC, + 0x5160,0x332E,INVALC,INVALC,INVALC,0x5161,0x3627,INVALC, + 0x464C,0x317A,0x3D50,INVALC,INVALC,0x4821,0x5162,INVALC, + /* Block 83, Array index 0x0F00 */ + 0x4561,INVALC,INVALC,0x3F4F,0x5163,INVALC,0x4A2C,0x405A, + 0x3422,INVALC,0x3429,0x5164,INVALC,INVALC,0x5166,INVALC, + INVALC,0x373A,INVALC,INVALC,0x5165,INVALC,INVALC,0x4E73, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D69,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x483D,0x4A4C,INVALC,0x5167, + INVALC,0x4D78,0x5168,INVALC,INVALC,INVALC,0x5169,INVALC, + 0x457E,INVALC,INVALC,0x516A,INVALC,INVALC,0x4029,0x3A7E, + 0x3774,0x516B,0x3B49,0x396F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4466,0x516D,INVALC,INVALC,0x4227, + INVALC,INVALC,0x3A6F,0x516E,0x516F,0x4130,INVALC,0x516C, + INVALC,INVALC,INVALC,INVALC,0x5171,INVALC,0x4B36,INVALC, + INVALC,INVALC,INVALC,0x3964,INVALC,INVALC,0x5170,INVALC, + INVALC,INVALC,INVALC,0x3775,0x3A5E,0x476D,INVALC,INVALC, + INVALC,0x5174,0x5172,INVALC,INVALC,INVALC,INVALC,0x497B, + 0x3E6A,0x517B,0x3364,0x5175,0x5173,0x414F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5177,INVALC,0x5176, + INVALC,INVALC,INVALC,0x3344,INVALC,INVALC,INVALC,0x3760, + 0x517C,0x4E2D,INVALC,INVALC,INVALC,0x5178,INVALC,INVALC, + INVALC,0x517D,0x517A,INVALC,0x5179,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E4F,INVALC,INVALC,INVALC,0x3879, + 0x3243,INVALC,INVALC,0x4E74,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D75,0x4558,0x3965,0x5222,0x5223,INVALC,INVALC, + INVALC,0x4E65,INVALC,INVALC,0x4F2B,0x5225,INVALC,INVALC, + INVALC,0x387A,INVALC,INVALC,0x5224,INVALC,0x332F,INVALC, + INVALC,0x5226,INVALC,0x4B56,INVALC,0x443C,INVALC,0x4D26, + INVALC,0x4A59,INVALC,INVALC,INVALC,0x5227,INVALC,INVALC, + INVALC,INVALC,0x7055,INVALC,INVALC,0x4630,INVALC,0x5228, + 0x342A,0x4C33,INVALC,INVALC,INVALC,0x3E21,0x5229,0x4A67, + 0x522D,INVALC,0x402A,0x522A,0x3650,INVALC,0x522B,0x342B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x372E,0x522E,INVALC,0x522F,INVALC,INVALC, + 0x5230,0x5231,0x3C5B,INVALC,INVALC,INVALC,0x387B,0x4C5E, + /* Block 84, Array index 0x1000 */ + INVALC,0x4C68,0x4677,INVALC,INVALC,0x4A71,0x5232,INVALC, + 0x5233,INVALC,INVALC,INVALC,INVALC,0x5235,INVALC,0x5237, + 0x5236,INVALC,INVALC,INVALC,INVALC,0x5238,0x323D,0x4B4C, + INVALC,0x3A7C,0x5239,INVALC,INVALC,0x4159,INVALC,INVALC, + 0x3E22,0x3629,INVALC,0x523A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x485B,INVALC,INVALC,INVALC,INVALC,0x523B, + INVALC,0x523C,INVALC,0x523D,INVALC,INVALC,INVALC,INVALC, + 0x523E,0x4924,0x3668,0x3065,INVALC,INVALC,INVALC,0x463F, + 0x523F,0x3D3D,INVALC,0x4069,INVALC,0x5241,0x5240,0x3E23, + 0x3861,0x5243,0x483E,INVALC,INVALC,0x5244,INVALC,INVALC, + INVALC,0x485C,0x4234,0x426E,0x3628,INVALC,INVALC,0x466E, + 0x4331,INVALC,0x476E,INVALC,0x4B4E,INVALC,0x5246,INVALC, + 0x406A,INVALC,INVALC,INVALC,INVALC,INVALC,0x3735,INVALC, + INVALC,0x5247,INVALC,INVALC,INVALC,INVALC,0x5248,0x312C, + 0x3075,0x346D,INVALC,0x4228,0x3551,0x4D71,INVALC,0x524B, + 0x3237,INVALC,INVALC,0x524A,INVALC,INVALC,INVALC,0x362A, + INVALC,INVALC,0x524C,INVALC,0x4C71,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x524D,INVALC, + 0x4E52,INVALC,0x387C,INVALC,INVALC,INVALC,INVALC,0x3836, + 0x524E,INVALC,INVALC,INVALC,INVALC,0x5250,0x524F,INVALC, + 0x3F5F,0x3139,INVALC,INVALC,INVALC,0x315E,0x5251,INVALC, + 0x5252,INVALC,INVALC,0x3837,INVALC,INVALC,0x5253,INVALC, + INVALC,INVALC,INVALC,0x356E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B32,0x5254,INVALC,INVALC,INVALC,INVALC, + 0x4B74,0x3A35,0x355A,0x4D27,0x4150,0x483F,0x3C7D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D47,INVALC,0x3C68,0x3C75, + INVALC,0x3D76,INVALC,0x4840,INVALC,INVALC,INVALC,0x5257, + INVALC,0x3143,0x4151,0x387D,0x3845,0x3667,INVALC,INVALC, + 0x525B,0x4321,0x427E,0x362B,0x3E24,0x525C,0x525A,0x3244, + 0x4266,0x3C38,0x3B4B,0x3126,INVALC,INVALC,0x3370,0x3966, + 0x3B4A,INVALC,0x525D,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x1100 */ + INVALC,0x525E,INVALC,0x3549,0x3346,INVALC,INVALC,INVALC, + 0x3967,0x3548,0x445F,0x3125,0x4631,0x4C3E,0x3921,0x4D79, + 0x4547,0x387E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x372F,INVALC,0x5267,INVALC,0x3663, + 0x4B4A,INVALC,INVALC,INVALC,INVALC,INVALC,0x485D,INVALC, + INVALC,0x5266,INVALC,0x345E,0x5261,0x5262,0x5264,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5265,INVALC, + 0x355B,0x3F61,INVALC,0x4A2D,0x5263,0x525F,0x3863,INVALC, + 0x5260,INVALC,0x4F24,INVALC,INVALC,INVALC,0x4A72,INVALC, + 0x4468,0x3862,0x3970,INVALC,INVALC,INVALC,0x5268,INVALC, + INVALC,0x465D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x526C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C7E,INVALC,0x3C76,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x526F,0x526D,INVALC,0x4C23,INVALC,0x526A,0x5273,0x526E, + INVALC,INVALC,INVALC,0x5271,0x3846,0x4C3F,INVALC,INVALC, + 0x5272,INVALC,INVALC,INVALC,0x5274,INVALC,0x5276,INVALC, + INVALC,INVALC,INVALC,0x3A70,0x4F42,INVALC,0x526B,0x5269, + 0x5275,INVALC,0x5270,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5278,INVALC,0x5323,0x527A,INVALC,INVALC, + 0x527E,INVALC,INVALC,0x5321,0x527B,INVALC,INVALC,0x533E, + INVALC,INVALC,0x3A69,0x3331,INVALC,INVALC,INVALC,INVALC, + 0x5279,INVALC,INVALC,INVALC,0x5325,0x3076,0x5324,INVALC, + 0x3025,0x494A,0x5322,INVALC,0x527C,INVALC,INVALC,0x5277, + 0x527D,0x3A48,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5326,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3077,0x532F,INVALC,INVALC,0x5327,0x5328,INVALC, + 0x3E25,0x4B69,INVALC,INVALC,INVALC,0x532D,0x532C,INVALC, + INVALC,INVALC,0x452F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x532E,INVALC,INVALC,0x532B,INVALC,INVALC, + /* Block 86, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,0x3134,INVALC,0x3A36,0x3F30, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5329, + 0x4562,INVALC,INVALC,INVALC,0x532A,INVALC,0x3022,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5334,0x4D23, + INVALC,0x3E27,INVALC,0x533A,INVALC,INVALC,INVALC,INVALC, + 0x5339,0x5330,INVALC,INVALC,INVALC,INVALC,0x4243,INVALC, + 0x5331,INVALC,INVALC,INVALC,0x426F,0x5336,0x3E26,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5333,INVALC,INVALC,0x4C64, + INVALC,INVALC,INVALC,0x373C,INVALC,INVALC,0x5337,0x5338, + INVALC,INVALC,INVALC,INVALC,0x5335,0x533B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5332,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5341,0x5346,INVALC,0x5342,INVALC, + 0x533D,INVALC,INVALC,0x5347,0x4131,INVALC,INVALC,0x5349, + INVALC,0x3922,0x533F,0x437D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5343,0x533C,0x342D,INVALC,0x346E,0x3365,0x5344,0x5340, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3776, + 0x534A,0x5348,0x4153,0x354A,0x362C,INVALC,0x5345,INVALC, + 0x3674,INVALC,INVALC,INVALC,INVALC,INVALC,0x3144,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x534E,0x534C,INVALC,0x5427, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5351,INVALC,INVALC,INVALC, + INVALC,INVALC,0x534B,INVALC,0x534F,INVALC,INVALC,0x534D, + INVALC,INVALC,INVALC,0x3B4C,0x5350,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5353, + INVALC,0x5358,INVALC,INVALC,INVALC,0x5356,0x5355,INVALC, + /* Block 87, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4332,INVALC, + INVALC,0x3245,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5352,INVALC,0x5354,0x3E28, + 0x3133,INVALC,INVALC,0x5357,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x325E,INVALC,INVALC,INVALC,INVALC,INVALC,0x5362, + INVALC,0x3E7C,0x535E,INVALC,0x535C,INVALC,0x535D,INVALC, + 0x535F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x313D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4139,INVALC,0x5359,INVALC, + 0x535A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x337A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5361,INVALC,INVALC,INVALC, + 0x346F,INVALC,0x5364,0x5360,0x5363,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A2E,INVALC,INVALC,INVALC, + 0x4655,INVALC,0x4838,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5366,INVALC,INVALC,INVALC,INVALC,INVALC,0x5365,0x3345, + INVALC,INVALC,0x5367,INVALC,INVALC,INVALC,INVALC,0x536A, + INVALC,INVALC,INVALC,INVALC,0x5369,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5368,INVALC,0x4739,INVALC,INVALC,0x536B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x536C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x536E,INVALC,0x536D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5370,INVALC,INVALC,INVALC, + 0x5373,0x5371,0x536F,0x5372,INVALC,INVALC,INVALC,INVALC, + 0x5374,INVALC,INVALC,INVALC,INVALC,INVALC,0x5375,INVALC, + INVALC,0x5376,INVALC,0x5377,INVALC,INVALC,INVALC,0x5378, + 0x5145,INVALC,0x3C7C,0x3B4D,INVALC,INVALC,0x3273,INVALC, + 0x3078,INVALC,INVALC,0x4344,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5379,INVALC, + 0x3A24,INVALC,0x304F,0x3F5E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x537A,0x3847,INVALC,INVALC,0x3971,INVALC,0x537C, + /* Block 88, Array index 0x1400 */ + 0x537B,INVALC,INVALC,0x4A60,0x537D,INVALC,INVALC,INVALC, + 0x5421,0x537E,INVALC,0x5422,INVALC,0x5423,INVALC,0x3777, + INVALC,INVALC,0x3160,0x5424,INVALC,INVALC,0x5426,INVALC, + 0x5425,INVALC,INVALC,INVALC,0x5428,INVALC,INVALC,0x455A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5429,0x3035, + 0x3A5F,INVALC,INVALC,INVALC,INVALC,0x373D,INVALC,INVALC, + 0x434F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x542A, + 0x542B,INVALC,INVALC,0x542D,INVALC,INVALC,INVALC,INVALC, + 0x542E,INVALC,0x3A64,INVALC,INVALC,INVALC,INVALC,0x3651, + INVALC,INVALC,0x4B37,INVALC,INVALC,INVALC,0x542C,0x542F, + 0x3A41,0x3923,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5433,INVALC,INVALC,0x3A25,INVALC,0x4333,INVALC, + INVALC,0x5430,0x445A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5434, + INVALC,INVALC,0x3F62,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5432,0x5435,INVALC,0x373F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5436,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5437,INVALC,0x3924,0x3340,0x5439,INVALC,INVALC,INVALC, + INVALC,INVALC,0x543A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x543B,INVALC,INVALC,0x5438,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5431,INVALC,INVALC,0x543C,INVALC,INVALC,0x543D,INVALC, + INVALC,INVALC,INVALC,0x4B64,INVALC,INVALC,0x3E6B,INVALC, + INVALC,INVALC,0x543F,0x5440,0x543E,INVALC,0x5442,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4738,INVALC,INVALC,0x3068, + 0x4956,INVALC,INVALC,0x5443,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E7D,INVALC,INVALC,0x3C39, + INVALC,0x475D,0x3470,INVALC,0x3A6B,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x1500 */ + 0x4B59,INVALC,0x4632,INVALC,INVALC,0x3778,0x424F,INVALC, + INVALC,INVALC,0x5441,0x5444,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4244,INVALC,INVALC, + INVALC,0x5445,INVALC,INVALC,INVALC,0x5446,INVALC,INVALC, + INVALC,0x5448,INVALC,INVALC,0x4469,INVALC,INVALC,INVALC, + INVALC,INVALC,0x342E,INVALC,INVALC,INVALC,INVALC,0x7421, + 0x3161,0x4A73,INVALC,INVALC,0x3E6C,0x4548,INVALC,INVALC, + INVALC,INVALC,0x3A66,INVALC,INVALC,0x544E,INVALC,INVALC, + 0x4A3D,0x4E5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3274,0x544A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x413A,0x544D,INVALC,0x4563,INVALC,INVALC,0x4549, + 0x4564,0x4839,0x444D,INVALC,INVALC,INVALC,0x3A49,INVALC, + INVALC,INVALC,0x5449,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3176,INVALC,0x4536,INVALC,INVALC,INVALC,INVALC, + 0x544B,INVALC,0x5447,INVALC,INVALC,0x3F50,INVALC,INVALC, + INVALC,0x544F,INVALC,INVALC,INVALC,INVALC,0x3D4E,INVALC, + INVALC,INVALC,INVALC,0x362D,INVALC,0x5450,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A68,INVALC,INVALC,INVALC,0x417D, + INVALC,INVALC,INVALC,INVALC,0x4446,INVALC,INVALC,0x5452, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4B4F,INVALC,INVALC,0x5453,INVALC,INVALC,0x5458,INVALC, + INVALC,INVALC,INVALC,0x4A2F,INVALC,INVALC,INVALC,INVALC, + 0x5457,0x5451,0x5454,0x5456,INVALC,INVALC,0x3A26,INVALC, + INVALC,0x4A49,INVALC,INVALC,INVALC,0x5459,INVALC,0x4345, + INVALC,INVALC,0x3275,INVALC,0x3E6D,INVALC,INVALC,INVALC, + INVALC,0x545B,INVALC,0x545A,INVALC,0x3968,INVALC,0x545C, + 0x545E,0x545D,INVALC,INVALC,0x5460,INVALC,0x5455,0x5462, + INVALC,INVALC,INVALC,INVALC,0x5461,0x545F,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B4E,0x3F51,INVALC,0x4154,0x5463, + 0x403C,0x306D,0x4764,INVALC,INVALC,INVALC,INVALC,0x445B, + INVALC,0x5465,0x5464,0x5466,0x5467,0x5468,INVALC,INVALC, + /* Block 90, Array index 0x1600 */ + INVALC,INVALC,0x5469,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A51,0x546A,INVALC,INVALC,INVALC,INVALC,0x3246, + 0x546B,INVALC,INVALC,INVALC,INVALC,0x4D3C,0x3330,INVALC, + 0x5249,0x3D48,0x423F,0x546C,0x4C6B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C34,INVALC,INVALC,0x546E,INVALC,0x4267, + INVALC,0x4537,0x4240,0x4957,0x546F,0x5470,0x317B,INVALC, + INVALC,0x3C3A,0x5471,INVALC,INVALC,INVALC,INVALC,0x3050, + 0x5472,INVALC,INVALC,INVALC,INVALC,INVALC,0x5473,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3162,INVALC,INVALC,0x3471, + 0x4660,0x4A74,INVALC,INVALC,INVALC,INVALC,0x5477,0x4155, + 0x5476,0x3740,INVALC,INVALC,0x4B5B,0x5475,INVALC,0x4565, + 0x5479,INVALC,0x5478,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x547B,INVALC,0x547A,INVALC,INVALC,0x317C,INVALC,0x547C, + 0x3E29,0x547E,0x4325,INVALC,0x547D,INVALC,0x4A33,INVALC, + INVALC,INVALC,INVALC,0x3D77,0x455B,INVALC,INVALC,INVALC, + 0x5521,INVALC,INVALC,INVALC,INVALC,0x3925,INVALC,INVALC, + INVALC,0x5522,0x4721,0x485E,0x4C51,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4725,INVALC,INVALC,0x552B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3538,INVALC,INVALC,0x4D45,INVALC, + INVALC,0x4C2F,INVALC,0x562C,INVALC,0x5523,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5526,INVALC,0x4245,INVALC,INVALC, + 0x4B38,INVALC,INVALC,INVALC,0x454A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5527,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4B65,INVALC,0x3A4A,INVALC,INVALC,0x3E2A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5528,INVALC, + INVALC,0x3B50,INVALC,0x3B4F,INVALC,INVALC,INVALC,INVALC, + 0x3039,0x3848,INVALC,0x402B,0x3051,INVALC,INVALC,INVALC, + INVALC,0x552C,0x552D,INVALC,0x552A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3138,0x342F,INVALC, + 0x5529,INVALC,0x4C45,0x4931,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3028,INVALC, + INVALC,INVALC,INVALC,0x3079,INVALC,INVALC,INVALC,0x3B51, + /* Block 91, Array index 0x1700 */ + INVALC,0x3052,INVALC,0x3023,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5532,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5530,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C3C,INVALC,0x5533,INVALC,0x5531,INVALC,INVALC,0x552F, + 0x3F31,INVALC,INVALC,INVALC,INVALC,0x552E,INVALC,INVALC, + INVALC,0x4A5A,INVALC,INVALC,INVALC,INVALC,INVALC,0x3864, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5537,0x5538,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E2B,INVALC,INVALC,INVALC, + 0x5534,0x4F2C,INVALC,INVALC,INVALC,INVALC,0x474C,INVALC, + INVALC,0x5536,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A27,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5539,INVALC,INVALC,INVALC,0x4958,INVALC, + INVALC,INVALC,0x553A,INVALC,0x5535,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C3B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x475E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x553B,0x4932,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x553C,0x5540,0x553D,INVALC, + INVALC,0x3247,0x553F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3C3B,INVALC,0x553E,0x3779,INVALC,INVALC,INVALC, + 0x554C,INVALC,INVALC,INVALC,INVALC,INVALC,0x5545,0x5542, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4364,INVALC,0x5541,INVALC,INVALC,0x5543,INVALC, + INVALC,0x5544,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5546,0x5547,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3472,INVALC,0x5549,0x5548,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x554A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E6E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x554D,INVALC,0x445C,INVALC,INVALC,INVALC, + 0x3145,INVALC,0x554B,INVALC,INVALC,INVALC,0x554E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x554F,INVALC, + 0x5552,INVALC,INVALC,0x5550,INVALC,0x5551,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B52,0x5553,INVALC,INVALC,0x3926,0x5554,INVALC,0x3B7A, + 0x4238,INVALC,0x5555,0x5556,0x3B5A,0x3927,INVALC,0x4C52, + INVALC,INVALC,INVALC,0x3528,0x3849,0x5557,0x3358,INVALC, + INVALC,0x5558,INVALC,0x4239,INVALC,INVALC,INVALC,INVALC, + 0x5559,0x5623,INVALC,0x555A,INVALC,0x555B,INVALC,INVALC, + 0x555C,INVALC,0x555E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x555F,INVALC,INVALC,0x5560,INVALC,0x4270,INVALC,0x3127, + 0x3C69,0x3042,INVALC,0x4157,0x3430,0x3C35,INVALC,0x3928, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4566,INVALC,0x3D21, + 0x3431,0x4368,0x446A,0x3038,0x3539,0x4A75,INVALC,0x3C42, + INVALC,INVALC,0x3552,0x406B,0x3C3C,0x4D28,0x5561,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x355C,INVALC, + 0x3A4B,INVALC,INVALC,0x3332,0x3163,0x3E2C,0x3248,INVALC, + 0x5562,0x4D46,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D49, + INVALC,INVALC,0x3C64,0x5563,0x3473,0x4652,0x4C29,0x5564, + INVALC,0x5565,INVALC,INVALC,0x4959,INVALC,INVALC,INVALC, + 0x5567,INVALC,0x3428,0x3677,0x5566,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3432,INVALC,0x3F32,0x556B,0x3B21, + INVALC,0x3249,0x556A,INVALC,0x5568,0x556C,0x5569,0x472B, + 0x5C4D,0x3F33,INVALC,0x556D,INVALC,INVALC,0x4E40,INVALC, + 0x556E,INVALC,INVALC,0x5570,INVALC,0x437E,0x556F,INVALC, + 0x4023,INVALC,0x3B7B,INVALC,INVALC,INVALC,0x4250,0x3C77, + /* Block 93, Array index 0x1900 */ + INVALC,0x4975,0x406C,INVALC,0x3C4D,0x5571,0x3E2D,0x5572, + 0x5573,0x3053,0x423A,0x3F52,INVALC,0x5574,0x4633,0x3E2E, + INVALC,0x3E2F,INVALC,0x5575,INVALC,INVALC,0x406D,INVALC, + INVALC,INVALC,0x3E30,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5576,INVALC,0x5577,INVALC,0x4C60,INVALC,INVALC,INVALC, + 0x5578,INVALC,INVALC,INVALC,INVALC,0x3646,INVALC,INVALC, + INVALC,0x3D22,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5579,0x557A,0x3C5C,0x3F2C,0x4674,0x3F54,0x4878,0x4722, + 0x3649,0x557B,INVALC,INVALC,INVALC,0x356F,0x557C,INVALC, + 0x367E,INVALC,0x464F,0x3230,INVALC,0x3B53,0x557D,0x5622, + 0x5621,0x367D,INVALC,0x557E,INVALC,0x4538,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4230,INVALC, + 0x454B,0x3C48,INVALC,INVALC,0x4158,0x4D7A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5624,INVALC,0x5625,0x4656, + INVALC,0x3B33,INVALC,INVALC,INVALC,INVALC,0x5627,INVALC, + INVALC,0x5628,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5629,INVALC,INVALC,INVALC, + 0x3474,0x562A,INVALC,INVALC,0x562B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x322C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x413B,0x3464,INVALC,0x562D,0x4C28,INVALC,INVALC,INVALC, + INVALC,0x4252,INVALC,0x3359,INVALC,INVALC,0x562F,0x5631, + 0x345F,INVALC,INVALC,0x562E,0x5630,INVALC,0x5633,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5632,INVALC,0x5634, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5635,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x463D,0x362E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3265,0x5636,0x563B,INVALC,INVALC,0x5639,INVALC,0x4A77, + 0x4A76,INVALC,INVALC,INVALC,INVALC,INVALC,0x4567,INVALC, + INVALC,INVALC,0x5638,0x3D54,INVALC,0x5637,INVALC,INVALC, + /* Block 94, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F72, + INVALC,INVALC,INVALC,0x563C,INVALC,INVALC,0x3A6A,INVALC, + INVALC,0x5642,INVALC,INVALC,0x5643,0x563D,0x3333,0x563E, + 0x5647,0x5646,0x5645,0x5641,INVALC,INVALC,INVALC,0x5640, + INVALC,INVALC,0x5644,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x564B,0x5648,INVALC,0x564A,INVALC, + 0x4D72,INVALC,0x5649,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x563F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F73,INVALC,INVALC,0x564C,INVALC,INVALC,0x3A37, + INVALC,INVALC,INVALC,0x564D,INVALC,INVALC,0x564E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5651,INVALC,0x5650,INVALC,INVALC,0x564F, + INVALC,INVALC,INVALC,0x4568,0x563A,INVALC,INVALC,INVALC, + 0x5657,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5653,INVALC,INVALC, + INVALC,INVALC,0x5652,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5654,INVALC,0x5655,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5658, + INVALC,INVALC,0x4E66,INVALC,0x5659,0x5656,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x565A,INVALC,INVALC,0x3460,0x565B,INVALC,INVALC, + INVALC,INVALC,0x565D,0x565C,INVALC,INVALC,0x565E,INVALC, + INVALC,INVALC,INVALC,0x565F,INVALC,0x406E,0x3D23,INVALC, + INVALC,0x3D64,INVALC,0x4163,INVALC,0x3929,0x3A38,0x392A, + 0x3570,INVALC,INVALC,0x5660,INVALC,INVALC,0x3A39,INVALC, + INVALC,0x384A,0x5661,0x4C26,0x4743,0x5662,INVALC,0x392B, + INVALC,INVALC,INVALC,0x342C,INVALC,0x4327,0x3652,INVALC, + /* Block 95, Array index 0x1B00 */ + INVALC,INVALC,0x3B54,0x495B,INVALC,INVALC,0x4841,INVALC, + INVALC,INVALC,INVALC,0x5663,0x3475,INVALC,INVALC,INVALC, + INVALC,0x5666,INVALC,INVALC,INVALC,INVALC,0x4421,INVALC, + INVALC,0x5665,0x5664,0x5667,INVALC,0x446B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F63,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B55,INVALC,0x404A,INVALC,0x4253, + 0x3522,INVALC,INVALC,0x4422,INVALC,INVALC,0x5668,0x5669, + 0x3E6F,INVALC,INVALC,INVALC,INVALC,0x4B39,INVALC,INVALC, + 0x566C,INVALC,INVALC,0x566B,0x566A,0x497D,INVALC,0x5673, + INVALC,INVALC,INVALC,INVALC,0x4B5A,INVALC,0x566D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x566F,0x4B6B,INVALC,0x566E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5670, + INVALC,0x4828,0x5671,0x4A3E,0x5672,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3433,0x4A3F,0x472F,0x5674,0x5675,INVALC, + 0x392C,0x3434,0x5676,0x3838,0x4D44,0x4D29,0x3476,0x5678, + INVALC,0x4423,INVALC,0x392D,0x3E31,INVALC,INVALC,0x485F, + INVALC,INVALC,0x3E32,INVALC,INVALC,INVALC,INVALC,0x3D78, + INVALC,INVALC,INVALC,INVALC,INVALC,0x446C,0x4A79,0x4539, + INVALC,INVALC,0x392E,INVALC,0x495C,INVALC,INVALC,INVALC, + 0x5679,INVALC,INVALC,INVALC,INVALC,INVALC,0x4559,0x3A42, + INVALC,INVALC,INVALC,0x384B,INVALC,0x446D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3043,0x3D6E,0x392F, + 0x4D47,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x567A,0x567B,0x4751,INVALC,INVALC,INVALC,INVALC, + 0x567C,0x4E77,0x4F2D,INVALC,INVALC,INVALC,INVALC,0x567E, + 0x567D,INVALC,INVALC,0x3347,INVALC,INVALC,0x5721,INVALC, + INVALC,INVALC,0x5724,0x5725,INVALC,0x5723,INVALC,0x4940, + 0x3E33,0x5727,0x5726,0x5722,INVALC,INVALC,INVALC,INVALC, + 0x5728,0x5729,INVALC,INVALC,0x572A,INVALC,INVALC,INVALC, + 0x572D,0x572B,INVALC,0x572C,0x572E,INVALC,0x3164,0x446E, + 0x572F,INVALC,0x377A,0x3276,0x4736,INVALC,0x5730,0x467B, + /* Block 96, Array index 0x1C00 */ + INVALC,0x4A5B,INVALC,0x5731,0x4F2E,INVALC,INVALC,INVALC, + INVALC,0x5732,0x4A40,0x5735,0x5021,0x5031,INVALC,0x3C30, + 0x4675,0x5736,INVALC,0x355D,0x4424,0x307A,0x5737,0x4A26, + 0x3930,INVALC,INVALC,0x4350,INVALC,INVALC,INVALC,0x446F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C6F,0x3839,0x384C, + INVALC,0x5738,INVALC,INVALC,INVALC,0x5739,INVALC,0x573F, + INVALC,0x3C65,INVALC,INVALC,INVALC,0x4425,INVALC,0x362F, + 0x573A,INVALC,INVALC,INVALC,0x492B,INVALC,0x4346,INVALC, + INVALC,0x573B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x573C,INVALC,0x3630,INVALC,0x573D,INVALC,0x573E,INVALC, + INVALC,0x5740,INVALC,0x4576,INVALC,INVALC,0x5741,0x5742, + INVALC,0x5743,INVALC,INVALC,0x5734,0x5733,INVALC,INVALC, + INVALC,0x5744,0x3741,INVALC,INVALC,INVALC,0x4927,INVALC, + INVALC,0x3A4C,0x4937,0x4426,0x494B,0x5745,INVALC,INVALC, + 0x3E34,0x3146,INVALC,0x5746,INVALC,INVALC,INVALC,0x5747, + INVALC,0x4C72,INVALC,INVALC,0x4860,INVALC,INVALC,0x574A, + 0x317D,0x402C,0x5749,0x5748,0x3742,0x4254,INVALC,0x574E, + 0x574C,INVALC,0x574B,0x4E27,0x3865,INVALC,INVALC,INVALC, + 0x3D79,0x574D,0x454C,0x3D3E,INVALC,INVALC,INVALC,0x4640, + 0x5751,0x5750,INVALC,INVALC,INVALC,INVALC,0x574F,INVALC, + 0x5752,0x3866,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5753,0x497C,0x3D5B,INVALC,INVALC,0x5754,0x4879,INVALC, + INVALC,INVALC,INVALC,0x4641,0x4427,INVALC,INVALC,INVALC, + INVALC,0x4530,INVALC,INVALC,0x5755,0x352B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F34,INVALC,0x492C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3477,0x4726,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5756,0x3B56, + 0x4B3A,0x4B3B,INVALC,INVALC,0x317E,0x575B,INVALC,INVALC, + 0x4369,INVALC,INVALC,INVALC,0x5758,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3277,INVALC,INVALC,INVALC,INVALC, + 0x582D,0x575A,INVALC,INVALC,INVALC,0x4730,INVALC,INVALC, + 0x5759,INVALC,INVALC,0x5757,INVALC,0x397A,INVALC,0x575D, + /* Block 97, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5763,0x5769, + 0x5761,INVALC,0x455C,INVALC,INVALC,0x5766,0x495D,INVALC, + INVALC,0x5760,INVALC,0x5765,0x4E67,0x3B57,INVALC,INVALC, + 0x4255,0x575E,INVALC,INVALC,INVALC,0x355E,0x5768,0x402D, + 0x3165,0x5762,0x3278,0x5767,INVALC,INVALC,INVALC,0x3631, + INVALC,0x5764,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x576A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x576C,0x5776,0x5774,INVALC,INVALC,0x5771,INVALC, + INVALC,INVALC,0x5770,0x4E78,INVALC,0x5772,INVALC,INVALC, + 0x3632,INVALC,0x3931,INVALC,INVALC,0x3D7A,INVALC,INVALC, + INVALC,0x5779,0x576B,INVALC,INVALC,INVALC,INVALC,0x576F, + 0x575F,INVALC,0x327A,0x5773,0x5775,0x4351,INVALC,INVALC, + 0x3A28,0x3238,0x576D,0x5778,0x5777,0x3633,INVALC,0x4229, + 0x3366,INVALC,INVALC,INVALC,INVALC,0x3743,INVALC,0x576E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x577A,INVALC,0x577D,0x5821,INVALC,INVALC,INVALC, + INVALC,0x3C3D,INVALC,0x5827,0x4470,0x577B,INVALC,INVALC, + INVALC,INVALC,0x5825,INVALC,0x3279,INVALC,0x5823,0x5824, + INVALC,INVALC,0x577E,0x5822,INVALC,INVALC,INVALC,0x3867, + 0x4D2A,INVALC,INVALC,0x3435,INVALC,INVALC,0x3159,0x5826, + INVALC,0x473A,0x302D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4861,0x575C,0x582C,0x5830,0x4C65,INVALC, + 0x5829,INVALC,INVALC,INVALC,0x4569,0x582E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E70,0x582F,0x4657, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F47,INVALC,0x582B,INVALC,INVALC,INVALC,INVALC, + 0x5831,INVALC,0x397B,INVALC,0x404B,INVALC,INVALC,0x3054, + 0x582A,0x5828,INVALC,0x415A,INVALC,INVALC,INVALC,0x577C, + 0x3B34,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4246,0x583D,INVALC,0x415B,0x5838,INVALC,0x5835,0x5836, + INVALC,0x3C66,0x5839,0x583C,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x1E00 */ + 0x5837,0x3D25,INVALC,0x583A,INVALC,INVALC,0x5834,INVALC, + 0x4C7C,0x4C7B,INVALC,INVALC,INVALC,0x583E,0x583F,0x3055, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5833,INVALC,INVALC, + INVALC,INVALC,0x3672,0x3026,INVALC,INVALC,INVALC,0x3436, + INVALC,0x583B,INVALC,INVALC,INVALC,INVALC,INVALC,0x5843, + 0x5842,INVALC,INVALC,INVALC,0x5847,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5848,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5846,0x5849,0x5841,0x5845, + INVALC,INVALC,0x584A,INVALC,0x584B,INVALC,INVALC,0x5840, + 0x3B7C,INVALC,0x5844,0x4256,0x3932,0x5832,0x3F35,INVALC, + INVALC,INVALC,INVALC,0x5858,INVALC,0x4A69,INVALC,INVALC, + 0x584E,0x584F,0x5850,INVALC,INVALC,0x5857,INVALC,0x5856, + INVALC,INVALC,0x4B7D,0x3437,INVALC,0x5854,INVALC,0x3745, + 0x3334,INVALC,INVALC,0x5851,INVALC,INVALC,0x4E38,0x5853, + 0x3056,0x5855,INVALC,0x584C,0x5852,0x5859,0x3744,0x584D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D5D,INVALC, + INVALC,INVALC,0x4D2B,INVALC,INVALC,INVALC,INVALC,0x585C, + INVALC,INVALC,0x5860,INVALC,INVALC,INVALC,0x417E,INVALC, + 0x4E79,0x5861,INVALC,INVALC,0x585E,INVALC,0x585B,INVALC, + INVALC,0x585A,0x585F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A30,INVALC,INVALC,0x4634, + INVALC,0x3746,INVALC,0x5862,0x585D,INVALC,0x5863,INVALC, + INVALC,INVALC,0x377B,INVALC,INVALC,INVALC,0x3231,INVALC, + INVALC,INVALC,0x586B,INVALC,INVALC,INVALC,0x3438,INVALC, + INVALC,INVALC,INVALC,0x5869,INVALC,INVALC,0x586A,0x3A29, + 0x5868,0x5866,0x5865,0x586C,0x5864,0x586E,INVALC,INVALC, + 0x327B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5870,INVALC,INVALC,0x586F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4428,INVALC,0x5873,INVALC,0x5871,0x5867, + 0x377C,INVALC,0x5872,INVALC,0x5876,0x5875,0x5877,0x5874, + /* Block 99, Array index 0x1F00 */ + 0x5878,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5879,0x587A,0x4A6A,INVALC,0x587C,0x587B,0x3D3F,INVALC, + 0x402E,0x3266,0x327C,INVALC,0x587D,INVALC,0x303F,INVALC, + INVALC,INVALC,0x404C,0x587E,INVALC,0x6C43,0x5921,0x3761, + INVALC,0x5922,INVALC,INVALC,INVALC,INVALC,0x406F,INVALC, + INVALC,INVALC,0x5923,INVALC,INVALC,INVALC,0x5924,0x353A, + 0x5925,INVALC,0x5926,0x5927,0x4257,INVALC,INVALC,INVALC, + 0x384D,INVALC,INVALC,0x4C61,INVALC,INVALC,INVALC,0x4B3C, + 0x3D6A,0x5928,INVALC,INVALC,INVALC,INVALC,INVALC,0x4070, + 0x6E3D,0x4862,INVALC,0x3C6A,INVALC,0x3A4D,0x5929,INVALC, + INVALC,INVALC,INVALC,0x4247,INVALC,0x4A27,INVALC,INVALC, + 0x4271,INVALC,INVALC,0x592C,INVALC,INVALC,0x592A,INVALC, + 0x592D,INVALC,INVALC,0x592B,INVALC,INVALC,INVALC,INVALC, + 0x592E,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A31,INVALC, + INVALC,0x3037,INVALC,INVALC,INVALC,INVALC,0x495E,INVALC, + INVALC,0x4863,INVALC,INVALC,0x592F,INVALC,0x5932,0x3E35, + 0x353B,INVALC,0x5930,0x5937,0x3E36,INVALC,INVALC,INVALC, + INVALC,0x5931,0x4744,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D5E,0x5933,0x5934,0x5938,0x456A,0x5935,0x3933, + 0x405E,INVALC,INVALC,0x5946,0x4834,INVALC,0x4272,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4864,0x5A2D,INVALC,INVALC,INVALC, + INVALC,0x4A7A,INVALC,INVALC,INVALC,0x4471,INVALC,INVALC, + INVALC,0x4B75,INVALC,0x593B,0x3221,0x436A,INVALC,INVALC, + INVALC,INVALC,0x5944,INVALC,INVALC,0x4334,0x593E,0x5945, + 0x5940,0x5947,0x5943,INVALC,0x5942,0x476F,INVALC,0x593C, + 0x327D,0x593A,0x3571,0x4273,0x5936,INVALC,INVALC,0x5939, + 0x3934,0x405B,INVALC,0x3E37,0x5941,0x4752,INVALC,INVALC, + 0x3572,0x3348,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3367,0x3F21,0x5949,0x594E, + INVALC,0x594A,INVALC,0x377D,INVALC,0x594F,0x3B22,0x3969, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D26,0x593D, + /* Block 100, Array index 0x2000 */ + INVALC,0x3B7D,0x594C,INVALC,INVALC,INVALC,INVALC,0x3B58, + 0x594D,0x3044,INVALC,INVALC,0x5948,INVALC,INVALC,INVALC, + INVALC,0x4429,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3573,INVALC,INVALC,INVALC,INVALC,INVALC,0x3634, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x594B, + 0x3027,INVALC,INVALC,0x3A43,INVALC,INVALC,INVALC,0x3F36, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4472,INVALC,INVALC,0x4854,0x5951,0x415E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x422A,INVALC,INVALC,0x3B2B,0x5952,INVALC,0x5954, + 0x5950,INVALC,INVALC,INVALC,INVALC,0x4A61,INVALC,0x443D, + INVALC,INVALC,INVALC,INVALC,0x415C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A7B, + 0x3C4E,0x5960,INVALC,0x595F,INVALC,INVALC,0x3F78,INVALC, + INVALC,INVALC,0x377E,INVALC,INVALC,INVALC,0x5959,0x3E39, + INVALC,INVALC,0x4668,0x4731,INVALC,INVALC,INVALC,INVALC, + 0x5957,INVALC,INVALC,0x415D,INVALC,INVALC,INVALC,INVALC, + 0x3C78,0x595C,INVALC,INVALC,0x3E38,INVALC,0x5956,0x595B, + INVALC,INVALC,0x4753,INVALC,INVALC,INVALC,0x5955,INVALC, + 0x3721,INVALC,INVALC,0x335D,INVALC,INVALC,INVALC,0x595D, + 0x4E2B,0x3A4E,0x4335,0x595A,INVALC,0x405C,INVALC,0x3935, + 0x3F64,0x3166,0x413C,0x5958,0x3545,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3747,INVALC,0x444F,0x595E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x415F,INVALC,INVALC,0x5961,INVALC, + 0x5963,INVALC,INVALC,0x4237,0x5969,INVALC,0x5964,INVALC, + INVALC,0x5966,INVALC,INVALC,INVALC,INVALC,INVALC,0x4941, + 0x4473,INVALC,0x5967,INVALC,INVALC,INVALC,0x4D2C,INVALC, + INVALC,INVALC,0x4D48,0x3439,INVALC,INVALC,INVALC,INVALC, + INVALC,0x302E,INVALC,0x5965,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5962,INVALC,INVALC,INVALC,INVALC,0x3478,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3167,INVALC,0x5968,INVALC, + INVALC,INVALC,0x4D49,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x596C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x423B,INVALC,0x5973, + INVALC,INVALC,INVALC,0x596D,INVALC,INVALC,0x596A,0x5971, + INVALC,INVALC,INVALC,INVALC,0x5953,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x596E,INVALC, + 0x5972,INVALC,INVALC,INVALC,0x4842,0x456B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x596B,INVALC,0x596F,INVALC, + INVALC,INVALC,0x3748,INVALC,INVALC,INVALC,0x3A71,INVALC, + INVALC,INVALC,0x405D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5977,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4526,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5974, + INVALC,0x4B60,INVALC,INVALC,INVALC,INVALC,INVALC,0x5975, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5976,INVALC, + 0x4C4E,INVALC,0x4022,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3762,INVALC,INVALC,INVALC,INVALC, + 0x597D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B35,0x597A,INVALC,0x5979,INVALC,INVALC, + INVALC,INVALC,0x4732,INVALC,INVALC,INVALC,0x4635,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4531,0x597B,INVALC,INVALC, + INVALC,0x597C,INVALC,0x496F,INVALC,0x4745,0x3B23,INVALC, + 0x4071,INVALC,0x4B50,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3349,INVALC,0x5A25,0x597E,INVALC,INVALC,INVALC, + INVALC,0x4D4A,0x5A27,INVALC,INVALC,0x5A23,INVALC,0x5A24, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4160,INVALC,INVALC, + INVALC,INVALC,0x5A22,INVALC,0x593F,INVALC,INVALC,INVALC, + 0x5A26,INVALC,0x5A21,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A2B,0x5A2C,0x4527,0x5A2E,INVALC,INVALC,0x3B24,0x5A29, + INVALC,INVALC,INVALC,INVALC,0x353C,INVALC,INVALC,0x5A2F, + INVALC,0x5A28,0x5A33,INVALC,0x5A32,INVALC,0x5A31,INVALC, + INVALC,INVALC,0x5A34,INVALC,INVALC,0x5A36,0x3E71,INVALC, + /* Block 102, Array index 0x2200 */ + 0x5A35,INVALC,INVALC,INVALC,INVALC,0x5A39,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A37,INVALC,INVALC,INVALC,0x5A38,0x5970,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A3B,0x5A3A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5978,0x5A3C,0x5A30,INVALC,INVALC,0x3B59, + INVALC,INVALC,INVALC,INVALC,0x5A3D,0x5A3E,0x5A40,0x5A3F, + 0x5A41,0x327E,INVALC,0x3936,INVALC,INVALC,0x4A7C,0x402F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x384E,INVALC,INVALC, + 0x5A43,INVALC,INVALC,INVALC,INVALC,0x5A46,INVALC,0x4952, + INVALC,0x355F,INVALC,INVALC,INVALC,0x5A45,0x5A44,0x4754, + 0x5A47,0x3635,INVALC,INVALC,INVALC,0x5A49,0x5A48,INVALC, + INVALC,INVALC,0x343A,0x3B36,INVALC,INVALC,0x4658,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3749,INVALC,INVALC,INVALC, + 0x3F74,INVALC,0x5A4A,INVALC,0x4030,0x4528,INVALC,0x495F, + 0x5A4B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A4C,0x5A4D,INVALC,INVALC,INVALC,0x4A38, + 0x555D,0x4046,INVALC,INVALC,0x494C,INVALC,0x3A58,INVALC, + 0x4865,0x4843,INVALC,INVALC,INVALC,INVALC,INVALC,0x454D, + INVALC,0x4E41,INVALC,0x5A4F,0x3C50,INVALC,INVALC,0x5A50, + INVALC,0x3036,INVALC,INVALC,0x3654,0x404D,INVALC,0x4960, + INVALC,INVALC,INVALC,0x5A51,0x3B42,0x4347,INVALC,0x3B5B, + 0x3F37,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A52, + INVALC,0x4A7D,INVALC,INVALC,0x3177,0x3B5C,INVALC,INVALC, + INVALC,0x5A55,INVALC,0x5A53,0x5A56,0x4E39,0x5A54,INVALC, + INVALC,INVALC,INVALC,0x407B,0x5A57,INVALC,INVALC,0x4232, + INVALC,INVALC,0x5A58,INVALC,INVALC,INVALC,INVALC,0x347A, + INVALC,0x5A5A,INVALC,0x5A59,INVALC,INVALC,INVALC,INVALC, + 0x5A5B,0x5A5C,0x347B,INVALC,INVALC,0x467C,0x4336,0x356C, + 0x3B5D,0x4161,INVALC,INVALC,0x3D5C,0x3030,INVALC,INVALC, + INVALC,0x5A5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3222,0x5A61,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x2300 */ + INVALC,INVALC,0x3937,0x5A60,INVALC,INVALC,0x3A2B,0x3E3A, + INVALC,INVALC,0x5A5F,INVALC,0x3E3B,INVALC,0x4C40,0x3A2A, + INVALC,INVALC,INVALC,0x3057,0x404E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A66,INVALC,INVALC,0x4031, + 0x3147,INVALC,INVALC,INVALC,INVALC,0x3D55,INVALC,0x4B66, + 0x3A72,INVALC,INVALC,INVALC,INVALC,0x3E3C,INVALC,0x4027, + INVALC,INVALC,INVALC,INVALC,0x5A65,0x5A63,0x5A64,INVALC, + INVALC,INVALC,INVALC,INVALC,0x436B,INVALC,INVALC,0x5B26, + INVALC,0x5A6A,0x3B7E,0x3938,0x5A68,INVALC,INVALC,INVALC, + INVALC,0x5A69,INVALC,0x3F38,INVALC,INVALC,INVALC,0x5A67, + INVALC,INVALC,0x3B2F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A6C,0x5A6B,0x5A70, + INVALC,INVALC,0x5A71,INVALC,0x5A6D,INVALC,0x3322,0x5A6E, + 0x5A6F,0x4855,INVALC,INVALC,INVALC,INVALC,0x4961,0x374A, + 0x5A72,INVALC,INVALC,INVALC,0x4032,INVALC,0x3E3D,INVALC, + INVALC,INVALC,0x4352,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3647,INVALC,0x5A73,0x5A77,INVALC,INVALC,0x324B, + 0x5A74,0x5A76,INVALC,INVALC,INVALC,INVALC,0x5A75,INVALC, + INVALC,0x3D6B,INVALC,INVALC,INVALC,INVALC,0x4348,0x3045, + 0x5A78,INVALC,INVALC,INVALC,INVALC,0x5A79,INVALC,INVALC, + INVALC,INVALC,0x442A,INVALC,INVALC,INVALC,0x4E71,INVALC, + INVALC,INVALC,INVALC,0x3B43,INVALC,INVALC,0x4A6B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B3D,INVALC,INVALC,INVALC, + 0x5B22,0x5A7B,INVALC,INVALC,0x5A7E,INVALC,0x5A7D,INVALC, + INVALC,0x5A7A,INVALC,INVALC,0x5B21,INVALC,INVALC,0x465E, + INVALC,0x5A7C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B23,INVALC, + INVALC,0x3D6C,0x5B24,INVALC,0x4D4B,0x4778,INVALC,INVALC, + 0x5B25,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B27,INVALC, + INVALC,0x5B28,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B29,INVALC,0x364A,0x3148,0x3939,0x5B2A,INVALC,0x5B2B, + 0x3D71,0x4162,INVALC,INVALC,0x5258,0x413E,0x413D,0x4258, + /* Block 104, Array index 0x2400 */ + 0x3A47,INVALC,INVALC,0x5072,INVALC,INVALC,INVALC,INVALC, + 0x376E,0x4D2D,INVALC,0x4A7E,INVALC,0x497E,INVALC,0x5B2C, + INVALC,INVALC,INVALC,INVALC,0x3A73,0x443F,0x5B2D,0x4F2F, + INVALC,INVALC,INVALC,0x4B3E,INVALC,0x442B,0x5B2E,0x347C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B2F,0x5B30, + 0x4C5A,INVALC,0x4C24,0x4B76,0x4B5C,0x3B25,0x5B32,INVALC, + INVALC,0x3C6B,INVALC,INVALC,0x4B51,INVALC,0x5B34,0x5B37, + 0x5B36,INVALC,0x3479,INVALC,INVALC,0x3560,INVALC,0x5B33, + INVALC,0x5B35,INVALC,INVALC,INVALC,INVALC,0x5B38,INVALC, + INVALC,0x3F79,INVALC,INVALC,INVALC,INVALC,0x4D7B,0x3049, + 0x3A60,0x423C,INVALC,0x3C5D,INVALC,INVALC,0x3E73,INVALC, + INVALC,0x5B3B,INVALC,INVALC,0x454E,INVALC,0x5B39,0x422B, + 0x5B3A,0x3E72,0x4C5D,0x5B3C,0x5B3D,0x4D68,INVALC,INVALC, + INVALC,INVALC,0x5B42,INVALC,INVALC,0x393A,INVALC,0x4755, + 0x5B3F,0x456C,0x5A5E,0x5A62,INVALC,0x354F,INVALC,0x4747, + INVALC,INVALC,INVALC,INVALC,0x5B41,INVALC,0x3E3E,0x4844, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B47,INVALC,0x487A, + INVALC,0x5B3E,INVALC,0x5B44,0x5B43,INVALC,INVALC,INVALC, + 0x404F,INVALC,INVALC,INVALC,INVALC,0x4B6D,INVALC,0x4E53, + INVALC,INVALC,0x4B67,INVALC,0x324C,0x3B5E,INVALC,INVALC, + 0x4F48,0x5B46,0x3F75,INVALC,INVALC,INVALC,0x5B45,INVALC, + INVALC,0x5B40,INVALC,INVALC,INVALC,INVALC,INVALC,0x384F, + INVALC,INVALC,INVALC,0x5B4C,0x5B4A,INVALC,0x324D,0x5B48, + 0x5B4E,0x5B54,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4248,INVALC,INVALC,0x4A41,INVALC,0x5B56,INVALC, + INVALC,INVALC,0x4922,INVALC,INVALC,INVALC,0x5B55,0x4770, + 0x4B3F,0x343B,INVALC,0x4077,0x3D40,INVALC,INVALC,INVALC, + 0x4453,INVALC,0x4D2E,INVALC,INVALC,0x5B51,0x5B50,INVALC, + INVALC,INVALC,0x5B52,INVALC,0x5B4F,INVALC,INVALC,0x5B57, + INVALC,0x5B4D,INVALC,INVALC,0x5B4B,INVALC,0x5B53,0x5B49, + INVALC,0x436C,INVALC,0x4C78,0x3C46,0x3A74,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3A3A,INVALC,INVALC,0x4B6F,0x3341, + /* Block 105, Array index 0x2500 */ + INVALC,INVALC,0x444E,0x464A,0x3149,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4072,INVALC,INVALC,0x4034,0x372A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B59,INVALC, + INVALC,0x393B,0x337C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B5B,0x3374,0x5B61,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B5E,INVALC,0x4073,INVALC,INVALC,INVALC, + 0x334B,0x3A2C,INVALC,INVALC,0x334A,0x3A4F,INVALC,INVALC, + 0x5B5C,0x3765,0x374B,0x456D,INVALC,INVALC,0x5B5A,INVALC, + 0x3046,INVALC,INVALC,INVALC,INVALC,0x5B5D,0x5B5F,INVALC, + 0x364D,0x372C,INVALC,0x343C,0x354B,INVALC,INVALC,INVALC, + INVALC,0x5B62,INVALC,INVALC,0x3A79,0x4B71,INVALC,0x3B37, + INVALC,INVALC,INVALC,0x5B63,INVALC,INVALC,INVALC,0x4930, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B6F,INVALC,0x3233,0x5B64, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B75,0x5B65, + INVALC,0x4E42,INVALC,0x5B6C,INVALC,0x475F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B74,INVALC,0x5B67, + INVALC,INVALC,INVALC,0x3034,0x5B69,INVALC,INVALC,0x393C, + INVALC,INVALC,INVALC,0x5B6B,INVALC,0x5B6A,INVALC,0x5B66, + 0x5B71,INVALC,0x3E3F,INVALC,INVALC,INVALC,0x546D,0x3868, + 0x4D7C,INVALC,INVALC,INVALC,INVALC,0x5B68,INVALC,0x4474, + 0x3323,0x3A2D,INVALC,0x5B60,INVALC,0x5B70,0x3361,INVALC, + INVALC,0x5B6E,0x5B72,INVALC,0x456E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x347E,INVALC,0x5C32,INVALC, + INVALC,0x4C49,0x5B77,0x347D,INVALC,0x5B7E,INVALC,INVALC, + INVALC,INVALC,0x4B40,INVALC,0x5C21,0x5C23,INVALC,0x5C27, + 0x5B79,INVALC,0x432A,INVALC,INVALC,INVALC,INVALC,0x456F, + 0x5C2B,0x5B7C,INVALC,0x5C28,INVALC,INVALC,INVALC,0x5C22, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F39,0x5C2C, + INVALC,INVALC,0x4033,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C2A,0x343D,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x2600 */ + 0x4F50,0x5B76,INVALC,INVALC,0x5C26,0x3058,INVALC,INVALC, + 0x5B78,INVALC,INVALC,0x4C3A,0x5B7D,0x3F22,0x4447,0x5B73, + INVALC,INVALC,0x5C25,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F7A,0x5C2F,0x3371,0x3821,INVALC,INVALC,INVALC, + INVALC,0x5C31,0x5B7A,0x5C30,INVALC,0x5C29,0x5B7B,INVALC, + 0x5C2D,INVALC,0x5C2E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C3F,INVALC,INVALC,INVALC,0x464E,INVALC,0x5C24,INVALC, + INVALC,0x5C3B,INVALC,INVALC,INVALC,0x5C3D,INVALC,0x4458, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D4C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4976,0x5C38,0x424A,INVALC,INVALC, + INVALC,0x5C3E,0x413F,INVALC,0x5C35,0x5C42,0x5C41,INVALC, + 0x466F,0x5C40,0x466A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C44,0x5C37,INVALC,0x3648,0x5C3A,0x3D5D, + INVALC,INVALC,INVALC,0x4760,0x5C3C,0x364B,INVALC,0x5C34, + 0x5C36,0x5C33,INVALC,INVALC,0x4F30,0x335A,0x5C39,INVALC, + INVALC,0x5C43,0x3335,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A67,INVALC,INVALC,INVALC,0x315D,INVALC, + INVALC,0x5C54,INVALC,INVALC,0x4F31,0x5C57,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F3A,0x5C56,INVALC,INVALC,INVALC, + 0x5C55,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C52, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C46,INVALC, + INVALC,0x5C63,0x5C45,INVALC,0x5C58,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C50,INVALC,INVALC,0x5C4B,0x5C48, + INVALC,0x5C49,INVALC,0x5C51,INVALC,INVALC,INVALC,0x7422, + INVALC,INVALC,0x5C4E,0x393D,0x4448,0x4164,0x5C4C,INVALC, + 0x5C47,INVALC,INVALC,0x5C4A,INVALC,INVALC,INVALC,INVALC, + 0x4D4D,0x4B6A,INVALC,INVALC,INVALC,0x5C4F,0x5C59,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C61, + 0x5C5A,INVALC,INVALC,0x5C67,INVALC,0x5C65,INVALC,INVALC, + INVALC,INVALC,0x5C60,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C5F,INVALC,0x4450,INVALC,0x4165,INVALC,0x5C5D, + /* Block 107, Array index 0x2700 */ + INVALC,INVALC,0x5C5B,INVALC,INVALC,0x5C62,INVALC,INVALC, + INVALC,INVALC,0x5C68,0x4875,0x5C6E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C69,0x5C6C,0x5C66,INVALC,INVALC,0x4374, + INVALC,0x4938,INVALC,0x5C5C,INVALC,INVALC,0x5C64,0x3E40, + INVALC,0x4C4F,0x5C78,0x5C6B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3822,0x3223,0x335F,INVALC,INVALC,0x5C53,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E41,0x5C70,INVALC, + 0x5C77,0x3C79,0x3372,INVALC,INVALC,0x432E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C6D,INVALC,INVALC,0x5C72, + 0x5C76,INVALC,INVALC,0x3636,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x354C,0x5C74,INVALC,INVALC,INVALC,INVALC,INVALC,0x3521, + INVALC,0x464B,0x5C73,INVALC,INVALC,INVALC,0x5C75,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C6F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3360, + 0x4349,INVALC,INVALC,INVALC,0x5C7C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C7A,0x3869,INVALC, + 0x5C79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D21, + INVALC,INVALC,INVALC,INVALC,0x5B58,INVALC,INVALC,INVALC, + 0x5C7B,INVALC,0x5C7D,0x5C7E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D2C,INVALC,0x5D28,INVALC,0x5B6D,INVALC, + INVALC,INVALC,INVALC,0x5D27,INVALC,INVALC,INVALC,INVALC, + 0x5D26,INVALC,INVALC,0x5D23,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C6A,0x5D25,0x5D24,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D2A,INVALC,0x4F26,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D2D,0x367B,INVALC,INVALC,0x5D29,0x5D2B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4827,INVALC,0x5D2E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D32,0x5D2F,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,0x4D73,0x5D30,INVALC,INVALC, + INVALC,INVALC,0x5C5E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D33,INVALC,INVALC,INVALC,0x5D34,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3135,INVALC,0x5D36, + 0x3767,0x3C21,INVALC,0x3655,INVALC,INVALC,INVALC,0x3224, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D5F,INVALC,INVALC,INVALC,INVALC,0x5D38, + 0x5D37,0x5D3A,0x353D,INVALC,INVALC,0x3656,0x343E,INVALC, + INVALC,INVALC,INVALC,0x5D3D,INVALC,INVALC,INVALC,0x5D3C, + INVALC,0x5D3E,INVALC,INVALC,0x324E,INVALC,0x4337,INVALC, + 0x5D3F,INVALC,INVALC,0x343F,0x5D41,INVALC,INVALC,INVALC, + INVALC,0x5D40,INVALC,0x5D42,INVALC,INVALC,INVALC,0x5D43, + INVALC,0x5D44,0x3B5F,0x4035,0x3A21,INVALC,0x4970,INVALC, + INVALC,0x4A62,0x4F44,INVALC,INVALC,INVALC,INVALC,0x3B75, + INVALC,INVALC,INVALC,0x3A50,0x4E72,INVALC,INVALC,INVALC, + 0x5D45,0x5D46,INVALC,0x3B60,INVALC,INVALC,INVALC,0x5D47, + 0x5D48,INVALC,INVALC,0x5D4A,0x5D49,INVALC,0x4B58,INVALC, + INVALC,0x3D5E,0x3C6C,0x3B44,INVALC,0x5D4B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D4D,0x3F23,INVALC, + 0x5D4C,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D4E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D4F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D50,0x5D51,INVALC,INVALC,INVALC,0x5D52, + INVALC,0x5D54,0x5D53,0x5D55,0x3225,0x434A,INVALC,0x5D56, + INVALC,INVALC,0x3B26,0x334C,0x5D57,INVALC,INVALC,0x4542, + 0x544C,INVALC,INVALC,INVALC,INVALC,0x3523,0x5D58,INVALC, + INVALC,INVALC,INVALC,0x5D59,INVALC,0x4A6C,0x4B68,INVALC, + INVALC,INVALC,0x4647,0x5D5A,0x4866,INVALC,INVALC,INVALC, + 0x487B,INVALC,INVALC,0x4C53,INVALC,INVALC,INVALC,0x5D5B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D5D,0x5D5C,INVALC,INVALC,0x5D5F, + INVALC,INVALC,INVALC,0x5D5E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D61,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B61, + INVALC,0x4C31,INVALC,0x5D62,0x5D63,INVALC,INVALC,0x3524, + INVALC,INVALC,INVALC,0x5D64,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D66,0x5D65,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F65,INVALC,INVALC,0x4939, + 0x314A,INVALC,INVALC,INVALC,INVALC,INVALC,0x4845,INVALC, + 0x4475,0x3D41,0x3561,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4846,INVALC, + 0x3C2E,INVALC,INVALC,INVALC,INVALC,0x5D68,INVALC,0x3440, + INVALC,INVALC,0x3178,INVALC,INVALC,0x4672,0x5D67,0x393E, + 0x4353,INVALC,0x5D69,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D71,INVALC,0x5D6A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4241,INVALC,0x3562,0x5D72,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3768,INVALC,INVALC,0x3525,0x5D70,INVALC, + INVALC,0x5D6E,0x5D6B,0x4D60,INVALC,INVALC,INVALC,INVALC, + 0x4440,INVALC,INVALC,INVALC,0x4659,0x5D6C,INVALC,INVALC, + 0x5D74,INVALC,0x5D73,0x3723,INVALC,INVALC,0x322D,INVALC, + INVALC,0x3A3B,0x5D6D,0x5D6F,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4B57,0x4274,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B77,INVALC,INVALC,0x5D7C,INVALC, + INVALC,0x5D7D,INVALC,0x324F,INVALC,INVALC,INVALC,INVALC, + 0x4A28,0x4C7D,0x5E21,0x3C23,0x3E42,0x5D78,0x5D7E,0x3168, + INVALC,0x3637,INVALC,INVALC,0x5D75,0x5D7A,INVALC,INVALC, + INVALC,0x4074,0x4771,INVALC,0x4867,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D77,INVALC,0x4B21,INVALC,0x5D79, + INVALC,0x5E24,INVALC,0x5E22,INVALC,0x5D7B,INVALC,INVALC, + INVALC,0x4B22,0x4748,0x3563,INVALC,0x4525,INVALC,INVALC, + 0x436D,INVALC,0x5E25,INVALC,INVALC,INVALC,INVALC,0x5E23, + 0x4259,0x5D76,INVALC,0x314B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D4E,0x5E30,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E2F,INVALC,INVALC,INVALC,INVALC,0x4076, + INVALC,0x5E2C,INVALC,0x4D6C,INVALC,INVALC,0x4636,0x5E26, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4445,INVALC,INVALC, + INVALC,0x314C,0x393F,0x5E29,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3D27,0x5E2E,INVALC,0x5E2D,0x5E28,INVALC, + 0x5E2B,INVALC,INVALC,0x3368,INVALC,0x5E2A,0x4749,INVALC, + INVALC,0x4E2E,INVALC,INVALC,0x3E74,0x4075,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E36,0x5E34,INVALC,0x494D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E31,0x5E33,INVALC,0x313A,INVALC, + INVALC,0x3940,0x4F32,INVALC,0x333D,INVALC,0x4962,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D61,INVALC,INVALC,0x3324, + 0x3F3B,0x5E35,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E3A,INVALC,INVALC, + 0x3E43,INVALC,INVALC,INVALC,0x4D30,INVALC,0x5E37,INVALC, + INVALC,INVALC,INVALC,0x5E32,INVALC,0x5E38,INVALC,INVALC, + INVALC,0x4E5E,INVALC,0x4573,0x4642,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3336, + INVALC,INVALC,0x3155,INVALC,INVALC,0x5E3E,INVALC,INVALC, + 0x5E41,INVALC,INVALC,INVALC,0x4E43,INVALC,INVALC,INVALC, + 0x4D64,INVALC,INVALC,INVALC,INVALC,0x5E48,0x5E42,0x5E3F, + INVALC,INVALC,INVALC,0x4E54,0x5E45,INVALC,INVALC,INVALC, + INVALC,0x3D4A,0x5E47,INVALC,INVALC,0x5E4C,INVALC,INVALC, + 0x4571,0x5E4A,INVALC,INVALC,INVALC,INVALC,0x5E44,INVALC, + INVALC,0x4338,INVALC,INVALC,0x5E4B,INVALC,0x5E40,INVALC, + 0x5E46,INVALC,0x5E4D,0x307C,0x5E43,INVALC,0x5E4E,INVALC, + INVALC,0x3F3C,INVALC,0x3D5F,INVALC,0x4A25,INVALC,0x3A2E, + INVALC,0x5E3B,0x5E49,0x453A,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x4036,INVALC,0x3369, + 0x3A51,0x3E44,0x5E3D,0x3D42,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x374C,INVALC,0x5E3C,INVALC,INVALC, + INVALC,0x5E52,0x3D6D,0x383A,INVALC,0x5E61,INVALC,0x5E5B, + 0x3574,0x454F,INVALC,0x5E56,0x5E5F,0x302F,0x3132,INVALC, + INVALC,0x3239,INVALC,0x5E58,0x422C,0x5E4F,0x5E51,0x3941, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E62,INVALC,0x5E5D,INVALC,INVALC,INVALC,0x5E55,INVALC, + INVALC,INVALC,INVALC,0x5E5C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C2B,INVALC,INVALC,0x5E5A,0x5E5E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3850,INVALC, + 0x3E45,INVALC,INVALC,0x4339,INVALC,INVALC,INVALC,0x5E54, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D2F, + INVALC,INVALC,INVALC,0x5E57,INVALC,INVALC,0x5E50,0x4572, + INVALC,INVALC,0x5E53,INVALC,INVALC,INVALC,0x5E59,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F51,0x3C3E, + 0x4B7E,INVALC,0x5E63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x482E,INVALC,INVALC,0x5E6F, + 0x383B,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D60,INVALC, + 0x5E65,INVALC,INVALC,INVALC,0x4E2F,0x3942,INVALC,0x5E72, + INVALC,INVALC,0x306E,INVALC,INVALC,0x5E70,INVALC,INVALC, + INVALC,INVALC,0x5E64,INVALC,INVALC,INVALC,INVALC,0x5E6A, + INVALC,INVALC,0x5E6C,INVALC,INVALC,INVALC,0x4D4F,0x5E67, + INVALC,INVALC,0x452E,INVALC,INVALC,0x5E69,INVALC,INVALC, + INVALC,INVALC,0x5E71,INVALC,0x5E6B,0x4C47,INVALC,INVALC, + INVALC,0x5E66,INVALC,0x3C22,0x5E7E,INVALC,INVALC,INVALC, + INVALC,0x336A,INVALC,0x5E68,0x5E6D,0x5E6E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x426C,0x425A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E76,INVALC,INVALC,0x5E7C, + INVALC,INVALC,0x5E7A,INVALC,0x4529,INVALC,INVALC,0x5F23, + 0x5E77,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E78,0x5E60, + /* Block 112, Array index 0x2C00 */ + INVALC,0x3579,0x493A,INVALC,INVALC,INVALC,0x3C3F,INVALC, + INVALC,0x3977,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F33, + INVALC,0x5E74,INVALC,0x5F22,0x3169,0x4166,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4779,INVALC,0x3441,0x4E7A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4C21,0x4452,INVALC,INVALC,INVALC, + INVALC,0x5E7B,0x5E7D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4132,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F21,0x5E79, + INVALC,0x5E73,INVALC,INVALC,INVALC,0x3443,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3769,INVALC,INVALC,INVALC, + 0x5F2F,INVALC,INVALC,0x5F2A,0x4078,INVALC,INVALC,0x3363, + INVALC,INVALC,INVALC,INVALC,0x3D61,INVALC,0x5F33,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F2C,0x442C,0x5F29, + 0x4459,INVALC,INVALC,INVALC,0x5F4C,INVALC,INVALC,INVALC, + 0x5F26,INVALC,0x5F25,INVALC,0x5F2E,INVALC,INVALC,INVALC, + 0x5F28,0x5F27,0x5F2D,INVALC,0x4021,INVALC,0x5F24,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F30,INVALC, + INVALC,0x5F31,INVALC,INVALC,INVALC,INVALC,INVALC,0x3442, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F36,INVALC,0x5F35,0x5F37,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F3A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4543,INVALC,0x5F34,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3763,0x4279,0x5F32,0x473B,INVALC,INVALC,0x5F39,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F3E,0x5F3C,INVALC,INVALC, + 0x5F3F,INVALC,INVALC,0x5F42,INVALC,INVALC,INVALC,0x5F3B, + 0x396A,0x4728,INVALC,INVALC,0x5E39,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D74,0x5F3D,INVALC,0x5F41,0x4275, + INVALC,0x5F40,INVALC,0x5F2B,INVALC,INVALC,0x6F69,INVALC, + INVALC,INVALC,0x5F45,INVALC,INVALC,INVALC,0x5F49,INVALC, + /* Block 113, Array index 0x2D00 */ + INVALC,0x5F47,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F43,INVALC,0x5F44,INVALC,INVALC,INVALC,0x5F48, + INVALC,0x5F46,INVALC,INVALC,INVALC,0x494E,INVALC,INVALC, + 0x5F4E,INVALC,0x5F4B,0x5F4A,INVALC,0x5F4D,0x4654,0x5F4F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4375,0x426D, + INVALC,INVALC,INVALC,INVALC,0x4025,INVALC,INVALC,INVALC, + 0x5F50,INVALC,0x5F52,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E75,INVALC,INVALC,INVALC, + INVALC,0x5F53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4667,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5F54,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3250,INVALC,INVALC,INVALC,0x4574, + 0x3325,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3564,INVALC,INVALC,INVALC,0x3C5E,0x3A52,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F27,0x3F66,INVALC,INVALC,INVALC,0x316A,INVALC, + INVALC,INVALC,0x5F56,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F55,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F59,0x433A,0x5F5C,0x5F57, + INVALC,INVALC,INVALC,0x5F5B,INVALC,INVALC,INVALC,INVALC, + 0x5F5A,0x4540,0x3059,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E75,INVALC,INVALC,0x5F5E,INVALC,INVALC,INVALC,0x3128, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F60,INVALC,INVALC,INVALC,0x5F5F,INVALC,0x5F5D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F58,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4B23,INVALC,INVALC,INVALC,0x5F62,INVALC,INVALC, + /* Block 114, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F61,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x316B,INVALC,INVALC,INVALC, + INVALC,0x5F64,0x4A32,INVALC,0x5F63,INVALC,INVALC,INVALC, + INVALC,0x4C35,INVALC,INVALC,INVALC,INVALC,0x3E47,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4133,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E46,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E7B,INVALC,INVALC,0x5F6A,INVALC,0x4079,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F66,0x5F6B,INVALC, + INVALC,0x316C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F69,INVALC,0x4761,0x5F65,0x5F68,0x3E48, + INVALC,0x4851,INVALC,INVALC,0x5F6C,INVALC,0x3C51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x407A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F6F,INVALC,INVALC,INVALC, + 0x5F67,INVALC,0x3727,INVALC,INVALC,INVALC,INVALC,0x5F6D, + INVALC,INVALC,INVALC,INVALC,0x4D50,0x5F70,INVALC,INVALC, + INVALC,0x7426,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D4F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F71,INVALC,INVALC,INVALC,0x5F72,INVALC,INVALC,INVALC, + INVALC,0x472E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F74,INVALC,INVALC,INVALC,INVALC,0x5F75,INVALC, + INVALC,INVALC,INVALC,0x4733,INVALC,INVALC,INVALC,INVALC, + 0x4575,0x5F77,INVALC,INVALC,INVALC,INVALC,0x5F79,INVALC, + 0x4E55,INVALC,0x5F76,INVALC,0x5F78,0x316D,INVALC,0x5F73, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x535B, + 0x5F7A,INVALC,INVALC,INVALC,INVALC,0x4167,0x3B38,0x5F7C, + INVALC,INVALC,INVALC,INVALC,0x5F7B,0x3F24,0x5259,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F7D,INVALC,INVALC, + INVALC,0x6021,INVALC,0x5F6E,0x5F7E,INVALC,INVALC,0x6022, + /* Block 115, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x477A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6023,INVALC,INVALC, + 0x6024,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6025,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6026,INVALC,0x445E,INVALC,0x6028,0x6027,INVALC,INVALC, + 0x6029,INVALC,0x602A,INVALC,INVALC,0x3C5F,0x4963,INVALC, + INVALC,INVALC,0x4C6C,0x602B,0x602C,0x4156,0x3C24,0x602D, + 0x602E,INVALC,INVALC,INVALC,INVALC,INVALC,0x602F,0x4A52, + 0x4847,INVALC,INVALC,0x6030,0x4757,INVALC,INVALC,INVALC, + INVALC,INVALC,0x442D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6031,0x3267,INVALC,0x356D,INVALC,0x4C46,INVALC,0x4C36, + INVALC,0x3234,0x4F34,INVALC,INVALC,INVALC,INVALC,0x4B52, + INVALC,0x4A2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4037,INVALC,0x6032,INVALC,INVALC,INVALC, + INVALC,0x4643,INVALC,INVALC,INVALC,0x3823,0x6033,INVALC, + 0x3A54,0x6035,0x6034,INVALC,INVALC,INVALC,INVALC,0x6036, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6037,INVALC,INVALC,INVALC,0x6038,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x353E,INVALC,0x6039,INVALC,INVALC,INVALC,INVALC,0x603A, + INVALC,INVALC,INVALC,INVALC,0x3824,INVALC,INVALC,0x4848, + INVALC,INVALC,0x603C,INVALC,INVALC,INVALC,0x3E75,INVALC, + INVALC,0x603B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3638,0x603D,0x603F,INVALC,0x603E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6040,INVALC, + 0x3851,INVALC,0x6041,INVALC,INVALC,INVALC,INVALC,0x3669, + INVALC,0x4140,INVALC,0x397D,INVALC,INVALC,INVALC,INVALC, + 0x6043,0x6044,0x6042,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3C6D,INVALC,INVALC,0x4648,0x3639,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6046, + 0x432C,0x6045,INVALC,INVALC,0x4F35,0x4762,INVALC,INVALC, + /* Block 116, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6049,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x604B,0x6048, + INVALC,INVALC,INVALC,0x4C54,0x604A,0x604C,INVALC,0x4E44, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6050,INVALC,INVALC, + INVALC,0x604F,0x4376,0x472D,INVALC,INVALC,0x3825,0x604E, + INVALC,INVALC,INVALC,INVALC,0x604D,INVALC,0x4D31,0x4D32, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6051,0x316E, + INVALC,INVALC,INVALC,INVALC,0x3976,0x3B62,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6052,0x6053, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6055, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D43,INVALC,INVALC,INVALC,INVALC, + 0x6057,INVALC,0x6056,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6058,INVALC,0x334D,INVALC,INVALC,0x605A,INVALC,INVALC, + 0x6059,INVALC,0x605C,0x605B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x383C,INVALC,INVALC,0x4E28, + INVALC,0x364C,INVALC,0x3226,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x366A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3461,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E68,0x605E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6060,INVALC,INVALC,INVALC,INVALC, + 0x6061,INVALC,0x3251,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x605D,INVALC,0x3B39,INVALC,INVALC,0x4441,0x605F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6064,INVALC, + 0x3C6E,INVALC,INVALC,INVALC,INVALC,0x6062,INVALC,INVALC, + INVALC,INVALC,0x373E,INVALC,INVALC,0x4849,0x6063,INVALC, + INVALC,0x607E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6069,INVALC,INVALC,INVALC,INVALC,INVALC,0x383D,INVALC, + /* Block 117, Array index 0x3100 */ + INVALC,INVALC,INVALC,0x3565,INVALC,0x6066,0x4D7D,INVALC, + INVALC,0x4E30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4276,INVALC,INVALC,0x6068,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x606A,0x4E56,0x3657,0x487C,0x474A,INVALC, + INVALC,INVALC,0x606B,INVALC,INVALC,INVALC,INVALC,0x606D, + INVALC,0x6070,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x606C,INVALC,INVALC, + INVALC,0x606F,0x386A,0x314D,0x6071,INVALC,0x3F70,0x606E, + 0x4E5C,INVALC,INVALC,0x6074,0x7424,INVALC,INVALC,INVALC, + INVALC,0x6072,0x6075,INVALC,INVALC,INVALC,INVALC,0x6067, + 0x6073,INVALC,INVALC,0x3A3C,INVALC,INVALC,0x6076,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6077,INVALC, + INVALC,INVALC,INVALC,0x4D7E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6078,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6079,INVALC, + INVALC,INVALC,0x6065,INVALC,INVALC,INVALC,INVALC,0x607A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3444,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C25,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x607B,INVALC,INVALC,INVALC,INVALC,0x607C, + INVALC,INVALC,INVALC,INVALC,0x607D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x313B,INVALC,INVALC,INVALC, + 0x6121,INVALC,0x493B,0x6122,INVALC,INVALC,0x3424,0x6123, + INVALC,0x6124,INVALC,INVALC,INVALC,INVALC,0x6125,INVALC, + 0x6127,0x6128,0x6126,INVALC,INVALC,INVALC,0x4953,0x612A, + 0x6129,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 118, Array index 0x3200 */ + INVALC,INVALC,INVALC,0x612C,0x612B,0x612D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x612E,0x6130,0x612F,INVALC, + INVALC,0x3979,INVALC,0x6132,INVALC,0x6131,INVALC,INVALC, + 0x3445,INVALC,0x3F53,INVALC,0x453C,INVALC,0x6133,0x4038, + INVALC,INVALC,INVALC,0x3B3A,INVALC,0x3179,0x6134,INVALC, + 0x4D51,INVALC,INVALC,0x4A63,0x6135,INVALC,INVALC,INVALC, + 0x4544,0x4D33,0x3943,0x3F3D,INVALC,INVALC,INVALC,0x434B, + 0x5234,INVALC,0x442E,0x3268,0x6136,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6137,INVALC,0x613C,INVALC, + INVALC,0x613A,0x6139,0x5A42,0x3326,0x6138,INVALC,0x305A, + INVALC,0x482A,INVALC,INVALC,0x484A,INVALC,INVALC,INVALC, + INVALC,0x4E31,0x613D,0x613B,0x435C,0x4026,INVALC,INVALC, + 0x482B,INVALC,0x492D,INVALC,0x613F,0x4E2C,0x374D,0x6140, + INVALC,0x613E,0x4856,0x6141,INVALC,0x6142,INVALC,INVALC, + 0x305B,INVALC,INVALC,0x3E76,0x6147,INVALC,0x6144,0x466D, + 0x6143,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3526, + INVALC,INVALC,0x614A,INVALC,INVALC,INVALC,0x6145,0x6146, + INVALC,0x6149,0x6148,0x4925,INVALC,INVALC,0x4142,0x4141, + INVALC,0x353F,INVALC,INVALC,0x614B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x614C,INVALC,INVALC,0x614D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x614F,INVALC,0x614E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3156,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6157,0x4868,0x6151,INVALC,0x6153,INVALC,INVALC, + 0x6155,0x3F3E,INVALC,INVALC,0x6156,0x6154,0x3C40,INVALC, + INVALC,INVALC,0x6150,0x6152,INVALC,0x4942,INVALC,0x3E49, + INVALC,INVALC,0x6159,INVALC,INVALC,0x6158,INVALC,INVALC, + INVALC,INVALC,0x615A,INVALC,0x3C26,0x3A2F,INVALC,INVALC, + 0x4577,0x615B,INVALC,0x444B,INVALC,INVALC,0x615D,INVALC, + INVALC,INVALC,0x4E21,0x615C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4169,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6162,INVALC,0x6164,0x6165,0x4354,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6163,INVALC,0x6160,INVALC,0x615E,0x615F, + /* Block 119, Array index 0x3300 */ + INVALC,0x6161,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6168,INVALC,0x6166,INVALC,0x6167,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6169, + 0x616B,0x616C,0x616D,INVALC,0x616E,INVALC,INVALC,0x616A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6170,INVALC,INVALC,INVALC,0x616F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6171,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E45,INVALC,INVALC,INVALC,0x6174,0x6172, + 0x6173,INVALC,INVALC,INVALC,0x3462,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C7E,INVALC,INVALC,INVALC,0x4A4A,INVALC, + 0x6176,INVALC,INVALC,INVALC,0x6175,INVALC,INVALC,INVALC, + INVALC,0x6177,0x6178,INVALC,INVALC,INVALC,INVALC,0x617C, + 0x6179,0x617A,0x617B,INVALC,0x617D,INVALC,INVALC,INVALC, + 0x617E,INVALC,0x6221,INVALC,INVALC,INVALC,0x6222,INVALC, + 0x6223,INVALC,0x482F,0x4550,0x6224,0x4772,0x4934,INVALC, + 0x6225,INVALC,INVALC,0x6226,0x452A,INVALC,0x3327,0x3944, + 0x6227,INVALC,INVALC,0x6228,INVALC,INVALC,0x6229,INVALC, + 0x3B29,INVALC,INVALC,0x622B,INVALC,INVALC,0x622A,INVALC, + INVALC,0x622C,0x622D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4869,INVALC, + 0x622E,INVALC,INVALC,INVALC,0x622F,INVALC,INVALC,0x7369, + 0x6230,0x6231,0x6232,INVALC,INVALC,INVALC,INVALC,0x3B2E, + INVALC,INVALC,0x6233,0x4756,INVALC,INVALC,0x4B5F,INVALC, + 0x314E,INVALC,0x3157,INVALC,INVALC,0x6234,INVALC,INVALC, + INVALC,INVALC,0x6236,INVALC,INVALC,INVALC,0x6235,0x4570, + INVALC,INVALC,INVALC,0x4039,0x5D39,INVALC,0x6237,0x4C41, + INVALC,0x6238,INVALC,0x3446,0x4857,0x6239,INVALC,0x623A, + INVALC,INVALC,0x623B,INVALC,INVALC,INVALC,0x4C5C,INVALC, + INVALC,INVALC,0x4C55,INVALC,0x443E,INVALC,INVALC,INVALC, + 0x416A,INVALC,INVALC,0x623D,INVALC,INVALC,0x3D62,INVALC, + /* Block 120, Array index 0x3400 */ + INVALC,0x3E4A,INVALC,INVALC,0x6240,INVALC,INVALC,0x623F, + 0x623E,0x487D,INVALC,0x3447,0x3829,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6246,INVALC,INVALC,0x6243,0x3F3F, + 0x4C32,INVALC,INVALC,INVALC,0x6242,0x6244,0x6245,INVALC, + INVALC,0x6241,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6247, + 0x6248,INVALC,0x442F,INVALC,0x3463,INVALC,INVALC,INVALC, + 0x4365,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6249, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x624A,0x624D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F67,INVALC,0x4644,INVALC,0x624E,0x4B53,INVALC, + 0x624B,INVALC,INVALC,0x624C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6251,INVALC,INVALC,INVALC,INVALC,0x6250,0x624F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6253,INVALC,INVALC,0x6252,INVALC, + INVALC,0x6254,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6256,INVALC, + 0x6255,INVALC,INVALC,INVALC,INVALC,0x4A4D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D56,0x4E46,INVALC,INVALC, + 0x6257,INVALC,INVALC,0x4637,INVALC,INVALC,0x6258,INVALC, + INVALC,0x6259,INVALC,0x625D,0x625B,0x625C,INVALC,0x625A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x625E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x625F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6260, + INVALC,INVALC,0x6261,0x4C37,0x6262,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C70,0x6263,INVALC,0x434E,INVALC,0x476A, + INVALC,0x366B,INVALC,INVALC,INVALC,0x433B,0x6264,0x363A, + INVALC,INVALC,INVALC,0x4050,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6265,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x3500 */ + INVALC,INVALC,0x3A3D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6266,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6267,INVALC,0x3826,0x3A55,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6269,INVALC,INVALC,INVALC,INVALC,0x4556,0x3A56,0x354E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B24,INVALC,0x474B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4557,INVALC,INVALC,INVALC,INVALC,0x395C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x626B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E4B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E32,0x3945,INVALC,INVALC,0x3827, + INVALC,INVALC,0x4823,INVALC,0x626D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x626F,INVALC,INVALC,INVALC, + INVALC,0x386B,INVALC,INVALC,INVALC,INVALC,0x626E,0x4476, + INVALC,INVALC,INVALC,INVALC,0x6271,0x3337,0x626C,INVALC, + INVALC,0x486A,INVALC,0x3130,INVALC,0x3A6C,INVALC,0x4F52, + INVALC,INVALC,0x6270,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6272,INVALC,INVALC,INVALC,0x4A4B, + INVALC,0x4059,0x6274,INVALC,INVALC,INVALC,INVALC,0x6275, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6273,INVALC,INVALC, + INVALC,INVALC,0x334E,INVALC,0x627B,INVALC,0x627A,INVALC, + INVALC,0x3C27,INVALC,INVALC,INVALC,0x627C,0x6277,INVALC, + INVALC,INVALC,0x627D,0x6278,INVALC,INVALC,INVALC,INVALC, + 0x4858,0x6276,INVALC,INVALC,0x6279,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6322,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6321, + 0x4B61,INVALC,INVALC,INVALC,0x627E,INVALC,INVALC,0x306B, + INVALC,INVALC,INVALC,INVALC,0x6324,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6323,INVALC,INVALC, + /* Block 122, Array index 0x3600 */ + INVALC,0x3E4C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6325, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4143,INVALC, + INVALC,0x6327,0x6326,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6328,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6268,INVALC, + INVALC,INVALC,0x626A,0x632A,0x6329,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C28,INVALC,0x4E69,INVALC,0x3C52,INVALC, + 0x632B,0x3737,INVALC,INVALC,INVALC,INVALC,INVALC,0x3540, + 0x3527,0x3B63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D34,INVALC,INVALC,0x6331,INVALC,0x6330,0x4144,0x632D, + INVALC,INVALC,0x632F,INVALC,INVALC,0x3D4B,0x3F40,0x632E, + 0x632C,INVALC,0x472A,INVALC,INVALC,0x3E4D,INVALC,INVALC, + 0x493C,INVALC,INVALC,INVALC,INVALC,0x3A57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4578, + INVALC,INVALC,0x6332,INVALC,INVALC,INVALC,INVALC,0x6333, + 0x6349,0x3658,INVALC,INVALC,0x4F3D,0x4135,INVALC,INVALC, + INVALC,INVALC,0x6334,INVALC,INVALC,0x3252,0x4477,0x4A21, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6335,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x357A,0x6336, + INVALC,INVALC,0x6338,INVALC,INVALC,INVALC,0x6339,INVALC, + 0x4729,INVALC,INVALC,0x633A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x633B,0x633C,INVALC,INVALC,0x3659,0x3253,0x4645, + 0x3D28,0x3B64,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x633D,INVALC,0x3D29,INVALC,INVALC,INVALC,INVALC, + INVALC,0x324A,0x4943,INVALC,INVALC,0x633E,INVALC,INVALC, + 0x486B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4145, + INVALC,0x6341,INVALC,0x6342,0x4769,INVALC,0x3F41,0x633F, + INVALC,0x4361,INVALC,INVALC,0x6340,INVALC,INVALC,INVALC, + 0x3E4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x305C,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x3700 */ + 0x3529,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6343,INVALC,INVALC,0x4478,INVALC,0x6344,0x4047,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C2D,INVALC,INVALC,0x4923, + 0x6345,0x6346,0x4355,INVALC,0x4E47,INVALC,INVALC,0x6348, + 0x6347,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C6F,INVALC, + INVALC,0x634A,0x3070,INVALC,INVALC,INVALC,INVALC,0x634D, + INVALC,INVALC,INVALC,0x634B,0x3254,0x374E,0x634C,0x3946, + 0x3972,INVALC,0x4A66,0x634E,INVALC,INVALC,0x4B54,INVALC, + INVALC,0x6350,INVALC,INVALC,INVALC,0x4051,0x314F,0x323A, + 0x302C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x634F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6351,0x6352,0x3E77,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6353,INVALC,0x334F,INVALC,INVALC,INVALC,INVALC, + 0x6355,INVALC,INVALC,INVALC,0x376A,INVALC,0x3566,INVALC, + INVALC,0x6356,0x3675,INVALC,INVALC,0x6357,INVALC,0x407C, + INVALC,0x464D,INVALC,0x4060,0x3A75,INVALC,INVALC,INVALC, + 0x6358,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4362,0x416B,INVALC,0x635A,0x635C,0x6359, + 0x635B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3722, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x635D,0x3726,INVALC,INVALC,INVALC,0x3567,0x4D52, + 0x635F,INVALC,INVALC,INVALC,INVALC,INVALC,0x6360,INVALC, + INVALC,INVALC,0x312E,INVALC,INVALC,INVALC,INVALC,0x6363, + INVALC,INVALC,INVALC,0x3376,0x6362,0x6361,INVALC,0x6365, + 0x635E,INVALC,0x6366,0x4E29,INVALC,0x6367,INVALC,0x6368, + INVALC,INVALC,0x5474,0x636A,INVALC,0x6369,INVALC,INVALC, + INVALC,0x636B,0x636C,INVALC,0x4E35,0x636D,INVALC,0x706F, + 0x3E4F,0x636E,0x636F,0x3D57,INVALC,0x4638,0x6370,INVALC, + INVALC,INVALC,0x4328,INVALC,INVALC,0x6371,INVALC,0x433C, + 0x6372,INVALC,INVALC,INVALC,INVALC,INVALC,0x3625,INVALC, + 0x513F,0x435D,0x3C33,INVALC,INVALC,INVALC,INVALC,0x3448, + /* Block 124, Array index 0x3800 */ + INVALC,INVALC,0x6373,INVALC,0x6422,INVALC,0x6376,INVALC, + 0x3568,INVALC,0x6375,0x6424,INVALC,INVALC,INVALC,0x6374, + INVALC,0x3E50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6378,0x6379,INVALC,0x452B,INVALC,INVALC,0x637A,INVALC, + 0x335E,INVALC,INVALC,INVALC,INVALC,0x3F5A,0x4964,INVALC, + 0x637C,INVALC,INVALC,INVALC,0x4268,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6377,INVALC,0x637B,0x637D,INVALC, + INVALC,0x3A7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6426,0x492E,INVALC, + 0x4826,0x4579,INVALC,0x365A,0x6425,0x6423,INVALC,0x4835, + 0x637E,0x435E,0x457B,INVALC,0x457A,INVALC,0x3A76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6438,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6428,INVALC,0x642A, + INVALC,INVALC,INVALC,INVALC,0x642D,INVALC,0x642E,INVALC, + 0x642B,0x642C,INVALC,INVALC,0x6429,0x6427,INVALC,INVALC, + INVALC,INVALC,0x6421,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A4F,0x3255, + INVALC,INVALC,INVALC,0x6435,INVALC,0x6432,INVALC,0x6437, + INVALC,INVALC,0x6436,INVALC,0x4773,0x4C27,INVALC,0x3B3B, + 0x6430,0x6439,0x6434,INVALC,0x6433,0x642F,INVALC,0x6431, + INVALC,0x3449,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x433D,INVALC,INVALC,0x407D,INVALC,INVALC, + INVALC,0x4822,INVALC,INVALC,0x643E,INVALC,INVALC,INVALC, + 0x4824,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4061,0x643B,INVALC,INVALC,0x484F,INVALC,0x643F,0x4A53, + INVALC,0x435B,INVALC,0x643A,0x643C,INVALC,INVALC,0x643D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6440,INVALC,INVALC, + 0x3C44,INVALC,INVALC,INVALC,0x4646,0x6445,0x6444,INVALC, + INVALC,0x6441,INVALC,INVALC,INVALC,0x4F36,INVALC,INVALC, + INVALC,INVALC,INVALC,0x644A,INVALC,INVALC,0x644E,0x644B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 125, Array index 0x3900 */ + 0x6447,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6448, + INVALC,INVALC,INVALC,INVALC,INVALC,0x644D,INVALC,INVALC, + INVALC,0x6442,0x5255,0x6449,0x6443,INVALC,INVALC,0x644C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6452, + INVALC,0x344A,INVALC,0x644F,INVALC,INVALC,INVALC,0x6450, + INVALC,INVALC,0x6451,0x6454,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6453, + 0x4876,INVALC,INVALC,INVALC,INVALC,0x6455,0x4E7C,0x4A6D, + 0x645A,INVALC,INVALC,0x6457,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6456,0x4052,INVALC,0x6459, + 0x645B,INVALC,INVALC,INVALC,0x6458,INVALC,0x645F,INVALC, + 0x645C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x645D, + 0x6446,INVALC,INVALC,INVALC,0x645E,0x6460,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6461,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A46,INVALC,0x6462,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C62,INVALC, + INVALC,0x364E,0x3729,0x6463,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A34,INVALC,0x3F68,INVALC,0x4C30,INVALC,INVALC, + 0x6464,INVALC,0x4E33,INVALC,INVALC,0x4774,INVALC,0x4146, + 0x4734,INVALC,INVALC,0x3D4D,INVALC,INVALC,INVALC,0x3040, + INVALC,0x6469,0x6467,INVALC,0x6465,0x3421,INVALC,0x3E51, + 0x646A,INVALC,INVALC,0x6468,INVALC,0x6466,0x646E,INVALC, + INVALC,0x646D,0x646C,0x646B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x646F,INVALC,INVALC,INVALC,0x6470,0x403A,INVALC, + 0x6471,INVALC,0x6473,INVALC,INVALC,0x6472,INVALC,INVALC, + INVALC,INVALC,0x3852,INVALC,INVALC,INVALC,0x4138,INVALC, + INVALC,INVALC,0x6475,INVALC,INVALC,INVALC,0x457C,INVALC, + 0x6474,INVALC,INVALC,INVALC,0x6476,INVALC,0x4A35,0x416C, + 0x3947,INVALC,0x6477,INVALC,INVALC,INVALC,INVALC,0x4E48, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6479, + INVALC,INVALC,0x647A,INVALC,0x647B,INVALC,0x647C,INVALC, + 0x3B65,INVALC,0x647D,0x374F,INVALC,INVALC,0x356A,INVALC, + /* Block 126, Array index 0x3A00 */ + 0x352A,INVALC,0x6521,INVALC,0x4C73,0x3948,0x647E,INVALC, + INVALC,INVALC,0x6524,0x4C66,INVALC,0x473C,INVALC,INVALC, + 0x4933,INVALC,INVALC,INVALC,0x3D63,0x6523,INVALC,0x3C53, + 0x3949,0x3B66,0x3569,0x4A36,0x6522,INVALC,INVALC,INVALC, + 0x4147,0x4B42,0x3A77,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B67,0x445D,INVALC,0x6527,0x4E5F, + 0x3A59,INVALC,0x6528,0x3F42,INVALC,0x652A,INVALC,INVALC, + INVALC,0x3E52,0x3A30,INVALC,INVALC,INVALC,INVALC,0x6529, + INVALC,INVALC,0x3D2A,0x383E,0x4148,0x6525,0x652B,INVALC, + INVALC,INVALC,INVALC,0x6526,0x3750,INVALC,0x652E,0x6532, + 0x376B,INVALC,INVALC,INVALC,INVALC,INVALC,0x652D,INVALC, + INVALC,INVALC,INVALC,0x6536,INVALC,INVALC,0x394A,INVALC, + INVALC,0x4D6D,0x303C,0x6533,INVALC,INVALC,0x356B,INVALC, + 0x6530,INVALC,INVALC,INVALC,INVALC,INVALC,0x6531,INVALC, + INVALC,0x457D,0x652F,0x652C,INVALC,0x3328,0x4064,INVALC, + INVALC,0x3828,INVALC,INVALC,INVALC,0x6538,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6535,INVALC,INVALC,INVALC,INVALC,INVALC,0x6537, + INVALC,INVALC,INVALC,0x6534,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3751,0x4233,0x6539,0x416E,INVALC,INVALC,0x6546, + INVALC,INVALC,0x6542,0x653C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6540,0x3C7A,0x305D,0x653B,0x6543, + 0x6547,0x394B,0x4C56,INVALC,0x4456,0x653D,INVALC,INVALC, + 0x6545,INVALC,0x653A,0x433E,INVALC,0x653F,0x303D,0x4C4A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x653E, + INVALC,INVALC,0x365B,0x486C,INVALC,INVALC,INVALC,0x416D, + INVALC,0x4E50,0x3D6F,INVALC,INVALC,0x656E,INVALC,INVALC, + 0x6548,INVALC,0x407E,INVALC,0x6544,0x6549,0x654B,INVALC, + 0x4479,0x654E,INVALC,INVALC,0x654A,INVALC,INVALC,INVALC, + 0x4A54,0x344B,INVALC,INVALC,0x4C4B,INVALC,INVALC,0x305E, + INVALC,INVALC,0x654D,INVALC,0x4E7D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x654C,INVALC,INVALC,INVALC,INVALC, + /* Block 127, Array index 0x3B00 */ + INVALC,0x316F,INVALC,INVALC,0x466C,0x654F,INVALC,INVALC, + INVALC,0x6556,0x6550,0x6557,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6553,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x477B,INVALC,INVALC,0x3C4A,0x6555, + INVALC,0x6552,0x6558,0x6551,INVALC,INVALC,0x3D44,INVALC, + INVALC,INVALC,INVALC,0x4B25,INVALC,INVALC,0x3D4C,INVALC, + INVALC,0x6554,0x6560,INVALC,INVALC,0x655C,INVALC,0x655F, + INVALC,0x655D,0x6561,0x655B,INVALC,0x6541,0x4053,INVALC, + INVALC,0x484B,INVALC,0x655E,INVALC,INVALC,0x6559,INVALC, + INVALC,INVALC,0x4121,0x3752,INVALC,0x3D2B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F25,0x4136,0x6564,INVALC, + INVALC,0x6566,0x6567,INVALC,INVALC,0x6563,0x6565,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x655A,0x6562, + INVALC,0x656A,0x6569,INVALC,INVALC,0x4B7A,INVALC,INVALC, + 0x372B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6568,INVALC,0x656C,0x656B,0x656F,INVALC,0x6571, + INVALC,INVALC,0x3B3C,0x656D,INVALC,INVALC,INVALC,INVALC, + 0x6572,0x6573,INVALC,INVALC,0x6574,INVALC,0x657A,0x453B, + 0x6576,INVALC,0x6575,0x6577,0x6578,INVALC,0x6579,INVALC, + INVALC,INVALC,INVALC,0x657B,0x657C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x344C,INVALC, + 0x657D,INVALC,0x657E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6621,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6622,0x6623,0x6624,INVALC, + 0x6625,0x6626,INVALC,INVALC,0x6628,0x6627,INVALC,INVALC, + 0x6629,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x662A, + 0x662B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x662E, + 0x662C,0x662D,0x3A61,0x3753,INVALC,INVALC,0x4356,INVALC, + 0x4833,INVALC,0x3D70,INVALC,INVALC,0x474D,INVALC,0x486D, + 0x662F,0x586D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6630,0x6632,INVALC,0x4D65,0x6631,0x6634, + 0x6633,INVALC,0x4D53,INVALC,0x6635,INVALC,0x487E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6636,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6639,INVALC,INVALC,0x6638,0x6637,INVALC, + INVALC,INVALC,INVALC,0x663A,0x3732,INVALC,INVALC,INVALC, + 0x4122,0x3541,INVALC,INVALC,INVALC,INVALC,0x663E,0x663B, + INVALC,INVALC,0x663C,INVALC,INVALC,INVALC,0x663F,INVALC, + 0x6640,0x663D,INVALC,INVALC,INVALC,0x3129,INVALC,INVALC, + INVALC,0x3227,INVALC,INVALC,INVALC,0x6642,0x6643,INVALC, + INVALC,INVALC,0x6644,INVALC,0x4D62,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3D2C,INVALC,0x6646,0x6645,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F69,0x6647,INVALC,INVALC,INVALC,INVALC,0x6648,INVALC, + INVALC,0x6649,INVALC,0x3465,INVALC,INVALC,INVALC,INVALC, + 0x344D,INVALC,INVALC,0x664A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x664B,INVALC,0x4B5D,0x4D63,INVALC,INVALC,INVALC, + /* Block 129, Array index 0x3D00 */ + 0x4D54,0x4F37,INVALC,0x394D,0x664E,0x3C54,0x664D,INVALC, + INVALC,INVALC,INVALC,0x664F,0x3C29,INVALC,INVALC,INVALC, + 0x4251,INVALC,0x6650,INVALC,INVALC,0x394C,INVALC,0x4C57, + 0x6651,0x6652,INVALC,INVALC,0x6653,INVALC,INVALC,INVALC, + INVALC,0x6654,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6655,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3C2A,INVALC,INVALC,0x4C6D,INVALC, + INVALC,INVALC,INVALC,0x6657,INVALC,0x433F,INVALC,0x6656, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6659,INVALC, + INVALC,INVALC,0x6658,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x665A,INVALC,INVALC,INVALC,0x403B,INVALC, + 0x665B,INVALC,0x665C,INVALC,INVALC,INVALC,0x4A39,0x665D, + INVALC,0x416F,0x665E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x665F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E7E, + 0x6662,INVALC,0x6661,0x6660,0x4430,INVALC,0x6663,0x3F26, + INVALC,0x6664,INVALC,INVALC,INVALC,0x6665,0x4F38,0x6666, + INVALC,INVALC,INVALC,INVALC,0x6667,0x6669,0x6668,0x4825, + INVALC,0x4679,INVALC,0x4F3E,0x4829,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x666B,INVALC,INVALC,0x3E53,INVALC, + 0x492A,INVALC,0x666C,0x666A,INVALC,0x344E,INVALC,INVALC, + INVALC,0x3854,0x3B68,INVALC,INVALC,0x486E,INVALC,INVALC, + INVALC,0x382A,0x4B43,INVALC,0x666F,0x666D,INVALC,0x394E, + INVALC,0x394F,0x3069,INVALC,0x3A68,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4759,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x305F,0x6674,INVALC,0x4340,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4758,INVALC,0x425B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6676,INVALC, + INVALC,0x6672,0x6675,0x6670,INVALC,0x6673,0x4B26,INVALC, + INVALC,0x3855,INVALC,INVALC,0x307D,0x6671,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6678, + INVALC,0x6679,INVALC,INVALC,0x4639,INVALC,INVALC,INVALC, + 0x363B,INVALC,INVALC,INVALC,0x6726,0x473D,INVALC,INVALC, + /* Block 130, Array index 0x3E00 */ + INVALC,INVALC,0x3B69,INVALC,INVALC,0x363C,0x4048,0x4F46, + 0x4C2E,0x6677,0x4054,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3553,0x667A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x667C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x667B,INVALC,INVALC,INVALC,INVALC,INVALC,0x667D, + INVALC,0x4326,INVALC,0x473E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4431,INVALC,INVALC,INVALC,INVALC,0x6723,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6722,INVALC, + INVALC,INVALC,INVALC,0x667E,INVALC,INVALC,0x3F55,INVALC, + 0x4965,0x6725,INVALC,0x6724,0x3950,0x4F53,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6735, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6729,0x672A,INVALC, + INVALC,INVALC,INVALC,0x3C70,INVALC,INVALC,0x6728,INVALC, + 0x3978,0x6727,INVALC,INVALC,0x672B,INVALC,INVALC,INVALC, + 0x4432,0x4A22,0x4123,INVALC,INVALC,INVALC,INVALC,0x425C, + 0x672F,INVALC,0x6730,0x672C,INVALC,INVALC,INVALC,INVALC, + 0x672D,INVALC,0x672E,INVALC,INVALC,INVALC,INVALC,0x3951, + INVALC,INVALC,INVALC,0x6736,INVALC,0x6732,INVALC,INVALC, + INVALC,INVALC,0x4966,INVALC,0x4B6C,0x4928,INVALC,INVALC, + 0x6731,INVALC,INVALC,0x6734,0x6733,INVALC,INVALC,INVALC, + 0x4B44,0x6737,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6738,INVALC,INVALC,0x4137,INVALC,0x6739,INVALC,INVALC, + 0x673B,INVALC,0x673F,INVALC,INVALC,0x673C,0x673A,0x473F, + 0x673D,INVALC,0x673E,INVALC,INVALC,INVALC,0x3232,INVALC, + 0x6745,0x6740,INVALC,INVALC,INVALC,0x6741,INVALC,INVALC, + INVALC,0x6742,INVALC,0x4221,INVALC,INVALC,INVALC,INVALC, + 0x6744,0x6743,0x6746,INVALC,INVALC,INVALC,INVALC,0x6747, + 0x6748,INVALC,INVALC,0x3F43,INVALC,0x3269,INVALC,0x6749, + 0x4E57,INVALC,0x3C2B,INVALC,INVALC,0x3D2D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B6A,0x4357,INVALC,INVALC,INVALC, + INVALC,INVALC,0x674A,0x674B,0x3131,INVALC,0x674C,INVALC, + /* Block 131, Array index 0x3F00 */ + INVALC,0x674D,0x674E,INVALC,INVALC,0x674F,INVALC,0x6750, + 0x363D,0x5A2A,0x6751,INVALC,0x4065,0x6752,0x3C4B,INVALC, + 0x6753,INVALC,0x5030,INVALC,INVALC,INVALC,0x6754,0x4A5E, + 0x345C,INVALC,INVALC,0x4124,0x3D58,INVALC,0x4971,0x3D2E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6755,0x3952,0x6756,0x484C,INVALC,0x6764,INVALC, + INVALC,INVALC,INVALC,0x6758,INVALC,0x4249,0x4775,0x383F, + 0x6757,0x4125,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6759,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x447A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x675B,0x675A,0x675D,INVALC,INVALC,0x675C,INVALC,0x675E, + INVALC,INVALC,0x6760,INVALC,0x675F,INVALC,0x344F,INVALC, + 0x6761,INVALC,0x6762,0x6763,INVALC,INVALC,0x3A31,0x4E49, + INVALC,0x6765,0x3F27,INVALC,INVALC,INVALC,0x3170,0x6766, + 0x6767,INVALC,INVALC,INVALC,INVALC,INVALC,0x6768,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3072,INVALC,0x6769,INVALC,INVALC, + INVALC,INVALC,0x676A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4967,INVALC,INVALC,INVALC,0x3C47,INVALC,0x676C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3329,0x3032,INVALC, + INVALC,INVALC,INVALC,0x676B,0x676E,0x474E,INVALC,0x3F44, + INVALC,0x3256,INVALC,0x4B27,INVALC,INVALC,INVALC,INVALC, + 0x375D,0x365C,INVALC,0x676D,INVALC,0x326A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3423,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3171,0x6772,0x4E6A,0x425D,INVALC,INVALC,0x4944, + INVALC,0x677E,INVALC,0x3257,0x677C,INVALC,0x677A,0x6771, + INVALC,0x676F,INVALC,0x6770,INVALC,0x3C63,0x366C,0x4377, + INVALC,INVALC,INVALC,0x4651,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3151,INVALC,0x6774,0x6773,INVALC,INVALC,INVALC, + INVALC,0x6779,0x6775,0x6778,INVALC,INVALC,INVALC,INVALC, + /* Block 132, Array index 0x4000 */ + INVALC,INVALC,0x4C50,0x6777,0x3258,0x337D,0x677B,INVALC, + INVALC,0x677D,INVALC,INVALC,INVALC,INVALC,0x3754,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6823,0x682C, + 0x682D,INVALC,INVALC,INVALC,0x302B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6834,INVALC,INVALC,INVALC,INVALC, + 0x3071,INVALC,INVALC,0x682B,INVALC,INVALC,INVALC,0x682A, + INVALC,0x6825,0x6824,INVALC,0x6822,0x6821,0x4363,INVALC, + 0x427B,0x6827,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6826,INVALC,INVALC,INVALC,INVALC,0x6829,INVALC,INVALC, + INVALC,0x4170,0x3755,INVALC,INVALC,INVALC,INVALC,0x3141, + 0x6828,INVALC,0x3953,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4171,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x683A,INVALC,0x683B,INVALC,0x3259, + INVALC,INVALC,INVALC,0x322E,0x6838,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x682E,INVALC,0x6836, + INVALC,0x683D,0x6837,INVALC,INVALC,INVALC,0x6835,INVALC, + INVALC,INVALC,INVALC,0x6776,INVALC,INVALC,0x6833,INVALC, + INVALC,INVALC,0x682F,INVALC,INVALC,INVALC,0x3450,0x6831, + 0x683C,INVALC,0x6832,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x683E,INVALC,0x6830,0x477C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D69,INVALC,INVALC,INVALC,0x6839,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x684F,INVALC,INVALC, + INVALC,0x6847,INVALC,INVALC,INVALC,0x3F7B,INVALC,INVALC, + INVALC,INVALC,0x3546,INVALC,0x365D,INVALC,0x6842,INVALC, + INVALC,INVALC,INVALC,0x325B,INVALC,INVALC,0x3E54,INVALC, + 0x6845,INVALC,INVALC,INVALC,0x3A5A,INVALC,INVALC,0x4551, + 0x684A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A6E,INVALC,0x6841,INVALC,INVALC,INVALC,0x325A, + 0x3856,0x4929,0x684B,INVALC,0x683F,INVALC,INVALC,0x6848, + INVALC,INVALC,INVALC,0x6852,INVALC,0x6843,INVALC,INVALC, + /* Block 133, Array index 0x4100 */ + INVALC,INVALC,INVALC,0x6844,0x463A,INVALC,INVALC,0x6849, + INVALC,INVALC,INVALC,0x6846,0x4B28,0x684C,0x3060,INVALC, + INVALC,INVALC,INVALC,0x6840,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x684E,INVALC,0x684D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x476B,0x6854,INVALC,0x685F,INVALC,INVALC,INVALC, + INVALC,0x337E,INVALC,INVALC,INVALC,0x6862,INVALC,INVALC, + 0x6850,INVALC,INVALC,INVALC,0x6855,0x4D6E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x685E,INVALC, + INVALC,0x4D55,INVALC,INVALC,INVALC,INVALC,0x4E2A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4378, + INVALC,INVALC,INVALC,0x336B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4972,0x6864,0x4621,INVALC,INVALC,0x3031,INVALC, + INVALC,0x685D,INVALC,0x6859,0x4172,0x6853,0x685B,0x6860, + INVALC,0x472C,INVALC,INVALC,INVALC,0x302A,INVALC,0x6858, + INVALC,0x6861,0x4978,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x685C,INVALC,0x6857,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3E55,INVALC,INVALC,INVALC,INVALC, + 0x3D2F,INVALC,INVALC,INVALC,0x3C2C,INVALC,INVALC,INVALC, + INVALC,0x4C58,INVALC,INVALC,0x4947,INVALC,INVALC,0x6867, + INVALC,0x6870,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x685A,INVALC,INVALC, + INVALC,INVALC,0x3377,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E78,0x6865,INVALC,0x686A,0x4173,INVALC,INVALC,0x6866, + INVALC,0x686D,INVALC,INVALC,0x435F,INVALC,0x686E,INVALC, + INVALC,0x4D56,0x6863,0x3338,INVALC,0x6869,INVALC,INVALC, + 0x686C,0x4C2C,INVALC,INVALC,INVALC,INVALC,0x686F,INVALC, + INVALC,0x6868,0x686B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B29,INVALC,0x4F21,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6873,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x687A,INVALC,INVALC,0x6872, + /* Block 134, Array index 0x4200 */ + 0x3C43,INVALC,INVALC,INVALC,INVALC,INVALC,0x6851,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A4E,INVALC,0x4C22,0x6879,0x6878,INVALC,0x6874, + 0x6875,INVALC,0x3136,INVALC,INVALC,INVALC,INVALC,0x6877, + INVALC,0x6871,INVALC,INVALC,INVALC,INVALC,0x4455,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6876,0x307E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4222,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A43,INVALC,INVALC, + 0x687B,0x6921,INVALC,0x4859,INVALC,INVALC,INVALC,INVALC, + 0x687E,0x3E56,0x3C49,0x6923,INVALC,INVALC,0x363E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6924,INVALC,0x4979, + 0x687D,INVALC,0x6856,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x687C,INVALC,INVALC,INVALC,INVALC, + 0x4F4F,0x4622,0x4973,INVALC,INVALC,0x692B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6931, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6932,INVALC, + 0x6925,INVALC,INVALC,INVALC,0x4776,INVALC,INVALC,0x692F, + 0x6927,INVALC,0x6929,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6933,0x6928,INVALC,INVALC,0x692C,INVALC,INVALC,0x3172, + INVALC,0x4665,INVALC,0x692D,0x6930,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6926,INVALC,0x4126,INVALC, + 0x692A,0x3B27,0x3F45,0x3730,0x4C74,INVALC,0x4C79,0x3D72, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6937,0x6935,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6934,INVALC,INVALC,INVALC,0x4D75,INVALC,0x6936, + 0x6938,INVALC,INVALC,INVALC,INVALC,0x6939,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x693C,0x693A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4623,0x693B,INVALC,INVALC, + INVALC,0x484D,0x692E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D73, + INVALC,0x693D,0x6942,0x4174,INVALC,INVALC,0x6941,INVALC, + /* Block 135, Array index 0x4300 */ + INVALC,INVALC,0x6922,INVALC,INVALC,INVALC,0x6943,0x4149, + INVALC,INVALC,0x693E,0x6940,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x693F,INVALC,INVALC,0x5D31,0x5D22, + INVALC,INVALC,0x6945,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6944,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D76,INVALC,0x623C, + 0x6946,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6947, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6948,0x3857,INVALC, + 0x3554,INVALC,INVALC,INVALC,0x694A,0x515D,INVALC,INVALC, + INVALC,INVALC,0x3575,INVALC,0x4E3A,INVALC,0x3673,0x694B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x694C, + INVALC,INVALC,INVALC,0x436E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x694D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x467A,INVALC,0x303A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3263,0x6952,0x6953,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x694E,INVALC,0x3B3D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x694F,0x4742,INVALC,INVALC,INVALC, + INVALC,0x6950,0x6951,0x695B,INVALC,INVALC,INVALC,0x6955, + 0x6958,INVALC,INVALC,INVALC,INVALC,INVALC,0x6954,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6956,INVALC,0x6957,0x3C58, + INVALC,0x6959,INVALC,0x4341,INVALC,0x3756,0x3342,INVALC, + INVALC,INVALC,INVALC,INVALC,0x695C,INVALC,INVALC,INVALC, + INVALC,0x333F,INVALC,0x6961,INVALC,INVALC,0x695D,0x6960, + INVALC,INVALC,INVALC,INVALC,0x483A,INVALC,INVALC,INVALC, + INVALC,0x695E,INVALC,INVALC,0x695F,0x4948,0x485A,0x6962, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x427D,0x696C,INVALC,0x6968,INVALC,INVALC,0x326B,INVALC, + /* Block 136, Array index 0x4400 */ + 0x6966,INVALC,0x4B2A,0x6967,INVALC,INVALC,0x6964,INVALC, + 0x6965,0x696A,0x696D,INVALC,INVALC,0x696B,INVALC,INVALC, + INVALC,0x6969,0x6963,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4358,INVALC,0x6974,INVALC,0x4C2A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6972,INVALC,INVALC, + INVALC,0x6973,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x696E,INVALC,INVALC,0x6970, + INVALC,INVALC,INVALC,0x6971,INVALC,INVALC,INVALC,0x696F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4066,INVALC,0x4F39,0x6978,INVALC,0x6979,INVALC, + INVALC,INVALC,INVALC,0x6A21,INVALC,0x3F2A,INVALC,0x697B, + INVALC,0x697E,INVALC,INVALC,INVALC,INVALC,INVALC,0x6976, + 0x6975,INVALC,INVALC,0x6A22,INVALC,INVALC,0x325C,INVALC, + 0x697C,INVALC,0x6A23,INVALC,INVALC,INVALC,0x697D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x697A,INVALC,0x4433,INVALC, + 0x6977,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4768, + INVALC,INVALC,0x6A27,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D3B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A26, + INVALC,INVALC,0x6A25,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6A2E,INVALC,INVALC,INVALC,0x6A28, + INVALC,INVALC,INVALC,0x6A30,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D66,0x6A33,INVALC,0x6A2A,INVALC,INVALC, + 0x6A2B,INVALC,INVALC,INVALC,0x6A2F,INVALC,0x6A32,0x6A31, + INVALC,INVALC,INVALC,0x6A29,INVALC,INVALC,INVALC,INVALC, + 0x6A2C,INVALC,0x6A3D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A34, + INVALC,INVALC,0x6A35,INVALC,INVALC,INVALC,0x6A3A,0x6A3B, + INVALC,0x332A,INVALC,0x3542,INVALC,INVALC,0x6A39,INVALC, + /* Block 137, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A38,0x6A3C,0x6A37, + INVALC,0x6A3E,INVALC,INVALC,INVALC,0x6A40,0x6A3F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A42,0x6A41,0x695A,INVALC,INVALC,INVALC,0x6A46, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A43,INVALC,INVALC,INVALC,INVALC,0x6A44,INVALC, + INVALC,0x6A45,INVALC,0x6A47,INVALC,INVALC,INVALC,INVALC, + 0x376C,INVALC,0x6A49,INVALC,0x6A48,INVALC,0x3D30,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3954,0x5E27,INVALC,INVALC, + INVALC,INVALC,0x6A4A,0x3D51,INVALC,INVALC,INVALC,0x3339, + INVALC,0x6A4B,INVALC,0x3152,INVALC,0x3E57,0x6A4C,INVALC, + INVALC,0x3955,0x6A4D,0x3061,INVALC,INVALC,INVALC,INVALC, + 0x493D,INVALC,INVALC,0x6A4E,INVALC,INVALC,INVALC,INVALC, + 0x3F6A,INVALC,0x6A55,INVALC,INVALC,0x6A52,INVALC,0x436F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A53,0x6A50,0x365E, + INVALC,0x6A4F,0x6A56,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3736,INVALC,INVALC,0x425E,INVALC,0x6A5C,INVALC,INVALC, + INVALC,INVALC,0x6A58,INVALC,INVALC,INVALC,0x4235,0x6A57, + INVALC,0x6A5A,INVALC,INVALC,INVALC,INVALC,0x6A51,INVALC, + INVALC,INVALC,0x6A5B,INVALC,0x6A5D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x486F,INVALC,INVALC,0x6A59,INVALC, + 0x6A5E,0x6A60,INVALC,INVALC,0x3853,0x6A54,INVALC,0x3041, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A5F, + INVALC,0x3A5B,0x4E76,0x6A61,0x6A62,0x4175,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E22, + INVALC,INVALC,INVALC,INVALC,0x6A63,0x4D35,INVALC,INVALC, + 0x6A64,0x6A65,INVALC,INVALC,0x4A64,0x6A66,INVALC,0x3A40, + INVALC,0x4E23,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A6B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A6C,0x3E58,0x6A6A,INVALC,INVALC,INVALC, + 0x4D67,0x6A67,INVALC,INVALC,0x6A69,0x403D,0x3F7E,INVALC, + /* Block 138, Array index 0x4600 */ + INVALC,INVALC,0x6A68,INVALC,0x6A6D,INVALC,INVALC,0x4A23, + INVALC,INVALC,0x6A6F,INVALC,0x6A6E,INVALC,INVALC,INVALC, + 0x336C,INVALC,0x4B2B,0x6A70,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A7C,0x6A72,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A73,INVALC,INVALC, + INVALC,INVALC,0x6A74,0x6A75,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A79,INVALC, + 0x6A7A,INVALC,INVALC,0x6A78,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A76,INVALC,0x6A71,0x6A77,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A7B,0x7037,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3228,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A7E,0x365F, + 0x6A7D,INVALC,INVALC,INVALC,0x6B22,INVALC,0x6B21,INVALC, + INVALC,INVALC,0x6B24,INVALC,INVALC,0x6B23,INVALC,0x6B25, + INVALC,INVALC,0x3D31,INVALC,0x6B26,INVALC,INVALC,0x6B27, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B28,0x403E, + INVALC,0x4D57,INVALC,0x6B29,INVALC,INVALC,0x4A24,0x4746, + 0x6B2A,INVALC,0x6B2B,0x382B,INVALC,INVALC,INVALC,0x352C, + INVALC,INVALC,INVALC,0x6B2C,INVALC,INVALC,0x3B6B,0x4741, + 0x6B2D,INVALC,0x3350,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B2E,INVALC,INVALC,INVALC,INVALC,0x6B30,0x4D77, + INVALC,0x6B2F,0x3F46,INVALC,0x6B31,INVALC,INVALC,0x6B32, + INVALC,INVALC,0x6B33,0x3451,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B34,INVALC,INVALC,0x6B35,INVALC,0x6B36, + 0x6B37,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3351,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B38,INVALC,0x6B39,0x6B3A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3272,INVALC,INVALC,0x3F28,0x6B3B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6B3C,INVALC,INVALC,INVALC, + 0x6B3D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 139, Array index 0x4700 */ + 0x3840,INVALC,0x447B,0x6B3E,INVALC,INVALC,INVALC,INVALC, + 0x3757,INVALC,0x3F56,INVALC,0x6B41,INVALC,0x4624,INVALC, + 0x6B40,INVALC,INVALC,0x3731,INVALC,INVALC,0x6B3F,0x4277, + 0x352D,INVALC,INVALC,0x6B42,INVALC,0x6B43,INVALC,0x3E59, + INVALC,INVALC,INVALC,0x376D,INVALC,0x6B44,INVALC,INVALC, + INVALC,INVALC,0x4B2C,INVALC,INVALC,0x405F,INVALC,INVALC, + INVALC,0x3576,INVALC,0x4C75,0x414A,INVALC,0x6B45,INVALC, + INVALC,INVALC,0x3F47,0x4370,0x3E5A,INVALC,INVALC,INVALC, + INVALC,0x6B46,INVALC,INVALC,INVALC,INVALC,0x6B49,INVALC, + 0x6B4A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A3E,0x4242,0x6B48,INVALC,0x3E5B,0x493E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B47,INVALC,INVALC,0x3B6C,INVALC, + 0x3153,INVALC,0x6B4E,0x3758,INVALC,INVALC,0x3B6E,INVALC, + INVALC,0x3B6D,INVALC,0x4F4D,0x6B4D,0x6B4C,0x4127,INVALC, + 0x354D,0x4F43,0x333A,0x3E5C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6B4B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B50,INVALC,0x6B51,0x6B4F,INVALC,0x3858, + INVALC,0x4D40,INVALC,INVALC,0x3B6F,0x4727,INVALC,INVALC, + INVALC,0x6B54,INVALC,0x4040,INVALC,0x4342,INVALC,INVALC, + 0x4D36,INVALC,0x6B57,INVALC,INVALC,INVALC,0x386C,INVALC, + 0x403F,0x6B53,INVALC,0x6B58,0x386D,0x6B55,0x6B56,INVALC, + 0x6B52,INVALC,INVALC,INVALC,0x4062,0x4649,INVALC,INVALC, + 0x432F,INVALC,0x325D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4870,INVALC,INVALC,0x3543,INVALC,INVALC,0x4434, + INVALC,INVALC,0x6B5B,INVALC,0x6B59,INVALC,INVALC,0x434C, + INVALC,INVALC,INVALC,0x4041,0x3452,0x6B5A,INVALC,0x3F5B, + INVALC,INVALC,0x4E4A,INVALC,INVALC,INVALC,0x4F40,INVALC, + INVALC,INVALC,0x6B5C,0x6B67,0x4435,INVALC,0x6B66,INVALC, + 0x6B63,0x6B6B,0x6B64,INVALC,0x6B60,INVALC,0x447C,0x6B5F, + INVALC,INVALC,INVALC,0x6B5D,INVALC,0x4D21,0x3B70,INVALC, + INVALC,0x6B61,INVALC,0x6B5E,INVALC,INVALC,INVALC,0x6B65, + 0x3D74,INVALC,0x3841,INVALC,INVALC,INVALC,0x427A,INVALC, + /* Block 140, Array index 0x4800 */ + 0x4B45,0x315A,0x3062,INVALC,0x4625,INVALC,INVALC,0x6B69, + INVALC,INVALC,INVALC,INVALC,0x6B68,INVALC,0x4666,INVALC, + 0x6B6D,INVALC,INVALC,INVALC,0x6B62,INVALC,0x6B6C,0x6B6E, + INVALC,0x382C,0x6B6A,0x3956,INVALC,0x3C55,INVALC,INVALC, + 0x6B6F,0x4D58,INVALC,INVALC,INVALC,INVALC,0x6B72,INVALC, + 0x6B75,INVALC,INVALC,0x6B73,0x4935,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B70,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3660,INVALC,INVALC,INVALC,INVALC,0x6B74,INVALC, + INVALC,0x6B76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B7A,INVALC,INVALC,0x6B77,INVALC,0x6B79,0x6B78, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B7B,INVALC, + 0x3C31,INVALC,0x6B7D,0x6B7C,0x4968,INVALC,INVALC,0x6C21, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3759,INVALC, + INVALC,INVALC,INVALC,0x6B7E,0x6C22,INVALC,INVALC,0x6C23, + 0x3544,0x6641,0x3E79,INVALC,0x6C24,INVALC,INVALC,0x386E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C25,INVALC,INVALC, + 0x6C26,INVALC,INVALC,0x3B3E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A4E,INVALC,0x6C27,INVALC,0x6C28,INVALC, + 0x3D32,INVALC,0x6C29,0x6C2A,INVALC,INVALC,0x6C2B,INVALC, + INVALC,0x6C2C,0x6C2D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x432B, + INVALC,INVALC,0x6C2E,INVALC,INVALC,INVALC,INVALC,0x6C30, + INVALC,0x6C2F,INVALC,INVALC,INVALC,INVALC,0x4626,INVALC, + 0x6C31,INVALC,0x4B2D,INVALC,0x6C32,INVALC,0x6C33,INVALC, + 0x6C34,INVALC,INVALC,INVALC,INVALC,0x6C35,INVALC,INVALC, + INVALC,INVALC,0x465A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3E5D,0x6C36,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x396B,0x502E,0x6C37,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C38,0x493F,0x6C39,INVALC,0x6C41,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C3A,INVALC,INVALC,0x6C3C,INVALC,INVALC, + INVALC,0x6C3B,0x6C3D,INVALC,0x4B46,0x6C3E,0x6C3F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C40,INVALC,INVALC,INVALC, + 0x6C42,INVALC,INVALC,INVALC,INVALC,0x332D,0x4467,INVALC, + 0x4969,0x3A62,0x3957,INVALC,INVALC,INVALC,INVALC,0x494F, + 0x325F,0x484E,0x6C45,0x3453,0x4055,0x6C44,0x6C49,0x4379, + 0x4C63,INVALC,0x6C47,0x6C48,0x352E,INVALC,0x6C4A,0x4763, + 0x425F,INVALC,INVALC,0x4871,0x453D,0x6C46,INVALC,0x4B47, + 0x326C,0x6C4C,0x4F28,0x4442,0x4F45,INVALC,INVALC,0x3B71, + 0x6C4B,INVALC,0x4231,INVALC,INVALC,0x6C5C,0x4128,INVALC, + INVALC,0x4678,INVALC,0x4950,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C4F,0x3B3F,0x3B72,INVALC,0x3E5E,INVALC, + 0x4765,INVALC,0x382D,0x6C4E,0x6C4D,INVALC,0x496A,INVALC, + INVALC,INVALC,0x3C41,INVALC,INVALC,0x4552,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C51,0x6C52,0x3958,0x6C50,INVALC,INVALC, + /* Block 142, Array index 0x4A00 */ + INVALC,INVALC,INVALC,INVALC,0x6C53,0x6C54,INVALC,0x6C56, + 0x4223,INVALC,0x6C55,0x3466,INVALC,0x6C58,INVALC,0x6C57, + 0x6C59,INVALC,INVALC,0x6C5B,0x6C5D,INVALC,0x6C5E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4056,INVALC,0x3C4F,0x6C5F, + INVALC,INVALC,INVALC,0x3352,INVALC,0x6C60,INVALC,INVALC, + 0x4176,0x6C61,INVALC,0x6C62,0x496B,INVALC,INVALC,0x352F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C63,INVALC,INVALC,INVALC,0x4436,INVALC,INVALC, + INVALC,INVALC,0x315B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C64,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3C71,INVALC,INVALC,INVALC,INVALC, + 0x3F76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x422D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C67,INVALC,INVALC,INVALC,0x6C66,INVALC, + INVALC,INVALC,0x6C65,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C6D,0x6C6B,INVALC,INVALC,0x6C68, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C6A,INVALC, + INVALC,INVALC,0x6C69,0x6C6C,INVALC,0x3577,INVALC,0x6C70, + INVALC,0x4057,INVALC,0x6C71,INVALC,INVALC,INVALC,INVALC, + 0x3859,INVALC,0x6C6E,0x6C6F,INVALC,INVALC,INVALC,0x4F29, + INVALC,INVALC,INVALC,0x4437,INVALC,0x4129,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C72,INVALC,INVALC,0x6C75, + /* Block 143, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C73,0x6C74,0x4D59,INVALC,INVALC,INVALC,INVALC,0x4627, + 0x6C78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C76,0x6C77,0x6C79, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D29,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6C7C,INVALC,INVALC,INVALC,0x6C7D,0x6C7B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C7A,INVALC,0x447D,INVALC,INVALC,0x6D21, + 0x6D25,0x6D22,0x6C7E,INVALC,0x6D23,INVALC,INVALC,INVALC, + 0x6D24,INVALC,INVALC,INVALC,INVALC,0x6D2B,INVALC,INVALC, + INVALC,0x6D26,INVALC,INVALC,INVALC,INVALC,INVALC,0x4058, + 0x6D28,INVALC,INVALC,0x6D2A,0x6D27,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D2D,INVALC,0x3D33,INVALC,0x6D2C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6D2E,INVALC,INVALC,INVALC, + INVALC,0x6D2F,INVALC,INVALC,0x6D32,0x6D31,INVALC,0x6D30, + INVALC,INVALC,0x6D34,0x6D33,INVALC,0x4C76,INVALC,INVALC, + INVALC,0x6D36,INVALC,0x6D35,0x6D37,INVALC,INVALC,INVALC, + INVALC,0x6D38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D39,0x3F48,0x6D3B,INVALC,INVALC,0x366D, + 0x6D3C,0x6D3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D3F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6D40,0x6D3D,INVALC, + 0x6D41,INVALC,0x3C56,0x6D42,0x3530,0x3733,INVALC,INVALC, + INVALC,INVALC,0x382E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D43,INVALC,INVALC,INVALC,0x4670, + INVALC,INVALC,0x453E,0x6D44,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D47,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C34,INVALC,INVALC,0x6D46,0x6D45,0x375A,0x6D48,INVALC, + /* Block 144, Array index 0x4C00 */ + INVALC,INVALC,INVALC,0x3353,INVALC,0x6D4A,INVALC,INVALC, + INVALC,0x3A5C,0x6D49,INVALC,0x6D52,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D4C,0x6D4E,0x4A65,0x6D4B,INVALC,INVALC, + INVALC,0x6D4D,INVALC,0x6D51,0x6D4F,0x3531,INVALC,0x6D50, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D53,INVALC, + INVALC,0x475A,0x4E58,INVALC,INVALC,INVALC,INVALC,0x3D34, + INVALC,INVALC,INVALC,0x6D54,INVALC,INVALC,INVALC,INVALC, + 0x4D22,0x6D56,INVALC,0x6D55,INVALC,INVALC,0x6D59,0x4D41, + INVALC,INVALC,0x6D58,INVALC,0x336D,0x6D57,0x6D5C,INVALC, + INVALC,0x6D5B,INVALC,INVALC,0x6D5A,0x4532,0x6D5D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D5E, + INVALC,INVALC,INVALC,INVALC,0x6D5F,INVALC,INVALC,0x396C, + INVALC,0x3725,0x6D60,0x6D61,0x6D62,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F49,0x6D63,INVALC,0x3C2D,0x6D64, + INVALC,INVALC,INVALC,0x6D65,INVALC,INVALC,INVALC,0x5221, + 0x517E,INVALC,INVALC,INVALC,INVALC,0x6D66,0x6570,0x6D67, + 0x4324,0x3F2B,0x4740,INVALC,INVALC,INVALC,INVALC,0x6D68, + INVALC,INVALC,0x4A55,0x4454,0x397E,INVALC,INVALC,0x4329, + INVALC,INVALC,0x312A,INVALC,0x4B78,0x3F57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x375E,INVALC, + INVALC,0x3661,INVALC,INVALC,0x4A56,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D69,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D6B,INVALC,INVALC,0x6D6A,0x3260,INVALC, + INVALC,0x4676,0x6D6C,0x4777,INVALC,0x4533,INVALC,0x6D6D, + 0x3D52,INVALC,INVALC,INVALC,0x6D6F,INVALC,INVALC,0x4C42, + 0x6D7E,0x6D71,0x6D72,INVALC,INVALC,0x4449,INVALC,INVALC, + /* Block 145, Array index 0x4D00 */ + 0x4260,0x4177,INVALC,0x4628,INVALC,0x6D70,0x3555,INVALC, + INVALC,INVALC,INVALC,0x6D79,INVALC,0x6D76,0x6E25,0x4629, + 0x4360,0x6D73,INVALC,0x447E,0x4553,0x6D74,0x6D78,0x3F60, + INVALC,0x4767,0x444C,INVALC,INVALC,0x4042,0x6D77,0x422E, + 0x4224,0x6D75,0x3029,0x4F22,INVALC,INVALC,INVALC,0x6D7A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4261,INVALC, + INVALC,0x3D35,0x3F4A,INVALC,INVALC,0x6D7C,0x6D7B,INVALC, + 0x306F,0x6D7D,INVALC,INVALC,0x492F,INVALC,0x6E27,INVALC, + INVALC,0x465B,0x3F6B,INVALC,INVALC,0x4359,INVALC,0x3678, + INVALC,0x6E26,0x4D37,0x313F,INVALC,0x4A57,0x3261,0x6E21, + 0x6E22,0x6E23,0x6E24,0x463B,0x4323,0x3063,0x6E28,INVALC, + 0x6E29,0x7423,INVALC,INVALC,0x423D,INVALC,0x6E2A,INVALC, + 0x3173,0x414C,INVALC,0x382F,INVALC,0x4D5A,INVALC,INVALC, + 0x6E2B,0x452C,INVALC,INVALC,INVALC,0x4178,0x3C57,0x6E2C, + INVALC,INVALC,0x6E2F,INVALC,INVALC,0x3D65,0x6E2D,0x412B, + 0x412A,INVALC,0x3064,INVALC,0x4E4B,0x6E31,INVALC,0x4872, + 0x6E33,0x6E32,0x6E30,0x6364,0x3454,INVALC,INVALC,0x6D6E, + INVALC,0x6E35,0x6E34,INVALC,INVALC,INVALC,INVALC,0x6E36, + INVALC,0x4D38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4661,INVALC,INVALC,0x4B2E,INVALC, + 0x6E37,INVALC,0x3C59,INVALC,INVALC,INVALC,INVALC,0x6E38, + INVALC,0x6E39,INVALC,INVALC,INVALC,0x6E3A,INVALC,INVALC, + 0x4521,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x306A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3959,INVALC,INVALC,INVALC,0x4F3A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6E3E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3734,0x6E3B,INVALC,0x6E3C,INVALC,INVALC,INVALC, + 0x4974,INVALC,INVALC,INVALC,INVALC,0x3354,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D39,INVALC,0x363F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4554,INVALC,INVALC, + /* Block 146, Array index 0x4E00 */ + INVALC,INVALC,0x6E3F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E40,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4522,INVALC,INVALC, + 0x6E43,INVALC,0x6E42,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4653,0x6E44,0x3D36,0x3C60,0x475B,0x4371,INVALC, + INVALC,INVALC,0x3C72,INVALC,0x3F6C,INVALC,0x6E45,INVALC, + 0x6E46,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F5D,0x6E47,INVALC,0x6E48,INVALC,INVALC, + INVALC,0x6E49,0x4D6F,INVALC,0x3D37,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E4B,0x6E4A,INVALC,0x395A,INVALC,0x3973, + 0x3B40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E4E,INVALC,INVALC,INVALC,INVALC,0x3D66, + INVALC,0x6E4D,INVALC,0x6E4C,INVALC,0x4269,INVALC,INVALC, + 0x386F,INVALC,0x4043,INVALC,INVALC,INVALC,INVALC,0x4830, + INVALC,INVALC,INVALC,INVALC,0x3D39,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E4F,INVALC,0x3E5F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E52,0x6E50,INVALC,INVALC,INVALC,0x6E51, + INVALC,INVALC,INVALC,INVALC,0x6E54,0x6E53,INVALC,INVALC, + 0x3E7A,INVALC,0x6E55,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E56,0x6E57,INVALC,INVALC,INVALC,INVALC,0x4850,0x3A53, + 0x3C61,0x6E58,INVALC,0x6E59,0x4E24,0x3D45,0x4C6E,0x4E4C, + 0x6E5A,0x3662,INVALC,INVALC,INVALC,INVALC,0x6E5B,INVALC, + 0x4523,INVALC,INVALC,0x6E5E,0x3378,0x3F4B,INVALC,0x6E5C, + INVALC,0x6E5D,INVALC,0x4460,INVALC,INVALC,0x4B55,0x367C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6E60,0x6E61,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E5F,INVALC,INVALC,0x6E63, + /* Block 147, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x465F,0x3343,INVALC, + INVALC,0x6E67,INVALC,INVALC,0x6E64,0x6E66,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E62,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F4F,INVALC,INVALC,0x6E65,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E6B,INVALC,INVALC,0x385A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E6F, + INVALC,INVALC,INVALC,INVALC,0x4534,0x6E6A,INVALC,INVALC, + 0x6E6D,0x6E6B,INVALC,0x6E70,INVALC,INVALC,INVALC,INVALC, + 0x6E71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E69, + INVALC,INVALC,0x6E76,0x3174,INVALC,INVALC,0x6E68,INVALC, + INVALC,INVALC,0x482D,INVALC,0x6E6C,INVALC,0x3E60,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x395B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B48,INVALC, + 0x3664,INVALC,INVALC,0x3D46,INVALC,0x463C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x412D,INVALC,0x6E74,INVALC,0x6E6E,0x6E73,INVALC, + 0x4C43,INVALC,0x4438,0x6E75,0x6E72,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x412C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E79, + INVALC,0x6E78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E77, + INVALC,INVALC,0x4B2F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D7B,INVALC,INVALC,INVALC, + INVALC,0x6E7A,0x4A5F,INVALC,INVALC,0x3154,INVALC,INVALC, + INVALC,INVALC,0x4946,0x4372,INVALC,INVALC,INVALC,INVALC, + 0x3578,INVALC,0x6E7C,INVALC,0x395D,INVALC,INVALC,INVALC, + /* Block 148, Array index 0x5000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B2C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E7B, + 0x3F6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F6E,0x6F21,0x6F23,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E7B,INVALC,0x6F22,0x6F24,INVALC,INVALC,0x3653,INVALC, + 0x4945,INVALC,INVALC,0x3C62,0x4F23,INVALC,0x6E7E,0x3A78, + INVALC,INVALC,0x4F3F,INVALC,INVALC,0x6F26,INVALC,INVALC, + INVALC,INVALC,0x6F25,0x6F27,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E7D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4669,INVALC,0x4555,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4457,INVALC,0x6F2C,INVALC, + INVALC,INVALC,INVALC,0x4343,0x6F28,INVALC,INVALC,INVALC, + 0x6F29,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x372D,INVALC,0x6F2B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3830,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6F2A,INVALC,0x3E61,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3379,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6F30,INVALC,0x3A3F,0x4179, + INVALC,INVALC,0x444A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x333B, + INVALC,INVALC,INVALC,INVALC,0x6F2E,0x6F2F,0x4443,INVALC, + 0x6F2D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F37,INVALC,INVALC,INVALC,INVALC, + 0x6F3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F39,0x452D,INVALC,INVALC,INVALC,INVALC,0x6F32,0x6F33, + 0x6F36,INVALC,INVALC,INVALC,INVALC,0x6F38,INVALC,INVALC, + INVALC,0x3640,INVALC,INVALC,0x6F3B,0x6F35,INVALC,INVALC, + 0x6F34,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 149, Array index 0x5100 */ + INVALC,INVALC,INVALC,0x6F3F,INVALC,INVALC,INVALC,0x6F40, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F41,INVALC,INVALC,0x6F3E,0x6F3D,INVALC,INVALC,INVALC, + 0x3E62,0x462A,0x6F3C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F45,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F43,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F44,0x6F42,INVALC, + 0x4278,INVALC,0x6F46,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F47,INVALC,INVALC,0x6F49,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3455,0x6F48,0x4C7A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F54,0x6F4A,INVALC,INVALC,0x6F4D,INVALC, + 0x6F4B,INVALC,0x6F4C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F4E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F50,INVALC,INVALC,INVALC,INVALC,0x6F51,INVALC,0x6F52, + INVALC,INVALC,INVALC,INVALC,0x6F55,0x6F53,0x6F56,0x6F58, + INVALC,0x6F57,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x5200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4439, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C67,INVALC,0x6F59,0x412E,INVALC,INVALC,INVALC,0x6F5A, + INVALC,0x4A44,0x6F5B,0x332B,INVALC,INVALC,INVALC,0x313C, + INVALC,0x3457,INVALC,0x3456,0x6F5C,INVALC,0x6F5D,INVALC, + 0x6F5E,0x6F5F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F60,INVALC,0x3458,0x3355,0x395E,0x4836,INVALC,0x6F62, + 0x6F61,INVALC,INVALC,INVALC,INVALC,0x6F63,INVALC,INVALC, + INVALC,INVALC,0x315C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F66,INVALC,0x6F65,0x6F64,INVALC,0x6F67,INVALC, + INVALC,INVALC,INVALC,0x6F6A,INVALC,INVALC,INVALC,0x3047, + INVALC,INVALC,0x6F68,INVALC,0x6F6C,0x6F6B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6F6E,0x6F6D,0x6F6F,INVALC, + 0x462E,INVALC,INVALC,INVALC,0x6F70,INVALC,INVALC,INVALC, + INVALC,0x6F71,0x6F73,INVALC,INVALC,0x6F72,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x5300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x496C,INVALC,INVALC,INVALC, + INVALC,0x6F74,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F75,INVALC,0x3A65,INVALC,INVALC,INVALC,0x6F76,0x6F77, + INVALC,INVALC,0x4B49,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x414B,INVALC,INVALC,INVALC,0x3024, + 0x424B,INVALC,0x6F78,INVALC,0x496D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F7B,0x6F79,0x395F,INVALC,0x6F7A, + 0x3842,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A45,0x6F7D,0x7021,0x6F7E,0x7022, + INVALC,INVALC,0x3121,0x3F58,0x3D7C,0x3459,0x7023,INVALC, + INVALC,INVALC,0x4766,INVALC,0x7025,INVALC,INVALC,INVALC, + 0x3122,INVALC,0x7024,0x4444,INVALC,0x4E4D,0x462B,0x6F7C, + 0x4E26,INVALC,0x3831,INVALC,INVALC,0x4D5B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3679,0x4E34,INVALC, + 0x3728,INVALC,0x4262,0x6721,INVALC,0x7026,0x332C,0x3F6F, + INVALC,INVALC,INVALC,INVALC,0x3356,0x7028,INVALC,0x7029, + 0x7027,0x3764,INVALC,0x3A5D,0x3E63,INVALC,INVALC,INVALC, + 0x3123,INVALC,INVALC,0x4E59,INVALC,INVALC,INVALC,0x702B, + 0x6E2E,INVALC,0x702A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x702E,0x702C,0x702D,INVALC,0x702F,INVALC,0x7030,0x4E6C, + 0x7031,0x7032,INVALC,0x4049,0x483B,INVALC,INVALC,INVALC, + 0x3F7D,0x3467,INVALC,INVALC,0x4D3A,0x326D,0x3D38,0x385B, + INVALC,0x7035,INVALC,0x7034,0x3B73,0x7036,0x7033,INVALC, + INVALC,0x3B28,INVALC,INVALC,INVALC,0x703A,0x6A2D,INVALC, + INVALC,0x5256,INVALC,0x3F77,0x7038,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E25,0x4671,INVALC,INVALC,INVALC,INVALC, + 0x312B,INVALC,0x4063,0x3C36,INVALC,INVALC,INVALC,INVALC, + 0x4A37,INVALC,0x3140,INVALC,INVALC,INVALC,0x4E6D,0x4D6B, + INVALC,0x703B,INVALC,0x4545,INVALC,INVALC,INVALC,INVALC, + /* Block 152, Array index 0x5400 */ + 0x3C7B,INVALC,INVALC,INVALC,0x703C,INVALC,0x703D,0x3F4C, + 0x703E,INVALC,0x4E6E,INVALC,INVALC,0x7039,0x7040,0x7042, + INVALC,0x7041,INVALC,0x703F,INVALC,INVALC,0x7043,INVALC, + INVALC,0x7044,INVALC,INVALC,0x417A,INVALC,0x3262,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7045,INVALC,INVALC,0x4C38, + INVALC,INVALC,0x7046,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7047,INVALC,0x4F2A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B31,0x7048,INVALC,INVALC,INVALC,0x7049,0x704A,INVALC, + INVALC,INVALC,0x704E,INVALC,0x704B,INVALC,0x704C,INVALC, + 0x704D,0x704F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4044,INVALC,INVALC,INVALC,0x4C77,INVALC, + INVALC,0x4045,INVALC,INVALC,0x7050,INVALC,0x4873,INVALC, + 0x7051,0x7353,0x4C4C,INVALC,0x7052,INVALC,0x7053,INVALC, + 0x7054,0x3357,INVALC,0x7056,INVALC,0x3F59,INVALC,INVALC, + INVALC,0x7057,INVALC,INVALC,0x3724,INVALC,INVALC,INVALC, + INVALC,0x7058,0x705C,INVALC,0x705A,INVALC,INVALC,INVALC, + INVALC,0x705B,INVALC,INVALC,0x3373,0x7059,0x705D,INVALC, + INVALC,INVALC,INVALC,0x705E,INVALC,0x3048,INVALC,0x705F, + 0x7060,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E64,INVALC,INVALC,INVALC,0x7061,INVALC,INVALC,INVALC, + 0x3547,INVALC,INVALC,0x7064,INVALC,INVALC,0x7063,INVALC, + 0x7062,INVALC,INVALC,0x6B71,INVALC,0x4A5C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7065,0x7066,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7067,INVALC,INVALC,0x7068,INVALC, + 0x7069,INVALC,INVALC,0x706A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x345A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x706B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x706C,0x4723,INVALC, + INVALC,INVALC,0x706E,0x323B,INVALC,0x7071,0x7070,INVALC, + INVALC,INVALC,INVALC,0x3124,INVALC,INVALC,INVALC,0x3641, + /* Block 153, Array index 0x5500 */ + INVALC,0x4A47,0x443A,0x3A22,INVALC,0x3960,0x3D67,INVALC, + 0x3F5C,INVALC,INVALC,INVALC,0x7073,INVALC,INVALC,0x7072, + 0x4D42,0x3468,0x4852,0x465C,INVALC,INVALC,INVALC,0x3F7C, + 0x4E4E,INVALC,0x375B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7076,INVALC,INVALC,0x7075,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B4B,0x462C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3150,INVALC,INVALC,0x7077, + 0x7074,INVALC,INVALC,0x4951,0x4D6A,0x7078,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7079,INVALC, + INVALC,INVALC,INVALC,0x707B,0x426A,0x335B,0x335C,0x707A, + INVALC,INVALC,INVALC,INVALC,0x3469,0x3832,INVALC,INVALC, + 0x346A,INVALC,INVALC,0x453F,INVALC,INVALC,0x4E60,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x385C, + INVALC,INVALC,INVALC,0x707C,INVALC,INVALC,INVALC,0x707D, + 0x707E,0x7121,INVALC,0x7123,0x7122,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4977,INVALC,0x7124,INVALC,INVALC,INVALC,INVALC,0x7125, + INVALC,0x7126,INVALC,INVALC,INVALC,INVALC,0x7127,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7129,0x7128,INVALC,0x712A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4874,0x664C,INVALC,INVALC,0x3F29, + INVALC,INVALC,0x3532,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x712B,INVALC,0x712C,INVALC,0x522C,0x5D3B,0x4853, + INVALC,INVALC,0x307B,INVALC,0x303B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B74,0x4B30,0x3E7E,INVALC, + /* Block 154, Array index 0x5600 */ + INVALC,INVALC,INVALC,0x712D,INVALC,0x4C5F,INVALC,INVALC, + INVALC,0x712E,0x4D5C,INVALC,0x3142,INVALC,INVALC,INVALC, + 0x3B41,INVALC,0x712F,0x326E,0x7130,INVALC,INVALC,INVALC, + 0x7131,INVALC,INVALC,INVALC,INVALC,0x7133,0x7134,INVALC, + 0x7136,0x7132,INVALC,INVALC,0x7135,INVALC,INVALC,INVALC, + 0x345B,INVALC,INVALC,INVALC,0x7137,INVALC,0x7138,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7139,0x713A,INVALC, + INVALC,INVALC,0x713B,INVALC,INVALC,0x713D,INVALC,INVALC, + INVALC,0x713C,INVALC,0x713F,0x7142,INVALC,INVALC,INVALC, + 0x713E,0x7140,0x7141,INVALC,INVALC,0x7143,INVALC,0x3642, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C73,0x7144, + 0x7145,0x3961,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7146,INVALC,INVALC, + 0x333E,INVALC,INVALC,INVALC,0x474F,0x7147,0x7148,INVALC, + INVALC,INVALC,INVALC,0x435A,0x466B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7149,INVALC,INVALC,INVALC, + INVALC,0x477D,INVALC,INVALC,0x424C,0x3158,0x366E,INVALC, + 0x366F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4373,0x714E,0x3670,INVALC,INVALC,0x326F,INVALC,INVALC, + 0x714D,INVALC,INVALC,0x714B,INVALC,0x714C,INVALC,0x714A, + INVALC,INVALC,0x7158,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x714F,0x7150,INVALC, + INVALC,0x7151,0x7152,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7154,INVALC,INVALC,0x7153,INVALC,INVALC,INVALC,0x3D59, + /* Block 155, Array index 0x5700 */ + INVALC,0x7155,INVALC,INVALC,INVALC,0x7157,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3533,0x7156, + INVALC,INVALC,0x417B,0x3833,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7159,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x424D,INVALC,INVALC,0x715A,INVALC,INVALC,INVALC,INVALC, + 0x462D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x715B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7160,INVALC, + 0x715E,INVALC,0x715D,0x715F,INVALC,0x715C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7162,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7161,INVALC,0x7164, + INVALC,INVALC,0x3643,0x7163,INVALC,INVALC,INVALC,0x7165, + INVALC,INVALC,0x7166,INVALC,0x7168,0x7167,INVALC,INVALC, + INVALC,0x7169,0x716B,0x716A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x397C,INVALC,INVALC,INVALC,INVALC,0x716C,INVALC,INVALC, + 0x716D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x333C,INVALC,INVALC,INVALC,0x716E,INVALC,INVALC,INVALC, + 0x716F,INVALC,INVALC,INVALC,0x3F71,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7170, + INVALC,0x7171,INVALC,0x7172,0x7173,INVALC,INVALC,INVALC, + 0x3962,INVALC,INVALC,INVALC,INVALC,INVALC,0x7174,0x7175, + INVALC,INVALC,0x7176,0x7177,INVALC,INVALC,0x7178,INVALC, + INVALC,INVALC,0x4831,0x717A,INVALC,0x4926,0x717B,0x7179, + INVALC,0x717D,INVALC,INVALC,0x717C,INVALC,INVALC,0x717E, + INVALC,INVALC,INVALC,0x7221,INVALC,INVALC,INVALC,INVALC, + /* Block 156, Array index 0x5800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7222,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7223,INVALC,0x7224,INVALC,INVALC,INVALC,INVALC,0x7225, + INVALC,INVALC,0x7226,0x7227,INVALC,0x7228,INVALC,0x7229, + 0x722A,0x722B,0x722C,INVALC,INVALC,INVALC,0x722D,0x722E, + INVALC,0x5D35,0x722F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6478,0x3534,INVALC,INVALC,INVALC, + INVALC,0x3321,0x3A32,0x7231,0x7230,0x4C25,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7233,0x7234,0x7232, + INVALC,0x7235,INVALC,INVALC,0x4B62,INVALC,INVALC,INVALC, + 0x7236,INVALC,0x357B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F25, + INVALC,INVALC,INVALC,INVALC,0x7237,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7239,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x303E,INVALC, + INVALC,0x723A,0x4A2B,0x7238,INVALC,INVALC,0x723B,0x723C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x723D, + 0x723E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x723F,INVALC,0x4B6E,0x3B2D,INVALC,0x3A7A,0x412F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7240,INVALC,INVALC,INVALC, + INVALC,0x7243,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7241,INVALC,INVALC,INVALC,INVALC,INVALC,0x7244,INVALC, + INVALC,0x3871,0x7242,INVALC,INVALC,INVALC,INVALC,0x7245, + INVALC,0x7246,0x7247,INVALC,0x724B,INVALC,0x3B2A,INVALC, + INVALC,INVALC,INVALC,0x4264,INVALC,INVALC,INVALC,INVALC, + INVALC,0x724C,0x7249,0x7248,0x724A,INVALC,INVALC,INVALC, + 0x375F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7250,0x724F,0x724E,INVALC,INVALC,0x3033,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 157, Array index 0x5900 */ + INVALC,INVALC,INVALC,INVALC,0x725A,INVALC,0x7256,INVALC, + 0x7257,0x7253,0x7259,INVALC,0x7255,0x3362,INVALC,INVALC, + 0x4F4C,INVALC,0x7258,0x7254,0x7252,0x7251,INVALC,INVALC, + INVALC,INVALC,INVALC,0x725C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x725F,INVALC,INVALC,0x725E,0x725D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4949,0x725B,0x3073, + 0x7260,INVALC,0x7262,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x336F,0x724D,0x3137,INVALC,INVALC,0x7264,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7263,0x7261, + 0x432D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B70,INVALC,INVALC,INVALC,INVALC,0x4E5A, + INVALC,INVALC,0x7265,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7266,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7267, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7268,INVALC, + 0x7269,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x443B,INVALC,0x726A, + INVALC,0x4837,INVALC,0x726F,0x726B,INVALC,INVALC,INVALC, + 0x726C,INVALC,INVALC,0x4B31,0x4C44,INVALC,0x4650,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 158, Array index 0x5A00 */ + INVALC,INVALC,INVALC,0x7270,INVALC,INVALC,0x7271,0x463E, + 0x726E,0x726D,INVALC,INVALC,INVALC,INVALC,0x322A,INVALC, + INVALC,INVALC,0x7279,INVALC,INVALC,0x7278,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3175,INVALC,INVALC,INVALC,0x7276, + INVALC,INVALC,INVALC,0x7275,INVALC,INVALC,0x7273,INVALC, + 0x337B,INVALC,0x7272,0x3C32,0x3229,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3963,INVALC,INVALC,0x727C,0x727B, + INVALC,0x727A,INVALC,INVALC,0x7277,INVALC,0x727D,INVALC, + 0x727E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7325,0x7324,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7326,INVALC,INVALC,0x312D,0x7321,0x7322,INVALC, + 0x3974,0x4C39,INVALC,INVALC,0x7323,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B32,INVALC,INVALC,0x732B, + INVALC,INVALC,0x7327,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x732C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7329, + INVALC,0x7328,INVALC,INVALC,INVALC,INVALC,INVALC,0x375C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x732D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x732E,INVALC,INVALC,INVALC, + INVALC,0x732F,INVALC,0x732A,INVALC,INVALC,INVALC,0x7274, + INVALC,INVALC,0x7330,INVALC,0x4461,INVALC,INVALC,INVALC, + 0x7334,INVALC,0x7335,0x7333,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7332,0x7338,INVALC,0x7331,INVALC,0x7336,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7337, + INVALC,INVALC,INVALC,0x733A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7339,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x733C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x733D,INVALC,0x733E, + INVALC,INVALC,0x4F49,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x733B,0x426B,0x3A6D,INVALC,INVALC,0x733F,INVALC,INVALC, + /* Block 159, Array index 0x5B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7340,0x7341,INVALC,INVALC,0x7342,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7343,INVALC,INVALC, + 0x3834,0x7344,INVALC,INVALC,INVALC,0x7345,INVALC,0x3C2F, + INVALC,0x7346,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7347,INVALC,INVALC,0x7348,0x7349,INVALC,INVALC,INVALC, + INVALC,0x734C,0x734A,0x4F3C,INVALC,0x734B,INVALC,0x4E6F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x734D,INVALC,0x4E5B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x734E,0x477E,INVALC, + INVALC,0x734F,0x7351,INVALC,INVALC,0x7352,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7350,0x396D,0x4C4D,0x4B63,0x5677,INVALC,0x5D60,0x4B7B, + INVALC,INVALC,INVALC,INVALC,0x322B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7354,0x3550,0x7355,0x7356, + 0x7357,INVALC,0x3975,INVALC,0x7358,INVALC,INVALC,INVALC, + 0x6054,0x4C5B,INVALC,0x4263,0x7359,0x735B,0x735A,INVALC, + 0x735C,INVALC,INVALC,INVALC,INVALC,0x735D,INVALC,INVALC, + 0x735E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x735F, + INVALC,INVALC,INVALC,INVALC,0x7360,INVALC,0x7361,0x7362, + INVALC,0x7363,INVALC,0x7364,0x7365,0x7366,INVALC,INVALC, + /* Block 160, Array index 0x5C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7367, + 0x7368,INVALC,INVALC,INVALC,INVALC,INVALC,0x4524,INVALC, + INVALC,INVALC,INVALC,0x385D,INVALC,0x736A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x414D,0x736B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x736C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4921,INVALC,INVALC,0x736D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x736E,0x6337,INVALC,INVALC,0x6C5A,0x706D, + INVALC,INVALC,0x736F,INVALC,0x7370,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7372, + 0x7373,0x7374,0x4E70,0x7371,INVALC,INVALC,0x7375,0x7376, + INVALC,INVALC,0x7378,INVALC,0x7377,INVALC,INVALC,INVALC, + INVALC,INVALC,0x737A,INVALC,INVALC,INVALC,0x737B,0x7379, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E36,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x737C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x737D,0x6354,INVALC,INVALC, + 0x737E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 256, Array index 0x5D00 */ + INVALC,0x212A,INVALC,0x2174,0x2170,0x2173,0x2175,INVALC, + 0x214A,0x214B,0x2176,0x215C,0x2124,INVALC,0x2125,0x213F, + 0x2330,0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337, + 0x2338,0x2339,0x2127,0x2128,0x2163,0x2161,0x2164,0x2129, + 0x2177,0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347, + 0x2348,0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F, + 0x2350,0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357, + 0x2358,0x2359,0x235A,0x214E,INVALC,0x214F,0x2130,0x2132, + 0x212E,0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367, + 0x2368,0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F, + 0x2370,0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377, + 0x2378,0x2379,0x237A,0x2150,0x2143,0x2151,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2131,INVALC,0x216F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_JIS_X0208_1990 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> jis_x0208_1990 size-optimized table (25440 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_jis_x0208_1990[] = +{ + 0x01E9, /* Ranges number */ + 0x0E1F, /* Unranged codes number */ + 0x1572, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x0391, 0x03A9, 0x05BE, + /* Array index: 0x0006 */ 0x03B1, 0x03C9, 0x05D7, + /* Array index: 0x0009 */ 0x0410, 0x0451, 0x05F0, + /* Array index: 0x000C */ 0x2015, 0x2021, 0x0632, + /* Array index: 0x000F */ 0x2190, 0x2193, 0x063F, + /* Array index: 0x0012 */ 0x2227, 0x222C, 0x0643, + /* Array index: 0x0015 */ 0x2500, 0x2503, 0x0649, + /* Array index: 0x0018 */ 0x2517, 0x251D, 0x064D, + /* Array index: 0x001B */ 0x2523, 0x2525, 0x0654, + /* Array index: 0x001E */ 0x3000, 0x3015, 0x0657, + /* Array index: 0x0021 */ 0x3041, 0x3093, 0x066D, + /* Array index: 0x0024 */ 0x309B, 0x30F6, 0x06C0, + /* Array index: 0x0027 */ 0x30FB, 0x30FE, 0x071C, + /* Array index: 0x002A */ 0x4E07, 0x4E19, 0x0720, + /* Array index: 0x002D */ 0x4E38, 0x4E3C, 0x0733, + /* Array index: 0x0030 */ 0x4E4B, 0x4E4F, 0x0738, + /* Array index: 0x0033 */ 0x4E55, 0x4E5F, 0x073D, + /* Array index: 0x0036 */ 0x4E85, 0x4EB0, 0x0748, + /* Array index: 0x0039 */ 0x4EC0, 0x4ECF, 0x0774, + /* Array index: 0x003C */ 0x4ED4, 0x4EE5, 0x0784, + /* Array index: 0x003F */ 0x4F09, 0x4F11, 0x0796, + /* Array index: 0x0042 */ 0x4F4D, 0x4F5E, 0x079F, + /* Array index: 0x0045 */ 0x4FAB, 0x4FAF, 0x07B1, + /* Array index: 0x0048 */ 0x4FC2, 0x4FC4, 0x07B6, + /* Array index: 0x004B */ 0x4FD7, 0x4FE5, 0x07B9, + /* Array index: 0x004E */ 0x5021, 0x502D, 0x07C8, + /* Array index: 0x0051 */ 0x5047, 0x5049, 0x07D5, + /* Array index: 0x0054 */ 0x5072, 0x5078, 0x07D8, + /* Array index: 0x0057 */ 0x5098, 0x509A, 0x07DF, + /* Array index: 0x005A */ 0x50B2, 0x50B7, 0x07E2, + /* Array index: 0x005D */ 0x5100, 0x5104, 0x07E8, + /* Array index: 0x0060 */ 0x5112, 0x511A, 0x07ED, + /* Array index: 0x0063 */ 0x513A, 0x5154, 0x07F6, + /* Array index: 0x0066 */ 0x5168, 0x516E, 0x0811, + /* Array index: 0x0069 */ 0x5175, 0x5178, 0x0818, + /* Array index: 0x006C */ 0x5189, 0x5199, 0x081C, + /* Array index: 0x006F */ 0x51A2, 0x51B7, 0x082D, + /* Array index: 0x0072 */ 0x51C4, 0x51C6, 0x0843, + /* Array index: 0x0075 */ 0x51C9, 0x51CD, 0x0846, + /* Array index: 0x0078 */ 0x51DB, 0x51E1, 0x084B, + /* Array index: 0x007B */ 0x51E6, 0x51EA, 0x0852, + /* Array index: 0x007E */ 0x51F5, 0x520B, 0x0857, + /* Array index: 0x0081 */ 0x5236, 0x523B, 0x086E, + /* Array index: 0x0084 */ 0x524A, 0x524F, 0x0874, + /* Array index: 0x0087 */ 0x5263, 0x5265, 0x087A, + /* Array index: 0x008A */ 0x526F, 0x5275, 0x087D, + /* Array index: 0x008D */ 0x5287, 0x5289, 0x0884, + /* Array index: 0x0090 */ 0x52A9, 0x52AD, 0x0887, + /* Array index: 0x0093 */ 0x52D5, 0x52E7, 0x088C, + /* Array index: 0x0096 */ 0x52F8, 0x52FA, 0x089F, + /* Array index: 0x0099 */ 0x52FE, 0x5308, 0x08A2, + /* Array index: 0x009C */ 0x5315, 0x531A, 0x08AD, + /* Array index: 0x009F */ 0x5338, 0x534A, 0x08B3, + /* Array index: 0x00A2 */ 0x5351, 0x5360, 0x08C6, + /* Array index: 0x00A5 */ 0x536E, 0x5378, 0x08D6, + /* Array index: 0x00A8 */ 0x53A5, 0x53A9, 0x08E1, + /* Array index: 0x00AB */ 0x53C8, 0x53CE, 0x08E6, + /* Array index: 0x00AE */ 0x53DF, 0x53FA, 0x08ED, + /* Array index: 0x00B1 */ 0x5408, 0x5411, 0x0909, + /* Array index: 0x00B4 */ 0x5429, 0x542E, 0x0913, + /* Array index: 0x00B7 */ 0x5438, 0x5442, 0x0919, + /* Array index: 0x00BA */ 0x5446, 0x544A, 0x0924, + /* Array index: 0x00BD */ 0x5473, 0x547D, 0x0929, + /* Array index: 0x00C0 */ 0x548B, 0x5492, 0x0934, + /* Array index: 0x00C3 */ 0x54BC, 0x54C9, 0x093C, + /* Array index: 0x00C6 */ 0x54E5, 0x54E9, 0x094A, + /* Array index: 0x00C9 */ 0x5544, 0x5546, 0x094F, + /* Array index: 0x00CC */ 0x5587, 0x558B, 0x0952, + /* Array index: 0x00CF */ 0x5598, 0x559F, 0x0957, + /* Array index: 0x00D2 */ 0x55A7, 0x55B0, 0x095F, + /* Array index: 0x00D5 */ 0x5614, 0x5618, 0x0969, + /* Array index: 0x00D8 */ 0x5668, 0x566C, 0x096E, + /* Array index: 0x00DB */ 0x56C0, 0x56C3, 0x0973, + /* Array index: 0x00DE */ 0x56D7, 0x56DB, 0x0977, + /* Array index: 0x00E1 */ 0x5726, 0x5728, 0x097C, + /* Array index: 0x00E4 */ 0x574E, 0x5751, 0x097F, + /* Array index: 0x00E7 */ 0x57A0, 0x57A4, 0x0983, + /* Array index: 0x00EA */ 0x57D2, 0x57D6, 0x0988, + /* Array index: 0x00ED */ 0x582F, 0x5835, 0x098D, + /* Array index: 0x00F0 */ 0x5857, 0x585A, 0x0994, + /* Array index: 0x00F3 */ 0x58B8, 0x58BB, 0x0998, + /* Array index: 0x00F6 */ 0x58D5, 0x58D9, 0x099C, + /* Array index: 0x00F9 */ 0x58EB, 0x58F2, 0x09A1, + /* Array index: 0x00FC */ 0x58F7, 0x58FD, 0x09A9, + /* Array index: 0x00FF */ 0x5915, 0x591C, 0x09B0, + /* Array index: 0x0102 */ 0x5927, 0x5932, 0x09B8, + /* Array index: 0x0105 */ 0x5947, 0x5949, 0x09C4, + /* Array index: 0x0108 */ 0x594E, 0x595A, 0x09C7, + /* Array index: 0x010B */ 0x5965, 0x596E, 0x09D4, + /* Array index: 0x010E */ 0x5981, 0x5984, 0x09DE, + /* Array index: 0x0111 */ 0x59D0, 0x59D4, 0x09E2, + /* Array index: 0x0114 */ 0x5ABC, 0x5AC2, 0x09E7, + /* Array index: 0x0117 */ 0x5B54, 0x5B66, 0x09EE, + /* Array index: 0x011A */ 0x5B85, 0x5B8F, 0x0A01, + /* Array index: 0x011D */ 0x5B95, 0x5BA6, 0x0A0C, + /* Array index: 0x0120 */ 0x5BB3, 0x5BB9, 0x0A1E, + /* Array index: 0x0123 */ 0x5BC2, 0x5BC9, 0x0A25, + /* Array index: 0x0126 */ 0x5BD0, 0x5BD4, 0x0A2D, + /* Array index: 0x0129 */ 0x5BDB, 0x5BEB, 0x0A32, + /* Array index: 0x012C */ 0x5BFE, 0x5C13, 0x0A43, + /* Array index: 0x012F */ 0x5C38, 0x5C41, 0x0A59, + /* Array index: 0x0132 */ 0x5C4A, 0x5C55, 0x0A63, + /* Array index: 0x0135 */ 0x5CA8, 0x5CAC, 0x0A6F, + /* Array index: 0x0138 */ 0x5CB6, 0x5CBE, 0x0A74, + /* Array index: 0x013B */ 0x5CE8, 0x5CEA, 0x0A7D, + /* Array index: 0x013E */ 0x5D14, 0x5D1B, 0x0A80, + /* Array index: 0x0141 */ 0x5DE3, 0x5DE8, 0x0A88, + /* Array index: 0x0144 */ 0x5DF1, 0x5DF7, 0x0A8E, + /* Array index: 0x0147 */ 0x5E19, 0x5E1D, 0x0A95, + /* Array index: 0x014A */ 0x5E36, 0x5E38, 0x0A9A, + /* Array index: 0x014D */ 0x5E43, 0x5E47, 0x0A9D, + /* Array index: 0x0150 */ 0x5E5F, 0x5E64, 0x0AA2, + /* Array index: 0x0153 */ 0x5E72, 0x5E84, 0x0AA8, + /* Array index: 0x0156 */ 0x5E95, 0x5E97, 0x0ABB, + /* Array index: 0x0159 */ 0x5EB5, 0x5EB8, 0x0ABE, + /* Array index: 0x015C */ 0x5EC1, 0x5EC3, 0x0AC2, + /* Array index: 0x015F */ 0x5EC8, 0x5ECA, 0x0AC5, + /* Array index: 0x0162 */ 0x5EDD, 0x5EE3, 0x0AC8, + /* Array index: 0x0165 */ 0x5EF0, 0x5F04, 0x0ACF, + /* Array index: 0x0168 */ 0x5F09, 0x5F18, 0x0AE4, + /* Array index: 0x016B */ 0x5F25, 0x5F29, 0x0AF4, + /* Array index: 0x016E */ 0x5F69, 0x5F73, 0x0AF9, + /* Array index: 0x0171 */ 0x5F7F, 0x5F99, 0x0B04, + /* Array index: 0x0174 */ 0x5FA8, 0x5FAE, 0x0B1F, + /* Array index: 0x0177 */ 0x5FD6, 0x5FDD, 0x0B26, + /* Array index: 0x017A */ 0x600E, 0x6016, 0x0B2E, + /* Array index: 0x017D */ 0x6019, 0x602B, 0x0B37, + /* Array index: 0x0180 */ 0x6041, 0x6043, 0x0B4A, + /* Array index: 0x0183 */ 0x605F, 0x6070, 0x0B4D, + /* Array index: 0x0186 */ 0x6089, 0x608D, 0x0B5F, + /* Array index: 0x0189 */ 0x60A6, 0x60AA, 0x0B64, + /* Array index: 0x018C */ 0x60B2, 0x60B8, 0x0B69, + /* Array index: 0x018F */ 0x60C5, 0x60C7, 0x0B70, + /* Array index: 0x0192 */ 0x60DF, 0x60E3, 0x0B73, + /* Array index: 0x0195 */ 0x60F0, 0x60FB, 0x0B78, + /* Array index: 0x0198 */ 0x610D, 0x610F, 0x0B84, + /* Array index: 0x019B */ 0x613C, 0x613F, 0x0B87, + /* Array index: 0x019E */ 0x6147, 0x614E, 0x0B8B, + /* Array index: 0x01A1 */ 0x6158, 0x615A, 0x0B93, + /* Array index: 0x01A4 */ 0x616E, 0x6177, 0x0B96, + /* Array index: 0x01A7 */ 0x61C6, 0x61CD, 0x0BA0, + /* Array index: 0x01AA */ 0x61F4, 0x6200, 0x0BA8, + /* Array index: 0x01AD */ 0x6208, 0x6216, 0x0BB5, + /* Array index: 0x01B0 */ 0x621A, 0x6221, 0x0BC4, + /* Array index: 0x01B3 */ 0x622E, 0x6234, 0x0BCC, + /* Array index: 0x01B6 */ 0x623F, 0x6241, 0x0BD3, + /* Array index: 0x01B9 */ 0x6247, 0x624E, 0x0BD6, + /* Array index: 0x01BC */ 0x627C, 0x6284, 0x0BDE, + /* Array index: 0x01BF */ 0x6291, 0x629E, 0x0BE7, + /* Array index: 0x01C2 */ 0x62B9, 0x62BD, 0x0BF5, + /* Array index: 0x01C5 */ 0x62C5, 0x62E1, 0x0BFA, + /* Array index: 0x01C8 */ 0x62EC, 0x62F7, 0x0C17, + /* Array index: 0x01CB */ 0x62FE, 0x6302, 0x0C23, + /* Array index: 0x01CE */ 0x6307, 0x6309, 0x0C28, + /* Array index: 0x01D1 */ 0x633D, 0x633F, 0x0C2B, + /* Array index: 0x01D4 */ 0x634C, 0x6350, 0x0C2E, + /* Array index: 0x01D7 */ 0x6367, 0x636B, 0x0C33, + /* Array index: 0x01DA */ 0x639F, 0x63AC, 0x0C38, + /* Array index: 0x01DD */ 0x64E0, 0x64E7, 0x0C46, + /* Array index: 0x01E0 */ 0x652A, 0x652C, 0x0C4E, + /* Array index: 0x01E3 */ 0x6534, 0x653F, 0x0C51, + /* Array index: 0x01E6 */ 0x6555, 0x6559, 0x0C5D, + /* Array index: 0x01E9 */ 0x6574, 0x6578, 0x0C62, + /* Array index: 0x01EC */ 0x6587, 0x6589, 0x0C67, + /* Array index: 0x01EF */ 0x65AB, 0x65B0, 0x0C6A, + /* Array index: 0x01F2 */ 0x65C1, 0x65C6, 0x0C70, + /* Array index: 0x01F5 */ 0x65E0, 0x65ED, 0x0C76, + /* Array index: 0x01F8 */ 0x6634, 0x6636, 0x0C84, + /* Array index: 0x01FB */ 0x663F, 0x6644, 0x0C87, + /* Array index: 0x01FE */ 0x665D, 0x665F, 0x0C8D, + /* Array index: 0x0201 */ 0x6664, 0x6669, 0x0C90, + /* Array index: 0x0204 */ 0x666E, 0x6670, 0x0C96, + /* Array index: 0x0207 */ 0x6683, 0x6689, 0x0C99, + /* Array index: 0x020A */ 0x6696, 0x6698, 0x0CA0, + /* Array index: 0x020D */ 0x66D9, 0x66DD, 0x0CA3, + /* Array index: 0x0210 */ 0x66F0, 0x6700, 0x0CA8, + /* Array index: 0x0213 */ 0x6714, 0x6717, 0x0CB9, + /* Array index: 0x0216 */ 0x671B, 0x671F, 0x0CBD, + /* Array index: 0x0219 */ 0x6726, 0x672E, 0x0CC2, + /* Array index: 0x021C */ 0x6734, 0x673A, 0x0CCB, + /* Array index: 0x021F */ 0x674E, 0x6753, 0x0CD2, + /* Array index: 0x0222 */ 0x675C, 0x6765, 0x0CD8, + /* Array index: 0x0225 */ 0x676D, 0x6777, 0x0CE2, + /* Array index: 0x0228 */ 0x679C, 0x67A2, 0x0CED, + /* Array index: 0x022B */ 0x67B3, 0x67B9, 0x0CF4, + /* Array index: 0x022E */ 0x67CE, 0x67D4, 0x0CFB, + /* Array index: 0x0231 */ 0x67F1, 0x67F5, 0x0D02, + /* Array index: 0x0234 */ 0x67FE, 0x6804, 0x0D07, + /* Array index: 0x0237 */ 0x6829, 0x682B, 0x0D0E, + /* Array index: 0x023A */ 0x683C, 0x6843, 0x0D11, + /* Array index: 0x023D */ 0x684D, 0x6854, 0x0D19, + /* Array index: 0x0240 */ 0x68A6, 0x68A8, 0x0D21, + /* Array index: 0x0243 */ 0x68AD, 0x68BC, 0x0D24, + /* Array index: 0x0246 */ 0x68C9, 0x68CD, 0x0D34, + /* Array index: 0x0249 */ 0x68D4, 0x68DA, 0x0D39, + /* Array index: 0x024C */ 0x68DF, 0x68E3, 0x0D40, + /* Array index: 0x024F */ 0x690B, 0x690F, 0x0D45, + /* Array index: 0x0252 */ 0x6919, 0x691C, 0x0D4A, + /* Array index: 0x0255 */ 0x6921, 0x692A, 0x0D4E, + /* Array index: 0x0258 */ 0x6953, 0x6955, 0x0D58, + /* Array index: 0x025B */ 0x6959, 0x6962, 0x0D5B, + /* Array index: 0x025E */ 0x696A, 0x6982, 0x0D65, + /* Array index: 0x0261 */ 0x69CA, 0x69D0, 0x0D7E, + /* Array index: 0x0264 */ 0x6A0A, 0x6A0C, 0x0D85, + /* Array index: 0x0267 */ 0x6A12, 0x6A14, 0x0D88, + /* Array index: 0x026A */ 0x6A1E, 0x6A23, 0x0D8B, + /* Array index: 0x026D */ 0x6A29, 0x6A2B, 0x0D91, + /* Array index: 0x0270 */ 0x6A35, 0x6A3A, 0x0D94, + /* Array index: 0x0273 */ 0x6AC1, 0x6AC3, 0x0D9A, + /* Array index: 0x0276 */ 0x6B1D, 0x6B23, 0x0D9D, + /* Array index: 0x0279 */ 0x6B37, 0x6B3E, 0x0DA4, + /* Array index: 0x027C */ 0x6B5F, 0x6B6A, 0x0DAC, + /* Array index: 0x027F */ 0x6B89, 0x6B8D, 0x0DB8, + /* Array index: 0x0282 */ 0x6BAF, 0x6BC0, 0x0DBD, + /* Array index: 0x0285 */ 0x6BD2, 0x6BD4, 0x0DCF, + /* Array index: 0x0288 */ 0x6C3E, 0x6C42, 0x0DD2, + /* Array index: 0x028B */ 0x6C5D, 0x6C62, 0x0DD7, + /* Array index: 0x028E */ 0x6C7D, 0x6C83, 0x0DDD, + /* Array index: 0x0291 */ 0x6C99, 0x6C9B, 0x0DE4, + /* Array index: 0x0294 */ 0x6CB8, 0x6CC5, 0x0DE7, + /* Array index: 0x0297 */ 0x6CE1, 0x6CE5, 0x0DF5, + /* Array index: 0x029A */ 0x6CEF, 0x6CF3, 0x0DFA, + /* Array index: 0x029D */ 0x6D29, 0x6D2B, 0x0DFF, + /* Array index: 0x02A0 */ 0x6D32, 0x6D38, 0x0E02, + /* Array index: 0x02A3 */ 0x6D77, 0x6D79, 0x0E09, + /* Array index: 0x02A6 */ 0x6DC5, 0x6DC7, 0x0E0C, + /* Array index: 0x02A9 */ 0x6DE8, 0x6DEE, 0x0E0F, + /* Array index: 0x02AC */ 0x6DF7, 0x6DFB, 0x0E16, + /* Array index: 0x02AF */ 0x6E05, 0x6E0B, 0x0E1B, + /* Array index: 0x02B2 */ 0x6E19, 0x6E26, 0x0E22, + /* Array index: 0x02B5 */ 0x6E29, 0x6E2F, 0x0E30, + /* Array index: 0x02B8 */ 0x6E7E, 0x6E82, 0x0E37, + /* Array index: 0x02BB */ 0x6ED1, 0x6ED5, 0x0E3C, + /* Array index: 0x02BE */ 0x6EFE, 0x6F02, 0x0E41, + /* Array index: 0x02C1 */ 0x6F11, 0x6F15, 0x0E46, + /* Array index: 0x02C4 */ 0x6F6D, 0x6F70, 0x0E4B, + /* Array index: 0x02C7 */ 0x6F80, 0x6F86, 0x0E4F, + /* Array index: 0x02CA */ 0x6FC0, 0x6FC3, 0x0E56, + /* Array index: 0x02CD */ 0x6FDF, 0x6FE1, 0x0E5A, + /* Array index: 0x02D0 */ 0x6FEB, 0x6FF3, 0x0E5D, + /* Array index: 0x02D3 */ 0x701A, 0x701F, 0x0E66, + /* Array index: 0x02D6 */ 0x70AC, 0x70AF, 0x0E6C, + /* Array index: 0x02D9 */ 0x70B8, 0x70BA, 0x0E70, + /* Array index: 0x02DC */ 0x7162, 0x7169, 0x0E73, + /* Array index: 0x02DF */ 0x71E5, 0x71E7, 0x0E7B, + /* Array index: 0x02E2 */ 0x71EC, 0x71EE, 0x0E7E, + /* Array index: 0x02E5 */ 0x723A, 0x7240, 0x0E81, + /* Array index: 0x02E8 */ 0x7246, 0x724C, 0x0E88, + /* Array index: 0x02EB */ 0x727D, 0x7282, 0x0E8F, + /* Array index: 0x02EE */ 0x72C2, 0x72C6, 0x0E95, + /* Array index: 0x02F1 */ 0x72E0, 0x72E2, 0x0E9A, + /* Array index: 0x02F4 */ 0x72F7, 0x72FD, 0x0E9D, + /* Array index: 0x02F7 */ 0x731B, 0x731F, 0x0EA4, + /* Array index: 0x02FA */ 0x7329, 0x732F, 0x0EA9, + /* Array index: 0x02FD */ 0x7432, 0x7436, 0x0EB0, + /* Array index: 0x0300 */ 0x7459, 0x7464, 0x0EB5, + /* Array index: 0x0303 */ 0x74EE, 0x74F8, 0x0EC1, + /* Array index: 0x0306 */ 0x7503, 0x7505, 0x0ECC, + /* Array index: 0x0309 */ 0x750C, 0x750E, 0x0ECF, + /* Array index: 0x030C */ 0x7530, 0x7533, 0x0ED2, + /* Array index: 0x030F */ 0x7537, 0x753C, 0x0ED6, + /* Array index: 0x0312 */ 0x7549, 0x7551, 0x0EDC, + /* Array index: 0x0315 */ 0x7559, 0x755D, 0x0EE5, + /* Array index: 0x0318 */ 0x7562, 0x756D, 0x0EEA, + /* Array index: 0x031B */ 0x7573, 0x7578, 0x0EF6, + /* Array index: 0x031E */ 0x7586, 0x7591, 0x0EFC, + /* Array index: 0x0321 */ 0x75B1, 0x75BE, 0x0F08, + /* Array index: 0x0324 */ 0x75F0, 0x75F4, 0x0F16, + /* Array index: 0x0327 */ 0x761F, 0x7624, 0x0F1B, + /* Array index: 0x032A */ 0x7646, 0x7648, 0x0F21, + /* Array index: 0x032D */ 0x7667, 0x766C, 0x0F24, + /* Array index: 0x0330 */ 0x7678, 0x7688, 0x0F2A, + /* Array index: 0x0333 */ 0x76B7, 0x76BA, 0x0F3B, + /* Array index: 0x0336 */ 0x76DB, 0x76E7, 0x0F3F, + /* Array index: 0x0339 */ 0x7707, 0x770C, 0x0F4C, + /* Array index: 0x033C */ 0x771E, 0x7726, 0x0F52, + /* Array index: 0x033F */ 0x77B9, 0x77BF, 0x0F5B, + /* Array index: 0x0342 */ 0x77DA, 0x77DC, 0x0F62, + /* Array index: 0x0345 */ 0x77ED, 0x77EF, 0x0F65, + /* Array index: 0x0348 */ 0x7825, 0x7827, 0x0F68, + /* Array index: 0x034B */ 0x788C, 0x788E, 0x0F6B, + /* Array index: 0x034E */ 0x792A, 0x792C, 0x0F6E, + /* Array index: 0x0351 */ 0x7947, 0x7949, 0x0F71, + /* Array index: 0x0354 */ 0x7953, 0x7957, 0x0F74, + /* Array index: 0x0357 */ 0x795D, 0x7962, 0x0F79, + /* Array index: 0x035A */ 0x797F, 0x7985, 0x0F7F, + /* Array index: 0x035D */ 0x798D, 0x798F, 0x0F86, + /* Array index: 0x0360 */ 0x79B9, 0x79C1, 0x0F89, + /* Array index: 0x0363 */ 0x79E3, 0x79E9, 0x0F92, + /* Array index: 0x0366 */ 0x7A17, 0x7A20, 0x0F99, + /* Array index: 0x0369 */ 0x7A3B, 0x7A43, 0x0FA3, + /* Array index: 0x036C */ 0x7A4D, 0x7A50, 0x0FAC, + /* Array index: 0x036F */ 0x7A61, 0x7A63, 0x0FB0, + /* Array index: 0x0372 */ 0x7A92, 0x7A98, 0x0FB3, + /* Array index: 0x0375 */ 0x7AAE, 0x7AB0, 0x0FBA, + /* Array index: 0x0378 */ 0x7AC3, 0x7AD5, 0x0FBD, + /* Array index: 0x037B */ 0x7AD9, 0x7AE6, 0x0FD0, + /* Array index: 0x037E */ 0x7AF6, 0x7AFA, 0x0FDE, + /* Array index: 0x0381 */ 0x7B45, 0x7B56, 0x0FE3, + /* Array index: 0x0384 */ 0x7B94, 0x7BA1, 0x0FF5, + /* Array index: 0x0387 */ 0x7BE4, 0x7BE6, 0x1003, + /* Array index: 0x038A */ 0x7C11, 0x7C14, 0x1006, + /* Array index: 0x038D */ 0x7C3D, 0x7C40, 0x100A, + /* Array index: 0x0390 */ 0x7C4C, 0x7C50, 0x100E, + /* Array index: 0x0393 */ 0x7C81, 0x7C83, 0x1013, + /* Array index: 0x0396 */ 0x7CA1, 0x7CA8, 0x1016, + /* Array index: 0x0399 */ 0x7CAD, 0x7CB3, 0x101E, + /* Array index: 0x039C */ 0x7CDC, 0x7CE2, 0x1025, + /* Array index: 0x039F */ 0x7D02, 0x7D06, 0x102C, + /* Array index: 0x03A2 */ 0x7D14, 0x7D22, 0x1031, + /* Array index: 0x03A5 */ 0x7D2B, 0x7D35, 0x1040, + /* Array index: 0x03A8 */ 0x7D42, 0x7D46, 0x104B, + /* Array index: 0x03AB */ 0x7D4B, 0x7D50, 0x1050, + /* Array index: 0x03AE */ 0x7D61, 0x7D63, 0x1056, + /* Array index: 0x03B1 */ 0x7D71, 0x7D76, 0x1059, + /* Array index: 0x03B4 */ 0x7D99, 0x7D9C, 0x105F, + /* Array index: 0x03B7 */ 0x7DAB, 0x7DB5, 0x1063, + /* Array index: 0x03BA */ 0x7DBA, 0x7DBF, 0x106E, + /* Array index: 0x03BD */ 0x7DDA, 0x7DE1, 0x1074, + /* Array index: 0x03C0 */ 0x7E09, 0x7E0B, 0x107C, + /* Array index: 0x03C3 */ 0x7E1E, 0x7E23, 0x107F, + /* Array index: 0x03C6 */ 0x7E37, 0x7E3E, 0x1085, + /* Array index: 0x03C9 */ 0x7E54, 0x7E5E, 0x108D, + /* Array index: 0x03CC */ 0x7E66, 0x7E6A, 0x1098, + /* Array index: 0x03CF */ 0x7E79, 0x7E83, 0x109D, + /* Array index: 0x03D2 */ 0x7E8C, 0x7E96, 0x10A8, + /* Array index: 0x03D5 */ 0x7F4C, 0x7F55, 0x10B3, + /* Array index: 0x03D8 */ 0x7F67, 0x7F6B, 0x10BD, + /* Array index: 0x03DB */ 0x7F75, 0x7F79, 0x10C2, + /* Array index: 0x03DE */ 0x7F82, 0x7F8E, 0x10C7, + /* Array index: 0x03E1 */ 0x8000, 0x8006, 0x10D4, + /* Array index: 0x03E4 */ 0x8015, 0x8019, 0x10DB, + /* Array index: 0x03E7 */ 0x805E, 0x8062, 0x10E0, + /* Array index: 0x03EA */ 0x806F, 0x807F, 0x10E5, + /* Array index: 0x03ED */ 0x8084, 0x808C, 0x10F6, + /* Array index: 0x03F0 */ 0x80A9, 0x80B4, 0x10FF, + /* Array index: 0x03F3 */ 0x80D9, 0x80DE, 0x110B, + /* Array index: 0x03F6 */ 0x8105, 0x810A, 0x1111, + /* Array index: 0x03F9 */ 0x8150, 0x8155, 0x1117, + /* Array index: 0x03FC */ 0x8178, 0x817A, 0x111D, + /* Array index: 0x03FF */ 0x817F, 0x8183, 0x1120, + /* Array index: 0x0402 */ 0x81BD, 0x81C2, 0x1125, + /* Array index: 0x0405 */ 0x81D8, 0x81DA, 0x112B, + /* Array index: 0x0408 */ 0x81FA, 0x8202, 0x112E, + /* Array index: 0x040B */ 0x8205, 0x821F, 0x1137, + /* Array index: 0x040E */ 0x8229, 0x822E, 0x1152, + /* Array index: 0x0411 */ 0x8233, 0x8239, 0x1158, + /* Array index: 0x0414 */ 0x8258, 0x825A, 0x115F, + /* Array index: 0x0417 */ 0x826E, 0x8278, 0x1162, + /* Array index: 0x041A */ 0x82AB, 0x82B3, 0x116D, + /* Array index: 0x041D */ 0x82D1, 0x82D4, 0x1176, + /* Array index: 0x0420 */ 0x82DB, 0x82E7, 0x117A, + /* Array index: 0x0423 */ 0x82F9, 0x82FB, 0x1187, + /* Array index: 0x0426 */ 0x8302, 0x8306, 0x118A, + /* Array index: 0x0429 */ 0x8316, 0x8318, 0x118F, + /* Array index: 0x042C */ 0x8331, 0x8339, 0x1192, + /* Array index: 0x042F */ 0x839E, 0x83A2, 0x119B, + /* Array index: 0x0432 */ 0x83EF, 0x83F4, 0x11A0, + /* Array index: 0x0435 */ 0x840B, 0x840E, 0x11A6, + /* Array index: 0x0438 */ 0x8461, 0x8463, 0x11AA, + /* Array index: 0x043B */ 0x8469, 0x8471, 0x11AD, + /* Array index: 0x043E */ 0x84B8, 0x84BC, 0x11B6, + /* Array index: 0x0441 */ 0x84C9, 0x84D1, 0x11BB, + /* Array index: 0x0444 */ 0x8511, 0x851A, 0x11C4, + /* Array index: 0x0447 */ 0x8548, 0x854B, 0x11CE, + /* Array index: 0x044A */ 0x8568, 0x856A, 0x11D2, + /* Array index: 0x044D */ 0x85A6, 0x85AF, 0x11D5, + /* Array index: 0x0450 */ 0x85F7, 0x85FB, 0x11DF, + /* Array index: 0x0453 */ 0x868A, 0x868C, 0x11E4, + /* Array index: 0x0456 */ 0x86A9, 0x86AB, 0x11E7, + /* Array index: 0x0459 */ 0x86EC, 0x86EF, 0x11EA, + /* Array index: 0x045C */ 0x8706, 0x870A, 0x11EE, + /* Array index: 0x045F */ 0x880D, 0x8811, 0x11F3, + /* Array index: 0x0462 */ 0x8821, 0x8823, 0x11F8, + /* Array index: 0x0465 */ 0x885D, 0x8863, 0x11FB, + /* Array index: 0x0468 */ 0x887D, 0x8882, 0x1202, + /* Array index: 0x046B */ 0x88BF, 0x88C5, 0x1208, + /* Array index: 0x046E */ 0x88F2, 0x88F4, 0x120F, + /* Array index: 0x0471 */ 0x88F8, 0x88FE, 0x1212, + /* Array index: 0x0474 */ 0x895E, 0x8960, 0x1219, + /* Array index: 0x0477 */ 0x8986, 0x898B, 0x121C, + /* Array index: 0x047A */ 0x8996, 0x899A, 0x1222, + /* Array index: 0x047D */ 0x89A6, 0x89AC, 0x1227, + /* Array index: 0x0480 */ 0x8A16, 0x8A18, 0x122E, + /* Array index: 0x0483 */ 0x8A3A, 0x8A3C, 0x1231, + /* Array index: 0x0486 */ 0x8A50, 0x8A55, 0x1234, + /* Array index: 0x0489 */ 0x8A69, 0x8A73, 0x123A, + /* Array index: 0x048C */ 0x8AA0, 0x8AA8, 0x1245, + /* Array index: 0x048F */ 0x8ACB, 0x8ACF, 0x124E, + /* Array index: 0x0492 */ 0x8ADA, 0x8AE7, 0x1253, + /* Array index: 0x0495 */ 0x8AFE, 0x8B04, 0x1261, + /* Array index: 0x0498 */ 0x8B16, 0x8B21, 0x1268, + /* Array index: 0x049B */ 0x8B58, 0x8B5C, 0x1274, + /* Array index: 0x049E */ 0x8B6B, 0x8B74, 0x1279, + /* Array index: 0x04A1 */ 0x8C6A, 0x8C6C, 0x1283, + /* Array index: 0x04A4 */ 0x8C78, 0x8C7C, 0x1286, + /* Array index: 0x04A7 */ 0x8C89, 0x8C8E, 0x128B, + /* Array index: 0x04AA */ 0x8C9D, 0x8CA2, 0x1291, + /* Array index: 0x04AD */ 0x8CA7, 0x8CCE, 0x1297, + /* Array index: 0x04B0 */ 0x8CDA, 0x8CE6, 0x12BF, + /* Array index: 0x04B3 */ 0x8CFA, 0x8CFD, 0x12CC, + /* Array index: 0x04B6 */ 0x8D04, 0x8D16, 0x12D0, + /* Array index: 0x04B9 */ 0x8D70, 0x8D74, 0x12E3, + /* Array index: 0x04BC */ 0x8E08, 0x8E0A, 0x12E8, + /* Array index: 0x04BF */ 0x8E1D, 0x8E1F, 0x12EB, + /* Array index: 0x04C2 */ 0x8E47, 0x8E4C, 0x12EE, + /* Array index: 0x04C5 */ 0x8EAA, 0x8EB1, 0x12F4, + /* Array index: 0x04C8 */ 0x8EC8, 0x8ECD, 0x12FC, + /* Array index: 0x04CB */ 0x8EFB, 0x8EFE, 0x1302, + /* Array index: 0x04CE */ 0x8F12, 0x8F15, 0x1306, + /* Array index: 0x04D1 */ 0x8F19, 0x8F1F, 0x130A, + /* Array index: 0x04D4 */ 0x8F42, 0x8F46, 0x1311, + /* Array index: 0x04D7 */ 0x8F4C, 0x8F4E, 0x1316, + /* Array index: 0x04DA */ 0x8F5F, 0x8F64, 0x1319, + /* Array index: 0x04DD */ 0x8F9B, 0x8F9F, 0x131F, + /* Array index: 0x04E0 */ 0x8FAD, 0x8FB2, 0x1324, + /* Array index: 0x04E3 */ 0x8FBA, 0x8FBC, 0x132A, + /* Array index: 0x04E6 */ 0x8FE5, 0x8FF0, 0x132D, + /* Array index: 0x04E9 */ 0x8FF7, 0x8FFA, 0x1339, + /* Array index: 0x04EC */ 0x900B, 0x9023, 0x133D, + /* Array index: 0x04EF */ 0x9035, 0x9039, 0x1356, + /* Array index: 0x04F2 */ 0x9047, 0x9059, 0x135B, + /* Array index: 0x04F5 */ 0x906D, 0x906F, 0x136E, + /* Array index: 0x04F8 */ 0x9075, 0x9084, 0x1371, + /* Array index: 0x04FB */ 0x9149, 0x914E, 0x1381, + /* Array index: 0x04FE */ 0x91C6, 0x91D1, 0x1387, + /* Array index: 0x0501 */ 0x91DB, 0x91E7, 0x1393, + /* Array index: 0x0504 */ 0x9298, 0x929C, 0x13A0, + /* Array index: 0x0507 */ 0x9318, 0x931A, 0x13A5, + /* Array index: 0x050A */ 0x932B, 0x932F, 0x13A8, + /* Array index: 0x050D */ 0x93AC, 0x93B0, 0x13AD, + /* Array index: 0x0510 */ 0x93D6, 0x93D8, 0x13B2, + /* Array index: 0x0513 */ 0x9418, 0x941A, 0x13B5, + /* Array index: 0x0516 */ 0x9451, 0x9453, 0x13B8, + /* Array index: 0x0519 */ 0x947C, 0x9481, 0x13BB, + /* Array index: 0x051C */ 0x9587, 0x958B, 0x13C1, + /* Array index: 0x051F */ 0x95A0, 0x95A8, 0x13C6, + /* Array index: 0x0522 */ 0x95D4, 0x95D8, 0x13CF, + /* Array index: 0x0525 */ 0x964B, 0x9650, 0x13D4, + /* Array index: 0x0528 */ 0x965B, 0x9666, 0x13DA, + /* Array index: 0x052B */ 0x9672, 0x967A, 0x13E6, + /* Array index: 0x052E */ 0x968A, 0x968F, 0x13EF, + /* Array index: 0x0531 */ 0x9694, 0x969C, 0x13F5, + /* Array index: 0x0534 */ 0x96B0, 0x96BC, 0x13FE, + /* Array index: 0x0537 */ 0x96C0, 0x96CE, 0x140B, + /* Array index: 0x053A */ 0x9704, 0x9713, 0x141A, + /* Array index: 0x053D */ 0x975E, 0x976D, 0x142A, + /* Array index: 0x0540 */ 0x9784, 0x9786, 0x143A, + /* Array index: 0x0543 */ 0x97F2, 0x97F6, 0x143D, + /* Array index: 0x0546 */ 0x97FF, 0x9808, 0x1442, + /* Array index: 0x0549 */ 0x980F, 0x9813, 0x144C, + /* Array index: 0x054C */ 0x9837, 0x983D, 0x1451, + /* Array index: 0x054F */ 0x984B, 0x984F, 0x1458, + /* Array index: 0x0552 */ 0x986F, 0x9874, 0x145D, + /* Array index: 0x0555 */ 0x98EB, 0x98EF, 0x1463, + /* Array index: 0x0558 */ 0x98FC, 0x98FE, 0x1468, + /* Array index: 0x055B */ 0x9910, 0x9914, 0x146B, + /* Array index: 0x055E */ 0x991D, 0x9921, 0x1470, + /* Array index: 0x0561 */ 0x9950, 0x9952, 0x1475, + /* Array index: 0x0564 */ 0x9996, 0x9999, 0x1478, + /* Array index: 0x0567 */ 0x99AC, 0x99AE, 0x147C, + /* Array index: 0x056A */ 0x99C4, 0x99C8, 0x147F, + /* Array index: 0x056D */ 0x99D0, 0x99D2, 0x1484, + /* Array index: 0x0570 */ 0x9A69, 0x9A6B, 0x1487, + /* Array index: 0x0573 */ 0x9AEA, 0x9AF1, 0x148A, + /* Array index: 0x0576 */ 0x9B25, 0x9B2A, 0x1492, + /* Array index: 0x0579 */ 0x9B2E, 0x9B32, 0x1498, + /* Array index: 0x057C */ 0x9B41, 0x9B45, 0x149D, + /* Array index: 0x057F */ 0x9B4D, 0x9B51, 0x14A2, + /* Array index: 0x0582 */ 0x9B91, 0x9B97, 0x14A7, + /* Array index: 0x0585 */ 0x9BAA, 0x9BAE, 0x14AE, + /* Array index: 0x0588 */ 0x9BE1, 0x9BE4, 0x14B3, + /* Array index: 0x058B */ 0x9BF0, 0x9BF2, 0x14B7, + /* Array index: 0x058E */ 0x9C06, 0x9C0D, 0x14BA, + /* Array index: 0x0591 */ 0x9C10, 0x9C15, 0x14C2, + /* Array index: 0x0594 */ 0x9C2D, 0x9C32, 0x14C8, + /* Array index: 0x0597 */ 0x9C39, 0x9C3B, 0x14CE, + /* Array index: 0x059A */ 0x9C46, 0x9C48, 0x14D1, + /* Array index: 0x059D */ 0x9D06, 0x9D09, 0x14D4, + /* Array index: 0x05A0 */ 0x9D28, 0x9D2C, 0x14D8, + /* Array index: 0x05A3 */ 0x9D5C, 0x9D61, 0x14DD, + /* Array index: 0x05A6 */ 0x9DF8, 0x9DFA, 0x14E3, + /* Array index: 0x05A9 */ 0x9E91, 0x9E97, 0x14E6, + /* Array index: 0x05AC */ 0x9EB8, 0x9EBF, 0x14ED, + /* Array index: 0x05AF */ 0x9ECC, 0x9ED4, 0x14F5, + /* Array index: 0x05B2 */ 0x9ED8, 0x9EE0, 0x14FE, + /* Array index: 0x05B5 */ 0x9EF9, 0x9EFD, 0x1507, + /* Array index: 0x05B8 */ 0x9F5F, 0x9F67, 0x150C, + /* Array index: 0x05BB */ 0xFF01, 0xFF5D, 0x1515, + /* Ranges content */ + /* Range 0x0391 - 0x03A9, array index: 0x05BE */ + 0x2621,0x2622,0x2623,0x2624,0x2625,0x2626,0x2627,0x2628, + 0x2629,0x262A,0x262B,0x262C,0x262D,0x262E,0x262F,0x2630, + 0x2631,INVALC,0x2632,0x2633,0x2634,0x2635,0x2636,0x2637, + 0x2638, + /* Range 0x03B1 - 0x03C9, array index: 0x05D7 */ + 0x2641,0x2642,0x2643,0x2644,0x2645,0x2646,0x2647,0x2648, + 0x2649,0x264A,0x264B,0x264C,0x264D,0x264E,0x264F,0x2650, + 0x2651,INVALC,0x2652,0x2653,0x2654,0x2655,0x2656,0x2657, + 0x2658, + /* Range 0x0410 - 0x0451, array index: 0x05F0 */ + 0x2721,0x2722,0x2723,0x2724,0x2725,0x2726,0x2728,0x2729, + 0x272A,0x272B,0x272C,0x272D,0x272E,0x272F,0x2730,0x2731, + 0x2732,0x2733,0x2734,0x2735,0x2736,0x2737,0x2738,0x2739, + 0x273A,0x273B,0x273C,0x273D,0x273E,0x273F,0x2740,0x2741, + 0x2751,0x2752,0x2753,0x2754,0x2755,0x2756,0x2758,0x2759, + 0x275A,0x275B,0x275C,0x275D,0x275E,0x275F,0x2760,0x2761, + 0x2762,0x2763,0x2764,0x2765,0x2766,0x2767,0x2768,0x2769, + 0x276A,0x276B,0x276C,0x276D,0x276E,0x276F,0x2770,0x2771, + INVALC,0x2757, + /* Range 0x2015 - 0x2021, array index: 0x0632 */ + 0x213D,0x2142,INVALC,0x2146,0x2147,INVALC,INVALC,0x2148, + 0x2149,INVALC,INVALC,0x2277,0x2278, + /* Range 0x2190 - 0x2193, array index: 0x063F */ + 0x222B,0x222C,0x222A,0x222D, + /* Range 0x2227 - 0x222C, array index: 0x0643 */ + 0x224A,0x224B,0x2241,0x2240,0x2269,0x226A, + /* Range 0x2500 - 0x2503, array index: 0x0649 */ + 0x2821,0x282C,0x2822,0x282D, + /* Range 0x2517 - 0x251D, array index: 0x064D */ + 0x2831,0x2825,INVALC,INVALC,0x2830,0x2827,0x283C, + /* Range 0x2523 - 0x2525, array index: 0x0654 */ + 0x2832,0x2829,0x283E, + /* Range 0x3000 - 0x3015, array index: 0x0657 */ + 0x2121,0x2122,0x2123,0x2137,INVALC,0x2139,0x213A,0x213B, + 0x2152,0x2153,0x2154,0x2155,0x2156,0x2157,0x2158,0x2159, + 0x215A,0x215B,0x2229,0x222E,0x214C,0x214D, + /* Range 0x3041 - 0x3093, array index: 0x066D */ + 0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427,0x2428, + 0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F,0x2430, + 0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437,0x2438, + 0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F,0x2440, + 0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447,0x2448, + 0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F,0x2450, + 0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457,0x2458, + 0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468, + 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470, + 0x2471,0x2472,0x2473, + /* Range 0x309B - 0x30F6, array index: 0x06C0 */ + 0x212B,0x212C,0x2135,0x2136,INVALC,INVALC,0x2521,0x2522, + 0x2523,0x2524,0x2525,0x2526,0x2527,0x2528,0x2529,0x252A, + 0x252B,0x252C,0x252D,0x252E,0x252F,0x2530,0x2531,0x2532, + 0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539,0x253A, + 0x253B,0x253C,0x253D,0x253E,0x253F,0x2540,0x2541,0x2542, + 0x2543,0x2544,0x2545,0x2546,0x2547,0x2548,0x2549,0x254A, + 0x254B,0x254C,0x254D,0x254E,0x254F,0x2550,0x2551,0x2552, + 0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255A, + 0x255B,0x255C,0x255D,0x255E,0x255F,0x2560,0x2561,0x2562, + 0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256A, + 0x256B,0x256C,0x256D,0x256E,0x256F,0x2570,0x2571,0x2572, + 0x2573,0x2574,0x2575,0x2576, + /* Range 0x30FB - 0x30FE, array index: 0x071C */ + 0x2126,0x213C,0x2133,0x2134, + /* Range 0x4E07 - 0x4E19, array index: 0x0720 */ + 0x4B7C,0x3E66,0x3B30,0x3E65,0x323C,INVALC,0x4954,0x4D3F, + INVALC,0x5022,0x312F,INVALC,INVALC,0x336E,0x5023,0x4024, + 0x5242,0x3556,0x4A3A, + /* Range 0x4E38 - 0x4E3C, array index: 0x0733 */ + 0x345D,0x4330,INVALC,0x3C67,0x5027, + /* Range 0x4E4B - 0x4E4F, array index: 0x0738 */ + 0x4737,INVALC,0x4663,0x3843,0x4B33, + /* Range 0x4E55 - 0x4E5F, array index: 0x073D */ + 0x6949,0x502A,0x3E68,0x502B,0x3235,INVALC,INVALC,INVALC, + 0x3665,0x3870,0x4C69, + /* Range 0x4E85 - 0x4EB0, array index: 0x0748 */ + 0x502D,0x4E3B,INVALC,0x4D3D,0x4168,0x502F,0x3B76,0x4673, + INVALC,0x5032,INVALC,INVALC,0x313E,0x385F,INVALC,0x385E, + 0x3066,INVALC,INVALC,0x4F4B,0x4F4A,INVALC,0x3A33,0x3021, + INVALC,0x5033,0x5034,0x5035,0x4B34,0x5036,INVALC,0x3872, + 0x3067,0x4B72,INVALC,0x357C,INVALC,INVALC,0x357D,0x357E, + 0x4462,0x4E3C,INVALC,0x5037, + /* Range 0x4EC0 - 0x4ECF, array index: 0x0774 */ + 0x3D3A,0x3F4E,0x503E,INVALC,0x503C,INVALC,0x503D,0x3558, + INVALC,INVALC,0x3A23,0x3270,INVALC,0x503B,0x503A,0x4A29, + /* Range 0x4ED4 - 0x4EE5, array index: 0x0784 */ + 0x3B46,0x3B45,0x423E,0x503F,0x4955,0x4067,INVALC,INVALC, + INVALC,0x2138,0x5040,0x5042,INVALC,INVALC,INVALC,0x4265, + 0x4E61,0x304A, + /* Range 0x4F09 - 0x4F11, array index: 0x0796 */ + 0x5044,0x304B,INVALC,INVALC,0x3860,0x346C,0x497A,0x4832, + 0x3559, + /* Range 0x4F4D - 0x4F5E, array index: 0x079F */ + 0x304C,0x4463,0x3D3B,0x3A34,0x4D24,INVALC,0x424E,INVALC, + 0x323F,INVALC,0x5049,INVALC,0x4D3E,0x5045,0x5047,0x3A6E, + 0x5048,0x5524, + /* Range 0x4FAB - 0x4FAF, array index: 0x07B1 */ + 0x5525,INVALC,0x4B79,0x496E,0x3874, + /* Range 0x4FC2 - 0x4FC4, array index: 0x07B6 */ + 0x3738,0x4225,0x3264, + /* Range 0x4FD7 - 0x4FE5, array index: 0x07B9 */ + 0x422F,0x505A,INVALC,0x505D,0x505B,INVALC,0x4A5D,INVALC, + 0x5058,INVALC,0x3F2E,INVALC,0x4B73,0x505F,0x5060, + /* Range 0x5021 - 0x502D, array index: 0x07C8 */ + 0x5069,INVALC,0x4A6F,0x434D,0x5065,0x3771,INVALC,0x5062, + 0x506A,0x5064,0x4E51,0x506B,0x4F41, + /* Range 0x5047 - 0x5049, array index: 0x07D5 */ + 0x5071,0x5075,0x304E, + /* Range 0x5072 - 0x5078, array index: 0x07D8 */ + 0x3C45,INVALC,0x4226,0x4465,0x3676,INVALC,0x5079, + /* Range 0x5098 - 0x509A, array index: 0x07DF */ + 0x3B31,0x4877,0x507B, + /* Range 0x50B2 - 0x50B7, array index: 0x07E2 */ + 0x507E,0x5123,0x507D,0x3A44,INVALC,0x3D7D, + /* Range 0x5100 - 0x5104, array index: 0x07E8 */ + 0x3537,0x512E,0x512F,INVALC,0x322F, + /* Range 0x5112 - 0x511A, array index: 0x07ED */ + 0x3C74,INVALC,0x5132,0x5131,0x5130,INVALC,0x5056,INVALC, + 0x5133, + /* Range 0x513A - 0x5154, array index: 0x07F6 */ + 0x5135,0x5138,0x5137,INVALC,INVALC,0x5139,0x513A,0x3074, + INVALC,0x3835,0x373B,0x3D3C,0x437B,0x3624,0x4068,0x3877, + INVALC,0x396E,0x513C,0x4C48,0x4546,INVALC,0x3B79,INVALC, + 0x513B,INVALC,0x513D, + /* Range 0x5168 - 0x516E, array index: 0x0811 */ + 0x4134,0x5140,0x5141,0x482C,0x3878,0x4F3B,0x5142, + /* Range 0x5175 - 0x5178, array index: 0x0818 */ + 0x4A3C,0x4236,0x3671,0x4535, + /* Range 0x5189 - 0x5199, array index: 0x081C */ + 0x5147,0x3A7D,INVALC,0x5146,0x3A46,INVALC,0x5148,0x666E, + 0x5149,0x4B41,0x514A,INVALC,0x514B,0x514C,0x3E69,INVALC, + 0x3C4C, + /* Range 0x51A2 - 0x51B7, array index: 0x082D */ + 0x514F,INVALC,0x514D,0x4C3D,0x514E,INVALC,0x495A,0x5150, + 0x5151,0x5152,0x455F,INVALC,INVALC,INVALC,0x5156,0x5154, + 0x5155,0x5153,0x3A63,0x5157,0x4C6A,0x4E64, + /* Range 0x51C4 - 0x51C6, array index: 0x0843 */ + 0x4028,0x5159,0x3D5A, + /* Range 0x51C9 - 0x51CD, array index: 0x0846 */ + 0x515A,INVALC,0x437C,0x4E3F,0x4560, + /* Range 0x51DB - 0x51E1, array index: 0x084B */ + 0x515B,0x7425,0x3645,INVALC,INVALC,0x515C,0x4B5E, + /* Range 0x51E6 - 0x51EA, array index: 0x0852 */ + 0x3D68,0x427C,INVALC,0x515E,0x4664, + /* Range 0x51F5 - 0x520B, array index: 0x0857 */ + 0x5161,0x3627,INVALC,0x464C,0x317A,0x3D50,INVALC,INVALC, + 0x4821,0x5162,INVALC,0x4561,INVALC,INVALC,0x3F4F,0x5163, + INVALC,0x4A2C,0x405A,0x3422,INVALC,0x3429,0x5164, + /* Range 0x5236 - 0x523B, array index: 0x086E */ + 0x4029,0x3A7E,0x3774,0x516B,0x3B49,0x396F, + /* Range 0x524A - 0x524F, array index: 0x0874 */ + 0x3A6F,0x516E,0x516F,0x4130,INVALC,0x516C, + /* Range 0x5263 - 0x5265, array index: 0x087A */ + 0x3775,0x3A5E,0x476D, + /* Range 0x526F - 0x5275, array index: 0x087D */ + 0x497B,0x3E6A,0x517B,0x3364,0x5175,0x5173,0x414F, + /* Range 0x5287 - 0x5289, array index: 0x0884 */ + 0x3760,0x517C,0x4E2D, + /* Range 0x52A9 - 0x52AD, array index: 0x0887 */ + 0x3D75,0x4558,0x3965,0x5222,0x5223, + /* Range 0x52D5 - 0x52E7, array index: 0x088C */ + 0x4630,INVALC,0x5228,0x342A,0x4C33,INVALC,INVALC,INVALC, + 0x3E21,0x5229,0x4A67,0x522D,INVALC,0x402A,0x522A,0x3650, + INVALC,0x522B,0x342B, + /* Range 0x52F8 - 0x52FA, array index: 0x089F */ + 0x5230,0x5231,0x3C5B, + /* Range 0x52FE - 0x5308, array index: 0x08A2 */ + 0x387B,0x4C5E,INVALC,0x4C68,0x4677,INVALC,INVALC,0x4A71, + 0x5232,INVALC,0x5233, + /* Range 0x5315 - 0x531A, array index: 0x08AD */ + 0x5238,0x323D,0x4B4C,INVALC,0x3A7C,0x5239, + /* Range 0x5338 - 0x534A, array index: 0x08B3 */ + 0x523E,0x4924,0x3668,0x3065,INVALC,INVALC,INVALC,0x463F, + 0x523F,0x3D3D,INVALC,0x4069,INVALC,0x5241,0x5240,0x3E23, + 0x3861,0x5243,0x483E, + /* Range 0x5351 - 0x5360, array index: 0x08C6 */ + 0x485C,0x4234,0x426E,0x3628,INVALC,INVALC,0x466E,0x4331, + INVALC,0x476E,INVALC,0x4B4E,INVALC,0x5246,INVALC,0x406A, + /* Range 0x536E - 0x5378, array index: 0x08D6 */ + 0x5248,0x312C,0x3075,0x346D,INVALC,0x4228,0x3551,0x4D71, + INVALC,0x524B,0x3237, + /* Range 0x53A5 - 0x53A9, array index: 0x08E1 */ + 0x5250,0x524F,INVALC,0x3F5F,0x3139, + /* Range 0x53C8 - 0x53CE, array index: 0x08E6 */ + 0x4B74,0x3A35,0x355A,0x4D27,0x4150,0x483F,0x3C7D, + /* Range 0x53DF - 0x53FA, array index: 0x08ED */ + 0x5257,INVALC,0x3143,0x4151,0x387D,0x3845,0x3667,INVALC, + INVALC,0x525B,0x4321,0x427E,0x362B,0x3E24,0x525C,0x525A, + 0x3244,0x4266,0x3C38,0x3B4B,0x3126,INVALC,INVALC,0x3370, + 0x3966,0x3B4A,INVALC,0x525D, + /* Range 0x5408 - 0x5411, array index: 0x0909 */ + 0x3967,0x3548,0x445F,0x3125,0x4631,0x4C3E,0x3921,0x4D79, + 0x4547,0x387E, + /* Range 0x5429 - 0x542E, array index: 0x0913 */ + 0x5266,INVALC,0x345E,0x5261,0x5262,0x5264, + /* Range 0x5438 - 0x5442, array index: 0x0919 */ + 0x355B,0x3F61,INVALC,0x4A2D,0x5263,0x525F,0x3863,INVALC, + 0x5260,INVALC,0x4F24, + /* Range 0x5446 - 0x544A, array index: 0x0924 */ + 0x4A72,INVALC,0x4468,0x3862,0x3970, + /* Range 0x5473 - 0x547D, array index: 0x0929 */ + 0x4C23,INVALC,0x526A,0x5273,0x526E,INVALC,INVALC,INVALC, + 0x5271,0x3846,0x4C3F, + /* Range 0x548B - 0x5492, array index: 0x0934 */ + 0x3A70,0x4F42,INVALC,0x526B,0x5269,0x5275,INVALC,0x5270, + /* Range 0x54BC - 0x54C9, array index: 0x093C */ + 0x5325,0x3076,0x5324,INVALC,0x3025,0x494A,0x5322,INVALC, + 0x527C,INVALC,INVALC,0x5277,0x527D,0x3A48, + /* Range 0x54E5 - 0x54E9, array index: 0x094A */ + 0x5327,0x5328,INVALC,0x3E25,0x4B69, + /* Range 0x5544 - 0x5546, array index: 0x094F */ + 0x426F,0x5336,0x3E26, + /* Range 0x5587 - 0x558B, array index: 0x0952 */ + 0x5349,INVALC,0x3922,0x533F,0x437D, + /* Range 0x5598 - 0x559F, array index: 0x0957 */ + 0x5343,0x533C,0x342D,INVALC,0x346E,0x3365,0x5344,0x5340, + /* Range 0x55A7 - 0x55B0, array index: 0x095F */ + 0x3776,0x534A,0x5348,0x4153,0x354A,0x362C,INVALC,0x5345, + INVALC,0x3674, + /* Range 0x5614 - 0x5618, array index: 0x0969 */ + 0x5352,INVALC,0x5354,0x3E28,0x3133, + /* Range 0x5668 - 0x566C, array index: 0x096E */ + 0x346F,INVALC,0x5364,0x5360,0x5363, + /* Range 0x56C0 - 0x56C3, array index: 0x0973 */ + 0x5373,0x5371,0x536F,0x5372, + /* Range 0x56D7 - 0x56DB, array index: 0x0977 */ + 0x5378,0x5145,INVALC,0x3C7C,0x3B4D, + /* Range 0x5726 - 0x5728, array index: 0x097C */ + 0x5429,0x3035,0x3A5F, + /* Range 0x574E - 0x5751, array index: 0x097F */ + 0x542C,0x542F,0x3A41,0x3923, + /* Range 0x57A0 - 0x57A4, array index: 0x0983 */ + 0x5437,INVALC,0x3924,0x3340,0x5439, + /* Range 0x57D2 - 0x57D6, array index: 0x0988 */ + 0x543F,0x5440,0x543E,INVALC,0x5442, + /* Range 0x582F - 0x5835, array index: 0x098D */ + 0x7421,0x3161,0x4A73,INVALC,INVALC,0x3E6C,0x4548, + /* Range 0x5857 - 0x585A, array index: 0x0994 */ + 0x4549,0x4564,0x4839,0x444D, + /* Range 0x58B8 - 0x58BB, array index: 0x0998 */ + 0x5457,0x5451,0x5454,0x5456, + /* Range 0x58D5 - 0x58D9, array index: 0x099C */ + 0x3968,INVALC,0x545C,0x545E,0x545D, + /* Range 0x58EB - 0x58F2, array index: 0x09A1 */ + 0x3B4E,0x3F51,INVALC,0x4154,0x5463,0x403C,0x306D,0x4764, + /* Range 0x58F7 - 0x58FD, array index: 0x09A9 */ + 0x445B,INVALC,0x5465,0x5464,0x5466,0x5467,0x5468, + /* Range 0x5915 - 0x591C, array index: 0x09B0 */ + 0x4D3C,0x3330,INVALC,0x5249,0x3D48,0x423F,0x546C,0x4C6B, + /* Range 0x5927 - 0x5932, array index: 0x09B8 */ + 0x4267,INVALC,0x4537,0x4240,0x4957,0x546F,0x5470,0x317B, + INVALC,INVALC,0x3C3A,0x5471, + /* Range 0x5947 - 0x5949, array index: 0x09C4 */ + 0x3471,0x4660,0x4A74, + /* Range 0x594E - 0x595A, array index: 0x09C7 */ + 0x5477,0x4155,0x5476,0x3740,INVALC,INVALC,0x4B5B,0x5475, + INVALC,0x4565,0x5479,INVALC,0x5478, + /* Range 0x5965 - 0x596E, array index: 0x09D4 */ + 0x317C,INVALC,0x547C,0x3E29,0x547E,0x4325,INVALC,0x547D, + INVALC,0x4A33, + /* Range 0x5981 - 0x5984, array index: 0x09DE */ + 0x5522,0x4721,0x485E,0x4C51, + /* Range 0x59D0 - 0x59D4, array index: 0x09E2 */ + 0x3039,0x3848,INVALC,0x402B,0x3051, + /* Range 0x5ABC - 0x5AC2, array index: 0x09E7 */ + 0x553C,0x5540,0x553D,INVALC,INVALC,0x3247,0x553F, + /* Range 0x5B54 - 0x5B66, array index: 0x09EE */ + 0x3926,0x5554,INVALC,0x3B7A,0x4238,INVALC,0x5555,0x5556, + 0x3B5A,0x3927,INVALC,0x4C52,INVALC,INVALC,INVALC,0x3528, + 0x3849,0x5557,0x3358, + /* Range 0x5B85 - 0x5B8F, array index: 0x0A01 */ + 0x4270,INVALC,0x3127,0x3C69,0x3042,INVALC,0x4157,0x3430, + 0x3C35,INVALC,0x3928, + /* Range 0x5B95 - 0x5BA6, array index: 0x0A0C */ + 0x4566,INVALC,0x3D21,0x3431,0x4368,0x446A,0x3038,0x3539, + 0x4A75,INVALC,0x3C42,INVALC,INVALC,0x3552,0x406B,0x3C3C, + 0x4D28,0x5561, + /* Range 0x5BB3 - 0x5BB9, array index: 0x0A1E */ + 0x3332,0x3163,0x3E2C,0x3248,INVALC,0x5562,0x4D46, + /* Range 0x5BC2 - 0x5BC9, array index: 0x0A25 */ + 0x3C64,0x5563,0x3473,0x4652,0x4C29,0x5564,INVALC,0x5565, + /* Range 0x5BD0 - 0x5BD4, array index: 0x0A2D */ + 0x5567,INVALC,0x3428,0x3677,0x5566, + /* Range 0x5BDB - 0x5BEB, array index: 0x0A32 */ + 0x3432,INVALC,0x3F32,0x556B,0x3B21,INVALC,0x3249,0x556A, + INVALC,0x5568,0x556C,0x5569,0x472B,0x5C4D,0x3F33,INVALC, + 0x556D, + /* Range 0x5BFE - 0x5C13, array index: 0x0A43 */ + 0x4250,0x3C77,INVALC,0x4975,0x406C,INVALC,0x3C4D,0x5571, + 0x3E2D,0x5572,0x5573,0x3053,0x423A,0x3F52,INVALC,0x5574, + 0x4633,0x3E2E,INVALC,0x3E2F,INVALC,0x5575, + /* Range 0x5C38 - 0x5C41, array index: 0x0A59 */ + 0x5579,0x557A,0x3C5C,0x3F2C,0x4674,0x3F54,0x4878,0x4722, + 0x3649,0x557B, + /* Range 0x5C4A - 0x5C55, array index: 0x0A63 */ + 0x464F,0x3230,INVALC,0x3B53,0x557D,0x5622,0x5621,0x367D, + INVALC,0x557E,INVALC,0x4538, + /* Range 0x5CA8 - 0x5CAC, array index: 0x0A6F */ + 0x413B,0x3464,INVALC,0x562D,0x4C28, + /* Range 0x5CB6 - 0x5CBE, array index: 0x0A74 */ + 0x562F,0x5631,0x345F,INVALC,INVALC,0x562E,0x5630,INVALC, + 0x5633, + /* Range 0x5CE8 - 0x5CEA, array index: 0x0A7D */ + 0x3265,0x5636,0x563B, + /* Range 0x5D14 - 0x5D1B, array index: 0x0A80 */ + 0x5643,0x563D,0x3333,0x563E,0x5647,0x5646,0x5645,0x5641, + /* Range 0x5DE3 - 0x5DE8, array index: 0x0A88 */ + 0x4163,INVALC,0x3929,0x3A38,0x392A,0x3570, + /* Range 0x5DF1 - 0x5DF7, array index: 0x0A8E */ + 0x384A,0x5661,0x4C26,0x4743,0x5662,INVALC,0x392B, + /* Range 0x5E19 - 0x5E1D, array index: 0x0A95 */ + 0x5665,0x5664,0x5667,INVALC,0x446B, + /* Range 0x5E36 - 0x5E38, array index: 0x0A9A */ + 0x5668,0x5669,0x3E6F, + /* Range 0x5E43 - 0x5E47, array index: 0x0A9D */ + 0x566B,0x566A,0x497D,INVALC,0x5673, + /* Range 0x5E5F - 0x5E64, array index: 0x0AA2 */ + 0x5670,INVALC,0x4828,0x5671,0x4A3E,0x5672, + /* Range 0x5E72 - 0x5E84, array index: 0x0AA8 */ + 0x3433,0x4A3F,0x472F,0x5674,0x5675,INVALC,0x392C,0x3434, + 0x5676,0x3838,0x4D44,0x4D29,0x3476,0x5678,INVALC,0x4423, + INVALC,0x392D,0x3E31, + /* Range 0x5E95 - 0x5E97, array index: 0x0ABB */ + 0x446C,0x4A79,0x4539, + /* Range 0x5EB5 - 0x5EB8, array index: 0x0ABE */ + 0x3043,0x3D6E,0x392F,0x4D47, + /* Range 0x5EC1 - 0x5EC3, array index: 0x0AC2 */ + 0x567A,0x567B,0x4751, + /* Range 0x5EC8 - 0x5ECA, array index: 0x0AC5 */ + 0x567C,0x4E77,0x4F2D, + /* Range 0x5EDD - 0x5EE3, array index: 0x0AC8 */ + 0x5723,INVALC,0x4940,0x3E33,0x5727,0x5726,0x5722, + /* Range 0x5EF0 - 0x5F04, array index: 0x0ACF */ + 0x572D,0x572B,INVALC,0x572C,0x572E,INVALC,0x3164,0x446E, + 0x572F,INVALC,0x377A,0x3276,0x4736,INVALC,0x5730,0x467B, + INVALC,0x4A5B,INVALC,0x5731,0x4F2E, + /* Range 0x5F09 - 0x5F18, array index: 0x0AE4 */ + 0x5732,0x4A40,0x5735,0x5021,0x5031,INVALC,0x3C30,0x4675, + 0x5736,INVALC,0x355D,0x4424,0x307A,0x5737,0x4A26,0x3930, + /* Range 0x5F25 - 0x5F29, array index: 0x0AF4 */ + 0x4C6F,0x3839,0x384C,INVALC,0x5738, + /* Range 0x5F69 - 0x5F73, array index: 0x0AF9 */ + 0x3A4C,0x4937,0x4426,0x494B,0x5745,INVALC,INVALC,0x3E34, + 0x3146,INVALC,0x5746, + /* Range 0x5F7F - 0x5F99, array index: 0x0B04 */ + 0x574A,0x317D,0x402C,0x5749,0x5748,0x3742,0x4254,INVALC, + 0x574E,0x574C,INVALC,0x574B,0x4E27,0x3865,INVALC,INVALC, + INVALC,0x3D79,0x574D,0x454C,0x3D3E,INVALC,INVALC,INVALC, + 0x4640,0x5751,0x5750, + /* Range 0x5FA8 - 0x5FAE, array index: 0x0B1F */ + 0x5753,0x497C,0x3D5B,INVALC,INVALC,0x5754,0x4879, + /* Range 0x5FD6 - 0x5FDD, array index: 0x0B26 */ + 0x5756,0x3B56,0x4B3A,0x4B3B,INVALC,INVALC,0x317E,0x575B, + /* Range 0x600E - 0x6016, array index: 0x0B2E */ + 0x5763,0x5769,0x5761,INVALC,0x455C,INVALC,INVALC,0x5766, + 0x495D, + /* Range 0x6019 - 0x602B, array index: 0x0B37 */ + 0x5760,INVALC,0x5765,0x4E67,0x3B57,INVALC,INVALC,0x4255, + 0x575E,INVALC,INVALC,INVALC,0x355E,0x5768,0x402D,0x3165, + 0x5762,0x3278,0x5767, + /* Range 0x6041 - 0x6043, array index: 0x0B4A */ + 0x576C,0x5776,0x5774, + /* Range 0x605F - 0x6070, array index: 0x0B4D */ + 0x576F,0x575F,INVALC,0x327A,0x5773,0x5775,0x4351,INVALC, + INVALC,0x3A28,0x3238,0x576D,0x5778,0x5777,0x3633,INVALC, + 0x4229,0x3366, + /* Range 0x6089 - 0x608D, array index: 0x0B5F */ + 0x3C3D,INVALC,0x5827,0x4470,0x577B, + /* Range 0x60A6 - 0x60AA, array index: 0x0B64 */ + 0x3159,0x5826,INVALC,0x473A,0x302D, + /* Range 0x60B2 - 0x60B8, array index: 0x0B69 */ + 0x4861,0x575C,0x582C,0x5830,0x4C65,INVALC,0x5829, + /* Range 0x60C5 - 0x60C7, array index: 0x0B70 */ + 0x3E70,0x582F,0x4657, + /* Range 0x60DF - 0x60E3, array index: 0x0B73 */ + 0x3054,0x582A,0x5828,INVALC,0x415A, + /* Range 0x60F0 - 0x60FB, array index: 0x0B78 */ + 0x4246,0x583D,INVALC,0x415B,0x5838,INVALC,0x5835,0x5836, + INVALC,0x3C66,0x5839,0x583C, + /* Range 0x610D - 0x610F, array index: 0x0B84 */ + 0x583E,0x583F,0x3055, + /* Range 0x613C - 0x613F, array index: 0x0B87 */ + 0x5846,0x5849,0x5841,0x5845, + /* Range 0x6147 - 0x614E, array index: 0x0B8B */ + 0x5840,0x3B7C,INVALC,0x5844,0x4256,0x3932,0x5832,0x3F35, + /* Range 0x6158 - 0x615A, array index: 0x0B93 */ + 0x584E,0x584F,0x5850, + /* Range 0x616E - 0x6177, array index: 0x0B96 */ + 0x4E38,0x5853,0x3056,0x5855,INVALC,0x584C,0x5852,0x5859, + 0x3744,0x584D, + /* Range 0x61C6 - 0x61CD, array index: 0x0BA0 */ + 0x586A,0x3A29,0x5868,0x5866,0x5865,0x586C,0x5864,0x586E, + /* Range 0x61F4 - 0x6200, array index: 0x0BA8 */ + 0x5873,INVALC,0x5871,0x5867,0x377C,INVALC,0x5872,INVALC, + 0x5876,0x5875,0x5877,0x5874,0x5878, + /* Range 0x6208 - 0x6216, array index: 0x0BB5 */ + 0x5879,0x587A,0x4A6A,INVALC,0x587C,0x587B,0x3D3F,INVALC, + 0x402E,0x3266,0x327C,INVALC,0x587D,INVALC,0x303F, + /* Range 0x621A - 0x6221, array index: 0x0BC4 */ + 0x404C,0x587E,INVALC,0x6C43,0x5921,0x3761,INVALC,0x5922, + /* Range 0x622E - 0x6234, array index: 0x0BCC */ + 0x5924,0x353A,0x5925,INVALC,0x5926,0x5927,0x4257, + /* Range 0x623F - 0x6241, array index: 0x0BD3 */ + 0x4B3C,0x3D6A,0x5928, + /* Range 0x6247 - 0x624E, array index: 0x0BD6 */ + 0x4070,0x6E3D,0x4862,INVALC,0x3C6A,INVALC,0x3A4D,0x5929, + /* Range 0x627C - 0x6284, array index: 0x0BDE */ + 0x592F,INVALC,0x5932,0x3E35,0x353B,INVALC,0x5930,0x5937, + 0x3E36, + /* Range 0x6291 - 0x629E, array index: 0x0BE7 */ + 0x4D5E,0x5933,0x5934,0x5938,0x456A,0x5935,0x3933,0x405E, + INVALC,INVALC,0x5946,0x4834,INVALC,0x4272, + /* Range 0x62B9 - 0x62BD, array index: 0x0BF5 */ + 0x4B75,INVALC,0x593B,0x3221,0x436A, + /* Range 0x62C5 - 0x62E1, array index: 0x0BFA */ + 0x4334,0x593E,0x5945,0x5940,0x5947,0x5943,INVALC,0x5942, + 0x476F,INVALC,0x593C,0x327D,0x593A,0x3571,0x4273,0x5936, + INVALC,INVALC,0x5939,0x3934,0x405B,INVALC,0x3E37,0x5941, + 0x4752,INVALC,INVALC,0x3572,0x3348, + /* Range 0x62EC - 0x62F7, array index: 0x0C17 */ + 0x3367,0x3F21,0x5949,0x594E,INVALC,0x594A,INVALC,0x377D, + INVALC,0x594F,0x3B22,0x3969, + /* Range 0x62FE - 0x6302, array index: 0x0C23 */ + 0x3D26,0x593D,INVALC,0x3B7D,0x594C, + /* Range 0x6307 - 0x6309, array index: 0x0C28 */ + 0x3B58,0x594D,0x3044, + /* Range 0x633D - 0x633F, array index: 0x0C2B */ + 0x4854,0x5951,0x415E, + /* Range 0x634C - 0x6350, array index: 0x0C2E */ + 0x3B2B,0x5952,INVALC,0x5954,0x5950, + /* Range 0x6367 - 0x636B, array index: 0x0C33 */ + 0x4A7B,0x3C4E,0x5960,INVALC,0x595F, + /* Range 0x639F - 0x63AC, array index: 0x0C38 */ + 0x595D,0x4E2B,0x3A4E,0x4335,0x595A,INVALC,0x405C,INVALC, + 0x3935,0x3F64,0x3166,0x413C,0x5958,0x3545, + /* Range 0x64E0 - 0x64E7, array index: 0x0C46 */ + 0x5A2B,0x5A2C,0x4527,0x5A2E,INVALC,INVALC,0x3B24,0x5A29, + /* Range 0x652A - 0x652C, array index: 0x0C4E */ + 0x5978,0x5A3C,0x5A30, + /* Range 0x6534 - 0x653F, array index: 0x0C51 */ + 0x5A3D,0x5A3E,0x5A40,0x5A3F,0x5A41,0x327E,INVALC,0x3936, + INVALC,INVALC,0x4A7C,0x402F, + /* Range 0x6555 - 0x6559, array index: 0x0C5D */ + 0x5A45,0x5A44,0x4754,0x5A47,0x3635, + /* Range 0x6574 - 0x6578, array index: 0x0C62 */ + 0x4030,0x4528,INVALC,0x495F,0x5A4B, + /* Range 0x6587 - 0x6589, array index: 0x0C67 */ + 0x4A38,0x555D,0x4046, + /* Range 0x65AB - 0x65B0, array index: 0x0C6A */ + 0x5A51,0x3B42,0x4347,INVALC,0x3B5B,0x3F37, + /* Range 0x65C1 - 0x65C6, array index: 0x0C70 */ + 0x5A55,INVALC,0x5A53,0x5A56,0x4E39,0x5A54, + /* Range 0x65E0 - 0x65ED, array index: 0x0C76 */ + 0x5A5B,0x5A5C,0x347B,INVALC,INVALC,0x467C,0x4336,0x356C, + 0x3B5D,0x4161,INVALC,INVALC,0x3D5C,0x3030, + /* Range 0x6634 - 0x6636, array index: 0x0C84 */ + 0x5A65,0x5A63,0x5A64, + /* Range 0x663F - 0x6644, array index: 0x0C87 */ + 0x5B26,INVALC,0x5A6A,0x3B7E,0x3938,0x5A68, + /* Range 0x665D - 0x665F, array index: 0x0C8D */ + 0x5A6C,0x5A6B,0x5A70, + /* Range 0x6664 - 0x6669, array index: 0x0C90 */ + 0x5A6D,INVALC,0x3322,0x5A6E,0x5A6F,0x4855, + /* Range 0x666E - 0x6670, array index: 0x0C96 */ + 0x4961,0x374A,0x5A72, + /* Range 0x6683 - 0x6689, array index: 0x0C99 */ + 0x5A73,0x5A77,INVALC,INVALC,0x324B,0x5A74,0x5A76, + /* Range 0x6696 - 0x6698, array index: 0x0CA0 */ + 0x4348,0x3045,0x5A78, + /* Range 0x66D9 - 0x66DD, array index: 0x0CA3 */ + 0x3D6C,0x5B24,INVALC,0x4D4B,0x4778, + /* Range 0x66F0 - 0x6700, array index: 0x0CA8 */ + 0x5B29,INVALC,0x364A,0x3148,0x3939,0x5B2A,INVALC,0x5B2B, + 0x3D71,0x4162,INVALC,INVALC,0x5258,0x413E,0x413D,0x4258, + 0x3A47, + /* Range 0x6714 - 0x6717, array index: 0x0CB9 */ + 0x3A73,0x443F,0x5B2D,0x4F2F, + /* Range 0x671B - 0x671F, array index: 0x0CBD */ + 0x4B3E,INVALC,0x442B,0x5B2E,0x347C, + /* Range 0x6726 - 0x672E, array index: 0x0CC2 */ + 0x5B2F,0x5B30,0x4C5A,INVALC,0x4C24,0x4B76,0x4B5C,0x3B25, + 0x5B32, + /* Range 0x6734 - 0x673A, array index: 0x0CCB */ + 0x4B51,INVALC,0x5B34,0x5B37,0x5B36,INVALC,0x3479, + /* Range 0x674E - 0x6753, array index: 0x0CD2 */ + 0x4D7B,0x3049,0x3A60,0x423C,INVALC,0x3C5D, + /* Range 0x675C - 0x6765, array index: 0x0CD8 */ + 0x454E,INVALC,0x5B39,0x422B,0x5B3A,0x3E72,0x4C5D,0x5B3C, + 0x5B3D,0x4D68, + /* Range 0x676D - 0x6777, array index: 0x0CE2 */ + 0x393A,INVALC,0x4755,0x5B3F,0x456C,0x5A5E,0x5A62,INVALC, + 0x354F,INVALC,0x4747, + /* Range 0x679C - 0x67A2, array index: 0x0CED */ + 0x324C,0x3B5E,INVALC,INVALC,0x4F48,0x5B46,0x3F75, + /* Range 0x67B3 - 0x67B9, array index: 0x0CF4 */ + 0x5B4C,0x5B4A,INVALC,0x324D,0x5B48,0x5B4E,0x5B54, + /* Range 0x67CE - 0x67D4, array index: 0x0CFB */ + 0x5B55,0x4770,0x4B3F,0x343B,INVALC,0x4077,0x3D40, + /* Range 0x67F1 - 0x67F5, array index: 0x0D02 */ + 0x436C,INVALC,0x4C78,0x3C46,0x3A74, + /* Range 0x67FE - 0x6804, array index: 0x0D07 */ + 0x4B6F,0x3341,INVALC,INVALC,0x444E,0x464A,0x3149, + /* Range 0x6829 - 0x682B, array index: 0x0D0E */ + 0x5B5B,0x3374,0x5B61, + /* Range 0x683C - 0x6843, array index: 0x0D11 */ + 0x334A,0x3A4F,INVALC,INVALC,0x5B5C,0x3765,0x374B,0x456D, + /* Range 0x684D - 0x6854, array index: 0x0D19 */ + 0x5B5D,0x5B5F,INVALC,0x364D,0x372C,INVALC,0x343C,0x354B, + /* Range 0x68A6 - 0x68A8, array index: 0x0D21 */ + 0x546D,0x3868,0x4D7C, + /* Range 0x68AD - 0x68BC, array index: 0x0D24 */ + 0x5B68,INVALC,0x4474,0x3323,0x3A2D,INVALC,0x5B60,INVALC, + 0x5B70,0x3361,INVALC,INVALC,0x5B6E,0x5B72,INVALC,0x456E, + /* Range 0x68C9 - 0x68CD, array index: 0x0D34 */ + 0x4C49,0x5B77,0x347D,INVALC,0x5B7E, + /* Range 0x68D4 - 0x68DA, array index: 0x0D39 */ + 0x5C21,0x5C23,INVALC,0x5C27,0x5B79,INVALC,0x432A, + /* Range 0x68DF - 0x68E3, array index: 0x0D40 */ + 0x456F,0x5C2B,0x5B7C,INVALC,0x5C28, + /* Range 0x690B - 0x690F, array index: 0x0D45 */ + 0x4C3A,0x5B7D,0x3F22,0x4447,0x5B73, + /* Range 0x6919 - 0x691C, array index: 0x0D4A */ + 0x3F7A,0x5C2F,0x3371,0x3821, + /* Range 0x6921 - 0x692A, array index: 0x0D4E */ + 0x5C31,0x5B7A,0x5C30,INVALC,0x5C29,0x5B7B,INVALC,0x5C2D, + INVALC,0x5C2E, + /* Range 0x6953 - 0x6955, array index: 0x0D58 */ + 0x4976,0x5C38,0x424A, + /* Range 0x6959 - 0x6962, array index: 0x0D5B */ + 0x5C3E,0x413F,INVALC,0x5C35,0x5C42,0x5C41,INVALC,0x466F, + 0x5C40,0x466A, + /* Range 0x696A - 0x6982, array index: 0x0D65 */ + 0x5C44,0x5C37,INVALC,0x3648,0x5C3A,0x3D5D,INVALC,INVALC, + INVALC,0x4760,0x5C3C,0x364B,INVALC,0x5C34,0x5C36,0x5C33, + INVALC,INVALC,0x4F30,0x335A,0x5C39,INVALC,INVALC,0x5C43, + 0x3335, + /* Range 0x69CA - 0x69D0, array index: 0x0D7E */ + 0x5C4E,0x393D,0x4448,0x4164,0x5C4C,INVALC,0x5C47, + /* Range 0x6A0A - 0x6A0C, array index: 0x0D85 */ + 0x5C68,0x4875,0x5C6E, + /* Range 0x6A12 - 0x6A14, array index: 0x0D88 */ + 0x5C69,0x5C6C,0x5C66, + /* Range 0x6A1E - 0x6A23, array index: 0x0D8B */ + 0x5C64,0x3E40,INVALC,0x4C4F,0x5C78,0x5C6B, + /* Range 0x6A29 - 0x6A2B, array index: 0x0D91 */ + 0x3822,0x3223,0x335F, + /* Range 0x6A35 - 0x6A3A, array index: 0x0D94 */ + 0x3E41,0x5C70,INVALC,0x5C77,0x3C79,0x3372, + /* Range 0x6AC1 - 0x6AC3, array index: 0x0D9A */ + 0x5C6A,0x5D25,0x5D24, + /* Range 0x6B1D - 0x6B23, array index: 0x0D9D */ + 0x3135,INVALC,0x5D36,0x3767,0x3C21,INVALC,0x3655, + /* Range 0x6B37 - 0x6B3E, array index: 0x0DA4 */ + 0x5D38,0x5D37,0x5D3A,0x353D,INVALC,INVALC,0x3656,0x343E, + /* Range 0x6B5F - 0x6B6A, array index: 0x0DAC */ + 0x5D43,INVALC,0x5D44,0x3B5F,0x4035,0x3A21,INVALC,0x4970, + INVALC,INVALC,0x4A62,0x4F44, + /* Range 0x6B89 - 0x6B8D, array index: 0x0DB8 */ + 0x3D5E,0x3C6C,0x3B44,INVALC,0x5D4B, + /* Range 0x6BAF - 0x6BC0, array index: 0x0DBD */ + 0x5D52,INVALC,0x5D54,0x5D53,0x5D55,0x3225,0x434A,INVALC, + 0x5D56,INVALC,INVALC,0x3B26,0x334C,0x5D57,INVALC,INVALC, + 0x4542,0x544C, + /* Range 0x6BD2 - 0x6BD4, array index: 0x0DCF */ + 0x4647,0x5D5A,0x4866, + /* Range 0x6C3E - 0x6C42, array index: 0x0DD2 */ + 0x4845,INVALC,0x4475,0x3D41,0x3561, + /* Range 0x6C5D - 0x6C62, array index: 0x0DD7 */ + 0x4672,0x5D67,0x393E,0x4353,INVALC,0x5D69, + /* Range 0x6C7D - 0x6C83, array index: 0x0DDD */ + 0x3525,0x5D70,INVALC,INVALC,0x5D6E,0x5D6B,0x4D60, + /* Range 0x6C99 - 0x6C9B, array index: 0x0DE4 */ + 0x3A3B,0x5D6D,0x5D6F, + /* Range 0x6CB8 - 0x6CC5, array index: 0x0DE7 */ + 0x4A28,0x4C7D,0x5E21,0x3C23,0x3E42,0x5D78,0x5D7E,0x3168, + INVALC,0x3637,INVALC,INVALC,0x5D75,0x5D7A, + /* Range 0x6CE1 - 0x6CE5, array index: 0x0DF5 */ + 0x4B22,0x4748,0x3563,INVALC,0x4525, + /* Range 0x6CEF - 0x6CF3, array index: 0x0DFA */ + 0x5E23,0x4259,0x5D76,INVALC,0x314B, + /* Range 0x6D29 - 0x6D2B, array index: 0x0DFF */ + 0x314C,0x393F,0x5E29, + /* Range 0x6D32 - 0x6D38, array index: 0x0E02 */ + 0x3D27,0x5E2E,INVALC,0x5E2D,0x5E28,INVALC,0x5E2B, + /* Range 0x6D77 - 0x6D79, array index: 0x0E09 */ + 0x3324,0x3F3B,0x5E35, + /* Range 0x6DC5 - 0x6DC7, array index: 0x0E0C */ + 0x5E48,0x5E42,0x5E3F, + /* Range 0x6DE8 - 0x6DEE, array index: 0x0E0F */ + 0x5E46,INVALC,0x5E4D,0x307C,0x5E43,INVALC,0x5E4E, + /* Range 0x6DF7 - 0x6DFB, array index: 0x0E16 */ + 0x3A2E,INVALC,0x5E3B,0x5E49,0x453A, + /* Range 0x6E05 - 0x6E0B, array index: 0x0E1B */ + 0x4036,INVALC,0x3369,0x3A51,0x3E44,0x5E3D,0x3D42, + /* Range 0x6E19 - 0x6E26, array index: 0x0E22 */ + 0x5E52,0x3D6D,0x383A,INVALC,0x5E61,INVALC,0x5E5B,0x3574, + 0x454F,INVALC,0x5E56,0x5E5F,0x302F,0x3132, + /* Range 0x6E29 - 0x6E2F, array index: 0x0E30 */ + 0x3239,INVALC,0x5E58,0x422C,0x5E4F,0x5E51,0x3941, + /* Range 0x6E7E - 0x6E82, array index: 0x0E37 */ + 0x4F51,0x3C3E,0x4B7E,INVALC,0x5E63, + /* Range 0x6ED1 - 0x6ED5, array index: 0x0E3C */ + 0x336A,INVALC,0x5E68,0x5E6D,0x5E6E, + /* Range 0x6EFE - 0x6F02, array index: 0x0E41 */ + 0x5E78,0x5E60,INVALC,0x3579,0x493A, + /* Range 0x6F11 - 0x6F15, array index: 0x0E46 */ + 0x5E74,INVALC,0x5F22,0x3169,0x4166, + /* Range 0x6F6D - 0x6F70, array index: 0x0E4B */ + 0x5F2C,0x442C,0x5F29,0x4459, + /* Range 0x6F80 - 0x6F86, array index: 0x0E4F */ + 0x5F28,0x5F27,0x5F2D,INVALC,0x4021,INVALC,0x5F24, + /* Range 0x6FC0 - 0x6FC3, array index: 0x0E56 */ + 0x3763,0x4279,0x5F32,0x473B, + /* Range 0x6FDF - 0x6FE1, array index: 0x0E5A */ + 0x5F3B,0x396A,0x4728, + /* Range 0x6FEB - 0x6FF3, array index: 0x0E5D */ + 0x4D74,0x5F3D,INVALC,0x5F41,0x4275,INVALC,0x5F40,INVALC, + 0x5F2B, + /* Range 0x701A - 0x701F, array index: 0x0E66 */ + 0x5F4B,0x5F4A,INVALC,0x5F4D,0x4654,0x5F4F, + /* Range 0x70AC - 0x70AF, array index: 0x0E6C */ + 0x5F59,0x433A,0x5F5C,0x5F57, + /* Range 0x70B8 - 0x70BA, array index: 0x0E70 */ + 0x5F5A,0x4540,0x3059, + /* Range 0x7162 - 0x7169, array index: 0x0E73 */ + 0x5F69,INVALC,0x4761,0x5F65,0x5F68,0x3E48,INVALC,0x4851, + /* Range 0x71E5 - 0x71E7, array index: 0x0E7B */ + 0x4167,0x3B38,0x5F7C, + /* Range 0x71EC - 0x71EE, array index: 0x0E7E */ + 0x5F7B,0x3F24,0x5259, + /* Range 0x723A - 0x7240, array index: 0x0E81 */ + 0x4C6C,0x602B,0x602C,0x4156,0x3C24,0x602D,0x602E, + /* Range 0x7246 - 0x724C, array index: 0x0E88 */ + 0x602F,0x4A52,0x4847,INVALC,INVALC,0x6030,0x4757, + /* Range 0x727D - 0x7282, array index: 0x0E8F */ + 0x3823,0x6033,INVALC,0x3A54,0x6035,0x6034, + /* Range 0x72C2 - 0x72C6, array index: 0x0E95 */ + 0x3638,0x603D,0x603F,INVALC,0x603E, + /* Range 0x72E0 - 0x72E2, array index: 0x0E9A */ + 0x6043,0x6044,0x6042, + /* Range 0x72F7 - 0x72FD, array index: 0x0E9D */ + 0x6046,0x432C,0x6045,INVALC,INVALC,0x4F35,0x4762, + /* Range 0x731B - 0x731F, array index: 0x0EA4 */ + 0x4C54,0x604A,0x604C,INVALC,0x4E44, + /* Range 0x7329 - 0x732F, array index: 0x0EA9 */ + 0x604F,0x4376,0x472D,INVALC,INVALC,0x3825,0x604E, + /* Range 0x7432 - 0x7436, array index: 0x0EB0 */ + 0x606A,0x4E56,0x3657,0x487C,0x474A, + /* Range 0x7459 - 0x7464, array index: 0x0EB5 */ + 0x606F,0x386A,0x314D,0x6071,INVALC,0x3F70,0x606E,0x4E5C, + INVALC,INVALC,0x6074,0x7424, + /* Range 0x74EE - 0x74F8, array index: 0x0EC1 */ + 0x6125,INVALC,0x6127,0x6128,0x6126,INVALC,INVALC,INVALC, + 0x4953,0x612A,0x6129, + /* Range 0x7503 - 0x7505, array index: 0x0ECC */ + 0x612C,0x612B,0x612D, + /* Range 0x750C - 0x750E, array index: 0x0ECF */ + 0x612E,0x6130,0x612F, + /* Range 0x7530 - 0x7533, array index: 0x0ED2 */ + 0x4544,0x4D33,0x3943,0x3F3D, + /* Range 0x7537 - 0x753C, array index: 0x0ED6 */ + 0x434B,0x5234,INVALC,0x442E,0x3268,0x6136, + /* Range 0x7549 - 0x7551, array index: 0x0EDC */ + 0x613A,0x6139,0x5A42,0x3326,0x6138,INVALC,0x305A,INVALC, + 0x482A, + /* Range 0x7559 - 0x755D, array index: 0x0EE5 */ + 0x4E31,0x613D,0x613B,0x435C,0x4026, + /* Range 0x7562 - 0x756D, array index: 0x0EEA */ + 0x492D,INVALC,0x613F,0x4E2C,0x374D,0x6140,INVALC,0x613E, + 0x4856,0x6141,INVALC,0x6142, + /* Range 0x7573 - 0x7578, array index: 0x0EF6 */ + 0x3E76,0x6147,INVALC,0x6144,0x466D,0x6143, + /* Range 0x7586 - 0x7591, array index: 0x0EFC */ + 0x6145,0x6146,INVALC,0x6149,0x6148,0x4925,INVALC,INVALC, + 0x4142,0x4141,INVALC,0x353F, + /* Range 0x75B1 - 0x75BE, array index: 0x0F08 */ + 0x6157,0x4868,0x6151,INVALC,0x6153,INVALC,INVALC,0x6155, + 0x3F3E,INVALC,INVALC,0x6156,0x6154,0x3C40, + /* Range 0x75F0 - 0x75F4, array index: 0x0F16 */ + 0x6162,INVALC,0x6164,0x6165,0x4354, + /* Range 0x761F - 0x7624, array index: 0x0F1B */ + 0x6169,0x616B,0x616C,0x616D,INVALC,0x616E, + /* Range 0x7646 - 0x7648, array index: 0x0F21 */ + 0x6174,0x6172,0x6173, + /* Range 0x7667 - 0x766C, array index: 0x0F24 */ + 0x617C,0x6179,0x617A,0x617B,INVALC,0x617D, + /* Range 0x7678 - 0x7688, array index: 0x0F2A */ + 0x6223,INVALC,0x482F,0x4550,0x6224,0x4772,0x4934,INVALC, + 0x6225,INVALC,INVALC,0x6226,0x452A,INVALC,0x3327,0x3944, + 0x6227, + /* Range 0x76B7 - 0x76BA, array index: 0x0F3B */ + 0x7369,0x6230,0x6231,0x6232, + /* Range 0x76DB - 0x76E7, array index: 0x0F3F */ + 0x4039,0x5D39,INVALC,0x6237,0x4C41,INVALC,0x6238,INVALC, + 0x3446,0x4857,0x6239,INVALC,0x623A, + /* Range 0x7707 - 0x770C, array index: 0x0F4C */ + 0x623F,0x623E,0x487D,INVALC,0x3447,0x3829, + /* Range 0x771E - 0x7726, array index: 0x0F52 */ + 0x6243,0x3F3F,0x4C32,INVALC,INVALC,INVALC,0x6242,0x6244, + 0x6245, + /* Range 0x77B9 - 0x77BF, array index: 0x0F5B */ + 0x6259,INVALC,0x625D,0x625B,0x625C,INVALC,0x625A, + /* Range 0x77DA - 0x77DC, array index: 0x0F62 */ + 0x6261,0x4C37,0x6262, + /* Range 0x77ED - 0x77EF, array index: 0x0F65 */ + 0x433B,0x6264,0x363A, + /* Range 0x7825 - 0x7827, array index: 0x0F68 */ + 0x4556,0x3A56,0x354E, + /* Range 0x788C - 0x788E, array index: 0x0F6B */ + 0x6271,0x3337,0x626C, + /* Range 0x792A - 0x792C, array index: 0x0F6E */ + 0x626A,0x632A,0x6329, + /* Range 0x7947 - 0x7949, array index: 0x0F71 */ + 0x3540,0x3527,0x3B63, + /* Range 0x7953 - 0x7957, array index: 0x0F74 */ + 0x6331,INVALC,0x6330,0x4144,0x632D, + /* Range 0x795D - 0x7962, array index: 0x0F79 */ + 0x3D4B,0x3F40,0x632E,0x632C,INVALC,0x472A, + /* Range 0x797F - 0x7985, array index: 0x0F7F */ + 0x6333,0x6349,0x3658,INVALC,INVALC,0x4F3D,0x4135, + /* Range 0x798D - 0x798F, array index: 0x0F86 */ + 0x3252,0x4477,0x4A21, + /* Range 0x79B9 - 0x79C1, array index: 0x0F89 */ + 0x633B,0x633C,INVALC,INVALC,0x3659,0x3253,0x4645,0x3D28, + 0x3B64, + /* Range 0x79E3 - 0x79E9, array index: 0x0F92 */ + 0x6342,0x4769,INVALC,0x3F41,0x633F,INVALC,0x4361, + /* Range 0x7A17 - 0x7A20, array index: 0x0F99 */ + 0x4923,0x6345,0x6346,0x4355,INVALC,0x4E47,INVALC,INVALC, + 0x6348,0x6347, + /* Range 0x7A3B - 0x7A43, array index: 0x0FA3 */ + 0x634B,0x3254,0x374E,0x634C,0x3946,0x3972,INVALC,0x4A66, + 0x634E, + /* Range 0x7A4D - 0x7A50, array index: 0x0FAC */ + 0x4051,0x314F,0x323A,0x302C, + /* Range 0x7A61 - 0x7A63, array index: 0x0FB0 */ + 0x6351,0x6352,0x3E77, + /* Range 0x7A92 - 0x7A98, array index: 0x0FB3 */ + 0x4362,0x416B,INVALC,0x635A,0x635C,0x6359,0x635B, + /* Range 0x7AAE - 0x7AB0, array index: 0x0FBA */ + 0x3567,0x4D52,0x635F, + /* Range 0x7AC3 - 0x7AD5, array index: 0x0FBD */ + 0x3376,0x6362,0x6361,INVALC,0x6365,0x635E,INVALC,0x6366, + 0x4E29,INVALC,0x6367,INVALC,0x6368,INVALC,INVALC,0x5474, + 0x636A,INVALC,0x6369, + /* Range 0x7AD9 - 0x7AE6, array index: 0x0FD0 */ + 0x636B,0x636C,INVALC,0x4E35,0x636D,INVALC,0x706F,0x3E4F, + 0x636E,0x636F,0x3D57,INVALC,0x4638,0x6370, + /* Range 0x7AF6 - 0x7AFA, array index: 0x0FDE */ + 0x3625,INVALC,0x513F,0x435D,0x3C33, + /* Range 0x7B45 - 0x7B56, array index: 0x0FE3 */ + 0x6426,0x492E,INVALC,0x4826,0x4579,INVALC,0x365A,0x6425, + 0x6423,INVALC,0x4835,0x637E,0x435E,0x457B,INVALC,0x457A, + INVALC,0x3A76, + /* Range 0x7B94 - 0x7BA1, array index: 0x0FF5 */ + 0x4773,0x4C27,INVALC,0x3B3B,0x6430,0x6439,0x6434,INVALC, + 0x6433,0x642F,INVALC,0x6431,INVALC,0x3449, + /* Range 0x7BE4 - 0x7BE6, array index: 0x1003 */ + 0x4646,0x6445,0x6444, + /* Range 0x7C11 - 0x7C14, array index: 0x1006 */ + 0x6442,0x5255,0x6449,0x6443, + /* Range 0x7C3D - 0x7C40, array index: 0x100A */ + 0x6455,0x4E7C,0x4A6D,0x645A, + /* Range 0x7C4C - 0x7C50, array index: 0x100E */ + 0x6456,0x4052,INVALC,0x6459,0x645B, + /* Range 0x7C81 - 0x7C83, array index: 0x1013 */ + 0x364E,0x3729,0x6463, + /* Range 0x7CA1 - 0x7CA8, array index: 0x1016 */ + 0x6469,0x6467,INVALC,0x6465,0x3421,INVALC,0x3E51,0x646A, + /* Range 0x7CAD - 0x7CB3, array index: 0x101E */ + 0x6466,0x646E,INVALC,INVALC,0x646D,0x646C,0x646B, + /* Range 0x7CDC - 0x7CE2, array index: 0x1025 */ + 0x6476,INVALC,0x4A35,0x416C,0x3947,INVALC,0x6477, + /* Range 0x7D02 - 0x7D06, array index: 0x102C */ + 0x6521,INVALC,0x4C73,0x3948,0x647E, + /* Range 0x7D14 - 0x7D22, array index: 0x1031 */ + 0x3D63,0x6523,INVALC,0x3C53,0x3949,0x3B66,0x3569,0x4A36, + 0x6522,INVALC,INVALC,INVALC,0x4147,0x4B42,0x3A77, + /* Range 0x7D2B - 0x7D35, array index: 0x1040 */ + 0x3B67,0x445D,INVALC,0x6527,0x4E5F,0x3A59,INVALC,0x6528, + 0x3F42,INVALC,0x652A, + /* Range 0x7D42 - 0x7D46, array index: 0x104B */ + 0x3D2A,0x383E,0x4148,0x6525,0x652B, + /* Range 0x7D4B - 0x7D50, array index: 0x1050 */ + 0x6526,0x3750,INVALC,0x652E,0x6532,0x376B, + /* Range 0x7D61 - 0x7D63, array index: 0x1056 */ + 0x4D6D,0x303C,0x6533, + /* Range 0x7D71 - 0x7D76, array index: 0x1059 */ + 0x457D,0x652F,0x652C,INVALC,0x3328,0x4064, + /* Range 0x7D99 - 0x7D9C, array index: 0x105F */ + 0x3751,0x4233,0x6539,0x416E, + /* Range 0x7DAB - 0x7DB5, array index: 0x1063 */ + 0x6540,0x3C7A,0x305D,0x653B,0x6543,0x6547,0x394B,0x4C56, + INVALC,0x4456,0x653D, + /* Range 0x7DBA - 0x7DBF, array index: 0x106E */ + 0x653A,0x433E,INVALC,0x653F,0x303D,0x4C4A, + /* Range 0x7DDA - 0x7DE1, array index: 0x1074 */ + 0x407E,INVALC,0x6544,0x6549,0x654B,INVALC,0x4479,0x654E, + /* Range 0x7E09 - 0x7E0B, array index: 0x107C */ + 0x6556,0x6550,0x6557, + /* Range 0x7E1E - 0x7E23, array index: 0x107F */ + 0x3C4A,0x6555,INVALC,0x6552,0x6558,0x6551, + /* Range 0x7E37 - 0x7E3E, array index: 0x1085 */ + 0x655F,INVALC,0x655D,0x6561,0x655B,INVALC,0x6541,0x4053, + /* Range 0x7E54 - 0x7E5E, array index: 0x108D */ + 0x3F25,0x4136,0x6564,INVALC,INVALC,0x6566,0x6567,INVALC, + INVALC,0x6563,0x6565, + /* Range 0x7E66 - 0x7E6A, array index: 0x1098 */ + 0x655A,0x6562,INVALC,0x656A,0x6569, + /* Range 0x7E79 - 0x7E83, array index: 0x109D */ + 0x6568,INVALC,0x656C,0x656B,0x656F,INVALC,0x6571,INVALC, + INVALC,0x3B3C,0x656D, + /* Range 0x7E8C - 0x7E96, array index: 0x10A8 */ + 0x6574,INVALC,0x657A,0x453B,0x6576,INVALC,0x6575,0x6577, + 0x6578,INVALC,0x6579, + /* Range 0x7F4C - 0x7F55, array index: 0x10B3 */ + 0x6622,0x6623,0x6624,INVALC,0x6625,0x6626,INVALC,INVALC, + 0x6628,0x6627, + /* Range 0x7F67 - 0x7F6B, array index: 0x10BD */ + 0x662E,0x662C,0x662D,0x3A61,0x3753, + /* Range 0x7F75 - 0x7F79, array index: 0x10C2 */ + 0x474D,INVALC,0x486D,0x662F,0x586D, + /* Range 0x7F82 - 0x7F8E, array index: 0x10C7 */ + 0x6630,0x6632,INVALC,0x4D65,0x6631,0x6634,0x6633,INVALC, + 0x4D53,INVALC,0x6635,INVALC,0x487E, + /* Range 0x8000 - 0x8006, array index: 0x10D4 */ + 0x4D54,0x4F37,INVALC,0x394D,0x664E,0x3C54,0x664D, + /* Range 0x8015 - 0x8019, array index: 0x10DB */ + 0x394C,INVALC,0x4C57,0x6651,0x6652, + /* Range 0x805E - 0x8062, array index: 0x10E0 */ + 0x4A39,0x665D,INVALC,0x416F,0x665E, + /* Range 0x806F - 0x807F, array index: 0x10E5 */ + 0x4E7E,0x6662,INVALC,0x6661,0x6660,0x4430,INVALC,0x6663, + 0x3F26,INVALC,0x6664,INVALC,INVALC,INVALC,0x6665,0x4F38, + 0x6666, + /* Range 0x8084 - 0x808C, array index: 0x10F6 */ + 0x6667,0x6669,0x6668,0x4825,INVALC,0x4679,INVALC,0x4F3E, + 0x4829, + /* Range 0x80A9 - 0x80B4, array index: 0x10FF */ + 0x382A,0x4B43,INVALC,0x666F,0x666D,INVALC,0x394E,INVALC, + 0x394F,0x3069,INVALC,0x3A68, + /* Range 0x80D9 - 0x80DE, array index: 0x110B */ + 0x6672,0x6675,0x6670,INVALC,0x6673,0x4B26, + /* Range 0x8105 - 0x810A, array index: 0x1111 */ + 0x363C,0x4048,0x4F46,0x4C2E,0x6677,0x4054, + /* Range 0x8150 - 0x8155, array index: 0x1117 */ + 0x4965,0x6725,INVALC,0x6724,0x3950,0x4F53, + /* Range 0x8178 - 0x817A, array index: 0x111D */ + 0x4432,0x4A22,0x4123, + /* Range 0x817F - 0x8183, array index: 0x1120 */ + 0x425C,0x672F,INVALC,0x6730,0x672C, + /* Range 0x81BD - 0x81C2, array index: 0x1125 */ + 0x673C,0x673A,0x473F,0x673D,INVALC,0x673E, + /* Range 0x81D8 - 0x81DA, array index: 0x112B */ + 0x6744,0x6743,0x6746, + /* Range 0x81FA - 0x8202, array index: 0x112E */ + 0x674A,0x674B,0x3131,INVALC,0x674C,INVALC,INVALC,0x674D, + 0x674E, + /* Range 0x8205 - 0x821F, array index: 0x1137 */ + 0x674F,INVALC,0x6750,0x363D,0x5A2A,0x6751,INVALC,0x4065, + 0x6752,0x3C4B,INVALC,0x6753,INVALC,0x5030,INVALC,INVALC, + INVALC,0x6754,0x4A5E,0x345C,INVALC,INVALC,0x4124,0x3D58, + INVALC,0x4971,0x3D2E, + /* Range 0x8229 - 0x822E, array index: 0x1152 */ + 0x6755,0x3952,0x6756,0x484C,INVALC,0x6764, + /* Range 0x8233 - 0x8239, array index: 0x1158 */ + 0x6758,INVALC,0x4249,0x4775,0x383F,0x6757,0x4125, + /* Range 0x8258 - 0x825A, array index: 0x115F */ + 0x675B,0x675A,0x675D, + /* Range 0x826E - 0x8278, array index: 0x1162 */ + 0x3A31,0x4E49,INVALC,0x6765,0x3F27,INVALC,INVALC,INVALC, + 0x3170,0x6766,0x6767, + /* Range 0x82AB - 0x82B3, array index: 0x116D */ + 0x676B,0x676E,0x474E,INVALC,0x3F44,INVALC,0x3256,INVALC, + 0x4B27, + /* Range 0x82D1 - 0x82D4, array index: 0x1176 */ + 0x3171,0x6772,0x4E6A,0x425D, + /* Range 0x82DB - 0x82E7, array index: 0x117A */ + 0x3257,0x677C,INVALC,0x677A,0x6771,INVALC,0x676F,INVALC, + 0x6770,INVALC,0x3C63,0x366C,0x4377, + /* Range 0x82F9 - 0x82FB, array index: 0x1187 */ + 0x6779,0x6775,0x6778, + /* Range 0x8302 - 0x8306, array index: 0x118A */ + 0x4C50,0x6777,0x3258,0x337D,0x677B, + /* Range 0x8316 - 0x8318, array index: 0x118F */ + 0x6823,0x682C,0x682D, + /* Range 0x8331 - 0x8339, array index: 0x1192 */ + 0x6825,0x6824,INVALC,0x6822,0x6821,0x4363,INVALC,0x427B, + 0x6827, + /* Range 0x839E - 0x83A2, array index: 0x119B */ + 0x3450,0x6831,0x683C,INVALC,0x6832, + /* Range 0x83EF - 0x83F4, array index: 0x11A0 */ + 0x325A,0x3856,0x4929,0x684B,INVALC,0x683F, + /* Range 0x840B - 0x840E, array index: 0x11A6 */ + 0x6846,0x4B28,0x684C,0x3060, + /* Range 0x8461 - 0x8463, array index: 0x11AA */ + 0x4972,0x6864,0x4621, + /* Range 0x8469 - 0x8471, array index: 0x11AD */ + 0x685D,INVALC,0x6859,0x4172,0x6853,0x685B,0x6860,INVALC, + 0x472C, + /* Range 0x84B8 - 0x84BC, array index: 0x11B6 */ + 0x3E78,0x6865,INVALC,0x686A,0x4173, + /* Range 0x84C9 - 0x84D1, array index: 0x11BB */ + 0x4D56,0x6863,0x3338,INVALC,0x6869,INVALC,INVALC,0x686C, + 0x4C2C, + /* Range 0x8511 - 0x851A, array index: 0x11C4 */ + 0x4A4E,INVALC,0x4C22,0x6879,0x6878,INVALC,0x6874,0x6875, + INVALC,0x3136, + /* Range 0x8548 - 0x854B, array index: 0x11CE */ + 0x687E,0x3E56,0x3C49,0x6923, + /* Range 0x8568 - 0x856A, array index: 0x11D2 */ + 0x4F4F,0x4622,0x4973, + /* Range 0x85A6 - 0x85AF, array index: 0x11D5 */ + 0x4126,INVALC,0x692A,0x3B27,0x3F45,0x3730,0x4C74,INVALC, + 0x4C79,0x3D72, + /* Range 0x85F7 - 0x85FB, array index: 0x11DF */ + 0x3D73,INVALC,0x693D,0x6942,0x4174, + /* Range 0x868A - 0x868C, array index: 0x11E4 */ + 0x3263,0x6952,0x6953, + /* Range 0x86A9 - 0x86AB, array index: 0x11E7 */ + 0x6950,0x6951,0x695B, + /* Range 0x86EC - 0x86EF, array index: 0x11EA */ + 0x695F,0x4948,0x485A,0x6962, + /* Range 0x8706 - 0x870A, array index: 0x11EE */ + 0x6964,INVALC,0x6965,0x696A,0x696D, + /* Range 0x880D - 0x8811, array index: 0x11F3 */ + 0x6A38,0x6A3C,0x6A37,INVALC,0x6A3E, + /* Range 0x8821 - 0x8823, array index: 0x11F8 */ + 0x6A42,0x6A41,0x695A, + /* Range 0x885D - 0x8863, array index: 0x11FB */ + 0x3E57,0x6A4C,INVALC,INVALC,0x3955,0x6A4D,0x3061, + /* Range 0x887D - 0x8882, array index: 0x1202 */ + 0x6A53,0x6A50,0x365E,INVALC,0x6A4F,0x6A56, + /* Range 0x88BF - 0x88C5, array index: 0x1208 */ + 0x6A5F,INVALC,0x3A5B,0x4E76,0x6A61,0x6A62,0x4175, + /* Range 0x88F2 - 0x88F4, array index: 0x120F */ + 0x6A6C,0x3E58,0x6A6A, + /* Range 0x88F8 - 0x88FE, array index: 0x1212 */ + 0x4D67,0x6A67,INVALC,INVALC,0x6A69,0x403D,0x3F7E, + /* Range 0x895E - 0x8960, array index: 0x1219 */ + 0x6A7E,0x365F,0x6A7D, + /* Range 0x8986 - 0x898B, array index: 0x121C */ + 0x4A24,0x4746,0x6B2A,INVALC,0x6B2B,0x382B, + /* Range 0x8996 - 0x899A, array index: 0x1222 */ + 0x3B6B,0x4741,0x6B2D,INVALC,0x3350, + /* Range 0x89A6 - 0x89AC, array index: 0x1227 */ + 0x6B30,0x4D77,INVALC,0x6B2F,0x3F46,INVALC,0x6B31, + /* Range 0x8A16 - 0x8A18, array index: 0x122E */ + 0x6B3F,0x4277,0x352D, + /* Range 0x8A3A - 0x8A3C, array index: 0x1231 */ + 0x3F47,0x4370,0x3E5A, + /* Range 0x8A50 - 0x8A55, array index: 0x1234 */ + 0x3A3E,0x4242,0x6B48,INVALC,0x3E5B,0x493E, + /* Range 0x8A69 - 0x8A73, array index: 0x123A */ + 0x3B6D,INVALC,0x4F4D,0x6B4D,0x6B4C,0x4127,INVALC,0x354D, + 0x4F43,0x333A,0x3E5C, + /* Range 0x8AA0 - 0x8AA8, array index: 0x1245 */ + 0x403F,0x6B53,INVALC,0x6B58,0x386D,0x6B55,0x6B56,INVALC, + 0x6B52, + /* Range 0x8ACB - 0x8ACF, array index: 0x124E */ + 0x4041,0x3452,0x6B5A,INVALC,0x3F5B, + /* Range 0x8ADA - 0x8AE7, array index: 0x1253 */ + 0x6B5C,0x6B67,0x4435,INVALC,0x6B66,INVALC,0x6B63,0x6B6B, + 0x6B64,INVALC,0x6B60,INVALC,0x447C,0x6B5F, + /* Range 0x8AFE - 0x8B04, array index: 0x1261 */ + 0x427A,INVALC,0x4B45,0x315A,0x3062,INVALC,0x4625, + /* Range 0x8B16 - 0x8B21, array index: 0x1268 */ + 0x6B6C,0x6B6E,INVALC,0x382C,0x6B6A,0x3956,INVALC,0x3C55, + INVALC,INVALC,0x6B6F,0x4D58, + /* Range 0x8B58 - 0x8B5C, array index: 0x1274 */ + 0x3C31,INVALC,0x6B7D,0x6B7C,0x4968, + /* Range 0x8B6B - 0x8B74, array index: 0x1279 */ + 0x6B7E,0x6C22,INVALC,INVALC,0x6C23,0x3544,0x6641,0x3E79, + INVALC,0x6C24, + /* Range 0x8C6A - 0x8C6C, array index: 0x1283 */ + 0x396B,0x502E,0x6C37, + /* Range 0x8C78 - 0x8C7C, array index: 0x1286 */ + 0x6C38,0x493F,0x6C39,INVALC,0x6C41, + /* Range 0x8C89 - 0x8C8E, array index: 0x128B */ + 0x6C3B,0x6C3D,INVALC,0x4B46,0x6C3E,0x6C3F, + /* Range 0x8C9D - 0x8CA2, array index: 0x1291 */ + 0x332D,0x4467,INVALC,0x4969,0x3A62,0x3957, + /* Range 0x8CA7 - 0x8CCE, array index: 0x1297 */ + 0x494F,0x325F,0x484E,0x6C45,0x3453,0x4055,0x6C44,0x6C49, + 0x4379,0x4C63,INVALC,0x6C47,0x6C48,0x352E,INVALC,0x6C4A, + 0x4763,0x425F,INVALC,INVALC,0x4871,0x453D,0x6C46,INVALC, + 0x4B47,0x326C,0x6C4C,0x4F28,0x4442,0x4F45,INVALC,INVALC, + 0x3B71,0x6C4B,INVALC,0x4231,INVALC,INVALC,0x6C5C,0x4128, + /* Range 0x8CDA - 0x8CE6, array index: 0x12BF */ + 0x6C4F,0x3B3F,0x3B72,INVALC,0x3E5E,INVALC,0x4765,INVALC, + 0x382D,0x6C4E,0x6C4D,INVALC,0x496A, + /* Range 0x8CFA - 0x8CFD, array index: 0x12CC */ + 0x6C51,0x6C52,0x3958,0x6C50, + /* Range 0x8D04 - 0x8D16, array index: 0x12D0 */ + 0x6C53,0x6C54,INVALC,0x6C56,0x4223,INVALC,0x6C55,0x3466, + INVALC,0x6C58,INVALC,0x6C57,0x6C59,INVALC,INVALC,0x6C5B, + 0x6C5D,INVALC,0x6C5E, + /* Range 0x8D70 - 0x8D74, array index: 0x12E3 */ + 0x4176,0x6C61,INVALC,0x6C62,0x496B, + /* Range 0x8E08 - 0x8E0A, array index: 0x12E8 */ + 0x6C73,0x6C74,0x4D59, + /* Range 0x8E1D - 0x8E1F, array index: 0x12EB */ + 0x6C76,0x6C77,0x6C79, + /* Range 0x8E47 - 0x8E4C, array index: 0x12EE */ + 0x6D21,0x6D25,0x6D22,0x6C7E,INVALC,0x6D23, + /* Range 0x8EAA - 0x8EB1, array index: 0x12F4 */ + 0x6D39,0x3F48,0x6D3B,INVALC,INVALC,0x366D,0x6D3C,0x6D3E, + /* Range 0x8EC8 - 0x8ECD, array index: 0x12FC */ + 0x6D41,INVALC,0x3C56,0x6D42,0x3530,0x3733, + /* Range 0x8EFB - 0x8EFE, array index: 0x1302 */ + 0x6D46,0x6D45,0x375A,0x6D48, + /* Range 0x8F12 - 0x8F15, array index: 0x1306 */ + 0x6D4C,0x6D4E,0x4A65,0x6D4B, + /* Range 0x8F19 - 0x8F1F, array index: 0x130A */ + 0x6D4D,INVALC,0x6D51,0x6D4F,0x3531,INVALC,0x6D50, + /* Range 0x8F42 - 0x8F46, array index: 0x1311 */ + 0x6D58,INVALC,0x336D,0x6D57,0x6D5C, + /* Range 0x8F4C - 0x8F4E, array index: 0x1316 */ + 0x6D5A,0x4532,0x6D5D, + /* Range 0x8F5F - 0x8F64, array index: 0x1319 */ + 0x396C,INVALC,0x3725,0x6D60,0x6D61,0x6D62, + /* Range 0x8F9B - 0x8F9F, array index: 0x131F */ + 0x3F49,0x6D63,INVALC,0x3C2D,0x6D64, + /* Range 0x8FAD - 0x8FB2, array index: 0x1324 */ + 0x6D66,0x6570,0x6D67,0x4324,0x3F2B,0x4740, + /* Range 0x8FBA - 0x8FBC, array index: 0x132A */ + 0x4A55,0x4454,0x397E, + /* Range 0x8FE5 - 0x8FF0, array index: 0x132D */ + 0x6D6A,0x3260,INVALC,INVALC,0x4676,0x6D6C,0x4777,INVALC, + 0x4533,INVALC,0x6D6D,0x3D52, + /* Range 0x8FF7 - 0x8FFA, array index: 0x1339 */ + 0x4C42,0x6D7E,0x6D71,0x6D72, + /* Range 0x900B - 0x9023, array index: 0x133D */ + 0x6D79,INVALC,0x6D76,0x6E25,0x4629,0x4360,0x6D73,INVALC, + 0x447E,0x4553,0x6D74,0x6D78,0x3F60,INVALC,0x4767,0x444C, + INVALC,INVALC,0x4042,0x6D77,0x422E,0x4224,0x6D75,0x3029, + 0x4F22, + /* Range 0x9035 - 0x9039, array index: 0x1356 */ + 0x6D7C,0x6D7B,INVALC,0x306F,0x6D7D, + /* Range 0x9047 - 0x9059, array index: 0x135B */ + 0x3678,INVALC,0x6E26,0x4D37,0x313F,INVALC,0x4A57,0x3261, + 0x6E21,0x6E22,0x6E23,0x6E24,0x463B,0x4323,0x3063,0x6E28, + INVALC,0x6E29,0x7423, + /* Range 0x906D - 0x906F, array index: 0x136E */ + 0x4178,0x3C57,0x6E2C, + /* Range 0x9075 - 0x9084, array index: 0x1371 */ + 0x3D65,0x6E2D,0x412B,0x412A,INVALC,0x3064,INVALC,0x4E4B, + 0x6E31,INVALC,0x4872,0x6E33,0x6E32,0x6E30,0x6364,0x3454, + /* Range 0x9149 - 0x914E, array index: 0x1381 */ + 0x4653,0x6E44,0x3D36,0x3C60,0x475B,0x4371, + /* Range 0x91C6 - 0x91D1, array index: 0x1387 */ + 0x4850,0x3A53,0x3C61,0x6E58,INVALC,0x6E59,0x4E24,0x3D45, + 0x4C6E,0x4E4C,0x6E5A,0x3662, + /* Range 0x91DB - 0x91E7, array index: 0x1393 */ + 0x6E5E,0x3378,0x3F4B,INVALC,0x6E5C,INVALC,0x6E5D,INVALC, + 0x4460,INVALC,INVALC,0x4B55,0x367C, + /* Range 0x9298 - 0x929C, array index: 0x13A0 */ + 0x4C43,INVALC,0x4438,0x6E75,0x6E72, + /* Range 0x9318 - 0x931A, array index: 0x13A5 */ + 0x3F6E,0x6F21,0x6F23, + /* Range 0x932B - 0x932F, array index: 0x13A8 */ + 0x3C62,0x4F23,INVALC,0x6E7E,0x3A78, + /* Range 0x93AC - 0x93B0, array index: 0x13AD */ + 0x6F2E,0x6F2F,0x4443,INVALC,0x6F2D, + /* Range 0x93D6 - 0x93D8, array index: 0x13B2 */ + 0x6F32,0x6F33,0x6F36, + /* Range 0x9418 - 0x941A, array index: 0x13B5 */ + 0x3E62,0x462A,0x6F3C, + /* Range 0x9451 - 0x9453, array index: 0x13B8 */ + 0x3455,0x6F48,0x4C7A, + /* Range 0x947C - 0x9481, array index: 0x13BB */ + 0x6F55,0x6F53,0x6F56,0x6F58,INVALC,0x6F57, + /* Range 0x9587 - 0x958B, array index: 0x13C1 */ + 0x6F5A,INVALC,0x4A44,0x6F5B,0x332B, + /* Range 0x95A0 - 0x95A8, array index: 0x13C6 */ + 0x6F60,INVALC,0x3458,0x3355,0x395E,0x4836,INVALC,0x6F62, + 0x6F61, + /* Range 0x95D4 - 0x95D8, array index: 0x13CF */ + 0x6F6E,0x6F6D,0x6F6F,INVALC,0x462E, + /* Range 0x964B - 0x9650, array index: 0x13D4 */ + 0x6F7B,0x6F79,0x395F,INVALC,0x6F7A,0x3842, + /* Range 0x965B - 0x9666, array index: 0x13DA */ + 0x4A45,0x6F7D,0x7021,0x6F7E,0x7022,INVALC,INVALC,0x3121, + 0x3F58,0x3D7C,0x3459,0x7023, + /* Range 0x9672 - 0x967A, array index: 0x13E6 */ + 0x7024,0x4444,INVALC,0x4E4D,0x462B,0x6F7C,0x4E26,INVALC, + 0x3831, + /* Range 0x968A - 0x968F, array index: 0x13EF */ + 0x4262,0x6721,INVALC,0x7026,0x332C,0x3F6F, + /* Range 0x9694 - 0x969C, array index: 0x13F5 */ + 0x3356,0x7028,INVALC,0x7029,0x7027,0x3764,INVALC,0x3A5D, + 0x3E63, + /* Range 0x96B0 - 0x96BC, array index: 0x13FE */ + 0x702E,0x702C,0x702D,INVALC,0x702F,INVALC,0x7030,0x4E6C, + 0x7031,0x7032,INVALC,0x4049,0x483B, + /* Range 0x96C0 - 0x96CE, array index: 0x140B */ + 0x3F7D,0x3467,INVALC,INVALC,0x4D3A,0x326D,0x3D38,0x385B, + INVALC,0x7035,INVALC,0x7034,0x3B73,0x7036,0x7033, + /* Range 0x9704 - 0x9713, array index: 0x141A */ + 0x703C,INVALC,0x703D,0x3F4C,0x703E,INVALC,0x4E6E,INVALC, + INVALC,0x7039,0x7040,0x7042,INVALC,0x7041,INVALC,0x703F, + /* Range 0x975E - 0x976D, array index: 0x142A */ + 0x4873,INVALC,0x7051,0x7353,0x4C4C,INVALC,0x7052,INVALC, + 0x7053,INVALC,0x7054,0x3357,INVALC,0x7056,INVALC,0x3F59, + /* Range 0x9784 - 0x9786, array index: 0x143A */ + 0x3373,0x7059,0x705D, + /* Range 0x97F2 - 0x97F6, array index: 0x143D */ + 0x706E,0x323B,INVALC,0x7071,0x7070, + /* Range 0x97FF - 0x9808, array index: 0x1442 */ + 0x3641,INVALC,0x4A47,0x443A,0x3A22,INVALC,0x3960,0x3D67, + INVALC,0x3F5C, + /* Range 0x980F - 0x9813, array index: 0x144C */ + 0x7072,0x4D42,0x3468,0x4852,0x465C, + /* Range 0x9837 - 0x983D, array index: 0x1451 */ + 0x7077,0x7074,INVALC,INVALC,0x4951,0x4D6A,0x7078, + /* Range 0x984B - 0x984F, array index: 0x1458 */ + 0x707B,0x426A,0x335B,0x335C,0x707A, + /* Range 0x986F - 0x9874, array index: 0x145D */ + 0x707D,0x707E,0x7121,INVALC,0x7123,0x7122, + /* Range 0x98EB - 0x98EF, array index: 0x1463 */ + 0x712C,INVALC,0x522C,0x5D3B,0x4853, + /* Range 0x98FC - 0x98FE, array index: 0x1468 */ + 0x3B74,0x4B30,0x3E7E, + /* Range 0x9910 - 0x9914, array index: 0x146B */ + 0x3B41,INVALC,0x712F,0x326E,0x7130, + /* Range 0x991D - 0x9921, array index: 0x1470 */ + 0x7133,0x7134,INVALC,0x7136,0x7132, + /* Range 0x9950 - 0x9952, array index: 0x1475 */ + 0x713E,0x7140,0x7141, + /* Range 0x9996 - 0x9999, array index: 0x1478 */ + 0x3C73,0x7144,0x7145,0x3961, + /* Range 0x99AC - 0x99AE, array index: 0x147C */ + 0x474F,0x7147,0x7148, + /* Range 0x99C4 - 0x99C8, array index: 0x147F */ + 0x424C,0x3158,0x366E,INVALC,0x366F, + /* Range 0x99D0 - 0x99D2, array index: 0x1484 */ + 0x4373,0x714E,0x3670, + /* Range 0x9A69 - 0x9A6B, array index: 0x1487 */ + 0x7169,0x716B,0x716A, + /* Range 0x9AEA - 0x9AF1, array index: 0x148A */ + 0x4831,0x717A,INVALC,0x4926,0x717B,0x7179,INVALC,0x717D, + /* Range 0x9B25 - 0x9B2A, array index: 0x1492 */ + 0x7228,INVALC,0x7229,0x722A,0x722B,0x722C, + /* Range 0x9B2E - 0x9B32, array index: 0x1498 */ + 0x722D,0x722E,INVALC,0x5D35,0x722F, + /* Range 0x9B41 - 0x9B45, array index: 0x149D */ + 0x3321,0x3A32,0x7231,0x7230,0x4C25, + /* Range 0x9B4D - 0x9B51, array index: 0x14A2 */ + 0x7233,0x7234,0x7232,INVALC,0x7235, + /* Range 0x9B91 - 0x9B97, array index: 0x14A7 */ + 0x723A,0x4A2B,0x7238,INVALC,INVALC,0x723B,0x723C, + /* Range 0x9BAA - 0x9BAE, array index: 0x14AE */ + 0x4B6E,0x3B2D,INVALC,0x3A7A,0x412F, + /* Range 0x9BE1 - 0x9BE4, array index: 0x14B3 */ + 0x724C,0x7249,0x7248,0x724A, + /* Range 0x9BF0 - 0x9BF2, array index: 0x14B7 */ + 0x7250,0x724F,0x724E, + /* Range 0x9C06 - 0x9C0D, array index: 0x14BA */ + 0x7256,INVALC,0x7257,0x7253,0x7259,INVALC,0x7255,0x3362, + /* Range 0x9C10 - 0x9C15, array index: 0x14C2 */ + 0x4F4C,INVALC,0x7258,0x7254,0x7252,0x7251, + /* Range 0x9C2D - 0x9C32, array index: 0x14C8 */ + 0x4949,0x725B,0x3073,0x7260,INVALC,0x7262, + /* Range 0x9C39 - 0x9C3B, array index: 0x14CE */ + 0x336F,0x724D,0x3137, + /* Range 0x9C46 - 0x9C48, array index: 0x14D1 */ + 0x7263,0x7261,0x432D, + /* Range 0x9D06 - 0x9D09, array index: 0x14D4 */ + 0x7271,0x463E,0x726E,0x726D, + /* Range 0x9D28 - 0x9D2C, array index: 0x14D8 */ + 0x337B,INVALC,0x7272,0x3C32,0x3229, + /* Range 0x9D5C - 0x9D61, array index: 0x14DD */ + 0x312D,0x7321,0x7322,INVALC,0x3974,0x4C39, + /* Range 0x9DF8 - 0x9DFA, array index: 0x14E3 */ + 0x733B,0x426B,0x3A6D, + /* Range 0x9E91 - 0x9E97, array index: 0x14E6 */ + 0x734C,0x734A,0x4F3C,INVALC,0x734B,INVALC,0x4E6F, + /* Range 0x9EB8 - 0x9EBF, array index: 0x14ED */ + 0x7350,0x396D,0x4C4D,0x4B63,0x5677,INVALC,0x5D60,0x4B7B, + /* Range 0x9ECC - 0x9ED4, array index: 0x14F5 */ + 0x7354,0x3550,0x7355,0x7356,0x7357,INVALC,0x3975,INVALC, + 0x7358, + /* Range 0x9ED8 - 0x9EE0, array index: 0x14FE */ + 0x6054,0x4C5B,INVALC,0x4263,0x7359,0x735B,0x735A,INVALC, + 0x735C, + /* Range 0x9EF9 - 0x9EFD, array index: 0x1507 */ + 0x7363,INVALC,0x7364,0x7365,0x7366, + /* Range 0x9F5F - 0x9F67, array index: 0x150C */ + 0x7372,0x7373,0x7374,0x4E70,0x7371,INVALC,INVALC,0x7375, + 0x7376, + /* Range 0xFF01 - 0xFF5D, array index: 0x1515 */ + 0x212A,INVALC,0x2174,0x2170,0x2173,0x2175,INVALC,0x214A, + 0x214B,0x2176,0x215C,0x2124,INVALC,0x2125,0x213F,0x2330, + 0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337,0x2338, + 0x2339,0x2127,0x2128,0x2163,0x2161,0x2164,0x2129,0x2177, + 0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,0x2348, + 0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350, + 0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358, + 0x2359,0x235A,0x214E,INVALC,0x214F,0x2130,0x2132,0x212E, + 0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367,0x2368, + 0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,0x2370, + 0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378, + 0x2379,0x237A,0x2150,0x2143,0x2151, + /* Unranged codes (489 codes) */ + /* Array index: 0x1572 */ 0x005C,0x2140, + /* Array index: 0x1572 */ 0x00A2,0x2171, + /* Array index: 0x1572 */ 0x00A3,0x2172, + /* Array index: 0x1572 */ 0x00A7,0x2178, + /* Array index: 0x1572 */ 0x00A8,0x212F, + /* Array index: 0x1572 */ 0x00AC,0x224C, + /* Array index: 0x1572 */ 0x00B0,0x216B, + /* Array index: 0x1572 */ 0x00B1,0x215E, + /* Array index: 0x1572 */ 0x00B4,0x212D, + /* Array index: 0x1572 */ 0x00B6,0x2279, + /* Array index: 0x1572 */ 0x00D7,0x215F, + /* Array index: 0x1572 */ 0x00F7,0x2160, + /* Array index: 0x1572 */ 0x0401,0x2727, + /* Array index: 0x1572 */ 0x2010,0x213E, + /* Array index: 0x1572 */ 0x2025,0x2145, + /* Array index: 0x1572 */ 0x2026,0x2144, + /* Array index: 0x1572 */ 0x2030,0x2273, + /* Array index: 0x1572 */ 0x2032,0x216C, + /* Array index: 0x1572 */ 0x2033,0x216D, + /* Array index: 0x1572 */ 0x203B,0x2228, + /* Array index: 0x1572 */ 0x2103,0x216E, + /* Array index: 0x1572 */ 0x212B,0x2272, + /* Array index: 0x1572 */ 0x21D2,0x224D, + /* Array index: 0x1572 */ 0x21D4,0x224E, + /* Array index: 0x1572 */ 0x2200,0x224F, + /* Array index: 0x1572 */ 0x2202,0x225F, + /* Array index: 0x1572 */ 0x2203,0x2250, + /* Array index: 0x1572 */ 0x2207,0x2260, + /* Array index: 0x1572 */ 0x2208,0x223A, + /* Array index: 0x1572 */ 0x220B,0x223B, + /* Array index: 0x1572 */ 0x2212,0x215D, + /* Array index: 0x1572 */ 0x221A,0x2265, + /* Array index: 0x1572 */ 0x221D,0x2267, + /* Array index: 0x1572 */ 0x221E,0x2167, + /* Array index: 0x1572 */ 0x2220,0x225C, + /* Array index: 0x1572 */ 0x2234,0x2168, + /* Array index: 0x1572 */ 0x2235,0x2268, + /* Array index: 0x1572 */ 0x223D,0x2266, + /* Array index: 0x1572 */ 0x2252,0x2262, + /* Array index: 0x1572 */ 0x2260,0x2162, + /* Array index: 0x1572 */ 0x2261,0x2261, + /* Array index: 0x1572 */ 0x2266,0x2165, + /* Array index: 0x1572 */ 0x2267,0x2166, + /* Array index: 0x1572 */ 0x226A,0x2263, + /* Array index: 0x1572 */ 0x226B,0x2264, + /* Array index: 0x1572 */ 0x2282,0x223E, + /* Array index: 0x1572 */ 0x2283,0x223F, + /* Array index: 0x1572 */ 0x2286,0x223C, + /* Array index: 0x1572 */ 0x2287,0x223D, + /* Array index: 0x1572 */ 0x22A5,0x225D, + /* Array index: 0x1572 */ 0x2312,0x225E, + /* Array index: 0x1572 */ 0x250C,0x2823, + /* Array index: 0x1572 */ 0x250F,0x282E, + /* Array index: 0x1572 */ 0x2510,0x2824, + /* Array index: 0x1572 */ 0x2513,0x282F, + /* Array index: 0x1572 */ 0x2514,0x2826, + /* Array index: 0x1572 */ 0x2520,0x2837, + /* Array index: 0x1572 */ 0x2528,0x2839, + /* Array index: 0x1572 */ 0x252B,0x2834, + /* Array index: 0x1572 */ 0x252C,0x2828, + /* Array index: 0x1572 */ 0x252F,0x2838, + /* Array index: 0x1572 */ 0x2530,0x283D, + /* Array index: 0x1572 */ 0x2533,0x2833, + /* Array index: 0x1572 */ 0x2534,0x282A, + /* Array index: 0x1572 */ 0x2537,0x283A, + /* Array index: 0x1572 */ 0x2538,0x283F, + /* Array index: 0x1572 */ 0x253B,0x2835, + /* Array index: 0x1572 */ 0x253C,0x282B, + /* Array index: 0x1572 */ 0x253F,0x283B, + /* Array index: 0x1572 */ 0x2542,0x2840, + /* Array index: 0x1572 */ 0x254B,0x2836, + /* Array index: 0x1572 */ 0x25A0,0x2223, + /* Array index: 0x1572 */ 0x25A1,0x2222, + /* Array index: 0x1572 */ 0x25B2,0x2225, + /* Array index: 0x1572 */ 0x25B3,0x2224, + /* Array index: 0x1572 */ 0x25BC,0x2227, + /* Array index: 0x1572 */ 0x25BD,0x2226, + /* Array index: 0x1572 */ 0x25C6,0x2221, + /* Array index: 0x1572 */ 0x25C7,0x217E, + /* Array index: 0x1572 */ 0x25CB,0x217B, + /* Array index: 0x1572 */ 0x25CE,0x217D, + /* Array index: 0x1572 */ 0x25CF,0x217C, + /* Array index: 0x1572 */ 0x25EF,0x227E, + /* Array index: 0x1572 */ 0x2605,0x217A, + /* Array index: 0x1572 */ 0x2606,0x2179, + /* Array index: 0x1572 */ 0x2640,0x216A, + /* Array index: 0x1572 */ 0x2642,0x2169, + /* Array index: 0x1572 */ 0x266A,0x2276, + /* Array index: 0x1572 */ 0x266D,0x2275, + /* Array index: 0x1572 */ 0x266F,0x2274, + /* Array index: 0x1572 */ 0x301C,0x2141, + /* Array index: 0x1572 */ 0x4E00,0x306C, + /* Array index: 0x1572 */ 0x4E01,0x437A, + /* Array index: 0x1572 */ 0x4E03,0x3C37, + /* Array index: 0x1572 */ 0x4E1E,0x3E67, + /* Array index: 0x1572 */ 0x4E21,0x4E3E, + /* Array index: 0x1572 */ 0x4E26,0x4A42, + /* Array index: 0x1572 */ 0x4E2A,0x5024, + /* Array index: 0x1572 */ 0x4E2D,0x4366, + /* Array index: 0x1572 */ 0x4E31,0x5025, + /* Array index: 0x1572 */ 0x4E32,0x367A, + /* Array index: 0x1572 */ 0x4E36,0x5026, + /* Array index: 0x1572 */ 0x4E3F,0x5028, + /* Array index: 0x1572 */ 0x4E42,0x5029, + /* Array index: 0x1572 */ 0x4E43,0x4735, + /* Array index: 0x1572 */ 0x4E45,0x3557, + /* Array index: 0x1572 */ 0x4E62,0x5626, + /* Array index: 0x1572 */ 0x4E71,0x4D70, + /* Array index: 0x1572 */ 0x4E73,0x467D, + /* Array index: 0x1572 */ 0x4E7E,0x3425, + /* Array index: 0x1572 */ 0x4E80,0x3535, + /* Array index: 0x1572 */ 0x4E82,0x502C, + /* Array index: 0x1572 */ 0x4EB3,0x5038, + /* Array index: 0x1572 */ 0x4EB6,0x5039, + /* Array index: 0x1572 */ 0x4EBA,0x3F4D, + /* Array index: 0x1572 */ 0x4EED,0x5041, + /* Array index: 0x1572 */ 0x4EEE,0x323E, + /* Array index: 0x1572 */ 0x4EF0,0x3644, + /* Array index: 0x1572 */ 0x4EF2,0x4367, + /* Array index: 0x1572 */ 0x4EF6,0x376F, + /* Array index: 0x1572 */ 0x4EF7,0x5043, + /* Array index: 0x1572 */ 0x4EFB,0x4724, + /* Array index: 0x1572 */ 0x4F01,0x346B, + /* Array index: 0x1572 */ 0x4F1A,0x3271, + /* Array index: 0x1572 */ 0x4F1C,0x5067, + /* Array index: 0x1572 */ 0x4F1D,0x4541, + /* Array index: 0x1572 */ 0x4F2F,0x476C, + /* Array index: 0x1572 */ 0x4F30,0x5046, + /* Array index: 0x1572 */ 0x4F34,0x483C, + /* Array index: 0x1572 */ 0x4F36,0x4E62, + /* Array index: 0x1572 */ 0x4F38,0x3F2D, + /* Array index: 0x1572 */ 0x4F3A,0x3B47, + /* Array index: 0x1572 */ 0x4F3C,0x3B77, + /* Array index: 0x1572 */ 0x4F3D,0x3240, + /* Array index: 0x1572 */ 0x4F43,0x4451, + /* Array index: 0x1572 */ 0x4F46,0x4322, + /* Array index: 0x1572 */ 0x4F47,0x504A, + /* Array index: 0x1572 */ 0x4F69,0x5050, + /* Array index: 0x1572 */ 0x4F6F,0x5053, + /* Array index: 0x1572 */ 0x4F70,0x5051, + /* Array index: 0x1572 */ 0x4F73,0x3242, + /* Array index: 0x1572 */ 0x4F75,0x4A3B, + /* Array index: 0x1572 */ 0x4F76,0x504B, + /* Array index: 0x1572 */ 0x4F7B,0x504F, + /* Array index: 0x1572 */ 0x4F7C,0x3873, + /* Array index: 0x1572 */ 0x4F7F,0x3B48, + /* Array index: 0x1572 */ 0x4F83,0x3426, + /* Array index: 0x1572 */ 0x4F86,0x5054, + /* Array index: 0x1572 */ 0x4F88,0x504C, + /* Array index: 0x1572 */ 0x4F8B,0x4E63, + /* Array index: 0x1572 */ 0x4F8D,0x3B78, + /* Array index: 0x1572 */ 0x4F8F,0x504D, + /* Array index: 0x1572 */ 0x4F91,0x5052, + /* Array index: 0x1572 */ 0x4F96,0x5055, + /* Array index: 0x1572 */ 0x4F98,0x504E, + /* Array index: 0x1572 */ 0x4F9B,0x3621, + /* Array index: 0x1572 */ 0x4F9D,0x304D, + /* Array index: 0x1572 */ 0x4FA0,0x3622, + /* Array index: 0x1572 */ 0x4FA1,0x3241, + /* Array index: 0x1572 */ 0x4FB5,0x3F2F, + /* Array index: 0x1572 */ 0x4FB6,0x4E37, + /* Array index: 0x1572 */ 0x4FBF,0x4A58, + /* Array index: 0x1572 */ 0x4FCA,0x3D53, + /* Array index: 0x1572 */ 0x4FCE,0x5059, + /* Array index: 0x1572 */ 0x4FD0,0x505E, + /* Array index: 0x1572 */ 0x4FD1,0x505C, + /* Array index: 0x1572 */ 0x4FD4,0x5057, + /* Array index: 0x1572 */ 0x4FEE,0x3D24, + /* Array index: 0x1572 */ 0x4FEF,0x506D, + /* Array index: 0x1572 */ 0x4FF3,0x4750, + /* Array index: 0x1572 */ 0x4FF5,0x4936, + /* Array index: 0x1572 */ 0x4FF6,0x5068, + /* Array index: 0x1572 */ 0x4FF8,0x4A70, + /* Array index: 0x1572 */ 0x4FFA,0x3236, + /* Array index: 0x1572 */ 0x4FFE,0x506C, + /* Array index: 0x1572 */ 0x5005,0x5066, + /* Array index: 0x1572 */ 0x5006,0x506F, + /* Array index: 0x1572 */ 0x5009,0x4152, + /* Array index: 0x1572 */ 0x500B,0x3844, + /* Array index: 0x1572 */ 0x500D,0x475C, + /* Array index: 0x1572 */ 0x500F,0x6047, + /* Array index: 0x1572 */ 0x5011,0x506E, + /* Array index: 0x1572 */ 0x5012,0x455D, + /* Array index: 0x1572 */ 0x5014,0x5063, + /* Array index: 0x1572 */ 0x5016,0x3876, + /* Array index: 0x1572 */ 0x5019,0x3875, + /* Array index: 0x1572 */ 0x501A,0x5061, + /* Array index: 0x1572 */ 0x501F,0x3C5A, + /* Array index: 0x1572 */ 0x5036,0x3666, + /* Array index: 0x1572 */ 0x5039,0x3770, + /* Array index: 0x1572 */ 0x5043,0x5070, + /* Array index: 0x1572 */ 0x504F,0x4A50, + /* Array index: 0x1572 */ 0x5050,0x5074, + /* Array index: 0x1572 */ 0x5055,0x5073, + /* Array index: 0x1572 */ 0x5056,0x5077, + /* Array index: 0x1572 */ 0x505A,0x5076, + /* Array index: 0x1572 */ 0x505C,0x4464, + /* Array index: 0x1572 */ 0x5065,0x3772, + /* Array index: 0x1572 */ 0x506C,0x5078, + /* Array index: 0x1572 */ 0x507D,0x3536, + /* Array index: 0x1572 */ 0x5080,0x507A, + /* Array index: 0x1572 */ 0x5085,0x507C, + /* Array index: 0x1572 */ 0x508D,0x4B35, + /* Array index: 0x1572 */ 0x5091,0x3766, + /* Array index: 0x1572 */ 0x50AC,0x3A45, + /* Array index: 0x1572 */ 0x50AD,0x4D43, + /* Array index: 0x1572 */ 0x50BE,0x3739, + /* Array index: 0x1572 */ 0x50C2,0x5124, + /* Array index: 0x1572 */ 0x50C5,0x364F, + /* Array index: 0x1572 */ 0x50C9,0x5121, + /* Array index: 0x1572 */ 0x50CA,0x5122, + /* Array index: 0x1572 */ 0x50CD,0x462F, + /* Array index: 0x1572 */ 0x50CF,0x417C, + /* Array index: 0x1572 */ 0x50D1,0x3623, + /* Array index: 0x1572 */ 0x50D5,0x4B4D, + /* Array index: 0x1572 */ 0x50D6,0x5125, + /* Array index: 0x1572 */ 0x50DA,0x4E3D, + /* Array index: 0x1572 */ 0x50DE,0x5126, + /* Array index: 0x1572 */ 0x50E3,0x5129, + /* Array index: 0x1572 */ 0x50E5,0x5127, + /* Array index: 0x1572 */ 0x50E7,0x414E, + /* Array index: 0x1572 */ 0x50ED,0x5128, + /* Array index: 0x1572 */ 0x50EE,0x512A, + /* Array index: 0x1572 */ 0x50F5,0x512C, + /* Array index: 0x1572 */ 0x50F9,0x512B, + /* Array index: 0x1572 */ 0x50FB,0x4A48, + /* Array index: 0x1572 */ 0x5109,0x512D, + /* Array index: 0x1572 */ 0x511F,0x3D7E, + /* Array index: 0x1572 */ 0x5121,0x5134, + /* Array index: 0x1572 */ 0x512A,0x4D25, + /* Array index: 0x1572 */ 0x5132,0x4C59, + /* Array index: 0x1572 */ 0x5137,0x5136, + /* Array index: 0x1572 */ 0x515A,0x455E, + /* Array index: 0x1572 */ 0x515C,0x3375, + /* Array index: 0x1572 */ 0x5162,0x513E, + /* Array index: 0x1572 */ 0x5165,0x467E, + /* Array index: 0x1572 */ 0x5171,0x3626, + /* Array index: 0x1572 */ 0x517C,0x3773, + /* Array index: 0x1572 */ 0x5180,0x5143, + /* Array index: 0x1572 */ 0x5182,0x5144, + /* Array index: 0x1572 */ 0x5185,0x4662, + /* Array index: 0x1572 */ 0x5186,0x315F, + /* Array index: 0x1572 */ 0x51A0,0x3427, + /* Array index: 0x1572 */ 0x51BD,0x5158, + /* Array index: 0x1572 */ 0x51D6,0x5245, + /* Array index: 0x1572 */ 0x51ED,0x515F, + /* Array index: 0x1572 */ 0x51F0,0x5160, + /* Array index: 0x1572 */ 0x51F1,0x332E, + /* Array index: 0x1572 */ 0x520E,0x5166, + /* Array index: 0x1572 */ 0x5211,0x373A, + /* Array index: 0x1572 */ 0x5214,0x5165, + /* Array index: 0x1572 */ 0x5217,0x4E73, + /* Array index: 0x1572 */ 0x521D,0x3D69, + /* Array index: 0x1572 */ 0x5224,0x483D, + /* Array index: 0x1572 */ 0x5225,0x4A4C, + /* Array index: 0x1572 */ 0x5227,0x5167, + /* Array index: 0x1572 */ 0x5229,0x4D78, + /* Array index: 0x1572 */ 0x522A,0x5168, + /* Array index: 0x1572 */ 0x522E,0x5169, + /* Array index: 0x1572 */ 0x5230,0x457E, + /* Array index: 0x1572 */ 0x5233,0x516A, + /* Array index: 0x1572 */ 0x5243,0x4466, + /* Array index: 0x1572 */ 0x5244,0x516D, + /* Array index: 0x1572 */ 0x5247,0x4227, + /* Array index: 0x1572 */ 0x5254,0x5171, + /* Array index: 0x1572 */ 0x5256,0x4B36, + /* Array index: 0x1572 */ 0x525B,0x3964, + /* Array index: 0x1572 */ 0x525E,0x5170, + /* Array index: 0x1572 */ 0x5269,0x5174, + /* Array index: 0x1572 */ 0x526A,0x5172, + /* Array index: 0x1572 */ 0x527D,0x5177, + /* Array index: 0x1572 */ 0x527F,0x5176, + /* Array index: 0x1572 */ 0x5283,0x3344, + /* Array index: 0x1572 */ 0x528D,0x5178, + /* Array index: 0x1572 */ 0x5291,0x517D, + /* Array index: 0x1572 */ 0x5292,0x517A, + /* Array index: 0x1572 */ 0x5294,0x5179, + /* Array index: 0x1572 */ 0x529B,0x4E4F, + /* Array index: 0x1572 */ 0x529F,0x3879, + /* Array index: 0x1572 */ 0x52A0,0x3243, + /* Array index: 0x1572 */ 0x52A3,0x4E74, + /* Array index: 0x1572 */ 0x52B1,0x4E65, + /* Array index: 0x1572 */ 0x52B4,0x4F2B, + /* Array index: 0x1572 */ 0x52B5,0x5225, + /* Array index: 0x1572 */ 0x52B9,0x387A, + /* Array index: 0x1572 */ 0x52BC,0x5224, + /* Array index: 0x1572 */ 0x52BE,0x332F, + /* Array index: 0x1572 */ 0x52C1,0x5226, + /* Array index: 0x1572 */ 0x52C3,0x4B56, + /* Array index: 0x1572 */ 0x52C5,0x443C, + /* Array index: 0x1572 */ 0x52C7,0x4D26, + /* Array index: 0x1572 */ 0x52C9,0x4A59, + /* Array index: 0x1572 */ 0x52CD,0x5227, + /* Array index: 0x1572 */ 0x52D2,0x7055, + /* Array index: 0x1572 */ 0x52F2,0x372E, + /* Array index: 0x1572 */ 0x52F3,0x522E, + /* Array index: 0x1572 */ 0x52F5,0x522F, + /* Array index: 0x1572 */ 0x530D,0x5235, + /* Array index: 0x1572 */ 0x530F,0x5237, + /* Array index: 0x1572 */ 0x5310,0x5236, + /* Array index: 0x1572 */ 0x531D,0x4159, + /* Array index: 0x1572 */ 0x5320,0x3E22, + /* Array index: 0x1572 */ 0x5321,0x3629, + /* Array index: 0x1572 */ 0x5323,0x523A, + /* Array index: 0x1572 */ 0x532A,0x485B, + /* Array index: 0x1572 */ 0x532F,0x523B, + /* Array index: 0x1572 */ 0x5331,0x523C, + /* Array index: 0x1572 */ 0x5333,0x523D, + /* Array index: 0x1572 */ 0x534D,0x5244, + /* Array index: 0x1572 */ 0x5366,0x3735, + /* Array index: 0x1572 */ 0x5369,0x5247, + /* Array index: 0x1572 */ 0x537B,0x524A, + /* Array index: 0x1572 */ 0x537F,0x362A, + /* Array index: 0x1572 */ 0x5382,0x524C, + /* Array index: 0x1572 */ 0x5384,0x4C71, + /* Array index: 0x1572 */ 0x5396,0x524D, + /* Array index: 0x1572 */ 0x5398,0x4E52, + /* Array index: 0x1572 */ 0x539A,0x387C, + /* Array index: 0x1572 */ 0x539F,0x3836, + /* Array index: 0x1572 */ 0x53A0,0x524E, + /* Array index: 0x1572 */ 0x53AD,0x315E, + /* Array index: 0x1572 */ 0x53AE,0x5251, + /* Array index: 0x1572 */ 0x53B0,0x5252, + /* Array index: 0x1572 */ 0x53B3,0x3837, + /* Array index: 0x1572 */ 0x53B6,0x5253, + /* Array index: 0x1572 */ 0x53BB,0x356E, + /* Array index: 0x1572 */ 0x53C2,0x3B32, + /* Array index: 0x1572 */ 0x53C3,0x5254, + /* Array index: 0x1572 */ 0x53D4,0x3D47, + /* Array index: 0x1572 */ 0x53D6,0x3C68, + /* Array index: 0x1572 */ 0x53D7,0x3C75, + /* Array index: 0x1572 */ 0x53D9,0x3D76, + /* Array index: 0x1572 */ 0x53DB,0x4840, + /* Array index: 0x1572 */ 0x5401,0x525E, + /* Array index: 0x1572 */ 0x5403,0x3549, + /* Array index: 0x1572 */ 0x5404,0x3346, + /* Array index: 0x1572 */ 0x541B,0x372F, + /* Array index: 0x1572 */ 0x541D,0x5267, + /* Array index: 0x1572 */ 0x541F,0x3663, + /* Array index: 0x1572 */ 0x5420,0x4B4A, + /* Array index: 0x1572 */ 0x5426,0x485D, + /* Array index: 0x1572 */ 0x5436,0x5265, + /* Array index: 0x1572 */ 0x544E,0x5268, + /* Array index: 0x1572 */ 0x5451,0x465D, + /* Array index: 0x1572 */ 0x545F,0x526C, + /* Array index: 0x1572 */ 0x5468,0x3C7E, + /* Array index: 0x1572 */ 0x546A,0x3C76, + /* Array index: 0x1572 */ 0x5470,0x526F, + /* Array index: 0x1572 */ 0x5471,0x526D, + /* Array index: 0x1572 */ 0x5480,0x5272, + /* Array index: 0x1572 */ 0x5484,0x5274, + /* Array index: 0x1572 */ 0x5486,0x5276, + /* Array index: 0x1572 */ 0x54A2,0x5278, + /* Array index: 0x1572 */ 0x54A4,0x5323, + /* Array index: 0x1572 */ 0x54A5,0x527A, + /* Array index: 0x1572 */ 0x54A8,0x527E, + /* Array index: 0x1572 */ 0x54AB,0x5321, + /* Array index: 0x1572 */ 0x54AC,0x527B, + /* Array index: 0x1572 */ 0x54AF,0x533E, + /* Array index: 0x1572 */ 0x54B2,0x3A69, + /* Array index: 0x1572 */ 0x54B3,0x3331, + /* Array index: 0x1572 */ 0x54B8,0x5279, + /* Array index: 0x1572 */ 0x54D8,0x5326, + /* Array index: 0x1572 */ 0x54E1,0x3077, + /* Array index: 0x1572 */ 0x54E2,0x532F, + /* Array index: 0x1572 */ 0x54ED,0x532D, + /* Array index: 0x1572 */ 0x54EE,0x532C, + /* Array index: 0x1572 */ 0x54F2,0x452F, + /* Array index: 0x1572 */ 0x54FA,0x532E, + /* Array index: 0x1572 */ 0x54FD,0x532B, + /* Array index: 0x1572 */ 0x5504,0x3134, + /* Array index: 0x1572 */ 0x5506,0x3A36, + /* Array index: 0x1572 */ 0x5507,0x3F30, + /* Array index: 0x1572 */ 0x550F,0x5329, + /* Array index: 0x1572 */ 0x5510,0x4562, + /* Array index: 0x1572 */ 0x5514,0x532A, + /* Array index: 0x1572 */ 0x5516,0x3022, + /* Array index: 0x1572 */ 0x552E,0x5334, + /* Array index: 0x1572 */ 0x552F,0x4D23, + /* Array index: 0x1572 */ 0x5531,0x3E27, + /* Array index: 0x1572 */ 0x5533,0x533A, + /* Array index: 0x1572 */ 0x5538,0x5339, + /* Array index: 0x1572 */ 0x5539,0x5330, + /* Array index: 0x1572 */ 0x553E,0x4243, + /* Array index: 0x1572 */ 0x5540,0x5331, + /* Array index: 0x1572 */ 0x554C,0x5333, + /* Array index: 0x1572 */ 0x554F,0x4C64, + /* Array index: 0x1572 */ 0x5553,0x373C, + /* Array index: 0x1572 */ 0x5556,0x5337, + /* Array index: 0x1572 */ 0x5557,0x5338, + /* Array index: 0x1572 */ 0x555C,0x5335, + /* Array index: 0x1572 */ 0x555D,0x533B, + /* Array index: 0x1572 */ 0x5563,0x5332, + /* Array index: 0x1572 */ 0x557B,0x5341, + /* Array index: 0x1572 */ 0x557C,0x5346, + /* Array index: 0x1572 */ 0x557E,0x5342, + /* Array index: 0x1572 */ 0x5580,0x533D, + /* Array index: 0x1572 */ 0x5583,0x5347, + /* Array index: 0x1572 */ 0x5584,0x4131, + /* Array index: 0x1572 */ 0x55B6,0x3144, + /* Array index: 0x1572 */ 0x55C4,0x534E, + /* Array index: 0x1572 */ 0x55C5,0x534C, + /* Array index: 0x1572 */ 0x55C7,0x5427, + /* Array index: 0x1572 */ 0x55D4,0x5351, + /* Array index: 0x1572 */ 0x55DA,0x534B, + /* Array index: 0x1572 */ 0x55DC,0x534F, + /* Array index: 0x1572 */ 0x55DF,0x534D, + /* Array index: 0x1572 */ 0x55E3,0x3B4C, + /* Array index: 0x1572 */ 0x55E4,0x5350, + /* Array index: 0x1572 */ 0x55F7,0x5353, + /* Array index: 0x1572 */ 0x55F9,0x5358, + /* Array index: 0x1572 */ 0x55FD,0x5356, + /* Array index: 0x1572 */ 0x55FE,0x5355, + /* Array index: 0x1572 */ 0x5606,0x4332, + /* Array index: 0x1572 */ 0x5609,0x3245, + /* Array index: 0x1572 */ 0x561B,0x5357, + /* Array index: 0x1572 */ 0x5629,0x325E, + /* Array index: 0x1572 */ 0x562F,0x5362, + /* Array index: 0x1572 */ 0x5631,0x3E7C, + /* Array index: 0x1572 */ 0x5632,0x535E, + /* Array index: 0x1572 */ 0x5634,0x535C, + /* Array index: 0x1572 */ 0x5636,0x535D, + /* Array index: 0x1572 */ 0x5638,0x535F, + /* Array index: 0x1572 */ 0x5642,0x313D, + /* Array index: 0x1572 */ 0x564C,0x4139, + /* Array index: 0x1572 */ 0x564E,0x5359, + /* Array index: 0x1572 */ 0x5650,0x535A, + /* Array index: 0x1572 */ 0x565B,0x337A, + /* Array index: 0x1572 */ 0x5664,0x5361, + /* Array index: 0x1572 */ 0x5674,0x4A2E, + /* Array index: 0x1572 */ 0x5678,0x4655, + /* Array index: 0x1572 */ 0x567A,0x4838, + /* Array index: 0x1572 */ 0x5680,0x5366, + /* Array index: 0x1572 */ 0x5686,0x5365, + /* Array index: 0x1572 */ 0x5687,0x3345, + /* Array index: 0x1572 */ 0x568A,0x5367, + /* Array index: 0x1572 */ 0x568F,0x536A, + /* Array index: 0x1572 */ 0x5694,0x5369, + /* Array index: 0x1572 */ 0x56A0,0x5368, + /* Array index: 0x1572 */ 0x56A2,0x4739, + /* Array index: 0x1572 */ 0x56A5,0x536B, + /* Array index: 0x1572 */ 0x56AE,0x536C, + /* Array index: 0x1572 */ 0x56B4,0x536E, + /* Array index: 0x1572 */ 0x56B6,0x536D, + /* Array index: 0x1572 */ 0x56BC,0x5370, + /* Array index: 0x1572 */ 0x56C8,0x5374, + /* Array index: 0x1572 */ 0x56CE,0x5375, + /* Array index: 0x1572 */ 0x56D1,0x5376, + /* Array index: 0x1572 */ 0x56D3,0x5377, + /* Array index: 0x1572 */ 0x56DE,0x3273, + /* Array index: 0x1572 */ 0x56E0,0x3078, + /* Array index: 0x1572 */ 0x56E3,0x4344, + /* Array index: 0x1572 */ 0x56EE,0x5379, + /* Array index: 0x1572 */ 0x56F0,0x3A24, + /* Array index: 0x1572 */ 0x56F2,0x304F, + /* Array index: 0x1572 */ 0x56F3,0x3F5E, + /* Array index: 0x1572 */ 0x56F9,0x537A, + /* Array index: 0x1572 */ 0x56FA,0x3847, + /* Array index: 0x1572 */ 0x56FD,0x3971, + /* Array index: 0x1572 */ 0x56FF,0x537C, + /* Array index: 0x1572 */ 0x5700,0x537B, + /* Array index: 0x1572 */ 0x5703,0x4A60, + /* Array index: 0x1572 */ 0x5704,0x537D, + /* Array index: 0x1572 */ 0x5708,0x5421, + /* Array index: 0x1572 */ 0x5709,0x537E, + /* Array index: 0x1572 */ 0x570B,0x5422, + /* Array index: 0x1572 */ 0x570D,0x5423, + /* Array index: 0x1572 */ 0x570F,0x3777, + /* Array index: 0x1572 */ 0x5712,0x3160, + /* Array index: 0x1572 */ 0x5713,0x5424, + /* Array index: 0x1572 */ 0x5716,0x5426, + /* Array index: 0x1572 */ 0x5718,0x5425, + /* Array index: 0x1572 */ 0x571C,0x5428, + /* Array index: 0x1572 */ 0x571F,0x455A, + /* Array index: 0x1572 */ 0x572D,0x373D, + /* Array index: 0x1572 */ 0x5730,0x434F, + /* Array index: 0x1572 */ 0x5737,0x542A, + /* Array index: 0x1572 */ 0x5738,0x542B, + /* Array index: 0x1572 */ 0x573B,0x542D, + /* Array index: 0x1572 */ 0x5740,0x542E, + /* Array index: 0x1572 */ 0x5742,0x3A64, + /* Array index: 0x1572 */ 0x5747,0x3651, + /* Array index: 0x1572 */ 0x574A,0x4B37, + /* Array index: 0x1572 */ 0x5761,0x5433, + /* Array index: 0x1572 */ 0x5764,0x3A25, + /* Array index: 0x1572 */ 0x5766,0x4333, + /* Array index: 0x1572 */ 0x5769,0x5430, + /* Array index: 0x1572 */ 0x576A,0x445A, + /* Array index: 0x1572 */ 0x577F,0x5434, + /* Array index: 0x1572 */ 0x5782,0x3F62, + /* Array index: 0x1572 */ 0x5788,0x5432, + /* Array index: 0x1572 */ 0x5789,0x5435, + /* Array index: 0x1572 */ 0x578B,0x373F, + /* Array index: 0x1572 */ 0x5793,0x5436, + /* Array index: 0x1572 */ 0x57AA,0x543A, + /* Array index: 0x1572 */ 0x57B0,0x543B, + /* Array index: 0x1572 */ 0x57B3,0x5438, + /* Array index: 0x1572 */ 0x57C0,0x5431, + /* Array index: 0x1572 */ 0x57C3,0x543C, + /* Array index: 0x1572 */ 0x57C6,0x543D, + /* Array index: 0x1572 */ 0x57CB,0x4B64, + /* Array index: 0x1572 */ 0x57CE,0x3E6B, + /* Array index: 0x1572 */ 0x57DC,0x4738, + /* Array index: 0x1572 */ 0x57DF,0x3068, + /* Array index: 0x1572 */ 0x57E0,0x4956, + /* Array index: 0x1572 */ 0x57E3,0x5443, + /* Array index: 0x1572 */ 0x57F4,0x3E7D, + /* Array index: 0x1572 */ 0x57F7,0x3C39, + /* Array index: 0x1572 */ 0x57F9,0x475D, + /* Array index: 0x1572 */ 0x57FA,0x3470, + /* Array index: 0x1572 */ 0x57FC,0x3A6B, + /* Array index: 0x1572 */ 0x5800,0x4B59, + /* Array index: 0x1572 */ 0x5802,0x4632, + /* Array index: 0x1572 */ 0x5805,0x3778, + /* Array index: 0x1572 */ 0x5806,0x424F, + /* Array index: 0x1572 */ 0x580A,0x5441, + /* Array index: 0x1572 */ 0x580B,0x5444, + /* Array index: 0x1572 */ 0x5815,0x4244, + /* Array index: 0x1572 */ 0x5819,0x5445, + /* Array index: 0x1572 */ 0x581D,0x5446, + /* Array index: 0x1572 */ 0x5821,0x5448, + /* Array index: 0x1572 */ 0x5824,0x4469, + /* Array index: 0x1572 */ 0x582A,0x342E, + /* Array index: 0x1572 */ 0x583A,0x3A66, + /* Array index: 0x1572 */ 0x583D,0x544E, + /* Array index: 0x1572 */ 0x5840,0x4A3D, + /* Array index: 0x1572 */ 0x5841,0x4E5D, + /* Array index: 0x1572 */ 0x584A,0x3274, + /* Array index: 0x1572 */ 0x584B,0x544A, + /* Array index: 0x1572 */ 0x5851,0x413A, + /* Array index: 0x1572 */ 0x5852,0x544D, + /* Array index: 0x1572 */ 0x5854,0x4563, + /* Array index: 0x1572 */ 0x585E,0x3A49, + /* Array index: 0x1572 */ 0x5862,0x5449, + /* Array index: 0x1572 */ 0x5869,0x3176, + /* Array index: 0x1572 */ 0x586B,0x4536, + /* Array index: 0x1572 */ 0x5870,0x544B, + /* Array index: 0x1572 */ 0x5872,0x5447, + /* Array index: 0x1572 */ 0x5875,0x3F50, + /* Array index: 0x1572 */ 0x5879,0x544F, + /* Array index: 0x1572 */ 0x587E,0x3D4E, + /* Array index: 0x1572 */ 0x5883,0x362D, + /* Array index: 0x1572 */ 0x5885,0x5450, + /* Array index: 0x1572 */ 0x5893,0x4A68, + /* Array index: 0x1572 */ 0x5897,0x417D, + /* Array index: 0x1572 */ 0x589C,0x4446, + /* Array index: 0x1572 */ 0x589F,0x5452, + /* Array index: 0x1572 */ 0x58A8,0x4B4F, + /* Array index: 0x1572 */ 0x58AB,0x5453, + /* Array index: 0x1572 */ 0x58AE,0x5458, + /* Array index: 0x1572 */ 0x58B3,0x4A2F, + /* Array index: 0x1572 */ 0x58BE,0x3A26, + /* Array index: 0x1572 */ 0x58C1,0x4A49, + /* Array index: 0x1572 */ 0x58C5,0x5459, + /* Array index: 0x1572 */ 0x58C7,0x4345, + /* Array index: 0x1572 */ 0x58CA,0x3275, + /* Array index: 0x1572 */ 0x58CC,0x3E6D, + /* Array index: 0x1572 */ 0x58D1,0x545B, + /* Array index: 0x1572 */ 0x58D3,0x545A, + /* Array index: 0x1572 */ 0x58DC,0x5460, + /* Array index: 0x1572 */ 0x58DE,0x5455, + /* Array index: 0x1572 */ 0x58DF,0x5462, + /* Array index: 0x1572 */ 0x58E4,0x5461, + /* Array index: 0x1572 */ 0x58E5,0x545F, + /* Array index: 0x1572 */ 0x5902,0x5469, + /* Array index: 0x1572 */ 0x5909,0x4A51, + /* Array index: 0x1572 */ 0x590A,0x546A, + /* Array index: 0x1572 */ 0x590F,0x3246, + /* Array index: 0x1572 */ 0x5910,0x546B, + /* Array index: 0x1572 */ 0x5922,0x4C34, + /* Array index: 0x1572 */ 0x5925,0x546E, + /* Array index: 0x1572 */ 0x5937,0x3050, + /* Array index: 0x1572 */ 0x5938,0x5472, + /* Array index: 0x1572 */ 0x593E,0x5473, + /* Array index: 0x1572 */ 0x5944,0x3162, + /* Array index: 0x1572 */ 0x5960,0x547B, + /* Array index: 0x1572 */ 0x5962,0x547A, + /* Array index: 0x1572 */ 0x5973,0x3D77, + /* Array index: 0x1572 */ 0x5974,0x455B, + /* Array index: 0x1572 */ 0x5978,0x5521, + /* Array index: 0x1572 */ 0x597D,0x3925, + /* Array index: 0x1572 */ 0x598A,0x4725, + /* Array index: 0x1572 */ 0x598D,0x552B, + /* Array index: 0x1572 */ 0x5993,0x3538, + /* Array index: 0x1572 */ 0x5996,0x4D45, + /* Array index: 0x1572 */ 0x5999,0x4C2F, + /* Array index: 0x1572 */ 0x599B,0x562C, + /* Array index: 0x1572 */ 0x599D,0x5523, + /* Array index: 0x1572 */ 0x59A3,0x5526, + /* Array index: 0x1572 */ 0x59A5,0x4245, + /* Array index: 0x1572 */ 0x59A8,0x4B38, + /* Array index: 0x1572 */ 0x59AC,0x454A, + /* Array index: 0x1572 */ 0x59B2,0x5527, + /* Array index: 0x1572 */ 0x59B9,0x4B65, + /* Array index: 0x1572 */ 0x59BB,0x3A4A, + /* Array index: 0x1572 */ 0x59BE,0x3E2A, + /* Array index: 0x1572 */ 0x59C6,0x5528, + /* Array index: 0x1572 */ 0x59C9,0x3B50, + /* Array index: 0x1572 */ 0x59CB,0x3B4F, + /* Array index: 0x1572 */ 0x59D9,0x552C, + /* Array index: 0x1572 */ 0x59DA,0x552D, + /* Array index: 0x1572 */ 0x59DC,0x552A, + /* Array index: 0x1572 */ 0x59E5,0x3138, + /* Array index: 0x1572 */ 0x59E6,0x342F, + /* Array index: 0x1572 */ 0x59E8,0x5529, + /* Array index: 0x1572 */ 0x59EA,0x4C45, + /* Array index: 0x1572 */ 0x59EB,0x4931, + /* Array index: 0x1572 */ 0x59F6,0x3028, + /* Array index: 0x1572 */ 0x59FB,0x3079, + /* Array index: 0x1572 */ 0x59FF,0x3B51, + /* Array index: 0x1572 */ 0x5A01,0x3052, + /* Array index: 0x1572 */ 0x5A03,0x3023, + /* Array index: 0x1572 */ 0x5A09,0x5532, + /* Array index: 0x1572 */ 0x5A11,0x5530, + /* Array index: 0x1572 */ 0x5A18,0x4C3C, + /* Array index: 0x1572 */ 0x5A1A,0x5533, + /* Array index: 0x1572 */ 0x5A1C,0x5531, + /* Array index: 0x1572 */ 0x5A1F,0x552F, + /* Array index: 0x1572 */ 0x5A20,0x3F31, + /* Array index: 0x1572 */ 0x5A25,0x552E, + /* Array index: 0x1572 */ 0x5A29,0x4A5A, + /* Array index: 0x1572 */ 0x5A2F,0x3864, + /* Array index: 0x1572 */ 0x5A35,0x5537, + /* Array index: 0x1572 */ 0x5A36,0x5538, + /* Array index: 0x1572 */ 0x5A3C,0x3E2B, + /* Array index: 0x1572 */ 0x5A40,0x5534, + /* Array index: 0x1572 */ 0x5A41,0x4F2C, + /* Array index: 0x1572 */ 0x5A46,0x474C, + /* Array index: 0x1572 */ 0x5A49,0x5536, + /* Array index: 0x1572 */ 0x5A5A,0x3A27, + /* Array index: 0x1572 */ 0x5A62,0x5539, + /* Array index: 0x1572 */ 0x5A66,0x4958, + /* Array index: 0x1572 */ 0x5A6A,0x553A, + /* Array index: 0x1572 */ 0x5A6C,0x5535, + /* Array index: 0x1572 */ 0x5A7F,0x4C3B, + /* Array index: 0x1572 */ 0x5A92,0x475E, + /* Array index: 0x1572 */ 0x5A9A,0x553B, + /* Array index: 0x1572 */ 0x5A9B,0x4932, + /* Array index: 0x1572 */ 0x5AC9,0x3C3B, + /* Array index: 0x1572 */ 0x5ACB,0x553E, + /* Array index: 0x1572 */ 0x5ACC,0x3779, + /* Array index: 0x1572 */ 0x5AD0,0x554C, + /* Array index: 0x1572 */ 0x5AD6,0x5545, + /* Array index: 0x1572 */ 0x5AD7,0x5542, + /* Array index: 0x1572 */ 0x5AE1,0x4364, + /* Array index: 0x1572 */ 0x5AE3,0x5541, + /* Array index: 0x1572 */ 0x5AE6,0x5543, + /* Array index: 0x1572 */ 0x5AE9,0x5544, + /* Array index: 0x1572 */ 0x5AFA,0x5546, + /* Array index: 0x1572 */ 0x5AFB,0x5547, + /* Array index: 0x1572 */ 0x5B09,0x3472, + /* Array index: 0x1572 */ 0x5B0B,0x5549, + /* Array index: 0x1572 */ 0x5B0C,0x5548, + /* Array index: 0x1572 */ 0x5B16,0x554A, + /* Array index: 0x1572 */ 0x5B22,0x3E6E, + /* Array index: 0x1572 */ 0x5B2A,0x554D, + /* Array index: 0x1572 */ 0x5B2C,0x445C, + /* Array index: 0x1572 */ 0x5B30,0x3145, + /* Array index: 0x1572 */ 0x5B32,0x554B, + /* Array index: 0x1572 */ 0x5B36,0x554E, + /* Array index: 0x1572 */ 0x5B3E,0x554F, + /* Array index: 0x1572 */ 0x5B40,0x5552, + /* Array index: 0x1572 */ 0x5B43,0x5550, + /* Array index: 0x1572 */ 0x5B45,0x5551, + /* Array index: 0x1572 */ 0x5B50,0x3B52, + /* Array index: 0x1572 */ 0x5B51,0x5553, + /* Array index: 0x1572 */ 0x5B69,0x5558, + /* Array index: 0x1572 */ 0x5B6B,0x4239, + /* Array index: 0x1572 */ 0x5B70,0x5559, + /* Array index: 0x1572 */ 0x5B71,0x5623, + /* Array index: 0x1572 */ 0x5B73,0x555A, + /* Array index: 0x1572 */ 0x5B75,0x555B, + /* Array index: 0x1572 */ 0x5B78,0x555C, + /* Array index: 0x1572 */ 0x5B7A,0x555E, + /* Array index: 0x1572 */ 0x5B80,0x555F, + /* Array index: 0x1572 */ 0x5B83,0x5560, + /* Array index: 0x1572 */ 0x5BAE,0x355C, + /* Array index: 0x1572 */ 0x5BB0,0x3A4B, + /* Array index: 0x1572 */ 0x5BBF,0x3D49, + /* Array index: 0x1572 */ 0x5BCC,0x4959, + /* Array index: 0x1572 */ 0x5BEE,0x4E40, + /* Array index: 0x1572 */ 0x5BF0,0x556E, + /* Array index: 0x1572 */ 0x5BF3,0x5570, + /* Array index: 0x1572 */ 0x5BF5,0x437E, + /* Array index: 0x1572 */ 0x5BF6,0x556F, + /* Array index: 0x1572 */ 0x5BF8,0x4023, + /* Array index: 0x1572 */ 0x5BFA,0x3B7B, + /* Array index: 0x1572 */ 0x5C16,0x406D, + /* Array index: 0x1572 */ 0x5C1A,0x3E30, + /* Array index: 0x1572 */ 0x5C20,0x5576, + /* Array index: 0x1572 */ 0x5C22,0x5577, + /* Array index: 0x1572 */ 0x5C24,0x4C60, + /* Array index: 0x1572 */ 0x5C28,0x5578, + /* Array index: 0x1572 */ 0x5C2D,0x3646, + /* Array index: 0x1572 */ 0x5C31,0x3D22, + /* Array index: 0x1572 */ 0x5C45,0x356F, + /* Array index: 0x1572 */ 0x5C46,0x557C, + /* Array index: 0x1572 */ 0x5C48,0x367E, + /* Array index: 0x1572 */ 0x5C5E,0x4230, + /* Array index: 0x1572 */ 0x5C60,0x454B, + /* Array index: 0x1572 */ 0x5C61,0x3C48, + /* Array index: 0x1572 */ 0x5C64,0x4158, + /* Array index: 0x1572 */ 0x5C65,0x4D7A, + /* Array index: 0x1572 */ 0x5C6C,0x5624, + /* Array index: 0x1572 */ 0x5C6E,0x5625, + /* Array index: 0x1572 */ 0x5C6F,0x4656, + /* Array index: 0x1572 */ 0x5C71,0x3B33, + /* Array index: 0x1572 */ 0x5C76,0x5627, + /* Array index: 0x1572 */ 0x5C79,0x5628, + /* Array index: 0x1572 */ 0x5C8C,0x5629, + /* Array index: 0x1572 */ 0x5C90,0x3474, + /* Array index: 0x1572 */ 0x5C91,0x562A, + /* Array index: 0x1572 */ 0x5C94,0x562B, + /* Array index: 0x1572 */ 0x5CA1,0x322C, + /* Array index: 0x1572 */ 0x5CB1,0x4252, + /* Array index: 0x1572 */ 0x5CB3,0x3359, + /* Array index: 0x1572 */ 0x5CC5,0x5632, + /* Array index: 0x1572 */ 0x5CC7,0x5634, + /* Array index: 0x1572 */ 0x5CD9,0x5635, + /* Array index: 0x1572 */ 0x5CE0,0x463D, + /* Array index: 0x1572 */ 0x5CE1,0x362E, + /* Array index: 0x1572 */ 0x5CED,0x5639, + /* Array index: 0x1572 */ 0x5CEF,0x4A77, + /* Array index: 0x1572 */ 0x5CF0,0x4A76, + /* Array index: 0x1572 */ 0x5CF6,0x4567, + /* Array index: 0x1572 */ 0x5CFA,0x5638, + /* Array index: 0x1572 */ 0x5CFB,0x3D54, + /* Array index: 0x1572 */ 0x5CFD,0x5637, + /* Array index: 0x1572 */ 0x5D07,0x3F72, + /* Array index: 0x1572 */ 0x5D0B,0x563C, + /* Array index: 0x1572 */ 0x5D0E,0x3A6A, + /* Array index: 0x1572 */ 0x5D11,0x5642, + /* Array index: 0x1572 */ 0x5D1F,0x5640, + /* Array index: 0x1572 */ 0x5D22,0x5644, + /* Array index: 0x1572 */ 0x5D29,0x4A78, + /* Array index: 0x1572 */ 0x5D4B,0x564B, + /* Array index: 0x1572 */ 0x5D4C,0x5648, + /* Array index: 0x1572 */ 0x5D4E,0x564A, + /* Array index: 0x1572 */ 0x5D50,0x4D72, + /* Array index: 0x1572 */ 0x5D52,0x5649, + /* Array index: 0x1572 */ 0x5D5C,0x563F, + /* Array index: 0x1572 */ 0x5D69,0x3F73, + /* Array index: 0x1572 */ 0x5D6C,0x564C, + /* Array index: 0x1572 */ 0x5D6F,0x3A37, + /* Array index: 0x1572 */ 0x5D73,0x564D, + /* Array index: 0x1572 */ 0x5D76,0x564E, + /* Array index: 0x1572 */ 0x5D82,0x5651, + /* Array index: 0x1572 */ 0x5D84,0x5650, + /* Array index: 0x1572 */ 0x5D87,0x564F, + /* Array index: 0x1572 */ 0x5D8B,0x4568, + /* Array index: 0x1572 */ 0x5D8C,0x563A, + /* Array index: 0x1572 */ 0x5D90,0x5657, + /* Array index: 0x1572 */ 0x5D9D,0x5653, + /* Array index: 0x1572 */ 0x5DA2,0x5652, + /* Array index: 0x1572 */ 0x5DAC,0x5654, + /* Array index: 0x1572 */ 0x5DAE,0x5655, + /* Array index: 0x1572 */ 0x5DB7,0x5658, + /* Array index: 0x1572 */ 0x5DBA,0x4E66, + /* Array index: 0x1572 */ 0x5DBC,0x5659, + /* Array index: 0x1572 */ 0x5DBD,0x5656, + /* Array index: 0x1572 */ 0x5DC9,0x565A, + /* Array index: 0x1572 */ 0x5DCC,0x3460, + /* Array index: 0x1572 */ 0x5DCD,0x565B, + /* Array index: 0x1572 */ 0x5DD2,0x565D, + /* Array index: 0x1572 */ 0x5DD3,0x565C, + /* Array index: 0x1572 */ 0x5DD6,0x565E, + /* Array index: 0x1572 */ 0x5DDB,0x565F, + /* Array index: 0x1572 */ 0x5DDD,0x406E, + /* Array index: 0x1572 */ 0x5DDE,0x3D23, + /* Array index: 0x1572 */ 0x5DE1,0x3D64, + /* Array index: 0x1572 */ 0x5DEB,0x5660, + /* Array index: 0x1572 */ 0x5DEE,0x3A39, + /* Array index: 0x1572 */ 0x5DFB,0x342C, + /* Array index: 0x1572 */ 0x5DFD,0x4327, + /* Array index: 0x1572 */ 0x5DFE,0x3652, + /* Array index: 0x1572 */ 0x5E02,0x3B54, + /* Array index: 0x1572 */ 0x5E03,0x495B, + /* Array index: 0x1572 */ 0x5E06,0x4841, + /* Array index: 0x1572 */ 0x5E0B,0x5663, + /* Array index: 0x1572 */ 0x5E0C,0x3475, + /* Array index: 0x1572 */ 0x5E11,0x5666, + /* Array index: 0x1572 */ 0x5E16,0x4421, + /* Array index: 0x1572 */ 0x5E25,0x3F63, + /* Array index: 0x1572 */ 0x5E2B,0x3B55, + /* Array index: 0x1572 */ 0x5E2D,0x404A, + /* Array index: 0x1572 */ 0x5E2F,0x4253, + /* Array index: 0x1572 */ 0x5E30,0x3522, + /* Array index: 0x1572 */ 0x5E33,0x4422, + /* Array index: 0x1572 */ 0x5E3D,0x4B39, + /* Array index: 0x1572 */ 0x5E40,0x566C, + /* Array index: 0x1572 */ 0x5E4C,0x4B5A, + /* Array index: 0x1572 */ 0x5E4E,0x566D, + /* Array index: 0x1572 */ 0x5E54,0x566F, + /* Array index: 0x1572 */ 0x5E55,0x4B6B, + /* Array index: 0x1572 */ 0x5E57,0x566E, + /* Array index: 0x1572 */ 0x5E87,0x485F, + /* Array index: 0x1572 */ 0x5E8A,0x3E32, + /* Array index: 0x1572 */ 0x5E8F,0x3D78, + /* Array index: 0x1572 */ 0x5E9A,0x392E, + /* Array index: 0x1572 */ 0x5E9C,0x495C, + /* Array index: 0x1572 */ 0x5EA0,0x5679, + /* Array index: 0x1572 */ 0x5EA6,0x4559, + /* Array index: 0x1572 */ 0x5EA7,0x3A42, + /* Array index: 0x1572 */ 0x5EAB,0x384B, + /* Array index: 0x1572 */ 0x5EAD,0x446D, + /* Array index: 0x1572 */ 0x5ECF,0x567E, + /* Array index: 0x1572 */ 0x5ED0,0x567D, + /* Array index: 0x1572 */ 0x5ED3,0x3347, + /* Array index: 0x1572 */ 0x5ED6,0x5721, + /* Array index: 0x1572 */ 0x5EDA,0x5724, + /* Array index: 0x1572 */ 0x5EDB,0x5725, + /* Array index: 0x1572 */ 0x5EE8,0x5728, + /* Array index: 0x1572 */ 0x5EE9,0x5729, + /* Array index: 0x1572 */ 0x5EEC,0x572A, + /* Array index: 0x1572 */ 0x5F1B,0x4350, + /* Array index: 0x1572 */ 0x5F1F,0x446F, + /* Array index: 0x1572 */ 0x5F2D,0x5739, + /* Array index: 0x1572 */ 0x5F2F,0x573F, + /* Array index: 0x1572 */ 0x5F31,0x3C65, + /* Array index: 0x1572 */ 0x5F35,0x4425, + /* Array index: 0x1572 */ 0x5F37,0x362F, + /* Array index: 0x1572 */ 0x5F38,0x573A, + /* Array index: 0x1572 */ 0x5F3C,0x492B, + /* Array index: 0x1572 */ 0x5F3E,0x4346, + /* Array index: 0x1572 */ 0x5F41,0x573B, + /* Array index: 0x1572 */ 0x5F48,0x573C, + /* Array index: 0x1572 */ 0x5F4A,0x3630, + /* Array index: 0x1572 */ 0x5F4C,0x573D, + /* Array index: 0x1572 */ 0x5F4E,0x573E, + /* Array index: 0x1572 */ 0x5F51,0x5740, + /* Array index: 0x1572 */ 0x5F53,0x4576, + /* Array index: 0x1572 */ 0x5F56,0x5741, + /* Array index: 0x1572 */ 0x5F57,0x5742, + /* Array index: 0x1572 */ 0x5F59,0x5743, + /* Array index: 0x1572 */ 0x5F5C,0x5734, + /* Array index: 0x1572 */ 0x5F5D,0x5733, + /* Array index: 0x1572 */ 0x5F61,0x5744, + /* Array index: 0x1572 */ 0x5F62,0x3741, + /* Array index: 0x1572 */ 0x5F66,0x4927, + /* Array index: 0x1572 */ 0x5F77,0x5747, + /* Array index: 0x1572 */ 0x5F79,0x4C72, + /* Array index: 0x1572 */ 0x5F7C,0x4860, + /* Array index: 0x1572 */ 0x5F9E,0x574F, + /* Array index: 0x1572 */ 0x5FA0,0x5752, + /* Array index: 0x1572 */ 0x5FA1,0x3866, + /* Array index: 0x1572 */ 0x5FB3,0x4641, + /* Array index: 0x1572 */ 0x5FB4,0x4427, + /* Array index: 0x1572 */ 0x5FB9,0x4530, + /* Array index: 0x1572 */ 0x5FBC,0x5755, + /* Array index: 0x1572 */ 0x5FBD,0x352B, + /* Array index: 0x1572 */ 0x5FC3,0x3F34, + /* Array index: 0x1572 */ 0x5FC5,0x492C, + /* Array index: 0x1572 */ 0x5FCC,0x3477, + /* Array index: 0x1572 */ 0x5FCD,0x4726, + /* Array index: 0x1572 */ 0x5FE0,0x4369, + /* Array index: 0x1572 */ 0x5FE4,0x5758, + /* Array index: 0x1572 */ 0x5FEB,0x3277, + /* Array index: 0x1572 */ 0x5FF0,0x582D, + /* Array index: 0x1572 */ 0x5FF1,0x575A, + /* Array index: 0x1572 */ 0x5FF5,0x4730, + /* Array index: 0x1572 */ 0x5FF8,0x5759, + /* Array index: 0x1572 */ 0x5FFB,0x5757, + /* Array index: 0x1572 */ 0x5FFD,0x397A, + /* Array index: 0x1572 */ 0x5FFF,0x575D, + /* Array index: 0x1572 */ 0x602F,0x3631, + /* Array index: 0x1572 */ 0x6031,0x5764, + /* Array index: 0x1572 */ 0x603A,0x576A, + /* Array index: 0x1572 */ 0x6046,0x5771, + /* Array index: 0x1572 */ 0x604A,0x5770, + /* Array index: 0x1572 */ 0x604B,0x4E78, + /* Array index: 0x1572 */ 0x604D,0x5772, + /* Array index: 0x1572 */ 0x6050,0x3632, + /* Array index: 0x1572 */ 0x6052,0x3931, + /* Array index: 0x1572 */ 0x6055,0x3D7A, + /* Array index: 0x1572 */ 0x6059,0x5779, + /* Array index: 0x1572 */ 0x605A,0x576B, + /* Array index: 0x1572 */ 0x6075,0x3743, + /* Array index: 0x1572 */ 0x6077,0x576E, + /* Array index: 0x1572 */ 0x6081,0x577A, + /* Array index: 0x1572 */ 0x6083,0x577D, + /* Array index: 0x1572 */ 0x6084,0x5821, + /* Array index: 0x1572 */ 0x6092,0x5825, + /* Array index: 0x1572 */ 0x6094,0x3279, + /* Array index: 0x1572 */ 0x6096,0x5823, + /* Array index: 0x1572 */ 0x6097,0x5824, + /* Array index: 0x1572 */ 0x609A,0x577E, + /* Array index: 0x1572 */ 0x609B,0x5822, + /* Array index: 0x1572 */ 0x609F,0x3867, + /* Array index: 0x1572 */ 0x60A0,0x4D2A, + /* Array index: 0x1572 */ 0x60A3,0x3435, + /* Array index: 0x1572 */ 0x60BC,0x4569, + /* Array index: 0x1572 */ 0x60BD,0x582E, + /* Array index: 0x1572 */ 0x60D1,0x4F47, + /* Array index: 0x1572 */ 0x60D3,0x582B, + /* Array index: 0x1572 */ 0x60D8,0x5831, + /* Array index: 0x1572 */ 0x60DA,0x397B, + /* Array index: 0x1572 */ 0x60DC,0x404B, + /* Array index: 0x1572 */ 0x60E7,0x577C, + /* Array index: 0x1572 */ 0x60E8,0x3B34, + /* Array index: 0x1572 */ 0x6100,0x5837, + /* Array index: 0x1572 */ 0x6101,0x3D25, + /* Array index: 0x1572 */ 0x6103,0x583A, + /* Array index: 0x1572 */ 0x6106,0x5834, + /* Array index: 0x1572 */ 0x6108,0x4C7C, + /* Array index: 0x1572 */ 0x6109,0x4C7B, + /* Array index: 0x1572 */ 0x6115,0x5833, + /* Array index: 0x1572 */ 0x611A,0x3672, + /* Array index: 0x1572 */ 0x611B,0x3026, + /* Array index: 0x1572 */ 0x611F,0x3436, + /* Array index: 0x1572 */ 0x6121,0x583B, + /* Array index: 0x1572 */ 0x6127,0x5843, + /* Array index: 0x1572 */ 0x6128,0x5842, + /* Array index: 0x1572 */ 0x612C,0x5847, + /* Array index: 0x1572 */ 0x6134,0x5848, + /* Array index: 0x1572 */ 0x6142,0x584A, + /* Array index: 0x1572 */ 0x6144,0x584B, + /* Array index: 0x1572 */ 0x6153,0x5858, + /* Array index: 0x1572 */ 0x6155,0x4A69, + /* Array index: 0x1572 */ 0x615D,0x5857, + /* Array index: 0x1572 */ 0x615F,0x5856, + /* Array index: 0x1572 */ 0x6162,0x4B7D, + /* Array index: 0x1572 */ 0x6163,0x3437, + /* Array index: 0x1572 */ 0x6165,0x5854, + /* Array index: 0x1572 */ 0x6167,0x3745, + /* Array index: 0x1572 */ 0x6168,0x3334, + /* Array index: 0x1572 */ 0x616B,0x5851, + /* Array index: 0x1572 */ 0x617E,0x4D5D, + /* Array index: 0x1572 */ 0x6182,0x4D2B, + /* Array index: 0x1572 */ 0x6187,0x585C, + /* Array index: 0x1572 */ 0x618A,0x5860, + /* Array index: 0x1572 */ 0x618E,0x417E, + /* Array index: 0x1572 */ 0x6190,0x4E79, + /* Array index: 0x1572 */ 0x6191,0x5861, + /* Array index: 0x1572 */ 0x6194,0x585E, + /* Array index: 0x1572 */ 0x6196,0x585B, + /* Array index: 0x1572 */ 0x6199,0x585A, + /* Array index: 0x1572 */ 0x619A,0x585F, + /* Array index: 0x1572 */ 0x61A4,0x4A30, + /* Array index: 0x1572 */ 0x61A7,0x4634, + /* Array index: 0x1572 */ 0x61A9,0x3746, + /* Array index: 0x1572 */ 0x61AB,0x5862, + /* Array index: 0x1572 */ 0x61AC,0x585D, + /* Array index: 0x1572 */ 0x61AE,0x5863, + /* Array index: 0x1572 */ 0x61B2,0x377B, + /* Array index: 0x1572 */ 0x61B6,0x3231, + /* Array index: 0x1572 */ 0x61BA,0x586B, + /* Array index: 0x1572 */ 0x61BE,0x3438, + /* Array index: 0x1572 */ 0x61C3,0x5869, + /* Array index: 0x1572 */ 0x61D0,0x327B, + /* Array index: 0x1572 */ 0x61E3,0x5870, + /* Array index: 0x1572 */ 0x61E6,0x586F, + /* Array index: 0x1572 */ 0x61F2,0x4428, + /* Array index: 0x1572 */ 0x6226,0x406F, + /* Array index: 0x1572 */ 0x622A,0x5923, + /* Array index: 0x1572 */ 0x6238,0x384D, + /* Array index: 0x1572 */ 0x623B,0x4C61, + /* Array index: 0x1572 */ 0x6253,0x4247, + /* Array index: 0x1572 */ 0x6255,0x4A27, + /* Array index: 0x1572 */ 0x6258,0x4271, + /* Array index: 0x1572 */ 0x625B,0x592C, + /* Array index: 0x1572 */ 0x625E,0x592A, + /* Array index: 0x1572 */ 0x6260,0x592D, + /* Array index: 0x1572 */ 0x6263,0x592B, + /* Array index: 0x1572 */ 0x6268,0x592E, + /* Array index: 0x1572 */ 0x626E,0x4A31, + /* Array index: 0x1572 */ 0x6271,0x3037, + /* Array index: 0x1572 */ 0x6276,0x495E, + /* Array index: 0x1572 */ 0x6279,0x4863, + /* Array index: 0x1572 */ 0x6289,0x5931, + /* Array index: 0x1572 */ 0x628A,0x4744, + /* Array index: 0x1572 */ 0x62AB,0x4864, + /* Array index: 0x1572 */ 0x62AC,0x5A2D, + /* Array index: 0x1572 */ 0x62B1,0x4A7A, + /* Array index: 0x1572 */ 0x62B5,0x4471, + /* Array index: 0x1572 */ 0x62C2,0x5944, + /* Array index: 0x1572 */ 0x630C,0x5948, + /* Array index: 0x1572 */ 0x6311,0x4429, + /* Array index: 0x1572 */ 0x6319,0x3573, + /* Array index: 0x1572 */ 0x631F,0x3634, + /* Array index: 0x1572 */ 0x6327,0x594B, + /* Array index: 0x1572 */ 0x6328,0x3027, + /* Array index: 0x1572 */ 0x632B,0x3A43, + /* Array index: 0x1572 */ 0x632F,0x3F36, + /* Array index: 0x1572 */ 0x633A,0x4472, + /* Array index: 0x1572 */ 0x6349,0x422A, + /* Array index: 0x1572 */ 0x6355,0x4A61, + /* Array index: 0x1572 */ 0x6357,0x443D, + /* Array index: 0x1572 */ 0x635C,0x415C, + /* Array index: 0x1572 */ 0x636E,0x3F78, + /* Array index: 0x1572 */ 0x6372,0x377E, + /* Array index: 0x1572 */ 0x6376,0x5959, + /* Array index: 0x1572 */ 0x6377,0x3E39, + /* Array index: 0x1572 */ 0x637A,0x4668, + /* Array index: 0x1572 */ 0x637B,0x4731, + /* Array index: 0x1572 */ 0x6380,0x5957, + /* Array index: 0x1572 */ 0x6383,0x415D, + /* Array index: 0x1572 */ 0x6388,0x3C78, + /* Array index: 0x1572 */ 0x6389,0x595C, + /* Array index: 0x1572 */ 0x638C,0x3E38, + /* Array index: 0x1572 */ 0x638E,0x5956, + /* Array index: 0x1572 */ 0x638F,0x595B, + /* Array index: 0x1572 */ 0x6392,0x4753, + /* Array index: 0x1572 */ 0x6396,0x5955, + /* Array index: 0x1572 */ 0x6398,0x3721, + /* Array index: 0x1572 */ 0x639B,0x335D, + /* Array index: 0x1572 */ 0x63B2,0x3747, + /* Array index: 0x1572 */ 0x63B4,0x444F, + /* Array index: 0x1572 */ 0x63B5,0x595E, + /* Array index: 0x1572 */ 0x63BB,0x415F, + /* Array index: 0x1572 */ 0x63BE,0x5961, + /* Array index: 0x1572 */ 0x63C0,0x5963, + /* Array index: 0x1572 */ 0x63C3,0x4237, + /* Array index: 0x1572 */ 0x63C4,0x5969, + /* Array index: 0x1572 */ 0x63C6,0x5964, + /* Array index: 0x1572 */ 0x63C9,0x5966, + /* Array index: 0x1572 */ 0x63CF,0x4941, + /* Array index: 0x1572 */ 0x63D0,0x4473, + /* Array index: 0x1572 */ 0x63D2,0x5967, + /* Array index: 0x1572 */ 0x63D6,0x4D2C, + /* Array index: 0x1572 */ 0x63DA,0x4D48, + /* Array index: 0x1572 */ 0x63DB,0x3439, + /* Array index: 0x1572 */ 0x63E1,0x302E, + /* Array index: 0x1572 */ 0x63E3,0x5965, + /* Array index: 0x1572 */ 0x63E9,0x5962, + /* Array index: 0x1572 */ 0x63EE,0x3478, + /* Array index: 0x1572 */ 0x63F4,0x3167, + /* Array index: 0x1572 */ 0x63F6,0x5968, + /* Array index: 0x1572 */ 0x63FA,0x4D49, + /* Array index: 0x1572 */ 0x6406,0x596C, + /* Array index: 0x1572 */ 0x640D,0x423B, + /* Array index: 0x1572 */ 0x640F,0x5973, + /* Array index: 0x1572 */ 0x6413,0x596D, + /* Array index: 0x1572 */ 0x6416,0x596A, + /* Array index: 0x1572 */ 0x6417,0x5971, + /* Array index: 0x1572 */ 0x641C,0x5953, + /* Array index: 0x1572 */ 0x6426,0x596E, + /* Array index: 0x1572 */ 0x6428,0x5972, + /* Array index: 0x1572 */ 0x642C,0x4842, + /* Array index: 0x1572 */ 0x642D,0x456B, + /* Array index: 0x1572 */ 0x6434,0x596B, + /* Array index: 0x1572 */ 0x6436,0x596F, + /* Array index: 0x1572 */ 0x643A,0x3748, + /* Array index: 0x1572 */ 0x643E,0x3A71, + /* Array index: 0x1572 */ 0x6442,0x405D, + /* Array index: 0x1572 */ 0x644E,0x5977, + /* Array index: 0x1572 */ 0x6458,0x4526, + /* Array index: 0x1572 */ 0x6467,0x5974, + /* Array index: 0x1572 */ 0x6469,0x4B60, + /* Array index: 0x1572 */ 0x646F,0x5975, + /* Array index: 0x1572 */ 0x6476,0x5976, + /* Array index: 0x1572 */ 0x6478,0x4C4E, + /* Array index: 0x1572 */ 0x647A,0x4022, + /* Array index: 0x1572 */ 0x6483,0x3762, + /* Array index: 0x1572 */ 0x6488,0x597D, + /* Array index: 0x1572 */ 0x6492,0x3B35, + /* Array index: 0x1572 */ 0x6493,0x597A, + /* Array index: 0x1572 */ 0x6495,0x5979, + /* Array index: 0x1572 */ 0x649A,0x4732, + /* Array index: 0x1572 */ 0x649E,0x4635, + /* Array index: 0x1572 */ 0x64A4,0x4531, + /* Array index: 0x1572 */ 0x64A5,0x597B, + /* Array index: 0x1572 */ 0x64A9,0x597C, + /* Array index: 0x1572 */ 0x64AB,0x496F, + /* Array index: 0x1572 */ 0x64AD,0x4745, + /* Array index: 0x1572 */ 0x64AE,0x3B23, + /* Array index: 0x1572 */ 0x64B0,0x4071, + /* Array index: 0x1572 */ 0x64B2,0x4B50, + /* Array index: 0x1572 */ 0x64B9,0x3349, + /* Array index: 0x1572 */ 0x64BB,0x5A25, + /* Array index: 0x1572 */ 0x64BC,0x597E, + /* Array index: 0x1572 */ 0x64C1,0x4D4A, + /* Array index: 0x1572 */ 0x64C2,0x5A27, + /* Array index: 0x1572 */ 0x64C5,0x5A23, + /* Array index: 0x1572 */ 0x64C7,0x5A24, + /* Array index: 0x1572 */ 0x64CD,0x4160, + /* Array index: 0x1572 */ 0x64D2,0x5A22, + /* Array index: 0x1572 */ 0x64D4,0x593F, + /* Array index: 0x1572 */ 0x64D8,0x5A26, + /* Array index: 0x1572 */ 0x64DA,0x5A21, + /* Array index: 0x1572 */ 0x64EC,0x353C, + /* Array index: 0x1572 */ 0x64EF,0x5A2F, + /* Array index: 0x1572 */ 0x64F1,0x5A28, + /* Array index: 0x1572 */ 0x64F2,0x5A33, + /* Array index: 0x1572 */ 0x64F4,0x5A32, + /* Array index: 0x1572 */ 0x64F6,0x5A31, + /* Array index: 0x1572 */ 0x64FA,0x5A34, + /* Array index: 0x1572 */ 0x64FD,0x5A36, + /* Array index: 0x1572 */ 0x64FE,0x3E71, + /* Array index: 0x1572 */ 0x6500,0x5A35, + /* Array index: 0x1572 */ 0x6505,0x5A39, + /* Array index: 0x1572 */ 0x6518,0x5A37, + /* Array index: 0x1572 */ 0x651C,0x5A38, + /* Array index: 0x1572 */ 0x651D,0x5970, + /* Array index: 0x1572 */ 0x6523,0x5A3B, + /* Array index: 0x1572 */ 0x6524,0x5A3A, + /* Array index: 0x1572 */ 0x652F,0x3B59, + /* Array index: 0x1572 */ 0x6545,0x384E, + /* Array index: 0x1572 */ 0x6548,0x5A43, + /* Array index: 0x1572 */ 0x654D,0x5A46, + /* Array index: 0x1572 */ 0x654F,0x4952, + /* Array index: 0x1572 */ 0x6551,0x355F, + /* Array index: 0x1572 */ 0x655D,0x5A49, + /* Array index: 0x1572 */ 0x655E,0x5A48, + /* Array index: 0x1572 */ 0x6562,0x343A, + /* Array index: 0x1572 */ 0x6563,0x3B36, + /* Array index: 0x1572 */ 0x6566,0x4658, + /* Array index: 0x1572 */ 0x656C,0x3749, + /* Array index: 0x1572 */ 0x6570,0x3F74, + /* Array index: 0x1572 */ 0x6572,0x5A4A, + /* Array index: 0x1572 */ 0x6582,0x5A4C, + /* Array index: 0x1572 */ 0x6583,0x5A4D, + /* Array index: 0x1572 */ 0x658C,0x494C, + /* Array index: 0x1572 */ 0x658E,0x3A58, + /* Array index: 0x1572 */ 0x6590,0x4865, + /* Array index: 0x1572 */ 0x6591,0x4843, + /* Array index: 0x1572 */ 0x6597,0x454D, + /* Array index: 0x1572 */ 0x6599,0x4E41, + /* Array index: 0x1572 */ 0x659B,0x5A4F, + /* Array index: 0x1572 */ 0x659C,0x3C50, + /* Array index: 0x1572 */ 0x659F,0x5A50, + /* Array index: 0x1572 */ 0x65A1,0x3036, + /* Array index: 0x1572 */ 0x65A4,0x3654, + /* Array index: 0x1572 */ 0x65A5,0x404D, + /* Array index: 0x1572 */ 0x65A7,0x4960, + /* Array index: 0x1572 */ 0x65B7,0x5A52, + /* Array index: 0x1572 */ 0x65B9,0x4A7D, + /* Array index: 0x1572 */ 0x65BC,0x3177, + /* Array index: 0x1572 */ 0x65BD,0x3B5C, + /* Array index: 0x1572 */ 0x65CB,0x407B, + /* Array index: 0x1572 */ 0x65CC,0x5A57, + /* Array index: 0x1572 */ 0x65CF,0x4232, + /* Array index: 0x1572 */ 0x65D2,0x5A58, + /* Array index: 0x1572 */ 0x65D7,0x347A, + /* Array index: 0x1572 */ 0x65D9,0x5A5A, + /* Array index: 0x1572 */ 0x65DB,0x5A59, + /* Array index: 0x1572 */ 0x65F1,0x5A5D, + /* Array index: 0x1572 */ 0x65FA,0x3222, + /* Array index: 0x1572 */ 0x65FB,0x5A61, + /* Array index: 0x1572 */ 0x6602,0x3937, + /* Array index: 0x1572 */ 0x6603,0x5A60, + /* Array index: 0x1572 */ 0x6606,0x3A2B, + /* Array index: 0x1572 */ 0x6607,0x3E3A, + /* Array index: 0x1572 */ 0x660A,0x5A5F, + /* Array index: 0x1572 */ 0x660C,0x3E3B, + /* Array index: 0x1572 */ 0x660E,0x4C40, + /* Array index: 0x1572 */ 0x660F,0x3A2A, + /* Array index: 0x1572 */ 0x6613,0x3057, + /* Array index: 0x1572 */ 0x6614,0x404E, + /* Array index: 0x1572 */ 0x661C,0x5A66, + /* Array index: 0x1572 */ 0x661F,0x4031, + /* Array index: 0x1572 */ 0x6620,0x3147, + /* Array index: 0x1572 */ 0x6625,0x3D55, + /* Array index: 0x1572 */ 0x6627,0x4B66, + /* Array index: 0x1572 */ 0x6628,0x3A72, + /* Array index: 0x1572 */ 0x662D,0x3E3C, + /* Array index: 0x1572 */ 0x662F,0x4027, + /* Array index: 0x1572 */ 0x663C,0x436B, + /* Array index: 0x1572 */ 0x6649,0x5A69, + /* Array index: 0x1572 */ 0x664B,0x3F38, + /* Array index: 0x1572 */ 0x664F,0x5A67, + /* Array index: 0x1572 */ 0x6652,0x3B2F, + /* Array index: 0x1572 */ 0x6662,0x5A71, + /* Array index: 0x1572 */ 0x6674,0x4032, + /* Array index: 0x1572 */ 0x6676,0x3E3D, + /* Array index: 0x1572 */ 0x667A,0x4352, + /* Array index: 0x1572 */ 0x6681,0x3647, + /* Array index: 0x1572 */ 0x668E,0x5A75, + /* Array index: 0x1572 */ 0x6691,0x3D6B, + /* Array index: 0x1572 */ 0x669D,0x5A79, + /* Array index: 0x1572 */ 0x66A2,0x442A, + /* Array index: 0x1572 */ 0x66A6,0x4E71, + /* Array index: 0x1572 */ 0x66AB,0x3B43, + /* Array index: 0x1572 */ 0x66AE,0x4A6B, + /* Array index: 0x1572 */ 0x66B4,0x4B3D, + /* Array index: 0x1572 */ 0x66B8,0x5B22, + /* Array index: 0x1572 */ 0x66B9,0x5A7B, + /* Array index: 0x1572 */ 0x66BC,0x5A7E, + /* Array index: 0x1572 */ 0x66BE,0x5A7D, + /* Array index: 0x1572 */ 0x66C1,0x5A7A, + /* Array index: 0x1572 */ 0x66C4,0x5B21, + /* Array index: 0x1572 */ 0x66C7,0x465E, + /* Array index: 0x1572 */ 0x66C9,0x5A7C, + /* Array index: 0x1572 */ 0x66D6,0x5B23, + /* Array index: 0x1572 */ 0x66E0,0x5B25, + /* Array index: 0x1572 */ 0x66E6,0x5B27, + /* Array index: 0x1572 */ 0x66E9,0x5B28, + /* Array index: 0x1572 */ 0x6703,0x5072, + /* Array index: 0x1572 */ 0x6708,0x376E, + /* Array index: 0x1572 */ 0x6709,0x4D2D, + /* Array index: 0x1572 */ 0x670B,0x4A7E, + /* Array index: 0x1572 */ 0x670D,0x497E, + /* Array index: 0x1572 */ 0x670F,0x5B2C, + /* Array index: 0x1572 */ 0x6731,0x3C6B, + /* Array index: 0x1572 */ 0x673D,0x3560, + /* Array index: 0x1572 */ 0x673F,0x5B33, + /* Array index: 0x1572 */ 0x6741,0x5B35, + /* Array index: 0x1572 */ 0x6746,0x5B38, + /* Array index: 0x1572 */ 0x6749,0x3F79, + /* Array index: 0x1572 */ 0x6756,0x3E73, + /* Array index: 0x1572 */ 0x6759,0x5B3B, + /* Array index: 0x1572 */ 0x676A,0x5B42, + /* Array index: 0x1572 */ 0x677C,0x5B41, + /* Array index: 0x1572 */ 0x677E,0x3E3E, + /* Array index: 0x1572 */ 0x677F,0x4844, + /* Array index: 0x1572 */ 0x6785,0x5B47, + /* Array index: 0x1572 */ 0x6787,0x487A, + /* Array index: 0x1572 */ 0x6789,0x5B3E, + /* Array index: 0x1572 */ 0x678B,0x5B44, + /* Array index: 0x1572 */ 0x678C,0x5B43, + /* Array index: 0x1572 */ 0x6790,0x404F, + /* Array index: 0x1572 */ 0x6795,0x4B6D, + /* Array index: 0x1572 */ 0x6797,0x4E53, + /* Array index: 0x1572 */ 0x679A,0x4B67, + /* Array index: 0x1572 */ 0x67A6,0x5B45, + /* Array index: 0x1572 */ 0x67A9,0x5B40, + /* Array index: 0x1572 */ 0x67AF,0x384F, + /* Array index: 0x1572 */ 0x67C1,0x4248, + /* Array index: 0x1572 */ 0x67C4,0x4A41, + /* Array index: 0x1572 */ 0x67C6,0x5B56, + /* Array index: 0x1572 */ 0x67CA,0x4922, + /* Array index: 0x1572 */ 0x67D8,0x4453, + /* Array index: 0x1572 */ 0x67DA,0x4D2E, + /* Array index: 0x1572 */ 0x67DD,0x5B51, + /* Array index: 0x1572 */ 0x67DE,0x5B50, + /* Array index: 0x1572 */ 0x67E2,0x5B52, + /* Array index: 0x1572 */ 0x67E4,0x5B4F, + /* Array index: 0x1572 */ 0x67E7,0x5B57, + /* Array index: 0x1572 */ 0x67E9,0x5B4D, + /* Array index: 0x1572 */ 0x67EC,0x5B4B, + /* Array index: 0x1572 */ 0x67EE,0x5B53, + /* Array index: 0x1572 */ 0x67EF,0x5B49, + /* Array index: 0x1572 */ 0x67FB,0x3A3A, + /* Array index: 0x1572 */ 0x6813,0x4072, + /* Array index: 0x1572 */ 0x6816,0x4034, + /* Array index: 0x1572 */ 0x6817,0x372A, + /* Array index: 0x1572 */ 0x681E,0x5B59, + /* Array index: 0x1572 */ 0x6821,0x393B, + /* Array index: 0x1572 */ 0x6822,0x337C, + /* Array index: 0x1572 */ 0x6832,0x5B5E, + /* Array index: 0x1572 */ 0x6834,0x4073, + /* Array index: 0x1572 */ 0x6838,0x334B, + /* Array index: 0x1572 */ 0x6839,0x3A2C, + /* Array index: 0x1572 */ 0x6846,0x5B5A, + /* Array index: 0x1572 */ 0x6848,0x3046, + /* Array index: 0x1572 */ 0x6859,0x5B62, + /* Array index: 0x1572 */ 0x685C,0x3A79, + /* Array index: 0x1572 */ 0x685D,0x4B71, + /* Array index: 0x1572 */ 0x685F,0x3B37, + /* Array index: 0x1572 */ 0x6863,0x5B63, + /* Array index: 0x1572 */ 0x6867,0x4930, + /* Array index: 0x1572 */ 0x6874,0x5B6F, + /* Array index: 0x1572 */ 0x6876,0x3233, + /* Array index: 0x1572 */ 0x6877,0x5B64, + /* Array index: 0x1572 */ 0x687E,0x5B75, + /* Array index: 0x1572 */ 0x687F,0x5B65, + /* Array index: 0x1572 */ 0x6881,0x4E42, + /* Array index: 0x1572 */ 0x6883,0x5B6C, + /* Array index: 0x1572 */ 0x6885,0x475F, + /* Array index: 0x1572 */ 0x688D,0x5B74, + /* Array index: 0x1572 */ 0x688F,0x5B67, + /* Array index: 0x1572 */ 0x6893,0x3034, + /* Array index: 0x1572 */ 0x6894,0x5B69, + /* Array index: 0x1572 */ 0x6897,0x393C, + /* Array index: 0x1572 */ 0x689B,0x5B6B, + /* Array index: 0x1572 */ 0x689D,0x5B6A, + /* Array index: 0x1572 */ 0x689F,0x5B66, + /* Array index: 0x1572 */ 0x68A0,0x5B71, + /* Array index: 0x1572 */ 0x68A2,0x3E3F, + /* Array index: 0x1572 */ 0x68C4,0x347E, + /* Array index: 0x1572 */ 0x68C6,0x5C32, + /* Array index: 0x1572 */ 0x68D2,0x4B40, + /* Array index: 0x1572 */ 0x68E7,0x5C22, + /* Array index: 0x1572 */ 0x68EE,0x3F39, + /* Array index: 0x1572 */ 0x68EF,0x5C2C, + /* Array index: 0x1572 */ 0x68F2,0x4033, + /* Array index: 0x1572 */ 0x68F9,0x5C2A, + /* Array index: 0x1572 */ 0x68FA,0x343D, + /* Array index: 0x1572 */ 0x6900,0x4F50, + /* Array index: 0x1572 */ 0x6901,0x5B76, + /* Array index: 0x1572 */ 0x6904,0x5C26, + /* Array index: 0x1572 */ 0x6905,0x3058, + /* Array index: 0x1572 */ 0x6908,0x5B78, + /* Array index: 0x1572 */ 0x6912,0x5C25, + /* Array index: 0x1572 */ 0x6930,0x5C3F, + /* Array index: 0x1572 */ 0x6934,0x464E, + /* Array index: 0x1572 */ 0x6936,0x5C24, + /* Array index: 0x1572 */ 0x6939,0x5C3B, + /* Array index: 0x1572 */ 0x693D,0x5C3D, + /* Array index: 0x1572 */ 0x693F,0x4458, + /* Array index: 0x1572 */ 0x694A,0x4D4C, + /* Array index: 0x1572 */ 0x698A,0x3A67, + /* Array index: 0x1572 */ 0x698E,0x315D, + /* Array index: 0x1572 */ 0x6991,0x5C54, + /* Array index: 0x1572 */ 0x6994,0x4F31, + /* Array index: 0x1572 */ 0x6995,0x5C57, + /* Array index: 0x1572 */ 0x699B,0x3F3A, + /* Array index: 0x1572 */ 0x699C,0x5C56, + /* Array index: 0x1572 */ 0x69A0,0x5C55, + /* Array index: 0x1572 */ 0x69A7,0x5C52, + /* Array index: 0x1572 */ 0x69AE,0x5C46, + /* Array index: 0x1572 */ 0x69B1,0x5C63, + /* Array index: 0x1572 */ 0x69B2,0x5C45, + /* Array index: 0x1572 */ 0x69B4,0x5C58, + /* Array index: 0x1572 */ 0x69BB,0x5C50, + /* Array index: 0x1572 */ 0x69BE,0x5C4B, + /* Array index: 0x1572 */ 0x69BF,0x5C48, + /* Array index: 0x1572 */ 0x69C1,0x5C49, + /* Array index: 0x1572 */ 0x69C3,0x5C51, + /* Array index: 0x1572 */ 0x69C7,0x7422, + /* Array index: 0x1572 */ 0x69D3,0x5C4A, + /* Array index: 0x1572 */ 0x69D8,0x4D4D, + /* Array index: 0x1572 */ 0x69D9,0x4B6A, + /* Array index: 0x1572 */ 0x69DD,0x5C4F, + /* Array index: 0x1572 */ 0x69DE,0x5C59, + /* Array index: 0x1572 */ 0x69E7,0x5C61, + /* Array index: 0x1572 */ 0x69E8,0x5C5A, + /* Array index: 0x1572 */ 0x69EB,0x5C67, + /* Array index: 0x1572 */ 0x69ED,0x5C65, + /* Array index: 0x1572 */ 0x69F2,0x5C60, + /* Array index: 0x1572 */ 0x69F9,0x5C5F, + /* Array index: 0x1572 */ 0x69FB,0x4450, + /* Array index: 0x1572 */ 0x69FD,0x4165, + /* Array index: 0x1572 */ 0x69FF,0x5C5D, + /* Array index: 0x1572 */ 0x6A02,0x5C5B, + /* Array index: 0x1572 */ 0x6A05,0x5C62, + /* Array index: 0x1572 */ 0x6A17,0x4374, + /* Array index: 0x1572 */ 0x6A19,0x4938, + /* Array index: 0x1572 */ 0x6A1B,0x5C5C, + /* Array index: 0x1572 */ 0x6A2E,0x5C53, + /* Array index: 0x1572 */ 0x6A3D,0x432E, + /* Array index: 0x1572 */ 0x6A44,0x5C6D, + /* Array index: 0x1572 */ 0x6A47,0x5C72, + /* Array index: 0x1572 */ 0x6A48,0x5C76, + /* Array index: 0x1572 */ 0x6A4B,0x3636, + /* Array index: 0x1572 */ 0x6A58,0x354C, + /* Array index: 0x1572 */ 0x6A59,0x5C74, + /* Array index: 0x1572 */ 0x6A5F,0x3521, + /* Array index: 0x1572 */ 0x6A61,0x464B, + /* Array index: 0x1572 */ 0x6A62,0x5C73, + /* Array index: 0x1572 */ 0x6A66,0x5C75, + /* Array index: 0x1572 */ 0x6A72,0x5C6F, + /* Array index: 0x1572 */ 0x6A78,0x5C71, + /* Array index: 0x1572 */ 0x6A7F,0x3360, + /* Array index: 0x1572 */ 0x6A80,0x4349, + /* Array index: 0x1572 */ 0x6A84,0x5C7C, + /* Array index: 0x1572 */ 0x6A8D,0x5C7A, + /* Array index: 0x1572 */ 0x6A8E,0x3869, + /* Array index: 0x1572 */ 0x6A90,0x5C79, + /* Array index: 0x1572 */ 0x6A97,0x5D21, + /* Array index: 0x1572 */ 0x6A9C,0x5B58, + /* Array index: 0x1572 */ 0x6AA0,0x5C7B, + /* Array index: 0x1572 */ 0x6AA2,0x5C7D, + /* Array index: 0x1572 */ 0x6AA3,0x5C7E, + /* Array index: 0x1572 */ 0x6AAA,0x5D2C, + /* Array index: 0x1572 */ 0x6AAC,0x5D28, + /* Array index: 0x1572 */ 0x6AAE,0x5B6D, + /* Array index: 0x1572 */ 0x6AB3,0x5D27, + /* Array index: 0x1572 */ 0x6AB8,0x5D26, + /* Array index: 0x1572 */ 0x6ABB,0x5D23, + /* Array index: 0x1572 */ 0x6AD1,0x5D2A, + /* Array index: 0x1572 */ 0x6AD3,0x4F26, + /* Array index: 0x1572 */ 0x6ADA,0x5D2D, + /* Array index: 0x1572 */ 0x6ADB,0x367B, + /* Array index: 0x1572 */ 0x6ADE,0x5D29, + /* Array index: 0x1572 */ 0x6ADF,0x5D2B, + /* Array index: 0x1572 */ 0x6AE8,0x4827, + /* Array index: 0x1572 */ 0x6AEA,0x5D2E, + /* Array index: 0x1572 */ 0x6AFA,0x5D32, + /* Array index: 0x1572 */ 0x6AFB,0x5D2F, + /* Array index: 0x1572 */ 0x6B04,0x4D73, + /* Array index: 0x1572 */ 0x6B05,0x5D30, + /* Array index: 0x1572 */ 0x6B0A,0x5C5E, + /* Array index: 0x1572 */ 0x6B12,0x5D33, + /* Array index: 0x1572 */ 0x6B16,0x5D34, + /* Array index: 0x1572 */ 0x6B27,0x3224, + /* Array index: 0x1572 */ 0x6B32,0x4D5F, + /* Array index: 0x1572 */ 0x6B43,0x5D3D, + /* Array index: 0x1572 */ 0x6B47,0x5D3C, + /* Array index: 0x1572 */ 0x6B49,0x5D3E, + /* Array index: 0x1572 */ 0x6B4C,0x324E, + /* Array index: 0x1572 */ 0x6B4E,0x4337, + /* Array index: 0x1572 */ 0x6B50,0x5D3F, + /* Array index: 0x1572 */ 0x6B53,0x343F, + /* Array index: 0x1572 */ 0x6B54,0x5D41, + /* Array index: 0x1572 */ 0x6B59,0x5D40, + /* Array index: 0x1572 */ 0x6B5B,0x5D42, + /* Array index: 0x1572 */ 0x6B6F,0x3B75, + /* Array index: 0x1572 */ 0x6B73,0x3A50, + /* Array index: 0x1572 */ 0x6B74,0x4E72, + /* Array index: 0x1572 */ 0x6B78,0x5D45, + /* Array index: 0x1572 */ 0x6B79,0x5D46, + /* Array index: 0x1572 */ 0x6B7B,0x3B60, + /* Array index: 0x1572 */ 0x6B7F,0x5D47, + /* Array index: 0x1572 */ 0x6B80,0x5D48, + /* Array index: 0x1572 */ 0x6B83,0x5D4A, + /* Array index: 0x1572 */ 0x6B84,0x5D49, + /* Array index: 0x1572 */ 0x6B86,0x4B58, + /* Array index: 0x1572 */ 0x6B95,0x5D4D, + /* Array index: 0x1572 */ 0x6B96,0x3F23, + /* Array index: 0x1572 */ 0x6B98,0x5D4C, + /* Array index: 0x1572 */ 0x6B9E,0x5D4E, + /* Array index: 0x1572 */ 0x6BA4,0x5D4F, + /* Array index: 0x1572 */ 0x6BAA,0x5D50, + /* Array index: 0x1572 */ 0x6BAB,0x5D51, + /* Array index: 0x1572 */ 0x6BC5,0x3523, + /* Array index: 0x1572 */ 0x6BC6,0x5D58, + /* Array index: 0x1572 */ 0x6BCB,0x5D59, + /* Array index: 0x1572 */ 0x6BCD,0x4A6C, + /* Array index: 0x1572 */ 0x6BCE,0x4B68, + /* Array index: 0x1572 */ 0x6BD8,0x487B, + /* Array index: 0x1572 */ 0x6BDB,0x4C53, + /* Array index: 0x1572 */ 0x6BDF,0x5D5B, + /* Array index: 0x1572 */ 0x6BEB,0x5D5D, + /* Array index: 0x1572 */ 0x6BEC,0x5D5C, + /* Array index: 0x1572 */ 0x6BEF,0x5D5F, + /* Array index: 0x1572 */ 0x6BF3,0x5D5E, + /* Array index: 0x1572 */ 0x6C08,0x5D61, + /* Array index: 0x1572 */ 0x6C0F,0x3B61, + /* Array index: 0x1572 */ 0x6C11,0x4C31, + /* Array index: 0x1572 */ 0x6C13,0x5D62, + /* Array index: 0x1572 */ 0x6C14,0x5D63, + /* Array index: 0x1572 */ 0x6C17,0x3524, + /* Array index: 0x1572 */ 0x6C1B,0x5D64, + /* Array index: 0x1572 */ 0x6C23,0x5D66, + /* Array index: 0x1572 */ 0x6C24,0x5D65, + /* Array index: 0x1572 */ 0x6C34,0x3F65, + /* Array index: 0x1572 */ 0x6C37,0x4939, + /* Array index: 0x1572 */ 0x6C38,0x314A, + /* Array index: 0x1572 */ 0x6C4E,0x4846, + /* Array index: 0x1572 */ 0x6C50,0x3C2E, + /* Array index: 0x1572 */ 0x6C55,0x5D68, + /* Array index: 0x1572 */ 0x6C57,0x3440, + /* Array index: 0x1572 */ 0x6C5A,0x3178, + /* Array index: 0x1572 */ 0x6C68,0x5D71, + /* Array index: 0x1572 */ 0x6C6A,0x5D6A, + /* Array index: 0x1572 */ 0x6C70,0x4241, + /* Array index: 0x1572 */ 0x6C72,0x3562, + /* Array index: 0x1572 */ 0x6C73,0x5D72, + /* Array index: 0x1572 */ 0x6C7A,0x3768, + /* Array index: 0x1572 */ 0x6C88,0x4440, + /* Array index: 0x1572 */ 0x6C8C,0x4659, + /* Array index: 0x1572 */ 0x6C8D,0x5D6C, + /* Array index: 0x1572 */ 0x6C90,0x5D74, + /* Array index: 0x1572 */ 0x6C92,0x5D73, + /* Array index: 0x1572 */ 0x6C93,0x3723, + /* Array index: 0x1572 */ 0x6C96,0x322D, + /* Array index: 0x1572 */ 0x6CA1,0x4B57, + /* Array index: 0x1572 */ 0x6CA2,0x4274, + /* Array index: 0x1572 */ 0x6CAB,0x4B77, + /* Array index: 0x1572 */ 0x6CAE,0x5D7C, + /* Array index: 0x1572 */ 0x6CB1,0x5D7D, + /* Array index: 0x1572 */ 0x6CB3,0x324F, + /* Array index: 0x1572 */ 0x6CC9,0x4074, + /* Array index: 0x1572 */ 0x6CCA,0x4771, + /* Array index: 0x1572 */ 0x6CCC,0x4867, + /* Array index: 0x1572 */ 0x6CD3,0x5D77, + /* Array index: 0x1572 */ 0x6CD5,0x4B21, + /* Array index: 0x1572 */ 0x6CD7,0x5D79, + /* Array index: 0x1572 */ 0x6CD9,0x5E24, + /* Array index: 0x1572 */ 0x6CDB,0x5E22, + /* Array index: 0x1572 */ 0x6CDD,0x5D7B, + /* Array index: 0x1572 */ 0x6CE8,0x436D, + /* Array index: 0x1572 */ 0x6CEA,0x5E25, + /* Array index: 0x1572 */ 0x6D0B,0x4D4E, + /* Array index: 0x1572 */ 0x6D0C,0x5E30, + /* Array index: 0x1572 */ 0x6D12,0x5E2F, + /* Array index: 0x1572 */ 0x6D17,0x4076, + /* Array index: 0x1572 */ 0x6D19,0x5E2C, + /* Array index: 0x1572 */ 0x6D1B,0x4D6C, + /* Array index: 0x1572 */ 0x6D1E,0x4636, + /* Array index: 0x1572 */ 0x6D1F,0x5E26, + /* Array index: 0x1572 */ 0x6D25,0x4445, + /* Array index: 0x1572 */ 0x6D3B,0x3368, + /* Array index: 0x1572 */ 0x6D3D,0x5E2A, + /* Array index: 0x1572 */ 0x6D3E,0x4749, + /* Array index: 0x1572 */ 0x6D41,0x4E2E, + /* Array index: 0x1572 */ 0x6D44,0x3E74, + /* Array index: 0x1572 */ 0x6D45,0x4075, + /* Array index: 0x1572 */ 0x6D59,0x5E36, + /* Array index: 0x1572 */ 0x6D5A,0x5E34, + /* Array index: 0x1572 */ 0x6D5C,0x494D, + /* Array index: 0x1572 */ 0x6D63,0x5E31, + /* Array index: 0x1572 */ 0x6D64,0x5E33, + /* Array index: 0x1572 */ 0x6D66,0x313A, + /* Array index: 0x1572 */ 0x6D69,0x3940, + /* Array index: 0x1572 */ 0x6D6A,0x4F32, + /* Array index: 0x1572 */ 0x6D6C,0x333D, + /* Array index: 0x1572 */ 0x6D6E,0x4962, + /* Array index: 0x1572 */ 0x6D74,0x4D61, + /* Array index: 0x1572 */ 0x6D85,0x5E3A, + /* Array index: 0x1572 */ 0x6D88,0x3E43, + /* Array index: 0x1572 */ 0x6D8C,0x4D30, + /* Array index: 0x1572 */ 0x6D8E,0x5E37, + /* Array index: 0x1572 */ 0x6D93,0x5E32, + /* Array index: 0x1572 */ 0x6D95,0x5E38, + /* Array index: 0x1572 */ 0x6D99,0x4E5E, + /* Array index: 0x1572 */ 0x6D9B,0x4573, + /* Array index: 0x1572 */ 0x6D9C,0x4642, + /* Array index: 0x1572 */ 0x6DAF,0x3336, + /* Array index: 0x1572 */ 0x6DB2,0x3155, + /* Array index: 0x1572 */ 0x6DB5,0x5E3E, + /* Array index: 0x1572 */ 0x6DB8,0x5E41, + /* Array index: 0x1572 */ 0x6DBC,0x4E43, + /* Array index: 0x1572 */ 0x6DC0,0x4D64, + /* Array index: 0x1572 */ 0x6DCB,0x4E54, + /* Array index: 0x1572 */ 0x6DCC,0x5E45, + /* Array index: 0x1572 */ 0x6DD1,0x3D4A, + /* Array index: 0x1572 */ 0x6DD2,0x5E47, + /* Array index: 0x1572 */ 0x6DD5,0x5E4C, + /* Array index: 0x1572 */ 0x6DD8,0x4571, + /* Array index: 0x1572 */ 0x6DD9,0x5E4A, + /* Array index: 0x1572 */ 0x6DDE,0x5E44, + /* Array index: 0x1572 */ 0x6DE1,0x4338, + /* Array index: 0x1572 */ 0x6DE4,0x5E4B, + /* Array index: 0x1572 */ 0x6DE6,0x5E40, + /* Array index: 0x1572 */ 0x6DF1,0x3F3C, + /* Array index: 0x1572 */ 0x6DF3,0x3D5F, + /* Array index: 0x1572 */ 0x6DF5,0x4A25, + /* Array index: 0x1572 */ 0x6E13,0x374C, + /* Array index: 0x1572 */ 0x6E15,0x5E3C, + /* Array index: 0x1572 */ 0x6E38,0x5E62, + /* Array index: 0x1572 */ 0x6E3A,0x5E5D, + /* Array index: 0x1572 */ 0x6E3E,0x5E55, + /* Array index: 0x1572 */ 0x6E43,0x5E5C, + /* Array index: 0x1572 */ 0x6E4A,0x4C2B, + /* Array index: 0x1572 */ 0x6E4D,0x5E5A, + /* Array index: 0x1572 */ 0x6E4E,0x5E5E, + /* Array index: 0x1572 */ 0x6E56,0x3850, + /* Array index: 0x1572 */ 0x6E58,0x3E45, + /* Array index: 0x1572 */ 0x6E5B,0x4339, + /* Array index: 0x1572 */ 0x6E5F,0x5E54, + /* Array index: 0x1572 */ 0x6E67,0x4D2F, + /* Array index: 0x1572 */ 0x6E6B,0x5E57, + /* Array index: 0x1572 */ 0x6E6E,0x5E50, + /* Array index: 0x1572 */ 0x6E6F,0x4572, + /* Array index: 0x1572 */ 0x6E72,0x5E53, + /* Array index: 0x1572 */ 0x6E76,0x5E59, + /* Array index: 0x1572 */ 0x6E8C,0x482E, + /* Array index: 0x1572 */ 0x6E8F,0x5E6F, + /* Array index: 0x1572 */ 0x6E90,0x383B, + /* Array index: 0x1572 */ 0x6E96,0x3D60, + /* Array index: 0x1572 */ 0x6E98,0x5E65, + /* Array index: 0x1572 */ 0x6E9C,0x4E2F, + /* Array index: 0x1572 */ 0x6E9D,0x3942, + /* Array index: 0x1572 */ 0x6E9F,0x5E72, + /* Array index: 0x1572 */ 0x6EA2,0x306E, + /* Array index: 0x1572 */ 0x6EA5,0x5E70, + /* Array index: 0x1572 */ 0x6EAA,0x5E64, + /* Array index: 0x1572 */ 0x6EAF,0x5E6A, + /* Array index: 0x1572 */ 0x6EB2,0x5E6C, + /* Array index: 0x1572 */ 0x6EB6,0x4D4F, + /* Array index: 0x1572 */ 0x6EB7,0x5E67, + /* Array index: 0x1572 */ 0x6EBA,0x452E, + /* Array index: 0x1572 */ 0x6EBD,0x5E69, + /* Array index: 0x1572 */ 0x6EC2,0x5E71, + /* Array index: 0x1572 */ 0x6EC4,0x5E6B, + /* Array index: 0x1572 */ 0x6EC5,0x4C47, + /* Array index: 0x1572 */ 0x6EC9,0x5E66, + /* Array index: 0x1572 */ 0x6ECB,0x3C22, + /* Array index: 0x1572 */ 0x6ECC,0x5E7E, + /* Array index: 0x1572 */ 0x6EDD,0x426C, + /* Array index: 0x1572 */ 0x6EDE,0x425A, + /* Array index: 0x1572 */ 0x6EEC,0x5E76, + /* Array index: 0x1572 */ 0x6EEF,0x5E7C, + /* Array index: 0x1572 */ 0x6EF2,0x5E7A, + /* Array index: 0x1572 */ 0x6EF4,0x4529, + /* Array index: 0x1572 */ 0x6EF7,0x5F23, + /* Array index: 0x1572 */ 0x6EF8,0x5E77, + /* Array index: 0x1572 */ 0x6F06,0x3C3F, + /* Array index: 0x1572 */ 0x6F09,0x3977, + /* Array index: 0x1572 */ 0x6F0F,0x4F33, + /* Array index: 0x1572 */ 0x6F20,0x4779, + /* Array index: 0x1572 */ 0x6F22,0x3441, + /* Array index: 0x1572 */ 0x6F23,0x4E7A, + /* Array index: 0x1572 */ 0x6F2B,0x4C21, + /* Array index: 0x1572 */ 0x6F2C,0x4452, + /* Array index: 0x1572 */ 0x6F31,0x5E7B, + /* Array index: 0x1572 */ 0x6F32,0x5E7D, + /* Array index: 0x1572 */ 0x6F38,0x4132, + /* Array index: 0x1572 */ 0x6F3E,0x5F21, + /* Array index: 0x1572 */ 0x6F3F,0x5E79, + /* Array index: 0x1572 */ 0x6F41,0x5E73, + /* Array index: 0x1572 */ 0x6F45,0x3443, + /* Array index: 0x1572 */ 0x6F54,0x3769, + /* Array index: 0x1572 */ 0x6F58,0x5F2F, + /* Array index: 0x1572 */ 0x6F5B,0x5F2A, + /* Array index: 0x1572 */ 0x6F5C,0x4078, + /* Array index: 0x1572 */ 0x6F5F,0x3363, + /* Array index: 0x1572 */ 0x6F64,0x3D61, + /* Array index: 0x1572 */ 0x6F66,0x5F33, + /* Array index: 0x1572 */ 0x6F74,0x5F4C, + /* Array index: 0x1572 */ 0x6F78,0x5F26, + /* Array index: 0x1572 */ 0x6F7A,0x5F25, + /* Array index: 0x1572 */ 0x6F7C,0x5F2E, + /* Array index: 0x1572 */ 0x6F8E,0x5F30, + /* Array index: 0x1572 */ 0x6F91,0x5F31, + /* Array index: 0x1572 */ 0x6F97,0x3442, + /* Array index: 0x1572 */ 0x6FA1,0x5F36, + /* Array index: 0x1572 */ 0x6FA3,0x5F35, + /* Array index: 0x1572 */ 0x6FA4,0x5F37, + /* Array index: 0x1572 */ 0x6FAA,0x5F3A, + /* Array index: 0x1572 */ 0x6FB1,0x4543, + /* Array index: 0x1572 */ 0x6FB3,0x5F34, + /* Array index: 0x1572 */ 0x6FB9,0x5F38, + /* Array index: 0x1572 */ 0x6FC6,0x5F39, + /* Array index: 0x1572 */ 0x6FD4,0x5F3E, + /* Array index: 0x1572 */ 0x6FD5,0x5F3C, + /* Array index: 0x1572 */ 0x6FD8,0x5F3F, + /* Array index: 0x1572 */ 0x6FDB,0x5F42, + /* Array index: 0x1572 */ 0x6FE4,0x5E39, + /* Array index: 0x1572 */ 0x6FF6,0x6F69, + /* Array index: 0x1572 */ 0x6FFA,0x5F45, + /* Array index: 0x1572 */ 0x6FFE,0x5F49, + /* Array index: 0x1572 */ 0x7001,0x5F47, + /* Array index: 0x1572 */ 0x7009,0x5F43, + /* Array index: 0x1572 */ 0x700B,0x5F44, + /* Array index: 0x1572 */ 0x700F,0x5F48, + /* Array index: 0x1572 */ 0x7011,0x5F46, + /* Array index: 0x1572 */ 0x7015,0x494E, + /* Array index: 0x1572 */ 0x7018,0x5F4E, + /* Array index: 0x1572 */ 0x7026,0x4375, + /* Array index: 0x1572 */ 0x7027,0x426D, + /* Array index: 0x1572 */ 0x702C,0x4025, + /* Array index: 0x1572 */ 0x7030,0x5F50, + /* Array index: 0x1572 */ 0x7032,0x5F52, + /* Array index: 0x1572 */ 0x703E,0x5F51, + /* Array index: 0x1572 */ 0x704C,0x5E75, + /* Array index: 0x1572 */ 0x7051,0x5F53, + /* Array index: 0x1572 */ 0x7058,0x4667, + /* Array index: 0x1572 */ 0x7063,0x5F54, + /* Array index: 0x1572 */ 0x706B,0x3250, + /* Array index: 0x1572 */ 0x706F,0x4574, + /* Array index: 0x1572 */ 0x7070,0x3325, + /* Array index: 0x1572 */ 0x7078,0x3564, + /* Array index: 0x1572 */ 0x707C,0x3C5E, + /* Array index: 0x1572 */ 0x707D,0x3A52, + /* Array index: 0x1572 */ 0x7089,0x4F27, + /* Array index: 0x1572 */ 0x708A,0x3F66, + /* Array index: 0x1572 */ 0x708E,0x316A, + /* Array index: 0x1572 */ 0x7092,0x5F56, + /* Array index: 0x1572 */ 0x7099,0x5F55, + /* Array index: 0x1572 */ 0x70B3,0x5F5B, + /* Array index: 0x1572 */ 0x70C8,0x4E75, + /* Array index: 0x1572 */ 0x70CB,0x5F5E, + /* Array index: 0x1572 */ 0x70CF,0x3128, + /* Array index: 0x1572 */ 0x70D9,0x5F60, + /* Array index: 0x1572 */ 0x70DD,0x5F5F, + /* Array index: 0x1572 */ 0x70DF,0x5F5D, + /* Array index: 0x1572 */ 0x70F1,0x5F58, + /* Array index: 0x1572 */ 0x70F9,0x4B23, + /* Array index: 0x1572 */ 0x70FD,0x5F62, + /* Array index: 0x1572 */ 0x7109,0x5F61, + /* Array index: 0x1572 */ 0x7114,0x316B, + /* Array index: 0x1572 */ 0x7119,0x5F64, + /* Array index: 0x1572 */ 0x711A,0x4A32, + /* Array index: 0x1572 */ 0x711C,0x5F63, + /* Array index: 0x1572 */ 0x7121,0x4C35, + /* Array index: 0x1572 */ 0x7126,0x3E47, + /* Array index: 0x1572 */ 0x7136,0x4133, + /* Array index: 0x1572 */ 0x713C,0x3E46, + /* Array index: 0x1572 */ 0x7149,0x4E7B, + /* Array index: 0x1572 */ 0x714C,0x5F6A, + /* Array index: 0x1572 */ 0x714E,0x4079, + /* Array index: 0x1572 */ 0x7155,0x5F66, + /* Array index: 0x1572 */ 0x7156,0x5F6B, + /* Array index: 0x1572 */ 0x7159,0x316C, + /* Array index: 0x1572 */ 0x716C,0x5F6C, + /* Array index: 0x1572 */ 0x716E,0x3C51, + /* Array index: 0x1572 */ 0x717D,0x407A, + /* Array index: 0x1572 */ 0x7184,0x5F6F, + /* Array index: 0x1572 */ 0x7188,0x5F67, + /* Array index: 0x1572 */ 0x718A,0x3727, + /* Array index: 0x1572 */ 0x718F,0x5F6D, + /* Array index: 0x1572 */ 0x7194,0x4D50, + /* Array index: 0x1572 */ 0x7195,0x5F70, + /* Array index: 0x1572 */ 0x7199,0x7426, + /* Array index: 0x1572 */ 0x719F,0x3D4F, + /* Array index: 0x1572 */ 0x71A8,0x5F71, + /* Array index: 0x1572 */ 0x71AC,0x5F72, + /* Array index: 0x1572 */ 0x71B1,0x472E, + /* Array index: 0x1572 */ 0x71B9,0x5F74, + /* Array index: 0x1572 */ 0x71BE,0x5F75, + /* Array index: 0x1572 */ 0x71C3,0x4733, + /* Array index: 0x1572 */ 0x71C8,0x4575, + /* Array index: 0x1572 */ 0x71C9,0x5F77, + /* Array index: 0x1572 */ 0x71CE,0x5F79, + /* Array index: 0x1572 */ 0x71D0,0x4E55, + /* Array index: 0x1572 */ 0x71D2,0x5F76, + /* Array index: 0x1572 */ 0x71D4,0x5F78, + /* Array index: 0x1572 */ 0x71D5,0x316D, + /* Array index: 0x1572 */ 0x71D7,0x5F73, + /* Array index: 0x1572 */ 0x71DF,0x535B, + /* Array index: 0x1572 */ 0x71E0,0x5F7A, + /* Array index: 0x1572 */ 0x71F5,0x5F7D, + /* Array index: 0x1572 */ 0x71F9,0x6021, + /* Array index: 0x1572 */ 0x71FB,0x5F6E, + /* Array index: 0x1572 */ 0x71FC,0x5F7E, + /* Array index: 0x1572 */ 0x71FF,0x6022, + /* Array index: 0x1572 */ 0x7206,0x477A, + /* Array index: 0x1572 */ 0x720D,0x6023, + /* Array index: 0x1572 */ 0x7210,0x6024, + /* Array index: 0x1572 */ 0x721B,0x6025, + /* Array index: 0x1572 */ 0x7228,0x6026, + /* Array index: 0x1572 */ 0x722A,0x445E, + /* Array index: 0x1572 */ 0x722C,0x6028, + /* Array index: 0x1572 */ 0x722D,0x6027, + /* Array index: 0x1572 */ 0x7230,0x6029, + /* Array index: 0x1572 */ 0x7232,0x602A, + /* Array index: 0x1572 */ 0x7235,0x3C5F, + /* Array index: 0x1572 */ 0x7236,0x4963, + /* Array index: 0x1572 */ 0x7252,0x442D, + /* Array index: 0x1572 */ 0x7258,0x6031, + /* Array index: 0x1572 */ 0x7259,0x3267, + /* Array index: 0x1572 */ 0x725B,0x356D, + /* Array index: 0x1572 */ 0x725D,0x4C46, + /* Array index: 0x1572 */ 0x725F,0x4C36, + /* Array index: 0x1572 */ 0x7261,0x3234, + /* Array index: 0x1572 */ 0x7262,0x4F34, + /* Array index: 0x1572 */ 0x7267,0x4B52, + /* Array index: 0x1572 */ 0x7269,0x4A2A, + /* Array index: 0x1572 */ 0x7272,0x4037, + /* Array index: 0x1572 */ 0x7274,0x6032, + /* Array index: 0x1572 */ 0x7279,0x4643, + /* Array index: 0x1572 */ 0x7287,0x6036, + /* Array index: 0x1572 */ 0x7292,0x6037, + /* Array index: 0x1572 */ 0x7296,0x6038, + /* Array index: 0x1572 */ 0x72A0,0x353E, + /* Array index: 0x1572 */ 0x72A2,0x6039, + /* Array index: 0x1572 */ 0x72A7,0x603A, + /* Array index: 0x1572 */ 0x72AC,0x3824, + /* Array index: 0x1572 */ 0x72AF,0x4848, + /* Array index: 0x1572 */ 0x72B2,0x603C, + /* Array index: 0x1572 */ 0x72B6,0x3E75, + /* Array index: 0x1572 */ 0x72B9,0x603B, + /* Array index: 0x1572 */ 0x72CE,0x6040, + /* Array index: 0x1572 */ 0x72D0,0x3851, + /* Array index: 0x1572 */ 0x72D2,0x6041, + /* Array index: 0x1572 */ 0x72D7,0x3669, + /* Array index: 0x1572 */ 0x72D9,0x4140, + /* Array index: 0x1572 */ 0x72DB,0x397D, + /* Array index: 0x1572 */ 0x72E9,0x3C6D, + /* Array index: 0x1572 */ 0x72EC,0x4648, + /* Array index: 0x1572 */ 0x72ED,0x3639, + /* Array index: 0x1572 */ 0x730A,0x6049, + /* Array index: 0x1572 */ 0x7316,0x604B, + /* Array index: 0x1572 */ 0x7317,0x6048, + /* Array index: 0x1572 */ 0x7325,0x6050, + /* Array index: 0x1572 */ 0x7334,0x604D, + /* Array index: 0x1572 */ 0x7336,0x4D31, + /* Array index: 0x1572 */ 0x7337,0x4D32, + /* Array index: 0x1572 */ 0x733E,0x6051, + /* Array index: 0x1572 */ 0x733F,0x316E, + /* Array index: 0x1572 */ 0x7344,0x3976, + /* Array index: 0x1572 */ 0x7345,0x3B62, + /* Array index: 0x1572 */ 0x734E,0x6052, + /* Array index: 0x1572 */ 0x734F,0x6053, + /* Array index: 0x1572 */ 0x7357,0x6055, + /* Array index: 0x1572 */ 0x7363,0x3D43, + /* Array index: 0x1572 */ 0x7368,0x6057, + /* Array index: 0x1572 */ 0x736A,0x6056, + /* Array index: 0x1572 */ 0x7370,0x6058, + /* Array index: 0x1572 */ 0x7372,0x334D, + /* Array index: 0x1572 */ 0x7375,0x605A, + /* Array index: 0x1572 */ 0x7378,0x6059, + /* Array index: 0x1572 */ 0x737A,0x605C, + /* Array index: 0x1572 */ 0x737B,0x605B, + /* Array index: 0x1572 */ 0x7384,0x383C, + /* Array index: 0x1572 */ 0x7387,0x4E28, + /* Array index: 0x1572 */ 0x7389,0x364C, + /* Array index: 0x1572 */ 0x738B,0x3226, + /* Array index: 0x1572 */ 0x7396,0x366A, + /* Array index: 0x1572 */ 0x73A9,0x3461, + /* Array index: 0x1572 */ 0x73B2,0x4E68, + /* Array index: 0x1572 */ 0x73B3,0x605E, + /* Array index: 0x1572 */ 0x73BB,0x6060, + /* Array index: 0x1572 */ 0x73C0,0x6061, + /* Array index: 0x1572 */ 0x73C2,0x3251, + /* Array index: 0x1572 */ 0x73C8,0x605D, + /* Array index: 0x1572 */ 0x73CA,0x3B39, + /* Array index: 0x1572 */ 0x73CD,0x4441, + /* Array index: 0x1572 */ 0x73CE,0x605F, + /* Array index: 0x1572 */ 0x73DE,0x6064, + /* Array index: 0x1572 */ 0x73E0,0x3C6E, + /* Array index: 0x1572 */ 0x73E5,0x6062, + /* Array index: 0x1572 */ 0x73EA,0x373E, + /* Array index: 0x1572 */ 0x73ED,0x4849, + /* Array index: 0x1572 */ 0x73EE,0x6063, + /* Array index: 0x1572 */ 0x73F1,0x607E, + /* Array index: 0x1572 */ 0x73F8,0x6069, + /* Array index: 0x1572 */ 0x73FE,0x383D, + /* Array index: 0x1572 */ 0x7403,0x3565, + /* Array index: 0x1572 */ 0x7405,0x6066, + /* Array index: 0x1572 */ 0x7406,0x4D7D, + /* Array index: 0x1572 */ 0x7409,0x4E30, + /* Array index: 0x1572 */ 0x7422,0x4276, + /* Array index: 0x1572 */ 0x7425,0x6068, + /* Array index: 0x1572 */ 0x743A,0x606B, + /* Array index: 0x1572 */ 0x743F,0x606D, + /* Array index: 0x1572 */ 0x7441,0x6070, + /* Array index: 0x1572 */ 0x7455,0x606C, + /* Array index: 0x1572 */ 0x7469,0x6072, + /* Array index: 0x1572 */ 0x746A,0x6075, + /* Array index: 0x1572 */ 0x746F,0x6067, + /* Array index: 0x1572 */ 0x7470,0x6073, + /* Array index: 0x1572 */ 0x7473,0x3A3C, + /* Array index: 0x1572 */ 0x7476,0x6076, + /* Array index: 0x1572 */ 0x747E,0x6077, + /* Array index: 0x1572 */ 0x7483,0x4D7E, + /* Array index: 0x1572 */ 0x748B,0x6078, + /* Array index: 0x1572 */ 0x749E,0x6079, + /* Array index: 0x1572 */ 0x74A2,0x6065, + /* Array index: 0x1572 */ 0x74A7,0x607A, + /* Array index: 0x1572 */ 0x74B0,0x3444, + /* Array index: 0x1572 */ 0x74BD,0x3C25, + /* Array index: 0x1572 */ 0x74CA,0x607B, + /* Array index: 0x1572 */ 0x74CF,0x607C, + /* Array index: 0x1572 */ 0x74D4,0x607D, + /* Array index: 0x1572 */ 0x74DC,0x313B, + /* Array index: 0x1572 */ 0x74E0,0x6121, + /* Array index: 0x1572 */ 0x74E2,0x493B, + /* Array index: 0x1572 */ 0x74E3,0x6122, + /* Array index: 0x1572 */ 0x74E6,0x3424, + /* Array index: 0x1572 */ 0x74E7,0x6123, + /* Array index: 0x1572 */ 0x74E9,0x6124, + /* Array index: 0x1572 */ 0x7511,0x3979, + /* Array index: 0x1572 */ 0x7513,0x6132, + /* Array index: 0x1572 */ 0x7515,0x6131, + /* Array index: 0x1572 */ 0x7518,0x3445, + /* Array index: 0x1572 */ 0x751A,0x3F53, + /* Array index: 0x1572 */ 0x751C,0x453C, + /* Array index: 0x1572 */ 0x751E,0x6133, + /* Array index: 0x1572 */ 0x751F,0x4038, + /* Array index: 0x1572 */ 0x7523,0x3B3A, + /* Array index: 0x1572 */ 0x7525,0x3179, + /* Array index: 0x1572 */ 0x7526,0x6134, + /* Array index: 0x1572 */ 0x7528,0x4D51, + /* Array index: 0x1572 */ 0x752B,0x4A63, + /* Array index: 0x1572 */ 0x752C,0x6135, + /* Array index: 0x1572 */ 0x7544,0x6137, + /* Array index: 0x1572 */ 0x7546,0x613C, + /* Array index: 0x1572 */ 0x7554,0x484A, + /* Array index: 0x1572 */ 0x7560,0x482B, + /* Array index: 0x1572 */ 0x7570,0x305B, + /* Array index: 0x1572 */ 0x757F,0x3526, + /* Array index: 0x1572 */ 0x7582,0x614A, + /* Array index: 0x1572 */ 0x7594,0x614B, + /* Array index: 0x1572 */ 0x759A,0x614C, + /* Array index: 0x1572 */ 0x759D,0x614D, + /* Array index: 0x1572 */ 0x75A3,0x614F, + /* Array index: 0x1572 */ 0x75A5,0x614E, + /* Array index: 0x1572 */ 0x75AB,0x3156, + /* Array index: 0x1572 */ 0x75C2,0x6150, + /* Array index: 0x1572 */ 0x75C3,0x6152, + /* Array index: 0x1572 */ 0x75C5,0x4942, + /* Array index: 0x1572 */ 0x75C7,0x3E49, + /* Array index: 0x1572 */ 0x75CA,0x6159, + /* Array index: 0x1572 */ 0x75CD,0x6158, + /* Array index: 0x1572 */ 0x75D2,0x615A, + /* Array index: 0x1572 */ 0x75D4,0x3C26, + /* Array index: 0x1572 */ 0x75D5,0x3A2F, + /* Array index: 0x1572 */ 0x75D8,0x4577, + /* Array index: 0x1572 */ 0x75D9,0x615B, + /* Array index: 0x1572 */ 0x75DB,0x444B, + /* Array index: 0x1572 */ 0x75DE,0x615D, + /* Array index: 0x1572 */ 0x75E2,0x4E21, + /* Array index: 0x1572 */ 0x75E3,0x615C, + /* Array index: 0x1572 */ 0x75E9,0x4169, + /* Array index: 0x1572 */ 0x75FA,0x6163, + /* Array index: 0x1572 */ 0x75FC,0x6160, + /* Array index: 0x1572 */ 0x75FE,0x615E, + /* Array index: 0x1572 */ 0x75FF,0x615F, + /* Array index: 0x1572 */ 0x7601,0x6161, + /* Array index: 0x1572 */ 0x7609,0x6168, + /* Array index: 0x1572 */ 0x760B,0x6166, + /* Array index: 0x1572 */ 0x760D,0x6167, + /* Array index: 0x1572 */ 0x7627,0x616A, + /* Array index: 0x1572 */ 0x7630,0x6170, + /* Array index: 0x1572 */ 0x7634,0x616F, + /* Array index: 0x1572 */ 0x763B,0x6171, + /* Array index: 0x1572 */ 0x7642,0x4E45, + /* Array index: 0x1572 */ 0x764C,0x3462, + /* Array index: 0x1572 */ 0x7652,0x4C7E, + /* Array index: 0x1572 */ 0x7656,0x4A4A, + /* Array index: 0x1572 */ 0x7658,0x6176, + /* Array index: 0x1572 */ 0x765C,0x6175, + /* Array index: 0x1572 */ 0x7661,0x6177, + /* Array index: 0x1572 */ 0x7662,0x6178, + /* Array index: 0x1572 */ 0x7670,0x617E, + /* Array index: 0x1572 */ 0x7672,0x6221, + /* Array index: 0x1572 */ 0x7676,0x6222, + /* Array index: 0x1572 */ 0x768B,0x6228, + /* Array index: 0x1572 */ 0x768E,0x6229, + /* Array index: 0x1572 */ 0x7690,0x3B29, + /* Array index: 0x1572 */ 0x7693,0x622B, + /* Array index: 0x1572 */ 0x7696,0x622A, + /* Array index: 0x1572 */ 0x7699,0x622C, + /* Array index: 0x1572 */ 0x769A,0x622D, + /* Array index: 0x1572 */ 0x76AE,0x4869, + /* Array index: 0x1572 */ 0x76B0,0x622E, + /* Array index: 0x1572 */ 0x76B4,0x622F, + /* Array index: 0x1572 */ 0x76BF,0x3B2E, + /* Array index: 0x1572 */ 0x76C2,0x6233, + /* Array index: 0x1572 */ 0x76C3,0x4756, + /* Array index: 0x1572 */ 0x76C6,0x4B5F, + /* Array index: 0x1572 */ 0x76C8,0x314E, + /* Array index: 0x1572 */ 0x76CA,0x3157, + /* Array index: 0x1572 */ 0x76CD,0x6234, + /* Array index: 0x1572 */ 0x76D2,0x6236, + /* Array index: 0x1572 */ 0x76D6,0x6235, + /* Array index: 0x1572 */ 0x76D7,0x4570, + /* Array index: 0x1572 */ 0x76EA,0x623B, + /* Array index: 0x1572 */ 0x76EE,0x4C5C, + /* Array index: 0x1572 */ 0x76F2,0x4C55, + /* Array index: 0x1572 */ 0x76F4,0x443E, + /* Array index: 0x1572 */ 0x76F8,0x416A, + /* Array index: 0x1572 */ 0x76FB,0x623D, + /* Array index: 0x1572 */ 0x76FE,0x3D62, + /* Array index: 0x1572 */ 0x7701,0x3E4A, + /* Array index: 0x1572 */ 0x7704,0x6240, + /* Array index: 0x1572 */ 0x771B,0x6246, + /* Array index: 0x1572 */ 0x7729,0x6241, + /* Array index: 0x1572 */ 0x7737,0x6247, + /* Array index: 0x1572 */ 0x7738,0x6248, + /* Array index: 0x1572 */ 0x773A,0x442F, + /* Array index: 0x1572 */ 0x773C,0x3463, + /* Array index: 0x1572 */ 0x7740,0x4365, + /* Array index: 0x1572 */ 0x7747,0x6249, + /* Array index: 0x1572 */ 0x775A,0x624A, + /* Array index: 0x1572 */ 0x775B,0x624D, + /* Array index: 0x1572 */ 0x7761,0x3F67, + /* Array index: 0x1572 */ 0x7763,0x4644, + /* Array index: 0x1572 */ 0x7765,0x624E, + /* Array index: 0x1572 */ 0x7766,0x4B53, + /* Array index: 0x1572 */ 0x7768,0x624B, + /* Array index: 0x1572 */ 0x776B,0x624C, + /* Array index: 0x1572 */ 0x7779,0x6251, + /* Array index: 0x1572 */ 0x777E,0x6250, + /* Array index: 0x1572 */ 0x777F,0x624F, + /* Array index: 0x1572 */ 0x778B,0x6253, + /* Array index: 0x1572 */ 0x778E,0x6252, + /* Array index: 0x1572 */ 0x7791,0x6254, + /* Array index: 0x1572 */ 0x779E,0x6256, + /* Array index: 0x1572 */ 0x77A0,0x6255, + /* Array index: 0x1572 */ 0x77A5,0x4A4D, + /* Array index: 0x1572 */ 0x77AC,0x3D56, + /* Array index: 0x1572 */ 0x77AD,0x4E46, + /* Array index: 0x1572 */ 0x77B0,0x6257, + /* Array index: 0x1572 */ 0x77B3,0x4637, + /* Array index: 0x1572 */ 0x77B6,0x6258, + /* Array index: 0x1572 */ 0x77C7,0x625E, + /* Array index: 0x1572 */ 0x77CD,0x625F, + /* Array index: 0x1572 */ 0x77D7,0x6260, + /* Array index: 0x1572 */ 0x77E2,0x4C70, + /* Array index: 0x1572 */ 0x77E3,0x6263, + /* Array index: 0x1572 */ 0x77E5,0x434E, + /* Array index: 0x1572 */ 0x77E7,0x476A, + /* Array index: 0x1572 */ 0x77E9,0x366B, + /* Array index: 0x1572 */ 0x77F3,0x4050, + /* Array index: 0x1572 */ 0x77FC,0x6265, + /* Array index: 0x1572 */ 0x7802,0x3A3D, + /* Array index: 0x1572 */ 0x780C,0x6266, + /* Array index: 0x1572 */ 0x7812,0x6267, + /* Array index: 0x1572 */ 0x7814,0x3826, + /* Array index: 0x1572 */ 0x7815,0x3A55, + /* Array index: 0x1572 */ 0x7820,0x6269, + /* Array index: 0x1572 */ 0x7832,0x4B24, + /* Array index: 0x1572 */ 0x7834,0x474B, + /* Array index: 0x1572 */ 0x783A,0x4557, + /* Array index: 0x1572 */ 0x783F,0x395C, + /* Array index: 0x1572 */ 0x7845,0x626B, + /* Array index: 0x1572 */ 0x785D,0x3E4B, + /* Array index: 0x1572 */ 0x786B,0x4E32, + /* Array index: 0x1572 */ 0x786C,0x3945, + /* Array index: 0x1572 */ 0x786F,0x3827, + /* Array index: 0x1572 */ 0x7872,0x4823, + /* Array index: 0x1572 */ 0x7874,0x626D, + /* Array index: 0x1572 */ 0x787C,0x626F, + /* Array index: 0x1572 */ 0x7881,0x386B, + /* Array index: 0x1572 */ 0x7886,0x626E, + /* Array index: 0x1572 */ 0x7887,0x4476, + /* Array index: 0x1572 */ 0x7891,0x486A, + /* Array index: 0x1572 */ 0x7893,0x3130, + /* Array index: 0x1572 */ 0x7895,0x3A6C, + /* Array index: 0x1572 */ 0x7897,0x4F52, + /* Array index: 0x1572 */ 0x789A,0x6270, + /* Array index: 0x1572 */ 0x78A3,0x6272, + /* Array index: 0x1572 */ 0x78A7,0x4A4B, + /* Array index: 0x1572 */ 0x78A9,0x4059, + /* Array index: 0x1572 */ 0x78AA,0x6274, + /* Array index: 0x1572 */ 0x78AF,0x6275, + /* Array index: 0x1572 */ 0x78B5,0x6273, + /* Array index: 0x1572 */ 0x78BA,0x334E, + /* Array index: 0x1572 */ 0x78BC,0x627B, + /* Array index: 0x1572 */ 0x78BE,0x627A, + /* Array index: 0x1572 */ 0x78C1,0x3C27, + /* Array index: 0x1572 */ 0x78C5,0x627C, + /* Array index: 0x1572 */ 0x78C6,0x6277, + /* Array index: 0x1572 */ 0x78CA,0x627D, + /* Array index: 0x1572 */ 0x78CB,0x6278, + /* Array index: 0x1572 */ 0x78D0,0x4858, + /* Array index: 0x1572 */ 0x78D1,0x6276, + /* Array index: 0x1572 */ 0x78D4,0x6279, + /* Array index: 0x1572 */ 0x78DA,0x6322, + /* Array index: 0x1572 */ 0x78E7,0x6321, + /* Array index: 0x1572 */ 0x78E8,0x4B61, + /* Array index: 0x1572 */ 0x78EC,0x627E, + /* Array index: 0x1572 */ 0x78EF,0x306B, + /* Array index: 0x1572 */ 0x78F4,0x6324, + /* Array index: 0x1572 */ 0x78FD,0x6323, + /* Array index: 0x1572 */ 0x7901,0x3E4C, + /* Array index: 0x1572 */ 0x7907,0x6325, + /* Array index: 0x1572 */ 0x790E,0x4143, + /* Array index: 0x1572 */ 0x7911,0x6327, + /* Array index: 0x1572 */ 0x7912,0x6326, + /* Array index: 0x1572 */ 0x7919,0x6328, + /* Array index: 0x1572 */ 0x7926,0x6268, + /* Array index: 0x1572 */ 0x793A,0x3C28, + /* Array index: 0x1572 */ 0x793C,0x4E69, + /* Array index: 0x1572 */ 0x793E,0x3C52, + /* Array index: 0x1572 */ 0x7940,0x632B, + /* Array index: 0x1572 */ 0x7941,0x3737, + /* Array index: 0x1572 */ 0x7950,0x4D34, + /* Array index: 0x1572 */ 0x795A,0x632F, + /* Array index: 0x1572 */ 0x7965,0x3E4D, + /* Array index: 0x1572 */ 0x7968,0x493C, + /* Array index: 0x1572 */ 0x796D,0x3A57, + /* Array index: 0x1572 */ 0x7977,0x4578, + /* Array index: 0x1572 */ 0x797A,0x6332, + /* Array index: 0x1572 */ 0x798A,0x6334, + /* Array index: 0x1572 */ 0x799D,0x6335, + /* Array index: 0x1572 */ 0x79A6,0x357A, + /* Array index: 0x1572 */ 0x79A7,0x6336, + /* Array index: 0x1572 */ 0x79AA,0x6338, + /* Array index: 0x1572 */ 0x79AE,0x6339, + /* Array index: 0x1572 */ 0x79B0,0x4729, + /* Array index: 0x1572 */ 0x79B3,0x633A, + /* Array index: 0x1572 */ 0x79C9,0x633D, + /* Array index: 0x1572 */ 0x79CB,0x3D29, + /* Array index: 0x1572 */ 0x79D1,0x324A, + /* Array index: 0x1572 */ 0x79D2,0x4943, + /* Array index: 0x1572 */ 0x79D5,0x633E, + /* Array index: 0x1572 */ 0x79D8,0x486B, + /* Array index: 0x1572 */ 0x79DF,0x4145, + /* Array index: 0x1572 */ 0x79E1,0x6341, + /* Array index: 0x1572 */ 0x79EC,0x6340, + /* Array index: 0x1572 */ 0x79F0,0x3E4E, + /* Array index: 0x1572 */ 0x79FB,0x305C, + /* Array index: 0x1572 */ 0x7A00,0x3529, + /* Array index: 0x1572 */ 0x7A08,0x6343, + /* Array index: 0x1572 */ 0x7A0B,0x4478, + /* Array index: 0x1572 */ 0x7A0D,0x6344, + /* Array index: 0x1572 */ 0x7A0E,0x4047, + /* Array index: 0x1572 */ 0x7A14,0x4C2D, + /* Array index: 0x1572 */ 0x7A2E,0x3C6F, + /* Array index: 0x1572 */ 0x7A31,0x634A, + /* Array index: 0x1572 */ 0x7A32,0x3070, + /* Array index: 0x1572 */ 0x7A37,0x634D, + /* Array index: 0x1572 */ 0x7A46,0x4B54, + /* Array index: 0x1572 */ 0x7A49,0x6350, + /* Array index: 0x1572 */ 0x7A57,0x634F, + /* Array index: 0x1572 */ 0x7A69,0x6353, + /* Array index: 0x1572 */ 0x7A6B,0x334F, + /* Array index: 0x1572 */ 0x7A70,0x6355, + /* Array index: 0x1572 */ 0x7A74,0x376A, + /* Array index: 0x1572 */ 0x7A76,0x3566, + /* Array index: 0x1572 */ 0x7A79,0x6356, + /* Array index: 0x1572 */ 0x7A7A,0x3675, + /* Array index: 0x1572 */ 0x7A7D,0x6357, + /* Array index: 0x1572 */ 0x7A7F,0x407C, + /* Array index: 0x1572 */ 0x7A81,0x464D, + /* Array index: 0x1572 */ 0x7A83,0x4060, + /* Array index: 0x1572 */ 0x7A84,0x3A75, + /* Array index: 0x1572 */ 0x7A88,0x6358, + /* Array index: 0x1572 */ 0x7A9F,0x3722, + /* Array index: 0x1572 */ 0x7AA9,0x635D, + /* Array index: 0x1572 */ 0x7AAA,0x3726, + /* Array index: 0x1572 */ 0x7AB6,0x6360, + /* Array index: 0x1572 */ 0x7ABA,0x312E, + /* Array index: 0x1572 */ 0x7ABF,0x6363, + /* Array index: 0x1572 */ 0x7AEA,0x4328, + /* Array index: 0x1572 */ 0x7AED,0x6371, + /* Array index: 0x1572 */ 0x7AEF,0x433C, + /* Array index: 0x1572 */ 0x7AF0,0x6372, + /* Array index: 0x1572 */ 0x7AFF,0x3448, + /* Array index: 0x1572 */ 0x7B02,0x6373, + /* Array index: 0x1572 */ 0x7B04,0x6422, + /* Array index: 0x1572 */ 0x7B06,0x6376, + /* Array index: 0x1572 */ 0x7B08,0x3568, + /* Array index: 0x1572 */ 0x7B0A,0x6375, + /* Array index: 0x1572 */ 0x7B0B,0x6424, + /* Array index: 0x1572 */ 0x7B0F,0x6374, + /* Array index: 0x1572 */ 0x7B11,0x3E50, + /* Array index: 0x1572 */ 0x7B18,0x6378, + /* Array index: 0x1572 */ 0x7B19,0x6379, + /* Array index: 0x1572 */ 0x7B1B,0x452B, + /* Array index: 0x1572 */ 0x7B1E,0x637A, + /* Array index: 0x1572 */ 0x7B20,0x335E, + /* Array index: 0x1572 */ 0x7B25,0x3F5A, + /* Array index: 0x1572 */ 0x7B26,0x4964, + /* Array index: 0x1572 */ 0x7B28,0x637C, + /* Array index: 0x1572 */ 0x7B2C,0x4268, + /* Array index: 0x1572 */ 0x7B33,0x6377, + /* Array index: 0x1572 */ 0x7B35,0x637B, + /* Array index: 0x1572 */ 0x7B36,0x637D, + /* Array index: 0x1572 */ 0x7B39,0x3A7B, + /* Array index: 0x1572 */ 0x7B5D,0x6438, + /* Array index: 0x1572 */ 0x7B65,0x6428, + /* Array index: 0x1572 */ 0x7B67,0x642A, + /* Array index: 0x1572 */ 0x7B6C,0x642D, + /* Array index: 0x1572 */ 0x7B6E,0x642E, + /* Array index: 0x1572 */ 0x7B70,0x642B, + /* Array index: 0x1572 */ 0x7B71,0x642C, + /* Array index: 0x1572 */ 0x7B74,0x6429, + /* Array index: 0x1572 */ 0x7B75,0x6427, + /* Array index: 0x1572 */ 0x7B7A,0x6421, + /* Array index: 0x1572 */ 0x7B86,0x4A4F, + /* Array index: 0x1572 */ 0x7B87,0x3255, + /* Array index: 0x1572 */ 0x7B8B,0x6435, + /* Array index: 0x1572 */ 0x7B8D,0x6432, + /* Array index: 0x1572 */ 0x7B8F,0x6437, + /* Array index: 0x1572 */ 0x7B92,0x6436, + /* Array index: 0x1572 */ 0x7BAA,0x433D, + /* Array index: 0x1572 */ 0x7BAD,0x407D, + /* Array index: 0x1572 */ 0x7BB1,0x4822, + /* Array index: 0x1572 */ 0x7BB4,0x643E, + /* Array index: 0x1572 */ 0x7BB8,0x4824, + /* Array index: 0x1572 */ 0x7BC0,0x4061, + /* Array index: 0x1572 */ 0x7BC1,0x643B, + /* Array index: 0x1572 */ 0x7BC4,0x484F, + /* Array index: 0x1572 */ 0x7BC6,0x643F, + /* Array index: 0x1572 */ 0x7BC7,0x4A53, + /* Array index: 0x1572 */ 0x7BC9,0x435B, + /* Array index: 0x1572 */ 0x7BCB,0x643A, + /* Array index: 0x1572 */ 0x7BCC,0x643C, + /* Array index: 0x1572 */ 0x7BCF,0x643D, + /* Array index: 0x1572 */ 0x7BDD,0x6440, + /* Array index: 0x1572 */ 0x7BE0,0x3C44, + /* Array index: 0x1572 */ 0x7BE9,0x6441, + /* Array index: 0x1572 */ 0x7BED,0x4F36, + /* Array index: 0x1572 */ 0x7BF3,0x644A, + /* Array index: 0x1572 */ 0x7BF6,0x644E, + /* Array index: 0x1572 */ 0x7BF7,0x644B, + /* Array index: 0x1572 */ 0x7C00,0x6447, + /* Array index: 0x1572 */ 0x7C07,0x6448, + /* Array index: 0x1572 */ 0x7C0D,0x644D, + /* Array index: 0x1572 */ 0x7C17,0x644C, + /* Array index: 0x1572 */ 0x7C1F,0x6452, + /* Array index: 0x1572 */ 0x7C21,0x344A, + /* Array index: 0x1572 */ 0x7C23,0x644F, + /* Array index: 0x1572 */ 0x7C27,0x6450, + /* Array index: 0x1572 */ 0x7C2A,0x6451, + /* Array index: 0x1572 */ 0x7C2B,0x6454, + /* Array index: 0x1572 */ 0x7C37,0x6453, + /* Array index: 0x1572 */ 0x7C38,0x4876, + /* Array index: 0x1572 */ 0x7C43,0x6457, + /* Array index: 0x1572 */ 0x7C54,0x6458, + /* Array index: 0x1572 */ 0x7C56,0x645F, + /* Array index: 0x1572 */ 0x7C58,0x645C, + /* Array index: 0x1572 */ 0x7C5F,0x645D, + /* Array index: 0x1572 */ 0x7C60,0x6446, + /* Array index: 0x1572 */ 0x7C64,0x645E, + /* Array index: 0x1572 */ 0x7C65,0x6460, + /* Array index: 0x1572 */ 0x7C6C,0x6461, + /* Array index: 0x1572 */ 0x7C73,0x4A46, + /* Array index: 0x1572 */ 0x7C75,0x6462, + /* Array index: 0x1572 */ 0x7C7E,0x4C62, + /* Array index: 0x1572 */ 0x7C89,0x4A34, + /* Array index: 0x1572 */ 0x7C8B,0x3F68, + /* Array index: 0x1572 */ 0x7C8D,0x4C30, + /* Array index: 0x1572 */ 0x7C90,0x6464, + /* Array index: 0x1572 */ 0x7C92,0x4E33, + /* Array index: 0x1572 */ 0x7C95,0x4774, + /* Array index: 0x1572 */ 0x7C97,0x4146, + /* Array index: 0x1572 */ 0x7C98,0x4734, + /* Array index: 0x1572 */ 0x7C9B,0x3D4D, + /* Array index: 0x1572 */ 0x7C9F,0x3040, + /* Array index: 0x1572 */ 0x7CAB,0x6468, + /* Array index: 0x1572 */ 0x7CB9,0x646F, + /* Array index: 0x1572 */ 0x7CBD,0x6470, + /* Array index: 0x1572 */ 0x7CBE,0x403A, + /* Array index: 0x1572 */ 0x7CC0,0x6471, + /* Array index: 0x1572 */ 0x7CC2,0x6473, + /* Array index: 0x1572 */ 0x7CC5,0x6472, + /* Array index: 0x1572 */ 0x7CCA,0x3852, + /* Array index: 0x1572 */ 0x7CCE,0x4138, + /* Array index: 0x1572 */ 0x7CD2,0x6475, + /* Array index: 0x1572 */ 0x7CD6,0x457C, + /* Array index: 0x1572 */ 0x7CD8,0x6474, + /* Array index: 0x1572 */ 0x7CE7,0x4E48, + /* Array index: 0x1572 */ 0x7CEF,0x6479, + /* Array index: 0x1572 */ 0x7CF2,0x647A, + /* Array index: 0x1572 */ 0x7CF4,0x647B, + /* Array index: 0x1572 */ 0x7CF6,0x647C, + /* Array index: 0x1572 */ 0x7CF8,0x3B65, + /* Array index: 0x1572 */ 0x7CFA,0x647D, + /* Array index: 0x1572 */ 0x7CFB,0x374F, + /* Array index: 0x1572 */ 0x7CFE,0x356A, + /* Array index: 0x1572 */ 0x7D00,0x352A, + /* Array index: 0x1572 */ 0x7D0A,0x6524, + /* Array index: 0x1572 */ 0x7D0B,0x4C66, + /* Array index: 0x1572 */ 0x7D0D,0x473C, + /* Array index: 0x1572 */ 0x7D10,0x4933, + /* Array index: 0x1572 */ 0x7D39,0x3E52, + /* Array index: 0x1572 */ 0x7D3A,0x3A30, + /* Array index: 0x1572 */ 0x7D3F,0x6529, + /* Array index: 0x1572 */ 0x7D56,0x652D, + /* Array index: 0x1572 */ 0x7D5B,0x6536, + /* Array index: 0x1572 */ 0x7D5E,0x394A, + /* Array index: 0x1572 */ 0x7D66,0x356B, + /* Array index: 0x1572 */ 0x7D68,0x6530, + /* Array index: 0x1572 */ 0x7D6E,0x6531, + /* Array index: 0x1572 */ 0x7D79,0x3828, + /* Array index: 0x1572 */ 0x7D7D,0x6538, + /* Array index: 0x1572 */ 0x7D89,0x6535, + /* Array index: 0x1572 */ 0x7D8F,0x6537, + /* Array index: 0x1572 */ 0x7D93,0x6534, + /* Array index: 0x1572 */ 0x7D9F,0x6546, + /* Array index: 0x1572 */ 0x7DA2,0x6542, + /* Array index: 0x1572 */ 0x7DA3,0x653C, + /* Array index: 0x1572 */ 0x7DB8,0x6545, + /* Array index: 0x1572 */ 0x7DC7,0x653E, + /* Array index: 0x1572 */ 0x7DCA,0x365B, + /* Array index: 0x1572 */ 0x7DCB,0x486C, + /* Array index: 0x1572 */ 0x7DCF,0x416D, + /* Array index: 0x1572 */ 0x7DD1,0x4E50, + /* Array index: 0x1572 */ 0x7DD2,0x3D6F, + /* Array index: 0x1572 */ 0x7DD5,0x656E, + /* Array index: 0x1572 */ 0x7DD8,0x6548, + /* Array index: 0x1572 */ 0x7DE4,0x654A, + /* Array index: 0x1572 */ 0x7DE8,0x4A54, + /* Array index: 0x1572 */ 0x7DE9,0x344B, + /* Array index: 0x1572 */ 0x7DEC,0x4C4B, + /* Array index: 0x1572 */ 0x7DEF,0x305E, + /* Array index: 0x1572 */ 0x7DF2,0x654D, + /* Array index: 0x1572 */ 0x7DF4,0x4E7D, + /* Array index: 0x1572 */ 0x7DFB,0x654C, + /* Array index: 0x1572 */ 0x7E01,0x316F, + /* Array index: 0x1572 */ 0x7E04,0x466C, + /* Array index: 0x1572 */ 0x7E05,0x654F, + /* Array index: 0x1572 */ 0x7E12,0x6553, + /* Array index: 0x1572 */ 0x7E1B,0x477B, + /* Array index: 0x1572 */ 0x7E26,0x3D44, + /* Array index: 0x1572 */ 0x7E2B,0x4B25, + /* Array index: 0x1572 */ 0x7E2E,0x3D4C, + /* Array index: 0x1572 */ 0x7E31,0x6554, + /* Array index: 0x1572 */ 0x7E32,0x6560, + /* Array index: 0x1572 */ 0x7E35,0x655C, + /* Array index: 0x1572 */ 0x7E41,0x484B, + /* Array index: 0x1572 */ 0x7E43,0x655E, + /* Array index: 0x1572 */ 0x7E46,0x6559, + /* Array index: 0x1572 */ 0x7E4A,0x4121, + /* Array index: 0x1572 */ 0x7E4B,0x3752, + /* Array index: 0x1572 */ 0x7E4D,0x3D2B, + /* Array index: 0x1572 */ 0x7E6D,0x4B7A, + /* Array index: 0x1572 */ 0x7E70,0x372B, + /* Array index: 0x1572 */ 0x7E88,0x6572, + /* Array index: 0x1572 */ 0x7E89,0x6573, + /* Array index: 0x1572 */ 0x7E9B,0x657B, + /* Array index: 0x1572 */ 0x7E9C,0x657C, + /* Array index: 0x1572 */ 0x7F36,0x344C, + /* Array index: 0x1572 */ 0x7F38,0x657D, + /* Array index: 0x1572 */ 0x7F3A,0x657E, + /* Array index: 0x1572 */ 0x7F45,0x6621, + /* Array index: 0x1572 */ 0x7F58,0x6629, + /* Array index: 0x1572 */ 0x7F5F,0x662A, + /* Array index: 0x1572 */ 0x7F60,0x662B, + /* Array index: 0x1572 */ 0x7F6E,0x4356, + /* Array index: 0x1572 */ 0x7F70,0x4833, + /* Array index: 0x1572 */ 0x7F72,0x3D70, + /* Array index: 0x1572 */ 0x7F94,0x6636, + /* Array index: 0x1572 */ 0x7F9A,0x6639, + /* Array index: 0x1572 */ 0x7F9D,0x6638, + /* Array index: 0x1572 */ 0x7F9E,0x6637, + /* Array index: 0x1572 */ 0x7FA3,0x663A, + /* Array index: 0x1572 */ 0x7FA4,0x3732, + /* Array index: 0x1572 */ 0x7FA8,0x4122, + /* Array index: 0x1572 */ 0x7FA9,0x3541, + /* Array index: 0x1572 */ 0x7FAE,0x663E, + /* Array index: 0x1572 */ 0x7FAF,0x663B, + /* Array index: 0x1572 */ 0x7FB2,0x663C, + /* Array index: 0x1572 */ 0x7FB6,0x663F, + /* Array index: 0x1572 */ 0x7FB8,0x6640, + /* Array index: 0x1572 */ 0x7FB9,0x663D, + /* Array index: 0x1572 */ 0x7FBD,0x3129, + /* Array index: 0x1572 */ 0x7FC1,0x3227, + /* Array index: 0x1572 */ 0x7FC5,0x6642, + /* Array index: 0x1572 */ 0x7FC6,0x6643, + /* Array index: 0x1572 */ 0x7FCA,0x6644, + /* Array index: 0x1572 */ 0x7FCC,0x4D62, + /* Array index: 0x1572 */ 0x7FD2,0x3D2C, + /* Array index: 0x1572 */ 0x7FD4,0x6646, + /* Array index: 0x1572 */ 0x7FD5,0x6645, + /* Array index: 0x1572 */ 0x7FE0,0x3F69, + /* Array index: 0x1572 */ 0x7FE1,0x6647, + /* Array index: 0x1572 */ 0x7FE6,0x6648, + /* Array index: 0x1572 */ 0x7FE9,0x6649, + /* Array index: 0x1572 */ 0x7FEB,0x3465, + /* Array index: 0x1572 */ 0x7FF0,0x344D, + /* Array index: 0x1572 */ 0x7FF3,0x664A, + /* Array index: 0x1572 */ 0x7FF9,0x664B, + /* Array index: 0x1572 */ 0x7FFB,0x4B5D, + /* Array index: 0x1572 */ 0x7FFC,0x4D63, + /* Array index: 0x1572 */ 0x800B,0x664F, + /* Array index: 0x1572 */ 0x800C,0x3C29, + /* Array index: 0x1572 */ 0x8010,0x4251, + /* Array index: 0x1572 */ 0x8012,0x6650, + /* Array index: 0x1572 */ 0x801C,0x6653, + /* Array index: 0x1572 */ 0x8021,0x6654, + /* Array index: 0x1572 */ 0x8028,0x6655, + /* Array index: 0x1572 */ 0x8033,0x3C2A, + /* Array index: 0x1572 */ 0x8036,0x4C6D, + /* Array index: 0x1572 */ 0x803B,0x6657, + /* Array index: 0x1572 */ 0x803D,0x433F, + /* Array index: 0x1572 */ 0x803F,0x6656, + /* Array index: 0x1572 */ 0x8046,0x6659, + /* Array index: 0x1572 */ 0x804A,0x6658, + /* Array index: 0x1572 */ 0x8052,0x665A, + /* Array index: 0x1572 */ 0x8056,0x403B, + /* Array index: 0x1572 */ 0x8058,0x665B, + /* Array index: 0x1572 */ 0x805A,0x665C, + /* Array index: 0x1572 */ 0x8068,0x665F, + /* Array index: 0x1572 */ 0x8093,0x666B, + /* Array index: 0x1572 */ 0x8096,0x3E53, + /* Array index: 0x1572 */ 0x8098,0x492A, + /* Array index: 0x1572 */ 0x809A,0x666C, + /* Array index: 0x1572 */ 0x809B,0x666A, + /* Array index: 0x1572 */ 0x809D,0x344E, + /* Array index: 0x1572 */ 0x80A1,0x3854, + /* Array index: 0x1572 */ 0x80A2,0x3B68, + /* Array index: 0x1572 */ 0x80A5,0x486E, + /* Array index: 0x1572 */ 0x80BA,0x4759, + /* Array index: 0x1572 */ 0x80C3,0x305F, + /* Array index: 0x1572 */ 0x80C4,0x6674, + /* Array index: 0x1572 */ 0x80C6,0x4340, + /* Array index: 0x1572 */ 0x80CC,0x4758, + /* Array index: 0x1572 */ 0x80CE,0x425B, + /* Array index: 0x1572 */ 0x80D6,0x6676, + /* Array index: 0x1572 */ 0x80E1,0x3855, + /* Array index: 0x1572 */ 0x80E4,0x307D, + /* Array index: 0x1572 */ 0x80E5,0x6671, + /* Array index: 0x1572 */ 0x80EF,0x6678, + /* Array index: 0x1572 */ 0x80F1,0x6679, + /* Array index: 0x1572 */ 0x80F4,0x4639, + /* Array index: 0x1572 */ 0x80F8,0x363B, + /* Array index: 0x1572 */ 0x80FC,0x6726, + /* Array index: 0x1572 */ 0x80FD,0x473D, + /* Array index: 0x1572 */ 0x8102,0x3B69, + /* Array index: 0x1572 */ 0x811A,0x3553, + /* Array index: 0x1572 */ 0x811B,0x667A, + /* Array index: 0x1572 */ 0x8123,0x667C, + /* Array index: 0x1572 */ 0x8129,0x667B, + /* Array index: 0x1572 */ 0x812F,0x667D, + /* Array index: 0x1572 */ 0x8131,0x4326, + /* Array index: 0x1572 */ 0x8133,0x473E, + /* Array index: 0x1572 */ 0x8139,0x4431, + /* Array index: 0x1572 */ 0x813E,0x6723, + /* Array index: 0x1572 */ 0x8146,0x6722, + /* Array index: 0x1572 */ 0x814B,0x667E, + /* Array index: 0x1572 */ 0x814E,0x3F55, + /* Array index: 0x1572 */ 0x815F,0x6735, + /* Array index: 0x1572 */ 0x8165,0x6729, + /* Array index: 0x1572 */ 0x8166,0x672A, + /* Array index: 0x1572 */ 0x816B,0x3C70, + /* Array index: 0x1572 */ 0x816E,0x6728, + /* Array index: 0x1572 */ 0x8170,0x3978, + /* Array index: 0x1572 */ 0x8171,0x6727, + /* Array index: 0x1572 */ 0x8174,0x672B, + /* Array index: 0x1572 */ 0x8188,0x672D, + /* Array index: 0x1572 */ 0x818A,0x672E, + /* Array index: 0x1572 */ 0x818F,0x3951, + /* Array index: 0x1572 */ 0x8193,0x6736, + /* Array index: 0x1572 */ 0x8195,0x6732, + /* Array index: 0x1572 */ 0x819A,0x4966, + /* Array index: 0x1572 */ 0x819C,0x4B6C, + /* Array index: 0x1572 */ 0x819D,0x4928, + /* Array index: 0x1572 */ 0x81A0,0x6731, + /* Array index: 0x1572 */ 0x81A3,0x6734, + /* Array index: 0x1572 */ 0x81A4,0x6733, + /* Array index: 0x1572 */ 0x81A8,0x4B44, + /* Array index: 0x1572 */ 0x81A9,0x6737, + /* Array index: 0x1572 */ 0x81B0,0x6738, + /* Array index: 0x1572 */ 0x81B3,0x4137, + /* Array index: 0x1572 */ 0x81B5,0x6739, + /* Array index: 0x1572 */ 0x81B8,0x673B, + /* Array index: 0x1572 */ 0x81BA,0x673F, + /* Array index: 0x1572 */ 0x81C6,0x3232, + /* Array index: 0x1572 */ 0x81C8,0x6745, + /* Array index: 0x1572 */ 0x81C9,0x6740, + /* Array index: 0x1572 */ 0x81CD,0x6741, + /* Array index: 0x1572 */ 0x81D1,0x6742, + /* Array index: 0x1572 */ 0x81D3,0x4221, + /* Array index: 0x1572 */ 0x81DF,0x6747, + /* Array index: 0x1572 */ 0x81E0,0x6748, + /* Array index: 0x1572 */ 0x81E3,0x3F43, + /* Array index: 0x1572 */ 0x81E5,0x3269, + /* Array index: 0x1572 */ 0x81E7,0x6749, + /* Array index: 0x1572 */ 0x81E8,0x4E57, + /* Array index: 0x1572 */ 0x81EA,0x3C2B, + /* Array index: 0x1572 */ 0x81ED,0x3D2D, + /* Array index: 0x1572 */ 0x81F3,0x3B6A, + /* Array index: 0x1572 */ 0x81F4,0x4357, + /* Array index: 0x1572 */ 0x8240,0x6759, + /* Array index: 0x1572 */ 0x8247,0x447A, + /* Array index: 0x1572 */ 0x825D,0x675C, + /* Array index: 0x1572 */ 0x825F,0x675E, + /* Array index: 0x1572 */ 0x8262,0x6760, + /* Array index: 0x1572 */ 0x8264,0x675F, + /* Array index: 0x1572 */ 0x8266,0x344F, + /* Array index: 0x1572 */ 0x8268,0x6761, + /* Array index: 0x1572 */ 0x826A,0x6762, + /* Array index: 0x1572 */ 0x826B,0x6763, + /* Array index: 0x1572 */ 0x827E,0x6768, + /* Array index: 0x1572 */ 0x828B,0x3072, + /* Array index: 0x1572 */ 0x828D,0x6769, + /* Array index: 0x1572 */ 0x8292,0x676A, + /* Array index: 0x1572 */ 0x8299,0x4967, + /* Array index: 0x1572 */ 0x829D,0x3C47, + /* Array index: 0x1572 */ 0x829F,0x676C, + /* Array index: 0x1572 */ 0x82A5,0x3329, + /* Array index: 0x1572 */ 0x82A6,0x3032, + /* Array index: 0x1572 */ 0x82B8,0x375D, + /* Array index: 0x1572 */ 0x82B9,0x365C, + /* Array index: 0x1572 */ 0x82BB,0x676D, + /* Array index: 0x1572 */ 0x82BD,0x326A, + /* Array index: 0x1572 */ 0x82C5,0x3423, + /* Array index: 0x1572 */ 0x82D7,0x4944, + /* Array index: 0x1572 */ 0x82D9,0x677E, + /* Array index: 0x1572 */ 0x82EB,0x4651, + /* Array index: 0x1572 */ 0x82F1,0x3151, + /* Array index: 0x1572 */ 0x82F3,0x6774, + /* Array index: 0x1572 */ 0x82F4,0x6773, + /* Array index: 0x1572 */ 0x8309,0x677D, + /* Array index: 0x1572 */ 0x830E,0x3754, + /* Array index: 0x1572 */ 0x831C,0x302B, + /* Array index: 0x1572 */ 0x8323,0x6834, + /* Array index: 0x1572 */ 0x8328,0x3071, + /* Array index: 0x1572 */ 0x832B,0x682B, + /* Array index: 0x1572 */ 0x832F,0x682A, + /* Array index: 0x1572 */ 0x8340,0x6826, + /* Array index: 0x1572 */ 0x8345,0x6829, + /* Array index: 0x1572 */ 0x8349,0x4170, + /* Array index: 0x1572 */ 0x834A,0x3755, + /* Array index: 0x1572 */ 0x834F,0x3141, + /* Array index: 0x1572 */ 0x8350,0x6828, + /* Array index: 0x1572 */ 0x8352,0x3953, + /* Array index: 0x1572 */ 0x8358,0x4171, + /* Array index: 0x1572 */ 0x8373,0x683A, + /* Array index: 0x1572 */ 0x8375,0x683B, + /* Array index: 0x1572 */ 0x8377,0x3259, + /* Array index: 0x1572 */ 0x837B,0x322E, + /* Array index: 0x1572 */ 0x837C,0x6838, + /* Array index: 0x1572 */ 0x8385,0x682E, + /* Array index: 0x1572 */ 0x8387,0x6836, + /* Array index: 0x1572 */ 0x8389,0x683D, + /* Array index: 0x1572 */ 0x838A,0x6837, + /* Array index: 0x1572 */ 0x838E,0x6835, + /* Array index: 0x1572 */ 0x8393,0x6776, + /* Array index: 0x1572 */ 0x8396,0x6833, + /* Array index: 0x1572 */ 0x839A,0x682F, + /* Array index: 0x1572 */ 0x83A8,0x683E, + /* Array index: 0x1572 */ 0x83AA,0x6830, + /* Array index: 0x1572 */ 0x83AB,0x477C, + /* Array index: 0x1572 */ 0x83B1,0x4D69, + /* Array index: 0x1572 */ 0x83B5,0x6839, + /* Array index: 0x1572 */ 0x83BD,0x684F, + /* Array index: 0x1572 */ 0x83C1,0x6847, + /* Array index: 0x1572 */ 0x83C5,0x3F7B, + /* Array index: 0x1572 */ 0x83CA,0x3546, + /* Array index: 0x1572 */ 0x83CC,0x365D, + /* Array index: 0x1572 */ 0x83CE,0x6842, + /* Array index: 0x1572 */ 0x83D3,0x325B, + /* Array index: 0x1572 */ 0x83D6,0x3E54, + /* Array index: 0x1572 */ 0x83D8,0x6845, + /* Array index: 0x1572 */ 0x83DC,0x3A5A, + /* Array index: 0x1572 */ 0x83DF,0x4551, + /* Array index: 0x1572 */ 0x83E0,0x684A, + /* Array index: 0x1572 */ 0x83E9,0x4A6E, + /* Array index: 0x1572 */ 0x83EB,0x6841, + /* Array index: 0x1572 */ 0x83F7,0x6848, + /* Array index: 0x1572 */ 0x83FB,0x6852, + /* Array index: 0x1572 */ 0x83FD,0x6843, + /* Array index: 0x1572 */ 0x8403,0x6844, + /* Array index: 0x1572 */ 0x8404,0x463A, + /* Array index: 0x1572 */ 0x8407,0x6849, + /* Array index: 0x1572 */ 0x8413,0x6840, + /* Array index: 0x1572 */ 0x8420,0x684E, + /* Array index: 0x1572 */ 0x8422,0x684D, + /* Array index: 0x1572 */ 0x8429,0x476B, + /* Array index: 0x1572 */ 0x842A,0x6854, + /* Array index: 0x1572 */ 0x842C,0x685F, + /* Array index: 0x1572 */ 0x8431,0x337E, + /* Array index: 0x1572 */ 0x8435,0x6862, + /* Array index: 0x1572 */ 0x8438,0x6850, + /* Array index: 0x1572 */ 0x843C,0x6855, + /* Array index: 0x1572 */ 0x843D,0x4D6E, + /* Array index: 0x1572 */ 0x8446,0x685E, + /* Array index: 0x1572 */ 0x8449,0x4D55, + /* Array index: 0x1572 */ 0x844E,0x4E2A, + /* Array index: 0x1572 */ 0x8457,0x4378, + /* Array index: 0x1572 */ 0x845B,0x336B, + /* Array index: 0x1572 */ 0x8466,0x3031, + /* Array index: 0x1572 */ 0x8475,0x302A, + /* Array index: 0x1572 */ 0x8477,0x6858, + /* Array index: 0x1572 */ 0x8479,0x6861, + /* Array index: 0x1572 */ 0x847A,0x4978, + /* Array index: 0x1572 */ 0x8482,0x685C, + /* Array index: 0x1572 */ 0x8484,0x6857, + /* Array index: 0x1572 */ 0x848B,0x3E55, + /* Array index: 0x1572 */ 0x8490,0x3D2F, + /* Array index: 0x1572 */ 0x8494,0x3C2C, + /* Array index: 0x1572 */ 0x8499,0x4C58, + /* Array index: 0x1572 */ 0x849C,0x4947, + /* Array index: 0x1572 */ 0x849F,0x6867, + /* Array index: 0x1572 */ 0x84A1,0x6870, + /* Array index: 0x1572 */ 0x84AD,0x685A, + /* Array index: 0x1572 */ 0x84B2,0x3377, + /* Array index: 0x1572 */ 0x84BF,0x6866, + /* Array index: 0x1572 */ 0x84C1,0x686D, + /* Array index: 0x1572 */ 0x84C4,0x435F, + /* Array index: 0x1572 */ 0x84C6,0x686E, + /* Array index: 0x1572 */ 0x84D6,0x686F, + /* Array index: 0x1572 */ 0x84D9,0x6868, + /* Array index: 0x1572 */ 0x84DA,0x686B, + /* Array index: 0x1572 */ 0x84EC,0x4B29, + /* Array index: 0x1572 */ 0x84EE,0x4F21, + /* Array index: 0x1572 */ 0x84F4,0x6873, + /* Array index: 0x1572 */ 0x84FC,0x687A, + /* Array index: 0x1572 */ 0x84FF,0x6872, + /* Array index: 0x1572 */ 0x8500,0x3C43, + /* Array index: 0x1572 */ 0x8506,0x6851, + /* Array index: 0x1572 */ 0x851F,0x6877, + /* Array index: 0x1572 */ 0x8521,0x6871, + /* Array index: 0x1572 */ 0x8526,0x4455, + /* Array index: 0x1572 */ 0x852C,0x6876, + /* Array index: 0x1572 */ 0x852D,0x307E, + /* Array index: 0x1572 */ 0x8535,0x4222, + /* Array index: 0x1572 */ 0x853D,0x4A43, + /* Array index: 0x1572 */ 0x8540,0x687B, + /* Array index: 0x1572 */ 0x8541,0x6921, + /* Array index: 0x1572 */ 0x8543,0x4859, + /* Array index: 0x1572 */ 0x854E,0x363E, + /* Array index: 0x1572 */ 0x8555,0x6924, + /* Array index: 0x1572 */ 0x8557,0x4979, + /* Array index: 0x1572 */ 0x8558,0x687D, + /* Array index: 0x1572 */ 0x855A,0x6856, + /* Array index: 0x1572 */ 0x8563,0x687C, + /* Array index: 0x1572 */ 0x856D,0x692B, + /* Array index: 0x1572 */ 0x8577,0x6931, + /* Array index: 0x1572 */ 0x857E,0x6932, + /* Array index: 0x1572 */ 0x8580,0x6925, + /* Array index: 0x1572 */ 0x8584,0x4776, + /* Array index: 0x1572 */ 0x8587,0x692F, + /* Array index: 0x1572 */ 0x8588,0x6927, + /* Array index: 0x1572 */ 0x858A,0x6929, + /* Array index: 0x1572 */ 0x8590,0x6933, + /* Array index: 0x1572 */ 0x8591,0x6928, + /* Array index: 0x1572 */ 0x8594,0x692C, + /* Array index: 0x1572 */ 0x8597,0x3172, + /* Array index: 0x1572 */ 0x8599,0x4665, + /* Array index: 0x1572 */ 0x859B,0x692D, + /* Array index: 0x1572 */ 0x859C,0x6930, + /* Array index: 0x1572 */ 0x85A4,0x6926, + /* Array index: 0x1572 */ 0x85B9,0x6937, + /* Array index: 0x1572 */ 0x85BA,0x6935, + /* Array index: 0x1572 */ 0x85C1,0x4F4E, + /* Array index: 0x1572 */ 0x85C9,0x6934, + /* Array index: 0x1572 */ 0x85CD,0x4D75, + /* Array index: 0x1572 */ 0x85CF,0x6936, + /* Array index: 0x1572 */ 0x85D0,0x6938, + /* Array index: 0x1572 */ 0x85D5,0x6939, + /* Array index: 0x1572 */ 0x85DC,0x693C, + /* Array index: 0x1572 */ 0x85DD,0x693A, + /* Array index: 0x1572 */ 0x85E4,0x4623, + /* Array index: 0x1572 */ 0x85E5,0x693B, + /* Array index: 0x1572 */ 0x85E9,0x484D, + /* Array index: 0x1572 */ 0x85EA,0x692E, + /* Array index: 0x1572 */ 0x85FE,0x6941, + /* Array index: 0x1572 */ 0x8602,0x6922, + /* Array index: 0x1572 */ 0x8606,0x6943, + /* Array index: 0x1572 */ 0x8607,0x4149, + /* Array index: 0x1572 */ 0x860A,0x693E, + /* Array index: 0x1572 */ 0x860B,0x6940, + /* Array index: 0x1572 */ 0x8613,0x693F, + /* Array index: 0x1572 */ 0x8616,0x5D31, + /* Array index: 0x1572 */ 0x8617,0x5D22, + /* Array index: 0x1572 */ 0x861A,0x6945, + /* Array index: 0x1572 */ 0x8622,0x6944, + /* Array index: 0x1572 */ 0x862D,0x4D76, + /* Array index: 0x1572 */ 0x862F,0x623C, + /* Array index: 0x1572 */ 0x8630,0x6946, + /* Array index: 0x1572 */ 0x863F,0x6947, + /* Array index: 0x1572 */ 0x864D,0x6948, + /* Array index: 0x1572 */ 0x864E,0x3857, + /* Array index: 0x1572 */ 0x8650,0x3554, + /* Array index: 0x1572 */ 0x8654,0x694A, + /* Array index: 0x1572 */ 0x8655,0x515D, + /* Array index: 0x1572 */ 0x865A,0x3575, + /* Array index: 0x1572 */ 0x865C,0x4E3A, + /* Array index: 0x1572 */ 0x865E,0x3673, + /* Array index: 0x1572 */ 0x865F,0x694B, + /* Array index: 0x1572 */ 0x8667,0x694C, + /* Array index: 0x1572 */ 0x866B,0x436E, + /* Array index: 0x1572 */ 0x8671,0x694D, + /* Array index: 0x1572 */ 0x8679,0x467A, + /* Array index: 0x1572 */ 0x867B,0x303A, + /* Array index: 0x1572 */ 0x8693,0x694E, + /* Array index: 0x1572 */ 0x8695,0x3B3D, + /* Array index: 0x1572 */ 0x86A3,0x694F, + /* Array index: 0x1572 */ 0x86A4,0x4742, + /* Array index: 0x1572 */ 0x86AF,0x6955, + /* Array index: 0x1572 */ 0x86B0,0x6958, + /* Array index: 0x1572 */ 0x86B6,0x6954, + /* Array index: 0x1572 */ 0x86C4,0x6956, + /* Array index: 0x1572 */ 0x86C6,0x6957, + /* Array index: 0x1572 */ 0x86C7,0x3C58, + /* Array index: 0x1572 */ 0x86C9,0x6959, + /* Array index: 0x1572 */ 0x86CB,0x4341, + /* Array index: 0x1572 */ 0x86CD,0x3756, + /* Array index: 0x1572 */ 0x86CE,0x3342, + /* Array index: 0x1572 */ 0x86D4,0x695C, + /* Array index: 0x1572 */ 0x86D9,0x333F, + /* Array index: 0x1572 */ 0x86DB,0x6961, + /* Array index: 0x1572 */ 0x86DE,0x695D, + /* Array index: 0x1572 */ 0x86DF,0x6960, + /* Array index: 0x1572 */ 0x86E4,0x483A, + /* Array index: 0x1572 */ 0x86E9,0x695E, + /* Array index: 0x1572 */ 0x86F8,0x427D, + /* Array index: 0x1572 */ 0x86F9,0x696C, + /* Array index: 0x1572 */ 0x86FB,0x6968, + /* Array index: 0x1572 */ 0x86FE,0x326B, + /* Array index: 0x1572 */ 0x8700,0x6966, + /* Array index: 0x1572 */ 0x8702,0x4B2A, + /* Array index: 0x1572 */ 0x8703,0x6967, + /* Array index: 0x1572 */ 0x870D,0x696B, + /* Array index: 0x1572 */ 0x8711,0x6969, + /* Array index: 0x1572 */ 0x8712,0x6963, + /* Array index: 0x1572 */ 0x8718,0x4358, + /* Array index: 0x1572 */ 0x871A,0x6974, + /* Array index: 0x1572 */ 0x871C,0x4C2A, + /* Array index: 0x1572 */ 0x8725,0x6972, + /* Array index: 0x1572 */ 0x8729,0x6973, + /* Array index: 0x1572 */ 0x8734,0x696E, + /* Array index: 0x1572 */ 0x8737,0x6970, + /* Array index: 0x1572 */ 0x873B,0x6971, + /* Array index: 0x1572 */ 0x873F,0x696F, + /* Array index: 0x1572 */ 0x8749,0x4066, + /* Array index: 0x1572 */ 0x874B,0x4F39, + /* Array index: 0x1572 */ 0x874C,0x6978, + /* Array index: 0x1572 */ 0x874E,0x6979, + /* Array index: 0x1572 */ 0x8753,0x6A21, + /* Array index: 0x1572 */ 0x8755,0x3F2A, + /* Array index: 0x1572 */ 0x8757,0x697B, + /* Array index: 0x1572 */ 0x8759,0x697E, + /* Array index: 0x1572 */ 0x875F,0x6976, + /* Array index: 0x1572 */ 0x8760,0x6975, + /* Array index: 0x1572 */ 0x8763,0x6A22, + /* Array index: 0x1572 */ 0x8766,0x325C, + /* Array index: 0x1572 */ 0x8768,0x697C, + /* Array index: 0x1572 */ 0x876A,0x6A23, + /* Array index: 0x1572 */ 0x876E,0x697D, + /* Array index: 0x1572 */ 0x8774,0x697A, + /* Array index: 0x1572 */ 0x8776,0x4433, + /* Array index: 0x1572 */ 0x8778,0x6977, + /* Array index: 0x1572 */ 0x877F,0x4768, + /* Array index: 0x1572 */ 0x8782,0x6A27, + /* Array index: 0x1572 */ 0x878D,0x4D3B, + /* Array index: 0x1572 */ 0x879F,0x6A26, + /* Array index: 0x1572 */ 0x87A2,0x6A25, + /* Array index: 0x1572 */ 0x87AB,0x6A2E, + /* Array index: 0x1572 */ 0x87AF,0x6A28, + /* Array index: 0x1572 */ 0x87B3,0x6A30, + /* Array index: 0x1572 */ 0x87BA,0x4D66, + /* Array index: 0x1572 */ 0x87BB,0x6A33, + /* Array index: 0x1572 */ 0x87BD,0x6A2A, + /* Array index: 0x1572 */ 0x87C0,0x6A2B, + /* Array index: 0x1572 */ 0x87C4,0x6A2F, + /* Array index: 0x1572 */ 0x87C6,0x6A32, + /* Array index: 0x1572 */ 0x87C7,0x6A31, + /* Array index: 0x1572 */ 0x87CB,0x6A29, + /* Array index: 0x1572 */ 0x87D0,0x6A2C, + /* Array index: 0x1572 */ 0x87D2,0x6A3D, + /* Array index: 0x1572 */ 0x87E0,0x6A36, + /* Array index: 0x1572 */ 0x87EF,0x6A34, + /* Array index: 0x1572 */ 0x87F2,0x6A35, + /* Array index: 0x1572 */ 0x87F6,0x6A3A, + /* Array index: 0x1572 */ 0x87F7,0x6A3B, + /* Array index: 0x1572 */ 0x87F9,0x332A, + /* Array index: 0x1572 */ 0x87FB,0x3542, + /* Array index: 0x1572 */ 0x87FE,0x6A39, + /* Array index: 0x1572 */ 0x8805,0x6A24, + /* Array index: 0x1572 */ 0x8815,0x6A40, + /* Array index: 0x1572 */ 0x8816,0x6A3F, + /* Array index: 0x1572 */ 0x8827,0x6A46, + /* Array index: 0x1572 */ 0x8831,0x6A43, + /* Array index: 0x1572 */ 0x8836,0x6A44, + /* Array index: 0x1572 */ 0x8839,0x6A45, + /* Array index: 0x1572 */ 0x883B,0x6A47, + /* Array index: 0x1572 */ 0x8840,0x376C, + /* Array index: 0x1572 */ 0x8842,0x6A49, + /* Array index: 0x1572 */ 0x8844,0x6A48, + /* Array index: 0x1572 */ 0x8846,0x3D30, + /* Array index: 0x1572 */ 0x884C,0x3954, + /* Array index: 0x1572 */ 0x884D,0x5E27, + /* Array index: 0x1572 */ 0x8852,0x6A4A, + /* Array index: 0x1572 */ 0x8853,0x3D51, + /* Array index: 0x1572 */ 0x8857,0x3339, + /* Array index: 0x1572 */ 0x8859,0x6A4B, + /* Array index: 0x1572 */ 0x885B,0x3152, + /* Array index: 0x1572 */ 0x8868,0x493D, + /* Array index: 0x1572 */ 0x886B,0x6A4E, + /* Array index: 0x1572 */ 0x8870,0x3F6A, + /* Array index: 0x1572 */ 0x8872,0x6A55, + /* Array index: 0x1572 */ 0x8875,0x6A52, + /* Array index: 0x1572 */ 0x8877,0x436F, + /* Array index: 0x1572 */ 0x8888,0x3736, + /* Array index: 0x1572 */ 0x888B,0x425E, + /* Array index: 0x1572 */ 0x888D,0x6A5C, + /* Array index: 0x1572 */ 0x8892,0x6A58, + /* Array index: 0x1572 */ 0x8896,0x4235, + /* Array index: 0x1572 */ 0x8897,0x6A57, + /* Array index: 0x1572 */ 0x8899,0x6A5A, + /* Array index: 0x1572 */ 0x889E,0x6A51, + /* Array index: 0x1572 */ 0x88A2,0x6A5B, + /* Array index: 0x1572 */ 0x88A4,0x6A5D, + /* Array index: 0x1572 */ 0x88AB,0x486F, + /* Array index: 0x1572 */ 0x88AE,0x6A59, + /* Array index: 0x1572 */ 0x88B0,0x6A5E, + /* Array index: 0x1572 */ 0x88B1,0x6A60, + /* Array index: 0x1572 */ 0x88B4,0x3853, + /* Array index: 0x1572 */ 0x88B5,0x6A54, + /* Array index: 0x1572 */ 0x88B7,0x3041, + /* Array index: 0x1572 */ 0x88CF,0x4E22, + /* Array index: 0x1572 */ 0x88D4,0x6A63, + /* Array index: 0x1572 */ 0x88D5,0x4D35, + /* Array index: 0x1572 */ 0x88D8,0x6A64, + /* Array index: 0x1572 */ 0x88D9,0x6A65, + /* Array index: 0x1572 */ 0x88DC,0x4A64, + /* Array index: 0x1572 */ 0x88DD,0x6A66, + /* Array index: 0x1572 */ 0x88DF,0x3A40, + /* Array index: 0x1572 */ 0x88E1,0x4E23, + /* Array index: 0x1572 */ 0x88E8,0x6A6B, + /* Array index: 0x1572 */ 0x8902,0x6A68, + /* Array index: 0x1572 */ 0x8904,0x6A6D, + /* Array index: 0x1572 */ 0x8907,0x4A23, + /* Array index: 0x1572 */ 0x890A,0x6A6F, + /* Array index: 0x1572 */ 0x890C,0x6A6E, + /* Array index: 0x1572 */ 0x8910,0x336C, + /* Array index: 0x1572 */ 0x8912,0x4B2B, + /* Array index: 0x1572 */ 0x8913,0x6A70, + /* Array index: 0x1572 */ 0x891D,0x6A7C, + /* Array index: 0x1572 */ 0x891E,0x6A72, + /* Array index: 0x1572 */ 0x8925,0x6A73, + /* Array index: 0x1572 */ 0x892A,0x6A74, + /* Array index: 0x1572 */ 0x892B,0x6A75, + /* Array index: 0x1572 */ 0x8936,0x6A79, + /* Array index: 0x1572 */ 0x8938,0x6A7A, + /* Array index: 0x1572 */ 0x893B,0x6A78, + /* Array index: 0x1572 */ 0x8941,0x6A76, + /* Array index: 0x1572 */ 0x8943,0x6A71, + /* Array index: 0x1572 */ 0x8944,0x6A77, + /* Array index: 0x1572 */ 0x894C,0x6A7B, + /* Array index: 0x1572 */ 0x894D,0x7037, + /* Array index: 0x1572 */ 0x8956,0x3228, + /* Array index: 0x1572 */ 0x8964,0x6B22, + /* Array index: 0x1572 */ 0x8966,0x6B21, + /* Array index: 0x1572 */ 0x896A,0x6B24, + /* Array index: 0x1572 */ 0x896D,0x6B23, + /* Array index: 0x1572 */ 0x896F,0x6B25, + /* Array index: 0x1572 */ 0x8972,0x3D31, + /* Array index: 0x1572 */ 0x8974,0x6B26, + /* Array index: 0x1572 */ 0x8977,0x6B27, + /* Array index: 0x1572 */ 0x897E,0x6B28, + /* Array index: 0x1572 */ 0x897F,0x403E, + /* Array index: 0x1572 */ 0x8981,0x4D57, + /* Array index: 0x1572 */ 0x8983,0x6B29, + /* Array index: 0x1572 */ 0x898F,0x352C, + /* Array index: 0x1572 */ 0x8993,0x6B2C, + /* Array index: 0x1572 */ 0x89A1,0x6B2E, + /* Array index: 0x1572 */ 0x89AF,0x6B32, + /* Array index: 0x1572 */ 0x89B2,0x6B33, + /* Array index: 0x1572 */ 0x89B3,0x3451, + /* Array index: 0x1572 */ 0x89BA,0x6B34, + /* Array index: 0x1572 */ 0x89BD,0x6B35, + /* Array index: 0x1572 */ 0x89BF,0x6B36, + /* Array index: 0x1572 */ 0x89C0,0x6B37, + /* Array index: 0x1572 */ 0x89D2,0x3351, + /* Array index: 0x1572 */ 0x89DA,0x6B38, + /* Array index: 0x1572 */ 0x89DC,0x6B39, + /* Array index: 0x1572 */ 0x89DD,0x6B3A, + /* Array index: 0x1572 */ 0x89E3,0x3272, + /* Array index: 0x1572 */ 0x89E6,0x3F28, + /* Array index: 0x1572 */ 0x89E7,0x6B3B, + /* Array index: 0x1572 */ 0x89F4,0x6B3C, + /* Array index: 0x1572 */ 0x89F8,0x6B3D, + /* Array index: 0x1572 */ 0x8A00,0x3840, + /* Array index: 0x1572 */ 0x8A02,0x447B, + /* Array index: 0x1572 */ 0x8A03,0x6B3E, + /* Array index: 0x1572 */ 0x8A08,0x3757, + /* Array index: 0x1572 */ 0x8A0A,0x3F56, + /* Array index: 0x1572 */ 0x8A0C,0x6B41, + /* Array index: 0x1572 */ 0x8A0E,0x4624, + /* Array index: 0x1572 */ 0x8A10,0x6B40, + /* Array index: 0x1572 */ 0x8A13,0x3731, + /* Array index: 0x1572 */ 0x8A1B,0x6B42, + /* Array index: 0x1572 */ 0x8A1D,0x6B43, + /* Array index: 0x1572 */ 0x8A1F,0x3E59, + /* Array index: 0x1572 */ 0x8A23,0x376D, + /* Array index: 0x1572 */ 0x8A25,0x6B44, + /* Array index: 0x1572 */ 0x8A2A,0x4B2C, + /* Array index: 0x1572 */ 0x8A2D,0x405F, + /* Array index: 0x1572 */ 0x8A31,0x3576, + /* Array index: 0x1572 */ 0x8A33,0x4C75, + /* Array index: 0x1572 */ 0x8A34,0x414A, + /* Array index: 0x1572 */ 0x8A36,0x6B45, + /* Array index: 0x1572 */ 0x8A41,0x6B46, + /* Array index: 0x1572 */ 0x8A46,0x6B49, + /* Array index: 0x1572 */ 0x8A48,0x6B4A, + /* Array index: 0x1572 */ 0x8A5B,0x6B47, + /* Array index: 0x1572 */ 0x8A5E,0x3B6C, + /* Array index: 0x1572 */ 0x8A60,0x3153, + /* Array index: 0x1572 */ 0x8A62,0x6B4E, + /* Array index: 0x1572 */ 0x8A63,0x3758, + /* Array index: 0x1572 */ 0x8A66,0x3B6E, + /* Array index: 0x1572 */ 0x8A7C,0x6B4B, + /* Array index: 0x1572 */ 0x8A82,0x6B50, + /* Array index: 0x1572 */ 0x8A84,0x6B51, + /* Array index: 0x1572 */ 0x8A85,0x6B4F, + /* Array index: 0x1572 */ 0x8A87,0x3858, + /* Array index: 0x1572 */ 0x8A89,0x4D40, + /* Array index: 0x1572 */ 0x8A8C,0x3B6F, + /* Array index: 0x1572 */ 0x8A8D,0x4727, + /* Array index: 0x1572 */ 0x8A91,0x6B54, + /* Array index: 0x1572 */ 0x8A93,0x4040, + /* Array index: 0x1572 */ 0x8A95,0x4342, + /* Array index: 0x1572 */ 0x8A98,0x4D36, + /* Array index: 0x1572 */ 0x8A9A,0x6B57, + /* Array index: 0x1572 */ 0x8A9E,0x386C, + /* Array index: 0x1572 */ 0x8AAC,0x4062, + /* Array index: 0x1572 */ 0x8AAD,0x4649, + /* Array index: 0x1572 */ 0x8AB0,0x432F, + /* Array index: 0x1572 */ 0x8AB2,0x325D, + /* Array index: 0x1572 */ 0x8AB9,0x4870, + /* Array index: 0x1572 */ 0x8ABC,0x3543, + /* Array index: 0x1572 */ 0x8ABF,0x4434, + /* Array index: 0x1572 */ 0x8AC2,0x6B5B, + /* Array index: 0x1572 */ 0x8AC4,0x6B59, + /* Array index: 0x1572 */ 0x8AC7,0x434C, + /* Array index: 0x1572 */ 0x8AD2,0x4E4A, + /* Array index: 0x1572 */ 0x8AD6,0x4F40, + /* Array index: 0x1572 */ 0x8AEB,0x6B5D, + /* Array index: 0x1572 */ 0x8AED,0x4D21, + /* Array index: 0x1572 */ 0x8AEE,0x3B70, + /* Array index: 0x1572 */ 0x8AF1,0x6B61, + /* Array index: 0x1572 */ 0x8AF3,0x6B5E, + /* Array index: 0x1572 */ 0x8AF7,0x6B65, + /* Array index: 0x1572 */ 0x8AF8,0x3D74, + /* Array index: 0x1572 */ 0x8AFA,0x3841, + /* Array index: 0x1572 */ 0x8B07,0x6B69, + /* Array index: 0x1572 */ 0x8B0C,0x6B68, + /* Array index: 0x1572 */ 0x8B0E,0x4666, + /* Array index: 0x1572 */ 0x8B10,0x6B6D, + /* Array index: 0x1572 */ 0x8B14,0x6B62, + /* Array index: 0x1572 */ 0x8B26,0x6B72, + /* Array index: 0x1572 */ 0x8B28,0x6B75, + /* Array index: 0x1572 */ 0x8B2B,0x6B73, + /* Array index: 0x1572 */ 0x8B2C,0x4935, + /* Array index: 0x1572 */ 0x8B33,0x6B70, + /* Array index: 0x1572 */ 0x8B39,0x3660, + /* Array index: 0x1572 */ 0x8B3E,0x6B74, + /* Array index: 0x1572 */ 0x8B41,0x6B76, + /* Array index: 0x1572 */ 0x8B49,0x6B7A, + /* Array index: 0x1572 */ 0x8B4C,0x6B77, + /* Array index: 0x1572 */ 0x8B4E,0x6B79, + /* Array index: 0x1572 */ 0x8B4F,0x6B78, + /* Array index: 0x1572 */ 0x8B56,0x6B7B, + /* Array index: 0x1572 */ 0x8B5F,0x6C21, + /* Array index: 0x1572 */ 0x8B66,0x3759, + /* Array index: 0x1572 */ 0x8B77,0x386E, + /* Array index: 0x1572 */ 0x8B7D,0x6C25, + /* Array index: 0x1572 */ 0x8B80,0x6C26, + /* Array index: 0x1572 */ 0x8B83,0x3B3E, + /* Array index: 0x1572 */ 0x8B8A,0x5A4E, + /* Array index: 0x1572 */ 0x8B8C,0x6C27, + /* Array index: 0x1572 */ 0x8B8E,0x6C28, + /* Array index: 0x1572 */ 0x8B90,0x3D32, + /* Array index: 0x1572 */ 0x8B92,0x6C29, + /* Array index: 0x1572 */ 0x8B93,0x6C2A, + /* Array index: 0x1572 */ 0x8B96,0x6C2B, + /* Array index: 0x1572 */ 0x8B99,0x6C2C, + /* Array index: 0x1572 */ 0x8B9A,0x6C2D, + /* Array index: 0x1572 */ 0x8C37,0x432B, + /* Array index: 0x1572 */ 0x8C3A,0x6C2E, + /* Array index: 0x1572 */ 0x8C3F,0x6C30, + /* Array index: 0x1572 */ 0x8C41,0x6C2F, + /* Array index: 0x1572 */ 0x8C46,0x4626, + /* Array index: 0x1572 */ 0x8C48,0x6C31, + /* Array index: 0x1572 */ 0x8C4A,0x4B2D, + /* Array index: 0x1572 */ 0x8C4C,0x6C32, + /* Array index: 0x1572 */ 0x8C4E,0x6C33, + /* Array index: 0x1572 */ 0x8C50,0x6C34, + /* Array index: 0x1572 */ 0x8C55,0x6C35, + /* Array index: 0x1572 */ 0x8C5A,0x465A, + /* Array index: 0x1572 */ 0x8C61,0x3E5D, + /* Array index: 0x1572 */ 0x8C62,0x6C36, + /* Array index: 0x1572 */ 0x8C82,0x6C3A, + /* Array index: 0x1572 */ 0x8C85,0x6C3C, + /* Array index: 0x1572 */ 0x8C94,0x6C40, + /* Array index: 0x1572 */ 0x8C98,0x6C42, + /* Array index: 0x1572 */ 0x8CD1,0x4678, + /* Array index: 0x1572 */ 0x8CD3,0x4950, + /* Array index: 0x1572 */ 0x8CEA,0x3C41, + /* Array index: 0x1572 */ 0x8CED,0x4552, + /* Array index: 0x1572 */ 0x8D64,0x4056, + /* Array index: 0x1572 */ 0x8D66,0x3C4F, + /* Array index: 0x1572 */ 0x8D67,0x6C5F, + /* Array index: 0x1572 */ 0x8D6B,0x3352, + /* Array index: 0x1572 */ 0x8D6D,0x6C60, + /* Array index: 0x1572 */ 0x8D77,0x352F, + /* Array index: 0x1572 */ 0x8D81,0x6C63, + /* Array index: 0x1572 */ 0x8D85,0x4436, + /* Array index: 0x1572 */ 0x8D8A,0x315B, + /* Array index: 0x1572 */ 0x8D99,0x6C64, + /* Array index: 0x1572 */ 0x8DA3,0x3C71, + /* Array index: 0x1572 */ 0x8DA8,0x3F76, + /* Array index: 0x1572 */ 0x8DB3,0x422D, + /* Array index: 0x1572 */ 0x8DBA,0x6C67, + /* Array index: 0x1572 */ 0x8DBE,0x6C66, + /* Array index: 0x1572 */ 0x8DC2,0x6C65, + /* Array index: 0x1572 */ 0x8DCB,0x6C6D, + /* Array index: 0x1572 */ 0x8DCC,0x6C6B, + /* Array index: 0x1572 */ 0x8DCF,0x6C68, + /* Array index: 0x1572 */ 0x8DD6,0x6C6A, + /* Array index: 0x1572 */ 0x8DDA,0x6C69, + /* Array index: 0x1572 */ 0x8DDB,0x6C6C, + /* Array index: 0x1572 */ 0x8DDD,0x3577, + /* Array index: 0x1572 */ 0x8DDF,0x6C70, + /* Array index: 0x1572 */ 0x8DE1,0x4057, + /* Array index: 0x1572 */ 0x8DE3,0x6C71, + /* Array index: 0x1572 */ 0x8DE8,0x3859, + /* Array index: 0x1572 */ 0x8DEA,0x6C6E, + /* Array index: 0x1572 */ 0x8DEB,0x6C6F, + /* Array index: 0x1572 */ 0x8DEF,0x4F29, + /* Array index: 0x1572 */ 0x8DF3,0x4437, + /* Array index: 0x1572 */ 0x8DF5,0x4129, + /* Array index: 0x1572 */ 0x8DFC,0x6C72, + /* Array index: 0x1572 */ 0x8DFF,0x6C75, + /* Array index: 0x1572 */ 0x8E0F,0x4627, + /* Array index: 0x1572 */ 0x8E10,0x6C78, + /* Array index: 0x1572 */ 0x8E2A,0x6D29, + /* Array index: 0x1572 */ 0x8E30,0x6C7C, + /* Array index: 0x1572 */ 0x8E34,0x6C7D, + /* Array index: 0x1572 */ 0x8E35,0x6C7B, + /* Array index: 0x1572 */ 0x8E42,0x6C7A, + /* Array index: 0x1572 */ 0x8E44,0x447D, + /* Array index: 0x1572 */ 0x8E50,0x6D24, + /* Array index: 0x1572 */ 0x8E55,0x6D2B, + /* Array index: 0x1572 */ 0x8E59,0x6D26, + /* Array index: 0x1572 */ 0x8E5F,0x4058, + /* Array index: 0x1572 */ 0x8E60,0x6D28, + /* Array index: 0x1572 */ 0x8E63,0x6D2A, + /* Array index: 0x1572 */ 0x8E64,0x6D27, + /* Array index: 0x1572 */ 0x8E72,0x6D2D, + /* Array index: 0x1572 */ 0x8E74,0x3D33, + /* Array index: 0x1572 */ 0x8E76,0x6D2C, + /* Array index: 0x1572 */ 0x8E7C,0x6D2E, + /* Array index: 0x1572 */ 0x8E81,0x6D2F, + /* Array index: 0x1572 */ 0x8E84,0x6D32, + /* Array index: 0x1572 */ 0x8E85,0x6D31, + /* Array index: 0x1572 */ 0x8E87,0x6D30, + /* Array index: 0x1572 */ 0x8E8A,0x6D34, + /* Array index: 0x1572 */ 0x8E8B,0x6D33, + /* Array index: 0x1572 */ 0x8E8D,0x4C76, + /* Array index: 0x1572 */ 0x8E91,0x6D36, + /* Array index: 0x1572 */ 0x8E93,0x6D35, + /* Array index: 0x1572 */ 0x8E94,0x6D37, + /* Array index: 0x1572 */ 0x8E99,0x6D38, + /* Array index: 0x1572 */ 0x8EA1,0x6D3A, + /* Array index: 0x1572 */ 0x8EBE,0x6D3F, + /* Array index: 0x1572 */ 0x8EC5,0x6D40, + /* Array index: 0x1572 */ 0x8EC6,0x6D3D, + /* Array index: 0x1572 */ 0x8ED2,0x382E, + /* Array index: 0x1572 */ 0x8EDB,0x6D43, + /* Array index: 0x1572 */ 0x8EDF,0x4670, + /* Array index: 0x1572 */ 0x8EE2,0x453E, + /* Array index: 0x1572 */ 0x8EE3,0x6D44, + /* Array index: 0x1572 */ 0x8EEB,0x6D47, + /* Array index: 0x1572 */ 0x8EF8,0x3C34, + /* Array index: 0x1572 */ 0x8F03,0x3353, + /* Array index: 0x1572 */ 0x8F05,0x6D4A, + /* Array index: 0x1572 */ 0x8F09,0x3A5C, + /* Array index: 0x1572 */ 0x8F0A,0x6D49, + /* Array index: 0x1572 */ 0x8F0C,0x6D52, + /* Array index: 0x1572 */ 0x8F26,0x6D53, + /* Array index: 0x1572 */ 0x8F29,0x475A, + /* Array index: 0x1572 */ 0x8F2A,0x4E58, + /* Array index: 0x1572 */ 0x8F2F,0x3D34, + /* Array index: 0x1572 */ 0x8F33,0x6D54, + /* Array index: 0x1572 */ 0x8F38,0x4D22, + /* Array index: 0x1572 */ 0x8F39,0x6D56, + /* Array index: 0x1572 */ 0x8F3B,0x6D55, + /* Array index: 0x1572 */ 0x8F3E,0x6D59, + /* Array index: 0x1572 */ 0x8F3F,0x4D41, + /* Array index: 0x1572 */ 0x8F49,0x6D5B, + /* Array index: 0x1572 */ 0x8F57,0x6D5E, + /* Array index: 0x1572 */ 0x8F5C,0x6D5F, + /* Array index: 0x1572 */ 0x8FA3,0x6D65, + /* Array index: 0x1572 */ 0x8FA7,0x5221, + /* Array index: 0x1572 */ 0x8FA8,0x517E, + /* Array index: 0x1572 */ 0x8FB7,0x6D68, + /* Array index: 0x1572 */ 0x8FBF,0x4329, + /* Array index: 0x1572 */ 0x8FC2,0x312A, + /* Array index: 0x1572 */ 0x8FC4,0x4B78, + /* Array index: 0x1572 */ 0x8FC5,0x3F57, + /* Array index: 0x1572 */ 0x8FCE,0x375E, + /* Array index: 0x1572 */ 0x8FD1,0x3661, + /* Array index: 0x1572 */ 0x8FD4,0x4A56, + /* Array index: 0x1572 */ 0x8FDA,0x6D69, + /* Array index: 0x1572 */ 0x8FE2,0x6D6B, + /* Array index: 0x1572 */ 0x8FF4,0x6D6F, + /* Array index: 0x1572 */ 0x8FFD,0x4449, + /* Array index: 0x1572 */ 0x9000,0x4260, + /* Array index: 0x1572 */ 0x9001,0x4177, + /* Array index: 0x1572 */ 0x9003,0x4628, + /* Array index: 0x1572 */ 0x9005,0x6D70, + /* Array index: 0x1572 */ 0x9006,0x3555, + /* Array index: 0x1572 */ 0x9027,0x6D7A, + /* Array index: 0x1572 */ 0x902E,0x4261, + /* Array index: 0x1572 */ 0x9031,0x3D35, + /* Array index: 0x1572 */ 0x9032,0x3F4A, + /* Array index: 0x1572 */ 0x903C,0x492F, + /* Array index: 0x1572 */ 0x903E,0x6E27, + /* Array index: 0x1572 */ 0x9041,0x465B, + /* Array index: 0x1572 */ 0x9042,0x3F6B, + /* Array index: 0x1572 */ 0x9045,0x4359, + /* Array index: 0x1572 */ 0x905C,0x423D, + /* Array index: 0x1572 */ 0x905E,0x6E2A, + /* Array index: 0x1572 */ 0x9060,0x3173, + /* Array index: 0x1572 */ 0x9061,0x414C, + /* Array index: 0x1572 */ 0x9063,0x382F, + /* Array index: 0x1572 */ 0x9065,0x4D5A, + /* Array index: 0x1572 */ 0x9068,0x6E2B, + /* Array index: 0x1572 */ 0x9069,0x452C, + /* Array index: 0x1572 */ 0x9072,0x6E2F, + /* Array index: 0x1572 */ 0x9087,0x6D6E, + /* Array index: 0x1572 */ 0x9089,0x6E35, + /* Array index: 0x1572 */ 0x908A,0x6E34, + /* Array index: 0x1572 */ 0x908F,0x6E36, + /* Array index: 0x1572 */ 0x9091,0x4D38, + /* Array index: 0x1572 */ 0x90A3,0x4661, + /* Array index: 0x1572 */ 0x90A6,0x4B2E, + /* Array index: 0x1572 */ 0x90A8,0x6E37, + /* Array index: 0x1572 */ 0x90AA,0x3C59, + /* Array index: 0x1572 */ 0x90AF,0x6E38, + /* Array index: 0x1572 */ 0x90B1,0x6E39, + /* Array index: 0x1572 */ 0x90B5,0x6E3A, + /* Array index: 0x1572 */ 0x90B8,0x4521, + /* Array index: 0x1572 */ 0x90C1,0x306A, + /* Array index: 0x1572 */ 0x90CA,0x3959, + /* Array index: 0x1572 */ 0x90CE,0x4F3A, + /* Array index: 0x1572 */ 0x90DB,0x6E3E, + /* Array index: 0x1572 */ 0x90E1,0x3734, + /* Array index: 0x1572 */ 0x90E2,0x6E3B, + /* Array index: 0x1572 */ 0x90E4,0x6E3C, + /* Array index: 0x1572 */ 0x90E8,0x4974, + /* Array index: 0x1572 */ 0x90ED,0x3354, + /* Array index: 0x1572 */ 0x90F5,0x4D39, + /* Array index: 0x1572 */ 0x90F7,0x363F, + /* Array index: 0x1572 */ 0x90FD,0x4554, + /* Array index: 0x1572 */ 0x9102,0x6E3F, + /* Array index: 0x1572 */ 0x9112,0x6E40, + /* Array index: 0x1572 */ 0x9119,0x6E41, + /* Array index: 0x1572 */ 0x912D,0x4522, + /* Array index: 0x1572 */ 0x9130,0x6E43, + /* Array index: 0x1572 */ 0x9132,0x6E42, + /* Array index: 0x1572 */ 0x9152,0x3C72, + /* Array index: 0x1572 */ 0x9154,0x3F6C, + /* Array index: 0x1572 */ 0x9156,0x6E45, + /* Array index: 0x1572 */ 0x9158,0x6E46, + /* Array index: 0x1572 */ 0x9162,0x3F5D, + /* Array index: 0x1572 */ 0x9163,0x6E47, + /* Array index: 0x1572 */ 0x9165,0x6E48, + /* Array index: 0x1572 */ 0x9169,0x6E49, + /* Array index: 0x1572 */ 0x916A,0x4D6F, + /* Array index: 0x1572 */ 0x916C,0x3D37, + /* Array index: 0x1572 */ 0x9172,0x6E4B, + /* Array index: 0x1572 */ 0x9173,0x6E4A, + /* Array index: 0x1572 */ 0x9175,0x395A, + /* Array index: 0x1572 */ 0x9177,0x3973, + /* Array index: 0x1572 */ 0x9178,0x3B40, + /* Array index: 0x1572 */ 0x9182,0x6E4E, + /* Array index: 0x1572 */ 0x9187,0x3D66, + /* Array index: 0x1572 */ 0x9189,0x6E4D, + /* Array index: 0x1572 */ 0x918B,0x6E4C, + /* Array index: 0x1572 */ 0x918D,0x4269, + /* Array index: 0x1572 */ 0x9190,0x386F, + /* Array index: 0x1572 */ 0x9192,0x4043, + /* Array index: 0x1572 */ 0x9197,0x4830, + /* Array index: 0x1572 */ 0x919C,0x3D39, + /* Array index: 0x1572 */ 0x91A2,0x6E4F, + /* Array index: 0x1572 */ 0x91A4,0x3E5F, + /* Array index: 0x1572 */ 0x91AA,0x6E52, + /* Array index: 0x1572 */ 0x91AB,0x6E50, + /* Array index: 0x1572 */ 0x91AF,0x6E51, + /* Array index: 0x1572 */ 0x91B4,0x6E54, + /* Array index: 0x1572 */ 0x91B5,0x6E53, + /* Array index: 0x1572 */ 0x91B8,0x3E7A, + /* Array index: 0x1572 */ 0x91BA,0x6E55, + /* Array index: 0x1572 */ 0x91C0,0x6E56, + /* Array index: 0x1572 */ 0x91C1,0x6E57, + /* Array index: 0x1572 */ 0x91D6,0x6E5B, + /* Array index: 0x1572 */ 0x91D8,0x4523, + /* Array index: 0x1572 */ 0x91F5,0x6E60, + /* Array index: 0x1572 */ 0x91F6,0x6E61, + /* Array index: 0x1572 */ 0x91FC,0x6E5F, + /* Array index: 0x1572 */ 0x91FF,0x6E63, + /* Array index: 0x1572 */ 0x920D,0x465F, + /* Array index: 0x1572 */ 0x920E,0x3343, + /* Array index: 0x1572 */ 0x9211,0x6E67, + /* Array index: 0x1572 */ 0x9214,0x6E64, + /* Array index: 0x1572 */ 0x9215,0x6E66, + /* Array index: 0x1572 */ 0x921E,0x6E62, + /* Array index: 0x1572 */ 0x9229,0x6F4F, + /* Array index: 0x1572 */ 0x922C,0x6E65, + /* Array index: 0x1572 */ 0x9234,0x4E6B, + /* Array index: 0x1572 */ 0x9237,0x385A, + /* Array index: 0x1572 */ 0x923F,0x6E6F, + /* Array index: 0x1572 */ 0x9244,0x4534, + /* Array index: 0x1572 */ 0x9245,0x6E6A, + /* Array index: 0x1572 */ 0x9248,0x6E6D, + /* Array index: 0x1572 */ 0x9249,0x6E6B, + /* Array index: 0x1572 */ 0x924B,0x6E70, + /* Array index: 0x1572 */ 0x9250,0x6E71, + /* Array index: 0x1572 */ 0x9257,0x6E69, + /* Array index: 0x1572 */ 0x925A,0x6E76, + /* Array index: 0x1572 */ 0x925B,0x3174, + /* Array index: 0x1572 */ 0x925E,0x6E68, + /* Array index: 0x1572 */ 0x9262,0x482D, + /* Array index: 0x1572 */ 0x9264,0x6E6C, + /* Array index: 0x1572 */ 0x9266,0x3E60, + /* Array index: 0x1572 */ 0x9271,0x395B, + /* Array index: 0x1572 */ 0x927E,0x4B48, + /* Array index: 0x1572 */ 0x9280,0x3664, + /* Array index: 0x1572 */ 0x9283,0x3D46, + /* Array index: 0x1572 */ 0x9285,0x463C, + /* Array index: 0x1572 */ 0x9291,0x412D, + /* Array index: 0x1572 */ 0x9293,0x6E74, + /* Array index: 0x1572 */ 0x9295,0x6E6E, + /* Array index: 0x1572 */ 0x9296,0x6E73, + /* Array index: 0x1572 */ 0x92AD,0x412C, + /* Array index: 0x1572 */ 0x92B7,0x6E79, + /* Array index: 0x1572 */ 0x92B9,0x6E78, + /* Array index: 0x1572 */ 0x92CF,0x6E77, + /* Array index: 0x1572 */ 0x92D2,0x4B2F, + /* Array index: 0x1572 */ 0x92E4,0x3D7B, + /* Array index: 0x1572 */ 0x92E9,0x6E7A, + /* Array index: 0x1572 */ 0x92EA,0x4A5F, + /* Array index: 0x1572 */ 0x92ED,0x3154, + /* Array index: 0x1572 */ 0x92F2,0x4946, + /* Array index: 0x1572 */ 0x92F3,0x4372, + /* Array index: 0x1572 */ 0x92F8,0x3578, + /* Array index: 0x1572 */ 0x92FA,0x6E7C, + /* Array index: 0x1572 */ 0x92FC,0x395D, + /* Array index: 0x1572 */ 0x9306,0x3B2C, + /* Array index: 0x1572 */ 0x930F,0x6E7B, + /* Array index: 0x1572 */ 0x9310,0x3F6D, + /* Array index: 0x1572 */ 0x9320,0x3E7B, + /* Array index: 0x1572 */ 0x9322,0x6F22, + /* Array index: 0x1572 */ 0x9323,0x6F24, + /* Array index: 0x1572 */ 0x9326,0x3653, + /* Array index: 0x1572 */ 0x9328,0x4945, + /* Array index: 0x1572 */ 0x9332,0x4F3F, + /* Array index: 0x1572 */ 0x9335,0x6F26, + /* Array index: 0x1572 */ 0x933A,0x6F25, + /* Array index: 0x1572 */ 0x933B,0x6F27, + /* Array index: 0x1572 */ 0x9344,0x6E7D, + /* Array index: 0x1572 */ 0x934B,0x4669, + /* Array index: 0x1572 */ 0x934D,0x4555, + /* Array index: 0x1572 */ 0x9354,0x4457, + /* Array index: 0x1572 */ 0x9356,0x6F2C, + /* Array index: 0x1572 */ 0x935B,0x4343, + /* Array index: 0x1572 */ 0x935C,0x6F28, + /* Array index: 0x1572 */ 0x9360,0x6F29, + /* Array index: 0x1572 */ 0x936C,0x372D, + /* Array index: 0x1572 */ 0x936E,0x6F2B, + /* Array index: 0x1572 */ 0x9375,0x3830, + /* Array index: 0x1572 */ 0x937C,0x6F2A, + /* Array index: 0x1572 */ 0x937E,0x3E61, + /* Array index: 0x1572 */ 0x938C,0x3379, + /* Array index: 0x1572 */ 0x9394,0x6F30, + /* Array index: 0x1572 */ 0x9396,0x3A3F, + /* Array index: 0x1572 */ 0x9397,0x4179, + /* Array index: 0x1572 */ 0x939A,0x444A, + /* Array index: 0x1572 */ 0x93A7,0x333B, + /* Array index: 0x1572 */ 0x93B9,0x6F31, + /* Array index: 0x1572 */ 0x93C3,0x6F37, + /* Array index: 0x1572 */ 0x93C8,0x6F3A, + /* Array index: 0x1572 */ 0x93D0,0x6F39, + /* Array index: 0x1572 */ 0x93D1,0x452D, + /* Array index: 0x1572 */ 0x93DD,0x6F38, + /* Array index: 0x1572 */ 0x93E1,0x3640, + /* Array index: 0x1572 */ 0x93E4,0x6F3B, + /* Array index: 0x1572 */ 0x93E5,0x6F35, + /* Array index: 0x1572 */ 0x93E8,0x6F34, + /* Array index: 0x1572 */ 0x9403,0x6F3F, + /* Array index: 0x1572 */ 0x9407,0x6F40, + /* Array index: 0x1572 */ 0x9410,0x6F41, + /* Array index: 0x1572 */ 0x9413,0x6F3E, + /* Array index: 0x1572 */ 0x9414,0x6F3D, + /* Array index: 0x1572 */ 0x9421,0x6F45, + /* Array index: 0x1572 */ 0x942B,0x6F43, + /* Array index: 0x1572 */ 0x9435,0x6F44, + /* Array index: 0x1572 */ 0x9436,0x6F42, + /* Array index: 0x1572 */ 0x9438,0x4278, + /* Array index: 0x1572 */ 0x943A,0x6F46, + /* Array index: 0x1572 */ 0x9441,0x6F47, + /* Array index: 0x1572 */ 0x9444,0x6F49, + /* Array index: 0x1572 */ 0x945A,0x6F54, + /* Array index: 0x1572 */ 0x945B,0x6F4A, + /* Array index: 0x1572 */ 0x945E,0x6F4D, + /* Array index: 0x1572 */ 0x9460,0x6F4B, + /* Array index: 0x1572 */ 0x9462,0x6F4C, + /* Array index: 0x1572 */ 0x946A,0x6F4E, + /* Array index: 0x1572 */ 0x9470,0x6F50, + /* Array index: 0x1572 */ 0x9475,0x6F51, + /* Array index: 0x1572 */ 0x9477,0x6F52, + /* Array index: 0x1572 */ 0x9577,0x4439, + /* Array index: 0x1572 */ 0x9580,0x4C67, + /* Array index: 0x1572 */ 0x9582,0x6F59, + /* Array index: 0x1572 */ 0x9583,0x412E, + /* Array index: 0x1572 */ 0x958F,0x313C, + /* Array index: 0x1572 */ 0x9591,0x3457, + /* Array index: 0x1572 */ 0x9593,0x3456, + /* Array index: 0x1572 */ 0x9594,0x6F5C, + /* Array index: 0x1572 */ 0x9596,0x6F5D, + /* Array index: 0x1572 */ 0x9598,0x6F5E, + /* Array index: 0x1572 */ 0x9599,0x6F5F, + /* Array index: 0x1572 */ 0x95AD,0x6F63, + /* Array index: 0x1572 */ 0x95B2,0x315C, + /* Array index: 0x1572 */ 0x95B9,0x6F66, + /* Array index: 0x1572 */ 0x95BB,0x6F65, + /* Array index: 0x1572 */ 0x95BC,0x6F64, + /* Array index: 0x1572 */ 0x95BE,0x6F67, + /* Array index: 0x1572 */ 0x95C3,0x6F6A, + /* Array index: 0x1572 */ 0x95C7,0x3047, + /* Array index: 0x1572 */ 0x95CA,0x6F68, + /* Array index: 0x1572 */ 0x95CC,0x6F6C, + /* Array index: 0x1572 */ 0x95CD,0x6F6B, + /* Array index: 0x1572 */ 0x95DC,0x6F70, + /* Array index: 0x1572 */ 0x95E1,0x6F71, + /* Array index: 0x1572 */ 0x95E2,0x6F73, + /* Array index: 0x1572 */ 0x95E5,0x6F72, + /* Array index: 0x1572 */ 0x961C,0x496C, + /* Array index: 0x1572 */ 0x9621,0x6F74, + /* Array index: 0x1572 */ 0x9628,0x6F75, + /* Array index: 0x1572 */ 0x962A,0x3A65, + /* Array index: 0x1572 */ 0x962E,0x6F76, + /* Array index: 0x1572 */ 0x962F,0x6F77, + /* Array index: 0x1572 */ 0x9632,0x4B49, + /* Array index: 0x1572 */ 0x963B,0x414B, + /* Array index: 0x1572 */ 0x963F,0x3024, + /* Array index: 0x1572 */ 0x9640,0x424B, + /* Array index: 0x1572 */ 0x9642,0x6F78, + /* Array index: 0x1572 */ 0x9644,0x496D, + /* Array index: 0x1572 */ 0x966A,0x4766, + /* Array index: 0x1572 */ 0x966C,0x7025, + /* Array index: 0x1572 */ 0x9670,0x3122, + /* Array index: 0x1572 */ 0x967D,0x4D5B, + /* Array index: 0x1572 */ 0x9685,0x3679, + /* Array index: 0x1572 */ 0x9686,0x4E34, + /* Array index: 0x1572 */ 0x9688,0x3728, + /* Array index: 0x1572 */ 0x96A0,0x3123, + /* Array index: 0x1572 */ 0x96A3,0x4E59, + /* Array index: 0x1572 */ 0x96A7,0x702B, + /* Array index: 0x1572 */ 0x96A8,0x6E2E, + /* Array index: 0x1572 */ 0x96AA,0x702A, + /* Array index: 0x1572 */ 0x96D1,0x3B28, + /* Array index: 0x1572 */ 0x96D5,0x703A, + /* Array index: 0x1572 */ 0x96D6,0x6A2D, + /* Array index: 0x1572 */ 0x96D9,0x5256, + /* Array index: 0x1572 */ 0x96DB,0x3F77, + /* Array index: 0x1572 */ 0x96DC,0x7038, + /* Array index: 0x1572 */ 0x96E2,0x4E25, + /* Array index: 0x1572 */ 0x96E3,0x4671, + /* Array index: 0x1572 */ 0x96E8,0x312B, + /* Array index: 0x1572 */ 0x96EA,0x4063, + /* Array index: 0x1572 */ 0x96EB,0x3C36, + /* Array index: 0x1572 */ 0x96F0,0x4A37, + /* Array index: 0x1572 */ 0x96F2,0x3140, + /* Array index: 0x1572 */ 0x96F6,0x4E6D, + /* Array index: 0x1572 */ 0x96F7,0x4D6B, + /* Array index: 0x1572 */ 0x96F9,0x703B, + /* Array index: 0x1572 */ 0x96FB,0x4545, + /* Array index: 0x1572 */ 0x9700,0x3C7B, + /* Array index: 0x1572 */ 0x9716,0x7043, + /* Array index: 0x1572 */ 0x9719,0x7044, + /* Array index: 0x1572 */ 0x971C,0x417A, + /* Array index: 0x1572 */ 0x971E,0x3262, + /* Array index: 0x1572 */ 0x9724,0x7045, + /* Array index: 0x1572 */ 0x9727,0x4C38, + /* Array index: 0x1572 */ 0x972A,0x7046, + /* Array index: 0x1572 */ 0x9730,0x7047, + /* Array index: 0x1572 */ 0x9732,0x4F2A, + /* Array index: 0x1572 */ 0x9738,0x5B31, + /* Array index: 0x1572 */ 0x9739,0x7048, + /* Array index: 0x1572 */ 0x973D,0x7049, + /* Array index: 0x1572 */ 0x973E,0x704A, + /* Array index: 0x1572 */ 0x9742,0x704E, + /* Array index: 0x1572 */ 0x9744,0x704B, + /* Array index: 0x1572 */ 0x9746,0x704C, + /* Array index: 0x1572 */ 0x9748,0x704D, + /* Array index: 0x1572 */ 0x9749,0x704F, + /* Array index: 0x1572 */ 0x9752,0x4044, + /* Array index: 0x1572 */ 0x9756,0x4C77, + /* Array index: 0x1572 */ 0x9759,0x4045, + /* Array index: 0x1572 */ 0x975C,0x7050, + /* Array index: 0x1572 */ 0x9771,0x7057, + /* Array index: 0x1572 */ 0x9774,0x3724, + /* Array index: 0x1572 */ 0x9779,0x7058, + /* Array index: 0x1572 */ 0x977A,0x705C, + /* Array index: 0x1572 */ 0x977C,0x705A, + /* Array index: 0x1572 */ 0x9781,0x705B, + /* Array index: 0x1572 */ 0x978B,0x705E, + /* Array index: 0x1572 */ 0x978D,0x3048, + /* Array index: 0x1572 */ 0x978F,0x705F, + /* Array index: 0x1572 */ 0x9790,0x7060, + /* Array index: 0x1572 */ 0x9798,0x3E64, + /* Array index: 0x1572 */ 0x979C,0x7061, + /* Array index: 0x1572 */ 0x97A0,0x3547, + /* Array index: 0x1572 */ 0x97A3,0x7064, + /* Array index: 0x1572 */ 0x97A6,0x7063, + /* Array index: 0x1572 */ 0x97A8,0x7062, + /* Array index: 0x1572 */ 0x97AB,0x6B71, + /* Array index: 0x1572 */ 0x97AD,0x4A5C, + /* Array index: 0x1572 */ 0x97B3,0x7065, + /* Array index: 0x1572 */ 0x97B4,0x7066, + /* Array index: 0x1572 */ 0x97C3,0x7067, + /* Array index: 0x1572 */ 0x97C6,0x7068, + /* Array index: 0x1572 */ 0x97C8,0x7069, + /* Array index: 0x1572 */ 0x97CB,0x706A, + /* Array index: 0x1572 */ 0x97D3,0x345A, + /* Array index: 0x1572 */ 0x97DC,0x706B, + /* Array index: 0x1572 */ 0x97ED,0x706C, + /* Array index: 0x1572 */ 0x97EE,0x4723, + /* Array index: 0x1572 */ 0x97FB,0x3124, + /* Array index: 0x1572 */ 0x980C,0x7073, + /* Array index: 0x1572 */ 0x9817,0x3F7C, + /* Array index: 0x1572 */ 0x9818,0x4E4E, + /* Array index: 0x1572 */ 0x981A,0x375B, + /* Array index: 0x1572 */ 0x9821,0x7076, + /* Array index: 0x1572 */ 0x9824,0x7075, + /* Array index: 0x1572 */ 0x982C,0x4B4B, + /* Array index: 0x1572 */ 0x982D,0x462C, + /* Array index: 0x1572 */ 0x9834,0x3150, + /* Array index: 0x1572 */ 0x9846,0x7079, + /* Array index: 0x1572 */ 0x9854,0x3469, + /* Array index: 0x1572 */ 0x9855,0x3832, + /* Array index: 0x1572 */ 0x9858,0x346A, + /* Array index: 0x1572 */ 0x985B,0x453F, + /* Array index: 0x1572 */ 0x985E,0x4E60, + /* Array index: 0x1572 */ 0x9867,0x385C, + /* Array index: 0x1572 */ 0x986B,0x707C, + /* Array index: 0x1572 */ 0x98A8,0x4977, + /* Array index: 0x1572 */ 0x98AA,0x7124, + /* Array index: 0x1572 */ 0x98AF,0x7125, + /* Array index: 0x1572 */ 0x98B1,0x7126, + /* Array index: 0x1572 */ 0x98B6,0x7127, + /* Array index: 0x1572 */ 0x98C3,0x7129, + /* Array index: 0x1572 */ 0x98C4,0x7128, + /* Array index: 0x1572 */ 0x98C6,0x712A, + /* Array index: 0x1572 */ 0x98DB,0x4874, + /* Array index: 0x1572 */ 0x98DC,0x664C, + /* Array index: 0x1572 */ 0x98DF,0x3F29, + /* Array index: 0x1572 */ 0x98E2,0x3532, + /* Array index: 0x1572 */ 0x98E9,0x712B, + /* Array index: 0x1572 */ 0x98F2,0x307B, + /* Array index: 0x1572 */ 0x98F4,0x303B, + /* Array index: 0x1572 */ 0x9903,0x712D, + /* Array index: 0x1572 */ 0x9905,0x4C5F, + /* Array index: 0x1572 */ 0x9909,0x712E, + /* Array index: 0x1572 */ 0x990A,0x4D5C, + /* Array index: 0x1572 */ 0x990C,0x3142, + /* Array index: 0x1572 */ 0x9918,0x7131, + /* Array index: 0x1572 */ 0x9924,0x7135, + /* Array index: 0x1572 */ 0x9928,0x345B, + /* Array index: 0x1572 */ 0x992C,0x7137, + /* Array index: 0x1572 */ 0x992E,0x7138, + /* Array index: 0x1572 */ 0x993D,0x7139, + /* Array index: 0x1572 */ 0x993E,0x713A, + /* Array index: 0x1572 */ 0x9942,0x713B, + /* Array index: 0x1572 */ 0x9945,0x713D, + /* Array index: 0x1572 */ 0x9949,0x713C, + /* Array index: 0x1572 */ 0x994B,0x713F, + /* Array index: 0x1572 */ 0x994C,0x7142, + /* Array index: 0x1572 */ 0x9955,0x7143, + /* Array index: 0x1572 */ 0x9957,0x3642, + /* Array index: 0x1572 */ 0x99A5,0x7146, + /* Array index: 0x1572 */ 0x99A8,0x333E, + /* Array index: 0x1572 */ 0x99B3,0x435A, + /* Array index: 0x1572 */ 0x99B4,0x466B, + /* Array index: 0x1572 */ 0x99BC,0x7149, + /* Array index: 0x1572 */ 0x99C1,0x477D, + /* Array index: 0x1572 */ 0x99D5,0x326F, + /* Array index: 0x1572 */ 0x99D8,0x714D, + /* Array index: 0x1572 */ 0x99DB,0x714B, + /* Array index: 0x1572 */ 0x99DD,0x714C, + /* Array index: 0x1572 */ 0x99DF,0x714A, + /* Array index: 0x1572 */ 0x99E2,0x7158, + /* Array index: 0x1572 */ 0x99ED,0x714F, + /* Array index: 0x1572 */ 0x99EE,0x7150, + /* Array index: 0x1572 */ 0x99F1,0x7151, + /* Array index: 0x1572 */ 0x99F2,0x7152, + /* Array index: 0x1572 */ 0x99F8,0x7154, + /* Array index: 0x1572 */ 0x99FB,0x7153, + /* Array index: 0x1572 */ 0x99FF,0x3D59, + /* Array index: 0x1572 */ 0x9A01,0x7155, + /* Array index: 0x1572 */ 0x9A05,0x7157, + /* Array index: 0x1572 */ 0x9A0E,0x3533, + /* Array index: 0x1572 */ 0x9A0F,0x7156, + /* Array index: 0x1572 */ 0x9A12,0x417B, + /* Array index: 0x1572 */ 0x9A13,0x3833, + /* Array index: 0x1572 */ 0x9A19,0x7159, + /* Array index: 0x1572 */ 0x9A28,0x424D, + /* Array index: 0x1572 */ 0x9A2B,0x715A, + /* Array index: 0x1572 */ 0x9A30,0x462D, + /* Array index: 0x1572 */ 0x9A37,0x715B, + /* Array index: 0x1572 */ 0x9A3E,0x7160, + /* Array index: 0x1572 */ 0x9A40,0x715E, + /* Array index: 0x1572 */ 0x9A42,0x715D, + /* Array index: 0x1572 */ 0x9A43,0x715F, + /* Array index: 0x1572 */ 0x9A45,0x715C, + /* Array index: 0x1572 */ 0x9A4D,0x7162, + /* Array index: 0x1572 */ 0x9A55,0x7161, + /* Array index: 0x1572 */ 0x9A57,0x7164, + /* Array index: 0x1572 */ 0x9A5A,0x3643, + /* Array index: 0x1572 */ 0x9A5B,0x7163, + /* Array index: 0x1572 */ 0x9A5F,0x7165, + /* Array index: 0x1572 */ 0x9A62,0x7166, + /* Array index: 0x1572 */ 0x9A64,0x7168, + /* Array index: 0x1572 */ 0x9A65,0x7167, + /* Array index: 0x1572 */ 0x9AA8,0x397C, + /* Array index: 0x1572 */ 0x9AAD,0x716C, + /* Array index: 0x1572 */ 0x9AB0,0x716D, + /* Array index: 0x1572 */ 0x9AB8,0x333C, + /* Array index: 0x1572 */ 0x9ABC,0x716E, + /* Array index: 0x1572 */ 0x9AC0,0x716F, + /* Array index: 0x1572 */ 0x9AC4,0x3F71, + /* Array index: 0x1572 */ 0x9ACF,0x7170, + /* Array index: 0x1572 */ 0x9AD1,0x7171, + /* Array index: 0x1572 */ 0x9AD3,0x7172, + /* Array index: 0x1572 */ 0x9AD4,0x7173, + /* Array index: 0x1572 */ 0x9AD8,0x3962, + /* Array index: 0x1572 */ 0x9ADE,0x7174, + /* Array index: 0x1572 */ 0x9ADF,0x7175, + /* Array index: 0x1572 */ 0x9AE2,0x7176, + /* Array index: 0x1572 */ 0x9AE3,0x7177, + /* Array index: 0x1572 */ 0x9AE6,0x7178, + /* Array index: 0x1572 */ 0x9AF4,0x717C, + /* Array index: 0x1572 */ 0x9AF7,0x717E, + /* Array index: 0x1572 */ 0x9AFB,0x7221, + /* Array index: 0x1572 */ 0x9B06,0x7222, + /* Array index: 0x1572 */ 0x9B18,0x7223, + /* Array index: 0x1572 */ 0x9B1A,0x7224, + /* Array index: 0x1572 */ 0x9B1F,0x7225, + /* Array index: 0x1572 */ 0x9B22,0x7226, + /* Array index: 0x1572 */ 0x9B23,0x7227, + /* Array index: 0x1572 */ 0x9B3B,0x6478, + /* Array index: 0x1572 */ 0x9B3C,0x3534, + /* Array index: 0x1572 */ 0x9B54,0x4B62, + /* Array index: 0x1572 */ 0x9B58,0x7236, + /* Array index: 0x1572 */ 0x9B5A,0x357B, + /* Array index: 0x1572 */ 0x9B6F,0x4F25, + /* Array index: 0x1572 */ 0x9B74,0x7237, + /* Array index: 0x1572 */ 0x9B83,0x7239, + /* Array index: 0x1572 */ 0x9B8E,0x303E, + /* Array index: 0x1572 */ 0x9B9F,0x723D, + /* Array index: 0x1572 */ 0x9BA0,0x723E, + /* Array index: 0x1572 */ 0x9BA8,0x723F, + /* Array index: 0x1572 */ 0x9BB4,0x7240, + /* Array index: 0x1572 */ 0x9BB9,0x7243, + /* Array index: 0x1572 */ 0x9BC0,0x7241, + /* Array index: 0x1572 */ 0x9BC6,0x7244, + /* Array index: 0x1572 */ 0x9BC9,0x3871, + /* Array index: 0x1572 */ 0x9BCA,0x7242, + /* Array index: 0x1572 */ 0x9BCF,0x7245, + /* Array index: 0x1572 */ 0x9BD1,0x7246, + /* Array index: 0x1572 */ 0x9BD2,0x7247, + /* Array index: 0x1572 */ 0x9BD4,0x724B, + /* Array index: 0x1572 */ 0x9BD6,0x3B2A, + /* Array index: 0x1572 */ 0x9BDB,0x4264, + /* Array index: 0x1572 */ 0x9BE8,0x375F, + /* Array index: 0x1572 */ 0x9BF5,0x3033, + /* Array index: 0x1572 */ 0x9C04,0x725A, + /* Array index: 0x1572 */ 0x9C1B,0x725C, + /* Array index: 0x1572 */ 0x9C21,0x725F, + /* Array index: 0x1572 */ 0x9C24,0x725E, + /* Array index: 0x1572 */ 0x9C25,0x725D, + /* Array index: 0x1572 */ 0x9C3E,0x7264, + /* Array index: 0x1572 */ 0x9C52,0x4B70, + /* Array index: 0x1572 */ 0x9C57,0x4E5A, + /* Array index: 0x1572 */ 0x9C5A,0x7265, + /* Array index: 0x1572 */ 0x9C60,0x7266, + /* Array index: 0x1572 */ 0x9C67,0x7267, + /* Array index: 0x1572 */ 0x9C76,0x7268, + /* Array index: 0x1572 */ 0x9C78,0x7269, + /* Array index: 0x1572 */ 0x9CE5,0x443B, + /* Array index: 0x1572 */ 0x9CE7,0x726A, + /* Array index: 0x1572 */ 0x9CE9,0x4837, + /* Array index: 0x1572 */ 0x9CEB,0x726F, + /* Array index: 0x1572 */ 0x9CEC,0x726B, + /* Array index: 0x1572 */ 0x9CF0,0x726C, + /* Array index: 0x1572 */ 0x9CF3,0x4B31, + /* Array index: 0x1572 */ 0x9CF4,0x4C44, + /* Array index: 0x1572 */ 0x9CF6,0x4650, + /* Array index: 0x1572 */ 0x9D03,0x7270, + /* Array index: 0x1572 */ 0x9D0E,0x322A, + /* Array index: 0x1572 */ 0x9D12,0x7279, + /* Array index: 0x1572 */ 0x9D15,0x7278, + /* Array index: 0x1572 */ 0x9D1B,0x3175, + /* Array index: 0x1572 */ 0x9D1F,0x7276, + /* Array index: 0x1572 */ 0x9D23,0x7275, + /* Array index: 0x1572 */ 0x9D26,0x7273, + /* Array index: 0x1572 */ 0x9D3B,0x3963, + /* Array index: 0x1572 */ 0x9D3E,0x727C, + /* Array index: 0x1572 */ 0x9D3F,0x727B, + /* Array index: 0x1572 */ 0x9D41,0x727A, + /* Array index: 0x1572 */ 0x9D44,0x7277, + /* Array index: 0x1572 */ 0x9D46,0x727D, + /* Array index: 0x1572 */ 0x9D48,0x727E, + /* Array index: 0x1572 */ 0x9D50,0x7325, + /* Array index: 0x1572 */ 0x9D51,0x7324, + /* Array index: 0x1572 */ 0x9D59,0x7326, + /* Array index: 0x1572 */ 0x9D64,0x7323, + /* Array index: 0x1572 */ 0x9D6C,0x4B32, + /* Array index: 0x1572 */ 0x9D6F,0x732B, + /* Array index: 0x1572 */ 0x9D72,0x7327, + /* Array index: 0x1572 */ 0x9D7A,0x732C, + /* Array index: 0x1572 */ 0x9D87,0x7329, + /* Array index: 0x1572 */ 0x9D89,0x7328, + /* Array index: 0x1572 */ 0x9D8F,0x375C, + /* Array index: 0x1572 */ 0x9D9A,0x732D, + /* Array index: 0x1572 */ 0x9DA4,0x732E, + /* Array index: 0x1572 */ 0x9DA9,0x732F, + /* Array index: 0x1572 */ 0x9DAB,0x732A, + /* Array index: 0x1572 */ 0x9DAF,0x7274, + /* Array index: 0x1572 */ 0x9DB2,0x7330, + /* Array index: 0x1572 */ 0x9DB4,0x4461, + /* Array index: 0x1572 */ 0x9DB8,0x7334, + /* Array index: 0x1572 */ 0x9DBA,0x7335, + /* Array index: 0x1572 */ 0x9DBB,0x7333, + /* Array index: 0x1572 */ 0x9DC1,0x7332, + /* Array index: 0x1572 */ 0x9DC2,0x7338, + /* Array index: 0x1572 */ 0x9DC4,0x7331, + /* Array index: 0x1572 */ 0x9DC6,0x7336, + /* Array index: 0x1572 */ 0x9DCF,0x7337, + /* Array index: 0x1572 */ 0x9DD3,0x733A, + /* Array index: 0x1572 */ 0x9DD9,0x7339, + /* Array index: 0x1572 */ 0x9DE6,0x733C, + /* Array index: 0x1572 */ 0x9DED,0x733D, + /* Array index: 0x1572 */ 0x9DEF,0x733E, + /* Array index: 0x1572 */ 0x9DF2,0x4F49, + /* Array index: 0x1572 */ 0x9DFD,0x733F, + /* Array index: 0x1572 */ 0x9E1A,0x7340, + /* Array index: 0x1572 */ 0x9E1B,0x7341, + /* Array index: 0x1572 */ 0x9E1E,0x7342, + /* Array index: 0x1572 */ 0x9E75,0x7343, + /* Array index: 0x1572 */ 0x9E78,0x3834, + /* Array index: 0x1572 */ 0x9E79,0x7344, + /* Array index: 0x1572 */ 0x9E7D,0x7345, + /* Array index: 0x1572 */ 0x9E7F,0x3C2F, + /* Array index: 0x1572 */ 0x9E81,0x7346, + /* Array index: 0x1572 */ 0x9E88,0x7347, + /* Array index: 0x1572 */ 0x9E8B,0x7348, + /* Array index: 0x1572 */ 0x9E8C,0x7349, + /* Array index: 0x1572 */ 0x9E9D,0x734D, + /* Array index: 0x1572 */ 0x9E9F,0x4E5B, + /* Array index: 0x1572 */ 0x9EA5,0x734E, + /* Array index: 0x1572 */ 0x9EA6,0x477E, + /* Array index: 0x1572 */ 0x9EA9,0x734F, + /* Array index: 0x1572 */ 0x9EAA,0x7351, + /* Array index: 0x1572 */ 0x9EAD,0x7352, + /* Array index: 0x1572 */ 0x9EC4,0x322B, + /* Array index: 0x1572 */ 0x9EE5,0x735D, + /* Array index: 0x1572 */ 0x9EE8,0x735E, + /* Array index: 0x1572 */ 0x9EEF,0x735F, + /* Array index: 0x1572 */ 0x9EF4,0x7360, + /* Array index: 0x1572 */ 0x9EF6,0x7361, + /* Array index: 0x1572 */ 0x9EF7,0x7362, + /* Array index: 0x1572 */ 0x9F07,0x7367, + /* Array index: 0x1572 */ 0x9F08,0x7368, + /* Array index: 0x1572 */ 0x9F0E,0x4524, + /* Array index: 0x1572 */ 0x9F13,0x385D, + /* Array index: 0x1572 */ 0x9F15,0x736A, + /* Array index: 0x1572 */ 0x9F20,0x414D, + /* Array index: 0x1572 */ 0x9F21,0x736B, + /* Array index: 0x1572 */ 0x9F2C,0x736C, + /* Array index: 0x1572 */ 0x9F3B,0x4921, + /* Array index: 0x1572 */ 0x9F3E,0x736D, + /* Array index: 0x1572 */ 0x9F4A,0x736E, + /* Array index: 0x1572 */ 0x9F4B,0x6337, + /* Array index: 0x1572 */ 0x9F4E,0x6C5A, + /* Array index: 0x1572 */ 0x9F4F,0x706D, + /* Array index: 0x1572 */ 0x9F52,0x736F, + /* Array index: 0x1572 */ 0x9F54,0x7370, + /* Array index: 0x1572 */ 0x9F6A,0x7378, + /* Array index: 0x1572 */ 0x9F6C,0x7377, + /* Array index: 0x1572 */ 0x9F72,0x737A, + /* Array index: 0x1572 */ 0x9F76,0x737B, + /* Array index: 0x1572 */ 0x9F77,0x7379, + /* Array index: 0x1572 */ 0x9F8D,0x4E36, + /* Array index: 0x1572 */ 0x9F95,0x737C, + /* Array index: 0x1572 */ 0x9F9C,0x737D, + /* Array index: 0x1572 */ 0x9F9D,0x6354, + /* Array index: 0x1572 */ 0x9FA0,0x737E, + /* Array index: 0x1572 */ 0xFFE3,0x2131, + /* Array index: 0x1572 */ 0xFFE5,0x216F, +}; + +#endif /* ICONV_FROM_UCS_CCS_JIS_X0208_1990 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * jis_x0208_1990 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_jis_x0208_1990 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_JIS_X0208_1990, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_jis_x0208_1990, /* UCS -> jis_x0208_1990 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_JIS_X0208_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_jis_x0208_1990, /* UCS -> jis_x0208_1990 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_jis_x0208_1990 /* jis_x0208_1990 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_JIS_X0208_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_jis_x0208_1990 /* jis_x0208_1990 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0208_1990) || ... */ + diff --git a/lib/iconv/ccs/jis_x0212_1990.c b/lib/iconv/ccs/jis_x0212_1990.c new file mode 100644 index 0000000..613de7d --- /dev/null +++ b/lib/iconv/ccs/jis_x0212_1990.c @@ -0,0 +1,11385 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for jis_x0212_1990 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + || defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit jis_x0212_1990 -> UCS speed-optimized table (35328 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_jis_x0212_1990[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,0x0100,INVBLK,INVBLK,INVBLK,0x0200,0x0300, + INVBLK,0x0400,0x0500,0x0600,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0700,0x0800,0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00, + 0x0F00,0x1000,0x1100,0x1200,0x1300,0x1400,0x1500,0x1600, + 0x1700,0x1800,0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00, + 0x1F00,0x2000,0x2100,0x2200,0x2300,0x2400,0x2500,0x2600, + 0x2700,0x2800,0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00, + 0x2F00,0x3000,0x3100,0x3200,0x3300,0x3400,0x3500,0x3600, + 0x3700,0x3800,0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00, + 0x3F00,0x4000,0x4100,0x4200,0x4300,0x4400,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 35, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x02D8, + 0x02C7,0x00B8,0x02D9,0x02DD,0x00AF,0x02DB,0x02DA,0x007E, + 0x0384,0x0385,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x00A1,0x00A6,0x00BF,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x00BA,0x00AA,0x00A9,0x00AE,0x2122, + 0x00A4,0x2116,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0386,0x0388,0x0389,0x038A,0x03AA,INVALC,0x038C, + INVALC,0x038E,0x03AB,INVALC,0x038F,INVALC,INVALC,INVALC, + INVALC,0x03AC,0x03AD,0x03AE,0x03AF,0x03CA,0x0390,0x03CC, + 0x03C2,0x03CD,0x03CB,0x03B0,0x03CE,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 40, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,0x040E,0x040F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457, + 0x0458,0x0459,0x045A,0x045B,0x045C,0x045E,0x045F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 42, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x00C6,0x0110,INVALC,0x0126,INVALC,0x0132,INVALC, + 0x0141,0x013F,INVALC,0x014A,0x00D8,0x0152,INVALC,0x0166, + 0x00DE,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x00E6,0x0111,0x00F0,0x0127,0x0131,0x0133,0x0138, + 0x0142,0x0140,0x0149,0x014B,0x00F8,0x0153,0x00DF,0x0167, + 0x00FE,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 43, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x00C1,0x00C0,0x00C4,0x00C2,0x0102,0x01CD,0x0100, + 0x0104,0x00C5,0x00C3,0x0106,0x0108,0x010C,0x00C7,0x010A, + 0x010E,0x00C9,0x00C8,0x00CB,0x00CA,0x011A,0x0116,0x0112, + 0x0118,INVALC,0x011C,0x011E,0x0122,0x0120,0x0124,0x00CD, + 0x00CC,0x00CF,0x00CE,0x01CF,0x0130,0x012A,0x012E,0x0128, + 0x0134,0x0136,0x0139,0x013D,0x013B,0x0143,0x0147,0x0145, + 0x00D1,0x00D3,0x00D2,0x00D6,0x00D4,0x01D1,0x0150,0x014C, + 0x00D5,0x0154,0x0158,0x0156,0x015A,0x015C,0x0160,0x015E, + 0x0164,0x0162,0x00DA,0x00D9,0x00DC,0x00DB,0x016C,0x01D3, + 0x0170,0x016A,0x0172,0x016E,0x0168,0x01D7,0x01DB,0x01D9, + 0x01D5,0x0174,0x00DD,0x0178,0x0176,0x0179,0x017D,0x017B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 44, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x00E1,0x00E0,0x00E4,0x00E2,0x0103,0x01CE,0x0101, + 0x0105,0x00E5,0x00E3,0x0107,0x0109,0x010D,0x00E7,0x010B, + 0x010F,0x00E9,0x00E8,0x00EB,0x00EA,0x011B,0x0117,0x0113, + 0x0119,0x01F5,0x011D,0x011F,INVALC,0x0121,0x0125,0x00ED, + 0x00EC,0x00EF,0x00EE,0x01D0,INVALC,0x012B,0x012F,0x0129, + 0x0135,0x0137,0x013A,0x013E,0x013C,0x0144,0x0148,0x0146, + 0x00F1,0x00F3,0x00F2,0x00F6,0x00F4,0x01D2,0x0151,0x014D, + 0x00F5,0x0155,0x0159,0x0157,0x015B,0x015D,0x0161,0x015F, + 0x0165,0x0163,0x00FA,0x00F9,0x00FC,0x00FB,0x016D,0x01D4, + 0x0171,0x016B,0x0173,0x016F,0x0169,0x01D8,0x01DC,0x01DA, + 0x01D6,0x0175,0x00FD,0x00FF,0x0177,0x017A,0x017E,0x017C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E02,0x4E04,0x4E05,0x4E0C,0x4E12,0x4E1F,0x4E23, + 0x4E24,0x4E28,0x4E2B,0x4E2E,0x4E2F,0x4E30,0x4E35,0x4E40, + 0x4E41,0x4E44,0x4E47,0x4E51,0x4E5A,0x4E5C,0x4E63,0x4E68, + 0x4E69,0x4E74,0x4E75,0x4E79,0x4E7F,0x4E8D,0x4E96,0x4E97, + 0x4E9D,0x4EAF,0x4EB9,0x4EC3,0x4ED0,0x4EDA,0x4EDB,0x4EE0, + 0x4EE1,0x4EE2,0x4EE8,0x4EEF,0x4EF1,0x4EF3,0x4EF5,0x4EFD, + 0x4EFE,0x4EFF,0x4F00,0x4F02,0x4F03,0x4F08,0x4F0B,0x4F0C, + 0x4F12,0x4F15,0x4F16,0x4F17,0x4F19,0x4F2E,0x4F31,0x4F60, + 0x4F33,0x4F35,0x4F37,0x4F39,0x4F3B,0x4F3E,0x4F40,0x4F42, + 0x4F48,0x4F49,0x4F4B,0x4F4C,0x4F52,0x4F54,0x4F56,0x4F58, + 0x4F5F,0x4F63,0x4F6A,0x4F6C,0x4F6E,0x4F71,0x4F77,0x4F78, + 0x4F79,0x4F7A,0x4F7D,0x4F7E,0x4F81,0x4F82,0x4F84,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F85,0x4F89,0x4F8A,0x4F8C,0x4F8E,0x4F90,0x4F92, + 0x4F93,0x4F94,0x4F97,0x4F99,0x4F9A,0x4F9E,0x4F9F,0x4FB2, + 0x4FB7,0x4FB9,0x4FBB,0x4FBC,0x4FBD,0x4FBE,0x4FC0,0x4FC1, + 0x4FC5,0x4FC6,0x4FC8,0x4FC9,0x4FCB,0x4FCC,0x4FCD,0x4FCF, + 0x4FD2,0x4FDC,0x4FE0,0x4FE2,0x4FF0,0x4FF2,0x4FFC,0x4FFD, + 0x4FFF,0x5000,0x5001,0x5004,0x5007,0x500A,0x500C,0x500E, + 0x5010,0x5013,0x5017,0x5018,0x501B,0x501C,0x501D,0x501E, + 0x5022,0x5027,0x502E,0x5030,0x5032,0x5033,0x5035,0x5040, + 0x5041,0x5042,0x5045,0x5046,0x504A,0x504C,0x504E,0x5051, + 0x5052,0x5053,0x5057,0x5059,0x505F,0x5060,0x5062,0x5063, + 0x5066,0x5067,0x506A,0x506D,0x5070,0x5071,0x503B,0x5081, + 0x5083,0x5084,0x5086,0x508A,0x508E,0x508F,0x5090,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5092,0x5093,0x5094,0x5096,0x509B,0x509C,0x509E, + 0x509F,0x50A0,0x50A1,0x50A2,0x50AA,0x50AF,0x50B0,0x50B9, + 0x50BA,0x50BD,0x50C0,0x50C3,0x50C4,0x50C7,0x50CC,0x50CE, + 0x50D0,0x50D3,0x50D4,0x50D8,0x50DC,0x50DD,0x50DF,0x50E2, + 0x50E4,0x50E6,0x50E8,0x50E9,0x50EF,0x50F1,0x50F6,0x50FA, + 0x50FE,0x5103,0x5106,0x5107,0x5108,0x510B,0x510C,0x510D, + 0x510E,0x50F2,0x5110,0x5117,0x5119,0x511B,0x511C,0x511D, + 0x511E,0x5123,0x5127,0x5128,0x512C,0x512D,0x512F,0x5131, + 0x5133,0x5134,0x5135,0x5138,0x5139,0x5142,0x514A,0x514F, + 0x5153,0x5155,0x5157,0x5158,0x515F,0x5164,0x5166,0x517E, + 0x5183,0x5184,0x518B,0x518E,0x5198,0x519D,0x51A1,0x51A3, + 0x51AD,0x51B8,0x51BA,0x51BC,0x51BE,0x51BF,0x51C2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x51C8,0x51CF,0x51D1,0x51D2,0x51D3,0x51D5,0x51D8, + 0x51DE,0x51E2,0x51E5,0x51EE,0x51F2,0x51F3,0x51F4,0x51F7, + 0x5201,0x5202,0x5205,0x5212,0x5213,0x5215,0x5216,0x5218, + 0x5222,0x5228,0x5231,0x5232,0x5235,0x523C,0x5245,0x5249, + 0x5255,0x5257,0x5258,0x525A,0x525C,0x525F,0x5260,0x5261, + 0x5266,0x526E,0x5277,0x5278,0x5279,0x5280,0x5282,0x5285, + 0x528A,0x528C,0x5293,0x5295,0x5296,0x5297,0x5298,0x529A, + 0x529C,0x52A4,0x52A5,0x52A6,0x52A7,0x52AF,0x52B0,0x52B6, + 0x52B7,0x52B8,0x52BA,0x52BB,0x52BD,0x52C0,0x52C4,0x52C6, + 0x52C8,0x52CC,0x52CF,0x52D1,0x52D4,0x52D6,0x52DB,0x52DC, + 0x52E1,0x52E5,0x52E8,0x52E9,0x52EA,0x52EC,0x52F0,0x52F1, + 0x52F4,0x52F6,0x52F7,0x5300,0x5303,0x530A,0x530B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 53, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x530C,0x5311,0x5313,0x5318,0x531B,0x531C,0x531E, + 0x531F,0x5325,0x5327,0x5328,0x5329,0x532B,0x532C,0x532D, + 0x5330,0x5332,0x5335,0x533C,0x533D,0x533E,0x5342,0x534C, + 0x534B,0x5359,0x535B,0x5361,0x5363,0x5365,0x536C,0x536D, + 0x5372,0x5379,0x537E,0x5383,0x5387,0x5388,0x538E,0x5393, + 0x5394,0x5399,0x539D,0x53A1,0x53A4,0x53AA,0x53AB,0x53AF, + 0x53B2,0x53B4,0x53B5,0x53B7,0x53B8,0x53BA,0x53BD,0x53C0, + 0x53C5,0x53CF,0x53D2,0x53D3,0x53D5,0x53DA,0x53DD,0x53DE, + 0x53E0,0x53E6,0x53E7,0x53F5,0x5402,0x5413,0x541A,0x5421, + 0x5427,0x5428,0x542A,0x542F,0x5431,0x5434,0x5435,0x5443, + 0x5444,0x5447,0x544D,0x544F,0x545E,0x5462,0x5464,0x5466, + 0x5467,0x5469,0x546B,0x546D,0x546E,0x5474,0x547F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 54, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5481,0x5483,0x5485,0x5488,0x5489,0x548D,0x5491, + 0x5495,0x5496,0x549C,0x549F,0x54A1,0x54A6,0x54A7,0x54A9, + 0x54AA,0x54AD,0x54AE,0x54B1,0x54B7,0x54B9,0x54BA,0x54BB, + 0x54BF,0x54C6,0x54CA,0x54CD,0x54CE,0x54E0,0x54EA,0x54EC, + 0x54EF,0x54F6,0x54FC,0x54FE,0x54FF,0x5500,0x5501,0x5505, + 0x5508,0x5509,0x550C,0x550D,0x550E,0x5515,0x552A,0x552B, + 0x5532,0x5535,0x5536,0x553B,0x553C,0x553D,0x5541,0x5547, + 0x5549,0x554A,0x554D,0x5550,0x5551,0x5558,0x555A,0x555B, + 0x555E,0x5560,0x5561,0x5564,0x5566,0x557F,0x5581,0x5582, + 0x5586,0x5588,0x558E,0x558F,0x5591,0x5592,0x5593,0x5594, + 0x5597,0x55A3,0x55A4,0x55AD,0x55B2,0x55BF,0x55C1,0x55C3, + 0x55C6,0x55C9,0x55CB,0x55CC,0x55CE,0x55D1,0x55D2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 55, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x55D3,0x55D7,0x55D8,0x55DB,0x55DE,0x55E2,0x55E9, + 0x55F6,0x55FF,0x5605,0x5608,0x560A,0x560D,0x560E,0x560F, + 0x5610,0x5611,0x5612,0x5619,0x562C,0x5630,0x5633,0x5635, + 0x5637,0x5639,0x563B,0x563C,0x563D,0x563F,0x5640,0x5641, + 0x5643,0x5644,0x5646,0x5649,0x564B,0x564D,0x564F,0x5654, + 0x565E,0x5660,0x5661,0x5662,0x5663,0x5666,0x5669,0x566D, + 0x566F,0x5671,0x5672,0x5675,0x5684,0x5685,0x5688,0x568B, + 0x568C,0x5695,0x5699,0x569A,0x569D,0x569E,0x569F,0x56A6, + 0x56A7,0x56A8,0x56A9,0x56AB,0x56AC,0x56AD,0x56B1,0x56B3, + 0x56B7,0x56BE,0x56C5,0x56C9,0x56CA,0x56CB,0x56CF,0x56D0, + 0x56CC,0x56CD,0x56D9,0x56DC,0x56DD,0x56DF,0x56E1,0x56E4, + 0x56E5,0x56E6,0x56E7,0x56E8,0x56F1,0x56EB,0x56ED,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 56, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x56F6,0x56F7,0x5701,0x5702,0x5707,0x570A,0x570C, + 0x5711,0x5715,0x571A,0x571B,0x571D,0x5720,0x5722,0x5723, + 0x5724,0x5725,0x5729,0x572A,0x572C,0x572E,0x572F,0x5733, + 0x5734,0x573D,0x573E,0x573F,0x5745,0x5746,0x574C,0x574D, + 0x5752,0x5762,0x5765,0x5767,0x5768,0x576B,0x576D,0x576E, + 0x576F,0x5770,0x5771,0x5773,0x5774,0x5775,0x5777,0x5779, + 0x577A,0x577B,0x577C,0x577E,0x5781,0x5783,0x578C,0x5794, + 0x5797,0x5799,0x579A,0x579C,0x579D,0x579E,0x579F,0x57A1, + 0x5795,0x57A7,0x57A8,0x57A9,0x57AC,0x57B8,0x57BD,0x57C7, + 0x57C8,0x57CC,0x57CF,0x57D5,0x57DD,0x57DE,0x57E4,0x57E6, + 0x57E7,0x57E9,0x57ED,0x57F0,0x57F5,0x57F6,0x57F8,0x57FD, + 0x57FE,0x57FF,0x5803,0x5804,0x5808,0x5809,0x57E1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 57, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x580C,0x580D,0x581B,0x581E,0x581F,0x5820,0x5826, + 0x5827,0x582D,0x5832,0x5839,0x583F,0x5849,0x584C,0x584D, + 0x584F,0x5850,0x5855,0x585F,0x5861,0x5864,0x5867,0x5868, + 0x5878,0x587C,0x587F,0x5880,0x5881,0x5887,0x5888,0x5889, + 0x588A,0x588C,0x588D,0x588F,0x5890,0x5894,0x5896,0x589D, + 0x58A0,0x58A1,0x58A2,0x58A6,0x58A9,0x58B1,0x58B2,0x58C4, + 0x58BC,0x58C2,0x58C8,0x58CD,0x58CE,0x58D0,0x58D2,0x58D4, + 0x58D6,0x58DA,0x58DD,0x58E1,0x58E2,0x58E9,0x58F3,0x5905, + 0x5906,0x590B,0x590C,0x5912,0x5913,0x5914,0x8641,0x591D, + 0x5921,0x5923,0x5924,0x5928,0x592F,0x5930,0x5933,0x5935, + 0x5936,0x593F,0x5943,0x5946,0x5952,0x5953,0x5959,0x595B, + 0x595D,0x595E,0x595F,0x5961,0x5963,0x596B,0x596D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 58, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x596F,0x5972,0x5975,0x5976,0x5979,0x597B,0x597C, + 0x598B,0x598C,0x598E,0x5992,0x5995,0x5997,0x599F,0x59A4, + 0x59A7,0x59AD,0x59AE,0x59AF,0x59B0,0x59B3,0x59B7,0x59BA, + 0x59BC,0x59C1,0x59C3,0x59C4,0x59C8,0x59CA,0x59CD,0x59D2, + 0x59DD,0x59DE,0x59DF,0x59E3,0x59E4,0x59E7,0x59EE,0x59EF, + 0x59F1,0x59F2,0x59F4,0x59F7,0x5A00,0x5A04,0x5A0C,0x5A0D, + 0x5A0E,0x5A12,0x5A13,0x5A1E,0x5A23,0x5A24,0x5A27,0x5A28, + 0x5A2A,0x5A2D,0x5A30,0x5A44,0x5A45,0x5A47,0x5A48,0x5A4C, + 0x5A50,0x5A55,0x5A5E,0x5A63,0x5A65,0x5A67,0x5A6D,0x5A77, + 0x5A7A,0x5A7B,0x5A7E,0x5A8B,0x5A90,0x5A93,0x5A96,0x5A99, + 0x5A9C,0x5A9E,0x5A9F,0x5AA0,0x5AA2,0x5AA7,0x5AAC,0x5AB1, + 0x5AB2,0x5AB3,0x5AB5,0x5AB8,0x5ABA,0x5ABB,0x5ABF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 59, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5AC4,0x5AC6,0x5AC8,0x5ACF,0x5ADA,0x5ADC,0x5AE0, + 0x5AE5,0x5AEA,0x5AEE,0x5AF5,0x5AF6,0x5AFD,0x5B00,0x5B01, + 0x5B08,0x5B17,0x5B34,0x5B19,0x5B1B,0x5B1D,0x5B21,0x5B25, + 0x5B2D,0x5B38,0x5B41,0x5B4B,0x5B4C,0x5B52,0x5B56,0x5B5E, + 0x5B68,0x5B6E,0x5B6F,0x5B7C,0x5B7D,0x5B7E,0x5B7F,0x5B81, + 0x5B84,0x5B86,0x5B8A,0x5B8E,0x5B90,0x5B91,0x5B93,0x5B94, + 0x5B96,0x5BA8,0x5BA9,0x5BAC,0x5BAD,0x5BAF,0x5BB1,0x5BB2, + 0x5BB7,0x5BBA,0x5BBC,0x5BC0,0x5BC1,0x5BCD,0x5BCF,0x5BD6, + 0x5BD7,0x5BD8,0x5BD9,0x5BDA,0x5BE0,0x5BEF,0x5BF1,0x5BF4, + 0x5BFD,0x5C0C,0x5C17,0x5C1E,0x5C1F,0x5C23,0x5C26,0x5C29, + 0x5C2B,0x5C2C,0x5C2E,0x5C30,0x5C32,0x5C35,0x5C36,0x5C59, + 0x5C5A,0x5C5C,0x5C62,0x5C63,0x5C67,0x5C68,0x5C69,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 60, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C6D,0x5C70,0x5C74,0x5C75,0x5C7A,0x5C7B,0x5C7C, + 0x5C7D,0x5C87,0x5C88,0x5C8A,0x5C8F,0x5C92,0x5C9D,0x5C9F, + 0x5CA0,0x5CA2,0x5CA3,0x5CA6,0x5CAA,0x5CB2,0x5CB4,0x5CB5, + 0x5CBA,0x5CC9,0x5CCB,0x5CD2,0x5CDD,0x5CD7,0x5CEE,0x5CF1, + 0x5CF2,0x5CF4,0x5D01,0x5D06,0x5D0D,0x5D12,0x5D2B,0x5D23, + 0x5D24,0x5D26,0x5D27,0x5D31,0x5D34,0x5D39,0x5D3D,0x5D3F, + 0x5D42,0x5D43,0x5D46,0x5D48,0x5D55,0x5D51,0x5D59,0x5D4A, + 0x5D5F,0x5D60,0x5D61,0x5D62,0x5D64,0x5D6A,0x5D6D,0x5D70, + 0x5D79,0x5D7A,0x5D7E,0x5D7F,0x5D81,0x5D83,0x5D88,0x5D8A, + 0x5D92,0x5D93,0x5D94,0x5D95,0x5D99,0x5D9B,0x5D9F,0x5DA0, + 0x5DA7,0x5DAB,0x5DB0,0x5DB4,0x5DB8,0x5DB9,0x5DC3,0x5DC7, + 0x5DCB,0x5DD0,0x5DCE,0x5DD8,0x5DD9,0x5DE0,0x5DE4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 61, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5DE9,0x5DF8,0x5DF9,0x5E00,0x5E07,0x5E0D,0x5E12, + 0x5E14,0x5E15,0x5E18,0x5E1F,0x5E20,0x5E2E,0x5E28,0x5E32, + 0x5E35,0x5E3E,0x5E4B,0x5E50,0x5E49,0x5E51,0x5E56,0x5E58, + 0x5E5B,0x5E5C,0x5E5E,0x5E68,0x5E6A,0x5E6B,0x5E6C,0x5E6D, + 0x5E6E,0x5E70,0x5E80,0x5E8B,0x5E8E,0x5EA2,0x5EA4,0x5EA5, + 0x5EA8,0x5EAA,0x5EAC,0x5EB1,0x5EB3,0x5EBD,0x5EBE,0x5EBF, + 0x5EC6,0x5ECC,0x5ECB,0x5ECE,0x5ED1,0x5ED2,0x5ED4,0x5ED5, + 0x5EDC,0x5EDE,0x5EE5,0x5EEB,0x5F02,0x5F06,0x5F07,0x5F08, + 0x5F0E,0x5F19,0x5F1C,0x5F1D,0x5F21,0x5F22,0x5F23,0x5F24, + 0x5F28,0x5F2B,0x5F2C,0x5F2E,0x5F30,0x5F34,0x5F36,0x5F3B, + 0x5F3D,0x5F3F,0x5F40,0x5F44,0x5F45,0x5F47,0x5F4D,0x5F50, + 0x5F54,0x5F58,0x5F5B,0x5F60,0x5F63,0x5F64,0x5F67,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 62, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F6F,0x5F72,0x5F74,0x5F75,0x5F78,0x5F7A,0x5F7D, + 0x5F7E,0x5F89,0x5F8D,0x5F8F,0x5F96,0x5F9C,0x5F9D,0x5FA2, + 0x5FA7,0x5FAB,0x5FA4,0x5FAC,0x5FAF,0x5FB0,0x5FB1,0x5FB8, + 0x5FC4,0x5FC7,0x5FC8,0x5FC9,0x5FCB,0x5FD0,0x5FD1,0x5FD2, + 0x5FD3,0x5FD4,0x5FDE,0x5FE1,0x5FE2,0x5FE8,0x5FE9,0x5FEA, + 0x5FEC,0x5FED,0x5FEE,0x5FEF,0x5FF2,0x5FF3,0x5FF6,0x5FFA, + 0x5FFC,0x6007,0x600A,0x600D,0x6013,0x6014,0x6017,0x6018, + 0x601A,0x601F,0x6024,0x602D,0x6033,0x6035,0x6040,0x6047, + 0x6048,0x6049,0x604C,0x6051,0x6054,0x6056,0x6057,0x605D, + 0x6061,0x6067,0x6071,0x607E,0x607F,0x6082,0x6086,0x6088, + 0x608A,0x608E,0x6091,0x6093,0x6095,0x6098,0x609D,0x609E, + 0x60A2,0x60A4,0x60A5,0x60A8,0x60B0,0x60B1,0x60B7,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 63, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x60BB,0x60BE,0x60C2,0x60C4,0x60C8,0x60C9,0x60CA, + 0x60CB,0x60CE,0x60CF,0x60D4,0x60D5,0x60D9,0x60DB,0x60DD, + 0x60DE,0x60E2,0x60E5,0x60F2,0x60F5,0x60F8,0x60FC,0x60FD, + 0x6102,0x6107,0x610A,0x610C,0x6110,0x6111,0x6112,0x6113, + 0x6114,0x6116,0x6117,0x6119,0x611C,0x611E,0x6122,0x612A, + 0x612B,0x6130,0x6131,0x6135,0x6136,0x6137,0x6139,0x6141, + 0x6145,0x6146,0x6149,0x615E,0x6160,0x616C,0x6172,0x6178, + 0x617B,0x617C,0x617F,0x6180,0x6181,0x6183,0x6184,0x618B, + 0x618D,0x6192,0x6193,0x6197,0x6198,0x619C,0x619D,0x619F, + 0x61A0,0x61A5,0x61A8,0x61AA,0x61AD,0x61B8,0x61B9,0x61BC, + 0x61C0,0x61C1,0x61C2,0x61CE,0x61CF,0x61D5,0x61DC,0x61DD, + 0x61DE,0x61DF,0x61E1,0x61E2,0x61E7,0x61E9,0x61E5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 64, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x61EC,0x61ED,0x61EF,0x6201,0x6203,0x6204,0x6207, + 0x6213,0x6215,0x621C,0x6220,0x6222,0x6223,0x6227,0x6229, + 0x622B,0x6239,0x623D,0x6242,0x6243,0x6244,0x6246,0x624C, + 0x6250,0x6251,0x6252,0x6254,0x6256,0x625A,0x625C,0x6264, + 0x626D,0x626F,0x6273,0x627A,0x627D,0x628D,0x628E,0x628F, + 0x6290,0x62A6,0x62A8,0x62B3,0x62B6,0x62B7,0x62BA,0x62BE, + 0x62BF,0x62C4,0x62CE,0x62D5,0x62D6,0x62DA,0x62EA,0x62F2, + 0x62F4,0x62FC,0x62FD,0x6303,0x6304,0x630A,0x630B,0x630D, + 0x6310,0x6313,0x6316,0x6318,0x6329,0x632A,0x632D,0x6335, + 0x6336,0x6339,0x633C,0x6341,0x6342,0x6343,0x6344,0x6346, + 0x634A,0x634B,0x634E,0x6352,0x6353,0x6354,0x6358,0x635B, + 0x6365,0x6366,0x636C,0x636D,0x6371,0x6374,0x6375,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 65, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6378,0x637C,0x637D,0x637F,0x6382,0x6384,0x6387, + 0x638A,0x6390,0x6394,0x6395,0x6399,0x639A,0x639E,0x63A4, + 0x63A6,0x63AD,0x63AE,0x63AF,0x63BD,0x63C1,0x63C5,0x63C8, + 0x63CE,0x63D1,0x63D3,0x63D4,0x63D5,0x63DC,0x63E0,0x63E5, + 0x63EA,0x63EC,0x63F2,0x63F3,0x63F5,0x63F8,0x63F9,0x6409, + 0x640A,0x6410,0x6412,0x6414,0x6418,0x641E,0x6420,0x6422, + 0x6424,0x6425,0x6429,0x642A,0x642F,0x6430,0x6435,0x643D, + 0x643F,0x644B,0x644F,0x6451,0x6452,0x6453,0x6454,0x645A, + 0x645B,0x645C,0x645D,0x645F,0x6460,0x6461,0x6463,0x646D, + 0x6473,0x6474,0x647B,0x647D,0x6485,0x6487,0x648F,0x6490, + 0x6491,0x6498,0x6499,0x649B,0x649D,0x649F,0x64A1,0x64A3, + 0x64A6,0x64A8,0x64AC,0x64B3,0x64BD,0x64BE,0x64BF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 66, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x64C4,0x64C9,0x64CA,0x64CB,0x64CC,0x64CE,0x64D0, + 0x64D1,0x64D5,0x64D7,0x64E4,0x64E5,0x64E9,0x64EA,0x64ED, + 0x64F0,0x64F5,0x64F7,0x64FB,0x64FF,0x6501,0x6504,0x6508, + 0x6509,0x650A,0x650F,0x6513,0x6514,0x6516,0x6519,0x651B, + 0x651E,0x651F,0x6522,0x6526,0x6529,0x652E,0x6531,0x653A, + 0x653C,0x653D,0x6543,0x6547,0x6549,0x6550,0x6552,0x6554, + 0x655F,0x6560,0x6567,0x656B,0x657A,0x657D,0x6581,0x6585, + 0x658A,0x6592,0x6595,0x6598,0x659D,0x65A0,0x65A3,0x65A6, + 0x65AE,0x65B2,0x65B3,0x65B4,0x65BF,0x65C2,0x65C8,0x65C9, + 0x65CE,0x65D0,0x65D4,0x65D6,0x65D8,0x65DF,0x65F0,0x65F2, + 0x65F4,0x65F5,0x65F9,0x65FE,0x65FF,0x6600,0x6604,0x6608, + 0x6609,0x660D,0x6611,0x6612,0x6615,0x6616,0x661D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 67, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x661E,0x6621,0x6622,0x6623,0x6624,0x6626,0x6629, + 0x662A,0x662B,0x662C,0x662E,0x6630,0x6631,0x6633,0x6639, + 0x6637,0x6640,0x6645,0x6646,0x664A,0x664C,0x6651,0x664E, + 0x6657,0x6658,0x6659,0x665B,0x665C,0x6660,0x6661,0x66FB, + 0x666A,0x666B,0x666C,0x667E,0x6673,0x6675,0x667F,0x6677, + 0x6678,0x6679,0x667B,0x6680,0x667C,0x668B,0x668C,0x668D, + 0x6690,0x6692,0x6699,0x669A,0x669B,0x669C,0x669F,0x66A0, + 0x66A4,0x66AD,0x66B1,0x66B2,0x66B5,0x66BB,0x66BF,0x66C0, + 0x66C2,0x66C3,0x66C8,0x66CC,0x66CE,0x66CF,0x66D4,0x66DB, + 0x66DF,0x66E8,0x66EB,0x66EC,0x66EE,0x66FA,0x6705,0x6707, + 0x670E,0x6713,0x6719,0x671C,0x6720,0x6722,0x6733,0x673E, + 0x6745,0x6747,0x6748,0x674C,0x6754,0x6755,0x675D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 68, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6766,0x676C,0x676E,0x6774,0x6776,0x677B,0x6781, + 0x6784,0x678E,0x678F,0x6791,0x6793,0x6796,0x6798,0x6799, + 0x679B,0x67B0,0x67B1,0x67B2,0x67B5,0x67BB,0x67BC,0x67BD, + 0x67F9,0x67C0,0x67C2,0x67C3,0x67C5,0x67C8,0x67C9,0x67D2, + 0x67D7,0x67D9,0x67DC,0x67E1,0x67E6,0x67F0,0x67F2,0x67F6, + 0x67F7,0x6852,0x6814,0x6819,0x681D,0x681F,0x6828,0x6827, + 0x682C,0x682D,0x682F,0x6830,0x6831,0x6833,0x683B,0x683F, + 0x6844,0x6845,0x684A,0x684C,0x6855,0x6857,0x6858,0x685B, + 0x686B,0x686E,0x686F,0x6870,0x6871,0x6872,0x6875,0x6879, + 0x687A,0x687B,0x687C,0x6882,0x6884,0x6886,0x6888,0x6896, + 0x6898,0x689A,0x689C,0x68A1,0x68A3,0x68A5,0x68A9,0x68AA, + 0x68AE,0x68B2,0x68BB,0x68C5,0x68C8,0x68CC,0x68CF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 69, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x68D0,0x68D1,0x68D3,0x68D6,0x68D9,0x68DC,0x68DD, + 0x68E5,0x68E8,0x68EA,0x68EB,0x68EC,0x68ED,0x68F0,0x68F1, + 0x68F5,0x68F6,0x68FB,0x68FC,0x68FD,0x6906,0x6909,0x690A, + 0x6910,0x6911,0x6913,0x6916,0x6917,0x6931,0x6933,0x6935, + 0x6938,0x693B,0x6942,0x6945,0x6949,0x694E,0x6957,0x695B, + 0x6963,0x6964,0x6965,0x6966,0x6968,0x6969,0x696C,0x6970, + 0x6971,0x6972,0x697A,0x697B,0x697F,0x6980,0x698D,0x6992, + 0x6996,0x6998,0x69A1,0x69A5,0x69A6,0x69A8,0x69AB,0x69AD, + 0x69AF,0x69B7,0x69B8,0x69BA,0x69BC,0x69C5,0x69C8,0x69D1, + 0x69D6,0x69D7,0x69E2,0x69E5,0x69EE,0x69EF,0x69F1,0x69F3, + 0x69F5,0x69FE,0x6A00,0x6A01,0x6A03,0x6A0F,0x6A11,0x6A15, + 0x6A1A,0x6A1D,0x6A20,0x6A24,0x6A28,0x6A30,0x6A32,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 70, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A34,0x6A37,0x6A3B,0x6A3E,0x6A3F,0x6A45,0x6A46, + 0x6A49,0x6A4A,0x6A4E,0x6A50,0x6A51,0x6A52,0x6A55,0x6A56, + 0x6A5B,0x6A64,0x6A67,0x6A6A,0x6A71,0x6A73,0x6A7E,0x6A81, + 0x6A83,0x6A86,0x6A87,0x6A89,0x6A8B,0x6A91,0x6A9B,0x6A9D, + 0x6A9E,0x6A9F,0x6AA5,0x6AAB,0x6AAF,0x6AB0,0x6AB1,0x6AB4, + 0x6ABD,0x6ABE,0x6ABF,0x6AC6,0x6AC9,0x6AC8,0x6ACC,0x6AD0, + 0x6AD4,0x6AD5,0x6AD6,0x6ADC,0x6ADD,0x6AE4,0x6AE7,0x6AEC, + 0x6AF0,0x6AF1,0x6AF2,0x6AFC,0x6AFD,0x6B02,0x6B03,0x6B06, + 0x6B07,0x6B09,0x6B0F,0x6B10,0x6B11,0x6B17,0x6B1B,0x6B1E, + 0x6B24,0x6B28,0x6B2B,0x6B2C,0x6B2F,0x6B35,0x6B36,0x6B3B, + 0x6B3F,0x6B46,0x6B4A,0x6B4D,0x6B52,0x6B56,0x6B58,0x6B5D, + 0x6B60,0x6B67,0x6B6B,0x6B6E,0x6B70,0x6B75,0x6B7D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 71, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B7E,0x6B82,0x6B85,0x6B97,0x6B9B,0x6B9F,0x6BA0, + 0x6BA2,0x6BA3,0x6BA8,0x6BA9,0x6BAC,0x6BAD,0x6BAE,0x6BB0, + 0x6BB8,0x6BB9,0x6BBD,0x6BBE,0x6BC3,0x6BC4,0x6BC9,0x6BCC, + 0x6BD6,0x6BDA,0x6BE1,0x6BE3,0x6BE6,0x6BE7,0x6BEE,0x6BF1, + 0x6BF7,0x6BF9,0x6BFF,0x6C02,0x6C04,0x6C05,0x6C09,0x6C0D, + 0x6C0E,0x6C10,0x6C12,0x6C19,0x6C1F,0x6C26,0x6C27,0x6C28, + 0x6C2C,0x6C2E,0x6C33,0x6C35,0x6C36,0x6C3A,0x6C3B,0x6C3F, + 0x6C4A,0x6C4B,0x6C4D,0x6C4F,0x6C52,0x6C54,0x6C59,0x6C5B, + 0x6C5C,0x6C6B,0x6C6D,0x6C6F,0x6C74,0x6C76,0x6C78,0x6C79, + 0x6C7B,0x6C85,0x6C86,0x6C87,0x6C89,0x6C94,0x6C95,0x6C97, + 0x6C98,0x6C9C,0x6C9F,0x6CB0,0x6CB2,0x6CB4,0x6CC2,0x6CC6, + 0x6CCD,0x6CCF,0x6CD0,0x6CD1,0x6CD2,0x6CD4,0x6CD6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 72, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6CDA,0x6CDC,0x6CE0,0x6CE7,0x6CE9,0x6CEB,0x6CEC, + 0x6CEE,0x6CF2,0x6CF4,0x6D04,0x6D07,0x6D0A,0x6D0E,0x6D0F, + 0x6D11,0x6D13,0x6D1A,0x6D26,0x6D27,0x6D28,0x6C67,0x6D2E, + 0x6D2F,0x6D31,0x6D39,0x6D3C,0x6D3F,0x6D57,0x6D5E,0x6D5F, + 0x6D61,0x6D65,0x6D67,0x6D6F,0x6D70,0x6D7C,0x6D82,0x6D87, + 0x6D91,0x6D92,0x6D94,0x6D96,0x6D97,0x6D98,0x6DAA,0x6DAC, + 0x6DB4,0x6DB7,0x6DB9,0x6DBD,0x6DBF,0x6DC4,0x6DC8,0x6DCA, + 0x6DCE,0x6DCF,0x6DD6,0x6DDB,0x6DDD,0x6DDF,0x6DE0,0x6DE2, + 0x6DE5,0x6DE9,0x6DEF,0x6DF0,0x6DF4,0x6DF6,0x6DFC,0x6E00, + 0x6E04,0x6E1E,0x6E22,0x6E27,0x6E32,0x6E36,0x6E39,0x6E3B, + 0x6E3C,0x6E44,0x6E45,0x6E48,0x6E49,0x6E4B,0x6E4F,0x6E51, + 0x6E52,0x6E53,0x6E54,0x6E57,0x6E5C,0x6E5D,0x6E5E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 73, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E62,0x6E63,0x6E68,0x6E73,0x6E7B,0x6E7D,0x6E8D, + 0x6E93,0x6E99,0x6EA0,0x6EA7,0x6EAD,0x6EAE,0x6EB1,0x6EB3, + 0x6EBB,0x6EBF,0x6EC0,0x6EC1,0x6EC3,0x6EC7,0x6EC8,0x6ECA, + 0x6ECD,0x6ECE,0x6ECF,0x6EEB,0x6EED,0x6EEE,0x6EF9,0x6EFB, + 0x6EFD,0x6F04,0x6F08,0x6F0A,0x6F0C,0x6F0D,0x6F16,0x6F18, + 0x6F1A,0x6F1B,0x6F26,0x6F29,0x6F2A,0x6F2F,0x6F30,0x6F33, + 0x6F36,0x6F3B,0x6F3C,0x6F2D,0x6F4F,0x6F51,0x6F52,0x6F53, + 0x6F57,0x6F59,0x6F5A,0x6F5D,0x6F5E,0x6F61,0x6F62,0x6F68, + 0x6F6C,0x6F7D,0x6F7E,0x6F83,0x6F87,0x6F88,0x6F8B,0x6F8C, + 0x6F8D,0x6F90,0x6F92,0x6F93,0x6F94,0x6F96,0x6F9A,0x6F9F, + 0x6FA0,0x6FA5,0x6FA6,0x6FA7,0x6FA8,0x6FAE,0x6FAF,0x6FB0, + 0x6FB5,0x6FB6,0x6FBC,0x6FC5,0x6FC7,0x6FC8,0x6FCA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 74, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6FDA,0x6FDE,0x6FE8,0x6FE9,0x6FF0,0x6FF5,0x6FF9, + 0x6FFC,0x6FFD,0x7000,0x7005,0x7006,0x7007,0x700D,0x7017, + 0x7020,0x7023,0x702F,0x7034,0x7037,0x7039,0x703C,0x7043, + 0x7044,0x7048,0x7049,0x704A,0x704B,0x7054,0x7055,0x705D, + 0x705E,0x704E,0x7064,0x7065,0x706C,0x706E,0x7075,0x7076, + 0x707E,0x7081,0x7085,0x7086,0x7094,0x7095,0x7096,0x7097, + 0x7098,0x709B,0x70A4,0x70AB,0x70B0,0x70B1,0x70B4,0x70B7, + 0x70CA,0x70D1,0x70D3,0x70D4,0x70D5,0x70D6,0x70D8,0x70DC, + 0x70E4,0x70FA,0x7103,0x7104,0x7105,0x7106,0x7107,0x710B, + 0x710C,0x710F,0x711E,0x7120,0x712B,0x712D,0x712F,0x7130, + 0x7131,0x7138,0x7141,0x7145,0x7146,0x7147,0x714A,0x714B, + 0x7150,0x7152,0x7157,0x715A,0x715C,0x715E,0x7160,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 75, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7168,0x7179,0x7180,0x7185,0x7187,0x718C,0x7192, + 0x719A,0x719B,0x71A0,0x71A2,0x71AF,0x71B0,0x71B2,0x71B3, + 0x71BA,0x71BF,0x71C0,0x71C1,0x71C4,0x71CB,0x71CC,0x71D3, + 0x71D6,0x71D9,0x71DA,0x71DC,0x71F8,0x71FE,0x7200,0x7207, + 0x7208,0x7209,0x7213,0x7217,0x721A,0x721D,0x721F,0x7224, + 0x722B,0x722F,0x7234,0x7238,0x7239,0x7241,0x7242,0x7243, + 0x7245,0x724E,0x724F,0x7250,0x7253,0x7255,0x7256,0x725A, + 0x725C,0x725E,0x7260,0x7263,0x7268,0x726B,0x726E,0x726F, + 0x7271,0x7277,0x7278,0x727B,0x727C,0x727F,0x7284,0x7289, + 0x728D,0x728E,0x7293,0x729B,0x72A8,0x72AD,0x72AE,0x72B1, + 0x72B4,0x72BE,0x72C1,0x72C7,0x72C9,0x72CC,0x72D5,0x72D6, + 0x72D8,0x72DF,0x72E5,0x72F3,0x72F4,0x72FA,0x72FB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 76, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x72FE,0x7302,0x7304,0x7305,0x7307,0x730B,0x730D, + 0x7312,0x7313,0x7318,0x7319,0x731E,0x7322,0x7324,0x7327, + 0x7328,0x732C,0x7331,0x7332,0x7335,0x733A,0x733B,0x733D, + 0x7343,0x734D,0x7350,0x7352,0x7356,0x7358,0x735D,0x735E, + 0x735F,0x7360,0x7366,0x7367,0x7369,0x736B,0x736C,0x736E, + 0x736F,0x7371,0x7377,0x7379,0x737C,0x7380,0x7381,0x7383, + 0x7385,0x7386,0x738E,0x7390,0x7393,0x7395,0x7397,0x7398, + 0x739C,0x739E,0x739F,0x73A0,0x73A2,0x73A5,0x73A6,0x73AA, + 0x73AB,0x73AD,0x73B5,0x73B7,0x73B9,0x73BC,0x73BD,0x73BF, + 0x73C5,0x73C6,0x73C9,0x73CB,0x73CC,0x73CF,0x73D2,0x73D3, + 0x73D6,0x73D9,0x73DD,0x73E1,0x73E3,0x73E6,0x73E7,0x73E9, + 0x73F4,0x73F5,0x73F7,0x73F9,0x73FA,0x73FB,0x73FD,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 77, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x73FF,0x7400,0x7401,0x7404,0x7407,0x740A,0x7411, + 0x741A,0x741B,0x7424,0x7426,0x7428,0x7429,0x742A,0x742B, + 0x742C,0x742D,0x742E,0x742F,0x7430,0x7431,0x7439,0x7440, + 0x7443,0x7444,0x7446,0x7447,0x744B,0x744D,0x7451,0x7452, + 0x7457,0x745D,0x7462,0x7466,0x7467,0x7468,0x746B,0x746D, + 0x746E,0x7471,0x7472,0x7480,0x7481,0x7485,0x7486,0x7487, + 0x7489,0x748F,0x7490,0x7491,0x7492,0x7498,0x7499,0x749A, + 0x749C,0x749F,0x74A0,0x74A1,0x74A3,0x74A6,0x74A8,0x74A9, + 0x74AA,0x74AB,0x74AE,0x74AF,0x74B1,0x74B2,0x74B5,0x74B9, + 0x74BB,0x74BF,0x74C8,0x74C9,0x74CC,0x74D0,0x74D3,0x74D8, + 0x74DA,0x74DB,0x74DE,0x74DF,0x74E4,0x74E8,0x74EA,0x74EB, + 0x74EF,0x74F4,0x74FA,0x74FB,0x74FC,0x74FF,0x7506,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 78, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7512,0x7516,0x7517,0x7520,0x7521,0x7524,0x7527, + 0x7529,0x752A,0x752F,0x7536,0x7539,0x753D,0x753E,0x753F, + 0x7540,0x7543,0x7547,0x7548,0x754E,0x7550,0x7552,0x7557, + 0x755E,0x755F,0x7561,0x756F,0x7571,0x7579,0x757A,0x757B, + 0x757C,0x757D,0x757E,0x7581,0x7585,0x7590,0x7592,0x7593, + 0x7595,0x7599,0x759C,0x75A2,0x75A4,0x75B4,0x75BA,0x75BF, + 0x75C0,0x75C1,0x75C4,0x75C6,0x75CC,0x75CE,0x75CF,0x75D7, + 0x75DC,0x75DF,0x75E0,0x75E1,0x75E4,0x75E7,0x75EC,0x75EE, + 0x75EF,0x75F1,0x75F9,0x7600,0x7602,0x7603,0x7604,0x7607, + 0x7608,0x760A,0x760C,0x760F,0x7612,0x7613,0x7615,0x7616, + 0x7619,0x761B,0x761C,0x761D,0x761E,0x7623,0x7625,0x7626, + 0x7629,0x762D,0x7632,0x7633,0x7635,0x7638,0x7639,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x763A,0x763C,0x764A,0x7640,0x7641,0x7643,0x7644, + 0x7645,0x7649,0x764B,0x7655,0x7659,0x765F,0x7664,0x7665, + 0x766D,0x766E,0x766F,0x7671,0x7674,0x7681,0x7685,0x768C, + 0x768D,0x7695,0x769B,0x769C,0x769D,0x769F,0x76A0,0x76A2, + 0x76A3,0x76A4,0x76A5,0x76A6,0x76A7,0x76A8,0x76AA,0x76AD, + 0x76BD,0x76C1,0x76C5,0x76C9,0x76CB,0x76CC,0x76CE,0x76D4, + 0x76D9,0x76E0,0x76E6,0x76E8,0x76EC,0x76F0,0x76F1,0x76F6, + 0x76F9,0x76FC,0x7700,0x7706,0x770A,0x770E,0x7712,0x7714, + 0x7715,0x7717,0x7719,0x771A,0x771C,0x7722,0x7728,0x772D, + 0x772E,0x772F,0x7734,0x7735,0x7736,0x7739,0x773D,0x773E, + 0x7742,0x7745,0x7746,0x774A,0x774D,0x774E,0x774F,0x7752, + 0x7756,0x7757,0x775C,0x775E,0x775F,0x7760,0x7762,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7764,0x7767,0x776A,0x776C,0x7770,0x7772,0x7773, + 0x7774,0x777A,0x777D,0x7780,0x7784,0x778C,0x778D,0x7794, + 0x7795,0x7796,0x779A,0x779F,0x77A2,0x77A7,0x77AA,0x77AE, + 0x77AF,0x77B1,0x77B5,0x77BE,0x77C3,0x77C9,0x77D1,0x77D2, + 0x77D5,0x77D9,0x77DE,0x77DF,0x77E0,0x77E4,0x77E6,0x77EA, + 0x77EC,0x77F0,0x77F1,0x77F4,0x77F8,0x77FB,0x7805,0x7806, + 0x7809,0x780D,0x780E,0x7811,0x781D,0x7821,0x7822,0x7823, + 0x782D,0x782E,0x7830,0x7835,0x7837,0x7843,0x7844,0x7847, + 0x7848,0x784C,0x784E,0x7852,0x785C,0x785E,0x7860,0x7861, + 0x7863,0x7864,0x7868,0x786A,0x786E,0x787A,0x787E,0x788A, + 0x788F,0x7894,0x7898,0x78A1,0x789D,0x789E,0x789F,0x78A4, + 0x78A8,0x78AC,0x78AD,0x78B0,0x78B1,0x78B2,0x78B3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x78BB,0x78BD,0x78BF,0x78C7,0x78C8,0x78C9,0x78CC, + 0x78CE,0x78D2,0x78D3,0x78D5,0x78D6,0x78E4,0x78DB,0x78DF, + 0x78E0,0x78E1,0x78E6,0x78EA,0x78F2,0x78F3,0x7900,0x78F6, + 0x78F7,0x78FA,0x78FB,0x78FF,0x7906,0x790C,0x7910,0x791A, + 0x791C,0x791E,0x791F,0x7920,0x7925,0x7927,0x7929,0x792D, + 0x7931,0x7934,0x7935,0x793B,0x793D,0x793F,0x7944,0x7945, + 0x7946,0x794A,0x794B,0x794F,0x7951,0x7954,0x7958,0x795B, + 0x795C,0x7967,0x7969,0x796B,0x7972,0x7979,0x797B,0x797C, + 0x797E,0x798B,0x798C,0x7991,0x7993,0x7994,0x7995,0x7996, + 0x7998,0x799B,0x799C,0x79A1,0x79A8,0x79A9,0x79AB,0x79AF, + 0x79B1,0x79B4,0x79B8,0x79BB,0x79C2,0x79C4,0x79C7,0x79C8, + 0x79CA,0x79CF,0x79D4,0x79D6,0x79DA,0x79DD,0x79DE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x79E0,0x79E2,0x79E5,0x79EA,0x79EB,0x79ED,0x79F1, + 0x79F8,0x79FC,0x7A02,0x7A03,0x7A07,0x7A09,0x7A0A,0x7A0C, + 0x7A11,0x7A15,0x7A1B,0x7A1E,0x7A21,0x7A27,0x7A2B,0x7A2D, + 0x7A2F,0x7A30,0x7A34,0x7A35,0x7A38,0x7A39,0x7A3A,0x7A44, + 0x7A45,0x7A47,0x7A48,0x7A4C,0x7A55,0x7A56,0x7A59,0x7A5C, + 0x7A5D,0x7A5F,0x7A60,0x7A65,0x7A67,0x7A6A,0x7A6D,0x7A75, + 0x7A78,0x7A7E,0x7A80,0x7A82,0x7A85,0x7A86,0x7A8A,0x7A8B, + 0x7A90,0x7A91,0x7A94,0x7A9E,0x7AA0,0x7AA3,0x7AAC,0x7AB3, + 0x7AB5,0x7AB9,0x7ABB,0x7ABC,0x7AC6,0x7AC9,0x7ACC,0x7ACE, + 0x7AD1,0x7ADB,0x7AE8,0x7AE9,0x7AEB,0x7AEC,0x7AF1,0x7AF4, + 0x7AFB,0x7AFD,0x7AFE,0x7B07,0x7B14,0x7B1F,0x7B23,0x7B27, + 0x7B29,0x7B2A,0x7B2B,0x7B2D,0x7B2E,0x7B2F,0x7B30,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B31,0x7B34,0x7B3D,0x7B3F,0x7B40,0x7B41,0x7B47, + 0x7B4E,0x7B55,0x7B60,0x7B64,0x7B66,0x7B69,0x7B6A,0x7B6D, + 0x7B6F,0x7B72,0x7B73,0x7B77,0x7B84,0x7B89,0x7B8E,0x7B90, + 0x7B91,0x7B96,0x7B9B,0x7B9E,0x7BA0,0x7BA5,0x7BAC,0x7BAF, + 0x7BB0,0x7BB2,0x7BB5,0x7BB6,0x7BBA,0x7BBB,0x7BBC,0x7BBD, + 0x7BC2,0x7BC5,0x7BC8,0x7BCA,0x7BD4,0x7BD6,0x7BD7,0x7BD9, + 0x7BDA,0x7BDB,0x7BE8,0x7BEA,0x7BF2,0x7BF4,0x7BF5,0x7BF8, + 0x7BF9,0x7BFA,0x7BFC,0x7BFE,0x7C01,0x7C02,0x7C03,0x7C04, + 0x7C06,0x7C09,0x7C0B,0x7C0C,0x7C0E,0x7C0F,0x7C19,0x7C1B, + 0x7C20,0x7C25,0x7C26,0x7C28,0x7C2C,0x7C31,0x7C33,0x7C34, + 0x7C36,0x7C39,0x7C3A,0x7C46,0x7C4A,0x7C55,0x7C51,0x7C52, + 0x7C53,0x7C59,0x7C5A,0x7C5B,0x7C5C,0x7C5D,0x7C5E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C61,0x7C63,0x7C67,0x7C69,0x7C6D,0x7C6E,0x7C70, + 0x7C72,0x7C79,0x7C7C,0x7C7D,0x7C86,0x7C87,0x7C8F,0x7C94, + 0x7C9E,0x7CA0,0x7CA6,0x7CB0,0x7CB6,0x7CB7,0x7CBA,0x7CBB, + 0x7CBC,0x7CBF,0x7CC4,0x7CC7,0x7CC8,0x7CC9,0x7CCD,0x7CCF, + 0x7CD3,0x7CD4,0x7CD5,0x7CD7,0x7CD9,0x7CDA,0x7CDD,0x7CE6, + 0x7CE9,0x7CEB,0x7CF5,0x7D03,0x7D07,0x7D08,0x7D09,0x7D0F, + 0x7D11,0x7D12,0x7D13,0x7D16,0x7D1D,0x7D1E,0x7D23,0x7D26, + 0x7D2A,0x7D2D,0x7D31,0x7D3C,0x7D3D,0x7D3E,0x7D40,0x7D41, + 0x7D47,0x7D48,0x7D4D,0x7D51,0x7D53,0x7D57,0x7D59,0x7D5A, + 0x7D5C,0x7D5D,0x7D65,0x7D67,0x7D6A,0x7D70,0x7D78,0x7D7A, + 0x7D7B,0x7D7F,0x7D81,0x7D82,0x7D83,0x7D85,0x7D86,0x7D88, + 0x7D8B,0x7D8C,0x7D8D,0x7D91,0x7D96,0x7D97,0x7D9D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D9E,0x7DA6,0x7DA7,0x7DAA,0x7DB3,0x7DB6,0x7DB7, + 0x7DB9,0x7DC2,0x7DC3,0x7DC4,0x7DC5,0x7DC6,0x7DCC,0x7DCD, + 0x7DCE,0x7DD7,0x7DD9,0x7E00,0x7DE2,0x7DE5,0x7DE6,0x7DEA, + 0x7DEB,0x7DED,0x7DF1,0x7DF5,0x7DF6,0x7DF9,0x7DFA,0x7E08, + 0x7E10,0x7E11,0x7E15,0x7E17,0x7E1C,0x7E1D,0x7E20,0x7E27, + 0x7E28,0x7E2C,0x7E2D,0x7E2F,0x7E33,0x7E36,0x7E3F,0x7E44, + 0x7E45,0x7E47,0x7E4E,0x7E50,0x7E52,0x7E58,0x7E5F,0x7E61, + 0x7E62,0x7E65,0x7E6B,0x7E6E,0x7E6F,0x7E73,0x7E78,0x7E7E, + 0x7E81,0x7E86,0x7E87,0x7E8A,0x7E8D,0x7E91,0x7E95,0x7E98, + 0x7E9A,0x7E9D,0x7E9E,0x7F3C,0x7F3B,0x7F3D,0x7F3E,0x7F3F, + 0x7F43,0x7F44,0x7F47,0x7F4F,0x7F52,0x7F53,0x7F5B,0x7F5C, + 0x7F5D,0x7F61,0x7F63,0x7F64,0x7F65,0x7F66,0x7F6D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7F71,0x7F7D,0x7F7E,0x7F7F,0x7F80,0x7F8B,0x7F8D, + 0x7F8F,0x7F90,0x7F91,0x7F96,0x7F97,0x7F9C,0x7FA1,0x7FA2, + 0x7FA6,0x7FAA,0x7FAD,0x7FB4,0x7FBC,0x7FBF,0x7FC0,0x7FC3, + 0x7FC8,0x7FCE,0x7FCF,0x7FDB,0x7FDF,0x7FE3,0x7FE5,0x7FE8, + 0x7FEC,0x7FEE,0x7FEF,0x7FF2,0x7FFA,0x7FFD,0x7FFE,0x7FFF, + 0x8007,0x8008,0x800A,0x800D,0x800E,0x800F,0x8011,0x8013, + 0x8014,0x8016,0x801D,0x801E,0x801F,0x8020,0x8024,0x8026, + 0x802C,0x802E,0x8030,0x8034,0x8035,0x8037,0x8039,0x803A, + 0x803C,0x803E,0x8040,0x8044,0x8060,0x8064,0x8066,0x806D, + 0x8071,0x8075,0x8081,0x8088,0x808E,0x809C,0x809E,0x80A6, + 0x80A7,0x80AB,0x80B8,0x80B9,0x80C8,0x80CD,0x80CF,0x80D2, + 0x80D4,0x80D5,0x80D7,0x80D8,0x80E0,0x80ED,0x80EE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x80F0,0x80F2,0x80F3,0x80F6,0x80F9,0x80FA,0x80FE, + 0x8103,0x810B,0x8116,0x8117,0x8118,0x811C,0x811E,0x8120, + 0x8124,0x8127,0x812C,0x8130,0x8135,0x813A,0x813C,0x8145, + 0x8147,0x814A,0x814C,0x8152,0x8157,0x8160,0x8161,0x8167, + 0x8168,0x8169,0x816D,0x816F,0x8177,0x8181,0x8190,0x8184, + 0x8185,0x8186,0x818B,0x818E,0x8196,0x8198,0x819B,0x819E, + 0x81A2,0x81AE,0x81B2,0x81B4,0x81BB,0x81CB,0x81C3,0x81C5, + 0x81CA,0x81CE,0x81CF,0x81D5,0x81D7,0x81DB,0x81DD,0x81DE, + 0x81E1,0x81E4,0x81EB,0x81EC,0x81F0,0x81F1,0x81F2,0x81F5, + 0x81F6,0x81F8,0x81F9,0x81FD,0x81FF,0x8200,0x8203,0x820F, + 0x8213,0x8214,0x8219,0x821A,0x821D,0x8221,0x8222,0x8228, + 0x8232,0x8234,0x823A,0x8243,0x8244,0x8245,0x8246,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x824B,0x824E,0x824F,0x8251,0x8256,0x825C,0x8260, + 0x8263,0x8267,0x826D,0x8274,0x827B,0x827D,0x827F,0x8280, + 0x8281,0x8283,0x8284,0x8287,0x8289,0x828A,0x828E,0x8291, + 0x8294,0x8296,0x8298,0x829A,0x829B,0x82A0,0x82A1,0x82A3, + 0x82A4,0x82A7,0x82A8,0x82A9,0x82AA,0x82AE,0x82B0,0x82B2, + 0x82B4,0x82B7,0x82BA,0x82BC,0x82BE,0x82BF,0x82C6,0x82D0, + 0x82D5,0x82DA,0x82E0,0x82E2,0x82E4,0x82E8,0x82EA,0x82ED, + 0x82EF,0x82F6,0x82F7,0x82FD,0x82FE,0x8300,0x8301,0x8307, + 0x8308,0x830A,0x830B,0x8354,0x831B,0x831D,0x831E,0x831F, + 0x8321,0x8322,0x832C,0x832D,0x832E,0x8330,0x8333,0x8337, + 0x833A,0x833C,0x833D,0x8342,0x8343,0x8344,0x8347,0x834D, + 0x834E,0x8351,0x8355,0x8356,0x8357,0x8370,0x8378,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x837D,0x837F,0x8380,0x8382,0x8384,0x8386,0x838D, + 0x8392,0x8394,0x8395,0x8398,0x8399,0x839B,0x839C,0x839D, + 0x83A6,0x83A7,0x83A9,0x83AC,0x83BE,0x83BF,0x83C0,0x83C7, + 0x83C9,0x83CF,0x83D0,0x83D1,0x83D4,0x83DD,0x8353,0x83E8, + 0x83EA,0x83F6,0x83F8,0x83F9,0x83FC,0x8401,0x8406,0x840A, + 0x840F,0x8411,0x8415,0x8419,0x83AD,0x842F,0x8439,0x8445, + 0x8447,0x8448,0x844A,0x844D,0x844F,0x8451,0x8452,0x8456, + 0x8458,0x8459,0x845A,0x845C,0x8460,0x8464,0x8465,0x8467, + 0x846A,0x8470,0x8473,0x8474,0x8476,0x8478,0x847C,0x847D, + 0x8481,0x8485,0x8492,0x8493,0x8495,0x849E,0x84A6,0x84A8, + 0x84A9,0x84AA,0x84AF,0x84B1,0x84B4,0x84BA,0x84BD,0x84BE, + 0x84C0,0x84C2,0x84C7,0x84C8,0x84CC,0x84CF,0x84D3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x84DC,0x84E7,0x84EA,0x84EF,0x84F0,0x84F1,0x84F2, + 0x84F7,0x8532,0x84FA,0x84FB,0x84FD,0x8502,0x8503,0x8507, + 0x850C,0x850E,0x8510,0x851C,0x851E,0x8522,0x8523,0x8524, + 0x8525,0x8527,0x852A,0x852B,0x852F,0x8533,0x8534,0x8536, + 0x853F,0x8546,0x854F,0x8550,0x8551,0x8552,0x8553,0x8556, + 0x8559,0x855C,0x855D,0x855E,0x855F,0x8560,0x8561,0x8562, + 0x8564,0x856B,0x856F,0x8579,0x857A,0x857B,0x857D,0x857F, + 0x8581,0x8585,0x8586,0x8589,0x858B,0x858C,0x858F,0x8593, + 0x8598,0x859D,0x859F,0x85A0,0x85A2,0x85A5,0x85A7,0x85B4, + 0x85B6,0x85B7,0x85B8,0x85BC,0x85BD,0x85BE,0x85BF,0x85C2, + 0x85C7,0x85CA,0x85CB,0x85CE,0x85AD,0x85D8,0x85DA,0x85DF, + 0x85E0,0x85E6,0x85E8,0x85ED,0x85F3,0x85F6,0x85FC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x85FF,0x8600,0x8604,0x8605,0x860D,0x860E,0x8610, + 0x8611,0x8612,0x8618,0x8619,0x861B,0x861E,0x8621,0x8627, + 0x8629,0x8636,0x8638,0x863A,0x863C,0x863D,0x8640,0x8642, + 0x8646,0x8652,0x8653,0x8656,0x8657,0x8658,0x8659,0x865D, + 0x8660,0x8661,0x8662,0x8663,0x8664,0x8669,0x866C,0x866F, + 0x8675,0x8676,0x8677,0x867A,0x868D,0x8691,0x8696,0x8698, + 0x869A,0x869C,0x86A1,0x86A6,0x86A7,0x86A8,0x86AD,0x86B1, + 0x86B3,0x86B4,0x86B5,0x86B7,0x86B8,0x86B9,0x86BF,0x86C0, + 0x86C1,0x86C3,0x86C5,0x86D1,0x86D2,0x86D5,0x86D7,0x86DA, + 0x86DC,0x86E0,0x86E3,0x86E5,0x86E7,0x8688,0x86FA,0x86FC, + 0x86FD,0x8704,0x8705,0x8707,0x870B,0x870E,0x870F,0x8710, + 0x8713,0x8714,0x8719,0x871E,0x871F,0x8721,0x8723,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8728,0x872E,0x872F,0x8731,0x8732,0x8739,0x873A, + 0x873C,0x873D,0x873E,0x8740,0x8743,0x8745,0x874D,0x8758, + 0x875D,0x8761,0x8764,0x8765,0x876F,0x8771,0x8772,0x877B, + 0x8783,0x8784,0x8785,0x8786,0x8787,0x8788,0x8789,0x878B, + 0x878C,0x8790,0x8793,0x8795,0x8797,0x8798,0x8799,0x879E, + 0x87A0,0x87A3,0x87A7,0x87AC,0x87AD,0x87AE,0x87B1,0x87B5, + 0x87BE,0x87BF,0x87C1,0x87C8,0x87C9,0x87CA,0x87CE,0x87D5, + 0x87D6,0x87D9,0x87DA,0x87DC,0x87DF,0x87E2,0x87E3,0x87E4, + 0x87EA,0x87EB,0x87ED,0x87F1,0x87F3,0x87F8,0x87FA,0x87FF, + 0x8801,0x8803,0x8806,0x8809,0x880A,0x880B,0x8810,0x8819, + 0x8812,0x8813,0x8814,0x8818,0x881A,0x881B,0x881C,0x881E, + 0x881F,0x8828,0x882D,0x882E,0x8830,0x8832,0x8835,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x883A,0x883C,0x8841,0x8843,0x8845,0x8848,0x8849, + 0x884A,0x884B,0x884E,0x8851,0x8855,0x8856,0x8858,0x885A, + 0x885C,0x885F,0x8860,0x8864,0x8869,0x8871,0x8879,0x887B, + 0x8880,0x8898,0x889A,0x889B,0x889C,0x889F,0x88A0,0x88A8, + 0x88AA,0x88BA,0x88BD,0x88BE,0x88C0,0x88CA,0x88CB,0x88CC, + 0x88CD,0x88CE,0x88D1,0x88D2,0x88D3,0x88DB,0x88DE,0x88E7, + 0x88EF,0x88F0,0x88F1,0x88F5,0x88F7,0x8901,0x8906,0x890D, + 0x890E,0x890F,0x8915,0x8916,0x8918,0x8919,0x891A,0x891C, + 0x8920,0x8926,0x8927,0x8928,0x8930,0x8931,0x8932,0x8935, + 0x8939,0x893A,0x893E,0x8940,0x8942,0x8945,0x8946,0x8949, + 0x894F,0x8952,0x8957,0x895A,0x895B,0x895C,0x8961,0x8962, + 0x8963,0x896B,0x896E,0x8970,0x8973,0x8975,0x897A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x897B,0x897C,0x897D,0x8989,0x898D,0x8990,0x8994, + 0x8995,0x899B,0x899C,0x899F,0x89A0,0x89A5,0x89B0,0x89B4, + 0x89B5,0x89B6,0x89B7,0x89BC,0x89D4,0x89D5,0x89D6,0x89D7, + 0x89D8,0x89E5,0x89E9,0x89EB,0x89ED,0x89F1,0x89F3,0x89F6, + 0x89F9,0x89FD,0x89FF,0x8A04,0x8A05,0x8A07,0x8A0F,0x8A11, + 0x8A12,0x8A14,0x8A15,0x8A1E,0x8A20,0x8A22,0x8A24,0x8A26, + 0x8A2B,0x8A2C,0x8A2F,0x8A35,0x8A37,0x8A3D,0x8A3E,0x8A40, + 0x8A43,0x8A45,0x8A47,0x8A49,0x8A4D,0x8A4E,0x8A53,0x8A56, + 0x8A57,0x8A58,0x8A5C,0x8A5D,0x8A61,0x8A65,0x8A67,0x8A75, + 0x8A76,0x8A77,0x8A79,0x8A7A,0x8A7B,0x8A7E,0x8A7F,0x8A80, + 0x8A83,0x8A86,0x8A8B,0x8A8F,0x8A90,0x8A92,0x8A96,0x8A97, + 0x8A99,0x8A9F,0x8AA7,0x8AA9,0x8AAE,0x8AAF,0x8AB3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8AB6,0x8AB7,0x8ABB,0x8ABE,0x8AC3,0x8AC6,0x8AC8, + 0x8AC9,0x8ACA,0x8AD1,0x8AD3,0x8AD4,0x8AD5,0x8AD7,0x8ADD, + 0x8ADF,0x8AEC,0x8AF0,0x8AF4,0x8AF5,0x8AF6,0x8AFC,0x8AFF, + 0x8B05,0x8B06,0x8B0B,0x8B11,0x8B1C,0x8B1E,0x8B1F,0x8B0A, + 0x8B2D,0x8B30,0x8B37,0x8B3C,0x8B42,0x8B43,0x8B44,0x8B45, + 0x8B46,0x8B48,0x8B52,0x8B53,0x8B54,0x8B59,0x8B4D,0x8B5E, + 0x8B63,0x8B6D,0x8B76,0x8B78,0x8B79,0x8B7C,0x8B7E,0x8B81, + 0x8B84,0x8B85,0x8B8B,0x8B8D,0x8B8F,0x8B94,0x8B95,0x8B9C, + 0x8B9E,0x8B9F,0x8C38,0x8C39,0x8C3D,0x8C3E,0x8C45,0x8C47, + 0x8C49,0x8C4B,0x8C4F,0x8C51,0x8C53,0x8C54,0x8C57,0x8C58, + 0x8C5B,0x8C5D,0x8C59,0x8C63,0x8C64,0x8C66,0x8C68,0x8C69, + 0x8C6D,0x8C73,0x8C75,0x8C76,0x8C7B,0x8C7E,0x8C86,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8C87,0x8C8B,0x8C90,0x8C92,0x8C93,0x8C99,0x8C9B, + 0x8C9C,0x8CA4,0x8CB9,0x8CBA,0x8CC5,0x8CC6,0x8CC9,0x8CCB, + 0x8CCF,0x8CD6,0x8CD5,0x8CD9,0x8CDD,0x8CE1,0x8CE8,0x8CEC, + 0x8CEF,0x8CF0,0x8CF2,0x8CF5,0x8CF7,0x8CF8,0x8CFE,0x8CFF, + 0x8D01,0x8D03,0x8D09,0x8D12,0x8D17,0x8D1B,0x8D65,0x8D69, + 0x8D6C,0x8D6E,0x8D7F,0x8D82,0x8D84,0x8D88,0x8D8D,0x8D90, + 0x8D91,0x8D95,0x8D9E,0x8D9F,0x8DA0,0x8DA6,0x8DAB,0x8DAC, + 0x8DAF,0x8DB2,0x8DB5,0x8DB7,0x8DB9,0x8DBB,0x8DC0,0x8DC5, + 0x8DC6,0x8DC7,0x8DC8,0x8DCA,0x8DCE,0x8DD1,0x8DD4,0x8DD5, + 0x8DD7,0x8DD9,0x8DE4,0x8DE5,0x8DE7,0x8DEC,0x8DF0,0x8DBC, + 0x8DF1,0x8DF2,0x8DF4,0x8DFD,0x8E01,0x8E04,0x8E05,0x8E06, + 0x8E0B,0x8E11,0x8E14,0x8E16,0x8E20,0x8E21,0x8E22,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8E23,0x8E26,0x8E27,0x8E31,0x8E33,0x8E36,0x8E37, + 0x8E38,0x8E39,0x8E3D,0x8E40,0x8E41,0x8E4B,0x8E4D,0x8E4E, + 0x8E4F,0x8E54,0x8E5B,0x8E5C,0x8E5D,0x8E5E,0x8E61,0x8E62, + 0x8E69,0x8E6C,0x8E6D,0x8E6F,0x8E70,0x8E71,0x8E79,0x8E7A, + 0x8E7B,0x8E82,0x8E83,0x8E89,0x8E90,0x8E92,0x8E95,0x8E9A, + 0x8E9B,0x8E9D,0x8E9E,0x8EA2,0x8EA7,0x8EA9,0x8EAD,0x8EAE, + 0x8EB3,0x8EB5,0x8EBA,0x8EBB,0x8EC0,0x8EC1,0x8EC3,0x8EC4, + 0x8EC7,0x8ECF,0x8ED1,0x8ED4,0x8EDC,0x8EE8,0x8EEE,0x8EF0, + 0x8EF1,0x8EF7,0x8EF9,0x8EFA,0x8EED,0x8F00,0x8F02,0x8F07, + 0x8F08,0x8F0F,0x8F10,0x8F16,0x8F17,0x8F18,0x8F1E,0x8F20, + 0x8F21,0x8F23,0x8F25,0x8F27,0x8F28,0x8F2C,0x8F2D,0x8F2E, + 0x8F34,0x8F35,0x8F36,0x8F37,0x8F3A,0x8F40,0x8F41,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8F43,0x8F47,0x8F4F,0x8F51,0x8F52,0x8F53,0x8F54, + 0x8F55,0x8F58,0x8F5D,0x8F5E,0x8F65,0x8F9D,0x8FA0,0x8FA1, + 0x8FA4,0x8FA5,0x8FA6,0x8FB5,0x8FB6,0x8FB8,0x8FBE,0x8FC0, + 0x8FC1,0x8FC6,0x8FCA,0x8FCB,0x8FCD,0x8FD0,0x8FD2,0x8FD3, + 0x8FD5,0x8FE0,0x8FE3,0x8FE4,0x8FE8,0x8FEE,0x8FF1,0x8FF5, + 0x8FF6,0x8FFB,0x8FFE,0x9002,0x9004,0x9008,0x900C,0x9018, + 0x901B,0x9028,0x9029,0x902F,0x902A,0x902C,0x902D,0x9033, + 0x9034,0x9037,0x903F,0x9043,0x9044,0x904C,0x905B,0x905D, + 0x9062,0x9066,0x9067,0x906C,0x9070,0x9074,0x9079,0x9085, + 0x9088,0x908B,0x908C,0x908E,0x9090,0x9095,0x9097,0x9098, + 0x9099,0x909B,0x90A0,0x90A1,0x90A2,0x90A5,0x90B0,0x90B2, + 0x90B3,0x90B4,0x90B6,0x90BD,0x90CC,0x90BE,0x90C3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x90C4,0x90C5,0x90C7,0x90C8,0x90D5,0x90D7,0x90D8, + 0x90D9,0x90DC,0x90DD,0x90DF,0x90E5,0x90D2,0x90F6,0x90EB, + 0x90EF,0x90F0,0x90F4,0x90FE,0x90FF,0x9100,0x9104,0x9105, + 0x9106,0x9108,0x910D,0x9110,0x9114,0x9116,0x9117,0x9118, + 0x911A,0x911C,0x911E,0x9120,0x9125,0x9122,0x9123,0x9127, + 0x9129,0x912E,0x912F,0x9131,0x9134,0x9136,0x9137,0x9139, + 0x913A,0x913C,0x913D,0x9143,0x9147,0x9148,0x914F,0x9153, + 0x9157,0x9159,0x915A,0x915B,0x9161,0x9164,0x9167,0x916D, + 0x9174,0x9179,0x917A,0x917B,0x9181,0x9183,0x9185,0x9186, + 0x918A,0x918E,0x9191,0x9193,0x9194,0x9195,0x9198,0x919E, + 0x91A1,0x91A6,0x91A8,0x91AC,0x91AD,0x91AE,0x91B0,0x91B1, + 0x91B2,0x91B3,0x91B6,0x91BB,0x91BC,0x91BD,0x91BF,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x91C2,0x91C3,0x91C5,0x91D3,0x91D4,0x91D7,0x91D9, + 0x91DA,0x91DE,0x91E4,0x91E5,0x91E9,0x91EA,0x91EC,0x91ED, + 0x91EE,0x91EF,0x91F0,0x91F1,0x91F7,0x91F9,0x91FB,0x91FD, + 0x9200,0x9201,0x9204,0x9205,0x9206,0x9207,0x9209,0x920A, + 0x920C,0x9210,0x9212,0x9213,0x9216,0x9218,0x921C,0x921D, + 0x9223,0x9224,0x9225,0x9226,0x9228,0x922E,0x922F,0x9230, + 0x9233,0x9235,0x9236,0x9238,0x9239,0x923A,0x923C,0x923E, + 0x9240,0x9242,0x9243,0x9246,0x9247,0x924A,0x924D,0x924E, + 0x924F,0x9251,0x9258,0x9259,0x925C,0x925D,0x9260,0x9261, + 0x9265,0x9267,0x9268,0x9269,0x926E,0x926F,0x9270,0x9275, + 0x9276,0x9277,0x9278,0x9279,0x927B,0x927C,0x927D,0x927F, + 0x9288,0x9289,0x928A,0x928D,0x928E,0x9292,0x9297,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9299,0x929F,0x92A0,0x92A4,0x92A5,0x92A7,0x92A8, + 0x92AB,0x92AF,0x92B2,0x92B6,0x92B8,0x92BA,0x92BB,0x92BC, + 0x92BD,0x92BF,0x92C0,0x92C1,0x92C2,0x92C3,0x92C5,0x92C6, + 0x92C7,0x92C8,0x92CB,0x92CC,0x92CD,0x92CE,0x92D0,0x92D3, + 0x92D5,0x92D7,0x92D8,0x92D9,0x92DC,0x92DD,0x92DF,0x92E0, + 0x92E1,0x92E3,0x92E5,0x92E7,0x92E8,0x92EC,0x92EE,0x92F0, + 0x92F9,0x92FB,0x92FF,0x9300,0x9302,0x9308,0x930D,0x9311, + 0x9314,0x9315,0x931C,0x931D,0x931E,0x931F,0x9321,0x9324, + 0x9325,0x9327,0x9329,0x932A,0x9333,0x9334,0x9336,0x9337, + 0x9347,0x9348,0x9349,0x9350,0x9351,0x9352,0x9355,0x9357, + 0x9358,0x935A,0x935E,0x9364,0x9365,0x9367,0x9369,0x936A, + 0x936D,0x936F,0x9370,0x9371,0x9373,0x9374,0x9376,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x937A,0x937D,0x937F,0x9380,0x9381,0x9382,0x9388, + 0x938A,0x938B,0x938D,0x938F,0x9392,0x9395,0x9398,0x939B, + 0x939E,0x93A1,0x93A3,0x93A4,0x93A6,0x93A8,0x93AB,0x93B4, + 0x93B5,0x93B6,0x93BA,0x93A9,0x93C1,0x93C4,0x93C5,0x93C6, + 0x93C7,0x93C9,0x93CA,0x93CB,0x93CC,0x93CD,0x93D3,0x93D9, + 0x93DC,0x93DE,0x93DF,0x93E2,0x93E6,0x93E7,0x93F9,0x93F7, + 0x93F8,0x93FA,0x93FB,0x93FD,0x9401,0x9402,0x9404,0x9408, + 0x9409,0x940D,0x940E,0x940F,0x9415,0x9416,0x9417,0x941F, + 0x942E,0x942F,0x9431,0x9432,0x9433,0x9434,0x943B,0x943F, + 0x943D,0x9443,0x9445,0x9448,0x944A,0x944C,0x9455,0x9459, + 0x945C,0x945F,0x9461,0x9463,0x9468,0x946B,0x946D,0x946E, + 0x946F,0x9471,0x9472,0x9484,0x9483,0x9578,0x9579,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x957E,0x9584,0x9588,0x958C,0x958D,0x958E,0x959D, + 0x959E,0x959F,0x95A1,0x95A6,0x95A9,0x95AB,0x95AC,0x95B4, + 0x95B6,0x95BA,0x95BD,0x95BF,0x95C6,0x95C8,0x95C9,0x95CB, + 0x95D0,0x95D1,0x95D2,0x95D3,0x95D9,0x95DA,0x95DD,0x95DE, + 0x95DF,0x95E0,0x95E4,0x95E6,0x961D,0x961E,0x9622,0x9624, + 0x9625,0x9626,0x962C,0x9631,0x9633,0x9637,0x9638,0x9639, + 0x963A,0x963C,0x963D,0x9641,0x9652,0x9654,0x9656,0x9657, + 0x9658,0x9661,0x966E,0x9674,0x967B,0x967C,0x967E,0x967F, + 0x9681,0x9682,0x9683,0x9684,0x9689,0x9691,0x9696,0x969A, + 0x969D,0x969F,0x96A4,0x96A5,0x96A6,0x96A9,0x96AE,0x96AF, + 0x96B3,0x96BA,0x96CA,0x96D2,0x5DB2,0x96D8,0x96DA,0x96DD, + 0x96DE,0x96DF,0x96E9,0x96EF,0x96F1,0x96FA,0x9702,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9703,0x9705,0x9709,0x971A,0x971B,0x971D,0x9721, + 0x9722,0x9723,0x9728,0x9731,0x9733,0x9741,0x9743,0x974A, + 0x974E,0x974F,0x9755,0x9757,0x9758,0x975A,0x975B,0x9763, + 0x9767,0x976A,0x976E,0x9773,0x9776,0x9777,0x9778,0x977B, + 0x977D,0x977F,0x9780,0x9789,0x9795,0x9796,0x9797,0x9799, + 0x979A,0x979E,0x979F,0x97A2,0x97AC,0x97AE,0x97B1,0x97B2, + 0x97B5,0x97B6,0x97B8,0x97B9,0x97BA,0x97BC,0x97BE,0x97BF, + 0x97C1,0x97C4,0x97C5,0x97C7,0x97C9,0x97CA,0x97CC,0x97CD, + 0x97CE,0x97D0,0x97D1,0x97D4,0x97D7,0x97D8,0x97D9,0x97DD, + 0x97DE,0x97E0,0x97DB,0x97E1,0x97E4,0x97EF,0x97F1,0x97F4, + 0x97F7,0x97F8,0x97FA,0x9807,0x980A,0x9819,0x980D,0x980E, + 0x9814,0x9816,0x981C,0x981E,0x9820,0x9823,0x9826,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x982B,0x982E,0x982F,0x9830,0x9832,0x9833,0x9835, + 0x9825,0x983E,0x9844,0x9847,0x984A,0x9851,0x9852,0x9853, + 0x9856,0x9857,0x9859,0x985A,0x9862,0x9863,0x9865,0x9866, + 0x986A,0x986C,0x98AB,0x98AD,0x98AE,0x98B0,0x98B4,0x98B7, + 0x98B8,0x98BA,0x98BB,0x98BF,0x98C2,0x98C5,0x98C8,0x98CC, + 0x98E1,0x98E3,0x98E5,0x98E6,0x98E7,0x98EA,0x98F3,0x98F6, + 0x9902,0x9907,0x9908,0x9911,0x9915,0x9916,0x9917,0x991A, + 0x991B,0x991C,0x991F,0x9922,0x9926,0x9927,0x992B,0x9931, + 0x9932,0x9933,0x9934,0x9935,0x9939,0x993A,0x993B,0x993C, + 0x9940,0x9941,0x9946,0x9947,0x9948,0x994D,0x994E,0x9954, + 0x9958,0x9959,0x995B,0x995C,0x995E,0x995F,0x9960,0x999B, + 0x999D,0x999F,0x99A6,0x99B0,0x99B1,0x99B2,0x99B5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x99B9,0x99BA,0x99BD,0x99BF,0x99C3,0x99C9,0x99D3, + 0x99D4,0x99D9,0x99DA,0x99DC,0x99DE,0x99E7,0x99EA,0x99EB, + 0x99EC,0x99F0,0x99F4,0x99F5,0x99F9,0x99FD,0x99FE,0x9A02, + 0x9A03,0x9A04,0x9A0B,0x9A0C,0x9A10,0x9A11,0x9A16,0x9A1E, + 0x9A20,0x9A22,0x9A23,0x9A24,0x9A27,0x9A2D,0x9A2E,0x9A33, + 0x9A35,0x9A36,0x9A38,0x9A47,0x9A41,0x9A44,0x9A4A,0x9A4B, + 0x9A4C,0x9A4E,0x9A51,0x9A54,0x9A56,0x9A5D,0x9AAA,0x9AAC, + 0x9AAE,0x9AAF,0x9AB2,0x9AB4,0x9AB5,0x9AB6,0x9AB9,0x9ABB, + 0x9ABE,0x9ABF,0x9AC1,0x9AC3,0x9AC6,0x9AC8,0x9ACE,0x9AD0, + 0x9AD2,0x9AD5,0x9AD6,0x9AD7,0x9ADB,0x9ADC,0x9AE0,0x9AE4, + 0x9AE5,0x9AE7,0x9AE9,0x9AEC,0x9AF2,0x9AF3,0x9AF5,0x9AF9, + 0x9AFA,0x9AFD,0x9AFF,0x9B00,0x9B01,0x9B02,0x9B03,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 107, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9B04,0x9B05,0x9B08,0x9B09,0x9B0B,0x9B0C,0x9B0D, + 0x9B0E,0x9B10,0x9B12,0x9B16,0x9B19,0x9B1B,0x9B1C,0x9B20, + 0x9B26,0x9B2B,0x9B2D,0x9B33,0x9B34,0x9B35,0x9B37,0x9B39, + 0x9B3A,0x9B3D,0x9B48,0x9B4B,0x9B4C,0x9B55,0x9B56,0x9B57, + 0x9B5B,0x9B5E,0x9B61,0x9B63,0x9B65,0x9B66,0x9B68,0x9B6A, + 0x9B6B,0x9B6C,0x9B6D,0x9B6E,0x9B73,0x9B75,0x9B77,0x9B78, + 0x9B79,0x9B7F,0x9B80,0x9B84,0x9B85,0x9B86,0x9B87,0x9B89, + 0x9B8A,0x9B8B,0x9B8D,0x9B8F,0x9B90,0x9B94,0x9B9A,0x9B9D, + 0x9B9E,0x9BA6,0x9BA7,0x9BA9,0x9BAC,0x9BB0,0x9BB1,0x9BB2, + 0x9BB7,0x9BB8,0x9BBB,0x9BBC,0x9BBE,0x9BBF,0x9BC1,0x9BC7, + 0x9BC8,0x9BCE,0x9BD0,0x9BD7,0x9BD8,0x9BDD,0x9BDF,0x9BE5, + 0x9BE7,0x9BEA,0x9BEB,0x9BEF,0x9BF3,0x9BF7,0x9BF8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9BF9,0x9BFA,0x9BFD,0x9BFF,0x9C00,0x9C02,0x9C0B, + 0x9C0F,0x9C11,0x9C16,0x9C18,0x9C19,0x9C1A,0x9C1C,0x9C1E, + 0x9C22,0x9C23,0x9C26,0x9C27,0x9C28,0x9C29,0x9C2A,0x9C31, + 0x9C35,0x9C36,0x9C37,0x9C3D,0x9C41,0x9C43,0x9C44,0x9C45, + 0x9C49,0x9C4A,0x9C4E,0x9C4F,0x9C50,0x9C53,0x9C54,0x9C56, + 0x9C58,0x9C5B,0x9C5D,0x9C5E,0x9C5F,0x9C63,0x9C69,0x9C6A, + 0x9C5C,0x9C6B,0x9C68,0x9C6E,0x9C70,0x9C72,0x9C75,0x9C77, + 0x9C7B,0x9CE6,0x9CF2,0x9CF7,0x9CF9,0x9D0B,0x9D02,0x9D11, + 0x9D17,0x9D18,0x9D1C,0x9D1D,0x9D1E,0x9D2F,0x9D30,0x9D32, + 0x9D33,0x9D34,0x9D3A,0x9D3C,0x9D45,0x9D3D,0x9D42,0x9D43, + 0x9D47,0x9D4A,0x9D53,0x9D54,0x9D5F,0x9D63,0x9D62,0x9D65, + 0x9D69,0x9D6A,0x9D6B,0x9D70,0x9D76,0x9D77,0x9D7B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9D7C,0x9D7E,0x9D83,0x9D84,0x9D86,0x9D8A,0x9D8D, + 0x9D8E,0x9D92,0x9D93,0x9D95,0x9D96,0x9D97,0x9D98,0x9DA1, + 0x9DAA,0x9DAC,0x9DAE,0x9DB1,0x9DB5,0x9DB9,0x9DBC,0x9DBF, + 0x9DC3,0x9DC7,0x9DC9,0x9DCA,0x9DD4,0x9DD5,0x9DD6,0x9DD7, + 0x9DDA,0x9DDE,0x9DDF,0x9DE0,0x9DE5,0x9DE7,0x9DE9,0x9DEB, + 0x9DEE,0x9DF0,0x9DF3,0x9DF4,0x9DFE,0x9E0A,0x9E02,0x9E07, + 0x9E0E,0x9E10,0x9E11,0x9E12,0x9E15,0x9E16,0x9E19,0x9E1C, + 0x9E1D,0x9E7A,0x9E7B,0x9E7C,0x9E80,0x9E82,0x9E83,0x9E84, + 0x9E85,0x9E87,0x9E8E,0x9E8F,0x9E96,0x9E98,0x9E9B,0x9E9E, + 0x9EA4,0x9EA8,0x9EAC,0x9EAE,0x9EAF,0x9EB0,0x9EB3,0x9EB4, + 0x9EB5,0x9EC6,0x9EC8,0x9ECB,0x9ED5,0x9EDF,0x9EE4,0x9EE7, + 0x9EEC,0x9EED,0x9EEE,0x9EF0,0x9EF1,0x9EF2,0x9EF5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9EF8,0x9EFF,0x9F02,0x9F03,0x9F09,0x9F0F,0x9F10, + 0x9F11,0x9F12,0x9F14,0x9F16,0x9F17,0x9F19,0x9F1A,0x9F1B, + 0x9F1F,0x9F22,0x9F26,0x9F2A,0x9F2B,0x9F2F,0x9F31,0x9F32, + 0x9F34,0x9F37,0x9F39,0x9F3A,0x9F3C,0x9F3D,0x9F3F,0x9F41, + 0x9F43,0x9F44,0x9F45,0x9F46,0x9F47,0x9F53,0x9F55,0x9F56, + 0x9F57,0x9F58,0x9F5A,0x9F5D,0x9F5E,0x9F68,0x9F69,0x9F6D, + 0x9F6E,0x9F6F,0x9F70,0x9F71,0x9F73,0x9F75,0x9F7A,0x9F7D, + 0x9F8F,0x9F90,0x9F91,0x9F92,0x9F94,0x9F96,0x9F97,0x9F9E, + 0x9FA1,0x9FA2,0x9FA3,0x9FA5,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0212_1990 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit jis_x0212_1990 -> UCS size-optimized table (12602 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_jis_x0212_1990[] = +{ + 0x0049, /* Ranges number */ + 0x0004, /* Unranged codes number */ + 0x1895, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x222F, 0x2239, 0x00DE, + /* Array index: 0x0006 */ 0x2242, 0x2244, 0x00E9, + /* Array index: 0x0009 */ 0x226B, 0x2271, 0x00EC, + /* Array index: 0x000C */ 0x2661, 0x266C, 0x00F3, + /* Array index: 0x000F */ 0x2671, 0x267C, 0x00FF, + /* Array index: 0x0012 */ 0x2742, 0x274E, 0x010B, + /* Array index: 0x0015 */ 0x2772, 0x277E, 0x0118, + /* Array index: 0x0018 */ 0x2928, 0x2930, 0x0125, + /* Array index: 0x001B */ 0x2941, 0x2950, 0x012E, + /* Array index: 0x001E */ 0x2A21, 0x2A77, 0x013E, + /* Array index: 0x0021 */ 0x2B21, 0x2B77, 0x0195, + /* Array index: 0x0024 */ 0x3021, 0x307E, 0x01EC, + /* Array index: 0x0027 */ 0x3121, 0x317E, 0x024A, + /* Array index: 0x002A */ 0x3221, 0x327E, 0x02A8, + /* Array index: 0x002D */ 0x3321, 0x337E, 0x0306, + /* Array index: 0x0030 */ 0x3421, 0x347E, 0x0364, + /* Array index: 0x0033 */ 0x3521, 0x357E, 0x03C2, + /* Array index: 0x0036 */ 0x3621, 0x367E, 0x0420, + /* Array index: 0x0039 */ 0x3721, 0x377E, 0x047E, + /* Array index: 0x003C */ 0x3821, 0x387E, 0x04DC, + /* Array index: 0x003F */ 0x3921, 0x397E, 0x053A, + /* Array index: 0x0042 */ 0x3A21, 0x3A7E, 0x0598, + /* Array index: 0x0045 */ 0x3B21, 0x3B7E, 0x05F6, + /* Array index: 0x0048 */ 0x3C21, 0x3C7E, 0x0654, + /* Array index: 0x004B */ 0x3D21, 0x3D7E, 0x06B2, + /* Array index: 0x004E */ 0x3E21, 0x3E7E, 0x0710, + /* Array index: 0x0051 */ 0x3F21, 0x3F7E, 0x076E, + /* Array index: 0x0054 */ 0x4021, 0x407E, 0x07CC, + /* Array index: 0x0057 */ 0x4121, 0x417E, 0x082A, + /* Array index: 0x005A */ 0x4221, 0x427E, 0x0888, + /* Array index: 0x005D */ 0x4321, 0x437E, 0x08E6, + /* Array index: 0x0060 */ 0x4421, 0x447E, 0x0944, + /* Array index: 0x0063 */ 0x4521, 0x457E, 0x09A2, + /* Array index: 0x0066 */ 0x4621, 0x467E, 0x0A00, + /* Array index: 0x0069 */ 0x4721, 0x477E, 0x0A5E, + /* Array index: 0x006C */ 0x4821, 0x487E, 0x0ABC, + /* Array index: 0x006F */ 0x4921, 0x497E, 0x0B1A, + /* Array index: 0x0072 */ 0x4A21, 0x4A7E, 0x0B78, + /* Array index: 0x0075 */ 0x4B21, 0x4B7E, 0x0BD6, + /* Array index: 0x0078 */ 0x4C21, 0x4C7E, 0x0C34, + /* Array index: 0x007B */ 0x4D21, 0x4D7E, 0x0C92, + /* Array index: 0x007E */ 0x4E21, 0x4E7E, 0x0CF0, + /* Array index: 0x0081 */ 0x4F21, 0x4F7E, 0x0D4E, + /* Array index: 0x0084 */ 0x5021, 0x507E, 0x0DAC, + /* Array index: 0x0087 */ 0x5121, 0x517E, 0x0E0A, + /* Array index: 0x008A */ 0x5221, 0x527E, 0x0E68, + /* Array index: 0x008D */ 0x5321, 0x537E, 0x0EC6, + /* Array index: 0x0090 */ 0x5421, 0x547E, 0x0F24, + /* Array index: 0x0093 */ 0x5521, 0x557E, 0x0F82, + /* Array index: 0x0096 */ 0x5621, 0x567E, 0x0FE0, + /* Array index: 0x0099 */ 0x5721, 0x577E, 0x103E, + /* Array index: 0x009C */ 0x5821, 0x587E, 0x109C, + /* Array index: 0x009F */ 0x5921, 0x597E, 0x10FA, + /* Array index: 0x00A2 */ 0x5A21, 0x5A7E, 0x1158, + /* Array index: 0x00A5 */ 0x5B21, 0x5B7E, 0x11B6, + /* Array index: 0x00A8 */ 0x5C21, 0x5C7E, 0x1214, + /* Array index: 0x00AB */ 0x5D21, 0x5D7E, 0x1272, + /* Array index: 0x00AE */ 0x5E21, 0x5E7E, 0x12D0, + /* Array index: 0x00B1 */ 0x5F21, 0x5F7E, 0x132E, + /* Array index: 0x00B4 */ 0x6021, 0x607E, 0x138C, + /* Array index: 0x00B7 */ 0x6121, 0x617E, 0x13EA, + /* Array index: 0x00BA */ 0x6221, 0x627E, 0x1448, + /* Array index: 0x00BD */ 0x6321, 0x637E, 0x14A6, + /* Array index: 0x00C0 */ 0x6421, 0x647E, 0x1504, + /* Array index: 0x00C3 */ 0x6521, 0x657E, 0x1562, + /* Array index: 0x00C6 */ 0x6621, 0x667E, 0x15C0, + /* Array index: 0x00C9 */ 0x6721, 0x677E, 0x161E, + /* Array index: 0x00CC */ 0x6821, 0x687E, 0x167C, + /* Array index: 0x00CF */ 0x6921, 0x697E, 0x16DA, + /* Array index: 0x00D2 */ 0x6A21, 0x6A7E, 0x1738, + /* Array index: 0x00D5 */ 0x6B21, 0x6B7E, 0x1796, + /* Array index: 0x00D8 */ 0x6C21, 0x6C7E, 0x17F4, + /* Array index: 0x00DB */ 0x6D21, 0x6D63, 0x1852, + /* Ranges content */ + /* Range 0x222F - 0x2239, array index: 0x00DE */ + 0x02D8,0x02C7,0x00B8,0x02D9,0x02DD,0x00AF,0x02DB,0x02DA, + 0x007E,0x0384,0x0385, + /* Range 0x2242 - 0x2244, array index: 0x00E9 */ + 0x00A1,0x00A6,0x00BF, + /* Range 0x226B - 0x2271, array index: 0x00EC */ + 0x00BA,0x00AA,0x00A9,0x00AE,0x2122,0x00A4,0x2116, + /* Range 0x2661 - 0x266C, array index: 0x00F3 */ + 0x0386,0x0388,0x0389,0x038A,0x03AA,INVALC,0x038C,INVALC, + 0x038E,0x03AB,INVALC,0x038F, + /* Range 0x2671 - 0x267C, array index: 0x00FF */ + 0x03AC,0x03AD,0x03AE,0x03AF,0x03CA,0x0390,0x03CC,0x03C2, + 0x03CD,0x03CB,0x03B0,0x03CE, + /* Range 0x2742 - 0x274E, array index: 0x010B */ + 0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,0x0408,0x0409, + 0x040A,0x040B,0x040C,0x040E,0x040F, + /* Range 0x2772 - 0x277E, array index: 0x0118 */ + 0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459, + 0x045A,0x045B,0x045C,0x045E,0x045F, + /* Range 0x2928 - 0x2930, array index: 0x0125 */ + 0x0141,0x013F,INVALC,0x014A,0x00D8,0x0152,INVALC,0x0166, + 0x00DE, + /* Range 0x2941 - 0x2950, array index: 0x012E */ + 0x00E6,0x0111,0x00F0,0x0127,0x0131,0x0133,0x0138,0x0142, + 0x0140,0x0149,0x014B,0x00F8,0x0153,0x00DF,0x0167,0x00FE, + /* Range 0x2A21 - 0x2A77, array index: 0x013E */ + 0x00C1,0x00C0,0x00C4,0x00C2,0x0102,0x01CD,0x0100,0x0104, + 0x00C5,0x00C3,0x0106,0x0108,0x010C,0x00C7,0x010A,0x010E, + 0x00C9,0x00C8,0x00CB,0x00CA,0x011A,0x0116,0x0112,0x0118, + INVALC,0x011C,0x011E,0x0122,0x0120,0x0124,0x00CD,0x00CC, + 0x00CF,0x00CE,0x01CF,0x0130,0x012A,0x012E,0x0128,0x0134, + 0x0136,0x0139,0x013D,0x013B,0x0143,0x0147,0x0145,0x00D1, + 0x00D3,0x00D2,0x00D6,0x00D4,0x01D1,0x0150,0x014C,0x00D5, + 0x0154,0x0158,0x0156,0x015A,0x015C,0x0160,0x015E,0x0164, + 0x0162,0x00DA,0x00D9,0x00DC,0x00DB,0x016C,0x01D3,0x0170, + 0x016A,0x0172,0x016E,0x0168,0x01D7,0x01DB,0x01D9,0x01D5, + 0x0174,0x00DD,0x0178,0x0176,0x0179,0x017D,0x017B, + /* Range 0x2B21 - 0x2B77, array index: 0x0195 */ + 0x00E1,0x00E0,0x00E4,0x00E2,0x0103,0x01CE,0x0101,0x0105, + 0x00E5,0x00E3,0x0107,0x0109,0x010D,0x00E7,0x010B,0x010F, + 0x00E9,0x00E8,0x00EB,0x00EA,0x011B,0x0117,0x0113,0x0119, + 0x01F5,0x011D,0x011F,INVALC,0x0121,0x0125,0x00ED,0x00EC, + 0x00EF,0x00EE,0x01D0,INVALC,0x012B,0x012F,0x0129,0x0135, + 0x0137,0x013A,0x013E,0x013C,0x0144,0x0148,0x0146,0x00F1, + 0x00F3,0x00F2,0x00F6,0x00F4,0x01D2,0x0151,0x014D,0x00F5, + 0x0155,0x0159,0x0157,0x015B,0x015D,0x0161,0x015F,0x0165, + 0x0163,0x00FA,0x00F9,0x00FC,0x00FB,0x016D,0x01D4,0x0171, + 0x016B,0x0173,0x016F,0x0169,0x01D8,0x01DC,0x01DA,0x01D6, + 0x0175,0x00FD,0x00FF,0x0177,0x017A,0x017E,0x017C, + /* Range 0x3021 - 0x307E, array index: 0x01EC */ + 0x4E02,0x4E04,0x4E05,0x4E0C,0x4E12,0x4E1F,0x4E23,0x4E24, + 0x4E28,0x4E2B,0x4E2E,0x4E2F,0x4E30,0x4E35,0x4E40,0x4E41, + 0x4E44,0x4E47,0x4E51,0x4E5A,0x4E5C,0x4E63,0x4E68,0x4E69, + 0x4E74,0x4E75,0x4E79,0x4E7F,0x4E8D,0x4E96,0x4E97,0x4E9D, + 0x4EAF,0x4EB9,0x4EC3,0x4ED0,0x4EDA,0x4EDB,0x4EE0,0x4EE1, + 0x4EE2,0x4EE8,0x4EEF,0x4EF1,0x4EF3,0x4EF5,0x4EFD,0x4EFE, + 0x4EFF,0x4F00,0x4F02,0x4F03,0x4F08,0x4F0B,0x4F0C,0x4F12, + 0x4F15,0x4F16,0x4F17,0x4F19,0x4F2E,0x4F31,0x4F60,0x4F33, + 0x4F35,0x4F37,0x4F39,0x4F3B,0x4F3E,0x4F40,0x4F42,0x4F48, + 0x4F49,0x4F4B,0x4F4C,0x4F52,0x4F54,0x4F56,0x4F58,0x4F5F, + 0x4F63,0x4F6A,0x4F6C,0x4F6E,0x4F71,0x4F77,0x4F78,0x4F79, + 0x4F7A,0x4F7D,0x4F7E,0x4F81,0x4F82,0x4F84, + /* Range 0x3121 - 0x317E, array index: 0x024A */ + 0x4F85,0x4F89,0x4F8A,0x4F8C,0x4F8E,0x4F90,0x4F92,0x4F93, + 0x4F94,0x4F97,0x4F99,0x4F9A,0x4F9E,0x4F9F,0x4FB2,0x4FB7, + 0x4FB9,0x4FBB,0x4FBC,0x4FBD,0x4FBE,0x4FC0,0x4FC1,0x4FC5, + 0x4FC6,0x4FC8,0x4FC9,0x4FCB,0x4FCC,0x4FCD,0x4FCF,0x4FD2, + 0x4FDC,0x4FE0,0x4FE2,0x4FF0,0x4FF2,0x4FFC,0x4FFD,0x4FFF, + 0x5000,0x5001,0x5004,0x5007,0x500A,0x500C,0x500E,0x5010, + 0x5013,0x5017,0x5018,0x501B,0x501C,0x501D,0x501E,0x5022, + 0x5027,0x502E,0x5030,0x5032,0x5033,0x5035,0x5040,0x5041, + 0x5042,0x5045,0x5046,0x504A,0x504C,0x504E,0x5051,0x5052, + 0x5053,0x5057,0x5059,0x505F,0x5060,0x5062,0x5063,0x5066, + 0x5067,0x506A,0x506D,0x5070,0x5071,0x503B,0x5081,0x5083, + 0x5084,0x5086,0x508A,0x508E,0x508F,0x5090, + /* Range 0x3221 - 0x327E, array index: 0x02A8 */ + 0x5092,0x5093,0x5094,0x5096,0x509B,0x509C,0x509E,0x509F, + 0x50A0,0x50A1,0x50A2,0x50AA,0x50AF,0x50B0,0x50B9,0x50BA, + 0x50BD,0x50C0,0x50C3,0x50C4,0x50C7,0x50CC,0x50CE,0x50D0, + 0x50D3,0x50D4,0x50D8,0x50DC,0x50DD,0x50DF,0x50E2,0x50E4, + 0x50E6,0x50E8,0x50E9,0x50EF,0x50F1,0x50F6,0x50FA,0x50FE, + 0x5103,0x5106,0x5107,0x5108,0x510B,0x510C,0x510D,0x510E, + 0x50F2,0x5110,0x5117,0x5119,0x511B,0x511C,0x511D,0x511E, + 0x5123,0x5127,0x5128,0x512C,0x512D,0x512F,0x5131,0x5133, + 0x5134,0x5135,0x5138,0x5139,0x5142,0x514A,0x514F,0x5153, + 0x5155,0x5157,0x5158,0x515F,0x5164,0x5166,0x517E,0x5183, + 0x5184,0x518B,0x518E,0x5198,0x519D,0x51A1,0x51A3,0x51AD, + 0x51B8,0x51BA,0x51BC,0x51BE,0x51BF,0x51C2, + /* Range 0x3321 - 0x337E, array index: 0x0306 */ + 0x51C8,0x51CF,0x51D1,0x51D2,0x51D3,0x51D5,0x51D8,0x51DE, + 0x51E2,0x51E5,0x51EE,0x51F2,0x51F3,0x51F4,0x51F7,0x5201, + 0x5202,0x5205,0x5212,0x5213,0x5215,0x5216,0x5218,0x5222, + 0x5228,0x5231,0x5232,0x5235,0x523C,0x5245,0x5249,0x5255, + 0x5257,0x5258,0x525A,0x525C,0x525F,0x5260,0x5261,0x5266, + 0x526E,0x5277,0x5278,0x5279,0x5280,0x5282,0x5285,0x528A, + 0x528C,0x5293,0x5295,0x5296,0x5297,0x5298,0x529A,0x529C, + 0x52A4,0x52A5,0x52A6,0x52A7,0x52AF,0x52B0,0x52B6,0x52B7, + 0x52B8,0x52BA,0x52BB,0x52BD,0x52C0,0x52C4,0x52C6,0x52C8, + 0x52CC,0x52CF,0x52D1,0x52D4,0x52D6,0x52DB,0x52DC,0x52E1, + 0x52E5,0x52E8,0x52E9,0x52EA,0x52EC,0x52F0,0x52F1,0x52F4, + 0x52F6,0x52F7,0x5300,0x5303,0x530A,0x530B, + /* Range 0x3421 - 0x347E, array index: 0x0364 */ + 0x530C,0x5311,0x5313,0x5318,0x531B,0x531C,0x531E,0x531F, + 0x5325,0x5327,0x5328,0x5329,0x532B,0x532C,0x532D,0x5330, + 0x5332,0x5335,0x533C,0x533D,0x533E,0x5342,0x534C,0x534B, + 0x5359,0x535B,0x5361,0x5363,0x5365,0x536C,0x536D,0x5372, + 0x5379,0x537E,0x5383,0x5387,0x5388,0x538E,0x5393,0x5394, + 0x5399,0x539D,0x53A1,0x53A4,0x53AA,0x53AB,0x53AF,0x53B2, + 0x53B4,0x53B5,0x53B7,0x53B8,0x53BA,0x53BD,0x53C0,0x53C5, + 0x53CF,0x53D2,0x53D3,0x53D5,0x53DA,0x53DD,0x53DE,0x53E0, + 0x53E6,0x53E7,0x53F5,0x5402,0x5413,0x541A,0x5421,0x5427, + 0x5428,0x542A,0x542F,0x5431,0x5434,0x5435,0x5443,0x5444, + 0x5447,0x544D,0x544F,0x545E,0x5462,0x5464,0x5466,0x5467, + 0x5469,0x546B,0x546D,0x546E,0x5474,0x547F, + /* Range 0x3521 - 0x357E, array index: 0x03C2 */ + 0x5481,0x5483,0x5485,0x5488,0x5489,0x548D,0x5491,0x5495, + 0x5496,0x549C,0x549F,0x54A1,0x54A6,0x54A7,0x54A9,0x54AA, + 0x54AD,0x54AE,0x54B1,0x54B7,0x54B9,0x54BA,0x54BB,0x54BF, + 0x54C6,0x54CA,0x54CD,0x54CE,0x54E0,0x54EA,0x54EC,0x54EF, + 0x54F6,0x54FC,0x54FE,0x54FF,0x5500,0x5501,0x5505,0x5508, + 0x5509,0x550C,0x550D,0x550E,0x5515,0x552A,0x552B,0x5532, + 0x5535,0x5536,0x553B,0x553C,0x553D,0x5541,0x5547,0x5549, + 0x554A,0x554D,0x5550,0x5551,0x5558,0x555A,0x555B,0x555E, + 0x5560,0x5561,0x5564,0x5566,0x557F,0x5581,0x5582,0x5586, + 0x5588,0x558E,0x558F,0x5591,0x5592,0x5593,0x5594,0x5597, + 0x55A3,0x55A4,0x55AD,0x55B2,0x55BF,0x55C1,0x55C3,0x55C6, + 0x55C9,0x55CB,0x55CC,0x55CE,0x55D1,0x55D2, + /* Range 0x3621 - 0x367E, array index: 0x0420 */ + 0x55D3,0x55D7,0x55D8,0x55DB,0x55DE,0x55E2,0x55E9,0x55F6, + 0x55FF,0x5605,0x5608,0x560A,0x560D,0x560E,0x560F,0x5610, + 0x5611,0x5612,0x5619,0x562C,0x5630,0x5633,0x5635,0x5637, + 0x5639,0x563B,0x563C,0x563D,0x563F,0x5640,0x5641,0x5643, + 0x5644,0x5646,0x5649,0x564B,0x564D,0x564F,0x5654,0x565E, + 0x5660,0x5661,0x5662,0x5663,0x5666,0x5669,0x566D,0x566F, + 0x5671,0x5672,0x5675,0x5684,0x5685,0x5688,0x568B,0x568C, + 0x5695,0x5699,0x569A,0x569D,0x569E,0x569F,0x56A6,0x56A7, + 0x56A8,0x56A9,0x56AB,0x56AC,0x56AD,0x56B1,0x56B3,0x56B7, + 0x56BE,0x56C5,0x56C9,0x56CA,0x56CB,0x56CF,0x56D0,0x56CC, + 0x56CD,0x56D9,0x56DC,0x56DD,0x56DF,0x56E1,0x56E4,0x56E5, + 0x56E6,0x56E7,0x56E8,0x56F1,0x56EB,0x56ED, + /* Range 0x3721 - 0x377E, array index: 0x047E */ + 0x56F6,0x56F7,0x5701,0x5702,0x5707,0x570A,0x570C,0x5711, + 0x5715,0x571A,0x571B,0x571D,0x5720,0x5722,0x5723,0x5724, + 0x5725,0x5729,0x572A,0x572C,0x572E,0x572F,0x5733,0x5734, + 0x573D,0x573E,0x573F,0x5745,0x5746,0x574C,0x574D,0x5752, + 0x5762,0x5765,0x5767,0x5768,0x576B,0x576D,0x576E,0x576F, + 0x5770,0x5771,0x5773,0x5774,0x5775,0x5777,0x5779,0x577A, + 0x577B,0x577C,0x577E,0x5781,0x5783,0x578C,0x5794,0x5797, + 0x5799,0x579A,0x579C,0x579D,0x579E,0x579F,0x57A1,0x5795, + 0x57A7,0x57A8,0x57A9,0x57AC,0x57B8,0x57BD,0x57C7,0x57C8, + 0x57CC,0x57CF,0x57D5,0x57DD,0x57DE,0x57E4,0x57E6,0x57E7, + 0x57E9,0x57ED,0x57F0,0x57F5,0x57F6,0x57F8,0x57FD,0x57FE, + 0x57FF,0x5803,0x5804,0x5808,0x5809,0x57E1, + /* Range 0x3821 - 0x387E, array index: 0x04DC */ + 0x580C,0x580D,0x581B,0x581E,0x581F,0x5820,0x5826,0x5827, + 0x582D,0x5832,0x5839,0x583F,0x5849,0x584C,0x584D,0x584F, + 0x5850,0x5855,0x585F,0x5861,0x5864,0x5867,0x5868,0x5878, + 0x587C,0x587F,0x5880,0x5881,0x5887,0x5888,0x5889,0x588A, + 0x588C,0x588D,0x588F,0x5890,0x5894,0x5896,0x589D,0x58A0, + 0x58A1,0x58A2,0x58A6,0x58A9,0x58B1,0x58B2,0x58C4,0x58BC, + 0x58C2,0x58C8,0x58CD,0x58CE,0x58D0,0x58D2,0x58D4,0x58D6, + 0x58DA,0x58DD,0x58E1,0x58E2,0x58E9,0x58F3,0x5905,0x5906, + 0x590B,0x590C,0x5912,0x5913,0x5914,0x8641,0x591D,0x5921, + 0x5923,0x5924,0x5928,0x592F,0x5930,0x5933,0x5935,0x5936, + 0x593F,0x5943,0x5946,0x5952,0x5953,0x5959,0x595B,0x595D, + 0x595E,0x595F,0x5961,0x5963,0x596B,0x596D, + /* Range 0x3921 - 0x397E, array index: 0x053A */ + 0x596F,0x5972,0x5975,0x5976,0x5979,0x597B,0x597C,0x598B, + 0x598C,0x598E,0x5992,0x5995,0x5997,0x599F,0x59A4,0x59A7, + 0x59AD,0x59AE,0x59AF,0x59B0,0x59B3,0x59B7,0x59BA,0x59BC, + 0x59C1,0x59C3,0x59C4,0x59C8,0x59CA,0x59CD,0x59D2,0x59DD, + 0x59DE,0x59DF,0x59E3,0x59E4,0x59E7,0x59EE,0x59EF,0x59F1, + 0x59F2,0x59F4,0x59F7,0x5A00,0x5A04,0x5A0C,0x5A0D,0x5A0E, + 0x5A12,0x5A13,0x5A1E,0x5A23,0x5A24,0x5A27,0x5A28,0x5A2A, + 0x5A2D,0x5A30,0x5A44,0x5A45,0x5A47,0x5A48,0x5A4C,0x5A50, + 0x5A55,0x5A5E,0x5A63,0x5A65,0x5A67,0x5A6D,0x5A77,0x5A7A, + 0x5A7B,0x5A7E,0x5A8B,0x5A90,0x5A93,0x5A96,0x5A99,0x5A9C, + 0x5A9E,0x5A9F,0x5AA0,0x5AA2,0x5AA7,0x5AAC,0x5AB1,0x5AB2, + 0x5AB3,0x5AB5,0x5AB8,0x5ABA,0x5ABB,0x5ABF, + /* Range 0x3A21 - 0x3A7E, array index: 0x0598 */ + 0x5AC4,0x5AC6,0x5AC8,0x5ACF,0x5ADA,0x5ADC,0x5AE0,0x5AE5, + 0x5AEA,0x5AEE,0x5AF5,0x5AF6,0x5AFD,0x5B00,0x5B01,0x5B08, + 0x5B17,0x5B34,0x5B19,0x5B1B,0x5B1D,0x5B21,0x5B25,0x5B2D, + 0x5B38,0x5B41,0x5B4B,0x5B4C,0x5B52,0x5B56,0x5B5E,0x5B68, + 0x5B6E,0x5B6F,0x5B7C,0x5B7D,0x5B7E,0x5B7F,0x5B81,0x5B84, + 0x5B86,0x5B8A,0x5B8E,0x5B90,0x5B91,0x5B93,0x5B94,0x5B96, + 0x5BA8,0x5BA9,0x5BAC,0x5BAD,0x5BAF,0x5BB1,0x5BB2,0x5BB7, + 0x5BBA,0x5BBC,0x5BC0,0x5BC1,0x5BCD,0x5BCF,0x5BD6,0x5BD7, + 0x5BD8,0x5BD9,0x5BDA,0x5BE0,0x5BEF,0x5BF1,0x5BF4,0x5BFD, + 0x5C0C,0x5C17,0x5C1E,0x5C1F,0x5C23,0x5C26,0x5C29,0x5C2B, + 0x5C2C,0x5C2E,0x5C30,0x5C32,0x5C35,0x5C36,0x5C59,0x5C5A, + 0x5C5C,0x5C62,0x5C63,0x5C67,0x5C68,0x5C69, + /* Range 0x3B21 - 0x3B7E, array index: 0x05F6 */ + 0x5C6D,0x5C70,0x5C74,0x5C75,0x5C7A,0x5C7B,0x5C7C,0x5C7D, + 0x5C87,0x5C88,0x5C8A,0x5C8F,0x5C92,0x5C9D,0x5C9F,0x5CA0, + 0x5CA2,0x5CA3,0x5CA6,0x5CAA,0x5CB2,0x5CB4,0x5CB5,0x5CBA, + 0x5CC9,0x5CCB,0x5CD2,0x5CDD,0x5CD7,0x5CEE,0x5CF1,0x5CF2, + 0x5CF4,0x5D01,0x5D06,0x5D0D,0x5D12,0x5D2B,0x5D23,0x5D24, + 0x5D26,0x5D27,0x5D31,0x5D34,0x5D39,0x5D3D,0x5D3F,0x5D42, + 0x5D43,0x5D46,0x5D48,0x5D55,0x5D51,0x5D59,0x5D4A,0x5D5F, + 0x5D60,0x5D61,0x5D62,0x5D64,0x5D6A,0x5D6D,0x5D70,0x5D79, + 0x5D7A,0x5D7E,0x5D7F,0x5D81,0x5D83,0x5D88,0x5D8A,0x5D92, + 0x5D93,0x5D94,0x5D95,0x5D99,0x5D9B,0x5D9F,0x5DA0,0x5DA7, + 0x5DAB,0x5DB0,0x5DB4,0x5DB8,0x5DB9,0x5DC3,0x5DC7,0x5DCB, + 0x5DD0,0x5DCE,0x5DD8,0x5DD9,0x5DE0,0x5DE4, + /* Range 0x3C21 - 0x3C7E, array index: 0x0654 */ + 0x5DE9,0x5DF8,0x5DF9,0x5E00,0x5E07,0x5E0D,0x5E12,0x5E14, + 0x5E15,0x5E18,0x5E1F,0x5E20,0x5E2E,0x5E28,0x5E32,0x5E35, + 0x5E3E,0x5E4B,0x5E50,0x5E49,0x5E51,0x5E56,0x5E58,0x5E5B, + 0x5E5C,0x5E5E,0x5E68,0x5E6A,0x5E6B,0x5E6C,0x5E6D,0x5E6E, + 0x5E70,0x5E80,0x5E8B,0x5E8E,0x5EA2,0x5EA4,0x5EA5,0x5EA8, + 0x5EAA,0x5EAC,0x5EB1,0x5EB3,0x5EBD,0x5EBE,0x5EBF,0x5EC6, + 0x5ECC,0x5ECB,0x5ECE,0x5ED1,0x5ED2,0x5ED4,0x5ED5,0x5EDC, + 0x5EDE,0x5EE5,0x5EEB,0x5F02,0x5F06,0x5F07,0x5F08,0x5F0E, + 0x5F19,0x5F1C,0x5F1D,0x5F21,0x5F22,0x5F23,0x5F24,0x5F28, + 0x5F2B,0x5F2C,0x5F2E,0x5F30,0x5F34,0x5F36,0x5F3B,0x5F3D, + 0x5F3F,0x5F40,0x5F44,0x5F45,0x5F47,0x5F4D,0x5F50,0x5F54, + 0x5F58,0x5F5B,0x5F60,0x5F63,0x5F64,0x5F67, + /* Range 0x3D21 - 0x3D7E, array index: 0x06B2 */ + 0x5F6F,0x5F72,0x5F74,0x5F75,0x5F78,0x5F7A,0x5F7D,0x5F7E, + 0x5F89,0x5F8D,0x5F8F,0x5F96,0x5F9C,0x5F9D,0x5FA2,0x5FA7, + 0x5FAB,0x5FA4,0x5FAC,0x5FAF,0x5FB0,0x5FB1,0x5FB8,0x5FC4, + 0x5FC7,0x5FC8,0x5FC9,0x5FCB,0x5FD0,0x5FD1,0x5FD2,0x5FD3, + 0x5FD4,0x5FDE,0x5FE1,0x5FE2,0x5FE8,0x5FE9,0x5FEA,0x5FEC, + 0x5FED,0x5FEE,0x5FEF,0x5FF2,0x5FF3,0x5FF6,0x5FFA,0x5FFC, + 0x6007,0x600A,0x600D,0x6013,0x6014,0x6017,0x6018,0x601A, + 0x601F,0x6024,0x602D,0x6033,0x6035,0x6040,0x6047,0x6048, + 0x6049,0x604C,0x6051,0x6054,0x6056,0x6057,0x605D,0x6061, + 0x6067,0x6071,0x607E,0x607F,0x6082,0x6086,0x6088,0x608A, + 0x608E,0x6091,0x6093,0x6095,0x6098,0x609D,0x609E,0x60A2, + 0x60A4,0x60A5,0x60A8,0x60B0,0x60B1,0x60B7, + /* Range 0x3E21 - 0x3E7E, array index: 0x0710 */ + 0x60BB,0x60BE,0x60C2,0x60C4,0x60C8,0x60C9,0x60CA,0x60CB, + 0x60CE,0x60CF,0x60D4,0x60D5,0x60D9,0x60DB,0x60DD,0x60DE, + 0x60E2,0x60E5,0x60F2,0x60F5,0x60F8,0x60FC,0x60FD,0x6102, + 0x6107,0x610A,0x610C,0x6110,0x6111,0x6112,0x6113,0x6114, + 0x6116,0x6117,0x6119,0x611C,0x611E,0x6122,0x612A,0x612B, + 0x6130,0x6131,0x6135,0x6136,0x6137,0x6139,0x6141,0x6145, + 0x6146,0x6149,0x615E,0x6160,0x616C,0x6172,0x6178,0x617B, + 0x617C,0x617F,0x6180,0x6181,0x6183,0x6184,0x618B,0x618D, + 0x6192,0x6193,0x6197,0x6198,0x619C,0x619D,0x619F,0x61A0, + 0x61A5,0x61A8,0x61AA,0x61AD,0x61B8,0x61B9,0x61BC,0x61C0, + 0x61C1,0x61C2,0x61CE,0x61CF,0x61D5,0x61DC,0x61DD,0x61DE, + 0x61DF,0x61E1,0x61E2,0x61E7,0x61E9,0x61E5, + /* Range 0x3F21 - 0x3F7E, array index: 0x076E */ + 0x61EC,0x61ED,0x61EF,0x6201,0x6203,0x6204,0x6207,0x6213, + 0x6215,0x621C,0x6220,0x6222,0x6223,0x6227,0x6229,0x622B, + 0x6239,0x623D,0x6242,0x6243,0x6244,0x6246,0x624C,0x6250, + 0x6251,0x6252,0x6254,0x6256,0x625A,0x625C,0x6264,0x626D, + 0x626F,0x6273,0x627A,0x627D,0x628D,0x628E,0x628F,0x6290, + 0x62A6,0x62A8,0x62B3,0x62B6,0x62B7,0x62BA,0x62BE,0x62BF, + 0x62C4,0x62CE,0x62D5,0x62D6,0x62DA,0x62EA,0x62F2,0x62F4, + 0x62FC,0x62FD,0x6303,0x6304,0x630A,0x630B,0x630D,0x6310, + 0x6313,0x6316,0x6318,0x6329,0x632A,0x632D,0x6335,0x6336, + 0x6339,0x633C,0x6341,0x6342,0x6343,0x6344,0x6346,0x634A, + 0x634B,0x634E,0x6352,0x6353,0x6354,0x6358,0x635B,0x6365, + 0x6366,0x636C,0x636D,0x6371,0x6374,0x6375, + /* Range 0x4021 - 0x407E, array index: 0x07CC */ + 0x6378,0x637C,0x637D,0x637F,0x6382,0x6384,0x6387,0x638A, + 0x6390,0x6394,0x6395,0x6399,0x639A,0x639E,0x63A4,0x63A6, + 0x63AD,0x63AE,0x63AF,0x63BD,0x63C1,0x63C5,0x63C8,0x63CE, + 0x63D1,0x63D3,0x63D4,0x63D5,0x63DC,0x63E0,0x63E5,0x63EA, + 0x63EC,0x63F2,0x63F3,0x63F5,0x63F8,0x63F9,0x6409,0x640A, + 0x6410,0x6412,0x6414,0x6418,0x641E,0x6420,0x6422,0x6424, + 0x6425,0x6429,0x642A,0x642F,0x6430,0x6435,0x643D,0x643F, + 0x644B,0x644F,0x6451,0x6452,0x6453,0x6454,0x645A,0x645B, + 0x645C,0x645D,0x645F,0x6460,0x6461,0x6463,0x646D,0x6473, + 0x6474,0x647B,0x647D,0x6485,0x6487,0x648F,0x6490,0x6491, + 0x6498,0x6499,0x649B,0x649D,0x649F,0x64A1,0x64A3,0x64A6, + 0x64A8,0x64AC,0x64B3,0x64BD,0x64BE,0x64BF, + /* Range 0x4121 - 0x417E, array index: 0x082A */ + 0x64C4,0x64C9,0x64CA,0x64CB,0x64CC,0x64CE,0x64D0,0x64D1, + 0x64D5,0x64D7,0x64E4,0x64E5,0x64E9,0x64EA,0x64ED,0x64F0, + 0x64F5,0x64F7,0x64FB,0x64FF,0x6501,0x6504,0x6508,0x6509, + 0x650A,0x650F,0x6513,0x6514,0x6516,0x6519,0x651B,0x651E, + 0x651F,0x6522,0x6526,0x6529,0x652E,0x6531,0x653A,0x653C, + 0x653D,0x6543,0x6547,0x6549,0x6550,0x6552,0x6554,0x655F, + 0x6560,0x6567,0x656B,0x657A,0x657D,0x6581,0x6585,0x658A, + 0x6592,0x6595,0x6598,0x659D,0x65A0,0x65A3,0x65A6,0x65AE, + 0x65B2,0x65B3,0x65B4,0x65BF,0x65C2,0x65C8,0x65C9,0x65CE, + 0x65D0,0x65D4,0x65D6,0x65D8,0x65DF,0x65F0,0x65F2,0x65F4, + 0x65F5,0x65F9,0x65FE,0x65FF,0x6600,0x6604,0x6608,0x6609, + 0x660D,0x6611,0x6612,0x6615,0x6616,0x661D, + /* Range 0x4221 - 0x427E, array index: 0x0888 */ + 0x661E,0x6621,0x6622,0x6623,0x6624,0x6626,0x6629,0x662A, + 0x662B,0x662C,0x662E,0x6630,0x6631,0x6633,0x6639,0x6637, + 0x6640,0x6645,0x6646,0x664A,0x664C,0x6651,0x664E,0x6657, + 0x6658,0x6659,0x665B,0x665C,0x6660,0x6661,0x66FB,0x666A, + 0x666B,0x666C,0x667E,0x6673,0x6675,0x667F,0x6677,0x6678, + 0x6679,0x667B,0x6680,0x667C,0x668B,0x668C,0x668D,0x6690, + 0x6692,0x6699,0x669A,0x669B,0x669C,0x669F,0x66A0,0x66A4, + 0x66AD,0x66B1,0x66B2,0x66B5,0x66BB,0x66BF,0x66C0,0x66C2, + 0x66C3,0x66C8,0x66CC,0x66CE,0x66CF,0x66D4,0x66DB,0x66DF, + 0x66E8,0x66EB,0x66EC,0x66EE,0x66FA,0x6705,0x6707,0x670E, + 0x6713,0x6719,0x671C,0x6720,0x6722,0x6733,0x673E,0x6745, + 0x6747,0x6748,0x674C,0x6754,0x6755,0x675D, + /* Range 0x4321 - 0x437E, array index: 0x08E6 */ + 0x6766,0x676C,0x676E,0x6774,0x6776,0x677B,0x6781,0x6784, + 0x678E,0x678F,0x6791,0x6793,0x6796,0x6798,0x6799,0x679B, + 0x67B0,0x67B1,0x67B2,0x67B5,0x67BB,0x67BC,0x67BD,0x67F9, + 0x67C0,0x67C2,0x67C3,0x67C5,0x67C8,0x67C9,0x67D2,0x67D7, + 0x67D9,0x67DC,0x67E1,0x67E6,0x67F0,0x67F2,0x67F6,0x67F7, + 0x6852,0x6814,0x6819,0x681D,0x681F,0x6828,0x6827,0x682C, + 0x682D,0x682F,0x6830,0x6831,0x6833,0x683B,0x683F,0x6844, + 0x6845,0x684A,0x684C,0x6855,0x6857,0x6858,0x685B,0x686B, + 0x686E,0x686F,0x6870,0x6871,0x6872,0x6875,0x6879,0x687A, + 0x687B,0x687C,0x6882,0x6884,0x6886,0x6888,0x6896,0x6898, + 0x689A,0x689C,0x68A1,0x68A3,0x68A5,0x68A9,0x68AA,0x68AE, + 0x68B2,0x68BB,0x68C5,0x68C8,0x68CC,0x68CF, + /* Range 0x4421 - 0x447E, array index: 0x0944 */ + 0x68D0,0x68D1,0x68D3,0x68D6,0x68D9,0x68DC,0x68DD,0x68E5, + 0x68E8,0x68EA,0x68EB,0x68EC,0x68ED,0x68F0,0x68F1,0x68F5, + 0x68F6,0x68FB,0x68FC,0x68FD,0x6906,0x6909,0x690A,0x6910, + 0x6911,0x6913,0x6916,0x6917,0x6931,0x6933,0x6935,0x6938, + 0x693B,0x6942,0x6945,0x6949,0x694E,0x6957,0x695B,0x6963, + 0x6964,0x6965,0x6966,0x6968,0x6969,0x696C,0x6970,0x6971, + 0x6972,0x697A,0x697B,0x697F,0x6980,0x698D,0x6992,0x6996, + 0x6998,0x69A1,0x69A5,0x69A6,0x69A8,0x69AB,0x69AD,0x69AF, + 0x69B7,0x69B8,0x69BA,0x69BC,0x69C5,0x69C8,0x69D1,0x69D6, + 0x69D7,0x69E2,0x69E5,0x69EE,0x69EF,0x69F1,0x69F3,0x69F5, + 0x69FE,0x6A00,0x6A01,0x6A03,0x6A0F,0x6A11,0x6A15,0x6A1A, + 0x6A1D,0x6A20,0x6A24,0x6A28,0x6A30,0x6A32, + /* Range 0x4521 - 0x457E, array index: 0x09A2 */ + 0x6A34,0x6A37,0x6A3B,0x6A3E,0x6A3F,0x6A45,0x6A46,0x6A49, + 0x6A4A,0x6A4E,0x6A50,0x6A51,0x6A52,0x6A55,0x6A56,0x6A5B, + 0x6A64,0x6A67,0x6A6A,0x6A71,0x6A73,0x6A7E,0x6A81,0x6A83, + 0x6A86,0x6A87,0x6A89,0x6A8B,0x6A91,0x6A9B,0x6A9D,0x6A9E, + 0x6A9F,0x6AA5,0x6AAB,0x6AAF,0x6AB0,0x6AB1,0x6AB4,0x6ABD, + 0x6ABE,0x6ABF,0x6AC6,0x6AC9,0x6AC8,0x6ACC,0x6AD0,0x6AD4, + 0x6AD5,0x6AD6,0x6ADC,0x6ADD,0x6AE4,0x6AE7,0x6AEC,0x6AF0, + 0x6AF1,0x6AF2,0x6AFC,0x6AFD,0x6B02,0x6B03,0x6B06,0x6B07, + 0x6B09,0x6B0F,0x6B10,0x6B11,0x6B17,0x6B1B,0x6B1E,0x6B24, + 0x6B28,0x6B2B,0x6B2C,0x6B2F,0x6B35,0x6B36,0x6B3B,0x6B3F, + 0x6B46,0x6B4A,0x6B4D,0x6B52,0x6B56,0x6B58,0x6B5D,0x6B60, + 0x6B67,0x6B6B,0x6B6E,0x6B70,0x6B75,0x6B7D, + /* Range 0x4621 - 0x467E, array index: 0x0A00 */ + 0x6B7E,0x6B82,0x6B85,0x6B97,0x6B9B,0x6B9F,0x6BA0,0x6BA2, + 0x6BA3,0x6BA8,0x6BA9,0x6BAC,0x6BAD,0x6BAE,0x6BB0,0x6BB8, + 0x6BB9,0x6BBD,0x6BBE,0x6BC3,0x6BC4,0x6BC9,0x6BCC,0x6BD6, + 0x6BDA,0x6BE1,0x6BE3,0x6BE6,0x6BE7,0x6BEE,0x6BF1,0x6BF7, + 0x6BF9,0x6BFF,0x6C02,0x6C04,0x6C05,0x6C09,0x6C0D,0x6C0E, + 0x6C10,0x6C12,0x6C19,0x6C1F,0x6C26,0x6C27,0x6C28,0x6C2C, + 0x6C2E,0x6C33,0x6C35,0x6C36,0x6C3A,0x6C3B,0x6C3F,0x6C4A, + 0x6C4B,0x6C4D,0x6C4F,0x6C52,0x6C54,0x6C59,0x6C5B,0x6C5C, + 0x6C6B,0x6C6D,0x6C6F,0x6C74,0x6C76,0x6C78,0x6C79,0x6C7B, + 0x6C85,0x6C86,0x6C87,0x6C89,0x6C94,0x6C95,0x6C97,0x6C98, + 0x6C9C,0x6C9F,0x6CB0,0x6CB2,0x6CB4,0x6CC2,0x6CC6,0x6CCD, + 0x6CCF,0x6CD0,0x6CD1,0x6CD2,0x6CD4,0x6CD6, + /* Range 0x4721 - 0x477E, array index: 0x0A5E */ + 0x6CDA,0x6CDC,0x6CE0,0x6CE7,0x6CE9,0x6CEB,0x6CEC,0x6CEE, + 0x6CF2,0x6CF4,0x6D04,0x6D07,0x6D0A,0x6D0E,0x6D0F,0x6D11, + 0x6D13,0x6D1A,0x6D26,0x6D27,0x6D28,0x6C67,0x6D2E,0x6D2F, + 0x6D31,0x6D39,0x6D3C,0x6D3F,0x6D57,0x6D5E,0x6D5F,0x6D61, + 0x6D65,0x6D67,0x6D6F,0x6D70,0x6D7C,0x6D82,0x6D87,0x6D91, + 0x6D92,0x6D94,0x6D96,0x6D97,0x6D98,0x6DAA,0x6DAC,0x6DB4, + 0x6DB7,0x6DB9,0x6DBD,0x6DBF,0x6DC4,0x6DC8,0x6DCA,0x6DCE, + 0x6DCF,0x6DD6,0x6DDB,0x6DDD,0x6DDF,0x6DE0,0x6DE2,0x6DE5, + 0x6DE9,0x6DEF,0x6DF0,0x6DF4,0x6DF6,0x6DFC,0x6E00,0x6E04, + 0x6E1E,0x6E22,0x6E27,0x6E32,0x6E36,0x6E39,0x6E3B,0x6E3C, + 0x6E44,0x6E45,0x6E48,0x6E49,0x6E4B,0x6E4F,0x6E51,0x6E52, + 0x6E53,0x6E54,0x6E57,0x6E5C,0x6E5D,0x6E5E, + /* Range 0x4821 - 0x487E, array index: 0x0ABC */ + 0x6E62,0x6E63,0x6E68,0x6E73,0x6E7B,0x6E7D,0x6E8D,0x6E93, + 0x6E99,0x6EA0,0x6EA7,0x6EAD,0x6EAE,0x6EB1,0x6EB3,0x6EBB, + 0x6EBF,0x6EC0,0x6EC1,0x6EC3,0x6EC7,0x6EC8,0x6ECA,0x6ECD, + 0x6ECE,0x6ECF,0x6EEB,0x6EED,0x6EEE,0x6EF9,0x6EFB,0x6EFD, + 0x6F04,0x6F08,0x6F0A,0x6F0C,0x6F0D,0x6F16,0x6F18,0x6F1A, + 0x6F1B,0x6F26,0x6F29,0x6F2A,0x6F2F,0x6F30,0x6F33,0x6F36, + 0x6F3B,0x6F3C,0x6F2D,0x6F4F,0x6F51,0x6F52,0x6F53,0x6F57, + 0x6F59,0x6F5A,0x6F5D,0x6F5E,0x6F61,0x6F62,0x6F68,0x6F6C, + 0x6F7D,0x6F7E,0x6F83,0x6F87,0x6F88,0x6F8B,0x6F8C,0x6F8D, + 0x6F90,0x6F92,0x6F93,0x6F94,0x6F96,0x6F9A,0x6F9F,0x6FA0, + 0x6FA5,0x6FA6,0x6FA7,0x6FA8,0x6FAE,0x6FAF,0x6FB0,0x6FB5, + 0x6FB6,0x6FBC,0x6FC5,0x6FC7,0x6FC8,0x6FCA, + /* Range 0x4921 - 0x497E, array index: 0x0B1A */ + 0x6FDA,0x6FDE,0x6FE8,0x6FE9,0x6FF0,0x6FF5,0x6FF9,0x6FFC, + 0x6FFD,0x7000,0x7005,0x7006,0x7007,0x700D,0x7017,0x7020, + 0x7023,0x702F,0x7034,0x7037,0x7039,0x703C,0x7043,0x7044, + 0x7048,0x7049,0x704A,0x704B,0x7054,0x7055,0x705D,0x705E, + 0x704E,0x7064,0x7065,0x706C,0x706E,0x7075,0x7076,0x707E, + 0x7081,0x7085,0x7086,0x7094,0x7095,0x7096,0x7097,0x7098, + 0x709B,0x70A4,0x70AB,0x70B0,0x70B1,0x70B4,0x70B7,0x70CA, + 0x70D1,0x70D3,0x70D4,0x70D5,0x70D6,0x70D8,0x70DC,0x70E4, + 0x70FA,0x7103,0x7104,0x7105,0x7106,0x7107,0x710B,0x710C, + 0x710F,0x711E,0x7120,0x712B,0x712D,0x712F,0x7130,0x7131, + 0x7138,0x7141,0x7145,0x7146,0x7147,0x714A,0x714B,0x7150, + 0x7152,0x7157,0x715A,0x715C,0x715E,0x7160, + /* Range 0x4A21 - 0x4A7E, array index: 0x0B78 */ + 0x7168,0x7179,0x7180,0x7185,0x7187,0x718C,0x7192,0x719A, + 0x719B,0x71A0,0x71A2,0x71AF,0x71B0,0x71B2,0x71B3,0x71BA, + 0x71BF,0x71C0,0x71C1,0x71C4,0x71CB,0x71CC,0x71D3,0x71D6, + 0x71D9,0x71DA,0x71DC,0x71F8,0x71FE,0x7200,0x7207,0x7208, + 0x7209,0x7213,0x7217,0x721A,0x721D,0x721F,0x7224,0x722B, + 0x722F,0x7234,0x7238,0x7239,0x7241,0x7242,0x7243,0x7245, + 0x724E,0x724F,0x7250,0x7253,0x7255,0x7256,0x725A,0x725C, + 0x725E,0x7260,0x7263,0x7268,0x726B,0x726E,0x726F,0x7271, + 0x7277,0x7278,0x727B,0x727C,0x727F,0x7284,0x7289,0x728D, + 0x728E,0x7293,0x729B,0x72A8,0x72AD,0x72AE,0x72B1,0x72B4, + 0x72BE,0x72C1,0x72C7,0x72C9,0x72CC,0x72D5,0x72D6,0x72D8, + 0x72DF,0x72E5,0x72F3,0x72F4,0x72FA,0x72FB, + /* Range 0x4B21 - 0x4B7E, array index: 0x0BD6 */ + 0x72FE,0x7302,0x7304,0x7305,0x7307,0x730B,0x730D,0x7312, + 0x7313,0x7318,0x7319,0x731E,0x7322,0x7324,0x7327,0x7328, + 0x732C,0x7331,0x7332,0x7335,0x733A,0x733B,0x733D,0x7343, + 0x734D,0x7350,0x7352,0x7356,0x7358,0x735D,0x735E,0x735F, + 0x7360,0x7366,0x7367,0x7369,0x736B,0x736C,0x736E,0x736F, + 0x7371,0x7377,0x7379,0x737C,0x7380,0x7381,0x7383,0x7385, + 0x7386,0x738E,0x7390,0x7393,0x7395,0x7397,0x7398,0x739C, + 0x739E,0x739F,0x73A0,0x73A2,0x73A5,0x73A6,0x73AA,0x73AB, + 0x73AD,0x73B5,0x73B7,0x73B9,0x73BC,0x73BD,0x73BF,0x73C5, + 0x73C6,0x73C9,0x73CB,0x73CC,0x73CF,0x73D2,0x73D3,0x73D6, + 0x73D9,0x73DD,0x73E1,0x73E3,0x73E6,0x73E7,0x73E9,0x73F4, + 0x73F5,0x73F7,0x73F9,0x73FA,0x73FB,0x73FD, + /* Range 0x4C21 - 0x4C7E, array index: 0x0C34 */ + 0x73FF,0x7400,0x7401,0x7404,0x7407,0x740A,0x7411,0x741A, + 0x741B,0x7424,0x7426,0x7428,0x7429,0x742A,0x742B,0x742C, + 0x742D,0x742E,0x742F,0x7430,0x7431,0x7439,0x7440,0x7443, + 0x7444,0x7446,0x7447,0x744B,0x744D,0x7451,0x7452,0x7457, + 0x745D,0x7462,0x7466,0x7467,0x7468,0x746B,0x746D,0x746E, + 0x7471,0x7472,0x7480,0x7481,0x7485,0x7486,0x7487,0x7489, + 0x748F,0x7490,0x7491,0x7492,0x7498,0x7499,0x749A,0x749C, + 0x749F,0x74A0,0x74A1,0x74A3,0x74A6,0x74A8,0x74A9,0x74AA, + 0x74AB,0x74AE,0x74AF,0x74B1,0x74B2,0x74B5,0x74B9,0x74BB, + 0x74BF,0x74C8,0x74C9,0x74CC,0x74D0,0x74D3,0x74D8,0x74DA, + 0x74DB,0x74DE,0x74DF,0x74E4,0x74E8,0x74EA,0x74EB,0x74EF, + 0x74F4,0x74FA,0x74FB,0x74FC,0x74FF,0x7506, + /* Range 0x4D21 - 0x4D7E, array index: 0x0C92 */ + 0x7512,0x7516,0x7517,0x7520,0x7521,0x7524,0x7527,0x7529, + 0x752A,0x752F,0x7536,0x7539,0x753D,0x753E,0x753F,0x7540, + 0x7543,0x7547,0x7548,0x754E,0x7550,0x7552,0x7557,0x755E, + 0x755F,0x7561,0x756F,0x7571,0x7579,0x757A,0x757B,0x757C, + 0x757D,0x757E,0x7581,0x7585,0x7590,0x7592,0x7593,0x7595, + 0x7599,0x759C,0x75A2,0x75A4,0x75B4,0x75BA,0x75BF,0x75C0, + 0x75C1,0x75C4,0x75C6,0x75CC,0x75CE,0x75CF,0x75D7,0x75DC, + 0x75DF,0x75E0,0x75E1,0x75E4,0x75E7,0x75EC,0x75EE,0x75EF, + 0x75F1,0x75F9,0x7600,0x7602,0x7603,0x7604,0x7607,0x7608, + 0x760A,0x760C,0x760F,0x7612,0x7613,0x7615,0x7616,0x7619, + 0x761B,0x761C,0x761D,0x761E,0x7623,0x7625,0x7626,0x7629, + 0x762D,0x7632,0x7633,0x7635,0x7638,0x7639, + /* Range 0x4E21 - 0x4E7E, array index: 0x0CF0 */ + 0x763A,0x763C,0x764A,0x7640,0x7641,0x7643,0x7644,0x7645, + 0x7649,0x764B,0x7655,0x7659,0x765F,0x7664,0x7665,0x766D, + 0x766E,0x766F,0x7671,0x7674,0x7681,0x7685,0x768C,0x768D, + 0x7695,0x769B,0x769C,0x769D,0x769F,0x76A0,0x76A2,0x76A3, + 0x76A4,0x76A5,0x76A6,0x76A7,0x76A8,0x76AA,0x76AD,0x76BD, + 0x76C1,0x76C5,0x76C9,0x76CB,0x76CC,0x76CE,0x76D4,0x76D9, + 0x76E0,0x76E6,0x76E8,0x76EC,0x76F0,0x76F1,0x76F6,0x76F9, + 0x76FC,0x7700,0x7706,0x770A,0x770E,0x7712,0x7714,0x7715, + 0x7717,0x7719,0x771A,0x771C,0x7722,0x7728,0x772D,0x772E, + 0x772F,0x7734,0x7735,0x7736,0x7739,0x773D,0x773E,0x7742, + 0x7745,0x7746,0x774A,0x774D,0x774E,0x774F,0x7752,0x7756, + 0x7757,0x775C,0x775E,0x775F,0x7760,0x7762, + /* Range 0x4F21 - 0x4F7E, array index: 0x0D4E */ + 0x7764,0x7767,0x776A,0x776C,0x7770,0x7772,0x7773,0x7774, + 0x777A,0x777D,0x7780,0x7784,0x778C,0x778D,0x7794,0x7795, + 0x7796,0x779A,0x779F,0x77A2,0x77A7,0x77AA,0x77AE,0x77AF, + 0x77B1,0x77B5,0x77BE,0x77C3,0x77C9,0x77D1,0x77D2,0x77D5, + 0x77D9,0x77DE,0x77DF,0x77E0,0x77E4,0x77E6,0x77EA,0x77EC, + 0x77F0,0x77F1,0x77F4,0x77F8,0x77FB,0x7805,0x7806,0x7809, + 0x780D,0x780E,0x7811,0x781D,0x7821,0x7822,0x7823,0x782D, + 0x782E,0x7830,0x7835,0x7837,0x7843,0x7844,0x7847,0x7848, + 0x784C,0x784E,0x7852,0x785C,0x785E,0x7860,0x7861,0x7863, + 0x7864,0x7868,0x786A,0x786E,0x787A,0x787E,0x788A,0x788F, + 0x7894,0x7898,0x78A1,0x789D,0x789E,0x789F,0x78A4,0x78A8, + 0x78AC,0x78AD,0x78B0,0x78B1,0x78B2,0x78B3, + /* Range 0x5021 - 0x507E, array index: 0x0DAC */ + 0x78BB,0x78BD,0x78BF,0x78C7,0x78C8,0x78C9,0x78CC,0x78CE, + 0x78D2,0x78D3,0x78D5,0x78D6,0x78E4,0x78DB,0x78DF,0x78E0, + 0x78E1,0x78E6,0x78EA,0x78F2,0x78F3,0x7900,0x78F6,0x78F7, + 0x78FA,0x78FB,0x78FF,0x7906,0x790C,0x7910,0x791A,0x791C, + 0x791E,0x791F,0x7920,0x7925,0x7927,0x7929,0x792D,0x7931, + 0x7934,0x7935,0x793B,0x793D,0x793F,0x7944,0x7945,0x7946, + 0x794A,0x794B,0x794F,0x7951,0x7954,0x7958,0x795B,0x795C, + 0x7967,0x7969,0x796B,0x7972,0x7979,0x797B,0x797C,0x797E, + 0x798B,0x798C,0x7991,0x7993,0x7994,0x7995,0x7996,0x7998, + 0x799B,0x799C,0x79A1,0x79A8,0x79A9,0x79AB,0x79AF,0x79B1, + 0x79B4,0x79B8,0x79BB,0x79C2,0x79C4,0x79C7,0x79C8,0x79CA, + 0x79CF,0x79D4,0x79D6,0x79DA,0x79DD,0x79DE, + /* Range 0x5121 - 0x517E, array index: 0x0E0A */ + 0x79E0,0x79E2,0x79E5,0x79EA,0x79EB,0x79ED,0x79F1,0x79F8, + 0x79FC,0x7A02,0x7A03,0x7A07,0x7A09,0x7A0A,0x7A0C,0x7A11, + 0x7A15,0x7A1B,0x7A1E,0x7A21,0x7A27,0x7A2B,0x7A2D,0x7A2F, + 0x7A30,0x7A34,0x7A35,0x7A38,0x7A39,0x7A3A,0x7A44,0x7A45, + 0x7A47,0x7A48,0x7A4C,0x7A55,0x7A56,0x7A59,0x7A5C,0x7A5D, + 0x7A5F,0x7A60,0x7A65,0x7A67,0x7A6A,0x7A6D,0x7A75,0x7A78, + 0x7A7E,0x7A80,0x7A82,0x7A85,0x7A86,0x7A8A,0x7A8B,0x7A90, + 0x7A91,0x7A94,0x7A9E,0x7AA0,0x7AA3,0x7AAC,0x7AB3,0x7AB5, + 0x7AB9,0x7ABB,0x7ABC,0x7AC6,0x7AC9,0x7ACC,0x7ACE,0x7AD1, + 0x7ADB,0x7AE8,0x7AE9,0x7AEB,0x7AEC,0x7AF1,0x7AF4,0x7AFB, + 0x7AFD,0x7AFE,0x7B07,0x7B14,0x7B1F,0x7B23,0x7B27,0x7B29, + 0x7B2A,0x7B2B,0x7B2D,0x7B2E,0x7B2F,0x7B30, + /* Range 0x5221 - 0x527E, array index: 0x0E68 */ + 0x7B31,0x7B34,0x7B3D,0x7B3F,0x7B40,0x7B41,0x7B47,0x7B4E, + 0x7B55,0x7B60,0x7B64,0x7B66,0x7B69,0x7B6A,0x7B6D,0x7B6F, + 0x7B72,0x7B73,0x7B77,0x7B84,0x7B89,0x7B8E,0x7B90,0x7B91, + 0x7B96,0x7B9B,0x7B9E,0x7BA0,0x7BA5,0x7BAC,0x7BAF,0x7BB0, + 0x7BB2,0x7BB5,0x7BB6,0x7BBA,0x7BBB,0x7BBC,0x7BBD,0x7BC2, + 0x7BC5,0x7BC8,0x7BCA,0x7BD4,0x7BD6,0x7BD7,0x7BD9,0x7BDA, + 0x7BDB,0x7BE8,0x7BEA,0x7BF2,0x7BF4,0x7BF5,0x7BF8,0x7BF9, + 0x7BFA,0x7BFC,0x7BFE,0x7C01,0x7C02,0x7C03,0x7C04,0x7C06, + 0x7C09,0x7C0B,0x7C0C,0x7C0E,0x7C0F,0x7C19,0x7C1B,0x7C20, + 0x7C25,0x7C26,0x7C28,0x7C2C,0x7C31,0x7C33,0x7C34,0x7C36, + 0x7C39,0x7C3A,0x7C46,0x7C4A,0x7C55,0x7C51,0x7C52,0x7C53, + 0x7C59,0x7C5A,0x7C5B,0x7C5C,0x7C5D,0x7C5E, + /* Range 0x5321 - 0x537E, array index: 0x0EC6 */ + 0x7C61,0x7C63,0x7C67,0x7C69,0x7C6D,0x7C6E,0x7C70,0x7C72, + 0x7C79,0x7C7C,0x7C7D,0x7C86,0x7C87,0x7C8F,0x7C94,0x7C9E, + 0x7CA0,0x7CA6,0x7CB0,0x7CB6,0x7CB7,0x7CBA,0x7CBB,0x7CBC, + 0x7CBF,0x7CC4,0x7CC7,0x7CC8,0x7CC9,0x7CCD,0x7CCF,0x7CD3, + 0x7CD4,0x7CD5,0x7CD7,0x7CD9,0x7CDA,0x7CDD,0x7CE6,0x7CE9, + 0x7CEB,0x7CF5,0x7D03,0x7D07,0x7D08,0x7D09,0x7D0F,0x7D11, + 0x7D12,0x7D13,0x7D16,0x7D1D,0x7D1E,0x7D23,0x7D26,0x7D2A, + 0x7D2D,0x7D31,0x7D3C,0x7D3D,0x7D3E,0x7D40,0x7D41,0x7D47, + 0x7D48,0x7D4D,0x7D51,0x7D53,0x7D57,0x7D59,0x7D5A,0x7D5C, + 0x7D5D,0x7D65,0x7D67,0x7D6A,0x7D70,0x7D78,0x7D7A,0x7D7B, + 0x7D7F,0x7D81,0x7D82,0x7D83,0x7D85,0x7D86,0x7D88,0x7D8B, + 0x7D8C,0x7D8D,0x7D91,0x7D96,0x7D97,0x7D9D, + /* Range 0x5421 - 0x547E, array index: 0x0F24 */ + 0x7D9E,0x7DA6,0x7DA7,0x7DAA,0x7DB3,0x7DB6,0x7DB7,0x7DB9, + 0x7DC2,0x7DC3,0x7DC4,0x7DC5,0x7DC6,0x7DCC,0x7DCD,0x7DCE, + 0x7DD7,0x7DD9,0x7E00,0x7DE2,0x7DE5,0x7DE6,0x7DEA,0x7DEB, + 0x7DED,0x7DF1,0x7DF5,0x7DF6,0x7DF9,0x7DFA,0x7E08,0x7E10, + 0x7E11,0x7E15,0x7E17,0x7E1C,0x7E1D,0x7E20,0x7E27,0x7E28, + 0x7E2C,0x7E2D,0x7E2F,0x7E33,0x7E36,0x7E3F,0x7E44,0x7E45, + 0x7E47,0x7E4E,0x7E50,0x7E52,0x7E58,0x7E5F,0x7E61,0x7E62, + 0x7E65,0x7E6B,0x7E6E,0x7E6F,0x7E73,0x7E78,0x7E7E,0x7E81, + 0x7E86,0x7E87,0x7E8A,0x7E8D,0x7E91,0x7E95,0x7E98,0x7E9A, + 0x7E9D,0x7E9E,0x7F3C,0x7F3B,0x7F3D,0x7F3E,0x7F3F,0x7F43, + 0x7F44,0x7F47,0x7F4F,0x7F52,0x7F53,0x7F5B,0x7F5C,0x7F5D, + 0x7F61,0x7F63,0x7F64,0x7F65,0x7F66,0x7F6D, + /* Range 0x5521 - 0x557E, array index: 0x0F82 */ + 0x7F71,0x7F7D,0x7F7E,0x7F7F,0x7F80,0x7F8B,0x7F8D,0x7F8F, + 0x7F90,0x7F91,0x7F96,0x7F97,0x7F9C,0x7FA1,0x7FA2,0x7FA6, + 0x7FAA,0x7FAD,0x7FB4,0x7FBC,0x7FBF,0x7FC0,0x7FC3,0x7FC8, + 0x7FCE,0x7FCF,0x7FDB,0x7FDF,0x7FE3,0x7FE5,0x7FE8,0x7FEC, + 0x7FEE,0x7FEF,0x7FF2,0x7FFA,0x7FFD,0x7FFE,0x7FFF,0x8007, + 0x8008,0x800A,0x800D,0x800E,0x800F,0x8011,0x8013,0x8014, + 0x8016,0x801D,0x801E,0x801F,0x8020,0x8024,0x8026,0x802C, + 0x802E,0x8030,0x8034,0x8035,0x8037,0x8039,0x803A,0x803C, + 0x803E,0x8040,0x8044,0x8060,0x8064,0x8066,0x806D,0x8071, + 0x8075,0x8081,0x8088,0x808E,0x809C,0x809E,0x80A6,0x80A7, + 0x80AB,0x80B8,0x80B9,0x80C8,0x80CD,0x80CF,0x80D2,0x80D4, + 0x80D5,0x80D7,0x80D8,0x80E0,0x80ED,0x80EE, + /* Range 0x5621 - 0x567E, array index: 0x0FE0 */ + 0x80F0,0x80F2,0x80F3,0x80F6,0x80F9,0x80FA,0x80FE,0x8103, + 0x810B,0x8116,0x8117,0x8118,0x811C,0x811E,0x8120,0x8124, + 0x8127,0x812C,0x8130,0x8135,0x813A,0x813C,0x8145,0x8147, + 0x814A,0x814C,0x8152,0x8157,0x8160,0x8161,0x8167,0x8168, + 0x8169,0x816D,0x816F,0x8177,0x8181,0x8190,0x8184,0x8185, + 0x8186,0x818B,0x818E,0x8196,0x8198,0x819B,0x819E,0x81A2, + 0x81AE,0x81B2,0x81B4,0x81BB,0x81CB,0x81C3,0x81C5,0x81CA, + 0x81CE,0x81CF,0x81D5,0x81D7,0x81DB,0x81DD,0x81DE,0x81E1, + 0x81E4,0x81EB,0x81EC,0x81F0,0x81F1,0x81F2,0x81F5,0x81F6, + 0x81F8,0x81F9,0x81FD,0x81FF,0x8200,0x8203,0x820F,0x8213, + 0x8214,0x8219,0x821A,0x821D,0x8221,0x8222,0x8228,0x8232, + 0x8234,0x823A,0x8243,0x8244,0x8245,0x8246, + /* Range 0x5721 - 0x577E, array index: 0x103E */ + 0x824B,0x824E,0x824F,0x8251,0x8256,0x825C,0x8260,0x8263, + 0x8267,0x826D,0x8274,0x827B,0x827D,0x827F,0x8280,0x8281, + 0x8283,0x8284,0x8287,0x8289,0x828A,0x828E,0x8291,0x8294, + 0x8296,0x8298,0x829A,0x829B,0x82A0,0x82A1,0x82A3,0x82A4, + 0x82A7,0x82A8,0x82A9,0x82AA,0x82AE,0x82B0,0x82B2,0x82B4, + 0x82B7,0x82BA,0x82BC,0x82BE,0x82BF,0x82C6,0x82D0,0x82D5, + 0x82DA,0x82E0,0x82E2,0x82E4,0x82E8,0x82EA,0x82ED,0x82EF, + 0x82F6,0x82F7,0x82FD,0x82FE,0x8300,0x8301,0x8307,0x8308, + 0x830A,0x830B,0x8354,0x831B,0x831D,0x831E,0x831F,0x8321, + 0x8322,0x832C,0x832D,0x832E,0x8330,0x8333,0x8337,0x833A, + 0x833C,0x833D,0x8342,0x8343,0x8344,0x8347,0x834D,0x834E, + 0x8351,0x8355,0x8356,0x8357,0x8370,0x8378, + /* Range 0x5821 - 0x587E, array index: 0x109C */ + 0x837D,0x837F,0x8380,0x8382,0x8384,0x8386,0x838D,0x8392, + 0x8394,0x8395,0x8398,0x8399,0x839B,0x839C,0x839D,0x83A6, + 0x83A7,0x83A9,0x83AC,0x83BE,0x83BF,0x83C0,0x83C7,0x83C9, + 0x83CF,0x83D0,0x83D1,0x83D4,0x83DD,0x8353,0x83E8,0x83EA, + 0x83F6,0x83F8,0x83F9,0x83FC,0x8401,0x8406,0x840A,0x840F, + 0x8411,0x8415,0x8419,0x83AD,0x842F,0x8439,0x8445,0x8447, + 0x8448,0x844A,0x844D,0x844F,0x8451,0x8452,0x8456,0x8458, + 0x8459,0x845A,0x845C,0x8460,0x8464,0x8465,0x8467,0x846A, + 0x8470,0x8473,0x8474,0x8476,0x8478,0x847C,0x847D,0x8481, + 0x8485,0x8492,0x8493,0x8495,0x849E,0x84A6,0x84A8,0x84A9, + 0x84AA,0x84AF,0x84B1,0x84B4,0x84BA,0x84BD,0x84BE,0x84C0, + 0x84C2,0x84C7,0x84C8,0x84CC,0x84CF,0x84D3, + /* Range 0x5921 - 0x597E, array index: 0x10FA */ + 0x84DC,0x84E7,0x84EA,0x84EF,0x84F0,0x84F1,0x84F2,0x84F7, + 0x8532,0x84FA,0x84FB,0x84FD,0x8502,0x8503,0x8507,0x850C, + 0x850E,0x8510,0x851C,0x851E,0x8522,0x8523,0x8524,0x8525, + 0x8527,0x852A,0x852B,0x852F,0x8533,0x8534,0x8536,0x853F, + 0x8546,0x854F,0x8550,0x8551,0x8552,0x8553,0x8556,0x8559, + 0x855C,0x855D,0x855E,0x855F,0x8560,0x8561,0x8562,0x8564, + 0x856B,0x856F,0x8579,0x857A,0x857B,0x857D,0x857F,0x8581, + 0x8585,0x8586,0x8589,0x858B,0x858C,0x858F,0x8593,0x8598, + 0x859D,0x859F,0x85A0,0x85A2,0x85A5,0x85A7,0x85B4,0x85B6, + 0x85B7,0x85B8,0x85BC,0x85BD,0x85BE,0x85BF,0x85C2,0x85C7, + 0x85CA,0x85CB,0x85CE,0x85AD,0x85D8,0x85DA,0x85DF,0x85E0, + 0x85E6,0x85E8,0x85ED,0x85F3,0x85F6,0x85FC, + /* Range 0x5A21 - 0x5A7E, array index: 0x1158 */ + 0x85FF,0x8600,0x8604,0x8605,0x860D,0x860E,0x8610,0x8611, + 0x8612,0x8618,0x8619,0x861B,0x861E,0x8621,0x8627,0x8629, + 0x8636,0x8638,0x863A,0x863C,0x863D,0x8640,0x8642,0x8646, + 0x8652,0x8653,0x8656,0x8657,0x8658,0x8659,0x865D,0x8660, + 0x8661,0x8662,0x8663,0x8664,0x8669,0x866C,0x866F,0x8675, + 0x8676,0x8677,0x867A,0x868D,0x8691,0x8696,0x8698,0x869A, + 0x869C,0x86A1,0x86A6,0x86A7,0x86A8,0x86AD,0x86B1,0x86B3, + 0x86B4,0x86B5,0x86B7,0x86B8,0x86B9,0x86BF,0x86C0,0x86C1, + 0x86C3,0x86C5,0x86D1,0x86D2,0x86D5,0x86D7,0x86DA,0x86DC, + 0x86E0,0x86E3,0x86E5,0x86E7,0x8688,0x86FA,0x86FC,0x86FD, + 0x8704,0x8705,0x8707,0x870B,0x870E,0x870F,0x8710,0x8713, + 0x8714,0x8719,0x871E,0x871F,0x8721,0x8723, + /* Range 0x5B21 - 0x5B7E, array index: 0x11B6 */ + 0x8728,0x872E,0x872F,0x8731,0x8732,0x8739,0x873A,0x873C, + 0x873D,0x873E,0x8740,0x8743,0x8745,0x874D,0x8758,0x875D, + 0x8761,0x8764,0x8765,0x876F,0x8771,0x8772,0x877B,0x8783, + 0x8784,0x8785,0x8786,0x8787,0x8788,0x8789,0x878B,0x878C, + 0x8790,0x8793,0x8795,0x8797,0x8798,0x8799,0x879E,0x87A0, + 0x87A3,0x87A7,0x87AC,0x87AD,0x87AE,0x87B1,0x87B5,0x87BE, + 0x87BF,0x87C1,0x87C8,0x87C9,0x87CA,0x87CE,0x87D5,0x87D6, + 0x87D9,0x87DA,0x87DC,0x87DF,0x87E2,0x87E3,0x87E4,0x87EA, + 0x87EB,0x87ED,0x87F1,0x87F3,0x87F8,0x87FA,0x87FF,0x8801, + 0x8803,0x8806,0x8809,0x880A,0x880B,0x8810,0x8819,0x8812, + 0x8813,0x8814,0x8818,0x881A,0x881B,0x881C,0x881E,0x881F, + 0x8828,0x882D,0x882E,0x8830,0x8832,0x8835, + /* Range 0x5C21 - 0x5C7E, array index: 0x1214 */ + 0x883A,0x883C,0x8841,0x8843,0x8845,0x8848,0x8849,0x884A, + 0x884B,0x884E,0x8851,0x8855,0x8856,0x8858,0x885A,0x885C, + 0x885F,0x8860,0x8864,0x8869,0x8871,0x8879,0x887B,0x8880, + 0x8898,0x889A,0x889B,0x889C,0x889F,0x88A0,0x88A8,0x88AA, + 0x88BA,0x88BD,0x88BE,0x88C0,0x88CA,0x88CB,0x88CC,0x88CD, + 0x88CE,0x88D1,0x88D2,0x88D3,0x88DB,0x88DE,0x88E7,0x88EF, + 0x88F0,0x88F1,0x88F5,0x88F7,0x8901,0x8906,0x890D,0x890E, + 0x890F,0x8915,0x8916,0x8918,0x8919,0x891A,0x891C,0x8920, + 0x8926,0x8927,0x8928,0x8930,0x8931,0x8932,0x8935,0x8939, + 0x893A,0x893E,0x8940,0x8942,0x8945,0x8946,0x8949,0x894F, + 0x8952,0x8957,0x895A,0x895B,0x895C,0x8961,0x8962,0x8963, + 0x896B,0x896E,0x8970,0x8973,0x8975,0x897A, + /* Range 0x5D21 - 0x5D7E, array index: 0x1272 */ + 0x897B,0x897C,0x897D,0x8989,0x898D,0x8990,0x8994,0x8995, + 0x899B,0x899C,0x899F,0x89A0,0x89A5,0x89B0,0x89B4,0x89B5, + 0x89B6,0x89B7,0x89BC,0x89D4,0x89D5,0x89D6,0x89D7,0x89D8, + 0x89E5,0x89E9,0x89EB,0x89ED,0x89F1,0x89F3,0x89F6,0x89F9, + 0x89FD,0x89FF,0x8A04,0x8A05,0x8A07,0x8A0F,0x8A11,0x8A12, + 0x8A14,0x8A15,0x8A1E,0x8A20,0x8A22,0x8A24,0x8A26,0x8A2B, + 0x8A2C,0x8A2F,0x8A35,0x8A37,0x8A3D,0x8A3E,0x8A40,0x8A43, + 0x8A45,0x8A47,0x8A49,0x8A4D,0x8A4E,0x8A53,0x8A56,0x8A57, + 0x8A58,0x8A5C,0x8A5D,0x8A61,0x8A65,0x8A67,0x8A75,0x8A76, + 0x8A77,0x8A79,0x8A7A,0x8A7B,0x8A7E,0x8A7F,0x8A80,0x8A83, + 0x8A86,0x8A8B,0x8A8F,0x8A90,0x8A92,0x8A96,0x8A97,0x8A99, + 0x8A9F,0x8AA7,0x8AA9,0x8AAE,0x8AAF,0x8AB3, + /* Range 0x5E21 - 0x5E7E, array index: 0x12D0 */ + 0x8AB6,0x8AB7,0x8ABB,0x8ABE,0x8AC3,0x8AC6,0x8AC8,0x8AC9, + 0x8ACA,0x8AD1,0x8AD3,0x8AD4,0x8AD5,0x8AD7,0x8ADD,0x8ADF, + 0x8AEC,0x8AF0,0x8AF4,0x8AF5,0x8AF6,0x8AFC,0x8AFF,0x8B05, + 0x8B06,0x8B0B,0x8B11,0x8B1C,0x8B1E,0x8B1F,0x8B0A,0x8B2D, + 0x8B30,0x8B37,0x8B3C,0x8B42,0x8B43,0x8B44,0x8B45,0x8B46, + 0x8B48,0x8B52,0x8B53,0x8B54,0x8B59,0x8B4D,0x8B5E,0x8B63, + 0x8B6D,0x8B76,0x8B78,0x8B79,0x8B7C,0x8B7E,0x8B81,0x8B84, + 0x8B85,0x8B8B,0x8B8D,0x8B8F,0x8B94,0x8B95,0x8B9C,0x8B9E, + 0x8B9F,0x8C38,0x8C39,0x8C3D,0x8C3E,0x8C45,0x8C47,0x8C49, + 0x8C4B,0x8C4F,0x8C51,0x8C53,0x8C54,0x8C57,0x8C58,0x8C5B, + 0x8C5D,0x8C59,0x8C63,0x8C64,0x8C66,0x8C68,0x8C69,0x8C6D, + 0x8C73,0x8C75,0x8C76,0x8C7B,0x8C7E,0x8C86, + /* Range 0x5F21 - 0x5F7E, array index: 0x132E */ + 0x8C87,0x8C8B,0x8C90,0x8C92,0x8C93,0x8C99,0x8C9B,0x8C9C, + 0x8CA4,0x8CB9,0x8CBA,0x8CC5,0x8CC6,0x8CC9,0x8CCB,0x8CCF, + 0x8CD6,0x8CD5,0x8CD9,0x8CDD,0x8CE1,0x8CE8,0x8CEC,0x8CEF, + 0x8CF0,0x8CF2,0x8CF5,0x8CF7,0x8CF8,0x8CFE,0x8CFF,0x8D01, + 0x8D03,0x8D09,0x8D12,0x8D17,0x8D1B,0x8D65,0x8D69,0x8D6C, + 0x8D6E,0x8D7F,0x8D82,0x8D84,0x8D88,0x8D8D,0x8D90,0x8D91, + 0x8D95,0x8D9E,0x8D9F,0x8DA0,0x8DA6,0x8DAB,0x8DAC,0x8DAF, + 0x8DB2,0x8DB5,0x8DB7,0x8DB9,0x8DBB,0x8DC0,0x8DC5,0x8DC6, + 0x8DC7,0x8DC8,0x8DCA,0x8DCE,0x8DD1,0x8DD4,0x8DD5,0x8DD7, + 0x8DD9,0x8DE4,0x8DE5,0x8DE7,0x8DEC,0x8DF0,0x8DBC,0x8DF1, + 0x8DF2,0x8DF4,0x8DFD,0x8E01,0x8E04,0x8E05,0x8E06,0x8E0B, + 0x8E11,0x8E14,0x8E16,0x8E20,0x8E21,0x8E22, + /* Range 0x6021 - 0x607E, array index: 0x138C */ + 0x8E23,0x8E26,0x8E27,0x8E31,0x8E33,0x8E36,0x8E37,0x8E38, + 0x8E39,0x8E3D,0x8E40,0x8E41,0x8E4B,0x8E4D,0x8E4E,0x8E4F, + 0x8E54,0x8E5B,0x8E5C,0x8E5D,0x8E5E,0x8E61,0x8E62,0x8E69, + 0x8E6C,0x8E6D,0x8E6F,0x8E70,0x8E71,0x8E79,0x8E7A,0x8E7B, + 0x8E82,0x8E83,0x8E89,0x8E90,0x8E92,0x8E95,0x8E9A,0x8E9B, + 0x8E9D,0x8E9E,0x8EA2,0x8EA7,0x8EA9,0x8EAD,0x8EAE,0x8EB3, + 0x8EB5,0x8EBA,0x8EBB,0x8EC0,0x8EC1,0x8EC3,0x8EC4,0x8EC7, + 0x8ECF,0x8ED1,0x8ED4,0x8EDC,0x8EE8,0x8EEE,0x8EF0,0x8EF1, + 0x8EF7,0x8EF9,0x8EFA,0x8EED,0x8F00,0x8F02,0x8F07,0x8F08, + 0x8F0F,0x8F10,0x8F16,0x8F17,0x8F18,0x8F1E,0x8F20,0x8F21, + 0x8F23,0x8F25,0x8F27,0x8F28,0x8F2C,0x8F2D,0x8F2E,0x8F34, + 0x8F35,0x8F36,0x8F37,0x8F3A,0x8F40,0x8F41, + /* Range 0x6121 - 0x617E, array index: 0x13EA */ + 0x8F43,0x8F47,0x8F4F,0x8F51,0x8F52,0x8F53,0x8F54,0x8F55, + 0x8F58,0x8F5D,0x8F5E,0x8F65,0x8F9D,0x8FA0,0x8FA1,0x8FA4, + 0x8FA5,0x8FA6,0x8FB5,0x8FB6,0x8FB8,0x8FBE,0x8FC0,0x8FC1, + 0x8FC6,0x8FCA,0x8FCB,0x8FCD,0x8FD0,0x8FD2,0x8FD3,0x8FD5, + 0x8FE0,0x8FE3,0x8FE4,0x8FE8,0x8FEE,0x8FF1,0x8FF5,0x8FF6, + 0x8FFB,0x8FFE,0x9002,0x9004,0x9008,0x900C,0x9018,0x901B, + 0x9028,0x9029,0x902F,0x902A,0x902C,0x902D,0x9033,0x9034, + 0x9037,0x903F,0x9043,0x9044,0x904C,0x905B,0x905D,0x9062, + 0x9066,0x9067,0x906C,0x9070,0x9074,0x9079,0x9085,0x9088, + 0x908B,0x908C,0x908E,0x9090,0x9095,0x9097,0x9098,0x9099, + 0x909B,0x90A0,0x90A1,0x90A2,0x90A5,0x90B0,0x90B2,0x90B3, + 0x90B4,0x90B6,0x90BD,0x90CC,0x90BE,0x90C3, + /* Range 0x6221 - 0x627E, array index: 0x1448 */ + 0x90C4,0x90C5,0x90C7,0x90C8,0x90D5,0x90D7,0x90D8,0x90D9, + 0x90DC,0x90DD,0x90DF,0x90E5,0x90D2,0x90F6,0x90EB,0x90EF, + 0x90F0,0x90F4,0x90FE,0x90FF,0x9100,0x9104,0x9105,0x9106, + 0x9108,0x910D,0x9110,0x9114,0x9116,0x9117,0x9118,0x911A, + 0x911C,0x911E,0x9120,0x9125,0x9122,0x9123,0x9127,0x9129, + 0x912E,0x912F,0x9131,0x9134,0x9136,0x9137,0x9139,0x913A, + 0x913C,0x913D,0x9143,0x9147,0x9148,0x914F,0x9153,0x9157, + 0x9159,0x915A,0x915B,0x9161,0x9164,0x9167,0x916D,0x9174, + 0x9179,0x917A,0x917B,0x9181,0x9183,0x9185,0x9186,0x918A, + 0x918E,0x9191,0x9193,0x9194,0x9195,0x9198,0x919E,0x91A1, + 0x91A6,0x91A8,0x91AC,0x91AD,0x91AE,0x91B0,0x91B1,0x91B2, + 0x91B3,0x91B6,0x91BB,0x91BC,0x91BD,0x91BF, + /* Range 0x6321 - 0x637E, array index: 0x14A6 */ + 0x91C2,0x91C3,0x91C5,0x91D3,0x91D4,0x91D7,0x91D9,0x91DA, + 0x91DE,0x91E4,0x91E5,0x91E9,0x91EA,0x91EC,0x91ED,0x91EE, + 0x91EF,0x91F0,0x91F1,0x91F7,0x91F9,0x91FB,0x91FD,0x9200, + 0x9201,0x9204,0x9205,0x9206,0x9207,0x9209,0x920A,0x920C, + 0x9210,0x9212,0x9213,0x9216,0x9218,0x921C,0x921D,0x9223, + 0x9224,0x9225,0x9226,0x9228,0x922E,0x922F,0x9230,0x9233, + 0x9235,0x9236,0x9238,0x9239,0x923A,0x923C,0x923E,0x9240, + 0x9242,0x9243,0x9246,0x9247,0x924A,0x924D,0x924E,0x924F, + 0x9251,0x9258,0x9259,0x925C,0x925D,0x9260,0x9261,0x9265, + 0x9267,0x9268,0x9269,0x926E,0x926F,0x9270,0x9275,0x9276, + 0x9277,0x9278,0x9279,0x927B,0x927C,0x927D,0x927F,0x9288, + 0x9289,0x928A,0x928D,0x928E,0x9292,0x9297, + /* Range 0x6421 - 0x647E, array index: 0x1504 */ + 0x9299,0x929F,0x92A0,0x92A4,0x92A5,0x92A7,0x92A8,0x92AB, + 0x92AF,0x92B2,0x92B6,0x92B8,0x92BA,0x92BB,0x92BC,0x92BD, + 0x92BF,0x92C0,0x92C1,0x92C2,0x92C3,0x92C5,0x92C6,0x92C7, + 0x92C8,0x92CB,0x92CC,0x92CD,0x92CE,0x92D0,0x92D3,0x92D5, + 0x92D7,0x92D8,0x92D9,0x92DC,0x92DD,0x92DF,0x92E0,0x92E1, + 0x92E3,0x92E5,0x92E7,0x92E8,0x92EC,0x92EE,0x92F0,0x92F9, + 0x92FB,0x92FF,0x9300,0x9302,0x9308,0x930D,0x9311,0x9314, + 0x9315,0x931C,0x931D,0x931E,0x931F,0x9321,0x9324,0x9325, + 0x9327,0x9329,0x932A,0x9333,0x9334,0x9336,0x9337,0x9347, + 0x9348,0x9349,0x9350,0x9351,0x9352,0x9355,0x9357,0x9358, + 0x935A,0x935E,0x9364,0x9365,0x9367,0x9369,0x936A,0x936D, + 0x936F,0x9370,0x9371,0x9373,0x9374,0x9376, + /* Range 0x6521 - 0x657E, array index: 0x1562 */ + 0x937A,0x937D,0x937F,0x9380,0x9381,0x9382,0x9388,0x938A, + 0x938B,0x938D,0x938F,0x9392,0x9395,0x9398,0x939B,0x939E, + 0x93A1,0x93A3,0x93A4,0x93A6,0x93A8,0x93AB,0x93B4,0x93B5, + 0x93B6,0x93BA,0x93A9,0x93C1,0x93C4,0x93C5,0x93C6,0x93C7, + 0x93C9,0x93CA,0x93CB,0x93CC,0x93CD,0x93D3,0x93D9,0x93DC, + 0x93DE,0x93DF,0x93E2,0x93E6,0x93E7,0x93F9,0x93F7,0x93F8, + 0x93FA,0x93FB,0x93FD,0x9401,0x9402,0x9404,0x9408,0x9409, + 0x940D,0x940E,0x940F,0x9415,0x9416,0x9417,0x941F,0x942E, + 0x942F,0x9431,0x9432,0x9433,0x9434,0x943B,0x943F,0x943D, + 0x9443,0x9445,0x9448,0x944A,0x944C,0x9455,0x9459,0x945C, + 0x945F,0x9461,0x9463,0x9468,0x946B,0x946D,0x946E,0x946F, + 0x9471,0x9472,0x9484,0x9483,0x9578,0x9579, + /* Range 0x6621 - 0x667E, array index: 0x15C0 */ + 0x957E,0x9584,0x9588,0x958C,0x958D,0x958E,0x959D,0x959E, + 0x959F,0x95A1,0x95A6,0x95A9,0x95AB,0x95AC,0x95B4,0x95B6, + 0x95BA,0x95BD,0x95BF,0x95C6,0x95C8,0x95C9,0x95CB,0x95D0, + 0x95D1,0x95D2,0x95D3,0x95D9,0x95DA,0x95DD,0x95DE,0x95DF, + 0x95E0,0x95E4,0x95E6,0x961D,0x961E,0x9622,0x9624,0x9625, + 0x9626,0x962C,0x9631,0x9633,0x9637,0x9638,0x9639,0x963A, + 0x963C,0x963D,0x9641,0x9652,0x9654,0x9656,0x9657,0x9658, + 0x9661,0x966E,0x9674,0x967B,0x967C,0x967E,0x967F,0x9681, + 0x9682,0x9683,0x9684,0x9689,0x9691,0x9696,0x969A,0x969D, + 0x969F,0x96A4,0x96A5,0x96A6,0x96A9,0x96AE,0x96AF,0x96B3, + 0x96BA,0x96CA,0x96D2,0x5DB2,0x96D8,0x96DA,0x96DD,0x96DE, + 0x96DF,0x96E9,0x96EF,0x96F1,0x96FA,0x9702, + /* Range 0x6721 - 0x677E, array index: 0x161E */ + 0x9703,0x9705,0x9709,0x971A,0x971B,0x971D,0x9721,0x9722, + 0x9723,0x9728,0x9731,0x9733,0x9741,0x9743,0x974A,0x974E, + 0x974F,0x9755,0x9757,0x9758,0x975A,0x975B,0x9763,0x9767, + 0x976A,0x976E,0x9773,0x9776,0x9777,0x9778,0x977B,0x977D, + 0x977F,0x9780,0x9789,0x9795,0x9796,0x9797,0x9799,0x979A, + 0x979E,0x979F,0x97A2,0x97AC,0x97AE,0x97B1,0x97B2,0x97B5, + 0x97B6,0x97B8,0x97B9,0x97BA,0x97BC,0x97BE,0x97BF,0x97C1, + 0x97C4,0x97C5,0x97C7,0x97C9,0x97CA,0x97CC,0x97CD,0x97CE, + 0x97D0,0x97D1,0x97D4,0x97D7,0x97D8,0x97D9,0x97DD,0x97DE, + 0x97E0,0x97DB,0x97E1,0x97E4,0x97EF,0x97F1,0x97F4,0x97F7, + 0x97F8,0x97FA,0x9807,0x980A,0x9819,0x980D,0x980E,0x9814, + 0x9816,0x981C,0x981E,0x9820,0x9823,0x9826, + /* Range 0x6821 - 0x687E, array index: 0x167C */ + 0x982B,0x982E,0x982F,0x9830,0x9832,0x9833,0x9835,0x9825, + 0x983E,0x9844,0x9847,0x984A,0x9851,0x9852,0x9853,0x9856, + 0x9857,0x9859,0x985A,0x9862,0x9863,0x9865,0x9866,0x986A, + 0x986C,0x98AB,0x98AD,0x98AE,0x98B0,0x98B4,0x98B7,0x98B8, + 0x98BA,0x98BB,0x98BF,0x98C2,0x98C5,0x98C8,0x98CC,0x98E1, + 0x98E3,0x98E5,0x98E6,0x98E7,0x98EA,0x98F3,0x98F6,0x9902, + 0x9907,0x9908,0x9911,0x9915,0x9916,0x9917,0x991A,0x991B, + 0x991C,0x991F,0x9922,0x9926,0x9927,0x992B,0x9931,0x9932, + 0x9933,0x9934,0x9935,0x9939,0x993A,0x993B,0x993C,0x9940, + 0x9941,0x9946,0x9947,0x9948,0x994D,0x994E,0x9954,0x9958, + 0x9959,0x995B,0x995C,0x995E,0x995F,0x9960,0x999B,0x999D, + 0x999F,0x99A6,0x99B0,0x99B1,0x99B2,0x99B5, + /* Range 0x6921 - 0x697E, array index: 0x16DA */ + 0x99B9,0x99BA,0x99BD,0x99BF,0x99C3,0x99C9,0x99D3,0x99D4, + 0x99D9,0x99DA,0x99DC,0x99DE,0x99E7,0x99EA,0x99EB,0x99EC, + 0x99F0,0x99F4,0x99F5,0x99F9,0x99FD,0x99FE,0x9A02,0x9A03, + 0x9A04,0x9A0B,0x9A0C,0x9A10,0x9A11,0x9A16,0x9A1E,0x9A20, + 0x9A22,0x9A23,0x9A24,0x9A27,0x9A2D,0x9A2E,0x9A33,0x9A35, + 0x9A36,0x9A38,0x9A47,0x9A41,0x9A44,0x9A4A,0x9A4B,0x9A4C, + 0x9A4E,0x9A51,0x9A54,0x9A56,0x9A5D,0x9AAA,0x9AAC,0x9AAE, + 0x9AAF,0x9AB2,0x9AB4,0x9AB5,0x9AB6,0x9AB9,0x9ABB,0x9ABE, + 0x9ABF,0x9AC1,0x9AC3,0x9AC6,0x9AC8,0x9ACE,0x9AD0,0x9AD2, + 0x9AD5,0x9AD6,0x9AD7,0x9ADB,0x9ADC,0x9AE0,0x9AE4,0x9AE5, + 0x9AE7,0x9AE9,0x9AEC,0x9AF2,0x9AF3,0x9AF5,0x9AF9,0x9AFA, + 0x9AFD,0x9AFF,0x9B00,0x9B01,0x9B02,0x9B03, + /* Range 0x6A21 - 0x6A7E, array index: 0x1738 */ + 0x9B04,0x9B05,0x9B08,0x9B09,0x9B0B,0x9B0C,0x9B0D,0x9B0E, + 0x9B10,0x9B12,0x9B16,0x9B19,0x9B1B,0x9B1C,0x9B20,0x9B26, + 0x9B2B,0x9B2D,0x9B33,0x9B34,0x9B35,0x9B37,0x9B39,0x9B3A, + 0x9B3D,0x9B48,0x9B4B,0x9B4C,0x9B55,0x9B56,0x9B57,0x9B5B, + 0x9B5E,0x9B61,0x9B63,0x9B65,0x9B66,0x9B68,0x9B6A,0x9B6B, + 0x9B6C,0x9B6D,0x9B6E,0x9B73,0x9B75,0x9B77,0x9B78,0x9B79, + 0x9B7F,0x9B80,0x9B84,0x9B85,0x9B86,0x9B87,0x9B89,0x9B8A, + 0x9B8B,0x9B8D,0x9B8F,0x9B90,0x9B94,0x9B9A,0x9B9D,0x9B9E, + 0x9BA6,0x9BA7,0x9BA9,0x9BAC,0x9BB0,0x9BB1,0x9BB2,0x9BB7, + 0x9BB8,0x9BBB,0x9BBC,0x9BBE,0x9BBF,0x9BC1,0x9BC7,0x9BC8, + 0x9BCE,0x9BD0,0x9BD7,0x9BD8,0x9BDD,0x9BDF,0x9BE5,0x9BE7, + 0x9BEA,0x9BEB,0x9BEF,0x9BF3,0x9BF7,0x9BF8, + /* Range 0x6B21 - 0x6B7E, array index: 0x1796 */ + 0x9BF9,0x9BFA,0x9BFD,0x9BFF,0x9C00,0x9C02,0x9C0B,0x9C0F, + 0x9C11,0x9C16,0x9C18,0x9C19,0x9C1A,0x9C1C,0x9C1E,0x9C22, + 0x9C23,0x9C26,0x9C27,0x9C28,0x9C29,0x9C2A,0x9C31,0x9C35, + 0x9C36,0x9C37,0x9C3D,0x9C41,0x9C43,0x9C44,0x9C45,0x9C49, + 0x9C4A,0x9C4E,0x9C4F,0x9C50,0x9C53,0x9C54,0x9C56,0x9C58, + 0x9C5B,0x9C5D,0x9C5E,0x9C5F,0x9C63,0x9C69,0x9C6A,0x9C5C, + 0x9C6B,0x9C68,0x9C6E,0x9C70,0x9C72,0x9C75,0x9C77,0x9C7B, + 0x9CE6,0x9CF2,0x9CF7,0x9CF9,0x9D0B,0x9D02,0x9D11,0x9D17, + 0x9D18,0x9D1C,0x9D1D,0x9D1E,0x9D2F,0x9D30,0x9D32,0x9D33, + 0x9D34,0x9D3A,0x9D3C,0x9D45,0x9D3D,0x9D42,0x9D43,0x9D47, + 0x9D4A,0x9D53,0x9D54,0x9D5F,0x9D63,0x9D62,0x9D65,0x9D69, + 0x9D6A,0x9D6B,0x9D70,0x9D76,0x9D77,0x9D7B, + /* Range 0x6C21 - 0x6C7E, array index: 0x17F4 */ + 0x9D7C,0x9D7E,0x9D83,0x9D84,0x9D86,0x9D8A,0x9D8D,0x9D8E, + 0x9D92,0x9D93,0x9D95,0x9D96,0x9D97,0x9D98,0x9DA1,0x9DAA, + 0x9DAC,0x9DAE,0x9DB1,0x9DB5,0x9DB9,0x9DBC,0x9DBF,0x9DC3, + 0x9DC7,0x9DC9,0x9DCA,0x9DD4,0x9DD5,0x9DD6,0x9DD7,0x9DDA, + 0x9DDE,0x9DDF,0x9DE0,0x9DE5,0x9DE7,0x9DE9,0x9DEB,0x9DEE, + 0x9DF0,0x9DF3,0x9DF4,0x9DFE,0x9E0A,0x9E02,0x9E07,0x9E0E, + 0x9E10,0x9E11,0x9E12,0x9E15,0x9E16,0x9E19,0x9E1C,0x9E1D, + 0x9E7A,0x9E7B,0x9E7C,0x9E80,0x9E82,0x9E83,0x9E84,0x9E85, + 0x9E87,0x9E8E,0x9E8F,0x9E96,0x9E98,0x9E9B,0x9E9E,0x9EA4, + 0x9EA8,0x9EAC,0x9EAE,0x9EAF,0x9EB0,0x9EB3,0x9EB4,0x9EB5, + 0x9EC6,0x9EC8,0x9ECB,0x9ED5,0x9EDF,0x9EE4,0x9EE7,0x9EEC, + 0x9EED,0x9EEE,0x9EF0,0x9EF1,0x9EF2,0x9EF5, + /* Range 0x6D21 - 0x6D63, array index: 0x1852 */ + 0x9EF8,0x9EFF,0x9F02,0x9F03,0x9F09,0x9F0F,0x9F10,0x9F11, + 0x9F12,0x9F14,0x9F16,0x9F17,0x9F19,0x9F1A,0x9F1B,0x9F1F, + 0x9F22,0x9F26,0x9F2A,0x9F2B,0x9F2F,0x9F31,0x9F32,0x9F34, + 0x9F37,0x9F39,0x9F3A,0x9F3C,0x9F3D,0x9F3F,0x9F41,0x9F43, + 0x9F44,0x9F45,0x9F46,0x9F47,0x9F53,0x9F55,0x9F56,0x9F57, + 0x9F58,0x9F5A,0x9F5D,0x9F5E,0x9F68,0x9F69,0x9F6D,0x9F6E, + 0x9F6F,0x9F70,0x9F71,0x9F73,0x9F75,0x9F7A,0x9F7D,0x9F8F, + 0x9F90,0x9F91,0x9F92,0x9F94,0x9F96,0x9F97,0x9F9E,0x9FA1, + 0x9FA2,0x9FA3,0x9FA5, + /* Unranged codes (73 codes) */ + /* Array index: 0x1895 */ 0x2921,0x00C6, + /* Array index: 0x1895 */ 0x2922,0x0110, + /* Array index: 0x1895 */ 0x2924,0x0126, + /* Array index: 0x1895 */ 0x2926,0x0132, +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0212_1990 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> jis_x0212_1990 speed-optimized table (45568 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_jis_x0212_1990[] = +{ + /* Heading Block */ + 0x0100,0x0200,0x0300,0x0400,0x0500,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0600,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x0700,0x0800, + 0x0900,0x0A00,0x0B00,0x0C00,0x0D00,0x0E00,0x0F00,0x1000, + 0x1100,0x1200,0x1300,0x1400,0x1500,0x1600,0x1700,0x1800, + 0x1900,0x1A00,0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,0x2000, + 0x2100,0x2200,0x2300,0x2400,0x2500,0x2600,0x2700,0x2800, + 0x2900,0x2A00,0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000, + 0x3100,0x3200,0x3300,0x3400,0x3500,0x3600,0x3700,0x3800, + 0x3900,0x3A00,0x3B00,0x3C00,0x3D00,0x3E00,0x3F00,0x4000, + 0x4100,0x4200,0x4300,0x4400,0x4500,0x4600,0x4700,0x4800, + 0x4900,0x4A00,0x4B00,0x4C00,0x4D00,0x4E00,0x4F00,0x5000, + 0x5100,0x5200,0x5300,0x5400,0x5500,0x5600,0x5700,0x5800, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 1, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2237,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2242,INVALC,INVALC,0x2270,INVALC,0x2243,INVALC, + INVALC,0x226D,0x226C,INVALC,INVALC,INVALC,0x226E,0x2234, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2231,INVALC,0x226B,INVALC,INVALC,INVALC,INVALC,0x2244, + 0x2A22,0x2A21,0x2A24,0x2A2A,0x2A23,0x2A29,0x2921,0x2A2E, + 0x2A32,0x2A31,0x2A34,0x2A33,0x2A40,0x2A3F,0x2A42,0x2A41, + INVALC,0x2A50,0x2A52,0x2A51,0x2A54,0x2A58,0x2A53,INVALC, + 0x292C,0x2A63,0x2A62,0x2A65,0x2A64,0x2A72,0x2930,0x294E, + 0x2B22,0x2B21,0x2B24,0x2B2A,0x2B23,0x2B29,0x2941,0x2B2E, + 0x2B32,0x2B31,0x2B34,0x2B33,0x2B40,0x2B3F,0x2B42,0x2B41, + 0x2943,0x2B50,0x2B52,0x2B51,0x2B54,0x2B58,0x2B53,INVALC, + 0x294C,0x2B63,0x2B62,0x2B65,0x2B64,0x2B72,0x2950,0x2B73, + /* Block 2, Array index 0x0200 */ + 0x2A27,0x2B27,0x2A25,0x2B25,0x2A28,0x2B28,0x2A2B,0x2B2B, + 0x2A2C,0x2B2C,0x2A2F,0x2B2F,0x2A2D,0x2B2D,0x2A30,0x2B30, + 0x2922,0x2942,0x2A37,0x2B37,INVALC,INVALC,0x2A36,0x2B36, + 0x2A38,0x2B38,0x2A35,0x2B35,0x2A3A,0x2B3A,0x2A3B,0x2B3B, + 0x2A3D,0x2B3D,0x2A3C,INVALC,0x2A3E,0x2B3E,0x2924,0x2944, + 0x2A47,0x2B47,0x2A45,0x2B45,INVALC,INVALC,0x2A46,0x2B46, + 0x2A44,0x2945,0x2926,0x2946,0x2A48,0x2B48,0x2A49,0x2B49, + 0x2947,0x2A4A,0x2B4A,0x2A4C,0x2B4C,0x2A4B,0x2B4B,0x2929, + 0x2949,0x2928,0x2948,0x2A4D,0x2B4D,0x2A4F,0x2B4F,0x2A4E, + 0x2B4E,0x294A,0x292B,0x294B,0x2A57,0x2B57,INVALC,INVALC, + 0x2A56,0x2B56,0x292D,0x294D,0x2A59,0x2B59,0x2A5B,0x2B5B, + 0x2A5A,0x2B5A,0x2A5C,0x2B5C,0x2A5D,0x2B5D,0x2A5F,0x2B5F, + 0x2A5E,0x2B5E,0x2A61,0x2B61,0x2A60,0x2B60,0x292F,0x294F, + 0x2A6C,0x2B6C,0x2A69,0x2B69,0x2A66,0x2B66,0x2A6B,0x2B6B, + 0x2A68,0x2B68,0x2A6A,0x2B6A,0x2A71,0x2B71,0x2A74,0x2B74, + 0x2A73,0x2A75,0x2B75,0x2A77,0x2B77,0x2A76,0x2B76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2A26,0x2B26,0x2A43, + 0x2B43,0x2A55,0x2B55,0x2A67,0x2B67,0x2A70,0x2B70,0x2A6D, + 0x2B6D,0x2A6F,0x2B6F,0x2A6E,0x2B6E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2B39,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 3, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2230, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x222F,0x2232,0x2236,0x2235,INVALC,0x2233,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 4, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2238,0x2239,0x2661,INVALC, + 0x2662,0x2663,0x2664,INVALC,0x2667,INVALC,0x2669,0x266C, + 0x2676,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2665,0x266A,0x2671,0x2672,0x2673,0x2674, + 0x267B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2678,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2675,0x267A,0x2677,0x2679,0x267C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 5, Array index 0x0500 */ + INVALC,INVALC,0x2742,0x2743,0x2744,0x2745,0x2746,0x2747, + 0x2748,0x2749,0x274A,0x274B,0x274C,INVALC,0x274D,0x274E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2772,0x2773,0x2774,0x2775,0x2776,0x2777, + 0x2778,0x2779,0x277A,0x277B,0x277C,INVALC,0x277D,0x277E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 34, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2271,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x226F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x0700 */ + INVALC,INVALC,0x3021,INVALC,0x3022,0x3023,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3024,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3025,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3026, + INVALC,INVALC,INVALC,0x3027,0x3028,INVALC,INVALC,INVALC, + 0x3029,INVALC,INVALC,0x302A,INVALC,INVALC,0x302B,0x302C, + 0x302D,INVALC,INVALC,INVALC,INVALC,0x302E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x302F,0x3030,INVALC,INVALC,0x3031,INVALC,INVALC,0x3032, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3033,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3034,INVALC,0x3035,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3036,INVALC,INVALC,INVALC,INVALC, + 0x3037,0x3038,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3039,0x303A,INVALC,INVALC, + INVALC,0x303B,INVALC,INVALC,INVALC,INVALC,INVALC,0x303C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x303D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x303E,0x303F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3040,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3041, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3042,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3043,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3044,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3045,0x3046,INVALC,INVALC,INVALC,INVALC, + 0x3047,0x3048,0x3049,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x304A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x304B, + INVALC,0x304C,INVALC,0x304D,INVALC,0x304E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x304F,0x3050,0x3051, + /* Block 80, Array index 0x0800 */ + 0x3052,INVALC,0x3053,0x3054,INVALC,INVALC,INVALC,INVALC, + 0x3055,INVALC,INVALC,0x3056,0x3057,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3058,INVALC,INVALC,0x3059,0x305A,0x305B, + INVALC,0x305C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x305D,INVALC, + INVALC,0x305E,INVALC,0x3060,INVALC,0x3061,INVALC,0x3062, + INVALC,0x3063,INVALC,0x3064,INVALC,INVALC,0x3065,INVALC, + 0x3066,INVALC,0x3067,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3068,0x3069,INVALC,0x306A,0x306B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x306C,INVALC,0x306D,INVALC,0x306E,INVALC, + 0x306F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3070, + 0x305F,INVALC,INVALC,0x3071,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3072,INVALC,0x3073,INVALC,0x3074,INVALC, + INVALC,0x3075,INVALC,INVALC,INVALC,INVALC,INVALC,0x3076, + 0x3077,0x3078,0x3079,INVALC,INVALC,0x307A,0x307B,INVALC, + INVALC,0x307C,0x307D,INVALC,0x307E,0x3121,INVALC,INVALC, + INVALC,0x3122,0x3123,INVALC,0x3124,INVALC,0x3125,INVALC, + 0x3126,INVALC,0x3127,0x3128,0x3129,INVALC,INVALC,0x312A, + INVALC,0x312B,0x312C,INVALC,INVALC,INVALC,0x312D,0x312E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x312F,INVALC,INVALC,INVALC,INVALC,0x3130, + INVALC,0x3131,INVALC,0x3132,0x3133,0x3134,0x3135,INVALC, + 0x3136,0x3137,INVALC,INVALC,INVALC,0x3138,0x3139,INVALC, + 0x313A,0x313B,INVALC,0x313C,0x313D,0x313E,INVALC,0x313F, + INVALC,INVALC,0x3140,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3141,INVALC,INVALC,INVALC, + 0x3142,INVALC,0x3143,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3144,INVALC,0x3145,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3146,0x3147,INVALC,0x3148, + /* Block 81, Array index 0x0900 */ + 0x3149,0x314A,INVALC,INVALC,0x314B,INVALC,INVALC,0x314C, + INVALC,INVALC,0x314D,INVALC,0x314E,INVALC,0x314F,INVALC, + 0x3150,INVALC,INVALC,0x3151,INVALC,INVALC,INVALC,0x3152, + 0x3153,INVALC,INVALC,0x3154,0x3155,0x3156,0x3157,INVALC, + INVALC,INVALC,0x3158,INVALC,INVALC,INVALC,INVALC,0x3159, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x315A,INVALC, + 0x315B,INVALC,0x315C,0x315D,INVALC,0x315E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3176,INVALC,INVALC,INVALC,INVALC, + 0x315F,0x3160,0x3161,INVALC,INVALC,0x3162,0x3163,INVALC, + INVALC,INVALC,0x3164,INVALC,0x3165,INVALC,0x3166,INVALC, + INVALC,0x3167,0x3168,0x3169,INVALC,INVALC,INVALC,0x316A, + INVALC,0x316B,INVALC,INVALC,INVALC,INVALC,INVALC,0x316C, + 0x316D,INVALC,0x316E,0x316F,INVALC,INVALC,0x3170,0x3171, + INVALC,INVALC,0x3172,INVALC,INVALC,0x3173,INVALC,INVALC, + 0x3174,0x3175,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3177,INVALC,0x3178,0x3179,INVALC,0x317A,INVALC, + INVALC,INVALC,0x317B,INVALC,INVALC,INVALC,0x317C,0x317D, + 0x317E,INVALC,0x3221,0x3222,0x3223,INVALC,0x3224,INVALC, + INVALC,INVALC,INVALC,0x3225,0x3226,INVALC,0x3227,0x3228, + 0x3229,0x322A,0x322B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x322C,INVALC,INVALC,INVALC,INVALC,0x322D, + 0x322E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x322F,0x3230,INVALC,INVALC,0x3231,INVALC,INVALC, + 0x3232,INVALC,INVALC,0x3233,0x3234,INVALC,INVALC,0x3235, + INVALC,INVALC,INVALC,INVALC,0x3236,INVALC,0x3237,INVALC, + 0x3238,INVALC,INVALC,0x3239,0x323A,INVALC,INVALC,INVALC, + 0x323B,INVALC,INVALC,INVALC,0x323C,0x323D,INVALC,0x323E, + INVALC,INVALC,0x323F,INVALC,0x3240,INVALC,0x3241,INVALC, + 0x3242,0x3243,INVALC,INVALC,INVALC,INVALC,INVALC,0x3244, + INVALC,0x3245,0x3251,INVALC,INVALC,INVALC,0x3246,INVALC, + INVALC,INVALC,0x3247,INVALC,INVALC,INVALC,0x3248,INVALC, + /* Block 82, Array index 0x0A00 */ + INVALC,INVALC,INVALC,0x3249,INVALC,INVALC,0x324A,0x324B, + 0x324C,INVALC,INVALC,0x324D,0x324E,0x324F,0x3250,INVALC, + 0x3252,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3253, + INVALC,0x3254,INVALC,0x3255,0x3256,0x3257,0x3258,INVALC, + INVALC,INVALC,INVALC,0x3259,INVALC,INVALC,INVALC,0x325A, + 0x325B,INVALC,INVALC,INVALC,0x325C,0x325D,INVALC,0x325E, + INVALC,0x325F,INVALC,0x3260,0x3261,0x3262,INVALC,INVALC, + 0x3263,0x3264,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3265,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3266,INVALC,INVALC,INVALC,INVALC,0x3267, + INVALC,INVALC,INVALC,0x3268,INVALC,0x3269,INVALC,0x326A, + 0x326B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x326C, + INVALC,INVALC,INVALC,INVALC,0x326D,INVALC,0x326E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x326F,INVALC, + INVALC,INVALC,INVALC,0x3270,0x3271,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3272,INVALC,INVALC,0x3273,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3274,INVALC,INVALC,INVALC,INVALC,0x3275,INVALC,INVALC, + INVALC,0x3276,INVALC,0x3277,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3278,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3279,INVALC,0x327A,INVALC,0x327B,INVALC,0x327C,0x327D, + INVALC,INVALC,0x327E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3321,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3322, + INVALC,0x3323,0x3324,0x3325,INVALC,0x3326,INVALC,INVALC, + 0x3327,INVALC,INVALC,INVALC,INVALC,INVALC,0x3328,INVALC, + INVALC,INVALC,0x3329,INVALC,INVALC,0x332A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x332B,INVALC, + INVALC,INVALC,0x332C,0x332D,0x332E,INVALC,INVALC,0x332F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x0B00 */ + INVALC,0x3330,0x3331,INVALC,INVALC,0x3332,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3333,0x3334,INVALC,0x3335,0x3336,INVALC, + 0x3337,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3338,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3339,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x333A,0x333B,INVALC,INVALC,0x333C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x333D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x333E,INVALC,INVALC, + INVALC,0x333F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3340,INVALC,0x3341, + 0x3342,INVALC,0x3343,INVALC,0x3344,INVALC,INVALC,0x3345, + 0x3346,0x3347,INVALC,INVALC,INVALC,INVALC,0x3348,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3349,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x334A, + 0x334B,0x334C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x334D,INVALC,0x334E,INVALC,INVALC,0x334F,INVALC,INVALC, + INVALC,INVALC,0x3350,INVALC,0x3351,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3352,INVALC,0x3353,0x3354,0x3355, + 0x3356,INVALC,0x3357,INVALC,0x3358,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3359,0x335A,0x335B,0x335C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x335D, + 0x335E,INVALC,INVALC,INVALC,INVALC,INVALC,0x335F,0x3360, + 0x3361,INVALC,0x3362,0x3363,INVALC,0x3364,INVALC,INVALC, + 0x3365,INVALC,INVALC,INVALC,0x3366,INVALC,0x3367,INVALC, + 0x3368,INVALC,INVALC,INVALC,0x3369,INVALC,INVALC,0x336A, + INVALC,0x336B,INVALC,INVALC,0x336C,INVALC,0x336D,INVALC, + INVALC,INVALC,INVALC,0x336E,0x336F,INVALC,INVALC,INVALC, + INVALC,0x3370,INVALC,INVALC,INVALC,0x3371,INVALC,INVALC, + 0x3372,0x3373,0x3374,INVALC,0x3375,INVALC,INVALC,INVALC, + 0x3376,0x3377,INVALC,INVALC,0x3378,INVALC,0x3379,0x337A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x0C00 */ + 0x337B,INVALC,INVALC,0x337C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x337D,0x337E,0x3421,INVALC,INVALC,INVALC, + INVALC,0x3422,INVALC,0x3423,INVALC,INVALC,INVALC,INVALC, + 0x3424,INVALC,INVALC,0x3425,0x3426,INVALC,0x3427,0x3428, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3429,INVALC,0x342A, + 0x342B,0x342C,INVALC,0x342D,0x342E,0x342F,INVALC,INVALC, + 0x3430,INVALC,0x3431,INVALC,INVALC,0x3432,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3433,0x3434,0x3435,INVALC, + INVALC,INVALC,0x3436,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3438,0x3437,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3439,INVALC,0x343A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x343B,INVALC,0x343C,INVALC,0x343D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x343E,0x343F,INVALC,INVALC, + INVALC,INVALC,0x3440,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3441,INVALC,INVALC,INVALC,INVALC,0x3442,INVALC, + INVALC,INVALC,INVALC,0x3443,INVALC,INVALC,INVALC,0x3444, + 0x3445,INVALC,INVALC,INVALC,INVALC,INVALC,0x3446,INVALC, + INVALC,INVALC,INVALC,0x3447,0x3448,INVALC,INVALC,INVALC, + INVALC,0x3449,INVALC,INVALC,INVALC,0x344A,INVALC,INVALC, + INVALC,0x344B,INVALC,INVALC,0x344C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x344D,0x344E,INVALC,INVALC,INVALC,0x344F, + INVALC,INVALC,0x3450,INVALC,0x3451,0x3452,INVALC,0x3453, + 0x3454,INVALC,0x3455,INVALC,INVALC,0x3456,INVALC,INVALC, + 0x3457,INVALC,INVALC,INVALC,INVALC,0x3458,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3459, + INVALC,INVALC,0x345A,0x345B,INVALC,0x345C,INVALC,INVALC, + INVALC,INVALC,0x345D,INVALC,INVALC,0x345E,0x345F,INVALC, + 0x3460,INVALC,INVALC,INVALC,INVALC,INVALC,0x3461,0x3462, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3463,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x0D00 */ + INVALC,INVALC,0x3464,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3465,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3466,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3467,INVALC,INVALC,INVALC,INVALC,INVALC,0x3468, + 0x3469,INVALC,0x346A,INVALC,INVALC,INVALC,INVALC,0x346B, + INVALC,0x346C,INVALC,INVALC,0x346D,0x346E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x346F,0x3470,INVALC,INVALC,0x3471, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3472,INVALC,0x3473, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3474,INVALC, + INVALC,INVALC,0x3475,INVALC,0x3476,INVALC,0x3477,0x3478, + INVALC,0x3479,INVALC,0x347A,INVALC,0x347B,0x347C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x347D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x347E, + INVALC,0x3521,INVALC,0x3522,INVALC,0x3523,INVALC,INVALC, + 0x3524,0x3525,INVALC,INVALC,INVALC,0x3526,INVALC,INVALC, + INVALC,0x3527,INVALC,INVALC,INVALC,0x3528,0x3529,INVALC, + INVALC,INVALC,INVALC,INVALC,0x352A,INVALC,INVALC,0x352B, + INVALC,0x352C,INVALC,INVALC,INVALC,INVALC,0x352D,0x352E, + INVALC,0x352F,0x3530,INVALC,INVALC,0x3531,0x3532,INVALC, + INVALC,0x3533,INVALC,INVALC,INVALC,INVALC,INVALC,0x3534, + INVALC,0x3535,0x3536,0x3537,INVALC,INVALC,INVALC,0x3538, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3539,INVALC, + INVALC,INVALC,0x353A,INVALC,INVALC,0x353B,0x353C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x353D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x353E,INVALC,0x353F,INVALC,INVALC,0x3540, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3541,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3542,INVALC,0x3543,0x3544, + /* Block 86, Array index 0x0E00 */ + 0x3545,0x3546,INVALC,INVALC,INVALC,0x3547,INVALC,INVALC, + 0x3548,0x3549,INVALC,INVALC,0x354A,0x354B,0x354C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x354D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x354E,0x354F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3550,INVALC,INVALC,0x3551,0x3552,INVALC, + INVALC,INVALC,INVALC,0x3553,0x3554,0x3555,INVALC,INVALC, + INVALC,0x3556,INVALC,INVALC,INVALC,INVALC,INVALC,0x3557, + INVALC,0x3558,0x3559,INVALC,INVALC,0x355A,INVALC,INVALC, + 0x355B,0x355C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x355D,INVALC,0x355E,0x355F,INVALC,INVALC,0x3560,INVALC, + 0x3561,0x3562,INVALC,INVALC,0x3563,INVALC,0x3564,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3565, + INVALC,0x3566,0x3567,INVALC,INVALC,INVALC,0x3568,INVALC, + 0x3569,INVALC,INVALC,INVALC,INVALC,INVALC,0x356A,0x356B, + INVALC,0x356C,0x356D,0x356E,0x356F,INVALC,INVALC,0x3570, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3571,0x3572,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3573,INVALC,INVALC, + INVALC,INVALC,0x3574,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3575, + INVALC,0x3576,INVALC,0x3577,INVALC,INVALC,0x3578,INVALC, + INVALC,0x3579,INVALC,0x357A,0x357B,INVALC,0x357C,INVALC, + INVALC,0x357D,0x357E,0x3621,INVALC,INVALC,INVALC,0x3622, + 0x3623,INVALC,INVALC,0x3624,INVALC,INVALC,0x3625,INVALC, + INVALC,INVALC,0x3626,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3627,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3628,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3629, + /* Block 87, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x362A,INVALC,INVALC, + 0x362B,INVALC,0x362C,INVALC,INVALC,0x362D,0x362E,0x362F, + 0x3630,0x3631,0x3632,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3633,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3634,INVALC,INVALC,INVALC, + 0x3635,INVALC,INVALC,0x3636,INVALC,0x3637,INVALC,0x3638, + INVALC,0x3639,INVALC,0x363A,0x363B,0x363C,INVALC,0x363D, + 0x363E,0x363F,INVALC,0x3640,0x3641,INVALC,0x3642,INVALC, + INVALC,0x3643,INVALC,0x3644,INVALC,0x3645,INVALC,0x3646, + INVALC,INVALC,INVALC,INVALC,0x3647,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3648,INVALC, + 0x3649,0x364A,0x364B,0x364C,INVALC,INVALC,0x364D,INVALC, + INVALC,0x364E,INVALC,INVALC,INVALC,0x364F,INVALC,0x3650, + INVALC,0x3651,0x3652,INVALC,INVALC,0x3653,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3654,0x3655,INVALC,INVALC, + 0x3656,INVALC,INVALC,0x3657,0x3658,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3659,INVALC,INVALC, + INVALC,0x365A,0x365B,INVALC,INVALC,0x365C,0x365D,0x365E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x365F,0x3660, + 0x3661,0x3662,INVALC,0x3663,0x3664,0x3665,INVALC,INVALC, + INVALC,0x3666,INVALC,0x3667,INVALC,INVALC,INVALC,0x3668, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3669,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x366A,INVALC,INVALC, + INVALC,0x366B,0x366C,0x366D,0x3670,0x3671,INVALC,0x366E, + 0x366F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3672,INVALC,INVALC,0x3673,0x3674,INVALC,0x3675, + INVALC,0x3676,INVALC,INVALC,0x3677,0x3678,0x3679,0x367A, + 0x367B,INVALC,INVALC,0x367D,INVALC,0x367E,INVALC,INVALC, + INVALC,0x367C,INVALC,INVALC,INVALC,INVALC,0x3721,0x3722, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x1000 */ + INVALC,0x3723,0x3724,INVALC,INVALC,INVALC,INVALC,0x3725, + INVALC,INVALC,0x3726,INVALC,0x3727,INVALC,INVALC,INVALC, + INVALC,0x3728,INVALC,INVALC,INVALC,0x3729,INVALC,INVALC, + INVALC,INVALC,0x372A,0x372B,INVALC,0x372C,INVALC,INVALC, + 0x372D,INVALC,0x372E,0x372F,0x3730,0x3731,INVALC,INVALC, + INVALC,0x3732,0x3733,INVALC,0x3734,INVALC,0x3735,0x3736, + INVALC,INVALC,INVALC,0x3737,0x3738,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3739,0x373A,0x373B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x373C,0x373D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x373E,0x373F,INVALC,INVALC, + INVALC,INVALC,0x3740,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3741,INVALC,INVALC,0x3742,INVALC,0x3743, + 0x3744,INVALC,INVALC,0x3745,INVALC,0x3746,0x3747,0x3748, + 0x3749,0x374A,INVALC,0x374B,0x374C,0x374D,INVALC,0x374E, + INVALC,0x374F,0x3750,0x3751,0x3752,INVALC,0x3753,INVALC, + INVALC,0x3754,INVALC,0x3755,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3756,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3757,0x3760,INVALC,0x3758, + INVALC,0x3759,0x375A,INVALC,0x375B,0x375C,0x375D,0x375E, + INVALC,0x375F,INVALC,INVALC,INVALC,INVALC,INVALC,0x3761, + 0x3762,0x3763,INVALC,INVALC,0x3764,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3765,INVALC,INVALC,INVALC,INVALC,0x3766,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3767, + 0x3768,INVALC,INVALC,INVALC,0x3769,INVALC,INVALC,0x376A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x376B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x376C,0x376D,INVALC, + INVALC,0x377E,INVALC,INVALC,0x376E,INVALC,0x376F,0x3770, + INVALC,0x3771,INVALC,INVALC,INVALC,0x3772,INVALC,INVALC, + 0x3773,INVALC,INVALC,INVALC,INVALC,0x3774,0x3775,INVALC, + 0x3776,INVALC,INVALC,INVALC,INVALC,0x3777,0x3778,0x3779, + /* Block 89, Array index 0x1100 */ + INVALC,INVALC,INVALC,0x377A,0x377B,INVALC,INVALC,INVALC, + 0x377C,0x377D,INVALC,INVALC,0x3821,0x3822,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3823,INVALC,INVALC,0x3824,0x3825, + 0x3826,INVALC,INVALC,INVALC,INVALC,INVALC,0x3827,0x3828, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3829,INVALC,INVALC, + INVALC,INVALC,0x382A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x382B,INVALC,INVALC,INVALC,INVALC,INVALC,0x382C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x382D,INVALC,INVALC,0x382E,0x382F,INVALC,0x3830, + 0x3831,INVALC,INVALC,INVALC,INVALC,0x3832,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3833, + INVALC,0x3834,INVALC,INVALC,0x3835,INVALC,INVALC,0x3836, + 0x3837,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3838,INVALC,INVALC,INVALC,0x3839,INVALC,INVALC,0x383A, + 0x383B,0x383C,INVALC,INVALC,INVALC,INVALC,INVALC,0x383D, + 0x383E,0x383F,0x3840,INVALC,0x3841,0x3842,INVALC,0x3843, + 0x3844,INVALC,INVALC,INVALC,0x3845,INVALC,0x3846,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3847,INVALC,INVALC, + 0x3848,0x3849,0x384A,INVALC,INVALC,INVALC,0x384B,INVALC, + INVALC,0x384C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x384D,0x384E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3850,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3851,INVALC,0x384F,INVALC,INVALC,INVALC, + 0x3852,INVALC,INVALC,INVALC,INVALC,0x3853,0x3854,INVALC, + 0x3855,INVALC,0x3856,INVALC,0x3857,INVALC,0x3858,INVALC, + INVALC,INVALC,0x3859,INVALC,INVALC,0x385A,INVALC,INVALC, + INVALC,0x385B,0x385C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x385D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x385E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x385F,0x3860,INVALC, + INVALC,INVALC,INVALC,0x3861,0x3862,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3863,0x3864,0x3865,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3867,INVALC,INVALC, + INVALC,0x3868,INVALC,0x3869,0x386A,INVALC,INVALC,INVALC, + 0x386B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x386C, + 0x386D,INVALC,INVALC,0x386E,INVALC,0x386F,0x3870,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3871, + INVALC,INVALC,INVALC,0x3872,INVALC,INVALC,0x3873,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3874,0x3875,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3876,INVALC,0x3877,INVALC,0x3878,0x3879,0x387A, + INVALC,0x387B,INVALC,0x387C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x387D,INVALC,0x387E,INVALC,0x3921, + INVALC,INVALC,0x3922,INVALC,INVALC,0x3923,0x3924,INVALC, + INVALC,0x3925,INVALC,0x3926,0x3927,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3928,0x3929,INVALC,0x392A,INVALC, + INVALC,INVALC,0x392B,INVALC,INVALC,0x392C,INVALC,0x392D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x392E, + INVALC,INVALC,INVALC,INVALC,0x392F,INVALC,INVALC,0x3930, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3931,0x3932,0x3933, + 0x3934,INVALC,INVALC,0x3935,INVALC,INVALC,INVALC,0x3936, + INVALC,INVALC,0x3937,INVALC,0x3938,INVALC,INVALC,INVALC, + INVALC,0x3939,INVALC,0x393A,0x393B,INVALC,INVALC,INVALC, + 0x393C,INVALC,0x393D,INVALC,INVALC,0x393E,INVALC,INVALC, + INVALC,INVALC,0x393F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3940,0x3941,0x3942, + INVALC,INVALC,INVALC,0x3943,0x3944,INVALC,INVALC,0x3945, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3946,0x3947, + INVALC,0x3948,0x3949,INVALC,0x394A,INVALC,INVALC,0x394B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x1300 */ + 0x394C,INVALC,INVALC,INVALC,0x394D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x394E,0x394F,0x3950,INVALC, + INVALC,INVALC,0x3951,0x3952,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3953,INVALC, + INVALC,INVALC,INVALC,0x3954,0x3955,INVALC,INVALC,0x3956, + 0x3957,INVALC,0x3958,INVALC,INVALC,0x3959,INVALC,INVALC, + 0x395A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x395B,0x395C,INVALC,0x395D, + 0x395E,INVALC,INVALC,INVALC,0x395F,INVALC,INVALC,INVALC, + 0x3960,INVALC,INVALC,INVALC,INVALC,0x3961,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3962,INVALC, + INVALC,INVALC,INVALC,0x3963,INVALC,0x3964,INVALC,0x3965, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3966,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3967, + INVALC,INVALC,0x3968,0x3969,INVALC,INVALC,0x396A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x396B,INVALC,INVALC,INVALC,INVALC, + 0x396C,INVALC,INVALC,0x396D,INVALC,INVALC,0x396E,INVALC, + INVALC,0x396F,INVALC,INVALC,0x3970,INVALC,0x3971,0x3972, + 0x3973,INVALC,0x3974,INVALC,INVALC,INVALC,INVALC,0x3975, + INVALC,INVALC,INVALC,INVALC,0x3976,INVALC,INVALC,INVALC, + INVALC,0x3977,0x3978,0x3979,INVALC,0x397A,INVALC,INVALC, + 0x397B,INVALC,0x397C,0x397D,INVALC,INVALC,INVALC,0x397E, + INVALC,INVALC,INVALC,INVALC,0x3A21,INVALC,0x3A22,INVALC, + 0x3A23,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A24, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A25,INVALC,0x3A26,INVALC,INVALC,INVALC, + 0x3A27,INVALC,INVALC,INVALC,INVALC,0x3A28,INVALC,INVALC, + INVALC,INVALC,0x3A29,INVALC,INVALC,INVALC,0x3A2A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A2B,0x3A2C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A2D,INVALC,INVALC, + /* Block 92, Array index 0x1400 */ + 0x3A2E,0x3A2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A31, + INVALC,0x3A33,INVALC,0x3A34,INVALC,0x3A35,INVALC,INVALC, + INVALC,0x3A36,INVALC,INVALC,INVALC,0x3A37,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A38,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A32,INVALC,INVALC,INVALC, + 0x3A39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3A3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3A3B,0x3A3C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A3D,INVALC,INVALC,INVALC,0x3A3E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A3F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A40,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A41,0x3A42, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A43,0x3A44,0x3A45,0x3A46, + INVALC,0x3A47,INVALC,INVALC,0x3A48,INVALC,0x3A49,INVALC, + INVALC,INVALC,0x3A4A,INVALC,INVALC,INVALC,0x3A4B,INVALC, + 0x3A4C,0x3A4D,INVALC,0x3A4E,0x3A4F,INVALC,0x3A50,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A51,0x3A52,INVALC,INVALC,0x3A53,0x3A54,INVALC,0x3A55, + INVALC,0x3A56,0x3A57,INVALC,INVALC,INVALC,INVALC,0x3A58, + INVALC,INVALC,0x3A59,INVALC,0x3A5A,INVALC,INVALC,INVALC, + 0x3A5B,0x3A5C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A5D,INVALC,0x3A5E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A5F,0x3A60, + 0x3A61,0x3A62,0x3A63,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A64,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A65, + INVALC,0x3A66,INVALC,INVALC,0x3A67,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A68,INVALC,INVALC, + /* Block 93, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A69,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A6A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3A6B,0x3A6C, + INVALC,INVALC,INVALC,0x3A6D,INVALC,INVALC,0x3A6E,INVALC, + INVALC,0x3A6F,INVALC,0x3A70,0x3A71,INVALC,0x3A72,INVALC, + 0x3A73,INVALC,0x3A74,INVALC,INVALC,0x3A75,0x3A76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3A77,0x3A78,INVALC,0x3A79,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3A7A,0x3A7B,INVALC,INVALC,INVALC,0x3A7C, + 0x3A7D,0x3A7E,INVALC,INVALC,INVALC,0x3B21,INVALC,INVALC, + 0x3B22,INVALC,INVALC,INVALC,0x3B23,0x3B24,INVALC,INVALC, + INVALC,INVALC,0x3B25,0x3B26,0x3B27,0x3B28,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B29, + 0x3B2A,INVALC,0x3B2B,INVALC,INVALC,INVALC,INVALC,0x3B2C, + INVALC,INVALC,0x3B2D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B2E,INVALC,0x3B2F, + 0x3B30,INVALC,0x3B31,0x3B32,INVALC,INVALC,0x3B33,INVALC, + INVALC,INVALC,0x3B34,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B35,INVALC,0x3B36,0x3B37,INVALC,INVALC, + INVALC,INVALC,0x3B38,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B39,INVALC,0x3B3A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B3B,INVALC,INVALC,INVALC,INVALC,0x3B3D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B3C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B3E,INVALC, + INVALC,0x3B3F,0x3B40,INVALC,0x3B41,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x1600 */ + INVALC,0x3B42,INVALC,INVALC,INVALC,INVALC,0x3B43,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B44,INVALC,INVALC, + INVALC,INVALC,0x3B45,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B47,0x3B48,INVALC,0x3B49,0x3B4A, + INVALC,INVALC,INVALC,0x3B46,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B4B,INVALC,INVALC,0x3B4C,INVALC,INVALC,INVALC, + INVALC,0x3B4D,INVALC,INVALC,INVALC,0x3B4E,INVALC,0x3B4F, + INVALC,INVALC,0x3B50,0x3B51,INVALC,INVALC,0x3B52,INVALC, + 0x3B53,INVALC,0x3B57,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B55,INVALC,INVALC,INVALC,0x3B54,INVALC,INVALC, + INVALC,0x3B56,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B58, + 0x3B59,0x3B5A,0x3B5B,INVALC,0x3B5C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B5D,INVALC,INVALC,0x3B5E,INVALC,INVALC, + 0x3B5F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B60,0x3B61,INVALC,INVALC,INVALC,0x3B62,0x3B63, + INVALC,0x3B64,INVALC,0x3B65,INVALC,INVALC,INVALC,INVALC, + 0x3B66,INVALC,0x3B67,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3B68,0x3B69,0x3B6A,0x3B6B,INVALC,INVALC, + INVALC,0x3B6C,INVALC,0x3B6D,INVALC,INVALC,INVALC,0x3B6E, + 0x3B6F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3B70, + INVALC,INVALC,INVALC,0x3B71,INVALC,INVALC,INVALC,INVALC, + 0x3B72,INVALC,0x6674,INVALC,0x3B73,INVALC,INVALC,INVALC, + 0x3B74,0x3B75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B76,INVALC,INVALC,INVALC,0x3B77, + INVALC,INVALC,INVALC,0x3B78,INVALC,INVALC,0x3B7A,INVALC, + 0x3B79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B7B,0x3B7C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B7D,INVALC,INVALC,INVALC,0x3B7E,INVALC,INVALC,INVALC, + INVALC,0x3C21,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C22,0x3C23,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x1700 */ + 0x3C24,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C25, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C26,INVALC,INVALC, + INVALC,INVALC,0x3C27,INVALC,0x3C28,0x3C29,INVALC,INVALC, + 0x3C2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C2B, + 0x3C2C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C2E,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C2D,INVALC, + INVALC,INVALC,0x3C2F,INVALC,INVALC,0x3C30,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C31,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3C34,INVALC,0x3C32,INVALC,INVALC,INVALC,INVALC, + 0x3C33,0x3C35,INVALC,INVALC,INVALC,INVALC,0x3C36,INVALC, + 0x3C37,INVALC,INVALC,0x3C38,0x3C39,INVALC,0x3C3A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C3B,INVALC,0x3C3C,0x3C3D,0x3C3E,0x3C3F,0x3C40,INVALC, + 0x3C41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3C43,INVALC,INVALC,0x3C44,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3C45,INVALC,0x3C46,0x3C47,INVALC,INVALC, + 0x3C48,INVALC,0x3C49,INVALC,0x3C4A,INVALC,INVALC,INVALC, + INVALC,0x3C4B,INVALC,0x3C4C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C4D,0x3C4E,0x3C4F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C50,INVALC, + INVALC,INVALC,INVALC,0x3C52,0x3C51,INVALC,0x3C53,INVALC, + INVALC,0x3C54,0x3C55,INVALC,0x3C56,0x3C57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C58,INVALC,0x3C59,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C5A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3C5B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x1800 */ + INVALC,INVALC,0x3C5C,INVALC,INVALC,INVALC,0x3C5D,0x3C5E, + 0x3C5F,INVALC,INVALC,INVALC,INVALC,INVALC,0x3C60,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3C61,INVALC,INVALC,0x3C62,0x3C63,INVALC,INVALC, + INVALC,0x3C64,0x3C65,0x3C66,0x3C67,INVALC,INVALC,INVALC, + 0x3C68,INVALC,INVALC,0x3C69,0x3C6A,INVALC,0x3C6B,INVALC, + 0x3C6C,INVALC,INVALC,INVALC,0x3C6D,INVALC,0x3C6E,INVALC, + INVALC,INVALC,INVALC,0x3C6F,INVALC,0x3C70,INVALC,0x3C71, + 0x3C72,INVALC,INVALC,INVALC,0x3C73,0x3C74,INVALC,0x3C75, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C76,INVALC,INVALC, + 0x3C77,INVALC,INVALC,INVALC,0x3C78,INVALC,INVALC,INVALC, + 0x3C79,INVALC,INVALC,0x3C7A,INVALC,INVALC,INVALC,INVALC, + 0x3C7B,INVALC,INVALC,0x3C7C,0x3C7D,INVALC,INVALC,0x3C7E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D21, + INVALC,INVALC,0x3D22,INVALC,0x3D23,0x3D24,INVALC,INVALC, + 0x3D25,INVALC,0x3D26,INVALC,INVALC,0x3D27,0x3D28,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D29,INVALC,INVALC,INVALC,0x3D2A,INVALC,0x3D2B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D2C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D2D,0x3D2E,INVALC,INVALC, + INVALC,INVALC,0x3D2F,INVALC,0x3D32,INVALC,INVALC,0x3D30, + INVALC,INVALC,INVALC,0x3D31,0x3D33,INVALC,INVALC,0x3D34, + 0x3D35,0x3D36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D37,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D38,INVALC,INVALC,0x3D39, + 0x3D3A,0x3D3B,INVALC,0x3D3C,INVALC,INVALC,INVALC,INVALC, + 0x3D3D,0x3D3E,0x3D3F,0x3D40,0x3D41,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D42,INVALC, + INVALC,0x3D43,0x3D44,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D45,0x3D46,0x3D47,INVALC,0x3D48,0x3D49,0x3D4A,0x3D4B, + INVALC,INVALC,0x3D4C,0x3D4D,INVALC,INVALC,0x3D4E,INVALC, + INVALC,INVALC,0x3D4F,INVALC,0x3D50,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D51, + INVALC,INVALC,0x3D52,INVALC,INVALC,0x3D53,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D54,0x3D55,INVALC,INVALC,0x3D56, + 0x3D57,INVALC,0x3D58,INVALC,INVALC,INVALC,INVALC,0x3D59, + INVALC,INVALC,INVALC,INVALC,0x3D5A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D5B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D5C,INVALC,0x3D5D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D5E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D5F, + 0x3D60,0x3D61,INVALC,INVALC,0x3D62,INVALC,INVALC,INVALC, + INVALC,0x3D63,INVALC,INVALC,0x3D64,INVALC,0x3D65,0x3D66, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D67,INVALC,INVALC, + INVALC,0x3D68,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D69, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3D6A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D6B,0x3D6C, + INVALC,INVALC,0x3D6D,INVALC,INVALC,INVALC,0x3D6E,INVALC, + 0x3D6F,INVALC,0x3D70,INVALC,INVALC,INVALC,0x3D71,INVALC, + INVALC,0x3D72,INVALC,0x3D73,INVALC,0x3D74,INVALC,INVALC, + 0x3D75,INVALC,INVALC,INVALC,INVALC,0x3D76,0x3D77,INVALC, + INVALC,INVALC,0x3D78,INVALC,0x3D79,0x3D7A,INVALC,INVALC, + 0x3D7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D7C,0x3D7D,INVALC,INVALC,INVALC,INVALC,INVALC,0x3D7E, + INVALC,INVALC,INVALC,0x3E21,INVALC,INVALC,0x3E22,INVALC, + INVALC,INVALC,0x3E23,INVALC,0x3E24,INVALC,INVALC,INVALC, + 0x3E25,0x3E26,0x3E27,0x3E28,INVALC,INVALC,0x3E29,0x3E2A, + INVALC,INVALC,INVALC,INVALC,0x3E2B,0x3E2C,INVALC,INVALC, + INVALC,0x3E2D,INVALC,0x3E2E,INVALC,0x3E2F,0x3E30,INVALC, + INVALC,INVALC,0x3E31,INVALC,INVALC,0x3E32,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E33,INVALC,INVALC,0x3E34,INVALC,INVALC, + 0x3E35,INVALC,INVALC,INVALC,0x3E36,0x3E37,INVALC,INVALC, + /* Block 98, Array index 0x1A00 */ + INVALC,INVALC,0x3E38,INVALC,INVALC,INVALC,INVALC,0x3E39, + INVALC,INVALC,0x3E3A,INVALC,0x3E3B,INVALC,INVALC,INVALC, + 0x3E3C,0x3E3D,0x3E3E,0x3E3F,0x3E40,INVALC,0x3E41,0x3E42, + INVALC,0x3E43,INVALC,INVALC,0x3E44,INVALC,0x3E45,INVALC, + INVALC,INVALC,0x3E46,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E47,0x3E48,INVALC,INVALC,INVALC,INVALC, + 0x3E49,0x3E4A,INVALC,INVALC,INVALC,0x3E4B,0x3E4C,0x3E4D, + INVALC,0x3E4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3E4F,INVALC,INVALC,INVALC,0x3E50,0x3E51,INVALC, + INVALC,0x3E52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E53,INVALC, + 0x3E54,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E55,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3E56,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E57,INVALC,INVALC,0x3E58,0x3E59,INVALC,INVALC,0x3E5A, + 0x3E5B,0x3E5C,INVALC,0x3E5D,0x3E5E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3E5F,INVALC,0x3E60,INVALC,INVALC, + INVALC,INVALC,0x3E61,0x3E62,INVALC,INVALC,INVALC,0x3E63, + 0x3E64,INVALC,INVALC,INVALC,0x3E65,0x3E66,INVALC,0x3E67, + 0x3E68,INVALC,INVALC,INVALC,INVALC,0x3E69,INVALC,INVALC, + 0x3E6A,INVALC,0x3E6B,INVALC,INVALC,0x3E6C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E6D,0x3E6E,INVALC,INVALC,0x3E6F,INVALC,INVALC,INVALC, + 0x3E70,0x3E71,0x3E72,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3E73,0x3E74, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3E75,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E76,0x3E77,0x3E78,0x3E79, + INVALC,0x3E7A,0x3E7B,INVALC,INVALC,0x3E7E,INVALC,0x3E7C, + INVALC,0x3E7D,INVALC,INVALC,0x3F21,0x3F22,INVALC,0x3F23, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x1B00 */ + INVALC,0x3F24,INVALC,0x3F25,0x3F26,INVALC,INVALC,0x3F27, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F28,INVALC,0x3F29,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F2A,INVALC,INVALC,INVALC, + 0x3F2B,INVALC,0x3F2C,0x3F2D,INVALC,INVALC,INVALC,0x3F2E, + INVALC,0x3F2F,INVALC,0x3F30,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F31,INVALC,INVALC,INVALC,0x3F32,INVALC,INVALC, + INVALC,INVALC,0x3F33,0x3F34,0x3F35,INVALC,0x3F36,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F37,INVALC,INVALC,INVALC, + 0x3F38,0x3F39,0x3F3A,INVALC,0x3F3B,INVALC,0x3F3C,INVALC, + INVALC,INVALC,0x3F3D,INVALC,0x3F3E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F3F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F40,INVALC,0x3F41, + INVALC,INVALC,INVALC,0x3F42,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F43,INVALC,INVALC,0x3F44,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F45,0x3F46,0x3F47, + 0x3F48,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F49,INVALC, + 0x3F4A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3F4B,INVALC,INVALC,0x3F4C,0x3F4D, + INVALC,INVALC,0x3F4E,INVALC,INVALC,INVALC,0x3F4F,0x3F50, + INVALC,INVALC,INVALC,INVALC,0x3F51,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x3F52,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F53,0x3F54,INVALC, + INVALC,INVALC,0x3F55,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F56,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F57,INVALC,0x3F58,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F59,0x3F5A,INVALC,INVALC, + /* Block 100, Array index 0x1C00 */ + INVALC,INVALC,INVALC,0x3F5B,0x3F5C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x3F5D,0x3F5E,INVALC,0x3F5F,INVALC,INVALC, + 0x3F60,INVALC,INVALC,0x3F61,INVALC,INVALC,0x3F62,INVALC, + 0x3F63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3F64,0x3F65,INVALC,INVALC,0x3F66,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F67,0x3F68,INVALC, + INVALC,0x3F69,INVALC,INVALC,0x3F6A,INVALC,INVALC,INVALC, + INVALC,0x3F6B,0x3F6C,0x3F6D,0x3F6E,INVALC,0x3F6F,INVALC, + INVALC,INVALC,0x3F70,0x3F71,INVALC,INVALC,0x3F72,INVALC, + INVALC,INVALC,0x3F73,0x3F74,0x3F75,INVALC,INVALC,INVALC, + 0x3F76,INVALC,INVALC,0x3F77,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3F78,0x3F79,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F7A,0x3F7B,INVALC,INVALC, + INVALC,0x3F7C,INVALC,INVALC,0x3F7D,0x3F7E,INVALC,INVALC, + 0x4021,INVALC,INVALC,INVALC,0x4022,0x4023,INVALC,0x4024, + INVALC,INVALC,0x4025,INVALC,0x4026,INVALC,INVALC,0x4027, + INVALC,INVALC,0x4028,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4029,INVALC,INVALC,INVALC,0x402A,0x402B,INVALC,INVALC, + INVALC,0x402C,0x402D,INVALC,INVALC,INVALC,0x402E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x402F,INVALC,0x4030,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4031,0x4032,0x4033, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4034,INVALC,INVALC, + INVALC,0x4035,INVALC,INVALC,INVALC,0x4036,INVALC,INVALC, + 0x4037,INVALC,INVALC,INVALC,INVALC,INVALC,0x4038,INVALC, + INVALC,0x4039,INVALC,0x403A,0x403B,0x403C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x403D,INVALC,INVALC,INVALC, + 0x403E,INVALC,INVALC,INVALC,INVALC,0x403F,INVALC,INVALC, + INVALC,INVALC,0x4040,INVALC,0x4041,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4042,0x4043,INVALC,0x4044,INVALC,INVALC, + 0x4045,0x4046,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4047,0x4048,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4049,INVALC,0x404A,INVALC,0x404B,INVALC,INVALC,INVALC, + 0x404C,INVALC,INVALC,INVALC,INVALC,INVALC,0x404D,INVALC, + 0x404E,INVALC,0x404F,INVALC,0x4050,0x4051,INVALC,INVALC, + INVALC,0x4052,0x4053,INVALC,INVALC,INVALC,INVALC,0x4054, + 0x4055,INVALC,INVALC,INVALC,INVALC,0x4056,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4057,INVALC,0x4058, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4059,INVALC,INVALC,INVALC,0x405A, + INVALC,0x405B,0x405C,0x405D,0x405E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x405F,0x4060,0x4061,0x4062,INVALC,0x4063, + 0x4064,0x4065,INVALC,0x4066,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4067,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4068,0x4069,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x406A,INVALC,0x406B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x406C,INVALC,0x406D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x406E, + 0x406F,0x4070,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4071,0x4072,INVALC,0x4073,INVALC,0x4074,INVALC,0x4075, + INVALC,0x4076,INVALC,0x4077,INVALC,INVALC,0x4078,INVALC, + 0x4079,INVALC,INVALC,INVALC,0x407A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x407B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x407C,0x407D,0x407E, + INVALC,INVALC,INVALC,INVALC,0x4121,INVALC,INVALC,INVALC, + INVALC,0x4122,0x4123,0x4124,0x4125,INVALC,0x4126,INVALC, + 0x4127,0x4128,INVALC,INVALC,INVALC,0x4129,INVALC,0x412A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x412B,0x412C,INVALC,INVALC, + INVALC,0x412D,0x412E,INVALC,INVALC,0x412F,INVALC,INVALC, + 0x4130,INVALC,INVALC,INVALC,INVALC,0x4131,INVALC,0x4132, + INVALC,INVALC,INVALC,0x4133,INVALC,INVALC,INVALC,0x4134, + /* Block 102, Array index 0x1E00 */ + INVALC,0x4135,INVALC,INVALC,0x4136,INVALC,INVALC,INVALC, + 0x4137,0x4138,0x4139,INVALC,INVALC,INVALC,INVALC,0x413A, + INVALC,INVALC,INVALC,0x413B,0x413C,INVALC,0x413D,INVALC, + INVALC,0x413E,INVALC,0x413F,INVALC,INVALC,0x4140,0x4141, + INVALC,INVALC,0x4142,INVALC,INVALC,INVALC,0x4143,INVALC, + INVALC,0x4144,INVALC,INVALC,INVALC,INVALC,0x4145,INVALC, + INVALC,0x4146,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4147,INVALC,0x4148,0x4149,INVALC,INVALC, + INVALC,INVALC,INVALC,0x414A,INVALC,INVALC,INVALC,0x414B, + INVALC,0x414C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x414D,INVALC,0x414E,INVALC,0x414F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4150, + 0x4151,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4152, + INVALC,INVALC,INVALC,0x4153,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4154,INVALC,INVALC,0x4155,INVALC,INVALC, + INVALC,0x4156,INVALC,INVALC,INVALC,0x4157,INVALC,INVALC, + INVALC,INVALC,0x4158,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4159,INVALC,INVALC,0x415A,INVALC,INVALC, + 0x415B,INVALC,INVALC,INVALC,INVALC,0x415C,INVALC,INVALC, + 0x415D,INVALC,INVALC,0x415E,INVALC,INVALC,0x415F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4160,INVALC, + INVALC,INVALC,0x4161,0x4162,0x4163,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4164, + INVALC,INVALC,0x4165,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4166,0x4167,INVALC,INVALC,INVALC,INVALC,0x4168,INVALC, + 0x4169,INVALC,INVALC,INVALC,0x416A,INVALC,0x416B,INVALC, + 0x416C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x416D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x416E,INVALC,0x416F,INVALC,0x4170,0x4171,INVALC,INVALC, + INVALC,0x4172,INVALC,INVALC,INVALC,INVALC,0x4173,0x4174, + /* Block 103, Array index 0x1F00 */ + 0x4175,INVALC,INVALC,INVALC,0x4176,INVALC,INVALC,INVALC, + 0x4177,0x4178,INVALC,INVALC,INVALC,0x4179,INVALC,INVALC, + INVALC,0x417A,0x417B,INVALC,INVALC,0x417C,0x417D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x417E,0x4221,INVALC, + INVALC,0x4222,0x4223,0x4224,0x4225,INVALC,0x4226,INVALC, + INVALC,0x4227,0x4228,0x4229,0x422A,INVALC,0x422B,INVALC, + 0x422C,0x422D,INVALC,0x422E,INVALC,INVALC,INVALC,0x4230, + INVALC,0x422F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4231,INVALC,INVALC,INVALC,INVALC,0x4232,0x4233,INVALC, + INVALC,INVALC,0x4234,INVALC,0x4235,INVALC,0x4237,INVALC, + INVALC,0x4236,INVALC,INVALC,INVALC,INVALC,INVALC,0x4238, + 0x4239,0x423A,INVALC,0x423B,0x423C,INVALC,INVALC,INVALC, + 0x423D,0x423E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4240,0x4241,0x4242,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4244,INVALC,0x4245,INVALC,0x4247, + 0x4248,0x4249,INVALC,0x424A,0x424C,INVALC,0x4243,0x4246, + 0x424B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x424D,0x424E,0x424F,INVALC,INVALC, + 0x4250,INVALC,0x4251,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4252,0x4253,0x4254,0x4255,INVALC,INVALC,0x4256, + 0x4257,INVALC,INVALC,INVALC,0x4258,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4259,INVALC,INVALC, + INVALC,0x425A,0x425B,INVALC,INVALC,0x425C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x425D,INVALC,INVALC,INVALC,0x425E, + 0x425F,INVALC,0x4260,0x4261,INVALC,INVALC,INVALC,INVALC, + 0x4262,INVALC,INVALC,INVALC,0x4263,INVALC,0x4264,0x4265, + INVALC,INVALC,INVALC,INVALC,0x4266,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4267,INVALC,INVALC,INVALC,0x4268, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4269,INVALC,INVALC,0x426A,0x426B,INVALC,0x426C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x426D,0x423F,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x426E,INVALC,0x426F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4270,INVALC, + INVALC,INVALC,INVALC,0x4271,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4272,INVALC,INVALC,0x4273,INVALC,INVALC,INVALC, + 0x4274,INVALC,0x4275,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4276,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4277,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4278,INVALC,0x4279, + 0x427A,INVALC,INVALC,INVALC,0x427B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x427C,0x427D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x427E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4321,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4322,INVALC,0x4323,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4324,INVALC,0x4325,INVALC, + INVALC,INVALC,INVALC,0x4326,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4327,INVALC,INVALC,0x4328,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4329,0x432A, + INVALC,0x432B,INVALC,0x432C,INVALC,INVALC,0x432D,INVALC, + 0x432E,0x432F,INVALC,0x4330,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4331,0x4332,0x4333,INVALC,INVALC,0x4334,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4335,0x4336,0x4337,INVALC,INVALC, + 0x4339,INVALC,0x433A,0x433B,INVALC,0x433C,INVALC,INVALC, + 0x433D,0x433E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x433F,INVALC,INVALC,INVALC,INVALC,0x4340, + INVALC,0x4341,INVALC,INVALC,0x4342,INVALC,INVALC,INVALC, + INVALC,0x4343,INVALC,INVALC,INVALC,INVALC,0x4344,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4345,INVALC,0x4346,INVALC,INVALC,INVALC,0x4347,0x4348, + INVALC,0x4338,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x434A,INVALC,INVALC,INVALC, + INVALC,0x434B,INVALC,INVALC,INVALC,0x434C,INVALC,0x434D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x434F, + 0x434E,INVALC,INVALC,INVALC,0x4350,0x4351,INVALC,0x4352, + 0x4353,0x4354,INVALC,0x4355,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4356,INVALC,INVALC,INVALC,0x4357, + INVALC,INVALC,INVALC,INVALC,0x4358,0x4359,INVALC,INVALC, + INVALC,INVALC,0x435A,INVALC,0x435B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4349,INVALC,INVALC,0x435C,INVALC,0x435D, + 0x435E,INVALC,INVALC,0x435F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4360,INVALC,INVALC,0x4361,0x4362, + 0x4363,0x4364,0x4365,INVALC,INVALC,0x4366,INVALC,INVALC, + INVALC,0x4367,0x4368,0x4369,0x436A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x436B,INVALC,0x436C,INVALC,0x436D,INVALC, + 0x436E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x436F,INVALC, + 0x4370,INVALC,0x4371,INVALC,0x4372,INVALC,INVALC,INVALC, + INVALC,0x4373,INVALC,0x4374,INVALC,0x4375,INVALC,INVALC, + INVALC,0x4376,0x4377,INVALC,INVALC,INVALC,0x4378,INVALC, + INVALC,INVALC,0x4379,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x437A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x437B,INVALC,INVALC, + 0x437C,INVALC,INVALC,INVALC,0x437D,INVALC,INVALC,0x437E, + 0x4421,0x4422,INVALC,0x4423,INVALC,INVALC,0x4424,INVALC, + INVALC,0x4425,INVALC,INVALC,0x4426,0x4427,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4428,INVALC,INVALC, + 0x4429,INVALC,0x442A,0x442B,0x442C,0x442D,INVALC,INVALC, + 0x442E,0x442F,INVALC,INVALC,INVALC,0x4430,0x4431,INVALC, + INVALC,INVALC,INVALC,0x4432,0x4433,0x4434,INVALC,INVALC, + /* Block 106, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4435,INVALC, + INVALC,0x4436,0x4437,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4438,0x4439,INVALC,0x443A,INVALC,INVALC,0x443B,0x443C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x443D,INVALC,0x443E,INVALC,0x443F,INVALC,INVALC, + 0x4440,INVALC,INVALC,0x4441,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4442,INVALC,INVALC,0x4443,INVALC,INVALC, + INVALC,0x4444,INVALC,INVALC,INVALC,INVALC,0x4445,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4446, + INVALC,INVALC,INVALC,0x4447,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4448,0x4449,0x444A,0x444B,INVALC, + 0x444C,0x444D,INVALC,INVALC,0x444E,INVALC,INVALC,INVALC, + 0x444F,0x4450,0x4451,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4452,0x4453,INVALC,INVALC,INVALC,0x4454, + 0x4455,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4456,INVALC,INVALC, + INVALC,INVALC,0x4457,INVALC,INVALC,INVALC,0x4458,INVALC, + 0x4459,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x445A,INVALC,INVALC,INVALC,0x445B,0x445C,INVALC, + 0x445D,INVALC,INVALC,0x445E,INVALC,0x445F,INVALC,0x4460, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4461, + 0x4462,INVALC,0x4463,INVALC,0x4464,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4465,INVALC,INVALC, + 0x4466,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4467,INVALC,INVALC,INVALC,INVALC,0x4468,0x4469, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x446A,INVALC,INVALC,0x446B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x446C,0x446D, + INVALC,0x446E,INVALC,0x446F,INVALC,0x4470,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4471,INVALC, + /* Block 107, Array index 0x2300 */ + 0x4472,0x4473,INVALC,0x4474,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4475, + INVALC,0x4476,INVALC,INVALC,INVALC,0x4477,INVALC,INVALC, + INVALC,INVALC,0x4478,INVALC,INVALC,0x4479,INVALC,INVALC, + 0x447A,INVALC,INVALC,INVALC,0x447B,INVALC,INVALC,INVALC, + 0x447C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x447D,INVALC,0x447E,INVALC,0x4521,INVALC,INVALC,0x4522, + INVALC,INVALC,INVALC,0x4523,INVALC,INVALC,0x4524,0x4525, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4526,0x4527,INVALC, + INVALC,0x4528,0x4529,INVALC,INVALC,INVALC,0x452A,INVALC, + 0x452B,0x452C,0x452D,INVALC,INVALC,0x452E,0x452F,INVALC, + INVALC,INVALC,INVALC,0x4530,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4531,INVALC,INVALC,0x4532, + INVALC,INVALC,0x4533,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4534,INVALC,0x4535,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4536,INVALC, + INVALC,0x4537,INVALC,0x4538,INVALC,INVALC,0x4539,0x453A, + INVALC,0x453B,INVALC,0x453C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x453D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x453E,INVALC,0x453F,0x4540,0x4541, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4542,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4543,INVALC,INVALC,INVALC,0x4544, + 0x4545,0x4546,INVALC,INVALC,0x4547,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4548,0x4549,0x454A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x454B,INVALC, + 0x454D,0x454C,INVALC,INVALC,0x454E,INVALC,INVALC,INVALC, + 0x454F,INVALC,INVALC,INVALC,0x4550,0x4551,0x4552,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4553,0x4554,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4555,INVALC,INVALC,0x4556, + INVALC,INVALC,INVALC,INVALC,0x4557,INVALC,INVALC,INVALC, + 0x4558,0x4559,0x455A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x455B,0x455C,INVALC,INVALC, + /* Block 108, Array index 0x2400 */ + INVALC,INVALC,0x455D,0x455E,INVALC,INVALC,0x455F,0x4560, + INVALC,0x4561,INVALC,INVALC,INVALC,INVALC,INVALC,0x4562, + 0x4563,0x4564,INVALC,INVALC,INVALC,INVALC,INVALC,0x4565, + INVALC,INVALC,INVALC,0x4566,INVALC,INVALC,0x4567,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4568,INVALC,INVALC,INVALC, + 0x4569,INVALC,INVALC,0x456A,0x456B,INVALC,INVALC,0x456C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x456D,0x456E,INVALC, + INVALC,INVALC,INVALC,0x456F,INVALC,INVALC,INVALC,0x4570, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4571,INVALC, + INVALC,INVALC,0x4572,INVALC,INVALC,0x4573,INVALC,INVALC, + INVALC,INVALC,0x4574,INVALC,INVALC,INVALC,0x4575,INVALC, + 0x4576,INVALC,INVALC,INVALC,INVALC,0x4577,INVALC,INVALC, + 0x4578,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4579, + INVALC,INVALC,INVALC,0x457A,INVALC,INVALC,0x457B,INVALC, + 0x457C,INVALC,INVALC,INVALC,INVALC,0x457D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x457E,0x4621,INVALC, + INVALC,INVALC,0x4622,INVALC,INVALC,0x4623,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4624, + INVALC,INVALC,INVALC,0x4625,INVALC,INVALC,INVALC,0x4626, + 0x4627,INVALC,0x4628,0x4629,INVALC,INVALC,INVALC,INVALC, + 0x462A,0x462B,INVALC,INVALC,0x462C,0x462D,0x462E,INVALC, + 0x462F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4630,0x4631,INVALC,INVALC,INVALC,0x4632,0x4633,INVALC, + INVALC,INVALC,INVALC,0x4634,0x4635,INVALC,INVALC,INVALC, + INVALC,0x4636,INVALC,INVALC,0x4637,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4638,INVALC, + INVALC,INVALC,0x4639,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x463A,INVALC,0x463B,INVALC,INVALC,0x463C,0x463D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x463E,INVALC, + INVALC,0x463F,INVALC,INVALC,INVALC,INVALC,INVALC,0x4640, + INVALC,0x4641,INVALC,INVALC,INVALC,INVALC,INVALC,0x4642, + /* Block 109, Array index 0x2500 */ + INVALC,INVALC,0x4643,INVALC,0x4644,0x4645,INVALC,INVALC, + INVALC,0x4646,INVALC,INVALC,INVALC,0x4647,0x4648,INVALC, + 0x4649,INVALC,0x464A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x464B,INVALC,INVALC,INVALC,INVALC,INVALC,0x464C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x464D,0x464E, + 0x464F,INVALC,INVALC,INVALC,0x4650,INVALC,0x4651,INVALC, + INVALC,INVALC,INVALC,0x4652,INVALC,0x4653,0x4654,INVALC, + INVALC,INVALC,0x4655,0x4656,INVALC,INVALC,INVALC,0x4657, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4658,0x4659,INVALC,0x465A,INVALC,0x465B, + INVALC,INVALC,0x465C,INVALC,0x465D,INVALC,INVALC,INVALC, + INVALC,0x465E,INVALC,0x465F,0x4660,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4736, + INVALC,INVALC,INVALC,0x4661,INVALC,0x4662,INVALC,0x4663, + INVALC,INVALC,INVALC,INVALC,0x4664,INVALC,0x4665,INVALC, + 0x4666,0x4667,INVALC,0x4668,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4669,0x466A,0x466B, + INVALC,0x466C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x466D,0x466E,INVALC,0x466F, + 0x4670,INVALC,INVALC,INVALC,0x4671,INVALC,INVALC,0x4672, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4673,INVALC,0x4674,INVALC,0x4675,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4676,INVALC,INVALC,INVALC,0x4677,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4678,INVALC,0x4679, + 0x467A,0x467B,0x467C,INVALC,0x467D,INVALC,0x467E,INVALC, + INVALC,INVALC,0x4721,INVALC,0x4722,INVALC,INVALC,INVALC, + 0x4723,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4724, + INVALC,0x4725,INVALC,0x4726,0x4727,INVALC,0x4728,INVALC, + INVALC,INVALC,0x4729,INVALC,0x472A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,0x472B,INVALC,INVALC,0x472C, + INVALC,INVALC,0x472D,INVALC,INVALC,INVALC,0x472E,0x472F, + INVALC,0x4730,INVALC,0x4731,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4732,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4733,0x4734, + 0x4735,INVALC,INVALC,INVALC,INVALC,INVALC,0x4737,0x4738, + INVALC,0x4739,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x473A,INVALC,INVALC,0x473B,INVALC,INVALC,0x473C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x473D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x473E,0x473F, + INVALC,0x4740,INVALC,INVALC,INVALC,0x4741,INVALC,0x4742, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4743, + 0x4744,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4745,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4746,INVALC,INVALC,INVALC,INVALC,0x4747, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4748,0x4749,INVALC,0x474A,INVALC,0x474B,0x474C, + 0x474D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x474E,INVALC,0x474F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4750,INVALC,INVALC,0x4751, + INVALC,0x4752,INVALC,INVALC,INVALC,0x4753,INVALC,0x4754, + INVALC,INVALC,INVALC,INVALC,0x4755,INVALC,INVALC,INVALC, + 0x4756,INVALC,0x4757,INVALC,INVALC,INVALC,0x4758,0x4759, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x475A,INVALC, + INVALC,INVALC,INVALC,0x475B,INVALC,0x475C,INVALC,0x475D, + 0x475E,INVALC,0x475F,INVALC,INVALC,0x4760,INVALC,INVALC, + INVALC,0x4761,INVALC,INVALC,INVALC,INVALC,INVALC,0x4762, + 0x4763,INVALC,INVALC,INVALC,0x4764,INVALC,0x4765,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4766,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x2700 */ + 0x4767,INVALC,INVALC,INVALC,0x4768,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4769,INVALC, + INVALC,INVALC,0x476A,INVALC,INVALC,INVALC,INVALC,0x476B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x476C,INVALC,INVALC,INVALC,0x476D,INVALC, + INVALC,0x476E,INVALC,0x476F,0x4770,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4771,0x4772,INVALC,INVALC, + 0x4773,0x4774,INVALC,0x4775,INVALC,INVALC,INVALC,0x4776, + INVALC,0x4777,0x4778,0x4779,0x477A,INVALC,INVALC,0x477B, + INVALC,INVALC,INVALC,INVALC,0x477C,0x477D,0x477E,INVALC, + INVALC,INVALC,0x4821,0x4822,INVALC,INVALC,INVALC,INVALC, + 0x4823,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4824,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4825,INVALC,0x4826,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4827,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4828,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4829,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x482A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x482B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x482C,0x482D,INVALC, + INVALC,0x482E,INVALC,0x482F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4830,INVALC,INVALC,INVALC,0x4831, + 0x4832,0x4833,INVALC,0x4834,INVALC,INVALC,INVALC,0x4835, + 0x4836,INVALC,0x4837,INVALC,INVALC,0x4838,0x4839,0x483A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x483B,INVALC,0x483C,0x483D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x483E,INVALC,0x483F,INVALC,0x4840,INVALC,INVALC, + /* Block 112, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,0x4841,INVALC,INVALC,INVALC, + 0x4842,INVALC,0x4843,INVALC,0x4844,0x4845,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4846,INVALC, + 0x4847,INVALC,0x4848,0x4849,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x484A,INVALC, + INVALC,0x484B,0x484C,INVALC,INVALC,0x4853,INVALC,0x484D, + 0x484E,INVALC,INVALC,0x484F,INVALC,INVALC,0x4850,INVALC, + INVALC,INVALC,INVALC,0x4851,0x4852,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4854, + INVALC,0x4855,0x4856,0x4857,INVALC,INVALC,INVALC,0x4858, + INVALC,0x4859,0x485A,INVALC,INVALC,0x485B,0x485C,INVALC, + INVALC,0x485D,0x485E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x485F,INVALC,INVALC,INVALC,0x4860,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4861,0x4862,INVALC, + INVALC,INVALC,INVALC,0x4863,INVALC,INVALC,INVALC,0x4864, + 0x4865,INVALC,INVALC,0x4866,0x4867,0x4868,INVALC,INVALC, + 0x4869,INVALC,0x486A,0x486B,0x486C,INVALC,0x486D,INVALC, + INVALC,INVALC,0x486E,INVALC,INVALC,INVALC,INVALC,0x486F, + 0x4870,INVALC,INVALC,INVALC,INVALC,0x4871,0x4872,0x4873, + 0x4874,INVALC,INVALC,INVALC,INVALC,INVALC,0x4875,0x4876, + 0x4877,INVALC,INVALC,INVALC,INVALC,0x4878,0x4879,INVALC, + INVALC,INVALC,INVALC,INVALC,0x487A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x487B,INVALC,0x487C, + 0x487D,INVALC,0x487E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4921,INVALC,INVALC,INVALC,0x4922,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4923,0x4924,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4925,INVALC,INVALC,INVALC,INVALC,0x4926,INVALC,INVALC, + INVALC,0x4927,INVALC,INVALC,0x4928,0x4929,INVALC,INVALC, + /* Block 113, Array index 0x2900 */ + 0x492A,INVALC,INVALC,INVALC,INVALC,0x492B,0x492C,0x492D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x492E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x492F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4930,INVALC,INVALC,0x4931,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4932, + INVALC,INVALC,INVALC,INVALC,0x4933,INVALC,INVALC,0x4934, + INVALC,0x4935,INVALC,INVALC,0x4936,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4937,0x4938,INVALC,INVALC,INVALC, + 0x4939,0x493A,0x493B,0x493C,INVALC,INVALC,0x4941,INVALC, + INVALC,INVALC,INVALC,INVALC,0x493D,0x493E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x493F,0x4940,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4942,0x4943,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4944,INVALC,0x4945,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4946,0x4947,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4948,INVALC, + INVALC,0x4949,INVALC,INVALC,INVALC,0x494A,0x494B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x494C,0x494D,0x494E,0x494F, + 0x4950,INVALC,INVALC,0x4951,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4952,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4953,INVALC,INVALC,INVALC,INVALC, + 0x4954,0x4955,INVALC,INVALC,0x4956,INVALC,INVALC,0x4957, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4958,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4959,INVALC,0x495A,0x495B,0x495C,0x495D,INVALC, + 0x495E,INVALC,INVALC,INVALC,0x495F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4960,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4961,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 114, Array index 0x2A00 */ + INVALC,INVALC,INVALC,0x4962,0x4963,0x4964,0x4965,0x4966, + INVALC,INVALC,INVALC,0x4967,0x4968,INVALC,INVALC,0x4969, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x496A,INVALC, + 0x496B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x496C,INVALC,0x496D,INVALC,0x496E, + 0x496F,0x4970,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4971,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4972,INVALC,INVALC,INVALC,0x4973,0x4974,0x4975, + INVALC,INVALC,0x4976,0x4977,INVALC,INVALC,INVALC,INVALC, + 0x4978,INVALC,0x4979,INVALC,INVALC,INVALC,INVALC,0x497A, + INVALC,INVALC,0x497B,INVALC,0x497C,INVALC,0x497D,INVALC, + 0x497E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A21,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A22,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A23,INVALC,INVALC,INVALC,INVALC,0x4A24,INVALC,0x4A25, + INVALC,INVALC,INVALC,INVALC,0x4A26,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A27,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A28,0x4A29,INVALC,INVALC,INVALC,INVALC, + 0x4A2A,INVALC,0x4A2B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A2C, + 0x4A2D,INVALC,0x4A2E,0x4A2F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A30,INVALC,INVALC,INVALC,INVALC,0x4A31, + 0x4A32,0x4A33,INVALC,INVALC,0x4A34,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A35,0x4A36,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A37,INVALC,INVALC,0x4A38,INVALC, + INVALC,0x4A39,0x4A3A,INVALC,0x4A3B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A3C,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A3D,INVALC, + /* Block 115, Array index 0x2B00 */ + 0x4A3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A3F, + 0x4A40,0x4A41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A42,INVALC,INVALC,INVALC,0x4A43, + INVALC,INVALC,0x4A44,INVALC,INVALC,0x4A45,INVALC,0x4A46, + INVALC,INVALC,INVALC,INVALC,0x4A47,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A48,INVALC,INVALC,INVALC,0x4A49, + INVALC,INVALC,INVALC,INVALC,0x4A4A,INVALC,INVALC,INVALC, + 0x4A4B,0x4A4C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A4D,0x4A4E,0x4A4F,INVALC,0x4A50,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A51,0x4A52, + 0x4A53,INVALC,INVALC,0x4A54,INVALC,0x4A55,0x4A56,INVALC, + INVALC,INVALC,0x4A57,INVALC,0x4A58,INVALC,0x4A59,INVALC, + 0x4A5A,INVALC,INVALC,0x4A5B,INVALC,INVALC,INVALC,INVALC, + 0x4A5C,INVALC,INVALC,0x4A5D,INVALC,INVALC,0x4A5E,0x4A5F, + INVALC,0x4A60,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A61, + 0x4A62,INVALC,INVALC,0x4A63,0x4A64,INVALC,INVALC,0x4A65, + INVALC,INVALC,INVALC,INVALC,0x4A66,INVALC,INVALC,INVALC, + INVALC,0x4A67,INVALC,INVALC,INVALC,0x4A68,0x4A69,INVALC, + INVALC,INVALC,INVALC,0x4A6A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A6B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A6C,INVALC,INVALC,INVALC,INVALC,0x4A6D,0x4A6E,INVALC, + INVALC,0x4A6F,INVALC,INVALC,0x4A70,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A71,INVALC, + INVALC,0x4A72,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A73, + INVALC,0x4A74,INVALC,INVALC,0x4A75,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A76,0x4A77,INVALC, + 0x4A78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A79, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A7A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A7B,0x4A7C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A7D,0x4A7E,INVALC,INVALC,0x4B21,INVALC, + /* Block 116, Array index 0x2C00 */ + INVALC,INVALC,0x4B22,INVALC,0x4B23,0x4B24,INVALC,0x4B25, + INVALC,INVALC,INVALC,0x4B26,INVALC,0x4B27,INVALC,INVALC, + INVALC,INVALC,0x4B28,0x4B29,INVALC,INVALC,INVALC,INVALC, + 0x4B2A,0x4B2B,INVALC,INVALC,INVALC,INVALC,0x4B2C,INVALC, + INVALC,INVALC,0x4B2D,INVALC,0x4B2E,INVALC,INVALC,0x4B2F, + 0x4B30,INVALC,INVALC,INVALC,0x4B31,INVALC,INVALC,INVALC, + INVALC,0x4B32,0x4B33,INVALC,INVALC,0x4B34,INVALC,INVALC, + INVALC,INVALC,0x4B35,0x4B36,INVALC,0x4B37,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B38,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B39,INVALC,INVALC, + 0x4B3A,INVALC,0x4B3B,INVALC,INVALC,INVALC,0x4B3C,INVALC, + 0x4B3D,INVALC,INVALC,INVALC,INVALC,0x4B3E,0x4B3F,0x4B40, + 0x4B41,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B42,0x4B43, + INVALC,0x4B44,INVALC,0x4B45,0x4B46,INVALC,0x4B47,0x4B48, + INVALC,0x4B49,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B4A, + INVALC,0x4B4B,INVALC,INVALC,0x4B4C,INVALC,INVALC,INVALC, + 0x4B4D,0x4B4E,INVALC,0x4B4F,INVALC,0x4B50,0x4B51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B52,INVALC, + 0x4B53,INVALC,INVALC,0x4B54,INVALC,0x4B55,INVALC,0x4B56, + 0x4B57,INVALC,INVALC,INVALC,0x4B58,INVALC,0x4B59,0x4B5A, + 0x4B5B,INVALC,0x4B5C,INVALC,INVALC,0x4B5D,0x4B5E,INVALC, + INVALC,INVALC,0x4B5F,0x4B60,INVALC,0x4B61,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B62,INVALC,0x4B63, + INVALC,0x4B64,INVALC,INVALC,0x4B65,0x4B66,INVALC,0x4B67, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B68,0x4B69,INVALC, + INVALC,0x4B6A,INVALC,0x4B6B,0x4B6C,INVALC,INVALC,0x4B6D, + INVALC,INVALC,0x4B6E,0x4B6F,INVALC,INVALC,0x4B70,INVALC, + INVALC,0x4B71,INVALC,INVALC,INVALC,0x4B72,INVALC,INVALC, + INVALC,0x4B73,INVALC,0x4B74,INVALC,INVALC,0x4B75,0x4B76, + INVALC,0x4B77,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4B78,0x4B79,INVALC,0x4B7A, + INVALC,0x4B7B,0x4B7C,0x4B7D,INVALC,0x4B7E,INVALC,0x4C21, + /* Block 117, Array index 0x2D00 */ + 0x4C22,0x4C23,INVALC,INVALC,0x4C24,INVALC,INVALC,0x4C25, + INVALC,INVALC,0x4C26,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C27,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C28,0x4C29,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C2A,INVALC,0x4C2B,INVALC, + 0x4C2C,0x4C2D,0x4C2E,0x4C2F,0x4C30,0x4C31,0x4C32,0x4C33, + 0x4C34,0x4C35,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C37,INVALC,INVALC,0x4C38,0x4C39,INVALC,0x4C3A,0x4C3B, + INVALC,INVALC,INVALC,0x4C3C,INVALC,0x4C3D,INVALC,INVALC, + INVALC,0x4C3E,0x4C3F,INVALC,INVALC,INVALC,INVALC,0x4C40, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C41,INVALC,INVALC, + INVALC,INVALC,0x4C42,INVALC,INVALC,INVALC,0x4C43,0x4C44, + 0x4C45,INVALC,INVALC,0x4C46,INVALC,0x4C47,0x4C48,INVALC, + INVALC,0x4C49,0x4C4A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C4B,0x4C4C,INVALC,INVALC,INVALC,0x4C4D,0x4C4E,0x4C4F, + INVALC,0x4C50,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C51, + 0x4C52,0x4C53,0x4C54,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C55,0x4C56,0x4C57,INVALC,0x4C58,INVALC,INVALC,0x4C59, + 0x4C5A,0x4C5B,INVALC,0x4C5C,INVALC,INVALC,0x4C5D,INVALC, + 0x4C5E,0x4C5F,0x4C60,0x4C61,INVALC,INVALC,0x4C62,0x4C63, + INVALC,0x4C64,0x4C65,INVALC,INVALC,0x4C66,INVALC,INVALC, + INVALC,0x4C67,INVALC,0x4C68,INVALC,INVALC,INVALC,0x4C69, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C6A,0x4C6B,INVALC,INVALC,0x4C6C,INVALC,INVALC,INVALC, + 0x4C6D,INVALC,INVALC,0x4C6E,INVALC,INVALC,INVALC,INVALC, + 0x4C6F,INVALC,0x4C70,0x4C71,INVALC,INVALC,0x4C72,0x4C73, + INVALC,INVALC,INVALC,INVALC,0x4C74,INVALC,INVALC,INVALC, + 0x4C75,INVALC,0x4C76,0x4C77,INVALC,INVALC,INVALC,0x4C78, + INVALC,INVALC,INVALC,INVALC,0x4C79,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4C7A,0x4C7B,0x4C7C,INVALC,INVALC,0x4C7D, + /* Block 118, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C7E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D21,INVALC,INVALC,INVALC,0x4D22,0x4D23, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D24,0x4D25,INVALC,INVALC,0x4D26,INVALC,INVALC,0x4D27, + INVALC,0x4D28,0x4D29,INVALC,INVALC,INVALC,INVALC,0x4D2A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D2B,INVALC, + INVALC,0x4D2C,INVALC,INVALC,INVALC,0x4D2D,0x4D2E,0x4D2F, + 0x4D30,INVALC,INVALC,0x4D31,INVALC,INVALC,INVALC,0x4D32, + 0x4D33,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D34,INVALC, + 0x4D35,INVALC,0x4D36,INVALC,INVALC,INVALC,INVALC,0x4D37, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D38,0x4D39, + INVALC,0x4D3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D3B, + INVALC,0x4D3C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D3D,0x4D3E,0x4D3F,0x4D40,0x4D41,0x4D42,INVALC, + INVALC,0x4D43,INVALC,INVALC,INVALC,0x4D44,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D45,INVALC,0x4D46,0x4D47,INVALC,0x4D48,INVALC,INVALC, + INVALC,0x4D49,INVALC,INVALC,0x4D4A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D4B,INVALC,0x4D4C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D4D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4D4E,INVALC,INVALC,INVALC,INVALC,0x4D4F, + 0x4D50,0x4D51,INVALC,INVALC,0x4D52,INVALC,0x4D53,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D54,INVALC,0x4D55,0x4D56, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D57, + INVALC,INVALC,INVALC,INVALC,0x4D58,INVALC,INVALC,0x4D59, + 0x4D5A,0x4D5B,INVALC,INVALC,0x4D5C,INVALC,INVALC,0x4D5D, + INVALC,INVALC,INVALC,INVALC,0x4D5E,INVALC,0x4D5F,0x4D60, + INVALC,0x4D61,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D62,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 119, Array index 0x2F00 */ + 0x4D63,INVALC,0x4D64,0x4D65,0x4D66,INVALC,INVALC,0x4D67, + 0x4D68,INVALC,0x4D69,INVALC,0x4D6A,INVALC,INVALC,0x4D6B, + INVALC,INVALC,0x4D6C,0x4D6D,INVALC,0x4D6E,0x4D6F,INVALC, + INVALC,0x4D70,INVALC,0x4D71,0x4D72,0x4D73,0x4D74,INVALC, + INVALC,INVALC,INVALC,0x4D75,INVALC,0x4D76,0x4D77,INVALC, + INVALC,0x4D78,INVALC,INVALC,INVALC,0x4D79,INVALC,INVALC, + INVALC,INVALC,0x4D7A,0x4D7B,INVALC,0x4D7C,INVALC,INVALC, + 0x4D7D,0x4D7E,0x4E21,INVALC,0x4E22,INVALC,INVALC,INVALC, + 0x4E24,0x4E25,INVALC,0x4E26,0x4E27,0x4E28,INVALC,INVALC, + INVALC,0x4E29,0x4E23,0x4E2A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E2B,INVALC,INVALC, + INVALC,0x4E2C,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E2D, + INVALC,INVALC,INVALC,INVALC,0x4E2E,0x4E2F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E30,0x4E31,0x4E32, + INVALC,0x4E33,INVALC,INVALC,0x4E34,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E35,INVALC,INVALC,INVALC,0x4E36,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E37,0x4E38,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E39,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E3A,0x4E3B,0x4E3C,INVALC,0x4E3D, + 0x4E3E,INVALC,0x4E3F,0x4E40,0x4E41,0x4E42,0x4E43,0x4E44, + 0x4E45,INVALC,0x4E46,INVALC,INVALC,0x4E47,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E48,INVALC,INVALC, + INVALC,0x4E49,INVALC,INVALC,INVALC,0x4E4A,INVALC,INVALC, + INVALC,0x4E4B,INVALC,0x4E4C,0x4E4D,INVALC,0x4E4E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E4F,INVALC,INVALC,INVALC, + INVALC,0x4E50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E51,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E52,INVALC, + 0x4E53,INVALC,INVALC,INVALC,0x4E54,INVALC,INVALC,INVALC, + 0x4E55,0x4E56,INVALC,INVALC,INVALC,INVALC,0x4E57,INVALC, + INVALC,0x4E58,INVALC,INVALC,0x4E59,INVALC,INVALC,INVALC, + /* Block 120, Array index 0x3000 */ + 0x4E5A,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E5B,INVALC, + INVALC,INVALC,0x4E5C,INVALC,INVALC,INVALC,0x4E5D,INVALC, + INVALC,INVALC,0x4E5E,INVALC,0x4E5F,0x4E60,INVALC,0x4E61, + INVALC,0x4E62,0x4E63,INVALC,0x4E64,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E65,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E66,INVALC,INVALC,INVALC,INVALC,0x4E67,0x4E68,0x4E69, + INVALC,INVALC,INVALC,INVALC,0x4E6A,0x4E6B,0x4E6C,INVALC, + INVALC,0x4E6D,INVALC,INVALC,INVALC,0x4E6E,0x4E6F,INVALC, + INVALC,INVALC,0x4E70,INVALC,INVALC,0x4E71,0x4E72,INVALC, + INVALC,INVALC,0x4E73,INVALC,INVALC,0x4E74,0x4E75,0x4E76, + INVALC,INVALC,0x4E77,INVALC,INVALC,INVALC,0x4E78,0x4E79, + INVALC,INVALC,INVALC,INVALC,0x4E7A,INVALC,0x4E7B,0x4E7C, + 0x4E7D,INVALC,0x4E7E,INVALC,0x4F21,INVALC,INVALC,0x4F22, + INVALC,INVALC,0x4F23,INVALC,0x4F24,INVALC,INVALC,INVALC, + 0x4F25,INVALC,0x4F26,0x4F27,0x4F28,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F29,INVALC,INVALC,0x4F2A,INVALC,INVALC, + 0x4F2B,INVALC,INVALC,INVALC,0x4F2C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F2D,0x4F2E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F2F,0x4F30,0x4F31,INVALC, + INVALC,INVALC,0x4F32,INVALC,INVALC,INVALC,INVALC,0x4F33, + INVALC,INVALC,0x4F34,INVALC,INVALC,INVALC,INVALC,0x4F35, + INVALC,INVALC,0x4F36,INVALC,INVALC,INVALC,0x4F37,0x4F38, + INVALC,0x4F39,INVALC,INVALC,INVALC,0x4F3A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F3B,INVALC, + INVALC,INVALC,INVALC,0x4F3C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F3D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F3E,0x4F3F,INVALC,INVALC,0x4F40,INVALC,INVALC, + INVALC,0x4F41,INVALC,INVALC,INVALC,INVALC,0x4F42,0x4F43, + 0x4F44,INVALC,INVALC,INVALC,0x4F45,INVALC,0x4F46,INVALC, + INVALC,INVALC,0x4F47,INVALC,0x4F48,INVALC,INVALC,INVALC, + 0x4F49,0x4F4A,INVALC,INVALC,0x4F4B,INVALC,INVALC,INVALC, + 0x4F4C,INVALC,INVALC,0x4F4D,INVALC,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F4E,0x4F4F,INVALC, + INVALC,0x4F50,INVALC,INVALC,INVALC,0x4F51,0x4F52,INVALC, + INVALC,0x4F53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F54,INVALC,INVALC, + INVALC,0x4F55,0x4F56,0x4F57,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F58,0x4F59,INVALC, + 0x4F5A,INVALC,INVALC,INVALC,INVALC,0x4F5B,INVALC,0x4F5C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F5D,0x4F5E,INVALC,INVALC,0x4F5F, + 0x4F60,INVALC,INVALC,INVALC,0x4F61,INVALC,0x4F62,INVALC, + INVALC,INVALC,0x4F63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F64,INVALC,0x4F65,INVALC, + 0x4F66,0x4F67,INVALC,0x4F68,0x4F69,INVALC,INVALC,INVALC, + 0x4F6A,INVALC,0x4F6B,INVALC,INVALC,INVALC,0x4F6C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F6D,INVALC,INVALC,INVALC,0x4F6E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F6F,INVALC,INVALC,INVALC,INVALC,0x4F70, + INVALC,INVALC,INVALC,INVALC,0x4F71,INVALC,INVALC,INVALC, + 0x4F72,INVALC,INVALC,INVALC,INVALC,0x4F74,0x4F75,0x4F76, + INVALC,0x4F73,INVALC,INVALC,0x4F77,INVALC,INVALC,INVALC, + 0x4F78,INVALC,INVALC,INVALC,0x4F79,0x4F7A,INVALC,INVALC, + 0x4F7B,0x4F7C,0x4F7D,0x4F7E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5021,INVALC,0x5022,INVALC,0x5023, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5024, + 0x5025,0x5026,INVALC,INVALC,0x5027,INVALC,0x5028,INVALC, + INVALC,INVALC,0x5029,0x502A,INVALC,0x502B,0x502C,INVALC, + INVALC,INVALC,INVALC,0x502E,INVALC,INVALC,INVALC,0x502F, + 0x5030,0x5031,INVALC,INVALC,0x502D,INVALC,0x5032,INVALC, + INVALC,INVALC,0x5033,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5034,0x5035,INVALC,INVALC,0x5037,0x5038, + INVALC,INVALC,0x5039,0x503A,INVALC,INVALC,INVALC,0x503B, + /* Block 122, Array index 0x3200 */ + 0x5036,INVALC,INVALC,INVALC,INVALC,INVALC,0x503C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x503D,INVALC,INVALC,INVALC, + 0x503E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x503F,INVALC,0x5040,INVALC,0x5041,0x5042, + 0x5043,INVALC,INVALC,INVALC,INVALC,0x5044,INVALC,0x5045, + INVALC,0x5046,INVALC,INVALC,INVALC,0x5047,INVALC,INVALC, + INVALC,0x5048,INVALC,INVALC,0x5049,0x504A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x504B,INVALC,0x504C,INVALC,0x504D, + INVALC,INVALC,INVALC,INVALC,0x504E,0x504F,0x5050,INVALC, + INVALC,INVALC,0x5051,0x5052,INVALC,INVALC,INVALC,0x5053, + INVALC,0x5054,INVALC,INVALC,0x5055,INVALC,INVALC,INVALC, + 0x5056,INVALC,INVALC,0x5057,0x5058,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5059, + INVALC,0x505A,INVALC,0x505B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x505C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x505D,INVALC,0x505E,0x505F,INVALC,0x5060,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5061,0x5062,INVALC,INVALC,INVALC, + INVALC,0x5063,INVALC,0x5064,0x5065,0x5066,0x5067,INVALC, + 0x5068,INVALC,INVALC,0x5069,0x506A,INVALC,INVALC,INVALC, + INVALC,0x506B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x506C,0x506D,INVALC,0x506E,INVALC,INVALC,INVALC,0x506F, + INVALC,0x5070,INVALC,INVALC,0x5071,INVALC,INVALC,INVALC, + 0x5072,INVALC,INVALC,0x5073,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5074,INVALC,0x5075,INVALC,INVALC,0x5076, + 0x5077,INVALC,0x5078,INVALC,INVALC,INVALC,INVALC,0x5079, + INVALC,INVALC,INVALC,INVALC,0x507A,INVALC,0x507B,INVALC, + INVALC,INVALC,0x507C,INVALC,INVALC,0x507D,0x507E,INVALC, + 0x5121,INVALC,0x5122,INVALC,INVALC,0x5123,INVALC,INVALC, + INVALC,INVALC,0x5124,0x5125,INVALC,0x5126,INVALC,INVALC, + INVALC,0x5127,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5128,INVALC,INVALC,INVALC,0x5129,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x3300 */ + INVALC,INVALC,0x512A,0x512B,INVALC,INVALC,INVALC,0x512C, + INVALC,0x512D,0x512E,INVALC,0x512F,INVALC,INVALC,INVALC, + INVALC,0x5130,INVALC,INVALC,INVALC,0x5131,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5132,INVALC,INVALC,0x5133,INVALC, + INVALC,0x5134,INVALC,INVALC,INVALC,INVALC,INVALC,0x5135, + INVALC,INVALC,INVALC,0x5136,INVALC,0x5137,INVALC,0x5138, + 0x5139,INVALC,INVALC,INVALC,0x513A,0x513B,INVALC,INVALC, + 0x513C,0x513D,0x513E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x513F,0x5140,INVALC,0x5141, + 0x5142,INVALC,INVALC,INVALC,0x5143,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5144,0x5145,INVALC, + INVALC,0x5146,INVALC,INVALC,0x5147,0x5148,INVALC,0x5149, + 0x514A,INVALC,INVALC,INVALC,INVALC,0x514B,INVALC,0x514C, + INVALC,INVALC,0x514D,INVALC,INVALC,0x514E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x514F,INVALC,INVALC, + 0x5150,INVALC,INVALC,INVALC,INVALC,INVALC,0x5151,INVALC, + 0x5152,INVALC,0x5153,INVALC,INVALC,0x5154,0x5155,INVALC, + INVALC,INVALC,0x5156,0x5157,INVALC,INVALC,INVALC,INVALC, + 0x5158,0x5159,INVALC,INVALC,0x515A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x515B,INVALC, + 0x515C,INVALC,INVALC,0x515D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x515E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x515F,INVALC,0x5160,INVALC,INVALC, + INVALC,0x5161,INVALC,0x5162,0x5163,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5164,INVALC, + INVALC,0x5165,INVALC,INVALC,0x5166,INVALC,0x5167,INVALC, + INVALC,0x5168,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5169,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x516A,0x516B,INVALC,0x516C,0x516D,INVALC,INVALC,INVALC, + INVALC,0x516E,INVALC,INVALC,0x516F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5170,INVALC,0x5171,0x5172,INVALC, + /* Block 124, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5173, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5174,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5175, + INVALC,INVALC,INVALC,0x5176,INVALC,INVALC,INVALC,0x5177, + INVALC,0x5178,0x5179,0x517A,INVALC,0x517B,0x517C,0x517D, + 0x517E,0x5221,INVALC,INVALC,0x5222,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5223,INVALC,0x5224, + 0x5225,0x5226,INVALC,INVALC,INVALC,INVALC,INVALC,0x5227, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5228,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5229,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x522A,INVALC,INVALC,INVALC,0x522B,INVALC,0x522C,INVALC, + INVALC,0x522D,0x522E,INVALC,INVALC,0x522F,INVALC,0x5230, + INVALC,INVALC,0x5231,0x5232,INVALC,INVALC,INVALC,0x5233, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5234,INVALC,INVALC,INVALC, + INVALC,0x5235,INVALC,INVALC,INVALC,INVALC,0x5236,INVALC, + 0x5237,0x5238,INVALC,INVALC,INVALC,INVALC,0x5239,INVALC, + INVALC,INVALC,INVALC,0x523A,INVALC,INVALC,0x523B,INVALC, + 0x523C,INVALC,INVALC,INVALC,INVALC,0x523D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x523E,INVALC,INVALC,0x523F, + 0x5240,INVALC,0x5241,INVALC,INVALC,0x5242,0x5243,INVALC, + INVALC,INVALC,0x5244,0x5245,0x5246,0x5247,INVALC,INVALC, + INVALC,INVALC,0x5248,INVALC,INVALC,0x5249,INVALC,INVALC, + 0x524A,INVALC,0x524B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x524C,INVALC,0x524D,0x524E, + INVALC,0x524F,0x5250,0x5251,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5252,INVALC,0x5253,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5254,INVALC,0x5255,0x5256,INVALC,INVALC, + 0x5257,0x5258,0x5259,INVALC,0x525A,INVALC,0x525B,INVALC, + /* Block 125, Array index 0x3500 */ + INVALC,0x525C,0x525D,0x525E,0x525F,INVALC,0x5260,INVALC, + INVALC,0x5261,INVALC,0x5262,0x5263,INVALC,0x5264,0x5265, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5266,INVALC,0x5267,INVALC,INVALC,INVALC,INVALC, + 0x5268,INVALC,INVALC,INVALC,INVALC,0x5269,0x526A,INVALC, + 0x526B,INVALC,INVALC,INVALC,0x526C,INVALC,INVALC,INVALC, + INVALC,0x526D,INVALC,0x526E,0x526F,INVALC,0x5270,INVALC, + INVALC,0x5271,0x5272,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5273,INVALC, + INVALC,INVALC,0x5274,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5276,0x5277,0x5278,INVALC,0x5275,INVALC,INVALC, + INVALC,0x5279,0x527A,0x527B,0x527C,0x527D,0x527E,INVALC, + INVALC,0x5321,INVALC,0x5322,INVALC,INVALC,INVALC,0x5323, + INVALC,0x5324,INVALC,INVALC,INVALC,0x5325,0x5326,INVALC, + 0x5327,INVALC,0x5328,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5329,INVALC,INVALC,0x532A,0x532B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x532C,0x532D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x532E, + INVALC,INVALC,INVALC,INVALC,0x532F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5330,INVALC, + 0x5331,INVALC,INVALC,INVALC,INVALC,INVALC,0x5332,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5333,INVALC,INVALC,INVALC,INVALC,INVALC,0x5334,0x5335, + INVALC,INVALC,0x5336,0x5337,0x5338,INVALC,INVALC,0x5339, + INVALC,INVALC,INVALC,INVALC,0x533A,INVALC,INVALC,0x533B, + 0x533C,0x533D,INVALC,INVALC,INVALC,0x533E,INVALC,0x533F, + INVALC,INVALC,INVALC,0x5340,0x5341,0x5342,INVALC,0x5343, + INVALC,0x5344,0x5345,INVALC,INVALC,0x5346,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5347,INVALC, + INVALC,0x5348,INVALC,0x5349,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x534A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 126, Array index 0x3600 */ + INVALC,INVALC,INVALC,0x534B,INVALC,INVALC,INVALC,0x534C, + 0x534D,0x534E,INVALC,INVALC,INVALC,INVALC,INVALC,0x534F, + INVALC,0x5350,0x5351,0x5352,INVALC,INVALC,0x5353,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5354,0x5355,INVALC, + INVALC,INVALC,INVALC,0x5356,INVALC,INVALC,0x5357,INVALC, + INVALC,INVALC,0x5358,INVALC,INVALC,0x5359,INVALC,INVALC, + INVALC,0x535A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x535B,0x535C,0x535D,INVALC, + 0x535E,0x535F,INVALC,INVALC,INVALC,INVALC,INVALC,0x5360, + 0x5361,INVALC,INVALC,INVALC,INVALC,0x5362,INVALC,INVALC, + INVALC,0x5363,INVALC,0x5364,INVALC,INVALC,INVALC,0x5365, + INVALC,0x5366,0x5367,INVALC,0x5368,0x5369,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x536A,INVALC,0x536B, + INVALC,INVALC,0x536C,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x536D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x536E,INVALC,0x536F,0x5370,INVALC,INVALC,INVALC,0x5371, + INVALC,0x5372,0x5373,0x5374,INVALC,0x5375,0x5376,INVALC, + 0x5377,INVALC,INVALC,0x5378,0x5379,0x537A,INVALC,INVALC, + INVALC,0x537B,INVALC,INVALC,INVALC,INVALC,0x537C,0x537D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x537E,0x5421,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5422,0x5423, + INVALC,INVALC,0x5424,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5425,INVALC,INVALC,0x5426,0x5427, + INVALC,0x5428,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5429,0x542A,0x542B,0x542C,0x542D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x542E,0x542F,0x5430,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5431, + INVALC,0x5432,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5434,INVALC,INVALC,0x5435,0x5436,INVALC, + INVALC,INVALC,0x5437,0x5438,INVALC,0x5439,INVALC,INVALC, + INVALC,0x543A,INVALC,INVALC,INVALC,0x543B,0x543C,INVALC, + INVALC,0x543D,0x543E,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 127, Array index 0x3700 */ + 0x5433,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x543F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5440,0x5441,INVALC,INVALC,INVALC,0x5442,INVALC,0x5443, + INVALC,INVALC,INVALC,INVALC,0x5444,0x5445,INVALC,INVALC, + 0x5446,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5447, + 0x5448,INVALC,INVALC,INVALC,0x5449,0x544A,INVALC,0x544B, + INVALC,INVALC,INVALC,0x544C,INVALC,INVALC,0x544D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x544E, + INVALC,INVALC,INVALC,INVALC,0x544F,0x5450,INVALC,0x5451, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5452,INVALC, + 0x5453,INVALC,0x5454,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5455,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5456, + INVALC,0x5457,0x5458,INVALC,INVALC,0x5459,INVALC,INVALC, + INVALC,INVALC,INVALC,0x545A,INVALC,INVALC,0x545B,0x545C, + INVALC,INVALC,INVALC,0x545D,INVALC,INVALC,INVALC,INVALC, + 0x545E,INVALC,INVALC,INVALC,INVALC,INVALC,0x545F,INVALC, + INVALC,0x5460,INVALC,INVALC,INVALC,INVALC,0x5461,0x5462, + INVALC,INVALC,0x5463,INVALC,INVALC,0x5464,INVALC,INVALC, + INVALC,0x5465,INVALC,INVALC,INVALC,0x5466,INVALC,INVALC, + 0x5467,INVALC,0x5468,INVALC,INVALC,0x5469,0x546A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x546C,0x546B,0x546D,0x546E,0x546F, + INVALC,INVALC,INVALC,0x5470,0x5471,INVALC,INVALC,0x5472, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5473, + INVALC,INVALC,0x5474,0x5475,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5476,0x5477,0x5478,INVALC,INVALC, + INVALC,0x5479,INVALC,0x547A,0x547B,0x547C,0x547D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x547E,INVALC,INVALC, + INVALC,0x5521,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5522,0x5523,0x5524, + 0x5525,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5526,INVALC,0x5527,INVALC,0x5528, + 0x5529,0x552A,INVALC,INVALC,INVALC,INVALC,0x552B,0x552C, + INVALC,INVALC,INVALC,INVALC,0x552D,INVALC,INVALC,INVALC, + INVALC,0x552E,0x552F,INVALC,INVALC,INVALC,0x5530,INVALC, + INVALC,INVALC,0x5531,INVALC,INVALC,0x5532,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5533,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5534,INVALC,INVALC,0x5535, + 0x5536,INVALC,INVALC,0x5537,INVALC,INVALC,INVALC,INVALC, + 0x5538,INVALC,INVALC,INVALC,INVALC,INVALC,0x5539,0x553A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x553B,INVALC,INVALC,INVALC,0x553C, + INVALC,INVALC,INVALC,0x553D,INVALC,0x553E,INVALC,INVALC, + 0x553F,INVALC,INVALC,INVALC,0x5540,INVALC,0x5541,0x5542, + INVALC,INVALC,0x5543,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5544,INVALC,INVALC,0x5545,0x5546,0x5547, + /* Block 129, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5548, + 0x5549,INVALC,0x554A,INVALC,INVALC,0x554B,0x554C,0x554D, + INVALC,0x554E,INVALC,0x554F,0x5550,INVALC,0x5551,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5552,0x5553,0x5554, + 0x5555,INVALC,INVALC,INVALC,0x5556,INVALC,0x5557,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5558,INVALC,0x5559,INVALC, + 0x555A,INVALC,INVALC,INVALC,0x555B,0x555C,INVALC,0x555D, + INVALC,0x555E,0x555F,INVALC,0x5560,INVALC,0x5561,INVALC, + 0x5562,INVALC,INVALC,INVALC,0x5563,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5564,INVALC,INVALC,INVALC,0x5565,INVALC,0x5566,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5567,INVALC,INVALC, + INVALC,0x5568,INVALC,INVALC,INVALC,0x5569,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x556A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x556B,INVALC,INVALC,INVALC,INVALC,INVALC,0x556C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x556D,INVALC,0x556E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x556F,0x5570, + INVALC,INVALC,INVALC,0x5571,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5572,0x5573,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5574,INVALC,INVALC,INVALC,INVALC,0x5575,INVALC,0x5576, + INVALC,INVALC,0x5577,INVALC,0x5578,0x5579,INVALC,0x557A, + 0x557B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x557C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x557D,0x557E,INVALC, + 0x5621,INVALC,0x5622,0x5623,INVALC,INVALC,0x5624,INVALC, + INVALC,0x5625,0x5626,INVALC,INVALC,INVALC,0x5627,INVALC, + /* Block 130, Array index 0x3A00 */ + INVALC,INVALC,INVALC,0x5628,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5629,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x562A,0x562B, + 0x562C,INVALC,INVALC,INVALC,0x562D,INVALC,0x562E,INVALC, + 0x562F,INVALC,INVALC,INVALC,0x5630,INVALC,INVALC,0x5631, + INVALC,INVALC,INVALC,INVALC,0x5632,INVALC,INVALC,INVALC, + 0x5633,INVALC,INVALC,INVALC,INVALC,0x5634,INVALC,INVALC, + INVALC,INVALC,0x5635,INVALC,0x5636,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5637,INVALC,0x5638, + INVALC,INVALC,0x5639,INVALC,0x563A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x563B,INVALC,INVALC,INVALC,INVALC,0x563C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x563D,0x563E,INVALC,INVALC,INVALC,INVALC,INVALC,0x563F, + 0x5640,0x5641,INVALC,INVALC,INVALC,0x5642,INVALC,0x5643, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5644, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5645,INVALC,INVALC,0x5647,0x5648,0x5649,INVALC, + INVALC,INVALC,INVALC,0x564A,INVALC,INVALC,0x564B,INVALC, + 0x5646,INVALC,INVALC,INVALC,INVALC,INVALC,0x564C,INVALC, + 0x564D,INVALC,INVALC,0x564E,INVALC,INVALC,0x564F,INVALC, + INVALC,INVALC,0x5650,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5651,INVALC, + INVALC,INVALC,0x5652,INVALC,0x5653,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5654,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5656,INVALC,0x5657,INVALC,INVALC, + INVALC,INVALC,0x5658,0x5655,INVALC,INVALC,0x5659,0x565A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x565B,INVALC,0x565C, + INVALC,INVALC,INVALC,0x565D,INVALC,0x565E,0x565F,INVALC, + INVALC,0x5660,INVALC,INVALC,0x5661,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5662,0x5663,INVALC,INVALC,INVALC, + 0x5664,0x5665,0x5666,INVALC,INVALC,0x5667,0x5668,INVALC, + 0x5669,0x566A,INVALC,INVALC,INVALC,0x566B,INVALC,0x566C, + /* Block 131, Array index 0x3B00 */ + 0x566D,INVALC,INVALC,0x566E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x566F, + INVALC,INVALC,INVALC,0x5670,0x5671,INVALC,INVALC,INVALC, + INVALC,0x5672,0x5673,INVALC,INVALC,0x5674,INVALC,INVALC, + INVALC,0x5675,0x5676,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5677,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5678,INVALC,0x5679,INVALC,INVALC,INVALC, + INVALC,INVALC,0x567A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x567B,0x567C,0x567D,0x567E,INVALC, + INVALC,INVALC,INVALC,0x5721,INVALC,INVALC,0x5722,0x5723, + INVALC,0x5724,INVALC,INVALC,INVALC,INVALC,0x5725,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5726,INVALC,INVALC,INVALC, + 0x5727,INVALC,INVALC,0x5728,INVALC,INVALC,INVALC,0x5729, + INVALC,INVALC,INVALC,INVALC,INVALC,0x572A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x572B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x572C,INVALC,0x572D,INVALC,0x572E, + 0x572F,0x5730,INVALC,0x5731,0x5732,INVALC,INVALC,0x5733, + INVALC,0x5734,0x5735,INVALC,INVALC,INVALC,0x5736,INVALC, + INVALC,0x5737,INVALC,INVALC,0x5738,INVALC,0x5739,INVALC, + 0x573A,INVALC,0x573B,0x573C,INVALC,INVALC,INVALC,INVALC, + 0x573D,0x573E,INVALC,0x573F,0x5740,INVALC,INVALC,0x5741, + 0x5742,0x5743,0x5744,INVALC,INVALC,INVALC,0x5745,INVALC, + 0x5746,INVALC,0x5747,INVALC,0x5748,INVALC,INVALC,0x5749, + INVALC,INVALC,0x574A,INVALC,0x574B,INVALC,0x574C,0x574D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x574E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x574F,INVALC,INVALC,INVALC,INVALC,0x5750,INVALC,INVALC, + INVALC,INVALC,0x5751,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5752,INVALC,0x5753,INVALC,0x5754,INVALC,INVALC,INVALC, + 0x5755,INVALC,0x5756,INVALC,INVALC,0x5757,INVALC,0x5758, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5759,0x575A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x575B,0x575C,INVALC, + /* Block 132, Array index 0x3C00 */ + 0x575D,0x575E,INVALC,INVALC,INVALC,INVALC,INVALC,0x575F, + 0x5760,INVALC,0x5761,0x5762,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5764,INVALC,0x5765,0x5766,0x5767, + INVALC,0x5768,0x5769,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x576A,0x576B,0x576C,INVALC, + 0x576D,INVALC,INVALC,0x576E,INVALC,INVALC,INVALC,0x576F, + INVALC,INVALC,0x5770,INVALC,0x5771,0x5772,INVALC,INVALC, + INVALC,INVALC,0x5773,0x5774,0x5775,INVALC,INVALC,0x5776, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5777,0x5778,INVALC, + INVALC,0x5779,INVALC,0x583E,0x5763,0x577A,0x577B,0x577C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x577D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x577E,INVALC,INVALC,INVALC,INVALC,0x5821,INVALC,0x5822, + 0x5823,INVALC,0x5824,INVALC,0x5825,INVALC,0x5826,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5827,INVALC,INVALC, + INVALC,INVALC,0x5828,INVALC,0x5829,0x582A,INVALC,INVALC, + 0x582B,0x582C,INVALC,0x582D,0x582E,0x582F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5830,0x5831, + INVALC,0x5832,INVALC,INVALC,0x5833,0x584C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5834,0x5835, + 0x5836,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5837, + INVALC,0x5838,INVALC,INVALC,INVALC,INVALC,INVALC,0x5839, + 0x583A,0x583B,INVALC,INVALC,0x583C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x583D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x583F,INVALC,0x5840,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5841,INVALC, + 0x5842,0x5843,INVALC,INVALC,0x5844,INVALC,INVALC,INVALC, + /* Block 133, Array index 0x3D00 */ + INVALC,0x5845,INVALC,INVALC,INVALC,INVALC,0x5846,INVALC, + INVALC,INVALC,0x5847,INVALC,INVALC,INVALC,INVALC,0x5848, + INVALC,0x5849,INVALC,INVALC,INVALC,0x584A,INVALC,INVALC, + INVALC,0x584B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x584D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x584E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x584F,INVALC,0x5850, + 0x5851,INVALC,0x5852,INVALC,INVALC,0x5853,INVALC,0x5854, + INVALC,0x5855,0x5856,INVALC,INVALC,INVALC,0x5857,INVALC, + 0x5858,0x5859,0x585A,INVALC,0x585B,INVALC,INVALC,INVALC, + 0x585C,INVALC,INVALC,INVALC,0x585D,0x585E,INVALC,0x585F, + INVALC,INVALC,0x5860,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5861,INVALC,INVALC,0x5862,0x5863,INVALC,0x5864,INVALC, + 0x5865,INVALC,INVALC,INVALC,0x5866,0x5867,INVALC,INVALC, + INVALC,0x5868,INVALC,INVALC,INVALC,0x5869,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x586A,0x586B,INVALC,0x586C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x586D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x586E,INVALC, + 0x586F,0x5870,0x5871,INVALC,INVALC,INVALC,INVALC,0x5872, + INVALC,0x5873,INVALC,INVALC,0x5874,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5875,INVALC,INVALC,0x5876,0x5877,INVALC, + 0x5878,INVALC,0x5879,INVALC,INVALC,INVALC,INVALC,0x587A, + 0x587B,INVALC,INVALC,INVALC,0x587C,INVALC,INVALC,0x587D, + INVALC,INVALC,INVALC,0x587E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5921,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5922, + INVALC,INVALC,0x5923,INVALC,INVALC,INVALC,INVALC,0x5924, + 0x5925,0x5926,0x5927,INVALC,INVALC,INVALC,INVALC,0x5928, + INVALC,INVALC,0x592A,0x592B,INVALC,0x592C,INVALC,INVALC, + /* Block 134, Array index 0x3E00 */ + INVALC,INVALC,0x592D,0x592E,INVALC,INVALC,INVALC,0x592F, + INVALC,INVALC,INVALC,INVALC,0x5930,INVALC,0x5931,INVALC, + 0x5932,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5933,INVALC,0x5934,INVALC, + INVALC,INVALC,0x5935,0x5936,0x5937,0x5938,INVALC,0x5939, + INVALC,INVALC,0x593A,0x593B,INVALC,INVALC,INVALC,0x593C, + INVALC,INVALC,0x5929,0x593D,0x593E,INVALC,0x593F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5940, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5941,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5942, + 0x5943,0x5944,0x5945,0x5946,INVALC,INVALC,0x5947,INVALC, + INVALC,0x5948,INVALC,INVALC,0x5949,0x594A,0x594B,0x594C, + 0x594D,0x594E,0x594F,INVALC,0x5950,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5951,INVALC,INVALC,INVALC,0x5952, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5953,0x5954,0x5955,INVALC,0x5956,INVALC,0x5957, + INVALC,0x5958,INVALC,INVALC,INVALC,0x5959,0x595A,INVALC, + INVALC,0x595B,INVALC,0x595C,0x595D,INVALC,INVALC,0x595E, + INVALC,INVALC,INVALC,0x595F,INVALC,INVALC,INVALC,INVALC, + 0x5960,INVALC,INVALC,INVALC,INVALC,0x5961,INVALC,0x5962, + 0x5963,INVALC,0x5964,INVALC,INVALC,0x5965,INVALC,0x5966, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5974,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5967,INVALC,0x5968,0x5969, + 0x596A,INVALC,INVALC,INVALC,0x596B,0x596C,0x596D,0x596E, + INVALC,INVALC,0x596F,INVALC,INVALC,INVALC,INVALC,0x5970, + INVALC,INVALC,0x5971,0x5972,INVALC,INVALC,0x5973,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5975,INVALC,0x5976,INVALC,INVALC,INVALC,INVALC,0x5977, + 0x5978,INVALC,INVALC,INVALC,INVALC,INVALC,0x5979,INVALC, + 0x597A,INVALC,INVALC,INVALC,INVALC,0x597B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x597C,INVALC,INVALC,0x597D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x597E,INVALC,INVALC,0x5A21, + /* Block 135, Array index 0x3F00 */ + 0x5A22,INVALC,INVALC,INVALC,0x5A23,0x5A24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A25,0x5A26,INVALC, + 0x5A27,0x5A28,0x5A29,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A2A,0x5A2B,INVALC,0x5A2C,INVALC,INVALC,0x5A2D,INVALC, + INVALC,0x5A2E,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A2F, + INVALC,0x5A30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A31,INVALC, + 0x5A32,INVALC,0x5A33,INVALC,0x5A34,0x5A35,INVALC,INVALC, + 0x5A36,0x3866,0x5A37,INVALC,INVALC,INVALC,0x5A38,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A39,0x5A3A,INVALC,INVALC,0x5A3B,0x5A3C, + 0x5A3D,0x5A3E,INVALC,INVALC,INVALC,0x5A3F,INVALC,INVALC, + 0x5A40,0x5A41,0x5A42,0x5A43,0x5A44,INVALC,INVALC,INVALC, + INVALC,0x5A45,INVALC,INVALC,0x5A46,INVALC,INVALC,0x5A47, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5A48,0x5A49,0x5A4A, + INVALC,INVALC,0x5A4B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A6D,INVALC,INVALC,INVALC,INVALC,0x5A4C,INVALC,INVALC, + INVALC,0x5A4D,INVALC,INVALC,INVALC,INVALC,0x5A4E,INVALC, + 0x5A4F,INVALC,0x5A50,INVALC,0x5A51,INVALC,INVALC,INVALC, + INVALC,0x5A52,INVALC,INVALC,INVALC,INVALC,0x5A53,0x5A54, + 0x5A55,INVALC,INVALC,INVALC,INVALC,0x5A56,INVALC,INVALC, + INVALC,0x5A57,INVALC,0x5A58,0x5A59,0x5A5A,INVALC,0x5A5B, + 0x5A5C,0x5A5D,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A5E, + 0x5A5F,0x5A60,INVALC,0x5A61,INVALC,0x5A62,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A63,0x5A64,INVALC,INVALC,0x5A65,INVALC,0x5A66, + INVALC,INVALC,0x5A67,INVALC,0x5A68,INVALC,INVALC,INVALC, + 0x5A69,INVALC,INVALC,0x5A6A,INVALC,0x5A6B,INVALC,0x5A6C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A6E,INVALC,0x5A6F,0x5A70,INVALC,INVALC, + /* Block 136, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,0x5A71,0x5A72,INVALC,0x5A73, + INVALC,INVALC,INVALC,0x5A74,INVALC,INVALC,0x5A75,0x5A76, + 0x5A77,INVALC,INVALC,0x5A78,0x5A79,INVALC,INVALC,INVALC, + INVALC,0x5A7A,INVALC,INVALC,INVALC,INVALC,0x5A7B,0x5A7C, + INVALC,0x5A7D,INVALC,0x5A7E,INVALC,INVALC,INVALC,INVALC, + 0x5B21,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B22,0x5B23, + INVALC,0x5B24,0x5B25,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B26,0x5B27,INVALC,0x5B28,0x5B29,0x5B2A,INVALC, + 0x5B2B,INVALC,INVALC,0x5B2C,INVALC,0x5B2D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B2E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B2F,INVALC,INVALC,INVALC,INVALC,0x5B30,INVALC,INVALC, + INVALC,0x5B31,INVALC,INVALC,0x5B32,0x5B33,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B34, + INVALC,0x5B35,0x5B36,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B37,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5B38,0x5B39,0x5B3A,0x5B3B,0x5B3C, + 0x5B3D,0x5B3E,INVALC,0x5B3F,0x5B40,INVALC,INVALC,INVALC, + 0x5B41,INVALC,INVALC,0x5B42,INVALC,0x5B43,INVALC,0x5B44, + 0x5B45,0x5B46,INVALC,INVALC,INVALC,INVALC,0x5B47,INVALC, + 0x5B48,INVALC,INVALC,0x5B49,INVALC,INVALC,INVALC,0x5B4A, + INVALC,INVALC,INVALC,INVALC,0x5B4B,0x5B4C,0x5B4D,INVALC, + INVALC,0x5B4E,INVALC,INVALC,INVALC,0x5B4F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B50,0x5B51, + INVALC,0x5B52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B53,0x5B54,0x5B55,INVALC,INVALC,INVALC,0x5B56,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B57,0x5B58,INVALC, + INVALC,0x5B59,0x5B5A,INVALC,0x5B5B,INVALC,INVALC,0x5B5C, + INVALC,INVALC,0x5B5D,0x5B5E,0x5B5F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B60,0x5B61,INVALC,0x5B62,INVALC,INVALC, + INVALC,0x5B63,INVALC,0x5B64,INVALC,INVALC,INVALC,INVALC, + 0x5B65,INVALC,0x5B66,INVALC,INVALC,INVALC,INVALC,0x5B67, + /* Block 137, Array index 0x4100 */ + INVALC,0x5B68,INVALC,0x5B69,INVALC,INVALC,0x5B6A,INVALC, + INVALC,0x5B6B,0x5B6C,0x5B6D,INVALC,INVALC,INVALC,INVALC, + 0x5B6E,INVALC,0x5B70,0x5B71,0x5B72,INVALC,INVALC,INVALC, + 0x5B73,0x5B6F,0x5B74,0x5B75,0x5B76,INVALC,0x5B77,0x5B78, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5B79,INVALC,INVALC,INVALC,INVALC,0x5B7A,0x5B7B,INVALC, + 0x5B7C,INVALC,0x5B7D,INVALC,INVALC,0x5B7E,INVALC,INVALC, + INVALC,INVALC,0x5C21,INVALC,0x5C22,INVALC,INVALC,INVALC, + INVALC,0x5C23,INVALC,0x5C24,INVALC,0x5C25,INVALC,INVALC, + 0x5C26,0x5C27,0x5C28,0x5C29,INVALC,INVALC,0x5C2A,INVALC, + INVALC,0x5C2B,INVALC,INVALC,INVALC,0x5C2C,0x5C2D,INVALC, + 0x5C2E,INVALC,0x5C2F,INVALC,0x5C30,INVALC,INVALC,0x5C31, + 0x5C32,INVALC,INVALC,INVALC,0x5C33,INVALC,INVALC,INVALC, + INVALC,0x5C34,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C35,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C36,INVALC,0x5C37,INVALC,INVALC,INVALC,INVALC, + 0x5C38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C39,INVALC,0x5C3A,0x5C3B,0x5C3C,INVALC,INVALC,0x5C3D, + 0x5C3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C3F,INVALC,0x5C40,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C41,INVALC,INVALC,0x5C42,0x5C43,INVALC, + 0x5C44,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C45,0x5C46,0x5C47,0x5C48,0x5C49,INVALC, + INVALC,0x5C4A,0x5C4B,0x5C4C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C4D,INVALC,INVALC,0x5C4E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C4F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C50, + 0x5C51,0x5C52,INVALC,INVALC,INVALC,0x5C53,INVALC,0x5C54, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 138, Array index 0x4200 */ + INVALC,0x5C55,INVALC,INVALC,INVALC,INVALC,0x5C56,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C57,0x5C58,0x5C59, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C5A,0x5C5B,INVALC, + 0x5C5C,0x5C5D,0x5C5E,INVALC,0x5C5F,INVALC,INVALC,INVALC, + 0x5C60,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C61,0x5C62, + 0x5C63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C64,0x5C65,0x5C66,INVALC,INVALC,0x5C67,INVALC,INVALC, + INVALC,0x5C68,0x5C69,INVALC,INVALC,INVALC,0x5C6A,INVALC, + 0x5C6B,INVALC,0x5C6C,INVALC,INVALC,0x5C6D,0x5C6E,INVALC, + INVALC,0x5C6F,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C70, + INVALC,INVALC,0x5C71,INVALC,INVALC,INVALC,INVALC,0x5C72, + INVALC,INVALC,0x5C73,0x5C74,0x5C75,INVALC,INVALC,INVALC, + INVALC,0x5C76,0x5C77,0x5C78,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C79,INVALC,INVALC,0x5C7A,INVALC, + 0x5C7B,INVALC,INVALC,0x5C7C,INVALC,0x5C7D,INVALC,INVALC, + INVALC,INVALC,0x5C7E,0x5D21,0x5D22,0x5D23,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D24,INVALC,INVALC,INVALC,0x5D25,INVALC,INVALC, + 0x5D26,INVALC,INVALC,INVALC,0x5D27,0x5D28,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D29,0x5D2A,INVALC,INVALC,0x5D2B, + 0x5D2C,INVALC,INVALC,INVALC,INVALC,0x5D2D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D2E,INVALC,INVALC,INVALC,0x5D2F,0x5D30,0x5D31,0x5D32, + INVALC,INVALC,INVALC,INVALC,0x5D33,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D34,0x5D35,0x5D36,0x5D37, + 0x5D38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D39,INVALC,INVALC, + INVALC,0x5D3A,INVALC,0x5D3B,INVALC,0x5D3C,INVALC,INVALC, + INVALC,0x5D3D,INVALC,0x5D3E,INVALC,INVALC,0x5D3F,INVALC, + INVALC,0x5D40,INVALC,INVALC,INVALC,0x5D41,INVALC,0x5D42, + /* Block 139, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,0x5D43,0x5D44,INVALC,0x5D45, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D46, + INVALC,0x5D47,0x5D48,INVALC,0x5D49,0x5D4A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D4B,INVALC, + 0x5D4C,INVALC,0x5D4D,INVALC,0x5D4E,INVALC,0x5D4F,INVALC, + INVALC,INVALC,INVALC,0x5D50,0x5D51,INVALC,INVALC,0x5D52, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D53,INVALC,0x5D54, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D55,0x5D56,INVALC, + 0x5D57,INVALC,INVALC,0x5D58,INVALC,0x5D59,INVALC,0x5D5A, + INVALC,0x5D5B,INVALC,INVALC,INVALC,0x5D5C,0x5D5D,INVALC, + INVALC,INVALC,INVALC,0x5D5E,INVALC,INVALC,0x5D5F,0x5D60, + 0x5D61,INVALC,INVALC,INVALC,0x5D62,0x5D63,INVALC,INVALC, + INVALC,0x5D64,INVALC,INVALC,INVALC,0x5D65,INVALC,0x5D66, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5D67,0x5D68,0x5D69, + INVALC,0x5D6A,0x5D6B,0x5D6C,INVALC,INVALC,0x5D6D,0x5D6E, + 0x5D6F,INVALC,INVALC,0x5D70,INVALC,INVALC,0x5D71,INVALC, + INVALC,INVALC,INVALC,0x5D72,INVALC,INVALC,INVALC,0x5D73, + 0x5D74,INVALC,0x5D75,INVALC,INVALC,INVALC,0x5D76,0x5D77, + INVALC,0x5D78,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D79, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D7A, + INVALC,0x5D7B,INVALC,INVALC,INVALC,INVALC,0x5D7C,0x5D7D, + INVALC,INVALC,INVALC,0x5D7E,INVALC,INVALC,0x5E21,0x5E22, + INVALC,INVALC,INVALC,0x5E23,INVALC,INVALC,0x5E24,INVALC, + INVALC,INVALC,INVALC,0x5E25,INVALC,INVALC,0x5E26,INVALC, + 0x5E27,0x5E28,0x5E29,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E2A,INVALC,0x5E2B,0x5E2C,0x5E2D,INVALC,0x5E2E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E2F,INVALC,0x5E30, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E31,INVALC,INVALC,INVALC, + 0x5E32,INVALC,INVALC,INVALC,0x5E33,0x5E34,0x5E35,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E36,INVALC,INVALC,0x5E37, + /* Block 140, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E38,0x5E39,INVALC, + INVALC,INVALC,0x5E3F,0x5E3A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E3B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E3C,INVALC,0x5E3D,0x5E3E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E40,INVALC,INVALC, + 0x5E41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E42, + INVALC,INVALC,INVALC,INVALC,0x5E43,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E44,0x5E45,0x5E46,0x5E47,0x5E48,INVALC, + 0x5E49,INVALC,INVALC,INVALC,INVALC,0x5E4E,INVALC,INVALC, + INVALC,INVALC,0x5E4A,0x5E4B,0x5E4C,INVALC,INVALC,INVALC, + INVALC,0x5E4D,INVALC,INVALC,INVALC,INVALC,0x5E4F,INVALC, + INVALC,INVALC,INVALC,0x5E50,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E51,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E52,INVALC, + 0x5E53,0x5E54,INVALC,INVALC,0x5E55,INVALC,0x5E56,INVALC, + INVALC,0x5E57,INVALC,INVALC,0x5E58,0x5E59,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E5A,INVALC,0x5E5B,INVALC,0x5E5C, + INVALC,INVALC,INVALC,INVALC,0x5E5D,0x5E5E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E5F,INVALC,0x5E60,0x5E61, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E62,0x5E63,INVALC,INVALC,INVALC,0x5E64,0x5E65,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E66,INVALC,0x5E67, + INVALC,0x5E68,INVALC,0x5E69,INVALC,INVALC,INVALC,0x5E6A, + INVALC,0x5E6B,INVALC,0x5E6C,0x5E6D,INVALC,INVALC,0x5E6E, + 0x5E6F,0x5E72,INVALC,0x5E70,INVALC,0x5E71,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E73,0x5E74,INVALC,0x5E75,INVALC, + 0x5E76,0x5E77,INVALC,INVALC,INVALC,0x5E78,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E79,INVALC,0x5E7A,0x5E7B,INVALC, + INVALC,INVALC,INVALC,0x5E7C,INVALC,INVALC,0x5E7D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E7E,0x5F21, + INVALC,INVALC,INVALC,0x5F22,INVALC,INVALC,INVALC,INVALC, + 0x5F23,INVALC,0x5F24,0x5F25,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F26,INVALC,0x5F27,0x5F28,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F29,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F2A,0x5F2B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F2C,0x5F2D,INVALC, + INVALC,0x5F2E,INVALC,0x5F2F,INVALC,INVALC,INVALC,0x5F30, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F32,0x5F31,INVALC, + INVALC,0x5F33,INVALC,INVALC,INVALC,0x5F34,INVALC,INVALC, + INVALC,0x5F35,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F36,INVALC,INVALC,INVALC,0x5F37,INVALC,INVALC,0x5F38, + 0x5F39,INVALC,0x5F3A,INVALC,INVALC,0x5F3B,INVALC,0x5F3C, + 0x5F3D,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F3E,0x5F3F, + /* Block 142, Array index 0x4600 */ + INVALC,0x5F40,INVALC,0x5F41,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F43,INVALC,INVALC,INVALC,INVALC,0x5F44, + INVALC,INVALC,INVALC,0x5F45,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F46,INVALC,INVALC, + INVALC,0x5F47,INVALC,INVALC,0x5F48,INVALC,0x5F49,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F4A, + INVALC,INVALC,0x5F4B,INVALC,0x5F4C,INVALC,INVALC,INVALC, + 0x5F4D,INVALC,INVALC,INVALC,INVALC,0x5F4E,INVALC,INVALC, + 0x5F4F,0x5F50,INVALC,INVALC,INVALC,0x5F51,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F52,0x5F53, + 0x5F54,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F55,INVALC, + INVALC,INVALC,INVALC,0x5F56,0x5F57,INVALC,INVALC,0x5F58, + INVALC,INVALC,0x5F59,INVALC,INVALC,0x5F5A,INVALC,0x5F5B, + INVALC,0x5F5C,INVALC,0x5F5D,0x5F6F,INVALC,INVALC,INVALC, + 0x5F5E,INVALC,INVALC,INVALC,INVALC,0x5F5F,0x5F60,0x5F61, + 0x5F62,INVALC,0x5F63,INVALC,INVALC,INVALC,0x5F64,INVALC, + INVALC,0x5F65,INVALC,INVALC,0x5F66,0x5F67,INVALC,0x5F68, + INVALC,0x5F69,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F6A,0x5F6B,INVALC,0x5F6C, + INVALC,INVALC,INVALC,INVALC,0x5F6D,INVALC,INVALC,INVALC, + 0x5F6E,0x5F70,0x5F71,INVALC,0x5F72,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F73,INVALC,INVALC, + /* Block 143, Array index 0x4700 */ + INVALC,0x5F74,INVALC,INVALC,0x5F75,0x5F76,0x5F77,INVALC, + INVALC,INVALC,INVALC,0x5F78,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F79,INVALC,INVALC,0x5F7A,INVALC,0x5F7B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F7C,0x5F7D,0x5F7E,0x6021,INVALC,INVALC,0x6022,0x6023, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6024,INVALC,0x6025,INVALC,INVALC,0x6026,0x6027, + 0x6028,0x6029,INVALC,INVALC,INVALC,0x602A,INVALC,INVALC, + 0x602B,0x602C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x602D,INVALC,0x602E,0x602F,0x6030, + INVALC,INVALC,INVALC,INVALC,0x6031,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6032,0x6033,0x6034,0x6035,INVALC, + INVALC,0x6036,0x6037,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6038,INVALC,INVALC,0x6039,0x603A,INVALC,0x603B, + 0x603C,0x603D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x603E,0x603F,0x6040,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6041,0x6042,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6043,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6044,INVALC,0x6045,INVALC,INVALC,0x6046,INVALC,INVALC, + INVALC,INVALC,0x6047,0x6048,INVALC,0x6049,0x604A,INVALC, + INVALC,INVALC,0x604B,INVALC,INVALC,INVALC,INVALC,0x604C, + INVALC,0x604D,INVALC,INVALC,INVALC,0x604E,0x604F,INVALC, + INVALC,INVALC,INVALC,0x6050,INVALC,0x6051,INVALC,INVALC, + INVALC,INVALC,0x6052,0x6053,INVALC,INVALC,INVALC,INVALC, + 0x6054,0x6055,INVALC,0x6056,0x6057,INVALC,INVALC,0x6058, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6059, + INVALC,0x605A,INVALC,INVALC,0x605B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x605C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x605D,INVALC,INVALC,INVALC,INVALC,0x6064,0x605E,INVALC, + 0x605F,0x6060,INVALC,INVALC,INVALC,INVALC,INVALC,0x6061, + INVALC,0x6062,0x6063,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 144, Array index 0x4800 */ + 0x6065,INVALC,0x6066,INVALC,INVALC,INVALC,INVALC,0x6067, + 0x6068,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6069, + 0x606A,INVALC,INVALC,INVALC,INVALC,INVALC,0x606B,0x606C, + 0x606D,INVALC,INVALC,INVALC,INVALC,INVALC,0x606E,INVALC, + 0x606F,0x6070,INVALC,0x6071,INVALC,0x6072,INVALC,0x6073, + 0x6074,INVALC,INVALC,INVALC,0x6075,0x6076,0x6077,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6078,0x6079,0x607A,0x607B, + INVALC,INVALC,0x607C,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x607D,0x607E,INVALC,0x6121,INVALC,INVALC,INVALC,0x6122, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6123, + INVALC,0x6124,0x6125,0x6126,0x6127,0x6128,INVALC,INVALC, + 0x6129,INVALC,INVALC,INVALC,INVALC,0x612A,0x612B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x612C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x612D,INVALC,INVALC, + 0x612E,0x612F,INVALC,INVALC,0x6130,0x6131,0x6132,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6133,0x6134,INVALC, + 0x6135,INVALC,INVALC,INVALC,INVALC,INVALC,0x6136,INVALC, + 0x6137,0x6138,INVALC,INVALC,INVALC,INVALC,0x6139,INVALC, + INVALC,INVALC,0x613A,0x613B,INVALC,0x613C,INVALC,INVALC, + 0x613D,INVALC,0x613E,0x613F,INVALC,0x6140,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6141,INVALC,INVALC,0x6142,0x6143,INVALC,INVALC,INVALC, + 0x6144,INVALC,INVALC,INVALC,INVALC,INVALC,0x6145,INVALC, + INVALC,0x6146,INVALC,INVALC,INVALC,0x6147,0x6148,INVALC, + INVALC,INVALC,INVALC,0x6149,INVALC,INVALC,0x614A,INVALC, + /* Block 145, Array index 0x4900 */ + INVALC,INVALC,0x614B,INVALC,0x614C,INVALC,INVALC,INVALC, + 0x614D,INVALC,INVALC,INVALC,0x614E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x614F,INVALC,INVALC,0x6150,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6151,0x6152,0x6154,INVALC,0x6155,0x6156,INVALC,0x6153, + INVALC,INVALC,INVALC,0x6157,0x6158,INVALC,INVALC,0x6159, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x615A, + INVALC,INVALC,INVALC,0x615B,0x615C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x615D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x615E,INVALC,0x615F,INVALC,INVALC, + INVALC,INVALC,0x6160,INVALC,INVALC,INVALC,0x6161,0x6162, + INVALC,INVALC,INVALC,INVALC,0x6163,INVALC,INVALC,INVALC, + 0x6164,INVALC,INVALC,INVALC,0x6165,INVALC,INVALC,INVALC, + INVALC,0x6166,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6167,INVALC,INVALC, + 0x6168,INVALC,INVALC,0x6169,0x616A,INVALC,0x616B,INVALC, + 0x616C,INVALC,INVALC,INVALC,INVALC,0x616D,INVALC,0x616E, + 0x616F,0x6170,INVALC,0x6171,INVALC,INVALC,INVALC,INVALC, + 0x6172,0x6173,0x6174,INVALC,INVALC,0x6175,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6176,INVALC,0x6177,0x6178,0x6179,INVALC,0x617A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x617B,0x617D,INVALC, + INVALC,INVALC,INVALC,0x617E,0x6221,0x6222,INVALC,0x6223, + 0x6224,INVALC,INVALC,INVALC,0x617C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x622D,INVALC,INVALC,0x6225,INVALC,0x6226, + 0x6227,0x6228,INVALC,INVALC,0x6229,0x622A,INVALC,0x622B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x622C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x622F,INVALC,INVALC,INVALC,0x6230, + 0x6231,INVALC,INVALC,INVALC,0x6232,INVALC,0x622E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6233,0x6234, + /* Block 146, Array index 0x4A00 */ + 0x6235,INVALC,INVALC,INVALC,0x6236,0x6237,0x6238,INVALC, + 0x6239,INVALC,INVALC,INVALC,INVALC,0x623A,INVALC,INVALC, + 0x623B,INVALC,INVALC,INVALC,0x623C,INVALC,0x623D,0x623E, + 0x623F,INVALC,0x6240,INVALC,0x6241,INVALC,0x6242,INVALC, + 0x6243,INVALC,0x6245,0x6246,INVALC,0x6244,INVALC,0x6247, + INVALC,0x6248,INVALC,INVALC,INVALC,INVALC,0x6249,0x624A, + INVALC,0x624B,INVALC,INVALC,0x624C,INVALC,0x624D,0x624E, + INVALC,0x624F,0x6250,INVALC,0x6251,0x6252,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6253,INVALC,INVALC,INVALC,0x6254, + 0x6255,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6256, + INVALC,INVALC,INVALC,0x6257,INVALC,INVALC,INVALC,0x6258, + INVALC,0x6259,0x625A,0x625B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x625C,INVALC,INVALC,0x625D,INVALC,INVALC,0x625E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x625F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6260,INVALC,INVALC,INVALC, + INVALC,0x6261,0x6262,0x6263,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6264,INVALC,0x6265,INVALC,0x6266,0x6267,INVALC, + INVALC,INVALC,0x6268,INVALC,INVALC,INVALC,0x6269,INVALC, + INVALC,0x626A,INVALC,0x626B,0x626C,0x626D,INVALC,INVALC, + 0x626E,INVALC,INVALC,INVALC,INVALC,INVALC,0x626F,INVALC, + INVALC,0x6270,INVALC,INVALC,INVALC,INVALC,0x6271,INVALC, + 0x6272,INVALC,INVALC,INVALC,0x6273,0x6274,0x6275,INVALC, + 0x6276,0x6277,0x6278,0x6279,INVALC,INVALC,0x627A,INVALC, + INVALC,INVALC,INVALC,0x627B,0x627C,0x627D,INVALC,0x627E, + INVALC,INVALC,0x6321,0x6322,INVALC,0x6323,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6324,0x6325,INVALC,INVALC,0x6326, + INVALC,0x6327,0x6328,INVALC,INVALC,INVALC,0x6329,INVALC, + INVALC,INVALC,INVALC,INVALC,0x632A,0x632B,INVALC,INVALC, + INVALC,0x632C,0x632D,INVALC,0x632E,0x632F,0x6330,0x6331, + 0x6332,0x6333,INVALC,INVALC,INVALC,INVALC,INVALC,0x6334, + INVALC,0x6335,INVALC,0x6336,INVALC,0x6337,INVALC,INVALC, + /* Block 147, Array index 0x4B00 */ + 0x6338,0x6339,INVALC,INVALC,0x633A,0x633B,0x633C,0x633D, + INVALC,0x633E,0x633F,INVALC,0x6340,INVALC,INVALC,INVALC, + 0x6341,INVALC,0x6342,0x6343,INVALC,INVALC,0x6344,INVALC, + 0x6345,INVALC,INVALC,INVALC,0x6346,0x6347,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6348,0x6349,0x634A,0x634B,INVALC, + 0x634C,INVALC,INVALC,INVALC,INVALC,INVALC,0x634D,0x634E, + 0x634F,INVALC,INVALC,0x6350,INVALC,0x6351,0x6352,INVALC, + 0x6353,0x6354,0x6355,INVALC,0x6356,INVALC,0x6357,INVALC, + 0x6358,INVALC,0x6359,0x635A,INVALC,INVALC,0x635B,0x635C, + INVALC,INVALC,0x635D,INVALC,INVALC,0x635E,0x635F,0x6360, + INVALC,0x6361,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6362,0x6363,INVALC,INVALC,0x6364,0x6365,INVALC,INVALC, + 0x6366,0x6367,INVALC,INVALC,INVALC,0x6368,INVALC,0x6369, + 0x636A,0x636B,INVALC,INVALC,INVALC,INVALC,0x636C,0x636D, + 0x636E,INVALC,INVALC,INVALC,INVALC,0x636F,0x6370,0x6371, + 0x6372,0x6373,INVALC,0x6374,0x6375,0x6376,INVALC,0x6377, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6378,0x6379,0x637A,INVALC,INVALC,0x637B,0x637C,INVALC, + INVALC,INVALC,0x637D,INVALC,INVALC,INVALC,INVALC,0x637E, + INVALC,0x6421,INVALC,INVALC,INVALC,INVALC,INVALC,0x6422, + 0x6423,INVALC,INVALC,INVALC,0x6424,0x6425,INVALC,0x6426, + 0x6427,INVALC,INVALC,0x6428,INVALC,INVALC,INVALC,0x6429, + INVALC,INVALC,0x642A,INVALC,INVALC,INVALC,0x642B,INVALC, + 0x642C,INVALC,0x642D,0x642E,0x642F,0x6430,INVALC,0x6431, + 0x6432,0x6433,0x6434,0x6435,INVALC,0x6436,0x6437,0x6438, + 0x6439,INVALC,INVALC,0x643A,0x643B,0x643C,0x643D,INVALC, + 0x643E,INVALC,INVALC,0x643F,INVALC,0x6440,INVALC,0x6441, + 0x6442,0x6443,INVALC,INVALC,0x6444,0x6445,INVALC,0x6446, + 0x6447,0x6448,INVALC,0x6449,INVALC,0x644A,INVALC,0x644B, + 0x644C,INVALC,INVALC,INVALC,0x644D,INVALC,0x644E,INVALC, + 0x644F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6450,INVALC,0x6451,INVALC,INVALC,INVALC,0x6452, + /* Block 148, Array index 0x4C00 */ + 0x6453,INVALC,0x6454,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6455,INVALC,INVALC,INVALC,INVALC,0x6456,INVALC,INVALC, + INVALC,0x6457,INVALC,INVALC,0x6458,0x6459,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x645A,0x645B,0x645C,0x645D, + INVALC,0x645E,INVALC,INVALC,0x645F,0x6460,INVALC,0x6461, + INVALC,0x6462,0x6463,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6464,0x6465,INVALC,0x6466,0x6467, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6468, + 0x6469,0x646A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x646B,0x646C,0x646D,INVALC,INVALC,0x646E,INVALC,0x646F, + 0x6470,INVALC,0x6471,INVALC,INVALC,INVALC,0x6472,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6473,0x6474,INVALC,0x6475, + INVALC,0x6476,0x6477,INVALC,INVALC,0x6478,INVALC,0x6479, + 0x647A,0x647B,INVALC,0x647C,0x647D,INVALC,0x647E,INVALC, + INVALC,INVALC,0x6521,INVALC,INVALC,0x6522,INVALC,0x6523, + 0x6524,0x6525,0x6526,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6527,INVALC,0x6528,0x6529,INVALC,0x652A,INVALC,0x652B, + INVALC,INVALC,0x652C,INVALC,INVALC,0x652D,INVALC,INVALC, + 0x652E,INVALC,INVALC,0x652F,INVALC,INVALC,0x6530,INVALC, + INVALC,0x6531,INVALC,0x6532,0x6533,INVALC,0x6534,INVALC, + 0x6535,0x653B,INVALC,0x6536,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6537,0x6538,0x6539,INVALC, + INVALC,INVALC,0x653A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x653C,INVALC,INVALC,0x653D,0x653E,0x653F,0x6540, + INVALC,0x6541,0x6542,0x6543,0x6544,0x6545,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6546,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6547,INVALC,INVALC,0x6548,INVALC,0x6549,0x654A, + INVALC,INVALC,0x654B,INVALC,INVALC,INVALC,0x654C,0x654D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x654F, + 0x6550,0x654E,0x6551,0x6552,INVALC,0x6553,INVALC,INVALC, + /* Block 149, Array index 0x4D00 */ + INVALC,0x6554,0x6555,INVALC,0x6556,INVALC,INVALC,INVALC, + 0x6557,0x6558,INVALC,INVALC,INVALC,0x6559,0x655A,0x655B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x655C,0x655D,0x655E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x655F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6560,0x6561, + INVALC,0x6562,0x6563,0x6564,0x6565,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6566,INVALC,0x6568,INVALC,0x6567, + INVALC,INVALC,INVALC,0x6569,INVALC,0x656A,INVALC,INVALC, + 0x656B,INVALC,0x656C,INVALC,0x656D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x656E,INVALC,INVALC, + INVALC,0x656F,INVALC,INVALC,0x6570,INVALC,INVALC,0x6571, + INVALC,0x6572,INVALC,0x6573,INVALC,INVALC,INVALC,INVALC, + 0x6574,INVALC,INVALC,0x6575,INVALC,0x6576,0x6577,0x6578, + INVALC,0x6579,0x657A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x657C,0x657B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x4E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x657D,0x657E,INVALC,INVALC,INVALC,INVALC,0x6621,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6622,INVALC,INVALC,INVALC, + 0x6623,INVALC,INVALC,INVALC,0x6624,0x6625,0x6626,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6627,0x6628,0x6629, + INVALC,0x662A,INVALC,INVALC,INVALC,INVALC,0x662B,INVALC, + INVALC,0x662C,INVALC,0x662D,0x662E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x662F,INVALC,0x6630,INVALC, + INVALC,INVALC,0x6631,INVALC,INVALC,0x6632,INVALC,0x6633, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6634,INVALC, + 0x6635,0x6636,INVALC,0x6637,INVALC,INVALC,INVALC,INVALC, + 0x6638,0x6639,0x663A,0x663B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x663C,0x663D,INVALC,INVALC,0x663E,0x663F,0x6640, + 0x6641,INVALC,INVALC,INVALC,0x6642,INVALC,0x6643,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6644,0x6645,INVALC, + INVALC,INVALC,0x6646,INVALC,0x6647,0x6648,0x6649,INVALC, + INVALC,INVALC,INVALC,INVALC,0x664A,INVALC,INVALC,INVALC, + INVALC,0x664B,INVALC,0x664C,INVALC,INVALC,INVALC,0x664D, + 0x664E,0x664F,0x6650,INVALC,0x6651,0x6652,INVALC,INVALC, + INVALC,0x6653,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6654,INVALC,0x6655,INVALC,0x6656,0x6657, + 0x6658,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6659,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x665A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x665B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x665C,0x665D,INVALC,0x665E,0x665F, + INVALC,0x6660,0x6661,0x6662,0x6663,INVALC,INVALC,INVALC, + INVALC,0x6664,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6665,INVALC,INVALC,INVALC,INVALC,0x6666,INVALC, + INVALC,INVALC,0x6667,INVALC,INVALC,0x6668,INVALC,0x6669, + INVALC,INVALC,INVALC,INVALC,0x666A,0x666B,0x666C,INVALC, + INVALC,0x666D,INVALC,INVALC,INVALC,INVALC,0x666E,0x666F, + INVALC,INVALC,INVALC,0x6670,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6671,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6672,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6673,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6675,INVALC,0x6676,INVALC,INVALC,0x6677,0x6678,0x6679, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x667A,INVALC,INVALC,INVALC,INVALC,INVALC,0x667B, + INVALC,0x667C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x667D,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 152, Array index 0x5000 */ + INVALC,INVALC,0x667E,0x6721,INVALC,0x6722,INVALC,INVALC, + INVALC,0x6723,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6724,0x6725,INVALC,0x6726,INVALC,INVALC, + INVALC,0x6727,0x6728,0x6729,INVALC,INVALC,INVALC,INVALC, + 0x672A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x672B,INVALC,0x672C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x672D,INVALC,0x672E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x672F,INVALC,INVALC,INVALC,0x6730,0x6731, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6732,INVALC,0x6733, + 0x6734,INVALC,0x6735,0x6736,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6737,INVALC,INVALC,INVALC,0x6738, + INVALC,INVALC,0x6739,INVALC,INVALC,INVALC,0x673A,INVALC, + INVALC,INVALC,INVALC,0x673B,INVALC,INVALC,0x673C,0x673D, + 0x673E,INVALC,INVALC,0x673F,INVALC,0x6740,INVALC,0x6741, + 0x6742,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6743,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6744,0x6745,0x6746, + INVALC,0x6747,0x6748,INVALC,INVALC,INVALC,0x6749,0x674A, + INVALC,INVALC,0x674B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x674C,INVALC,0x674D,INVALC, + INVALC,0x674E,0x674F,INVALC,INVALC,0x6750,0x6751,INVALC, + 0x6752,0x6753,0x6754,INVALC,0x6755,INVALC,0x6756,0x6757, + INVALC,0x6758,INVALC,INVALC,0x6759,0x675A,INVALC,0x675B, + INVALC,0x675C,0x675D,INVALC,0x675E,0x675F,0x6760,INVALC, + 0x6761,0x6762,INVALC,INVALC,0x6763,INVALC,INVALC,0x6764, + 0x6765,0x6766,INVALC,0x676A,INVALC,0x6767,0x6768,INVALC, + 0x6769,0x676B,INVALC,INVALC,0x676C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x676D, + INVALC,0x676E,INVALC,INVALC,0x676F,INVALC,INVALC,0x6770, + 0x6771,INVALC,0x6772,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 153, Array index 0x5100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6773, + INVALC,INVALC,0x6774,INVALC,INVALC,0x6776,0x6777,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6778,INVALC,0x6779,INVALC, + INVALC,0x6775,INVALC,INVALC,0x677A,INVALC,0x677B,INVALC, + 0x677C,INVALC,INVALC,0x677D,INVALC,0x6828,0x677E,INVALC, + INVALC,INVALC,INVALC,0x6821,INVALC,INVALC,0x6822,0x6823, + 0x6824,INVALC,0x6825,0x6826,INVALC,0x6827,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6829,INVALC, + INVALC,INVALC,INVALC,INVALC,0x682A,INVALC,INVALC,0x682B, + INVALC,INVALC,0x682C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x682D,0x682E,0x682F,INVALC,INVALC,0x6830,0x6831, + INVALC,0x6832,0x6833,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6834,0x6835,INVALC,0x6836,0x6837,INVALC, + INVALC,INVALC,0x6838,INVALC,0x6839,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x683A,INVALC,0x683B,0x683C,INVALC, + 0x683D,INVALC,INVALC,INVALC,0x683E,INVALC,INVALC,0x683F, + 0x6840,INVALC,0x6841,0x6842,INVALC,INVALC,INVALC,0x6843, + INVALC,INVALC,0x6844,INVALC,INVALC,0x6845,INVALC,INVALC, + 0x6846,INVALC,INVALC,INVALC,0x6847,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6848,INVALC,0x6849,INVALC,0x684A,0x684B,0x684C, + INVALC,INVALC,0x684D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x684E,INVALC,INVALC,0x684F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 154, Array index 0x5200 */ + INVALC,INVALC,0x6850,INVALC,INVALC,INVALC,INVALC,0x6851, + 0x6852,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6853,INVALC,INVALC,INVALC,0x6854,0x6855,0x6856, + INVALC,INVALC,0x6857,0x6858,0x6859,INVALC,INVALC,0x685A, + INVALC,INVALC,0x685B,INVALC,INVALC,INVALC,0x685C,0x685D, + INVALC,INVALC,INVALC,0x685E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x685F,0x6860,0x6861,0x6862,0x6863,INVALC,INVALC, + INVALC,0x6864,0x6865,0x6866,0x6867,INVALC,INVALC,INVALC, + 0x6868,0x6869,INVALC,INVALC,INVALC,INVALC,0x686A,0x686B, + 0x686C,INVALC,INVALC,INVALC,INVALC,0x686D,0x686E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x686F,INVALC,INVALC,INVALC, + 0x6870,0x6871,INVALC,0x6872,0x6873,INVALC,0x6874,0x6875, + 0x6876,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6877,INVALC,0x6878,INVALC,0x6879, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x687A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x687B,0x687C,0x687D,INVALC,INVALC,0x687E,INVALC,INVALC, + INVALC,0x6921,0x6922,INVALC,INVALC,0x6923,INVALC,0x6924, + INVALC,INVALC,INVALC,0x6925,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6926,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6927,0x6928,INVALC,INVALC,INVALC, + INVALC,0x6929,0x692A,INVALC,0x692B,INVALC,0x692C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x692D, + INVALC,INVALC,0x692E,0x692F,0x6930,INVALC,INVALC,INVALC, + 0x6931,INVALC,INVALC,INVALC,0x6932,0x6933,INVALC,INVALC, + INVALC,0x6934,INVALC,INVALC,INVALC,0x6935,0x6936,INVALC, + /* Block 155, Array index 0x5300 */ + INVALC,INVALC,0x6937,0x6938,0x6939,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x693A,0x693B,INVALC,INVALC,INVALC, + 0x693C,0x693D,INVALC,INVALC,INVALC,INVALC,0x693E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x693F,INVALC, + 0x6940,INVALC,0x6941,0x6942,0x6943,INVALC,INVALC,0x6944, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6945,0x6946,INVALC, + INVALC,INVALC,INVALC,0x6947,INVALC,0x6948,0x6949,INVALC, + 0x694A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x694C,INVALC,INVALC,0x694D,INVALC,INVALC,0x694B, + INVALC,INVALC,0x694E,0x694F,0x6950,INVALC,0x6951,INVALC, + INVALC,0x6952,INVALC,INVALC,0x6953,INVALC,0x6954,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6955,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6956,INVALC,0x6957,INVALC,0x6958,0x6959, + INVALC,INVALC,0x695A,INVALC,0x695B,0x695C,0x695D,INVALC, + INVALC,0x695E,INVALC,0x695F,INVALC,INVALC,0x6960,0x6961, + INVALC,0x6962,INVALC,0x6963,INVALC,INVALC,0x6964,INVALC, + 0x6965,INVALC,INVALC,INVALC,INVALC,INVALC,0x6966,INVALC, + 0x6967,INVALC,0x6968,INVALC,INVALC,0x6969,0x696A,0x696B, + INVALC,INVALC,INVALC,0x696C,0x696D,INVALC,INVALC,INVALC, + 0x696E,INVALC,INVALC,INVALC,0x696F,0x6970,INVALC,0x6971, + INVALC,0x6972,INVALC,INVALC,0x6973,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6974,0x6975,INVALC,0x6976,INVALC,INVALC, + INVALC,0x6977,0x6978,INVALC,INVALC,0x6979,INVALC,0x697A, + /* Block 156, Array index 0x5400 */ + 0x697B,0x697C,0x697D,0x697E,0x6A21,0x6A22,INVALC,INVALC, + 0x6A23,0x6A24,INVALC,0x6A25,0x6A26,0x6A27,0x6A28,INVALC, + 0x6A29,INVALC,0x6A2A,INVALC,INVALC,INVALC,0x6A2B,INVALC, + INVALC,0x6A2C,INVALC,0x6A2D,0x6A2E,INVALC,INVALC,INVALC, + 0x6A2F,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A30,INVALC, + INVALC,INVALC,INVALC,0x6A31,INVALC,0x6A32,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6A33,0x6A34,0x6A35,INVALC,0x6A36, + INVALC,0x6A37,0x6A38,INVALC,INVALC,0x6A39,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A3A,INVALC,INVALC,0x6A3B,0x6A3C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A3D,0x6A3E,0x6A3F, + INVALC,INVALC,INVALC,0x6A40,INVALC,INVALC,0x6A41,INVALC, + INVALC,0x6A42,INVALC,0x6A43,INVALC,0x6A44,0x6A45,INVALC, + 0x6A46,INVALC,0x6A47,0x6A48,0x6A49,0x6A4A,0x6A4B,INVALC, + INVALC,INVALC,INVALC,0x6A4C,INVALC,0x6A4D,INVALC,0x6A4E, + 0x6A4F,0x6A50,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A51, + 0x6A52,INVALC,INVALC,INVALC,0x6A53,0x6A54,0x6A55,0x6A56, + INVALC,0x6A57,0x6A58,0x6A59,INVALC,0x6A5A,INVALC,0x6A5B, + 0x6A5C,INVALC,INVALC,INVALC,0x6A5D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A5E,INVALC,INVALC,0x6A5F,0x6A60,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A61,0x6A62, + INVALC,0x6A63,INVALC,INVALC,0x6A64,INVALC,INVALC,INVALC, + 0x6A65,0x6A66,0x6A67,INVALC,INVALC,INVALC,INVALC,0x6A68, + 0x6A69,INVALC,INVALC,0x6A6A,0x6A6B,INVALC,0x6A6C,0x6A6D, + INVALC,0x6A6E,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A6F, + 0x6A70,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A71,INVALC, + 0x6A72,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A73, + 0x6A74,INVALC,INVALC,INVALC,INVALC,0x6A75,INVALC,0x6A76, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6A77,INVALC,0x6A78, + INVALC,INVALC,0x6A79,0x6A7A,INVALC,INVALC,INVALC,0x6A7B, + INVALC,INVALC,INVALC,0x6A7C,INVALC,INVALC,INVALC,0x6A7D, + 0x6A7E,0x6B21,0x6B22,INVALC,INVALC,0x6B23,INVALC,0x6B24, + /* Block 157, Array index 0x5500 */ + 0x6B25,INVALC,0x6B26,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B27,INVALC,INVALC,INVALC,0x6B28, + INVALC,0x6B29,INVALC,INVALC,INVALC,INVALC,0x6B2A,INVALC, + 0x6B2B,0x6B2C,0x6B2D,INVALC,0x6B2E,INVALC,0x6B2F,INVALC, + INVALC,INVALC,0x6B30,0x6B31,INVALC,INVALC,0x6B32,0x6B33, + 0x6B34,0x6B35,0x6B36,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B37,INVALC,INVALC,INVALC,0x6B38,0x6B39,0x6B3A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6B3B,INVALC,INVALC, + INVALC,0x6B3C,INVALC,0x6B3D,0x6B3E,0x6B3F,INVALC,INVALC, + INVALC,0x6B40,0x6B41,INVALC,INVALC,INVALC,0x6B42,0x6B43, + 0x6B44,INVALC,INVALC,0x6B45,0x6B46,INVALC,0x6B47,INVALC, + 0x6B48,INVALC,INVALC,0x6B49,0x6B50,0x6B4A,0x6B4B,0x6B4C, + INVALC,INVALC,INVALC,0x6B4D,INVALC,INVALC,INVALC,INVALC, + 0x6B52,0x6B4E,0x6B4F,0x6B51,INVALC,INVALC,0x6B53,INVALC, + 0x6B54,INVALC,0x6B55,INVALC,INVALC,0x6B56,INVALC,0x6B57, + INVALC,INVALC,INVALC,0x6B58,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B59,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B5A,INVALC,INVALC,INVALC,INVALC,0x6B5B, + INVALC,0x6B5C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 158, Array index 0x5600 */ + INVALC,INVALC,0x6B5E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B5D,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B5F,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B60, + 0x6B61,INVALC,INVALC,INVALC,0x6B62,0x6B63,0x6B64,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B65, + 0x6B66,INVALC,0x6B67,0x6B68,0x6B69,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B6A,INVALC,0x6B6B,0x6B6D,INVALC,INVALC, + INVALC,INVALC,0x6B6E,0x6B6F,INVALC,0x6B6C,INVALC,0x6B70, + INVALC,INVALC,0x6B71,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B72,0x6B73,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B74, + INVALC,INVALC,0x6B76,0x6B75,INVALC,0x6B77,INVALC,INVALC, + INVALC,0x6B78,0x6B79,0x6B7A,INVALC,INVALC,INVALC,INVALC, + 0x6B7B,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B7C,0x6B7D, + INVALC,INVALC,INVALC,0x6B7E,0x6C21,INVALC,0x6C22,INVALC, + INVALC,INVALC,INVALC,0x6C23,0x6C24,INVALC,0x6C25,INVALC, + INVALC,INVALC,0x6C26,INVALC,INVALC,0x6C27,0x6C28,INVALC, + INVALC,INVALC,0x6C29,0x6C2A,INVALC,0x6C2B,0x6C2C,0x6C2D, + 0x6C2E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C30,INVALC,0x6C31,INVALC,0x6C32,INVALC, + INVALC,0x6C33,INVALC,INVALC,INVALC,0x6C34,INVALC,INVALC, + INVALC,0x6C35,INVALC,INVALC,0x6C36,INVALC,INVALC,0x6C37, + INVALC,INVALC,INVALC,0x6C38,INVALC,INVALC,INVALC,0x6C39, + INVALC,0x6C3A,0x6C3B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C3C,0x6C3D,0x6C3E,0x6C3F, + INVALC,INVALC,0x6C40,INVALC,INVALC,INVALC,0x6C41,0x6C42, + 0x6C43,INVALC,INVALC,INVALC,INVALC,0x6C44,INVALC,0x6C45, + INVALC,0x6C46,INVALC,0x6C47,INVALC,INVALC,0x6C48,INVALC, + 0x6C49,INVALC,INVALC,0x6C4A,0x6C4B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C4C,INVALC, + /* Block 159, Array index 0x5700 */ + INVALC,INVALC,0x6C4E,INVALC,INVALC,INVALC,INVALC,0x6C4F, + INVALC,INVALC,0x6C4D,INVALC,INVALC,INVALC,0x6C50,INVALC, + 0x6C51,0x6C52,0x6C53,INVALC,INVALC,0x6C54,0x6C55,INVALC, + INVALC,0x6C56,INVALC,INVALC,0x6C57,0x6C58,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C59,0x6C5A,0x6C5B,INVALC,INVALC,INVALC, + 0x6C5C,INVALC,0x6C5D,0x6C5E,0x6C5F,0x6C60,INVALC,0x6C61, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C62,0x6C63, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C64,INVALC, + 0x6C65,INVALC,INVALC,0x6C66,INVALC,INVALC,0x6C67,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C68,INVALC,INVALC,INVALC, + 0x6C69,INVALC,INVALC,INVALC,0x6C6A,INVALC,0x6C6B,0x6C6C, + 0x6C6D,INVALC,INVALC,0x6C6E,0x6C6F,0x6C70,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C71,INVALC, + 0x6C72,INVALC,INVALC,0x6C73,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C74,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C75, + INVALC,INVALC,INVALC,INVALC,0x6C76,INVALC,INVALC,0x6C77, + INVALC,INVALC,INVALC,INVALC,0x6C78,0x6C79,0x6C7A,INVALC, + 0x6C7B,0x6C7C,0x6C7D,INVALC,INVALC,0x6C7E,INVALC,INVALC, + 0x6D21,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D22, + /* Block 160, Array index 0x5800 */ + INVALC,INVALC,0x6D23,0x6D24,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D25,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D26, + 0x6D27,0x6D28,0x6D29,INVALC,0x6D2A,INVALC,0x6D2B,0x6D2C, + INVALC,0x6D2D,0x6D2E,0x6D2F,INVALC,INVALC,INVALC,0x6D30, + INVALC,INVALC,0x6D31,INVALC,INVALC,INVALC,0x6D32,INVALC, + INVALC,INVALC,0x6D33,0x6D34,INVALC,INVALC,INVALC,0x6D35, + INVALC,0x6D36,0x6D37,INVALC,0x6D38,INVALC,INVALC,0x6D39, + INVALC,0x6D3A,0x6D3B,INVALC,0x6D3C,0x6D3D,INVALC,0x6D3E, + INVALC,0x6D3F,INVALC,0x6D40,0x6D41,0x6D42,0x6D43,0x6D44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D45,INVALC,0x6D46,0x6D47,0x6D48, + 0x6D49,INVALC,0x6D4A,INVALC,INVALC,0x6D4B,0x6D4C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D4D,0x6D4E,INVALC,INVALC,INVALC,0x6D4F,0x6D50,0x6D51, + 0x6D52,0x6D53,INVALC,0x6D54,INVALC,0x6D55,INVALC,INVALC, + INVALC,INVALC,0x6D56,INVALC,INVALC,0x6D57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D58, + 0x6D59,0x6D5A,0x6D5B,INVALC,0x6D5C,INVALC,0x6D5D,0x6D5E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D5F,INVALC, + INVALC,0x6D60,0x6D61,0x6D62,INVALC,0x6D63,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_JIS_X0212_1990 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> jis_x0212_1990 size-optimized table (23194 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_jis_x0212_1990[] = +{ + 0x01AA, /* Ranges number */ + 0x0E83, /* Unranged codes number */ + 0x1047, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x00BF, 0x017E, 0x0501, + /* Array index: 0x0006 */ 0x01CD, 0x01DC, 0x05C1, + /* Array index: 0x0009 */ 0x02D8, 0x02DD, 0x05D1, + /* Array index: 0x000C */ 0x0384, 0x0390, 0x05D7, + /* Array index: 0x000F */ 0x03AA, 0x03B0, 0x05E4, + /* Array index: 0x0012 */ 0x03CA, 0x03CE, 0x05EB, + /* Array index: 0x0015 */ 0x0402, 0x040F, 0x05F0, + /* Array index: 0x0018 */ 0x0452, 0x045F, 0x05FE, + /* Array index: 0x001B */ 0x4E2E, 0x4E30, 0x060C, + /* Array index: 0x001E */ 0x4EE0, 0x4EE2, 0x060F, + /* Array index: 0x0021 */ 0x4EFD, 0x4F03, 0x0612, + /* Array index: 0x0024 */ 0x4F15, 0x4F19, 0x0619, + /* Array index: 0x0027 */ 0x4F48, 0x4F4C, 0x061E, + /* Array index: 0x002A */ 0x4F77, 0x4F85, 0x0623, + /* Array index: 0x002D */ 0x4F90, 0x4F94, 0x0632, + /* Array index: 0x0030 */ 0x4FB9, 0x4FC1, 0x0637, + /* Array index: 0x0033 */ 0x4FC5, 0x4FCF, 0x0640, + /* Array index: 0x0036 */ 0x4FFC, 0x5001, 0x064B, + /* Array index: 0x0039 */ 0x5017, 0x501E, 0x0651, + /* Array index: 0x003C */ 0x5040, 0x5046, 0x0659, + /* Array index: 0x003F */ 0x5051, 0x5053, 0x0660, + /* Array index: 0x0042 */ 0x505F, 0x5067, 0x0663, + /* Array index: 0x0045 */ 0x508E, 0x5096, 0x066C, + /* Array index: 0x0048 */ 0x509B, 0x50A2, 0x0675, + /* Array index: 0x004B */ 0x5106, 0x5110, 0x067D, + /* Array index: 0x004E */ 0x5119, 0x511E, 0x0688, + /* Array index: 0x0051 */ 0x5131, 0x5139, 0x068E, + /* Array index: 0x0054 */ 0x51CF, 0x51D5, 0x0697, + /* Array index: 0x0057 */ 0x51F2, 0x51F4, 0x069E, + /* Array index: 0x005A */ 0x5212, 0x5218, 0x06A1, + /* Array index: 0x005D */ 0x525F, 0x5261, 0x06A8, + /* Array index: 0x0060 */ 0x5277, 0x5279, 0x06AB, + /* Array index: 0x0063 */ 0x5293, 0x529C, 0x06AE, + /* Array index: 0x0066 */ 0x52A4, 0x52A7, 0x06B8, + /* Array index: 0x0069 */ 0x52B6, 0x52BD, 0x06BC, + /* Array index: 0x006C */ 0x52E8, 0x52EC, 0x06C4, + /* Array index: 0x006F */ 0x530A, 0x530C, 0x06C9, + /* Array index: 0x0072 */ 0x531B, 0x531F, 0x06CC, + /* Array index: 0x0075 */ 0x5325, 0x532D, 0x06D1, + /* Array index: 0x0078 */ 0x533C, 0x533E, 0x06DA, + /* Array index: 0x007B */ 0x53B4, 0x53BA, 0x06DD, + /* Array index: 0x007E */ 0x54A6, 0x54AE, 0x06E4, + /* Array index: 0x0081 */ 0x54B7, 0x54BB, 0x06ED, + /* Array index: 0x0084 */ 0x54FC, 0x5501, 0x06F2, + /* Array index: 0x0087 */ 0x5508, 0x550E, 0x06F8, + /* Array index: 0x008A */ 0x553B, 0x553D, 0x06FF, + /* Array index: 0x008D */ 0x558E, 0x5594, 0x0702, + /* Array index: 0x0090 */ 0x55D1, 0x55D3, 0x0709, + /* Array index: 0x0093 */ 0x560D, 0x5612, 0x070C, + /* Array index: 0x0096 */ 0x5639, 0x5646, 0x0712, + /* Array index: 0x0099 */ 0x565E, 0x5663, 0x0720, + /* Array index: 0x009C */ 0x5699, 0x569F, 0x0726, + /* Array index: 0x009F */ 0x56A6, 0x56AD, 0x072D, + /* Array index: 0x00A2 */ 0x56C9, 0x56D0, 0x0735, + /* Array index: 0x00A5 */ 0x56E4, 0x56E8, 0x073D, + /* Array index: 0x00A8 */ 0x5720, 0x5725, 0x0742, + /* Array index: 0x00AB */ 0x573D, 0x573F, 0x0748, + /* Array index: 0x00AE */ 0x576B, 0x577E, 0x074B, + /* Array index: 0x00B1 */ 0x5799, 0x57A1, 0x075F, + /* Array index: 0x00B4 */ 0x57A7, 0x57A9, 0x0768, + /* Array index: 0x00B7 */ 0x57FD, 0x57FF, 0x076B, + /* Array index: 0x00BA */ 0x581E, 0x5820, 0x076E, + /* Array index: 0x00BD */ 0x584C, 0x5850, 0x0771, + /* Array index: 0x00C0 */ 0x587F, 0x5881, 0x0776, + /* Array index: 0x00C3 */ 0x5887, 0x5890, 0x0779, + /* Array index: 0x00C6 */ 0x58A0, 0x58A2, 0x0783, + /* Array index: 0x00C9 */ 0x5912, 0x5914, 0x0786, + /* Array index: 0x00CC */ 0x595B, 0x5963, 0x0789, + /* Array index: 0x00CF */ 0x59AD, 0x59B0, 0x0792, + /* Array index: 0x00D2 */ 0x59DD, 0x59DF, 0x0796, + /* Array index: 0x00D5 */ 0x59EE, 0x59F4, 0x0799, + /* Array index: 0x00D8 */ 0x5A0C, 0x5A0E, 0x07A0, + /* Array index: 0x00DB */ 0x5A44, 0x5A48, 0x07A3, + /* Array index: 0x00DE */ 0x5A9C, 0x5AA2, 0x07A8, + /* Array index: 0x00E1 */ 0x5AB1, 0x5AB5, 0x07AF, + /* Array index: 0x00E4 */ 0x5B7C, 0x5B81, 0x07B4, + /* Array index: 0x00E7 */ 0x5B90, 0x5B96, 0x07BA, + /* Array index: 0x00EA */ 0x5BD6, 0x5BDA, 0x07C1, + /* Array index: 0x00ED */ 0x5C67, 0x5C69, 0x07C6, + /* Array index: 0x00F0 */ 0x5C7A, 0x5C7D, 0x07C9, + /* Array index: 0x00F3 */ 0x5C9F, 0x5CA3, 0x07CD, + /* Array index: 0x00F6 */ 0x5D23, 0x5D27, 0x07D2, + /* Array index: 0x00F9 */ 0x5D5F, 0x5D64, 0x07D7, + /* Array index: 0x00FC */ 0x5D92, 0x5D95, 0x07DD, + /* Array index: 0x00FF */ 0x5E68, 0x5E70, 0x07E1, + /* Array index: 0x0102 */ 0x5EBD, 0x5EBF, 0x07EA, + /* Array index: 0x0105 */ 0x5ED1, 0x5ED5, 0x07ED, + /* Array index: 0x0108 */ 0x5F06, 0x5F08, 0x07F2, + /* Array index: 0x010B */ 0x5F21, 0x5F24, 0x07F5, + /* Array index: 0x010E */ 0x5FAB, 0x5FB1, 0x07F9, + /* Array index: 0x0111 */ 0x5FC7, 0x5FCB, 0x0800, + /* Array index: 0x0114 */ 0x5FD0, 0x5FD4, 0x0805, + /* Array index: 0x0117 */ 0x5FE8, 0x5FF3, 0x080A, + /* Array index: 0x011A */ 0x6047, 0x6049, 0x0816, + /* Array index: 0x011D */ 0x60C8, 0x60CF, 0x0819, + /* Array index: 0x0120 */ 0x6110, 0x6119, 0x0821, + /* Array index: 0x0123 */ 0x6135, 0x6139, 0x082B, + /* Array index: 0x0126 */ 0x617B, 0x6184, 0x0830, + /* Array index: 0x0129 */ 0x619C, 0x61A0, 0x083A, + /* Array index: 0x012C */ 0x61C0, 0x61C2, 0x083F, + /* Array index: 0x012F */ 0x61DC, 0x61E2, 0x0842, + /* Array index: 0x0132 */ 0x6242, 0x6246, 0x0849, + /* Array index: 0x0135 */ 0x6250, 0x6256, 0x084E, + /* Array index: 0x0138 */ 0x628D, 0x6290, 0x0855, + /* Array index: 0x013B */ 0x6341, 0x6346, 0x0859, + /* Array index: 0x013E */ 0x6352, 0x6354, 0x085F, + /* Array index: 0x0141 */ 0x63AD, 0x63AF, 0x0862, + /* Array index: 0x0144 */ 0x63D1, 0x63D5, 0x0865, + /* Array index: 0x0147 */ 0x644F, 0x6454, 0x086A, + /* Array index: 0x014A */ 0x645A, 0x6463, 0x0870, + /* Array index: 0x014D */ 0x648F, 0x6491, 0x087A, + /* Array index: 0x0150 */ 0x64BD, 0x64BF, 0x087D, + /* Array index: 0x0153 */ 0x64C9, 0x64D1, 0x0880, + /* Array index: 0x0156 */ 0x6508, 0x650A, 0x0889, + /* Array index: 0x0159 */ 0x65B2, 0x65B4, 0x088C, + /* Array index: 0x015C */ 0x65FE, 0x6600, 0x088F, + /* Array index: 0x015F */ 0x661D, 0x6633, 0x0892, + /* Array index: 0x0162 */ 0x6657, 0x665C, 0x08A9, + /* Array index: 0x0165 */ 0x666A, 0x666C, 0x08AF, + /* Array index: 0x0168 */ 0x6675, 0x6680, 0x08B2, + /* Array index: 0x016B */ 0x668B, 0x668D, 0x08BE, + /* Array index: 0x016E */ 0x6699, 0x66A0, 0x08C1, + /* Array index: 0x0171 */ 0x66BF, 0x66C3, 0x08C9, + /* Array index: 0x0174 */ 0x67B0, 0x67B2, 0x08CE, + /* Array index: 0x0177 */ 0x67BB, 0x67BD, 0x08D1, + /* Array index: 0x017A */ 0x682C, 0x6833, 0x08D4, + /* Array index: 0x017D */ 0x686E, 0x6872, 0x08DC, + /* Array index: 0x0180 */ 0x6879, 0x687C, 0x08E1, + /* Array index: 0x0183 */ 0x68CF, 0x68D3, 0x08E5, + /* Array index: 0x0186 */ 0x68E8, 0x68F1, 0x08EA, + /* Array index: 0x0189 */ 0x68FB, 0x68FD, 0x08F4, + /* Array index: 0x018C */ 0x6963, 0x6969, 0x08F7, + /* Array index: 0x018F */ 0x6970, 0x6972, 0x08FE, + /* Array index: 0x0192 */ 0x6A4E, 0x6A56, 0x0901, + /* Array index: 0x0195 */ 0x6A9B, 0x6A9F, 0x090A, + /* Array index: 0x0198 */ 0x6AAF, 0x6AB1, 0x090F, + /* Array index: 0x019B */ 0x6ABD, 0x6ABF, 0x0912, + /* Array index: 0x019E */ 0x6AD4, 0x6AD6, 0x0915, + /* Array index: 0x01A1 */ 0x6AF0, 0x6AF2, 0x0918, + /* Array index: 0x01A4 */ 0x6B0F, 0x6B11, 0x091B, + /* Array index: 0x01A7 */ 0x6B9F, 0x6BA3, 0x091E, + /* Array index: 0x01AA */ 0x6BA8, 0x6BB0, 0x0923, + /* Array index: 0x01AD */ 0x6C26, 0x6C28, 0x092C, + /* Array index: 0x01B0 */ 0x6C85, 0x6C89, 0x092F, + /* Array index: 0x01B3 */ 0x6C94, 0x6C98, 0x0934, + /* Array index: 0x01B6 */ 0x6CCD, 0x6CD6, 0x0939, + /* Array index: 0x01B9 */ 0x6D26, 0x6D28, 0x0943, + /* Array index: 0x01BC */ 0x6D94, 0x6D98, 0x0946, + /* Array index: 0x01BF */ 0x6E4F, 0x6E54, 0x094B, + /* Array index: 0x01C2 */ 0x6E5C, 0x6E5E, 0x0951, + /* Array index: 0x01C5 */ 0x6EBF, 0x6EC3, 0x0954, + /* Array index: 0x01C8 */ 0x6ECD, 0x6ECF, 0x0959, + /* Array index: 0x01CB */ 0x6F4F, 0x6F53, 0x095C, + /* Array index: 0x01CE */ 0x6F87, 0x6F8D, 0x0961, + /* Array index: 0x01D1 */ 0x6F90, 0x6F96, 0x0968, + /* Array index: 0x01D4 */ 0x6FA5, 0x6FA8, 0x096F, + /* Array index: 0x01D7 */ 0x6FAE, 0x6FB0, 0x0973, + /* Array index: 0x01DA */ 0x7005, 0x7007, 0x0976, + /* Array index: 0x01DD */ 0x7048, 0x704B, 0x0979, + /* Array index: 0x01E0 */ 0x7094, 0x7098, 0x097D, + /* Array index: 0x01E3 */ 0x70D1, 0x70D8, 0x0982, + /* Array index: 0x01E6 */ 0x7103, 0x7107, 0x098A, + /* Array index: 0x01E9 */ 0x712D, 0x7131, 0x098F, + /* Array index: 0x01EC */ 0x7145, 0x714B, 0x0994, + /* Array index: 0x01EF */ 0x71AF, 0x71B3, 0x099B, + /* Array index: 0x01F2 */ 0x71BF, 0x71C1, 0x09A0, + /* Array index: 0x01F5 */ 0x7207, 0x7209, 0x09A3, + /* Array index: 0x01F8 */ 0x7241, 0x7245, 0x09A6, + /* Array index: 0x01FB */ 0x724E, 0x7250, 0x09AB, + /* Array index: 0x01FE */ 0x735D, 0x7360, 0x09AE, + /* Array index: 0x0201 */ 0x736B, 0x7371, 0x09B2, + /* Array index: 0x0204 */ 0x739C, 0x73A6, 0x09B9, + /* Array index: 0x0207 */ 0x73F7, 0x7401, 0x09C4, + /* Array index: 0x020A */ 0x7426, 0x7431, 0x09CF, + /* Array index: 0x020D */ 0x7443, 0x7447, 0x09DB, + /* Array index: 0x0210 */ 0x7466, 0x7468, 0x09E0, + /* Array index: 0x0213 */ 0x7485, 0x7489, 0x09E3, + /* Array index: 0x0216 */ 0x748F, 0x7492, 0x09E8, + /* Array index: 0x0219 */ 0x7498, 0x74A3, 0x09EC, + /* Array index: 0x021C */ 0x74A6, 0x74B2, 0x09F8, + /* Array index: 0x021F */ 0x74FA, 0x74FC, 0x0A05, + /* Array index: 0x0222 */ 0x753D, 0x7540, 0x0A08, + /* Array index: 0x0225 */ 0x7579, 0x757E, 0x0A0C, + /* Array index: 0x0228 */ 0x75BF, 0x75C1, 0x0A12, + /* Array index: 0x022B */ 0x75DF, 0x75E1, 0x0A15, + /* Array index: 0x022E */ 0x7600, 0x760C, 0x0A18, + /* Array index: 0x0231 */ 0x7612, 0x7616, 0x0A25, + /* Array index: 0x0234 */ 0x7619, 0x761E, 0x0A2A, + /* Array index: 0x0237 */ 0x7638, 0x763C, 0x0A30, + /* Array index: 0x023A */ 0x7640, 0x764B, 0x0A35, + /* Array index: 0x023D */ 0x766D, 0x7671, 0x0A41, + /* Array index: 0x0240 */ 0x769B, 0x76AA, 0x0A46, + /* Array index: 0x0243 */ 0x772D, 0x772F, 0x0A56, + /* Array index: 0x0246 */ 0x7734, 0x7736, 0x0A59, + /* Array index: 0x0249 */ 0x774D, 0x774F, 0x0A5C, + /* Array index: 0x024C */ 0x775C, 0x7764, 0x0A5F, + /* Array index: 0x024F */ 0x7770, 0x7774, 0x0A68, + /* Array index: 0x0252 */ 0x7794, 0x7796, 0x0A6D, + /* Array index: 0x0255 */ 0x77DE, 0x77E0, 0x0A70, + /* Array index: 0x0258 */ 0x7821, 0x7823, 0x0A73, + /* Array index: 0x025B */ 0x7860, 0x7864, 0x0A76, + /* Array index: 0x025E */ 0x789D, 0x78A1, 0x0A7B, + /* Array index: 0x0261 */ 0x78AC, 0x78B3, 0x0A80, + /* Array index: 0x0264 */ 0x78C7, 0x78C9, 0x0A88, + /* Array index: 0x0267 */ 0x78D2, 0x78D6, 0x0A8B, + /* Array index: 0x026A */ 0x78DF, 0x78E1, 0x0A90, + /* Array index: 0x026D */ 0x791C, 0x7920, 0x0A93, + /* Array index: 0x0270 */ 0x7944, 0x7946, 0x0A98, + /* Array index: 0x0273 */ 0x7991, 0x799C, 0x0A9B, + /* Array index: 0x0276 */ 0x7A34, 0x7A3A, 0x0AA7, + /* Array index: 0x0279 */ 0x7A44, 0x7A48, 0x0AAE, + /* Array index: 0x027C */ 0x7A5C, 0x7A60, 0x0AB3, + /* Array index: 0x027F */ 0x7AE8, 0x7AEC, 0x0AB8, + /* Array index: 0x0282 */ 0x7B27, 0x7B31, 0x0ABD, + /* Array index: 0x0285 */ 0x7B3D, 0x7B41, 0x0AC8, + /* Array index: 0x0288 */ 0x7BBA, 0x7BBD, 0x0ACD, + /* Array index: 0x028B */ 0x7BD6, 0x7BDB, 0x0AD1, + /* Array index: 0x028E */ 0x7BF4, 0x7C06, 0x0AD7, + /* Array index: 0x0291 */ 0x7C0B, 0x7C0F, 0x0AEA, + /* Array index: 0x0294 */ 0x7C51, 0x7C5E, 0x0AEF, + /* Array index: 0x0297 */ 0x7CB6, 0x7CBC, 0x0AFD, + /* Array index: 0x029A */ 0x7CC7, 0x7CC9, 0x0B04, + /* Array index: 0x029D */ 0x7CD3, 0x7CDA, 0x0B07, + /* Array index: 0x02A0 */ 0x7D07, 0x7D09, 0x0B0F, + /* Array index: 0x02A3 */ 0x7D0F, 0x7D13, 0x0B12, + /* Array index: 0x02A6 */ 0x7D3C, 0x7D41, 0x0B17, + /* Array index: 0x02A9 */ 0x7D59, 0x7D5D, 0x0B1D, + /* Array index: 0x02AC */ 0x7D7F, 0x7D8D, 0x0B22, + /* Array index: 0x02AF */ 0x7DC2, 0x7DC6, 0x0B31, + /* Array index: 0x02B2 */ 0x7DCC, 0x7DCE, 0x0B36, + /* Array index: 0x02B5 */ 0x7F3B, 0x7F3F, 0x0B39, + /* Array index: 0x02B8 */ 0x7F5B, 0x7F5D, 0x0B3E, + /* Array index: 0x02BB */ 0x7F61, 0x7F66, 0x0B41, + /* Array index: 0x02BE */ 0x7F7D, 0x7F80, 0x0B47, + /* Array index: 0x02C1 */ 0x7F8D, 0x7F91, 0x0B4B, + /* Array index: 0x02C4 */ 0x7FFD, 0x7FFF, 0x0B50, + /* Array index: 0x02C7 */ 0x800D, 0x8016, 0x0B53, + /* Array index: 0x02CA */ 0x801D, 0x8020, 0x0B5D, + /* Array index: 0x02CD */ 0x80D4, 0x80D8, 0x0B61, + /* Array index: 0x02D0 */ 0x8116, 0x8118, 0x0B66, + /* Array index: 0x02D3 */ 0x8167, 0x8169, 0x0B69, + /* Array index: 0x02D6 */ 0x8184, 0x8186, 0x0B6C, + /* Array index: 0x02D9 */ 0x81F0, 0x81F9, 0x0B6F, + /* Array index: 0x02DC */ 0x8243, 0x8246, 0x0B79, + /* Array index: 0x02DF */ 0x827D, 0x8284, 0x0B7D, + /* Array index: 0x02E2 */ 0x82A0, 0x82AA, 0x0B85, + /* Array index: 0x02E5 */ 0x82FD, 0x8301, 0x0B90, + /* Array index: 0x02E8 */ 0x8307, 0x830B, 0x0B95, + /* Array index: 0x02EB */ 0x831B, 0x8322, 0x0B9A, + /* Array index: 0x02EE */ 0x832C, 0x8330, 0x0BA2, + /* Array index: 0x02F1 */ 0x8342, 0x8344, 0x0BA7, + /* Array index: 0x02F4 */ 0x8351, 0x8357, 0x0BAA, + /* Array index: 0x02F7 */ 0x8398, 0x839D, 0x0BB1, + /* Array index: 0x02FA */ 0x83BE, 0x83C0, 0x0BB7, + /* Array index: 0x02FD */ 0x83CF, 0x83D1, 0x0BBA, + /* Array index: 0x0300 */ 0x8456, 0x845C, 0x0BBD, + /* Array index: 0x0303 */ 0x84A6, 0x84AA, 0x0BC4, + /* Array index: 0x0306 */ 0x84EF, 0x84F2, 0x0BC9, + /* Array index: 0x0309 */ 0x8522, 0x852B, 0x0BCD, + /* Array index: 0x030C */ 0x8532, 0x8536, 0x0BD7, + /* Array index: 0x030F */ 0x854F, 0x8553, 0x0BDC, + /* Array index: 0x0312 */ 0x855C, 0x8564, 0x0BE1, + /* Array index: 0x0315 */ 0x8579, 0x8581, 0x0BEA, + /* Array index: 0x0318 */ 0x85B4, 0x85BF, 0x0BF3, + /* Array index: 0x031B */ 0x860D, 0x8612, 0x0BFF, + /* Array index: 0x031E */ 0x863C, 0x8642, 0x0C05, + /* Array index: 0x0321 */ 0x8652, 0x8659, 0x0C0C, + /* Array index: 0x0324 */ 0x8660, 0x8664, 0x0C14, + /* Array index: 0x0327 */ 0x8675, 0x8677, 0x0C19, + /* Array index: 0x032A */ 0x86A6, 0x86A8, 0x0C1C, + /* Array index: 0x032D */ 0x86B1, 0x86B9, 0x0C1F, + /* Array index: 0x0330 */ 0x86BF, 0x86C5, 0x0C28, + /* Array index: 0x0333 */ 0x870E, 0x8714, 0x0C2F, + /* Array index: 0x0336 */ 0x872E, 0x8732, 0x0C36, + /* Array index: 0x0339 */ 0x8739, 0x8740, 0x0C3B, + /* Array index: 0x033C */ 0x8783, 0x878C, 0x0C43, + /* Array index: 0x033F */ 0x8795, 0x8799, 0x0C4D, + /* Array index: 0x0342 */ 0x87AC, 0x87AE, 0x0C52, + /* Array index: 0x0345 */ 0x87C8, 0x87CA, 0x0C55, + /* Array index: 0x0348 */ 0x87E2, 0x87E4, 0x0C58, + /* Array index: 0x034B */ 0x8809, 0x880B, 0x0C5B, + /* Array index: 0x034E */ 0x8810, 0x881F, 0x0C5E, + /* Array index: 0x0351 */ 0x8848, 0x884B, 0x0C6E, + /* Array index: 0x0354 */ 0x8898, 0x88A0, 0x0C72, + /* Array index: 0x0357 */ 0x88CA, 0x88D3, 0x0C7B, + /* Array index: 0x035A */ 0x88EF, 0x88F1, 0x0C85, + /* Array index: 0x035D */ 0x890D, 0x890F, 0x0C88, + /* Array index: 0x0360 */ 0x8915, 0x891C, 0x0C8B, + /* Array index: 0x0363 */ 0x8926, 0x8928, 0x0C93, + /* Array index: 0x0366 */ 0x8930, 0x8932, 0x0C96, + /* Array index: 0x0369 */ 0x895A, 0x895C, 0x0C99, + /* Array index: 0x036C */ 0x8961, 0x8963, 0x0C9C, + /* Array index: 0x036F */ 0x897A, 0x897D, 0x0C9F, + /* Array index: 0x0372 */ 0x89B4, 0x89B7, 0x0CA3, + /* Array index: 0x0375 */ 0x89D4, 0x89D8, 0x0CA7, + /* Array index: 0x0378 */ 0x8A11, 0x8A15, 0x0CAC, + /* Array index: 0x037B */ 0x8A56, 0x8A58, 0x0CB1, + /* Array index: 0x037E */ 0x8A75, 0x8A80, 0x0CB4, + /* Array index: 0x0381 */ 0x8AC6, 0x8ACA, 0x0CC0, + /* Array index: 0x0384 */ 0x8AD1, 0x8AD7, 0x0CC5, + /* Array index: 0x0387 */ 0x8AF4, 0x8AF6, 0x0CCC, + /* Array index: 0x038A */ 0x8B42, 0x8B48, 0x0CCF, + /* Array index: 0x038D */ 0x8B52, 0x8B54, 0x0CD6, + /* Array index: 0x0390 */ 0x8C53, 0x8C5D, 0x0CD9, + /* Array index: 0x0393 */ 0x8D9E, 0x8DA0, 0x0CE4, + /* Array index: 0x0396 */ 0x8DC5, 0x8DCA, 0x0CE7, + /* Array index: 0x0399 */ 0x8DF0, 0x8DF4, 0x0CED, + /* Array index: 0x039C */ 0x8E04, 0x8E06, 0x0CF2, + /* Array index: 0x039F */ 0x8E20, 0x8E27, 0x0CF5, + /* Array index: 0x03A2 */ 0x8E36, 0x8E39, 0x0CFD, + /* Array index: 0x03A5 */ 0x8E4B, 0x8E4F, 0x0D01, + /* Array index: 0x03A8 */ 0x8E5B, 0x8E62, 0x0D06, + /* Array index: 0x03AB */ 0x8E6C, 0x8E71, 0x0D0E, + /* Array index: 0x03AE */ 0x8E79, 0x8E7B, 0x0D14, + /* Array index: 0x03B1 */ 0x8E9A, 0x8E9E, 0x0D17, + /* Array index: 0x03B4 */ 0x8EC0, 0x8EC4, 0x0D1C, + /* Array index: 0x03B7 */ 0x8EED, 0x8EF1, 0x0D21, + /* Array index: 0x03BA */ 0x8F16, 0x8F18, 0x0D26, + /* Array index: 0x03BD */ 0x8F2C, 0x8F2E, 0x0D29, + /* Array index: 0x03C0 */ 0x8F34, 0x8F37, 0x0D2C, + /* Array index: 0x03C3 */ 0x8F4F, 0x8F55, 0x0D30, + /* Array index: 0x03C6 */ 0x8FA0, 0x8FA6, 0x0D37, + /* Array index: 0x03C9 */ 0x9028, 0x902F, 0x0D3E, + /* Array index: 0x03CC */ 0x9095, 0x909B, 0x0D46, + /* Array index: 0x03CF */ 0x90A0, 0x90A2, 0x0D4D, + /* Array index: 0x03D2 */ 0x90B0, 0x90B6, 0x0D50, + /* Array index: 0x03D5 */ 0x90C3, 0x90C8, 0x0D57, + /* Array index: 0x03D8 */ 0x90D5, 0x90DF, 0x0D5D, + /* Array index: 0x03DB */ 0x90FE, 0x9108, 0x0D68, + /* Array index: 0x03DE */ 0x9114, 0x9129, 0x0D73, + /* Array index: 0x03E1 */ 0x9136, 0x913D, 0x0D89, + /* Array index: 0x03E4 */ 0x9157, 0x915B, 0x0D91, + /* Array index: 0x03E7 */ 0x9179, 0x917B, 0x0D96, + /* Array index: 0x03EA */ 0x9191, 0x9195, 0x0D99, + /* Array index: 0x03ED */ 0x91AC, 0x91B3, 0x0D9E, + /* Array index: 0x03F0 */ 0x91BB, 0x91C5, 0x0DA6, + /* Array index: 0x03F3 */ 0x91E9, 0x91F1, 0x0DB1, + /* Array index: 0x03F6 */ 0x9200, 0x920C, 0x0DBA, + /* Array index: 0x03F9 */ 0x9223, 0x9228, 0x0DC7, + /* Array index: 0x03FC */ 0x922E, 0x9230, 0x0DCD, + /* Array index: 0x03FF */ 0x9235, 0x9247, 0x0DD0, + /* Array index: 0x0402 */ 0x924D, 0x9251, 0x0DE3, + /* Array index: 0x0405 */ 0x9265, 0x9269, 0x0DE8, + /* Array index: 0x0408 */ 0x926E, 0x9270, 0x0DED, + /* Array index: 0x040B */ 0x9275, 0x927F, 0x0DF0, + /* Array index: 0x040E */ 0x9288, 0x928E, 0x0DFB, + /* Array index: 0x0411 */ 0x92A4, 0x92A8, 0x0E02, + /* Array index: 0x0414 */ 0x92B8, 0x92D0, 0x0E07, + /* Array index: 0x0417 */ 0x92D5, 0x92E8, 0x0E20, + /* Array index: 0x041A */ 0x931C, 0x932A, 0x0E34, + /* Array index: 0x041D */ 0x9333, 0x9337, 0x0E43, + /* Array index: 0x0420 */ 0x9347, 0x9349, 0x0E48, + /* Array index: 0x0423 */ 0x9350, 0x9352, 0x0E4B, + /* Array index: 0x0426 */ 0x936D, 0x9376, 0x0E4E, + /* Array index: 0x0429 */ 0x937D, 0x9382, 0x0E58, + /* Array index: 0x042C */ 0x93B4, 0x93B6, 0x0E5E, + /* Array index: 0x042F */ 0x93C4, 0x93CD, 0x0E61, + /* Array index: 0x0432 */ 0x93F7, 0x93FD, 0x0E6B, + /* Array index: 0x0435 */ 0x940D, 0x940F, 0x0E72, + /* Array index: 0x0438 */ 0x9415, 0x9417, 0x0E75, + /* Array index: 0x043B */ 0x942E, 0x9434, 0x0E78, + /* Array index: 0x043E */ 0x946B, 0x9472, 0x0E7F, + /* Array index: 0x0441 */ 0x958C, 0x958E, 0x0E87, + /* Array index: 0x0444 */ 0x959D, 0x95A1, 0x0E8A, + /* Array index: 0x0447 */ 0x95D0, 0x95D3, 0x0E8F, + /* Array index: 0x044A */ 0x95D9, 0x95E0, 0x0E93, + /* Array index: 0x044D */ 0x9622, 0x9626, 0x0E9B, + /* Array index: 0x0450 */ 0x9637, 0x963D, 0x0EA0, + /* Array index: 0x0453 */ 0x9654, 0x9658, 0x0EA7, + /* Array index: 0x0456 */ 0x967B, 0x9684, 0x0EAC, + /* Array index: 0x0459 */ 0x96A4, 0x96A6, 0x0EB6, + /* Array index: 0x045C */ 0x96DD, 0x96DF, 0x0EB9, + /* Array index: 0x045F */ 0x9721, 0x9723, 0x0EBC, + /* Array index: 0x0462 */ 0x9757, 0x975B, 0x0EBF, + /* Array index: 0x0465 */ 0x9776, 0x9778, 0x0EC4, + /* Array index: 0x0468 */ 0x9795, 0x979A, 0x0EC7, + /* Array index: 0x046B */ 0x97B5, 0x97D1, 0x0ECD, + /* Array index: 0x046E */ 0x97D7, 0x97E1, 0x0EEA, + /* Array index: 0x0471 */ 0x982E, 0x9835, 0x0EF5, + /* Array index: 0x0474 */ 0x9851, 0x985A, 0x0EFD, + /* Array index: 0x0477 */ 0x9862, 0x9866, 0x0F07, + /* Array index: 0x047A */ 0x98B7, 0x98BB, 0x0F0C, + /* Array index: 0x047D */ 0x98E3, 0x98E7, 0x0F11, + /* Array index: 0x0480 */ 0x9915, 0x991C, 0x0F16, + /* Array index: 0x0483 */ 0x9931, 0x993C, 0x0F1E, + /* Array index: 0x0486 */ 0x9946, 0x9948, 0x0F2A, + /* Array index: 0x0489 */ 0x9958, 0x9960, 0x0F2D, + /* Array index: 0x048C */ 0x99B0, 0x99B2, 0x0F36, + /* Array index: 0x048F */ 0x99EA, 0x99EC, 0x0F39, + /* Array index: 0x0492 */ 0x9A02, 0x9A04, 0x0F3C, + /* Array index: 0x0495 */ 0x9A20, 0x9A24, 0x0F3F, + /* Array index: 0x0498 */ 0x9A4A, 0x9A4E, 0x0F44, + /* Array index: 0x049B */ 0x9AB2, 0x9AB6, 0x0F49, + /* Array index: 0x049E */ 0x9AD5, 0x9AD7, 0x0F4E, + /* Array index: 0x04A1 */ 0x9AFD, 0x9B12, 0x0F51, + /* Array index: 0x04A4 */ 0x9B33, 0x9B3A, 0x0F67, + /* Array index: 0x04A7 */ 0x9B55, 0x9B57, 0x0F6F, + /* Array index: 0x04AA */ 0x9B68, 0x9B6E, 0x0F72, + /* Array index: 0x04AD */ 0x9B75, 0x9B79, 0x0F79, + /* Array index: 0x04B0 */ 0x9B84, 0x9B90, 0x0F7E, + /* Array index: 0x04B3 */ 0x9BB0, 0x9BB2, 0x0F8B, + /* Array index: 0x04B6 */ 0x9BBB, 0x9BC1, 0x0F8E, + /* Array index: 0x04B9 */ 0x9BF7, 0x9BFA, 0x0F95, + /* Array index: 0x04BC */ 0x9C16, 0x9C1E, 0x0F99, + /* Array index: 0x04BF */ 0x9C22, 0x9C2A, 0x0FA2, + /* Array index: 0x04C2 */ 0x9C35, 0x9C37, 0x0FAB, + /* Array index: 0x04C5 */ 0x9C41, 0x9C45, 0x0FAE, + /* Array index: 0x04C8 */ 0x9C4E, 0x9C5F, 0x0FB3, + /* Array index: 0x04CB */ 0x9C68, 0x9C6B, 0x0FC5, + /* Array index: 0x04CE */ 0x9D1C, 0x9D1E, 0x0FC9, + /* Array index: 0x04D1 */ 0x9D2F, 0x9D34, 0x0FCC, + /* Array index: 0x04D4 */ 0x9D69, 0x9D6B, 0x0FD2, + /* Array index: 0x04D7 */ 0x9D92, 0x9D98, 0x0FD5, + /* Array index: 0x04DA */ 0x9DD4, 0x9DD7, 0x0FDC, + /* Array index: 0x04DD */ 0x9DDE, 0x9DE0, 0x0FE0, + /* Array index: 0x04E0 */ 0x9E0E, 0x9E16, 0x0FE3, + /* Array index: 0x04E3 */ 0x9E7A, 0x9E7C, 0x0FEC, + /* Array index: 0x04E6 */ 0x9E80, 0x9E87, 0x0FEF, + /* Array index: 0x04E9 */ 0x9EAC, 0x9EB5, 0x0FF7, + /* Array index: 0x04EC */ 0x9EEC, 0x9EF2, 0x1001, + /* Array index: 0x04EF */ 0x9F0F, 0x9F1B, 0x1008, + /* Array index: 0x04F2 */ 0x9F39, 0x9F47, 0x1015, + /* Array index: 0x04F5 */ 0x9F53, 0x9F5E, 0x1024, + /* Array index: 0x04F8 */ 0x9F6D, 0x9F75, 0x1030, + /* Array index: 0x04FB */ 0x9F8F, 0x9F97, 0x1039, + /* Array index: 0x04FE */ 0x9FA1, 0x9FA5, 0x1042, + /* Ranges content */ + /* Range 0x00BF - 0x017E, array index: 0x0501 */ + 0x2244,0x2A22,0x2A21,0x2A24,0x2A2A,0x2A23,0x2A29,0x2921, + 0x2A2E,0x2A32,0x2A31,0x2A34,0x2A33,0x2A40,0x2A3F,0x2A42, + 0x2A41,INVALC,0x2A50,0x2A52,0x2A51,0x2A54,0x2A58,0x2A53, + INVALC,0x292C,0x2A63,0x2A62,0x2A65,0x2A64,0x2A72,0x2930, + 0x294E,0x2B22,0x2B21,0x2B24,0x2B2A,0x2B23,0x2B29,0x2941, + 0x2B2E,0x2B32,0x2B31,0x2B34,0x2B33,0x2B40,0x2B3F,0x2B42, + 0x2B41,0x2943,0x2B50,0x2B52,0x2B51,0x2B54,0x2B58,0x2B53, + INVALC,0x294C,0x2B63,0x2B62,0x2B65,0x2B64,0x2B72,0x2950, + 0x2B73,0x2A27,0x2B27,0x2A25,0x2B25,0x2A28,0x2B28,0x2A2B, + 0x2B2B,0x2A2C,0x2B2C,0x2A2F,0x2B2F,0x2A2D,0x2B2D,0x2A30, + 0x2B30,0x2922,0x2942,0x2A37,0x2B37,INVALC,INVALC,0x2A36, + 0x2B36,0x2A38,0x2B38,0x2A35,0x2B35,0x2A3A,0x2B3A,0x2A3B, + 0x2B3B,0x2A3D,0x2B3D,0x2A3C,INVALC,0x2A3E,0x2B3E,0x2924, + 0x2944,0x2A47,0x2B47,0x2A45,0x2B45,INVALC,INVALC,0x2A46, + 0x2B46,0x2A44,0x2945,0x2926,0x2946,0x2A48,0x2B48,0x2A49, + 0x2B49,0x2947,0x2A4A,0x2B4A,0x2A4C,0x2B4C,0x2A4B,0x2B4B, + 0x2929,0x2949,0x2928,0x2948,0x2A4D,0x2B4D,0x2A4F,0x2B4F, + 0x2A4E,0x2B4E,0x294A,0x292B,0x294B,0x2A57,0x2B57,INVALC, + INVALC,0x2A56,0x2B56,0x292D,0x294D,0x2A59,0x2B59,0x2A5B, + 0x2B5B,0x2A5A,0x2B5A,0x2A5C,0x2B5C,0x2A5D,0x2B5D,0x2A5F, + 0x2B5F,0x2A5E,0x2B5E,0x2A61,0x2B61,0x2A60,0x2B60,0x292F, + 0x294F,0x2A6C,0x2B6C,0x2A69,0x2B69,0x2A66,0x2B66,0x2A6B, + 0x2B6B,0x2A68,0x2B68,0x2A6A,0x2B6A,0x2A71,0x2B71,0x2A74, + 0x2B74,0x2A73,0x2A75,0x2B75,0x2A77,0x2B77,0x2A76,0x2B76, + /* Range 0x01CD - 0x01DC, array index: 0x05C1 */ + 0x2A26,0x2B26,0x2A43,0x2B43,0x2A55,0x2B55,0x2A67,0x2B67, + 0x2A70,0x2B70,0x2A6D,0x2B6D,0x2A6F,0x2B6F,0x2A6E,0x2B6E, + /* Range 0x02D8 - 0x02DD, array index: 0x05D1 */ + 0x222F,0x2232,0x2236,0x2235,INVALC,0x2233, + /* Range 0x0384 - 0x0390, array index: 0x05D7 */ + 0x2238,0x2239,0x2661,INVALC,0x2662,0x2663,0x2664,INVALC, + 0x2667,INVALC,0x2669,0x266C,0x2676, + /* Range 0x03AA - 0x03B0, array index: 0x05E4 */ + 0x2665,0x266A,0x2671,0x2672,0x2673,0x2674,0x267B, + /* Range 0x03CA - 0x03CE, array index: 0x05EB */ + 0x2675,0x267A,0x2677,0x2679,0x267C, + /* Range 0x0402 - 0x040F, array index: 0x05F0 */ + 0x2742,0x2743,0x2744,0x2745,0x2746,0x2747,0x2748,0x2749, + 0x274A,0x274B,0x274C,INVALC,0x274D,0x274E, + /* Range 0x0452 - 0x045F, array index: 0x05FE */ + 0x2772,0x2773,0x2774,0x2775,0x2776,0x2777,0x2778,0x2779, + 0x277A,0x277B,0x277C,INVALC,0x277D,0x277E, + /* Range 0x4E2E - 0x4E30, array index: 0x060C */ + 0x302B,0x302C,0x302D, + /* Range 0x4EE0 - 0x4EE2, array index: 0x060F */ + 0x3047,0x3048,0x3049, + /* Range 0x4EFD - 0x4F03, array index: 0x0612 */ + 0x304F,0x3050,0x3051,0x3052,INVALC,0x3053,0x3054, + /* Range 0x4F15 - 0x4F19, array index: 0x0619 */ + 0x3059,0x305A,0x305B,INVALC,0x305C, + /* Range 0x4F48 - 0x4F4C, array index: 0x061E */ + 0x3068,0x3069,INVALC,0x306A,0x306B, + /* Range 0x4F77 - 0x4F85, array index: 0x0623 */ + 0x3076,0x3077,0x3078,0x3079,INVALC,INVALC,0x307A,0x307B, + INVALC,INVALC,0x307C,0x307D,INVALC,0x307E,0x3121, + /* Range 0x4F90 - 0x4F94, array index: 0x0632 */ + 0x3126,INVALC,0x3127,0x3128,0x3129, + /* Range 0x4FB9 - 0x4FC1, array index: 0x0637 */ + 0x3131,INVALC,0x3132,0x3133,0x3134,0x3135,INVALC,0x3136, + 0x3137, + /* Range 0x4FC5 - 0x4FCF, array index: 0x0640 */ + 0x3138,0x3139,INVALC,0x313A,0x313B,INVALC,0x313C,0x313D, + 0x313E,INVALC,0x313F, + /* Range 0x4FFC - 0x5001, array index: 0x064B */ + 0x3146,0x3147,INVALC,0x3148,0x3149,0x314A, + /* Range 0x5017 - 0x501E, array index: 0x0651 */ + 0x3152,0x3153,INVALC,INVALC,0x3154,0x3155,0x3156,0x3157, + /* Range 0x5040 - 0x5046, array index: 0x0659 */ + 0x315F,0x3160,0x3161,INVALC,INVALC,0x3162,0x3163, + /* Range 0x5051 - 0x5053, array index: 0x0660 */ + 0x3167,0x3168,0x3169, + /* Range 0x505F - 0x5067, array index: 0x0663 */ + 0x316C,0x316D,INVALC,0x316E,0x316F,INVALC,INVALC,0x3170, + 0x3171, + /* Range 0x508E - 0x5096, array index: 0x066C */ + 0x317C,0x317D,0x317E,INVALC,0x3221,0x3222,0x3223,INVALC, + 0x3224, + /* Range 0x509B - 0x50A2, array index: 0x0675 */ + 0x3225,0x3226,INVALC,0x3227,0x3228,0x3229,0x322A,0x322B, + /* Range 0x5106 - 0x5110, array index: 0x067D */ + 0x324A,0x324B,0x324C,INVALC,INVALC,0x324D,0x324E,0x324F, + 0x3250,INVALC,0x3252, + /* Range 0x5119 - 0x511E, array index: 0x0688 */ + 0x3254,INVALC,0x3255,0x3256,0x3257,0x3258, + /* Range 0x5131 - 0x5139, array index: 0x068E */ + 0x325F,INVALC,0x3260,0x3261,0x3262,INVALC,INVALC,0x3263, + 0x3264, + /* Range 0x51CF - 0x51D5, array index: 0x0697 */ + 0x3322,INVALC,0x3323,0x3324,0x3325,INVALC,0x3326, + /* Range 0x51F2 - 0x51F4, array index: 0x069E */ + 0x332C,0x332D,0x332E, + /* Range 0x5212 - 0x5218, array index: 0x06A1 */ + 0x3333,0x3334,INVALC,0x3335,0x3336,INVALC,0x3337, + /* Range 0x525F - 0x5261, array index: 0x06A8 */ + 0x3345,0x3346,0x3347, + /* Range 0x5277 - 0x5279, array index: 0x06AB */ + 0x334A,0x334B,0x334C, + /* Range 0x5293 - 0x529C, array index: 0x06AE */ + 0x3352,INVALC,0x3353,0x3354,0x3355,0x3356,INVALC,0x3357, + INVALC,0x3358, + /* Range 0x52A4 - 0x52A7, array index: 0x06B8 */ + 0x3359,0x335A,0x335B,0x335C, + /* Range 0x52B6 - 0x52BD, array index: 0x06BC */ + 0x335F,0x3360,0x3361,INVALC,0x3362,0x3363,INVALC,0x3364, + /* Range 0x52E8 - 0x52EC, array index: 0x06C4 */ + 0x3372,0x3373,0x3374,INVALC,0x3375, + /* Range 0x530A - 0x530C, array index: 0x06C9 */ + 0x337D,0x337E,0x3421, + /* Range 0x531B - 0x531F, array index: 0x06CC */ + 0x3425,0x3426,INVALC,0x3427,0x3428, + /* Range 0x5325 - 0x532D, array index: 0x06D1 */ + 0x3429,INVALC,0x342A,0x342B,0x342C,INVALC,0x342D,0x342E, + 0x342F, + /* Range 0x533C - 0x533E, array index: 0x06DA */ + 0x3433,0x3434,0x3435, + /* Range 0x53B4 - 0x53BA, array index: 0x06DD */ + 0x3451,0x3452,INVALC,0x3453,0x3454,INVALC,0x3455, + /* Range 0x54A6 - 0x54AE, array index: 0x06E4 */ + 0x352D,0x352E,INVALC,0x352F,0x3530,INVALC,INVALC,0x3531, + 0x3532, + /* Range 0x54B7 - 0x54BB, array index: 0x06ED */ + 0x3534,INVALC,0x3535,0x3536,0x3537, + /* Range 0x54FC - 0x5501, array index: 0x06F2 */ + 0x3542,INVALC,0x3543,0x3544,0x3545,0x3546, + /* Range 0x5508 - 0x550E, array index: 0x06F8 */ + 0x3548,0x3549,INVALC,INVALC,0x354A,0x354B,0x354C, + /* Range 0x553B - 0x553D, array index: 0x06FF */ + 0x3553,0x3554,0x3555, + /* Range 0x558E - 0x5594, array index: 0x0702 */ + 0x356A,0x356B,INVALC,0x356C,0x356D,0x356E,0x356F, + /* Range 0x55D1 - 0x55D3, array index: 0x0709 */ + 0x357D,0x357E,0x3621, + /* Range 0x560D - 0x5612, array index: 0x070C */ + 0x362D,0x362E,0x362F,0x3630,0x3631,0x3632, + /* Range 0x5639 - 0x5646, array index: 0x0712 */ + 0x3639,INVALC,0x363A,0x363B,0x363C,INVALC,0x363D,0x363E, + 0x363F,INVALC,0x3640,0x3641,INVALC,0x3642, + /* Range 0x565E - 0x5663, array index: 0x0720 */ + 0x3648,INVALC,0x3649,0x364A,0x364B,0x364C, + /* Range 0x5699 - 0x569F, array index: 0x0726 */ + 0x365A,0x365B,INVALC,INVALC,0x365C,0x365D,0x365E, + /* Range 0x56A6 - 0x56AD, array index: 0x072D */ + 0x365F,0x3660,0x3661,0x3662,INVALC,0x3663,0x3664,0x3665, + /* Range 0x56C9 - 0x56D0, array index: 0x0735 */ + 0x366B,0x366C,0x366D,0x3670,0x3671,INVALC,0x366E,0x366F, + /* Range 0x56E4 - 0x56E8, array index: 0x073D */ + 0x3677,0x3678,0x3679,0x367A,0x367B, + /* Range 0x5720 - 0x5725, array index: 0x0742 */ + 0x372D,INVALC,0x372E,0x372F,0x3730,0x3731, + /* Range 0x573D - 0x573F, array index: 0x0748 */ + 0x3739,0x373A,0x373B, + /* Range 0x576B - 0x577E, array index: 0x074B */ + 0x3745,INVALC,0x3746,0x3747,0x3748,0x3749,0x374A,INVALC, + 0x374B,0x374C,0x374D,INVALC,0x374E,INVALC,0x374F,0x3750, + 0x3751,0x3752,INVALC,0x3753, + /* Range 0x5799 - 0x57A1, array index: 0x075F */ + 0x3759,0x375A,INVALC,0x375B,0x375C,0x375D,0x375E,INVALC, + 0x375F, + /* Range 0x57A7 - 0x57A9, array index: 0x0768 */ + 0x3761,0x3762,0x3763, + /* Range 0x57FD - 0x57FF, array index: 0x076B */ + 0x3777,0x3778,0x3779, + /* Range 0x581E - 0x5820, array index: 0x076E */ + 0x3824,0x3825,0x3826, + /* Range 0x584C - 0x5850, array index: 0x0771 */ + 0x382E,0x382F,INVALC,0x3830,0x3831, + /* Range 0x587F - 0x5881, array index: 0x0776 */ + 0x383A,0x383B,0x383C, + /* Range 0x5887 - 0x5890, array index: 0x0779 */ + 0x383D,0x383E,0x383F,0x3840,INVALC,0x3841,0x3842,INVALC, + 0x3843,0x3844, + /* Range 0x58A0 - 0x58A2, array index: 0x0783 */ + 0x3848,0x3849,0x384A, + /* Range 0x5912 - 0x5914, array index: 0x0786 */ + 0x3863,0x3864,0x3865, + /* Range 0x595B - 0x5963, array index: 0x0789 */ + 0x3877,INVALC,0x3878,0x3879,0x387A,INVALC,0x387B,INVALC, + 0x387C, + /* Range 0x59AD - 0x59B0, array index: 0x0792 */ + 0x3931,0x3932,0x3933,0x3934, + /* Range 0x59DD - 0x59DF, array index: 0x0796 */ + 0x3940,0x3941,0x3942, + /* Range 0x59EE - 0x59F4, array index: 0x0799 */ + 0x3946,0x3947,INVALC,0x3948,0x3949,INVALC,0x394A, + /* Range 0x5A0C - 0x5A0E, array index: 0x07A0 */ + 0x394E,0x394F,0x3950, + /* Range 0x5A44 - 0x5A48, array index: 0x07A3 */ + 0x395B,0x395C,INVALC,0x395D,0x395E, + /* Range 0x5A9C - 0x5AA2, array index: 0x07A8 */ + 0x3970,INVALC,0x3971,0x3972,0x3973,INVALC,0x3974, + /* Range 0x5AB1 - 0x5AB5, array index: 0x07AF */ + 0x3977,0x3978,0x3979,INVALC,0x397A, + /* Range 0x5B7C - 0x5B81, array index: 0x07B4 */ + 0x3A43,0x3A44,0x3A45,0x3A46,INVALC,0x3A47, + /* Range 0x5B90 - 0x5B96, array index: 0x07BA */ + 0x3A4C,0x3A4D,INVALC,0x3A4E,0x3A4F,INVALC,0x3A50, + /* Range 0x5BD6 - 0x5BDA, array index: 0x07C1 */ + 0x3A5F,0x3A60,0x3A61,0x3A62,0x3A63, + /* Range 0x5C67 - 0x5C69, array index: 0x07C6 */ + 0x3A7C,0x3A7D,0x3A7E, + /* Range 0x5C7A - 0x5C7D, array index: 0x07C9 */ + 0x3B25,0x3B26,0x3B27,0x3B28, + /* Range 0x5C9F - 0x5CA3, array index: 0x07CD */ + 0x3B2F,0x3B30,INVALC,0x3B31,0x3B32, + /* Range 0x5D23 - 0x5D27, array index: 0x07D2 */ + 0x3B47,0x3B48,INVALC,0x3B49,0x3B4A, + /* Range 0x5D5F - 0x5D64, array index: 0x07D7 */ + 0x3B58,0x3B59,0x3B5A,0x3B5B,INVALC,0x3B5C, + /* Range 0x5D92 - 0x5D95, array index: 0x07DD */ + 0x3B68,0x3B69,0x3B6A,0x3B6B, + /* Range 0x5E68 - 0x5E70, array index: 0x07E1 */ + 0x3C3B,INVALC,0x3C3C,0x3C3D,0x3C3E,0x3C3F,0x3C40,INVALC, + 0x3C41, + /* Range 0x5EBD - 0x5EBF, array index: 0x07EA */ + 0x3C4D,0x3C4E,0x3C4F, + /* Range 0x5ED1 - 0x5ED5, array index: 0x07ED */ + 0x3C54,0x3C55,INVALC,0x3C56,0x3C57, + /* Range 0x5F06 - 0x5F08, array index: 0x07F2 */ + 0x3C5D,0x3C5E,0x3C5F, + /* Range 0x5F21 - 0x5F24, array index: 0x07F5 */ + 0x3C64,0x3C65,0x3C66,0x3C67, + /* Range 0x5FAB - 0x5FB1, array index: 0x07F9 */ + 0x3D31,0x3D33,INVALC,INVALC,0x3D34,0x3D35,0x3D36, + /* Range 0x5FC7 - 0x5FCB, array index: 0x0800 */ + 0x3D39,0x3D3A,0x3D3B,INVALC,0x3D3C, + /* Range 0x5FD0 - 0x5FD4, array index: 0x0805 */ + 0x3D3D,0x3D3E,0x3D3F,0x3D40,0x3D41, + /* Range 0x5FE8 - 0x5FF3, array index: 0x080A */ + 0x3D45,0x3D46,0x3D47,INVALC,0x3D48,0x3D49,0x3D4A,0x3D4B, + INVALC,INVALC,0x3D4C,0x3D4D, + /* Range 0x6047 - 0x6049, array index: 0x0816 */ + 0x3D5F,0x3D60,0x3D61, + /* Range 0x60C8 - 0x60CF, array index: 0x0819 */ + 0x3E25,0x3E26,0x3E27,0x3E28,INVALC,INVALC,0x3E29,0x3E2A, + /* Range 0x6110 - 0x6119, array index: 0x0821 */ + 0x3E3C,0x3E3D,0x3E3E,0x3E3F,0x3E40,INVALC,0x3E41,0x3E42, + INVALC,0x3E43, + /* Range 0x6135 - 0x6139, array index: 0x082B */ + 0x3E4B,0x3E4C,0x3E4D,INVALC,0x3E4E, + /* Range 0x617B - 0x6184, array index: 0x0830 */ + 0x3E58,0x3E59,INVALC,INVALC,0x3E5A,0x3E5B,0x3E5C,INVALC, + 0x3E5D,0x3E5E, + /* Range 0x619C - 0x61A0, array index: 0x083A */ + 0x3E65,0x3E66,INVALC,0x3E67,0x3E68, + /* Range 0x61C0 - 0x61C2, array index: 0x083F */ + 0x3E70,0x3E71,0x3E72, + /* Range 0x61DC - 0x61E2, array index: 0x0842 */ + 0x3E76,0x3E77,0x3E78,0x3E79,INVALC,0x3E7A,0x3E7B, + /* Range 0x6242 - 0x6246, array index: 0x0849 */ + 0x3F33,0x3F34,0x3F35,INVALC,0x3F36, + /* Range 0x6250 - 0x6256, array index: 0x084E */ + 0x3F38,0x3F39,0x3F3A,INVALC,0x3F3B,INVALC,0x3F3C, + /* Range 0x628D - 0x6290, array index: 0x0855 */ + 0x3F45,0x3F46,0x3F47,0x3F48, + /* Range 0x6341 - 0x6346, array index: 0x0859 */ + 0x3F6B,0x3F6C,0x3F6D,0x3F6E,INVALC,0x3F6F, + /* Range 0x6352 - 0x6354, array index: 0x085F */ + 0x3F73,0x3F74,0x3F75, + /* Range 0x63AD - 0x63AF, array index: 0x0862 */ + 0x4031,0x4032,0x4033, + /* Range 0x63D1 - 0x63D5, array index: 0x0865 */ + 0x4039,INVALC,0x403A,0x403B,0x403C, + /* Range 0x644F - 0x6454, array index: 0x086A */ + 0x405A,INVALC,0x405B,0x405C,0x405D,0x405E, + /* Range 0x645A - 0x6463, array index: 0x0870 */ + 0x405F,0x4060,0x4061,0x4062,INVALC,0x4063,0x4064,0x4065, + INVALC,0x4066, + /* Range 0x648F - 0x6491, array index: 0x087A */ + 0x406E,0x406F,0x4070, + /* Range 0x64BD - 0x64BF, array index: 0x087D */ + 0x407C,0x407D,0x407E, + /* Range 0x64C9 - 0x64D1, array index: 0x0880 */ + 0x4122,0x4123,0x4124,0x4125,INVALC,0x4126,INVALC,0x4127, + 0x4128, + /* Range 0x6508 - 0x650A, array index: 0x0889 */ + 0x4137,0x4138,0x4139, + /* Range 0x65B2 - 0x65B4, array index: 0x088C */ + 0x4161,0x4162,0x4163, + /* Range 0x65FE - 0x6600, array index: 0x088F */ + 0x4173,0x4174,0x4175, + /* Range 0x661D - 0x6633, array index: 0x0892 */ + 0x417E,0x4221,INVALC,INVALC,0x4222,0x4223,0x4224,0x4225, + INVALC,0x4226,INVALC,INVALC,0x4227,0x4228,0x4229,0x422A, + INVALC,0x422B,INVALC,0x422C,0x422D,INVALC,0x422E, + /* Range 0x6657 - 0x665C, array index: 0x08A9 */ + 0x4238,0x4239,0x423A,INVALC,0x423B,0x423C, + /* Range 0x666A - 0x666C, array index: 0x08AF */ + 0x4240,0x4241,0x4242, + /* Range 0x6675 - 0x6680, array index: 0x08B2 */ + 0x4245,INVALC,0x4247,0x4248,0x4249,INVALC,0x424A,0x424C, + INVALC,0x4243,0x4246,0x424B, + /* Range 0x668B - 0x668D, array index: 0x08BE */ + 0x424D,0x424E,0x424F, + /* Range 0x6699 - 0x66A0, array index: 0x08C1 */ + 0x4252,0x4253,0x4254,0x4255,INVALC,INVALC,0x4256,0x4257, + /* Range 0x66BF - 0x66C3, array index: 0x08C9 */ + 0x425E,0x425F,INVALC,0x4260,0x4261, + /* Range 0x67B0 - 0x67B2, array index: 0x08CE */ + 0x4331,0x4332,0x4333, + /* Range 0x67BB - 0x67BD, array index: 0x08D1 */ + 0x4335,0x4336,0x4337, + /* Range 0x682C - 0x6833, array index: 0x08D4 */ + 0x4350,0x4351,INVALC,0x4352,0x4353,0x4354,INVALC,0x4355, + /* Range 0x686E - 0x6872, array index: 0x08DC */ + 0x4361,0x4362,0x4363,0x4364,0x4365, + /* Range 0x6879 - 0x687C, array index: 0x08E1 */ + 0x4367,0x4368,0x4369,0x436A, + /* Range 0x68CF - 0x68D3, array index: 0x08E5 */ + 0x437E,0x4421,0x4422,INVALC,0x4423, + /* Range 0x68E8 - 0x68F1, array index: 0x08EA */ + 0x4429,INVALC,0x442A,0x442B,0x442C,0x442D,INVALC,INVALC, + 0x442E,0x442F, + /* Range 0x68FB - 0x68FD, array index: 0x08F4 */ + 0x4432,0x4433,0x4434, + /* Range 0x6963 - 0x6969, array index: 0x08F7 */ + 0x4448,0x4449,0x444A,0x444B,INVALC,0x444C,0x444D, + /* Range 0x6970 - 0x6972, array index: 0x08FE */ + 0x444F,0x4450,0x4451, + /* Range 0x6A4E - 0x6A56, array index: 0x0901 */ + 0x452A,INVALC,0x452B,0x452C,0x452D,INVALC,INVALC,0x452E, + 0x452F, + /* Range 0x6A9B - 0x6A9F, array index: 0x090A */ + 0x453E,INVALC,0x453F,0x4540,0x4541, + /* Range 0x6AAF - 0x6AB1, array index: 0x090F */ + 0x4544,0x4545,0x4546, + /* Range 0x6ABD - 0x6ABF, array index: 0x0912 */ + 0x4548,0x4549,0x454A, + /* Range 0x6AD4 - 0x6AD6, array index: 0x0915 */ + 0x4550,0x4551,0x4552, + /* Range 0x6AF0 - 0x6AF2, array index: 0x0918 */ + 0x4558,0x4559,0x455A, + /* Range 0x6B0F - 0x6B11, array index: 0x091B */ + 0x4562,0x4563,0x4564, + /* Range 0x6B9F - 0x6BA3, array index: 0x091E */ + 0x4626,0x4627,INVALC,0x4628,0x4629, + /* Range 0x6BA8 - 0x6BB0, array index: 0x0923 */ + 0x462A,0x462B,INVALC,INVALC,0x462C,0x462D,0x462E,INVALC, + 0x462F, + /* Range 0x6C26 - 0x6C28, array index: 0x092C */ + 0x464D,0x464E,0x464F, + /* Range 0x6C85 - 0x6C89, array index: 0x092F */ + 0x4669,0x466A,0x466B,INVALC,0x466C, + /* Range 0x6C94 - 0x6C98, array index: 0x0934 */ + 0x466D,0x466E,INVALC,0x466F,0x4670, + /* Range 0x6CCD - 0x6CD6, array index: 0x0939 */ + 0x4678,INVALC,0x4679,0x467A,0x467B,0x467C,INVALC,0x467D, + INVALC,0x467E, + /* Range 0x6D26 - 0x6D28, array index: 0x0943 */ + 0x4733,0x4734,0x4735, + /* Range 0x6D94 - 0x6D98, array index: 0x0946 */ + 0x474A,INVALC,0x474B,0x474C,0x474D, + /* Range 0x6E4F - 0x6E54, array index: 0x094B */ + 0x4776,INVALC,0x4777,0x4778,0x4779,0x477A, + /* Range 0x6E5C - 0x6E5E, array index: 0x0951 */ + 0x477C,0x477D,0x477E, + /* Range 0x6EBF - 0x6EC3, array index: 0x0954 */ + 0x4831,0x4832,0x4833,INVALC,0x4834, + /* Range 0x6ECD - 0x6ECF, array index: 0x0959 */ + 0x4838,0x4839,0x483A, + /* Range 0x6F4F - 0x6F53, array index: 0x095C */ + 0x4854,INVALC,0x4855,0x4856,0x4857, + /* Range 0x6F87 - 0x6F8D, array index: 0x0961 */ + 0x4864,0x4865,INVALC,INVALC,0x4866,0x4867,0x4868, + /* Range 0x6F90 - 0x6F96, array index: 0x0968 */ + 0x4869,INVALC,0x486A,0x486B,0x486C,INVALC,0x486D, + /* Range 0x6FA5 - 0x6FA8, array index: 0x096F */ + 0x4871,0x4872,0x4873,0x4874, + /* Range 0x6FAE - 0x6FB0, array index: 0x0973 */ + 0x4875,0x4876,0x4877, + /* Range 0x7005 - 0x7007, array index: 0x0976 */ + 0x492B,0x492C,0x492D, + /* Range 0x7048 - 0x704B, array index: 0x0979 */ + 0x4939,0x493A,0x493B,0x493C, + /* Range 0x7094 - 0x7098, array index: 0x097D */ + 0x494C,0x494D,0x494E,0x494F,0x4950, + /* Range 0x70D1 - 0x70D8, array index: 0x0982 */ + 0x4959,INVALC,0x495A,0x495B,0x495C,0x495D,INVALC,0x495E, + /* Range 0x7103 - 0x7107, array index: 0x098A */ + 0x4962,0x4963,0x4964,0x4965,0x4966, + /* Range 0x712D - 0x7131, array index: 0x098F */ + 0x496D,INVALC,0x496E,0x496F,0x4970, + /* Range 0x7145 - 0x714B, array index: 0x0994 */ + 0x4973,0x4974,0x4975,INVALC,INVALC,0x4976,0x4977, + /* Range 0x71AF - 0x71B3, array index: 0x099B */ + 0x4A2C,0x4A2D,INVALC,0x4A2E,0x4A2F, + /* Range 0x71BF - 0x71C1, array index: 0x09A0 */ + 0x4A31,0x4A32,0x4A33, + /* Range 0x7207 - 0x7209, array index: 0x09A3 */ + 0x4A3F,0x4A40,0x4A41, + /* Range 0x7241 - 0x7245, array index: 0x09A6 */ + 0x4A4D,0x4A4E,0x4A4F,INVALC,0x4A50, + /* Range 0x724E - 0x7250, array index: 0x09AB */ + 0x4A51,0x4A52,0x4A53, + /* Range 0x735D - 0x7360, array index: 0x09AE */ + 0x4B3E,0x4B3F,0x4B40,0x4B41, + /* Range 0x736B - 0x7371, array index: 0x09B2 */ + 0x4B45,0x4B46,INVALC,0x4B47,0x4B48,INVALC,0x4B49, + /* Range 0x739C - 0x73A6, array index: 0x09B9 */ + 0x4B58,INVALC,0x4B59,0x4B5A,0x4B5B,INVALC,0x4B5C,INVALC, + INVALC,0x4B5D,0x4B5E, + /* Range 0x73F7 - 0x7401, array index: 0x09C4 */ + 0x4B7A,INVALC,0x4B7B,0x4B7C,0x4B7D,INVALC,0x4B7E,INVALC, + 0x4C21,0x4C22,0x4C23, + /* Range 0x7426 - 0x7431, array index: 0x09CF */ + 0x4C2B,INVALC,0x4C2C,0x4C2D,0x4C2E,0x4C2F,0x4C30,0x4C31, + 0x4C32,0x4C33,0x4C34,0x4C35, + /* Range 0x7443 - 0x7447, array index: 0x09DB */ + 0x4C38,0x4C39,INVALC,0x4C3A,0x4C3B, + /* Range 0x7466 - 0x7468, array index: 0x09E0 */ + 0x4C43,0x4C44,0x4C45, + /* Range 0x7485 - 0x7489, array index: 0x09E3 */ + 0x4C4D,0x4C4E,0x4C4F,INVALC,0x4C50, + /* Range 0x748F - 0x7492, array index: 0x09E8 */ + 0x4C51,0x4C52,0x4C53,0x4C54, + /* Range 0x7498 - 0x74A3, array index: 0x09EC */ + 0x4C55,0x4C56,0x4C57,INVALC,0x4C58,INVALC,INVALC,0x4C59, + 0x4C5A,0x4C5B,INVALC,0x4C5C, + /* Range 0x74A6 - 0x74B2, array index: 0x09F8 */ + 0x4C5D,INVALC,0x4C5E,0x4C5F,0x4C60,0x4C61,INVALC,INVALC, + 0x4C62,0x4C63,INVALC,0x4C64,0x4C65, + /* Range 0x74FA - 0x74FC, array index: 0x0A05 */ + 0x4C7A,0x4C7B,0x4C7C, + /* Range 0x753D - 0x7540, array index: 0x0A08 */ + 0x4D2D,0x4D2E,0x4D2F,0x4D30, + /* Range 0x7579 - 0x757E, array index: 0x0A0C */ + 0x4D3D,0x4D3E,0x4D3F,0x4D40,0x4D41,0x4D42, + /* Range 0x75BF - 0x75C1, array index: 0x0A12 */ + 0x4D4F,0x4D50,0x4D51, + /* Range 0x75DF - 0x75E1, array index: 0x0A15 */ + 0x4D59,0x4D5A,0x4D5B, + /* Range 0x7600 - 0x760C, array index: 0x0A18 */ + 0x4D63,INVALC,0x4D64,0x4D65,0x4D66,INVALC,INVALC,0x4D67, + 0x4D68,INVALC,0x4D69,INVALC,0x4D6A, + /* Range 0x7612 - 0x7616, array index: 0x0A25 */ + 0x4D6C,0x4D6D,INVALC,0x4D6E,0x4D6F, + /* Range 0x7619 - 0x761E, array index: 0x0A2A */ + 0x4D70,INVALC,0x4D71,0x4D72,0x4D73,0x4D74, + /* Range 0x7638 - 0x763C, array index: 0x0A30 */ + 0x4D7D,0x4D7E,0x4E21,INVALC,0x4E22, + /* Range 0x7640 - 0x764B, array index: 0x0A35 */ + 0x4E24,0x4E25,INVALC,0x4E26,0x4E27,0x4E28,INVALC,INVALC, + INVALC,0x4E29,0x4E23,0x4E2A, + /* Range 0x766D - 0x7671, array index: 0x0A41 */ + 0x4E30,0x4E31,0x4E32,INVALC,0x4E33, + /* Range 0x769B - 0x76AA, array index: 0x0A46 */ + 0x4E3A,0x4E3B,0x4E3C,INVALC,0x4E3D,0x4E3E,INVALC,0x4E3F, + 0x4E40,0x4E41,0x4E42,0x4E43,0x4E44,0x4E45,INVALC,0x4E46, + /* Range 0x772D - 0x772F, array index: 0x0A56 */ + 0x4E67,0x4E68,0x4E69, + /* Range 0x7734 - 0x7736, array index: 0x0A59 */ + 0x4E6A,0x4E6B,0x4E6C, + /* Range 0x774D - 0x774F, array index: 0x0A5C */ + 0x4E74,0x4E75,0x4E76, + /* Range 0x775C - 0x7764, array index: 0x0A5F */ + 0x4E7A,INVALC,0x4E7B,0x4E7C,0x4E7D,INVALC,0x4E7E,INVALC, + 0x4F21, + /* Range 0x7770 - 0x7774, array index: 0x0A68 */ + 0x4F25,INVALC,0x4F26,0x4F27,0x4F28, + /* Range 0x7794 - 0x7796, array index: 0x0A6D */ + 0x4F2F,0x4F30,0x4F31, + /* Range 0x77DE - 0x77E0, array index: 0x0A70 */ + 0x4F42,0x4F43,0x4F44, + /* Range 0x7821 - 0x7823, array index: 0x0A73 */ + 0x4F55,0x4F56,0x4F57, + /* Range 0x7860 - 0x7864, array index: 0x0A76 */ + 0x4F66,0x4F67,INVALC,0x4F68,0x4F69, + /* Range 0x789D - 0x78A1, array index: 0x0A7B */ + 0x4F74,0x4F75,0x4F76,INVALC,0x4F73, + /* Range 0x78AC - 0x78B3, array index: 0x0A80 */ + 0x4F79,0x4F7A,INVALC,INVALC,0x4F7B,0x4F7C,0x4F7D,0x4F7E, + /* Range 0x78C7 - 0x78C9, array index: 0x0A88 */ + 0x5024,0x5025,0x5026, + /* Range 0x78D2 - 0x78D6, array index: 0x0A8B */ + 0x5029,0x502A,INVALC,0x502B,0x502C, + /* Range 0x78DF - 0x78E1, array index: 0x0A90 */ + 0x502F,0x5030,0x5031, + /* Range 0x791C - 0x7920, array index: 0x0A93 */ + 0x5040,INVALC,0x5041,0x5042,0x5043, + /* Range 0x7944 - 0x7946, array index: 0x0A98 */ + 0x504E,0x504F,0x5050, + /* Range 0x7991 - 0x799C, array index: 0x0A9B */ + 0x5063,INVALC,0x5064,0x5065,0x5066,0x5067,INVALC,0x5068, + INVALC,INVALC,0x5069,0x506A, + /* Range 0x7A34 - 0x7A3A, array index: 0x0AA7 */ + 0x513A,0x513B,INVALC,INVALC,0x513C,0x513D,0x513E, + /* Range 0x7A44 - 0x7A48, array index: 0x0AAE */ + 0x513F,0x5140,INVALC,0x5141,0x5142, + /* Range 0x7A5C - 0x7A60, array index: 0x0AB3 */ + 0x5147,0x5148,INVALC,0x5149,0x514A, + /* Range 0x7AE8 - 0x7AEC, array index: 0x0AB8 */ + 0x516A,0x516B,INVALC,0x516C,0x516D, + /* Range 0x7B27 - 0x7B31, array index: 0x0ABD */ + 0x5177,INVALC,0x5178,0x5179,0x517A,INVALC,0x517B,0x517C, + 0x517D,0x517E,0x5221, + /* Range 0x7B3D - 0x7B41, array index: 0x0AC8 */ + 0x5223,INVALC,0x5224,0x5225,0x5226, + /* Range 0x7BBA - 0x7BBD, array index: 0x0ACD */ + 0x5244,0x5245,0x5246,0x5247, + /* Range 0x7BD6 - 0x7BDB, array index: 0x0AD1 */ + 0x524D,0x524E,INVALC,0x524F,0x5250,0x5251, + /* Range 0x7BF4 - 0x7C06, array index: 0x0AD7 */ + 0x5255,0x5256,INVALC,INVALC,0x5257,0x5258,0x5259,INVALC, + 0x525A,INVALC,0x525B,INVALC,INVALC,0x525C,0x525D,0x525E, + 0x525F,INVALC,0x5260, + /* Range 0x7C0B - 0x7C0F, array index: 0x0AEA */ + 0x5262,0x5263,INVALC,0x5264,0x5265, + /* Range 0x7C51 - 0x7C5E, array index: 0x0AEF */ + 0x5276,0x5277,0x5278,INVALC,0x5275,INVALC,INVALC,INVALC, + 0x5279,0x527A,0x527B,0x527C,0x527D,0x527E, + /* Range 0x7CB6 - 0x7CBC, array index: 0x0AFD */ + 0x5334,0x5335,INVALC,INVALC,0x5336,0x5337,0x5338, + /* Range 0x7CC7 - 0x7CC9, array index: 0x0B04 */ + 0x533B,0x533C,0x533D, + /* Range 0x7CD3 - 0x7CDA, array index: 0x0B07 */ + 0x5340,0x5341,0x5342,INVALC,0x5343,INVALC,0x5344,0x5345, + /* Range 0x7D07 - 0x7D09, array index: 0x0B0F */ + 0x534C,0x534D,0x534E, + /* Range 0x7D0F - 0x7D13, array index: 0x0B12 */ + 0x534F,INVALC,0x5350,0x5351,0x5352, + /* Range 0x7D3C - 0x7D41, array index: 0x0B17 */ + 0x535B,0x535C,0x535D,INVALC,0x535E,0x535F, + /* Range 0x7D59 - 0x7D5D, array index: 0x0B1D */ + 0x5366,0x5367,INVALC,0x5368,0x5369, + /* Range 0x7D7F - 0x7D8D, array index: 0x0B22 */ + 0x5371,INVALC,0x5372,0x5373,0x5374,INVALC,0x5375,0x5376, + INVALC,0x5377,INVALC,INVALC,0x5378,0x5379,0x537A, + /* Range 0x7DC2 - 0x7DC6, array index: 0x0B31 */ + 0x5429,0x542A,0x542B,0x542C,0x542D, + /* Range 0x7DCC - 0x7DCE, array index: 0x0B36 */ + 0x542E,0x542F,0x5430, + /* Range 0x7F3B - 0x7F3F, array index: 0x0B39 */ + 0x546C,0x546B,0x546D,0x546E,0x546F, + /* Range 0x7F5B - 0x7F5D, array index: 0x0B3E */ + 0x5476,0x5477,0x5478, + /* Range 0x7F61 - 0x7F66, array index: 0x0B41 */ + 0x5479,INVALC,0x547A,0x547B,0x547C,0x547D, + /* Range 0x7F7D - 0x7F80, array index: 0x0B47 */ + 0x5522,0x5523,0x5524,0x5525, + /* Range 0x7F8D - 0x7F91, array index: 0x0B4B */ + 0x5527,INVALC,0x5528,0x5529,0x552A, + /* Range 0x7FFD - 0x7FFF, array index: 0x0B50 */ + 0x5545,0x5546,0x5547, + /* Range 0x800D - 0x8016, array index: 0x0B53 */ + 0x554B,0x554C,0x554D,INVALC,0x554E,INVALC,0x554F,0x5550, + INVALC,0x5551, + /* Range 0x801D - 0x8020, array index: 0x0B5D */ + 0x5552,0x5553,0x5554,0x5555, + /* Range 0x80D4 - 0x80D8, array index: 0x0B61 */ + 0x5578,0x5579,INVALC,0x557A,0x557B, + /* Range 0x8116 - 0x8118, array index: 0x0B66 */ + 0x562A,0x562B,0x562C, + /* Range 0x8167 - 0x8169, array index: 0x0B69 */ + 0x563F,0x5640,0x5641, + /* Range 0x8184 - 0x8186, array index: 0x0B6C */ + 0x5647,0x5648,0x5649, + /* Range 0x81F0 - 0x81F9, array index: 0x0B6F */ + 0x5664,0x5665,0x5666,INVALC,INVALC,0x5667,0x5668,INVALC, + 0x5669,0x566A, + /* Range 0x8243 - 0x8246, array index: 0x0B79 */ + 0x567B,0x567C,0x567D,0x567E, + /* Range 0x827D - 0x8284, array index: 0x0B7D */ + 0x572D,INVALC,0x572E,0x572F,0x5730,INVALC,0x5731,0x5732, + /* Range 0x82A0 - 0x82AA, array index: 0x0B85 */ + 0x573D,0x573E,INVALC,0x573F,0x5740,INVALC,INVALC,0x5741, + 0x5742,0x5743,0x5744, + /* Range 0x82FD - 0x8301, array index: 0x0B90 */ + 0x575B,0x575C,INVALC,0x575D,0x575E, + /* Range 0x8307 - 0x830B, array index: 0x0B95 */ + 0x575F,0x5760,INVALC,0x5761,0x5762, + /* Range 0x831B - 0x8322, array index: 0x0B9A */ + 0x5764,INVALC,0x5765,0x5766,0x5767,INVALC,0x5768,0x5769, + /* Range 0x832C - 0x8330, array index: 0x0BA2 */ + 0x576A,0x576B,0x576C,INVALC,0x576D, + /* Range 0x8342 - 0x8344, array index: 0x0BA7 */ + 0x5773,0x5774,0x5775, + /* Range 0x8351 - 0x8357, array index: 0x0BAA */ + 0x5779,INVALC,0x583E,0x5763,0x577A,0x577B,0x577C, + /* Range 0x8398 - 0x839D, array index: 0x0BB1 */ + 0x582B,0x582C,INVALC,0x582D,0x582E,0x582F, + /* Range 0x83BE - 0x83C0, array index: 0x0BB7 */ + 0x5834,0x5835,0x5836, + /* Range 0x83CF - 0x83D1, array index: 0x0BBA */ + 0x5839,0x583A,0x583B, + /* Range 0x8456 - 0x845C, array index: 0x0BBD */ + 0x5857,INVALC,0x5858,0x5859,0x585A,INVALC,0x585B, + /* Range 0x84A6 - 0x84AA, array index: 0x0BC4 */ + 0x586E,INVALC,0x586F,0x5870,0x5871, + /* Range 0x84EF - 0x84F2, array index: 0x0BC9 */ + 0x5924,0x5925,0x5926,0x5927, + /* Range 0x8522 - 0x852B, array index: 0x0BCD */ + 0x5935,0x5936,0x5937,0x5938,INVALC,0x5939,INVALC,INVALC, + 0x593A,0x593B, + /* Range 0x8532 - 0x8536, array index: 0x0BD7 */ + 0x5929,0x593D,0x593E,INVALC,0x593F, + /* Range 0x854F - 0x8553, array index: 0x0BDC */ + 0x5942,0x5943,0x5944,0x5945,0x5946, + /* Range 0x855C - 0x8564, array index: 0x0BE1 */ + 0x5949,0x594A,0x594B,0x594C,0x594D,0x594E,0x594F,INVALC, + 0x5950, + /* Range 0x8579 - 0x8581, array index: 0x0BEA */ + 0x5953,0x5954,0x5955,INVALC,0x5956,INVALC,0x5957,INVALC, + 0x5958, + /* Range 0x85B4 - 0x85BF, array index: 0x0BF3 */ + 0x5967,INVALC,0x5968,0x5969,0x596A,INVALC,INVALC,INVALC, + 0x596B,0x596C,0x596D,0x596E, + /* Range 0x860D - 0x8612, array index: 0x0BFF */ + 0x5A25,0x5A26,INVALC,0x5A27,0x5A28,0x5A29, + /* Range 0x863C - 0x8642, array index: 0x0C05 */ + 0x5A34,0x5A35,INVALC,INVALC,0x5A36,0x3866,0x5A37, + /* Range 0x8652 - 0x8659, array index: 0x0C0C */ + 0x5A39,0x5A3A,INVALC,INVALC,0x5A3B,0x5A3C,0x5A3D,0x5A3E, + /* Range 0x8660 - 0x8664, array index: 0x0C14 */ + 0x5A40,0x5A41,0x5A42,0x5A43,0x5A44, + /* Range 0x8675 - 0x8677, array index: 0x0C19 */ + 0x5A48,0x5A49,0x5A4A, + /* Range 0x86A6 - 0x86A8, array index: 0x0C1C */ + 0x5A53,0x5A54,0x5A55, + /* Range 0x86B1 - 0x86B9, array index: 0x0C1F */ + 0x5A57,INVALC,0x5A58,0x5A59,0x5A5A,INVALC,0x5A5B,0x5A5C, + 0x5A5D, + /* Range 0x86BF - 0x86C5, array index: 0x0C28 */ + 0x5A5E,0x5A5F,0x5A60,INVALC,0x5A61,INVALC,0x5A62, + /* Range 0x870E - 0x8714, array index: 0x0C2F */ + 0x5A75,0x5A76,0x5A77,INVALC,INVALC,0x5A78,0x5A79, + /* Range 0x872E - 0x8732, array index: 0x0C36 */ + 0x5B22,0x5B23,INVALC,0x5B24,0x5B25, + /* Range 0x8739 - 0x8740, array index: 0x0C3B */ + 0x5B26,0x5B27,INVALC,0x5B28,0x5B29,0x5B2A,INVALC,0x5B2B, + /* Range 0x8783 - 0x878C, array index: 0x0C43 */ + 0x5B38,0x5B39,0x5B3A,0x5B3B,0x5B3C,0x5B3D,0x5B3E,INVALC, + 0x5B3F,0x5B40, + /* Range 0x8795 - 0x8799, array index: 0x0C4D */ + 0x5B43,INVALC,0x5B44,0x5B45,0x5B46, + /* Range 0x87AC - 0x87AE, array index: 0x0C52 */ + 0x5B4B,0x5B4C,0x5B4D, + /* Range 0x87C8 - 0x87CA, array index: 0x0C55 */ + 0x5B53,0x5B54,0x5B55, + /* Range 0x87E2 - 0x87E4, array index: 0x0C58 */ + 0x5B5D,0x5B5E,0x5B5F, + /* Range 0x8809 - 0x880B, array index: 0x0C5B */ + 0x5B6B,0x5B6C,0x5B6D, + /* Range 0x8810 - 0x881F, array index: 0x0C5E */ + 0x5B6E,INVALC,0x5B70,0x5B71,0x5B72,INVALC,INVALC,INVALC, + 0x5B73,0x5B6F,0x5B74,0x5B75,0x5B76,INVALC,0x5B77,0x5B78, + /* Range 0x8848 - 0x884B, array index: 0x0C6E */ + 0x5C26,0x5C27,0x5C28,0x5C29, + /* Range 0x8898 - 0x88A0, array index: 0x0C72 */ + 0x5C39,INVALC,0x5C3A,0x5C3B,0x5C3C,INVALC,INVALC,0x5C3D, + 0x5C3E, + /* Range 0x88CA - 0x88D3, array index: 0x0C7B */ + 0x5C45,0x5C46,0x5C47,0x5C48,0x5C49,INVALC,INVALC,0x5C4A, + 0x5C4B,0x5C4C, + /* Range 0x88EF - 0x88F1, array index: 0x0C85 */ + 0x5C50,0x5C51,0x5C52, + /* Range 0x890D - 0x890F, array index: 0x0C88 */ + 0x5C57,0x5C58,0x5C59, + /* Range 0x8915 - 0x891C, array index: 0x0C8B */ + 0x5C5A,0x5C5B,INVALC,0x5C5C,0x5C5D,0x5C5E,INVALC,0x5C5F, + /* Range 0x8926 - 0x8928, array index: 0x0C93 */ + 0x5C61,0x5C62,0x5C63, + /* Range 0x8930 - 0x8932, array index: 0x0C96 */ + 0x5C64,0x5C65,0x5C66, + /* Range 0x895A - 0x895C, array index: 0x0C99 */ + 0x5C73,0x5C74,0x5C75, + /* Range 0x8961 - 0x8963, array index: 0x0C9C */ + 0x5C76,0x5C77,0x5C78, + /* Range 0x897A - 0x897D, array index: 0x0C9F */ + 0x5C7E,0x5D21,0x5D22,0x5D23, + /* Range 0x89B4 - 0x89B7, array index: 0x0CA3 */ + 0x5D2F,0x5D30,0x5D31,0x5D32, + /* Range 0x89D4 - 0x89D8, array index: 0x0CA7 */ + 0x5D34,0x5D35,0x5D36,0x5D37,0x5D38, + /* Range 0x8A11 - 0x8A15, array index: 0x0CAC */ + 0x5D47,0x5D48,INVALC,0x5D49,0x5D4A, + /* Range 0x8A56 - 0x8A58, array index: 0x0CB1 */ + 0x5D5F,0x5D60,0x5D61, + /* Range 0x8A75 - 0x8A80, array index: 0x0CB4 */ + 0x5D67,0x5D68,0x5D69,INVALC,0x5D6A,0x5D6B,0x5D6C,INVALC, + INVALC,0x5D6D,0x5D6E,0x5D6F, + /* Range 0x8AC6 - 0x8ACA, array index: 0x0CC0 */ + 0x5E26,INVALC,0x5E27,0x5E28,0x5E29, + /* Range 0x8AD1 - 0x8AD7, array index: 0x0CC5 */ + 0x5E2A,INVALC,0x5E2B,0x5E2C,0x5E2D,INVALC,0x5E2E, + /* Range 0x8AF4 - 0x8AF6, array index: 0x0CCC */ + 0x5E33,0x5E34,0x5E35, + /* Range 0x8B42 - 0x8B48, array index: 0x0CCF */ + 0x5E44,0x5E45,0x5E46,0x5E47,0x5E48,INVALC,0x5E49, + /* Range 0x8B52 - 0x8B54, array index: 0x0CD6 */ + 0x5E4A,0x5E4B,0x5E4C, + /* Range 0x8C53 - 0x8C5D, array index: 0x0CD9 */ + 0x5E6C,0x5E6D,INVALC,INVALC,0x5E6E,0x5E6F,0x5E72,INVALC, + 0x5E70,INVALC,0x5E71, + /* Range 0x8D9E - 0x8DA0, array index: 0x0CE4 */ + 0x5F52,0x5F53,0x5F54, + /* Range 0x8DC5 - 0x8DCA, array index: 0x0CE7 */ + 0x5F5F,0x5F60,0x5F61,0x5F62,INVALC,0x5F63, + /* Range 0x8DF0 - 0x8DF4, array index: 0x0CED */ + 0x5F6E,0x5F70,0x5F71,INVALC,0x5F72, + /* Range 0x8E04 - 0x8E06, array index: 0x0CF2 */ + 0x5F75,0x5F76,0x5F77, + /* Range 0x8E20 - 0x8E27, array index: 0x0CF5 */ + 0x5F7C,0x5F7D,0x5F7E,0x6021,INVALC,INVALC,0x6022,0x6023, + /* Range 0x8E36 - 0x8E39, array index: 0x0CFD */ + 0x6026,0x6027,0x6028,0x6029, + /* Range 0x8E4B - 0x8E4F, array index: 0x0D01 */ + 0x602D,INVALC,0x602E,0x602F,0x6030, + /* Range 0x8E5B - 0x8E62, array index: 0x0D06 */ + 0x6032,0x6033,0x6034,0x6035,INVALC,INVALC,0x6036,0x6037, + /* Range 0x8E6C - 0x8E71, array index: 0x0D0E */ + 0x6039,0x603A,INVALC,0x603B,0x603C,0x603D, + /* Range 0x8E79 - 0x8E7B, array index: 0x0D14 */ + 0x603E,0x603F,0x6040, + /* Range 0x8E9A - 0x8E9E, array index: 0x0D17 */ + 0x6047,0x6048,INVALC,0x6049,0x604A, + /* Range 0x8EC0 - 0x8EC4, array index: 0x0D1C */ + 0x6054,0x6055,INVALC,0x6056,0x6057, + /* Range 0x8EED - 0x8EF1, array index: 0x0D21 */ + 0x6064,0x605E,INVALC,0x605F,0x6060, + /* Range 0x8F16 - 0x8F18, array index: 0x0D26 */ + 0x606B,0x606C,0x606D, + /* Range 0x8F2C - 0x8F2E, array index: 0x0D29 */ + 0x6075,0x6076,0x6077, + /* Range 0x8F34 - 0x8F37, array index: 0x0D2C */ + 0x6078,0x6079,0x607A,0x607B, + /* Range 0x8F4F - 0x8F55, array index: 0x0D30 */ + 0x6123,INVALC,0x6124,0x6125,0x6126,0x6127,0x6128, + /* Range 0x8FA0 - 0x8FA6, array index: 0x0D37 */ + 0x612E,0x612F,INVALC,INVALC,0x6130,0x6131,0x6132, + /* Range 0x9028 - 0x902F, array index: 0x0D3E */ + 0x6151,0x6152,0x6154,INVALC,0x6155,0x6156,INVALC,0x6153, + /* Range 0x9095 - 0x909B, array index: 0x0D46 */ + 0x616D,INVALC,0x616E,0x616F,0x6170,INVALC,0x6171, + /* Range 0x90A0 - 0x90A2, array index: 0x0D4D */ + 0x6172,0x6173,0x6174, + /* Range 0x90B0 - 0x90B6, array index: 0x0D50 */ + 0x6176,INVALC,0x6177,0x6178,0x6179,INVALC,0x617A, + /* Range 0x90C3 - 0x90C8, array index: 0x0D57 */ + 0x617E,0x6221,0x6222,INVALC,0x6223,0x6224, + /* Range 0x90D5 - 0x90DF, array index: 0x0D5D */ + 0x6225,INVALC,0x6226,0x6227,0x6228,INVALC,INVALC,0x6229, + 0x622A,INVALC,0x622B, + /* Range 0x90FE - 0x9108, array index: 0x0D68 */ + 0x6233,0x6234,0x6235,INVALC,INVALC,INVALC,0x6236,0x6237, + 0x6238,INVALC,0x6239, + /* Range 0x9114 - 0x9129, array index: 0x0D73 */ + 0x623C,INVALC,0x623D,0x623E,0x623F,INVALC,0x6240,INVALC, + 0x6241,INVALC,0x6242,INVALC,0x6243,INVALC,0x6245,0x6246, + INVALC,0x6244,INVALC,0x6247,INVALC,0x6248, + /* Range 0x9136 - 0x913D, array index: 0x0D89 */ + 0x624D,0x624E,INVALC,0x624F,0x6250,INVALC,0x6251,0x6252, + /* Range 0x9157 - 0x915B, array index: 0x0D91 */ + 0x6258,INVALC,0x6259,0x625A,0x625B, + /* Range 0x9179 - 0x917B, array index: 0x0D96 */ + 0x6261,0x6262,0x6263, + /* Range 0x9191 - 0x9195, array index: 0x0D99 */ + 0x626A,INVALC,0x626B,0x626C,0x626D, + /* Range 0x91AC - 0x91B3, array index: 0x0D9E */ + 0x6273,0x6274,0x6275,INVALC,0x6276,0x6277,0x6278,0x6279, + /* Range 0x91BB - 0x91C5, array index: 0x0DA6 */ + 0x627B,0x627C,0x627D,INVALC,0x627E,INVALC,INVALC,0x6321, + 0x6322,INVALC,0x6323, + /* Range 0x91E9 - 0x91F1, array index: 0x0DB1 */ + 0x632C,0x632D,INVALC,0x632E,0x632F,0x6330,0x6331,0x6332, + 0x6333, + /* Range 0x9200 - 0x920C, array index: 0x0DBA */ + 0x6338,0x6339,INVALC,INVALC,0x633A,0x633B,0x633C,0x633D, + INVALC,0x633E,0x633F,INVALC,0x6340, + /* Range 0x9223 - 0x9228, array index: 0x0DC7 */ + 0x6348,0x6349,0x634A,0x634B,INVALC,0x634C, + /* Range 0x922E - 0x9230, array index: 0x0DCD */ + 0x634D,0x634E,0x634F, + /* Range 0x9235 - 0x9247, array index: 0x0DD0 */ + 0x6351,0x6352,INVALC,0x6353,0x6354,0x6355,INVALC,0x6356, + INVALC,0x6357,INVALC,0x6358,INVALC,0x6359,0x635A,INVALC, + INVALC,0x635B,0x635C, + /* Range 0x924D - 0x9251, array index: 0x0DE3 */ + 0x635E,0x635F,0x6360,INVALC,0x6361, + /* Range 0x9265 - 0x9269, array index: 0x0DE8 */ + 0x6368,INVALC,0x6369,0x636A,0x636B, + /* Range 0x926E - 0x9270, array index: 0x0DED */ + 0x636C,0x636D,0x636E, + /* Range 0x9275 - 0x927F, array index: 0x0DF0 */ + 0x636F,0x6370,0x6371,0x6372,0x6373,INVALC,0x6374,0x6375, + 0x6376,INVALC,0x6377, + /* Range 0x9288 - 0x928E, array index: 0x0DFB */ + 0x6378,0x6379,0x637A,INVALC,INVALC,0x637B,0x637C, + /* Range 0x92A4 - 0x92A8, array index: 0x0E02 */ + 0x6424,0x6425,INVALC,0x6426,0x6427, + /* Range 0x92B8 - 0x92D0, array index: 0x0E07 */ + 0x642C,INVALC,0x642D,0x642E,0x642F,0x6430,INVALC,0x6431, + 0x6432,0x6433,0x6434,0x6435,INVALC,0x6436,0x6437,0x6438, + 0x6439,INVALC,INVALC,0x643A,0x643B,0x643C,0x643D,INVALC, + 0x643E, + /* Range 0x92D5 - 0x92E8, array index: 0x0E20 */ + 0x6440,INVALC,0x6441,0x6442,0x6443,INVALC,INVALC,0x6444, + 0x6445,INVALC,0x6446,0x6447,0x6448,INVALC,0x6449,INVALC, + 0x644A,INVALC,0x644B,0x644C, + /* Range 0x931C - 0x932A, array index: 0x0E34 */ + 0x645A,0x645B,0x645C,0x645D,INVALC,0x645E,INVALC,INVALC, + 0x645F,0x6460,INVALC,0x6461,INVALC,0x6462,0x6463, + /* Range 0x9333 - 0x9337, array index: 0x0E43 */ + 0x6464,0x6465,INVALC,0x6466,0x6467, + /* Range 0x9347 - 0x9349, array index: 0x0E48 */ + 0x6468,0x6469,0x646A, + /* Range 0x9350 - 0x9352, array index: 0x0E4B */ + 0x646B,0x646C,0x646D, + /* Range 0x936D - 0x9376, array index: 0x0E4E */ + 0x6478,INVALC,0x6479,0x647A,0x647B,INVALC,0x647C,0x647D, + INVALC,0x647E, + /* Range 0x937D - 0x9382, array index: 0x0E58 */ + 0x6522,INVALC,0x6523,0x6524,0x6525,0x6526, + /* Range 0x93B4 - 0x93B6, array index: 0x0E5E */ + 0x6537,0x6538,0x6539, + /* Range 0x93C4 - 0x93CD, array index: 0x0E61 */ + 0x653D,0x653E,0x653F,0x6540,INVALC,0x6541,0x6542,0x6543, + 0x6544,0x6545, + /* Range 0x93F7 - 0x93FD, array index: 0x0E6B */ + 0x654F,0x6550,0x654E,0x6551,0x6552,INVALC,0x6553, + /* Range 0x940D - 0x940F, array index: 0x0E72 */ + 0x6559,0x655A,0x655B, + /* Range 0x9415 - 0x9417, array index: 0x0E75 */ + 0x655C,0x655D,0x655E, + /* Range 0x942E - 0x9434, array index: 0x0E78 */ + 0x6560,0x6561,INVALC,0x6562,0x6563,0x6564,0x6565, + /* Range 0x946B - 0x9472, array index: 0x0E7F */ + 0x6575,INVALC,0x6576,0x6577,0x6578,INVALC,0x6579,0x657A, + /* Range 0x958C - 0x958E, array index: 0x0E87 */ + 0x6624,0x6625,0x6626, + /* Range 0x959D - 0x95A1, array index: 0x0E8A */ + 0x6627,0x6628,0x6629,INVALC,0x662A, + /* Range 0x95D0 - 0x95D3, array index: 0x0E8F */ + 0x6638,0x6639,0x663A,0x663B, + /* Range 0x95D9 - 0x95E0, array index: 0x0E93 */ + 0x663C,0x663D,INVALC,INVALC,0x663E,0x663F,0x6640,0x6641, + /* Range 0x9622 - 0x9626, array index: 0x0E9B */ + 0x6646,INVALC,0x6647,0x6648,0x6649, + /* Range 0x9637 - 0x963D, array index: 0x0EA0 */ + 0x664D,0x664E,0x664F,0x6650,INVALC,0x6651,0x6652, + /* Range 0x9654 - 0x9658, array index: 0x0EA7 */ + 0x6655,INVALC,0x6656,0x6657,0x6658, + /* Range 0x967B - 0x9684, array index: 0x0EAC */ + 0x665C,0x665D,INVALC,0x665E,0x665F,INVALC,0x6660,0x6661, + 0x6662,0x6663, + /* Range 0x96A4 - 0x96A6, array index: 0x0EB6 */ + 0x666A,0x666B,0x666C, + /* Range 0x96DD - 0x96DF, array index: 0x0EB9 */ + 0x6677,0x6678,0x6679, + /* Range 0x9721 - 0x9723, array index: 0x0EBC */ + 0x6727,0x6728,0x6729, + /* Range 0x9757 - 0x975B, array index: 0x0EBF */ + 0x6733,0x6734,INVALC,0x6735,0x6736, + /* Range 0x9776 - 0x9778, array index: 0x0EC4 */ + 0x673C,0x673D,0x673E, + /* Range 0x9795 - 0x979A, array index: 0x0EC7 */ + 0x6744,0x6745,0x6746,INVALC,0x6747,0x6748, + /* Range 0x97B5 - 0x97D1, array index: 0x0ECD */ + 0x6750,0x6751,INVALC,0x6752,0x6753,0x6754,INVALC,0x6755, + INVALC,0x6756,0x6757,INVALC,0x6758,INVALC,INVALC,0x6759, + 0x675A,INVALC,0x675B,INVALC,0x675C,0x675D,INVALC,0x675E, + 0x675F,0x6760,INVALC,0x6761,0x6762, + /* Range 0x97D7 - 0x97E1, array index: 0x0EEA */ + 0x6764,0x6765,0x6766,INVALC,0x676A,INVALC,0x6767,0x6768, + INVALC,0x6769,0x676B, + /* Range 0x982E - 0x9835, array index: 0x0EF5 */ + 0x6822,0x6823,0x6824,INVALC,0x6825,0x6826,INVALC,0x6827, + /* Range 0x9851 - 0x985A, array index: 0x0EFD */ + 0x682D,0x682E,0x682F,INVALC,INVALC,0x6830,0x6831,INVALC, + 0x6832,0x6833, + /* Range 0x9862 - 0x9866, array index: 0x0F07 */ + 0x6834,0x6835,INVALC,0x6836,0x6837, + /* Range 0x98B7 - 0x98BB, array index: 0x0F0C */ + 0x683F,0x6840,INVALC,0x6841,0x6842, + /* Range 0x98E3 - 0x98E7, array index: 0x0F11 */ + 0x6849,INVALC,0x684A,0x684B,0x684C, + /* Range 0x9915 - 0x991C, array index: 0x0F16 */ + 0x6854,0x6855,0x6856,INVALC,INVALC,0x6857,0x6858,0x6859, + /* Range 0x9931 - 0x993C, array index: 0x0F1E */ + 0x685F,0x6860,0x6861,0x6862,0x6863,INVALC,INVALC,INVALC, + 0x6864,0x6865,0x6866,0x6867, + /* Range 0x9946 - 0x9948, array index: 0x0F2A */ + 0x686A,0x686B,0x686C, + /* Range 0x9958 - 0x9960, array index: 0x0F2D */ + 0x6870,0x6871,INVALC,0x6872,0x6873,INVALC,0x6874,0x6875, + 0x6876, + /* Range 0x99B0 - 0x99B2, array index: 0x0F36 */ + 0x687B,0x687C,0x687D, + /* Range 0x99EA - 0x99EC, array index: 0x0F39 */ + 0x692E,0x692F,0x6930, + /* Range 0x9A02 - 0x9A04, array index: 0x0F3C */ + 0x6937,0x6938,0x6939, + /* Range 0x9A20 - 0x9A24, array index: 0x0F3F */ + 0x6940,INVALC,0x6941,0x6942,0x6943, + /* Range 0x9A4A - 0x9A4E, array index: 0x0F44 */ + 0x694E,0x694F,0x6950,INVALC,0x6951, + /* Range 0x9AB2 - 0x9AB6, array index: 0x0F49 */ + 0x695A,INVALC,0x695B,0x695C,0x695D, + /* Range 0x9AD5 - 0x9AD7, array index: 0x0F4E */ + 0x6969,0x696A,0x696B, + /* Range 0x9AFD - 0x9B12, array index: 0x0F51 */ + 0x6979,INVALC,0x697A,0x697B,0x697C,0x697D,0x697E,0x6A21, + 0x6A22,INVALC,INVALC,0x6A23,0x6A24,INVALC,0x6A25,0x6A26, + 0x6A27,0x6A28,INVALC,0x6A29,INVALC,0x6A2A, + /* Range 0x9B33 - 0x9B3A, array index: 0x0F67 */ + 0x6A33,0x6A34,0x6A35,INVALC,0x6A36,INVALC,0x6A37,0x6A38, + /* Range 0x9B55 - 0x9B57, array index: 0x0F6F */ + 0x6A3D,0x6A3E,0x6A3F, + /* Range 0x9B68 - 0x9B6E, array index: 0x0F72 */ + 0x6A46,INVALC,0x6A47,0x6A48,0x6A49,0x6A4A,0x6A4B, + /* Range 0x9B75 - 0x9B79, array index: 0x0F79 */ + 0x6A4D,INVALC,0x6A4E,0x6A4F,0x6A50, + /* Range 0x9B84 - 0x9B90, array index: 0x0F7E */ + 0x6A53,0x6A54,0x6A55,0x6A56,INVALC,0x6A57,0x6A58,0x6A59, + INVALC,0x6A5A,INVALC,0x6A5B,0x6A5C, + /* Range 0x9BB0 - 0x9BB2, array index: 0x0F8B */ + 0x6A65,0x6A66,0x6A67, + /* Range 0x9BBB - 0x9BC1, array index: 0x0F8E */ + 0x6A6A,0x6A6B,INVALC,0x6A6C,0x6A6D,INVALC,0x6A6E, + /* Range 0x9BF7 - 0x9BFA, array index: 0x0F95 */ + 0x6A7D,0x6A7E,0x6B21,0x6B22, + /* Range 0x9C16 - 0x9C1E, array index: 0x0F99 */ + 0x6B2A,INVALC,0x6B2B,0x6B2C,0x6B2D,INVALC,0x6B2E,INVALC, + 0x6B2F, + /* Range 0x9C22 - 0x9C2A, array index: 0x0FA2 */ + 0x6B30,0x6B31,INVALC,INVALC,0x6B32,0x6B33,0x6B34,0x6B35, + 0x6B36, + /* Range 0x9C35 - 0x9C37, array index: 0x0FAB */ + 0x6B38,0x6B39,0x6B3A, + /* Range 0x9C41 - 0x9C45, array index: 0x0FAE */ + 0x6B3C,INVALC,0x6B3D,0x6B3E,0x6B3F, + /* Range 0x9C4E - 0x9C5F, array index: 0x0FB3 */ + 0x6B42,0x6B43,0x6B44,INVALC,INVALC,0x6B45,0x6B46,INVALC, + 0x6B47,INVALC,0x6B48,INVALC,INVALC,0x6B49,0x6B50,0x6B4A, + 0x6B4B,0x6B4C, + /* Range 0x9C68 - 0x9C6B, array index: 0x0FC5 */ + 0x6B52,0x6B4E,0x6B4F,0x6B51, + /* Range 0x9D1C - 0x9D1E, array index: 0x0FC9 */ + 0x6B62,0x6B63,0x6B64, + /* Range 0x9D2F - 0x9D34, array index: 0x0FCC */ + 0x6B65,0x6B66,INVALC,0x6B67,0x6B68,0x6B69, + /* Range 0x9D69 - 0x9D6B, array index: 0x0FD2 */ + 0x6B78,0x6B79,0x6B7A, + /* Range 0x9D92 - 0x9D98, array index: 0x0FD5 */ + 0x6C29,0x6C2A,INVALC,0x6C2B,0x6C2C,0x6C2D,0x6C2E, + /* Range 0x9DD4 - 0x9DD7, array index: 0x0FDC */ + 0x6C3C,0x6C3D,0x6C3E,0x6C3F, + /* Range 0x9DDE - 0x9DE0, array index: 0x0FE0 */ + 0x6C41,0x6C42,0x6C43, + /* Range 0x9E0E - 0x9E16, array index: 0x0FE3 */ + 0x6C50,INVALC,0x6C51,0x6C52,0x6C53,INVALC,INVALC,0x6C54, + 0x6C55, + /* Range 0x9E7A - 0x9E7C, array index: 0x0FEC */ + 0x6C59,0x6C5A,0x6C5B, + /* Range 0x9E80 - 0x9E87, array index: 0x0FEF */ + 0x6C5C,INVALC,0x6C5D,0x6C5E,0x6C5F,0x6C60,INVALC,0x6C61, + /* Range 0x9EAC - 0x9EB5, array index: 0x0FF7 */ + 0x6C6A,INVALC,0x6C6B,0x6C6C,0x6C6D,INVALC,INVALC,0x6C6E, + 0x6C6F,0x6C70, + /* Range 0x9EEC - 0x9EF2, array index: 0x1001 */ + 0x6C78,0x6C79,0x6C7A,INVALC,0x6C7B,0x6C7C,0x6C7D, + /* Range 0x9F0F - 0x9F1B, array index: 0x1008 */ + 0x6D26,0x6D27,0x6D28,0x6D29,INVALC,0x6D2A,INVALC,0x6D2B, + 0x6D2C,INVALC,0x6D2D,0x6D2E,0x6D2F, + /* Range 0x9F39 - 0x9F47, array index: 0x1015 */ + 0x6D3A,0x6D3B,INVALC,0x6D3C,0x6D3D,INVALC,0x6D3E,INVALC, + 0x6D3F,INVALC,0x6D40,0x6D41,0x6D42,0x6D43,0x6D44, + /* Range 0x9F53 - 0x9F5E, array index: 0x1024 */ + 0x6D45,INVALC,0x6D46,0x6D47,0x6D48,0x6D49,INVALC,0x6D4A, + INVALC,INVALC,0x6D4B,0x6D4C, + /* Range 0x9F6D - 0x9F75, array index: 0x1030 */ + 0x6D4F,0x6D50,0x6D51,0x6D52,0x6D53,INVALC,0x6D54,INVALC, + 0x6D55, + /* Range 0x9F8F - 0x9F97, array index: 0x1039 */ + 0x6D58,0x6D59,0x6D5A,0x6D5B,INVALC,0x6D5C,INVALC,0x6D5D, + 0x6D5E, + /* Range 0x9FA1 - 0x9FA5, array index: 0x1042 */ + 0x6D60,0x6D61,0x6D62,INVALC,0x6D63, + /* Unranged codes (426 codes) */ + /* Array index: 0x1047 */ 0x007E,0x2237, + /* Array index: 0x1047 */ 0x00A1,0x2242, + /* Array index: 0x1047 */ 0x00A4,0x2270, + /* Array index: 0x1047 */ 0x00A6,0x2243, + /* Array index: 0x1047 */ 0x00A9,0x226D, + /* Array index: 0x1047 */ 0x00AA,0x226C, + /* Array index: 0x1047 */ 0x00AE,0x226E, + /* Array index: 0x1047 */ 0x00AF,0x2234, + /* Array index: 0x1047 */ 0x00B8,0x2231, + /* Array index: 0x1047 */ 0x00BA,0x226B, + /* Array index: 0x1047 */ 0x01F5,0x2B39, + /* Array index: 0x1047 */ 0x02C7,0x2230, + /* Array index: 0x1047 */ 0x03C2,0x2678, + /* Array index: 0x1047 */ 0x2116,0x2271, + /* Array index: 0x1047 */ 0x2122,0x226F, + /* Array index: 0x1047 */ 0x4E02,0x3021, + /* Array index: 0x1047 */ 0x4E04,0x3022, + /* Array index: 0x1047 */ 0x4E05,0x3023, + /* Array index: 0x1047 */ 0x4E0C,0x3024, + /* Array index: 0x1047 */ 0x4E12,0x3025, + /* Array index: 0x1047 */ 0x4E1F,0x3026, + /* Array index: 0x1047 */ 0x4E23,0x3027, + /* Array index: 0x1047 */ 0x4E24,0x3028, + /* Array index: 0x1047 */ 0x4E28,0x3029, + /* Array index: 0x1047 */ 0x4E2B,0x302A, + /* Array index: 0x1047 */ 0x4E35,0x302E, + /* Array index: 0x1047 */ 0x4E40,0x302F, + /* Array index: 0x1047 */ 0x4E41,0x3030, + /* Array index: 0x1047 */ 0x4E44,0x3031, + /* Array index: 0x1047 */ 0x4E47,0x3032, + /* Array index: 0x1047 */ 0x4E51,0x3033, + /* Array index: 0x1047 */ 0x4E5A,0x3034, + /* Array index: 0x1047 */ 0x4E5C,0x3035, + /* Array index: 0x1047 */ 0x4E63,0x3036, + /* Array index: 0x1047 */ 0x4E68,0x3037, + /* Array index: 0x1047 */ 0x4E69,0x3038, + /* Array index: 0x1047 */ 0x4E74,0x3039, + /* Array index: 0x1047 */ 0x4E75,0x303A, + /* Array index: 0x1047 */ 0x4E79,0x303B, + /* Array index: 0x1047 */ 0x4E7F,0x303C, + /* Array index: 0x1047 */ 0x4E8D,0x303D, + /* Array index: 0x1047 */ 0x4E96,0x303E, + /* Array index: 0x1047 */ 0x4E97,0x303F, + /* Array index: 0x1047 */ 0x4E9D,0x3040, + /* Array index: 0x1047 */ 0x4EAF,0x3041, + /* Array index: 0x1047 */ 0x4EB9,0x3042, + /* Array index: 0x1047 */ 0x4EC3,0x3043, + /* Array index: 0x1047 */ 0x4ED0,0x3044, + /* Array index: 0x1047 */ 0x4EDA,0x3045, + /* Array index: 0x1047 */ 0x4EDB,0x3046, + /* Array index: 0x1047 */ 0x4EE8,0x304A, + /* Array index: 0x1047 */ 0x4EEF,0x304B, + /* Array index: 0x1047 */ 0x4EF1,0x304C, + /* Array index: 0x1047 */ 0x4EF3,0x304D, + /* Array index: 0x1047 */ 0x4EF5,0x304E, + /* Array index: 0x1047 */ 0x4F08,0x3055, + /* Array index: 0x1047 */ 0x4F0B,0x3056, + /* Array index: 0x1047 */ 0x4F0C,0x3057, + /* Array index: 0x1047 */ 0x4F12,0x3058, + /* Array index: 0x1047 */ 0x4F2E,0x305D, + /* Array index: 0x1047 */ 0x4F31,0x305E, + /* Array index: 0x1047 */ 0x4F33,0x3060, + /* Array index: 0x1047 */ 0x4F35,0x3061, + /* Array index: 0x1047 */ 0x4F37,0x3062, + /* Array index: 0x1047 */ 0x4F39,0x3063, + /* Array index: 0x1047 */ 0x4F3B,0x3064, + /* Array index: 0x1047 */ 0x4F3E,0x3065, + /* Array index: 0x1047 */ 0x4F40,0x3066, + /* Array index: 0x1047 */ 0x4F42,0x3067, + /* Array index: 0x1047 */ 0x4F52,0x306C, + /* Array index: 0x1047 */ 0x4F54,0x306D, + /* Array index: 0x1047 */ 0x4F56,0x306E, + /* Array index: 0x1047 */ 0x4F58,0x306F, + /* Array index: 0x1047 */ 0x4F5F,0x3070, + /* Array index: 0x1047 */ 0x4F60,0x305F, + /* Array index: 0x1047 */ 0x4F63,0x3071, + /* Array index: 0x1047 */ 0x4F6A,0x3072, + /* Array index: 0x1047 */ 0x4F6C,0x3073, + /* Array index: 0x1047 */ 0x4F6E,0x3074, + /* Array index: 0x1047 */ 0x4F71,0x3075, + /* Array index: 0x1047 */ 0x4F89,0x3122, + /* Array index: 0x1047 */ 0x4F8A,0x3123, + /* Array index: 0x1047 */ 0x4F8C,0x3124, + /* Array index: 0x1047 */ 0x4F8E,0x3125, + /* Array index: 0x1047 */ 0x4F97,0x312A, + /* Array index: 0x1047 */ 0x4F99,0x312B, + /* Array index: 0x1047 */ 0x4F9A,0x312C, + /* Array index: 0x1047 */ 0x4F9E,0x312D, + /* Array index: 0x1047 */ 0x4F9F,0x312E, + /* Array index: 0x1047 */ 0x4FB2,0x312F, + /* Array index: 0x1047 */ 0x4FB7,0x3130, + /* Array index: 0x1047 */ 0x4FD2,0x3140, + /* Array index: 0x1047 */ 0x4FDC,0x3141, + /* Array index: 0x1047 */ 0x4FE0,0x3142, + /* Array index: 0x1047 */ 0x4FE2,0x3143, + /* Array index: 0x1047 */ 0x4FF0,0x3144, + /* Array index: 0x1047 */ 0x4FF2,0x3145, + /* Array index: 0x1047 */ 0x5004,0x314B, + /* Array index: 0x1047 */ 0x5007,0x314C, + /* Array index: 0x1047 */ 0x500A,0x314D, + /* Array index: 0x1047 */ 0x500C,0x314E, + /* Array index: 0x1047 */ 0x500E,0x314F, + /* Array index: 0x1047 */ 0x5010,0x3150, + /* Array index: 0x1047 */ 0x5013,0x3151, + /* Array index: 0x1047 */ 0x5022,0x3158, + /* Array index: 0x1047 */ 0x5027,0x3159, + /* Array index: 0x1047 */ 0x502E,0x315A, + /* Array index: 0x1047 */ 0x5030,0x315B, + /* Array index: 0x1047 */ 0x5032,0x315C, + /* Array index: 0x1047 */ 0x5033,0x315D, + /* Array index: 0x1047 */ 0x5035,0x315E, + /* Array index: 0x1047 */ 0x503B,0x3176, + /* Array index: 0x1047 */ 0x504A,0x3164, + /* Array index: 0x1047 */ 0x504C,0x3165, + /* Array index: 0x1047 */ 0x504E,0x3166, + /* Array index: 0x1047 */ 0x5057,0x316A, + /* Array index: 0x1047 */ 0x5059,0x316B, + /* Array index: 0x1047 */ 0x506A,0x3172, + /* Array index: 0x1047 */ 0x506D,0x3173, + /* Array index: 0x1047 */ 0x5070,0x3174, + /* Array index: 0x1047 */ 0x5071,0x3175, + /* Array index: 0x1047 */ 0x5081,0x3177, + /* Array index: 0x1047 */ 0x5083,0x3178, + /* Array index: 0x1047 */ 0x5084,0x3179, + /* Array index: 0x1047 */ 0x5086,0x317A, + /* Array index: 0x1047 */ 0x508A,0x317B, + /* Array index: 0x1047 */ 0x50AA,0x322C, + /* Array index: 0x1047 */ 0x50AF,0x322D, + /* Array index: 0x1047 */ 0x50B0,0x322E, + /* Array index: 0x1047 */ 0x50B9,0x322F, + /* Array index: 0x1047 */ 0x50BA,0x3230, + /* Array index: 0x1047 */ 0x50BD,0x3231, + /* Array index: 0x1047 */ 0x50C0,0x3232, + /* Array index: 0x1047 */ 0x50C3,0x3233, + /* Array index: 0x1047 */ 0x50C4,0x3234, + /* Array index: 0x1047 */ 0x50C7,0x3235, + /* Array index: 0x1047 */ 0x50CC,0x3236, + /* Array index: 0x1047 */ 0x50CE,0x3237, + /* Array index: 0x1047 */ 0x50D0,0x3238, + /* Array index: 0x1047 */ 0x50D3,0x3239, + /* Array index: 0x1047 */ 0x50D4,0x323A, + /* Array index: 0x1047 */ 0x50D8,0x323B, + /* Array index: 0x1047 */ 0x50DC,0x323C, + /* Array index: 0x1047 */ 0x50DD,0x323D, + /* Array index: 0x1047 */ 0x50DF,0x323E, + /* Array index: 0x1047 */ 0x50E2,0x323F, + /* Array index: 0x1047 */ 0x50E4,0x3240, + /* Array index: 0x1047 */ 0x50E6,0x3241, + /* Array index: 0x1047 */ 0x50E8,0x3242, + /* Array index: 0x1047 */ 0x50E9,0x3243, + /* Array index: 0x1047 */ 0x50EF,0x3244, + /* Array index: 0x1047 */ 0x50F1,0x3245, + /* Array index: 0x1047 */ 0x50F2,0x3251, + /* Array index: 0x1047 */ 0x50F6,0x3246, + /* Array index: 0x1047 */ 0x50FA,0x3247, + /* Array index: 0x1047 */ 0x50FE,0x3248, + /* Array index: 0x1047 */ 0x5103,0x3249, + /* Array index: 0x1047 */ 0x5117,0x3253, + /* Array index: 0x1047 */ 0x5123,0x3259, + /* Array index: 0x1047 */ 0x5127,0x325A, + /* Array index: 0x1047 */ 0x5128,0x325B, + /* Array index: 0x1047 */ 0x512C,0x325C, + /* Array index: 0x1047 */ 0x512D,0x325D, + /* Array index: 0x1047 */ 0x512F,0x325E, + /* Array index: 0x1047 */ 0x5142,0x3265, + /* Array index: 0x1047 */ 0x514A,0x3266, + /* Array index: 0x1047 */ 0x514F,0x3267, + /* Array index: 0x1047 */ 0x5153,0x3268, + /* Array index: 0x1047 */ 0x5155,0x3269, + /* Array index: 0x1047 */ 0x5157,0x326A, + /* Array index: 0x1047 */ 0x5158,0x326B, + /* Array index: 0x1047 */ 0x515F,0x326C, + /* Array index: 0x1047 */ 0x5164,0x326D, + /* Array index: 0x1047 */ 0x5166,0x326E, + /* Array index: 0x1047 */ 0x517E,0x326F, + /* Array index: 0x1047 */ 0x5183,0x3270, + /* Array index: 0x1047 */ 0x5184,0x3271, + /* Array index: 0x1047 */ 0x518B,0x3272, + /* Array index: 0x1047 */ 0x518E,0x3273, + /* Array index: 0x1047 */ 0x5198,0x3274, + /* Array index: 0x1047 */ 0x519D,0x3275, + /* Array index: 0x1047 */ 0x51A1,0x3276, + /* Array index: 0x1047 */ 0x51A3,0x3277, + /* Array index: 0x1047 */ 0x51AD,0x3278, + /* Array index: 0x1047 */ 0x51B8,0x3279, + /* Array index: 0x1047 */ 0x51BA,0x327A, + /* Array index: 0x1047 */ 0x51BC,0x327B, + /* Array index: 0x1047 */ 0x51BE,0x327C, + /* Array index: 0x1047 */ 0x51BF,0x327D, + /* Array index: 0x1047 */ 0x51C2,0x327E, + /* Array index: 0x1047 */ 0x51C8,0x3321, + /* Array index: 0x1047 */ 0x51D8,0x3327, + /* Array index: 0x1047 */ 0x51DE,0x3328, + /* Array index: 0x1047 */ 0x51E2,0x3329, + /* Array index: 0x1047 */ 0x51E5,0x332A, + /* Array index: 0x1047 */ 0x51EE,0x332B, + /* Array index: 0x1047 */ 0x51F7,0x332F, + /* Array index: 0x1047 */ 0x5201,0x3330, + /* Array index: 0x1047 */ 0x5202,0x3331, + /* Array index: 0x1047 */ 0x5205,0x3332, + /* Array index: 0x1047 */ 0x5222,0x3338, + /* Array index: 0x1047 */ 0x5228,0x3339, + /* Array index: 0x1047 */ 0x5231,0x333A, + /* Array index: 0x1047 */ 0x5232,0x333B, + /* Array index: 0x1047 */ 0x5235,0x333C, + /* Array index: 0x1047 */ 0x523C,0x333D, + /* Array index: 0x1047 */ 0x5245,0x333E, + /* Array index: 0x1047 */ 0x5249,0x333F, + /* Array index: 0x1047 */ 0x5255,0x3340, + /* Array index: 0x1047 */ 0x5257,0x3341, + /* Array index: 0x1047 */ 0x5258,0x3342, + /* Array index: 0x1047 */ 0x525A,0x3343, + /* Array index: 0x1047 */ 0x525C,0x3344, + /* Array index: 0x1047 */ 0x5266,0x3348, + /* Array index: 0x1047 */ 0x526E,0x3349, + /* Array index: 0x1047 */ 0x5280,0x334D, + /* Array index: 0x1047 */ 0x5282,0x334E, + /* Array index: 0x1047 */ 0x5285,0x334F, + /* Array index: 0x1047 */ 0x528A,0x3350, + /* Array index: 0x1047 */ 0x528C,0x3351, + /* Array index: 0x1047 */ 0x52AF,0x335D, + /* Array index: 0x1047 */ 0x52B0,0x335E, + /* Array index: 0x1047 */ 0x52C0,0x3365, + /* Array index: 0x1047 */ 0x52C4,0x3366, + /* Array index: 0x1047 */ 0x52C6,0x3367, + /* Array index: 0x1047 */ 0x52C8,0x3368, + /* Array index: 0x1047 */ 0x52CC,0x3369, + /* Array index: 0x1047 */ 0x52CF,0x336A, + /* Array index: 0x1047 */ 0x52D1,0x336B, + /* Array index: 0x1047 */ 0x52D4,0x336C, + /* Array index: 0x1047 */ 0x52D6,0x336D, + /* Array index: 0x1047 */ 0x52DB,0x336E, + /* Array index: 0x1047 */ 0x52DC,0x336F, + /* Array index: 0x1047 */ 0x52E1,0x3370, + /* Array index: 0x1047 */ 0x52E5,0x3371, + /* Array index: 0x1047 */ 0x52F0,0x3376, + /* Array index: 0x1047 */ 0x52F1,0x3377, + /* Array index: 0x1047 */ 0x52F4,0x3378, + /* Array index: 0x1047 */ 0x52F6,0x3379, + /* Array index: 0x1047 */ 0x52F7,0x337A, + /* Array index: 0x1047 */ 0x5300,0x337B, + /* Array index: 0x1047 */ 0x5303,0x337C, + /* Array index: 0x1047 */ 0x5311,0x3422, + /* Array index: 0x1047 */ 0x5313,0x3423, + /* Array index: 0x1047 */ 0x5318,0x3424, + /* Array index: 0x1047 */ 0x5330,0x3430, + /* Array index: 0x1047 */ 0x5332,0x3431, + /* Array index: 0x1047 */ 0x5335,0x3432, + /* Array index: 0x1047 */ 0x5342,0x3436, + /* Array index: 0x1047 */ 0x534B,0x3438, + /* Array index: 0x1047 */ 0x534C,0x3437, + /* Array index: 0x1047 */ 0x5359,0x3439, + /* Array index: 0x1047 */ 0x535B,0x343A, + /* Array index: 0x1047 */ 0x5361,0x343B, + /* Array index: 0x1047 */ 0x5363,0x343C, + /* Array index: 0x1047 */ 0x5365,0x343D, + /* Array index: 0x1047 */ 0x536C,0x343E, + /* Array index: 0x1047 */ 0x536D,0x343F, + /* Array index: 0x1047 */ 0x5372,0x3440, + /* Array index: 0x1047 */ 0x5379,0x3441, + /* Array index: 0x1047 */ 0x537E,0x3442, + /* Array index: 0x1047 */ 0x5383,0x3443, + /* Array index: 0x1047 */ 0x5387,0x3444, + /* Array index: 0x1047 */ 0x5388,0x3445, + /* Array index: 0x1047 */ 0x538E,0x3446, + /* Array index: 0x1047 */ 0x5393,0x3447, + /* Array index: 0x1047 */ 0x5394,0x3448, + /* Array index: 0x1047 */ 0x5399,0x3449, + /* Array index: 0x1047 */ 0x539D,0x344A, + /* Array index: 0x1047 */ 0x53A1,0x344B, + /* Array index: 0x1047 */ 0x53A4,0x344C, + /* Array index: 0x1047 */ 0x53AA,0x344D, + /* Array index: 0x1047 */ 0x53AB,0x344E, + /* Array index: 0x1047 */ 0x53AF,0x344F, + /* Array index: 0x1047 */ 0x53B2,0x3450, + /* Array index: 0x1047 */ 0x53BD,0x3456, + /* Array index: 0x1047 */ 0x53C0,0x3457, + /* Array index: 0x1047 */ 0x53C5,0x3458, + /* Array index: 0x1047 */ 0x53CF,0x3459, + /* Array index: 0x1047 */ 0x53D2,0x345A, + /* Array index: 0x1047 */ 0x53D3,0x345B, + /* Array index: 0x1047 */ 0x53D5,0x345C, + /* Array index: 0x1047 */ 0x53DA,0x345D, + /* Array index: 0x1047 */ 0x53DD,0x345E, + /* Array index: 0x1047 */ 0x53DE,0x345F, + /* Array index: 0x1047 */ 0x53E0,0x3460, + /* Array index: 0x1047 */ 0x53E6,0x3461, + /* Array index: 0x1047 */ 0x53E7,0x3462, + /* Array index: 0x1047 */ 0x53F5,0x3463, + /* Array index: 0x1047 */ 0x5402,0x3464, + /* Array index: 0x1047 */ 0x5413,0x3465, + /* Array index: 0x1047 */ 0x541A,0x3466, + /* Array index: 0x1047 */ 0x5421,0x3467, + /* Array index: 0x1047 */ 0x5427,0x3468, + /* Array index: 0x1047 */ 0x5428,0x3469, + /* Array index: 0x1047 */ 0x542A,0x346A, + /* Array index: 0x1047 */ 0x542F,0x346B, + /* Array index: 0x1047 */ 0x5431,0x346C, + /* Array index: 0x1047 */ 0x5434,0x346D, + /* Array index: 0x1047 */ 0x5435,0x346E, + /* Array index: 0x1047 */ 0x5443,0x346F, + /* Array index: 0x1047 */ 0x5444,0x3470, + /* Array index: 0x1047 */ 0x5447,0x3471, + /* Array index: 0x1047 */ 0x544D,0x3472, + /* Array index: 0x1047 */ 0x544F,0x3473, + /* Array index: 0x1047 */ 0x545E,0x3474, + /* Array index: 0x1047 */ 0x5462,0x3475, + /* Array index: 0x1047 */ 0x5464,0x3476, + /* Array index: 0x1047 */ 0x5466,0x3477, + /* Array index: 0x1047 */ 0x5467,0x3478, + /* Array index: 0x1047 */ 0x5469,0x3479, + /* Array index: 0x1047 */ 0x546B,0x347A, + /* Array index: 0x1047 */ 0x546D,0x347B, + /* Array index: 0x1047 */ 0x546E,0x347C, + /* Array index: 0x1047 */ 0x5474,0x347D, + /* Array index: 0x1047 */ 0x547F,0x347E, + /* Array index: 0x1047 */ 0x5481,0x3521, + /* Array index: 0x1047 */ 0x5483,0x3522, + /* Array index: 0x1047 */ 0x5485,0x3523, + /* Array index: 0x1047 */ 0x5488,0x3524, + /* Array index: 0x1047 */ 0x5489,0x3525, + /* Array index: 0x1047 */ 0x548D,0x3526, + /* Array index: 0x1047 */ 0x5491,0x3527, + /* Array index: 0x1047 */ 0x5495,0x3528, + /* Array index: 0x1047 */ 0x5496,0x3529, + /* Array index: 0x1047 */ 0x549C,0x352A, + /* Array index: 0x1047 */ 0x549F,0x352B, + /* Array index: 0x1047 */ 0x54A1,0x352C, + /* Array index: 0x1047 */ 0x54B1,0x3533, + /* Array index: 0x1047 */ 0x54BF,0x3538, + /* Array index: 0x1047 */ 0x54C6,0x3539, + /* Array index: 0x1047 */ 0x54CA,0x353A, + /* Array index: 0x1047 */ 0x54CD,0x353B, + /* Array index: 0x1047 */ 0x54CE,0x353C, + /* Array index: 0x1047 */ 0x54E0,0x353D, + /* Array index: 0x1047 */ 0x54EA,0x353E, + /* Array index: 0x1047 */ 0x54EC,0x353F, + /* Array index: 0x1047 */ 0x54EF,0x3540, + /* Array index: 0x1047 */ 0x54F6,0x3541, + /* Array index: 0x1047 */ 0x5505,0x3547, + /* Array index: 0x1047 */ 0x5515,0x354D, + /* Array index: 0x1047 */ 0x552A,0x354E, + /* Array index: 0x1047 */ 0x552B,0x354F, + /* Array index: 0x1047 */ 0x5532,0x3550, + /* Array index: 0x1047 */ 0x5535,0x3551, + /* Array index: 0x1047 */ 0x5536,0x3552, + /* Array index: 0x1047 */ 0x5541,0x3556, + /* Array index: 0x1047 */ 0x5547,0x3557, + /* Array index: 0x1047 */ 0x5549,0x3558, + /* Array index: 0x1047 */ 0x554A,0x3559, + /* Array index: 0x1047 */ 0x554D,0x355A, + /* Array index: 0x1047 */ 0x5550,0x355B, + /* Array index: 0x1047 */ 0x5551,0x355C, + /* Array index: 0x1047 */ 0x5558,0x355D, + /* Array index: 0x1047 */ 0x555A,0x355E, + /* Array index: 0x1047 */ 0x555B,0x355F, + /* Array index: 0x1047 */ 0x555E,0x3560, + /* Array index: 0x1047 */ 0x5560,0x3561, + /* Array index: 0x1047 */ 0x5561,0x3562, + /* Array index: 0x1047 */ 0x5564,0x3563, + /* Array index: 0x1047 */ 0x5566,0x3564, + /* Array index: 0x1047 */ 0x557F,0x3565, + /* Array index: 0x1047 */ 0x5581,0x3566, + /* Array index: 0x1047 */ 0x5582,0x3567, + /* Array index: 0x1047 */ 0x5586,0x3568, + /* Array index: 0x1047 */ 0x5588,0x3569, + /* Array index: 0x1047 */ 0x5597,0x3570, + /* Array index: 0x1047 */ 0x55A3,0x3571, + /* Array index: 0x1047 */ 0x55A4,0x3572, + /* Array index: 0x1047 */ 0x55AD,0x3573, + /* Array index: 0x1047 */ 0x55B2,0x3574, + /* Array index: 0x1047 */ 0x55BF,0x3575, + /* Array index: 0x1047 */ 0x55C1,0x3576, + /* Array index: 0x1047 */ 0x55C3,0x3577, + /* Array index: 0x1047 */ 0x55C6,0x3578, + /* Array index: 0x1047 */ 0x55C9,0x3579, + /* Array index: 0x1047 */ 0x55CB,0x357A, + /* Array index: 0x1047 */ 0x55CC,0x357B, + /* Array index: 0x1047 */ 0x55CE,0x357C, + /* Array index: 0x1047 */ 0x55D7,0x3622, + /* Array index: 0x1047 */ 0x55D8,0x3623, + /* Array index: 0x1047 */ 0x55DB,0x3624, + /* Array index: 0x1047 */ 0x55DE,0x3625, + /* Array index: 0x1047 */ 0x55E2,0x3626, + /* Array index: 0x1047 */ 0x55E9,0x3627, + /* Array index: 0x1047 */ 0x55F6,0x3628, + /* Array index: 0x1047 */ 0x55FF,0x3629, + /* Array index: 0x1047 */ 0x5605,0x362A, + /* Array index: 0x1047 */ 0x5608,0x362B, + /* Array index: 0x1047 */ 0x560A,0x362C, + /* Array index: 0x1047 */ 0x5619,0x3633, + /* Array index: 0x1047 */ 0x562C,0x3634, + /* Array index: 0x1047 */ 0x5630,0x3635, + /* Array index: 0x1047 */ 0x5633,0x3636, + /* Array index: 0x1047 */ 0x5635,0x3637, + /* Array index: 0x1047 */ 0x5637,0x3638, + /* Array index: 0x1047 */ 0x5649,0x3643, + /* Array index: 0x1047 */ 0x564B,0x3644, + /* Array index: 0x1047 */ 0x564D,0x3645, + /* Array index: 0x1047 */ 0x564F,0x3646, + /* Array index: 0x1047 */ 0x5654,0x3647, + /* Array index: 0x1047 */ 0x5666,0x364D, + /* Array index: 0x1047 */ 0x5669,0x364E, + /* Array index: 0x1047 */ 0x566D,0x364F, + /* Array index: 0x1047 */ 0x566F,0x3650, + /* Array index: 0x1047 */ 0x5671,0x3651, + /* Array index: 0x1047 */ 0x5672,0x3652, + /* Array index: 0x1047 */ 0x5675,0x3653, + /* Array index: 0x1047 */ 0x5684,0x3654, + /* Array index: 0x1047 */ 0x5685,0x3655, + /* Array index: 0x1047 */ 0x5688,0x3656, + /* Array index: 0x1047 */ 0x568B,0x3657, + /* Array index: 0x1047 */ 0x568C,0x3658, + /* Array index: 0x1047 */ 0x5695,0x3659, + /* Array index: 0x1047 */ 0x56B1,0x3666, + /* Array index: 0x1047 */ 0x56B3,0x3667, + /* Array index: 0x1047 */ 0x56B7,0x3668, + /* Array index: 0x1047 */ 0x56BE,0x3669, + /* Array index: 0x1047 */ 0x56C5,0x366A, + /* Array index: 0x1047 */ 0x56D9,0x3672, + /* Array index: 0x1047 */ 0x56DC,0x3673, + /* Array index: 0x1047 */ 0x56DD,0x3674, + /* Array index: 0x1047 */ 0x56DF,0x3675, + /* Array index: 0x1047 */ 0x56E1,0x3676, + /* Array index: 0x1047 */ 0x56EB,0x367D, + /* Array index: 0x1047 */ 0x56ED,0x367E, + /* Array index: 0x1047 */ 0x56F1,0x367C, + /* Array index: 0x1047 */ 0x56F6,0x3721, + /* Array index: 0x1047 */ 0x56F7,0x3722, + /* Array index: 0x1047 */ 0x5701,0x3723, + /* Array index: 0x1047 */ 0x5702,0x3724, + /* Array index: 0x1047 */ 0x5707,0x3725, + /* Array index: 0x1047 */ 0x570A,0x3726, + /* Array index: 0x1047 */ 0x570C,0x3727, + /* Array index: 0x1047 */ 0x5711,0x3728, + /* Array index: 0x1047 */ 0x5715,0x3729, + /* Array index: 0x1047 */ 0x571A,0x372A, + /* Array index: 0x1047 */ 0x571B,0x372B, + /* Array index: 0x1047 */ 0x571D,0x372C, + /* Array index: 0x1047 */ 0x5729,0x3732, + /* Array index: 0x1047 */ 0x572A,0x3733, + /* Array index: 0x1047 */ 0x572C,0x3734, + /* Array index: 0x1047 */ 0x572E,0x3735, + /* Array index: 0x1047 */ 0x572F,0x3736, + /* Array index: 0x1047 */ 0x5733,0x3737, + /* Array index: 0x1047 */ 0x5734,0x3738, + /* Array index: 0x1047 */ 0x5745,0x373C, + /* Array index: 0x1047 */ 0x5746,0x373D, + /* Array index: 0x1047 */ 0x574C,0x373E, + /* Array index: 0x1047 */ 0x574D,0x373F, + /* Array index: 0x1047 */ 0x5752,0x3740, + /* Array index: 0x1047 */ 0x5762,0x3741, + /* Array index: 0x1047 */ 0x5765,0x3742, + /* Array index: 0x1047 */ 0x5767,0x3743, + /* Array index: 0x1047 */ 0x5768,0x3744, + /* Array index: 0x1047 */ 0x5781,0x3754, + /* Array index: 0x1047 */ 0x5783,0x3755, + /* Array index: 0x1047 */ 0x578C,0x3756, + /* Array index: 0x1047 */ 0x5794,0x3757, + /* Array index: 0x1047 */ 0x5795,0x3760, + /* Array index: 0x1047 */ 0x5797,0x3758, + /* Array index: 0x1047 */ 0x57AC,0x3764, + /* Array index: 0x1047 */ 0x57B8,0x3765, + /* Array index: 0x1047 */ 0x57BD,0x3766, + /* Array index: 0x1047 */ 0x57C7,0x3767, + /* Array index: 0x1047 */ 0x57C8,0x3768, + /* Array index: 0x1047 */ 0x57CC,0x3769, + /* Array index: 0x1047 */ 0x57CF,0x376A, + /* Array index: 0x1047 */ 0x57D5,0x376B, + /* Array index: 0x1047 */ 0x57DD,0x376C, + /* Array index: 0x1047 */ 0x57DE,0x376D, + /* Array index: 0x1047 */ 0x57E1,0x377E, + /* Array index: 0x1047 */ 0x57E4,0x376E, + /* Array index: 0x1047 */ 0x57E6,0x376F, + /* Array index: 0x1047 */ 0x57E7,0x3770, + /* Array index: 0x1047 */ 0x57E9,0x3771, + /* Array index: 0x1047 */ 0x57ED,0x3772, + /* Array index: 0x1047 */ 0x57F0,0x3773, + /* Array index: 0x1047 */ 0x57F5,0x3774, + /* Array index: 0x1047 */ 0x57F6,0x3775, + /* Array index: 0x1047 */ 0x57F8,0x3776, + /* Array index: 0x1047 */ 0x5803,0x377A, + /* Array index: 0x1047 */ 0x5804,0x377B, + /* Array index: 0x1047 */ 0x5808,0x377C, + /* Array index: 0x1047 */ 0x5809,0x377D, + /* Array index: 0x1047 */ 0x580C,0x3821, + /* Array index: 0x1047 */ 0x580D,0x3822, + /* Array index: 0x1047 */ 0x581B,0x3823, + /* Array index: 0x1047 */ 0x5826,0x3827, + /* Array index: 0x1047 */ 0x5827,0x3828, + /* Array index: 0x1047 */ 0x582D,0x3829, + /* Array index: 0x1047 */ 0x5832,0x382A, + /* Array index: 0x1047 */ 0x5839,0x382B, + /* Array index: 0x1047 */ 0x583F,0x382C, + /* Array index: 0x1047 */ 0x5849,0x382D, + /* Array index: 0x1047 */ 0x5855,0x3832, + /* Array index: 0x1047 */ 0x585F,0x3833, + /* Array index: 0x1047 */ 0x5861,0x3834, + /* Array index: 0x1047 */ 0x5864,0x3835, + /* Array index: 0x1047 */ 0x5867,0x3836, + /* Array index: 0x1047 */ 0x5868,0x3837, + /* Array index: 0x1047 */ 0x5878,0x3838, + /* Array index: 0x1047 */ 0x587C,0x3839, + /* Array index: 0x1047 */ 0x5894,0x3845, + /* Array index: 0x1047 */ 0x5896,0x3846, + /* Array index: 0x1047 */ 0x589D,0x3847, + /* Array index: 0x1047 */ 0x58A6,0x384B, + /* Array index: 0x1047 */ 0x58A9,0x384C, + /* Array index: 0x1047 */ 0x58B1,0x384D, + /* Array index: 0x1047 */ 0x58B2,0x384E, + /* Array index: 0x1047 */ 0x58BC,0x3850, + /* Array index: 0x1047 */ 0x58C2,0x3851, + /* Array index: 0x1047 */ 0x58C4,0x384F, + /* Array index: 0x1047 */ 0x58C8,0x3852, + /* Array index: 0x1047 */ 0x58CD,0x3853, + /* Array index: 0x1047 */ 0x58CE,0x3854, + /* Array index: 0x1047 */ 0x58D0,0x3855, + /* Array index: 0x1047 */ 0x58D2,0x3856, + /* Array index: 0x1047 */ 0x58D4,0x3857, + /* Array index: 0x1047 */ 0x58D6,0x3858, + /* Array index: 0x1047 */ 0x58DA,0x3859, + /* Array index: 0x1047 */ 0x58DD,0x385A, + /* Array index: 0x1047 */ 0x58E1,0x385B, + /* Array index: 0x1047 */ 0x58E2,0x385C, + /* Array index: 0x1047 */ 0x58E9,0x385D, + /* Array index: 0x1047 */ 0x58F3,0x385E, + /* Array index: 0x1047 */ 0x5905,0x385F, + /* Array index: 0x1047 */ 0x5906,0x3860, + /* Array index: 0x1047 */ 0x590B,0x3861, + /* Array index: 0x1047 */ 0x590C,0x3862, + /* Array index: 0x1047 */ 0x591D,0x3867, + /* Array index: 0x1047 */ 0x5921,0x3868, + /* Array index: 0x1047 */ 0x5923,0x3869, + /* Array index: 0x1047 */ 0x5924,0x386A, + /* Array index: 0x1047 */ 0x5928,0x386B, + /* Array index: 0x1047 */ 0x592F,0x386C, + /* Array index: 0x1047 */ 0x5930,0x386D, + /* Array index: 0x1047 */ 0x5933,0x386E, + /* Array index: 0x1047 */ 0x5935,0x386F, + /* Array index: 0x1047 */ 0x5936,0x3870, + /* Array index: 0x1047 */ 0x593F,0x3871, + /* Array index: 0x1047 */ 0x5943,0x3872, + /* Array index: 0x1047 */ 0x5946,0x3873, + /* Array index: 0x1047 */ 0x5952,0x3874, + /* Array index: 0x1047 */ 0x5953,0x3875, + /* Array index: 0x1047 */ 0x5959,0x3876, + /* Array index: 0x1047 */ 0x596B,0x387D, + /* Array index: 0x1047 */ 0x596D,0x387E, + /* Array index: 0x1047 */ 0x596F,0x3921, + /* Array index: 0x1047 */ 0x5972,0x3922, + /* Array index: 0x1047 */ 0x5975,0x3923, + /* Array index: 0x1047 */ 0x5976,0x3924, + /* Array index: 0x1047 */ 0x5979,0x3925, + /* Array index: 0x1047 */ 0x597B,0x3926, + /* Array index: 0x1047 */ 0x597C,0x3927, + /* Array index: 0x1047 */ 0x598B,0x3928, + /* Array index: 0x1047 */ 0x598C,0x3929, + /* Array index: 0x1047 */ 0x598E,0x392A, + /* Array index: 0x1047 */ 0x5992,0x392B, + /* Array index: 0x1047 */ 0x5995,0x392C, + /* Array index: 0x1047 */ 0x5997,0x392D, + /* Array index: 0x1047 */ 0x599F,0x392E, + /* Array index: 0x1047 */ 0x59A4,0x392F, + /* Array index: 0x1047 */ 0x59A7,0x3930, + /* Array index: 0x1047 */ 0x59B3,0x3935, + /* Array index: 0x1047 */ 0x59B7,0x3936, + /* Array index: 0x1047 */ 0x59BA,0x3937, + /* Array index: 0x1047 */ 0x59BC,0x3938, + /* Array index: 0x1047 */ 0x59C1,0x3939, + /* Array index: 0x1047 */ 0x59C3,0x393A, + /* Array index: 0x1047 */ 0x59C4,0x393B, + /* Array index: 0x1047 */ 0x59C8,0x393C, + /* Array index: 0x1047 */ 0x59CA,0x393D, + /* Array index: 0x1047 */ 0x59CD,0x393E, + /* Array index: 0x1047 */ 0x59D2,0x393F, + /* Array index: 0x1047 */ 0x59E3,0x3943, + /* Array index: 0x1047 */ 0x59E4,0x3944, + /* Array index: 0x1047 */ 0x59E7,0x3945, + /* Array index: 0x1047 */ 0x59F7,0x394B, + /* Array index: 0x1047 */ 0x5A00,0x394C, + /* Array index: 0x1047 */ 0x5A04,0x394D, + /* Array index: 0x1047 */ 0x5A12,0x3951, + /* Array index: 0x1047 */ 0x5A13,0x3952, + /* Array index: 0x1047 */ 0x5A1E,0x3953, + /* Array index: 0x1047 */ 0x5A23,0x3954, + /* Array index: 0x1047 */ 0x5A24,0x3955, + /* Array index: 0x1047 */ 0x5A27,0x3956, + /* Array index: 0x1047 */ 0x5A28,0x3957, + /* Array index: 0x1047 */ 0x5A2A,0x3958, + /* Array index: 0x1047 */ 0x5A2D,0x3959, + /* Array index: 0x1047 */ 0x5A30,0x395A, + /* Array index: 0x1047 */ 0x5A4C,0x395F, + /* Array index: 0x1047 */ 0x5A50,0x3960, + /* Array index: 0x1047 */ 0x5A55,0x3961, + /* Array index: 0x1047 */ 0x5A5E,0x3962, + /* Array index: 0x1047 */ 0x5A63,0x3963, + /* Array index: 0x1047 */ 0x5A65,0x3964, + /* Array index: 0x1047 */ 0x5A67,0x3965, + /* Array index: 0x1047 */ 0x5A6D,0x3966, + /* Array index: 0x1047 */ 0x5A77,0x3967, + /* Array index: 0x1047 */ 0x5A7A,0x3968, + /* Array index: 0x1047 */ 0x5A7B,0x3969, + /* Array index: 0x1047 */ 0x5A7E,0x396A, + /* Array index: 0x1047 */ 0x5A8B,0x396B, + /* Array index: 0x1047 */ 0x5A90,0x396C, + /* Array index: 0x1047 */ 0x5A93,0x396D, + /* Array index: 0x1047 */ 0x5A96,0x396E, + /* Array index: 0x1047 */ 0x5A99,0x396F, + /* Array index: 0x1047 */ 0x5AA7,0x3975, + /* Array index: 0x1047 */ 0x5AAC,0x3976, + /* Array index: 0x1047 */ 0x5AB8,0x397B, + /* Array index: 0x1047 */ 0x5ABA,0x397C, + /* Array index: 0x1047 */ 0x5ABB,0x397D, + /* Array index: 0x1047 */ 0x5ABF,0x397E, + /* Array index: 0x1047 */ 0x5AC4,0x3A21, + /* Array index: 0x1047 */ 0x5AC6,0x3A22, + /* Array index: 0x1047 */ 0x5AC8,0x3A23, + /* Array index: 0x1047 */ 0x5ACF,0x3A24, + /* Array index: 0x1047 */ 0x5ADA,0x3A25, + /* Array index: 0x1047 */ 0x5ADC,0x3A26, + /* Array index: 0x1047 */ 0x5AE0,0x3A27, + /* Array index: 0x1047 */ 0x5AE5,0x3A28, + /* Array index: 0x1047 */ 0x5AEA,0x3A29, + /* Array index: 0x1047 */ 0x5AEE,0x3A2A, + /* Array index: 0x1047 */ 0x5AF5,0x3A2B, + /* Array index: 0x1047 */ 0x5AF6,0x3A2C, + /* Array index: 0x1047 */ 0x5AFD,0x3A2D, + /* Array index: 0x1047 */ 0x5B00,0x3A2E, + /* Array index: 0x1047 */ 0x5B01,0x3A2F, + /* Array index: 0x1047 */ 0x5B08,0x3A30, + /* Array index: 0x1047 */ 0x5B17,0x3A31, + /* Array index: 0x1047 */ 0x5B19,0x3A33, + /* Array index: 0x1047 */ 0x5B1B,0x3A34, + /* Array index: 0x1047 */ 0x5B1D,0x3A35, + /* Array index: 0x1047 */ 0x5B21,0x3A36, + /* Array index: 0x1047 */ 0x5B25,0x3A37, + /* Array index: 0x1047 */ 0x5B2D,0x3A38, + /* Array index: 0x1047 */ 0x5B34,0x3A32, + /* Array index: 0x1047 */ 0x5B38,0x3A39, + /* Array index: 0x1047 */ 0x5B41,0x3A3A, + /* Array index: 0x1047 */ 0x5B4B,0x3A3B, + /* Array index: 0x1047 */ 0x5B4C,0x3A3C, + /* Array index: 0x1047 */ 0x5B52,0x3A3D, + /* Array index: 0x1047 */ 0x5B56,0x3A3E, + /* Array index: 0x1047 */ 0x5B5E,0x3A3F, + /* Array index: 0x1047 */ 0x5B68,0x3A40, + /* Array index: 0x1047 */ 0x5B6E,0x3A41, + /* Array index: 0x1047 */ 0x5B6F,0x3A42, + /* Array index: 0x1047 */ 0x5B84,0x3A48, + /* Array index: 0x1047 */ 0x5B86,0x3A49, + /* Array index: 0x1047 */ 0x5B8A,0x3A4A, + /* Array index: 0x1047 */ 0x5B8E,0x3A4B, + /* Array index: 0x1047 */ 0x5BA8,0x3A51, + /* Array index: 0x1047 */ 0x5BA9,0x3A52, + /* Array index: 0x1047 */ 0x5BAC,0x3A53, + /* Array index: 0x1047 */ 0x5BAD,0x3A54, + /* Array index: 0x1047 */ 0x5BAF,0x3A55, + /* Array index: 0x1047 */ 0x5BB1,0x3A56, + /* Array index: 0x1047 */ 0x5BB2,0x3A57, + /* Array index: 0x1047 */ 0x5BB7,0x3A58, + /* Array index: 0x1047 */ 0x5BBA,0x3A59, + /* Array index: 0x1047 */ 0x5BBC,0x3A5A, + /* Array index: 0x1047 */ 0x5BC0,0x3A5B, + /* Array index: 0x1047 */ 0x5BC1,0x3A5C, + /* Array index: 0x1047 */ 0x5BCD,0x3A5D, + /* Array index: 0x1047 */ 0x5BCF,0x3A5E, + /* Array index: 0x1047 */ 0x5BE0,0x3A64, + /* Array index: 0x1047 */ 0x5BEF,0x3A65, + /* Array index: 0x1047 */ 0x5BF1,0x3A66, + /* Array index: 0x1047 */ 0x5BF4,0x3A67, + /* Array index: 0x1047 */ 0x5BFD,0x3A68, + /* Array index: 0x1047 */ 0x5C0C,0x3A69, + /* Array index: 0x1047 */ 0x5C17,0x3A6A, + /* Array index: 0x1047 */ 0x5C1E,0x3A6B, + /* Array index: 0x1047 */ 0x5C1F,0x3A6C, + /* Array index: 0x1047 */ 0x5C23,0x3A6D, + /* Array index: 0x1047 */ 0x5C26,0x3A6E, + /* Array index: 0x1047 */ 0x5C29,0x3A6F, + /* Array index: 0x1047 */ 0x5C2B,0x3A70, + /* Array index: 0x1047 */ 0x5C2C,0x3A71, + /* Array index: 0x1047 */ 0x5C2E,0x3A72, + /* Array index: 0x1047 */ 0x5C30,0x3A73, + /* Array index: 0x1047 */ 0x5C32,0x3A74, + /* Array index: 0x1047 */ 0x5C35,0x3A75, + /* Array index: 0x1047 */ 0x5C36,0x3A76, + /* Array index: 0x1047 */ 0x5C59,0x3A77, + /* Array index: 0x1047 */ 0x5C5A,0x3A78, + /* Array index: 0x1047 */ 0x5C5C,0x3A79, + /* Array index: 0x1047 */ 0x5C62,0x3A7A, + /* Array index: 0x1047 */ 0x5C63,0x3A7B, + /* Array index: 0x1047 */ 0x5C6D,0x3B21, + /* Array index: 0x1047 */ 0x5C70,0x3B22, + /* Array index: 0x1047 */ 0x5C74,0x3B23, + /* Array index: 0x1047 */ 0x5C75,0x3B24, + /* Array index: 0x1047 */ 0x5C87,0x3B29, + /* Array index: 0x1047 */ 0x5C88,0x3B2A, + /* Array index: 0x1047 */ 0x5C8A,0x3B2B, + /* Array index: 0x1047 */ 0x5C8F,0x3B2C, + /* Array index: 0x1047 */ 0x5C92,0x3B2D, + /* Array index: 0x1047 */ 0x5C9D,0x3B2E, + /* Array index: 0x1047 */ 0x5CA6,0x3B33, + /* Array index: 0x1047 */ 0x5CAA,0x3B34, + /* Array index: 0x1047 */ 0x5CB2,0x3B35, + /* Array index: 0x1047 */ 0x5CB4,0x3B36, + /* Array index: 0x1047 */ 0x5CB5,0x3B37, + /* Array index: 0x1047 */ 0x5CBA,0x3B38, + /* Array index: 0x1047 */ 0x5CC9,0x3B39, + /* Array index: 0x1047 */ 0x5CCB,0x3B3A, + /* Array index: 0x1047 */ 0x5CD2,0x3B3B, + /* Array index: 0x1047 */ 0x5CD7,0x3B3D, + /* Array index: 0x1047 */ 0x5CDD,0x3B3C, + /* Array index: 0x1047 */ 0x5CEE,0x3B3E, + /* Array index: 0x1047 */ 0x5CF1,0x3B3F, + /* Array index: 0x1047 */ 0x5CF2,0x3B40, + /* Array index: 0x1047 */ 0x5CF4,0x3B41, + /* Array index: 0x1047 */ 0x5D01,0x3B42, + /* Array index: 0x1047 */ 0x5D06,0x3B43, + /* Array index: 0x1047 */ 0x5D0D,0x3B44, + /* Array index: 0x1047 */ 0x5D12,0x3B45, + /* Array index: 0x1047 */ 0x5D2B,0x3B46, + /* Array index: 0x1047 */ 0x5D31,0x3B4B, + /* Array index: 0x1047 */ 0x5D34,0x3B4C, + /* Array index: 0x1047 */ 0x5D39,0x3B4D, + /* Array index: 0x1047 */ 0x5D3D,0x3B4E, + /* Array index: 0x1047 */ 0x5D3F,0x3B4F, + /* Array index: 0x1047 */ 0x5D42,0x3B50, + /* Array index: 0x1047 */ 0x5D43,0x3B51, + /* Array index: 0x1047 */ 0x5D46,0x3B52, + /* Array index: 0x1047 */ 0x5D48,0x3B53, + /* Array index: 0x1047 */ 0x5D4A,0x3B57, + /* Array index: 0x1047 */ 0x5D51,0x3B55, + /* Array index: 0x1047 */ 0x5D55,0x3B54, + /* Array index: 0x1047 */ 0x5D59,0x3B56, + /* Array index: 0x1047 */ 0x5D6A,0x3B5D, + /* Array index: 0x1047 */ 0x5D6D,0x3B5E, + /* Array index: 0x1047 */ 0x5D70,0x3B5F, + /* Array index: 0x1047 */ 0x5D79,0x3B60, + /* Array index: 0x1047 */ 0x5D7A,0x3B61, + /* Array index: 0x1047 */ 0x5D7E,0x3B62, + /* Array index: 0x1047 */ 0x5D7F,0x3B63, + /* Array index: 0x1047 */ 0x5D81,0x3B64, + /* Array index: 0x1047 */ 0x5D83,0x3B65, + /* Array index: 0x1047 */ 0x5D88,0x3B66, + /* Array index: 0x1047 */ 0x5D8A,0x3B67, + /* Array index: 0x1047 */ 0x5D99,0x3B6C, + /* Array index: 0x1047 */ 0x5D9B,0x3B6D, + /* Array index: 0x1047 */ 0x5D9F,0x3B6E, + /* Array index: 0x1047 */ 0x5DA0,0x3B6F, + /* Array index: 0x1047 */ 0x5DA7,0x3B70, + /* Array index: 0x1047 */ 0x5DAB,0x3B71, + /* Array index: 0x1047 */ 0x5DB0,0x3B72, + /* Array index: 0x1047 */ 0x5DB2,0x6674, + /* Array index: 0x1047 */ 0x5DB4,0x3B73, + /* Array index: 0x1047 */ 0x5DB8,0x3B74, + /* Array index: 0x1047 */ 0x5DB9,0x3B75, + /* Array index: 0x1047 */ 0x5DC3,0x3B76, + /* Array index: 0x1047 */ 0x5DC7,0x3B77, + /* Array index: 0x1047 */ 0x5DCB,0x3B78, + /* Array index: 0x1047 */ 0x5DCE,0x3B7A, + /* Array index: 0x1047 */ 0x5DD0,0x3B79, + /* Array index: 0x1047 */ 0x5DD8,0x3B7B, + /* Array index: 0x1047 */ 0x5DD9,0x3B7C, + /* Array index: 0x1047 */ 0x5DE0,0x3B7D, + /* Array index: 0x1047 */ 0x5DE4,0x3B7E, + /* Array index: 0x1047 */ 0x5DE9,0x3C21, + /* Array index: 0x1047 */ 0x5DF8,0x3C22, + /* Array index: 0x1047 */ 0x5DF9,0x3C23, + /* Array index: 0x1047 */ 0x5E00,0x3C24, + /* Array index: 0x1047 */ 0x5E07,0x3C25, + /* Array index: 0x1047 */ 0x5E0D,0x3C26, + /* Array index: 0x1047 */ 0x5E12,0x3C27, + /* Array index: 0x1047 */ 0x5E14,0x3C28, + /* Array index: 0x1047 */ 0x5E15,0x3C29, + /* Array index: 0x1047 */ 0x5E18,0x3C2A, + /* Array index: 0x1047 */ 0x5E1F,0x3C2B, + /* Array index: 0x1047 */ 0x5E20,0x3C2C, + /* Array index: 0x1047 */ 0x5E28,0x3C2E, + /* Array index: 0x1047 */ 0x5E2E,0x3C2D, + /* Array index: 0x1047 */ 0x5E32,0x3C2F, + /* Array index: 0x1047 */ 0x5E35,0x3C30, + /* Array index: 0x1047 */ 0x5E3E,0x3C31, + /* Array index: 0x1047 */ 0x5E49,0x3C34, + /* Array index: 0x1047 */ 0x5E4B,0x3C32, + /* Array index: 0x1047 */ 0x5E50,0x3C33, + /* Array index: 0x1047 */ 0x5E51,0x3C35, + /* Array index: 0x1047 */ 0x5E56,0x3C36, + /* Array index: 0x1047 */ 0x5E58,0x3C37, + /* Array index: 0x1047 */ 0x5E5B,0x3C38, + /* Array index: 0x1047 */ 0x5E5C,0x3C39, + /* Array index: 0x1047 */ 0x5E5E,0x3C3A, + /* Array index: 0x1047 */ 0x5E80,0x3C42, + /* Array index: 0x1047 */ 0x5E8B,0x3C43, + /* Array index: 0x1047 */ 0x5E8E,0x3C44, + /* Array index: 0x1047 */ 0x5EA2,0x3C45, + /* Array index: 0x1047 */ 0x5EA4,0x3C46, + /* Array index: 0x1047 */ 0x5EA5,0x3C47, + /* Array index: 0x1047 */ 0x5EA8,0x3C48, + /* Array index: 0x1047 */ 0x5EAA,0x3C49, + /* Array index: 0x1047 */ 0x5EAC,0x3C4A, + /* Array index: 0x1047 */ 0x5EB1,0x3C4B, + /* Array index: 0x1047 */ 0x5EB3,0x3C4C, + /* Array index: 0x1047 */ 0x5EC6,0x3C50, + /* Array index: 0x1047 */ 0x5ECB,0x3C52, + /* Array index: 0x1047 */ 0x5ECC,0x3C51, + /* Array index: 0x1047 */ 0x5ECE,0x3C53, + /* Array index: 0x1047 */ 0x5EDC,0x3C58, + /* Array index: 0x1047 */ 0x5EDE,0x3C59, + /* Array index: 0x1047 */ 0x5EE5,0x3C5A, + /* Array index: 0x1047 */ 0x5EEB,0x3C5B, + /* Array index: 0x1047 */ 0x5F02,0x3C5C, + /* Array index: 0x1047 */ 0x5F0E,0x3C60, + /* Array index: 0x1047 */ 0x5F19,0x3C61, + /* Array index: 0x1047 */ 0x5F1C,0x3C62, + /* Array index: 0x1047 */ 0x5F1D,0x3C63, + /* Array index: 0x1047 */ 0x5F28,0x3C68, + /* Array index: 0x1047 */ 0x5F2B,0x3C69, + /* Array index: 0x1047 */ 0x5F2C,0x3C6A, + /* Array index: 0x1047 */ 0x5F2E,0x3C6B, + /* Array index: 0x1047 */ 0x5F30,0x3C6C, + /* Array index: 0x1047 */ 0x5F34,0x3C6D, + /* Array index: 0x1047 */ 0x5F36,0x3C6E, + /* Array index: 0x1047 */ 0x5F3B,0x3C6F, + /* Array index: 0x1047 */ 0x5F3D,0x3C70, + /* Array index: 0x1047 */ 0x5F3F,0x3C71, + /* Array index: 0x1047 */ 0x5F40,0x3C72, + /* Array index: 0x1047 */ 0x5F44,0x3C73, + /* Array index: 0x1047 */ 0x5F45,0x3C74, + /* Array index: 0x1047 */ 0x5F47,0x3C75, + /* Array index: 0x1047 */ 0x5F4D,0x3C76, + /* Array index: 0x1047 */ 0x5F50,0x3C77, + /* Array index: 0x1047 */ 0x5F54,0x3C78, + /* Array index: 0x1047 */ 0x5F58,0x3C79, + /* Array index: 0x1047 */ 0x5F5B,0x3C7A, + /* Array index: 0x1047 */ 0x5F60,0x3C7B, + /* Array index: 0x1047 */ 0x5F63,0x3C7C, + /* Array index: 0x1047 */ 0x5F64,0x3C7D, + /* Array index: 0x1047 */ 0x5F67,0x3C7E, + /* Array index: 0x1047 */ 0x5F6F,0x3D21, + /* Array index: 0x1047 */ 0x5F72,0x3D22, + /* Array index: 0x1047 */ 0x5F74,0x3D23, + /* Array index: 0x1047 */ 0x5F75,0x3D24, + /* Array index: 0x1047 */ 0x5F78,0x3D25, + /* Array index: 0x1047 */ 0x5F7A,0x3D26, + /* Array index: 0x1047 */ 0x5F7D,0x3D27, + /* Array index: 0x1047 */ 0x5F7E,0x3D28, + /* Array index: 0x1047 */ 0x5F89,0x3D29, + /* Array index: 0x1047 */ 0x5F8D,0x3D2A, + /* Array index: 0x1047 */ 0x5F8F,0x3D2B, + /* Array index: 0x1047 */ 0x5F96,0x3D2C, + /* Array index: 0x1047 */ 0x5F9C,0x3D2D, + /* Array index: 0x1047 */ 0x5F9D,0x3D2E, + /* Array index: 0x1047 */ 0x5FA2,0x3D2F, + /* Array index: 0x1047 */ 0x5FA4,0x3D32, + /* Array index: 0x1047 */ 0x5FA7,0x3D30, + /* Array index: 0x1047 */ 0x5FB8,0x3D37, + /* Array index: 0x1047 */ 0x5FC4,0x3D38, + /* Array index: 0x1047 */ 0x5FDE,0x3D42, + /* Array index: 0x1047 */ 0x5FE1,0x3D43, + /* Array index: 0x1047 */ 0x5FE2,0x3D44, + /* Array index: 0x1047 */ 0x5FF6,0x3D4E, + /* Array index: 0x1047 */ 0x5FFA,0x3D4F, + /* Array index: 0x1047 */ 0x5FFC,0x3D50, + /* Array index: 0x1047 */ 0x6007,0x3D51, + /* Array index: 0x1047 */ 0x600A,0x3D52, + /* Array index: 0x1047 */ 0x600D,0x3D53, + /* Array index: 0x1047 */ 0x6013,0x3D54, + /* Array index: 0x1047 */ 0x6014,0x3D55, + /* Array index: 0x1047 */ 0x6017,0x3D56, + /* Array index: 0x1047 */ 0x6018,0x3D57, + /* Array index: 0x1047 */ 0x601A,0x3D58, + /* Array index: 0x1047 */ 0x601F,0x3D59, + /* Array index: 0x1047 */ 0x6024,0x3D5A, + /* Array index: 0x1047 */ 0x602D,0x3D5B, + /* Array index: 0x1047 */ 0x6033,0x3D5C, + /* Array index: 0x1047 */ 0x6035,0x3D5D, + /* Array index: 0x1047 */ 0x6040,0x3D5E, + /* Array index: 0x1047 */ 0x604C,0x3D62, + /* Array index: 0x1047 */ 0x6051,0x3D63, + /* Array index: 0x1047 */ 0x6054,0x3D64, + /* Array index: 0x1047 */ 0x6056,0x3D65, + /* Array index: 0x1047 */ 0x6057,0x3D66, + /* Array index: 0x1047 */ 0x605D,0x3D67, + /* Array index: 0x1047 */ 0x6061,0x3D68, + /* Array index: 0x1047 */ 0x6067,0x3D69, + /* Array index: 0x1047 */ 0x6071,0x3D6A, + /* Array index: 0x1047 */ 0x607E,0x3D6B, + /* Array index: 0x1047 */ 0x607F,0x3D6C, + /* Array index: 0x1047 */ 0x6082,0x3D6D, + /* Array index: 0x1047 */ 0x6086,0x3D6E, + /* Array index: 0x1047 */ 0x6088,0x3D6F, + /* Array index: 0x1047 */ 0x608A,0x3D70, + /* Array index: 0x1047 */ 0x608E,0x3D71, + /* Array index: 0x1047 */ 0x6091,0x3D72, + /* Array index: 0x1047 */ 0x6093,0x3D73, + /* Array index: 0x1047 */ 0x6095,0x3D74, + /* Array index: 0x1047 */ 0x6098,0x3D75, + /* Array index: 0x1047 */ 0x609D,0x3D76, + /* Array index: 0x1047 */ 0x609E,0x3D77, + /* Array index: 0x1047 */ 0x60A2,0x3D78, + /* Array index: 0x1047 */ 0x60A4,0x3D79, + /* Array index: 0x1047 */ 0x60A5,0x3D7A, + /* Array index: 0x1047 */ 0x60A8,0x3D7B, + /* Array index: 0x1047 */ 0x60B0,0x3D7C, + /* Array index: 0x1047 */ 0x60B1,0x3D7D, + /* Array index: 0x1047 */ 0x60B7,0x3D7E, + /* Array index: 0x1047 */ 0x60BB,0x3E21, + /* Array index: 0x1047 */ 0x60BE,0x3E22, + /* Array index: 0x1047 */ 0x60C2,0x3E23, + /* Array index: 0x1047 */ 0x60C4,0x3E24, + /* Array index: 0x1047 */ 0x60D4,0x3E2B, + /* Array index: 0x1047 */ 0x60D5,0x3E2C, + /* Array index: 0x1047 */ 0x60D9,0x3E2D, + /* Array index: 0x1047 */ 0x60DB,0x3E2E, + /* Array index: 0x1047 */ 0x60DD,0x3E2F, + /* Array index: 0x1047 */ 0x60DE,0x3E30, + /* Array index: 0x1047 */ 0x60E2,0x3E31, + /* Array index: 0x1047 */ 0x60E5,0x3E32, + /* Array index: 0x1047 */ 0x60F2,0x3E33, + /* Array index: 0x1047 */ 0x60F5,0x3E34, + /* Array index: 0x1047 */ 0x60F8,0x3E35, + /* Array index: 0x1047 */ 0x60FC,0x3E36, + /* Array index: 0x1047 */ 0x60FD,0x3E37, + /* Array index: 0x1047 */ 0x6102,0x3E38, + /* Array index: 0x1047 */ 0x6107,0x3E39, + /* Array index: 0x1047 */ 0x610A,0x3E3A, + /* Array index: 0x1047 */ 0x610C,0x3E3B, + /* Array index: 0x1047 */ 0x611C,0x3E44, + /* Array index: 0x1047 */ 0x611E,0x3E45, + /* Array index: 0x1047 */ 0x6122,0x3E46, + /* Array index: 0x1047 */ 0x612A,0x3E47, + /* Array index: 0x1047 */ 0x612B,0x3E48, + /* Array index: 0x1047 */ 0x6130,0x3E49, + /* Array index: 0x1047 */ 0x6131,0x3E4A, + /* Array index: 0x1047 */ 0x6141,0x3E4F, + /* Array index: 0x1047 */ 0x6145,0x3E50, + /* Array index: 0x1047 */ 0x6146,0x3E51, + /* Array index: 0x1047 */ 0x6149,0x3E52, + /* Array index: 0x1047 */ 0x615E,0x3E53, + /* Array index: 0x1047 */ 0x6160,0x3E54, + /* Array index: 0x1047 */ 0x616C,0x3E55, + /* Array index: 0x1047 */ 0x6172,0x3E56, + /* Array index: 0x1047 */ 0x6178,0x3E57, + /* Array index: 0x1047 */ 0x618B,0x3E5F, + /* Array index: 0x1047 */ 0x618D,0x3E60, + /* Array index: 0x1047 */ 0x6192,0x3E61, + /* Array index: 0x1047 */ 0x6193,0x3E62, + /* Array index: 0x1047 */ 0x6197,0x3E63, + /* Array index: 0x1047 */ 0x6198,0x3E64, + /* Array index: 0x1047 */ 0x61A5,0x3E69, + /* Array index: 0x1047 */ 0x61A8,0x3E6A, + /* Array index: 0x1047 */ 0x61AA,0x3E6B, + /* Array index: 0x1047 */ 0x61AD,0x3E6C, + /* Array index: 0x1047 */ 0x61B8,0x3E6D, + /* Array index: 0x1047 */ 0x61B9,0x3E6E, + /* Array index: 0x1047 */ 0x61BC,0x3E6F, + /* Array index: 0x1047 */ 0x61CE,0x3E73, + /* Array index: 0x1047 */ 0x61CF,0x3E74, + /* Array index: 0x1047 */ 0x61D5,0x3E75, + /* Array index: 0x1047 */ 0x61E5,0x3E7E, + /* Array index: 0x1047 */ 0x61E7,0x3E7C, + /* Array index: 0x1047 */ 0x61E9,0x3E7D, + /* Array index: 0x1047 */ 0x61EC,0x3F21, + /* Array index: 0x1047 */ 0x61ED,0x3F22, + /* Array index: 0x1047 */ 0x61EF,0x3F23, + /* Array index: 0x1047 */ 0x6201,0x3F24, + /* Array index: 0x1047 */ 0x6203,0x3F25, + /* Array index: 0x1047 */ 0x6204,0x3F26, + /* Array index: 0x1047 */ 0x6207,0x3F27, + /* Array index: 0x1047 */ 0x6213,0x3F28, + /* Array index: 0x1047 */ 0x6215,0x3F29, + /* Array index: 0x1047 */ 0x621C,0x3F2A, + /* Array index: 0x1047 */ 0x6220,0x3F2B, + /* Array index: 0x1047 */ 0x6222,0x3F2C, + /* Array index: 0x1047 */ 0x6223,0x3F2D, + /* Array index: 0x1047 */ 0x6227,0x3F2E, + /* Array index: 0x1047 */ 0x6229,0x3F2F, + /* Array index: 0x1047 */ 0x622B,0x3F30, + /* Array index: 0x1047 */ 0x6239,0x3F31, + /* Array index: 0x1047 */ 0x623D,0x3F32, + /* Array index: 0x1047 */ 0x624C,0x3F37, + /* Array index: 0x1047 */ 0x625A,0x3F3D, + /* Array index: 0x1047 */ 0x625C,0x3F3E, + /* Array index: 0x1047 */ 0x6264,0x3F3F, + /* Array index: 0x1047 */ 0x626D,0x3F40, + /* Array index: 0x1047 */ 0x626F,0x3F41, + /* Array index: 0x1047 */ 0x6273,0x3F42, + /* Array index: 0x1047 */ 0x627A,0x3F43, + /* Array index: 0x1047 */ 0x627D,0x3F44, + /* Array index: 0x1047 */ 0x62A6,0x3F49, + /* Array index: 0x1047 */ 0x62A8,0x3F4A, + /* Array index: 0x1047 */ 0x62B3,0x3F4B, + /* Array index: 0x1047 */ 0x62B6,0x3F4C, + /* Array index: 0x1047 */ 0x62B7,0x3F4D, + /* Array index: 0x1047 */ 0x62BA,0x3F4E, + /* Array index: 0x1047 */ 0x62BE,0x3F4F, + /* Array index: 0x1047 */ 0x62BF,0x3F50, + /* Array index: 0x1047 */ 0x62C4,0x3F51, + /* Array index: 0x1047 */ 0x62CE,0x3F52, + /* Array index: 0x1047 */ 0x62D5,0x3F53, + /* Array index: 0x1047 */ 0x62D6,0x3F54, + /* Array index: 0x1047 */ 0x62DA,0x3F55, + /* Array index: 0x1047 */ 0x62EA,0x3F56, + /* Array index: 0x1047 */ 0x62F2,0x3F57, + /* Array index: 0x1047 */ 0x62F4,0x3F58, + /* Array index: 0x1047 */ 0x62FC,0x3F59, + /* Array index: 0x1047 */ 0x62FD,0x3F5A, + /* Array index: 0x1047 */ 0x6303,0x3F5B, + /* Array index: 0x1047 */ 0x6304,0x3F5C, + /* Array index: 0x1047 */ 0x630A,0x3F5D, + /* Array index: 0x1047 */ 0x630B,0x3F5E, + /* Array index: 0x1047 */ 0x630D,0x3F5F, + /* Array index: 0x1047 */ 0x6310,0x3F60, + /* Array index: 0x1047 */ 0x6313,0x3F61, + /* Array index: 0x1047 */ 0x6316,0x3F62, + /* Array index: 0x1047 */ 0x6318,0x3F63, + /* Array index: 0x1047 */ 0x6329,0x3F64, + /* Array index: 0x1047 */ 0x632A,0x3F65, + /* Array index: 0x1047 */ 0x632D,0x3F66, + /* Array index: 0x1047 */ 0x6335,0x3F67, + /* Array index: 0x1047 */ 0x6336,0x3F68, + /* Array index: 0x1047 */ 0x6339,0x3F69, + /* Array index: 0x1047 */ 0x633C,0x3F6A, + /* Array index: 0x1047 */ 0x634A,0x3F70, + /* Array index: 0x1047 */ 0x634B,0x3F71, + /* Array index: 0x1047 */ 0x634E,0x3F72, + /* Array index: 0x1047 */ 0x6358,0x3F76, + /* Array index: 0x1047 */ 0x635B,0x3F77, + /* Array index: 0x1047 */ 0x6365,0x3F78, + /* Array index: 0x1047 */ 0x6366,0x3F79, + /* Array index: 0x1047 */ 0x636C,0x3F7A, + /* Array index: 0x1047 */ 0x636D,0x3F7B, + /* Array index: 0x1047 */ 0x6371,0x3F7C, + /* Array index: 0x1047 */ 0x6374,0x3F7D, + /* Array index: 0x1047 */ 0x6375,0x3F7E, + /* Array index: 0x1047 */ 0x6378,0x4021, + /* Array index: 0x1047 */ 0x637C,0x4022, + /* Array index: 0x1047 */ 0x637D,0x4023, + /* Array index: 0x1047 */ 0x637F,0x4024, + /* Array index: 0x1047 */ 0x6382,0x4025, + /* Array index: 0x1047 */ 0x6384,0x4026, + /* Array index: 0x1047 */ 0x6387,0x4027, + /* Array index: 0x1047 */ 0x638A,0x4028, + /* Array index: 0x1047 */ 0x6390,0x4029, + /* Array index: 0x1047 */ 0x6394,0x402A, + /* Array index: 0x1047 */ 0x6395,0x402B, + /* Array index: 0x1047 */ 0x6399,0x402C, + /* Array index: 0x1047 */ 0x639A,0x402D, + /* Array index: 0x1047 */ 0x639E,0x402E, + /* Array index: 0x1047 */ 0x63A4,0x402F, + /* Array index: 0x1047 */ 0x63A6,0x4030, + /* Array index: 0x1047 */ 0x63BD,0x4034, + /* Array index: 0x1047 */ 0x63C1,0x4035, + /* Array index: 0x1047 */ 0x63C5,0x4036, + /* Array index: 0x1047 */ 0x63C8,0x4037, + /* Array index: 0x1047 */ 0x63CE,0x4038, + /* Array index: 0x1047 */ 0x63DC,0x403D, + /* Array index: 0x1047 */ 0x63E0,0x403E, + /* Array index: 0x1047 */ 0x63E5,0x403F, + /* Array index: 0x1047 */ 0x63EA,0x4040, + /* Array index: 0x1047 */ 0x63EC,0x4041, + /* Array index: 0x1047 */ 0x63F2,0x4042, + /* Array index: 0x1047 */ 0x63F3,0x4043, + /* Array index: 0x1047 */ 0x63F5,0x4044, + /* Array index: 0x1047 */ 0x63F8,0x4045, + /* Array index: 0x1047 */ 0x63F9,0x4046, + /* Array index: 0x1047 */ 0x6409,0x4047, + /* Array index: 0x1047 */ 0x640A,0x4048, + /* Array index: 0x1047 */ 0x6410,0x4049, + /* Array index: 0x1047 */ 0x6412,0x404A, + /* Array index: 0x1047 */ 0x6414,0x404B, + /* Array index: 0x1047 */ 0x6418,0x404C, + /* Array index: 0x1047 */ 0x641E,0x404D, + /* Array index: 0x1047 */ 0x6420,0x404E, + /* Array index: 0x1047 */ 0x6422,0x404F, + /* Array index: 0x1047 */ 0x6424,0x4050, + /* Array index: 0x1047 */ 0x6425,0x4051, + /* Array index: 0x1047 */ 0x6429,0x4052, + /* Array index: 0x1047 */ 0x642A,0x4053, + /* Array index: 0x1047 */ 0x642F,0x4054, + /* Array index: 0x1047 */ 0x6430,0x4055, + /* Array index: 0x1047 */ 0x6435,0x4056, + /* Array index: 0x1047 */ 0x643D,0x4057, + /* Array index: 0x1047 */ 0x643F,0x4058, + /* Array index: 0x1047 */ 0x644B,0x4059, + /* Array index: 0x1047 */ 0x646D,0x4067, + /* Array index: 0x1047 */ 0x6473,0x4068, + /* Array index: 0x1047 */ 0x6474,0x4069, + /* Array index: 0x1047 */ 0x647B,0x406A, + /* Array index: 0x1047 */ 0x647D,0x406B, + /* Array index: 0x1047 */ 0x6485,0x406C, + /* Array index: 0x1047 */ 0x6487,0x406D, + /* Array index: 0x1047 */ 0x6498,0x4071, + /* Array index: 0x1047 */ 0x6499,0x4072, + /* Array index: 0x1047 */ 0x649B,0x4073, + /* Array index: 0x1047 */ 0x649D,0x4074, + /* Array index: 0x1047 */ 0x649F,0x4075, + /* Array index: 0x1047 */ 0x64A1,0x4076, + /* Array index: 0x1047 */ 0x64A3,0x4077, + /* Array index: 0x1047 */ 0x64A6,0x4078, + /* Array index: 0x1047 */ 0x64A8,0x4079, + /* Array index: 0x1047 */ 0x64AC,0x407A, + /* Array index: 0x1047 */ 0x64B3,0x407B, + /* Array index: 0x1047 */ 0x64C4,0x4121, + /* Array index: 0x1047 */ 0x64D5,0x4129, + /* Array index: 0x1047 */ 0x64D7,0x412A, + /* Array index: 0x1047 */ 0x64E4,0x412B, + /* Array index: 0x1047 */ 0x64E5,0x412C, + /* Array index: 0x1047 */ 0x64E9,0x412D, + /* Array index: 0x1047 */ 0x64EA,0x412E, + /* Array index: 0x1047 */ 0x64ED,0x412F, + /* Array index: 0x1047 */ 0x64F0,0x4130, + /* Array index: 0x1047 */ 0x64F5,0x4131, + /* Array index: 0x1047 */ 0x64F7,0x4132, + /* Array index: 0x1047 */ 0x64FB,0x4133, + /* Array index: 0x1047 */ 0x64FF,0x4134, + /* Array index: 0x1047 */ 0x6501,0x4135, + /* Array index: 0x1047 */ 0x6504,0x4136, + /* Array index: 0x1047 */ 0x650F,0x413A, + /* Array index: 0x1047 */ 0x6513,0x413B, + /* Array index: 0x1047 */ 0x6514,0x413C, + /* Array index: 0x1047 */ 0x6516,0x413D, + /* Array index: 0x1047 */ 0x6519,0x413E, + /* Array index: 0x1047 */ 0x651B,0x413F, + /* Array index: 0x1047 */ 0x651E,0x4140, + /* Array index: 0x1047 */ 0x651F,0x4141, + /* Array index: 0x1047 */ 0x6522,0x4142, + /* Array index: 0x1047 */ 0x6526,0x4143, + /* Array index: 0x1047 */ 0x6529,0x4144, + /* Array index: 0x1047 */ 0x652E,0x4145, + /* Array index: 0x1047 */ 0x6531,0x4146, + /* Array index: 0x1047 */ 0x653A,0x4147, + /* Array index: 0x1047 */ 0x653C,0x4148, + /* Array index: 0x1047 */ 0x653D,0x4149, + /* Array index: 0x1047 */ 0x6543,0x414A, + /* Array index: 0x1047 */ 0x6547,0x414B, + /* Array index: 0x1047 */ 0x6549,0x414C, + /* Array index: 0x1047 */ 0x6550,0x414D, + /* Array index: 0x1047 */ 0x6552,0x414E, + /* Array index: 0x1047 */ 0x6554,0x414F, + /* Array index: 0x1047 */ 0x655F,0x4150, + /* Array index: 0x1047 */ 0x6560,0x4151, + /* Array index: 0x1047 */ 0x6567,0x4152, + /* Array index: 0x1047 */ 0x656B,0x4153, + /* Array index: 0x1047 */ 0x657A,0x4154, + /* Array index: 0x1047 */ 0x657D,0x4155, + /* Array index: 0x1047 */ 0x6581,0x4156, + /* Array index: 0x1047 */ 0x6585,0x4157, + /* Array index: 0x1047 */ 0x658A,0x4158, + /* Array index: 0x1047 */ 0x6592,0x4159, + /* Array index: 0x1047 */ 0x6595,0x415A, + /* Array index: 0x1047 */ 0x6598,0x415B, + /* Array index: 0x1047 */ 0x659D,0x415C, + /* Array index: 0x1047 */ 0x65A0,0x415D, + /* Array index: 0x1047 */ 0x65A3,0x415E, + /* Array index: 0x1047 */ 0x65A6,0x415F, + /* Array index: 0x1047 */ 0x65AE,0x4160, + /* Array index: 0x1047 */ 0x65BF,0x4164, + /* Array index: 0x1047 */ 0x65C2,0x4165, + /* Array index: 0x1047 */ 0x65C8,0x4166, + /* Array index: 0x1047 */ 0x65C9,0x4167, + /* Array index: 0x1047 */ 0x65CE,0x4168, + /* Array index: 0x1047 */ 0x65D0,0x4169, + /* Array index: 0x1047 */ 0x65D4,0x416A, + /* Array index: 0x1047 */ 0x65D6,0x416B, + /* Array index: 0x1047 */ 0x65D8,0x416C, + /* Array index: 0x1047 */ 0x65DF,0x416D, + /* Array index: 0x1047 */ 0x65F0,0x416E, + /* Array index: 0x1047 */ 0x65F2,0x416F, + /* Array index: 0x1047 */ 0x65F4,0x4170, + /* Array index: 0x1047 */ 0x65F5,0x4171, + /* Array index: 0x1047 */ 0x65F9,0x4172, + /* Array index: 0x1047 */ 0x6604,0x4176, + /* Array index: 0x1047 */ 0x6608,0x4177, + /* Array index: 0x1047 */ 0x6609,0x4178, + /* Array index: 0x1047 */ 0x660D,0x4179, + /* Array index: 0x1047 */ 0x6611,0x417A, + /* Array index: 0x1047 */ 0x6612,0x417B, + /* Array index: 0x1047 */ 0x6615,0x417C, + /* Array index: 0x1047 */ 0x6616,0x417D, + /* Array index: 0x1047 */ 0x6637,0x4230, + /* Array index: 0x1047 */ 0x6639,0x422F, + /* Array index: 0x1047 */ 0x6640,0x4231, + /* Array index: 0x1047 */ 0x6645,0x4232, + /* Array index: 0x1047 */ 0x6646,0x4233, + /* Array index: 0x1047 */ 0x664A,0x4234, + /* Array index: 0x1047 */ 0x664C,0x4235, + /* Array index: 0x1047 */ 0x664E,0x4237, + /* Array index: 0x1047 */ 0x6651,0x4236, + /* Array index: 0x1047 */ 0x6660,0x423D, + /* Array index: 0x1047 */ 0x6661,0x423E, + /* Array index: 0x1047 */ 0x6673,0x4244, + /* Array index: 0x1047 */ 0x6690,0x4250, + /* Array index: 0x1047 */ 0x6692,0x4251, + /* Array index: 0x1047 */ 0x66A4,0x4258, + /* Array index: 0x1047 */ 0x66AD,0x4259, + /* Array index: 0x1047 */ 0x66B1,0x425A, + /* Array index: 0x1047 */ 0x66B2,0x425B, + /* Array index: 0x1047 */ 0x66B5,0x425C, + /* Array index: 0x1047 */ 0x66BB,0x425D, + /* Array index: 0x1047 */ 0x66C8,0x4262, + /* Array index: 0x1047 */ 0x66CC,0x4263, + /* Array index: 0x1047 */ 0x66CE,0x4264, + /* Array index: 0x1047 */ 0x66CF,0x4265, + /* Array index: 0x1047 */ 0x66D4,0x4266, + /* Array index: 0x1047 */ 0x66DB,0x4267, + /* Array index: 0x1047 */ 0x66DF,0x4268, + /* Array index: 0x1047 */ 0x66E8,0x4269, + /* Array index: 0x1047 */ 0x66EB,0x426A, + /* Array index: 0x1047 */ 0x66EC,0x426B, + /* Array index: 0x1047 */ 0x66EE,0x426C, + /* Array index: 0x1047 */ 0x66FA,0x426D, + /* Array index: 0x1047 */ 0x66FB,0x423F, + /* Array index: 0x1047 */ 0x6705,0x426E, + /* Array index: 0x1047 */ 0x6707,0x426F, + /* Array index: 0x1047 */ 0x670E,0x4270, + /* Array index: 0x1047 */ 0x6713,0x4271, + /* Array index: 0x1047 */ 0x6719,0x4272, + /* Array index: 0x1047 */ 0x671C,0x4273, + /* Array index: 0x1047 */ 0x6720,0x4274, + /* Array index: 0x1047 */ 0x6722,0x4275, + /* Array index: 0x1047 */ 0x6733,0x4276, + /* Array index: 0x1047 */ 0x673E,0x4277, + /* Array index: 0x1047 */ 0x6745,0x4278, + /* Array index: 0x1047 */ 0x6747,0x4279, + /* Array index: 0x1047 */ 0x6748,0x427A, + /* Array index: 0x1047 */ 0x674C,0x427B, + /* Array index: 0x1047 */ 0x6754,0x427C, + /* Array index: 0x1047 */ 0x6755,0x427D, + /* Array index: 0x1047 */ 0x675D,0x427E, + /* Array index: 0x1047 */ 0x6766,0x4321, + /* Array index: 0x1047 */ 0x676C,0x4322, + /* Array index: 0x1047 */ 0x676E,0x4323, + /* Array index: 0x1047 */ 0x6774,0x4324, + /* Array index: 0x1047 */ 0x6776,0x4325, + /* Array index: 0x1047 */ 0x677B,0x4326, + /* Array index: 0x1047 */ 0x6781,0x4327, + /* Array index: 0x1047 */ 0x6784,0x4328, + /* Array index: 0x1047 */ 0x678E,0x4329, + /* Array index: 0x1047 */ 0x678F,0x432A, + /* Array index: 0x1047 */ 0x6791,0x432B, + /* Array index: 0x1047 */ 0x6793,0x432C, + /* Array index: 0x1047 */ 0x6796,0x432D, + /* Array index: 0x1047 */ 0x6798,0x432E, + /* Array index: 0x1047 */ 0x6799,0x432F, + /* Array index: 0x1047 */ 0x679B,0x4330, + /* Array index: 0x1047 */ 0x67B5,0x4334, + /* Array index: 0x1047 */ 0x67C0,0x4339, + /* Array index: 0x1047 */ 0x67C2,0x433A, + /* Array index: 0x1047 */ 0x67C3,0x433B, + /* Array index: 0x1047 */ 0x67C5,0x433C, + /* Array index: 0x1047 */ 0x67C8,0x433D, + /* Array index: 0x1047 */ 0x67C9,0x433E, + /* Array index: 0x1047 */ 0x67D2,0x433F, + /* Array index: 0x1047 */ 0x67D7,0x4340, + /* Array index: 0x1047 */ 0x67D9,0x4341, + /* Array index: 0x1047 */ 0x67DC,0x4342, + /* Array index: 0x1047 */ 0x67E1,0x4343, + /* Array index: 0x1047 */ 0x67E6,0x4344, + /* Array index: 0x1047 */ 0x67F0,0x4345, + /* Array index: 0x1047 */ 0x67F2,0x4346, + /* Array index: 0x1047 */ 0x67F6,0x4347, + /* Array index: 0x1047 */ 0x67F7,0x4348, + /* Array index: 0x1047 */ 0x67F9,0x4338, + /* Array index: 0x1047 */ 0x6814,0x434A, + /* Array index: 0x1047 */ 0x6819,0x434B, + /* Array index: 0x1047 */ 0x681D,0x434C, + /* Array index: 0x1047 */ 0x681F,0x434D, + /* Array index: 0x1047 */ 0x6827,0x434F, + /* Array index: 0x1047 */ 0x6828,0x434E, + /* Array index: 0x1047 */ 0x683B,0x4356, + /* Array index: 0x1047 */ 0x683F,0x4357, + /* Array index: 0x1047 */ 0x6844,0x4358, + /* Array index: 0x1047 */ 0x6845,0x4359, + /* Array index: 0x1047 */ 0x684A,0x435A, + /* Array index: 0x1047 */ 0x684C,0x435B, + /* Array index: 0x1047 */ 0x6852,0x4349, + /* Array index: 0x1047 */ 0x6855,0x435C, + /* Array index: 0x1047 */ 0x6857,0x435D, + /* Array index: 0x1047 */ 0x6858,0x435E, + /* Array index: 0x1047 */ 0x685B,0x435F, + /* Array index: 0x1047 */ 0x686B,0x4360, + /* Array index: 0x1047 */ 0x6875,0x4366, + /* Array index: 0x1047 */ 0x6882,0x436B, + /* Array index: 0x1047 */ 0x6884,0x436C, + /* Array index: 0x1047 */ 0x6886,0x436D, + /* Array index: 0x1047 */ 0x6888,0x436E, + /* Array index: 0x1047 */ 0x6896,0x436F, + /* Array index: 0x1047 */ 0x6898,0x4370, + /* Array index: 0x1047 */ 0x689A,0x4371, + /* Array index: 0x1047 */ 0x689C,0x4372, + /* Array index: 0x1047 */ 0x68A1,0x4373, + /* Array index: 0x1047 */ 0x68A3,0x4374, + /* Array index: 0x1047 */ 0x68A5,0x4375, + /* Array index: 0x1047 */ 0x68A9,0x4376, + /* Array index: 0x1047 */ 0x68AA,0x4377, + /* Array index: 0x1047 */ 0x68AE,0x4378, + /* Array index: 0x1047 */ 0x68B2,0x4379, + /* Array index: 0x1047 */ 0x68BB,0x437A, + /* Array index: 0x1047 */ 0x68C5,0x437B, + /* Array index: 0x1047 */ 0x68C8,0x437C, + /* Array index: 0x1047 */ 0x68CC,0x437D, + /* Array index: 0x1047 */ 0x68D6,0x4424, + /* Array index: 0x1047 */ 0x68D9,0x4425, + /* Array index: 0x1047 */ 0x68DC,0x4426, + /* Array index: 0x1047 */ 0x68DD,0x4427, + /* Array index: 0x1047 */ 0x68E5,0x4428, + /* Array index: 0x1047 */ 0x68F5,0x4430, + /* Array index: 0x1047 */ 0x68F6,0x4431, + /* Array index: 0x1047 */ 0x6906,0x4435, + /* Array index: 0x1047 */ 0x6909,0x4436, + /* Array index: 0x1047 */ 0x690A,0x4437, + /* Array index: 0x1047 */ 0x6910,0x4438, + /* Array index: 0x1047 */ 0x6911,0x4439, + /* Array index: 0x1047 */ 0x6913,0x443A, + /* Array index: 0x1047 */ 0x6916,0x443B, + /* Array index: 0x1047 */ 0x6917,0x443C, + /* Array index: 0x1047 */ 0x6931,0x443D, + /* Array index: 0x1047 */ 0x6933,0x443E, + /* Array index: 0x1047 */ 0x6935,0x443F, + /* Array index: 0x1047 */ 0x6938,0x4440, + /* Array index: 0x1047 */ 0x693B,0x4441, + /* Array index: 0x1047 */ 0x6942,0x4442, + /* Array index: 0x1047 */ 0x6945,0x4443, + /* Array index: 0x1047 */ 0x6949,0x4444, + /* Array index: 0x1047 */ 0x694E,0x4445, + /* Array index: 0x1047 */ 0x6957,0x4446, + /* Array index: 0x1047 */ 0x695B,0x4447, + /* Array index: 0x1047 */ 0x696C,0x444E, + /* Array index: 0x1047 */ 0x697A,0x4452, + /* Array index: 0x1047 */ 0x697B,0x4453, + /* Array index: 0x1047 */ 0x697F,0x4454, + /* Array index: 0x1047 */ 0x6980,0x4455, + /* Array index: 0x1047 */ 0x698D,0x4456, + /* Array index: 0x1047 */ 0x6992,0x4457, + /* Array index: 0x1047 */ 0x6996,0x4458, + /* Array index: 0x1047 */ 0x6998,0x4459, + /* Array index: 0x1047 */ 0x69A1,0x445A, + /* Array index: 0x1047 */ 0x69A5,0x445B, + /* Array index: 0x1047 */ 0x69A6,0x445C, + /* Array index: 0x1047 */ 0x69A8,0x445D, + /* Array index: 0x1047 */ 0x69AB,0x445E, + /* Array index: 0x1047 */ 0x69AD,0x445F, + /* Array index: 0x1047 */ 0x69AF,0x4460, + /* Array index: 0x1047 */ 0x69B7,0x4461, + /* Array index: 0x1047 */ 0x69B8,0x4462, + /* Array index: 0x1047 */ 0x69BA,0x4463, + /* Array index: 0x1047 */ 0x69BC,0x4464, + /* Array index: 0x1047 */ 0x69C5,0x4465, + /* Array index: 0x1047 */ 0x69C8,0x4466, + /* Array index: 0x1047 */ 0x69D1,0x4467, + /* Array index: 0x1047 */ 0x69D6,0x4468, + /* Array index: 0x1047 */ 0x69D7,0x4469, + /* Array index: 0x1047 */ 0x69E2,0x446A, + /* Array index: 0x1047 */ 0x69E5,0x446B, + /* Array index: 0x1047 */ 0x69EE,0x446C, + /* Array index: 0x1047 */ 0x69EF,0x446D, + /* Array index: 0x1047 */ 0x69F1,0x446E, + /* Array index: 0x1047 */ 0x69F3,0x446F, + /* Array index: 0x1047 */ 0x69F5,0x4470, + /* Array index: 0x1047 */ 0x69FE,0x4471, + /* Array index: 0x1047 */ 0x6A00,0x4472, + /* Array index: 0x1047 */ 0x6A01,0x4473, + /* Array index: 0x1047 */ 0x6A03,0x4474, + /* Array index: 0x1047 */ 0x6A0F,0x4475, + /* Array index: 0x1047 */ 0x6A11,0x4476, + /* Array index: 0x1047 */ 0x6A15,0x4477, + /* Array index: 0x1047 */ 0x6A1A,0x4478, + /* Array index: 0x1047 */ 0x6A1D,0x4479, + /* Array index: 0x1047 */ 0x6A20,0x447A, + /* Array index: 0x1047 */ 0x6A24,0x447B, + /* Array index: 0x1047 */ 0x6A28,0x447C, + /* Array index: 0x1047 */ 0x6A30,0x447D, + /* Array index: 0x1047 */ 0x6A32,0x447E, + /* Array index: 0x1047 */ 0x6A34,0x4521, + /* Array index: 0x1047 */ 0x6A37,0x4522, + /* Array index: 0x1047 */ 0x6A3B,0x4523, + /* Array index: 0x1047 */ 0x6A3E,0x4524, + /* Array index: 0x1047 */ 0x6A3F,0x4525, + /* Array index: 0x1047 */ 0x6A45,0x4526, + /* Array index: 0x1047 */ 0x6A46,0x4527, + /* Array index: 0x1047 */ 0x6A49,0x4528, + /* Array index: 0x1047 */ 0x6A4A,0x4529, + /* Array index: 0x1047 */ 0x6A5B,0x4530, + /* Array index: 0x1047 */ 0x6A64,0x4531, + /* Array index: 0x1047 */ 0x6A67,0x4532, + /* Array index: 0x1047 */ 0x6A6A,0x4533, + /* Array index: 0x1047 */ 0x6A71,0x4534, + /* Array index: 0x1047 */ 0x6A73,0x4535, + /* Array index: 0x1047 */ 0x6A7E,0x4536, + /* Array index: 0x1047 */ 0x6A81,0x4537, + /* Array index: 0x1047 */ 0x6A83,0x4538, + /* Array index: 0x1047 */ 0x6A86,0x4539, + /* Array index: 0x1047 */ 0x6A87,0x453A, + /* Array index: 0x1047 */ 0x6A89,0x453B, + /* Array index: 0x1047 */ 0x6A8B,0x453C, + /* Array index: 0x1047 */ 0x6A91,0x453D, + /* Array index: 0x1047 */ 0x6AA5,0x4542, + /* Array index: 0x1047 */ 0x6AAB,0x4543, + /* Array index: 0x1047 */ 0x6AB4,0x4547, + /* Array index: 0x1047 */ 0x6AC6,0x454B, + /* Array index: 0x1047 */ 0x6AC8,0x454D, + /* Array index: 0x1047 */ 0x6AC9,0x454C, + /* Array index: 0x1047 */ 0x6ACC,0x454E, + /* Array index: 0x1047 */ 0x6AD0,0x454F, + /* Array index: 0x1047 */ 0x6ADC,0x4553, + /* Array index: 0x1047 */ 0x6ADD,0x4554, + /* Array index: 0x1047 */ 0x6AE4,0x4555, + /* Array index: 0x1047 */ 0x6AE7,0x4556, + /* Array index: 0x1047 */ 0x6AEC,0x4557, + /* Array index: 0x1047 */ 0x6AFC,0x455B, + /* Array index: 0x1047 */ 0x6AFD,0x455C, + /* Array index: 0x1047 */ 0x6B02,0x455D, + /* Array index: 0x1047 */ 0x6B03,0x455E, + /* Array index: 0x1047 */ 0x6B06,0x455F, + /* Array index: 0x1047 */ 0x6B07,0x4560, + /* Array index: 0x1047 */ 0x6B09,0x4561, + /* Array index: 0x1047 */ 0x6B17,0x4565, + /* Array index: 0x1047 */ 0x6B1B,0x4566, + /* Array index: 0x1047 */ 0x6B1E,0x4567, + /* Array index: 0x1047 */ 0x6B24,0x4568, + /* Array index: 0x1047 */ 0x6B28,0x4569, + /* Array index: 0x1047 */ 0x6B2B,0x456A, + /* Array index: 0x1047 */ 0x6B2C,0x456B, + /* Array index: 0x1047 */ 0x6B2F,0x456C, + /* Array index: 0x1047 */ 0x6B35,0x456D, + /* Array index: 0x1047 */ 0x6B36,0x456E, + /* Array index: 0x1047 */ 0x6B3B,0x456F, + /* Array index: 0x1047 */ 0x6B3F,0x4570, + /* Array index: 0x1047 */ 0x6B46,0x4571, + /* Array index: 0x1047 */ 0x6B4A,0x4572, + /* Array index: 0x1047 */ 0x6B4D,0x4573, + /* Array index: 0x1047 */ 0x6B52,0x4574, + /* Array index: 0x1047 */ 0x6B56,0x4575, + /* Array index: 0x1047 */ 0x6B58,0x4576, + /* Array index: 0x1047 */ 0x6B5D,0x4577, + /* Array index: 0x1047 */ 0x6B60,0x4578, + /* Array index: 0x1047 */ 0x6B67,0x4579, + /* Array index: 0x1047 */ 0x6B6B,0x457A, + /* Array index: 0x1047 */ 0x6B6E,0x457B, + /* Array index: 0x1047 */ 0x6B70,0x457C, + /* Array index: 0x1047 */ 0x6B75,0x457D, + /* Array index: 0x1047 */ 0x6B7D,0x457E, + /* Array index: 0x1047 */ 0x6B7E,0x4621, + /* Array index: 0x1047 */ 0x6B82,0x4622, + /* Array index: 0x1047 */ 0x6B85,0x4623, + /* Array index: 0x1047 */ 0x6B97,0x4624, + /* Array index: 0x1047 */ 0x6B9B,0x4625, + /* Array index: 0x1047 */ 0x6BB8,0x4630, + /* Array index: 0x1047 */ 0x6BB9,0x4631, + /* Array index: 0x1047 */ 0x6BBD,0x4632, + /* Array index: 0x1047 */ 0x6BBE,0x4633, + /* Array index: 0x1047 */ 0x6BC3,0x4634, + /* Array index: 0x1047 */ 0x6BC4,0x4635, + /* Array index: 0x1047 */ 0x6BC9,0x4636, + /* Array index: 0x1047 */ 0x6BCC,0x4637, + /* Array index: 0x1047 */ 0x6BD6,0x4638, + /* Array index: 0x1047 */ 0x6BDA,0x4639, + /* Array index: 0x1047 */ 0x6BE1,0x463A, + /* Array index: 0x1047 */ 0x6BE3,0x463B, + /* Array index: 0x1047 */ 0x6BE6,0x463C, + /* Array index: 0x1047 */ 0x6BE7,0x463D, + /* Array index: 0x1047 */ 0x6BEE,0x463E, + /* Array index: 0x1047 */ 0x6BF1,0x463F, + /* Array index: 0x1047 */ 0x6BF7,0x4640, + /* Array index: 0x1047 */ 0x6BF9,0x4641, + /* Array index: 0x1047 */ 0x6BFF,0x4642, + /* Array index: 0x1047 */ 0x6C02,0x4643, + /* Array index: 0x1047 */ 0x6C04,0x4644, + /* Array index: 0x1047 */ 0x6C05,0x4645, + /* Array index: 0x1047 */ 0x6C09,0x4646, + /* Array index: 0x1047 */ 0x6C0D,0x4647, + /* Array index: 0x1047 */ 0x6C0E,0x4648, + /* Array index: 0x1047 */ 0x6C10,0x4649, + /* Array index: 0x1047 */ 0x6C12,0x464A, + /* Array index: 0x1047 */ 0x6C19,0x464B, + /* Array index: 0x1047 */ 0x6C1F,0x464C, + /* Array index: 0x1047 */ 0x6C2C,0x4650, + /* Array index: 0x1047 */ 0x6C2E,0x4651, + /* Array index: 0x1047 */ 0x6C33,0x4652, + /* Array index: 0x1047 */ 0x6C35,0x4653, + /* Array index: 0x1047 */ 0x6C36,0x4654, + /* Array index: 0x1047 */ 0x6C3A,0x4655, + /* Array index: 0x1047 */ 0x6C3B,0x4656, + /* Array index: 0x1047 */ 0x6C3F,0x4657, + /* Array index: 0x1047 */ 0x6C4A,0x4658, + /* Array index: 0x1047 */ 0x6C4B,0x4659, + /* Array index: 0x1047 */ 0x6C4D,0x465A, + /* Array index: 0x1047 */ 0x6C4F,0x465B, + /* Array index: 0x1047 */ 0x6C52,0x465C, + /* Array index: 0x1047 */ 0x6C54,0x465D, + /* Array index: 0x1047 */ 0x6C59,0x465E, + /* Array index: 0x1047 */ 0x6C5B,0x465F, + /* Array index: 0x1047 */ 0x6C5C,0x4660, + /* Array index: 0x1047 */ 0x6C67,0x4736, + /* Array index: 0x1047 */ 0x6C6B,0x4661, + /* Array index: 0x1047 */ 0x6C6D,0x4662, + /* Array index: 0x1047 */ 0x6C6F,0x4663, + /* Array index: 0x1047 */ 0x6C74,0x4664, + /* Array index: 0x1047 */ 0x6C76,0x4665, + /* Array index: 0x1047 */ 0x6C78,0x4666, + /* Array index: 0x1047 */ 0x6C79,0x4667, + /* Array index: 0x1047 */ 0x6C7B,0x4668, + /* Array index: 0x1047 */ 0x6C9C,0x4671, + /* Array index: 0x1047 */ 0x6C9F,0x4672, + /* Array index: 0x1047 */ 0x6CB0,0x4673, + /* Array index: 0x1047 */ 0x6CB2,0x4674, + /* Array index: 0x1047 */ 0x6CB4,0x4675, + /* Array index: 0x1047 */ 0x6CC2,0x4676, + /* Array index: 0x1047 */ 0x6CC6,0x4677, + /* Array index: 0x1047 */ 0x6CDA,0x4721, + /* Array index: 0x1047 */ 0x6CDC,0x4722, + /* Array index: 0x1047 */ 0x6CE0,0x4723, + /* Array index: 0x1047 */ 0x6CE7,0x4724, + /* Array index: 0x1047 */ 0x6CE9,0x4725, + /* Array index: 0x1047 */ 0x6CEB,0x4726, + /* Array index: 0x1047 */ 0x6CEC,0x4727, + /* Array index: 0x1047 */ 0x6CEE,0x4728, + /* Array index: 0x1047 */ 0x6CF2,0x4729, + /* Array index: 0x1047 */ 0x6CF4,0x472A, + /* Array index: 0x1047 */ 0x6D04,0x472B, + /* Array index: 0x1047 */ 0x6D07,0x472C, + /* Array index: 0x1047 */ 0x6D0A,0x472D, + /* Array index: 0x1047 */ 0x6D0E,0x472E, + /* Array index: 0x1047 */ 0x6D0F,0x472F, + /* Array index: 0x1047 */ 0x6D11,0x4730, + /* Array index: 0x1047 */ 0x6D13,0x4731, + /* Array index: 0x1047 */ 0x6D1A,0x4732, + /* Array index: 0x1047 */ 0x6D2E,0x4737, + /* Array index: 0x1047 */ 0x6D2F,0x4738, + /* Array index: 0x1047 */ 0x6D31,0x4739, + /* Array index: 0x1047 */ 0x6D39,0x473A, + /* Array index: 0x1047 */ 0x6D3C,0x473B, + /* Array index: 0x1047 */ 0x6D3F,0x473C, + /* Array index: 0x1047 */ 0x6D57,0x473D, + /* Array index: 0x1047 */ 0x6D5E,0x473E, + /* Array index: 0x1047 */ 0x6D5F,0x473F, + /* Array index: 0x1047 */ 0x6D61,0x4740, + /* Array index: 0x1047 */ 0x6D65,0x4741, + /* Array index: 0x1047 */ 0x6D67,0x4742, + /* Array index: 0x1047 */ 0x6D6F,0x4743, + /* Array index: 0x1047 */ 0x6D70,0x4744, + /* Array index: 0x1047 */ 0x6D7C,0x4745, + /* Array index: 0x1047 */ 0x6D82,0x4746, + /* Array index: 0x1047 */ 0x6D87,0x4747, + /* Array index: 0x1047 */ 0x6D91,0x4748, + /* Array index: 0x1047 */ 0x6D92,0x4749, + /* Array index: 0x1047 */ 0x6DAA,0x474E, + /* Array index: 0x1047 */ 0x6DAC,0x474F, + /* Array index: 0x1047 */ 0x6DB4,0x4750, + /* Array index: 0x1047 */ 0x6DB7,0x4751, + /* Array index: 0x1047 */ 0x6DB9,0x4752, + /* Array index: 0x1047 */ 0x6DBD,0x4753, + /* Array index: 0x1047 */ 0x6DBF,0x4754, + /* Array index: 0x1047 */ 0x6DC4,0x4755, + /* Array index: 0x1047 */ 0x6DC8,0x4756, + /* Array index: 0x1047 */ 0x6DCA,0x4757, + /* Array index: 0x1047 */ 0x6DCE,0x4758, + /* Array index: 0x1047 */ 0x6DCF,0x4759, + /* Array index: 0x1047 */ 0x6DD6,0x475A, + /* Array index: 0x1047 */ 0x6DDB,0x475B, + /* Array index: 0x1047 */ 0x6DDD,0x475C, + /* Array index: 0x1047 */ 0x6DDF,0x475D, + /* Array index: 0x1047 */ 0x6DE0,0x475E, + /* Array index: 0x1047 */ 0x6DE2,0x475F, + /* Array index: 0x1047 */ 0x6DE5,0x4760, + /* Array index: 0x1047 */ 0x6DE9,0x4761, + /* Array index: 0x1047 */ 0x6DEF,0x4762, + /* Array index: 0x1047 */ 0x6DF0,0x4763, + /* Array index: 0x1047 */ 0x6DF4,0x4764, + /* Array index: 0x1047 */ 0x6DF6,0x4765, + /* Array index: 0x1047 */ 0x6DFC,0x4766, + /* Array index: 0x1047 */ 0x6E00,0x4767, + /* Array index: 0x1047 */ 0x6E04,0x4768, + /* Array index: 0x1047 */ 0x6E1E,0x4769, + /* Array index: 0x1047 */ 0x6E22,0x476A, + /* Array index: 0x1047 */ 0x6E27,0x476B, + /* Array index: 0x1047 */ 0x6E32,0x476C, + /* Array index: 0x1047 */ 0x6E36,0x476D, + /* Array index: 0x1047 */ 0x6E39,0x476E, + /* Array index: 0x1047 */ 0x6E3B,0x476F, + /* Array index: 0x1047 */ 0x6E3C,0x4770, + /* Array index: 0x1047 */ 0x6E44,0x4771, + /* Array index: 0x1047 */ 0x6E45,0x4772, + /* Array index: 0x1047 */ 0x6E48,0x4773, + /* Array index: 0x1047 */ 0x6E49,0x4774, + /* Array index: 0x1047 */ 0x6E4B,0x4775, + /* Array index: 0x1047 */ 0x6E57,0x477B, + /* Array index: 0x1047 */ 0x6E62,0x4821, + /* Array index: 0x1047 */ 0x6E63,0x4822, + /* Array index: 0x1047 */ 0x6E68,0x4823, + /* Array index: 0x1047 */ 0x6E73,0x4824, + /* Array index: 0x1047 */ 0x6E7B,0x4825, + /* Array index: 0x1047 */ 0x6E7D,0x4826, + /* Array index: 0x1047 */ 0x6E8D,0x4827, + /* Array index: 0x1047 */ 0x6E93,0x4828, + /* Array index: 0x1047 */ 0x6E99,0x4829, + /* Array index: 0x1047 */ 0x6EA0,0x482A, + /* Array index: 0x1047 */ 0x6EA7,0x482B, + /* Array index: 0x1047 */ 0x6EAD,0x482C, + /* Array index: 0x1047 */ 0x6EAE,0x482D, + /* Array index: 0x1047 */ 0x6EB1,0x482E, + /* Array index: 0x1047 */ 0x6EB3,0x482F, + /* Array index: 0x1047 */ 0x6EBB,0x4830, + /* Array index: 0x1047 */ 0x6EC7,0x4835, + /* Array index: 0x1047 */ 0x6EC8,0x4836, + /* Array index: 0x1047 */ 0x6ECA,0x4837, + /* Array index: 0x1047 */ 0x6EEB,0x483B, + /* Array index: 0x1047 */ 0x6EED,0x483C, + /* Array index: 0x1047 */ 0x6EEE,0x483D, + /* Array index: 0x1047 */ 0x6EF9,0x483E, + /* Array index: 0x1047 */ 0x6EFB,0x483F, + /* Array index: 0x1047 */ 0x6EFD,0x4840, + /* Array index: 0x1047 */ 0x6F04,0x4841, + /* Array index: 0x1047 */ 0x6F08,0x4842, + /* Array index: 0x1047 */ 0x6F0A,0x4843, + /* Array index: 0x1047 */ 0x6F0C,0x4844, + /* Array index: 0x1047 */ 0x6F0D,0x4845, + /* Array index: 0x1047 */ 0x6F16,0x4846, + /* Array index: 0x1047 */ 0x6F18,0x4847, + /* Array index: 0x1047 */ 0x6F1A,0x4848, + /* Array index: 0x1047 */ 0x6F1B,0x4849, + /* Array index: 0x1047 */ 0x6F26,0x484A, + /* Array index: 0x1047 */ 0x6F29,0x484B, + /* Array index: 0x1047 */ 0x6F2A,0x484C, + /* Array index: 0x1047 */ 0x6F2D,0x4853, + /* Array index: 0x1047 */ 0x6F2F,0x484D, + /* Array index: 0x1047 */ 0x6F30,0x484E, + /* Array index: 0x1047 */ 0x6F33,0x484F, + /* Array index: 0x1047 */ 0x6F36,0x4850, + /* Array index: 0x1047 */ 0x6F3B,0x4851, + /* Array index: 0x1047 */ 0x6F3C,0x4852, + /* Array index: 0x1047 */ 0x6F57,0x4858, + /* Array index: 0x1047 */ 0x6F59,0x4859, + /* Array index: 0x1047 */ 0x6F5A,0x485A, + /* Array index: 0x1047 */ 0x6F5D,0x485B, + /* Array index: 0x1047 */ 0x6F5E,0x485C, + /* Array index: 0x1047 */ 0x6F61,0x485D, + /* Array index: 0x1047 */ 0x6F62,0x485E, + /* Array index: 0x1047 */ 0x6F68,0x485F, + /* Array index: 0x1047 */ 0x6F6C,0x4860, + /* Array index: 0x1047 */ 0x6F7D,0x4861, + /* Array index: 0x1047 */ 0x6F7E,0x4862, + /* Array index: 0x1047 */ 0x6F83,0x4863, + /* Array index: 0x1047 */ 0x6F9A,0x486E, + /* Array index: 0x1047 */ 0x6F9F,0x486F, + /* Array index: 0x1047 */ 0x6FA0,0x4870, + /* Array index: 0x1047 */ 0x6FB5,0x4878, + /* Array index: 0x1047 */ 0x6FB6,0x4879, + /* Array index: 0x1047 */ 0x6FBC,0x487A, + /* Array index: 0x1047 */ 0x6FC5,0x487B, + /* Array index: 0x1047 */ 0x6FC7,0x487C, + /* Array index: 0x1047 */ 0x6FC8,0x487D, + /* Array index: 0x1047 */ 0x6FCA,0x487E, + /* Array index: 0x1047 */ 0x6FDA,0x4921, + /* Array index: 0x1047 */ 0x6FDE,0x4922, + /* Array index: 0x1047 */ 0x6FE8,0x4923, + /* Array index: 0x1047 */ 0x6FE9,0x4924, + /* Array index: 0x1047 */ 0x6FF0,0x4925, + /* Array index: 0x1047 */ 0x6FF5,0x4926, + /* Array index: 0x1047 */ 0x6FF9,0x4927, + /* Array index: 0x1047 */ 0x6FFC,0x4928, + /* Array index: 0x1047 */ 0x6FFD,0x4929, + /* Array index: 0x1047 */ 0x7000,0x492A, + /* Array index: 0x1047 */ 0x700D,0x492E, + /* Array index: 0x1047 */ 0x7017,0x492F, + /* Array index: 0x1047 */ 0x7020,0x4930, + /* Array index: 0x1047 */ 0x7023,0x4931, + /* Array index: 0x1047 */ 0x702F,0x4932, + /* Array index: 0x1047 */ 0x7034,0x4933, + /* Array index: 0x1047 */ 0x7037,0x4934, + /* Array index: 0x1047 */ 0x7039,0x4935, + /* Array index: 0x1047 */ 0x703C,0x4936, + /* Array index: 0x1047 */ 0x7043,0x4937, + /* Array index: 0x1047 */ 0x7044,0x4938, + /* Array index: 0x1047 */ 0x704E,0x4941, + /* Array index: 0x1047 */ 0x7054,0x493D, + /* Array index: 0x1047 */ 0x7055,0x493E, + /* Array index: 0x1047 */ 0x705D,0x493F, + /* Array index: 0x1047 */ 0x705E,0x4940, + /* Array index: 0x1047 */ 0x7064,0x4942, + /* Array index: 0x1047 */ 0x7065,0x4943, + /* Array index: 0x1047 */ 0x706C,0x4944, + /* Array index: 0x1047 */ 0x706E,0x4945, + /* Array index: 0x1047 */ 0x7075,0x4946, + /* Array index: 0x1047 */ 0x7076,0x4947, + /* Array index: 0x1047 */ 0x707E,0x4948, + /* Array index: 0x1047 */ 0x7081,0x4949, + /* Array index: 0x1047 */ 0x7085,0x494A, + /* Array index: 0x1047 */ 0x7086,0x494B, + /* Array index: 0x1047 */ 0x709B,0x4951, + /* Array index: 0x1047 */ 0x70A4,0x4952, + /* Array index: 0x1047 */ 0x70AB,0x4953, + /* Array index: 0x1047 */ 0x70B0,0x4954, + /* Array index: 0x1047 */ 0x70B1,0x4955, + /* Array index: 0x1047 */ 0x70B4,0x4956, + /* Array index: 0x1047 */ 0x70B7,0x4957, + /* Array index: 0x1047 */ 0x70CA,0x4958, + /* Array index: 0x1047 */ 0x70DC,0x495F, + /* Array index: 0x1047 */ 0x70E4,0x4960, + /* Array index: 0x1047 */ 0x70FA,0x4961, + /* Array index: 0x1047 */ 0x710B,0x4967, + /* Array index: 0x1047 */ 0x710C,0x4968, + /* Array index: 0x1047 */ 0x710F,0x4969, + /* Array index: 0x1047 */ 0x711E,0x496A, + /* Array index: 0x1047 */ 0x7120,0x496B, + /* Array index: 0x1047 */ 0x712B,0x496C, + /* Array index: 0x1047 */ 0x7138,0x4971, + /* Array index: 0x1047 */ 0x7141,0x4972, + /* Array index: 0x1047 */ 0x7150,0x4978, + /* Array index: 0x1047 */ 0x7152,0x4979, + /* Array index: 0x1047 */ 0x7157,0x497A, + /* Array index: 0x1047 */ 0x715A,0x497B, + /* Array index: 0x1047 */ 0x715C,0x497C, + /* Array index: 0x1047 */ 0x715E,0x497D, + /* Array index: 0x1047 */ 0x7160,0x497E, + /* Array index: 0x1047 */ 0x7168,0x4A21, + /* Array index: 0x1047 */ 0x7179,0x4A22, + /* Array index: 0x1047 */ 0x7180,0x4A23, + /* Array index: 0x1047 */ 0x7185,0x4A24, + /* Array index: 0x1047 */ 0x7187,0x4A25, + /* Array index: 0x1047 */ 0x718C,0x4A26, + /* Array index: 0x1047 */ 0x7192,0x4A27, + /* Array index: 0x1047 */ 0x719A,0x4A28, + /* Array index: 0x1047 */ 0x719B,0x4A29, + /* Array index: 0x1047 */ 0x71A0,0x4A2A, + /* Array index: 0x1047 */ 0x71A2,0x4A2B, + /* Array index: 0x1047 */ 0x71BA,0x4A30, + /* Array index: 0x1047 */ 0x71C4,0x4A34, + /* Array index: 0x1047 */ 0x71CB,0x4A35, + /* Array index: 0x1047 */ 0x71CC,0x4A36, + /* Array index: 0x1047 */ 0x71D3,0x4A37, + /* Array index: 0x1047 */ 0x71D6,0x4A38, + /* Array index: 0x1047 */ 0x71D9,0x4A39, + /* Array index: 0x1047 */ 0x71DA,0x4A3A, + /* Array index: 0x1047 */ 0x71DC,0x4A3B, + /* Array index: 0x1047 */ 0x71F8,0x4A3C, + /* Array index: 0x1047 */ 0x71FE,0x4A3D, + /* Array index: 0x1047 */ 0x7200,0x4A3E, + /* Array index: 0x1047 */ 0x7213,0x4A42, + /* Array index: 0x1047 */ 0x7217,0x4A43, + /* Array index: 0x1047 */ 0x721A,0x4A44, + /* Array index: 0x1047 */ 0x721D,0x4A45, + /* Array index: 0x1047 */ 0x721F,0x4A46, + /* Array index: 0x1047 */ 0x7224,0x4A47, + /* Array index: 0x1047 */ 0x722B,0x4A48, + /* Array index: 0x1047 */ 0x722F,0x4A49, + /* Array index: 0x1047 */ 0x7234,0x4A4A, + /* Array index: 0x1047 */ 0x7238,0x4A4B, + /* Array index: 0x1047 */ 0x7239,0x4A4C, + /* Array index: 0x1047 */ 0x7253,0x4A54, + /* Array index: 0x1047 */ 0x7255,0x4A55, + /* Array index: 0x1047 */ 0x7256,0x4A56, + /* Array index: 0x1047 */ 0x725A,0x4A57, + /* Array index: 0x1047 */ 0x725C,0x4A58, + /* Array index: 0x1047 */ 0x725E,0x4A59, + /* Array index: 0x1047 */ 0x7260,0x4A5A, + /* Array index: 0x1047 */ 0x7263,0x4A5B, + /* Array index: 0x1047 */ 0x7268,0x4A5C, + /* Array index: 0x1047 */ 0x726B,0x4A5D, + /* Array index: 0x1047 */ 0x726E,0x4A5E, + /* Array index: 0x1047 */ 0x726F,0x4A5F, + /* Array index: 0x1047 */ 0x7271,0x4A60, + /* Array index: 0x1047 */ 0x7277,0x4A61, + /* Array index: 0x1047 */ 0x7278,0x4A62, + /* Array index: 0x1047 */ 0x727B,0x4A63, + /* Array index: 0x1047 */ 0x727C,0x4A64, + /* Array index: 0x1047 */ 0x727F,0x4A65, + /* Array index: 0x1047 */ 0x7284,0x4A66, + /* Array index: 0x1047 */ 0x7289,0x4A67, + /* Array index: 0x1047 */ 0x728D,0x4A68, + /* Array index: 0x1047 */ 0x728E,0x4A69, + /* Array index: 0x1047 */ 0x7293,0x4A6A, + /* Array index: 0x1047 */ 0x729B,0x4A6B, + /* Array index: 0x1047 */ 0x72A8,0x4A6C, + /* Array index: 0x1047 */ 0x72AD,0x4A6D, + /* Array index: 0x1047 */ 0x72AE,0x4A6E, + /* Array index: 0x1047 */ 0x72B1,0x4A6F, + /* Array index: 0x1047 */ 0x72B4,0x4A70, + /* Array index: 0x1047 */ 0x72BE,0x4A71, + /* Array index: 0x1047 */ 0x72C1,0x4A72, + /* Array index: 0x1047 */ 0x72C7,0x4A73, + /* Array index: 0x1047 */ 0x72C9,0x4A74, + /* Array index: 0x1047 */ 0x72CC,0x4A75, + /* Array index: 0x1047 */ 0x72D5,0x4A76, + /* Array index: 0x1047 */ 0x72D6,0x4A77, + /* Array index: 0x1047 */ 0x72D8,0x4A78, + /* Array index: 0x1047 */ 0x72DF,0x4A79, + /* Array index: 0x1047 */ 0x72E5,0x4A7A, + /* Array index: 0x1047 */ 0x72F3,0x4A7B, + /* Array index: 0x1047 */ 0x72F4,0x4A7C, + /* Array index: 0x1047 */ 0x72FA,0x4A7D, + /* Array index: 0x1047 */ 0x72FB,0x4A7E, + /* Array index: 0x1047 */ 0x72FE,0x4B21, + /* Array index: 0x1047 */ 0x7302,0x4B22, + /* Array index: 0x1047 */ 0x7304,0x4B23, + /* Array index: 0x1047 */ 0x7305,0x4B24, + /* Array index: 0x1047 */ 0x7307,0x4B25, + /* Array index: 0x1047 */ 0x730B,0x4B26, + /* Array index: 0x1047 */ 0x730D,0x4B27, + /* Array index: 0x1047 */ 0x7312,0x4B28, + /* Array index: 0x1047 */ 0x7313,0x4B29, + /* Array index: 0x1047 */ 0x7318,0x4B2A, + /* Array index: 0x1047 */ 0x7319,0x4B2B, + /* Array index: 0x1047 */ 0x731E,0x4B2C, + /* Array index: 0x1047 */ 0x7322,0x4B2D, + /* Array index: 0x1047 */ 0x7324,0x4B2E, + /* Array index: 0x1047 */ 0x7327,0x4B2F, + /* Array index: 0x1047 */ 0x7328,0x4B30, + /* Array index: 0x1047 */ 0x732C,0x4B31, + /* Array index: 0x1047 */ 0x7331,0x4B32, + /* Array index: 0x1047 */ 0x7332,0x4B33, + /* Array index: 0x1047 */ 0x7335,0x4B34, + /* Array index: 0x1047 */ 0x733A,0x4B35, + /* Array index: 0x1047 */ 0x733B,0x4B36, + /* Array index: 0x1047 */ 0x733D,0x4B37, + /* Array index: 0x1047 */ 0x7343,0x4B38, + /* Array index: 0x1047 */ 0x734D,0x4B39, + /* Array index: 0x1047 */ 0x7350,0x4B3A, + /* Array index: 0x1047 */ 0x7352,0x4B3B, + /* Array index: 0x1047 */ 0x7356,0x4B3C, + /* Array index: 0x1047 */ 0x7358,0x4B3D, + /* Array index: 0x1047 */ 0x7366,0x4B42, + /* Array index: 0x1047 */ 0x7367,0x4B43, + /* Array index: 0x1047 */ 0x7369,0x4B44, + /* Array index: 0x1047 */ 0x7377,0x4B4A, + /* Array index: 0x1047 */ 0x7379,0x4B4B, + /* Array index: 0x1047 */ 0x737C,0x4B4C, + /* Array index: 0x1047 */ 0x7380,0x4B4D, + /* Array index: 0x1047 */ 0x7381,0x4B4E, + /* Array index: 0x1047 */ 0x7383,0x4B4F, + /* Array index: 0x1047 */ 0x7385,0x4B50, + /* Array index: 0x1047 */ 0x7386,0x4B51, + /* Array index: 0x1047 */ 0x738E,0x4B52, + /* Array index: 0x1047 */ 0x7390,0x4B53, + /* Array index: 0x1047 */ 0x7393,0x4B54, + /* Array index: 0x1047 */ 0x7395,0x4B55, + /* Array index: 0x1047 */ 0x7397,0x4B56, + /* Array index: 0x1047 */ 0x7398,0x4B57, + /* Array index: 0x1047 */ 0x73AA,0x4B5F, + /* Array index: 0x1047 */ 0x73AB,0x4B60, + /* Array index: 0x1047 */ 0x73AD,0x4B61, + /* Array index: 0x1047 */ 0x73B5,0x4B62, + /* Array index: 0x1047 */ 0x73B7,0x4B63, + /* Array index: 0x1047 */ 0x73B9,0x4B64, + /* Array index: 0x1047 */ 0x73BC,0x4B65, + /* Array index: 0x1047 */ 0x73BD,0x4B66, + /* Array index: 0x1047 */ 0x73BF,0x4B67, + /* Array index: 0x1047 */ 0x73C5,0x4B68, + /* Array index: 0x1047 */ 0x73C6,0x4B69, + /* Array index: 0x1047 */ 0x73C9,0x4B6A, + /* Array index: 0x1047 */ 0x73CB,0x4B6B, + /* Array index: 0x1047 */ 0x73CC,0x4B6C, + /* Array index: 0x1047 */ 0x73CF,0x4B6D, + /* Array index: 0x1047 */ 0x73D2,0x4B6E, + /* Array index: 0x1047 */ 0x73D3,0x4B6F, + /* Array index: 0x1047 */ 0x73D6,0x4B70, + /* Array index: 0x1047 */ 0x73D9,0x4B71, + /* Array index: 0x1047 */ 0x73DD,0x4B72, + /* Array index: 0x1047 */ 0x73E1,0x4B73, + /* Array index: 0x1047 */ 0x73E3,0x4B74, + /* Array index: 0x1047 */ 0x73E6,0x4B75, + /* Array index: 0x1047 */ 0x73E7,0x4B76, + /* Array index: 0x1047 */ 0x73E9,0x4B77, + /* Array index: 0x1047 */ 0x73F4,0x4B78, + /* Array index: 0x1047 */ 0x73F5,0x4B79, + /* Array index: 0x1047 */ 0x7404,0x4C24, + /* Array index: 0x1047 */ 0x7407,0x4C25, + /* Array index: 0x1047 */ 0x740A,0x4C26, + /* Array index: 0x1047 */ 0x7411,0x4C27, + /* Array index: 0x1047 */ 0x741A,0x4C28, + /* Array index: 0x1047 */ 0x741B,0x4C29, + /* Array index: 0x1047 */ 0x7424,0x4C2A, + /* Array index: 0x1047 */ 0x7439,0x4C36, + /* Array index: 0x1047 */ 0x7440,0x4C37, + /* Array index: 0x1047 */ 0x744B,0x4C3C, + /* Array index: 0x1047 */ 0x744D,0x4C3D, + /* Array index: 0x1047 */ 0x7451,0x4C3E, + /* Array index: 0x1047 */ 0x7452,0x4C3F, + /* Array index: 0x1047 */ 0x7457,0x4C40, + /* Array index: 0x1047 */ 0x745D,0x4C41, + /* Array index: 0x1047 */ 0x7462,0x4C42, + /* Array index: 0x1047 */ 0x746B,0x4C46, + /* Array index: 0x1047 */ 0x746D,0x4C47, + /* Array index: 0x1047 */ 0x746E,0x4C48, + /* Array index: 0x1047 */ 0x7471,0x4C49, + /* Array index: 0x1047 */ 0x7472,0x4C4A, + /* Array index: 0x1047 */ 0x7480,0x4C4B, + /* Array index: 0x1047 */ 0x7481,0x4C4C, + /* Array index: 0x1047 */ 0x74B5,0x4C66, + /* Array index: 0x1047 */ 0x74B9,0x4C67, + /* Array index: 0x1047 */ 0x74BB,0x4C68, + /* Array index: 0x1047 */ 0x74BF,0x4C69, + /* Array index: 0x1047 */ 0x74C8,0x4C6A, + /* Array index: 0x1047 */ 0x74C9,0x4C6B, + /* Array index: 0x1047 */ 0x74CC,0x4C6C, + /* Array index: 0x1047 */ 0x74D0,0x4C6D, + /* Array index: 0x1047 */ 0x74D3,0x4C6E, + /* Array index: 0x1047 */ 0x74D8,0x4C6F, + /* Array index: 0x1047 */ 0x74DA,0x4C70, + /* Array index: 0x1047 */ 0x74DB,0x4C71, + /* Array index: 0x1047 */ 0x74DE,0x4C72, + /* Array index: 0x1047 */ 0x74DF,0x4C73, + /* Array index: 0x1047 */ 0x74E4,0x4C74, + /* Array index: 0x1047 */ 0x74E8,0x4C75, + /* Array index: 0x1047 */ 0x74EA,0x4C76, + /* Array index: 0x1047 */ 0x74EB,0x4C77, + /* Array index: 0x1047 */ 0x74EF,0x4C78, + /* Array index: 0x1047 */ 0x74F4,0x4C79, + /* Array index: 0x1047 */ 0x74FF,0x4C7D, + /* Array index: 0x1047 */ 0x7506,0x4C7E, + /* Array index: 0x1047 */ 0x7512,0x4D21, + /* Array index: 0x1047 */ 0x7516,0x4D22, + /* Array index: 0x1047 */ 0x7517,0x4D23, + /* Array index: 0x1047 */ 0x7520,0x4D24, + /* Array index: 0x1047 */ 0x7521,0x4D25, + /* Array index: 0x1047 */ 0x7524,0x4D26, + /* Array index: 0x1047 */ 0x7527,0x4D27, + /* Array index: 0x1047 */ 0x7529,0x4D28, + /* Array index: 0x1047 */ 0x752A,0x4D29, + /* Array index: 0x1047 */ 0x752F,0x4D2A, + /* Array index: 0x1047 */ 0x7536,0x4D2B, + /* Array index: 0x1047 */ 0x7539,0x4D2C, + /* Array index: 0x1047 */ 0x7543,0x4D31, + /* Array index: 0x1047 */ 0x7547,0x4D32, + /* Array index: 0x1047 */ 0x7548,0x4D33, + /* Array index: 0x1047 */ 0x754E,0x4D34, + /* Array index: 0x1047 */ 0x7550,0x4D35, + /* Array index: 0x1047 */ 0x7552,0x4D36, + /* Array index: 0x1047 */ 0x7557,0x4D37, + /* Array index: 0x1047 */ 0x755E,0x4D38, + /* Array index: 0x1047 */ 0x755F,0x4D39, + /* Array index: 0x1047 */ 0x7561,0x4D3A, + /* Array index: 0x1047 */ 0x756F,0x4D3B, + /* Array index: 0x1047 */ 0x7571,0x4D3C, + /* Array index: 0x1047 */ 0x7581,0x4D43, + /* Array index: 0x1047 */ 0x7585,0x4D44, + /* Array index: 0x1047 */ 0x7590,0x4D45, + /* Array index: 0x1047 */ 0x7592,0x4D46, + /* Array index: 0x1047 */ 0x7593,0x4D47, + /* Array index: 0x1047 */ 0x7595,0x4D48, + /* Array index: 0x1047 */ 0x7599,0x4D49, + /* Array index: 0x1047 */ 0x759C,0x4D4A, + /* Array index: 0x1047 */ 0x75A2,0x4D4B, + /* Array index: 0x1047 */ 0x75A4,0x4D4C, + /* Array index: 0x1047 */ 0x75B4,0x4D4D, + /* Array index: 0x1047 */ 0x75BA,0x4D4E, + /* Array index: 0x1047 */ 0x75C4,0x4D52, + /* Array index: 0x1047 */ 0x75C6,0x4D53, + /* Array index: 0x1047 */ 0x75CC,0x4D54, + /* Array index: 0x1047 */ 0x75CE,0x4D55, + /* Array index: 0x1047 */ 0x75CF,0x4D56, + /* Array index: 0x1047 */ 0x75D7,0x4D57, + /* Array index: 0x1047 */ 0x75DC,0x4D58, + /* Array index: 0x1047 */ 0x75E4,0x4D5C, + /* Array index: 0x1047 */ 0x75E7,0x4D5D, + /* Array index: 0x1047 */ 0x75EC,0x4D5E, + /* Array index: 0x1047 */ 0x75EE,0x4D5F, + /* Array index: 0x1047 */ 0x75EF,0x4D60, + /* Array index: 0x1047 */ 0x75F1,0x4D61, + /* Array index: 0x1047 */ 0x75F9,0x4D62, + /* Array index: 0x1047 */ 0x760F,0x4D6B, + /* Array index: 0x1047 */ 0x7623,0x4D75, + /* Array index: 0x1047 */ 0x7625,0x4D76, + /* Array index: 0x1047 */ 0x7626,0x4D77, + /* Array index: 0x1047 */ 0x7629,0x4D78, + /* Array index: 0x1047 */ 0x762D,0x4D79, + /* Array index: 0x1047 */ 0x7632,0x4D7A, + /* Array index: 0x1047 */ 0x7633,0x4D7B, + /* Array index: 0x1047 */ 0x7635,0x4D7C, + /* Array index: 0x1047 */ 0x7655,0x4E2B, + /* Array index: 0x1047 */ 0x7659,0x4E2C, + /* Array index: 0x1047 */ 0x765F,0x4E2D, + /* Array index: 0x1047 */ 0x7664,0x4E2E, + /* Array index: 0x1047 */ 0x7665,0x4E2F, + /* Array index: 0x1047 */ 0x7674,0x4E34, + /* Array index: 0x1047 */ 0x7681,0x4E35, + /* Array index: 0x1047 */ 0x7685,0x4E36, + /* Array index: 0x1047 */ 0x768C,0x4E37, + /* Array index: 0x1047 */ 0x768D,0x4E38, + /* Array index: 0x1047 */ 0x7695,0x4E39, + /* Array index: 0x1047 */ 0x76AD,0x4E47, + /* Array index: 0x1047 */ 0x76BD,0x4E48, + /* Array index: 0x1047 */ 0x76C1,0x4E49, + /* Array index: 0x1047 */ 0x76C5,0x4E4A, + /* Array index: 0x1047 */ 0x76C9,0x4E4B, + /* Array index: 0x1047 */ 0x76CB,0x4E4C, + /* Array index: 0x1047 */ 0x76CC,0x4E4D, + /* Array index: 0x1047 */ 0x76CE,0x4E4E, + /* Array index: 0x1047 */ 0x76D4,0x4E4F, + /* Array index: 0x1047 */ 0x76D9,0x4E50, + /* Array index: 0x1047 */ 0x76E0,0x4E51, + /* Array index: 0x1047 */ 0x76E6,0x4E52, + /* Array index: 0x1047 */ 0x76E8,0x4E53, + /* Array index: 0x1047 */ 0x76EC,0x4E54, + /* Array index: 0x1047 */ 0x76F0,0x4E55, + /* Array index: 0x1047 */ 0x76F1,0x4E56, + /* Array index: 0x1047 */ 0x76F6,0x4E57, + /* Array index: 0x1047 */ 0x76F9,0x4E58, + /* Array index: 0x1047 */ 0x76FC,0x4E59, + /* Array index: 0x1047 */ 0x7700,0x4E5A, + /* Array index: 0x1047 */ 0x7706,0x4E5B, + /* Array index: 0x1047 */ 0x770A,0x4E5C, + /* Array index: 0x1047 */ 0x770E,0x4E5D, + /* Array index: 0x1047 */ 0x7712,0x4E5E, + /* Array index: 0x1047 */ 0x7714,0x4E5F, + /* Array index: 0x1047 */ 0x7715,0x4E60, + /* Array index: 0x1047 */ 0x7717,0x4E61, + /* Array index: 0x1047 */ 0x7719,0x4E62, + /* Array index: 0x1047 */ 0x771A,0x4E63, + /* Array index: 0x1047 */ 0x771C,0x4E64, + /* Array index: 0x1047 */ 0x7722,0x4E65, + /* Array index: 0x1047 */ 0x7728,0x4E66, + /* Array index: 0x1047 */ 0x7739,0x4E6D, + /* Array index: 0x1047 */ 0x773D,0x4E6E, + /* Array index: 0x1047 */ 0x773E,0x4E6F, + /* Array index: 0x1047 */ 0x7742,0x4E70, + /* Array index: 0x1047 */ 0x7745,0x4E71, + /* Array index: 0x1047 */ 0x7746,0x4E72, + /* Array index: 0x1047 */ 0x774A,0x4E73, + /* Array index: 0x1047 */ 0x7752,0x4E77, + /* Array index: 0x1047 */ 0x7756,0x4E78, + /* Array index: 0x1047 */ 0x7757,0x4E79, + /* Array index: 0x1047 */ 0x7767,0x4F22, + /* Array index: 0x1047 */ 0x776A,0x4F23, + /* Array index: 0x1047 */ 0x776C,0x4F24, + /* Array index: 0x1047 */ 0x777A,0x4F29, + /* Array index: 0x1047 */ 0x777D,0x4F2A, + /* Array index: 0x1047 */ 0x7780,0x4F2B, + /* Array index: 0x1047 */ 0x7784,0x4F2C, + /* Array index: 0x1047 */ 0x778C,0x4F2D, + /* Array index: 0x1047 */ 0x778D,0x4F2E, + /* Array index: 0x1047 */ 0x779A,0x4F32, + /* Array index: 0x1047 */ 0x779F,0x4F33, + /* Array index: 0x1047 */ 0x77A2,0x4F34, + /* Array index: 0x1047 */ 0x77A7,0x4F35, + /* Array index: 0x1047 */ 0x77AA,0x4F36, + /* Array index: 0x1047 */ 0x77AE,0x4F37, + /* Array index: 0x1047 */ 0x77AF,0x4F38, + /* Array index: 0x1047 */ 0x77B1,0x4F39, + /* Array index: 0x1047 */ 0x77B5,0x4F3A, + /* Array index: 0x1047 */ 0x77BE,0x4F3B, + /* Array index: 0x1047 */ 0x77C3,0x4F3C, + /* Array index: 0x1047 */ 0x77C9,0x4F3D, + /* Array index: 0x1047 */ 0x77D1,0x4F3E, + /* Array index: 0x1047 */ 0x77D2,0x4F3F, + /* Array index: 0x1047 */ 0x77D5,0x4F40, + /* Array index: 0x1047 */ 0x77D9,0x4F41, + /* Array index: 0x1047 */ 0x77E4,0x4F45, + /* Array index: 0x1047 */ 0x77E6,0x4F46, + /* Array index: 0x1047 */ 0x77EA,0x4F47, + /* Array index: 0x1047 */ 0x77EC,0x4F48, + /* Array index: 0x1047 */ 0x77F0,0x4F49, + /* Array index: 0x1047 */ 0x77F1,0x4F4A, + /* Array index: 0x1047 */ 0x77F4,0x4F4B, + /* Array index: 0x1047 */ 0x77F8,0x4F4C, + /* Array index: 0x1047 */ 0x77FB,0x4F4D, + /* Array index: 0x1047 */ 0x7805,0x4F4E, + /* Array index: 0x1047 */ 0x7806,0x4F4F, + /* Array index: 0x1047 */ 0x7809,0x4F50, + /* Array index: 0x1047 */ 0x780D,0x4F51, + /* Array index: 0x1047 */ 0x780E,0x4F52, + /* Array index: 0x1047 */ 0x7811,0x4F53, + /* Array index: 0x1047 */ 0x781D,0x4F54, + /* Array index: 0x1047 */ 0x782D,0x4F58, + /* Array index: 0x1047 */ 0x782E,0x4F59, + /* Array index: 0x1047 */ 0x7830,0x4F5A, + /* Array index: 0x1047 */ 0x7835,0x4F5B, + /* Array index: 0x1047 */ 0x7837,0x4F5C, + /* Array index: 0x1047 */ 0x7843,0x4F5D, + /* Array index: 0x1047 */ 0x7844,0x4F5E, + /* Array index: 0x1047 */ 0x7847,0x4F5F, + /* Array index: 0x1047 */ 0x7848,0x4F60, + /* Array index: 0x1047 */ 0x784C,0x4F61, + /* Array index: 0x1047 */ 0x784E,0x4F62, + /* Array index: 0x1047 */ 0x7852,0x4F63, + /* Array index: 0x1047 */ 0x785C,0x4F64, + /* Array index: 0x1047 */ 0x785E,0x4F65, + /* Array index: 0x1047 */ 0x7868,0x4F6A, + /* Array index: 0x1047 */ 0x786A,0x4F6B, + /* Array index: 0x1047 */ 0x786E,0x4F6C, + /* Array index: 0x1047 */ 0x787A,0x4F6D, + /* Array index: 0x1047 */ 0x787E,0x4F6E, + /* Array index: 0x1047 */ 0x788A,0x4F6F, + /* Array index: 0x1047 */ 0x788F,0x4F70, + /* Array index: 0x1047 */ 0x7894,0x4F71, + /* Array index: 0x1047 */ 0x7898,0x4F72, + /* Array index: 0x1047 */ 0x78A4,0x4F77, + /* Array index: 0x1047 */ 0x78A8,0x4F78, + /* Array index: 0x1047 */ 0x78BB,0x5021, + /* Array index: 0x1047 */ 0x78BD,0x5022, + /* Array index: 0x1047 */ 0x78BF,0x5023, + /* Array index: 0x1047 */ 0x78CC,0x5027, + /* Array index: 0x1047 */ 0x78CE,0x5028, + /* Array index: 0x1047 */ 0x78DB,0x502E, + /* Array index: 0x1047 */ 0x78E4,0x502D, + /* Array index: 0x1047 */ 0x78E6,0x5032, + /* Array index: 0x1047 */ 0x78EA,0x5033, + /* Array index: 0x1047 */ 0x78F2,0x5034, + /* Array index: 0x1047 */ 0x78F3,0x5035, + /* Array index: 0x1047 */ 0x78F6,0x5037, + /* Array index: 0x1047 */ 0x78F7,0x5038, + /* Array index: 0x1047 */ 0x78FA,0x5039, + /* Array index: 0x1047 */ 0x78FB,0x503A, + /* Array index: 0x1047 */ 0x78FF,0x503B, + /* Array index: 0x1047 */ 0x7900,0x5036, + /* Array index: 0x1047 */ 0x7906,0x503C, + /* Array index: 0x1047 */ 0x790C,0x503D, + /* Array index: 0x1047 */ 0x7910,0x503E, + /* Array index: 0x1047 */ 0x791A,0x503F, + /* Array index: 0x1047 */ 0x7925,0x5044, + /* Array index: 0x1047 */ 0x7927,0x5045, + /* Array index: 0x1047 */ 0x7929,0x5046, + /* Array index: 0x1047 */ 0x792D,0x5047, + /* Array index: 0x1047 */ 0x7931,0x5048, + /* Array index: 0x1047 */ 0x7934,0x5049, + /* Array index: 0x1047 */ 0x7935,0x504A, + /* Array index: 0x1047 */ 0x793B,0x504B, + /* Array index: 0x1047 */ 0x793D,0x504C, + /* Array index: 0x1047 */ 0x793F,0x504D, + /* Array index: 0x1047 */ 0x794A,0x5051, + /* Array index: 0x1047 */ 0x794B,0x5052, + /* Array index: 0x1047 */ 0x794F,0x5053, + /* Array index: 0x1047 */ 0x7951,0x5054, + /* Array index: 0x1047 */ 0x7954,0x5055, + /* Array index: 0x1047 */ 0x7958,0x5056, + /* Array index: 0x1047 */ 0x795B,0x5057, + /* Array index: 0x1047 */ 0x795C,0x5058, + /* Array index: 0x1047 */ 0x7967,0x5059, + /* Array index: 0x1047 */ 0x7969,0x505A, + /* Array index: 0x1047 */ 0x796B,0x505B, + /* Array index: 0x1047 */ 0x7972,0x505C, + /* Array index: 0x1047 */ 0x7979,0x505D, + /* Array index: 0x1047 */ 0x797B,0x505E, + /* Array index: 0x1047 */ 0x797C,0x505F, + /* Array index: 0x1047 */ 0x797E,0x5060, + /* Array index: 0x1047 */ 0x798B,0x5061, + /* Array index: 0x1047 */ 0x798C,0x5062, + /* Array index: 0x1047 */ 0x79A1,0x506B, + /* Array index: 0x1047 */ 0x79A8,0x506C, + /* Array index: 0x1047 */ 0x79A9,0x506D, + /* Array index: 0x1047 */ 0x79AB,0x506E, + /* Array index: 0x1047 */ 0x79AF,0x506F, + /* Array index: 0x1047 */ 0x79B1,0x5070, + /* Array index: 0x1047 */ 0x79B4,0x5071, + /* Array index: 0x1047 */ 0x79B8,0x5072, + /* Array index: 0x1047 */ 0x79BB,0x5073, + /* Array index: 0x1047 */ 0x79C2,0x5074, + /* Array index: 0x1047 */ 0x79C4,0x5075, + /* Array index: 0x1047 */ 0x79C7,0x5076, + /* Array index: 0x1047 */ 0x79C8,0x5077, + /* Array index: 0x1047 */ 0x79CA,0x5078, + /* Array index: 0x1047 */ 0x79CF,0x5079, + /* Array index: 0x1047 */ 0x79D4,0x507A, + /* Array index: 0x1047 */ 0x79D6,0x507B, + /* Array index: 0x1047 */ 0x79DA,0x507C, + /* Array index: 0x1047 */ 0x79DD,0x507D, + /* Array index: 0x1047 */ 0x79DE,0x507E, + /* Array index: 0x1047 */ 0x79E0,0x5121, + /* Array index: 0x1047 */ 0x79E2,0x5122, + /* Array index: 0x1047 */ 0x79E5,0x5123, + /* Array index: 0x1047 */ 0x79EA,0x5124, + /* Array index: 0x1047 */ 0x79EB,0x5125, + /* Array index: 0x1047 */ 0x79ED,0x5126, + /* Array index: 0x1047 */ 0x79F1,0x5127, + /* Array index: 0x1047 */ 0x79F8,0x5128, + /* Array index: 0x1047 */ 0x79FC,0x5129, + /* Array index: 0x1047 */ 0x7A02,0x512A, + /* Array index: 0x1047 */ 0x7A03,0x512B, + /* Array index: 0x1047 */ 0x7A07,0x512C, + /* Array index: 0x1047 */ 0x7A09,0x512D, + /* Array index: 0x1047 */ 0x7A0A,0x512E, + /* Array index: 0x1047 */ 0x7A0C,0x512F, + /* Array index: 0x1047 */ 0x7A11,0x5130, + /* Array index: 0x1047 */ 0x7A15,0x5131, + /* Array index: 0x1047 */ 0x7A1B,0x5132, + /* Array index: 0x1047 */ 0x7A1E,0x5133, + /* Array index: 0x1047 */ 0x7A21,0x5134, + /* Array index: 0x1047 */ 0x7A27,0x5135, + /* Array index: 0x1047 */ 0x7A2B,0x5136, + /* Array index: 0x1047 */ 0x7A2D,0x5137, + /* Array index: 0x1047 */ 0x7A2F,0x5138, + /* Array index: 0x1047 */ 0x7A30,0x5139, + /* Array index: 0x1047 */ 0x7A4C,0x5143, + /* Array index: 0x1047 */ 0x7A55,0x5144, + /* Array index: 0x1047 */ 0x7A56,0x5145, + /* Array index: 0x1047 */ 0x7A59,0x5146, + /* Array index: 0x1047 */ 0x7A65,0x514B, + /* Array index: 0x1047 */ 0x7A67,0x514C, + /* Array index: 0x1047 */ 0x7A6A,0x514D, + /* Array index: 0x1047 */ 0x7A6D,0x514E, + /* Array index: 0x1047 */ 0x7A75,0x514F, + /* Array index: 0x1047 */ 0x7A78,0x5150, + /* Array index: 0x1047 */ 0x7A7E,0x5151, + /* Array index: 0x1047 */ 0x7A80,0x5152, + /* Array index: 0x1047 */ 0x7A82,0x5153, + /* Array index: 0x1047 */ 0x7A85,0x5154, + /* Array index: 0x1047 */ 0x7A86,0x5155, + /* Array index: 0x1047 */ 0x7A8A,0x5156, + /* Array index: 0x1047 */ 0x7A8B,0x5157, + /* Array index: 0x1047 */ 0x7A90,0x5158, + /* Array index: 0x1047 */ 0x7A91,0x5159, + /* Array index: 0x1047 */ 0x7A94,0x515A, + /* Array index: 0x1047 */ 0x7A9E,0x515B, + /* Array index: 0x1047 */ 0x7AA0,0x515C, + /* Array index: 0x1047 */ 0x7AA3,0x515D, + /* Array index: 0x1047 */ 0x7AAC,0x515E, + /* Array index: 0x1047 */ 0x7AB3,0x515F, + /* Array index: 0x1047 */ 0x7AB5,0x5160, + /* Array index: 0x1047 */ 0x7AB9,0x5161, + /* Array index: 0x1047 */ 0x7ABB,0x5162, + /* Array index: 0x1047 */ 0x7ABC,0x5163, + /* Array index: 0x1047 */ 0x7AC6,0x5164, + /* Array index: 0x1047 */ 0x7AC9,0x5165, + /* Array index: 0x1047 */ 0x7ACC,0x5166, + /* Array index: 0x1047 */ 0x7ACE,0x5167, + /* Array index: 0x1047 */ 0x7AD1,0x5168, + /* Array index: 0x1047 */ 0x7ADB,0x5169, + /* Array index: 0x1047 */ 0x7AF1,0x516E, + /* Array index: 0x1047 */ 0x7AF4,0x516F, + /* Array index: 0x1047 */ 0x7AFB,0x5170, + /* Array index: 0x1047 */ 0x7AFD,0x5171, + /* Array index: 0x1047 */ 0x7AFE,0x5172, + /* Array index: 0x1047 */ 0x7B07,0x5173, + /* Array index: 0x1047 */ 0x7B14,0x5174, + /* Array index: 0x1047 */ 0x7B1F,0x5175, + /* Array index: 0x1047 */ 0x7B23,0x5176, + /* Array index: 0x1047 */ 0x7B34,0x5222, + /* Array index: 0x1047 */ 0x7B47,0x5227, + /* Array index: 0x1047 */ 0x7B4E,0x5228, + /* Array index: 0x1047 */ 0x7B55,0x5229, + /* Array index: 0x1047 */ 0x7B60,0x522A, + /* Array index: 0x1047 */ 0x7B64,0x522B, + /* Array index: 0x1047 */ 0x7B66,0x522C, + /* Array index: 0x1047 */ 0x7B69,0x522D, + /* Array index: 0x1047 */ 0x7B6A,0x522E, + /* Array index: 0x1047 */ 0x7B6D,0x522F, + /* Array index: 0x1047 */ 0x7B6F,0x5230, + /* Array index: 0x1047 */ 0x7B72,0x5231, + /* Array index: 0x1047 */ 0x7B73,0x5232, + /* Array index: 0x1047 */ 0x7B77,0x5233, + /* Array index: 0x1047 */ 0x7B84,0x5234, + /* Array index: 0x1047 */ 0x7B89,0x5235, + /* Array index: 0x1047 */ 0x7B8E,0x5236, + /* Array index: 0x1047 */ 0x7B90,0x5237, + /* Array index: 0x1047 */ 0x7B91,0x5238, + /* Array index: 0x1047 */ 0x7B96,0x5239, + /* Array index: 0x1047 */ 0x7B9B,0x523A, + /* Array index: 0x1047 */ 0x7B9E,0x523B, + /* Array index: 0x1047 */ 0x7BA0,0x523C, + /* Array index: 0x1047 */ 0x7BA5,0x523D, + /* Array index: 0x1047 */ 0x7BAC,0x523E, + /* Array index: 0x1047 */ 0x7BAF,0x523F, + /* Array index: 0x1047 */ 0x7BB0,0x5240, + /* Array index: 0x1047 */ 0x7BB2,0x5241, + /* Array index: 0x1047 */ 0x7BB5,0x5242, + /* Array index: 0x1047 */ 0x7BB6,0x5243, + /* Array index: 0x1047 */ 0x7BC2,0x5248, + /* Array index: 0x1047 */ 0x7BC5,0x5249, + /* Array index: 0x1047 */ 0x7BC8,0x524A, + /* Array index: 0x1047 */ 0x7BCA,0x524B, + /* Array index: 0x1047 */ 0x7BD4,0x524C, + /* Array index: 0x1047 */ 0x7BE8,0x5252, + /* Array index: 0x1047 */ 0x7BEA,0x5253, + /* Array index: 0x1047 */ 0x7BF2,0x5254, + /* Array index: 0x1047 */ 0x7C09,0x5261, + /* Array index: 0x1047 */ 0x7C19,0x5266, + /* Array index: 0x1047 */ 0x7C1B,0x5267, + /* Array index: 0x1047 */ 0x7C20,0x5268, + /* Array index: 0x1047 */ 0x7C25,0x5269, + /* Array index: 0x1047 */ 0x7C26,0x526A, + /* Array index: 0x1047 */ 0x7C28,0x526B, + /* Array index: 0x1047 */ 0x7C2C,0x526C, + /* Array index: 0x1047 */ 0x7C31,0x526D, + /* Array index: 0x1047 */ 0x7C33,0x526E, + /* Array index: 0x1047 */ 0x7C34,0x526F, + /* Array index: 0x1047 */ 0x7C36,0x5270, + /* Array index: 0x1047 */ 0x7C39,0x5271, + /* Array index: 0x1047 */ 0x7C3A,0x5272, + /* Array index: 0x1047 */ 0x7C46,0x5273, + /* Array index: 0x1047 */ 0x7C4A,0x5274, + /* Array index: 0x1047 */ 0x7C61,0x5321, + /* Array index: 0x1047 */ 0x7C63,0x5322, + /* Array index: 0x1047 */ 0x7C67,0x5323, + /* Array index: 0x1047 */ 0x7C69,0x5324, + /* Array index: 0x1047 */ 0x7C6D,0x5325, + /* Array index: 0x1047 */ 0x7C6E,0x5326, + /* Array index: 0x1047 */ 0x7C70,0x5327, + /* Array index: 0x1047 */ 0x7C72,0x5328, + /* Array index: 0x1047 */ 0x7C79,0x5329, + /* Array index: 0x1047 */ 0x7C7C,0x532A, + /* Array index: 0x1047 */ 0x7C7D,0x532B, + /* Array index: 0x1047 */ 0x7C86,0x532C, + /* Array index: 0x1047 */ 0x7C87,0x532D, + /* Array index: 0x1047 */ 0x7C8F,0x532E, + /* Array index: 0x1047 */ 0x7C94,0x532F, + /* Array index: 0x1047 */ 0x7C9E,0x5330, + /* Array index: 0x1047 */ 0x7CA0,0x5331, + /* Array index: 0x1047 */ 0x7CA6,0x5332, + /* Array index: 0x1047 */ 0x7CB0,0x5333, + /* Array index: 0x1047 */ 0x7CBF,0x5339, + /* Array index: 0x1047 */ 0x7CC4,0x533A, + /* Array index: 0x1047 */ 0x7CCD,0x533E, + /* Array index: 0x1047 */ 0x7CCF,0x533F, + /* Array index: 0x1047 */ 0x7CDD,0x5346, + /* Array index: 0x1047 */ 0x7CE6,0x5347, + /* Array index: 0x1047 */ 0x7CE9,0x5348, + /* Array index: 0x1047 */ 0x7CEB,0x5349, + /* Array index: 0x1047 */ 0x7CF5,0x534A, + /* Array index: 0x1047 */ 0x7D03,0x534B, + /* Array index: 0x1047 */ 0x7D16,0x5353, + /* Array index: 0x1047 */ 0x7D1D,0x5354, + /* Array index: 0x1047 */ 0x7D1E,0x5355, + /* Array index: 0x1047 */ 0x7D23,0x5356, + /* Array index: 0x1047 */ 0x7D26,0x5357, + /* Array index: 0x1047 */ 0x7D2A,0x5358, + /* Array index: 0x1047 */ 0x7D2D,0x5359, + /* Array index: 0x1047 */ 0x7D31,0x535A, + /* Array index: 0x1047 */ 0x7D47,0x5360, + /* Array index: 0x1047 */ 0x7D48,0x5361, + /* Array index: 0x1047 */ 0x7D4D,0x5362, + /* Array index: 0x1047 */ 0x7D51,0x5363, + /* Array index: 0x1047 */ 0x7D53,0x5364, + /* Array index: 0x1047 */ 0x7D57,0x5365, + /* Array index: 0x1047 */ 0x7D65,0x536A, + /* Array index: 0x1047 */ 0x7D67,0x536B, + /* Array index: 0x1047 */ 0x7D6A,0x536C, + /* Array index: 0x1047 */ 0x7D70,0x536D, + /* Array index: 0x1047 */ 0x7D78,0x536E, + /* Array index: 0x1047 */ 0x7D7A,0x536F, + /* Array index: 0x1047 */ 0x7D7B,0x5370, + /* Array index: 0x1047 */ 0x7D91,0x537B, + /* Array index: 0x1047 */ 0x7D96,0x537C, + /* Array index: 0x1047 */ 0x7D97,0x537D, + /* Array index: 0x1047 */ 0x7D9D,0x537E, + /* Array index: 0x1047 */ 0x7D9E,0x5421, + /* Array index: 0x1047 */ 0x7DA6,0x5422, + /* Array index: 0x1047 */ 0x7DA7,0x5423, + /* Array index: 0x1047 */ 0x7DAA,0x5424, + /* Array index: 0x1047 */ 0x7DB3,0x5425, + /* Array index: 0x1047 */ 0x7DB6,0x5426, + /* Array index: 0x1047 */ 0x7DB7,0x5427, + /* Array index: 0x1047 */ 0x7DB9,0x5428, + /* Array index: 0x1047 */ 0x7DD7,0x5431, + /* Array index: 0x1047 */ 0x7DD9,0x5432, + /* Array index: 0x1047 */ 0x7DE2,0x5434, + /* Array index: 0x1047 */ 0x7DE5,0x5435, + /* Array index: 0x1047 */ 0x7DE6,0x5436, + /* Array index: 0x1047 */ 0x7DEA,0x5437, + /* Array index: 0x1047 */ 0x7DEB,0x5438, + /* Array index: 0x1047 */ 0x7DED,0x5439, + /* Array index: 0x1047 */ 0x7DF1,0x543A, + /* Array index: 0x1047 */ 0x7DF5,0x543B, + /* Array index: 0x1047 */ 0x7DF6,0x543C, + /* Array index: 0x1047 */ 0x7DF9,0x543D, + /* Array index: 0x1047 */ 0x7DFA,0x543E, + /* Array index: 0x1047 */ 0x7E00,0x5433, + /* Array index: 0x1047 */ 0x7E08,0x543F, + /* Array index: 0x1047 */ 0x7E10,0x5440, + /* Array index: 0x1047 */ 0x7E11,0x5441, + /* Array index: 0x1047 */ 0x7E15,0x5442, + /* Array index: 0x1047 */ 0x7E17,0x5443, + /* Array index: 0x1047 */ 0x7E1C,0x5444, + /* Array index: 0x1047 */ 0x7E1D,0x5445, + /* Array index: 0x1047 */ 0x7E20,0x5446, + /* Array index: 0x1047 */ 0x7E27,0x5447, + /* Array index: 0x1047 */ 0x7E28,0x5448, + /* Array index: 0x1047 */ 0x7E2C,0x5449, + /* Array index: 0x1047 */ 0x7E2D,0x544A, + /* Array index: 0x1047 */ 0x7E2F,0x544B, + /* Array index: 0x1047 */ 0x7E33,0x544C, + /* Array index: 0x1047 */ 0x7E36,0x544D, + /* Array index: 0x1047 */ 0x7E3F,0x544E, + /* Array index: 0x1047 */ 0x7E44,0x544F, + /* Array index: 0x1047 */ 0x7E45,0x5450, + /* Array index: 0x1047 */ 0x7E47,0x5451, + /* Array index: 0x1047 */ 0x7E4E,0x5452, + /* Array index: 0x1047 */ 0x7E50,0x5453, + /* Array index: 0x1047 */ 0x7E52,0x5454, + /* Array index: 0x1047 */ 0x7E58,0x5455, + /* Array index: 0x1047 */ 0x7E5F,0x5456, + /* Array index: 0x1047 */ 0x7E61,0x5457, + /* Array index: 0x1047 */ 0x7E62,0x5458, + /* Array index: 0x1047 */ 0x7E65,0x5459, + /* Array index: 0x1047 */ 0x7E6B,0x545A, + /* Array index: 0x1047 */ 0x7E6E,0x545B, + /* Array index: 0x1047 */ 0x7E6F,0x545C, + /* Array index: 0x1047 */ 0x7E73,0x545D, + /* Array index: 0x1047 */ 0x7E78,0x545E, + /* Array index: 0x1047 */ 0x7E7E,0x545F, + /* Array index: 0x1047 */ 0x7E81,0x5460, + /* Array index: 0x1047 */ 0x7E86,0x5461, + /* Array index: 0x1047 */ 0x7E87,0x5462, + /* Array index: 0x1047 */ 0x7E8A,0x5463, + /* Array index: 0x1047 */ 0x7E8D,0x5464, + /* Array index: 0x1047 */ 0x7E91,0x5465, + /* Array index: 0x1047 */ 0x7E95,0x5466, + /* Array index: 0x1047 */ 0x7E98,0x5467, + /* Array index: 0x1047 */ 0x7E9A,0x5468, + /* Array index: 0x1047 */ 0x7E9D,0x5469, + /* Array index: 0x1047 */ 0x7E9E,0x546A, + /* Array index: 0x1047 */ 0x7F43,0x5470, + /* Array index: 0x1047 */ 0x7F44,0x5471, + /* Array index: 0x1047 */ 0x7F47,0x5472, + /* Array index: 0x1047 */ 0x7F4F,0x5473, + /* Array index: 0x1047 */ 0x7F52,0x5474, + /* Array index: 0x1047 */ 0x7F53,0x5475, + /* Array index: 0x1047 */ 0x7F6D,0x547E, + /* Array index: 0x1047 */ 0x7F71,0x5521, + /* Array index: 0x1047 */ 0x7F8B,0x5526, + /* Array index: 0x1047 */ 0x7F96,0x552B, + /* Array index: 0x1047 */ 0x7F97,0x552C, + /* Array index: 0x1047 */ 0x7F9C,0x552D, + /* Array index: 0x1047 */ 0x7FA1,0x552E, + /* Array index: 0x1047 */ 0x7FA2,0x552F, + /* Array index: 0x1047 */ 0x7FA6,0x5530, + /* Array index: 0x1047 */ 0x7FAA,0x5531, + /* Array index: 0x1047 */ 0x7FAD,0x5532, + /* Array index: 0x1047 */ 0x7FB4,0x5533, + /* Array index: 0x1047 */ 0x7FBC,0x5534, + /* Array index: 0x1047 */ 0x7FBF,0x5535, + /* Array index: 0x1047 */ 0x7FC0,0x5536, + /* Array index: 0x1047 */ 0x7FC3,0x5537, + /* Array index: 0x1047 */ 0x7FC8,0x5538, + /* Array index: 0x1047 */ 0x7FCE,0x5539, + /* Array index: 0x1047 */ 0x7FCF,0x553A, + /* Array index: 0x1047 */ 0x7FDB,0x553B, + /* Array index: 0x1047 */ 0x7FDF,0x553C, + /* Array index: 0x1047 */ 0x7FE3,0x553D, + /* Array index: 0x1047 */ 0x7FE5,0x553E, + /* Array index: 0x1047 */ 0x7FE8,0x553F, + /* Array index: 0x1047 */ 0x7FEC,0x5540, + /* Array index: 0x1047 */ 0x7FEE,0x5541, + /* Array index: 0x1047 */ 0x7FEF,0x5542, + /* Array index: 0x1047 */ 0x7FF2,0x5543, + /* Array index: 0x1047 */ 0x7FFA,0x5544, + /* Array index: 0x1047 */ 0x8007,0x5548, + /* Array index: 0x1047 */ 0x8008,0x5549, + /* Array index: 0x1047 */ 0x800A,0x554A, + /* Array index: 0x1047 */ 0x8024,0x5556, + /* Array index: 0x1047 */ 0x8026,0x5557, + /* Array index: 0x1047 */ 0x802C,0x5558, + /* Array index: 0x1047 */ 0x802E,0x5559, + /* Array index: 0x1047 */ 0x8030,0x555A, + /* Array index: 0x1047 */ 0x8034,0x555B, + /* Array index: 0x1047 */ 0x8035,0x555C, + /* Array index: 0x1047 */ 0x8037,0x555D, + /* Array index: 0x1047 */ 0x8039,0x555E, + /* Array index: 0x1047 */ 0x803A,0x555F, + /* Array index: 0x1047 */ 0x803C,0x5560, + /* Array index: 0x1047 */ 0x803E,0x5561, + /* Array index: 0x1047 */ 0x8040,0x5562, + /* Array index: 0x1047 */ 0x8044,0x5563, + /* Array index: 0x1047 */ 0x8060,0x5564, + /* Array index: 0x1047 */ 0x8064,0x5565, + /* Array index: 0x1047 */ 0x8066,0x5566, + /* Array index: 0x1047 */ 0x806D,0x5567, + /* Array index: 0x1047 */ 0x8071,0x5568, + /* Array index: 0x1047 */ 0x8075,0x5569, + /* Array index: 0x1047 */ 0x8081,0x556A, + /* Array index: 0x1047 */ 0x8088,0x556B, + /* Array index: 0x1047 */ 0x808E,0x556C, + /* Array index: 0x1047 */ 0x809C,0x556D, + /* Array index: 0x1047 */ 0x809E,0x556E, + /* Array index: 0x1047 */ 0x80A6,0x556F, + /* Array index: 0x1047 */ 0x80A7,0x5570, + /* Array index: 0x1047 */ 0x80AB,0x5571, + /* Array index: 0x1047 */ 0x80B8,0x5572, + /* Array index: 0x1047 */ 0x80B9,0x5573, + /* Array index: 0x1047 */ 0x80C8,0x5574, + /* Array index: 0x1047 */ 0x80CD,0x5575, + /* Array index: 0x1047 */ 0x80CF,0x5576, + /* Array index: 0x1047 */ 0x80D2,0x5577, + /* Array index: 0x1047 */ 0x80E0,0x557C, + /* Array index: 0x1047 */ 0x80ED,0x557D, + /* Array index: 0x1047 */ 0x80EE,0x557E, + /* Array index: 0x1047 */ 0x80F0,0x5621, + /* Array index: 0x1047 */ 0x80F2,0x5622, + /* Array index: 0x1047 */ 0x80F3,0x5623, + /* Array index: 0x1047 */ 0x80F6,0x5624, + /* Array index: 0x1047 */ 0x80F9,0x5625, + /* Array index: 0x1047 */ 0x80FA,0x5626, + /* Array index: 0x1047 */ 0x80FE,0x5627, + /* Array index: 0x1047 */ 0x8103,0x5628, + /* Array index: 0x1047 */ 0x810B,0x5629, + /* Array index: 0x1047 */ 0x811C,0x562D, + /* Array index: 0x1047 */ 0x811E,0x562E, + /* Array index: 0x1047 */ 0x8120,0x562F, + /* Array index: 0x1047 */ 0x8124,0x5630, + /* Array index: 0x1047 */ 0x8127,0x5631, + /* Array index: 0x1047 */ 0x812C,0x5632, + /* Array index: 0x1047 */ 0x8130,0x5633, + /* Array index: 0x1047 */ 0x8135,0x5634, + /* Array index: 0x1047 */ 0x813A,0x5635, + /* Array index: 0x1047 */ 0x813C,0x5636, + /* Array index: 0x1047 */ 0x8145,0x5637, + /* Array index: 0x1047 */ 0x8147,0x5638, + /* Array index: 0x1047 */ 0x814A,0x5639, + /* Array index: 0x1047 */ 0x814C,0x563A, + /* Array index: 0x1047 */ 0x8152,0x563B, + /* Array index: 0x1047 */ 0x8157,0x563C, + /* Array index: 0x1047 */ 0x8160,0x563D, + /* Array index: 0x1047 */ 0x8161,0x563E, + /* Array index: 0x1047 */ 0x816D,0x5642, + /* Array index: 0x1047 */ 0x816F,0x5643, + /* Array index: 0x1047 */ 0x8177,0x5644, + /* Array index: 0x1047 */ 0x8181,0x5645, + /* Array index: 0x1047 */ 0x818B,0x564A, + /* Array index: 0x1047 */ 0x818E,0x564B, + /* Array index: 0x1047 */ 0x8190,0x5646, + /* Array index: 0x1047 */ 0x8196,0x564C, + /* Array index: 0x1047 */ 0x8198,0x564D, + /* Array index: 0x1047 */ 0x819B,0x564E, + /* Array index: 0x1047 */ 0x819E,0x564F, + /* Array index: 0x1047 */ 0x81A2,0x5650, + /* Array index: 0x1047 */ 0x81AE,0x5651, + /* Array index: 0x1047 */ 0x81B2,0x5652, + /* Array index: 0x1047 */ 0x81B4,0x5653, + /* Array index: 0x1047 */ 0x81BB,0x5654, + /* Array index: 0x1047 */ 0x81C3,0x5656, + /* Array index: 0x1047 */ 0x81C5,0x5657, + /* Array index: 0x1047 */ 0x81CA,0x5658, + /* Array index: 0x1047 */ 0x81CB,0x5655, + /* Array index: 0x1047 */ 0x81CE,0x5659, + /* Array index: 0x1047 */ 0x81CF,0x565A, + /* Array index: 0x1047 */ 0x81D5,0x565B, + /* Array index: 0x1047 */ 0x81D7,0x565C, + /* Array index: 0x1047 */ 0x81DB,0x565D, + /* Array index: 0x1047 */ 0x81DD,0x565E, + /* Array index: 0x1047 */ 0x81DE,0x565F, + /* Array index: 0x1047 */ 0x81E1,0x5660, + /* Array index: 0x1047 */ 0x81E4,0x5661, + /* Array index: 0x1047 */ 0x81EB,0x5662, + /* Array index: 0x1047 */ 0x81EC,0x5663, + /* Array index: 0x1047 */ 0x81FD,0x566B, + /* Array index: 0x1047 */ 0x81FF,0x566C, + /* Array index: 0x1047 */ 0x8200,0x566D, + /* Array index: 0x1047 */ 0x8203,0x566E, + /* Array index: 0x1047 */ 0x820F,0x566F, + /* Array index: 0x1047 */ 0x8213,0x5670, + /* Array index: 0x1047 */ 0x8214,0x5671, + /* Array index: 0x1047 */ 0x8219,0x5672, + /* Array index: 0x1047 */ 0x821A,0x5673, + /* Array index: 0x1047 */ 0x821D,0x5674, + /* Array index: 0x1047 */ 0x8221,0x5675, + /* Array index: 0x1047 */ 0x8222,0x5676, + /* Array index: 0x1047 */ 0x8228,0x5677, + /* Array index: 0x1047 */ 0x8232,0x5678, + /* Array index: 0x1047 */ 0x8234,0x5679, + /* Array index: 0x1047 */ 0x823A,0x567A, + /* Array index: 0x1047 */ 0x824B,0x5721, + /* Array index: 0x1047 */ 0x824E,0x5722, + /* Array index: 0x1047 */ 0x824F,0x5723, + /* Array index: 0x1047 */ 0x8251,0x5724, + /* Array index: 0x1047 */ 0x8256,0x5725, + /* Array index: 0x1047 */ 0x825C,0x5726, + /* Array index: 0x1047 */ 0x8260,0x5727, + /* Array index: 0x1047 */ 0x8263,0x5728, + /* Array index: 0x1047 */ 0x8267,0x5729, + /* Array index: 0x1047 */ 0x826D,0x572A, + /* Array index: 0x1047 */ 0x8274,0x572B, + /* Array index: 0x1047 */ 0x827B,0x572C, + /* Array index: 0x1047 */ 0x8287,0x5733, + /* Array index: 0x1047 */ 0x8289,0x5734, + /* Array index: 0x1047 */ 0x828A,0x5735, + /* Array index: 0x1047 */ 0x828E,0x5736, + /* Array index: 0x1047 */ 0x8291,0x5737, + /* Array index: 0x1047 */ 0x8294,0x5738, + /* Array index: 0x1047 */ 0x8296,0x5739, + /* Array index: 0x1047 */ 0x8298,0x573A, + /* Array index: 0x1047 */ 0x829A,0x573B, + /* Array index: 0x1047 */ 0x829B,0x573C, + /* Array index: 0x1047 */ 0x82AE,0x5745, + /* Array index: 0x1047 */ 0x82B0,0x5746, + /* Array index: 0x1047 */ 0x82B2,0x5747, + /* Array index: 0x1047 */ 0x82B4,0x5748, + /* Array index: 0x1047 */ 0x82B7,0x5749, + /* Array index: 0x1047 */ 0x82BA,0x574A, + /* Array index: 0x1047 */ 0x82BC,0x574B, + /* Array index: 0x1047 */ 0x82BE,0x574C, + /* Array index: 0x1047 */ 0x82BF,0x574D, + /* Array index: 0x1047 */ 0x82C6,0x574E, + /* Array index: 0x1047 */ 0x82D0,0x574F, + /* Array index: 0x1047 */ 0x82D5,0x5750, + /* Array index: 0x1047 */ 0x82DA,0x5751, + /* Array index: 0x1047 */ 0x82E0,0x5752, + /* Array index: 0x1047 */ 0x82E2,0x5753, + /* Array index: 0x1047 */ 0x82E4,0x5754, + /* Array index: 0x1047 */ 0x82E8,0x5755, + /* Array index: 0x1047 */ 0x82EA,0x5756, + /* Array index: 0x1047 */ 0x82ED,0x5757, + /* Array index: 0x1047 */ 0x82EF,0x5758, + /* Array index: 0x1047 */ 0x82F6,0x5759, + /* Array index: 0x1047 */ 0x82F7,0x575A, + /* Array index: 0x1047 */ 0x8333,0x576E, + /* Array index: 0x1047 */ 0x8337,0x576F, + /* Array index: 0x1047 */ 0x833A,0x5770, + /* Array index: 0x1047 */ 0x833C,0x5771, + /* Array index: 0x1047 */ 0x833D,0x5772, + /* Array index: 0x1047 */ 0x8347,0x5776, + /* Array index: 0x1047 */ 0x834D,0x5777, + /* Array index: 0x1047 */ 0x834E,0x5778, + /* Array index: 0x1047 */ 0x8370,0x577D, + /* Array index: 0x1047 */ 0x8378,0x577E, + /* Array index: 0x1047 */ 0x837D,0x5821, + /* Array index: 0x1047 */ 0x837F,0x5822, + /* Array index: 0x1047 */ 0x8380,0x5823, + /* Array index: 0x1047 */ 0x8382,0x5824, + /* Array index: 0x1047 */ 0x8384,0x5825, + /* Array index: 0x1047 */ 0x8386,0x5826, + /* Array index: 0x1047 */ 0x838D,0x5827, + /* Array index: 0x1047 */ 0x8392,0x5828, + /* Array index: 0x1047 */ 0x8394,0x5829, + /* Array index: 0x1047 */ 0x8395,0x582A, + /* Array index: 0x1047 */ 0x83A6,0x5830, + /* Array index: 0x1047 */ 0x83A7,0x5831, + /* Array index: 0x1047 */ 0x83A9,0x5832, + /* Array index: 0x1047 */ 0x83AC,0x5833, + /* Array index: 0x1047 */ 0x83AD,0x584C, + /* Array index: 0x1047 */ 0x83C7,0x5837, + /* Array index: 0x1047 */ 0x83C9,0x5838, + /* Array index: 0x1047 */ 0x83D4,0x583C, + /* Array index: 0x1047 */ 0x83DD,0x583D, + /* Array index: 0x1047 */ 0x83E8,0x583F, + /* Array index: 0x1047 */ 0x83EA,0x5840, + /* Array index: 0x1047 */ 0x83F6,0x5841, + /* Array index: 0x1047 */ 0x83F8,0x5842, + /* Array index: 0x1047 */ 0x83F9,0x5843, + /* Array index: 0x1047 */ 0x83FC,0x5844, + /* Array index: 0x1047 */ 0x8401,0x5845, + /* Array index: 0x1047 */ 0x8406,0x5846, + /* Array index: 0x1047 */ 0x840A,0x5847, + /* Array index: 0x1047 */ 0x840F,0x5848, + /* Array index: 0x1047 */ 0x8411,0x5849, + /* Array index: 0x1047 */ 0x8415,0x584A, + /* Array index: 0x1047 */ 0x8419,0x584B, + /* Array index: 0x1047 */ 0x842F,0x584D, + /* Array index: 0x1047 */ 0x8439,0x584E, + /* Array index: 0x1047 */ 0x8445,0x584F, + /* Array index: 0x1047 */ 0x8447,0x5850, + /* Array index: 0x1047 */ 0x8448,0x5851, + /* Array index: 0x1047 */ 0x844A,0x5852, + /* Array index: 0x1047 */ 0x844D,0x5853, + /* Array index: 0x1047 */ 0x844F,0x5854, + /* Array index: 0x1047 */ 0x8451,0x5855, + /* Array index: 0x1047 */ 0x8452,0x5856, + /* Array index: 0x1047 */ 0x8460,0x585C, + /* Array index: 0x1047 */ 0x8464,0x585D, + /* Array index: 0x1047 */ 0x8465,0x585E, + /* Array index: 0x1047 */ 0x8467,0x585F, + /* Array index: 0x1047 */ 0x846A,0x5860, + /* Array index: 0x1047 */ 0x8470,0x5861, + /* Array index: 0x1047 */ 0x8473,0x5862, + /* Array index: 0x1047 */ 0x8474,0x5863, + /* Array index: 0x1047 */ 0x8476,0x5864, + /* Array index: 0x1047 */ 0x8478,0x5865, + /* Array index: 0x1047 */ 0x847C,0x5866, + /* Array index: 0x1047 */ 0x847D,0x5867, + /* Array index: 0x1047 */ 0x8481,0x5868, + /* Array index: 0x1047 */ 0x8485,0x5869, + /* Array index: 0x1047 */ 0x8492,0x586A, + /* Array index: 0x1047 */ 0x8493,0x586B, + /* Array index: 0x1047 */ 0x8495,0x586C, + /* Array index: 0x1047 */ 0x849E,0x586D, + /* Array index: 0x1047 */ 0x84AF,0x5872, + /* Array index: 0x1047 */ 0x84B1,0x5873, + /* Array index: 0x1047 */ 0x84B4,0x5874, + /* Array index: 0x1047 */ 0x84BA,0x5875, + /* Array index: 0x1047 */ 0x84BD,0x5876, + /* Array index: 0x1047 */ 0x84BE,0x5877, + /* Array index: 0x1047 */ 0x84C0,0x5878, + /* Array index: 0x1047 */ 0x84C2,0x5879, + /* Array index: 0x1047 */ 0x84C7,0x587A, + /* Array index: 0x1047 */ 0x84C8,0x587B, + /* Array index: 0x1047 */ 0x84CC,0x587C, + /* Array index: 0x1047 */ 0x84CF,0x587D, + /* Array index: 0x1047 */ 0x84D3,0x587E, + /* Array index: 0x1047 */ 0x84DC,0x5921, + /* Array index: 0x1047 */ 0x84E7,0x5922, + /* Array index: 0x1047 */ 0x84EA,0x5923, + /* Array index: 0x1047 */ 0x84F7,0x5928, + /* Array index: 0x1047 */ 0x84FA,0x592A, + /* Array index: 0x1047 */ 0x84FB,0x592B, + /* Array index: 0x1047 */ 0x84FD,0x592C, + /* Array index: 0x1047 */ 0x8502,0x592D, + /* Array index: 0x1047 */ 0x8503,0x592E, + /* Array index: 0x1047 */ 0x8507,0x592F, + /* Array index: 0x1047 */ 0x850C,0x5930, + /* Array index: 0x1047 */ 0x850E,0x5931, + /* Array index: 0x1047 */ 0x8510,0x5932, + /* Array index: 0x1047 */ 0x851C,0x5933, + /* Array index: 0x1047 */ 0x851E,0x5934, + /* Array index: 0x1047 */ 0x852F,0x593C, + /* Array index: 0x1047 */ 0x853F,0x5940, + /* Array index: 0x1047 */ 0x8546,0x5941, + /* Array index: 0x1047 */ 0x8556,0x5947, + /* Array index: 0x1047 */ 0x8559,0x5948, + /* Array index: 0x1047 */ 0x856B,0x5951, + /* Array index: 0x1047 */ 0x856F,0x5952, + /* Array index: 0x1047 */ 0x8585,0x5959, + /* Array index: 0x1047 */ 0x8586,0x595A, + /* Array index: 0x1047 */ 0x8589,0x595B, + /* Array index: 0x1047 */ 0x858B,0x595C, + /* Array index: 0x1047 */ 0x858C,0x595D, + /* Array index: 0x1047 */ 0x858F,0x595E, + /* Array index: 0x1047 */ 0x8593,0x595F, + /* Array index: 0x1047 */ 0x8598,0x5960, + /* Array index: 0x1047 */ 0x859D,0x5961, + /* Array index: 0x1047 */ 0x859F,0x5962, + /* Array index: 0x1047 */ 0x85A0,0x5963, + /* Array index: 0x1047 */ 0x85A2,0x5964, + /* Array index: 0x1047 */ 0x85A5,0x5965, + /* Array index: 0x1047 */ 0x85A7,0x5966, + /* Array index: 0x1047 */ 0x85AD,0x5974, + /* Array index: 0x1047 */ 0x85C2,0x596F, + /* Array index: 0x1047 */ 0x85C7,0x5970, + /* Array index: 0x1047 */ 0x85CA,0x5971, + /* Array index: 0x1047 */ 0x85CB,0x5972, + /* Array index: 0x1047 */ 0x85CE,0x5973, + /* Array index: 0x1047 */ 0x85D8,0x5975, + /* Array index: 0x1047 */ 0x85DA,0x5976, + /* Array index: 0x1047 */ 0x85DF,0x5977, + /* Array index: 0x1047 */ 0x85E0,0x5978, + /* Array index: 0x1047 */ 0x85E6,0x5979, + /* Array index: 0x1047 */ 0x85E8,0x597A, + /* Array index: 0x1047 */ 0x85ED,0x597B, + /* Array index: 0x1047 */ 0x85F3,0x597C, + /* Array index: 0x1047 */ 0x85F6,0x597D, + /* Array index: 0x1047 */ 0x85FC,0x597E, + /* Array index: 0x1047 */ 0x85FF,0x5A21, + /* Array index: 0x1047 */ 0x8600,0x5A22, + /* Array index: 0x1047 */ 0x8604,0x5A23, + /* Array index: 0x1047 */ 0x8605,0x5A24, + /* Array index: 0x1047 */ 0x8618,0x5A2A, + /* Array index: 0x1047 */ 0x8619,0x5A2B, + /* Array index: 0x1047 */ 0x861B,0x5A2C, + /* Array index: 0x1047 */ 0x861E,0x5A2D, + /* Array index: 0x1047 */ 0x8621,0x5A2E, + /* Array index: 0x1047 */ 0x8627,0x5A2F, + /* Array index: 0x1047 */ 0x8629,0x5A30, + /* Array index: 0x1047 */ 0x8636,0x5A31, + /* Array index: 0x1047 */ 0x8638,0x5A32, + /* Array index: 0x1047 */ 0x863A,0x5A33, + /* Array index: 0x1047 */ 0x8646,0x5A38, + /* Array index: 0x1047 */ 0x865D,0x5A3F, + /* Array index: 0x1047 */ 0x8669,0x5A45, + /* Array index: 0x1047 */ 0x866C,0x5A46, + /* Array index: 0x1047 */ 0x866F,0x5A47, + /* Array index: 0x1047 */ 0x867A,0x5A4B, + /* Array index: 0x1047 */ 0x8688,0x5A6D, + /* Array index: 0x1047 */ 0x868D,0x5A4C, + /* Array index: 0x1047 */ 0x8691,0x5A4D, + /* Array index: 0x1047 */ 0x8696,0x5A4E, + /* Array index: 0x1047 */ 0x8698,0x5A4F, + /* Array index: 0x1047 */ 0x869A,0x5A50, + /* Array index: 0x1047 */ 0x869C,0x5A51, + /* Array index: 0x1047 */ 0x86A1,0x5A52, + /* Array index: 0x1047 */ 0x86AD,0x5A56, + /* Array index: 0x1047 */ 0x86D1,0x5A63, + /* Array index: 0x1047 */ 0x86D2,0x5A64, + /* Array index: 0x1047 */ 0x86D5,0x5A65, + /* Array index: 0x1047 */ 0x86D7,0x5A66, + /* Array index: 0x1047 */ 0x86DA,0x5A67, + /* Array index: 0x1047 */ 0x86DC,0x5A68, + /* Array index: 0x1047 */ 0x86E0,0x5A69, + /* Array index: 0x1047 */ 0x86E3,0x5A6A, + /* Array index: 0x1047 */ 0x86E5,0x5A6B, + /* Array index: 0x1047 */ 0x86E7,0x5A6C, + /* Array index: 0x1047 */ 0x86FA,0x5A6E, + /* Array index: 0x1047 */ 0x86FC,0x5A6F, + /* Array index: 0x1047 */ 0x86FD,0x5A70, + /* Array index: 0x1047 */ 0x8704,0x5A71, + /* Array index: 0x1047 */ 0x8705,0x5A72, + /* Array index: 0x1047 */ 0x8707,0x5A73, + /* Array index: 0x1047 */ 0x870B,0x5A74, + /* Array index: 0x1047 */ 0x8719,0x5A7A, + /* Array index: 0x1047 */ 0x871E,0x5A7B, + /* Array index: 0x1047 */ 0x871F,0x5A7C, + /* Array index: 0x1047 */ 0x8721,0x5A7D, + /* Array index: 0x1047 */ 0x8723,0x5A7E, + /* Array index: 0x1047 */ 0x8728,0x5B21, + /* Array index: 0x1047 */ 0x8743,0x5B2C, + /* Array index: 0x1047 */ 0x8745,0x5B2D, + /* Array index: 0x1047 */ 0x874D,0x5B2E, + /* Array index: 0x1047 */ 0x8758,0x5B2F, + /* Array index: 0x1047 */ 0x875D,0x5B30, + /* Array index: 0x1047 */ 0x8761,0x5B31, + /* Array index: 0x1047 */ 0x8764,0x5B32, + /* Array index: 0x1047 */ 0x8765,0x5B33, + /* Array index: 0x1047 */ 0x876F,0x5B34, + /* Array index: 0x1047 */ 0x8771,0x5B35, + /* Array index: 0x1047 */ 0x8772,0x5B36, + /* Array index: 0x1047 */ 0x877B,0x5B37, + /* Array index: 0x1047 */ 0x8790,0x5B41, + /* Array index: 0x1047 */ 0x8793,0x5B42, + /* Array index: 0x1047 */ 0x879E,0x5B47, + /* Array index: 0x1047 */ 0x87A0,0x5B48, + /* Array index: 0x1047 */ 0x87A3,0x5B49, + /* Array index: 0x1047 */ 0x87A7,0x5B4A, + /* Array index: 0x1047 */ 0x87B1,0x5B4E, + /* Array index: 0x1047 */ 0x87B5,0x5B4F, + /* Array index: 0x1047 */ 0x87BE,0x5B50, + /* Array index: 0x1047 */ 0x87BF,0x5B51, + /* Array index: 0x1047 */ 0x87C1,0x5B52, + /* Array index: 0x1047 */ 0x87CE,0x5B56, + /* Array index: 0x1047 */ 0x87D5,0x5B57, + /* Array index: 0x1047 */ 0x87D6,0x5B58, + /* Array index: 0x1047 */ 0x87D9,0x5B59, + /* Array index: 0x1047 */ 0x87DA,0x5B5A, + /* Array index: 0x1047 */ 0x87DC,0x5B5B, + /* Array index: 0x1047 */ 0x87DF,0x5B5C, + /* Array index: 0x1047 */ 0x87EA,0x5B60, + /* Array index: 0x1047 */ 0x87EB,0x5B61, + /* Array index: 0x1047 */ 0x87ED,0x5B62, + /* Array index: 0x1047 */ 0x87F1,0x5B63, + /* Array index: 0x1047 */ 0x87F3,0x5B64, + /* Array index: 0x1047 */ 0x87F8,0x5B65, + /* Array index: 0x1047 */ 0x87FA,0x5B66, + /* Array index: 0x1047 */ 0x87FF,0x5B67, + /* Array index: 0x1047 */ 0x8801,0x5B68, + /* Array index: 0x1047 */ 0x8803,0x5B69, + /* Array index: 0x1047 */ 0x8806,0x5B6A, + /* Array index: 0x1047 */ 0x8828,0x5B79, + /* Array index: 0x1047 */ 0x882D,0x5B7A, + /* Array index: 0x1047 */ 0x882E,0x5B7B, + /* Array index: 0x1047 */ 0x8830,0x5B7C, + /* Array index: 0x1047 */ 0x8832,0x5B7D, + /* Array index: 0x1047 */ 0x8835,0x5B7E, + /* Array index: 0x1047 */ 0x883A,0x5C21, + /* Array index: 0x1047 */ 0x883C,0x5C22, + /* Array index: 0x1047 */ 0x8841,0x5C23, + /* Array index: 0x1047 */ 0x8843,0x5C24, + /* Array index: 0x1047 */ 0x8845,0x5C25, + /* Array index: 0x1047 */ 0x884E,0x5C2A, + /* Array index: 0x1047 */ 0x8851,0x5C2B, + /* Array index: 0x1047 */ 0x8855,0x5C2C, + /* Array index: 0x1047 */ 0x8856,0x5C2D, + /* Array index: 0x1047 */ 0x8858,0x5C2E, + /* Array index: 0x1047 */ 0x885A,0x5C2F, + /* Array index: 0x1047 */ 0x885C,0x5C30, + /* Array index: 0x1047 */ 0x885F,0x5C31, + /* Array index: 0x1047 */ 0x8860,0x5C32, + /* Array index: 0x1047 */ 0x8864,0x5C33, + /* Array index: 0x1047 */ 0x8869,0x5C34, + /* Array index: 0x1047 */ 0x8871,0x5C35, + /* Array index: 0x1047 */ 0x8879,0x5C36, + /* Array index: 0x1047 */ 0x887B,0x5C37, + /* Array index: 0x1047 */ 0x8880,0x5C38, + /* Array index: 0x1047 */ 0x88A8,0x5C3F, + /* Array index: 0x1047 */ 0x88AA,0x5C40, + /* Array index: 0x1047 */ 0x88BA,0x5C41, + /* Array index: 0x1047 */ 0x88BD,0x5C42, + /* Array index: 0x1047 */ 0x88BE,0x5C43, + /* Array index: 0x1047 */ 0x88C0,0x5C44, + /* Array index: 0x1047 */ 0x88DB,0x5C4D, + /* Array index: 0x1047 */ 0x88DE,0x5C4E, + /* Array index: 0x1047 */ 0x88E7,0x5C4F, + /* Array index: 0x1047 */ 0x88F5,0x5C53, + /* Array index: 0x1047 */ 0x88F7,0x5C54, + /* Array index: 0x1047 */ 0x8901,0x5C55, + /* Array index: 0x1047 */ 0x8906,0x5C56, + /* Array index: 0x1047 */ 0x8920,0x5C60, + /* Array index: 0x1047 */ 0x8935,0x5C67, + /* Array index: 0x1047 */ 0x8939,0x5C68, + /* Array index: 0x1047 */ 0x893A,0x5C69, + /* Array index: 0x1047 */ 0x893E,0x5C6A, + /* Array index: 0x1047 */ 0x8940,0x5C6B, + /* Array index: 0x1047 */ 0x8942,0x5C6C, + /* Array index: 0x1047 */ 0x8945,0x5C6D, + /* Array index: 0x1047 */ 0x8946,0x5C6E, + /* Array index: 0x1047 */ 0x8949,0x5C6F, + /* Array index: 0x1047 */ 0x894F,0x5C70, + /* Array index: 0x1047 */ 0x8952,0x5C71, + /* Array index: 0x1047 */ 0x8957,0x5C72, + /* Array index: 0x1047 */ 0x896B,0x5C79, + /* Array index: 0x1047 */ 0x896E,0x5C7A, + /* Array index: 0x1047 */ 0x8970,0x5C7B, + /* Array index: 0x1047 */ 0x8973,0x5C7C, + /* Array index: 0x1047 */ 0x8975,0x5C7D, + /* Array index: 0x1047 */ 0x8989,0x5D24, + /* Array index: 0x1047 */ 0x898D,0x5D25, + /* Array index: 0x1047 */ 0x8990,0x5D26, + /* Array index: 0x1047 */ 0x8994,0x5D27, + /* Array index: 0x1047 */ 0x8995,0x5D28, + /* Array index: 0x1047 */ 0x899B,0x5D29, + /* Array index: 0x1047 */ 0x899C,0x5D2A, + /* Array index: 0x1047 */ 0x899F,0x5D2B, + /* Array index: 0x1047 */ 0x89A0,0x5D2C, + /* Array index: 0x1047 */ 0x89A5,0x5D2D, + /* Array index: 0x1047 */ 0x89B0,0x5D2E, + /* Array index: 0x1047 */ 0x89BC,0x5D33, + /* Array index: 0x1047 */ 0x89E5,0x5D39, + /* Array index: 0x1047 */ 0x89E9,0x5D3A, + /* Array index: 0x1047 */ 0x89EB,0x5D3B, + /* Array index: 0x1047 */ 0x89ED,0x5D3C, + /* Array index: 0x1047 */ 0x89F1,0x5D3D, + /* Array index: 0x1047 */ 0x89F3,0x5D3E, + /* Array index: 0x1047 */ 0x89F6,0x5D3F, + /* Array index: 0x1047 */ 0x89F9,0x5D40, + /* Array index: 0x1047 */ 0x89FD,0x5D41, + /* Array index: 0x1047 */ 0x89FF,0x5D42, + /* Array index: 0x1047 */ 0x8A04,0x5D43, + /* Array index: 0x1047 */ 0x8A05,0x5D44, + /* Array index: 0x1047 */ 0x8A07,0x5D45, + /* Array index: 0x1047 */ 0x8A0F,0x5D46, + /* Array index: 0x1047 */ 0x8A1E,0x5D4B, + /* Array index: 0x1047 */ 0x8A20,0x5D4C, + /* Array index: 0x1047 */ 0x8A22,0x5D4D, + /* Array index: 0x1047 */ 0x8A24,0x5D4E, + /* Array index: 0x1047 */ 0x8A26,0x5D4F, + /* Array index: 0x1047 */ 0x8A2B,0x5D50, + /* Array index: 0x1047 */ 0x8A2C,0x5D51, + /* Array index: 0x1047 */ 0x8A2F,0x5D52, + /* Array index: 0x1047 */ 0x8A35,0x5D53, + /* Array index: 0x1047 */ 0x8A37,0x5D54, + /* Array index: 0x1047 */ 0x8A3D,0x5D55, + /* Array index: 0x1047 */ 0x8A3E,0x5D56, + /* Array index: 0x1047 */ 0x8A40,0x5D57, + /* Array index: 0x1047 */ 0x8A43,0x5D58, + /* Array index: 0x1047 */ 0x8A45,0x5D59, + /* Array index: 0x1047 */ 0x8A47,0x5D5A, + /* Array index: 0x1047 */ 0x8A49,0x5D5B, + /* Array index: 0x1047 */ 0x8A4D,0x5D5C, + /* Array index: 0x1047 */ 0x8A4E,0x5D5D, + /* Array index: 0x1047 */ 0x8A53,0x5D5E, + /* Array index: 0x1047 */ 0x8A5C,0x5D62, + /* Array index: 0x1047 */ 0x8A5D,0x5D63, + /* Array index: 0x1047 */ 0x8A61,0x5D64, + /* Array index: 0x1047 */ 0x8A65,0x5D65, + /* Array index: 0x1047 */ 0x8A67,0x5D66, + /* Array index: 0x1047 */ 0x8A83,0x5D70, + /* Array index: 0x1047 */ 0x8A86,0x5D71, + /* Array index: 0x1047 */ 0x8A8B,0x5D72, + /* Array index: 0x1047 */ 0x8A8F,0x5D73, + /* Array index: 0x1047 */ 0x8A90,0x5D74, + /* Array index: 0x1047 */ 0x8A92,0x5D75, + /* Array index: 0x1047 */ 0x8A96,0x5D76, + /* Array index: 0x1047 */ 0x8A97,0x5D77, + /* Array index: 0x1047 */ 0x8A99,0x5D78, + /* Array index: 0x1047 */ 0x8A9F,0x5D79, + /* Array index: 0x1047 */ 0x8AA7,0x5D7A, + /* Array index: 0x1047 */ 0x8AA9,0x5D7B, + /* Array index: 0x1047 */ 0x8AAE,0x5D7C, + /* Array index: 0x1047 */ 0x8AAF,0x5D7D, + /* Array index: 0x1047 */ 0x8AB3,0x5D7E, + /* Array index: 0x1047 */ 0x8AB6,0x5E21, + /* Array index: 0x1047 */ 0x8AB7,0x5E22, + /* Array index: 0x1047 */ 0x8ABB,0x5E23, + /* Array index: 0x1047 */ 0x8ABE,0x5E24, + /* Array index: 0x1047 */ 0x8AC3,0x5E25, + /* Array index: 0x1047 */ 0x8ADD,0x5E2F, + /* Array index: 0x1047 */ 0x8ADF,0x5E30, + /* Array index: 0x1047 */ 0x8AEC,0x5E31, + /* Array index: 0x1047 */ 0x8AF0,0x5E32, + /* Array index: 0x1047 */ 0x8AFC,0x5E36, + /* Array index: 0x1047 */ 0x8AFF,0x5E37, + /* Array index: 0x1047 */ 0x8B05,0x5E38, + /* Array index: 0x1047 */ 0x8B06,0x5E39, + /* Array index: 0x1047 */ 0x8B0A,0x5E3F, + /* Array index: 0x1047 */ 0x8B0B,0x5E3A, + /* Array index: 0x1047 */ 0x8B11,0x5E3B, + /* Array index: 0x1047 */ 0x8B1C,0x5E3C, + /* Array index: 0x1047 */ 0x8B1E,0x5E3D, + /* Array index: 0x1047 */ 0x8B1F,0x5E3E, + /* Array index: 0x1047 */ 0x8B2D,0x5E40, + /* Array index: 0x1047 */ 0x8B30,0x5E41, + /* Array index: 0x1047 */ 0x8B37,0x5E42, + /* Array index: 0x1047 */ 0x8B3C,0x5E43, + /* Array index: 0x1047 */ 0x8B4D,0x5E4E, + /* Array index: 0x1047 */ 0x8B59,0x5E4D, + /* Array index: 0x1047 */ 0x8B5E,0x5E4F, + /* Array index: 0x1047 */ 0x8B63,0x5E50, + /* Array index: 0x1047 */ 0x8B6D,0x5E51, + /* Array index: 0x1047 */ 0x8B76,0x5E52, + /* Array index: 0x1047 */ 0x8B78,0x5E53, + /* Array index: 0x1047 */ 0x8B79,0x5E54, + /* Array index: 0x1047 */ 0x8B7C,0x5E55, + /* Array index: 0x1047 */ 0x8B7E,0x5E56, + /* Array index: 0x1047 */ 0x8B81,0x5E57, + /* Array index: 0x1047 */ 0x8B84,0x5E58, + /* Array index: 0x1047 */ 0x8B85,0x5E59, + /* Array index: 0x1047 */ 0x8B8B,0x5E5A, + /* Array index: 0x1047 */ 0x8B8D,0x5E5B, + /* Array index: 0x1047 */ 0x8B8F,0x5E5C, + /* Array index: 0x1047 */ 0x8B94,0x5E5D, + /* Array index: 0x1047 */ 0x8B95,0x5E5E, + /* Array index: 0x1047 */ 0x8B9C,0x5E5F, + /* Array index: 0x1047 */ 0x8B9E,0x5E60, + /* Array index: 0x1047 */ 0x8B9F,0x5E61, + /* Array index: 0x1047 */ 0x8C38,0x5E62, + /* Array index: 0x1047 */ 0x8C39,0x5E63, + /* Array index: 0x1047 */ 0x8C3D,0x5E64, + /* Array index: 0x1047 */ 0x8C3E,0x5E65, + /* Array index: 0x1047 */ 0x8C45,0x5E66, + /* Array index: 0x1047 */ 0x8C47,0x5E67, + /* Array index: 0x1047 */ 0x8C49,0x5E68, + /* Array index: 0x1047 */ 0x8C4B,0x5E69, + /* Array index: 0x1047 */ 0x8C4F,0x5E6A, + /* Array index: 0x1047 */ 0x8C51,0x5E6B, + /* Array index: 0x1047 */ 0x8C63,0x5E73, + /* Array index: 0x1047 */ 0x8C64,0x5E74, + /* Array index: 0x1047 */ 0x8C66,0x5E75, + /* Array index: 0x1047 */ 0x8C68,0x5E76, + /* Array index: 0x1047 */ 0x8C69,0x5E77, + /* Array index: 0x1047 */ 0x8C6D,0x5E78, + /* Array index: 0x1047 */ 0x8C73,0x5E79, + /* Array index: 0x1047 */ 0x8C75,0x5E7A, + /* Array index: 0x1047 */ 0x8C76,0x5E7B, + /* Array index: 0x1047 */ 0x8C7B,0x5E7C, + /* Array index: 0x1047 */ 0x8C7E,0x5E7D, + /* Array index: 0x1047 */ 0x8C86,0x5E7E, + /* Array index: 0x1047 */ 0x8C87,0x5F21, + /* Array index: 0x1047 */ 0x8C8B,0x5F22, + /* Array index: 0x1047 */ 0x8C90,0x5F23, + /* Array index: 0x1047 */ 0x8C92,0x5F24, + /* Array index: 0x1047 */ 0x8C93,0x5F25, + /* Array index: 0x1047 */ 0x8C99,0x5F26, + /* Array index: 0x1047 */ 0x8C9B,0x5F27, + /* Array index: 0x1047 */ 0x8C9C,0x5F28, + /* Array index: 0x1047 */ 0x8CA4,0x5F29, + /* Array index: 0x1047 */ 0x8CB9,0x5F2A, + /* Array index: 0x1047 */ 0x8CBA,0x5F2B, + /* Array index: 0x1047 */ 0x8CC5,0x5F2C, + /* Array index: 0x1047 */ 0x8CC6,0x5F2D, + /* Array index: 0x1047 */ 0x8CC9,0x5F2E, + /* Array index: 0x1047 */ 0x8CCB,0x5F2F, + /* Array index: 0x1047 */ 0x8CCF,0x5F30, + /* Array index: 0x1047 */ 0x8CD5,0x5F32, + /* Array index: 0x1047 */ 0x8CD6,0x5F31, + /* Array index: 0x1047 */ 0x8CD9,0x5F33, + /* Array index: 0x1047 */ 0x8CDD,0x5F34, + /* Array index: 0x1047 */ 0x8CE1,0x5F35, + /* Array index: 0x1047 */ 0x8CE8,0x5F36, + /* Array index: 0x1047 */ 0x8CEC,0x5F37, + /* Array index: 0x1047 */ 0x8CEF,0x5F38, + /* Array index: 0x1047 */ 0x8CF0,0x5F39, + /* Array index: 0x1047 */ 0x8CF2,0x5F3A, + /* Array index: 0x1047 */ 0x8CF5,0x5F3B, + /* Array index: 0x1047 */ 0x8CF7,0x5F3C, + /* Array index: 0x1047 */ 0x8CF8,0x5F3D, + /* Array index: 0x1047 */ 0x8CFE,0x5F3E, + /* Array index: 0x1047 */ 0x8CFF,0x5F3F, + /* Array index: 0x1047 */ 0x8D01,0x5F40, + /* Array index: 0x1047 */ 0x8D03,0x5F41, + /* Array index: 0x1047 */ 0x8D09,0x5F42, + /* Array index: 0x1047 */ 0x8D12,0x5F43, + /* Array index: 0x1047 */ 0x8D17,0x5F44, + /* Array index: 0x1047 */ 0x8D1B,0x5F45, + /* Array index: 0x1047 */ 0x8D65,0x5F46, + /* Array index: 0x1047 */ 0x8D69,0x5F47, + /* Array index: 0x1047 */ 0x8D6C,0x5F48, + /* Array index: 0x1047 */ 0x8D6E,0x5F49, + /* Array index: 0x1047 */ 0x8D7F,0x5F4A, + /* Array index: 0x1047 */ 0x8D82,0x5F4B, + /* Array index: 0x1047 */ 0x8D84,0x5F4C, + /* Array index: 0x1047 */ 0x8D88,0x5F4D, + /* Array index: 0x1047 */ 0x8D8D,0x5F4E, + /* Array index: 0x1047 */ 0x8D90,0x5F4F, + /* Array index: 0x1047 */ 0x8D91,0x5F50, + /* Array index: 0x1047 */ 0x8D95,0x5F51, + /* Array index: 0x1047 */ 0x8DA6,0x5F55, + /* Array index: 0x1047 */ 0x8DAB,0x5F56, + /* Array index: 0x1047 */ 0x8DAC,0x5F57, + /* Array index: 0x1047 */ 0x8DAF,0x5F58, + /* Array index: 0x1047 */ 0x8DB2,0x5F59, + /* Array index: 0x1047 */ 0x8DB5,0x5F5A, + /* Array index: 0x1047 */ 0x8DB7,0x5F5B, + /* Array index: 0x1047 */ 0x8DB9,0x5F5C, + /* Array index: 0x1047 */ 0x8DBB,0x5F5D, + /* Array index: 0x1047 */ 0x8DBC,0x5F6F, + /* Array index: 0x1047 */ 0x8DC0,0x5F5E, + /* Array index: 0x1047 */ 0x8DCE,0x5F64, + /* Array index: 0x1047 */ 0x8DD1,0x5F65, + /* Array index: 0x1047 */ 0x8DD4,0x5F66, + /* Array index: 0x1047 */ 0x8DD5,0x5F67, + /* Array index: 0x1047 */ 0x8DD7,0x5F68, + /* Array index: 0x1047 */ 0x8DD9,0x5F69, + /* Array index: 0x1047 */ 0x8DE4,0x5F6A, + /* Array index: 0x1047 */ 0x8DE5,0x5F6B, + /* Array index: 0x1047 */ 0x8DE7,0x5F6C, + /* Array index: 0x1047 */ 0x8DEC,0x5F6D, + /* Array index: 0x1047 */ 0x8DFD,0x5F73, + /* Array index: 0x1047 */ 0x8E01,0x5F74, + /* Array index: 0x1047 */ 0x8E0B,0x5F78, + /* Array index: 0x1047 */ 0x8E11,0x5F79, + /* Array index: 0x1047 */ 0x8E14,0x5F7A, + /* Array index: 0x1047 */ 0x8E16,0x5F7B, + /* Array index: 0x1047 */ 0x8E31,0x6024, + /* Array index: 0x1047 */ 0x8E33,0x6025, + /* Array index: 0x1047 */ 0x8E3D,0x602A, + /* Array index: 0x1047 */ 0x8E40,0x602B, + /* Array index: 0x1047 */ 0x8E41,0x602C, + /* Array index: 0x1047 */ 0x8E54,0x6031, + /* Array index: 0x1047 */ 0x8E69,0x6038, + /* Array index: 0x1047 */ 0x8E82,0x6041, + /* Array index: 0x1047 */ 0x8E83,0x6042, + /* Array index: 0x1047 */ 0x8E89,0x6043, + /* Array index: 0x1047 */ 0x8E90,0x6044, + /* Array index: 0x1047 */ 0x8E92,0x6045, + /* Array index: 0x1047 */ 0x8E95,0x6046, + /* Array index: 0x1047 */ 0x8EA2,0x604B, + /* Array index: 0x1047 */ 0x8EA7,0x604C, + /* Array index: 0x1047 */ 0x8EA9,0x604D, + /* Array index: 0x1047 */ 0x8EAD,0x604E, + /* Array index: 0x1047 */ 0x8EAE,0x604F, + /* Array index: 0x1047 */ 0x8EB3,0x6050, + /* Array index: 0x1047 */ 0x8EB5,0x6051, + /* Array index: 0x1047 */ 0x8EBA,0x6052, + /* Array index: 0x1047 */ 0x8EBB,0x6053, + /* Array index: 0x1047 */ 0x8EC7,0x6058, + /* Array index: 0x1047 */ 0x8ECF,0x6059, + /* Array index: 0x1047 */ 0x8ED1,0x605A, + /* Array index: 0x1047 */ 0x8ED4,0x605B, + /* Array index: 0x1047 */ 0x8EDC,0x605C, + /* Array index: 0x1047 */ 0x8EE8,0x605D, + /* Array index: 0x1047 */ 0x8EF7,0x6061, + /* Array index: 0x1047 */ 0x8EF9,0x6062, + /* Array index: 0x1047 */ 0x8EFA,0x6063, + /* Array index: 0x1047 */ 0x8F00,0x6065, + /* Array index: 0x1047 */ 0x8F02,0x6066, + /* Array index: 0x1047 */ 0x8F07,0x6067, + /* Array index: 0x1047 */ 0x8F08,0x6068, + /* Array index: 0x1047 */ 0x8F0F,0x6069, + /* Array index: 0x1047 */ 0x8F10,0x606A, + /* Array index: 0x1047 */ 0x8F1E,0x606E, + /* Array index: 0x1047 */ 0x8F20,0x606F, + /* Array index: 0x1047 */ 0x8F21,0x6070, + /* Array index: 0x1047 */ 0x8F23,0x6071, + /* Array index: 0x1047 */ 0x8F25,0x6072, + /* Array index: 0x1047 */ 0x8F27,0x6073, + /* Array index: 0x1047 */ 0x8F28,0x6074, + /* Array index: 0x1047 */ 0x8F3A,0x607C, + /* Array index: 0x1047 */ 0x8F40,0x607D, + /* Array index: 0x1047 */ 0x8F41,0x607E, + /* Array index: 0x1047 */ 0x8F43,0x6121, + /* Array index: 0x1047 */ 0x8F47,0x6122, + /* Array index: 0x1047 */ 0x8F58,0x6129, + /* Array index: 0x1047 */ 0x8F5D,0x612A, + /* Array index: 0x1047 */ 0x8F5E,0x612B, + /* Array index: 0x1047 */ 0x8F65,0x612C, + /* Array index: 0x1047 */ 0x8F9D,0x612D, + /* Array index: 0x1047 */ 0x8FB5,0x6133, + /* Array index: 0x1047 */ 0x8FB6,0x6134, + /* Array index: 0x1047 */ 0x8FB8,0x6135, + /* Array index: 0x1047 */ 0x8FBE,0x6136, + /* Array index: 0x1047 */ 0x8FC0,0x6137, + /* Array index: 0x1047 */ 0x8FC1,0x6138, + /* Array index: 0x1047 */ 0x8FC6,0x6139, + /* Array index: 0x1047 */ 0x8FCA,0x613A, + /* Array index: 0x1047 */ 0x8FCB,0x613B, + /* Array index: 0x1047 */ 0x8FCD,0x613C, + /* Array index: 0x1047 */ 0x8FD0,0x613D, + /* Array index: 0x1047 */ 0x8FD2,0x613E, + /* Array index: 0x1047 */ 0x8FD3,0x613F, + /* Array index: 0x1047 */ 0x8FD5,0x6140, + /* Array index: 0x1047 */ 0x8FE0,0x6141, + /* Array index: 0x1047 */ 0x8FE3,0x6142, + /* Array index: 0x1047 */ 0x8FE4,0x6143, + /* Array index: 0x1047 */ 0x8FE8,0x6144, + /* Array index: 0x1047 */ 0x8FEE,0x6145, + /* Array index: 0x1047 */ 0x8FF1,0x6146, + /* Array index: 0x1047 */ 0x8FF5,0x6147, + /* Array index: 0x1047 */ 0x8FF6,0x6148, + /* Array index: 0x1047 */ 0x8FFB,0x6149, + /* Array index: 0x1047 */ 0x8FFE,0x614A, + /* Array index: 0x1047 */ 0x9002,0x614B, + /* Array index: 0x1047 */ 0x9004,0x614C, + /* Array index: 0x1047 */ 0x9008,0x614D, + /* Array index: 0x1047 */ 0x900C,0x614E, + /* Array index: 0x1047 */ 0x9018,0x614F, + /* Array index: 0x1047 */ 0x901B,0x6150, + /* Array index: 0x1047 */ 0x9033,0x6157, + /* Array index: 0x1047 */ 0x9034,0x6158, + /* Array index: 0x1047 */ 0x9037,0x6159, + /* Array index: 0x1047 */ 0x903F,0x615A, + /* Array index: 0x1047 */ 0x9043,0x615B, + /* Array index: 0x1047 */ 0x9044,0x615C, + /* Array index: 0x1047 */ 0x904C,0x615D, + /* Array index: 0x1047 */ 0x905B,0x615E, + /* Array index: 0x1047 */ 0x905D,0x615F, + /* Array index: 0x1047 */ 0x9062,0x6160, + /* Array index: 0x1047 */ 0x9066,0x6161, + /* Array index: 0x1047 */ 0x9067,0x6162, + /* Array index: 0x1047 */ 0x906C,0x6163, + /* Array index: 0x1047 */ 0x9070,0x6164, + /* Array index: 0x1047 */ 0x9074,0x6165, + /* Array index: 0x1047 */ 0x9079,0x6166, + /* Array index: 0x1047 */ 0x9085,0x6167, + /* Array index: 0x1047 */ 0x9088,0x6168, + /* Array index: 0x1047 */ 0x908B,0x6169, + /* Array index: 0x1047 */ 0x908C,0x616A, + /* Array index: 0x1047 */ 0x908E,0x616B, + /* Array index: 0x1047 */ 0x9090,0x616C, + /* Array index: 0x1047 */ 0x90A5,0x6175, + /* Array index: 0x1047 */ 0x90BD,0x617B, + /* Array index: 0x1047 */ 0x90BE,0x617D, + /* Array index: 0x1047 */ 0x90CC,0x617C, + /* Array index: 0x1047 */ 0x90D2,0x622D, + /* Array index: 0x1047 */ 0x90E5,0x622C, + /* Array index: 0x1047 */ 0x90EB,0x622F, + /* Array index: 0x1047 */ 0x90EF,0x6230, + /* Array index: 0x1047 */ 0x90F0,0x6231, + /* Array index: 0x1047 */ 0x90F4,0x6232, + /* Array index: 0x1047 */ 0x90F6,0x622E, + /* Array index: 0x1047 */ 0x910D,0x623A, + /* Array index: 0x1047 */ 0x9110,0x623B, + /* Array index: 0x1047 */ 0x912E,0x6249, + /* Array index: 0x1047 */ 0x912F,0x624A, + /* Array index: 0x1047 */ 0x9131,0x624B, + /* Array index: 0x1047 */ 0x9134,0x624C, + /* Array index: 0x1047 */ 0x9143,0x6253, + /* Array index: 0x1047 */ 0x9147,0x6254, + /* Array index: 0x1047 */ 0x9148,0x6255, + /* Array index: 0x1047 */ 0x914F,0x6256, + /* Array index: 0x1047 */ 0x9153,0x6257, + /* Array index: 0x1047 */ 0x9161,0x625C, + /* Array index: 0x1047 */ 0x9164,0x625D, + /* Array index: 0x1047 */ 0x9167,0x625E, + /* Array index: 0x1047 */ 0x916D,0x625F, + /* Array index: 0x1047 */ 0x9174,0x6260, + /* Array index: 0x1047 */ 0x9181,0x6264, + /* Array index: 0x1047 */ 0x9183,0x6265, + /* Array index: 0x1047 */ 0x9185,0x6266, + /* Array index: 0x1047 */ 0x9186,0x6267, + /* Array index: 0x1047 */ 0x918A,0x6268, + /* Array index: 0x1047 */ 0x918E,0x6269, + /* Array index: 0x1047 */ 0x9198,0x626E, + /* Array index: 0x1047 */ 0x919E,0x626F, + /* Array index: 0x1047 */ 0x91A1,0x6270, + /* Array index: 0x1047 */ 0x91A6,0x6271, + /* Array index: 0x1047 */ 0x91A8,0x6272, + /* Array index: 0x1047 */ 0x91B6,0x627A, + /* Array index: 0x1047 */ 0x91D3,0x6324, + /* Array index: 0x1047 */ 0x91D4,0x6325, + /* Array index: 0x1047 */ 0x91D7,0x6326, + /* Array index: 0x1047 */ 0x91D9,0x6327, + /* Array index: 0x1047 */ 0x91DA,0x6328, + /* Array index: 0x1047 */ 0x91DE,0x6329, + /* Array index: 0x1047 */ 0x91E4,0x632A, + /* Array index: 0x1047 */ 0x91E5,0x632B, + /* Array index: 0x1047 */ 0x91F7,0x6334, + /* Array index: 0x1047 */ 0x91F9,0x6335, + /* Array index: 0x1047 */ 0x91FB,0x6336, + /* Array index: 0x1047 */ 0x91FD,0x6337, + /* Array index: 0x1047 */ 0x9210,0x6341, + /* Array index: 0x1047 */ 0x9212,0x6342, + /* Array index: 0x1047 */ 0x9213,0x6343, + /* Array index: 0x1047 */ 0x9216,0x6344, + /* Array index: 0x1047 */ 0x9218,0x6345, + /* Array index: 0x1047 */ 0x921C,0x6346, + /* Array index: 0x1047 */ 0x921D,0x6347, + /* Array index: 0x1047 */ 0x9233,0x6350, + /* Array index: 0x1047 */ 0x924A,0x635D, + /* Array index: 0x1047 */ 0x9258,0x6362, + /* Array index: 0x1047 */ 0x9259,0x6363, + /* Array index: 0x1047 */ 0x925C,0x6364, + /* Array index: 0x1047 */ 0x925D,0x6365, + /* Array index: 0x1047 */ 0x9260,0x6366, + /* Array index: 0x1047 */ 0x9261,0x6367, + /* Array index: 0x1047 */ 0x9292,0x637D, + /* Array index: 0x1047 */ 0x9297,0x637E, + /* Array index: 0x1047 */ 0x9299,0x6421, + /* Array index: 0x1047 */ 0x929F,0x6422, + /* Array index: 0x1047 */ 0x92A0,0x6423, + /* Array index: 0x1047 */ 0x92AB,0x6428, + /* Array index: 0x1047 */ 0x92AF,0x6429, + /* Array index: 0x1047 */ 0x92B2,0x642A, + /* Array index: 0x1047 */ 0x92B6,0x642B, + /* Array index: 0x1047 */ 0x92D3,0x643F, + /* Array index: 0x1047 */ 0x92EC,0x644D, + /* Array index: 0x1047 */ 0x92EE,0x644E, + /* Array index: 0x1047 */ 0x92F0,0x644F, + /* Array index: 0x1047 */ 0x92F9,0x6450, + /* Array index: 0x1047 */ 0x92FB,0x6451, + /* Array index: 0x1047 */ 0x92FF,0x6452, + /* Array index: 0x1047 */ 0x9300,0x6453, + /* Array index: 0x1047 */ 0x9302,0x6454, + /* Array index: 0x1047 */ 0x9308,0x6455, + /* Array index: 0x1047 */ 0x930D,0x6456, + /* Array index: 0x1047 */ 0x9311,0x6457, + /* Array index: 0x1047 */ 0x9314,0x6458, + /* Array index: 0x1047 */ 0x9315,0x6459, + /* Array index: 0x1047 */ 0x9355,0x646E, + /* Array index: 0x1047 */ 0x9357,0x646F, + /* Array index: 0x1047 */ 0x9358,0x6470, + /* Array index: 0x1047 */ 0x935A,0x6471, + /* Array index: 0x1047 */ 0x935E,0x6472, + /* Array index: 0x1047 */ 0x9364,0x6473, + /* Array index: 0x1047 */ 0x9365,0x6474, + /* Array index: 0x1047 */ 0x9367,0x6475, + /* Array index: 0x1047 */ 0x9369,0x6476, + /* Array index: 0x1047 */ 0x936A,0x6477, + /* Array index: 0x1047 */ 0x937A,0x6521, + /* Array index: 0x1047 */ 0x9388,0x6527, + /* Array index: 0x1047 */ 0x938A,0x6528, + /* Array index: 0x1047 */ 0x938B,0x6529, + /* Array index: 0x1047 */ 0x938D,0x652A, + /* Array index: 0x1047 */ 0x938F,0x652B, + /* Array index: 0x1047 */ 0x9392,0x652C, + /* Array index: 0x1047 */ 0x9395,0x652D, + /* Array index: 0x1047 */ 0x9398,0x652E, + /* Array index: 0x1047 */ 0x939B,0x652F, + /* Array index: 0x1047 */ 0x939E,0x6530, + /* Array index: 0x1047 */ 0x93A1,0x6531, + /* Array index: 0x1047 */ 0x93A3,0x6532, + /* Array index: 0x1047 */ 0x93A4,0x6533, + /* Array index: 0x1047 */ 0x93A6,0x6534, + /* Array index: 0x1047 */ 0x93A8,0x6535, + /* Array index: 0x1047 */ 0x93A9,0x653B, + /* Array index: 0x1047 */ 0x93AB,0x6536, + /* Array index: 0x1047 */ 0x93BA,0x653A, + /* Array index: 0x1047 */ 0x93C1,0x653C, + /* Array index: 0x1047 */ 0x93D3,0x6546, + /* Array index: 0x1047 */ 0x93D9,0x6547, + /* Array index: 0x1047 */ 0x93DC,0x6548, + /* Array index: 0x1047 */ 0x93DE,0x6549, + /* Array index: 0x1047 */ 0x93DF,0x654A, + /* Array index: 0x1047 */ 0x93E2,0x654B, + /* Array index: 0x1047 */ 0x93E6,0x654C, + /* Array index: 0x1047 */ 0x93E7,0x654D, + /* Array index: 0x1047 */ 0x9401,0x6554, + /* Array index: 0x1047 */ 0x9402,0x6555, + /* Array index: 0x1047 */ 0x9404,0x6556, + /* Array index: 0x1047 */ 0x9408,0x6557, + /* Array index: 0x1047 */ 0x9409,0x6558, + /* Array index: 0x1047 */ 0x941F,0x655F, + /* Array index: 0x1047 */ 0x943B,0x6566, + /* Array index: 0x1047 */ 0x943D,0x6568, + /* Array index: 0x1047 */ 0x943F,0x6567, + /* Array index: 0x1047 */ 0x9443,0x6569, + /* Array index: 0x1047 */ 0x9445,0x656A, + /* Array index: 0x1047 */ 0x9448,0x656B, + /* Array index: 0x1047 */ 0x944A,0x656C, + /* Array index: 0x1047 */ 0x944C,0x656D, + /* Array index: 0x1047 */ 0x9455,0x656E, + /* Array index: 0x1047 */ 0x9459,0x656F, + /* Array index: 0x1047 */ 0x945C,0x6570, + /* Array index: 0x1047 */ 0x945F,0x6571, + /* Array index: 0x1047 */ 0x9461,0x6572, + /* Array index: 0x1047 */ 0x9463,0x6573, + /* Array index: 0x1047 */ 0x9468,0x6574, + /* Array index: 0x1047 */ 0x9483,0x657C, + /* Array index: 0x1047 */ 0x9484,0x657B, + /* Array index: 0x1047 */ 0x9578,0x657D, + /* Array index: 0x1047 */ 0x9579,0x657E, + /* Array index: 0x1047 */ 0x957E,0x6621, + /* Array index: 0x1047 */ 0x9584,0x6622, + /* Array index: 0x1047 */ 0x9588,0x6623, + /* Array index: 0x1047 */ 0x95A6,0x662B, + /* Array index: 0x1047 */ 0x95A9,0x662C, + /* Array index: 0x1047 */ 0x95AB,0x662D, + /* Array index: 0x1047 */ 0x95AC,0x662E, + /* Array index: 0x1047 */ 0x95B4,0x662F, + /* Array index: 0x1047 */ 0x95B6,0x6630, + /* Array index: 0x1047 */ 0x95BA,0x6631, + /* Array index: 0x1047 */ 0x95BD,0x6632, + /* Array index: 0x1047 */ 0x95BF,0x6633, + /* Array index: 0x1047 */ 0x95C6,0x6634, + /* Array index: 0x1047 */ 0x95C8,0x6635, + /* Array index: 0x1047 */ 0x95C9,0x6636, + /* Array index: 0x1047 */ 0x95CB,0x6637, + /* Array index: 0x1047 */ 0x95E4,0x6642, + /* Array index: 0x1047 */ 0x95E6,0x6643, + /* Array index: 0x1047 */ 0x961D,0x6644, + /* Array index: 0x1047 */ 0x961E,0x6645, + /* Array index: 0x1047 */ 0x962C,0x664A, + /* Array index: 0x1047 */ 0x9631,0x664B, + /* Array index: 0x1047 */ 0x9633,0x664C, + /* Array index: 0x1047 */ 0x9641,0x6653, + /* Array index: 0x1047 */ 0x9652,0x6654, + /* Array index: 0x1047 */ 0x9661,0x6659, + /* Array index: 0x1047 */ 0x966E,0x665A, + /* Array index: 0x1047 */ 0x9674,0x665B, + /* Array index: 0x1047 */ 0x9689,0x6664, + /* Array index: 0x1047 */ 0x9691,0x6665, + /* Array index: 0x1047 */ 0x9696,0x6666, + /* Array index: 0x1047 */ 0x969A,0x6667, + /* Array index: 0x1047 */ 0x969D,0x6668, + /* Array index: 0x1047 */ 0x969F,0x6669, + /* Array index: 0x1047 */ 0x96A9,0x666D, + /* Array index: 0x1047 */ 0x96AE,0x666E, + /* Array index: 0x1047 */ 0x96AF,0x666F, + /* Array index: 0x1047 */ 0x96B3,0x6670, + /* Array index: 0x1047 */ 0x96BA,0x6671, + /* Array index: 0x1047 */ 0x96CA,0x6672, + /* Array index: 0x1047 */ 0x96D2,0x6673, + /* Array index: 0x1047 */ 0x96D8,0x6675, + /* Array index: 0x1047 */ 0x96DA,0x6676, + /* Array index: 0x1047 */ 0x96E9,0x667A, + /* Array index: 0x1047 */ 0x96EF,0x667B, + /* Array index: 0x1047 */ 0x96F1,0x667C, + /* Array index: 0x1047 */ 0x96FA,0x667D, + /* Array index: 0x1047 */ 0x9702,0x667E, + /* Array index: 0x1047 */ 0x9703,0x6721, + /* Array index: 0x1047 */ 0x9705,0x6722, + /* Array index: 0x1047 */ 0x9709,0x6723, + /* Array index: 0x1047 */ 0x971A,0x6724, + /* Array index: 0x1047 */ 0x971B,0x6725, + /* Array index: 0x1047 */ 0x971D,0x6726, + /* Array index: 0x1047 */ 0x9728,0x672A, + /* Array index: 0x1047 */ 0x9731,0x672B, + /* Array index: 0x1047 */ 0x9733,0x672C, + /* Array index: 0x1047 */ 0x9741,0x672D, + /* Array index: 0x1047 */ 0x9743,0x672E, + /* Array index: 0x1047 */ 0x974A,0x672F, + /* Array index: 0x1047 */ 0x974E,0x6730, + /* Array index: 0x1047 */ 0x974F,0x6731, + /* Array index: 0x1047 */ 0x9755,0x6732, + /* Array index: 0x1047 */ 0x9763,0x6737, + /* Array index: 0x1047 */ 0x9767,0x6738, + /* Array index: 0x1047 */ 0x976A,0x6739, + /* Array index: 0x1047 */ 0x976E,0x673A, + /* Array index: 0x1047 */ 0x9773,0x673B, + /* Array index: 0x1047 */ 0x977B,0x673F, + /* Array index: 0x1047 */ 0x977D,0x6740, + /* Array index: 0x1047 */ 0x977F,0x6741, + /* Array index: 0x1047 */ 0x9780,0x6742, + /* Array index: 0x1047 */ 0x9789,0x6743, + /* Array index: 0x1047 */ 0x979E,0x6749, + /* Array index: 0x1047 */ 0x979F,0x674A, + /* Array index: 0x1047 */ 0x97A2,0x674B, + /* Array index: 0x1047 */ 0x97AC,0x674C, + /* Array index: 0x1047 */ 0x97AE,0x674D, + /* Array index: 0x1047 */ 0x97B1,0x674E, + /* Array index: 0x1047 */ 0x97B2,0x674F, + /* Array index: 0x1047 */ 0x97D4,0x6763, + /* Array index: 0x1047 */ 0x97E4,0x676C, + /* Array index: 0x1047 */ 0x97EF,0x676D, + /* Array index: 0x1047 */ 0x97F1,0x676E, + /* Array index: 0x1047 */ 0x97F4,0x676F, + /* Array index: 0x1047 */ 0x97F7,0x6770, + /* Array index: 0x1047 */ 0x97F8,0x6771, + /* Array index: 0x1047 */ 0x97FA,0x6772, + /* Array index: 0x1047 */ 0x9807,0x6773, + /* Array index: 0x1047 */ 0x980A,0x6774, + /* Array index: 0x1047 */ 0x980D,0x6776, + /* Array index: 0x1047 */ 0x980E,0x6777, + /* Array index: 0x1047 */ 0x9814,0x6778, + /* Array index: 0x1047 */ 0x9816,0x6779, + /* Array index: 0x1047 */ 0x9819,0x6775, + /* Array index: 0x1047 */ 0x981C,0x677A, + /* Array index: 0x1047 */ 0x981E,0x677B, + /* Array index: 0x1047 */ 0x9820,0x677C, + /* Array index: 0x1047 */ 0x9823,0x677D, + /* Array index: 0x1047 */ 0x9825,0x6828, + /* Array index: 0x1047 */ 0x9826,0x677E, + /* Array index: 0x1047 */ 0x982B,0x6821, + /* Array index: 0x1047 */ 0x983E,0x6829, + /* Array index: 0x1047 */ 0x9844,0x682A, + /* Array index: 0x1047 */ 0x9847,0x682B, + /* Array index: 0x1047 */ 0x984A,0x682C, + /* Array index: 0x1047 */ 0x986A,0x6838, + /* Array index: 0x1047 */ 0x986C,0x6839, + /* Array index: 0x1047 */ 0x98AB,0x683A, + /* Array index: 0x1047 */ 0x98AD,0x683B, + /* Array index: 0x1047 */ 0x98AE,0x683C, + /* Array index: 0x1047 */ 0x98B0,0x683D, + /* Array index: 0x1047 */ 0x98B4,0x683E, + /* Array index: 0x1047 */ 0x98BF,0x6843, + /* Array index: 0x1047 */ 0x98C2,0x6844, + /* Array index: 0x1047 */ 0x98C5,0x6845, + /* Array index: 0x1047 */ 0x98C8,0x6846, + /* Array index: 0x1047 */ 0x98CC,0x6847, + /* Array index: 0x1047 */ 0x98E1,0x6848, + /* Array index: 0x1047 */ 0x98EA,0x684D, + /* Array index: 0x1047 */ 0x98F3,0x684E, + /* Array index: 0x1047 */ 0x98F6,0x684F, + /* Array index: 0x1047 */ 0x9902,0x6850, + /* Array index: 0x1047 */ 0x9907,0x6851, + /* Array index: 0x1047 */ 0x9908,0x6852, + /* Array index: 0x1047 */ 0x9911,0x6853, + /* Array index: 0x1047 */ 0x991F,0x685A, + /* Array index: 0x1047 */ 0x9922,0x685B, + /* Array index: 0x1047 */ 0x9926,0x685C, + /* Array index: 0x1047 */ 0x9927,0x685D, + /* Array index: 0x1047 */ 0x992B,0x685E, + /* Array index: 0x1047 */ 0x9940,0x6868, + /* Array index: 0x1047 */ 0x9941,0x6869, + /* Array index: 0x1047 */ 0x994D,0x686D, + /* Array index: 0x1047 */ 0x994E,0x686E, + /* Array index: 0x1047 */ 0x9954,0x686F, + /* Array index: 0x1047 */ 0x999B,0x6877, + /* Array index: 0x1047 */ 0x999D,0x6878, + /* Array index: 0x1047 */ 0x999F,0x6879, + /* Array index: 0x1047 */ 0x99A6,0x687A, + /* Array index: 0x1047 */ 0x99B5,0x687E, + /* Array index: 0x1047 */ 0x99B9,0x6921, + /* Array index: 0x1047 */ 0x99BA,0x6922, + /* Array index: 0x1047 */ 0x99BD,0x6923, + /* Array index: 0x1047 */ 0x99BF,0x6924, + /* Array index: 0x1047 */ 0x99C3,0x6925, + /* Array index: 0x1047 */ 0x99C9,0x6926, + /* Array index: 0x1047 */ 0x99D3,0x6927, + /* Array index: 0x1047 */ 0x99D4,0x6928, + /* Array index: 0x1047 */ 0x99D9,0x6929, + /* Array index: 0x1047 */ 0x99DA,0x692A, + /* Array index: 0x1047 */ 0x99DC,0x692B, + /* Array index: 0x1047 */ 0x99DE,0x692C, + /* Array index: 0x1047 */ 0x99E7,0x692D, + /* Array index: 0x1047 */ 0x99F0,0x6931, + /* Array index: 0x1047 */ 0x99F4,0x6932, + /* Array index: 0x1047 */ 0x99F5,0x6933, + /* Array index: 0x1047 */ 0x99F9,0x6934, + /* Array index: 0x1047 */ 0x99FD,0x6935, + /* Array index: 0x1047 */ 0x99FE,0x6936, + /* Array index: 0x1047 */ 0x9A0B,0x693A, + /* Array index: 0x1047 */ 0x9A0C,0x693B, + /* Array index: 0x1047 */ 0x9A10,0x693C, + /* Array index: 0x1047 */ 0x9A11,0x693D, + /* Array index: 0x1047 */ 0x9A16,0x693E, + /* Array index: 0x1047 */ 0x9A1E,0x693F, + /* Array index: 0x1047 */ 0x9A27,0x6944, + /* Array index: 0x1047 */ 0x9A2D,0x6945, + /* Array index: 0x1047 */ 0x9A2E,0x6946, + /* Array index: 0x1047 */ 0x9A33,0x6947, + /* Array index: 0x1047 */ 0x9A35,0x6948, + /* Array index: 0x1047 */ 0x9A36,0x6949, + /* Array index: 0x1047 */ 0x9A38,0x694A, + /* Array index: 0x1047 */ 0x9A41,0x694C, + /* Array index: 0x1047 */ 0x9A44,0x694D, + /* Array index: 0x1047 */ 0x9A47,0x694B, + /* Array index: 0x1047 */ 0x9A51,0x6952, + /* Array index: 0x1047 */ 0x9A54,0x6953, + /* Array index: 0x1047 */ 0x9A56,0x6954, + /* Array index: 0x1047 */ 0x9A5D,0x6955, + /* Array index: 0x1047 */ 0x9AAA,0x6956, + /* Array index: 0x1047 */ 0x9AAC,0x6957, + /* Array index: 0x1047 */ 0x9AAE,0x6958, + /* Array index: 0x1047 */ 0x9AAF,0x6959, + /* Array index: 0x1047 */ 0x9AB9,0x695E, + /* Array index: 0x1047 */ 0x9ABB,0x695F, + /* Array index: 0x1047 */ 0x9ABE,0x6960, + /* Array index: 0x1047 */ 0x9ABF,0x6961, + /* Array index: 0x1047 */ 0x9AC1,0x6962, + /* Array index: 0x1047 */ 0x9AC3,0x6963, + /* Array index: 0x1047 */ 0x9AC6,0x6964, + /* Array index: 0x1047 */ 0x9AC8,0x6965, + /* Array index: 0x1047 */ 0x9ACE,0x6966, + /* Array index: 0x1047 */ 0x9AD0,0x6967, + /* Array index: 0x1047 */ 0x9AD2,0x6968, + /* Array index: 0x1047 */ 0x9ADB,0x696C, + /* Array index: 0x1047 */ 0x9ADC,0x696D, + /* Array index: 0x1047 */ 0x9AE0,0x696E, + /* Array index: 0x1047 */ 0x9AE4,0x696F, + /* Array index: 0x1047 */ 0x9AE5,0x6970, + /* Array index: 0x1047 */ 0x9AE7,0x6971, + /* Array index: 0x1047 */ 0x9AE9,0x6972, + /* Array index: 0x1047 */ 0x9AEC,0x6973, + /* Array index: 0x1047 */ 0x9AF2,0x6974, + /* Array index: 0x1047 */ 0x9AF3,0x6975, + /* Array index: 0x1047 */ 0x9AF5,0x6976, + /* Array index: 0x1047 */ 0x9AF9,0x6977, + /* Array index: 0x1047 */ 0x9AFA,0x6978, + /* Array index: 0x1047 */ 0x9B16,0x6A2B, + /* Array index: 0x1047 */ 0x9B19,0x6A2C, + /* Array index: 0x1047 */ 0x9B1B,0x6A2D, + /* Array index: 0x1047 */ 0x9B1C,0x6A2E, + /* Array index: 0x1047 */ 0x9B20,0x6A2F, + /* Array index: 0x1047 */ 0x9B26,0x6A30, + /* Array index: 0x1047 */ 0x9B2B,0x6A31, + /* Array index: 0x1047 */ 0x9B2D,0x6A32, + /* Array index: 0x1047 */ 0x9B3D,0x6A39, + /* Array index: 0x1047 */ 0x9B48,0x6A3A, + /* Array index: 0x1047 */ 0x9B4B,0x6A3B, + /* Array index: 0x1047 */ 0x9B4C,0x6A3C, + /* Array index: 0x1047 */ 0x9B5B,0x6A40, + /* Array index: 0x1047 */ 0x9B5E,0x6A41, + /* Array index: 0x1047 */ 0x9B61,0x6A42, + /* Array index: 0x1047 */ 0x9B63,0x6A43, + /* Array index: 0x1047 */ 0x9B65,0x6A44, + /* Array index: 0x1047 */ 0x9B66,0x6A45, + /* Array index: 0x1047 */ 0x9B73,0x6A4C, + /* Array index: 0x1047 */ 0x9B7F,0x6A51, + /* Array index: 0x1047 */ 0x9B80,0x6A52, + /* Array index: 0x1047 */ 0x9B94,0x6A5D, + /* Array index: 0x1047 */ 0x9B9A,0x6A5E, + /* Array index: 0x1047 */ 0x9B9D,0x6A5F, + /* Array index: 0x1047 */ 0x9B9E,0x6A60, + /* Array index: 0x1047 */ 0x9BA6,0x6A61, + /* Array index: 0x1047 */ 0x9BA7,0x6A62, + /* Array index: 0x1047 */ 0x9BA9,0x6A63, + /* Array index: 0x1047 */ 0x9BAC,0x6A64, + /* Array index: 0x1047 */ 0x9BB7,0x6A68, + /* Array index: 0x1047 */ 0x9BB8,0x6A69, + /* Array index: 0x1047 */ 0x9BC7,0x6A6F, + /* Array index: 0x1047 */ 0x9BC8,0x6A70, + /* Array index: 0x1047 */ 0x9BCE,0x6A71, + /* Array index: 0x1047 */ 0x9BD0,0x6A72, + /* Array index: 0x1047 */ 0x9BD7,0x6A73, + /* Array index: 0x1047 */ 0x9BD8,0x6A74, + /* Array index: 0x1047 */ 0x9BDD,0x6A75, + /* Array index: 0x1047 */ 0x9BDF,0x6A76, + /* Array index: 0x1047 */ 0x9BE5,0x6A77, + /* Array index: 0x1047 */ 0x9BE7,0x6A78, + /* Array index: 0x1047 */ 0x9BEA,0x6A79, + /* Array index: 0x1047 */ 0x9BEB,0x6A7A, + /* Array index: 0x1047 */ 0x9BEF,0x6A7B, + /* Array index: 0x1047 */ 0x9BF3,0x6A7C, + /* Array index: 0x1047 */ 0x9BFD,0x6B23, + /* Array index: 0x1047 */ 0x9BFF,0x6B24, + /* Array index: 0x1047 */ 0x9C00,0x6B25, + /* Array index: 0x1047 */ 0x9C02,0x6B26, + /* Array index: 0x1047 */ 0x9C0B,0x6B27, + /* Array index: 0x1047 */ 0x9C0F,0x6B28, + /* Array index: 0x1047 */ 0x9C11,0x6B29, + /* Array index: 0x1047 */ 0x9C31,0x6B37, + /* Array index: 0x1047 */ 0x9C3D,0x6B3B, + /* Array index: 0x1047 */ 0x9C49,0x6B40, + /* Array index: 0x1047 */ 0x9C4A,0x6B41, + /* Array index: 0x1047 */ 0x9C63,0x6B4D, + /* Array index: 0x1047 */ 0x9C6E,0x6B53, + /* Array index: 0x1047 */ 0x9C70,0x6B54, + /* Array index: 0x1047 */ 0x9C72,0x6B55, + /* Array index: 0x1047 */ 0x9C75,0x6B56, + /* Array index: 0x1047 */ 0x9C77,0x6B57, + /* Array index: 0x1047 */ 0x9C7B,0x6B58, + /* Array index: 0x1047 */ 0x9CE6,0x6B59, + /* Array index: 0x1047 */ 0x9CF2,0x6B5A, + /* Array index: 0x1047 */ 0x9CF7,0x6B5B, + /* Array index: 0x1047 */ 0x9CF9,0x6B5C, + /* Array index: 0x1047 */ 0x9D02,0x6B5E, + /* Array index: 0x1047 */ 0x9D0B,0x6B5D, + /* Array index: 0x1047 */ 0x9D11,0x6B5F, + /* Array index: 0x1047 */ 0x9D17,0x6B60, + /* Array index: 0x1047 */ 0x9D18,0x6B61, + /* Array index: 0x1047 */ 0x9D3A,0x6B6A, + /* Array index: 0x1047 */ 0x9D3C,0x6B6B, + /* Array index: 0x1047 */ 0x9D3D,0x6B6D, + /* Array index: 0x1047 */ 0x9D42,0x6B6E, + /* Array index: 0x1047 */ 0x9D43,0x6B6F, + /* Array index: 0x1047 */ 0x9D45,0x6B6C, + /* Array index: 0x1047 */ 0x9D47,0x6B70, + /* Array index: 0x1047 */ 0x9D4A,0x6B71, + /* Array index: 0x1047 */ 0x9D53,0x6B72, + /* Array index: 0x1047 */ 0x9D54,0x6B73, + /* Array index: 0x1047 */ 0x9D5F,0x6B74, + /* Array index: 0x1047 */ 0x9D62,0x6B76, + /* Array index: 0x1047 */ 0x9D63,0x6B75, + /* Array index: 0x1047 */ 0x9D65,0x6B77, + /* Array index: 0x1047 */ 0x9D70,0x6B7B, + /* Array index: 0x1047 */ 0x9D76,0x6B7C, + /* Array index: 0x1047 */ 0x9D77,0x6B7D, + /* Array index: 0x1047 */ 0x9D7B,0x6B7E, + /* Array index: 0x1047 */ 0x9D7C,0x6C21, + /* Array index: 0x1047 */ 0x9D7E,0x6C22, + /* Array index: 0x1047 */ 0x9D83,0x6C23, + /* Array index: 0x1047 */ 0x9D84,0x6C24, + /* Array index: 0x1047 */ 0x9D86,0x6C25, + /* Array index: 0x1047 */ 0x9D8A,0x6C26, + /* Array index: 0x1047 */ 0x9D8D,0x6C27, + /* Array index: 0x1047 */ 0x9D8E,0x6C28, + /* Array index: 0x1047 */ 0x9DA1,0x6C2F, + /* Array index: 0x1047 */ 0x9DAA,0x6C30, + /* Array index: 0x1047 */ 0x9DAC,0x6C31, + /* Array index: 0x1047 */ 0x9DAE,0x6C32, + /* Array index: 0x1047 */ 0x9DB1,0x6C33, + /* Array index: 0x1047 */ 0x9DB5,0x6C34, + /* Array index: 0x1047 */ 0x9DB9,0x6C35, + /* Array index: 0x1047 */ 0x9DBC,0x6C36, + /* Array index: 0x1047 */ 0x9DBF,0x6C37, + /* Array index: 0x1047 */ 0x9DC3,0x6C38, + /* Array index: 0x1047 */ 0x9DC7,0x6C39, + /* Array index: 0x1047 */ 0x9DC9,0x6C3A, + /* Array index: 0x1047 */ 0x9DCA,0x6C3B, + /* Array index: 0x1047 */ 0x9DDA,0x6C40, + /* Array index: 0x1047 */ 0x9DE5,0x6C44, + /* Array index: 0x1047 */ 0x9DE7,0x6C45, + /* Array index: 0x1047 */ 0x9DE9,0x6C46, + /* Array index: 0x1047 */ 0x9DEB,0x6C47, + /* Array index: 0x1047 */ 0x9DEE,0x6C48, + /* Array index: 0x1047 */ 0x9DF0,0x6C49, + /* Array index: 0x1047 */ 0x9DF3,0x6C4A, + /* Array index: 0x1047 */ 0x9DF4,0x6C4B, + /* Array index: 0x1047 */ 0x9DFE,0x6C4C, + /* Array index: 0x1047 */ 0x9E02,0x6C4E, + /* Array index: 0x1047 */ 0x9E07,0x6C4F, + /* Array index: 0x1047 */ 0x9E0A,0x6C4D, + /* Array index: 0x1047 */ 0x9E19,0x6C56, + /* Array index: 0x1047 */ 0x9E1C,0x6C57, + /* Array index: 0x1047 */ 0x9E1D,0x6C58, + /* Array index: 0x1047 */ 0x9E8E,0x6C62, + /* Array index: 0x1047 */ 0x9E8F,0x6C63, + /* Array index: 0x1047 */ 0x9E96,0x6C64, + /* Array index: 0x1047 */ 0x9E98,0x6C65, + /* Array index: 0x1047 */ 0x9E9B,0x6C66, + /* Array index: 0x1047 */ 0x9E9E,0x6C67, + /* Array index: 0x1047 */ 0x9EA4,0x6C68, + /* Array index: 0x1047 */ 0x9EA8,0x6C69, + /* Array index: 0x1047 */ 0x9EC6,0x6C71, + /* Array index: 0x1047 */ 0x9EC8,0x6C72, + /* Array index: 0x1047 */ 0x9ECB,0x6C73, + /* Array index: 0x1047 */ 0x9ED5,0x6C74, + /* Array index: 0x1047 */ 0x9EDF,0x6C75, + /* Array index: 0x1047 */ 0x9EE4,0x6C76, + /* Array index: 0x1047 */ 0x9EE7,0x6C77, + /* Array index: 0x1047 */ 0x9EF5,0x6C7E, + /* Array index: 0x1047 */ 0x9EF8,0x6D21, + /* Array index: 0x1047 */ 0x9EFF,0x6D22, + /* Array index: 0x1047 */ 0x9F02,0x6D23, + /* Array index: 0x1047 */ 0x9F03,0x6D24, + /* Array index: 0x1047 */ 0x9F09,0x6D25, + /* Array index: 0x1047 */ 0x9F1F,0x6D30, + /* Array index: 0x1047 */ 0x9F22,0x6D31, + /* Array index: 0x1047 */ 0x9F26,0x6D32, + /* Array index: 0x1047 */ 0x9F2A,0x6D33, + /* Array index: 0x1047 */ 0x9F2B,0x6D34, + /* Array index: 0x1047 */ 0x9F2F,0x6D35, + /* Array index: 0x1047 */ 0x9F31,0x6D36, + /* Array index: 0x1047 */ 0x9F32,0x6D37, + /* Array index: 0x1047 */ 0x9F34,0x6D38, + /* Array index: 0x1047 */ 0x9F37,0x6D39, + /* Array index: 0x1047 */ 0x9F68,0x6D4D, + /* Array index: 0x1047 */ 0x9F69,0x6D4E, + /* Array index: 0x1047 */ 0x9F7A,0x6D56, + /* Array index: 0x1047 */ 0x9F7D,0x6D57, + /* Array index: 0x1047 */ 0x9F9E,0x6D5F, +}; + +#endif /* ICONV_FROM_UCS_CCS_JIS_X0212_1990 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * jis_x0212_1990 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_jis_x0212_1990 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_JIS_X0212_1990, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_jis_x0212_1990, /* UCS -> jis_x0212_1990 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_JIS_X0212_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_jis_x0212_1990, /* UCS -> jis_x0212_1990 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_jis_x0212_1990 /* jis_x0212_1990 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_JIS_X0212_1990) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_jis_x0212_1990 /* jis_x0212_1990 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_JIS_X0212_1990) || ... */ + diff --git a/lib/iconv/ccs/koi8_r.c b/lib/iconv/ccs/koi8_r.c new file mode 100644 index 0000000..698652e --- /dev/null +++ b/lib/iconv/ccs/koi8_r.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for koi8_r encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_KOI8_R) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_R) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit koi8_r -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_KOI8_R) + +static const __uint16_t +to_ucs_speed_koi8_r[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524, + 0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590, + 0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248, + 0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7, + 0x2550,0x2551,0x2552,0x0451,0x2553,0x2554,0x2555,0x2556, + 0x2557,0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E, + 0x255F,0x2560,0x2561,0x0401,0x2562,0x2563,0x2564,0x2565, + 0x2566,0x2567,0x2568,0x2569,0x256A,0x256B,0x256C,0x00A9, + 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, + 0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, + 0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, + 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, + 0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, + 0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A, + +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_R */ + +/* + * 8-bit UCS -> koi8_r speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_KOI8_R) + +static const unsigned char +from_ucs_speed_koi8_r[] = +{ + W(0x042A), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(0x0402),W(0x0502), + W(INVBLK),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x9E, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xB3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA, + 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0, + 0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE, + 0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1, + 0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA, + 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0, + 0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE, + 0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1, + 0xFF,0xA3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 35, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x95,0x96,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x97,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x98,0x99,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 36, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x93,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0602 */ + 0x80,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x82,0xFF,0xFF,0xFF, + 0x83,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF, + 0x85,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x88,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x89,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xA4,0xA5,0xA6,0xA7,0xA8, + 0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0, + 0xB1,0xB2,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9, + 0xBA,0xBB,0xBC,0xBD,0xBE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8B,0xFF,0xFF,0xFF,0x8C,0xFF,0xFF,0xFF, + 0x8D,0xFF,0xFF,0xFF,0x8E,0xFF,0xFF,0xFF, + 0x8F,0x90,0x91,0x92,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x94,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_KOI8_R */ + +/* + * koi8_r CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_koi8_r = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_KOI8_R, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_KOI8_R) + (__uint16_t *)&from_ucs_speed_koi8_r, /* UCS -> koi8_r table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_KOI8_R) + (__uint16_t *)&to_ucs_speed_koi8_r /* koi8_r -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_R) || ... */ + diff --git a/lib/iconv/ccs/koi8_ru.c b/lib/iconv/ccs/koi8_ru.c new file mode 100644 index 0000000..956dc78 --- /dev/null +++ b/lib/iconv/ccs/koi8_ru.c @@ -0,0 +1,374 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for koi8_ru encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_KOI8_RU) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_RU) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit koi8_ru -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_KOI8_RU) + +static const __uint16_t +to_ucs_speed_koi8_ru[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524, + 0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590, + 0x2591,0x2592,0x2593,0x201C,0x25A0,0x2219,0x201D,0x2014, + 0x2116,0x2122,0x00A0,0x00BB,0x00AE,0x00AB,0x00B7,0x00A4, + 0x2550,0x2551,0x2552,0x0451,0x0454,0x2554,0x0456,0x0457, + 0x2557,0x2558,0x2559,0x255A,0x255B,0x0491,0x045E,0x255E, + 0x255F,0x2560,0x2561,0x0401,0x0404,0x2563,0x0406,0x0407, + 0x2566,0x2567,0x2568,0x2569,0x256A,0x0490,0x040E,0x00A9, + 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, + 0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, + 0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, + 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, + 0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, + 0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A, + +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_RU */ + +/* + * 8-bit UCS -> koi8_ru speed-optimized table (2050 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_KOI8_RU) + +static const unsigned char +from_ucs_speed_koi8_ru[] = +{ + W(0x042A), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(0x0502),W(0x0602),W(INVBLK), + W(INVBLK),W(0x0702),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9A,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF, + 0xFF,0xBF,0xFF,0x9D,0xFF,0xFF,0x9C,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9E, + 0xFF,0xFF,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xB3,0xFF,0xFF,0xB4,0xFF,0xB6,0xB7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBE,0xFF, + 0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA, + 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0, + 0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE, + 0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1, + 0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA, + 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0, + 0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE, + 0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1, + 0xFF,0xA3,0xFF,0xFF,0xA4,0xFF,0xA6,0xA7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xAE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xAD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x97,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x93,0x96,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x98,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 35, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0702 */ + 0x80,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x82,0xFF,0xFF,0xFF, + 0x83,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF, + 0x85,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x88,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x89,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xFF,0xA5,0xFF,0xFF,0xA8, + 0xA9,0xAA,0xAB,0xAC,0xFF,0xFF,0xAF,0xB0, + 0xB1,0xB2,0xFF,0xB5,0xFF,0xFF,0xB8,0xB9, + 0xBA,0xBB,0xBC,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8B,0xFF,0xFF,0xFF,0x8C,0xFF,0xFF,0xFF, + 0x8D,0xFF,0xFF,0xFF,0x8E,0xFF,0xFF,0xFF, + 0x8F,0x90,0x91,0x92,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x94,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_KOI8_RU */ + +/* + * koi8_ru CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_koi8_ru = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_KOI8_RU, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_KOI8_RU) + (__uint16_t *)&from_ucs_speed_koi8_ru, /* UCS -> koi8_ru table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_KOI8_RU) + (__uint16_t *)&to_ucs_speed_koi8_ru /* koi8_ru -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_RU) || ... */ + diff --git a/lib/iconv/ccs/koi8_u.c b/lib/iconv/ccs/koi8_u.c new file mode 100644 index 0000000..d271e7e --- /dev/null +++ b/lib/iconv/ccs/koi8_u.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for koi8_u encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_KOI8_U) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_U) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit koi8_u -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_KOI8_U) + +static const __uint16_t +to_ucs_speed_koi8_u[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524, + 0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590, + 0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248, + 0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7, + 0x2550,0x2551,0x2552,0x0451,0x0454,0x2554,0x0456,0x0457, + 0x2557,0x2558,0x2559,0x255A,0x255B,0x0491,0x255D,0x255E, + 0x255F,0x2560,0x2561,0x0401,0x0404,0x2563,0x0406,0x0407, + 0x2566,0x2567,0x2568,0x2569,0x256A,0x0490,0x256C,0x00A9, + 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, + 0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, + 0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, + 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, + 0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, + 0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A, + +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_U */ + +/* + * 8-bit UCS -> koi8_u speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_KOI8_U) + +static const unsigned char +from_ucs_speed_koi8_u[] = +{ + W(0x042A), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(0x0402),W(0x0502), + W(INVBLK),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9C,0xFF,0x9D,0xFF,0xFF,0xFF,0xFF,0x9E, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xB3,0xFF,0xFF,0xB4,0xFF,0xB6,0xB7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA, + 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0, + 0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE, + 0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1, + 0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA, + 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0, + 0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE, + 0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1, + 0xFF,0xA3,0xFF,0xFF,0xA4,0xFF,0xA6,0xA7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xAD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 35, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x95,0x96,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x97,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x98,0x99,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 36, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x93,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0602 */ + 0x80,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x82,0xFF,0xFF,0xFF, + 0x83,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF, + 0x85,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x88,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x89,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xFF,0xA5,0xFF,0xFF,0xA8, + 0xA9,0xAA,0xAB,0xAC,0xFF,0xAE,0xAF,0xB0, + 0xB1,0xB2,0xFF,0xB5,0xFF,0xFF,0xB8,0xB9, + 0xBA,0xBB,0xBC,0xFF,0xBE,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8B,0xFF,0xFF,0xFF,0x8C,0xFF,0xFF,0xFF, + 0x8D,0xFF,0xFF,0xFF,0x8E,0xFF,0xFF,0xFF, + 0x8F,0x90,0x91,0x92,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x94,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_KOI8_U */ + +/* + * koi8_u CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_koi8_u = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_KOI8_U, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_KOI8_U) + (__uint16_t *)&from_ucs_speed_koi8_u, /* UCS -> koi8_u table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_KOI8_U) + (__uint16_t *)&to_ucs_speed_koi8_u /* koi8_u -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_U) || ... */ + diff --git a/lib/iconv/ccs/koi8_uni.c b/lib/iconv/ccs/koi8_uni.c new file mode 100644 index 0000000..4523d1c --- /dev/null +++ b/lib/iconv/ccs/koi8_uni.c @@ -0,0 +1,374 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for koi8_uni encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_KOI8_UNI) \ + || defined (ICONV_FROM_UCS_CCS_KOI8_UNI) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit koi8_uni -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_KOI8_UNI) + +static const __uint16_t +to_ucs_speed_koi8_uni[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524, + 0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590, + 0x2591,0x2018,0x2019,0x201C,0x201D,0x2219,0x2013,0x2014, + 0x00A9,0x2122,0x00A0,0x00BB,0x00AE,0x00AB,0x00B7,0x00A4, + 0x00A0,0x0452,0x0453,0x0451,0x0454,0x0455,0x0456,0x0457, + 0x0458,0x0459,0x045A,0x045B,0x045C,0x0491,0x045E,0x045F, + 0x2116,0x0402,0x0403,0x0401,0x0404,0x0405,0x0406,0x0407, + 0x0408,0x0409,0x040A,0x040B,0x040C,0x0490,0x040E,0x040F, + 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433, + 0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432, + 0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A, + 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413, + 0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412, + 0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A, + +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_UNI */ + +/* + * 8-bit UCS -> koi8_uni speed-optimized table (2050 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_KOI8_UNI) + +static const unsigned char +from_ucs_speed_koi8_uni[] = +{ + W(0x042A), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(0x0502),W(0x0602),W(INVBLK), + W(INVBLK),W(0x0702),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9A,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF, + 0xFF,0x98,0xFF,0x9D,0xFF,0xFF,0x9C,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9E, + 0xFF,0xFF,0xFF,0x9B,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xB3,0xB1,0xB2,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xFF,0xBE,0xBF, + 0xE1,0xE2,0xF7,0xE7,0xE4,0xE5,0xF6,0xFA, + 0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0, + 0xF2,0xF3,0xF4,0xF5,0xE6,0xE8,0xE3,0xFE, + 0xFB,0xFD,0xFF,0xF9,0xF8,0xFC,0xE0,0xF1, + 0xC1,0xC2,0xD7,0xC7,0xC4,0xC5,0xD6,0xDA, + 0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0, + 0xD2,0xD3,0xD4,0xD5,0xC6,0xC8,0xC3,0xDE, + 0xDB,0xDD,0xDF,0xD9,0xD8,0xDC,0xC0,0xD1, + 0xFF,0xA3,0xA1,0xA2,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xFF,0xAE,0xAF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xBD,0xAD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0xFF,0xFF,0x93,0x94,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB0,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 35, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x95,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 38, Array index 0x0702 */ + 0x80,0xFF,0x81,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x82,0xFF,0xFF,0xFF, + 0x83,0xFF,0xFF,0xFF,0x84,0xFF,0xFF,0xFF, + 0x85,0xFF,0xFF,0xFF,0x86,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x87,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x88,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x89,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x8A,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8B,0xFF,0xFF,0xFF,0x8C,0xFF,0xFF,0xFF, + 0x8D,0xFF,0xFF,0xFF,0x8E,0xFF,0xFF,0xFF, + 0x8F,0x90,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_KOI8_UNI */ + +/* + * koi8_uni CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_koi8_uni = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_KOI8_UNI, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_KOI8_UNI) + (__uint16_t *)&from_ucs_speed_koi8_uni, /* UCS -> koi8_uni table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_KOI8_UNI) + (__uint16_t *)&to_ucs_speed_koi8_uni /* koi8_uni -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_KOI8_UNI) || ... */ + diff --git a/lib/iconv/ccs/ksx1001.c b/lib/iconv/ccs/ksx1001.c new file mode 100644 index 0000000..5690e4a --- /dev/null +++ b/lib/iconv/ccs/ksx1001.c @@ -0,0 +1,15612 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for ksx1001 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_KSX1001) \ + || defined (ICONV_FROM_UCS_CCS_KSX1001) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +/* + * 16-bit ksx1001 -> UCS speed-optimized table (46080 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_KSX1001) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_speed_ksx1001[] = +{ + /* Heading Block */ + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x0100,0x0200,0x0300,0x0400,0x0500,0x0600,0x0700, + 0x0800,0x0900,0x0A00,0x0B00,0x0C00,INVBLK,INVBLK,INVBLK, + 0x0D00,0x0E00,0x0F00,0x1000,0x1100,0x1200,0x1300,0x1400, + 0x1500,0x1600,0x1700,0x1800,0x1900,0x1A00,0x1B00,0x1C00, + 0x1D00,0x1E00,0x1F00,0x2000,0x2100,0x2200,0x2300,0x2400, + 0x2500,INVBLK,0x2600,0x2700,0x2800,0x2900,0x2A00,0x2B00, + 0x2C00,0x2D00,0x2E00,0x2F00,0x3000,0x3100,0x3200,0x3300, + 0x3400,0x3500,0x3600,0x3700,0x3800,0x3900,0x3A00,0x3B00, + 0x3C00,0x3D00,0x3E00,0x3F00,0x4000,0x4100,0x4200,0x4300, + 0x4400,0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00,0x4B00, + 0x4C00,0x4D00,0x4E00,0x4F00,0x5000,0x5100,0x5200,0x5300, + 0x5400,0x5500,0x5600,0x5700,0x5800,0x5900,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + /* Block 34, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3000,0x3001,0x3002,0x00B7,0x2025,0x2026,0x00A8, + 0x3003,0x00AD,0x2015,0x2225,0xFF3C,0x223C,0x2018,0x2019, + 0x201C,0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B, + 0x300C,0x300D,0x300E,0x300F,0x3010,0x3011,0x00B1,0x00D7, + 0x00F7,0x2260,0x2264,0x2265,0x221E,0x2234,0x00B0,0x2032, + 0x2033,0x2103,0x212B,0xFFE0,0xFFE1,0xFFE5,0x2642,0x2640, + 0x2220,0x22A5,0x2312,0x2202,0x2207,0x2261,0x2252,0x00A7, + 0x203B,0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7,0x25C6, + 0x25A1,0x25A0,0x25B3,0x25B2,0x25BD,0x25BC,0x2192,0x2190, + 0x2191,0x2193,0x2194,0x3013,0x226A,0x226B,0x221A,0x223D, + 0x221D,0x2235,0x222B,0x222C,0x2208,0x220B,0x2286,0x2287, + 0x2282,0x2283,0x222A,0x2229,0x2227,0x2228,0xFFE2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x21D2,0x21D4,0x2200,0x2203,0x00B4,0xFF5E,0x02C7, + 0x02D8,0x02DD,0x02DA,0x02D9,0x00B8,0x02DB,0x00A1,0x00BF, + 0x02D0,0x222E,0x2211,0x220F,0x00A4,0x2109,0x2030,0x25C1, + 0x25C0,0x25B7,0x25B6,0x2664,0x2660,0x2661,0x2665,0x2667, + 0x2663,0x2299,0x25C8,0x25A3,0x25D0,0x25D1,0x2592,0x25A4, + 0x25A5,0x25A8,0x25A7,0x25A6,0x25A9,0x2668,0x260F,0x260E, + 0x261C,0x261E,0x00B6,0x2020,0x2021,0x2195,0x2197,0x2199, + 0x2196,0x2198,0x266D,0x2669,0x266A,0x266C,0x327F,0x321C, + 0x2116,0x33C7,0x2122,0x33C2,0x33D8,0x2121,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFF01,0xFF02,0xFF03,0xFF04,0xFF05,0xFF06,0xFF07, + 0xFF08,0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F, + 0xFF10,0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17, + 0xFF18,0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F, + 0xFF20,0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27, + 0xFF28,0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F, + 0xFF30,0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37, + 0xFF38,0xFF39,0xFF3A,0xFF3B,0xFFE6,0xFF3D,0xFF3E,0xFF3F, + 0xFF40,0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47, + 0xFF48,0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F, + 0xFF50,0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57, + 0xFF58,0xFF59,0xFF5A,0xFF5B,0xFF5C,0xFF5D,0xFFE3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3131,0x3132,0x3133,0x3134,0x3135,0x3136,0x3137, + 0x3138,0x3139,0x313A,0x313B,0x313C,0x313D,0x313E,0x313F, + 0x3140,0x3141,0x3142,0x3143,0x3144,0x3145,0x3146,0x3147, + 0x3148,0x3149,0x314A,0x314B,0x314C,0x314D,0x314E,0x314F, + 0x3150,0x3151,0x3152,0x3153,0x3154,0x3155,0x3156,0x3157, + 0x3158,0x3159,0x315A,0x315B,0x315C,0x315D,0x315E,0x315F, + 0x3160,0x3161,0x3162,0x3163,0x3164,0x3165,0x3166,0x3167, + 0x3168,0x3169,0x316A,0x316B,0x316C,0x316D,0x316E,0x316F, + 0x3170,0x3171,0x3172,0x3173,0x3174,0x3175,0x3176,0x3177, + 0x3178,0x3179,0x317A,0x317B,0x317C,0x317D,0x317E,0x317F, + 0x3180,0x3181,0x3182,0x3183,0x3184,0x3185,0x3186,0x3187, + 0x3188,0x3189,0x318A,0x318B,0x318C,0x318D,0x318E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176, + 0x2177,0x2178,0x2179,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, + 0x2168,0x2169,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, + 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8, + 0x03A9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7, + 0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF, + 0x03C0,0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8, + 0x03C9,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2500,0x2502,0x250C,0x2510,0x2518,0x2514,0x251C, + 0x252C,0x2524,0x2534,0x253C,0x2501,0x2503,0x250F,0x2513, + 0x251B,0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,0x2520, + 0x252F,0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538, + 0x2542,0x2512,0x2511,0x251A,0x2519,0x2516,0x2515,0x250E, + 0x250D,0x251E,0x251F,0x2521,0x2522,0x2526,0x2527,0x2529, + 0x252A,0x252D,0x252E,0x2531,0x2532,0x2535,0x2536,0x2539, + 0x253A,0x253D,0x253E,0x2540,0x2541,0x2543,0x2544,0x2545, + 0x2546,0x2547,0x2548,0x2549,0x254A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 40, Array index 0x0700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3395,0x3396,0x3397,0x2113,0x3398,0x33C4,0x33A3, + 0x33A4,0x33A5,0x33A6,0x3399,0x339A,0x339B,0x339C,0x339D, + 0x339E,0x339F,0x33A0,0x33A1,0x33A2,0x33CA,0x338D,0x338E, + 0x338F,0x33CF,0x3388,0x3389,0x33C8,0x33A7,0x33A8,0x33B0, + 0x33B1,0x33B2,0x33B3,0x33B4,0x33B5,0x33B6,0x33B7,0x33B8, + 0x33B9,0x3380,0x3381,0x3382,0x3383,0x3384,0x33BA,0x33BB, + 0x33BC,0x33BD,0x33BE,0x33BF,0x3390,0x3391,0x3392,0x3393, + 0x3394,0x2126,0x33C0,0x33C1,0x338A,0x338B,0x338C,0x33D6, + 0x33C5,0x33AD,0x33AE,0x33AF,0x33DB,0x33A9,0x33AA,0x33AB, + 0x33AC,0x33DD,0x33D0,0x33D3,0x33C3,0x33C9,0x33DC,0x33C6, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 41, Array index 0x0800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x00C6,0x00D0,0x00AA,0x0126,INVALC,0x0132,INVALC, + 0x013F,0x0141,0x00D8,0x0152,0x00BA,0x00DE,0x0166,0x014A, + INVALC,0x3260,0x3261,0x3262,0x3263,0x3264,0x3265,0x3266, + 0x3267,0x3268,0x3269,0x326A,0x326B,0x326C,0x326D,0x326E, + 0x326F,0x3270,0x3271,0x3272,0x3273,0x3274,0x3275,0x3276, + 0x3277,0x3278,0x3279,0x327A,0x327B,0x24D0,0x24D1,0x24D2, + 0x24D3,0x24D4,0x24D5,0x24D6,0x24D7,0x24D8,0x24D9,0x24DA, + 0x24DB,0x24DC,0x24DD,0x24DE,0x24DF,0x24E0,0x24E1,0x24E2, + 0x24E3,0x24E4,0x24E5,0x24E6,0x24E7,0x24E8,0x24E9,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468, + 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x00BD,0x2153, + 0x2154,0x00BC,0x00BE,0x215B,0x215C,0x215D,0x215E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 42, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x00E6,0x0111,0x00F0,0x0127,0x0131,0x0133,0x0138, + 0x0140,0x0142,0x00F8,0x0153,0x00DF,0x00FE,0x0167,0x014B, + 0x0149,0x3200,0x3201,0x3202,0x3203,0x3204,0x3205,0x3206, + 0x3207,0x3208,0x3209,0x320A,0x320B,0x320C,0x320D,0x320E, + 0x320F,0x3210,0x3211,0x3212,0x3213,0x3214,0x3215,0x3216, + 0x3217,0x3218,0x3219,0x321A,0x321B,0x249C,0x249D,0x249E, + 0x249F,0x24A0,0x24A1,0x24A2,0x24A3,0x24A4,0x24A5,0x24A6, + 0x24A7,0x24A8,0x24A9,0x24AA,0x24AB,0x24AC,0x24AD,0x24AE, + 0x24AF,0x24B0,0x24B1,0x24B2,0x24B3,0x24B4,0x24B5,0x2474, + 0x2475,0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C, + 0x247D,0x247E,0x247F,0x2480,0x2481,0x2482,0x00B9,0x00B2, + 0x00B3,0x2074,0x207F,0x2081,0x2082,0x2083,0x2084,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 43, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047, + 0x3048,0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F, + 0x3050,0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057, + 0x3058,0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F, + 0x3060,0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067, + 0x3068,0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F, + 0x3070,0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077, + 0x3078,0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F, + 0x3080,0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087, + 0x3088,0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F, + 0x3090,0x3091,0x3092,0x3093,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 44, Array index 0x0B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7, + 0x30A8,0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF, + 0x30B0,0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7, + 0x30B8,0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF, + 0x30C0,0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7, + 0x30C8,0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF, + 0x30D0,0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7, + 0x30D8,0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF, + 0x30E0,0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7, + 0x30E8,0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF, + 0x30F0,0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 45, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401, + 0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D, + 0x041E,0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425, + 0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D, + 0x042E,0x042F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451, + 0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D, + 0x043E,0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445, + 0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D, + 0x044E,0x044F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xAC00,0xAC01,0xAC04,0xAC07,0xAC08,0xAC09,0xAC0A, + 0xAC10,0xAC11,0xAC12,0xAC13,0xAC14,0xAC15,0xAC16,0xAC17, + 0xAC19,0xAC1A,0xAC1B,0xAC1C,0xAC1D,0xAC20,0xAC24,0xAC2C, + 0xAC2D,0xAC2F,0xAC30,0xAC31,0xAC38,0xAC39,0xAC3C,0xAC40, + 0xAC4B,0xAC4D,0xAC54,0xAC58,0xAC5C,0xAC70,0xAC71,0xAC74, + 0xAC77,0xAC78,0xAC7A,0xAC80,0xAC81,0xAC83,0xAC84,0xAC85, + 0xAC86,0xAC89,0xAC8A,0xAC8B,0xAC8C,0xAC90,0xAC94,0xAC9C, + 0xAC9D,0xAC9F,0xACA0,0xACA1,0xACA8,0xACA9,0xACAA,0xACAC, + 0xACAF,0xACB0,0xACB8,0xACB9,0xACBB,0xACBC,0xACBD,0xACC1, + 0xACC4,0xACC8,0xACCC,0xACD5,0xACD7,0xACE0,0xACE1,0xACE4, + 0xACE7,0xACE8,0xACEA,0xACEC,0xACEF,0xACF0,0xACF1,0xACF3, + 0xACF5,0xACF6,0xACFC,0xACFD,0xAD00,0xAD04,0xAD06,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xAD0C,0xAD0D,0xAD0F,0xAD11,0xAD18,0xAD1C,0xAD20, + 0xAD29,0xAD2C,0xAD2D,0xAD34,0xAD35,0xAD38,0xAD3C,0xAD44, + 0xAD45,0xAD47,0xAD49,0xAD50,0xAD54,0xAD58,0xAD61,0xAD63, + 0xAD6C,0xAD6D,0xAD70,0xAD73,0xAD74,0xAD75,0xAD76,0xAD7B, + 0xAD7C,0xAD7D,0xAD7F,0xAD81,0xAD82,0xAD88,0xAD89,0xAD8C, + 0xAD90,0xAD9C,0xAD9D,0xADA4,0xADB7,0xADC0,0xADC1,0xADC4, + 0xADC8,0xADD0,0xADD1,0xADD3,0xADDC,0xADE0,0xADE4,0xADF8, + 0xADF9,0xADFC,0xADFF,0xAE00,0xAE01,0xAE08,0xAE09,0xAE0B, + 0xAE0D,0xAE14,0xAE30,0xAE31,0xAE34,0xAE37,0xAE38,0xAE3A, + 0xAE40,0xAE41,0xAE43,0xAE45,0xAE46,0xAE4A,0xAE4C,0xAE4D, + 0xAE4E,0xAE50,0xAE54,0xAE56,0xAE5C,0xAE5D,0xAE5F,0xAE60, + 0xAE61,0xAE65,0xAE68,0xAE69,0xAE6C,0xAE70,0xAE78,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x0F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xAE79,0xAE7B,0xAE7C,0xAE7D,0xAE84,0xAE85,0xAE8C, + 0xAEBC,0xAEBD,0xAEBE,0xAEC0,0xAEC4,0xAECC,0xAECD,0xAECF, + 0xAED0,0xAED1,0xAED8,0xAED9,0xAEDC,0xAEE8,0xAEEB,0xAEED, + 0xAEF4,0xAEF8,0xAEFC,0xAF07,0xAF08,0xAF0D,0xAF10,0xAF2C, + 0xAF2D,0xAF30,0xAF32,0xAF34,0xAF3C,0xAF3D,0xAF3F,0xAF41, + 0xAF42,0xAF43,0xAF48,0xAF49,0xAF50,0xAF5C,0xAF5D,0xAF64, + 0xAF65,0xAF79,0xAF80,0xAF84,0xAF88,0xAF90,0xAF91,0xAF95, + 0xAF9C,0xAFB8,0xAFB9,0xAFBC,0xAFC0,0xAFC7,0xAFC8,0xAFC9, + 0xAFCB,0xAFCD,0xAFCE,0xAFD4,0xAFDC,0xAFE8,0xAFE9,0xAFF0, + 0xAFF1,0xAFF4,0xAFF8,0xB000,0xB001,0xB004,0xB00C,0xB010, + 0xB014,0xB01C,0xB01D,0xB028,0xB044,0xB045,0xB048,0xB04A, + 0xB04C,0xB04E,0xB053,0xB054,0xB055,0xB057,0xB059,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB05D,0xB07C,0xB07D,0xB080,0xB084,0xB08C,0xB08D, + 0xB08F,0xB091,0xB098,0xB099,0xB09A,0xB09C,0xB09F,0xB0A0, + 0xB0A1,0xB0A2,0xB0A8,0xB0A9,0xB0AB,0xB0AC,0xB0AD,0xB0AE, + 0xB0AF,0xB0B1,0xB0B3,0xB0B4,0xB0B5,0xB0B8,0xB0BC,0xB0C4, + 0xB0C5,0xB0C7,0xB0C8,0xB0C9,0xB0D0,0xB0D1,0xB0D4,0xB0D8, + 0xB0E0,0xB0E5,0xB108,0xB109,0xB10B,0xB10C,0xB110,0xB112, + 0xB113,0xB118,0xB119,0xB11B,0xB11C,0xB11D,0xB123,0xB124, + 0xB125,0xB128,0xB12C,0xB134,0xB135,0xB137,0xB138,0xB139, + 0xB140,0xB141,0xB144,0xB148,0xB150,0xB151,0xB154,0xB155, + 0xB158,0xB15C,0xB160,0xB178,0xB179,0xB17C,0xB180,0xB182, + 0xB188,0xB189,0xB18B,0xB18D,0xB192,0xB193,0xB194,0xB198, + 0xB19C,0xB1A8,0xB1CC,0xB1D0,0xB1D4,0xB1DC,0xB1DD,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 53, Array index 0x1100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB1DF,0xB1E8,0xB1E9,0xB1EC,0xB1F0,0xB1F9,0xB1FB, + 0xB1FD,0xB204,0xB205,0xB208,0xB20B,0xB20C,0xB214,0xB215, + 0xB217,0xB219,0xB220,0xB234,0xB23C,0xB258,0xB25C,0xB260, + 0xB268,0xB269,0xB274,0xB275,0xB27C,0xB284,0xB285,0xB289, + 0xB290,0xB291,0xB294,0xB298,0xB299,0xB29A,0xB2A0,0xB2A1, + 0xB2A3,0xB2A5,0xB2A6,0xB2AA,0xB2AC,0xB2B0,0xB2B4,0xB2C8, + 0xB2C9,0xB2CC,0xB2D0,0xB2D2,0xB2D8,0xB2D9,0xB2DB,0xB2DD, + 0xB2E2,0xB2E4,0xB2E5,0xB2E6,0xB2E8,0xB2EB,0xB2EC,0xB2ED, + 0xB2EE,0xB2EF,0xB2F3,0xB2F4,0xB2F5,0xB2F7,0xB2F8,0xB2F9, + 0xB2FA,0xB2FB,0xB2FF,0xB300,0xB301,0xB304,0xB308,0xB310, + 0xB311,0xB313,0xB314,0xB315,0xB31C,0xB354,0xB355,0xB356, + 0xB358,0xB35B,0xB35C,0xB35E,0xB35F,0xB364,0xB365,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 54, Array index 0x1200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB367,0xB369,0xB36B,0xB36E,0xB370,0xB371,0xB374, + 0xB378,0xB380,0xB381,0xB383,0xB384,0xB385,0xB38C,0xB390, + 0xB394,0xB3A0,0xB3A1,0xB3A8,0xB3AC,0xB3C4,0xB3C5,0xB3C8, + 0xB3CB,0xB3CC,0xB3CE,0xB3D0,0xB3D4,0xB3D5,0xB3D7,0xB3D9, + 0xB3DB,0xB3DD,0xB3E0,0xB3E4,0xB3E8,0xB3FC,0xB410,0xB418, + 0xB41C,0xB420,0xB428,0xB429,0xB42B,0xB434,0xB450,0xB451, + 0xB454,0xB458,0xB460,0xB461,0xB463,0xB465,0xB46C,0xB480, + 0xB488,0xB49D,0xB4A4,0xB4A8,0xB4AC,0xB4B5,0xB4B7,0xB4B9, + 0xB4C0,0xB4C4,0xB4C8,0xB4D0,0xB4D5,0xB4DC,0xB4DD,0xB4E0, + 0xB4E3,0xB4E4,0xB4E6,0xB4EC,0xB4ED,0xB4EF,0xB4F1,0xB4F8, + 0xB514,0xB515,0xB518,0xB51B,0xB51C,0xB524,0xB525,0xB527, + 0xB528,0xB529,0xB52A,0xB530,0xB531,0xB534,0xB538,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 55, Array index 0x1300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB540,0xB541,0xB543,0xB544,0xB545,0xB54B,0xB54C, + 0xB54D,0xB550,0xB554,0xB55C,0xB55D,0xB55F,0xB560,0xB561, + 0xB5A0,0xB5A1,0xB5A4,0xB5A8,0xB5AA,0xB5AB,0xB5B0,0xB5B1, + 0xB5B3,0xB5B4,0xB5B5,0xB5BB,0xB5BC,0xB5BD,0xB5C0,0xB5C4, + 0xB5CC,0xB5CD,0xB5CF,0xB5D0,0xB5D1,0xB5D8,0xB5EC,0xB610, + 0xB611,0xB614,0xB618,0xB625,0xB62C,0xB634,0xB648,0xB664, + 0xB668,0xB69C,0xB69D,0xB6A0,0xB6A4,0xB6AB,0xB6AC,0xB6B1, + 0xB6D4,0xB6F0,0xB6F4,0xB6F8,0xB700,0xB701,0xB705,0xB728, + 0xB729,0xB72C,0xB72F,0xB730,0xB738,0xB739,0xB73B,0xB744, + 0xB748,0xB74C,0xB754,0xB755,0xB760,0xB764,0xB768,0xB770, + 0xB771,0xB773,0xB775,0xB77C,0xB77D,0xB780,0xB784,0xB78C, + 0xB78D,0xB78F,0xB790,0xB791,0xB792,0xB796,0xB797,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 56, Array index 0x1400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB798,0xB799,0xB79C,0xB7A0,0xB7A8,0xB7A9,0xB7AB, + 0xB7AC,0xB7AD,0xB7B4,0xB7B5,0xB7B8,0xB7C7,0xB7C9,0xB7EC, + 0xB7ED,0xB7F0,0xB7F4,0xB7FC,0xB7FD,0xB7FF,0xB800,0xB801, + 0xB807,0xB808,0xB809,0xB80C,0xB810,0xB818,0xB819,0xB81B, + 0xB81D,0xB824,0xB825,0xB828,0xB82C,0xB834,0xB835,0xB837, + 0xB838,0xB839,0xB840,0xB844,0xB851,0xB853,0xB85C,0xB85D, + 0xB860,0xB864,0xB86C,0xB86D,0xB86F,0xB871,0xB878,0xB87C, + 0xB88D,0xB8A8,0xB8B0,0xB8B4,0xB8B8,0xB8C0,0xB8C1,0xB8C3, + 0xB8C5,0xB8CC,0xB8D0,0xB8D4,0xB8DD,0xB8DF,0xB8E1,0xB8E8, + 0xB8E9,0xB8EC,0xB8F0,0xB8F8,0xB8F9,0xB8FB,0xB8FD,0xB904, + 0xB918,0xB920,0xB93C,0xB93D,0xB940,0xB944,0xB94C,0xB94F, + 0xB951,0xB958,0xB959,0xB95C,0xB960,0xB968,0xB969,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 57, Array index 0x1500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xB96B,0xB96D,0xB974,0xB975,0xB978,0xB97C,0xB984, + 0xB985,0xB987,0xB989,0xB98A,0xB98D,0xB98E,0xB9AC,0xB9AD, + 0xB9B0,0xB9B4,0xB9BC,0xB9BD,0xB9BF,0xB9C1,0xB9C8,0xB9C9, + 0xB9CC,0xB9CE,0xB9CF,0xB9D0,0xB9D1,0xB9D2,0xB9D8,0xB9D9, + 0xB9DB,0xB9DD,0xB9DE,0xB9E1,0xB9E3,0xB9E4,0xB9E5,0xB9E8, + 0xB9EC,0xB9F4,0xB9F5,0xB9F7,0xB9F8,0xB9F9,0xB9FA,0xBA00, + 0xBA01,0xBA08,0xBA15,0xBA38,0xBA39,0xBA3C,0xBA40,0xBA42, + 0xBA48,0xBA49,0xBA4B,0xBA4D,0xBA4E,0xBA53,0xBA54,0xBA55, + 0xBA58,0xBA5C,0xBA64,0xBA65,0xBA67,0xBA68,0xBA69,0xBA70, + 0xBA71,0xBA74,0xBA78,0xBA83,0xBA84,0xBA85,0xBA87,0xBA8C, + 0xBAA8,0xBAA9,0xBAAB,0xBAAC,0xBAB0,0xBAB2,0xBAB8,0xBAB9, + 0xBABB,0xBABD,0xBAC4,0xBAC8,0xBAD8,0xBAD9,0xBAFC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 58, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xBB00,0xBB04,0xBB0D,0xBB0F,0xBB11,0xBB18,0xBB1C, + 0xBB20,0xBB29,0xBB2B,0xBB34,0xBB35,0xBB36,0xBB38,0xBB3B, + 0xBB3C,0xBB3D,0xBB3E,0xBB44,0xBB45,0xBB47,0xBB49,0xBB4D, + 0xBB4F,0xBB50,0xBB54,0xBB58,0xBB61,0xBB63,0xBB6C,0xBB88, + 0xBB8C,0xBB90,0xBBA4,0xBBA8,0xBBAC,0xBBB4,0xBBB7,0xBBC0, + 0xBBC4,0xBBC8,0xBBD0,0xBBD3,0xBBF8,0xBBF9,0xBBFC,0xBBFF, + 0xBC00,0xBC02,0xBC08,0xBC09,0xBC0B,0xBC0C,0xBC0D,0xBC0F, + 0xBC11,0xBC14,0xBC15,0xBC16,0xBC17,0xBC18,0xBC1B,0xBC1C, + 0xBC1D,0xBC1E,0xBC1F,0xBC24,0xBC25,0xBC27,0xBC29,0xBC2D, + 0xBC30,0xBC31,0xBC34,0xBC38,0xBC40,0xBC41,0xBC43,0xBC44, + 0xBC45,0xBC49,0xBC4C,0xBC4D,0xBC50,0xBC5D,0xBC84,0xBC85, + 0xBC88,0xBC8B,0xBC8C,0xBC8E,0xBC94,0xBC95,0xBC97,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 59, Array index 0x1700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xBC99,0xBC9A,0xBCA0,0xBCA1,0xBCA4,0xBCA7,0xBCA8, + 0xBCB0,0xBCB1,0xBCB3,0xBCB4,0xBCB5,0xBCBC,0xBCBD,0xBCC0, + 0xBCC4,0xBCCD,0xBCCF,0xBCD0,0xBCD1,0xBCD5,0xBCD8,0xBCDC, + 0xBCF4,0xBCF5,0xBCF6,0xBCF8,0xBCFC,0xBD04,0xBD05,0xBD07, + 0xBD09,0xBD10,0xBD14,0xBD24,0xBD2C,0xBD40,0xBD48,0xBD49, + 0xBD4C,0xBD50,0xBD58,0xBD59,0xBD64,0xBD68,0xBD80,0xBD81, + 0xBD84,0xBD87,0xBD88,0xBD89,0xBD8A,0xBD90,0xBD91,0xBD93, + 0xBD95,0xBD99,0xBD9A,0xBD9C,0xBDA4,0xBDB0,0xBDB8,0xBDD4, + 0xBDD5,0xBDD8,0xBDDC,0xBDE9,0xBDF0,0xBDF4,0xBDF8,0xBE00, + 0xBE03,0xBE05,0xBE0C,0xBE0D,0xBE10,0xBE14,0xBE1C,0xBE1D, + 0xBE1F,0xBE44,0xBE45,0xBE48,0xBE4C,0xBE4E,0xBE54,0xBE55, + 0xBE57,0xBE59,0xBE5A,0xBE5B,0xBE60,0xBE61,0xBE64,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 60, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xBE68,0xBE6A,0xBE70,0xBE71,0xBE73,0xBE74,0xBE75, + 0xBE7B,0xBE7C,0xBE7D,0xBE80,0xBE84,0xBE8C,0xBE8D,0xBE8F, + 0xBE90,0xBE91,0xBE98,0xBE99,0xBEA8,0xBED0,0xBED1,0xBED4, + 0xBED7,0xBED8,0xBEE0,0xBEE3,0xBEE4,0xBEE5,0xBEEC,0xBF01, + 0xBF08,0xBF09,0xBF18,0xBF19,0xBF1B,0xBF1C,0xBF1D,0xBF40, + 0xBF41,0xBF44,0xBF48,0xBF50,0xBF51,0xBF55,0xBF94,0xBFB0, + 0xBFC5,0xBFCC,0xBFCD,0xBFD0,0xBFD4,0xBFDC,0xBFDF,0xBFE1, + 0xC03C,0xC051,0xC058,0xC05C,0xC060,0xC068,0xC069,0xC090, + 0xC091,0xC094,0xC098,0xC0A0,0xC0A1,0xC0A3,0xC0A5,0xC0AC, + 0xC0AD,0xC0AF,0xC0B0,0xC0B3,0xC0B4,0xC0B5,0xC0B6,0xC0BC, + 0xC0BD,0xC0BF,0xC0C0,0xC0C1,0xC0C5,0xC0C8,0xC0C9,0xC0CC, + 0xC0D0,0xC0D8,0xC0D9,0xC0DB,0xC0DC,0xC0DD,0xC0E4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 61, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC0E5,0xC0E8,0xC0EC,0xC0F4,0xC0F5,0xC0F7,0xC0F9, + 0xC100,0xC104,0xC108,0xC110,0xC115,0xC11C,0xC11D,0xC11E, + 0xC11F,0xC120,0xC123,0xC124,0xC126,0xC127,0xC12C,0xC12D, + 0xC12F,0xC130,0xC131,0xC136,0xC138,0xC139,0xC13C,0xC140, + 0xC148,0xC149,0xC14B,0xC14C,0xC14D,0xC154,0xC155,0xC158, + 0xC15C,0xC164,0xC165,0xC167,0xC168,0xC169,0xC170,0xC174, + 0xC178,0xC185,0xC18C,0xC18D,0xC18E,0xC190,0xC194,0xC196, + 0xC19C,0xC19D,0xC19F,0xC1A1,0xC1A5,0xC1A8,0xC1A9,0xC1AC, + 0xC1B0,0xC1BD,0xC1C4,0xC1C8,0xC1CC,0xC1D4,0xC1D7,0xC1D8, + 0xC1E0,0xC1E4,0xC1E8,0xC1F0,0xC1F1,0xC1F3,0xC1FC,0xC1FD, + 0xC200,0xC204,0xC20C,0xC20D,0xC20F,0xC211,0xC218,0xC219, + 0xC21C,0xC21F,0xC220,0xC228,0xC229,0xC22B,0xC22D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 62, Array index 0x1A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC22F,0xC231,0xC232,0xC234,0xC248,0xC250,0xC251, + 0xC254,0xC258,0xC260,0xC265,0xC26C,0xC26D,0xC270,0xC274, + 0xC27C,0xC27D,0xC27F,0xC281,0xC288,0xC289,0xC290,0xC298, + 0xC29B,0xC29D,0xC2A4,0xC2A5,0xC2A8,0xC2AC,0xC2AD,0xC2B4, + 0xC2B5,0xC2B7,0xC2B9,0xC2DC,0xC2DD,0xC2E0,0xC2E3,0xC2E4, + 0xC2EB,0xC2EC,0xC2ED,0xC2EF,0xC2F1,0xC2F6,0xC2F8,0xC2F9, + 0xC2FB,0xC2FC,0xC300,0xC308,0xC309,0xC30C,0xC30D,0xC313, + 0xC314,0xC315,0xC318,0xC31C,0xC324,0xC325,0xC328,0xC329, + 0xC345,0xC368,0xC369,0xC36C,0xC370,0xC372,0xC378,0xC379, + 0xC37C,0xC37D,0xC384,0xC388,0xC38C,0xC3C0,0xC3D8,0xC3D9, + 0xC3DC,0xC3DF,0xC3E0,0xC3E2,0xC3E8,0xC3E9,0xC3ED,0xC3F4, + 0xC3F5,0xC3F8,0xC408,0xC410,0xC424,0xC42C,0xC430,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 63, Array index 0x1B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC434,0xC43C,0xC43D,0xC448,0xC464,0xC465,0xC468, + 0xC46C,0xC474,0xC475,0xC479,0xC480,0xC494,0xC49C,0xC4B8, + 0xC4BC,0xC4E9,0xC4F0,0xC4F1,0xC4F4,0xC4F8,0xC4FA,0xC4FF, + 0xC500,0xC501,0xC50C,0xC510,0xC514,0xC51C,0xC528,0xC529, + 0xC52C,0xC530,0xC538,0xC539,0xC53B,0xC53D,0xC544,0xC545, + 0xC548,0xC549,0xC54A,0xC54C,0xC54D,0xC54E,0xC553,0xC554, + 0xC555,0xC557,0xC558,0xC559,0xC55D,0xC55E,0xC560,0xC561, + 0xC564,0xC568,0xC570,0xC571,0xC573,0xC574,0xC575,0xC57C, + 0xC57D,0xC580,0xC584,0xC587,0xC58C,0xC58D,0xC58F,0xC591, + 0xC595,0xC597,0xC598,0xC59C,0xC5A0,0xC5A9,0xC5B4,0xC5B5, + 0xC5B8,0xC5B9,0xC5BB,0xC5BC,0xC5BD,0xC5BE,0xC5C4,0xC5C5, + 0xC5C6,0xC5C7,0xC5C8,0xC5C9,0xC5CA,0xC5CC,0xC5CE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 64, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC5D0,0xC5D1,0xC5D4,0xC5D8,0xC5E0,0xC5E1,0xC5E3, + 0xC5E5,0xC5EC,0xC5ED,0xC5EE,0xC5F0,0xC5F4,0xC5F6,0xC5F7, + 0xC5FC,0xC5FD,0xC5FE,0xC5FF,0xC600,0xC601,0xC605,0xC606, + 0xC607,0xC608,0xC60C,0xC610,0xC618,0xC619,0xC61B,0xC61C, + 0xC624,0xC625,0xC628,0xC62C,0xC62D,0xC62E,0xC630,0xC633, + 0xC634,0xC635,0xC637,0xC639,0xC63B,0xC640,0xC641,0xC644, + 0xC648,0xC650,0xC651,0xC653,0xC654,0xC655,0xC65C,0xC65D, + 0xC660,0xC66C,0xC66F,0xC671,0xC678,0xC679,0xC67C,0xC680, + 0xC688,0xC689,0xC68B,0xC68D,0xC694,0xC695,0xC698,0xC69C, + 0xC6A4,0xC6A5,0xC6A7,0xC6A9,0xC6B0,0xC6B1,0xC6B4,0xC6B8, + 0xC6B9,0xC6BA,0xC6C0,0xC6C1,0xC6C3,0xC6C5,0xC6CC,0xC6CD, + 0xC6D0,0xC6D4,0xC6DC,0xC6DD,0xC6E0,0xC6E1,0xC6E8,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 65, Array index 0x1D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC6E9,0xC6EC,0xC6F0,0xC6F8,0xC6F9,0xC6FD,0xC704, + 0xC705,0xC708,0xC70C,0xC714,0xC715,0xC717,0xC719,0xC720, + 0xC721,0xC724,0xC728,0xC730,0xC731,0xC733,0xC735,0xC737, + 0xC73C,0xC73D,0xC740,0xC744,0xC74A,0xC74C,0xC74D,0xC74F, + 0xC751,0xC752,0xC753,0xC754,0xC755,0xC756,0xC757,0xC758, + 0xC75C,0xC760,0xC768,0xC76B,0xC774,0xC775,0xC778,0xC77C, + 0xC77D,0xC77E,0xC783,0xC784,0xC785,0xC787,0xC788,0xC789, + 0xC78A,0xC78E,0xC790,0xC791,0xC794,0xC796,0xC797,0xC798, + 0xC79A,0xC7A0,0xC7A1,0xC7A3,0xC7A4,0xC7A5,0xC7A6,0xC7AC, + 0xC7AD,0xC7B0,0xC7B4,0xC7BC,0xC7BD,0xC7BF,0xC7C0,0xC7C1, + 0xC7C8,0xC7C9,0xC7CC,0xC7CE,0xC7D0,0xC7D8,0xC7DD,0xC7E4, + 0xC7E8,0xC7EC,0xC800,0xC801,0xC804,0xC808,0xC80A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 66, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC810,0xC811,0xC813,0xC815,0xC816,0xC81C,0xC81D, + 0xC820,0xC824,0xC82C,0xC82D,0xC82F,0xC831,0xC838,0xC83C, + 0xC840,0xC848,0xC849,0xC84C,0xC84D,0xC854,0xC870,0xC871, + 0xC874,0xC878,0xC87A,0xC880,0xC881,0xC883,0xC885,0xC886, + 0xC887,0xC88B,0xC88C,0xC88D,0xC894,0xC89D,0xC89F,0xC8A1, + 0xC8A8,0xC8BC,0xC8BD,0xC8C4,0xC8C8,0xC8CC,0xC8D4,0xC8D5, + 0xC8D7,0xC8D9,0xC8E0,0xC8E1,0xC8E4,0xC8F5,0xC8FC,0xC8FD, + 0xC900,0xC904,0xC905,0xC906,0xC90C,0xC90D,0xC90F,0xC911, + 0xC918,0xC92C,0xC934,0xC950,0xC951,0xC954,0xC958,0xC960, + 0xC961,0xC963,0xC96C,0xC970,0xC974,0xC97C,0xC988,0xC989, + 0xC98C,0xC990,0xC998,0xC999,0xC99B,0xC99D,0xC9C0,0xC9C1, + 0xC9C4,0xC9C7,0xC9C8,0xC9CA,0xC9D0,0xC9D1,0xC9D3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 67, Array index 0x1F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xC9D5,0xC9D6,0xC9D9,0xC9DA,0xC9DC,0xC9DD,0xC9E0, + 0xC9E2,0xC9E4,0xC9E7,0xC9EC,0xC9ED,0xC9EF,0xC9F0,0xC9F1, + 0xC9F8,0xC9F9,0xC9FC,0xCA00,0xCA08,0xCA09,0xCA0B,0xCA0C, + 0xCA0D,0xCA14,0xCA18,0xCA29,0xCA4C,0xCA4D,0xCA50,0xCA54, + 0xCA5C,0xCA5D,0xCA5F,0xCA60,0xCA61,0xCA68,0xCA7D,0xCA84, + 0xCA98,0xCABC,0xCABD,0xCAC0,0xCAC4,0xCACC,0xCACD,0xCACF, + 0xCAD1,0xCAD3,0xCAD8,0xCAD9,0xCAE0,0xCAEC,0xCAF4,0xCB08, + 0xCB10,0xCB14,0xCB18,0xCB20,0xCB21,0xCB41,0xCB48,0xCB49, + 0xCB4C,0xCB50,0xCB58,0xCB59,0xCB5D,0xCB64,0xCB78,0xCB79, + 0xCB9C,0xCBB8,0xCBD4,0xCBE4,0xCBE7,0xCBE9,0xCC0C,0xCC0D, + 0xCC10,0xCC14,0xCC1C,0xCC1D,0xCC21,0xCC22,0xCC27,0xCC28, + 0xCC29,0xCC2C,0xCC2E,0xCC30,0xCC38,0xCC39,0xCC3B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 68, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xCC3C,0xCC3D,0xCC3E,0xCC44,0xCC45,0xCC48,0xCC4C, + 0xCC54,0xCC55,0xCC57,0xCC58,0xCC59,0xCC60,0xCC64,0xCC66, + 0xCC68,0xCC70,0xCC75,0xCC98,0xCC99,0xCC9C,0xCCA0,0xCCA8, + 0xCCA9,0xCCAB,0xCCAC,0xCCAD,0xCCB4,0xCCB5,0xCCB8,0xCCBC, + 0xCCC4,0xCCC5,0xCCC7,0xCCC9,0xCCD0,0xCCD4,0xCCE4,0xCCEC, + 0xCCF0,0xCD01,0xCD08,0xCD09,0xCD0C,0xCD10,0xCD18,0xCD19, + 0xCD1B,0xCD1D,0xCD24,0xCD28,0xCD2C,0xCD39,0xCD5C,0xCD60, + 0xCD64,0xCD6C,0xCD6D,0xCD6F,0xCD71,0xCD78,0xCD88,0xCD94, + 0xCD95,0xCD98,0xCD9C,0xCDA4,0xCDA5,0xCDA7,0xCDA9,0xCDB0, + 0xCDC4,0xCDCC,0xCDD0,0xCDE8,0xCDEC,0xCDF0,0xCDF8,0xCDF9, + 0xCDFB,0xCDFD,0xCE04,0xCE08,0xCE0C,0xCE14,0xCE19,0xCE20, + 0xCE21,0xCE24,0xCE28,0xCE30,0xCE31,0xCE33,0xCE35,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 69, Array index 0x2100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xCE58,0xCE59,0xCE5C,0xCE5F,0xCE60,0xCE61,0xCE68, + 0xCE69,0xCE6B,0xCE6D,0xCE74,0xCE75,0xCE78,0xCE7C,0xCE84, + 0xCE85,0xCE87,0xCE89,0xCE90,0xCE91,0xCE94,0xCE98,0xCEA0, + 0xCEA1,0xCEA3,0xCEA4,0xCEA5,0xCEAC,0xCEAD,0xCEC1,0xCEE4, + 0xCEE5,0xCEE8,0xCEEB,0xCEEC,0xCEF4,0xCEF5,0xCEF7,0xCEF8, + 0xCEF9,0xCF00,0xCF01,0xCF04,0xCF08,0xCF10,0xCF11,0xCF13, + 0xCF15,0xCF1C,0xCF20,0xCF24,0xCF2C,0xCF2D,0xCF2F,0xCF30, + 0xCF31,0xCF38,0xCF54,0xCF55,0xCF58,0xCF5C,0xCF64,0xCF65, + 0xCF67,0xCF69,0xCF70,0xCF71,0xCF74,0xCF78,0xCF80,0xCF85, + 0xCF8C,0xCFA1,0xCFA8,0xCFB0,0xCFC4,0xCFE0,0xCFE1,0xCFE4, + 0xCFE8,0xCFF0,0xCFF1,0xCFF3,0xCFF5,0xCFFC,0xD000,0xD004, + 0xD011,0xD018,0xD02D,0xD034,0xD035,0xD038,0xD03C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 70, Array index 0x2200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xD044,0xD045,0xD047,0xD049,0xD050,0xD054,0xD058, + 0xD060,0xD06C,0xD06D,0xD070,0xD074,0xD07C,0xD07D,0xD081, + 0xD0A4,0xD0A5,0xD0A8,0xD0AC,0xD0B4,0xD0B5,0xD0B7,0xD0B9, + 0xD0C0,0xD0C1,0xD0C4,0xD0C8,0xD0C9,0xD0D0,0xD0D1,0xD0D3, + 0xD0D4,0xD0D5,0xD0DC,0xD0DD,0xD0E0,0xD0E4,0xD0EC,0xD0ED, + 0xD0EF,0xD0F0,0xD0F1,0xD0F8,0xD10D,0xD130,0xD131,0xD134, + 0xD138,0xD13A,0xD140,0xD141,0xD143,0xD144,0xD145,0xD14C, + 0xD14D,0xD150,0xD154,0xD15C,0xD15D,0xD15F,0xD161,0xD168, + 0xD16C,0xD17C,0xD184,0xD188,0xD1A0,0xD1A1,0xD1A4,0xD1A8, + 0xD1B0,0xD1B1,0xD1B3,0xD1B5,0xD1BA,0xD1BC,0xD1C0,0xD1D8, + 0xD1F4,0xD1F8,0xD207,0xD209,0xD210,0xD22C,0xD22D,0xD230, + 0xD234,0xD23C,0xD23D,0xD23F,0xD241,0xD248,0xD25C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 71, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xD264,0xD280,0xD281,0xD284,0xD288,0xD290,0xD291, + 0xD295,0xD29C,0xD2A0,0xD2A4,0xD2AC,0xD2B1,0xD2B8,0xD2B9, + 0xD2BC,0xD2BF,0xD2C0,0xD2C2,0xD2C8,0xD2C9,0xD2CB,0xD2D4, + 0xD2D8,0xD2DC,0xD2E4,0xD2E5,0xD2F0,0xD2F1,0xD2F4,0xD2F8, + 0xD300,0xD301,0xD303,0xD305,0xD30C,0xD30D,0xD30E,0xD310, + 0xD314,0xD316,0xD31C,0xD31D,0xD31F,0xD320,0xD321,0xD325, + 0xD328,0xD329,0xD32C,0xD330,0xD338,0xD339,0xD33B,0xD33C, + 0xD33D,0xD344,0xD345,0xD37C,0xD37D,0xD380,0xD384,0xD38C, + 0xD38D,0xD38F,0xD390,0xD391,0xD398,0xD399,0xD39C,0xD3A0, + 0xD3A8,0xD3A9,0xD3AB,0xD3AD,0xD3B4,0xD3B8,0xD3BC,0xD3C4, + 0xD3C5,0xD3C8,0xD3C9,0xD3D0,0xD3D8,0xD3E1,0xD3E3,0xD3EC, + 0xD3ED,0xD3F0,0xD3F4,0xD3FC,0xD3FD,0xD3FF,0xD401,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 72, Array index 0x2400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xD408,0xD41D,0xD440,0xD444,0xD45C,0xD460,0xD464, + 0xD46D,0xD46F,0xD478,0xD479,0xD47C,0xD47F,0xD480,0xD482, + 0xD488,0xD489,0xD48B,0xD48D,0xD494,0xD4A9,0xD4CC,0xD4D0, + 0xD4D4,0xD4DC,0xD4DF,0xD4E8,0xD4EC,0xD4F0,0xD4F8,0xD4FB, + 0xD4FD,0xD504,0xD508,0xD50C,0xD514,0xD515,0xD517,0xD53C, + 0xD53D,0xD540,0xD544,0xD54C,0xD54D,0xD54F,0xD551,0xD558, + 0xD559,0xD55C,0xD560,0xD565,0xD568,0xD569,0xD56B,0xD56D, + 0xD574,0xD575,0xD578,0xD57C,0xD584,0xD585,0xD587,0xD588, + 0xD589,0xD590,0xD5A5,0xD5C8,0xD5C9,0xD5CC,0xD5D0,0xD5D2, + 0xD5D8,0xD5D9,0xD5DB,0xD5DD,0xD5E4,0xD5E5,0xD5E8,0xD5EC, + 0xD5F4,0xD5F5,0xD5F7,0xD5F9,0xD600,0xD601,0xD604,0xD608, + 0xD610,0xD611,0xD613,0xD614,0xD615,0xD61C,0xD620,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 73, Array index 0x2500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xD624,0xD62D,0xD638,0xD639,0xD63C,0xD640,0xD645, + 0xD648,0xD649,0xD64B,0xD64D,0xD651,0xD654,0xD655,0xD658, + 0xD65C,0xD667,0xD669,0xD670,0xD671,0xD674,0xD683,0xD685, + 0xD68C,0xD68D,0xD690,0xD694,0xD69D,0xD69F,0xD6A1,0xD6A8, + 0xD6AC,0xD6B0,0xD6B9,0xD6BB,0xD6C4,0xD6C5,0xD6C8,0xD6CC, + 0xD6D1,0xD6D4,0xD6D7,0xD6D9,0xD6E0,0xD6E4,0xD6E8,0xD6F0, + 0xD6F5,0xD6FC,0xD6FD,0xD700,0xD704,0xD711,0xD718,0xD719, + 0xD71C,0xD720,0xD728,0xD729,0xD72B,0xD72D,0xD734,0xD735, + 0xD738,0xD73C,0xD744,0xD747,0xD749,0xD750,0xD751,0xD754, + 0xD756,0xD757,0xD758,0xD759,0xD760,0xD761,0xD763,0xD765, + 0xD769,0xD76C,0xD770,0xD774,0xD77C,0xD77D,0xD781,0xD788, + 0xD789,0xD78C,0xD790,0xD798,0xD799,0xD79B,0xD79D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 75, Array index 0x2600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F3D,0x4F73,0x5047,0x50F9,0x52A0,0x53EF,0x5475, + 0x54E5,0x5609,0x5AC1,0x5BB6,0x6687,0x67B6,0x67B7,0x67EF, + 0x6B4C,0x73C2,0x75C2,0x7A3C,0x82DB,0x8304,0x8857,0x8888, + 0x8A36,0x8CC8,0x8DCF,0x8EFB,0x8FE6,0x99D5,0x523B,0x5374, + 0x5404,0x606A,0x6164,0x6BBC,0x73CF,0x811A,0x89BA,0x89D2, + 0x95A3,0x4F83,0x520A,0x58BE,0x5978,0x59E6,0x5E72,0x5E79, + 0x61C7,0x63C0,0x6746,0x67EC,0x687F,0x6F97,0x764E,0x770B, + 0x78F5,0x7A08,0x7AFF,0x7C21,0x809D,0x826E,0x8271,0x8AEB, + 0x9593,0x4E6B,0x559D,0x66F7,0x6E34,0x78A3,0x7AED,0x845B, + 0x8910,0x874E,0x97A8,0x52D8,0x574E,0x582A,0x5D4C,0x611F, + 0x61BE,0x6221,0x6562,0x67D1,0x6A44,0x6E1B,0x7518,0x75B3, + 0x76E3,0x77B0,0x7D3A,0x90AF,0x9451,0x9452,0x9F95,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 76, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5323,0x5CAC,0x7532,0x80DB,0x9240,0x9598,0x525B, + 0x5808,0x59DC,0x5CA1,0x5D17,0x5EB7,0x5F3A,0x5F4A,0x6177, + 0x6C5F,0x757A,0x7586,0x7CE0,0x7D73,0x7DB1,0x7F8C,0x8154, + 0x8221,0x8591,0x8941,0x8B1B,0x92FC,0x964D,0x9C47,0x4ECB, + 0x4EF7,0x500B,0x51F1,0x584F,0x6137,0x613E,0x6168,0x6539, + 0x69EA,0x6F11,0x75A5,0x7686,0x76D6,0x7B87,0x82A5,0x84CB, + 0xF900,0x93A7,0x958B,0x5580,0x5BA2,0x5751,0xF901,0x7CB3, + 0x7FB9,0x91B5,0x5028,0x53BB,0x5C45,0x5DE8,0x62D2,0x636E, + 0x64DA,0x64E7,0x6E20,0x70AC,0x795B,0x8DDD,0x8E1E,0xF902, + 0x907D,0x9245,0x92F8,0x4E7E,0x4EF6,0x5065,0x5DFE,0x5EFA, + 0x6106,0x6957,0x8171,0x8654,0x8E47,0x9375,0x9A2B,0x4E5E, + 0x5091,0x6770,0x6840,0x5109,0x528D,0x5292,0x6AA2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 77, Array index 0x2800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x77BC,0x9210,0x9ED4,0x52AB,0x602F,0x8FF2,0x5048, + 0x61A9,0x63ED,0x64CA,0x683C,0x6A84,0x6FC0,0x8188,0x89A1, + 0x9694,0x5805,0x727D,0x72AC,0x7504,0x7D79,0x7E6D,0x80A9, + 0x898B,0x8B74,0x9063,0x9D51,0x6289,0x6C7A,0x6F54,0x7D50, + 0x7F3A,0x8A23,0x517C,0x614A,0x7B9D,0x8B19,0x9257,0x938C, + 0x4EAC,0x4FD3,0x501E,0x50BE,0x5106,0x52C1,0x52CD,0x537F, + 0x5770,0x5883,0x5E9A,0x5F91,0x6176,0x61AC,0x64CE,0x656C, + 0x666F,0x66BB,0x66F4,0x6897,0x6D87,0x7085,0x70F1,0x749F, + 0x74A5,0x74CA,0x75D9,0x786C,0x78EC,0x7ADF,0x7AF6,0x7D45, + 0x7D93,0x8015,0x803F,0x811B,0x8396,0x8B66,0x8F15,0x9015, + 0x93E1,0x9803,0x9838,0x9A5A,0x9BE8,0x4FC2,0x5553,0x583A, + 0x5951,0x5B63,0x5C46,0x60B8,0x6212,0x6842,0x68B0,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 78, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x68E8,0x6EAA,0x754C,0x7678,0x78CE,0x7A3D,0x7CFB, + 0x7E6B,0x7E7C,0x8A08,0x8AA1,0x8C3F,0x968E,0x9DC4,0x53E4, + 0x53E9,0x544A,0x5471,0x56FA,0x59D1,0x5B64,0x5C3B,0x5EAB, + 0x62F7,0x6537,0x6545,0x6572,0x66A0,0x67AF,0x69C1,0x6CBD, + 0x75FC,0x7690,0x777E,0x7A3F,0x7F94,0x8003,0x80A1,0x818F, + 0x82E6,0x82FD,0x83F0,0x85C1,0x8831,0x88B4,0x8AA5,0xF903, + 0x8F9C,0x932E,0x96C7,0x9867,0x9AD8,0x9F13,0x54ED,0x659B, + 0x66F2,0x688F,0x7A40,0x8C37,0x9D60,0x56F0,0x5764,0x5D11, + 0x6606,0x68B1,0x68CD,0x6EFE,0x7428,0x889E,0x9BE4,0x6C68, + 0xF904,0x9AA8,0x4F9B,0x516C,0x5171,0x529F,0x5B54,0x5DE5, + 0x6050,0x606D,0x62F1,0x63A7,0x653B,0x73D9,0x7A7A,0x86A3, + 0x8CA2,0x978F,0x4E32,0x5BE1,0x6208,0x679C,0x74DC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x2A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x79D1,0x83D3,0x8A87,0x8AB2,0x8DE8,0x904E,0x934B, + 0x9846,0x5ED3,0x69E8,0x85FF,0x90ED,0xF905,0x51A0,0x5B98, + 0x5BEC,0x6163,0x68FA,0x6B3E,0x704C,0x742F,0x74D8,0x7BA1, + 0x7F50,0x83C5,0x89C0,0x8CAB,0x95DC,0x9928,0x522E,0x605D, + 0x62EC,0x9002,0x4F8A,0x5149,0x5321,0x58D9,0x5EE3,0x66E0, + 0x6D38,0x709A,0x72C2,0x73D6,0x7B50,0x80F1,0x945B,0x5366, + 0x639B,0x7F6B,0x4E56,0x5080,0x584A,0x58DE,0x602A,0x6127, + 0x62D0,0x69D0,0x9B41,0x5B8F,0x7D18,0x80B1,0x8F5F,0x4EA4, + 0x50D1,0x54AC,0x55AC,0x5B0C,0x5DA0,0x5DE7,0x652A,0x654E, + 0x6821,0x6A4B,0x72E1,0x768E,0x77EF,0x7D5E,0x7FF9,0x81A0, + 0x854E,0x86DF,0x8F03,0x8F4E,0x90CA,0x9903,0x9A55,0x9BAB, + 0x4E18,0x4E45,0x4E5D,0x4EC7,0x4FF1,0x5177,0x52FE,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5340,0x53E3,0x53E5,0x548E,0x5614,0x5775,0x57A2, + 0x5BC7,0x5D87,0x5ED0,0x61FC,0x62D8,0x6551,0x67B8,0x67E9, + 0x69CB,0x6B50,0x6BC6,0x6BEC,0x6C42,0x6E9D,0x7078,0x72D7, + 0x7396,0x7403,0x77BF,0x77E9,0x7A76,0x7D7F,0x8009,0x81FC, + 0x8205,0x820A,0x82DF,0x8862,0x8B33,0x8CFC,0x8EC0,0x9011, + 0x90B1,0x9264,0x92B6,0x99D2,0x9A45,0x9CE9,0x9DD7,0x9F9C, + 0x570B,0x5C40,0x83CA,0x97A0,0x97AB,0x9EB4,0x541B,0x7A98, + 0x7FA4,0x88D9,0x8ECD,0x90E1,0x5800,0x5C48,0x6398,0x7A9F, + 0x5BAE,0x5F13,0x7A79,0x7AAE,0x828E,0x8EAC,0x5026,0x5238, + 0x52F8,0x5377,0x5708,0x62F3,0x6372,0x6B0A,0x6DC3,0x7737, + 0x53A5,0x7357,0x8568,0x8E76,0x95D5,0x673A,0x6AC3,0x6F70, + 0x8A6D,0x8ECC,0x994B,0xF906,0x6677,0x6B78,0x8CB4,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x2C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9B3C,0xF907,0x53EB,0x572D,0x594E,0x63C6,0x69FB, + 0x73EA,0x7845,0x7ABA,0x7AC5,0x7CFE,0x8475,0x898F,0x8D73, + 0x9035,0x95A8,0x52FB,0x5747,0x7547,0x7B60,0x83CC,0x921E, + 0xF908,0x6A58,0x514B,0x524B,0x5287,0x621F,0x68D8,0x6975, + 0x9699,0x50C5,0x52A4,0x52E4,0x61C3,0x65A4,0x6839,0x69FF, + 0x747E,0x7B4B,0x82B9,0x83EB,0x89B2,0x8B39,0x8FD1,0x9949, + 0xF909,0x4ECA,0x5997,0x64D2,0x6611,0x6A8E,0x7434,0x7981, + 0x79BD,0x82A9,0x887E,0x887F,0x895F,0xF90A,0x9326,0x4F0B, + 0x53CA,0x6025,0x6271,0x6C72,0x7D1A,0x7D66,0x4E98,0x5162, + 0x77DC,0x80AF,0x4F01,0x4F0E,0x5176,0x5180,0x55DC,0x5668, + 0x573B,0x57FA,0x57FC,0x5914,0x5947,0x5993,0x5BC4,0x5C90, + 0x5D0E,0x5DF1,0x5E7E,0x5FCC,0x6280,0x65D7,0x65E3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 82, Array index 0x2D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x671E,0x671F,0x675E,0x68CB,0x68C4,0x6A5F,0x6B3A, + 0x6C23,0x6C7D,0x6C82,0x6DC7,0x7398,0x7426,0x742A,0x7482, + 0x74A3,0x7578,0x757F,0x7881,0x78EF,0x7941,0x7947,0x7948, + 0x797A,0x7B95,0x7D00,0x7DBA,0x7F88,0x8006,0x802D,0x808C, + 0x8A18,0x8B4F,0x8C48,0x8D77,0x9321,0x9324,0x98E2,0x9951, + 0x9A0E,0x9A0F,0x9A65,0x9E92,0x7DCA,0x4F76,0x5409,0x62EE, + 0x6854,0x91D1,0x55AB,0x513A,0xF90B,0xF90C,0x5A1C,0x61E6, + 0xF90D,0x62CF,0x62FF,0xF90E,0xF90F,0xF910,0xF911,0xF912, + 0xF913,0x90A3,0xF914,0xF915,0xF916,0xF917,0xF918,0x8AFE, + 0xF919,0xF91A,0xF91B,0xF91C,0x6696,0xF91D,0x7156,0xF91E, + 0xF91F,0x96E3,0xF920,0x634F,0x637A,0x5357,0xF921,0x678F, + 0x6960,0x6E73,0xF922,0x7537,0xF923,0xF924,0xF925,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 83, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D0D,0xF926,0xF927,0x8872,0x56CA,0x5A18,0xF928, + 0xF929,0xF92A,0xF92B,0xF92C,0x4E43,0xF92D,0x5167,0x5948, + 0x67F0,0x8010,0xF92E,0x5973,0x5E74,0x649A,0x79CA,0x5FF5, + 0x606C,0x62C8,0x637B,0x5BE7,0x5BD7,0x52AA,0xF92F,0x5974, + 0x5F29,0x6012,0xF930,0xF931,0xF932,0x7459,0xF933,0xF934, + 0xF935,0xF936,0xF937,0xF938,0x99D1,0xF939,0xF93A,0xF93B, + 0xF93C,0xF93D,0xF93E,0xF93F,0xF940,0xF941,0xF942,0xF943, + 0x6FC3,0xF944,0xF945,0x81BF,0x8FB2,0x60F1,0xF946,0xF947, + 0x8166,0xF948,0xF949,0x5C3F,0xF94A,0xF94B,0xF94C,0xF94D, + 0xF94E,0xF94F,0xF950,0xF951,0x5AE9,0x8A25,0x677B,0x7D10, + 0xF952,0xF953,0xF954,0xF955,0xF956,0xF957,0x80FD,0xF958, + 0xF959,0x5C3C,0x6CE5,0x533F,0x6EBA,0x591A,0x8336,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 84, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E39,0x4EB6,0x4F46,0x55AE,0x5718,0x58C7,0x5F56, + 0x65B7,0x65E6,0x6A80,0x6BB5,0x6E4D,0x77ED,0x7AEF,0x7C1E, + 0x7DDE,0x86CB,0x8892,0x9132,0x935B,0x64BB,0x6FBE,0x737A, + 0x75B8,0x9054,0x5556,0x574D,0x61BA,0x64D4,0x66C7,0x6DE1, + 0x6E5B,0x6F6D,0x6FB9,0x75F0,0x8043,0x81BD,0x8541,0x8983, + 0x8AC7,0x8B5A,0x931F,0x6C93,0x7553,0x7B54,0x8E0F,0x905D, + 0x5510,0x5802,0x5858,0x5E62,0x6207,0x649E,0x68E0,0x7576, + 0x7CD6,0x87B3,0x9EE8,0x4EE3,0x5788,0x576E,0x5927,0x5C0D, + 0x5CB1,0x5E36,0x5F85,0x6234,0x64E1,0x73B3,0x81FA,0x888B, + 0x8CB8,0x968A,0x9EDB,0x5B85,0x5FB7,0x60B3,0x5012,0x5200, + 0x5230,0x5716,0x5835,0x5857,0x5C0E,0x5C60,0x5CF6,0x5D8B, + 0x5EA6,0x5F92,0x60BC,0x6311,0x6389,0x6417,0x6843,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x68F9,0x6AC2,0x6DD8,0x6E21,0x6ED4,0x6FE4,0x71FE, + 0x76DC,0x7779,0x79B1,0x7A3B,0x8404,0x89A9,0x8CED,0x8DF3, + 0x8E48,0x9003,0x9014,0x9053,0x90FD,0x934D,0x9676,0x97DC, + 0x6BD2,0x7006,0x7258,0x72A2,0x7368,0x7763,0x79BF,0x7BE4, + 0x7E9B,0x8B80,0x58A9,0x60C7,0x6566,0x65FD,0x66BE,0x6C8C, + 0x711E,0x71C9,0x8C5A,0x9813,0x4E6D,0x7A81,0x4EDD,0x51AC, + 0x51CD,0x52D5,0x540C,0x61A7,0x6771,0x6850,0x68DF,0x6D1E, + 0x6F7C,0x75BC,0x77B3,0x7AE5,0x80F4,0x8463,0x9285,0x515C, + 0x6597,0x675C,0x6793,0x75D8,0x7AC7,0x8373,0xF95A,0x8C46, + 0x9017,0x982D,0x5C6F,0x81C0,0x829A,0x9041,0x906F,0x920D, + 0x5F97,0x5D9D,0x6A59,0x71C8,0x767B,0x7B49,0x85E4,0x8B04, + 0x9127,0x9A30,0x5587,0x61F6,0xF95B,0x7669,0x7F85,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x863F,0x87BA,0x88F8,0x908F,0xF95C,0x6D1B,0x70D9, + 0x73DE,0x7D61,0x843D,0xF95D,0x916A,0x99F1,0xF95E,0x4E82, + 0x5375,0x6B04,0x6B12,0x703E,0x721B,0x862D,0x9E1E,0x524C, + 0x8FA3,0x5D50,0x64E5,0x652C,0x6B16,0x6FEB,0x7C43,0x7E9C, + 0x85CD,0x8964,0x89BD,0x62C9,0x81D8,0x881F,0x5ECA,0x6717, + 0x6D6A,0x72FC,0x7405,0x746F,0x8782,0x90DE,0x4F86,0x5D0D, + 0x5FA0,0x840A,0x51B7,0x63A0,0x7565,0x4EAE,0x5006,0x5169, + 0x51C9,0x6881,0x6A11,0x7CAE,0x7CB1,0x7CE7,0x826F,0x8AD2, + 0x8F1B,0x91CF,0x4FB6,0x5137,0x52F5,0x5442,0x5EEC,0x616E, + 0x623E,0x65C5,0x6ADA,0x6FFE,0x792A,0x85DC,0x8823,0x95AD, + 0x9A62,0x9A6A,0x9E97,0x9ECE,0x529B,0x66C6,0x6B77,0x701D, + 0x792B,0x8F62,0x9742,0x6190,0x6200,0x6523,0x6F23,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 87, Array index 0x3200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7149,0x7489,0x7DF4,0x806F,0x84EE,0x8F26,0x9023, + 0x934A,0x51BD,0x5217,0x52A3,0x6D0C,0x70C8,0x88C2,0x5EC9, + 0x6582,0x6BAE,0x6FC2,0x7C3E,0x7375,0x4EE4,0x4F36,0x56F9, + 0xF95F,0x5CBA,0x5DBA,0x601C,0x73B2,0x7B2D,0x7F9A,0x7FCE, + 0x8046,0x901E,0x9234,0x96F6,0x9748,0x9818,0x9F61,0x4F8B, + 0x6FA7,0x79AE,0x91B4,0x96B7,0x52DE,0xF960,0x6488,0x64C4, + 0x6AD3,0x6F5E,0x7018,0x7210,0x76E7,0x8001,0x8606,0x865C, + 0x8DEF,0x8F05,0x9732,0x9B6F,0x9DFA,0x9E75,0x788C,0x797F, + 0x7DA0,0x83C9,0x9304,0x9E7F,0x9E93,0x8AD6,0x58DF,0x5F04, + 0x6727,0x7027,0x74CF,0x7C60,0x807E,0x5121,0x7028,0x7262, + 0x78CA,0x8CC2,0x8CDA,0x8CF4,0x96F7,0x4E86,0x50DA,0x5BEE, + 0x5ED6,0x6599,0x71CE,0x7642,0x77AD,0x804A,0x84FC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x3300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x907C,0x9B27,0x9F8D,0x58D8,0x5A41,0x5C62,0x6A13, + 0x6DDA,0x6F0F,0x763B,0x7D2F,0x7E37,0x851E,0x8938,0x93E4, + 0x964B,0x5289,0x65D2,0x67F3,0x69B4,0x6D41,0x6E9C,0x700F, + 0x7409,0x7460,0x7559,0x7624,0x786B,0x8B2C,0x985E,0x516D, + 0x622E,0x9678,0x4F96,0x502B,0x5D19,0x6DEA,0x7DB8,0x8F2A, + 0x5F8B,0x6144,0x6817,0xF961,0x9686,0x52D2,0x808B,0x51DC, + 0x51CC,0x695E,0x7A1C,0x7DBE,0x83F1,0x9675,0x4FDA,0x5229, + 0x5398,0x540F,0x550E,0x5C65,0x60A7,0x674E,0x68A8,0x6D6C, + 0x7281,0x72F8,0x7406,0x7483,0xF962,0x75E2,0x7C6C,0x7F79, + 0x7FB8,0x8389,0x88CF,0x88E1,0x91CC,0x91D0,0x96E2,0x9BC9, + 0x541D,0x6F7E,0x71D0,0x7498,0x85FA,0x8EAA,0x96A3,0x9C57, + 0x9E9F,0x6797,0x6DCB,0x7433,0x81E8,0x9716,0x782C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7ACB,0x7B20,0x7C92,0x6469,0x746A,0x75F2,0x78BC, + 0x78E8,0x99AC,0x9B54,0x9EBB,0x5BDE,0x5E55,0x6F20,0x819C, + 0x83AB,0x9088,0x4E07,0x534D,0x5A29,0x5DD2,0x5F4E,0x6162, + 0x633D,0x6669,0x66FC,0x6EFF,0x6F2B,0x7063,0x779E,0x842C, + 0x8513,0x883B,0x8F13,0x9945,0x9C3B,0x551C,0x62B9,0x672B, + 0x6CAB,0x8309,0x896A,0x977A,0x4EA1,0x5984,0x5FD8,0x5FD9, + 0x671B,0x7DB2,0x7F54,0x8292,0x832B,0x83BD,0x8F1E,0x9099, + 0x57CB,0x59B9,0x5A92,0x5BD0,0x6627,0x679A,0x6885,0x6BCF, + 0x7164,0x7F75,0x8CB7,0x8CE3,0x9081,0x9B45,0x8108,0x8C8A, + 0x964C,0x9A40,0x9EA5,0x5B5F,0x6C13,0x731B,0x76F2,0x76DF, + 0x840C,0x51AA,0x8993,0x514D,0x5195,0x52C9,0x68C9,0x6C94, + 0x7704,0x7720,0x7DBF,0x7DEC,0x9762,0x9EB5,0x6EC5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 90, Array index 0x3500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8511,0x51A5,0x540D,0x547D,0x660E,0x669D,0x6927, + 0x6E9F,0x76BF,0x7791,0x8317,0x84C2,0x879F,0x9169,0x9298, + 0x9CF4,0x8882,0x4FAE,0x5192,0x52DF,0x59C6,0x5E3D,0x6155, + 0x6478,0x6479,0x66AE,0x67D0,0x6A21,0x6BCD,0x6BDB,0x725F, + 0x7261,0x7441,0x7738,0x77DB,0x8017,0x82BC,0x8305,0x8B00, + 0x8B28,0x8C8C,0x6728,0x6C90,0x7267,0x76EE,0x7766,0x7A46, + 0x9DA9,0x6B7F,0x6C92,0x5922,0x6726,0x8499,0x536F,0x5893, + 0x5999,0x5EDF,0x63CF,0x6634,0x6773,0x6E3A,0x732B,0x7AD7, + 0x82D7,0x9328,0x52D9,0x5DEB,0x61AE,0x61CB,0x620A,0x62C7, + 0x64AB,0x65E0,0x6959,0x6B66,0x6BCB,0x7121,0x73F7,0x755D, + 0x7E46,0x821E,0x8302,0x856A,0x8AA3,0x8CBF,0x9727,0x9D61, + 0x58A8,0x9ED8,0x5011,0x520E,0x543B,0x554F,0x6587,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 91, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C76,0x7D0A,0x7D0B,0x805E,0x868A,0x9580,0x96EF, + 0x52FF,0x6C95,0x7269,0x5473,0x5A9A,0x5C3E,0x5D4B,0x5F4C, + 0x5FAE,0x672A,0x68B6,0x6963,0x6E3C,0x6E44,0x7709,0x7C73, + 0x7F8E,0x8587,0x8B0E,0x8FF7,0x9761,0x9EF4,0x5CB7,0x60B6, + 0x610D,0x61AB,0x654F,0x65FB,0x65FC,0x6C11,0x6CEF,0x739F, + 0x73C9,0x7DE1,0x9594,0x5BC6,0x871C,0x8B10,0x525D,0x535A, + 0x62CD,0x640F,0x64B2,0x6734,0x6A38,0x6CCA,0x73C0,0x749E, + 0x7B94,0x7C95,0x7E1B,0x818A,0x8236,0x8584,0x8FEB,0x96F9, + 0x99C1,0x4F34,0x534A,0x53CD,0x53DB,0x62CC,0x642C,0x6500, + 0x6591,0x69C3,0x6CEE,0x6F58,0x73ED,0x7554,0x7622,0x76E4, + 0x76FC,0x78D0,0x78FB,0x792C,0x7D46,0x822C,0x87E0,0x8FD4, + 0x9812,0x98EF,0x52C3,0x62D4,0x64A5,0x6E24,0x6F51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x3700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x767C,0x8DCB,0x91B1,0x9262,0x9AEE,0x9B43,0x5023, + 0x508D,0x574A,0x59A8,0x5C28,0x5E47,0x5F77,0x623F,0x653E, + 0x65B9,0x65C1,0x6609,0x678B,0x699C,0x6EC2,0x78C5,0x7D21, + 0x80AA,0x8180,0x822B,0x82B3,0x84A1,0x868C,0x8A2A,0x8B17, + 0x90A6,0x9632,0x9F90,0x500D,0x4FF3,0xF963,0x57F9,0x5F98, + 0x62DC,0x6392,0x676F,0x6E43,0x7119,0x76C3,0x80CC,0x80DA, + 0x88F4,0x88F5,0x8919,0x8CE0,0x8F29,0x914D,0x966A,0x4F2F, + 0x4F70,0x5E1B,0x67CF,0x6822,0x767D,0x767E,0x9B44,0x5E61, + 0x6A0A,0x7169,0x71D4,0x756A,0xF964,0x7E41,0x8543,0x85E9, + 0x98DC,0x4F10,0x7B4F,0x7F70,0x95A5,0x51E1,0x5E06,0x68B5, + 0x6C3E,0x6C4E,0x6CDB,0x72AF,0x7BC4,0x8303,0x6CD5,0x743A, + 0x50FB,0x5288,0x58C1,0x64D8,0x6A97,0x74A7,0x7656,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x3800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x78A7,0x8617,0x95E2,0x9739,0xF965,0x535E,0x5F01, + 0x8B8A,0x8FA8,0x8FAF,0x908A,0x5225,0x77A5,0x9C49,0x9F08, + 0x4E19,0x5002,0x5175,0x5C5B,0x5E77,0x661E,0x663A,0x67C4, + 0x68C5,0x70B3,0x7501,0x75C5,0x79C9,0x7ADD,0x8F27,0x9920, + 0x9A08,0x4FDD,0x5821,0x5831,0x5BF6,0x666E,0x6B65,0x6D11, + 0x6E7A,0x6F7D,0x73E4,0x752B,0x83E9,0x88DC,0x8913,0x8B5C, + 0x8F14,0x4F0F,0x50D5,0x5310,0x535C,0x5B93,0x5FA9,0x670D, + 0x798F,0x8179,0x832F,0x8514,0x8907,0x8986,0x8F39,0x8F3B, + 0x99A5,0x9C12,0x672C,0x4E76,0x4FF8,0x5949,0x5C01,0x5CEF, + 0x5CF0,0x6367,0x68D2,0x70FD,0x71A2,0x742B,0x7E2B,0x84EC, + 0x8702,0x9022,0x92D2,0x9CF3,0x4E0D,0x4ED8,0x4FEF,0x5085, + 0x5256,0x526F,0x5426,0x5490,0x57E0,0x592B,0x5A66,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 94, Array index 0x3900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B5A,0x5B75,0x5BCC,0x5E9C,0xF966,0x6276,0x6577, + 0x65A7,0x6D6E,0x6EA5,0x7236,0x7B26,0x7C3F,0x7F36,0x8150, + 0x8151,0x819A,0x8240,0x8299,0x83A9,0x8A03,0x8CA0,0x8CE6, + 0x8CFB,0x8D74,0x8DBA,0x90E8,0x91DC,0x961C,0x9644,0x99D9, + 0x9CE7,0x5317,0x5206,0x5429,0x5674,0x58B3,0x5954,0x596E, + 0x5FFF,0x61A4,0x626E,0x6610,0x6C7E,0x711A,0x76C6,0x7C89, + 0x7CDE,0x7D1B,0x82AC,0x8CC1,0x96F0,0xF967,0x4F5B,0x5F17, + 0x5F7F,0x62C2,0x5D29,0x670B,0x68DA,0x787C,0x7E43,0x9D6C, + 0x4E15,0x5099,0x5315,0x532A,0x5351,0x5983,0x5A62,0x5E87, + 0x60B2,0x618A,0x6249,0x6279,0x6590,0x6787,0x69A7,0x6BD4, + 0x6BD6,0x6BD7,0x6BD8,0x6CB8,0xF968,0x7435,0x75FA,0x7812, + 0x7891,0x79D5,0x79D8,0x7C83,0x7DCB,0x7FE1,0x80A5,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 95, Array index 0x3A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x813E,0x81C2,0x83F2,0x871A,0x88E8,0x8AB9,0x8B6C, + 0x8CBB,0x9119,0x975E,0x98DB,0x9F3B,0x56AC,0x5B2A,0x5F6C, + 0x658C,0x6AB3,0x6BAF,0x6D5C,0x6FF1,0x7015,0x725D,0x73AD, + 0x8CA7,0x8CD3,0x983B,0x6191,0x6C37,0x8058,0x9A01,0x4E4D, + 0x4E8B,0x4E9B,0x4ED5,0x4F3A,0x4F3C,0x4F7F,0x4FDF,0x50FF, + 0x53F2,0x53F8,0x5506,0x55E3,0x56DB,0x58EB,0x5962,0x5A11, + 0x5BEB,0x5BFA,0x5C04,0x5DF3,0x5E2B,0x5F99,0x601D,0x6368, + 0x659C,0x65AF,0x67F6,0x67FB,0x68AD,0x6B7B,0x6C99,0x6CD7, + 0x6E23,0x7009,0x7345,0x7802,0x793E,0x7940,0x7960,0x79C1, + 0x7BE9,0x7D17,0x7D72,0x8086,0x820D,0x838E,0x84D1,0x86C7, + 0x88DF,0x8A50,0x8A5E,0x8B1D,0x8CDC,0x8D66,0x8FAD,0x90AA, + 0x98FC,0x99DF,0x9E9D,0x524A,0xF969,0x6714,0xF96A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x3B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5098,0x522A,0x5C71,0x6563,0x6C55,0x73CA,0x7523, + 0x759D,0x7B97,0x849C,0x9178,0x9730,0x4E77,0x6492,0x6BBA, + 0x715E,0x85A9,0x4E09,0xF96B,0x6749,0x68EE,0x6E17,0x829F, + 0x8518,0x886B,0x63F7,0x6F81,0x9212,0x98AF,0x4E0A,0x50B7, + 0x50CF,0x511F,0x5546,0x55AA,0x5617,0x5B40,0x5C19,0x5CE0, + 0x5E38,0x5E8A,0x5EA0,0x5EC2,0x60F3,0x6851,0x6A61,0x6E58, + 0x723D,0x7240,0x72C0,0x76F8,0x7965,0x7BB1,0x7FD4,0x88F3, + 0x89F4,0x8A73,0x8C61,0x8CDE,0x971C,0x585E,0x74BD,0x8CFD, + 0x55C7,0xF96C,0x7A61,0x7D22,0x8272,0x7272,0x751F,0x7525, + 0xF96D,0x7B19,0x5885,0x58FB,0x5DBC,0x5E8F,0x5EB6,0x5F90, + 0x6055,0x6292,0x637F,0x654D,0x6691,0x66D9,0x66F8,0x6816, + 0x68F2,0x7280,0x745E,0x7B6E,0x7D6E,0x7DD6,0x7F72,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 97, Array index 0x3C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x80E5,0x8212,0x85AF,0x897F,0x8A93,0x901D,0x92E4, + 0x9ECD,0x9F20,0x5915,0x596D,0x5E2D,0x60DC,0x6614,0x6673, + 0x6790,0x6C50,0x6DC5,0x6F5F,0x77F3,0x78A9,0x84C6,0x91CB, + 0x932B,0x4ED9,0x50CA,0x5148,0x5584,0x5B0B,0x5BA3,0x6247, + 0x657E,0x65CB,0x6E32,0x717D,0x7401,0x7444,0x7487,0x74BF, + 0x766C,0x79AA,0x7DDA,0x7E55,0x7FA8,0x817A,0x81B3,0x8239, + 0x861A,0x87EC,0x8A75,0x8DE3,0x9078,0x9291,0x9425,0x994D, + 0x9BAE,0x5368,0x5C51,0x6954,0x6CC4,0x6D29,0x6E2B,0x820C, + 0x859B,0x893B,0x8A2D,0x8AAA,0x96EA,0x9F67,0x5261,0x66B9, + 0x6BB2,0x7E96,0x87FE,0x8D0D,0x9583,0x965D,0x651D,0x6D89, + 0x71EE,0xF96E,0x57CE,0x59D3,0x5BAC,0x6027,0x60FA,0x6210, + 0x661F,0x665F,0x7329,0x73F9,0x76DB,0x7701,0x7B6C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x3D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8056,0x8072,0x8165,0x8AA0,0x9192,0x4E16,0x52E2, + 0x6B72,0x6D17,0x7A05,0x7B39,0x7D30,0xF96F,0x8CB0,0x53EC, + 0x562F,0x5851,0x5BB5,0x5C0F,0x5C11,0x5DE2,0x6240,0x6383, + 0x6414,0x662D,0x68B3,0x6CBC,0x6D88,0x6EAF,0x701F,0x70A4, + 0x71D2,0x7526,0x758F,0x758E,0x7619,0x7B11,0x7BE0,0x7C2B, + 0x7D20,0x7D39,0x852C,0x856D,0x8607,0x8A34,0x900D,0x9061, + 0x90B5,0x92B7,0x97F6,0x9A37,0x4FD7,0x5C6C,0x675F,0x6D91, + 0x7C9F,0x7E8C,0x8B16,0x8D16,0x901F,0x5B6B,0x5DFD,0x640D, + 0x84C0,0x905C,0x98E1,0x7387,0x5B8B,0x609A,0x677E,0x6DDE, + 0x8A1F,0x8AA6,0x9001,0x980C,0x5237,0xF970,0x7051,0x788E, + 0x9396,0x8870,0x91D7,0x4FEE,0x53D7,0x55FD,0x56DA,0x5782, + 0x58FD,0x5AC2,0x5B88,0x5CAB,0x5CC0,0x5E25,0x6101,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 99, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x620D,0x624B,0x6388,0x641C,0x6536,0x6578,0x6A39, + 0x6B8A,0x6C34,0x6D19,0x6F31,0x71E7,0x72E9,0x7378,0x7407, + 0x74B2,0x7626,0x7761,0x79C0,0x7A57,0x7AEA,0x7CB9,0x7D8F, + 0x7DAC,0x7E61,0x7F9E,0x8129,0x8331,0x8490,0x84DA,0x85EA, + 0x8896,0x8AB0,0x8B90,0x8F38,0x9042,0x9083,0x916C,0x9296, + 0x92B9,0x968B,0x96A7,0x96A8,0x96D6,0x9700,0x9808,0x9996, + 0x9AD3,0x9B1A,0x53D4,0x587E,0x5919,0x5B70,0x5BBF,0x6DD1, + 0x6F5A,0x719F,0x7421,0x74B9,0x8085,0x83FD,0x5DE1,0x5F87, + 0x5FAA,0x6042,0x65EC,0x6812,0x696F,0x6A53,0x6B89,0x6D35, + 0x6DF3,0x73E3,0x76FE,0x77AC,0x7B4D,0x7D14,0x8123,0x821C, + 0x8340,0x84F4,0x8563,0x8A62,0x8AC4,0x9187,0x931E,0x9806, + 0x99B4,0x620C,0x8853,0x8FF0,0x9265,0x5D07,0x5D27,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 100, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D69,0x745F,0x819D,0x8768,0x6FD5,0x62FE,0x7FD2, + 0x8936,0x8972,0x4E1E,0x4E58,0x50E7,0x52DD,0x5347,0x627F, + 0x6607,0x7E69,0x8805,0x965E,0x4F8D,0x5319,0x5636,0x59CB, + 0x5AA4,0x5C38,0x5C4E,0x5C4D,0x5E02,0x5F11,0x6043,0x65BD, + 0x662F,0x6642,0x67BE,0x67F4,0x731C,0x77E2,0x793A,0x7FC5, + 0x8494,0x84CD,0x8996,0x8A66,0x8A69,0x8AE1,0x8C55,0x8C7A, + 0x57F4,0x5BD4,0x5F0F,0x606F,0x62ED,0x690D,0x6B96,0x6E5C, + 0x7184,0x7BD2,0x8755,0x8B58,0x8EFE,0x98DF,0x98FE,0x4F38, + 0x4F81,0x4FE1,0x547B,0x5A20,0x5BB8,0x613C,0x65B0,0x6668, + 0x71FC,0x7533,0x795E,0x7D33,0x814E,0x81E3,0x8398,0x85AA, + 0x85CE,0x8703,0x8A0A,0x8EAB,0x8F9B,0xF971,0x8FC5,0x5931, + 0x5BA4,0x5BE6,0x6089,0x5BE9,0x5C0B,0x5FC3,0x6C81,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x4000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF972,0x6DF1,0x700B,0x751A,0x82AF,0x8AF6,0x4EC0, + 0x5341,0xF973,0x96D9,0x6C0F,0x4E9E,0x4FC4,0x5152,0x555E, + 0x5A25,0x5CE8,0x6211,0x7259,0x82BD,0x83AA,0x86FE,0x8859, + 0x8A1D,0x963F,0x96C5,0x9913,0x9D09,0x9D5D,0x580A,0x5CB3, + 0x5DBD,0x5E44,0x60E1,0x6115,0x63E1,0x6A02,0x6E25,0x9102, + 0x9354,0x984E,0x9C10,0x9F77,0x5B89,0x5CB8,0x6309,0x664F, + 0x6848,0x773C,0x96C1,0x978D,0x9854,0x9B9F,0x65A1,0x8B01, + 0x8ECB,0x95BC,0x5535,0x5CA9,0x5DD6,0x5EB5,0x6697,0x764C, + 0x83F4,0x95C7,0x58D3,0x62BC,0x72CE,0x9D28,0x4EF0,0x592E, + 0x600F,0x663B,0x6B83,0x79E7,0x9D26,0x5393,0x54C0,0x57C3, + 0x5D16,0x611B,0x66D6,0x6DAF,0x788D,0x827E,0x9698,0x9744, + 0x5384,0x627C,0x6396,0x6DB2,0x7E0A,0x814B,0x984D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 102, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6AFB,0x7F4C,0x9DAF,0x9E1A,0x4E5F,0x503B,0x51B6, + 0x591C,0x60F9,0x63F6,0x6930,0x723A,0x8036,0xF974,0x91CE, + 0x5F31,0xF975,0xF976,0x7D04,0x82E5,0x846F,0x84BB,0x85E5, + 0x8E8D,0xF977,0x4F6F,0xF978,0xF979,0x58E4,0x5B43,0x6059, + 0x63DA,0x6518,0x656D,0x6698,0xF97A,0x694A,0x6A23,0x6D0B, + 0x7001,0x716C,0x75D2,0x760D,0x79B3,0x7A70,0xF97B,0x7F8A, + 0xF97C,0x8944,0xF97D,0x8B93,0x91C0,0x967D,0xF97E,0x990A, + 0x5704,0x5FA1,0x65BC,0x6F01,0x7600,0x79A6,0x8A9E,0x99AD, + 0x9B5A,0x9F6C,0x5104,0x61B6,0x6291,0x6A8D,0x81C6,0x5043, + 0x5830,0x5F66,0x7109,0x8A00,0x8AFA,0x5B7C,0x8616,0x4FFA, + 0x513C,0x56B4,0x5944,0x63A9,0x6DF9,0x5DAA,0x696D,0x5186, + 0x4E88,0x4F59,0xF97F,0xF980,0xF981,0x5982,0xF982,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 103, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF983,0x6B5F,0x6C5D,0xF984,0x74B5,0x7916,0xF985, + 0x8207,0x8245,0x8339,0x8F3F,0x8F5D,0xF986,0x9918,0xF987, + 0xF988,0xF989,0x4EA6,0xF98A,0x57DF,0x5F79,0x6613,0xF98B, + 0xF98C,0x75AB,0x7E79,0x8B6F,0xF98D,0x9006,0x9A5B,0x56A5, + 0x5827,0x59F8,0x5A1F,0x5BB4,0xF98E,0x5EF6,0xF98F,0xF990, + 0x6350,0x633B,0xF991,0x693D,0x6C87,0x6CBF,0x6D8E,0x6D93, + 0x6DF5,0x6F14,0xF992,0x70DF,0x7136,0x7159,0xF993,0x71C3, + 0x71D5,0xF994,0x784F,0x786F,0xF995,0x7B75,0x7DE3,0xF996, + 0x7E2F,0xF997,0x884D,0x8EDF,0xF998,0xF999,0xF99A,0x925B, + 0xF99B,0x9CF6,0xF99C,0xF99D,0xF99E,0x6085,0x6D85,0xF99F, + 0x71B1,0xF9A0,0xF9A1,0x95B1,0x53AD,0xF9A2,0xF9A3,0xF9A4, + 0x67D3,0xF9A5,0x708E,0x7130,0x7430,0x8276,0x82D2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 104, Array index 0x4300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF9A6,0x95BB,0x9AE5,0x9E7D,0x66C4,0xF9A7,0x71C1, + 0x8449,0xF9A8,0xF9A9,0x584B,0xF9AA,0xF9AB,0x5DB8,0x5F71, + 0xF9AC,0x6620,0x668E,0x6979,0x69AE,0x6C38,0x6CF3,0x6E36, + 0x6F41,0x6FDA,0x701B,0x702F,0x7150,0x71DF,0x7370,0xF9AD, + 0x745B,0xF9AE,0x74D4,0x76C8,0x7A4E,0x7E93,0xF9AF,0xF9B0, + 0x82F1,0x8A60,0x8FCE,0xF9B1,0x9348,0xF9B2,0x9719,0xF9B3, + 0xF9B4,0x4E42,0x502A,0xF9B5,0x5208,0x53E1,0x66F3,0x6C6D, + 0x6FCA,0x730A,0x777F,0x7A62,0x82AE,0x85DD,0x8602,0xF9B6, + 0x88D4,0x8A63,0x8B7D,0x8C6B,0xF9B7,0x92B3,0xF9B8,0x9713, + 0x9810,0x4E94,0x4F0D,0x4FC9,0x50B2,0x5348,0x543E,0x5433, + 0x55DA,0x5862,0x58BA,0x5967,0x5A1B,0x5BE4,0x609F,0xF9B9, + 0x61CA,0x6556,0x65FF,0x6664,0x68A7,0x6C5A,0x6FB3,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 105, Array index 0x4400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x70CF,0x71AC,0x7352,0x7B7D,0x8708,0x8AA4,0x9C32, + 0x9F07,0x5C4B,0x6C83,0x7344,0x7389,0x923A,0x6EAB,0x7465, + 0x761F,0x7A69,0x7E15,0x860A,0x5140,0x58C5,0x64C1,0x74EE, + 0x7515,0x7670,0x7FC1,0x9095,0x96CD,0x9954,0x6E26,0x74E6, + 0x7AA9,0x7AAA,0x81E5,0x86D9,0x8778,0x8A1B,0x5A49,0x5B8C, + 0x5B9B,0x68A1,0x6900,0x6D63,0x73A9,0x7413,0x742C,0x7897, + 0x7DE9,0x7FEB,0x8118,0x8155,0x839E,0x8C4C,0x962E,0x9811, + 0x66F0,0x5F80,0x65FA,0x6789,0x6C6A,0x738B,0x502D,0x5A03, + 0x6B6A,0x77EE,0x5916,0x5D6C,0x5DCD,0x7325,0x754F,0xF9BA, + 0xF9BB,0x50E5,0x51F9,0x582F,0x592D,0x5996,0x59DA,0x5BE5, + 0xF9BC,0xF9BD,0x5DA2,0x62D7,0x6416,0x6493,0x64FE,0xF9BE, + 0x66DC,0xF9BF,0x6A48,0xF9C0,0x71FF,0x7464,0xF9C1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A88,0x7AAF,0x7E47,0x7E5E,0x8000,0x8170,0xF9C2, + 0x87EF,0x8981,0x8B20,0x9059,0xF9C3,0x9080,0x9952,0x617E, + 0x6B32,0x6D74,0x7E1F,0x8925,0x8FB1,0x4FD1,0x50AD,0x5197, + 0x52C7,0x57C7,0x5889,0x5BB9,0x5EB8,0x6142,0x6995,0x6D8C, + 0x6E67,0x6EB6,0x7194,0x7462,0x7528,0x752C,0x8073,0x8338, + 0x84C9,0x8E0A,0x9394,0x93DE,0xF9C4,0x4E8E,0x4F51,0x5076, + 0x512A,0x53C8,0x53CB,0x53F3,0x5B87,0x5BD3,0x5C24,0x611A, + 0x6182,0x65F4,0x725B,0x7397,0x7440,0x76C2,0x7950,0x7991, + 0x79B9,0x7D06,0x7FBD,0x828B,0x85D5,0x865E,0x8FC2,0x9047, + 0x90F5,0x91EA,0x9685,0x96E8,0x96E9,0x52D6,0x5F67,0x65ED, + 0x6631,0x682F,0x715C,0x7A36,0x90C1,0x980A,0x4E91,0xF9C5, + 0x6A52,0x6B9E,0x6F90,0x7189,0x8018,0x82B8,0x8553,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 107, Array index 0x4600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x904B,0x9695,0x96F2,0x97FB,0x851A,0x9B31,0x4E90, + 0x718A,0x96C4,0x5143,0x539F,0x54E1,0x5713,0x5712,0x57A3, + 0x5A9B,0x5AC4,0x5BC3,0x6028,0x613F,0x63F4,0x6C85,0x6D39, + 0x6E72,0x6E90,0x7230,0x733F,0x7457,0x82D1,0x8881,0x8F45, + 0x9060,0xF9C6,0x9662,0x9858,0x9D1B,0x6708,0x8D8A,0x925E, + 0x4F4D,0x5049,0x50DE,0x5371,0x570D,0x59D4,0x5A01,0x5C09, + 0x6170,0x6690,0x6E2D,0x7232,0x744B,0x7DEF,0x80C3,0x840E, + 0x8466,0x853F,0x875F,0x885B,0x8918,0x8B02,0x9055,0x97CB, + 0x9B4F,0x4E73,0x4F91,0x5112,0x516A,0xF9C7,0x552F,0x55A9, + 0x5B7A,0x5BA5,0x5E7C,0x5E7D,0x5EBE,0x60A0,0x60DF,0x6108, + 0x6109,0x63C4,0x6538,0x6709,0xF9C8,0x67D4,0x67DA,0xF9C9, + 0x6961,0x6962,0x6CB9,0x6D27,0xF9CA,0x6E38,0xF9CB,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x4700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6FE1,0x7336,0x7337,0xF9CC,0x745C,0x7531,0xF9CD, + 0x7652,0xF9CE,0xF9CF,0x7DAD,0x81FE,0x8438,0x88D5,0x8A98, + 0x8ADB,0x8AED,0x8E30,0x8E42,0x904A,0x903E,0x907A,0x9149, + 0x91C9,0x936E,0xF9D0,0xF9D1,0x5809,0xF9D2,0x6BD3,0x8089, + 0x80B2,0xF9D3,0xF9D4,0x5141,0x596B,0x5C39,0xF9D5,0xF9D6, + 0x6F64,0x73A7,0x80E4,0x8D07,0xF9D7,0x9217,0x958F,0xF9D8, + 0xF9D9,0xF9DA,0xF9DB,0x807F,0x620E,0x701C,0x7D68,0x878D, + 0xF9DC,0x57A0,0x6069,0x6147,0x6BB7,0x8ABE,0x9280,0x96B1, + 0x4E59,0x541F,0x6DEB,0x852D,0x9670,0x97F3,0x98EE,0x63D6, + 0x6CE3,0x9091,0x51DD,0x61C9,0x81BA,0x9DF9,0x4F9D,0x501A, + 0x5100,0x5B9C,0x610F,0x61FF,0x64EC,0x6905,0x6BC5,0x7591, + 0x77E3,0x7FA9,0x8264,0x858F,0x87FB,0x8863,0x8ABC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8B70,0x91AB,0x4E8C,0x4EE5,0x4F0A,0xF9DD,0xF9DE, + 0x5937,0x59E8,0xF9DF,0x5DF2,0x5F1B,0x5F5B,0x6021,0xF9E0, + 0xF9E1,0xF9E2,0xF9E3,0x723E,0x73E5,0xF9E4,0x7570,0x75CD, + 0xF9E5,0x79FB,0xF9E6,0x800C,0x8033,0x8084,0x82E1,0x8351, + 0xF9E7,0xF9E8,0x8CBD,0x8CB3,0x9087,0xF9E9,0xF9EA,0x98F4, + 0x990C,0xF9EB,0xF9EC,0x7037,0x76CA,0x7FCA,0x7FCC,0x7FFC, + 0x8B1A,0x4EBA,0x4EC1,0x5203,0x5370,0xF9ED,0x54BD,0x56E0, + 0x59FB,0x5BC5,0x5F15,0x5FCD,0x6E6E,0xF9EE,0xF9EF,0x7D6A, + 0x8335,0xF9F0,0x8693,0x8A8D,0xF9F1,0x976D,0x9777,0xF9F2, + 0xF9F3,0x4E00,0x4F5A,0x4F7E,0x58F9,0x65E5,0x6EA2,0x9038, + 0x93B0,0x99B9,0x4EFB,0x58EC,0x598A,0x59D9,0x6041,0xF9F4, + 0xF9F5,0x7A14,0xF9F6,0x834F,0x8CC3,0x5165,0x5344,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x4900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xF9F7,0xF9F8,0xF9F9,0x4ECD,0x5269,0x5B55,0x82BF, + 0x4ED4,0x523A,0x54A8,0x59C9,0x59FF,0x5B50,0x5B57,0x5B5C, + 0x6063,0x6148,0x6ECB,0x7099,0x716E,0x7386,0x74F7,0x75B5, + 0x78C1,0x7D2B,0x8005,0x81EA,0x8328,0x8517,0x85C9,0x8AEE, + 0x8CC7,0x96CC,0x4F5C,0x52FA,0x56BC,0x65AB,0x6628,0x707C, + 0x70B8,0x7235,0x7DBD,0x828D,0x914C,0x96C0,0x9D72,0x5B71, + 0x68E7,0x6B98,0x6F7A,0x76DE,0x5C91,0x66AB,0x6F5B,0x7BB4, + 0x7C2A,0x8836,0x96DC,0x4E08,0x4ED7,0x5320,0x5834,0x58BB, + 0x58EF,0x596C,0x5C07,0x5E33,0x5E84,0x5F35,0x638C,0x66B2, + 0x6756,0x6A1F,0x6AA3,0x6B0C,0x6F3F,0x7246,0xF9FA,0x7350, + 0x748B,0x7AE0,0x7CA7,0x8178,0x81DF,0x81E7,0x838A,0x846C, + 0x8523,0x8594,0x85CF,0x88DD,0x8D13,0x91AC,0x9577,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x4A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x969C,0x518D,0x54C9,0x5728,0x5BB0,0x624D,0x6750, + 0x683D,0x6893,0x6E3D,0x6ED3,0x707D,0x7E21,0x88C1,0x8CA1, + 0x8F09,0x9F4B,0x9F4E,0x722D,0x7B8F,0x8ACD,0x931A,0x4F47, + 0x4F4E,0x5132,0x5480,0x59D0,0x5E95,0x62B5,0x6775,0x696E, + 0x6A17,0x6CAE,0x6E1A,0x72D9,0x732A,0x75BD,0x7BB8,0x7D35, + 0x82E7,0x83F9,0x8457,0x85F7,0x8A5B,0x8CAF,0x8E87,0x9019, + 0x90B8,0x96CE,0x9F5F,0x52E3,0x540A,0x5AE1,0x5BC2,0x6458, + 0x6575,0x6EF4,0x72C4,0xF9FB,0x7684,0x7A4D,0x7B1B,0x7C4D, + 0x7E3E,0x7FDF,0x837B,0x8B2B,0x8CCA,0x8D64,0x8DE1,0x8E5F, + 0x8FEA,0x8FF9,0x9069,0x93D1,0x4F43,0x4F7A,0x50B3,0x5168, + 0x5178,0x524D,0x526A,0x5861,0x587C,0x5960,0x5C08,0x5C55, + 0x5EDB,0x609B,0x6230,0x6813,0x6BBF,0x6C08,0x6FB1,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 112, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x714E,0x7420,0x7530,0x7538,0x7551,0x7672,0x7B4C, + 0x7B8B,0x7BAD,0x7BC6,0x7E8F,0x8A6E,0x8F3E,0x8F49,0x923F, + 0x9293,0x9322,0x942B,0x96FB,0x985A,0x986B,0x991E,0x5207, + 0x622A,0x6298,0x6D59,0x7664,0x7ACA,0x7BC0,0x7D76,0x5360, + 0x5CBE,0x5E97,0x6F38,0x70B9,0x7C98,0x9711,0x9B8E,0x9EDE, + 0x63A5,0x647A,0x8776,0x4E01,0x4E95,0x4EAD,0x505C,0x5075, + 0x5448,0x59C3,0x5B9A,0x5E40,0x5EAD,0x5EF7,0x5F81,0x60C5, + 0x633A,0x653F,0x6574,0x65CC,0x6676,0x6678,0x67FE,0x6968, + 0x6A89,0x6B63,0x6C40,0x6DC0,0x6DE8,0x6E1F,0x6E5E,0x701E, + 0x70A1,0x738E,0x73FD,0x753A,0x775B,0x7887,0x798E,0x7A0B, + 0x7A7D,0x7CBE,0x7D8E,0x8247,0x8A02,0x8AEA,0x8C9E,0x912D, + 0x914A,0x91D8,0x9266,0x92CC,0x9320,0x9706,0x9756,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 113, Array index 0x4C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x975C,0x9802,0x9F0E,0x5236,0x5291,0x557C,0x5824, + 0x5E1D,0x5F1F,0x608C,0x63D0,0x68AF,0x6FDF,0x796D,0x7B2C, + 0x81CD,0x85BA,0x88FD,0x8AF8,0x8E44,0x918D,0x9664,0x969B, + 0x973D,0x984C,0x9F4A,0x4FCE,0x5146,0x51CB,0x52A9,0x5632, + 0x5F14,0x5F6B,0x63AA,0x64CD,0x65E9,0x6641,0x66FA,0x66F9, + 0x671D,0x689D,0x68D7,0x69FD,0x6F15,0x6F6E,0x7167,0x71E5, + 0x722A,0x74AA,0x773A,0x7956,0x795A,0x79DF,0x7A20,0x7A95, + 0x7C97,0x7CDF,0x7D44,0x7E70,0x8087,0x85FB,0x86A4,0x8A54, + 0x8ABF,0x8D99,0x8E81,0x9020,0x906D,0x91E3,0x963B,0x96D5, + 0x9CE5,0x65CF,0x7C07,0x8DB3,0x93C3,0x5B58,0x5C0A,0x5352, + 0x62D9,0x731D,0x5027,0x5B97,0x5F9E,0x60B0,0x616B,0x68D5, + 0x6DD9,0x742E,0x7A2E,0x7D42,0x7D9C,0x7E31,0x816B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 114, Array index 0x4D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8E2A,0x8E35,0x937E,0x9418,0x4F50,0x5750,0x5DE6, + 0x5EA7,0x632B,0x7F6A,0x4E3B,0x4F4F,0x4F8F,0x505A,0x59DD, + 0x80C4,0x546A,0x5468,0x55FE,0x594F,0x5B99,0x5DDE,0x5EDA, + 0x665D,0x6731,0x67F1,0x682A,0x6CE8,0x6D32,0x6E4A,0x6F8D, + 0x70B7,0x73E0,0x7587,0x7C4C,0x7D02,0x7D2C,0x7DA2,0x821F, + 0x86DB,0x8A3B,0x8A85,0x8D70,0x8E8A,0x8F33,0x9031,0x914E, + 0x9152,0x9444,0x99D0,0x7AF9,0x7CA5,0x4FCA,0x5101,0x51C6, + 0x57C8,0x5BEF,0x5CFB,0x6659,0x6A3D,0x6D5A,0x6E96,0x6FEC, + 0x710C,0x756F,0x7AE3,0x8822,0x9021,0x9075,0x96CB,0x99FF, + 0x8301,0x4E2D,0x4EF2,0x8846,0x91CD,0x537D,0x6ADB,0x696B, + 0x6C41,0x847A,0x589E,0x618E,0x66FE,0x62EF,0x70DD,0x7511, + 0x75C7,0x7E52,0x84B8,0x8B49,0x8D08,0x4E4B,0x53EA,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 115, Array index 0x4E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x54AB,0x5730,0x5740,0x5FD7,0x6301,0x6307,0x646F, + 0x652F,0x65E8,0x667A,0x679D,0x67B3,0x6B62,0x6C60,0x6C9A, + 0x6F2C,0x77E5,0x7825,0x7949,0x7957,0x7D19,0x80A2,0x8102, + 0x81F3,0x829D,0x82B7,0x8718,0x8A8C,0xF9FC,0x8D04,0x8DBE, + 0x9072,0x76F4,0x7A19,0x7A37,0x7E54,0x8077,0x5507,0x55D4, + 0x5875,0x632F,0x6422,0x6649,0x664B,0x686D,0x699B,0x6B84, + 0x6D25,0x6EB1,0x73CD,0x7468,0x74A1,0x755B,0x75B9,0x76E1, + 0x771E,0x778B,0x79E6,0x7E09,0x7E1D,0x81FB,0x852F,0x8897, + 0x8A3A,0x8CD1,0x8EEB,0x8FB0,0x9032,0x93AD,0x9663,0x9673, + 0x9707,0x4F84,0x53F1,0x59EA,0x5AC9,0x5E19,0x684E,0x74C6, + 0x75BE,0x79E9,0x7A92,0x81A3,0x86ED,0x8CEA,0x8DCC,0x8FED, + 0x659F,0x6715,0xF9FD,0x57F7,0x6F57,0x7DDD,0x8F2F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 116, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x93F6,0x96C6,0x5FB5,0x61F2,0x6F84,0x4E14,0x4F98, + 0x501F,0x53C9,0x55DF,0x5D6F,0x5DEE,0x6B21,0x6B64,0x78CB, + 0x7B9A,0xF9FE,0x8E49,0x8ECA,0x906E,0x6349,0x643E,0x7740, + 0x7A84,0x932F,0x947F,0x9F6A,0x64B0,0x6FAF,0x71E6,0x74A8, + 0x74DA,0x7AC4,0x7C12,0x7E82,0x7CB2,0x7E98,0x8B9A,0x8D0A, + 0x947D,0x9910,0x994C,0x5239,0x5BDF,0x64E6,0x672D,0x7D2E, + 0x50ED,0x53C3,0x5879,0x6158,0x6159,0x61FA,0x65AC,0x7AD9, + 0x8B92,0x8B96,0x5009,0x5021,0x5275,0x5531,0x5A3C,0x5EE0, + 0x5F70,0x6134,0x655E,0x660C,0x6636,0x66A2,0x69CD,0x6EC4, + 0x6F32,0x7316,0x7621,0x7A93,0x8139,0x8259,0x83D6,0x84BC, + 0x50B5,0x57F0,0x5BC0,0x5BE8,0x5F69,0x63A1,0x7826,0x7DB5, + 0x83DC,0x8521,0x91C7,0x91F5,0x518A,0x67F5,0x7B56,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 117, Array index 0x5000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8CAC,0x51C4,0x59BB,0x60BD,0x8655,0x501C,0xF9FF, + 0x5254,0x5C3A,0x617D,0x621A,0x62D3,0x64F2,0x65A5,0x6ECC, + 0x7620,0x810A,0x8E60,0x965F,0x96BB,0x4EDF,0x5343,0x5598, + 0x5929,0x5DDD,0x64C5,0x6CC9,0x6DFA,0x7394,0x7A7F,0x821B, + 0x85A6,0x8CE4,0x8E10,0x9077,0x91E7,0x95E1,0x9621,0x97C6, + 0x51F8,0x54F2,0x5586,0x5FB9,0x64A4,0x6F88,0x7DB4,0x8F1F, + 0x8F4D,0x9435,0x50C9,0x5C16,0x6CBE,0x6DFB,0x751B,0x77BB, + 0x7C3D,0x7C64,0x8A79,0x8AC2,0x581E,0x59BE,0x5E16,0x6377, + 0x7252,0x758A,0x776B,0x8ADC,0x8CBC,0x8F12,0x5EF3,0x6674, + 0x6DF8,0x807D,0x83C1,0x8ACB,0x9751,0x9BD6,0xFA00,0x5243, + 0x66FF,0x6D95,0x6EEF,0x7DE0,0x8AE6,0x902E,0x905E,0x9AD4, + 0x521D,0x527F,0x54E8,0x6194,0x6284,0x62DB,0x68A2,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 118, Array index 0x5100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6912,0x695A,0x6A35,0x7092,0x7126,0x785D,0x7901, + 0x790E,0x79D2,0x7A0D,0x8096,0x8278,0x82D5,0x8349,0x8549, + 0x8C82,0x8D85,0x9162,0x918B,0x91AE,0x4FC3,0x56D1,0x71ED, + 0x77D7,0x8700,0x89F8,0x5BF8,0x5FD6,0x6751,0x90A8,0x53E2, + 0x585A,0x5BF5,0x60A4,0x6181,0x6460,0x7E3D,0x8070,0x8525, + 0x9283,0x64AE,0x50AC,0x5D14,0x6700,0x589C,0x62BD,0x63A8, + 0x690E,0x6978,0x6A1E,0x6E6B,0x76BA,0x79CB,0x82BB,0x8429, + 0x8ACF,0x8DA8,0x8FFD,0x9112,0x914B,0x919C,0x9310,0x9318, + 0x939A,0x96DB,0x9A36,0x9C0D,0x4E11,0x755C,0x795D,0x7AFA, + 0x7B51,0x7BC9,0x7E2E,0x84C4,0x8E59,0x8E74,0x8EF8,0x9010, + 0x6625,0x693F,0x7443,0x51FA,0x672E,0x9EDC,0x5145,0x5FE0, + 0x6C96,0x87F2,0x885D,0x8877,0x60B4,0x81B5,0x8403,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 119, Array index 0x5200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x8D05,0x53D6,0x5439,0x5634,0x5A36,0x5C31,0x708A, + 0x7FE0,0x805A,0x8106,0x81ED,0x8DA3,0x9189,0x9A5F,0x9DF2, + 0x5074,0x4EC4,0x53A0,0x60FB,0x6E2C,0x5C64,0x4F88,0x5024, + 0x55E4,0x5CD9,0x5E5F,0x6065,0x6894,0x6CBB,0x6DC4,0x71BE, + 0x75D4,0x75F4,0x7661,0x7A1A,0x7A49,0x7DC7,0x7DFB,0x7F6E, + 0x81F4,0x86A9,0x8F1C,0x96C9,0x99B3,0x9F52,0x5247,0x52C5, + 0x98ED,0x89AA,0x4E03,0x67D2,0x6F06,0x4FB5,0x5BE2,0x6795, + 0x6C88,0x6D78,0x741B,0x7827,0x91DD,0x937C,0x87C4,0x79E4, + 0x7A31,0x5FEB,0x4ED6,0x54A4,0x553E,0x58AE,0x59A5,0x60F0, + 0x6253,0x62D6,0x6736,0x6955,0x8235,0x9640,0x99B1,0x99DD, + 0x502C,0x5353,0x5544,0x577C,0xFA01,0x6258,0xFA02,0x64E2, + 0x666B,0x67DD,0x6FC1,0x6FEF,0x7422,0x7438,0x8A17,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 120, Array index 0x5300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x9438,0x5451,0x5606,0x5766,0x5F48,0x619A,0x6B4E, + 0x7058,0x70AD,0x7DBB,0x8A95,0x596A,0x812B,0x63A2,0x7708, + 0x803D,0x8CAA,0x5854,0x642D,0x69BB,0x5B95,0x5E11,0x6E6F, + 0xFA03,0x8569,0x514C,0x53F0,0x592A,0x6020,0x614B,0x6B86, + 0x6C70,0x6CF0,0x7B1E,0x80CE,0x82D4,0x8DC6,0x90B0,0x98B1, + 0xFA04,0x64C7,0x6FA4,0x6491,0x6504,0x514E,0x5410,0x571F, + 0x8A0E,0x615F,0x6876,0xFA05,0x75DB,0x7B52,0x7D71,0x901A, + 0x5806,0x69CC,0x817F,0x892A,0x9000,0x9839,0x5078,0x5957, + 0x59AC,0x6295,0x900F,0x9B2A,0x615D,0x7279,0x95D6,0x5761, + 0x5A46,0x5DF4,0x628A,0x64AD,0x64FA,0x6777,0x6CE2,0x6D3E, + 0x722C,0x7436,0x7834,0x7F77,0x82AD,0x8DDB,0x9817,0x5224, + 0x5742,0x677F,0x7248,0x74E3,0x8CA9,0x8FA6,0x9211,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x5400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x962A,0x516B,0x53ED,0x634C,0x4F69,0x5504,0x6096, + 0x6557,0x6C9B,0x6D7F,0x724C,0x72FD,0x7A17,0x8987,0x8C9D, + 0x5F6D,0x6F8E,0x70F9,0x81A8,0x610E,0x4FBF,0x504F,0x6241, + 0x7247,0x7BC7,0x7DE8,0x7FE9,0x904D,0x97AD,0x9A19,0x8CB6, + 0x576A,0x5E73,0x67B0,0x840D,0x8A55,0x5420,0x5B16,0x5E63, + 0x5EE2,0x5F0A,0x6583,0x80BA,0x853D,0x9589,0x965B,0x4F48, + 0x5305,0x530D,0x530F,0x5486,0x54FA,0x5703,0x5E03,0x6016, + 0x629B,0x62B1,0x6355,0xFA06,0x6CE1,0x6D66,0x75B1,0x7832, + 0x80DE,0x812F,0x82DE,0x8461,0x84B2,0x888D,0x8912,0x900B, + 0x92EA,0x98FD,0x9B91,0x5E45,0x66B4,0x66DD,0x7011,0x7206, + 0xFA07,0x4FF5,0x527D,0x5F6A,0x6153,0x6753,0x6A19,0x6F02, + 0x74E2,0x7968,0x8868,0x8C79,0x98C7,0x98C4,0x9A43,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 122, Array index 0x5500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x54C1,0x7A1F,0x6953,0x8AF7,0x8C4A,0x98A8,0x99AE, + 0x5F7C,0x62AB,0x75B2,0x76AE,0x88AB,0x907F,0x9642,0x5339, + 0x5F3C,0x5FC5,0x6CCC,0x73CC,0x7562,0x758B,0x7B46,0x82FE, + 0x999D,0x4E4F,0x903C,0x4E0B,0x4F55,0x53A6,0x590F,0x5EC8, + 0x6630,0x6CB3,0x7455,0x8377,0x8766,0x8CC0,0x9050,0x971E, + 0x9C15,0x58D1,0x5B78,0x8650,0x8B14,0x9DB4,0x5BD2,0x6068, + 0x608D,0x65F1,0x6C57,0x6F22,0x6FA3,0x701A,0x7F55,0x7FF0, + 0x9591,0x9592,0x9650,0x97D3,0x5272,0x8F44,0x51FD,0x542B, + 0x54B8,0x5563,0x558A,0x6ABB,0x6DB5,0x7DD8,0x8266,0x929C, + 0x9677,0x9E79,0x5408,0x54C8,0x76D2,0x86E4,0x95A4,0x95D4, + 0x965C,0x4EA2,0x4F09,0x59EE,0x5AE6,0x5DF7,0x6052,0x6297, + 0x676D,0x6841,0x6C86,0x6E2F,0x7F38,0x809B,0x822A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x5600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0xFA08,0xFA09,0x9805,0x4EA5,0x5055,0x54B3,0x5793, + 0x595A,0x5B69,0x5BB3,0x61C8,0x6977,0x6D77,0x7023,0x87F9, + 0x89E3,0x8A72,0x8AE7,0x9082,0x99ED,0x9AB8,0x52BE,0x6838, + 0x5016,0x5E78,0x674F,0x8347,0x884C,0x4EAB,0x5411,0x56AE, + 0x73E6,0x9115,0x97FF,0x9909,0x9957,0x9999,0x5653,0x589F, + 0x865B,0x8A31,0x61B2,0x6AF6,0x737B,0x8ED2,0x6B47,0x96AA, + 0x9A57,0x5955,0x7200,0x8D6B,0x9769,0x4FD4,0x5CF4,0x5F26, + 0x61F8,0x665B,0x6CEB,0x70AB,0x7384,0x73B9,0x73FE,0x7729, + 0x774D,0x7D43,0x7D62,0x7E23,0x8237,0x8852,0xFA0A,0x8CE2, + 0x9249,0x986F,0x5B51,0x7A74,0x8840,0x9801,0x5ACC,0x4FE0, + 0x5354,0x593E,0x5CFD,0x633E,0x6D79,0x72F9,0x8105,0x8107, + 0x83A2,0x92CF,0x9830,0x4EA8,0x5144,0x5211,0x578B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 124, Array index 0x5700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F62,0x6CC2,0x6ECE,0x7005,0x7050,0x70AF,0x7192, + 0x73E9,0x7469,0x834A,0x87A2,0x8861,0x9008,0x90A2,0x93A3, + 0x99A8,0x516E,0x5F57,0x60E0,0x6167,0x66B3,0x8559,0x8E4A, + 0x91AF,0x978B,0x4E4E,0x4E92,0x547C,0x58D5,0x58FA,0x597D, + 0x5CB5,0x5F27,0x6236,0x6248,0x660A,0x6667,0x6BEB,0x6D69, + 0x6DCF,0x6E56,0x6EF8,0x6F94,0x6FE0,0x6FE9,0x705D,0x72D0, + 0x7425,0x745A,0x74E0,0x7693,0x795C,0x7CCA,0x7E1E,0x80E1, + 0x82A6,0x846B,0x84BF,0x864E,0x865F,0x8774,0x8B77,0x8C6A, + 0x93AC,0x9800,0x9865,0x60D1,0x6216,0x9177,0x5A5A,0x660F, + 0x6DF7,0x6E3E,0x743F,0x9B42,0x5FFD,0x60DA,0x7B0F,0x54C4, + 0x5F18,0x6C5E,0x6CD3,0x6D2A,0x70D8,0x7D05,0x8679,0x8A0C, + 0x9D3B,0x5316,0x548C,0x5B05,0x6A3A,0x706B,0x7575,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 125, Array index 0x5800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x798D,0x79BE,0x82B1,0x83EF,0x8A71,0x8B41,0x8CA8, + 0x9774,0xFA0B,0x64F4,0x652B,0x78BA,0x78BB,0x7A6B,0x4E38, + 0x559A,0x5950,0x5BA6,0x5E7B,0x60A3,0x63DB,0x6B61,0x6665, + 0x6853,0x6E19,0x7165,0x74B0,0x7D08,0x9084,0x9A69,0x9C25, + 0x6D3B,0x6ED1,0x733E,0x8C41,0x95CA,0x51F0,0x5E4C,0x5FA8, + 0x604D,0x60F6,0x6130,0x614C,0x6643,0x6644,0x69A5,0x6CC1, + 0x6E5F,0x6EC9,0x6F62,0x714C,0x749C,0x7687,0x7BC1,0x7C27, + 0x8352,0x8757,0x9051,0x968D,0x9EC3,0x532F,0x56DE,0x5EFB, + 0x5F8A,0x6062,0x6094,0x61F7,0x6666,0x6703,0x6A9C,0x6DEE, + 0x6FAE,0x7070,0x736A,0x7E6A,0x81BE,0x8334,0x86D4,0x8AA8, + 0x8CC4,0x5283,0x7372,0x5B96,0x6A6B,0x9404,0x54EE,0x5686, + 0x5B5D,0x6548,0x6585,0x66C9,0x689F,0x6D8D,0x6DC6,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 126, Array index 0x5900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x723B,0x80B4,0x9175,0x9A4D,0x4FAF,0x5019,0x539A, + 0x540E,0x543C,0x5589,0x55C5,0x5E3F,0x5F8C,0x673D,0x7166, + 0x73DD,0x9005,0x52DB,0x52F3,0x5864,0x58CE,0x7104,0x718F, + 0x71FB,0x85B0,0x8A13,0x6688,0x85A8,0x55A7,0x6684,0x714A, + 0x8431,0x5349,0x5599,0x6BC1,0x5F59,0x5FBD,0x63EE,0x6689, + 0x7147,0x8AF1,0x8F1D,0x9EBE,0x4F11,0x643A,0x70CB,0x7566, + 0x8667,0x6064,0x8B4E,0x9DF8,0x5147,0x51F6,0x5308,0x6D36, + 0x80F8,0x9ED1,0x6615,0x6B23,0x7098,0x75D5,0x5403,0x5C79, + 0x7D07,0x8A16,0x6B20,0x6B3D,0x6B46,0x5438,0x6070,0x6D3D, + 0x7FD5,0x8208,0x50D6,0x51DE,0x559C,0x566B,0x56CD,0x59EC, + 0x5B09,0x5E0C,0x6199,0x6198,0x6231,0x665E,0x66E6,0x7199, + 0x71B9,0x71BA,0x72A7,0x79A7,0x7A00,0x7FB2,0x8A70,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_TO_UCS_CCS_KSX1001 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit ksx1001 -> UCS size-optimized table (17018 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_KSX1001) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +to_ucs_size_ksx1001[] = +{ + 0x005D, /* Ranges number */ + 0x0000, /* Unranged codes number */ + 0x213D, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x2121, 0x217E, 0x011A, + /* Array index: 0x0006 */ 0x2221, 0x2265, 0x0178, + /* Array index: 0x0009 */ 0x2321, 0x237E, 0x01BD, + /* Array index: 0x000C */ 0x2421, 0x247E, 0x021B, + /* Array index: 0x000F */ 0x2521, 0x252A, 0x0279, + /* Array index: 0x0012 */ 0x2530, 0x2539, 0x0283, + /* Array index: 0x0015 */ 0x2541, 0x2558, 0x028D, + /* Array index: 0x0018 */ 0x2561, 0x2578, 0x02A5, + /* Array index: 0x001B */ 0x2621, 0x2664, 0x02BD, + /* Array index: 0x001E */ 0x2721, 0x276F, 0x0301, + /* Array index: 0x0021 */ 0x2821, 0x287E, 0x0350, + /* Array index: 0x0024 */ 0x2921, 0x297E, 0x03AE, + /* Array index: 0x0027 */ 0x2A21, 0x2A73, 0x040C, + /* Array index: 0x002A */ 0x2B21, 0x2B76, 0x045F, + /* Array index: 0x002D */ 0x2C21, 0x2C41, 0x04B5, + /* Array index: 0x0030 */ 0x2C51, 0x2C71, 0x04D6, + /* Array index: 0x0033 */ 0x3021, 0x307E, 0x04F7, + /* Array index: 0x0036 */ 0x3121, 0x317E, 0x0555, + /* Array index: 0x0039 */ 0x3221, 0x327E, 0x05B3, + /* Array index: 0x003C */ 0x3321, 0x337E, 0x0611, + /* Array index: 0x003F */ 0x3421, 0x347E, 0x066F, + /* Array index: 0x0042 */ 0x3521, 0x357E, 0x06CD, + /* Array index: 0x0045 */ 0x3621, 0x367E, 0x072B, + /* Array index: 0x0048 */ 0x3721, 0x377E, 0x0789, + /* Array index: 0x004B */ 0x3821, 0x387E, 0x07E7, + /* Array index: 0x004E */ 0x3921, 0x397E, 0x0845, + /* Array index: 0x0051 */ 0x3A21, 0x3A7E, 0x08A3, + /* Array index: 0x0054 */ 0x3B21, 0x3B7E, 0x0901, + /* Array index: 0x0057 */ 0x3C21, 0x3C7E, 0x095F, + /* Array index: 0x005A */ 0x3D21, 0x3D7E, 0x09BD, + /* Array index: 0x005D */ 0x3E21, 0x3E7E, 0x0A1B, + /* Array index: 0x0060 */ 0x3F21, 0x3F7E, 0x0A79, + /* Array index: 0x0063 */ 0x4021, 0x407E, 0x0AD7, + /* Array index: 0x0066 */ 0x4121, 0x417E, 0x0B35, + /* Array index: 0x0069 */ 0x4221, 0x427E, 0x0B93, + /* Array index: 0x006C */ 0x4321, 0x437E, 0x0BF1, + /* Array index: 0x006F */ 0x4421, 0x447E, 0x0C4F, + /* Array index: 0x0072 */ 0x4521, 0x457E, 0x0CAD, + /* Array index: 0x0075 */ 0x4621, 0x467E, 0x0D0B, + /* Array index: 0x0078 */ 0x4721, 0x477E, 0x0D69, + /* Array index: 0x007B */ 0x4821, 0x487E, 0x0DC7, + /* Array index: 0x007E */ 0x4A21, 0x4A7E, 0x0E25, + /* Array index: 0x0081 */ 0x4B21, 0x4B7E, 0x0E83, + /* Array index: 0x0084 */ 0x4C21, 0x4C7E, 0x0EE1, + /* Array index: 0x0087 */ 0x4D21, 0x4D7E, 0x0F3F, + /* Array index: 0x008A */ 0x4E21, 0x4E7E, 0x0F9D, + /* Array index: 0x008D */ 0x4F21, 0x4F7E, 0x0FFB, + /* Array index: 0x0090 */ 0x5021, 0x507E, 0x1059, + /* Array index: 0x0093 */ 0x5121, 0x517E, 0x10B7, + /* Array index: 0x0096 */ 0x5221, 0x527E, 0x1115, + /* Array index: 0x0099 */ 0x5321, 0x537E, 0x1173, + /* Array index: 0x009C */ 0x5421, 0x547E, 0x11D1, + /* Array index: 0x009F */ 0x5521, 0x557E, 0x122F, + /* Array index: 0x00A2 */ 0x5621, 0x567E, 0x128D, + /* Array index: 0x00A5 */ 0x5721, 0x577E, 0x12EB, + /* Array index: 0x00A8 */ 0x5821, 0x587E, 0x1349, + /* Array index: 0x00AB */ 0x5921, 0x597E, 0x13A7, + /* Array index: 0x00AE */ 0x5A21, 0x5A7E, 0x1405, + /* Array index: 0x00B1 */ 0x5B21, 0x5B7E, 0x1463, + /* Array index: 0x00B4 */ 0x5C21, 0x5C7E, 0x14C1, + /* Array index: 0x00B7 */ 0x5D21, 0x5D7E, 0x151F, + /* Array index: 0x00BA */ 0x5E21, 0x5E7E, 0x157D, + /* Array index: 0x00BD */ 0x5F21, 0x5F7E, 0x15DB, + /* Array index: 0x00C0 */ 0x6021, 0x607E, 0x1639, + /* Array index: 0x00C3 */ 0x6121, 0x617E, 0x1697, + /* Array index: 0x00C6 */ 0x6221, 0x627E, 0x16F5, + /* Array index: 0x00C9 */ 0x6321, 0x637E, 0x1753, + /* Array index: 0x00CC */ 0x6421, 0x647E, 0x17B1, + /* Array index: 0x00CF */ 0x6521, 0x657E, 0x180F, + /* Array index: 0x00D2 */ 0x6621, 0x667E, 0x186D, + /* Array index: 0x00D5 */ 0x6721, 0x677E, 0x18CB, + /* Array index: 0x00D8 */ 0x6821, 0x687E, 0x1929, + /* Array index: 0x00DB */ 0x6921, 0x697E, 0x1987, + /* Array index: 0x00DE */ 0x6A21, 0x6A7E, 0x19E5, + /* Array index: 0x00E1 */ 0x6B21, 0x6B7E, 0x1A43, + /* Array index: 0x00E4 */ 0x6C21, 0x6C7E, 0x1AA1, + /* Array index: 0x00E7 */ 0x6D21, 0x6D7E, 0x1AFF, + /* Array index: 0x00EA */ 0x6E21, 0x6E7E, 0x1B5D, + /* Array index: 0x00ED */ 0x6F21, 0x6F7E, 0x1BBB, + /* Array index: 0x00F0 */ 0x7021, 0x707E, 0x1C19, + /* Array index: 0x00F3 */ 0x7121, 0x717E, 0x1C77, + /* Array index: 0x00F6 */ 0x7221, 0x727E, 0x1CD5, + /* Array index: 0x00F9 */ 0x7321, 0x737E, 0x1D33, + /* Array index: 0x00FC */ 0x7421, 0x747E, 0x1D91, + /* Array index: 0x00FF */ 0x7521, 0x757E, 0x1DEF, + /* Array index: 0x0102 */ 0x7621, 0x767E, 0x1E4D, + /* Array index: 0x0105 */ 0x7721, 0x777E, 0x1EAB, + /* Array index: 0x0108 */ 0x7821, 0x787E, 0x1F09, + /* Array index: 0x010B */ 0x7921, 0x797E, 0x1F67, + /* Array index: 0x010E */ 0x7A21, 0x7A7E, 0x1FC5, + /* Array index: 0x0111 */ 0x7B21, 0x7B7E, 0x2023, + /* Array index: 0x0114 */ 0x7C21, 0x7C7E, 0x2081, + /* Array index: 0x0117 */ 0x7D21, 0x7D7E, 0x20DF, + /* Ranges content */ + /* Range 0x2121 - 0x217E, array index: 0x011A */ + 0x3000,0x3001,0x3002,0x00B7,0x2025,0x2026,0x00A8,0x3003, + 0x00AD,0x2015,0x2225,0xFF3C,0x223C,0x2018,0x2019,0x201C, + 0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B,0x300C, + 0x300D,0x300E,0x300F,0x3010,0x3011,0x00B1,0x00D7,0x00F7, + 0x2260,0x2264,0x2265,0x221E,0x2234,0x00B0,0x2032,0x2033, + 0x2103,0x212B,0xFFE0,0xFFE1,0xFFE5,0x2642,0x2640,0x2220, + 0x22A5,0x2312,0x2202,0x2207,0x2261,0x2252,0x00A7,0x203B, + 0x2606,0x2605,0x25CB,0x25CF,0x25CE,0x25C7,0x25C6,0x25A1, + 0x25A0,0x25B3,0x25B2,0x25BD,0x25BC,0x2192,0x2190,0x2191, + 0x2193,0x2194,0x3013,0x226A,0x226B,0x221A,0x223D,0x221D, + 0x2235,0x222B,0x222C,0x2208,0x220B,0x2286,0x2287,0x2282, + 0x2283,0x222A,0x2229,0x2227,0x2228,0xFFE2, + /* Range 0x2221 - 0x2265, array index: 0x0178 */ + 0x21D2,0x21D4,0x2200,0x2203,0x00B4,0xFF5E,0x02C7,0x02D8, + 0x02DD,0x02DA,0x02D9,0x00B8,0x02DB,0x00A1,0x00BF,0x02D0, + 0x222E,0x2211,0x220F,0x00A4,0x2109,0x2030,0x25C1,0x25C0, + 0x25B7,0x25B6,0x2664,0x2660,0x2661,0x2665,0x2667,0x2663, + 0x2299,0x25C8,0x25A3,0x25D0,0x25D1,0x2592,0x25A4,0x25A5, + 0x25A8,0x25A7,0x25A6,0x25A9,0x2668,0x260F,0x260E,0x261C, + 0x261E,0x00B6,0x2020,0x2021,0x2195,0x2197,0x2199,0x2196, + 0x2198,0x266D,0x2669,0x266A,0x266C,0x327F,0x321C,0x2116, + 0x33C7,0x2122,0x33C2,0x33D8,0x2121, + /* Range 0x2321 - 0x237E, array index: 0x01BD */ + 0xFF01,0xFF02,0xFF03,0xFF04,0xFF05,0xFF06,0xFF07,0xFF08, + 0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F,0xFF10, + 0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, + 0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F,0xFF20, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, + 0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, + 0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, + 0xFF39,0xFF3A,0xFF3B,0xFFE6,0xFF3D,0xFF3E,0xFF3F,0xFF40, + 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48, + 0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50, + 0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58, + 0xFF59,0xFF5A,0xFF5B,0xFF5C,0xFF5D,0xFFE3, + /* Range 0x2421 - 0x247E, array index: 0x021B */ + 0x3131,0x3132,0x3133,0x3134,0x3135,0x3136,0x3137,0x3138, + 0x3139,0x313A,0x313B,0x313C,0x313D,0x313E,0x313F,0x3140, + 0x3141,0x3142,0x3143,0x3144,0x3145,0x3146,0x3147,0x3148, + 0x3149,0x314A,0x314B,0x314C,0x314D,0x314E,0x314F,0x3150, + 0x3151,0x3152,0x3153,0x3154,0x3155,0x3156,0x3157,0x3158, + 0x3159,0x315A,0x315B,0x315C,0x315D,0x315E,0x315F,0x3160, + 0x3161,0x3162,0x3163,0x3164,0x3165,0x3166,0x3167,0x3168, + 0x3169,0x316A,0x316B,0x316C,0x316D,0x316E,0x316F,0x3170, + 0x3171,0x3172,0x3173,0x3174,0x3175,0x3176,0x3177,0x3178, + 0x3179,0x317A,0x317B,0x317C,0x317D,0x317E,0x317F,0x3180, + 0x3181,0x3182,0x3183,0x3184,0x3185,0x3186,0x3187,0x3188, + 0x3189,0x318A,0x318B,0x318C,0x318D,0x318E, + /* Range 0x2521 - 0x252A, array index: 0x0279 */ + 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177, + 0x2178,0x2179, + /* Range 0x2530 - 0x2539, array index: 0x0283 */ + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, + 0x2168,0x2169, + /* Range 0x2541 - 0x2558, array index: 0x028D */ + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398, + 0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0, + 0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + /* Range 0x2561 - 0x2578, array index: 0x02A5 */ + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8, + 0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9, + /* Range 0x2621 - 0x2664, array index: 0x02BD */ + 0x2500,0x2502,0x250C,0x2510,0x2518,0x2514,0x251C,0x252C, + 0x2524,0x2534,0x253C,0x2501,0x2503,0x250F,0x2513,0x251B, + 0x2517,0x2523,0x2533,0x252B,0x253B,0x254B,0x2520,0x252F, + 0x2528,0x2537,0x253F,0x251D,0x2530,0x2525,0x2538,0x2542, + 0x2512,0x2511,0x251A,0x2519,0x2516,0x2515,0x250E,0x250D, + 0x251E,0x251F,0x2521,0x2522,0x2526,0x2527,0x2529,0x252A, + 0x252D,0x252E,0x2531,0x2532,0x2535,0x2536,0x2539,0x253A, + 0x253D,0x253E,0x2540,0x2541,0x2543,0x2544,0x2545,0x2546, + 0x2547,0x2548,0x2549,0x254A, + /* Range 0x2721 - 0x276F, array index: 0x0301 */ + 0x3395,0x3396,0x3397,0x2113,0x3398,0x33C4,0x33A3,0x33A4, + 0x33A5,0x33A6,0x3399,0x339A,0x339B,0x339C,0x339D,0x339E, + 0x339F,0x33A0,0x33A1,0x33A2,0x33CA,0x338D,0x338E,0x338F, + 0x33CF,0x3388,0x3389,0x33C8,0x33A7,0x33A8,0x33B0,0x33B1, + 0x33B2,0x33B3,0x33B4,0x33B5,0x33B6,0x33B7,0x33B8,0x33B9, + 0x3380,0x3381,0x3382,0x3383,0x3384,0x33BA,0x33BB,0x33BC, + 0x33BD,0x33BE,0x33BF,0x3390,0x3391,0x3392,0x3393,0x3394, + 0x2126,0x33C0,0x33C1,0x338A,0x338B,0x338C,0x33D6,0x33C5, + 0x33AD,0x33AE,0x33AF,0x33DB,0x33A9,0x33AA,0x33AB,0x33AC, + 0x33DD,0x33D0,0x33D3,0x33C3,0x33C9,0x33DC,0x33C6, + /* Range 0x2821 - 0x287E, array index: 0x0350 */ + 0x00C6,0x00D0,0x00AA,0x0126,INVALC,0x0132,INVALC,0x013F, + 0x0141,0x00D8,0x0152,0x00BA,0x00DE,0x0166,0x014A,INVALC, + 0x3260,0x3261,0x3262,0x3263,0x3264,0x3265,0x3266,0x3267, + 0x3268,0x3269,0x326A,0x326B,0x326C,0x326D,0x326E,0x326F, + 0x3270,0x3271,0x3272,0x3273,0x3274,0x3275,0x3276,0x3277, + 0x3278,0x3279,0x327A,0x327B,0x24D0,0x24D1,0x24D2,0x24D3, + 0x24D4,0x24D5,0x24D6,0x24D7,0x24D8,0x24D9,0x24DA,0x24DB, + 0x24DC,0x24DD,0x24DE,0x24DF,0x24E0,0x24E1,0x24E2,0x24E3, + 0x24E4,0x24E5,0x24E6,0x24E7,0x24E8,0x24E9,0x2460,0x2461, + 0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468,0x2469, + 0x246A,0x246B,0x246C,0x246D,0x246E,0x00BD,0x2153,0x2154, + 0x00BC,0x00BE,0x215B,0x215C,0x215D,0x215E, + /* Range 0x2921 - 0x297E, array index: 0x03AE */ + 0x00E6,0x0111,0x00F0,0x0127,0x0131,0x0133,0x0138,0x0140, + 0x0142,0x00F8,0x0153,0x00DF,0x00FE,0x0167,0x014B,0x0149, + 0x3200,0x3201,0x3202,0x3203,0x3204,0x3205,0x3206,0x3207, + 0x3208,0x3209,0x320A,0x320B,0x320C,0x320D,0x320E,0x320F, + 0x3210,0x3211,0x3212,0x3213,0x3214,0x3215,0x3216,0x3217, + 0x3218,0x3219,0x321A,0x321B,0x249C,0x249D,0x249E,0x249F, + 0x24A0,0x24A1,0x24A2,0x24A3,0x24A4,0x24A5,0x24A6,0x24A7, + 0x24A8,0x24A9,0x24AA,0x24AB,0x24AC,0x24AD,0x24AE,0x24AF, + 0x24B0,0x24B1,0x24B2,0x24B3,0x24B4,0x24B5,0x2474,0x2475, + 0x2476,0x2477,0x2478,0x2479,0x247A,0x247B,0x247C,0x247D, + 0x247E,0x247F,0x2480,0x2481,0x2482,0x00B9,0x00B2,0x00B3, + 0x2074,0x207F,0x2081,0x2082,0x2083,0x2084, + /* Range 0x2A21 - 0x2A73, array index: 0x040C */ + 0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048, + 0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050, + 0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058, + 0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060, + 0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068, + 0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070, + 0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078, + 0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080, + 0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088, + 0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090, + 0x3091,0x3092,0x3093, + /* Range 0x2B21 - 0x2B76, array index: 0x045F */ + 0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, + 0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, + 0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, + 0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, + 0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, + 0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, + 0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, + 0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0, + 0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8, + 0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0, + 0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6, + /* Range 0x2C21 - 0x2C41, array index: 0x04B5 */ + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, + 0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, + 0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, + 0x042F, + /* Range 0x2C51 - 0x2C71, array index: 0x04D6 */ + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, + 0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, + 0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, + 0x044F, + /* Range 0x3021 - 0x307E, array index: 0x04F7 */ + 0xAC00,0xAC01,0xAC04,0xAC07,0xAC08,0xAC09,0xAC0A,0xAC10, + 0xAC11,0xAC12,0xAC13,0xAC14,0xAC15,0xAC16,0xAC17,0xAC19, + 0xAC1A,0xAC1B,0xAC1C,0xAC1D,0xAC20,0xAC24,0xAC2C,0xAC2D, + 0xAC2F,0xAC30,0xAC31,0xAC38,0xAC39,0xAC3C,0xAC40,0xAC4B, + 0xAC4D,0xAC54,0xAC58,0xAC5C,0xAC70,0xAC71,0xAC74,0xAC77, + 0xAC78,0xAC7A,0xAC80,0xAC81,0xAC83,0xAC84,0xAC85,0xAC86, + 0xAC89,0xAC8A,0xAC8B,0xAC8C,0xAC90,0xAC94,0xAC9C,0xAC9D, + 0xAC9F,0xACA0,0xACA1,0xACA8,0xACA9,0xACAA,0xACAC,0xACAF, + 0xACB0,0xACB8,0xACB9,0xACBB,0xACBC,0xACBD,0xACC1,0xACC4, + 0xACC8,0xACCC,0xACD5,0xACD7,0xACE0,0xACE1,0xACE4,0xACE7, + 0xACE8,0xACEA,0xACEC,0xACEF,0xACF0,0xACF1,0xACF3,0xACF5, + 0xACF6,0xACFC,0xACFD,0xAD00,0xAD04,0xAD06, + /* Range 0x3121 - 0x317E, array index: 0x0555 */ + 0xAD0C,0xAD0D,0xAD0F,0xAD11,0xAD18,0xAD1C,0xAD20,0xAD29, + 0xAD2C,0xAD2D,0xAD34,0xAD35,0xAD38,0xAD3C,0xAD44,0xAD45, + 0xAD47,0xAD49,0xAD50,0xAD54,0xAD58,0xAD61,0xAD63,0xAD6C, + 0xAD6D,0xAD70,0xAD73,0xAD74,0xAD75,0xAD76,0xAD7B,0xAD7C, + 0xAD7D,0xAD7F,0xAD81,0xAD82,0xAD88,0xAD89,0xAD8C,0xAD90, + 0xAD9C,0xAD9D,0xADA4,0xADB7,0xADC0,0xADC1,0xADC4,0xADC8, + 0xADD0,0xADD1,0xADD3,0xADDC,0xADE0,0xADE4,0xADF8,0xADF9, + 0xADFC,0xADFF,0xAE00,0xAE01,0xAE08,0xAE09,0xAE0B,0xAE0D, + 0xAE14,0xAE30,0xAE31,0xAE34,0xAE37,0xAE38,0xAE3A,0xAE40, + 0xAE41,0xAE43,0xAE45,0xAE46,0xAE4A,0xAE4C,0xAE4D,0xAE4E, + 0xAE50,0xAE54,0xAE56,0xAE5C,0xAE5D,0xAE5F,0xAE60,0xAE61, + 0xAE65,0xAE68,0xAE69,0xAE6C,0xAE70,0xAE78, + /* Range 0x3221 - 0x327E, array index: 0x05B3 */ + 0xAE79,0xAE7B,0xAE7C,0xAE7D,0xAE84,0xAE85,0xAE8C,0xAEBC, + 0xAEBD,0xAEBE,0xAEC0,0xAEC4,0xAECC,0xAECD,0xAECF,0xAED0, + 0xAED1,0xAED8,0xAED9,0xAEDC,0xAEE8,0xAEEB,0xAEED,0xAEF4, + 0xAEF8,0xAEFC,0xAF07,0xAF08,0xAF0D,0xAF10,0xAF2C,0xAF2D, + 0xAF30,0xAF32,0xAF34,0xAF3C,0xAF3D,0xAF3F,0xAF41,0xAF42, + 0xAF43,0xAF48,0xAF49,0xAF50,0xAF5C,0xAF5D,0xAF64,0xAF65, + 0xAF79,0xAF80,0xAF84,0xAF88,0xAF90,0xAF91,0xAF95,0xAF9C, + 0xAFB8,0xAFB9,0xAFBC,0xAFC0,0xAFC7,0xAFC8,0xAFC9,0xAFCB, + 0xAFCD,0xAFCE,0xAFD4,0xAFDC,0xAFE8,0xAFE9,0xAFF0,0xAFF1, + 0xAFF4,0xAFF8,0xB000,0xB001,0xB004,0xB00C,0xB010,0xB014, + 0xB01C,0xB01D,0xB028,0xB044,0xB045,0xB048,0xB04A,0xB04C, + 0xB04E,0xB053,0xB054,0xB055,0xB057,0xB059, + /* Range 0x3321 - 0x337E, array index: 0x0611 */ + 0xB05D,0xB07C,0xB07D,0xB080,0xB084,0xB08C,0xB08D,0xB08F, + 0xB091,0xB098,0xB099,0xB09A,0xB09C,0xB09F,0xB0A0,0xB0A1, + 0xB0A2,0xB0A8,0xB0A9,0xB0AB,0xB0AC,0xB0AD,0xB0AE,0xB0AF, + 0xB0B1,0xB0B3,0xB0B4,0xB0B5,0xB0B8,0xB0BC,0xB0C4,0xB0C5, + 0xB0C7,0xB0C8,0xB0C9,0xB0D0,0xB0D1,0xB0D4,0xB0D8,0xB0E0, + 0xB0E5,0xB108,0xB109,0xB10B,0xB10C,0xB110,0xB112,0xB113, + 0xB118,0xB119,0xB11B,0xB11C,0xB11D,0xB123,0xB124,0xB125, + 0xB128,0xB12C,0xB134,0xB135,0xB137,0xB138,0xB139,0xB140, + 0xB141,0xB144,0xB148,0xB150,0xB151,0xB154,0xB155,0xB158, + 0xB15C,0xB160,0xB178,0xB179,0xB17C,0xB180,0xB182,0xB188, + 0xB189,0xB18B,0xB18D,0xB192,0xB193,0xB194,0xB198,0xB19C, + 0xB1A8,0xB1CC,0xB1D0,0xB1D4,0xB1DC,0xB1DD, + /* Range 0x3421 - 0x347E, array index: 0x066F */ + 0xB1DF,0xB1E8,0xB1E9,0xB1EC,0xB1F0,0xB1F9,0xB1FB,0xB1FD, + 0xB204,0xB205,0xB208,0xB20B,0xB20C,0xB214,0xB215,0xB217, + 0xB219,0xB220,0xB234,0xB23C,0xB258,0xB25C,0xB260,0xB268, + 0xB269,0xB274,0xB275,0xB27C,0xB284,0xB285,0xB289,0xB290, + 0xB291,0xB294,0xB298,0xB299,0xB29A,0xB2A0,0xB2A1,0xB2A3, + 0xB2A5,0xB2A6,0xB2AA,0xB2AC,0xB2B0,0xB2B4,0xB2C8,0xB2C9, + 0xB2CC,0xB2D0,0xB2D2,0xB2D8,0xB2D9,0xB2DB,0xB2DD,0xB2E2, + 0xB2E4,0xB2E5,0xB2E6,0xB2E8,0xB2EB,0xB2EC,0xB2ED,0xB2EE, + 0xB2EF,0xB2F3,0xB2F4,0xB2F5,0xB2F7,0xB2F8,0xB2F9,0xB2FA, + 0xB2FB,0xB2FF,0xB300,0xB301,0xB304,0xB308,0xB310,0xB311, + 0xB313,0xB314,0xB315,0xB31C,0xB354,0xB355,0xB356,0xB358, + 0xB35B,0xB35C,0xB35E,0xB35F,0xB364,0xB365, + /* Range 0x3521 - 0x357E, array index: 0x06CD */ + 0xB367,0xB369,0xB36B,0xB36E,0xB370,0xB371,0xB374,0xB378, + 0xB380,0xB381,0xB383,0xB384,0xB385,0xB38C,0xB390,0xB394, + 0xB3A0,0xB3A1,0xB3A8,0xB3AC,0xB3C4,0xB3C5,0xB3C8,0xB3CB, + 0xB3CC,0xB3CE,0xB3D0,0xB3D4,0xB3D5,0xB3D7,0xB3D9,0xB3DB, + 0xB3DD,0xB3E0,0xB3E4,0xB3E8,0xB3FC,0xB410,0xB418,0xB41C, + 0xB420,0xB428,0xB429,0xB42B,0xB434,0xB450,0xB451,0xB454, + 0xB458,0xB460,0xB461,0xB463,0xB465,0xB46C,0xB480,0xB488, + 0xB49D,0xB4A4,0xB4A8,0xB4AC,0xB4B5,0xB4B7,0xB4B9,0xB4C0, + 0xB4C4,0xB4C8,0xB4D0,0xB4D5,0xB4DC,0xB4DD,0xB4E0,0xB4E3, + 0xB4E4,0xB4E6,0xB4EC,0xB4ED,0xB4EF,0xB4F1,0xB4F8,0xB514, + 0xB515,0xB518,0xB51B,0xB51C,0xB524,0xB525,0xB527,0xB528, + 0xB529,0xB52A,0xB530,0xB531,0xB534,0xB538, + /* Range 0x3621 - 0x367E, array index: 0x072B */ + 0xB540,0xB541,0xB543,0xB544,0xB545,0xB54B,0xB54C,0xB54D, + 0xB550,0xB554,0xB55C,0xB55D,0xB55F,0xB560,0xB561,0xB5A0, + 0xB5A1,0xB5A4,0xB5A8,0xB5AA,0xB5AB,0xB5B0,0xB5B1,0xB5B3, + 0xB5B4,0xB5B5,0xB5BB,0xB5BC,0xB5BD,0xB5C0,0xB5C4,0xB5CC, + 0xB5CD,0xB5CF,0xB5D0,0xB5D1,0xB5D8,0xB5EC,0xB610,0xB611, + 0xB614,0xB618,0xB625,0xB62C,0xB634,0xB648,0xB664,0xB668, + 0xB69C,0xB69D,0xB6A0,0xB6A4,0xB6AB,0xB6AC,0xB6B1,0xB6D4, + 0xB6F0,0xB6F4,0xB6F8,0xB700,0xB701,0xB705,0xB728,0xB729, + 0xB72C,0xB72F,0xB730,0xB738,0xB739,0xB73B,0xB744,0xB748, + 0xB74C,0xB754,0xB755,0xB760,0xB764,0xB768,0xB770,0xB771, + 0xB773,0xB775,0xB77C,0xB77D,0xB780,0xB784,0xB78C,0xB78D, + 0xB78F,0xB790,0xB791,0xB792,0xB796,0xB797, + /* Range 0x3721 - 0x377E, array index: 0x0789 */ + 0xB798,0xB799,0xB79C,0xB7A0,0xB7A8,0xB7A9,0xB7AB,0xB7AC, + 0xB7AD,0xB7B4,0xB7B5,0xB7B8,0xB7C7,0xB7C9,0xB7EC,0xB7ED, + 0xB7F0,0xB7F4,0xB7FC,0xB7FD,0xB7FF,0xB800,0xB801,0xB807, + 0xB808,0xB809,0xB80C,0xB810,0xB818,0xB819,0xB81B,0xB81D, + 0xB824,0xB825,0xB828,0xB82C,0xB834,0xB835,0xB837,0xB838, + 0xB839,0xB840,0xB844,0xB851,0xB853,0xB85C,0xB85D,0xB860, + 0xB864,0xB86C,0xB86D,0xB86F,0xB871,0xB878,0xB87C,0xB88D, + 0xB8A8,0xB8B0,0xB8B4,0xB8B8,0xB8C0,0xB8C1,0xB8C3,0xB8C5, + 0xB8CC,0xB8D0,0xB8D4,0xB8DD,0xB8DF,0xB8E1,0xB8E8,0xB8E9, + 0xB8EC,0xB8F0,0xB8F8,0xB8F9,0xB8FB,0xB8FD,0xB904,0xB918, + 0xB920,0xB93C,0xB93D,0xB940,0xB944,0xB94C,0xB94F,0xB951, + 0xB958,0xB959,0xB95C,0xB960,0xB968,0xB969, + /* Range 0x3821 - 0x387E, array index: 0x07E7 */ + 0xB96B,0xB96D,0xB974,0xB975,0xB978,0xB97C,0xB984,0xB985, + 0xB987,0xB989,0xB98A,0xB98D,0xB98E,0xB9AC,0xB9AD,0xB9B0, + 0xB9B4,0xB9BC,0xB9BD,0xB9BF,0xB9C1,0xB9C8,0xB9C9,0xB9CC, + 0xB9CE,0xB9CF,0xB9D0,0xB9D1,0xB9D2,0xB9D8,0xB9D9,0xB9DB, + 0xB9DD,0xB9DE,0xB9E1,0xB9E3,0xB9E4,0xB9E5,0xB9E8,0xB9EC, + 0xB9F4,0xB9F5,0xB9F7,0xB9F8,0xB9F9,0xB9FA,0xBA00,0xBA01, + 0xBA08,0xBA15,0xBA38,0xBA39,0xBA3C,0xBA40,0xBA42,0xBA48, + 0xBA49,0xBA4B,0xBA4D,0xBA4E,0xBA53,0xBA54,0xBA55,0xBA58, + 0xBA5C,0xBA64,0xBA65,0xBA67,0xBA68,0xBA69,0xBA70,0xBA71, + 0xBA74,0xBA78,0xBA83,0xBA84,0xBA85,0xBA87,0xBA8C,0xBAA8, + 0xBAA9,0xBAAB,0xBAAC,0xBAB0,0xBAB2,0xBAB8,0xBAB9,0xBABB, + 0xBABD,0xBAC4,0xBAC8,0xBAD8,0xBAD9,0xBAFC, + /* Range 0x3921 - 0x397E, array index: 0x0845 */ + 0xBB00,0xBB04,0xBB0D,0xBB0F,0xBB11,0xBB18,0xBB1C,0xBB20, + 0xBB29,0xBB2B,0xBB34,0xBB35,0xBB36,0xBB38,0xBB3B,0xBB3C, + 0xBB3D,0xBB3E,0xBB44,0xBB45,0xBB47,0xBB49,0xBB4D,0xBB4F, + 0xBB50,0xBB54,0xBB58,0xBB61,0xBB63,0xBB6C,0xBB88,0xBB8C, + 0xBB90,0xBBA4,0xBBA8,0xBBAC,0xBBB4,0xBBB7,0xBBC0,0xBBC4, + 0xBBC8,0xBBD0,0xBBD3,0xBBF8,0xBBF9,0xBBFC,0xBBFF,0xBC00, + 0xBC02,0xBC08,0xBC09,0xBC0B,0xBC0C,0xBC0D,0xBC0F,0xBC11, + 0xBC14,0xBC15,0xBC16,0xBC17,0xBC18,0xBC1B,0xBC1C,0xBC1D, + 0xBC1E,0xBC1F,0xBC24,0xBC25,0xBC27,0xBC29,0xBC2D,0xBC30, + 0xBC31,0xBC34,0xBC38,0xBC40,0xBC41,0xBC43,0xBC44,0xBC45, + 0xBC49,0xBC4C,0xBC4D,0xBC50,0xBC5D,0xBC84,0xBC85,0xBC88, + 0xBC8B,0xBC8C,0xBC8E,0xBC94,0xBC95,0xBC97, + /* Range 0x3A21 - 0x3A7E, array index: 0x08A3 */ + 0xBC99,0xBC9A,0xBCA0,0xBCA1,0xBCA4,0xBCA7,0xBCA8,0xBCB0, + 0xBCB1,0xBCB3,0xBCB4,0xBCB5,0xBCBC,0xBCBD,0xBCC0,0xBCC4, + 0xBCCD,0xBCCF,0xBCD0,0xBCD1,0xBCD5,0xBCD8,0xBCDC,0xBCF4, + 0xBCF5,0xBCF6,0xBCF8,0xBCFC,0xBD04,0xBD05,0xBD07,0xBD09, + 0xBD10,0xBD14,0xBD24,0xBD2C,0xBD40,0xBD48,0xBD49,0xBD4C, + 0xBD50,0xBD58,0xBD59,0xBD64,0xBD68,0xBD80,0xBD81,0xBD84, + 0xBD87,0xBD88,0xBD89,0xBD8A,0xBD90,0xBD91,0xBD93,0xBD95, + 0xBD99,0xBD9A,0xBD9C,0xBDA4,0xBDB0,0xBDB8,0xBDD4,0xBDD5, + 0xBDD8,0xBDDC,0xBDE9,0xBDF0,0xBDF4,0xBDF8,0xBE00,0xBE03, + 0xBE05,0xBE0C,0xBE0D,0xBE10,0xBE14,0xBE1C,0xBE1D,0xBE1F, + 0xBE44,0xBE45,0xBE48,0xBE4C,0xBE4E,0xBE54,0xBE55,0xBE57, + 0xBE59,0xBE5A,0xBE5B,0xBE60,0xBE61,0xBE64, + /* Range 0x3B21 - 0x3B7E, array index: 0x0901 */ + 0xBE68,0xBE6A,0xBE70,0xBE71,0xBE73,0xBE74,0xBE75,0xBE7B, + 0xBE7C,0xBE7D,0xBE80,0xBE84,0xBE8C,0xBE8D,0xBE8F,0xBE90, + 0xBE91,0xBE98,0xBE99,0xBEA8,0xBED0,0xBED1,0xBED4,0xBED7, + 0xBED8,0xBEE0,0xBEE3,0xBEE4,0xBEE5,0xBEEC,0xBF01,0xBF08, + 0xBF09,0xBF18,0xBF19,0xBF1B,0xBF1C,0xBF1D,0xBF40,0xBF41, + 0xBF44,0xBF48,0xBF50,0xBF51,0xBF55,0xBF94,0xBFB0,0xBFC5, + 0xBFCC,0xBFCD,0xBFD0,0xBFD4,0xBFDC,0xBFDF,0xBFE1,0xC03C, + 0xC051,0xC058,0xC05C,0xC060,0xC068,0xC069,0xC090,0xC091, + 0xC094,0xC098,0xC0A0,0xC0A1,0xC0A3,0xC0A5,0xC0AC,0xC0AD, + 0xC0AF,0xC0B0,0xC0B3,0xC0B4,0xC0B5,0xC0B6,0xC0BC,0xC0BD, + 0xC0BF,0xC0C0,0xC0C1,0xC0C5,0xC0C8,0xC0C9,0xC0CC,0xC0D0, + 0xC0D8,0xC0D9,0xC0DB,0xC0DC,0xC0DD,0xC0E4, + /* Range 0x3C21 - 0x3C7E, array index: 0x095F */ + 0xC0E5,0xC0E8,0xC0EC,0xC0F4,0xC0F5,0xC0F7,0xC0F9,0xC100, + 0xC104,0xC108,0xC110,0xC115,0xC11C,0xC11D,0xC11E,0xC11F, + 0xC120,0xC123,0xC124,0xC126,0xC127,0xC12C,0xC12D,0xC12F, + 0xC130,0xC131,0xC136,0xC138,0xC139,0xC13C,0xC140,0xC148, + 0xC149,0xC14B,0xC14C,0xC14D,0xC154,0xC155,0xC158,0xC15C, + 0xC164,0xC165,0xC167,0xC168,0xC169,0xC170,0xC174,0xC178, + 0xC185,0xC18C,0xC18D,0xC18E,0xC190,0xC194,0xC196,0xC19C, + 0xC19D,0xC19F,0xC1A1,0xC1A5,0xC1A8,0xC1A9,0xC1AC,0xC1B0, + 0xC1BD,0xC1C4,0xC1C8,0xC1CC,0xC1D4,0xC1D7,0xC1D8,0xC1E0, + 0xC1E4,0xC1E8,0xC1F0,0xC1F1,0xC1F3,0xC1FC,0xC1FD,0xC200, + 0xC204,0xC20C,0xC20D,0xC20F,0xC211,0xC218,0xC219,0xC21C, + 0xC21F,0xC220,0xC228,0xC229,0xC22B,0xC22D, + /* Range 0x3D21 - 0x3D7E, array index: 0x09BD */ + 0xC22F,0xC231,0xC232,0xC234,0xC248,0xC250,0xC251,0xC254, + 0xC258,0xC260,0xC265,0xC26C,0xC26D,0xC270,0xC274,0xC27C, + 0xC27D,0xC27F,0xC281,0xC288,0xC289,0xC290,0xC298,0xC29B, + 0xC29D,0xC2A4,0xC2A5,0xC2A8,0xC2AC,0xC2AD,0xC2B4,0xC2B5, + 0xC2B7,0xC2B9,0xC2DC,0xC2DD,0xC2E0,0xC2E3,0xC2E4,0xC2EB, + 0xC2EC,0xC2ED,0xC2EF,0xC2F1,0xC2F6,0xC2F8,0xC2F9,0xC2FB, + 0xC2FC,0xC300,0xC308,0xC309,0xC30C,0xC30D,0xC313,0xC314, + 0xC315,0xC318,0xC31C,0xC324,0xC325,0xC328,0xC329,0xC345, + 0xC368,0xC369,0xC36C,0xC370,0xC372,0xC378,0xC379,0xC37C, + 0xC37D,0xC384,0xC388,0xC38C,0xC3C0,0xC3D8,0xC3D9,0xC3DC, + 0xC3DF,0xC3E0,0xC3E2,0xC3E8,0xC3E9,0xC3ED,0xC3F4,0xC3F5, + 0xC3F8,0xC408,0xC410,0xC424,0xC42C,0xC430, + /* Range 0x3E21 - 0x3E7E, array index: 0x0A1B */ + 0xC434,0xC43C,0xC43D,0xC448,0xC464,0xC465,0xC468,0xC46C, + 0xC474,0xC475,0xC479,0xC480,0xC494,0xC49C,0xC4B8,0xC4BC, + 0xC4E9,0xC4F0,0xC4F1,0xC4F4,0xC4F8,0xC4FA,0xC4FF,0xC500, + 0xC501,0xC50C,0xC510,0xC514,0xC51C,0xC528,0xC529,0xC52C, + 0xC530,0xC538,0xC539,0xC53B,0xC53D,0xC544,0xC545,0xC548, + 0xC549,0xC54A,0xC54C,0xC54D,0xC54E,0xC553,0xC554,0xC555, + 0xC557,0xC558,0xC559,0xC55D,0xC55E,0xC560,0xC561,0xC564, + 0xC568,0xC570,0xC571,0xC573,0xC574,0xC575,0xC57C,0xC57D, + 0xC580,0xC584,0xC587,0xC58C,0xC58D,0xC58F,0xC591,0xC595, + 0xC597,0xC598,0xC59C,0xC5A0,0xC5A9,0xC5B4,0xC5B5,0xC5B8, + 0xC5B9,0xC5BB,0xC5BC,0xC5BD,0xC5BE,0xC5C4,0xC5C5,0xC5C6, + 0xC5C7,0xC5C8,0xC5C9,0xC5CA,0xC5CC,0xC5CE, + /* Range 0x3F21 - 0x3F7E, array index: 0x0A79 */ + 0xC5D0,0xC5D1,0xC5D4,0xC5D8,0xC5E0,0xC5E1,0xC5E3,0xC5E5, + 0xC5EC,0xC5ED,0xC5EE,0xC5F0,0xC5F4,0xC5F6,0xC5F7,0xC5FC, + 0xC5FD,0xC5FE,0xC5FF,0xC600,0xC601,0xC605,0xC606,0xC607, + 0xC608,0xC60C,0xC610,0xC618,0xC619,0xC61B,0xC61C,0xC624, + 0xC625,0xC628,0xC62C,0xC62D,0xC62E,0xC630,0xC633,0xC634, + 0xC635,0xC637,0xC639,0xC63B,0xC640,0xC641,0xC644,0xC648, + 0xC650,0xC651,0xC653,0xC654,0xC655,0xC65C,0xC65D,0xC660, + 0xC66C,0xC66F,0xC671,0xC678,0xC679,0xC67C,0xC680,0xC688, + 0xC689,0xC68B,0xC68D,0xC694,0xC695,0xC698,0xC69C,0xC6A4, + 0xC6A5,0xC6A7,0xC6A9,0xC6B0,0xC6B1,0xC6B4,0xC6B8,0xC6B9, + 0xC6BA,0xC6C0,0xC6C1,0xC6C3,0xC6C5,0xC6CC,0xC6CD,0xC6D0, + 0xC6D4,0xC6DC,0xC6DD,0xC6E0,0xC6E1,0xC6E8, + /* Range 0x4021 - 0x407E, array index: 0x0AD7 */ + 0xC6E9,0xC6EC,0xC6F0,0xC6F8,0xC6F9,0xC6FD,0xC704,0xC705, + 0xC708,0xC70C,0xC714,0xC715,0xC717,0xC719,0xC720,0xC721, + 0xC724,0xC728,0xC730,0xC731,0xC733,0xC735,0xC737,0xC73C, + 0xC73D,0xC740,0xC744,0xC74A,0xC74C,0xC74D,0xC74F,0xC751, + 0xC752,0xC753,0xC754,0xC755,0xC756,0xC757,0xC758,0xC75C, + 0xC760,0xC768,0xC76B,0xC774,0xC775,0xC778,0xC77C,0xC77D, + 0xC77E,0xC783,0xC784,0xC785,0xC787,0xC788,0xC789,0xC78A, + 0xC78E,0xC790,0xC791,0xC794,0xC796,0xC797,0xC798,0xC79A, + 0xC7A0,0xC7A1,0xC7A3,0xC7A4,0xC7A5,0xC7A6,0xC7AC,0xC7AD, + 0xC7B0,0xC7B4,0xC7BC,0xC7BD,0xC7BF,0xC7C0,0xC7C1,0xC7C8, + 0xC7C9,0xC7CC,0xC7CE,0xC7D0,0xC7D8,0xC7DD,0xC7E4,0xC7E8, + 0xC7EC,0xC800,0xC801,0xC804,0xC808,0xC80A, + /* Range 0x4121 - 0x417E, array index: 0x0B35 */ + 0xC810,0xC811,0xC813,0xC815,0xC816,0xC81C,0xC81D,0xC820, + 0xC824,0xC82C,0xC82D,0xC82F,0xC831,0xC838,0xC83C,0xC840, + 0xC848,0xC849,0xC84C,0xC84D,0xC854,0xC870,0xC871,0xC874, + 0xC878,0xC87A,0xC880,0xC881,0xC883,0xC885,0xC886,0xC887, + 0xC88B,0xC88C,0xC88D,0xC894,0xC89D,0xC89F,0xC8A1,0xC8A8, + 0xC8BC,0xC8BD,0xC8C4,0xC8C8,0xC8CC,0xC8D4,0xC8D5,0xC8D7, + 0xC8D9,0xC8E0,0xC8E1,0xC8E4,0xC8F5,0xC8FC,0xC8FD,0xC900, + 0xC904,0xC905,0xC906,0xC90C,0xC90D,0xC90F,0xC911,0xC918, + 0xC92C,0xC934,0xC950,0xC951,0xC954,0xC958,0xC960,0xC961, + 0xC963,0xC96C,0xC970,0xC974,0xC97C,0xC988,0xC989,0xC98C, + 0xC990,0xC998,0xC999,0xC99B,0xC99D,0xC9C0,0xC9C1,0xC9C4, + 0xC9C7,0xC9C8,0xC9CA,0xC9D0,0xC9D1,0xC9D3, + /* Range 0x4221 - 0x427E, array index: 0x0B93 */ + 0xC9D5,0xC9D6,0xC9D9,0xC9DA,0xC9DC,0xC9DD,0xC9E0,0xC9E2, + 0xC9E4,0xC9E7,0xC9EC,0xC9ED,0xC9EF,0xC9F0,0xC9F1,0xC9F8, + 0xC9F9,0xC9FC,0xCA00,0xCA08,0xCA09,0xCA0B,0xCA0C,0xCA0D, + 0xCA14,0xCA18,0xCA29,0xCA4C,0xCA4D,0xCA50,0xCA54,0xCA5C, + 0xCA5D,0xCA5F,0xCA60,0xCA61,0xCA68,0xCA7D,0xCA84,0xCA98, + 0xCABC,0xCABD,0xCAC0,0xCAC4,0xCACC,0xCACD,0xCACF,0xCAD1, + 0xCAD3,0xCAD8,0xCAD9,0xCAE0,0xCAEC,0xCAF4,0xCB08,0xCB10, + 0xCB14,0xCB18,0xCB20,0xCB21,0xCB41,0xCB48,0xCB49,0xCB4C, + 0xCB50,0xCB58,0xCB59,0xCB5D,0xCB64,0xCB78,0xCB79,0xCB9C, + 0xCBB8,0xCBD4,0xCBE4,0xCBE7,0xCBE9,0xCC0C,0xCC0D,0xCC10, + 0xCC14,0xCC1C,0xCC1D,0xCC21,0xCC22,0xCC27,0xCC28,0xCC29, + 0xCC2C,0xCC2E,0xCC30,0xCC38,0xCC39,0xCC3B, + /* Range 0x4321 - 0x437E, array index: 0x0BF1 */ + 0xCC3C,0xCC3D,0xCC3E,0xCC44,0xCC45,0xCC48,0xCC4C,0xCC54, + 0xCC55,0xCC57,0xCC58,0xCC59,0xCC60,0xCC64,0xCC66,0xCC68, + 0xCC70,0xCC75,0xCC98,0xCC99,0xCC9C,0xCCA0,0xCCA8,0xCCA9, + 0xCCAB,0xCCAC,0xCCAD,0xCCB4,0xCCB5,0xCCB8,0xCCBC,0xCCC4, + 0xCCC5,0xCCC7,0xCCC9,0xCCD0,0xCCD4,0xCCE4,0xCCEC,0xCCF0, + 0xCD01,0xCD08,0xCD09,0xCD0C,0xCD10,0xCD18,0xCD19,0xCD1B, + 0xCD1D,0xCD24,0xCD28,0xCD2C,0xCD39,0xCD5C,0xCD60,0xCD64, + 0xCD6C,0xCD6D,0xCD6F,0xCD71,0xCD78,0xCD88,0xCD94,0xCD95, + 0xCD98,0xCD9C,0xCDA4,0xCDA5,0xCDA7,0xCDA9,0xCDB0,0xCDC4, + 0xCDCC,0xCDD0,0xCDE8,0xCDEC,0xCDF0,0xCDF8,0xCDF9,0xCDFB, + 0xCDFD,0xCE04,0xCE08,0xCE0C,0xCE14,0xCE19,0xCE20,0xCE21, + 0xCE24,0xCE28,0xCE30,0xCE31,0xCE33,0xCE35, + /* Range 0x4421 - 0x447E, array index: 0x0C4F */ + 0xCE58,0xCE59,0xCE5C,0xCE5F,0xCE60,0xCE61,0xCE68,0xCE69, + 0xCE6B,0xCE6D,0xCE74,0xCE75,0xCE78,0xCE7C,0xCE84,0xCE85, + 0xCE87,0xCE89,0xCE90,0xCE91,0xCE94,0xCE98,0xCEA0,0xCEA1, + 0xCEA3,0xCEA4,0xCEA5,0xCEAC,0xCEAD,0xCEC1,0xCEE4,0xCEE5, + 0xCEE8,0xCEEB,0xCEEC,0xCEF4,0xCEF5,0xCEF7,0xCEF8,0xCEF9, + 0xCF00,0xCF01,0xCF04,0xCF08,0xCF10,0xCF11,0xCF13,0xCF15, + 0xCF1C,0xCF20,0xCF24,0xCF2C,0xCF2D,0xCF2F,0xCF30,0xCF31, + 0xCF38,0xCF54,0xCF55,0xCF58,0xCF5C,0xCF64,0xCF65,0xCF67, + 0xCF69,0xCF70,0xCF71,0xCF74,0xCF78,0xCF80,0xCF85,0xCF8C, + 0xCFA1,0xCFA8,0xCFB0,0xCFC4,0xCFE0,0xCFE1,0xCFE4,0xCFE8, + 0xCFF0,0xCFF1,0xCFF3,0xCFF5,0xCFFC,0xD000,0xD004,0xD011, + 0xD018,0xD02D,0xD034,0xD035,0xD038,0xD03C, + /* Range 0x4521 - 0x457E, array index: 0x0CAD */ + 0xD044,0xD045,0xD047,0xD049,0xD050,0xD054,0xD058,0xD060, + 0xD06C,0xD06D,0xD070,0xD074,0xD07C,0xD07D,0xD081,0xD0A4, + 0xD0A5,0xD0A8,0xD0AC,0xD0B4,0xD0B5,0xD0B7,0xD0B9,0xD0C0, + 0xD0C1,0xD0C4,0xD0C8,0xD0C9,0xD0D0,0xD0D1,0xD0D3,0xD0D4, + 0xD0D5,0xD0DC,0xD0DD,0xD0E0,0xD0E4,0xD0EC,0xD0ED,0xD0EF, + 0xD0F0,0xD0F1,0xD0F8,0xD10D,0xD130,0xD131,0xD134,0xD138, + 0xD13A,0xD140,0xD141,0xD143,0xD144,0xD145,0xD14C,0xD14D, + 0xD150,0xD154,0xD15C,0xD15D,0xD15F,0xD161,0xD168,0xD16C, + 0xD17C,0xD184,0xD188,0xD1A0,0xD1A1,0xD1A4,0xD1A8,0xD1B0, + 0xD1B1,0xD1B3,0xD1B5,0xD1BA,0xD1BC,0xD1C0,0xD1D8,0xD1F4, + 0xD1F8,0xD207,0xD209,0xD210,0xD22C,0xD22D,0xD230,0xD234, + 0xD23C,0xD23D,0xD23F,0xD241,0xD248,0xD25C, + /* Range 0x4621 - 0x467E, array index: 0x0D0B */ + 0xD264,0xD280,0xD281,0xD284,0xD288,0xD290,0xD291,0xD295, + 0xD29C,0xD2A0,0xD2A4,0xD2AC,0xD2B1,0xD2B8,0xD2B9,0xD2BC, + 0xD2BF,0xD2C0,0xD2C2,0xD2C8,0xD2C9,0xD2CB,0xD2D4,0xD2D8, + 0xD2DC,0xD2E4,0xD2E5,0xD2F0,0xD2F1,0xD2F4,0xD2F8,0xD300, + 0xD301,0xD303,0xD305,0xD30C,0xD30D,0xD30E,0xD310,0xD314, + 0xD316,0xD31C,0xD31D,0xD31F,0xD320,0xD321,0xD325,0xD328, + 0xD329,0xD32C,0xD330,0xD338,0xD339,0xD33B,0xD33C,0xD33D, + 0xD344,0xD345,0xD37C,0xD37D,0xD380,0xD384,0xD38C,0xD38D, + 0xD38F,0xD390,0xD391,0xD398,0xD399,0xD39C,0xD3A0,0xD3A8, + 0xD3A9,0xD3AB,0xD3AD,0xD3B4,0xD3B8,0xD3BC,0xD3C4,0xD3C5, + 0xD3C8,0xD3C9,0xD3D0,0xD3D8,0xD3E1,0xD3E3,0xD3EC,0xD3ED, + 0xD3F0,0xD3F4,0xD3FC,0xD3FD,0xD3FF,0xD401, + /* Range 0x4721 - 0x477E, array index: 0x0D69 */ + 0xD408,0xD41D,0xD440,0xD444,0xD45C,0xD460,0xD464,0xD46D, + 0xD46F,0xD478,0xD479,0xD47C,0xD47F,0xD480,0xD482,0xD488, + 0xD489,0xD48B,0xD48D,0xD494,0xD4A9,0xD4CC,0xD4D0,0xD4D4, + 0xD4DC,0xD4DF,0xD4E8,0xD4EC,0xD4F0,0xD4F8,0xD4FB,0xD4FD, + 0xD504,0xD508,0xD50C,0xD514,0xD515,0xD517,0xD53C,0xD53D, + 0xD540,0xD544,0xD54C,0xD54D,0xD54F,0xD551,0xD558,0xD559, + 0xD55C,0xD560,0xD565,0xD568,0xD569,0xD56B,0xD56D,0xD574, + 0xD575,0xD578,0xD57C,0xD584,0xD585,0xD587,0xD588,0xD589, + 0xD590,0xD5A5,0xD5C8,0xD5C9,0xD5CC,0xD5D0,0xD5D2,0xD5D8, + 0xD5D9,0xD5DB,0xD5DD,0xD5E4,0xD5E5,0xD5E8,0xD5EC,0xD5F4, + 0xD5F5,0xD5F7,0xD5F9,0xD600,0xD601,0xD604,0xD608,0xD610, + 0xD611,0xD613,0xD614,0xD615,0xD61C,0xD620, + /* Range 0x4821 - 0x487E, array index: 0x0DC7 */ + 0xD624,0xD62D,0xD638,0xD639,0xD63C,0xD640,0xD645,0xD648, + 0xD649,0xD64B,0xD64D,0xD651,0xD654,0xD655,0xD658,0xD65C, + 0xD667,0xD669,0xD670,0xD671,0xD674,0xD683,0xD685,0xD68C, + 0xD68D,0xD690,0xD694,0xD69D,0xD69F,0xD6A1,0xD6A8,0xD6AC, + 0xD6B0,0xD6B9,0xD6BB,0xD6C4,0xD6C5,0xD6C8,0xD6CC,0xD6D1, + 0xD6D4,0xD6D7,0xD6D9,0xD6E0,0xD6E4,0xD6E8,0xD6F0,0xD6F5, + 0xD6FC,0xD6FD,0xD700,0xD704,0xD711,0xD718,0xD719,0xD71C, + 0xD720,0xD728,0xD729,0xD72B,0xD72D,0xD734,0xD735,0xD738, + 0xD73C,0xD744,0xD747,0xD749,0xD750,0xD751,0xD754,0xD756, + 0xD757,0xD758,0xD759,0xD760,0xD761,0xD763,0xD765,0xD769, + 0xD76C,0xD770,0xD774,0xD77C,0xD77D,0xD781,0xD788,0xD789, + 0xD78C,0xD790,0xD798,0xD799,0xD79B,0xD79D, + /* Range 0x4A21 - 0x4A7E, array index: 0x0E25 */ + 0x4F3D,0x4F73,0x5047,0x50F9,0x52A0,0x53EF,0x5475,0x54E5, + 0x5609,0x5AC1,0x5BB6,0x6687,0x67B6,0x67B7,0x67EF,0x6B4C, + 0x73C2,0x75C2,0x7A3C,0x82DB,0x8304,0x8857,0x8888,0x8A36, + 0x8CC8,0x8DCF,0x8EFB,0x8FE6,0x99D5,0x523B,0x5374,0x5404, + 0x606A,0x6164,0x6BBC,0x73CF,0x811A,0x89BA,0x89D2,0x95A3, + 0x4F83,0x520A,0x58BE,0x5978,0x59E6,0x5E72,0x5E79,0x61C7, + 0x63C0,0x6746,0x67EC,0x687F,0x6F97,0x764E,0x770B,0x78F5, + 0x7A08,0x7AFF,0x7C21,0x809D,0x826E,0x8271,0x8AEB,0x9593, + 0x4E6B,0x559D,0x66F7,0x6E34,0x78A3,0x7AED,0x845B,0x8910, + 0x874E,0x97A8,0x52D8,0x574E,0x582A,0x5D4C,0x611F,0x61BE, + 0x6221,0x6562,0x67D1,0x6A44,0x6E1B,0x7518,0x75B3,0x76E3, + 0x77B0,0x7D3A,0x90AF,0x9451,0x9452,0x9F95, + /* Range 0x4B21 - 0x4B7E, array index: 0x0E83 */ + 0x5323,0x5CAC,0x7532,0x80DB,0x9240,0x9598,0x525B,0x5808, + 0x59DC,0x5CA1,0x5D17,0x5EB7,0x5F3A,0x5F4A,0x6177,0x6C5F, + 0x757A,0x7586,0x7CE0,0x7D73,0x7DB1,0x7F8C,0x8154,0x8221, + 0x8591,0x8941,0x8B1B,0x92FC,0x964D,0x9C47,0x4ECB,0x4EF7, + 0x500B,0x51F1,0x584F,0x6137,0x613E,0x6168,0x6539,0x69EA, + 0x6F11,0x75A5,0x7686,0x76D6,0x7B87,0x82A5,0x84CB,0xF900, + 0x93A7,0x958B,0x5580,0x5BA2,0x5751,0xF901,0x7CB3,0x7FB9, + 0x91B5,0x5028,0x53BB,0x5C45,0x5DE8,0x62D2,0x636E,0x64DA, + 0x64E7,0x6E20,0x70AC,0x795B,0x8DDD,0x8E1E,0xF902,0x907D, + 0x9245,0x92F8,0x4E7E,0x4EF6,0x5065,0x5DFE,0x5EFA,0x6106, + 0x6957,0x8171,0x8654,0x8E47,0x9375,0x9A2B,0x4E5E,0x5091, + 0x6770,0x6840,0x5109,0x528D,0x5292,0x6AA2, + /* Range 0x4C21 - 0x4C7E, array index: 0x0EE1 */ + 0x77BC,0x9210,0x9ED4,0x52AB,0x602F,0x8FF2,0x5048,0x61A9, + 0x63ED,0x64CA,0x683C,0x6A84,0x6FC0,0x8188,0x89A1,0x9694, + 0x5805,0x727D,0x72AC,0x7504,0x7D79,0x7E6D,0x80A9,0x898B, + 0x8B74,0x9063,0x9D51,0x6289,0x6C7A,0x6F54,0x7D50,0x7F3A, + 0x8A23,0x517C,0x614A,0x7B9D,0x8B19,0x9257,0x938C,0x4EAC, + 0x4FD3,0x501E,0x50BE,0x5106,0x52C1,0x52CD,0x537F,0x5770, + 0x5883,0x5E9A,0x5F91,0x6176,0x61AC,0x64CE,0x656C,0x666F, + 0x66BB,0x66F4,0x6897,0x6D87,0x7085,0x70F1,0x749F,0x74A5, + 0x74CA,0x75D9,0x786C,0x78EC,0x7ADF,0x7AF6,0x7D45,0x7D93, + 0x8015,0x803F,0x811B,0x8396,0x8B66,0x8F15,0x9015,0x93E1, + 0x9803,0x9838,0x9A5A,0x9BE8,0x4FC2,0x5553,0x583A,0x5951, + 0x5B63,0x5C46,0x60B8,0x6212,0x6842,0x68B0, + /* Range 0x4D21 - 0x4D7E, array index: 0x0F3F */ + 0x68E8,0x6EAA,0x754C,0x7678,0x78CE,0x7A3D,0x7CFB,0x7E6B, + 0x7E7C,0x8A08,0x8AA1,0x8C3F,0x968E,0x9DC4,0x53E4,0x53E9, + 0x544A,0x5471,0x56FA,0x59D1,0x5B64,0x5C3B,0x5EAB,0x62F7, + 0x6537,0x6545,0x6572,0x66A0,0x67AF,0x69C1,0x6CBD,0x75FC, + 0x7690,0x777E,0x7A3F,0x7F94,0x8003,0x80A1,0x818F,0x82E6, + 0x82FD,0x83F0,0x85C1,0x8831,0x88B4,0x8AA5,0xF903,0x8F9C, + 0x932E,0x96C7,0x9867,0x9AD8,0x9F13,0x54ED,0x659B,0x66F2, + 0x688F,0x7A40,0x8C37,0x9D60,0x56F0,0x5764,0x5D11,0x6606, + 0x68B1,0x68CD,0x6EFE,0x7428,0x889E,0x9BE4,0x6C68,0xF904, + 0x9AA8,0x4F9B,0x516C,0x5171,0x529F,0x5B54,0x5DE5,0x6050, + 0x606D,0x62F1,0x63A7,0x653B,0x73D9,0x7A7A,0x86A3,0x8CA2, + 0x978F,0x4E32,0x5BE1,0x6208,0x679C,0x74DC, + /* Range 0x4E21 - 0x4E7E, array index: 0x0F9D */ + 0x79D1,0x83D3,0x8A87,0x8AB2,0x8DE8,0x904E,0x934B,0x9846, + 0x5ED3,0x69E8,0x85FF,0x90ED,0xF905,0x51A0,0x5B98,0x5BEC, + 0x6163,0x68FA,0x6B3E,0x704C,0x742F,0x74D8,0x7BA1,0x7F50, + 0x83C5,0x89C0,0x8CAB,0x95DC,0x9928,0x522E,0x605D,0x62EC, + 0x9002,0x4F8A,0x5149,0x5321,0x58D9,0x5EE3,0x66E0,0x6D38, + 0x709A,0x72C2,0x73D6,0x7B50,0x80F1,0x945B,0x5366,0x639B, + 0x7F6B,0x4E56,0x5080,0x584A,0x58DE,0x602A,0x6127,0x62D0, + 0x69D0,0x9B41,0x5B8F,0x7D18,0x80B1,0x8F5F,0x4EA4,0x50D1, + 0x54AC,0x55AC,0x5B0C,0x5DA0,0x5DE7,0x652A,0x654E,0x6821, + 0x6A4B,0x72E1,0x768E,0x77EF,0x7D5E,0x7FF9,0x81A0,0x854E, + 0x86DF,0x8F03,0x8F4E,0x90CA,0x9903,0x9A55,0x9BAB,0x4E18, + 0x4E45,0x4E5D,0x4EC7,0x4FF1,0x5177,0x52FE, + /* Range 0x4F21 - 0x4F7E, array index: 0x0FFB */ + 0x5340,0x53E3,0x53E5,0x548E,0x5614,0x5775,0x57A2,0x5BC7, + 0x5D87,0x5ED0,0x61FC,0x62D8,0x6551,0x67B8,0x67E9,0x69CB, + 0x6B50,0x6BC6,0x6BEC,0x6C42,0x6E9D,0x7078,0x72D7,0x7396, + 0x7403,0x77BF,0x77E9,0x7A76,0x7D7F,0x8009,0x81FC,0x8205, + 0x820A,0x82DF,0x8862,0x8B33,0x8CFC,0x8EC0,0x9011,0x90B1, + 0x9264,0x92B6,0x99D2,0x9A45,0x9CE9,0x9DD7,0x9F9C,0x570B, + 0x5C40,0x83CA,0x97A0,0x97AB,0x9EB4,0x541B,0x7A98,0x7FA4, + 0x88D9,0x8ECD,0x90E1,0x5800,0x5C48,0x6398,0x7A9F,0x5BAE, + 0x5F13,0x7A79,0x7AAE,0x828E,0x8EAC,0x5026,0x5238,0x52F8, + 0x5377,0x5708,0x62F3,0x6372,0x6B0A,0x6DC3,0x7737,0x53A5, + 0x7357,0x8568,0x8E76,0x95D5,0x673A,0x6AC3,0x6F70,0x8A6D, + 0x8ECC,0x994B,0xF906,0x6677,0x6B78,0x8CB4, + /* Range 0x5021 - 0x507E, array index: 0x1059 */ + 0x9B3C,0xF907,0x53EB,0x572D,0x594E,0x63C6,0x69FB,0x73EA, + 0x7845,0x7ABA,0x7AC5,0x7CFE,0x8475,0x898F,0x8D73,0x9035, + 0x95A8,0x52FB,0x5747,0x7547,0x7B60,0x83CC,0x921E,0xF908, + 0x6A58,0x514B,0x524B,0x5287,0x621F,0x68D8,0x6975,0x9699, + 0x50C5,0x52A4,0x52E4,0x61C3,0x65A4,0x6839,0x69FF,0x747E, + 0x7B4B,0x82B9,0x83EB,0x89B2,0x8B39,0x8FD1,0x9949,0xF909, + 0x4ECA,0x5997,0x64D2,0x6611,0x6A8E,0x7434,0x7981,0x79BD, + 0x82A9,0x887E,0x887F,0x895F,0xF90A,0x9326,0x4F0B,0x53CA, + 0x6025,0x6271,0x6C72,0x7D1A,0x7D66,0x4E98,0x5162,0x77DC, + 0x80AF,0x4F01,0x4F0E,0x5176,0x5180,0x55DC,0x5668,0x573B, + 0x57FA,0x57FC,0x5914,0x5947,0x5993,0x5BC4,0x5C90,0x5D0E, + 0x5DF1,0x5E7E,0x5FCC,0x6280,0x65D7,0x65E3, + /* Range 0x5121 - 0x517E, array index: 0x10B7 */ + 0x671E,0x671F,0x675E,0x68CB,0x68C4,0x6A5F,0x6B3A,0x6C23, + 0x6C7D,0x6C82,0x6DC7,0x7398,0x7426,0x742A,0x7482,0x74A3, + 0x7578,0x757F,0x7881,0x78EF,0x7941,0x7947,0x7948,0x797A, + 0x7B95,0x7D00,0x7DBA,0x7F88,0x8006,0x802D,0x808C,0x8A18, + 0x8B4F,0x8C48,0x8D77,0x9321,0x9324,0x98E2,0x9951,0x9A0E, + 0x9A0F,0x9A65,0x9E92,0x7DCA,0x4F76,0x5409,0x62EE,0x6854, + 0x91D1,0x55AB,0x513A,0xF90B,0xF90C,0x5A1C,0x61E6,0xF90D, + 0x62CF,0x62FF,0xF90E,0xF90F,0xF910,0xF911,0xF912,0xF913, + 0x90A3,0xF914,0xF915,0xF916,0xF917,0xF918,0x8AFE,0xF919, + 0xF91A,0xF91B,0xF91C,0x6696,0xF91D,0x7156,0xF91E,0xF91F, + 0x96E3,0xF920,0x634F,0x637A,0x5357,0xF921,0x678F,0x6960, + 0x6E73,0xF922,0x7537,0xF923,0xF924,0xF925, + /* Range 0x5221 - 0x527E, array index: 0x1115 */ + 0x7D0D,0xF926,0xF927,0x8872,0x56CA,0x5A18,0xF928,0xF929, + 0xF92A,0xF92B,0xF92C,0x4E43,0xF92D,0x5167,0x5948,0x67F0, + 0x8010,0xF92E,0x5973,0x5E74,0x649A,0x79CA,0x5FF5,0x606C, + 0x62C8,0x637B,0x5BE7,0x5BD7,0x52AA,0xF92F,0x5974,0x5F29, + 0x6012,0xF930,0xF931,0xF932,0x7459,0xF933,0xF934,0xF935, + 0xF936,0xF937,0xF938,0x99D1,0xF939,0xF93A,0xF93B,0xF93C, + 0xF93D,0xF93E,0xF93F,0xF940,0xF941,0xF942,0xF943,0x6FC3, + 0xF944,0xF945,0x81BF,0x8FB2,0x60F1,0xF946,0xF947,0x8166, + 0xF948,0xF949,0x5C3F,0xF94A,0xF94B,0xF94C,0xF94D,0xF94E, + 0xF94F,0xF950,0xF951,0x5AE9,0x8A25,0x677B,0x7D10,0xF952, + 0xF953,0xF954,0xF955,0xF956,0xF957,0x80FD,0xF958,0xF959, + 0x5C3C,0x6CE5,0x533F,0x6EBA,0x591A,0x8336, + /* Range 0x5321 - 0x537E, array index: 0x1173 */ + 0x4E39,0x4EB6,0x4F46,0x55AE,0x5718,0x58C7,0x5F56,0x65B7, + 0x65E6,0x6A80,0x6BB5,0x6E4D,0x77ED,0x7AEF,0x7C1E,0x7DDE, + 0x86CB,0x8892,0x9132,0x935B,0x64BB,0x6FBE,0x737A,0x75B8, + 0x9054,0x5556,0x574D,0x61BA,0x64D4,0x66C7,0x6DE1,0x6E5B, + 0x6F6D,0x6FB9,0x75F0,0x8043,0x81BD,0x8541,0x8983,0x8AC7, + 0x8B5A,0x931F,0x6C93,0x7553,0x7B54,0x8E0F,0x905D,0x5510, + 0x5802,0x5858,0x5E62,0x6207,0x649E,0x68E0,0x7576,0x7CD6, + 0x87B3,0x9EE8,0x4EE3,0x5788,0x576E,0x5927,0x5C0D,0x5CB1, + 0x5E36,0x5F85,0x6234,0x64E1,0x73B3,0x81FA,0x888B,0x8CB8, + 0x968A,0x9EDB,0x5B85,0x5FB7,0x60B3,0x5012,0x5200,0x5230, + 0x5716,0x5835,0x5857,0x5C0E,0x5C60,0x5CF6,0x5D8B,0x5EA6, + 0x5F92,0x60BC,0x6311,0x6389,0x6417,0x6843, + /* Range 0x5421 - 0x547E, array index: 0x11D1 */ + 0x68F9,0x6AC2,0x6DD8,0x6E21,0x6ED4,0x6FE4,0x71FE,0x76DC, + 0x7779,0x79B1,0x7A3B,0x8404,0x89A9,0x8CED,0x8DF3,0x8E48, + 0x9003,0x9014,0x9053,0x90FD,0x934D,0x9676,0x97DC,0x6BD2, + 0x7006,0x7258,0x72A2,0x7368,0x7763,0x79BF,0x7BE4,0x7E9B, + 0x8B80,0x58A9,0x60C7,0x6566,0x65FD,0x66BE,0x6C8C,0x711E, + 0x71C9,0x8C5A,0x9813,0x4E6D,0x7A81,0x4EDD,0x51AC,0x51CD, + 0x52D5,0x540C,0x61A7,0x6771,0x6850,0x68DF,0x6D1E,0x6F7C, + 0x75BC,0x77B3,0x7AE5,0x80F4,0x8463,0x9285,0x515C,0x6597, + 0x675C,0x6793,0x75D8,0x7AC7,0x8373,0xF95A,0x8C46,0x9017, + 0x982D,0x5C6F,0x81C0,0x829A,0x9041,0x906F,0x920D,0x5F97, + 0x5D9D,0x6A59,0x71C8,0x767B,0x7B49,0x85E4,0x8B04,0x9127, + 0x9A30,0x5587,0x61F6,0xF95B,0x7669,0x7F85, + /* Range 0x5521 - 0x557E, array index: 0x122F */ + 0x863F,0x87BA,0x88F8,0x908F,0xF95C,0x6D1B,0x70D9,0x73DE, + 0x7D61,0x843D,0xF95D,0x916A,0x99F1,0xF95E,0x4E82,0x5375, + 0x6B04,0x6B12,0x703E,0x721B,0x862D,0x9E1E,0x524C,0x8FA3, + 0x5D50,0x64E5,0x652C,0x6B16,0x6FEB,0x7C43,0x7E9C,0x85CD, + 0x8964,0x89BD,0x62C9,0x81D8,0x881F,0x5ECA,0x6717,0x6D6A, + 0x72FC,0x7405,0x746F,0x8782,0x90DE,0x4F86,0x5D0D,0x5FA0, + 0x840A,0x51B7,0x63A0,0x7565,0x4EAE,0x5006,0x5169,0x51C9, + 0x6881,0x6A11,0x7CAE,0x7CB1,0x7CE7,0x826F,0x8AD2,0x8F1B, + 0x91CF,0x4FB6,0x5137,0x52F5,0x5442,0x5EEC,0x616E,0x623E, + 0x65C5,0x6ADA,0x6FFE,0x792A,0x85DC,0x8823,0x95AD,0x9A62, + 0x9A6A,0x9E97,0x9ECE,0x529B,0x66C6,0x6B77,0x701D,0x792B, + 0x8F62,0x9742,0x6190,0x6200,0x6523,0x6F23, + /* Range 0x5621 - 0x567E, array index: 0x128D */ + 0x7149,0x7489,0x7DF4,0x806F,0x84EE,0x8F26,0x9023,0x934A, + 0x51BD,0x5217,0x52A3,0x6D0C,0x70C8,0x88C2,0x5EC9,0x6582, + 0x6BAE,0x6FC2,0x7C3E,0x7375,0x4EE4,0x4F36,0x56F9,0xF95F, + 0x5CBA,0x5DBA,0x601C,0x73B2,0x7B2D,0x7F9A,0x7FCE,0x8046, + 0x901E,0x9234,0x96F6,0x9748,0x9818,0x9F61,0x4F8B,0x6FA7, + 0x79AE,0x91B4,0x96B7,0x52DE,0xF960,0x6488,0x64C4,0x6AD3, + 0x6F5E,0x7018,0x7210,0x76E7,0x8001,0x8606,0x865C,0x8DEF, + 0x8F05,0x9732,0x9B6F,0x9DFA,0x9E75,0x788C,0x797F,0x7DA0, + 0x83C9,0x9304,0x9E7F,0x9E93,0x8AD6,0x58DF,0x5F04,0x6727, + 0x7027,0x74CF,0x7C60,0x807E,0x5121,0x7028,0x7262,0x78CA, + 0x8CC2,0x8CDA,0x8CF4,0x96F7,0x4E86,0x50DA,0x5BEE,0x5ED6, + 0x6599,0x71CE,0x7642,0x77AD,0x804A,0x84FC, + /* Range 0x5721 - 0x577E, array index: 0x12EB */ + 0x907C,0x9B27,0x9F8D,0x58D8,0x5A41,0x5C62,0x6A13,0x6DDA, + 0x6F0F,0x763B,0x7D2F,0x7E37,0x851E,0x8938,0x93E4,0x964B, + 0x5289,0x65D2,0x67F3,0x69B4,0x6D41,0x6E9C,0x700F,0x7409, + 0x7460,0x7559,0x7624,0x786B,0x8B2C,0x985E,0x516D,0x622E, + 0x9678,0x4F96,0x502B,0x5D19,0x6DEA,0x7DB8,0x8F2A,0x5F8B, + 0x6144,0x6817,0xF961,0x9686,0x52D2,0x808B,0x51DC,0x51CC, + 0x695E,0x7A1C,0x7DBE,0x83F1,0x9675,0x4FDA,0x5229,0x5398, + 0x540F,0x550E,0x5C65,0x60A7,0x674E,0x68A8,0x6D6C,0x7281, + 0x72F8,0x7406,0x7483,0xF962,0x75E2,0x7C6C,0x7F79,0x7FB8, + 0x8389,0x88CF,0x88E1,0x91CC,0x91D0,0x96E2,0x9BC9,0x541D, + 0x6F7E,0x71D0,0x7498,0x85FA,0x8EAA,0x96A3,0x9C57,0x9E9F, + 0x6797,0x6DCB,0x7433,0x81E8,0x9716,0x782C, + /* Range 0x5821 - 0x587E, array index: 0x1349 */ + 0x7ACB,0x7B20,0x7C92,0x6469,0x746A,0x75F2,0x78BC,0x78E8, + 0x99AC,0x9B54,0x9EBB,0x5BDE,0x5E55,0x6F20,0x819C,0x83AB, + 0x9088,0x4E07,0x534D,0x5A29,0x5DD2,0x5F4E,0x6162,0x633D, + 0x6669,0x66FC,0x6EFF,0x6F2B,0x7063,0x779E,0x842C,0x8513, + 0x883B,0x8F13,0x9945,0x9C3B,0x551C,0x62B9,0x672B,0x6CAB, + 0x8309,0x896A,0x977A,0x4EA1,0x5984,0x5FD8,0x5FD9,0x671B, + 0x7DB2,0x7F54,0x8292,0x832B,0x83BD,0x8F1E,0x9099,0x57CB, + 0x59B9,0x5A92,0x5BD0,0x6627,0x679A,0x6885,0x6BCF,0x7164, + 0x7F75,0x8CB7,0x8CE3,0x9081,0x9B45,0x8108,0x8C8A,0x964C, + 0x9A40,0x9EA5,0x5B5F,0x6C13,0x731B,0x76F2,0x76DF,0x840C, + 0x51AA,0x8993,0x514D,0x5195,0x52C9,0x68C9,0x6C94,0x7704, + 0x7720,0x7DBF,0x7DEC,0x9762,0x9EB5,0x6EC5, + /* Range 0x5921 - 0x597E, array index: 0x13A7 */ + 0x8511,0x51A5,0x540D,0x547D,0x660E,0x669D,0x6927,0x6E9F, + 0x76BF,0x7791,0x8317,0x84C2,0x879F,0x9169,0x9298,0x9CF4, + 0x8882,0x4FAE,0x5192,0x52DF,0x59C6,0x5E3D,0x6155,0x6478, + 0x6479,0x66AE,0x67D0,0x6A21,0x6BCD,0x6BDB,0x725F,0x7261, + 0x7441,0x7738,0x77DB,0x8017,0x82BC,0x8305,0x8B00,0x8B28, + 0x8C8C,0x6728,0x6C90,0x7267,0x76EE,0x7766,0x7A46,0x9DA9, + 0x6B7F,0x6C92,0x5922,0x6726,0x8499,0x536F,0x5893,0x5999, + 0x5EDF,0x63CF,0x6634,0x6773,0x6E3A,0x732B,0x7AD7,0x82D7, + 0x9328,0x52D9,0x5DEB,0x61AE,0x61CB,0x620A,0x62C7,0x64AB, + 0x65E0,0x6959,0x6B66,0x6BCB,0x7121,0x73F7,0x755D,0x7E46, + 0x821E,0x8302,0x856A,0x8AA3,0x8CBF,0x9727,0x9D61,0x58A8, + 0x9ED8,0x5011,0x520E,0x543B,0x554F,0x6587, + /* Range 0x5A21 - 0x5A7E, array index: 0x1405 */ + 0x6C76,0x7D0A,0x7D0B,0x805E,0x868A,0x9580,0x96EF,0x52FF, + 0x6C95,0x7269,0x5473,0x5A9A,0x5C3E,0x5D4B,0x5F4C,0x5FAE, + 0x672A,0x68B6,0x6963,0x6E3C,0x6E44,0x7709,0x7C73,0x7F8E, + 0x8587,0x8B0E,0x8FF7,0x9761,0x9EF4,0x5CB7,0x60B6,0x610D, + 0x61AB,0x654F,0x65FB,0x65FC,0x6C11,0x6CEF,0x739F,0x73C9, + 0x7DE1,0x9594,0x5BC6,0x871C,0x8B10,0x525D,0x535A,0x62CD, + 0x640F,0x64B2,0x6734,0x6A38,0x6CCA,0x73C0,0x749E,0x7B94, + 0x7C95,0x7E1B,0x818A,0x8236,0x8584,0x8FEB,0x96F9,0x99C1, + 0x4F34,0x534A,0x53CD,0x53DB,0x62CC,0x642C,0x6500,0x6591, + 0x69C3,0x6CEE,0x6F58,0x73ED,0x7554,0x7622,0x76E4,0x76FC, + 0x78D0,0x78FB,0x792C,0x7D46,0x822C,0x87E0,0x8FD4,0x9812, + 0x98EF,0x52C3,0x62D4,0x64A5,0x6E24,0x6F51, + /* Range 0x5B21 - 0x5B7E, array index: 0x1463 */ + 0x767C,0x8DCB,0x91B1,0x9262,0x9AEE,0x9B43,0x5023,0x508D, + 0x574A,0x59A8,0x5C28,0x5E47,0x5F77,0x623F,0x653E,0x65B9, + 0x65C1,0x6609,0x678B,0x699C,0x6EC2,0x78C5,0x7D21,0x80AA, + 0x8180,0x822B,0x82B3,0x84A1,0x868C,0x8A2A,0x8B17,0x90A6, + 0x9632,0x9F90,0x500D,0x4FF3,0xF963,0x57F9,0x5F98,0x62DC, + 0x6392,0x676F,0x6E43,0x7119,0x76C3,0x80CC,0x80DA,0x88F4, + 0x88F5,0x8919,0x8CE0,0x8F29,0x914D,0x966A,0x4F2F,0x4F70, + 0x5E1B,0x67CF,0x6822,0x767D,0x767E,0x9B44,0x5E61,0x6A0A, + 0x7169,0x71D4,0x756A,0xF964,0x7E41,0x8543,0x85E9,0x98DC, + 0x4F10,0x7B4F,0x7F70,0x95A5,0x51E1,0x5E06,0x68B5,0x6C3E, + 0x6C4E,0x6CDB,0x72AF,0x7BC4,0x8303,0x6CD5,0x743A,0x50FB, + 0x5288,0x58C1,0x64D8,0x6A97,0x74A7,0x7656, + /* Range 0x5C21 - 0x5C7E, array index: 0x14C1 */ + 0x78A7,0x8617,0x95E2,0x9739,0xF965,0x535E,0x5F01,0x8B8A, + 0x8FA8,0x8FAF,0x908A,0x5225,0x77A5,0x9C49,0x9F08,0x4E19, + 0x5002,0x5175,0x5C5B,0x5E77,0x661E,0x663A,0x67C4,0x68C5, + 0x70B3,0x7501,0x75C5,0x79C9,0x7ADD,0x8F27,0x9920,0x9A08, + 0x4FDD,0x5821,0x5831,0x5BF6,0x666E,0x6B65,0x6D11,0x6E7A, + 0x6F7D,0x73E4,0x752B,0x83E9,0x88DC,0x8913,0x8B5C,0x8F14, + 0x4F0F,0x50D5,0x5310,0x535C,0x5B93,0x5FA9,0x670D,0x798F, + 0x8179,0x832F,0x8514,0x8907,0x8986,0x8F39,0x8F3B,0x99A5, + 0x9C12,0x672C,0x4E76,0x4FF8,0x5949,0x5C01,0x5CEF,0x5CF0, + 0x6367,0x68D2,0x70FD,0x71A2,0x742B,0x7E2B,0x84EC,0x8702, + 0x9022,0x92D2,0x9CF3,0x4E0D,0x4ED8,0x4FEF,0x5085,0x5256, + 0x526F,0x5426,0x5490,0x57E0,0x592B,0x5A66, + /* Range 0x5D21 - 0x5D7E, array index: 0x151F */ + 0x5B5A,0x5B75,0x5BCC,0x5E9C,0xF966,0x6276,0x6577,0x65A7, + 0x6D6E,0x6EA5,0x7236,0x7B26,0x7C3F,0x7F36,0x8150,0x8151, + 0x819A,0x8240,0x8299,0x83A9,0x8A03,0x8CA0,0x8CE6,0x8CFB, + 0x8D74,0x8DBA,0x90E8,0x91DC,0x961C,0x9644,0x99D9,0x9CE7, + 0x5317,0x5206,0x5429,0x5674,0x58B3,0x5954,0x596E,0x5FFF, + 0x61A4,0x626E,0x6610,0x6C7E,0x711A,0x76C6,0x7C89,0x7CDE, + 0x7D1B,0x82AC,0x8CC1,0x96F0,0xF967,0x4F5B,0x5F17,0x5F7F, + 0x62C2,0x5D29,0x670B,0x68DA,0x787C,0x7E43,0x9D6C,0x4E15, + 0x5099,0x5315,0x532A,0x5351,0x5983,0x5A62,0x5E87,0x60B2, + 0x618A,0x6249,0x6279,0x6590,0x6787,0x69A7,0x6BD4,0x6BD6, + 0x6BD7,0x6BD8,0x6CB8,0xF968,0x7435,0x75FA,0x7812,0x7891, + 0x79D5,0x79D8,0x7C83,0x7DCB,0x7FE1,0x80A5, + /* Range 0x5E21 - 0x5E7E, array index: 0x157D */ + 0x813E,0x81C2,0x83F2,0x871A,0x88E8,0x8AB9,0x8B6C,0x8CBB, + 0x9119,0x975E,0x98DB,0x9F3B,0x56AC,0x5B2A,0x5F6C,0x658C, + 0x6AB3,0x6BAF,0x6D5C,0x6FF1,0x7015,0x725D,0x73AD,0x8CA7, + 0x8CD3,0x983B,0x6191,0x6C37,0x8058,0x9A01,0x4E4D,0x4E8B, + 0x4E9B,0x4ED5,0x4F3A,0x4F3C,0x4F7F,0x4FDF,0x50FF,0x53F2, + 0x53F8,0x5506,0x55E3,0x56DB,0x58EB,0x5962,0x5A11,0x5BEB, + 0x5BFA,0x5C04,0x5DF3,0x5E2B,0x5F99,0x601D,0x6368,0x659C, + 0x65AF,0x67F6,0x67FB,0x68AD,0x6B7B,0x6C99,0x6CD7,0x6E23, + 0x7009,0x7345,0x7802,0x793E,0x7940,0x7960,0x79C1,0x7BE9, + 0x7D17,0x7D72,0x8086,0x820D,0x838E,0x84D1,0x86C7,0x88DF, + 0x8A50,0x8A5E,0x8B1D,0x8CDC,0x8D66,0x8FAD,0x90AA,0x98FC, + 0x99DF,0x9E9D,0x524A,0xF969,0x6714,0xF96A, + /* Range 0x5F21 - 0x5F7E, array index: 0x15DB */ + 0x5098,0x522A,0x5C71,0x6563,0x6C55,0x73CA,0x7523,0x759D, + 0x7B97,0x849C,0x9178,0x9730,0x4E77,0x6492,0x6BBA,0x715E, + 0x85A9,0x4E09,0xF96B,0x6749,0x68EE,0x6E17,0x829F,0x8518, + 0x886B,0x63F7,0x6F81,0x9212,0x98AF,0x4E0A,0x50B7,0x50CF, + 0x511F,0x5546,0x55AA,0x5617,0x5B40,0x5C19,0x5CE0,0x5E38, + 0x5E8A,0x5EA0,0x5EC2,0x60F3,0x6851,0x6A61,0x6E58,0x723D, + 0x7240,0x72C0,0x76F8,0x7965,0x7BB1,0x7FD4,0x88F3,0x89F4, + 0x8A73,0x8C61,0x8CDE,0x971C,0x585E,0x74BD,0x8CFD,0x55C7, + 0xF96C,0x7A61,0x7D22,0x8272,0x7272,0x751F,0x7525,0xF96D, + 0x7B19,0x5885,0x58FB,0x5DBC,0x5E8F,0x5EB6,0x5F90,0x6055, + 0x6292,0x637F,0x654D,0x6691,0x66D9,0x66F8,0x6816,0x68F2, + 0x7280,0x745E,0x7B6E,0x7D6E,0x7DD6,0x7F72, + /* Range 0x6021 - 0x607E, array index: 0x1639 */ + 0x80E5,0x8212,0x85AF,0x897F,0x8A93,0x901D,0x92E4,0x9ECD, + 0x9F20,0x5915,0x596D,0x5E2D,0x60DC,0x6614,0x6673,0x6790, + 0x6C50,0x6DC5,0x6F5F,0x77F3,0x78A9,0x84C6,0x91CB,0x932B, + 0x4ED9,0x50CA,0x5148,0x5584,0x5B0B,0x5BA3,0x6247,0x657E, + 0x65CB,0x6E32,0x717D,0x7401,0x7444,0x7487,0x74BF,0x766C, + 0x79AA,0x7DDA,0x7E55,0x7FA8,0x817A,0x81B3,0x8239,0x861A, + 0x87EC,0x8A75,0x8DE3,0x9078,0x9291,0x9425,0x994D,0x9BAE, + 0x5368,0x5C51,0x6954,0x6CC4,0x6D29,0x6E2B,0x820C,0x859B, + 0x893B,0x8A2D,0x8AAA,0x96EA,0x9F67,0x5261,0x66B9,0x6BB2, + 0x7E96,0x87FE,0x8D0D,0x9583,0x965D,0x651D,0x6D89,0x71EE, + 0xF96E,0x57CE,0x59D3,0x5BAC,0x6027,0x60FA,0x6210,0x661F, + 0x665F,0x7329,0x73F9,0x76DB,0x7701,0x7B6C, + /* Range 0x6121 - 0x617E, array index: 0x1697 */ + 0x8056,0x8072,0x8165,0x8AA0,0x9192,0x4E16,0x52E2,0x6B72, + 0x6D17,0x7A05,0x7B39,0x7D30,0xF96F,0x8CB0,0x53EC,0x562F, + 0x5851,0x5BB5,0x5C0F,0x5C11,0x5DE2,0x6240,0x6383,0x6414, + 0x662D,0x68B3,0x6CBC,0x6D88,0x6EAF,0x701F,0x70A4,0x71D2, + 0x7526,0x758F,0x758E,0x7619,0x7B11,0x7BE0,0x7C2B,0x7D20, + 0x7D39,0x852C,0x856D,0x8607,0x8A34,0x900D,0x9061,0x90B5, + 0x92B7,0x97F6,0x9A37,0x4FD7,0x5C6C,0x675F,0x6D91,0x7C9F, + 0x7E8C,0x8B16,0x8D16,0x901F,0x5B6B,0x5DFD,0x640D,0x84C0, + 0x905C,0x98E1,0x7387,0x5B8B,0x609A,0x677E,0x6DDE,0x8A1F, + 0x8AA6,0x9001,0x980C,0x5237,0xF970,0x7051,0x788E,0x9396, + 0x8870,0x91D7,0x4FEE,0x53D7,0x55FD,0x56DA,0x5782,0x58FD, + 0x5AC2,0x5B88,0x5CAB,0x5CC0,0x5E25,0x6101, + /* Range 0x6221 - 0x627E, array index: 0x16F5 */ + 0x620D,0x624B,0x6388,0x641C,0x6536,0x6578,0x6A39,0x6B8A, + 0x6C34,0x6D19,0x6F31,0x71E7,0x72E9,0x7378,0x7407,0x74B2, + 0x7626,0x7761,0x79C0,0x7A57,0x7AEA,0x7CB9,0x7D8F,0x7DAC, + 0x7E61,0x7F9E,0x8129,0x8331,0x8490,0x84DA,0x85EA,0x8896, + 0x8AB0,0x8B90,0x8F38,0x9042,0x9083,0x916C,0x9296,0x92B9, + 0x968B,0x96A7,0x96A8,0x96D6,0x9700,0x9808,0x9996,0x9AD3, + 0x9B1A,0x53D4,0x587E,0x5919,0x5B70,0x5BBF,0x6DD1,0x6F5A, + 0x719F,0x7421,0x74B9,0x8085,0x83FD,0x5DE1,0x5F87,0x5FAA, + 0x6042,0x65EC,0x6812,0x696F,0x6A53,0x6B89,0x6D35,0x6DF3, + 0x73E3,0x76FE,0x77AC,0x7B4D,0x7D14,0x8123,0x821C,0x8340, + 0x84F4,0x8563,0x8A62,0x8AC4,0x9187,0x931E,0x9806,0x99B4, + 0x620C,0x8853,0x8FF0,0x9265,0x5D07,0x5D27, + /* Range 0x6321 - 0x637E, array index: 0x1753 */ + 0x5D69,0x745F,0x819D,0x8768,0x6FD5,0x62FE,0x7FD2,0x8936, + 0x8972,0x4E1E,0x4E58,0x50E7,0x52DD,0x5347,0x627F,0x6607, + 0x7E69,0x8805,0x965E,0x4F8D,0x5319,0x5636,0x59CB,0x5AA4, + 0x5C38,0x5C4E,0x5C4D,0x5E02,0x5F11,0x6043,0x65BD,0x662F, + 0x6642,0x67BE,0x67F4,0x731C,0x77E2,0x793A,0x7FC5,0x8494, + 0x84CD,0x8996,0x8A66,0x8A69,0x8AE1,0x8C55,0x8C7A,0x57F4, + 0x5BD4,0x5F0F,0x606F,0x62ED,0x690D,0x6B96,0x6E5C,0x7184, + 0x7BD2,0x8755,0x8B58,0x8EFE,0x98DF,0x98FE,0x4F38,0x4F81, + 0x4FE1,0x547B,0x5A20,0x5BB8,0x613C,0x65B0,0x6668,0x71FC, + 0x7533,0x795E,0x7D33,0x814E,0x81E3,0x8398,0x85AA,0x85CE, + 0x8703,0x8A0A,0x8EAB,0x8F9B,0xF971,0x8FC5,0x5931,0x5BA4, + 0x5BE6,0x6089,0x5BE9,0x5C0B,0x5FC3,0x6C81, + /* Range 0x6421 - 0x647E, array index: 0x17B1 */ + 0xF972,0x6DF1,0x700B,0x751A,0x82AF,0x8AF6,0x4EC0,0x5341, + 0xF973,0x96D9,0x6C0F,0x4E9E,0x4FC4,0x5152,0x555E,0x5A25, + 0x5CE8,0x6211,0x7259,0x82BD,0x83AA,0x86FE,0x8859,0x8A1D, + 0x963F,0x96C5,0x9913,0x9D09,0x9D5D,0x580A,0x5CB3,0x5DBD, + 0x5E44,0x60E1,0x6115,0x63E1,0x6A02,0x6E25,0x9102,0x9354, + 0x984E,0x9C10,0x9F77,0x5B89,0x5CB8,0x6309,0x664F,0x6848, + 0x773C,0x96C1,0x978D,0x9854,0x9B9F,0x65A1,0x8B01,0x8ECB, + 0x95BC,0x5535,0x5CA9,0x5DD6,0x5EB5,0x6697,0x764C,0x83F4, + 0x95C7,0x58D3,0x62BC,0x72CE,0x9D28,0x4EF0,0x592E,0x600F, + 0x663B,0x6B83,0x79E7,0x9D26,0x5393,0x54C0,0x57C3,0x5D16, + 0x611B,0x66D6,0x6DAF,0x788D,0x827E,0x9698,0x9744,0x5384, + 0x627C,0x6396,0x6DB2,0x7E0A,0x814B,0x984D, + /* Range 0x6521 - 0x657E, array index: 0x180F */ + 0x6AFB,0x7F4C,0x9DAF,0x9E1A,0x4E5F,0x503B,0x51B6,0x591C, + 0x60F9,0x63F6,0x6930,0x723A,0x8036,0xF974,0x91CE,0x5F31, + 0xF975,0xF976,0x7D04,0x82E5,0x846F,0x84BB,0x85E5,0x8E8D, + 0xF977,0x4F6F,0xF978,0xF979,0x58E4,0x5B43,0x6059,0x63DA, + 0x6518,0x656D,0x6698,0xF97A,0x694A,0x6A23,0x6D0B,0x7001, + 0x716C,0x75D2,0x760D,0x79B3,0x7A70,0xF97B,0x7F8A,0xF97C, + 0x8944,0xF97D,0x8B93,0x91C0,0x967D,0xF97E,0x990A,0x5704, + 0x5FA1,0x65BC,0x6F01,0x7600,0x79A6,0x8A9E,0x99AD,0x9B5A, + 0x9F6C,0x5104,0x61B6,0x6291,0x6A8D,0x81C6,0x5043,0x5830, + 0x5F66,0x7109,0x8A00,0x8AFA,0x5B7C,0x8616,0x4FFA,0x513C, + 0x56B4,0x5944,0x63A9,0x6DF9,0x5DAA,0x696D,0x5186,0x4E88, + 0x4F59,0xF97F,0xF980,0xF981,0x5982,0xF982, + /* Range 0x6621 - 0x667E, array index: 0x186D */ + 0xF983,0x6B5F,0x6C5D,0xF984,0x74B5,0x7916,0xF985,0x8207, + 0x8245,0x8339,0x8F3F,0x8F5D,0xF986,0x9918,0xF987,0xF988, + 0xF989,0x4EA6,0xF98A,0x57DF,0x5F79,0x6613,0xF98B,0xF98C, + 0x75AB,0x7E79,0x8B6F,0xF98D,0x9006,0x9A5B,0x56A5,0x5827, + 0x59F8,0x5A1F,0x5BB4,0xF98E,0x5EF6,0xF98F,0xF990,0x6350, + 0x633B,0xF991,0x693D,0x6C87,0x6CBF,0x6D8E,0x6D93,0x6DF5, + 0x6F14,0xF992,0x70DF,0x7136,0x7159,0xF993,0x71C3,0x71D5, + 0xF994,0x784F,0x786F,0xF995,0x7B75,0x7DE3,0xF996,0x7E2F, + 0xF997,0x884D,0x8EDF,0xF998,0xF999,0xF99A,0x925B,0xF99B, + 0x9CF6,0xF99C,0xF99D,0xF99E,0x6085,0x6D85,0xF99F,0x71B1, + 0xF9A0,0xF9A1,0x95B1,0x53AD,0xF9A2,0xF9A3,0xF9A4,0x67D3, + 0xF9A5,0x708E,0x7130,0x7430,0x8276,0x82D2, + /* Range 0x6721 - 0x677E, array index: 0x18CB */ + 0xF9A6,0x95BB,0x9AE5,0x9E7D,0x66C4,0xF9A7,0x71C1,0x8449, + 0xF9A8,0xF9A9,0x584B,0xF9AA,0xF9AB,0x5DB8,0x5F71,0xF9AC, + 0x6620,0x668E,0x6979,0x69AE,0x6C38,0x6CF3,0x6E36,0x6F41, + 0x6FDA,0x701B,0x702F,0x7150,0x71DF,0x7370,0xF9AD,0x745B, + 0xF9AE,0x74D4,0x76C8,0x7A4E,0x7E93,0xF9AF,0xF9B0,0x82F1, + 0x8A60,0x8FCE,0xF9B1,0x9348,0xF9B2,0x9719,0xF9B3,0xF9B4, + 0x4E42,0x502A,0xF9B5,0x5208,0x53E1,0x66F3,0x6C6D,0x6FCA, + 0x730A,0x777F,0x7A62,0x82AE,0x85DD,0x8602,0xF9B6,0x88D4, + 0x8A63,0x8B7D,0x8C6B,0xF9B7,0x92B3,0xF9B8,0x9713,0x9810, + 0x4E94,0x4F0D,0x4FC9,0x50B2,0x5348,0x543E,0x5433,0x55DA, + 0x5862,0x58BA,0x5967,0x5A1B,0x5BE4,0x609F,0xF9B9,0x61CA, + 0x6556,0x65FF,0x6664,0x68A7,0x6C5A,0x6FB3, + /* Range 0x6821 - 0x687E, array index: 0x1929 */ + 0x70CF,0x71AC,0x7352,0x7B7D,0x8708,0x8AA4,0x9C32,0x9F07, + 0x5C4B,0x6C83,0x7344,0x7389,0x923A,0x6EAB,0x7465,0x761F, + 0x7A69,0x7E15,0x860A,0x5140,0x58C5,0x64C1,0x74EE,0x7515, + 0x7670,0x7FC1,0x9095,0x96CD,0x9954,0x6E26,0x74E6,0x7AA9, + 0x7AAA,0x81E5,0x86D9,0x8778,0x8A1B,0x5A49,0x5B8C,0x5B9B, + 0x68A1,0x6900,0x6D63,0x73A9,0x7413,0x742C,0x7897,0x7DE9, + 0x7FEB,0x8118,0x8155,0x839E,0x8C4C,0x962E,0x9811,0x66F0, + 0x5F80,0x65FA,0x6789,0x6C6A,0x738B,0x502D,0x5A03,0x6B6A, + 0x77EE,0x5916,0x5D6C,0x5DCD,0x7325,0x754F,0xF9BA,0xF9BB, + 0x50E5,0x51F9,0x582F,0x592D,0x5996,0x59DA,0x5BE5,0xF9BC, + 0xF9BD,0x5DA2,0x62D7,0x6416,0x6493,0x64FE,0xF9BE,0x66DC, + 0xF9BF,0x6A48,0xF9C0,0x71FF,0x7464,0xF9C1, + /* Range 0x6921 - 0x697E, array index: 0x1987 */ + 0x7A88,0x7AAF,0x7E47,0x7E5E,0x8000,0x8170,0xF9C2,0x87EF, + 0x8981,0x8B20,0x9059,0xF9C3,0x9080,0x9952,0x617E,0x6B32, + 0x6D74,0x7E1F,0x8925,0x8FB1,0x4FD1,0x50AD,0x5197,0x52C7, + 0x57C7,0x5889,0x5BB9,0x5EB8,0x6142,0x6995,0x6D8C,0x6E67, + 0x6EB6,0x7194,0x7462,0x7528,0x752C,0x8073,0x8338,0x84C9, + 0x8E0A,0x9394,0x93DE,0xF9C4,0x4E8E,0x4F51,0x5076,0x512A, + 0x53C8,0x53CB,0x53F3,0x5B87,0x5BD3,0x5C24,0x611A,0x6182, + 0x65F4,0x725B,0x7397,0x7440,0x76C2,0x7950,0x7991,0x79B9, + 0x7D06,0x7FBD,0x828B,0x85D5,0x865E,0x8FC2,0x9047,0x90F5, + 0x91EA,0x9685,0x96E8,0x96E9,0x52D6,0x5F67,0x65ED,0x6631, + 0x682F,0x715C,0x7A36,0x90C1,0x980A,0x4E91,0xF9C5,0x6A52, + 0x6B9E,0x6F90,0x7189,0x8018,0x82B8,0x8553, + /* Range 0x6A21 - 0x6A7E, array index: 0x19E5 */ + 0x904B,0x9695,0x96F2,0x97FB,0x851A,0x9B31,0x4E90,0x718A, + 0x96C4,0x5143,0x539F,0x54E1,0x5713,0x5712,0x57A3,0x5A9B, + 0x5AC4,0x5BC3,0x6028,0x613F,0x63F4,0x6C85,0x6D39,0x6E72, + 0x6E90,0x7230,0x733F,0x7457,0x82D1,0x8881,0x8F45,0x9060, + 0xF9C6,0x9662,0x9858,0x9D1B,0x6708,0x8D8A,0x925E,0x4F4D, + 0x5049,0x50DE,0x5371,0x570D,0x59D4,0x5A01,0x5C09,0x6170, + 0x6690,0x6E2D,0x7232,0x744B,0x7DEF,0x80C3,0x840E,0x8466, + 0x853F,0x875F,0x885B,0x8918,0x8B02,0x9055,0x97CB,0x9B4F, + 0x4E73,0x4F91,0x5112,0x516A,0xF9C7,0x552F,0x55A9,0x5B7A, + 0x5BA5,0x5E7C,0x5E7D,0x5EBE,0x60A0,0x60DF,0x6108,0x6109, + 0x63C4,0x6538,0x6709,0xF9C8,0x67D4,0x67DA,0xF9C9,0x6961, + 0x6962,0x6CB9,0x6D27,0xF9CA,0x6E38,0xF9CB, + /* Range 0x6B21 - 0x6B7E, array index: 0x1A43 */ + 0x6FE1,0x7336,0x7337,0xF9CC,0x745C,0x7531,0xF9CD,0x7652, + 0xF9CE,0xF9CF,0x7DAD,0x81FE,0x8438,0x88D5,0x8A98,0x8ADB, + 0x8AED,0x8E30,0x8E42,0x904A,0x903E,0x907A,0x9149,0x91C9, + 0x936E,0xF9D0,0xF9D1,0x5809,0xF9D2,0x6BD3,0x8089,0x80B2, + 0xF9D3,0xF9D4,0x5141,0x596B,0x5C39,0xF9D5,0xF9D6,0x6F64, + 0x73A7,0x80E4,0x8D07,0xF9D7,0x9217,0x958F,0xF9D8,0xF9D9, + 0xF9DA,0xF9DB,0x807F,0x620E,0x701C,0x7D68,0x878D,0xF9DC, + 0x57A0,0x6069,0x6147,0x6BB7,0x8ABE,0x9280,0x96B1,0x4E59, + 0x541F,0x6DEB,0x852D,0x9670,0x97F3,0x98EE,0x63D6,0x6CE3, + 0x9091,0x51DD,0x61C9,0x81BA,0x9DF9,0x4F9D,0x501A,0x5100, + 0x5B9C,0x610F,0x61FF,0x64EC,0x6905,0x6BC5,0x7591,0x77E3, + 0x7FA9,0x8264,0x858F,0x87FB,0x8863,0x8ABC, + /* Range 0x6C21 - 0x6C7E, array index: 0x1AA1 */ + 0x8B70,0x91AB,0x4E8C,0x4EE5,0x4F0A,0xF9DD,0xF9DE,0x5937, + 0x59E8,0xF9DF,0x5DF2,0x5F1B,0x5F5B,0x6021,0xF9E0,0xF9E1, + 0xF9E2,0xF9E3,0x723E,0x73E5,0xF9E4,0x7570,0x75CD,0xF9E5, + 0x79FB,0xF9E6,0x800C,0x8033,0x8084,0x82E1,0x8351,0xF9E7, + 0xF9E8,0x8CBD,0x8CB3,0x9087,0xF9E9,0xF9EA,0x98F4,0x990C, + 0xF9EB,0xF9EC,0x7037,0x76CA,0x7FCA,0x7FCC,0x7FFC,0x8B1A, + 0x4EBA,0x4EC1,0x5203,0x5370,0xF9ED,0x54BD,0x56E0,0x59FB, + 0x5BC5,0x5F15,0x5FCD,0x6E6E,0xF9EE,0xF9EF,0x7D6A,0x8335, + 0xF9F0,0x8693,0x8A8D,0xF9F1,0x976D,0x9777,0xF9F2,0xF9F3, + 0x4E00,0x4F5A,0x4F7E,0x58F9,0x65E5,0x6EA2,0x9038,0x93B0, + 0x99B9,0x4EFB,0x58EC,0x598A,0x59D9,0x6041,0xF9F4,0xF9F5, + 0x7A14,0xF9F6,0x834F,0x8CC3,0x5165,0x5344, + /* Range 0x6D21 - 0x6D7E, array index: 0x1AFF */ + 0xF9F7,0xF9F8,0xF9F9,0x4ECD,0x5269,0x5B55,0x82BF,0x4ED4, + 0x523A,0x54A8,0x59C9,0x59FF,0x5B50,0x5B57,0x5B5C,0x6063, + 0x6148,0x6ECB,0x7099,0x716E,0x7386,0x74F7,0x75B5,0x78C1, + 0x7D2B,0x8005,0x81EA,0x8328,0x8517,0x85C9,0x8AEE,0x8CC7, + 0x96CC,0x4F5C,0x52FA,0x56BC,0x65AB,0x6628,0x707C,0x70B8, + 0x7235,0x7DBD,0x828D,0x914C,0x96C0,0x9D72,0x5B71,0x68E7, + 0x6B98,0x6F7A,0x76DE,0x5C91,0x66AB,0x6F5B,0x7BB4,0x7C2A, + 0x8836,0x96DC,0x4E08,0x4ED7,0x5320,0x5834,0x58BB,0x58EF, + 0x596C,0x5C07,0x5E33,0x5E84,0x5F35,0x638C,0x66B2,0x6756, + 0x6A1F,0x6AA3,0x6B0C,0x6F3F,0x7246,0xF9FA,0x7350,0x748B, + 0x7AE0,0x7CA7,0x8178,0x81DF,0x81E7,0x838A,0x846C,0x8523, + 0x8594,0x85CF,0x88DD,0x8D13,0x91AC,0x9577, + /* Range 0x6E21 - 0x6E7E, array index: 0x1B5D */ + 0x969C,0x518D,0x54C9,0x5728,0x5BB0,0x624D,0x6750,0x683D, + 0x6893,0x6E3D,0x6ED3,0x707D,0x7E21,0x88C1,0x8CA1,0x8F09, + 0x9F4B,0x9F4E,0x722D,0x7B8F,0x8ACD,0x931A,0x4F47,0x4F4E, + 0x5132,0x5480,0x59D0,0x5E95,0x62B5,0x6775,0x696E,0x6A17, + 0x6CAE,0x6E1A,0x72D9,0x732A,0x75BD,0x7BB8,0x7D35,0x82E7, + 0x83F9,0x8457,0x85F7,0x8A5B,0x8CAF,0x8E87,0x9019,0x90B8, + 0x96CE,0x9F5F,0x52E3,0x540A,0x5AE1,0x5BC2,0x6458,0x6575, + 0x6EF4,0x72C4,0xF9FB,0x7684,0x7A4D,0x7B1B,0x7C4D,0x7E3E, + 0x7FDF,0x837B,0x8B2B,0x8CCA,0x8D64,0x8DE1,0x8E5F,0x8FEA, + 0x8FF9,0x9069,0x93D1,0x4F43,0x4F7A,0x50B3,0x5168,0x5178, + 0x524D,0x526A,0x5861,0x587C,0x5960,0x5C08,0x5C55,0x5EDB, + 0x609B,0x6230,0x6813,0x6BBF,0x6C08,0x6FB1, + /* Range 0x6F21 - 0x6F7E, array index: 0x1BBB */ + 0x714E,0x7420,0x7530,0x7538,0x7551,0x7672,0x7B4C,0x7B8B, + 0x7BAD,0x7BC6,0x7E8F,0x8A6E,0x8F3E,0x8F49,0x923F,0x9293, + 0x9322,0x942B,0x96FB,0x985A,0x986B,0x991E,0x5207,0x622A, + 0x6298,0x6D59,0x7664,0x7ACA,0x7BC0,0x7D76,0x5360,0x5CBE, + 0x5E97,0x6F38,0x70B9,0x7C98,0x9711,0x9B8E,0x9EDE,0x63A5, + 0x647A,0x8776,0x4E01,0x4E95,0x4EAD,0x505C,0x5075,0x5448, + 0x59C3,0x5B9A,0x5E40,0x5EAD,0x5EF7,0x5F81,0x60C5,0x633A, + 0x653F,0x6574,0x65CC,0x6676,0x6678,0x67FE,0x6968,0x6A89, + 0x6B63,0x6C40,0x6DC0,0x6DE8,0x6E1F,0x6E5E,0x701E,0x70A1, + 0x738E,0x73FD,0x753A,0x775B,0x7887,0x798E,0x7A0B,0x7A7D, + 0x7CBE,0x7D8E,0x8247,0x8A02,0x8AEA,0x8C9E,0x912D,0x914A, + 0x91D8,0x9266,0x92CC,0x9320,0x9706,0x9756, + /* Range 0x7021 - 0x707E, array index: 0x1C19 */ + 0x975C,0x9802,0x9F0E,0x5236,0x5291,0x557C,0x5824,0x5E1D, + 0x5F1F,0x608C,0x63D0,0x68AF,0x6FDF,0x796D,0x7B2C,0x81CD, + 0x85BA,0x88FD,0x8AF8,0x8E44,0x918D,0x9664,0x969B,0x973D, + 0x984C,0x9F4A,0x4FCE,0x5146,0x51CB,0x52A9,0x5632,0x5F14, + 0x5F6B,0x63AA,0x64CD,0x65E9,0x6641,0x66FA,0x66F9,0x671D, + 0x689D,0x68D7,0x69FD,0x6F15,0x6F6E,0x7167,0x71E5,0x722A, + 0x74AA,0x773A,0x7956,0x795A,0x79DF,0x7A20,0x7A95,0x7C97, + 0x7CDF,0x7D44,0x7E70,0x8087,0x85FB,0x86A4,0x8A54,0x8ABF, + 0x8D99,0x8E81,0x9020,0x906D,0x91E3,0x963B,0x96D5,0x9CE5, + 0x65CF,0x7C07,0x8DB3,0x93C3,0x5B58,0x5C0A,0x5352,0x62D9, + 0x731D,0x5027,0x5B97,0x5F9E,0x60B0,0x616B,0x68D5,0x6DD9, + 0x742E,0x7A2E,0x7D42,0x7D9C,0x7E31,0x816B, + /* Range 0x7121 - 0x717E, array index: 0x1C77 */ + 0x8E2A,0x8E35,0x937E,0x9418,0x4F50,0x5750,0x5DE6,0x5EA7, + 0x632B,0x7F6A,0x4E3B,0x4F4F,0x4F8F,0x505A,0x59DD,0x80C4, + 0x546A,0x5468,0x55FE,0x594F,0x5B99,0x5DDE,0x5EDA,0x665D, + 0x6731,0x67F1,0x682A,0x6CE8,0x6D32,0x6E4A,0x6F8D,0x70B7, + 0x73E0,0x7587,0x7C4C,0x7D02,0x7D2C,0x7DA2,0x821F,0x86DB, + 0x8A3B,0x8A85,0x8D70,0x8E8A,0x8F33,0x9031,0x914E,0x9152, + 0x9444,0x99D0,0x7AF9,0x7CA5,0x4FCA,0x5101,0x51C6,0x57C8, + 0x5BEF,0x5CFB,0x6659,0x6A3D,0x6D5A,0x6E96,0x6FEC,0x710C, + 0x756F,0x7AE3,0x8822,0x9021,0x9075,0x96CB,0x99FF,0x8301, + 0x4E2D,0x4EF2,0x8846,0x91CD,0x537D,0x6ADB,0x696B,0x6C41, + 0x847A,0x589E,0x618E,0x66FE,0x62EF,0x70DD,0x7511,0x75C7, + 0x7E52,0x84B8,0x8B49,0x8D08,0x4E4B,0x53EA, + /* Range 0x7221 - 0x727E, array index: 0x1CD5 */ + 0x54AB,0x5730,0x5740,0x5FD7,0x6301,0x6307,0x646F,0x652F, + 0x65E8,0x667A,0x679D,0x67B3,0x6B62,0x6C60,0x6C9A,0x6F2C, + 0x77E5,0x7825,0x7949,0x7957,0x7D19,0x80A2,0x8102,0x81F3, + 0x829D,0x82B7,0x8718,0x8A8C,0xF9FC,0x8D04,0x8DBE,0x9072, + 0x76F4,0x7A19,0x7A37,0x7E54,0x8077,0x5507,0x55D4,0x5875, + 0x632F,0x6422,0x6649,0x664B,0x686D,0x699B,0x6B84,0x6D25, + 0x6EB1,0x73CD,0x7468,0x74A1,0x755B,0x75B9,0x76E1,0x771E, + 0x778B,0x79E6,0x7E09,0x7E1D,0x81FB,0x852F,0x8897,0x8A3A, + 0x8CD1,0x8EEB,0x8FB0,0x9032,0x93AD,0x9663,0x9673,0x9707, + 0x4F84,0x53F1,0x59EA,0x5AC9,0x5E19,0x684E,0x74C6,0x75BE, + 0x79E9,0x7A92,0x81A3,0x86ED,0x8CEA,0x8DCC,0x8FED,0x659F, + 0x6715,0xF9FD,0x57F7,0x6F57,0x7DDD,0x8F2F, + /* Range 0x7321 - 0x737E, array index: 0x1D33 */ + 0x93F6,0x96C6,0x5FB5,0x61F2,0x6F84,0x4E14,0x4F98,0x501F, + 0x53C9,0x55DF,0x5D6F,0x5DEE,0x6B21,0x6B64,0x78CB,0x7B9A, + 0xF9FE,0x8E49,0x8ECA,0x906E,0x6349,0x643E,0x7740,0x7A84, + 0x932F,0x947F,0x9F6A,0x64B0,0x6FAF,0x71E6,0x74A8,0x74DA, + 0x7AC4,0x7C12,0x7E82,0x7CB2,0x7E98,0x8B9A,0x8D0A,0x947D, + 0x9910,0x994C,0x5239,0x5BDF,0x64E6,0x672D,0x7D2E,0x50ED, + 0x53C3,0x5879,0x6158,0x6159,0x61FA,0x65AC,0x7AD9,0x8B92, + 0x8B96,0x5009,0x5021,0x5275,0x5531,0x5A3C,0x5EE0,0x5F70, + 0x6134,0x655E,0x660C,0x6636,0x66A2,0x69CD,0x6EC4,0x6F32, + 0x7316,0x7621,0x7A93,0x8139,0x8259,0x83D6,0x84BC,0x50B5, + 0x57F0,0x5BC0,0x5BE8,0x5F69,0x63A1,0x7826,0x7DB5,0x83DC, + 0x8521,0x91C7,0x91F5,0x518A,0x67F5,0x7B56, + /* Range 0x7421 - 0x747E, array index: 0x1D91 */ + 0x8CAC,0x51C4,0x59BB,0x60BD,0x8655,0x501C,0xF9FF,0x5254, + 0x5C3A,0x617D,0x621A,0x62D3,0x64F2,0x65A5,0x6ECC,0x7620, + 0x810A,0x8E60,0x965F,0x96BB,0x4EDF,0x5343,0x5598,0x5929, + 0x5DDD,0x64C5,0x6CC9,0x6DFA,0x7394,0x7A7F,0x821B,0x85A6, + 0x8CE4,0x8E10,0x9077,0x91E7,0x95E1,0x9621,0x97C6,0x51F8, + 0x54F2,0x5586,0x5FB9,0x64A4,0x6F88,0x7DB4,0x8F1F,0x8F4D, + 0x9435,0x50C9,0x5C16,0x6CBE,0x6DFB,0x751B,0x77BB,0x7C3D, + 0x7C64,0x8A79,0x8AC2,0x581E,0x59BE,0x5E16,0x6377,0x7252, + 0x758A,0x776B,0x8ADC,0x8CBC,0x8F12,0x5EF3,0x6674,0x6DF8, + 0x807D,0x83C1,0x8ACB,0x9751,0x9BD6,0xFA00,0x5243,0x66FF, + 0x6D95,0x6EEF,0x7DE0,0x8AE6,0x902E,0x905E,0x9AD4,0x521D, + 0x527F,0x54E8,0x6194,0x6284,0x62DB,0x68A2, + /* Range 0x7521 - 0x757E, array index: 0x1DEF */ + 0x6912,0x695A,0x6A35,0x7092,0x7126,0x785D,0x7901,0x790E, + 0x79D2,0x7A0D,0x8096,0x8278,0x82D5,0x8349,0x8549,0x8C82, + 0x8D85,0x9162,0x918B,0x91AE,0x4FC3,0x56D1,0x71ED,0x77D7, + 0x8700,0x89F8,0x5BF8,0x5FD6,0x6751,0x90A8,0x53E2,0x585A, + 0x5BF5,0x60A4,0x6181,0x6460,0x7E3D,0x8070,0x8525,0x9283, + 0x64AE,0x50AC,0x5D14,0x6700,0x589C,0x62BD,0x63A8,0x690E, + 0x6978,0x6A1E,0x6E6B,0x76BA,0x79CB,0x82BB,0x8429,0x8ACF, + 0x8DA8,0x8FFD,0x9112,0x914B,0x919C,0x9310,0x9318,0x939A, + 0x96DB,0x9A36,0x9C0D,0x4E11,0x755C,0x795D,0x7AFA,0x7B51, + 0x7BC9,0x7E2E,0x84C4,0x8E59,0x8E74,0x8EF8,0x9010,0x6625, + 0x693F,0x7443,0x51FA,0x672E,0x9EDC,0x5145,0x5FE0,0x6C96, + 0x87F2,0x885D,0x8877,0x60B4,0x81B5,0x8403, + /* Range 0x7621 - 0x767E, array index: 0x1E4D */ + 0x8D05,0x53D6,0x5439,0x5634,0x5A36,0x5C31,0x708A,0x7FE0, + 0x805A,0x8106,0x81ED,0x8DA3,0x9189,0x9A5F,0x9DF2,0x5074, + 0x4EC4,0x53A0,0x60FB,0x6E2C,0x5C64,0x4F88,0x5024,0x55E4, + 0x5CD9,0x5E5F,0x6065,0x6894,0x6CBB,0x6DC4,0x71BE,0x75D4, + 0x75F4,0x7661,0x7A1A,0x7A49,0x7DC7,0x7DFB,0x7F6E,0x81F4, + 0x86A9,0x8F1C,0x96C9,0x99B3,0x9F52,0x5247,0x52C5,0x98ED, + 0x89AA,0x4E03,0x67D2,0x6F06,0x4FB5,0x5BE2,0x6795,0x6C88, + 0x6D78,0x741B,0x7827,0x91DD,0x937C,0x87C4,0x79E4,0x7A31, + 0x5FEB,0x4ED6,0x54A4,0x553E,0x58AE,0x59A5,0x60F0,0x6253, + 0x62D6,0x6736,0x6955,0x8235,0x9640,0x99B1,0x99DD,0x502C, + 0x5353,0x5544,0x577C,0xFA01,0x6258,0xFA02,0x64E2,0x666B, + 0x67DD,0x6FC1,0x6FEF,0x7422,0x7438,0x8A17, + /* Range 0x7721 - 0x777E, array index: 0x1EAB */ + 0x9438,0x5451,0x5606,0x5766,0x5F48,0x619A,0x6B4E,0x7058, + 0x70AD,0x7DBB,0x8A95,0x596A,0x812B,0x63A2,0x7708,0x803D, + 0x8CAA,0x5854,0x642D,0x69BB,0x5B95,0x5E11,0x6E6F,0xFA03, + 0x8569,0x514C,0x53F0,0x592A,0x6020,0x614B,0x6B86,0x6C70, + 0x6CF0,0x7B1E,0x80CE,0x82D4,0x8DC6,0x90B0,0x98B1,0xFA04, + 0x64C7,0x6FA4,0x6491,0x6504,0x514E,0x5410,0x571F,0x8A0E, + 0x615F,0x6876,0xFA05,0x75DB,0x7B52,0x7D71,0x901A,0x5806, + 0x69CC,0x817F,0x892A,0x9000,0x9839,0x5078,0x5957,0x59AC, + 0x6295,0x900F,0x9B2A,0x615D,0x7279,0x95D6,0x5761,0x5A46, + 0x5DF4,0x628A,0x64AD,0x64FA,0x6777,0x6CE2,0x6D3E,0x722C, + 0x7436,0x7834,0x7F77,0x82AD,0x8DDB,0x9817,0x5224,0x5742, + 0x677F,0x7248,0x74E3,0x8CA9,0x8FA6,0x9211, + /* Range 0x7821 - 0x787E, array index: 0x1F09 */ + 0x962A,0x516B,0x53ED,0x634C,0x4F69,0x5504,0x6096,0x6557, + 0x6C9B,0x6D7F,0x724C,0x72FD,0x7A17,0x8987,0x8C9D,0x5F6D, + 0x6F8E,0x70F9,0x81A8,0x610E,0x4FBF,0x504F,0x6241,0x7247, + 0x7BC7,0x7DE8,0x7FE9,0x904D,0x97AD,0x9A19,0x8CB6,0x576A, + 0x5E73,0x67B0,0x840D,0x8A55,0x5420,0x5B16,0x5E63,0x5EE2, + 0x5F0A,0x6583,0x80BA,0x853D,0x9589,0x965B,0x4F48,0x5305, + 0x530D,0x530F,0x5486,0x54FA,0x5703,0x5E03,0x6016,0x629B, + 0x62B1,0x6355,0xFA06,0x6CE1,0x6D66,0x75B1,0x7832,0x80DE, + 0x812F,0x82DE,0x8461,0x84B2,0x888D,0x8912,0x900B,0x92EA, + 0x98FD,0x9B91,0x5E45,0x66B4,0x66DD,0x7011,0x7206,0xFA07, + 0x4FF5,0x527D,0x5F6A,0x6153,0x6753,0x6A19,0x6F02,0x74E2, + 0x7968,0x8868,0x8C79,0x98C7,0x98C4,0x9A43, + /* Range 0x7921 - 0x797E, array index: 0x1F67 */ + 0x54C1,0x7A1F,0x6953,0x8AF7,0x8C4A,0x98A8,0x99AE,0x5F7C, + 0x62AB,0x75B2,0x76AE,0x88AB,0x907F,0x9642,0x5339,0x5F3C, + 0x5FC5,0x6CCC,0x73CC,0x7562,0x758B,0x7B46,0x82FE,0x999D, + 0x4E4F,0x903C,0x4E0B,0x4F55,0x53A6,0x590F,0x5EC8,0x6630, + 0x6CB3,0x7455,0x8377,0x8766,0x8CC0,0x9050,0x971E,0x9C15, + 0x58D1,0x5B78,0x8650,0x8B14,0x9DB4,0x5BD2,0x6068,0x608D, + 0x65F1,0x6C57,0x6F22,0x6FA3,0x701A,0x7F55,0x7FF0,0x9591, + 0x9592,0x9650,0x97D3,0x5272,0x8F44,0x51FD,0x542B,0x54B8, + 0x5563,0x558A,0x6ABB,0x6DB5,0x7DD8,0x8266,0x929C,0x9677, + 0x9E79,0x5408,0x54C8,0x76D2,0x86E4,0x95A4,0x95D4,0x965C, + 0x4EA2,0x4F09,0x59EE,0x5AE6,0x5DF7,0x6052,0x6297,0x676D, + 0x6841,0x6C86,0x6E2F,0x7F38,0x809B,0x822A, + /* Range 0x7A21 - 0x7A7E, array index: 0x1FC5 */ + 0xFA08,0xFA09,0x9805,0x4EA5,0x5055,0x54B3,0x5793,0x595A, + 0x5B69,0x5BB3,0x61C8,0x6977,0x6D77,0x7023,0x87F9,0x89E3, + 0x8A72,0x8AE7,0x9082,0x99ED,0x9AB8,0x52BE,0x6838,0x5016, + 0x5E78,0x674F,0x8347,0x884C,0x4EAB,0x5411,0x56AE,0x73E6, + 0x9115,0x97FF,0x9909,0x9957,0x9999,0x5653,0x589F,0x865B, + 0x8A31,0x61B2,0x6AF6,0x737B,0x8ED2,0x6B47,0x96AA,0x9A57, + 0x5955,0x7200,0x8D6B,0x9769,0x4FD4,0x5CF4,0x5F26,0x61F8, + 0x665B,0x6CEB,0x70AB,0x7384,0x73B9,0x73FE,0x7729,0x774D, + 0x7D43,0x7D62,0x7E23,0x8237,0x8852,0xFA0A,0x8CE2,0x9249, + 0x986F,0x5B51,0x7A74,0x8840,0x9801,0x5ACC,0x4FE0,0x5354, + 0x593E,0x5CFD,0x633E,0x6D79,0x72F9,0x8105,0x8107,0x83A2, + 0x92CF,0x9830,0x4EA8,0x5144,0x5211,0x578B, + /* Range 0x7B21 - 0x7B7E, array index: 0x2023 */ + 0x5F62,0x6CC2,0x6ECE,0x7005,0x7050,0x70AF,0x7192,0x73E9, + 0x7469,0x834A,0x87A2,0x8861,0x9008,0x90A2,0x93A3,0x99A8, + 0x516E,0x5F57,0x60E0,0x6167,0x66B3,0x8559,0x8E4A,0x91AF, + 0x978B,0x4E4E,0x4E92,0x547C,0x58D5,0x58FA,0x597D,0x5CB5, + 0x5F27,0x6236,0x6248,0x660A,0x6667,0x6BEB,0x6D69,0x6DCF, + 0x6E56,0x6EF8,0x6F94,0x6FE0,0x6FE9,0x705D,0x72D0,0x7425, + 0x745A,0x74E0,0x7693,0x795C,0x7CCA,0x7E1E,0x80E1,0x82A6, + 0x846B,0x84BF,0x864E,0x865F,0x8774,0x8B77,0x8C6A,0x93AC, + 0x9800,0x9865,0x60D1,0x6216,0x9177,0x5A5A,0x660F,0x6DF7, + 0x6E3E,0x743F,0x9B42,0x5FFD,0x60DA,0x7B0F,0x54C4,0x5F18, + 0x6C5E,0x6CD3,0x6D2A,0x70D8,0x7D05,0x8679,0x8A0C,0x9D3B, + 0x5316,0x548C,0x5B05,0x6A3A,0x706B,0x7575, + /* Range 0x7C21 - 0x7C7E, array index: 0x2081 */ + 0x798D,0x79BE,0x82B1,0x83EF,0x8A71,0x8B41,0x8CA8,0x9774, + 0xFA0B,0x64F4,0x652B,0x78BA,0x78BB,0x7A6B,0x4E38,0x559A, + 0x5950,0x5BA6,0x5E7B,0x60A3,0x63DB,0x6B61,0x6665,0x6853, + 0x6E19,0x7165,0x74B0,0x7D08,0x9084,0x9A69,0x9C25,0x6D3B, + 0x6ED1,0x733E,0x8C41,0x95CA,0x51F0,0x5E4C,0x5FA8,0x604D, + 0x60F6,0x6130,0x614C,0x6643,0x6644,0x69A5,0x6CC1,0x6E5F, + 0x6EC9,0x6F62,0x714C,0x749C,0x7687,0x7BC1,0x7C27,0x8352, + 0x8757,0x9051,0x968D,0x9EC3,0x532F,0x56DE,0x5EFB,0x5F8A, + 0x6062,0x6094,0x61F7,0x6666,0x6703,0x6A9C,0x6DEE,0x6FAE, + 0x7070,0x736A,0x7E6A,0x81BE,0x8334,0x86D4,0x8AA8,0x8CC4, + 0x5283,0x7372,0x5B96,0x6A6B,0x9404,0x54EE,0x5686,0x5B5D, + 0x6548,0x6585,0x66C9,0x689F,0x6D8D,0x6DC6, + /* Range 0x7D21 - 0x7D7E, array index: 0x20DF */ + 0x723B,0x80B4,0x9175,0x9A4D,0x4FAF,0x5019,0x539A,0x540E, + 0x543C,0x5589,0x55C5,0x5E3F,0x5F8C,0x673D,0x7166,0x73DD, + 0x9005,0x52DB,0x52F3,0x5864,0x58CE,0x7104,0x718F,0x71FB, + 0x85B0,0x8A13,0x6688,0x85A8,0x55A7,0x6684,0x714A,0x8431, + 0x5349,0x5599,0x6BC1,0x5F59,0x5FBD,0x63EE,0x6689,0x7147, + 0x8AF1,0x8F1D,0x9EBE,0x4F11,0x643A,0x70CB,0x7566,0x8667, + 0x6064,0x8B4E,0x9DF8,0x5147,0x51F6,0x5308,0x6D36,0x80F8, + 0x9ED1,0x6615,0x6B23,0x7098,0x75D5,0x5403,0x5C79,0x7D07, + 0x8A16,0x6B20,0x6B3D,0x6B46,0x5438,0x6070,0x6D3D,0x7FD5, + 0x8208,0x50D6,0x51DE,0x559C,0x566B,0x56CD,0x59EC,0x5B09, + 0x5E0C,0x6199,0x6198,0x6231,0x665E,0x66E6,0x7199,0x71B9, + 0x71BA,0x72A7,0x79A7,0x7A00,0x7FB2,0x8A70, + /* Unranged codes (93 codes) */ +}; + +#endif /* ICONV_TO_UCS_CCS_KSX1001 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> ksx1001 speed-optimized table (74752 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_KSX1001) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_speed_ksx1001[] = +{ + /* Heading Block */ + 0x0100,0x0200,0x0300,0x0400,0x0500,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0600,0x0700,0x0800,0x0900,0x0A00,0x0B00,0x0C00,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + 0x0D00,0x0E00,0x0F00,0x1000,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,0x1100,0x1200, + 0x1300,0x1400,0x1500,0x1600,0x1700,0x1800,0x1900,0x1A00, + 0x1B00,0x1C00,0x1D00,0x1E00,0x1F00,0x2000,0x2100,0x2200, + 0x2300,0x2400,0x2500,0x2600,0x2700,0x2800,0x2900,0x2A00, + 0x2B00,0x2C00,0x2D00,0x2E00,0x2F00,0x3000,0x3100,0x3200, + 0x3300,0x3400,0x3500,0x3600,0x3700,0x3800,0x3900,0x3A00, + 0x3B00,0x3C00,0x3D00,0x3E00,0x3F00,0x4000,0x4100,0x4200, + 0x4300,0x4400,0x4500,0x4600,0x4700,0x4800,0x4900,0x4A00, + 0x4B00,0x4C00,0x4D00,0x4E00,0x4F00,0x5000,0x5100,0x5200, + 0x5300,0x5400,0x5500,0x5600,0x5700,0x5800,0x5900,0x5A00, + 0x5B00,0x5C00,0x5D00,0x5E00,0x5F00,0x6000,0x6100,0x6200, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,0x6300,0x6400,0x6500,0x6600, + 0x6700,0x6800,0x6900,0x6A00,0x6B00,0x6C00,0x6D00,0x6E00, + 0x6F00,0x7000,0x7100,0x7200,0x7300,0x7400,0x7500,0x7600, + 0x7700,0x7800,0x7900,0x7A00,0x7B00,0x7C00,0x7D00,0x7E00, + 0x7F00,0x8000,0x8100,0x8200,0x8300,0x8400,0x8500,0x8600, + 0x8700,0x8800,0x8900,0x8A00,0x8B00,0x8C00,0x8D00,0x8E00, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK,INVBLK, + INVBLK,0x8F00,0x9000,INVBLK,INVBLK,INVBLK,INVBLK,0x9100, + /* Block 1, Array index 0x0100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x222E,INVALC,INVALC,0x2234,INVALC,INVALC,0x2157, + 0x2127,INVALC,0x2823,INVALC,INVALC,0x2129,INVALC,INVALC, + 0x2146,0x213E,0x2977,0x2978,0x2225,INVALC,0x2252,0x2124, + 0x222C,0x2976,0x282C,INVALC,0x2879,0x2876,0x287A,0x222F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2821,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2822,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x213F, + 0x282A,INVALC,INVALC,INVALC,INVALC,INVALC,0x282D,0x292C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2921,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2923,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2140, + 0x292A,INVALC,INVALC,INVALC,INVALC,INVALC,0x292D,INVALC, + /* Block 2, Array index 0x0200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2922,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2824,0x2924, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2925,0x2826,0x2926,INVALC,INVALC,INVALC,INVALC, + 0x2927,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2828, + 0x2928,0x2829,0x2929,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2930,0x282F,0x292F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x282B,0x292B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x282E,0x292E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 3, Array index 0x0300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x2227, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2230,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2228,0x222B,0x222A,0x222D,INVALC,0x2229,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 4, Array index 0x0400 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547, + 0x2548,0x2549,0x254A,0x254B,0x254C,0x254D,0x254E,0x254F, + 0x2550,0x2551,INVALC,0x2552,0x2553,0x2554,0x2555,0x2556, + 0x2557,0x2558,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567, + 0x2568,0x2569,0x256A,0x256B,0x256C,0x256D,0x256E,0x256F, + 0x2570,0x2571,INVALC,0x2572,0x2573,0x2574,0x2575,0x2576, + 0x2577,0x2578,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 5, Array index 0x0500 */ + INVALC,0x2C27,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2C21,0x2C22,0x2C23,0x2C24,0x2C25,0x2C26,0x2C28,0x2C29, + 0x2C2A,0x2C2B,0x2C2C,0x2C2D,0x2C2E,0x2C2F,0x2C30,0x2C31, + 0x2C32,0x2C33,0x2C34,0x2C35,0x2C36,0x2C37,0x2C38,0x2C39, + 0x2C3A,0x2C3B,0x2C3C,0x2C3D,0x2C3E,0x2C3F,0x2C40,0x2C41, + 0x2C51,0x2C52,0x2C53,0x2C54,0x2C55,0x2C56,0x2C58,0x2C59, + 0x2C5A,0x2C5B,0x2C5C,0x2C5D,0x2C5E,0x2C5F,0x2C60,0x2C61, + 0x2C62,0x2C63,0x2C64,0x2C65,0x2C66,0x2C67,0x2C68,0x2C69, + 0x2C6A,0x2C6B,0x2C6C,0x2C6D,0x2C6E,0x2C6F,0x2C70,0x2C71, + INVALC,0x2C57,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 33, Array index 0x0600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x212A,INVALC,INVALC, + 0x212E,0x212F,INVALC,INVALC,0x2130,0x2131,INVALC,INVALC, + 0x2253,0x2254,INVALC,INVALC,INVALC,0x2125,0x2126,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2236,INVALC,0x2147,0x2148,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2158,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2979,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x297A, + INVALC,0x297B,0x297C,0x297D,0x297E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 34, Array index 0x0700 */ + INVALC,INVALC,INVALC,0x2149,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2235,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2724,INVALC,INVALC,0x2260,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2265,0x2262,INVALC,INVALC,INVALC,0x2759,INVALC, + INVALC,INVALC,INVALC,0x214A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x2877,0x2878,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x287B,0x287C,0x287D,0x287E,INVALC, + 0x2530,0x2531,0x2532,0x2533,0x2534,0x2535,0x2536,0x2537, + 0x2538,0x2539,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, + 0x2529,0x252A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2167,0x2168,0x2166,0x2169,0x216A,0x2255,0x2258,0x2256, + 0x2259,0x2257,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2221,INVALC,0x2222,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 35, Array index 0x0800 */ + 0x2223,INVALC,0x2153,0x2224,INVALC,INVALC,INVALC,0x2154, + 0x2174,INVALC,INVALC,0x2175,INVALC,INVALC,INVALC,0x2233, + INVALC,0x2232,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x216E,INVALC,INVALC,0x2170,0x2144,INVALC, + 0x2150,INVALC,INVALC,INVALC,INVALC,0x212B,INVALC,0x217C, + 0x217D,0x217B,0x217A,0x2172,0x2173,INVALC,0x2231,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2145,0x2171,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x212D,0x216F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2156,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2141,0x2155,INVALC,INVALC,0x2142,0x2143,INVALC,INVALC, + INVALC,INVALC,0x216C,0x216D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2178,0x2179,INVALC,INVALC,0x2176,0x2177, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2241,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x2151,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 36, Array index 0x0900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2152,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 37, Array index 0x0A00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2867,0x2868,0x2869,0x286A,0x286B,0x286C,0x286D,0x286E, + 0x286F,0x2870,0x2871,0x2872,0x2873,0x2874,0x2875,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2967,0x2968,0x2969,0x296A, + 0x296B,0x296C,0x296D,0x296E,0x296F,0x2970,0x2971,0x2972, + 0x2973,0x2974,0x2975,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x294D,0x294E,0x294F,0x2950, + 0x2951,0x2952,0x2953,0x2954,0x2955,0x2956,0x2957,0x2958, + 0x2959,0x295A,0x295B,0x295C,0x295D,0x295E,0x295F,0x2960, + 0x2961,0x2962,0x2963,0x2964,0x2965,0x2966,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x284D,0x284E,0x284F,0x2850,0x2851,0x2852,0x2853,0x2854, + 0x2855,0x2856,0x2857,0x2858,0x2859,0x285A,0x285B,0x285C, + 0x285D,0x285E,0x285F,0x2860,0x2861,0x2862,0x2863,0x2864, + 0x2865,0x2866,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 38, Array index 0x0B00 */ + 0x2621,0x262C,0x2622,0x262D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2623,0x2648,0x2647,0x262E, + 0x2624,0x2642,0x2641,0x262F,0x2626,0x2646,0x2645,0x2631, + 0x2625,0x2644,0x2643,0x2630,0x2627,0x263C,0x2649,0x264A, + 0x2637,0x264B,0x264C,0x2632,0x2629,0x263E,0x264D,0x264E, + 0x2639,0x264F,0x2650,0x2634,0x2628,0x2651,0x2652,0x2638, + 0x263D,0x2653,0x2654,0x2633,0x262A,0x2655,0x2656,0x263A, + 0x263F,0x2657,0x2658,0x2635,0x262B,0x2659,0x265A,0x263B, + 0x265B,0x265C,0x2640,0x265D,0x265E,0x265F,0x2660,0x2661, + 0x2662,0x2663,0x2664,0x2636,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2246,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2161,0x2160,INVALC,0x2243,0x2247,0x2248,0x224B,0x224A, + 0x2249,0x224C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x2163,0x2162,INVALC,INVALC,0x223A,0x2239, + INVALC,INVALC,INVALC,INVALC,0x2165,0x2164,INVALC,INVALC, + 0x2238,0x2237,INVALC,INVALC,INVALC,INVALC,0x215F,0x215E, + 0x2242,INVALC,INVALC,0x215B,INVALC,INVALC,0x215D,0x215C, + 0x2244,0x2245,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 39, Array index 0x0C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x215A,0x2159,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x224F,0x224E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x2250,INVALC,0x2251,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x214F,INVALC,0x214E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x223C,0x223D,INVALC,0x2240,0x223B,0x223E,INVALC,0x223F, + 0x224D,0x225B,0x225C,INVALC,0x225D,0x225A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 49, Array index 0x0D00 */ + 0x2121,0x2122,0x2123,0x2128,INVALC,INVALC,INVALC,INVALC, + 0x2134,0x2135,0x2136,0x2137,0x2138,0x2139,0x213A,0x213B, + 0x213C,0x213D,INVALC,0x216B,0x2132,0x2133,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2A21,0x2A22,0x2A23,0x2A24,0x2A25,0x2A26,0x2A27, + 0x2A28,0x2A29,0x2A2A,0x2A2B,0x2A2C,0x2A2D,0x2A2E,0x2A2F, + 0x2A30,0x2A31,0x2A32,0x2A33,0x2A34,0x2A35,0x2A36,0x2A37, + 0x2A38,0x2A39,0x2A3A,0x2A3B,0x2A3C,0x2A3D,0x2A3E,0x2A3F, + 0x2A40,0x2A41,0x2A42,0x2A43,0x2A44,0x2A45,0x2A46,0x2A47, + 0x2A48,0x2A49,0x2A4A,0x2A4B,0x2A4C,0x2A4D,0x2A4E,0x2A4F, + 0x2A50,0x2A51,0x2A52,0x2A53,0x2A54,0x2A55,0x2A56,0x2A57, + 0x2A58,0x2A59,0x2A5A,0x2A5B,0x2A5C,0x2A5D,0x2A5E,0x2A5F, + 0x2A60,0x2A61,0x2A62,0x2A63,0x2A64,0x2A65,0x2A66,0x2A67, + 0x2A68,0x2A69,0x2A6A,0x2A6B,0x2A6C,0x2A6D,0x2A6E,0x2A6F, + 0x2A70,0x2A71,0x2A72,0x2A73,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2B21,0x2B22,0x2B23,0x2B24,0x2B25,0x2B26,0x2B27, + 0x2B28,0x2B29,0x2B2A,0x2B2B,0x2B2C,0x2B2D,0x2B2E,0x2B2F, + 0x2B30,0x2B31,0x2B32,0x2B33,0x2B34,0x2B35,0x2B36,0x2B37, + 0x2B38,0x2B39,0x2B3A,0x2B3B,0x2B3C,0x2B3D,0x2B3E,0x2B3F, + 0x2B40,0x2B41,0x2B42,0x2B43,0x2B44,0x2B45,0x2B46,0x2B47, + 0x2B48,0x2B49,0x2B4A,0x2B4B,0x2B4C,0x2B4D,0x2B4E,0x2B4F, + 0x2B50,0x2B51,0x2B52,0x2B53,0x2B54,0x2B55,0x2B56,0x2B57, + 0x2B58,0x2B59,0x2B5A,0x2B5B,0x2B5C,0x2B5D,0x2B5E,0x2B5F, + 0x2B60,0x2B61,0x2B62,0x2B63,0x2B64,0x2B65,0x2B66,0x2B67, + 0x2B68,0x2B69,0x2B6A,0x2B6B,0x2B6C,0x2B6D,0x2B6E,0x2B6F, + 0x2B70,0x2B71,0x2B72,0x2B73,0x2B74,0x2B75,0x2B76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 50, Array index 0x0E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427, + 0x2428,0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F, + 0x2430,0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437, + 0x2438,0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F, + 0x2440,0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447, + 0x2448,0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F, + 0x2450,0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457, + 0x2458,0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F, + 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, + 0x2468,0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F, + 0x2470,0x2471,0x2472,0x2473,0x2474,0x2475,0x2476,0x2477, + 0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 51, Array index 0x0F00 */ + 0x2931,0x2932,0x2933,0x2934,0x2935,0x2936,0x2937,0x2938, + 0x2939,0x293A,0x293B,0x293C,0x293D,0x293E,0x293F,0x2940, + 0x2941,0x2942,0x2943,0x2944,0x2945,0x2946,0x2947,0x2948, + 0x2949,0x294A,0x294B,0x294C,0x225F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838, + 0x2839,0x283A,0x283B,0x283C,0x283D,0x283E,0x283F,0x2840, + 0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848, + 0x2849,0x284A,0x284B,0x284C,INVALC,INVALC,INVALC,0x225E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 52, Array index 0x1000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x2749,0x274A,0x274B,0x274C,0x274D,INVALC,INVALC,INVALC, + 0x273A,0x273B,0x275C,0x275D,0x275E,0x2736,0x2737,0x2738, + 0x2754,0x2755,0x2756,0x2757,0x2758,0x2721,0x2722,0x2723, + 0x2725,0x272B,0x272C,0x272D,0x272E,0x272F,0x2730,0x2731, + 0x2732,0x2733,0x2734,0x2727,0x2728,0x2729,0x272A,0x273D, + 0x273E,0x2765,0x2766,0x2767,0x2768,0x2761,0x2762,0x2763, + 0x273F,0x2740,0x2741,0x2742,0x2743,0x2744,0x2745,0x2746, + 0x2747,0x2748,0x274E,0x274F,0x2750,0x2751,0x2752,0x2753, + 0x275A,0x275B,0x2263,0x276C,0x2726,0x2760,0x276F,0x2261, + 0x273C,0x276D,0x2735,INVALC,INVALC,INVALC,INVALC,0x2739, + 0x276A,INVALC,INVALC,0x276B,INVALC,INVALC,0x275F,INVALC, + 0x2264,INVALC,INVALC,0x2764,0x276E,0x2769,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 79, Array index 0x1100 */ + 0x6C69,0x6F4B,INVALC,0x7652,INVALC,INVALC,INVALC,0x5832, + 0x6D5B,0x5F32,0x5F3E,0x793B,INVALC,0x5C74,INVALC,INVALC, + INVALC,0x7564,INVALC,INVALC,0x7326,0x5D60,0x6126,INVALC, + 0x4E78,0x5C30,INVALC,INVALC,INVALC,INVALC,0x632A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7169,INVALC,INVALC, + INVALC,INVALC,0x4D7A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C2F,0x5321,INVALC,0x712B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6751,0x522C,INVALC,0x4E79,INVALC,INVALC, + INVALC,INVALC,INVALC,0x717D,INVALC,0x5E3F,0x7B3A,0x7939, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E52,INVALC, + 0x632B,0x6B60,INVALC,INVALC,INVALC,0x4E7A,0x4B77,0x6525, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A61,INVALC,0x544C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6A61,INVALC,INVALC,0x5C63,0x5F2D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B6B,INVALC, + INVALC,INVALC,0x552F,INVALC,INVALC,INVALC,0x5675,INVALC, + 0x6578,INVALC,INVALC,0x5E40,0x6C23,INVALC,0x694D,INVALC, + 0x6A27,0x6976,0x7B3B,INVALC,0x6769,0x6F4C,INVALC,INVALC, + 0x5066,INVALC,INVALC,0x5E41,INVALC,INVALC,0x642C,INVALC, + INVALC,0x584C,0x7971,INVALC,0x4E5F,0x7A24,0x6632,INVALC, + 0x7A7B,INVALC,INVALC,0x7A3D,0x4C48,0x6F4D,0x5555,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5322,INVALC, + INVALC,INVALC,0x6C51,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6427,0x6C52,INVALC,INVALC,0x7631,INVALC,INVALC,0x4E7B, + INVALC,INVALC,0x5051,0x4B3F,INVALC,0x6D24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6D28,0x5E42,0x7662,0x6D5C, + 0x5C75,0x6039,INVALC,INVALC,INVALC,0x544E,INVALC,0x7435, + INVALC,INVALC,INVALC,0x535B,0x5635,0x6C24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6466,INVALC,0x716A,INVALC,INVALC,INVALC,0x4B6C,0x4B40, + INVALC,INVALC,INVALC,0x6C72,INVALC,INVALC,INVALC,INVALC, + /* Block 80, Array index 0x1200 */ + INVALC,0x506A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7972,0x6C25,0x505F,INVALC,0x676A,0x506B,0x5C51, + 0x5B69,0x7D4C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B57, + INVALC,INVALC,INVALC,INVALC,0x5A61,INVALC,0x5636,INVALC, + 0x635F,INVALC,0x5E43,INVALC,0x5E44,0x4A21,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6E6C,INVALC,INVALC,0x5323,0x6E37, + 0x784F,INVALC,INVALC,INVALC,INVALC,0x6A48,0x6E38,0x712C, + 0x7125,0x694E,INVALC,INVALC,INVALC,0x793C,INVALC,INVALC, + INVALC,0x6579,0x6C6A,0x5D56,0x6D42,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7825,INVALC,INVALC,INVALC,INVALC,INVALC,0x653A, + 0x5B58,INVALC,INVALC,0x4A22,INVALC,INVALC,0x514D,INVALC, + INVALC,INVALC,0x6E6D,INVALC,INVALC,INVALC,0x6C6B,0x5E45, + INVALC,0x6360,INVALC,0x4A49,0x7269,INVALC,0x554E,INVALC, + 0x7636,INVALC,0x4E42,0x5647,INVALC,0x6334,INVALC,0x712D, + INVALC,0x6A62,INVALC,INVALC,INVALC,INVALC,0x5742,INVALC, + 0x7327,INVALC,INVALC,0x4D6A,INVALC,0x6B6E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5932,0x7D25, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7655,0x5562,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7835, + INVALC,INVALC,0x4C75,0x7535,0x642D,INVALC,INVALC,INVALC, + INVALC,0x676B,0x7155,INVALC,INVALC,INVALC,0x703B,INVALC, + INVALC,0x6935,INVALC,0x4C49,0x7A55,INVALC,INVALC,0x6154, + INVALC,INVALC,0x5756,INVALC,INVALC,0x5C41,INVALC,0x5E46, + 0x7A6F,0x6361,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6173,0x5C76, + INVALC,0x4E7C,INVALC,0x5B44,INVALC,0x7871,INVALC,INVALC, + 0x5C64,INVALC,0x656F,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 81, Array index 0x1300 */ + INVALC,INVALC,0x5C31,INVALC,INVALC,INVALC,0x5556,INVALC, + INVALC,0x735A,INVALC,0x4B41,INVALC,0x5B43,INVALC,INVALC, + INVALC,0x597A,0x536E,INVALC,INVALC,INVALC,0x7A38,INVALC, + INVALC,0x7D26,0x6B6F,INVALC,0x7426,INVALC,0x4C4A,0x7328, + INVALC,0x735B,INVALC,0x5B27,0x7637,INVALC,0x4F66,0x7072, + 0x4B5A,INVALC,0x6752,0x5743,0x7670,0x685E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6526,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6567,INVALC,INVALC,INVALC,0x4A23, + 0x4C27,0x6A49,INVALC,INVALC,INVALC,INVALC,INVALC,0x7836, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7A25,INVALC,INVALC, + INVALC,INVALC,0x712E,INVALC,0x6F4E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B6D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7630,0x6F4F,0x694F,INVALC, + 0x775E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E53,INVALC,INVALC,INVALC,INVALC,0x5C77,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5B28,INVALC,INVALC, + INVALC,0x4B78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F21,0x5D61,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x754A,0x6936,INVALC,INVALC, + INVALC,INVALC,0x676C,0x6E6E,INVALC,0x7370,INVALC,0x5F3F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C4B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5041,INVALC,INVALC, + INVALC,0x7452,0x603A,INVALC,INVALC,INVALC,INVALC,0x5F40, + INVALC,0x4E60,INVALC,INVALC,INVALC,0x5C52,0x7D6A,INVALC, + INVALC,INVALC,0x5676,INVALC,INVALC,INVALC,0x6A4A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6869,INVALC,0x632C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7350,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A24,INVALC,0x5B78,INVALC,INVALC,INVALC,0x5E47, + /* Block 82, Array index 0x1400 */ + 0x6B70,0x7156,INVALC,INVALC,0x6562,INVALC,0x4C4C,INVALC, + INVALC,0x4B7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F41, + INVALC,0x566D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6950,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6E39,INVALC,INVALC,INVALC,INVALC,0x5563, + INVALC,INVALC,0x5153,INVALC,0x6570,INVALC,INVALC,INVALC, + 0x6834,0x6B43,INVALC,0x6A2A,0x7A7C,0x7576,0x703C,0x7D54, + 0x603B,0x4E43,INVALC,0x503A,0x773A,0x5873,0x774D,INVALC, + INVALC,INVALC,0x642E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x545F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5067,INVALC,INVALC,0x6C7D,INVALC,0x522E, + 0x6E6F,0x5557,0x6A64,0x7822,0x4D6B,0x573F,0x7B31,INVALC, + INVALC,0x4D6C,INVALC,INVALC,INVALC,0x5C32,0x506C,0x4E7D, + 0x6E70,INVALC,INVALC,INVALC,0x4C42,INVALC,INVALC,INVALC, + 0x506D,INVALC,INVALC,INVALC,INVALC,INVALC,0x6577,INVALC, + INVALC,INVALC,0x737C,INVALC,INVALC,0x6E22,INVALC,INVALC, + INVALC,INVALC,0x5933,INVALC,INVALC,0x5874,INVALC,0x6937, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E2E,INVALC,INVALC,INVALC,INVALC,0x5922,INVALC,INVALC, + INVALC,INVALC,0x5871,INVALC,0x544F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6527,0x5552, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5629,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7422,INVALC,0x7157,INVALC, + INVALC,0x5558,INVALC,0x703D,0x5750,0x5450,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x574F,0x6B6A,0x7D6B,INVALC, + INVALC,0x5B6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C45,0x4B42,INVALC,INVALC,INVALC,INVALC,0x7D55,INVALC, + 0x7448,0x686A,0x7573,INVALC,INVALC,0x795E,INVALC,INVALC, + /* Block 83, Array index 0x1500 */ + 0x536F,INVALC,INVALC,0x6C53,INVALC,INVALC,0x5D42,0x6F37, + 0x6754,INVALC,0x4A4A,INVALC,INVALC,INVALC,0x597B,INVALC, + INVALC,0x7A7D,INVALC,INVALC,INVALC,INVALC,INVALC,0x562A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7478,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7777,0x5C2C,INVALC,INVALC, + INVALC,0x5757,0x5F22,INVALC,INVALC,INVALC,0x4E3E,INVALC, + 0x5370,INVALC,INVALC,INVALC,INVALC,INVALC,0x7024,0x616C, + 0x4F67,0x734B,0x6D29,0x4A3E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x746F,INVALC,INVALC,INVALC,0x764E, + INVALC,INVALC,0x5E7B,0x503B,0x5537,0x6E71,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7428,INVALC,0x5C78,INVALC, + INVALC,INVALC,INVALC,0x4B27,INVALC,0x5A4E,INVALC,INVALC, + INVALC,0x6066,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D25,0x6E72,INVALC,INVALC,INVALC,INVALC,0x5C79, + INVALC,INVALC,0x795C,INVALC,INVALC,0x735C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7872,INVALC,0x7479, + INVALC,INVALC,INVALC,0x7C71,INVALC,INVALC,INVALC,0x503C, + 0x5B79,0x5731,INVALC,INVALC,INVALC,0x4B7C,INVALC,INVALC, + INVALC,0x7025,0x4B7D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5574,INVALC,INVALC,INVALC,0x4D6D, + 0x4A25,INVALC,INVALC,0x562B,0x5042,INVALC,INVALC,INVALC, + INVALC,0x703E,0x523D,0x4C24,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A36,INVALC, + INVALC,0x4C4D,INVALC,0x5A7A,INVALC,0x764F,INVALC,0x6938, + INVALC,0x5875,INVALC,INVALC,INVALC,0x4C4E,INVALC,INVALC, + INVALC,INVALC,0x574D,INVALC,INVALC,0x5451,0x696D,INVALC, + 0x4A6B,0x5962,INVALC,0x7D32,INVALC,0x632D,0x564C,0x5934, + INVALC,INVALC,0x6127,0x6E53,0x5043,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7D33,INVALC,0x5564,INVALC,INVALC, + 0x4F68,INVALC,0x6D43,0x5032,INVALC,INVALC,0x4E7E,0x5A28, + /* Block 84, Array index 0x1600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x7850,INVALC,INVALC, + 0x7D56,INVALC,INVALC,INVALC,INVALC,0x7851,INVALC,0x7852, + 0x5C53,INVALC,INVALC,INVALC,INVALC,0x5D62,0x7B79,0x5D41, + INVALC,0x6335,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D5D,0x4E44,INVALC,0x4B21,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D63,INVALC,INVALC,INVALC,INVALC,0x7C5D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x792F,INVALC,INVALC,INVALC,INVALC,INVALC,0x527B, + 0x4F21,0x6428,INVALC,0x7436,0x6C7E,INVALC,INVALC,0x632E, + 0x676D,0x7D41,0x5A62,INVALC,INVALC,0x5833,INVALC,INVALC, + INVALC,0x5D64,0x706F,0x7671,0x7A70,INVALC,INVALC,0x5175, + INVALC,INVALC,0x5A4F,INVALC,0x5C54,INVALC,0x5C26,INVALC, + 0x6F3F,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E4F,INVALC, + 0x6059,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5956, + 0x6C54,0x6A4B,INVALC,INVALC,0x4A3F,0x5530,INVALC,0x4F69, + INVALC,INVALC,INVALC,INVALC,INVALC,0x716D,INVALC,0x4C4F, + INVALC,INVALC,INVALC,INVALC,0x6478,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x646D,INVALC,INVALC,INVALC,INVALC, + 0x5758,INVALC,0x7D27,INVALC,INVALC,INVALC,INVALC,0x6A2B, + 0x7632,INVALC,INVALC,INVALC,INVALC,0x4F70,0x793D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6674,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B5B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7351,INVALC,INVALC,INVALC,INVALC, + 0x6951,0x7329,0x5060,0x6952,INVALC,0x5A63,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6252,INVALC,0x7622,0x6174, + INVALC,INVALC,INVALC,0x5A64,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6755,0x753F,0x4F22,0x4D2F,0x4F23,INVALC,INVALC, + INVALC,0x4D30,0x717E,0x5023,0x612F,0x7823,INVALC,0x4A26, + 0x773B,0x726A,0x5E48,0x6953,INVALC,INVALC,INVALC,INVALC, + 0x5E49,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 85, Array index 0x1700 */ + INVALC,INVALC,INVALC,0x7D5E,0x4A40,INVALC,INVALC,INVALC, + 0x796A,0x514E,0x6E54,INVALC,0x5452,0x5923,0x7D28,0x5759, + 0x774E,0x7A3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F56,INVALC,0x5770,INVALC,0x6B61, + 0x7845,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C7A,INVALC, + INVALC,0x5D43,INVALC,0x795F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x676F,INVALC,INVALC,INVALC,INVALC, + 0x7D65,0x7623,INVALC,0x597C,0x7D29,INVALC,0x676E,INVALC, + INVALC,INVALC,0x5565,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F50,INVALC,0x4D31,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7722,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7132,INVALC,0x7131,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D32,INVALC,0x5A2B,INVALC,0x4A27,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6362,0x7B3C,0x5924,INVALC,INVALC, + 0x6E3A,INVALC,INVALC,INVALC,INVALC,INVALC,0x7853,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7B7A,INVALC,0x4F24,INVALC, + 0x5C7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7663,INVALC,INVALC,INVALC, + 0x6D2A,INVALC,INVALC,0x7221,0x4E61,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A26,INVALC,INVALC,INVALC,INVALC, + 0x7960,INVALC,INVALC,INVALC,INVALC,0x6C56,INVALC,INVALC, + 0x646E,0x7921,INVALC,INVALC,0x7B6F,INVALC,INVALC,INVALC, + 0x796B,0x6E23,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A2C,INVALC,INVALC,INVALC,0x4A28,INVALC,INVALC, + 0x747A,INVALC,INVALC,INVALC,INVALC,0x4D56,0x7C76,INVALC, + INVALC,INVALC,0x7449,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7854,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 86, Array index 0x1800 */ + INVALC,INVALC,INVALC,INVALC,0x7826,INVALC,0x5E4A,0x7246, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x575A,INVALC, + 0x5350,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5845,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A66, + INVALC,0x735D,INVALC,INVALC,INVALC,0x645A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7664,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7672,INVALC,0x5F42,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x597D, + INVALC,INVALC,INVALC,0x4C76,INVALC,INVALC,0x533A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x642F,INVALC, + INVALC,INVALC,INVALC,0x7961,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7026,INVALC,INVALC,INVALC, + 0x4B53,INVALC,INVALC,INVALC,0x603C,INVALC,0x744A,0x547A, + INVALC,0x7D2A,0x7962,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7437,0x7D42,0x7C30,INVALC,0x7D6C,0x4A62,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D3D, + INVALC,0x6A67,0x5F43,0x5152,0x4E62,INVALC,0x5324,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7D2B,INVALC,0x5F60, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7247,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6770,INVALC,0x506E,INVALC,INVALC,0x732A, + INVALC,INVALC,INVALC,0x5E4B,0x7638,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6175,0x7133,INVALC, + /* Block 87, Array index 0x1900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7723,INVALC, + INVALC,0x4A29,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F25,INVALC,INVALC,0x5F44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6130, + INVALC,INVALC,0x703F,INVALC,0x7624,INVALC,0x6336,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A46,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x506F,INVALC,INVALC,0x7D6D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D44,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C77,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x663F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E2D,INVALC,0x7A3F,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6571,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6D44,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5225,INVALC,INVALC,0x7D6E,INVALC,INVALC, + INVALC,0x7536,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6176,0x5E4C,INVALC,INVALC,0x7C5E,INVALC, + 0x6C57,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5637,0x4D33,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 88, Array index 0x1A00 */ + INVALC,INVALC,INVALC,0x7855,0x6558,INVALC,INVALC,INVALC, + 0x4F6A,INVALC,INVALC,0x4F50,INVALC,0x6A4C,INVALC,INVALC, + INVALC,INVALC,0x6A2E,0x6A2D,INVALC,INVALC,0x5371,INVALC, + 0x5325,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x774F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E24,INVALC,INVALC,INVALC,INVALC,0x5024,INVALC,INVALC, + 0x7222,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5070,INVALC,INVALC,INVALC,INVALC, + 0x7223,INVALC,0x7778,INVALC,INVALC,INVALC,INVALC,0x5033, + INVALC,INVALC,0x5B29,INVALC,INVALC,0x533B,0x4A6C,INVALC, + 0x7126,0x4B55,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7767,INVALC,INVALC,0x4D5E,INVALC,0x7724,INVALC, + INVALC,INVALC,0x7840,INVALC,INVALC,INVALC,0x535D,INVALC, + 0x4C50,INVALC,INVALC,INVALC,INVALC,0x4F26,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7673,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6177,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x535C,INVALC,INVALC,0x7A7E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A27,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B59,INVALC,0x4F27,0x6A2F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x646F,INVALC,INVALC,INVALC,0x6939, + 0x7158,INVALC,INVALC,0x5858,INVALC,INVALC,0x6072,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6634, + 0x5C7C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7371,INVALC,INVALC,INVALC,0x6350,INVALC,INVALC,0x727B, + INVALC,0x5B46,0x5071,INVALC,0x5072,INVALC,INVALC,INVALC, + /* Block 89, Array index 0x1B00 */ + 0x4F5C,INVALC,0x5351,INVALC,INVALC,0x4C31,0x7758,INVALC, + 0x4B28,0x6B3C,0x643E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x745C,INVALC, + INVALC,0x5C42,INVALC,INVALC,0x7027,INVALC,INVALC,0x6640, + INVALC,INVALC,0x4A6D,INVALC,INVALC,INVALC,INVALC,0x686B, + 0x6568,0x5C43,INVALC,INVALC,0x6D5E,0x5372,INVALC,INVALC, + INVALC,INVALC,0x4C77,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E54,0x672B,INVALC,INVALC,INVALC,0x4B43, + INVALC,0x6131,INVALC,INVALC,0x7732,INVALC,INVALC,0x5373, + 0x5352,INVALC,0x7540,INVALC,INVALC,INVALC,0x5F5D,INVALC, + INVALC,0x6E73,0x6771,INVALC,0x7D34,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7248,INVALC,INVALC, + INVALC,0x7352,INVALC,INVALC,0x6E74,INVALC,0x6253,INVALC, + INVALC,INVALC,INVALC,0x4C51,INVALC,0x5F6A,INVALC,INVALC, + INVALC,0x693A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5957,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x754D,INVALC,0x7172,0x7A47, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5978,0x5442,INVALC,INVALC,INVALC,INVALC,0x7665,INVALC, + INVALC,INVALC,INVALC,0x5D45,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6772,0x6D5F,INVALC,INVALC,0x4A4B,INVALC, + INVALC,0x5B7A,INVALC,INVALC,INVALC,0x6835,INVALC,0x5326, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D35,INVALC, + INVALC,0x7949,INVALC,0x6462,INVALC,0x7B3D,INVALC,INVALC, + 0x5724,0x4E45,INVALC,INVALC,INVALC,INVALC,0x4E55,0x5666, + INVALC,INVALC,INVALC,INVALC,0x653D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E4D,0x6C73,INVALC,INVALC,0x6D60, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C6C,0x7B3E,0x5F6B,INVALC,0x6178,INVALC,INVALC, + /* Block 90, Array index 0x1C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x793E, + INVALC,INVALC,INVALC,INVALC,0x5073,0x602A,0x6862,INVALC, + INVALC,0x6254,0x527D,INVALC,0x6528,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5953,INVALC,INVALC,INVALC,INVALC,0x535E, + INVALC,0x7438,0x773C,0x5C7D,INVALC,0x686C,0x6467,INVALC, + INVALC,0x6377,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C28, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A71,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6572,INVALC,INVALC,0x5074, + 0x522F,0x5C65,INVALC,INVALC,INVALC,INVALC,0x5025,0x7134, + 0x7C31,0x4C78,INVALC,INVALC,0x5D46,0x7A51,INVALC,0x775F, + INVALC,INVALC,0x7A28,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E75,INVALC,0x5E4E,INVALC,INVALC,INVALC,INVALC,0x6773, + INVALC,INVALC,0x772C,0x6B44,0x6D61,0x602B,0x5D47,INVALC, + INVALC,INVALC,INVALC,0x5233,0x523F,INVALC,INVALC,INVALC, + 0x4A4C,INVALC,INVALC,INVALC,INVALC,0x7B3F,INVALC,INVALC, + INVALC,INVALC,0x657D,0x5D65,0x584D,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6C74,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5075,INVALC,INVALC,0x686D,0x5052, + INVALC,0x5958,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7666,INVALC,INVALC, + 0x5B2A,INVALC,INVALC,INVALC,0x7760,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5859,INVALC,0x7423,INVALC,INVALC,0x745D,INVALC, + INVALC,INVALC,INVALC,0x6F51,INVALC,INVALC,0x5935,INVALC, + INVALC,0x6D2B,INVALC,0x6337,INVALC,INVALC,INVALC,INVALC, + 0x6E3B,0x4D34,INVALC,0x6073,0x6A4D,INVALC,INVALC,INVALC, + INVALC,0x6C75,0x686E,INVALC,0x4B29,0x712F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A4D,INVALC, + 0x6C29,INVALC,0x726B,INVALC,0x7D6F,INVALC,0x7973,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6641,INVALC,INVALC,0x6C58,INVALC,INVALC,INVALC,0x6D2C, + /* Block 91, Array index 0x1D00 */ + INVALC,0x6A4E,INVALC,0x685F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5226,INVALC,INVALC,0x6774,0x5156,INVALC,INVALC,0x6642, + 0x6363,INVALC,INVALC,INVALC,INVALC,0x6430,INVALC,INVALC, + INVALC,0x5834,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7625,INVALC, + INVALC,INVALC,INVALC,INVALC,0x735E,INVALC,INVALC,INVALC, + INVALC,0x5725,INVALC,INVALC,INVALC,INVALC,0x7768,INVALC, + INVALC,0x6846,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B66,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D66,INVALC,INVALC,INVALC,0x5C7E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x585A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A2C,0x6A30,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6338,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A2A,0x6179,INVALC,0x6A31,INVALC,INVALC,INVALC, + INVALC,0x726C,INVALC,INVALC,0x7A6E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E55,INVALC,INVALC,INVALC,INVALC,0x7974,INVALC, + INVALC,0x526C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 92, Array index 0x1E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B7B,INVALC,INVALC, + INVALC,0x7D70,INVALC,0x603D,0x4E63,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7846,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5E2E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F45,INVALC,INVALC,0x653E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D2D,0x7A6A,INVALC,INVALC,0x4D6E,0x6D26,INVALC,0x6D2E, + 0x706D,INVALC,0x5D21,INVALC,0x6D2F,0x7C78,INVALC,0x586B, + INVALC,INVALC,INVALC,0x4C79,0x4D35,INVALC,INVALC,INVALC, + INVALC,0x7A29,INVALC,0x615D,INVALC,INVALC,INVALC,INVALC, + 0x6255,0x6D4F,INVALC,INVALC,INVALC,0x5D22,INVALC,INVALC, + 0x794A,INVALC,0x6A68,INVALC,0x656D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x536B,INVALC,0x6954, + 0x617A,0x644C,INVALC,0x6164,0x6847,INVALC,INVALC,0x4E5B, + INVALC,INVALC,INVALC,0x5C55,INVALC,0x7735,0x7C73,0x7073, + 0x4E2F,0x7135,0x6F52,0x6848,0x6B71,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B54,0x603E,0x6378,0x6A69,0x7C32,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6074,INVALC,0x4F60,INVALC, + 0x6E25,INVALC,INVALC,0x7A2A,0x6643,0x6132,0x4A2B,INVALC, + 0x6364,0x693B,INVALC,INVALC,INVALC,INVALC,INVALC,0x6256, + 0x7372,INVALC,0x6E56,0x6A32,0x5076,0x6C59,0x5A4B,0x4F28, + INVALC,INVALC,INVALC,INVALC,0x5D23,INVALC,INVALC,INVALC, + 0x585B,INVALC,0x794E,0x6955,0x6351,INVALC,INVALC,0x523C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x582C,0x734C, + INVALC,0x4D7B,0x7656,INVALC,0x6775,0x686F,0x6379,0x523B, + 0x7373,0x637B,INVALC,0x5E50,0x4E30,INVALC,0x5677,0x7159, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7541,0x5C44,INVALC, + 0x753B,INVALC,0x5E51,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 93, Array index 0x1F00 */ + INVALC,0x5C66,INVALC,INVALC,0x5E52,INVALC,INVALC,0x6D62, + 0x6E76,0x6A4F,0x706E,0x637C,INVALC,0x535F,0x5374,0x6133, + INVALC,0x6134,INVALC,INVALC,INVALC,INVALC,0x7453,INVALC, + INVALC,0x5F46,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6956,INVALC,INVALC,INVALC, + 0x5B2B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7626,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6339,0x6B45,0x7429,0x4D36,0x5279,INVALC,0x5A2D,0x5263, + 0x4F51,INVALC,INVALC,INVALC,INVALC,0x4B5C,0x4C7A,INVALC, + 0x4F5D,INVALC,INVALC,0x6829,INVALC,0x633B,0x633A,INVALC, + INVALC,0x605A,INVALC,INVALC,INVALC,0x6E77,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C33,INVALC,INVALC,INVALC,INVALC, + 0x5375,INVALC,0x5726,INVALC,0x7635,0x575B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6155,INVALC,INVALC,0x546A, + INVALC,0x5F23,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D5F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5077,0x6D54,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4B2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x645B,INVALC,0x617B,0x4B22,INVALC,INVALC,INVALC, + INVALC,0x5360,INVALC,0x643F,INVALC,0x7B40,INVALC,0x5A3E, + 0x644D,INVALC,0x5639,INVALC,INVALC,INVALC,0x6F40,INVALC, + 0x617C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7639,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F47,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6431,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C67, + 0x5C68,INVALC,INVALC,INVALC,0x7A56,INVALC,0x5376,INVALC, + INVALC,INVALC,INVALC,0x715A,INVALC,0x7A72,INVALC,INVALC, + /* Block 94, Array index 0x2000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x627D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x554F,0x5078,INVALC, + INVALC,0x4D5F,INVALC,INVALC,0x754B,INVALC,0x6470,0x4B2B, + INVALC,0x5744,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x627E, + INVALC,0x5D5A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A2E,0x4A6E,INVALC,INVALC,INVALC, + 0x5539,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6321,INVALC,INVALC,0x6863,INVALC,INVALC,0x732B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F29, + INVALC,INVALC,INVALC,0x5377,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5471,INVALC,INVALC, + 0x4E64,INVALC,0x6872,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6575,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x672E,INVALC,0x563A,INVALC,0x5F6C,0x6440,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6864,INVALC,INVALC, + INVALC,INVALC,0x5835,INVALC,INVALC,INVALC,0x645C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7439,0x7136,INVALC, + INVALC,0x625E,0x6135,INVALC,INVALC,0x4D6F,0x7127,0x4E65, + 0x4B5D,INVALC,INVALC,0x5963,INVALC,INVALC,0x732C,INVALC, + INVALC,0x5079,0x6C2B,0x5E53,0x7769,INVALC,INVALC,0x7975, + INVALC,INVALC,INVALC,INVALC,INVALC,0x615E,0x4B6E,INVALC, + /* Block 95, Array index 0x2100 */ + INVALC,INVALC,0x633C,0x7856,INVALC,INVALC,0x5B6E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7D71,INVALC,INVALC,INVALC, + INVALC,0x7736,INVALC,INVALC,INVALC,INVALC,0x745E,INVALC, + INVALC,0x726D,INVALC,0x5B59,INVALC,0x7028,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x617D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E54,INVALC,0x602C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D63,INVALC,INVALC,0x5361,INVALC, + 0x5F48,INVALC,INVALC,INVALC,INVALC,0x5936,INVALC,0x7D2C, + 0x6F53,INVALC,INVALC,INVALC,0x6441,0x786B,INVALC,0x5B2C, + INVALC,INVALC,INVALC,INVALC,0x7C46,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x582D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x763A, + INVALC,0x5B5F,0x5353,0x7847,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A4E,0x7841,0x5234,INVALC,INVALC,0x5C34, + 0x7A39,0x4A4F,INVALC,0x7C33,0x6A6A,0x6A6B,0x507A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6D64,INVALC,INVALC,0x5D67, + INVALC,INVALC,0x5F49,INVALC,INVALC,INVALC,INVALC,0x5F6D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6E3C,INVALC,0x6F41, + INVALC,INVALC,0x4C52,INVALC,0x5D24,INVALC,INVALC,INVALC, + 0x5F4A,INVALC,INVALC,INVALC,INVALC,INVALC,0x5378,0x7128, + INVALC,INVALC,INVALC,0x4D37,INVALC,0x6F54,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x645D,0x5F6E,0x4B2C, + 0x693C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A6C,INVALC, + INVALC,INVALC,0x5F4B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x793F,0x562F,0x5546,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F2A,INVALC,INVALC,0x4E29,INVALC,INVALC,0x5678,INVALC, + INVALC,INVALC,0x7137,0x6E78,INVALC,INVALC,INVALC,0x5959, + 0x735F,INVALC,0x7848,0x4E46,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5566,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7466,INVALC,INVALC,0x6645,0x6F55, + INVALC,INVALC,0x4B6F,0x7C5F,INVALC,INVALC,INVALC,INVALC, + /* Block 96, Array index 0x2200 */ + INVALC,0x5C27,INVALC,INVALC,0x5667,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7849,INVALC,INVALC,INVALC,INVALC,0x6352, + INVALC,0x633D,INVALC,0x4F61,0x7040,0x6C5A,INVALC,0x5D57, + 0x7B70,INVALC,INVALC,0x6C2C,INVALC,INVALC,INVALC,0x7029, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A57,0x7B41, + INVALC,0x5240,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6530,INVALC,INVALC,INVALC,0x6D65,INVALC,INVALC, + INVALC,INVALC,0x4B2D,INVALC,0x7930,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7725,INVALC,0x4B2E,INVALC,0x5A2F,INVALC,0x5836,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5327,0x7B32, + INVALC,0x7D44,INVALC,0x6C2D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B21,INVALC,INVALC,INVALC,0x6569,0x696E, + INVALC,0x7374,0x7873,0x7041,0x5E2F,0x7830,INVALC,INVALC, + 0x7360,0x672F,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B2D, + INVALC,0x6635,INVALC,INVALC,0x7928,INVALC,INVALC,0x5D58, + 0x6859,0x6F56,INVALC,INVALC,INVALC,0x5362,INVALC,0x625F, + INVALC,INVALC,0x7C60,0x5748,0x7D2D,INVALC,INVALC,INVALC, + 0x5F6F,0x4C53,0x5379,INVALC,INVALC,INVALC,INVALC,0x5470, + 0x5B47,0x5E55,INVALC,INVALC,INVALC,INVALC,0x7074,INVALC, + 0x5550,0x6559,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C47,0x5C56,0x6260,INVALC,INVALC,INVALC,0x5A30,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7323,INVALC,0x536C, + INVALC,0x744B,INVALC,INVALC,INVALC,0x7D45,INVALC,INVALC, + INVALC,INVALC,INVALC,0x637D,INVALC,0x7931,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x507B,0x6C5B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x753C,0x7224, + 0x584E,0x584F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7577,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7661,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5237,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B6C,INVALC,0x5D48, + /* Block 97, Array index 0x2300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6468, + INVALC,INVALC,0x5241,INVALC,INVALC,INVALC,0x7857,INVALC, + INVALC,INVALC,INVALC,INVALC,0x563B,0x5E56,INVALC,INVALC, + 0x773D,0x6C2E,INVALC,INVALC,INVALC,0x5061,INVALC,0x6075, + 0x6A33,INVALC,0x4E56,INVALC,INVALC,INVALC,INVALC,0x4C25, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6C76,0x6261,0x633E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C48,INVALC,INVALC, + 0x4D70,INVALC,0x7976,INVALC,INVALC,0x5F70,INVALC,INVALC, + INVALC,0x653F,INVALC,INVALC,INVALC,0x4E3F,INVALC,INVALC, + INVALC,INVALC,0x7C61,0x6D30,0x7D51,0x763B,INVALC,INVALC, + 0x794F,0x6B5A,0x4A41,INVALC,0x5238,0x4D71,INVALC,0x6353, + 0x7D66,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x666D,INVALC,INVALC, + INVALC,0x637A,INVALC,INVALC,0x702A,0x7950,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7C62,INVALC,0x7827,INVALC, + INVALC,INVALC,0x6165,0x6E79,INVALC,INVALC,INVALC,0x6776, + 0x6A6D,INVALC,INVALC,0x7C34,0x7542,INVALC,INVALC,0x575C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7075,INVALC,0x5D68,0x536D,0x757C,INVALC,0x5A3F,INVALC, + 0x4C7B,INVALC,INVALC,INVALC,0x537A,0x7424,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F57,INVALC,0x5443, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B6D,INVALC,0x602D,INVALC,INVALC,0x6A6E, + 0x7B33,0x6442,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7667,0x525D,INVALC,0x5F4C,INVALC,INVALC,0x7C49,INVALC, + INVALC,0x6529,0x6076,0x7633,INVALC,INVALC,INVALC,INVALC, + /* Block 98, Array index 0x2400 */ + INVALC,0x617E,INVALC,INVALC,INVALC,INVALC,0x4B70,INVALC, + 0x6A6F,0x6A70,INVALC,INVALC,INVALC,0x5A40,0x7834,0x6B72, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6443,INVALC,INVALC, + INVALC,INVALC,0x6957,0x6471,INVALC,INVALC,INVALC,0x4A6F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E57, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C4A,INVALC,INVALC,INVALC,0x7361,INVALC,INVALC,0x4B44, + INVALC,INVALC,INVALC,INVALC,0x6365,INVALC,0x4B45,0x6A34, + INVALC,INVALC,0x693D,INVALC,0x5749,INVALC,INVALC,0x6B5B, + 0x6D31,INVALC,0x4C43,0x773E,0x7C4B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7874,INVALC,0x5937,INVALC,INVALC, + 0x7353,0x7354,INVALC,INVALC,INVALC,0x7764,INVALC,0x7751, + INVALC,INVALC,0x5837,0x4E31,0x4A42,INVALC,INVALC,0x7B34, + 0x4B46,INVALC,INVALC,0x7076,INVALC,INVALC,0x5567,INVALC, + 0x6A50,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C54,0x4B2F, + INVALC,INVALC,INVALC,INVALC,INVALC,0x742A,0x692F,INVALC, + INVALC,0x7543,0x6958,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D69,INVALC,INVALC,INVALC,0x7173,INVALC, + 0x557B,0x5E3B,INVALC,INVALC,0x747B,INVALC,INVALC,INVALC, + 0x7D73,0x7D72,0x7726,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D49,INVALC,INVALC,0x5453, + INVALC,0x4C28,INVALC,0x5A41,0x4C55,INVALC,0x5964,INVALC, + INVALC,INVALC,0x7A4A,INVALC,INVALC,INVALC,0x6563,INVALC, + INVALC,INVALC,0x533C,INVALC,INVALC,INVALC,0x4A70,INVALC, + INVALC,INVALC,INVALC,0x5044,INVALC,INVALC,INVALC,0x4A50, + 0x7A2B,0x6B6B,0x6778,0x5965,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5157,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7324,INVALC,INVALC,INVALC,0x547B,0x7C63, + 0x7A58,INVALC,0x7355,INVALC,0x4F2B,INVALC,INVALC,0x6B73, + /* Block 99, Array index 0x2500 */ + 0x557C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5354, + 0x4D7C,INVALC,0x5966,INVALC,0x6279,0x6221,0x6B54,INVALC, + 0x6077,0x6432,0x4C7C,INVALC,INVALC,INVALC,0x7B64,INVALC, + INVALC,INVALC,0x742B,INVALC,INVALC,INVALC,INVALC,0x503D, + INVALC,0x4A71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F38,INVALC,INVALC,INVALC,0x5740,INVALC, + 0x6E7A,0x7D74,INVALC,INVALC,0x5363,INVALC,0x7B42,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5568,0x5B2E, + 0x6136,0x7837,INVALC,INVALC,INVALC,INVALC,INVALC,0x603F, + 0x7B43,0x5D6A,INVALC,0x6222,INVALC,0x6E26,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7668,INVALC,INVALC,INVALC,INVALC, + 0x7675,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D4A,INVALC, + INVALC,0x5062,INVALC,INVALC,INVALC,INVALC,0x5D26,INVALC, + INVALC,0x5D6B,INVALC,INVALC,0x6479,INVALC,INVALC,0x632F, + 0x507C,INVALC,INVALC,INVALC,0x747C,INVALC,INVALC,INVALC, + INVALC,0x4C3C,0x776A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6564,0x5F71,INVALC,INVALC,0x7761,INVALC,0x7977, + 0x6F39,INVALC,INVALC,0x7858,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7929,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7859,INVALC,INVALC,INVALC,0x6E3D,INVALC,INVALC, + INVALC,0x5846,INVALC,INVALC,0x6463,0x754E,INVALC,INVALC, + INVALC,INVALC,0x5D59,INVALC,INVALC,INVALC,INVALC,0x5967, + 0x5239,0x5543,INVALC,INVALC,0x5A65,0x5A50,INVALC,0x5159, + 0x4E58,INVALC,0x4B5E,0x742C,0x5A7B,INVALC,0x7669,0x6873, + 0x4F2C,0x7070,INVALC,0x747D,0x5B48,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E40,0x6354,0x514F,0x7175, + INVALC,0x4D72,INVALC,0x4F6B,INVALC,INVALC,INVALC,0x4D38, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6326,0x515A, + /* Block 100, Array index 0x2600 */ + INVALC,0x7225,INVALC,INVALC,INVALC,INVALC,INVALC,0x7226, + INVALC,0x644E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x537B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7129,INVALC,INVALC,INVALC,0x7249, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6F58,0x6649,INVALC,0x5838,0x7A73,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7335,INVALC,INVALC,0x7824,INVALC,INVALC,0x5173, + 0x6648,INVALC,INVALC,INVALC,INVALC,0x785A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C69, + 0x5E57,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B5F,INVALC, + INVALC,INVALC,0x4F6C,INVALC,INVALC,INVALC,INVALC,0x745F, + INVALC,INVALC,0x5174,0x523A,INVALC,INVALC,INVALC,0x5F72, + INVALC,INVALC,INVALC,0x6137,INVALC,INVALC,INVALC,INVALC, + 0x6223,0x537C,INVALC,INVALC,0x6D66,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B49,INVALC,INVALC,INVALC,0x647A,INVALC, + 0x4F5E,INVALC,INVALC,0x4E50,INVALC,INVALC,INVALC,INVALC, + 0x5553,0x7375,0x772E,INVALC,INVALC,0x6F48,INVALC,0x4D73, + 0x754F,0x6573,0x7042,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A51,INVALC,INVALC,INVALC,0x6A71,INVALC,0x5026,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x595A, + 0x702B,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B67,INVALC, + INVALC,INVALC,0x6540,0x7C35,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6444,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C29,0x7D46,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6A35,INVALC,0x652A,0x5F3A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 101, Array index 0x2700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x615F,INVALC,0x5A51, + INVALC,INVALC,INVALC,INVALC,0x6138,INVALC,0x6874,0x537D, + INVALC,INVALC,INVALC,INVALC,0x6224,INVALC,INVALC,INVALC, + INVALC,INVALC,0x724A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A66,0x7733,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7D4D,INVALC,INVALC,INVALC,0x7336,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E57,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7544,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5824,INVALC,INVALC,INVALC,INVALC,INVALC,0x7227, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5938,0x5939,0x6F49,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x564E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x774B,0x5F2E,0x6875,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5235,INVALC,INVALC,INVALC,0x5355,INVALC, + INVALC,INVALC,INVALC,INVALC,0x744C,0x5A7C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5968,INVALC,0x776B,0x7549,INVALC, + 0x733C,INVALC,0x5A52,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5335,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6836,INVALC,INVALC,0x564F,0x743A,INVALC,0x7749, + INVALC,INVALC,0x4C2A,INVALC,INVALC,0x7043,0x4C56,INVALC, + INVALC,INVALC,0x5053,INVALC,0x533D,INVALC,INVALC,INVALC, + 0x5B7B,INVALC,0x4B60,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5364,0x7677,INVALC,INVALC,0x553A,0x734D,0x4B61, + INVALC,INVALC,INVALC,INVALC,0x6B74,INVALC,INVALC,INVALC, + INVALC,INVALC,0x742D,INVALC,0x7C2A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x776C,INVALC,INVALC,INVALC,0x6876,INVALC, + /* Block 102, Array index 0x2800 */ + 0x5A67,INVALC,INVALC,INVALC,0x774C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6541,INVALC,INVALC,INVALC,INVALC,0x606E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x557D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E66,0x7C2B,0x553B,INVALC,INVALC,0x7228, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6225,0x4D39, + 0x6A72,0x4B47,INVALC,0x4D74,INVALC,INVALC,0x5B2F,0x6F59, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D3A,INVALC,INVALC, + 0x7C79,INVALC,INVALC,INVALC,INVALC,0x5F73,0x4E67,0x5A42, + INVALC,0x4F2D,INVALC,INVALC,INVALC,INVALC,0x6779,0x7828, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7362,INVALC, + INVALC,INVALC,0x4A72,0x5F24,INVALC,INVALC,0x5444,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C57,0x6542,INVALC,INVALC, + INVALC,INVALC,0x4D3B,INVALC,0x6F5A,0x6E58,INVALC,0x5D27, + 0x6226,INVALC,INVALC,INVALC,INVALC,INVALC,0x6040,INVALC, + INVALC,INVALC,0x5630,0x784A,INVALC,0x7C7A,INVALC,0x597E, + INVALC,INVALC,INVALC,INVALC,0x5E30,INVALC,INVALC,INVALC, + 0x5D6C,0x5A68,INVALC,INVALC,INVALC,INVALC,INVALC,0x5460, + INVALC,0x5679,INVALC,0x4D57,0x5E58,INVALC,INVALC,0x7278, + INVALC,0x6456,INVALC,INVALC,0x5045,0x742E,INVALC,0x5D28, + INVALC,INVALC,INVALC,0x6D45,0x7356,INVALC,INVALC,0x5E59, + 0x6366,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5328, + INVALC,0x5B30,INVALC,INVALC,0x655A,0x633F,INVALC,INVALC, + INVALC,0x5B31,INVALC,INVALC,INVALC,0x5569,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6041,0x6F5B,INVALC,INVALC,0x7069, + INVALC,INVALC,0x5732,INVALC,INVALC,INVALC,INVALC,0x507D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5969,INVALC,INVALC,0x507E,INVALC,0x6C6D,0x5329,INVALC, + 0x7229,0x7044,INVALC,INVALC,0x6262,0x696F,INVALC,INVALC, + INVALC,0x7951,INVALC,INVALC,0x6959,INVALC,INVALC,INVALC, + INVALC,INVALC,0x685A,0x5A43,0x5A44,0x5445,INVALC,0x677A, + /* Block 103, Array index 0x2900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D60,0x6330, + INVALC,0x5B32,0x7B44,INVALC,0x7363,INVALC,0x5925,0x7B67, + 0x5D4B,0x5054,INVALC,0x6636,0x602E,0x7D5A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C35,0x6078, + 0x6731,INVALC,INVALC,INVALC,INVALC,0x7570,INVALC,0x585C, + 0x6D46,INVALC,INVALC,INVALC,INVALC,0x6139,INVALC,0x6340, + 0x7940,0x6970,INVALC,INVALC,0x595B,INVALC,0x7364,INVALC, + INVALC,INVALC,0x5C36,0x6469,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7045,0x6341,0x7C4C,0x7C4D,INVALC,INVALC,INVALC, + INVALC,0x724B,INVALC,0x724C,INVALC,INVALC,INVALC,0x644F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x715B,INVALC,0x7A59,INVALC,0x7138,0x7D75,0x6079, + INVALC,INVALC,INVALC,INVALC,0x677B,0x7C37,0x7C64,0x7B45, + 0x6367,0x5839,INVALC,0x7678,INVALC,INVALC,0x5C45,0x4C58, + INVALC,INVALC,INVALC,0x602F,0x7467,INVALC,0x6F5C,0x4F7C, + 0x6F5D,INVALC,0x722A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7D3E,INVALC,INVALC,0x4A2C, + 0x7D3B,0x7D47,INVALC,INVALC,INVALC,INVALC,0x6732,INVALC, + 0x6A51,0x5F74,INVALC,INVALC,INVALC,INVALC,0x516C,0x645E, + 0x6543,INVALC,INVALC,INVALC,INVALC,0x5926,INVALC,INVALC, + 0x4D3C,INVALC,0x7365,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D55,INVALC,INVALC,0x593A,INVALC, + INVALC,INVALC,0x6D67,0x7B35,0x786C,INVALC,INVALC,INVALC, + INVALC,0x6067,INVALC,0x4C59,INVALC,INVALC,0x5446,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6725,INVALC,0x5575,0x533E, + INVALC,0x7C7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6472,INVALC, + INVALC,0x5F75,INVALC,INVALC,0x6878,0x786D,INVALC,INVALC, + 0x4E47,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D76,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6858,INVALC,0x4D58,0x6756,0x4C5A,INVALC,INVALC,0x4A63, + 0x5F76,0x7047,0x7046,INVALC,0x583A,INVALC,0x7174,0x7470, + /* Block 104, Array index 0x2A00 */ + 0x754C,INVALC,INVALC,0x7C65,INVALC,INVALC,INVALC,INVALC, + 0x6A45,0x6A73,INVALC,0x5D5B,INVALC,0x5C57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E7D,0x7279,INVALC,0x5547, + INVALC,INVALC,INVALC,0x5850,INVALC,0x7048,0x5121,0x5122, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5954,0x5668, + 0x594A,INVALC,0x5A31,0x5847,0x5C62,0x734E,0x7574,INVALC, + INVALC,0x7139,INVALC,INVALC,0x5A53,INVALC,0x766A,INVALC, + INVALC,INVALC,0x4F75,INVALC,INVALC,0x7D2E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A52,INVALC, + INVALC,0x5F34,INVALC,INVALC,INVALC,INVALC,0x575D,0x7A3A, + 0x6E27,0x753D,INVALC,0x7875,INVALC,INVALC,0x6D68,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5461,INVALC,0x5123,0x6156, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7978,INVALC,0x5B4A, + 0x4B79,0x5454,INVALC,0x595C,INVALC,0x6E3E,INVALC,0x776D, + INVALC,INVALC,INVALC,0x526E,INVALC,INVALC,0x6166,0x7779, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D6D, + INVALC,0x685B,INVALC,0x5B33,INVALC,INVALC,INVALC,0x5177, + 0x6030,INVALC,INVALC,0x5462,INVALC,0x7657,INVALC,0x5779, + INVALC,INVALC,0x585D,INVALC,0x4D7D,0x722B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D3D, + 0x7842,INVALC,INVALC,0x722C,INVALC,INVALC,0x4A2D,0x4A2E, + 0x4F2E,INVALC,INVALC,INVALC,INVALC,INVALC,0x6342,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C37,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B5A, + 0x593B,0x4A73,0x7653,0x6678,0x6A75,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6A76,INVALC,INVALC,0x7679,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4F2F,INVALC,INVALC,0x4A53,INVALC,INVALC,0x4A2F, + 0x5230,0x713A,INVALC,0x5733,0x6343,0x737D,0x5E5A,INVALC, + INVALC,INVALC,INVALC,0x5E5B,INVALC,INVALC,0x6F5E,INVALC, + /* Block 105, Array index 0x2B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6263,0x6E7B,INVALC,INVALC,0x5F77,0x574A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E68,0x5B5B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x713B,INVALC,INVALC,INVALC,INVALC,0x6971, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A37,0x5046,INVALC,INVALC,0x4C2B,0x6E28,INVALC,INVALC, + 0x4B7A,0x7979,0x4C7D,0x537E,INVALC,INVALC,INVALC,INVALC, + 0x6450,INVALC,INVALC,INVALC,INVALC,INVALC,0x726E,INVALC, + 0x5455,0x5F4D,INVALC,0x7C38,0x5150,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x724D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7752,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A54, + INVALC,0x5559,INVALC,INVALC,INVALC,0x585E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D59, + INVALC,INVALC,INVALC,0x6E29,0x763C,INVALC,INVALC,0x4C5B, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7049,INVALC,0x7C7C, + INVALC,0x6849,0x747E,INVALC,INVALC,INVALC,INVALC,0x677C, + 0x575E,INVALC,INVALC,INVALC,INVALC,0x5E5C,INVALC,0x702C, + 0x4C7E,0x4D61,INVALC,0x613A,INVALC,0x5B6F,0x5A32,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5125,0x5C38,INVALC,INVALC, + INVALC,0x5876,INVALC,0x5124,INVALC,0x4D62,INVALC,INVALC, + INVALC,INVALC,0x5C6A,INVALC,INVALC,0x7077,INVALC,0x704A, + 0x503E,INVALC,0x5D5C,INVALC,INVALC,INVALC,INVALC,0x5456, + 0x5356,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D50, + 0x4D21,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F35,INVALC, + INVALC,INVALC,0x5F78,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5421,0x4E32,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 106, Array index 0x2C00 */ + 0x684A,INVALC,INVALC,INVALC,INVALC,0x6B75,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6355,0x7550,INVALC, + INVALC,INVALC,0x7521,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5927, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x652B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x664B,INVALC,0x7571, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6545,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7923,0x605B,0x766B,INVALC,0x4B71, + INVALC,0x596A,0x7522,INVALC,INVALC,INVALC,0x5751,INVALC, + 0x5178,0x6A78,0x6A79,0x5A33,INVALC,INVALC,INVALC,INVALC, + 0x6F5F,INVALC,INVALC,0x716F,INVALC,0x6576,0x6E3F,0x6264, + INVALC,INVALC,INVALC,INVALC,INVALC,0x503F,INVALC,0x7A2C, + 0x7551,0x6733,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x693E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x724E,0x5B34,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C4E,INVALC,0x5D6E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6734,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5734,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7734,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D3E,INVALC,0x5A69,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F30,0x7759,0x7366,INVALC,INVALC, + 0x4E59,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E2A,INVALC,0x4B48,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5027,INVALC,0x704B,INVALC,0x5047, + /* Block 107, Array index 0x2D00 */ + INVALC,INVALC,0x6445,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B60,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x555A,INVALC,0x5727,INVALC,INVALC,INVALC,0x6E40, + INVALC,0x7876,INVALC,INVALC,INVALC,INVALC,0x7552,0x6D69, + INVALC,0x593C,INVALC,0x6546,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7523,INVALC,INVALC, + 0x5A54,0x6227,0x7B7C,INVALC,INVALC,0x715C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4A74,INVALC,INVALC,INVALC, + 0x687A,INVALC,INVALC,0x4E69,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6978,0x6265,INVALC,INVALC,INVALC,INVALC, + 0x5039,0x5472,INVALC,INVALC,INVALC,INVALC,INVALC,0x5126, + INVALC,0x5F4E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7C74,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x532A,INVALC,INVALC,INVALC,0x4C2C,INVALC,INVALC,INVALC, + INVALC,0x6F60,INVALC,INVALC,INVALC,0x6565,0x5055,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B7C, + INVALC,INVALC,INVALC,INVALC,0x7C66,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4B7E,0x6D6A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E31,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7963,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5422,0x4F76,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5650,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x556A,0x716E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A4B,INVALC, + INVALC,INVALC,INVALC,0x6521,INVALC,INVALC,INVALC,INVALC, + /* Block 108, Array index 0x2E00 */ + INVALC,INVALC,INVALC,INVALC,0x5531,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4F6D,INVALC,0x6D6B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5532,INVALC,INVALC,INVALC,0x553C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7D62,0x732D,INVALC,0x7D5B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6930,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5127,INVALC,INVALC,0x7D63,0x4E33,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D64,0x7A4E, + INVALC,INVALC,INVALC,INVALC,0x4A30,INVALC,0x7727,INVALC, + 0x4F31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6622, + INVALC,0x7C36,0x722D,0x6F61,0x732E,0x5C46,0x596B,INVALC, + INVALC,INVALC,0x6860,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6128,INVALC,INVALC,INVALC,INVALC,0x5576, + 0x4F7D,INVALC,INVALC,0x5E5D,INVALC,INVALC,INVALC,0x5951, + INVALC,INVALC,INVALC,0x646A,0x724F,INVALC,0x773F,INVALC, + INVALC,0x6266,0x6228,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6356,INVALC, + 0x6D51,INVALC,INVALC,INVALC,INVALC,INVALC,0x6979,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5631,0x5E32, + INVALC,INVALC,0x6068,INVALC,INVALC,0x532B,INVALC,0x6B5C, + INVALC,INVALC,0x5F2F,INVALC,0x4A43,INVALC,INVALC,0x6E7C, + INVALC,0x7D43,INVALC,INVALC,INVALC,0x6B76,0x4F32,INVALC, + INVALC,INVALC,INVALC,0x596C,INVALC,0x593D,INVALC,0x585F, + INVALC,INVALC,0x5438,0x6B3E,0x5D6F,INVALC,0x5D70,0x5D71, + 0x5D72,INVALC,INVALC,0x593E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B46,0x4F33,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 109, Array index 0x2F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6E7D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x642B, + INVALC,0x5A45,INVALC,0x586C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5128,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6229,INVALC,INVALC,0x5E3C, + 0x6735,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B70,INVALC, + 0x6F62,0x7170,0x4F34,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B71,INVALC, + 0x6031,INVALC,INVALC,INVALC,INVALC,0x5F25,INVALC,0x7952, + INVALC,INVALC,0x677D,INVALC,INVALC,0x6623,0x7B71,0x4B30, + 0x722E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D67,INVALC,0x685C,INVALC,INVALC,0x6757,INVALC,INVALC, + 0x7740,INVALC,0x5063,INVALC,INVALC,INVALC,0x5A21,INVALC, + INVALC,INVALC,0x4C3D,INVALC,INVALC,0x5129,0x5D4C,INVALC, + INVALC,0x637E,0x512A,0x682A,INVALC,0x6A36,0x797A,0x664C, + 0x7658,INVALC,INVALC,INVALC,0x5447,INVALC,INVALC,INVALC, + 0x594B,INVALC,0x5952,0x534B,0x5877,0x5A29,0x7578,INVALC, + INVALC,0x5E5E,0x722F,0x7829,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5848,INVALC,INVALC,0x6E41,INVALC, + INVALC,INVALC,INVALC,0x7941,INVALC,INVALC,INVALC,INVALC, + 0x5D73,0x6A7A,INVALC,0x763D,0x613B,0x4D3F,0x7454,0x664D, + INVALC,0x7C4F,0x7B22,INVALC,0x605C,INVALC,INVALC,INVALC, + INVALC,0x743B,0x5A55,INVALC,0x7932,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B72,INVALC,0x5B76,INVALC,0x5E5F, + INVALC,INVALC,INVALC,0x5B72,INVALC,INVALC,INVALC,INVALC, + INVALC,0x785C,0x776E,0x6B68,INVALC,0x527A,INVALC,INVALC, + 0x713C,INVALC,INVALC,0x7A5A,INVALC,INVALC,0x5A6A,0x5A46, + 0x7741,INVALC,INVALC,0x6736,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 110, Array index 0x3000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6547,0x562C,INVALC,INVALC,INVALC, + INVALC,0x5C47,INVALC,INVALC,INVALC,INVALC,INVALC,0x6129, + INVALC,0x622A,INVALC,0x5526,INVALC,INVALC,0x5457,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7250,INVALC,0x6A7B, + INVALC,0x605D,0x7B73,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x713D,INVALC,INVALC,0x6267,0x7D57,INVALC, + 0x4E48,0x6A37,INVALC,0x7C40,INVALC,0x7D67,0x776F,INVALC, + INVALC,0x5735,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F3A,0x715D,INVALC,0x5E33,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x684B,INVALC,INVALC,0x785D,INVALC, + INVALC,0x7B47,0x5548,INVALC,0x575F,INVALC,0x5D29,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6931,INVALC,INVALC,0x7A2D, + 0x7659,0x7A74,INVALC,INVALC,INVALC,INVALC,INVALC,0x782A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x666E,INVALC,0x4C5C, + 0x613C,0x606F,INVALC,INVALC,0x693F,0x7C7D,0x664E,INVALC, + INVALC,0x6157,INVALC,0x664F,INVALC,0x7471,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6473, + INVALC,INVALC,0x647B,INVALC,INVALC,0x7964,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F63,INVALC,INVALC,0x4F6E,0x763E,0x6032,0x7C7E,0x512B, + INVALC,INVALC,INVALC,0x577A,INVALC,INVALC,INVALC,0x7B48, + INVALC,0x6257,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5423,0x7078,0x5728,INVALC,INVALC,INVALC,0x6167,INVALC, + INVALC,0x533F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F64,INVALC,0x5745,0x6B62,INVALC,INVALC,0x7C67,INVALC, + INVALC,0x6422,INVALC,0x6268,INVALC,0x6650,INVALC,0x7B68, + 0x7468,0x6574,0x743C,0x7455,INVALC,INVALC,INVALC,INVALC, + /* Block 111, Array index 0x3100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F36, + INVALC,0x7C39,0x6E42,0x4A75,INVALC,INVALC,INVALC,0x6F65, + 0x4B62,0x5424,INVALC,0x5E60,0x5A7D,0x6446,0x683E,INVALC, + INVALC,INVALC,INVALC,0x605E,0x7634,0x6A52,INVALC,0x797B, + INVALC,INVALC,0x6042,INVALC,0x4A64,INVALC,0x6737,INVALC, + 0x6A7D,INVALC,0x595D,INVALC,0x5A34,0x6E2A,0x7B69,INVALC, + INVALC,INVALC,INVALC,0x5B4B,0x5A35,INVALC,INVALC,INVALC, + INVALC,INVALC,0x713E,INVALC,INVALC,0x532C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B49,INVALC, + 0x5F4F,INVALC,INVALC,0x5340,0x6357,INVALC,0x6F66,0x7C50, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6940, + INVALC,INVALC,INVALC,0x7553,INVALC,INVALC,0x6C5C,0x7737, + INVALC,INVALC,0x6A38,0x5179,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C48,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6A39,INVALC,INVALC,INVALC,INVALC,INVALC,0x715E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5736,0x4F35,INVALC,0x5928, + INVALC,INVALC,0x6C6E,INVALC,INVALC,0x5D2A,INVALC,INVALC, + INVALC,INVALC,0x4D22,0x682E,INVALC,INVALC,INVALC,0x613D, + INVALC,0x7251,INVALC,INVALC,INVALC,INVALC,0x6941,INVALC, + INVALC,INVALC,0x527C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B35,INVALC,0x7367,0x587E,INVALC,INVALC, + INVALC,0x7C51,INVALC,0x6D32,0x742F,INVALC,0x7B23,INVALC, + INVALC,0x7C41,INVALC,0x6E2B,0x5425,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7472, + INVALC,INVALC,INVALC,INVALC,0x6E59,INVALC,INVALC,INVALC, + 0x7B4A,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D63,0x583B, + /* Block 112, Array index 0x3200 */ + INVALC,0x655B,0x7877,INVALC,INVALC,INVALC,0x7654,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5729, + INVALC,0x4B49,INVALC,INVALC,0x6651,0x704C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x582E,INVALC,0x7953,0x557E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x583C,0x7230,INVALC,INVALC,INVALC, + INVALC,0x622B,0x7368,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D6C, + INVALC,0x6738,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A7E,INVALC,INVALC,0x4C3E,INVALC,INVALC,0x727C, + 0x5A6B,INVALC,0x6258,0x6D56,INVALC,INVALC,0x5651,0x6033, + INVALC,INVALC,0x7C52,INVALC,0x6B48,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5341,0x704D,INVALC, + 0x4F77,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D52,INVALC,0x5458,0x5C49,0x5771,INVALC, + INVALC,0x5F3B,INVALC,INVALC,0x7325,INVALC,INVALC,INVALC, + 0x744D,INVALC,INVALC,INVALC,INVALC,0x713F,0x7831,INVALC, + 0x697A,INVALC,INVALC,INVALC,0x7B4B,INVALC,INVALC,0x4A55, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7954,0x774A,INVALC,INVALC,0x5648, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C68,0x733D, + INVALC,0x6E7E,INVALC,0x677E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5342,INVALC,INVALC,INVALC,INVALC,0x5336,INVALC, + 0x4C2D,0x767A,0x5632,0x5258,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6758,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6325,INVALC,INVALC, + INVALC,INVALC,0x6739,INVALC,INVALC,INVALC,INVALC,0x702D, + 0x7B4C,0x6B21,INVALC,INVALC,0x5426,INVALC,INVALC,INVALC, + INVALC,0x7B4D,INVALC,0x553D,0x715F,INVALC,INVALC,0x767B, + INVALC,0x5E34,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x556B,INVALC, + /* Block 113, Array index 0x3300 */ + INVALC,0x6548,INVALC,INVALC,INVALC,0x7B24,0x5439,INVALC, + INVALC,0x5E61,INVALC,0x6423,INVALC,INVALC,INVALC,0x5737, + INVALC,0x786E,INVALC,INVALC,INVALC,0x5E35,INVALC,INVALC, + 0x5652,INVALC,0x7955,0x673A,0x6B55,0x5577,0x6F67,0x613E, + INVALC,INVALC,INVALC,0x7A2E,INVALC,INVALC,INVALC,0x5669, + 0x566E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x673B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6C4B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5533,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E34,INVALC,INVALC,INVALC, + 0x7B25,0x616E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7728,INVALC,INVALC,INVALC,INVALC,0x7B4E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x583D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B7D,INVALC,INVALC,INVALC,INVALC, + 0x7C69,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F36,INVALC,INVALC,INVALC,0x6D47,0x6E2C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4C5D,INVALC,INVALC, + INVALC,INVALC,0x7627,INVALC,INVALC,INVALC,0x667A,INVALC, + INVALC,INVALC,0x7524,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7D5C,0x6D33,0x4E49,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F68,INVALC,INVALC,0x613F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A5B,0x4B63,0x7729,INVALC,0x7B26, + INVALC,INVALC,INVALC,0x5C39,INVALC,INVALC,INVALC,0x7140, + 0x6D48,0x6F43,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x562D,INVALC,INVALC,0x7D4E,INVALC,INVALC,INVALC,0x6821, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7B74,0x5527,INVALC,INVALC,INVALC,0x7176,INVALC,0x6653, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C5E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7832,INVALC,INVALC,INVALC,0x5C6B,INVALC,INVALC, + /* Block 114, Array index 0x3400 */ + INVALC,INVALC,INVALC,INVALC,0x7D36,INVALC,INVALC,INVALC, + INVALC,0x656A,INVALC,INVALC,0x7160,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5B4C,0x5D4D,INVALC,INVALC,INVALC,0x5448,INVALC, + INVALC,0x596D,INVALC,INVALC,INVALC,INVALC,0x7525,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x667B,INVALC,INVALC,INVALC,INVALC,INVALC,0x6654,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D48, + INVALC,0x5621,0x7D3F,INVALC,0x7C53,INVALC,0x6F21,INVALC, + 0x673C,INVALC,INVALC,INVALC,INVALC,INVALC,0x516E,INVALC, + INVALC,0x6655,INVALC,INVALC,0x6972,INVALC,0x5F30,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5860,0x7C3A,0x7D2F,0x704E, + INVALC,0x5B61,INVALC,INVALC,0x6549,INVALC,0x6D34,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6043,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6358,INVALC,INVALC,INVALC, + INVALC,0x697B,0x6A28,INVALC,INVALC,INVALC,INVALC,0x7D37, + INVALC,INVALC,0x7B27,INVALC,0x6942,INVALC,INVALC,INVALC, + INVALC,0x7D77,INVALC,INVALC,INVALC,INVALC,INVALC,0x6259, + INVALC,INVALC,0x5C6C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6822,INVALC,INVALC,INVALC, + INVALC,0x6670,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7D78,0x7D79,INVALC,INVALC,INVALC,0x763F,INVALC, + INVALC,0x6727,INVALC,0x6657,INVALC,INVALC,INVALC,INVALC, + 0x5473,0x5449,INVALC,INVALC,INVALC,INVALC,0x567A,INVALC, + 0x5772,INVALC,0x6140,INVALC,0x5B62,0x6658,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x673D, + INVALC,INVALC,INVALC,INVALC,INVALC,0x704F,0x733E,0x622C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7537,0x6070,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7D38,0x6368,INVALC,0x5427,0x687C, + /* Block 115, Array index 0x3500 */ + 0x7A52,INVALC,INVALC,INVALC,INVALC,INVALC,0x786F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5653,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5534,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7050,INVALC,0x7770,0x6E33,INVALC,INVALC, + 0x6A3A,INVALC,0x6A53,INVALC,INVALC,0x6D49,0x5D2B,INVALC, + INVALC,INVALC,0x652C,0x7D21,INVALC,0x5F50,0x6C33,INVALC, + 0x5F51,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D6D,0x7838, + 0x777A,INVALC,INVALC,INVALC,0x782B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7460,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x543A,0x6433,INVALC,0x695A,INVALC,0x5E36,INVALC,0x593F, + INVALC,0x5940,0x566F,INVALC,INVALC,INVALC,INVALC,0x594C, + INVALC,0x5A2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5F65,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7765,INVALC,INVALC,INVALC,0x4C32,INVALC,INVALC, + 0x5F79,0x5760,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x543B,INVALC,INVALC,INVALC,INVALC,0x7D7A, + INVALC,INVALC,INVALC,INVALC,0x4C33,INVALC,INVALC,0x5B73, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F52,INVALC,0x4E4A,INVALC,0x6E5A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6464,INVALC, + 0x7B4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F37, + INVALC,0x6E43,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E6A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x622D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5761,0x7A75,INVALC,INVALC,0x5549,0x782C,INVALC,INVALC, + /* Block 116, Array index 0x3600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6759,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7369,INVALC, + INVALC,INVALC,INVALC,0x586D,0x6344,0x7071,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6865,INVALC,INVALC, + INVALC,0x607A,0x6E44,0x595E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B22,0x6B23, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C42,0x6A3B, + INVALC,INVALC,INVALC,INVALC,0x682B,0x5E62,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D6F,INVALC,0x6823,INVALC,INVALC,INVALC,INVALC,0x4F71, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x543C,INVALC,0x7C6A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x673E,INVALC,0x7C72,INVALC,INVALC,0x5634,INVALC,INVALC, + 0x622E,INVALC,0x5337,0x7A4C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A5C,INVALC,0x6D35,0x6163, + INVALC,0x682C,INVALC,0x685D,INVALC,INVALC,0x6F69,INVALC, + INVALC,INVALC,INVALC,INVALC,0x743D,INVALC,0x4F38,0x695B, + 0x512C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A47, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B49, + INVALC,0x684C,INVALC,INVALC,INVALC,0x5E37,INVALC,INVALC, + INVALC,INVALC,0x563C,0x5365,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A56,INVALC,0x4A31,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A48,0x5F26,INVALC,0x7933,0x7252,INVALC,0x4A44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E4B,INVALC, + INVALC,0x4D75,INVALC,INVALC,INVALC,0x7D30,0x5528,INVALC, + 0x7141,INVALC,INVALC,0x6269,0x5C4A,0x6C34,0x7A40,INVALC, + INVALC,0x7B28,0x5028,INVALC,INVALC,0x5A6C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x596E, + INVALC,0x607B,INVALC,INVALC,INVALC,0x6F6A,0x7A5E,INVALC, + /* Block 117, Array index 0x3700 */ + INVALC,0x6044,INVALC,0x4F39,INVALC,0x554A,0x5762,0x622F, + INVALC,0x5738,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x684D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x765A,INVALC,INVALC,INVALC,INVALC, + 0x6F22,0x625A,0x767C,INVALC,INVALC,0x7B50,0x512D,INVALC, + 0x4D64,INVALC,0x512E,0x5C6D,0x684E,INVALC,0x7079,0x4E35, + 0x667C,INVALC,INVALC,0x577B,0x5056,0x5D75,0x7771,INVALC, + 0x767D,INVALC,0x5B77,INVALC,INVALC,INVALC,INVALC,0x7B6A, + 0x695C,0x5941,INVALC,0x7572,0x6045,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6A54,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7942,INVALC,0x6A3C, + INVALC,0x5245,0x7B51,0x6740,0x6B25,INVALC,0x5F7A,0x6322, + 0x5739,INVALC,0x6943,INVALC,0x687D,0x682F,INVALC,INVALC, + 0x7253,0x7B29,0x5825,INVALC,INVALC,INVALC,INVALC,0x554B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5048,INVALC, + INVALC,INVALC,0x512F,0x5763,INVALC,INVALC,INVALC,0x6046, + INVALC,0x5622,INVALC,0x6D70,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5773,INVALC,INVALC,INVALC,0x7C54,INVALC,0x5A57,0x4C5F, + INVALC,0x7254,INVALC,0x5130,INVALC,0x4C60,INVALC,0x5B7D, + 0x733F,INVALC,0x7051,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7C3B,INVALC,0x6230,INVALC,INVALC,0x6625,INVALC,INVALC, + INVALC,0x625B,INVALC,INVALC,INVALC,0x5F5E,INVALC,0x6047, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x726F,INVALC, + INVALC,INVALC,0x4C61,INVALC,INVALC,INVALC,INVALC,0x566A, + INVALC,INVALC,INVALC,INVALC,0x6742,INVALC,INVALC,INVALC, + 0x4E36,INVALC,0x7340,INVALC,0x4D7E,INVALC,INVALC,INVALC, + 0x7B52,INVALC,0x7878,0x777B,INVALC,INVALC,0x683F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6837,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D36, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 118, Array index 0x3800 */ + INVALC,0x5C3A,INVALC,INVALC,0x4C34,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7177,INVALC,INVALC,INVALC,0x6838,INVALC,INVALC, + 0x4A76,INVALC,0x6424,0x7456,INVALC,INVALC,INVALC,0x5F66, + INVALC,INVALC,INVALC,0x5F27,INVALC,0x5F67,0x6141,INVALC, + 0x6944,INVALC,INVALC,0x5C4B,0x6945,INVALC,INVALC,INVALC, + 0x6F23,0x6B26,0x4B23,0x6369,INVALC,INVALC,INVALC,0x517B, + 0x6F24,INVALC,0x6F6B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5034, + INVALC,INVALC,INVALC,INVALC,0x4D23,INVALC,INVALC,0x6866, + INVALC,0x6F25,INVALC,0x534C,0x5A6D,INVALC,INVALC,INVALC, + INVALC,0x573A,INVALC,0x7255,0x7565,0x596F,INVALC,INVALC, + INVALC,INVALC,0x7934,INVALC,INVALC,0x5554,0x7D4F,INVALC, + INVALC,INVALC,0x5B63,INVALC,INVALC,INVALC,INVALC,0x7161, + 0x6C36,INVALC,INVALC,INVALC,INVALC,0x7B7E,0x5357,INVALC, + 0x5131,INVALC,0x4B31,INVALC,INVALC,INVALC,INVALC,0x5132, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B32,0x7142, + INVALC,INVALC,0x7461,0x7935,INVALC,INVALC,0x6143,0x6142, + INVALC,0x6B77,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5F28,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B4A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6639,INVALC,INVALC,INVALC,INVALC, + INVALC,0x785E,0x792A,0x4A77,INVALC,0x6D37,INVALC,INVALC, + 0x5338,0x7256,INVALC,INVALC,0x5459,0x6E45,0x7270,INVALC, + INVALC,INVALC,0x4A32,INVALC,INVALC,0x5C3B,INVALC,0x7178, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6C37,INVALC,INVALC, + INVALC,INVALC,0x654A,INVALC,0x7640,0x7D5D,INVALC,INVALC, + 0x5463,0x4C62,INVALC,0x7754,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5765,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5343,INVALC,0x5826,INVALC,0x7641,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D76,INVALC,0x4D40,INVALC,INVALC,INVALC, + /* Block 119, Array index 0x3900 */ + 0x655C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x654B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6144,INVALC,INVALC,INVALC,INVALC,INVALC,0x6830, + 0x7430,0x736A,0x5A6E,INVALC,0x573B,INVALC,0x6231,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x572A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x567B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x645F,INVALC,0x4A56,INVALC, + INVALC,INVALC,0x6B28,INVALC,INVALC,INVALC,0x5B7E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7642,INVALC,INVALC,0x6F3B,INVALC,INVALC,INVALC, + INVALC,0x547D,INVALC,INVALC,0x6048,INVALC,INVALC,INVALC, + 0x6839,INVALC,0x6F26,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D24,INVALC,INVALC,0x5474,0x5B21,0x5B5C,0x5B5D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E5C,INVALC,0x4B4B,0x7C55, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E6B,INVALC, + 0x4D41,INVALC,INVALC,0x7B53,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x792B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7554,INVALC,INVALC,INVALC,INVALC,0x5929, + INVALC,INVALC,0x695D,0x5B4D,INVALC,INVALC,0x5D4E,INVALC, + 0x6743,INVALC,0x6C4C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x796C,INVALC,INVALC,INVALC,0x4B4C,INVALC, + INVALC,INVALC,INVALC,0x607C,0x5428,INVALC,0x6D53,0x586F, + INVALC,0x7257,INVALC,0x4A78,0x5A6F,INVALC,INVALC,0x5654, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x594D,INVALC, + INVALC,INVALC,0x586E,INVALC,0x7241,INVALC,INVALC,INVALC, + 0x5F53,INVALC,INVALC,INVALC,0x5A70,INVALC,0x626A,INVALC, + /* Block 120, Array index 0x3A00 */ + INVALC,0x607D,INVALC,INVALC,0x5878,INVALC,INVALC,INVALC, + 0x772F,0x5A36,INVALC,0x4A57,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7258,INVALC, + 0x5879,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A5F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F6F, + 0x5942,INVALC,0x7052,INVALC,0x6451,INVALC,INVALC,INVALC, + 0x7337,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7A60,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F6C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6232,INVALC,0x543D,INVALC,INVALC,0x594E,INVALC, + INVALC,INVALC,INVALC,0x7462,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5429,INVALC,INVALC,INVALC,INVALC,0x4D42,0x675A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7259,INVALC,INVALC,INVALC,INVALC, + INVALC,0x592A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x583E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C2D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x626B,0x567C,INVALC,INVALC, + 0x4A79,INVALC,INVALC,0x545A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7457,0x4C21,INVALC,INVALC,0x4F3A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7538, + INVALC,INVALC,INVALC,0x5943,0x5068,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6345,0x6B78,INVALC,0x7231,INVALC,INVALC, + INVALC,0x4F3B,INVALC,INVALC,INVALC,0x532D,0x6861,0x4E6C, + INVALC,INVALC,INVALC,0x6034,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 121, Array index 0x3B00 */ + INVALC,INVALC,0x5E63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D77,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7232,0x7376,0x765B, + INVALC,INVALC,INVALC,INVALC,0x577E,INVALC,INVALC,INVALC, + INVALC,INVALC,0x785F,INVALC,0x7772,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5029,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x665A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7526,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x573C,0x4C63,INVALC,INVALC,0x665B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D5D,INVALC,INVALC,INVALC, + INVALC,0x5133,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F6D, + INVALC,INVALC,INVALC,INVALC,0x565E,0x6474,0x616F,INVALC, + INVALC,0x5D78,INVALC,INVALC,INVALC,INVALC,INVALC,0x684F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A65,INVALC,INVALC,INVALC,0x5C21, + INVALC,0x6035,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7C2C,0x7C2D,0x5827,INVALC,INVALC,INVALC, + INVALC,0x6D38,INVALC,INVALC,INVALC,0x5B36,INVALC,INVALC, + INVALC,INVALC,0x5670,0x732F,INVALC,INVALC,0x4D25,INVALC, + 0x5A71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5828,INVALC,INVALC,INVALC,0x4C64,INVALC,INVALC,0x5134, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4A58,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A72,INVALC,INVALC,INVALC,INVALC, + /* Block 122, Array index 0x3C00 */ + INVALC,0x7527,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7528,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6626,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x556C,0x5578,0x5A73,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6346,INVALC,INVALC,INVALC,0x5E64,INVALC, + 0x5E65,0x5135,INVALC,INVALC,INVALC,INVALC,INVALC,0x5136, + 0x5137,0x7233,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x695E,INVALC,INVALC,INVALC,INVALC,INVALC,0x7053,0x7234, + INVALC,INVALC,0x7054,0x4B64,0x7B54,0x7566,0x636A,INVALC, + 0x5E66,INVALC,INVALC,INVALC,INVALC,0x5F54,INVALC,INVALC, + 0x7879,INVALC,INVALC,INVALC,INVALC,0x702E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5138,INVALC,INVALC,INVALC,INVALC,0x565F, + INVALC,0x5057,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C21,0x6F6E,0x5C58, + INVALC,0x695F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x655D,0x7D7B, + INVALC,INVALC,0x6049,INVALC,INVALC,INVALC,0x5649,INVALC, + INVALC,0x542A,INVALC,0x654C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6960,INVALC,INVALC,INVALC,0x5058,0x7C22,0x543E, + 0x6233,0x5E67,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C3C,0x5236,0x7555,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E21,0x7529,INVALC,INVALC,0x5D79,INVALC,INVALC, + 0x5D7A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7055, + INVALC,INVALC,INVALC,INVALC,0x765F,INVALC,0x725A,0x646B, + INVALC,0x7271,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C39,INVALC,INVALC,INVALC,INVALC, + /* Block 123, Array index 0x3D00 */ + 0x7D7C,INVALC,INVALC,INVALC,INVALC,0x612A,INVALC,INVALC, + 0x4A59,INVALC,INVALC,0x6F6F,INVALC,0x752A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6C79,INVALC,INVALC,0x782D, + INVALC,0x7242,0x7643,INVALC,0x5752,INVALC,INVALC,0x7922, + 0x7056,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x707A,INVALC, + INVALC,0x7660,INVALC,INVALC,INVALC,INVALC,0x6973,0x7243, + INVALC,INVALC,INVALC,0x542B,0x4A33,0x4D26,INVALC,0x4D43, + 0x4D5A,INVALC,INVALC,INVALC,INVALC,INVALC,0x594F,INVALC, + INVALC,0x7644,INVALC,INVALC,INVALC,0x6E5D,0x6744,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6234, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F62,0x675B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6831,INVALC,0x7C2E,INVALC,INVALC,INVALC,INVALC, + 0x654D,INVALC,INVALC,INVALC,0x7A6B,INVALC,0x4F3C,INVALC, + INVALC,0x4F62,0x4D76,INVALC,INVALC,0x6F70,INVALC,0x743E, + INVALC,0x544D,INVALC,INVALC,0x7338,INVALC,INVALC,INVALC, + 0x6921,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7272,0x736B,INVALC,0x7057,INVALC,INVALC, + 0x4F57,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F5F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6840,0x6841,INVALC,INVALC,INVALC,0x4F63,0x6922, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x502A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7341,0x502B,INVALC,0x5464, + INVALC,INVALC,0x6F3C,0x5821,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x595F, + INVALC,0x7357,INVALC,INVALC,INVALC,0x5C3D,INVALC,0x4C65, + 0x6D71,INVALC,INVALC,0x7162,INVALC,0x545B,INVALC,INVALC, + INVALC,INVALC,0x6235,INVALC,INVALC,0x4A66,INVALC,0x532E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C66,INVALC, + INVALC,0x7153,0x7567,INVALC,INVALC,INVALC,INVALC,0x4A5A, + /* Block 124, Array index 0x3E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B6E, + INVALC,0x6145,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F69,INVALC,0x6E5E,INVALC,INVALC,0x7742,INVALC, + 0x5822,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D2C,INVALC, + INVALC,INVALC,INVALC,INVALC,0x702F,0x563D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x612B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7936,INVALC, + INVALC,0x5475,INVALC,0x5049,0x6F27,0x626C,INVALC,0x5B6A, + 0x4E4C,0x7568,0x7755,INVALC,0x534D,INVALC,0x737E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5035,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x607E,INVALC,0x5F7B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x665D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6824,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B4D, + INVALC,INVALC,INVALC,0x6F28,INVALC,INVALC,INVALC,0x6E34, + INVALC,INVALC,INVALC,INVALC,0x5A58,0x5139,INVALC,0x5F29, + INVALC,INVALC,0x7330,INVALC,INVALC,0x4C44,INVALC,INVALC, + INVALC,0x4E37,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F29,INVALC,INVALC, + INVALC,0x5F55,INVALC,INVALC,0x6D57,INVALC,INVALC,INVALC, + 0x6E46,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6F3D,0x7C56,INVALC,INVALC,0x5B74,INVALC,0x6F2A,0x7839, + INVALC,0x7569,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6359,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6146,INVALC,INVALC,INVALC,0x543F,INVALC,INVALC,INVALC, + INVALC,0x5E68,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 125, Array index 0x3F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x706A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7342,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x532F,INVALC, + INVALC,0x4A5B,INVALC,INVALC,INVALC,INVALC,INVALC,0x7C57, + INVALC,INVALC,0x6D58,0x6147,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7458,0x5633,0x5D2D, + INVALC,INVALC,INVALC,0x553E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7143,0x6E5F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x566B,INVALC,INVALC,INVALC,0x7459,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5766,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A37,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D7B,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5823,INVALC,INVALC,0x5A59,INVALC,0x7058, + 0x6F44,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6158, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7154,INVALC,0x6D72, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x555B,INVALC, + INVALC,0x555C,0x7344,0x4B57,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6236,INVALC,INVALC,INVALC,INVALC,0x6F71,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B55,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5358,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D50,0x7059, + 0x4B33,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x555D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D27,INVALC,INVALC,0x502C,INVALC, + /* Block 126, Array index 0x4000 */ + 0x513A,INVALC,0x7144,INVALC,0x6533,0x7B75,0x6961,0x7D60, + 0x7C3C,INVALC,0x5A22,0x5A23,INVALC,0x5221,INVALC,INVALC, + 0x526F,INVALC,INVALC,INVALC,0x626D,INVALC,INVALC,0x5E69, + 0x4E5C,0x7235,0x5064,0x5D51,INVALC,INVALC,INVALC,INVALC, + 0x6148,0x5B37,0x5F63,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D39,0x7145,INVALC,0x734F,0x572B, + 0x612C,INVALC,INVALC,0x636B,INVALC,0x6E47,INVALC,INVALC, + INVALC,0x6149,0x4A7A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x707B,0x7A61,0x705A,0x4C67,0x5A74,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C3F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E6D,INVALC, + INVALC,0x5529,0x7A62,INVALC,INVALC,INVALC,0x5065,INVALC, + 0x6B56,INVALC,0x6C5F,INVALC,INVALC,INVALC,0x5F7C,INVALC, + INVALC,0x7756,0x5E6A,0x4B34,INVALC,INVALC,0x6F3E,INVALC, + INVALC,0x4C35,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F3D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F72,0x6237, + INVALC,INVALC,INVALC,0x4C68,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x707C,INVALC,INVALC,INVALC, + 0x5660,INVALC,0x7146,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6238,0x6B2B,INVALC,INVALC, + INVALC,0x4B35,0x5851,INVALC,0x744E,0x7377,INVALC,INVALC, + 0x5746,INVALC,0x513B,0x772A,INVALC,0x6D4A,0x5753,0x587A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7645, + INVALC,INVALC,0x514C,0x5D7C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F7D,INVALC, + 0x7965,INVALC,0x604A,INVALC,INVALC,0x727D,0x5330,INVALC, + 0x7473,0x5A49,INVALC,0x665E,INVALC,INVALC,INVALC,INVALC, + 0x783A,0x6850,INVALC,INVALC,0x587B,INVALC,INVALC,0x6A55, + INVALC,INVALC,INVALC,INVALC,0x5623,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7646,INVALC,INVALC,INVALC,INVALC, + /* Block 127, Array index 0x4100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x725B,0x647C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6832,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5A5A,INVALC,0x725C,0x7B56,0x6932, + INVALC,0x6E2D,INVALC,0x7A63,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C6E,INVALC,INVALC,0x756A,0x6660, + INVALC,0x707D,INVALC,INVALC,INVALC,INVALC,INVALC,0x572C, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7545,0x6E60,INVALC, + INVALC,0x5B65,INVALC,0x5D5E,INVALC,INVALC,0x5970,0x6923, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7179,INVALC,0x7244,0x604B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6924,INVALC, + INVALC,0x6239,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6331,0x7C6B,0x4D28,INVALC,0x4C36,INVALC,INVALC, + 0x705B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x663A,INVALC,INVALC,0x4D29,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7343,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6159,INVALC,INVALC,0x6F2B, + INVALC,INVALC,INVALC,0x6745,INVALC,INVALC,0x6069,INVALC, + 0x7345,INVALC,INVALC,0x5440,0x553F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 128, Array index 0x4200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5D2E,INVALC, + 0x797C,INVALC,0x4C40,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6522,INVALC,INVALC,INVALC, + 0x4E38,INVALC,INVALC,INVALC,0x5852,0x7956,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x712A,0x4E51,INVALC,INVALC,0x7647,INVALC, + 0x5B6B,INVALC,0x5F7E,INVALC,INVALC,0x5861,INVALC,0x7773, + INVALC,0x5767,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x547E,INVALC,INVALC, + 0x513C,INVALC,0x654F,INVALC,0x4B36,INVALC,0x5A38,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D44,INVALC,INVALC,INVALC, + INVALC,INVALC,0x563E,INVALC,INVALC,INVALC,0x623A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F58,INVALC,INVALC,INVALC, + 0x604C,0x6B79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7D7D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5768,0x4B58,INVALC,INVALC,INVALC,0x6962,INVALC,INVALC, + INVALC,0x683A,INVALC,INVALC,INVALC,0x6347,INVALC,INVALC, + INVALC,INVALC,0x6C4D,INVALC,0x6C4E,INVALC,0x563F,INVALC, + INVALC,INVALC,0x6327,INVALC,0x5F56,0x7D68,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E61, + 0x7628,0x5D7D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x783B,INVALC,0x6851,INVALC,INVALC,INVALC,INVALC, + 0x7957,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E6E,INVALC,INVALC,0x6C4F,INVALC,INVALC,INVALC, + /* Block 129, Array index 0x4300 */ + 0x6925,0x5655,INVALC,0x4D45,INVALC,0x6D3A,0x513D,INVALC, + INVALC,0x4F3E,INVALC,INVALC,0x6C3B,INVALC,INVALC,INVALC, + 0x5231,INVALC,INVALC,INVALC,INVALC,0x4C69,INVALC,0x5944, + 0x697C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x513E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C3C,INVALC,INVALC,0x652D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7730,INVALC,0x4C6A, + INVALC,INVALC,INVALC,0x5344,INVALC,INVALC,0x5640,INVALC, + INVALC,INVALC,0x567D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6121,INVALC, + 0x5E3D,INVALC,0x7629,INVALC,INVALC,INVALC,0x5A24,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5624, + 0x7546,INVALC,0x6122,0x6946,INVALC,INVALC,INVALC,0x7245, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7469,0x566C,0x6B53, + INVALC,INVALC,INVALC,INVALC,0x6C3D,0x625C,0x5E6B,0x705C, + INVALC,0x6B3F,INVALC,0x574E,0x513F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x752B,INVALC, + INVALC,INVALC,INVALC,0x797D,INVALC,0x4A5C,INVALC,INVALC, + INVALC,0x4D46,0x7236,INVALC,INVALC,0x5D7E,INVALC,INVALC, + INVALC,0x4C37,0x5B38,INVALC,INVALC,INVALC,INVALC,0x5069, + INVALC,0x4E5D,0x6B40,INVALC,0x7D22,INVALC,INVALC,INVALC, + INVALC,INVALC,0x784B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6A56,0x7130,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5B4E,INVALC,0x7743,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B4F,0x4B24,INVALC,INVALC,0x7860,INVALC, + INVALC,0x7B57,INVALC,INVALC,0x6B4A,0x6021,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4E4D,INVALC,INVALC,0x545C,INVALC,INVALC,INVALC, + 0x7D58,INVALC,INVALC,INVALC,INVALC,0x5276,INVALC,INVALC, + /* Block 130, Array index 0x4400 */ + INVALC,INVALC,0x7237,INVALC,INVALC,0x7A76,0x762A,0x7A77, + 0x5866,INVALC,0x7431,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6852,INVALC,0x4A45,0x4C6B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x626E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x623B,INVALC,0x772D,INVALC,INVALC,INVALC,0x7861, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x736C,INVALC,INVALC,INVALC,INVALC,0x5E21,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x647D,INVALC,INVALC,0x636C,INVALC, + 0x5D2F,0x5D30,INVALC,INVALC,0x4B37,0x6853,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6123,0x5260,INVALC, + INVALC,INVALC,INVALC,0x707E,INVALC,INVALC,INVALC,INVALC, + 0x6926,0x4B72,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D73,0x5C59,0x604D,INVALC,INVALC,INVALC,INVALC,0x775A, + 0x5B39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C2E,INVALC,0x5A5B,INVALC,INVALC,INVALC,INVALC,0x4D47, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D31,INVALC,0x582F,0x6323,INVALC,INVALC, + 0x4E6F,INVALC,INVALC,0x7273,INVALC,INVALC,INVALC,INVALC, + 0x7833,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x604E,INVALC,0x757D,INVALC,INVALC, + INVALC,INVALC,0x6B6C,INVALC,INVALC,0x5345,0x7C6C,0x525B, + 0x546B,INVALC,0x5E22,INVALC,INVALC,INVALC,0x6566,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7030,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5544,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D74, + INVALC,INVALC,INVALC,0x636D,INVALC,0x6842,INVALC,0x6D75, + 0x577C,INVALC,0x6D3B,INVALC,INVALC,0x762B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7238,0x7648,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5366,0x725D,0x4F3F,INVALC,0x6B2C,INVALC, + /* Block 131, Array index 0x4500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x4F40,INVALC,0x6628, + 0x7D69,INVALC,0x4F41,INVALC,0x605F,0x5E6C,INVALC,INVALC, + INVALC,INVALC,0x6022,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x743F,0x626F,INVALC,0x5971,0x7147, + INVALC,0x4B38,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x797E,0x5B3A,0x5A75,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x766C,0x5A5C,0x7A64, + INVALC,0x604F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D32,INVALC,INVALC,INVALC,INVALC,0x6629,INVALC,0x6F73, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x736D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6B7A,INVALC,0x7966,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A5D,0x555E, + INVALC,0x4A5E,0x5F64,INVALC,INVALC,INVALC,0x667D,INVALC, + 0x752C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6475,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6963,INVALC,0x6D4B,0x4F64,INVALC, + INVALC,INVALC,0x5853,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D33,0x546C,INVALC,INVALC,0x7239,INVALC,0x5F37, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B4E,0x7B58,INVALC, + INVALC,0x5059,INVALC,INVALC,0x5D52,0x7774,0x675C,0x6425, + INVALC,0x7C23,INVALC,0x5B3B,INVALC,INVALC,INVALC,0x723A, + 0x697D,0x504A,INVALC,0x7556,0x5945,0x6434,INVALC,0x6D27, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A3D,0x667E,INVALC,0x7744,0x752D,INVALC,0x5960, + INVALC,INVALC,INVALC,0x4A34,INVALC,INVALC,0x7862,0x4F42, + INVALC,0x6C3E,INVALC,INVALC,INVALC,0x6534,0x4D48,0x6E48, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6748,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4D49,0x7937,INVALC, + /* Block 132, Array index 0x4600 */ + INVALC,0x7168,0x5972,0x5B75,0x4A35,0x5946,INVALC,INVALC, + INVALC,0x5849,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x592B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6D3C,INVALC,INVALC,0x5854,INVALC,INVALC,INVALC,0x5C5A, + INVALC,0x623C,INVALC,INVALC,0x7C6D,0x6C60,0x527E,INVALC, + 0x6947,0x662A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6270,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7A3B, + INVALC,0x752E,0x7B2A,INVALC,INVALC,INVALC,INVALC,0x6C7B, + INVALC,0x6C3F,0x7C58,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5465,INVALC,INVALC,INVALC,0x7943, + INVALC,INVALC,INVALC,0x6E62,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5769,0x6D76,INVALC,INVALC,INVALC,0x5E6D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C6C,INVALC, + 0x636E,INVALC,INVALC,INVALC,INVALC,INVALC,0x6854,INVALC, + INVALC,INVALC,0x7A78,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5D34,0x6435,0x5830,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5855,INVALC,INVALC, + INVALC,0x746A,INVALC,INVALC,INVALC,0x4E39,INVALC,INVALC, + INVALC,0x5661,0x4F52,INVALC,0x5036,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E22,INVALC,INVALC,0x736E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7378,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C4C,INVALC,0x504B,INVALC,INVALC,INVALC,0x7C24, + 0x4D4A,0x5754,0x5E23,INVALC,0x6460,INVALC,INVALC,INVALC, + INVALC,0x6E49,INVALC,INVALC,INVALC,0x625D,INVALC,INVALC, + /* Block 133, Array index 0x4700 */ + INVALC,INVALC,INVALC,0x757E,0x542C,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5551,INVALC,0x5870,0x7843,0x6A57,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7557,INVALC,INVALC,0x583F,INVALC,INVALC,INVALC, + INVALC,0x7D40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B2D,INVALC,INVALC,INVALC,INVALC,0x552A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6728,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E4A, + INVALC,INVALC,INVALC,0x4A67,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7863,INVALC,0x545D,INVALC,INVALC,0x6A58,INVALC, + INVALC,INVALC,INVALC,0x7B59,0x6D77,INVALC,INVALC,0x6535, + INVALC,INVALC,INVALC,INVALC,INVALC,0x502D,INVALC,INVALC, + INVALC,INVALC,0x7171,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x623D,INVALC,INVALC,INVALC,0x6348,INVALC,INVALC,INVALC, + INVALC,0x5955,INVALC,INVALC,0x5F2A,INVALC,INVALC,INVALC, + INVALC,0x5B3C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7864,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x717A,INVALC,INVALC,0x6536,0x736F,INVALC,INVALC,0x7B5A, + 0x6160,INVALC,0x592C,INVALC,0x756B,INVALC,0x6036,INVALC, + INVALC,0x6948,INVALC,0x4B4F,INVALC,0x6349,INVALC,INVALC, + INVALC,0x5E6E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x623E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5C6F,INVALC,0x5625,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6271,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x567E,INVALC,INVALC,INVALC, + /* Block 134, Array index 0x4800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5921,INVALC,0x5840,0x5C5B,INVALC,INVALC,0x6D3D, + 0x5F38,INVALC,0x6A25,INVALC,INVALC,INVALC,0x572D,INVALC, + INVALC,0x7379,INVALC,0x6D78,INVALC,0x7547,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x614A,0x6B63,INVALC,0x725E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x784C,INVALC,0x6A59, + INVALC,0x5346,INVALC,0x5B66,INVALC,INVALC,INVALC,INVALC, + INVALC,0x752F,INVALC,INVALC,INVALC,INVALC,0x4E70,INVALC, + INVALC,INVALC,INVALC,0x697E,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6272,INVALC,INVALC,INVALC,INVALC, + 0x4F72,0x7739,0x5973,INVALC,INVALC,0x614B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A5D,INVALC,INVALC,0x5A39, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B7B, + INVALC,0x4B39,INVALC,INVALC,0x6D79,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6060,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7440,INVALC, + 0x7D3C,0x5F31,0x636F,INVALC,INVALC,INVALC,INVALC,0x6023, + 0x7D39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7031,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D4B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6D3E,INVALC,INVALC,INVALC,0x5540,0x6370,0x6D7A, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6964,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x556D,0x675D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5476,0x6537,INVALC,INVALC, + INVALC,0x5B67,0x623F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E4B, + INVALC,INVALC,0x5774,0x705D,INVALC,INVALC,INVALC,0x4E2B, + /* Block 135, Array index 0x4900 */ + INVALC,INVALC,0x675E,INVALC,INVALC,INVALC,0x5656,0x614C, + INVALC,INVALC,0x6833,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x656E,0x5C22, + INVALC,INVALC,0x6050,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5535,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5521, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7B5B,INVALC, + 0x794B,INVALC,INVALC,INVALC,0x4B73,0x7425,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A48,0x5657,INVALC,0x6965,0x7B5C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7D50, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7B76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5A25,INVALC,0x5B3D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C62,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4D77,0x705E,INVALC,INVALC,INVALC, + INVALC,0x7649,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5E6F, + INVALC,INVALC,INVALC,0x5331,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7C6E,INVALC,INVALC,INVALC, + INVALC,0x6843,INVALC,0x7148,INVALC,INVALC,INVALC,0x4E71, + INVALC,INVALC,INVALC,INVALC,0x796D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7274,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6436,INVALC, + /* Block 136, Array index 0x4A00 */ + 0x7539,INVALC,0x5C70,0x6371,INVALC,INVALC,INVALC,INVALC, + 0x6825,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x723B,INVALC,0x5E24,INVALC,0x5A4C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A69,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x635A,INVALC,0x7C59, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A5A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7944,INVALC, + 0x6324,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7B5D,INVALC,0x6F4A,INVALC, + 0x6844,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x554C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6B57,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x592D, + INVALC,INVALC,0x7B2B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5359,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5522,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x765E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A76,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6051,INVALC,INVALC,0x6928, + INVALC,INVALC,0x7579,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A2F,INVALC,0x6B7C,INVALC,INVALC,0x606A,INVALC, + /* Block 137, Array index 0x4B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,0x6332,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5545, + INVALC,INVALC,0x7163,0x556E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4D4C,INVALC,INVALC,INVALC,INVALC,0x6D59,INVALC, + INVALC,INVALC,INVALC,0x5841,INVALC,INVALC,INVALC,INVALC, + 0x7A6C,INVALC,INVALC,INVALC,INVALC,INVALC,0x716B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7A3C,0x6662,INVALC,INVALC, + INVALC,INVALC,0x7A65,0x627A,INVALC,INVALC,INVALC,0x4A36, + INVALC,0x6437,INVALC,0x6A5B,INVALC,0x757A,INVALC,INVALC, + INVALC,0x7B2C,0x4F43,0x6B7D,INVALC,INVALC,INVALC,INVALC, + 0x787A,INVALC,INVALC,0x5F39,INVALC,INVALC,INVALC,INVALC, + 0x6171,INVALC,0x5224,INVALC,INVALC,INVALC,INVALC,0x757B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x505A,0x505B, + INVALC,0x6A3E,0x5931,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A37,INVALC,INVALC,0x5367,INVALC,0x7865,INVALC,INVALC, + INVALC,INVALC,0x5332,INVALC,INVALC,INVALC,0x6240,0x725F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D65,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x792C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D4D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E2E,0x562E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x576A, + INVALC,INVALC,INVALC,INVALC,0x6760,0x6B2E,INVALC,INVALC, + INVALC,0x4F59,INVALC,INVALC,0x5C4D,0x6D7B,INVALC,0x5E70, + INVALC,0x576B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E25,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5F57,0x5B50,0x5B51,INVALC,INVALC, + 0x5523,INVALC,INVALC,INVALC,INVALC,0x7032,INVALC,INVALC, + /* Block 138, Array index 0x4C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5C5C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A68,INVALC,0x7866,0x5C4E,INVALC,INVALC,INVALC,INVALC, + 0x6A5C,0x5B52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6933,INVALC,INVALC, + INVALC,INVALC,0x775B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6328,INVALC, + 0x572E,INVALC,INVALC,0x6061,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4B3A,INVALC,INVALC,0x6551,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x505C, + INVALC,INVALC,INVALC,INVALC,0x5541,INVALC,INVALC,INVALC, + INVALC,INVALC,0x584A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6329,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6024, + INVALC,0x6929,INVALC,0x5347,INVALC,INVALC,0x5C5D,0x782E, + INVALC,INVALC,INVALC,0x4C38,INVALC,INVALC,INVALC,0x502E, + INVALC,INVALC,INVALC,0x5872,INVALC,INVALC,0x634A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C2F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x542D,0x7651,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x504C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A46,INVALC,INVALC,0x5542,INVALC,INVALC, + 0x4E3A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4A47,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7A30,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5F58,INVALC,INVALC,INVALC, + 0x753A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 139, Array index 0x4D00 */ + 0x656B,INVALC,0x6F74,0x5D35,INVALC,INVALC,INVALC,INVALC, + 0x4D2A,INVALC,0x6372,INVALC,0x7B77,INVALC,0x7750,INVALC, + INVALC,INVALC,INVALC,0x7D3A,INVALC,INVALC,0x7D61,0x767E, + 0x5140,INVALC,INVALC,0x6845,INVALC,0x6438,INVALC,0x6168, + INVALC,INVALC,INVALC,0x4C41,INVALC,0x526D,INVALC,INVALC, + INVALC,INVALC,0x5B3E,INVALC,INVALC,0x6062,INVALC,INVALC, + INVALC,0x7A49,INVALC,INVALC,0x614D,INVALC,0x4A38,INVALC, + INVALC,INVALC,0x7260,0x7149,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5E71,INVALC,INVALC,INVALC,0x705F,0x7844,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6E4C,INVALC,INVALC,0x5E72,INVALC, + 0x6749,INVALC,0x6273,0x6761,INVALC,INVALC,0x634B,INVALC, + INVALC,0x634C,INVALC,INVALC,INVALC,0x4F78,0x6F2C,INVALC, + 0x7D7E,0x7C25,0x7A31,0x5F59,INVALC,0x6052,INVALC,INVALC, + INVALC,0x745A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x714A,INVALC,0x4E23, + INVALC,INVALC,INVALC,INVALC,0x723C,0x6C63,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6025,INVALC,0x772B,INVALC,INVALC, + 0x6B2F,INVALC,INVALC,INVALC,INVALC,INVALC,0x655E,INVALC, + 0x6124,0x4D2B,INVALC,0x5974,0x6826,0x4D4E,0x6169,INVALC, + 0x7C6F,INVALC,0x6063,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6241,INVALC,0x4E24,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5E26,INVALC,INVALC,0x6B7E,INVALC,0x6B5D,0x7060, + INVALC,INVALC,0x745B,INVALC,0x6274,INVALC,INVALC,0x5348, + INVALC,INVALC,INVALC,0x746B,INVALC,0x6E35,INVALC,0x7558, + INVALC,INVALC,0x555F,INVALC,INVALC,INVALC,0x5665,INVALC, + INVALC,INVALC,INVALC,0x6B30,0x7463,INVALC,INVALC,INVALC, + INVALC,0x634D,INVALC,INVALC,INVALC,INVALC,0x7474,0x7A32, + INVALC,INVALC,0x6F75,0x4A5F,INVALC,0x6B31,0x6D3F,INVALC, + INVALC,0x7D49,INVALC,INVALC,INVALC,INVALC,0x6426,0x7924, + 0x7033,INVALC,0x656C,INVALC,INVALC,INVALC,0x5167,INVALC, + /* Block 140, Array index 0x4E00 */ + 0x5947,0x6457,0x6A5D,INVALC,0x5477,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5A3A,INVALC, + 0x5A4D,INVALC,INVALC,INVALC,0x794C,INVALC,0x615A,0x5B3F, + INVALC,0x4C45,0x6C50,0x4B3B,INVALC,0x5E73,INVALC,INVALC, + 0x692A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5948,INVALC,INVALC,0x6E63,0x573D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4F44,INVALC,INVALC,INVALC,INVALC, + INVALC,0x504D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7C26,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x717B,INVALC,INVALC,INVALC,INVALC,0x7D52,0x5141, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x635B,INVALC,0x5349,INVALC,0x5C4F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C6D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E27,INVALC,INVALC,0x663B, + 0x6C21,INVALC,INVALC,INVALC,0x4C39,INVALC,INVALC,0x7B5E, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6762,INVALC,INVALC, + 0x5441,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5C28,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6242,INVALC,0x7358,0x6553,INVALC,INVALC,0x7359,INVALC, + INVALC,INVALC,0x7346,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 141, Array index 0x4F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D5B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4D2C, + INVALC,0x7C43,INVALC,INVALC,INVALC,INVALC,0x5467,INVALC, + 0x5142,INVALC,0x7925,INVALC,0x6855,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x634E,INVALC,INVALC, + INVALC,INVALC,0x544A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5F5A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B5F,0x6763,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x787B,0x634F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7530,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5867,INVALC,0x5949,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x782F,0x6F76,INVALC, + 0x5D36,0x6E2F,0x4D78,INVALC,INVALC,INVALC,INVALC,0x5E38, + 0x7C27,0x777C,0x7731,0x4E3B,0x7421,INVALC,INVALC,0x6E4D, + 0x612E,INVALC,INVALC,0x6C43,0x4F7E,INVALC,0x783F,0x5862, + 0x5368,INVALC,INVALC,0x5E28,0x7464,0x6C42,INVALC,0x5975, + 0x7945,0x5D53,0x5671,0x6C7C,0x7C70,INVALC,INVALC,0x6D40, + 0x4A39,INVALC,0x6E64,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7261,INVALC,0x5E39,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5672,INVALC,0x5E74,INVALC,0x5F5B,INVALC, + 0x5B53,INVALC,0x7A67,0x5863,0x7441,INVALC,0x5D37,INVALC, + INVALC,INVALC,0x7275,INVALC,INVALC,0x542E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5673,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5D38,0x4F45,0x5F5F,INVALC,INVALC, + /* Block 142, Array index 0x5000 */ + INVALC,INVALC,INVALC,INVALC,0x723E,0x7621,INVALC,0x6B4B, + 0x717C,INVALC,0x7347,INVALC,INVALC,0x606B,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6D7C,INVALC,INVALC,0x615B,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6E65,INVALC,0x5E75,INVALC, + INVALC,INVALC,INVALC,0x7A53,INVALC,INVALC,INVALC,INVALC, + 0x714B,INVALC,INVALC,0x502F,0x5D39,INVALC,INVALC,0x5143, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7531,INVALC,INVALC, + INVALC,INVALC,0x6A46,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7061,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x762C,INVALC,INVALC,INVALC,INVALC, + 0x7559,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x706B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5D3A,INVALC,INVALC,INVALC,0x723F,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7745,INVALC, + INVALC,INVALC,INVALC,0x5B22,0x7276,INVALC,INVALC,0x4A3A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7775,INVALC,0x4B65,INVALC,INVALC, + INVALC,0x6E66,INVALC,0x6053,INVALC,INVALC,INVALC,INVALC, + 0x4E25,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5658, + INVALC,INVALC,INVALC,0x542F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 143, Array index 0x5100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6949,INVALC,INVALC,INVALC,INVALC,0x534E, + 0x7442,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B66,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7121,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B32,INVALC,INVALC,INVALC,INVALC,0x7122,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6B33,INVALC,0x7034,INVALC,INVALC,0x4B74, + 0x5430,0x7332,0x7B37,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x756C,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E67, + 0x7432,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x756D,INVALC,0x4F73,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7062,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E4E, + INVALC,INVALC,0x714C,INVALC,INVALC,0x6538,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5775,0x6373,0x4F65,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F46,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7333,0x6458,0x4F79,0x4F5A,INVALC,INVALC, + INVALC,INVALC,0x7A4D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6663, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7262,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x756E,INVALC,INVALC,0x4A3B,INVALC,INVALC,0x635C,INVALC, + /* Block 144, Array index 0x5200 */ + INVALC,INVALC,INVALC,0x4E72,INVALC,0x5659,INVALC,INVALC, + INVALC,0x6E30,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7465,0x5842,0x5C50,0x4C6E,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5560,0x764A,0x7D4A,0x5856,0x744F, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5626,0x5C3E, + INVALC,0x5B54,0x5747,INVALC,INVALC,INVALC,INVALC,0x727E, + INVALC,INVALC,INVALC,0x714D,INVALC,INVALC,INVALC,INVALC, + 0x6243,0x5C5E,INVALC,0x5C5F,INVALC,INVALC,0x6F2D,0x662B, + INVALC,INVALC,INVALC,INVALC,0x795D,0x6A3F,INVALC,INVALC, + INVALC,0x6F2E,INVALC,INVALC,INVALC,0x7450,0x4E73,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x662C,INVALC,0x4E5E, + INVALC,INVALC,0x5579,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6374,0x4D50,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5538,INVALC,INVALC,0x777D,INVALC, + 0x5C29,INVALC,INVALC,INVALC,INVALC,0x5E76,INVALC,0x5C2A, + 0x7263,0x6934,0x525C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6966,INVALC,INVALC,0x6376,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x674A,INVALC, + INVALC,0x504E,INVALC,INVALC,0x5A77,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4A3C,INVALC, + INVALC,INVALC,0x6E68,0x5A5E,INVALC,0x7277,INVALC,INVALC, + 0x627B,INVALC,0x4C26,INVALC,INVALC,INVALC,INVALC,0x5A3B, + INVALC,0x6E69,INVALC,INVALC,INVALC,0x755A,INVALC,INVALC, + /* Block 145, Array index 0x5300 */ + 0x775C,0x616A,0x4E41,0x5431,INVALC,0x7D31,0x663D,INVALC, + 0x7B2D,INVALC,INVALC,0x7867,INVALC,0x614E,INVALC,0x7762, + 0x756F,0x4F47,INVALC,INVALC,0x5432,0x4C6F,INVALC,0x5468, + INVALC,0x6E4F,0x7757,INVALC,INVALC,0x6026,0x5641,0x615C, + 0x7063,0x7164,0x5C71,0x5627,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7475,INVALC, + INVALC,0x714E,0x7264,INVALC,INVALC,0x5030,INVALC,INVALC, + 0x6C6F,INVALC,INVALC,INVALC,0x793A,INVALC,0x6B35,INVALC, + INVALC,0x546D,0x6244,INVALC,INVALC,INVALC,INVALC,0x6967, + INVALC,INVALC,0x6B34,0x6A21,INVALC,0x783C,0x4E26,INVALC, + 0x7946,0x7C5A,INVALC,0x5433,0x5339,0x6A5E,INVALC,INVALC, + INVALC,0x692B,INVALC,INVALC,0x6161,0x534F,0x7476,INVALC, + 0x6A40,0x614F,INVALC,0x4C3A,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E6A,INVALC,INVALC,INVALC,0x7064,0x7334,0x546E, + INVALC,INVALC,0x7240,INVALC,INVALC,0x7165,INVALC,0x7443, + 0x6054,INVALC,0x6B36,INVALC,0x5721,0x4B68,INVALC,0x792D, + 0x692D,0x5864,0x7A33,0x6245,0x7C3D,INVALC,INVALC,0x6C44, + 0x5831,INVALC,0x5C2B,INVALC,INVALC,INVALC,INVALC,0x5524, + INVALC,0x6B69,INVALC,INVALC,INVALC,0x683B,INVALC,INVALC, + INVALC,0x5857,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7B2E,0x5161,INVALC,INVALC,0x5B40,INVALC, + 0x753E,INVALC,0x5E77,INVALC,INVALC,INVALC,INVALC,0x4A7B, + 0x7746,0x4F48,INVALC,INVALC,INVALC,0x6150,INVALC,INVALC, + 0x6E50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6974,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x4E74,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x554D,INVALC, + INVALC,0x4F5B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5D3B,INVALC,INVALC,INVALC,INVALC,0x4E2C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6968,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5434,INVALC,INVALC, + /* Block 146, Array index 0x5400 */ + INVALC,INVALC,0x6447,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x755B,INVALC,INVALC,0x7A41,INVALC,INVALC, + INVALC,0x5E29,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5478, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6F77,INVALC,INVALC, + INVALC,INVALC,0x5333,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B37,0x6F78,0x755C,0x6D4C,0x5B55,0x714F,INVALC, + INVALC,INVALC,0x7150,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7532,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x592E,0x552C,INVALC,0x6246,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7D23,INVALC,0x7B65, + 0x5F2B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6275, + INVALC,0x762D,INVALC,0x7533,INVALC,0x7035,INVALC,INVALC, + INVALC,INVALC,0x6125,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x755D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6C22,0x6D7D,INVALC,0x7534,0x7B38, + INVALC,0x5B23,INVALC,INVALC,0x564A,0x4B59,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6554,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x737A, + INVALC,0x6B38,INVALC,0x6037,0x576C,0x716C,0x652F,0x5561, + 0x576D,0x5151,INVALC,INVALC,INVALC,INVALC,INVALC,0x6172, + 0x6F79,INVALC,INVALC,INVALC,0x5D3C,0x765C,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7065,INVALC,INVALC,INVALC,0x7444, + INVALC,INVALC,0x6969,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x737B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 147, Array index 0x5500 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x546F,INVALC,INVALC, + 0x4C22,0x777E,0x5F3C,INVALC,INVALC,INVALC,INVALC,0x6B4D, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5037,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5642,INVALC,INVALC,INVALC, + INVALC,INVALC,0x682D,INVALC,INVALC,INVALC,INVALC,0x6F2F, + 0x4B25,INVALC,INVALC,INVALC,INVALC,0x4B69,INVALC,INVALC, + INVALC,0x7A68,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4C46, + INVALC,INVALC,INVALC,0x6667,INVALC,INVALC,0x6A47,INVALC, + INVALC,INVALC,0x5B24,INVALC,0x4F49,0x627C,0x6F7A,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B5E,INVALC,INVALC,0x7548,INVALC,0x545E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6055,INVALC,0x6F30,INVALC,INVALC,0x6247,INVALC, + 0x592F,INVALC,INVALC,INVALC,0x7967,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6765,INVALC,INVALC,0x4F4A,0x6151, + INVALC,0x6248,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6F7B,INVALC,INVALC,0x7A79, + INVALC,INVALC,0x5C72,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6027,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7868,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4B6A,INVALC,INVALC,INVALC,0x4B3C,INVALC,INVALC,INVALC, + /* Block 148, Array index 0x5600 */ + INVALC,INVALC,INVALC,INVALC,0x5662,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x755E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x755F,INVALC,0x6E36,INVALC,INVALC,INVALC,0x6276,0x534A, + 0x6F7C,0x5144,0x6F31,INVALC,0x5145,INVALC,0x505E,INVALC, + 0x5961,INVALC,INVALC,0x6038,INVALC,INVALC,0x4D51,0x7339, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x674C,INVALC,0x5628,0x4E27,INVALC,0x5435,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6448,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5334,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6B39,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4B75,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x765D,INVALC,0x7123,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C47,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x694A,INVALC,0x6170,INVALC, + INVALC,INVALC,0x7560,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B2F,INVALC,INVALC,INVALC,0x4B51, + INVALC,INVALC,INVALC,INVALC,0x7B60,0x7265,INVALC,INVALC, + 0x6C70,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x706C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6E6B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x694B,INVALC, + INVALC,0x4C70,INVALC,INVALC,0x572F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7321,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 149, Array index 0x5700 */ + INVALC,INVALC,INVALC,INVALC,0x7C75,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7124,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6056,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6F32,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7451,INVALC,INVALC, + 0x7721,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7151,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4A7C,0x4A7D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E4E,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7348,INVALC,0x733A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 150, Array index 0x5800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6D7E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5A26,INVALC,INVALC,0x606C,INVALC,INVALC,INVALC,INVALC, + INVALC,0x784D,INVALC,0x4B52,INVALC,INVALC,INVALC,0x6B4E, + INVALC,0x7958,0x7959,0x4A60,0x5A4A,INVALC,INVALC,INVALC, + 0x4B26,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4A48,0x796E,0x5B6C,INVALC,INVALC, + 0x5031,INVALC,INVALC,INVALC,INVALC,0x556F,INVALC,INVALC, + INVALC,0x6673,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6722,0x6459,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6461, + INVALC,INVALC,0x7C44,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x796F,0x4F74,0x7766,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4E3C,INVALC,INVALC,INVALC, + INVALC,0x7445,0x5C23,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 151, Array index 0x5900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D3D,INVALC,INVALC,INVALC, + INVALC,0x7446,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x7821,INVALC,INVALC,INVALC,0x6856,INVALC, + INVALC,INVALC,0x5B41,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7066,INVALC,INVALC,INVALC,0x6439, + 0x766D,INVALC,0x792E,INVALC,0x5D3E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5730,0x5868,0x4B3D,INVALC,INVALC, + 0x795A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x784E,0x7970,0x606D,0x6333,0x7433, + INVALC,INVALC,0x6A42,0x7266,0x7036,INVALC,INVALC,INVALC, + INVALC,INVALC,0x5B56,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6B64,INVALC,INVALC,0x7267,INVALC,0x5755,0x5436,0x7968, + 0x5741,INVALC,INVALC,INVALC,INVALC,0x6555,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x696A,0x574C,INVALC, + INVALC,INVALC,0x5369,0x6249,INVALC,0x7C5B,0x4D2D,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4C30,0x6A22,INVALC,INVALC, + 0x6476,0x5040,INVALC,0x7037,0x6E21,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5776,INVALC,INVALC,INVALC,0x624A, + 0x624B,INVALC,0x7A4F,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6B5F,INVALC,INVALC,INVALC,INVALC,INVALC,0x564B, + INVALC,INVALC,INVALC,0x7434,INVALC,INVALC,INVALC,INVALC, + 0x6D4D,0x6452,INVALC,INVALC,0x6A29,0x643A,0x7322,0x4D52, + INVALC,0x764B,INVALC,0x7166,0x6D41,0x683C,0x6E51,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7067,0x624C,INVALC, + INVALC,0x642A,INVALC,0x7561,0x6D5A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x576E,0x5171,INVALC,INVALC,INVALC,INVALC, + 0x696B,0x696C,0x6064,INVALC,INVALC,INVALC,INVALC,0x5A27, + 0x5D54,INVALC,0x6A23,INVALC,INVALC,INVALC,0x5643,0x5674, + INVALC,0x5A5F,INVALC,0x6F33,INVALC,INVALC,INVALC,INVALC, + /* Block 152, Array index 0x5A00 */ + 0x624D,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F7D,0x7268, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6F45,INVALC,0x6767,INVALC,INVALC,0x577D,INVALC, + INVALC,0x674E,INVALC,INVALC,0x5F5C,INVALC,0x7947,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5976, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5F2C,INVALC,0x565A,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5C24,INVALC,INVALC,INVALC,0x7038,INVALC,INVALC, + INVALC,INVALC,0x557A,INVALC,0x6477,INVALC,INVALC,INVALC, + 0x5644,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x746C,INVALC,INVALC,INVALC,INVALC,0x6F7E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7021,INVALC,0x5E2A,INVALC, + INVALC,0x5A3C,0x587C,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A54,INVALC,INVALC,INVALC,0x6C65,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7C28,INVALC,INVALC,0x6C66, + INVALC,INVALC,0x584B,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B39,INVALC,0x6453,INVALC,0x4D79, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4F53,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4A6A,INVALC,INVALC,0x4F54,INVALC,0x783D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7447,INVALC, + INVALC,INVALC,INVALC,0x6A5F,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x795B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5437,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6B65,INVALC,INVALC,0x6152,INVALC, + INVALC,INVALC,INVALC,0x6A24,INVALC,INVALC,INVALC,0x7A42, + /* Block 153, Array index 0x5B00 */ + 0x7B61,0x7A6D,0x7022,0x4C71,INVALC,0x7A23,0x6277,INVALC, + 0x624E,INVALC,0x6975,INVALC,0x616B,INVALC,INVALC,INVALC, + 0x6768,0x6857,0x5A78,0x544B,INVALC,INVALC,INVALC,0x7776, + 0x5645,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5469,INVALC,INVALC, + 0x7A7A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4C72,0x775D,INVALC,0x5E3A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4E28,INVALC, + INVALC,INVALC,INVALC,INVALC,0x7039,0x647E,0x6449,INVALC, + INVALC,INVALC,INVALC,INVALC,0x6454,INVALC,INVALC,INVALC, + 0x6A43,INVALC,0x6F34,INVALC,INVALC,INVALC,0x573E,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7B62,INVALC,0x4D53, + INVALC,INVALC,INVALC,0x6F35,INVALC,INVALC,INVALC,0x7A69, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7926,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5F3D, + INVALC,0x7747,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x787D,INVALC,INVALC,0x787C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E2B,0x5B68,INVALC,INVALC,0x635D, + INVALC,0x6162,0x5146,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7650,0x6B66,0x5A79, + INVALC,INVALC,INVALC,INVALC,0x6C47,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5E78,0x7869,0x635E,INVALC, + /* Block 154, Array index 0x5C00 */ + INVALC,INVALC,INVALC,0x4E75,INVALC,INVALC,INVALC,INVALC, + INVALC,0x7A43,0x6557,INVALC,0x6C48,INVALC,INVALC,INVALC, + 0x7349,INVALC,INVALC,0x643B,INVALC,INVALC,INVALC,INVALC, + 0x662E,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F36,INVALC, + 0x5C3F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4E3D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5843,INVALC,INVALC, + INVALC,0x504F,INVALC,0x4F7A,0x734A,0x6057,INVALC,INVALC, + INVALC,0x5147,0x692E,INVALC,0x683D,INVALC,INVALC,0x7A44, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x624F,INVALC, + INVALC,0x7A45,INVALC,INVALC,INVALC,0x7938,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5C60,INVALC,INVALC, + 0x7B30,INVALC,INVALC,INVALC,0x5829,0x655F,0x7927,INVALC, + INVALC,0x766E,INVALC,0x764C,0x6278,INVALC,INVALC,INVALC, + INVALC,0x6C71,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5A60,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7152,0x524C,0x4F4B,INVALC,INVALC,0x4A3D,INVALC,INVALC, + INVALC,0x5D3F,INVALC,INVALC,INVALC,0x766F,INVALC,0x5E79, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7A34,INVALC,INVALC, + INVALC,0x552D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x7167, + /* Block 155, Array index 0x5D00 */ + INVALC,0x5E3E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5C40,INVALC,INVALC,INVALC,INVALC,INVALC,0x5148,0x5149, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x783E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4B76,INVALC,INVALC,INVALC,INVALC, + 0x5479,INVALC,INVALC,INVALC,INVALC,INVALC,0x7562,0x6153, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x5869,INVALC,INVALC,0x787E,INVALC,0x4F4C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7D24,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4E76,INVALC,0x7A50, + INVALC,INVALC,0x4C73,0x663E,INVALC,INVALC,INVALC,0x762E, + INVALC,INVALC,0x5570,INVALC,INVALC,0x514A,INVALC,INVALC, + INVALC,0x7C3E,0x5571,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4D69,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7A35,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6250,0x7477,INVALC,INVALC,INVALC, + 0x4D54,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6723,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5B25,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 156, Array index 0x5E00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6251,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5722, + INVALC,INVALC,0x7763,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x6A26,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5021,INVALC,INVALC,INVALC, + INVALC,0x4E5A,0x7B6B,0x5B26,0x5B5E,0x5865,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6A60, + INVALC,INVALC,INVALC,INVALC,0x582A,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6560,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x565B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6F46,INVALC, + INVALC,0x786A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6455, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4E77,INVALC,INVALC,0x6058,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x576F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x746D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D66,INVALC,INVALC,INVALC, + 0x4C74,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 157, Array index 0x5F00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7563,INVALC,INVALC, + 0x644A,INVALC,0x5C61,INVALC,INVALC,0x7948,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7C3F,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6827,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5844,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4B3E, + INVALC,0x5C2E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x5777, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x7068,INVALC,0x5D40, + INVALC,0x4F4D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5C73,0x5930,INVALC,0x6669,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 158, Array index 0x6000 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x643C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x6A44,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x646C,INVALC, + 0x6465,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x7B78,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4C3B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x643D,INVALC,INVALC, + 0x4D5C,0x5977,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5D5F,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6D4E,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x5950,INVALC,INVALC,INVALC,INVALC,INVALC,0x6523, + INVALC,INVALC,INVALC,INVALC,0x794D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4D2E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4F4E, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x762F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x7D53,0x6B6D,0x565C,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 159, Array index 0x6100 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x6524,INVALC,INVALC,INVALC,0x5536,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x565D,INVALC,INVALC, + INVALC,0x7969,INVALC,INVALC,INVALC,0x6724,INVALC,0x5663, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x514B,0x5664,INVALC,INVALC,INVALC,0x5572, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5E7A,INVALC,0x5778, + INVALC,INVALC,INVALC,INVALC,INVALC,0x586A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F55,0x587D,INVALC,INVALC, + INVALC,INVALC,INVALC,0x582B,INVALC,INVALC,0x7D4B,INVALC, + INVALC,INVALC,INVALC,0x7C5C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x6028,0x5573,INVALC, + INVALC,0x7D59,INVALC,INVALC,0x4C23,INVALC,INVALC,INVALC, + 0x5979,INVALC,INVALC,0x536A,0x7575,INVALC,0x6F47,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x535A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x5A3D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 160, Array index 0x6200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6828, + 0x5C2F,INVALC,INVALC,INVALC,INVALC,INVALC,0x7023,INVALC, + INVALC,INVALC,INVALC,0x4D55,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x6029,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x5E2C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,0x703A,0x6E31,INVALC,INVALC,0x6E32,INVALC, + INVALC,INVALC,0x764D,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x6E52, + INVALC,0x5646,INVALC,INVALC,INVALC,INVALC,INVALC,0x6065, + INVALC,INVALC,0x733B,INVALC,0x6561,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x644B, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x5723,INVALC,INVALC, + 0x5B42,INVALC,INVALC,INVALC,INVALC,0x4A7E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4F4F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 173, Array index 0x6300 */ + 0x3021,0x3022,INVALC,INVALC,0x3023,INVALC,INVALC,0x3024, + 0x3025,0x3026,0x3027,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3028,0x3029,0x302A,0x302B,0x302C,0x302D,0x302E,0x302F, + INVALC,0x3030,0x3031,0x3032,0x3033,0x3034,INVALC,INVALC, + 0x3035,INVALC,INVALC,INVALC,0x3036,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3037,0x3038,INVALC,0x3039, + 0x303A,0x303B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x303C,0x303D,INVALC,INVALC,0x303E,INVALC,INVALC,INVALC, + 0x303F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3040,INVALC,0x3041,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3042,INVALC,INVALC,INVALC, + 0x3043,INVALC,INVALC,INVALC,0x3044,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3045,0x3046,INVALC,INVALC,0x3047,INVALC,INVALC,0x3048, + 0x3049,INVALC,0x304A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x304B,0x304C,INVALC,0x304D,0x304E,0x304F,0x3050,INVALC, + INVALC,0x3051,0x3052,0x3053,0x3054,INVALC,INVALC,INVALC, + 0x3055,INVALC,INVALC,INVALC,0x3056,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3057,0x3058,INVALC,0x3059, + 0x305A,0x305B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x305C,0x305D,0x305E,INVALC,0x305F,INVALC,INVALC,0x3060, + 0x3061,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3062,0x3063,INVALC,0x3064,0x3065,0x3066,INVALC,INVALC, + INVALC,0x3067,INVALC,INVALC,0x3068,INVALC,INVALC,INVALC, + 0x3069,INVALC,INVALC,INVALC,0x306A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x306B,INVALC,0x306C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x306D,0x306E,INVALC,INVALC,0x306F,INVALC,INVALC,0x3070, + 0x3071,INVALC,0x3072,INVALC,0x3073,INVALC,INVALC,0x3074, + 0x3075,0x3076,INVALC,0x3077,INVALC,0x3078,0x3079,INVALC, + INVALC,INVALC,INVALC,INVALC,0x307A,0x307B,INVALC,INVALC, + /* Block 174, Array index 0x6400 */ + 0x307C,INVALC,INVALC,INVALC,0x307D,INVALC,0x307E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3121,0x3122,INVALC,0x3123, + INVALC,0x3124,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3125,INVALC,INVALC,INVALC,0x3126,INVALC,INVALC,INVALC, + 0x3127,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3128,INVALC,INVALC,0x3129,0x312A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x312B,0x312C,INVALC,INVALC, + 0x312D,INVALC,INVALC,INVALC,0x312E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x312F,0x3130,INVALC,0x3131, + INVALC,0x3132,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3133,INVALC,INVALC,INVALC,0x3134,INVALC,INVALC,INVALC, + 0x3135,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3136,INVALC,0x3137,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3138,0x3139,INVALC,INVALC, + 0x313A,INVALC,INVALC,0x313B,0x313C,0x313D,0x313E,INVALC, + INVALC,INVALC,INVALC,0x313F,0x3140,0x3141,INVALC,0x3142, + INVALC,0x3143,0x3144,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3145,0x3146,INVALC,INVALC,0x3147,INVALC,INVALC,INVALC, + 0x3148,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3149,0x314A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x314B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x314C, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x314D,0x314E,INVALC,INVALC,0x314F,INVALC,INVALC,INVALC, + 0x3150,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3151,0x3152,INVALC,0x3153,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3154,INVALC,INVALC,INVALC, + 0x3155,INVALC,INVALC,INVALC,0x3156,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3157,0x3158,INVALC,INVALC,0x3159,INVALC,INVALC,0x315A, + /* Block 175, Array index 0x6500 */ + 0x315B,0x315C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x315D,0x315E,INVALC,0x315F,INVALC,0x3160,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3161,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3162,0x3163,INVALC,INVALC,0x3164,INVALC,INVALC,0x3165, + 0x3166,INVALC,0x3167,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3168,0x3169,INVALC,0x316A,INVALC,0x316B,0x316C,INVALC, + INVALC,INVALC,0x316D,INVALC,0x316E,0x316F,0x3170,INVALC, + 0x3171,INVALC,INVALC,INVALC,0x3172,INVALC,0x3173,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3174,0x3175,INVALC,0x3176, + 0x3177,0x3178,INVALC,INVALC,INVALC,0x3179,INVALC,INVALC, + 0x317A,0x317B,INVALC,INVALC,0x317C,INVALC,INVALC,INVALC, + 0x317D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x317E,0x3221,INVALC,0x3222,0x3223,0x3224,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3225,0x3226,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3227,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3228,0x3229,0x322A,INVALC, + 0x322B,INVALC,INVALC,INVALC,0x322C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x322D,0x322E,INVALC,0x322F, + 0x3230,0x3231,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3232,0x3233,INVALC,INVALC,0x3234,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3235,INVALC,INVALC,0x3236,INVALC,0x3237,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3238,INVALC,INVALC,INVALC, + 0x3239,INVALC,INVALC,INVALC,0x323A,INVALC,INVALC,INVALC, + /* Block 176, Array index 0x6600 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x323B, + 0x323C,INVALC,INVALC,INVALC,INVALC,0x323D,INVALC,INVALC, + 0x323E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x323F,0x3240,INVALC,INVALC, + 0x3241,INVALC,0x3242,INVALC,0x3243,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3244,0x3245,INVALC,0x3246, + INVALC,0x3247,0x3248,0x3249,INVALC,INVALC,INVALC,INVALC, + 0x324A,0x324B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x324C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x324D,0x324E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x324F,0x3250,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3251,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3252,INVALC,INVALC,INVALC,0x3253,INVALC,INVALC,INVALC, + 0x3254,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3255,0x3256,INVALC,INVALC,INVALC,0x3257,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3258,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3259,0x325A,INVALC,INVALC,0x325B,INVALC,INVALC,INVALC, + 0x325C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x325D, + 0x325E,0x325F,INVALC,0x3260,INVALC,0x3261,0x3262,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3263,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3264,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3265,0x3266,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3267,0x3268,INVALC,INVALC,0x3269,INVALC,INVALC,INVALC, + 0x326A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 177, Array index 0x6700 */ + 0x326B,0x326C,INVALC,INVALC,0x326D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x326E,INVALC,INVALC,INVALC, + 0x326F,INVALC,INVALC,INVALC,0x3270,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3271,0x3272,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3273,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3274,0x3275,INVALC,INVALC, + 0x3276,INVALC,0x3277,INVALC,0x3278,INVALC,0x3279,INVALC, + INVALC,INVALC,INVALC,0x327A,0x327B,0x327C,INVALC,0x327D, + INVALC,0x327E,INVALC,INVALC,INVALC,0x3321,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3322,0x3323,INVALC,INVALC, + 0x3324,INVALC,INVALC,INVALC,0x3325,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3326,0x3327,INVALC,0x3328, + INVALC,0x3329,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x332A,0x332B,0x332C,INVALC,0x332D,INVALC,INVALC,0x332E, + 0x332F,0x3330,0x3331,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3332,0x3333,INVALC,0x3334,0x3335,0x3336,0x3337,0x3338, + INVALC,0x3339,INVALC,0x333A,0x333B,0x333C,INVALC,INVALC, + 0x333D,INVALC,INVALC,INVALC,0x333E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x333F,0x3340,INVALC,0x3341, + 0x3342,0x3343,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3344,0x3345,INVALC,INVALC,0x3346,INVALC,INVALC,INVALC, + 0x3347,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3348,INVALC,INVALC,INVALC,INVALC,0x3349,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 178, Array index 0x6800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x334A,0x334B,INVALC,0x334C,0x334D,INVALC,INVALC,INVALC, + 0x334E,INVALC,0x334F,0x3350,INVALC,INVALC,INVALC,INVALC, + 0x3351,0x3352,INVALC,0x3353,0x3354,0x3355,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3356,0x3357,0x3358,INVALC,INVALC, + 0x3359,INVALC,INVALC,INVALC,0x335A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x335B,0x335C,INVALC,0x335D, + 0x335E,0x335F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3360,0x3361,INVALC,INVALC,0x3362,INVALC,INVALC,INVALC, + 0x3363,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3364,0x3365,INVALC,INVALC,0x3366,0x3367,INVALC,INVALC, + 0x3368,INVALC,INVALC,INVALC,0x3369,INVALC,INVALC,INVALC, + 0x336A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x336B,0x336C,INVALC,INVALC,0x336D,INVALC,INVALC,INVALC, + 0x336E,INVALC,0x336F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3370,0x3371,INVALC,0x3372,INVALC,0x3373,INVALC,INVALC, + INVALC,INVALC,0x3374,0x3375,0x3376,INVALC,INVALC,INVALC, + 0x3377,INVALC,INVALC,INVALC,0x3378,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3379,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x337A,INVALC,INVALC,INVALC, + 0x337B,INVALC,INVALC,INVALC,0x337C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x337D,0x337E,INVALC,0x3421, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3422,0x3423,INVALC,INVALC,0x3424,INVALC,INVALC,INVALC, + 0x3425,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3426,INVALC,0x3427,INVALC,0x3428,INVALC,INVALC, + /* Block 179, Array index 0x6900 */ + INVALC,INVALC,INVALC,INVALC,0x3429,0x342A,INVALC,INVALC, + 0x342B,INVALC,INVALC,0x342C,0x342D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x342E,0x342F,INVALC,0x3430, + INVALC,0x3431,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3432,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3433,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3434,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3435,INVALC,INVALC,INVALC,0x3436,INVALC,INVALC,INVALC, + 0x3437,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3438,0x3439,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x343A,0x343B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x343C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x343D,0x343E,INVALC,INVALC, + INVALC,0x343F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3440,0x3441,INVALC,INVALC,0x3442,INVALC,INVALC,INVALC, + 0x3443,0x3444,0x3445,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3446,0x3447,INVALC,0x3448,INVALC,0x3449,0x344A,INVALC, + INVALC,INVALC,0x344B,INVALC,0x344C,INVALC,INVALC,INVALC, + 0x344D,INVALC,INVALC,INVALC,0x344E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x344F,0x3450,INVALC,INVALC,0x3451,INVALC,INVALC,INVALC, + 0x3452,INVALC,0x3453,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3454,0x3455,INVALC,0x3456,INVALC,0x3457,INVALC,INVALC, + INVALC,INVALC,0x3458,INVALC,0x3459,0x345A,0x345B,INVALC, + 0x345C,INVALC,INVALC,0x345D,0x345E,0x345F,0x3460,0x3461, + INVALC,INVALC,INVALC,0x3462,0x3463,0x3464,INVALC,0x3465, + 0x3466,0x3467,0x3468,0x3469,INVALC,INVALC,INVALC,0x346A, + /* Block 180, Array index 0x6A00 */ + 0x346B,0x346C,INVALC,INVALC,0x346D,INVALC,INVALC,INVALC, + 0x346E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x346F,0x3470,INVALC,0x3471,0x3472,0x3473,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3474,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3475,0x3476,0x3477,INVALC, + 0x3478,INVALC,INVALC,0x3479,0x347A,INVALC,0x347B,0x347C, + INVALC,INVALC,INVALC,INVALC,0x347D,0x347E,INVALC,0x3521, + INVALC,0x3522,INVALC,0x3523,INVALC,INVALC,0x3524,INVALC, + 0x3525,0x3526,INVALC,INVALC,0x3527,INVALC,INVALC,INVALC, + 0x3528,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3529,0x352A,INVALC,0x352B,0x352C,0x352D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x352E,INVALC,INVALC,INVALC, + 0x352F,INVALC,INVALC,INVALC,0x3530,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3531,0x3532,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3533,INVALC,INVALC,INVALC,0x3534,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3535,0x3536,INVALC,INVALC, + 0x3537,INVALC,INVALC,0x3538,0x3539,INVALC,0x353A,INVALC, + 0x353B,INVALC,INVALC,INVALC,0x353C,0x353D,INVALC,0x353E, + INVALC,0x353F,INVALC,0x3540,INVALC,0x3541,INVALC,INVALC, + 0x3542,INVALC,INVALC,INVALC,0x3543,INVALC,INVALC,INVALC, + 0x3544,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3545,INVALC,INVALC,INVALC, + /* Block 181, Array index 0x6B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3546,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3547,INVALC,INVALC,INVALC,0x3548,INVALC,INVALC,INVALC, + 0x3549,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x354A,0x354B,INVALC,0x354C,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x354D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x354E,0x354F,INVALC,INVALC,0x3550,INVALC,INVALC,INVALC, + 0x3551,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3552,0x3553,INVALC,0x3554,INVALC,0x3555,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3556,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3557,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3558,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3559,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x355A,INVALC,INVALC,INVALC, + 0x355B,INVALC,INVALC,INVALC,0x355C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x355D,INVALC,0x355E, + INVALC,0x355F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3560,INVALC,INVALC,INVALC,0x3561,INVALC,INVALC,INVALC, + 0x3562,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3563,INVALC,INVALC,INVALC,INVALC,0x3564,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3565,0x3566,INVALC,INVALC, + 0x3567,INVALC,INVALC,0x3568,0x3569,INVALC,0x356A,INVALC, + INVALC,INVALC,INVALC,INVALC,0x356B,0x356C,INVALC,0x356D, + INVALC,0x356E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x356F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 182, Array index 0x6C00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3570,0x3571,INVALC,INVALC, + 0x3572,INVALC,INVALC,0x3573,0x3574,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3575,0x3576,INVALC,0x3577, + 0x3578,0x3579,0x357A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x357B,0x357C,INVALC,INVALC,0x357D,INVALC,INVALC,INVALC, + 0x357E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3621,0x3622,INVALC,0x3623,0x3624,0x3625,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3626,0x3627,0x3628,INVALC,INVALC, + 0x3629,INVALC,INVALC,INVALC,0x362A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x362B,0x362C,INVALC,0x362D, + 0x362E,0x362F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3630,0x3631,INVALC,INVALC,0x3632,INVALC,INVALC,INVALC, + 0x3633,INVALC,0x3634,0x3635,INVALC,INVALC,INVALC,INVALC, + 0x3636,0x3637,INVALC,0x3638,0x3639,0x363A,INVALC,INVALC, + INVALC,INVALC,INVALC,0x363B,0x363C,0x363D,INVALC,INVALC, + 0x363E,INVALC,INVALC,INVALC,0x363F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3640,0x3641,INVALC,0x3642, + 0x3643,0x3644,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3645,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3646,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 183, Array index 0x6D00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3647,0x3648,INVALC,INVALC,0x3649,INVALC,INVALC,INVALC, + 0x364A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x364B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x364C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x364D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x364E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x364F,INVALC,INVALC,INVALC, + 0x3650,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3651,0x3652,INVALC,INVALC, + 0x3653,INVALC,INVALC,INVALC,0x3654,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3655,0x3656,INVALC,INVALC,INVALC, + INVALC,0x3657,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3658,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3659,INVALC,INVALC,INVALC,0x365A,INVALC,INVALC,INVALC, + 0x365B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 184, Array index 0x6E00 */ + 0x365C,0x365D,INVALC,INVALC,INVALC,0x365E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x365F,0x3660,INVALC,INVALC,0x3661,INVALC,INVALC,0x3662, + 0x3663,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3664,0x3665,INVALC,0x3666,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3667,INVALC,INVALC,INVALC, + 0x3668,INVALC,INVALC,INVALC,0x3669,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x366A,0x366B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x366C,INVALC,INVALC,INVALC,0x366D,INVALC,INVALC,INVALC, + 0x366E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x366F,0x3670,INVALC,0x3671,INVALC,0x3672,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3673,0x3674,INVALC,INVALC, + 0x3675,INVALC,INVALC,INVALC,0x3676,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3677,0x3678,INVALC,0x3679, + 0x367A,0x367B,0x367C,INVALC,INVALC,INVALC,0x367D,0x367E, + 0x3721,0x3722,INVALC,INVALC,0x3723,INVALC,INVALC,INVALC, + 0x3724,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3725,0x3726,INVALC,0x3727,0x3728,0x3729,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x372A,0x372B,INVALC,INVALC, + 0x372C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x372D, + INVALC,0x372E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x372F,0x3730,INVALC,INVALC, + 0x3731,INVALC,INVALC,INVALC,0x3732,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3733,0x3734,INVALC,0x3735, + /* Block 185, Array index 0x6F00 */ + 0x3736,0x3737,INVALC,INVALC,INVALC,INVALC,INVALC,0x3738, + 0x3739,0x373A,INVALC,INVALC,0x373B,INVALC,INVALC,INVALC, + 0x373C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x373D,0x373E,INVALC,0x373F,INVALC,0x3740,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3741,0x3742,INVALC,INVALC, + 0x3743,INVALC,INVALC,INVALC,0x3744,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3745,0x3746,INVALC,0x3747, + 0x3748,0x3749,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x374A,INVALC,INVALC,INVALC,0x374B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x374C,INVALC,0x374D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x374E,0x374F,INVALC,INVALC, + 0x3750,INVALC,INVALC,INVALC,0x3751,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3752,0x3753,INVALC,0x3754, + INVALC,0x3755,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3756,INVALC,INVALC,INVALC,0x3757,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3758,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3759,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x375A,INVALC,INVALC,INVALC,0x375B,INVALC,INVALC,INVALC, + 0x375C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x375D,0x375E,INVALC,0x375F,INVALC,0x3760,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3761,INVALC,INVALC,INVALC, + 0x3762,INVALC,INVALC,INVALC,0x3763,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3764,INVALC,0x3765, + INVALC,0x3766,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3767,0x3768,INVALC,INVALC,0x3769,INVALC,INVALC,INVALC, + 0x376A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x376B,0x376C,INVALC,0x376D,INVALC,0x376E,INVALC,INVALC, + /* Block 186, Array index 0x7000 */ + INVALC,INVALC,INVALC,INVALC,0x376F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3770,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3771,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3772,0x3773,INVALC,INVALC, + 0x3774,INVALC,INVALC,INVALC,0x3775,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3776,INVALC,INVALC,0x3777, + INVALC,0x3778,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3779,0x377A,INVALC,INVALC,0x377B,INVALC,INVALC,INVALC, + 0x377C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x377D,0x377E,INVALC,0x3821,INVALC,0x3822,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3823,0x3824,INVALC,INVALC, + 0x3825,INVALC,INVALC,INVALC,0x3826,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3827,0x3828,INVALC,0x3829, + INVALC,0x382A,0x382B,INVALC,INVALC,0x382C,0x382D,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x382E,0x382F,INVALC,INVALC, + 0x3830,INVALC,INVALC,INVALC,0x3831,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3832,0x3833,INVALC,0x3834, + INVALC,0x3835,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3836,0x3837,INVALC,INVALC,0x3838,INVALC,0x3839,0x383A, + 0x383B,0x383C,0x383D,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x383E,0x383F,INVALC,0x3840,INVALC,0x3841,0x3842,INVALC, + INVALC,0x3843,INVALC,0x3844,0x3845,0x3846,INVALC,INVALC, + 0x3847,INVALC,INVALC,INVALC,0x3848,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3849,0x384A,INVALC,0x384B, + 0x384C,0x384D,0x384E,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 187, Array index 0x7100 */ + 0x384F,0x3850,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3851,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3852,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3853,0x3854,INVALC,INVALC,0x3855,INVALC,INVALC,INVALC, + 0x3856,INVALC,0x3857,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3858,0x3859,INVALC,0x385A,INVALC,0x385B,0x385C,INVALC, + INVALC,INVALC,INVALC,0x385D,0x385E,0x385F,INVALC,INVALC, + 0x3860,INVALC,INVALC,INVALC,0x3861,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3862,0x3863,INVALC,0x3864, + 0x3865,0x3866,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3867,0x3868,INVALC,INVALC,0x3869,INVALC,INVALC,INVALC, + 0x386A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x386B,0x386C,0x386D,INVALC,0x386E, + INVALC,INVALC,INVALC,INVALC,0x386F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3870,0x3871,INVALC,0x3872,0x3873,INVALC,INVALC,INVALC, + 0x3874,INVALC,0x3875,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3876,0x3877,INVALC,0x3878,INVALC,0x3879,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x387A,INVALC,INVALC,INVALC, + 0x387B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x387C,0x387D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x387E,INVALC,INVALC,INVALC, + /* Block 188, Array index 0x7200 */ + 0x3921,INVALC,INVALC,INVALC,0x3922,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3923,INVALC,0x3924, + INVALC,0x3925,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3926,INVALC,INVALC,INVALC,0x3927,INVALC,INVALC,INVALC, + 0x3928,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3929,INVALC,0x392A,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x392B,0x392C,0x392D,INVALC, + 0x392E,INVALC,INVALC,0x392F,0x3930,0x3931,0x3932,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3933,0x3934,INVALC,0x3935, + INVALC,0x3936,INVALC,INVALC,INVALC,0x3937,INVALC,0x3938, + 0x3939,INVALC,INVALC,INVALC,0x393A,INVALC,INVALC,INVALC, + 0x393B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x393C,INVALC,0x393D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x393E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x393F,INVALC,INVALC,INVALC,0x3940,INVALC,INVALC,INVALC, + 0x3941,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3942,INVALC,INVALC,INVALC, + 0x3943,INVALC,INVALC,INVALC,0x3944,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3945,INVALC,INVALC,0x3946, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3947,INVALC,INVALC,INVALC,0x3948,INVALC,INVALC,INVALC, + 0x3949,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x394A,INVALC,INVALC,0x394B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x394C,0x394D,INVALC,INVALC,0x394E,INVALC,INVALC,0x394F, + /* Block 189, Array index 0x7300 */ + 0x3950,INVALC,0x3951,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3952,0x3953,INVALC,0x3954,0x3955,0x3956,INVALC,0x3957, + INVALC,0x3958,INVALC,INVALC,0x3959,0x395A,0x395B,0x395C, + 0x395D,INVALC,INVALC,0x395E,0x395F,0x3960,0x3961,0x3962, + INVALC,INVALC,INVALC,INVALC,0x3963,0x3964,INVALC,0x3965, + INVALC,0x3966,INVALC,INVALC,INVALC,0x3967,INVALC,INVALC, + 0x3968,0x3969,INVALC,INVALC,0x396A,INVALC,INVALC,INVALC, + 0x396B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x396C,0x396D,INVALC,0x396E,0x396F,0x3970,INVALC,INVALC, + INVALC,0x3971,INVALC,INVALC,0x3972,0x3973,INVALC,INVALC, + 0x3974,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3975,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3976,0x3977,INVALC,INVALC, + 0x3978,INVALC,INVALC,0x3979,0x397A,INVALC,0x397B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x397C,0x397D,INVALC,0x397E, + INVALC,0x3A21,0x3A22,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A23,0x3A24,INVALC,INVALC,0x3A25,INVALC,INVALC,0x3A26, + 0x3A27,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A28,0x3A29,INVALC,0x3A2A,0x3A2B,0x3A2C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A2D,0x3A2E,INVALC,INVALC, + 0x3A2F,INVALC,INVALC,INVALC,0x3A30,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3A31,INVALC,0x3A32, + 0x3A33,0x3A34,INVALC,INVALC,INVALC,0x3A35,INVALC,INVALC, + 0x3A36,INVALC,INVALC,INVALC,0x3A37,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A38,0x3A39,0x3A3A,INVALC, + 0x3A3B,INVALC,INVALC,INVALC,0x3A3C,INVALC,INVALC,INVALC, + /* Block 190, Array index 0x7400 */ + INVALC,INVALC,INVALC,INVALC,0x3A3D,0x3A3E,INVALC,0x3A3F, + INVALC,0x3A40,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A41,INVALC,INVALC,INVALC,0x3A42,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A43,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A44,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A45,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A46,0x3A47,INVALC,INVALC,0x3A48,INVALC,INVALC,INVALC, + 0x3A49,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A4A,0x3A4B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A4C,INVALC,INVALC,INVALC, + 0x3A4D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A4E,0x3A4F,INVALC,INVALC,0x3A50,INVALC,INVALC,0x3A51, + 0x3A52,0x3A53,0x3A54,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A55,0x3A56,INVALC,0x3A57,INVALC,0x3A58,INVALC,INVALC, + INVALC,0x3A59,0x3A5A,INVALC,0x3A5B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A5C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A5D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A5E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A5F,0x3A60,INVALC,INVALC, + 0x3A61,INVALC,INVALC,INVALC,0x3A62,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3A63,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3A64,INVALC,INVALC,INVALC,0x3A65,INVALC,INVALC,INVALC, + 0x3A66,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 191, Array index 0x7500 */ + 0x3A67,INVALC,INVALC,0x3A68,INVALC,0x3A69,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A6A,0x3A6B,INVALC,INVALC, + 0x3A6C,INVALC,INVALC,INVALC,0x3A6D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A6E,0x3A6F,INVALC,0x3A70, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A71,0x3A72,INVALC,INVALC, + 0x3A73,INVALC,INVALC,INVALC,0x3A74,INVALC,0x3A75,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3A76,0x3A77,INVALC,0x3A78, + INVALC,0x3A79,0x3A7A,0x3A7B,INVALC,INVALC,INVALC,INVALC, + 0x3A7C,0x3A7D,INVALC,INVALC,0x3A7E,INVALC,INVALC,INVALC, + 0x3B21,INVALC,0x3B22,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B23,0x3B24,INVALC,0x3B25,0x3B26,0x3B27,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3B28,0x3B29,0x3B2A,INVALC,INVALC, + 0x3B2B,INVALC,INVALC,INVALC,0x3B2C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B2D,0x3B2E,INVALC,0x3B2F, + 0x3B30,0x3B31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B32,0x3B33,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B34,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B35,0x3B36,INVALC,INVALC,0x3B37,INVALC,INVALC,0x3B38, + 0x3B39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B3A,INVALC,INVALC,0x3B3B,0x3B3C,0x3B3D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B3E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 192, Array index 0x7600 */ + INVALC,0x3B3F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B40,0x3B41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B42,0x3B43,INVALC,0x3B44,0x3B45,0x3B46,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B47,0x3B48,INVALC,INVALC,0x3B49,INVALC,INVALC,INVALC, + 0x3B4A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B4B,0x3B4C,INVALC,INVALC,INVALC,0x3B4D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B4E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B4F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3B50,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B51,0x3B52,INVALC,INVALC, + 0x3B53,INVALC,INVALC,INVALC,0x3B54,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B55,INVALC,INVALC,0x3B56, + INVALC,0x3B57,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 193, Array index 0x7700 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B58,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3B59,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B5A,INVALC,INVALC,INVALC,0x3B5B,INVALC,INVALC,INVALC, + 0x3B5C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B5D,0x3B5E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B5F,0x3B60,INVALC,INVALC,0x3B61,INVALC,INVALC,INVALC, + 0x3B62,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B63,0x3B64,INVALC,0x3B65,INVALC,0x3B66,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B67,0x3B68,INVALC,0x3B69, + 0x3B6A,INVALC,INVALC,0x3B6B,0x3B6C,0x3B6D,0x3B6E,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B6F,0x3B70,INVALC,0x3B71, + 0x3B72,0x3B73,INVALC,INVALC,INVALC,0x3B74,INVALC,INVALC, + 0x3B75,0x3B76,INVALC,INVALC,0x3B77,INVALC,INVALC,INVALC, + 0x3B78,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3B79,0x3B7A,INVALC,0x3B7B,0x3B7C,0x3B7D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3B7E,0x3C21,INVALC,INVALC, + 0x3C22,INVALC,INVALC,INVALC,0x3C23,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C24,0x3C25,INVALC,0x3C26, + INVALC,0x3C27,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 194, Array index 0x7800 */ + 0x3C28,INVALC,INVALC,INVALC,0x3C29,INVALC,INVALC,INVALC, + 0x3C2A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C2B,INVALC,INVALC,INVALC,INVALC,0x3C2C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C2D,0x3C2E,0x3C2F,0x3C30, + 0x3C31,INVALC,INVALC,0x3C32,0x3C33,INVALC,0x3C34,0x3C35, + INVALC,INVALC,INVALC,INVALC,0x3C36,0x3C37,INVALC,0x3C38, + 0x3C39,0x3C3A,INVALC,INVALC,INVALC,INVALC,0x3C3B,INVALC, + 0x3C3C,0x3C3D,INVALC,INVALC,0x3C3E,INVALC,INVALC,INVALC, + 0x3C3F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C40,0x3C41,INVALC,0x3C42,0x3C43,0x3C44,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C45,0x3C46,INVALC,INVALC, + 0x3C47,INVALC,INVALC,INVALC,0x3C48,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C49,0x3C4A,INVALC,0x3C4B, + 0x3C4C,0x3C4D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C4E,INVALC,INVALC,INVALC,0x3C4F,INVALC,INVALC,INVALC, + 0x3C50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C51,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C52,0x3C53,0x3C54,INVALC, + 0x3C55,INVALC,INVALC,INVALC,0x3C56,INVALC,0x3C57,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C58,0x3C59,INVALC,0x3C5A, + INVALC,0x3C5B,INVALC,INVALC,INVALC,0x3C5C,INVALC,INVALC, + 0x3C5D,0x3C5E,INVALC,INVALC,0x3C5F,INVALC,INVALC,INVALC, + 0x3C60,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3C61,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C62,INVALC,INVALC,INVALC, + 0x3C63,INVALC,INVALC,INVALC,0x3C64,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C65,INVALC,INVALC,0x3C66, + 0x3C67,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C68,INVALC,INVALC,INVALC,0x3C69,INVALC,INVALC,INVALC, + 0x3C6A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C6B,0x3C6C,INVALC,0x3C6D,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C6E,0x3C6F,INVALC,INVALC, + /* Block 195, Array index 0x7900 */ + 0x3C70,INVALC,INVALC,INVALC,0x3C71,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3C72,0x3C73,INVALC,0x3C74, + INVALC,0x3C75,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C76,0x3C77,INVALC,INVALC,0x3C78,INVALC,INVALC,0x3C79, + 0x3C7A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3C7B,0x3C7C,INVALC,0x3C7D,INVALC,0x3C7E,INVALC,0x3D21, + INVALC,0x3D22,0x3D23,INVALC,0x3D24,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D25,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D26,0x3D27,INVALC,INVALC,0x3D28,INVALC,INVALC,INVALC, + 0x3D29,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D2A,INVALC,INVALC,INVALC,INVALC,0x3D2B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D2C,0x3D2D,INVALC,INVALC, + 0x3D2E,INVALC,INVALC,INVALC,0x3D2F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D30,0x3D31,INVALC,0x3D32, + INVALC,0x3D33,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D34,0x3D35,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D36,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D37,INVALC,INVALC,0x3D38,INVALC,0x3D39,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D3A,0x3D3B,INVALC,INVALC, + 0x3D3C,INVALC,INVALC,INVALC,0x3D3D,0x3D3E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D3F,0x3D40,INVALC,0x3D41, + INVALC,0x3D42,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D43,0x3D44,INVALC,INVALC, + 0x3D45,INVALC,INVALC,0x3D46,0x3D47,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D48,0x3D49,0x3D4A,INVALC,0x3D4B, + INVALC,0x3D4C,INVALC,INVALC,INVALC,INVALC,0x3D4D,INVALC, + 0x3D4E,0x3D4F,INVALC,0x3D50,0x3D51,INVALC,INVALC,INVALC, + /* Block 196, Array index 0x7A00 */ + 0x3D52,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D53,0x3D54,INVALC,INVALC,0x3D55,0x3D56,INVALC,INVALC, + INVALC,INVALC,INVALC,0x3D57,0x3D58,0x3D59,INVALC,INVALC, + 0x3D5A,INVALC,INVALC,INVALC,0x3D5B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D5C,0x3D5D,INVALC,INVALC, + 0x3D5E,0x3D5F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x3D60,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D61,0x3D62,INVALC,INVALC,0x3D63,INVALC,INVALC,INVALC, + 0x3D64,INVALC,0x3D65,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D66,0x3D67,INVALC,INVALC,0x3D68,0x3D69,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D6A,INVALC,INVALC,INVALC, + 0x3D6B,INVALC,INVALC,INVALC,0x3D6C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D6E,0x3D6F,INVALC,INVALC,0x3D70,INVALC,INVALC,0x3D71, + 0x3D72,INVALC,0x3D73,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D74,0x3D75,INVALC,INVALC,INVALC,0x3D76,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D77,0x3D78,INVALC,INVALC, + 0x3D79,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 197, Array index 0x7B00 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D7A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3D7B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D7C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3D7D,INVALC,INVALC,INVALC, + 0x3D7E,INVALC,INVALC,INVALC,0x3E21,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E22,0x3E23,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E24,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E25,0x3E26,INVALC,INVALC, + 0x3E27,INVALC,INVALC,INVALC,0x3E28,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E29,0x3E2A,INVALC,INVALC, + INVALC,0x3E2B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E2C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E2D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E2E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E2F,INVALC,INVALC,INVALC,0x3E30,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3E31,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E32,0x3E33,INVALC,INVALC,0x3E34,INVALC,INVALC,INVALC, + 0x3E35,INVALC,0x3E36,INVALC,INVALC,INVALC,INVALC,0x3E37, + /* Block 198, Array index 0x7C00 */ + 0x3E38,0x3E39,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E3A,INVALC,INVALC,INVALC, + 0x3E3B,INVALC,INVALC,INVALC,0x3E3C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E3D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E3E,0x3E3F,INVALC,INVALC,0x3E40,INVALC,INVALC,INVALC, + 0x3E41,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E42,0x3E43,INVALC,0x3E44,INVALC,0x3E45,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E46,0x3E47,INVALC,INVALC, + 0x3E48,0x3E49,0x3E4A,INVALC,0x3E4B,0x3E4C,0x3E4D,INVALC, + INVALC,INVALC,INVALC,0x3E4E,0x3E4F,0x3E50,INVALC,0x3E51, + 0x3E52,0x3E53,INVALC,INVALC,INVALC,0x3E54,0x3E55,INVALC, + 0x3E56,0x3E57,INVALC,INVALC,0x3E58,INVALC,INVALC,INVALC, + 0x3E59,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3E5A,0x3E5B,INVALC,0x3E5C,0x3E5D,0x3E5E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E5F,0x3E60,INVALC,INVALC, + 0x3E61,INVALC,INVALC,INVALC,0x3E62,INVALC,INVALC,0x3E63, + INVALC,INVALC,INVALC,INVALC,0x3E64,0x3E65,INVALC,0x3E66, + INVALC,0x3E67,INVALC,INVALC,INVALC,0x3E68,INVALC,0x3E69, + 0x3E6A,INVALC,INVALC,INVALC,0x3E6B,INVALC,INVALC,INVALC, + 0x3E6C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x3E6D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E6E,0x3E6F,INVALC,INVALC, + 0x3E70,0x3E71,INVALC,0x3E72,0x3E73,0x3E74,0x3E75,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3E76,0x3E77,0x3E78,0x3E79, + 0x3E7A,0x3E7B,0x3E7C,INVALC,0x3E7D,INVALC,0x3E7E,INVALC, + 0x3F21,0x3F22,INVALC,INVALC,0x3F23,INVALC,INVALC,INVALC, + 0x3F24,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F25,0x3F26,INVALC,0x3F27,INVALC,0x3F28,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F29,0x3F2A,0x3F2B,INVALC, + 0x3F2C,INVALC,INVALC,INVALC,0x3F2D,INVALC,0x3F2E,0x3F2F, + INVALC,INVALC,INVALC,INVALC,0x3F30,0x3F31,0x3F32,0x3F33, + /* Block 199, Array index 0x7D00 */ + 0x3F34,0x3F35,INVALC,INVALC,INVALC,0x3F36,0x3F37,0x3F38, + 0x3F39,INVALC,INVALC,INVALC,0x3F3A,INVALC,INVALC,INVALC, + 0x3F3B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F3C,0x3F3D,INVALC,0x3F3E,0x3F3F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F40,0x3F41,INVALC,INVALC, + 0x3F42,INVALC,INVALC,INVALC,0x3F43,0x3F44,0x3F45,INVALC, + 0x3F46,INVALC,INVALC,0x3F47,0x3F48,0x3F49,INVALC,0x3F4A, + INVALC,0x3F4B,INVALC,0x3F4C,INVALC,INVALC,INVALC,INVALC, + 0x3F4D,0x3F4E,INVALC,INVALC,0x3F4F,INVALC,INVALC,INVALC, + 0x3F50,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F51,0x3F52,INVALC,0x3F53,0x3F54,0x3F55,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F56,0x3F57,INVALC,INVALC, + 0x3F58,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F59,INVALC,INVALC,0x3F5A, + INVALC,0x3F5B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F5C,0x3F5D,INVALC,INVALC,0x3F5E,INVALC,INVALC,INVALC, + 0x3F5F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F60,0x3F61,INVALC,0x3F62,INVALC,0x3F63,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F64,0x3F65,INVALC,INVALC, + 0x3F66,INVALC,INVALC,INVALC,0x3F67,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F68,0x3F69,INVALC,0x3F6A, + INVALC,0x3F6B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F6C,0x3F6D,INVALC,INVALC,0x3F6E,INVALC,INVALC,INVALC, + 0x3F6F,0x3F70,0x3F71,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F72,0x3F73,INVALC,0x3F74,INVALC,0x3F75,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F76,0x3F77,INVALC,INVALC, + 0x3F78,INVALC,INVALC,INVALC,0x3F79,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x3F7A,0x3F7B,INVALC,INVALC, + 0x3F7C,0x3F7D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x3F7E,0x4021,INVALC,INVALC,0x4022,INVALC,INVALC,INVALC, + 0x4023,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4024,0x4025,INVALC,INVALC,INVALC,0x4026,INVALC,INVALC, + /* Block 200, Array index 0x7E00 */ + INVALC,INVALC,INVALC,INVALC,0x4027,0x4028,INVALC,INVALC, + 0x4029,INVALC,INVALC,INVALC,0x402A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x402B,0x402C,INVALC,0x402D, + INVALC,0x402E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x402F,0x4030,INVALC,INVALC,0x4031,INVALC,INVALC,INVALC, + 0x4032,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4033,0x4034,INVALC,0x4035,INVALC,0x4036,INVALC,0x4037, + INVALC,INVALC,INVALC,INVALC,0x4038,0x4039,INVALC,INVALC, + 0x403A,INVALC,INVALC,INVALC,0x403B,INVALC,INVALC,INVALC, + INVALC,INVALC,0x403C,INVALC,0x403D,0x403E,INVALC,0x403F, + INVALC,0x4040,0x4041,0x4042,0x4043,0x4044,0x4045,0x4046, + 0x4047,INVALC,INVALC,INVALC,0x4048,INVALC,INVALC,INVALC, + 0x4049,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x404A,INVALC,INVALC,0x404B,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x404C,0x404D,INVALC,INVALC, + 0x404E,INVALC,INVALC,INVALC,0x404F,0x4050,0x4051,INVALC, + INVALC,INVALC,INVALC,0x4052,0x4053,0x4054,INVALC,0x4055, + 0x4056,0x4057,0x4058,INVALC,INVALC,INVALC,0x4059,INVALC, + 0x405A,0x405B,INVALC,INVALC,0x405C,INVALC,0x405D,0x405E, + 0x405F,INVALC,0x4060,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4061,0x4062,INVALC,0x4063,0x4064,0x4065,0x4066,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4067,0x4068,INVALC,INVALC, + 0x4069,INVALC,INVALC,INVALC,0x406A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x406B,0x406C,INVALC,0x406D, + 0x406E,0x406F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4070,0x4071,INVALC,INVALC,0x4072,INVALC,0x4073,INVALC, + 0x4074,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4075,INVALC,INVALC,INVALC,INVALC,0x4076,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4077,INVALC,INVALC,INVALC, + 0x4078,INVALC,INVALC,INVALC,0x4079,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 201, Array index 0x7F00 */ + 0x407A,0x407B,INVALC,INVALC,0x407C,INVALC,INVALC,INVALC, + 0x407D,INVALC,0x407E,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4121,0x4122,INVALC,0x4123,INVALC,0x4124,0x4125,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4126,0x4127,INVALC,INVALC, + 0x4128,INVALC,INVALC,INVALC,0x4129,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x412A,0x412B,INVALC,0x412C, + INVALC,0x412D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x412E,INVALC,INVALC,INVALC,0x412F,INVALC,INVALC,INVALC, + 0x4130,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4131,0x4132,INVALC,INVALC,0x4133,0x4134,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4135,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4136,0x4137,INVALC,INVALC,0x4138,INVALC,INVALC,INVALC, + 0x4139,INVALC,0x413A,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x413B,0x413C,INVALC,0x413D,INVALC,0x413E,0x413F,0x4140, + INVALC,INVALC,INVALC,0x4141,0x4142,0x4143,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4144,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4145,INVALC,0x4146, + INVALC,0x4147,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4148,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4149,0x414A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x414B,INVALC,INVALC,INVALC, + 0x414C,INVALC,INVALC,INVALC,0x414D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x414E,0x414F,INVALC,0x4150, + INVALC,0x4151,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4152,0x4153,INVALC,INVALC,0x4154,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4155,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4156,0x4157,INVALC,INVALC, + /* Block 202, Array index 0x8000 */ + 0x4158,INVALC,INVALC,INVALC,0x4159,0x415A,0x415B,INVALC, + INVALC,INVALC,INVALC,INVALC,0x415C,0x415D,INVALC,0x415E, + INVALC,0x415F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4160,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4161,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4162,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4163,0x4164,INVALC,INVALC,0x4165,INVALC,INVALC,INVALC, + 0x4166,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4167,0x4168,INVALC,0x4169,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x416A,INVALC,INVALC,INVALC, + 0x416B,INVALC,INVALC,INVALC,0x416C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x416D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x416E,0x416F,INVALC,INVALC,0x4170,INVALC,INVALC,INVALC, + 0x4171,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4172,0x4173,INVALC,0x4174,INVALC,0x4175,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4176,0x4177,INVALC,INVALC,0x4178,INVALC,INVALC,0x4179, + 0x417A,INVALC,0x417B,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x417C,0x417D,INVALC,0x417E,INVALC,0x4221,0x4222,INVALC, + INVALC,0x4223,0x4224,INVALC,0x4225,0x4226,INVALC,INVALC, + 0x4227,INVALC,0x4228,INVALC,0x4229,INVALC,INVALC,0x422A, + INVALC,INVALC,INVALC,INVALC,0x422B,0x422C,INVALC,0x422D, + 0x422E,0x422F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4230,0x4231,INVALC,INVALC,0x4232,INVALC,INVALC,INVALC, + /* Block 203, Array index 0x8100 */ + 0x4233,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4234,0x4235,INVALC,0x4236,0x4237,0x4238,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4239,INVALC,INVALC,INVALC, + 0x423A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x423B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x423C,0x423D,INVALC,INVALC, + 0x423E,INVALC,INVALC,INVALC,0x423F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4240,0x4241,INVALC,0x4242, + 0x4243,0x4244,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4245,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4246,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4247,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4248,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4249,0x424A,INVALC,INVALC, + 0x424B,INVALC,INVALC,INVALC,0x424C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x424D,0x424E,INVALC,0x424F, + INVALC,0x4250,INVALC,0x4251,INVALC,INVALC,INVALC,INVALC, + 0x4252,0x4253,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4254,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4255,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4256,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 204, Array index 0x8200 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4257,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4258,INVALC,INVALC,INVALC,0x4259,INVALC,INVALC,INVALC, + 0x425A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x425B,0x425C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x425D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x425E,0x425F,INVALC,INVALC,0x4260,INVALC,INVALC,INVALC, + 0x4261,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4262,0x4263,INVALC,INVALC,INVALC,0x4264,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4265,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4266,0x4267,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4268,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4269,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x426A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x426B,INVALC,INVALC,0x426C, + INVALC,0x426D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 205, Array index 0x8300 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x426E,0x426F,INVALC,INVALC, + 0x4270,INVALC,INVALC,INVALC,0x4271,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4272,0x4273,INVALC,INVALC, + INVALC,0x4274,0x4275,INVALC,INVALC,INVALC,INVALC,0x4276, + 0x4277,0x4278,INVALC,INVALC,0x4279,INVALC,0x427A,INVALC, + 0x427B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x427C,0x427D,INVALC,0x427E,0x4321,0x4322,0x4323,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4324,0x4325,INVALC,INVALC, + 0x4326,INVALC,INVALC,INVALC,0x4327,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4328,0x4329,INVALC,0x432A, + 0x432B,0x432C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x432D,INVALC,INVALC,INVALC,0x432E,INVALC,0x432F,INVALC, + 0x4330,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4331,INVALC,INVALC,INVALC,INVALC,0x4332,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4333,0x4334,INVALC,INVALC,0x4335,INVALC,INVALC,INVALC, + 0x4336,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4337,0x4338,INVALC,0x4339,0x433A,0x433B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x433C,0x433D,INVALC,INVALC, + 0x433E,INVALC,INVALC,INVALC,0x433F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4340,0x4341,INVALC,0x4342, + INVALC,0x4343,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4344,INVALC,INVALC,INVALC,0x4345,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4346,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4347,INVALC,INVALC,INVALC, + 0x4348,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 206, Array index 0x8400 */ + INVALC,0x4349,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x434A,0x434B,INVALC,INVALC,0x434C,INVALC,INVALC,INVALC, + 0x434D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x434E,0x434F,INVALC,0x4350,INVALC,0x4351,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4352,INVALC,INVALC,INVALC, + 0x4353,INVALC,INVALC,INVALC,0x4354,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4355,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4356,INVALC,INVALC,INVALC, + 0x4357,INVALC,INVALC,INVALC,0x4358,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4359,0x435A,INVALC,0x435B, + INVALC,0x435C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x435D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x435E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x435F,0x4360,INVALC,INVALC, + 0x4361,INVALC,INVALC,INVALC,0x4362,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4363,0x4364,INVALC,0x4365, + INVALC,0x4366,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4367,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4368,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4369,INVALC,INVALC,INVALC, + 0x436A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x436B,INVALC,INVALC,INVALC,0x436C,INVALC,INVALC,INVALC, + 0x436D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x436E,0x436F,INVALC,0x4370,INVALC,0x4371,INVALC,INVALC, + /* Block 207, Array index 0x8500 */ + INVALC,INVALC,INVALC,INVALC,0x4372,INVALC,INVALC,INVALC, + 0x4373,INVALC,INVALC,INVALC,0x4374,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4375,INVALC,INVALC,INVALC, + INVALC,0x4376,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4377,0x4378,INVALC,INVALC,0x4379,INVALC,INVALC,INVALC, + 0x437A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x437B,0x437C,INVALC,0x437D,INVALC,0x437E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4421,0x4422,INVALC,INVALC,0x4423,INVALC,INVALC,0x4424, + 0x4425,0x4426,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4427,0x4428,INVALC,0x4429,INVALC,0x442A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x442B,0x442C,INVALC,INVALC, + 0x442D,INVALC,INVALC,INVALC,0x442E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x442F,0x4430,INVALC,0x4431, + INVALC,0x4432,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4433,0x4434,INVALC,INVALC,0x4435,INVALC,INVALC,INVALC, + 0x4436,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4437,0x4438,INVALC,0x4439,0x443A,0x443B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x443C,0x443D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x443E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x443F,0x4440,INVALC,INVALC, + 0x4441,INVALC,INVALC,0x4442,0x4443,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4444,0x4445,INVALC,0x4446, + 0x4447,0x4448,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 208, Array index 0x8600 */ + 0x4449,0x444A,INVALC,INVALC,0x444B,INVALC,INVALC,INVALC, + 0x444C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x444D,0x444E,INVALC,0x444F,INVALC,0x4450,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4451,INVALC,INVALC,INVALC, + 0x4452,INVALC,INVALC,INVALC,0x4453,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4454,0x4455,INVALC,0x4456, + 0x4457,0x4458,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4459,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x445A,0x445B,INVALC,INVALC, + 0x445C,INVALC,INVALC,INVALC,0x445D,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x445E,0x445F,INVALC,0x4460, + INVALC,0x4461,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4462,0x4463,INVALC,INVALC,0x4464,INVALC,INVALC,INVALC, + 0x4465,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4466,INVALC,INVALC,INVALC,INVALC,0x4467,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4468,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4469,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x446A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x446B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x446C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x446D,0x446E,INVALC,INVALC,0x446F,INVALC,INVALC,INVALC, + 0x4470,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4471,0x4472,INVALC,0x4473,INVALC,0x4474,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4475,INVALC,INVALC,INVALC, + /* Block 209, Array index 0x8700 */ + 0x4476,INVALC,INVALC,INVALC,0x4477,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4478,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4479,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x447A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x447B,0x447C,INVALC,INVALC, + 0x447D,INVALC,INVALC,INVALC,0x447E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4521,0x4522,INVALC,0x4523, + INVALC,0x4524,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4525,INVALC,INVALC,INVALC,0x4526,INVALC,INVALC,INVALC, + 0x4527,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4528,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4529,0x452A,INVALC,INVALC, + 0x452B,INVALC,INVALC,INVALC,0x452C,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x452D,0x452E,INVALC,INVALC, + INVALC,0x452F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4530,0x4531,INVALC,INVALC, + 0x4532,INVALC,INVALC,INVALC,0x4533,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4534,0x4535,INVALC,0x4536, + INVALC,0x4537,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4538,0x4539,INVALC,INVALC,0x453A,INVALC,INVALC,INVALC, + 0x453B,0x453C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x453D,0x453E,INVALC,0x453F,0x4540,0x4541,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4542,0x4543,INVALC,INVALC, + 0x4544,INVALC,INVALC,INVALC,0x4545,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4546,0x4547,INVALC,0x4548, + 0x4549,0x454A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x454B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 210, Array index 0x8800 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x454C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x454D,0x454E,INVALC,INVALC,0x454F,INVALC,INVALC,INVALC, + 0x4550,INVALC,0x4551,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4552,0x4553,INVALC,0x4554,0x4555,0x4556,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4557,0x4558,INVALC,INVALC, + 0x4559,INVALC,INVALC,INVALC,0x455A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x455B,0x455C,INVALC,0x455D, + INVALC,0x455E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x455F,INVALC,INVALC,INVALC,0x4560,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4561,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4562,INVALC,INVALC,INVALC, + 0x4563,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4564,0x4565,INVALC,INVALC,0x4566,INVALC,INVALC,INVALC, + 0x4567,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4568,0x4569,INVALC,0x456A,INVALC,0x456B,INVALC,INVALC, + INVALC,INVALC,0x456C,INVALC,0x456D,INVALC,INVALC,INVALC, + 0x456E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x456F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4570,INVALC,INVALC,INVALC, + 0x4571,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 211, Array index 0x8900 */ + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4572, + INVALC,0x4573,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4574,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4575,0x4576,INVALC,INVALC, + 0x4577,INVALC,INVALC,INVALC,0x4578,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4579,0x457A,INVALC,0x457B, + INVALC,0x457C,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x457D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x457E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4621,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4622,0x4623,INVALC,INVALC,0x4624,INVALC,INVALC,INVALC, + 0x4625,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4626,0x4627,INVALC,INVALC,INVALC,0x4628,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4629,INVALC,INVALC,INVALC, + 0x462A,INVALC,INVALC,INVALC,0x462B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x462C,INVALC,INVALC,INVALC, + INVALC,0x462D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x462E,0x462F,INVALC,INVALC,0x4630,INVALC,INVALC,0x4631, + 0x4632,INVALC,0x4633,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4634,0x4635,INVALC,0x4636,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4637,INVALC,INVALC,INVALC, + 0x4638,INVALC,INVALC,INVALC,0x4639,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x463A,0x463B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x463C,0x463D,INVALC,INVALC,0x463E,INVALC,INVALC,INVALC, + 0x463F,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 212, Array index 0x8A00 */ + 0x4640,0x4641,INVALC,0x4642,INVALC,0x4643,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4644,0x4645,0x4646,INVALC, + 0x4647,INVALC,INVALC,INVALC,0x4648,INVALC,0x4649,INVALC, + INVALC,INVALC,INVALC,INVALC,0x464A,0x464B,INVALC,0x464C, + 0x464D,0x464E,INVALC,INVALC,INVALC,0x464F,INVALC,INVALC, + 0x4650,0x4651,INVALC,INVALC,0x4652,INVALC,INVALC,INVALC, + 0x4653,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4654,0x4655,INVALC,0x4656,0x4657,0x4658,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4659,0x465A,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x465B,0x465C,INVALC,INVALC, + 0x465D,INVALC,INVALC,INVALC,0x465E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x465F,0x4660,INVALC,0x4661, + 0x4662,0x4663,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4664,0x4665,INVALC,INVALC,0x4666,INVALC,INVALC,INVALC, + 0x4667,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4668,0x4669,INVALC,0x466A,INVALC,0x466B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x466C,INVALC,INVALC,INVALC, + 0x466D,INVALC,INVALC,INVALC,0x466E,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x466F,0x4670,INVALC,INVALC, + 0x4671,0x4672,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4673,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4674,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4675,INVALC,0x4676,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4677,0x4678,INVALC,INVALC, + 0x4679,INVALC,INVALC,INVALC,0x467A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x467B,0x467C,INVALC,0x467D, + /* Block 213, Array index 0x8B00 */ + INVALC,0x467E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4721,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4722,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4723,INVALC,INVALC,INVALC,0x4724,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4725,INVALC,INVALC,INVALC, + 0x4726,INVALC,INVALC,INVALC,0x4727,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4728,INVALC,0x4729, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x472A,0x472B,INVALC,INVALC,0x472C,INVALC,INVALC,0x472D, + 0x472E,INVALC,0x472F,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4730,0x4731,INVALC,0x4732,INVALC,0x4733,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4734,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4735,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4736,INVALC,INVALC,INVALC, + 0x4737,INVALC,INVALC,INVALC,0x4738,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4739,INVALC,INVALC,0x473A, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x473B,INVALC,INVALC,INVALC,0x473C,INVALC,INVALC,INVALC, + 0x473D,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x473E,INVALC,INVALC,0x473F,INVALC,0x4740,INVALC,INVALC, + /* Block 214, Array index 0x8C00 */ + INVALC,INVALC,INVALC,INVALC,0x4741,INVALC,INVALC,INVALC, + 0x4742,INVALC,INVALC,INVALC,0x4743,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4744,0x4745,INVALC,0x4746, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4747,0x4748,INVALC,INVALC, + 0x4749,INVALC,INVALC,INVALC,0x474A,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x474B,0x474C,INVALC,0x474D, + INVALC,0x474E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x474F,0x4750,INVALC,INVALC,0x4751,INVALC,INVALC,INVALC, + 0x4752,INVALC,INVALC,INVALC,INVALC,0x4753,INVALC,INVALC, + 0x4754,0x4755,INVALC,0x4756,INVALC,0x4757,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4758,0x4759,INVALC,INVALC, + 0x475A,INVALC,INVALC,INVALC,0x475B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x475C,0x475D,INVALC,0x475E, + 0x475F,0x4760,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4761,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4762,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4763,0x4764,INVALC,INVALC,0x4765,INVALC,INVALC,INVALC, + 0x4766,INVALC,0x4767,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4768,0x4769,INVALC,0x476A,INVALC,0x476B,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x476C,0x476D,INVALC,INVALC, + 0x476E,INVALC,INVALC,INVALC,0x476F,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4770,0x4771,INVALC,0x4772, + INVALC,0x4773,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 215, Array index 0x8D00 */ + 0x4774,0x4775,INVALC,INVALC,0x4776,INVALC,INVALC,INVALC, + 0x4777,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4778,0x4779,INVALC,0x477A,0x477B,0x477C,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x477D,INVALC,INVALC,INVALC, + 0x477E,INVALC,INVALC,INVALC,0x4821,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x4822,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4823,0x4824,INVALC,INVALC,0x4825,INVALC,INVALC,INVALC, + 0x4826,INVALC,INVALC,INVALC,INVALC,0x4827,INVALC,INVALC, + 0x4828,0x4829,INVALC,0x482A,INVALC,0x482B,INVALC,INVALC, + INVALC,0x482C,INVALC,INVALC,0x482D,0x482E,INVALC,INVALC, + 0x482F,INVALC,INVALC,INVALC,0x4830,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,0x4831, + INVALC,0x4832,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4833,0x4834,INVALC,INVALC,0x4835,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,0x4836,INVALC,0x4837,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4838,0x4839,INVALC,INVALC, + 0x483A,INVALC,INVALC,INVALC,0x483B,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,0x483C,INVALC,0x483D, + INVALC,0x483E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x483F,INVALC,INVALC,INVALC,0x4840,INVALC,INVALC,INVALC, + 0x4841,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4842,INVALC,0x4843,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4844,0x4845,INVALC,INVALC, + 0x4846,INVALC,INVALC,INVALC,0x4847,INVALC,INVALC,INVALC, + INVALC,0x4848,INVALC,INVALC,0x4849,INVALC,INVALC,0x484A, + INVALC,0x484B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x484C,INVALC,INVALC,INVALC,0x484D,INVALC,INVALC,INVALC, + 0x484E,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x484F,INVALC,INVALC,INVALC,INVALC,0x4850,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4851,0x4852,INVALC,INVALC, + /* Block 216, Array index 0x8E00 */ + 0x4853,INVALC,INVALC,INVALC,0x4854,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,0x4855,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4856,0x4857,INVALC,INVALC,0x4858,INVALC,INVALC,INVALC, + 0x4859,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x485A,0x485B,INVALC,0x485C,INVALC,0x485D,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x485E,0x485F,INVALC,INVALC, + 0x4860,INVALC,INVALC,INVALC,0x4861,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4862,INVALC,INVALC,0x4863, + INVALC,0x4864,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4865,0x4866,INVALC,INVALC,0x4867,INVALC,0x4868,0x4869, + 0x486A,0x486B,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x486C,0x486D,INVALC,0x486E,INVALC,0x486F,INVALC,INVALC, + INVALC,0x4870,INVALC,INVALC,0x4871,INVALC,INVALC,INVALC, + 0x4872,INVALC,INVALC,INVALC,0x4873,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,0x4874,0x4875,INVALC,INVALC, + INVALC,0x4876,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x4877,0x4878,INVALC,INVALC,0x4879,INVALC,INVALC,INVALC, + 0x487A,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x487B,0x487C,INVALC,0x487D,INVALC,0x487E,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 250, Array index 0x8F00 */ + 0x4B50,0x4B56,0x4B67,0x4D4F,0x4D68,0x4E2D,0x4F7B,0x5022, + 0x5038,0x5050,0x505D,0x5154,0x5155,0x5158,0x515B,0x515C, + 0x515D,0x515E,0x515F,0x5160,0x5162,0x5163,0x5164,0x5165, + 0x5166,0x5168,0x5169,0x516A,0x516B,0x516D,0x516F,0x5170, + 0x5172,0x5176,0x517A,0x517C,0x517D,0x517E,0x5222,0x5223, + 0x5227,0x5228,0x5229,0x522A,0x522B,0x522D,0x5232,0x523E, + 0x5242,0x5243,0x5244,0x5246,0x5247,0x5248,0x5249,0x524A, + 0x524B,0x524D,0x524E,0x524F,0x5250,0x5251,0x5252,0x5253, + 0x5254,0x5255,0x5256,0x5257,0x5259,0x525A,0x525E,0x525F, + 0x5261,0x5262,0x5264,0x5265,0x5266,0x5267,0x5268,0x5269, + 0x526A,0x526B,0x5270,0x5271,0x5272,0x5273,0x5274,0x5275, + 0x5277,0x5278,0x5466,0x547C,0x5525,0x552B,0x552E,0x5638, + 0x564D,0x574B,0x5764,0x5B45,0x5B64,0x5C25,0x5D25,0x5D55, + 0x5D74,0x5E7C,0x5E7E,0x5F33,0x5F61,0x5F68,0x6071,0x612D, + 0x616D,0x6375,0x6421,0x6429,0x652E,0x6531,0x6532,0x6539, + 0x653B,0x653C,0x6544,0x654E,0x6550,0x6552,0x6556,0x657A, + 0x657B,0x657C,0x657E,0x6621,0x6624,0x6627,0x662D,0x662F, + 0x6630,0x6631,0x6633,0x6637,0x6638,0x663C,0x6644,0x6646, + 0x6647,0x664A,0x6652,0x6656,0x6659,0x665C,0x665F,0x6661, + 0x6664,0x6665,0x6666,0x6668,0x666A,0x666B,0x666C,0x666F, + 0x6671,0x6672,0x6675,0x6676,0x6677,0x6679,0x6721,0x6726, + 0x6729,0x672A,0x672C,0x672D,0x6730,0x673F,0x6741,0x6746, + 0x6747,0x674B,0x674D,0x674F,0x6750,0x6753,0x675F,0x6764, + 0x6766,0x6777,0x6867,0x6868,0x6870,0x6871,0x6877,0x6879, + 0x687B,0x687E,0x6927,0x692C,0x694C,0x6977,0x6A41,0x6A65, + 0x6A74,0x6A77,0x6A7C,0x6A7E,0x6B24,0x6B27,0x6B29,0x6B2A, + 0x6B3A,0x6B3B,0x6B3D,0x6B41,0x6B42,0x6B46,0x6B47,0x6B4C, + 0x6B4F,0x6B50,0x6B51,0x6B52,0x6B58,0x6C26,0x6C27,0x6C2A, + 0x6C2F,0x6C30,0x6C31,0x6C32,0x6C35,0x6C38,0x6C3A,0x6C40, + 0x6C41,0x6C45,0x6C46,0x6C49,0x6C4A,0x6C55,0x6C5D,0x6C5E, + 0x6C61,0x6C64,0x6C67,0x6C68,0x6C77,0x6C78,0x6C7A,0x6D21, + 0x6D22,0x6D23,0x6D6E,0x6E5B,0x723D,0x727A,0x7331,0x7427, + /* Block 251, Array index 0x9000 */ + 0x746E,0x7674,0x7676,0x7738,0x7748,0x7753,0x785B,0x7870, + 0x7A21,0x7A22,0x7A66,0x7C29,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + /* Block 256, Array index 0x9100 */ + INVALC,0x2321,0x2322,0x2323,0x2324,0x2325,0x2326,0x2327, + 0x2328,0x2329,0x232A,0x232B,0x232C,0x232D,0x232E,0x232F, + 0x2330,0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337, + 0x2338,0x2339,0x233A,0x233B,0x233C,0x233D,0x233E,0x233F, + 0x2340,0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347, + 0x2348,0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F, + 0x2350,0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357, + 0x2358,0x2359,0x235A,0x235B,0x212C,0x235D,0x235E,0x235F, + 0x2360,0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367, + 0x2368,0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F, + 0x2370,0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377, + 0x2378,0x2379,0x237A,0x237B,0x237C,0x237D,0x2226,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x214B,0x214C,0x217E,0x237E,INVALC,0x214D,0x235C,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, +}; + +#endif /* ICONV_FROM_UCS_CCS_KSX1001 && !defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * 16-bit UCS -> ksx1001 size-optimized table (29992 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_KSX1001) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + +static const __uint16_t +from_ucs_size_ksx1001[] = +{ + 0x01B6, /* Ranges number */ + 0x1338, /* Unranged codes number */ + 0x1424, /* First unranged code index */ + /* Ranges list: first code, last Code, array index. */ + /* Array index: 0x0003 */ 0x00B0, 0x00BF, 0x0525, + /* Array index: 0x0006 */ 0x0131, 0x0133, 0x0535, + /* Array index: 0x0009 */ 0x013F, 0x0142, 0x0538, + /* Array index: 0x000C */ 0x0149, 0x014B, 0x053C, + /* Array index: 0x000F */ 0x02D8, 0x02DD, 0x053F, + /* Array index: 0x0012 */ 0x0391, 0x03A9, 0x0545, + /* Array index: 0x0015 */ 0x03B1, 0x03C9, 0x055E, + /* Array index: 0x0018 */ 0x0410, 0x0451, 0x0577, + /* Array index: 0x001B */ 0x207F, 0x2084, 0x05B9, + /* Array index: 0x001E */ 0x215B, 0x2169, 0x05BF, + /* Array index: 0x0021 */ 0x2170, 0x2179, 0x05CE, + /* Array index: 0x0024 */ 0x2190, 0x2199, 0x05D8, + /* Array index: 0x0027 */ 0x2225, 0x222E, 0x05E2, + /* Array index: 0x002A */ 0x2460, 0x246E, 0x05EC, + /* Array index: 0x002D */ 0x2474, 0x2482, 0x05FB, + /* Array index: 0x0030 */ 0x249C, 0x24B5, 0x060A, + /* Array index: 0x0033 */ 0x24D0, 0x24E9, 0x0624, + /* Array index: 0x0036 */ 0x2500, 0x2503, 0x063E, + /* Array index: 0x0039 */ 0x250C, 0x254B, 0x0642, + /* Array index: 0x003C */ 0x25A0, 0x25A9, 0x0682, + /* Array index: 0x003F */ 0x25C6, 0x25C8, 0x068C, + /* Array index: 0x0042 */ 0x25CE, 0x25D1, 0x068F, + /* Array index: 0x0045 */ 0x2660, 0x266D, 0x0693, + /* Array index: 0x0048 */ 0x3000, 0x3003, 0x06A1, + /* Array index: 0x004B */ 0x3008, 0x3015, 0x06A5, + /* Array index: 0x004E */ 0x3041, 0x3093, 0x06B3, + /* Array index: 0x0051 */ 0x30A1, 0x30F6, 0x0706, + /* Array index: 0x0054 */ 0x3131, 0x318E, 0x075C, + /* Array index: 0x0057 */ 0x3200, 0x321C, 0x07BA, + /* Array index: 0x005A */ 0x3260, 0x327B, 0x07D7, + /* Array index: 0x005D */ 0x3380, 0x33CA, 0x07F3, + /* Array index: 0x0060 */ 0x33DB, 0x33DD, 0x083E, + /* Array index: 0x0063 */ 0x4E07, 0x4E0D, 0x0841, + /* Array index: 0x0066 */ 0x4E14, 0x4E19, 0x0848, + /* Array index: 0x0069 */ 0x4E4B, 0x4E4F, 0x084E, + /* Array index: 0x006C */ 0x4E5D, 0x4E5F, 0x0853, + /* Array index: 0x006F */ 0x4E8E, 0x4E95, 0x0856, + /* Array index: 0x0072 */ 0x4EA1, 0x4EAE, 0x085E, + /* Array index: 0x0075 */ 0x4ED4, 0x4ED9, 0x086C, + /* Array index: 0x0078 */ 0x4EE3, 0x4EE5, 0x0872, + /* Array index: 0x007B */ 0x4F09, 0x4F11, 0x0875, + /* Array index: 0x007E */ 0x4F46, 0x4F48, 0x087E, + /* Array index: 0x0081 */ 0x4F4D, 0x4F51, 0x0881, + /* Array index: 0x0084 */ 0x4F59, 0x4F5C, 0x0886, + /* Array index: 0x0087 */ 0x4FC2, 0x4FC4, 0x088A, + /* Array index: 0x008A */ 0x4FDD, 0x4FE1, 0x088D, + /* Array index: 0x008D */ 0x5023, 0x502D, 0x0892, + /* Array index: 0x0090 */ 0x5047, 0x5049, 0x089D, + /* Array index: 0x0093 */ 0x5074, 0x5078, 0x08A0, + /* Array index: 0x0096 */ 0x50FF, 0x5101, 0x08A5, + /* Array index: 0x0099 */ 0x5140, 0x514E, 0x08A8, + /* Array index: 0x009C */ 0x5165, 0x516E, 0x08B7, + /* Array index: 0x009F */ 0x5175, 0x5178, 0x08C1, + /* Array index: 0x00A2 */ 0x51C9, 0x51CD, 0x08C5, + /* Array index: 0x00A5 */ 0x51DC, 0x51DE, 0x08CA, + /* Array index: 0x00A8 */ 0x51F6, 0x51FA, 0x08CD, + /* Array index: 0x00AB */ 0x5206, 0x520A, 0x08D2, + /* Array index: 0x00AE */ 0x5236, 0x523B, 0x08D7, + /* Array index: 0x00B1 */ 0x524A, 0x524D, 0x08DD, + /* Array index: 0x00B4 */ 0x5287, 0x5289, 0x08E1, + /* Array index: 0x00B7 */ 0x52A9, 0x52AB, 0x08E4, + /* Array index: 0x00BA */ 0x52D5, 0x52E4, 0x08E7, + /* Array index: 0x00BD */ 0x5315, 0x5319, 0x08F7, + /* Array index: 0x00C0 */ 0x533F, 0x534A, 0x08FC, + /* Array index: 0x00C3 */ 0x5351, 0x5354, 0x0908, + /* Array index: 0x00C6 */ 0x536F, 0x5377, 0x090C, + /* Array index: 0x00C9 */ 0x53C8, 0x53CD, 0x0915, + /* Array index: 0x00CC */ 0x53E1, 0x53F3, 0x091B, + /* Array index: 0x00CF */ 0x5408, 0x5411, 0x092E, + /* Array index: 0x00D2 */ 0x5438, 0x543E, 0x0938, + /* Array index: 0x00D5 */ 0x547B, 0x547D, 0x093F, + /* Array index: 0x00D8 */ 0x5586, 0x558A, 0x0942, + /* Array index: 0x00DB */ 0x5598, 0x559D, 0x0947, + /* Array index: 0x00DE */ 0x55A7, 0x55AE, 0x094D, + /* Array index: 0x00E1 */ 0x574D, 0x5751, 0x0955, + /* Array index: 0x00E4 */ 0x5805, 0x580A, 0x095A, + /* Array index: 0x00E7 */ 0x582F, 0x5835, 0x0960, + /* Array index: 0x00EA */ 0x58F9, 0x58FD, 0x0967, + /* Array index: 0x00ED */ 0x5914, 0x591C, 0x096C, + /* Array index: 0x00F0 */ 0x5927, 0x592E, 0x0975, + /* Array index: 0x00F3 */ 0x5947, 0x5949, 0x097D, + /* Array index: 0x00F6 */ 0x594E, 0x5957, 0x0980, + /* Array index: 0x00F9 */ 0x596A, 0x596E, 0x098A, + /* Array index: 0x00FC */ 0x5982, 0x5984, 0x098F, + /* Array index: 0x00FF */ 0x59D0, 0x59D4, 0x0992, + /* Array index: 0x0102 */ 0x59D9, 0x59DD, 0x0997, + /* Array index: 0x0105 */ 0x5B54, 0x5B5F, 0x099C, + /* Array index: 0x0108 */ 0x5B85, 0x5B8C, 0x09A8, + /* Array index: 0x010B */ 0x5B93, 0x5B9C, 0x09B0, + /* Array index: 0x010E */ 0x5BA2, 0x5BA6, 0x09BA, + /* Array index: 0x0111 */ 0x5BB3, 0x5BB9, 0x09BF, + /* Array index: 0x0114 */ 0x5BBF, 0x5BC7, 0x09C6, + /* Array index: 0x0117 */ 0x5BD0, 0x5BD4, 0x09CF, + /* Array index: 0x011A */ 0x5BDE, 0x5BEF, 0x09D4, + /* Array index: 0x011D */ 0x5C07, 0x5C11, 0x09E6, + /* Array index: 0x0120 */ 0x5C38, 0x5C40, 0x09F1, + /* Array index: 0x0123 */ 0x5DE1, 0x5DE8, 0x09FA, + /* Array index: 0x0126 */ 0x5DF1, 0x5DF4, 0x0A02, + /* Array index: 0x0129 */ 0x5E5F, 0x5E63, 0x0A06, + /* Array index: 0x012C */ 0x5E72, 0x5E7E, 0x0A0B, + /* Array index: 0x012F */ 0x5EB5, 0x5EB8, 0x0A18, + /* Array index: 0x0132 */ 0x5EC8, 0x5ECA, 0x0A1C, + /* Array index: 0x0135 */ 0x5EDF, 0x5EE3, 0x0A1F, + /* Array index: 0x0138 */ 0x5F11, 0x5F18, 0x0A24, + /* Array index: 0x013B */ 0x5F66, 0x5F71, 0x0A2C, + /* Array index: 0x013E */ 0x5F7F, 0x5F81, 0x0A38, + /* Array index: 0x0141 */ 0x5F8A, 0x5F92, 0x0A3B, + /* Array index: 0x0144 */ 0x5F97, 0x5F99, 0x0A44, + /* Array index: 0x0147 */ 0x5FA8, 0x5FAA, 0x0A47, + /* Array index: 0x014A */ 0x5FD6, 0x5FD9, 0x0A4A, + /* Array index: 0x014D */ 0x6041, 0x6043, 0x0A4E, + /* Array index: 0x0150 */ 0x6062, 0x6070, 0x0A51, + /* Array index: 0x0153 */ 0x60B0, 0x60B8, 0x0A60, + /* Array index: 0x0156 */ 0x60DF, 0x60E1, 0x0A69, + /* Array index: 0x0159 */ 0x60F9, 0x60FB, 0x0A6C, + /* Array index: 0x015C */ 0x610D, 0x610F, 0x0A6F, + /* Array index: 0x015F */ 0x6147, 0x614C, 0x0A72, + /* Array index: 0x0162 */ 0x6162, 0x6168, 0x0A78, + /* Array index: 0x0165 */ 0x6198, 0x619A, 0x0A7F, + /* Array index: 0x0168 */ 0x61C7, 0x61CB, 0x0A82, + /* Array index: 0x016B */ 0x61F6, 0x6200, 0x0A87, + /* Array index: 0x016E */ 0x620A, 0x6212, 0x0A92, + /* Array index: 0x0171 */ 0x623E, 0x6241, 0x0A9B, + /* Array index: 0x0174 */ 0x6247, 0x624D, 0x0A9F, + /* Array index: 0x0177 */ 0x62C7, 0x62DC, 0x0AA6, + /* Array index: 0x017A */ 0x62EC, 0x62F3, 0x0ABC, + /* Array index: 0x017D */ 0x633A, 0x633E, 0x0AC4, + /* Array index: 0x0180 */ 0x63A0, 0x63A2, 0x0AC9, + /* Array index: 0x0183 */ 0x63A5, 0x63AA, 0x0ACC, + /* Array index: 0x0186 */ 0x6478, 0x647A, 0x0AD2, + /* Array index: 0x0189 */ 0x6491, 0x6493, 0x0AD5, + /* Array index: 0x018C */ 0x64E1, 0x64E7, 0x0AD8, + /* Array index: 0x018F */ 0x652A, 0x652C, 0x0ADF, + /* Array index: 0x0192 */ 0x6536, 0x653F, 0x0AE2, + /* Array index: 0x0195 */ 0x654D, 0x6551, 0x0AEC, + /* Array index: 0x0198 */ 0x6574, 0x6578, 0x0AF1, + /* Array index: 0x019B */ 0x65E5, 0x65ED, 0x0AF6, + /* Array index: 0x019E */ 0x65FA, 0x65FF, 0x0AFF, + /* Array index: 0x01A1 */ 0x6606, 0x6615, 0x0B05, + /* Array index: 0x01A4 */ 0x661E, 0x6620, 0x0B15, + /* Array index: 0x01A7 */ 0x662D, 0x6631, 0x0B18, + /* Array index: 0x01AA */ 0x6641, 0x6644, 0x0B1D, + /* Array index: 0x01AD */ 0x665B, 0x665F, 0x0B21, + /* Array index: 0x01B0 */ 0x6664, 0x666F, 0x0B26, + /* Array index: 0x01B3 */ 0x6673, 0x667A, 0x0B32, + /* Array index: 0x01B6 */ 0x6687, 0x6689, 0x0B3A, + /* Array index: 0x01B9 */ 0x6696, 0x6698, 0x0B3D, + /* Array index: 0x01BC */ 0x66B2, 0x66B4, 0x0B40, + /* Array index: 0x01BF */ 0x66F0, 0x6700, 0x0B43, + /* Array index: 0x01C2 */ 0x671B, 0x671F, 0x0B54, + /* Array index: 0x01C5 */ 0x6726, 0x672E, 0x0B59, + /* Array index: 0x01C8 */ 0x674E, 0x6753, 0x0B62, + /* Array index: 0x01CB */ 0x676D, 0x6777, 0x0B68, + /* Array index: 0x01CE */ 0x67B6, 0x67B8, 0x0B73, + /* Array index: 0x01D1 */ 0x67CF, 0x67D4, 0x0B76, + /* Array index: 0x01D4 */ 0x67EF, 0x67F6, 0x0B7C, + /* Array index: 0x01D7 */ 0x683C, 0x6843, 0x0B84, + /* Array index: 0x01DA */ 0x6850, 0x6854, 0x0B8C, + /* Array index: 0x01DD */ 0x68AD, 0x68B6, 0x0B91, + /* Array index: 0x01E0 */ 0x6953, 0x695A, 0x0B9B, + /* Array index: 0x01E3 */ 0x695E, 0x6963, 0x0BA3, + /* Array index: 0x01E6 */ 0x696B, 0x696F, 0x0BA9, + /* Array index: 0x01E9 */ 0x6975, 0x6979, 0x0BAE, + /* Array index: 0x01EC */ 0x69CB, 0x69CD, 0x0BB3, + /* Array index: 0x01EF */ 0x6A38, 0x6A3A, 0x0BB6, + /* Array index: 0x01F2 */ 0x6B5F, 0x6B66, 0x0BB9, + /* Array index: 0x01F5 */ 0x6BD2, 0x6BD8, 0x0BC1, + /* Array index: 0x01F8 */ 0x6C3E, 0x6C42, 0x0BC8, + /* Array index: 0x01FB */ 0x6C5D, 0x6C60, 0x0BCD, + /* Array index: 0x01FE */ 0x6C7D, 0x6C88, 0x0BD1, + /* Array index: 0x0201 */ 0x6C90, 0x6C9B, 0x0BDD, + /* Array index: 0x0204 */ 0x6CB8, 0x6CC4, 0x0BE9, + /* Array index: 0x0207 */ 0x6CE1, 0x6CE5, 0x0BF6, + /* Array index: 0x020A */ 0x6CEE, 0x6CF0, 0x0BFB, + /* Array index: 0x020D */ 0x6D35, 0x6D3E, 0x0BFE, + /* Array index: 0x0210 */ 0x6D77, 0x6D79, 0x0C08, + /* Array index: 0x0213 */ 0x6D85, 0x6D8E, 0x0C0B, + /* Array index: 0x0216 */ 0x6DC3, 0x6DC7, 0x0C15, + /* Array index: 0x0219 */ 0x6DD8, 0x6DDA, 0x0C1A, + /* Array index: 0x021C */ 0x6DF5, 0x6DFB, 0x0C1D, + /* Array index: 0x021F */ 0x6E17, 0x6E26, 0x0C24, + /* Array index: 0x0222 */ 0x6E2B, 0x6E2F, 0x0C34, + /* Array index: 0x0225 */ 0x6E3A, 0x6E3E, 0x0C39, + /* Array index: 0x0228 */ 0x6E5B, 0x6E5F, 0x0C3E, + /* Array index: 0x022B */ 0x6EFE, 0x6F02, 0x0C43, + /* Array index: 0x022E */ 0x6F57, 0x6F5F, 0x0C48, + /* Array index: 0x0231 */ 0x6F7A, 0x6F7E, 0x0C51, + /* Array index: 0x0234 */ 0x6FBE, 0x6FC3, 0x0C56, + /* Array index: 0x0237 */ 0x6FDF, 0x6FE1, 0x0C5C, + /* Array index: 0x023A */ 0x7018, 0x701F, 0x0C5F, + /* Array index: 0x023D */ 0x7098, 0x709A, 0x0C67, + /* Array index: 0x0240 */ 0x70AB, 0x70AF, 0x0C6A, + /* Array index: 0x0243 */ 0x70B7, 0x70B9, 0x0C6F, + /* Array index: 0x0246 */ 0x7164, 0x7169, 0x0C72, + /* Array index: 0x0249 */ 0x71E5, 0x71E7, 0x0C78, + /* Array index: 0x024C */ 0x71FB, 0x7200, 0x0C7B, + /* Array index: 0x024F */ 0x723A, 0x7240, 0x0C81, + /* Array index: 0x0252 */ 0x7246, 0x7248, 0x0C88, + /* Array index: 0x0255 */ 0x731B, 0x731D, 0x0C8B, + /* Array index: 0x0258 */ 0x7329, 0x732B, 0x0C8E, + /* Array index: 0x025B */ 0x7394, 0x7398, 0x0C91, + /* Array index: 0x025E */ 0x73C9, 0x73CF, 0x0C96, + /* Array index: 0x0261 */ 0x73E3, 0x73EA, 0x0C9D, + /* Array index: 0x0264 */ 0x7403, 0x7409, 0x0CA5, + /* Array index: 0x0267 */ 0x7420, 0x743A, 0x0CAC, + /* Array index: 0x026A */ 0x743F, 0x7444, 0x0CC7, + /* Array index: 0x026D */ 0x7457, 0x746A, 0x0CCD, + /* Array index: 0x0270 */ 0x7530, 0x7533, 0x0CE1, + /* Array index: 0x0273 */ 0x7559, 0x755D, 0x0CE5, + /* Array index: 0x0276 */ 0x75B1, 0x75BE, 0x0CEA, + /* Array index: 0x0279 */ 0x761F, 0x7626, 0x0CF8, + /* Array index: 0x027C */ 0x767B, 0x767E, 0x0D00, + /* Array index: 0x027F */ 0x76DB, 0x76E4, 0x0D04, + /* Array index: 0x0282 */ 0x77ED, 0x77EF, 0x0D0E, + /* Array index: 0x0285 */ 0x7825, 0x7827, 0x0D11, + /* Array index: 0x0288 */ 0x788C, 0x788E, 0x0D14, + /* Array index: 0x028B */ 0x78BA, 0x78BC, 0x0D17, + /* Array index: 0x028E */ 0x792A, 0x792C, 0x0D1A, + /* Array index: 0x0291 */ 0x7947, 0x7949, 0x0D1D, + /* Array index: 0x0294 */ 0x7956, 0x7960, 0x0D20, + /* Array index: 0x0297 */ 0x798D, 0x7991, 0x0D2B, + /* Array index: 0x029A */ 0x79BD, 0x79C1, 0x0D30, + /* Array index: 0x029D */ 0x79C9, 0x79CB, 0x0D35, + /* Array index: 0x02A0 */ 0x7A3B, 0x7A40, 0x0D38, + /* Array index: 0x02A3 */ 0x7B49, 0x7B56, 0x0D3E, + /* Array index: 0x02A6 */ 0x7C3D, 0x7C3F, 0x0D4C, + /* Array index: 0x02A9 */ 0x7CB1, 0x7CB3, 0x0D4F, + /* Array index: 0x02AC */ 0x7CDE, 0x7CE0, 0x0D52, + /* Array index: 0x02AF */ 0x7D02, 0x7D0D, 0x0D55, + /* Array index: 0x02B2 */ 0x7D17, 0x7D1B, 0x0D61, + /* Array index: 0x02B5 */ 0x7D20, 0x7D22, 0x0D66, + /* Array index: 0x02B8 */ 0x7D2B, 0x7D30, 0x0D69, + /* Array index: 0x02BB */ 0x7D42, 0x7D46, 0x0D6F, + /* Array index: 0x02BE */ 0x7D71, 0x7D73, 0x0D74, + /* Array index: 0x02C1 */ 0x7DB1, 0x7DB5, 0x0D77, + /* Array index: 0x02C4 */ 0x7DBA, 0x7DBF, 0x0D7C, + /* Array index: 0x02C7 */ 0x7DDD, 0x7DE3, 0x0D82, + /* Array index: 0x02CA */ 0x7E1B, 0x7E23, 0x0D89, + /* Array index: 0x02CD */ 0x7E69, 0x7E6D, 0x0D92, + /* Array index: 0x02D0 */ 0x7FDF, 0x7FE1, 0x0D97, + /* Array index: 0x02D3 */ 0x806F, 0x8073, 0x0D9A, + /* Array index: 0x02D6 */ 0x807D, 0x807F, 0x0D9F, + /* Array index: 0x02D9 */ 0x8084, 0x808C, 0x0DA2, + /* Array index: 0x02DC */ 0x8105, 0x810A, 0x0DAB, + /* Array index: 0x02DF */ 0x8178, 0x817A, 0x0DB1, + /* Array index: 0x02E2 */ 0x81BD, 0x81C2, 0x0DB4, + /* Array index: 0x02E5 */ 0x81FA, 0x81FE, 0x0DBA, + /* Array index: 0x02E8 */ 0x821B, 0x8221, 0x0DBF, + /* Array index: 0x02EB */ 0x822A, 0x822C, 0x0DC6, + /* Array index: 0x02EE */ 0x8235, 0x8239, 0x0DC9, + /* Array index: 0x02F1 */ 0x826E, 0x8272, 0x0DCE, + /* Array index: 0x02F4 */ 0x82AC, 0x82BF, 0x0DD3, + /* Array index: 0x02F7 */ 0x82D1, 0x82D7, 0x0DE7, + /* Array index: 0x02FA */ 0x82E5, 0x82E7, 0x0DEE, + /* Array index: 0x02FD */ 0x82FD, 0x8305, 0x0DF1, + /* Array index: 0x0300 */ 0x8334, 0x8339, 0x0DFA, + /* Array index: 0x0303 */ 0x83A9, 0x83AB, 0x0E00, + /* Array index: 0x0306 */ 0x83EF, 0x83F4, 0x0E03, + /* Array index: 0x0309 */ 0x840A, 0x840E, 0x0E09, + /* Array index: 0x030C */ 0x8568, 0x856A, 0x0E0E, + /* Array index: 0x030F */ 0x85A6, 0x85AA, 0x0E11, + /* Array index: 0x0312 */ 0x85CD, 0x85CF, 0x0E16, + /* Array index: 0x0315 */ 0x865B, 0x865F, 0x0E19, + /* Array index: 0x0318 */ 0x8861, 0x8863, 0x0E1E, + /* Array index: 0x031B */ 0x887E, 0x8882, 0x0E21, + /* Array index: 0x031E */ 0x88F3, 0x88F5, 0x0E26, + /* Array index: 0x0321 */ 0x8A16, 0x8A18, 0x0E29, + /* Array index: 0x0324 */ 0x8A6D, 0x8A75, 0x0E2C, + /* Array index: 0x0327 */ 0x8AA0, 0x8AAA, 0x0E35, + /* Array index: 0x032A */ 0x8AEA, 0x8AEE, 0x0E40, + /* Array index: 0x032D */ 0x8AF6, 0x8AFA, 0x0E45, + /* Array index: 0x0330 */ 0x8AFE, 0x8B04, 0x0E4A, + /* Array index: 0x0333 */ 0x8B16, 0x8B1D, 0x0E51, + /* Array index: 0x0336 */ 0x8C9D, 0x8CA2, 0x0E59, + /* Array index: 0x0339 */ 0x8CA7, 0x8CCA, 0x0E5F, + /* Array index: 0x033C */ 0x8CE0, 0x8CE6, 0x0E83, + /* Array index: 0x033F */ 0x8CFB, 0x8CFD, 0x0E8A, + /* Array index: 0x0342 */ 0x8D04, 0x8D0A, 0x0E8D, + /* Array index: 0x0345 */ 0x8E47, 0x8E4A, 0x0E94, + /* Array index: 0x0348 */ 0x8EAA, 0x8EAC, 0x0E98, + /* Array index: 0x034B */ 0x8ECA, 0x8ECD, 0x0E9B, + /* Array index: 0x034E */ 0x8F12, 0x8F15, 0x0E9F, + /* Array index: 0x0351 */ 0x8F1B, 0x8F1F, 0x0EA3, + /* Array index: 0x0354 */ 0x8F26, 0x8F2A, 0x0EA8, + /* Array index: 0x0357 */ 0x8FAD, 0x8FB2, 0x0EAD, + /* Array index: 0x035A */ 0x9000, 0x9008, 0x0EB3, + /* Array index: 0x035D */ 0x900D, 0x9023, 0x0EBC, + /* Array index: 0x0360 */ 0x904A, 0x9055, 0x0ED3, + /* Array index: 0x0363 */ 0x905C, 0x9063, 0x0EDF, + /* Array index: 0x0366 */ 0x906D, 0x906F, 0x0EE7, + /* Array index: 0x0369 */ 0x907C, 0x908A, 0x0EEA, + /* Array index: 0x036C */ 0x90AF, 0x90B1, 0x0EF9, + /* Array index: 0x036F */ 0x9149, 0x914E, 0x0EFC, + /* Array index: 0x0372 */ 0x91AB, 0x91B5, 0x0F02, + /* Array index: 0x0375 */ 0x91C9, 0x91D1, 0x0F0D, + /* Array index: 0x0378 */ 0x9210, 0x9212, 0x0F16, + /* Array index: 0x037B */ 0x9262, 0x9266, 0x0F19, + /* Array index: 0x037E */ 0x931E, 0x9328, 0x0F1E, + /* Array index: 0x0381 */ 0x958F, 0x9594, 0x0F29, + /* Array index: 0x0384 */ 0x95A3, 0x95A5, 0x0F2F, + /* Array index: 0x0387 */ 0x95D4, 0x95D6, 0x0F32, + /* Array index: 0x038A */ 0x964B, 0x964D, 0x0F35, + /* Array index: 0x038D */ 0x965B, 0x9664, 0x0F38, + /* Array index: 0x0390 */ 0x9673, 0x9678, 0x0F42, + /* Array index: 0x0393 */ 0x968A, 0x968E, 0x0F48, + /* Array index: 0x0396 */ 0x9698, 0x969C, 0x0F4D, + /* Array index: 0x0399 */ 0x96C0, 0x96CE, 0x0F52, + /* Array index: 0x039C */ 0x96E8, 0x96EA, 0x0F61, + /* Array index: 0x039F */ 0x97FF, 0x9813, 0x0F64, + /* Array index: 0x03A2 */ 0x984C, 0x984E, 0x0F79, + /* Array index: 0x03A5 */ 0x98ED, 0x98EF, 0x0F7C, + /* Array index: 0x03A8 */ 0x98FC, 0x98FE, 0x0F7F, + /* Array index: 0x03AB */ 0x9949, 0x994D, 0x0F82, + /* Array index: 0x03AE */ 0x99AC, 0x99AE, 0x0F87, + /* Array index: 0x03B1 */ 0x99D0, 0x99D2, 0x0F8A, + /* Array index: 0x03B4 */ 0x9B41, 0x9B45, 0x0F8D, + /* Array index: 0x03B7 */ 0x9DF8, 0x9DFA, 0x0F92, + /* Array index: 0x03BA */ 0xAC07, 0xAC0A, 0x0F95, + /* Array index: 0x03BD */ 0xAC10, 0xAC1D, 0x0F99, + /* Array index: 0x03C0 */ 0xAC2C, 0xAC31, 0x0FA7, + /* Array index: 0x03C3 */ 0xAC80, 0xAC8C, 0x0FAD, + /* Array index: 0x03C6 */ 0xAC9C, 0xACA1, 0x0FBA, + /* Array index: 0x03C9 */ 0xACA8, 0xACB0, 0x0FC0, + /* Array index: 0x03CC */ 0xACB8, 0xACBD, 0x0FC9, + /* Array index: 0x03CF */ 0xACEF, 0xACF6, 0x0FCF, + /* Array index: 0x03D2 */ 0xAD73, 0xAD76, 0x0FD7, + /* Array index: 0x03D5 */ 0xAD7B, 0xAD82, 0x0FDB, + /* Array index: 0x03D8 */ 0xADFF, 0xAE01, 0x0FE3, + /* Array index: 0x03DB */ 0xAE4A, 0xAE50, 0x0FE6, + /* Array index: 0x03DE */ 0xAE5C, 0xAE61, 0x0FED, + /* Array index: 0x03E1 */ 0xAE78, 0xAE7D, 0x0FF3, + /* Array index: 0x03E4 */ 0xAEBC, 0xAEC0, 0x0FF9, + /* Array index: 0x03E7 */ 0xAECC, 0xAED1, 0x0FFE, + /* Array index: 0x03EA */ 0xAF3F, 0xAF43, 0x1004, + /* Array index: 0x03ED */ 0xAFC7, 0xAFCE, 0x1009, + /* Array index: 0x03F0 */ 0xB053, 0xB059, 0x1011, + /* Array index: 0x03F3 */ 0xB098, 0xB0A2, 0x1018, + /* Array index: 0x03F6 */ 0xB0A8, 0xB0B5, 0x1023, + /* Array index: 0x03F9 */ 0xB0C4, 0xB0C9, 0x1031, + /* Array index: 0x03FC */ 0xB108, 0xB10C, 0x1037, + /* Array index: 0x03FF */ 0xB118, 0xB11D, 0x103C, + /* Array index: 0x0402 */ 0xB123, 0xB125, 0x1042, + /* Array index: 0x0405 */ 0xB134, 0xB139, 0x1045, + /* Array index: 0x0408 */ 0xB192, 0xB194, 0x104B, + /* Array index: 0x040B */ 0xB298, 0xB29A, 0x104E, + /* Array index: 0x040E */ 0xB2E2, 0xB301, 0x1051, + /* Array index: 0x0411 */ 0xB310, 0xB315, 0x1071, + /* Array index: 0x0414 */ 0xB354, 0xB35F, 0x1077, + /* Array index: 0x0417 */ 0xB380, 0xB385, 0x1083, + /* Array index: 0x041A */ 0xB524, 0xB52A, 0x1089, + /* Array index: 0x041D */ 0xB540, 0xB545, 0x1090, + /* Array index: 0x0420 */ 0xB54B, 0xB54D, 0x1096, + /* Array index: 0x0423 */ 0xB55C, 0xB561, 0x1099, + /* Array index: 0x0426 */ 0xB5B0, 0xB5B5, 0x109F, + /* Array index: 0x0429 */ 0xB5BB, 0xB5BD, 0x10A5, + /* Array index: 0x042C */ 0xB5CC, 0xB5D1, 0x10A8, + /* Array index: 0x042F */ 0xB78C, 0xB799, 0x10AE, + /* Array index: 0x0432 */ 0xB7A8, 0xB7AD, 0x10BC, + /* Array index: 0x0435 */ 0xB7FC, 0xB801, 0x10C2, + /* Array index: 0x0438 */ 0xB807, 0xB809, 0x10C8, + /* Array index: 0x043B */ 0xB834, 0xB839, 0x10CB, + /* Array index: 0x043E */ 0xB9CC, 0xB9D2, 0x10D1, + /* Array index: 0x0441 */ 0xB9E1, 0xB9E5, 0x10D8, + /* Array index: 0x0444 */ 0xB9F4, 0xB9FA, 0x10DD, + /* Array index: 0x0447 */ 0xBA53, 0xBA55, 0x10E4, + /* Array index: 0x044A */ 0xBA64, 0xBA69, 0x10E7, + /* Array index: 0x044D */ 0xBA83, 0xBA87, 0x10ED, + /* Array index: 0x0450 */ 0xBAA8, 0xBAAC, 0x10F2, + /* Array index: 0x0453 */ 0xBB34, 0xBB3E, 0x10F7, + /* Array index: 0x0456 */ 0xBC08, 0xBC1F, 0x1102, + /* Array index: 0x0459 */ 0xBC40, 0xBC45, 0x111A, + /* Array index: 0x045C */ 0xBCB0, 0xBCB5, 0x1120, + /* Array index: 0x045F */ 0xBCCD, 0xBCD1, 0x1126, + /* Array index: 0x0462 */ 0xBCF4, 0xBCF8, 0x112B, + /* Array index: 0x0465 */ 0xBD87, 0xBD8A, 0x1130, + /* Array index: 0x0468 */ 0xBE57, 0xBE5B, 0x1134, + /* Array index: 0x046B */ 0xBE70, 0xBE75, 0x1139, + /* Array index: 0x046E */ 0xBE7B, 0xBE7D, 0x113F, + /* Array index: 0x0471 */ 0xBE8C, 0xBE91, 0x1142, + /* Array index: 0x0474 */ 0xBEE3, 0xBEE5, 0x1148, + /* Array index: 0x0477 */ 0xBF18, 0xBF1D, 0x114B, + /* Array index: 0x047A */ 0xC0AC, 0xC0B6, 0x1151, + /* Array index: 0x047D */ 0xC0BC, 0xC0C1, 0x115C, + /* Array index: 0x0480 */ 0xC0D8, 0xC0DD, 0x1162, + /* Array index: 0x0483 */ 0xC11C, 0xC127, 0x1168, + /* Array index: 0x0486 */ 0xC12C, 0xC131, 0x1174, + /* Array index: 0x0489 */ 0xC148, 0xC14D, 0x117A, + /* Array index: 0x048C */ 0xC164, 0xC169, 0x1180, + /* Array index: 0x048F */ 0xC18C, 0xC190, 0x1186, + /* Array index: 0x0492 */ 0xC2EB, 0xC2F1, 0x118B, + /* Array index: 0x0495 */ 0xC2F8, 0xC2FC, 0x1192, + /* Array index: 0x0498 */ 0xC313, 0xC315, 0x1197, + /* Array index: 0x049B */ 0xC4FF, 0xC501, 0x119A, + /* Array index: 0x049E */ 0xC544, 0xC54E, 0x119D, + /* Array index: 0x04A1 */ 0xC553, 0xC559, 0x11A8, + /* Array index: 0x04A4 */ 0xC55D, 0xC561, 0x11AF, + /* Array index: 0x04A7 */ 0xC570, 0xC575, 0x11B4, + /* Array index: 0x04AA */ 0xC5B8, 0xC5BE, 0x11BA, + /* Array index: 0x04AD */ 0xC5C4, 0xC5D1, 0x11C1, + /* Array index: 0x04B0 */ 0xC5EC, 0xC5F0, 0x11CF, + /* Array index: 0x04B3 */ 0xC5FC, 0xC608, 0x11D4, + /* Array index: 0x04B6 */ 0xC618, 0xC61C, 0x11E1, + /* Array index: 0x04B9 */ 0xC62C, 0xC63B, 0x11E6, + /* Array index: 0x04BC */ 0xC650, 0xC655, 0x11F6, + /* Array index: 0x04BF */ 0xC6B8, 0xC6BA, 0x11FC, + /* Array index: 0x04C2 */ 0xC74F, 0xC758, 0x11FF, + /* Array index: 0x04C5 */ 0xC77C, 0xC77E, 0x1209, + /* Array index: 0x04C8 */ 0xC783, 0xC78A, 0x120C, + /* Array index: 0x04CB */ 0xC794, 0xC79A, 0x1214, + /* Array index: 0x04CE */ 0xC7A0, 0xC7A6, 0x121B, + /* Array index: 0x04D1 */ 0xC7BC, 0xC7C1, 0x1222, + /* Array index: 0x04D4 */ 0xC883, 0xC88D, 0x1228, + /* Array index: 0x04D7 */ 0xC904, 0xC906, 0x1233, + /* Array index: 0x04DA */ 0xC9D9, 0xC9DD, 0x1236, + /* Array index: 0x04DD */ 0xC9EC, 0xC9F1, 0x123B, + /* Array index: 0x04E0 */ 0xCA08, 0xCA0D, 0x1241, + /* Array index: 0x04E3 */ 0xCA5C, 0xCA61, 0x1247, + /* Array index: 0x04E6 */ 0xCC27, 0xCC29, 0x124D, + /* Array index: 0x04E9 */ 0xCC38, 0xCC3E, 0x1250, + /* Array index: 0x04EC */ 0xCC54, 0xCC59, 0x1257, + /* Array index: 0x04EF */ 0xCCA8, 0xCCAD, 0x125D, + /* Array index: 0x04F2 */ 0xCE5F, 0xCE61, 0x1263, + /* Array index: 0x04F5 */ 0xCEA0, 0xCEA5, 0x1266, + /* Array index: 0x04F8 */ 0xCEF4, 0xCEF9, 0x126C, + /* Array index: 0x04FB */ 0xCF2C, 0xCF31, 0x1272, + /* Array index: 0x04FE */ 0xD0D0, 0xD0D5, 0x1278, + /* Array index: 0x0501 */ 0xD0EC, 0xD0F1, 0x127E, + /* Array index: 0x0504 */ 0xD140, 0xD145, 0x1284, + /* Array index: 0x0507 */ 0xD30C, 0xD310, 0x128A, + /* Array index: 0x050A */ 0xD31C, 0xD321, 0x128F, + /* Array index: 0x050D */ 0xD338, 0xD33D, 0x1295, + /* Array index: 0x0510 */ 0xD38C, 0xD391, 0x129B, + /* Array index: 0x0513 */ 0xD584, 0xD589, 0x12A1, + /* Array index: 0x0516 */ 0xD610, 0xD615, 0x12A7, + /* Array index: 0x0519 */ 0xD754, 0xD759, 0x12AD, + /* Array index: 0x051C */ 0xF900, 0xFA0B, 0x12B3, + /* Array index: 0x051F */ 0xFF01, 0xFF5E, 0x13BF, + /* Array index: 0x0522 */ 0xFFE0, 0xFFE6, 0x141D, + /* Ranges content */ + /* Range 0x00B0 - 0x00BF, array index: 0x0525 */ + 0x2146,0x213E,0x2977,0x2978,0x2225,INVALC,0x2252,0x2124, + 0x222C,0x2976,0x282C,INVALC,0x2879,0x2876,0x287A,0x222F, + /* Range 0x0131 - 0x0133, array index: 0x0535 */ + 0x2925,0x2826,0x2926, + /* Range 0x013F - 0x0142, array index: 0x0538 */ + 0x2828,0x2928,0x2829,0x2929, + /* Range 0x0149 - 0x014B, array index: 0x053C */ + 0x2930,0x282F,0x292F, + /* Range 0x02D8 - 0x02DD, array index: 0x053F */ + 0x2228,0x222B,0x222A,0x222D,INVALC,0x2229, + /* Range 0x0391 - 0x03A9, array index: 0x0545 */ + 0x2541,0x2542,0x2543,0x2544,0x2545,0x2546,0x2547,0x2548, + 0x2549,0x254A,0x254B,0x254C,0x254D,0x254E,0x254F,0x2550, + 0x2551,INVALC,0x2552,0x2553,0x2554,0x2555,0x2556,0x2557, + 0x2558, + /* Range 0x03B1 - 0x03C9, array index: 0x055E */ + 0x2561,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568, + 0x2569,0x256A,0x256B,0x256C,0x256D,0x256E,0x256F,0x2570, + 0x2571,INVALC,0x2572,0x2573,0x2574,0x2575,0x2576,0x2577, + 0x2578, + /* Range 0x0410 - 0x0451, array index: 0x0577 */ + 0x2C21,0x2C22,0x2C23,0x2C24,0x2C25,0x2C26,0x2C28,0x2C29, + 0x2C2A,0x2C2B,0x2C2C,0x2C2D,0x2C2E,0x2C2F,0x2C30,0x2C31, + 0x2C32,0x2C33,0x2C34,0x2C35,0x2C36,0x2C37,0x2C38,0x2C39, + 0x2C3A,0x2C3B,0x2C3C,0x2C3D,0x2C3E,0x2C3F,0x2C40,0x2C41, + 0x2C51,0x2C52,0x2C53,0x2C54,0x2C55,0x2C56,0x2C58,0x2C59, + 0x2C5A,0x2C5B,0x2C5C,0x2C5D,0x2C5E,0x2C5F,0x2C60,0x2C61, + 0x2C62,0x2C63,0x2C64,0x2C65,0x2C66,0x2C67,0x2C68,0x2C69, + 0x2C6A,0x2C6B,0x2C6C,0x2C6D,0x2C6E,0x2C6F,0x2C70,0x2C71, + INVALC,0x2C57, + /* Range 0x207F - 0x2084, array index: 0x05B9 */ + 0x297A,INVALC,0x297B,0x297C,0x297D,0x297E, + /* Range 0x215B - 0x2169, array index: 0x05BF */ + 0x287B,0x287C,0x287D,0x287E,INVALC,0x2530,0x2531,0x2532, + 0x2533,0x2534,0x2535,0x2536,0x2537,0x2538,0x2539, + /* Range 0x2170 - 0x2179, array index: 0x05CE */ + 0x2521,0x2522,0x2523,0x2524,0x2525,0x2526,0x2527,0x2528, + 0x2529,0x252A, + /* Range 0x2190 - 0x2199, array index: 0x05D8 */ + 0x2167,0x2168,0x2166,0x2169,0x216A,0x2255,0x2258,0x2256, + 0x2259,0x2257, + /* Range 0x2225 - 0x222E, array index: 0x05E2 */ + 0x212B,INVALC,0x217C,0x217D,0x217B,0x217A,0x2172,0x2173, + INVALC,0x2231, + /* Range 0x2460 - 0x246E, array index: 0x05EC */ + 0x2867,0x2868,0x2869,0x286A,0x286B,0x286C,0x286D,0x286E, + 0x286F,0x2870,0x2871,0x2872,0x2873,0x2874,0x2875, + /* Range 0x2474 - 0x2482, array index: 0x05FB */ + 0x2967,0x2968,0x2969,0x296A,0x296B,0x296C,0x296D,0x296E, + 0x296F,0x2970,0x2971,0x2972,0x2973,0x2974,0x2975, + /* Range 0x249C - 0x24B5, array index: 0x060A */ + 0x294D,0x294E,0x294F,0x2950,0x2951,0x2952,0x2953,0x2954, + 0x2955,0x2956,0x2957,0x2958,0x2959,0x295A,0x295B,0x295C, + 0x295D,0x295E,0x295F,0x2960,0x2961,0x2962,0x2963,0x2964, + 0x2965,0x2966, + /* Range 0x24D0 - 0x24E9, array index: 0x0624 */ + 0x284D,0x284E,0x284F,0x2850,0x2851,0x2852,0x2853,0x2854, + 0x2855,0x2856,0x2857,0x2858,0x2859,0x285A,0x285B,0x285C, + 0x285D,0x285E,0x285F,0x2860,0x2861,0x2862,0x2863,0x2864, + 0x2865,0x2866, + /* Range 0x2500 - 0x2503, array index: 0x063E */ + 0x2621,0x262C,0x2622,0x262D, + /* Range 0x250C - 0x254B, array index: 0x0642 */ + 0x2623,0x2648,0x2647,0x262E,0x2624,0x2642,0x2641,0x262F, + 0x2626,0x2646,0x2645,0x2631,0x2625,0x2644,0x2643,0x2630, + 0x2627,0x263C,0x2649,0x264A,0x2637,0x264B,0x264C,0x2632, + 0x2629,0x263E,0x264D,0x264E,0x2639,0x264F,0x2650,0x2634, + 0x2628,0x2651,0x2652,0x2638,0x263D,0x2653,0x2654,0x2633, + 0x262A,0x2655,0x2656,0x263A,0x263F,0x2657,0x2658,0x2635, + 0x262B,0x2659,0x265A,0x263B,0x265B,0x265C,0x2640,0x265D, + 0x265E,0x265F,0x2660,0x2661,0x2662,0x2663,0x2664,0x2636, + /* Range 0x25A0 - 0x25A9, array index: 0x0682 */ + 0x2161,0x2160,INVALC,0x2243,0x2247,0x2248,0x224B,0x224A, + 0x2249,0x224C, + /* Range 0x25C6 - 0x25C8, array index: 0x068C */ + 0x215F,0x215E,0x2242, + /* Range 0x25CE - 0x25D1, array index: 0x068F */ + 0x215D,0x215C,0x2244,0x2245, + /* Range 0x2660 - 0x266D, array index: 0x0693 */ + 0x223C,0x223D,INVALC,0x2240,0x223B,0x223E,INVALC,0x223F, + 0x224D,0x225B,0x225C,INVALC,0x225D,0x225A, + /* Range 0x3000 - 0x3003, array index: 0x06A1 */ + 0x2121,0x2122,0x2123,0x2128, + /* Range 0x3008 - 0x3015, array index: 0x06A5 */ + 0x2134,0x2135,0x2136,0x2137,0x2138,0x2139,0x213A,0x213B, + 0x213C,0x213D,INVALC,0x216B,0x2132,0x2133, + /* Range 0x3041 - 0x3093, array index: 0x06B3 */ + 0x2A21,0x2A22,0x2A23,0x2A24,0x2A25,0x2A26,0x2A27,0x2A28, + 0x2A29,0x2A2A,0x2A2B,0x2A2C,0x2A2D,0x2A2E,0x2A2F,0x2A30, + 0x2A31,0x2A32,0x2A33,0x2A34,0x2A35,0x2A36,0x2A37,0x2A38, + 0x2A39,0x2A3A,0x2A3B,0x2A3C,0x2A3D,0x2A3E,0x2A3F,0x2A40, + 0x2A41,0x2A42,0x2A43,0x2A44,0x2A45,0x2A46,0x2A47,0x2A48, + 0x2A49,0x2A4A,0x2A4B,0x2A4C,0x2A4D,0x2A4E,0x2A4F,0x2A50, + 0x2A51,0x2A52,0x2A53,0x2A54,0x2A55,0x2A56,0x2A57,0x2A58, + 0x2A59,0x2A5A,0x2A5B,0x2A5C,0x2A5D,0x2A5E,0x2A5F,0x2A60, + 0x2A61,0x2A62,0x2A63,0x2A64,0x2A65,0x2A66,0x2A67,0x2A68, + 0x2A69,0x2A6A,0x2A6B,0x2A6C,0x2A6D,0x2A6E,0x2A6F,0x2A70, + 0x2A71,0x2A72,0x2A73, + /* Range 0x30A1 - 0x30F6, array index: 0x0706 */ + 0x2B21,0x2B22,0x2B23,0x2B24,0x2B25,0x2B26,0x2B27,0x2B28, + 0x2B29,0x2B2A,0x2B2B,0x2B2C,0x2B2D,0x2B2E,0x2B2F,0x2B30, + 0x2B31,0x2B32,0x2B33,0x2B34,0x2B35,0x2B36,0x2B37,0x2B38, + 0x2B39,0x2B3A,0x2B3B,0x2B3C,0x2B3D,0x2B3E,0x2B3F,0x2B40, + 0x2B41,0x2B42,0x2B43,0x2B44,0x2B45,0x2B46,0x2B47,0x2B48, + 0x2B49,0x2B4A,0x2B4B,0x2B4C,0x2B4D,0x2B4E,0x2B4F,0x2B50, + 0x2B51,0x2B52,0x2B53,0x2B54,0x2B55,0x2B56,0x2B57,0x2B58, + 0x2B59,0x2B5A,0x2B5B,0x2B5C,0x2B5D,0x2B5E,0x2B5F,0x2B60, + 0x2B61,0x2B62,0x2B63,0x2B64,0x2B65,0x2B66,0x2B67,0x2B68, + 0x2B69,0x2B6A,0x2B6B,0x2B6C,0x2B6D,0x2B6E,0x2B6F,0x2B70, + 0x2B71,0x2B72,0x2B73,0x2B74,0x2B75,0x2B76, + /* Range 0x3131 - 0x318E, array index: 0x075C */ + 0x2421,0x2422,0x2423,0x2424,0x2425,0x2426,0x2427,0x2428, + 0x2429,0x242A,0x242B,0x242C,0x242D,0x242E,0x242F,0x2430, + 0x2431,0x2432,0x2433,0x2434,0x2435,0x2436,0x2437,0x2438, + 0x2439,0x243A,0x243B,0x243C,0x243D,0x243E,0x243F,0x2440, + 0x2441,0x2442,0x2443,0x2444,0x2445,0x2446,0x2447,0x2448, + 0x2449,0x244A,0x244B,0x244C,0x244D,0x244E,0x244F,0x2450, + 0x2451,0x2452,0x2453,0x2454,0x2455,0x2456,0x2457,0x2458, + 0x2459,0x245A,0x245B,0x245C,0x245D,0x245E,0x245F,0x2460, + 0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467,0x2468, + 0x2469,0x246A,0x246B,0x246C,0x246D,0x246E,0x246F,0x2470, + 0x2471,0x2472,0x2473,0x2474,0x2475,0x2476,0x2477,0x2478, + 0x2479,0x247A,0x247B,0x247C,0x247D,0x247E, + /* Range 0x3200 - 0x321C, array index: 0x07BA */ + 0x2931,0x2932,0x2933,0x2934,0x2935,0x2936,0x2937,0x2938, + 0x2939,0x293A,0x293B,0x293C,0x293D,0x293E,0x293F,0x2940, + 0x2941,0x2942,0x2943,0x2944,0x2945,0x2946,0x2947,0x2948, + 0x2949,0x294A,0x294B,0x294C,0x225F, + /* Range 0x3260 - 0x327B, array index: 0x07D7 */ + 0x2831,0x2832,0x2833,0x2834,0x2835,0x2836,0x2837,0x2838, + 0x2839,0x283A,0x283B,0x283C,0x283D,0x283E,0x283F,0x2840, + 0x2841,0x2842,0x2843,0x2844,0x2845,0x2846,0x2847,0x2848, + 0x2849,0x284A,0x284B,0x284C, + /* Range 0x3380 - 0x33CA, array index: 0x07F3 */ + 0x2749,0x274A,0x274B,0x274C,0x274D,INVALC,INVALC,INVALC, + 0x273A,0x273B,0x275C,0x275D,0x275E,0x2736,0x2737,0x2738, + 0x2754,0x2755,0x2756,0x2757,0x2758,0x2721,0x2722,0x2723, + 0x2725,0x272B,0x272C,0x272D,0x272E,0x272F,0x2730,0x2731, + 0x2732,0x2733,0x2734,0x2727,0x2728,0x2729,0x272A,0x273D, + 0x273E,0x2765,0x2766,0x2767,0x2768,0x2761,0x2762,0x2763, + 0x273F,0x2740,0x2741,0x2742,0x2743,0x2744,0x2745,0x2746, + 0x2747,0x2748,0x274E,0x274F,0x2750,0x2751,0x2752,0x2753, + 0x275A,0x275B,0x2263,0x276C,0x2726,0x2760,0x276F,0x2261, + 0x273C,0x276D,0x2735, + /* Range 0x33DB - 0x33DD, array index: 0x083E */ + 0x2764,0x276E,0x2769, + /* Range 0x4E07 - 0x4E0D, array index: 0x0841 */ + 0x5832,0x6D5B,0x5F32,0x5F3E,0x793B,INVALC,0x5C74, + /* Range 0x4E14 - 0x4E19, array index: 0x0848 */ + 0x7326,0x5D60,0x6126,INVALC,0x4E78,0x5C30, + /* Range 0x4E4B - 0x4E4F, array index: 0x084E */ + 0x717D,INVALC,0x5E3F,0x7B3A,0x7939, + /* Range 0x4E5D - 0x4E5F, array index: 0x0853 */ + 0x4E7A,0x4B77,0x6525, + /* Range 0x4E8E - 0x4E95, array index: 0x0856 */ + 0x694D,INVALC,0x6A27,0x6976,0x7B3B,INVALC,0x6769,0x6F4C, + /* Range 0x4EA1 - 0x4EAE, array index: 0x085E */ + 0x584C,0x7971,INVALC,0x4E5F,0x7A24,0x6632,INVALC,0x7A7B, + INVALC,INVALC,0x7A3D,0x4C48,0x6F4D,0x5555, + /* Range 0x4ED4 - 0x4ED9, array index: 0x086C */ + 0x6D28,0x5E42,0x7662,0x6D5C,0x5C75,0x6039, + /* Range 0x4EE3 - 0x4EE5, array index: 0x0872 */ + 0x535B,0x5635,0x6C24, + /* Range 0x4F09 - 0x4F11, array index: 0x0875 */ + 0x7972,0x6C25,0x505F,INVALC,0x676A,0x506B,0x5C51,0x5B69, + 0x7D4C, + /* Range 0x4F46 - 0x4F48, array index: 0x087E */ + 0x5323,0x6E37,0x784F, + /* Range 0x4F4D - 0x4F51, array index: 0x0881 */ + 0x6A48,0x6E38,0x712C,0x7125,0x694E, + /* Range 0x4F59 - 0x4F5C, array index: 0x0886 */ + 0x6579,0x6C6A,0x5D56,0x6D42, + /* Range 0x4FC2 - 0x4FC4, array index: 0x088A */ + 0x4C75,0x7535,0x642D, + /* Range 0x4FDD - 0x4FE1, array index: 0x088D */ + 0x5C41,INVALC,0x5E46,0x7A6F,0x6361, + /* Range 0x5023 - 0x502D, array index: 0x0892 */ + 0x5B27,0x7637,INVALC,0x4F66,0x7072,0x4B5A,INVALC,0x6752, + 0x5743,0x7670,0x685E, + /* Range 0x5047 - 0x5049, array index: 0x089D */ + 0x4A23,0x4C27,0x6A49, + /* Range 0x5074 - 0x5078, array index: 0x08A0 */ + 0x7630,0x6F4F,0x694F,INVALC,0x775E, + /* Range 0x50FF - 0x5101, array index: 0x08A5 */ + 0x5E47,0x6B70,0x7156, + /* Range 0x5140 - 0x514E, array index: 0x08A8 */ + 0x6834,0x6B43,INVALC,0x6A2A,0x7A7C,0x7576,0x703C,0x7D54, + 0x603B,0x4E43,INVALC,0x503A,0x773A,0x5873,0x774D, + /* Range 0x5165 - 0x516E, array index: 0x08B7 */ + 0x6C7D,INVALC,0x522E,0x6E6F,0x5557,0x6A64,0x7822,0x4D6B, + 0x573F,0x7B31, + /* Range 0x5175 - 0x5178, array index: 0x08C1 */ + 0x5C32,0x506C,0x4E7D,0x6E70, + /* Range 0x51C9 - 0x51CD, array index: 0x08C5 */ + 0x5558,INVALC,0x703D,0x5750,0x5450, + /* Range 0x51DC - 0x51DE, array index: 0x08CA */ + 0x574F,0x6B6A,0x7D6B, + /* Range 0x51F6 - 0x51FA, array index: 0x08CD */ + 0x7D55,INVALC,0x7448,0x686A,0x7573, + /* Range 0x5206 - 0x520A, array index: 0x08D2 */ + 0x5D42,0x6F37,0x6754,INVALC,0x4A4A, + /* Range 0x5236 - 0x523B, array index: 0x08D7 */ + 0x7024,0x616C,0x4F67,0x734B,0x6D29,0x4A3E, + /* Range 0x524A - 0x524D, array index: 0x08DD */ + 0x5E7B,0x503B,0x5537,0x6E71, + /* Range 0x5287 - 0x5289, array index: 0x08E1 */ + 0x503C,0x5B79,0x5731, + /* Range 0x52A9 - 0x52AB, array index: 0x08E4 */ + 0x703E,0x523D,0x4C24, + /* Range 0x52D5 - 0x52E4, array index: 0x08E7 */ + 0x5451,0x696D,INVALC,0x4A6B,0x5962,INVALC,0x7D32,INVALC, + 0x632D,0x564C,0x5934,INVALC,INVALC,0x6127,0x6E53,0x5043, + /* Range 0x5315 - 0x5319, array index: 0x08F7 */ + 0x5D62,0x7B79,0x5D41,INVALC,0x6335, + /* Range 0x533F - 0x534A, array index: 0x08FC */ + 0x527B,0x4F21,0x6428,INVALC,0x7436,0x6C7E,INVALC,INVALC, + 0x632E,0x676D,0x7D41,0x5A62, + /* Range 0x5351 - 0x5354, array index: 0x0908 */ + 0x5D64,0x706F,0x7671,0x7A70, + /* Range 0x536F - 0x5377, array index: 0x090C */ + 0x5956,0x6C54,0x6A4B,INVALC,INVALC,0x4A3F,0x5530,INVALC, + 0x4F69, + /* Range 0x53C8 - 0x53CD, array index: 0x0915 */ + 0x6951,0x7329,0x5060,0x6952,INVALC,0x5A63, + /* Range 0x53E1 - 0x53F3, array index: 0x091B */ + 0x6755,0x753F,0x4F22,0x4D2F,0x4F23,INVALC,INVALC,INVALC, + 0x4D30,0x717E,0x5023,0x612F,0x7823,INVALC,0x4A26,0x773B, + 0x726A,0x5E48,0x6953, + /* Range 0x5408 - 0x5411, array index: 0x092E */ + 0x796A,0x514E,0x6E54,INVALC,0x5452,0x5923,0x7D28,0x5759, + 0x774E,0x7A3E, + /* Range 0x5438 - 0x543E, array index: 0x0938 */ + 0x7D65,0x7623,INVALC,0x597C,0x7D29,INVALC,0x676E, + /* Range 0x547B - 0x547D, array index: 0x093F */ + 0x6362,0x7B3C,0x5924, + /* Range 0x5586 - 0x558A, array index: 0x0942 */ + 0x744A,0x547A,INVALC,0x7D2A,0x7962, + /* Range 0x5598 - 0x559D, array index: 0x0947 */ + 0x7437,0x7D42,0x7C30,INVALC,0x7D6C,0x4A62, + /* Range 0x55A7 - 0x55AE, array index: 0x094D */ + 0x7D3D,INVALC,0x6A67,0x5F43,0x5152,0x4E62,INVALC,0x5324, + /* Range 0x574D - 0x5751, array index: 0x0955 */ + 0x533B,0x4A6C,INVALC,0x7126,0x4B55, + /* Range 0x5805 - 0x580A, array index: 0x095A */ + 0x4C31,0x7758,INVALC,0x4B28,0x6B3C,0x643E, + /* Range 0x582F - 0x5835, array index: 0x0960 */ + 0x686B,0x6568,0x5C43,INVALC,INVALC,0x6D5E,0x5372, + /* Range 0x58F9 - 0x58FD, array index: 0x0967 */ + 0x6C6C,0x7B3E,0x5F6B,INVALC,0x6178, + /* Range 0x5914 - 0x591C, array index: 0x096C */ + 0x5073,0x602A,0x6862,INVALC,INVALC,0x6254,0x527D,INVALC, + 0x6528, + /* Range 0x5927 - 0x592E, array index: 0x0975 */ + 0x535E,INVALC,0x7438,0x773C,0x5C7D,INVALC,0x686C,0x6467, + /* Range 0x5947 - 0x5949, array index: 0x097D */ + 0x5074,0x522F,0x5C65, + /* Range 0x594E - 0x5957, array index: 0x0980 */ + 0x5025,0x7134,0x7C31,0x4C78,INVALC,INVALC,0x5D46,0x7A51, + INVALC,0x775F, + /* Range 0x596A - 0x596E, array index: 0x098A */ + 0x772C,0x6B44,0x6D61,0x602B,0x5D47, + /* Range 0x5982 - 0x5984, array index: 0x098F */ + 0x657D,0x5D65,0x584D, + /* Range 0x59D0 - 0x59D4, array index: 0x0992 */ + 0x6E3B,0x4D34,INVALC,0x6073,0x6A4D, + /* Range 0x59D9 - 0x59DD, array index: 0x0997 */ + 0x6C75,0x686E,INVALC,0x4B29,0x712F, + /* Range 0x5B54 - 0x5B5F, array index: 0x099C */ + 0x4D6E,0x6D26,INVALC,0x6D2E,0x706D,INVALC,0x5D21,INVALC, + 0x6D2F,0x7C78,INVALC,0x586B, + /* Range 0x5B85 - 0x5B8C, array index: 0x09A8 */ + 0x536B,INVALC,0x6954,0x617A,0x644C,INVALC,0x6164,0x6847, + /* Range 0x5B93 - 0x5B9C, array index: 0x09B0 */ + 0x5C55,INVALC,0x7735,0x7C73,0x7073,0x4E2F,0x7135,0x6F52, + 0x6848,0x6B71, + /* Range 0x5BA2 - 0x5BA6, array index: 0x09BA */ + 0x4B54,0x603E,0x6378,0x6A69,0x7C32, + /* Range 0x5BB3 - 0x5BB9, array index: 0x09BF */ + 0x7A2A,0x6643,0x6132,0x4A2B,INVALC,0x6364,0x693B, + /* Range 0x5BBF - 0x5BC7, array index: 0x09C6 */ + 0x6256,0x7372,INVALC,0x6E56,0x6A32,0x5076,0x6C59,0x5A4B, + 0x4F28, + /* Range 0x5BD0 - 0x5BD4, array index: 0x09CF */ + 0x585B,INVALC,0x794E,0x6955,0x6351, + /* Range 0x5BDE - 0x5BEF, array index: 0x09D4 */ + 0x582C,0x734C,INVALC,0x4D7B,0x7656,INVALC,0x6775,0x686F, + 0x6379,0x523B,0x7373,0x637B,INVALC,0x5E50,0x4E30,INVALC, + 0x5677,0x7159, + /* Range 0x5C07 - 0x5C11, array index: 0x09E6 */ + 0x6D62,0x6E76,0x6A4F,0x706E,0x637C,INVALC,0x535F,0x5374, + 0x6133,INVALC,0x6134, + /* Range 0x5C38 - 0x5C40, array index: 0x09F1 */ + 0x6339,0x6B45,0x7429,0x4D36,0x5279,INVALC,0x5A2D,0x5263, + 0x4F51, + /* Range 0x5DE1 - 0x5DE8, array index: 0x09FA */ + 0x625E,0x6135,INVALC,INVALC,0x4D6F,0x7127,0x4E65,0x4B5D, + /* Range 0x5DF1 - 0x5DF4, array index: 0x0A02 */ + 0x5079,0x6C2B,0x5E53,0x7769, + /* Range 0x5E5F - 0x5E63, array index: 0x0A06 */ + 0x763A,INVALC,0x5B5F,0x5353,0x7847, + /* Range 0x5E72 - 0x5E7E, array index: 0x0A0B */ + 0x4A4E,0x7841,0x5234,INVALC,INVALC,0x5C34,0x7A39,0x4A4F, + INVALC,0x7C33,0x6A6A,0x6A6B,0x507A, + /* Range 0x5EB5 - 0x5EB8, array index: 0x0A18 */ + 0x645D,0x5F6E,0x4B2C,0x693C, + /* Range 0x5EC8 - 0x5ECA, array index: 0x0A1C */ + 0x793F,0x562F,0x5546, + /* Range 0x5EDF - 0x5EE3, array index: 0x0A1F */ + 0x5959,0x735F,INVALC,0x7848,0x4E46, + /* Range 0x5F11 - 0x5F18, array index: 0x0A24 */ + 0x633D,INVALC,0x4F61,0x7040,0x6C5A,INVALC,0x5D57,0x7B70, + /* Range 0x5F66 - 0x5F71, array index: 0x0A2C */ + 0x6569,0x696E,INVALC,0x7374,0x7873,0x7041,0x5E2F,0x7830, + INVALC,INVALC,0x7360,0x672F, + /* Range 0x5F7F - 0x5F81, array index: 0x0A38 */ + 0x5D58,0x6859,0x6F56, + /* Range 0x5F8A - 0x5F92, array index: 0x0A3B */ + 0x7C60,0x5748,0x7D2D,INVALC,INVALC,INVALC,0x5F6F,0x4C53, + 0x5379, + /* Range 0x5F97 - 0x5F99, array index: 0x0A44 */ + 0x5470,0x5B47,0x5E55, + /* Range 0x5FA8 - 0x5FAA, array index: 0x0A47 */ + 0x7C47,0x5C56,0x6260, + /* Range 0x5FD6 - 0x5FD9, array index: 0x0A4A */ + 0x753C,0x7224,0x584E,0x584F, + /* Range 0x6041 - 0x6043, array index: 0x0A4E */ + 0x6C76,0x6261,0x633E, + /* Range 0x6062 - 0x6070, array index: 0x0A51 */ + 0x7C61,0x6D30,0x7D51,0x763B,INVALC,INVALC,0x794F,0x6B5A, + 0x4A41,INVALC,0x5238,0x4D71,INVALC,0x6353,0x7D66, + /* Range 0x60B0 - 0x60B8, array index: 0x0A60 */ + 0x7075,INVALC,0x5D68,0x536D,0x757C,INVALC,0x5A3F,INVALC, + 0x4C7B, + /* Range 0x60DF - 0x60E1, array index: 0x0A69 */ + 0x6A6E,0x7B33,0x6442, + /* Range 0x60F9 - 0x60FB, array index: 0x0A6C */ + 0x6529,0x6076,0x7633, + /* Range 0x610D - 0x610F, array index: 0x0A6F */ + 0x5A40,0x7834,0x6B72, + /* Range 0x6147 - 0x614C, array index: 0x0A72 */ + 0x6B5B,0x6D31,INVALC,0x4C43,0x773E,0x7C4B, + /* Range 0x6162 - 0x6168, array index: 0x0A78 */ + 0x5837,0x4E31,0x4A42,INVALC,INVALC,0x7B34,0x4B46, + /* Range 0x6198 - 0x619A, array index: 0x0A7F */ + 0x7D73,0x7D72,0x7726, + /* Range 0x61C7 - 0x61CB, array index: 0x0A82 */ + 0x4A50,0x7A2B,0x6B6B,0x6778,0x5965, + /* Range 0x61F6 - 0x6200, array index: 0x0A87 */ + 0x547B,0x7C63,0x7A58,INVALC,0x7355,INVALC,0x4F2B,INVALC, + INVALC,0x6B73,0x557C, + /* Range 0x620A - 0x6212, array index: 0x0A92 */ + 0x5966,INVALC,0x6279,0x6221,0x6B54,INVALC,0x6077,0x6432, + 0x4C7C, + /* Range 0x623E - 0x6241, array index: 0x0A9B */ + 0x5568,0x5B2E,0x6136,0x7837, + /* Range 0x6247 - 0x624D, array index: 0x0A9F */ + 0x603F,0x7B43,0x5D6A,INVALC,0x6222,INVALC,0x6E26, + /* Range 0x62C7 - 0x62DC, array index: 0x0AA6 */ + 0x5967,0x5239,0x5543,INVALC,INVALC,0x5A65,0x5A50,INVALC, + 0x5159,0x4E58,INVALC,0x4B5E,0x742C,0x5A7B,INVALC,0x7669, + 0x6873,0x4F2C,0x7070,INVALC,0x747D,0x5B48, + /* Range 0x62EC - 0x62F3, array index: 0x0ABC */ + 0x4E40,0x6354,0x514F,0x7175,INVALC,0x4D72,INVALC,0x4F6B, + /* Range 0x633A - 0x633E, array index: 0x0AC4 */ + 0x6F58,0x6649,INVALC,0x5838,0x7A73, + /* Range 0x63A0 - 0x63A2, array index: 0x0AC9 */ + 0x5553,0x7375,0x772E, + /* Range 0x63A5 - 0x63AA, array index: 0x0ACC */ + 0x6F48,INVALC,0x4D73,0x754F,0x6573,0x7042, + /* Range 0x6478 - 0x647A, array index: 0x0AD2 */ + 0x5938,0x5939,0x6F49, + /* Range 0x6491 - 0x6493, array index: 0x0AD5 */ + 0x774B,0x5F2E,0x6875, + /* Range 0x64E1 - 0x64E7, array index: 0x0AD8 */ + 0x5364,0x7677,INVALC,INVALC,0x553A,0x734D,0x4B61, + /* Range 0x652A - 0x652C, array index: 0x0ADF */ + 0x4E66,0x7C2B,0x553B, + /* Range 0x6536 - 0x653F, array index: 0x0AE2 */ + 0x6225,0x4D39,0x6A72,0x4B47,INVALC,0x4D74,INVALC,INVALC, + 0x5B2F,0x6F59, + /* Range 0x654D - 0x6551, array index: 0x0AEC */ + 0x5F73,0x4E67,0x5A42,INVALC,0x4F2D, + /* Range 0x6574 - 0x6578, array index: 0x0AF1 */ + 0x6F5A,0x6E58,INVALC,0x5D27,0x6226, + /* Range 0x65E5 - 0x65ED, array index: 0x0AF6 */ + 0x6C6D,0x5329,INVALC,0x7229,0x7044,INVALC,INVALC,0x6262, + 0x696F, + /* Range 0x65FA - 0x65FF, array index: 0x0AFF */ + 0x685A,0x5A43,0x5A44,0x5445,INVALC,0x677A, + /* Range 0x6606 - 0x6615, array index: 0x0B05 */ + 0x4D60,0x6330,INVALC,0x5B32,0x7B44,INVALC,0x7363,INVALC, + 0x5925,0x7B67,0x5D4B,0x5054,INVALC,0x6636,0x602E,0x7D5A, + /* Range 0x661E - 0x6620, array index: 0x0B15 */ + 0x5C35,0x6078,0x6731, + /* Range 0x662D - 0x6631, array index: 0x0B18 */ + 0x6139,INVALC,0x6340,0x7940,0x6970, + /* Range 0x6641 - 0x6644, array index: 0x0B1D */ + 0x7045,0x6341,0x7C4C,0x7C4D, + /* Range 0x665B - 0x665F, array index: 0x0B21 */ + 0x7A59,INVALC,0x7138,0x7D75,0x6079, + /* Range 0x6664 - 0x666F, array index: 0x0B26 */ + 0x677B,0x7C37,0x7C64,0x7B45,0x6367,0x5839,INVALC,0x7678, + INVALC,INVALC,0x5C45,0x4C58, + /* Range 0x6673 - 0x667A, array index: 0x0B32 */ + 0x602F,0x7467,INVALC,0x6F5C,0x4F7C,0x6F5D,INVALC,0x722A, + /* Range 0x6687 - 0x6689, array index: 0x0B3A */ + 0x4A2C,0x7D3B,0x7D47, + /* Range 0x6696 - 0x6698, array index: 0x0B3D */ + 0x516C,0x645E,0x6543, + /* Range 0x66B2 - 0x66B4, array index: 0x0B40 */ + 0x6D67,0x7B35,0x786C, + /* Range 0x66F0 - 0x6700, array index: 0x0B43 */ + 0x6858,INVALC,0x4D58,0x6756,0x4C5A,INVALC,INVALC,0x4A63, + 0x5F76,0x7047,0x7046,INVALC,0x583A,INVALC,0x7174,0x7470, + 0x754C, + /* Range 0x671B - 0x671F, array index: 0x0B54 */ + 0x5850,INVALC,0x7048,0x5121,0x5122, + /* Range 0x6726 - 0x672E, array index: 0x0B59 */ + 0x5954,0x5668,0x594A,INVALC,0x5A31,0x5847,0x5C62,0x734E, + 0x7574, + /* Range 0x674E - 0x6753, array index: 0x0B62 */ + 0x575D,0x7A3A,0x6E27,0x753D,INVALC,0x7875, + /* Range 0x676D - 0x6777, array index: 0x0B68 */ + 0x7978,INVALC,0x5B4A,0x4B79,0x5454,INVALC,0x595C,INVALC, + 0x6E3E,INVALC,0x776D, + /* Range 0x67B6 - 0x67B8, array index: 0x0B73 */ + 0x4A2D,0x4A2E,0x4F2E, + /* Range 0x67CF - 0x67D4, array index: 0x0B76 */ + 0x5B5A,0x593B,0x4A73,0x7653,0x6678,0x6A75, + /* Range 0x67EF - 0x67F6, array index: 0x0B7C */ + 0x4A2F,0x5230,0x713A,INVALC,0x5733,0x6343,0x737D,0x5E5A, + /* Range 0x683C - 0x6843, array index: 0x0B84 */ + 0x4C2B,0x6E28,INVALC,INVALC,0x4B7A,0x7979,0x4C7D,0x537E, + /* Range 0x6850 - 0x6854, array index: 0x0B8C */ + 0x5455,0x5F4D,INVALC,0x7C38,0x5150, + /* Range 0x68AD - 0x68B6, array index: 0x0B91 */ + 0x5E5C,INVALC,0x702C,0x4C7E,0x4D61,INVALC,0x613A,INVALC, + 0x5B6F,0x5A32, + /* Range 0x6953 - 0x695A, array index: 0x0B9B */ + 0x7923,0x605B,0x766B,INVALC,0x4B71,INVALC,0x596A,0x7522, + /* Range 0x695E - 0x6963, array index: 0x0BA3 */ + 0x5751,INVALC,0x5178,0x6A78,0x6A79,0x5A33, + /* Range 0x696B - 0x696F, array index: 0x0BA9 */ + 0x716F,INVALC,0x6576,0x6E3F,0x6264, + /* Range 0x6975 - 0x6979, array index: 0x0BAE */ + 0x503F,INVALC,0x7A2C,0x7551,0x6733, + /* Range 0x69CB - 0x69CD, array index: 0x0BB3 */ + 0x4F30,0x7759,0x7366, + /* Range 0x6A38 - 0x6A3A, array index: 0x0BB6 */ + 0x5A54,0x6227,0x7B7C, + /* Range 0x6B5F - 0x6B66, array index: 0x0BB9 */ + 0x6622,INVALC,0x7C36,0x722D,0x6F61,0x732E,0x5C46,0x596B, + /* Range 0x6BD2 - 0x6BD8, array index: 0x0BC1 */ + 0x5438,0x6B3E,0x5D6F,INVALC,0x5D70,0x5D71,0x5D72, + /* Range 0x6C3E - 0x6C42, array index: 0x0BC8 */ + 0x5B70,INVALC,0x6F62,0x7170,0x4F34, + /* Range 0x6C5D - 0x6C60, array index: 0x0BCD */ + 0x6623,0x7B71,0x4B30,0x722E, + /* Range 0x6C7D - 0x6C88, array index: 0x0BD1 */ + 0x5129,0x5D4C,INVALC,INVALC,0x637E,0x512A,0x682A,INVALC, + 0x6A36,0x797A,0x664C,0x7658, + /* Range 0x6C90 - 0x6C9B, array index: 0x0BDD */ + 0x594B,INVALC,0x5952,0x534B,0x5877,0x5A29,0x7578,INVALC, + INVALC,0x5E5E,0x722F,0x7829, + /* Range 0x6CB8 - 0x6CC4, array index: 0x0BE9 */ + 0x5D73,0x6A7A,INVALC,0x763D,0x613B,0x4D3F,0x7454,0x664D, + INVALC,0x7C4F,0x7B22,INVALC,0x605C, + /* Range 0x6CE1 - 0x6CE5, array index: 0x0BF6 */ + 0x785C,0x776E,0x6B68,INVALC,0x527A, + /* Range 0x6CEE - 0x6CF0, array index: 0x0BFB */ + 0x5A6A,0x5A46,0x7741, + /* Range 0x6D35 - 0x6D3E, array index: 0x0BFE */ + 0x6267,0x7D57,INVALC,0x4E48,0x6A37,INVALC,0x7C40,INVALC, + 0x7D67,0x776F, + /* Range 0x6D77 - 0x6D79, array index: 0x0C08 */ + 0x7A2D,0x7659,0x7A74, + /* Range 0x6D85 - 0x6D8E, array index: 0x0C0B */ + 0x666E,INVALC,0x4C5C,0x613C,0x606F,INVALC,INVALC,0x693F, + 0x7C7D,0x664E, + /* Range 0x6DC3 - 0x6DC7, array index: 0x0C15 */ + 0x4F6E,0x763E,0x6032,0x7C7E,0x512B, + /* Range 0x6DD8 - 0x6DDA, array index: 0x0C1A */ + 0x5423,0x7078,0x5728, + /* Range 0x6DF5 - 0x6DFB, array index: 0x0C1D */ + 0x6650,INVALC,0x7B68,0x7468,0x6574,0x743C,0x7455, + /* Range 0x6E17 - 0x6E26, array index: 0x0C24 */ + 0x5F36,INVALC,0x7C39,0x6E42,0x4A75,INVALC,INVALC,INVALC, + 0x6F65,0x4B62,0x5424,INVALC,0x5E60,0x5A7D,0x6446,0x683E, + /* Range 0x6E2B - 0x6E2F, array index: 0x0C34 */ + 0x605E,0x7634,0x6A52,INVALC,0x797B, + /* Range 0x6E3A - 0x6E3E, array index: 0x0C39 */ + 0x595D,INVALC,0x5A34,0x6E2A,0x7B69, + /* Range 0x6E5B - 0x6E5F, array index: 0x0C3E */ + 0x5340,0x6357,INVALC,0x6F66,0x7C50, + /* Range 0x6EFE - 0x6F02, array index: 0x0C43 */ + 0x4D63,0x583B,INVALC,0x655B,0x7877, + /* Range 0x6F57 - 0x6F5F, array index: 0x0C48 */ + 0x727C,0x5A6B,INVALC,0x6258,0x6D56,INVALC,INVALC,0x5651, + 0x6033, + /* Range 0x6F7A - 0x6F7E, array index: 0x0C51 */ + 0x6D52,INVALC,0x5458,0x5C49,0x5771, + /* Range 0x6FBE - 0x6FC3, array index: 0x0C56 */ + 0x5336,INVALC,0x4C2D,0x767A,0x5632,0x5258, + /* Range 0x6FDF - 0x6FE1, array index: 0x0C5C */ + 0x702D,0x7B4C,0x6B21, + /* Range 0x7018 - 0x701F, array index: 0x0C5F */ + 0x5652,INVALC,0x7955,0x673A,0x6B55,0x5577,0x6F67,0x613E, + /* Range 0x7098 - 0x709A, array index: 0x0C67 */ + 0x7D5C,0x6D33,0x4E49, + /* Range 0x70AB - 0x70AF, array index: 0x0C6A */ + 0x7A5B,0x4B63,0x7729,INVALC,0x7B26, + /* Range 0x70B7 - 0x70B9, array index: 0x0C6F */ + 0x7140,0x6D48,0x6F43, + /* Range 0x7164 - 0x7169, array index: 0x0C72 */ + 0x5860,0x7C3A,0x7D2F,0x704E,INVALC,0x5B61, + /* Range 0x71E5 - 0x71E7, array index: 0x0C78 */ + 0x704F,0x733E,0x622C, + /* Range 0x71FB - 0x7200, array index: 0x0C7B */ + 0x7D38,0x6368,INVALC,0x5427,0x687C,0x7A52, + /* Range 0x723A - 0x7240, array index: 0x0C81 */ + 0x652C,0x7D21,INVALC,0x5F50,0x6C33,INVALC,0x5F51, + /* Range 0x7246 - 0x7248, array index: 0x0C88 */ + 0x6D6D,0x7838,0x777A, + /* Range 0x731B - 0x731D, array index: 0x0C8B */ + 0x586D,0x6344,0x7071, + /* Range 0x7329 - 0x732B, array index: 0x0C8E */ + 0x607A,0x6E44,0x595E, + /* Range 0x7394 - 0x7398, array index: 0x0C91 */ + 0x743D,INVALC,0x4F38,0x695B,0x512C, + /* Range 0x73C9 - 0x73CF, array index: 0x0C96 */ + 0x5A48,0x5F26,INVALC,0x7933,0x7252,INVALC,0x4A44, + /* Range 0x73E3 - 0x73EA, array index: 0x0C9D */ + 0x6269,0x5C4A,0x6C34,0x7A40,INVALC,INVALC,0x7B28,0x5028, + /* Range 0x7403 - 0x7409, array index: 0x0CA5 */ + 0x4F39,INVALC,0x554A,0x5762,0x622F,INVALC,0x5738, + /* Range 0x7420 - 0x743A, array index: 0x0CAC */ + 0x6F22,0x625A,0x767C,INVALC,INVALC,0x7B50,0x512D,INVALC, + 0x4D64,INVALC,0x512E,0x5C6D,0x684E,INVALC,0x7079,0x4E35, + 0x667C,INVALC,INVALC,0x577B,0x5056,0x5D75,0x7771,INVALC, + 0x767D,INVALC,0x5B77, + /* Range 0x743F - 0x7444, array index: 0x0CC7 */ + 0x7B6A,0x695C,0x5941,INVALC,0x7572,0x6045, + /* Range 0x7457 - 0x746A, array index: 0x0CCD */ + 0x6A3C,INVALC,0x5245,0x7B51,0x6740,0x6B25,INVALC,0x5F7A, + 0x6322,0x5739,INVALC,0x6943,INVALC,0x687D,0x682F,INVALC, + INVALC,0x7253,0x7B29,0x5825, + /* Range 0x7530 - 0x7533, array index: 0x0CE1 */ + 0x6F23,0x6B26,0x4B23,0x6369, + /* Range 0x7559 - 0x755D, array index: 0x0CE5 */ + 0x573A,INVALC,0x7255,0x7565,0x596F, + /* Range 0x75B1 - 0x75BE, array index: 0x0CEA */ + 0x785E,0x792A,0x4A77,INVALC,0x6D37,INVALC,INVALC,0x5338, + 0x7256,INVALC,INVALC,0x5459,0x6E45,0x7270, + /* Range 0x761F - 0x7626, array index: 0x0CF8 */ + 0x6830,0x7430,0x736A,0x5A6E,INVALC,0x573B,INVALC,0x6231, + /* Range 0x767B - 0x767E, array index: 0x0D00 */ + 0x5474,0x5B21,0x5B5C,0x5B5D, + /* Range 0x76DB - 0x76E4, array index: 0x0D04 */ + 0x607C,0x5428,INVALC,0x6D53,0x586F,INVALC,0x7257,INVALC, + 0x4A78,0x5A6F, + /* Range 0x77ED - 0x77EF, array index: 0x0D0E */ + 0x532D,0x6861,0x4E6C, + /* Range 0x7825 - 0x7827, array index: 0x0D11 */ + 0x7232,0x7376,0x765B, + /* Range 0x788C - 0x788E, array index: 0x0D14 */ + 0x565E,0x6474,0x616F, + /* Range 0x78BA - 0x78BC, array index: 0x0D17 */ + 0x7C2C,0x7C2D,0x5827, + /* Range 0x792A - 0x792C, array index: 0x0D1A */ + 0x556C,0x5578,0x5A73, + /* Range 0x7947 - 0x7949, array index: 0x0D1D */ + 0x5136,0x5137,0x7233, + /* Range 0x7956 - 0x7960, array index: 0x0D20 */ + 0x7053,0x7234,INVALC,INVALC,0x7054,0x4B64,0x7B54,0x7566, + 0x636A,INVALC,0x5E66, + /* Range 0x798D - 0x7991, array index: 0x0D2B */ + 0x7C21,0x6F6E,0x5C58,INVALC,0x695F, + /* Range 0x79BD - 0x79C1, array index: 0x0D30 */ + 0x5058,0x7C22,0x543E,0x6233,0x5E67, + /* Range 0x79C9 - 0x79CB, array index: 0x0D35 */ + 0x5C3C,0x5236,0x7555, + /* Range 0x7A3B - 0x7A40, array index: 0x0D38 */ + 0x542B,0x4A33,0x4D26,INVALC,0x4D43,0x4D5A, + /* Range 0x7B49 - 0x7B56, array index: 0x0D3E */ + 0x5475,INVALC,0x5049,0x6F27,0x626C,INVALC,0x5B6A,0x4E4C, + 0x7568,0x7755,INVALC,0x534D,INVALC,0x737E, + /* Range 0x7C3D - 0x7C3F, array index: 0x0D4C */ + 0x7458,0x5633,0x5D2D, + /* Range 0x7CB1 - 0x7CB3, array index: 0x0D4F */ + 0x555C,0x7344,0x4B57, + /* Range 0x7CDE - 0x7CE0, array index: 0x0D52 */ + 0x5D50,0x7059,0x4B33, + /* Range 0x7D02 - 0x7D0D, array index: 0x0D55 */ + 0x7144,INVALC,0x6533,0x7B75,0x6961,0x7D60,0x7C3C,INVALC, + 0x5A22,0x5A23,INVALC,0x5221, + /* Range 0x7D17 - 0x7D1B, array index: 0x0D61 */ + 0x5E69,0x4E5C,0x7235,0x5064,0x5D51, + /* Range 0x7D20 - 0x7D22, array index: 0x0D66 */ + 0x6148,0x5B37,0x5F63, + /* Range 0x7D2B - 0x7D30, array index: 0x0D69 */ + 0x6D39,0x7145,INVALC,0x734F,0x572B,0x612C, + /* Range 0x7D42 - 0x7D46, array index: 0x0D6F */ + 0x707B,0x7A61,0x705A,0x4C67,0x5A74, + /* Range 0x7D71 - 0x7D73, array index: 0x0D74 */ + 0x7756,0x5E6A,0x4B34, + /* Range 0x7DB1 - 0x7DB5, array index: 0x0D77 */ + 0x4B35,0x5851,INVALC,0x744E,0x7377, + /* Range 0x7DBA - 0x7DBF, array index: 0x0D7C */ + 0x513B,0x772A,INVALC,0x6D4A,0x5753,0x587A, + /* Range 0x7DDD - 0x7DE3, array index: 0x0D82 */ + 0x727D,0x5330,INVALC,0x7473,0x5A49,INVALC,0x665E, + /* Range 0x7E1B - 0x7E23, array index: 0x0D89 */ + 0x5A5A,INVALC,0x725C,0x7B56,0x6932,INVALC,0x6E2D,INVALC, + 0x7A63, + /* Range 0x7E69 - 0x7E6D, array index: 0x0D92 */ + 0x6331,0x7C6B,0x4D28,INVALC,0x4C36, + /* Range 0x7FDF - 0x7FE1, array index: 0x0D97 */ + 0x6E61,0x7628,0x5D7D, + /* Range 0x806F - 0x8073, array index: 0x0D9A */ + 0x5624,0x7546,INVALC,0x6122,0x6946, + /* Range 0x807D - 0x807F, array index: 0x0D9F */ + 0x7469,0x566C,0x6B53, + /* Range 0x8084 - 0x808C, array index: 0x0DA2 */ + 0x6C3D,0x625C,0x5E6B,0x705C,INVALC,0x6B3F,INVALC,0x574E, + 0x513F, + /* Range 0x8105 - 0x810A, array index: 0x0DAB */ + 0x7A76,0x762A,0x7A77,0x5866,INVALC,0x7431, + /* Range 0x8178 - 0x817A, array index: 0x0DB1 */ + 0x6D73,0x5C59,0x604D, + /* Range 0x81BD - 0x81C2, array index: 0x0DB4 */ + 0x5345,0x7C6C,0x525B,0x546B,INVALC,0x5E22, + /* Range 0x81FA - 0x81FE, array index: 0x0DBA */ + 0x5366,0x725D,0x4F3F,INVALC,0x6B2C, + /* Range 0x821B - 0x8221, array index: 0x0DBF */ + 0x743F,0x626F,INVALC,0x5971,0x7147,INVALC,0x4B38, + /* Range 0x822A - 0x822C, array index: 0x0DC6 */ + 0x797E,0x5B3A,0x5A75, + /* Range 0x8235 - 0x8239, array index: 0x0DC9 */ + 0x766C,0x5A5C,0x7A64,INVALC,0x604F, + /* Range 0x826E - 0x8272, array index: 0x0DCE */ + 0x4A5D,0x555E,INVALC,0x4A5E,0x5F64, + /* Range 0x82AC - 0x82BF, array index: 0x0DD3 */ + 0x5D52,0x7774,0x675C,0x6425,INVALC,0x7C23,INVALC,0x5B3B, + INVALC,INVALC,INVALC,0x723A,0x697D,0x504A,INVALC,0x7556, + 0x5945,0x6434,INVALC,0x6D27, + /* Range 0x82D1 - 0x82D7, array index: 0x0DE7 */ + 0x6A3D,0x667E,INVALC,0x7744,0x752D,INVALC,0x5960, + /* Range 0x82E5 - 0x82E7, array index: 0x0DEE */ + 0x6534,0x4D48,0x6E48, + /* Range 0x82FD - 0x8305, array index: 0x0DF1 */ + 0x4D49,0x7937,INVALC,INVALC,0x7168,0x5972,0x5B75,0x4A35, + 0x5946, + /* Range 0x8334 - 0x8339, array index: 0x0DFA */ + 0x7C6D,0x6C60,0x527E,INVALC,0x6947,0x662A, + /* Range 0x83A9 - 0x83AB, array index: 0x0E00 */ + 0x5D34,0x6435,0x5830, + /* Range 0x83EF - 0x83F4, array index: 0x0E03 */ + 0x7C24,0x4D4A,0x5754,0x5E23,INVALC,0x6460, + /* Range 0x840A - 0x840E, array index: 0x0E09 */ + 0x5551,INVALC,0x5870,0x7843,0x6A57, + /* Range 0x8568 - 0x856A, array index: 0x0E0E */ + 0x4F72,0x7739,0x5973, + /* Range 0x85A6 - 0x85AA, array index: 0x0E11 */ + 0x7440,INVALC,0x7D3C,0x5F31,0x636F, + /* Range 0x85CD - 0x85CF, array index: 0x0E16 */ + 0x5540,0x6370,0x6D7A, + /* Range 0x865B - 0x865F, array index: 0x0E19 */ + 0x7A48,0x5657,INVALC,0x6965,0x7B5C, + /* Range 0x8861 - 0x8863, array index: 0x0E1E */ + 0x7B2C,0x4F43,0x6B7D, + /* Range 0x887E - 0x8882, array index: 0x0E21 */ + 0x505A,0x505B,INVALC,0x6A3E,0x5931, + /* Range 0x88F3 - 0x88F5, array index: 0x0E26 */ + 0x5F57,0x5B50,0x5B51, + /* Range 0x8A16 - 0x8A18, array index: 0x0E29 */ + 0x7D61,0x767E,0x5140, + /* Range 0x8A6D - 0x8A75, array index: 0x0E2C */ + 0x4F78,0x6F2C,INVALC,0x7D7E,0x7C25,0x7A31,0x5F59,INVALC, + 0x6052, + /* Range 0x8AA0 - 0x8AAA, array index: 0x0E35 */ + 0x6124,0x4D2B,INVALC,0x5974,0x6826,0x4D4E,0x6169,INVALC, + 0x7C6F,INVALC,0x6063, + /* Range 0x8AEA - 0x8AEE, array index: 0x0E40 */ + 0x6F75,0x4A5F,INVALC,0x6B31,0x6D3F, + /* Range 0x8AF6 - 0x8AFA, array index: 0x0E45 */ + 0x6426,0x7924,0x7033,INVALC,0x656C, + /* Range 0x8AFE - 0x8B04, array index: 0x0E4A */ + 0x5167,INVALC,0x5947,0x6457,0x6A5D,INVALC,0x5477, + /* Range 0x8B16 - 0x8B1D, array index: 0x0E51 */ + 0x615A,0x5B3F,INVALC,0x4C45,0x6C50,0x4B3B,INVALC,0x5E73, + /* Range 0x8C9D - 0x8CA2, array index: 0x0E59 */ + 0x782F,0x6F76,INVALC,0x5D36,0x6E2F,0x4D78, + /* Range 0x8CA7 - 0x8CCA, array index: 0x0E5F */ + 0x5E38,0x7C27,0x777C,0x7731,0x4E3B,0x7421,INVALC,INVALC, + 0x6E4D,0x612E,INVALC,INVALC,0x6C43,0x4F7E,INVALC,0x783F, + 0x5862,0x5368,INVALC,INVALC,0x5E28,0x7464,0x6C42,INVALC, + 0x5975,0x7945,0x5D53,0x5671,0x6C7C,0x7C70,INVALC,INVALC, + 0x6D40,0x4A39,INVALC,0x6E64, + /* Range 0x8CE0 - 0x8CE6, array index: 0x0E83 */ + 0x5B53,INVALC,0x7A67,0x5863,0x7441,INVALC,0x5D37, + /* Range 0x8CFB - 0x8CFD, array index: 0x0E8A */ + 0x5D38,0x4F45,0x5F5F, + /* Range 0x8D04 - 0x8D0A, array index: 0x0E8D */ + 0x723E,0x7621,INVALC,0x6B4B,0x717C,INVALC,0x7347, + /* Range 0x8E47 - 0x8E4A, array index: 0x0E94 */ + 0x4B74,0x5430,0x7332,0x7B37, + /* Range 0x8EAA - 0x8EAC, array index: 0x0E98 */ + 0x5775,0x6373,0x4F65, + /* Range 0x8ECA - 0x8ECD, array index: 0x0E9B */ + 0x7333,0x6458,0x4F79,0x4F5A, + /* Range 0x8F12 - 0x8F15, array index: 0x0E9F */ + 0x7465,0x5842,0x5C50,0x4C6E, + /* Range 0x8F1B - 0x8F1F, array index: 0x0EA3 */ + 0x5560,0x764A,0x7D4A,0x5856,0x744F, + /* Range 0x8F26 - 0x8F2A, array index: 0x0EA8 */ + 0x5626,0x5C3E,INVALC,0x5B54,0x5747, + /* Range 0x8FAD - 0x8FB2, array index: 0x0EAD */ + 0x5E76,INVALC,0x5C2A,0x7263,0x6934,0x525C, + /* Range 0x9000 - 0x9008, array index: 0x0EB3 */ + 0x775C,0x616A,0x4E41,0x5431,INVALC,0x7D31,0x663D,INVALC, + 0x7B2D, + /* Range 0x900D - 0x9023, array index: 0x0EBC */ + 0x614E,INVALC,0x7762,0x756F,0x4F47,INVALC,INVALC,0x5432, + 0x4C6F,INVALC,0x5468,INVALC,0x6E4F,0x7757,INVALC,INVALC, + 0x6026,0x5641,0x615C,0x7063,0x7164,0x5C71,0x5627, + /* Range 0x904A - 0x9055, array index: 0x0ED3 */ + 0x6B34,0x6A21,INVALC,0x783C,0x4E26,INVALC,0x7946,0x7C5A, + INVALC,0x5433,0x5339,0x6A5E, + /* Range 0x905C - 0x9063, array index: 0x0EDF */ + 0x6161,0x534F,0x7476,INVALC,0x6A40,0x614F,INVALC,0x4C3A, + /* Range 0x906D - 0x906F, array index: 0x0EE7 */ + 0x7064,0x7334,0x546E, + /* Range 0x907C - 0x908A, array index: 0x0EEA */ + 0x5721,0x4B68,INVALC,0x792D,0x692D,0x5864,0x7A33,0x6245, + 0x7C3D,INVALC,INVALC,0x6C44,0x5831,INVALC,0x5C2B, + /* Range 0x90AF - 0x90B1, array index: 0x0EF9 */ + 0x4A7B,0x7746,0x4F48, + /* Range 0x9149 - 0x914E, array index: 0x0EFC */ + 0x6B37,0x6F78,0x755C,0x6D4C,0x5B55,0x714F, + /* Range 0x91AB - 0x91B5, array index: 0x0F02 */ + 0x6C22,0x6D7D,INVALC,0x7534,0x7B38,INVALC,0x5B23,INVALC, + INVALC,0x564A,0x4B59, + /* Range 0x91C9 - 0x91D1, array index: 0x0F0D */ + 0x6B38,INVALC,0x6037,0x576C,0x716C,0x652F,0x5561,0x576D, + 0x5151, + /* Range 0x9210 - 0x9212, array index: 0x0F16 */ + 0x4C22,0x777E,0x5F3C, + /* Range 0x9262 - 0x9266, array index: 0x0F19 */ + 0x5B24,INVALC,0x4F49,0x627C,0x6F7A, + /* Range 0x931E - 0x9328, array index: 0x0F1E */ + 0x6276,0x534A,0x6F7C,0x5144,0x6F31,INVALC,0x5145,INVALC, + 0x505E,INVALC,0x5961, + /* Range 0x958F - 0x9594, array index: 0x0F29 */ + 0x6B4E,INVALC,0x7958,0x7959,0x4A60,0x5A4A, + /* Range 0x95A3 - 0x95A5, array index: 0x0F2F */ + 0x4A48,0x796E,0x5B6C, + /* Range 0x95D4 - 0x95D6, array index: 0x0F32 */ + 0x796F,0x4F74,0x7766, + /* Range 0x964B - 0x964D, array index: 0x0F35 */ + 0x5730,0x5868,0x4B3D, + /* Range 0x965B - 0x9664, array index: 0x0F38 */ + 0x784E,0x7970,0x606D,0x6333,0x7433,INVALC,INVALC,0x6A42, + 0x7266,0x7036, + /* Range 0x9673 - 0x9678, array index: 0x0F42 */ + 0x7267,INVALC,0x5755,0x5436,0x7968,0x5741, + /* Range 0x968A - 0x968E, array index: 0x0F48 */ + 0x5369,0x6249,INVALC,0x7C5B,0x4D2D, + /* Range 0x9698 - 0x969C, array index: 0x0F4D */ + 0x6476,0x5040,INVALC,0x7037,0x6E21, + /* Range 0x96C0 - 0x96CE, array index: 0x0F52 */ + 0x6D4D,0x6452,INVALC,INVALC,0x6A29,0x643A,0x7322,0x4D52, + INVALC,0x764B,INVALC,0x7166,0x6D41,0x683C,0x6E51, + /* Range 0x96E8 - 0x96EA, array index: 0x0F61 */ + 0x696B,0x696C,0x6064, + /* Range 0x97FF - 0x9813, array index: 0x0F64 */ + 0x7A42,0x7B61,0x7A6D,0x7022,0x4C71,INVALC,0x7A23,0x6277, + INVALC,0x624E,INVALC,0x6975,INVALC,0x616B,INVALC,INVALC, + INVALC,0x6768,0x6857,0x5A78,0x544B, + /* Range 0x984C - 0x984E, array index: 0x0F79 */ + 0x7039,0x647E,0x6449, + /* Range 0x98ED - 0x98EF, array index: 0x0F7C */ + 0x7650,0x6B66,0x5A79, + /* Range 0x98FC - 0x98FE, array index: 0x0F7F */ + 0x5E78,0x7869,0x635E, + /* Range 0x9949 - 0x994D, array index: 0x0F82 */ + 0x504F,INVALC,0x4F7A,0x734A,0x6057, + /* Range 0x99AC - 0x99AE, array index: 0x0F87 */ + 0x5829,0x655F,0x7927, + /* Range 0x99D0 - 0x99D2, array index: 0x0F8A */ + 0x7152,0x524C,0x4F4B, + /* Range 0x9B41 - 0x9B45, array index: 0x0F8D */ + 0x4E5A,0x7B6B,0x5B26,0x5B5E,0x5865, + /* Range 0x9DF8 - 0x9DFA, array index: 0x0F92 */ + 0x7D53,0x6B6D,0x565C, + /* Range 0xAC07 - 0xAC0A, array index: 0x0F95 */ + 0x3024,0x3025,0x3026,0x3027, + /* Range 0xAC10 - 0xAC1D, array index: 0x0F99 */ + 0x3028,0x3029,0x302A,0x302B,0x302C,0x302D,0x302E,0x302F, + INVALC,0x3030,0x3031,0x3032,0x3033,0x3034, + /* Range 0xAC2C - 0xAC31, array index: 0x0FA7 */ + 0x3037,0x3038,INVALC,0x3039,0x303A,0x303B, + /* Range 0xAC80 - 0xAC8C, array index: 0x0FAD */ + 0x304B,0x304C,INVALC,0x304D,0x304E,0x304F,0x3050,INVALC, + INVALC,0x3051,0x3052,0x3053,0x3054, + /* Range 0xAC9C - 0xACA1, array index: 0x0FBA */ + 0x3057,0x3058,INVALC,0x3059,0x305A,0x305B, + /* Range 0xACA8 - 0xACB0, array index: 0x0FC0 */ + 0x305C,0x305D,0x305E,INVALC,0x305F,INVALC,INVALC,0x3060, + 0x3061, + /* Range 0xACB8 - 0xACBD, array index: 0x0FC9 */ + 0x3062,0x3063,INVALC,0x3064,0x3065,0x3066, + /* Range 0xACEF - 0xACF6, array index: 0x0FCF */ + 0x3074,0x3075,0x3076,INVALC,0x3077,INVALC,0x3078,0x3079, + /* Range 0xAD73 - 0xAD76, array index: 0x0FD7 */ + 0x313B,0x313C,0x313D,0x313E, + /* Range 0xAD7B - 0xAD82, array index: 0x0FDB */ + 0x313F,0x3140,0x3141,INVALC,0x3142,INVALC,0x3143,0x3144, + /* Range 0xADFF - 0xAE01, array index: 0x0FE3 */ + 0x315A,0x315B,0x315C, + /* Range 0xAE4A - 0xAE50, array index: 0x0FE6 */ + 0x316D,INVALC,0x316E,0x316F,0x3170,INVALC,0x3171, + /* Range 0xAE5C - 0xAE61, array index: 0x0FED */ + 0x3174,0x3175,INVALC,0x3176,0x3177,0x3178, + /* Range 0xAE78 - 0xAE7D, array index: 0x0FF3 */ + 0x317E,0x3221,INVALC,0x3222,0x3223,0x3224, + /* Range 0xAEBC - 0xAEC0, array index: 0x0FF9 */ + 0x3228,0x3229,0x322A,INVALC,0x322B, + /* Range 0xAECC - 0xAED1, array index: 0x0FFE */ + 0x322D,0x322E,INVALC,0x322F,0x3230,0x3231, + /* Range 0xAF3F - 0xAF43, array index: 0x1004 */ + 0x3246,INVALC,0x3247,0x3248,0x3249, + /* Range 0xAFC7 - 0xAFCE, array index: 0x1009 */ + 0x325D,0x325E,0x325F,INVALC,0x3260,INVALC,0x3261,0x3262, + /* Range 0xB053 - 0xB059, array index: 0x1011 */ + 0x327A,0x327B,0x327C,INVALC,0x327D,INVALC,0x327E, + /* Range 0xB098 - 0xB0A2, array index: 0x1018 */ + 0x332A,0x332B,0x332C,INVALC,0x332D,INVALC,INVALC,0x332E, + 0x332F,0x3330,0x3331, + /* Range 0xB0A8 - 0xB0B5, array index: 0x1023 */ + 0x3332,0x3333,INVALC,0x3334,0x3335,0x3336,0x3337,0x3338, + INVALC,0x3339,INVALC,0x333A,0x333B,0x333C, + /* Range 0xB0C4 - 0xB0C9, array index: 0x1031 */ + 0x333F,0x3340,INVALC,0x3341,0x3342,0x3343, + /* Range 0xB108 - 0xB10C, array index: 0x1037 */ + 0x334A,0x334B,INVALC,0x334C,0x334D, + /* Range 0xB118 - 0xB11D, array index: 0x103C */ + 0x3351,0x3352,INVALC,0x3353,0x3354,0x3355, + /* Range 0xB123 - 0xB125, array index: 0x1042 */ + 0x3356,0x3357,0x3358, + /* Range 0xB134 - 0xB139, array index: 0x1045 */ + 0x335B,0x335C,INVALC,0x335D,0x335E,0x335F, + /* Range 0xB192 - 0xB194, array index: 0x104B */ + 0x3374,0x3375,0x3376, + /* Range 0xB298 - 0xB29A, array index: 0x104E */ + 0x3443,0x3444,0x3445, + /* Range 0xB2E2 - 0xB301, array index: 0x1051 */ + 0x3458,INVALC,0x3459,0x345A,0x345B,INVALC,0x345C,INVALC, + INVALC,0x345D,0x345E,0x345F,0x3460,0x3461,INVALC,INVALC, + INVALC,0x3462,0x3463,0x3464,INVALC,0x3465,0x3466,0x3467, + 0x3468,0x3469,INVALC,INVALC,INVALC,0x346A,0x346B,0x346C, + /* Range 0xB310 - 0xB315, array index: 0x1071 */ + 0x346F,0x3470,INVALC,0x3471,0x3472,0x3473, + /* Range 0xB354 - 0xB35F, array index: 0x1077 */ + 0x3475,0x3476,0x3477,INVALC,0x3478,INVALC,INVALC,0x3479, + 0x347A,INVALC,0x347B,0x347C, + /* Range 0xB380 - 0xB385, array index: 0x1083 */ + 0x3529,0x352A,INVALC,0x352B,0x352C,0x352D, + /* Range 0xB524 - 0xB52A, array index: 0x1089 */ + 0x3575,0x3576,INVALC,0x3577,0x3578,0x3579,0x357A, + /* Range 0xB540 - 0xB545, array index: 0x1090 */ + 0x3621,0x3622,INVALC,0x3623,0x3624,0x3625, + /* Range 0xB54B - 0xB54D, array index: 0x1096 */ + 0x3626,0x3627,0x3628, + /* Range 0xB55C - 0xB561, array index: 0x1099 */ + 0x362B,0x362C,INVALC,0x362D,0x362E,0x362F, + /* Range 0xB5B0 - 0xB5B5, array index: 0x109F */ + 0x3636,0x3637,INVALC,0x3638,0x3639,0x363A, + /* Range 0xB5BB - 0xB5BD, array index: 0x10A5 */ + 0x363B,0x363C,0x363D, + /* Range 0xB5CC - 0xB5D1, array index: 0x10A8 */ + 0x3640,0x3641,INVALC,0x3642,0x3643,0x3644, + /* Range 0xB78C - 0xB799, array index: 0x10AE */ + 0x3677,0x3678,INVALC,0x3679,0x367A,0x367B,0x367C,INVALC, + INVALC,INVALC,0x367D,0x367E,0x3721,0x3722, + /* Range 0xB7A8 - 0xB7AD, array index: 0x10BC */ + 0x3725,0x3726,INVALC,0x3727,0x3728,0x3729, + /* Range 0xB7FC - 0xB801, array index: 0x10C2 */ + 0x3733,0x3734,INVALC,0x3735,0x3736,0x3737, + /* Range 0xB807 - 0xB809, array index: 0x10C8 */ + 0x3738,0x3739,0x373A, + /* Range 0xB834 - 0xB839, array index: 0x10CB */ + 0x3745,0x3746,INVALC,0x3747,0x3748,0x3749, + /* Range 0xB9CC - 0xB9D2, array index: 0x10D1 */ + 0x3838,INVALC,0x3839,0x383A,0x383B,0x383C,0x383D, + /* Range 0xB9E1 - 0xB9E5, array index: 0x10D8 */ + 0x3843,INVALC,0x3844,0x3845,0x3846, + /* Range 0xB9F4 - 0xB9FA, array index: 0x10DD */ + 0x3849,0x384A,INVALC,0x384B,0x384C,0x384D,0x384E, + /* Range 0xBA53 - 0xBA55, array index: 0x10E4 */ + 0x385D,0x385E,0x385F, + /* Range 0xBA64 - 0xBA69, array index: 0x10E7 */ + 0x3862,0x3863,INVALC,0x3864,0x3865,0x3866, + /* Range 0xBA83 - 0xBA87, array index: 0x10ED */ + 0x386B,0x386C,0x386D,INVALC,0x386E, + /* Range 0xBAA8 - 0xBAAC, array index: 0x10F2 */ + 0x3870,0x3871,INVALC,0x3872,0x3873, + /* Range 0xBB34 - 0xBB3E, array index: 0x10F7 */ + 0x392B,0x392C,0x392D,INVALC,0x392E,INVALC,INVALC,0x392F, + 0x3930,0x3931,0x3932, + /* Range 0xBC08 - 0xBC1F, array index: 0x1102 */ + 0x3952,0x3953,INVALC,0x3954,0x3955,0x3956,INVALC,0x3957, + INVALC,0x3958,INVALC,INVALC,0x3959,0x395A,0x395B,0x395C, + 0x395D,INVALC,INVALC,0x395E,0x395F,0x3960,0x3961,0x3962, + /* Range 0xBC40 - 0xBC45, array index: 0x111A */ + 0x396C,0x396D,INVALC,0x396E,0x396F,0x3970, + /* Range 0xBCB0 - 0xBCB5, array index: 0x1120 */ + 0x3A28,0x3A29,INVALC,0x3A2A,0x3A2B,0x3A2C, + /* Range 0xBCCD - 0xBCD1, array index: 0x1126 */ + 0x3A31,INVALC,0x3A32,0x3A33,0x3A34, + /* Range 0xBCF4 - 0xBCF8, array index: 0x112B */ + 0x3A38,0x3A39,0x3A3A,INVALC,0x3A3B, + /* Range 0xBD87 - 0xBD8A, array index: 0x1130 */ + 0x3A51,0x3A52,0x3A53,0x3A54, + /* Range 0xBE57 - 0xBE5B, array index: 0x1134 */ + 0x3A78,INVALC,0x3A79,0x3A7A,0x3A7B, + /* Range 0xBE70 - 0xBE75, array index: 0x1139 */ + 0x3B23,0x3B24,INVALC,0x3B25,0x3B26,0x3B27, + /* Range 0xBE7B - 0xBE7D, array index: 0x113F */ + 0x3B28,0x3B29,0x3B2A, + /* Range 0xBE8C - 0xBE91, array index: 0x1142 */ + 0x3B2D,0x3B2E,INVALC,0x3B2F,0x3B30,0x3B31, + /* Range 0xBEE3 - 0xBEE5, array index: 0x1148 */ + 0x3B3B,0x3B3C,0x3B3D, + /* Range 0xBF18 - 0xBF1D, array index: 0x114B */ + 0x3B42,0x3B43,INVALC,0x3B44,0x3B45,0x3B46, + /* Range 0xC0AC - 0xC0B6, array index: 0x1151 */ + 0x3B67,0x3B68,INVALC,0x3B69,0x3B6A,INVALC,INVALC,0x3B6B, + 0x3B6C,0x3B6D,0x3B6E, + /* Range 0xC0BC - 0xC0C1, array index: 0x115C */ + 0x3B6F,0x3B70,INVALC,0x3B71,0x3B72,0x3B73, + /* Range 0xC0D8 - 0xC0DD, array index: 0x1162 */ + 0x3B79,0x3B7A,INVALC,0x3B7B,0x3B7C,0x3B7D, + /* Range 0xC11C - 0xC127, array index: 0x1168 */ + 0x3C2D,0x3C2E,0x3C2F,0x3C30,0x3C31,INVALC,INVALC,0x3C32, + 0x3C33,INVALC,0x3C34,0x3C35, + /* Range 0xC12C - 0xC131, array index: 0x1174 */ + 0x3C36,0x3C37,INVALC,0x3C38,0x3C39,0x3C3A, + /* Range 0xC148 - 0xC14D, array index: 0x117A */ + 0x3C40,0x3C41,INVALC,0x3C42,0x3C43,0x3C44, + /* Range 0xC164 - 0xC169, array index: 0x1180 */ + 0x3C49,0x3C4A,INVALC,0x3C4B,0x3C4C,0x3C4D, + /* Range 0xC18C - 0xC190, array index: 0x1186 */ + 0x3C52,0x3C53,0x3C54,INVALC,0x3C55, + /* Range 0xC2EB - 0xC2F1, array index: 0x118B */ + 0x3D48,0x3D49,0x3D4A,INVALC,0x3D4B,INVALC,0x3D4C, + /* Range 0xC2F8 - 0xC2FC, array index: 0x1192 */ + 0x3D4E,0x3D4F,INVALC,0x3D50,0x3D51, + /* Range 0xC313 - 0xC315, array index: 0x1197 */ + 0x3D57,0x3D58,0x3D59, + /* Range 0xC4FF - 0xC501, array index: 0x119A */ + 0x3E37,0x3E38,0x3E39, + /* Range 0xC544 - 0xC54E, array index: 0x119D */ + 0x3E46,0x3E47,INVALC,INVALC,0x3E48,0x3E49,0x3E4A,INVALC, + 0x3E4B,0x3E4C,0x3E4D, + /* Range 0xC553 - 0xC559, array index: 0x11A8 */ + 0x3E4E,0x3E4F,0x3E50,INVALC,0x3E51,0x3E52,0x3E53, + /* Range 0xC55D - 0xC561, array index: 0x11AF */ + 0x3E54,0x3E55,INVALC,0x3E56,0x3E57, + /* Range 0xC570 - 0xC575, array index: 0x11B4 */ + 0x3E5A,0x3E5B,INVALC,0x3E5C,0x3E5D,0x3E5E, + /* Range 0xC5B8 - 0xC5BE, array index: 0x11BA */ + 0x3E70,0x3E71,INVALC,0x3E72,0x3E73,0x3E74,0x3E75, + /* Range 0xC5C4 - 0xC5D1, array index: 0x11C1 */ + 0x3E76,0x3E77,0x3E78,0x3E79,0x3E7A,0x3E7B,0x3E7C,INVALC, + 0x3E7D,INVALC,0x3E7E,INVALC,0x3F21,0x3F22, + /* Range 0xC5EC - 0xC5F0, array index: 0x11CF */ + 0x3F29,0x3F2A,0x3F2B,INVALC,0x3F2C, + /* Range 0xC5FC - 0xC608, array index: 0x11D4 */ + 0x3F30,0x3F31,0x3F32,0x3F33,0x3F34,0x3F35,INVALC,INVALC, + INVALC,0x3F36,0x3F37,0x3F38,0x3F39, + /* Range 0xC618 - 0xC61C, array index: 0x11E1 */ + 0x3F3C,0x3F3D,INVALC,0x3F3E,0x3F3F, + /* Range 0xC62C - 0xC63B, array index: 0x11E6 */ + 0x3F43,0x3F44,0x3F45,INVALC,0x3F46,INVALC,INVALC,0x3F47, + 0x3F48,0x3F49,INVALC,0x3F4A,INVALC,0x3F4B,INVALC,0x3F4C, + /* Range 0xC650 - 0xC655, array index: 0x11F6 */ + 0x3F51,0x3F52,INVALC,0x3F53,0x3F54,0x3F55, + /* Range 0xC6B8 - 0xC6BA, array index: 0x11FC */ + 0x3F6F,0x3F70,0x3F71, + /* Range 0xC74F - 0xC758, array index: 0x11FF */ + 0x403F,INVALC,0x4040,0x4041,0x4042,0x4043,0x4044,0x4045, + 0x4046,0x4047, + /* Range 0xC77C - 0xC77E, array index: 0x1209 */ + 0x404F,0x4050,0x4051, + /* Range 0xC783 - 0xC78A, array index: 0x120C */ + 0x4052,0x4053,0x4054,INVALC,0x4055,0x4056,0x4057,0x4058, + /* Range 0xC794 - 0xC79A, array index: 0x1214 */ + 0x405C,INVALC,0x405D,0x405E,0x405F,INVALC,0x4060, + /* Range 0xC7A0 - 0xC7A6, array index: 0x121B */ + 0x4061,0x4062,INVALC,0x4063,0x4064,0x4065,0x4066, + /* Range 0xC7BC - 0xC7C1, array index: 0x1222 */ + 0x406B,0x406C,INVALC,0x406D,0x406E,0x406F, + /* Range 0xC883 - 0xC88D, array index: 0x1228 */ + 0x413D,INVALC,0x413E,0x413F,0x4140,INVALC,INVALC,INVALC, + 0x4141,0x4142,0x4143, + /* Range 0xC904 - 0xC906, array index: 0x1233 */ + 0x4159,0x415A,0x415B, + /* Range 0xC9D9 - 0xC9DD, array index: 0x1236 */ + 0x4223,0x4224,INVALC,0x4225,0x4226, + /* Range 0xC9EC - 0xC9F1, array index: 0x123B */ + 0x422B,0x422C,INVALC,0x422D,0x422E,0x422F, + /* Range 0xCA08 - 0xCA0D, array index: 0x1241 */ + 0x4234,0x4235,INVALC,0x4236,0x4237,0x4238, + /* Range 0xCA5C - 0xCA61, array index: 0x1247 */ + 0x4240,0x4241,INVALC,0x4242,0x4243,0x4244, + /* Range 0xCC27 - 0xCC29, array index: 0x124D */ + 0x4276,0x4277,0x4278, + /* Range 0xCC38 - 0xCC3E, array index: 0x1250 */ + 0x427C,0x427D,INVALC,0x427E,0x4321,0x4322,0x4323, + /* Range 0xCC54 - 0xCC59, array index: 0x1257 */ + 0x4328,0x4329,INVALC,0x432A,0x432B,0x432C, + /* Range 0xCCA8 - 0xCCAD, array index: 0x125D */ + 0x4337,0x4338,INVALC,0x4339,0x433A,0x433B, + /* Range 0xCE5F - 0xCE61, array index: 0x1263 */ + 0x4424,0x4425,0x4426, + /* Range 0xCEA0 - 0xCEA5, array index: 0x1266 */ + 0x4437,0x4438,INVALC,0x4439,0x443A,0x443B, + /* Range 0xCEF4 - 0xCEF9, array index: 0x126C */ + 0x4444,0x4445,INVALC,0x4446,0x4447,0x4448, + /* Range 0xCF2C - 0xCF31, array index: 0x1272 */ + 0x4454,0x4455,INVALC,0x4456,0x4457,0x4458, + /* Range 0xD0D0 - 0xD0D5, array index: 0x1278 */ + 0x453D,0x453E,INVALC,0x453F,0x4540,0x4541, + /* Range 0xD0EC - 0xD0F1, array index: 0x127E */ + 0x4546,0x4547,INVALC,0x4548,0x4549,0x454A, + /* Range 0xD140 - 0xD145, array index: 0x1284 */ + 0x4552,0x4553,INVALC,0x4554,0x4555,0x4556, + /* Range 0xD30C - 0xD310, array index: 0x128A */ + 0x4644,0x4645,0x4646,INVALC,0x4647, + /* Range 0xD31C - 0xD321, array index: 0x128F */ + 0x464A,0x464B,INVALC,0x464C,0x464D,0x464E, + /* Range 0xD338 - 0xD33D, array index: 0x1295 */ + 0x4654,0x4655,INVALC,0x4656,0x4657,0x4658, + /* Range 0xD38C - 0xD391, array index: 0x129B */ + 0x465F,0x4660,INVALC,0x4661,0x4662,0x4663, + /* Range 0xD584 - 0xD589, array index: 0x12A1 */ + 0x475C,0x475D,INVALC,0x475E,0x475F,0x4760, + /* Range 0xD610 - 0xD615, array index: 0x12A7 */ + 0x4778,0x4779,INVALC,0x477A,0x477B,0x477C, + /* Range 0xD754 - 0xD759, array index: 0x12AD */ + 0x4867,INVALC,0x4868,0x4869,0x486A,0x486B, + /* Range 0xF900 - 0xFA0B, array index: 0x12B3 */ + 0x4B50,0x4B56,0x4B67,0x4D4F,0x4D68,0x4E2D,0x4F7B,0x5022, + 0x5038,0x5050,0x505D,0x5154,0x5155,0x5158,0x515B,0x515C, + 0x515D,0x515E,0x515F,0x5160,0x5162,0x5163,0x5164,0x5165, + 0x5166,0x5168,0x5169,0x516A,0x516B,0x516D,0x516F,0x5170, + 0x5172,0x5176,0x517A,0x517C,0x517D,0x517E,0x5222,0x5223, + 0x5227,0x5228,0x5229,0x522A,0x522B,0x522D,0x5232,0x523E, + 0x5242,0x5243,0x5244,0x5246,0x5247,0x5248,0x5249,0x524A, + 0x524B,0x524D,0x524E,0x524F,0x5250,0x5251,0x5252,0x5253, + 0x5254,0x5255,0x5256,0x5257,0x5259,0x525A,0x525E,0x525F, + 0x5261,0x5262,0x5264,0x5265,0x5266,0x5267,0x5268,0x5269, + 0x526A,0x526B,0x5270,0x5271,0x5272,0x5273,0x5274,0x5275, + 0x5277,0x5278,0x5466,0x547C,0x5525,0x552B,0x552E,0x5638, + 0x564D,0x574B,0x5764,0x5B45,0x5B64,0x5C25,0x5D25,0x5D55, + 0x5D74,0x5E7C,0x5E7E,0x5F33,0x5F61,0x5F68,0x6071,0x612D, + 0x616D,0x6375,0x6421,0x6429,0x652E,0x6531,0x6532,0x6539, + 0x653B,0x653C,0x6544,0x654E,0x6550,0x6552,0x6556,0x657A, + 0x657B,0x657C,0x657E,0x6621,0x6624,0x6627,0x662D,0x662F, + 0x6630,0x6631,0x6633,0x6637,0x6638,0x663C,0x6644,0x6646, + 0x6647,0x664A,0x6652,0x6656,0x6659,0x665C,0x665F,0x6661, + 0x6664,0x6665,0x6666,0x6668,0x666A,0x666B,0x666C,0x666F, + 0x6671,0x6672,0x6675,0x6676,0x6677,0x6679,0x6721,0x6726, + 0x6729,0x672A,0x672C,0x672D,0x6730,0x673F,0x6741,0x6746, + 0x6747,0x674B,0x674D,0x674F,0x6750,0x6753,0x675F,0x6764, + 0x6766,0x6777,0x6867,0x6868,0x6870,0x6871,0x6877,0x6879, + 0x687B,0x687E,0x6927,0x692C,0x694C,0x6977,0x6A41,0x6A65, + 0x6A74,0x6A77,0x6A7C,0x6A7E,0x6B24,0x6B27,0x6B29,0x6B2A, + 0x6B3A,0x6B3B,0x6B3D,0x6B41,0x6B42,0x6B46,0x6B47,0x6B4C, + 0x6B4F,0x6B50,0x6B51,0x6B52,0x6B58,0x6C26,0x6C27,0x6C2A, + 0x6C2F,0x6C30,0x6C31,0x6C32,0x6C35,0x6C38,0x6C3A,0x6C40, + 0x6C41,0x6C45,0x6C46,0x6C49,0x6C4A,0x6C55,0x6C5D,0x6C5E, + 0x6C61,0x6C64,0x6C67,0x6C68,0x6C77,0x6C78,0x6C7A,0x6D21, + 0x6D22,0x6D23,0x6D6E,0x6E5B,0x723D,0x727A,0x7331,0x7427, + 0x746E,0x7674,0x7676,0x7738,0x7748,0x7753,0x785B,0x7870, + 0x7A21,0x7A22,0x7A66,0x7C29, + /* Range 0xFF01 - 0xFF5E, array index: 0x13BF */ + 0x2321,0x2322,0x2323,0x2324,0x2325,0x2326,0x2327,0x2328, + 0x2329,0x232A,0x232B,0x232C,0x232D,0x232E,0x232F,0x2330, + 0x2331,0x2332,0x2333,0x2334,0x2335,0x2336,0x2337,0x2338, + 0x2339,0x233A,0x233B,0x233C,0x233D,0x233E,0x233F,0x2340, + 0x2341,0x2342,0x2343,0x2344,0x2345,0x2346,0x2347,0x2348, + 0x2349,0x234A,0x234B,0x234C,0x234D,0x234E,0x234F,0x2350, + 0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358, + 0x2359,0x235A,0x235B,0x212C,0x235D,0x235E,0x235F,0x2360, + 0x2361,0x2362,0x2363,0x2364,0x2365,0x2366,0x2367,0x2368, + 0x2369,0x236A,0x236B,0x236C,0x236D,0x236E,0x236F,0x2370, + 0x2371,0x2372,0x2373,0x2374,0x2375,0x2376,0x2377,0x2378, + 0x2379,0x237A,0x237B,0x237C,0x237D,0x2226, + /* Range 0xFFE0 - 0xFFE6, array index: 0x141D */ + 0x214B,0x214C,0x217E,0x237E,INVALC,0x214D,0x235C, + /* Unranged codes (438 codes) */ + /* Array index: 0x1424 */ 0x00A1,0x222E, + /* Array index: 0x1424 */ 0x00A4,0x2234, + /* Array index: 0x1424 */ 0x00A7,0x2157, + /* Array index: 0x1424 */ 0x00A8,0x2127, + /* Array index: 0x1424 */ 0x00AA,0x2823, + /* Array index: 0x1424 */ 0x00AD,0x2129, + /* Array index: 0x1424 */ 0x00C6,0x2821, + /* Array index: 0x1424 */ 0x00D0,0x2822, + /* Array index: 0x1424 */ 0x00D7,0x213F, + /* Array index: 0x1424 */ 0x00D8,0x282A, + /* Array index: 0x1424 */ 0x00DE,0x282D, + /* Array index: 0x1424 */ 0x00DF,0x292C, + /* Array index: 0x1424 */ 0x00E6,0x2921, + /* Array index: 0x1424 */ 0x00F0,0x2923, + /* Array index: 0x1424 */ 0x00F7,0x2140, + /* Array index: 0x1424 */ 0x00F8,0x292A, + /* Array index: 0x1424 */ 0x00FE,0x292D, + /* Array index: 0x1424 */ 0x0111,0x2922, + /* Array index: 0x1424 */ 0x0126,0x2824, + /* Array index: 0x1424 */ 0x0127,0x2924, + /* Array index: 0x1424 */ 0x0138,0x2927, + /* Array index: 0x1424 */ 0x0152,0x282B, + /* Array index: 0x1424 */ 0x0153,0x292B, + /* Array index: 0x1424 */ 0x0166,0x282E, + /* Array index: 0x1424 */ 0x0167,0x292E, + /* Array index: 0x1424 */ 0x02C7,0x2227, + /* Array index: 0x1424 */ 0x02D0,0x2230, + /* Array index: 0x1424 */ 0x0401,0x2C27, + /* Array index: 0x1424 */ 0x2015,0x212A, + /* Array index: 0x1424 */ 0x2018,0x212E, + /* Array index: 0x1424 */ 0x2019,0x212F, + /* Array index: 0x1424 */ 0x201C,0x2130, + /* Array index: 0x1424 */ 0x201D,0x2131, + /* Array index: 0x1424 */ 0x2020,0x2253, + /* Array index: 0x1424 */ 0x2021,0x2254, + /* Array index: 0x1424 */ 0x2025,0x2125, + /* Array index: 0x1424 */ 0x2026,0x2126, + /* Array index: 0x1424 */ 0x2030,0x2236, + /* Array index: 0x1424 */ 0x2032,0x2147, + /* Array index: 0x1424 */ 0x2033,0x2148, + /* Array index: 0x1424 */ 0x203B,0x2158, + /* Array index: 0x1424 */ 0x2074,0x2979, + /* Array index: 0x1424 */ 0x2103,0x2149, + /* Array index: 0x1424 */ 0x2109,0x2235, + /* Array index: 0x1424 */ 0x2113,0x2724, + /* Array index: 0x1424 */ 0x2116,0x2260, + /* Array index: 0x1424 */ 0x2121,0x2265, + /* Array index: 0x1424 */ 0x2122,0x2262, + /* Array index: 0x1424 */ 0x2126,0x2759, + /* Array index: 0x1424 */ 0x212B,0x214A, + /* Array index: 0x1424 */ 0x2153,0x2877, + /* Array index: 0x1424 */ 0x2154,0x2878, + /* Array index: 0x1424 */ 0x21D2,0x2221, + /* Array index: 0x1424 */ 0x21D4,0x2222, + /* Array index: 0x1424 */ 0x2200,0x2223, + /* Array index: 0x1424 */ 0x2202,0x2153, + /* Array index: 0x1424 */ 0x2203,0x2224, + /* Array index: 0x1424 */ 0x2207,0x2154, + /* Array index: 0x1424 */ 0x2208,0x2174, + /* Array index: 0x1424 */ 0x220B,0x2175, + /* Array index: 0x1424 */ 0x220F,0x2233, + /* Array index: 0x1424 */ 0x2211,0x2232, + /* Array index: 0x1424 */ 0x221A,0x216E, + /* Array index: 0x1424 */ 0x221D,0x2170, + /* Array index: 0x1424 */ 0x221E,0x2144, + /* Array index: 0x1424 */ 0x2220,0x2150, + /* Array index: 0x1424 */ 0x2234,0x2145, + /* Array index: 0x1424 */ 0x2235,0x2171, + /* Array index: 0x1424 */ 0x223C,0x212D, + /* Array index: 0x1424 */ 0x223D,0x216F, + /* Array index: 0x1424 */ 0x2252,0x2156, + /* Array index: 0x1424 */ 0x2260,0x2141, + /* Array index: 0x1424 */ 0x2261,0x2155, + /* Array index: 0x1424 */ 0x2264,0x2142, + /* Array index: 0x1424 */ 0x2265,0x2143, + /* Array index: 0x1424 */ 0x226A,0x216C, + /* Array index: 0x1424 */ 0x226B,0x216D, + /* Array index: 0x1424 */ 0x2282,0x2178, + /* Array index: 0x1424 */ 0x2283,0x2179, + /* Array index: 0x1424 */ 0x2286,0x2176, + /* Array index: 0x1424 */ 0x2287,0x2177, + /* Array index: 0x1424 */ 0x2299,0x2241, + /* Array index: 0x1424 */ 0x22A5,0x2151, + /* Array index: 0x1424 */ 0x2312,0x2152, + /* Array index: 0x1424 */ 0x2592,0x2246, + /* Array index: 0x1424 */ 0x25B2,0x2163, + /* Array index: 0x1424 */ 0x25B3,0x2162, + /* Array index: 0x1424 */ 0x25B6,0x223A, + /* Array index: 0x1424 */ 0x25B7,0x2239, + /* Array index: 0x1424 */ 0x25BC,0x2165, + /* Array index: 0x1424 */ 0x25BD,0x2164, + /* Array index: 0x1424 */ 0x25C0,0x2238, + /* Array index: 0x1424 */ 0x25C1,0x2237, + /* Array index: 0x1424 */ 0x25CB,0x215B, + /* Array index: 0x1424 */ 0x2605,0x215A, + /* Array index: 0x1424 */ 0x2606,0x2159, + /* Array index: 0x1424 */ 0x260E,0x224F, + /* Array index: 0x1424 */ 0x260F,0x224E, + /* Array index: 0x1424 */ 0x261C,0x2250, + /* Array index: 0x1424 */ 0x261E,0x2251, + /* Array index: 0x1424 */ 0x2640,0x214F, + /* Array index: 0x1424 */ 0x2642,0x214E, + /* Array index: 0x1424 */ 0x327F,0x225E, + /* Array index: 0x1424 */ 0x33CF,0x2739, + /* Array index: 0x1424 */ 0x33D0,0x276A, + /* Array index: 0x1424 */ 0x33D3,0x276B, + /* Array index: 0x1424 */ 0x33D6,0x275F, + /* Array index: 0x1424 */ 0x33D8,0x2264, + /* Array index: 0x1424 */ 0x4E00,0x6C69, + /* Array index: 0x1424 */ 0x4E01,0x6F4B, + /* Array index: 0x1424 */ 0x4E03,0x7652, + /* Array index: 0x1424 */ 0x4E11,0x7564, + /* Array index: 0x1424 */ 0x4E1E,0x632A, + /* Array index: 0x1424 */ 0x4E2D,0x7169, + /* Array index: 0x1424 */ 0x4E32,0x4D7A, + /* Array index: 0x1424 */ 0x4E38,0x7C2F, + /* Array index: 0x1424 */ 0x4E39,0x5321, + /* Array index: 0x1424 */ 0x4E3B,0x712B, + /* Array index: 0x1424 */ 0x4E42,0x6751, + /* Array index: 0x1424 */ 0x4E43,0x522C, + /* Array index: 0x1424 */ 0x4E45,0x4E79, + /* Array index: 0x1424 */ 0x4E56,0x4E52, + /* Array index: 0x1424 */ 0x4E58,0x632B, + /* Array index: 0x1424 */ 0x4E59,0x6B60, + /* Array index: 0x1424 */ 0x4E6B,0x4A61, + /* Array index: 0x1424 */ 0x4E6D,0x544C, + /* Array index: 0x1424 */ 0x4E73,0x6A61, + /* Array index: 0x1424 */ 0x4E76,0x5C63, + /* Array index: 0x1424 */ 0x4E77,0x5F2D, + /* Array index: 0x1424 */ 0x4E7E,0x4B6B, + /* Array index: 0x1424 */ 0x4E82,0x552F, + /* Array index: 0x1424 */ 0x4E86,0x5675, + /* Array index: 0x1424 */ 0x4E88,0x6578, + /* Array index: 0x1424 */ 0x4E8B,0x5E40, + /* Array index: 0x1424 */ 0x4E8C,0x6C23, + /* Array index: 0x1424 */ 0x4E98,0x5066, + /* Array index: 0x1424 */ 0x4E9B,0x5E41, + /* Array index: 0x1424 */ 0x4E9E,0x642C, + /* Array index: 0x1424 */ 0x4EB6,0x5322, + /* Array index: 0x1424 */ 0x4EBA,0x6C51, + /* Array index: 0x1424 */ 0x4EC0,0x6427, + /* Array index: 0x1424 */ 0x4EC1,0x6C52, + /* Array index: 0x1424 */ 0x4EC4,0x7631, + /* Array index: 0x1424 */ 0x4EC7,0x4E7B, + /* Array index: 0x1424 */ 0x4ECA,0x5051, + /* Array index: 0x1424 */ 0x4ECB,0x4B3F, + /* Array index: 0x1424 */ 0x4ECD,0x6D24, + /* Array index: 0x1424 */ 0x4EDD,0x544E, + /* Array index: 0x1424 */ 0x4EDF,0x7435, + /* Array index: 0x1424 */ 0x4EF0,0x6466, + /* Array index: 0x1424 */ 0x4EF2,0x716A, + /* Array index: 0x1424 */ 0x4EF6,0x4B6C, + /* Array index: 0x1424 */ 0x4EF7,0x4B40, + /* Array index: 0x1424 */ 0x4EFB,0x6C72, + /* Array index: 0x1424 */ 0x4F01,0x506A, + /* Array index: 0x1424 */ 0x4F2F,0x5B57, + /* Array index: 0x1424 */ 0x4F34,0x5A61, + /* Array index: 0x1424 */ 0x4F36,0x5636, + /* Array index: 0x1424 */ 0x4F38,0x635F, + /* Array index: 0x1424 */ 0x4F3A,0x5E43, + /* Array index: 0x1424 */ 0x4F3C,0x5E44, + /* Array index: 0x1424 */ 0x4F3D,0x4A21, + /* Array index: 0x1424 */ 0x4F43,0x6E6C, + /* Array index: 0x1424 */ 0x4F55,0x793C, + /* Array index: 0x1424 */ 0x4F69,0x7825, + /* Array index: 0x1424 */ 0x4F6F,0x653A, + /* Array index: 0x1424 */ 0x4F70,0x5B58, + /* Array index: 0x1424 */ 0x4F73,0x4A22, + /* Array index: 0x1424 */ 0x4F76,0x514D, + /* Array index: 0x1424 */ 0x4F7A,0x6E6D, + /* Array index: 0x1424 */ 0x4F7E,0x6C6B, + /* Array index: 0x1424 */ 0x4F7F,0x5E45, + /* Array index: 0x1424 */ 0x4F81,0x6360, + /* Array index: 0x1424 */ 0x4F83,0x4A49, + /* Array index: 0x1424 */ 0x4F84,0x7269, + /* Array index: 0x1424 */ 0x4F86,0x554E, + /* Array index: 0x1424 */ 0x4F88,0x7636, + /* Array index: 0x1424 */ 0x4F8A,0x4E42, + /* Array index: 0x1424 */ 0x4F8B,0x5647, + /* Array index: 0x1424 */ 0x4F8D,0x6334, + /* Array index: 0x1424 */ 0x4F8F,0x712D, + /* Array index: 0x1424 */ 0x4F91,0x6A62, + /* Array index: 0x1424 */ 0x4F96,0x5742, + /* Array index: 0x1424 */ 0x4F98,0x7327, + /* Array index: 0x1424 */ 0x4F9B,0x4D6A, + /* Array index: 0x1424 */ 0x4F9D,0x6B6E, + /* Array index: 0x1424 */ 0x4FAE,0x5932, + /* Array index: 0x1424 */ 0x4FAF,0x7D25, + /* Array index: 0x1424 */ 0x4FB5,0x7655, + /* Array index: 0x1424 */ 0x4FB6,0x5562, + /* Array index: 0x1424 */ 0x4FBF,0x7835, + /* Array index: 0x1424 */ 0x4FC9,0x676B, + /* Array index: 0x1424 */ 0x4FCA,0x7155, + /* Array index: 0x1424 */ 0x4FCE,0x703B, + /* Array index: 0x1424 */ 0x4FD1,0x6935, + /* Array index: 0x1424 */ 0x4FD3,0x4C49, + /* Array index: 0x1424 */ 0x4FD4,0x7A55, + /* Array index: 0x1424 */ 0x4FD7,0x6154, + /* Array index: 0x1424 */ 0x4FDA,0x5756, + /* Array index: 0x1424 */ 0x4FEE,0x6173, + /* Array index: 0x1424 */ 0x4FEF,0x5C76, + /* Array index: 0x1424 */ 0x4FF1,0x4E7C, + /* Array index: 0x1424 */ 0x4FF3,0x5B44, + /* Array index: 0x1424 */ 0x4FF5,0x7871, + /* Array index: 0x1424 */ 0x4FF8,0x5C64, + /* Array index: 0x1424 */ 0x4FFA,0x656F, + /* Array index: 0x1424 */ 0x5002,0x5C31, + /* Array index: 0x1424 */ 0x5006,0x5556, + /* Array index: 0x1424 */ 0x5009,0x735A, + /* Array index: 0x1424 */ 0x500B,0x4B41, + /* Array index: 0x1424 */ 0x500D,0x5B43, + /* Array index: 0x1424 */ 0x5011,0x597A, + /* Array index: 0x1424 */ 0x5012,0x536E, + /* Array index: 0x1424 */ 0x5016,0x7A38, + /* Array index: 0x1424 */ 0x5019,0x7D26, + /* Array index: 0x1424 */ 0x501A,0x6B6F, + /* Array index: 0x1424 */ 0x501C,0x7426, + /* Array index: 0x1424 */ 0x501E,0x4C4A, + /* Array index: 0x1424 */ 0x501F,0x7328, + /* Array index: 0x1424 */ 0x5021,0x735B, + /* Array index: 0x1424 */ 0x503B,0x6526, + /* Array index: 0x1424 */ 0x5043,0x6567, + /* Array index: 0x1424 */ 0x504F,0x7836, + /* Array index: 0x1424 */ 0x5055,0x7A25, + /* Array index: 0x1424 */ 0x505A,0x712E, + /* Array index: 0x1424 */ 0x505C,0x6F4E, + /* Array index: 0x1424 */ 0x5065,0x4B6D, + /* Array index: 0x1424 */ 0x5080,0x4E53, + /* Array index: 0x1424 */ 0x5085,0x5C77, + /* Array index: 0x1424 */ 0x508D,0x5B28, + /* Array index: 0x1424 */ 0x5091,0x4B78, + /* Array index: 0x1424 */ 0x5098,0x5F21, + /* Array index: 0x1424 */ 0x5099,0x5D61, + /* Array index: 0x1424 */ 0x50AC,0x754A, + /* Array index: 0x1424 */ 0x50AD,0x6936, + /* Array index: 0x1424 */ 0x50B2,0x676C, + /* Array index: 0x1424 */ 0x50B3,0x6E6E, + /* Array index: 0x1424 */ 0x50B5,0x7370, + /* Array index: 0x1424 */ 0x50B7,0x5F3F, + /* Array index: 0x1424 */ 0x50BE,0x4C4B, + /* Array index: 0x1424 */ 0x50C5,0x5041, + /* Array index: 0x1424 */ 0x50C9,0x7452, + /* Array index: 0x1424 */ 0x50CA,0x603A, + /* Array index: 0x1424 */ 0x50CF,0x5F40, + /* Array index: 0x1424 */ 0x50D1,0x4E60, + /* Array index: 0x1424 */ 0x50D5,0x5C52, + /* Array index: 0x1424 */ 0x50D6,0x7D6A, + /* Array index: 0x1424 */ 0x50DA,0x5676, + /* Array index: 0x1424 */ 0x50DE,0x6A4A, + /* Array index: 0x1424 */ 0x50E5,0x6869, + /* Array index: 0x1424 */ 0x50E7,0x632C, + /* Array index: 0x1424 */ 0x50ED,0x7350, + /* Array index: 0x1424 */ 0x50F9,0x4A24, + /* Array index: 0x1424 */ 0x50FB,0x5B78, + /* Array index: 0x1424 */ 0x5104,0x6562, + /* Array index: 0x1424 */ 0x5106,0x4C4C, + /* Array index: 0x1424 */ 0x5109,0x4B7B, + /* Array index: 0x1424 */ 0x5112,0x6A63, + /* Array index: 0x1424 */ 0x511F,0x5F41, + /* Array index: 0x1424 */ 0x5121,0x566D, + /* Array index: 0x1424 */ 0x512A,0x6950, + /* Array index: 0x1424 */ 0x5132,0x6E39, + /* Array index: 0x1424 */ 0x5137,0x5563, + /* Array index: 0x1424 */ 0x513A,0x5153, + /* Array index: 0x1424 */ 0x513C,0x6570, + /* Array index: 0x1424 */ 0x5152,0x642E, + /* Array index: 0x1424 */ 0x515C,0x545F, + /* Array index: 0x1424 */ 0x5162,0x5067, + /* Array index: 0x1424 */ 0x5171,0x4D6C, + /* Array index: 0x1424 */ 0x517C,0x4C42, + /* Array index: 0x1424 */ 0x5180,0x506D, + /* Array index: 0x1424 */ 0x5186,0x6577, + /* Array index: 0x1424 */ 0x518A,0x737C, + /* Array index: 0x1424 */ 0x518D,0x6E22, + /* Array index: 0x1424 */ 0x5192,0x5933, + /* Array index: 0x1424 */ 0x5195,0x5874, + /* Array index: 0x1424 */ 0x5197,0x6937, + /* Array index: 0x1424 */ 0x51A0,0x4E2E, + /* Array index: 0x1424 */ 0x51A5,0x5922, + /* Array index: 0x1424 */ 0x51AA,0x5871, + /* Array index: 0x1424 */ 0x51AC,0x544F, + /* Array index: 0x1424 */ 0x51B6,0x6527, + /* Array index: 0x1424 */ 0x51B7,0x5552, + /* Array index: 0x1424 */ 0x51BD,0x5629, + /* Array index: 0x1424 */ 0x51C4,0x7422, + /* Array index: 0x1424 */ 0x51C6,0x7157, + /* Array index: 0x1424 */ 0x51E1,0x5B6D, + /* Array index: 0x1424 */ 0x51F0,0x7C45, + /* Array index: 0x1424 */ 0x51F1,0x4B42, + /* Array index: 0x1424 */ 0x51FD,0x795E, + /* Array index: 0x1424 */ 0x5200,0x536F, + /* Array index: 0x1424 */ 0x5203,0x6C53, + /* Array index: 0x1424 */ 0x520E,0x597B, + /* Array index: 0x1424 */ 0x5211,0x7A7D, + /* Array index: 0x1424 */ 0x5217,0x562A, + /* Array index: 0x1424 */ 0x521D,0x7478, + /* Array index: 0x1424 */ 0x5224,0x7777, + /* Array index: 0x1424 */ 0x5225,0x5C2C, + /* Array index: 0x1424 */ 0x5229,0x5757, + /* Array index: 0x1424 */ 0x522A,0x5F22, + /* Array index: 0x1424 */ 0x522E,0x4E3E, + /* Array index: 0x1424 */ 0x5230,0x5370, + /* Array index: 0x1424 */ 0x5243,0x746F, + /* Array index: 0x1424 */ 0x5247,0x764E, + /* Array index: 0x1424 */ 0x5254,0x7428, + /* Array index: 0x1424 */ 0x5256,0x5C78, + /* Array index: 0x1424 */ 0x525B,0x4B27, + /* Array index: 0x1424 */ 0x525D,0x5A4E, + /* Array index: 0x1424 */ 0x5261,0x6066, + /* Array index: 0x1424 */ 0x5269,0x6D25, + /* Array index: 0x1424 */ 0x526A,0x6E72, + /* Array index: 0x1424 */ 0x526F,0x5C79, + /* Array index: 0x1424 */ 0x5272,0x795C, + /* Array index: 0x1424 */ 0x5275,0x735C, + /* Array index: 0x1424 */ 0x527D,0x7872, + /* Array index: 0x1424 */ 0x527F,0x7479, + /* Array index: 0x1424 */ 0x5283,0x7C71, + /* Array index: 0x1424 */ 0x528D,0x4B7C, + /* Array index: 0x1424 */ 0x5291,0x7025, + /* Array index: 0x1424 */ 0x5292,0x4B7D, + /* Array index: 0x1424 */ 0x529B,0x5574, + /* Array index: 0x1424 */ 0x529F,0x4D6D, + /* Array index: 0x1424 */ 0x52A0,0x4A25, + /* Array index: 0x1424 */ 0x52A3,0x562B, + /* Array index: 0x1424 */ 0x52A4,0x5042, + /* Array index: 0x1424 */ 0x52BE,0x7A36, + /* Array index: 0x1424 */ 0x52C1,0x4C4D, + /* Array index: 0x1424 */ 0x52C3,0x5A7A, + /* Array index: 0x1424 */ 0x52C5,0x764F, + /* Array index: 0x1424 */ 0x52C7,0x6938, + /* Array index: 0x1424 */ 0x52C9,0x5875, + /* Array index: 0x1424 */ 0x52CD,0x4C4E, + /* Array index: 0x1424 */ 0x52D2,0x574D, + /* Array index: 0x1424 */ 0x52F3,0x7D33, + /* Array index: 0x1424 */ 0x52F5,0x5564, + /* Array index: 0x1424 */ 0x52F8,0x4F68, + /* Array index: 0x1424 */ 0x52FA,0x6D43, + /* Array index: 0x1424 */ 0x52FB,0x5032, + /* Array index: 0x1424 */ 0x52FE,0x4E7E, + /* Array index: 0x1424 */ 0x52FF,0x5A28, + /* Array index: 0x1424 */ 0x5305,0x7850, + /* Array index: 0x1424 */ 0x5308,0x7D56, + /* Array index: 0x1424 */ 0x530D,0x7851, + /* Array index: 0x1424 */ 0x530F,0x7852, + /* Array index: 0x1424 */ 0x5310,0x5C53, + /* Array index: 0x1424 */ 0x5320,0x6D5D, + /* Array index: 0x1424 */ 0x5321,0x4E44, + /* Array index: 0x1424 */ 0x5323,0x4B21, + /* Array index: 0x1424 */ 0x532A,0x5D63, + /* Array index: 0x1424 */ 0x532F,0x7C5D, + /* Array index: 0x1424 */ 0x5339,0x792F, + /* Array index: 0x1424 */ 0x534D,0x5833, + /* Array index: 0x1424 */ 0x5357,0x5175, + /* Array index: 0x1424 */ 0x535A,0x5A4F, + /* Array index: 0x1424 */ 0x535C,0x5C54, + /* Array index: 0x1424 */ 0x535E,0x5C26, + /* Array index: 0x1424 */ 0x5360,0x6F3F, + /* Array index: 0x1424 */ 0x5366,0x4E4F, + /* Array index: 0x1424 */ 0x5368,0x6059, + /* Array index: 0x1424 */ 0x537D,0x716D, + /* Array index: 0x1424 */ 0x537F,0x4C4F, + /* Array index: 0x1424 */ 0x5384,0x6478, + /* Array index: 0x1424 */ 0x5393,0x646D, + /* Array index: 0x1424 */ 0x5398,0x5758, + /* Array index: 0x1424 */ 0x539A,0x7D27, + /* Array index: 0x1424 */ 0x539F,0x6A2B, + /* Array index: 0x1424 */ 0x53A0,0x7632, + /* Array index: 0x1424 */ 0x53A5,0x4F70, + /* Array index: 0x1424 */ 0x53A6,0x793D, + /* Array index: 0x1424 */ 0x53AD,0x6674, + /* Array index: 0x1424 */ 0x53BB,0x4B5B, + /* Array index: 0x1424 */ 0x53C3,0x7351, + /* Array index: 0x1424 */ 0x53D4,0x6252, + /* Array index: 0x1424 */ 0x53D6,0x7622, + /* Array index: 0x1424 */ 0x53D7,0x6174, + /* Array index: 0x1424 */ 0x53DB,0x5A64, + /* Array index: 0x1424 */ 0x53F8,0x5E49, + /* Array index: 0x1424 */ 0x5403,0x7D5E, + /* Array index: 0x1424 */ 0x5404,0x4A40, + /* Array index: 0x1424 */ 0x541B,0x4F56, + /* Array index: 0x1424 */ 0x541D,0x5770, + /* Array index: 0x1424 */ 0x541F,0x6B61, + /* Array index: 0x1424 */ 0x5420,0x7845, + /* Array index: 0x1424 */ 0x5426,0x5C7A, + /* Array index: 0x1424 */ 0x5429,0x5D43, + /* Array index: 0x1424 */ 0x542B,0x795F, + /* Array index: 0x1424 */ 0x5433,0x676F, + /* Array index: 0x1424 */ 0x5442,0x5565, + /* Array index: 0x1424 */ 0x5448,0x6F50, + /* Array index: 0x1424 */ 0x544A,0x4D31, + /* Array index: 0x1424 */ 0x5451,0x7722, + /* Array index: 0x1424 */ 0x5468,0x7132, + /* Array index: 0x1424 */ 0x546A,0x7131, + /* Array index: 0x1424 */ 0x5471,0x4D32, + /* Array index: 0x1424 */ 0x5473,0x5A2B, + /* Array index: 0x1424 */ 0x5475,0x4A27, + /* Array index: 0x1424 */ 0x5480,0x6E3A, + /* Array index: 0x1424 */ 0x5486,0x7853, + /* Array index: 0x1424 */ 0x548C,0x7B7A, + /* Array index: 0x1424 */ 0x548E,0x4F24, + /* Array index: 0x1424 */ 0x5490,0x5C7B, + /* Array index: 0x1424 */ 0x54A4,0x7663, + /* Array index: 0x1424 */ 0x54A8,0x6D2A, + /* Array index: 0x1424 */ 0x54AB,0x7221, + /* Array index: 0x1424 */ 0x54AC,0x4E61, + /* Array index: 0x1424 */ 0x54B3,0x7A26, + /* Array index: 0x1424 */ 0x54B8,0x7960, + /* Array index: 0x1424 */ 0x54BD,0x6C56, + /* Array index: 0x1424 */ 0x54C0,0x646E, + /* Array index: 0x1424 */ 0x54C1,0x7921, + /* Array index: 0x1424 */ 0x54C4,0x7B6F, + /* Array index: 0x1424 */ 0x54C8,0x796B, + /* Array index: 0x1424 */ 0x54C9,0x6E23, + /* Array index: 0x1424 */ 0x54E1,0x6A2C, + /* Array index: 0x1424 */ 0x54E5,0x4A28, + /* Array index: 0x1424 */ 0x54E8,0x747A, + /* Array index: 0x1424 */ 0x54ED,0x4D56, + /* Array index: 0x1424 */ 0x54EE,0x7C76, + /* Array index: 0x1424 */ 0x54F2,0x7449, + /* Array index: 0x1424 */ 0x54FA,0x7854, + /* Array index: 0x1424 */ 0x5504,0x7826, + /* Array index: 0x1424 */ 0x5506,0x5E4A, + /* Array index: 0x1424 */ 0x5507,0x7246, + /* Array index: 0x1424 */ 0x550E,0x575A, + /* Array index: 0x1424 */ 0x5510,0x5350, + /* Array index: 0x1424 */ 0x551C,0x5845, + /* Array index: 0x1424 */ 0x552F,0x6A66, + /* Array index: 0x1424 */ 0x5531,0x735D, + /* Array index: 0x1424 */ 0x5535,0x645A, + /* Array index: 0x1424 */ 0x553E,0x7664, + /* Array index: 0x1424 */ 0x5544,0x7672, + /* Array index: 0x1424 */ 0x5546,0x5F42, + /* Array index: 0x1424 */ 0x554F,0x597D, + /* Array index: 0x1424 */ 0x5553,0x4C76, + /* Array index: 0x1424 */ 0x5556,0x533A, + /* Array index: 0x1424 */ 0x555E,0x642F, + /* Array index: 0x1424 */ 0x5563,0x7961, + /* Array index: 0x1424 */ 0x557C,0x7026, + /* Array index: 0x1424 */ 0x5580,0x4B53, + /* Array index: 0x1424 */ 0x5584,0x603C, + /* Array index: 0x1424 */ 0x55C5,0x7D2B, + /* Array index: 0x1424 */ 0x55C7,0x5F60, + /* Array index: 0x1424 */ 0x55D4,0x7247, + /* Array index: 0x1424 */ 0x55DA,0x6770, + /* Array index: 0x1424 */ 0x55DC,0x506E, + /* Array index: 0x1424 */ 0x55DF,0x732A, + /* Array index: 0x1424 */ 0x55E3,0x5E4B, + /* Array index: 0x1424 */ 0x55E4,0x7638, + /* Array index: 0x1424 */ 0x55FD,0x6175, + /* Array index: 0x1424 */ 0x55FE,0x7133, + /* Array index: 0x1424 */ 0x5606,0x7723, + /* Array index: 0x1424 */ 0x5609,0x4A29, + /* Array index: 0x1424 */ 0x5614,0x4F25, + /* Array index: 0x1424 */ 0x5617,0x5F44, + /* Array index: 0x1424 */ 0x562F,0x6130, + /* Array index: 0x1424 */ 0x5632,0x703F, + /* Array index: 0x1424 */ 0x5634,0x7624, + /* Array index: 0x1424 */ 0x5636,0x6336, + /* Array index: 0x1424 */ 0x5653,0x7A46, + /* Array index: 0x1424 */ 0x5668,0x506F, + /* Array index: 0x1424 */ 0x566B,0x7D6D, + /* Array index: 0x1424 */ 0x5674,0x5D44, + /* Array index: 0x1424 */ 0x5686,0x7C77, + /* Array index: 0x1424 */ 0x56A5,0x663F, + /* Array index: 0x1424 */ 0x56AC,0x5E2D, + /* Array index: 0x1424 */ 0x56AE,0x7A3F, + /* Array index: 0x1424 */ 0x56B4,0x6571, + /* Array index: 0x1424 */ 0x56BC,0x6D44, + /* Array index: 0x1424 */ 0x56CA,0x5225, + /* Array index: 0x1424 */ 0x56CD,0x7D6E, + /* Array index: 0x1424 */ 0x56D1,0x7536, + /* Array index: 0x1424 */ 0x56DA,0x6176, + /* Array index: 0x1424 */ 0x56DB,0x5E4C, + /* Array index: 0x1424 */ 0x56DE,0x7C5E, + /* Array index: 0x1424 */ 0x56E0,0x6C57, + /* Array index: 0x1424 */ 0x56F0,0x4D5D, + /* Array index: 0x1424 */ 0x56F9,0x5637, + /* Array index: 0x1424 */ 0x56FA,0x4D33, + /* Array index: 0x1424 */ 0x5703,0x7855, + /* Array index: 0x1424 */ 0x5704,0x6558, + /* Array index: 0x1424 */ 0x5708,0x4F6A, + /* Array index: 0x1424 */ 0x570B,0x4F50, + /* Array index: 0x1424 */ 0x570D,0x6A4C, + /* Array index: 0x1424 */ 0x5712,0x6A2E, + /* Array index: 0x1424 */ 0x5713,0x6A2D, + /* Array index: 0x1424 */ 0x5716,0x5371, + /* Array index: 0x1424 */ 0x5718,0x5325, + /* Array index: 0x1424 */ 0x571F,0x774F, + /* Array index: 0x1424 */ 0x5728,0x6E24, + /* Array index: 0x1424 */ 0x572D,0x5024, + /* Array index: 0x1424 */ 0x5730,0x7222, + /* Array index: 0x1424 */ 0x573B,0x5070, + /* Array index: 0x1424 */ 0x5740,0x7223, + /* Array index: 0x1424 */ 0x5742,0x7778, + /* Array index: 0x1424 */ 0x5747,0x5033, + /* Array index: 0x1424 */ 0x574A,0x5B29, + /* Array index: 0x1424 */ 0x5761,0x7767, + /* Array index: 0x1424 */ 0x5764,0x4D5E, + /* Array index: 0x1424 */ 0x5766,0x7724, + /* Array index: 0x1424 */ 0x576A,0x7840, + /* Array index: 0x1424 */ 0x576E,0x535D, + /* Array index: 0x1424 */ 0x5770,0x4C50, + /* Array index: 0x1424 */ 0x5775,0x4F26, + /* Array index: 0x1424 */ 0x577C,0x7673, + /* Array index: 0x1424 */ 0x5782,0x6177, + /* Array index: 0x1424 */ 0x5788,0x535C, + /* Array index: 0x1424 */ 0x578B,0x7A7E, + /* Array index: 0x1424 */ 0x5793,0x7A27, + /* Array index: 0x1424 */ 0x57A0,0x6B59, + /* Array index: 0x1424 */ 0x57A2,0x4F27, + /* Array index: 0x1424 */ 0x57A3,0x6A2F, + /* Array index: 0x1424 */ 0x57C3,0x646F, + /* Array index: 0x1424 */ 0x57C7,0x6939, + /* Array index: 0x1424 */ 0x57C8,0x7158, + /* Array index: 0x1424 */ 0x57CB,0x5858, + /* Array index: 0x1424 */ 0x57CE,0x6072, + /* Array index: 0x1424 */ 0x57DF,0x6634, + /* Array index: 0x1424 */ 0x57E0,0x5C7C, + /* Array index: 0x1424 */ 0x57F0,0x7371, + /* Array index: 0x1424 */ 0x57F4,0x6350, + /* Array index: 0x1424 */ 0x57F7,0x727B, + /* Array index: 0x1424 */ 0x57F9,0x5B46, + /* Array index: 0x1424 */ 0x57FA,0x5071, + /* Array index: 0x1424 */ 0x57FC,0x5072, + /* Array index: 0x1424 */ 0x5800,0x4F5C, + /* Array index: 0x1424 */ 0x5802,0x5351, + /* Array index: 0x1424 */ 0x581E,0x745C, + /* Array index: 0x1424 */ 0x5821,0x5C42, + /* Array index: 0x1424 */ 0x5824,0x7027, + /* Array index: 0x1424 */ 0x5827,0x6640, + /* Array index: 0x1424 */ 0x582A,0x4A6D, + /* Array index: 0x1424 */ 0x583A,0x4C77, + /* Array index: 0x1424 */ 0x584A,0x4E54, + /* Array index: 0x1424 */ 0x584B,0x672B, + /* Array index: 0x1424 */ 0x584F,0x4B43, + /* Array index: 0x1424 */ 0x5851,0x6131, + /* Array index: 0x1424 */ 0x5854,0x7732, + /* Array index: 0x1424 */ 0x5857,0x5373, + /* Array index: 0x1424 */ 0x5858,0x5352, + /* Array index: 0x1424 */ 0x585A,0x7540, + /* Array index: 0x1424 */ 0x585E,0x5F5D, + /* Array index: 0x1424 */ 0x5861,0x6E73, + /* Array index: 0x1424 */ 0x5862,0x6771, + /* Array index: 0x1424 */ 0x5864,0x7D34, + /* Array index: 0x1424 */ 0x5875,0x7248, + /* Array index: 0x1424 */ 0x5879,0x7352, + /* Array index: 0x1424 */ 0x587C,0x6E74, + /* Array index: 0x1424 */ 0x587E,0x6253, + /* Array index: 0x1424 */ 0x5883,0x4C51, + /* Array index: 0x1424 */ 0x5885,0x5F6A, + /* Array index: 0x1424 */ 0x5889,0x693A, + /* Array index: 0x1424 */ 0x5893,0x5957, + /* Array index: 0x1424 */ 0x589C,0x754D, + /* Array index: 0x1424 */ 0x589E,0x7172, + /* Array index: 0x1424 */ 0x589F,0x7A47, + /* Array index: 0x1424 */ 0x58A8,0x5978, + /* Array index: 0x1424 */ 0x58A9,0x5442, + /* Array index: 0x1424 */ 0x58AE,0x7665, + /* Array index: 0x1424 */ 0x58B3,0x5D45, + /* Array index: 0x1424 */ 0x58BA,0x6772, + /* Array index: 0x1424 */ 0x58BB,0x6D5F, + /* Array index: 0x1424 */ 0x58BE,0x4A4B, + /* Array index: 0x1424 */ 0x58C1,0x5B7A, + /* Array index: 0x1424 */ 0x58C5,0x6835, + /* Array index: 0x1424 */ 0x58C7,0x5326, + /* Array index: 0x1424 */ 0x58CE,0x7D35, + /* Array index: 0x1424 */ 0x58D1,0x7949, + /* Array index: 0x1424 */ 0x58D3,0x6462, + /* Array index: 0x1424 */ 0x58D5,0x7B3D, + /* Array index: 0x1424 */ 0x58D8,0x5724, + /* Array index: 0x1424 */ 0x58D9,0x4E45, + /* Array index: 0x1424 */ 0x58DE,0x4E55, + /* Array index: 0x1424 */ 0x58DF,0x5666, + /* Array index: 0x1424 */ 0x58E4,0x653D, + /* Array index: 0x1424 */ 0x58EB,0x5E4D, + /* Array index: 0x1424 */ 0x58EC,0x6C73, + /* Array index: 0x1424 */ 0x58EF,0x6D60, + /* Array index: 0x1424 */ 0x590F,0x793E, + /* Array index: 0x1424 */ 0x5922,0x5953, + /* Array index: 0x1424 */ 0x5931,0x6377, + /* Array index: 0x1424 */ 0x5937,0x6C28, + /* Array index: 0x1424 */ 0x593E,0x7A71, + /* Array index: 0x1424 */ 0x5944,0x6572, + /* Array index: 0x1424 */ 0x595A,0x7A28, + /* Array index: 0x1424 */ 0x5960,0x6E75, + /* Array index: 0x1424 */ 0x5962,0x5E4E, + /* Array index: 0x1424 */ 0x5967,0x6773, + /* Array index: 0x1424 */ 0x5973,0x5233, + /* Array index: 0x1424 */ 0x5974,0x523F, + /* Array index: 0x1424 */ 0x5978,0x4A4C, + /* Array index: 0x1424 */ 0x597D,0x7B3F, + /* Array index: 0x1424 */ 0x598A,0x6C74, + /* Array index: 0x1424 */ 0x5993,0x5075, + /* Array index: 0x1424 */ 0x5996,0x686D, + /* Array index: 0x1424 */ 0x5997,0x5052, + /* Array index: 0x1424 */ 0x5999,0x5958, + /* Array index: 0x1424 */ 0x59A5,0x7666, + /* Array index: 0x1424 */ 0x59A8,0x5B2A, + /* Array index: 0x1424 */ 0x59AC,0x7760, + /* Array index: 0x1424 */ 0x59B9,0x5859, + /* Array index: 0x1424 */ 0x59BB,0x7423, + /* Array index: 0x1424 */ 0x59BE,0x745D, + /* Array index: 0x1424 */ 0x59C3,0x6F51, + /* Array index: 0x1424 */ 0x59C6,0x5935, + /* Array index: 0x1424 */ 0x59C9,0x6D2B, + /* Array index: 0x1424 */ 0x59CB,0x6337, + /* Array index: 0x1424 */ 0x59E6,0x4A4D, + /* Array index: 0x1424 */ 0x59E8,0x6C29, + /* Array index: 0x1424 */ 0x59EA,0x726B, + /* Array index: 0x1424 */ 0x59EC,0x7D6F, + /* Array index: 0x1424 */ 0x59EE,0x7973, + /* Array index: 0x1424 */ 0x59F8,0x6641, + /* Array index: 0x1424 */ 0x59FB,0x6C58, + /* Array index: 0x1424 */ 0x59FF,0x6D2C, + /* Array index: 0x1424 */ 0x5A01,0x6A4E, + /* Array index: 0x1424 */ 0x5A03,0x685F, + /* Array index: 0x1424 */ 0x5A11,0x5E4F, + /* Array index: 0x1424 */ 0x5A18,0x5226, + /* Array index: 0x1424 */ 0x5A1B,0x6774, + /* Array index: 0x1424 */ 0x5A1C,0x5156, + /* Array index: 0x1424 */ 0x5A1F,0x6642, + /* Array index: 0x1424 */ 0x5A20,0x6363, + /* Array index: 0x1424 */ 0x5A25,0x6430, + /* Array index: 0x1424 */ 0x5A29,0x5834, + /* Array index: 0x1424 */ 0x5A36,0x7625, + /* Array index: 0x1424 */ 0x5A3C,0x735E, + /* Array index: 0x1424 */ 0x5A41,0x5725, + /* Array index: 0x1424 */ 0x5A46,0x7768, + /* Array index: 0x1424 */ 0x5A49,0x6846, + /* Array index: 0x1424 */ 0x5A5A,0x7B66, + /* Array index: 0x1424 */ 0x5A62,0x5D66, + /* Array index: 0x1424 */ 0x5A66,0x5C7E, + /* Array index: 0x1424 */ 0x5A92,0x585A, + /* Array index: 0x1424 */ 0x5A9A,0x5A2C, + /* Array index: 0x1424 */ 0x5A9B,0x6A30, + /* Array index: 0x1424 */ 0x5AA4,0x6338, + /* Array index: 0x1424 */ 0x5AC1,0x4A2A, + /* Array index: 0x1424 */ 0x5AC2,0x6179, + /* Array index: 0x1424 */ 0x5AC4,0x6A31, + /* Array index: 0x1424 */ 0x5AC9,0x726C, + /* Array index: 0x1424 */ 0x5ACC,0x7A6E, + /* Array index: 0x1424 */ 0x5AE1,0x6E55, + /* Array index: 0x1424 */ 0x5AE6,0x7974, + /* Array index: 0x1424 */ 0x5AE9,0x526C, + /* Array index: 0x1424 */ 0x5B05,0x7B7B, + /* Array index: 0x1424 */ 0x5B09,0x7D70, + /* Array index: 0x1424 */ 0x5B0B,0x603D, + /* Array index: 0x1424 */ 0x5B0C,0x4E63, + /* Array index: 0x1424 */ 0x5B16,0x7846, + /* Array index: 0x1424 */ 0x5B2A,0x5E2E, + /* Array index: 0x1424 */ 0x5B40,0x5F45, + /* Array index: 0x1424 */ 0x5B43,0x653E, + /* Array index: 0x1424 */ 0x5B50,0x6D2D, + /* Array index: 0x1424 */ 0x5B51,0x7A6A, + /* Array index: 0x1424 */ 0x5B63,0x4C79, + /* Array index: 0x1424 */ 0x5B64,0x4D35, + /* Array index: 0x1424 */ 0x5B69,0x7A29, + /* Array index: 0x1424 */ 0x5B6B,0x615D, + /* Array index: 0x1424 */ 0x5B70,0x6255, + /* Array index: 0x1424 */ 0x5B71,0x6D4F, + /* Array index: 0x1424 */ 0x5B75,0x5D22, + /* Array index: 0x1424 */ 0x5B78,0x794A, + /* Array index: 0x1424 */ 0x5B7A,0x6A68, + /* Array index: 0x1424 */ 0x5B7C,0x656D, + /* Array index: 0x1424 */ 0x5B8F,0x4E5B, + /* Array index: 0x1424 */ 0x5BAC,0x6074, + /* Array index: 0x1424 */ 0x5BAE,0x4F60, + /* Array index: 0x1424 */ 0x5BB0,0x6E25, + /* Array index: 0x1424 */ 0x5BCC,0x5D23, + /* Array index: 0x1424 */ 0x5BD7,0x523C, + /* Array index: 0x1424 */ 0x5BF5,0x7541, + /* Array index: 0x1424 */ 0x5BF6,0x5C44, + /* Array index: 0x1424 */ 0x5BF8,0x753B, + /* Array index: 0x1424 */ 0x5BFA,0x5E51, + /* Array index: 0x1424 */ 0x5C01,0x5C66, + /* Array index: 0x1424 */ 0x5C04,0x5E52, + /* Array index: 0x1424 */ 0x5C16,0x7453, + /* Array index: 0x1424 */ 0x5C19,0x5F46, + /* Array index: 0x1424 */ 0x5C24,0x6956, + /* Array index: 0x1424 */ 0x5C28,0x5B2B, + /* Array index: 0x1424 */ 0x5C31,0x7626, + /* Array index: 0x1424 */ 0x5C45,0x4B5C, + /* Array index: 0x1424 */ 0x5C46,0x4C7A, + /* Array index: 0x1424 */ 0x5C48,0x4F5D, + /* Array index: 0x1424 */ 0x5C4B,0x6829, + /* Array index: 0x1424 */ 0x5C4D,0x633B, + /* Array index: 0x1424 */ 0x5C4E,0x633A, + /* Array index: 0x1424 */ 0x5C51,0x605A, + /* Array index: 0x1424 */ 0x5C55,0x6E77, + /* Array index: 0x1424 */ 0x5C5B,0x5C33, + /* Array index: 0x1424 */ 0x5C60,0x5375, + /* Array index: 0x1424 */ 0x5C62,0x5726, + /* Array index: 0x1424 */ 0x5C64,0x7635, + /* Array index: 0x1424 */ 0x5C65,0x575B, + /* Array index: 0x1424 */ 0x5C6C,0x6155, + /* Array index: 0x1424 */ 0x5C6F,0x546A, + /* Array index: 0x1424 */ 0x5C71,0x5F23, + /* Array index: 0x1424 */ 0x5C79,0x7D5F, + /* Array index: 0x1424 */ 0x5C90,0x5077, + /* Array index: 0x1424 */ 0x5C91,0x6D54, + /* Array index: 0x1424 */ 0x5CA1,0x4B2A, + /* Array index: 0x1424 */ 0x5CA9,0x645B, + /* Array index: 0x1424 */ 0x5CAB,0x617B, + /* Array index: 0x1424 */ 0x5CAC,0x4B22, + /* Array index: 0x1424 */ 0x5CB1,0x5360, + /* Array index: 0x1424 */ 0x5CB3,0x643F, + /* Array index: 0x1424 */ 0x5CB5,0x7B40, + /* Array index: 0x1424 */ 0x5CB7,0x5A3E, + /* Array index: 0x1424 */ 0x5CB8,0x644D, + /* Array index: 0x1424 */ 0x5CBA,0x5639, + /* Array index: 0x1424 */ 0x5CBE,0x6F40, + /* Array index: 0x1424 */ 0x5CC0,0x617C, + /* Array index: 0x1424 */ 0x5CD9,0x7639, + /* Array index: 0x1424 */ 0x5CE0,0x5F47, + /* Array index: 0x1424 */ 0x5CE8,0x6431, + /* Array index: 0x1424 */ 0x5CEF,0x5C67, + /* Array index: 0x1424 */ 0x5CF0,0x5C68, + /* Array index: 0x1424 */ 0x5CF4,0x7A56, + /* Array index: 0x1424 */ 0x5CF6,0x5376, + /* Array index: 0x1424 */ 0x5CFB,0x715A, + /* Array index: 0x1424 */ 0x5CFD,0x7A72, + /* Array index: 0x1424 */ 0x5D07,0x627D, + /* Array index: 0x1424 */ 0x5D0D,0x554F, + /* Array index: 0x1424 */ 0x5D0E,0x5078, + /* Array index: 0x1424 */ 0x5D11,0x4D5F, + /* Array index: 0x1424 */ 0x5D14,0x754B, + /* Array index: 0x1424 */ 0x5D16,0x6470, + /* Array index: 0x1424 */ 0x5D17,0x4B2B, + /* Array index: 0x1424 */ 0x5D19,0x5744, + /* Array index: 0x1424 */ 0x5D27,0x627E, + /* Array index: 0x1424 */ 0x5D29,0x5D5A, + /* Array index: 0x1424 */ 0x5D4B,0x5A2E, + /* Array index: 0x1424 */ 0x5D4C,0x4A6E, + /* Array index: 0x1424 */ 0x5D50,0x5539, + /* Array index: 0x1424 */ 0x5D69,0x6321, + /* Array index: 0x1424 */ 0x5D6C,0x6863, + /* Array index: 0x1424 */ 0x5D6F,0x732B, + /* Array index: 0x1424 */ 0x5D87,0x4F29, + /* Array index: 0x1424 */ 0x5D8B,0x5377, + /* Array index: 0x1424 */ 0x5D9D,0x5471, + /* Array index: 0x1424 */ 0x5DA0,0x4E64, + /* Array index: 0x1424 */ 0x5DA2,0x6872, + /* Array index: 0x1424 */ 0x5DAA,0x6575, + /* Array index: 0x1424 */ 0x5DB8,0x672E, + /* Array index: 0x1424 */ 0x5DBA,0x563A, + /* Array index: 0x1424 */ 0x5DBC,0x5F6C, + /* Array index: 0x1424 */ 0x5DBD,0x6440, + /* Array index: 0x1424 */ 0x5DCD,0x6864, + /* Array index: 0x1424 */ 0x5DD2,0x5835, + /* Array index: 0x1424 */ 0x5DD6,0x645C, + /* Array index: 0x1424 */ 0x5DDD,0x7439, + /* Array index: 0x1424 */ 0x5DDE,0x7136, + /* Array index: 0x1424 */ 0x5DEB,0x5963, + /* Array index: 0x1424 */ 0x5DEE,0x732C, + /* Array index: 0x1424 */ 0x5DF7,0x7975, + /* Array index: 0x1424 */ 0x5DFD,0x615E, + /* Array index: 0x1424 */ 0x5DFE,0x4B6E, + /* Array index: 0x1424 */ 0x5E02,0x633C, + /* Array index: 0x1424 */ 0x5E03,0x7856, + /* Array index: 0x1424 */ 0x5E06,0x5B6E, + /* Array index: 0x1424 */ 0x5E0C,0x7D71, + /* Array index: 0x1424 */ 0x5E11,0x7736, + /* Array index: 0x1424 */ 0x5E16,0x745E, + /* Array index: 0x1424 */ 0x5E19,0x726D, + /* Array index: 0x1424 */ 0x5E1B,0x5B59, + /* Array index: 0x1424 */ 0x5E1D,0x7028, + /* Array index: 0x1424 */ 0x5E25,0x617D, + /* Array index: 0x1424 */ 0x5E2B,0x5E54, + /* Array index: 0x1424 */ 0x5E2D,0x602C, + /* Array index: 0x1424 */ 0x5E33,0x6D63, + /* Array index: 0x1424 */ 0x5E36,0x5361, + /* Array index: 0x1424 */ 0x5E38,0x5F48, + /* Array index: 0x1424 */ 0x5E3D,0x5936, + /* Array index: 0x1424 */ 0x5E3F,0x7D2C, + /* Array index: 0x1424 */ 0x5E40,0x6F53, + /* Array index: 0x1424 */ 0x5E44,0x6441, + /* Array index: 0x1424 */ 0x5E45,0x786B, + /* Array index: 0x1424 */ 0x5E47,0x5B2C, + /* Array index: 0x1424 */ 0x5E4C,0x7C46, + /* Array index: 0x1424 */ 0x5E55,0x582D, + /* Array index: 0x1424 */ 0x5E84,0x6D64, + /* Array index: 0x1424 */ 0x5E87,0x5D67, + /* Array index: 0x1424 */ 0x5E8A,0x5F49, + /* Array index: 0x1424 */ 0x5E8F,0x5F6D, + /* Array index: 0x1424 */ 0x5E95,0x6E3C, + /* Array index: 0x1424 */ 0x5E97,0x6F41, + /* Array index: 0x1424 */ 0x5E9A,0x4C52, + /* Array index: 0x1424 */ 0x5E9C,0x5D24, + /* Array index: 0x1424 */ 0x5EA0,0x5F4A, + /* Array index: 0x1424 */ 0x5EA6,0x5378, + /* Array index: 0x1424 */ 0x5EA7,0x7128, + /* Array index: 0x1424 */ 0x5EAB,0x4D37, + /* Array index: 0x1424 */ 0x5EAD,0x6F54, + /* Array index: 0x1424 */ 0x5EBE,0x6A6C, + /* Array index: 0x1424 */ 0x5EC2,0x5F4B, + /* Array index: 0x1424 */ 0x5ED0,0x4F2A, + /* Array index: 0x1424 */ 0x5ED3,0x4E29, + /* Array index: 0x1424 */ 0x5ED6,0x5678, + /* Array index: 0x1424 */ 0x5EDA,0x7137, + /* Array index: 0x1424 */ 0x5EDB,0x6E78, + /* Array index: 0x1424 */ 0x5EEC,0x5566, + /* Array index: 0x1424 */ 0x5EF3,0x7466, + /* Array index: 0x1424 */ 0x5EF6,0x6645, + /* Array index: 0x1424 */ 0x5EF7,0x6F55, + /* Array index: 0x1424 */ 0x5EFA,0x4B6F, + /* Array index: 0x1424 */ 0x5EFB,0x7C5F, + /* Array index: 0x1424 */ 0x5F01,0x5C27, + /* Array index: 0x1424 */ 0x5F04,0x5667, + /* Array index: 0x1424 */ 0x5F0A,0x7849, + /* Array index: 0x1424 */ 0x5F0F,0x6352, + /* Array index: 0x1424 */ 0x5F1B,0x6C2C, + /* Array index: 0x1424 */ 0x5F1F,0x7029, + /* Array index: 0x1424 */ 0x5F26,0x7A57, + /* Array index: 0x1424 */ 0x5F27,0x7B41, + /* Array index: 0x1424 */ 0x5F29,0x5240, + /* Array index: 0x1424 */ 0x5F31,0x6530, + /* Array index: 0x1424 */ 0x5F35,0x6D65, + /* Array index: 0x1424 */ 0x5F3A,0x4B2D, + /* Array index: 0x1424 */ 0x5F3C,0x7930, + /* Array index: 0x1424 */ 0x5F48,0x7725, + /* Array index: 0x1424 */ 0x5F4A,0x4B2E, + /* Array index: 0x1424 */ 0x5F4C,0x5A2F, + /* Array index: 0x1424 */ 0x5F4E,0x5836, + /* Array index: 0x1424 */ 0x5F56,0x5327, + /* Array index: 0x1424 */ 0x5F57,0x7B32, + /* Array index: 0x1424 */ 0x5F59,0x7D44, + /* Array index: 0x1424 */ 0x5F5B,0x6C2D, + /* Array index: 0x1424 */ 0x5F62,0x7B21, + /* Array index: 0x1424 */ 0x5F77,0x5B2D, + /* Array index: 0x1424 */ 0x5F79,0x6635, + /* Array index: 0x1424 */ 0x5F7C,0x7928, + /* Array index: 0x1424 */ 0x5F85,0x5362, + /* Array index: 0x1424 */ 0x5F87,0x625F, + /* Array index: 0x1424 */ 0x5F9E,0x7074, + /* Array index: 0x1424 */ 0x5FA0,0x5550, + /* Array index: 0x1424 */ 0x5FA1,0x6559, + /* Array index: 0x1424 */ 0x5FAE,0x5A30, + /* Array index: 0x1424 */ 0x5FB5,0x7323, + /* Array index: 0x1424 */ 0x5FB7,0x536C, + /* Array index: 0x1424 */ 0x5FB9,0x744B, + /* Array index: 0x1424 */ 0x5FBD,0x7D45, + /* Array index: 0x1424 */ 0x5FC3,0x637D, + /* Array index: 0x1424 */ 0x5FC5,0x7931, + /* Array index: 0x1424 */ 0x5FCC,0x507B, + /* Array index: 0x1424 */ 0x5FCD,0x6C5B, + /* Array index: 0x1424 */ 0x5FE0,0x7577, + /* Array index: 0x1424 */ 0x5FEB,0x7661, + /* Array index: 0x1424 */ 0x5FF5,0x5237, + /* Array index: 0x1424 */ 0x5FFD,0x7B6C, + /* Array index: 0x1424 */ 0x5FFF,0x5D48, + /* Array index: 0x1424 */ 0x600F,0x6468, + /* Array index: 0x1424 */ 0x6012,0x5241, + /* Array index: 0x1424 */ 0x6016,0x7857, + /* Array index: 0x1424 */ 0x601C,0x563B, + /* Array index: 0x1424 */ 0x601D,0x5E56, + /* Array index: 0x1424 */ 0x6020,0x773D, + /* Array index: 0x1424 */ 0x6021,0x6C2E, + /* Array index: 0x1424 */ 0x6025,0x5061, + /* Array index: 0x1424 */ 0x6027,0x6075, + /* Array index: 0x1424 */ 0x6028,0x6A33, + /* Array index: 0x1424 */ 0x602A,0x4E56, + /* Array index: 0x1424 */ 0x602F,0x4C25, + /* Array index: 0x1424 */ 0x604D,0x7C48, + /* Array index: 0x1424 */ 0x6050,0x4D70, + /* Array index: 0x1424 */ 0x6052,0x7976, + /* Array index: 0x1424 */ 0x6055,0x5F70, + /* Array index: 0x1424 */ 0x6059,0x653F, + /* Array index: 0x1424 */ 0x605D,0x4E3F, + /* Array index: 0x1424 */ 0x6085,0x666D, + /* Array index: 0x1424 */ 0x6089,0x637A, + /* Array index: 0x1424 */ 0x608C,0x702A, + /* Array index: 0x1424 */ 0x608D,0x7950, + /* Array index: 0x1424 */ 0x6094,0x7C62, + /* Array index: 0x1424 */ 0x6096,0x7827, + /* Array index: 0x1424 */ 0x609A,0x6165, + /* Array index: 0x1424 */ 0x609B,0x6E79, + /* Array index: 0x1424 */ 0x609F,0x6776, + /* Array index: 0x1424 */ 0x60A0,0x6A6D, + /* Array index: 0x1424 */ 0x60A3,0x7C34, + /* Array index: 0x1424 */ 0x60A4,0x7542, + /* Array index: 0x1424 */ 0x60A7,0x575C, + /* Array index: 0x1424 */ 0x60BC,0x537A, + /* Array index: 0x1424 */ 0x60BD,0x7424, + /* Array index: 0x1424 */ 0x60C5,0x6F57, + /* Array index: 0x1424 */ 0x60C7,0x5443, + /* Array index: 0x1424 */ 0x60D1,0x7B63, + /* Array index: 0x1424 */ 0x60DA,0x7B6D, + /* Array index: 0x1424 */ 0x60DC,0x602D, + /* Array index: 0x1424 */ 0x60F0,0x7667, + /* Array index: 0x1424 */ 0x60F1,0x525D, + /* Array index: 0x1424 */ 0x60F3,0x5F4C, + /* Array index: 0x1424 */ 0x60F6,0x7C49, + /* Array index: 0x1424 */ 0x6101,0x617E, + /* Array index: 0x1424 */ 0x6106,0x4B70, + /* Array index: 0x1424 */ 0x6108,0x6A6F, + /* Array index: 0x1424 */ 0x6109,0x6A70, + /* Array index: 0x1424 */ 0x6115,0x6443, + /* Array index: 0x1424 */ 0x611A,0x6957, + /* Array index: 0x1424 */ 0x611B,0x6471, + /* Array index: 0x1424 */ 0x611F,0x4A6F, + /* Array index: 0x1424 */ 0x6127,0x4E57, + /* Array index: 0x1424 */ 0x6130,0x7C4A, + /* Array index: 0x1424 */ 0x6134,0x7361, + /* Array index: 0x1424 */ 0x6137,0x4B44, + /* Array index: 0x1424 */ 0x613C,0x6365, + /* Array index: 0x1424 */ 0x613E,0x4B45, + /* Array index: 0x1424 */ 0x613F,0x6A34, + /* Array index: 0x1424 */ 0x6142,0x693D, + /* Array index: 0x1424 */ 0x6144,0x5749, + /* Array index: 0x1424 */ 0x6153,0x7874, + /* Array index: 0x1424 */ 0x6155,0x5937, + /* Array index: 0x1424 */ 0x6158,0x7353, + /* Array index: 0x1424 */ 0x6159,0x7354, + /* Array index: 0x1424 */ 0x615D,0x7764, + /* Array index: 0x1424 */ 0x615F,0x7751, + /* Array index: 0x1424 */ 0x616B,0x7076, + /* Array index: 0x1424 */ 0x616E,0x5567, + /* Array index: 0x1424 */ 0x6170,0x6A50, + /* Array index: 0x1424 */ 0x6176,0x4C54, + /* Array index: 0x1424 */ 0x6177,0x4B2F, + /* Array index: 0x1424 */ 0x617D,0x742A, + /* Array index: 0x1424 */ 0x617E,0x692F, + /* Array index: 0x1424 */ 0x6181,0x7543, + /* Array index: 0x1424 */ 0x6182,0x6958, + /* Array index: 0x1424 */ 0x618A,0x5D69, + /* Array index: 0x1424 */ 0x618E,0x7173, + /* Array index: 0x1424 */ 0x6190,0x557B, + /* Array index: 0x1424 */ 0x6191,0x5E3B, + /* Array index: 0x1424 */ 0x6194,0x747B, + /* Array index: 0x1424 */ 0x61A4,0x5D49, + /* Array index: 0x1424 */ 0x61A7,0x5453, + /* Array index: 0x1424 */ 0x61A9,0x4C28, + /* Array index: 0x1424 */ 0x61AB,0x5A41, + /* Array index: 0x1424 */ 0x61AC,0x4C55, + /* Array index: 0x1424 */ 0x61AE,0x5964, + /* Array index: 0x1424 */ 0x61B2,0x7A4A, + /* Array index: 0x1424 */ 0x61B6,0x6563, + /* Array index: 0x1424 */ 0x61BA,0x533C, + /* Array index: 0x1424 */ 0x61BE,0x4A70, + /* Array index: 0x1424 */ 0x61C3,0x5044, + /* Array index: 0x1424 */ 0x61E6,0x5157, + /* Array index: 0x1424 */ 0x61F2,0x7324, + /* Array index: 0x1424 */ 0x6207,0x5354, + /* Array index: 0x1424 */ 0x6208,0x4D7C, + /* Array index: 0x1424 */ 0x6216,0x7B64, + /* Array index: 0x1424 */ 0x621A,0x742B, + /* Array index: 0x1424 */ 0x621F,0x503D, + /* Array index: 0x1424 */ 0x6221,0x4A71, + /* Array index: 0x1424 */ 0x622A,0x6F38, + /* Array index: 0x1424 */ 0x622E,0x5740, + /* Array index: 0x1424 */ 0x6230,0x6E7A, + /* Array index: 0x1424 */ 0x6231,0x7D74, + /* Array index: 0x1424 */ 0x6234,0x5363, + /* Array index: 0x1424 */ 0x6236,0x7B42, + /* Array index: 0x1424 */ 0x6253,0x7668, + /* Array index: 0x1424 */ 0x6258,0x7675, + /* Array index: 0x1424 */ 0x626E,0x5D4A, + /* Array index: 0x1424 */ 0x6271,0x5062, + /* Array index: 0x1424 */ 0x6276,0x5D26, + /* Array index: 0x1424 */ 0x6279,0x5D6B, + /* Array index: 0x1424 */ 0x627C,0x6479, + /* Array index: 0x1424 */ 0x627F,0x632F, + /* Array index: 0x1424 */ 0x6280,0x507C, + /* Array index: 0x1424 */ 0x6284,0x747C, + /* Array index: 0x1424 */ 0x6289,0x4C3C, + /* Array index: 0x1424 */ 0x628A,0x776A, + /* Array index: 0x1424 */ 0x6291,0x6564, + /* Array index: 0x1424 */ 0x6292,0x5F71, + /* Array index: 0x1424 */ 0x6295,0x7761, + /* Array index: 0x1424 */ 0x6297,0x7977, + /* Array index: 0x1424 */ 0x6298,0x6F39, + /* Array index: 0x1424 */ 0x629B,0x7858, + /* Array index: 0x1424 */ 0x62AB,0x7929, + /* Array index: 0x1424 */ 0x62B1,0x7859, + /* Array index: 0x1424 */ 0x62B5,0x6E3D, + /* Array index: 0x1424 */ 0x62B9,0x5846, + /* Array index: 0x1424 */ 0x62BC,0x6463, + /* Array index: 0x1424 */ 0x62BD,0x754E, + /* Array index: 0x1424 */ 0x62C2,0x5D59, + /* Array index: 0x1424 */ 0x62F7,0x4D38, + /* Array index: 0x1424 */ 0x62FE,0x6326, + /* Array index: 0x1424 */ 0x62FF,0x515A, + /* Array index: 0x1424 */ 0x6301,0x7225, + /* Array index: 0x1424 */ 0x6307,0x7226, + /* Array index: 0x1424 */ 0x6309,0x644E, + /* Array index: 0x1424 */ 0x6311,0x537B, + /* Array index: 0x1424 */ 0x632B,0x7129, + /* Array index: 0x1424 */ 0x632F,0x7249, + /* Array index: 0x1424 */ 0x6349,0x7335, + /* Array index: 0x1424 */ 0x634C,0x7824, + /* Array index: 0x1424 */ 0x634F,0x5173, + /* Array index: 0x1424 */ 0x6350,0x6648, + /* Array index: 0x1424 */ 0x6355,0x785A, + /* Array index: 0x1424 */ 0x6367,0x5C69, + /* Array index: 0x1424 */ 0x6368,0x5E57, + /* Array index: 0x1424 */ 0x636E,0x4B5F, + /* Array index: 0x1424 */ 0x6372,0x4F6C, + /* Array index: 0x1424 */ 0x6377,0x745F, + /* Array index: 0x1424 */ 0x637A,0x5174, + /* Array index: 0x1424 */ 0x637B,0x523A, + /* Array index: 0x1424 */ 0x637F,0x5F72, + /* Array index: 0x1424 */ 0x6383,0x6137, + /* Array index: 0x1424 */ 0x6388,0x6223, + /* Array index: 0x1424 */ 0x6389,0x537C, + /* Array index: 0x1424 */ 0x638C,0x6D66, + /* Array index: 0x1424 */ 0x6392,0x5B49, + /* Array index: 0x1424 */ 0x6396,0x647A, + /* Array index: 0x1424 */ 0x6398,0x4F5E, + /* Array index: 0x1424 */ 0x639B,0x4E50, + /* Array index: 0x1424 */ 0x63C0,0x4A51, + /* Array index: 0x1424 */ 0x63C4,0x6A71, + /* Array index: 0x1424 */ 0x63C6,0x5026, + /* Array index: 0x1424 */ 0x63CF,0x595A, + /* Array index: 0x1424 */ 0x63D0,0x702B, + /* Array index: 0x1424 */ 0x63D6,0x6B67, + /* Array index: 0x1424 */ 0x63DA,0x6540, + /* Array index: 0x1424 */ 0x63DB,0x7C35, + /* Array index: 0x1424 */ 0x63E1,0x6444, + /* Array index: 0x1424 */ 0x63ED,0x4C29, + /* Array index: 0x1424 */ 0x63EE,0x7D46, + /* Array index: 0x1424 */ 0x63F4,0x6A35, + /* Array index: 0x1424 */ 0x63F6,0x652A, + /* Array index: 0x1424 */ 0x63F7,0x5F3A, + /* Array index: 0x1424 */ 0x640D,0x615F, + /* Array index: 0x1424 */ 0x640F,0x5A51, + /* Array index: 0x1424 */ 0x6414,0x6138, + /* Array index: 0x1424 */ 0x6416,0x6874, + /* Array index: 0x1424 */ 0x6417,0x537D, + /* Array index: 0x1424 */ 0x641C,0x6224, + /* Array index: 0x1424 */ 0x6422,0x724A, + /* Array index: 0x1424 */ 0x642C,0x5A66, + /* Array index: 0x1424 */ 0x642D,0x7733, + /* Array index: 0x1424 */ 0x643A,0x7D4D, + /* Array index: 0x1424 */ 0x643E,0x7336, + /* Array index: 0x1424 */ 0x6458,0x6E57, + /* Array index: 0x1424 */ 0x6460,0x7544, + /* Array index: 0x1424 */ 0x6469,0x5824, + /* Array index: 0x1424 */ 0x646F,0x7227, + /* Array index: 0x1424 */ 0x6488,0x564E, + /* Array index: 0x1424 */ 0x649A,0x5235, + /* Array index: 0x1424 */ 0x649E,0x5355, + /* Array index: 0x1424 */ 0x64A4,0x744C, + /* Array index: 0x1424 */ 0x64A5,0x5A7C, + /* Array index: 0x1424 */ 0x64AB,0x5968, + /* Array index: 0x1424 */ 0x64AD,0x776B, + /* Array index: 0x1424 */ 0x64AE,0x7549, + /* Array index: 0x1424 */ 0x64B0,0x733C, + /* Array index: 0x1424 */ 0x64B2,0x5A52, + /* Array index: 0x1424 */ 0x64BB,0x5335, + /* Array index: 0x1424 */ 0x64C1,0x6836, + /* Array index: 0x1424 */ 0x64C4,0x564F, + /* Array index: 0x1424 */ 0x64C5,0x743A, + /* Array index: 0x1424 */ 0x64C7,0x7749, + /* Array index: 0x1424 */ 0x64CA,0x4C2A, + /* Array index: 0x1424 */ 0x64CD,0x7043, + /* Array index: 0x1424 */ 0x64CE,0x4C56, + /* Array index: 0x1424 */ 0x64D2,0x5053, + /* Array index: 0x1424 */ 0x64D4,0x533D, + /* Array index: 0x1424 */ 0x64D8,0x5B7B, + /* Array index: 0x1424 */ 0x64DA,0x4B60, + /* Array index: 0x1424 */ 0x64EC,0x6B74, + /* Array index: 0x1424 */ 0x64F2,0x742D, + /* Array index: 0x1424 */ 0x64F4,0x7C2A, + /* Array index: 0x1424 */ 0x64FA,0x776C, + /* Array index: 0x1424 */ 0x64FE,0x6876, + /* Array index: 0x1424 */ 0x6500,0x5A67, + /* Array index: 0x1424 */ 0x6504,0x774C, + /* Array index: 0x1424 */ 0x6518,0x6541, + /* Array index: 0x1424 */ 0x651D,0x606E, + /* Array index: 0x1424 */ 0x6523,0x557D, + /* Array index: 0x1424 */ 0x652F,0x7228, + /* Array index: 0x1424 */ 0x6545,0x4D3A, + /* Array index: 0x1424 */ 0x6548,0x7C79, + /* Array index: 0x1424 */ 0x6556,0x6779, + /* Array index: 0x1424 */ 0x6557,0x7828, + /* Array index: 0x1424 */ 0x655E,0x7362, + /* Array index: 0x1424 */ 0x6562,0x4A72, + /* Array index: 0x1424 */ 0x6563,0x5F24, + /* Array index: 0x1424 */ 0x6566,0x5444, + /* Array index: 0x1424 */ 0x656C,0x4C57, + /* Array index: 0x1424 */ 0x656D,0x6542, + /* Array index: 0x1424 */ 0x6572,0x4D3B, + /* Array index: 0x1424 */ 0x657E,0x6040, + /* Array index: 0x1424 */ 0x6582,0x5630, + /* Array index: 0x1424 */ 0x6583,0x784A, + /* Array index: 0x1424 */ 0x6585,0x7C7A, + /* Array index: 0x1424 */ 0x6587,0x597E, + /* Array index: 0x1424 */ 0x658C,0x5E30, + /* Array index: 0x1424 */ 0x6590,0x5D6C, + /* Array index: 0x1424 */ 0x6591,0x5A68, + /* Array index: 0x1424 */ 0x6597,0x5460, + /* Array index: 0x1424 */ 0x6599,0x5679, + /* Array index: 0x1424 */ 0x659B,0x4D57, + /* Array index: 0x1424 */ 0x659C,0x5E58, + /* Array index: 0x1424 */ 0x659F,0x7278, + /* Array index: 0x1424 */ 0x65A1,0x6456, + /* Array index: 0x1424 */ 0x65A4,0x5045, + /* Array index: 0x1424 */ 0x65A5,0x742E, + /* Array index: 0x1424 */ 0x65A7,0x5D28, + /* Array index: 0x1424 */ 0x65AB,0x6D45, + /* Array index: 0x1424 */ 0x65AC,0x7356, + /* Array index: 0x1424 */ 0x65AF,0x5E59, + /* Array index: 0x1424 */ 0x65B0,0x6366, + /* Array index: 0x1424 */ 0x65B7,0x5328, + /* Array index: 0x1424 */ 0x65B9,0x5B30, + /* Array index: 0x1424 */ 0x65BC,0x655A, + /* Array index: 0x1424 */ 0x65BD,0x633F, + /* Array index: 0x1424 */ 0x65C1,0x5B31, + /* Array index: 0x1424 */ 0x65C5,0x5569, + /* Array index: 0x1424 */ 0x65CB,0x6041, + /* Array index: 0x1424 */ 0x65CC,0x6F5B, + /* Array index: 0x1424 */ 0x65CF,0x7069, + /* Array index: 0x1424 */ 0x65D2,0x5732, + /* Array index: 0x1424 */ 0x65D7,0x507D, + /* Array index: 0x1424 */ 0x65E0,0x5969, + /* Array index: 0x1424 */ 0x65E3,0x507E, + /* Array index: 0x1424 */ 0x65F1,0x7951, + /* Array index: 0x1424 */ 0x65F4,0x6959, + /* Array index: 0x1424 */ 0x6625,0x7570, + /* Array index: 0x1424 */ 0x6627,0x585C, + /* Array index: 0x1424 */ 0x6628,0x6D46, + /* Array index: 0x1424 */ 0x6634,0x595B, + /* Array index: 0x1424 */ 0x6636,0x7364, + /* Array index: 0x1424 */ 0x663A,0x5C36, + /* Array index: 0x1424 */ 0x663B,0x6469, + /* Array index: 0x1424 */ 0x6649,0x724B, + /* Array index: 0x1424 */ 0x664B,0x724C, + /* Array index: 0x1424 */ 0x664F,0x644F, + /* Array index: 0x1424 */ 0x6659,0x715B, + /* Array index: 0x1424 */ 0x6684,0x7D3E, + /* Array index: 0x1424 */ 0x668E,0x6732, + /* Array index: 0x1424 */ 0x6690,0x6A51, + /* Array index: 0x1424 */ 0x6691,0x5F74, + /* Array index: 0x1424 */ 0x669D,0x5926, + /* Array index: 0x1424 */ 0x66A0,0x4D3C, + /* Array index: 0x1424 */ 0x66A2,0x7365, + /* Array index: 0x1424 */ 0x66AB,0x6D55, + /* Array index: 0x1424 */ 0x66AE,0x593A, + /* Array index: 0x1424 */ 0x66B9,0x6067, + /* Array index: 0x1424 */ 0x66BB,0x4C59, + /* Array index: 0x1424 */ 0x66BE,0x5446, + /* Array index: 0x1424 */ 0x66C4,0x6725, + /* Array index: 0x1424 */ 0x66C6,0x5575, + /* Array index: 0x1424 */ 0x66C7,0x533E, + /* Array index: 0x1424 */ 0x66C9,0x7C7B, + /* Array index: 0x1424 */ 0x66D6,0x6472, + /* Array index: 0x1424 */ 0x66D9,0x5F75, + /* Array index: 0x1424 */ 0x66DC,0x6878, + /* Array index: 0x1424 */ 0x66DD,0x786D, + /* Array index: 0x1424 */ 0x66E0,0x4E47, + /* Array index: 0x1424 */ 0x66E6,0x7D76, + /* Array index: 0x1424 */ 0x6703,0x7C65, + /* Array index: 0x1424 */ 0x6708,0x6A45, + /* Array index: 0x1424 */ 0x6709,0x6A73, + /* Array index: 0x1424 */ 0x670B,0x5D5B, + /* Array index: 0x1424 */ 0x670D,0x5C57, + /* Array index: 0x1424 */ 0x6714,0x5E7D, + /* Array index: 0x1424 */ 0x6715,0x7279, + /* Array index: 0x1424 */ 0x6717,0x5547, + /* Array index: 0x1424 */ 0x6731,0x7139, + /* Array index: 0x1424 */ 0x6734,0x5A53, + /* Array index: 0x1424 */ 0x6736,0x766A, + /* Array index: 0x1424 */ 0x673A,0x4F75, + /* Array index: 0x1424 */ 0x673D,0x7D2E, + /* Array index: 0x1424 */ 0x6746,0x4A52, + /* Array index: 0x1424 */ 0x6749,0x5F34, + /* Array index: 0x1424 */ 0x6756,0x6D68, + /* Array index: 0x1424 */ 0x675C,0x5461, + /* Array index: 0x1424 */ 0x675E,0x5123, + /* Array index: 0x1424 */ 0x675F,0x6156, + /* Array index: 0x1424 */ 0x677B,0x526E, + /* Array index: 0x1424 */ 0x677E,0x6166, + /* Array index: 0x1424 */ 0x677F,0x7779, + /* Array index: 0x1424 */ 0x6787,0x5D6D, + /* Array index: 0x1424 */ 0x6789,0x685B, + /* Array index: 0x1424 */ 0x678B,0x5B33, + /* Array index: 0x1424 */ 0x678F,0x5177, + /* Array index: 0x1424 */ 0x6790,0x6030, + /* Array index: 0x1424 */ 0x6793,0x5462, + /* Array index: 0x1424 */ 0x6795,0x7657, + /* Array index: 0x1424 */ 0x6797,0x5779, + /* Array index: 0x1424 */ 0x679A,0x585D, + /* Array index: 0x1424 */ 0x679C,0x4D7D, + /* Array index: 0x1424 */ 0x679D,0x722B, + /* Array index: 0x1424 */ 0x67AF,0x4D3D, + /* Array index: 0x1424 */ 0x67B0,0x7842, + /* Array index: 0x1424 */ 0x67B3,0x722C, + /* Array index: 0x1424 */ 0x67BE,0x6342, + /* Array index: 0x1424 */ 0x67C4,0x5C37, + /* Array index: 0x1424 */ 0x67DA,0x6A76, + /* Array index: 0x1424 */ 0x67DD,0x7679, + /* Array index: 0x1424 */ 0x67E9,0x4F2F, + /* Array index: 0x1424 */ 0x67EC,0x4A53, + /* Array index: 0x1424 */ 0x67FB,0x5E5B, + /* Array index: 0x1424 */ 0x67FE,0x6F5E, + /* Array index: 0x1424 */ 0x6812,0x6263, + /* Array index: 0x1424 */ 0x6813,0x6E7B, + /* Array index: 0x1424 */ 0x6816,0x5F77, + /* Array index: 0x1424 */ 0x6817,0x574A, + /* Array index: 0x1424 */ 0x6821,0x4E68, + /* Array index: 0x1424 */ 0x6822,0x5B5B, + /* Array index: 0x1424 */ 0x682A,0x713B, + /* Array index: 0x1424 */ 0x682F,0x6971, + /* Array index: 0x1424 */ 0x6838,0x7A37, + /* Array index: 0x1424 */ 0x6839,0x5046, + /* Array index: 0x1424 */ 0x6848,0x6450, + /* Array index: 0x1424 */ 0x684E,0x726E, + /* Array index: 0x1424 */ 0x686D,0x724D, + /* Array index: 0x1424 */ 0x6876,0x7752, + /* Array index: 0x1424 */ 0x687F,0x4A54, + /* Array index: 0x1424 */ 0x6881,0x5559, + /* Array index: 0x1424 */ 0x6885,0x585E, + /* Array index: 0x1424 */ 0x688F,0x4D59, + /* Array index: 0x1424 */ 0x6893,0x6E29, + /* Array index: 0x1424 */ 0x6894,0x763C, + /* Array index: 0x1424 */ 0x6897,0x4C5B, + /* Array index: 0x1424 */ 0x689D,0x7049, + /* Array index: 0x1424 */ 0x689F,0x7C7C, + /* Array index: 0x1424 */ 0x68A1,0x6849, + /* Array index: 0x1424 */ 0x68A2,0x747E, + /* Array index: 0x1424 */ 0x68A7,0x677C, + /* Array index: 0x1424 */ 0x68A8,0x575E, + /* Array index: 0x1424 */ 0x68C4,0x5125, + /* Array index: 0x1424 */ 0x68C5,0x5C38, + /* Array index: 0x1424 */ 0x68C9,0x5876, + /* Array index: 0x1424 */ 0x68CB,0x5124, + /* Array index: 0x1424 */ 0x68CD,0x4D62, + /* Array index: 0x1424 */ 0x68D2,0x5C6A, + /* Array index: 0x1424 */ 0x68D5,0x7077, + /* Array index: 0x1424 */ 0x68D7,0x704A, + /* Array index: 0x1424 */ 0x68D8,0x503E, + /* Array index: 0x1424 */ 0x68DA,0x5D5C, + /* Array index: 0x1424 */ 0x68DF,0x5456, + /* Array index: 0x1424 */ 0x68E0,0x5356, + /* Array index: 0x1424 */ 0x68E7,0x6D50, + /* Array index: 0x1424 */ 0x68E8,0x4D21, + /* Array index: 0x1424 */ 0x68EE,0x5F35, + /* Array index: 0x1424 */ 0x68F2,0x5F78, + /* Array index: 0x1424 */ 0x68F9,0x5421, + /* Array index: 0x1424 */ 0x68FA,0x4E32, + /* Array index: 0x1424 */ 0x6900,0x684A, + /* Array index: 0x1424 */ 0x6905,0x6B75, + /* Array index: 0x1424 */ 0x690D,0x6355, + /* Array index: 0x1424 */ 0x690E,0x7550, + /* Array index: 0x1424 */ 0x6912,0x7521, + /* Array index: 0x1424 */ 0x6927,0x5927, + /* Array index: 0x1424 */ 0x6930,0x652B, + /* Array index: 0x1424 */ 0x693D,0x664B, + /* Array index: 0x1424 */ 0x693F,0x7571, + /* Array index: 0x1424 */ 0x694A,0x6545, + /* Array index: 0x1424 */ 0x6968,0x6F5F, + /* Array index: 0x1424 */ 0x6995,0x693E, + /* Array index: 0x1424 */ 0x699B,0x724E, + /* Array index: 0x1424 */ 0x699C,0x5B34, + /* Array index: 0x1424 */ 0x69A5,0x7C4E, + /* Array index: 0x1424 */ 0x69A7,0x5D6E, + /* Array index: 0x1424 */ 0x69AE,0x6734, + /* Array index: 0x1424 */ 0x69B4,0x5734, + /* Array index: 0x1424 */ 0x69BB,0x7734, + /* Array index: 0x1424 */ 0x69C1,0x4D3E, + /* Array index: 0x1424 */ 0x69C3,0x5A69, + /* Array index: 0x1424 */ 0x69D0,0x4E59, + /* Array index: 0x1424 */ 0x69E8,0x4E2A, + /* Array index: 0x1424 */ 0x69EA,0x4B48, + /* Array index: 0x1424 */ 0x69FB,0x5027, + /* Array index: 0x1424 */ 0x69FD,0x704B, + /* Array index: 0x1424 */ 0x69FF,0x5047, + /* Array index: 0x1424 */ 0x6A02,0x6445, + /* Array index: 0x1424 */ 0x6A0A,0x5B60, + /* Array index: 0x1424 */ 0x6A11,0x555A, + /* Array index: 0x1424 */ 0x6A13,0x5727, + /* Array index: 0x1424 */ 0x6A17,0x6E40, + /* Array index: 0x1424 */ 0x6A19,0x7876, + /* Array index: 0x1424 */ 0x6A1E,0x7552, + /* Array index: 0x1424 */ 0x6A1F,0x6D69, + /* Array index: 0x1424 */ 0x6A21,0x593C, + /* Array index: 0x1424 */ 0x6A23,0x6546, + /* Array index: 0x1424 */ 0x6A35,0x7523, + /* Array index: 0x1424 */ 0x6A3D,0x715C, + /* Array index: 0x1424 */ 0x6A44,0x4A74, + /* Array index: 0x1424 */ 0x6A48,0x687A, + /* Array index: 0x1424 */ 0x6A4B,0x4E69, + /* Array index: 0x1424 */ 0x6A52,0x6978, + /* Array index: 0x1424 */ 0x6A53,0x6265, + /* Array index: 0x1424 */ 0x6A58,0x5039, + /* Array index: 0x1424 */ 0x6A59,0x5472, + /* Array index: 0x1424 */ 0x6A5F,0x5126, + /* Array index: 0x1424 */ 0x6A61,0x5F4E, + /* Array index: 0x1424 */ 0x6A6B,0x7C74, + /* Array index: 0x1424 */ 0x6A80,0x532A, + /* Array index: 0x1424 */ 0x6A84,0x4C2C, + /* Array index: 0x1424 */ 0x6A89,0x6F60, + /* Array index: 0x1424 */ 0x6A8D,0x6565, + /* Array index: 0x1424 */ 0x6A8E,0x5055, + /* Array index: 0x1424 */ 0x6A97,0x5B7C, + /* Array index: 0x1424 */ 0x6A9C,0x7C66, + /* Array index: 0x1424 */ 0x6AA2,0x4B7E, + /* Array index: 0x1424 */ 0x6AA3,0x6D6A, + /* Array index: 0x1424 */ 0x6AB3,0x5E31, + /* Array index: 0x1424 */ 0x6ABB,0x7963, + /* Array index: 0x1424 */ 0x6AC2,0x5422, + /* Array index: 0x1424 */ 0x6AC3,0x4F76, + /* Array index: 0x1424 */ 0x6AD3,0x5650, + /* Array index: 0x1424 */ 0x6ADA,0x556A, + /* Array index: 0x1424 */ 0x6ADB,0x716E, + /* Array index: 0x1424 */ 0x6AF6,0x7A4B, + /* Array index: 0x1424 */ 0x6AFB,0x6521, + /* Array index: 0x1424 */ 0x6B04,0x5531, + /* Array index: 0x1424 */ 0x6B0A,0x4F6D, + /* Array index: 0x1424 */ 0x6B0C,0x6D6B, + /* Array index: 0x1424 */ 0x6B12,0x5532, + /* Array index: 0x1424 */ 0x6B16,0x553C, + /* Array index: 0x1424 */ 0x6B20,0x7D62, + /* Array index: 0x1424 */ 0x6B21,0x732D, + /* Array index: 0x1424 */ 0x6B23,0x7D5B, + /* Array index: 0x1424 */ 0x6B32,0x6930, + /* Array index: 0x1424 */ 0x6B3A,0x5127, + /* Array index: 0x1424 */ 0x6B3D,0x7D63, + /* Array index: 0x1424 */ 0x6B3E,0x4E33, + /* Array index: 0x1424 */ 0x6B46,0x7D64, + /* Array index: 0x1424 */ 0x6B47,0x7A4E, + /* Array index: 0x1424 */ 0x6B4C,0x4A30, + /* Array index: 0x1424 */ 0x6B4E,0x7727, + /* Array index: 0x1424 */ 0x6B50,0x4F31, + /* Array index: 0x1424 */ 0x6B6A,0x6860, + /* Array index: 0x1424 */ 0x6B72,0x6128, + /* Array index: 0x1424 */ 0x6B77,0x5576, + /* Array index: 0x1424 */ 0x6B78,0x4F7D, + /* Array index: 0x1424 */ 0x6B7B,0x5E5D, + /* Array index: 0x1424 */ 0x6B7F,0x5951, + /* Array index: 0x1424 */ 0x6B83,0x646A, + /* Array index: 0x1424 */ 0x6B84,0x724F, + /* Array index: 0x1424 */ 0x6B86,0x773F, + /* Array index: 0x1424 */ 0x6B89,0x6266, + /* Array index: 0x1424 */ 0x6B8A,0x6228, + /* Array index: 0x1424 */ 0x6B96,0x6356, + /* Array index: 0x1424 */ 0x6B98,0x6D51, + /* Array index: 0x1424 */ 0x6B9E,0x6979, + /* Array index: 0x1424 */ 0x6BAE,0x5631, + /* Array index: 0x1424 */ 0x6BAF,0x5E32, + /* Array index: 0x1424 */ 0x6BB2,0x6068, + /* Array index: 0x1424 */ 0x6BB5,0x532B, + /* Array index: 0x1424 */ 0x6BB7,0x6B5C, + /* Array index: 0x1424 */ 0x6BBA,0x5F2F, + /* Array index: 0x1424 */ 0x6BBC,0x4A43, + /* Array index: 0x1424 */ 0x6BBF,0x6E7C, + /* Array index: 0x1424 */ 0x6BC1,0x7D43, + /* Array index: 0x1424 */ 0x6BC5,0x6B76, + /* Array index: 0x1424 */ 0x6BC6,0x4F32, + /* Array index: 0x1424 */ 0x6BCB,0x596C, + /* Array index: 0x1424 */ 0x6BCD,0x593D, + /* Array index: 0x1424 */ 0x6BCF,0x585F, + /* Array index: 0x1424 */ 0x6BDB,0x593E, + /* Array index: 0x1424 */ 0x6BEB,0x7B46, + /* Array index: 0x1424 */ 0x6BEC,0x4F33, + /* Array index: 0x1424 */ 0x6C08,0x6E7D, + /* Array index: 0x1424 */ 0x6C0F,0x642B, + /* Array index: 0x1424 */ 0x6C11,0x5A45, + /* Array index: 0x1424 */ 0x6C13,0x586C, + /* Array index: 0x1424 */ 0x6C23,0x5128, + /* Array index: 0x1424 */ 0x6C34,0x6229, + /* Array index: 0x1424 */ 0x6C37,0x5E3C, + /* Array index: 0x1424 */ 0x6C38,0x6735, + /* Array index: 0x1424 */ 0x6C4E,0x5B71, + /* Array index: 0x1424 */ 0x6C50,0x6031, + /* Array index: 0x1424 */ 0x6C55,0x5F25, + /* Array index: 0x1424 */ 0x6C57,0x7952, + /* Array index: 0x1424 */ 0x6C5A,0x677D, + /* Array index: 0x1424 */ 0x6C68,0x4D67, + /* Array index: 0x1424 */ 0x6C6A,0x685C, + /* Array index: 0x1424 */ 0x6C6D,0x6757, + /* Array index: 0x1424 */ 0x6C70,0x7740, + /* Array index: 0x1424 */ 0x6C72,0x5063, + /* Array index: 0x1424 */ 0x6C76,0x5A21, + /* Array index: 0x1424 */ 0x6C7A,0x4C3D, + /* Array index: 0x1424 */ 0x6C8C,0x5447, + /* Array index: 0x1424 */ 0x6CAB,0x5848, + /* Array index: 0x1424 */ 0x6CAE,0x6E41, + /* Array index: 0x1424 */ 0x6CB3,0x7941, + /* Array index: 0x1424 */ 0x6CC9,0x743B, + /* Array index: 0x1424 */ 0x6CCA,0x5A55, + /* Array index: 0x1424 */ 0x6CCC,0x7932, + /* Array index: 0x1424 */ 0x6CD3,0x7B72, + /* Array index: 0x1424 */ 0x6CD5,0x5B76, + /* Array index: 0x1424 */ 0x6CD7,0x5E5F, + /* Array index: 0x1424 */ 0x6CDB,0x5B72, + /* Array index: 0x1424 */ 0x6CE8,0x713C, + /* Array index: 0x1424 */ 0x6CEB,0x7A5A, + /* Array index: 0x1424 */ 0x6CF3,0x6736, + /* Array index: 0x1424 */ 0x6D0B,0x6547, + /* Array index: 0x1424 */ 0x6D0C,0x562C, + /* Array index: 0x1424 */ 0x6D11,0x5C47, + /* Array index: 0x1424 */ 0x6D17,0x6129, + /* Array index: 0x1424 */ 0x6D19,0x622A, + /* Array index: 0x1424 */ 0x6D1B,0x5526, + /* Array index: 0x1424 */ 0x6D1E,0x5457, + /* Array index: 0x1424 */ 0x6D25,0x7250, + /* Array index: 0x1424 */ 0x6D27,0x6A7B, + /* Array index: 0x1424 */ 0x6D29,0x605D, + /* Array index: 0x1424 */ 0x6D2A,0x7B73, + /* Array index: 0x1424 */ 0x6D32,0x713D, + /* Array index: 0x1424 */ 0x6D41,0x5735, + /* Array index: 0x1424 */ 0x6D59,0x6F3A, + /* Array index: 0x1424 */ 0x6D5A,0x715D, + /* Array index: 0x1424 */ 0x6D5C,0x5E33, + /* Array index: 0x1424 */ 0x6D63,0x684B, + /* Array index: 0x1424 */ 0x6D66,0x785D, + /* Array index: 0x1424 */ 0x6D69,0x7B47, + /* Array index: 0x1424 */ 0x6D6A,0x5548, + /* Array index: 0x1424 */ 0x6D6C,0x575F, + /* Array index: 0x1424 */ 0x6D6E,0x5D29, + /* Array index: 0x1424 */ 0x6D74,0x6931, + /* Array index: 0x1424 */ 0x6D7F,0x782A, + /* Array index: 0x1424 */ 0x6D91,0x6157, + /* Array index: 0x1424 */ 0x6D93,0x664F, + /* Array index: 0x1424 */ 0x6D95,0x7471, + /* Array index: 0x1424 */ 0x6DAF,0x6473, + /* Array index: 0x1424 */ 0x6DB2,0x647B, + /* Array index: 0x1424 */ 0x6DB5,0x7964, + /* Array index: 0x1424 */ 0x6DC0,0x6F63, + /* Array index: 0x1424 */ 0x6DCB,0x577A, + /* Array index: 0x1424 */ 0x6DCF,0x7B48, + /* Array index: 0x1424 */ 0x6DD1,0x6257, + /* Array index: 0x1424 */ 0x6DDE,0x6167, + /* Array index: 0x1424 */ 0x6DE1,0x533F, + /* Array index: 0x1424 */ 0x6DE8,0x6F64, + /* Array index: 0x1424 */ 0x6DEA,0x5745, + /* Array index: 0x1424 */ 0x6DEB,0x6B62, + /* Array index: 0x1424 */ 0x6DEE,0x7C67, + /* Array index: 0x1424 */ 0x6DF1,0x6422, + /* Array index: 0x1424 */ 0x6DF3,0x6268, + /* Array index: 0x1424 */ 0x6E32,0x6042, + /* Array index: 0x1424 */ 0x6E34,0x4A64, + /* Array index: 0x1424 */ 0x6E36,0x6737, + /* Array index: 0x1424 */ 0x6E38,0x6A7D, + /* Array index: 0x1424 */ 0x6E43,0x5B4B, + /* Array index: 0x1424 */ 0x6E44,0x5A35, + /* Array index: 0x1424 */ 0x6E4A,0x713E, + /* Array index: 0x1424 */ 0x6E4D,0x532C, + /* Array index: 0x1424 */ 0x6E56,0x7B49, + /* Array index: 0x1424 */ 0x6E58,0x5F4F, + /* Array index: 0x1424 */ 0x6E67,0x6940, + /* Array index: 0x1424 */ 0x6E6B,0x7553, + /* Array index: 0x1424 */ 0x6E6E,0x6C5C, + /* Array index: 0x1424 */ 0x6E6F,0x7737, + /* Array index: 0x1424 */ 0x6E72,0x6A38, + /* Array index: 0x1424 */ 0x6E73,0x5179, + /* Array index: 0x1424 */ 0x6E7A,0x5C48, + /* Array index: 0x1424 */ 0x6E90,0x6A39, + /* Array index: 0x1424 */ 0x6E96,0x715E, + /* Array index: 0x1424 */ 0x6E9C,0x5736, + /* Array index: 0x1424 */ 0x6E9D,0x4F35, + /* Array index: 0x1424 */ 0x6E9F,0x5928, + /* Array index: 0x1424 */ 0x6EA2,0x6C6E, + /* Array index: 0x1424 */ 0x6EA5,0x5D2A, + /* Array index: 0x1424 */ 0x6EAA,0x4D22, + /* Array index: 0x1424 */ 0x6EAB,0x682E, + /* Array index: 0x1424 */ 0x6EAF,0x613D, + /* Array index: 0x1424 */ 0x6EB1,0x7251, + /* Array index: 0x1424 */ 0x6EB6,0x6941, + /* Array index: 0x1424 */ 0x6EBA,0x527C, + /* Array index: 0x1424 */ 0x6EC2,0x5B35, + /* Array index: 0x1424 */ 0x6EC4,0x7367, + /* Array index: 0x1424 */ 0x6EC5,0x587E, + /* Array index: 0x1424 */ 0x6EC9,0x7C51, + /* Array index: 0x1424 */ 0x6ECB,0x6D32, + /* Array index: 0x1424 */ 0x6ECC,0x742F, + /* Array index: 0x1424 */ 0x6ECE,0x7B23, + /* Array index: 0x1424 */ 0x6ED1,0x7C41, + /* Array index: 0x1424 */ 0x6ED3,0x6E2B, + /* Array index: 0x1424 */ 0x6ED4,0x5425, + /* Array index: 0x1424 */ 0x6EEF,0x7472, + /* Array index: 0x1424 */ 0x6EF4,0x6E59, + /* Array index: 0x1424 */ 0x6EF8,0x7B4A, + /* Array index: 0x1424 */ 0x6F06,0x7654, + /* Array index: 0x1424 */ 0x6F0F,0x5729, + /* Array index: 0x1424 */ 0x6F11,0x4B49, + /* Array index: 0x1424 */ 0x6F14,0x6651, + /* Array index: 0x1424 */ 0x6F15,0x704C, + /* Array index: 0x1424 */ 0x6F20,0x582E, + /* Array index: 0x1424 */ 0x6F22,0x7953, + /* Array index: 0x1424 */ 0x6F23,0x557E, + /* Array index: 0x1424 */ 0x6F2B,0x583C, + /* Array index: 0x1424 */ 0x6F2C,0x7230, + /* Array index: 0x1424 */ 0x6F31,0x622B, + /* Array index: 0x1424 */ 0x6F32,0x7368, + /* Array index: 0x1424 */ 0x6F38,0x6F42, + /* Array index: 0x1424 */ 0x6F3F,0x6D6C, + /* Array index: 0x1424 */ 0x6F41,0x6738, + /* Array index: 0x1424 */ 0x6F51,0x5A7E, + /* Array index: 0x1424 */ 0x6F54,0x4C3E, + /* Array index: 0x1424 */ 0x6F62,0x7C52, + /* Array index: 0x1424 */ 0x6F64,0x6B48, + /* Array index: 0x1424 */ 0x6F6D,0x5341, + /* Array index: 0x1424 */ 0x6F6E,0x704D, + /* Array index: 0x1424 */ 0x6F70,0x4F77, + /* Array index: 0x1424 */ 0x6F81,0x5F3B, + /* Array index: 0x1424 */ 0x6F84,0x7325, + /* Array index: 0x1424 */ 0x6F88,0x744D, + /* Array index: 0x1424 */ 0x6F8D,0x713F, + /* Array index: 0x1424 */ 0x6F8E,0x7831, + /* Array index: 0x1424 */ 0x6F90,0x697A, + /* Array index: 0x1424 */ 0x6F94,0x7B4B, + /* Array index: 0x1424 */ 0x6F97,0x4A55, + /* Array index: 0x1424 */ 0x6FA3,0x7954, + /* Array index: 0x1424 */ 0x6FA4,0x774A, + /* Array index: 0x1424 */ 0x6FA7,0x5648, + /* Array index: 0x1424 */ 0x6FAE,0x7C68, + /* Array index: 0x1424 */ 0x6FAF,0x733D, + /* Array index: 0x1424 */ 0x6FB1,0x6E7E, + /* Array index: 0x1424 */ 0x6FB3,0x677E, + /* Array index: 0x1424 */ 0x6FB9,0x5342, + /* Array index: 0x1424 */ 0x6FCA,0x6758, + /* Array index: 0x1424 */ 0x6FD5,0x6325, + /* Array index: 0x1424 */ 0x6FDA,0x6739, + /* Array index: 0x1424 */ 0x6FE4,0x5426, + /* Array index: 0x1424 */ 0x6FE9,0x7B4D, + /* Array index: 0x1424 */ 0x6FEB,0x553D, + /* Array index: 0x1424 */ 0x6FEC,0x715F, + /* Array index: 0x1424 */ 0x6FEF,0x767B, + /* Array index: 0x1424 */ 0x6FF1,0x5E34, + /* Array index: 0x1424 */ 0x6FFE,0x556B, + /* Array index: 0x1424 */ 0x7001,0x6548, + /* Array index: 0x1424 */ 0x7005,0x7B24, + /* Array index: 0x1424 */ 0x7006,0x5439, + /* Array index: 0x1424 */ 0x7009,0x5E61, + /* Array index: 0x1424 */ 0x700B,0x6423, + /* Array index: 0x1424 */ 0x700F,0x5737, + /* Array index: 0x1424 */ 0x7011,0x786E, + /* Array index: 0x1424 */ 0x7015,0x5E35, + /* Array index: 0x1424 */ 0x7023,0x7A2E, + /* Array index: 0x1424 */ 0x7027,0x5669, + /* Array index: 0x1424 */ 0x7028,0x566E, + /* Array index: 0x1424 */ 0x702F,0x673B, + /* Array index: 0x1424 */ 0x7037,0x6C4B, + /* Array index: 0x1424 */ 0x703E,0x5533, + /* Array index: 0x1424 */ 0x704C,0x4E34, + /* Array index: 0x1424 */ 0x7050,0x7B25, + /* Array index: 0x1424 */ 0x7051,0x616E, + /* Array index: 0x1424 */ 0x7058,0x7728, + /* Array index: 0x1424 */ 0x705D,0x7B4E, + /* Array index: 0x1424 */ 0x7063,0x583D, + /* Array index: 0x1424 */ 0x706B,0x7B7D, + /* Array index: 0x1424 */ 0x7070,0x7C69, + /* Array index: 0x1424 */ 0x7078,0x4F36, + /* Array index: 0x1424 */ 0x707C,0x6D47, + /* Array index: 0x1424 */ 0x707D,0x6E2C, + /* Array index: 0x1424 */ 0x7085,0x4C5D, + /* Array index: 0x1424 */ 0x708A,0x7627, + /* Array index: 0x1424 */ 0x708E,0x667A, + /* Array index: 0x1424 */ 0x7092,0x7524, + /* Array index: 0x1424 */ 0x70A1,0x6F68, + /* Array index: 0x1424 */ 0x70A4,0x613F, + /* Array index: 0x1424 */ 0x70B3,0x5C39, + /* Array index: 0x1424 */ 0x70C8,0x562D, + /* Array index: 0x1424 */ 0x70CB,0x7D4E, + /* Array index: 0x1424 */ 0x70CF,0x6821, + /* Array index: 0x1424 */ 0x70D8,0x7B74, + /* Array index: 0x1424 */ 0x70D9,0x5527, + /* Array index: 0x1424 */ 0x70DD,0x7176, + /* Array index: 0x1424 */ 0x70DF,0x6653, + /* Array index: 0x1424 */ 0x70F1,0x4C5E, + /* Array index: 0x1424 */ 0x70F9,0x7832, + /* Array index: 0x1424 */ 0x70FD,0x5C6B, + /* Array index: 0x1424 */ 0x7104,0x7D36, + /* Array index: 0x1424 */ 0x7109,0x656A, + /* Array index: 0x1424 */ 0x710C,0x7160, + /* Array index: 0x1424 */ 0x7119,0x5B4C, + /* Array index: 0x1424 */ 0x711A,0x5D4D, + /* Array index: 0x1424 */ 0x711E,0x5448, + /* Array index: 0x1424 */ 0x7121,0x596D, + /* Array index: 0x1424 */ 0x7126,0x7525, + /* Array index: 0x1424 */ 0x7130,0x667B, + /* Array index: 0x1424 */ 0x7136,0x6654, + /* Array index: 0x1424 */ 0x7147,0x7D48, + /* Array index: 0x1424 */ 0x7149,0x5621, + /* Array index: 0x1424 */ 0x714A,0x7D3F, + /* Array index: 0x1424 */ 0x714C,0x7C53, + /* Array index: 0x1424 */ 0x714E,0x6F21, + /* Array index: 0x1424 */ 0x7150,0x673C, + /* Array index: 0x1424 */ 0x7156,0x516E, + /* Array index: 0x1424 */ 0x7159,0x6655, + /* Array index: 0x1424 */ 0x715C,0x6972, + /* Array index: 0x1424 */ 0x715E,0x5F30, + /* Array index: 0x1424 */ 0x716C,0x6549, + /* Array index: 0x1424 */ 0x716E,0x6D34, + /* Array index: 0x1424 */ 0x717D,0x6043, + /* Array index: 0x1424 */ 0x7184,0x6358, + /* Array index: 0x1424 */ 0x7189,0x697B, + /* Array index: 0x1424 */ 0x718A,0x6A28, + /* Array index: 0x1424 */ 0x718F,0x7D37, + /* Array index: 0x1424 */ 0x7192,0x7B27, + /* Array index: 0x1424 */ 0x7194,0x6942, + /* Array index: 0x1424 */ 0x7199,0x7D77, + /* Array index: 0x1424 */ 0x719F,0x6259, + /* Array index: 0x1424 */ 0x71A2,0x5C6C, + /* Array index: 0x1424 */ 0x71AC,0x6822, + /* Array index: 0x1424 */ 0x71B1,0x6670, + /* Array index: 0x1424 */ 0x71B9,0x7D78, + /* Array index: 0x1424 */ 0x71BA,0x7D79, + /* Array index: 0x1424 */ 0x71BE,0x763F, + /* Array index: 0x1424 */ 0x71C1,0x6727, + /* Array index: 0x1424 */ 0x71C3,0x6657, + /* Array index: 0x1424 */ 0x71C8,0x5473, + /* Array index: 0x1424 */ 0x71C9,0x5449, + /* Array index: 0x1424 */ 0x71CE,0x567A, + /* Array index: 0x1424 */ 0x71D0,0x5772, + /* Array index: 0x1424 */ 0x71D2,0x6140, + /* Array index: 0x1424 */ 0x71D4,0x5B62, + /* Array index: 0x1424 */ 0x71D5,0x6658, + /* Array index: 0x1424 */ 0x71DF,0x673D, + /* Array index: 0x1424 */ 0x71ED,0x7537, + /* Array index: 0x1424 */ 0x71EE,0x6070, + /* Array index: 0x1424 */ 0x7206,0x786F, + /* Array index: 0x1424 */ 0x7210,0x5653, + /* Array index: 0x1424 */ 0x721B,0x5534, + /* Array index: 0x1424 */ 0x722A,0x7050, + /* Array index: 0x1424 */ 0x722C,0x7770, + /* Array index: 0x1424 */ 0x722D,0x6E33, + /* Array index: 0x1424 */ 0x7230,0x6A3A, + /* Array index: 0x1424 */ 0x7232,0x6A53, + /* Array index: 0x1424 */ 0x7235,0x6D49, + /* Array index: 0x1424 */ 0x7236,0x5D2B, + /* Array index: 0x1424 */ 0x724C,0x782B, + /* Array index: 0x1424 */ 0x7252,0x7460, + /* Array index: 0x1424 */ 0x7258,0x543A, + /* Array index: 0x1424 */ 0x7259,0x6433, + /* Array index: 0x1424 */ 0x725B,0x695A, + /* Array index: 0x1424 */ 0x725D,0x5E36, + /* Array index: 0x1424 */ 0x725F,0x593F, + /* Array index: 0x1424 */ 0x7261,0x5940, + /* Array index: 0x1424 */ 0x7262,0x566F, + /* Array index: 0x1424 */ 0x7267,0x594C, + /* Array index: 0x1424 */ 0x7269,0x5A2A, + /* Array index: 0x1424 */ 0x7272,0x5F65, + /* Array index: 0x1424 */ 0x7279,0x7765, + /* Array index: 0x1424 */ 0x727D,0x4C32, + /* Array index: 0x1424 */ 0x7280,0x5F79, + /* Array index: 0x1424 */ 0x7281,0x5760, + /* Array index: 0x1424 */ 0x72A2,0x543B, + /* Array index: 0x1424 */ 0x72A7,0x7D7A, + /* Array index: 0x1424 */ 0x72AC,0x4C33, + /* Array index: 0x1424 */ 0x72AF,0x5B73, + /* Array index: 0x1424 */ 0x72C0,0x5F52, + /* Array index: 0x1424 */ 0x72C2,0x4E4A, + /* Array index: 0x1424 */ 0x72C4,0x6E5A, + /* Array index: 0x1424 */ 0x72CE,0x6464, + /* Array index: 0x1424 */ 0x72D0,0x7B4F, + /* Array index: 0x1424 */ 0x72D7,0x4F37, + /* Array index: 0x1424 */ 0x72D9,0x6E43, + /* Array index: 0x1424 */ 0x72E1,0x4E6A, + /* Array index: 0x1424 */ 0x72E9,0x622D, + /* Array index: 0x1424 */ 0x72F8,0x5761, + /* Array index: 0x1424 */ 0x72F9,0x7A75, + /* Array index: 0x1424 */ 0x72FC,0x5549, + /* Array index: 0x1424 */ 0x72FD,0x782C, + /* Array index: 0x1424 */ 0x730A,0x6759, + /* Array index: 0x1424 */ 0x7316,0x7369, + /* Array index: 0x1424 */ 0x7325,0x6865, + /* Array index: 0x1424 */ 0x7336,0x6B22, + /* Array index: 0x1424 */ 0x7337,0x6B23, + /* Array index: 0x1424 */ 0x733E,0x7C42, + /* Array index: 0x1424 */ 0x733F,0x6A3B, + /* Array index: 0x1424 */ 0x7344,0x682B, + /* Array index: 0x1424 */ 0x7345,0x5E62, + /* Array index: 0x1424 */ 0x7350,0x6D6F, + /* Array index: 0x1424 */ 0x7352,0x6823, + /* Array index: 0x1424 */ 0x7357,0x4F71, + /* Array index: 0x1424 */ 0x7368,0x543C, + /* Array index: 0x1424 */ 0x736A,0x7C6A, + /* Array index: 0x1424 */ 0x7370,0x673E, + /* Array index: 0x1424 */ 0x7372,0x7C72, + /* Array index: 0x1424 */ 0x7375,0x5634, + /* Array index: 0x1424 */ 0x7378,0x622E, + /* Array index: 0x1424 */ 0x737A,0x5337, + /* Array index: 0x1424 */ 0x737B,0x7A4C, + /* Array index: 0x1424 */ 0x7384,0x7A5C, + /* Array index: 0x1424 */ 0x7386,0x6D35, + /* Array index: 0x1424 */ 0x7387,0x6163, + /* Array index: 0x1424 */ 0x7389,0x682C, + /* Array index: 0x1424 */ 0x738B,0x685D, + /* Array index: 0x1424 */ 0x738E,0x6F69, + /* Array index: 0x1424 */ 0x739F,0x5A47, + /* Array index: 0x1424 */ 0x73A7,0x6B49, + /* Array index: 0x1424 */ 0x73A9,0x684C, + /* Array index: 0x1424 */ 0x73AD,0x5E37, + /* Array index: 0x1424 */ 0x73B2,0x563C, + /* Array index: 0x1424 */ 0x73B3,0x5365, + /* Array index: 0x1424 */ 0x73B9,0x7A5D, + /* Array index: 0x1424 */ 0x73C0,0x5A56, + /* Array index: 0x1424 */ 0x73C2,0x4A31, + /* Array index: 0x1424 */ 0x73D6,0x4E4B, + /* Array index: 0x1424 */ 0x73D9,0x4D75, + /* Array index: 0x1424 */ 0x73DD,0x7D30, + /* Array index: 0x1424 */ 0x73DE,0x5528, + /* Array index: 0x1424 */ 0x73E0,0x7141, + /* Array index: 0x1424 */ 0x73ED,0x5A6C, + /* Array index: 0x1424 */ 0x73F7,0x596E, + /* Array index: 0x1424 */ 0x73F9,0x607B, + /* Array index: 0x1424 */ 0x73FD,0x6F6A, + /* Array index: 0x1424 */ 0x73FE,0x7A5E, + /* Array index: 0x1424 */ 0x7401,0x6044, + /* Array index: 0x1424 */ 0x7413,0x684D, + /* Array index: 0x1424 */ 0x741B,0x765A, + /* Array index: 0x1424 */ 0x744B,0x6A54, + /* Array index: 0x1424 */ 0x7455,0x7942, + /* Array index: 0x1424 */ 0x746F,0x554B, + /* Array index: 0x1424 */ 0x747E,0x5048, + /* Array index: 0x1424 */ 0x7482,0x512F, + /* Array index: 0x1424 */ 0x7483,0x5763, + /* Array index: 0x1424 */ 0x7487,0x6046, + /* Array index: 0x1424 */ 0x7489,0x5622, + /* Array index: 0x1424 */ 0x748B,0x6D70, + /* Array index: 0x1424 */ 0x7498,0x5773, + /* Array index: 0x1424 */ 0x749C,0x7C54, + /* Array index: 0x1424 */ 0x749E,0x5A57, + /* Array index: 0x1424 */ 0x749F,0x4C5F, + /* Array index: 0x1424 */ 0x74A1,0x7254, + /* Array index: 0x1424 */ 0x74A3,0x5130, + /* Array index: 0x1424 */ 0x74A5,0x4C60, + /* Array index: 0x1424 */ 0x74A7,0x5B7D, + /* Array index: 0x1424 */ 0x74A8,0x733F, + /* Array index: 0x1424 */ 0x74AA,0x7051, + /* Array index: 0x1424 */ 0x74B0,0x7C3B, + /* Array index: 0x1424 */ 0x74B2,0x6230, + /* Array index: 0x1424 */ 0x74B5,0x6625, + /* Array index: 0x1424 */ 0x74B9,0x625B, + /* Array index: 0x1424 */ 0x74BD,0x5F5E, + /* Array index: 0x1424 */ 0x74BF,0x6047, + /* Array index: 0x1424 */ 0x74C6,0x726F, + /* Array index: 0x1424 */ 0x74CA,0x4C61, + /* Array index: 0x1424 */ 0x74CF,0x566A, + /* Array index: 0x1424 */ 0x74D4,0x6742, + /* Array index: 0x1424 */ 0x74D8,0x4E36, + /* Array index: 0x1424 */ 0x74DA,0x7340, + /* Array index: 0x1424 */ 0x74DC,0x4D7E, + /* Array index: 0x1424 */ 0x74E0,0x7B52, + /* Array index: 0x1424 */ 0x74E2,0x7878, + /* Array index: 0x1424 */ 0x74E3,0x777B, + /* Array index: 0x1424 */ 0x74E6,0x683F, + /* Array index: 0x1424 */ 0x74EE,0x6837, + /* Array index: 0x1424 */ 0x74F7,0x6D36, + /* Array index: 0x1424 */ 0x7501,0x5C3A, + /* Array index: 0x1424 */ 0x7504,0x4C34, + /* Array index: 0x1424 */ 0x7511,0x7177, + /* Array index: 0x1424 */ 0x7515,0x6838, + /* Array index: 0x1424 */ 0x7518,0x4A76, + /* Array index: 0x1424 */ 0x751A,0x6424, + /* Array index: 0x1424 */ 0x751B,0x7456, + /* Array index: 0x1424 */ 0x751F,0x5F66, + /* Array index: 0x1424 */ 0x7523,0x5F27, + /* Array index: 0x1424 */ 0x7525,0x5F67, + /* Array index: 0x1424 */ 0x7526,0x6141, + /* Array index: 0x1424 */ 0x7528,0x6944, + /* Array index: 0x1424 */ 0x752B,0x5C4B, + /* Array index: 0x1424 */ 0x752C,0x6945, + /* Array index: 0x1424 */ 0x7537,0x517B, + /* Array index: 0x1424 */ 0x7538,0x6F24, + /* Array index: 0x1424 */ 0x753A,0x6F6B, + /* Array index: 0x1424 */ 0x7547,0x5034, + /* Array index: 0x1424 */ 0x754C,0x4D23, + /* Array index: 0x1424 */ 0x754F,0x6866, + /* Array index: 0x1424 */ 0x7551,0x6F25, + /* Array index: 0x1424 */ 0x7553,0x534C, + /* Array index: 0x1424 */ 0x7554,0x5A6D, + /* Array index: 0x1424 */ 0x7562,0x7934, + /* Array index: 0x1424 */ 0x7565,0x5554, + /* Array index: 0x1424 */ 0x7566,0x7D4F, + /* Array index: 0x1424 */ 0x756A,0x5B63, + /* Array index: 0x1424 */ 0x756F,0x7161, + /* Array index: 0x1424 */ 0x7570,0x6C36, + /* Array index: 0x1424 */ 0x7575,0x7B7E, + /* Array index: 0x1424 */ 0x7576,0x5357, + /* Array index: 0x1424 */ 0x7578,0x5131, + /* Array index: 0x1424 */ 0x757A,0x4B31, + /* Array index: 0x1424 */ 0x757F,0x5132, + /* Array index: 0x1424 */ 0x7586,0x4B32, + /* Array index: 0x1424 */ 0x7587,0x7142, + /* Array index: 0x1424 */ 0x758A,0x7461, + /* Array index: 0x1424 */ 0x758B,0x7935, + /* Array index: 0x1424 */ 0x758E,0x6143, + /* Array index: 0x1424 */ 0x758F,0x6142, + /* Array index: 0x1424 */ 0x7591,0x6B77, + /* Array index: 0x1424 */ 0x759D,0x5F28, + /* Array index: 0x1424 */ 0x75A5,0x4B4A, + /* Array index: 0x1424 */ 0x75AB,0x6639, + /* Array index: 0x1424 */ 0x75C2,0x4A32, + /* Array index: 0x1424 */ 0x75C5,0x5C3B, + /* Array index: 0x1424 */ 0x75C7,0x7178, + /* Array index: 0x1424 */ 0x75CD,0x6C37, + /* Array index: 0x1424 */ 0x75D2,0x654A, + /* Array index: 0x1424 */ 0x75D4,0x7640, + /* Array index: 0x1424 */ 0x75D5,0x7D5D, + /* Array index: 0x1424 */ 0x75D8,0x5463, + /* Array index: 0x1424 */ 0x75D9,0x4C62, + /* Array index: 0x1424 */ 0x75DB,0x7754, + /* Array index: 0x1424 */ 0x75E2,0x5765, + /* Array index: 0x1424 */ 0x75F0,0x5343, + /* Array index: 0x1424 */ 0x75F2,0x5826, + /* Array index: 0x1424 */ 0x75F4,0x7641, + /* Array index: 0x1424 */ 0x75FA,0x5D76, + /* Array index: 0x1424 */ 0x75FC,0x4D40, + /* Array index: 0x1424 */ 0x7600,0x655C, + /* Array index: 0x1424 */ 0x760D,0x654B, + /* Array index: 0x1424 */ 0x7619,0x6144, + /* Array index: 0x1424 */ 0x763B,0x572A, + /* Array index: 0x1424 */ 0x7642,0x567B, + /* Array index: 0x1424 */ 0x764C,0x645F, + /* Array index: 0x1424 */ 0x764E,0x4A56, + /* Array index: 0x1424 */ 0x7652,0x6B28, + /* Array index: 0x1424 */ 0x7656,0x5B7E, + /* Array index: 0x1424 */ 0x7661,0x7642, + /* Array index: 0x1424 */ 0x7664,0x6F3B, + /* Array index: 0x1424 */ 0x7669,0x547D, + /* Array index: 0x1424 */ 0x766C,0x6048, + /* Array index: 0x1424 */ 0x7670,0x6839, + /* Array index: 0x1424 */ 0x7672,0x6F26, + /* Array index: 0x1424 */ 0x7678,0x4D24, + /* Array index: 0x1424 */ 0x7684,0x6E5C, + /* Array index: 0x1424 */ 0x7686,0x4B4B, + /* Array index: 0x1424 */ 0x7687,0x7C55, + /* Array index: 0x1424 */ 0x768E,0x4E6B, + /* Array index: 0x1424 */ 0x7690,0x4D41, + /* Array index: 0x1424 */ 0x7693,0x7B53, + /* Array index: 0x1424 */ 0x76AE,0x792B, + /* Array index: 0x1424 */ 0x76BA,0x7554, + /* Array index: 0x1424 */ 0x76BF,0x5929, + /* Array index: 0x1424 */ 0x76C2,0x695D, + /* Array index: 0x1424 */ 0x76C3,0x5B4D, + /* Array index: 0x1424 */ 0x76C6,0x5D4E, + /* Array index: 0x1424 */ 0x76C8,0x6743, + /* Array index: 0x1424 */ 0x76CA,0x6C4C, + /* Array index: 0x1424 */ 0x76D2,0x796C, + /* Array index: 0x1424 */ 0x76D6,0x4B4C, + /* Array index: 0x1424 */ 0x76E7,0x5654, + /* Array index: 0x1424 */ 0x76EE,0x594D, + /* Array index: 0x1424 */ 0x76F2,0x586E, + /* Array index: 0x1424 */ 0x76F4,0x7241, + /* Array index: 0x1424 */ 0x76F8,0x5F53, + /* Array index: 0x1424 */ 0x76FC,0x5A70, + /* Array index: 0x1424 */ 0x76FE,0x626A, + /* Array index: 0x1424 */ 0x7701,0x607D, + /* Array index: 0x1424 */ 0x7704,0x5878, + /* Array index: 0x1424 */ 0x7708,0x772F, + /* Array index: 0x1424 */ 0x7709,0x5A36, + /* Array index: 0x1424 */ 0x770B,0x4A57, + /* Array index: 0x1424 */ 0x771E,0x7258, + /* Array index: 0x1424 */ 0x7720,0x5879, + /* Array index: 0x1424 */ 0x7729,0x7A5F, + /* Array index: 0x1424 */ 0x7737,0x4F6F, + /* Array index: 0x1424 */ 0x7738,0x5942, + /* Array index: 0x1424 */ 0x773A,0x7052, + /* Array index: 0x1424 */ 0x773C,0x6451, + /* Array index: 0x1424 */ 0x7740,0x7337, + /* Array index: 0x1424 */ 0x774D,0x7A60, + /* Array index: 0x1424 */ 0x775B,0x6F6C, + /* Array index: 0x1424 */ 0x7761,0x6232, + /* Array index: 0x1424 */ 0x7763,0x543D, + /* Array index: 0x1424 */ 0x7766,0x594E, + /* Array index: 0x1424 */ 0x776B,0x7462, + /* Array index: 0x1424 */ 0x7779,0x5429, + /* Array index: 0x1424 */ 0x777E,0x4D42, + /* Array index: 0x1424 */ 0x777F,0x675A, + /* Array index: 0x1424 */ 0x778B,0x7259, + /* Array index: 0x1424 */ 0x7791,0x592A, + /* Array index: 0x1424 */ 0x779E,0x583E, + /* Array index: 0x1424 */ 0x77A5,0x5C2D, + /* Array index: 0x1424 */ 0x77AC,0x626B, + /* Array index: 0x1424 */ 0x77AD,0x567C, + /* Array index: 0x1424 */ 0x77B0,0x4A79, + /* Array index: 0x1424 */ 0x77B3,0x545A, + /* Array index: 0x1424 */ 0x77BB,0x7457, + /* Array index: 0x1424 */ 0x77BC,0x4C21, + /* Array index: 0x1424 */ 0x77BF,0x4F3A, + /* Array index: 0x1424 */ 0x77D7,0x7538, + /* Array index: 0x1424 */ 0x77DB,0x5943, + /* Array index: 0x1424 */ 0x77DC,0x5068, + /* Array index: 0x1424 */ 0x77E2,0x6345, + /* Array index: 0x1424 */ 0x77E3,0x6B78, + /* Array index: 0x1424 */ 0x77E5,0x7231, + /* Array index: 0x1424 */ 0x77E9,0x4F3B, + /* Array index: 0x1424 */ 0x77F3,0x6034, + /* Array index: 0x1424 */ 0x7802,0x5E63, + /* Array index: 0x1424 */ 0x7812,0x5D77, + /* Array index: 0x1424 */ 0x782C,0x577E, + /* Array index: 0x1424 */ 0x7832,0x785F, + /* Array index: 0x1424 */ 0x7834,0x7772, + /* Array index: 0x1424 */ 0x7845,0x5029, + /* Array index: 0x1424 */ 0x784F,0x665A, + /* Array index: 0x1424 */ 0x785D,0x7526, + /* Array index: 0x1424 */ 0x786B,0x573C, + /* Array index: 0x1424 */ 0x786C,0x4C63, + /* Array index: 0x1424 */ 0x786F,0x665B, + /* Array index: 0x1424 */ 0x787C,0x5D5D, + /* Array index: 0x1424 */ 0x7881,0x5133, + /* Array index: 0x1424 */ 0x7887,0x6F6D, + /* Array index: 0x1424 */ 0x7891,0x5D78, + /* Array index: 0x1424 */ 0x7897,0x684F, + /* Array index: 0x1424 */ 0x78A3,0x4A65, + /* Array index: 0x1424 */ 0x78A7,0x5C21, + /* Array index: 0x1424 */ 0x78A9,0x6035, + /* Array index: 0x1424 */ 0x78C1,0x6D38, + /* Array index: 0x1424 */ 0x78C5,0x5B36, + /* Array index: 0x1424 */ 0x78CA,0x5670, + /* Array index: 0x1424 */ 0x78CB,0x732F, + /* Array index: 0x1424 */ 0x78CE,0x4D25, + /* Array index: 0x1424 */ 0x78D0,0x5A71, + /* Array index: 0x1424 */ 0x78E8,0x5828, + /* Array index: 0x1424 */ 0x78EC,0x4C64, + /* Array index: 0x1424 */ 0x78EF,0x5134, + /* Array index: 0x1424 */ 0x78F5,0x4A58, + /* Array index: 0x1424 */ 0x78FB,0x5A72, + /* Array index: 0x1424 */ 0x7901,0x7527, + /* Array index: 0x1424 */ 0x790E,0x7528, + /* Array index: 0x1424 */ 0x7916,0x6626, + /* Array index: 0x1424 */ 0x793A,0x6346, + /* Array index: 0x1424 */ 0x793E,0x5E64, + /* Array index: 0x1424 */ 0x7940,0x5E65, + /* Array index: 0x1424 */ 0x7941,0x5135, + /* Array index: 0x1424 */ 0x7950,0x695E, + /* Array index: 0x1424 */ 0x7965,0x5F54, + /* Array index: 0x1424 */ 0x7968,0x7879, + /* Array index: 0x1424 */ 0x796D,0x702E, + /* Array index: 0x1424 */ 0x797A,0x5138, + /* Array index: 0x1424 */ 0x797F,0x565F, + /* Array index: 0x1424 */ 0x7981,0x5057, + /* Array index: 0x1424 */ 0x79A6,0x655D, + /* Array index: 0x1424 */ 0x79A7,0x7D7B, + /* Array index: 0x1424 */ 0x79AA,0x6049, + /* Array index: 0x1424 */ 0x79AE,0x5649, + /* Array index: 0x1424 */ 0x79B1,0x542A, + /* Array index: 0x1424 */ 0x79B3,0x654C, + /* Array index: 0x1424 */ 0x79B9,0x6960, + /* Array index: 0x1424 */ 0x79D1,0x4E21, + /* Array index: 0x1424 */ 0x79D2,0x7529, + /* Array index: 0x1424 */ 0x79D5,0x5D79, + /* Array index: 0x1424 */ 0x79D8,0x5D7A, + /* Array index: 0x1424 */ 0x79DF,0x7055, + /* Array index: 0x1424 */ 0x79E4,0x765F, + /* Array index: 0x1424 */ 0x79E6,0x725A, + /* Array index: 0x1424 */ 0x79E7,0x646B, + /* Array index: 0x1424 */ 0x79E9,0x7271, + /* Array index: 0x1424 */ 0x79FB,0x6C39, + /* Array index: 0x1424 */ 0x7A00,0x7D7C, + /* Array index: 0x1424 */ 0x7A05,0x612A, + /* Array index: 0x1424 */ 0x7A08,0x4A59, + /* Array index: 0x1424 */ 0x7A0B,0x6F6F, + /* Array index: 0x1424 */ 0x7A0D,0x752A, + /* Array index: 0x1424 */ 0x7A14,0x6C79, + /* Array index: 0x1424 */ 0x7A17,0x782D, + /* Array index: 0x1424 */ 0x7A19,0x7242, + /* Array index: 0x1424 */ 0x7A1A,0x7643, + /* Array index: 0x1424 */ 0x7A1C,0x5752, + /* Array index: 0x1424 */ 0x7A1F,0x7922, + /* Array index: 0x1424 */ 0x7A20,0x7056, + /* Array index: 0x1424 */ 0x7A2E,0x707A, + /* Array index: 0x1424 */ 0x7A31,0x7660, + /* Array index: 0x1424 */ 0x7A36,0x6973, + /* Array index: 0x1424 */ 0x7A37,0x7243, + /* Array index: 0x1424 */ 0x7A46,0x594F, + /* Array index: 0x1424 */ 0x7A49,0x7644, + /* Array index: 0x1424 */ 0x7A4D,0x6E5D, + /* Array index: 0x1424 */ 0x7A4E,0x6744, + /* Array index: 0x1424 */ 0x7A57,0x6234, + /* Array index: 0x1424 */ 0x7A61,0x5F62, + /* Array index: 0x1424 */ 0x7A62,0x675B, + /* Array index: 0x1424 */ 0x7A69,0x6831, + /* Array index: 0x1424 */ 0x7A6B,0x7C2E, + /* Array index: 0x1424 */ 0x7A70,0x654D, + /* Array index: 0x1424 */ 0x7A74,0x7A6B, + /* Array index: 0x1424 */ 0x7A76,0x4F3C, + /* Array index: 0x1424 */ 0x7A79,0x4F62, + /* Array index: 0x1424 */ 0x7A7A,0x4D76, + /* Array index: 0x1424 */ 0x7A7D,0x6F70, + /* Array index: 0x1424 */ 0x7A7F,0x743E, + /* Array index: 0x1424 */ 0x7A81,0x544D, + /* Array index: 0x1424 */ 0x7A84,0x7338, + /* Array index: 0x1424 */ 0x7A88,0x6921, + /* Array index: 0x1424 */ 0x7A92,0x7272, + /* Array index: 0x1424 */ 0x7A93,0x736B, + /* Array index: 0x1424 */ 0x7A95,0x7057, + /* Array index: 0x1424 */ 0x7A98,0x4F57, + /* Array index: 0x1424 */ 0x7A9F,0x4F5F, + /* Array index: 0x1424 */ 0x7AA9,0x6840, + /* Array index: 0x1424 */ 0x7AAA,0x6841, + /* Array index: 0x1424 */ 0x7AAE,0x4F63, + /* Array index: 0x1424 */ 0x7AAF,0x6922, + /* Array index: 0x1424 */ 0x7ABA,0x502A, + /* Array index: 0x1424 */ 0x7AC4,0x7341, + /* Array index: 0x1424 */ 0x7AC5,0x502B, + /* Array index: 0x1424 */ 0x7AC7,0x5464, + /* Array index: 0x1424 */ 0x7ACA,0x6F3C, + /* Array index: 0x1424 */ 0x7ACB,0x5821, + /* Array index: 0x1424 */ 0x7AD7,0x595F, + /* Array index: 0x1424 */ 0x7AD9,0x7357, + /* Array index: 0x1424 */ 0x7ADD,0x5C3D, + /* Array index: 0x1424 */ 0x7ADF,0x4C65, + /* Array index: 0x1424 */ 0x7AE0,0x6D71, + /* Array index: 0x1424 */ 0x7AE3,0x7162, + /* Array index: 0x1424 */ 0x7AE5,0x545B, + /* Array index: 0x1424 */ 0x7AEA,0x6235, + /* Array index: 0x1424 */ 0x7AED,0x4A66, + /* Array index: 0x1424 */ 0x7AEF,0x532E, + /* Array index: 0x1424 */ 0x7AF6,0x4C66, + /* Array index: 0x1424 */ 0x7AF9,0x7153, + /* Array index: 0x1424 */ 0x7AFA,0x7567, + /* Array index: 0x1424 */ 0x7AFF,0x4A5A, + /* Array index: 0x1424 */ 0x7B0F,0x7B6E, + /* Array index: 0x1424 */ 0x7B11,0x6145, + /* Array index: 0x1424 */ 0x7B19,0x5F69, + /* Array index: 0x1424 */ 0x7B1B,0x6E5E, + /* Array index: 0x1424 */ 0x7B1E,0x7742, + /* Array index: 0x1424 */ 0x7B20,0x5822, + /* Array index: 0x1424 */ 0x7B26,0x5D2C, + /* Array index: 0x1424 */ 0x7B2C,0x702F, + /* Array index: 0x1424 */ 0x7B2D,0x563D, + /* Array index: 0x1424 */ 0x7B39,0x612B, + /* Array index: 0x1424 */ 0x7B46,0x7936, + /* Array index: 0x1424 */ 0x7B60,0x5035, + /* Array index: 0x1424 */ 0x7B6C,0x607E, + /* Array index: 0x1424 */ 0x7B6E,0x5F7B, + /* Array index: 0x1424 */ 0x7B75,0x665D, + /* Array index: 0x1424 */ 0x7B7D,0x6824, + /* Array index: 0x1424 */ 0x7B87,0x4B4D, + /* Array index: 0x1424 */ 0x7B8B,0x6F28, + /* Array index: 0x1424 */ 0x7B8F,0x6E34, + /* Array index: 0x1424 */ 0x7B94,0x5A58, + /* Array index: 0x1424 */ 0x7B95,0x5139, + /* Array index: 0x1424 */ 0x7B97,0x5F29, + /* Array index: 0x1424 */ 0x7B9A,0x7330, + /* Array index: 0x1424 */ 0x7B9D,0x4C44, + /* Array index: 0x1424 */ 0x7BA1,0x4E37, + /* Array index: 0x1424 */ 0x7BAD,0x6F29, + /* Array index: 0x1424 */ 0x7BB1,0x5F55, + /* Array index: 0x1424 */ 0x7BB4,0x6D57, + /* Array index: 0x1424 */ 0x7BB8,0x6E46, + /* Array index: 0x1424 */ 0x7BC0,0x6F3D, + /* Array index: 0x1424 */ 0x7BC1,0x7C56, + /* Array index: 0x1424 */ 0x7BC4,0x5B74, + /* Array index: 0x1424 */ 0x7BC6,0x6F2A, + /* Array index: 0x1424 */ 0x7BC7,0x7839, + /* Array index: 0x1424 */ 0x7BC9,0x7569, + /* Array index: 0x1424 */ 0x7BD2,0x6359, + /* Array index: 0x1424 */ 0x7BE0,0x6146, + /* Array index: 0x1424 */ 0x7BE4,0x543F, + /* Array index: 0x1424 */ 0x7BE9,0x5E68, + /* Array index: 0x1424 */ 0x7C07,0x706A, + /* Array index: 0x1424 */ 0x7C12,0x7342, + /* Array index: 0x1424 */ 0x7C1E,0x532F, + /* Array index: 0x1424 */ 0x7C21,0x4A5B, + /* Array index: 0x1424 */ 0x7C27,0x7C57, + /* Array index: 0x1424 */ 0x7C2A,0x6D58, + /* Array index: 0x1424 */ 0x7C2B,0x6147, + /* Array index: 0x1424 */ 0x7C43,0x553E, + /* Array index: 0x1424 */ 0x7C4C,0x7143, + /* Array index: 0x1424 */ 0x7C4D,0x6E5F, + /* Array index: 0x1424 */ 0x7C60,0x566B, + /* Array index: 0x1424 */ 0x7C64,0x7459, + /* Array index: 0x1424 */ 0x7C6C,0x5766, + /* Array index: 0x1424 */ 0x7C73,0x5A37, + /* Array index: 0x1424 */ 0x7C83,0x5D7B, + /* Array index: 0x1424 */ 0x7C89,0x5D4F, + /* Array index: 0x1424 */ 0x7C92,0x5823, + /* Array index: 0x1424 */ 0x7C95,0x5A59, + /* Array index: 0x1424 */ 0x7C97,0x7058, + /* Array index: 0x1424 */ 0x7C98,0x6F44, + /* Array index: 0x1424 */ 0x7C9F,0x6158, + /* Array index: 0x1424 */ 0x7CA5,0x7154, + /* Array index: 0x1424 */ 0x7CA7,0x6D72, + /* Array index: 0x1424 */ 0x7CAE,0x555B, + /* Array index: 0x1424 */ 0x7CB9,0x6236, + /* Array index: 0x1424 */ 0x7CBE,0x6F71, + /* Array index: 0x1424 */ 0x7CCA,0x7B55, + /* Array index: 0x1424 */ 0x7CD6,0x5358, + /* Array index: 0x1424 */ 0x7CE7,0x555D, + /* Array index: 0x1424 */ 0x7CFB,0x4D27, + /* Array index: 0x1424 */ 0x7CFE,0x502C, + /* Array index: 0x1424 */ 0x7D00,0x513A, + /* Array index: 0x1424 */ 0x7D10,0x526F, + /* Array index: 0x1424 */ 0x7D14,0x626D, + /* Array index: 0x1424 */ 0x7D33,0x636B, + /* Array index: 0x1424 */ 0x7D35,0x6E47, + /* Array index: 0x1424 */ 0x7D39,0x6149, + /* Array index: 0x1424 */ 0x7D3A,0x4A7A, + /* Array index: 0x1424 */ 0x7D50,0x4C3F, + /* Array index: 0x1424 */ 0x7D5E,0x4E6D, + /* Array index: 0x1424 */ 0x7D61,0x5529, + /* Array index: 0x1424 */ 0x7D62,0x7A62, + /* Array index: 0x1424 */ 0x7D66,0x5065, + /* Array index: 0x1424 */ 0x7D68,0x6B56, + /* Array index: 0x1424 */ 0x7D6A,0x6C5F, + /* Array index: 0x1424 */ 0x7D6E,0x5F7C, + /* Array index: 0x1424 */ 0x7D76,0x6F3E, + /* Array index: 0x1424 */ 0x7D79,0x4C35, + /* Array index: 0x1424 */ 0x7D7F,0x4F3D, + /* Array index: 0x1424 */ 0x7D8E,0x6F72, + /* Array index: 0x1424 */ 0x7D8F,0x6237, + /* Array index: 0x1424 */ 0x7D93,0x4C68, + /* Array index: 0x1424 */ 0x7D9C,0x707C, + /* Array index: 0x1424 */ 0x7DA0,0x5660, + /* Array index: 0x1424 */ 0x7DA2,0x7146, + /* Array index: 0x1424 */ 0x7DAC,0x6238, + /* Array index: 0x1424 */ 0x7DAD,0x6B2B, + /* Array index: 0x1424 */ 0x7DB8,0x5746, + /* Array index: 0x1424 */ 0x7DC7,0x7645, + /* Array index: 0x1424 */ 0x7DCA,0x514C, + /* Array index: 0x1424 */ 0x7DCB,0x5D7C, + /* Array index: 0x1424 */ 0x7DD6,0x5F7D, + /* Array index: 0x1424 */ 0x7DD8,0x7965, + /* Array index: 0x1424 */ 0x7DDA,0x604A, + /* Array index: 0x1424 */ 0x7DE8,0x783A, + /* Array index: 0x1424 */ 0x7DE9,0x6850, + /* Array index: 0x1424 */ 0x7DEC,0x587B, + /* Array index: 0x1424 */ 0x7DEF,0x6A55, + /* Array index: 0x1424 */ 0x7DF4,0x5623, + /* Array index: 0x1424 */ 0x7DFB,0x7646, + /* Array index: 0x1424 */ 0x7E09,0x725B, + /* Array index: 0x1424 */ 0x7E0A,0x647C, + /* Array index: 0x1424 */ 0x7E15,0x6832, + /* Array index: 0x1424 */ 0x7E2B,0x5C6E, + /* Array index: 0x1424 */ 0x7E2E,0x756A, + /* Array index: 0x1424 */ 0x7E2F,0x6660, + /* Array index: 0x1424 */ 0x7E31,0x707D, + /* Array index: 0x1424 */ 0x7E37,0x572C, + /* Array index: 0x1424 */ 0x7E3D,0x7545, + /* Array index: 0x1424 */ 0x7E3E,0x6E60, + /* Array index: 0x1424 */ 0x7E41,0x5B65, + /* Array index: 0x1424 */ 0x7E43,0x5D5E, + /* Array index: 0x1424 */ 0x7E46,0x5970, + /* Array index: 0x1424 */ 0x7E47,0x6923, + /* Array index: 0x1424 */ 0x7E52,0x7179, + /* Array index: 0x1424 */ 0x7E54,0x7244, + /* Array index: 0x1424 */ 0x7E55,0x604B, + /* Array index: 0x1424 */ 0x7E5E,0x6924, + /* Array index: 0x1424 */ 0x7E61,0x6239, + /* Array index: 0x1424 */ 0x7E70,0x705B, + /* Array index: 0x1424 */ 0x7E79,0x663A, + /* Array index: 0x1424 */ 0x7E7C,0x4D29, + /* Array index: 0x1424 */ 0x7E82,0x7343, + /* Array index: 0x1424 */ 0x7E8C,0x6159, + /* Array index: 0x1424 */ 0x7E8F,0x6F2B, + /* Array index: 0x1424 */ 0x7E93,0x6745, + /* Array index: 0x1424 */ 0x7E96,0x6069, + /* Array index: 0x1424 */ 0x7E98,0x7345, + /* Array index: 0x1424 */ 0x7E9B,0x5440, + /* Array index: 0x1424 */ 0x7E9C,0x553F, + /* Array index: 0x1424 */ 0x7F36,0x5D2E, + /* Array index: 0x1424 */ 0x7F38,0x797C, + /* Array index: 0x1424 */ 0x7F3A,0x4C40, + /* Array index: 0x1424 */ 0x7F4C,0x6522, + /* Array index: 0x1424 */ 0x7F50,0x4E38, + /* Array index: 0x1424 */ 0x7F54,0x5852, + /* Array index: 0x1424 */ 0x7F55,0x7956, + /* Array index: 0x1424 */ 0x7F6A,0x712A, + /* Array index: 0x1424 */ 0x7F6B,0x4E51, + /* Array index: 0x1424 */ 0x7F6E,0x7647, + /* Array index: 0x1424 */ 0x7F70,0x5B6B, + /* Array index: 0x1424 */ 0x7F72,0x5F7E, + /* Array index: 0x1424 */ 0x7F75,0x5861, + /* Array index: 0x1424 */ 0x7F77,0x7773, + /* Array index: 0x1424 */ 0x7F79,0x5767, + /* Array index: 0x1424 */ 0x7F85,0x547E, + /* Array index: 0x1424 */ 0x7F88,0x513C, + /* Array index: 0x1424 */ 0x7F8A,0x654F, + /* Array index: 0x1424 */ 0x7F8C,0x4B36, + /* Array index: 0x1424 */ 0x7F8E,0x5A38, + /* Array index: 0x1424 */ 0x7F94,0x4D44, + /* Array index: 0x1424 */ 0x7F9A,0x563E, + /* Array index: 0x1424 */ 0x7F9E,0x623A, + /* Array index: 0x1424 */ 0x7FA4,0x4F58, + /* Array index: 0x1424 */ 0x7FA8,0x604C, + /* Array index: 0x1424 */ 0x7FA9,0x6B79, + /* Array index: 0x1424 */ 0x7FB2,0x7D7D, + /* Array index: 0x1424 */ 0x7FB8,0x5768, + /* Array index: 0x1424 */ 0x7FB9,0x4B58, + /* Array index: 0x1424 */ 0x7FBD,0x6962, + /* Array index: 0x1424 */ 0x7FC1,0x683A, + /* Array index: 0x1424 */ 0x7FC5,0x6347, + /* Array index: 0x1424 */ 0x7FCA,0x6C4D, + /* Array index: 0x1424 */ 0x7FCC,0x6C4E, + /* Array index: 0x1424 */ 0x7FCE,0x563F, + /* Array index: 0x1424 */ 0x7FD2,0x6327, + /* Array index: 0x1424 */ 0x7FD4,0x5F56, + /* Array index: 0x1424 */ 0x7FD5,0x7D68, + /* Array index: 0x1424 */ 0x7FE9,0x783B, + /* Array index: 0x1424 */ 0x7FEB,0x6851, + /* Array index: 0x1424 */ 0x7FF0,0x7957, + /* Array index: 0x1424 */ 0x7FF9,0x4E6E, + /* Array index: 0x1424 */ 0x7FFC,0x6C4F, + /* Array index: 0x1424 */ 0x8000,0x6925, + /* Array index: 0x1424 */ 0x8001,0x5655, + /* Array index: 0x1424 */ 0x8003,0x4D45, + /* Array index: 0x1424 */ 0x8005,0x6D3A, + /* Array index: 0x1424 */ 0x8006,0x513D, + /* Array index: 0x1424 */ 0x8009,0x4F3E, + /* Array index: 0x1424 */ 0x800C,0x6C3B, + /* Array index: 0x1424 */ 0x8010,0x5231, + /* Array index: 0x1424 */ 0x8015,0x4C69, + /* Array index: 0x1424 */ 0x8017,0x5944, + /* Array index: 0x1424 */ 0x8018,0x697C, + /* Array index: 0x1424 */ 0x802D,0x513E, + /* Array index: 0x1424 */ 0x8033,0x6C3C, + /* Array index: 0x1424 */ 0x8036,0x652D, + /* Array index: 0x1424 */ 0x803D,0x7730, + /* Array index: 0x1424 */ 0x803F,0x4C6A, + /* Array index: 0x1424 */ 0x8043,0x5344, + /* Array index: 0x1424 */ 0x8046,0x5640, + /* Array index: 0x1424 */ 0x804A,0x567D, + /* Array index: 0x1424 */ 0x8056,0x6121, + /* Array index: 0x1424 */ 0x8058,0x5E3D, + /* Array index: 0x1424 */ 0x805A,0x7629, + /* Array index: 0x1424 */ 0x805E,0x5A24, + /* Array index: 0x1424 */ 0x8077,0x7245, + /* Array index: 0x1424 */ 0x8096,0x752B, + /* Array index: 0x1424 */ 0x809B,0x797D, + /* Array index: 0x1424 */ 0x809D,0x4A5C, + /* Array index: 0x1424 */ 0x80A1,0x4D46, + /* Array index: 0x1424 */ 0x80A2,0x7236, + /* Array index: 0x1424 */ 0x80A5,0x5D7E, + /* Array index: 0x1424 */ 0x80A9,0x4C37, + /* Array index: 0x1424 */ 0x80AA,0x5B38, + /* Array index: 0x1424 */ 0x80AF,0x5069, + /* Array index: 0x1424 */ 0x80B1,0x4E5D, + /* Array index: 0x1424 */ 0x80B2,0x6B40, + /* Array index: 0x1424 */ 0x80B4,0x7D22, + /* Array index: 0x1424 */ 0x80BA,0x784B, + /* Array index: 0x1424 */ 0x80C3,0x6A56, + /* Array index: 0x1424 */ 0x80C4,0x7130, + /* Array index: 0x1424 */ 0x80CC,0x5B4E, + /* Array index: 0x1424 */ 0x80CE,0x7743, + /* Array index: 0x1424 */ 0x80DA,0x5B4F, + /* Array index: 0x1424 */ 0x80DB,0x4B24, + /* Array index: 0x1424 */ 0x80DE,0x7860, + /* Array index: 0x1424 */ 0x80E1,0x7B57, + /* Array index: 0x1424 */ 0x80E4,0x6B4A, + /* Array index: 0x1424 */ 0x80E5,0x6021, + /* Array index: 0x1424 */ 0x80F1,0x4E4D, + /* Array index: 0x1424 */ 0x80F4,0x545C, + /* Array index: 0x1424 */ 0x80F8,0x7D58, + /* Array index: 0x1424 */ 0x80FD,0x5276, + /* Array index: 0x1424 */ 0x8102,0x7237, + /* Array index: 0x1424 */ 0x8118,0x6852, + /* Array index: 0x1424 */ 0x811A,0x4A45, + /* Array index: 0x1424 */ 0x811B,0x4C6B, + /* Array index: 0x1424 */ 0x8123,0x626E, + /* Array index: 0x1424 */ 0x8129,0x623B, + /* Array index: 0x1424 */ 0x812B,0x772D, + /* Array index: 0x1424 */ 0x812F,0x7861, + /* Array index: 0x1424 */ 0x8139,0x736C, + /* Array index: 0x1424 */ 0x813E,0x5E21, + /* Array index: 0x1424 */ 0x814B,0x647D, + /* Array index: 0x1424 */ 0x814E,0x636C, + /* Array index: 0x1424 */ 0x8150,0x5D2F, + /* Array index: 0x1424 */ 0x8151,0x5D30, + /* Array index: 0x1424 */ 0x8154,0x4B37, + /* Array index: 0x1424 */ 0x8155,0x6853, + /* Array index: 0x1424 */ 0x8165,0x6123, + /* Array index: 0x1424 */ 0x8166,0x5260, + /* Array index: 0x1424 */ 0x816B,0x707E, + /* Array index: 0x1424 */ 0x8170,0x6926, + /* Array index: 0x1424 */ 0x8171,0x4B72, + /* Array index: 0x1424 */ 0x817F,0x775A, + /* Array index: 0x1424 */ 0x8180,0x5B39, + /* Array index: 0x1424 */ 0x8188,0x4C2E, + /* Array index: 0x1424 */ 0x818A,0x5A5B, + /* Array index: 0x1424 */ 0x818F,0x4D47, + /* Array index: 0x1424 */ 0x819A,0x5D31, + /* Array index: 0x1424 */ 0x819C,0x582F, + /* Array index: 0x1424 */ 0x819D,0x6323, + /* Array index: 0x1424 */ 0x81A0,0x4E6F, + /* Array index: 0x1424 */ 0x81A3,0x7273, + /* Array index: 0x1424 */ 0x81A8,0x7833, + /* Array index: 0x1424 */ 0x81B3,0x604E, + /* Array index: 0x1424 */ 0x81B5,0x757D, + /* Array index: 0x1424 */ 0x81BA,0x6B6C, + /* Array index: 0x1424 */ 0x81C6,0x6566, + /* Array index: 0x1424 */ 0x81CD,0x7030, + /* Array index: 0x1424 */ 0x81D8,0x5544, + /* Array index: 0x1424 */ 0x81DF,0x6D74, + /* Array index: 0x1424 */ 0x81E3,0x636D, + /* Array index: 0x1424 */ 0x81E5,0x6842, + /* Array index: 0x1424 */ 0x81E7,0x6D75, + /* Array index: 0x1424 */ 0x81E8,0x577C, + /* Array index: 0x1424 */ 0x81EA,0x6D3B, + /* Array index: 0x1424 */ 0x81ED,0x762B, + /* Array index: 0x1424 */ 0x81F3,0x7238, + /* Array index: 0x1424 */ 0x81F4,0x7648, + /* Array index: 0x1424 */ 0x8205,0x4F40, + /* Array index: 0x1424 */ 0x8207,0x6628, + /* Array index: 0x1424 */ 0x8208,0x7D69, + /* Array index: 0x1424 */ 0x820A,0x4F41, + /* Array index: 0x1424 */ 0x820C,0x605F, + /* Array index: 0x1424 */ 0x820D,0x5E6C, + /* Array index: 0x1424 */ 0x8212,0x6022, + /* Array index: 0x1424 */ 0x8240,0x5D32, + /* Array index: 0x1424 */ 0x8245,0x6629, + /* Array index: 0x1424 */ 0x8247,0x6F73, + /* Array index: 0x1424 */ 0x8259,0x736D, + /* Array index: 0x1424 */ 0x8264,0x6B7A, + /* Array index: 0x1424 */ 0x8266,0x7966, + /* Array index: 0x1424 */ 0x8276,0x667D, + /* Array index: 0x1424 */ 0x8278,0x752C, + /* Array index: 0x1424 */ 0x827E,0x6475, + /* Array index: 0x1424 */ 0x828B,0x6963, + /* Array index: 0x1424 */ 0x828D,0x6D4B, + /* Array index: 0x1424 */ 0x828E,0x4F64, + /* Array index: 0x1424 */ 0x8292,0x5853, + /* Array index: 0x1424 */ 0x8299,0x5D33, + /* Array index: 0x1424 */ 0x829A,0x546C, + /* Array index: 0x1424 */ 0x829D,0x7239, + /* Array index: 0x1424 */ 0x829F,0x5F37, + /* Array index: 0x1424 */ 0x82A5,0x4B4E, + /* Array index: 0x1424 */ 0x82A6,0x7B58, + /* Array index: 0x1424 */ 0x82A9,0x5059, + /* Array index: 0x1424 */ 0x82DB,0x4A34, + /* Array index: 0x1424 */ 0x82DE,0x7862, + /* Array index: 0x1424 */ 0x82DF,0x4F42, + /* Array index: 0x1424 */ 0x82E1,0x6C3E, + /* Array index: 0x1424 */ 0x82F1,0x6748, + /* Array index: 0x1424 */ 0x8309,0x5849, + /* Array index: 0x1424 */ 0x8317,0x592B, + /* Array index: 0x1424 */ 0x8328,0x6D3C, + /* Array index: 0x1424 */ 0x832B,0x5854, + /* Array index: 0x1424 */ 0x832F,0x5C5A, + /* Array index: 0x1424 */ 0x8331,0x623C, + /* Array index: 0x1424 */ 0x8340,0x6270, + /* Array index: 0x1424 */ 0x8347,0x7A3B, + /* Array index: 0x1424 */ 0x8349,0x752E, + /* Array index: 0x1424 */ 0x834A,0x7B2A, + /* Array index: 0x1424 */ 0x834F,0x6C7B, + /* Array index: 0x1424 */ 0x8351,0x6C3F, + /* Array index: 0x1424 */ 0x8352,0x7C58, + /* Array index: 0x1424 */ 0x8373,0x5465, + /* Array index: 0x1424 */ 0x8377,0x7943, + /* Array index: 0x1424 */ 0x837B,0x6E62, + /* Array index: 0x1424 */ 0x8389,0x5769, + /* Array index: 0x1424 */ 0x838A,0x6D76, + /* Array index: 0x1424 */ 0x838E,0x5E6D, + /* Array index: 0x1424 */ 0x8396,0x4C6C, + /* Array index: 0x1424 */ 0x8398,0x636E, + /* Array index: 0x1424 */ 0x839E,0x6854, + /* Array index: 0x1424 */ 0x83A2,0x7A78, + /* Array index: 0x1424 */ 0x83BD,0x5855, + /* Array index: 0x1424 */ 0x83C1,0x746A, + /* Array index: 0x1424 */ 0x83C5,0x4E39, + /* Array index: 0x1424 */ 0x83C9,0x5661, + /* Array index: 0x1424 */ 0x83CA,0x4F52, + /* Array index: 0x1424 */ 0x83CC,0x5036, + /* Array index: 0x1424 */ 0x83D3,0x4E22, + /* Array index: 0x1424 */ 0x83D6,0x736E, + /* Array index: 0x1424 */ 0x83DC,0x7378, + /* Array index: 0x1424 */ 0x83E9,0x5C4C, + /* Array index: 0x1424 */ 0x83EB,0x504B, + /* Array index: 0x1424 */ 0x83F9,0x6E49, + /* Array index: 0x1424 */ 0x83FD,0x625D, + /* Array index: 0x1424 */ 0x8403,0x757E, + /* Array index: 0x1424 */ 0x8404,0x542C, + /* Array index: 0x1424 */ 0x8429,0x7557, + /* Array index: 0x1424 */ 0x842C,0x583F, + /* Array index: 0x1424 */ 0x8431,0x7D40, + /* Array index: 0x1424 */ 0x8438,0x6B2D, + /* Array index: 0x1424 */ 0x843D,0x552A, + /* Array index: 0x1424 */ 0x8449,0x6728, + /* Array index: 0x1424 */ 0x8457,0x6E4A, + /* Array index: 0x1424 */ 0x845B,0x4A67, + /* Array index: 0x1424 */ 0x8461,0x7863, + /* Array index: 0x1424 */ 0x8463,0x545D, + /* Array index: 0x1424 */ 0x8466,0x6A58, + /* Array index: 0x1424 */ 0x846B,0x7B59, + /* Array index: 0x1424 */ 0x846C,0x6D77, + /* Array index: 0x1424 */ 0x846F,0x6535, + /* Array index: 0x1424 */ 0x8475,0x502D, + /* Array index: 0x1424 */ 0x847A,0x7171, + /* Array index: 0x1424 */ 0x8490,0x623D, + /* Array index: 0x1424 */ 0x8494,0x6348, + /* Array index: 0x1424 */ 0x8499,0x5955, + /* Array index: 0x1424 */ 0x849C,0x5F2A, + /* Array index: 0x1424 */ 0x84A1,0x5B3C, + /* Array index: 0x1424 */ 0x84B2,0x7864, + /* Array index: 0x1424 */ 0x84B8,0x717A, + /* Array index: 0x1424 */ 0x84BB,0x6536, + /* Array index: 0x1424 */ 0x84BC,0x736F, + /* Array index: 0x1424 */ 0x84BF,0x7B5A, + /* Array index: 0x1424 */ 0x84C0,0x6160, + /* Array index: 0x1424 */ 0x84C2,0x592C, + /* Array index: 0x1424 */ 0x84C4,0x756B, + /* Array index: 0x1424 */ 0x84C6,0x6036, + /* Array index: 0x1424 */ 0x84C9,0x6948, + /* Array index: 0x1424 */ 0x84CB,0x4B4F, + /* Array index: 0x1424 */ 0x84CD,0x6349, + /* Array index: 0x1424 */ 0x84D1,0x5E6E, + /* Array index: 0x1424 */ 0x84DA,0x623E, + /* Array index: 0x1424 */ 0x84EC,0x5C6F, + /* Array index: 0x1424 */ 0x84EE,0x5625, + /* Array index: 0x1424 */ 0x84F4,0x6271, + /* Array index: 0x1424 */ 0x84FC,0x567E, + /* Array index: 0x1424 */ 0x8511,0x5921, + /* Array index: 0x1424 */ 0x8513,0x5840, + /* Array index: 0x1424 */ 0x8514,0x5C5B, + /* Array index: 0x1424 */ 0x8517,0x6D3D, + /* Array index: 0x1424 */ 0x8518,0x5F38, + /* Array index: 0x1424 */ 0x851A,0x6A25, + /* Array index: 0x1424 */ 0x851E,0x572D, + /* Array index: 0x1424 */ 0x8521,0x7379, + /* Array index: 0x1424 */ 0x8523,0x6D78, + /* Array index: 0x1424 */ 0x8525,0x7547, + /* Array index: 0x1424 */ 0x852C,0x614A, + /* Array index: 0x1424 */ 0x852D,0x6B63, + /* Array index: 0x1424 */ 0x852F,0x725E, + /* Array index: 0x1424 */ 0x853D,0x784C, + /* Array index: 0x1424 */ 0x853F,0x6A59, + /* Array index: 0x1424 */ 0x8541,0x5346, + /* Array index: 0x1424 */ 0x8543,0x5B66, + /* Array index: 0x1424 */ 0x8549,0x752F, + /* Array index: 0x1424 */ 0x854E,0x4E70, + /* Array index: 0x1424 */ 0x8553,0x697E, + /* Array index: 0x1424 */ 0x8559,0x7B36, + /* Array index: 0x1424 */ 0x8563,0x6272, + /* Array index: 0x1424 */ 0x856D,0x614B, + /* Array index: 0x1424 */ 0x8584,0x5A5D, + /* Array index: 0x1424 */ 0x8587,0x5A39, + /* Array index: 0x1424 */ 0x858F,0x6B7B, + /* Array index: 0x1424 */ 0x8591,0x4B39, + /* Array index: 0x1424 */ 0x8594,0x6D79, + /* Array index: 0x1424 */ 0x859B,0x6060, + /* Array index: 0x1424 */ 0x85AF,0x6023, + /* Array index: 0x1424 */ 0x85B0,0x7D39, + /* Array index: 0x1424 */ 0x85BA,0x7031, + /* Array index: 0x1424 */ 0x85C1,0x4D4B, + /* Array index: 0x1424 */ 0x85C9,0x6D3E, + /* Array index: 0x1424 */ 0x85D5,0x6964, + /* Array index: 0x1424 */ 0x85DC,0x556D, + /* Array index: 0x1424 */ 0x85DD,0x675D, + /* Array index: 0x1424 */ 0x85E4,0x5476, + /* Array index: 0x1424 */ 0x85E5,0x6537, + /* Array index: 0x1424 */ 0x85E9,0x5B67, + /* Array index: 0x1424 */ 0x85EA,0x623F, + /* Array index: 0x1424 */ 0x85F7,0x6E4B, + /* Array index: 0x1424 */ 0x85FA,0x5774, + /* Array index: 0x1424 */ 0x85FB,0x705D, + /* Array index: 0x1424 */ 0x85FF,0x4E2B, + /* Array index: 0x1424 */ 0x8602,0x675E, + /* Array index: 0x1424 */ 0x8606,0x5656, + /* Array index: 0x1424 */ 0x8607,0x614C, + /* Array index: 0x1424 */ 0x860A,0x6833, + /* Array index: 0x1424 */ 0x8616,0x656E, + /* Array index: 0x1424 */ 0x8617,0x5C22, + /* Array index: 0x1424 */ 0x861A,0x6050, + /* Array index: 0x1424 */ 0x862D,0x5535, + /* Array index: 0x1424 */ 0x863F,0x5521, + /* Array index: 0x1424 */ 0x864E,0x7B5B, + /* Array index: 0x1424 */ 0x8650,0x794B, + /* Array index: 0x1424 */ 0x8654,0x4B73, + /* Array index: 0x1424 */ 0x8655,0x7425, + /* Array index: 0x1424 */ 0x8667,0x7D50, + /* Array index: 0x1424 */ 0x8679,0x7B76, + /* Array index: 0x1424 */ 0x868A,0x5A25, + /* Array index: 0x1424 */ 0x868C,0x5B3D, + /* Array index: 0x1424 */ 0x8693,0x6C62, + /* Array index: 0x1424 */ 0x86A3,0x4D77, + /* Array index: 0x1424 */ 0x86A4,0x705E, + /* Array index: 0x1424 */ 0x86A9,0x7649, + /* Array index: 0x1424 */ 0x86C7,0x5E6F, + /* Array index: 0x1424 */ 0x86CB,0x5331, + /* Array index: 0x1424 */ 0x86D4,0x7C6E, + /* Array index: 0x1424 */ 0x86D9,0x6843, + /* Array index: 0x1424 */ 0x86DB,0x7148, + /* Array index: 0x1424 */ 0x86DF,0x4E71, + /* Array index: 0x1424 */ 0x86E4,0x796D, + /* Array index: 0x1424 */ 0x86ED,0x7274, + /* Array index: 0x1424 */ 0x86FE,0x6436, + /* Array index: 0x1424 */ 0x8700,0x7539, + /* Array index: 0x1424 */ 0x8702,0x5C70, + /* Array index: 0x1424 */ 0x8703,0x6371, + /* Array index: 0x1424 */ 0x8708,0x6825, + /* Array index: 0x1424 */ 0x8718,0x723B, + /* Array index: 0x1424 */ 0x871A,0x5E24, + /* Array index: 0x1424 */ 0x871C,0x5A4C, + /* Array index: 0x1424 */ 0x874E,0x4A69, + /* Array index: 0x1424 */ 0x8755,0x635A, + /* Array index: 0x1424 */ 0x8757,0x7C59, + /* Array index: 0x1424 */ 0x875F,0x6A5A, + /* Array index: 0x1424 */ 0x8766,0x7944, + /* Array index: 0x1424 */ 0x8768,0x6324, + /* Array index: 0x1424 */ 0x8774,0x7B5D, + /* Array index: 0x1424 */ 0x8776,0x6F4A, + /* Array index: 0x1424 */ 0x8778,0x6844, + /* Array index: 0x1424 */ 0x8782,0x554C, + /* Array index: 0x1424 */ 0x878D,0x6B57, + /* Array index: 0x1424 */ 0x879F,0x592D, + /* Array index: 0x1424 */ 0x87A2,0x7B2B, + /* Array index: 0x1424 */ 0x87B3,0x5359, + /* Array index: 0x1424 */ 0x87BA,0x5522, + /* Array index: 0x1424 */ 0x87C4,0x765E, + /* Array index: 0x1424 */ 0x87E0,0x5A76, + /* Array index: 0x1424 */ 0x87EC,0x6051, + /* Array index: 0x1424 */ 0x87EF,0x6928, + /* Array index: 0x1424 */ 0x87F2,0x7579, + /* Array index: 0x1424 */ 0x87F9,0x7A2F, + /* Array index: 0x1424 */ 0x87FB,0x6B7C, + /* Array index: 0x1424 */ 0x87FE,0x606A, + /* Array index: 0x1424 */ 0x8805,0x6332, + /* Array index: 0x1424 */ 0x881F,0x5545, + /* Array index: 0x1424 */ 0x8822,0x7163, + /* Array index: 0x1424 */ 0x8823,0x556E, + /* Array index: 0x1424 */ 0x8831,0x4D4C, + /* Array index: 0x1424 */ 0x8836,0x6D59, + /* Array index: 0x1424 */ 0x883B,0x5841, + /* Array index: 0x1424 */ 0x8840,0x7A6C, + /* Array index: 0x1424 */ 0x8846,0x716B, + /* Array index: 0x1424 */ 0x884C,0x7A3C, + /* Array index: 0x1424 */ 0x884D,0x6662, + /* Array index: 0x1424 */ 0x8852,0x7A65, + /* Array index: 0x1424 */ 0x8853,0x627A, + /* Array index: 0x1424 */ 0x8857,0x4A36, + /* Array index: 0x1424 */ 0x8859,0x6437, + /* Array index: 0x1424 */ 0x885B,0x6A5B, + /* Array index: 0x1424 */ 0x885D,0x757A, + /* Array index: 0x1424 */ 0x8868,0x787A, + /* Array index: 0x1424 */ 0x886B,0x5F39, + /* Array index: 0x1424 */ 0x8870,0x6171, + /* Array index: 0x1424 */ 0x8872,0x5224, + /* Array index: 0x1424 */ 0x8877,0x757B, + /* Array index: 0x1424 */ 0x8888,0x4A37, + /* Array index: 0x1424 */ 0x888B,0x5367, + /* Array index: 0x1424 */ 0x888D,0x7865, + /* Array index: 0x1424 */ 0x8892,0x5332, + /* Array index: 0x1424 */ 0x8896,0x6240, + /* Array index: 0x1424 */ 0x8897,0x725F, + /* Array index: 0x1424 */ 0x889E,0x4D65, + /* Array index: 0x1424 */ 0x88AB,0x792C, + /* Array index: 0x1424 */ 0x88B4,0x4D4D, + /* Array index: 0x1424 */ 0x88C1,0x6E2E, + /* Array index: 0x1424 */ 0x88C2,0x562E, + /* Array index: 0x1424 */ 0x88CF,0x576A, + /* Array index: 0x1424 */ 0x88D4,0x6760, + /* Array index: 0x1424 */ 0x88D5,0x6B2E, + /* Array index: 0x1424 */ 0x88D9,0x4F59, + /* Array index: 0x1424 */ 0x88DC,0x5C4D, + /* Array index: 0x1424 */ 0x88DD,0x6D7B, + /* Array index: 0x1424 */ 0x88DF,0x5E70, + /* Array index: 0x1424 */ 0x88E1,0x576B, + /* Array index: 0x1424 */ 0x88E8,0x5E25, + /* Array index: 0x1424 */ 0x88F8,0x5523, + /* Array index: 0x1424 */ 0x88FD,0x7032, + /* Array index: 0x1424 */ 0x8907,0x5C5C, + /* Array index: 0x1424 */ 0x8910,0x4A68, + /* Array index: 0x1424 */ 0x8912,0x7866, + /* Array index: 0x1424 */ 0x8913,0x5C4E, + /* Array index: 0x1424 */ 0x8918,0x6A5C, + /* Array index: 0x1424 */ 0x8919,0x5B52, + /* Array index: 0x1424 */ 0x8925,0x6933, + /* Array index: 0x1424 */ 0x892A,0x775B, + /* Array index: 0x1424 */ 0x8936,0x6328, + /* Array index: 0x1424 */ 0x8938,0x572E, + /* Array index: 0x1424 */ 0x893B,0x6061, + /* Array index: 0x1424 */ 0x8941,0x4B3A, + /* Array index: 0x1424 */ 0x8944,0x6551, + /* Array index: 0x1424 */ 0x895F,0x505C, + /* Array index: 0x1424 */ 0x8964,0x5541, + /* Array index: 0x1424 */ 0x896A,0x584A, + /* Array index: 0x1424 */ 0x8972,0x6329, + /* Array index: 0x1424 */ 0x897F,0x6024, + /* Array index: 0x1424 */ 0x8981,0x6929, + /* Array index: 0x1424 */ 0x8983,0x5347, + /* Array index: 0x1424 */ 0x8986,0x5C5D, + /* Array index: 0x1424 */ 0x8987,0x782E, + /* Array index: 0x1424 */ 0x898B,0x4C38, + /* Array index: 0x1424 */ 0x898F,0x502E, + /* Array index: 0x1424 */ 0x8993,0x5872, + /* Array index: 0x1424 */ 0x8996,0x634A, + /* Array index: 0x1424 */ 0x89A1,0x4C2F, + /* Array index: 0x1424 */ 0x89A9,0x542D, + /* Array index: 0x1424 */ 0x89AA,0x7651, + /* Array index: 0x1424 */ 0x89B2,0x504C, + /* Array index: 0x1424 */ 0x89BA,0x4A46, + /* Array index: 0x1424 */ 0x89BD,0x5542, + /* Array index: 0x1424 */ 0x89C0,0x4E3A, + /* Array index: 0x1424 */ 0x89D2,0x4A47, + /* Array index: 0x1424 */ 0x89E3,0x7A30, + /* Array index: 0x1424 */ 0x89F4,0x5F58, + /* Array index: 0x1424 */ 0x89F8,0x753A, + /* Array index: 0x1424 */ 0x8A00,0x656B, + /* Array index: 0x1424 */ 0x8A02,0x6F74, + /* Array index: 0x1424 */ 0x8A03,0x5D35, + /* Array index: 0x1424 */ 0x8A08,0x4D2A, + /* Array index: 0x1424 */ 0x8A0A,0x6372, + /* Array index: 0x1424 */ 0x8A0C,0x7B77, + /* Array index: 0x1424 */ 0x8A0E,0x7750, + /* Array index: 0x1424 */ 0x8A13,0x7D3A, + /* Array index: 0x1424 */ 0x8A1B,0x6845, + /* Array index: 0x1424 */ 0x8A1D,0x6438, + /* Array index: 0x1424 */ 0x8A1F,0x6168, + /* Array index: 0x1424 */ 0x8A23,0x4C41, + /* Array index: 0x1424 */ 0x8A25,0x526D, + /* Array index: 0x1424 */ 0x8A2A,0x5B3E, + /* Array index: 0x1424 */ 0x8A2D,0x6062, + /* Array index: 0x1424 */ 0x8A31,0x7A49, + /* Array index: 0x1424 */ 0x8A34,0x614D, + /* Array index: 0x1424 */ 0x8A36,0x4A38, + /* Array index: 0x1424 */ 0x8A3A,0x7260, + /* Array index: 0x1424 */ 0x8A3B,0x7149, + /* Array index: 0x1424 */ 0x8A50,0x5E71, + /* Array index: 0x1424 */ 0x8A54,0x705F, + /* Array index: 0x1424 */ 0x8A55,0x7844, + /* Array index: 0x1424 */ 0x8A5B,0x6E4C, + /* Array index: 0x1424 */ 0x8A5E,0x5E72, + /* Array index: 0x1424 */ 0x8A60,0x6749, + /* Array index: 0x1424 */ 0x8A62,0x6273, + /* Array index: 0x1424 */ 0x8A63,0x6761, + /* Array index: 0x1424 */ 0x8A66,0x634B, + /* Array index: 0x1424 */ 0x8A69,0x634C, + /* Array index: 0x1424 */ 0x8A79,0x745A, + /* Array index: 0x1424 */ 0x8A85,0x714A, + /* Array index: 0x1424 */ 0x8A87,0x4E23, + /* Array index: 0x1424 */ 0x8A8C,0x723C, + /* Array index: 0x1424 */ 0x8A8D,0x6C63, + /* Array index: 0x1424 */ 0x8A93,0x6025, + /* Array index: 0x1424 */ 0x8A95,0x772B, + /* Array index: 0x1424 */ 0x8A98,0x6B2F, + /* Array index: 0x1424 */ 0x8A9E,0x655E, + /* Array index: 0x1424 */ 0x8AB0,0x6241, + /* Array index: 0x1424 */ 0x8AB2,0x4E24, + /* Array index: 0x1424 */ 0x8AB9,0x5E26, + /* Array index: 0x1424 */ 0x8ABC,0x6B7E, + /* Array index: 0x1424 */ 0x8ABE,0x6B5D, + /* Array index: 0x1424 */ 0x8ABF,0x7060, + /* Array index: 0x1424 */ 0x8AC2,0x745B, + /* Array index: 0x1424 */ 0x8AC4,0x6274, + /* Array index: 0x1424 */ 0x8AC7,0x5348, + /* Array index: 0x1424 */ 0x8ACB,0x746B, + /* Array index: 0x1424 */ 0x8ACD,0x6E35, + /* Array index: 0x1424 */ 0x8ACF,0x7558, + /* Array index: 0x1424 */ 0x8AD2,0x555F, + /* Array index: 0x1424 */ 0x8AD6,0x5665, + /* Array index: 0x1424 */ 0x8ADB,0x6B30, + /* Array index: 0x1424 */ 0x8ADC,0x7463, + /* Array index: 0x1424 */ 0x8AE1,0x634D, + /* Array index: 0x1424 */ 0x8AE6,0x7474, + /* Array index: 0x1424 */ 0x8AE7,0x7A32, + /* Array index: 0x1424 */ 0x8AF1,0x7D49, + /* Array index: 0x1424 */ 0x8B0E,0x5A3A, + /* Array index: 0x1424 */ 0x8B10,0x5A4D, + /* Array index: 0x1424 */ 0x8B14,0x794C, + /* Array index: 0x1424 */ 0x8B20,0x692A, + /* Array index: 0x1424 */ 0x8B28,0x5948, + /* Array index: 0x1424 */ 0x8B2B,0x6E63, + /* Array index: 0x1424 */ 0x8B2C,0x573D, + /* Array index: 0x1424 */ 0x8B33,0x4F44, + /* Array index: 0x1424 */ 0x8B39,0x504D, + /* Array index: 0x1424 */ 0x8B41,0x7C26, + /* Array index: 0x1424 */ 0x8B49,0x717B, + /* Array index: 0x1424 */ 0x8B4E,0x7D52, + /* Array index: 0x1424 */ 0x8B4F,0x5141, + /* Array index: 0x1424 */ 0x8B58,0x635B, + /* Array index: 0x1424 */ 0x8B5A,0x5349, + /* Array index: 0x1424 */ 0x8B5C,0x5C4F, + /* Array index: 0x1424 */ 0x8B66,0x4C6D, + /* Array index: 0x1424 */ 0x8B6C,0x5E27, + /* Array index: 0x1424 */ 0x8B6F,0x663B, + /* Array index: 0x1424 */ 0x8B70,0x6C21, + /* Array index: 0x1424 */ 0x8B74,0x4C39, + /* Array index: 0x1424 */ 0x8B77,0x7B5E, + /* Array index: 0x1424 */ 0x8B7D,0x6762, + /* Array index: 0x1424 */ 0x8B80,0x5441, + /* Array index: 0x1424 */ 0x8B8A,0x5C28, + /* Array index: 0x1424 */ 0x8B90,0x6242, + /* Array index: 0x1424 */ 0x8B92,0x7358, + /* Array index: 0x1424 */ 0x8B93,0x6553, + /* Array index: 0x1424 */ 0x8B96,0x7359, + /* Array index: 0x1424 */ 0x8B9A,0x7346, + /* Array index: 0x1424 */ 0x8C37,0x4D5B, + /* Array index: 0x1424 */ 0x8C3F,0x4D2C, + /* Array index: 0x1424 */ 0x8C41,0x7C43, + /* Array index: 0x1424 */ 0x8C46,0x5467, + /* Array index: 0x1424 */ 0x8C48,0x5142, + /* Array index: 0x1424 */ 0x8C4A,0x7925, + /* Array index: 0x1424 */ 0x8C4C,0x6855, + /* Array index: 0x1424 */ 0x8C55,0x634E, + /* Array index: 0x1424 */ 0x8C5A,0x544A, + /* Array index: 0x1424 */ 0x8C61,0x5F5A, + /* Array index: 0x1424 */ 0x8C6A,0x7B5F, + /* Array index: 0x1424 */ 0x8C6B,0x6763, + /* Array index: 0x1424 */ 0x8C79,0x787B, + /* Array index: 0x1424 */ 0x8C7A,0x634F, + /* Array index: 0x1424 */ 0x8C82,0x7530, + /* Array index: 0x1424 */ 0x8C8A,0x5867, + /* Array index: 0x1424 */ 0x8C8C,0x5949, + /* Array index: 0x1424 */ 0x8CD1,0x7261, + /* Array index: 0x1424 */ 0x8CD3,0x5E39, + /* Array index: 0x1424 */ 0x8CDA,0x5672, + /* Array index: 0x1424 */ 0x8CDC,0x5E74, + /* Array index: 0x1424 */ 0x8CDE,0x5F5B, + /* Array index: 0x1424 */ 0x8CEA,0x7275, + /* Array index: 0x1424 */ 0x8CED,0x542E, + /* Array index: 0x1424 */ 0x8CF4,0x5673, + /* Array index: 0x1424 */ 0x8D0D,0x606B, + /* Array index: 0x1424 */ 0x8D13,0x6D7C, + /* Array index: 0x1424 */ 0x8D16,0x615B, + /* Array index: 0x1424 */ 0x8D64,0x6E65, + /* Array index: 0x1424 */ 0x8D66,0x5E75, + /* Array index: 0x1424 */ 0x8D6B,0x7A53, + /* Array index: 0x1424 */ 0x8D70,0x714B, + /* Array index: 0x1424 */ 0x8D73,0x502F, + /* Array index: 0x1424 */ 0x8D74,0x5D39, + /* Array index: 0x1424 */ 0x8D77,0x5143, + /* Array index: 0x1424 */ 0x8D85,0x7531, + /* Array index: 0x1424 */ 0x8D8A,0x6A46, + /* Array index: 0x1424 */ 0x8D99,0x7061, + /* Array index: 0x1424 */ 0x8DA3,0x762C, + /* Array index: 0x1424 */ 0x8DA8,0x7559, + /* Array index: 0x1424 */ 0x8DB3,0x706B, + /* Array index: 0x1424 */ 0x8DBA,0x5D3A, + /* Array index: 0x1424 */ 0x8DBE,0x723F, + /* Array index: 0x1424 */ 0x8DC6,0x7745, + /* Array index: 0x1424 */ 0x8DCB,0x5B22, + /* Array index: 0x1424 */ 0x8DCC,0x7276, + /* Array index: 0x1424 */ 0x8DCF,0x4A3A, + /* Array index: 0x1424 */ 0x8DDB,0x7775, + /* Array index: 0x1424 */ 0x8DDD,0x4B65, + /* Array index: 0x1424 */ 0x8DE1,0x6E66, + /* Array index: 0x1424 */ 0x8DE3,0x6053, + /* Array index: 0x1424 */ 0x8DE8,0x4E25, + /* Array index: 0x1424 */ 0x8DEF,0x5658, + /* Array index: 0x1424 */ 0x8DF3,0x542F, + /* Array index: 0x1424 */ 0x8E0A,0x6949, + /* Array index: 0x1424 */ 0x8E0F,0x534E, + /* Array index: 0x1424 */ 0x8E10,0x7442, + /* Array index: 0x1424 */ 0x8E1E,0x4B66, + /* Array index: 0x1424 */ 0x8E2A,0x7121, + /* Array index: 0x1424 */ 0x8E30,0x6B32, + /* Array index: 0x1424 */ 0x8E35,0x7122, + /* Array index: 0x1424 */ 0x8E42,0x6B33, + /* Array index: 0x1424 */ 0x8E44,0x7034, + /* Array index: 0x1424 */ 0x8E59,0x756C, + /* Array index: 0x1424 */ 0x8E5F,0x6E67, + /* Array index: 0x1424 */ 0x8E60,0x7432, + /* Array index: 0x1424 */ 0x8E74,0x756D, + /* Array index: 0x1424 */ 0x8E76,0x4F73, + /* Array index: 0x1424 */ 0x8E81,0x7062, + /* Array index: 0x1424 */ 0x8E87,0x6E4E, + /* Array index: 0x1424 */ 0x8E8A,0x714C, + /* Array index: 0x1424 */ 0x8E8D,0x6538, + /* Array index: 0x1424 */ 0x8EC0,0x4F46, + /* Array index: 0x1424 */ 0x8ED2,0x7A4D, + /* Array index: 0x1424 */ 0x8EDF,0x6663, + /* Array index: 0x1424 */ 0x8EEB,0x7262, + /* Array index: 0x1424 */ 0x8EF8,0x756E, + /* Array index: 0x1424 */ 0x8EFB,0x4A3B, + /* Array index: 0x1424 */ 0x8EFE,0x635C, + /* Array index: 0x1424 */ 0x8F03,0x4E72, + /* Array index: 0x1424 */ 0x8F05,0x5659, + /* Array index: 0x1424 */ 0x8F09,0x6E30, + /* Array index: 0x1424 */ 0x8F2F,0x727E, + /* Array index: 0x1424 */ 0x8F33,0x714D, + /* Array index: 0x1424 */ 0x8F38,0x6243, + /* Array index: 0x1424 */ 0x8F39,0x5C5E, + /* Array index: 0x1424 */ 0x8F3B,0x5C5F, + /* Array index: 0x1424 */ 0x8F3E,0x6F2D, + /* Array index: 0x1424 */ 0x8F3F,0x662B, + /* Array index: 0x1424 */ 0x8F44,0x795D, + /* Array index: 0x1424 */ 0x8F45,0x6A3F, + /* Array index: 0x1424 */ 0x8F49,0x6F2E, + /* Array index: 0x1424 */ 0x8F4D,0x7450, + /* Array index: 0x1424 */ 0x8F4E,0x4E73, + /* Array index: 0x1424 */ 0x8F5D,0x662C, + /* Array index: 0x1424 */ 0x8F5F,0x4E5E, + /* Array index: 0x1424 */ 0x8F62,0x5579, + /* Array index: 0x1424 */ 0x8F9B,0x6374, + /* Array index: 0x1424 */ 0x8F9C,0x4D50, + /* Array index: 0x1424 */ 0x8FA3,0x5538, + /* Array index: 0x1424 */ 0x8FA6,0x777D, + /* Array index: 0x1424 */ 0x8FA8,0x5C29, + /* Array index: 0x1424 */ 0x8FC2,0x6966, + /* Array index: 0x1424 */ 0x8FC5,0x6376, + /* Array index: 0x1424 */ 0x8FCE,0x674A, + /* Array index: 0x1424 */ 0x8FD1,0x504E, + /* Array index: 0x1424 */ 0x8FD4,0x5A77, + /* Array index: 0x1424 */ 0x8FE6,0x4A3C, + /* Array index: 0x1424 */ 0x8FEA,0x6E68, + /* Array index: 0x1424 */ 0x8FEB,0x5A5E, + /* Array index: 0x1424 */ 0x8FED,0x7277, + /* Array index: 0x1424 */ 0x8FF0,0x627B, + /* Array index: 0x1424 */ 0x8FF2,0x4C26, + /* Array index: 0x1424 */ 0x8FF7,0x5A3B, + /* Array index: 0x1424 */ 0x8FF9,0x6E69, + /* Array index: 0x1424 */ 0x8FFD,0x755A, + /* Array index: 0x1424 */ 0x900B,0x7867, + /* Array index: 0x1424 */ 0x902E,0x7475, + /* Array index: 0x1424 */ 0x9031,0x714E, + /* Array index: 0x1424 */ 0x9032,0x7264, + /* Array index: 0x1424 */ 0x9035,0x5030, + /* Array index: 0x1424 */ 0x9038,0x6C6F, + /* Array index: 0x1424 */ 0x903C,0x793A, + /* Array index: 0x1424 */ 0x903E,0x6B35, + /* Array index: 0x1424 */ 0x9041,0x546D, + /* Array index: 0x1424 */ 0x9042,0x6244, + /* Array index: 0x1424 */ 0x9047,0x6967, + /* Array index: 0x1424 */ 0x9059,0x692B, + /* Array index: 0x1424 */ 0x9069,0x6E6A, + /* Array index: 0x1424 */ 0x9072,0x7240, + /* Array index: 0x1424 */ 0x9075,0x7165, + /* Array index: 0x1424 */ 0x9077,0x7443, + /* Array index: 0x1424 */ 0x9078,0x6054, + /* Array index: 0x1424 */ 0x907A,0x6B36, + /* Array index: 0x1424 */ 0x908F,0x5524, + /* Array index: 0x1424 */ 0x9091,0x6B69, + /* Array index: 0x1424 */ 0x9095,0x683B, + /* Array index: 0x1424 */ 0x9099,0x5857, + /* Array index: 0x1424 */ 0x90A2,0x7B2E, + /* Array index: 0x1424 */ 0x90A3,0x5161, + /* Array index: 0x1424 */ 0x90A6,0x5B40, + /* Array index: 0x1424 */ 0x90A8,0x753E, + /* Array index: 0x1424 */ 0x90AA,0x5E77, + /* Array index: 0x1424 */ 0x90B5,0x6150, + /* Array index: 0x1424 */ 0x90B8,0x6E50, + /* Array index: 0x1424 */ 0x90C1,0x6974, + /* Array index: 0x1424 */ 0x90CA,0x4E74, + /* Array index: 0x1424 */ 0x90DE,0x554D, + /* Array index: 0x1424 */ 0x90E1,0x4F5B, + /* Array index: 0x1424 */ 0x90E8,0x5D3B, + /* Array index: 0x1424 */ 0x90ED,0x4E2C, + /* Array index: 0x1424 */ 0x90F5,0x6968, + /* Array index: 0x1424 */ 0x90FD,0x5434, + /* Array index: 0x1424 */ 0x9102,0x6447, + /* Array index: 0x1424 */ 0x9112,0x755B, + /* Array index: 0x1424 */ 0x9115,0x7A41, + /* Array index: 0x1424 */ 0x9119,0x5E29, + /* Array index: 0x1424 */ 0x9127,0x5478, + /* Array index: 0x1424 */ 0x912D,0x6F77, + /* Array index: 0x1424 */ 0x9132,0x5333, + /* Array index: 0x1424 */ 0x9152,0x7150, + /* Array index: 0x1424 */ 0x9162,0x7532, + /* Array index: 0x1424 */ 0x9169,0x592E, + /* Array index: 0x1424 */ 0x916A,0x552C, + /* Array index: 0x1424 */ 0x916C,0x6246, + /* Array index: 0x1424 */ 0x9175,0x7D23, + /* Array index: 0x1424 */ 0x9177,0x7B65, + /* Array index: 0x1424 */ 0x9178,0x5F2B, + /* Array index: 0x1424 */ 0x9187,0x6275, + /* Array index: 0x1424 */ 0x9189,0x762D, + /* Array index: 0x1424 */ 0x918B,0x7533, + /* Array index: 0x1424 */ 0x918D,0x7035, + /* Array index: 0x1424 */ 0x9192,0x6125, + /* Array index: 0x1424 */ 0x919C,0x755D, + /* Array index: 0x1424 */ 0x91C0,0x6554, + /* Array index: 0x1424 */ 0x91C7,0x737A, + /* Array index: 0x1424 */ 0x91D7,0x6172, + /* Array index: 0x1424 */ 0x91D8,0x6F79, + /* Array index: 0x1424 */ 0x91DC,0x5D3C, + /* Array index: 0x1424 */ 0x91DD,0x765C, + /* Array index: 0x1424 */ 0x91E3,0x7065, + /* Array index: 0x1424 */ 0x91E7,0x7444, + /* Array index: 0x1424 */ 0x91EA,0x6969, + /* Array index: 0x1424 */ 0x91F5,0x737B, + /* Array index: 0x1424 */ 0x920D,0x546F, + /* Array index: 0x1424 */ 0x9217,0x6B4D, + /* Array index: 0x1424 */ 0x921E,0x5037, + /* Array index: 0x1424 */ 0x9234,0x5642, + /* Array index: 0x1424 */ 0x923A,0x682D, + /* Array index: 0x1424 */ 0x923F,0x6F2F, + /* Array index: 0x1424 */ 0x9240,0x4B25, + /* Array index: 0x1424 */ 0x9245,0x4B69, + /* Array index: 0x1424 */ 0x9249,0x7A68, + /* Array index: 0x1424 */ 0x9257,0x4C46, + /* Array index: 0x1424 */ 0x925B,0x6667, + /* Array index: 0x1424 */ 0x925E,0x6A47, + /* Array index: 0x1424 */ 0x9280,0x6B5E, + /* Array index: 0x1424 */ 0x9283,0x7548, + /* Array index: 0x1424 */ 0x9285,0x545E, + /* Array index: 0x1424 */ 0x9291,0x6055, + /* Array index: 0x1424 */ 0x9293,0x6F30, + /* Array index: 0x1424 */ 0x9296,0x6247, + /* Array index: 0x1424 */ 0x9298,0x592F, + /* Array index: 0x1424 */ 0x929C,0x7967, + /* Array index: 0x1424 */ 0x92B3,0x6765, + /* Array index: 0x1424 */ 0x92B6,0x4F4A, + /* Array index: 0x1424 */ 0x92B7,0x6151, + /* Array index: 0x1424 */ 0x92B9,0x6248, + /* Array index: 0x1424 */ 0x92CC,0x6F7B, + /* Array index: 0x1424 */ 0x92CF,0x7A79, + /* Array index: 0x1424 */ 0x92D2,0x5C72, + /* Array index: 0x1424 */ 0x92E4,0x6027, + /* Array index: 0x1424 */ 0x92EA,0x7868, + /* Array index: 0x1424 */ 0x92F8,0x4B6A, + /* Array index: 0x1424 */ 0x92FC,0x4B3C, + /* Array index: 0x1424 */ 0x9304,0x5662, + /* Array index: 0x1424 */ 0x9310,0x755E, + /* Array index: 0x1424 */ 0x9318,0x755F, + /* Array index: 0x1424 */ 0x931A,0x6E36, + /* Array index: 0x1424 */ 0x932B,0x6038, + /* Array index: 0x1424 */ 0x932E,0x4D51, + /* Array index: 0x1424 */ 0x932F,0x7339, + /* Array index: 0x1424 */ 0x9348,0x674C, + /* Array index: 0x1424 */ 0x934A,0x5628, + /* Array index: 0x1424 */ 0x934B,0x4E27, + /* Array index: 0x1424 */ 0x934D,0x5435, + /* Array index: 0x1424 */ 0x9354,0x6448, + /* Array index: 0x1424 */ 0x935B,0x5334, + /* Array index: 0x1424 */ 0x936E,0x6B39, + /* Array index: 0x1424 */ 0x9375,0x4B75, + /* Array index: 0x1424 */ 0x937C,0x765D, + /* Array index: 0x1424 */ 0x937E,0x7123, + /* Array index: 0x1424 */ 0x938C,0x4C47, + /* Array index: 0x1424 */ 0x9394,0x694A, + /* Array index: 0x1424 */ 0x9396,0x6170, + /* Array index: 0x1424 */ 0x939A,0x7560, + /* Array index: 0x1424 */ 0x93A3,0x7B2F, + /* Array index: 0x1424 */ 0x93A7,0x4B51, + /* Array index: 0x1424 */ 0x93AC,0x7B60, + /* Array index: 0x1424 */ 0x93AD,0x7265, + /* Array index: 0x1424 */ 0x93B0,0x6C70, + /* Array index: 0x1424 */ 0x93C3,0x706C, + /* Array index: 0x1424 */ 0x93D1,0x6E6B, + /* Array index: 0x1424 */ 0x93DE,0x694B, + /* Array index: 0x1424 */ 0x93E1,0x4C70, + /* Array index: 0x1424 */ 0x93E4,0x572F, + /* Array index: 0x1424 */ 0x93F6,0x7321, + /* Array index: 0x1424 */ 0x9404,0x7C75, + /* Array index: 0x1424 */ 0x9418,0x7124, + /* Array index: 0x1424 */ 0x9425,0x6056, + /* Array index: 0x1424 */ 0x942B,0x6F32, + /* Array index: 0x1424 */ 0x9435,0x7451, + /* Array index: 0x1424 */ 0x9438,0x7721, + /* Array index: 0x1424 */ 0x9444,0x7151, + /* Array index: 0x1424 */ 0x9451,0x4A7C, + /* Array index: 0x1424 */ 0x9452,0x4A7D, + /* Array index: 0x1424 */ 0x945B,0x4E4E, + /* Array index: 0x1424 */ 0x947D,0x7348, + /* Array index: 0x1424 */ 0x947F,0x733A, + /* Array index: 0x1424 */ 0x9577,0x6D7E, + /* Array index: 0x1424 */ 0x9580,0x5A26, + /* Array index: 0x1424 */ 0x9583,0x606C, + /* Array index: 0x1424 */ 0x9589,0x784D, + /* Array index: 0x1424 */ 0x958B,0x4B52, + /* Array index: 0x1424 */ 0x9598,0x4B26, + /* Array index: 0x1424 */ 0x95A8,0x5031, + /* Array index: 0x1424 */ 0x95AD,0x556F, + /* Array index: 0x1424 */ 0x95B1,0x6673, + /* Array index: 0x1424 */ 0x95BB,0x6722, + /* Array index: 0x1424 */ 0x95BC,0x6459, + /* Array index: 0x1424 */ 0x95C7,0x6461, + /* Array index: 0x1424 */ 0x95CA,0x7C44, + /* Array index: 0x1424 */ 0x95DC,0x4E3C, + /* Array index: 0x1424 */ 0x95E1,0x7445, + /* Array index: 0x1424 */ 0x95E2,0x5C23, + /* Array index: 0x1424 */ 0x961C,0x5D3D, + /* Array index: 0x1424 */ 0x9621,0x7446, + /* Array index: 0x1424 */ 0x962A,0x7821, + /* Array index: 0x1424 */ 0x962E,0x6856, + /* Array index: 0x1424 */ 0x9632,0x5B41, + /* Array index: 0x1424 */ 0x963B,0x7066, + /* Array index: 0x1424 */ 0x963F,0x6439, + /* Array index: 0x1424 */ 0x9640,0x766D, + /* Array index: 0x1424 */ 0x9642,0x792E, + /* Array index: 0x1424 */ 0x9644,0x5D3E, + /* Array index: 0x1424 */ 0x9650,0x795A, + /* Array index: 0x1424 */ 0x966A,0x5B56, + /* Array index: 0x1424 */ 0x9670,0x6B64, + /* Array index: 0x1424 */ 0x967D,0x6555, + /* Array index: 0x1424 */ 0x9685,0x696A, + /* Array index: 0x1424 */ 0x9686,0x574C, + /* Array index: 0x1424 */ 0x9694,0x4C30, + /* Array index: 0x1424 */ 0x9695,0x6A22, + /* Array index: 0x1424 */ 0x96A3,0x5776, + /* Array index: 0x1424 */ 0x96A7,0x624A, + /* Array index: 0x1424 */ 0x96A8,0x624B, + /* Array index: 0x1424 */ 0x96AA,0x7A4F, + /* Array index: 0x1424 */ 0x96B1,0x6B5F, + /* Array index: 0x1424 */ 0x96B7,0x564B, + /* Array index: 0x1424 */ 0x96BB,0x7434, + /* Array index: 0x1424 */ 0x96D5,0x7067, + /* Array index: 0x1424 */ 0x96D6,0x624C, + /* Array index: 0x1424 */ 0x96D9,0x642A, + /* Array index: 0x1424 */ 0x96DB,0x7561, + /* Array index: 0x1424 */ 0x96DC,0x6D5A, + /* Array index: 0x1424 */ 0x96E2,0x576E, + /* Array index: 0x1424 */ 0x96E3,0x5171, + /* Array index: 0x1424 */ 0x96EF,0x5A27, + /* Array index: 0x1424 */ 0x96F0,0x5D54, + /* Array index: 0x1424 */ 0x96F2,0x6A23, + /* Array index: 0x1424 */ 0x96F6,0x5643, + /* Array index: 0x1424 */ 0x96F7,0x5674, + /* Array index: 0x1424 */ 0x96F9,0x5A5F, + /* Array index: 0x1424 */ 0x96FB,0x6F33, + /* Array index: 0x1424 */ 0x9700,0x624D, + /* Array index: 0x1424 */ 0x9706,0x6F7D, + /* Array index: 0x1424 */ 0x9707,0x7268, + /* Array index: 0x1424 */ 0x9711,0x6F45, + /* Array index: 0x1424 */ 0x9713,0x6767, + /* Array index: 0x1424 */ 0x9716,0x577D, + /* Array index: 0x1424 */ 0x9719,0x674E, + /* Array index: 0x1424 */ 0x971C,0x5F5C, + /* Array index: 0x1424 */ 0x971E,0x7947, + /* Array index: 0x1424 */ 0x9727,0x5976, + /* Array index: 0x1424 */ 0x9730,0x5F2C, + /* Array index: 0x1424 */ 0x9732,0x565A, + /* Array index: 0x1424 */ 0x9739,0x5C24, + /* Array index: 0x1424 */ 0x973D,0x7038, + /* Array index: 0x1424 */ 0x9742,0x557A, + /* Array index: 0x1424 */ 0x9744,0x6477, + /* Array index: 0x1424 */ 0x9748,0x5644, + /* Array index: 0x1424 */ 0x9751,0x746C, + /* Array index: 0x1424 */ 0x9756,0x6F7E, + /* Array index: 0x1424 */ 0x975C,0x7021, + /* Array index: 0x1424 */ 0x975E,0x5E2A, + /* Array index: 0x1424 */ 0x9761,0x5A3C, + /* Array index: 0x1424 */ 0x9762,0x587C, + /* Array index: 0x1424 */ 0x9769,0x7A54, + /* Array index: 0x1424 */ 0x976D,0x6C65, + /* Array index: 0x1424 */ 0x9774,0x7C28, + /* Array index: 0x1424 */ 0x9777,0x6C66, + /* Array index: 0x1424 */ 0x977A,0x584B, + /* Array index: 0x1424 */ 0x978B,0x7B39, + /* Array index: 0x1424 */ 0x978D,0x6453, + /* Array index: 0x1424 */ 0x978F,0x4D79, + /* Array index: 0x1424 */ 0x97A0,0x4F53, + /* Array index: 0x1424 */ 0x97A8,0x4A6A, + /* Array index: 0x1424 */ 0x97AB,0x4F54, + /* Array index: 0x1424 */ 0x97AD,0x783D, + /* Array index: 0x1424 */ 0x97C6,0x7447, + /* Array index: 0x1424 */ 0x97CB,0x6A5F, + /* Array index: 0x1424 */ 0x97D3,0x795B, + /* Array index: 0x1424 */ 0x97DC,0x5437, + /* Array index: 0x1424 */ 0x97F3,0x6B65, + /* Array index: 0x1424 */ 0x97F6,0x6152, + /* Array index: 0x1424 */ 0x97FB,0x6A24, + /* Array index: 0x1424 */ 0x9817,0x7776, + /* Array index: 0x1424 */ 0x9818,0x5645, + /* Array index: 0x1424 */ 0x982D,0x5469, + /* Array index: 0x1424 */ 0x9830,0x7A7A, + /* Array index: 0x1424 */ 0x9838,0x4C72, + /* Array index: 0x1424 */ 0x9839,0x775D, + /* Array index: 0x1424 */ 0x983B,0x5E3A, + /* Array index: 0x1424 */ 0x9846,0x4E28, + /* Array index: 0x1424 */ 0x9854,0x6454, + /* Array index: 0x1424 */ 0x9858,0x6A43, + /* Array index: 0x1424 */ 0x985A,0x6F34, + /* Array index: 0x1424 */ 0x985E,0x573E, + /* Array index: 0x1424 */ 0x9865,0x7B62, + /* Array index: 0x1424 */ 0x9867,0x4D53, + /* Array index: 0x1424 */ 0x986B,0x6F35, + /* Array index: 0x1424 */ 0x986F,0x7A69, + /* Array index: 0x1424 */ 0x98A8,0x7926, + /* Array index: 0x1424 */ 0x98AF,0x5F3D, + /* Array index: 0x1424 */ 0x98B1,0x7747, + /* Array index: 0x1424 */ 0x98C4,0x787D, + /* Array index: 0x1424 */ 0x98C7,0x787C, + /* Array index: 0x1424 */ 0x98DB,0x5E2B, + /* Array index: 0x1424 */ 0x98DC,0x5B68, + /* Array index: 0x1424 */ 0x98DF,0x635D, + /* Array index: 0x1424 */ 0x98E1,0x6162, + /* Array index: 0x1424 */ 0x98E2,0x5146, + /* Array index: 0x1424 */ 0x98F4,0x6C47, + /* Array index: 0x1424 */ 0x9903,0x4E75, + /* Array index: 0x1424 */ 0x9909,0x7A43, + /* Array index: 0x1424 */ 0x990A,0x6557, + /* Array index: 0x1424 */ 0x990C,0x6C48, + /* Array index: 0x1424 */ 0x9910,0x7349, + /* Array index: 0x1424 */ 0x9913,0x643B, + /* Array index: 0x1424 */ 0x9918,0x662E, + /* Array index: 0x1424 */ 0x991E,0x6F36, + /* Array index: 0x1424 */ 0x9920,0x5C3F, + /* Array index: 0x1424 */ 0x9928,0x4E3D, + /* Array index: 0x1424 */ 0x9945,0x5843, + /* Array index: 0x1424 */ 0x9951,0x5147, + /* Array index: 0x1424 */ 0x9952,0x692E, + /* Array index: 0x1424 */ 0x9954,0x683D, + /* Array index: 0x1424 */ 0x9957,0x7A44, + /* Array index: 0x1424 */ 0x9996,0x624F, + /* Array index: 0x1424 */ 0x9999,0x7A45, + /* Array index: 0x1424 */ 0x999D,0x7938, + /* Array index: 0x1424 */ 0x99A5,0x5C60, + /* Array index: 0x1424 */ 0x99A8,0x7B30, + /* Array index: 0x1424 */ 0x99B1,0x766E, + /* Array index: 0x1424 */ 0x99B3,0x764C, + /* Array index: 0x1424 */ 0x99B4,0x6278, + /* Array index: 0x1424 */ 0x99B9,0x6C71, + /* Array index: 0x1424 */ 0x99C1,0x5A60, + /* Array index: 0x1424 */ 0x99D5,0x4A3D, + /* Array index: 0x1424 */ 0x99D9,0x5D3F, + /* Array index: 0x1424 */ 0x99DD,0x766F, + /* Array index: 0x1424 */ 0x99DF,0x5E79, + /* Array index: 0x1424 */ 0x99ED,0x7A34, + /* Array index: 0x1424 */ 0x99F1,0x552D, + /* Array index: 0x1424 */ 0x99FF,0x7167, + /* Array index: 0x1424 */ 0x9A01,0x5E3E, + /* Array index: 0x1424 */ 0x9A08,0x5C40, + /* Array index: 0x1424 */ 0x9A0E,0x5148, + /* Array index: 0x1424 */ 0x9A0F,0x5149, + /* Array index: 0x1424 */ 0x9A19,0x783E, + /* Array index: 0x1424 */ 0x9A2B,0x4B76, + /* Array index: 0x1424 */ 0x9A30,0x5479, + /* Array index: 0x1424 */ 0x9A36,0x7562, + /* Array index: 0x1424 */ 0x9A37,0x6153, + /* Array index: 0x1424 */ 0x9A40,0x5869, + /* Array index: 0x1424 */ 0x9A43,0x787E, + /* Array index: 0x1424 */ 0x9A45,0x4F4C, + /* Array index: 0x1424 */ 0x9A4D,0x7D24, + /* Array index: 0x1424 */ 0x9A55,0x4E76, + /* Array index: 0x1424 */ 0x9A57,0x7A50, + /* Array index: 0x1424 */ 0x9A5A,0x4C73, + /* Array index: 0x1424 */ 0x9A5B,0x663E, + /* Array index: 0x1424 */ 0x9A5F,0x762E, + /* Array index: 0x1424 */ 0x9A62,0x5570, + /* Array index: 0x1424 */ 0x9A65,0x514A, + /* Array index: 0x1424 */ 0x9A69,0x7C3E, + /* Array index: 0x1424 */ 0x9A6A,0x5571, + /* Array index: 0x1424 */ 0x9AA8,0x4D69, + /* Array index: 0x1424 */ 0x9AB8,0x7A35, + /* Array index: 0x1424 */ 0x9AD3,0x6250, + /* Array index: 0x1424 */ 0x9AD4,0x7477, + /* Array index: 0x1424 */ 0x9AD8,0x4D54, + /* Array index: 0x1424 */ 0x9AE5,0x6723, + /* Array index: 0x1424 */ 0x9AEE,0x5B25, + /* Array index: 0x1424 */ 0x9B1A,0x6251, + /* Array index: 0x1424 */ 0x9B27,0x5722, + /* Array index: 0x1424 */ 0x9B2A,0x7763, + /* Array index: 0x1424 */ 0x9B31,0x6A26, + /* Array index: 0x1424 */ 0x9B3C,0x5021, + /* Array index: 0x1424 */ 0x9B4F,0x6A60, + /* Array index: 0x1424 */ 0x9B54,0x582A, + /* Array index: 0x1424 */ 0x9B5A,0x6560, + /* Array index: 0x1424 */ 0x9B6F,0x565B, + /* Array index: 0x1424 */ 0x9B8E,0x6F46, + /* Array index: 0x1424 */ 0x9B91,0x786A, + /* Array index: 0x1424 */ 0x9B9F,0x6455, + /* Array index: 0x1424 */ 0x9BAB,0x4E77, + /* Array index: 0x1424 */ 0x9BAE,0x6058, + /* Array index: 0x1424 */ 0x9BC9,0x576F, + /* Array index: 0x1424 */ 0x9BD6,0x746D, + /* Array index: 0x1424 */ 0x9BE4,0x4D66, + /* Array index: 0x1424 */ 0x9BE8,0x4C74, + /* Array index: 0x1424 */ 0x9C0D,0x7563, + /* Array index: 0x1424 */ 0x9C10,0x644A, + /* Array index: 0x1424 */ 0x9C12,0x5C61, + /* Array index: 0x1424 */ 0x9C15,0x7948, + /* Array index: 0x1424 */ 0x9C25,0x7C3F, + /* Array index: 0x1424 */ 0x9C32,0x6827, + /* Array index: 0x1424 */ 0x9C3B,0x5844, + /* Array index: 0x1424 */ 0x9C47,0x4B3E, + /* Array index: 0x1424 */ 0x9C49,0x5C2E, + /* Array index: 0x1424 */ 0x9C57,0x5777, + /* Array index: 0x1424 */ 0x9CE5,0x7068, + /* Array index: 0x1424 */ 0x9CE7,0x5D40, + /* Array index: 0x1424 */ 0x9CE9,0x4F4D, + /* Array index: 0x1424 */ 0x9CF3,0x5C73, + /* Array index: 0x1424 */ 0x9CF4,0x5930, + /* Array index: 0x1424 */ 0x9CF6,0x6669, + /* Array index: 0x1424 */ 0x9D09,0x643C, + /* Array index: 0x1424 */ 0x9D1B,0x6A44, + /* Array index: 0x1424 */ 0x9D26,0x646C, + /* Array index: 0x1424 */ 0x9D28,0x6465, + /* Array index: 0x1424 */ 0x9D3B,0x7B78, + /* Array index: 0x1424 */ 0x9D51,0x4C3B, + /* Array index: 0x1424 */ 0x9D5D,0x643D, + /* Array index: 0x1424 */ 0x9D60,0x4D5C, + /* Array index: 0x1424 */ 0x9D61,0x5977, + /* Array index: 0x1424 */ 0x9D6C,0x5D5F, + /* Array index: 0x1424 */ 0x9D72,0x6D4E, + /* Array index: 0x1424 */ 0x9DA9,0x5950, + /* Array index: 0x1424 */ 0x9DAF,0x6523, + /* Array index: 0x1424 */ 0x9DB4,0x794D, + /* Array index: 0x1424 */ 0x9DC4,0x4D2E, + /* Array index: 0x1424 */ 0x9DD7,0x4F4E, + /* Array index: 0x1424 */ 0x9DF2,0x762F, + /* Array index: 0x1424 */ 0x9E1A,0x6524, + /* Array index: 0x1424 */ 0x9E1E,0x5536, + /* Array index: 0x1424 */ 0x9E75,0x565D, + /* Array index: 0x1424 */ 0x9E79,0x7969, + /* Array index: 0x1424 */ 0x9E7D,0x6724, + /* Array index: 0x1424 */ 0x9E7F,0x5663, + /* Array index: 0x1424 */ 0x9E92,0x514B, + /* Array index: 0x1424 */ 0x9E93,0x5664, + /* Array index: 0x1424 */ 0x9E97,0x5572, + /* Array index: 0x1424 */ 0x9E9D,0x5E7A, + /* Array index: 0x1424 */ 0x9E9F,0x5778, + /* Array index: 0x1424 */ 0x9EA5,0x586A, + /* Array index: 0x1424 */ 0x9EB4,0x4F55, + /* Array index: 0x1424 */ 0x9EB5,0x587D, + /* Array index: 0x1424 */ 0x9EBB,0x582B, + /* Array index: 0x1424 */ 0x9EBE,0x7D4B, + /* Array index: 0x1424 */ 0x9EC3,0x7C5C, + /* Array index: 0x1424 */ 0x9ECD,0x6028, + /* Array index: 0x1424 */ 0x9ECE,0x5573, + /* Array index: 0x1424 */ 0x9ED1,0x7D59, + /* Array index: 0x1424 */ 0x9ED4,0x4C23, + /* Array index: 0x1424 */ 0x9ED8,0x5979, + /* Array index: 0x1424 */ 0x9EDB,0x536A, + /* Array index: 0x1424 */ 0x9EDC,0x7575, + /* Array index: 0x1424 */ 0x9EDE,0x6F47, + /* Array index: 0x1424 */ 0x9EE8,0x535A, + /* Array index: 0x1424 */ 0x9EF4,0x5A3D, + /* Array index: 0x1424 */ 0x9F07,0x6828, + /* Array index: 0x1424 */ 0x9F08,0x5C2F, + /* Array index: 0x1424 */ 0x9F0E,0x7023, + /* Array index: 0x1424 */ 0x9F13,0x4D55, + /* Array index: 0x1424 */ 0x9F20,0x6029, + /* Array index: 0x1424 */ 0x9F3B,0x5E2C, + /* Array index: 0x1424 */ 0x9F4A,0x703A, + /* Array index: 0x1424 */ 0x9F4B,0x6E31, + /* Array index: 0x1424 */ 0x9F4E,0x6E32, + /* Array index: 0x1424 */ 0x9F52,0x764D, + /* Array index: 0x1424 */ 0x9F5F,0x6E52, + /* Array index: 0x1424 */ 0x9F61,0x5646, + /* Array index: 0x1424 */ 0x9F67,0x6065, + /* Array index: 0x1424 */ 0x9F6A,0x733B, + /* Array index: 0x1424 */ 0x9F6C,0x6561, + /* Array index: 0x1424 */ 0x9F77,0x644B, + /* Array index: 0x1424 */ 0x9F8D,0x5723, + /* Array index: 0x1424 */ 0x9F90,0x5B42, + /* Array index: 0x1424 */ 0x9F95,0x4A7E, + /* Array index: 0x1424 */ 0x9F9C,0x4F4F, + /* Array index: 0x1424 */ 0xAC00,0x3021, + /* Array index: 0x1424 */ 0xAC01,0x3022, + /* Array index: 0x1424 */ 0xAC04,0x3023, + /* Array index: 0x1424 */ 0xAC20,0x3035, + /* Array index: 0x1424 */ 0xAC24,0x3036, + /* Array index: 0x1424 */ 0xAC38,0x303C, + /* Array index: 0x1424 */ 0xAC39,0x303D, + /* Array index: 0x1424 */ 0xAC3C,0x303E, + /* Array index: 0x1424 */ 0xAC40,0x303F, + /* Array index: 0x1424 */ 0xAC4B,0x3040, + /* Array index: 0x1424 */ 0xAC4D,0x3041, + /* Array index: 0x1424 */ 0xAC54,0x3042, + /* Array index: 0x1424 */ 0xAC58,0x3043, + /* Array index: 0x1424 */ 0xAC5C,0x3044, + /* Array index: 0x1424 */ 0xAC70,0x3045, + /* Array index: 0x1424 */ 0xAC71,0x3046, + /* Array index: 0x1424 */ 0xAC74,0x3047, + /* Array index: 0x1424 */ 0xAC77,0x3048, + /* Array index: 0x1424 */ 0xAC78,0x3049, + /* Array index: 0x1424 */ 0xAC7A,0x304A, + /* Array index: 0x1424 */ 0xAC90,0x3055, + /* Array index: 0x1424 */ 0xAC94,0x3056, + /* Array index: 0x1424 */ 0xACC1,0x3067, + /* Array index: 0x1424 */ 0xACC4,0x3068, + /* Array index: 0x1424 */ 0xACC8,0x3069, + /* Array index: 0x1424 */ 0xACCC,0x306A, + /* Array index: 0x1424 */ 0xACD5,0x306B, + /* Array index: 0x1424 */ 0xACD7,0x306C, + /* Array index: 0x1424 */ 0xACE0,0x306D, + /* Array index: 0x1424 */ 0xACE1,0x306E, + /* Array index: 0x1424 */ 0xACE4,0x306F, + /* Array index: 0x1424 */ 0xACE7,0x3070, + /* Array index: 0x1424 */ 0xACE8,0x3071, + /* Array index: 0x1424 */ 0xACEA,0x3072, + /* Array index: 0x1424 */ 0xACEC,0x3073, + /* Array index: 0x1424 */ 0xACFC,0x307A, + /* Array index: 0x1424 */ 0xACFD,0x307B, + /* Array index: 0x1424 */ 0xAD00,0x307C, + /* Array index: 0x1424 */ 0xAD04,0x307D, + /* Array index: 0x1424 */ 0xAD06,0x307E, + /* Array index: 0x1424 */ 0xAD0C,0x3121, + /* Array index: 0x1424 */ 0xAD0D,0x3122, + /* Array index: 0x1424 */ 0xAD0F,0x3123, + /* Array index: 0x1424 */ 0xAD11,0x3124, + /* Array index: 0x1424 */ 0xAD18,0x3125, + /* Array index: 0x1424 */ 0xAD1C,0x3126, + /* Array index: 0x1424 */ 0xAD20,0x3127, + /* Array index: 0x1424 */ 0xAD29,0x3128, + /* Array index: 0x1424 */ 0xAD2C,0x3129, + /* Array index: 0x1424 */ 0xAD2D,0x312A, + /* Array index: 0x1424 */ 0xAD34,0x312B, + /* Array index: 0x1424 */ 0xAD35,0x312C, + /* Array index: 0x1424 */ 0xAD38,0x312D, + /* Array index: 0x1424 */ 0xAD3C,0x312E, + /* Array index: 0x1424 */ 0xAD44,0x312F, + /* Array index: 0x1424 */ 0xAD45,0x3130, + /* Array index: 0x1424 */ 0xAD47,0x3131, + /* Array index: 0x1424 */ 0xAD49,0x3132, + /* Array index: 0x1424 */ 0xAD50,0x3133, + /* Array index: 0x1424 */ 0xAD54,0x3134, + /* Array index: 0x1424 */ 0xAD58,0x3135, + /* Array index: 0x1424 */ 0xAD61,0x3136, + /* Array index: 0x1424 */ 0xAD63,0x3137, + /* Array index: 0x1424 */ 0xAD6C,0x3138, + /* Array index: 0x1424 */ 0xAD6D,0x3139, + /* Array index: 0x1424 */ 0xAD70,0x313A, + /* Array index: 0x1424 */ 0xAD88,0x3145, + /* Array index: 0x1424 */ 0xAD89,0x3146, + /* Array index: 0x1424 */ 0xAD8C,0x3147, + /* Array index: 0x1424 */ 0xAD90,0x3148, + /* Array index: 0x1424 */ 0xAD9C,0x3149, + /* Array index: 0x1424 */ 0xAD9D,0x314A, + /* Array index: 0x1424 */ 0xADA4,0x314B, + /* Array index: 0x1424 */ 0xADB7,0x314C, + /* Array index: 0x1424 */ 0xADC0,0x314D, + /* Array index: 0x1424 */ 0xADC1,0x314E, + /* Array index: 0x1424 */ 0xADC4,0x314F, + /* Array index: 0x1424 */ 0xADC8,0x3150, + /* Array index: 0x1424 */ 0xADD0,0x3151, + /* Array index: 0x1424 */ 0xADD1,0x3152, + /* Array index: 0x1424 */ 0xADD3,0x3153, + /* Array index: 0x1424 */ 0xADDC,0x3154, + /* Array index: 0x1424 */ 0xADE0,0x3155, + /* Array index: 0x1424 */ 0xADE4,0x3156, + /* Array index: 0x1424 */ 0xADF8,0x3157, + /* Array index: 0x1424 */ 0xADF9,0x3158, + /* Array index: 0x1424 */ 0xADFC,0x3159, + /* Array index: 0x1424 */ 0xAE08,0x315D, + /* Array index: 0x1424 */ 0xAE09,0x315E, + /* Array index: 0x1424 */ 0xAE0B,0x315F, + /* Array index: 0x1424 */ 0xAE0D,0x3160, + /* Array index: 0x1424 */ 0xAE14,0x3161, + /* Array index: 0x1424 */ 0xAE30,0x3162, + /* Array index: 0x1424 */ 0xAE31,0x3163, + /* Array index: 0x1424 */ 0xAE34,0x3164, + /* Array index: 0x1424 */ 0xAE37,0x3165, + /* Array index: 0x1424 */ 0xAE38,0x3166, + /* Array index: 0x1424 */ 0xAE3A,0x3167, + /* Array index: 0x1424 */ 0xAE40,0x3168, + /* Array index: 0x1424 */ 0xAE41,0x3169, + /* Array index: 0x1424 */ 0xAE43,0x316A, + /* Array index: 0x1424 */ 0xAE45,0x316B, + /* Array index: 0x1424 */ 0xAE46,0x316C, + /* Array index: 0x1424 */ 0xAE54,0x3172, + /* Array index: 0x1424 */ 0xAE56,0x3173, + /* Array index: 0x1424 */ 0xAE65,0x3179, + /* Array index: 0x1424 */ 0xAE68,0x317A, + /* Array index: 0x1424 */ 0xAE69,0x317B, + /* Array index: 0x1424 */ 0xAE6C,0x317C, + /* Array index: 0x1424 */ 0xAE70,0x317D, + /* Array index: 0x1424 */ 0xAE84,0x3225, + /* Array index: 0x1424 */ 0xAE85,0x3226, + /* Array index: 0x1424 */ 0xAE8C,0x3227, + /* Array index: 0x1424 */ 0xAEC4,0x322C, + /* Array index: 0x1424 */ 0xAED8,0x3232, + /* Array index: 0x1424 */ 0xAED9,0x3233, + /* Array index: 0x1424 */ 0xAEDC,0x3234, + /* Array index: 0x1424 */ 0xAEE8,0x3235, + /* Array index: 0x1424 */ 0xAEEB,0x3236, + /* Array index: 0x1424 */ 0xAEED,0x3237, + /* Array index: 0x1424 */ 0xAEF4,0x3238, + /* Array index: 0x1424 */ 0xAEF8,0x3239, + /* Array index: 0x1424 */ 0xAEFC,0x323A, + /* Array index: 0x1424 */ 0xAF07,0x323B, + /* Array index: 0x1424 */ 0xAF08,0x323C, + /* Array index: 0x1424 */ 0xAF0D,0x323D, + /* Array index: 0x1424 */ 0xAF10,0x323E, + /* Array index: 0x1424 */ 0xAF2C,0x323F, + /* Array index: 0x1424 */ 0xAF2D,0x3240, + /* Array index: 0x1424 */ 0xAF30,0x3241, + /* Array index: 0x1424 */ 0xAF32,0x3242, + /* Array index: 0x1424 */ 0xAF34,0x3243, + /* Array index: 0x1424 */ 0xAF3C,0x3244, + /* Array index: 0x1424 */ 0xAF3D,0x3245, + /* Array index: 0x1424 */ 0xAF48,0x324A, + /* Array index: 0x1424 */ 0xAF49,0x324B, + /* Array index: 0x1424 */ 0xAF50,0x324C, + /* Array index: 0x1424 */ 0xAF5C,0x324D, + /* Array index: 0x1424 */ 0xAF5D,0x324E, + /* Array index: 0x1424 */ 0xAF64,0x324F, + /* Array index: 0x1424 */ 0xAF65,0x3250, + /* Array index: 0x1424 */ 0xAF79,0x3251, + /* Array index: 0x1424 */ 0xAF80,0x3252, + /* Array index: 0x1424 */ 0xAF84,0x3253, + /* Array index: 0x1424 */ 0xAF88,0x3254, + /* Array index: 0x1424 */ 0xAF90,0x3255, + /* Array index: 0x1424 */ 0xAF91,0x3256, + /* Array index: 0x1424 */ 0xAF95,0x3257, + /* Array index: 0x1424 */ 0xAF9C,0x3258, + /* Array index: 0x1424 */ 0xAFB8,0x3259, + /* Array index: 0x1424 */ 0xAFB9,0x325A, + /* Array index: 0x1424 */ 0xAFBC,0x325B, + /* Array index: 0x1424 */ 0xAFC0,0x325C, + /* Array index: 0x1424 */ 0xAFD4,0x3263, + /* Array index: 0x1424 */ 0xAFDC,0x3264, + /* Array index: 0x1424 */ 0xAFE8,0x3265, + /* Array index: 0x1424 */ 0xAFE9,0x3266, + /* Array index: 0x1424 */ 0xAFF0,0x3267, + /* Array index: 0x1424 */ 0xAFF1,0x3268, + /* Array index: 0x1424 */ 0xAFF4,0x3269, + /* Array index: 0x1424 */ 0xAFF8,0x326A, + /* Array index: 0x1424 */ 0xB000,0x326B, + /* Array index: 0x1424 */ 0xB001,0x326C, + /* Array index: 0x1424 */ 0xB004,0x326D, + /* Array index: 0x1424 */ 0xB00C,0x326E, + /* Array index: 0x1424 */ 0xB010,0x326F, + /* Array index: 0x1424 */ 0xB014,0x3270, + /* Array index: 0x1424 */ 0xB01C,0x3271, + /* Array index: 0x1424 */ 0xB01D,0x3272, + /* Array index: 0x1424 */ 0xB028,0x3273, + /* Array index: 0x1424 */ 0xB044,0x3274, + /* Array index: 0x1424 */ 0xB045,0x3275, + /* Array index: 0x1424 */ 0xB048,0x3276, + /* Array index: 0x1424 */ 0xB04A,0x3277, + /* Array index: 0x1424 */ 0xB04C,0x3278, + /* Array index: 0x1424 */ 0xB04E,0x3279, + /* Array index: 0x1424 */ 0xB05D,0x3321, + /* Array index: 0x1424 */ 0xB07C,0x3322, + /* Array index: 0x1424 */ 0xB07D,0x3323, + /* Array index: 0x1424 */ 0xB080,0x3324, + /* Array index: 0x1424 */ 0xB084,0x3325, + /* Array index: 0x1424 */ 0xB08C,0x3326, + /* Array index: 0x1424 */ 0xB08D,0x3327, + /* Array index: 0x1424 */ 0xB08F,0x3328, + /* Array index: 0x1424 */ 0xB091,0x3329, + /* Array index: 0x1424 */ 0xB0B8,0x333D, + /* Array index: 0x1424 */ 0xB0BC,0x333E, + /* Array index: 0x1424 */ 0xB0D0,0x3344, + /* Array index: 0x1424 */ 0xB0D1,0x3345, + /* Array index: 0x1424 */ 0xB0D4,0x3346, + /* Array index: 0x1424 */ 0xB0D8,0x3347, + /* Array index: 0x1424 */ 0xB0E0,0x3348, + /* Array index: 0x1424 */ 0xB0E5,0x3349, + /* Array index: 0x1424 */ 0xB110,0x334E, + /* Array index: 0x1424 */ 0xB112,0x334F, + /* Array index: 0x1424 */ 0xB113,0x3350, + /* Array index: 0x1424 */ 0xB128,0x3359, + /* Array index: 0x1424 */ 0xB12C,0x335A, + /* Array index: 0x1424 */ 0xB140,0x3360, + /* Array index: 0x1424 */ 0xB141,0x3361, + /* Array index: 0x1424 */ 0xB144,0x3362, + /* Array index: 0x1424 */ 0xB148,0x3363, + /* Array index: 0x1424 */ 0xB150,0x3364, + /* Array index: 0x1424 */ 0xB151,0x3365, + /* Array index: 0x1424 */ 0xB154,0x3366, + /* Array index: 0x1424 */ 0xB155,0x3367, + /* Array index: 0x1424 */ 0xB158,0x3368, + /* Array index: 0x1424 */ 0xB15C,0x3369, + /* Array index: 0x1424 */ 0xB160,0x336A, + /* Array index: 0x1424 */ 0xB178,0x336B, + /* Array index: 0x1424 */ 0xB179,0x336C, + /* Array index: 0x1424 */ 0xB17C,0x336D, + /* Array index: 0x1424 */ 0xB180,0x336E, + /* Array index: 0x1424 */ 0xB182,0x336F, + /* Array index: 0x1424 */ 0xB188,0x3370, + /* Array index: 0x1424 */ 0xB189,0x3371, + /* Array index: 0x1424 */ 0xB18B,0x3372, + /* Array index: 0x1424 */ 0xB18D,0x3373, + /* Array index: 0x1424 */ 0xB198,0x3377, + /* Array index: 0x1424 */ 0xB19C,0x3378, + /* Array index: 0x1424 */ 0xB1A8,0x3379, + /* Array index: 0x1424 */ 0xB1CC,0x337A, + /* Array index: 0x1424 */ 0xB1D0,0x337B, + /* Array index: 0x1424 */ 0xB1D4,0x337C, + /* Array index: 0x1424 */ 0xB1DC,0x337D, + /* Array index: 0x1424 */ 0xB1DD,0x337E, + /* Array index: 0x1424 */ 0xB1DF,0x3421, + /* Array index: 0x1424 */ 0xB1E8,0x3422, + /* Array index: 0x1424 */ 0xB1E9,0x3423, + /* Array index: 0x1424 */ 0xB1EC,0x3424, + /* Array index: 0x1424 */ 0xB1F0,0x3425, + /* Array index: 0x1424 */ 0xB1F9,0x3426, + /* Array index: 0x1424 */ 0xB1FB,0x3427, + /* Array index: 0x1424 */ 0xB1FD,0x3428, + /* Array index: 0x1424 */ 0xB204,0x3429, + /* Array index: 0x1424 */ 0xB205,0x342A, + /* Array index: 0x1424 */ 0xB208,0x342B, + /* Array index: 0x1424 */ 0xB20B,0x342C, + /* Array index: 0x1424 */ 0xB20C,0x342D, + /* Array index: 0x1424 */ 0xB214,0x342E, + /* Array index: 0x1424 */ 0xB215,0x342F, + /* Array index: 0x1424 */ 0xB217,0x3430, + /* Array index: 0x1424 */ 0xB219,0x3431, + /* Array index: 0x1424 */ 0xB220,0x3432, + /* Array index: 0x1424 */ 0xB234,0x3433, + /* Array index: 0x1424 */ 0xB23C,0x3434, + /* Array index: 0x1424 */ 0xB258,0x3435, + /* Array index: 0x1424 */ 0xB25C,0x3436, + /* Array index: 0x1424 */ 0xB260,0x3437, + /* Array index: 0x1424 */ 0xB268,0x3438, + /* Array index: 0x1424 */ 0xB269,0x3439, + /* Array index: 0x1424 */ 0xB274,0x343A, + /* Array index: 0x1424 */ 0xB275,0x343B, + /* Array index: 0x1424 */ 0xB27C,0x343C, + /* Array index: 0x1424 */ 0xB284,0x343D, + /* Array index: 0x1424 */ 0xB285,0x343E, + /* Array index: 0x1424 */ 0xB289,0x343F, + /* Array index: 0x1424 */ 0xB290,0x3440, + /* Array index: 0x1424 */ 0xB291,0x3441, + /* Array index: 0x1424 */ 0xB294,0x3442, + /* Array index: 0x1424 */ 0xB2A0,0x3446, + /* Array index: 0x1424 */ 0xB2A1,0x3447, + /* Array index: 0x1424 */ 0xB2A3,0x3448, + /* Array index: 0x1424 */ 0xB2A5,0x3449, + /* Array index: 0x1424 */ 0xB2A6,0x344A, + /* Array index: 0x1424 */ 0xB2AA,0x344B, + /* Array index: 0x1424 */ 0xB2AC,0x344C, + /* Array index: 0x1424 */ 0xB2B0,0x344D, + /* Array index: 0x1424 */ 0xB2B4,0x344E, + /* Array index: 0x1424 */ 0xB2C8,0x344F, + /* Array index: 0x1424 */ 0xB2C9,0x3450, + /* Array index: 0x1424 */ 0xB2CC,0x3451, + /* Array index: 0x1424 */ 0xB2D0,0x3452, + /* Array index: 0x1424 */ 0xB2D2,0x3453, + /* Array index: 0x1424 */ 0xB2D8,0x3454, + /* Array index: 0x1424 */ 0xB2D9,0x3455, + /* Array index: 0x1424 */ 0xB2DB,0x3456, + /* Array index: 0x1424 */ 0xB2DD,0x3457, + /* Array index: 0x1424 */ 0xB304,0x346D, + /* Array index: 0x1424 */ 0xB308,0x346E, + /* Array index: 0x1424 */ 0xB31C,0x3474, + /* Array index: 0x1424 */ 0xB364,0x347D, + /* Array index: 0x1424 */ 0xB365,0x347E, + /* Array index: 0x1424 */ 0xB367,0x3521, + /* Array index: 0x1424 */ 0xB369,0x3522, + /* Array index: 0x1424 */ 0xB36B,0x3523, + /* Array index: 0x1424 */ 0xB36E,0x3524, + /* Array index: 0x1424 */ 0xB370,0x3525, + /* Array index: 0x1424 */ 0xB371,0x3526, + /* Array index: 0x1424 */ 0xB374,0x3527, + /* Array index: 0x1424 */ 0xB378,0x3528, + /* Array index: 0x1424 */ 0xB38C,0x352E, + /* Array index: 0x1424 */ 0xB390,0x352F, + /* Array index: 0x1424 */ 0xB394,0x3530, + /* Array index: 0x1424 */ 0xB3A0,0x3531, + /* Array index: 0x1424 */ 0xB3A1,0x3532, + /* Array index: 0x1424 */ 0xB3A8,0x3533, + /* Array index: 0x1424 */ 0xB3AC,0x3534, + /* Array index: 0x1424 */ 0xB3C4,0x3535, + /* Array index: 0x1424 */ 0xB3C5,0x3536, + /* Array index: 0x1424 */ 0xB3C8,0x3537, + /* Array index: 0x1424 */ 0xB3CB,0x3538, + /* Array index: 0x1424 */ 0xB3CC,0x3539, + /* Array index: 0x1424 */ 0xB3CE,0x353A, + /* Array index: 0x1424 */ 0xB3D0,0x353B, + /* Array index: 0x1424 */ 0xB3D4,0x353C, + /* Array index: 0x1424 */ 0xB3D5,0x353D, + /* Array index: 0x1424 */ 0xB3D7,0x353E, + /* Array index: 0x1424 */ 0xB3D9,0x353F, + /* Array index: 0x1424 */ 0xB3DB,0x3540, + /* Array index: 0x1424 */ 0xB3DD,0x3541, + /* Array index: 0x1424 */ 0xB3E0,0x3542, + /* Array index: 0x1424 */ 0xB3E4,0x3543, + /* Array index: 0x1424 */ 0xB3E8,0x3544, + /* Array index: 0x1424 */ 0xB3FC,0x3545, + /* Array index: 0x1424 */ 0xB410,0x3546, + /* Array index: 0x1424 */ 0xB418,0x3547, + /* Array index: 0x1424 */ 0xB41C,0x3548, + /* Array index: 0x1424 */ 0xB420,0x3549, + /* Array index: 0x1424 */ 0xB428,0x354A, + /* Array index: 0x1424 */ 0xB429,0x354B, + /* Array index: 0x1424 */ 0xB42B,0x354C, + /* Array index: 0x1424 */ 0xB434,0x354D, + /* Array index: 0x1424 */ 0xB450,0x354E, + /* Array index: 0x1424 */ 0xB451,0x354F, + /* Array index: 0x1424 */ 0xB454,0x3550, + /* Array index: 0x1424 */ 0xB458,0x3551, + /* Array index: 0x1424 */ 0xB460,0x3552, + /* Array index: 0x1424 */ 0xB461,0x3553, + /* Array index: 0x1424 */ 0xB463,0x3554, + /* Array index: 0x1424 */ 0xB465,0x3555, + /* Array index: 0x1424 */ 0xB46C,0x3556, + /* Array index: 0x1424 */ 0xB480,0x3557, + /* Array index: 0x1424 */ 0xB488,0x3558, + /* Array index: 0x1424 */ 0xB49D,0x3559, + /* Array index: 0x1424 */ 0xB4A4,0x355A, + /* Array index: 0x1424 */ 0xB4A8,0x355B, + /* Array index: 0x1424 */ 0xB4AC,0x355C, + /* Array index: 0x1424 */ 0xB4B5,0x355D, + /* Array index: 0x1424 */ 0xB4B7,0x355E, + /* Array index: 0x1424 */ 0xB4B9,0x355F, + /* Array index: 0x1424 */ 0xB4C0,0x3560, + /* Array index: 0x1424 */ 0xB4C4,0x3561, + /* Array index: 0x1424 */ 0xB4C8,0x3562, + /* Array index: 0x1424 */ 0xB4D0,0x3563, + /* Array index: 0x1424 */ 0xB4D5,0x3564, + /* Array index: 0x1424 */ 0xB4DC,0x3565, + /* Array index: 0x1424 */ 0xB4DD,0x3566, + /* Array index: 0x1424 */ 0xB4E0,0x3567, + /* Array index: 0x1424 */ 0xB4E3,0x3568, + /* Array index: 0x1424 */ 0xB4E4,0x3569, + /* Array index: 0x1424 */ 0xB4E6,0x356A, + /* Array index: 0x1424 */ 0xB4EC,0x356B, + /* Array index: 0x1424 */ 0xB4ED,0x356C, + /* Array index: 0x1424 */ 0xB4EF,0x356D, + /* Array index: 0x1424 */ 0xB4F1,0x356E, + /* Array index: 0x1424 */ 0xB4F8,0x356F, + /* Array index: 0x1424 */ 0xB514,0x3570, + /* Array index: 0x1424 */ 0xB515,0x3571, + /* Array index: 0x1424 */ 0xB518,0x3572, + /* Array index: 0x1424 */ 0xB51B,0x3573, + /* Array index: 0x1424 */ 0xB51C,0x3574, + /* Array index: 0x1424 */ 0xB530,0x357B, + /* Array index: 0x1424 */ 0xB531,0x357C, + /* Array index: 0x1424 */ 0xB534,0x357D, + /* Array index: 0x1424 */ 0xB538,0x357E, + /* Array index: 0x1424 */ 0xB550,0x3629, + /* Array index: 0x1424 */ 0xB554,0x362A, + /* Array index: 0x1424 */ 0xB5A0,0x3630, + /* Array index: 0x1424 */ 0xB5A1,0x3631, + /* Array index: 0x1424 */ 0xB5A4,0x3632, + /* Array index: 0x1424 */ 0xB5A8,0x3633, + /* Array index: 0x1424 */ 0xB5AA,0x3634, + /* Array index: 0x1424 */ 0xB5AB,0x3635, + /* Array index: 0x1424 */ 0xB5C0,0x363E, + /* Array index: 0x1424 */ 0xB5C4,0x363F, + /* Array index: 0x1424 */ 0xB5D8,0x3645, + /* Array index: 0x1424 */ 0xB5EC,0x3646, + /* Array index: 0x1424 */ 0xB610,0x3647, + /* Array index: 0x1424 */ 0xB611,0x3648, + /* Array index: 0x1424 */ 0xB614,0x3649, + /* Array index: 0x1424 */ 0xB618,0x364A, + /* Array index: 0x1424 */ 0xB625,0x364B, + /* Array index: 0x1424 */ 0xB62C,0x364C, + /* Array index: 0x1424 */ 0xB634,0x364D, + /* Array index: 0x1424 */ 0xB648,0x364E, + /* Array index: 0x1424 */ 0xB664,0x364F, + /* Array index: 0x1424 */ 0xB668,0x3650, + /* Array index: 0x1424 */ 0xB69C,0x3651, + /* Array index: 0x1424 */ 0xB69D,0x3652, + /* Array index: 0x1424 */ 0xB6A0,0x3653, + /* Array index: 0x1424 */ 0xB6A4,0x3654, + /* Array index: 0x1424 */ 0xB6AB,0x3655, + /* Array index: 0x1424 */ 0xB6AC,0x3656, + /* Array index: 0x1424 */ 0xB6B1,0x3657, + /* Array index: 0x1424 */ 0xB6D4,0x3658, + /* Array index: 0x1424 */ 0xB6F0,0x3659, + /* Array index: 0x1424 */ 0xB6F4,0x365A, + /* Array index: 0x1424 */ 0xB6F8,0x365B, + /* Array index: 0x1424 */ 0xB700,0x365C, + /* Array index: 0x1424 */ 0xB701,0x365D, + /* Array index: 0x1424 */ 0xB705,0x365E, + /* Array index: 0x1424 */ 0xB728,0x365F, + /* Array index: 0x1424 */ 0xB729,0x3660, + /* Array index: 0x1424 */ 0xB72C,0x3661, + /* Array index: 0x1424 */ 0xB72F,0x3662, + /* Array index: 0x1424 */ 0xB730,0x3663, + /* Array index: 0x1424 */ 0xB738,0x3664, + /* Array index: 0x1424 */ 0xB739,0x3665, + /* Array index: 0x1424 */ 0xB73B,0x3666, + /* Array index: 0x1424 */ 0xB744,0x3667, + /* Array index: 0x1424 */ 0xB748,0x3668, + /* Array index: 0x1424 */ 0xB74C,0x3669, + /* Array index: 0x1424 */ 0xB754,0x366A, + /* Array index: 0x1424 */ 0xB755,0x366B, + /* Array index: 0x1424 */ 0xB760,0x366C, + /* Array index: 0x1424 */ 0xB764,0x366D, + /* Array index: 0x1424 */ 0xB768,0x366E, + /* Array index: 0x1424 */ 0xB770,0x366F, + /* Array index: 0x1424 */ 0xB771,0x3670, + /* Array index: 0x1424 */ 0xB773,0x3671, + /* Array index: 0x1424 */ 0xB775,0x3672, + /* Array index: 0x1424 */ 0xB77C,0x3673, + /* Array index: 0x1424 */ 0xB77D,0x3674, + /* Array index: 0x1424 */ 0xB780,0x3675, + /* Array index: 0x1424 */ 0xB784,0x3676, + /* Array index: 0x1424 */ 0xB79C,0x3723, + /* Array index: 0x1424 */ 0xB7A0,0x3724, + /* Array index: 0x1424 */ 0xB7B4,0x372A, + /* Array index: 0x1424 */ 0xB7B5,0x372B, + /* Array index: 0x1424 */ 0xB7B8,0x372C, + /* Array index: 0x1424 */ 0xB7C7,0x372D, + /* Array index: 0x1424 */ 0xB7C9,0x372E, + /* Array index: 0x1424 */ 0xB7EC,0x372F, + /* Array index: 0x1424 */ 0xB7ED,0x3730, + /* Array index: 0x1424 */ 0xB7F0,0x3731, + /* Array index: 0x1424 */ 0xB7F4,0x3732, + /* Array index: 0x1424 */ 0xB80C,0x373B, + /* Array index: 0x1424 */ 0xB810,0x373C, + /* Array index: 0x1424 */ 0xB818,0x373D, + /* Array index: 0x1424 */ 0xB819,0x373E, + /* Array index: 0x1424 */ 0xB81B,0x373F, + /* Array index: 0x1424 */ 0xB81D,0x3740, + /* Array index: 0x1424 */ 0xB824,0x3741, + /* Array index: 0x1424 */ 0xB825,0x3742, + /* Array index: 0x1424 */ 0xB828,0x3743, + /* Array index: 0x1424 */ 0xB82C,0x3744, + /* Array index: 0x1424 */ 0xB840,0x374A, + /* Array index: 0x1424 */ 0xB844,0x374B, + /* Array index: 0x1424 */ 0xB851,0x374C, + /* Array index: 0x1424 */ 0xB853,0x374D, + /* Array index: 0x1424 */ 0xB85C,0x374E, + /* Array index: 0x1424 */ 0xB85D,0x374F, + /* Array index: 0x1424 */ 0xB860,0x3750, + /* Array index: 0x1424 */ 0xB864,0x3751, + /* Array index: 0x1424 */ 0xB86C,0x3752, + /* Array index: 0x1424 */ 0xB86D,0x3753, + /* Array index: 0x1424 */ 0xB86F,0x3754, + /* Array index: 0x1424 */ 0xB871,0x3755, + /* Array index: 0x1424 */ 0xB878,0x3756, + /* Array index: 0x1424 */ 0xB87C,0x3757, + /* Array index: 0x1424 */ 0xB88D,0x3758, + /* Array index: 0x1424 */ 0xB8A8,0x3759, + /* Array index: 0x1424 */ 0xB8B0,0x375A, + /* Array index: 0x1424 */ 0xB8B4,0x375B, + /* Array index: 0x1424 */ 0xB8B8,0x375C, + /* Array index: 0x1424 */ 0xB8C0,0x375D, + /* Array index: 0x1424 */ 0xB8C1,0x375E, + /* Array index: 0x1424 */ 0xB8C3,0x375F, + /* Array index: 0x1424 */ 0xB8C5,0x3760, + /* Array index: 0x1424 */ 0xB8CC,0x3761, + /* Array index: 0x1424 */ 0xB8D0,0x3762, + /* Array index: 0x1424 */ 0xB8D4,0x3763, + /* Array index: 0x1424 */ 0xB8DD,0x3764, + /* Array index: 0x1424 */ 0xB8DF,0x3765, + /* Array index: 0x1424 */ 0xB8E1,0x3766, + /* Array index: 0x1424 */ 0xB8E8,0x3767, + /* Array index: 0x1424 */ 0xB8E9,0x3768, + /* Array index: 0x1424 */ 0xB8EC,0x3769, + /* Array index: 0x1424 */ 0xB8F0,0x376A, + /* Array index: 0x1424 */ 0xB8F8,0x376B, + /* Array index: 0x1424 */ 0xB8F9,0x376C, + /* Array index: 0x1424 */ 0xB8FB,0x376D, + /* Array index: 0x1424 */ 0xB8FD,0x376E, + /* Array index: 0x1424 */ 0xB904,0x376F, + /* Array index: 0x1424 */ 0xB918,0x3770, + /* Array index: 0x1424 */ 0xB920,0x3771, + /* Array index: 0x1424 */ 0xB93C,0x3772, + /* Array index: 0x1424 */ 0xB93D,0x3773, + /* Array index: 0x1424 */ 0xB940,0x3774, + /* Array index: 0x1424 */ 0xB944,0x3775, + /* Array index: 0x1424 */ 0xB94C,0x3776, + /* Array index: 0x1424 */ 0xB94F,0x3777, + /* Array index: 0x1424 */ 0xB951,0x3778, + /* Array index: 0x1424 */ 0xB958,0x3779, + /* Array index: 0x1424 */ 0xB959,0x377A, + /* Array index: 0x1424 */ 0xB95C,0x377B, + /* Array index: 0x1424 */ 0xB960,0x377C, + /* Array index: 0x1424 */ 0xB968,0x377D, + /* Array index: 0x1424 */ 0xB969,0x377E, + /* Array index: 0x1424 */ 0xB96B,0x3821, + /* Array index: 0x1424 */ 0xB96D,0x3822, + /* Array index: 0x1424 */ 0xB974,0x3823, + /* Array index: 0x1424 */ 0xB975,0x3824, + /* Array index: 0x1424 */ 0xB978,0x3825, + /* Array index: 0x1424 */ 0xB97C,0x3826, + /* Array index: 0x1424 */ 0xB984,0x3827, + /* Array index: 0x1424 */ 0xB985,0x3828, + /* Array index: 0x1424 */ 0xB987,0x3829, + /* Array index: 0x1424 */ 0xB989,0x382A, + /* Array index: 0x1424 */ 0xB98A,0x382B, + /* Array index: 0x1424 */ 0xB98D,0x382C, + /* Array index: 0x1424 */ 0xB98E,0x382D, + /* Array index: 0x1424 */ 0xB9AC,0x382E, + /* Array index: 0x1424 */ 0xB9AD,0x382F, + /* Array index: 0x1424 */ 0xB9B0,0x3830, + /* Array index: 0x1424 */ 0xB9B4,0x3831, + /* Array index: 0x1424 */ 0xB9BC,0x3832, + /* Array index: 0x1424 */ 0xB9BD,0x3833, + /* Array index: 0x1424 */ 0xB9BF,0x3834, + /* Array index: 0x1424 */ 0xB9C1,0x3835, + /* Array index: 0x1424 */ 0xB9C8,0x3836, + /* Array index: 0x1424 */ 0xB9C9,0x3837, + /* Array index: 0x1424 */ 0xB9D8,0x383E, + /* Array index: 0x1424 */ 0xB9D9,0x383F, + /* Array index: 0x1424 */ 0xB9DB,0x3840, + /* Array index: 0x1424 */ 0xB9DD,0x3841, + /* Array index: 0x1424 */ 0xB9DE,0x3842, + /* Array index: 0x1424 */ 0xB9E8,0x3847, + /* Array index: 0x1424 */ 0xB9EC,0x3848, + /* Array index: 0x1424 */ 0xBA00,0x384F, + /* Array index: 0x1424 */ 0xBA01,0x3850, + /* Array index: 0x1424 */ 0xBA08,0x3851, + /* Array index: 0x1424 */ 0xBA15,0x3852, + /* Array index: 0x1424 */ 0xBA38,0x3853, + /* Array index: 0x1424 */ 0xBA39,0x3854, + /* Array index: 0x1424 */ 0xBA3C,0x3855, + /* Array index: 0x1424 */ 0xBA40,0x3856, + /* Array index: 0x1424 */ 0xBA42,0x3857, + /* Array index: 0x1424 */ 0xBA48,0x3858, + /* Array index: 0x1424 */ 0xBA49,0x3859, + /* Array index: 0x1424 */ 0xBA4B,0x385A, + /* Array index: 0x1424 */ 0xBA4D,0x385B, + /* Array index: 0x1424 */ 0xBA4E,0x385C, + /* Array index: 0x1424 */ 0xBA58,0x3860, + /* Array index: 0x1424 */ 0xBA5C,0x3861, + /* Array index: 0x1424 */ 0xBA70,0x3867, + /* Array index: 0x1424 */ 0xBA71,0x3868, + /* Array index: 0x1424 */ 0xBA74,0x3869, + /* Array index: 0x1424 */ 0xBA78,0x386A, + /* Array index: 0x1424 */ 0xBA8C,0x386F, + /* Array index: 0x1424 */ 0xBAB0,0x3874, + /* Array index: 0x1424 */ 0xBAB2,0x3875, + /* Array index: 0x1424 */ 0xBAB8,0x3876, + /* Array index: 0x1424 */ 0xBAB9,0x3877, + /* Array index: 0x1424 */ 0xBABB,0x3878, + /* Array index: 0x1424 */ 0xBABD,0x3879, + /* Array index: 0x1424 */ 0xBAC4,0x387A, + /* Array index: 0x1424 */ 0xBAC8,0x387B, + /* Array index: 0x1424 */ 0xBAD8,0x387C, + /* Array index: 0x1424 */ 0xBAD9,0x387D, + /* Array index: 0x1424 */ 0xBAFC,0x387E, + /* Array index: 0x1424 */ 0xBB00,0x3921, + /* Array index: 0x1424 */ 0xBB04,0x3922, + /* Array index: 0x1424 */ 0xBB0D,0x3923, + /* Array index: 0x1424 */ 0xBB0F,0x3924, + /* Array index: 0x1424 */ 0xBB11,0x3925, + /* Array index: 0x1424 */ 0xBB18,0x3926, + /* Array index: 0x1424 */ 0xBB1C,0x3927, + /* Array index: 0x1424 */ 0xBB20,0x3928, + /* Array index: 0x1424 */ 0xBB29,0x3929, + /* Array index: 0x1424 */ 0xBB2B,0x392A, + /* Array index: 0x1424 */ 0xBB44,0x3933, + /* Array index: 0x1424 */ 0xBB45,0x3934, + /* Array index: 0x1424 */ 0xBB47,0x3935, + /* Array index: 0x1424 */ 0xBB49,0x3936, + /* Array index: 0x1424 */ 0xBB4D,0x3937, + /* Array index: 0x1424 */ 0xBB4F,0x3938, + /* Array index: 0x1424 */ 0xBB50,0x3939, + /* Array index: 0x1424 */ 0xBB54,0x393A, + /* Array index: 0x1424 */ 0xBB58,0x393B, + /* Array index: 0x1424 */ 0xBB61,0x393C, + /* Array index: 0x1424 */ 0xBB63,0x393D, + /* Array index: 0x1424 */ 0xBB6C,0x393E, + /* Array index: 0x1424 */ 0xBB88,0x393F, + /* Array index: 0x1424 */ 0xBB8C,0x3940, + /* Array index: 0x1424 */ 0xBB90,0x3941, + /* Array index: 0x1424 */ 0xBBA4,0x3942, + /* Array index: 0x1424 */ 0xBBA8,0x3943, + /* Array index: 0x1424 */ 0xBBAC,0x3944, + /* Array index: 0x1424 */ 0xBBB4,0x3945, + /* Array index: 0x1424 */ 0xBBB7,0x3946, + /* Array index: 0x1424 */ 0xBBC0,0x3947, + /* Array index: 0x1424 */ 0xBBC4,0x3948, + /* Array index: 0x1424 */ 0xBBC8,0x3949, + /* Array index: 0x1424 */ 0xBBD0,0x394A, + /* Array index: 0x1424 */ 0xBBD3,0x394B, + /* Array index: 0x1424 */ 0xBBF8,0x394C, + /* Array index: 0x1424 */ 0xBBF9,0x394D, + /* Array index: 0x1424 */ 0xBBFC,0x394E, + /* Array index: 0x1424 */ 0xBBFF,0x394F, + /* Array index: 0x1424 */ 0xBC00,0x3950, + /* Array index: 0x1424 */ 0xBC02,0x3951, + /* Array index: 0x1424 */ 0xBC24,0x3963, + /* Array index: 0x1424 */ 0xBC25,0x3964, + /* Array index: 0x1424 */ 0xBC27,0x3965, + /* Array index: 0x1424 */ 0xBC29,0x3966, + /* Array index: 0x1424 */ 0xBC2D,0x3967, + /* Array index: 0x1424 */ 0xBC30,0x3968, + /* Array index: 0x1424 */ 0xBC31,0x3969, + /* Array index: 0x1424 */ 0xBC34,0x396A, + /* Array index: 0x1424 */ 0xBC38,0x396B, + /* Array index: 0x1424 */ 0xBC49,0x3971, + /* Array index: 0x1424 */ 0xBC4C,0x3972, + /* Array index: 0x1424 */ 0xBC4D,0x3973, + /* Array index: 0x1424 */ 0xBC50,0x3974, + /* Array index: 0x1424 */ 0xBC5D,0x3975, + /* Array index: 0x1424 */ 0xBC84,0x3976, + /* Array index: 0x1424 */ 0xBC85,0x3977, + /* Array index: 0x1424 */ 0xBC88,0x3978, + /* Array index: 0x1424 */ 0xBC8B,0x3979, + /* Array index: 0x1424 */ 0xBC8C,0x397A, + /* Array index: 0x1424 */ 0xBC8E,0x397B, + /* Array index: 0x1424 */ 0xBC94,0x397C, + /* Array index: 0x1424 */ 0xBC95,0x397D, + /* Array index: 0x1424 */ 0xBC97,0x397E, + /* Array index: 0x1424 */ 0xBC99,0x3A21, + /* Array index: 0x1424 */ 0xBC9A,0x3A22, + /* Array index: 0x1424 */ 0xBCA0,0x3A23, + /* Array index: 0x1424 */ 0xBCA1,0x3A24, + /* Array index: 0x1424 */ 0xBCA4,0x3A25, + /* Array index: 0x1424 */ 0xBCA7,0x3A26, + /* Array index: 0x1424 */ 0xBCA8,0x3A27, + /* Array index: 0x1424 */ 0xBCBC,0x3A2D, + /* Array index: 0x1424 */ 0xBCBD,0x3A2E, + /* Array index: 0x1424 */ 0xBCC0,0x3A2F, + /* Array index: 0x1424 */ 0xBCC4,0x3A30, + /* Array index: 0x1424 */ 0xBCD5,0x3A35, + /* Array index: 0x1424 */ 0xBCD8,0x3A36, + /* Array index: 0x1424 */ 0xBCDC,0x3A37, + /* Array index: 0x1424 */ 0xBCFC,0x3A3C, + /* Array index: 0x1424 */ 0xBD04,0x3A3D, + /* Array index: 0x1424 */ 0xBD05,0x3A3E, + /* Array index: 0x1424 */ 0xBD07,0x3A3F, + /* Array index: 0x1424 */ 0xBD09,0x3A40, + /* Array index: 0x1424 */ 0xBD10,0x3A41, + /* Array index: 0x1424 */ 0xBD14,0x3A42, + /* Array index: 0x1424 */ 0xBD24,0x3A43, + /* Array index: 0x1424 */ 0xBD2C,0x3A44, + /* Array index: 0x1424 */ 0xBD40,0x3A45, + /* Array index: 0x1424 */ 0xBD48,0x3A46, + /* Array index: 0x1424 */ 0xBD49,0x3A47, + /* Array index: 0x1424 */ 0xBD4C,0x3A48, + /* Array index: 0x1424 */ 0xBD50,0x3A49, + /* Array index: 0x1424 */ 0xBD58,0x3A4A, + /* Array index: 0x1424 */ 0xBD59,0x3A4B, + /* Array index: 0x1424 */ 0xBD64,0x3A4C, + /* Array index: 0x1424 */ 0xBD68,0x3A4D, + /* Array index: 0x1424 */ 0xBD80,0x3A4E, + /* Array index: 0x1424 */ 0xBD81,0x3A4F, + /* Array index: 0x1424 */ 0xBD84,0x3A50, + /* Array index: 0x1424 */ 0xBD90,0x3A55, + /* Array index: 0x1424 */ 0xBD91,0x3A56, + /* Array index: 0x1424 */ 0xBD93,0x3A57, + /* Array index: 0x1424 */ 0xBD95,0x3A58, + /* Array index: 0x1424 */ 0xBD99,0x3A59, + /* Array index: 0x1424 */ 0xBD9A,0x3A5A, + /* Array index: 0x1424 */ 0xBD9C,0x3A5B, + /* Array index: 0x1424 */ 0xBDA4,0x3A5C, + /* Array index: 0x1424 */ 0xBDB0,0x3A5D, + /* Array index: 0x1424 */ 0xBDB8,0x3A5E, + /* Array index: 0x1424 */ 0xBDD4,0x3A5F, + /* Array index: 0x1424 */ 0xBDD5,0x3A60, + /* Array index: 0x1424 */ 0xBDD8,0x3A61, + /* Array index: 0x1424 */ 0xBDDC,0x3A62, + /* Array index: 0x1424 */ 0xBDE9,0x3A63, + /* Array index: 0x1424 */ 0xBDF0,0x3A64, + /* Array index: 0x1424 */ 0xBDF4,0x3A65, + /* Array index: 0x1424 */ 0xBDF8,0x3A66, + /* Array index: 0x1424 */ 0xBE00,0x3A67, + /* Array index: 0x1424 */ 0xBE03,0x3A68, + /* Array index: 0x1424 */ 0xBE05,0x3A69, + /* Array index: 0x1424 */ 0xBE0C,0x3A6A, + /* Array index: 0x1424 */ 0xBE0D,0x3A6B, + /* Array index: 0x1424 */ 0xBE10,0x3A6C, + /* Array index: 0x1424 */ 0xBE14,0x3A6D, + /* Array index: 0x1424 */ 0xBE1C,0x3A6E, + /* Array index: 0x1424 */ 0xBE1D,0x3A6F, + /* Array index: 0x1424 */ 0xBE1F,0x3A70, + /* Array index: 0x1424 */ 0xBE44,0x3A71, + /* Array index: 0x1424 */ 0xBE45,0x3A72, + /* Array index: 0x1424 */ 0xBE48,0x3A73, + /* Array index: 0x1424 */ 0xBE4C,0x3A74, + /* Array index: 0x1424 */ 0xBE4E,0x3A75, + /* Array index: 0x1424 */ 0xBE54,0x3A76, + /* Array index: 0x1424 */ 0xBE55,0x3A77, + /* Array index: 0x1424 */ 0xBE60,0x3A7C, + /* Array index: 0x1424 */ 0xBE61,0x3A7D, + /* Array index: 0x1424 */ 0xBE64,0x3A7E, + /* Array index: 0x1424 */ 0xBE68,0x3B21, + /* Array index: 0x1424 */ 0xBE6A,0x3B22, + /* Array index: 0x1424 */ 0xBE80,0x3B2B, + /* Array index: 0x1424 */ 0xBE84,0x3B2C, + /* Array index: 0x1424 */ 0xBE98,0x3B32, + /* Array index: 0x1424 */ 0xBE99,0x3B33, + /* Array index: 0x1424 */ 0xBEA8,0x3B34, + /* Array index: 0x1424 */ 0xBED0,0x3B35, + /* Array index: 0x1424 */ 0xBED1,0x3B36, + /* Array index: 0x1424 */ 0xBED4,0x3B37, + /* Array index: 0x1424 */ 0xBED7,0x3B38, + /* Array index: 0x1424 */ 0xBED8,0x3B39, + /* Array index: 0x1424 */ 0xBEE0,0x3B3A, + /* Array index: 0x1424 */ 0xBEEC,0x3B3E, + /* Array index: 0x1424 */ 0xBF01,0x3B3F, + /* Array index: 0x1424 */ 0xBF08,0x3B40, + /* Array index: 0x1424 */ 0xBF09,0x3B41, + /* Array index: 0x1424 */ 0xBF40,0x3B47, + /* Array index: 0x1424 */ 0xBF41,0x3B48, + /* Array index: 0x1424 */ 0xBF44,0x3B49, + /* Array index: 0x1424 */ 0xBF48,0x3B4A, + /* Array index: 0x1424 */ 0xBF50,0x3B4B, + /* Array index: 0x1424 */ 0xBF51,0x3B4C, + /* Array index: 0x1424 */ 0xBF55,0x3B4D, + /* Array index: 0x1424 */ 0xBF94,0x3B4E, + /* Array index: 0x1424 */ 0xBFB0,0x3B4F, + /* Array index: 0x1424 */ 0xBFC5,0x3B50, + /* Array index: 0x1424 */ 0xBFCC,0x3B51, + /* Array index: 0x1424 */ 0xBFCD,0x3B52, + /* Array index: 0x1424 */ 0xBFD0,0x3B53, + /* Array index: 0x1424 */ 0xBFD4,0x3B54, + /* Array index: 0x1424 */ 0xBFDC,0x3B55, + /* Array index: 0x1424 */ 0xBFDF,0x3B56, + /* Array index: 0x1424 */ 0xBFE1,0x3B57, + /* Array index: 0x1424 */ 0xC03C,0x3B58, + /* Array index: 0x1424 */ 0xC051,0x3B59, + /* Array index: 0x1424 */ 0xC058,0x3B5A, + /* Array index: 0x1424 */ 0xC05C,0x3B5B, + /* Array index: 0x1424 */ 0xC060,0x3B5C, + /* Array index: 0x1424 */ 0xC068,0x3B5D, + /* Array index: 0x1424 */ 0xC069,0x3B5E, + /* Array index: 0x1424 */ 0xC090,0x3B5F, + /* Array index: 0x1424 */ 0xC091,0x3B60, + /* Array index: 0x1424 */ 0xC094,0x3B61, + /* Array index: 0x1424 */ 0xC098,0x3B62, + /* Array index: 0x1424 */ 0xC0A0,0x3B63, + /* Array index: 0x1424 */ 0xC0A1,0x3B64, + /* Array index: 0x1424 */ 0xC0A3,0x3B65, + /* Array index: 0x1424 */ 0xC0A5,0x3B66, + /* Array index: 0x1424 */ 0xC0C5,0x3B74, + /* Array index: 0x1424 */ 0xC0C8,0x3B75, + /* Array index: 0x1424 */ 0xC0C9,0x3B76, + /* Array index: 0x1424 */ 0xC0CC,0x3B77, + /* Array index: 0x1424 */ 0xC0D0,0x3B78, + /* Array index: 0x1424 */ 0xC0E4,0x3B7E, + /* Array index: 0x1424 */ 0xC0E5,0x3C21, + /* Array index: 0x1424 */ 0xC0E8,0x3C22, + /* Array index: 0x1424 */ 0xC0EC,0x3C23, + /* Array index: 0x1424 */ 0xC0F4,0x3C24, + /* Array index: 0x1424 */ 0xC0F5,0x3C25, + /* Array index: 0x1424 */ 0xC0F7,0x3C26, + /* Array index: 0x1424 */ 0xC0F9,0x3C27, + /* Array index: 0x1424 */ 0xC100,0x3C28, + /* Array index: 0x1424 */ 0xC104,0x3C29, + /* Array index: 0x1424 */ 0xC108,0x3C2A, + /* Array index: 0x1424 */ 0xC110,0x3C2B, + /* Array index: 0x1424 */ 0xC115,0x3C2C, + /* Array index: 0x1424 */ 0xC136,0x3C3B, + /* Array index: 0x1424 */ 0xC138,0x3C3C, + /* Array index: 0x1424 */ 0xC139,0x3C3D, + /* Array index: 0x1424 */ 0xC13C,0x3C3E, + /* Array index: 0x1424 */ 0xC140,0x3C3F, + /* Array index: 0x1424 */ 0xC154,0x3C45, + /* Array index: 0x1424 */ 0xC155,0x3C46, + /* Array index: 0x1424 */ 0xC158,0x3C47, + /* Array index: 0x1424 */ 0xC15C,0x3C48, + /* Array index: 0x1424 */ 0xC170,0x3C4E, + /* Array index: 0x1424 */ 0xC174,0x3C4F, + /* Array index: 0x1424 */ 0xC178,0x3C50, + /* Array index: 0x1424 */ 0xC185,0x3C51, + /* Array index: 0x1424 */ 0xC194,0x3C56, + /* Array index: 0x1424 */ 0xC196,0x3C57, + /* Array index: 0x1424 */ 0xC19C,0x3C58, + /* Array index: 0x1424 */ 0xC19D,0x3C59, + /* Array index: 0x1424 */ 0xC19F,0x3C5A, + /* Array index: 0x1424 */ 0xC1A1,0x3C5B, + /* Array index: 0x1424 */ 0xC1A5,0x3C5C, + /* Array index: 0x1424 */ 0xC1A8,0x3C5D, + /* Array index: 0x1424 */ 0xC1A9,0x3C5E, + /* Array index: 0x1424 */ 0xC1AC,0x3C5F, + /* Array index: 0x1424 */ 0xC1B0,0x3C60, + /* Array index: 0x1424 */ 0xC1BD,0x3C61, + /* Array index: 0x1424 */ 0xC1C4,0x3C62, + /* Array index: 0x1424 */ 0xC1C8,0x3C63, + /* Array index: 0x1424 */ 0xC1CC,0x3C64, + /* Array index: 0x1424 */ 0xC1D4,0x3C65, + /* Array index: 0x1424 */ 0xC1D7,0x3C66, + /* Array index: 0x1424 */ 0xC1D8,0x3C67, + /* Array index: 0x1424 */ 0xC1E0,0x3C68, + /* Array index: 0x1424 */ 0xC1E4,0x3C69, + /* Array index: 0x1424 */ 0xC1E8,0x3C6A, + /* Array index: 0x1424 */ 0xC1F0,0x3C6B, + /* Array index: 0x1424 */ 0xC1F1,0x3C6C, + /* Array index: 0x1424 */ 0xC1F3,0x3C6D, + /* Array index: 0x1424 */ 0xC1FC,0x3C6E, + /* Array index: 0x1424 */ 0xC1FD,0x3C6F, + /* Array index: 0x1424 */ 0xC200,0x3C70, + /* Array index: 0x1424 */ 0xC204,0x3C71, + /* Array index: 0x1424 */ 0xC20C,0x3C72, + /* Array index: 0x1424 */ 0xC20D,0x3C73, + /* Array index: 0x1424 */ 0xC20F,0x3C74, + /* Array index: 0x1424 */ 0xC211,0x3C75, + /* Array index: 0x1424 */ 0xC218,0x3C76, + /* Array index: 0x1424 */ 0xC219,0x3C77, + /* Array index: 0x1424 */ 0xC21C,0x3C78, + /* Array index: 0x1424 */ 0xC21F,0x3C79, + /* Array index: 0x1424 */ 0xC220,0x3C7A, + /* Array index: 0x1424 */ 0xC228,0x3C7B, + /* Array index: 0x1424 */ 0xC229,0x3C7C, + /* Array index: 0x1424 */ 0xC22B,0x3C7D, + /* Array index: 0x1424 */ 0xC22D,0x3C7E, + /* Array index: 0x1424 */ 0xC22F,0x3D21, + /* Array index: 0x1424 */ 0xC231,0x3D22, + /* Array index: 0x1424 */ 0xC232,0x3D23, + /* Array index: 0x1424 */ 0xC234,0x3D24, + /* Array index: 0x1424 */ 0xC248,0x3D25, + /* Array index: 0x1424 */ 0xC250,0x3D26, + /* Array index: 0x1424 */ 0xC251,0x3D27, + /* Array index: 0x1424 */ 0xC254,0x3D28, + /* Array index: 0x1424 */ 0xC258,0x3D29, + /* Array index: 0x1424 */ 0xC260,0x3D2A, + /* Array index: 0x1424 */ 0xC265,0x3D2B, + /* Array index: 0x1424 */ 0xC26C,0x3D2C, + /* Array index: 0x1424 */ 0xC26D,0x3D2D, + /* Array index: 0x1424 */ 0xC270,0x3D2E, + /* Array index: 0x1424 */ 0xC274,0x3D2F, + /* Array index: 0x1424 */ 0xC27C,0x3D30, + /* Array index: 0x1424 */ 0xC27D,0x3D31, + /* Array index: 0x1424 */ 0xC27F,0x3D32, + /* Array index: 0x1424 */ 0xC281,0x3D33, + /* Array index: 0x1424 */ 0xC288,0x3D34, + /* Array index: 0x1424 */ 0xC289,0x3D35, + /* Array index: 0x1424 */ 0xC290,0x3D36, + /* Array index: 0x1424 */ 0xC298,0x3D37, + /* Array index: 0x1424 */ 0xC29B,0x3D38, + /* Array index: 0x1424 */ 0xC29D,0x3D39, + /* Array index: 0x1424 */ 0xC2A4,0x3D3A, + /* Array index: 0x1424 */ 0xC2A5,0x3D3B, + /* Array index: 0x1424 */ 0xC2A8,0x3D3C, + /* Array index: 0x1424 */ 0xC2AC,0x3D3D, + /* Array index: 0x1424 */ 0xC2AD,0x3D3E, + /* Array index: 0x1424 */ 0xC2B4,0x3D3F, + /* Array index: 0x1424 */ 0xC2B5,0x3D40, + /* Array index: 0x1424 */ 0xC2B7,0x3D41, + /* Array index: 0x1424 */ 0xC2B9,0x3D42, + /* Array index: 0x1424 */ 0xC2DC,0x3D43, + /* Array index: 0x1424 */ 0xC2DD,0x3D44, + /* Array index: 0x1424 */ 0xC2E0,0x3D45, + /* Array index: 0x1424 */ 0xC2E3,0x3D46, + /* Array index: 0x1424 */ 0xC2E4,0x3D47, + /* Array index: 0x1424 */ 0xC2F6,0x3D4D, + /* Array index: 0x1424 */ 0xC300,0x3D52, + /* Array index: 0x1424 */ 0xC308,0x3D53, + /* Array index: 0x1424 */ 0xC309,0x3D54, + /* Array index: 0x1424 */ 0xC30C,0x3D55, + /* Array index: 0x1424 */ 0xC30D,0x3D56, + /* Array index: 0x1424 */ 0xC318,0x3D5A, + /* Array index: 0x1424 */ 0xC31C,0x3D5B, + /* Array index: 0x1424 */ 0xC324,0x3D5C, + /* Array index: 0x1424 */ 0xC325,0x3D5D, + /* Array index: 0x1424 */ 0xC328,0x3D5E, + /* Array index: 0x1424 */ 0xC329,0x3D5F, + /* Array index: 0x1424 */ 0xC345,0x3D60, + /* Array index: 0x1424 */ 0xC368,0x3D61, + /* Array index: 0x1424 */ 0xC369,0x3D62, + /* Array index: 0x1424 */ 0xC36C,0x3D63, + /* Array index: 0x1424 */ 0xC370,0x3D64, + /* Array index: 0x1424 */ 0xC372,0x3D65, + /* Array index: 0x1424 */ 0xC378,0x3D66, + /* Array index: 0x1424 */ 0xC379,0x3D67, + /* Array index: 0x1424 */ 0xC37C,0x3D68, + /* Array index: 0x1424 */ 0xC37D,0x3D69, + /* Array index: 0x1424 */ 0xC384,0x3D6A, + /* Array index: 0x1424 */ 0xC388,0x3D6B, + /* Array index: 0x1424 */ 0xC38C,0x3D6C, + /* Array index: 0x1424 */ 0xC3C0,0x3D6D, + /* Array index: 0x1424 */ 0xC3D8,0x3D6E, + /* Array index: 0x1424 */ 0xC3D9,0x3D6F, + /* Array index: 0x1424 */ 0xC3DC,0x3D70, + /* Array index: 0x1424 */ 0xC3DF,0x3D71, + /* Array index: 0x1424 */ 0xC3E0,0x3D72, + /* Array index: 0x1424 */ 0xC3E2,0x3D73, + /* Array index: 0x1424 */ 0xC3E8,0x3D74, + /* Array index: 0x1424 */ 0xC3E9,0x3D75, + /* Array index: 0x1424 */ 0xC3ED,0x3D76, + /* Array index: 0x1424 */ 0xC3F4,0x3D77, + /* Array index: 0x1424 */ 0xC3F5,0x3D78, + /* Array index: 0x1424 */ 0xC3F8,0x3D79, + /* Array index: 0x1424 */ 0xC408,0x3D7A, + /* Array index: 0x1424 */ 0xC410,0x3D7B, + /* Array index: 0x1424 */ 0xC424,0x3D7C, + /* Array index: 0x1424 */ 0xC42C,0x3D7D, + /* Array index: 0x1424 */ 0xC430,0x3D7E, + /* Array index: 0x1424 */ 0xC434,0x3E21, + /* Array index: 0x1424 */ 0xC43C,0x3E22, + /* Array index: 0x1424 */ 0xC43D,0x3E23, + /* Array index: 0x1424 */ 0xC448,0x3E24, + /* Array index: 0x1424 */ 0xC464,0x3E25, + /* Array index: 0x1424 */ 0xC465,0x3E26, + /* Array index: 0x1424 */ 0xC468,0x3E27, + /* Array index: 0x1424 */ 0xC46C,0x3E28, + /* Array index: 0x1424 */ 0xC474,0x3E29, + /* Array index: 0x1424 */ 0xC475,0x3E2A, + /* Array index: 0x1424 */ 0xC479,0x3E2B, + /* Array index: 0x1424 */ 0xC480,0x3E2C, + /* Array index: 0x1424 */ 0xC494,0x3E2D, + /* Array index: 0x1424 */ 0xC49C,0x3E2E, + /* Array index: 0x1424 */ 0xC4B8,0x3E2F, + /* Array index: 0x1424 */ 0xC4BC,0x3E30, + /* Array index: 0x1424 */ 0xC4E9,0x3E31, + /* Array index: 0x1424 */ 0xC4F0,0x3E32, + /* Array index: 0x1424 */ 0xC4F1,0x3E33, + /* Array index: 0x1424 */ 0xC4F4,0x3E34, + /* Array index: 0x1424 */ 0xC4F8,0x3E35, + /* Array index: 0x1424 */ 0xC4FA,0x3E36, + /* Array index: 0x1424 */ 0xC50C,0x3E3A, + /* Array index: 0x1424 */ 0xC510,0x3E3B, + /* Array index: 0x1424 */ 0xC514,0x3E3C, + /* Array index: 0x1424 */ 0xC51C,0x3E3D, + /* Array index: 0x1424 */ 0xC528,0x3E3E, + /* Array index: 0x1424 */ 0xC529,0x3E3F, + /* Array index: 0x1424 */ 0xC52C,0x3E40, + /* Array index: 0x1424 */ 0xC530,0x3E41, + /* Array index: 0x1424 */ 0xC538,0x3E42, + /* Array index: 0x1424 */ 0xC539,0x3E43, + /* Array index: 0x1424 */ 0xC53B,0x3E44, + /* Array index: 0x1424 */ 0xC53D,0x3E45, + /* Array index: 0x1424 */ 0xC564,0x3E58, + /* Array index: 0x1424 */ 0xC568,0x3E59, + /* Array index: 0x1424 */ 0xC57C,0x3E5F, + /* Array index: 0x1424 */ 0xC57D,0x3E60, + /* Array index: 0x1424 */ 0xC580,0x3E61, + /* Array index: 0x1424 */ 0xC584,0x3E62, + /* Array index: 0x1424 */ 0xC587,0x3E63, + /* Array index: 0x1424 */ 0xC58C,0x3E64, + /* Array index: 0x1424 */ 0xC58D,0x3E65, + /* Array index: 0x1424 */ 0xC58F,0x3E66, + /* Array index: 0x1424 */ 0xC591,0x3E67, + /* Array index: 0x1424 */ 0xC595,0x3E68, + /* Array index: 0x1424 */ 0xC597,0x3E69, + /* Array index: 0x1424 */ 0xC598,0x3E6A, + /* Array index: 0x1424 */ 0xC59C,0x3E6B, + /* Array index: 0x1424 */ 0xC5A0,0x3E6C, + /* Array index: 0x1424 */ 0xC5A9,0x3E6D, + /* Array index: 0x1424 */ 0xC5B4,0x3E6E, + /* Array index: 0x1424 */ 0xC5B5,0x3E6F, + /* Array index: 0x1424 */ 0xC5D4,0x3F23, + /* Array index: 0x1424 */ 0xC5D8,0x3F24, + /* Array index: 0x1424 */ 0xC5E0,0x3F25, + /* Array index: 0x1424 */ 0xC5E1,0x3F26, + /* Array index: 0x1424 */ 0xC5E3,0x3F27, + /* Array index: 0x1424 */ 0xC5E5,0x3F28, + /* Array index: 0x1424 */ 0xC5F4,0x3F2D, + /* Array index: 0x1424 */ 0xC5F6,0x3F2E, + /* Array index: 0x1424 */ 0xC5F7,0x3F2F, + /* Array index: 0x1424 */ 0xC60C,0x3F3A, + /* Array index: 0x1424 */ 0xC610,0x3F3B, + /* Array index: 0x1424 */ 0xC624,0x3F40, + /* Array index: 0x1424 */ 0xC625,0x3F41, + /* Array index: 0x1424 */ 0xC628,0x3F42, + /* Array index: 0x1424 */ 0xC640,0x3F4D, + /* Array index: 0x1424 */ 0xC641,0x3F4E, + /* Array index: 0x1424 */ 0xC644,0x3F4F, + /* Array index: 0x1424 */ 0xC648,0x3F50, + /* Array index: 0x1424 */ 0xC65C,0x3F56, + /* Array index: 0x1424 */ 0xC65D,0x3F57, + /* Array index: 0x1424 */ 0xC660,0x3F58, + /* Array index: 0x1424 */ 0xC66C,0x3F59, + /* Array index: 0x1424 */ 0xC66F,0x3F5A, + /* Array index: 0x1424 */ 0xC671,0x3F5B, + /* Array index: 0x1424 */ 0xC678,0x3F5C, + /* Array index: 0x1424 */ 0xC679,0x3F5D, + /* Array index: 0x1424 */ 0xC67C,0x3F5E, + /* Array index: 0x1424 */ 0xC680,0x3F5F, + /* Array index: 0x1424 */ 0xC688,0x3F60, + /* Array index: 0x1424 */ 0xC689,0x3F61, + /* Array index: 0x1424 */ 0xC68B,0x3F62, + /* Array index: 0x1424 */ 0xC68D,0x3F63, + /* Array index: 0x1424 */ 0xC694,0x3F64, + /* Array index: 0x1424 */ 0xC695,0x3F65, + /* Array index: 0x1424 */ 0xC698,0x3F66, + /* Array index: 0x1424 */ 0xC69C,0x3F67, + /* Array index: 0x1424 */ 0xC6A4,0x3F68, + /* Array index: 0x1424 */ 0xC6A5,0x3F69, + /* Array index: 0x1424 */ 0xC6A7,0x3F6A, + /* Array index: 0x1424 */ 0xC6A9,0x3F6B, + /* Array index: 0x1424 */ 0xC6B0,0x3F6C, + /* Array index: 0x1424 */ 0xC6B1,0x3F6D, + /* Array index: 0x1424 */ 0xC6B4,0x3F6E, + /* Array index: 0x1424 */ 0xC6C0,0x3F72, + /* Array index: 0x1424 */ 0xC6C1,0x3F73, + /* Array index: 0x1424 */ 0xC6C3,0x3F74, + /* Array index: 0x1424 */ 0xC6C5,0x3F75, + /* Array index: 0x1424 */ 0xC6CC,0x3F76, + /* Array index: 0x1424 */ 0xC6CD,0x3F77, + /* Array index: 0x1424 */ 0xC6D0,0x3F78, + /* Array index: 0x1424 */ 0xC6D4,0x3F79, + /* Array index: 0x1424 */ 0xC6DC,0x3F7A, + /* Array index: 0x1424 */ 0xC6DD,0x3F7B, + /* Array index: 0x1424 */ 0xC6E0,0x3F7C, + /* Array index: 0x1424 */ 0xC6E1,0x3F7D, + /* Array index: 0x1424 */ 0xC6E8,0x3F7E, + /* Array index: 0x1424 */ 0xC6E9,0x4021, + /* Array index: 0x1424 */ 0xC6EC,0x4022, + /* Array index: 0x1424 */ 0xC6F0,0x4023, + /* Array index: 0x1424 */ 0xC6F8,0x4024, + /* Array index: 0x1424 */ 0xC6F9,0x4025, + /* Array index: 0x1424 */ 0xC6FD,0x4026, + /* Array index: 0x1424 */ 0xC704,0x4027, + /* Array index: 0x1424 */ 0xC705,0x4028, + /* Array index: 0x1424 */ 0xC708,0x4029, + /* Array index: 0x1424 */ 0xC70C,0x402A, + /* Array index: 0x1424 */ 0xC714,0x402B, + /* Array index: 0x1424 */ 0xC715,0x402C, + /* Array index: 0x1424 */ 0xC717,0x402D, + /* Array index: 0x1424 */ 0xC719,0x402E, + /* Array index: 0x1424 */ 0xC720,0x402F, + /* Array index: 0x1424 */ 0xC721,0x4030, + /* Array index: 0x1424 */ 0xC724,0x4031, + /* Array index: 0x1424 */ 0xC728,0x4032, + /* Array index: 0x1424 */ 0xC730,0x4033, + /* Array index: 0x1424 */ 0xC731,0x4034, + /* Array index: 0x1424 */ 0xC733,0x4035, + /* Array index: 0x1424 */ 0xC735,0x4036, + /* Array index: 0x1424 */ 0xC737,0x4037, + /* Array index: 0x1424 */ 0xC73C,0x4038, + /* Array index: 0x1424 */ 0xC73D,0x4039, + /* Array index: 0x1424 */ 0xC740,0x403A, + /* Array index: 0x1424 */ 0xC744,0x403B, + /* Array index: 0x1424 */ 0xC74A,0x403C, + /* Array index: 0x1424 */ 0xC74C,0x403D, + /* Array index: 0x1424 */ 0xC74D,0x403E, + /* Array index: 0x1424 */ 0xC75C,0x4048, + /* Array index: 0x1424 */ 0xC760,0x4049, + /* Array index: 0x1424 */ 0xC768,0x404A, + /* Array index: 0x1424 */ 0xC76B,0x404B, + /* Array index: 0x1424 */ 0xC774,0x404C, + /* Array index: 0x1424 */ 0xC775,0x404D, + /* Array index: 0x1424 */ 0xC778,0x404E, + /* Array index: 0x1424 */ 0xC78E,0x4059, + /* Array index: 0x1424 */ 0xC790,0x405A, + /* Array index: 0x1424 */ 0xC791,0x405B, + /* Array index: 0x1424 */ 0xC7AC,0x4067, + /* Array index: 0x1424 */ 0xC7AD,0x4068, + /* Array index: 0x1424 */ 0xC7B0,0x4069, + /* Array index: 0x1424 */ 0xC7B4,0x406A, + /* Array index: 0x1424 */ 0xC7C8,0x4070, + /* Array index: 0x1424 */ 0xC7C9,0x4071, + /* Array index: 0x1424 */ 0xC7CC,0x4072, + /* Array index: 0x1424 */ 0xC7CE,0x4073, + /* Array index: 0x1424 */ 0xC7D0,0x4074, + /* Array index: 0x1424 */ 0xC7D8,0x4075, + /* Array index: 0x1424 */ 0xC7DD,0x4076, + /* Array index: 0x1424 */ 0xC7E4,0x4077, + /* Array index: 0x1424 */ 0xC7E8,0x4078, + /* Array index: 0x1424 */ 0xC7EC,0x4079, + /* Array index: 0x1424 */ 0xC800,0x407A, + /* Array index: 0x1424 */ 0xC801,0x407B, + /* Array index: 0x1424 */ 0xC804,0x407C, + /* Array index: 0x1424 */ 0xC808,0x407D, + /* Array index: 0x1424 */ 0xC80A,0x407E, + /* Array index: 0x1424 */ 0xC810,0x4121, + /* Array index: 0x1424 */ 0xC811,0x4122, + /* Array index: 0x1424 */ 0xC813,0x4123, + /* Array index: 0x1424 */ 0xC815,0x4124, + /* Array index: 0x1424 */ 0xC816,0x4125, + /* Array index: 0x1424 */ 0xC81C,0x4126, + /* Array index: 0x1424 */ 0xC81D,0x4127, + /* Array index: 0x1424 */ 0xC820,0x4128, + /* Array index: 0x1424 */ 0xC824,0x4129, + /* Array index: 0x1424 */ 0xC82C,0x412A, + /* Array index: 0x1424 */ 0xC82D,0x412B, + /* Array index: 0x1424 */ 0xC82F,0x412C, + /* Array index: 0x1424 */ 0xC831,0x412D, + /* Array index: 0x1424 */ 0xC838,0x412E, + /* Array index: 0x1424 */ 0xC83C,0x412F, + /* Array index: 0x1424 */ 0xC840,0x4130, + /* Array index: 0x1424 */ 0xC848,0x4131, + /* Array index: 0x1424 */ 0xC849,0x4132, + /* Array index: 0x1424 */ 0xC84C,0x4133, + /* Array index: 0x1424 */ 0xC84D,0x4134, + /* Array index: 0x1424 */ 0xC854,0x4135, + /* Array index: 0x1424 */ 0xC870,0x4136, + /* Array index: 0x1424 */ 0xC871,0x4137, + /* Array index: 0x1424 */ 0xC874,0x4138, + /* Array index: 0x1424 */ 0xC878,0x4139, + /* Array index: 0x1424 */ 0xC87A,0x413A, + /* Array index: 0x1424 */ 0xC880,0x413B, + /* Array index: 0x1424 */ 0xC881,0x413C, + /* Array index: 0x1424 */ 0xC894,0x4144, + /* Array index: 0x1424 */ 0xC89D,0x4145, + /* Array index: 0x1424 */ 0xC89F,0x4146, + /* Array index: 0x1424 */ 0xC8A1,0x4147, + /* Array index: 0x1424 */ 0xC8A8,0x4148, + /* Array index: 0x1424 */ 0xC8BC,0x4149, + /* Array index: 0x1424 */ 0xC8BD,0x414A, + /* Array index: 0x1424 */ 0xC8C4,0x414B, + /* Array index: 0x1424 */ 0xC8C8,0x414C, + /* Array index: 0x1424 */ 0xC8CC,0x414D, + /* Array index: 0x1424 */ 0xC8D4,0x414E, + /* Array index: 0x1424 */ 0xC8D5,0x414F, + /* Array index: 0x1424 */ 0xC8D7,0x4150, + /* Array index: 0x1424 */ 0xC8D9,0x4151, + /* Array index: 0x1424 */ 0xC8E0,0x4152, + /* Array index: 0x1424 */ 0xC8E1,0x4153, + /* Array index: 0x1424 */ 0xC8E4,0x4154, + /* Array index: 0x1424 */ 0xC8F5,0x4155, + /* Array index: 0x1424 */ 0xC8FC,0x4156, + /* Array index: 0x1424 */ 0xC8FD,0x4157, + /* Array index: 0x1424 */ 0xC900,0x4158, + /* Array index: 0x1424 */ 0xC90C,0x415C, + /* Array index: 0x1424 */ 0xC90D,0x415D, + /* Array index: 0x1424 */ 0xC90F,0x415E, + /* Array index: 0x1424 */ 0xC911,0x415F, + /* Array index: 0x1424 */ 0xC918,0x4160, + /* Array index: 0x1424 */ 0xC92C,0x4161, + /* Array index: 0x1424 */ 0xC934,0x4162, + /* Array index: 0x1424 */ 0xC950,0x4163, + /* Array index: 0x1424 */ 0xC951,0x4164, + /* Array index: 0x1424 */ 0xC954,0x4165, + /* Array index: 0x1424 */ 0xC958,0x4166, + /* Array index: 0x1424 */ 0xC960,0x4167, + /* Array index: 0x1424 */ 0xC961,0x4168, + /* Array index: 0x1424 */ 0xC963,0x4169, + /* Array index: 0x1424 */ 0xC96C,0x416A, + /* Array index: 0x1424 */ 0xC970,0x416B, + /* Array index: 0x1424 */ 0xC974,0x416C, + /* Array index: 0x1424 */ 0xC97C,0x416D, + /* Array index: 0x1424 */ 0xC988,0x416E, + /* Array index: 0x1424 */ 0xC989,0x416F, + /* Array index: 0x1424 */ 0xC98C,0x4170, + /* Array index: 0x1424 */ 0xC990,0x4171, + /* Array index: 0x1424 */ 0xC998,0x4172, + /* Array index: 0x1424 */ 0xC999,0x4173, + /* Array index: 0x1424 */ 0xC99B,0x4174, + /* Array index: 0x1424 */ 0xC99D,0x4175, + /* Array index: 0x1424 */ 0xC9C0,0x4176, + /* Array index: 0x1424 */ 0xC9C1,0x4177, + /* Array index: 0x1424 */ 0xC9C4,0x4178, + /* Array index: 0x1424 */ 0xC9C7,0x4179, + /* Array index: 0x1424 */ 0xC9C8,0x417A, + /* Array index: 0x1424 */ 0xC9CA,0x417B, + /* Array index: 0x1424 */ 0xC9D0,0x417C, + /* Array index: 0x1424 */ 0xC9D1,0x417D, + /* Array index: 0x1424 */ 0xC9D3,0x417E, + /* Array index: 0x1424 */ 0xC9D5,0x4221, + /* Array index: 0x1424 */ 0xC9D6,0x4222, + /* Array index: 0x1424 */ 0xC9E0,0x4227, + /* Array index: 0x1424 */ 0xC9E2,0x4228, + /* Array index: 0x1424 */ 0xC9E4,0x4229, + /* Array index: 0x1424 */ 0xC9E7,0x422A, + /* Array index: 0x1424 */ 0xC9F8,0x4230, + /* Array index: 0x1424 */ 0xC9F9,0x4231, + /* Array index: 0x1424 */ 0xC9FC,0x4232, + /* Array index: 0x1424 */ 0xCA00,0x4233, + /* Array index: 0x1424 */ 0xCA14,0x4239, + /* Array index: 0x1424 */ 0xCA18,0x423A, + /* Array index: 0x1424 */ 0xCA29,0x423B, + /* Array index: 0x1424 */ 0xCA4C,0x423C, + /* Array index: 0x1424 */ 0xCA4D,0x423D, + /* Array index: 0x1424 */ 0xCA50,0x423E, + /* Array index: 0x1424 */ 0xCA54,0x423F, + /* Array index: 0x1424 */ 0xCA68,0x4245, + /* Array index: 0x1424 */ 0xCA7D,0x4246, + /* Array index: 0x1424 */ 0xCA84,0x4247, + /* Array index: 0x1424 */ 0xCA98,0x4248, + /* Array index: 0x1424 */ 0xCABC,0x4249, + /* Array index: 0x1424 */ 0xCABD,0x424A, + /* Array index: 0x1424 */ 0xCAC0,0x424B, + /* Array index: 0x1424 */ 0xCAC4,0x424C, + /* Array index: 0x1424 */ 0xCACC,0x424D, + /* Array index: 0x1424 */ 0xCACD,0x424E, + /* Array index: 0x1424 */ 0xCACF,0x424F, + /* Array index: 0x1424 */ 0xCAD1,0x4250, + /* Array index: 0x1424 */ 0xCAD3,0x4251, + /* Array index: 0x1424 */ 0xCAD8,0x4252, + /* Array index: 0x1424 */ 0xCAD9,0x4253, + /* Array index: 0x1424 */ 0xCAE0,0x4254, + /* Array index: 0x1424 */ 0xCAEC,0x4255, + /* Array index: 0x1424 */ 0xCAF4,0x4256, + /* Array index: 0x1424 */ 0xCB08,0x4257, + /* Array index: 0x1424 */ 0xCB10,0x4258, + /* Array index: 0x1424 */ 0xCB14,0x4259, + /* Array index: 0x1424 */ 0xCB18,0x425A, + /* Array index: 0x1424 */ 0xCB20,0x425B, + /* Array index: 0x1424 */ 0xCB21,0x425C, + /* Array index: 0x1424 */ 0xCB41,0x425D, + /* Array index: 0x1424 */ 0xCB48,0x425E, + /* Array index: 0x1424 */ 0xCB49,0x425F, + /* Array index: 0x1424 */ 0xCB4C,0x4260, + /* Array index: 0x1424 */ 0xCB50,0x4261, + /* Array index: 0x1424 */ 0xCB58,0x4262, + /* Array index: 0x1424 */ 0xCB59,0x4263, + /* Array index: 0x1424 */ 0xCB5D,0x4264, + /* Array index: 0x1424 */ 0xCB64,0x4265, + /* Array index: 0x1424 */ 0xCB78,0x4266, + /* Array index: 0x1424 */ 0xCB79,0x4267, + /* Array index: 0x1424 */ 0xCB9C,0x4268, + /* Array index: 0x1424 */ 0xCBB8,0x4269, + /* Array index: 0x1424 */ 0xCBD4,0x426A, + /* Array index: 0x1424 */ 0xCBE4,0x426B, + /* Array index: 0x1424 */ 0xCBE7,0x426C, + /* Array index: 0x1424 */ 0xCBE9,0x426D, + /* Array index: 0x1424 */ 0xCC0C,0x426E, + /* Array index: 0x1424 */ 0xCC0D,0x426F, + /* Array index: 0x1424 */ 0xCC10,0x4270, + /* Array index: 0x1424 */ 0xCC14,0x4271, + /* Array index: 0x1424 */ 0xCC1C,0x4272, + /* Array index: 0x1424 */ 0xCC1D,0x4273, + /* Array index: 0x1424 */ 0xCC21,0x4274, + /* Array index: 0x1424 */ 0xCC22,0x4275, + /* Array index: 0x1424 */ 0xCC2C,0x4279, + /* Array index: 0x1424 */ 0xCC2E,0x427A, + /* Array index: 0x1424 */ 0xCC30,0x427B, + /* Array index: 0x1424 */ 0xCC44,0x4324, + /* Array index: 0x1424 */ 0xCC45,0x4325, + /* Array index: 0x1424 */ 0xCC48,0x4326, + /* Array index: 0x1424 */ 0xCC4C,0x4327, + /* Array index: 0x1424 */ 0xCC60,0x432D, + /* Array index: 0x1424 */ 0xCC64,0x432E, + /* Array index: 0x1424 */ 0xCC66,0x432F, + /* Array index: 0x1424 */ 0xCC68,0x4330, + /* Array index: 0x1424 */ 0xCC70,0x4331, + /* Array index: 0x1424 */ 0xCC75,0x4332, + /* Array index: 0x1424 */ 0xCC98,0x4333, + /* Array index: 0x1424 */ 0xCC99,0x4334, + /* Array index: 0x1424 */ 0xCC9C,0x4335, + /* Array index: 0x1424 */ 0xCCA0,0x4336, + /* Array index: 0x1424 */ 0xCCB4,0x433C, + /* Array index: 0x1424 */ 0xCCB5,0x433D, + /* Array index: 0x1424 */ 0xCCB8,0x433E, + /* Array index: 0x1424 */ 0xCCBC,0x433F, + /* Array index: 0x1424 */ 0xCCC4,0x4340, + /* Array index: 0x1424 */ 0xCCC5,0x4341, + /* Array index: 0x1424 */ 0xCCC7,0x4342, + /* Array index: 0x1424 */ 0xCCC9,0x4343, + /* Array index: 0x1424 */ 0xCCD0,0x4344, + /* Array index: 0x1424 */ 0xCCD4,0x4345, + /* Array index: 0x1424 */ 0xCCE4,0x4346, + /* Array index: 0x1424 */ 0xCCEC,0x4347, + /* Array index: 0x1424 */ 0xCCF0,0x4348, + /* Array index: 0x1424 */ 0xCD01,0x4349, + /* Array index: 0x1424 */ 0xCD08,0x434A, + /* Array index: 0x1424 */ 0xCD09,0x434B, + /* Array index: 0x1424 */ 0xCD0C,0x434C, + /* Array index: 0x1424 */ 0xCD10,0x434D, + /* Array index: 0x1424 */ 0xCD18,0x434E, + /* Array index: 0x1424 */ 0xCD19,0x434F, + /* Array index: 0x1424 */ 0xCD1B,0x4350, + /* Array index: 0x1424 */ 0xCD1D,0x4351, + /* Array index: 0x1424 */ 0xCD24,0x4352, + /* Array index: 0x1424 */ 0xCD28,0x4353, + /* Array index: 0x1424 */ 0xCD2C,0x4354, + /* Array index: 0x1424 */ 0xCD39,0x4355, + /* Array index: 0x1424 */ 0xCD5C,0x4356, + /* Array index: 0x1424 */ 0xCD60,0x4357, + /* Array index: 0x1424 */ 0xCD64,0x4358, + /* Array index: 0x1424 */ 0xCD6C,0x4359, + /* Array index: 0x1424 */ 0xCD6D,0x435A, + /* Array index: 0x1424 */ 0xCD6F,0x435B, + /* Array index: 0x1424 */ 0xCD71,0x435C, + /* Array index: 0x1424 */ 0xCD78,0x435D, + /* Array index: 0x1424 */ 0xCD88,0x435E, + /* Array index: 0x1424 */ 0xCD94,0x435F, + /* Array index: 0x1424 */ 0xCD95,0x4360, + /* Array index: 0x1424 */ 0xCD98,0x4361, + /* Array index: 0x1424 */ 0xCD9C,0x4362, + /* Array index: 0x1424 */ 0xCDA4,0x4363, + /* Array index: 0x1424 */ 0xCDA5,0x4364, + /* Array index: 0x1424 */ 0xCDA7,0x4365, + /* Array index: 0x1424 */ 0xCDA9,0x4366, + /* Array index: 0x1424 */ 0xCDB0,0x4367, + /* Array index: 0x1424 */ 0xCDC4,0x4368, + /* Array index: 0x1424 */ 0xCDCC,0x4369, + /* Array index: 0x1424 */ 0xCDD0,0x436A, + /* Array index: 0x1424 */ 0xCDE8,0x436B, + /* Array index: 0x1424 */ 0xCDEC,0x436C, + /* Array index: 0x1424 */ 0xCDF0,0x436D, + /* Array index: 0x1424 */ 0xCDF8,0x436E, + /* Array index: 0x1424 */ 0xCDF9,0x436F, + /* Array index: 0x1424 */ 0xCDFB,0x4370, + /* Array index: 0x1424 */ 0xCDFD,0x4371, + /* Array index: 0x1424 */ 0xCE04,0x4372, + /* Array index: 0x1424 */ 0xCE08,0x4373, + /* Array index: 0x1424 */ 0xCE0C,0x4374, + /* Array index: 0x1424 */ 0xCE14,0x4375, + /* Array index: 0x1424 */ 0xCE19,0x4376, + /* Array index: 0x1424 */ 0xCE20,0x4377, + /* Array index: 0x1424 */ 0xCE21,0x4378, + /* Array index: 0x1424 */ 0xCE24,0x4379, + /* Array index: 0x1424 */ 0xCE28,0x437A, + /* Array index: 0x1424 */ 0xCE30,0x437B, + /* Array index: 0x1424 */ 0xCE31,0x437C, + /* Array index: 0x1424 */ 0xCE33,0x437D, + /* Array index: 0x1424 */ 0xCE35,0x437E, + /* Array index: 0x1424 */ 0xCE58,0x4421, + /* Array index: 0x1424 */ 0xCE59,0x4422, + /* Array index: 0x1424 */ 0xCE5C,0x4423, + /* Array index: 0x1424 */ 0xCE68,0x4427, + /* Array index: 0x1424 */ 0xCE69,0x4428, + /* Array index: 0x1424 */ 0xCE6B,0x4429, + /* Array index: 0x1424 */ 0xCE6D,0x442A, + /* Array index: 0x1424 */ 0xCE74,0x442B, + /* Array index: 0x1424 */ 0xCE75,0x442C, + /* Array index: 0x1424 */ 0xCE78,0x442D, + /* Array index: 0x1424 */ 0xCE7C,0x442E, + /* Array index: 0x1424 */ 0xCE84,0x442F, + /* Array index: 0x1424 */ 0xCE85,0x4430, + /* Array index: 0x1424 */ 0xCE87,0x4431, + /* Array index: 0x1424 */ 0xCE89,0x4432, + /* Array index: 0x1424 */ 0xCE90,0x4433, + /* Array index: 0x1424 */ 0xCE91,0x4434, + /* Array index: 0x1424 */ 0xCE94,0x4435, + /* Array index: 0x1424 */ 0xCE98,0x4436, + /* Array index: 0x1424 */ 0xCEAC,0x443C, + /* Array index: 0x1424 */ 0xCEAD,0x443D, + /* Array index: 0x1424 */ 0xCEC1,0x443E, + /* Array index: 0x1424 */ 0xCEE4,0x443F, + /* Array index: 0x1424 */ 0xCEE5,0x4440, + /* Array index: 0x1424 */ 0xCEE8,0x4441, + /* Array index: 0x1424 */ 0xCEEB,0x4442, + /* Array index: 0x1424 */ 0xCEEC,0x4443, + /* Array index: 0x1424 */ 0xCF00,0x4449, + /* Array index: 0x1424 */ 0xCF01,0x444A, + /* Array index: 0x1424 */ 0xCF04,0x444B, + /* Array index: 0x1424 */ 0xCF08,0x444C, + /* Array index: 0x1424 */ 0xCF10,0x444D, + /* Array index: 0x1424 */ 0xCF11,0x444E, + /* Array index: 0x1424 */ 0xCF13,0x444F, + /* Array index: 0x1424 */ 0xCF15,0x4450, + /* Array index: 0x1424 */ 0xCF1C,0x4451, + /* Array index: 0x1424 */ 0xCF20,0x4452, + /* Array index: 0x1424 */ 0xCF24,0x4453, + /* Array index: 0x1424 */ 0xCF38,0x4459, + /* Array index: 0x1424 */ 0xCF54,0x445A, + /* Array index: 0x1424 */ 0xCF55,0x445B, + /* Array index: 0x1424 */ 0xCF58,0x445C, + /* Array index: 0x1424 */ 0xCF5C,0x445D, + /* Array index: 0x1424 */ 0xCF64,0x445E, + /* Array index: 0x1424 */ 0xCF65,0x445F, + /* Array index: 0x1424 */ 0xCF67,0x4460, + /* Array index: 0x1424 */ 0xCF69,0x4461, + /* Array index: 0x1424 */ 0xCF70,0x4462, + /* Array index: 0x1424 */ 0xCF71,0x4463, + /* Array index: 0x1424 */ 0xCF74,0x4464, + /* Array index: 0x1424 */ 0xCF78,0x4465, + /* Array index: 0x1424 */ 0xCF80,0x4466, + /* Array index: 0x1424 */ 0xCF85,0x4467, + /* Array index: 0x1424 */ 0xCF8C,0x4468, + /* Array index: 0x1424 */ 0xCFA1,0x4469, + /* Array index: 0x1424 */ 0xCFA8,0x446A, + /* Array index: 0x1424 */ 0xCFB0,0x446B, + /* Array index: 0x1424 */ 0xCFC4,0x446C, + /* Array index: 0x1424 */ 0xCFE0,0x446D, + /* Array index: 0x1424 */ 0xCFE1,0x446E, + /* Array index: 0x1424 */ 0xCFE4,0x446F, + /* Array index: 0x1424 */ 0xCFE8,0x4470, + /* Array index: 0x1424 */ 0xCFF0,0x4471, + /* Array index: 0x1424 */ 0xCFF1,0x4472, + /* Array index: 0x1424 */ 0xCFF3,0x4473, + /* Array index: 0x1424 */ 0xCFF5,0x4474, + /* Array index: 0x1424 */ 0xCFFC,0x4475, + /* Array index: 0x1424 */ 0xD000,0x4476, + /* Array index: 0x1424 */ 0xD004,0x4477, + /* Array index: 0x1424 */ 0xD011,0x4478, + /* Array index: 0x1424 */ 0xD018,0x4479, + /* Array index: 0x1424 */ 0xD02D,0x447A, + /* Array index: 0x1424 */ 0xD034,0x447B, + /* Array index: 0x1424 */ 0xD035,0x447C, + /* Array index: 0x1424 */ 0xD038,0x447D, + /* Array index: 0x1424 */ 0xD03C,0x447E, + /* Array index: 0x1424 */ 0xD044,0x4521, + /* Array index: 0x1424 */ 0xD045,0x4522, + /* Array index: 0x1424 */ 0xD047,0x4523, + /* Array index: 0x1424 */ 0xD049,0x4524, + /* Array index: 0x1424 */ 0xD050,0x4525, + /* Array index: 0x1424 */ 0xD054,0x4526, + /* Array index: 0x1424 */ 0xD058,0x4527, + /* Array index: 0x1424 */ 0xD060,0x4528, + /* Array index: 0x1424 */ 0xD06C,0x4529, + /* Array index: 0x1424 */ 0xD06D,0x452A, + /* Array index: 0x1424 */ 0xD070,0x452B, + /* Array index: 0x1424 */ 0xD074,0x452C, + /* Array index: 0x1424 */ 0xD07C,0x452D, + /* Array index: 0x1424 */ 0xD07D,0x452E, + /* Array index: 0x1424 */ 0xD081,0x452F, + /* Array index: 0x1424 */ 0xD0A4,0x4530, + /* Array index: 0x1424 */ 0xD0A5,0x4531, + /* Array index: 0x1424 */ 0xD0A8,0x4532, + /* Array index: 0x1424 */ 0xD0AC,0x4533, + /* Array index: 0x1424 */ 0xD0B4,0x4534, + /* Array index: 0x1424 */ 0xD0B5,0x4535, + /* Array index: 0x1424 */ 0xD0B7,0x4536, + /* Array index: 0x1424 */ 0xD0B9,0x4537, + /* Array index: 0x1424 */ 0xD0C0,0x4538, + /* Array index: 0x1424 */ 0xD0C1,0x4539, + /* Array index: 0x1424 */ 0xD0C4,0x453A, + /* Array index: 0x1424 */ 0xD0C8,0x453B, + /* Array index: 0x1424 */ 0xD0C9,0x453C, + /* Array index: 0x1424 */ 0xD0DC,0x4542, + /* Array index: 0x1424 */ 0xD0DD,0x4543, + /* Array index: 0x1424 */ 0xD0E0,0x4544, + /* Array index: 0x1424 */ 0xD0E4,0x4545, + /* Array index: 0x1424 */ 0xD0F8,0x454B, + /* Array index: 0x1424 */ 0xD10D,0x454C, + /* Array index: 0x1424 */ 0xD130,0x454D, + /* Array index: 0x1424 */ 0xD131,0x454E, + /* Array index: 0x1424 */ 0xD134,0x454F, + /* Array index: 0x1424 */ 0xD138,0x4550, + /* Array index: 0x1424 */ 0xD13A,0x4551, + /* Array index: 0x1424 */ 0xD14C,0x4557, + /* Array index: 0x1424 */ 0xD14D,0x4558, + /* Array index: 0x1424 */ 0xD150,0x4559, + /* Array index: 0x1424 */ 0xD154,0x455A, + /* Array index: 0x1424 */ 0xD15C,0x455B, + /* Array index: 0x1424 */ 0xD15D,0x455C, + /* Array index: 0x1424 */ 0xD15F,0x455D, + /* Array index: 0x1424 */ 0xD161,0x455E, + /* Array index: 0x1424 */ 0xD168,0x455F, + /* Array index: 0x1424 */ 0xD16C,0x4560, + /* Array index: 0x1424 */ 0xD17C,0x4561, + /* Array index: 0x1424 */ 0xD184,0x4562, + /* Array index: 0x1424 */ 0xD188,0x4563, + /* Array index: 0x1424 */ 0xD1A0,0x4564, + /* Array index: 0x1424 */ 0xD1A1,0x4565, + /* Array index: 0x1424 */ 0xD1A4,0x4566, + /* Array index: 0x1424 */ 0xD1A8,0x4567, + /* Array index: 0x1424 */ 0xD1B0,0x4568, + /* Array index: 0x1424 */ 0xD1B1,0x4569, + /* Array index: 0x1424 */ 0xD1B3,0x456A, + /* Array index: 0x1424 */ 0xD1B5,0x456B, + /* Array index: 0x1424 */ 0xD1BA,0x456C, + /* Array index: 0x1424 */ 0xD1BC,0x456D, + /* Array index: 0x1424 */ 0xD1C0,0x456E, + /* Array index: 0x1424 */ 0xD1D8,0x456F, + /* Array index: 0x1424 */ 0xD1F4,0x4570, + /* Array index: 0x1424 */ 0xD1F8,0x4571, + /* Array index: 0x1424 */ 0xD207,0x4572, + /* Array index: 0x1424 */ 0xD209,0x4573, + /* Array index: 0x1424 */ 0xD210,0x4574, + /* Array index: 0x1424 */ 0xD22C,0x4575, + /* Array index: 0x1424 */ 0xD22D,0x4576, + /* Array index: 0x1424 */ 0xD230,0x4577, + /* Array index: 0x1424 */ 0xD234,0x4578, + /* Array index: 0x1424 */ 0xD23C,0x4579, + /* Array index: 0x1424 */ 0xD23D,0x457A, + /* Array index: 0x1424 */ 0xD23F,0x457B, + /* Array index: 0x1424 */ 0xD241,0x457C, + /* Array index: 0x1424 */ 0xD248,0x457D, + /* Array index: 0x1424 */ 0xD25C,0x457E, + /* Array index: 0x1424 */ 0xD264,0x4621, + /* Array index: 0x1424 */ 0xD280,0x4622, + /* Array index: 0x1424 */ 0xD281,0x4623, + /* Array index: 0x1424 */ 0xD284,0x4624, + /* Array index: 0x1424 */ 0xD288,0x4625, + /* Array index: 0x1424 */ 0xD290,0x4626, + /* Array index: 0x1424 */ 0xD291,0x4627, + /* Array index: 0x1424 */ 0xD295,0x4628, + /* Array index: 0x1424 */ 0xD29C,0x4629, + /* Array index: 0x1424 */ 0xD2A0,0x462A, + /* Array index: 0x1424 */ 0xD2A4,0x462B, + /* Array index: 0x1424 */ 0xD2AC,0x462C, + /* Array index: 0x1424 */ 0xD2B1,0x462D, + /* Array index: 0x1424 */ 0xD2B8,0x462E, + /* Array index: 0x1424 */ 0xD2B9,0x462F, + /* Array index: 0x1424 */ 0xD2BC,0x4630, + /* Array index: 0x1424 */ 0xD2BF,0x4631, + /* Array index: 0x1424 */ 0xD2C0,0x4632, + /* Array index: 0x1424 */ 0xD2C2,0x4633, + /* Array index: 0x1424 */ 0xD2C8,0x4634, + /* Array index: 0x1424 */ 0xD2C9,0x4635, + /* Array index: 0x1424 */ 0xD2CB,0x4636, + /* Array index: 0x1424 */ 0xD2D4,0x4637, + /* Array index: 0x1424 */ 0xD2D8,0x4638, + /* Array index: 0x1424 */ 0xD2DC,0x4639, + /* Array index: 0x1424 */ 0xD2E4,0x463A, + /* Array index: 0x1424 */ 0xD2E5,0x463B, + /* Array index: 0x1424 */ 0xD2F0,0x463C, + /* Array index: 0x1424 */ 0xD2F1,0x463D, + /* Array index: 0x1424 */ 0xD2F4,0x463E, + /* Array index: 0x1424 */ 0xD2F8,0x463F, + /* Array index: 0x1424 */ 0xD300,0x4640, + /* Array index: 0x1424 */ 0xD301,0x4641, + /* Array index: 0x1424 */ 0xD303,0x4642, + /* Array index: 0x1424 */ 0xD305,0x4643, + /* Array index: 0x1424 */ 0xD314,0x4648, + /* Array index: 0x1424 */ 0xD316,0x4649, + /* Array index: 0x1424 */ 0xD325,0x464F, + /* Array index: 0x1424 */ 0xD328,0x4650, + /* Array index: 0x1424 */ 0xD329,0x4651, + /* Array index: 0x1424 */ 0xD32C,0x4652, + /* Array index: 0x1424 */ 0xD330,0x4653, + /* Array index: 0x1424 */ 0xD344,0x4659, + /* Array index: 0x1424 */ 0xD345,0x465A, + /* Array index: 0x1424 */ 0xD37C,0x465B, + /* Array index: 0x1424 */ 0xD37D,0x465C, + /* Array index: 0x1424 */ 0xD380,0x465D, + /* Array index: 0x1424 */ 0xD384,0x465E, + /* Array index: 0x1424 */ 0xD398,0x4664, + /* Array index: 0x1424 */ 0xD399,0x4665, + /* Array index: 0x1424 */ 0xD39C,0x4666, + /* Array index: 0x1424 */ 0xD3A0,0x4667, + /* Array index: 0x1424 */ 0xD3A8,0x4668, + /* Array index: 0x1424 */ 0xD3A9,0x4669, + /* Array index: 0x1424 */ 0xD3AB,0x466A, + /* Array index: 0x1424 */ 0xD3AD,0x466B, + /* Array index: 0x1424 */ 0xD3B4,0x466C, + /* Array index: 0x1424 */ 0xD3B8,0x466D, + /* Array index: 0x1424 */ 0xD3BC,0x466E, + /* Array index: 0x1424 */ 0xD3C4,0x466F, + /* Array index: 0x1424 */ 0xD3C5,0x4670, + /* Array index: 0x1424 */ 0xD3C8,0x4671, + /* Array index: 0x1424 */ 0xD3C9,0x4672, + /* Array index: 0x1424 */ 0xD3D0,0x4673, + /* Array index: 0x1424 */ 0xD3D8,0x4674, + /* Array index: 0x1424 */ 0xD3E1,0x4675, + /* Array index: 0x1424 */ 0xD3E3,0x4676, + /* Array index: 0x1424 */ 0xD3EC,0x4677, + /* Array index: 0x1424 */ 0xD3ED,0x4678, + /* Array index: 0x1424 */ 0xD3F0,0x4679, + /* Array index: 0x1424 */ 0xD3F4,0x467A, + /* Array index: 0x1424 */ 0xD3FC,0x467B, + /* Array index: 0x1424 */ 0xD3FD,0x467C, + /* Array index: 0x1424 */ 0xD3FF,0x467D, + /* Array index: 0x1424 */ 0xD401,0x467E, + /* Array index: 0x1424 */ 0xD408,0x4721, + /* Array index: 0x1424 */ 0xD41D,0x4722, + /* Array index: 0x1424 */ 0xD440,0x4723, + /* Array index: 0x1424 */ 0xD444,0x4724, + /* Array index: 0x1424 */ 0xD45C,0x4725, + /* Array index: 0x1424 */ 0xD460,0x4726, + /* Array index: 0x1424 */ 0xD464,0x4727, + /* Array index: 0x1424 */ 0xD46D,0x4728, + /* Array index: 0x1424 */ 0xD46F,0x4729, + /* Array index: 0x1424 */ 0xD478,0x472A, + /* Array index: 0x1424 */ 0xD479,0x472B, + /* Array index: 0x1424 */ 0xD47C,0x472C, + /* Array index: 0x1424 */ 0xD47F,0x472D, + /* Array index: 0x1424 */ 0xD480,0x472E, + /* Array index: 0x1424 */ 0xD482,0x472F, + /* Array index: 0x1424 */ 0xD488,0x4730, + /* Array index: 0x1424 */ 0xD489,0x4731, + /* Array index: 0x1424 */ 0xD48B,0x4732, + /* Array index: 0x1424 */ 0xD48D,0x4733, + /* Array index: 0x1424 */ 0xD494,0x4734, + /* Array index: 0x1424 */ 0xD4A9,0x4735, + /* Array index: 0x1424 */ 0xD4CC,0x4736, + /* Array index: 0x1424 */ 0xD4D0,0x4737, + /* Array index: 0x1424 */ 0xD4D4,0x4738, + /* Array index: 0x1424 */ 0xD4DC,0x4739, + /* Array index: 0x1424 */ 0xD4DF,0x473A, + /* Array index: 0x1424 */ 0xD4E8,0x473B, + /* Array index: 0x1424 */ 0xD4EC,0x473C, + /* Array index: 0x1424 */ 0xD4F0,0x473D, + /* Array index: 0x1424 */ 0xD4F8,0x473E, + /* Array index: 0x1424 */ 0xD4FB,0x473F, + /* Array index: 0x1424 */ 0xD4FD,0x4740, + /* Array index: 0x1424 */ 0xD504,0x4741, + /* Array index: 0x1424 */ 0xD508,0x4742, + /* Array index: 0x1424 */ 0xD50C,0x4743, + /* Array index: 0x1424 */ 0xD514,0x4744, + /* Array index: 0x1424 */ 0xD515,0x4745, + /* Array index: 0x1424 */ 0xD517,0x4746, + /* Array index: 0x1424 */ 0xD53C,0x4747, + /* Array index: 0x1424 */ 0xD53D,0x4748, + /* Array index: 0x1424 */ 0xD540,0x4749, + /* Array index: 0x1424 */ 0xD544,0x474A, + /* Array index: 0x1424 */ 0xD54C,0x474B, + /* Array index: 0x1424 */ 0xD54D,0x474C, + /* Array index: 0x1424 */ 0xD54F,0x474D, + /* Array index: 0x1424 */ 0xD551,0x474E, + /* Array index: 0x1424 */ 0xD558,0x474F, + /* Array index: 0x1424 */ 0xD559,0x4750, + /* Array index: 0x1424 */ 0xD55C,0x4751, + /* Array index: 0x1424 */ 0xD560,0x4752, + /* Array index: 0x1424 */ 0xD565,0x4753, + /* Array index: 0x1424 */ 0xD568,0x4754, + /* Array index: 0x1424 */ 0xD569,0x4755, + /* Array index: 0x1424 */ 0xD56B,0x4756, + /* Array index: 0x1424 */ 0xD56D,0x4757, + /* Array index: 0x1424 */ 0xD574,0x4758, + /* Array index: 0x1424 */ 0xD575,0x4759, + /* Array index: 0x1424 */ 0xD578,0x475A, + /* Array index: 0x1424 */ 0xD57C,0x475B, + /* Array index: 0x1424 */ 0xD590,0x4761, + /* Array index: 0x1424 */ 0xD5A5,0x4762, + /* Array index: 0x1424 */ 0xD5C8,0x4763, + /* Array index: 0x1424 */ 0xD5C9,0x4764, + /* Array index: 0x1424 */ 0xD5CC,0x4765, + /* Array index: 0x1424 */ 0xD5D0,0x4766, + /* Array index: 0x1424 */ 0xD5D2,0x4767, + /* Array index: 0x1424 */ 0xD5D8,0x4768, + /* Array index: 0x1424 */ 0xD5D9,0x4769, + /* Array index: 0x1424 */ 0xD5DB,0x476A, + /* Array index: 0x1424 */ 0xD5DD,0x476B, + /* Array index: 0x1424 */ 0xD5E4,0x476C, + /* Array index: 0x1424 */ 0xD5E5,0x476D, + /* Array index: 0x1424 */ 0xD5E8,0x476E, + /* Array index: 0x1424 */ 0xD5EC,0x476F, + /* Array index: 0x1424 */ 0xD5F4,0x4770, + /* Array index: 0x1424 */ 0xD5F5,0x4771, + /* Array index: 0x1424 */ 0xD5F7,0x4772, + /* Array index: 0x1424 */ 0xD5F9,0x4773, + /* Array index: 0x1424 */ 0xD600,0x4774, + /* Array index: 0x1424 */ 0xD601,0x4775, + /* Array index: 0x1424 */ 0xD604,0x4776, + /* Array index: 0x1424 */ 0xD608,0x4777, + /* Array index: 0x1424 */ 0xD61C,0x477D, + /* Array index: 0x1424 */ 0xD620,0x477E, + /* Array index: 0x1424 */ 0xD624,0x4821, + /* Array index: 0x1424 */ 0xD62D,0x4822, + /* Array index: 0x1424 */ 0xD638,0x4823, + /* Array index: 0x1424 */ 0xD639,0x4824, + /* Array index: 0x1424 */ 0xD63C,0x4825, + /* Array index: 0x1424 */ 0xD640,0x4826, + /* Array index: 0x1424 */ 0xD645,0x4827, + /* Array index: 0x1424 */ 0xD648,0x4828, + /* Array index: 0x1424 */ 0xD649,0x4829, + /* Array index: 0x1424 */ 0xD64B,0x482A, + /* Array index: 0x1424 */ 0xD64D,0x482B, + /* Array index: 0x1424 */ 0xD651,0x482C, + /* Array index: 0x1424 */ 0xD654,0x482D, + /* Array index: 0x1424 */ 0xD655,0x482E, + /* Array index: 0x1424 */ 0xD658,0x482F, + /* Array index: 0x1424 */ 0xD65C,0x4830, + /* Array index: 0x1424 */ 0xD667,0x4831, + /* Array index: 0x1424 */ 0xD669,0x4832, + /* Array index: 0x1424 */ 0xD670,0x4833, + /* Array index: 0x1424 */ 0xD671,0x4834, + /* Array index: 0x1424 */ 0xD674,0x4835, + /* Array index: 0x1424 */ 0xD683,0x4836, + /* Array index: 0x1424 */ 0xD685,0x4837, + /* Array index: 0x1424 */ 0xD68C,0x4838, + /* Array index: 0x1424 */ 0xD68D,0x4839, + /* Array index: 0x1424 */ 0xD690,0x483A, + /* Array index: 0x1424 */ 0xD694,0x483B, + /* Array index: 0x1424 */ 0xD69D,0x483C, + /* Array index: 0x1424 */ 0xD69F,0x483D, + /* Array index: 0x1424 */ 0xD6A1,0x483E, + /* Array index: 0x1424 */ 0xD6A8,0x483F, + /* Array index: 0x1424 */ 0xD6AC,0x4840, + /* Array index: 0x1424 */ 0xD6B0,0x4841, + /* Array index: 0x1424 */ 0xD6B9,0x4842, + /* Array index: 0x1424 */ 0xD6BB,0x4843, + /* Array index: 0x1424 */ 0xD6C4,0x4844, + /* Array index: 0x1424 */ 0xD6C5,0x4845, + /* Array index: 0x1424 */ 0xD6C8,0x4846, + /* Array index: 0x1424 */ 0xD6CC,0x4847, + /* Array index: 0x1424 */ 0xD6D1,0x4848, + /* Array index: 0x1424 */ 0xD6D4,0x4849, + /* Array index: 0x1424 */ 0xD6D7,0x484A, + /* Array index: 0x1424 */ 0xD6D9,0x484B, + /* Array index: 0x1424 */ 0xD6E0,0x484C, + /* Array index: 0x1424 */ 0xD6E4,0x484D, + /* Array index: 0x1424 */ 0xD6E8,0x484E, + /* Array index: 0x1424 */ 0xD6F0,0x484F, + /* Array index: 0x1424 */ 0xD6F5,0x4850, + /* Array index: 0x1424 */ 0xD6FC,0x4851, + /* Array index: 0x1424 */ 0xD6FD,0x4852, + /* Array index: 0x1424 */ 0xD700,0x4853, + /* Array index: 0x1424 */ 0xD704,0x4854, + /* Array index: 0x1424 */ 0xD711,0x4855, + /* Array index: 0x1424 */ 0xD718,0x4856, + /* Array index: 0x1424 */ 0xD719,0x4857, + /* Array index: 0x1424 */ 0xD71C,0x4858, + /* Array index: 0x1424 */ 0xD720,0x4859, + /* Array index: 0x1424 */ 0xD728,0x485A, + /* Array index: 0x1424 */ 0xD729,0x485B, + /* Array index: 0x1424 */ 0xD72B,0x485C, + /* Array index: 0x1424 */ 0xD72D,0x485D, + /* Array index: 0x1424 */ 0xD734,0x485E, + /* Array index: 0x1424 */ 0xD735,0x485F, + /* Array index: 0x1424 */ 0xD738,0x4860, + /* Array index: 0x1424 */ 0xD73C,0x4861, + /* Array index: 0x1424 */ 0xD744,0x4862, + /* Array index: 0x1424 */ 0xD747,0x4863, + /* Array index: 0x1424 */ 0xD749,0x4864, + /* Array index: 0x1424 */ 0xD750,0x4865, + /* Array index: 0x1424 */ 0xD751,0x4866, + /* Array index: 0x1424 */ 0xD760,0x486C, + /* Array index: 0x1424 */ 0xD761,0x486D, + /* Array index: 0x1424 */ 0xD763,0x486E, + /* Array index: 0x1424 */ 0xD765,0x486F, + /* Array index: 0x1424 */ 0xD769,0x4870, + /* Array index: 0x1424 */ 0xD76C,0x4871, + /* Array index: 0x1424 */ 0xD770,0x4872, + /* Array index: 0x1424 */ 0xD774,0x4873, + /* Array index: 0x1424 */ 0xD77C,0x4874, + /* Array index: 0x1424 */ 0xD77D,0x4875, + /* Array index: 0x1424 */ 0xD781,0x4876, + /* Array index: 0x1424 */ 0xD788,0x4877, + /* Array index: 0x1424 */ 0xD789,0x4878, + /* Array index: 0x1424 */ 0xD78C,0x4879, + /* Array index: 0x1424 */ 0xD790,0x487A, + /* Array index: 0x1424 */ 0xD798,0x487B, + /* Array index: 0x1424 */ 0xD799,0x487C, + /* Array index: 0x1424 */ 0xD79B,0x487D, + /* Array index: 0x1424 */ 0xD79D,0x487E, +}; + +#endif /* ICONV_FROM_UCS_CCS_KSX1001 && defined (TABLE_USE_SIZE_OPTIMIZATION) */ + +/* + * ksx1001 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_ksx1001 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_KSX1001, /* CCS name */ + TABLE_16BIT, /* Table bits */ +#if defined (ICONV_FROM_UCS_CCS_KSX1001) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&from_ucs_size_ksx1001, /* UCS -> ksx1001 table size-optimized table */ +#elif defined (ICONV_FROM_UCS_CCS_KSX1001) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&from_ucs_speed_ksx1001, /* UCS -> ksx1001 table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +#if defined (ICONV_TO_UCS_CCS_KSX1001) \ + && (defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SIZE_OPTIMIZED, + (__uint16_t *)&to_ucs_size_ksx1001 /* ksx1001 -> UCS table speed-optimized table */ +#elif defined (ICONV_TO_UCS_CCS_KSX1001) \ + && !(defined (TABLE_USE_SIZE_OPTIMIZATION)) + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)&to_ucs_speed_ksx1001 /* ksx1001 -> UCS table speed-optimized table */ +#else + TABLE_SPEED_OPTIMIZED, + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_KSX1001) || ... */ + diff --git a/lib/iconv/ccs/mktbl.pl b/lib/iconv/ccs/mktbl.pl new file mode 100644 index 0000000..633511e --- /dev/null +++ b/lib/iconv/ccs/mktbl.pl @@ -0,0 +1,1505 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2003-2004, Artem B. Bityuckiy, SoftMine Corporation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +use integer; +use Getopt::Std; +use IO::Seekable; +use strict; + + +# ############################################################################## +# +# FUNCTION PROTOTYPES AND GLOBAL DATA DECLARATION SECTION +# +# ############################################################################## + + +# SUPPLEMENTARY FUNCTIONS FORWARD DECLARATIONS +sub ProcessOptions(); +sub Err($;$); +sub Generate8bitToUCS(); +sub GenerateSpeed($); +sub Generate16bitSize($); +sub Output8bitToUCS(;$); +sub Output8bitFromUCS(;$); +sub OutputSpeed($;$); +sub OutputSize($;$); + +# VARIABLES RELATING TO COMMAND-LINE OPTIONS +my $Verbose; # Be verbose if true +my $Source; # Output C source code instead of binary .cct file if true +my $Plane; # Use this plane if defined +my $InFile; # Use this file for input +my $OutFile; # Use this file for output +my $CCSName; # Use this CCS name +my $NoSpeed; # Don't generate speed-optimized tables (binary files only) +my $NoSize; # Don't generate size-optimized tables (binary files only) +my $NoBE; # Don't generate big-endian tables (binary files only) +my $NoLE; # Don't generate big-endian tables (binary files only) +my $NoTo; # Don't generate "to_ucs" table (binary files only) +my $NoFrom; # Don't generate "from_ucs" table (binary files only) +my $CCSCol; # CCS column number in source file +my $UCSCol; # UCS column number in source file + + +# DATA STRUCTURES WITH "TO_UCS" AND "FROM_UCS" SPEED/SIZE -OPTIMIZED TABLES +my (@FromSpeedTbl, @ToSpeedTbl, @FromSizeTbl, @ToSizeTbl); +# "TO_UCS" AND "FROM_UCS" SPEED/SIZE -OPTIMIZED TABLES SIZE IN BYTES +my ($FromSpeedBytes, $ToSpeedBytes, $FromSizeBytes, $ToSizeBytes) = + (0, 0, 0, 0); + +my (%CCSUCS, %UCSCCS); # CCS->UCS and UCS->CCS mappings +my $Bits = 8; # Table bits (8 or 16); + +# SPECIAL MARKER CODES +my $InvCode = 0xFFFF; # FFFF indicates 18 bit invalid codes +my $InvBlock = 0xFFFF; # FFFF also mark empty blocks in speed-optimized tables +my $LostCode = 0x3F; # ASCII '?' marks codes lost during CCS->UCS mapping +# To mark invalid codes in 8bit encodings 0xFF is used CCS's 0xFF mapping is saved +# separately. $FFMap variable stores real 0xFF mapping if defined. +my $InvCode8bit = 0xFF; +my $FFMap; + +# 8 Bit "From UCS" table header size (bytes) +my $Hdr8bitFromUCS = 2; +# Binary table header size (bytes) +my $HdrBinary = 8; + +# At first all lost CCS codes are marked by $TmpLost to distinguish between +# code which is equivalent to $LostCode and lost codes. This is done in order to +# output $MacroLostCode instead of $LostCode in source file. +my $TmpLost = 0x1FFFF; + +# VARIABLES RELATING TO C SOURCE CODE +my $MacroInvCode = 'INVALC'; +my $MacroInvBlock = 'INVBLK'; +my $MacroLostCode = 'LOST_C'; +my $MacroCCSName = 'ICONV_CCS_%s'; +my $GuardSize = 'defined (TABLE_USE_SIZE_OPTIMIZATION)'; +my $GuardToUCS = "ICONV_TO_UCS_CCS_%s"; +my $GuardFromUCS = "ICONV_FROM_UCS_CCS_%s"; +my $MacroSpeedTable = 'TABLE_SPEED_OPTIMIZED'; +my $MacroSizeTable = 'TABLE_SIZE_OPTIMIZED'; +my $Macro8bitTable = 'TABLE_8BIT'; +my $Macro16bitTable = 'TABLE_16BIT'; +my $MacroVer1Table = 'TABLE_VERSION_1'; +my $TypeBICCS = 'iconv_ccs_t'; +my $VarToUCSSize = "to_ucs_size_%s"; +my $VarToUCSSpeed = "to_ucs_speed_%s"; +my $VarFromUCSSize = "from_ucs_size_%s"; +my $VarFromUCSSpeed = "from_ucs_speed_%s"; +my $VarBICCS = "_iconv_ccs_%s"; +# Text block that visually separates tables. +my $Separator = '=' x 70; + +# ############################################################################## +# +# SCRIPT ENTRY POINT +# +# ############################################################################## + + +# Parse command-line options, check them and set correspondent global variables +ProcessOptions(); + +# Initialize global variables tat depend on CCS name. +$_ = sprintf $_, $CCSName foreach +($VarToUCSSpeed, + $VarToUCSSize, + $VarToUCSSpeed, + $VarFromUCSSpeed, + $VarFromUCSSize, + $VarBICCS); +$_ = sprintf $_, "\U$CCSName" foreach +($GuardToUCS, + $GuardFromUCS, + $MacroCCSName); + +# Open input and output files +Err "Can't open \"$InFile\" file for reading: $!.\n", 1 +unless open(INFILE, '<', $InFile); +Err "Can't open \"$OutFile\" file for writing: $!.\n", 1 +unless open(OUTFILE, '>', $OutFile); + +# ============================================================================== +# EXTRACT CODES MAP FROM INPUT FILE +# ============================================================================== + +for (my $ln = 1; my $l = ; $ln += 1) +{ + # Skip comment and empty lines, remove ending CR symbol + next if $l =~ /^#.*$/ or $l =~ /^\s*$/; + $l =~ s/^(.*)\n$/$1/, $l =~ s/^(.*)\r$/$1/; + + # Remove comment and extra spaces + $l =~ s/(.*)\s*#.*/$1/; + $l =~ s/\s+/ /g; + $l =~ s/(.*)\s*$/$1/; + + # Split line into individual codes + my @codes = split / /, $l; + + # Skip line if there is no needed columns + unless (defined $codes[$CCSCol]) + { + print("Warning (line $ln): no CCS column, skip.\n") if $Verbose; + next; + } + unless (defined $codes[$UCSCol]) + { + print("Warning (line $ln): no UCS column, skip.\n") if $Verbose; + next; + } + + # Extract codes strings from needed columns + my ($ccs, $ucs) = ($codes[$CCSCol], $codes[$UCSCol]); + my $patt = qr/(0[xX])?[0-9a-fA-F]{1,8}/; # HEX digit regexp pattern. + + # Check that CCS and UCS code strings has right format. + unless ($ccs =~ m/^$patt$/) + { + print("Warning (line $ln): $ccs CCS code isn't recognized, skip.\n") + if $Verbose; + next; + } + unless ($ucs =~ m/^($patt(,|\+))*$patt$/) + { + print("Warning (line $ln): $ucs UCS code isn't recognized, skip.\n") + if $Verbose; + next; + } + + # Convert code to numeric format (assume hex). + $ccs = hex $ccs; + + if ($ucs =~ m/,/ or $ucs =~ m/\+/) + { + # Mark CCS codes with "one to many" mappings as lost + printf "Warning (line $ln): only one to one mapping is supported, " + . "mark 0x%.4X CCS code as lost.\n", hex $ccs if $Verbose; + $ucs = $TmpLost; + } + else + { + # Convert code to numeric format + $ucs = hex $ucs; + + # Check that UCS code isn't longer than 16 bits. + if ($ucs > 0xFFFF) + { + printf("Warning (line $ln): UCS code should fit 16 bits, " + . "mark 0x%.4X CCS code as lost.\n", hex $ccs) if $Verbose; + $ucs = $TmpLost; + } + } + + # If CCS value > 0xFFFF user should specify plane number. + if ($ccs > 0xFFFF && !defined $Plane) + { + print("Warning (line $ln): $ccs is > 16 bit, plane number should be specified," + . " skip this mapping.\n") if $Verbose; + next; + } + + if (defined $Plane) + { + next if (($ccs & 0xFFFF0000) >> 16) != hex $Plane; # Skip alien plane. + $ccs &= 0xFFFF; + } + + # Check that reserved codes aren't used. + if ($ccs == $InvCode or $ucs == $InvCode) + { + print("Warning (line $ln): $InvCode is reserved to mark invalid codes and " + . "shouldn't be used in mappings, skip.\n") if $Verbose; + next; + } + + # Save mapping in UCSCCS and CCSUCS hash arrays. + $UCSCCS{$ucs} = $ccs if $ucs != $TmpLost && !defined $UCSCCS{$ucs}; + $CCSUCS{$ccs} = $ucs if !defined $CCSUCS{$ccs}; + + $Bits = 16 if $ccs > 0xFF; +} + +if (not %CCSUCS) +{ + Err "Error: there is no plane $Plane in \"$0\".\n" if defined $Plane; + Err "Error: mapping wasn't found.\n"; +} + + +# ============================================================================== +# GENERATE TABLE DATA +# ============================================================================== + +if ($Bits == 8) +{ + $FFMap = $CCSUCS{0xFF}; + $FFMap = $InvCode if !defined $FFMap; +} + +if ($Bits == 8) +{ + Generate8bitToUCS() unless $NoTo; +} +else +{ + GenerateSpeed("to_ucs") unless $NoTo || $NoSpeed; + Generate16bitSize("to_ucs") unless $NoTo || $NoSize; +} + +GenerateSpeed("from_ucs") unless $NoFrom || $NoSpeed; +Generate16bitSize("from_ucs") unless $NoFrom || $NoSize; + +# ============================================================================== +# OUTPUT ARRAYS +# ============================================================================== + +if ($Source) +{ + # OUTPUT SOURCE + print OUTFILE +"/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for $CCSName encoding. + */ + +#include \"ccsbi.h\" + +#if defined ($GuardToUCS) \\ + || defined ($GuardFromUCS) + +#include <_ansi.h> +#include +#include +#include \"ccs.h\" +#include \"ccsnames.h\" + +"; + + if ($Bits == 8) + { + print OUTFILE +"#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error \"Unknown byte order.\" +#endif + +"; + } + + unless ($NoTo) + { + if ($Bits == 8) + { + Output8bitToUCS(); + } + else + { + OutputSpeed("to_ucs") unless $NoSpeed; + OutputSize("to_ucs") unless $NoSize; + } + } + unless ($NoFrom) + { + if ($Bits == 8) + { + Output8bitFromUCS(); + } + else + { + OutputSpeed("from_ucs") unless $NoSpeed; + OutputSize("from_ucs") unless $NoSize; + } + } + + # OUTPUT TABLE DESCRIPTION STRUCTURE + print OUTFILE +"/* + * $CCSName CCS description table. + * $Separator + */ +const $TypeBICCS +$VarBICCS = +{ +\t$MacroVer1Table, /* Table version */ +\t$MacroCCSName, /* CCS name */ +"; + if ($Bits == 8) + { + print OUTFILE +"\t$Macro8bitTable, /* Table bits */ +\t0, /* Not Used */ +#if defined ($GuardFromUCS) +\t(__uint16_t *)&$VarFromUCSSpeed, /* UCS -> $CCSName table */ +#else +\t(__uint16_t *)NULL, +#endif +\t0, /* Not Used */ +#if defined ($GuardToUCS) +\t(__uint16_t *)&$VarToUCSSpeed /* $CCSName -> UCS table */ +#else +\t(__uint16_t *)NULL, +#endif +};\n"; + } + else + { + print OUTFILE +"\t$Macro16bitTable, /* Table bits */ +#if defined ($GuardFromUCS) \\ + && ($GuardSize) +\t$MacroSizeTable, +\t(__uint16_t *)&$VarFromUCSSize, /* UCS -> $CCSName table size-optimized table */ +#elif defined ($GuardFromUCS) \\ + && !($GuardSize) +\t$MacroSpeedTable, +\t(__uint16_t *)&$VarFromUCSSpeed, /* UCS -> $CCSName table speed-optimized table */ +#else +\t$MacroSpeedTable, +\t(__uint16_t *)NULL, +#endif +#if defined ($GuardToUCS) \\ + && ($GuardSize) +\t$MacroSizeTable, +\t(__uint16_t *)&$VarToUCSSize /* $CCSName -> UCS table speed-optimized table */ +#elif defined ($GuardToUCS) \\ + && !($GuardSize) +\t$MacroSpeedTable, +\t(__uint16_t *)&$VarToUCSSpeed /* $CCSName -> UCS table speed-optimized table */ +#else +\t$MacroSpeedTable, +\t(__uint16_t *)NULL, +#endif +};\n"; + } + print OUTFILE "\n#endif /* $GuardToUCS) || ... */\n\n"; +} +else +{ + # OUTPUT BINARY TABLES DESCRIPTION STRUCTURE (ALWAYS BIG ENDIAN) + print OUTFILE pack "n", 1; + print OUTFILE pack "n", $Bits; + my $len = length $CCSName; + print OUTFILE pack "N", $len; + print OUTFILE pack "a$len", $CCSName; + + my $pos = $HdrBinary + $len; + if ($pos & 3) + { + my $l = 4 - ($pos & 3); + print OUTFILE pack "a$l", 'XXX'; + $pos += $l; + } + + $pos += 16*4; + + my @tables; + for (my $i = 0; $i < 16; $i++) + { + $tables[$i] = 0; + } + + $tables[0] = $pos, $tables[1] = $FromSpeedBytes, $pos += $FromSpeedBytes + unless $NoFrom || $NoSpeed || $NoBE; + $tables[2] = $pos, $tables[3] = $FromSpeedBytes, $pos += $FromSpeedBytes + unless $NoFrom || $NoSpeed || $NoLE; + if ($Bits == 16) + { + $tables[4] = $pos, $tables[5] = $FromSizeBytes, $pos += $FromSizeBytes + unless $NoFrom || $NoSize || $NoBE; + $tables[6] = $pos, $tables[7] = $FromSizeBytes, $pos += $FromSizeBytes + unless $NoFrom || $NoSize || $NoLE; + } + $tables[8] = $pos, $tables[9] = $ToSpeedBytes, $pos += $ToSpeedBytes + unless $NoTo || $NoSpeed || $NoBE; + $tables[10] = $pos, $tables[11] = $ToSpeedBytes, $pos += $ToSpeedBytes + unless $NoTo || $NoSpeed || $NoLE; + if ($Bits == 16) + { + $tables[12] = $pos, $tables[13] = $ToSizeBytes, $pos += $ToSizeBytes + unless $NoTo || $NoSize || $NoBE; + $tables[14] = $pos, $tables[15] = $ToSizeBytes, $pos += $ToSizeBytes + unless $NoTo || $NoSize || $NoLE; + } + + print OUTFILE pack("N", $_) foreach @tables; + + print "Total bytes for output: $pos.\n" if $Verbose; + + # OUTPUT BINARY TABLES + unless ($NoFrom) + { + if ($Bits == 8) + { + Output8bitFromUCS("n") unless $NoBE; + Output8bitFromUCS("v") unless $NoLE; + } + else + { + unless ($NoSpeed) + { + OutputSpeed("from_ucs", "n") unless $NoBE; + OutputSpeed("from_ucs", "v") unless $NoLE; + } + unless ($NoSize) + { + OutputSize("from_ucs", "n") unless $NoBE; + OutputSize("from_ucs", "v") unless $NoLE; + } + } + } + unless ($NoTo) + { + if ($Bits == 8) + { + Output8bitToUCS("n") unless $NoBE; + Output8bitToUCS("v") unless $NoLE; + } + else + { + unless ($NoSpeed) + { + OutputSpeed("to_ucs", "n") unless $NoBE; + OutputSpeed("to_ucs", "v") unless $NoLE; + } + unless ($NoSize) + { + OutputSize("to_ucs", "n") unless $NoBE; + OutputSize("to_ucs", "v") unless $NoLE; + } + } + } +} + +close INFILE; +close OUTFILE; +exit 0; + + +# ############################################################################## +# +# SUPPLEMENTARY FUNCTIONS +# +# ############################################################################## + + +# ============================================================================= +# +# Generate 8bit "to_ucs" table. Store table data in %ToSpeedTbl hash. +# Store table size in $ToSpeedBytes scalar. +# +# ============================================================================= +sub Generate8bitToUCS() +{ + for (my $i = 0; $i <= 255; $i++) + { + $ToSpeedTbl[$i] = defined $CCSUCS{$i} ? $CCSUCS{$i} : $InvCode; + } + $ToSpeedBytes = 256*2; +} + + +# ============================================================================= +# +# Generate speed-optimized table. +# +# Parameter 1: +# "to_ucs" - generate "to_ucs" table, store table data in @ToSpeedTbl +# array, store table size in $ToSpeedBytes scalar. +# "from_ucs" - generate "from_ucs" table, store table data in @FromSpeedTbl +# array, store table size in $FromSpeedBytes scalar. +# +# Data is written to @ToSpeedTbl or @FromSpeedTbl (@map) table and has the +# following format: +# $table[0] - 256-element array (control block); +# $table[1 .. $#table] - 256-element arrays (data blocks). +# +# ============================================================================= +sub GenerateSpeed($) +{ + my $map; + my $tbl; + my $bytes; + + if ($_[0] eq "to_ucs") + { + $map = \%CCSUCS; + $tbl = \@ToSpeedTbl; + $bytes = \$ToSpeedBytes; + } + elsif ($_[0] eq "from_ucs") + { + $map = \%UCSCCS; + $tbl = \@FromSpeedTbl; + $bytes = \$FromSpeedBytes; + } + else + { + Err "Internal script error in GenerateSpeed()\n"; + } + + # Identify unused blocks + my @busy_blocks; + $busy_blocks[$_ >> 8] = 1 foreach (keys %$map); + + # GENERATE FIRST 256-ELEMENT CONTROL BLOCK + for (my $i = 0, + my $idx = $Bits == 16 ? 0 : 256 + $Hdr8bitFromUCS; + $i <= 0xFF; $i++) + { + $tbl->[0]->[$i] = $busy_blocks[$i] ? $idx += 256 : undef; + } + + # GENERATE DATA BLOCKS + $$bytes = 0; + for (my $i = 0; $i <= 0xFF; $i++) + { + next unless $busy_blocks[$i]; + $$bytes += 256; + for (my $j = 0; $j <= 0xFF; $j++) + { + $tbl->[$i+1]->[$j] = $map->{($i << 8) | $j}; + } + } + $$bytes *= 2 if $Bits == 16; + $$bytes += $Hdr8bitFromUCS if $Bits == 8; + $$bytes += 512; +} + + +# ============================================================================= +# +# Generate 16bit size-optimized table. +# +# Parameter 1: +# "to_ucs" - generate "to_ucs" table, store table data in @ToSizeTbl +# array, store table size in $ToSizeBytes scalar. +# "from_ucs" - generate "from_ucs" table, store table data in @FromSizeTbl +# array, store table size in $FromSizeBytes scalar. +# +# Data is written to @ToSizeTbl or @FromSizeTbl (@map) table and has the +# following format: +# $table[0] - number of ranges; +# $table[1] - number of unranged codes; +# $table[2] - unranged codes index in resulting array; +# $table[3]->[0 .. $table[0]] - array of arrays of ranges: +# $table[3]->[x]->[0] - first code; +# $table[3]->[x]->[1] - last code; +# $table[3]->[x]->[2] - range index in resulting array; +# $table[4]->[0 .. $table[0]] - array of arrays of ranges content; +# $table[5]->[0 .. $table[1]] - array of arrays of unranged codes; +# $table[5]->[x]->[0] - CCS code; +# $table[5]->[x]->[0] - UCS code; +# +# ============================================================================= +sub Generate16bitSize($) +{ + my $map; + my $tbl; + my $bytes; + + if ($_[0] eq "to_ucs") + { + $map = \%CCSUCS; + $tbl = \@ToSizeTbl; + $bytes = \$ToSizeBytes; + } + elsif ($_[0] eq "from_ucs") + { + $map = \%UCSCCS; + $tbl = \@FromSizeTbl; + $bytes = \$FromSizeBytes; + } + else + { + Err "Internal script error Generate16bitSize()\n"; + } + + # CREATE LIST OF RANGES. + my @codes = sort {$a <=> $b} keys %$map; + my @ranges; # Code ranges + my @range; # Current working range + foreach (@codes) + { + if (not @range or $_ - 1 == $range[$#range]) + { + push @range, $_; + } + else + { + my @tmp = @range; + push @ranges, \@tmp; + undef @range; + redo; + } + } + # Add Last range too + if (@range) + { + my @tmp = @range; + push @ranges, \@tmp; + } + + # OPTIMIZE LIST OF RANGES. + my $r = 0; # Working range number + while (1) + { + last if ($r == $#ranges); + + my @r1 = @{$ranges[$r]}; + my @r2 = @{$ranges[$r + 1]}; + + # Calculate how many array entries two ranges need + my ($s1, $s2); + + if ($#r1 == 0) + { $s1 = 2; } + elsif ($#r1 == 1) + { $s1 = 4; } + else + { $s1 = $#r1 + 1 + 3; } + + if ($#r2 == 0) + { $s2 = 2; } + elsif ($#r2 == 1) + { $s2 = 4; } + else + { $s2 = $#r2 + 1 + 3; } + + my $two = $s1 + $s2; + + # Calculate how many array entries will be needed if we join them + my $one = $r2[$#r2] - $r1[0] + 1 + 3; + + $r += 1, next if ($one > $two); + + # Join ranges + my @r; # New range. + push @r, $_ foreach (@r1); + for (my $i = $r1[$#r1]+1; $i < $r2[0]; $i++) + { + push @r, undef; + } + push @r, $_ foreach (@r2); + $ranges[$r] = \@r; + splice @ranges, $r+1, 1; + } + + # SEPARATE RANGED AND UNRANGED CODES. SPLIT 2-CODES RANGES ON 2 UNRANGED. + my @unranged; + foreach (@ranges) + { + if ($#$_ == 0) + { + push @unranged, $$_[0]; + undef $_; + } + elsif ($#$_ == 1) + { + push @unranged, $$_[0]; + push @unranged, $$_[1]; + undef $_; + } + } + + # DELETE UNUSED ELEMENTS + for (my $i = 0; $i <= $#ranges; $i++) + { + splice @ranges, $i--, 1 unless defined $ranges[$i]; + } + + # CALCULATE UNRANGED CODES ARRAY INDEX + my $idx = 3 + ($#ranges + 1)*3; + $idx += $#$_ + 1 foreach @ranges; + + # COMPOSE TABLE + $tbl->[0] = $#ranges + 1; # Number of ranges + $tbl->[1] = $#unranged + 1; # Number of unranged codes + $tbl->[2] = $idx; # Array index of unranged codes + + # Generate ranges list + $idx = 3 + ($#ranges + 1)*3; # First range data index + $$bytes = $idx*2; + my $num = 0; + foreach (@ranges) + { + $tbl->[3]->[$num]->[0] = $_->[0]; + $tbl->[3]->[$num]->[1] = $_->[$#$_]; + $tbl->[3]->[$num]->[2] = $idx; + $idx += $#$_ + 1; + $num += 1; + } + + # Generate ranges content + $num = 0; + foreach (@ranges) + { + for (my $i = 0; $i <= $#$_; $i++) + { + $tbl->[4]->[$num]->[$i] = defined $_->[$i] ? $map->{$_->[$i]} : undef; + } + $num += 1; + $$bytes += ($#$_ + 1)*2; + } + + # Generate unranged codes list + $num = 0; + foreach (@unranged) + { + $tbl->[5]->[$num]->[0] = $_; + $tbl->[5]->[$num]->[1] = $map->{$_}; + $num += 1; + } + + $$bytes += ($#unranged + 1)*4; +} + + +# ============================================================================= +# +# Output 8bit "to UCS" table. Output table's source code if $Source +# and table's binary data if !$Source. +# +# Parameter 1: Not used when sources are output. Output BE binary if 'n' and +# LE binary if 'v'. +# +# ============================================================================= +sub Output8bitToUCS(;$) +{ + my $endian = $_[0]; + my $br = 0; + + printf "Output%s 8-bit UCS -> $CCSName table ($ToSpeedBytes bytes).\n", + defined $endian ? ($endian eq 'n' ? + " Big Endian" : " Little Endian") : "" if $Verbose; + if ($Source) + { + # Output heading information + printf OUTFILE +"/* + * 8-bit $CCSName -> UCS table ($ToSpeedBytes bytes). + * $Separator + */ +#if defined ($GuardToUCS) + +static const __uint16_t +${VarToUCSSpeed}\[] = +{\n\t"; + } + + if ($Source) + { + foreach (@ToSpeedTbl) + { + $br += 1; + if ($_ != $InvCode) + { + if ($_ != $TmpLost) + { + printf OUTFILE "0x%.4X,", $_; + } + else + { + print OUTFILE "$MacroLostCode,"; + } + } + else + { + print OUTFILE "$MacroInvCode,"; + } + print(OUTFILE "\n\t"), $br = 0 unless $br % 8; + } + print OUTFILE "\n};\n\n#endif /* $GuardToUCS */\n\n"; + } + else + { + foreach (@ToSpeedTbl) + { + print OUTFILE pack($endian, $_ == $TmpLost ? $LostCode : $_); + } + } +} + + +# ============================================================================= +# +# Output 8bit "from UCS" table. Output table's source code if $Source +# and table's binary data if !$Source. +# +# Parameter 1: Not used when sources are output. Output BE binary if 'n' and +# LE binary if 'v'. +# +# ============================================================================= +sub Output8bitFromUCS(;$) +{ + my $endian = $_[0]; + + printf "Output%s 8-bit $CCSName -> UCS table ($FromSpeedBytes bytes).\n", + defined $endian ? ($endian eq 'n' ? + " Big Endian" : " Little Endian") : "" if $Verbose; + if ($Source) + { + print OUTFILE +"/* + * 8-bit UCS -> $CCSName speed-optimized table ($FromSpeedBytes bytes). + * $Separator + */ + +#if defined ($GuardFromUCS) + +static const unsigned char +${VarFromUCSSpeed}\[] = +{ +"; + } + + # SAVE 0xFF MAPPING. + if ($Source) + { + printf OUTFILE "\tW(0x%.4X), /* Real 0xFF mapping. 0xFF is used " + . "to mark invalid codes */\n", $FFMap; + } + else + { + print OUTFILE pack($endian, $FFMap); + } + + # OUTPUT HEADING BLOCK (ALWAYS 16 BIT) + if ($Source) + { + my $count = 0; + print OUTFILE "\t/* Heading Block */"; + for (my $i = 0, my $br = 0; $i < 256; $br = ++$i % 4) + { + print OUTFILE "\n\t" unless $br; + if (defined $FromSpeedTbl[0]->[$i]) + { + printf OUTFILE "W(0x%.4X),", $FromSpeedTbl[0]->[$i]; + } + else + { + print OUTFILE "W($MacroInvBlock),"; + } + } + } + else + { + print OUTFILE pack($endian, defined $_ ? $_ : $InvBlock) + foreach @{$FromSpeedTbl[0]}; + } + + if ($Source) + { + my $index = 512 + $Hdr8bitFromUCS; + for (my $blk = 1; $blk <= $#FromSpeedTbl; $blk++) + { + next unless defined $FromSpeedTbl[$blk]; + printf OUTFILE "\n\t/* Block $blk, Array index 0x%.4X */", $index; + $index += 256; + for (my $i = 0, my $br = 0; $i < 256; $i++, $br = $i % 8) + { + print OUTFILE "\n\t" unless $br; + my $code = $FromSpeedTbl[$blk]->[$i]; + if (!defined $code) + { + printf OUTFILE "0x%.2X,", $InvCode8bit; + } + else + { + printf OUTFILE "0x%.2X,", $code == $TmpLost ? $LostCode : $code; + } + } + } + print OUTFILE "\n};\n\n#endif /* $GuardFromUCS */\n\n"; + } + else + { + for (my $blk = 1; $blk <= $#FromSpeedTbl; $blk++) + { + next unless defined $FromSpeedTbl[$blk]; + for (my $i = 0, my $br = 0; $i < 256; $br = ++$i % 8) + { + my $code = $FromSpeedTbl[$blk]->[$i]; + if (!defined $code) + { + printf OUTFILE pack 'C', $InvCode8bit; + } + else + { + print OUTFILE $code == $TmpLost ? pack('C', $LostCode) + : pack('C', $code); + } + } + } + } +} + + +# ============================================================================= +# +# Output 16bit Speed-optimized table. Output table's source code if $Source +# and table's binary data if !$Source. +# +# Parameter 1: +# "to_ucs" - Output "to_ucs" table. +# "from_ucs" - Output "from_ucs" table. +# Parameter 2: Not used when sources are output. Output BE binary if 'n' and +# LE binary if 'v'. +# +# ============================================================================= +sub OutputSpeed($;$) +{ + my $endian = $_[1]; + my $tbl; + my ($direction, $optimiz, $e, $bytes); + $optimiz = $Bits == 16 ? " speed-optimized" : ""; + $e = $endian ? ($endian eq 'n' ? " Big Endian" : " Little Endian") : ""; + if ($_[0] eq "to_ucs") + { + $tbl = \@ToSpeedTbl; + $direction = " $CCSName -> UCS"; + $bytes = $ToSpeedBytes; + + if ($Source) + { + print OUTFILE +"/* + * 16-bit $CCSName -> UCS speed-optimized table ($ToSpeedBytes bytes). + * $Separator + */ +#if defined ($GuardToUCS) \\ + && !($GuardSize) + +static const __uint16_t +${VarToUCSSpeed}\[] = +{ +"; + } + } + elsif ($_[0] eq "from_ucs") + { + $tbl = \@FromSpeedTbl; + $direction = " UCS -> $CCSName"; + $bytes = $FromSpeedBytes; + + if ($Source) + { + print OUTFILE +"/* + * 16-bit UCS -> $CCSName speed-optimized table ($FromSpeedBytes bytes). + * $Separator + */ + +#if defined ($GuardFromUCS) \\ + && !($GuardSize) + +static const __uint16_t +${VarFromUCSSpeed}\[] = +{ +"; + } + } + else + { + Err "Internal script error Output16bitSpeed()\n"; + } + + printf "Output%s 16-bit%s%s table (%d bytes).\n", + $e, $direction, $optimiz, $bytes if $Verbose; + + # OUTPUT HEADING BLOCK (ALWAYS 16 BIT) + if ($Source) + { + my $count = 0; + print OUTFILE "\t/* Heading Block */"; + for (my $i = 0, my $br = 0; $i < 256; $br = ++$i % 8) + { + print OUTFILE "\n\t" unless $br; + if (defined $tbl->[0]->[$i]) + { + printf OUTFILE "0x%.4X,", $tbl->[0]->[$i]; + } + else + { + print OUTFILE "$MacroInvBlock,"; + } + } + } + else + { + print OUTFILE pack($endian, defined $_ ? $_ : $InvBlock) + foreach @{$tbl->[0]}; + } + + # OUTPUT OTHER BLOCKS + if ($Source) + { + my $index = 256; + for (my $blk = 1; $blk <= $#$tbl; $blk++) + { + next unless defined $tbl->[$blk]; + printf OUTFILE "\n\t/* Block $blk, Array index 0x%.4X */", $index; + $index += 256; + for (my $i = 0, my $br = 0; $i < 256; $br = ++$i % 8) + { + print OUTFILE "\n\t" unless $br; + my $code = $tbl->[$blk]->[$i]; + print OUTFILE defined $code ? + ($code == $TmpLost ? $MacroLostCode : sprintf "0x%.4X", $code) + : $MacroInvCode, ","; + } + } + } + else + { + for (my $blk = 1; $blk <= $#$tbl; $blk++) + { + next unless defined $tbl->[$blk]; + for (my $i = 0, my $br = 0; $i < 256; $br = ++$i % 8) + { + my $code = $tbl->[$blk]->[$i]; + print OUTFILE pack($endian, + defined $code ? ($code == $TmpLost ? $LostCode : $code) : $InvCode); + } + } + } + + if ($Source) + { + if ($_[0] eq "to_ucs") + { + print OUTFILE +" +}; + +#endif /* $GuardToUCS && !$GuardSize */ + +"; + } + else + { + print OUTFILE +" +}; + +#endif /* $GuardFromUCS && !$GuardSize */ + +"; + } + } +} + +# ============================================================================= +# +# Output 16bit Size-optimized table. Output table's source code if $Source +# and table's binary data if !$Source. +# +# Parameter 1: +# "to_ucs" - Output "to_ucs" table. +# "from_ucs" - Output "from_ucs" table. +# Parameter 2: Not used when sources are output. Output BE binary if 'n' and +# LE binary if 'v'. +# +# ============================================================================= +sub OutputSize($;$) +{ + my $endian = $_[1]; + my $tbl; + my ($direction, $optimiz, $e, $bytes); + $optimiz = $Bits == 16 ? " size-optimized" : ""; + $e = $endian ? ($endian eq 'n' ? " Big Endian" : " Little Endian") : ""; + if ($_[0] eq "to_ucs") + { + $tbl = \@ToSizeTbl; + $direction = " $CCSName -> UCS"; + $bytes = $ToSizeBytes; + + if ($Source) + { + print OUTFILE +"/* + * 16-bit $CCSName -> UCS size-optimized table ($ToSizeBytes bytes). + * $Separator + */ +#if defined ($GuardToUCS) \\ + && ($GuardSize) + +static const __uint16_t +${VarToUCSSize}\[] = +{ +"; + } + } + elsif ($_[0] eq "from_ucs") + { + $tbl = \@FromSizeTbl; + $direction = " UCS -> $CCSName"; + $bytes = $FromSizeBytes; + if ($Source) + { + print OUTFILE +"/* + * 16-bit UCS -> $CCSName size-optimized table ($FromSizeBytes bytes). + * $Separator + */ + +#if defined ($GuardFromUCS) \\ + && ($GuardSize) + +static const __uint16_t +${VarFromUCSSize}\[] = +{ +"; + } + } + else + { + Err "Internal script error Output16bitSize()\n"; + } + + printf "Output%s 16-bit%s%s table (%d bytes).\n", + $e, $direction, $optimiz, $bytes if $Verbose; + + # OUTPUT FIRST 3 ELEMENTS + if ($Source) + { + printf OUTFILE "\t0x%.4X, /* Ranges number */\n", $tbl->[0]; + printf OUTFILE "\t0x%.4X, /* Unranged codes number */\n", $tbl->[1]; + printf OUTFILE "\t0x%.4X, /* First unranged code index */\n", $tbl->[2]; + } + else + { + printf OUTFILE pack $endian, $tbl->[0]; + printf OUTFILE pack $endian, $tbl->[1]; + printf OUTFILE pack $endian, $tbl->[2]; + } + + my $idx = 0; + # OUTPUT RANGES + if ($Source) + { + print OUTFILE "\t/* Ranges list: first code, last Code, array index. */\n"; + for (my $range = 0; $range <= $#{$tbl->[3]}; $range++) + { + printf OUTFILE "\t/* Array index: 0x%.4X */ 0x%.4X, 0x%.4X, 0x%.4X,\n", + $idx += 3, + $tbl->[3]->[$range]->[0], + $tbl->[3]->[$range]->[1], + $tbl->[3]->[$range]->[2]; + } + } + else + { + for (my $range = 0; $range <= $#{$tbl->[3]}; $range++) + { + print OUTFILE pack($endian, $tbl->[3]->[$range]->[0]), + pack($endian, $tbl->[3]->[$range]->[1]), + pack($endian, $tbl->[3]->[$range]->[2]); + } + } + $idx += 3; + + # OUTPUT RANGES CONTENT + if ($Source) + { + print OUTFILE "\t/* Ranges content */"; + for (my $range = 0; $range <= $#{$tbl->[3]}; $range++) + { + printf OUTFILE "\n\t/* Range 0x%.4X - 0x%.4X, array index: 0x%.4X */", + $tbl->[3]->[$range]->[0], $tbl->[3]->[$range]->[1], $idx; + $idx += $tbl->[3]->[$range]->[1] - $tbl->[3]->[$range]->[0] + 1; + for (my $elt = 0, my $br = 0; + $elt <= $#{$tbl->[4]->[$range]}; + $br = ++$elt % 8) + { + print OUTFILE "\n\t" unless $br; + if (defined $tbl->[4]->[$range]->[$elt]) + { + if ($tbl->[4]->[$range]->[$elt] != $TmpLost) + { + printf OUTFILE "0x%.4X,", $tbl->[4]->[$range]->[$elt]; + } + else + { + print OUTFILE "$MacroLostCode,"; + } + } + else + { + print OUTFILE "$MacroInvCode,"; + } + } + } + } + else + { + for (my $range = 0; $range <= $#{$tbl->[3]}; $range++) + { + for (my $elt = 0; $elt <= $#{$tbl->[4]->[$range]}; $elt++) + { + if (defined $tbl->[4]->[$range]->[$elt]) + { + if ($tbl->[4]->[$range]->[$elt] != $TmpLost) + { + print OUTFILE pack $endian, $tbl->[4]->[$range]->[$elt]; + } + else + { + print OUTFILE pack $endian, $LostCode; + } + } + else + { + print OUTFILE pack $endian, $InvCode; + } + } + } + } + + # OUTPUT UNRANGED CODES + if ($Source) + { + printf OUTFILE "\n\t/* Unranged codes (%d codes) */", $#{$tbl->[4]} + 1; + for (my $i = 0; $i <= $#{$tbl->[5]}; $i++) + { + printf OUTFILE "\n\t/* Array index: 0x%.4X */ 0x%.4X,0x%.4X,", + $idx, $tbl->[5]->[$i]->[0], $tbl->[5]->[$i]->[1]; + } + } + else + { + for (my $i = 0; $i <= $#{$tbl->[5]}; $i++) + { + print OUTFILE pack($endian, $tbl->[5]->[$i]->[0]), + pack($endian, $tbl->[5]->[$i]->[1]); + } + } + + if ($Source) + { + if ($_[0] eq "to_ucs") + { + print OUTFILE +" +}; + +#endif /* $GuardToUCS && $GuardSize */ + +"; + } + else + { + print OUTFILE +" +}; + +#endif /* $GuardFromUCS && $GuardSize */ + +"; + } + } +} + + +# ============================================================================= +# +# Parse command line options +# +# ============================================================================= +sub ProcessOptions() +{ + my $help_opt = 'h'; # Print help option + my $input_opt = 'i'; # Input file name option + my $output_opt = 'o'; # Output file name option + my $source_opt = 'S'; # Generate C source file option + my $enc_opt = 'N'; # Encoding name + my $plane_opt = 'p'; # Plane number + my $verbose_opt = 'v'; # Verbose output + my $ccscol_opt = 'x'; # Encoding's column number + my $ucscol_opt = 'y'; # UCS column number + my $nosize_opt = 'l'; # Don't generate size-optimized tables + my $nospeed_opt = 'b'; # Don't generate speed-optimized tables + my $nobe_opt = 'B'; # Don't generate big-endian tables + my $nole_opt = 'L'; # Don't generate big-endian tables + my $noto_opt = 't'; # Don't generate "to_ucs" table + my $nofrom_opt = 'f'; # Don't generate "from_ucs" table + + my %args; # Command line arguments found by getopts() + + my $getopts_string = + "$help_opt$source_opt$enc_opt:$verbose_opt$input_opt:$output_opt:$plane_opt:" + . "$nosize_opt$nospeed_opt$nobe_opt$nole_opt$noto_opt$nofrom_opt$ccscol_opt:" + . "$ucscol_opt:"; + + getopts($getopts_string, \%args) || Err "getopts() failed: $!.\n", 1; + + # Print usage rules and exit. + if ($args{$help_opt}) + { + print<.c (for sources) or +.cct (for binaries) is assumed. +If encoding name isn't specified is assumed. + is normalized (small letters, "-" are substituted by "_") input file +name base (no extension). For example, for Koi8-r.txt input file, +is koi8_r. +END +; + exit 0; + } + + $Verbose = $args{$verbose_opt}; + $Source = $args{$source_opt}; + $NoSpeed = $args{$nospeed_opt}; + $NoSize = $args{$nosize_opt}; + $NoBE = $args{$nobe_opt}; + $NoLE = $args{$nole_opt}; + $NoFrom = $args{$nofrom_opt}; + $NoTo = $args{$noto_opt}; + $CCSCol = $args{$ccscol_opt}; + $UCSCol = $args{$ucscol_opt}; + $Plane = $args{$plane_opt}; + $InFile = $args{$input_opt}; + $OutFile = $args{$output_opt}; + $CCSName = $args{$enc_opt}; + + Err "Error: input file isn't defined. Use -$help_opt for help.\n", 1 + unless $InFile; + + unless ($OutFile) + { + # Construct output file name + $OutFile = $InFile; + $OutFile =~ s/(.*\/)*([0-9a-zA-Z-_]*)(\..*)$/\L$2/; + $OutFile =~ tr/-/_/; + if ($Source) + { + $OutFile = "$OutFile.c"; + } + else + { + $OutFile = "$OutFile.cct" + } + } + + unless ($CCSName) + { + # Construct CCS name + $CCSName = $InFile; + $CCSName =~ s/(.*\/)*([0-9a-zA-Z-_]*)(\..*)$/\L$2/; + $CCSName =~ tr/-/_/; + } + + Err "-$nosize_opt option can't be used with -$nospeed_opt option " + . "simultaniously.\n", 1 if $NoSpeed && $NoSize; + + Err "-$nobe_opt option can't be used with -$nole_opt option " + . "simultaniously.\n", 1 if $NoBE && $NoLE; + + Err "-$noto_opt option can't be used with -$nofrom_opt option" + . "simultaniously.\n", 1 if $NoTo && $NoFrom; + + Err "-$nosize_opt, -$nospeed_opt, -$nobe_opt -$nole_opt " + . "-$noto_opt and -$nofrom_opt " + . "options can't be used with -$source_opt option.\n" + . "Source code always contains both speed- and size-optimized " + . "tables in System Endian. Use -$help_opt for help.\n", 1 + if $Source and $NoSpeed || $NoSize || $NoBE || $NoLE || $NoTo || $NoFrom; + + if (!$CCSCol && !$UCSCol) + { + $CCSCol = 0; + $UCSCol = 1; + } + elsif ($CCSCol && $UCSCol) + { + Err "Column number should be >= 0\n", 1 if ($CCSCol <= 0 or $UCSCol <= 0); + $CCSCol -= 1; + $UCSCol -= 1; + } + else + { + Err "Please, define both CCS and UCS column numbers\n", 1; + } + + if ($Verbose) + { + print "Use $InFile file for input.\n", + "Use $OutFile file for output.\n", + "Use $CCSName as CCS name.\n"; + print "Generate C source file.\n" if $Source; + print "Generate binary file.\n" if !$Source; + printf "Use plane N 0x%.4X.\n", hex $Plane if defined $Plane; + printf "Use column N $CCSCol for $CCSName.\n"; + printf "Use column N $UCSCol for UCS.\n"; + print "Don't generate size-optimized tables.\n" if $NoSize; + print "Don't generate speed-optimized tables.\n" if $NoSpeed; + print "Don't generate big-endian tables.\n" if $NoBE; + print "Don't generate little-endian tables.\n" if $NoLE; + print "Don't generate \"to_ucs\" table.\n" if $NoTo; + print "Don't generate \"from_ucs\" table.\n" if $NoFrom; + } + + return; +} + + +# ============================================================================= +# +# Print error message, close all and exit +# +# Parameter 1: error message +# Parameter 2: don't delete output file if > 1 +# +# ============================================================================= +sub Err($;$) +{ + print STDERR "$_[0]"; + close INFILE; + close OUTFILE; + unlink $OutFile unless $_[1]; + + exit 1; +} \ No newline at end of file diff --git a/lib/iconv/ccs/win_1250.c b/lib/iconv/ccs/win_1250.c new file mode 100644 index 0000000..d86d6a0 --- /dev/null +++ b/lib/iconv/ccs/win_1250.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1250 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1250) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1250) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1250 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1250) + +static const __uint16_t +to_ucs_speed_win_1250[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,INVALC,0x201E,0x2026,0x2020,0x2021, + INVALC,0x2030,0x0160,0x2039,0x015A,0x0164,0x017D,0x0179, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + INVALC,0x2122,0x0161,0x203A,0x015B,0x0165,0x017E,0x017A, + 0x00A0,0x02C7,0x02D8,0x0141,0x00A4,0x0104,0x00A6,0x00A7, + 0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x00AD,0x00AE,0x017B, + 0x00B0,0x00B1,0x02DB,0x0142,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x0105,0x015F,0x00BB,0x013D,0x02DD,0x013E,0x017C, + 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7, + 0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E, + 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7, + 0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF, + 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7, + 0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F, + 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7, + 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1250 */ + +/* + * 8-bit UCS -> win_1250 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1250) + +static const unsigned char +from_ucs_speed_win_1250[] = +{ + W(0x02D9), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0502),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xFF,0xFF,0xFF,0xA4,0xFF,0xA6,0xA7, + 0xA8,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xFF, + 0xB0,0xB1,0xFF,0xFF,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xFF,0xFF,0xBB,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xC1,0xC2,0xFF,0xC4,0xFF,0xFF,0xC7, + 0xFF,0xC9,0xFF,0xCB,0xFF,0xCD,0xCE,0xFF, + 0xFF,0xFF,0xFF,0xD3,0xD4,0xFF,0xD6,0xD7, + 0xFF,0xFF,0xDA,0xFF,0xDC,0xDD,0xFF,0xDF, + 0xFF,0xE1,0xE2,0xFF,0xE4,0xFF,0xFF,0xE7, + 0xFF,0xE9,0xFF,0xEB,0xFF,0xED,0xEE,0xFF, + 0xFF,0xFF,0xFF,0xF3,0xF4,0xFF,0xF6,0xF7, + 0xFF,0xFF,0xFA,0xFF,0xFC,0xFD,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xC3,0xE3,0xA5,0xB9,0xC6,0xE6, + 0xFF,0xFF,0xFF,0xFF,0xC8,0xE8,0xCF,0xEF, + 0xD0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xCA,0xEA,0xCC,0xEC,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xC5,0xE5,0xFF,0xFF,0xBC,0xBE,0xFF, + 0xFF,0xA3,0xB3,0xD1,0xF1,0xFF,0xFF,0xD2, + 0xF2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD5,0xF5,0xFF,0xFF,0xC0,0xE0,0xFF,0xFF, + 0xD8,0xF8,0x8C,0x9C,0xFF,0xFF,0xAA,0xBA, + 0x8A,0x9A,0xDE,0xFE,0x8D,0x9D,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD9,0xF9, + 0xDB,0xFB,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8F,0x9F,0xAF,0xBF,0x8E,0x9E,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xA1, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA2,0xFF,0xFF,0xB2,0xFF,0xBD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1250 */ + +/* + * win_1250 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1250 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1250, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1250) + (__uint16_t *)&from_ucs_speed_win_1250, /* UCS -> win_1250 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1250) + (__uint16_t *)&to_ucs_speed_win_1250 /* win_1250 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1250) || ... */ + diff --git a/lib/iconv/ccs/win_1251.c b/lib/iconv/ccs/win_1251.c new file mode 100644 index 0000000..195fc0a --- /dev/null +++ b/lib/iconv/ccs/win_1251.c @@ -0,0 +1,308 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1251 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1251) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1251) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1251 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1251) + +static const __uint16_t +to_ucs_speed_win_1251[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x0402,0x0403,0x201A,0x0453,0x201E,0x2026,0x2020,0x2021, + 0x20AC,0x2030,0x0409,0x2039,0x040A,0x040C,0x040B,0x040F, + 0x0452,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + INVALC,0x2122,0x0459,0x203A,0x045A,0x045C,0x045B,0x045F, + 0x00A0,0x040E,0x045E,0x0408,0x00A4,0x0490,0x00A6,0x00A7, + 0x0401,0x00A9,0x0404,0x00AB,0x00AC,0x00AD,0x00AE,0x0407, + 0x00B0,0x00B1,0x0406,0x0456,0x0491,0x00B5,0x00B6,0x00B7, + 0x0451,0x2116,0x0454,0x00BB,0x0458,0x0405,0x0455,0x0457, + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417, + 0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F, + 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427, + 0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F, + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437, + 0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F, + 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447, + 0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1251 */ + +/* + * 8-bit UCS -> win_1251 speed-optimized table (1538 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1251) + +static const unsigned char +from_ucs_speed_win_1251[] = +{ + W(0x044F), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0302),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0402),W(0x0502),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xFF,0xFF,0xFF,0xA4,0xFF,0xA6,0xA7, + 0xFF,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xFF, + 0xB0,0xB1,0xFF,0xFF,0xFF,0xB5,0xB6,0xB7, + 0xFF,0xFF,0xFF,0xBB,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 5, Array index 0x0302 */ + 0xFF,0xA8,0x80,0x81,0xAA,0xBD,0xB2,0xAF, + 0xA3,0x8A,0x8C,0x8E,0x8D,0xFF,0xA1,0x8F, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + 0xFF,0xB8,0x90,0x83,0xBA,0xBE,0xB3,0xBF, + 0xBC,0x9A,0x9C,0x9E,0x9D,0xFF,0xA2,0x9F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA5,0xB4,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x88,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xB9,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1251 */ + +/* + * win_1251 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1251 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1251, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1251) + (__uint16_t *)&from_ucs_speed_win_1251, /* UCS -> win_1251 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1251) + (__uint16_t *)&to_ucs_speed_win_1251 /* win_1251 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1251) || ... */ + diff --git a/lib/iconv/ccs/win_1252.c b/lib/iconv/ccs/win_1252.c new file mode 100644 index 0000000..463cabd --- /dev/null +++ b/lib/iconv/ccs/win_1252.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1252 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1252) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1252) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1252 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1252) + +static const __uint16_t +to_ucs_speed_win_1252[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, + 0x02C6,0x2030,0x0160,0x2039,0x0152,INVALC,0x017D,INVALC, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0x02DC,0x2122,0x0161,0x203A,0x0153,INVALC,0x017E,0x0178, + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, + 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF, + 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1252 */ + +/* + * 8-bit UCS -> win_1252 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1252) + +static const unsigned char +from_ucs_speed_win_1252[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0502),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x8C,0x9C,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8A,0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9F,0xFF,0xFF,0xFF,0xFF,0x8E,0x9E,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x98,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1252 */ + +/* + * win_1252 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1252 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1252, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1252) + (__uint16_t *)&from_ucs_speed_win_1252, /* UCS -> win_1252 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1252) + (__uint16_t *)&to_ucs_speed_win_1252 /* win_1252 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1252) || ... */ + diff --git a/lib/iconv/ccs/win_1253.c b/lib/iconv/ccs/win_1253.c new file mode 100644 index 0000000..c9abd81 --- /dev/null +++ b/lib/iconv/ccs/win_1253.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1253 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1253) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1253) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1253 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1253) + +static const __uint16_t +to_ucs_speed_win_1253[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, + INVALC,0x2030,INVALC,0x2039,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + INVALC,0x2122,INVALC,0x203A,INVALC,INVALC,INVALC,INVALC, + 0x00A0,0x0385,0x0386,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,INVALC,0x00AB,0x00AC,0x00AD,0x00AE,0x2015, + 0x00B0,0x00B1,0x00B2,0x00B3,0x0384,0x00B5,0x00B6,0x00B7, + 0x0388,0x0389,0x038A,0x00BB,0x038C,0x00BD,0x038E,0x038F, + 0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397, + 0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F, + 0x03A0,0x03A1,INVALC,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7, + 0x03A8,0x03A9,0x03AA,0x03AB,0x03AC,0x03AD,0x03AE,0x03AF, + 0x03B0,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7, + 0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF, + 0x03C0,0x03C1,0x03C2,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7, + 0x03C8,0x03C9,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1253 */ + +/* + * 8-bit UCS -> win_1253 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1253) + +static const unsigned char +from_ucs_speed_win_1253[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(INVBLK),W(0x0402), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0502),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xFF,0xFF,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xFF, + 0xB0,0xB1,0xB2,0xB3,0xFF,0xB5,0xB6,0xB7, + 0xFF,0xFF,0xFF,0xBB,0xFF,0xBD,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 4, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xB4,0xA1,0xA2,0xFF, + 0xB8,0xB9,0xBA,0xFF,0xBC,0xFF,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xFF,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xAF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1253 */ + +/* + * win_1253 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1253 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1253, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1253) + (__uint16_t *)&from_ucs_speed_win_1253, /* UCS -> win_1253 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1253) + (__uint16_t *)&to_ucs_speed_win_1253 /* win_1253 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1253) || ... */ + diff --git a/lib/iconv/ccs/win_1254.c b/lib/iconv/ccs/win_1254.c new file mode 100644 index 0000000..05ed88e --- /dev/null +++ b/lib/iconv/ccs/win_1254.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1254 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1254) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1254) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1254 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1254) + +static const __uint16_t +to_ucs_speed_win_1254[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, + 0x02C6,0x2030,0x0160,0x2039,0x0152,INVALC,INVALC,INVALC, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0x02DC,0x2122,0x0161,0x203A,0x0153,INVALC,INVALC,0x0178, + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, + 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF, + 0x011E,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x0130,0x015E,0x00DF, + 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF, + 0x011F,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x0131,0x015F,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1254 */ + +/* + * 8-bit UCS -> win_1254 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1254) + +static const unsigned char +from_ucs_speed_win_1254[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0502),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xFF,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xFF,0xFF,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xFF,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD0,0xF0, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDD,0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x8C,0x9C,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDE,0xFE, + 0x8A,0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x98,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1254 */ + +/* + * win_1254 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1254 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1254, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1254) + (__uint16_t *)&from_ucs_speed_win_1254, /* UCS -> win_1254 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1254) + (__uint16_t *)&to_ucs_speed_win_1254 /* win_1254 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1254) || ... */ + diff --git a/lib/iconv/ccs/win_1255.c b/lib/iconv/ccs/win_1255.c new file mode 100644 index 0000000..47e9c01 --- /dev/null +++ b/lib/iconv/ccs/win_1255.c @@ -0,0 +1,374 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1255 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1255) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1255) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1255 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1255) + +static const __uint16_t +to_ucs_speed_win_1255[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, + 0x02C6,0x2030,INVALC,0x2039,INVALC,INVALC,INVALC,INVALC, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0x02DC,0x2122,INVALC,0x203A,INVALC,INVALC,INVALC,INVALC, + 0x00A0,0x00A1,0x00A2,0x00A3,0x20AA,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00D7,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00F7,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, + 0x05B0,0x05B1,0x05B2,0x05B3,0x05B4,0x05B5,0x05B6,0x05B7, + 0x05B8,0x05B9,INVALC,0x05BB,0x05BC,0x05BD,0x05BE,0x05BF, + 0x05C0,0x05C1,0x05C2,0x05C3,0x05F0,0x05F1,0x05F2,0x05F3, + 0x05F4,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC,INVALC, + 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7, + 0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF, + 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7, + 0x05E8,0x05E9,0x05EA,INVALC,INVALC,0x200E,0x200F,INVALC, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1255 */ + +/* + * 8-bit UCS -> win_1255 speed-optimized table (2050 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1255) + +static const unsigned char +from_ucs_speed_win_1255[] = +{ + W(0xFFFF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(0x0502),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0602),W(0x0702),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xA3,0xFF,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xFF,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xAA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xBA, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x98,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 6, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xFF,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD4,0xD5,0xD6,0xD7,0xD8,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFE, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xA4,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0702 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1255 */ + +/* + * win_1255 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1255 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1255, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1255) + (__uint16_t *)&from_ucs_speed_win_1255, /* UCS -> win_1255 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1255) + (__uint16_t *)&to_ucs_speed_win_1255 /* win_1255 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1255) || ... */ + diff --git a/lib/iconv/ccs/win_1256.c b/lib/iconv/ccs/win_1256.c new file mode 100644 index 0000000..93a1f07 --- /dev/null +++ b/lib/iconv/ccs/win_1256.c @@ -0,0 +1,374 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1256 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1256) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1256) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1256 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1256) + +static const __uint16_t +to_ucs_speed_win_1256[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,0x067E,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, + 0x02C6,0x2030,0x0679,0x2039,0x0152,0x0686,0x0698,0x0688, + 0x06AF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0x06A9,0x2122,0x0691,0x203A,0x0153,0x200C,0x200D,0x06BA, + 0x00A0,0x060C,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x06BE,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x061B,0x00BB,0x00BC,0x00BD,0x00BE,0x061F, + 0x06C1,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627, + 0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F, + 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x00D7, + 0x0637,0x0638,0x0639,0x063A,0x0640,0x0641,0x0642,0x0643, + 0x00E0,0x0644,0x00E2,0x0645,0x0646,0x0647,0x0648,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x0649,0x064A,0x00EE,0x00EF, + 0x064B,0x064C,0x064D,0x064E,0x00F4,0x064F,0x0650,0x00F7, + 0x0651,0x00F9,0x0652,0x00FB,0x00FC,0x200E,0x200F,0x06D2, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1256 */ + +/* + * 8-bit UCS -> win_1256 speed-optimized table (2050 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1256) + +static const unsigned char +from_ucs_speed_win_1256[] = +{ + W(0x06D2), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(0x0502),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0602),W(0x0702),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xFF,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xFF,0xBB,0xBC,0xBD,0xBE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD7, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xE0,0xFF,0xE2,0xFF,0xFF,0xFF,0xFF,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xFF,0xFF,0xEE,0xEF, + 0xFF,0xFF,0xFF,0xFF,0xF4,0xFF,0xFF,0xF7, + 0xFF,0xF9,0xFF,0xFB,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x8C,0x9C,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 7, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xA1,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xBA,0xFF,0xFF,0xFF,0xBF, + 0xFF,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD8, + 0xD9,0xDA,0xDB,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDC,0xDD,0xDE,0xDF,0xE1,0xE3,0xE4,0xE5, + 0xE6,0xEC,0xED,0xF0,0xF1,0xF2,0xF3,0xF5, + 0xF6,0xF8,0xFA,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8A,0xFF,0xFF,0xFF,0xFF,0x81,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8D,0xFF, + 0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x9A,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x8E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x98,0xFF,0xFF,0xFF,0xFF,0xFF,0x90, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xAA,0xFF, + 0xFF,0xC0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x9D,0x9E,0xFD,0xFE, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0702 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1256 */ + +/* + * win_1256 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1256 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1256, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1256) + (__uint16_t *)&from_ucs_speed_win_1256, /* UCS -> win_1256 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1256) + (__uint16_t *)&to_ucs_speed_win_1256 /* win_1256 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1256) || ... */ + diff --git a/lib/iconv/ccs/win_1257.c b/lib/iconv/ccs/win_1257.c new file mode 100644 index 0000000..4f9fa39 --- /dev/null +++ b/lib/iconv/ccs/win_1257.c @@ -0,0 +1,341 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1257 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1257) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1257) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1257 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1257) + +static const __uint16_t +to_ucs_speed_win_1257[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,INVALC,0x201E,0x2026,0x2020,0x2021, + INVALC,0x2030,INVALC,0x2039,INVALC,0x00A8,0x02C7,0x00B8, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + INVALC,0x2122,INVALC,0x203A,INVALC,0x00AF,0x02DB,INVALC, + 0x00A0,INVALC,0x00A2,0x00A3,0x00A4,INVALC,0x00A6,0x00A7, + 0x00D8,0x00A9,0x0156,0x00AB,0x00AC,0x00AD,0x00AE,0x00C6, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00F8,0x00B9,0x0157,0x00BB,0x00BC,0x00BD,0x00BE,0x00E6, + 0x0104,0x012E,0x0100,0x0106,0x00C4,0x00C5,0x0118,0x0112, + 0x010C,0x00C9,0x0179,0x0116,0x0122,0x0136,0x012A,0x013B, + 0x0160,0x0143,0x0145,0x00D3,0x014C,0x00D5,0x00D6,0x00D7, + 0x0172,0x0141,0x015A,0x016A,0x00DC,0x017B,0x017D,0x00DF, + 0x0105,0x012F,0x0101,0x0107,0x00E4,0x00E5,0x0119,0x0113, + 0x010D,0x00E9,0x017A,0x0117,0x0123,0x0137,0x012B,0x013C, + 0x0161,0x0144,0x0146,0x00F3,0x014D,0x00F5,0x00F6,0x00F7, + 0x0173,0x0142,0x015B,0x016B,0x00FC,0x017C,0x017E,0x02D9, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1257 */ + +/* + * 8-bit UCS -> win_1257 speed-optimized table (1794 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1257) + +static const unsigned char +from_ucs_speed_win_1257[] = +{ + W(0x02D9), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0502),W(0x0602),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xFF,0xA2,0xA3,0xA4,0xFF,0xA6,0xA7, + 0x8D,0xA9,0xFF,0xAB,0xAC,0xAD,0xAE,0x9D, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0x8F,0xB9,0xFF,0xBB,0xBC,0xBD,0xBE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xC4,0xC5,0xAF,0xFF, + 0xFF,0xC9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xD3,0xFF,0xD5,0xD6,0xD7, + 0xA8,0xFF,0xFF,0xFF,0xDC,0xFF,0xFF,0xDF, + 0xFF,0xFF,0xFF,0xFF,0xE4,0xE5,0xBF,0xFF, + 0xFF,0xE9,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xF3,0xFF,0xF5,0xF6,0xF7, + 0xB8,0xFF,0xFF,0xFF,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xC2,0xE2,0xFF,0xFF,0xC0,0xE0,0xC3,0xE3, + 0xFF,0xFF,0xFF,0xFF,0xC8,0xE8,0xFF,0xFF, + 0xFF,0xFF,0xC7,0xE7,0xFF,0xFF,0xCB,0xEB, + 0xC6,0xE6,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xCC,0xEC,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xCE,0xEE,0xFF,0xFF,0xC1,0xE1, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xCD,0xED, + 0xFF,0xFF,0xFF,0xCF,0xEF,0xFF,0xFF,0xFF, + 0xFF,0xD9,0xF9,0xD1,0xF1,0xD2,0xF2,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xD4,0xF4,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xAA,0xBA, + 0xFF,0xFF,0xDA,0xFA,0xFF,0xFF,0xFF,0xFF, + 0xD0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xDB,0xFB,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xD8,0xF8,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xCA,0xEA,0xDD,0xFD,0xDE,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x8E, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x9E,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0502 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1257 */ + +/* + * win_1257 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1257 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1257, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1257) + (__uint16_t *)&from_ucs_speed_win_1257, /* UCS -> win_1257 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1257) + (__uint16_t *)&to_ucs_speed_win_1257 /* win_1257 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1257) || ... */ + diff --git a/lib/iconv/ccs/win_1258.c b/lib/iconv/ccs/win_1258.c new file mode 100644 index 0000000..42ec247 --- /dev/null +++ b/lib/iconv/ccs/win_1258.c @@ -0,0 +1,374 @@ +/* + * This file was generated automatically - don't edit it. + * File contains iconv CCS tables for win_1258 encoding. + */ + +#include "ccsbi.h" + +#if defined (ICONV_TO_UCS_CCS_WIN_1258) \ + || defined (ICONV_FROM_UCS_CCS_WIN_1258) + +#include <_ansi.h> +#include +#include +#include "ccs.h" +#include "ccsnames.h" + +#if (BYTE_ORDER == LITTLE_ENDIAN) +# define W(word) (word) & 0xFF, (word) >> 8 +#elif (BYTE_ORDER == BIG_ENDIAN) +# define W(word) (word) >> 8, (word) & 0xFF +#else +# error "Unknown byte order." +#endif + +/* + * 8-bit win_1258 -> UCS table (512 bytes). + * ====================================================================== + */ +#if defined (ICONV_TO_UCS_CCS_WIN_1258) + +static const __uint16_t +to_ucs_speed_win_1258[] = +{ + 0x0000,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, + 0x0008,0x0009,0x000A,0x000B,0x000C,0x000D,0x000E,0x000F, + 0x0010,0x0011,0x0012,0x0013,0x0014,0x0015,0x0016,0x0017, + 0x0018,0x0019,0x001A,0x001B,0x001C,0x001D,0x001E,0x001F, + 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, + 0x0028,0x0029,0x002A,0x002B,0x002C,0x002D,0x002E,0x002F, + 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, + 0x0038,0x0039,0x003A,0x003B,0x003C,0x003D,0x003E,0x003F, + 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, + 0x0048,0x0049,0x004A,0x004B,0x004C,0x004D,0x004E,0x004F, + 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, + 0x0058,0x0059,0x005A,0x005B,0x005C,0x005D,0x005E,0x005F, + 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, + 0x0068,0x0069,0x006A,0x006B,0x006C,0x006D,0x006E,0x006F, + 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, + 0x0078,0x0079,0x007A,0x007B,0x007C,0x007D,0x007E,0x007F, + 0x20AC,INVALC,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021, + 0x02C6,0x2030,INVALC,0x2039,0x0152,INVALC,INVALC,INVALC, + INVALC,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014, + 0x02DC,0x2122,INVALC,0x203A,0x0153,INVALC,INVALC,0x0178, + 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7, + 0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF, + 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7, + 0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF, + 0x00C0,0x00C1,0x00C2,0x0102,0x00C4,0x00C5,0x00C6,0x00C7, + 0x00C8,0x00C9,0x00CA,0x00CB,0x0300,0x00CD,0x00CE,0x00CF, + 0x0110,0x00D1,0x0309,0x00D3,0x00D4,0x01A0,0x00D6,0x00D7, + 0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x01AF,0x0303,0x00DF, + 0x00E0,0x00E1,0x00E2,0x0103,0x00E4,0x00E5,0x00E6,0x00E7, + 0x00E8,0x00E9,0x00EA,0x00EB,0x0301,0x00ED,0x00EE,0x00EF, + 0x0111,0x00F1,0x0323,0x00F3,0x00F4,0x01A1,0x00F6,0x00F7, + 0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x01B0,0x20AB,0x00FF, + +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1258 */ + +/* + * 8-bit UCS -> win_1258 speed-optimized table (2050 bytes). + * ====================================================================== + */ + +#if defined (ICONV_FROM_UCS_CCS_WIN_1258) + +static const unsigned char +from_ucs_speed_win_1258[] = +{ + W(0x00FF), /* Real 0xFF mapping. 0xFF is used to mark invalid codes */ + /* Heading Block */ + W(0x0202),W(0x0302),W(0x0402),W(0x0502), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(0x0602),W(0x0702),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + W(INVBLK),W(INVBLK),W(INVBLK),W(INVBLK), + /* Block 1, Array index 0x0202 */ + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xFF,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xFF,0xCD,0xCE,0xCF, + 0xFF,0xD1,0xFF,0xD3,0xD4,0xFF,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xFF,0xFF,0xDF, + 0xE0,0xE1,0xE2,0xFF,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xFF,0xED,0xEE,0xEF, + 0xFF,0xF1,0xFF,0xF3,0xF4,0xFF,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFF,0xFF,0xFF, + /* Block 2, Array index 0x0302 */ + 0xFF,0xFF,0xC3,0xE3,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD0,0xF0,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x8C,0x9C,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x9F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x83,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xD5,0xF5,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xDD, + 0xFD,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 3, Array index 0x0402 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x88,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0x98,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 4, Array index 0x0502 */ + 0xCC,0xEC,0xFF,0xDE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xD2,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xF2,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 33, Array index 0x0602 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0x96,0x97,0xFF,0xFF,0xFF, + 0x91,0x92,0x82,0xFF,0x93,0x94,0x84,0xFF, + 0x86,0x87,0x95,0xFF,0xFF,0xFF,0x85,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0x8B,0x9B,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0x80,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + /* Block 34, Array index 0x0702 */ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x99,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +}; + +#endif /* ICONV_FROM_UCS_CCS_WIN_1258 */ + +/* + * win_1258 CCS description table. + * ====================================================================== + */ +const iconv_ccs_t +_iconv_ccs_win_1258 = +{ + TABLE_VERSION_1, /* Table version */ + ICONV_CCS_WIN_1258, /* CCS name */ + TABLE_8BIT, /* Table bits */ + 0, /* Not Used */ +#if defined (ICONV_FROM_UCS_CCS_WIN_1258) + (__uint16_t *)&from_ucs_speed_win_1258, /* UCS -> win_1258 table */ +#else + (__uint16_t *)NULL, +#endif + 0, /* Not Used */ +#if defined (ICONV_TO_UCS_CCS_WIN_1258) + (__uint16_t *)&to_ucs_speed_win_1258 /* win_1258 -> UCS table */ +#else + (__uint16_t *)NULL, +#endif +}; + +#endif /* ICONV_TO_UCS_CCS_WIN_1258) || ... */ + diff --git a/lib/iconv/ces/Makefile.inc b/lib/iconv/ces/Makefile.inc new file mode 100644 index 0000000..883c72c --- /dev/null +++ b/lib/iconv/ces/Makefile.inc @@ -0,0 +1,19 @@ +if ENABLE_NEWLIB_ICONV + +## The following interfaces are EL/IX level 2 +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/utf-8.c \ + %D%/utf-16.c \ + %D%/ucs-2.c \ + %D%/us-ascii.c \ + %D%/ucs-4.c \ + %D%/ucs-2-internal.c \ + %D%/ucs-4-internal.c \ + %D%/cesbi.c \ + %D%/table.c \ + %D%/table-pcs.c \ + %D%/euc.c +endif + +endif diff --git a/lib/iconv/ces/cesbi.c b/lib/iconv/ces/cesbi.c new file mode 100644 index 0000000..5fa5d1b --- /dev/null +++ b/lib/iconv/ces/cesbi.c @@ -0,0 +1,401 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#include <_ansi.h> +#include +#include "../lib/ucsconv.h" +#include "cesbi.h" + +/* + * Each CES converter provides the list of supported encodings. + */ +#if defined (ICONV_TO_UCS_CES_EUC) \ + || defined (ICONV_FROM_UCS_CES_EUC) +static const char * +iconv_ces_names_euc[] = +{ +# if defined (_ICONV_FROM_ENCODING_EUC_JP) \ + || defined (_ICONV_TO_ENCODING_EUC_JP) + ICONV_ENCODING_EUC_JP, +#endif +# if defined (_ICONV_FROM_ENCODING_EUC_KR) \ + || defined (_ICONV_TO_ENCODING_EUC_KR) + ICONV_ENCODING_EUC_KR, +#endif +# if defined (_ICONV_FROM_ENCODING_EUC_TW) \ + || defined (_ICONV_TO_ENCODING_EUC_TW) + ICONV_ENCODING_EUC_TW, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_TABLE) \ + || defined (ICONV_FROM_UCS_CES_TABLE) +static const char * +iconv_ces_names_table[] = +{ +# if defined (_ICONV_FROM_ENCODING_CP775) \ + || defined (_ICONV_TO_ENCODING_CP775) + ICONV_ENCODING_CP775, +#endif +# if defined (_ICONV_FROM_ENCODING_CP850) \ + || defined (_ICONV_TO_ENCODING_CP850) + ICONV_ENCODING_CP850, +#endif +# if defined (_ICONV_FROM_ENCODING_CP852) \ + || defined (_ICONV_TO_ENCODING_CP852) + ICONV_ENCODING_CP852, +#endif +# if defined (_ICONV_FROM_ENCODING_CP855) \ + || defined (_ICONV_TO_ENCODING_CP855) + ICONV_ENCODING_CP855, +#endif +# if defined (_ICONV_FROM_ENCODING_CP866) \ + || defined (_ICONV_TO_ENCODING_CP866) + ICONV_ENCODING_CP866, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_1) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_1) + ICONV_ENCODING_ISO_8859_1, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_10) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_10) + ICONV_ENCODING_ISO_8859_10, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_11) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_11) + ICONV_ENCODING_ISO_8859_11, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_13) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_13) + ICONV_ENCODING_ISO_8859_13, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_14) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_14) + ICONV_ENCODING_ISO_8859_14, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_15) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_15) + ICONV_ENCODING_ISO_8859_15, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_2) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_2) + ICONV_ENCODING_ISO_8859_2, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_3) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_3) + ICONV_ENCODING_ISO_8859_3, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_4) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_4) + ICONV_ENCODING_ISO_8859_4, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_5) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_5) + ICONV_ENCODING_ISO_8859_5, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_6) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_6) + ICONV_ENCODING_ISO_8859_6, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_7) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_7) + ICONV_ENCODING_ISO_8859_7, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_8) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_8) + ICONV_ENCODING_ISO_8859_8, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_8859_9) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_9) + ICONV_ENCODING_ISO_8859_9, +#endif +# if defined (_ICONV_FROM_ENCODING_ISO_IR_111) \ + || defined (_ICONV_TO_ENCODING_ISO_IR_111) + ICONV_ENCODING_ISO_IR_111, +#endif +# if defined (_ICONV_FROM_ENCODING_KOI8_R) \ + || defined (_ICONV_TO_ENCODING_KOI8_R) + ICONV_ENCODING_KOI8_R, +#endif +# if defined (_ICONV_FROM_ENCODING_KOI8_RU) \ + || defined (_ICONV_TO_ENCODING_KOI8_RU) + ICONV_ENCODING_KOI8_RU, +#endif +# if defined (_ICONV_FROM_ENCODING_KOI8_U) \ + || defined (_ICONV_TO_ENCODING_KOI8_U) + ICONV_ENCODING_KOI8_U, +#endif +# if defined (_ICONV_FROM_ENCODING_KOI8_UNI) \ + || defined (_ICONV_TO_ENCODING_KOI8_UNI) + ICONV_ENCODING_KOI8_UNI, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1250) \ + || defined (_ICONV_TO_ENCODING_WIN_1250) + ICONV_ENCODING_WIN_1250, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1251) \ + || defined (_ICONV_TO_ENCODING_WIN_1251) + ICONV_ENCODING_WIN_1251, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1252) \ + || defined (_ICONV_TO_ENCODING_WIN_1252) + ICONV_ENCODING_WIN_1252, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1253) \ + || defined (_ICONV_TO_ENCODING_WIN_1253) + ICONV_ENCODING_WIN_1253, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1254) \ + || defined (_ICONV_TO_ENCODING_WIN_1254) + ICONV_ENCODING_WIN_1254, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1255) \ + || defined (_ICONV_TO_ENCODING_WIN_1255) + ICONV_ENCODING_WIN_1255, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1256) \ + || defined (_ICONV_TO_ENCODING_WIN_1256) + ICONV_ENCODING_WIN_1256, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1257) \ + || defined (_ICONV_TO_ENCODING_WIN_1257) + ICONV_ENCODING_WIN_1257, +#endif +# if defined (_ICONV_FROM_ENCODING_WIN_1258) \ + || defined (_ICONV_TO_ENCODING_WIN_1258) + ICONV_ENCODING_WIN_1258, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_TABLE_PCS) \ + || defined (ICONV_FROM_UCS_CES_TABLE_PCS) +static const char * +iconv_ces_names_table_pcs[] = +{ +# if defined (_ICONV_FROM_ENCODING_BIG5) \ + || defined (_ICONV_TO_ENCODING_BIG5) + ICONV_ENCODING_BIG5, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_UCS_2) \ + || defined (ICONV_FROM_UCS_CES_UCS_2) +static const char * +iconv_ces_names_ucs_2[] = +{ +# if defined (_ICONV_FROM_ENCODING_UCS_2) \ + || defined (_ICONV_TO_ENCODING_UCS_2) + ICONV_ENCODING_UCS_2, +#endif +# if defined (_ICONV_FROM_ENCODING_UCS_2BE) \ + || defined (_ICONV_TO_ENCODING_UCS_2BE) + ICONV_ENCODING_UCS_2BE, +#endif +# if defined (_ICONV_FROM_ENCODING_UCS_2LE) \ + || defined (_ICONV_TO_ENCODING_UCS_2LE) + ICONV_ENCODING_UCS_2LE, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_UCS_2_INTERNAL) \ + || defined (ICONV_FROM_UCS_CES_UCS_2_INTERNAL) +static const char * +iconv_ces_names_ucs_2_internal[] = +{ +# if defined (_ICONV_FROM_ENCODING_UCS_2_INTERNAL) \ + || defined (_ICONV_TO_ENCODING_UCS_2_INTERNAL) + ICONV_ENCODING_UCS_2_INTERNAL, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_UCS_4) \ + || defined (ICONV_FROM_UCS_CES_UCS_4) +static const char * +iconv_ces_names_ucs_4[] = +{ +# if defined (_ICONV_FROM_ENCODING_UCS_4) \ + || defined (_ICONV_TO_ENCODING_UCS_4) + ICONV_ENCODING_UCS_4, +#endif +# if defined (_ICONV_FROM_ENCODING_UCS_4BE) \ + || defined (_ICONV_TO_ENCODING_UCS_4BE) + ICONV_ENCODING_UCS_4BE, +#endif +# if defined (_ICONV_FROM_ENCODING_UCS_4LE) \ + || defined (_ICONV_TO_ENCODING_UCS_4LE) + ICONV_ENCODING_UCS_4LE, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_UCS_4_INTERNAL) \ + || defined (ICONV_FROM_UCS_CES_UCS_4_INTERNAL) +static const char * +iconv_ces_names_ucs_4_internal[] = +{ +# if defined (_ICONV_FROM_ENCODING_UCS_4_INTERNAL) \ + || defined (_ICONV_TO_ENCODING_UCS_4_INTERNAL) + ICONV_ENCODING_UCS_4_INTERNAL, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_US_ASCII) \ + || defined (ICONV_FROM_UCS_CES_US_ASCII) +static const char * +iconv_ces_names_us_ascii[] = +{ +# if defined (_ICONV_FROM_ENCODING_US_ASCII) \ + || defined (_ICONV_TO_ENCODING_US_ASCII) + ICONV_ENCODING_US_ASCII, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_UTF_16) \ + || defined (ICONV_FROM_UCS_CES_UTF_16) +static const char * +iconv_ces_names_utf_16[] = +{ +# if defined (_ICONV_FROM_ENCODING_UTF_16) \ + || defined (_ICONV_TO_ENCODING_UTF_16) + ICONV_ENCODING_UTF_16, +#endif +# if defined (_ICONV_FROM_ENCODING_UTF_16BE) \ + || defined (_ICONV_TO_ENCODING_UTF_16BE) + ICONV_ENCODING_UTF_16BE, +#endif +# if defined (_ICONV_FROM_ENCODING_UTF_16LE) \ + || defined (_ICONV_TO_ENCODING_UTF_16LE) + ICONV_ENCODING_UTF_16LE, +#endif + NULL +}; +#endif + +#if defined (ICONV_TO_UCS_CES_UTF_8) \ + || defined (ICONV_FROM_UCS_CES_UTF_8) +static const char * +iconv_ces_names_utf_8[] = +{ +# if defined (_ICONV_FROM_ENCODING_UTF_8) \ + || defined (_ICONV_TO_ENCODING_UTF_8) + ICONV_ENCODING_UTF_8, +#endif + NULL +}; +#endif + +/* + * The following structure contains the list of "to UCS" linked-in CES converters. + */ +const iconv_to_ucs_ces_t +_iconv_to_ucs_ces[] = +{ +#ifdef ICONV_TO_UCS_CES_EUC + {(const char **)iconv_ces_names_euc, + &_iconv_to_ucs_ces_handlers_euc}, +#endif +#ifdef ICONV_TO_UCS_CES_TABLE + {(const char **)iconv_ces_names_table, + &_iconv_to_ucs_ces_handlers_table}, +#endif +#ifdef ICONV_TO_UCS_CES_TABLE_PCS + {(const char **)iconv_ces_names_table_pcs, + &_iconv_to_ucs_ces_handlers_table_pcs}, +#endif +#ifdef ICONV_TO_UCS_CES_UCS_2 + {(const char **)iconv_ces_names_ucs_2, + &_iconv_to_ucs_ces_handlers_ucs_2}, +#endif +#ifdef ICONV_TO_UCS_CES_UCS_2_INTERNAL + {(const char **)iconv_ces_names_ucs_2_internal, + &_iconv_to_ucs_ces_handlers_ucs_2_internal}, +#endif +#ifdef ICONV_TO_UCS_CES_UCS_4 + {(const char **)iconv_ces_names_ucs_4, + &_iconv_to_ucs_ces_handlers_ucs_4}, +#endif +#ifdef ICONV_TO_UCS_CES_UCS_4_INTERNAL + {(const char **)iconv_ces_names_ucs_4_internal, + &_iconv_to_ucs_ces_handlers_ucs_4_internal}, +#endif +#ifdef ICONV_TO_UCS_CES_US_ASCII + {(const char **)iconv_ces_names_us_ascii, + &_iconv_to_ucs_ces_handlers_us_ascii}, +#endif +#ifdef ICONV_TO_UCS_CES_UTF_16 + {(const char **)iconv_ces_names_utf_16, + &_iconv_to_ucs_ces_handlers_utf_16}, +#endif +#ifdef ICONV_TO_UCS_CES_UTF_8 + {(const char **)iconv_ces_names_utf_8, + &_iconv_to_ucs_ces_handlers_utf_8}, +#endif + {(const char **)NULL, + (iconv_to_ucs_ces_handlers_t *)NULL} +}; + +/* + * The following structure contains the list of "from UCS" linked-in CES converters. + */ +const iconv_from_ucs_ces_t +_iconv_from_ucs_ces[] = +{ +#ifdef ICONV_FROM_UCS_CES_EUC + {(const char **)iconv_ces_names_euc, + &_iconv_from_ucs_ces_handlers_euc}, +#endif +#ifdef ICONV_FROM_UCS_CES_TABLE + {(const char **)iconv_ces_names_table, + &_iconv_from_ucs_ces_handlers_table}, +#endif +#ifdef ICONV_FROM_UCS_CES_TABLE_PCS + {(const char **)iconv_ces_names_table_pcs, + &_iconv_from_ucs_ces_handlers_table_pcs}, +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_2 + {(const char **)iconv_ces_names_ucs_2, + &_iconv_from_ucs_ces_handlers_ucs_2}, +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_2_INTERNAL + {(const char **)iconv_ces_names_ucs_2_internal, + &_iconv_from_ucs_ces_handlers_ucs_2_internal}, +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_4 + {(const char **)iconv_ces_names_ucs_4, + &_iconv_from_ucs_ces_handlers_ucs_4}, +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_4_INTERNAL + {(const char **)iconv_ces_names_ucs_4_internal, + &_iconv_from_ucs_ces_handlers_ucs_4_internal}, +#endif +#ifdef ICONV_FROM_UCS_CES_US_ASCII + {(const char **)iconv_ces_names_us_ascii, + &_iconv_from_ucs_ces_handlers_us_ascii}, +#endif +#ifdef ICONV_FROM_UCS_CES_UTF_16 + {(const char **)iconv_ces_names_utf_16, + &_iconv_from_ucs_ces_handlers_utf_16}, +#endif +#ifdef ICONV_FROM_UCS_CES_UTF_8 + {(const char **)iconv_ces_names_utf_8, + &_iconv_from_ucs_ces_handlers_utf_8}, +#endif + {(const char **)NULL, + (iconv_from_ucs_ces_handlers_t *)NULL} +}; diff --git a/lib/iconv/ces/cesbi.h b/lib/iconv/ces/cesbi.h new file mode 100644 index 0000000..2b157c2 --- /dev/null +++ b/lib/iconv/ces/cesbi.h @@ -0,0 +1,276 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#ifndef __CESBI_H__ +#define __CESBI_H__ + +#include +#include <_ansi.h> +#include "../lib/encnames.h" +#include "../lib/ucsconv.h" + +/* + * Enable CES converter if correspondent encoding is requested. + * Defining ICONV_TO_UCS_CES_XXX macro or ICONV_FROM_UCS_CES_XXX + * macro is needed to enable "XXX encoding -> UCS" or "UCS -> XXX encoding" + * part of UCS-based CES converter. + */ +#if defined (_ICONV_FROM_ENCODING_EUC_JP) \ + || defined (_ICONV_FROM_ENCODING_EUC_KR) \ + || defined (_ICONV_FROM_ENCODING_EUC_TW) +# define ICONV_TO_UCS_CES_EUC +#endif +#if defined (_ICONV_TO_ENCODING_EUC_JP) \ + || defined (_ICONV_TO_ENCODING_EUC_KR) \ + || defined (_ICONV_TO_ENCODING_EUC_TW) +# define ICONV_FROM_UCS_CES_EUC +#endif + +#if defined (_ICONV_FROM_ENCODING_CP775) \ + || defined (_ICONV_FROM_ENCODING_CP850) \ + || defined (_ICONV_FROM_ENCODING_CP852) \ + || defined (_ICONV_FROM_ENCODING_CP855) \ + || defined (_ICONV_FROM_ENCODING_CP866) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_1) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_10) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_11) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_13) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_14) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_15) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_2) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_3) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_4) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_5) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_6) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_7) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_8) \ + || defined (_ICONV_FROM_ENCODING_ISO_8859_9) \ + || defined (_ICONV_FROM_ENCODING_ISO_IR_111) \ + || defined (_ICONV_FROM_ENCODING_KOI8_R) \ + || defined (_ICONV_FROM_ENCODING_KOI8_RU) \ + || defined (_ICONV_FROM_ENCODING_KOI8_U) \ + || defined (_ICONV_FROM_ENCODING_KOI8_UNI) \ + || defined (_ICONV_FROM_ENCODING_WIN_1250) \ + || defined (_ICONV_FROM_ENCODING_WIN_1251) \ + || defined (_ICONV_FROM_ENCODING_WIN_1252) \ + || defined (_ICONV_FROM_ENCODING_WIN_1253) \ + || defined (_ICONV_FROM_ENCODING_WIN_1254) \ + || defined (_ICONV_FROM_ENCODING_WIN_1255) \ + || defined (_ICONV_FROM_ENCODING_WIN_1256) \ + || defined (_ICONV_FROM_ENCODING_WIN_1257) \ + || defined (_ICONV_FROM_ENCODING_WIN_1258) +# define ICONV_TO_UCS_CES_TABLE +#endif +#if defined (_ICONV_TO_ENCODING_CP775) \ + || defined (_ICONV_TO_ENCODING_CP850) \ + || defined (_ICONV_TO_ENCODING_CP852) \ + || defined (_ICONV_TO_ENCODING_CP855) \ + || defined (_ICONV_TO_ENCODING_CP866) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_1) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_10) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_11) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_13) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_14) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_15) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_2) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_3) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_4) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_5) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_6) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_7) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_8) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_9) \ + || defined (_ICONV_TO_ENCODING_ISO_IR_111) \ + || defined (_ICONV_TO_ENCODING_KOI8_R) \ + || defined (_ICONV_TO_ENCODING_KOI8_RU) \ + || defined (_ICONV_TO_ENCODING_KOI8_U) \ + || defined (_ICONV_TO_ENCODING_KOI8_UNI) \ + || defined (_ICONV_TO_ENCODING_WIN_1250) \ + || defined (_ICONV_TO_ENCODING_WIN_1251) \ + || defined (_ICONV_TO_ENCODING_WIN_1252) \ + || defined (_ICONV_TO_ENCODING_WIN_1253) \ + || defined (_ICONV_TO_ENCODING_WIN_1254) \ + || defined (_ICONV_TO_ENCODING_WIN_1255) \ + || defined (_ICONV_TO_ENCODING_WIN_1256) \ + || defined (_ICONV_TO_ENCODING_WIN_1257) \ + || defined (_ICONV_TO_ENCODING_WIN_1258) +# define ICONV_FROM_UCS_CES_TABLE +#endif + +#if defined (_ICONV_FROM_ENCODING_BIG5) +# define ICONV_TO_UCS_CES_TABLE_PCS +#endif +#if defined (_ICONV_TO_ENCODING_BIG5) +# define ICONV_FROM_UCS_CES_TABLE_PCS +#endif + +#if defined (_ICONV_FROM_ENCODING_UCS_2) \ + || defined (_ICONV_FROM_ENCODING_UCS_2BE) \ + || defined (_ICONV_FROM_ENCODING_UCS_2LE) +# define ICONV_TO_UCS_CES_UCS_2 +#endif +#if defined (_ICONV_TO_ENCODING_UCS_2) \ + || defined (_ICONV_TO_ENCODING_UCS_2BE) \ + || defined (_ICONV_TO_ENCODING_UCS_2LE) +# define ICONV_FROM_UCS_CES_UCS_2 +#endif + +#if defined (_ICONV_FROM_ENCODING_UCS_2_INTERNAL) +# define ICONV_TO_UCS_CES_UCS_2_INTERNAL +#endif +#if defined (_ICONV_TO_ENCODING_UCS_2_INTERNAL) +# define ICONV_FROM_UCS_CES_UCS_2_INTERNAL +#endif + +#if defined (_ICONV_FROM_ENCODING_UCS_4) \ + || defined (_ICONV_FROM_ENCODING_UCS_4BE) \ + || defined (_ICONV_FROM_ENCODING_UCS_4LE) +# define ICONV_TO_UCS_CES_UCS_4 +#endif +#if defined (_ICONV_TO_ENCODING_UCS_4) \ + || defined (_ICONV_TO_ENCODING_UCS_4BE) \ + || defined (_ICONV_TO_ENCODING_UCS_4LE) +# define ICONV_FROM_UCS_CES_UCS_4 +#endif + +#if defined (_ICONV_FROM_ENCODING_UCS_4_INTERNAL) +# define ICONV_TO_UCS_CES_UCS_4_INTERNAL +#endif +#if defined (_ICONV_TO_ENCODING_UCS_4_INTERNAL) +# define ICONV_FROM_UCS_CES_UCS_4_INTERNAL +#endif + +#if defined (_ICONV_FROM_ENCODING_US_ASCII) +# define ICONV_TO_UCS_CES_US_ASCII +#endif +#if defined (_ICONV_TO_ENCODING_US_ASCII) +# define ICONV_FROM_UCS_CES_US_ASCII +#endif + +#if defined (_ICONV_FROM_ENCODING_UTF_16) \ + || defined (_ICONV_FROM_ENCODING_UTF_16BE) \ + || defined (_ICONV_FROM_ENCODING_UTF_16LE) +# define ICONV_TO_UCS_CES_UTF_16 +#endif +#if defined (_ICONV_TO_ENCODING_UTF_16) \ + || defined (_ICONV_TO_ENCODING_UTF_16BE) \ + || defined (_ICONV_TO_ENCODING_UTF_16LE) +# define ICONV_FROM_UCS_CES_UTF_16 +#endif + +#if defined (_ICONV_FROM_ENCODING_UTF_8) +# define ICONV_TO_UCS_CES_UTF_8 +#endif +#if defined (_ICONV_TO_ENCODING_UTF_8) +# define ICONV_FROM_UCS_CES_UTF_8 +#endif + +/* + * Some encodings require another encodings to be enabled. + * These dependencies are handled in cesdeps.h header file. + */ +#include "cesdeps.h" + +/* + * NLS uses iconv's capabilities and require one of encodings + * to be enabled for internal wchar_t representation. + */ +#include "../lib/iconvnls.h" + +/* + * Forward declarations of CES converter handlers. + * These handlers are actually defined in correspondent CES converter files. + */ +#ifdef ICONV_TO_UCS_CES_EUC +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_euc; +#endif +#ifdef ICONV_FROM_UCS_CES_EUC +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_euc; +#endif + +#ifdef ICONV_TO_UCS_CES_TABLE +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_table; +#endif +#ifdef ICONV_FROM_UCS_CES_TABLE +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_table; +#endif + +#ifdef ICONV_TO_UCS_CES_TABLE_PCS +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_table_pcs; +#endif +#ifdef ICONV_FROM_UCS_CES_TABLE_PCS +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_table_pcs; +#endif + +#ifdef ICONV_TO_UCS_CES_UCS_2 +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_2; +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_2 +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_2; +#endif + +#ifdef ICONV_TO_UCS_CES_UCS_2_INTERNAL +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_2_internal; +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_2_INTERNAL +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_2_internal; +#endif + +#ifdef ICONV_TO_UCS_CES_UCS_4 +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_4; +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_4 +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_4; +#endif + +#ifdef ICONV_TO_UCS_CES_UCS_4_INTERNAL +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_4_internal; +#endif +#ifdef ICONV_FROM_UCS_CES_UCS_4_INTERNAL +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_4_internal; +#endif + +#ifdef ICONV_TO_UCS_CES_US_ASCII +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_us_ascii; +#endif +#ifdef ICONV_FROM_UCS_CES_US_ASCII +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_us_ascii; +#endif + +#ifdef ICONV_TO_UCS_CES_UTF_16 +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_utf_16; +#endif +#ifdef ICONV_FROM_UCS_CES_UTF_16 +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_utf_16; +#endif + +#ifdef ICONV_TO_UCS_CES_UTF_8 +extern const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_utf_8; +#endif +#ifdef ICONV_FROM_UCS_CES_UTF_8 +extern const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_utf_8; +#endif + +#endif /* !__CESBI_H__ */ + diff --git a/lib/iconv/ces/cesdeps.h b/lib/iconv/ces/cesdeps.h new file mode 100644 index 0000000..e6aec45 --- /dev/null +++ b/lib/iconv/ces/cesdeps.h @@ -0,0 +1,40 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#ifndef __CESDEPS_H__ +#define __CESDEPS_H__ + +/* + * Some CES converters use another CES converters and the following + * is such dependencies description. + */ +#ifdef ICONV_TO_UCS_CES_EUC +# ifndef ICONV_TO_UCS_CES_TABLE +# define ICONV_TO_UCS_CES_TABLE +# endif +# ifndef ICONV_TO_UCS_CES_US_ASCII +# define ICONV_TO_UCS_CES_US_ASCII +# endif +#endif +#ifdef ICONV_FROM_UCS_CES_EUC +# ifndef ICONV_FROM_UCS_CES_TABLE +# define ICONV_FROM_UCS_CES_TABLE +# endif +# ifndef ICONV_FROM_UCS_CES_US_ASCII +# define ICONV_FROM_UCS_CES_US_ASCII +# endif +#endif +#ifdef ICONV_TO_UCS_CES_TABLE_PCS +# ifndef ICONV_TO_UCS_CES_TABLE +# define ICONV_TO_UCS_CES_TABLE +# endif +#endif +#ifdef ICONV_FROM_UCS_CES_TABLE_PCS +# ifndef ICONV_FROM_UCS_CES_TABLE +# define ICONV_FROM_UCS_CES_TABLE +# endif +#endif + +#endif /* !__CESDEPS_H__ */ + diff --git a/lib/iconv/ces/euc.c b/lib/iconv/ces/euc.c new file mode 100644 index 0000000..ebd7091 --- /dev/null +++ b/lib/iconv/ces/euc.c @@ -0,0 +1,464 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_EUC) \ + || defined (ICONV_FROM_UCS_CES_EUC) + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../lib/encnames.h" +#include "../ccs/ccsnames.h" + +#define TYPE_EUC_JP 0 +#define TYPE_EUC_KR 1 +#define TYPE_EUC_TW 2 + +#define MAX_CS_NUM 3 + +/* CS description structure */ +typedef struct +{ + char *csname; + char *prefix; + int bytes; + int prefixbytes; + int touchmsb; /* If 1, msb will be set by euc converter */ +} euc_cs_desc_t; + +typedef struct +{ + int type; + int mb_cur_max; + euc_cs_desc_t *desc; + + void *data[MAX_CS_NUM]; +} euc_data_t; + +#if defined (_ICONV_TO_ENCODING_EUC_JP) \ + || defined (_ICONV_FROM_ENCODING_EUC_JP) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) +static euc_cs_desc_t euc_jp_cs_desc[] = +{ + {ICONV_CCS_JIS_X0208_1990, "", 2, 0, 1}, + {ICONV_CCS_JIS_X0201_1976, "\x8e", 1, 1, 0}, + {ICONV_CCS_JIS_X0212_1990, "\x8f", 2, 1, 1}, + {NULL, NULL, 0, 0} +}; +#endif + +#if defined (_ICONV_TO_ENCODING_EUC_TW) \ + || defined (_ICONV_FROM_ENCODING_EUC_TW) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) +static euc_cs_desc_t euc_tw_cs_desc [] = +{ + {ICONV_CCS_CNS11643_PLANE1, "", 2, 0, 1}, + {ICONV_CCS_CNS11643_PLANE2, "\x8e\xa2", 2, 2, 1}, + {ICONV_CCS_CNS11643_PLANE14, "\x8e\xae", 2, 2, 1}, + {NULL, NULL, 0, 0} +}; +#endif + +#if defined (_ICONV_TO_ENCODING_EUC_KR) \ + || defined (_ICONV_FROM_ENCODING_EUC_KR) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) +static euc_cs_desc_t euc_kr_cs_desc [] = +{ + {ICONV_CCS_KSX1001, "", 2, 0, 1}, + {NULL, NULL, 0, 0} +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_EUC) +static void * +euc_from_ucs_init (struct _reent *rptr, + const char *encoding) +{ + int i; + euc_data_t *data; + + if ((data = (euc_data_t *)_calloc_r (rptr, 1, sizeof (euc_data_t))) == NULL) + return 0; + +#if defined (_ICONV_TO_ENCODING_EUC_JP) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) + if (strcmp (encoding, ICONV_ENCODING_EUC_JP) == 0) + { + data->type = TYPE_EUC_JP; + data->mb_cur_max = 3; + data->desc = &euc_jp_cs_desc[0]; + goto ok; + } +#endif +#if defined (_ICONV_TO_ENCODING_EUC_KR) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) + if (strcmp (encoding, ICONV_ENCODING_EUC_KR) == 0) + { + data->type = TYPE_EUC_KR; + data->mb_cur_max = 2; + data->desc = &euc_kr_cs_desc[0]; + goto ok; + } +#endif +#if defined (_ICONV_TO_ENCODING_EUC_TW) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) + if (strcmp (encoding, ICONV_ENCODING_EUC_TW) == 0) + { + data->type = TYPE_EUC_TW; + data->mb_cur_max = 4; + data->desc = &euc_tw_cs_desc[0]; + goto ok; + } +#endif + + goto error1; + +ok: + for (i = 0; data->desc[i].csname != NULL; i++) + { + data->data[i] = _iconv_from_ucs_ces_handlers_table.init ( + rptr, + data->desc[i].csname); + if (data->data == NULL) + goto error; + } + + return data; + +error: + _iconv_from_ucs_ces_handlers_table.close (rptr, data); + return NULL; +error1: + _free_r (rptr, (void *)data); + return NULL; +} + +static size_t +euc_from_ucs_close (struct _reent *rptr, + void *data) +{ + int i; + size_t res = 0; + + for (i = 0; i < MAX_CS_NUM; i++) + { + if (((euc_data_t *)data)->data[i] != NULL) + res |= _iconv_from_ucs_ces_handlers_table.close ( + rptr, + ((euc_data_t *)data)->data[i]); + } + _free_r(rptr, data); + + return res; +} + +static size_t +euc_convert_from_ucs (void *data, + register ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + int i; + int j; + int res; + unsigned char *outbuf1; + size_t outbytesleft1; + euc_data_t *d = (euc_data_t *)data; + + if (in < 0x80) /* CS0 ASCII */ + return _iconv_from_ucs_ces_handlers_us_ascii.convert_from_ucs ( + NULL, + in, + outbuf, + outbytesleft); + + /* Try other CS */ + for (i = 0; d->desc[i].csname != NULL; i++) + { + + if (((int)*outbytesleft - d->desc[i].prefixbytes - d->desc[i].bytes) < 0) + { + char buf[ICONV_MB_LEN_MAX]; + outbytesleft1 = ICONV_MB_LEN_MAX; + outbuf1 = &buf[0]; + /* See wether this is right sequence */ + res = + (int)_iconv_from_ucs_ces_handlers_table.convert_from_ucs ( + d->data[i], + in, + &outbuf1, + &outbytesleft1); + if (res > 0) + return (size_t)ICONV_CES_NOSPACE; + + continue; + } + + outbuf1 = *outbuf + d->desc[i].prefixbytes; + outbytesleft1 = *outbytesleft - d->desc[i].prefixbytes; + + res = (int)_iconv_from_ucs_ces_handlers_table.convert_from_ucs ( + d->data[i], + in, + &outbuf1, + &outbytesleft1); + if (res == d->desc[i].bytes) + { + for (j = 0; j < d->desc[i].prefixbytes; j++) + (*outbuf)[j] = d->desc[i].prefix[j]; + + if (d->desc[i].touchmsb) + for (j = 0; j < d->desc[i].bytes; j++) + { + if ((*outbuf)[j + d->desc[i].prefixbytes] & 0x80) + return (size_t)ICONV_CES_INVALID_CHARACTER; + (*outbuf)[j + d->desc[i].prefixbytes] |= 0x80; + } + + *outbuf = outbuf1; + *outbytesleft = outbytesleft1; + + return (size_t)(res + d->desc[i].bytes); + } + } + + return (size_t)ICONV_CES_INVALID_CHARACTER; +} +#endif /* ICONV_FROM_UCS_CES_EUC */ + +#if defined (ICONV_TO_UCS_CES_EUC) +static void * +euc_to_ucs_init (struct _reent *rptr, + const char *encoding) +{ + int i; + euc_data_t *data; + + if ((data = (euc_data_t *)_calloc_r (rptr, 1, sizeof (euc_data_t))) == NULL) + return 0; + +#if defined (_ICONV_TO_ENCODING_EUC_JP) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) + if (strcmp (encoding, ICONV_ENCODING_EUC_JP) == 0) + { + data->type = TYPE_EUC_JP; + data->mb_cur_max = 3; + data->desc = &euc_jp_cs_desc[0]; + goto ok; + } +#endif +#if defined (_ICONV_TO_ENCODING_EUC_KR) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) + if (strcmp (encoding, ICONV_ENCODING_EUC_KR) == 0) + { + data->type = TYPE_EUC_KR; + data->mb_cur_max = 2; + data->desc = &euc_kr_cs_desc[0]; + goto ok; + } +#endif +#if defined (_ICONV_TO_ENCODING_EUC_TW) \ + || defined (_ICONV_ENABLE_EXTERNAL_CCS) + if (strcmp (encoding, ICONV_ENCODING_EUC_TW) == 0) + { + data->type = TYPE_EUC_TW; + data->mb_cur_max = 4; + data->desc = &euc_tw_cs_desc[0]; + goto ok; + } +#endif + + goto error1; + +ok: + for (i = 0; data->desc[i].csname != NULL; i++) + { + data->data[i] = _iconv_to_ucs_ces_handlers_table.init ( + rptr, + data->desc[i].csname); + if (data->data[i] == NULL) + goto error; + } + + return data; + +error: + _iconv_to_ucs_ces_handlers_table.close (rptr, data); + return NULL; +error1: + _free_r (rptr, (void *)data); + return NULL; +} + +static size_t +euc_to_ucs_close (struct _reent *rptr, + void *data) +{ + int i; + size_t res = 0; + + for (i = 0; i < MAX_CS_NUM; i++) + { + if (((euc_data_t *)data)->data[i] != NULL) + res |= _iconv_to_ucs_ces_handlers_table.close ( + rptr, + ((euc_data_t *)data)->data[i]); + } + _free_r(rptr, data); + + return res; +} + +static ucs4_t +euc_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + int i; + int j; + ucs4_t res; + unsigned char buf[ICONV_MB_LEN_MAX]; + size_t inbytesleft1; + euc_data_t *d = (euc_data_t *)data; + unsigned char *inbuf1 = &buf[0]; + + if (**inbuf < 0x80) /* CS0 is always ASCII */ + return _iconv_to_ucs_ces_handlers_us_ascii.convert_to_ucs ( + NULL, + inbuf, + inbytesleft); + + for (i = 1; d->desc[i].csname != NULL; i++) + { + if (memcmp((const void *)(*inbuf), + (const void *)d->desc[i].prefix, + d->desc[i].prefixbytes) == 0) + { + if (((int)*inbytesleft - d->desc[i].prefixbytes - d->desc[i].bytes) < 0) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (d->desc[i].touchmsb) + for (j = 0; j < d->desc[i].bytes; j++) + { + if (!((*inbuf)[j + d->desc[i].prefixbytes] & 0x80)) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + inbuf1[j] = (*inbuf)[j + d->desc[i].prefixbytes] & 0x7F; + } + else + for (j = 0; j < d->desc[i].bytes; j++) + inbuf1[j] = (*inbuf)[j + d->desc[i].prefixbytes]; + + inbytesleft1 = d->desc[i].bytes; + + res = _iconv_to_ucs_ces_handlers_table.convert_to_ucs ( + d->data[i], + (const unsigned char **)&inbuf1, + &inbytesleft1); + if (((__int32_t)res) > 0) + { + *inbuf += d->desc[i].bytes + d->desc[i].prefixbytes; + *inbytesleft -= d->desc[i].bytes + d->desc[i].prefixbytes; + } + + return res; + } + } + + /* Process CS1 */ + if (((int)(*inbytesleft - d->desc[0].prefixbytes - d->desc[0].bytes)) < 0) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (d->desc[0].touchmsb) + for (j = 0; j < d->desc[0].bytes; j++) + { + if (!((*inbuf)[j + d->desc[0].prefixbytes] & 0x80)) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + inbuf1[j] = (*inbuf)[j] & 0x7F; + } + else + for (j = 0; j < d->desc[0].bytes; j++) + inbuf1[j] = (*inbuf)[j]; + + inbytesleft1 = d->desc[0].bytes; + + res = _iconv_to_ucs_ces_handlers_table.convert_to_ucs ( + d->data[0], + (const unsigned char **)&inbuf1, + &inbytesleft1); + if (((__int32_t)res) > 0) + { + *inbuf += d->desc[0].bytes; + *inbytesleft -= d->desc[0].bytes; + } + + return res; +} +#endif /* ICONV_TO_UCS_CES_EUC */ + +static int +euc_get_mb_cur_max (void *data) +{ + return ((euc_data_t *)data)->mb_cur_max; +} + +#if defined (ICONV_FROM_UCS_CES_EUC) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_euc = +{ + euc_from_ucs_init, + euc_from_ucs_close, + euc_get_mb_cur_max, + NULL, + NULL, + NULL, + euc_convert_from_ucs +}; +#endif + +#if defined (ICONV_TO_UCS_CES_EUC) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_euc = +{ + euc_to_ucs_init, + euc_to_ucs_close, + euc_get_mb_cur_max, + NULL, + NULL, + NULL, + euc_convert_to_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_EUC || ICONV_FROM_UCS_CES_EUC */ + + diff --git a/lib/iconv/ces/mkdeps.pl b/lib/iconv/ces/mkdeps.pl new file mode 100644 index 0000000..649f2c5 --- /dev/null +++ b/lib/iconv/ces/mkdeps.pl @@ -0,0 +1,969 @@ +#!/usr/bin/perl -w +# +# Copyright (c) 2003-2004, Artem B. Bityuckiy, SoftMine Corporation. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +use integer; +use Getopt::Std; +use strict; + +sub err($); +sub process_section_encodings($); +sub process_section_cesdeps($); +sub next_entry($$$); + +sub generate_cesbi_h($$); +sub generate_encnames_h(@); +sub generate_aliasesbi_c($); +sub generate_encoding_aliases_c($); +sub generate_cesdeps_h($); +sub generate_ccsbi_h($); +sub generate_cesbi_c($); +sub generate_ccsnames_h($); + +# ============================================================================== +# +# GLOBAL VARIABLES +# +# ============================================================================== + +my $comment_automatic = +"/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */"; + +my $macro_from_enc = '_ICONV_FROM_ENCODING_'; +my $macro_to_enc = '_ICONV_TO_ENCODING_'; +my $macro_from_ucs_ces = 'ICONV_FROM_UCS_CES_'; +my $macro_to_ucs_ces = 'ICONV_TO_UCS_CES_'; +my $macro_from_ucs_ccs = 'ICONV_FROM_UCS_CCS_'; +my $macro_to_ucs_ccs = 'ICONV_TO_UCS_CCS_'; +my $macro_enc_name = 'ICONV_ENCODING_'; +my $macro_ccs_name = 'ICONV_CCS_'; + +my $var_from_ucs_handlers = '_iconv_from_ucs_ces_handlers_'; +my $var_to_ucs_handlers = '_iconv_to_ucs_ces_handlers_'; +my $var_ccs = '_iconv_ccs_'; +my $var_aliases = '_iconv_aliases'; +my $var_ces_names = 'iconv_ces_names_'; + +# ============================================================================== +# +# PARSE COMMAND-LINE OPTIONS. +# +# ============================================================================== + +my %options; + +# SUPPORTED OPTIONS. +my $help_opt = 'h'; +my $infile_opt = 'i'; +my $verbose_opt = 'v'; + +# Default input configuration file name +my $default_infile = '../lib/encoding.deps'; +# Real input configuration file name +my $infile; +# Verbose flag (be verbose if not zero) +my $verbose; + +{ +getopts ("${help_opt}${verbose_opt}${infile_opt}:", \%options) +or err "getopts() failed: $!."; + +if ($options{$help_opt}) +{ + # Output help message and exit. + print "Usage: $0 [-$infile_opt depfile] [-$help_opt]\n"; + print "\t-$infile_opt - input file with configuration ($default_infile "; + print "file will be used by default)\n"; + print "\t-$help_opt - this help message\n"; + exit 0; +} + +# Input file name. +$infile = $options{$infile_opt} ? $options{$infile_opt} : $default_infile; +$verbose = $options{$verbose_opt} ? 1 : 0; + +print "Debug: -$verbose_opt option found.\n" if $verbose; + +# ============================================================================== +# +# Find and fetch sections from input file +# +# ============================================================================== + +# Opening input file +print "Debug: open \"$infile\" input file.\n" if $verbose; +open (INFILE, '<', $infile) or err "Can't open \"$infile\" file for reading.\n" + . "System error message: $!.\n"; + +# Configuration file markers +my $marker_section = 'SECTION'; +my $marker_section_end = 'SECTION END'; + +# File sections. Hash values are references to arrays with section contents +my %sections; + +# Extract sections from file +for (my $ln = 1; my $l = ; $ln += 1) +{ + # Skip comments and empty lines + next if $l =~ m/^#.*$/ or $l =~ m/^\s*$/; + + # Remove last CR symbol + $l =~ s/^(.*)\n$/$1/, $l =~ s/^(.*)\r$/$1/; + + # Generate error if line isn't section begin marker + err "(input file line $ln) Unexpected marker: \"$l\". ${marker_section} " + . "is expected." + if $l !~ m/^$marker_section(\s+(\S*)\s*)?$/; + + # Generate error if there is no section name + err "(input file line $ln) Section name isn't found" + if !$1 or !$2; + + # Generate error if this is section end marker + err "(input file line $ln) Unexpected \"${marker_section_end}\" marker " + . "in input file." + if $2 eq $marker_section_end; + + my $sect_name = $2; + + # Extract section content + for (; $l = ; $ln += 1) + { + # Skip comments and empty lines + next if $l =~ m/^#.*$/ or $l =~ m/^$/; + # Remove last CR symbol + $l =~ s/^(.*)\n$/$1/, $l =~ s/^(.*)\r$/$1/; + + last if $l =~ m/^$marker_section_end$/; + + push @{$sections{$sect_name}}, $l; + } + + # Generate error if section wasn't ended + err "(input file line $ln) \"No $marker_section_end\" marker found" + if $l !~ m/^$marker_section_end$/; +} + +close INFILE or err "Error while closing input file."; + +# ============================================================================= +# +# Now sections are fetched. Each section is processed by separate function. +# There are only three supported sections now: ENCODINGS, CES_DEPENDENCIES +# and ENCODING_CCS_DEPENDENCIES. +# +# ============================================================================= + +my $section_encodings = 'ENCODINGS'; +my $section_cesdeps = 'CES_DEPENDENCIES'; + +my $section; + +err "$section_encodings not found." +if !defined $sections{$section_encodings}; +err "$section_cesdeps not found." +if !defined $sections{$section_cesdeps}; + +# Process sections +print "Debug: process $section_encodings section.\n" if $verbose; +process_section_encodings ($sections{$section_encodings}); +delete $sections{$section_encodings}; + +print "Debug: process $section_cesdeps section.\n" if $verbose; +process_section_cesdeps ($sections{$section_cesdeps}); +delete $sections{$section_cesdeps}; + +print STDERR "Warning: section \"$_\" was ignored!\n" +foreach (keys %sections); + +exit 0; +} + +# ============================================================================= +# +# Print error message and exit. +# +# Parameter 1: error message. +# +# ============================================================================= +sub err($) +{ + print STDERR "Error while running script.\n$_[0]\n"; + exit 1; +} + + +# ============================================================================= +# +# Process ENCODINGS section. +# +# Parameter 1 (input): array reference with section content; +# +# ============================================================================= +sub process_section_encodings($) +{ + my $sect = $_[0]; + my $lineidx = 0; + my @entry; + my $marker_encoding = 'ENCODING'; + my $marker_ces = 'CES'; + my $marker_ccs = 'CCS'; + my $marker_aliases = 'ALIASES'; + + # Keys: CES names. Values: array reference with encodings list. + my %cesenc; + # Keys: encodings. Values: CES converter names. + my %encces; + # Keys: CCS tables names. Values: array reference with encodings. + my %ccsenc; + # Keys: encodings. Values: aliases list. + my %encalias; + + while (next_entry ($sect, \@entry, \$lineidx)) + { + my $encoding; + my $ces; + my $ccs; + my $aliases; + + foreach my $l (@entry) + { + if ($l =~ m/^($marker_encoding):\s*(\S*)\s*$/) + { + err "(process_section_encodings()) More than one $marker_encoding " + . "records found ($l)" + if defined $encoding; + + $encoding = $2; + } + elsif ($l =~ m/^($marker_ces):\s*(\S*)\s*$/) + { + err "(process_section_encodings()) More than one $marker_ces " + . "records found ($l)" + if defined $ces; + + $ces = $2; + } + elsif ($l =~ m/^($marker_aliases):\s*(.*)\s*$/) + { + err "(process_section_encodings()) More than one " + . "$marker_aliases records found ($l)" + if defined $aliases; + + $aliases = $2; + } + elsif ($l =~ m/^($marker_ccs):\s*(.*)\s*$/) + { + err "(process_section_encodings()) More than one " + . "$marker_ccs records found ($l)" + if defined $ccs; + + $ccs = $2; + } + else + { + err "(process_section_encodings()) Can't parse \"$l\""; + } + } + + err "(process_section_encodings()) $encoding is defined twice" + if (defined $encces{$encoding}); + err "(process_section_encodings()) ENCODING: field isn't found" + if not defined $encoding; + + if (defined $ces) + { + push @{$cesenc{$ces}}, $encoding; + $encces{$encoding} = $ces; + } + + if (defined $ccs) + { + my @ccs = split / /, $ccs; + push @{$ccsenc{$_}}, $encoding foreach (@ccs); + } + $encalias{$encoding} = $aliases; + } + + # Generate cesbi.h header file + generate_cesbi_h (\%cesenc, \%encces); + + # Generate encnames.h header file + generate_encnames_h (keys %encces); + + # Generate aliasesbi.c file + generate_aliasesbi_c (\%encalias); + + # Generate encoding.aliases file + generate_encoding_aliases (\%encalias); + + # Generate ccsbi.h header file + generate_ccsbi_h (\%ccsenc); + + # Generate cesbi.c file + generate_cesbi_c (\%cesenc); + + # Generate ccsbi.c file + my @ccs = sort keys %ccsenc; + generate_ccsbi_c (\@ccs); + + # Generate ccsnames.h header file + generate_ccsnames_h (\%ccsenc); + + # Generate iconv.m4 file + my @encodings = sort keys %encalias; + generate_iconv_m4 (\@encodings); +} + +# ============================================================================== +# +# Process CES_DEPENDENCIES section. +# +# Parameter 1: array reference with section content. +# +# ============================================================================== +sub process_section_cesdeps($) +{ + my $sect = $_[0]; + my $lineidx = 0; + my @entry; + my $marker_ces = 'CES'; + my $marker_used_ces = 'USED_CES'; + my %cesdeps; + + while (next_entry ($sect, \@entry, \$lineidx)) + { + my $ces; + my $used_ces; + + foreach my $l (@entry) + { + if ($l =~ m/^($marker_ces):\s*(\S*)\s*$/) + { + err "(process_section_cesdeps()) More than one $marker_ces " + . "records found ($l)" + if $ces; + + $ces = $2; + } + elsif ($l =~ m/^($marker_used_ces):\s*(.*)\s*$/) + { + err "(process_section_cesdeps()) More than one $marker_used_ces " + . "records found ($l)" + if $used_ces; + + $used_ces = $2; + } + else + { + err "(process_section_cesdeps()) Can't parse \"$l\""; + } + } + + err "(process_section_esdeps()) $ces dependecties are defined twice" + if (defined $cesdeps{$ces}); + + # Split string + my @used_ces = split / /, $used_ces; + + $cesdeps{$ces} = \@used_ces; + } + + # Generate cesdeps.h header file + generate_cesdeps_h (\%cesdeps); +} + +# ============================================================================== +# +# Extract next entry. +# +# Parameter 1 (input): array reference with entries; +# Parameter 2 (output): array reference with entry content; +# Parameter 3 (input/output): scalar reference with line index to process. +# +# Returns 1 is entry was found, 0 if thee is no more entries; +# +# ============================================================================== +sub next_entry($$$) +{ + my $entries = $_[0]; + my $entry = $_[1]; + my $idx = $_[2]; + my $marker_entry = 'ENTRY'; + my $marker_entry_end = 'ENTRY END'; + my $entry_flag = 0; + + return 0 if not defined ${$entries}[${$idx}]; + + undef @{$entry}; + + for (; my $l = ${$entries}[${$idx}++];) + { + # Skip comments and empty lines + next if $l =~ m/^#.*$/ or $l =~ m/^\s*$/; + + if ($l =~ m/^$marker_entry$/) + { + err "(next_entry()) $marker_entry marker appears twice" + if ($entry_flag == 1); + $entry_flag = 1; + $l = ${$entries}[${$idx}++] + } + else + { + # Generate error if line isn't entry begin marker + err "(next_entry()) Unexpected marker: \"$l\". ${marker_entry} " + . "is expected." + if ($entry_flag == 0) + } + + last if $l =~ m/^$marker_entry_end$/; + + push @{$entry}, $l; + } + + return 1; +} + +# ============================================================================== +# +# Generate cesbi.h file. +# +# Parameter 1 (input): hash reference with keys = CES Converters names and +# values = array references with list of supported encodings. +# Parameter 2 (input): hash reference with keys = encodings names and +# values = CES converter names. +# +# ============================================================================== +sub generate_cesbi_h($$) +{ + my %cesenc = %{$_[0]}; + my %encces = %{$_[1]}; + my @ces = sort keys %cesenc; + + print "Debug: create \"cesbi.h\" file.\n" if $verbose; + open (CESBI_H, '>', "cesbi.h") + or err "Can't create \"cesbi.h\" file for writing.\nSystem error message: $!.\n"; + + print CESBI_H "$comment_automatic\n\n"; + print CESBI_H "#ifndef __CESBI_H__\n"; + print CESBI_H "#define __CESBI_H__\n\n"; + print CESBI_H "#include \n"; + print CESBI_H "#include <_ansi.h>\n"; + print CESBI_H "#include \"../lib/encnames.h\"\n"; + print CESBI_H "#include \"../lib/ucsconv.h\"\n\n"; + print CESBI_H "/*\n"; + print CESBI_H " * Enable CES converter if correspondent encoding is requested.\n"; + print CESBI_H " * Defining ${macro_to_ucs_ces}XXX macro or ${macro_from_ucs_ces}XXX\n"; + print CESBI_H " * macro is needed to enable \"XXX encoding -> UCS\" or \"UCS -> XXX encoding\"\n"; + print CESBI_H " * part of UCS-based CES converter.\n"; + print CESBI_H " */\n"; + + foreach my $ces (@ces) + { + my @encs = sort @{$cesenc{$ces}}; + foreach my $encoding (@encs) + { + print CESBI_H $encoding eq $encs[0] ? "#if " : " || "; + print CESBI_H "defined ($macro_from_enc\U$encoding)"; + print CESBI_H " \\" if $encoding ne $encs[$#encs]; + print CESBI_H "\n"; + } + print CESBI_H "# define $macro_to_ucs_ces\U$ces\n"; + print CESBI_H "#endif\n"; + + foreach my $encoding (@encs) + { + print CESBI_H $encoding eq $encs[0] ? "#if " : " || "; + print CESBI_H "defined ($macro_to_enc\U$encoding)"; + print CESBI_H " \\" if $encoding ne $encs[$#encs]; + print CESBI_H "\n"; + } + print CESBI_H "# define $macro_from_ucs_ces\U$ces\n"; + print CESBI_H "#endif\n\n"; + } + + print CESBI_H "/*\n"; + print CESBI_H " * Some encodings require another encodings to be enabled.\n"; + print CESBI_H " * These dependencies are handled in cesdeps.h header file.\n"; + print CESBI_H " */\n"; + print CESBI_H "#include \"cesdeps.h\"\n\n"; + + print CESBI_H "/*\n"; + print CESBI_H " * NLS uses iconv's capabilities and require one of encodings\n"; + print CESBI_H " * to be enabled for internal wchar_t representation.\n"; + print CESBI_H " */\n"; + print CESBI_H "#include \"../lib/iconvnls.h\"\n\n"; + + print CESBI_H "/*\n"; + print CESBI_H " * Forward declarations of CES converter handlers.\n"; + print CESBI_H " * These handlers are actually defined in correspondent CES converter files.\n"; + print CESBI_H " */\n"; + + foreach my $ces (@ces) + { + print CESBI_H "#ifdef $macro_to_ucs_ces\U$ces\n"; + print CESBI_H "extern const iconv_to_ucs_ces_handlers_t\n"; + print CESBI_H "$var_to_ucs_handlers$ces;\n"; + print CESBI_H "#endif\n"; + + print CESBI_H "#ifdef $macro_from_ucs_ces\U$ces\n"; + print CESBI_H "extern const iconv_from_ucs_ces_handlers_t\n"; + print CESBI_H "$var_from_ucs_handlers$ces;\n"; + print CESBI_H "#endif\n\n"; + } + + print CESBI_H "#endif /* !__CESBI_H__ */\n\n"; + close CESBI_H or err "Error while closing cesbi.h file."; +} + +# ============================================================================== +# +# Generate encnames.h header file. +# +# Parameters: array of supported encodings. +# +# ============================================================================== +sub generate_encnames_h(@) +{ + print "Debug: create \"../lib/encnames.h\" file.\n" if $verbose; + open (ENCNAMES_H, '>', "../lib/encnames.h") + or err "Can't create \"../lib/encnames.h\" file for writing.\nSystem error message: $!.\n"; + + print ENCNAMES_H "$comment_automatic\n\n"; + print ENCNAMES_H "#ifndef __ENCNAMES_H__\n"; + print ENCNAMES_H "#define __ENCNAMES_H__\n\n"; + + print ENCNAMES_H "/*\n"; + print ENCNAMES_H " * Encodings name macros.\n"; + print ENCNAMES_H " */\n"; + + foreach my $enc (sort @_) + { + print ENCNAMES_H "#define $macro_enc_name\U$enc\E \"$enc\"\n"; + } + + print ENCNAMES_H "\n#endif /* !__ENCNAMES_H__ */\n\n"; + close ENCNAMES_H or err "Error while closing ../lib/encnames.h file."; +} + +# ============================================================================== +# +# Generate aliasesbi.c C source file. +# +# Parameters: hash reference with keys = encodings and values = aliases string. +# +# ============================================================================== +sub generate_aliasesbi_c($) +{ + print "Debug: create \"../lib/aliasesbi.c\" file.\n" if $verbose; + open (ALIASESBI_C, '>', "../lib/aliasesbi.c") + or err "Can't create \"../lib/aliasesbi.c\" file for writing.\nSystem error message: $!.\n"; + + print ALIASESBI_C "$comment_automatic\n\n"; + print ALIASESBI_C "#include <_ansi.h>\n"; + print ALIASESBI_C "#include \"encnames.h\"\n\n"; + print ALIASESBI_C "const char\n"; + print ALIASESBI_C "$var_aliases\[\] =\n"; + print ALIASESBI_C "{\n"; + + foreach my $enc (sort keys %{$_[0]}) + { + print ALIASESBI_C "#if defined ($macro_from_enc\U$enc) \\\n"; + print ALIASESBI_C " || defined ($macro_to_enc\U$enc)\n"; + print ALIASESBI_C " $macro_enc_name\U$enc\E"; + print ALIASESBI_C " \" ${$_[0]}{$enc}\\n\"" if defined ${$_[0]}{$enc}; + print ALIASESBI_C "\n"; + print ALIASESBI_C "#endif\n"; + } + print ALIASESBI_C " \"\"\n"; + print ALIASESBI_C "};\n"; + + close ALIASESBI_C or err "Error while closing ../lib/aliasesbi.c file."; +} + +# ============================================================================== +# +# Generate encoding.aliases file. +# +# Parameter 1: hash reference with keys = encodings and values = aliases string. +# +# ============================================================================== +sub generate_encoding_aliases($) +{ + print "Debug: create \"../encoding.aliases\" file.\n" if $verbose; + open (ALIASES, '>', "../encoding.aliases") + or err "Can't create \"../encoding.aliases\" file for writing.\nSystem error message: $!.\n"; + + print ALIASES "#\n# This file was automatically generated. Don't edit.\n#\n\n"; + + foreach my $enc (sort keys %{$_[0]}) + { + print ALIASES "$enc"; + print ALIASES " ${$_[0]}{$enc}" if defined ${$_[0]}{$enc}; + print ALIASES "\n"; + } + + print ALIASES "\n"; + + close ALIASES or err "Error while closing ./encoding.aliases file."; +} + +# ============================================================================== +# +# Generate cesdeps.h header file. +# +# Parameter 1: hash reference with keys = CES converters and values = references +# to arrays with list of CES converters which are needed by that CES converter +# (defined by key). +# +# ============================================================================== +sub generate_cesdeps_h($) +{ + my %cesdeps = %{$_[0]}; + + print "Debug: create \"cesdeps.h\" file.\n" if $verbose; + open (CESDEPS_H, '>', "cesdeps.h") + or err "Can't create \"cesdeps.h\" file for writing.\nSystem error message: $!.\n"; + + print CESDEPS_H "$comment_automatic\n\n"; + print CESDEPS_H "#ifndef __CESDEPS_H__\n"; + print CESDEPS_H "#define __CESDEPS_H__\n\n"; + + print CESDEPS_H "/*\n"; + print CESDEPS_H " * Some CES converters use another CES converters and the following\n"; + print CESDEPS_H " * is such dependencies description.\n"; + print CESDEPS_H " */\n"; + + foreach my $ces (sort keys %cesdeps) + { + my @deps = sort @{$cesdeps{$ces}}; + + print CESDEPS_H "#ifdef $macro_to_ucs_ces\U$ces\n"; + + foreach my $dep (@deps) + { + print CESDEPS_H "# ifndef $macro_to_ucs_ces\U$dep\n"; + print CESDEPS_H "# define $macro_to_ucs_ces\U$dep\n"; + print CESDEPS_H "# endif\n"; + } + print CESDEPS_H "#endif\n"; + + print CESDEPS_H "#ifdef $macro_from_ucs_ces\U$ces\n"; + foreach my $dep (@deps) + { + print CESDEPS_H "# ifndef $macro_from_ucs_ces\U$dep\n"; + print CESDEPS_H "# define $macro_from_ucs_ces\U$dep\n"; + print CESDEPS_H "# endif\n"; + } + print CESDEPS_H "#endif\n"; + } + + print CESDEPS_H "\n#endif /* !__CESDEPS_H__ */\n\n"; + close CESDEPS_H or err "Error while closing cesdeps.h file."; +} + +# ============================================================================== +# +# Generate ccsbi.h file. +# +# Parameter 1 (input): hash reference with keys = CCS tables names and +# values = array references with list of encodings which need this CCS table. +# +# ============================================================================== +sub generate_ccsbi_h($) +{ + my %ccsenc = %{$_[0]}; + my @ccs = sort keys %ccsenc; + + print "Debug: create \"../ccs/ccsbi.h\" file.\n" if $verbose; + open (CCSBI_H, '>', "../ccs/ccsbi.h") + or err "Can't create \"../ccs/ccsbi.h\" file for writing.\nSystem error message: $!.\n"; + + print CCSBI_H "$comment_automatic\n\n"; + print CCSBI_H "#ifndef __CCSBI_H__\n"; + print CCSBI_H "#define __CCSBI_H__\n\n"; + print CCSBI_H "#include \n"; + print CCSBI_H "#include <_ansi.h>\n"; + print CCSBI_H "#include \"ccs.h\"\n\n"; + print CCSBI_H "/*\n"; + print CCSBI_H " * Enable CCS tables if encoding needs them.\n"; + print CCSBI_H " * Defining ${macro_to_ucs_ccs}XXX macro or ${macro_from_ucs_ccs}XXX\n"; + print CCSBI_H " * macro is needed to enable \"XXX encoding -> UCS\" or \"UCS -> XXX encoding\"\n"; + print CCSBI_H " * part of CCS table.\n"; + print CCSBI_H " * CCS tables aren't linked if Newlib was configuted to use external CCS tables.\n"; + print CCSBI_H " */\n"; + + print CCSBI_H "#ifndef _ICONV_ENABLE_EXTERNAL_CCS\n\n"; + + foreach my $ccs (@ccs) + { + my @encs = sort @{$ccsenc{$ccs}}; + foreach my $encoding (@encs) + { + print CCSBI_H $encoding eq $encs[0] ? "#if " : " || "; + print CCSBI_H "defined ($macro_from_enc\U$encoding)"; + print CCSBI_H " \\" if $encoding ne $encs[$#encs]; + print CCSBI_H "\n"; + } + print CCSBI_H "# define $macro_to_ucs_ccs\U$ccs\n"; + print CCSBI_H "#endif\n"; + + foreach my $encoding (@encs) + { + print CCSBI_H $encoding eq $encs[0] ? "#if " : " || "; + print CCSBI_H "defined ($macro_to_enc\U$encoding)"; + print CCSBI_H " \\" if $encoding ne $encs[$#encs]; + print CCSBI_H "\n"; + } + print CCSBI_H "# define $macro_from_ucs_ccs\U$ccs\n"; + print CCSBI_H "#endif\n\n"; + } + + print CCSBI_H "/*\n"; + print CCSBI_H " * CCS table description structures forward declarations.\n"; + print CCSBI_H " */\n"; + + foreach my $ccs (@ccs) + { + print CCSBI_H "#if defined ($macro_to_ucs_ccs\U$ccs) \\\n"; + print CCSBI_H " || defined ($macro_from_ucs_ccs\U$ccs)\n"; + print CCSBI_H "extern const iconv_ccs_t\n"; + print CCSBI_H "$var_ccs$ccs;\n"; + print CCSBI_H "#endif\n"; + } + + print CCSBI_H "\n#endif /* !_ICONV_ENABLE_EXTERNAL_CCS */\n\n"; + print CCSBI_H "\n#endif /* __CCSBI_H__ */\n\n"; + close CCSBI_H or err "Error while closing ../ccs/ccsbi.h file."; +} + +# ============================================================================== +# +# Generate cesbi.c file. +# +# Parameter 1 (input): hash reference with keys = CES Converters names and +# values = array references with list of supported encodings. +# +# ============================================================================== +sub generate_cesbi_c($) +{ + my %cesenc = %{$_[0]}; + my @ces = sort keys %cesenc; + + print "Debug: create \"cesbi.c\" file.\n" if $verbose; + open (CESBI_C, '>', "cesbi.c") + or err "Can't create \"cesbi.c\" file for writing.\nSystem error message: $!.\n"; + + print CESBI_C "$comment_automatic\n\n"; + print CESBI_C "#include <_ansi.h>\n"; + print CESBI_C "#include \n"; + print CESBI_C "#include \"../lib/ucsconv.h\"\n"; + print CESBI_C "#include \"cesbi.h\"\n\n"; + print CESBI_C "/*\n"; + print CESBI_C " * Each CES converter provides the list of supported encodings.\n"; + print CESBI_C " */\n"; + + foreach my $ces (@ces) + { + print CESBI_C "#if defined ($macro_to_ucs_ces\U$ces) \\\n"; + print CESBI_C " || defined ($macro_from_ucs_ces\U$ces)\n"; + print CESBI_C "static const char *\n"; + print CESBI_C "$var_ces_names${ces}\[] =\n"; + print CESBI_C "{\n"; + my @encodings = sort @{$cesenc{$ces}}; + foreach my $encoding (@encodings) + { + print CESBI_C "# if defined ($macro_from_enc\U$encoding) \\\n"; + print CESBI_C " || defined ($macro_to_enc\U$encoding)\n"; + print CESBI_C " $macro_enc_name\U$encoding,\n"; + print CESBI_C "#endif\n"; + } + print CESBI_C " NULL\n"; + print CESBI_C "};\n"; + print CESBI_C "#endif\n\n"; + } + + print CESBI_C "/*\n"; + print CESBI_C " * The following structure contains the list of \"to UCS\" linked-in CES converters.\n"; + print CESBI_C " */\n"; + print CESBI_C "const iconv_to_ucs_ces_t\n"; + print CESBI_C "_iconv_to_ucs_ces[] =\n"; + print CESBI_C "{\n"; + + foreach my $ces (@ces) + { + print CESBI_C "#ifdef $macro_to_ucs_ces\U$ces\n"; + print CESBI_C " {(const char **)$var_ces_names$ces,\n"; + print CESBI_C " &$var_to_ucs_handlers$ces},\n"; + print CESBI_C "#endif\n"; + } + print CESBI_C " {(const char **)NULL,\n"; + print CESBI_C " (iconv_to_ucs_ces_handlers_t *)NULL}\n"; + print CESBI_C "};\n\n"; + + print CESBI_C "/*\n"; + print CESBI_C " * The following structure contains the list of \"from UCS\" linked-in CES converters.\n"; + print CESBI_C " */\n"; + print CESBI_C "const iconv_from_ucs_ces_t\n"; + print CESBI_C "_iconv_from_ucs_ces[] =\n"; + print CESBI_C "{\n"; + + foreach my $ces (@ces) + { + print CESBI_C "#ifdef $macro_from_ucs_ces\U$ces\n"; + print CESBI_C " {(const char **)$var_ces_names$ces,\n"; + print CESBI_C " &$var_from_ucs_handlers$ces},\n"; + print CESBI_C "#endif\n"; + } + print CESBI_C " {(const char **)NULL,\n"; + print CESBI_C " (iconv_from_ucs_ces_handlers_t *)NULL}\n"; + print CESBI_C "};\n"; + + close CESBI_C or err "Error while closing cesbi.c file."; +} + +# ============================================================================== +# +# Generate ccsbi.c file. +# +# Parameter 1 (input): array reference with CCS tables names +# +# ============================================================================== +sub generate_ccsbi_c($) +{ + my @ccs = @{$_[0]}; + + print "Debug: create \"../ccs/ccsbi.c\" file.\n" if $verbose; + open (CESBI_C, '>', "../ccs/ccsbi.c") + or err "Can't create \"../ccs/ccsbi.c\" file for writing.\nSystem error message: $!.\n"; + + print CESBI_C "$comment_automatic\n\n"; + print CESBI_C "#include <_ansi.h>\n"; + print CESBI_C "#include \"ccsbi.h\"\n\n"; + print CESBI_C "/*\n"; + print CESBI_C " * The following array contains the list of built-in CCS tables.\n"; + print CESBI_C " */\n"; + + print CESBI_C "const iconv_ccs_t *\n"; + print CESBI_C "_iconv_ccs[] =\n"; + print CESBI_C "{\n"; + + foreach my $ccs (@ccs) + { + print CESBI_C "#if defined ($macro_to_ucs_ccs\U$ccs) \\\n"; + print CESBI_C " || defined ($macro_from_ucs_ccs\U$ccs)\n"; + print CESBI_C " &$var_ccs$ccs,\n"; + print CESBI_C "#endif\n"; + } + print CESBI_C " NULL\n"; + print CESBI_C "};\n"; + + close CESBI_C or err "Error while closing ../ccs/ccsbi.c file."; +} + +# ============================================================================== +# +# Generate ccsnames.h file. +# +# Parameter 1 (input): hash reference with keys = CCS tables names and +# values = array references with list of encodings which need this CCS table. +# +# ============================================================================== +sub generate_ccsnames_h($) +{ + my %ccsenc = %{$_[0]}; + my @ccs = sort keys %ccsenc; + + print "Debug: create \"../ccs/ccsnames.h\" file.\n" if $verbose; + open (CCSNAMES_H, '>', "../ccs/ccsnames.h") + or err "Can't create \"../ccs/ccsnames.h\" file for writing.\nSystem error message: $!.\n"; + + print CCSNAMES_H "$comment_automatic\n\n"; + print CCSNAMES_H "#ifndef __CCSNAMES_H__\n"; + print CCSNAMES_H "#define __CCSNAMES_H__\n\n"; + print CCSNAMES_H "#include \"../lib/encnames.h\"\n\n"; + print CCSNAMES_H "/*\n"; + print CCSNAMES_H " * CCS tables names macros.\n"; + print CCSNAMES_H " */\n"; + + foreach my $ccs (@ccs) + { + my @encs = @{$ccsenc{$ccs}}; + my $flag; + foreach my $encoding (@encs) + { + print CCSNAMES_H "#define $macro_ccs_name\U$ccs "; + if ($encoding eq $ccs) + { + $flag = 1; + print CCSNAMES_H "$macro_enc_name\U$encoding\n"; + last; + } + } + print CCSNAMES_H "\"$ccs\"\n" if !$flag; + } + + print CCSNAMES_H "\n#endif /* !__CCSNAMES_H__ */\n\n"; + close CCSNAMES_H or err "Error while closing ../ccs/ccsnames.h file."; +} + +# ============================================================================== +# +# Generate iconv.m4 file. +# +# Parameter 1 (input): array reference with encoding names +# +# ============================================================================== +sub generate_iconv_m4($) +{ + my @encodings = @{$_[0]}; + + print "Debug: create \"../../../iconv.m4\" file.\n" if $verbose; + open (ICONV_M4, '>', "../../../iconv.m4") + or err "Can't create \"../../../iconv.m4\" file for writing.\nSystem error message: $!.\n"; + + print ICONV_M4 "$comment_automatic\n"; + print ICONV_M4 "AC_DEFUN([NEWLIB_ICONV_DEFINES],[dnl\n"; + foreach my $encoding (@encodings) + { + my $ucencoding = uc $encoding; + + my $tovar = "_ICONV_TO_ENCODING_$ucencoding"; + print ICONV_M4 " if test \"\$$tovar\" = 1; then\n"; + print ICONV_M4 " AC_DEFINE($tovar, 1, [Support $encoding output encoding.])\n"; + print ICONV_M4 " fi\n"; + + my $fromvar = "_ICONV_FROM_ENCODING_$ucencoding"; + print ICONV_M4 " if test \"\$$fromvar\" = 1; then\n"; + print ICONV_M4 " AC_DEFINE($fromvar, 1, [Support $encoding input encoding.])\n"; + print ICONV_M4 " fi\n"; + } + print ICONV_M4 "])\n"; + + close ICONV_M4 or err "Error while closing ../../../iconv.m4 file."; +} diff --git a/lib/iconv/ces/table-pcs.c b/lib/iconv/ces/table-pcs.c new file mode 100644 index 0000000..45cfe62 --- /dev/null +++ b/lib/iconv/ces/table-pcs.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * This CES converter is just an simple extension of table CES converter. + * This CES converter is used for 16 bit CCSes which include 7bit + * Portable Characters Set (PCS) (equivalent to ASCII) (example: BIG5). + */ + +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_TABLE_PCS) \ + || defined (ICONV_FROM_UCS_CES_TABLE_PCS) + +#include <_ansi.h> +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" + +#if defined (ICONV_FROM_UCS_CES_TABLE_PCS) +static size_t +table_pcs_convert_from_ucs (void *data, + ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + if (*outbytesleft < 1) + return (size_t)ICONV_CES_NOSPACE; + + if (in < 0x80) + { + **outbuf = (unsigned char)in; + *outbuf += 1; + *outbytesleft -= 1; + return 1; + } + + return _iconv_from_ucs_ces_handlers_table.convert_from_ucs ( + data, + in, + outbuf, + outbytesleft); +} + +static void * +table_pcs_from_ucs_init (struct _reent *rptr, + const char *encoding) +{ + return _iconv_from_ucs_ces_handlers_table.init (rptr, encoding); +} + +static size_t +table_pcs_from_ucs_close (struct _reent *rptr, + void *data) +{ + return _iconv_from_ucs_ces_handlers_table.close (rptr, data); +} + +static int +table_pcs_from_ucs_get_mb_cur_max (void *data) +{ + return _iconv_from_ucs_ces_handlers_table.get_mb_cur_max (data); +} + +#endif /* ICONV_FROM_UCS_CES_TABLE_PCS */ + +#if defined (ICONV_TO_UCS_CES_TABLE_PCS) +static ucs4_t +table_pcs_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + if (*inbytesleft < 1) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (**inbuf < 0x80) + { + *inbytesleft -= 1; + *inbuf += 1; + return (ucs4_t)(*(*inbuf - 1)); + } + + return _iconv_to_ucs_ces_handlers_table.convert_to_ucs ( + data, + inbuf, + inbytesleft); +} + +static void * +table_pcs_to_ucs_init (struct _reent *rptr, + const char *encoding) +{ + return _iconv_to_ucs_ces_handlers_table.init (rptr, encoding); +} + +static size_t +table_pcs_to_ucs_close (struct _reent *rptr, + void *data) +{ + return _iconv_to_ucs_ces_handlers_table.close (rptr, data); +} + +static int +table_pcs_to_ucs_get_mb_cur_max (void *data) +{ + return _iconv_to_ucs_ces_handlers_table.get_mb_cur_max (data); +} + +#endif /* ICONV_TO_UCS_CES_TABLE_PCS */ + +#if defined (ICONV_FROM_UCS_CES_TABLE_PCS) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_table_pcs = +{ + table_pcs_from_ucs_init, + table_pcs_from_ucs_close, + table_pcs_from_ucs_get_mb_cur_max, + NULL, + NULL, + NULL, + table_pcs_convert_from_ucs +}; +#endif + +#if defined (ICONV_TO_UCS_CES_TABLE_PCS) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_table_pcs = +{ + table_pcs_to_ucs_init, + table_pcs_to_ucs_close, + table_pcs_to_ucs_get_mb_cur_max, + NULL, + NULL, + NULL, + table_pcs_convert_to_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_TABLE_PCS || ICONV_FROM_UCS_CES_TABLE_PCS */ + diff --git a/lib/iconv/ces/table.c b/lib/iconv/ces/table.c new file mode 100644 index 0000000..c8ef218 --- /dev/null +++ b/lib/iconv/ces/table.c @@ -0,0 +1,584 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_TABLE) \ + || defined (ICONV_FROM_UCS_CES_TABLE) + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include "../lib/endian.h" +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../ccs/ccs.h" + +/* + * Table-based CES converter is implemented here. Table-based CES converter + * deals with encodings with "null" CES, like KOI8-R. In this case it is + * possible to implement one generic algorithm which works with different + * CCS tables. + * + * Table-based CES converter deals with CCS tables placed into iconv/ccs + * subdirectory. First, converter tries to find needed CCS table among + * linked-in tables. If not found, it tries to load it from external file + * (only if corespondent capability was enabled in Newlib configuration). + * + * 16 bit encodings are assumed to be Big Endian. + */ + +static ucs2_t +find_code_size (ucs2_t code, const __uint16_t *tblp); + +static __inline ucs2_t +find_code_speed (ucs2_t code, const __uint16_t *tblp); + +static __inline ucs2_t +find_code_speed_8bit (ucs2_t code, const unsigned char *tblp); + +#ifdef _ICONV_ENABLE_EXTERNAL_CCS +static const iconv_ccs_desc_t * +load_file (struct _reent *rptr, const char *name, int direction); +#endif + +/* + * Interface data and functions implementation. + */ +static size_t +table_close (struct _reent *rptr, + void *data) +{ + const iconv_ccs_desc_t *ccsp = (iconv_ccs_desc_t *)data; + + if (ccsp->type == TABLE_EXTERNAL) + _free_r (rptr, (void *)ccsp->tbl); + + _free_r( rptr, (void *)ccsp); + return 0; +} + +#if defined (ICONV_FROM_UCS_CES_TABLE) +static void * +table_init_from_ucs (struct _reent *rptr, + const char *encoding) +{ + int i; + const iconv_ccs_t *biccsp = NULL; + iconv_ccs_desc_t *ccsp; + + for (i = 0; _iconv_ccs[i] != NULL; i++) + if (strcmp (_iconv_ccs[i]->name, encoding) == 0) + { + biccsp = _iconv_ccs[i]; + break; + } + + if (biccsp != NULL) + { + if (biccsp->from_ucs == NULL + || (ccsp = (iconv_ccs_desc_t *) + _malloc_r (rptr, sizeof (iconv_ccs_desc_t))) == NULL) + return NULL; + + ccsp->type = TABLE_BUILTIN; + ccsp->bits = biccsp->bits; + ccsp->optimization = biccsp->from_ucs_type; + ccsp->tbl = biccsp->from_ucs; + + return (void *)ccsp; + } + +#ifdef _ICONV_ENABLE_EXTERNAL_CCS + return (void *)load_file (rptr, encoding, 1); +#else + return NULL; +#endif +} + +static size_t +table_convert_from_ucs (void *data, + ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + const iconv_ccs_desc_t *ccsp = (iconv_ccs_desc_t *)data; + ucs2_t code; + + if (in > 0xFFFF || in == INVALC) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (ccsp->bits == TABLE_8BIT) + { + code = find_code_speed_8bit ((ucs2_t)in, + (const unsigned char *)ccsp->tbl); + if (code == INVALC) + return (size_t)ICONV_CES_INVALID_CHARACTER; + **outbuf = (unsigned char)code; + *outbuf += 1; + *outbytesleft -= 1; + return 1; + } + else if (ccsp->optimization == TABLE_SPEED_OPTIMIZED) + code = find_code_speed ((ucs2_t)in, ccsp->tbl); + else + code = find_code_size ((ucs2_t)in, ccsp->tbl); + + if (code == INVALC) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (*outbytesleft < 2) + return (size_t)ICONV_CES_NOSPACE; + + /* We can't store whole word since **outbuf may be not 2-byte aligned */ + **outbuf = (unsigned char)((ucs2_t)code >> 8); + *(*outbuf + 1) = (unsigned char)code; + *outbuf += 2; + *outbytesleft -= 2; + return 2; +} +#endif /* ICONV_FROM_UCS_CES_TABLE */ + +#if defined (ICONV_TO_UCS_CES_TABLE) +static void * +table_init_to_ucs (struct _reent *rptr, + const char *encoding) +{ + int i; + const iconv_ccs_t *biccsp = NULL; + iconv_ccs_desc_t *ccsp; + + for (i = 0; _iconv_ccs[i] != NULL; i++) + if (strcmp (_iconv_ccs[i]->name, encoding) == 0) + { + biccsp = _iconv_ccs[i]; + break; + } + + if (biccsp != NULL) + { + if (biccsp->to_ucs == NULL + || (ccsp = (iconv_ccs_desc_t *) + _malloc_r (rptr, sizeof (iconv_ccs_desc_t))) == NULL) + return NULL; + + ccsp->type = TABLE_BUILTIN; + ccsp->bits = biccsp->bits; + ccsp->optimization = biccsp->to_ucs_type; + ccsp->tbl = biccsp->to_ucs; + + return (void *)ccsp; + } + +#ifdef _ICONV_ENABLE_EXTERNAL_CCS + return (void *)load_file (rptr, encoding, 0); +#else + return NULL; +#endif +} + +static ucs4_t +table_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + const iconv_ccs_desc_t *ccsp = (iconv_ccs_desc_t *)data; + ucs2_t ucs; + + if (ccsp->bits == TABLE_8BIT) + { + if (*inbytesleft < 1) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + ucs = (ucs2_t)ccsp->tbl[**inbuf]; + + if (ucs == INVALC) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbytesleft -= 1; + *inbuf += 1; + return (ucs4_t)ucs; + } + + if (*inbytesleft < 2) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (ccsp->optimization == TABLE_SIZE_OPTIMIZED) + ucs = find_code_size((ucs2_t)**inbuf << 8 | (ucs2_t)*(*inbuf + 1), + ccsp->tbl); + else + ucs = find_code_speed((ucs2_t)**inbuf << 8 | (ucs2_t)*(*inbuf + 1), + ccsp->tbl); + + if (ucs == INVALC) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbuf += 2; + *inbytesleft -= 2; + return (ucs4_t)ucs; +} +#endif /* ICONV_TO_UCS_CES_TABLE */ + +static int +table_get_mb_cur_max (void *data) +{ + return ((iconv_ccs_desc_t *)data)->bits/8; +} + + +#if defined (ICONV_TO_UCS_CES_TABLE) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_table = +{ + table_init_to_ucs, + table_close, + table_get_mb_cur_max, + NULL, + NULL, + NULL, + table_convert_to_ucs +}; +#endif /* ICONV_FROM_UCS_CES_TABLE */ + +#if defined (ICONV_FROM_UCS_CES_TABLE) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_table = +{ + table_init_from_ucs, + table_close, + table_get_mb_cur_max, + NULL, + NULL, + NULL, + table_convert_from_ucs +}; +#endif /* ICONV_TO_UCS_CES_TABLE */ + +/* + * Supplementary functions. + */ + +/* + * find_code_speed - find code in 16 bit speed-optimized table. + * + * PARAMETERS: + * ucs2_t code - code whose mapping to find. + * const __uint16_t *tblp - table pointer. + * + * RETURN: + * Code that corresponds to 'code'. + */ +static __inline ucs2_t +find_code_speed (ucs2_t code, + const __uint16_t *tblp) +{ + int idx = tblp[code >> 8]; + + if (idx == INVBLK) + return (ucs2_t)INVALC; + + return (ucs2_t)tblp[(code & 0x00FF) + idx]; +} + +/* + * find_code_speed_8bit - find code in 8 bit speed-optimized table. + * + * PARAMETERS: + * ucs2_t code - code whose mapping to find. + * const __uint16_t *tblp - table pointer. + * + * RETURN: + * Code that corresponds to 'code'. + */ +static __inline ucs2_t +find_code_speed_8bit (ucs2_t code, + const unsigned char *tblp) +{ + int idx; + unsigned char ccs; + + if (code == ((ucs2_t *)tblp)[0]) + return (ucs2_t)0xFF; + + idx = ((ucs2_t *)tblp)[1 + (code >> 8)]; + + if (idx == INVBLK) + return (ucs2_t)INVALC; + + ccs = tblp[(code & 0x00FF) + idx]; + + return ccs == 0xFF ? (ucs2_t)INVALC : (ucs2_t)ccs; +} + +/* Left range boundary */ +#define RANGE_LEFT(n) (tblp[FIRST_RANGE_INDEX + (n)*3 + 0]) +/* Right range boundary */ +#define RANGE_RIGHT(n) (tblp[FIRST_RANGE_INDEX + (n)*3 + 1]) +/* Range offset */ +#define RANGE_INDEX(n) (tblp[FIRST_RANGE_INDEX + (n)*3 + 2]) +/* Un-ranged offset */ +#define UNRANGED_INDEX(n) (tblp[FIRST_UNRANGED_INDEX_INDEX] + (n)*2) + +/* + * find_code_size - find code in 16 bit size-optimized table. + * + * PARAMETERS: + * ucs2_t code - code whose mapping to find. + * const __uint16_t *tblp - table pointer. + * + * RETURN: + * Code that corresponds to 'code'. + */ +static ucs2_t +find_code_size (ucs2_t code, + const __uint16_t *tblp) +{ + int first, last, cur, center; + + if (tblp[RANGES_NUM_INDEX] > 0) + { + first = 0; + last = tblp[RANGES_NUM_INDEX] - 1; + + do + { + center = (last - first)/2; + cur = center + first; + + if (code > RANGE_RIGHT (cur)) + first = cur; + else if (code < RANGE_LEFT (cur)) + last = cur; + else + return (ucs2_t)tblp[RANGE_INDEX (cur) + code - RANGE_LEFT (cur)]; + } while (center > 0); + + if (last - first == 1) + { + if (code >= RANGE_LEFT (first) && code <= RANGE_RIGHT (first)) + return (ucs2_t)tblp[RANGE_INDEX (first) + + code - RANGE_LEFT (first)]; + if (code >= RANGE_LEFT (last) && code <= RANGE_RIGHT (last)) + return (ucs2_t)tblp[RANGE_INDEX (last) + + code - RANGE_LEFT (last)]; + } + } + + if (tblp[UNRANGED_NUM_INDEX] > 0) + { + first = 0; + last = tblp[UNRANGED_NUM_INDEX] - 1; + + do + { + int c; + + center = (last - first)/2; + cur = center + first; + c = tblp[UNRANGED_INDEX (cur)]; + + if (code > c) + first = cur; + else if (code < c) + last = cur; + else + return (ucs2_t)tblp[UNRANGED_INDEX (cur) + 1]; + } while (center > 0); + + if (last - first == 1) + { + if (code == tblp[UNRANGED_INDEX (first)]) + return (ucs2_t)tblp[UNRANGED_INDEX (first) + 1]; + if (code == tblp[UNRANGED_INDEX (last)]) + return (ucs2_t)tblp[UNRANGED_INDEX (last) + 1]; + } + } + + return (ucs2_t)INVALC; +} + +#ifdef _ICONV_ENABLE_EXTERNAL_CCS + +#define _16BIT_ELT(offset) \ + ICONV_BETOHS(*((__uint16_t *)(buf + (offset)))) +#define _32BIT_ELT(offset) \ + ICONV_BETOHL(*((__uint32_t *)(buf + (offset)))) + +/* + * load_file - load conversion table from external file and initialize + * iconv_ccs_desc_t object. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process. + * const char *name - encoding name. + * int direction - conversion direction. + * + * DESCRIPTION: + * Loads conversion table of appropriate endianess from external file + * and initializes 'iconv_ccs_desc_t' table description structure. + * If 'direction' is 0 - load "To UCS" table, else load "From UCS" + * table. + * + * RETURN: + * iconv_ccs_desc_t * pointer is success, NULL if failure. + */ +static const iconv_ccs_desc_t * +load_file (struct _reent *rptr, + const char *name, + int direction) +{ + int fd; + const unsigned char *buf; + int tbllen, hdrlen; + off_t off; + const char *fname; + iconv_ccs_desc_t *ccsp = NULL; + int nmlen = strlen(name); + /* Since CCS table name length can vary - it is aligned (by adding extra + * bytes to it's end) to 4-byte boundary. */ + int alignment = nmlen & 3 ? 4 - (nmlen & 3) : 0; + + nmlen = strlen(name); + + hdrlen = nmlen + EXTTABLE_HEADER_LEN + alignment; + + if ((fname = _iconv_nls_construct_filename (rptr, name, ICONV_SUBDIR, + ICONV_DATA_EXT)) == NULL) + return NULL; + + if ((fd = _open_r (rptr, fname, O_RDONLY, S_IRUSR)) == -1) + goto error1; + + if ((buf = (const unsigned char *)_malloc_r (rptr, hdrlen)) == NULL) + goto error2; + + if (_read_r (rptr, fd, (void *)buf, hdrlen) != hdrlen) + goto error3; + + if (_16BIT_ELT (EXTTABLE_VERSION_OFF) != TABLE_VERSION_1 + || _32BIT_ELT (EXTTABLE_CCSNAME_LEN_OFF) != nmlen + || strncmp (buf + EXTTABLE_CCSNAME_OFF, name, nmlen) != 0) + goto error3; /* Bad file */ + + if ((ccsp = (iconv_ccs_desc_t *) + _calloc_r (rptr, 1, sizeof (iconv_ccs_desc_t))) == NULL) + goto error3; + + ccsp->bits = _16BIT_ELT (EXTTABLE_BITS_OFF); + ccsp->type = TABLE_EXTERNAL; + + /* Add 4-byte alignment to name length */ + nmlen += alignment; + + if (ccsp->bits == TABLE_8BIT) + { + if (direction == 0) /* Load "To UCS" table */ + { + off = (off_t)_32BIT_ELT (nmlen + EXTTABLE_TO_SPEED_OFF); + tbllen = _32BIT_ELT (nmlen + EXTTABLE_TO_SPEED_LEN_OFF); + } + else /* Load "From UCS" table */ + { + off = (off_t)_32BIT_ELT (nmlen + EXTTABLE_FROM_SPEED_OFF); + tbllen = _32BIT_ELT (nmlen + EXTTABLE_FROM_SPEED_LEN_OFF); + } + } + else if (ccsp->bits == TABLE_16BIT) + { + if (direction == 0) /* Load "To UCS" table */ + { +#ifdef TABLE_USE_SIZE_OPTIMIZATION + off = (off_t)_32BIT_ELT (nmlen + EXTTABLE_TO_SIZE_OFF); + tbllen = _32BIT_ELT (nmlen + EXTTABLE_TO_SIZE_LEN_OFF); +#else + off = (off_t)_32BIT_ELT (nmlen + EXTTABLE_TO_SPEED_OFF); + tbllen = _32BIT_ELT (nmlen + EXTTABLE_TO_SPEED_LEN_OFF); +#endif + } + else /* Load "From UCS" table */ + { +#ifdef TABLE_USE_SIZE_OPTIMIZATION + off = (off_t)_32BIT_ELT (nmlen + EXTTABLE_FROM_SIZE_OFF); + tbllen = _32BIT_ELT (nmlen + EXTTABLE_FROM_SIZE_LEN_OFF); +#else + off = (off_t)_32BIT_ELT (nmlen + EXTTABLE_FROM_SPEED_OFF); + tbllen = _32BIT_ELT (nmlen + EXTTABLE_FROM_SPEED_LEN_OFF); +#endif + } +#ifdef TABLE_USE_SIZE_OPTIMIZATION + ccsp->optimization = TABLE_SIZE_OPTIMIZED; +#else + ccsp->optimization = TABLE_SPEED_OPTIMIZED; +#endif + } + else + goto error4; /* Bad file */ + + if (off == EXTTABLE_NO_TABLE) + goto error4; /* No correspondent table in file */ + + if ((ccsp->tbl = (ucs2_t *)_malloc_r (rptr, tbllen)) == NULL) + goto error4; + + if (_lseek_r (rptr, fd, off, SEEK_SET) == (off_t)-1 + || _read_r (rptr, fd, (void *)ccsp->tbl, tbllen) != tbllen) + goto error5; + + goto normal_exit; + +error5: + _free_r (rptr, (void *)ccsp->tbl); + ccsp->tbl = NULL; +error4: + _free_r (rptr, (void *)ccsp); + ccsp = NULL; +error3: +normal_exit: + _free_r (rptr, (void *)buf); +error2: + if (_close_r (rptr, fd) == -1) + { + if (ccsp != NULL) + { + if (ccsp->tbl != NULL) + _free_r (rptr, (void *)ccsp->tbl); + _free_r (rptr, (void *)ccsp); + } + ccsp = NULL; + } +error1: + _free_r (rptr, (void *)fname); + return ccsp; +} +#endif + +#endif /* ICONV_TO_UCS_CES_TABLE || ICONV_FROM_UCS_CES_TABLE */ + diff --git a/lib/iconv/ces/ucs-2-internal.c b/lib/iconv/ces/ucs-2-internal.c new file mode 100644 index 0000000..3473444 --- /dev/null +++ b/lib/iconv/ces/ucs-2-internal.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_UCS_2_INTERNAL) \ + || defined (ICONV_FROM_UCS_CES_UCS_2_INTERNAL) + +#include <_ansi.h> +#include +#include +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../lib/endian.h" + +/* + * Internal 2-byte representation of UCS-2 codes without restrictions and + * without BOM support. + */ + +#if defined (ICONV_FROM_UCS_CES_UCS_2_INTERNAL) +static size_t +ucs_2_internal_convert_from_ucs (void *data, + register ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + if (in > 0x0000FFFF) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (*outbytesleft < sizeof (ucs2_t)) + return (size_t)ICONV_CES_NOSPACE; + + *((ucs2_t *)(*outbuf)) = (ucs2_t)in; + *outbuf += sizeof (ucs2_t); + *outbytesleft -= sizeof (ucs2_t); + + return sizeof (ucs2_t); +} +#endif /* ICONV_FROM_UCS_CES_UCS_2_INTERNAL */ + +#if defined (ICONV_TO_UCS_CES_UCS_2_INTERNAL) +static ucs4_t +ucs_2_internal_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + register ucs4_t res; + + if (*inbytesleft < sizeof (ucs2_t)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + res = (ucs4_t)*((ucs2_t *)(*inbuf)); + + if (res > 0x0000FFFF) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbuf += sizeof (ucs2_t); + *inbytesleft -= sizeof (ucs2_t); + + return res; +} +#endif /* ICONV_TO_UCS_CES_UCS_2_INTERNAL */ + +static int +ucs_2_internal_get_mb_cur_max (void *data) +{ + return 2; +} + +#if defined (ICONV_TO_UCS_CES_UCS_2_INTERNAL) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_2_internal = +{ + NULL, + NULL, + ucs_2_internal_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_2_internal_convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_UCS_2_INTERNAL) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_2_internal = +{ + NULL, + NULL, + ucs_2_internal_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_2_internal_convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_UCS_2_INTERNAL || ICONV_FROM_UCS_CES_UCS_2_INTERNAL */ + diff --git a/lib/iconv/ces/ucs-2.c b/lib/iconv/ces/ucs-2.c new file mode 100644 index 0000000..5e965b0 --- /dev/null +++ b/lib/iconv/ces/ucs-2.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_UCS_2) \ + || defined (ICONV_FROM_UCS_CES_UCS_2) + +#include <_ansi.h> +#include +#include +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../lib/endian.h" + +/* + * BOM isn't supported. UCS-2 is Big Endian. Bad codes are rejected. + * Bad codes: 0xFFFF, 0xFFFE, 0xD800-0xDFFF. + */ + +#define UCS_2_BIG_ENDIAN 0 +#define UCS_2_LITTLE_ENDIAN 1 + +#define UCS_2 "ucs_2" +#define UCS_2BE "ucs_2be" +#define UCS_2LE "ucs_2le" + +static void * +ucs_2_init (struct _reent *rptr, + const char *encoding) +{ + int *data; + + if ((data = (int *) _malloc_r(rptr, sizeof (int))) == NULL) + return (void *)NULL; + + if (strcmp (encoding, UCS_2LE) == 0) + *data = UCS_2_LITTLE_ENDIAN; + else + *data = UCS_2_BIG_ENDIAN; + + return (void *)data; +} + +static size_t +ucs_2_close (struct _reent *rptr, + void *data) +{ + _free_r (rptr, data); + return 0; +} + +#if defined (ICONV_FROM_UCS_CES_UCS_2) +static size_t +ucs_2_convert_from_ucs (void *data, + ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + if ((in >= 0x0000D800 && in <= 0x0000DFFF) /* Surrogate character */ + || in >= 0x0000FFFE) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (*outbytesleft < sizeof (ucs2_t)) + return (size_t)ICONV_CES_NOSPACE; + + if (*((int *)data) == UCS_2_BIG_ENDIAN) + *((ucs2_t *)(*outbuf)) = ICONV_HTOBES ((ucs2_t)in); + else + *((ucs2_t *)(*outbuf)) = ICONV_HTOLES ((ucs2_t)in); + + *outbuf += sizeof (ucs2_t); + *outbytesleft -= sizeof (ucs2_t); + + return sizeof (ucs2_t); +} +#endif /* ICONV_FROM_UCS_CES_UCS_2 */ + +#if defined (ICONV_TO_UCS_CES_UCS_2) +static ucs4_t +ucs_2_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + ucs4_t res; + + if (*inbytesleft < sizeof (ucs2_t)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (*((int *)data) == UCS_2_BIG_ENDIAN) + res = (ucs4_t)ICONV_BETOHS (*((ucs2_t *)(*inbuf))); + else + res = (ucs4_t)ICONV_LETOHS (*((ucs2_t *)(*inbuf))); + + if ((res >= 0x0000D800 && res <= 0x0000DFFF) /* Surrogate character */ + || res >= 0x0000FFFE) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbytesleft -= sizeof (ucs2_t); + *inbuf += sizeof (ucs2_t); + + return res; +} +#endif /* ICONV_TO_UCS_CES_UCS_2 */ + +static int +ucs_2_get_mb_cur_max (void *data) +{ + return 2; +} + +#if defined (ICONV_TO_UCS_CES_UCS_2) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_2 = +{ + ucs_2_init, + ucs_2_close, + ucs_2_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_2_convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_UCS_2) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_2 = +{ + ucs_2_init, + ucs_2_close, + ucs_2_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_2_convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_UCS_2 || ICONV_FROM_UCS_CES_UCS_2 */ + diff --git a/lib/iconv/ces/ucs-4-internal.c b/lib/iconv/ces/ucs-4-internal.c new file mode 100644 index 0000000..d10952c --- /dev/null +++ b/lib/iconv/ces/ucs-4-internal.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_UCS_4_INTERNAL) \ + || defined (ICONV_FROM_UCS_CES_UCS_4_INTERNAL) + +#include <_ansi.h> +#include +#include +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../lib/endian.h" + +/* + * Internal 4-byte representation of UCS-2 codes without restrictions and + * without BOM support. + */ + +#if defined (ICONV_FROM_UCS_CES_UCS_4_INTERNAL) +static size_t +ucs_4_internal_convert_from_ucs (void *data, + register ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + if (in > 0x7FFFFFFF) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (*outbytesleft < sizeof (ucs4_t)) + return (size_t)ICONV_CES_NOSPACE; + + *((ucs4_t *)(*outbuf)) = in; + *outbytesleft -= sizeof (ucs4_t); + *outbuf += sizeof (ucs4_t); + + return sizeof (ucs4_t); +} +#endif /* ICONV_FROM_UCS_CES_UCS_4_INTERNAL */ + +#if defined (ICONV_TO_UCS_CES_UCS_4_INTERNAL) +static ucs4_t +ucs_4_internal_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + register ucs4_t res; + + if (*inbytesleft < sizeof (ucs4_t)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + res = *((ucs4_t *)(*inbuf)); + + if (res > 0x7FFFFFFF) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbytesleft -= sizeof (ucs4_t); + *inbuf += sizeof (ucs4_t); + + return res; +} +#endif /* ICONV_TO_UCS_CES_UCS_4_INTERNAL */ + +static int +ucs_4_internal_get_mb_cur_max (void *data) +{ + return 2; +} + +#if defined (ICONV_TO_UCS_CES_UCS_4_INTERNAL) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_4_internal = +{ + NULL, + NULL, + ucs_4_internal_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_4_internal_convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_UCS_4_INTERNAL) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_4_internal = +{ + NULL, + NULL, + ucs_4_internal_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_4_internal_convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_UCS_4_INTERNAL || ICONV_FROM_UCS_CES_UCS_4_INTERNAL */ + diff --git a/lib/iconv/ces/ucs-4.c b/lib/iconv/ces/ucs-4.c new file mode 100644 index 0000000..290cc71 --- /dev/null +++ b/lib/iconv/ces/ucs-4.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_UCS_4) \ + || defined (ICONV_FROM_UCS_CES_UCS_4) + +#include <_ansi.h> +#include +#include +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../lib/endian.h" + +/* + * BOM isn't supported. UCS-4 is Big Endian. Bad codes are rejected. + * Bad codes: 0x0000FFFF, 0x0000FFFE, 0x0000D800-0x0000DFFF, + * 0x7FFFFFFF-0xFFFFFFFF. + */ + +#define UCS_4_BIG_ENDIAN 0 +#define UCS_4_LITTLE_ENDIAN 1 + +#define UCS_4 "ucs_4" +#define UCS_4BE "ucs_4be" +#define UCS_4LE "ucs_4le" + +static void * +ucs_4_init (struct _reent *rptr, + const char *encoding) +{ + int *data; + + if ((data = (int *)_malloc_r (rptr, sizeof(int))) == NULL) + return (void *)NULL; + + if (strcmp (encoding, UCS_4LE) == 0) + *data = UCS_4_LITTLE_ENDIAN; + else + *data = UCS_4_BIG_ENDIAN; + + return (void *)data; +} + +static size_t +ucs_4_close (struct _reent *rptr, + void *data) +{ + _free_r(rptr, data); + return 0; +} + + +#if defined (ICONV_FROM_UCS_CES_UCS_4) +static size_t +ucs_4_convert_from_ucs (void *data, + ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + if ((in >= 0x0000D800 && in <= 0x0000DFFF) /* Surrogate character */ + || in > 0x7FFFFFFF || in == 0x0000FFFF || in == 0x0000FFFE) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (*outbytesleft < sizeof (ucs4_t)) + return (size_t)ICONV_CES_NOSPACE; + + if (*((int *)data) == UCS_4_BIG_ENDIAN) + *((ucs4_t *)(*outbuf)) = ICONV_HTOBEL (in); + else + *((ucs4_t *)(*outbuf)) = ICONV_HTOLEL (in); + + *outbuf += sizeof (ucs4_t); + *outbytesleft -= sizeof (ucs4_t); + + return sizeof (ucs4_t); +} +#endif /* ICONV_FROM_UCS_CES_UCS_4 */ + +#if defined (ICONV_TO_UCS_CES_UCS_4) +static ucs4_t +ucs_4_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + ucs4_t res; + + if (*inbytesleft < sizeof (ucs4_t)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (*((int *)data) == UCS_4_BIG_ENDIAN) + res = ICONV_BETOHL (*((ucs4_t *)(*inbuf))); + else + res = ICONV_LETOHL (*((ucs4_t *)(*inbuf))); + + if ((res >= 0x0000D800 && res <= 0x0000DFFF) /* Surrogate character */ + || res > 0x7FFFFFFF || res == 0x0000FFFF || res == 0x0000FFFE) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbytesleft -= sizeof (ucs4_t); + *inbuf += sizeof(ucs4_t); + + return res; +} +#endif /* ICONV_TO_UCS_CES_UCS_4 */ + +static int +ucs_4_get_mb_cur_max (void *data) +{ + return 4; +} + +#if defined (ICONV_TO_UCS_CES_UCS_4) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_ucs_4 = +{ + ucs_4_init, + ucs_4_close, + ucs_4_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_4_convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_UCS_4) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_ucs_4 = +{ + ucs_4_init, + ucs_4_close, + ucs_4_get_mb_cur_max, + NULL, + NULL, + NULL, + ucs_4_convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_UCS_4 || ICONV_FROM_UCS_CES_UCS_4 */ + diff --git a/lib/iconv/ces/us-ascii.c b/lib/iconv/ces/us-ascii.c new file mode 100644 index 0000000..1646791 --- /dev/null +++ b/lib/iconv/ces/us-ascii.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_US_ASCII) \ + || defined (ICONV_FROM_UCS_CES_US_ASCII) + +#include <_ansi.h> +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" + +/* + * For optimization purposes us_ascii is implemented as separate CES converter. + * Another possible way is to add us_ascii CCS and use table-based CES converter. + */ + +#if defined (ICONV_FROM_UCS_CES_US_ASCII) +static size_t +us_ascii_convert_from_ucs (void *data, + ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + if (in > 0x7F) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + *((char *)(*outbuf)) = (char)in; + + *outbuf += 1; + *outbytesleft -= 1; + + return 1; +} +#endif /* ICONV_FROM_UCS_CES_US_ASCII */ + +#if defined (ICONV_TO_UCS_CES_US_ASCII) +static ucs4_t +us_ascii_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + ucs4_t res; + + if (*inbytesleft < 1) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + res = (ucs4_t)**inbuf; + + if (res > 0x7F) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbytesleft -= 1; + *inbuf += 1; + + return res; +} +#endif /* ICONV_TO_UCS_CES_US_ASCII */ + +static int +us_ascii_get_mb_cur_max (void *data) +{ + return 2; +} + +#if defined (ICONV_TO_UCS_CES_US_ASCII) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_us_ascii = +{ + NULL, + NULL, + us_ascii_get_mb_cur_max, + NULL, + NULL, + NULL, + us_ascii_convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_US_ASCII) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_us_ascii = +{ + NULL, + NULL, + us_ascii_get_mb_cur_max, + NULL, + NULL, + NULL, + us_ascii_convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_US_ASCII || ICONV_FROM_UCS_CES_US_ASCII */ + diff --git a/lib/iconv/ces/utf-16.c b/lib/iconv/ces/utf-16.c new file mode 100644 index 0000000..a3491bb --- /dev/null +++ b/lib/iconv/ces/utf-16.c @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_UTF_16) \ + || defined (ICONV_FROM_UCS_CES_UTF_16) + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" +#include "../lib/endian.h" + +/* + * On input UTF-16 converter interpret BOM and uses Big Endian byte order if BOM + * is absent. UTF-16 converter outputs in System Endian and adds correspondent + * BOM as first code. UTF-16LE and UTF-16BE converters ignore BOM on input and + * don't output BOM. + */ + +#define UTF16_UNDEFINED 0x00 +#define UTF16_BIG_ENDIAN 0x01 +#define UTF16_LITTLE_ENDIAN 0x02 +#define UTF16_SYSTEM_ENDIAN 0x04 +#define UTF16_BOM_WRITTEN 0x08 + +#define UTF16_BOM 0xFEFF + +#define UTF_16 "utf_16" +#define UTF_16BE "utf_16be" +#define UTF_16LE "utf_16le" + +static size_t +utf_16_close (struct _reent *rptr, + void *data) +{ + _free_r(rptr, data); + return 0; +} + +#if defined (ICONV_FROM_UCS_CES_UTF_16) +static void * +utf_16_init_from_ucs (struct _reent *rptr, + const char *encoding) +{ + int *data; + + if ((data = (int *)_malloc_r (rptr, sizeof (int))) == NULL) + return (void *)NULL; + + if (strcmp (encoding, UTF_16LE) == 0) + *data = UTF16_LITTLE_ENDIAN; + else if (strcmp (encoding, UTF_16BE) == 0) + *data = UTF16_BIG_ENDIAN; + else + *data = UTF16_SYSTEM_ENDIAN; + + return (void *)data; +} + +static size_t +utf_16_convert_from_ucs (void *data, + register ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + register ucs2_t *cp; + register size_t bytes; + register int *state; + + if (in > 0x0010FFFF || (in >= 0x0000D800 && in <= 0x0000DFFF) + || in == 0x0000FFFF || in == 0x0000FFFE) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + state = (int *)data; + bytes = (*state == UTF16_SYSTEM_ENDIAN) ? sizeof (ucs2_t) * 2 + : sizeof (ucs2_t); + + if (in > 0x0000FFFF) + bytes += sizeof (ucs2_t); + + if (*outbytesleft < bytes) + return (size_t)ICONV_CES_NOSPACE; + + cp = (ucs2_t *)*outbuf; + + if (*state == UTF16_SYSTEM_ENDIAN) + { + *cp++ = UTF16_BOM; + *state |= UTF16_BOM_WRITTEN; + } + + if (in < 0x00010000) + { + switch (*state) + { + case UTF16_LITTLE_ENDIAN: + *cp = ICONV_HTOLES ((ucs2_t)in); + break; + case UTF16_BIG_ENDIAN: + *cp = ICONV_HTOBES ((ucs2_t)in); + break; + case (UTF16_SYSTEM_ENDIAN | UTF16_BOM_WRITTEN): + *cp = (ucs2_t)in; + break; + } + } + else + { + ucs2_t w1, w2; + + /* Process surrogate pair */ + in -= 0x00010000; + w1 = ((ucs2_t)((in >> 10)) & 0x03FF) | 0xD800; + w2 = (ucs2_t)(in & 0x000003FF) | 0xDC00; + + switch (*state) + { + case UTF16_LITTLE_ENDIAN: + *cp++ = ICONV_HTOLES (w1); + *cp = ICONV_HTOLES (w2); + break; + case UTF16_BIG_ENDIAN: + *cp++ = ICONV_HTOBES (w1); + *cp = ICONV_HTOBES (w2); + break; + case (UTF16_SYSTEM_ENDIAN | UTF16_BOM_WRITTEN): + *cp++ = w1; + *cp = w2; + break; + } + } + + *outbuf += bytes; + *outbytesleft -= bytes; + + return bytes; +} +#endif /* ICONV_FROM_UCS_CES_UTF_16 */ + +#if defined (ICONV_TO_UCS_CES_UTF_16) +static void * +utf_16_init_to_ucs (struct _reent *rptr, + const char *encoding) +{ + int *data; + + if ((data = (int *)_malloc_r (rptr, sizeof (int))) == NULL) + return (void *)NULL; + + if (strcmp (encoding, UTF_16BE) == 0) + *data = UTF16_BIG_ENDIAN; + else if (strcmp (encoding, UTF_16LE) == 0) + *data = UTF16_LITTLE_ENDIAN; + else + *data = UTF16_UNDEFINED; + + return (void *)data; +} + +static ucs4_t +utf_16_convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + register ucs2_t w1; + register ucs2_t w2; + register ucs2_t *cp; + int *state; + ucs4_t res; + int bytes = sizeof (ucs2_t); + + if (*inbytesleft < bytes) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + state = (int *)data; + cp = ((ucs2_t *)*inbuf); + + if (*state == UTF16_UNDEFINED) + { + if (*cp == ICONV_HTOLES(UTF16_BOM)) + *state = UTF16_LITTLE_ENDIAN; + else + *state = UTF16_BIG_ENDIAN; + + if ( *cp == ICONV_HTOBES (UTF16_BOM) + || *cp == ICONV_HTOLES (UTF16_BOM)) + { + if (*inbytesleft < (bytes += sizeof (ucs2_t))) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + cp += 1; + } + } + + if (*state == UTF16_LITTLE_ENDIAN) + w1 = ICONV_LETOHS (*cp); + else + w1 = ICONV_BETOHS (*cp); + + if (w1 < 0xD800 || w1 > 0xDFFF) + { + if (w1 == 0xFFFF || w1 == 0xFFFE) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + res = (ucs4_t)w1; + } + else + { + /* Process surrogate pair */ + if (*inbytesleft < (bytes += 2)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if (w1 > 0xDBFF) + /* Broken surrogate character */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + cp += 1; + + if (*state == UTF16_LITTLE_ENDIAN) + w2 = ICONV_LETOHS (*cp); + else + w2 = ICONV_BETOHS (*cp); + + if (w2 < 0xDC00 || w2 > 0xDFFF) + /* Broken surrogate character */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + res = (ucs4_t)(w2 & 0x03FF) | ((ucs4_t)(w1 & 0x03FF) << 10); + res += 0x00010000; + } + + *inbuf += bytes; + *inbytesleft -= bytes; + + return res; +} +#endif /* ICONV_TO_UCS_CES_UTF_16 */ + +static int +utf_16_get_mb_cur_max (void *data) +{ + return 6; +} + +#if defined (ICONV_TO_UCS_CES_UTF_16) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_utf_16 = +{ + utf_16_init_to_ucs, + utf_16_close, + utf_16_get_mb_cur_max, + NULL, + NULL, + NULL, + utf_16_convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_UTF_16) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_utf_16 = +{ + utf_16_init_from_ucs, + utf_16_close, + utf_16_get_mb_cur_max, + NULL, + NULL, + NULL, + utf_16_convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_UTF_16 || ICONV_FROM_UCS_CES_UTF_16 */ + diff --git a/lib/iconv/ces/utf-8.c b/lib/iconv/ces/utf-8.c new file mode 100644 index 0000000..116f259 --- /dev/null +++ b/lib/iconv/ces/utf-8.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "cesbi.h" + +#if defined (ICONV_TO_UCS_CES_UTF_8) \ + || defined (ICONV_FROM_UCS_CES_UTF_8) + +#include <_ansi.h> +#include +#include +#include "../lib/local.h" +#include "../lib/ucsconv.h" + +#define UTF8_MB_CUR_MAX 6 + +/* + * UTF-8 CES converter doesn't interpret BOM. Reject overlong sequences, + * U'FFFF, U'FFFE codes, UTF-16 surrogate codes and all codes > 0x7FFFFFFF. + */ + +#if defined (ICONV_FROM_UCS_CES_UTF_8) +static size_t +convert_from_ucs (void *data, + register ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft) +{ + register unsigned char *cp; + register size_t bytes; + + if ((in >= 0x0000D800 && in <= 0x0000DFFF) + || in > 0x7FFFFFFF || in == 0x0000FFFF || in == 0x0000FFFE) + return (size_t)ICONV_CES_INVALID_CHARACTER; + + if (in < 0x80) + bytes = 1; + else if (in < 0x800) + bytes = 2; + else if (in < 0x10000) + bytes = 3; + else if (in < 0x200000) + bytes = 4; + else if (in < 0x4000000) + bytes = 5; + else + bytes = 6; + + if (*outbytesleft < bytes) + return (size_t)ICONV_CES_NOSPACE; + + cp = *outbuf; + + switch (bytes) + { + case 1: + *cp = (unsigned char)in; + break; + + case 2: + *cp++ = (unsigned char)((in >> 6) | 0x000000C0); + *cp++ = (unsigned char)((in & 0x0000003F) | 0x00000080); + break; + + case 3: + *cp++ = (unsigned char)((in >> 12) | 0x000000E0); + *cp++ = (unsigned char)(((in >> 6) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)((in & 0x0000003F) | 0x00000080); + break; + + case 4: + *cp++ = (unsigned char)((in >> 18) | 0x000000F0); + *cp++ = (unsigned char)(((in >> 12) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)(((in >> 6) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)((in & 0x0000003F) | 0x00000080); + break; + + case 5: + *cp++ = (unsigned char)((in >> 24) | 0x000000F8); + *cp++ = (unsigned char)(((in >> 18) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)(((in >> 12) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)(((in >> 6) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)((in & 0x0000003F) | 0x00000080); + break; + + case 6: + *cp++ = (unsigned char)((in >> 30) | 0x000000FC); + *cp++ = (unsigned char)(((in >> 24) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)(((in >> 18) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)(((in >> 12) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)(((in >> 6) & 0x0000003F) | 0x00000080); + *cp++ = (unsigned char)((in & 0x0000003F) | 0x00000080); + break; + } + + *outbytesleft -= bytes; + *outbuf += bytes; + + return bytes; +} +#endif /* ICONV_FROM_UCS_CES_UTF_8 */ + +#if defined (ICONV_TO_UCS_CES_UTF_8) +static ucs4_t +convert_to_ucs (void *data, + const unsigned char **inbuf, + size_t *inbytesleft) +{ + register const unsigned char *in = *inbuf; + register size_t bytes; + ucs4_t res; + + if (in[0] >= 0xC0) + { + if (in[0] < 0xE0) + { + if (*inbytesleft < (bytes = 2)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if ( ((in[0] & ~0x1F) == 0xC0) + && ((in[1] & 0xC0) == 0x80)) + res = ((ucs4_t)(in[0] & 0x1F) << 6) + | ((ucs4_t)(in[1] & 0x3F)); + else + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + if (res < 0x00000080) /* Overlong sequence */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + } + + else if (in[0] < 0xF0) + { + if (*inbytesleft < (bytes = 3)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if ( ((in[0] & ~0x0F) == 0xE0) + && ((in[1] & 0xC0) == 0x80) + && ((in[2] & 0xC0) == 0x80)) + res = ((ucs4_t)(in[0] & 0x0F) << 12) + | ((ucs4_t)(in[1] & 0x3F) << 6) + | ((ucs4_t)(in[2] & 0x3F)); + else + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + if (res < 0x00000800) /* Overlong sequence */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + } + + else if (in[0] < 0xF8) + { + if (*inbytesleft < (bytes = 4)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if ( ((in[0] & ~0x07) == 0xF0) + && ((in[1] & 0xC0) == 0x80) + && ((in[2] & 0xC0) == 0x80) + && ((in[3] & 0xC0) == 0x80)) + res = ((ucs4_t)(in[0] & 0x07) << 18) + | ((ucs4_t)(in[1] & 0x3F) << 12) + | ((ucs4_t)(in[2] & 0x3F) << 6) + | ((ucs4_t)(in[3] & 0x3F)); + else + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + if (res < 0x00010000) /* Overlong sequence */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + } + + else if (in[0] < 0xFC) + { + if (*inbytesleft < (bytes = 5)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if ( ((in[0] & ~0x03) == 0xF8) + && ((in[1] & 0xC0) == 0x80) + && ((in[2] & 0xC0) == 0x80) + && ((in[3] & 0xC0) == 0x80) + && ((in[4] & 0xC0) == 0x80)) + res = ((ucs4_t)(in[0] & 0x03) << 24) + | ((ucs4_t)(in[1] & 0x3F) << 18) + | ((ucs4_t)(in[2] & 0x3F) << 12) + | ((ucs4_t)(in[3] & 0x3F) << 6) + | ((ucs4_t)(in[4] & 0x3F)); + else + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + if (res < 0x00200000) /* Overlong sequence */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + } + + else if (in[0] <= 0xFD) + { + if (*inbytesleft < (bytes = 6)) + return (ucs4_t)ICONV_CES_BAD_SEQUENCE; + + if ( ((in[0] & ~0x01) == 0xFC) + && ((in[1] & 0xC0) == 0x80) + && ((in[2] & 0xC0) == 0x80) + && ((in[3] & 0xC0) == 0x80) + && ((in[4] & 0xC0) == 0x80) + && ((in[5] & 0xC0) == 0x80)) + res = ((ucs4_t)(in[0] & 0x1) << 30) + | ((ucs4_t)(in[1] & 0x3F) << 24) + | ((ucs4_t)(in[2] & 0x3F) << 18) + | ((ucs4_t)(in[3] & 0x3F) << 12) + | ((ucs4_t)(in[4] & 0x3F) << 6) + | ((ucs4_t)(in[5] & 0x3F)); + else + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + if (res < 0x04000000) /* Overlong sequence */ + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + } + + else + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + } + else if (in[0] & 0x80) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + else + { + res = (ucs4_t)in[0]; + bytes = 1; + } + + if ( (res >= 0x0000D800 && res <= 0x0000DFFF) + || res > 0x7FFFFFFF || res == 0x0000FFFF || res == 0x0000FFFE) + return (ucs4_t)ICONV_CES_INVALID_CHARACTER; + + *inbytesleft -= bytes; + *inbuf += bytes; + + return res; +} +#endif /* ICONV_TO_UCS_CES_UTF_8 */ + +static int +get_mb_cur_max (void *data) +{ + return UTF8_MB_CUR_MAX; +} + +#if defined (ICONV_TO_UCS_CES_UTF_8) +const iconv_to_ucs_ces_handlers_t +_iconv_to_ucs_ces_handlers_utf_8 = +{ + NULL, + NULL, + get_mb_cur_max, + NULL, + NULL, + NULL, + convert_to_ucs +}; +#endif + +#if defined (ICONV_FROM_UCS_CES_UTF_8) +const iconv_from_ucs_ces_handlers_t +_iconv_from_ucs_ces_handlers_utf_8 = +{ + NULL, + NULL, + get_mb_cur_max, + NULL, + NULL, + NULL, + convert_from_ucs +}; +#endif + +#endif /* ICONV_TO_UCS_CES_UTF_8 || ICONV_FROM_UCS_CES_UTF_8 */ + diff --git a/lib/iconv/encoding.aliases b/lib/iconv/encoding.aliases new file mode 100644 index 0000000..c127a41 --- /dev/null +++ b/lib/iconv/encoding.aliases @@ -0,0 +1,55 @@ +# +# This file was automatically generated. Don't edit. +# + +big5 csbig5 big_five bigfive cn_big5 cp950 +cp775 ibm775 cspc775baltic +cp850 ibm850 850 cspc850multilingual +cp852 ibm852 852 cspcp852 +cp855 ibm855 855 csibm855 +cp866 866 IBM866 CSIBM866 +euc_jp eucjp +euc_kr euckr +euc_tw euctw +iso_8859_1 iso8859_1 iso88591 iso_8859_1:1987 iso_ir_100 latin1 l1 ibm819 cp819 csisolatin1 +iso_8859_10 iso_8859_10:1992 iso_ir_157 iso885910 latin6 l6 csisolatin6 iso8859_10 +iso_8859_11 iso8859_11 iso885911 +iso_8859_13 iso_8859_13:1998 iso8859_13 iso885913 +iso_8859_14 iso_8859_14:1998 iso885914 iso8859_14 +iso_8859_15 iso885915 iso_8859_15:1998 iso8859_15 +iso_8859_2 iso8859_2 iso88592 iso_8859_2:1987 iso_ir_101 latin2 l2 csisolatin2 +iso_8859_3 iso_8859_3:1988 iso_ir_109 iso8859_3 latin3 l3 csisolatin3 iso88593 +iso_8859_4 iso8859_4 iso88594 iso_8859_4:1988 iso_ir_110 latin4 l4 csisolatin4 +iso_8859_5 iso8859_5 iso88595 iso_8859_5:1988 iso_ir_144 cyrillic csisolatincyrillic +iso_8859_6 iso_8859_6:1987 iso_ir_127 iso8859_6 ecma_114 asmo_708 arabic csisolatinarabic iso88596 +iso_8859_7 iso_8859_7:1987 iso_ir_126 iso8859_7 elot_928 ecma_118 greek greek8 csisolatingreek iso88597 +iso_8859_8 iso_8859_8:1988 iso_ir_138 iso8859_8 hebrew csisolatinhebrew iso88598 +iso_8859_9 iso_8859_9:1989 iso_ir_148 iso8859_9 latin5 l5 csisolatin5 iso88599 +iso_ir_111 ecma_cyrillic koi8_e koi8e csiso111ecmacyrillic +koi8_r cskoi8r koi8r koi8 +koi8_ru koi8ru +koi8_u koi8u +koi8_uni koi8uni +ucs_2 ucs2 iso_10646_ucs_2 iso10646_ucs_2 iso_10646_ucs2 iso10646_ucs2 iso10646ucs2 csUnicode +ucs_2_internal ucs2_internal ucs_2internal ucs2internal +ucs_2be ucs2be +ucs_2le ucs2le +ucs_4 ucs4 iso_10646_ucs_4 iso10646_ucs_4 iso_10646_ucs4 iso10646_ucs4 iso10646ucs4 +ucs_4_internal ucs4_internal ucs_4internal ucs4internal +ucs_4be ucs4be +ucs_4le ucs4le +us_ascii ansi_x3.4_1968 ansi_x3.4_1986 iso_646.irv:1991 ascii iso646_us us ibm367 cp367 csascii +utf_16 utf16 +utf_16be utf16be +utf_16le utf16le +utf_8 utf8 +win_1250 cp1250 +win_1251 cp1251 +win_1252 cp1252 +win_1253 cp1253 +win_1254 cp1254 +win_1255 cp1255 +win_1256 cp1256 +win_1257 cp1257 +win_1258 cp1258 + diff --git a/lib/iconv/iconv.tex b/lib/iconv/iconv.tex new file mode 100644 index 0000000..5b1f751 --- /dev/null +++ b/lib/iconv/iconv.tex @@ -0,0 +1,1709 @@ +@node Encoding conversions +@chapter Encoding conversions (@file{iconv.h}) + +This chapter describes the Newlib iconv library. +The iconv functions declarations are in +@file{iconv.h}. + +@menu +* iconv:: Encoding conversion routines +* Introduction to iconv:: Introduction to iconv and encodings +* Supported encodings:: The list of currently supported encodings +* iconv design decisions:: General iconv library design issues +* iconv configuration:: iconv-related configure script options +* Encoding names:: How encodings are named. +* CCS tables:: CCS tables format and 'mktbl.pl' Perl script +* CES converters:: CES converters description +* The encodings description file:: The 'encoding.deps' file and 'mkdeps.pl' +* How to add new encoding:: The steps to add new encoding support +* The locale support interfaces:: Locale-related iconv interfaces +* Contact:: The author contact +@end menu + +@page +@include iconv/lib/iconv.def + +@page +@node Introduction to iconv +@section Introduction to iconv +@findex encoding +@findex character set +@findex charset +@findex CES +@findex CCS +@* +The iconv library is intended to convert characters from one encoding to +another. It implements iconv(), iconv_open() and iconv_close() +calls, which are defined by the Single Unix Specification. + +@* +In addition to these user-level interfaces, the iconv library also has +several useful interfaces which are needed to support coding +capabilities of the Newlib Locale infrastructure. Since Locale +support also needs to +convert various character sets to and from the @emph{wide characters +set}, the iconv library shares it's capabilities with the Newlib Locale +subsystem. Moreover, the iconv library supports several features which are +only needed for the Locale infrastructure (for example, the MB_CUR_MAX value). + +@* +The Newlib iconv library was created using concepts from another iconv +library implemented by Konstantin Chuguev (ver 2.0). The Newlib iconv library +was rewritten from scratch and contains a lot of improvements with respect to +the original iconv library. + +@* +Terms like @dfn{encoding} or @dfn{character set} aren't well defined and +are often used with various meanings. The following are the definitions of terms +which are used in this documentation as well as in the iconv library +implementation: + +@itemize @bullet +@item +@dfn{encoding} - a machine representation of characters by means of bits; + +@item +@dfn{Character Set} or @dfn{Charset} - just a collection of +characters, i.e. the encoding is the machine representation of the character set; + +@item +@dfn{CCS} (@dfn{Coded Character Set}) - a mapping from an character set to a +set of integers @dfn{character codes}; + +@item +@dfn{CES} (@dfn{Character Encoding Scheme}) - a mapping from a set of character +codes to a sequence of bytes; +@end itemize + +@* +Users usually deal with encodings, for example, KOI8-R, Unicode, UTF-8, +ASCII, etc. Encodings are formed by the following chain of steps: + +@enumerate +@item +User has a set of characters which are specific to his or her language (character set). + +@item +Each character from this set is uniquely numbered, resulting in an CCS. + +@item +Each number from the CCS is converted to a sequence of bits or bytes by means +of a CES and form some encoding. Thus, CES may be considered as a +function of CCS which produces some encoding. Note, that CES may be +applied to more than one CCS. +@end enumerate + +@* +Thus, an encoding may be considered as one or more CCS + CES. + +@* +Sometimes, there is no CES and in such cases encoding is equivalent +to CCS, e.g. KOI8-R or ASCII. + +@* +An example of a more complicated encoding is UTF-8 which is the UCS +(or Unicode) CCS plus the UTF-8 CES. + +@* +The following is a brief list of iconv library features: +@itemize +@item +Generic architecture; +@item +Locale infrastructure support; +@item +Automatic generation of the program code which handles +CES/CCS/Encoding/Names/Aliases dependencies; +@item +The ability to choose size- or speed-optimazed +configuration; +@item +The ability to exclude a lot of unneeded code and data from the linking step. +@end itemize + + + + +@page +@node Supported encodings +@section Supported encodings +@findex big5 +@findex cp775 +@findex cp850 +@findex cp852 +@findex cp855 +@findex cp866 +@findex euc_jp +@findex euc_kr +@findex euc_tw +@findex iso_8859_1 +@findex iso_8859_10 +@findex iso_8859_11 +@findex iso_8859_13 +@findex iso_8859_14 +@findex iso_8859_15 +@findex iso_8859_2 +@findex iso_8859_3 +@findex iso_8859_4 +@findex iso_8859_5 +@findex iso_8859_6 +@findex iso_8859_7 +@findex iso_8859_8 +@findex iso_8859_9 +@findex iso_ir_111 +@findex koi8_r +@findex koi8_ru +@findex koi8_u +@findex koi8_uni +@findex ucs_2 +@findex ucs_2_internal +@findex ucs_2be +@findex ucs_2le +@findex ucs_4 +@findex ucs_4_internal +@findex ucs_4be +@findex ucs_4le +@findex us_ascii +@findex utf_16 +@findex utf_16be +@findex utf_16le +@findex utf_8 +@findex win_1250 +@findex win_1251 +@findex win_1252 +@findex win_1253 +@findex win_1254 +@findex win_1255 +@findex win_1256 +@findex win_1257 +@findex win_1258 +@* +The following is the list of currently supported encodings. The first column +corresponds to the encoding name, the second column is the list of aliases, +the third column is its CES and CCS components names, and the fourth column +is a short description. + +@multitable @columnfractions .20 .26 .24 .30 +@item +Name +@tab +Aliases +@tab +CES/CCS +@tab +Short description +@item +@tab +@tab +@tab + + +@item +big5 +@tab +csbig5, big_five, bigfive, cn_big5, cp950 +@tab +table_pcs / big5, us_ascii +@tab +The encoding for the Traditional Chinese. + + +@item +cp775 +@tab +ibm775, cspc775baltic +@tab +table / cp775 +@tab +The updated version of CP 437 that supports the balitic languages. + + +@item +cp850 +@tab +ibm850, 850, cspc850multilingual +@tab +table / cp850 +@tab +IBM 850 - the updated version of CP 437 where several Latin 1 characters have been +added instead of some less-often used characters like the line-drawing +and the greek ones. + + +@item +cp852 +@tab +ibm852, 852, cspcp852 +@tab +@tab +IBM 852 - the updated version of CP 437 where several Latin 2 characters have been added +instead of some less-often used characters like the line-drawing and the greek ones. + + +@item +cp855 +@tab +ibm855, 855, csibm855 +@tab +table / cp855 +@tab +IBM 855 - the updated version of CP 437 that supports Cyrillic. + + +@item +cp866 +@tab +866, IBM866, CSIBM866 +@tab +table / cp866 +@tab +IBM 866 - the updated version of CP 855 which follows more the logical Russian alphabet +ordering of the alternative variant that is preferred by many Russian users. + + +@item +euc_jp +@tab +eucjp +@tab +euc / jis_x0208_1990, jis_x0201_1976, jis_x0212_1990 +@tab +EUC-JP - The EUC for Japanese. + + +@item +euc_kr +@tab +euckr +@tab +euc / ksx1001 +@tab +EUC-KR - The EUC for Korean. + + +@item +euc_tw +@tab +euctw +@tab +euc / cns11643_plane1, cns11643_plane2, cns11643_plane14 +@tab +EUC-TW - The EUC for Traditional Chinese. + + +@item +iso_8859_1 +@tab +iso8859_1, iso88591, iso_8859_1:1987, iso_ir_100, latin1, l1, ibm819, cp819, csisolatin1 +@tab +table / iso_8859_1 +@tab +ISO 8859-1:1987 - Latin 1, West European. + + +@item +iso_8859_10 +@tab +iso_8859_10:1992, iso_ir_157, iso885910, latin6, l6, csisolatin6, iso8859_10 +@tab +table / iso_8859_10 +@tab +ISO 8859-10:1992 - Latin 6, Nordic. + + +@item +iso_8859_11 +@tab +iso8859_11, iso885911 +@tab +table / iso_8859_11 +@tab +ISO 8859-11 - Thai. + + +@item +iso_8859_13 +@tab +iso_8859_13:1998, iso8859_13, iso885913 +@tab +table / iso_8859_13 +@tab +ISO 8859-13:1998 - Latin 7, Baltic Rim. + + +@item +iso_8859_14 +@tab +iso_8859_14:1998, iso885914, iso8859_14 +@tab +table / iso_8859_14 +@tab +ISO 8859-14:1998 - Latin 8, Celtic. + + +@item +iso_8859_15 +@tab +iso885915, iso_8859_15:1998, iso8859_15, +@tab +table / iso_8859_15 +@tab +ISO 8859-15:1998 - Latin 9, West Europe, successor of Latin 1. + + +@item +iso_8859_2 +@tab +iso8859_2, iso88592, iso_8859_2:1987, iso_ir_101, latin2, l2, csisolatin2 +@tab +table / iso_8859_2 +@tab +ISO 8859-2:1987 - Latin 2, East European. + + +@item +iso_8859_3 +@tab +iso_8859_3:1988, iso_ir_109, iso8859_3, latin3, l3, csisolatin3, iso88593 +@tab +table / iso_8859_3 +@tab +ISO 8859-3:1988 - Latin 3, South European. + + +@item +iso_8859_4 +@tab +iso8859_4, iso88594, iso_8859_4:1988, iso_ir_110, latin4, l4, csisolatin4 +@tab +table / iso_8859_4 +@tab +ISO 8859-4:1988 - Latin 4, North European. + + +@item +iso_8859_5 +@tab +iso8859_5, iso88595, iso_8859_5:1988, iso_ir_144, cyrillic, csisolatincyrillic +@tab +table / iso_8859_5 +@tab +ISO 8859-5:1988 - Cyrillic. + + +@item +iso_8859_6 +@tab +iso_8859_6:1987, iso_ir_127, iso8859_6, ecma_114, asmo_708, arabic, csisolatinarabic, iso88596 +@tab +table / iso_8859_6 +@tab +ISO i8859-6:1987 - Arabic. + + +@item +iso_8859_7 +@tab +iso_8859_7:1987, iso_ir_126, iso8859_7, elot_928, ecma_118, greek, greek8, csisolatingreek, iso88597 +@tab +table / iso_8859_7 +@tab +ISO 8859-7:1987 - Greek. + + +@item +iso_8859_8 +@tab +iso_8859_8:1988, iso_ir_138, iso8859_8, hebrew, csisolatinhebrew, iso88598 +@tab +table / iso_8859_8 +@tab +ISO 8859-8:1988 - Hebrew. + + +@item +iso_8859_9 +@tab +iso_8859_9:1989, iso_ir_148, iso8859_9, latin5, l5, csisolatin5, iso88599 +@tab +table / iso_8859_9 +@tab +ISO 8859-9:1989 - Latin 5, Turkish. + + +@item +iso_ir_111 +@tab +ecma_cyrillic, koi8_e, koi8e, csiso111ecmacyrillic +@tab +table / iso_ir_111 +@tab +ISO IR 111/ECMA Cyrillic. + + +@item +koi8_r +@tab +cskoi8r, koi8r, koi8 +@tab +table / koi8_r +@tab +RFC 1489 Cyrillic. + + +@item +koi8_ru +@tab +koi8ru +@tab +table / koi8_ru +@tab +The obsolete Ukrainian. + + +@item +koi8_u +@tab +koi8u +@tab +table / koi8_u +@tab +RFC 2319 Ukrainian. + + +@item +koi8_uni +@tab +koi8uni +@tab +table / koi8_uni +@tab +KOI8 Unified. + + +@item +ucs_2 +@tab +ucs2, iso_10646_ucs_2, iso10646_ucs_2, iso_10646_ucs2, iso10646_ucs2, iso10646ucs2, csUnicode +@tab +ucs_2 / (UCS) +@tab +ISO-10646-UCS-2. Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_2_internal +@tab +ucs2_internal, ucs_2internal, ucs2internal +@tab +ucs_2_internal / (UCS) +@tab +ISO-10646-UCS-2 in system byte order. +NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_2be +@tab +ucs2be +@tab +ucs_2 / (UCS) +@tab +Big Endian version of ISO-10646-UCS-2 (in fact, equivalent to ucs_2). +Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_2le +@tab +ucs2le +@tab +ucs_2 / (UCS) +@tab +Little Endian version of ISO-10646-UCS-2. +Little Endian, NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_4 +@tab +ucs4, iso_10646_ucs_4, iso10646_ucs_4, iso_10646_ucs4, iso10646_ucs4, iso10646ucs4 +@tab +ucs_4 / (UCS) +@tab +ISO-10646-UCS-4. Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_4_internal +@tab +ucs4_internal, ucs_4internal, ucs4internal +@tab +ucs_4_internal / (UCS) +@tab +ISO-10646-UCS-4 in system byte order. +NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_4be +@tab +ucs4be +@tab +ucs_4 / (UCS) +@tab +Big Endian version of ISO-10646-UCS-4 (in fact, equivalent to ucs_4). +Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +ucs_4le +@tab +ucs4le +@tab +ucs_4 / (UCS) +@tab +Little Endian version of ISO-10646-UCS-4. +Little Endian, NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +us_ascii +@tab +ansi_x3.4_1968, ansi_x3.4_1986, iso_646.irv:1991, ascii, iso646_us, us, ibm367, cp367, csascii +@tab +us_ascii / (ASCII) +@tab +7-bit ASCII. + + +@item +utf_16 +@tab +utf16 +@tab +utf_16 / (UCS) +@tab +RFC 2781 UTF-16. The very first NBSP code in stream is interpreted as BOM. + + +@item +utf_16be +@tab +utf16be +@tab +utf_16 / (UCS) +@tab +Big Endian version of RFC 2781 UTF-16. +NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +utf_16le +@tab +utf16le +@tab +utf_16 / (UCS) +@tab +Little Endian version of RFC 2781 UTF-16. +NBSP is always interpreted as NBSP (BOM isn't supported). + + +@item +utf_8 +@tab +utf8 +@tab +utf_8 / (UCS) +@tab +RFC 3629 UTF-8. + + +@item +win_1250 +@tab +cp1250 +@tab +@tab +Win-1250 Croatian. + + +@item +win_1251 +@tab +cp1251 +@tab +table / win_1251 +@tab +Win-1251 - Cyrillic. + + +@item +win_1252 +@tab +cp1252 +@tab +table / win_1252 +@tab +Win-1252 - Latin 1. + + +@item +win_1253 +@tab +cp1253 +@tab +table / win_1253 +@tab +Win-1253 - Greek. + + +@item +win_1254 +@tab +cp1254 +@tab +table / win_1254 +@tab +Win-1254 - Turkish. + + +@item +win_1255 +@tab +cp1255 +@tab +table / win_1255 +@tab +Win-1255 - Hebrew. + + +@item +win_1256 +@tab +cp1256 +@tab +table / win_1256 +@tab +Win-1256 - Arabic. + + +@item +win_1257 +@tab +cp1257 +@tab +table / win_1257 +@tab +Win-1257 - Baltic. + + +@item +win_1258 +@tab +cp1258 +@tab +table / win_1258 +@tab +Win-1258 - Vietnamese7 that supports Cyrillic. +@end multitable + + + + + +@page +@node iconv design decisions +@section iconv design decisions +@findex CCS table +@findex CES converter +@findex Speed-optimized tables +@findex Size-optimized tables +@* +The first iconv library design issue arises when considering the +following two design approaches: + +@enumerate +@item +Have modules which implement conversion from the encoding A to the encoding B +and vice versa i.e., one conversion module relates to any two encodings. +@item +Have modules which implement conversion from the encoding A to the fixed +encoding C and vice versa i.e., one conversion module relates to any +one encoding A and one fixed encoding C. In this case, to convert from +the encoding A to the encoding B, two modules are needed (in order to convert +from A to C and then from C to B). +@end enumerate + +@* +It's obvious, that we have tradeoff between commonality/flexibility and +efficiency: the first method is more efficient since it converts +directly; however, it isn't so flexible since for each +encoding pair a distinct module is needed. + +@* +The Newlib iconv model uses the second method and always converts through the 32-bit +UCS but its design also allows one to write specialized conversion +modules if the conversion speed is critical. + +@* +The second design issue is how to break down (decompose) encodings. +The Newlib iconv library uses the fact that any encoding may be +considered as one or more CCS plus a CES. It also decomposes its +conversion modules on @dfn{CES converter} plus one or more @dfn{CCS +tables}. CCS tables map CCS to UCS and vice versa; the CES converters +map CCS to the encoding and vice versa. + +@* +As the example, let's consider the conversion from the big5 encoding to +the EUC-TW encoding. The big5 encoding may be decomposed to the ASCII and BIG5 +CCS-es plus the BIG5 CES. EUC-TW may be decomposed on the CNS11643_PLANE1, CNS11643_PLANE2, +and CNS11643_PLANE14 CCS-es plus the EUC CES. + +@* +The euc_jp -> big5 conversion is performed as follows: + +@enumerate +@item +The EUC converter performs the EUC-TW encoding to the corresponding CCS-es +transformation (CNS11643_PLANE1, CNS11643_PLANE2 and CNS11643_PLANE14 +CCS-es); +@item +The obtained CCS codes are transformed to the UCS codes using the CNS11643_PLANE1, +CNS11643_PLANE2 and CNS11643_PLANE14 CCS tables; +@item +The resulting UCS codes are transformed to the ASCII and BIG5 codes using +the corresponding CCS tables; +@item +The obtained CCS codes are transformed to the big5 encoding using the corresponding +CES converter. +@end enumerate + +@* +Analogously, the backward conversion is performed as follows: + +@enumerate +@item +The BIG5 converter performs the big5 encoding to the corresponding CCS-es transformation +(the ASCII and BIG5 CCS-es); +@item +The obtained CCS codes are transformed to the UCS codes using the ASCII and BIG5 CCS tables; +@item +The resulting UCS codes are transformed to the ASCII and BIG5 codes using +the corresponding CCS tables; +@item +The obtained CCS codes are transformed to the EUC-TW encoding using the corresponding +CES converter. +@end enumerate + +@* +Note, the above is just an example and real names (which are implemented +in the Newlib iconv) of the CES converters and the CCS tables are slightly different. + +@* +The third design issue also relates to flexibility. Obviously, it isn't +desirable to always link all the CES converters and the CCS tables to the library +but instead, we want to be able to load the needed converters and tables +dynamically on demand. This isn't a problem on "big" machines such as +a PC, but it may be very problematical within "small" embedded systems. + +@* +Since the CCS tables are just data, it is possible to load them +dynamically from external files. The CES converters, on the other hand +are algorithms with some code so a dynamic library loading +capability is required. + +@* +Apart from possible restrictions applied by embedded systems (small +RAM for example), Newlib itself has no dynamic library support and +therefore, all the CES converters which will ever be used must be linked into +the library. However, loading of the dynamic CCS tables is possible and is +implemented in the Newlib iconv library. It may be enabled via the Newlib +configure script options. + +@* +The next design issue is fine-tuning the iconv library +configuration. One important ability is for iconv to not link all it's +converters and tables (if dynamic loading is not enabled) but instead, +enable only those encodings which are specified at configuration +time (see the section about the configure script options). + +@* +In addition, the Newlib iconv library configure options distinguish between +conversion directions. This means that not only are supported encodings +selectable, the conversion direction is as well. For example, if user wants +the configuration which allows conversions from UTF-8 to UTF-16 and +doesn't plan using the "UTF-16 to UTF-8" conversions, he or she can +enable only +this conversion direction (i.e., no "UTF-16 -> UTF-8"-related code will +be included) thus, saving some memory (note, that such technique allows to +exclude one half of a CCS table from linking which may be big enough). + +@* +One more design aspect are the speed- and size- optimized tables. Users can +select between them using configure script options. The +speed-optimized CCS tables are the same as the size-optimized ones in +case of 8-bit CCS (e.g.m KOI8-R), but for 16-bit CCS-es the size-optimized +CCS tables may be 1.5 to 2 times less then the speed-optimized ones. On the +other hand, conversion with speed tables is several times faster. + +@* +Its worth to stress that the new encoding support can't be +dynamically added into an already compiled Newlib library, even if it +needs only an additional CCS table and iconv is configured to use +the external files with CCS tables (this isn't the fundamental restriction +and the possibility to add new Table-based encoding support dynamically, by +means of just adding new .cct file, may be easily added). + +@* +Theoretically, the compiled-in CCS tables should be more appropriate for +embedded systems than dynamically loaded CCS tables. This is because the compiled-in tables are read-only and can be placed in ROM +whereas dynamic loading requires RAM. Moreover, in the current iconv +implementation, a distinct copy of the dynamic CCS file is loaded for each opened iconv descriptor even in case of the same encoding. +This means, for example, that if two iconv descriptors for +"KOI8-R -> UCS-4BE" and "KOI8-R -> UTF-16BE" are opened, two copies of +koi8-r .cct file will be loaded (actually, iconv loads only the needed part +of these files). On the other hand, in the case of compiled-in CCS tables, there will always be only one copy. + +@page +@node iconv configuration +@section iconv configuration +@findex iconv configuration +@findex --enable-newlib-iconv-encodings +@findex --enable-newlib-iconv-from-encodings +@findex --enable-newlib-iconv-to-encodings +@findex --enable-newlib-iconv-external-ccs +@findex NLSPATH +@* +To enable an encoding, the @emph{--enable-newlib-iconv-encodings} configure +script option should be used. This option accepts a comma-separated list +of @emph{encodings} that should be enabled. The option enables each encoding in both +("to" and "from") directions. + +@* +The @option{--enable-newlib-iconv-from-encodings} configure script option enables +"from" support for each encoding that was passed to it. + +@* +The @option{--enable-newlib-iconv-to-encodings} configure script option enables +"to" support for each encoding that was passed to it. + +@* +Example: if user plans only the "KOI8-R -> UTF-8", "UTF-8 -> ISO-8859-5" and +"KOI8-R -> UCS-2" conversions, the most optimal way (minimal iconv +code and data will be linked) is to configure Newlib with the following +options: +@* +@code{--enable-newlib-iconv-encodings=UTF-8 +--enable-newlib-iconv-from-encodings=KOI8-R +--enable-newlib-iconv-to-encodings=UCS-2,ISO-8859-5} +@* +which is the same as +@* +@code{--enable-newlib-iconv-from-encodings=KOI8-R,UTF-8 +--enable-newlib-iconv-to-encodings=UCS-2,ISO-8859-5,UTF-8} +@* +User may also just use the +@* +@code{--enable-newlib-iconv-encodings=KOI8-R,ISO-8859-5,UTF-8,UCS-2} +@* +configure script option, but it isn't so optimal since there will be +some unneeded data and code. + +@* +The @option{--enable-newlib-iconv-external-ccs} option enables iconv's +capabilities to work with the external CCS files. + +@* +The @option{--enable-target-optspace} Newlib configure script option also affects +the iconv library. If this option is present, the library uses the size +optimized CCS tables. This means, that only the size-optimized CCS +tables will be linked or, if the +@option{--enable-newlib-iconv-external-ccs} configure script option was used, +the iconv library will load the size-optimized tables. If the +@option{--enable-target-optspace}configure script option is disabled, +the speed-optimized CCS tables are used. + +@* +Note: .cct files are searched by iconv_open in the $NLSPATH/iconv_data/ directory. +Thus, the NLSPATH environment variable should be set. + + + + + +@page +@node Encoding names +@section Encoding names +@findex encoding name +@findex encoding alias +@findex normalized name +@* +Each encoding has one @dfn{name} and a number of @dfn{aliases}. When +user works with the iconv library (i.e., when the @code{iconv_open} call +is used) both name or aliases may be used. The same is when encoding +names are used in configure script options. + +@* +Names and aliases may be specified in any case (small or capital +letters) and the @kbd{-} symbol is equivalent to the @kbd{_} symbol. + +@* +Internally the Newlib iconv library always converts aliases to names. It +also converts names and aliases in the @dfn{normalized} form which means +that all capital letters are converted to small letters and the @kbd{-} +symbols are converted to @kbd{_} symbols. + + + + +@page +@node CCS tables +@section CCS tables +@findex Size-optimized CCS table +@findex Speed-optimized CCS table +@findex mktbl.pl Perl script +@findex .cct files +@findex The CCT tables source files +@findex CCS source files +@* +The iconv library stores files with CCS tables in the the @emph{ccs/} +subdirectory. The CCS tables for any CCS may be kept in two forms - in the binary form +(@dfn{.cct files}, see the @emph{ccs/binary/} subdirectory) and in form +of compilable .c source files. The .cct files are only used when the +@option{--enable-newlib-iconv-external-ccs} configure script option is enabled. +The .c files are linked to the Newlib library if the corresponding +encoding is enabled. + +@* +As stated earlier, the Newlib iconv library performs all +conversions through the 32-bit UCS, but the codes which are used +in most CCS-es, fit into the first 16-bit subset of the 32-bit UCS set. +Thus, in order to make the CCS tables more compact, the 16-bit UCS-2 is +used instead of the 32-bit UCS-4. + +@* +CCS tables may be 8- or 16-bit wide. 8-bit CCS tables map 8-bit CCS to +16-bit UCS-2 and vice versa while 16-bit CCS tables map +16-bit CCS to 16-bit UCS-2 and vice versa. +8-bit tables are small (in size) while 16-bit tables may be big enough. +Because of this, 16-bit CCS tables may be +either speed- or size-optimized. Size-optimized CCS tables are +smaller then speed-optimized ones, but the conversion process is +slower if the size-optimized CCS tables are used. 8-bit CCS tables have only +size-optimized variant. + +Each CCS table (both speed- and size-optimized) consists of +@dfn{from_ucs} and @dfn{to_ucs} subtables. "from_ucs" subtable maps +UCS-2 codes to CCS codes, while "to_ucs" subtable maps CCS codes to +UCS-2 codes. + +@* +Almost all 16-bit CCS tables contain less then 0xFFFF codes and +a lot of gaps exist. + +@subsection Speed-optimized tables format +@* +In case of 8-bit speed-optimized CCS tables the "to_ucs" subtables format is +trivial - it is just the array of 256 16-bit UCS codes. Therefore, an +UCS-2 code @emph{Y} corresponding to a @emph{X} CCS code is calculates +as @emph{Y = to_ucs[X]}. + +@* +Obviously, the simplest way to create the "from_ucs" table or the +16-bit "to_ucs" table is to use the huge 16-bit array like in case +of the 8-bit "to_ucs" table. But almost all the 16-bit CCS tables contain +less then 0xFFFF code maps and this fact may be exploited to reduce +the size of the CCS tables. + +@* +In this chapter the "UCS-2 -> CCS" 8-bit CCS table format is described. The +16-bit "CCS -> UCS-2" CCS table format is the same, except the mapping +direction and the CCS bits number. + +@* +In case of the 8-bit speed-optimized table the "from_ucs" subtable +corresponds the "from_ucs" array and has the following layout: + +@* +from_ucs array: +@* +------------------------------------- +@* +0xFF mapping (2 bytes) (only for +8-bit table). +@* +------------------------------------- +@* +Heading block +@* +------------------------------------- +@* +Block 1 +@* +------------------------------------- +@* +Block 2 +@* +------------------------------------- +@* + ... +@* +------------------------------------- +@* +Block N +@* +------------------------------------- + +@* +The 0x0000-0xFFFF 16-bit code range is divided to 256 code subranges. Each +subrange is represented by an 256-element @dfn{block} (256 1-byte +elements or 256 2-byte element in case of 16-bit CCS table) with +elements which are equivalent to the CCS codes of this subrange. +If the "UCS-2 -> CCS" mapping has big enough gaps, some blocks will be +absent and there will be less then 256 blocks. + +@* +Any element number @emph{m} of @dfn{the heading block} (which contains +256 2-byte elements) corresponds to the @emph{m}-th 256-element subrange. +If the subrange contains some codes, the value of the @emph{m}-th element of +the heading block contains the offset of the corresponding block in the +"from_ucs" array. If there is no codes in the subrange, the heading +block element contains 0xFFFF. + +@* +If there are some gaps in a block, the corresponding block elements have +the 0xFF value. If there is an 0xFF code present in the CCS, it's mapping +is defined in the first 2-byte element of the "from_ucs" array. + +@* +Having such a table format, the algorithm of searching the CCS code +@emph{X} which corresponds to the UCS-2 code @emph{Y} is as follows. + +@* +@enumerate +@item If @emph{Y} is equivalent to the value of the first 2-byte element +of the "from_ucs" array, @emph{X} is 0xFF. Else, continue to search. + +@item Calculate the block number: @emph{BlkN = (Y & 0xFF00) >> 8}. + +@item If the heading block element with number @emph{BlkN} is 0xFFFF, there +is no corresponding CCS code (error, wrong input data). Else, fetch the +"flom_ucs" array index of the @emph{BlkN}-th block. + +@item Calculate the offset of the @emph{X} code in its block: +@emph{Xindex = Y & 0xFF} + +@item If the @emph{Xindex}-th element of the block (which is equivalent to +@emph{from_ucs[BlkN+Xindex]}) value is 0xFF, there is no corresponding +CCS code (error, wrong input data). Else, @emph{X = from_ucs[BlkN+Xindex]}. +@end enumerate + +@subsection Size-optimized tables format +@* +As it is stated above, size-optimized tables exist only for 16-bit CCS-es. +This is because there is too small difference between the speed-optimized +and the size-optimized table sizes in case of 8-bit CCS-es. + +@* +Formats of the "to_ucs" and "from_ucs" subtables are equivalent in case of +size-optimized tables. + +This sections describes the format of the "UCS-2 -> CCS" size-optimized +CCS table. The format of "CCS -> UCS-2" table is the same. + +The idea of the size-optimized tables is to split the UCS-2 codes +("from" codes) on @dfn{ranges} (@dfn{range} is a number of consecutive UCS-2 codes). +Then CCS codes ("to" codes) are stored only for the codes from these +ranges. Distinct "from" codes, which have no range (@dfn{unranged codes}, are stored +together with the corresponding "to" codes. + +@* +The following is the layout of the size-optimized table array: + +@* +size_arr array: +@* +------------------------------------- +@* +Ranges number (2 bytes) +@* +------------------------------------- +@* +Unranged codes number (2 bytes) +@* +------------------------------------- +@* +Unranged codes array index (2 bytes) +@* +------------------------------------- +@* +Ranges indexes (triads) +@* +------------------------------------- +@* +Ranges +@* +------------------------------------- +@* +Unranged codes array +@* +------------------------------------- + +@* +The @dfn{Unranged codes array index} @emph{size_arr} section helps to find +the offset of the needed range in the @emph{size_arr} and has +the following format (triads): +@* +the first code in range, the last code in range, range offset. + +@* +The array of these triads is sorted by the firs element, therefore it is +possible to quickly find the needed range index. + +@* +Each range has the corresponding sub-array containing the "to" codes. These +sub-arrays are stored in the place marked as "Ranges" in the layout +diagram. + +@* +The "Unranged codes array" contains pairs ("from" code, "to" code") for +each unranged code. The array of these pairs is sorted by "from" code +values, therefore it is possible to find the needed pair quickly. + +@* +Note, that each range requires 6 bytes to form its index. If, for +example, there are two ranges (1 - 5 and 9 - 10), and one unranged code +(7), 12 bytes are needed for two range indexes and 4 bytes for the unranged +code (total 16). But it is better to join both ranges as 1 - 10 and +mark codes 6 and 8 as absent. In this case, only 6 additional bytes for the +range index and 4 bytes to mark codes 6 and 8 as absent are needed +(total 10 bytes). This optimization is done in the size-optimized tables. +Thus, ranges may contain small gaps. The absent codes in ranges are marked +as 0xFFFF. + +@* +Note, a pair of "from" codes is stored by means of unranged codes since +the number of bytes which are needed to form the range is greater than +the number of bytes to store two unranged codes (5 against 4). + +@* +The algorithm of searching of the CCS code +@emph{X} which corresponds to the UCS-2 code @emph{Y} (input) in the "UCS-2 -> +CCS" size-optimized table is as follows. + +@* +@enumerate +@item Try to find the corresponding triad in the "Unranged codes array +index". Since we are searching in the sorted array, we can do it quickly +(divide by 2, compare, etc). + +@item If the triad is found, fetch the @emph{X} code from the corresponding +range array. If it is 0xFFFF, return an error. + +@item If there is no corresponding triad, search the @emph{X} code among the +sorted unranged codes. Return error, if noting was found. +@end enumerate + +@subsection .cct ant .c CCS Table files +@* +The .c source files for 8-bit CCS tables have "to_ucs" and "from_ucs" +speed-optimized tables. The .c source files for 16-bit CCS tables have +"to_ucs_speed", "to_ucs_size", "from_ucs_speed" and "from_ucs_size" +tables. + +@* +When .c files are compiled and used, all the 16-bit and 32-bit values +have the native endian format (Big Endian for the BE systems and Little +Endian for the LE systems) since they are compile for the system before +they are used. + +@* +In case of .cct files, which are intended for dynamic CCS tables +loading, the CCS tables are stored either in LE or BE format. Since the +.cct files are generated by the 'mktbl.pl' Perl script, it is possible +to choose the endianess of the tables. It is also possible to store two +copies (both LE and BE) of the CCS tables in one .cct file. The default +.cct files (which come with the Newlib sources) have both LE and BE CCS +tables. The Newlib iconv library automatically chooses the needed CCS tables +(with appropriate endianess). + +@* +Note, the .cct files are only used when the +@option{--enable-newlib-iconv-external-ccs} is used. + +@subsection The 'mktbl.pl' Perl script +@* +The 'mktbl.pl' script is intended to generate .cct and .c CCS table +files from the @dfn{CCS source files}. + +@* +The CCS source files are just text files which has one or more colons +with CCS <-> UCS-2 codes mapping. To see an example of the CCS table +source files see one of them using URL-s which will be given bellow. + +@* +The following table describes where the source files for CCS table files +provided by the Newlib distribution are located. + +@multitable @columnfractions .25 .75 +@item +Name +@tab +URL + +@item +@tab + +@item +big5 +@tab +http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT + +@item +cns11643_plane1 +cns11643_plane14 +cns11643_plane2 +@tab +http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/CNS11643.TXT + +@item +cp775 +cp850 +cp852 +cp855 +cp866 +@tab +http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/ + +@item +iso_8859_1 +iso_8859_2 +iso_8859_3 +iso_8859_4 +iso_8859_5 +iso_8859_6 +iso_8859_7 +iso_8859_8 +iso_8859_9 +iso_8859_10 +iso_8859_11 +iso_8859_13 +iso_8859_14 +iso_8859_15 +@tab +http://www.unicode.org/Public/MAPPINGS/ISO8859/ + +@item +iso_ir_111 +@tab +http://crl.nmsu.edu/~mleisher/csets/ISOIR111.TXT + +@item +jis_x0201_1976 +jis_x0208_1990 +jis_x0212_1990 +@tab +http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0201.TXT + +@item +koi8_r +@tab +http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT + +@item +koi8_ru +@tab +http://crl.nmsu.edu/~mleisher/csets/KOI8RU.TXT + +@item +koi8_u +@tab +http://crl.nmsu.edu/~mleisher/csets/KOI8U.TXT + +@item +koi8_uni +@tab +http://crl.nmsu.edu/~mleisher/csets/KOI8UNI.TXT + +@item +ksx1001 +@tab +http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/KSC/KSX1001.TXT + +@item +win_1250 +win_1251 +win_1252 +win_1253 +win_1254 +win_1255 +win_1256 +win_1257 +win_1258 +@tab +http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/ +@end multitable + +The CCS source files aren't distributed with Newlib because of License +restrictions in most Unicode.org's files. + +The following are 'mktbl.pl' options which were used to generate .cct +files. Note, to generate CCS tables source files @option{-s} option +should be added. + +@enumerate +@item For the iso_8859_10.cct, iso_8859_13.cct, iso_8859_14.cct, iso_8859_15.cct, +iso_8859_1.cct, iso_8859_2.cct, iso_8859_3.cct, iso_8859_4.cct, +iso_8859_5.cct, iso_8859_6.cct, iso_8859_7.cct, iso_8859_8.cct, +iso_8859_9.cct, iso_8859_11.cct, win_1250.cct, win_1252.cct, win_1254.cct +win_1256.cct, win_1258.cct, win_1251.cct, +win_1253.cct, win_1255.cct, win_1257.cct, +koi8_r.cct, koi8_ru.cct, koi8_u.cct, koi8_uni.cct, iso_ir_111.cct, +big5.cct, cp775.cct, cp850.cct, cp852.cct, cp855.cct, cp866.cct, cns11643.cct +files, only the @option{-i } option were used. + +@item To generate the jis_x0208_1990.cct file, the +@option{-i jis_x0208_1990.txt -x 2 -y 3} options were used. + +@item To generate the cns11643_plane1.cct file, the +@option{-i cns11643.txt -p1 -N cns11643_plane1 -o cns11643_plane1.cct} +options were used. + +@item To generate the cns11643_plane2.cct file, the +@option{-i cns11643.txt -p2 -N cns11643_plane2 -o cns11643_plane2.cct} +options were used. + +@item To generate the cns11643_plane14.cct file, the +@option{-i cns11643.txt -p0xE -N cns11643_plane14 -o cns11643_plane14.cct} +options were used. +@end enumerate + +@* +For more info about the 'mktbl.pl' options, see the 'mktbl.pl -h' output. + +@* +It is assumed that CCS codes are 16 or less bits wide. If there are wider CCS codes +in the CCS source file, the bits which are higher then 16 defines plane (see the +cns11643.txt CCS source file). + +@* +Sometimes, it is impossible to map some CCS codes to the 16-bit UCS if, for example, +several different CCS codes are mapped to one UCS-2 code or one CCS code is mapped to +the pair of UCS-2 codes. In these cases, such CCS codes (@dfn{lost +codes}) aren't just rejected but instead, they are mapped to the default +UCS-2 code (which is currently the @kbd{?} character's code). + + + + + +@page +@node CES converters +@section CES converters +@findex PCS +@* +Similar to the CCS tables, CES converters are also split into "from UCS" +and "to UCS" parts. Depending on the iconv library configuration, these +parts are enabled or disabled. + +@* +The following it the list of CES converters which are currently present +in the Newlib iconv library. + +@itemize @bullet +@item +@emph{euc} - supports the @emph{euc_jp}, @emph{euc_kr} and @emph{euc_tw} +encodings. The @emph{euc} CES converter uses the @emph{table} and the +@emph{us_ascii} CES converters. + +@item +@emph{table} - this CES converter corresponds to "null" and just performs +tables-based conversion using 8- and 16-bit CCS tables. This converter +is also used by any other CES converter which needs the CCS table-based +conversions. The @emph{table} converter is also responsible for .cct files +loading. + +@item +@emph{table_pcs} - this is the wrapper over the @emph{table} converter +which is intended for 16-bit encodings which also use the @dfn{Portable +Character Set} (@dfn{PCS}) which is the same as the @emph{US-ASCII}. +This means, that if the first byte the CCS code is in range of [0x00-0x7f], +this is the 7-bit PCS code. Else, this is the 16-bit CCS code. Of course, +the 16-bit codes must not contain bytes in the range of [0x00-0x7f]. +The @emph{big5} encoding uses the @emph{table_pcs} CES converter and the +@emph{table_pcs} CES converter depends on the @emph{table} CES converter. + +@item +@emph{ucs_2} - intended for the @emph{ucs_2}, @emph{ucs_2be} and +@emph{ucs_2le} encodings support. + +@item +@emph{ucs_4} - intended for the @emph{ucs_4}, @emph{ucs_4be} and +@emph{ucs_4le} encodings support. + +@item +@emph{ucs_2_internal} - intended for the @emph{ucs_2_internal} encoding support. + +@item +@emph{ucs_4_internal} - intended for the @emph{ucs_4_internal} encoding support. + +@item +@emph{us_ascii} - intended for the @emph{us_ascii} encoding support. In +principle, the most natural way to support the @emph{us_ascii} encoding +is to define the @emph{us_ascii} CCS and use the @emph{table} CES +converter. But for the optimization purposes, the specialized +@emph{us_ascii} CES converter was created. + +@item +@emph{utf_16} - intended for the @emph{utf_16}, @emph{utf_16be} and +@emph{utf_16le} encodings support. + +@item +@emph{utf_8} - intended for the @emph{utf_8} encoding support. +@end itemize + + + + + +@page +@node The encodings description file +@section The encodings description file +@findex encoding.deps description file +@findex mkdeps.pl Perl script +@* +To simplify the process of adding new encodings support allowing to +automatically generate a lot of "glue" files. + +@* +There is the 'encoding.deps' file in the @emph{lib/} subdirectory which +is used to describe encoding's properties. The 'mkdeps.pl' Perl script +uses 'encoding.deps' to generates the "glue" files. + +@* +The 'encoding.deps' file is composed of sections, each section consists +of entries, each entry contains some encoding/CES/CCS description. + +@* +The 'encoding.deps' file's syntax is very simple. Currently only two +sections are defined: @emph{ENCODINGS} and @emph{CES_DEPENDENCIES}. + +@* +Each @emph{ENCODINGS} section's entry describes one encoding and +contains the following information. + +@itemize @bullet +@item +Encoding name (the @emph{ENCODING} field). The name should +be unique and only one name is possible. + +@item +The encoding's CES converter name (the @emph{CES} field). Only one CES +converter is allowed. + +@item +The whitespace-separated list of CCS table names which are used by the +encoding (the @emph{CCS} field). + +@item +The whitespace-separated list of aliases names (the @emph{ENCODING} +field). +@end itemize + +@* +Note all names in the 'encoding.deps' file have to have the normalized +form. + +@* +Each @emph{CES_DEPENDENCIES} section's entry describes dependencies of +one CES converted. For example, the @emph{euc} CES converter depends on +the @emph{table} and the @emph{us_ascii} CES converter since the +@emph{euc} CES converter uses them. This means, that both @emph{table} +and @emph{us_ascii} CES converters should be linked if the @emph{euc} +CES converter is enabled. + +@* +The @emph{CES_DEPENDENCIES} section defines the following: + +@itemize @bullet +@item +the CES converter name for which the dependencies are defined in this +entry (the @emph{CES} field); + +@item +the whitespace-separated list of CES converters which are needed for +this CES converter (the @emph{USED_CES} field). +@end itemize + +@* +The 'mktbl.pl' Perl script automatically solves the following tasks. + +@itemize @bullet +@item +User works with the iconv library in terms of encodings and doesn't know +anything about CES converters and CCS tables. The script automatically +generates code which enables all needed CES converters and CCS tables +for all encodings, which were enabled by the user. + +@item +The CES converters may have dependencies and the script automatically +generates the code which handles these dependencies. + +@item +The list of encoding's aliases is also automatically generated. + +@item +The script uses a lot of macros in order to enable only the minimum set +of code/data which is needed to support the requested encodings in the +requested directions. +@end itemize + +@* +The 'mktbl.pl' Perl script is intended to interpret the 'encoding.deps' +file and generates the following files. + +@itemize @bullet +@item +@emph{lib/encnames.h} - this header files contains macro definitions for all +encoding names + +@item +@emph{lib/aliasesbi.c} - the array of encoding names and aliases. The array +is used to find the name of requested encoding by it's alias. + +@item +@emph{ces/cesbi.c} - this file defines two arrays +(@code{_iconv_from_ucs_ces} and @code{_iconv_to_ucs_ces}) which contain +description of enabled "to UCS" and "from UCS" CES converters and the +names of encodings which are supported by these CES converters. + +@item +@emph{ces/cesbi.h} - this file contains the set of macros which defines +the set of CES converters which should be enabled if only the set of +enabled encodings is given (through macros defined in the +@emph{newlib.h} file). Note, that one CES converter may handle several +encodings. + +@item +@emph{ces/cesdeps.h} - the CES converters dependencies are handled in +this file. + +@item +@emph{ccs/ccsdeps.h} - the array of linked-in CCS tables is defined +here. + +@item +@emph{ccs/ccsnames.h} - this header files contains macro definitions for all +CCS names. + +@item +@emph{encoding.aliases} - the list of supported encodings and their +aliases which is intended for the Newlib configure scripts in order to +handle the iconv-related configure script options. +@end itemize + + + + + +@page +@node How to add new encoding +@section How to add new encoding +@* +At first, the new encoding should be broken down to CCS and CES. Then, +the process of adding new encoding is split to the following activities. + +@enumerate +@item Generate the .cct CCS file and the .c source file for the new +encoding's CCS (if it isn't already present). To do this, the CCS source +file should be had and the 'mktbl.pl' script should be used. + +@item Write the corresponding CES converter (if it isn't already +present). Use the existing CES converters as an example. + +@item +Add the corresponding entries to the 'encoding.deps' file and regenerate +the autogenerated "glue" files using the 'mkdeps.pl' script. + +@item +Don't forget to add entries to the newlib/newlib.hin file. + +@item +Of course, the 'Makefile.am'-s should also be updated (if new files were +added) and the 'Makefile.in'-s should be regenerated using the correct +version of 'automake'. + +@item +Don't forget to update the documentation (the list of +supported encodings and CES converters). +@end enumerate + +In case a new encoding doesn't fit to the CES/CCS decomposition model or +it is desired to add the specialized (non UCS-based) conversion support, +the Newlib iconv library code should be upgraded. + + + + + +@page +@node The locale support interfaces +@section The locale support interfaces +@* +The newlib iconv library also has some interface functions (besides the +@code{iconv}, @code{iconv_open} and @code{iconv_close} interfaces) which +are intended for the Locale subsystem. All the locale-related code is +placed in the @emph{lib/iconvnls.c} file. + +@* +The following is the description of the locale-related interfaces: + +@itemize @bullet +@item +@code{_iconv_nls_open} - opens two iconv descriptors for "CCS -> +wchar_t" and "wchar_t -> CCS" conversions. The normalized CCS name is +passed in the function parameters. The @emph{wchar_t} characters encoding is +either ucs_2_internal or ucs_4_internal depending on size of +@emph{wchar_t}. + +@item +@code{_iconv_nls_conv} - the function is similar to the @code{iconv} +functions, but if there is no character in the output encoding which +corresponds to the character in the input encoding, the default +conversion isn't performed (the @code{iconv} function sets such output +characters to the @kbd{?} symbol and this is the behavior, which is +specified in SUSv3). + +@item +@code{_iconv_nls_get_state} - returns the current encoding's shift state +(the @code{mbstate_t} object). + +@item +@code{_iconv_nls_set_state} sets the current encoding's shift state (the +@code{mbstate_t} object). + +@item +@code{_iconv_nls_is_stateful} - checks whether the encoding is stateful +or stateless. + +@item +@code{_iconv_nls_get_mb_cur_max} - returns the maximum length (the +maximum bytes number) of the encoding's characters. +@end itemize + + + + +@page +@node Contact +@section Contact +@* +The author of the original BSD iconv library (Alexander Chuguev) no longer +supports that code. + +@* +Any questions regarding the iconv library may be forwarded to +Artem B. Bityuckiy (dedekind@@oktetlabs.ru or dedekind@@mail.ru) as +well as to the public Newlib mailing list. + diff --git a/lib/iconv/lib/Makefile.inc b/lib/iconv/lib/Makefile.inc new file mode 100644 index 0000000..96e196c --- /dev/null +++ b/lib/iconv/lib/Makefile.inc @@ -0,0 +1,16 @@ +if ENABLE_NEWLIB_ICONV + +## The following interfaces are EL/IX level 2 +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/aliasesi.c \ + %D%/ucsconv.c \ + %D%/nullconv.c \ + %D%/iconv.c \ + %D%/aliasesbi.c \ + %D%/iconvnls.c +endif + +endif + +LIBC_CHEWOUT_FILES += %D%/iconv.def diff --git a/lib/iconv/lib/aliasesbi.c b/lib/iconv/lib/aliasesbi.c new file mode 100644 index 0000000..83b6fd0 --- /dev/null +++ b/lib/iconv/lib/aliasesbi.c @@ -0,0 +1,212 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#include <_ansi.h> +#include "encnames.h" + +const char +_iconv_aliases[] = +{ +#if defined (_ICONV_FROM_ENCODING_BIG5) \ + || defined (_ICONV_TO_ENCODING_BIG5) + ICONV_ENCODING_BIG5 " csbig5 big_five bigfive cn_big5 cp950\n" +#endif +#if defined (_ICONV_FROM_ENCODING_CP775) \ + || defined (_ICONV_TO_ENCODING_CP775) + ICONV_ENCODING_CP775 " ibm775 cspc775baltic\n" +#endif +#if defined (_ICONV_FROM_ENCODING_CP850) \ + || defined (_ICONV_TO_ENCODING_CP850) + ICONV_ENCODING_CP850 " ibm850 850 cspc850multilingual\n" +#endif +#if defined (_ICONV_FROM_ENCODING_CP852) \ + || defined (_ICONV_TO_ENCODING_CP852) + ICONV_ENCODING_CP852 " ibm852 852 cspcp852\n" +#endif +#if defined (_ICONV_FROM_ENCODING_CP855) \ + || defined (_ICONV_TO_ENCODING_CP855) + ICONV_ENCODING_CP855 " ibm855 855 csibm855\n" +#endif +#if defined (_ICONV_FROM_ENCODING_CP866) \ + || defined (_ICONV_TO_ENCODING_CP866) + ICONV_ENCODING_CP866 " 866 IBM866 CSIBM866\n" +#endif +#if defined (_ICONV_FROM_ENCODING_EUC_JP) \ + || defined (_ICONV_TO_ENCODING_EUC_JP) + ICONV_ENCODING_EUC_JP " eucjp\n" +#endif +#if defined (_ICONV_FROM_ENCODING_EUC_KR) \ + || defined (_ICONV_TO_ENCODING_EUC_KR) + ICONV_ENCODING_EUC_KR " euckr\n" +#endif +#if defined (_ICONV_FROM_ENCODING_EUC_TW) \ + || defined (_ICONV_TO_ENCODING_EUC_TW) + ICONV_ENCODING_EUC_TW " euctw\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_1) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_1) + ICONV_ENCODING_ISO_8859_1 " iso8859_1 iso88591 iso_8859_1:1987 iso_ir_100 latin1 l1 ibm819 cp819 csisolatin1\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_10) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_10) + ICONV_ENCODING_ISO_8859_10 " iso_8859_10:1992 iso_ir_157 iso885910 latin6 l6 csisolatin6 iso8859_10\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_11) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_11) + ICONV_ENCODING_ISO_8859_11 " iso8859_11 iso885911\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_13) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_13) + ICONV_ENCODING_ISO_8859_13 " iso_8859_13:1998 iso8859_13 iso885913\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_14) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_14) + ICONV_ENCODING_ISO_8859_14 " iso_8859_14:1998 iso885914 iso8859_14\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_15) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_15) + ICONV_ENCODING_ISO_8859_15 " iso885915 iso_8859_15:1998 iso8859_15 \n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_2) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_2) + ICONV_ENCODING_ISO_8859_2 " iso8859_2 iso88592 iso_8859_2:1987 iso_ir_101 latin2 l2 csisolatin2\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_3) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_3) + ICONV_ENCODING_ISO_8859_3 " iso_8859_3:1988 iso_ir_109 iso8859_3 latin3 l3 csisolatin3 iso88593\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_4) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_4) + ICONV_ENCODING_ISO_8859_4 " iso8859_4 iso88594 iso_8859_4:1988 iso_ir_110 latin4 l4 csisolatin4\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_5) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_5) + ICONV_ENCODING_ISO_8859_5 " iso8859_5 iso88595 iso_8859_5:1988 iso_ir_144 cyrillic csisolatincyrillic\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_6) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_6) + ICONV_ENCODING_ISO_8859_6 " iso_8859_6:1987 iso_ir_127 iso8859_6 ecma_114 asmo_708 arabic csisolatinarabic iso88596\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_7) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_7) + ICONV_ENCODING_ISO_8859_7 " iso_8859_7:1987 iso_ir_126 iso8859_7 elot_928 ecma_118 greek greek8 csisolatingreek iso88597\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_8) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_8) + ICONV_ENCODING_ISO_8859_8 " iso_8859_8:1988 iso_ir_138 iso8859_8 hebrew csisolatinhebrew iso88598\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_8859_9) \ + || defined (_ICONV_TO_ENCODING_ISO_8859_9) + ICONV_ENCODING_ISO_8859_9 " iso_8859_9:1989 iso_ir_148 iso8859_9 latin5 l5 csisolatin5 iso88599\n" +#endif +#if defined (_ICONV_FROM_ENCODING_ISO_IR_111) \ + || defined (_ICONV_TO_ENCODING_ISO_IR_111) + ICONV_ENCODING_ISO_IR_111 " ecma_cyrillic koi8_e koi8e csiso111ecmacyrillic\n" +#endif +#if defined (_ICONV_FROM_ENCODING_KOI8_R) \ + || defined (_ICONV_TO_ENCODING_KOI8_R) + ICONV_ENCODING_KOI8_R " cskoi8r koi8r koi8\n" +#endif +#if defined (_ICONV_FROM_ENCODING_KOI8_RU) \ + || defined (_ICONV_TO_ENCODING_KOI8_RU) + ICONV_ENCODING_KOI8_RU " koi8ru\n" +#endif +#if defined (_ICONV_FROM_ENCODING_KOI8_U) \ + || defined (_ICONV_TO_ENCODING_KOI8_U) + ICONV_ENCODING_KOI8_U " koi8u\n" +#endif +#if defined (_ICONV_FROM_ENCODING_KOI8_UNI) \ + || defined (_ICONV_TO_ENCODING_KOI8_UNI) + ICONV_ENCODING_KOI8_UNI " koi8uni\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_2) \ + || defined (_ICONV_TO_ENCODING_UCS_2) + ICONV_ENCODING_UCS_2 " ucs2 iso_10646_ucs_2 iso10646_ucs_2 iso_10646_ucs2 iso10646_ucs2 iso10646ucs2 csUnicode\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_2_INTERNAL) \ + || defined (_ICONV_TO_ENCODING_UCS_2_INTERNAL) + ICONV_ENCODING_UCS_2_INTERNAL " ucs2_internal ucs_2internal ucs2internal\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_2BE) \ + || defined (_ICONV_TO_ENCODING_UCS_2BE) + ICONV_ENCODING_UCS_2BE " ucs2be\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_2LE) \ + || defined (_ICONV_TO_ENCODING_UCS_2LE) + ICONV_ENCODING_UCS_2LE " ucs2le\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_4) \ + || defined (_ICONV_TO_ENCODING_UCS_4) + ICONV_ENCODING_UCS_4 " ucs4 iso_10646_ucs_4 iso10646_ucs_4 iso_10646_ucs4 iso10646_ucs4 iso10646ucs4\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_4_INTERNAL) \ + || defined (_ICONV_TO_ENCODING_UCS_4_INTERNAL) + ICONV_ENCODING_UCS_4_INTERNAL " ucs4_internal ucs_4internal ucs4internal\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_4BE) \ + || defined (_ICONV_TO_ENCODING_UCS_4BE) + ICONV_ENCODING_UCS_4BE " ucs4be\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UCS_4LE) \ + || defined (_ICONV_TO_ENCODING_UCS_4LE) + ICONV_ENCODING_UCS_4LE " ucs4le\n" +#endif +#if defined (_ICONV_FROM_ENCODING_US_ASCII) \ + || defined (_ICONV_TO_ENCODING_US_ASCII) + ICONV_ENCODING_US_ASCII " ansi_x3.4_1968 ansi_x3.4_1986 iso_646.irv:1991 ascii iso646_us us ibm367 cp367 csascii \n" +#endif +#if defined (_ICONV_FROM_ENCODING_UTF_16) \ + || defined (_ICONV_TO_ENCODING_UTF_16) + ICONV_ENCODING_UTF_16 " utf16\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UTF_16BE) \ + || defined (_ICONV_TO_ENCODING_UTF_16BE) + ICONV_ENCODING_UTF_16BE " utf16be\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UTF_16LE) \ + || defined (_ICONV_TO_ENCODING_UTF_16LE) + ICONV_ENCODING_UTF_16LE " utf16le\n" +#endif +#if defined (_ICONV_FROM_ENCODING_UTF_8) \ + || defined (_ICONV_TO_ENCODING_UTF_8) + ICONV_ENCODING_UTF_8 " utf8\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1250) \ + || defined (_ICONV_TO_ENCODING_WIN_1250) + ICONV_ENCODING_WIN_1250 " cp1250\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1251) \ + || defined (_ICONV_TO_ENCODING_WIN_1251) + ICONV_ENCODING_WIN_1251 " cp1251\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1252) \ + || defined (_ICONV_TO_ENCODING_WIN_1252) + ICONV_ENCODING_WIN_1252 " cp1252\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1253) \ + || defined (_ICONV_TO_ENCODING_WIN_1253) + ICONV_ENCODING_WIN_1253 " cp1253\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1254) \ + || defined (_ICONV_TO_ENCODING_WIN_1254) + ICONV_ENCODING_WIN_1254 " cp1254\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1255) \ + || defined (_ICONV_TO_ENCODING_WIN_1255) + ICONV_ENCODING_WIN_1255 " cp1255\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1256) \ + || defined (_ICONV_TO_ENCODING_WIN_1256) + ICONV_ENCODING_WIN_1256 " cp1256\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1257) \ + || defined (_ICONV_TO_ENCODING_WIN_1257) + ICONV_ENCODING_WIN_1257 " cp1257\n" +#endif +#if defined (_ICONV_FROM_ENCODING_WIN_1258) \ + || defined (_ICONV_TO_ENCODING_WIN_1258) + ICONV_ENCODING_WIN_1258 " cp1258\n" +#endif + "" +}; diff --git a/lib/iconv/lib/aliasesi.c b/lib/iconv/lib/aliasesi.c new file mode 100644 index 0000000..ef5ce41 --- /dev/null +++ b/lib/iconv/lib/aliasesi.c @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +/* + * canonical_form - canonize 'str'. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process. + * const char *str - string to canonize. + * + * DESCRIPTION: + * Converts all letters to small and substitute all '-' characters by '_' + * characters. + * + * RETURN: + * Returns canonical form of 'str' if success, NULL if failure. + */ +static const char * +canonical_form (struct _reent *rptr, + const char *str) +{ + char *p, *p1; + + if (str == NULL || (p = p1 = _strdup_r (rptr, str)) == NULL) + return (const char *)NULL; + + for (; *str; str++, p++) + { + if (*str == '-') + *p = '_'; + else + *p = tolower (*str); + } + + return (const char *)p1; +} + +/* + * find_alias - find encoding name name by it's alias. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process. + * const char *alias - alias by which "official" name should be found. + * const char *table - aliases table. + * int len - aliases table length. + * + * DESCRIPTION: + * 'table' contains the list of encoding names and aliases. + * Names go first, e.g.: + * + * name1 alias11 alias12 alias1N + * name2 alias21 alias22 alias2N + * nameM aliasM1 aliasM2 aliasMN + * + * If line begins with backspace it is considered as the continuation of + * previous line. + * + * RETURN: + * Returns pointer to name found if success. In case of error returns NULL + * and sets current thread's/process's errno. + */ +static char * +find_alias (struct _reent *rptr, + const char *alias, + const char *table, + int len) +{ + const char *end; + const char *p; + int l = strlen (alias); + const char *ptable = table; + const char *table_end = table + len; + + if (table == NULL || alias == NULL || *table == '\0' || *alias == '\0') + return NULL; + +search_again: + if (len < l || (p = strnstr (ptable, alias, len)) == NULL) + return NULL; + + /* Check that substring is segregated by '\n', '\t' or ' ' */ + if (!((p == table || isspace (*(p-1)) || *(p-1) == '\n') + && (p+l == table_end || isspace (*(p+l)) || *(p+l) == '\n'))) + { + ptable = p + l; + len = table_end - ptable; + goto search_again; + } + + while(--p > table && *p != '\n'); + + if (*(++p) == '#') + return NULL; + + for (end = p + 1; !isspace (*end) && *end != '\n' && *end != '\0'; end++); + + return _strndup_r (rptr, p, (size_t)(end - p)); +} + +/* + * _iconv_resolve_encoding_name - resolves encoding's name by given alias. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process. + * const char *ca - encoding alias to resolve. + * + * DESCRIPTION: + * First, tries to find 'ca' among built-in aliases. If not found, tries to + * find it external file. + * + * RETURN: + * Encoding name if found. In case of error returns NULL + * and sets current thread's/process's errno. + */ +char * +_iconv_resolve_encoding_name (struct _reent *rptr, + const char *ca) +{ + char *p = (char *)ca; + + /* Alias shouldn't contain white spaces, '\n' and '\r' symbols */ + while (*p) + if (*p == ' ' || *p == '\r' || *p++ == '\n') + return NULL; + + if ((ca = canonical_form (rptr, ca)) == NULL) + return NULL; + + p = find_alias (rptr, ca, _iconv_aliases, strlen (_iconv_aliases)); + + _free_r (rptr, (void *)ca); + return p; +} + diff --git a/lib/iconv/lib/conv.h b/lib/iconv/lib/conv.h new file mode 100644 index 0000000..658ab91 --- /dev/null +++ b/lib/iconv/lib/conv.h @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef __ICONV_CONVERSION_H__ +#define __ICONV_CONVERSION_H__ + +#include <_ansi.h> +#include +#include +#include + +/* Bits for 'flags' parameter of 'convert' call */ +#define ICONV_DONT_SAVE_BIT 1 +#define ICONV_FAIL_BIT 2 + +/* + * iconv_conversion_handlers_t - keeps iconv conversion handlers. + * + * Keeps 6 interface function handlers: + * open(), close(), convert(), get_mb_cur_max(), get_state(), set_state(), + * get_mb_cur_max() and is_stateful(). Last 5 interface functions are needed to + * support locale subsystem. + * + * ============================================================================ + */ +typedef struct +{ + /* + * open - open and initialize conversion. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process; + * const char *to - output encoding's normalized name; + * const char *from - input encoding's normalized name. + * + * DESCRIPTION: + * This function is called from iconv_open() to open conversion. Returns + * a pointer to conversion-specific data. + * + * RETURN: + * Pointer to conversion-specific data if success. In case of error + * returns NULL and sets current thread's/process's errno. + */ + void *(*open) (struct _reent *rptr, + const char *to, + const char *from); + + /* + * close - close conversion. + * + * PARAMETRS: + * struct _reent *rptr - reent structure of current thread/process; + * void *data - conversion-specific data. + * + * DESCRIPTION: + * This function is called from iconv_close() to close conversion. + * + * RETURN: + * When successful, returns (size_t)0. In case of error, sets current + * thread's/process's errno and returns (size_t)-1 (same as iconv_open()). + */ + size_t (*close) (struct _reent *rptr, + void *data); + + /* convert - perform encoding conversion. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process. + * void *data - conversion-specific data; + * const unsigned char **inbuf - input data buffer; + * size_t *inbytesleft - input buffer's length; + * unsigned char **outbuf - output data buffer; + * size_t *outbytesleft - output buffer free space; + * int flags - conversion options. + * + * DESCRIPTION: + * This function is called from iconv() to perform conversion and, if 'flags' + * is 0, behaves similarly to iconv(). 'inbuf', 'inbytesleft', 'outbuf' and + * 'outbytesleft' are same as in case of iconv() function. + * + * When flags & 1 isn't 0, 'outbuf' value is ignored and result isn't saved. + * Another conversion aspects aren't changed. + * + * When flags & 2 isn't 0, function changes it's behavior in situations, + * when there is no character in "to" encoding that corresponds to valid + * character from "from" encoding. iconv() specification stands to perform + * implimentation-spacific default conversion. If flag & 2 isn't 0, + * function generates error. + * + * RETURN: + * Returns the number of characters converted in a non-reversible way. + * Reversible conversions are not counted. In case of error, sets current + * thread's/process's errno and returns (size_t)-1 (same as iconv()). + */ + size_t (*convert) (struct _reent *rptr, + void *data, + const unsigned char **inbuf, + size_t *inbytesleft, + unsigned char **outbuf, + size_t *outbytesleft, + int flags); + + /* + * get_state - get current shift state. + * + * PARAMETERS: + * void *data - conversion-specific data; + * mbstate_t *state - mbstate_t object where shift state will be written; + * int direction - 0-"from", 1-"to". + * + * DESCRIPTION: + * Returns encoding's current shift sequence. + * If 'direction' is 0, "from" encoding is tested, else + * "to" encoding is tested. + */ + void (*get_state) (void *data, + mbstate_t *state, + int direction); + + /* + * set_state - set shift state. + * + * PARAMETERS: + * void *data - conversion-specific data; + * mbstate_t *state - mbstate_t object to which shift state will be set. + * int direction - 0-"from", 1-"to". + * + * DESCRIPTION: + * Sets encoding's current shift state to 'state'. if 'state' + * object is zero-object - reset current shift state. + * If 'direction' is 0, "from" encoding is set, else + * "to" encoding is set. + * Returns 0 if '*state' object has right format, -1 else. + */ + int (*set_state) (void *data, + mbstate_t *state, + int direction); + + /* + * get_mb_cur_max - get maximum character length in bytes. + * + * PARAMETERS: + * void *data - conversion-specific data; + * int direction - 0-"from", 1-"to". + * + * DESCRIPTION: + * Returns encoding's maximum character length. + * If 'direction' is 0, "from" encoding is tested, else + * "to" encoding is tested. + */ + int (*get_mb_cur_max) (void *data, + int direction); + + /* + * is_stateful - is encoding stateful or stateless. + * + * PARAMETERS: + * void *data - conversion-specific data; + * int direction - 0-"from", 1-"to". + * + * DESCRIPTION: + * Returns 0 if encoding is stateless and 1 if stateful. + * If 'direction' is 0, "from" encoding is tested, else + * "to" encoding is tested. + */ + int (*is_stateful) (void *data, + int direction); + +} iconv_conversion_handlers_t; + + +/* + * iconv_conversion_t - iconv conversion definition structure. + * + * ============================================================================ + */ +typedef struct +{ + /* Iconv conversion handlers. */ + const iconv_conversion_handlers_t *handlers; + + /* + * Conversion-specific data (e.g., points to iconv_ucs_conversion_t + * object if UCS-based conversion is used). + */ + void *data; +} iconv_conversion_t; + + +/* UCS-based conversion handlers */ +extern const iconv_conversion_handlers_t +_iconv_ucs_conversion_handlers; + +/* Null conversion handlers */ +extern const iconv_conversion_handlers_t +_iconv_null_conversion_handlers; + +#endif /* !__ICONV_CONVERSION_H__ */ + diff --git a/lib/iconv/lib/encnames.h b/lib/iconv/lib/encnames.h new file mode 100644 index 0000000..9ca16ad --- /dev/null +++ b/lib/iconv/lib/encnames.h @@ -0,0 +1,63 @@ +/* + * This file was automatically generated mkdeps.pl script. Don't edit. + */ + +#ifndef __ENCNAMES_H__ +#define __ENCNAMES_H__ + +/* + * Encodings name macros. + */ +#define ICONV_ENCODING_BIG5 "big5" +#define ICONV_ENCODING_CP775 "cp775" +#define ICONV_ENCODING_CP850 "cp850" +#define ICONV_ENCODING_CP852 "cp852" +#define ICONV_ENCODING_CP855 "cp855" +#define ICONV_ENCODING_CP866 "cp866" +#define ICONV_ENCODING_EUC_JP "euc_jp" +#define ICONV_ENCODING_EUC_KR "euc_kr" +#define ICONV_ENCODING_EUC_TW "euc_tw" +#define ICONV_ENCODING_ISO_8859_1 "iso_8859_1" +#define ICONV_ENCODING_ISO_8859_10 "iso_8859_10" +#define ICONV_ENCODING_ISO_8859_11 "iso_8859_11" +#define ICONV_ENCODING_ISO_8859_13 "iso_8859_13" +#define ICONV_ENCODING_ISO_8859_14 "iso_8859_14" +#define ICONV_ENCODING_ISO_8859_15 "iso_8859_15" +#define ICONV_ENCODING_ISO_8859_2 "iso_8859_2" +#define ICONV_ENCODING_ISO_8859_3 "iso_8859_3" +#define ICONV_ENCODING_ISO_8859_4 "iso_8859_4" +#define ICONV_ENCODING_ISO_8859_5 "iso_8859_5" +#define ICONV_ENCODING_ISO_8859_6 "iso_8859_6" +#define ICONV_ENCODING_ISO_8859_7 "iso_8859_7" +#define ICONV_ENCODING_ISO_8859_8 "iso_8859_8" +#define ICONV_ENCODING_ISO_8859_9 "iso_8859_9" +#define ICONV_ENCODING_ISO_IR_111 "iso_ir_111" +#define ICONV_ENCODING_KOI8_R "koi8_r" +#define ICONV_ENCODING_KOI8_RU "koi8_ru" +#define ICONV_ENCODING_KOI8_U "koi8_u" +#define ICONV_ENCODING_KOI8_UNI "koi8_uni" +#define ICONV_ENCODING_UCS_2 "ucs_2" +#define ICONV_ENCODING_UCS_2_INTERNAL "ucs_2_internal" +#define ICONV_ENCODING_UCS_2BE "ucs_2be" +#define ICONV_ENCODING_UCS_2LE "ucs_2le" +#define ICONV_ENCODING_UCS_4 "ucs_4" +#define ICONV_ENCODING_UCS_4_INTERNAL "ucs_4_internal" +#define ICONV_ENCODING_UCS_4BE "ucs_4be" +#define ICONV_ENCODING_UCS_4LE "ucs_4le" +#define ICONV_ENCODING_US_ASCII "us_ascii" +#define ICONV_ENCODING_UTF_16 "utf_16" +#define ICONV_ENCODING_UTF_16BE "utf_16be" +#define ICONV_ENCODING_UTF_16LE "utf_16le" +#define ICONV_ENCODING_UTF_8 "utf_8" +#define ICONV_ENCODING_WIN_1250 "win_1250" +#define ICONV_ENCODING_WIN_1251 "win_1251" +#define ICONV_ENCODING_WIN_1252 "win_1252" +#define ICONV_ENCODING_WIN_1253 "win_1253" +#define ICONV_ENCODING_WIN_1254 "win_1254" +#define ICONV_ENCODING_WIN_1255 "win_1255" +#define ICONV_ENCODING_WIN_1256 "win_1256" +#define ICONV_ENCODING_WIN_1257 "win_1257" +#define ICONV_ENCODING_WIN_1258 "win_1258" + +#endif /* !__ENCNAMES_H__ */ + diff --git a/lib/iconv/lib/encoding.deps b/lib/iconv/lib/encoding.deps new file mode 100644 index 0000000..280cffd --- /dev/null +++ b/lib/iconv/lib/encoding.deps @@ -0,0 +1,441 @@ +# +# This file describes dependencies between encodings, CES, CCS, etc. +# File relates only to UCS-based conversions and is needed for automatic +# generation of C source files and C header files. +# +# This configuration file consists of sections, each section consists of +# entries. +# +# Use only normalized names. +# + +# +# The first section named "ENCODINGS" describes: +# 1. CES converter corresponding for each enoding; +# 2. Each encoding's aliases; +# 3. CCS tables corresponding for each enoding. +# +SECTION ENCODINGS + +# ISO-10646-UCS-2. Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: ucs_2 +CES: ucs_2 +ALIASES: ucs2 iso_10646_ucs_2 iso10646_ucs_2 iso_10646_ucs2 iso10646_ucs2 iso10646ucs2 csUnicode +ENTRY END + +# Big Endian version of ISO-10646-UCS-2 (in fact, equivalent to ucs_2). +# Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: ucs_2be +CES: ucs_2 +ALIASES: ucs2be +ENTRY END + +# Little Endian version of ISO-10646-UCS-2. +# Little Endian, NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: ucs_2le +CES: ucs_2 +ALIASES: ucs2le +ENTRY END + +# ISO-10646-UCS-2 in system byte order. +# NBSP is always interpreted as NBSP (BOM isn't supported). +# NOTE: Dont delete and rename this since it is used as widechar's +# encoding when sizeof(wchar_t) == 2 +ENTRY +ENCODING: ucs_2_internal +CES: ucs_2_internal +ALIASES: ucs2_internal ucs_2internal ucs2internal +ENTRY END + +# ISO-10646-UCS-4. Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: ucs_4 +CES: ucs_4 +ALIASES: ucs4 iso_10646_ucs_4 iso10646_ucs_4 iso_10646_ucs4 iso10646_ucs4 iso10646ucs4 +ENTRY END + +# Big Endian version of ISO-10646-UCS-4 (in fact, equivalent to ucs_4). +# Big Endian, NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: ucs_4be +CES: ucs_4 +ALIASES: ucs4be +ENTRY END + +# Little Endian version of ISO-10646-UCS-4. +# Little Endian, NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: ucs_4le +CES: ucs_4 +ALIASES: ucs4le +ENTRY END + +# ISO-10646-UCS-4 in system byte order. +# NBSP is always interpreted as NBSP (BOM isn't supported). +# NOTE: Dont delete and rename this since it is used as widechar's +# encoding when sizeof(wchar_t) == 4 +ENTRY +ENCODING: ucs_4_internal +CES: ucs_4_internal +ALIASES: ucs4_internal ucs_4internal ucs4internal +ENTRY END + +# RFC 3629 UTF-8 +ENTRY +ENCODING: utf_8 +CES: utf_8 +ALIASES: utf8 +ENTRY END + +# RFC 2781 UTF-16. The very first NBSP code in stream is interpreted as BOM. +ENTRY +ENCODING: utf_16 +CES: utf_16 +ALIASES: utf16 +ENTRY END + +# Big Endian version of RFC 2781 UTF-16. +# NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: utf_16be +CES: utf_16 +ALIASES: utf16be +ENTRY END + +# Little Endian version of RFC 2781 UTF-16. +# NBSP is always interpreted as NBSP (BOM isn't supported). +ENTRY +ENCODING: utf_16le +CES: utf_16 +ALIASES: utf16le +ENTRY END + +# 7-bit ASCII. +ENTRY +ENCODING: us_ascii +CES: us_ascii +ALIASES: ansi_x3.4_1968 ansi_x3.4_1986 iso_646.irv:1991 ascii iso646_us us ibm367 cp367 csascii +ENTRY END + +# RFC 1489 Cyrillic +ENTRY +ENCODING: koi8_r +CES: table +CCS: koi8_r +ALIASES: cskoi8r koi8r koi8 +ENTRY END + +# Obsoleted Ukrainian +ENTRY +ENCODING: koi8_ru +CES: table +CCS: koi8_ru +ALIASES: koi8ru +ENTRY END + +# RFC 2319 Ukrainian +ENTRY +ENCODING: koi8_u +CES: table +CCS: koi8_u +ALIASES: koi8u +ENTRY END + +# KOI8 Unified +ENTRY +ENCODING: koi8_uni +CES: table +CCS: koi8_uni +ALIASES: koi8uni +ENTRY END + +# ISO IR 111/ECMA Cyrillic. +ENTRY +ENCODING: iso_ir_111 +CES: table +CCS: iso_ir_111 +ALIASES: ecma_cyrillic koi8_e koi8e csiso111ecmacyrillic +ENTRY END + +# ISO 8859-1:1987 - Latin 1, West European +ENTRY +ENCODING: iso_8859_1 +CES: table +CCS: iso_8859_1 +ALIASES: iso8859_1 iso88591 iso_8859_1:1987 iso_ir_100 latin1 l1 ibm819 cp819 csisolatin1 +ENTRY END + +# ISO 8859-2:1987 - Latin 2, East European +ENTRY +ENCODING: iso_8859_2 +CES: table +CCS: iso_8859_2 +ALIASES: iso8859_2 iso88592 iso_8859_2:1987 iso_ir_101 latin2 l2 csisolatin2 +ENTRY END + +# ISO 8859-3:1988 - Latin 3, South European +ENTRY +ENCODING: iso_8859_3 +CES: table +CCS: iso_8859_3 +ALIASES: iso_8859_3:1988 iso_ir_109 iso8859_3 latin3 l3 csisolatin3 iso88593 +ENTRY END + +# ISO 8859-4:1988 - Latin 4, North European +ENTRY +ENCODING: iso_8859_4 +CES: table +CCS: iso_8859_4 +ALIASES: iso8859_4 iso88594 iso_8859_4:1988 iso_ir_110 latin4 l4 csisolatin4 +ENTRY END + +# ISO 8859-5:1988 - Cyrillic +ENTRY +ENCODING: iso_8859_5 +CES: table +CCS: iso_8859_5 +ALIASES: iso8859_5 iso88595 iso_8859_5:1988 iso_ir_144 cyrillic csisolatincyrillic +ENTRY END + +# ISO i8859-6:1987 - Arabic +ENTRY +ENCODING: iso_8859_6 +CES: table +CCS: iso_8859_6 +ALIASES: iso_8859_6:1987 iso_ir_127 iso8859_6 ecma_114 asmo_708 arabic csisolatinarabic iso88596 +ENTRY END + +# ISO 8859-7:1987 - Greek +ENTRY +ENCODING: iso_8859_7 +CES: table +CCS: iso_8859_7 +ALIASES: iso_8859_7:1987 iso_ir_126 iso8859_7 elot_928 ecma_118 greek greek8 csisolatingreek iso88597 +ENTRY END + +# ISO 8859-8:1988 - Hebrew +ENTRY +ENCODING: iso_8859_8 +CES: table +CCS: iso_8859_8 +ALIASES: iso_8859_8:1988 iso_ir_138 iso8859_8 hebrew csisolatinhebrew iso88598 +ENTRY END + +# ISO 8859-9:1989 - Latin 5, Turkish +ENTRY +ENCODING: iso_8859_9 +CES: table +CCS: iso_8859_9 +ALIASES: iso_8859_9:1989 iso_ir_148 iso8859_9 latin5 l5 csisolatin5 iso88599 +ENTRY END + +# ISO 8859-10:1992 - Latin 6, Nordic +ENTRY +ENCODING: iso_8859_10 +CES: table +CCS: iso_8859_10 +ALIASES: iso_8859_10:1992 iso_ir_157 iso885910 latin6 l6 csisolatin6 iso8859_10 +ENTRY END + +# ISO 8859-11 - Thai +ENTRY +ENCODING: iso_8859_11 +CES: table +CCS: iso_8859_11 +ALIASES: iso8859_11 iso885911 +ENTRY END + +# ISO 8859-13:1998 - Latin 7, Baltic Rim +ENTRY +ENCODING: iso_8859_13 +CES: table +CCS: iso_8859_13 +ALIASES: iso_8859_13:1998 iso8859_13 iso885913 +ENTRY END + +# ISO 8859-14:1998 - Latin 8, Celtic +ENTRY +ENCODING: iso_8859_14 +CES: table +CCS: iso_8859_14 +ALIASES: iso_8859_14:1998 iso885914 iso8859_14 +ENTRY END + +# ISO 8859-15:1998 - Latin 9, West Europe, successor of Latin 1 +ENTRY +ENCODING: iso_8859_15 +CES: table +CCS: iso_8859_15 +ALIASES: iso885915 iso_8859_15:1998 iso8859_15 +ENTRY END + +# Win-1250 +ENTRY +ENCODING: win_1250 +CES: table +CCS: win_1250 +ALIASES: cp1250 +ENTRY END + +# Win-1251 - Cyrillic +ENTRY +ENCODING: win_1251 +CES: table +CCS: win_1251 +ALIASES: cp1251 +ENTRY END + +# Win-1252 - Latin 1 +ENTRY +ENCODING: win_1252 +CES: table +CCS: win_1252 +ALIASES: cp1252 +ENTRY END + +# Win-1253 - Greek +ENTRY +ENCODING: win_1253 +CES: table +CCS: win_1253 +ALIASES: cp1253 +ENTRY END + +# Win-1254 - Turkish +ENTRY +ENCODING: win_1254 +CES: table +CCS: win_1254 +ALIASES: cp1254 +ENTRY END + +# Win-1255 - Hebrew +ENTRY +ENCODING: win_1255 +CES: table +CCS: win_1255 +ALIASES: cp1255 +ENTRY END + +# Win-1256 - Arabic +ENTRY +ENCODING: win_1256 +CES: table +CCS: win_1256 +ALIASES: cp1256 +ENTRY END + +# Win-1257 - Baltic +ENTRY +ENCODING: win_1257 +CES: table +CCS: win_1257 +ALIASES: cp1257 +ENTRY END + +# Win-1258 - Vietnamese7 that supports Cyrillic +ENTRY +ENCODING: win_1258 +CES: table +CCS: win_1258 +ALIASES: cp1258 +ENTRY END + +# big5 - an encoding for Traditional Chinese +ENTRY +ENCODING: big5 +CES: table_pcs +CCS: big5 +ALIASES: csbig5 big_five bigfive cn_big5 cp950 +ENTRY END + +# IBM 775 - an updated version of CP 437 that supports balitic languages. +ENTRY +ENCODING: cp775 +CES: table +CCS: cp775 +ALIASES: ibm775 cspc775baltic +ENTRY END + +# IBM 850 - an updated version of CP 437 where several Latin 1 characters have been +# added instead of some less-often used characters like line-drawing and greek ones. +ENTRY +ENCODING: cp850 +CES: table +CCS: cp850 +ALIASES: ibm850 850 cspc850multilingual +ENTRY END + +# IBM 852 - an updated version of CP 437 where several Latin 2 characters have been added +# instead of some less-often used characters like line-drawing and greek ones. +ENTRY +ENCODING: cp852 +CES: table +CCS: cp852 +ALIASES: ibm852 852 cspcp852 +ENTRY END + +# IBM 855 - an updated version of CP 437 that supports Cyrillic. +ENTRY +ENCODING: cp855 +CES: table +CCS: cp855 +ALIASES: ibm855 855 csibm855 +ENTRY END + +# IBM 866 - an updated version of CP 855 which followes the more logical Russian alphabet +# ordering of the alternativny variant that is preferred by many Russian users. +ENTRY +ENCODING: cp866 +CES: table +CCS: cp866 +ALIASES: 866 IBM866 CSIBM866 +ENTRY END + +# EUC-JP - The EUC for Japanese +ENTRY +ENCODING: euc_jp +CES: euc +CCS: jis_x0208_1990 jis_x0201_1976 jis_x0212_1990 +ALIASES: eucjp +ENTRY END + +# EUC-KR - The EUC for Korean +ENTRY +ENCODING: euc_kr +CES: euc +CCS: ksx1001 +ALIASES: euckr +ENTRY END + +# EUC-TW - The EUC for Traditional Chinese +ENTRY +ENCODING: euc_tw +CES: euc +CCS: cns11643_plane1 cns11643_plane2 cns11643_plane14 +ALIASES: euctw +ENTRY END + +SECTION END + +# +# This section is named "CES_DEPENDENCIES" and describes dependencies +# between CES converters (some CES converters may use another CES converters). +# +SECTION CES_DEPENDENCIES + +ENTRY +CES: table_pcs +USED_CES: table +ENTRY END + +ENTRY +CES: euc +USED_CES: table us_ascii +ENTRY END + +SECTION END + diff --git a/lib/iconv/lib/endian.h b/lib/iconv/lib/endian.h new file mode 100644 index 0000000..2db6c6d --- /dev/null +++ b/lib/iconv/lib/endian.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef __ICONV_CES_ENDIAN_H__ +#define __ICONV_CES_ENDIAN_H__ + +#include + +#if (BYTE_ORDER == LITTLE_ENDIAN) + +# define ICONV_BETOHS(s) \ + ((((s) << 8) & 0xFF00) | (((s) >> 8) & 0x00FF)) + +# define ICONV_BETOHL(l) \ + ((((l) << 24) & 0xFF000000) | \ + (((l) << 8) & 0x00FF0000) | \ + (((l) >> 8) & 0x0000FF00) | \ + (((l) >> 24) & 0x000000FF)) + +# define ICONV_LETOHS(s) (s) +# define ICONV_LETOHL(l) (l) + +# define ICONV_HTOLES(s) ICONV_LETOHS (s) +# define ICONV_HTOLEL(l) ICONV_LETOHL (l) +# define ICONV_HTOBES(s) ICONV_BETOHS (s) +# define ICONV_HTOBEL(l) ICONV_BETOHL (l) + +#elif (BYTE_ORDER == BIG_ENDIAN) + +# define ICONV_BETOHS(s) (s) +# define ICONV_BETOHL(l) (l) + +# define ICONV_LETOHS(s) \ + ((((s) << 8) & 0xFF00) | (((s) >> 8) & 0x00FF)) + +# define ICONV_LETOHL(l) \ + ((((l) << 24) & 0xFF000000) | \ + (((l) << 8) & 0x00FF0000) | \ + (((l) >> 8) & 0x0000FF00) | \ + (((l) >> 24) & 0x000000FF)) + +# define ICONV_HTOBES(s) ICONV_BETOHS (s) +# define ICONV_HTOBEL(l) ICONV_BETOHL (l) +# define ICONV_HTOLES(s) ICONV_LETOHS (s) +# define ICONV_HTOLEL(l) ICONV_LETOHL (l) + +#else +# error "Unknown byte order." +#endif + +#endif /* !__ICONV_CES_ENDIAN_H__ */ + diff --git a/lib/iconv/lib/iconv.c b/lib/iconv/lib/iconv.c new file mode 100644 index 0000000..458541c --- /dev/null +++ b/lib/iconv/lib/iconv.c @@ -0,0 +1,307 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>---charset conversion routines + +INDEX + iconv +INDEX + iconv_open +INDEX + iconv_close +INDEX + _iconv_r +INDEX + _iconv_open_r +INDEX + _iconv_close_r + +SYNOPSIS + #include + iconv_t iconv_open (const char *<[to]>, const char *<[from]>); + int iconv_close (iconv_t <[cd]>); + size_t iconv (iconv_t <[cd]>, char **restrict <[inbuf]>, + size_t *restrict <[inbytesleft]>, + char **restrict <[outbuf]>, + size_t *restrict <[outbytesleft]>); + + iconv_t _iconv_open_r (struct _reent *<[rptr]>, + const char *<[to]>, const char *<[from]>); + int _iconv_close_r (struct _reent *<[rptr]>, iconv_t <[cd]>); + size_t _iconv_r (struct _reent *<[rptr]>, + iconv_t <[cd]>, const char **<[inbuf]>, + size_t *<[inbytesleft]>, + char **<[outbuf]>, size_t *<[outbytesleft]>); + +DESCRIPTION +The function <> converts characters from <[in]> which are in one +encoding to characters of another encoding, outputting them to <[out]>. +The value <[inleft]> specifies the number of input bytes to convert whereas +the value <[outleft]> specifies the size remaining in the <[out]> buffer. +The conversion descriptor <[cd]> specifies the conversion being performed +and is created via <>. + +An <> conversion stops if: the input bytes are exhausted, the output +buffer is full, an invalid input character sequence occurs, or the +conversion specifier is invalid. + +The function <> is used to specify a conversion from one +encoding: <[from]> to another: <[to]>. The result of the call is +to create a conversion specifier that can be used with <>. + +The function <> is used to close a conversion specifier after +it is no longer needed. + +The <<_iconv_r>>, <<_iconv_open_r>>, and <<_iconv_close_r>> functions are +reentrant versions of <>, <>, and <>, +respectively. An additional reentrancy struct pointer: <[rptr]> is passed +to properly set <>. + +RETURNS +The <> function returns the number of non-identical conversions +performed. If an error occurs, (size_t)-1 is returned and <> +is set appropriately. The values of <[inleft]>, <[in]>, <[out]>, +and <[outleft]> are modified to indicate how much input was processed +and how much output was created. + +The <> function returns either a valid conversion specifier +or (iconv_t)-1 to indicate failure. If failure occurs, <> is set +appropriately. + +The <> function returns 0 on success or -1 on failure. +If failure occurs <> is set appropriately. + +PORTABILITY +<>, <>, and <> are non-ANSI and are specified +by the Single Unix specification. + +No supporting OS subroutine calls are required. +*/ +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "conv.h" +#include "ucsconv.h" + +/* + * iconv interface functions as specified by Single Unix specification. + */ + +iconv_t +iconv_open (const char *to, + const char *from) +{ + return _iconv_open_r (_REENT, to, from); +} + + +size_t +iconv (iconv_t cd, + char **__restrict inbuf, + size_t *__restrict inbytesleft, + char **__restrict outbuf, + size_t *__restrict outbytesleft) +{ + return _iconv_r (_REENT, cd, (const char **) inbuf, inbytesleft, + outbuf, outbytesleft); +} + + +int +iconv_close (iconv_t cd) +{ + return _iconv_close_r (_REENT, cd); +} + + +#ifndef _REENT_ONLY +iconv_t +_iconv_open_r (struct _reent *rptr, + const char *to, + const char *from) +{ + iconv_conversion_t *ic; + + if (to == NULL || from == NULL || *to == '\0' || *from == '\0') + return (iconv_t)-1; + + if ((to = (const char *)_iconv_resolve_encoding_name (rptr, to)) == NULL) + return (iconv_t)-1; + + if ((from = (const char *)_iconv_resolve_encoding_name (rptr, from)) == NULL) + { + _free_r (rptr, (void *)to); + return (iconv_t)-1; + } + + ic = (iconv_conversion_t *)_malloc_r (rptr, sizeof (iconv_conversion_t)); + if (ic == NULL) + return (iconv_t)-1; + + /* Select which conversion type to use */ + if (strcmp (from, to) == 0) + { + /* Use null conversion */ + ic->handlers = &_iconv_null_conversion_handlers; + ic->data = ic->handlers->open (rptr, to, from); + } + else + { + /* Use UCS-based conversion */ + ic->handlers = &_iconv_ucs_conversion_handlers; + ic->data = ic->handlers->open (rptr, to, from); + } + + _free_r (rptr, (void *)to); + _free_r (rptr, (void *)from); + + if (ic->data == NULL) + { + _free_r (rptr, (void *)ic); + return (iconv_t)-1; + } + + return (void *)ic; +} + + +size_t +_iconv_r (struct _reent *rptr, + iconv_t cd, + const char **inbuf, + size_t *inbytesleft, + char **outbuf, + size_t *outbytesleft) +{ + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + + if ((void *)cd == NULL || cd == (iconv_t)-1 || ic->data == NULL + || (ic->handlers != &_iconv_null_conversion_handlers + && ic->handlers != &_iconv_ucs_conversion_handlers)) + { + _REENT_ERRNO (rptr) = EBADF; + return (size_t)-1; + } + + if (inbuf == NULL || *inbuf == NULL) + { + mbstate_t state_null = ICONV_ZERO_MB_STATE_T; + + if (!ic->handlers->is_stateful(ic->data, 1)) + return (size_t)0; + + if (outbuf == NULL || *outbuf == NULL) + { + /* Reset shift state */ + ic->handlers->set_state (ic->data, &state_null, 1); + + return (size_t)0; + } + + if (outbytesleft != NULL) + { + mbstate_t state_save = ICONV_ZERO_MB_STATE_T; + + /* Save current shift state */ + ic->handlers->get_state (ic->data, &state_save, 1); + + /* Reset shift state */ + ic->handlers->set_state (ic->data, &state_null, 1); + + /* Get initial shift state sequence and it's length */ + ic->handlers->get_state (ic->data, &state_null, 1); + + if (*outbytesleft >= state_null.__count) + { + memcpy ((void *)(*outbuf), (void *)&state_null, state_null.__count); + + *outbuf += state_null.__count; + *outbytesleft -= state_null.__count; + + return (size_t)0; + } + + /* Restore shift state if output buffer is too small */ + ic->handlers->set_state (ic->data, &state_save, 1); + } + + _REENT_ERRNO (rptr) = E2BIG; + return (size_t)-1; + } + + if (*inbytesleft == 0) + { + _REENT_ERRNO (rptr) = EINVAL; + return (size_t)-1; + } + + if (*outbytesleft == 0 || *outbuf == NULL) + { + _REENT_ERRNO (rptr) = E2BIG; + return (size_t)-1; + } + + return ic->handlers->convert (rptr, + ic->data, + (const unsigned char**)inbuf, + inbytesleft, + (unsigned char**)outbuf, + outbytesleft, + 0); +} + + +int +_iconv_close_r (struct _reent *rptr, + iconv_t cd) +{ + int res; + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + + if ((void *)cd == NULL || cd == (iconv_t)-1 || ic->data == NULL + || (ic->handlers != &_iconv_null_conversion_handlers + && ic->handlers != &_iconv_ucs_conversion_handlers)) + { + _REENT_ERRNO (rptr) = EBADF; + return -1; + } + + res = (int)ic->handlers->close (rptr, ic->data); + + _free_r (rptr, (void *)cd); + + return res; +} +#endif /* !_REENT_ONLY */ diff --git a/lib/iconv/lib/iconvnls.c b/lib/iconv/lib/iconvnls.c new file mode 100644 index 0000000..5d4b0a2 --- /dev/null +++ b/lib/iconv/lib/iconvnls.c @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#ifdef _MB_CAPABLE +#include +#include +#include +#include +#include +#include "local.h" +#include "conv.h" +#include "ucsconv.h" +#include "iconvnls.h" +#endif + +/* + * _iconv_nls_construct_filename -- constructs full file name. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process. + * const char *file - the name of file. + * const char *dir - the name of subdirectory; + * const char *ext - file extension. + * + * DESCRIPTION: + * Function constructs patch to icionv-related file. + * 'file' shouldn't be NULL. Doesn't use extension if 'ext' is NULL. + * + * RETURN: + * The pointer to file name if success, In case of error returns NULL + * and sets current thread's/process's errno. + */ +const char * +_iconv_nls_construct_filename (struct _reent *rptr, + const char *file, + const char *dir, + const char *ext) +{ + int len1, len2, len3; + char *path; + char *p; + int dirlen = strlen (dir); + + if ((path = _getenv_r (rptr, NLS_ENVVAR_NAME)) == NULL || *path == '\0') + path = ICONV_DEFAULT_NLSPATH; + + len1 = strlen (path); + len2 = strlen (file); + len3 = strlen (ext); + + if ((p = _malloc_r (rptr, len1 + dirlen + len2 + len3 + 3)) == NULL) + return (const char *)NULL; + + memcpy (p, path, len1); + if (p[len1 - 1] != '/') + p[len1++] = '/'; + memcpy (p + len1, dir, dirlen); + len1 += dirlen; + p[len1++] = '/'; + memcpy (p + len1, file, len2); + len1 += len2; + if (ext != NULL) + { + memcpy (p + len1, ext, len3); + len1 += len3; + } + p[len1] = '\0'; + + return (const char *)p; +} + + +#ifdef _MB_CAPABLE +/* + * _iconv_nls_get_mb_cur_max -- return encoding's maximum length + * of a multi-byte character. + * + * PARAMETERS: + * iconv_t cd - opened iconv conversion descriptor; + * int direction - "from encoding" or "to encoding" direction. + * + * DESCRIPTION: + * Return maximum length of a multi-byte character in one of 'cd's + * encoding. Return "from" encoding's value if 'direction' is 0 and + * "to" encoding's value if 'direction' isn't 0. + */ +int +_iconv_nls_get_mb_cur_max (iconv_t cd, + int direction) +{ + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + + return ic->handlers->get_mb_cur_max (ic->data, direction); +} + +/* + * _iconv_nls_is_stateful -- is encoding stateful? + * + * PARAMETERS: + * iconv_t cd - opened iconv conversion descriptor; + * int direction - "from encoding" or "to encoding" direction. + * + * DESCRIPTION: + * Returns 0 if encoding is stateless or 1 if stateful. + * Tests "from" encoding if 'direction' is 0 and + * "to" encoding's value if 'direction' isn't 0. + + */ +int +_iconv_nls_is_stateful (iconv_t cd, + int direction) +{ + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + + return ic->handlers->is_stateful (ic->data, direction); +} + +/* + * _iconv_nls_conv - special version of iconv for NLS. + * + * PARAMETERS: + * Same as _iconv_r. + * + * DESCRIPTION: + * Function behaves as _iconv_r but: + * 1. Don't handle reset/return shift states queries + * (like iconv does when 'inbuf' == NULL, etc); + * 2. Don't save result if 'outbuf' == NULL or + * '*outbuf' == NULL; + * 3. Don't perform default conversion if there is no character + * in "to" encoding that corresponds to character from "from" + * encoding. + * + * RETURN: + * Same as _iconv_r. + */ +size_t +_iconv_nls_conv (struct _reent *rptr, + iconv_t cd, + const char **inbuf, + size_t *inbytesleft, + char **outbuf, + size_t *outbytesleft) +{ + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + int flags = ICONV_FAIL_BIT; + + if ((void *)cd == NULL || cd == (iconv_t)-1 || ic->data == NULL + || (ic->handlers != &_iconv_null_conversion_handlers + && ic->handlers != &_iconv_ucs_conversion_handlers)) + { + _REENT_ERRNO (rptr) = EBADF; + return (size_t)-1; + } + + if (inbytesleft == NULL || *inbytesleft == 0) + return (size_t)0; + + if (outbuf == NULL || *outbuf == NULL) + flags |= ICONV_DONT_SAVE_BIT; + + if (outbytesleft == NULL || *outbytesleft == 0) + { + _REENT_ERRNO (rptr) = E2BIG; + return (size_t)-1; + } + + return ic->handlers->convert (rptr, + ic->data, + (const unsigned char**)inbuf, + inbytesleft, + (unsigned char**)outbuf, + outbytesleft, + flags); +} + +/* + * _iconv_nls_get_state -- get encoding's current shift state value. + * + * PARAMETERS: + * iconv_t cd - iconv descriptor; + * mbstate_t *ps - where to save shift state; + * int direction - "from" encoding if 0, "to" encoding if 1. + * + * DESCRIPTION: + * Save encoding's current shift state to 'ps'. Save "from" encoding's + * shift state if 'direction' is 0 and "to" encodings's shift state + * if 'direction' isn't 0. + */ +void +_iconv_nls_get_state (iconv_t cd, + mbstate_t *ps, + int direction) +{ + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + + ic->handlers->get_state (ic->data, ps, direction); + + return; +} + +/* + * _iconv_nls_set_state -- set encoding's current shift state value. + * + * PARAMETERS: + * iconv_t cd - iconv descriptor; + * mbstate_t *ps - where to save shift state. + * int direction - "from" encoding if 0, "to" encoding if 1. + * + * DESCRIPTION: + * Set encoding's current shift state. + * + * RETURN: + * 0 if success, -1 if failure. + */ +int +_iconv_nls_set_state (iconv_t cd, + mbstate_t *ps, + int direction) +{ + iconv_conversion_t *ic = (iconv_conversion_t *)cd; + + return ic->handlers->set_state (ic->data, ps, direction); +} + +/* Same as iconv_open() but don't perform name resolving */ +static iconv_t +iconv_open1 (struct _reent *rptr, + const char *to, + const char *from) +{ + iconv_conversion_t *ic; + + if (to == NULL || from == NULL || *to == '\0' || *from == '\0') + return (iconv_t)-1; + + ic = (iconv_conversion_t *)_malloc_r (rptr, sizeof (iconv_conversion_t)); + if (ic == NULL) + return (iconv_t)-1; + + /* Select which conversion type to use */ + if (strcmp (from, to) == 0) + { + /* Use null conversion */ + ic->handlers = &_iconv_null_conversion_handlers; + ic->data = ic->handlers->open (rptr, to, from); + } + else + { + /* Use UCS-based conversion */ + ic->handlers = &_iconv_ucs_conversion_handlers; + ic->data = ic->handlers->open (rptr, to, from); + } + + if (ic->data == NULL) + { + _free_r (rptr, (void *)ic); + return (iconv_t)-1; + } + + return (void *)ic; +} + +/* + * _iconv_nls_open - open iconv descriptors for NLS. + * + * PARAMETERS: + * struct _reent *rptr - process's reent structure; + * const char *encoding - encoding name; + * iconv_t *tomb - wchar -> encoding iconv descriptor pointer; + * iconv_t *towc - encoding -> wchar iconv descriptor pointer; + * int flag - perform encoding name resolving flag. + * + * DESCRIPTION: + * Opens two iconv descriptors for 'encoding' -> wchar and + * wchar -> 'encoding' iconv conversions. Function is used when locale or + * wide-oriented stream is opened. If 'flag' is 0, don't perform encoding + * name resolving ('encoding' must not be alias in this case). + * + * RETURN: + * If successful - return 0, else set errno and return -1. + */ +int +_iconv_nls_open (struct _reent *rptr, + const char *encoding, + iconv_t *tomb, + iconv_t *towc, + int flag) +{ + const char *wchar_encoding; + + if (sizeof (wchar_t) > 2 && WCHAR_MAX > 0xFFFF) + wchar_encoding = "ucs_4_internal"; + else if (sizeof (wchar_t) > 1 && WCHAR_MAX > 0xFF) + wchar_encoding = "ucs_2_internal"; + else + wchar_encoding = ""; /* This shuldn't happen */ + + if (flag) + { + if ((*towc = _iconv_open_r (rptr, wchar_encoding, encoding)) == (iconv_t)-1) + return -1; + + if ((*tomb = _iconv_open_r (rptr, encoding, wchar_encoding)) == (iconv_t)-1) + { + _iconv_close_r (rptr, *towc); + return -1; + } + } + else + { + if ((*towc = iconv_open1 (rptr, wchar_encoding, encoding)) == (iconv_t)-1) + return -1; + + if ((*tomb = iconv_open1 (rptr, encoding, wchar_encoding)) == (iconv_t)-1) + { + _iconv_close_r (rptr, *towc); + return -1; + } + } + + return 0; +} + +#endif /* _MB_CAPABLE */ + diff --git a/lib/iconv/lib/iconvnls.h b/lib/iconv/lib/iconvnls.h new file mode 100644 index 0000000..f6d4866 --- /dev/null +++ b/lib/iconv/lib/iconvnls.h @@ -0,0 +1,37 @@ +#ifndef __ICONV_ICONVNLS_H__ +#define __ICONV_ICONVNLS_H__ + +#include + +/* + * Include ucs-2-internal or ucs-4-internal if Newlib is configured as + * "multibyte-capable". + * ============================================================================ + */ +#ifdef _MB_CAPABLE +/* + * Determine size of wchar_t. If size of wchar_t is 2, UCS-2-INTERNAL is used + * as widechar's encoding. If size of wchar_t is 4, UCS-4-INTERNAL is used as + * widechar's encoding. + */ +# if WCHAR_MAX > 0xFFFF +# ifndef _ICONV_FROM_ENCODING_UCS_4_INTERNAL +# define _ICONV_FROM_ENCODING_UCS_4_INTERNAL +# endif +# ifndef _ICONV_TO_ENCODING_UCS_4_INTERNAL +# define _ICONV_TO_ENCODING_UCS_4_INTERNAL +# endif +# elif WCHAR_MAX > 0xFF +# ifndef _ICONV_FROM_ENCODING_UCS_2_INTERNAL +# define _ICONV_FROM_ENCODING_UCS_2_INTERNAL +# endif +# ifndef _ICONV_TO_ENCODING_UCS_2_INTERNAL +# define _ICONV_TO_ENCODING_UCS_2_INTERNAL +# endif +# else +# error Do not know how to work with 1 byte widechars. +# endif +#endif /* _MB_CAPABLE */ + +#endif /* !__ICONV_ICONVNLS_H__ */ + diff --git a/lib/iconv/lib/local.h b/lib/iconv/lib/local.h new file mode 100644 index 0000000..2d3a169 --- /dev/null +++ b/lib/iconv/lib/local.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef __ICONV_LIB_LOCAL_H__ +#define __ICONV_LIB_LOCAL_H__ + +#include <_ansi.h> +#include +#include +#include + +/* Encodings aliases file */ +#define ICONV_ALIASES_FNAME "encoding.aliases" +/* iconv CCS data path */ +#define ICONV_SUBDIR "iconv_data" +/* iconv data files extension */ +#define ICONV_DATA_EXT ".cct" + +/* This macro is used to zero mbstate_t objects */ +#ifdef __GNUC__ +#define ICONV_ZERO_MB_STATE_T ((mbstate_t){0, {0}}) +#else +#define ICONV_ZERO_MB_STATE_T {0} +#endif + +/* Define the maximum multi-byte character length produced by iconv library */ +#if MB_LEN_MAX < 6 +# define ICONV_MB_LEN_MAX 6 +#else +# define ICONV_MB_LEN_MAX MB_LEN_MAX +#endif + +/* 16-bit UCS-2 type */ +typedef __uint16_t ucs2_t; + +/* 32-bit UCS-4 type */ +typedef __uint32_t ucs4_t; + +/* The list of built-in encoding names and aliases */ +extern const char _iconv_aliases[]; + +#endif /* !__ICONV_LIB_LOCAL_H__ */ + diff --git a/lib/iconv/lib/nullconv.c b/lib/iconv/lib/nullconv.c new file mode 100644 index 0000000..cc42291 --- /dev/null +++ b/lib/iconv/lib/nullconv.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" +#include "conv.h" + +static int null_conversion_dummy_data; + + +static void * +null_conversion_open (struct _reent *rptr, + const char *to, + const char *from) +{ + return (void *)&null_conversion_dummy_data; +} + + +static size_t +null_conversion_close (struct _reent *rptr, + void *data) +{ + return 0; +} + + +static size_t +null_conversion_convert (struct _reent *rptr, + void *data, + const unsigned char **inbuf, + size_t *inbytesleft, + unsigned char **outbuf, + size_t *outbytesleft, + int flags) +{ + size_t result; + size_t len; + + if (*inbytesleft < *outbytesleft) + { + result = 0; + len = *inbytesleft; + } + else + { + result = (size_t)-1; + len = *outbytesleft; + _REENT_ERRNO (rptr) = E2BIG; + } + + if ((flags & 1) == 0) + memcpy (*outbuf, *inbuf, len); + + *inbuf += len; + *outbuf += len; + *inbytesleft -= len; + *outbytesleft -= len; + + return result; +} + + +static int +null_conversion_get_mb_cur_max (void *data, + int direction) +{ + return ICONV_MB_LEN_MAX; +} + + +static void +null_conversion_get_state (void *data, + mbstate_t *state, + int direction) +{ + return; +} + + +static int +null_conversion_set_state (void *data, + mbstate_t *state, + int direction) +{ + return 0; +} + +static int +null_conversion_is_stateful (void *data, + int direction) +{ + return 0; +} + +/* Null conversion definition object */ +const iconv_conversion_handlers_t +_iconv_null_conversion_handlers = +{ + null_conversion_open, + null_conversion_close, + null_conversion_convert, + null_conversion_get_state, + null_conversion_set_state, + null_conversion_get_mb_cur_max, + null_conversion_is_stateful +}; + diff --git a/lib/iconv/lib/ucsconv.c b/lib/iconv/lib/ucsconv.c new file mode 100644 index 0000000..502aa44 --- /dev/null +++ b/lib/iconv/lib/ucsconv.c @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" +#include "conv.h" +#include "ucsconv.h" + +static int fake_data; + +static int +find_encoding_name (const char *searchee, + const char **names); + + +/* + * UCS-based conversion interface functions implementation. + */ + +static void * +ucs_based_conversion_open (struct _reent *rptr, + const char *to, + const char *from) +{ + iconv_ucs_conversion_t *uc; + const iconv_to_ucs_ces_t *to_ucs_bices; + const iconv_from_ucs_ces_t *from_ucs_bices; + + uc = (iconv_ucs_conversion_t *) + _calloc_r (rptr, 1, sizeof (iconv_ucs_conversion_t)); + if (uc == NULL) + return NULL; + + /* + * Find CES converter for "from" encoding ("from" source encoding corresponds + * to "to_ucs" CES converter). + */ + for (to_ucs_bices = &_iconv_to_ucs_ces[0]; + to_ucs_bices->names != NULL; + to_ucs_bices++) + { + if (find_encoding_name (from, to_ucs_bices->names) == 0) + break; + } + + /* + * Find CES converter for "to" encoding ("to" source encoding corresponds + * to "from_ucs" CES converter). + */ + for (from_ucs_bices = &_iconv_from_ucs_ces[0]; + from_ucs_bices->names != NULL; + from_ucs_bices++) + { + if (find_encoding_name (to, from_ucs_bices->names) == 0) + break; + } + + if (to_ucs_bices->names == NULL || from_ucs_bices->names == NULL) + goto error; + + uc->to_ucs.handlers = to_ucs_bices->handlers; + uc->from_ucs.handlers = from_ucs_bices->handlers; + + /* Initialize "to UCS" CES converter */ + if (to_ucs_bices->handlers->init != NULL) + { + uc->to_ucs.data = to_ucs_bices->handlers->init (rptr, from); + if (uc->to_ucs.data == NULL) + goto error; + } + else + uc->to_ucs.data = (void *)&fake_data; + + + /* Initialize "from UCS" CES converter */ + if (from_ucs_bices->handlers->init != NULL) + { + uc->from_ucs.data = from_ucs_bices->handlers->init (rptr, to); + if (uc->from_ucs.data == NULL) + goto error; + } + else + uc->from_ucs.data = (void *)&fake_data; + + return uc; + +error: + if (uc->to_ucs.data != NULL && uc->to_ucs.handlers->close != NULL) + uc->to_ucs.handlers->close (rptr, uc->to_ucs.data); + + _free_r (rptr, (void *)uc); + + return NULL; +} + + +static size_t +ucs_based_conversion_close (struct _reent *rptr, + void *data) +{ + iconv_ucs_conversion_t *uc; + size_t res = 0; + + uc = (iconv_ucs_conversion_t *)data; + + if (uc->from_ucs.handlers->close != NULL) + res = uc->from_ucs.handlers->close (rptr, uc->from_ucs.data); + if (uc->to_ucs.handlers->close != NULL) + res |= uc->to_ucs.handlers->close (rptr, uc->to_ucs.data); + + _free_r (rptr, (void *)data); + + return res; +} + + +static size_t +ucs_based_conversion_convert (struct _reent *rptr, + void *data, + const unsigned char **inbuf, + size_t *inbytesleft, + unsigned char **outbuf, + size_t *outbytesleft, + int flags) +{ + unsigned char outbuf1[ICONV_MB_LEN_MAX]; + unsigned char *poutbuf1; + size_t res = 0; + iconv_ucs_conversion_t *uc = (iconv_ucs_conversion_t *)data; + + while (*inbytesleft > 0) + { + register size_t bytes; + register ucs4_t ch; + const unsigned char *inbuf_save = *inbuf; + size_t inbyteslef_save = *inbytesleft; + + if (*outbytesleft == 0) + { + _REENT_ERRNO (rptr) = E2BIG; + return (size_t)-1; + } + + ch = uc->to_ucs.handlers->convert_to_ucs (uc->to_ucs.data, + inbuf, inbytesleft); + + if (ch == (ucs4_t)ICONV_CES_BAD_SEQUENCE) + { + _REENT_ERRNO (rptr) = EINVAL; + return (size_t)-1; + } + + if (ch == (ucs4_t)ICONV_CES_INVALID_CHARACTER) + { + _REENT_ERRNO (rptr) = EILSEQ; + return (size_t)-1; + } + + if (flags & ICONV_DONT_SAVE_BIT) + { + poutbuf1 = &outbuf1[0]; + outbuf = &poutbuf1; + } + + bytes = uc->from_ucs.handlers->convert_from_ucs (uc->from_ucs.data, ch, + outbuf, outbytesleft); + + if (bytes == (size_t)ICONV_CES_NOSPACE) + { + *inbuf = inbuf_save; + *inbytesleft = inbyteslef_save; + _REENT_ERRNO (rptr) = E2BIG; + return (size_t)-1; + } + else if (bytes == (size_t)ICONV_CES_INVALID_CHARACTER) + { + if (flags & ICONV_FAIL_BIT) + { + /* Generate error */ + _REENT_ERRNO (rptr) = EILSEQ; + return (size_t)-1; + } + /* + * For this case SUSv3 stands: "if iconv() encounters a character in the + * input buffer that is valid, but for which an identical character does + * not exist in the target encoding, iconv() shall perform an + * implementation-defined conversion on this character". + * Don't generate error, just write default character. + */ + bytes = uc->from_ucs.handlers->convert_from_ucs ( + uc->from_ucs.data, + (ucs4_t)DEFAULT_CHARACTER, + outbuf, + outbytesleft); + if ((__int32_t)bytes < 0) + { + _REENT_ERRNO (rptr) = E2BIG; + return (size_t)-1; + } + + res += 1; + } + } + + return res; +} + + +static int +ucs_based_conversion_get_mb_cur_max (void *data, + int direction) +{ + iconv_ucs_conversion_t *uc = (iconv_ucs_conversion_t *)data; + + if (direction == 0) + return uc->to_ucs.handlers->get_mb_cur_max (uc->to_ucs.data); + else + return uc->from_ucs.handlers->get_mb_cur_max (uc->from_ucs.data); +} + + +static void +ucs_based_conversion_get_state (void *data, + mbstate_t *state, + int direction) +{ + iconv_ucs_conversion_t *uc = (iconv_ucs_conversion_t *)data; + mbstate_t nullstate = ICONV_ZERO_MB_STATE_T; + + if (direction == 0) + { + if (uc->to_ucs.handlers->get_state != NULL) + uc->to_ucs.handlers->get_state (uc->to_ucs.data, state); + else + *state = nullstate; /* internal copy */ + } + else + { + if (uc->from_ucs.handlers->get_state != NULL) + uc->from_ucs.handlers->get_state (uc->from_ucs.data, state); + else + *state = nullstate; /* internal copy */ + } + + return; +} + + +static int +ucs_based_conversion_set_state (void *data, + mbstate_t *state, + int direction) +{ + iconv_ucs_conversion_t *uc = (iconv_ucs_conversion_t *)data; + + if (direction == 0) + { + if (uc->to_ucs.handlers->set_state != NULL) + return uc->to_ucs.handlers->set_state (uc->to_ucs.data, state); + } + else + { + if (uc->from_ucs.handlers->set_state != NULL) + return uc->from_ucs.handlers->set_state (uc->from_ucs.data, state); + } + + return 0; +} + +static int +ucs_based_conversion_is_stateful (void *data, + int direction) +{ + iconv_ucs_conversion_t *uc = (iconv_ucs_conversion_t *)data; + + if (direction == 0) + { + if (uc->to_ucs.handlers->is_stateful != NULL) + return uc->to_ucs.handlers->is_stateful (uc->to_ucs.data); + } + else + { + if (uc->from_ucs.handlers->is_stateful != NULL) + return uc->from_ucs.handlers->is_stateful (uc->from_ucs.data); + } + + return 0; +} + + +/* UCS-based conversion definition object */ +const iconv_conversion_handlers_t +_iconv_ucs_conversion_handlers = +{ + ucs_based_conversion_open, + ucs_based_conversion_close, + ucs_based_conversion_convert, + ucs_based_conversion_get_state, + ucs_based_conversion_set_state, + ucs_based_conversion_get_mb_cur_max, + ucs_based_conversion_is_stateful +}; + + +/* + * Supplementary functions. + */ + +static int +find_encoding_name (const char *searchee, + const char **names) +{ + const char *p; + + for (p = *names; p != NULL; p = *(names++)) + if (strcmp (p, searchee) == 0) + return 0; + + return -1; +} + diff --git a/lib/iconv/lib/ucsconv.h b/lib/iconv/lib/ucsconv.h new file mode 100644 index 0000000..2c3d8c6 --- /dev/null +++ b/lib/iconv/lib/ucsconv.h @@ -0,0 +1,327 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy + * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef __ICONV_UCS_CONVERSION_H__ +#define __ICONV_UCS_CONVERSION_H__ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +/* No enough space in output buffer */ +#define ICONV_CES_NOSPACE 0 +/* Invalid input character */ +#define ICONV_CES_INVALID_CHARACTER -1 +/* No corespondent character in destination encoding */ +#define ICONV_CES_BAD_SEQUENCE -2 +/* All unknown characters are marked by this code */ +#define DEFAULT_CHARACTER 0x3f /* ASCII '?' */ + + +/* + * iconv_to_ucs_ces_handlers_t - "to UCS" CES converter handlers. + * + * Structure contains function pointers which should be provided by + * "to_ucs" CES converter. + * + * ============================================================================ + */ +typedef struct +{ + /* + * init - initialize CES converter. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process; + * const char *encoding - encoding name. + * + * DESCRIPTION: + * Initializes CES converter. CES converter may deal with a series of + * encodings, such as Table or EUC CES converters. 'encoding' parameter + * indicates which encoding CES converter should use. + * + * RETURN: + * Returns CES-specific data pointer if success. In case of error returns + * NULL and sets current thread's/process's errno. + */ + void *(*init) (struct _reent *rptr, + const char *encoding); + + /* + * close - close CES converter. + * + * PARAMETERS: + * struct _reent *rptr - reent structure of current thread/process; + * void *data - CES converter-specific data. + * + * DESCRIPTION: + * Preforms CES converter closing. * + * RETURN: + * Returns (size_t)0 if success. In case of error returns (size_t)-1 and + * sets current thread's/process's errno. + */ + size_t (*close) (struct _reent *rptr, + void *data); + + /* + * get_mb_cur_max - get maximum character length in bytes. + * + * PARAMETERS: + * void *data - conversion-specific data; + * + * DESCRIPTION: + * Returns encoding's maximum character length. + */ + int (*get_mb_cur_max) (void *data); + + /* + * get_state - get current shift state. + * + * PARAMETERS: + * void *data - conversion-specific data; + * mbstate_t *state - mbstate_t object where shift state will be stored; + * + * DESCRIPTION: + * Returns encoding's current shift sequence. + */ + void (*get_state) (void *data, + mbstate_t *state); + + /* + * set_state - set shift state. + * + * PARAMETERS: + * void *data - conversion-specific data; + * mbstate_t *state - mbstate_t value to which shift state will be set. + * + * DESCRIPTION: + * Sets encoding's current shift state to 'state'. if 'state' + * object is zero-object - reset current shift state. + * Returns 0 if '*state' object has right format, -1 else. + */ + int (*set_state) (void *data, + mbstate_t *state); + + /* + * is_stateful - is encoding stateful state. + * + * PARAMETERS: + * void *data - conversion-specific data; + * + * DESCRIPTION: + * Returns 0 if encoding is stateless, else returns 1. + */ + int (*is_stateful) (void *data); + + /* + * convert_to_ucs - convert character to UCS. + * + * PARAMETERS: + * void *data - CES converter-specific data; + * const unsigned char **inbuf - buffer with input character byte sequence; + * size_t *inbytesleft - output buffer bytes count. + * + * DESCRIPTION: + * Converts input characters into UCS encoding. 'inbuf' is + * incremented accordingly. 'bytesleft' is decremented accordingly. Should + * be provided by correspondent CES module. + * + * RETURN: + * Returns resulting UCS code if success. If input character is invalid, + * returns ICONV_CES_INVALID_CHARACTER. If invalid or incomplete bytes + * sequence was met, returns ICONV_CES_BAD_SEQUENCE. + */ + ucs4_t (*convert_to_ucs) (void *data, + const unsigned char **inbuf, + size_t *inbytesleft); +} iconv_to_ucs_ces_handlers_t; + + +/* + * iconv_from_ucs_ces_handlers_t - "from UCS" CES converter handlers. + * + * Structure contains function pointers which should be provided by + * "from_ucs" CES converter. + * + * ============================================================================ + */ +typedef struct +{ + /* Same as in iconv_to_ucs_ces_handlers_t */ + void *(*init) (struct _reent *rptr, + const char *encoding); + + /* Same as in iconv_to_ucs_ces_handlers_t */ + size_t (*close) (struct _reent *rptr, + void *data); + + /* Same as in iconv_to_ucs_ces_handlers_t */ + int (*get_mb_cur_max) (void *data); + + /* Same as in iconv_to_ucs_ces_handlers_t */ + void (*get_state) (void *data, + mbstate_t *state); + + /* Same as in iconv_to_ucs_ces_handlers_t */ + int (*set_state) (void *data, + mbstate_t *state); + + /* Same as in iconv_to_ucs_ces_handlers_t */ + int (*is_stateful) (void *data); + + /* + * convert_from_ucs - convert UCS character to destination encoding. + * + * PARAMETERS: + * void *data - CES converter-specific data; + * ucs4_t in - input UCS-4 character; + * unsigned char **outbuf - output buffer for the result; + * size_t *outbytesleft - output buffer bytes count. + * + * DESCRIPTION: + * Converts input UCS characters to destination encoding and stores result + * in 'outbuf' if there is sufficient free space present. 'outbuf' is + * incremented accordingly. 'outbytesleft' is decremented accordingly. Should + * be provided by correspondent CES module. + * Output buffer always has at least 1 byte. + * + * RETURN: + * Returns number of bytes that was written into output buffer if success. + * If there is no enough space in output buffer, returns ICONV_CES_NOSPACE. + * If there is no corresponding character in destination encoding, returns + * ICONV_CES_INVALID_CHARACTER. + */ + size_t (*convert_from_ucs) (void *data, + ucs4_t in, + unsigned char **outbuf, + size_t *outbytesleft); +} iconv_from_ucs_ces_handlers_t; + + +/* + * iconv_to_ucs_ces_desc_t - "to UCS" CES converter definition structure for + * usage in iconv_ucs_conversion_t conversion description structure. + * + * ============================================================================ + */ +typedef struct +{ + /* CES converter handlers */ + const iconv_to_ucs_ces_handlers_t *handlers; + + /* "to_ucs" CES converter-specific data. */ + void *data; +} iconv_to_ucs_ces_desc_t; + + +/* + * iconv_from_ucs_ces_desc_t - "from UCS" CES converter definition structure for + * usage in iconv_ucs_conversion_t conversion description structure. + * + * ============================================================================ + */ +typedef struct +{ + /* CES converter handlers */ + const iconv_from_ucs_ces_handlers_t *handlers; + + /* "from_ucs" CES converter-specific data. */ + void *data; +} iconv_from_ucs_ces_desc_t; + + +/* + * iconv_ucs_conversion_t - UCS-based conversion definition structure. + * + * Defines special type of conversion where every character is first + * converted into UCS-4 (UCS-2 for table-driven), and after this the + * resulting UCS character is converted to destination encoding. + * UCS-based conversion is composed of two *converters*, defined by + * iconv_ces_t structure. The iconv_ucs_conversion_t object is referred + * from iconv_conversion_t object using 'data' field. + * + * Structure contains two objects - 'to_ucs' and 'from_ucs' which define + * "source encoding to UCS" and "UCS to destination encoding" converters. + * + * ============================================================================ + */ +typedef struct +{ + /* Source encoding -> CES converter. */ + iconv_to_ucs_ces_desc_t to_ucs; + + /* UCS -> destination encoding CES converter. */ + iconv_from_ucs_ces_desc_t from_ucs; +} iconv_ucs_conversion_t; + + +/* + * iconv_to_ucs_ces_t - defines "to UCS" CES converter. + * + * ============================================================================ + */ +typedef struct +{ + /* + * An array of encodings names, supported by CES converter. + * The end of array should be marked by NULL pointer. + */ + const char **names; + + /* CES converter description structure */ + const iconv_to_ucs_ces_handlers_t *handlers; +} iconv_to_ucs_ces_t; + + +/* + * iconv_from_ucs_ces_t - defines "from UCS" CES converter. + * + * ============================================================================ + */ +typedef struct +{ + /* + * An array of encodings names, supported by CES converter. + * The end of array should be marked by NULL pointer. + */ + const char **names; + + /* CES converter description structure */ + const iconv_from_ucs_ces_handlers_t *handlers; +} iconv_from_ucs_ces_t; + + +/* List of "to UCS" linked-in CES converters. */ +extern const iconv_to_ucs_ces_t +_iconv_to_ucs_ces[]; + +/* List of "from UCS" linked-in CES converters. */ +extern const iconv_from_ucs_ces_t +_iconv_from_ucs_ces[]; + +#endif /* !__ICONV_UCS_CONVERSION_H__ */ + diff --git a/lib/include/_ansi.h b/lib/include/_ansi.h new file mode 100644 index 0000000..6c7497e --- /dev/null +++ b/lib/include/_ansi.h @@ -0,0 +1,82 @@ +/* Provide support for both ANSI and non-ANSI environments. */ + +/* To get a strict ANSI C environment, define macro __STRICT_ANSI__. This will + "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header + files aren't affected). */ + +#ifndef _ANSIDECL_H_ +#define _ANSIDECL_H_ + +#include +#include + +/* ISO C++. */ + +#ifdef __cplusplus +#if !(defined(_BEGIN_STD_C) && defined(_END_STD_C)) +#ifdef _HAVE_STD_CXX +#define _BEGIN_STD_C namespace std { extern "C" { +#define _END_STD_C } } +#else +#define _BEGIN_STD_C extern "C" { +#define _END_STD_C } +#endif +#if __GNUC_PREREQ (3, 3) +#define _NOTHROW __attribute__ ((__nothrow__)) +#else +#define _NOTHROW throw() +#endif +#endif +#else +#define _BEGIN_STD_C +#define _END_STD_C +#define _NOTHROW +#endif + +#ifndef _LONG_DOUBLE +#define _LONG_DOUBLE long double +#endif + +/* Support gcc's __attribute__ facility. */ + +#ifdef __GNUC__ +#define _ATTRIBUTE(attrs) __attribute__ (attrs) +#else +#define _ATTRIBUTE(attrs) +#endif + +/* The traditional meaning of 'extern inline' for GCC is not + to emit the function body unless the address is explicitly + taken. However this behaviour is changing to match the C99 + standard, which uses 'extern inline' to indicate that the + function body *must* be emitted. Likewise, a function declared + without either 'extern' or 'static' defaults to extern linkage + (C99 6.2.2p5), and the compiler may choose whether to use the + inline version or call the extern linkage version (6.7.4p6). + If we are using GCC, but do not have the new behaviour, we need + to use extern inline; if we are using a new GCC with the + C99-compatible behaviour, or a non-GCC compiler (which we will + have to hope is C99, since there is no other way to achieve the + effect of omitting the function if it isn't referenced) we use + 'static inline', which c99 defines to mean more-or-less the same + as the Gnu C 'extern inline'. */ +#if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__) +/* We're using GCC, but without the new C99-compatible behaviour. */ +#define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__)) +#else +/* We're using GCC in C99 mode, or an unknown compiler which + we just have to hope obeys the C99 semantics of inline. */ +#define _ELIDABLE_INLINE static __inline__ +#endif + +#if __GNUC_PREREQ (3, 1) +#define _NOINLINE __attribute__ ((__noinline__)) +#define _NOINLINE_STATIC _NOINLINE static +#else +/* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be + trusted not to inline if it is static. */ +#define _NOINLINE +#define _NOINLINE_STATIC +#endif + +#endif /* _ANSIDECL_H_ */ diff --git a/lib/include/_newlib_version.h b/lib/include/_newlib_version.h new file mode 100644 index 0000000..d4fffb1 --- /dev/null +++ b/lib/include/_newlib_version.h @@ -0,0 +1,2 @@ +/* dummy file for external tools to use. Real file is created by + newlib configuration. */ diff --git a/lib/include/_syslist.h b/lib/include/_syslist.h new file mode 100644 index 0000000..271644e --- /dev/null +++ b/lib/include/_syslist.h @@ -0,0 +1,40 @@ +/* internal use only -- mapping of "system calls" for libraries that lose + and only provide C names, so that we end up in violation of ANSI */ +#ifndef __SYSLIST_H +#define __SYSLIST_H + +#ifdef MISSING_SYSCALL_NAMES +#define _close close +#define _execve execve +#define _fcntl fcntl +#define _fork fork +#define _fstat fstat +#define _getpid getpid +#define _gettimeofday gettimeofday +#define _isatty isatty +#define _kill kill +#define _link link +#define _lseek lseek +#define _mkdir mkdir +#define _open open +#define _read read +#define _sbrk sbrk +#define _stat stat +#define _times times +#define _unlink unlink +#define _wait wait +#define _write write +#endif /* MISSING_SYSCALL_NAMES */ + +#if defined MISSING_SYSCALL_NAMES || !defined HAVE_OPENDIR +/* If the system call interface is missing opendir, readdir, and + closedir, there is an implementation of these functions in + libc/posix that is implemented using open, getdents, and close. + Note, these functions are currently not in the libc/syscalls + directory. */ +#define _opendir opendir +#define _readdir readdir +#define _closedir closedir +#endif /* MISSING_SYSCALL_NAMES || !HAVE_OPENDIR */ + +#endif /* !__SYSLIST_H_ */ diff --git a/lib/include/alloca.h b/lib/include/alloca.h new file mode 100644 index 0000000..5d36318 --- /dev/null +++ b/lib/include/alloca.h @@ -0,0 +1,21 @@ +/* libc/include/alloca.h - Allocate memory on stack */ + +/* Written 2000 by Werner Almesberger */ +/* Rearranged for general inclusion by stdlib.h. + 2001, Corinna Vinschen */ + +#ifndef _NEWLIB_ALLOCA_H +#define _NEWLIB_ALLOCA_H + +#include "_ansi.h" +#include + +#undef alloca + +#ifdef __GNUC__ +#define alloca(size) __builtin_alloca(size) +#else +void * alloca (size_t); +#endif + +#endif diff --git a/lib/include/ar.h b/lib/include/ar.h new file mode 100644 index 0000000..4c05813 --- /dev/null +++ b/lib/include/ar.h @@ -0,0 +1,65 @@ +/* $NetBSD: ar.h,v 1.4 1994/10/26 00:55:43 cgd Exp $ */ + +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * This code is derived from software contributed to Berkeley by + * Hugh Smith at The University of Guelph. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ar.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _AR_H_ +#define _AR_H_ + +/* Pre-4BSD archives had these magic numbers in them. */ +#define OARMAG1 0177555 +#define OARMAG2 0177545 + +#define ARMAG "!\n" /* ar "magic number" */ +#define SARMAG 8 /* strlen(ARMAG); */ + +#define AR_EFMT1 "#1/" /* extended format #1 */ + +struct ar_hdr { + char ar_name[16]; /* name */ + char ar_date[12]; /* modification time */ + char ar_uid[6]; /* user id */ + char ar_gid[6]; /* group id */ + char ar_mode[8]; /* octal file permissions */ + char ar_size[10]; /* size in bytes */ +#define ARFMAG "`\n" + char ar_fmag[2]; /* consistency check */ +}; + +#endif /* !_AR_H_ */ diff --git a/lib/include/argz.h b/lib/include/argz.h new file mode 100644 index 0000000..02c9adb --- /dev/null +++ b/lib/include/argz.h @@ -0,0 +1,33 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _ARGZ_H_ +#define _ARGZ_H_ + +#include +#include + +#include "_ansi.h" + +_BEGIN_STD_C + +/* The newlib implementation of these functions assumes that sizeof(char) == 1. */ +error_t argz_create (char *const argv[], char **argz, size_t *argz_len); +error_t argz_create_sep (const char *string, int sep, char **argz, size_t *argz_len); +size_t argz_count (const char *argz, size_t argz_len); +void argz_extract (char *argz, size_t argz_len, char **argv); +void argz_stringify (char *argz, size_t argz_len, int sep); +error_t argz_add (char **argz, size_t *argz_len, const char *str); +error_t argz_add_sep (char **argz, size_t *argz_len, const char *str, int sep); +error_t argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len); +error_t argz_delete (char **argz, size_t *argz_len, char *entry); +error_t argz_insert (char **argz, size_t *argz_len, char *before, const char *entry); +char * argz_next (char *argz, size_t argz_len, const char *entry); +error_t argz_replace (char **argz, size_t *argz_len, const char *str, const char *with, unsigned *replace_count); + +_END_STD_C + +#endif /* _ARGZ_H_ */ diff --git a/lib/include/assert.h b/lib/include/assert.h new file mode 100644 index 0000000..b9e5e9b --- /dev/null +++ b/lib/include/assert.h @@ -0,0 +1,50 @@ +/* + assert.h +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "_ansi.h" + +#undef assert + +#ifdef NDEBUG /* required by ANSI standard */ +# define assert(__e) ((void)0) +#else +# define assert(__e) ((__e) ? (void)0 : __assert_func (__FILE__, __LINE__, \ + __ASSERT_FUNC, #__e)) + +# ifndef __ASSERT_FUNC + /* Use g++'s demangled names in C++. */ +# if defined __cplusplus && defined __GNUC__ +# define __ASSERT_FUNC __PRETTY_FUNCTION__ + + /* C99 requires the use of __func__. */ +# elif __STDC_VERSION__ >= 199901L +# define __ASSERT_FUNC __func__ + + /* Older versions of gcc don't have __func__ but can use __FUNCTION__. */ +# elif __GNUC__ >= 2 +# define __ASSERT_FUNC __FUNCTION__ + + /* failed to detect __func__ support. */ +# else +# define __ASSERT_FUNC ((char *) 0) +# endif +# endif /* !__ASSERT_FUNC */ +#endif /* !NDEBUG */ + +void __assert (const char *, int, const char *) + _ATTRIBUTE ((__noreturn__)); +void __assert_func (const char *, int, const char *, const char *) + _ATTRIBUTE ((__noreturn__)); + +#if __STDC_VERSION__ >= 201112L && !defined __cplusplus +# define static_assert _Static_assert +#endif + +#ifdef __cplusplus +} +#endif diff --git a/lib/include/complex.h b/lib/include/complex.h new file mode 100644 index 0000000..ad3028e --- /dev/null +++ b/lib/include/complex.h @@ -0,0 +1,150 @@ +/* $NetBSD: complex.h,v 1.3 2010/09/15 16:11:30 christos Exp $ */ + +/* + * Written by Matthias Drochner. + * Public domain. + */ + +#ifndef _COMPLEX_H +#define _COMPLEX_H + +#define complex _Complex +#define _Complex_I 1.0fi +#define I _Complex_I + +#include + +__BEGIN_DECLS + +/* 7.3.5 Trigonometric functions */ +/* 7.3.5.1 The cacos functions */ +double complex cacos(double complex); +float complex cacosf(float complex); +long double complex cacosl(long double complex); + +/* 7.3.5.2 The casin functions */ +double complex casin(double complex); +float complex casinf(float complex); +long double complex casinl(long double complex); + +/* 7.3.5.1 The catan functions */ +double complex catan(double complex); +float complex catanf(float complex); +long double complex catanl(long double complex); + +/* 7.3.5.1 The ccos functions */ +double complex ccos(double complex); +float complex ccosf(float complex); +long double complex ccosl(long double complex); + +/* 7.3.5.1 The csin functions */ +double complex csin(double complex); +float complex csinf(float complex); +long double complex csinl(long double complex); + +/* 7.3.5.1 The ctan functions */ +double complex ctan(double complex); +float complex ctanf(float complex); +long double complex ctanl(long double complex); + +/* 7.3.6 Hyperbolic functions */ +/* 7.3.6.1 The cacosh functions */ +double complex cacosh(double complex); +float complex cacoshf(float complex); +long double complex cacoshl(long double complex); + +/* 7.3.6.2 The casinh functions */ +double complex casinh(double complex); +float complex casinhf(float complex); +long double complex casinhl(long double complex); + +/* 7.3.6.3 The catanh functions */ +double complex catanh(double complex); +float complex catanhf(float complex); +long double complex catanhl(long double complex); + +/* 7.3.6.4 The ccosh functions */ +double complex ccosh(double complex); +float complex ccoshf(float complex); +long double complex ccoshl(long double complex); + +/* 7.3.6.5 The csinh functions */ +double complex csinh(double complex); +float complex csinhf(float complex); +long double complex csinhl(long double complex); + +/* 7.3.6.6 The ctanh functions */ +double complex ctanh(double complex); +float complex ctanhf(float complex); +long double complex ctanhl(long double complex); + +/* 7.3.7 Exponential and logarithmic functions */ +/* 7.3.7.1 The cexp functions */ +double complex cexp(double complex); +float complex cexpf(float complex); +long double complex cexpl(long double complex); + +/* 7.3.7.2 The clog functions */ +double complex clog(double complex); +float complex clogf(float complex); +long double complex clogl(long double complex); + +/* 7.3.8 Power and absolute-value functions */ +/* 7.3.8.1 The cabs functions */ +/*#ifndef __LIBM0_SOURCE__ */ +/* avoid conflict with historical cabs(struct complex) */ +/* double cabs(double complex) __RENAME(__c99_cabs); + float cabsf(float complex) __RENAME(__c99_cabsf); + #endif +*/ +long double cabsl(long double complex) ; +double cabs(double complex) ; +float cabsf(float complex) ; + +/* 7.3.8.2 The cpow functions */ +double complex cpow(double complex, double complex); +float complex cpowf(float complex, float complex); +long double complex cpowl(long double complex, long double complex); + +/* 7.3.8.3 The csqrt functions */ +double complex csqrt(double complex); +float complex csqrtf(float complex); +long double complex csqrtl(long double complex); + +/* 7.3.9 Manipulation functions */ +/* 7.3.9.1 The carg functions */ +double carg(double complex); +float cargf(float complex); +long double cargl(long double complex); + +/* 7.3.9.2 The cimag functions */ +double cimag(double complex); +float cimagf(float complex); +long double cimagl(long double complex); + +/* 7.3.9.3 The conj functions */ +double complex conj(double complex); +float complex conjf(float complex); +long double complex conjl(long double complex); + +/* 7.3.9.4 The cproj functions */ +double complex cproj(double complex); +float complex cprojf(float complex); +long double complex cprojl(long double complex); + +/* 7.3.9.5 The creal functions */ +double creal(double complex); +float crealf(float complex); +long double creall(long double complex); + +#if __GNU_VISIBLE +double complex clog10(double complex); +float complex clog10f(float complex); +# if defined(__CYGWIN__) +long double complex clog10l(long double complex); +# endif +#endif + +__END_DECLS + +#endif /* ! _COMPLEX_H */ diff --git a/lib/include/cpio.h b/lib/include/cpio.h new file mode 100644 index 0000000..99860b2 --- /dev/null +++ b/lib/include/cpio.h @@ -0,0 +1,30 @@ +/* POSIX.1 symbolic constants for c_mode field of cpio archive format */ + +#ifndef _CPIO_H +#define _CPIO_H + +#define C_IRUSR 0000400 /* Read by owner */ +#define C_IWUSR 0000200 /* Write by owner */ +#define C_IXUSR 0000100 /* Execute by owner */ +#define C_IRGRP 0000040 /* Read by group */ +#define C_IWGRP 0000020 /* Write by group */ +#define C_IXGRP 0000010 /* Execute by group */ +#define C_IROTH 0000004 /* Read by others */ +#define C_IWOTH 0000002 /* Write by others */ +#define C_IXOTH 0000001 /* Execute by others */ +#define C_ISUID 0004000 /* Set user ID */ +#define C_ISGID 0002000 /* Set group ID */ +#define C_ISVTX 0001000 /* On directories, restricted deletion flag */ + +#define C_ISDIR 0040000 /* Directory */ +#define C_ISFIFO 0010000 /* FIFO */ +#define C_ISREG 0100000 /* Regular file */ +#define C_ISBLK 0060000 /* Block special */ +#define C_ISCHR 0020000 /* Character special */ +#define C_ISCTG 0110000 /* Reserved */ +#define C_ISLNK 0120000 /* Symbolic link */ +#define C_ISSOCK 0140000 /* Socket */ + +#define MAGIC "070707" + +#endif /* _CPIO_H */ diff --git a/lib/include/ctype.h b/lib/include/ctype.h new file mode 100644 index 0000000..b29594a --- /dev/null +++ b/lib/include/ctype.h @@ -0,0 +1,183 @@ +#ifndef _CTYPE_H_ +#define _CTYPE_H_ + +#include "_ansi.h" +#include + +#if __POSIX_VISIBLE >= 200809 || __MISC_VISIBLE || defined (_LIBC) +#include +#endif + +_BEGIN_STD_C + +int isalnum (int __c); +int isalpha (int __c); +int iscntrl (int __c); +int isdigit (int __c); +int isgraph (int __c); +int islower (int __c); +int isprint (int __c); +int ispunct (int __c); +int isspace (int __c); +int isupper (int __c); +int isxdigit (int __c); +int tolower (int __c); +int toupper (int __c); + +#if __ISO_C_VISIBLE >= 1999 +int isblank (int __c); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE +int isascii (int __c); +int toascii (int __c); +#define _tolower(__c) ((unsigned char)(__c) - 'A' + 'a') +#define _toupper(__c) ((unsigned char)(__c) - 'a' + 'A') +#endif + +#if __POSIX_VISIBLE >= 200809 +extern int isalnum_l (int __c, locale_t __l); +extern int isalpha_l (int __c, locale_t __l); +extern int isblank_l (int __c, locale_t __l); +extern int iscntrl_l (int __c, locale_t __l); +extern int isdigit_l (int __c, locale_t __l); +extern int isgraph_l (int __c, locale_t __l); +extern int islower_l (int __c, locale_t __l); +extern int isprint_l (int __c, locale_t __l); +extern int ispunct_l (int __c, locale_t __l); +extern int isspace_l (int __c, locale_t __l); +extern int isupper_l (int __c, locale_t __l); +extern int isxdigit_l(int __c, locale_t __l); +extern int tolower_l (int __c, locale_t __l); +extern int toupper_l (int __c, locale_t __l); +#endif + +#if __MISC_VISIBLE +extern int isascii_l (int __c, locale_t __l); +extern int toascii_l (int __c, locale_t __l); +#endif + +#define _U 01 +#define _L 02 +#define _N 04 +#define _S 010 +#define _P 020 +#define _C 040 +#define _X 0100 +#define _B 0200 + +/* For C++ backward-compatibility only. */ +extern __IMPORT const char _ctype_[]; + +#ifdef __HAVE_LOCALE_INFO__ +const char *__locale_ctype_ptr (void); +#else +#define __locale_ctype_ptr() _ctype_ +#endif + +# define __CTYPE_PTR (__locale_ctype_ptr ()) + +#ifndef __cplusplus +/* These macros are intentionally written in a manner that will trigger + a gcc -Wall warning if the user mistakenly passes a 'char' instead + of an int containing an 'unsigned char'. Note that the sizeof will + always be 1, which is what we want for mapping EOF to __CTYPE_PTR[0]; + the use of a raw index inside the sizeof triggers the gcc warning if + __c was of type char, and sizeof masks side effects of the extra __c. + Meanwhile, the real index to __CTYPE_PTR+1 must be cast to int, + since isalpha(0x100000001LL) must equal isalpha(1), rather than being + an out-of-bounds reference on a 64-bit machine. */ +#define __ctype_lookup(__c) ((__CTYPE_PTR+sizeof(""[__c]))[(int)(__c)]) + +#define isalpha(__c) (__ctype_lookup(__c)&(_U|_L)) +#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U) +#define islower(__c) ((__ctype_lookup(__c)&(_U|_L))==_L) +#define isdigit(__c) (__ctype_lookup(__c)&_N) +#define isxdigit(__c) (__ctype_lookup(__c)&(_X|_N)) +#define isspace(__c) (__ctype_lookup(__c)&_S) +#define ispunct(__c) (__ctype_lookup(__c)&_P) +#define isalnum(__c) (__ctype_lookup(__c)&(_U|_L|_N)) +#define isprint(__c) (__ctype_lookup(__c)&(_P|_U|_L|_N|_B)) +#define isgraph(__c) (__ctype_lookup(__c)&(_P|_U|_L|_N)) +#define iscntrl(__c) (__ctype_lookup(__c)&_C) + +#if defined(__GNUC__) && __ISO_C_VISIBLE >= 1999 +#define isblank(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (__ctype_lookup(__x)&_B) || (int) (__x) == '\t';}) +#endif + +#if __POSIX_VISIBLE >= 200809 +#ifdef __HAVE_LOCALE_INFO__ +const char *__locale_ctype_ptr_l (locale_t); +#else +static __inline const char * +__locale_ctype_ptr_l(locale_t _l) +{ + (void)_l; + return __locale_ctype_ptr(); +} +#endif +#define __ctype_lookup_l(__c,__l) ((__locale_ctype_ptr_l(__l)+sizeof(""[__c]))[(int)(__c)]) + +#define isalpha_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L)) +#define isupper_l(__c,__l) ((__ctype_lookup_l(__c,__l)&(_U|_L))==_U) +#define islower_l(__c,__l) ((__ctype_lookup_l(__c,__l)&(_U|_L))==_L) +#define isdigit_l(__c,__l) (__ctype_lookup_l(__c,__l)&_N) +#define isxdigit_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_X|_N)) +#define isspace_l(__c,__l) (__ctype_lookup_l(__c,__l)&_S) +#define ispunct_l(__c,__l) (__ctype_lookup_l(__c,__l)&_P) +#define isalnum_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L|_N)) +#define isprint_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_P|_U|_L|_N|_B)) +#define isgraph_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_P|_U|_L|_N)) +#define iscntrl_l(__c,__l) (__ctype_lookup_l(__c,__l)&_C) + +#if defined(__GNUC__) +#define isblank_l(__c, __l) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (__ctype_lookup_l(__x,__l)&_B) || (int) (__x) == '\t';}) +#endif + +#endif /* __POSIX_VISIBLE >= 200809 */ + +#if __MISC_VISIBLE || __XSI_VISIBLE +#define isascii(__c) ((unsigned)(__c)<=0177) +#define toascii(__c) ((__c)&0177) +#endif + +#if __MISC_VISIBLE +#define isascii_l(__c,__l) ((__l),(unsigned)(__c)<=0177) +#define toascii_l(__c,__l) ((__l),(__c)&0177) +#endif + +/* Non-gcc versions will get the library versions, and will be + slightly slower. These macros are not NLS-aware so they are + disabled if the system supports the extended character sets. */ +# if defined(__GNUC__) +# if !defined (_MB_EXTENDED_CHARSETS_ISO) && !defined (_MB_EXTENDED_CHARSETS_WINDOWS) +# define toupper(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + islower (__x) ? (int) __x - 'a' + 'A' : (int) __x;}) +# define tolower(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + isupper (__x) ? (int) __x - 'A' + 'a' : (int) __x;}) +# else /* _MB_EXTENDED_CHARSETS* */ +/* Allow a gcc warning if the user passed 'char', but defer to the + function. */ +# define toupper(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (void) __CTYPE_PTR[__x]; (toupper) (__x);}) +# define tolower(__c) \ + __extension__ ({ __typeof__ (__c) __x = (__c); \ + (void) __CTYPE_PTR[__x]; (tolower) (__x);}) +# endif /* _MB_EXTENDED_CHARSETS* */ +# endif /* __GNUC__ */ + +#if __POSIX_VISIBLE >= 200809 +#endif /* __POSIX_VISIBLE >= 200809 */ + +#endif /* !__cplusplus */ + +_END_STD_C + +#endif /* _CTYPE_H_ */ diff --git a/lib/include/devctl.h b/lib/include/devctl.h new file mode 100644 index 0000000..46305cf --- /dev/null +++ b/lib/include/devctl.h @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016,2019 Joel Sherrill . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _POSIX_DEVCTL_h_ +#define _POSIX_DEVCTL_h_ + +/* + * Nothing in this file should be visible unless _POSIX_26_C_SOURCE is + * defined. + */ +#ifdef _POSIX_26_C_SOURCE + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__rtems__) +/* + * The FACE Technical Standard, Edition 3.0 and later require the + * definition of the subcommand SOCKCLOSE in . + * + * Reference: https://www.opengroup.org/face + * + * Using 'D' should avoid the letters used by other users of + */ +#include + +#define SOCKCLOSE _IO('D', 1) /* socket close */ +#endif + +/* + * The posix_devctl() method is defined by POSIX 1003.26-2003. Aside + * from the single method, it adds the following requirements: + * + * + define _POSIX_26_VERSION to 200312L + * + add _SC_POSIX_26_VERSION in . Return _POSIX_26_VERSION + * + application must define _POSIX_26_C_SOURCE to use posix_devctl(). + * + posix_devctl() is prototyped in + */ +int posix_devctl( + int fd, + int dcmd, + void *__restrict dev_data_ptr, + size_t nbyte, + int *__restrict dev_info_ptr +); + +#ifdef __cplusplus +} +#endif + +#endif /* _POSIX_26_C_SOURCE */ +#endif /*_POSIX_DEVCTL_h_ */ diff --git a/lib/include/dirent.h b/lib/include/dirent.h new file mode 100644 index 0000000..cdfa21f --- /dev/null +++ b/lib/include/dirent.h @@ -0,0 +1,85 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)dirent.h 8.3 (Berkeley) 8/10/94 + * $FreeBSD: head/include/dirent.h 326024 2017-11-20 19:45:28Z pfg $ + */ + +#ifndef _DIRENT_H_ +#define _DIRENT_H_ + +#include +#include + +#if !defined(MAXNAMLEN) && __BSD_VISIBLE +#define MAXNAMLEN 1024 +#endif + +__BEGIN_DECLS +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700 +int alphasort(const struct dirent **, const struct dirent **); +int dirfd(DIR *); +#endif +#if __BSD_VISIBLE +int fdclosedir(DIR *); +#endif +DIR *opendir(const char *); +DIR *fdopendir(int); +struct dirent * + readdir(DIR *); +#if __POSIX_VISIBLE >= 199506 || __XSI_VISIBLE >= 500 +int readdir_r(DIR *__restrict, struct dirent *__restrict, + struct dirent **__restrict); +#endif +void rewinddir(DIR *); +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 700 +int scandir(const char *, struct dirent ***, + int (*)(const struct dirent *), int (*)(const struct dirent **, + const struct dirent **)); +#endif +#ifdef _LIBC +void _seekdir(DIR *, long); +#endif +#if __MISC_VISIBLE || __XSI_VISIBLE +#ifndef __INSIDE_CYGWIN__ +void seekdir(DIR *, long); +long telldir(DIR *); +#endif +#endif +int closedir(DIR *); +#if __GNU_VISIBLE +int scandirat(int, const char *, struct dirent ***, + int (*) (const struct dirent *), int (*) (const struct dirent **, + const struct dirent **)); +int versionsort(const struct dirent **, const struct dirent **); +#endif +__END_DECLS + +#endif /*_DIRENT_H_*/ diff --git a/lib/include/elf.h b/lib/include/elf.h new file mode 100644 index 0000000..79d3b97 --- /dev/null +++ b/lib/include/elf.h @@ -0,0 +1,3147 @@ +/* +From musl include/elf.h + +Copyright © 2005-2014 Rich Felker, et al. + +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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef _ELF_H +#define _ELF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef uint16_t Elf32_Half; +typedef uint16_t Elf64_Half; + +typedef uint32_t Elf32_Word; +typedef int32_t Elf32_Sword; +typedef uint32_t Elf64_Word; +typedef int32_t Elf64_Sword; + +typedef uint64_t Elf32_Xword; +typedef int64_t Elf32_Sxword; +typedef uint64_t Elf64_Xword; +typedef int64_t Elf64_Sxword; + +typedef uint32_t Elf32_Addr; +typedef uint64_t Elf64_Addr; + +typedef uint32_t Elf32_Off; +typedef uint64_t Elf64_Off; + +typedef uint16_t Elf32_Section; +typedef uint16_t Elf64_Section; + +typedef Elf32_Half Elf32_Versym; +typedef Elf64_Half Elf64_Versym; + +#define EI_NIDENT (16) + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf32_Half e_type; + Elf32_Half e_machine; + Elf32_Word e_version; + Elf32_Addr e_entry; + Elf32_Off e_phoff; + Elf32_Off e_shoff; + Elf32_Word e_flags; + Elf32_Half e_ehsize; + Elf32_Half e_phentsize; + Elf32_Half e_phnum; + Elf32_Half e_shentsize; + Elf32_Half e_shnum; + Elf32_Half e_shstrndx; +} Elf32_Ehdr; + +typedef struct { + unsigned char e_ident[EI_NIDENT]; + Elf64_Half e_type; + Elf64_Half e_machine; + Elf64_Word e_version; + Elf64_Addr e_entry; + Elf64_Off e_phoff; + Elf64_Off e_shoff; + Elf64_Word e_flags; + Elf64_Half e_ehsize; + Elf64_Half e_phentsize; + Elf64_Half e_phnum; + Elf64_Half e_shentsize; + Elf64_Half e_shnum; + Elf64_Half e_shstrndx; +} Elf64_Ehdr; + +#define EI_MAG0 0 +#define ELFMAG0 0x7f + +#define EI_MAG1 1 +#define ELFMAG1 'E' + +#define EI_MAG2 2 +#define ELFMAG2 'L' + +#define EI_MAG3 3 +#define ELFMAG3 'F' + + +#define ELFMAG "\177ELF" +#define SELFMAG 4 + +#define EI_CLASS 4 +#define ELFCLASSNONE 0 +#define ELFCLASS32 1 +#define ELFCLASS64 2 +#define ELFCLASSNUM 3 + +#define EI_DATA 5 +#define ELFDATANONE 0 +#define ELFDATA2LSB 1 +#define ELFDATA2MSB 2 +#define ELFDATANUM 3 + +#define EI_VERSION 6 + + +#define EI_OSABI 7 +#define ELFOSABI_NONE 0 +#define ELFOSABI_SYSV 0 +#define ELFOSABI_HPUX 1 +#define ELFOSABI_NETBSD 2 +#define ELFOSABI_LINUX 3 +#define ELFOSABI_GNU 3 +#define ELFOSABI_SOLARIS 6 +#define ELFOSABI_AIX 7 +#define ELFOSABI_IRIX 8 +#define ELFOSABI_FREEBSD 9 +#define ELFOSABI_TRU64 10 +#define ELFOSABI_MODESTO 11 +#define ELFOSABI_OPENBSD 12 +#define ELFOSABI_ARM 97 +#define ELFOSABI_STANDALONE 255 + +#define EI_ABIVERSION 8 + +#define EI_PAD 9 + + + +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_NUM 5 +#define ET_LOOS 0xfe00 +#define ET_HIOS 0xfeff +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + + + +#define EM_NONE 0 +#define EM_M32 1 +#define EM_SPARC 2 +#define EM_386 3 +#define EM_68K 4 +#define EM_88K 5 +#define EM_860 7 +#define EM_MIPS 8 +#define EM_S370 9 +#define EM_MIPS_RS3_LE 10 + +#define EM_PARISC 15 +#define EM_VPP500 17 +#define EM_SPARC32PLUS 18 +#define EM_960 19 +#define EM_PPC 20 +#define EM_PPC64 21 +#define EM_S390 22 + +#define EM_V800 36 +#define EM_FR20 37 +#define EM_RH32 38 +#define EM_RCE 39 +#define EM_ARM 40 +#define EM_FAKE_ALPHA 41 +#define EM_SH 42 +#define EM_SPARCV9 43 +#define EM_TRICORE 44 +#define EM_ARC 45 +#define EM_H8_300 46 +#define EM_H8_300H 47 +#define EM_H8S 48 +#define EM_H8_500 49 +#define EM_IA_64 50 +#define EM_MIPS_X 51 +#define EM_COLDFIRE 52 +#define EM_68HC12 53 +#define EM_MMA 54 +#define EM_PCP 55 +#define EM_NCPU 56 +#define EM_NDR1 57 +#define EM_STARCORE 58 +#define EM_ME16 59 +#define EM_ST100 60 +#define EM_TINYJ 61 +#define EM_X86_64 62 +#define EM_PDSP 63 + +#define EM_FX66 66 +#define EM_ST9PLUS 67 +#define EM_ST7 68 +#define EM_68HC16 69 +#define EM_68HC11 70 +#define EM_68HC08 71 +#define EM_68HC05 72 +#define EM_SVX 73 +#define EM_ST19 74 +#define EM_VAX 75 +#define EM_CRIS 76 +#define EM_JAVELIN 77 +#define EM_FIREPATH 78 +#define EM_ZSP 79 +#define EM_MMIX 80 +#define EM_HUANY 81 +#define EM_PRISM 82 +#define EM_AVR 83 +#define EM_FR30 84 +#define EM_D10V 85 +#define EM_D30V 86 +#define EM_V850 87 +#define EM_M32R 88 +#define EM_MN10300 89 +#define EM_MN10200 90 +#define EM_PJ 91 +#define EM_OR1K 92 +#define EM_OPENRISC 92 +#define EM_ARC_A5 93 +#define EM_ARC_COMPACT 93 +#define EM_XTENSA 94 +#define EM_VIDEOCORE 95 +#define EM_TMM_GPP 96 +#define EM_NS32K 97 +#define EM_TPC 98 +#define EM_SNP1K 99 +#define EM_ST200 100 +#define EM_IP2K 101 +#define EM_MAX 102 +#define EM_CR 103 +#define EM_F2MC16 104 +#define EM_MSP430 105 +#define EM_BLACKFIN 106 +#define EM_SE_C33 107 +#define EM_SEP 108 +#define EM_ARCA 109 +#define EM_UNICORE 110 +#define EM_EXCESS 111 +#define EM_DXP 112 +#define EM_ALTERA_NIOS2 113 +#define EM_CRX 114 +#define EM_XGATE 115 +#define EM_C166 116 +#define EM_M16C 117 +#define EM_DSPIC30F 118 +#define EM_CE 119 +#define EM_M32C 120 +#define EM_TSK3000 131 +#define EM_RS08 132 +#define EM_SHARC 133 +#define EM_ECOG2 134 +#define EM_SCORE7 135 +#define EM_DSP24 136 +#define EM_VIDEOCORE3 137 +#define EM_LATTICEMICO32 138 +#define EM_SE_C17 139 +#define EM_TI_C6000 140 +#define EM_TI_C2000 141 +#define EM_TI_C5500 142 +#define EM_TI_ARP32 143 +#define EM_TI_PRU 144 +#define EM_MMDSP_PLUS 160 +#define EM_CYPRESS_M8C 161 +#define EM_R32C 162 +#define EM_TRIMEDIA 163 +#define EM_QDSP6 164 +#define EM_8051 165 +#define EM_STXP7X 166 +#define EM_NDS32 167 +#define EM_ECOG1X 168 +#define EM_MAXQ30 169 +#define EM_XIMO16 170 +#define EM_MANIK 171 +#define EM_CRAYNV2 172 +#define EM_RX 173 +#define EM_METAG 174 +#define EM_MCST_ELBRUS 175 +#define EM_ECOG16 176 +#define EM_CR16 177 +#define EM_ETPU 178 +#define EM_SLE9X 179 +#define EM_L10M 180 +#define EM_K10M 181 +#define EM_AARCH64 183 +#define EM_AVR32 185 +#define EM_STM8 186 +#define EM_TILE64 187 +#define EM_TILEPRO 188 +#define EM_MICROBLAZE 189 +#define EM_CUDA 190 +#define EM_TILEGX 191 +#define EM_CLOUDSHIELD 192 +#define EM_COREA_1ST 193 +#define EM_COREA_2ND 194 +#define EM_ARC_COMPACT2 195 +#define EM_OPEN8 196 +#define EM_RL78 197 +#define EM_VIDEOCORE5 198 +#define EM_78KOR 199 +#define EM_56800EX 200 +#define EM_BA1 201 +#define EM_BA2 202 +#define EM_XCORE 203 +#define EM_MCHP_PIC 204 +#define EM_KM32 210 +#define EM_KMX32 211 +#define EM_EMX16 212 +#define EM_EMX8 213 +#define EM_KVARC 214 +#define EM_CDP 215 +#define EM_COGE 216 +#define EM_COOL 217 +#define EM_NORC 218 +#define EM_CSR_KALIMBA 219 +#define EM_Z80 220 +#define EM_VISIUM 221 +#define EM_FT32 222 +#define EM_MOXIE 223 +#define EM_AMDGPU 224 +#define EM_RISCV 243 +#define EM_BPF 247 +#define EM_NUM 248 + +#define EM_ALPHA 0x9026 + +#define EV_NONE 0 +#define EV_CURRENT 1 +#define EV_NUM 2 + +typedef struct { + Elf32_Word sh_name; + Elf32_Word sh_type; + Elf32_Word sh_flags; + Elf32_Addr sh_addr; + Elf32_Off sh_offset; + Elf32_Word sh_size; + Elf32_Word sh_link; + Elf32_Word sh_info; + Elf32_Word sh_addralign; + Elf32_Word sh_entsize; +} Elf32_Shdr; + +typedef struct { + Elf64_Word sh_name; + Elf64_Word sh_type; + Elf64_Xword sh_flags; + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + Elf64_Word sh_link; + Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; +} Elf64_Shdr; + + + +#define SHN_UNDEF 0 +#define SHN_LORESERVE 0xff00 +#define SHN_LOPROC 0xff00 +#define SHN_BEFORE 0xff00 + +#define SHN_AFTER 0xff01 + +#define SHN_HIPROC 0xff1f +#define SHN_LOOS 0xff20 +#define SHN_HIOS 0xff3f +#define SHN_ABS 0xfff1 +#define SHN_COMMON 0xfff2 +#define SHN_XINDEX 0xffff +#define SHN_HIRESERVE 0xffff + + + +#define SHT_NULL 0 +#define SHT_PROGBITS 1 +#define SHT_SYMTAB 2 +#define SHT_STRTAB 3 +#define SHT_RELA 4 +#define SHT_HASH 5 +#define SHT_DYNAMIC 6 +#define SHT_NOTE 7 +#define SHT_NOBITS 8 +#define SHT_REL 9 +#define SHT_SHLIB 10 +#define SHT_DYNSYM 11 +#define SHT_INIT_ARRAY 14 +#define SHT_FINI_ARRAY 15 +#define SHT_PREINIT_ARRAY 16 +#define SHT_GROUP 17 +#define SHT_SYMTAB_SHNDX 18 +#define SHT_NUM 19 +#define SHT_LOOS 0x60000000 +#define SHT_GNU_ATTRIBUTES 0x6ffffff5 +#define SHT_GNU_HASH 0x6ffffff6 +#define SHT_GNU_LIBLIST 0x6ffffff7 +#define SHT_CHECKSUM 0x6ffffff8 +#define SHT_LOSUNW 0x6ffffffa +#define SHT_SUNW_move 0x6ffffffa +#define SHT_SUNW_COMDAT 0x6ffffffb +#define SHT_SUNW_syminfo 0x6ffffffc +#define SHT_GNU_verdef 0x6ffffffd +#define SHT_GNU_verneed 0x6ffffffe +#define SHT_GNU_versym 0x6fffffff +#define SHT_HISUNW 0x6fffffff +#define SHT_HIOS 0x6fffffff +#define SHT_LOPROC 0x70000000 +#define SHT_HIPROC 0x7fffffff +#define SHT_LOUSER 0x80000000 +#define SHT_HIUSER 0x8fffffff + +#define SHF_WRITE (1 << 0) +#define SHF_ALLOC (1 << 1) +#define SHF_EXECINSTR (1 << 2) +#define SHF_MERGE (1 << 4) +#define SHF_STRINGS (1 << 5) +#define SHF_INFO_LINK (1 << 6) +#define SHF_LINK_ORDER (1 << 7) +#define SHF_OS_NONCONFORMING (1 << 8) + +#define SHF_GROUP (1 << 9) +#define SHF_TLS (1 << 10) +#define SHF_COMPRESSED (1 << 11) +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 +#define SHF_ORDERED (1 << 30) +#define SHF_EXCLUDE (1U << 31) + +typedef struct { + Elf32_Word ch_type; + Elf32_Word ch_size; + Elf32_Word ch_addralign; +} Elf32_Chdr; + +typedef struct { + Elf64_Word ch_type; + Elf64_Word ch_reserved; + Elf64_Xword ch_size; + Elf64_Xword ch_addralign; +} Elf64_Chdr; + +#define ELFCOMPRESS_ZLIB 1 +#define ELFCOMPRESS_LOOS 0x60000000 +#define ELFCOMPRESS_HIOS 0x6fffffff +#define ELFCOMPRESS_LOPROC 0x70000000 +#define ELFCOMPRESS_HIPROC 0x7fffffff + + +#define GRP_COMDAT 0x1 + +typedef struct { + Elf32_Word st_name; + Elf32_Addr st_value; + Elf32_Word st_size; + unsigned char st_info; + unsigned char st_other; + Elf32_Section st_shndx; +} Elf32_Sym; + +typedef struct { + Elf64_Word st_name; + unsigned char st_info; + unsigned char st_other; + Elf64_Section st_shndx; + Elf64_Addr st_value; + Elf64_Xword st_size; +} Elf64_Sym; + +typedef struct { + Elf32_Half si_boundto; + Elf32_Half si_flags; +} Elf32_Syminfo; + +typedef struct { + Elf64_Half si_boundto; + Elf64_Half si_flags; +} Elf64_Syminfo; + +#define SYMINFO_BT_SELF 0xffff +#define SYMINFO_BT_PARENT 0xfffe +#define SYMINFO_BT_LOWRESERVE 0xff00 + +#define SYMINFO_FLG_DIRECT 0x0001 +#define SYMINFO_FLG_PASSTHRU 0x0002 +#define SYMINFO_FLG_COPY 0x0004 +#define SYMINFO_FLG_LAZYLOAD 0x0008 + +#define SYMINFO_NONE 0 +#define SYMINFO_CURRENT 1 +#define SYMINFO_NUM 2 + +#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) +#define ELF32_ST_TYPE(val) ((val) & 0xf) +#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) + +#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) +#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) +#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) + +#define STB_LOCAL 0 +#define STB_GLOBAL 1 +#define STB_WEAK 2 +#define STB_NUM 3 +#define STB_LOOS 10 +#define STB_GNU_UNIQUE 10 +#define STB_HIOS 12 +#define STB_LOPROC 13 +#define STB_HIPROC 15 + +#define STT_NOTYPE 0 +#define STT_OBJECT 1 +#define STT_FUNC 2 +#define STT_SECTION 3 +#define STT_FILE 4 +#define STT_COMMON 5 +#define STT_TLS 6 +#define STT_NUM 7 +#define STT_LOOS 10 +#define STT_GNU_IFUNC 10 +#define STT_HIOS 12 +#define STT_LOPROC 13 +#define STT_HIPROC 15 + +#define STN_UNDEF 0 + +#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) +#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) + +#define STV_DEFAULT 0 +#define STV_INTERNAL 1 +#define STV_HIDDEN 2 +#define STV_PROTECTED 3 + + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; +} Elf32_Rel; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; +} Elf64_Rel; + + + +typedef struct { + Elf32_Addr r_offset; + Elf32_Word r_info; + Elf32_Sword r_addend; +} Elf32_Rela; + +typedef struct { + Elf64_Addr r_offset; + Elf64_Xword r_info; + Elf64_Sxword r_addend; +} Elf64_Rela; + + + +#define ELF32_R_SYM(val) ((val) >> 8) +#define ELF32_R_TYPE(val) ((val) & 0xff) +#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) + +#define ELF64_R_SYM(i) ((i) >> 32) +#define ELF64_R_TYPE(i) ((i) & 0xffffffff) +#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) + + + +typedef struct { + Elf32_Word p_type; + Elf32_Off p_offset; + Elf32_Addr p_vaddr; + Elf32_Addr p_paddr; + Elf32_Word p_filesz; + Elf32_Word p_memsz; + Elf32_Word p_flags; + Elf32_Word p_align; +} Elf32_Phdr; + +typedef struct { + Elf64_Word p_type; + Elf64_Word p_flags; + Elf64_Off p_offset; + Elf64_Addr p_vaddr; + Elf64_Addr p_paddr; + Elf64_Xword p_filesz; + Elf64_Xword p_memsz; + Elf64_Xword p_align; +} Elf64_Phdr; + + + +#define PT_NULL 0 +#define PT_LOAD 1 +#define PT_DYNAMIC 2 +#define PT_INTERP 3 +#define PT_NOTE 4 +#define PT_SHLIB 5 +#define PT_PHDR 6 +#define PT_TLS 7 +#define PT_NUM 8 +#define PT_LOOS 0x60000000 +#define PT_GNU_EH_FRAME 0x6474e550 +#define PT_GNU_STACK 0x6474e551 +#define PT_GNU_RELRO 0x6474e552 +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa +#define PT_SUNWSTACK 0x6ffffffb +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff +#define PT_LOPROC 0x70000000 +#define PT_HIPROC 0x7fffffff + + +#define PN_XNUM 0xffff + + +#define PF_X (1 << 0) +#define PF_W (1 << 1) +#define PF_R (1 << 2) +#define PF_MASKOS 0x0ff00000 +#define PF_MASKPROC 0xf0000000 + + + +#define NT_PRSTATUS 1 +#define NT_FPREGSET 2 +#define NT_PRPSINFO 3 +#define NT_PRXREG 4 +#define NT_TASKSTRUCT 4 +#define NT_PLATFORM 5 +#define NT_AUXV 6 +#define NT_GWINDOWS 7 +#define NT_ASRS 8 +#define NT_PSTATUS 10 +#define NT_PSINFO 13 +#define NT_PRCRED 14 +#define NT_UTSNAME 15 +#define NT_LWPSTATUS 16 +#define NT_LWPSINFO 17 +#define NT_PRFPXREG 20 +#define NT_SIGINFO 0x53494749 +#define NT_FILE 0x46494c45 +#define NT_PRXFPREG 0x46e62b7f +#define NT_PPC_VMX 0x100 +#define NT_PPC_SPE 0x101 +#define NT_PPC_VSX 0x102 +#define NT_386_TLS 0x200 +#define NT_386_IOPERM 0x201 +#define NT_X86_XSTATE 0x202 +#define NT_S390_HIGH_GPRS 0x300 +#define NT_S390_TIMER 0x301 +#define NT_S390_TODCMP 0x302 +#define NT_S390_TODPREG 0x303 +#define NT_S390_CTRS 0x304 +#define NT_S390_PREFIX 0x305 +#define NT_S390_LAST_BREAK 0x306 +#define NT_S390_SYSTEM_CALL 0x307 +#define NT_S390_TDB 0x308 +#define NT_ARM_VFP 0x400 +#define NT_ARM_TLS 0x401 +#define NT_ARM_HW_BREAK 0x402 +#define NT_ARM_HW_WATCH 0x403 +#define NT_ARM_SYSTEM_CALL 0x404 +#define NT_ARM_SVE 0x405 +#define NT_METAG_CBUF 0x500 +#define NT_METAG_RPIPE 0x501 +#define NT_METAG_TLS 0x502 +#define NT_VERSION 1 + + + + +typedef struct { + Elf32_Sword d_tag; + union { + Elf32_Word d_val; + Elf32_Addr d_ptr; + } d_un; +} Elf32_Dyn; + +typedef struct { + Elf64_Sxword d_tag; + union { + Elf64_Xword d_val; + Elf64_Addr d_ptr; + } d_un; +} Elf64_Dyn; + + + +#define DT_NULL 0 +#define DT_NEEDED 1 +#define DT_PLTRELSZ 2 +#define DT_PLTGOT 3 +#define DT_HASH 4 +#define DT_STRTAB 5 +#define DT_SYMTAB 6 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_STRSZ 10 +#define DT_SYMENT 11 +#define DT_INIT 12 +#define DT_FINI 13 +#define DT_SONAME 14 +#define DT_RPATH 15 +#define DT_SYMBOLIC 16 +#define DT_REL 17 +#define DT_RELSZ 18 +#define DT_RELENT 19 +#define DT_PLTREL 20 +#define DT_DEBUG 21 +#define DT_TEXTREL 22 +#define DT_JMPREL 23 +#define DT_BIND_NOW 24 +#define DT_INIT_ARRAY 25 +#define DT_FINI_ARRAY 26 +#define DT_INIT_ARRAYSZ 27 +#define DT_FINI_ARRAYSZ 28 +#define DT_RUNPATH 29 +#define DT_FLAGS 30 +#define DT_ENCODING 32 +#define DT_PREINIT_ARRAY 32 +#define DT_PREINIT_ARRAYSZ 33 +#define DT_NUM 34 +#define DT_LOOS 0x6000000d +#define DT_HIOS 0x6ffff000 +#define DT_LOPROC 0x70000000 +#define DT_HIPROC 0x7fffffff +#define DT_PROCNUM DT_MIPS_NUM + +#define DT_VALRNGLO 0x6ffffd00 +#define DT_GNU_PRELINKED 0x6ffffdf5 +#define DT_GNU_CONFLICTSZ 0x6ffffdf6 +#define DT_GNU_LIBLISTSZ 0x6ffffdf7 +#define DT_CHECKSUM 0x6ffffdf8 +#define DT_PLTPADSZ 0x6ffffdf9 +#define DT_MOVEENT 0x6ffffdfa +#define DT_MOVESZ 0x6ffffdfb +#define DT_FEATURE_1 0x6ffffdfc +#define DT_POSFLAG_1 0x6ffffdfd + +#define DT_SYMINSZ 0x6ffffdfe +#define DT_SYMINENT 0x6ffffdff +#define DT_VALRNGHI 0x6ffffdff +#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) +#define DT_VALNUM 12 + +#define DT_ADDRRNGLO 0x6ffffe00 +#define DT_GNU_HASH 0x6ffffef5 +#define DT_TLSDESC_PLT 0x6ffffef6 +#define DT_TLSDESC_GOT 0x6ffffef7 +#define DT_GNU_CONFLICT 0x6ffffef8 +#define DT_GNU_LIBLIST 0x6ffffef9 +#define DT_CONFIG 0x6ffffefa +#define DT_DEPAUDIT 0x6ffffefb +#define DT_AUDIT 0x6ffffefc +#define DT_PLTPAD 0x6ffffefd +#define DT_MOVETAB 0x6ffffefe +#define DT_SYMINFO 0x6ffffeff +#define DT_ADDRRNGHI 0x6ffffeff +#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) +#define DT_ADDRNUM 11 + + + +#define DT_VERSYM 0x6ffffff0 + +#define DT_RELACOUNT 0x6ffffff9 +#define DT_RELCOUNT 0x6ffffffa + + +#define DT_FLAGS_1 0x6ffffffb +#define DT_VERDEF 0x6ffffffc + +#define DT_VERDEFNUM 0x6ffffffd +#define DT_VERNEED 0x6ffffffe + +#define DT_VERNEEDNUM 0x6fffffff +#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) +#define DT_VERSIONTAGNUM 16 + + + +#define DT_AUXILIARY 0x7ffffffd +#define DT_FILTER 0x7fffffff +#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) +#define DT_EXTRANUM 3 + + +#define DF_ORIGIN 0x00000001 +#define DF_SYMBOLIC 0x00000002 +#define DF_TEXTREL 0x00000004 +#define DF_BIND_NOW 0x00000008 +#define DF_STATIC_TLS 0x00000010 + + + +#define DF_1_NOW 0x00000001 +#define DF_1_GLOBAL 0x00000002 +#define DF_1_GROUP 0x00000004 +#define DF_1_NODELETE 0x00000008 +#define DF_1_LOADFLTR 0x00000010 +#define DF_1_INITFIRST 0x00000020 +#define DF_1_NOOPEN 0x00000040 +#define DF_1_ORIGIN 0x00000080 +#define DF_1_DIRECT 0x00000100 +#define DF_1_TRANS 0x00000200 +#define DF_1_INTERPOSE 0x00000400 +#define DF_1_NODEFLIB 0x00000800 +#define DF_1_NODUMP 0x00001000 +#define DF_1_CONFALT 0x00002000 +#define DF_1_ENDFILTEE 0x00004000 +#define DF_1_DISPRELDNE 0x00008000 +#define DF_1_DISPRELPND 0x00010000 +#define DF_1_NODIRECT 0x00020000 +#define DF_1_IGNMULDEF 0x00040000 +#define DF_1_NOKSYMS 0x00080000 +#define DF_1_NOHDR 0x00100000 +#define DF_1_EDITED 0x00200000 +#define DF_1_NORELOC 0x00400000 +#define DF_1_SYMINTPOSE 0x00800000 +#define DF_1_GLOBAUDIT 0x01000000 +#define DF_1_SINGLETON 0x02000000 + +#define DTF_1_PARINIT 0x00000001 +#define DTF_1_CONFEXP 0x00000002 + + +#define DF_P1_LAZYLOAD 0x00000001 +#define DF_P1_GROUPPERM 0x00000002 + + + + +typedef struct { + Elf32_Half vd_version; + Elf32_Half vd_flags; + Elf32_Half vd_ndx; + Elf32_Half vd_cnt; + Elf32_Word vd_hash; + Elf32_Word vd_aux; + Elf32_Word vd_next; +} Elf32_Verdef; + +typedef struct { + Elf64_Half vd_version; + Elf64_Half vd_flags; + Elf64_Half vd_ndx; + Elf64_Half vd_cnt; + Elf64_Word vd_hash; + Elf64_Word vd_aux; + Elf64_Word vd_next; +} Elf64_Verdef; + + + +#define VER_DEF_NONE 0 +#define VER_DEF_CURRENT 1 +#define VER_DEF_NUM 2 + + +#define VER_FLG_BASE 0x1 +#define VER_FLG_WEAK 0x2 + + +#define VER_NDX_LOCAL 0 +#define VER_NDX_GLOBAL 1 +#define VER_NDX_LORESERVE 0xff00 +#define VER_NDX_ELIMINATE 0xff01 + + + +typedef struct { + Elf32_Word vda_name; + Elf32_Word vda_next; +} Elf32_Verdaux; + +typedef struct { + Elf64_Word vda_name; + Elf64_Word vda_next; +} Elf64_Verdaux; + + + + +typedef struct { + Elf32_Half vn_version; + Elf32_Half vn_cnt; + Elf32_Word vn_file; + Elf32_Word vn_aux; + Elf32_Word vn_next; +} Elf32_Verneed; + +typedef struct { + Elf64_Half vn_version; + Elf64_Half vn_cnt; + Elf64_Word vn_file; + Elf64_Word vn_aux; + Elf64_Word vn_next; +} Elf64_Verneed; + + + +#define VER_NEED_NONE 0 +#define VER_NEED_CURRENT 1 +#define VER_NEED_NUM 2 + + + +typedef struct { + Elf32_Word vna_hash; + Elf32_Half vna_flags; + Elf32_Half vna_other; + Elf32_Word vna_name; + Elf32_Word vna_next; +} Elf32_Vernaux; + +typedef struct { + Elf64_Word vna_hash; + Elf64_Half vna_flags; + Elf64_Half vna_other; + Elf64_Word vna_name; + Elf64_Word vna_next; +} Elf64_Vernaux; + + + +#define VER_FLG_WEAK 0x2 + + + +typedef struct { + uint32_t a_type; + union { + uint32_t a_val; + } a_un; +} Elf32_auxv_t; + +typedef struct { + uint64_t a_type; + union { + uint64_t a_val; + } a_un; +} Elf64_auxv_t; + + + +#define AT_NULL 0 +#define AT_IGNORE 1 +#define AT_EXECFD 2 +#define AT_PHDR 3 +#define AT_PHENT 4 +#define AT_PHNUM 5 +#define AT_PAGESZ 6 +#define AT_BASE 7 +#define AT_FLAGS 8 +#define AT_ENTRY 9 +#define AT_NOTELF 10 +#define AT_UID 11 +#define AT_EUID 12 +#define AT_GID 13 +#define AT_EGID 14 +#define AT_CLKTCK 17 + + +#define AT_PLATFORM 15 +#define AT_HWCAP 16 + + + + +#define AT_FPUCW 18 + + +#define AT_DCACHEBSIZE 19 +#define AT_ICACHEBSIZE 20 +#define AT_UCACHEBSIZE 21 + + + +#define AT_IGNOREPPC 22 + +#define AT_SECURE 23 + +#define AT_BASE_PLATFORM 24 + +#define AT_RANDOM 25 + +#define AT_HWCAP2 26 + +#define AT_EXECFN 31 + + + +#define AT_SYSINFO 32 +#define AT_SYSINFO_EHDR 33 + + + +#define AT_L1I_CACHESHAPE 34 +#define AT_L1D_CACHESHAPE 35 +#define AT_L2_CACHESHAPE 36 +#define AT_L3_CACHESHAPE 37 + + + + +typedef struct { + Elf32_Word n_namesz; + Elf32_Word n_descsz; + Elf32_Word n_type; +} Elf32_Nhdr; + +typedef struct { + Elf64_Word n_namesz; + Elf64_Word n_descsz; + Elf64_Word n_type; +} Elf64_Nhdr; + + + + +#define ELF_NOTE_SOLARIS "SUNW Solaris" + + +#define ELF_NOTE_GNU "GNU" + + + + + +#define ELF_NOTE_PAGESIZE_HINT 1 + + +#define NT_GNU_ABI_TAG 1 +#define ELF_NOTE_ABI NT_GNU_ABI_TAG + + + +#define ELF_NOTE_OS_LINUX 0 +#define ELF_NOTE_OS_GNU 1 +#define ELF_NOTE_OS_SOLARIS2 2 +#define ELF_NOTE_OS_FREEBSD 3 + +#define NT_GNU_BUILD_ID 3 +#define NT_GNU_GOLD_VERSION 4 + + + +typedef struct { + Elf32_Xword m_value; + Elf32_Word m_info; + Elf32_Word m_poffset; + Elf32_Half m_repeat; + Elf32_Half m_stride; +} Elf32_Move; + +typedef struct { + Elf64_Xword m_value; + Elf64_Xword m_info; + Elf64_Xword m_poffset; + Elf64_Half m_repeat; + Elf64_Half m_stride; +} Elf64_Move; + + +#define ELF32_M_SYM(info) ((info) >> 8) +#define ELF32_M_SIZE(info) ((unsigned char) (info)) +#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) + +#define ELF64_M_SYM(info) ELF32_M_SYM (info) +#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) +#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) + +#define EF_CPU32 0x00810000 + +#define R_68K_NONE 0 +#define R_68K_32 1 +#define R_68K_16 2 +#define R_68K_8 3 +#define R_68K_PC32 4 +#define R_68K_PC16 5 +#define R_68K_PC8 6 +#define R_68K_GOT32 7 +#define R_68K_GOT16 8 +#define R_68K_GOT8 9 +#define R_68K_GOT32O 10 +#define R_68K_GOT16O 11 +#define R_68K_GOT8O 12 +#define R_68K_PLT32 13 +#define R_68K_PLT16 14 +#define R_68K_PLT8 15 +#define R_68K_PLT32O 16 +#define R_68K_PLT16O 17 +#define R_68K_PLT8O 18 +#define R_68K_COPY 19 +#define R_68K_GLOB_DAT 20 +#define R_68K_JMP_SLOT 21 +#define R_68K_RELATIVE 22 +#define R_68K_NUM 23 + +#define R_386_NONE 0 +#define R_386_32 1 +#define R_386_PC32 2 +#define R_386_GOT32 3 +#define R_386_PLT32 4 +#define R_386_COPY 5 +#define R_386_GLOB_DAT 6 +#define R_386_JMP_SLOT 7 +#define R_386_RELATIVE 8 +#define R_386_GOTOFF 9 +#define R_386_GOTPC 10 +#define R_386_32PLT 11 +#define R_386_TLS_TPOFF 14 +#define R_386_TLS_IE 15 +#define R_386_TLS_GOTIE 16 +#define R_386_TLS_LE 17 +#define R_386_TLS_GD 18 +#define R_386_TLS_LDM 19 +#define R_386_16 20 +#define R_386_PC16 21 +#define R_386_8 22 +#define R_386_PC8 23 +#define R_386_TLS_GD_32 24 +#define R_386_TLS_GD_PUSH 25 +#define R_386_TLS_GD_CALL 26 +#define R_386_TLS_GD_POP 27 +#define R_386_TLS_LDM_32 28 +#define R_386_TLS_LDM_PUSH 29 +#define R_386_TLS_LDM_CALL 30 +#define R_386_TLS_LDM_POP 31 +#define R_386_TLS_LDO_32 32 +#define R_386_TLS_IE_32 33 +#define R_386_TLS_LE_32 34 +#define R_386_TLS_DTPMOD32 35 +#define R_386_TLS_DTPOFF32 36 +#define R_386_TLS_TPOFF32 37 +#define R_386_SIZE32 38 +#define R_386_TLS_GOTDESC 39 +#define R_386_TLS_DESC_CALL 40 +#define R_386_TLS_DESC 41 +#define R_386_IRELATIVE 42 +#define R_386_GOT32X 43 +#define R_386_NUM 44 + + + + + +#define STT_SPARC_REGISTER 13 + + + +#define EF_SPARCV9_MM 3 +#define EF_SPARCV9_TSO 0 +#define EF_SPARCV9_PSO 1 +#define EF_SPARCV9_RMO 2 +#define EF_SPARC_LEDATA 0x800000 +#define EF_SPARC_EXT_MASK 0xFFFF00 +#define EF_SPARC_32PLUS 0x000100 +#define EF_SPARC_SUN_US1 0x000200 +#define EF_SPARC_HAL_R1 0x000400 +#define EF_SPARC_SUN_US3 0x000800 + + + +#define R_SPARC_NONE 0 +#define R_SPARC_8 1 +#define R_SPARC_16 2 +#define R_SPARC_32 3 +#define R_SPARC_DISP8 4 +#define R_SPARC_DISP16 5 +#define R_SPARC_DISP32 6 +#define R_SPARC_WDISP30 7 +#define R_SPARC_WDISP22 8 +#define R_SPARC_HI22 9 +#define R_SPARC_22 10 +#define R_SPARC_13 11 +#define R_SPARC_LO10 12 +#define R_SPARC_GOT10 13 +#define R_SPARC_GOT13 14 +#define R_SPARC_GOT22 15 +#define R_SPARC_PC10 16 +#define R_SPARC_PC22 17 +#define R_SPARC_WPLT30 18 +#define R_SPARC_COPY 19 +#define R_SPARC_GLOB_DAT 20 +#define R_SPARC_JMP_SLOT 21 +#define R_SPARC_RELATIVE 22 +#define R_SPARC_UA32 23 + + + +#define R_SPARC_PLT32 24 +#define R_SPARC_HIPLT22 25 +#define R_SPARC_LOPLT10 26 +#define R_SPARC_PCPLT32 27 +#define R_SPARC_PCPLT22 28 +#define R_SPARC_PCPLT10 29 +#define R_SPARC_10 30 +#define R_SPARC_11 31 +#define R_SPARC_64 32 +#define R_SPARC_OLO10 33 +#define R_SPARC_HH22 34 +#define R_SPARC_HM10 35 +#define R_SPARC_LM22 36 +#define R_SPARC_PC_HH22 37 +#define R_SPARC_PC_HM10 38 +#define R_SPARC_PC_LM22 39 +#define R_SPARC_WDISP16 40 +#define R_SPARC_WDISP19 41 +#define R_SPARC_GLOB_JMP 42 +#define R_SPARC_7 43 +#define R_SPARC_5 44 +#define R_SPARC_6 45 +#define R_SPARC_DISP64 46 +#define R_SPARC_PLT64 47 +#define R_SPARC_HIX22 48 +#define R_SPARC_LOX10 49 +#define R_SPARC_H44 50 +#define R_SPARC_M44 51 +#define R_SPARC_L44 52 +#define R_SPARC_REGISTER 53 +#define R_SPARC_UA64 54 +#define R_SPARC_UA16 55 +#define R_SPARC_TLS_GD_HI22 56 +#define R_SPARC_TLS_GD_LO10 57 +#define R_SPARC_TLS_GD_ADD 58 +#define R_SPARC_TLS_GD_CALL 59 +#define R_SPARC_TLS_LDM_HI22 60 +#define R_SPARC_TLS_LDM_LO10 61 +#define R_SPARC_TLS_LDM_ADD 62 +#define R_SPARC_TLS_LDM_CALL 63 +#define R_SPARC_TLS_LDO_HIX22 64 +#define R_SPARC_TLS_LDO_LOX10 65 +#define R_SPARC_TLS_LDO_ADD 66 +#define R_SPARC_TLS_IE_HI22 67 +#define R_SPARC_TLS_IE_LO10 68 +#define R_SPARC_TLS_IE_LD 69 +#define R_SPARC_TLS_IE_LDX 70 +#define R_SPARC_TLS_IE_ADD 71 +#define R_SPARC_TLS_LE_HIX22 72 +#define R_SPARC_TLS_LE_LOX10 73 +#define R_SPARC_TLS_DTPMOD32 74 +#define R_SPARC_TLS_DTPMOD64 75 +#define R_SPARC_TLS_DTPOFF32 76 +#define R_SPARC_TLS_DTPOFF64 77 +#define R_SPARC_TLS_TPOFF32 78 +#define R_SPARC_TLS_TPOFF64 79 +#define R_SPARC_GOTDATA_HIX22 80 +#define R_SPARC_GOTDATA_LOX10 81 +#define R_SPARC_GOTDATA_OP_HIX22 82 +#define R_SPARC_GOTDATA_OP_LOX10 83 +#define R_SPARC_GOTDATA_OP 84 +#define R_SPARC_H34 85 +#define R_SPARC_SIZE32 86 +#define R_SPARC_SIZE64 87 +#define R_SPARC_GNU_VTINHERIT 250 +#define R_SPARC_GNU_VTENTRY 251 +#define R_SPARC_REV32 252 + +#define R_SPARC_NUM 253 + + + +#define DT_SPARC_REGISTER 0x70000001 +#define DT_SPARC_NUM 2 + + +#define EF_MIPS_NOREORDER 1 +#define EF_MIPS_PIC 2 +#define EF_MIPS_CPIC 4 +#define EF_MIPS_XGOT 8 +#define EF_MIPS_64BIT_WHIRL 16 +#define EF_MIPS_ABI2 32 +#define EF_MIPS_ABI_ON32 64 +#define EF_MIPS_FP64 512 +#define EF_MIPS_NAN2008 1024 +#define EF_MIPS_ARCH 0xf0000000 + + + +#define EF_MIPS_ARCH_1 0x00000000 +#define EF_MIPS_ARCH_2 0x10000000 +#define EF_MIPS_ARCH_3 0x20000000 +#define EF_MIPS_ARCH_4 0x30000000 +#define EF_MIPS_ARCH_5 0x40000000 +#define EF_MIPS_ARCH_32 0x50000000 +#define EF_MIPS_ARCH_64 0x60000000 +#define EF_MIPS_ARCH_32R2 0x70000000 +#define EF_MIPS_ARCH_64R2 0x80000000 + + +#define E_MIPS_ARCH_1 0x00000000 +#define E_MIPS_ARCH_2 0x10000000 +#define E_MIPS_ARCH_3 0x20000000 +#define E_MIPS_ARCH_4 0x30000000 +#define E_MIPS_ARCH_5 0x40000000 +#define E_MIPS_ARCH_32 0x50000000 +#define E_MIPS_ARCH_64 0x60000000 + + + +#define SHN_MIPS_ACOMMON 0xff00 +#define SHN_MIPS_TEXT 0xff01 +#define SHN_MIPS_DATA 0xff02 +#define SHN_MIPS_SCOMMON 0xff03 +#define SHN_MIPS_SUNDEFINED 0xff04 + + + +#define SHT_MIPS_LIBLIST 0x70000000 +#define SHT_MIPS_MSYM 0x70000001 +#define SHT_MIPS_CONFLICT 0x70000002 +#define SHT_MIPS_GPTAB 0x70000003 +#define SHT_MIPS_UCODE 0x70000004 +#define SHT_MIPS_DEBUG 0x70000005 +#define SHT_MIPS_REGINFO 0x70000006 +#define SHT_MIPS_PACKAGE 0x70000007 +#define SHT_MIPS_PACKSYM 0x70000008 +#define SHT_MIPS_RELD 0x70000009 +#define SHT_MIPS_IFACE 0x7000000b +#define SHT_MIPS_CONTENT 0x7000000c +#define SHT_MIPS_OPTIONS 0x7000000d +#define SHT_MIPS_SHDR 0x70000010 +#define SHT_MIPS_FDESC 0x70000011 +#define SHT_MIPS_EXTSYM 0x70000012 +#define SHT_MIPS_DENSE 0x70000013 +#define SHT_MIPS_PDESC 0x70000014 +#define SHT_MIPS_LOCSYM 0x70000015 +#define SHT_MIPS_AUXSYM 0x70000016 +#define SHT_MIPS_OPTSYM 0x70000017 +#define SHT_MIPS_LOCSTR 0x70000018 +#define SHT_MIPS_LINE 0x70000019 +#define SHT_MIPS_RFDESC 0x7000001a +#define SHT_MIPS_DELTASYM 0x7000001b +#define SHT_MIPS_DELTAINST 0x7000001c +#define SHT_MIPS_DELTACLASS 0x7000001d +#define SHT_MIPS_DWARF 0x7000001e +#define SHT_MIPS_DELTADECL 0x7000001f +#define SHT_MIPS_SYMBOL_LIB 0x70000020 +#define SHT_MIPS_EVENTS 0x70000021 +#define SHT_MIPS_TRANSLATE 0x70000022 +#define SHT_MIPS_PIXIE 0x70000023 +#define SHT_MIPS_XLATE 0x70000024 +#define SHT_MIPS_XLATE_DEBUG 0x70000025 +#define SHT_MIPS_WHIRL 0x70000026 +#define SHT_MIPS_EH_REGION 0x70000027 +#define SHT_MIPS_XLATE_OLD 0x70000028 +#define SHT_MIPS_PDR_EXCEPTION 0x70000029 + + + +#define SHF_MIPS_GPREL 0x10000000 +#define SHF_MIPS_MERGE 0x20000000 +#define SHF_MIPS_ADDR 0x40000000 +#define SHF_MIPS_STRINGS 0x80000000 +#define SHF_MIPS_NOSTRIP 0x08000000 +#define SHF_MIPS_LOCAL 0x04000000 +#define SHF_MIPS_NAMES 0x02000000 +#define SHF_MIPS_NODUPE 0x01000000 + + + + + +#define STO_MIPS_DEFAULT 0x0 +#define STO_MIPS_INTERNAL 0x1 +#define STO_MIPS_HIDDEN 0x2 +#define STO_MIPS_PROTECTED 0x3 +#define STO_MIPS_PLT 0x8 +#define STO_MIPS_SC_ALIGN_UNUSED 0xff + + +#define STB_MIPS_SPLIT_COMMON 13 + + + +typedef union { + struct { + Elf32_Word gt_current_g_value; + Elf32_Word gt_unused; + } gt_header; + struct { + Elf32_Word gt_g_value; + Elf32_Word gt_bytes; + } gt_entry; +} Elf32_gptab; + + + +typedef struct { + Elf32_Word ri_gprmask; + Elf32_Word ri_cprmask[4]; + Elf32_Sword ri_gp_value; +} Elf32_RegInfo; + + + +typedef struct { + unsigned char kind; + + unsigned char size; + Elf32_Section section; + + Elf32_Word info; +} Elf_Options; + + + +#define ODK_NULL 0 +#define ODK_REGINFO 1 +#define ODK_EXCEPTIONS 2 +#define ODK_PAD 3 +#define ODK_HWPATCH 4 +#define ODK_FILL 5 +#define ODK_TAGS 6 +#define ODK_HWAND 7 +#define ODK_HWOR 8 + + + +#define OEX_FPU_MIN 0x1f +#define OEX_FPU_MAX 0x1f00 +#define OEX_PAGE0 0x10000 +#define OEX_SMM 0x20000 +#define OEX_FPDBUG 0x40000 +#define OEX_PRECISEFP OEX_FPDBUG +#define OEX_DISMISS 0x80000 + +#define OEX_FPU_INVAL 0x10 +#define OEX_FPU_DIV0 0x08 +#define OEX_FPU_OFLO 0x04 +#define OEX_FPU_UFLO 0x02 +#define OEX_FPU_INEX 0x01 + + + +#define OHW_R4KEOP 0x1 +#define OHW_R8KPFETCH 0x2 +#define OHW_R5KEOP 0x4 +#define OHW_R5KCVTL 0x8 + +#define OPAD_PREFIX 0x1 +#define OPAD_POSTFIX 0x2 +#define OPAD_SYMBOL 0x4 + + + +typedef struct { + Elf32_Word hwp_flags1; + Elf32_Word hwp_flags2; +} Elf_Options_Hw; + + + +#define OHWA0_R4KEOP_CHECKED 0x00000001 +#define OHWA1_R4KEOP_CLEAN 0x00000002 + + + +#define R_MIPS_NONE 0 +#define R_MIPS_16 1 +#define R_MIPS_32 2 +#define R_MIPS_REL32 3 +#define R_MIPS_26 4 +#define R_MIPS_HI16 5 +#define R_MIPS_LO16 6 +#define R_MIPS_GPREL16 7 +#define R_MIPS_LITERAL 8 +#define R_MIPS_GOT16 9 +#define R_MIPS_PC16 10 +#define R_MIPS_CALL16 11 +#define R_MIPS_GPREL32 12 + +#define R_MIPS_SHIFT5 16 +#define R_MIPS_SHIFT6 17 +#define R_MIPS_64 18 +#define R_MIPS_GOT_DISP 19 +#define R_MIPS_GOT_PAGE 20 +#define R_MIPS_GOT_OFST 21 +#define R_MIPS_GOT_HI16 22 +#define R_MIPS_GOT_LO16 23 +#define R_MIPS_SUB 24 +#define R_MIPS_INSERT_A 25 +#define R_MIPS_INSERT_B 26 +#define R_MIPS_DELETE 27 +#define R_MIPS_HIGHER 28 +#define R_MIPS_HIGHEST 29 +#define R_MIPS_CALL_HI16 30 +#define R_MIPS_CALL_LO16 31 +#define R_MIPS_SCN_DISP 32 +#define R_MIPS_REL16 33 +#define R_MIPS_ADD_IMMEDIATE 34 +#define R_MIPS_PJUMP 35 +#define R_MIPS_RELGOT 36 +#define R_MIPS_JALR 37 +#define R_MIPS_TLS_DTPMOD32 38 +#define R_MIPS_TLS_DTPREL32 39 +#define R_MIPS_TLS_DTPMOD64 40 +#define R_MIPS_TLS_DTPREL64 41 +#define R_MIPS_TLS_GD 42 +#define R_MIPS_TLS_LDM 43 +#define R_MIPS_TLS_DTPREL_HI16 44 +#define R_MIPS_TLS_DTPREL_LO16 45 +#define R_MIPS_TLS_GOTTPREL 46 +#define R_MIPS_TLS_TPREL32 47 +#define R_MIPS_TLS_TPREL64 48 +#define R_MIPS_TLS_TPREL_HI16 49 +#define R_MIPS_TLS_TPREL_LO16 50 +#define R_MIPS_GLOB_DAT 51 +#define R_MIPS_COPY 126 +#define R_MIPS_JUMP_SLOT 127 + +#define R_MIPS_NUM 128 + + + +#define PT_MIPS_REGINFO 0x70000000 +#define PT_MIPS_RTPROC 0x70000001 +#define PT_MIPS_OPTIONS 0x70000002 +#define PT_MIPS_ABIFLAGS 0x70000003 + + + +#define PF_MIPS_LOCAL 0x10000000 + + + +#define DT_MIPS_RLD_VERSION 0x70000001 +#define DT_MIPS_TIME_STAMP 0x70000002 +#define DT_MIPS_ICHECKSUM 0x70000003 +#define DT_MIPS_IVERSION 0x70000004 +#define DT_MIPS_FLAGS 0x70000005 +#define DT_MIPS_BASE_ADDRESS 0x70000006 +#define DT_MIPS_MSYM 0x70000007 +#define DT_MIPS_CONFLICT 0x70000008 +#define DT_MIPS_LIBLIST 0x70000009 +#define DT_MIPS_LOCAL_GOTNO 0x7000000a +#define DT_MIPS_CONFLICTNO 0x7000000b +#define DT_MIPS_LIBLISTNO 0x70000010 +#define DT_MIPS_SYMTABNO 0x70000011 +#define DT_MIPS_UNREFEXTNO 0x70000012 +#define DT_MIPS_GOTSYM 0x70000013 +#define DT_MIPS_HIPAGENO 0x70000014 +#define DT_MIPS_RLD_MAP 0x70000016 +#define DT_MIPS_DELTA_CLASS 0x70000017 +#define DT_MIPS_DELTA_CLASS_NO 0x70000018 + +#define DT_MIPS_DELTA_INSTANCE 0x70000019 +#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a + +#define DT_MIPS_DELTA_RELOC 0x7000001b +#define DT_MIPS_DELTA_RELOC_NO 0x7000001c + +#define DT_MIPS_DELTA_SYM 0x7000001d + +#define DT_MIPS_DELTA_SYM_NO 0x7000001e + +#define DT_MIPS_DELTA_CLASSSYM 0x70000020 + +#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 + +#define DT_MIPS_CXX_FLAGS 0x70000022 +#define DT_MIPS_PIXIE_INIT 0x70000023 +#define DT_MIPS_SYMBOL_LIB 0x70000024 +#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 +#define DT_MIPS_LOCAL_GOTIDX 0x70000026 +#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 +#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 +#define DT_MIPS_OPTIONS 0x70000029 +#define DT_MIPS_INTERFACE 0x7000002a +#define DT_MIPS_DYNSTR_ALIGN 0x7000002b +#define DT_MIPS_INTERFACE_SIZE 0x7000002c +#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d + +#define DT_MIPS_PERF_SUFFIX 0x7000002e + +#define DT_MIPS_COMPACT_SIZE 0x7000002f +#define DT_MIPS_GP_VALUE 0x70000030 +#define DT_MIPS_AUX_DYNAMIC 0x70000031 + +#define DT_MIPS_PLTGOT 0x70000032 + +#define DT_MIPS_RWPLT 0x70000034 +#define DT_MIPS_RLD_MAP_REL 0x70000035 +#define DT_MIPS_NUM 0x36 + + + +#define RHF_NONE 0 +#define RHF_QUICKSTART (1 << 0) +#define RHF_NOTPOT (1 << 1) +#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) +#define RHF_NO_MOVE (1 << 3) +#define RHF_SGI_ONLY (1 << 4) +#define RHF_GUARANTEE_INIT (1 << 5) +#define RHF_DELTA_C_PLUS_PLUS (1 << 6) +#define RHF_GUARANTEE_START_INIT (1 << 7) +#define RHF_PIXIE (1 << 8) +#define RHF_DEFAULT_DELAY_LOAD (1 << 9) +#define RHF_REQUICKSTART (1 << 10) +#define RHF_REQUICKSTARTED (1 << 11) +#define RHF_CORD (1 << 12) +#define RHF_NO_UNRES_UNDEF (1 << 13) +#define RHF_RLD_ORDER_SAFE (1 << 14) + + + +typedef struct { + Elf32_Word l_name; + Elf32_Word l_time_stamp; + Elf32_Word l_checksum; + Elf32_Word l_version; + Elf32_Word l_flags; +} Elf32_Lib; + +typedef struct { + Elf64_Word l_name; + Elf64_Word l_time_stamp; + Elf64_Word l_checksum; + Elf64_Word l_version; + Elf64_Word l_flags; +} Elf64_Lib; + + + + +#define LL_NONE 0 +#define LL_EXACT_MATCH (1 << 0) +#define LL_IGNORE_INT_VER (1 << 1) +#define LL_REQUIRE_MINOR (1 << 2) +#define LL_EXPORTS (1 << 3) +#define LL_DELAY_LOAD (1 << 4) +#define LL_DELTA (1 << 5) + + + +typedef Elf32_Addr Elf32_Conflict; + +typedef struct { + Elf32_Half version; + unsigned char isa_level; + unsigned char isa_rev; + unsigned char gpr_size; + unsigned char cpr1_size; + unsigned char cpr2_size; + unsigned char fp_abi; + Elf32_Word isa_ext; + Elf32_Word ases; + Elf32_Word flags1; + Elf32_Word flags2; +} Elf_MIPS_ABIFlags_v0; + +#define MIPS_AFL_REG_NONE 0x00 +#define MIPS_AFL_REG_32 0x01 +#define MIPS_AFL_REG_64 0x02 +#define MIPS_AFL_REG_128 0x03 + +#define MIPS_AFL_ASE_DSP 0x00000001 +#define MIPS_AFL_ASE_DSPR2 0x00000002 +#define MIPS_AFL_ASE_EVA 0x00000004 +#define MIPS_AFL_ASE_MCU 0x00000008 +#define MIPS_AFL_ASE_MDMX 0x00000010 +#define MIPS_AFL_ASE_MIPS3D 0x00000020 +#define MIPS_AFL_ASE_MT 0x00000040 +#define MIPS_AFL_ASE_SMARTMIPS 0x00000080 +#define MIPS_AFL_ASE_VIRT 0x00000100 +#define MIPS_AFL_ASE_MSA 0x00000200 +#define MIPS_AFL_ASE_MIPS16 0x00000400 +#define MIPS_AFL_ASE_MICROMIPS 0x00000800 +#define MIPS_AFL_ASE_XPA 0x00001000 +#define MIPS_AFL_ASE_MASK 0x00001fff + +#define MIPS_AFL_EXT_XLR 1 +#define MIPS_AFL_EXT_OCTEON2 2 +#define MIPS_AFL_EXT_OCTEONP 3 +#define MIPS_AFL_EXT_LOONGSON_3A 4 +#define MIPS_AFL_EXT_OCTEON 5 +#define MIPS_AFL_EXT_5900 6 +#define MIPS_AFL_EXT_4650 7 +#define MIPS_AFL_EXT_4010 8 +#define MIPS_AFL_EXT_4100 9 +#define MIPS_AFL_EXT_3900 10 +#define MIPS_AFL_EXT_10000 11 +#define MIPS_AFL_EXT_SB1 12 +#define MIPS_AFL_EXT_4111 13 +#define MIPS_AFL_EXT_4120 14 +#define MIPS_AFL_EXT_5400 15 +#define MIPS_AFL_EXT_5500 16 +#define MIPS_AFL_EXT_LOONGSON_2E 17 +#define MIPS_AFL_EXT_LOONGSON_2F 18 + +#define MIPS_AFL_FLAGS1_ODDSPREG 1 + +enum +{ + Val_GNU_MIPS_ABI_FP_ANY = 0, + Val_GNU_MIPS_ABI_FP_DOUBLE = 1, + Val_GNU_MIPS_ABI_FP_SINGLE = 2, + Val_GNU_MIPS_ABI_FP_SOFT = 3, + Val_GNU_MIPS_ABI_FP_OLD_64 = 4, + Val_GNU_MIPS_ABI_FP_XX = 5, + Val_GNU_MIPS_ABI_FP_64 = 6, + Val_GNU_MIPS_ABI_FP_64A = 7, + Val_GNU_MIPS_ABI_FP_MAX = 7 +}; + + + + +#define EF_PARISC_TRAPNIL 0x00010000 +#define EF_PARISC_EXT 0x00020000 +#define EF_PARISC_LSB 0x00040000 +#define EF_PARISC_WIDE 0x00080000 +#define EF_PARISC_NO_KABP 0x00100000 + +#define EF_PARISC_LAZYSWAP 0x00400000 +#define EF_PARISC_ARCH 0x0000ffff + + + +#define EFA_PARISC_1_0 0x020b +#define EFA_PARISC_1_1 0x0210 +#define EFA_PARISC_2_0 0x0214 + + + +#define SHN_PARISC_ANSI_COMMON 0xff00 + +#define SHN_PARISC_HUGE_COMMON 0xff01 + + + +#define SHT_PARISC_EXT 0x70000000 +#define SHT_PARISC_UNWIND 0x70000001 +#define SHT_PARISC_DOC 0x70000002 + + + +#define SHF_PARISC_SHORT 0x20000000 +#define SHF_PARISC_HUGE 0x40000000 +#define SHF_PARISC_SBP 0x80000000 + + + +#define STT_PARISC_MILLICODE 13 + +#define STT_HP_OPAQUE (STT_LOOS + 0x1) +#define STT_HP_STUB (STT_LOOS + 0x2) + + + +#define R_PARISC_NONE 0 +#define R_PARISC_DIR32 1 +#define R_PARISC_DIR21L 2 +#define R_PARISC_DIR17R 3 +#define R_PARISC_DIR17F 4 +#define R_PARISC_DIR14R 6 +#define R_PARISC_PCREL32 9 +#define R_PARISC_PCREL21L 10 +#define R_PARISC_PCREL17R 11 +#define R_PARISC_PCREL17F 12 +#define R_PARISC_PCREL14R 14 +#define R_PARISC_DPREL21L 18 +#define R_PARISC_DPREL14R 22 +#define R_PARISC_GPREL21L 26 +#define R_PARISC_GPREL14R 30 +#define R_PARISC_LTOFF21L 34 +#define R_PARISC_LTOFF14R 38 +#define R_PARISC_SECREL32 41 +#define R_PARISC_SEGBASE 48 +#define R_PARISC_SEGREL32 49 +#define R_PARISC_PLTOFF21L 50 +#define R_PARISC_PLTOFF14R 54 +#define R_PARISC_LTOFF_FPTR32 57 +#define R_PARISC_LTOFF_FPTR21L 58 +#define R_PARISC_LTOFF_FPTR14R 62 +#define R_PARISC_FPTR64 64 +#define R_PARISC_PLABEL32 65 +#define R_PARISC_PLABEL21L 66 +#define R_PARISC_PLABEL14R 70 +#define R_PARISC_PCREL64 72 +#define R_PARISC_PCREL22F 74 +#define R_PARISC_PCREL14WR 75 +#define R_PARISC_PCREL14DR 76 +#define R_PARISC_PCREL16F 77 +#define R_PARISC_PCREL16WF 78 +#define R_PARISC_PCREL16DF 79 +#define R_PARISC_DIR64 80 +#define R_PARISC_DIR14WR 83 +#define R_PARISC_DIR14DR 84 +#define R_PARISC_DIR16F 85 +#define R_PARISC_DIR16WF 86 +#define R_PARISC_DIR16DF 87 +#define R_PARISC_GPREL64 88 +#define R_PARISC_GPREL14WR 91 +#define R_PARISC_GPREL14DR 92 +#define R_PARISC_GPREL16F 93 +#define R_PARISC_GPREL16WF 94 +#define R_PARISC_GPREL16DF 95 +#define R_PARISC_LTOFF64 96 +#define R_PARISC_LTOFF14WR 99 +#define R_PARISC_LTOFF14DR 100 +#define R_PARISC_LTOFF16F 101 +#define R_PARISC_LTOFF16WF 102 +#define R_PARISC_LTOFF16DF 103 +#define R_PARISC_SECREL64 104 +#define R_PARISC_SEGREL64 112 +#define R_PARISC_PLTOFF14WR 115 +#define R_PARISC_PLTOFF14DR 116 +#define R_PARISC_PLTOFF16F 117 +#define R_PARISC_PLTOFF16WF 118 +#define R_PARISC_PLTOFF16DF 119 +#define R_PARISC_LTOFF_FPTR64 120 +#define R_PARISC_LTOFF_FPTR14WR 123 +#define R_PARISC_LTOFF_FPTR14DR 124 +#define R_PARISC_LTOFF_FPTR16F 125 +#define R_PARISC_LTOFF_FPTR16WF 126 +#define R_PARISC_LTOFF_FPTR16DF 127 +#define R_PARISC_LORESERVE 128 +#define R_PARISC_COPY 128 +#define R_PARISC_IPLT 129 +#define R_PARISC_EPLT 130 +#define R_PARISC_TPREL32 153 +#define R_PARISC_TPREL21L 154 +#define R_PARISC_TPREL14R 158 +#define R_PARISC_LTOFF_TP21L 162 +#define R_PARISC_LTOFF_TP14R 166 +#define R_PARISC_LTOFF_TP14F 167 +#define R_PARISC_TPREL64 216 +#define R_PARISC_TPREL14WR 219 +#define R_PARISC_TPREL14DR 220 +#define R_PARISC_TPREL16F 221 +#define R_PARISC_TPREL16WF 222 +#define R_PARISC_TPREL16DF 223 +#define R_PARISC_LTOFF_TP64 224 +#define R_PARISC_LTOFF_TP14WR 227 +#define R_PARISC_LTOFF_TP14DR 228 +#define R_PARISC_LTOFF_TP16F 229 +#define R_PARISC_LTOFF_TP16WF 230 +#define R_PARISC_LTOFF_TP16DF 231 +#define R_PARISC_GNU_VTENTRY 232 +#define R_PARISC_GNU_VTINHERIT 233 +#define R_PARISC_TLS_GD21L 234 +#define R_PARISC_TLS_GD14R 235 +#define R_PARISC_TLS_GDCALL 236 +#define R_PARISC_TLS_LDM21L 237 +#define R_PARISC_TLS_LDM14R 238 +#define R_PARISC_TLS_LDMCALL 239 +#define R_PARISC_TLS_LDO21L 240 +#define R_PARISC_TLS_LDO14R 241 +#define R_PARISC_TLS_DTPMOD32 242 +#define R_PARISC_TLS_DTPMOD64 243 +#define R_PARISC_TLS_DTPOFF32 244 +#define R_PARISC_TLS_DTPOFF64 245 +#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L +#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R +#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L +#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R +#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 +#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 +#define R_PARISC_HIRESERVE 255 + + + +#define PT_HP_TLS (PT_LOOS + 0x0) +#define PT_HP_CORE_NONE (PT_LOOS + 0x1) +#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) +#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) +#define PT_HP_CORE_COMM (PT_LOOS + 0x4) +#define PT_HP_CORE_PROC (PT_LOOS + 0x5) +#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) +#define PT_HP_CORE_STACK (PT_LOOS + 0x7) +#define PT_HP_CORE_SHM (PT_LOOS + 0x8) +#define PT_HP_CORE_MMF (PT_LOOS + 0x9) +#define PT_HP_PARALLEL (PT_LOOS + 0x10) +#define PT_HP_FASTBIND (PT_LOOS + 0x11) +#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) +#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) +#define PT_HP_STACK (PT_LOOS + 0x14) + +#define PT_PARISC_ARCHEXT 0x70000000 +#define PT_PARISC_UNWIND 0x70000001 + + + +#define PF_PARISC_SBP 0x08000000 + +#define PF_HP_PAGE_SIZE 0x00100000 +#define PF_HP_FAR_SHARED 0x00200000 +#define PF_HP_NEAR_SHARED 0x00400000 +#define PF_HP_CODE 0x01000000 +#define PF_HP_MODIFY 0x02000000 +#define PF_HP_LAZYSWAP 0x04000000 +#define PF_HP_SBP 0x08000000 + + + + + + +#define EF_ALPHA_32BIT 1 +#define EF_ALPHA_CANRELAX 2 + + + + +#define SHT_ALPHA_DEBUG 0x70000001 +#define SHT_ALPHA_REGINFO 0x70000002 + + + +#define SHF_ALPHA_GPREL 0x10000000 + + +#define STO_ALPHA_NOPV 0x80 +#define STO_ALPHA_STD_GPLOAD 0x88 + + + +#define R_ALPHA_NONE 0 +#define R_ALPHA_REFLONG 1 +#define R_ALPHA_REFQUAD 2 +#define R_ALPHA_GPREL32 3 +#define R_ALPHA_LITERAL 4 +#define R_ALPHA_LITUSE 5 +#define R_ALPHA_GPDISP 6 +#define R_ALPHA_BRADDR 7 +#define R_ALPHA_HINT 8 +#define R_ALPHA_SREL16 9 +#define R_ALPHA_SREL32 10 +#define R_ALPHA_SREL64 11 +#define R_ALPHA_GPRELHIGH 17 +#define R_ALPHA_GPRELLOW 18 +#define R_ALPHA_GPREL16 19 +#define R_ALPHA_COPY 24 +#define R_ALPHA_GLOB_DAT 25 +#define R_ALPHA_JMP_SLOT 26 +#define R_ALPHA_RELATIVE 27 +#define R_ALPHA_TLS_GD_HI 28 +#define R_ALPHA_TLSGD 29 +#define R_ALPHA_TLS_LDM 30 +#define R_ALPHA_DTPMOD64 31 +#define R_ALPHA_GOTDTPREL 32 +#define R_ALPHA_DTPREL64 33 +#define R_ALPHA_DTPRELHI 34 +#define R_ALPHA_DTPRELLO 35 +#define R_ALPHA_DTPREL16 36 +#define R_ALPHA_GOTTPREL 37 +#define R_ALPHA_TPREL64 38 +#define R_ALPHA_TPRELHI 39 +#define R_ALPHA_TPRELLO 40 +#define R_ALPHA_TPREL16 41 + +#define R_ALPHA_NUM 46 + + +#define LITUSE_ALPHA_ADDR 0 +#define LITUSE_ALPHA_BASE 1 +#define LITUSE_ALPHA_BYTOFF 2 +#define LITUSE_ALPHA_JSR 3 +#define LITUSE_ALPHA_TLS_GD 4 +#define LITUSE_ALPHA_TLS_LDM 5 + + +#define DT_ALPHA_PLTRO (DT_LOPROC + 0) +#define DT_ALPHA_NUM 1 + + + + +#define EF_PPC_EMB 0x80000000 + + +#define EF_PPC_RELOCATABLE 0x00010000 +#define EF_PPC_RELOCATABLE_LIB 0x00008000 + + + +#define R_PPC_NONE 0 +#define R_PPC_ADDR32 1 +#define R_PPC_ADDR24 2 +#define R_PPC_ADDR16 3 +#define R_PPC_ADDR16_LO 4 +#define R_PPC_ADDR16_HI 5 +#define R_PPC_ADDR16_HA 6 +#define R_PPC_ADDR14 7 +#define R_PPC_ADDR14_BRTAKEN 8 +#define R_PPC_ADDR14_BRNTAKEN 9 +#define R_PPC_REL24 10 +#define R_PPC_REL14 11 +#define R_PPC_REL14_BRTAKEN 12 +#define R_PPC_REL14_BRNTAKEN 13 +#define R_PPC_GOT16 14 +#define R_PPC_GOT16_LO 15 +#define R_PPC_GOT16_HI 16 +#define R_PPC_GOT16_HA 17 +#define R_PPC_PLTREL24 18 +#define R_PPC_COPY 19 +#define R_PPC_GLOB_DAT 20 +#define R_PPC_JMP_SLOT 21 +#define R_PPC_RELATIVE 22 +#define R_PPC_LOCAL24PC 23 +#define R_PPC_UADDR32 24 +#define R_PPC_UADDR16 25 +#define R_PPC_REL32 26 +#define R_PPC_PLT32 27 +#define R_PPC_PLTREL32 28 +#define R_PPC_PLT16_LO 29 +#define R_PPC_PLT16_HI 30 +#define R_PPC_PLT16_HA 31 +#define R_PPC_SDAREL16 32 +#define R_PPC_SECTOFF 33 +#define R_PPC_SECTOFF_LO 34 +#define R_PPC_SECTOFF_HI 35 +#define R_PPC_SECTOFF_HA 36 + + +#define R_PPC_TLS 67 +#define R_PPC_DTPMOD32 68 +#define R_PPC_TPREL16 69 +#define R_PPC_TPREL16_LO 70 +#define R_PPC_TPREL16_HI 71 +#define R_PPC_TPREL16_HA 72 +#define R_PPC_TPREL32 73 +#define R_PPC_DTPREL16 74 +#define R_PPC_DTPREL16_LO 75 +#define R_PPC_DTPREL16_HI 76 +#define R_PPC_DTPREL16_HA 77 +#define R_PPC_DTPREL32 78 +#define R_PPC_GOT_TLSGD16 79 +#define R_PPC_GOT_TLSGD16_LO 80 +#define R_PPC_GOT_TLSGD16_HI 81 +#define R_PPC_GOT_TLSGD16_HA 82 +#define R_PPC_GOT_TLSLD16 83 +#define R_PPC_GOT_TLSLD16_LO 84 +#define R_PPC_GOT_TLSLD16_HI 85 +#define R_PPC_GOT_TLSLD16_HA 86 +#define R_PPC_GOT_TPREL16 87 +#define R_PPC_GOT_TPREL16_LO 88 +#define R_PPC_GOT_TPREL16_HI 89 +#define R_PPC_GOT_TPREL16_HA 90 +#define R_PPC_GOT_DTPREL16 91 +#define R_PPC_GOT_DTPREL16_LO 92 +#define R_PPC_GOT_DTPREL16_HI 93 +#define R_PPC_GOT_DTPREL16_HA 94 +#define R_PPC_TLSGD 95 +#define R_PPC_TLSLD 96 + + +#define R_PPC_EMB_NADDR32 101 +#define R_PPC_EMB_NADDR16 102 +#define R_PPC_EMB_NADDR16_LO 103 +#define R_PPC_EMB_NADDR16_HI 104 +#define R_PPC_EMB_NADDR16_HA 105 +#define R_PPC_EMB_SDAI16 106 +#define R_PPC_EMB_SDA2I16 107 +#define R_PPC_EMB_SDA2REL 108 +#define R_PPC_EMB_SDA21 109 +#define R_PPC_EMB_MRKREF 110 +#define R_PPC_EMB_RELSEC16 111 +#define R_PPC_EMB_RELST_LO 112 +#define R_PPC_EMB_RELST_HI 113 +#define R_PPC_EMB_RELST_HA 114 +#define R_PPC_EMB_BIT_FLD 115 +#define R_PPC_EMB_RELSDA 116 + + +#define R_PPC_DIAB_SDA21_LO 180 +#define R_PPC_DIAB_SDA21_HI 181 +#define R_PPC_DIAB_SDA21_HA 182 +#define R_PPC_DIAB_RELSDA_LO 183 +#define R_PPC_DIAB_RELSDA_HI 184 +#define R_PPC_DIAB_RELSDA_HA 185 + + +#define R_PPC_IRELATIVE 248 + + +#define R_PPC_REL16 249 +#define R_PPC_REL16_LO 250 +#define R_PPC_REL16_HI 251 +#define R_PPC_REL16_HA 252 + + + +#define R_PPC_TOC16 255 + + +#define DT_PPC_GOT (DT_LOPROC + 0) +#define DT_PPC_OPT (DT_LOPROC + 1) +#define DT_PPC_NUM 2 + +#define PPC_OPT_TLS 1 + + +#define R_PPC64_NONE R_PPC_NONE +#define R_PPC64_ADDR32 R_PPC_ADDR32 +#define R_PPC64_ADDR24 R_PPC_ADDR24 +#define R_PPC64_ADDR16 R_PPC_ADDR16 +#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO +#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI +#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA +#define R_PPC64_ADDR14 R_PPC_ADDR14 +#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN +#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN +#define R_PPC64_REL24 R_PPC_REL24 +#define R_PPC64_REL14 R_PPC_REL14 +#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN +#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN +#define R_PPC64_GOT16 R_PPC_GOT16 +#define R_PPC64_GOT16_LO R_PPC_GOT16_LO +#define R_PPC64_GOT16_HI R_PPC_GOT16_HI +#define R_PPC64_GOT16_HA R_PPC_GOT16_HA + +#define R_PPC64_COPY R_PPC_COPY +#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT +#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT +#define R_PPC64_RELATIVE R_PPC_RELATIVE + +#define R_PPC64_UADDR32 R_PPC_UADDR32 +#define R_PPC64_UADDR16 R_PPC_UADDR16 +#define R_PPC64_REL32 R_PPC_REL32 +#define R_PPC64_PLT32 R_PPC_PLT32 +#define R_PPC64_PLTREL32 R_PPC_PLTREL32 +#define R_PPC64_PLT16_LO R_PPC_PLT16_LO +#define R_PPC64_PLT16_HI R_PPC_PLT16_HI +#define R_PPC64_PLT16_HA R_PPC_PLT16_HA + +#define R_PPC64_SECTOFF R_PPC_SECTOFF +#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO +#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI +#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA +#define R_PPC64_ADDR30 37 +#define R_PPC64_ADDR64 38 +#define R_PPC64_ADDR16_HIGHER 39 +#define R_PPC64_ADDR16_HIGHERA 40 +#define R_PPC64_ADDR16_HIGHEST 41 +#define R_PPC64_ADDR16_HIGHESTA 42 +#define R_PPC64_UADDR64 43 +#define R_PPC64_REL64 44 +#define R_PPC64_PLT64 45 +#define R_PPC64_PLTREL64 46 +#define R_PPC64_TOC16 47 +#define R_PPC64_TOC16_LO 48 +#define R_PPC64_TOC16_HI 49 +#define R_PPC64_TOC16_HA 50 +#define R_PPC64_TOC 51 +#define R_PPC64_PLTGOT16 52 +#define R_PPC64_PLTGOT16_LO 53 +#define R_PPC64_PLTGOT16_HI 54 +#define R_PPC64_PLTGOT16_HA 55 + +#define R_PPC64_ADDR16_DS 56 +#define R_PPC64_ADDR16_LO_DS 57 +#define R_PPC64_GOT16_DS 58 +#define R_PPC64_GOT16_LO_DS 59 +#define R_PPC64_PLT16_LO_DS 60 +#define R_PPC64_SECTOFF_DS 61 +#define R_PPC64_SECTOFF_LO_DS 62 +#define R_PPC64_TOC16_DS 63 +#define R_PPC64_TOC16_LO_DS 64 +#define R_PPC64_PLTGOT16_DS 65 +#define R_PPC64_PLTGOT16_LO_DS 66 + + +#define R_PPC64_TLS 67 +#define R_PPC64_DTPMOD64 68 +#define R_PPC64_TPREL16 69 +#define R_PPC64_TPREL16_LO 70 +#define R_PPC64_TPREL16_HI 71 +#define R_PPC64_TPREL16_HA 72 +#define R_PPC64_TPREL64 73 +#define R_PPC64_DTPREL16 74 +#define R_PPC64_DTPREL16_LO 75 +#define R_PPC64_DTPREL16_HI 76 +#define R_PPC64_DTPREL16_HA 77 +#define R_PPC64_DTPREL64 78 +#define R_PPC64_GOT_TLSGD16 79 +#define R_PPC64_GOT_TLSGD16_LO 80 +#define R_PPC64_GOT_TLSGD16_HI 81 +#define R_PPC64_GOT_TLSGD16_HA 82 +#define R_PPC64_GOT_TLSLD16 83 +#define R_PPC64_GOT_TLSLD16_LO 84 +#define R_PPC64_GOT_TLSLD16_HI 85 +#define R_PPC64_GOT_TLSLD16_HA 86 +#define R_PPC64_GOT_TPREL16_DS 87 +#define R_PPC64_GOT_TPREL16_LO_DS 88 +#define R_PPC64_GOT_TPREL16_HI 89 +#define R_PPC64_GOT_TPREL16_HA 90 +#define R_PPC64_GOT_DTPREL16_DS 91 +#define R_PPC64_GOT_DTPREL16_LO_DS 92 +#define R_PPC64_GOT_DTPREL16_HI 93 +#define R_PPC64_GOT_DTPREL16_HA 94 +#define R_PPC64_TPREL16_DS 95 +#define R_PPC64_TPREL16_LO_DS 96 +#define R_PPC64_TPREL16_HIGHER 97 +#define R_PPC64_TPREL16_HIGHERA 98 +#define R_PPC64_TPREL16_HIGHEST 99 +#define R_PPC64_TPREL16_HIGHESTA 100 +#define R_PPC64_DTPREL16_DS 101 +#define R_PPC64_DTPREL16_LO_DS 102 +#define R_PPC64_DTPREL16_HIGHER 103 +#define R_PPC64_DTPREL16_HIGHERA 104 +#define R_PPC64_DTPREL16_HIGHEST 105 +#define R_PPC64_DTPREL16_HIGHESTA 106 +#define R_PPC64_TLSGD 107 +#define R_PPC64_TLSLD 108 +#define R_PPC64_TOCSAVE 109 +#define R_PPC64_ADDR16_HIGH 110 +#define R_PPC64_ADDR16_HIGHA 111 +#define R_PPC64_TPREL16_HIGH 112 +#define R_PPC64_TPREL16_HIGHA 113 +#define R_PPC64_DTPREL16_HIGH 114 +#define R_PPC64_DTPREL16_HIGHA 115 + + +#define R_PPC64_JMP_IREL 247 +#define R_PPC64_IRELATIVE 248 +#define R_PPC64_REL16 249 +#define R_PPC64_REL16_LO 250 +#define R_PPC64_REL16_HI 251 +#define R_PPC64_REL16_HA 252 + +#define EF_PPC64_ABI 3 + +#define DT_PPC64_GLINK (DT_LOPROC + 0) +#define DT_PPC64_OPD (DT_LOPROC + 1) +#define DT_PPC64_OPDSZ (DT_LOPROC + 2) +#define DT_PPC64_OPT (DT_LOPROC + 3) +#define DT_PPC64_NUM 4 + +#define PPC64_OPT_TLS 1 +#define PPC64_OPT_MULTI_TOC 2 + +#define STO_PPC64_LOCAL_BIT 5 +#define STO_PPC64_LOCAL_MASK 0xe0 +#define PPC64_LOCAL_ENTRY_OFFSET(x) (1 << (((x)&0xe0)>>5) & 0xfc) + + +#define EF_ARM_RELEXEC 0x01 +#define EF_ARM_HASENTRY 0x02 +#define EF_ARM_INTERWORK 0x04 +#define EF_ARM_APCS_26 0x08 +#define EF_ARM_APCS_FLOAT 0x10 +#define EF_ARM_PIC 0x20 +#define EF_ARM_ALIGN8 0x40 +#define EF_ARM_NEW_ABI 0x80 +#define EF_ARM_OLD_ABI 0x100 +#define EF_ARM_SOFT_FLOAT 0x200 +#define EF_ARM_VFP_FLOAT 0x400 +#define EF_ARM_MAVERICK_FLOAT 0x800 + +#define EF_ARM_ABI_FLOAT_SOFT 0x200 +#define EF_ARM_ABI_FLOAT_HARD 0x400 + + +#define EF_ARM_SYMSARESORTED 0x04 +#define EF_ARM_DYNSYMSUSESEGIDX 0x08 +#define EF_ARM_MAPSYMSFIRST 0x10 +#define EF_ARM_EABIMASK 0XFF000000 + + +#define EF_ARM_BE8 0x00800000 +#define EF_ARM_LE8 0x00400000 + +#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) +#define EF_ARM_EABI_UNKNOWN 0x00000000 +#define EF_ARM_EABI_VER1 0x01000000 +#define EF_ARM_EABI_VER2 0x02000000 +#define EF_ARM_EABI_VER3 0x03000000 +#define EF_ARM_EABI_VER4 0x04000000 +#define EF_ARM_EABI_VER5 0x05000000 + + +#define STT_ARM_TFUNC STT_LOPROC +#define STT_ARM_16BIT STT_HIPROC + + +#define SHF_ARM_ENTRYSECT 0x10000000 +#define SHF_ARM_COMDEF 0x80000000 + + + +#define PF_ARM_SB 0x10000000 + +#define PF_ARM_PI 0x20000000 +#define PF_ARM_ABS 0x40000000 + + +#define PT_ARM_EXIDX (PT_LOPROC + 1) + + +#define SHT_ARM_EXIDX (SHT_LOPROC + 1) +#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) +#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) + +#define R_AARCH64_NONE 0 +#define R_AARCH64_P32_ABS32 1 +#define R_AARCH64_P32_COPY 180 +#define R_AARCH64_P32_GLOB_DAT 181 +#define R_AARCH64_P32_JUMP_SLOT 182 +#define R_AARCH64_P32_RELATIVE 183 +#define R_AARCH64_P32_TLS_DTPMOD 184 +#define R_AARCH64_P32_TLS_DTPREL 185 +#define R_AARCH64_P32_TLS_TPREL 186 +#define R_AARCH64_P32_TLSDESC 187 +#define R_AARCH64_P32_IRELATIVE 188 +#define R_AARCH64_ABS64 257 +#define R_AARCH64_ABS32 258 +#define R_AARCH64_ABS16 259 +#define R_AARCH64_PREL64 260 +#define R_AARCH64_PREL32 261 +#define R_AARCH64_PREL16 262 +#define R_AARCH64_MOVW_UABS_G0 263 +#define R_AARCH64_MOVW_UABS_G0_NC 264 +#define R_AARCH64_MOVW_UABS_G1 265 +#define R_AARCH64_MOVW_UABS_G1_NC 266 +#define R_AARCH64_MOVW_UABS_G2 267 +#define R_AARCH64_MOVW_UABS_G2_NC 268 +#define R_AARCH64_MOVW_UABS_G3 269 +#define R_AARCH64_MOVW_SABS_G0 270 +#define R_AARCH64_MOVW_SABS_G1 271 +#define R_AARCH64_MOVW_SABS_G2 272 +#define R_AARCH64_LD_PREL_LO19 273 +#define R_AARCH64_ADR_PREL_LO21 274 +#define R_AARCH64_ADR_PREL_PG_HI21 275 +#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 +#define R_AARCH64_ADD_ABS_LO12_NC 277 +#define R_AARCH64_LDST8_ABS_LO12_NC 278 +#define R_AARCH64_TSTBR14 279 +#define R_AARCH64_CONDBR19 280 +#define R_AARCH64_JUMP26 282 +#define R_AARCH64_CALL26 283 +#define R_AARCH64_LDST16_ABS_LO12_NC 284 +#define R_AARCH64_LDST32_ABS_LO12_NC 285 +#define R_AARCH64_LDST64_ABS_LO12_NC 286 +#define R_AARCH64_MOVW_PREL_G0 287 +#define R_AARCH64_MOVW_PREL_G0_NC 288 +#define R_AARCH64_MOVW_PREL_G1 289 +#define R_AARCH64_MOVW_PREL_G1_NC 290 +#define R_AARCH64_MOVW_PREL_G2 291 +#define R_AARCH64_MOVW_PREL_G2_NC 292 +#define R_AARCH64_MOVW_PREL_G3 293 +#define R_AARCH64_LDST128_ABS_LO12_NC 299 +#define R_AARCH64_MOVW_GOTOFF_G0 300 +#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 +#define R_AARCH64_MOVW_GOTOFF_G1 302 +#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 +#define R_AARCH64_MOVW_GOTOFF_G2 304 +#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 +#define R_AARCH64_MOVW_GOTOFF_G3 306 +#define R_AARCH64_GOTREL64 307 +#define R_AARCH64_GOTREL32 308 +#define R_AARCH64_GOT_LD_PREL19 309 +#define R_AARCH64_LD64_GOTOFF_LO15 310 +#define R_AARCH64_ADR_GOT_PAGE 311 +#define R_AARCH64_LD64_GOT_LO12_NC 312 +#define R_AARCH64_LD64_GOTPAGE_LO15 313 +#define R_AARCH64_TLSGD_ADR_PREL21 512 +#define R_AARCH64_TLSGD_ADR_PAGE21 513 +#define R_AARCH64_TLSGD_ADD_LO12_NC 514 +#define R_AARCH64_TLSGD_MOVW_G1 515 +#define R_AARCH64_TLSGD_MOVW_G0_NC 516 +#define R_AARCH64_TLSLD_ADR_PREL21 517 +#define R_AARCH64_TLSLD_ADR_PAGE21 518 +#define R_AARCH64_TLSLD_ADD_LO12_NC 519 +#define R_AARCH64_TLSLD_MOVW_G1 520 +#define R_AARCH64_TLSLD_MOVW_G0_NC 521 +#define R_AARCH64_TLSLD_LD_PREL19 522 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 +#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 +#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 +#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 +#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 +#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 +#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 +#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 +#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 +#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 +#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 +#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 +#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 +#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 +#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 +#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 +#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 +#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 +#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 +#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 +#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 +#define R_AARCH64_TLSDESC_LD_PREL19 560 +#define R_AARCH64_TLSDESC_ADR_PREL21 561 +#define R_AARCH64_TLSDESC_ADR_PAGE21 562 +#define R_AARCH64_TLSDESC_LD64_LO12 563 +#define R_AARCH64_TLSDESC_ADD_LO12 564 +#define R_AARCH64_TLSDESC_OFF_G1 565 +#define R_AARCH64_TLSDESC_OFF_G0_NC 566 +#define R_AARCH64_TLSDESC_LDR 567 +#define R_AARCH64_TLSDESC_ADD 568 +#define R_AARCH64_TLSDESC_CALL 569 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 +#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 +#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 +#define R_AARCH64_COPY 1024 +#define R_AARCH64_GLOB_DAT 1025 +#define R_AARCH64_JUMP_SLOT 1026 +#define R_AARCH64_RELATIVE 1027 +#define R_AARCH64_TLS_DTPMOD 1028 +#define R_AARCH64_TLS_DTPMOD64 1028 +#define R_AARCH64_TLS_DTPREL 1029 +#define R_AARCH64_TLS_DTPREL64 1029 +#define R_AARCH64_TLS_TPREL 1030 +#define R_AARCH64_TLS_TPREL64 1030 +#define R_AARCH64_TLSDESC 1031 + + +#define R_ARM_NONE 0 +#define R_ARM_PC24 1 +#define R_ARM_ABS32 2 +#define R_ARM_REL32 3 +#define R_ARM_PC13 4 +#define R_ARM_ABS16 5 +#define R_ARM_ABS12 6 +#define R_ARM_THM_ABS5 7 +#define R_ARM_ABS8 8 +#define R_ARM_SBREL32 9 +#define R_ARM_THM_PC22 10 +#define R_ARM_THM_PC8 11 +#define R_ARM_AMP_VCALL9 12 +#define R_ARM_TLS_DESC 13 +#define R_ARM_THM_SWI8 14 +#define R_ARM_XPC25 15 +#define R_ARM_THM_XPC22 16 +#define R_ARM_TLS_DTPMOD32 17 +#define R_ARM_TLS_DTPOFF32 18 +#define R_ARM_TLS_TPOFF32 19 +#define R_ARM_COPY 20 +#define R_ARM_GLOB_DAT 21 +#define R_ARM_JUMP_SLOT 22 +#define R_ARM_RELATIVE 23 +#define R_ARM_GOTOFF 24 +#define R_ARM_GOTPC 25 +#define R_ARM_GOT32 26 +#define R_ARM_PLT32 27 +#define R_ARM_CALL 28 +#define R_ARM_JUMP24 29 +#define R_ARM_THM_JUMP24 30 +#define R_ARM_BASE_ABS 31 +#define R_ARM_ALU_PCREL_7_0 32 +#define R_ARM_ALU_PCREL_15_8 33 +#define R_ARM_ALU_PCREL_23_15 34 +#define R_ARM_LDR_SBREL_11_0 35 +#define R_ARM_ALU_SBREL_19_12 36 +#define R_ARM_ALU_SBREL_27_20 37 +#define R_ARM_TARGET1 38 +#define R_ARM_SBREL31 39 +#define R_ARM_V4BX 40 +#define R_ARM_TARGET2 41 +#define R_ARM_PREL31 42 +#define R_ARM_MOVW_ABS_NC 43 +#define R_ARM_MOVT_ABS 44 +#define R_ARM_MOVW_PREL_NC 45 +#define R_ARM_MOVT_PREL 46 +#define R_ARM_THM_MOVW_ABS_NC 47 +#define R_ARM_THM_MOVT_ABS 48 +#define R_ARM_THM_MOVW_PREL_NC 49 +#define R_ARM_THM_MOVT_PREL 50 +#define R_ARM_THM_JUMP19 51 +#define R_ARM_THM_JUMP6 52 +#define R_ARM_THM_ALU_PREL_11_0 53 +#define R_ARM_THM_PC12 54 +#define R_ARM_ABS32_NOI 55 +#define R_ARM_REL32_NOI 56 +#define R_ARM_ALU_PC_G0_NC 57 +#define R_ARM_ALU_PC_G0 58 +#define R_ARM_ALU_PC_G1_NC 59 +#define R_ARM_ALU_PC_G1 60 +#define R_ARM_ALU_PC_G2 61 +#define R_ARM_LDR_PC_G1 62 +#define R_ARM_LDR_PC_G2 63 +#define R_ARM_LDRS_PC_G0 64 +#define R_ARM_LDRS_PC_G1 65 +#define R_ARM_LDRS_PC_G2 66 +#define R_ARM_LDC_PC_G0 67 +#define R_ARM_LDC_PC_G1 68 +#define R_ARM_LDC_PC_G2 69 +#define R_ARM_ALU_SB_G0_NC 70 +#define R_ARM_ALU_SB_G0 71 +#define R_ARM_ALU_SB_G1_NC 72 +#define R_ARM_ALU_SB_G1 73 +#define R_ARM_ALU_SB_G2 74 +#define R_ARM_LDR_SB_G0 75 +#define R_ARM_LDR_SB_G1 76 +#define R_ARM_LDR_SB_G2 77 +#define R_ARM_LDRS_SB_G0 78 +#define R_ARM_LDRS_SB_G1 79 +#define R_ARM_LDRS_SB_G2 80 +#define R_ARM_LDC_SB_G0 81 +#define R_ARM_LDC_SB_G1 82 +#define R_ARM_LDC_SB_G2 83 +#define R_ARM_MOVW_BREL_NC 84 +#define R_ARM_MOVT_BREL 85 +#define R_ARM_MOVW_BREL 86 +#define R_ARM_THM_MOVW_BREL_NC 87 +#define R_ARM_THM_MOVT_BREL 88 +#define R_ARM_THM_MOVW_BREL 89 +#define R_ARM_TLS_GOTDESC 90 +#define R_ARM_TLS_CALL 91 +#define R_ARM_TLS_DESCSEQ 92 +#define R_ARM_THM_TLS_CALL 93 +#define R_ARM_PLT32_ABS 94 +#define R_ARM_GOT_ABS 95 +#define R_ARM_GOT_PREL 96 +#define R_ARM_GOT_BREL12 97 +#define R_ARM_GOTOFF12 98 +#define R_ARM_GOTRELAX 99 +#define R_ARM_GNU_VTENTRY 100 +#define R_ARM_GNU_VTINHERIT 101 +#define R_ARM_THM_PC11 102 +#define R_ARM_THM_PC9 103 +#define R_ARM_TLS_GD32 104 + +#define R_ARM_TLS_LDM32 105 + +#define R_ARM_TLS_LDO32 106 + +#define R_ARM_TLS_IE32 107 + +#define R_ARM_TLS_LE32 108 +#define R_ARM_TLS_LDO12 109 +#define R_ARM_TLS_LE12 110 +#define R_ARM_TLS_IE12GP 111 +#define R_ARM_ME_TOO 128 +#define R_ARM_THM_TLS_DESCSEQ 129 +#define R_ARM_THM_TLS_DESCSEQ16 129 +#define R_ARM_THM_TLS_DESCSEQ32 130 +#define R_ARM_THM_GOT_BREL12 131 +#define R_ARM_IRELATIVE 160 +#define R_ARM_RXPC25 249 +#define R_ARM_RSBREL32 250 +#define R_ARM_THM_RPC22 251 +#define R_ARM_RREL32 252 +#define R_ARM_RABS22 253 +#define R_ARM_RPC24 254 +#define R_ARM_RBASE 255 + +#define R_ARM_NUM 256 + + + + +#define EF_IA_64_MASKOS 0x0000000f +#define EF_IA_64_ABI64 0x00000010 +#define EF_IA_64_ARCH 0xff000000 + + +#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) +#define PT_IA_64_UNWIND (PT_LOPROC + 1) +#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) +#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) +#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) + + +#define PF_IA_64_NORECOV 0x80000000 + + +#define SHT_IA_64_EXT (SHT_LOPROC + 0) +#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) + + +#define SHF_IA_64_SHORT 0x10000000 +#define SHF_IA_64_NORECOV 0x20000000 + + +#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) +#define DT_IA_64_NUM 1 + + +#define R_IA64_NONE 0x00 +#define R_IA64_IMM14 0x21 +#define R_IA64_IMM22 0x22 +#define R_IA64_IMM64 0x23 +#define R_IA64_DIR32MSB 0x24 +#define R_IA64_DIR32LSB 0x25 +#define R_IA64_DIR64MSB 0x26 +#define R_IA64_DIR64LSB 0x27 +#define R_IA64_GPREL22 0x2a +#define R_IA64_GPREL64I 0x2b +#define R_IA64_GPREL32MSB 0x2c +#define R_IA64_GPREL32LSB 0x2d +#define R_IA64_GPREL64MSB 0x2e +#define R_IA64_GPREL64LSB 0x2f +#define R_IA64_LTOFF22 0x32 +#define R_IA64_LTOFF64I 0x33 +#define R_IA64_PLTOFF22 0x3a +#define R_IA64_PLTOFF64I 0x3b +#define R_IA64_PLTOFF64MSB 0x3e +#define R_IA64_PLTOFF64LSB 0x3f +#define R_IA64_FPTR64I 0x43 +#define R_IA64_FPTR32MSB 0x44 +#define R_IA64_FPTR32LSB 0x45 +#define R_IA64_FPTR64MSB 0x46 +#define R_IA64_FPTR64LSB 0x47 +#define R_IA64_PCREL60B 0x48 +#define R_IA64_PCREL21B 0x49 +#define R_IA64_PCREL21M 0x4a +#define R_IA64_PCREL21F 0x4b +#define R_IA64_PCREL32MSB 0x4c +#define R_IA64_PCREL32LSB 0x4d +#define R_IA64_PCREL64MSB 0x4e +#define R_IA64_PCREL64LSB 0x4f +#define R_IA64_LTOFF_FPTR22 0x52 +#define R_IA64_LTOFF_FPTR64I 0x53 +#define R_IA64_LTOFF_FPTR32MSB 0x54 +#define R_IA64_LTOFF_FPTR32LSB 0x55 +#define R_IA64_LTOFF_FPTR64MSB 0x56 +#define R_IA64_LTOFF_FPTR64LSB 0x57 +#define R_IA64_SEGREL32MSB 0x5c +#define R_IA64_SEGREL32LSB 0x5d +#define R_IA64_SEGREL64MSB 0x5e +#define R_IA64_SEGREL64LSB 0x5f +#define R_IA64_SECREL32MSB 0x64 +#define R_IA64_SECREL32LSB 0x65 +#define R_IA64_SECREL64MSB 0x66 +#define R_IA64_SECREL64LSB 0x67 +#define R_IA64_REL32MSB 0x6c +#define R_IA64_REL32LSB 0x6d +#define R_IA64_REL64MSB 0x6e +#define R_IA64_REL64LSB 0x6f +#define R_IA64_LTV32MSB 0x74 +#define R_IA64_LTV32LSB 0x75 +#define R_IA64_LTV64MSB 0x76 +#define R_IA64_LTV64LSB 0x77 +#define R_IA64_PCREL21BI 0x79 +#define R_IA64_PCREL22 0x7a +#define R_IA64_PCREL64I 0x7b +#define R_IA64_IPLTMSB 0x80 +#define R_IA64_IPLTLSB 0x81 +#define R_IA64_COPY 0x84 +#define R_IA64_SUB 0x85 +#define R_IA64_LTOFF22X 0x86 +#define R_IA64_LDXMOV 0x87 +#define R_IA64_TPREL14 0x91 +#define R_IA64_TPREL22 0x92 +#define R_IA64_TPREL64I 0x93 +#define R_IA64_TPREL64MSB 0x96 +#define R_IA64_TPREL64LSB 0x97 +#define R_IA64_LTOFF_TPREL22 0x9a +#define R_IA64_DTPMOD64MSB 0xa6 +#define R_IA64_DTPMOD64LSB 0xa7 +#define R_IA64_LTOFF_DTPMOD22 0xaa +#define R_IA64_DTPREL14 0xb1 +#define R_IA64_DTPREL22 0xb2 +#define R_IA64_DTPREL64I 0xb3 +#define R_IA64_DTPREL32MSB 0xb4 +#define R_IA64_DTPREL32LSB 0xb5 +#define R_IA64_DTPREL64MSB 0xb6 +#define R_IA64_DTPREL64LSB 0xb7 +#define R_IA64_LTOFF_DTPREL22 0xba + + +#define EF_SH_MACH_MASK 0x1f +#define EF_SH_UNKNOWN 0x0 +#define EF_SH1 0x1 +#define EF_SH2 0x2 +#define EF_SH3 0x3 +#define EF_SH_DSP 0x4 +#define EF_SH3_DSP 0x5 +#define EF_SH4AL_DSP 0x6 +#define EF_SH3E 0x8 +#define EF_SH4 0x9 +#define EF_SH2E 0xb +#define EF_SH4A 0xc +#define EF_SH2A 0xd +#define EF_SH4_NOFPU 0x10 +#define EF_SH4A_NOFPU 0x11 +#define EF_SH4_NOMMU_NOFPU 0x12 +#define EF_SH2A_NOFPU 0x13 +#define EF_SH3_NOMMU 0x14 +#define EF_SH2A_SH4_NOFPU 0x15 +#define EF_SH2A_SH3_NOFPU 0x16 +#define EF_SH2A_SH4 0x17 +#define EF_SH2A_SH3E 0x18 + +#define R_SH_NONE 0 +#define R_SH_DIR32 1 +#define R_SH_REL32 2 +#define R_SH_DIR8WPN 3 +#define R_SH_IND12W 4 +#define R_SH_DIR8WPL 5 +#define R_SH_DIR8WPZ 6 +#define R_SH_DIR8BP 7 +#define R_SH_DIR8W 8 +#define R_SH_DIR8L 9 +#define R_SH_SWITCH16 25 +#define R_SH_SWITCH32 26 +#define R_SH_USES 27 +#define R_SH_COUNT 28 +#define R_SH_ALIGN 29 +#define R_SH_CODE 30 +#define R_SH_DATA 31 +#define R_SH_LABEL 32 +#define R_SH_SWITCH8 33 +#define R_SH_GNU_VTINHERIT 34 +#define R_SH_GNU_VTENTRY 35 +#define R_SH_TLS_GD_32 144 +#define R_SH_TLS_LD_32 145 +#define R_SH_TLS_LDO_32 146 +#define R_SH_TLS_IE_32 147 +#define R_SH_TLS_LE_32 148 +#define R_SH_TLS_DTPMOD32 149 +#define R_SH_TLS_DTPOFF32 150 +#define R_SH_TLS_TPOFF32 151 +#define R_SH_GOT32 160 +#define R_SH_PLT32 161 +#define R_SH_COPY 162 +#define R_SH_GLOB_DAT 163 +#define R_SH_JMP_SLOT 164 +#define R_SH_RELATIVE 165 +#define R_SH_GOTOFF 166 +#define R_SH_GOTPC 167 +#define R_SH_GOT20 201 +#define R_SH_GOTOFF20 202 +#define R_SH_GOTFUNCDESC 203 +#define R_SH_GOTFUNCDEST20 204 +#define R_SH_GOTOFFFUNCDESC 205 +#define R_SH_GOTOFFFUNCDEST20 206 +#define R_SH_FUNCDESC 207 +#define R_SH_FUNCDESC_VALUE 208 + +#define R_SH_NUM 256 + + + +#define R_390_NONE 0 +#define R_390_8 1 +#define R_390_12 2 +#define R_390_16 3 +#define R_390_32 4 +#define R_390_PC32 5 +#define R_390_GOT12 6 +#define R_390_GOT32 7 +#define R_390_PLT32 8 +#define R_390_COPY 9 +#define R_390_GLOB_DAT 10 +#define R_390_JMP_SLOT 11 +#define R_390_RELATIVE 12 +#define R_390_GOTOFF32 13 +#define R_390_GOTPC 14 +#define R_390_GOT16 15 +#define R_390_PC16 16 +#define R_390_PC16DBL 17 +#define R_390_PLT16DBL 18 +#define R_390_PC32DBL 19 +#define R_390_PLT32DBL 20 +#define R_390_GOTPCDBL 21 +#define R_390_64 22 +#define R_390_PC64 23 +#define R_390_GOT64 24 +#define R_390_PLT64 25 +#define R_390_GOTENT 26 +#define R_390_GOTOFF16 27 +#define R_390_GOTOFF64 28 +#define R_390_GOTPLT12 29 +#define R_390_GOTPLT16 30 +#define R_390_GOTPLT32 31 +#define R_390_GOTPLT64 32 +#define R_390_GOTPLTENT 33 +#define R_390_PLTOFF16 34 +#define R_390_PLTOFF32 35 +#define R_390_PLTOFF64 36 +#define R_390_TLS_LOAD 37 +#define R_390_TLS_GDCALL 38 + +#define R_390_TLS_LDCALL 39 + +#define R_390_TLS_GD32 40 + +#define R_390_TLS_GD64 41 + +#define R_390_TLS_GOTIE12 42 + +#define R_390_TLS_GOTIE32 43 + +#define R_390_TLS_GOTIE64 44 + +#define R_390_TLS_LDM32 45 + +#define R_390_TLS_LDM64 46 + +#define R_390_TLS_IE32 47 + +#define R_390_TLS_IE64 48 + +#define R_390_TLS_IEENT 49 + +#define R_390_TLS_LE32 50 + +#define R_390_TLS_LE64 51 + +#define R_390_TLS_LDO32 52 + +#define R_390_TLS_LDO64 53 + +#define R_390_TLS_DTPMOD 54 +#define R_390_TLS_DTPOFF 55 +#define R_390_TLS_TPOFF 56 + +#define R_390_20 57 +#define R_390_GOT20 58 +#define R_390_GOTPLT20 59 +#define R_390_TLS_GOTIE20 60 + + +#define R_390_NUM 61 + + + +#define R_CRIS_NONE 0 +#define R_CRIS_8 1 +#define R_CRIS_16 2 +#define R_CRIS_32 3 +#define R_CRIS_8_PCREL 4 +#define R_CRIS_16_PCREL 5 +#define R_CRIS_32_PCREL 6 +#define R_CRIS_GNU_VTINHERIT 7 +#define R_CRIS_GNU_VTENTRY 8 +#define R_CRIS_COPY 9 +#define R_CRIS_GLOB_DAT 10 +#define R_CRIS_JUMP_SLOT 11 +#define R_CRIS_RELATIVE 12 +#define R_CRIS_16_GOT 13 +#define R_CRIS_32_GOT 14 +#define R_CRIS_16_GOTPLT 15 +#define R_CRIS_32_GOTPLT 16 +#define R_CRIS_32_GOTREL 17 +#define R_CRIS_32_PLT_GOTREL 18 +#define R_CRIS_32_PLT_PCREL 19 + +#define R_CRIS_NUM 20 + + + +#define R_X86_64_NONE 0 +#define R_X86_64_64 1 +#define R_X86_64_PC32 2 +#define R_X86_64_GOT32 3 +#define R_X86_64_PLT32 4 +#define R_X86_64_COPY 5 +#define R_X86_64_GLOB_DAT 6 +#define R_X86_64_JUMP_SLOT 7 +#define R_X86_64_RELATIVE 8 +#define R_X86_64_GOTPCREL 9 + +#define R_X86_64_32 10 +#define R_X86_64_32S 11 +#define R_X86_64_16 12 +#define R_X86_64_PC16 13 +#define R_X86_64_8 14 +#define R_X86_64_PC8 15 +#define R_X86_64_DTPMOD64 16 +#define R_X86_64_DTPOFF64 17 +#define R_X86_64_TPOFF64 18 +#define R_X86_64_TLSGD 19 + +#define R_X86_64_TLSLD 20 + +#define R_X86_64_DTPOFF32 21 +#define R_X86_64_GOTTPOFF 22 + +#define R_X86_64_TPOFF32 23 +#define R_X86_64_PC64 24 +#define R_X86_64_GOTOFF64 25 +#define R_X86_64_GOTPC32 26 +#define R_X86_64_GOT64 27 +#define R_X86_64_GOTPCREL64 28 +#define R_X86_64_GOTPC64 29 +#define R_X86_64_GOTPLT64 30 +#define R_X86_64_PLTOFF64 31 +#define R_X86_64_SIZE32 32 +#define R_X86_64_SIZE64 33 + +#define R_X86_64_GOTPC32_TLSDESC 34 +#define R_X86_64_TLSDESC_CALL 35 + +#define R_X86_64_TLSDESC 36 +#define R_X86_64_IRELATIVE 37 +#define R_X86_64_RELATIVE64 38 +#define R_X86_64_GOTPCRELX 41 +#define R_X86_64_REX_GOTPCRELX 42 +#define R_X86_64_NUM 43 + + + +#define R_MN10300_NONE 0 +#define R_MN10300_32 1 +#define R_MN10300_16 2 +#define R_MN10300_8 3 +#define R_MN10300_PCREL32 4 +#define R_MN10300_PCREL16 5 +#define R_MN10300_PCREL8 6 +#define R_MN10300_GNU_VTINHERIT 7 +#define R_MN10300_GNU_VTENTRY 8 +#define R_MN10300_24 9 +#define R_MN10300_GOTPC32 10 +#define R_MN10300_GOTPC16 11 +#define R_MN10300_GOTOFF32 12 +#define R_MN10300_GOTOFF24 13 +#define R_MN10300_GOTOFF16 14 +#define R_MN10300_PLT32 15 +#define R_MN10300_PLT16 16 +#define R_MN10300_GOT32 17 +#define R_MN10300_GOT24 18 +#define R_MN10300_GOT16 19 +#define R_MN10300_COPY 20 +#define R_MN10300_GLOB_DAT 21 +#define R_MN10300_JMP_SLOT 22 +#define R_MN10300_RELATIVE 23 + +#define R_MN10300_NUM 24 + + + +#define R_M32R_NONE 0 +#define R_M32R_16 1 +#define R_M32R_32 2 +#define R_M32R_24 3 +#define R_M32R_10_PCREL 4 +#define R_M32R_18_PCREL 5 +#define R_M32R_26_PCREL 6 +#define R_M32R_HI16_ULO 7 +#define R_M32R_HI16_SLO 8 +#define R_M32R_LO16 9 +#define R_M32R_SDA16 10 +#define R_M32R_GNU_VTINHERIT 11 +#define R_M32R_GNU_VTENTRY 12 + +#define R_M32R_16_RELA 33 +#define R_M32R_32_RELA 34 +#define R_M32R_24_RELA 35 +#define R_M32R_10_PCREL_RELA 36 +#define R_M32R_18_PCREL_RELA 37 +#define R_M32R_26_PCREL_RELA 38 +#define R_M32R_HI16_ULO_RELA 39 +#define R_M32R_HI16_SLO_RELA 40 +#define R_M32R_LO16_RELA 41 +#define R_M32R_SDA16_RELA 42 +#define R_M32R_RELA_GNU_VTINHERIT 43 +#define R_M32R_RELA_GNU_VTENTRY 44 +#define R_M32R_REL32 45 + +#define R_M32R_GOT24 48 +#define R_M32R_26_PLTREL 49 +#define R_M32R_COPY 50 +#define R_M32R_GLOB_DAT 51 +#define R_M32R_JMP_SLOT 52 +#define R_M32R_RELATIVE 53 +#define R_M32R_GOTOFF 54 +#define R_M32R_GOTPC24 55 +#define R_M32R_GOT16_HI_ULO 56 + +#define R_M32R_GOT16_HI_SLO 57 + +#define R_M32R_GOT16_LO 58 +#define R_M32R_GOTPC_HI_ULO 59 + +#define R_M32R_GOTPC_HI_SLO 60 + +#define R_M32R_GOTPC_LO 61 + +#define R_M32R_GOTOFF_HI_ULO 62 + +#define R_M32R_GOTOFF_HI_SLO 63 + +#define R_M32R_GOTOFF_LO 64 +#define R_M32R_NUM 256 + +#define R_MICROBLAZE_NONE 0 +#define R_MICROBLAZE_32 1 +#define R_MICROBLAZE_32_PCREL 2 +#define R_MICROBLAZE_64_PCREL 3 +#define R_MICROBLAZE_32_PCREL_LO 4 +#define R_MICROBLAZE_64 5 +#define R_MICROBLAZE_32_LO 6 +#define R_MICROBLAZE_SRO32 7 +#define R_MICROBLAZE_SRW32 8 +#define R_MICROBLAZE_64_NONE 9 +#define R_MICROBLAZE_32_SYM_OP_SYM 10 +#define R_MICROBLAZE_GNU_VTINHERIT 11 +#define R_MICROBLAZE_GNU_VTENTRY 12 +#define R_MICROBLAZE_GOTPC_64 13 +#define R_MICROBLAZE_GOT_64 14 +#define R_MICROBLAZE_PLT_64 15 +#define R_MICROBLAZE_REL 16 +#define R_MICROBLAZE_JUMP_SLOT 17 +#define R_MICROBLAZE_GLOB_DAT 18 +#define R_MICROBLAZE_GOTOFF_64 19 +#define R_MICROBLAZE_GOTOFF_32 20 +#define R_MICROBLAZE_COPY 21 +#define R_MICROBLAZE_TLS 22 +#define R_MICROBLAZE_TLSGD 23 +#define R_MICROBLAZE_TLSLD 24 +#define R_MICROBLAZE_TLSDTPMOD32 25 +#define R_MICROBLAZE_TLSDTPREL32 26 +#define R_MICROBLAZE_TLSDTPREL64 27 +#define R_MICROBLAZE_TLSGOTTPREL32 28 +#define R_MICROBLAZE_TLSTPREL32 29 + +#define DT_NIOS2_GP 0x70000002 + +#define R_NIOS2_NONE 0 +#define R_NIOS2_S16 1 +#define R_NIOS2_U16 2 +#define R_NIOS2_PCREL16 3 +#define R_NIOS2_CALL26 4 +#define R_NIOS2_IMM5 5 +#define R_NIOS2_CACHE_OPX 6 +#define R_NIOS2_IMM6 7 +#define R_NIOS2_IMM8 8 +#define R_NIOS2_HI16 9 +#define R_NIOS2_LO16 10 +#define R_NIOS2_HIADJ16 11 +#define R_NIOS2_BFD_RELOC_32 12 +#define R_NIOS2_BFD_RELOC_16 13 +#define R_NIOS2_BFD_RELOC_8 14 +#define R_NIOS2_GPREL 15 +#define R_NIOS2_GNU_VTINHERIT 16 +#define R_NIOS2_GNU_VTENTRY 17 +#define R_NIOS2_UJMP 18 +#define R_NIOS2_CJMP 19 +#define R_NIOS2_CALLR 20 +#define R_NIOS2_ALIGN 21 +#define R_NIOS2_GOT16 22 +#define R_NIOS2_CALL16 23 +#define R_NIOS2_GOTOFF_LO 24 +#define R_NIOS2_GOTOFF_HA 25 +#define R_NIOS2_PCREL_LO 26 +#define R_NIOS2_PCREL_HA 27 +#define R_NIOS2_TLS_GD16 28 +#define R_NIOS2_TLS_LDM16 29 +#define R_NIOS2_TLS_LDO16 30 +#define R_NIOS2_TLS_IE16 31 +#define R_NIOS2_TLS_LE16 32 +#define R_NIOS2_TLS_DTPMOD 33 +#define R_NIOS2_TLS_DTPREL 34 +#define R_NIOS2_TLS_TPREL 35 +#define R_NIOS2_COPY 36 +#define R_NIOS2_GLOB_DAT 37 +#define R_NIOS2_JUMP_SLOT 38 +#define R_NIOS2_RELATIVE 39 +#define R_NIOS2_GOTOFF 40 +#define R_NIOS2_CALL26_NOAT 41 +#define R_NIOS2_GOT_LO 42 +#define R_NIOS2_GOT_HA 43 +#define R_NIOS2_CALL_LO 44 +#define R_NIOS2_CALL_HA 45 + +#define R_OR1K_NONE 0 +#define R_OR1K_32 1 +#define R_OR1K_16 2 +#define R_OR1K_8 3 +#define R_OR1K_LO_16_IN_INSN 4 +#define R_OR1K_HI_16_IN_INSN 5 +#define R_OR1K_INSN_REL_26 6 +#define R_OR1K_GNU_VTENTRY 7 +#define R_OR1K_GNU_VTINHERIT 8 +#define R_OR1K_32_PCREL 9 +#define R_OR1K_16_PCREL 10 +#define R_OR1K_8_PCREL 11 +#define R_OR1K_GOTPC_HI16 12 +#define R_OR1K_GOTPC_LO16 13 +#define R_OR1K_GOT16 14 +#define R_OR1K_PLT26 15 +#define R_OR1K_GOTOFF_HI16 16 +#define R_OR1K_GOTOFF_LO16 17 +#define R_OR1K_COPY 18 +#define R_OR1K_GLOB_DAT 19 +#define R_OR1K_JMP_SLOT 20 +#define R_OR1K_RELATIVE 21 +#define R_OR1K_TLS_GD_HI16 22 +#define R_OR1K_TLS_GD_LO16 23 +#define R_OR1K_TLS_LDM_HI16 24 +#define R_OR1K_TLS_LDM_LO16 25 +#define R_OR1K_TLS_LDO_HI16 26 +#define R_OR1K_TLS_LDO_LO16 27 +#define R_OR1K_TLS_IE_HI16 28 +#define R_OR1K_TLS_IE_LO16 29 +#define R_OR1K_TLS_LE_HI16 30 +#define R_OR1K_TLS_LE_LO16 31 +#define R_OR1K_TLS_TPOFF 32 +#define R_OR1K_TLS_DTPOFF 33 +#define R_OR1K_TLS_DTPMOD 34 + +#define R_BPF_NONE 0 +#define R_BPF_MAP_FD 1 + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/lib/include/envlock.h b/lib/include/envlock.h new file mode 100644 index 0000000..799cf7f --- /dev/null +++ b/lib/include/envlock.h @@ -0,0 +1,15 @@ +/* envlock.h -- header file for env routines. */ + +#ifndef _INCLUDE_ENVLOCK_H_ +#define _INCLUDE_ENVLOCK_H_ + +#include <_ansi.h> +#include + +#define ENV_LOCK __env_lock(reent_ptr) +#define ENV_UNLOCK __env_unlock(reent_ptr) + +void __env_lock (struct _reent *reent); +void __env_unlock (struct _reent *reent); + +#endif /* _INCLUDE_ENVLOCK_H_ */ diff --git a/lib/include/envz.h b/lib/include/envz.h new file mode 100644 index 0000000..e6a31c3 --- /dev/null +++ b/lib/include/envz.h @@ -0,0 +1,16 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#include +#include + +/* The newlib implementation of these functions assumes that sizeof(char) == 1. */ +char * envz_entry (const char *envz, size_t envz_len, const char *name); +char * envz_get (const char *envz, size_t envz_len, const char *name); +error_t envz_add (char **envz, size_t *envz_len, const char *name, const char *value); +error_t envz_merge (char **envz, size_t *envz_len, const char *envz2, size_t envz2_len, int override); +void envz_remove(char **envz, size_t *envz_len, const char *name); +void envz_strip (char **envz, size_t *envz_len); diff --git a/lib/include/errno.h b/lib/include/errno.h new file mode 100644 index 0000000..7cc2ca8 --- /dev/null +++ b/lib/include/errno.h @@ -0,0 +1,11 @@ +#ifndef __ERRNO_H__ +#define __ERRNO_H__ + +#ifndef __error_t_defined +typedef int error_t; +#define __error_t_defined 1 +#endif + +#include + +#endif /* !__ERRNO_H__ */ diff --git a/lib/include/fastmath.h b/lib/include/fastmath.h new file mode 100644 index 0000000..95eea5f --- /dev/null +++ b/lib/include/fastmath.h @@ -0,0 +1,13 @@ +#ifndef _FASTMATH_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _FASTMATH_H_ + +#include +#include + +#ifdef __cplusplus +} +#endif +#endif /* _FASTMATH_H_ */ diff --git a/lib/include/fcntl.h b/lib/include/fcntl.h new file mode 100644 index 0000000..86a9167 --- /dev/null +++ b/lib/include/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/lib/include/fenv.h b/lib/include/fenv.h new file mode 100644 index 0000000..4795cc9 --- /dev/null +++ b/lib/include/fenv.h @@ -0,0 +1,42 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#ifndef _FENV_H +#define _FENV_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exception */ +int feclearexcept(int excepts); +int fegetexceptflag(fexcept_t *flagp, int excepts); +int feraiseexcept(int excepts); +int fesetexceptflag(const fexcept_t *flagp, int excepts); +int fetestexcept(int excepts); + +/* Rounding mode */ +int fegetround(void); +int fesetround(int rounding_mode); + +/* Float environment */ +int fegetenv(fenv_t *envp); +int feholdexcept(fenv_t *envp); +int fesetenv(const fenv_t *envp); +int feupdateenv(const fenv_t *envp); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/fnmatch.h b/lib/include/fnmatch.h new file mode 100644 index 0000000..a94e923 --- /dev/null +++ b/lib/include/fnmatch.h @@ -0,0 +1,55 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/include/fnmatch.h,v 1.10 2002/03/23 17:24:53 imp Exp $ + * @(#)fnmatch.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _FNMATCH_H_ +#define _FNMATCH_H_ + +#include + +#define FNM_NOMATCH 1 /* Match failed. */ + +#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */ +#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */ +#define FNM_PERIOD 0x04 /* Period must be matched by period. */ + +#if __GNU_VISIBLE +#define FNM_LEADING_DIR 0x08 /* Ignore / after Imatch. */ +#define FNM_CASEFOLD 0x10 /* Case insensitive search. */ +#define FNM_IGNORECASE FNM_CASEFOLD +#define FNM_FILE_NAME FNM_PATHNAME +#endif + +__BEGIN_DECLS +int fnmatch(const char *, const char *, int); +__END_DECLS + +#endif /* !_FNMATCH_H_ */ diff --git a/lib/include/ftw.h b/lib/include/ftw.h new file mode 100644 index 0000000..8de1e1e --- /dev/null +++ b/lib/include/ftw.h @@ -0,0 +1,66 @@ +/* +* Copyright © 2005-2020 Rich Felker, et al. +* +* 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef _FTW_H +#define _FTW_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/* + * Valid flags for the 3rd argument to the function that is passed as the + * second argument to ftw(3) and nftw(3). Say it three times fast! + */ +#define FTW_F 0 /* File. */ +#define FTW_D 1 /* Directory. */ +#define FTW_DNR 2 /* Directory without read permission. */ +#define FTW_DP 3 /* Directory with subdirectories visited. */ +#define FTW_NS 4 /* Unknown type; stat() failed. */ +#define FTW_SL 5 /* Symbolic link. */ +#define FTW_SLN 6 /* Sym link that names a nonexistent file. */ + +/* + * Flags for use as the 4th argument to nftw(3). These may be ORed together. + */ +#define FTW_PHYS 0x01 /* Physical walk, don't follow sym links. */ +#define FTW_MOUNT 0x02 /* The walk does not cross a mount point. */ +#define FTW_DEPTH 0x04 /* Subdirs visited before the dir itself. */ +#define FTW_CHDIR 0x08 /* Change to a directory before reading it. */ + +struct FTW { + int base; + int level; +}; + +int ftw(const char *, int (*)(const char *, const struct stat *, int), int); +int nftw(const char *, int (*)(const char *, const struct stat *, int, struct FTW *), int, int); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/getopt.h b/lib/include/getopt.h new file mode 100644 index 0000000..ac88524 --- /dev/null +++ b/lib/include/getopt.h @@ -0,0 +1,185 @@ +/**************************************************************************** + +getopt.h - Read command line options + +AUTHOR: Gregory Pietsch +CREATED Thu Jan 09 22:37:00 1997 + +DESCRIPTION: + +The getopt() function parses the command line arguments. Its arguments argc +and argv are the argument count and array as passed to the main() function +on program invocation. The argument optstring is a list of available option +characters. If such a character is followed by a colon (`:'), the option +takes an argument, which is placed in optarg. If such a character is +followed by two colons, the option takes an optional argument, which is +placed in optarg. If the option does not take an argument, optarg is NULL. + +The external variable optind is the index of the next array element of argv +to be processed; it communicates from one call to the next which element to +process. + +The getopt_long() function works like getopt() except that it also accepts +long options started by two dashes `--'. If these take values, it is either +in the form + +--arg=value + + or + +--arg value + +It takes the additional arguments longopts which is a pointer to the first +element of an array of type GETOPT_LONG_OPTION_T, defined below. The last +element of the array has to be filled with NULL for the name field. + +The longind pointer points to the index of the current long option relative +to longopts if it is non-NULL. + +The getopt() function returns the option character if the option was found +successfully, `:' if there was a missing parameter for one of the options, +`?' for an unknown option character, and EOF for the end of the option list. + +The getopt_long() function's return value is described below. + +The function getopt_long_only() is identical to getopt_long(), except that a +plus sign `+' can introduce long options as well as `--'. + +Describe how to deal with options that follow non-option ARGV-elements. + +If the caller did not specify anything, the default is REQUIRE_ORDER if the +environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. + +REQUIRE_ORDER means don't recognize them as options; stop option processing +when the first non-option is seen. This is what Unix does. This mode of +operation is selected by either setting the environment variable +POSIXLY_CORRECT, or using `+' as the first character of the optstring +parameter. + +PERMUTE is the default. We permute the contents of ARGV as we scan, so that +eventually all the non-options are at the end. This allows options to be +given in any order, even with programs that were not written to expect this. + +RETURN_IN_ORDER is an option available to programs that were written to +expect options and other ARGV-elements in any order and that care about the +ordering of the two. We describe each non-option ARGV-element as if it were +the argument of an option with character code 1. Using `-' as the first +character of the optstring parameter selects this mode of operation. + +The special argument `--' forces an end of option-scanning regardless of the +value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause +getopt() and friends to return EOF with optind != argc. + +COPYRIGHT NOTICE AND DISCLAIMER: + +Copyright (C) 1997 Gregory Pietsch + +This file and the accompanying getopt.c implementation file are hereby +placed in the public domain without restrictions. Just give the author +credit, don't claim you wrote it or prevent anyone else from using it. + +Gregory Pietsch's current e-mail address: +gpietsch@comcast.net +****************************************************************************/ + +/* This is a glibc-extension header file. */ + +#ifndef GETOPT_H +#define GETOPT_H + +#include <_ansi.h> + +/* include files needed by this include file */ + +#define no_argument 0 +#define required_argument 1 +#define optional_argument 2 + +#ifdef __cplusplus +extern "C" +{ + +#endif /* __cplusplus */ + +/* types defined by this include file */ + struct option + { + const char *name; /* the name of the long option */ + int has_arg; /* one of the above macros */ + int *flag; /* determines if getopt_long() returns a + * value for a long option; if it is + * non-NULL, 0 is returned as a function + * value and the value of val is stored in + * the area pointed to by flag. Otherwise, + * val is returned. */ + int val; /* determines the value to return if flag is + * NULL. */ + + }; + +/* While getopt.h is a glibc extension, the following are newlib extensions. + * They are optionally included via the __need_getopt_newlib flag. */ + +#ifdef __need_getopt_newlib + + /* macros defined by this include file */ + #define NO_ARG no_argument + #define REQUIRED_ARG required_argument + #define OPTIONAL_ARG optional_argument + + /* The GETOPT_DATA_INITIALIZER macro is used to initialize a statically- + allocated variable of type struct getopt_data. */ + #define GETOPT_DATA_INITIALIZER {0,0,0,0,0,0,0} + + /* These #defines are to make accessing the reentrant functions easier. */ + #define getopt_r __getopt_r + #define getopt_long_r __getopt_long_r + #define getopt_long_only_r __getopt_long_only_r + + /* The getopt_data structure is for reentrancy. Its members are similar to + the externally-defined variables. */ + typedef struct getopt_data + { + char *optarg; + int optind, opterr, optopt, optwhere; + int permute_from, num_nonopts; + } getopt_data; + +#endif /* __need_getopt_newlib */ + + /* externally-defined variables */ + extern char *optarg; + extern int optind; + extern int opterr; + extern int optopt; + + /* function prototypes */ + int getopt (int __argc, char *const __argv[], const char *__optstring); + + int getopt_long (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind); + + int getopt_long_only (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind); + +#ifdef __need_getopt_newlib + int __getopt_r (int __argc, char *const __argv[], const char *__optstring, + struct getopt_data * __data); + + int __getopt_long_r (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind, + struct getopt_data * __data); + + int __getopt_long_only_r (int __argc, char *const __argv[], const char *__shortopts, + const struct option * __longopts, int *__longind, + struct getopt_data * __data); +#endif /* __need_getopt_newlib */ + +#ifdef __cplusplus +}; + +#endif /* __cplusplus */ + +#endif /* GETOPT_H */ + +/* END OF FILE getopt.h */ diff --git a/lib/include/glob.h b/lib/include/glob.h new file mode 100644 index 0000000..7a300e6 --- /dev/null +++ b/lib/include/glob.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)glob.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD: src/include/glob.h,v 1.6 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _GLOB_H_ +#define _GLOB_H_ + +#include + +struct stat; +typedef struct { + int gl_pathc; /* Count of total paths so far. */ + int gl_matchc; /* Count of paths matching pattern. */ + int gl_offs; /* Reserved at beginning of gl_pathv. */ + int gl_flags; /* Copy of flags parameter to glob. */ + char **gl_pathv; /* List of paths matching pattern. */ + /* Copy of errfunc parameter to glob. */ + int (*gl_errfunc)(const char *, int); + + /* + * Alternate filesystem access methods for glob; replacement + * versions of closedir(3), readdir(3), opendir(3), stat(2) + * and lstat(2). + */ + void (*gl_closedir)(void *); + struct dirent *(*gl_readdir)(void *); + void *(*gl_opendir)(const char *); + int (*gl_lstat)(const char *, struct stat *); + int (*gl_stat)(const char *, struct stat *); +} glob_t; + +#define GLOB_APPEND 0x0001 /* Append to output from previous call. */ +#define GLOB_DOOFFS 0x0002 /* Use gl_offs. */ +#define GLOB_ERR 0x0004 /* Return on error. */ +#define GLOB_MARK 0x0008 /* Append / to matching directories. */ +#define GLOB_NOCHECK 0x0010 /* Return pattern itself if nothing matches. */ +#define GLOB_NOSORT 0x0020 /* Don't sort. */ + +#define GLOB_ALTDIRFUNC 0x0040 /* Use alternately specified directory funcs. */ +#define GLOB_BRACE 0x0080 /* Expand braces ala csh. */ +#define GLOB_MAGCHAR 0x0100 /* Pattern had globbing characters. */ +#define GLOB_NOMAGIC 0x0200 /* GLOB_NOCHECK without magic chars (csh). */ +#define GLOB_QUOTE 0x0400 /* Quote special chars with \. */ +#define GLOB_TILDE 0x0800 /* Expand tilde names from the passwd file. */ +#define GLOB_LIMIT 0x1000 /* limit number of returned paths */ + +/* backwards compatibility, this is the old name for this option */ +#define GLOB_MAXPATH GLOB_LIMIT + +#define GLOB_NOSPACE (-1) /* Malloc call failed. */ +#define GLOB_ABEND (-2) /* Unignored error. */ + +__BEGIN_DECLS +int glob(const char *__restrict, int, int (*)(const char *, int), + glob_t *__restrict); +void globfree(glob_t *); +__END_DECLS + +#endif /* !_GLOB_H_ */ diff --git a/lib/include/grp.h b/lib/include/grp.h new file mode 100644 index 0000000..7296e7a --- /dev/null +++ b/lib/include/grp.h @@ -0,0 +1,86 @@ +/* $NetBSD: grp.h,v 1.7 1995/04/29 05:30:40 cgd Exp $ */ + +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)grp.h 8.2 (Berkeley) 1/21/94 + */ + +#ifndef _GRP_H_ +#define _GRP_H_ + +#include +#include +#ifdef __CYGWIN__ +#include +#endif + +#if __BSD_VISIBLE +#define _PATH_GROUP "/etc/group" +#endif + +struct group { + char *gr_name; /* group name */ + char *gr_passwd; /* group password */ + gid_t gr_gid; /* group id */ + char **gr_mem; /* group members */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __INSIDE_CYGWIN__ +struct group *getgrgid (gid_t); +struct group *getgrnam (const char *); +#if __MISC_VISIBLE || __POSIX_VISIBLE +int getgrnam_r (const char *, struct group *, + char *, size_t, struct group **); +int getgrgid_r (gid_t, struct group *, + char *, size_t, struct group **); +#endif /* __MISC_VISIBLE || __POSIX_VISIBLE */ +#if __MISC_VISIBLE || __XSI_VISIBLE >= 4 +struct group *getgrent (void); +void setgrent (void); +void endgrent (void); +#endif /* __MISC_VISIBLE || __XSI_VISIBLE >= 4 */ +#if __BSD_VISIBLE +int initgroups (const char *, gid_t); +#endif /* __BSD_VISIBLE */ +#endif /* !__INSIDE_CYGWIN__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* !_GRP_H_ */ diff --git a/lib/include/iconv.h b/lib/include/iconv.h new file mode 100644 index 0000000..37feb88 --- /dev/null +++ b/lib/include/iconv.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy, SoftMine Corporation. + * Rights transferred to Franklin Electronic Publishers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _ICONV_H_ +#define _ICONV_H_ + +#include <_ansi.h> +#include +#include +#include + +/* iconv_t: charset conversion descriptor type */ +typedef _iconv_t iconv_t; + +_BEGIN_STD_C + +#ifndef _REENT_ONLY +iconv_t +iconv_open (const char *, const char *); + +size_t +iconv (iconv_t, char **__restrict, size_t *__restrict, + char **__restrict, size_t *__restrict); + +int +iconv_close (iconv_t); +#endif + +iconv_t +_iconv_open_r (struct _reent *, const char *, const char *); + +size_t +_iconv_r (struct _reent *, iconv_t, const char **, + size_t *, char **, size_t *); + +int +_iconv_close_r (struct _reent *, iconv_t); + +_END_STD_C + +#endif /* #ifndef _ICONV_H_ */ diff --git a/lib/include/ieeefp.h b/lib/include/ieeefp.h new file mode 100644 index 0000000..2d6421a --- /dev/null +++ b/lib/include/ieeefp.h @@ -0,0 +1,295 @@ +#ifndef _IEEE_FP_H_ +#define _IEEE_FP_H_ + +#include "_ansi.h" + +#include +#include + +_BEGIN_STD_C + +/* FIXME FIXME FIXME: + Neither of __ieee_{float,double}_shape_type seem to be used anywhere + except in libm/test. If that is the case, please delete these from here. + If that is not the case, please insert documentation here describing why + they're needed. */ + +#ifdef __IEEE_BIG_ENDIAN + +typedef union +{ + double value; + struct + { + unsigned int sign : 1; + unsigned int exponent: 11; + unsigned int fraction0:4; + unsigned int fraction1:16; + unsigned int fraction2:16; + unsigned int fraction3:16; + + } number; + struct + { + unsigned int sign : 1; + unsigned int exponent: 11; + unsigned int quiet:1; + unsigned int function0:3; + unsigned int function1:16; + unsigned int function2:16; + unsigned int function3:16; + } nan; + struct + { + unsigned long msw; + unsigned long lsw; + } parts; + long aslong[2]; +} __ieee_double_shape_type; + +#elif defined __IEEE_LITTLE_ENDIAN + +typedef union +{ + double value; + struct + { +#ifdef __SMALL_BITFIELDS + unsigned int fraction3:16; + unsigned int fraction2:16; + unsigned int fraction1:16; + unsigned int fraction0: 4; +#else + unsigned int fraction1:32; + unsigned int fraction0:20; +#endif + unsigned int exponent :11; + unsigned int sign : 1; + } number; + struct + { +#ifdef __SMALL_BITFIELDS + unsigned int function3:16; + unsigned int function2:16; + unsigned int function1:16; + unsigned int function0:3; +#else + unsigned int function1:32; + unsigned int function0:19; +#endif + unsigned int quiet:1; + unsigned int exponent: 11; + unsigned int sign : 1; + } nan; + struct + { + unsigned long lsw; + unsigned long msw; + } parts; + + long aslong[2]; + +} __ieee_double_shape_type; + +#endif /* __IEEE_LITTLE_ENDIAN */ + +#ifdef __IEEE_BIG_ENDIAN + +typedef union +{ + float value; + struct + { + unsigned int sign : 1; + unsigned int exponent: 8; + unsigned int fraction0: 7; + unsigned int fraction1: 16; + } number; + struct + { + unsigned int sign:1; + unsigned int exponent:8; + unsigned int quiet:1; + unsigned int function0:6; + unsigned int function1:16; + } nan; + long p1; + +} __ieee_float_shape_type; + +#elif defined __IEEE_LITTLE_ENDIAN + +typedef union +{ + float value; + struct + { + unsigned int fraction0: 7; + unsigned int fraction1: 16; + unsigned int exponent: 8; + unsigned int sign : 1; + } number; + struct + { + unsigned int function1:16; + unsigned int function0:6; + unsigned int quiet:1; + unsigned int exponent:8; + unsigned int sign:1; + } nan; + long p1; + +} __ieee_float_shape_type; + +#endif /* __IEEE_LITTLE_ENDIAN */ + +#ifndef _LDBL_EQ_DBL + +#ifndef LDBL_MANT_DIG +#error "LDBL_MANT_DIG not defined - should be found in float.h" + +#elif LDBL_MANT_DIG == DBL_MANT_DIG +#error "double and long double are the same size but LDBL_EQ_DBL is not defined" + +#elif LDBL_MANT_DIG == 53 +/* This happens when doubles are 32-bits and long doubles are 64-bits. */ +#define EXT_EXPBITS 11 +#define EXT_FRACHBITS 20 +#define EXT_FRACLBITS 32 +#define __ieee_ext_field_type unsigned long + +#elif LDBL_MANT_DIG == 64 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 32 +#define EXT_FRACLBITS 32 +#define __ieee_ext_field_type unsigned int + +#elif LDBL_MANT_DIG == 65 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 32 +#define EXT_FRACLBITS 32 +#define __ieee_ext_field_type unsigned int + +#elif LDBL_MANT_DIG == 112 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 48 +#define EXT_FRACLBITS 64 +#define __ieee_ext_field_type unsigned long long + +#elif LDBL_MANT_DIG == 113 +#define EXT_EXPBITS 15 +#define EXT_FRACHBITS 48 +#define EXT_FRACLBITS 64 +#define __ieee_ext_field_type unsigned long long + +#else +#error Unsupported value for LDBL_MANT_DIG +#endif + +#define EXT_EXP_INFNAN ((1 << EXT_EXPBITS) - 1) /* 32767 */ +#define EXT_EXP_BIAS ((1 << (EXT_EXPBITS - 1)) - 1) /* 16383 */ +#define EXT_FRACBITS (EXT_FRACLBITS + EXT_FRACHBITS) + +typedef struct ieee_ext +{ + __ieee_ext_field_type ext_fracl : EXT_FRACLBITS; + __ieee_ext_field_type ext_frach : EXT_FRACHBITS; + __ieee_ext_field_type ext_exp : EXT_EXPBITS; + __ieee_ext_field_type ext_sign : 1; +} ieee_ext; + +typedef union ieee_ext_u +{ + long double extu_ld; + struct ieee_ext extu_ext; +} ieee_ext_u; + +#endif /* ! _LDBL_EQ_DBL */ + + +/* FLOATING ROUNDING */ + +typedef int fp_rnd; +#define FP_RN 0 /* Round to nearest */ +#define FP_RM 1 /* Round down */ +#define FP_RP 2 /* Round up */ +#define FP_RZ 3 /* Round to zero (trunate) */ + +fp_rnd fpgetround (void); +fp_rnd fpsetround (fp_rnd); + +/* EXCEPTIONS */ + +typedef int fp_except; +#define FP_X_INV 0x10 /* Invalid operation */ +#define FP_X_DX 0x80 /* Divide by zero */ +#define FP_X_OFL 0x04 /* Overflow exception */ +#define FP_X_UFL 0x02 /* Underflow exception */ +#define FP_X_IMP 0x01 /* imprecise exception */ + +fp_except fpgetmask (void); +fp_except fpsetmask (fp_except); +fp_except fpgetsticky (void); +fp_except fpsetsticky (fp_except); + +/* INTEGER ROUNDING */ + +typedef int fp_rdi; +#define FP_RDI_TOZ 0 /* Round to Zero */ +#define FP_RDI_RD 1 /* Follow float mode */ + +fp_rdi fpgetroundtoi (void); +fp_rdi fpsetroundtoi (fp_rdi); + +#define __IEEE_DBL_EXPBIAS 1023 +#define __IEEE_FLT_EXPBIAS 127 + +#define __IEEE_DBL_EXPLEN 11 +#define __IEEE_FLT_EXPLEN 8 + + +#define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1)) +#define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1)) + +#define __IEEE_DBL_MAXPOWTWO ((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1)) +#define __IEEE_FLT_MAXPOWTWO ((float)(1L << (32-8) - 1)) + +#define __IEEE_DBL_NAN_EXP 0x7ff +#define __IEEE_FLT_NAN_EXP 0xff + +#ifdef __ieeefp_isnanf +#define isnanf(x) __ieeefp_isnanf(x) +#endif + +#ifdef __ieeefp_isinff +#define isinff(x) __ieeefp_isinff(x) +#endif + +#ifdef __ieeefp_finitef +#define finitef(x) __ieeefp_finitef(x) +#endif + +#ifdef _DOUBLE_IS_32BITS +#undef __IEEE_DBL_EXPBIAS +#define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS + +#undef __IEEE_DBL_EXPLEN +#define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN + +#undef __IEEE_DBL_FRACLEN +#define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN + +#undef __IEEE_DBL_MAXPOWTWO +#define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO + +#undef __IEEE_DBL_NAN_EXP +#define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP + +#undef __ieee_double_shape_type +#define __ieee_double_shape_type __ieee_float_shape_type + +#endif /* _DOUBLE_IS_32BITS */ + +_END_STD_C + +#endif /* _IEEE_FP_H_ */ diff --git a/lib/include/inttypes.h b/lib/include/inttypes.h new file mode 100644 index 0000000..417ff22 --- /dev/null +++ b/lib/include/inttypes.h @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/** + * @file inttypes.h + */ + +#ifndef _INTTYPES_H +#define _INTTYPES_H + +#include +#include +#include +#include "_ansi.h" +#include +#define __need_wchar_t +#include + +#if __BSD_VISIBLE +#include +#endif + +#define __STRINGIFY(a) #a + +/* 8-bit types */ +#define __PRI8(x) __INT8 __STRINGIFY(x) +#define __PRI8LEAST(x) __LEAST8 __STRINGIFY(x) +#define __PRI8FAST(x) __FAST8 __STRINGIFY(x) + +/* NOTICE: scanning 8-bit types requires use of the hh specifier + * which is only supported on newlib platforms that + * are built with C99 I/O format support enabled. If the flag in + * newlib.h hasn't been set during configuration to indicate this, the 8-bit + * scanning format macros are disabled here as they result in undefined + * behaviour which can include memory overwrite. Overriding the flag after the + * library has been built is not recommended as it will expose the underlying + * undefined behaviour. + */ + +#if defined(_WANT_IO_C99_FORMATS) + #define __SCN8(x) __INT8 __STRINGIFY(x) + #define __SCN8LEAST(x) __LEAST8 __STRINGIFY(x) + #define __SCN8FAST(x) __FAST8 __STRINGIFY(x) +#endif /* _WANT_IO_C99_FORMATS */ + + +#define PRId8 __PRI8(d) +#define PRIi8 __PRI8(i) +#define PRIo8 __PRI8(o) +#define PRIu8 __PRI8(u) +#define PRIx8 __PRI8(x) +#define PRIX8 __PRI8(X) + +/* Macros below are only enabled for a newlib built with C99 I/O format support. */ +#if defined(_WANT_IO_C99_FORMATS) + +#define SCNd8 __SCN8(d) +#define SCNi8 __SCN8(i) +#define SCNo8 __SCN8(o) +#define SCNu8 __SCN8(u) +#define SCNx8 __SCN8(x) + +#endif /* _WANT_IO_C99_FORMATS */ + + +#define PRIdLEAST8 __PRI8LEAST(d) +#define PRIiLEAST8 __PRI8LEAST(i) +#define PRIoLEAST8 __PRI8LEAST(o) +#define PRIuLEAST8 __PRI8LEAST(u) +#define PRIxLEAST8 __PRI8LEAST(x) +#define PRIXLEAST8 __PRI8LEAST(X) + +/* Macros below are only enabled for a newlib built with C99 I/O format support. */ +#if defined(_WANT_IO_C99_FORMATS) + + #define SCNdLEAST8 __SCN8LEAST(d) + #define SCNiLEAST8 __SCN8LEAST(i) + #define SCNoLEAST8 __SCN8LEAST(o) + #define SCNuLEAST8 __SCN8LEAST(u) + #define SCNxLEAST8 __SCN8LEAST(x) + +#endif /* _WANT_IO_C99_FORMATS */ + +#define PRIdFAST8 __PRI8FAST(d) +#define PRIiFAST8 __PRI8FAST(i) +#define PRIoFAST8 __PRI8FAST(o) +#define PRIuFAST8 __PRI8FAST(u) +#define PRIxFAST8 __PRI8FAST(x) +#define PRIXFAST8 __PRI8FAST(X) + +/* Macros below are only enabled for a newlib built with C99 I/O format support. */ +#if defined(_WANT_IO_C99_FORMATS) + + #define SCNdFAST8 __SCN8FAST(d) + #define SCNiFAST8 __SCN8FAST(i) + #define SCNoFAST8 __SCN8FAST(o) + #define SCNuFAST8 __SCN8FAST(u) + #define SCNxFAST8 __SCN8FAST(x) + +#endif /* _WANT_IO_C99_FORMATS */ + +/* 16-bit types */ +#define __PRI16(x) __INT16 __STRINGIFY(x) +#define __PRI16LEAST(x) __LEAST16 __STRINGIFY(x) +#define __PRI16FAST(x) __FAST16 __STRINGIFY(x) +#define __SCN16(x) __INT16 __STRINGIFY(x) +#define __SCN16LEAST(x) __LEAST16 __STRINGIFY(x) +#define __SCN16FAST(x) __FAST16 __STRINGIFY(x) + + +#define PRId16 __PRI16(d) +#define PRIi16 __PRI16(i) +#define PRIo16 __PRI16(o) +#define PRIu16 __PRI16(u) +#define PRIx16 __PRI16(x) +#define PRIX16 __PRI16(X) + +#define SCNd16 __SCN16(d) +#define SCNi16 __SCN16(i) +#define SCNo16 __SCN16(o) +#define SCNu16 __SCN16(u) +#define SCNx16 __SCN16(x) + + +#define PRIdLEAST16 __PRI16LEAST(d) +#define PRIiLEAST16 __PRI16LEAST(i) +#define PRIoLEAST16 __PRI16LEAST(o) +#define PRIuLEAST16 __PRI16LEAST(u) +#define PRIxLEAST16 __PRI16LEAST(x) +#define PRIXLEAST16 __PRI16LEAST(X) + +#define SCNdLEAST16 __SCN16LEAST(d) +#define SCNiLEAST16 __SCN16LEAST(i) +#define SCNoLEAST16 __SCN16LEAST(o) +#define SCNuLEAST16 __SCN16LEAST(u) +#define SCNxLEAST16 __SCN16LEAST(x) + + +#define PRIdFAST16 __PRI16FAST(d) +#define PRIiFAST16 __PRI16FAST(i) +#define PRIoFAST16 __PRI16FAST(o) +#define PRIuFAST16 __PRI16FAST(u) +#define PRIxFAST16 __PRI16FAST(x) +#define PRIXFAST16 __PRI16FAST(X) + +#define SCNdFAST16 __SCN16FAST(d) +#define SCNiFAST16 __SCN16FAST(i) +#define SCNoFAST16 __SCN16FAST(o) +#define SCNuFAST16 __SCN16FAST(u) +#define SCNxFAST16 __SCN16FAST(x) + +/* 32-bit types */ +#define __PRI32(x) __INT32 __STRINGIFY(x) +#define __SCN32(x) __INT32 __STRINGIFY(x) +#define __PRI32LEAST(x) __LEAST32 __STRINGIFY(x) +#define __SCN32LEAST(x) __LEAST32 __STRINGIFY(x) +#define __PRI32FAST(x) __FAST32 __STRINGIFY(x) +#define __SCN32FAST(x) __FAST32 __STRINGIFY(x) + +#define PRId32 __PRI32(d) +#define PRIi32 __PRI32(i) +#define PRIo32 __PRI32(o) +#define PRIu32 __PRI32(u) +#define PRIx32 __PRI32(x) +#define PRIX32 __PRI32(X) + +#define SCNd32 __SCN32(d) +#define SCNi32 __SCN32(i) +#define SCNo32 __SCN32(o) +#define SCNu32 __SCN32(u) +#define SCNx32 __SCN32(x) + + +#define PRIdLEAST32 __PRI32LEAST(d) +#define PRIiLEAST32 __PRI32LEAST(i) +#define PRIoLEAST32 __PRI32LEAST(o) +#define PRIuLEAST32 __PRI32LEAST(u) +#define PRIxLEAST32 __PRI32LEAST(x) +#define PRIXLEAST32 __PRI32LEAST(X) + +#define SCNdLEAST32 __SCN32LEAST(d) +#define SCNiLEAST32 __SCN32LEAST(i) +#define SCNoLEAST32 __SCN32LEAST(o) +#define SCNuLEAST32 __SCN32LEAST(u) +#define SCNxLEAST32 __SCN32LEAST(x) + + +#define PRIdFAST32 __PRI32FAST(d) +#define PRIiFAST32 __PRI32FAST(i) +#define PRIoFAST32 __PRI32FAST(o) +#define PRIuFAST32 __PRI32FAST(u) +#define PRIxFAST32 __PRI32FAST(x) +#define PRIXFAST32 __PRI32FAST(X) + +#define SCNdFAST32 __SCN32FAST(d) +#define SCNiFAST32 __SCN32FAST(i) +#define SCNoFAST32 __SCN32FAST(o) +#define SCNuFAST32 __SCN32FAST(u) +#define SCNxFAST32 __SCN32FAST(x) + + +/* 64-bit types */ +#define __PRI64(x) __INT64 __STRINGIFY(x) +#define __SCN64(x) __INT64 __STRINGIFY(x) + +#define __PRI64LEAST(x) __LEAST64 __STRINGIFY(x) +#define __SCN64LEAST(x) __LEAST64 __STRINGIFY(x) +#define __PRI64FAST(x) __FAST64 __STRINGIFY(x) +#define __SCN64FAST(x) __FAST64 __STRINGIFY(x) + +#if __int64_t_defined +#define PRId64 __PRI64(d) +#define PRIi64 __PRI64(i) +#define PRIo64 __PRI64(o) +#define PRIu64 __PRI64(u) +#define PRIx64 __PRI64(x) +#define PRIX64 __PRI64(X) + +#define SCNd64 __SCN64(d) +#define SCNi64 __SCN64(i) +#define SCNo64 __SCN64(o) +#define SCNu64 __SCN64(u) +#define SCNx64 __SCN64(x) +#endif + +#if __int_least64_t_defined +#define PRIdLEAST64 __PRI64LEAST(d) +#define PRIiLEAST64 __PRI64LEAST(i) +#define PRIoLEAST64 __PRI64LEAST(o) +#define PRIuLEAST64 __PRI64LEAST(u) +#define PRIxLEAST64 __PRI64LEAST(x) +#define PRIXLEAST64 __PRI64LEAST(X) + +#define SCNdLEAST64 __SCN64LEAST(d) +#define SCNiLEAST64 __SCN64LEAST(i) +#define SCNoLEAST64 __SCN64LEAST(o) +#define SCNuLEAST64 __SCN64LEAST(u) +#define SCNxLEAST64 __SCN64LEAST(x) +#endif + +#if __int_fast64_t_defined +#define PRIdFAST64 __PRI64FAST(d) +#define PRIiFAST64 __PRI64FAST(i) +#define PRIoFAST64 __PRI64FAST(o) +#define PRIuFAST64 __PRI64FAST(u) +#define PRIxFAST64 __PRI64FAST(x) +#define PRIXFAST64 __PRI64FAST(X) + +#define SCNdFAST64 __SCN64FAST(d) +#define SCNiFAST64 __SCN64FAST(i) +#define SCNoFAST64 __SCN64FAST(o) +#define SCNuFAST64 __SCN64FAST(u) +#define SCNxFAST64 __SCN64FAST(x) +#endif + +/* max-bit types */ +#if __have_long64 +#define __PRIMAX(x) __STRINGIFY(l##x) +#define __SCNMAX(x) __STRINGIFY(l##x) +#elif __have_longlong64 +#define __PRIMAX(x) __STRINGIFY(ll##x) +#define __SCNMAX(x) __STRINGIFY(ll##x) +#else +#define __PRIMAX(x) __STRINGIFY(x) +#define __SCNMAX(x) __STRINGIFY(x) +#endif + +#define PRIdMAX __PRIMAX(d) +#define PRIiMAX __PRIMAX(i) +#define PRIoMAX __PRIMAX(o) +#define PRIuMAX __PRIMAX(u) +#define PRIxMAX __PRIMAX(x) +#define PRIXMAX __PRIMAX(X) + +#define SCNdMAX __SCNMAX(d) +#define SCNiMAX __SCNMAX(i) +#define SCNoMAX __SCNMAX(o) +#define SCNuMAX __SCNMAX(u) +#define SCNxMAX __SCNMAX(x) + +/* ptr types */ +#if defined (_INTPTR_EQ_LONGLONG) +# define __PRIPTR(x) __STRINGIFY(ll##x) +# define __SCNPTR(x) __STRINGIFY(ll##x) +#elif defined (_INTPTR_EQ_LONG) +# define __PRIPTR(x) __STRINGIFY(l##x) +# define __SCNPTR(x) __STRINGIFY(l##x) +#else +# define __PRIPTR(x) __STRINGIFY(x) +# define __SCNPTR(x) __STRINGIFY(x) +#endif + +#define PRIdPTR __PRIPTR(d) +#define PRIiPTR __PRIPTR(i) +#define PRIoPTR __PRIPTR(o) +#define PRIuPTR __PRIPTR(u) +#define PRIxPTR __PRIPTR(x) +#define PRIXPTR __PRIPTR(X) + +#define SCNdPTR __SCNPTR(d) +#define SCNiPTR __SCNPTR(i) +#define SCNoPTR __SCNPTR(o) +#define SCNuPTR __SCNPTR(u) +#define SCNxPTR __SCNPTR(x) + + +typedef struct { + intmax_t quot; + intmax_t rem; +} imaxdiv_t; + +struct _reent; + +#ifdef __cplusplus +extern "C" { +#endif + +extern intmax_t imaxabs(intmax_t); +extern imaxdiv_t imaxdiv(intmax_t __numer, intmax_t __denomer); +extern intmax_t strtoimax(const char *__restrict, char **__restrict, int); +extern intmax_t _strtoimax_r(struct _reent *, const char *__restrict, char **__restrict, int); +extern uintmax_t strtoumax(const char *__restrict, char **__restrict, int); +extern uintmax_t _strtoumax_r(struct _reent *, const char *__restrict, char **__restrict, int); +extern intmax_t wcstoimax(const wchar_t *__restrict, wchar_t **__restrict, int); +extern intmax_t _wcstoimax_r(struct _reent *, const wchar_t *__restrict, wchar_t **__restrict, int); +extern uintmax_t wcstoumax(const wchar_t *__restrict, wchar_t **__restrict, int); +extern uintmax_t _wcstoumax_r(struct _reent *, const wchar_t *__restrict, wchar_t **__restrict, int); + +#if __BSD_VISIBLE +extern intmax_t strtoimax_l(const char *__restrict, char **_restrict, int, locale_t); +extern uintmax_t strtoumax_l(const char *__restrict, char **_restrict, int, locale_t); +extern intmax_t wcstoimax_l(const wchar_t *__restrict, wchar_t **_restrict, int, locale_t); +extern uintmax_t wcstoumax_l(const wchar_t *__restrict, wchar_t **_restrict, int, locale_t); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/langinfo.h b/lib/include/langinfo.h new file mode 100644 index 0000000..fcf986c --- /dev/null +++ b/lib/include/langinfo.h @@ -0,0 +1,332 @@ +/*- + * Copyright (c) 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/include/langinfo.h,v 1.5 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _LANGINFO_H_ +#define _LANGINFO_H_ + +#include +#include +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#ifndef _NL_ITEM_DECLARED +typedef __nl_item nl_item; +#define _NL_ITEM_DECLARED +#endif + +enum +{ + /* POSIX and BSD defined items have to stick to the original values + to maintain backward compatibility. */ + _NL_CTYPE_CODESET_NAME = 0, /* codeset name */ +#define CODESET _NL_CTYPE_CODESET_NAME + D_T_FMT, /* string for formatting date and time */ +#define D_T_FMT D_T_FMT + D_FMT, /* date format string */ +#define D_FMT D_FMT + T_FMT, /* time format string */ +#define T_FMT T_FMT + T_FMT_AMPM, /* a.m. or p.m. time formatting string */ +#define T_FMT_AMPM T_FMT_AMPM + AM_STR, /* Ante Meridian affix */ +#define AM_STR AM_STR + PM_STR, /* Post Meridian affix */ +#define PM_STR PM_STR + +/* week day names */ + DAY_1, +#define DAY_1 DAY_1 + DAY_2, +#define DAY_2 DAY_2 + DAY_3, +#define DAY_3 DAY_3 + DAY_4, +#define DAY_4 DAY_4 + DAY_5, +#define DAY_5 DAY_5 + DAY_6, +#define DAY_6 DAY_6 + DAY_7, +#define DAY_7 DAY_7 + +/* abbreviated week day names */ + ABDAY_1, +#define ABDAY_1 ABDAY_1 + ABDAY_2, +#define ABDAY_2 ABDAY_2 + ABDAY_3, +#define ABDAY_3 ABDAY_3 + ABDAY_4, +#define ABDAY_4 ABDAY_4 + ABDAY_5, +#define ABDAY_5 ABDAY_5 + ABDAY_6, +#define ABDAY_6 ABDAY_6 + ABDAY_7, +#define ABDAY_7 ABDAY_7 + +/* month names */ + MON_1, +#define MON_1 MON_1 + MON_2, +#define MON_2 MON_2 + MON_3, +#define MON_3 MON_3 + MON_4, +#define MON_4 MON_4 + MON_5, +#define MON_5 MON_5 + MON_6, +#define MON_6 MON_6 + MON_7, +#define MON_7 MON_7 + MON_8, +#define MON_8 MON_8 + MON_9, +#define MON_9 MON_9 + MON_10, +#define MON_10 MON_10 + MON_11, +#define MON_11 MON_11 + MON_12, +#define MON_12 MON_12 + +/* abbreviated month names */ + ABMON_1, +#define ABMON_1 ABMON_1 + ABMON_2, +#define ABMON_2 ABMON_2 + ABMON_3, +#define ABMON_3 ABMON_3 + ABMON_4, +#define ABMON_4 ABMON_4 + ABMON_5, +#define ABMON_5 ABMON_5 + ABMON_6, +#define ABMON_6 ABMON_6 + ABMON_7, +#define ABMON_7 ABMON_7 + ABMON_8, +#define ABMON_8 ABMON_8 + ABMON_9, +#define ABMON_9 ABMON_9 + ABMON_10, +#define ABMON_10 ABMON_10 + ABMON_11, +#define ABMON_11 ABMON_11 + ABMON_12, +#define ABMON_12 ABMON_12 + + ERA, /* era description segments */ +#define ERA ERA + ERA_D_FMT, /* era date format string */ +#define ERA_D_FMT ERA_D_FMT + ERA_D_T_FMT, /* era date and time format string */ +#define ERA_D_T_FMT ERA_D_T_FMT + ERA_T_FMT, /* era time format string */ +#define ERA_T_FMT ERA_T_FMT + ALT_DIGITS, /* alternative symbols for digits */ +#define ALT_DIGITS ALT_DIGITS + + RADIXCHAR, /* radix char */ +#define RADIXCHAR RADIXCHAR + THOUSEP, /* separator for thousands */ +#define THOUSEP THOUSEP + + YESEXPR, /* affirmative response expression */ +#define YESEXPR YESEXPR + NOEXPR, /* negative response expression */ +#define NOEXPR NOEXPR + YESSTR, /* affirmative response for yes/no queries */ +#define YESSTR YESSTR + NOSTR, /* negative response for yes/no queries */ +#define NOSTR NOSTR + + CRNCYSTR, /* currency symbol */ +#define CRNCYSTR CRNCYSTR + + D_MD_ORDER, /* month/day order (BSD extension) */ +#define D_MD_ORDER D_MD_ORDER + + _NL_TIME_DATE_FMT = 84, /* date fmt used by date(1) (GNU extension) */ +#define _DATE_FMT _NL_TIME_DATE_FMT + +#ifdef __HAVE_LOCALE_INFO__ + _NL_CTYPE_MB_CUR_MAX, + _NL_MESSAGES_CODESET, + +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + + /* NOTE: + + Always maintain the order and position of existing entries! + Always append new entry to the list, prior to the definition + of _NL_LOCALE_EXTENDED_LAST_ENTRY. */ + + _NL_LOCALE_EXTENDED_FIRST_ENTRY, + + _NL_CTYPE_OUTDIGITS0_MB, + _NL_CTYPE_OUTDIGITS1_MB, + _NL_CTYPE_OUTDIGITS2_MB, + _NL_CTYPE_OUTDIGITS3_MB, + _NL_CTYPE_OUTDIGITS4_MB, + _NL_CTYPE_OUTDIGITS5_MB, + _NL_CTYPE_OUTDIGITS6_MB, + _NL_CTYPE_OUTDIGITS7_MB, + _NL_CTYPE_OUTDIGITS8_MB, + _NL_CTYPE_OUTDIGITS9_MB, + _NL_CTYPE_OUTDIGITS0_WC, + _NL_CTYPE_OUTDIGITS1_WC, + _NL_CTYPE_OUTDIGITS2_WC, + _NL_CTYPE_OUTDIGITS3_WC, + _NL_CTYPE_OUTDIGITS4_WC, + _NL_CTYPE_OUTDIGITS5_WC, + _NL_CTYPE_OUTDIGITS6_WC, + _NL_CTYPE_OUTDIGITS7_WC, + _NL_CTYPE_OUTDIGITS8_WC, + _NL_CTYPE_OUTDIGITS9_WC, + + _NL_TIME_CODESET, + _NL_TIME_WMON_1, + _NL_TIME_WMON_2, + _NL_TIME_WMON_3, + _NL_TIME_WMON_4, + _NL_TIME_WMON_5, + _NL_TIME_WMON_6, + _NL_TIME_WMON_7, + _NL_TIME_WMON_8, + _NL_TIME_WMON_9, + _NL_TIME_WMON_10, + _NL_TIME_WMON_11, + _NL_TIME_WMON_12, + _NL_TIME_WMONTH_1, + _NL_TIME_WMONTH_2, + _NL_TIME_WMONTH_3, + _NL_TIME_WMONTH_4, + _NL_TIME_WMONTH_5, + _NL_TIME_WMONTH_6, + _NL_TIME_WMONTH_7, + _NL_TIME_WMONTH_8, + _NL_TIME_WMONTH_9, + _NL_TIME_WMONTH_10, + _NL_TIME_WMONTH_11, + _NL_TIME_WMONTH_12, + _NL_TIME_WWDAY_1, + _NL_TIME_WWDAY_2, + _NL_TIME_WWDAY_3, + _NL_TIME_WWDAY_4, + _NL_TIME_WWDAY_5, + _NL_TIME_WWDAY_6, + _NL_TIME_WWDAY_7, + _NL_TIME_WWEEKDAY_1, + _NL_TIME_WWEEKDAY_2, + _NL_TIME_WWEEKDAY_3, + _NL_TIME_WWEEKDAY_4, + _NL_TIME_WWEEKDAY_5, + _NL_TIME_WWEEKDAY_6, + _NL_TIME_WWEEKDAY_7, + _NL_TIME_WT_FMT, + _NL_TIME_WD_FMT, + _NL_TIME_WD_T_FMT, + _NL_TIME_WAM_STR, + _NL_TIME_WPM_STR, + _NL_TIME_WDATE_FMT, + _NL_TIME_WT_FMT_AMPM, + _NL_TIME_WERA, + _NL_TIME_WERA_D_FMT, + _NL_TIME_WERA_D_T_FMT, + _NL_TIME_WERA_T_FMT, + _NL_TIME_WALT_DIGITS, + + _NL_NUMERIC_CODESET, + _NL_NUMERIC_GROUPING, + _NL_NUMERIC_DECIMAL_POINT_WC, + _NL_NUMERIC_THOUSANDS_SEP_WC, + + _NL_MONETARY_INT_CURR_SYMBOL, + _NL_MONETARY_CURRENCY_SYMBOL, + _NL_MONETARY_MON_DECIMAL_POINT, + _NL_MONETARY_MON_THOUSANDS_SEP, + _NL_MONETARY_MON_GROUPING, + _NL_MONETARY_POSITIVE_SIGN, + _NL_MONETARY_NEGATIVE_SIGN, + _NL_MONETARY_INT_FRAC_DIGITS, + _NL_MONETARY_FRAC_DIGITS, + _NL_MONETARY_P_CS_PRECEDES, + _NL_MONETARY_P_SEP_BY_SPACE, + _NL_MONETARY_N_CS_PRECEDES, + _NL_MONETARY_N_SEP_BY_SPACE, + _NL_MONETARY_P_SIGN_POSN, + _NL_MONETARY_N_SIGN_POSN, + _NL_MONETARY_INT_P_CS_PRECEDES, + _NL_MONETARY_INT_P_SEP_BY_SPACE, + _NL_MONETARY_INT_N_CS_PRECEDES, + _NL_MONETARY_INT_N_SEP_BY_SPACE, + _NL_MONETARY_INT_P_SIGN_POSN, + _NL_MONETARY_INT_N_SIGN_POSN, + _NL_MONETARY_CODESET, + _NL_MONETARY_WINT_CURR_SYMBOL, + _NL_MONETARY_WCURRENCY_SYMBOL, + _NL_MONETARY_WMON_DECIMAL_POINT, + _NL_MONETARY_WMON_THOUSANDS_SEP, + _NL_MONETARY_WPOSITIVE_SIGN, + _NL_MONETARY_WNEGATIVE_SIGN, + + _NL_MESSAGES_WYESEXPR, + _NL_MESSAGES_WNOEXPR, + _NL_MESSAGES_WYESSTR, + _NL_MESSAGES_WNOSTR, + + _NL_COLLATE_CODESET, + + /* This MUST be the last entry since it's used to check for an array + index in nl_langinfo(). It also must not exceed _NL_LOCALE_NAME_BASE. */ + _NL_LOCALE_EXTENDED_LAST_ENTRY + +#endif /* __HAVE_LOCALE_INFO_EXTENDED__ */ +#endif /* __HAVE_LOCALE_INFO__ */ + +}; + +/* As an extension, nl_langinfo can retrive the name of a locale + category, with this mapping from setlocale() category (other than + LC_ALL) to nl_item. */ +#define _NL_LOCALE_NAME_BASE 100000 +#if __GNU_VISIBLE +#define NL_LOCALE_NAME(category) (_NL_LOCALE_NAME_BASE + (category)) +#endif + +__BEGIN_DECLS +char *nl_langinfo (nl_item); +#if __POSIX_VISIBLE >= 200809 +char *nl_langinfo_l (nl_item, locale_t); +#endif +__END_DECLS + +#endif /* !_LANGINFO_H_ */ diff --git a/lib/include/libgen.h b/lib/include/libgen.h new file mode 100644 index 0000000..414b5aa --- /dev/null +++ b/lib/include/libgen.h @@ -0,0 +1,37 @@ +/* + * libgen.h - defined by XPG4 + */ + +#ifndef _LIBGEN_H_ +#define _LIBGEN_H_ + +#include "_ansi.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* There are two common basename variants. If you do NOT #include + and you do + + #define _GNU_SOURCE + #include + + you get the GNU version. Otherwise you get the POSIX versionfor which you + should #include i for the function prototype. POSIX requires that + #undef basename will still let you invoke the underlying function. However, + this also implies that the POSIX version is used in this case. That's made + sure here. */ +#undef basename +#define basename __xpg_basename +char *basename (char *) __asm__(__ASMNAME("basename")); +char *dirname (char *); + +#ifdef __cplusplus +} +#endif + +#endif /* _LIBGEN_H_ */ + diff --git a/lib/include/limits.h b/lib/include/limits.h new file mode 100644 index 0000000..893f108 --- /dev/null +++ b/lib/include/limits.h @@ -0,0 +1,147 @@ +#ifndef _LIBC_LIMITS_H_ +# define _LIBC_LIMITS_H_ 1 + +#include +#include +#include + +# ifdef _MB_LEN_MAX +# define MB_LEN_MAX _MB_LEN_MAX +# else +# define MB_LEN_MAX 1 +# endif + +/* Maximum number of positional arguments, if _WANT_IO_POS_ARGS. */ +# ifndef NL_ARGMAX +# define NL_ARGMAX 32 +# endif + +/* if do not have #include_next support, then we + have to define the limits here. */ +# if !defined __GNUC__ || __GNUC__ < 2 + +# ifndef _LIMITS_H +# define _LIMITS_H 1 + +# include + +/* Number of bits in a `char'. */ +# undef CHAR_BIT +# define CHAR_BIT 8 + +/* Minimum and maximum values a `signed char' can hold. */ +# undef SCHAR_MIN +# define SCHAR_MIN (-128) +# undef SCHAR_MAX +# define SCHAR_MAX 127 + +/* Maximum value an `unsigned char' can hold. (Minimum is 0). */ +# undef UCHAR_MAX +# define UCHAR_MAX 255 + +/* Minimum and maximum values a `char' can hold. */ +# ifdef __CHAR_UNSIGNED__ +# undef CHAR_MIN +# define CHAR_MIN 0 +# undef CHAR_MAX +# define CHAR_MAX 255 +# else +# undef CHAR_MIN +# define CHAR_MIN (-128) +# undef CHAR_MAX +# define CHAR_MAX 127 +# endif + +/* Minimum and maximum values a `signed short int' can hold. */ +# undef SHRT_MIN +/* For the sake of 16 bit hosts, we may not use -32768 */ +# define SHRT_MIN (-32767-1) +# undef SHRT_MAX +# define SHRT_MAX 32767 + +/* Maximum value an `unsigned short int' can hold. (Minimum is 0). */ +# undef USHRT_MAX +# define USHRT_MAX 65535 + +/* Minimum and maximum values a `signed int' can hold. */ +# ifndef __INT_MAX__ +# define __INT_MAX__ 2147483647 +# endif +# undef INT_MIN +# define INT_MIN (-INT_MAX-1) +# undef INT_MAX +# define INT_MAX __INT_MAX__ + +/* Maximum value an `unsigned int' can hold. (Minimum is 0). */ +# undef UINT_MAX +# define UINT_MAX (INT_MAX * 2U + 1) + +/* Minimum and maximum values a `signed long int' can hold. + (Same as `int'). */ +# ifndef __LONG_MAX__ +# if defined (__alpha__) || (defined (__sparc__) && defined(__arch64__)) || defined (__sparcv9) +# define __LONG_MAX__ 9223372036854775807L +# else +# define __LONG_MAX__ 2147483647L +# endif /* __alpha__ || sparc64 */ +# endif +# undef LONG_MIN +# define LONG_MIN (-LONG_MAX-1) +# undef LONG_MAX +# define LONG_MAX __LONG_MAX__ + +/* Maximum value an `unsigned long int' can hold. (Minimum is 0). */ +# undef ULONG_MAX +# define ULONG_MAX (LONG_MAX * 2UL + 1) + +# ifndef __LONG_LONG_MAX__ +# define __LONG_LONG_MAX__ 9223372036854775807LL +# endif + +# if __ISO_C_VISIBLE >= 1999 +/* Minimum and maximum values a `signed long long int' can hold. */ +# undef LLONG_MIN +# define LLONG_MIN (-LLONG_MAX-1) +# undef LLONG_MAX +# define LLONG_MAX __LONG_LONG_MAX__ + +/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ +# undef ULLONG_MAX +# define ULLONG_MAX (LLONG_MAX * 2ULL + 1) +# endif + +# if __GNU_VISIBLE +/* Minimum and maximum values a `signed long long int' can hold. */ +# undef LONG_LONG_MIN +# define LONG_LONG_MIN (-LONG_LONG_MAX-1) +# undef LONG_LONG_MAX +# define LONG_LONG_MAX __LONG_LONG_MAX__ + +/* Maximum value an `unsigned long long int' can hold. (Minimum is 0). */ +# undef ULONG_LONG_MAX +# define ULONG_LONG_MAX (LONG_LONG_MAX * 2ULL + 1) +# endif + +# endif /* _LIMITS_H */ +# endif /* GCC 2. */ + +#endif /* !_LIBC_LIMITS_H_ */ + +#if defined __GNUC__ && !defined _GCC_LIMITS_H_ +/* `_GCC_LIMITS_H_' is what GCC's file defines. */ +# include_next +#endif /* __GNUC__ && !_GCC_LIMITS_H_ */ + +#ifndef _POSIX2_RE_DUP_MAX +/* The maximum number of repeated occurrences of a regular expression + * permitted when using the interval notation `\{M,N\}'. */ +#define _POSIX2_RE_DUP_MAX 255 +#endif /* _POSIX2_RE_DUP_MAX */ + +#ifndef ARG_MAX +#define ARG_MAX 4096 +#endif + +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif diff --git a/lib/include/locale.h b/lib/include/locale.h new file mode 100644 index 0000000..ec7f861 --- /dev/null +++ b/lib/include/locale.h @@ -0,0 +1,96 @@ +/* + locale.h + Values appropriate for the formatting of monetary and other + numberic quantities. +*/ + +#ifndef _LOCALE_H_ +#define _LOCALE_H_ + +#include "_ansi.h" +#include + +#define __need_NULL +#include + +#define LC_ALL 0 +#define LC_COLLATE 1 +#define LC_CTYPE 2 +#define LC_MONETARY 3 +#define LC_NUMERIC 4 +#define LC_TIME 5 +#define LC_MESSAGES 6 + +#if __POSIX_VISIBLE >= 200809 || defined (_LIBC) + +#include + +#define LC_ALL_MASK (1 << LC_ALL) +#define LC_COLLATE_MASK (1 << LC_COLLATE) +#define LC_CTYPE_MASK (1 << LC_CTYPE) +#define LC_MONETARY_MASK (1 << LC_MONETARY) +#define LC_NUMERIC_MASK (1 << LC_NUMERIC) +#define LC_TIME_MASK (1 << LC_TIME) +#define LC_MESSAGES_MASK (1 << LC_MESSAGES) + +#define LC_GLOBAL_LOCALE ((struct __locale_t *) -1) + +#endif /* __POSIX_VISIBLE >= 200809 */ + +_BEGIN_STD_C + +struct lconv +{ + char *decimal_point; + char *thousands_sep; + char *grouping; + char *int_curr_symbol; + char *currency_symbol; + char *mon_decimal_point; + char *mon_thousands_sep; + char *mon_grouping; + char *positive_sign; + char *negative_sign; + char int_frac_digits; + char frac_digits; + char p_cs_precedes; + char p_sep_by_space; + char n_cs_precedes; + char n_sep_by_space; + char p_sign_posn; + char n_sign_posn; + char int_n_cs_precedes; + char int_n_sep_by_space; + char int_n_sign_posn; + char int_p_cs_precedes; + char int_p_sep_by_space; + char int_p_sign_posn; +}; + +struct _reent; +char *_setlocale_r (struct _reent *, int, const char *); +struct lconv *_localeconv_r (struct _reent *); + +struct __locale_t *_newlocale_r (struct _reent *, int, const char *, + struct __locale_t *); +void _freelocale_r (struct _reent *, struct __locale_t *); +struct __locale_t *_duplocale_r (struct _reent *, struct __locale_t *); +struct __locale_t *_uselocale_r (struct _reent *, struct __locale_t *); + +#ifndef _REENT_ONLY + +char *setlocale (int, const char *); +struct lconv *localeconv (void); + +#if __POSIX_VISIBLE >= 200809 +locale_t newlocale (int, const char *, locale_t); +void freelocale (locale_t); +locale_t duplocale (locale_t); +locale_t uselocale (locale_t); +#endif /* __POSIX_VISIBLE >= 200809 */ + +#endif /* _REENT_ONLY */ + +_END_STD_C + +#endif /* _LOCALE_H_ */ diff --git a/lib/include/machine/_arc4random.h b/lib/include/machine/_arc4random.h new file mode 100644 index 0000000..52808d7 --- /dev/null +++ b/lib/include/machine/_arc4random.h @@ -0,0 +1 @@ +/* Use default implementation, see arc4random.h */ diff --git a/lib/include/machine/_default_types.h b/lib/include/machine/_default_types.h new file mode 100644 index 0000000..6137493 --- /dev/null +++ b/lib/include/machine/_default_types.h @@ -0,0 +1,250 @@ +/* + * $Id$ + */ + +#ifndef _MACHINE__DEFAULT_TYPES_H +#define _MACHINE__DEFAULT_TYPES_H + +#include + +/* + * Guess on types by examining *_MIN / *_MAX defines. + */ +#if __GNUC_PREREQ (3, 3) +/* GCC >= 3.3.0 has ____ implicitly defined. */ +#define __EXP(x) __##x##__ +#else +/* Fall back to POSIX versions from */ +#define __EXP(x) x +#include +#endif + +/* Check if "long long" is 64bit wide */ +/* Modern GCCs provide __LONG_LONG_MAX__, SUSv3 wants LLONG_MAX */ +#if ( defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) ) \ + || ( defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) ) +#define __have_longlong64 1 +#endif + +/* Check if "long" is 64bit or 32bit wide */ +#if __EXP(LONG_MAX) > 0x7fffffff +#define __have_long64 1 +#elif __EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__) +#define __have_long32 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __INT8_TYPE__ +typedef __INT8_TYPE__ __int8_t; +#ifdef __UINT8_TYPE__ +typedef __UINT8_TYPE__ __uint8_t; +#else +typedef unsigned __INT8_TYPE__ __uint8_t; +#endif +#define ___int8_t_defined 1 +#elif __EXP(SCHAR_MAX) == 0x7f +typedef signed char __int8_t ; +typedef unsigned char __uint8_t ; +#define ___int8_t_defined 1 +#endif + +#ifdef __INT16_TYPE__ +typedef __INT16_TYPE__ __int16_t; +#ifdef __UINT16_TYPE__ +typedef __UINT16_TYPE__ __uint16_t; +#else +typedef unsigned __INT16_TYPE__ __uint16_t; +#endif +#define ___int16_t_defined 1 +#elif __EXP(INT_MAX) == 0x7fff +typedef signed int __int16_t; +typedef unsigned int __uint16_t; +#define ___int16_t_defined 1 +#elif __EXP(SHRT_MAX) == 0x7fff +typedef signed short __int16_t; +typedef unsigned short __uint16_t; +#define ___int16_t_defined 1 +#elif __EXP(SCHAR_MAX) == 0x7fff +typedef signed char __int16_t; +typedef unsigned char __uint16_t; +#define ___int16_t_defined 1 +#endif + +#ifdef __INT32_TYPE__ +typedef __INT32_TYPE__ __int32_t; +#ifdef __UINT32_TYPE__ +typedef __UINT32_TYPE__ __uint32_t; +#else +typedef unsigned __INT32_TYPE__ __uint32_t; +#endif +#define ___int32_t_defined 1 +#elif __EXP(INT_MAX) == 0x7fffffffL +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +#define ___int32_t_defined 1 +#elif __EXP(LONG_MAX) == 0x7fffffffL +typedef signed long __int32_t; +typedef unsigned long __uint32_t; +#define ___int32_t_defined 1 +#elif __EXP(SHRT_MAX) == 0x7fffffffL +typedef signed short __int32_t; +typedef unsigned short __uint32_t; +#define ___int32_t_defined 1 +#elif __EXP(SCHAR_MAX) == 0x7fffffffL +typedef signed char __int32_t; +typedef unsigned char __uint32_t; +#define ___int32_t_defined 1 +#endif + +#ifdef __INT64_TYPE__ +typedef __INT64_TYPE__ __int64_t; +#ifdef __UINT64_TYPE__ +typedef __UINT64_TYPE__ __uint64_t; +#else +typedef unsigned __INT64_TYPE__ __uint64_t; +#endif +#define ___int64_t_defined 1 +#elif __EXP(LONG_MAX) > 0x7fffffff +typedef signed long __int64_t; +typedef unsigned long __uint64_t; +#define ___int64_t_defined 1 + +/* GCC has __LONG_LONG_MAX__ */ +#elif defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) +typedef signed long long __int64_t; +typedef unsigned long long __uint64_t; +#define ___int64_t_defined 1 + +/* POSIX mandates LLONG_MAX in */ +#elif defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) +typedef signed long long __int64_t; +typedef unsigned long long __uint64_t; +#define ___int64_t_defined 1 + +#elif __EXP(INT_MAX) > 0x7fffffff +typedef signed int __int64_t; +typedef unsigned int __uint64_t; +#define ___int64_t_defined 1 +#endif + +#ifdef __INT_LEAST8_TYPE__ +typedef __INT_LEAST8_TYPE__ __int_least8_t; +#ifdef __UINT_LEAST8_TYPE__ +typedef __UINT_LEAST8_TYPE__ __uint_least8_t; +#else +typedef unsigned __INT_LEAST8_TYPE__ __uint_least8_t; +#endif +#define ___int_least8_t_defined 1 +#elif defined(___int8_t_defined) +typedef __int8_t __int_least8_t; +typedef __uint8_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#elif defined(___int16_t_defined) +typedef __int16_t __int_least8_t; +typedef __uint16_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#elif defined(___int32_t_defined) +typedef __int32_t __int_least8_t; +typedef __uint32_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least8_t; +typedef __uint64_t __uint_least8_t; +#define ___int_least8_t_defined 1 +#endif + +#ifdef __INT_LEAST16_TYPE__ +typedef __INT_LEAST16_TYPE__ __int_least16_t; +#ifdef __UINT_LEAST16_TYPE__ +typedef __UINT_LEAST16_TYPE__ __uint_least16_t; +#else +typedef unsigned __INT_LEAST16_TYPE__ __uint_least16_t; +#endif +#define ___int_least16_t_defined 1 +#elif defined(___int16_t_defined) +typedef __int16_t __int_least16_t; +typedef __uint16_t __uint_least16_t; +#define ___int_least16_t_defined 1 +#elif defined(___int32_t_defined) +typedef __int32_t __int_least16_t; +typedef __uint32_t __uint_least16_t; +#define ___int_least16_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least16_t; +typedef __uint64_t __uint_least16_t; +#define ___int_least16_t_defined 1 +#endif + +#ifdef __INT_LEAST32_TYPE__ +typedef __INT_LEAST32_TYPE__ __int_least32_t; +#ifdef __UINT_LEAST32_TYPE__ +typedef __UINT_LEAST32_TYPE__ __uint_least32_t; +#else +typedef unsigned __INT_LEAST32_TYPE__ __uint_least32_t; +#endif +#define ___int_least32_t_defined 1 +#elif defined(___int32_t_defined) +typedef __int32_t __int_least32_t; +typedef __uint32_t __uint_least32_t; +#define ___int_least32_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least32_t; +typedef __uint64_t __uint_least32_t; +#define ___int_least32_t_defined 1 +#endif + +#ifdef __INT_LEAST64_TYPE__ +typedef __INT_LEAST64_TYPE__ __int_least64_t; +#ifdef __UINT_LEAST64_TYPE__ +typedef __UINT_LEAST64_TYPE__ __uint_least64_t; +#else +typedef unsigned __INT_LEAST64_TYPE__ __uint_least64_t; +#endif +#define ___int_least64_t_defined 1 +#elif defined(___int64_t_defined) +typedef __int64_t __int_least64_t; +typedef __uint64_t __uint_least64_t; +#define ___int_least64_t_defined 1 +#endif + +#if defined(__INTMAX_TYPE__) +typedef __INTMAX_TYPE__ __intmax_t; +#elif __have_longlong64 +typedef signed long long __intmax_t; +#else +typedef signed long __intmax_t; +#endif + +#if defined(__UINTMAX_TYPE__) +typedef __UINTMAX_TYPE__ __uintmax_t; +#elif __have_longlong64 +typedef unsigned long long __uintmax_t; +#else +typedef unsigned long __uintmax_t; +#endif + +#ifdef __INTPTR_TYPE__ +typedef __INTPTR_TYPE__ __intptr_t; +#ifdef __UINTPTR_TYPE__ +typedef __UINTPTR_TYPE__ __uintptr_t; +#else +typedef unsigned __INTPTR_TYPE__ __uintptr_t; +#endif +#elif defined(__PTRDIFF_TYPE__) +typedef __PTRDIFF_TYPE__ __intptr_t; +typedef unsigned __PTRDIFF_TYPE__ __uintptr_t; +#else +typedef long __intptr_t; +typedef unsigned long __uintptr_t; +#endif + +#undef __EXP + +#ifdef __cplusplus +} +#endif + +#endif /* _MACHINE__DEFAULT_TYPES_H */ diff --git a/lib/include/machine/_endian.h b/lib/include/machine/_endian.h new file mode 100644 index 0000000..92a14dc --- /dev/null +++ b/lib/include/machine/_endian.h @@ -0,0 +1,35 @@ +#ifndef __MACHINE_ENDIAN_H__ +#error "must be included via " +#endif /* !__MACHINE_ENDIAN_H__ */ + +#include + +#ifdef __PPC__ +/* Get rid of GCC builtin defines on PowerPC */ +#ifdef _BIG_ENDIAN +#undef _BIG_ENDIAN +#endif +#ifdef _LITTLE_ENDIAN +#undef _LITTLE_ENDIAN +#endif +#endif /* __PPC__ */ + +#ifndef _LITTLE_ENDIAN +#define _LITTLE_ENDIAN 1234 +#endif + +#ifndef _BIG_ENDIAN +#define _BIG_ENDIAN 4321 +#endif + +#ifndef _PDP_ENDIAN +#define _PDP_ENDIAN 3412 +#endif + +#ifndef _BYTE_ORDER +#if defined(__IEEE_LITTLE_ENDIAN) || defined(__IEEE_BYTES_LITTLE_ENDIAN) +#define _BYTE_ORDER _LITTLE_ENDIAN +#else +#define _BYTE_ORDER _BIG_ENDIAN +#endif +#endif diff --git a/lib/include/machine/_time.h b/lib/include/machine/_time.h new file mode 100644 index 0000000..476760c --- /dev/null +++ b/lib/include/machine/_time.h @@ -0,0 +1,3 @@ +#ifndef _SYS_TIME_H_ +#error "must be included via " +#endif /* !_SYS_TIME_H_ */ diff --git a/lib/include/machine/_types.h b/lib/include/machine/_types.h new file mode 100644 index 0000000..17e6d51 --- /dev/null +++ b/lib/include/machine/_types.h @@ -0,0 +1,8 @@ +/* + * $Id$ + */ + +#ifndef _MACHINE__TYPES_H +#define _MACHINE__TYPES_H +#include +#endif diff --git a/lib/include/machine/ansi.h b/lib/include/machine/ansi.h new file mode 100644 index 0000000..737b6d0 --- /dev/null +++ b/lib/include/machine/ansi.h @@ -0,0 +1 @@ +/* dummy header file to support BSD compiler */ diff --git a/lib/include/machine/endian.h b/lib/include/machine/endian.h new file mode 100644 index 0000000..34a5726 --- /dev/null +++ b/lib/include/machine/endian.h @@ -0,0 +1,69 @@ +#ifndef __MACHINE_ENDIAN_H__ +#define __MACHINE_ENDIAN_H__ + +#include +#include +#include + +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define _QUAD_HIGHWORD 1 +#define _QUAD_LOWWORD 0 +#else +#define _QUAD_HIGHWORD 0 +#define _QUAD_LOWWORD 1 +#endif + +#if __BSD_VISIBLE +#define LITTLE_ENDIAN _LITTLE_ENDIAN +#define BIG_ENDIAN _BIG_ENDIAN +#define PDP_ENDIAN _PDP_ENDIAN +#define BYTE_ORDER _BYTE_ORDER +#endif + +#ifdef __GNUC__ +#define __bswap16(_x) __builtin_bswap16(_x) +#define __bswap32(_x) __builtin_bswap32(_x) +#define __bswap64(_x) __builtin_bswap64(_x) +#else /* __GNUC__ */ +static __inline __uint16_t +__bswap16(__uint16_t _x) +{ + + return ((__uint16_t)((_x >> 8) | ((_x << 8) & 0xff00))); +} + +static __inline __uint32_t +__bswap32(__uint32_t _x) +{ + + return ((__uint32_t)((_x >> 24) | ((_x >> 8) & 0xff00) | + ((_x << 8) & 0xff0000) | ((_x << 24) & 0xff000000))); +} + +static __inline __uint64_t +__bswap64(__uint64_t _x) +{ + + return ((__uint64_t)((_x >> 56) | ((_x >> 40) & 0xff00) | + ((_x >> 24) & 0xff0000) | ((_x >> 8) & 0xff000000) | + ((_x << 8) & ((__uint64_t)0xff << 32)) | + ((_x << 24) & ((__uint64_t)0xff << 40)) | + ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56)))); +} +#endif /* !__GNUC__ */ + +#ifndef __machine_host_to_from_network_defined +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define __htonl(_x) __bswap32(_x) +#define __htons(_x) __bswap16(_x) +#define __ntohl(_x) __bswap32(_x) +#define __ntohs(_x) __bswap16(_x) +#else +#define __htonl(_x) ((__uint32_t)(_x)) +#define __htons(_x) ((__uint16_t)(_x)) +#define __ntohl(_x) ((__uint32_t)(_x)) +#define __ntohs(_x) ((__uint16_t)(_x)) +#endif +#endif /* __machine_host_to_from_network_defined */ + +#endif /* __MACHINE_ENDIAN_H__ */ diff --git a/lib/include/machine/fastmath.h b/lib/include/machine/fastmath.h new file mode 100644 index 0000000..d13ab3b --- /dev/null +++ b/lib/include/machine/fastmath.h @@ -0,0 +1,98 @@ +#ifdef __sysvnecv70_target +double EXFUN(fast_sin,(double)); +double EXFUN(fast_cos,(double)); +double EXFUN(fast_tan,(double)); + +double EXFUN(fast_asin,(double)); +double EXFUN(fast_acos,(double)); +double EXFUN(fast_atan,(double)); + +double EXFUN(fast_sinh,(double)); +double EXFUN(fast_cosh,(double)); +double EXFUN(fast_tanh,(double)); + +double EXFUN(fast_asinh,(double)); +double EXFUN(fast_acosh,(double)); +double EXFUN(fast_atanh,(double)); + +double EXFUN(fast_abs,(double)); +double EXFUN(fast_sqrt,(double)); +double EXFUN(fast_exp2,(double)); +double EXFUN(fast_exp10,(double)); +double EXFUN(fast_expe,(double)); +double EXFUN(fast_log10,(double)); +double EXFUN(fast_log2,(double)); +double EXFUN(fast_loge,(double)); + + +#define sin(x) fast_sin(x) +#define cos(x) fast_cos(x) +#define tan(x) fast_tan(x) +#define asin(x) fast_asin(x) +#define acos(x) fast_acos(x) +#define atan(x) fast_atan(x) +#define sinh(x) fast_sinh(x) +#define cosh(x) fast_cosh(x) +#define tanh(x) fast_tanh(x) +#define asinh(x) fast_asinh(x) +#define acosh(x) fast_acosh(x) +#define atanh(x) fast_atanh(x) +#define abs(x) fast_abs(x) +#define sqrt(x) fast_sqrt(x) +#define exp2(x) fast_exp2(x) +#define exp10(x) fast_exp10(x) +#define expe(x) fast_expe(x) +#define log10(x) fast_log10(x) +#define log2(x) fast_log2(x) +#define loge(x) fast_loge(x) + +/* These functions are in assembler, they really do take floats. This + can only be used with a real ANSI compiler */ + +float EXFUN(fast_sinf,(float)); +float EXFUN(fast_cosf,(float)); +float EXFUN(fast_tanf,(float)); + +float EXFUN(fast_asinf,(float)); +float EXFUN(fast_acosf,(float)); +float EXFUN(fast_atanf,(float)); + +float EXFUN(fast_sinhf,(float)); +float EXFUN(fast_coshf,(float)); +float EXFUN(fast_tanhf,(float)); + +float EXFUN(fast_asinhf,(float)); +float EXFUN(fast_acoshf,(float)); +float EXFUN(fast_atanhf,(float)); + +float EXFUN(fast_absf,(float)); +float EXFUN(fast_sqrtf,(float)); +float EXFUN(fast_exp2f,(float)); +float EXFUN(fast_exp10f,(float)); +float EXFUN(fast_expef,(float)); +float EXFUN(fast_log10f,(float)); +float EXFUN(fast_log2f,(float)); +float EXFUN(fast_logef,(float)); +#define sinf(x) fast_sinf(x) +#define cosf(x) fast_cosf(x) +#define tanf(x) fast_tanf(x) +#define asinf(x) fast_asinf(x) +#define acosf(x) fast_acosf(x) +#define atanf(x) fast_atanf(x) +#define sinhf(x) fast_sinhf(x) +#define coshf(x) fast_coshf(x) +#define tanhf(x) fast_tanhf(x) +#define asinhf(x) fast_asinhf(x) +#define acoshf(x) fast_acoshf(x) +#define atanhf(x) fast_atanhf(x) +#define absf(x) fast_absf(x) +#define sqrtf(x) fast_sqrtf(x) +#define exp2f(x) fast_exp2f(x) +#define exp10f(x) fast_exp10f(x) +#define expef(x) fast_expef(x) +#define log10f(x) fast_log10f(x) +#define log2f(x) fast_log2f(x) +#define logef(x) fast_logef(x) +/* Override the functions defined in math.h */ +#endif /* __sysvnecv70_target */ + diff --git a/lib/include/machine/ieee.h b/lib/include/machine/ieee.h new file mode 100644 index 0000000..0656909 --- /dev/null +++ b/lib/include/machine/ieee.h @@ -0,0 +1,127 @@ +#ifndef _MACHINE_IEEE_H_ +#define _MACHINE_IEEE_H_ +#include +#include +#include +#include + +#if LDBL_MANT_DIG == 24 +#define EXT_IMPLICIT_NBIT +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_frac; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN +struct ieee_ext { + uint32_t ext_frac:23; + uint32_t ext_exp:8; + uint32_t ext_sign:1; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN + uint32_t ext_sign:1; + uint32_t ext_exp:8; + uint32_t ext_frac:23; +#else /* ARMEL without __VFP_FP__ */ + uint32_t ext_frac:23; + uint32_t ext_exp:8; + uint32_t ext_sign:1; +#endif +}; +#endif +#elif LDBL_MANT_DIG == 53 +#define EXT_IMPLICIT_NBIT +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_fracl; \ + (a)[1] = (p)->ext_frach; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN +struct ieee_ext { + uint32_t ext_fracl; + uint32_t ext_frach:20; + uint32_t ext_exp:11; + uint32_t ext_sign:1; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN + uint32_t ext_sign:1; + uint32_t ext_exp:11; + uint32_t ext_frach:20; +#else /* ARMEL without __VFP_FP__ */ + uint32_t ext_frach:20; + uint32_t ext_exp:11; + uint32_t ext_sign:1; +#endif + uint32_t ext_fracl; +}; +#endif +#elif LDBL_MANT_DIG == 64 +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_fracl; \ + (a)[1] = (p)->ext_frach; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN /* for Intel CPU */ +struct ieee_ext { + uint32_t ext_fracl; + uint32_t ext_frach; + uint32_t ext_exp:15; + uint32_t ext_sign:1; + uint32_t ext_padl:16; + uint32_t ext_padh; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN /* for m68k */ + uint32_t ext_sign:1; + uint32_t ext_exp:15; + uint32_t ext_pad:16; +#else /* ARM FPA10 math coprocessor */ + uint32_t ext_exp:15; + uint32_t ext_pad:16; + uint32_t ext_sign:1; +#endif + uint32_t ext_frach; + uint32_t ext_fracl; +}; +#endif +#elif LDBL_MANT_DIG == 113 +#define EXT_IMPLICIT_NBIT +#define EXT_TO_ARRAY32(p, a) do { \ + (a)[0] = (p)->ext_fracl; \ + (a)[1] = (p)->ext_fraclm; \ + (a)[2] = (p)->ext_frachm; \ + (a)[3] = (p)->ext_frach; \ +} while (0) +#ifdef __IEEE_LITTLE_ENDIAN +struct ieee_ext { + uint32_t ext_fracl; + uint32_t ext_fraclm; + uint32_t ext_frachm; + uint32_t ext_frach:16; + uint32_t ext_exp:15; + uint32_t ext_sign:1; +}; +#endif +#ifdef __IEEE_BIG_ENDIAN +struct ieee_ext { +#ifndef ___IEEE_BYTES_LITTLE_ENDIAN + uint32_t ext_sign:1; + uint32_t ext_exp:15; + uint32_t ext_frach:16; +#else /* ARMEL without __VFP_FP__ */ + uint32_t ext_frach:16; + uint32_t ext_exp:15; + uint32_t ext_sign:1; +#endif + uint32_t ext_frachm; + uint32_t ext_fraclm; + uint32_t ext_fracl; +}; +#endif +#endif + +#endif /* _MACHINE_IEEE_H_ */ diff --git a/lib/include/machine/ieeefp.h b/lib/include/machine/ieeefp.h new file mode 100644 index 0000000..a29557a --- /dev/null +++ b/lib/include/machine/ieeefp.h @@ -0,0 +1,529 @@ +#ifndef __IEEE_BIG_ENDIAN +#ifndef __IEEE_LITTLE_ENDIAN + +/* This file can define macros to choose variations of the IEEE float + format: + + _FLT_LARGEST_EXPONENT_IS_NORMAL + + Defined if the float format uses the largest exponent for finite + numbers rather than NaN and infinity representations. Such a + format cannot represent NaNs or infinities at all, but it's FLT_MAX + is twice the IEEE value. + + _FLT_NO_DENORMALS + + Defined if the float format does not support IEEE denormals. Every + float with a zero exponent is taken to be a zero representation. + + ??? At the moment, there are no equivalent macros above for doubles and + the macros are not fully supported by --enable-newlib-hw-fp. + + __IEEE_BIG_ENDIAN + + Defined if the float format is big endian. This is mutually exclusive + with __IEEE_LITTLE_ENDIAN. + + __IEEE_LITTLE_ENDIAN + + Defined if the float format is little endian. This is mutually exclusive + with __IEEE_BIG_ENDIAN. + + Note that one of __IEEE_BIG_ENDIAN or __IEEE_LITTLE_ENDIAN must be specified for a + platform or error will occur. + + __IEEE_BYTES_LITTLE_ENDIAN + + This flag is used in conjunction with __IEEE_BIG_ENDIAN to describe a situation + whereby multiple words of an IEEE floating point are in big endian order, but the + words themselves are little endian with respect to the bytes. + + _DOUBLE_IS_32BITS + + This is used on platforms that support double by using the 32-bit IEEE + float type. + + _FLOAT_ARG + + This represents what type a float arg is passed as. It is used when the type is + not promoted to double. + + + __OBSOLETE_MATH_DEFAULT + + Default value for __OBSOLETE_MATH if that's not set by the user. + It should be set here based on predefined feature macros. + + __OBSOLETE_MATH + + If set to 1 then some new math code will be disabled and older libm + code will be used instead. This is necessary because the new math + code does not support all targets, it assumes that the toolchain has + ISO C99 support (hexfloat literals, standard fenv semantics), the + target has IEEE-754 conforming binary32 float and binary64 double + (not mixed endian) representation, standard SNaN representation, + double and single precision arithmetics has similar latency and it + has no legacy SVID matherr support, only POSIX errno and fenv + exception based error handling. +*/ + +#if (defined(__arm__) || defined(__thumb__)) && !defined(__MAVERICK__) +/* ARM traditionally used big-endian words; and within those words the + byte ordering was big or little endian depending upon the target. + Modern floating-point formats are naturally ordered; in this case + __VFP_FP__ will be defined, even if soft-float. */ +#ifdef __VFP_FP__ +# ifdef __ARMEL__ +# define __IEEE_LITTLE_ENDIAN +# else +# define __IEEE_BIG_ENDIAN +# endif +# if __ARM_FP & 0x8 +# define __OBSOLETE_MATH_DEFAULT 0 +# endif +#else +# define __IEEE_BIG_ENDIAN +# ifdef __ARMEL__ +# define __IEEE_BYTES_LITTLE_ENDIAN +# endif +#endif +#ifndef __SOFTFP__ +# define _SUPPORTS_ERREXCEPT +#endif +/* As per ISO/IEC TS 18661 '__FLT_EVAL_METHOD__' will be defined to 16 + (if compiling with +fp16 support) so it can't be used by math.h to + define float_t and double_t. For values of '__FLT_EVAL_METHOD__' + other than 0, 1, 2 the definition of float_t and double_t is + implementation-defined. */ +#define __DOUBLE_TYPE double +#define __FLOAT_TYPE float +#endif + +#if defined (__aarch64__) +#if defined (__AARCH64EL__) +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#define __OBSOLETE_MATH_DEFAULT 0 +#ifdef __ARM_FP +# define _SUPPORTS_ERREXCEPT +#endif +/* As per ISO/IEC TS 18661 '__FLT_EVAL_METHOD__' will be defined to 16 + (if compiling with +fp16 support) so it can't be used by math.h to + define float_t and double_t. For values of '__FLT_EVAL_METHOD__' + other than 0, 1, 2 the definition of float_t and double_t is + implementation-defined. */ +#define __DOUBLE_TYPE double +#define __FLOAT_TYPE float +#endif + +#ifdef __epiphany__ +#define __IEEE_LITTLE_ENDIAN +#define Sudden_Underflow 1 +#endif + +#ifdef __hppa__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __nds32__ +#ifdef __big_endian__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __SPU__ +#define __IEEE_BIG_ENDIAN + +#define isfinite(__y) \ + (__extension__ ({int __cy; \ + (sizeof (__y) == sizeof (float)) ? (1) : \ + (__cy = fpclassify(__y)) != FP_INFINITE && __cy != FP_NAN;})) + +#define isinf(__x) ((sizeof (__x) == sizeof (float)) ? (0) : __isinfd(__x)) +#define isnan(__x) ((sizeof (__x) == sizeof (float)) ? (0) : __isnand(__x)) + +/* + * Macros for use in ieeefp.h. We can't just define the real ones here + * (like those above) as we have name space issues when this is *not* + * included via generic the ieeefp.h. + */ +#define __ieeefp_isnanf(x) 0 +#define __ieeefp_isinff(x) 0 +#define __ieeefp_finitef(x) 1 +#endif + +#ifdef __sparc__ +#ifdef __LITTLE_ENDIAN_DATA__ +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#endif + +#if defined(__m68k__) || defined(__mc68000__) +#define __IEEE_BIG_ENDIAN +#endif + +#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) +#define __IEEE_BIG_ENDIAN +#ifdef __HAVE_SHORT_DOUBLE__ +# define _DOUBLE_IS_32BITS +#endif +#endif + +#if defined (__H8300__) || defined (__H8300H__) || defined (__H8300S__) || defined (__H8500__) || defined (__H8300SX__) +#define __IEEE_BIG_ENDIAN +#define _FLOAT_ARG float +#define _DOUBLE_IS_32BITS +#endif + +#if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__) +#define __IEEE_LITTLE_ENDIAN +#define _FLOAT_ARG float +#define _DOUBLE_IS_32BITS +#endif + + +#ifdef __sh__ +#ifdef __LITTLE_ENDIAN__ +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#if defined(__SH2E__) || defined(__SH3E__) || defined(__SH4_SINGLE_ONLY__) || defined(__SH2A_SINGLE_ONLY__) +#define _DOUBLE_IS_32BITS +#endif +#endif + +#ifdef _AM29K +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef _WIN32 +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __i386__ +#define __IEEE_LITTLE_ENDIAN +# define _SUPPORTS_ERREXCEPT +#endif + +#ifdef __riscv +#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#ifdef __riscv_flen +# define _SUPPORTS_ERREXCEPT +#endif +#if __riscv_flen == 64 +# define __OBSOLETE_MATH_DEFAULT 0 +#else +# define __OBSOLETE_MATH_DEFAULT 1 +#endif +#endif + +#ifdef __i960__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __lm32__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __M32R__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __nvptx__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#if defined(_C4x) || defined(_C3x) +#define __IEEE_BIG_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __TMS320C6X__ +#ifdef _BIG_ENDIAN +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __TIC80__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __MIPSEL__ +#define __IEEE_LITTLE_ENDIAN +#endif +#ifdef __MIPSEB__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __MMIX__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __D30V__ +#define __IEEE_BIG_ENDIAN +#endif + +/* necv70 was __IEEE_LITTLE_ENDIAN. */ + +#ifdef __W65__ +#define __IEEE_LITTLE_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#if defined(__Z8001__) || defined(__Z8002__) +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __m88k__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __mn10300__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __mn10200__ +#define __IEEE_LITTLE_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __v800 +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __v850 +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __D10V__ +#define __IEEE_BIG_ENDIAN +#if __DOUBLE__ == 32 +#define _DOUBLE_IS_32BITS +#endif +#endif + +#ifdef __PPC__ +#if (defined(_BIG_ENDIAN) && _BIG_ENDIAN) || (defined(_AIX) && _AIX) +#define __IEEE_BIG_ENDIAN +#else +#if (defined(_LITTLE_ENDIAN) && _LITTLE_ENDIAN) || (defined(__sun__) && __sun__) || (defined(_WIN32) && _WIN32) +#define __IEEE_LITTLE_ENDIAN +#endif +#endif +#endif + +#ifdef __xstormy16__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __arc__ +#ifdef __big_endian__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __CRX__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __CSKY__ +#ifdef __CSKYBE__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __fr30__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __FT32__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __mcore__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __mt__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __frv__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __moxie__ +#ifdef __MOXIE_BIG_ENDIAN__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __ia64__ +#ifdef __BIG_ENDIAN__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __AVR__ +#define __IEEE_LITTLE_ENDIAN +#define _DOUBLE_IS_32BITS +#endif + +#if defined(__or1k__) || defined(__OR1K__) || defined(__OR1KND__) +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __IP2K__ +#define __IEEE_BIG_ENDIAN +#define __SMALL_BITFIELDS +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __iq2000__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __MAVERICK__ +#ifdef __ARMEL__ +# define __IEEE_LITTLE_ENDIAN +#else /* must be __ARMEB__ */ +# define __IEEE_BIG_ENDIAN +#endif /* __ARMEL__ */ +#endif /* __MAVERICK__ */ + +#ifdef __m32c__ +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS +#endif + +#ifdef __CRIS__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __BFIN__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __x86_64__ +#define __IEEE_LITTLE_ENDIAN +# define _SUPPORTS_ERREXCEPT +#endif + +#ifdef __mep__ +#ifdef __LITTLE_ENDIAN__ +#define __IEEE_LITTLE_ENDIAN +#else +#define __IEEE_BIG_ENDIAN +#endif +#endif + +#ifdef __MICROBLAZE__ +#ifndef __MICROBLAZEEL__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif +#endif + +#ifdef __MSP430__ +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS /* 16 Bit INT */ +#endif + +#ifdef __PRU__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __RL78__ +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS /* 16 Bit INT */ +#ifndef __RL78_64BIT_DOUBLES__ +#define _DOUBLE_IS_32BITS +#endif +#endif + +#ifdef __RX__ + +#ifdef __RX_BIG_ENDIAN__ +#define __IEEE_BIG_ENDIAN +#else +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifndef __RX_64BIT_DOUBLES__ +#define _DOUBLE_IS_32BITS +#endif + +#ifdef __RX_16BIT_INTS__ +#define __SMALL_BITFIELDS +#endif + +#endif + +#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) +#define __IEEE_LITTLE_ENDIAN +#define __SMALL_BITFIELDS /* 16 Bit INT */ +#endif + +#ifdef __NIOS2__ +# ifdef __nios2_big_endian__ +# define __IEEE_BIG_ENDIAN +# else +# define __IEEE_LITTLE_ENDIAN +# endif +#endif + +#ifdef __VISIUM__ +#define __IEEE_BIG_ENDIAN +#endif + +#ifdef __AMDGCN__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __XTENSA_EL__ +#define __IEEE_LITTLE_ENDIAN +#endif + +#ifdef __CYGWIN__ +#define __OBSOLETE_MATH_DEFAULT 0 +#endif + +#ifndef __OBSOLETE_MATH_DEFAULT +/* Use old math code by default. */ +#define __OBSOLETE_MATH_DEFAULT 1 +#endif +#ifndef __OBSOLETE_MATH +#define __OBSOLETE_MATH __OBSOLETE_MATH_DEFAULT +#endif + +#ifndef __IEEE_BIG_ENDIAN +#ifndef __IEEE_LITTLE_ENDIAN +#error Endianess not declared!! +#endif /* not __IEEE_LITTLE_ENDIAN */ +#endif /* not __IEEE_BIG_ENDIAN */ + +#endif /* not __IEEE_LITTLE_ENDIAN */ +#endif /* not __IEEE_BIG_ENDIAN */ + diff --git a/lib/include/machine/malloc.h b/lib/include/machine/malloc.h new file mode 100644 index 0000000..fdada9e --- /dev/null +++ b/lib/include/machine/malloc.h @@ -0,0 +1,8 @@ +#ifndef _MACHMALLOC_H_ +#define _MACHMALLOC_H_ + +/* place holder so platforms may add malloc.h extensions */ + +#endif /* _MACHMALLOC_H_ */ + + diff --git a/lib/include/machine/param.h b/lib/include/machine/param.h new file mode 100644 index 0000000..bdf8bf7 --- /dev/null +++ b/lib/include/machine/param.h @@ -0,0 +1 @@ +/* Place holder for machine-specific param.h. */ diff --git a/lib/include/machine/setjmp-dj.h b/lib/include/machine/setjmp-dj.h new file mode 100644 index 0000000..6ca5e65 --- /dev/null +++ b/lib/include/machine/setjmp-dj.h @@ -0,0 +1,43 @@ +/* + * Copyright (C) 1991 DJ Delorie + * All rights reserved. + * + * Redistribution, modification, and use in source and binary forms is permitted + * provided that the above copyright notice and following paragraph are + * duplicated in all such forms. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Modified to use SETJMP_DJ_H rather than SETJMP_H to avoid + conflicting with setjmp.h. Ian Taylor, Cygnus support, April, + 1993. */ + +#ifndef _SETJMP_DJ_H_ +#define _SETJMP_DJ_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + unsigned long eax; + unsigned long ebx; + unsigned long ecx; + unsigned long edx; + unsigned long esi; + unsigned long edi; + unsigned long ebp; + unsigned long esp; + unsigned long eip; +} jmp_buf[1]; + +extern int setjmp(jmp_buf); +extern void longjmp(jmp_buf, int); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/machine/setjmp.h b/lib/include/machine/setjmp.h new file mode 100644 index 0000000..29b76ce --- /dev/null +++ b/lib/include/machine/setjmp.h @@ -0,0 +1,495 @@ + +_BEGIN_STD_C + +#if defined(__or1k__) || defined(__or1knd__) +/* + * r1, r2, r9, r14, r16 .. r30, SR. + */ +#define _JBLEN 13 +#define _JBTYPE unsigned long +#endif + +#if defined(__arm__) || defined(__thumb__) +/* + * All callee preserved registers: + * core registers: + * r4 - r10, fp, sp, lr + * VFP registers (architectural support dependent): + * d8 - d15 + */ +#define _JBLEN 20 +#define _JBTYPE long long +#endif + +#if defined(__aarch64__) +#define _JBLEN 22 +#define _JBTYPE long long +#endif + +#if defined(__AVR__) +#define _JBLEN 24 +#endif + +#ifdef __sparc__ +/* + * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). + * All else recovered by under/over(flow) handling. + */ +#define _JBLEN 13 +#endif + +#ifdef __BFIN__ +#define _JBLEN 40 +#endif + +#ifdef __epiphany__ +/* All callee preserved registers: r4-r10,fp, sp, lr,r15, r32-r39 */ +#define _JBTYPE long long +#define _JBLEN 10 +#endif + +/* necv70 was 9 as well. */ + +#if defined(__m68k__) || defined(__mc68000__) +/* + * onsstack,sigmask,sp,pc,psl,d2-d7,a2-a6, + * fp2-fp7 for 68881. + * All else recovered by under/over(flow) handling. + */ +#define _JBLEN 34 +#endif + +#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) +/* + * D, X, Y are not saved. + * Only take into account the pseudo soft registers (max 32). + */ +#define _JBLEN 32 +#endif + +#ifdef __nds32__ +/* 17 words for GPRs, + 1 word for $fpcfg.freg and 30 words for FPUs + Reserved 2 words for aligement-adjustment. When storeing double-precision + floating-point register into memory, the address has to be + double-word-aligned. + Check libc/machine/nds32/setjmp.S for more information. */ +#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__ +#define _JBLEN 50 +#else +#define _JBLEN 18 +#endif +#endif + +#if defined(__Z8001__) || defined(__Z8002__) +/* 16 regs + pc */ +#define _JBLEN 20 +#endif + +#ifdef _AM29K +/* + * onsstack,sigmask,sp,pc,npc,psr,g1,o0,wbcnt (sigcontext). + * All else recovered by under/over(flow) handling. + */ +#define _JBLEN 9 +#endif + +#ifdef __i386__ +# if defined(__CYGWIN__) && !defined (_JBLEN) +# define _JBLEN (13 * 4) +# elif defined(__unix__) || defined(__rtems__) +# define _JBLEN 9 +# elif defined(__iamcu__) +/* Intel MCU jmp_buf only covers callee-saved registers. */ +# define _JBLEN 6 +# else +# include "setjmp-dj.h" +# endif +#endif + +#ifdef __x86_64__ +# ifdef __CYGWIN__ +# define _JBTYPE long +# define _JBLEN 32 +# else +# define _JBTYPE long long +# define _JBLEN 8 +# endif +#endif + +#ifdef __i960__ +#define _JBLEN 35 +#endif + +#ifdef __M32R__ +/* Only 8 words are currently needed. 10 gives us some slop if we need + to expand. */ +#define _JBLEN 10 +#endif + +#ifdef __mips__ +# if defined(__mips64) +# define _JBTYPE long long +# endif +# ifdef __mips_soft_float +# define _JBLEN 11 +# else +# define _JBLEN 23 +# endif +#endif + +#ifdef __m88000__ +#define _JBLEN 21 +#endif + +#ifdef __H8300__ +#define _JBLEN 5 +#define _JBTYPE int +#endif + +#ifdef __H8300H__ +/* same as H8/300 but registers are twice as big */ +#define _JBLEN 5 +#define _JBTYPE long +#endif + +#if defined (__H8300S__) || defined (__H8300SX__) +/* same as H8/300 but registers are twice as big */ +#define _JBLEN 5 +#define _JBTYPE long +#endif + +#ifdef __H8500__ +#define _JBLEN 4 +#endif + +#ifdef __sh__ +#if __SH5__ +#define _JBLEN 50 +#define _JBTYPE long long +#else +#define _JBLEN 20 +#endif /* __SH5__ */ +#endif + +#ifdef __v800 +#define _JBLEN 28 +#endif + +#ifdef __PPC__ +#ifdef __powerpc64__ +#ifdef __ALTIVEC__ +#define _JBLEN 70 +#else +#define _JBLEN 43 +#endif +#else +#ifdef __ALTIVEC__ +#define _JBLEN 64 +#else +#define _JBLEN 32 +#endif +#endif +#define _JBTYPE double +#endif + +#ifdef __MICROBLAZE__ +#define _JBLEN 20 +#define _JBTYPE unsigned int +#endif + +#ifdef __hppa__ +/* %r30, %r2-%r18, %r27, pad, %fr12-%fr15. + Note space exists for the FP registers, but they are not + saved. */ +#define _JBLEN 28 +#endif + +#if defined(__mn10300__) || defined(__mn10200__) +#ifdef __AM33_2__ +#define _JBLEN 26 +#else +/* A guess */ +#define _JBLEN 10 +#endif +#endif + +#ifdef __v850 +/* I think our setjmp is saving 15 regs at the moment. Gives us one word + slop if we need to expand. */ +#define _JBLEN 16 +#endif + +#if defined(_C4x) +#define _JBLEN 10 +#endif +#if defined(_C3x) +#define _JBLEN 9 +#endif + +#ifdef __TMS320C6X__ +#define _JBLEN 13 +#endif + +#ifdef __TIC80__ +#define _JBLEN 13 +#endif + +#ifdef __D10V__ +#define _JBLEN 8 +#endif + +#ifdef __D30V__ +#define _JBLEN ((64 /* GPR */ + (2*2) /* ACs */ + 18 /* CRs */) / 2) +#define _JBTYPE double +#endif + +#ifdef __frv__ +#define _JBLEN (68/2) /* room for 68 32-bit regs */ +#define _JBTYPE double +#endif + +#ifdef __moxie__ +#define _JBLEN 10 +#endif + +#ifdef __CRX__ +#define _JBLEN 9 +#endif + +#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) +/* r6, r7, r8, r9, r10, r11, r12 (r12L, r12H), + * r13 (r13L, r13H), ra(raL, raH), sp(spL, spH) */ +#define _JBLEN 14 +#define _JBTYPE unsigned short +#endif + +#ifdef __fr30__ +#define _JBLEN 10 +#endif + +#ifdef __FT32__ +#define _JBLEN 27 +#endif + +#ifdef __iq2000__ +#define _JBLEN 32 +#endif + +#ifdef __mcore__ +#define _JBLEN 16 +#endif + +#ifdef __arc__ +#define _JBLEN 25 /* r13-r30,blink,lp_count,lp_start,lp_end,mlo,mhi,status32 */ +#endif + +#ifdef __MMIX__ +/* Using a layout compatible with GCC's built-in. */ +#define _JBLEN 5 +#define _JBTYPE unsigned long +#endif + +#ifdef __mt__ +#define _JBLEN 16 +#endif + +#ifdef __SPU__ +#define _JBLEN 50 +#define _JBTYPE __vector signed int +#endif + +#ifdef __xstormy16__ +/* 4 GPRs plus SP plus PC. */ +#define _JBLEN 8 +#endif + +#ifdef __mep__ +/* 16 GPRs, pc, hi, lo */ +#define _JBLEN 19 +#endif + +#ifdef __CRIS__ +#define _JBLEN 18 +#endif + +#ifdef __ia64 +#define _JBLEN 64 +#endif + +#ifdef __lm32__ +#define _JBLEN 19 +#endif + +#ifdef __m32c__ +#if defined(__r8c_cpu__) || defined(__m16c_cpu__) +#define _JBLEN (22/2) +#else +#define _JBLEN (34/2) +#endif +#define _JBTYPE unsigned short +#endif /* __m32c__ */ + +#ifdef __MSP430__ +#define _JBLEN 9 + +#ifdef __MSP430X_LARGE__ +#define _JBTYPE unsigned long +#else +#define _JBTYPE unsigned short +#endif +#endif + +#ifdef __RL78__ +/* Three banks of registers, SP, CS, ES, PC */ +#define _JBLEN (8*3+8) +#define _JBTYPE unsigned char +#endif + +/* + * There are two versions of setjmp()/longjmp(): + * 1) Compiler (gcc) built-in versions. + * 2) Function-call versions. + * + * The built-in versions are used most of the time. When used, gcc replaces + * calls to setjmp()/longjmp() with inline assembly code. The built-in + * versions save/restore a variable number of registers. + + * _JBLEN is set to 40 to be ultra-safe with the built-in versions. + * It only needs to be 12 for the function-call versions + * but this data structure is used by both versions. + */ +#ifdef __NIOS2__ +#define _JBLEN 40 +#define _JBTYPE unsigned long +#endif + +#ifdef __PRU__ +#define _JBLEN 48 +#define _JBTYPE unsigned int +#endif + +#ifdef __RX__ +#define _JBLEN 0x44 +#endif + +#ifdef __VISIUM__ +/* All call-saved GP registers: r11-r19,r21,r22,r23. */ +#define _JBLEN 12 +#endif + +#ifdef __riscv +/* _JBTYPE using long long to make sure the alignment is align to 8 byte, + otherwise in rv32imafd, store/restore FPR may mis-align. */ +#define _JBTYPE long long +#ifdef __riscv_32e +#define _JBLEN ((4*sizeof(long))/sizeof(long)) +#else +#define _JBLEN ((14*sizeof(long) + 12*sizeof(double))/sizeof(long)) +#endif +#endif + +#ifdef __CSKYABIV2__ +#define _JBTYPE unsigned long +#if defined(__CK801__) +#define _JBLEN 7 +#elif defined(__CK802__) +#define _JBLEN 10 +#else +#define _JBLEN 18 +#endif +#endif + +#ifdef _JBLEN +#ifdef _JBTYPE +typedef _JBTYPE jmp_buf[_JBLEN]; +#else +typedef int jmp_buf[_JBLEN]; +#endif +#endif + +_END_STD_C + +#if (defined(__CYGWIN__) || defined(__rtems__)) && __POSIX_VISIBLE +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* POSIX sigsetjmp/siglongjmp macros */ +#ifdef _JBTYPE +typedef _JBTYPE sigjmp_buf[_JBLEN+1+((sizeof (_JBTYPE) + sizeof (sigset_t) - 1) + /sizeof (_JBTYPE))]; +#else +typedef int sigjmp_buf[_JBLEN+1+(sizeof (sigset_t)/sizeof (int))]; +#endif + +#define _SAVEMASK _JBLEN +#define _SIGMASK (_JBLEN+1) + +#ifdef __CYGWIN__ +# define _CYGWIN_WORKING_SIGSETJMP +#endif + +#ifdef _POSIX_THREADS +#define __SIGMASK_FUNC pthread_sigmask +#else +#define __SIGMASK_FUNC sigprocmask +#endif + +#ifdef __CYGWIN__ +/* Per POSIX, siglongjmp has to be implemented as function. Cygwin + provides functions for both, siglongjmp and sigsetjmp since 2.2.0. */ +extern void siglongjmp (sigjmp_buf, int) __attribute__ ((__noreturn__)); +extern int sigsetjmp (sigjmp_buf, int); +#endif + +#if defined(__GNUC__) + +#define sigsetjmp(env, savemask) \ + __extension__ \ + ({ \ + sigjmp_buf *_sjbuf = &(env); \ + ((*_sjbuf)[_SAVEMASK] = savemask,\ + __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *)((*_sjbuf) + _SIGMASK)),\ + setjmp (*_sjbuf)); \ + }) + +#define siglongjmp(env, val) \ + __extension__ \ + ({ \ + sigjmp_buf *_sjbuf = &(env); \ + ((((*_sjbuf)[_SAVEMASK]) ? \ + __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *)((*_sjbuf) + _SIGMASK), 0)\ + : 0), \ + longjmp (*_sjbuf, val)); \ + }) + +#else /* !__GNUC__ */ + +#define sigsetjmp(env, savemask) ((env)[_SAVEMASK] = savemask,\ + __SIGMASK_FUNC (SIG_SETMASK, 0, (sigset_t *) ((env) + _SIGMASK)),\ + setjmp (env)) + +#define siglongjmp(env, val) ((((env)[_SAVEMASK])?\ + __SIGMASK_FUNC (SIG_SETMASK, (sigset_t *) ((env) + _SIGMASK), 0):0),\ + longjmp (env, val)) + +#endif + +/* POSIX _setjmp/_longjmp, maintained for XSI compatibility. These + are equivalent to sigsetjmp/siglongjmp when not saving the signal mask. + New applications should use sigsetjmp/siglongjmp instead. */ +#ifdef __CYGWIN__ +extern void _longjmp (jmp_buf, int) __attribute__ ((__noreturn__)); +extern int _setjmp (jmp_buf); +#else +#define _setjmp(env) sigsetjmp ((env), 0) +#define _longjmp(env, val) siglongjmp ((env), (val)) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* (__CYGWIN__ or __rtems__) and __POSIX_VISIBLE */ diff --git a/lib/include/machine/stdlib.h b/lib/include/machine/stdlib.h new file mode 100644 index 0000000..fa3f3a1 --- /dev/null +++ b/lib/include/machine/stdlib.h @@ -0,0 +1,8 @@ +#ifndef _MACHSTDLIB_H_ +#define _MACHSTDLIB_H_ + +/* place holder so platforms may add stdlib.h extensions */ + +#endif /* _MACHSTDLIB_H_ */ + + diff --git a/lib/include/machine/termios.h b/lib/include/machine/termios.h new file mode 100644 index 0000000..41fd459 --- /dev/null +++ b/lib/include/machine/termios.h @@ -0,0 +1 @@ +#define __MAX_BAUD B4000000 diff --git a/lib/include/machine/time.h b/lib/include/machine/time.h new file mode 100644 index 0000000..c75edaf --- /dev/null +++ b/lib/include/machine/time.h @@ -0,0 +1,15 @@ +#ifndef _MACHTIME_H_ +#define _MACHTIME_H_ + +#if defined(__rtems__) || defined(__VISIUM__) || defined(__riscv) +#define _CLOCKS_PER_SEC_ 1000000 +#elif defined(__aarch64__) || defined(__arm__) || defined(__thumb__) +#define _CLOCKS_PER_SEC_ 100 +#endif + +#ifdef __SPU__ +#include +int nanosleep (const struct timespec *, struct timespec *); +#endif + +#endif /* _MACHTIME_H_ */ diff --git a/lib/include/machine/types.h b/lib/include/machine/types.h new file mode 100644 index 0000000..19d0e85 --- /dev/null +++ b/lib/include/machine/types.h @@ -0,0 +1,13 @@ +/* + * Newlib targets may provide an own version of this file in their machine + * directory to add custom user types for . + */ +#ifndef _SYS_TYPES_H +#error "must be included via " +#endif /* !_SYS_TYPES_H */ + +#if defined(__XMK__) && defined(___int64_t_defined) +typedef __uint64_t u_quad_t; +typedef __int64_t quad_t; +typedef quad_t * qaddr_t; +#endif diff --git a/lib/include/malloc.h b/lib/include/malloc.h new file mode 100644 index 0000000..a9dc5bc --- /dev/null +++ b/lib/include/malloc.h @@ -0,0 +1,173 @@ +/* malloc.h -- header file for memory routines. */ + +#ifndef _INCLUDE_MALLOC_H_ +#define _INCLUDE_MALLOC_H_ + +#include <_ansi.h> +#include + +#define __need_size_t +#include + +/* include any machine-specific extensions */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This version of struct mallinfo must match the one in + libc/stdlib/mallocr.c. */ + +struct mallinfo { + size_t arena; /* total space allocated from system */ + size_t ordblks; /* number of non-inuse chunks */ + size_t smblks; /* unused -- always zero */ + size_t hblks; /* number of mmapped regions */ + size_t hblkhd; /* total space in mmapped regions */ + size_t usmblks; /* unused -- always zero */ + size_t fsmblks; /* unused -- always zero */ + size_t uordblks; /* total allocated space */ + size_t fordblks; /* total non-inuse space */ + size_t keepcost; /* top-most, releasable (via malloc_trim) space */ +}; + +/* The routines. */ + +extern void *malloc (size_t); +#ifdef __CYGWIN__ +#undef _malloc_r +#define _malloc_r(r, s) malloc (s) +#else +extern void *_malloc_r (struct _reent *, size_t); +#endif + +extern void free (void *); +#ifdef __CYGWIN__ +#undef _free_r +#define _free_r(r, p) free (p) +#else +extern void _free_r (struct _reent *, void *); +#endif + +extern void *realloc (void *, size_t); +#ifdef __CYGWIN__ +#undef _realloc_r +#define _realloc_r(r, p, s) realloc (p, s) +#else +extern void *_realloc_r (struct _reent *, void *, size_t); +#endif + +extern void *calloc (size_t, size_t); +#ifdef __CYGWIN__ +#undef _calloc_r +#define _calloc_r(r, s1, s2) calloc (s1, s2); +#else +extern void *_calloc_r (struct _reent *, size_t, size_t); +#endif + +extern void *memalign (size_t, size_t); +#ifdef __CYGWIN__ +#undef _memalign_r +#define _memalign_r(r, s1, s2) memalign (s1, s2); +#else +extern void *_memalign_r (struct _reent *, size_t, size_t); +#endif + +extern struct mallinfo mallinfo (void); +#ifdef __CYGWIN__ +#undef _mallinfo_r +#define _mallinfo_r(r) mallinfo () +#else +extern struct mallinfo _mallinfo_r (struct _reent *); +#endif + +extern void malloc_stats (void); +#ifdef __CYGWIN__ +#undef _malloc_stats_r +#define _malloc_stats_r(r) malloc_stats () +#else +extern void _malloc_stats_r (struct _reent *); +#endif + +extern int mallopt (int, int); +#ifdef __CYGWIN__ +#undef _mallopt_r +#define _mallopt_r(i1, i2) mallopt (i1, i2) +#else +extern int _mallopt_r (struct _reent *, int, int); +#endif + +extern size_t malloc_usable_size (void *); +#ifdef __CYGWIN__ +#undef _malloc_usable_size_r +#define _malloc_usable_size_r(r, p) malloc_usable_size (p) +#else +extern size_t _malloc_usable_size_r (struct _reent *, void *); +#endif + +/* These aren't too useful on an embedded system, but we define them + anyhow. */ + +extern void *valloc (size_t); +#ifdef __CYGWIN__ +#undef _valloc_r +#define _valloc_r(r, s) valloc (s) +#else +extern void *_valloc_r (struct _reent *, size_t); +#endif + +extern void *pvalloc (size_t); +#ifdef __CYGWIN__ +#undef _pvalloc_r +#define _pvalloc_r(r, s) pvalloc (s) +#else +extern void *_pvalloc_r (struct _reent *, size_t); +#endif + +extern int malloc_trim (size_t); +#ifdef __CYGWIN__ +#undef _malloc_trim_r +#define _malloc_trim_r(r, s) malloc_trim (s) +#else +extern int _malloc_trim_r (struct _reent *, size_t); +#endif + +extern void __malloc_lock(struct _reent *); + +extern void __malloc_unlock(struct _reent *); + +/* A compatibility routine for an earlier version of the allocator. */ + +extern void mstats (char *); +#ifdef __CYGWIN__ +#undef _mstats_r +#define _mstats_r(r, p) mstats (p) +#else +extern void _mstats_r (struct _reent *, char *); +#endif + +/* SVID2/XPG mallopt options */ + +#define M_MXFAST 1 /* UNUSED in this malloc */ +#define M_NLBLKS 2 /* UNUSED in this malloc */ +#define M_GRAIN 3 /* UNUSED in this malloc */ +#define M_KEEP 4 /* UNUSED in this malloc */ + +/* mallopt options that actually do something */ + +#define M_TRIM_THRESHOLD -1 +#define M_TOP_PAD -2 +#define M_MMAP_THRESHOLD -3 +#define M_MMAP_MAX -4 + +#ifndef __CYGWIN__ +/* Some systems provide this, so do too for compatibility. */ +extern void cfree (void *); +#endif /* __CYGWIN__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _INCLUDE_MALLOC_H_ */ diff --git a/lib/include/math.h b/lib/include/math.h new file mode 100644 index 0000000..87f5133 --- /dev/null +++ b/lib/include/math.h @@ -0,0 +1,644 @@ +#ifndef _MATH_H_ + +#define _MATH_H_ + +#include +#include +#include +#include "_ansi.h" + +_BEGIN_STD_C + +/* Natural log of 2 */ +#define _M_LN2 0.693147180559945309417 + +#if __GNUC_PREREQ (3, 3) + /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values. */ + +# ifndef HUGE_VAL +# define HUGE_VAL (__builtin_huge_val()) +# endif + +# ifndef HUGE_VALF +# define HUGE_VALF (__builtin_huge_valf()) +# endif + +# ifndef HUGE_VALL +# define HUGE_VALL (__builtin_huge_vall()) +# endif + +# ifndef INFINITY +# define INFINITY (__builtin_inff()) +# endif + +# ifndef NAN +# define NAN (__builtin_nanf("")) +# endif + +#else /* !gcc >= 3.3 */ + + /* No builtins. Use fixed defines instead. (All 3 HUGE plus the INFINITY + * and NAN macros are required to be constant expressions. Using a variable-- + * even a static const--does not meet this requirement, as it cannot be + * evaluated at translation time.) + * The infinities are done using numbers that are far in excess of + * something that would be expected to be encountered in a floating-point + * implementation. (A more certain way uses values from float.h, but that is + * avoided because system includes are not supposed to include each other.) + * This method might produce warnings from some compilers. (It does in + * newer GCCs, but not for ones that would hit this #else.) If this happens, + * please report details to the Newlib mailing list. */ + + #ifndef HUGE_VAL + #define HUGE_VAL (1.0e999999999) + #endif + + #ifndef HUGE_VALF + #define HUGE_VALF (1.0e999999999F) + #endif + + #if !defined(HUGE_VALL) && defined(_HAVE_LONG_DOUBLE) + #define HUGE_VALL (1.0e999999999L) + #endif + + #if !defined(INFINITY) + #define INFINITY (HUGE_VALF) + #endif + + #if !defined(NAN) + #if defined(__GNUC__) && defined(__cplusplus) + /* Exception: older g++ versions warn about the divide by 0 used in the + * normal case (even though older gccs do not). This trick suppresses the + * warning, but causes errors for plain gcc, so is only used in the one + * special case. */ + static const union { __ULong __i[1]; float __d; } __Nanf = {0x7FC00000}; + #define NAN (__Nanf.__d) + #else + #define NAN (0.0F/0.0F) + #endif + #endif + +#endif /* !gcc >= 3.3 */ + +/* Reentrant ANSI C functions. */ + +#ifndef __math_68881 +extern double atan (double); +extern double cos (double); +extern double sin (double); +extern double tan (double); +extern double tanh (double); +extern double frexp (double, int *); +extern double modf (double, double *); +extern double ceil (double); +extern double fabs (double); +extern double floor (double); +#endif /* ! defined (__math_68881) */ + +/* Non reentrant ANSI C functions. */ + +#ifndef _REENT_ONLY +#ifndef __math_68881 +extern double acos (double); +extern double asin (double); +extern double atan2 (double, double); +extern double cosh (double); +extern double sinh (double); +extern double exp (double); +extern double ldexp (double, int); +extern double log (double); +extern double log10 (double); +extern double pow (double, double); +extern double sqrt (double); +extern double fmod (double, double); +#endif /* ! defined (__math_68881) */ +#endif /* ! defined (_REENT_ONLY) */ + +#if __MISC_VISIBLE +extern int finite (double); +extern int finitef (float); +extern int finitel (long double); +extern int isinff (float); +extern int isnanf (float); +#ifdef __CYGWIN__ /* not implemented in newlib yet */ +extern int isinfl (long double); +extern int isnanl (long double); +#endif +#if !defined(__cplusplus) || __cplusplus < 201103L +extern int isinf (double); +#endif +#endif /* __MISC_VISIBLE */ +#if (__MISC_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 600)) \ + && (!defined(__cplusplus) || __cplusplus < 201103L) +extern int isnan (double); +#endif + +#if __ISO_C_VISIBLE >= 1999 +/* ISO C99 types and macros. */ + +/* FIXME: FLT_EVAL_METHOD should somehow be gotten from float.h (which is hard, + * considering that the standard says the includes it defines should not + * include other includes that it defines) and that value used. (This can be + * solved, but autoconf has a bug which makes the solution more difficult, so + * it has been skipped for now.) */ +#if !defined(FLT_EVAL_METHOD) && defined(__FLT_EVAL_METHOD__) + #define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ + #define __TMP_FLT_EVAL_METHOD +#endif /* FLT_EVAL_METHOD */ +#if defined FLT_EVAL_METHOD +/* FLT_EVAL_METHOD == 16 has meaning as defined in ISO/IEC TS 18661-3, + * which provides non-compliant extensions to C and POSIX (by adding + * additional positive values for FLT_EVAL_METHOD). It effectively has + * same meaning as the C99 and C11 definitions for value 0, while also + * serving as a flag that the _Float16 (float16_t) type exists. + * + * FLT_EVAL_METHOD could be any number of bits of supported floating point + * format (e.g. 32, 64, 128), but currently only AArch64 and few other targets + * might define that as 16. */ + #if (FLT_EVAL_METHOD == 0) \ + || (FLT_EVAL_METHOD == 16) + typedef float float_t; + typedef double double_t; + #elif FLT_EVAL_METHOD == 1 + typedef double float_t; + typedef double double_t; + #elif FLT_EVAL_METHOD == 2 + typedef long double float_t; + typedef long double double_t; + #else + /* Implementation-defined. Assume float_t and double_t have been + * defined previously for this configuration (e.g. config.h). */ + + /* If __DOUBLE_TYPE is defined (__FLOAT_TYPE is then supposed to be + defined as well) float_t and double_t definition is suggested by + an arch specific header. */ + #ifdef __DOUBLE_TYPE + typedef __DOUBLE_TYPE double_t; + typedef __FLOAT_TYPE float_t; + #endif + /* Assume config.h has provided these types. */ + #endif +#else + /* Assume basic definitions. */ + typedef float float_t; + typedef double double_t; +#endif +#if defined(__TMP_FLT_EVAL_METHOD) + #undef FLT_EVAL_METHOD +#endif + +#define FP_NAN 0 +#define FP_INFINITE 1 +#define FP_ZERO 2 +#define FP_SUBNORMAL 3 +#define FP_NORMAL 4 + +#ifndef FP_ILOGB0 +# define FP_ILOGB0 (-__INT_MAX__) +#endif +#ifndef FP_ILOGBNAN +# define FP_ILOGBNAN __INT_MAX__ +#endif + +#ifndef MATH_ERRNO +# define MATH_ERRNO 1 +#endif +#ifndef MATH_ERREXCEPT +# define MATH_ERREXCEPT 2 +#endif +#ifndef math_errhandling +# ifdef _IEEE_LIBM +# define _MATH_ERRHANDLING_ERRNO 0 +# else +# define _MATH_ERRHANDLING_ERRNO MATH_ERRNO +# endif +# ifdef _SUPPORTS_ERREXCEPT +# define _MATH_ERRHANDLING_ERREXCEPT MATH_ERREXCEPT +# else +# define _MATH_ERRHANDLING_ERREXCEPT 0 +# endif +# define math_errhandling (_MATH_ERRHANDLING_ERRNO | _MATH_ERRHANDLING_ERREXCEPT) +#endif + +extern int __isinff (float); +extern int __isinfd (double); +extern int __isnanf (float); +extern int __isnand (double); +extern int __fpclassifyf (float); +extern int __fpclassifyd (double); +extern int __signbitf (float); +extern int __signbitd (double); + +/* Note: isinf and isnan were once functions in newlib that took double + * arguments. C99 specifies that these names are reserved for macros + * supporting multiple floating point types. Thus, they are + * now defined as macros. Implementations of the old functions + * taking double arguments still exist for compatibility purposes + * (prototypes for them are earlier in this header). */ + +#if __GNUC_PREREQ (4, 4) + #define fpclassify(__x) (__builtin_fpclassify (FP_NAN, FP_INFINITE, \ + FP_NORMAL, FP_SUBNORMAL, \ + FP_ZERO, __x)) + #ifndef isfinite + #define isfinite(__x) (__builtin_isfinite (__x)) + #endif + #ifndef isinf + #define isinf(__x) (__builtin_isinf_sign (__x)) + #endif + #ifndef isnan + #define isnan(__x) (__builtin_isnan (__x)) + #endif + #define isnormal(__x) (__builtin_isnormal (__x)) +#else + #define fpclassify(__x) \ + ((sizeof(__x) == sizeof(float)) ? __fpclassifyf(__x) : \ + __fpclassifyd(__x)) + #ifndef isfinite + #define isfinite(__y) \ + (__extension__ ({int __cy = fpclassify(__y); \ + __cy != FP_INFINITE && __cy != FP_NAN;})) + #endif + #ifndef isinf + #define isinf(__x) (fpclassify(__x) == FP_INFINITE) + #endif + #ifndef isnan + #define isnan(__x) (fpclassify(__x) == FP_NAN) + #endif + #define isnormal(__x) (fpclassify(__x) == FP_NORMAL) +#endif + +#if __GNUC_PREREQ (4, 0) + #if defined(_HAVE_LONG_DOUBLE) + #define signbit(__x) \ + ((sizeof(__x) == sizeof(float)) ? __builtin_signbitf(__x) : \ + (sizeof(__x) == sizeof(double)) ? __builtin_signbit (__x) : \ + __builtin_signbitl(__x)) + #else + #define signbit(__x) \ + ((sizeof(__x) == sizeof(float)) ? __builtin_signbitf(__x) : \ + __builtin_signbit (__x)) + #endif +#else + #define signbit(__x) \ + ((sizeof(__x) == sizeof(float)) ? __signbitf(__x) : \ + __signbitd(__x)) +#endif + +#if __GNUC_PREREQ (2, 97) +#define isgreater(__x,__y) (__builtin_isgreater (__x, __y)) +#define isgreaterequal(__x,__y) (__builtin_isgreaterequal (__x, __y)) +#define isless(__x,__y) (__builtin_isless (__x, __y)) +#define islessequal(__x,__y) (__builtin_islessequal (__x, __y)) +#define islessgreater(__x,__y) (__builtin_islessgreater (__x, __y)) +#define isunordered(__x,__y) (__builtin_isunordered (__x, __y)) +#else +#define isgreater(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x > __y);})) +#define isgreaterequal(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x >= __y);})) +#define isless(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x < __y);})) +#define islessequal(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x <= __y);})) +#define islessgreater(x,y) \ + (__extension__ ({__typeof__(x) __x = (x); __typeof__(y) __y = (y); \ + !isunordered(__x,__y) && (__x < __y || __x > __y);})) + +#define isunordered(a,b) \ + (__extension__ ({__typeof__(a) __a = (a); __typeof__(b) __b = (b); \ + fpclassify(__a) == FP_NAN || fpclassify(__b) == FP_NAN;})) +#endif + +/* Non ANSI double precision functions. */ + +extern double infinity (void); +extern double nan (const char *); +extern double copysign (double, double); +extern double logb (double); +extern int ilogb (double); + +extern double asinh (double); +extern double cbrt (double); +extern double nextafter (double, double); +extern double rint (double); +extern double scalbn (double, int); + +extern double exp2 (double); +extern double scalbln (double, long int); +extern double tgamma (double); +extern double nearbyint (double); +extern long int lrint (double); +extern long long int llrint (double); +extern double round (double); +extern long int lround (double); +extern long long int llround (double); +extern double trunc (double); +extern double remquo (double, double, int *); +extern double fdim (double, double); +extern double fmax (double, double); +extern double fmin (double, double); +extern double fma (double, double, double); + +#ifndef __math_68881 +extern double log1p (double); +extern double expm1 (double); +#endif /* ! defined (__math_68881) */ + +#ifndef _REENT_ONLY +extern double acosh (double); +extern double atanh (double); +extern double remainder (double, double); +extern double gamma (double); +extern double lgamma (double); +extern double erf (double); +extern double erfc (double); +extern double log2 (double); +#if !defined(__cplusplus) +#define log2(x) (log (x) / _M_LN2) +#endif + +#ifndef __math_68881 +extern double hypot (double, double); +#endif + +#endif /* ! defined (_REENT_ONLY) */ + +/* Single precision versions of ANSI functions. */ + +extern float atanf (float); +extern float cosf (float); +extern float sinf (float); +extern float tanf (float); +extern float tanhf (float); +extern float frexpf (float, int *); +extern float modff (float, float *); +extern float ceilf (float); +extern float fabsf (float); +extern float floorf (float); + +#ifndef _REENT_ONLY +extern float acosf (float); +extern float asinf (float); +extern float atan2f (float, float); +extern float coshf (float); +extern float sinhf (float); +extern float expf (float); +extern float ldexpf (float, int); +extern float logf (float); +extern float log10f (float); +extern float powf (float, float); +extern float sqrtf (float); +extern float fmodf (float, float); +#endif /* ! defined (_REENT_ONLY) */ + +/* Other single precision functions. */ + +extern float exp2f (float); +extern float scalblnf (float, long int); +extern float tgammaf (float); +extern float nearbyintf (float); +extern long int lrintf (float); +extern long long int llrintf (float); +extern float roundf (float); +extern long int lroundf (float); +extern long long int llroundf (float); +extern float truncf (float); +extern float remquof (float, float, int *); +extern float fdimf (float, float); +extern float fmaxf (float, float); +extern float fminf (float, float); +extern float fmaf (float, float, float); + +extern float infinityf (void); +extern float nanf (const char *); +extern float copysignf (float, float); +extern float logbf (float); +extern int ilogbf (float); + +extern float asinhf (float); +extern float cbrtf (float); +extern float nextafterf (float, float); +extern float rintf (float); +extern float scalbnf (float, int); +extern float log1pf (float); +extern float expm1f (float); + +#ifndef _REENT_ONLY +extern float acoshf (float); +extern float atanhf (float); +extern float remainderf (float, float); +extern float gammaf (float); +extern float lgammaf (float); +extern float erff (float); +extern float erfcf (float); +extern float log2f (float); +extern float hypotf (float, float); +#endif /* ! defined (_REENT_ONLY) */ + +/* Newlib doesn't fully support long double math functions so far. + On platforms where long double equals double the long double functions + simply call the double functions. On Cygwin the long double functions + are implemented independently from newlib to be able to use optimized + assembler functions despite using the Microsoft x86_64 ABI. */ +#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) || \ + defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) +/* Reentrant ANSI C functions. */ +#ifndef __math_68881 +extern long double atanl (long double); +extern long double cosl (long double); +extern long double sinl (long double); +extern long double tanl (long double); +extern long double tanhl (long double); +extern long double frexpl (long double, int *); +extern long double modfl (long double, long double *); +extern long double ceill (long double); +extern long double fabsl (long double); +extern long double floorl (long double); +extern long double log1pl (long double); +extern long double expm1l (long double); +#endif /* ! defined (__math_68881) */ +/* Non reentrant ANSI C functions. */ +#ifndef _REENT_ONLY +#ifndef __math_68881 +extern long double acosl (long double); +extern long double asinl (long double); +extern long double atan2l (long double, long double); +extern long double coshl (long double); +extern long double sinhl (long double); +extern long double expl (long double); +extern long double ldexpl (long double, int); +extern long double logl (long double); +extern long double log10l (long double); +extern long double powl (long double, long double); +extern long double sqrtl (long double); +extern long double fmodl (long double, long double); +extern long double hypotl (long double, long double); +#endif /* ! defined (__math_68881) */ +#endif /* ! defined (_REENT_ONLY) */ +extern long double copysignl (long double, long double); +extern long double nanl (const char *); +extern int ilogbl (long double); +extern long double asinhl (long double); +extern long double cbrtl (long double); +extern long double nextafterl (long double, long double); +extern float nexttowardf (float, long double); +extern double nexttoward (double, long double); +extern long double nexttowardl (long double, long double); +extern long double logbl (long double); +extern long double log2l (long double); +extern long double rintl (long double); +extern long double scalbnl (long double, int); +extern long double exp2l (long double); +extern long double scalblnl (long double, long); +extern long double tgammal (long double); +extern long double nearbyintl (long double); +extern long int lrintl (long double); +extern long long int llrintl (long double); +extern long double roundl (long double); +extern long lroundl (long double); +extern long long int llroundl (long double); +extern long double truncl (long double); +extern long double remquol (long double, long double, int *); +extern long double fdiml (long double, long double); +extern long double fmaxl (long double, long double); +extern long double fminl (long double, long double); +extern long double fmal (long double, long double, long double); +#ifndef _REENT_ONLY +extern long double acoshl (long double); +extern long double atanhl (long double); +extern long double remainderl (long double, long double); +extern long double lgammal (long double); +extern long double erfl (long double); +extern long double erfcl (long double); +#endif /* ! defined (_REENT_ONLY) */ +#else /* !_LDBL_EQ_DBL && !__CYGWIN__ */ +extern long double hypotl (long double, long double); +extern long double sqrtl (long double); +extern long double frexpl (long double, int *); +#ifdef __i386__ +/* Other long double precision functions. */ +extern _LONG_DOUBLE rintl (_LONG_DOUBLE); +extern long int lrintl (_LONG_DOUBLE); +extern long long int llrintl (_LONG_DOUBLE); +#endif /* __i386__ */ +#endif /* !_LDBL_EQ_DBL && !__CYGWIN__ */ + +#endif /* __ISO_C_VISIBLE >= 1999 */ + +#if __MISC_VISIBLE +extern double drem (double, double); +extern float dremf (float, float); +#ifdef __CYGWIN__ +extern float dreml (long double, long double); +#endif /* __CYGWIN__ */ +extern double gamma_r (double, int *); +extern double lgamma_r (double, int *); +extern float gammaf_r (float, int *); +extern float lgammaf_r (float, int *); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE +extern double y0 (double); +extern double y1 (double); +extern double yn (int, double); +extern double j0 (double); +extern double j1 (double); +extern double jn (int, double); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE >= 600 +extern float y0f (float); +extern float y1f (float); +extern float ynf (int, float); +extern float j0f (float); +extern float j1f (float); +extern float jnf (int, float); +#endif + +/* GNU extensions */ +#if __GNU_VISIBLE +extern void sincos (double, double *, double *); +extern void sincosf (float, float *, float *); +#ifdef __CYGWIN__ +extern void sincosl (long double, long double *, long double *); +#endif /* __CYGWIN__ */ +# ifndef exp10 +extern double exp10 (double); +# endif +# ifndef pow10 +extern double pow10 (double); +# endif +# ifndef exp10f +extern float exp10f (float); +# endif +# ifndef pow10f +extern float pow10f (float); +# endif +#ifdef __CYGWIN__ +# ifndef exp10l +extern float exp10l (float); +# endif +# ifndef pow10l +extern float pow10l (float); +# endif +#endif /* __CYGWIN__ */ +#endif /* __GNU_VISIBLE */ + +#if __MISC_VISIBLE || __XSI_VISIBLE +/* The gamma functions use a global variable, signgam. */ +#ifndef _REENT_ONLY +#define signgam (*__signgam()) +extern int *__signgam (void); +#endif /* ! defined (_REENT_ONLY) */ + +#define __signgam_r(ptr) _REENT_SIGNGAM(ptr) +#endif /* __MISC_VISIBLE || __XSI_VISIBLE */ + +/* Useful constants. */ + +#if __BSD_VISIBLE || __XSI_VISIBLE + +#define MAXFLOAT 3.40282347e+38F + +#define M_E 2.7182818284590452354 +#define M_LOG2E 1.4426950408889634074 +#define M_LOG10E 0.43429448190325182765 +#define M_LN2 _M_LN2 +#define M_LN10 2.30258509299404568402 +#define M_PI 3.14159265358979323846 +#define M_PI_2 1.57079632679489661923 +#define M_PI_4 0.78539816339744830962 +#define M_1_PI 0.31830988618379067154 +#define M_2_PI 0.63661977236758134308 +#define M_2_SQRTPI 1.12837916709551257390 +#define M_SQRT2 1.41421356237309504880 +#define M_SQRT1_2 0.70710678118654752440 + +#endif + +#if __BSD_VISIBLE + +#define M_TWOPI (M_PI * 2.0) +#define M_3PI_4 2.3561944901923448370E0 +#define M_SQRTPI 1.77245385090551602792981 +#define M_LN2LO 1.9082149292705877000E-10 +#define M_LN2HI 6.9314718036912381649E-1 +#define M_SQRT3 1.73205080756887719000 +#define M_IVLN10 0.43429448190325182765 /* 1 / log(10) */ +#define M_LOG2_E _M_LN2 +#define M_INVLN2 1.4426950408889633870E0 /* 1 / log(2) */ + +#endif /* __BSD_VISIBLE */ + +_END_STD_C + +#ifdef __FAST_MATH__ +#include +#endif + +#endif /* _MATH_H_ */ diff --git a/lib/include/memory.h b/lib/include/memory.h new file mode 100644 index 0000000..f4a14fc --- /dev/null +++ b/lib/include/memory.h @@ -0,0 +1,4 @@ +#ifndef _MEMORY_H +#define _MEMORY_H +#include +#endif /* !_MEMORY_H */ diff --git a/lib/include/ndbm.h b/lib/include/ndbm.h new file mode 100644 index 0000000..1e5072c --- /dev/null +++ b/lib/include/ndbm.h @@ -0,0 +1,91 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ndbm.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD$ : src/include/ndbm.h + * Nov 20 19:45:28 2017 UTC by pfg + * SVN Revision 326024 + */ + +#ifndef _NDBM_H_ +#define _NDBM_H_ + +#include /* For mode_t. */ +/* #include */ + +/* + * The above header-file is directly included in `newlib/libc/search/ndbm.c` + * as `db.h` is present in form of `db_local.h`, inside `newlib/libc/search` + * directory and not in `newlib/libc/include`. + * Necessary data-types are mentioned in form of forward-declarations + */ + +/* Map dbm interface onto db(3). */ +#define DBM_RDONLY O_RDONLY + +/* Flags to dbm_store(). */ +#define DBM_INSERT 0 +#define DBM_REPLACE 1 + +/* + * The db(3) support for ndbm always appends this suffix to the + * file name to avoid overwriting the user's original database. + */ +#define DBM_SUFFIX ".db" + +typedef struct { + void *dptr; + int dsize; /* XXX Should be size_t according to 1003.1-2008. */ +} datum; + +struct __db; /* Forward-declaration */ +typedef struct __db DB; /* Forward-declaration */ +typedef DB DBM; +#define dbm_pagfno(a) DBM_PAGFNO_NOT_AVAILABLE + +__BEGIN_DECLS +int dbm_clearerr(DBM *); +void dbm_close(DBM *); +int dbm_delete(DBM *, datum); +int dbm_error(DBM *); +datum dbm_fetch(DBM *, datum); +datum dbm_firstkey(DBM *); +datum dbm_nextkey(DBM *); +DBM *dbm_open(const char *, int, mode_t); +int dbm_store(DBM *, datum, datum, int); +#if __BSD_VISIBLE +int dbm_dirfno(DBM *); +#endif +__END_DECLS + +#endif /* !_NDBM_H_ */ diff --git a/lib/include/newlib.h b/lib/include/newlib.h new file mode 100644 index 0000000..d4fffb1 --- /dev/null +++ b/lib/include/newlib.h @@ -0,0 +1,2 @@ +/* dummy file for external tools to use. Real file is created by + newlib configuration. */ diff --git a/lib/include/paths.h b/lib/include/paths.h new file mode 100644 index 0000000..b1c70f5 --- /dev/null +++ b/lib/include/paths.h @@ -0,0 +1,9 @@ +#ifndef _PATHS_H_ +#define _PATHS_H_ + +#define _PATH_DEV "/dev/" +#define _PATH_DEVNULL "/dev/null" +#define _PATH_DEVZERO "/dev/zero" +#define _PATH_BSHELL "/bin/sh" + +#endif /* _PATHS_H_ */ diff --git a/lib/include/pthread.h b/lib/include/pthread.h new file mode 100644 index 0000000..c99ad39 --- /dev/null +++ b/lib/include/pthread.h @@ -0,0 +1,456 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2013, 2015. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + */ + +#ifndef __PTHREAD_h +#define __PTHREAD_h + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#if defined(_POSIX_THREADS) + +#include +#include +#include +#include + +struct _pthread_cleanup_context { + void (*_routine)(void *); + void *_arg; + int _canceltype; + struct _pthread_cleanup_context *_previous; +}; + +/* Register Fork Handlers */ +int pthread_atfork (void (*prepare)(void), void (*parent)(void), + void (*child)(void)); + +/* Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81 */ + +int pthread_mutexattr_init (pthread_mutexattr_t *__attr); +int pthread_mutexattr_destroy (pthread_mutexattr_t *__attr); +int pthread_mutexattr_getpshared (const pthread_mutexattr_t *__attr, + int *__pshared); +int pthread_mutexattr_setpshared (pthread_mutexattr_t *__attr, + int __pshared); + +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + +/* Single UNIX Specification 2 Mutex Attributes types */ + +int pthread_mutexattr_gettype (const pthread_mutexattr_t *__attr, int *__kind); +int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind); + +#endif + +/* Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87 */ + +int pthread_mutex_init (pthread_mutex_t *__mutex, + const pthread_mutexattr_t *__attr); +int pthread_mutex_destroy (pthread_mutex_t *__mutex); + +/* This is used to statically initialize a pthread_mutex_t. Example: + + pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + */ + +#define PTHREAD_MUTEX_INITIALIZER _PTHREAD_MUTEX_INITIALIZER + +/* Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93 + NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29 */ + +int pthread_mutex_lock (pthread_mutex_t *__mutex); +int pthread_mutex_trylock (pthread_mutex_t *__mutex); +int pthread_mutex_unlock (pthread_mutex_t *__mutex); + +#if defined(_POSIX_TIMEOUTS) + +int pthread_mutex_timedlock (pthread_mutex_t *__mutex, + const struct timespec *__timeout); + +#endif /* _POSIX_TIMEOUTS */ + +#if __GNU_VISIBLE +/* The Issue 8 standard adds pthread_mutex_clocklock() */ +int pthread_mutex_clocklock(pthread_mutex_t *__restrict, clockid_t, + const struct timespec *__restrict); +#endif /* __GNU_VISIBLE */ + +/* Condition Variable Initialization Attributes, P1003.1c/Draft 10, p. 96 */ + +int pthread_condattr_init (pthread_condattr_t *__attr); +int pthread_condattr_destroy (pthread_condattr_t *__attr); + +int pthread_condattr_getclock (const pthread_condattr_t *__restrict __attr, + clockid_t *__restrict __clock_id); +int pthread_condattr_setclock (pthread_condattr_t *__attr, + clockid_t __clock_id); + +int pthread_condattr_getpshared (const pthread_condattr_t *__attr, + int *__pshared); +int pthread_condattr_setpshared (pthread_condattr_t *__attr, int __pshared); + +/* Initializing and Destroying a Condition Variable, P1003.1c/Draft 10, p. 87 */ + +int pthread_cond_init (pthread_cond_t *__cond, + const pthread_condattr_t *__attr); +int pthread_cond_destroy (pthread_cond_t *__mutex); + +/* This is used to statically initialize a pthread_cond_t. Example: + + pthread_cond_t cond = PTHREAD_COND_INITIALIZER; + */ + +#define PTHREAD_COND_INITIALIZER _PTHREAD_COND_INITIALIZER + +/* Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101 */ + +int pthread_cond_signal (pthread_cond_t *__cond); +int pthread_cond_broadcast (pthread_cond_t *__cond); + +/* Waiting on a Condition, P1003.1c/Draft 10, p. 105 */ + +int pthread_cond_wait (pthread_cond_t *__cond, pthread_mutex_t *__mutex); + +int pthread_cond_timedwait (pthread_cond_t *__cond, + pthread_mutex_t *__mutex, + const struct timespec *__abstime); + +#if __GNU_VISIBLE +/* The Issue 8 standard adds pthread_cond_clockwait() */ +int pthread_cond_clockwait(pthread_cond_t *__restrict, + pthread_mutex_t *__restrict, clockid_t, + const struct timespec *__restrict); +#endif /* __GNU_VISIBLE */ + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) + +/* Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120 */ + +int pthread_attr_setscope (pthread_attr_t *__attr, int __contentionscope); +int pthread_attr_getscope (const pthread_attr_t *__attr, + int *__contentionscope); +int pthread_attr_setinheritsched (pthread_attr_t *__attr, + int __inheritsched); +int pthread_attr_getinheritsched (const pthread_attr_t *__attr, + int *__inheritsched); +int pthread_attr_setschedpolicy (pthread_attr_t *__attr, int __policy); +int pthread_attr_getschedpolicy (const pthread_attr_t *__attr, + int *__policy); + +#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */ + +int pthread_attr_setschedparam (pthread_attr_t *__attr, + const struct sched_param *__param); +int pthread_attr_getschedparam (const pthread_attr_t *__attr, + struct sched_param *__param); + +#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING) + +/* Dynamic Thread Scheduling Parameters Access, P1003.1c/Draft 10, p. 124 */ + +int pthread_getschedparam (pthread_t __pthread, int *__policy, + struct sched_param *__param); +int pthread_setschedparam (pthread_t __pthread, int __policy, + const struct sched_param *__param); + +/* Set Scheduling Priority of a Thread */ +int pthread_setschedprio (pthread_t thread, int prio); + +#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */ + +#if __GNU_VISIBLE +int pthread_getname_np(pthread_t, char *, size_t) __nonnull((2)); + +int pthread_setname_np(pthread_t, const char *) __nonnull((2)); +#endif + +#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT) + +/* Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128 */ + +int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr, + int __protocol); +int pthread_mutexattr_getprotocol (const pthread_mutexattr_t *__attr, + int *__protocol); +int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr, + int __prioceiling); +int pthread_mutexattr_getprioceiling (const pthread_mutexattr_t *__attr, + int *__prioceiling); + +#endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */ + +#if defined(_POSIX_THREAD_PRIO_PROTECT) + +/* Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131 */ + +int pthread_mutex_setprioceiling (pthread_mutex_t *__mutex, + int __prioceiling, int *__old_ceiling); +int pthread_mutex_getprioceiling (const pthread_mutex_t *__restrict __mutex, + int *__prioceiling); + +#endif /* _POSIX_THREAD_PRIO_PROTECT */ + +/* Thread Creation Attributes, P1003.1c/Draft 10, p, 140 */ + +int pthread_attr_init (pthread_attr_t *__attr); +int pthread_attr_destroy (pthread_attr_t *__attr); +int pthread_attr_setstack (pthread_attr_t *attr, + void *__stackaddr, size_t __stacksize); +int pthread_attr_getstack (const pthread_attr_t *attr, + void **__stackaddr, size_t *__stacksize); +int pthread_attr_getstacksize (const pthread_attr_t *__attr, + size_t *__stacksize); +int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize); +int pthread_attr_getstackaddr (const pthread_attr_t *__attr, + void **__stackaddr); +int pthread_attr_setstackaddr (pthread_attr_t *__attr, void *__stackaddr); +int pthread_attr_getdetachstate (const pthread_attr_t *__attr, + int *__detachstate); +int pthread_attr_setdetachstate (pthread_attr_t *__attr, int __detachstate); +int pthread_attr_getguardsize (const pthread_attr_t *__attr, + size_t *__guardsize); +int pthread_attr_setguardsize (pthread_attr_t *__attr, size_t __guardsize); + +/* POSIX thread APIs beyond the POSIX standard but provided + * in GNU/Linux. They may be provided by other OSes for + * compatibility. + */ +#if __GNU_VISIBLE +#if defined(__rtems__) +int pthread_attr_setaffinity_np (pthread_attr_t *__attr, + size_t __cpusetsize, + const cpu_set_t *__cpuset); +int pthread_attr_getaffinity_np (const pthread_attr_t *__attr, + size_t __cpusetsize, cpu_set_t *__cpuset); + +int pthread_setaffinity_np (pthread_t __id, size_t __cpusetsize, + const cpu_set_t *__cpuset); +int pthread_getaffinity_np (const pthread_t __id, size_t __cpusetsize, + cpu_set_t *__cpuset); + +int pthread_getattr_np (pthread_t __id, pthread_attr_t *__attr); +#endif /* defined(__rtems__) */ +#endif /* __GNU_VISIBLE */ + +/* Thread Creation, P1003.1c/Draft 10, p. 144 */ + +int pthread_create (pthread_t *__pthread, const pthread_attr_t *__attr, + void *(*__start_routine)(void *), void *__arg); + +/* Wait for Thread Termination, P1003.1c/Draft 10, p. 147 */ + +int pthread_join (pthread_t __pthread, void **__value_ptr); + +/* Detaching a Thread, P1003.1c/Draft 10, p. 149 */ + +int pthread_detach (pthread_t __pthread); + +/* Thread Termination, p1003.1c/Draft 10, p. 150 */ + +void pthread_exit (void *__value_ptr) __dead2; + +/* Get Calling Thread's ID, p1003.1c/Draft 10, p. XXX */ + +pthread_t pthread_self (void); + +/* Compare Thread IDs, p1003.1c/Draft 10, p. 153 */ + +int pthread_equal (pthread_t __t1, pthread_t __t2); + +/* Retrieve ID of a Thread's CPU Time Clock */ +int pthread_getcpuclockid (pthread_t thread, clockid_t *clock_id); + +/* Get/Set Current Thread's Concurrency Level */ +int pthread_setconcurrency (int new_level); +int pthread_getconcurrency (void); + +#if __BSD_VISIBLE || __GNU_VISIBLE +void pthread_yield (void); +#endif + +/* Dynamic Package Initialization */ + +/* This is used to statically initialize a pthread_once_t. Example: + + pthread_once_t once = PTHREAD_ONCE_INIT; + + NOTE: This is named inconsistently -- it should be INITIALIZER. */ + +#define PTHREAD_ONCE_INIT _PTHREAD_ONCE_INIT + +int pthread_once (pthread_once_t *__once_control, + void (*__init_routine)(void)); + +/* Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163 */ + +int pthread_key_create (pthread_key_t *__key, + void (*__destructor)(void *)); + +/* Thread-Specific Data Management, P1003.1c/Draft 10, p. 165 */ + +int pthread_setspecific (pthread_key_t __key, const void *__value); +void * pthread_getspecific (pthread_key_t __key); + +/* Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167 */ + +int pthread_key_delete (pthread_key_t __key); + +/* Execution of a Thread, P1003.1c/Draft 10, p. 181 */ + +#define PTHREAD_CANCEL_ENABLE 0 +#define PTHREAD_CANCEL_DISABLE 1 + +#define PTHREAD_CANCEL_DEFERRED 0 +#define PTHREAD_CANCEL_ASYNCHRONOUS 1 + +#define PTHREAD_CANCELED ((void *) -1) + +int pthread_cancel (pthread_t __pthread); + +/* Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ + +int pthread_setcancelstate (int __state, int *__oldstate); +int pthread_setcanceltype (int __type, int *__oldtype); +void pthread_testcancel (void); + +/* Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 */ + +void _pthread_cleanup_push (struct _pthread_cleanup_context *_context, + void (*_routine)(void *), void *_arg); + +void _pthread_cleanup_pop (struct _pthread_cleanup_context *_context, + int _execute); + +/* It is intentional to open and close the scope in two different macros */ +#define pthread_cleanup_push(_routine, _arg) \ + do { \ + struct _pthread_cleanup_context _pthread_clup_ctx; \ + _pthread_cleanup_push(&_pthread_clup_ctx, (_routine), (_arg)) + +#define pthread_cleanup_pop(_execute) \ + _pthread_cleanup_pop(&_pthread_clup_ctx, (_execute)); \ + } while (0) + +#if __GNU_VISIBLE +void _pthread_cleanup_push_defer (struct _pthread_cleanup_context *_context, + void (*_routine)(void *), void *_arg); + +void _pthread_cleanup_pop_restore (struct _pthread_cleanup_context *_context, + int _execute); + +/* It is intentional to open and close the scope in two different macros */ +#define pthread_cleanup_push_defer_np(_routine, _arg) \ + do { \ + struct _pthread_cleanup_context _pthread_clup_ctx; \ + _pthread_cleanup_push_defer(&_pthread_clup_ctx, (_routine), (_arg)) + +#define pthread_cleanup_pop_restore_np(_execute) \ + _pthread_cleanup_pop_restore(&_pthread_clup_ctx, (_execute)); \ + } while (0) +#endif /* __GNU_VISIBLE */ + +#if defined(_POSIX_THREAD_CPUTIME) + +/* Accessing a Thread CPU-time Clock, P1003.4b/D8, p. 58 */ + +int pthread_getcpuclockid (pthread_t __pthread_id, clockid_t *__clock_id); + +#endif /* defined(_POSIX_THREAD_CPUTIME) */ + + +#endif /* defined(_POSIX_THREADS) */ + +#if defined(_POSIX_BARRIERS) + +int pthread_barrierattr_init (pthread_barrierattr_t *__attr); +int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr); +int pthread_barrierattr_getpshared (const pthread_barrierattr_t *__attr, + int *__pshared); +int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr, + int __pshared); + +#define PTHREAD_BARRIER_SERIAL_THREAD -1 + +int pthread_barrier_init (pthread_barrier_t *__barrier, + const pthread_barrierattr_t *__attr, + unsigned __count); +int pthread_barrier_destroy (pthread_barrier_t *__barrier); +int pthread_barrier_wait (pthread_barrier_t *__barrier); + +#endif /* defined(_POSIX_BARRIERS) */ + +#if defined(_POSIX_SPIN_LOCKS) + +int pthread_spin_init (pthread_spinlock_t *__spinlock, int __pshared); +int pthread_spin_destroy (pthread_spinlock_t *__spinlock); +int pthread_spin_lock (pthread_spinlock_t *__spinlock); +int pthread_spin_trylock (pthread_spinlock_t *__spinlock); +int pthread_spin_unlock (pthread_spinlock_t *__spinlock); + +#endif /* defined(_POSIX_SPIN_LOCKS) */ + +#if defined(_POSIX_READER_WRITER_LOCKS) + +/* This is used to statically initialize a pthread_rwlock_t. Example: + + pthread_mutex_t mutex = PTHREAD_RWLOCK_INITIALIZER; + */ + +#define PTHREAD_RWLOCK_INITIALIZER _PTHREAD_RWLOCK_INITIALIZER + +int pthread_rwlockattr_init (pthread_rwlockattr_t *__attr); +int pthread_rwlockattr_destroy (pthread_rwlockattr_t *__attr); +int pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *__attr, + int *__pshared); +int pthread_rwlockattr_setpshared (pthread_rwlockattr_t *__attr, + int __pshared); + +int pthread_rwlock_init (pthread_rwlock_t *__rwlock, + const pthread_rwlockattr_t *__attr); +int pthread_rwlock_destroy (pthread_rwlock_t *__rwlock); +int pthread_rwlock_rdlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_tryrdlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_timedrdlock (pthread_rwlock_t *__rwlock, + const struct timespec *__abstime); +int pthread_rwlock_unlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_wrlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_trywrlock (pthread_rwlock_t *__rwlock); +int pthread_rwlock_timedwrlock (pthread_rwlock_t *__rwlock, + const struct timespec *__abstime); + +#if __GNU_VISIBLE +/* The Issue 8 standard adds pthread_rwlock_clockrdlock() +* and pthread_rwlock_clockwrlock()*/ +int pthread_rwlock_clockrdlock(pthread_rwlock_t *__restrict, clockid_t, + const struct timespec *__restrict); +int pthread_rwlock_clockwrlock(pthread_rwlock_t *__restrict, clockid_t, + const struct timespec *__restrict); +#endif /* __GNU_VISIBLE */ + +#endif /* defined(_POSIX_READER_WRITER_LOCKS) */ + + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ diff --git a/lib/include/pwd.h b/lib/include/pwd.h new file mode 100644 index 0000000..45d1594 --- /dev/null +++ b/lib/include/pwd.h @@ -0,0 +1,83 @@ +/*- + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)pwd.h 5.13 (Berkeley) 5/28/91 + */ + +#ifndef _PWD_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _PWD_H_ + +#include +#include + +#if __BSD_VISIBLE +#define _PATH_PASSWD "/etc/passwd" + +#define _PASSWORD_LEN 128 /* max length, not counting NULL */ +#endif + +struct passwd { + char *pw_name; /* user name */ + char *pw_passwd; /* encrypted password */ + uid_t pw_uid; /* user uid */ + gid_t pw_gid; /* user gid */ + char *pw_comment; /* comment */ + char *pw_gecos; /* Honeywell login info */ + char *pw_dir; /* home directory */ + char *pw_shell; /* default shell */ +}; + +struct passwd *getpwuid (uid_t); +struct passwd *getpwnam (const char *); + +#ifndef __INSIDE_CYGWIN__ +#if __MISC_VISIBLE || __POSIX_VISIBLE +int getpwnam_r (const char *, struct passwd *, + char *, size_t , struct passwd **); +int getpwuid_r (uid_t, struct passwd *, char *, + size_t, struct passwd **); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE >= 4 +struct passwd *getpwent (void); +void setpwent (void); +void endpwent (void); +#endif + +#if __BSD_VISIBLE +int setpassent (int); +#endif +#endif /*!__INSIDE_CYGWIN__*/ + +#ifdef __cplusplus +} +#endif +#endif /* _PWD_H_ */ diff --git a/lib/include/reent.h b/lib/include/reent.h new file mode 100644 index 0000000..23d572c --- /dev/null +++ b/lib/include/reent.h @@ -0,0 +1,188 @@ +/* This header file provides the reentrancy. */ + +/* The reentrant system calls here serve two purposes: + + 1) Provide reentrant versions of the system calls the ANSI C library + requires. + 2) Provide these system calls in a namespace clean way. + + It is intended that *all* system calls that the ANSI C library needs + be declared here. It documents them all in one place. All library access + to the system is via some form of these functions. + + The target may provide the needed syscalls by any of the following: + + 1) Define the reentrant versions of the syscalls directly. + (eg: _open_r, _close_r, etc.). Please keep the namespace clean. + When you do this, set "syscall_dir" to "syscalls" and add + -DREENTRANT_SYSCALLS_PROVIDED to newlib_cflags in configure.host. + + 2) Define namespace clean versions of the system calls by prefixing + them with '_' (eg: _open, _close, etc.). Technically, there won't be + true reentrancy at the syscall level, but the library will be namespace + clean. + When you do this, set "syscall_dir" to "syscalls" in configure.host. + + 3) Define or otherwise provide the regular versions of the syscalls + (eg: open, close, etc.). The library won't be reentrant nor namespace + clean, but at least it will work. + When you do this, add -DMISSING_SYSCALL_NAMES to newlib_cflags in + configure.host. + + 4) Define or otherwise provide the regular versions of the syscalls, + and do not supply functional interfaces for any of the reentrant + calls. With this method, the reentrant syscalls are redefined to + directly call the regular system call without the reentrancy argument. + When you do this, specify both -DREENTRANT_SYSCALLS_PROVIDED and + -DMISSING_SYSCALL_NAMES via newlib_cflags in configure.host and do + not specify "syscall_dir". + + Stubs of the reentrant versions of the syscalls exist in the libc/reent + source directory and are provided if REENTRANT_SYSCALLS_PROVIDED isn't + defined. These stubs call the native system calls: _open, _close, etc. + if MISSING_SYSCALL_NAMES is *not* defined, otherwise they call the + non-underscored versions: open, close, etc. when MISSING_SYSCALL_NAMES + *is* defined. + + By default, newlib functions call the reentrant syscalls internally, + passing a reentrancy structure as an argument. This reentrancy structure + contains data that is thread-specific. For example, the errno value is + kept in the reentrancy structure. If multiple threads exist, each will + keep a separate errno value which is intuitive since the application flow + cannot check for failure reliably otherwise. + + The reentrant syscalls are either provided by the platform, by the + libc/reent stubs, or in the case of both MISSING_SYSCALL_NAMES and + REENTRANT_SYSCALLS_PROVIDED being defined, the calls are redefined to + simply call the regular syscalls with no reentrancy struct argument. + + A single-threaded application does not need to worry about the reentrancy + structure. It is used internally. + + A multi-threaded application needs either to manually manage reentrancy + structures or use dynamic reentrancy. + + Manually managing reentrancy structures entails calling special reentrant + versions of newlib functions that have an additional reentrancy argument. + For example, _printf_r. By convention, the first argument is the + reentrancy structure. By default, the normal version of the function + uses the default reentrancy structure: _REENT. The reentrancy structure + is passed internally, eventually to the reentrant syscalls themselves. + How the structures are stored and accessed in this model is up to the + application. + + Dynamic reentrancy is specified by the __DYNAMIC_REENT__ flag. This + flag denotes setting up a macro to replace _REENT with a function call + to __getreent(). This function needs to be implemented by the platform + and it is meant to return the reentrancy structure for the current + thread. When the regular C functions (e.g. printf) go to call internal + routines with the default _REENT structure, they end up calling with + the reentrancy structure for the thread. Thus, application code does not + need to call the _r routines nor worry about reentrancy structures. */ + +/* WARNING: All identifiers here must begin with an underscore. This file is + included by stdio.h and others and we therefore must only use identifiers + in the namespace allotted to us. */ + +#ifndef _REENT_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _REENT_H_ + +#include +#include + +#define __need_size_t +#define __need_ptrdiff_t +#include + +/* FIXME: not namespace clean */ +struct stat; +struct tms; +struct timeval; +struct timezone; + +#if defined(REENTRANT_SYSCALLS_PROVIDED) && defined(MISSING_SYSCALL_NAMES) + +#define _close_r(__reent, __fd) close(__fd) +#define _execve_r(__reent, __f, __arg, __env) execve(__f, __arg, __env) +#define _fcntl_r(__reent, __fd, __cmd, __arg) fcntl(__fd, __cmd, __arg) +#define _fork_r(__reent) fork() +#define _fstat_r(__reent, __fdes, __stat) fstat(__fdes, __stat) +#define _getpid_r(__reent) getpid() +#define _isatty_r(__reent, __desc) isatty(__desc) +#define _kill_r(__reent, __pid, __signal) kill(__pid, __signal) +#define _link_r(__reent, __oldpath, __newpath) link(__oldpath, __newpath) +#define _lseek_r(__reent, __fdes, __off, __w) lseek(__fdes, __off, __w) +#define _mkdir_r(__reent, __path, __m) mkdir(__path, __m) +#define _open_r(__reent, __path, __flag, __m) open(__path, __flag, __m) +#define _read_r(__reent, __fd, __buff, __cnt) read(__fd, __buff, __cnt) +#define _rename_r(__reent, __old, __new) rename(__old, __new) +#define _sbrk_r(__reent, __incr) sbrk(__incr) +#define _stat_r(__reent, __path, __buff) stat(__path, __buff) +#define _times_r(__reent, __time) times(__time) +#define _unlink_r(__reent, __path) unlink(__path) +#define _wait_r(__reent, __status) wait(__status) +#define _write_r(__reent, __fd, __buff, __cnt) write(__fd, __buff, __cnt) +#define _gettimeofday_r(__reent, __tp, __tzp) gettimeofday(__tp, __tzp) + +#ifdef __LARGE64_FILES +#define _lseek64_r(__reent, __fd, __off, __w) lseek64(__fd, __off, __w) +#define _fstat64_r(__reent, __fd, __buff) fstat64(__fd, __buff) +#define _open64_r(__reent, __path, __flag, __m) open64(__path, __flag, __m) +#endif + +#else +/* Reentrant versions of system calls. */ + +extern int _close_r (struct _reent *, int); +extern int _execve_r (struct _reent *, const char *, char *const *, char *const *); +extern int _fcntl_r (struct _reent *, int, int, int); +extern int _fork_r (struct _reent *); +extern int _fstat_r (struct _reent *, int, struct stat *); +extern int _getpid_r (struct _reent *); +extern int _isatty_r (struct _reent *, int); +extern int _kill_r (struct _reent *, int, int); +extern int _link_r (struct _reent *, const char *, const char *); +extern _off_t _lseek_r (struct _reent *, int, _off_t, int); +extern int _mkdir_r (struct _reent *, const char *, int); +extern int _open_r (struct _reent *, const char *, int, int); +extern _ssize_t _read_r (struct _reent *, int, void *, size_t); +extern int _rename_r (struct _reent *, const char *, const char *); +extern void *_sbrk_r (struct _reent *, ptrdiff_t); +extern int _stat_r (struct _reent *, const char *, struct stat *); +extern _CLOCK_T_ _times_r (struct _reent *, struct tms *); +extern int _unlink_r (struct _reent *, const char *); +extern int _wait_r (struct _reent *, int *); +extern _ssize_t _write_r (struct _reent *, int, const void *, size_t); + +/* This one is not guaranteed to be available on all targets. */ +extern int _gettimeofday_r (struct _reent *, struct timeval *__tp, void *__tzp); + +#ifdef __LARGE64_FILES + + +#if defined(__CYGWIN__) +#define stat64 stat +#endif +struct stat64; + +extern _off64_t _lseek64_r (struct _reent *, int, _off64_t, int); +extern int _fstat64_r (struct _reent *, int, struct stat64 *); +extern int _open64_r (struct _reent *, const char *, int, int); +extern int _stat64_r (struct _reent *, const char *, struct stat64 *); + +/* Don't pollute namespace if not building newlib. */ +#if defined (__CYGWIN__) && !defined (_LIBC) +#undef stat64 +#endif + +#endif + +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _REENT_H_ */ diff --git a/lib/include/regdef.h b/lib/include/regdef.h new file mode 100644 index 0000000..8cf144b --- /dev/null +++ b/lib/include/regdef.h @@ -0,0 +1,7 @@ +/* regdef.h -- define register names. */ + +/* This is a standard include file for MIPS targets. Other target + probably don't define it, and attempts to include this file will + fail. */ + +#include diff --git a/lib/include/regex.h b/lib/include/regex.h new file mode 100644 index 0000000..fa3e268 --- /dev/null +++ b/lib/include/regex.h @@ -0,0 +1,103 @@ +/*- + * Copyright (c) 1992 Henry Spencer. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regex.h 8.2 (Berkeley) 1/3/94 + * $FreeBSD: src/include/regex.h,v 1.4 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _REGEX_H_ +#define _REGEX_H_ + +#include + +/* types */ +typedef off_t regoff_t; + +typedef struct { + int re_magic; + size_t re_nsub; /* number of parenthesized subexpressions */ + __const char *re_endp; /* end pointer for REG_PEND */ + struct re_guts *re_g; /* none of your business :-) */ +} regex_t; + +typedef struct { + regoff_t rm_so; /* start of match */ + regoff_t rm_eo; /* end of match */ +} regmatch_t; + +/* regcomp() flags */ +#define REG_BASIC 0000 +#define REG_EXTENDED 0001 +#define REG_ICASE 0002 +#define REG_NOSUB 0004 +#define REG_NEWLINE 0010 +#define REG_NOSPEC 0020 +#define REG_PEND 0040 +#define REG_DUMP 0200 + +/* regerror() flags */ +#define REG_NOMATCH 1 +#define REG_BADPAT 2 +#define REG_ECOLLATE 3 +#define REG_ECTYPE 4 +#define REG_EESCAPE 5 +#define REG_ESUBREG 6 +#define REG_EBRACK 7 +#define REG_EPAREN 8 +#define REG_EBRACE 9 +#define REG_BADBR 10 +#define REG_ERANGE 11 +#define REG_ESPACE 12 +#define REG_BADRPT 13 +#define REG_EMPTY 14 +#define REG_ASSERT 15 +#define REG_INVARG 16 +#define REG_ATOI 255 /* convert name to number (!) */ +#define REG_ITOA 0400 /* convert number to name (!) */ + +/* regexec() flags */ +#define REG_NOTBOL 00001 +#define REG_NOTEOL 00002 +#define REG_STARTEND 00004 +#define REG_TRACE 00400 /* tracing of execution */ +#define REG_LARGE 01000 /* force large representation */ +#define REG_BACKR 02000 /* force use of backref code */ + +__BEGIN_DECLS +int regcomp(regex_t *__restrict, const char *__restrict, int); +size_t regerror(int, const regex_t *__restrict, char *__restrict, size_t); +int regexec(const regex_t *__restrict, const char *__restrict, + size_t, regmatch_t [__restrict], int); +void regfree(regex_t *); +__END_DECLS + +#endif /* !_REGEX_H_ */ diff --git a/lib/include/rpc/types.h b/lib/include/rpc/types.h new file mode 100644 index 0000000..df77a93 --- /dev/null +++ b/lib/include/rpc/types.h @@ -0,0 +1,85 @@ + +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * from: @(#)types.h 1.18 87/07/24 SMI + * from: @(#)types.h 2.3 88/08/15 4.0 RPCSRC + * $FreeBSD: src/include/rpc/types.h,v 1.10.6.1 2003/12/18 00:59:50 peter Exp $ + * $NetBSD: types.h,v 1.13 2000/06/13 01:02:44 thorpej Exp $ + */ + +/* + * Rpc additions to + */ +#ifndef _RPC_TYPES_H +#define _RPC_TYPES_H + +#include +#include + +#define __need_NULL +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(___int64_t_defined) +typedef u_int64_t u_quad_t; +typedef int64_t quad_t; +#endif /* ___int64_t_defined */ +typedef int32_t bool_t; +typedef int32_t enum_t; + +typedef u_int32_t rpcprog_t; +typedef u_int32_t rpcvers_t; +typedef u_int32_t rpcproc_t; +typedef u_int32_t rpcprot_t; +typedef u_int32_t rpcport_t; +typedef int32_t rpc_inline_t; + +#define __dontcare__ -1 + +#ifndef FALSE +# define FALSE 0 +#endif +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef mem_alloc +#define mem_alloc(bsize) calloc(1, bsize) +#endif +#ifndef mem_free +#define mem_free(ptr, bsize) free(ptr) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !_RPC_TYPES_H */ diff --git a/lib/include/rpc/xdr.h b/lib/include/rpc/xdr.h new file mode 100644 index 0000000..139e0c7 --- /dev/null +++ b/lib/include/rpc/xdr.h @@ -0,0 +1,389 @@ + +/* + * Copyright (c) 2009, Sun Microsystems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * - Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * from: @(#)xdr.h 1.19 87/04/22 SMI + * from: @(#)xdr.h 2.2 88/07/29 4.0 RPCSRC + * $FreeBSD: src/include/rpc/xdr.h,v 1.23 2003/03/07 13:19:40 nectar Exp $ + * $NetBSD: xdr.h,v 1.19 2000/07/17 05:00:45 matt Exp $ + */ + +/* + * xdr.h, External Data Representation Serialization Routines. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + */ + +#ifndef _RPC_XDR_H +#define _RPC_XDR_H +#include <_ansi.h> +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * XDR provides a conventional way for converting between C data + * types and an external bit-string representation. Library supplied + * routines provide for the conversion on built-in C data types. These + * routines and utility routines defined here are used to help implement + * a type encode/decode routine for each user-defined type. + * + * Each data type provides a single procedure which takes two arguments: + * + * bool_t + * xdrproc(XDR *xdrs, *argresp) + * + * xdrs is an instance of a XDR handle, to which or from which the data + * type is to be converted. argresp is a pointer to the structure to be + * converted. The XDR handle contains an operation field which indicates + * which of the operations (ENCODE, DECODE * or FREE) is to be performed. + * + * XDR_DECODE may allocate space if the pointer argresp is null. This + * data can be freed with the XDR_FREE operation. + * + * We write only one procedure per data type to make it easy + * to keep the encode and decode procedures for a data type consistent. + * In many cases the same code performs all operations on a user defined type, + * because all the hard work is done in the component type routines. + * decode as a series of calls on the nested data types. + */ + +/* + * Xdr operations. XDR_ENCODE causes the type to be encoded into the + * stream. XDR_DECODE causes the type to be extracted from the stream. + * XDR_FREE can be used to release the space allocated by an XDR_DECODE + * request. + */ +enum xdr_op +{ + XDR_ENCODE = 0, + XDR_DECODE = 1, + XDR_FREE = 2 +}; + +/* + * This is the number of bytes per unit of external data. + */ +#define BYTES_PER_XDR_UNIT (4) +#if 1 +/* faster version when BYTES_PER_XDR_UNIT is a power of two */ +# define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1)) +#else /* old version */ +#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \ + * BYTES_PER_XDR_UNIT) +#endif + +/* + * The XDR handle. + * Contains operation which is being applied to the stream, + * an operations vector for the particular implementation (e.g. see xdr_mem.c), + * and two private fields for the use of the particular implementation. + */ +typedef struct __rpc_xdr +{ + enum xdr_op x_op; /* operation; fast additional param */ + const struct xdr_ops + { + /* get a long from underlying stream */ + bool_t (*x_getlong) (struct __rpc_xdr *, long *); + + /* put a long to " */ + bool_t (*x_putlong) (struct __rpc_xdr *, const long *); + + /* get some bytes from " */ + bool_t (*x_getbytes) (struct __rpc_xdr *, char *, u_int); + + /* put some bytes to " */ + bool_t (*x_putbytes) (struct __rpc_xdr *, const char *, u_int); + + /* returns bytes off from beginning */ + u_int (*x_getpostn) (struct __rpc_xdr *); + + /* lets you reposition the stream */ + bool_t (*x_setpostn) (struct __rpc_xdr *, u_int); + + /* buf quick ptr to buffered data */ + int32_t * (*x_inline) (struct __rpc_xdr *, u_int); + + /* free privates of this xdr_stream */ + void (*x_destroy) (struct __rpc_xdr *); + + /* get an int32 from this xdr_stream */ + bool_t (*x_getint32) (struct __rpc_xdr *, int32_t *); + + /* put an int32 to the underlying stream */ + bool_t (*x_putint32) (struct __rpc_xdr *, const int32_t *); + + } *x_ops; + char *x_public; /* users' data */ + void *x_private; /* pointer to private data */ + char *x_base; /* private used for position info */ + u_int x_handy; /* extra private word */ +} XDR; + +/* + * A xdrproc_t exists for each data type which is to be encoded or decoded. + * + * The second argument to the xdrproc_t is a pointer to an opaque pointer. + * The opaque pointer generally points to a structure of the data type + * to be decoded. If this pointer is 0, then the type routines should + * allocate dynamic storage of the appropriate size and return it. + * bool_t (*xdrproc_t)(XDR *, some_type *) + */ +typedef bool_t (*xdrproc_t) (XDR *, ...); + +/* + * Operations defined on a XDR handle + * + * XDR *xdrs; + * long *longp; + * char *addr; + * u_int len; + * u_int pos; + */ +#define XDR_GETINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) +#define xdr_getint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) + +#define XDR_PUTINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) +#define xdr_putint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) + +#define XDR_GETLONG(xdrs, longp) \ + (*(xdrs)->x_ops->x_getlong)(xdrs, longp) +#define xdr_getlong(xdrs, longp) \ + (*(xdrs)->x_ops->x_getlong)(xdrs, longp) + +#define XDR_PUTLONG(xdrs, longp) \ + (*(xdrs)->x_ops->x_putlong)(xdrs, longp) +#define xdr_putlong(xdrs, longp) \ + (*(xdrs)->x_ops->x_putlong)(xdrs, longp) + +#define XDR_GETBYTES(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) +#define xdr_getbytes(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) + +#define XDR_PUTBYTES(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) +#define xdr_putbytes(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) + +#define XDR_GETPOS(xdrs) \ + (*(xdrs)->x_ops->x_getpostn)(xdrs) +#define xdr_getpos(xdrs) \ + (*(xdrs)->x_ops->x_getpostn)(xdrs) + +#define XDR_SETPOS(xdrs, pos) \ + (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) +#define xdr_setpos(xdrs, pos) \ + (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) + +#define XDR_INLINE(xdrs, len) \ + (*(xdrs)->x_ops->x_inline)(xdrs, len) +#define xdr_inline(xdrs, len) \ + (*(xdrs)->x_ops->x_inline)(xdrs, len) + +#define XDR_DESTROY(xdrs) \ + do { \ + if ((xdrs)->x_ops->x_destroy) \ + (*(xdrs)->x_ops->x_destroy)(xdrs); \ + } while (0) +#define xdr_destroy(xdrs) \ + do { \ + if ((xdrs)->x_ops->x_destroy) \ + (*(xdrs)->x_ops->x_destroy)(xdrs); \ + } while (0) + +/* + * Solaris strips the '_t' from these types -- not sure why. + * But, let's be compatible. + */ +#define xdr_rpcvers(xdrs, versp) xdr_u_int32(xdrs, versp) +#define xdr_rpcprog(xdrs, progp) xdr_u_int32(xdrs, progp) +#define xdr_rpcproc(xdrs, procp) xdr_u_int32(xdrs, procp) +#define xdr_rpcprot(xdrs, protp) xdr_u_int32(xdrs, protp) +#define xdr_rpcport(xdrs, portp) xdr_u_int32(xdrs, portp) + +/* + * Support struct for discriminated unions. + * You create an array of xdrdiscrim structures, terminated with + * an entry with a null procedure pointer. The xdr_union routine gets + * the discriminant value and then searches the array of structures + * for a matching value. If a match is found the associated xdr routine + * is called to handle that part of the union. If there is + * no match, then a default routine may be called. + * If there is no match and no default routine it is an error. + */ +#define NULL_xdrproc_t ((xdrproc_t)0) +struct xdr_discrim +{ + int value; + xdrproc_t proc; +}; + +/* + * In-line routines for fast encode/decode of primitive data types. + * Caveat emptor: these use single memory cycles to get the + * data from the underlying buffer, and will fail to operate + * properly if the data is not aligned. The standard way to use these + * is to say: + * if ((buf = XDR_INLINE(xdrs, count)) == NULL) + * return (FALSE); + * <<< macro calls >>> + * where ``count'' is the number of bytes of data occupied + * by the primitive data types. + * + * N.B. and frozen for all time: each data type here uses 4 bytes + * of external representation. + */ +#define IXDR_GET_INT32(buf) ((int32_t)ntohl((u_int32_t)*(buf)++)) +#define IXDR_PUT_INT32(buf, v) (*(buf)++ =(int32_t)htonl((u_int32_t)v)) +#define IXDR_GET_U_INT32(buf) ((uint32_t)IXDR_GET_INT32(buf)) +#define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_INT32((buf), ((int32_t)(v))) + +/* Warning: inline long routines are broken for 64 bit platforms. + * Because the other inline routines below are implemented in terms + * of them, they are all also broken for 64 bit platforms. + */ +#define IXDR_GET_LONG(buf) ((long)ntohl((u_int32_t)*(buf)++)) +#define IXDR_PUT_LONG(buf, v) (*(buf)++ =(int32_t)htonl((u_int32_t)v)) +#define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) +#define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG((buf), (v)) + +#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf)) +#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf)) +#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf)) +#define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf)) + +#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG((buf), (v)) +#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG((buf), (v)) +#define IXDR_PUT_SHORT(buf, v) IXDR_PUT_LONG((buf), (v)) +#define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_LONG((buf), (v)) + +/* + * These are the "generic" xdr routines. + */ +extern bool_t xdr_void (void); +extern bool_t xdr_short (XDR *, short *); +extern bool_t xdr_u_short (XDR *, u_short *); +extern bool_t xdr_int (XDR *, int *); +extern bool_t xdr_u_int (XDR *, u_int *); +extern bool_t xdr_long (XDR *, long *); +extern bool_t xdr_u_long (XDR *, u_long *); +extern bool_t xdr_int8_t (XDR *, int8_t *); +extern bool_t xdr_uint8_t (XDR *, uint8_t *); +extern bool_t xdr_u_int8_t (XDR *, u_int8_t *); +extern bool_t xdr_int16_t (XDR *, int16_t *); +extern bool_t xdr_uint16_t (XDR *, uint16_t *); +extern bool_t xdr_u_int16_t (XDR *, u_int16_t *); +extern bool_t xdr_int32_t (XDR *, int32_t *); +extern bool_t xdr_uint32_t (XDR *, uint32_t *); +extern bool_t xdr_u_int32_t (XDR *, u_int32_t *); +#if defined(___int64_t_defined) +extern bool_t xdr_int64_t (XDR *, int64_t *); +extern bool_t xdr_uint64_t (XDR *, uint64_t *); +extern bool_t xdr_u_int64_t (XDR *, u_int64_t *); +#endif /* ___int64_t_defined */ +extern bool_t xdr_bool (XDR *, bool_t *); +extern bool_t xdr_enum (XDR *, enum_t *); +extern bool_t xdr_array (XDR *, char **, u_int *, u_int, u_int, xdrproc_t); +extern bool_t xdr_bytes (XDR *, char **, u_int *, u_int); +extern bool_t xdr_opaque (XDR *, char *, u_int); +extern bool_t xdr_string (XDR *, char **, u_int); +extern bool_t xdr_union (XDR *, enum_t *, char *, + const struct xdr_discrim *, xdrproc_t); +extern bool_t xdr_char (XDR *, char *); +extern bool_t xdr_u_char (XDR *, u_char *); +extern bool_t xdr_vector (XDR *, char *, u_int, u_int, xdrproc_t); +extern bool_t xdr_float (XDR *, float *); +extern bool_t xdr_double (XDR *, double *); +/* extern bool_t xdr_quadruple (XDR *, long double *); */ +extern bool_t xdr_reference (XDR *, char **, u_int, xdrproc_t); +extern bool_t xdr_pointer (XDR *, char **, u_int, xdrproc_t); +extern bool_t xdr_wrapstring (XDR *, char **); +#if defined(___int64_t_defined) +extern bool_t xdr_hyper (XDR *, quad_t *); +extern bool_t xdr_u_hyper (XDR *, u_quad_t *); +extern bool_t xdr_longlong_t (XDR *, quad_t *); +extern bool_t xdr_u_longlong_t (XDR *, u_quad_t *); +#endif /* ___int64_t_defined */ +extern u_long xdr_sizeof (xdrproc_t, void *); + +/* + * Common opaque bytes objects used by many rpc protocols; + * declared here due to commonality. + */ +#define MAX_NETOBJ_SZ 1024 +struct netobj +{ + u_int n_len; + char *n_bytes; +}; +typedef struct netobj netobj; +extern bool_t xdr_netobj (XDR *, struct netobj *); + +/* + * These are the public routines for the various implementations of + * xdr streams. + */ + +/* XDR using memory buffers */ +extern void xdrmem_create (XDR *, char *, u_int, enum xdr_op); + +/* XDR using stdio library */ +#if defined(_STDIO_H_) +extern void xdrstdio_create (XDR *, FILE *, enum xdr_op); +#endif + +/* XDR pseudo records for tcp */ +extern void xdrrec_create (XDR *, u_int, u_int, void *, + int (*) (void *, void *, int), + int (*) (void *, void *, int)); + +/* make end of xdr record */ +extern bool_t xdrrec_endofrecord (XDR *, bool_t); + +/* move to beginning of next record */ +extern bool_t xdrrec_skiprecord (XDR *); + +/* true if no more input */ +extern bool_t xdrrec_eof (XDR *); +extern u_int xdrrec_readbytes (XDR *, caddr_t, u_int); + +/* free memory buffers for xdr */ +extern void xdr_free (xdrproc_t, void *); + +#ifdef __cplusplus +} +#endif + +#endif /* !_RPC_XDR_H */ diff --git a/lib/include/sched.h b/lib/include/sched.h new file mode 100644 index 0000000..31599aa --- /dev/null +++ b/lib/include/sched.h @@ -0,0 +1,112 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + +#ifndef _SCHED_H_ +#define _SCHED_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_POSIX_PRIORITY_SCHEDULING) +/* + * XBD 13 - Set Scheduling Parameters, P1003.1b-2008, p. 1803 + */ +int sched_setparam( + pid_t __pid, + const struct sched_param *__param +); + +/* + * XBD 13 - Set Scheduling Parameters, P1003.1b-2008, p. 1800 + */ +int sched_getparam( + pid_t __pid, + struct sched_param *__param +); + +/* + * XBD 13 - Set Scheduling Policy and Scheduling Parameters, + * P1003.1b-2008, p. 1805 + */ +int sched_setscheduler( + pid_t __pid, + int __policy, + const struct sched_param *__param +); + +/* + * XBD 13 - Get Scheduling Policy, P1003.1b-2008, p. 1801 + */ +int sched_getscheduler( + pid_t __pid +); + +/* + * XBD 13 - Get Scheduling Parameter Limits, P1003.1b-2008, p. 1799 + */ +int sched_get_priority_max( + int __policy +); + +int sched_get_priority_min( + int __policy +); + +/* + * XBD 13 - Get Scheduling Parameter Limits, P1003.1b-2008, p. 1802 + */ +int sched_rr_get_interval( + pid_t __pid, + struct timespec *__interval +); +#endif /* _POSIX_PRIORITY_SCHEDULING */ + +#if defined(_POSIX_THREADS) || defined(_POSIX_PRIORITY_SCHEDULING) + +/* + * XBD 13 - Yield Processor, P1003.1b-2008, p. 1807 + */ +int sched_yield( void ); + +#endif /* _POSIX_THREADS or _POSIX_PRIORITY_SCHEDULING */ + +#if __GNU_VISIBLE +int sched_getcpu(void); + +/* The following functions should only be declared if the type + cpu_set_t is defined through indirect inclusion of sys/cpuset.h, + only available on some targets. */ +#ifdef _SYS_CPUSET_H_ +int sched_getaffinity (pid_t, size_t, cpu_set_t *); +int sched_get_thread_affinity (void *, size_t, cpu_set_t *); +int sched_setaffinity (pid_t, size_t, const cpu_set_t *); +int sched_set_thread_affinity (void *, size_t, const cpu_set_t *); +#endif /* _SYS_CPUSET_H_ */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _SCHED_H_ */ diff --git a/lib/include/search.h b/lib/include/search.h new file mode 100644 index 0000000..ed321b0 --- /dev/null +++ b/lib/include/search.h @@ -0,0 +1,64 @@ +/* $NetBSD: search.h,v 1.12 1999/02/22 10:34:28 christos Exp $ */ +/* $FreeBSD: src/include/search.h,v 1.4 2002/03/23 17:24:53 imp Exp $ */ + +/* + * Written by J.T. Conklin + * Public domain. + */ + +#ifndef _SEARCH_H_ +#define _SEARCH_H_ + +#include +#include +#include + +typedef struct entry { + char *key; + void *data; +} ENTRY; + +typedef enum { + FIND, ENTER +} ACTION; + +typedef enum { + preorder, + postorder, + endorder, + leaf +} VISIT; + +#ifdef _SEARCH_PRIVATE +typedef struct node { + char *key; + struct node *llink, *rlink; +} node_t; +#endif + +struct hsearch_data +{ + struct internal_head *htable; + size_t htablesize; +}; + +#ifndef __compar_fn_t_defined +#define __compar_fn_t_defined +typedef int (*__compar_fn_t) (const void *, const void *); +#endif + +__BEGIN_DECLS +int hcreate(size_t); +void hdestroy(void); +ENTRY *hsearch(ENTRY, ACTION); +int hcreate_r(size_t, struct hsearch_data *); +void hdestroy_r(struct hsearch_data *); +int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *); +void *tdelete(const void *__restrict, void **__restrict, __compar_fn_t); +void tdestroy (void *, void (*)(void *)); +void *tfind(const void *, void **, __compar_fn_t); +void *tsearch(const void *, void **, __compar_fn_t); +void twalk(const void *, void (*)(const void *, VISIT, int)); +__END_DECLS + +#endif /* !_SEARCH_H_ */ diff --git a/lib/include/setjmp.h b/lib/include/setjmp.h new file mode 100644 index 0000000..a2830b2 --- /dev/null +++ b/lib/include/setjmp.h @@ -0,0 +1,25 @@ +/* + setjmp.h + stubs for future use. +*/ + +#ifndef _SETJMP_H_ +#define _SETJMP_H_ + +#include "_ansi.h" +#include + +_BEGIN_STD_C + +#ifdef __GNUC__ +void longjmp (jmp_buf __jmpb, int __retval) + __attribute__ ((__noreturn__)); +#else +void longjmp (jmp_buf __jmpb, int __retval); +#endif +int setjmp (jmp_buf __jmpb); + +_END_STD_C + +#endif /* _SETJMP_H_ */ + diff --git a/lib/include/signal.h b/lib/include/signal.h new file mode 100644 index 0000000..23a9863 --- /dev/null +++ b/lib/include/signal.h @@ -0,0 +1,35 @@ +#ifndef _SIGNAL_H_ +#define _SIGNAL_H_ + +#include "_ansi.h" +#include +#include + +_BEGIN_STD_C + +typedef int sig_atomic_t; /* Atomic entity type (ANSI) */ +#if __BSD_VISIBLE +typedef _sig_func_ptr sig_t; /* BSD naming */ +#endif +#if __GNU_VISIBLE +typedef _sig_func_ptr sighandler_t; /* glibc naming */ +#endif + +#define SIG_DFL ((_sig_func_ptr)0) /* Default action */ +#define SIG_IGN ((_sig_func_ptr)1) /* Ignore action */ +#define SIG_ERR ((_sig_func_ptr)-1) /* Error return */ + +struct _reent; + +_sig_func_ptr _signal_r (struct _reent *, int, _sig_func_ptr); +int _raise_r (struct _reent *, int); + +#ifndef _REENT_ONLY +_sig_func_ptr signal (int, _sig_func_ptr); +int raise (int); +void psignal (int, const char *); +#endif + +_END_STD_C + +#endif /* _SIGNAL_H_ */ diff --git a/lib/include/spawn.h b/lib/include/spawn.h new file mode 100644 index 0000000..d6ae992 --- /dev/null +++ b/lib/include/spawn.h @@ -0,0 +1,111 @@ +/*- + * Copyright (c) 2008 Ed Schouten + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _SPAWN_H_ +#define _SPAWN_H_ + +#include <_ansi.h> +#include +#include +#include +#define __need_sigset_t +#include + +struct sched_param; + +typedef struct __posix_spawnattr *posix_spawnattr_t; +typedef struct __posix_spawn_file_actions *posix_spawn_file_actions_t; + +#define POSIX_SPAWN_RESETIDS 0x01 +#define POSIX_SPAWN_SETPGROUP 0x02 +#define POSIX_SPAWN_SETSCHEDPARAM 0x04 +#define POSIX_SPAWN_SETSCHEDULER 0x08 +#define POSIX_SPAWN_SETSIGDEF 0x10 +#define POSIX_SPAWN_SETSIGMASK 0x20 + +_BEGIN_STD_C +/* + * Spawn routines + * + * XXX both arrays should be __restrict, but this does not work when GCC + * is invoked with -std=c99. + */ +int posix_spawn (pid_t * __restrict, const char * __restrict, + const posix_spawn_file_actions_t *, const posix_spawnattr_t * __restrict, + char * const [], char * const []); +int posix_spawnp (pid_t * __restrict, const char * __restrict, + const posix_spawn_file_actions_t *, const posix_spawnattr_t * __restrict, + char * const [], char * const []); + +/* + * File descriptor actions + */ +int posix_spawn_file_actions_init (posix_spawn_file_actions_t *); +int posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *); + +int posix_spawn_file_actions_addopen (posix_spawn_file_actions_t * __restrict, + int, const char * __restrict, int, mode_t); +int posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *, int, int); +int posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *, int); +#if __MISC_VISIBLE || __GNU_VISIBLE +int posix_spawn_file_actions_addchdir_np (posix_spawn_file_actions_t *__restrict +, + const char *__restrict); +int posix_spawn_file_actions_addfchdir_np (posix_spawn_file_actions_t *__restrict, + int); +#endif + +/* + * Spawn attributes + */ +int posix_spawnattr_init (posix_spawnattr_t *); +int posix_spawnattr_destroy (posix_spawnattr_t *); + +int posix_spawnattr_getflags (const posix_spawnattr_t * __restrict, + short * __restrict); +int posix_spawnattr_getpgroup (const posix_spawnattr_t * __restrict, + pid_t * __restrict); +int posix_spawnattr_getschedparam (const posix_spawnattr_t * __restrict, + struct sched_param * __restrict); +int posix_spawnattr_getschedpolicy (const posix_spawnattr_t * __restrict, + int * __restrict); +int posix_spawnattr_getsigdefault (const posix_spawnattr_t * __restrict, + sigset_t * __restrict); +int posix_spawnattr_getsigmask (const posix_spawnattr_t * __restrict, + sigset_t * __restrict); + +int posix_spawnattr_setflags (posix_spawnattr_t *, short); +int posix_spawnattr_setpgroup (posix_spawnattr_t *, pid_t); +int posix_spawnattr_setschedparam (posix_spawnattr_t * __restrict, + const struct sched_param * __restrict); +int posix_spawnattr_setschedpolicy (posix_spawnattr_t *, int); +int posix_spawnattr_setsigdefault (posix_spawnattr_t * __restrict, + const sigset_t * __restrict); +int posix_spawnattr_setsigmask (posix_spawnattr_t * __restrict, + const sigset_t * __restrict); +_END_STD_C + +#endif /* !_SPAWN_H_ */ diff --git a/lib/include/ssp/ssp.h b/lib/include/ssp/ssp.h new file mode 100644 index 0000000..9229086 --- /dev/null +++ b/lib/include/ssp/ssp.h @@ -0,0 +1,76 @@ +/* $NetBSD: ssp.h,v 1.13 2015/09/03 20:43:47 plunky Exp $ */ + +/*- + * Copyright (c) 2006, 2011 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_SSP_H_ +#define _SSP_SSP_H_ + +#include + +/* __ssp_real is used by the implementation in libc */ +#if __SSP_FORTIFY_LEVEL == 0 +#define __ssp_real_(fun) fun +#else +#define __ssp_real_(fun) __ssp_real_ ## fun +#endif +#define __ssp_real(fun) __ssp_real_(fun) + +#define __ssp_inline extern __inline__ __attribute__((__always_inline__, __gnu_inline__)) + +#define __ssp_bos(ptr) __builtin_object_size(ptr, __SSP_FORTIFY_LEVEL > 1) +#define __ssp_bos0(ptr) __builtin_object_size(ptr, 0) + +#define __ssp_check(buf, len, bos) \ + if (bos(buf) != (size_t)-1 && len > bos(buf)) \ + __chk_fail() +#define __ssp_decl(rtype, fun, args) \ +rtype __ssp_real_(fun) args __asm__(__ASMNAME(#fun)); \ +__ssp_inline rtype fun args +#define __ssp_redirect_raw(rtype, fun, args, call, cond, bos) \ +__ssp_decl(rtype, fun, args) \ +{ \ + if (cond) \ + __ssp_check(__buf, __len, bos); \ + return __ssp_real_(fun) call; \ +} + +#define __ssp_redirect(rtype, fun, args, call) \ + __ssp_redirect_raw(rtype, fun, args, call, 1, __ssp_bos) +#define __ssp_redirect0(rtype, fun, args, call) \ + __ssp_redirect_raw(rtype, fun, args, call, 1, __ssp_bos0) + +#define __ssp_overlap(a, b, l) \ + (((a) <= (b) && (b) < (a) + (l)) || ((b) <= (a) && (a) < (b) + (l))) + +__BEGIN_DECLS +void __stack_chk_fail(void) __dead2; +void __chk_fail(void) __dead2; +__END_DECLS + +#endif /* _SSP_SSP_H_ */ diff --git a/lib/include/ssp/stdio.h b/lib/include/ssp/stdio.h new file mode 100644 index 0000000..df2cd18 --- /dev/null +++ b/lib/include/ssp/stdio.h @@ -0,0 +1,101 @@ +/* $NetBSD: stdio.h,v 1.5 2011/07/17 20:54:34 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_STDIO_H_ +#define _SSP_STDIO_H_ + +#include + +__BEGIN_DECLS +int __sprintf_chk(char *__restrict, int, size_t, const char *__restrict, ...) + __printflike(4, 5); +int __vsprintf_chk(char *__restrict, int, size_t, const char *__restrict, + __va_list) + __printflike(4, 0); +int __snprintf_chk(char *__restrict, size_t, int, size_t, + const char *__restrict, ...) + __printflike(5, 6); +int __vsnprintf_chk(char *__restrict, size_t, int, size_t, + const char *__restrict, __va_list) + __printflike(5, 0); +char *__gets_chk(char *, size_t); +__END_DECLS + +#if __SSP_FORTIFY_LEVEL > 0 + + +#define sprintf(str, ...) \ + __builtin___sprintf_chk(str, 0, __ssp_bos(str), __VA_ARGS__) + +#define vsprintf(str, fmt, ap) \ + __builtin___vsprintf_chk(str, 0, __ssp_bos(str), fmt, ap) + +#define snprintf(str, len, ...) \ + __builtin___snprintf_chk(str, len, 0, __ssp_bos(str), __VA_ARGS__) + +#define vsnprintf(str, len, fmt, ap) \ + __builtin___vsnprintf_chk(str, len, 0, __ssp_bos(str), fmt, ap) + +#define gets(str) \ + __gets_chk(str, __ssp_bos(str)) + +__ssp_decl(char *, fgets, (char *__restrict __buf, int __len, FILE *__fp)) +{ + if (__len > 0) + __ssp_check(__buf, (size_t)__len, __ssp_bos); + return __ssp_real_fgets(__buf, __len, __fp); +} + +#if __GNU_VISIBLE +__ssp_decl(char *, fgets_unlocked, (char *__restrict __buf, int __len, FILE *__fp)) +{ + if (__len > 0) + __ssp_check(__buf, (size_t)__len, __ssp_bos); + return __ssp_real_fgets_unlocked(__buf, __len, __fp); +} +#endif /* __GNU_VISIBLE */ + +__ssp_decl(size_t, fread, (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __fp)) +{ + __ssp_check(__ptr, __size * __n, __ssp_bos0); + return __ssp_real_fread(__ptr, __size, __n, __fp); +} + +#if __MISC_VISIBLE +__ssp_decl(size_t, fread_unlocked, (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __fp)) +{ + __ssp_check(__ptr, __size * __n, __ssp_bos0); + return __ssp_real_fread_unlocked(__ptr, __size, __n, __fp); +} +#endif /* __MISC_VISIBLE */ + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ + +#endif /* _SSP_STDIO_H_ */ diff --git a/lib/include/ssp/stdlib.h b/lib/include/ssp/stdlib.h new file mode 100644 index 0000000..d5edb6d --- /dev/null +++ b/lib/include/ssp/stdlib.h @@ -0,0 +1,30 @@ +#ifndef _SSP_STDLIB_H_ +#define _SSP_STDLIB_H_ + +#include + +#if __SSP_FORTIFY_LEVEL > 0 +__BEGIN_DECLS + +__ssp_decl(size_t, mbstowcs, (wchar_t *__buf, const char *__src, size_t __n)) +{ + if (__buf != NULL) + __ssp_check(__buf, __n * sizeof(wchar_t), __ssp_bos); + return __ssp_real_mbstowcs (__buf, __src, __n); +} + +__ssp_redirect_raw(size_t, wcstombs, \ + (char *__buf, const wchar_t *__src, size_t __len), \ + (__buf, __src, __len), __buf != NULL, __ssp_bos); + +__ssp_decl(int, wctomb, (char *__buf, wchar_t __wc)) +{ + if (__buf != NULL) + __ssp_check(__buf, MB_CUR_MAX, __ssp_bos); + return __ssp_real_wctomb (__buf, __wc); +} + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STDLIB_H_ */ diff --git a/lib/include/ssp/string.h b/lib/include/ssp/string.h new file mode 100644 index 0000000..85c4512 --- /dev/null +++ b/lib/include/ssp/string.h @@ -0,0 +1,115 @@ +/* $NetBSD: string.h,v 1.13 2014/11/29 13:23:48 pooka Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_STRING_H_ +#define _SSP_STRING_H_ + +#include +#include + +__BEGIN_DECLS +void *__memcpy_chk(void *, const void *, size_t, size_t); +void *__memmove_chk(void *, void *, size_t, size_t); +void *__mempcpy_chk(void *, const void *, size_t, size_t); +void *__memset_chk(void *, int, size_t, size_t); +char *__stpcpy_chk(char *, const char *, size_t); +char *__strcat_chk(char *, const char *, size_t); +char *__strcpy_chk(char *, const char *, size_t); +char *__strncat_chk(char *, const char *, size_t, size_t); +char *__strncpy_chk(char *, const char *, size_t, size_t); +__END_DECLS + +#if __SSP_FORTIFY_LEVEL > 0 + +#define __ssp_bos_check3(fun, dst, src, len) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___ ## fun ## _chk(dst, src, len, __ssp_bos0(dst)) : \ + __ ## fun ## _ichk(dst, src, len)) + +#define __ssp_bos_check2(fun, dst, src) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___ ## fun ## _chk(dst, src, __ssp_bos0(dst)) : \ + __ ## fun ## _ichk(dst, src)) + +#define __ssp_bos_icheck3_restrict(fun, type1, type2) \ +__ssp_inline type1 __ ## fun ## _ichk(type1 __restrict, type2 __restrict, size_t); \ +__ssp_inline type1 \ +__ ## fun ## _ichk(type1 __restrict dst, type2 __restrict src, size_t len) { \ + return __builtin___ ## fun ## _chk(dst, src, len, __ssp_bos0(dst)); \ +} + +#define __ssp_bos_icheck3(fun, type1, type2) \ +__ssp_inline type1 __ ## fun ## _ichk(type1, type2, size_t); \ +__ssp_inline type1 \ +__ ## fun ## _ichk(type1 dst, type2 src, size_t len) { \ + return __builtin___ ## fun ## _chk(dst, src, len, __ssp_bos0(dst)); \ +} + +#define __ssp_bos_icheck2_restrict(fun, type1, type2) \ +__ssp_inline type1 __ ## fun ## _ichk(type1, type2); \ +__ssp_inline type1 \ +__ ## fun ## _ichk(type1 __restrict dst, type2 __restrict src) { \ + return __builtin___ ## fun ## _chk(dst, src, __ssp_bos0(dst)); \ +} + +__BEGIN_DECLS +__ssp_bos_icheck3_restrict(memcpy, void *, const void *) +__ssp_bos_icheck3(memmove, void *, const void *) +__ssp_bos_icheck3_restrict(mempcpy, void *, const void *) +__ssp_bos_icheck3(memset, void *, int) +__ssp_bos_icheck2_restrict(stpcpy, char *, const char *) +#if __GNUC_PREREQ__(4,8) || defined(__clang__) +__ssp_bos_icheck3_restrict(stpncpy, char *, const char *) +#endif +__ssp_bos_icheck2_restrict(strcpy, char *, const char *) +__ssp_bos_icheck2_restrict(strcat, char *, const char *) +__ssp_bos_icheck3_restrict(strncpy, char *, const char *) +__ssp_bos_icheck3_restrict(strncat, char *, const char *) +__END_DECLS + +#define memcpy(dst, src, len) __ssp_bos_check3(memcpy, dst, src, len) +#define memmove(dst, src, len) __ssp_bos_check3(memmove, dst, src, len) +#if __GNU_VISIBLE +#define mempcpy(dst, src, len) __ssp_bos_check3(mempcpy, dst, src, len) +#endif +#define memset(dst, val, len) __ssp_bos_check3(memset, dst, val, len) +#if __POSIX_VISIBLE >= 200809 +#define stpcpy(dst, src) __ssp_bos_check2(stpcpy, dst, src) +#if __GNUC_PREREQ__(4,8) || defined(__clang__) +#define stpncpy(dst, src, len) __ssp_bos_check3(stpncpy, dst, src, len) +#endif +#endif +#define strcpy(dst, src) __ssp_bos_check2(strcpy, dst, src) +#define strcat(dst, src) __ssp_bos_check2(strcat, dst, src) +#define strncpy(dst, src, len) __ssp_bos_check3(strncpy, dst, src, len) +#define strncat(dst, src, len) __ssp_bos_check3(strncat, dst, src, len) + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STRING_H_ */ diff --git a/lib/include/ssp/strings.h b/lib/include/ssp/strings.h new file mode 100644 index 0000000..13adba1 --- /dev/null +++ b/lib/include/ssp/strings.h @@ -0,0 +1,55 @@ +/* $NetBSD: strings.h,v 1.3 2008/04/28 20:22:54 martin Exp $ */ + +/*- + * Copyright (c) 2007 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_STRINGS_H_ +#define _SSP_STRINGS_H_ + +#include + +#if __SSP_FORTIFY_LEVEL > 0 + +#if __BSD_VISIBLE || __POSIX_VISIBLE <= 200112 +#define bcopy(src, dst, len) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___memmove_chk(dst, src, len, __ssp_bos0(dst)) : \ + __memmove_ichk(dst, src, len)) +#define bzero(dst, len) \ + ((__ssp_bos0(dst) != (size_t)-1) ? \ + __builtin___memset_chk(dst, 0, len, __ssp_bos0(dst)) : \ + __memset_ichk(dst, 0, len)) +#endif + +#if __BSD_VISIBLE +__ssp_redirect0(void, explicit_bzero, (void *__buf, size_t __len), \ + (__buf, __len)); +#endif + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_STRINGS_H_ */ diff --git a/lib/include/ssp/unistd.h b/lib/include/ssp/unistd.h new file mode 100644 index 0000000..5ca6ace --- /dev/null +++ b/lib/include/ssp/unistd.h @@ -0,0 +1,93 @@ +/* $NetBSD: unistd.h,v 1.7 2015/06/25 18:41:03 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SSP_UNISTD_H_ +#define _SSP_UNISTD_H_ + +#include + +#if __SSP_FORTIFY_LEVEL > 0 +__BEGIN_DECLS + +#if __POSIX_VISIBLE >= 199209 +__ssp_redirect(size_t, confstr, (int __name, char *__buf, size_t __len), \ + (__name, __buf, __len)); +#endif + +__ssp_redirect_raw(char *, getcwd, (char *__buf, size_t __len), + (__buf, __len), __buf != 0, __ssp_bos); + +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +__ssp_redirect(int, getdomainname, (char *__buf, size_t __len), \ + (__buf, __len)); +#endif + +__ssp_decl(int, getgroups, (int __n, gid_t __buf[])) +{ + __ssp_check(__buf, __n * sizeof(gid_t), __ssp_bos); + return __ssp_real_getgroups (__n, __buf); +} + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500 +#if !(defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) +__ssp_redirect(int, gethostname, (char *__buf, size_t __len), \ + (__buf, __len)); +#endif +#endif + +__ssp_redirect(int, getlogin_r, (char *__buf, size_t __len), \ + (__buf, __len)); + +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +__ssp_redirect0(ssize_t, pread, (int __fd, void *__buf, size_t __len, off_t __off), \ + (__fd, __buf, __len, __off)); +#endif + +__ssp_redirect0(_READ_WRITE_RETURN_TYPE, read, \ + (int __fd, void *__buf, size_t __len), (__fd, __buf, __len)); + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 4 +__ssp_redirect(ssize_t, readlink, (const char *__restrict __path, \ + char *__restrict __buf, size_t __len), (__path, __buf, __len)); +#endif + +#if __ATFILE_VISIBLE +__ssp_redirect(ssize_t, readlinkat, \ + (int __dirfd1, const char *__restrict __path, char *__restrict __buf, size_t __len), \ + (__dirfd1, __path, __buf, __len)); +#endif + +__ssp_redirect(int, ttyname_r, (int __fd, char *__buf, size_t __len), \ + (__fd, __buf, __len)); + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_UNISTD_H_ */ diff --git a/lib/include/ssp/wchar.h b/lib/include/ssp/wchar.h new file mode 100644 index 0000000..d748fa2 --- /dev/null +++ b/lib/include/ssp/wchar.h @@ -0,0 +1,97 @@ +#ifndef _SSP_WCHAR_H_ +#define _SSP_WCHAR_H_ + +#include +#include + +#if __SSP_FORTIFY_LEVEL > 0 + +/* wide character variant, __wlen is number of wchar_t */ +#define __ssp_redirect_wc(rtype, fun, args, call, cond, bos) \ +__ssp_decl(rtype, fun, args) \ +{ \ + if (cond) \ + __ssp_check(__buf, __wlen * sizeof(wchar_t), bos); \ + return __ssp_real_(fun) call; \ +} + +#define __ssp_bos_wicheck3(fun) \ +__ssp_redirect_wc(wchar_t *, fun, \ + (wchar_t *__buf, const wchar_t *__src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +#define __ssp_bos_wicheck3_restrict(fun) \ +__ssp_redirect_wc(wchar_t *, fun, \ + (wchar_t *__restrict __buf, const wchar_t *__restrict __src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +#define __ssp_bos_wicheck2_restrict(fun) \ +__ssp_decl(wchar_t *, fun, (wchar_t *__restrict __buf, const wchar_t *__restrict __src)) \ +{ \ + __ssp_check(__buf, (wcslen(__src) + 1) * sizeof(wchar_t), __ssp_bos0); \ + return __ssp_real_(fun) (__buf, __src); \ +} + +__BEGIN_DECLS +#if __POSIX_VISIBLE >= 200809 +__ssp_bos_wicheck2_restrict(wcpcpy) +__ssp_bos_wicheck3_restrict(wcpncpy) +#endif +__ssp_bos_wicheck2_restrict(wcscpy) +__ssp_bos_wicheck2_restrict(wcscat) +__ssp_bos_wicheck3_restrict(wcsncpy) +__ssp_bos_wicheck3_restrict(wcsncat) +__ssp_bos_wicheck3_restrict(wmemcpy) +__ssp_bos_wicheck3(wmemmove) +#if __GNU_VISIBLE +__ssp_bos_wicheck3_restrict(wmempcpy) +#endif +__ssp_redirect_wc(wchar_t *, wmemset, \ + (wchar_t *__buf, wchar_t __src, size_t __wlen), \ + (__buf, __src, __wlen), 1, __ssp_bos0) + +__ssp_decl(size_t, wcrtomb, (char *__buf, wchar_t __src, mbstate_t *__ps)) +{ + if (__buf != NULL && __src != L'\0') + __ssp_check(__buf, sizeof(wchar_t), __ssp_bos); + return __ssp_real_wcrtomb (__buf, __src, __ps); +} + +__ssp_redirect_wc(size_t, mbsrtowcs, \ + (wchar_t *__buf, const char **__src, size_t __wlen, mbstate_t *__ps), \ + (__buf, __src, __wlen, __ps), __buf != NULL, __ssp_bos) + +__ssp_redirect_raw(size_t, wcsrtombs, \ + (char *__buf, const wchar_t **__src, size_t __len, mbstate_t *__ps), \ + (__buf, __src, __len, __ps), __buf != NULL, __ssp_bos) + +#if __POSIX_VISIBLE >= 200809 +__ssp_redirect_wc(size_t, mbsnrtowcs, \ + (wchar_t *__buf, const char **__src, size_t __nms, size_t __wlen, mbstate_t *__ps), \ + (__buf, __src, __nms, __wlen, __ps), __buf != NULL, __ssp_bos) + +__ssp_redirect_raw(size_t, wcsnrtombs, \ + (char *__buf, const wchar_t **__src, size_t __nwc, size_t __len, mbstate_t *__ps), \ + (__buf, __src, __nwc, __len, __ps), __buf != NULL, __ssp_bos) +#endif + +__ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, __FILE *__restrict __fp)) +{ + if (__wlen > 0) + __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); + return __ssp_real_fgetws(__buf, __wlen, __fp); +} + +#if __GNU_VISIBLE +__ssp_decl(wchar_t *, fgetws_unlocked, (wchar_t *__buf, int __wlen, __FILE *__fp)) +{ + if (__wlen > 0) + __ssp_check(__buf, (size_t)__wlen * sizeof(wchar_t) , __ssp_bos); + return __ssp_real_fgetws_unlocked(__buf, __wlen, __fp); +} +#endif /* __GNU_VISIBLE */ + +__END_DECLS + +#endif /* __SSP_FORTIFY_LEVEL > 0 */ +#endif /* _SSP_WCHAR_H_ */ diff --git a/lib/include/stdatomic.h b/lib/include/stdatomic.h new file mode 100644 index 0000000..d58e795 --- /dev/null +++ b/lib/include/stdatomic.h @@ -0,0 +1,409 @@ +/*- + * Copyright (c) 2011 Ed Schouten + * David Chisnall + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _STDATOMIC_H_ +#define _STDATOMIC_H_ + +#include +#include + +#if __has_extension(c_atomic) || __has_extension(cxx_atomic) +#define __CLANG_ATOMICS +#elif __GNUC_PREREQ__(4, 7) +#define __GNUC_ATOMICS +#elif defined(__GNUC__) +#define __SYNC_ATOMICS +#else +#error "stdatomic.h does not support your compiler" +#endif + +/* + * 7.17.1 Atomic lock-free macros. + */ + +#ifdef __GCC_ATOMIC_BOOL_LOCK_FREE +#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_CHAR_LOCK_FREE +#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_CHAR16_T_LOCK_FREE +#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_CHAR32_T_LOCK_FREE +#define ATOMIC_CHAR32_T_LOCK_FREE __GCC_ATOMIC_CHAR32_T_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_WCHAR_T_LOCK_FREE +#define ATOMIC_WCHAR_T_LOCK_FREE __GCC_ATOMIC_WCHAR_T_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_SHORT_LOCK_FREE +#define ATOMIC_SHORT_LOCK_FREE __GCC_ATOMIC_SHORT_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_INT_LOCK_FREE +#define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_LONG_LOCK_FREE +#define ATOMIC_LONG_LOCK_FREE __GCC_ATOMIC_LONG_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_LLONG_LOCK_FREE +#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE +#endif +#ifdef __GCC_ATOMIC_POINTER_LOCK_FREE +#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE +#endif + +/* + * 7.17.2 Initialization. + */ + +#if defined(__CLANG_ATOMICS) +#define ATOMIC_VAR_INIT(value) (value) +#define atomic_init(obj, value) __c11_atomic_init(obj, value) +#else +#define ATOMIC_VAR_INIT(value) { .__val = (value) } +#define atomic_init(obj, value) ((void)((obj)->__val = (value))) +#endif + +/* + * Clang and recent GCC both provide predefined macros for the memory + * orderings. If we are using a compiler that doesn't define them, use the + * clang values - these will be ignored in the fallback path. + */ + +#ifndef __ATOMIC_RELAXED +#define __ATOMIC_RELAXED 0 +#endif +#ifndef __ATOMIC_CONSUME +#define __ATOMIC_CONSUME 1 +#endif +#ifndef __ATOMIC_ACQUIRE +#define __ATOMIC_ACQUIRE 2 +#endif +#ifndef __ATOMIC_RELEASE +#define __ATOMIC_RELEASE 3 +#endif +#ifndef __ATOMIC_ACQ_REL +#define __ATOMIC_ACQ_REL 4 +#endif +#ifndef __ATOMIC_SEQ_CST +#define __ATOMIC_SEQ_CST 5 +#endif + +/* + * 7.17.3 Order and consistency. + * + * The memory_order_* constants that denote the barrier behaviour of the + * atomic operations. + */ + +typedef enum { + memory_order_relaxed = __ATOMIC_RELAXED, + memory_order_consume = __ATOMIC_CONSUME, + memory_order_acquire = __ATOMIC_ACQUIRE, + memory_order_release = __ATOMIC_RELEASE, + memory_order_acq_rel = __ATOMIC_ACQ_REL, + memory_order_seq_cst = __ATOMIC_SEQ_CST +} memory_order; + +/* + * 7.17.4 Fences. + */ + +static __inline void +atomic_thread_fence(memory_order __order __unused) +{ + +#ifdef __CLANG_ATOMICS + __c11_atomic_thread_fence(__order); +#elif defined(__GNUC_ATOMICS) + __atomic_thread_fence(__order); +#else + __sync_synchronize(); +#endif +} + +static __inline void +atomic_signal_fence(memory_order __order __unused) +{ + +#ifdef __CLANG_ATOMICS + __c11_atomic_signal_fence(__order); +#elif defined(__GNUC_ATOMICS) + __atomic_signal_fence(__order); +#else + __asm volatile ("" ::: "memory"); +#endif +} + +/* + * 7.17.5 Lock-free property. + */ + +#if defined(_KERNEL) +/* Atomics in kernelspace are always lock-free. */ +#define atomic_is_lock_free(obj) \ + ((void)(obj), (_Bool)1) +#elif defined(__CLANG_ATOMICS) || defined(__GNUC_ATOMICS) +#define atomic_is_lock_free(obj) \ + __atomic_is_lock_free(sizeof(*(obj)), obj) +#else +#define atomic_is_lock_free(obj) \ + ((void)(obj), sizeof((obj)->__val) <= sizeof(void *)) +#endif + +/* + * 7.17.6 Atomic integer types. + */ + +typedef _Atomic(_Bool) atomic_bool; +typedef _Atomic(char) atomic_char; +typedef _Atomic(signed char) atomic_schar; +typedef _Atomic(unsigned char) atomic_uchar; +typedef _Atomic(short) atomic_short; +typedef _Atomic(unsigned short) atomic_ushort; +typedef _Atomic(int) atomic_int; +typedef _Atomic(unsigned int) atomic_uint; +typedef _Atomic(long) atomic_long; +typedef _Atomic(unsigned long) atomic_ulong; +typedef _Atomic(long long) atomic_llong; +typedef _Atomic(unsigned long long) atomic_ullong; +#if 0 +typedef _Atomic(__char16_t) atomic_char16_t; +typedef _Atomic(__char32_t) atomic_char32_t; +#endif +typedef _Atomic(wchar_t) atomic_wchar_t; +typedef _Atomic(int_least8_t) atomic_int_least8_t; +typedef _Atomic(uint_least8_t) atomic_uint_least8_t; +typedef _Atomic(int_least16_t) atomic_int_least16_t; +typedef _Atomic(uint_least16_t) atomic_uint_least16_t; +typedef _Atomic(int_least32_t) atomic_int_least32_t; +typedef _Atomic(uint_least32_t) atomic_uint_least32_t; +typedef _Atomic(int_least64_t) atomic_int_least64_t; +typedef _Atomic(uint_least64_t) atomic_uint_least64_t; +typedef _Atomic(int_fast8_t) atomic_int_fast8_t; +typedef _Atomic(uint_fast8_t) atomic_uint_fast8_t; +typedef _Atomic(int_fast16_t) atomic_int_fast16_t; +typedef _Atomic(uint_fast16_t) atomic_uint_fast16_t; +typedef _Atomic(int_fast32_t) atomic_int_fast32_t; +typedef _Atomic(uint_fast32_t) atomic_uint_fast32_t; +typedef _Atomic(int_fast64_t) atomic_int_fast64_t; +typedef _Atomic(uint_fast64_t) atomic_uint_fast64_t; +typedef _Atomic(intptr_t) atomic_intptr_t; +typedef _Atomic(uintptr_t) atomic_uintptr_t; +typedef _Atomic(size_t) atomic_size_t; +typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t; +typedef _Atomic(intmax_t) atomic_intmax_t; +typedef _Atomic(uintmax_t) atomic_uintmax_t; + +/* + * 7.17.7 Operations on atomic types. + */ + +/* + * Compiler-specific operations. + */ + +#if defined(__CLANG_ATOMICS) +#define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) \ + __c11_atomic_compare_exchange_strong(object, expected, desired, \ + success, failure) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + __c11_atomic_compare_exchange_weak(object, expected, desired, \ + success, failure) +#define atomic_exchange_explicit(object, desired, order) \ + __c11_atomic_exchange(object, desired, order) +#define atomic_fetch_add_explicit(object, operand, order) \ + __c11_atomic_fetch_add(object, operand, order) +#define atomic_fetch_and_explicit(object, operand, order) \ + __c11_atomic_fetch_and(object, operand, order) +#define atomic_fetch_or_explicit(object, operand, order) \ + __c11_atomic_fetch_or(object, operand, order) +#define atomic_fetch_sub_explicit(object, operand, order) \ + __c11_atomic_fetch_sub(object, operand, order) +#define atomic_fetch_xor_explicit(object, operand, order) \ + __c11_atomic_fetch_xor(object, operand, order) +#define atomic_load_explicit(object, order) \ + __c11_atomic_load(object, order) +#define atomic_store_explicit(object, desired, order) \ + __c11_atomic_store(object, desired, order) +#elif defined(__GNUC_ATOMICS) +#define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) \ + __atomic_compare_exchange_n(object, expected, \ + desired, 0, success, failure) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + __atomic_compare_exchange_n(object, expected, \ + desired, 1, success, failure) +#define atomic_exchange_explicit(object, desired, order) \ + __atomic_exchange_n(object, desired, order) +#define atomic_fetch_add_explicit(object, operand, order) \ + __atomic_fetch_add(object, operand, order) +#define atomic_fetch_and_explicit(object, operand, order) \ + __atomic_fetch_and(object, operand, order) +#define atomic_fetch_or_explicit(object, operand, order) \ + __atomic_fetch_or(object, operand, order) +#define atomic_fetch_sub_explicit(object, operand, order) \ + __atomic_fetch_sub(object, operand, order) +#define atomic_fetch_xor_explicit(object, operand, order) \ + __atomic_fetch_xor(object, operand, order) +#define atomic_load_explicit(object, order) \ + __atomic_load_n(object, order) +#define atomic_store_explicit(object, desired, order) \ + __atomic_store_n(object, desired, order) +#else +#define __atomic_apply_stride(object, operand) \ + (((__typeof__((object)->__val))0) + (operand)) +#define atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) __extension__ ({ \ + __typeof__(expected) __ep = (expected); \ + __typeof__(*__ep) __e = *__ep; \ + (void)(success); (void)(failure); \ + (_Bool)((*__ep = __sync_val_compare_and_swap(&(object)->__val, \ + __e, desired)) == __e); \ +}) +#define atomic_compare_exchange_weak_explicit(object, expected, \ + desired, success, failure) \ + atomic_compare_exchange_strong_explicit(object, expected, \ + desired, success, failure) +#if __has_builtin(__sync_swap) +/* Clang provides a full-barrier atomic exchange - use it if available. */ +#define atomic_exchange_explicit(object, desired, order) \ + ((void)(order), __sync_swap(&(object)->__val, desired)) +#else +/* + * __sync_lock_test_and_set() is only an acquire barrier in theory (although in + * practice it is usually a full barrier) so we need an explicit barrier before + * it. + */ +#define atomic_exchange_explicit(object, desired, order) \ +__extension__ ({ \ + __typeof__(object) __o = (object); \ + __typeof__(desired) __d = (desired); \ + (void)(order); \ + __sync_synchronize(); \ + __sync_lock_test_and_set(&(__o)->__val, __d); \ +}) +#endif +#define atomic_fetch_add_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_add(&(object)->__val, \ + __atomic_apply_stride(object, operand))) +#define atomic_fetch_and_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_and(&(object)->__val, operand)) +#define atomic_fetch_or_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_or(&(object)->__val, operand)) +#define atomic_fetch_sub_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_sub(&(object)->__val, \ + __atomic_apply_stride(object, operand))) +#define atomic_fetch_xor_explicit(object, operand, order) \ + ((void)(order), __sync_fetch_and_xor(&(object)->__val, operand)) +#define atomic_load_explicit(object, order) \ + ((void)(order), __sync_fetch_and_add(&(object)->__val, 0)) +#define atomic_store_explicit(object, desired, order) \ + ((void)atomic_exchange_explicit(object, desired, order)) +#endif + +/* + * Convenience functions. + * + * Don't provide these in kernel space. In kernel space, we should be + * disciplined enough to always provide explicit barriers. + */ + +#ifndef _KERNEL +#define atomic_compare_exchange_strong(object, expected, desired) \ + atomic_compare_exchange_strong_explicit(object, expected, \ + desired, memory_order_seq_cst, memory_order_seq_cst) +#define atomic_compare_exchange_weak(object, expected, desired) \ + atomic_compare_exchange_weak_explicit(object, expected, \ + desired, memory_order_seq_cst, memory_order_seq_cst) +#define atomic_exchange(object, desired) \ + atomic_exchange_explicit(object, desired, memory_order_seq_cst) +#define atomic_fetch_add(object, operand) \ + atomic_fetch_add_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_and(object, operand) \ + atomic_fetch_and_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_or(object, operand) \ + atomic_fetch_or_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_sub(object, operand) \ + atomic_fetch_sub_explicit(object, operand, memory_order_seq_cst) +#define atomic_fetch_xor(object, operand) \ + atomic_fetch_xor_explicit(object, operand, memory_order_seq_cst) +#define atomic_load(object) \ + atomic_load_explicit(object, memory_order_seq_cst) +#define atomic_store(object, desired) \ + atomic_store_explicit(object, desired, memory_order_seq_cst) +#endif /* !_KERNEL */ + +/* + * 7.17.8 Atomic flag type and operations. + * + * XXX: Assume atomic_bool can be used as an atomic_flag. Is there some + * kind of compiler built-in type we could use? + */ + +typedef struct { + atomic_bool __flag; +} atomic_flag; +#define ATOMIC_FLAG_INIT { ATOMIC_VAR_INIT(0) } + +static __inline _Bool +atomic_flag_test_and_set_explicit(volatile atomic_flag *__object, + memory_order __order) +{ + return (atomic_exchange_explicit(&__object->__flag, 1, __order)); +} + +static __inline void +atomic_flag_clear_explicit(volatile atomic_flag *__object, memory_order __order) +{ + + atomic_store_explicit(&__object->__flag, 0, __order); +} + +#ifndef _KERNEL +static __inline _Bool +atomic_flag_test_and_set(volatile atomic_flag *__object) +{ + + return (atomic_flag_test_and_set_explicit(__object, + memory_order_seq_cst)); +} + +static __inline void +atomic_flag_clear(volatile atomic_flag *__object) +{ + + atomic_flag_clear_explicit(__object, memory_order_seq_cst); +} +#endif /* !_KERNEL */ + +#endif /* !_STDATOMIC_H_ */ diff --git a/lib/include/stdint.h b/lib/include/stdint.h new file mode 100644 index 0000000..4abdacb --- /dev/null +++ b/lib/include/stdint.h @@ -0,0 +1,466 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _STDINT_H +#define _STDINT_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ___int_least8_t_defined +typedef __int_least8_t int_least8_t; +typedef __uint_least8_t uint_least8_t; +#define __int_least8_t_defined 1 +#endif + +#ifdef ___int_least16_t_defined +typedef __int_least16_t int_least16_t; +typedef __uint_least16_t uint_least16_t; +#define __int_least16_t_defined 1 +#endif + +#ifdef ___int_least32_t_defined +typedef __int_least32_t int_least32_t; +typedef __uint_least32_t uint_least32_t; +#define __int_least32_t_defined 1 +#endif + +#ifdef ___int_least64_t_defined +typedef __int_least64_t int_least64_t; +typedef __uint_least64_t uint_least64_t; +#define __int_least64_t_defined 1 +#endif + +/* + * Fastest minimum-width integer types + * + * Assume int to be the fastest type for all types with a width + * less than __INT_MAX__ rsp. INT_MAX + */ +#ifdef __INT_FAST8_TYPE__ + typedef __INT_FAST8_TYPE__ int_fast8_t; + typedef __UINT_FAST8_TYPE__ uint_fast8_t; +#define __int_fast8_t_defined 1 +#elif __STDINT_EXP(INT_MAX) >= 0x7f + typedef signed int int_fast8_t; + typedef unsigned int uint_fast8_t; +#define __int_fast8_t_defined 1 +#endif + +#ifdef __INT_FAST16_TYPE__ + typedef __INT_FAST16_TYPE__ int_fast16_t; + typedef __UINT_FAST16_TYPE__ uint_fast16_t; +#define __int_fast16_t_defined 1 +#elif __STDINT_EXP(INT_MAX) >= 0x7fff + typedef signed int int_fast16_t; + typedef unsigned int uint_fast16_t; +#define __int_fast16_t_defined 1 +#endif + +#ifdef __INT_FAST32_TYPE__ + typedef __INT_FAST32_TYPE__ int_fast32_t; + typedef __UINT_FAST32_TYPE__ uint_fast32_t; +#define __int_fast32_t_defined 1 +#elif __STDINT_EXP(INT_MAX) >= 0x7fffffff + typedef signed int int_fast32_t; + typedef unsigned int uint_fast32_t; +#define __int_fast32_t_defined 1 +#endif + +#ifdef __INT_FAST64_TYPE__ + typedef __INT_FAST64_TYPE__ int_fast64_t; + typedef __UINT_FAST64_TYPE__ uint_fast64_t; +#define __int_fast64_t_defined 1 +#elif __STDINT_EXP(INT_MAX) > 0x7fffffff + typedef signed int int_fast64_t; + typedef unsigned int uint_fast64_t; +#define __int_fast64_t_defined 1 +#endif + +/* + * Fall back to [u]int_least_t for [u]int_fast_t types + * not having been defined, yet. + * Leave undefined, if [u]int_least_t should not be available. + */ +#if !__int_fast8_t_defined +#if __int_least8_t_defined + typedef int_least8_t int_fast8_t; + typedef uint_least8_t uint_fast8_t; +#define __int_fast8_t_defined 1 +#endif +#endif + +#if !__int_fast16_t_defined +#if __int_least16_t_defined + typedef int_least16_t int_fast16_t; + typedef uint_least16_t uint_fast16_t; +#define __int_fast16_t_defined 1 +#endif +#endif + +#if !__int_fast32_t_defined +#if __int_least32_t_defined + typedef int_least32_t int_fast32_t; + typedef uint_least32_t uint_fast32_t; +#define __int_fast32_t_defined 1 +#endif +#endif + +#if !__int_fast64_t_defined +#if __int_least64_t_defined + typedef int_least64_t int_fast64_t; + typedef uint_least64_t uint_fast64_t; +#define __int_fast64_t_defined 1 +#endif +#endif + +#ifdef __INTPTR_TYPE__ +#define INTPTR_MIN (-__INTPTR_MAX__ - 1) +#define INTPTR_MAX (__INTPTR_MAX__) +#define UINTPTR_MAX (__UINTPTR_MAX__) +#elif defined(__PTRDIFF_TYPE__) +#define INTPTR_MAX PTRDIFF_MAX +#define INTPTR_MIN PTRDIFF_MIN +#ifdef __UINTPTR_MAX__ +#define UINTPTR_MAX (__UINTPTR_MAX__) +#else +#define UINTPTR_MAX (2UL * PTRDIFF_MAX + 1) +#endif +#else +/* + * Fallback to hardcoded values, + * should be valid on cpu's with 32bit int/32bit void* + */ +#define INTPTR_MAX (__STDINT_EXP(LONG_MAX)) +#define INTPTR_MIN (-__STDINT_EXP(LONG_MAX) - 1) +#define UINTPTR_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) +#endif + +/* Limits of Specified-Width Integer Types */ + +#ifdef __INT8_MAX__ +#define INT8_MIN (-__INT8_MAX__ - 1) +#define INT8_MAX (__INT8_MAX__) +#define UINT8_MAX (__UINT8_MAX__) +#elif defined(__int8_t_defined) +#define INT8_MIN (-128) +#define INT8_MAX (127) +#define UINT8_MAX (255) +#endif + +#ifdef __INT_LEAST8_MAX__ +#define INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1) +#define INT_LEAST8_MAX (__INT_LEAST8_MAX__) +#define UINT_LEAST8_MAX (__UINT_LEAST8_MAX__) +#elif defined(__int_least8_t_defined) +#define INT_LEAST8_MIN (-128) +#define INT_LEAST8_MAX (127) +#define UINT_LEAST8_MAX (255) +#else +#error required type int_least8_t missing +#endif + +#ifdef __INT16_MAX__ +#define INT16_MIN (-__INT16_MAX__ - 1) +#define INT16_MAX (__INT16_MAX__) +#define UINT16_MAX (__UINT16_MAX__) +#elif defined(__int16_t_defined) +#define INT16_MIN (-32768) +#define INT16_MAX (32767) +#define UINT16_MAX (65535) +#endif + +#ifdef __INT_LEAST16_MAX__ +#define INT_LEAST16_MIN (-__INT_LEAST16_MAX__ - 1) +#define INT_LEAST16_MAX (__INT_LEAST16_MAX__) +#define UINT_LEAST16_MAX (__UINT_LEAST16_MAX__) +#elif defined(__int_least16_t_defined) +#define INT_LEAST16_MIN (-32768) +#define INT_LEAST16_MAX (32767) +#define UINT_LEAST16_MAX (65535) +#else +#error required type int_least16_t missing +#endif + +#ifdef __INT32_MAX__ +#define INT32_MIN (-__INT32_MAX__ - 1) +#define INT32_MAX (__INT32_MAX__) +#define UINT32_MAX (__UINT32_MAX__) +#elif defined(__int32_t_defined) +#if defined (_INT32_EQ_LONG) +#define INT32_MIN (-2147483647L-1) +#define INT32_MAX (2147483647L) +#define UINT32_MAX (4294967295UL) +#else +#define INT32_MIN (-2147483647-1) +#define INT32_MAX (2147483647) +#define UINT32_MAX (4294967295U) +#endif +#endif + +#ifdef __INT_LEAST32_MAX__ +#define INT_LEAST32_MIN (-__INT_LEAST32_MAX__ - 1) +#define INT_LEAST32_MAX (__INT_LEAST32_MAX__) +#define UINT_LEAST32_MAX (__UINT_LEAST32_MAX__) +#elif defined(__int_least32_t_defined) +#if defined (_INT32_EQ_LONG) +#define INT_LEAST32_MIN (-2147483647L-1) +#define INT_LEAST32_MAX (2147483647L) +#define UINT_LEAST32_MAX (4294967295UL) +#else +#define INT_LEAST32_MIN (-2147483647-1) +#define INT_LEAST32_MAX (2147483647) +#define UINT_LEAST32_MAX (4294967295U) +#endif +#else +#error required type int_least32_t missing +#endif + +#ifdef __INT64_MAX__ +#define INT64_MIN (-__INT64_MAX__ - 1) +#define INT64_MAX (__INT64_MAX__) +#define UINT64_MAX (__UINT64_MAX__) +#elif defined(__int64_t_defined) +#if __have_long64 +#define INT64_MIN (-9223372036854775807L-1L) +#define INT64_MAX (9223372036854775807L) +#define UINT64_MAX (18446744073709551615U) +#elif __have_longlong64 +#define INT64_MIN (-9223372036854775807LL-1LL) +#define INT64_MAX (9223372036854775807LL) +#define UINT64_MAX (18446744073709551615ULL) +#endif +#endif + +#ifdef __INT_LEAST64_MAX__ +#define INT_LEAST64_MIN (-__INT_LEAST64_MAX__ - 1) +#define INT_LEAST64_MAX (__INT_LEAST64_MAX__) +#define UINT_LEAST64_MAX (__UINT_LEAST64_MAX__) +#elif defined(__int_least64_t_defined) +#if __have_long64 +#define INT_LEAST64_MIN (-9223372036854775807L-1L) +#define INT_LEAST64_MAX (9223372036854775807L) +#define UINT_LEAST64_MAX (18446744073709551615U) +#elif __have_longlong64 +#define INT_LEAST64_MIN (-9223372036854775807LL-1LL) +#define INT_LEAST64_MAX (9223372036854775807LL) +#define UINT_LEAST64_MAX (18446744073709551615ULL) +#endif +#endif + +#ifdef __INT_FAST8_MAX__ +#define INT_FAST8_MIN (-__INT_FAST8_MAX__ - 1) +#define INT_FAST8_MAX (__INT_FAST8_MAX__) +#define UINT_FAST8_MAX (__UINT_FAST8_MAX__) +#elif defined(__int_fast8_t_defined) +#if __STDINT_EXP(INT_MAX) >= 0x7f +#define INT_FAST8_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST8_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST8_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST8_MIN INT_LEAST8_MIN +#define INT_FAST8_MAX INT_LEAST8_MAX +#define UINT_FAST8_MAX UINT_LEAST8_MAX +#endif +#endif + +#ifdef __INT_FAST16_MAX__ +#define INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1) +#define INT_FAST16_MAX (__INT_FAST16_MAX__) +#define UINT_FAST16_MAX (__UINT_FAST16_MAX__) +#elif defined(__int_fast16_t_defined) +#if __STDINT_EXP(INT_MAX) >= 0x7fff +#define INT_FAST16_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST16_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST16_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST16_MIN INT_LEAST16_MIN +#define INT_FAST16_MAX INT_LEAST16_MAX +#define UINT_FAST16_MAX UINT_LEAST16_MAX +#endif +#endif + +#ifdef __INT_FAST32_MAX__ +#define INT_FAST32_MIN (-__INT_FAST32_MAX__ - 1) +#define INT_FAST32_MAX (__INT_FAST32_MAX__) +#define UINT_FAST32_MAX (__UINT_FAST32_MAX__) +#elif defined(__int_fast32_t_defined) +#if __STDINT_EXP(INT_MAX) >= 0x7fffffff +#define INT_FAST32_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST32_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST32_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST32_MIN INT_LEAST32_MIN +#define INT_FAST32_MAX INT_LEAST32_MAX +#define UINT_FAST32_MAX UINT_LEAST32_MAX +#endif +#endif + +#ifdef __INT_FAST64_MAX__ +#define INT_FAST64_MIN (-__INT_FAST64_MAX__ - 1) +#define INT_FAST64_MAX (__INT_FAST64_MAX__) +#define UINT_FAST64_MAX (__UINT_FAST64_MAX__) +#elif defined(__int_fast64_t_defined) +#if __STDINT_EXP(INT_MAX) > 0x7fffffff +#define INT_FAST64_MIN (-__STDINT_EXP(INT_MAX)-1) +#define INT_FAST64_MAX (__STDINT_EXP(INT_MAX)) +#define UINT_FAST64_MAX (__STDINT_EXP(INT_MAX)*2U+1U) +#else +#define INT_FAST64_MIN INT_LEAST64_MIN +#define INT_FAST64_MAX INT_LEAST64_MAX +#define UINT_FAST64_MAX UINT_LEAST64_MAX +#endif +#endif + +#ifdef __INTMAX_MAX__ +#define INTMAX_MAX (__INTMAX_MAX__) +#define INTMAX_MIN (-INTMAX_MAX - 1) +#elif defined(__INTMAX_TYPE__) +/* All relevant GCC versions prefer long to long long for intmax_t. */ +#define INTMAX_MAX INT64_MAX +#define INTMAX_MIN INT64_MIN +#endif + +#ifdef __UINTMAX_MAX__ +#define UINTMAX_MAX (__UINTMAX_MAX__) +#elif defined(__UINTMAX_TYPE__) +/* All relevant GCC versions prefer long to long long for intmax_t. */ +#define UINTMAX_MAX UINT64_MAX +#endif + +/* This must match size_t in stddef.h, currently long unsigned int */ +#ifdef __SIZE_MAX__ +#define SIZE_MAX (__SIZE_MAX__) +#else +#define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1) +#endif + +/* This must match sig_atomic_t in (currently int) */ +#define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1) +#define SIG_ATOMIC_MAX (__STDINT_EXP(INT_MAX)) + +/* This must match ptrdiff_t in (currently long int) */ +#ifdef __PTRDIFF_MAX__ +#define PTRDIFF_MAX (__PTRDIFF_MAX__) +#else +#define PTRDIFF_MAX (__STDINT_EXP(LONG_MAX)) +#endif +#define PTRDIFF_MIN (-PTRDIFF_MAX - 1) + +/* This must match definition in */ +#ifndef WCHAR_MIN +#ifdef __WCHAR_MIN__ +#define WCHAR_MIN (__WCHAR_MIN__) +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MIN (0 + L'\0') +#else +#define WCHAR_MIN (-0x7fffffff - 1 + L'\0') +#endif +#endif + +/* This must match definition in */ +#ifndef WCHAR_MAX +#ifdef __WCHAR_MAX__ +#define WCHAR_MAX (__WCHAR_MAX__) +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MAX (0xffffffffu + L'\0') +#else +#define WCHAR_MAX (0x7fffffff + L'\0') +#endif +#endif + +/* wint_t is unsigned int on almost all GCC targets. */ +#ifdef __WINT_MAX__ +#define WINT_MAX (__WINT_MAX__) +#else +#define WINT_MAX (__STDINT_EXP(INT_MAX) * 2U + 1U) +#endif +#ifdef __WINT_MIN__ +#define WINT_MIN (__WINT_MIN__) +#else +#define WINT_MIN (0U) +#endif + +/** Macros for minimum-width integer constant expressions */ +#ifdef __INT8_C +#define INT8_C(x) __INT8_C(x) +#define UINT8_C(x) __UINT8_C(x) +#else +#define INT8_C(x) x +#if __STDINT_EXP(INT_MAX) > 0x7f +#define UINT8_C(x) x +#else +#define UINT8_C(x) x##U +#endif +#endif + +#ifdef __INT16_C +#define INT16_C(x) __INT16_C(x) +#define UINT16_C(x) __UINT16_C(x) +#else +#define INT16_C(x) x +#if __STDINT_EXP(INT_MAX) > 0x7fff +#define UINT16_C(x) x +#else +#define UINT16_C(x) x##U +#endif +#endif + +#ifdef __INT32_C +#define INT32_C(x) __INT32_C(x) +#define UINT32_C(x) __UINT32_C(x) +#else +#if defined (_INT32_EQ_LONG) +#define INT32_C(x) x##L +#define UINT32_C(x) x##UL +#else +#define INT32_C(x) x +#define UINT32_C(x) x##U +#endif +#endif + +#ifdef __INT64_C +#define INT64_C(x) __INT64_C(x) +#define UINT64_C(x) __UINT64_C(x) +#else +#if __int64_t_defined +#if __have_long64 +#define INT64_C(x) x##L +#define UINT64_C(x) x##UL +#else +#define INT64_C(x) x##LL +#define UINT64_C(x) x##ULL +#endif +#endif +#endif + +/** Macros for greatest-width integer constant expression */ +#ifdef __INTMAX_C +#define INTMAX_C(x) __INTMAX_C(x) +#define UINTMAX_C(x) __UINTMAX_C(x) +#else +#if __have_long64 +#define INTMAX_C(x) x##L +#define UINTMAX_C(x) x##UL +#else +#define INTMAX_C(x) x##LL +#define UINTMAX_C(x) x##ULL +#endif +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _STDINT_H */ diff --git a/lib/include/stdio.h b/lib/include/stdio.h new file mode 100644 index 0000000..7796657 --- /dev/null +++ b/lib/include/stdio.h @@ -0,0 +1,807 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * @(#)stdio.h 5.3 (Berkeley) 3/15/86 + */ + +/* + * NB: to fit things in six character monocase externals, the + * stdio code uses the prefix `__s' for stdio objects, typically + * followed by a three-character attempt at a mnemonic. + */ + +#ifndef _STDIO_H_ +#define _STDIO_H_ + +#include "_ansi.h" + +#define _FSTDIO /* ``function stdio'' */ + +#define __need_size_t +#define __need_NULL +#include +#include + +/* typedef only __gnuc_va_list, used throughout the header */ +#define __need___va_list +#include + +/* typedef va_list only when required */ +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE +#ifdef __GNUC__ +#ifndef _VA_LIST_DEFINED +typedef __gnuc_va_list va_list; +#define _VA_LIST_DEFINED +#endif +#else /* !__GNUC__ */ +#include +#endif +#endif /* __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE */ + +/* + * defines __FILE, _fpos_t. + * They must be defined there because struct _reent needs them (and we don't + * want reent.h to include this file. + */ + +#include +#include + +_BEGIN_STD_C + +#if !defined(__FILE_defined) +typedef __FILE FILE; +# define __FILE_defined +#endif + +typedef _fpos_t fpos_t; +#ifdef __LARGE64_FILES +typedef _fpos64_t fpos64_t; +#endif + +#ifndef _OFF_T_DECLARED +typedef __off_t off_t; +#define _OFF_T_DECLARED +#endif + +#ifndef _SSIZE_T_DECLARED +typedef _ssize_t ssize_t; +#define _SSIZE_T_DECLARED +#endif + +#include + +#define __SLBF 0x0001 /* line buffered */ +#define __SNBF 0x0002 /* unbuffered */ +#define __SRD 0x0004 /* OK to read */ +#define __SWR 0x0008 /* OK to write */ + /* RD and WR are never simultaneously asserted */ +#define __SRW 0x0010 /* open for reading & writing */ +#define __SEOF 0x0020 /* found EOF */ +#define __SERR 0x0040 /* found error */ +#define __SMBF 0x0080 /* _buf is from malloc */ +#define __SAPP 0x0100 /* fdopen()ed in append mode - so must write to end */ +#define __SSTR 0x0200 /* this is an sprintf/snprintf string */ +#define __SOPT 0x0400 /* do fseek() optimisation */ +#define __SNPT 0x0800 /* do not do fseek() optimisation */ +#define __SOFF 0x1000 /* set iff _offset is in fact correct */ +#define __SORD 0x2000 /* true => stream orientation (byte/wide) decided */ +#if defined(__CYGWIN__) +# define __SCLE 0x4000 /* convert line endings CR/LF <-> NL */ +#endif +#define __SL64 0x8000 /* is 64-bit offset large file */ + +/* _flags2 flags */ +#define __SNLK 0x0001 /* stdio functions do not lock streams themselves */ +#define __SWID 0x2000 /* true => stream orientation wide, false => byte, only valid if __SORD in _flags is true */ + +/* + * The following three definitions are for ANSI C, which took them + * from System V, which stupidly took internal interface macros and + * made them official arguments to setvbuf(), without renaming them. + * Hence, these ugly _IOxxx names are *supposed* to appear in user code. + * + * Although these happen to match their counterparts above, the + * implementation does not rely on that (so these could be renumbered). + */ +#define _IOFBF 0 /* setvbuf should set fully buffered */ +#define _IOLBF 1 /* setvbuf should set line buffered */ +#define _IONBF 2 /* setvbuf should set unbuffered */ + +#define EOF (-1) + +#ifdef __BUFSIZ__ +#define BUFSIZ __BUFSIZ__ +#else +#define BUFSIZ 1024 +#endif + +#ifdef __FOPEN_MAX__ +#define FOPEN_MAX __FOPEN_MAX__ +#else +#define FOPEN_MAX 20 +#endif + +#ifdef __FILENAME_MAX__ +#define FILENAME_MAX __FILENAME_MAX__ +#else +#define FILENAME_MAX 1024 +#endif + +#ifdef __L_tmpnam__ +#define L_tmpnam __L_tmpnam__ +#else +#define L_tmpnam FILENAME_MAX +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE +#define P_tmpdir "/tmp" +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 /* set file offset to offset */ +#endif +#ifndef SEEK_CUR +#define SEEK_CUR 1 /* set file offset to current plus offset */ +#endif +#ifndef SEEK_END +#define SEEK_END 2 /* set file offset to EOF plus offset */ +#endif + +#define TMP_MAX 26 + +#define stdin _REENT_STDIN(_REENT) +#define stdout _REENT_STDOUT(_REENT) +#define stderr _REENT_STDERR(_REENT) + +#define _stdin_r(x) _REENT_STDIN(x) +#define _stdout_r(x) _REENT_STDOUT(x) +#define _stderr_r(x) _REENT_STDERR(x) + +/* + * Functions defined in ANSI C standard. + */ + +#ifndef __VALIST +#ifdef __GNUC__ +#define __VALIST __gnuc_va_list +#else +#define __VALIST char* +#endif +#endif + +#if __POSIX_VISIBLE +char * ctermid (char *); +#endif +#if __GNU_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 600) +char * cuserid (char *); +#endif +FILE * tmpfile (void); +char * tmpnam (char *); +#if __BSD_VISIBLE || __XSI_VISIBLE || __POSIX_VISIBLE >= 200112 +char * tempnam (const char *, const char *) __malloc_like __result_use_check; +#endif +int fclose (FILE *); +int fflush (FILE *); +FILE * freopen (const char *__restrict, const char *__restrict, FILE *__restrict); +void setbuf (FILE *__restrict, char *__restrict); +int setvbuf (FILE *__restrict, char *__restrict, int, size_t); +int fprintf (FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int fscanf (FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int printf (const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 1, 2))); +int scanf (const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 1, 2))); +int sscanf (const char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int vfprintf (FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vprintf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 1, 0))); +int vsprintf (char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int fgetc (FILE *); +char * fgets (char *__restrict, int, FILE *__restrict); +int fputc (int, FILE *); +int fputs (const char *__restrict, FILE *__restrict); +int getc (FILE *); +int getchar (void); +char * gets (char *); +int putc (int, FILE *); +int putchar (int); +int puts (const char *); +int ungetc (int, FILE *); +size_t fread (void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t fwrite (const void *__restrict , size_t _size, size_t _n, FILE *); +#ifdef _LIBC +int fgetpos (FILE *, _fpos_t *); +#else +int fgetpos (FILE *__restrict, fpos_t *__restrict); +#endif +int fseek (FILE *, long, int); +#ifdef _LIBC +int fsetpos (FILE *, const _fpos_t *); +#else +int fsetpos (FILE *, const fpos_t *); +#endif +long ftell ( FILE *); +void rewind (FILE *); +void clearerr (FILE *); +int feof (FILE *); +int ferror (FILE *); +void perror (const char *); +#ifndef _REENT_ONLY +FILE * fopen (const char *__restrict _name, const char *__restrict _type); +int sprintf (char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int remove (const char *); +int rename (const char *, const char *); +#ifdef _LIBC +int _rename (const char *, const char *); +#endif +#endif +#if __LARGEFILE_VISIBLE || __POSIX_VISIBLE >= 200112 +#ifdef _LIBC +int fseeko (FILE *, _off_t, int); +_off_t ftello (FILE *); +#else +int fseeko (FILE *, off_t, int); +off_t ftello (FILE *); +#endif +#endif +#if __GNU_VISIBLE +int fcloseall (void); +#endif +#ifndef _REENT_ONLY +#if __ISO_C_VISIBLE >= 1999 +int snprintf (char *__restrict, size_t, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int vsnprintf (char *__restrict, size_t, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int vfscanf (FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int vscanf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 1, 0))); +int vsscanf (const char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +#endif +#if __GNU_VISIBLE +int asprintf (char **__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int vasprintf (char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +#endif +#if __MISC_VISIBLE /* Newlib-specific */ +int asiprintf (char **, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +char * asniprintf (char *, size_t *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +char * asnprintf (char *__restrict, size_t *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +#ifndef diprintf +int diprintf (int, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +#endif +int fiprintf (FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int fiscanf (FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int iprintf (const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 1, 2))); +int iscanf (const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 1, 2))); +int siprintf (char *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int siscanf (const char *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int sniprintf (char *, size_t, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int vasiprintf (char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +char * vasniprintf (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +char * vasnprintf (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int vdiprintf (int, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vfiprintf (FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vfiscanf (FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int viprintf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 1, 0))); +int viscanf (const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 1, 0))); +int vsiprintf (char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int vsiscanf (const char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int vsniprintf (char *, size_t, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +#endif /* __MISC_VISIBLE */ +#endif /* !_REENT_ONLY */ + +/* + * Routines in POSIX 1003.1:2001. + */ + +#if __POSIX_VISIBLE +#ifndef _REENT_ONLY +FILE * fdopen (int, const char *); +#endif +int fileno (FILE *); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 199209 +int pclose (FILE *); +FILE * popen (const char *, const char *); +#endif + +#if __BSD_VISIBLE +void setbuffer (FILE *, char *, int); +int setlinebuf (FILE *); +#endif + +#if __MISC_VISIBLE || (__XSI_VISIBLE && __POSIX_VISIBLE < 200112) +int getw (FILE *); +int putw (int, FILE *); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE +int getc_unlocked (FILE *); +int getchar_unlocked (void); +void flockfile (FILE *); +int ftrylockfile (FILE *); +void funlockfile (FILE *); +int putc_unlocked (int, FILE *); +int putchar_unlocked (int); +#endif + +/* + * Routines in POSIX 1003.1:200x. + */ + +#if __POSIX_VISIBLE >= 200809 +# ifndef _REENT_ONLY +# ifndef dprintf +int dprintf (int, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +# endif +FILE * fmemopen (void *__restrict, size_t, const char *__restrict); +/* getdelim - see __getdelim for now */ +/* getline - see __getline for now */ +FILE * open_memstream (char **, size_t *); +int vdprintf (int, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +# endif +#endif +#if __ATFILE_VISIBLE +int renameat (int, const char *, int, const char *); +# ifdef __CYGWIN__ +int renameat2 (int, const char *, int, const char *, unsigned int); +# endif +#endif + +/* + * Recursive versions of the above. + */ + +int _asiprintf_r (struct _reent *, char **, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +char * _asniprintf_r (struct _reent *, char *, size_t *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +char * _asnprintf_r (struct _reent *, char *__restrict, size_t *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +int _asprintf_r (struct _reent *, char **__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _diprintf_r (struct _reent *, int, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _dprintf_r (struct _reent *, int, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _fclose_r (struct _reent *, FILE *); +int _fcloseall_r (struct _reent *); +FILE * _fdopen_r (struct _reent *, int, const char *); +int _fflush_r (struct _reent *, FILE *); +int _fgetc_r (struct _reent *, FILE *); +int _fgetc_unlocked_r (struct _reent *, FILE *); +char * _fgets_r (struct _reent *, char *__restrict, int, FILE *__restrict); +char * _fgets_unlocked_r (struct _reent *, char *__restrict, int, FILE *__restrict); +#ifdef _LIBC +int _fgetpos_r (struct _reent *, FILE *__restrict, _fpos_t *__restrict); +int _fsetpos_r (struct _reent *, FILE *, const _fpos_t *); +#else +int _fgetpos_r (struct _reent *, FILE *, fpos_t *); +int _fsetpos_r (struct _reent *, FILE *, const fpos_t *); +#endif +int _fiprintf_r (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _fiscanf_r (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +FILE * _fmemopen_r (struct _reent *, void *__restrict, size_t, const char *__restrict); +FILE * _fopen_r (struct _reent *, const char *__restrict, const char *__restrict); +FILE * _freopen_r (struct _reent *, const char *__restrict, const char *__restrict, FILE *__restrict); +int _fprintf_r (struct _reent *, FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _fpurge_r (struct _reent *, FILE *); +int _fputc_r (struct _reent *, int, FILE *); +int _fputc_unlocked_r (struct _reent *, int, FILE *); +int _fputs_r (struct _reent *, const char *__restrict, FILE *__restrict); +int _fputs_unlocked_r (struct _reent *, const char *__restrict, FILE *__restrict); +size_t _fread_r (struct _reent *, void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t _fread_unlocked_r (struct _reent *, void *__restrict, size_t _size, size_t _n, FILE *__restrict); +int _fscanf_r (struct _reent *, FILE *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +int _fseek_r (struct _reent *, FILE *, long, int); +int _fseeko_r (struct _reent *, FILE *, _off_t, int); +long _ftell_r (struct _reent *, FILE *); +_off_t _ftello_r (struct _reent *, FILE *); +void _rewind_r (struct _reent *, FILE *); +size_t _fwrite_r (struct _reent *, const void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t _fwrite_unlocked_r (struct _reent *, const void *__restrict, size_t _size, size_t _n, FILE *__restrict); +int _getc_r (struct _reent *, FILE *); +int _getc_unlocked_r (struct _reent *, FILE *); +int _getchar_r (struct _reent *); +int _getchar_unlocked_r (struct _reent *); +char * _gets_r (struct _reent *, char *); +int _iprintf_r (struct _reent *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int _iscanf_r (struct _reent *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +FILE * _open_memstream_r (struct _reent *, char **, size_t *); +void _perror_r (struct _reent *, const char *); +int _printf_r (struct _reent *, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 2, 3))); +int _putc_r (struct _reent *, int, FILE *); +int _putc_unlocked_r (struct _reent *, int, FILE *); +int _putchar_unlocked_r (struct _reent *, int); +int _putchar_r (struct _reent *, int); +int _puts_r (struct _reent *, const char *); +int _remove_r (struct _reent *, const char *); +int _rename_r (struct _reent *, + const char *_old, const char *_new); +int _scanf_r (struct _reent *, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 2, 3))); +int _siprintf_r (struct _reent *, char *, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _siscanf_r (struct _reent *, const char *, const char *, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +int _sniprintf_r (struct _reent *, char *, size_t, const char *, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +int _snprintf_r (struct _reent *, char *__restrict, size_t, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 4, 5))); +int _sprintf_r (struct _reent *, char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__printf__, 3, 4))); +int _sscanf_r (struct _reent *, const char *__restrict, const char *__restrict, ...) + _ATTRIBUTE ((__format__ (__scanf__, 3, 4))); +char * _tempnam_r (struct _reent *, const char *, const char *); +FILE * _tmpfile_r (struct _reent *); +char * _tmpnam_r (struct _reent *, char *); +int _ungetc_r (struct _reent *, int, FILE *); +int _vasiprintf_r (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +char * _vasniprintf_r (struct _reent*, char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +char * _vasnprintf_r (struct _reent*, char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +int _vasprintf_r (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vdiprintf_r (struct _reent *, int, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vdprintf_r (struct _reent *, int, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vfiprintf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vfiscanf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); +int _vfprintf_r (struct _reent *, FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vfscanf_r (struct _reent *, FILE *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); +int _viprintf_r (struct _reent *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int _viscanf_r (struct _reent *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int _vprintf_r (struct _reent *, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 2, 0))); +int _vscanf_r (struct _reent *, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 2, 0))); +int _vsiprintf_r (struct _reent *, char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vsiscanf_r (struct _reent *, const char *, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); +int _vsniprintf_r (struct _reent *, char *, size_t, const char *, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +int _vsnprintf_r (struct _reent *, char *__restrict, size_t, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 4, 0))); +int _vsprintf_r (struct _reent *, char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _vsscanf_r (struct _reent *, const char *__restrict, const char *__restrict, __VALIST) + _ATTRIBUTE ((__format__ (__scanf__, 3, 0))); + +/* Other extensions. */ + +int fpurge (FILE *); +ssize_t __getdelim (char **, size_t *, int, FILE *); +ssize_t __getline (char **, size_t *, FILE *); + +#if __MISC_VISIBLE +void clearerr_unlocked (FILE *); +int feof_unlocked (FILE *); +int ferror_unlocked (FILE *); +int fileno_unlocked (FILE *); +int fflush_unlocked (FILE *); +int fgetc_unlocked (FILE *); +int fputc_unlocked (int, FILE *); +size_t fread_unlocked (void *__restrict, size_t _size, size_t _n, FILE *__restrict); +size_t fwrite_unlocked (const void *__restrict , size_t _size, size_t _n, FILE *); +#endif + +#if __GNU_VISIBLE +char * fgets_unlocked (char *__restrict, int, FILE *__restrict); +int fputs_unlocked (const char *__restrict, FILE *__restrict); +#endif + +#ifdef __LARGE64_FILES +#if !defined(__CYGWIN__) || defined(_LIBC) +FILE * fdopen64 (int, const char *); +FILE * fopen64 (const char *, const char *); +FILE * freopen64 (const char *, const char *, FILE *); +_off64_t ftello64 (FILE *); +_off64_t fseeko64 (FILE *, _off64_t, int); +int fgetpos64 (FILE *, _fpos64_t *); +int fsetpos64 (FILE *, const _fpos64_t *); +FILE * tmpfile64 (void); + +FILE * _fdopen64_r (struct _reent *, int, const char *); +FILE * _fopen64_r (struct _reent *,const char *, const char *); +FILE * _freopen64_r (struct _reent *, const char *, const char *, FILE *); +_off64_t _ftello64_r (struct _reent *, FILE *); +_off64_t _fseeko64_r (struct _reent *, FILE *, _off64_t, int); +int _fgetpos64_r (struct _reent *, FILE *, _fpos64_t *); +int _fsetpos64_r (struct _reent *, FILE *, const _fpos64_t *); +FILE * _tmpfile64_r (struct _reent *); +#endif /* !__CYGWIN__ */ +#endif /* __LARGE64_FILES */ + +/* + * Routines internal to the implementation. + */ + +int __srget_r (struct _reent *, FILE *); +int __swbuf_r (struct _reent *, int, FILE *); + +/* + * Stdio function-access interface. + */ + +#if __BSD_VISIBLE +# ifdef __LARGE64_FILES +FILE *funopen (const void *__cookie, + int (*__readfn)(void *__c, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__c, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + _fpos64_t (*__seekfn)(void *__c, _fpos64_t __off, int __whence), + int (*__closefn)(void *__c)); +FILE *_funopen_r (struct _reent *, const void *__cookie, + int (*__readfn)(void *__c, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__c, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + _fpos64_t (*__seekfn)(void *__c, _fpos64_t __off, int __whence), + int (*__closefn)(void *__c)); +# else +FILE *funopen (const void *__cookie, + int (*__readfn)(void *__cookie, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__cookie, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + fpos_t (*__seekfn)(void *__cookie, fpos_t __off, int __whence), + int (*__closefn)(void *__cookie)); +FILE *_funopen_r (struct _reent *, const void *__cookie, + int (*__readfn)(void *__cookie, char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + int (*__writefn)(void *__cookie, const char *__buf, + _READ_WRITE_BUFSIZE_TYPE __n), + fpos_t (*__seekfn)(void *__cookie, fpos_t __off, int __whence), + int (*__closefn)(void *__cookie)); +# endif /* !__LARGE64_FILES */ + +# define fropen(__cookie, __fn) funopen(__cookie, __fn, NULL, NULL, NULL) +# define fwopen(__cookie, __fn) funopen(__cookie, NULL, __fn, NULL, NULL) +#endif /* __BSD_VISIBLE */ + +#if __GNU_VISIBLE +typedef ssize_t cookie_read_function_t(void *__cookie, char *__buf, size_t __n); +typedef ssize_t cookie_write_function_t(void *__cookie, const char *__buf, + size_t __n); +# ifdef __LARGE64_FILES +typedef int cookie_seek_function_t(void *__cookie, _off64_t *__off, + int __whence); +# else +typedef int cookie_seek_function_t(void *__cookie, off_t *__off, int __whence); +# endif /* !__LARGE64_FILES */ +typedef int cookie_close_function_t(void *__cookie); +typedef struct +{ + /* These four struct member names are dictated by Linux; hopefully, + they don't conflict with any macros. */ + cookie_read_function_t *read; + cookie_write_function_t *write; + cookie_seek_function_t *seek; + cookie_close_function_t *close; +} cookie_io_functions_t; +FILE *fopencookie (void *__cookie, + const char *__mode, cookie_io_functions_t __functions); +FILE *_fopencookie_r (struct _reent *, void *__cookie, + const char *__mode, cookie_io_functions_t __functions); +#endif /* __GNU_VISIBLE */ + +#ifndef __CUSTOM_FILE_IO__ +/* + * The __sfoo macros are here so that we can + * define function versions in the C library. + */ +#define __sgetc_raw_r(__ptr, __f) (--(__f)->_r < 0 ? __srget_r(__ptr, __f) : (int)(*(__f)->_p++)) + +#ifdef __SCLE +/* For a platform with CR/LF, additional logic is required by + __sgetc_r which would otherwise simply be a macro; therefore we + use an inlined function. The function is only meant to be inlined + in place as used and the function body should never be emitted. + + There are two possible means to this end when compiling with GCC, + one when compiling with a standard C99 compiler, and for other + compilers we're just stuck. At the moment, this issue only + affects the Cygwin target, so we'll most likely be using GCC. */ + +_ELIDABLE_INLINE int __sgetc_r(struct _reent *__ptr, FILE *__p); + +_ELIDABLE_INLINE int __sgetc_r(struct _reent *__ptr, FILE *__p) + { + int __c = __sgetc_raw_r(__ptr, __p); + if ((__p->_flags & __SCLE) && (__c == '\r')) + { + int __c2 = __sgetc_raw_r(__ptr, __p); + if (__c2 == '\n') + __c = __c2; + else + ungetc(__c2, __p); + } + return __c; + } +#else +#define __sgetc_r(__ptr, __p) __sgetc_raw_r(__ptr, __p) +#endif + +#ifdef __GNUC__ +_ELIDABLE_INLINE int __sputc_r(struct _reent *_ptr, int _c, FILE *_p) { +#ifdef __SCLE + if ((_p->_flags & __SCLE) && _c == '\n') + __sputc_r (_ptr, '\r', _p); +#endif + if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) + return (*_p->_p++ = _c); + else + return (__swbuf_r(_ptr, _c, _p)); +} +#else +/* + * This has been tuned to generate reasonable code on the vax using pcc + */ +#define __sputc_raw_r(__ptr, __c, __p) \ + (--(__p)->_w < 0 ? \ + (__p)->_w >= (__p)->_lbfsize ? \ + (*(__p)->_p = (__c)), *(__p)->_p != '\n' ? \ + (int)*(__p)->_p++ : \ + __swbuf_r(__ptr, '\n', __p) : \ + __swbuf_r(__ptr, (int)(__c), __p) : \ + (*(__p)->_p = (__c), (int)*(__p)->_p++)) +#ifdef __SCLE +#define __sputc_r(__ptr, __c, __p) \ + ((((__p)->_flags & __SCLE) && ((__c) == '\n')) \ + ? __sputc_raw_r(__ptr, '\r', (__p)) : 0 , \ + __sputc_raw_r((__ptr), (__c), (__p))) +#else +#define __sputc_r(__ptr, __c, __p) __sputc_raw_r(__ptr, __c, __p) +#endif +#endif + +#define __sfeof(p) ((int)(((p)->_flags & __SEOF) != 0)) +#define __sferror(p) ((int)(((p)->_flags & __SERR) != 0)) +#define __sclearerr(p) ((void)((p)->_flags &= ~(__SERR|__SEOF))) +#define __sfileno(p) ((p)->_file) + +#ifndef __cplusplus +#ifndef _REENT_SMALL +#define feof(p) __sfeof(p) +#define ferror(p) __sferror(p) +#define clearerr(p) __sclearerr(p) + +#if __MISC_VISIBLE +#define feof_unlocked(p) __sfeof(p) +#define ferror_unlocked(p) __sferror(p) +#define clearerr_unlocked(p) __sclearerr(p) +#endif /* __MISC_VISIBLE */ +#endif /* _REENT_SMALL */ + +#if 0 /* __POSIX_VISIBLE - FIXME: must initialize stdio first, use fn */ +#define fileno(p) __sfileno(p) +#endif + +static __inline int +_getchar_unlocked(void) +{ + struct _reent *_ptr; + + _ptr = _REENT; + return (__sgetc_r(_ptr, _stdin_r(_ptr))); +} + +static __inline int +_putchar_unlocked(int _c) +{ + struct _reent *_ptr; + + _ptr = _REENT; + return (__sputc_r(_ptr, _c, _stdout_r(_ptr))); +} + +#ifdef __SINGLE_THREAD__ +#define getc(_p) __sgetc_r(_REENT, _p) +#define putc(_c, _p) __sputc_r(_REENT, _c, _p) +#define getchar() _getchar_unlocked() +#define putchar(_c) _putchar_unlocked(_c) +#endif /* __SINGLE_THREAD__ */ + +#if __MISC_VISIBLE || __POSIX_VISIBLE +#define getchar_unlocked() _getchar_unlocked() +#define putchar_unlocked(_c) _putchar_unlocked(_c) +#endif +#endif /* __cplusplus */ + +#if __MISC_VISIBLE +/* fast always-buffered version, true iff error */ +#define fast_putc(x,p) (--(p)->_w < 0 ? \ + __swbuf_r(_REENT, (int)(x), p) == EOF : (*(p)->_p = (x), (p)->_p++, 0)) +#endif + +#if __GNU_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 600) +#define L_cuserid 9 /* posix says it goes in stdio.h :( */ +#endif +#if __POSIX_VISIBLE +#define L_ctermid 16 +#endif + +#else /* __CUSTOM_FILE_IO__ */ + +#define getchar() getc(stdin) +#define putchar(x) putc(x, stdout) + +#if __MISC_VISIBLE || __POSIX_VISIBLE +#define getchar_unlocked() getc_unlocked(stdin) +#define putchar_unlocked(x) putc_unlocked(x, stdout) +#endif + +#endif /* !__CUSTOM_FILE_IO__ */ + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STDIO_H_ */ diff --git a/lib/include/stdio_ext.h b/lib/include/stdio_ext.h new file mode 100644 index 0000000..231262d --- /dev/null +++ b/lib/include/stdio_ext.h @@ -0,0 +1,79 @@ +/* + * stdio_ext.h + * + * Definitions for I/O internal operations, originally from Solaris. + */ + +#ifndef _STDIO_EXT_H_ +#define _STDIO_EXT_H_ + +#ifdef __rtems__ +#error " not supported" +#endif + +#include + +#define FSETLOCKING_QUERY 0 +#define FSETLOCKING_INTERNAL 1 +#define FSETLOCKING_BYCALLER 2 + +_BEGIN_STD_C + +void __fpurge (FILE *); +int __fsetlocking (FILE *, int); + +/* TODO: + + void _flushlbf (void); +*/ + +#ifdef __GNUC__ + +_ELIDABLE_INLINE size_t +__fbufsize (FILE *__fp) { return (size_t) __fp->_bf._size; } + +_ELIDABLE_INLINE int +__freading (FILE *__fp) { return (__fp->_flags & __SRD) != 0; } + +_ELIDABLE_INLINE int +__fwriting (FILE *__fp) { return (__fp->_flags & __SWR) != 0; } + +_ELIDABLE_INLINE int +__freadable (FILE *__fp) { return (__fp->_flags & (__SRD | __SRW)) != 0; } + +_ELIDABLE_INLINE int +__fwritable (FILE *__fp) { return (__fp->_flags & (__SWR | __SRW)) != 0; } + +_ELIDABLE_INLINE int +__flbf (FILE *__fp) { return (__fp->_flags & __SLBF) != 0; } + +_ELIDABLE_INLINE size_t +__fpending (FILE *__fp) { return __fp->_p - __fp->_bf._base; } + +#else + +size_t __fbufsize (FILE *); +int __freading (FILE *); +int __fwriting (FILE *); +int __freadable (FILE *); +int __fwritable (FILE *); +int __flbf (FILE *); +size_t __fpending (FILE *); + +#ifndef __cplusplus + +#define __fbufsize(__fp) ((size_t) (__fp)->_bf._size) +#define __freading(__fp) (((__fp)->_flags & __SRD) != 0) +#define __fwriting(__fp) (((__fp)->_flags & __SWR) != 0) +#define __freadable(__fp) (((__fp)->_flags & (__SRD | __SRW)) != 0) +#define __fwritable(__fp) (((__fp)->_flags & (__SWR | __SRW)) != 0) +#define __flbf(__fp) (((__fp)->_flags & __SLBF) != 0) +#define __fpending(__fp) ((size_t) ((__fp)->_p - (__fp)->_bf._base)) + +#endif /* __cplusplus */ + +#endif /* __GNUC__ */ + +_END_STD_C + +#endif /* _STDIO_EXT_H_ */ diff --git a/lib/include/stdlib.h b/lib/include/stdlib.h new file mode 100644 index 0000000..15b3494 --- /dev/null +++ b/lib/include/stdlib.h @@ -0,0 +1,345 @@ +/* + * stdlib.h + * + * Definitions for common types, variables, and functions. + */ + +#ifndef _STDLIB_H_ +#define _STDLIB_H_ + +#include +#include "_ansi.h" + +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#include + +#include +#include +#include +#ifndef __STRICT_ANSI__ +#include +#endif + +#ifdef __CYGWIN__ +#include +#endif + +#if __GNU_VISIBLE +#include +#endif + +_BEGIN_STD_C + +typedef struct +{ + int quot; /* quotient */ + int rem; /* remainder */ +} div_t; + +typedef struct +{ + long quot; /* quotient */ + long rem; /* remainder */ +} ldiv_t; + +#if __ISO_C_VISIBLE >= 1999 +typedef struct +{ + long long int quot; /* quotient */ + long long int rem; /* remainder */ +} lldiv_t; +#endif + +#ifndef __compar_fn_t_defined +#define __compar_fn_t_defined +typedef int (*__compar_fn_t) (const void *, const void *); +#endif + +#define EXIT_FAILURE 1 +#define EXIT_SUCCESS 0 + +#define RAND_MAX __RAND_MAX + +int __locale_mb_cur_max (void); + +#define MB_CUR_MAX __locale_mb_cur_max() + +void abort (void) _ATTRIBUTE ((__noreturn__)); +int abs (int); +#if __BSD_VISIBLE +__uint32_t arc4random (void); +__uint32_t arc4random_uniform (__uint32_t); +void arc4random_buf (void *, size_t); +#endif +int atexit (void (*__func)(void)); +double atof (const char *__nptr); +#if __MISC_VISIBLE +float atoff (const char *__nptr); +#endif +int atoi (const char *__nptr); +int _atoi_r (struct _reent *, const char *__nptr); +long atol (const char *__nptr); +long _atol_r (struct _reent *, const char *__nptr); +void * bsearch (const void *__key, + const void *__base, + size_t __nmemb, + size_t __size, + __compar_fn_t _compar); +void *calloc(size_t, size_t) __malloc_like __result_use_check + __alloc_size2(1, 2) _NOTHROW; +div_t div (int __numer, int __denom); +void exit (int __status) _ATTRIBUTE ((__noreturn__)); +void free (void *) _NOTHROW; +char * getenv (const char *__string); +char * _getenv_r (struct _reent *, const char *__string); +#if __GNU_VISIBLE +char * secure_getenv (const char *__string); +#endif +char * _findenv (const char *, int *); +char * _findenv_r (struct _reent *, const char *, int *); +#if __POSIX_VISIBLE >= 200809 +extern char *suboptarg; /* getsubopt(3) external variable */ +int getsubopt (char **, char * const *, char **); +#endif +long labs (long); +ldiv_t ldiv (long __numer, long __denom); +void *malloc(size_t) __malloc_like __result_use_check __alloc_size(1) _NOTHROW; +int mblen (const char *, size_t); +int _mblen_r (struct _reent *, const char *, size_t, _mbstate_t *); +int mbtowc (wchar_t *__restrict, const char *__restrict, size_t); +int _mbtowc_r (struct _reent *, wchar_t *__restrict, const char *__restrict, size_t, _mbstate_t *); +int wctomb (char *, wchar_t); +int _wctomb_r (struct _reent *, char *, wchar_t, _mbstate_t *); +size_t mbstowcs (wchar_t *__restrict, const char *__restrict, size_t); +size_t _mbstowcs_r (struct _reent *, wchar_t *__restrict, const char *__restrict, size_t, _mbstate_t *); +size_t wcstombs (char *__restrict, const wchar_t *__restrict, size_t); +size_t _wcstombs_r (struct _reent *, char *__restrict, const wchar_t *__restrict, size_t, _mbstate_t *); +#ifndef _REENT_ONLY +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200809 +char * mkdtemp (char *); +#endif +#if __GNU_VISIBLE +int mkostemp (char *, int); +int mkostemps (char *, int, int); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 4 +int mkstemp (char *); +#endif +#if __MISC_VISIBLE +int mkstemps (char *, int); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112) +char * mktemp (char *) _ATTRIBUTE ((__deprecated__("the use of `mktemp' is dangerous; use `mkstemp' instead"))); +#endif +#endif /* !_REENT_ONLY */ +char * _mkdtemp_r (struct _reent *, char *); +int _mkostemp_r (struct _reent *, char *, int); +int _mkostemps_r (struct _reent *, char *, int, int); +int _mkstemp_r (struct _reent *, char *); +int _mkstemps_r (struct _reent *, char *, int); +char * _mktemp_r (struct _reent *, char *) _ATTRIBUTE ((__deprecated__("the use of `mktemp' is dangerous; use `mkstemp' instead"))); +void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t _compar); +int rand (void); +void *realloc(void *, size_t) __result_use_check __alloc_size(2) _NOTHROW; +#if __BSD_VISIBLE +void *reallocarray(void *, size_t, size_t) __result_use_check __alloc_size2(2, 3); +void *reallocf(void *, size_t) __result_use_check __alloc_size(2); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +char * realpath (const char *__restrict path, char *__restrict resolved_path); +#endif +#if __BSD_VISIBLE +int rpmatch (const char *response); +#endif +#if __XSI_VISIBLE +void setkey (const char *__key); +#endif +void srand (unsigned __seed); +double strtod (const char *__restrict __n, char **__restrict __end_PTR); +double _strtod_r (struct _reent *,const char *__restrict __n, char **__restrict __end_PTR); +#if __ISO_C_VISIBLE >= 1999 +float strtof (const char *__restrict __n, char **__restrict __end_PTR); +#endif +#if __MISC_VISIBLE +/* the following strtodf interface is deprecated...use strtof instead */ +# ifndef strtodf +# define strtodf strtof +# endif +#endif +long strtol (const char *__restrict __n, char **__restrict __end_PTR, int __base); +long _strtol_r (struct _reent *,const char *__restrict __n, char **__restrict __end_PTR, int __base); +unsigned long strtoul (const char *__restrict __n, char **__restrict __end_PTR, int __base); +unsigned long _strtoul_r (struct _reent *,const char *__restrict __n, char **__restrict __end_PTR, int __base); + +#if __GNU_VISIBLE +double strtod_l (const char *__restrict, char **__restrict, locale_t); +float strtof_l (const char *__restrict, char **__restrict, locale_t); +#ifdef _HAVE_LONG_DOUBLE +extern long double strtold_l (const char *__restrict, char **__restrict, + locale_t); +#endif /* _HAVE_LONG_DOUBLE */ +long strtol_l (const char *__restrict, char **__restrict, int, locale_t); +unsigned long strtoul_l (const char *__restrict, char **__restrict, int, + locale_t __loc); +long long strtoll_l (const char *__restrict, char **__restrict, int, locale_t); +unsigned long long strtoull_l (const char *__restrict, char **__restrict, int, + locale_t __loc); +#endif + +int system (const char *__string); + +#if __SVID_VISIBLE || __XSI_VISIBLE >= 4 +long a64l (const char *__input); +char * l64a (long __input); +char * _l64a_r (struct _reent *,long __input); +#endif +#if __MISC_VISIBLE +int on_exit (void (*__func)(int, void *),void *__arg); +#endif +#if __ISO_C_VISIBLE >= 1999 +void _Exit (int __status) _ATTRIBUTE ((__noreturn__)); +#endif +#if __SVID_VISIBLE || __XSI_VISIBLE +int putenv (char *__string); +#endif +int _putenv_r (struct _reent *, char *__string); +void * _reallocf_r (struct _reent *, void *, size_t); +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +int setenv (const char *__string, const char *__value, int __overwrite); +#endif +int _setenv_r (struct _reent *, const char *__string, const char *__value, int __overwrite); + +#if __XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112 +char * gcvt (double,int,char *); +char * gcvtf (float,int,char *); +char * fcvt (double,int,int *,int *); +char * fcvtf (float,int,int *,int *); +char * ecvt (double,int,int *,int *); +char * ecvtbuf (double, int, int*, int*, char *); +char * fcvtbuf (double, int, int*, int*, char *); +char * ecvtf (float,int,int *,int *); +#endif +char * __itoa (int, char *, int); +char * __utoa (unsigned, char *, int); +#if __MISC_VISIBLE +char * itoa (int, char *, int); +char * utoa (unsigned, char *, int); +#endif +#if __POSIX_VISIBLE +int rand_r (unsigned *__seed); +#endif + +#if __SVID_VISIBLE || __XSI_VISIBLE +double drand48 (void); +double _drand48_r (struct _reent *); +double erand48 (unsigned short [3]); +double _erand48_r (struct _reent *, unsigned short [3]); +long jrand48 (unsigned short [3]); +long _jrand48_r (struct _reent *, unsigned short [3]); +void lcong48 (unsigned short [7]); +void _lcong48_r (struct _reent *, unsigned short [7]); +long lrand48 (void); +long _lrand48_r (struct _reent *); +long mrand48 (void); +long _mrand48_r (struct _reent *); +long nrand48 (unsigned short [3]); +long _nrand48_r (struct _reent *, unsigned short [3]); +unsigned short * + seed48 (unsigned short [3]); +unsigned short * + _seed48_r (struct _reent *, unsigned short [3]); +void srand48 (long); +void _srand48_r (struct _reent *, long); +#endif /* __SVID_VISIBLE || __XSI_VISIBLE */ +#if __SVID_VISIBLE || __XSI_VISIBLE >= 4 || __BSD_VISIBLE +char * initstate (unsigned, char *, size_t); +long random (void); +char * setstate (char *); +void srandom (unsigned); +#endif +#if __ISO_C_VISIBLE >= 1999 +long long atoll (const char *__nptr); +#endif +long long _atoll_r (struct _reent *, const char *__nptr); +#if __ISO_C_VISIBLE >= 1999 +long long llabs (long long); +lldiv_t lldiv (long long __numer, long long __denom); +long long strtoll (const char *__restrict __n, char **__restrict __end_PTR, int __base); +#endif +long long _strtoll_r (struct _reent *, const char *__restrict __n, char **__restrict __end_PTR, int __base); +#if __ISO_C_VISIBLE >= 1999 +unsigned long long strtoull (const char *__restrict __n, char **__restrict __end_PTR, int __base); +#endif +unsigned long long _strtoull_r (struct _reent *, const char *__restrict __n, char **__restrict __end_PTR, int __base); + +#ifndef __CYGWIN__ +#if __MISC_VISIBLE +void cfree (void *); +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +int unsetenv (const char *__string); +#endif +int _unsetenv_r (struct _reent *, const char *__string); +#endif /* !__CYGWIN__ */ + +#if __POSIX_VISIBLE >= 200112 +int posix_memalign (void **, size_t, size_t) __nonnull((1)) + __result_use_check; +#endif + +char * _dtoa_r (struct _reent *, double, int, int, int *, int*, char**); +#ifndef __CYGWIN__ +void * _malloc_r (struct _reent *, size_t) _NOTHROW; +void * _calloc_r (struct _reent *, size_t, size_t) _NOTHROW; +void _free_r (struct _reent *, void *) _NOTHROW; +void * _realloc_r (struct _reent *, void *, size_t) _NOTHROW; +void _mstats_r (struct _reent *, char *); +#endif +int _system_r (struct _reent *, const char *); + +void __eprintf (const char *, const char *, unsigned int, const char *); + +/* There are two common qsort_r variants. If you request + _BSD_SOURCE, you get the BSD version; otherwise you get the GNU + version. We want that #undef qsort_r will still let you + invoke the underlying function, but that requires gcc support. */ +#if __GNU_VISIBLE +void qsort_r (void *__base, size_t __nmemb, size_t __size, int (*_compar)(const void *, const void *, void *), void *__thunk); +#elif __BSD_VISIBLE +# ifdef __GNUC__ +void qsort_r (void *__base, size_t __nmemb, size_t __size, void *__thunk, int (*_compar)(void *, const void *, const void *)) + __asm__ (__ASMNAME ("__bsd_qsort_r")); +# else +void __bsd_qsort_r (void *__base, size_t __nmemb, size_t __size, void *__thunk, int (*_compar)(void *, const void *, const void *)); +# define qsort_r __bsd_qsort_r +# endif +#endif + +/* On platforms where long double equals double. */ +#ifdef _HAVE_LONG_DOUBLE +extern long double _strtold_r (struct _reent *, const char *__restrict, char **__restrict); +#if __ISO_C_VISIBLE >= 1999 +extern long double strtold (const char *__restrict, char **__restrict); +#endif +#endif /* _HAVE_LONG_DOUBLE */ + +/* + * If we're in a mode greater than C99, expose C11 functions. + */ +#if __ISO_C_VISIBLE >= 2011 +void * aligned_alloc(size_t, size_t) __malloc_like __alloc_align(1) + __alloc_size(2) __result_use_check; +int at_quick_exit(void (*)(void)); +_Noreturn void + quick_exit(int); +#endif /* __ISO_C_VISIBLE >= 2011 */ + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STDLIB_H_ */ diff --git a/lib/include/string.h b/lib/include/string.h new file mode 100644 index 0000000..32199c0 --- /dev/null +++ b/lib/include/string.h @@ -0,0 +1,183 @@ +/* + * string.h + * + * Definitions for memory and string functions. + */ + +#ifndef _STRING_H_ +#define _STRING_H_ + +#include "_ansi.h" +#include +#include +#include + +#define __need_size_t +#define __need_NULL +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#if __BSD_VISIBLE +#include +#endif + +_BEGIN_STD_C + +void * memchr (const void *, int, size_t); +int memcmp (const void *, const void *, size_t); +void * memcpy (void *__restrict, const void *__restrict, size_t); +void * memmove (void *, const void *, size_t); +void * memset (void *, int, size_t); +char *strcat (char *__restrict, const char *__restrict); +char *strchr (const char *, int); +int strcmp (const char *, const char *); +int strcoll (const char *, const char *); +char *strcpy (char *__restrict, const char *__restrict); +size_t strcspn (const char *, const char *); +char *strerror (int); +size_t strlen (const char *); +char *strncat (char *__restrict, const char *__restrict, size_t); +int strncmp (const char *, const char *, size_t); +char *strncpy (char *__restrict, const char *__restrict, size_t); +char *strpbrk (const char *, const char *); +char *strrchr (const char *, int); +size_t strspn (const char *, const char *); +char *strstr (const char *, const char *); +#ifndef _REENT_ONLY +char *strtok (char *__restrict, const char *__restrict); +#endif +size_t strxfrm (char *__restrict, const char *__restrict, size_t); + +#if __POSIX_VISIBLE >= 200809 +int strcoll_l (const char *, const char *, locale_t); +char *strerror_l (int, locale_t); +size_t strxfrm_l (char *__restrict, const char *__restrict, size_t, locale_t); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE +char *strtok_r (char *__restrict, const char *__restrict, char **__restrict); +#endif +#if __BSD_VISIBLE +int timingsafe_bcmp (const void *, const void *, size_t); +int timingsafe_memcmp (const void *, const void *, size_t); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE +void * memccpy (void *__restrict, const void *__restrict, int, size_t); +#endif +#if __GNU_VISIBLE +void * mempcpy (void *, const void *, size_t); +void * memmem (const void *, size_t, const void *, size_t); +void * memrchr (const void *, int, size_t); +void * rawmemchr (const void *, int); +#endif +#if __POSIX_VISIBLE >= 200809 +char *stpcpy (char *__restrict, const char *__restrict); +char *stpncpy (char *__restrict, const char *__restrict, size_t); +#endif +#if __GNU_VISIBLE +char *strcasestr (const char *, const char *); +char *strchrnul (const char *, int); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4 +char *strdup (const char *) __malloc_like __result_use_check; +#endif +char *_strdup_r (struct _reent *, const char *); +#if __POSIX_VISIBLE >= 200809 +char *strndup (const char *, size_t) __malloc_like __result_use_check; +#endif +char *_strndup_r (struct _reent *, const char *, size_t); + +/* There are two common strerror_r variants. If you request + _GNU_SOURCE, you get the GNU version; otherwise you get the POSIX + version. POSIX requires that #undef strerror_r will still let you + invoke the underlying function, but that requires gcc support. */ +#if __GNU_VISIBLE +char *strerror_r (int, char *, size_t); +#elif __POSIX_VISIBLE >= 200112 +# ifdef __GNUC__ +int strerror_r (int, char *, size_t) +#ifdef __ASMNAME + __asm__ (__ASMNAME ("__xpg_strerror_r")) +#endif + ; +# else +int __xpg_strerror_r (int, char *, size_t); +# define strerror_r __xpg_strerror_r +# endif +#endif + +/* Reentrant version of strerror. */ +char * _strerror_r (struct _reent *, int, int, int *); + +#if __BSD_VISIBLE +size_t strlcat (char *, const char *, size_t); +size_t strlcpy (char *, const char *, size_t); +#endif +#if __POSIX_VISIBLE >= 200809 +size_t strnlen (const char *, size_t); +#endif +#if __BSD_VISIBLE +char *strsep (char **, const char *); +#endif +#if __BSD_VISIBLE +char *strnstr(const char *, const char *, size_t) __pure; +#endif + +#if __MISC_VISIBLE +char *strlwr (char *); +char *strupr (char *); +#endif + +#if __POSIX_VISIBLE >= 200809 +char *strsignal (int __signo); +#endif + +#ifdef __CYGWIN__ +int strtosigno (const char *__name); +#endif + +#if __GNU_VISIBLE +int strverscmp (const char *, const char *); +#endif + +#if __GNU_VISIBLE && defined(__GNUC__) +#define strdupa(__s) \ + (__extension__ ({const char *__sin = (__s); \ + size_t __len = strlen (__sin) + 1; \ + char * __sout = (char *) __builtin_alloca (__len); \ + (char *) memcpy (__sout, __sin, __len);})) +#define strndupa(__s, __n) \ + (__extension__ ({const char *__sin = (__s); \ + size_t __len = strnlen (__sin, (__n)) + 1; \ + char *__sout = (char *) __builtin_alloca (__len); \ + __sout[__len-1] = '\0'; \ + (char *) memcpy (__sout, __sin, __len-1);})) +#endif /* __GNU_VISIBLE && __GNUC__ */ + +/* There are two common basename variants. If you do NOT #include + and you do + + #define _GNU_SOURCE + #include + + you get the GNU version. Otherwise you get the POSIX versionfor which you + should #include i for the function prototype. POSIX requires that + #undef basename will still let you invoke the underlying function. However, + this also implies that the POSIX version is used in this case. That's made + sure here. */ +#if __GNU_VISIBLE && !defined(basename) +# define basename basename +char *__nonnull ((1)) basename (const char *) __asm__(__ASMNAME("__gnu_basename")); +#endif + +#include + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STRING_H_ */ diff --git a/lib/include/strings.h b/lib/include/strings.h new file mode 100644 index 0000000..f0f7ee1 --- /dev/null +++ b/lib/include/strings.h @@ -0,0 +1,80 @@ +/*- + * Copyright (c) 2002 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: head/include/strings.h 272673 2014-10-07 04:54:11Z delphij $ + */ + +#ifndef _STRINGS_H_ +#define _STRINGS_H_ + +#include +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#ifndef _SIZE_T_DECLARED +typedef __size_t size_t; +#define _SIZE_T_DECLARED +#endif + +__BEGIN_DECLS +#if __BSD_VISIBLE || __POSIX_VISIBLE <= 200112 +int bcmp(const void *, const void *, size_t) __pure; /* LEGACY */ +void bcopy(const void *, void *, size_t); /* LEGACY */ +void bzero(void *, size_t); /* LEGACY */ +#endif +#if __BSD_VISIBLE +void explicit_bzero(void *, size_t); +#endif +#if __MISC_VISIBLE || __POSIX_VISIBLE < 200809 || __XSI_VISIBLE >= 700 +int ffs(int) __pure2; +#endif +#if __BSD_VISIBLE +int ffsl(long) __pure2; +int ffsll(long long) __pure2; +int fls(int) __pure2; +int flsl(long) __pure2; +int flsll(long long) __pure2; +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE <= 200112 +char *index(const char *, int) __pure; /* LEGACY */ +char *rindex(const char *, int) __pure; /* LEGACY */ +#endif +int strcasecmp(const char *, const char *) __pure; +int strncasecmp(const char *, const char *, size_t) __pure; + +#if __POSIX_VISIBLE >= 200809 +int strcasecmp_l (const char *, const char *, locale_t); +int strncasecmp_l (const char *, const char *, size_t, locale_t); +#endif +__END_DECLS + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _STRINGS_H_ */ diff --git a/lib/include/sys/_default_fcntl.h b/lib/include/sys/_default_fcntl.h new file mode 100644 index 0000000..48914c9 --- /dev/null +++ b/lib/include/sys/_default_fcntl.h @@ -0,0 +1,240 @@ + +#ifndef _SYS__DEFAULT_FCNTL_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS__DEFAULT_FCNTL_H_ +#include <_ansi.h> +#include +#define _FOPEN (-1) /* from sys/file.h, kernel use only */ +#define _FREAD 0x0001 /* read enabled */ +#define _FWRITE 0x0002 /* write enabled */ +#define _FAPPEND 0x0008 /* append (writes guaranteed at the end) */ +#define _FMARK 0x0010 /* internal; mark during gc() */ +#define _FDEFER 0x0020 /* internal; defer for next gc pass */ +#define _FASYNC 0x0040 /* signal pgrp when data ready */ +#define _FSHLOCK 0x0080 /* BSD flock() shared lock present */ +#define _FEXLOCK 0x0100 /* BSD flock() exclusive lock present */ +#define _FCREAT 0x0200 /* open with file create */ +#define _FTRUNC 0x0400 /* open with truncation */ +#define _FEXCL 0x0800 /* error on open if file exists */ +#define _FNBIO 0x1000 /* non blocking I/O (sys5 style) */ +#define _FSYNC 0x2000 /* do all writes synchronously */ +#define _FNONBLOCK 0x4000 /* non blocking I/O (POSIX style) */ +#define _FNDELAY _FNONBLOCK /* non blocking I/O (4.2 style) */ +#define _FNOCTTY 0x8000 /* don't assign a ctty on this open */ +#if defined (__CYGWIN__) +#define _FBINARY 0x10000 +#define _FTEXT 0x20000 +#endif +#define _FNOINHERIT 0x40000 +#define _FDIRECT 0x80000 +#define _FNOFOLLOW 0x100000 +#define _FDIRECTORY 0x200000 +#define _FEXECSRCH 0x400000 +#if defined (__CYGWIN__) +#define _FTMPFILE 0x800000 +#define _FNOATIME 0x1000000 +#define _FPATH 0x2000000 +#endif + +#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) + +/* + * Flag values for open(2) and fcntl(2) + * The kernel adds 1 to the open modes to turn it into some + * combination of FREAD and FWRITE. + */ +#define O_RDONLY 0 /* +1 == FREAD */ +#define O_WRONLY 1 /* +1 == FWRITE */ +#define O_RDWR 2 /* +1 == FREAD|FWRITE */ +#define O_APPEND _FAPPEND +#define O_CREAT _FCREAT +#define O_TRUNC _FTRUNC +#define O_EXCL _FEXCL +#define O_SYNC _FSYNC +/* O_NDELAY _FNDELAY set in include/fcntl.h */ +/* O_NDELAY _FNBIO set in include/fcntl.h */ +#define O_NONBLOCK _FNONBLOCK +#define O_NOCTTY _FNOCTTY + +/* POSIX-1.2008 specific flags */ +#if __POSIX_VISIBLE >= 200809 +#define O_CLOEXEC _FNOINHERIT +#define O_NOFOLLOW _FNOFOLLOW +#define O_DIRECTORY _FDIRECTORY +#define O_EXEC _FEXECSRCH +#define O_SEARCH _FEXECSRCH +#endif + +#if __BSD_VISIBLE +#define O_DIRECT _FDIRECT +#endif + +#if defined (__CYGWIN__) +#define O_BINARY _FBINARY +#define O_TEXT _FTEXT +#define O_DSYNC _FSYNC +#define O_RSYNC _FSYNC + +/* Linux-specific flags */ +#if __GNU_VISIBLE +#define O_TMPFILE _FTMPFILE +#define O_NOATIME _FNOATIME +#define O_PATH _FPATH +#endif +#endif + +#if __MISC_VISIBLE + +/* + * Flags that work for fcntl(fd, F_SETFL, FXXXX) + */ +#define FAPPEND _FAPPEND +#define FSYNC _FSYNC +#define FASYNC _FASYNC +#define FNBIO _FNBIO +#define FNONBIO _FNONBLOCK /* XXX fix to be NONBLOCK everywhere */ +#define FNDELAY _FNDELAY + +/* + * Flags that are disallowed for fcntl's (FCNTLCANT); + * used for opens, internal state, or locking. + */ +#define FREAD _FREAD +#define FWRITE _FWRITE +#define FMARK _FMARK +#define FDEFER _FDEFER +#define FSHLOCK _FSHLOCK +#define FEXLOCK _FEXLOCK + +/* + * The rest of the flags, used only for opens + */ +#define FOPEN _FOPEN +#define FCREAT _FCREAT +#define FTRUNC _FTRUNC +#define FEXCL _FEXCL +#define FNOCTTY _FNOCTTY + +#endif /* __MISC_VISIBLE */ + +#if __BSD_VISIBLE +#define FNONBLOCK _FNONBLOCK +#endif /* __BSD_VISIBLE */ + +/* XXX close on exec request; must match UF_EXCLOSE in user.h */ +#define FD_CLOEXEC 1 /* posix */ + +/* fcntl(2) requests */ +#define F_DUPFD 0 /* Duplicate fildes */ +#define F_GETFD 1 /* Get fildes flags (close on exec) */ +#define F_SETFD 2 /* Set fildes flags (close on exec) */ +#define F_GETFL 3 /* Get file flags */ +#define F_SETFL 4 /* Set file flags */ +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +#define F_GETOWN 5 /* Get owner - for ASYNC */ +#define F_SETOWN 6 /* Set owner - for ASYNC */ +#endif /* __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 */ +#define F_GETLK 7 /* Get record-locking information */ +#define F_SETLK 8 /* Set or Clear a record-lock (Non-Blocking) */ +#define F_SETLKW 9 /* Set or Clear a record-lock (Blocking) */ +#if __MISC_VISIBLE +#define F_RGETLK 10 /* Test a remote lock to see if it is blocked */ +#define F_RSETLK 11 /* Set or unlock a remote lock */ +#define F_CNVT 12 /* Convert a fhandle to an open fd */ +#define F_RSETLKW 13 /* Set or Clear remote record-lock(Blocking) */ +#endif /* __MISC_VISIBLE */ +#if __POSIX_VISIBLE >= 200809 +#define F_DUPFD_CLOEXEC 14 /* As F_DUPFD, but set close-on-exec flag */ +#endif + +/* fcntl(2) flags (l_type field of flock structure) */ +#define F_RDLCK 1 /* read lock */ +#define F_WRLCK 2 /* write lock */ +#define F_UNLCK 3 /* remove lock(s) */ +#if __MISC_VISIBLE +#define F_UNLKSYS 4 /* remove remote locks for a given system */ +#endif /* __MISC_VISIBLE */ + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200809 +/* Special descriptor value to denote the cwd in calls to openat(2) etc. */ +#define AT_FDCWD -2 + +/* Flag values for faccessat2) et al. */ +#define AT_EACCESS 1 +#define AT_SYMLINK_NOFOLLOW 2 +#define AT_SYMLINK_FOLLOW 4 +#define AT_REMOVEDIR 8 +#if __GNU_VISIBLE +#define AT_EMPTY_PATH 16 +#endif +#endif + +#if __BSD_VISIBLE +/* lock operations for flock(2) */ +#define LOCK_SH 0x01 /* shared file lock */ +#define LOCK_EX 0x02 /* exclusive file lock */ +#define LOCK_NB 0x04 /* don't block when locking */ +#define LOCK_UN 0x08 /* unlock file */ +#endif + +/*#include */ + +#ifndef __CYGWIN__ +/* file segment locking set data type - information passed to system by user */ +struct flock { + short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ + short l_whence; /* flag to choose starting offset */ + long l_start; /* relative offset, in bytes */ + long l_len; /* length, in bytes; 0 means lock to EOF */ + short l_pid; /* returned with F_GETLK */ + short l_xxx; /* reserved for future use */ +}; +#endif /* __CYGWIN__ */ + +#if __MISC_VISIBLE +/* extended file segment locking set data type */ +struct eflock { + short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ + short l_whence; /* flag to choose starting offset */ + long l_start; /* relative offset, in bytes */ + long l_len; /* length, in bytes; 0 means lock to EOF */ + short l_pid; /* returned with F_GETLK */ + short l_xxx; /* reserved for future use */ + long l_rpid; /* Remote process id wanting this lock */ + long l_rsys; /* Remote system id wanting this lock */ +}; +#endif /* __MISC_VISIBLE */ + +#include +#include /* sigh. for the mode bits for open/creat */ + +extern int open (const char *, int, ...); +#if __ATFILE_VISIBLE +extern int openat (int, const char *, int, ...); +#endif +extern int creat (const char *, mode_t); +extern int fcntl (int, int, ...); +#if __BSD_VISIBLE +extern int flock (int, int); +#endif +#if __GNU_VISIBLE +#include +extern int futimesat (int, const char *, const struct timeval [2]); +#endif + +/* Provide _ prototypes for functions provided by some versions + of newlib. */ +#ifdef _LIBC +extern int _open (const char *, int, ...); +extern int _fcntl (int, int, ...); +#ifdef __LARGE64_FILES +extern int _open64 (const char *, int, ...); +#endif +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !_SYS__DEFAULT_FCNTL_H_ */ diff --git a/lib/include/sys/_intsup.h b/lib/include/sys/_intsup.h new file mode 100644 index 0000000..993121b --- /dev/null +++ b/lib/include/sys/_intsup.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _SYS__INTSUP_H +#define _SYS__INTSUP_H + +#include + +#if __GNUC_PREREQ (3, 2) +/* gcc > 3.2 implicitly defines the values we are interested */ +#define __STDINT_EXP(x) __##x##__ +#else +#define __STDINT_EXP(x) x +#include +#endif + +/* Determine how intptr_t and intN_t fastN_t and leastN_t are defined by gcc + for this target. This is used to determine the correct printf() constant in + inttypes.h and other constants in stdint.h. + So we end up with + ?(signed|unsigned) char == 0 + ?(signed|unsigned) short == 1 + ?(signed|unsigned) int == 2 + ?(signed|unsigned) short int == 3 + ?(signed|unsigned) long == 4 + ?(signed|unsigned) long int == 6 + ?(signed|unsigned) long long == 8 + ?(signed|unsigned) long long int == 10 + */ +#pragma push_macro("signed") +#pragma push_macro("unsigned") +#pragma push_macro("char") +#pragma push_macro("short") +#pragma push_macro("__int20") +#pragma push_macro("__int20__") +#pragma push_macro("int") +#pragma push_macro("long") +#undef signed +#undef unsigned +#undef char +#undef short +#undef int +#undef __int20 +#undef __int20__ +#undef long +#define signed +0 +#define unsigned +0 +#define char +0 +#define short +1 +#define __int20 +2 +#define __int20__ +2 +#define int +2 +#define long +4 +#if (__INTPTR_TYPE__ == 8 || __INTPTR_TYPE__ == 10) +#define _INTPTR_EQ_LONGLONG +#elif (__INTPTR_TYPE__ == 4 || __INTPTR_TYPE__ == 6) +#define _INTPTR_EQ_LONG +/* Note - the tests for _INTPTR_EQ_INT and _INTPTR_EQ_SHORT are currently + redundant as the values are not used. But one day they may be needed + and so the tests remain. */ +#elif __INTPTR_TYPE__ == 2 +#define _INTPTR_EQ_INT +#elif (__INTPTR_TYPE__ == 1 || __INTPTR_TYPE__ == 3) +#define _INTPTR_EQ_SHORT +#else +#error "Unable to determine type definition of intptr_t" +#endif +#if (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6) +#define _INT32_EQ_LONG +#elif __INT32_TYPE__ == 2 +/* Nothing to define because int32_t is safe to print as an int. */ +#else +#error "Unable to determine type definition of int32_t" +#endif + +#if (__INT8_TYPE__ == 0) +#define __INT8 "hh" +#elif (__INT8_TYPE__ == 1 || __INT8_TYPE__ == 3) +#define __INT8 "h" +#elif (__INT8_TYPE__ == 2) +#define __INT8 +#elif (__INT8_TYPE__ == 4 || __INT8_TYPE__ == 6) +#define __INT8 "l" +#elif (__INT8_TYPE__ == 8 || __INT8_TYPE__ == 10) +#define __INT8 "ll" +#endif +#if (__INT16_TYPE__ == 1 || __INT16_TYPE__ == 3) +#define __INT16 "h" +#elif (__INT16_TYPE__ == 2) +#define __INT16 +#elif (__INT16_TYPE__ == 4 || __INT16_TYPE__ == 6) +#define __INT16 "l" +#elif (__INT16_TYPE__ == 8 || __INT16_TYPE__ == 10) +#define __INT16 "ll" +#endif +#if (__INT32_TYPE__ == 2) +#define __INT32 +#elif (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6) +#define __INT32 "l" +#elif (__INT32_TYPE__ == 8 || __INT32_TYPE__ == 10) +#define __INT32 "ll" +#endif +#if (__INT64_TYPE__ == 2) +#define __INT64 +#elif (__INT64_TYPE__ == 4 || __INT64_TYPE__ == 6) +#define __INT64 "l" +#elif (__INT64_TYPE__ == 8 || __INT64_TYPE__ == 10) +#define __INT64 "ll" +#endif +#if (__INT_FAST8_TYPE__ == 0) +#define __FAST8 "hh" +#elif (__INT_FAST8_TYPE__ == 1 || __INT_FAST8_TYPE__ == 3) +#define __FAST8 "h" +#elif (__INT_FAST8_TYPE__ == 2) +#define __FAST8 +#elif (__INT_FAST8_TYPE__ == 4 || __INT_FAST8_TYPE__ == 6) +#define __FAST8 "l" +#elif (__INT_FAST8_TYPE__ == 8 || __INT_FAST8_TYPE__ == 10) +#define __FAST8 "ll" +#endif +#if (__INT_FAST16_TYPE__ == 1 || __INT_FAST16_TYPE__ == 3) +#define __FAST16 "h" +#elif (__INT_FAST16_TYPE__ == 2) +#define __FAST16 +#elif (__INT_FAST16_TYPE__ == 4 || __INT_FAST16_TYPE__ == 6) +#define __FAST16 "l" +#elif (__INT_FAST16_TYPE__ == 8 || __INT_FAST16_TYPE__ == 10) +#define __FAST16 "ll" +#endif +#if (__INT_FAST32_TYPE__ == 2) +#define __FAST32 +#elif (__INT_FAST32_TYPE__ == 4 || __INT_FAST32_TYPE__ == 6) +#define __FAST32 "l" +#elif (__INT_FAST32_TYPE__ == 8 || __INT_FAST32_TYPE__ == 10) +#define __FAST32 "ll" +#endif +#if (__INT_FAST64_TYPE__ == 2) +#define __FAST64 +#elif (__INT_FAST64_TYPE__ == 4 || __INT_FAST64_TYPE__ == 6) +#define __FAST64 "l" +#elif (__INT_FAST64_TYPE__ == 8 || __INT_FAST64_TYPE__ == 10) +#define __FAST64 "ll" +#endif + +#if (__INT_LEAST8_TYPE__ == 0) +#define __LEAST8 "hh" +#elif (__INT_LEAST8_TYPE__ == 1 || __INT_LEAST8_TYPE__ == 3) +#define __LEAST8 "h" +#elif (__INT_LEAST8_TYPE__ == 2) +#define __LEAST8 +#elif (__INT_LEAST8_TYPE__ == 4 || __INT_LEAST8_TYPE__ == 6) +#define __LEAST8 "l" +#elif (__INT_LEAST8_TYPE__ == 8 || __INT_LEAST8_TYPE__ == 10) +#define __LEAST8 "ll" +#endif +#if (__INT_LEAST16_TYPE__ == 1 || __INT_LEAST16_TYPE__ == 3) +#define __LEAST16 "h" +#elif (__INT_LEAST16_TYPE__ == 2) +#define __LEAST16 +#elif (__INT_LEAST16_TYPE__ == 4 || __INT_LEAST16_TYPE__ == 6) +#define __LEAST16 "l" +#elif (__INT_LEAST16_TYPE__ == 8 || __INT_LEAST16_TYPE__ == 10) +#define __LEAST16 "ll" +#endif +#if (__INT_LEAST32_TYPE__ == 2) +#define __LEAST32 +#elif (__INT_LEAST32_TYPE__ == 4 || __INT_LEAST32_TYPE__ == 6) +#define __LEAST32 "l" +#elif (__INT_LEAST32_TYPE__ == 8 || __INT_LEAST32_TYPE__ == 10) +#define __LEAST32 "ll" +#endif +#if (__INT_LEAST64_TYPE__ == 2) +#define __LEAST64 +#elif (__INT_LEAST64_TYPE__ == 4 || __INT_LEAST64_TYPE__ == 6) +#define __LEAST64 "l" +#elif (__INT_LEAST64_TYPE__ == 8 || __INT_LEAST64_TYPE__ == 10) +#define __LEAST64 "ll" +#endif +#undef signed +#undef unsigned +#undef char +#undef short +#undef int +#undef long +#pragma pop_macro("signed") +#pragma pop_macro("unsigned") +#pragma pop_macro("char") +#pragma pop_macro("short") +#pragma pop_macro("__int20") +#pragma pop_macro("__int20__") +#pragma pop_macro("int") +#pragma pop_macro("long") + +#endif /* _SYS__INTSUP_H */ diff --git a/lib/include/sys/_locale.h b/lib/include/sys/_locale.h new file mode 100644 index 0000000..ce6f995 --- /dev/null +++ b/lib/include/sys/_locale.h @@ -0,0 +1,12 @@ +/* Definition of opaque POSIX-1.2008 type locale_t for userspace. */ + +#ifndef _SYS__LOCALE_H +#define _SYS__LOCALE_H + +#include +#include + +struct __locale_t; +typedef struct __locale_t *locale_t; + +#endif /* _SYS__LOCALE_H */ diff --git a/lib/include/sys/_pthreadtypes.h b/lib/include/sys/_pthreadtypes.h new file mode 100644 index 0000000..75e9e1c --- /dev/null +++ b/lib/include/sys/_pthreadtypes.h @@ -0,0 +1,233 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2013, 2015. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + */ + +#ifndef _SYS__PTHREADTYPES_H_ +#define _SYS__PTHREADTYPES_H_ + +#if defined(_POSIX_THREADS) || __POSIX_VISIBLE >= 199506 + +#include + +/* + * 2.5 Primitive System Data Types, P1003.1c/D10, p. 19. + */ + +#if defined(__XMK__) +typedef unsigned int pthread_t; /* identify a thread */ +#else +typedef __uint32_t pthread_t; /* identify a thread */ +#endif + +/* P1003.1c/D10, p. 118-119 */ +#define PTHREAD_SCOPE_PROCESS 0 +#define PTHREAD_SCOPE_SYSTEM 1 + +/* P1003.1c/D10, p. 111 */ +#define PTHREAD_INHERIT_SCHED 1 /* scheduling policy and associated */ + /* attributes are inherited from */ + /* the calling thread. */ +#define PTHREAD_EXPLICIT_SCHED 2 /* set from provided attribute object */ + +/* P1003.1c/D10, p. 141 */ +#define PTHREAD_CREATE_DETACHED 0 +#define PTHREAD_CREATE_JOINABLE 1 + +#if defined(__XMK__) +typedef struct pthread_attr_s { + int contentionscope; + struct sched_param schedparam; + int detachstate; + void *stackaddr; + size_t stacksize; +} pthread_attr_t; + +#define PTHREAD_STACK_MIN 200 + +#else /* !defined(__XMK__) */ +typedef struct { + int is_initialized; + void *stackaddr; + int stacksize; + int contentionscope; + int inheritsched; + int schedpolicy; + struct sched_param schedparam; + + /* P1003.4b/D8, p. 54 adds cputime_clock_allowed attribute. */ +#if defined(_POSIX_THREAD_CPUTIME) + int cputime_clock_allowed; /* see time.h */ +#endif + int detachstate; +} pthread_attr_t; + +#endif /* !defined(__XMK__) */ + +#if defined(_POSIX_THREAD_PROCESS_SHARED) +/* NOTE: P1003.1c/D10, p. 81 defines following values for process_shared. */ + +#define PTHREAD_PROCESS_PRIVATE 0 /* visible within only the creating process */ +#define PTHREAD_PROCESS_SHARED 1 /* visible too all processes with access to */ + /* the memory where the resource is */ + /* located */ +#endif + +#if defined(_POSIX_THREAD_PRIO_PROTECT) +/* Mutexes */ + +/* Values for blocking protocol. */ + +#define PTHREAD_PRIO_NONE 0 +#define PTHREAD_PRIO_INHERIT 1 +#define PTHREAD_PRIO_PROTECT 2 +#endif + +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + +/* Values for mutex type */ + +/* The following defines are part of the X/Open System Interface (XSI). */ + +/* + * This type of mutex does not detect deadlock. A thread attempting to + * relock this mutex without first unlocking it shall deadlock. Attempting + * to unlock a mutex locked by a different thread results in undefined + * behavior. Attempting to unlock an unlocked mutex results in undefined + * behavior. + */ +#define PTHREAD_MUTEX_NORMAL 0 + +/* + * A thread attempting to relock this mutex without first unlocking + * it shall succeed in locking the mutex. The relocking deadlock which + * can occur with mutexes of type PTHREAD_MUTEX_NORMAL cannot occur with + * this type of mutex. Multiple locks of this mutex shall require the + * same number of unlocks to release the mutex before another thread can + * acquire the mutex. A thread attempting to unlock a mutex which another + * thread has locked shall return with an error. A thread attempting to + * unlock an unlocked mutex shall return with an error. + */ +#define PTHREAD_MUTEX_RECURSIVE 1 + +/* + * This type of mutex provides error checking. A thread attempting + * to relock this mutex without first unlocking it shall return with an + * error. A thread attempting to unlock a mutex which another thread has + * locked shall return with an error. A thread attempting to unlock an + * unlocked mutex shall return with an error. + */ +#define PTHREAD_MUTEX_ERRORCHECK 2 + +/* + * Attempting to recursively lock a mutex of this type results + * in undefined behavior. Attempting to unlock a mutex of this type + * which was not locked by the calling thread results in undefined + * behavior. Attempting to unlock a mutex of this type which is not locked + * results in undefined behavior. An implementation may map this mutex to + * one of the other mutex types. + */ +#define PTHREAD_MUTEX_DEFAULT 3 + +#endif /* !defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) */ + +#if defined(__XMK__) +typedef unsigned int pthread_mutex_t; /* identify a mutex */ + +typedef struct { + int type; +} pthread_mutexattr_t; + +#else /* !defined(__XMK__) */ +typedef __uint32_t pthread_mutex_t; /* identify a mutex */ + +typedef struct { + int is_initialized; +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow mutex to be shared amongst processes */ +#endif +#if defined(_POSIX_THREAD_PRIO_PROTECT) + int prio_ceiling; + int protocol; +#endif +#if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) + int type; +#endif + int recursive; +} pthread_mutexattr_t; +#endif /* !defined(__XMK__) */ + +#define _PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF) + +/* Condition Variables */ + +typedef __uint32_t pthread_cond_t; /* identify a condition variable */ + +#define _PTHREAD_COND_INITIALIZER ((pthread_cond_t) 0xFFFFFFFF) + +typedef struct { + int is_initialized; + clock_t clock; /* specifiy clock for timeouts */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_condattr_t; /* a condition attribute object */ + +/* Keys */ + +typedef __uint32_t pthread_key_t; /* thread-specific data keys */ + +typedef struct { + int is_initialized; /* is this structure initialized? */ + int init_executed; /* has the initialization routine been run? */ +} pthread_once_t; /* dynamic package initialization */ + +#define _PTHREAD_ONCE_INIT { 1, 0 } /* is initialized and not run */ +#endif /* defined(_POSIX_THREADS) || __POSIX_VISIBLE >= 199506 */ + +/* POSIX Barrier Types */ + +#if defined(_POSIX_BARRIERS) +typedef __uint32_t pthread_barrier_t; /* POSIX Barrier Object */ +typedef struct { + int is_initialized; /* is this structure initialized? */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_barrierattr_t; +#endif /* defined(_POSIX_BARRIERS) */ + +/* POSIX Spin Lock Types */ + +#if defined(_POSIX_SPIN_LOCKS) +typedef __uint32_t pthread_spinlock_t; /* POSIX Spin Lock Object */ +#endif /* defined(_POSIX_SPIN_LOCKS) */ + +/* POSIX Reader/Writer Lock Types */ + +#if defined(_POSIX_READER_WRITER_LOCKS) +typedef __uint32_t pthread_rwlock_t; /* POSIX RWLock Object */ + +#define _PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) 0xFFFFFFFF) + +typedef struct { + int is_initialized; /* is this structure initialized? */ +#if defined(_POSIX_THREAD_PROCESS_SHARED) + int process_shared; /* allow this to be shared amongst processes */ +#endif +} pthread_rwlockattr_t; +#endif /* defined(_POSIX_READER_WRITER_LOCKS) */ + +#endif /* ! _SYS__PTHREADTYPES_H_ */ diff --git a/lib/include/sys/_sigset.h b/lib/include/sys/_sigset.h new file mode 100644 index 0000000..a9c0d2d --- /dev/null +++ b/lib/include/sys/_sigset.h @@ -0,0 +1,43 @@ +/*- + * Copyright (c) 1982, 1986, 1989, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * (c) UNIX System Laboratories, Inc. + * All or some portions of this file are derived from material licensed + * to the University of California by American Telephone and Telegraph + * Co. or Unix System Laboratories, Inc. and are reproduced herein with + * the permission of UNIX System Laboratories, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)signal.h 8.4 (Berkeley) 5/4/95 + * $FreeBSD$ + */ + +#ifndef _SYS__SIGSET_H_ +#define _SYS__SIGSET_H_ + +typedef unsigned long __sigset_t; + +#endif /* !_SYS__SIGSET_H_ */ diff --git a/lib/include/sys/_stdint.h b/lib/include/sys/_stdint.h new file mode 100644 index 0000000..21a14d3 --- /dev/null +++ b/lib/include/sys/_stdint.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2004, 2005 by + * Ralf Corsepius, Ulm/Germany. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _SYS__STDINT_H +#define _SYS__STDINT_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ___int8_t_defined +#ifndef _INT8_T_DECLARED +typedef __int8_t int8_t ; +#define _INT8_T_DECLARED +#endif +#ifndef _UINT8_T_DECLARED +typedef __uint8_t uint8_t ; +#define _UINT8_T_DECLARED +#endif +#define __int8_t_defined 1 +#endif /* ___int8_t_defined */ + +#ifdef ___int16_t_defined +#ifndef _INT16_T_DECLARED +typedef __int16_t int16_t ; +#define _INT16_T_DECLARED +#endif +#ifndef _UINT16_T_DECLARED +typedef __uint16_t uint16_t ; +#define _UINT16_T_DECLARED +#endif +#define __int16_t_defined 1 +#endif /* ___int16_t_defined */ + +#ifdef ___int32_t_defined +#ifndef _INT32_T_DECLARED +typedef __int32_t int32_t ; +#define _INT32_T_DECLARED +#endif +#ifndef _UINT32_T_DECLARED +typedef __uint32_t uint32_t ; +#define _UINT32_T_DECLARED +#endif +#define __int32_t_defined 1 +#endif /* ___int32_t_defined */ + +#ifdef ___int64_t_defined +#ifndef _INT64_T_DECLARED +typedef __int64_t int64_t ; +#define _INT64_T_DECLARED +#endif +#ifndef _UINT64_T_DECLARED +typedef __uint64_t uint64_t ; +#define _UINT64_T_DECLARED +#endif +#define __int64_t_defined 1 +#endif /* ___int64_t_defined */ + +#ifndef _INTMAX_T_DECLARED +typedef __intmax_t intmax_t; +#define _INTMAX_T_DECLARED +#endif + +#ifndef _UINTMAX_T_DECLARED +typedef __uintmax_t uintmax_t; +#define _UINTMAX_T_DECLARED +#endif + +#ifndef _INTPTR_T_DECLARED +typedef __intptr_t intptr_t; +#define _INTPTR_T_DECLARED +#endif + +#ifndef _UINTPTR_T_DECLARED +typedef __uintptr_t uintptr_t; +#define _UINTPTR_T_DECLARED +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS__STDINT_H */ diff --git a/lib/include/sys/_timespec.h b/lib/include/sys/_timespec.h new file mode 100644 index 0000000..f810b00 --- /dev/null +++ b/lib/include/sys/_timespec.h @@ -0,0 +1,52 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * from: FreeBSD: src/sys/sys/time.h,v 1.43 2000/03/20 14:09:05 phk Exp + * $FreeBSD: head/sys/sys/_timespec.h 326023 2017-11-20 19:43:44Z pfg $ + */ + +#ifndef _SYS__TIMESPEC_H_ +#define _SYS__TIMESPEC_H_ + +#include + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* and nanoseconds */ +}; + +#endif /* !_SYS__TIMESPEC_H_ */ diff --git a/lib/include/sys/_timeval.h b/lib/include/sys/_timeval.h new file mode 100644 index 0000000..6b250c0 --- /dev/null +++ b/lib/include/sys/_timeval.h @@ -0,0 +1,60 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2002 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: head/sys/sys/_timeval.h 326256 2017-11-27 15:01:59Z pfg $ + */ + +#ifndef _SYS__TIMEVAL_H_ +#define _SYS__TIMEVAL_H_ + +#include + +#ifndef _SUSECONDS_T_DECLARED +typedef __suseconds_t suseconds_t; +#define _SUSECONDS_T_DECLARED +#endif + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +/* This define is also used outside of Newlib, e.g. in MinGW-w64 */ +#ifndef _TIMEVAL_DEFINED +#define _TIMEVAL_DEFINED + +/* + * Structure returned by gettimeofday(2) system call, and used in other calls. + */ +struct timeval { + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* and microseconds */ +}; +#endif /* _TIMEVAL_DEFINED */ + +#endif /* !_SYS__TIMEVAL_H_ */ diff --git a/lib/include/sys/_types.h b/lib/include/sys/_types.h new file mode 100644 index 0000000..d1112d5 --- /dev/null +++ b/lib/include/sys/_types.h @@ -0,0 +1,228 @@ +/* ANSI C namespace clean utility typedefs */ + +/* This file defines various typedefs needed by the system calls that support + the C library. Basically, they're just the POSIX versions with an '_' + prepended. Targets shall use to define their own + internal types if desired. + + There are three define patterns used for type definitions. Lets assume + xyz_t is a user type. + + The internal type definition uses __machine_xyz_t_defined. It is defined by + to disable a default definition in . It + must not be used in other files. + + User type definitions are guarded by __xyz_t_defined in glibc and + _XYZ_T_DECLARED in BSD compatible systems. +*/ + +#ifndef _SYS__TYPES_H +#define _SYS__TYPES_H + +#define __need_size_t +#define __need_wint_t +#include +#include +#include +#include + +#ifndef __machine_blkcnt_t_defined +typedef long __blkcnt_t; +#endif + +#ifndef __machine_blksize_t_defined +typedef long __blksize_t; +#endif + +#ifndef __machine_fsblkcnt_t_defined +typedef __uint64_t __fsblkcnt_t; +#endif + +#ifndef __machine_fsfilcnt_t_defined +typedef __uint32_t __fsfilcnt_t; +#endif + +#ifndef __machine_off_t_defined +typedef long _off_t; +#endif + +#if defined(__XMK__) +typedef signed char __pid_t; +#else +typedef int __pid_t; +#endif + +#ifndef __machine_dev_t_defined +typedef short __dev_t; +#endif + +#ifndef __machine_uid_t_defined +typedef unsigned short __uid_t; +#endif +#ifndef __machine_gid_t_defined +typedef unsigned short __gid_t; +#endif + +#ifndef __machine_id_t_defined +typedef __uint32_t __id_t; +#endif + +#ifndef __machine_ino_t_defined +#if (defined(__i386__) && (defined(GO32) || defined(__MSDOS__))) || \ + defined(__sparc__) || defined(__SPU__) +typedef unsigned long __ino_t; +#else +typedef unsigned short __ino_t; +#endif +#endif + +#ifndef __machine_mode_t_defined +#if defined(__i386__) && (defined(GO32) || defined(__MSDOS__)) +typedef int __mode_t; +#else +#if defined(__sparc__) && !defined(__sparc_v9__) +#ifdef __svr4__ +typedef unsigned long __mode_t; +#else +typedef unsigned short __mode_t; +#endif +#else +typedef __uint32_t __mode_t; +#endif +#endif +#endif + +#ifndef __machine_off64_t_defined +__extension__ typedef long long _off64_t; +#endif + +#if defined(__CYGWIN__) && !defined(__LP64__) +typedef _off64_t __off_t; +#else +typedef _off_t __off_t; +#endif + +typedef _off64_t __loff_t; + +#ifndef __machine_key_t_defined +typedef long __key_t; +#endif + +/* + * We need fpos_t for the following, but it doesn't have a leading "_", + * so we use _fpos_t instead. + */ +#ifndef __machine_fpos_t_defined +typedef long _fpos_t; /* XXX must match off_t in */ + /* (and must be `long' for now) */ +#endif + +#ifdef __LARGE64_FILES +#ifndef __machine_fpos64_t_defined +typedef _off64_t _fpos64_t; +#endif +#endif + +/* Defined by GCC provided */ +#undef __size_t + +#ifndef __machine_size_t_defined +#ifdef __SIZE_TYPE__ +typedef __SIZE_TYPE__ __size_t; +#else +#if defined(__INT_MAX__) && __INT_MAX__ == 2147483647 +typedef unsigned int __size_t; +#else +typedef unsigned long __size_t; +#endif +#endif +#endif + +#ifndef __machine_ssize_t_defined +#ifdef __SIZE_TYPE__ +/* If __SIZE_TYPE__ is defined (gcc) we define ssize_t based on size_t. + We simply change "unsigned" to "signed" for this single definition + to make sure ssize_t and size_t only differ by their signedness. */ +#define unsigned signed +typedef __SIZE_TYPE__ _ssize_t; +#undef unsigned +#else +#if defined(__INT_MAX__) && __INT_MAX__ == 2147483647 +typedef int _ssize_t; +#else +typedef long _ssize_t; +#endif +#endif +#endif + +typedef _ssize_t __ssize_t; + +#ifndef __machine_mbstate_t_defined +/* Conversion state information. */ +typedef struct +{ + int __count; + union + { + wint_t __wch; + unsigned char __wchb[4]; + } __value; /* Value so far. */ +} _mbstate_t; +#endif + +#ifndef __machine_iconv_t_defined +/* Iconv descriptor type */ +typedef void *_iconv_t; +#endif + +#ifndef __machine_clock_t_defined +#define _CLOCK_T_ unsigned long /* clock() */ +#endif + +typedef _CLOCK_T_ __clock_t; + +#if defined(_USE_LONG_TIME_T) || __LONG_MAX__ > 0x7fffffffL +#define _TIME_T_ long +#else +#define _TIME_T_ __int_least64_t +#endif +typedef _TIME_T_ __time_t; + +#ifndef __machine_clockid_t_defined +#define _CLOCKID_T_ unsigned long +#endif + +typedef _CLOCKID_T_ __clockid_t; + +#ifndef __machine_daddr_t_defined +typedef long __daddr_t; +#endif + +#define _TIMER_T_ unsigned long +typedef _TIMER_T_ __timer_t; + +#ifndef __machine_sa_family_t_defined +typedef __uint8_t __sa_family_t; +#endif + +#ifndef __machine_socklen_t_defined +typedef __uint32_t __socklen_t; +#endif + +typedef int __nl_item; +typedef unsigned short __nlink_t; +typedef long __suseconds_t; /* microseconds (signed) */ +typedef unsigned long __useconds_t; /* microseconds (unsigned) */ + +/* + * Must be identical to the __GNUCLIKE_BUILTIN_VAALIST definition in + * . The must not be included here to avoid cyclic + * header dependencies. + */ +#if __GNUC_MINOR__ > 95 || __GNUC__ >= 3 +typedef __builtin_va_list __va_list; +#else +typedef char * __va_list; +#endif + +#endif /* _SYS__TYPES_H */ diff --git a/lib/include/sys/_tz_structs.h b/lib/include/sys/_tz_structs.h new file mode 100644 index 0000000..9610b06 --- /dev/null +++ b/lib/include/sys/_tz_structs.h @@ -0,0 +1,24 @@ +#ifndef _SYS__TZ_STRUCTS_H_ +#define _SYS__TZ_STRUCTS_H_ + +typedef struct __tzrule_struct +{ + char ch; + int m; /* Month of year if ch=M */ + int n; /* Week of month if ch=M */ + int d; /* Day of week if ch=M, day of year if ch=J or ch=D */ + int s; /* Time of day in seconds */ + time_t change; + long offset; /* Match type of _timezone. */ +} __tzrule_type; + +typedef struct __tzinfo_struct +{ + int __tznorth; + int __tzyear; + __tzrule_type __tzrule[2]; +} __tzinfo_type; + +__tzinfo_type *__gettzinfo (void); + +#endif /* _SYS__TZ_STRUCTS_H_ */ diff --git a/lib/include/sys/cdefs.h b/lib/include/sys/cdefs.h new file mode 100644 index 0000000..720e700 --- /dev/null +++ b/lib/include/sys/cdefs.h @@ -0,0 +1,740 @@ +/* libc/sys/linux/sys/cdefs.h - Helper macros for K&R vs. ANSI C compat. */ + +/* Written 2000 by Werner Almesberger */ + +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Berkeley Software Design, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 + * $FreeBSD$ + */ + +#ifndef _SYS_CDEFS_H_ +#define _SYS_CDEFS_H_ + +#include +#include +#include + +#define __PMT(args) args +#define __DOTS , ... +#define __THROW + +#ifdef __GNUC__ +# define __ASMNAME(cname) __XSTRING (__USER_LABEL_PREFIX__) cname +#endif + +#define __ptr_t void * +#define __long_double_t long double + +#define __attribute_malloc__ +#define __attribute_pure__ +#define __attribute_format_strfmon__(a,b) +#define __flexarr [0] + +#ifndef __BOUNDED_POINTERS__ +# define __bounded /* nothing */ +# define __unbounded /* nothing */ +# define __ptrvalue /* nothing */ +#endif + +/* + * Testing against Clang-specific extensions. + */ +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif +#ifndef __has_extension +#define __has_extension __has_feature +#endif +#ifndef __has_feature +#define __has_feature(x) 0 +#endif +#ifndef __has_include +#define __has_include(x) 0 +#endif +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +#if defined(__cplusplus) +#define __BEGIN_DECLS extern "C" { +#define __END_DECLS } +#else +#define __BEGIN_DECLS +#define __END_DECLS +#endif + +/* + * This code has been put in place to help reduce the addition of + * compiler specific defines in FreeBSD code. It helps to aid in + * having a compiler-agnostic source tree. + */ + +#if defined(__GNUC__) + +#if __GNUC__ >= 3 +#define __GNUCLIKE_ASM 3 +#define __GNUCLIKE_MATH_BUILTIN_CONSTANTS +#else +#define __GNUCLIKE_ASM 2 +#endif +#define __GNUCLIKE___TYPEOF 1 +#define __GNUCLIKE___SECTION 1 + +#define __GNUCLIKE_CTOR_SECTION_HANDLING 1 + +#define __GNUCLIKE_BUILTIN_CONSTANT_P 1 + +#if (__GNUC_MINOR__ > 95 || __GNUC__ >= 3) +#define __GNUCLIKE_BUILTIN_VARARGS 1 +#define __GNUCLIKE_BUILTIN_STDARG 1 +#define __GNUCLIKE_BUILTIN_VAALIST 1 +#endif + +#define __GNUC_VA_LIST_COMPATIBILITY 1 + +/* + * Compiler memory barriers, specific to gcc and clang. + */ +#define __compiler_membar() __asm __volatile(" " : : : "memory") + +#define __GNUCLIKE_BUILTIN_NEXT_ARG 1 +#define __GNUCLIKE_MATH_BUILTIN_RELOPS + +#define __GNUCLIKE_BUILTIN_MEMCPY 1 + +/* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */ +#define __CC_SUPPORTS_INLINE 1 +#define __CC_SUPPORTS___INLINE 1 +#define __CC_SUPPORTS___INLINE__ 1 + +#define __CC_SUPPORTS___FUNC__ 1 +#define __CC_SUPPORTS_WARNING 1 + +#define __CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */ + +#define __CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1 + +#endif /* __GNUC__ */ + +/* + * The __CONCAT macro is used to concatenate parts of symbol names, e.g. + * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. + * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI + * mode -- there must be no spaces between its arguments, and for nested + * __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also + * concatenate double-quoted strings produced by the __STRING macro, but + * this only works with ANSI C. + * + * __XSTRING is like __STRING, but it expands any macros in its argument + * first. It is only available with ANSI C. + */ +#if defined(__STDC__) || defined(__cplusplus) +#define __P(protos) protos /* full-blown ANSI C */ +#define __CONCAT1(x,y) x ## y +#define __CONCAT(x,y) __CONCAT1(x,y) +#define __STRING(x) #x /* stringify without expanding x */ +#define __XSTRING(x) __STRING(x) /* expand x, then stringify */ + +#define __const const /* define reserved names to standard */ +#define __signed signed +#define __volatile volatile +#if defined(__cplusplus) +#define __inline inline /* convert to C++ keyword */ +#else +#if !(defined(__CC_SUPPORTS___INLINE)) +#define __inline /* delete GCC keyword */ +#endif /* ! __CC_SUPPORTS___INLINE */ +#endif /* !__cplusplus */ + +#else /* !(__STDC__ || __cplusplus) */ +#define __P(protos) () /* traditional C preprocessor */ +#define __CONCAT(x,y) x/**/y +#define __STRING(x) "x" + +#if !defined(__CC_SUPPORTS___INLINE) +#define __const /* delete pseudo-ANSI C keywords */ +#define __inline +#define __signed +#define __volatile +/* + * In non-ANSI C environments, new programs will want ANSI-only C keywords + * deleted from the program and old programs will want them left alone. + * When using a compiler other than gcc, programs using the ANSI C keywords + * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. + * When using "gcc -traditional", we assume that this is the intent; if + * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. + */ +#ifndef NO_ANSI_KEYWORDS +#define const /* delete ANSI C keywords */ +#define inline +#define signed +#define volatile +#endif /* !NO_ANSI_KEYWORDS */ +#endif /* !__CC_SUPPORTS___INLINE */ +#endif /* !(__STDC__ || __cplusplus) */ + +/* + * Compiler-dependent macros to help declare dead (non-returning) and + * pure (no side effects) functions, and unused variables. They are + * null except for versions of gcc that are known to support the features + * properly (old versions of gcc-2 supported the dead and pure features + * in a different (wrong) way). If we do not provide an implementation + * for a given compiler, let the compile fail if it is told to use + * a feature that we cannot live without. + */ +#define __weak_symbol __attribute__((__weak__)) +#if !__GNUC_PREREQ__(2, 5) +#define __dead2 +#define __pure2 +#define __unused +#endif +#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 +#define __dead2 __attribute__((__noreturn__)) +#define __pure2 __attribute__((__const__)) +#define __unused +/* XXX Find out what to do for __packed, __aligned and __section */ +#endif +#if __GNUC_PREREQ__(2, 7) +#define __dead2 __attribute__((__noreturn__)) +#define __pure2 __attribute__((__const__)) +#define __unused __attribute__((__unused__)) +#define __used __attribute__((__used__)) +#define __packed __attribute__((__packed__)) +#define __aligned(x) __attribute__((__aligned__(x))) +#define __section(x) __attribute__((__section__(x))) +#endif +#if __GNUC_PREREQ__(4, 3) || __has_attribute(__alloc_size__) +#define __alloc_size(x) __attribute__((__alloc_size__(x))) +#define __alloc_size2(n, x) __attribute__((__alloc_size__(n, x))) +#else +#define __alloc_size(x) +#define __alloc_size2(n, x) +#endif +#if __GNUC_PREREQ__(4, 9) || __has_attribute(__alloc_align__) +#define __alloc_align(x) __attribute__((__alloc_align__(x))) +#else +#define __alloc_align(x) +#endif + +#if !__GNUC_PREREQ__(2, 95) +#define __alignof(x) __offsetof(struct { char __a; x __b; }, __b) +#endif + +/* + * Keywords added in C11. + */ + +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L + +#if !__has_extension(c_alignas) +#if (defined(__cplusplus) && __cplusplus >= 201103L) || \ + __has_extension(cxx_alignas) +#define _Alignas(x) alignas(x) +#else +/* XXX: Only emulates _Alignas(constant-expression); not _Alignas(type-name). */ +#define _Alignas(x) __aligned(x) +#endif +#endif + +#if defined(__cplusplus) && __cplusplus >= 201103L +#define _Alignof(x) alignof(x) +#else +#define _Alignof(x) __alignof(x) +#endif + +#if !defined(__cplusplus) && !__has_extension(c_atomic) && \ + !__has_extension(cxx_atomic) && !__GNUC_PREREQ__(4, 7) +/* + * No native support for _Atomic(). Place object in structure to prevent + * most forms of direct non-atomic access. + */ +#define _Atomic(T) struct { T volatile __val; } +#endif + +#if defined(__cplusplus) && __cplusplus >= 201103L +#define _Noreturn [[noreturn]] +#else +#define _Noreturn __dead2 +#endif + +#if !__has_extension(c_static_assert) +#if (defined(__cplusplus) && __cplusplus >= 201103L) || \ + __has_extension(cxx_static_assert) +#define _Static_assert(x, y) static_assert(x, y) +#elif __GNUC_PREREQ__(4,6) && !defined(__cplusplus) +/* Nothing, gcc 4.6 and higher has _Static_assert built-in */ +#elif defined(__COUNTER__) +#define _Static_assert(x, y) __Static_assert(x, __COUNTER__) +#define __Static_assert(x, y) ___Static_assert(x, y) +#define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 : -1] \ + __unused +#else +#define _Static_assert(x, y) struct __hack +#endif +#endif + +#if !__has_extension(c_thread_local) +/* + * XXX: Some compilers (Clang 3.3, GCC 4.7) falsely announce C++11 mode + * without actually supporting the thread_local keyword. Don't check for + * the presence of C++11 when defining _Thread_local. + */ +#if /* (defined(__cplusplus) && __cplusplus >= 201103L) || */ \ + __has_extension(cxx_thread_local) +#define _Thread_local thread_local +#else +#define _Thread_local __thread +#endif +#endif + +#endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */ + +/* + * Emulation of C11 _Generic(). Unlike the previously defined C11 + * keywords, it is not possible to implement this using exactly the same + * syntax. Therefore implement something similar under the name + * __generic(). Unlike _Generic(), this macro can only distinguish + * between a single type, so it requires nested invocations to + * distinguish multiple cases. + */ + +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ + __has_extension(c_generic_selections) +#define __generic(expr, t, yes, no) \ + _Generic(expr, t: yes, default: no) +#elif __GNUC_PREREQ__(3, 1) && !defined(__cplusplus) +#define __generic(expr, t, yes, no) \ + __builtin_choose_expr( \ + __builtin_types_compatible_p(__typeof(expr), t), yes, no) +#endif + +/* + * C99 Static array indices in function parameter declarations. Syntax such as: + * void bar(int myArray[static 10]); + * is allowed in C99 but not in C++. Define __min_size appropriately so + * headers using it can be compiled in either language. Use like this: + * void bar(int myArray[__min_size(10)]); + */ +#if !defined(__cplusplus) && \ + (defined(__clang__) || __GNUC_PREREQ__(4, 6)) && \ + (!defined(__STDC_VERSION__) || (__STDC_VERSION__ >= 199901)) +#define __min_size(x) static (x) +#else +#define __min_size(x) (x) +#endif + +#if __GNUC_PREREQ__(2, 96) +#define __malloc_like __attribute__((__malloc__)) +#define __pure __attribute__((__pure__)) +#else +#define __malloc_like +#define __pure +#endif + +#if __GNUC_PREREQ__(3, 1) +#define __always_inline __inline__ __attribute__((__always_inline__)) +#else +#define __always_inline +#endif + +#if __GNUC_PREREQ__(3, 1) +#define __noinline __attribute__ ((__noinline__)) +#else +#define __noinline +#endif + +#if __GNUC_PREREQ__(3, 3) +#define __nonnull(x) __attribute__((__nonnull__ x)) +#define __nonnull_all __attribute__((__nonnull__)) +#else +#define __nonnull(x) +#define __nonnull_all +#endif + +#if __GNUC_PREREQ__(3, 4) +#define __fastcall __attribute__((__fastcall__)) +#define __result_use_check __attribute__((__warn_unused_result__)) +#else +#define __fastcall +#define __result_use_check +#endif + +#if __GNUC_PREREQ__(4, 1) +#define __returns_twice __attribute__((__returns_twice__)) +#else +#define __returns_twice +#endif + +#if __GNUC_PREREQ__(4, 6) || __has_builtin(__builtin_unreachable) +#define __unreachable() __builtin_unreachable() +#else +#define __unreachable() ((void)0) +#endif + +/* XXX: should use `#if __STDC_VERSION__ < 199901'. */ +#if !__GNUC_PREREQ__(2, 7) +#define __func__ NULL +#endif + +/* + * GCC 2.95 provides `__restrict' as an extension to C90 to support the + * C99-specific `restrict' type qualifier. We happen to use `__restrict' as + * a way to define the `restrict' type qualifier without disturbing older + * software that is unaware of C99 keywords. + */ +#if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95) +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901 +#define __restrict +#else +#define __restrict restrict +#endif +#endif + +/* + * GNU C version 2.96 adds explicit branch prediction so that + * the CPU back-end can hint the processor and also so that + * code blocks can be reordered such that the predicted path + * sees a more linear flow, thus improving cache behavior, etc. + * + * The following two macros provide us with a way to utilize this + * compiler feature. Use __predict_true() if you expect the expression + * to evaluate to true, and __predict_false() if you expect the + * expression to evaluate to false. + * + * A few notes about usage: + * + * * Generally, __predict_false() error condition checks (unless + * you have some _strong_ reason to do otherwise, in which case + * document it), and/or __predict_true() `no-error' condition + * checks, assuming you want to optimize for the no-error case. + * + * * Other than that, if you don't know the likelihood of a test + * succeeding from empirical or other `hard' evidence, don't + * make predictions. + * + * * These are meant to be used in places that are run `a lot'. + * It is wasteful to make predictions in code that is run + * seldomly (e.g. at subsystem initialization time) as the + * basic block reordering that this affects can often generate + * larger code. + */ +#if __GNUC_PREREQ__(2, 96) +#define __predict_true(exp) __builtin_expect((exp), 1) +#define __predict_false(exp) __builtin_expect((exp), 0) +#else +#define __predict_true(exp) (exp) +#define __predict_false(exp) (exp) +#endif + +#if __GNUC_PREREQ__(4, 0) +#define __null_sentinel __attribute__((__sentinel__)) +#define __exported __attribute__((__visibility__("default"))) +/* Only default visibility is supported on PE/COFF targets. */ +#ifndef __CYGWIN__ +#define __hidden __attribute__((__visibility__("hidden"))) +#else +#define __hidden +#endif +#else +#define __null_sentinel +#define __exported +#define __hidden +#endif + +#define __offsetof(type, field) offsetof(type, field) +#define __rangeof(type, start, end) \ + (__offsetof(type, end) - __offsetof(type, start)) + +/* + * Given the pointer x to the member m of the struct s, return + * a pointer to the containing structure. When using GCC, we first + * assign pointer x to a local variable, to check that its type is + * compatible with member m. + */ +#if __GNUC_PREREQ__(3, 1) +#define __containerof(x, s, m) ({ \ + const volatile __typeof(((s *)0)->m) *__x = (x); \ + __DEQUALIFY(s *, (const volatile char *)__x - __offsetof(s, m));\ +}) +#else +#define __containerof(x, s, m) \ + __DEQUALIFY(s *, (const volatile char *)(x) - __offsetof(s, m)) +#endif + +/* + * Compiler-dependent macros to declare that functions take printf-like + * or scanf-like arguments. They are null except for versions of gcc + * that are known to support the features properly (old versions of gcc-2 + * didn't permit keeping the keywords out of the application namespace). + */ +#if !__GNUC_PREREQ__(2, 7) +#define __printflike(fmtarg, firstvararg) +#define __scanflike(fmtarg, firstvararg) +#define __format_arg(fmtarg) +#define __strfmonlike(fmtarg, firstvararg) +#define __strftimelike(fmtarg, firstvararg) +#else +#define __printflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#define __scanflike(fmtarg, firstvararg) \ + __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) +#define __format_arg(fmtarg) __attribute__((__format_arg__ (fmtarg))) +#define __strfmonlike(fmtarg, firstvararg) \ + __attribute__((__format__ (__strfmon__, fmtarg, firstvararg))) +#define __strftimelike(fmtarg, firstvararg) \ + __attribute__((__format__ (__strftime__, fmtarg, firstvararg))) +#endif + +/* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ +#if defined(__FreeBSD_cc_version) && __FreeBSD_cc_version >= 300001 && \ + defined(__GNUC__) +#define __printf0like(fmtarg, firstvararg) \ + __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) +#else +#define __printf0like(fmtarg, firstvararg) +#endif + +#if defined(__GNUC__) +#define __strong_reference(sym,aliassym) \ + extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))) +#ifdef __ELF__ +#ifdef __STDC__ +#define __weak_reference(sym,alias) \ + __asm__(".weak " #alias); \ + __asm__(".equ " #alias ", " #sym) +#define __warn_references(sym,msg) \ + __asm__(".section .gnu.warning." #sym); \ + __asm__(".asciz \"" msg "\""); \ + __asm__(".previous") +#define __sym_compat(sym,impl,verid) \ + __asm__(".symver " #impl ", " #sym "@" #verid) +#define __sym_default(sym,impl,verid) \ + __asm__(".symver " #impl ", " #sym "@@" #verid) +#else +#define __weak_reference(sym,alias) \ + __asm__(".weak alias"); \ + __asm__(".equ alias, sym") +#define __warn_references(sym,msg) \ + __asm__(".section .gnu.warning.sym"); \ + __asm__(".asciz \"msg\""); \ + __asm__(".previous") +#define __sym_compat(sym,impl,verid) \ + __asm__(".symver impl, sym@verid") +#define __sym_default(impl,sym,verid) \ + __asm__(".symver impl, sym@@verid") +#endif /* __STDC__ */ +#else /* !__ELF__ */ +#ifdef __STDC__ +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs \"" msg "\",30,0,0,0"); \ + __asm__(".stabs \"_" #sym "\",1,0,0,0") +#else +#define __weak_reference(sym,alias) \ + __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#define __warn_references(sym,msg) \ + __asm__(".stabs msg,30,0,0,0"); \ + __asm__(".stabs \"_/**/sym\",1,0,0,0") +#endif /* __STDC__ */ +#endif /* __ELF__ */ +#endif /* __GNUC__ */ + +#ifndef __FBSDID +#define __FBSDID(s) struct __hack +#endif + +#ifndef __RCSID +#define __RCSID(s) struct __hack +#endif + +#ifndef __RCSID_SOURCE +#define __RCSID_SOURCE(s) struct __hack +#endif + +#ifndef __SCCSID +#define __SCCSID(s) struct __hack +#endif + +#ifndef __COPYRIGHT +#define __COPYRIGHT(s) struct __hack +#endif + +#ifndef __DECONST +#define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var)) +#endif + +#ifndef __DEVOLATILE +#define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var)) +#endif + +#ifndef __DEQUALIFY +#define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var)) +#endif + +/* + * Nullability qualifiers: currently only supported by Clang. + */ +#if !(defined(__clang__) && __has_feature(nullability)) +#define _Nonnull +#define _Nullable +#define _Null_unspecified +#define __NULLABILITY_PRAGMA_PUSH +#define __NULLABILITY_PRAGMA_POP +#else +#define __NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wnullability-completeness\"") +#define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop") +#endif + +/* + * Type Safety Checking + * + * Clang provides additional attributes to enable checking type safety + * properties that cannot be enforced by the C type system. + */ + +#if __has_attribute(__argument_with_type_tag__) && \ + __has_attribute(__type_tag_for_datatype__) +#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) \ + __attribute__((__argument_with_type_tag__(arg_kind, arg_idx, type_tag_idx))) +#define __datatype_type_tag(kind, type) \ + __attribute__((__type_tag_for_datatype__(kind, type))) +#else +#define __arg_type_tag(arg_kind, arg_idx, type_tag_idx) +#define __datatype_type_tag(kind, type) +#endif + +/* + * Lock annotations. + * + * Clang provides support for doing basic thread-safety tests at + * compile-time, by marking which locks will/should be held when + * entering/leaving a functions. + * + * Furthermore, it is also possible to annotate variables and structure + * members to enforce that they are only accessed when certain locks are + * held. + */ + +#if __has_extension(c_thread_safety_attributes) +#define __lock_annotate(x) __attribute__((x)) +#else +#define __lock_annotate(x) +#endif + +/* Structure implements a lock. */ +/* FIXME: Use __lockable__, etc. to avoid colliding with user namespace macros, + * once clang is fixed: https://bugs.llvm.org/show_bug.cgi?id=34319 */ +#define __lockable __lock_annotate(lockable) + +/* Function acquires an exclusive or shared lock. */ +#define __locks_exclusive(...) \ + __lock_annotate(exclusive_lock_function(__VA_ARGS__)) +#define __locks_shared(...) \ + __lock_annotate(shared_lock_function(__VA_ARGS__)) + +/* Function attempts to acquire an exclusive or shared lock. */ +#define __trylocks_exclusive(...) \ + __lock_annotate(exclusive_trylock_function(__VA_ARGS__)) +#define __trylocks_shared(...) \ + __lock_annotate(shared_trylock_function(__VA_ARGS__)) + +/* Function releases a lock. */ +#define __unlocks(...) __lock_annotate(unlock_function(__VA_ARGS__)) + +/* Function asserts that an exclusive or shared lock is held. */ +#define __asserts_exclusive(...) \ + __lock_annotate(assert_exclusive_lock(__VA_ARGS__)) +#define __asserts_shared(...) \ + __lock_annotate(assert_shared_lock(__VA_ARGS__)) + +/* Function requires that an exclusive or shared lock is or is not held. */ +#define __requires_exclusive(...) \ + __lock_annotate(exclusive_locks_required(__VA_ARGS__)) +#define __requires_shared(...) \ + __lock_annotate(shared_locks_required(__VA_ARGS__)) +#define __requires_unlocked(...) \ + __lock_annotate(locks_excluded(__VA_ARGS__)) + +/* Function should not be analyzed. */ +#define __no_lock_analysis __lock_annotate(no_thread_safety_analysis) + +/* + * Function or variable should not be sanitized, e.g., by AddressSanitizer. + * GCC has the nosanitize attribute, but as a function attribute only, and + * warns on use as a variable attribute. + */ +#if __has_attribute(no_sanitize) && defined(__clang__) +#ifdef _KERNEL +#define __nosanitizeaddress __attribute__((no_sanitize("kernel-address"))) +#define __nosanitizememory __attribute__((no_sanitize("kernel-memory"))) +#else +#define __nosanitizeaddress __attribute__((no_sanitize("address"))) +#define __nosanitizememory __attribute__((no_sanitize("memory"))) +#endif +#define __nosanitizethread __attribute__((no_sanitize("thread"))) +#else +#define __nosanitizeaddress +#define __nosanitizememory +#define __nosanitizethread +#endif + +/* Guard variables and structure members by lock. */ +#define __guarded_by(x) __lock_annotate(guarded_by(x)) +#define __pt_guarded_by(x) __lock_annotate(pt_guarded_by(x)) + +/* Alignment builtins for better type checking and improved code generation. */ +/* Provide fallback versions for other compilers (GCC/Clang < 10): */ +#if !__has_builtin(__builtin_is_aligned) +#define __builtin_is_aligned(x, align) \ + (((__uintptr_t)x & ((align) - 1)) == 0) +#endif +#if !__has_builtin(__builtin_align_up) +#define __builtin_align_up(x, align) \ + ((__typeof__(x))(((__uintptr_t)(x)+((align)-1))&(~((align)-1)))) +#endif +#if !__has_builtin(__builtin_align_down) +#define __builtin_align_down(x, align) \ + ((__typeof__(x))((x)&(~((align)-1)))) +#endif + +#define __align_up(x, y) __builtin_align_up(x, y) +#define __align_down(x, y) __builtin_align_down(x, y) +#define __is_aligned(x, y) __builtin_is_aligned(x, y) + +#endif /* !_SYS_CDEFS_H_ */ diff --git a/lib/include/sys/config.h b/lib/include/sys/config.h new file mode 100644 index 0000000..5dcc77a --- /dev/null +++ b/lib/include/sys/config.h @@ -0,0 +1,314 @@ +#ifndef __SYS_CONFIG_H__ +#define __SYS_CONFIG_H__ + +#include /* floating point macros */ +#include /* POSIX defs */ + +#ifdef __aarch64__ +#define MALLOC_ALIGNMENT 16 +#endif + +#ifdef __AMDGCN__ +#define __DYNAMIC_REENT__ +#endif + +/* exceptions first */ +#if defined(__H8500__) || defined(__W65__) +#define __SMALL_BITFIELDS +/* ??? This conditional is true for the h8500 and the w65, defining H8300 + in those cases probably isn't the right thing to do. */ +#define H8300 1 +#endif + +/* 16 bit integer machines */ +#if defined(__Z8001__) || defined(__Z8002__) || defined(__H8500__) || defined(__W65__) || defined (__mn10200__) || defined (__AVR__) || defined (__MSP430__) + +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX 32767 +#define UINT_MAX 65535 +#endif + +#if defined (__H8300__) || defined (__H8300H__) || defined(__H8300S__) || defined (__H8300SX__) +#define __SMALL_BITFIELDS +#define H8300 1 +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#endif + +#if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__)) +#ifndef __INT32__ +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX 32767 +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#else /* INT32 */ +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX 2147483647 +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#endif /* INT32 */ + +#endif /* CR16C */ + +#if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__) +#define __SMALL_BITFIELDS +#endif + +#ifdef __W65__ +#define __SMALL_BITFIELDS +#endif + +#if defined(__D10V__) +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define _POINTER_INT short +#endif + +#if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__) +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define _POINTER_INT short +#endif + +#if defined(__m68k__) || defined(__mc68000__) || defined(__riscv) +#define _READ_WRITE_RETURN_TYPE _ssize_t +#endif + +#ifdef ___AM29K__ +#define _FLOAT_RET double +#endif + +#ifdef __i386__ +#ifndef __unix__ +/* in other words, go32 */ +#define _FLOAT_RET double +#endif +#if defined(__linux__) || defined(__RDOS__) +/* we want the reentrancy structure to be returned by a function */ +#define __DYNAMIC_REENT__ +#define HAVE_GETDATE +#define _READ_WRITE_RETURN_TYPE _ssize_t +#define __LARGE64_FILES 1 +/* we use some glibc header files so turn on glibc large file feature */ +#define _LARGEFILE64_SOURCE 1 +#endif +#endif + +#ifdef __mn10200__ +#define __SMALL_BITFIELDS +#endif + +#ifdef __AVR__ +#define __SMALL_BITFIELDS +#define _POINTER_INT short +#endif + +#if defined(__v850) && !defined(__rtems__) +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__sda__)) +#endif + +/* For the PowerPC eabi, force the _impure_ptr to be in .sdata */ +#if defined(__PPC__) +#if defined(_CALL_SYSV) +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) +#endif +#ifdef __SPE__ +#define _LONG_DOUBLE double +#endif +#endif + +/* Configure small REENT structure for Xilinx MicroBlaze platforms */ +#if defined (__MICROBLAZE__) && !defined(__rtems__) +#ifndef _REENT_SMALL +#define _REENT_SMALL +#endif +/* Xilinx XMK uses Unix98 mutex */ +#ifdef __XMK__ +#define _UNIX98_THREAD_MUTEX_ATTRIBUTES +#endif +#endif + +#if defined(__mips__) && !defined(__rtems__) +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) +#endif + +#ifdef __xstormy16__ +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define MALLOC_ALIGNMENT 8 +#define _POINTER_INT short +#define __BUFSIZ__ 16 +#define _REENT_SMALL +#endif + +#if defined __MSP430__ +#ifndef _REENT_SMALL +#define _REENT_SMALL +#endif + +#define __BUFSIZ__ 256 +#define __SMALL_BITFIELDS + +#ifdef __MSP430X_LARGE__ +#define _POINTER_INT __int20 +#else +#define _POINTER_INT int +#endif +#endif + +#ifdef __m32c__ +#define __SMALL_BITFIELDS +#undef INT_MAX +#undef UINT_MAX +#define INT_MAX __INT_MAX__ +#define UINT_MAX (__INT_MAX__ * 2U + 1) +#define MALLOC_ALIGNMENT 8 +#if defined(__r8c_cpu__) || defined(__m16c_cpu__) +#define _POINTER_INT short +#else +#define _POINTER_INT long +#endif +#define __BUFSIZ__ 16 +#define _REENT_SMALL +#endif /* __m32c__ */ + +#ifdef __SPU__ +#define MALLOC_ALIGNMENT 16 +#define __CUSTOM_FILE_IO__ +#endif + +#if defined(__or1k__) || defined(__or1knd__) +#define __DYNAMIC_REENT__ +#endif + +/* This block should be kept in sync with GCC's limits.h. The point + of having these definitions here is to not include limits.h, which + would pollute the user namespace, while still using types of the + the correct widths when deciding how to define __int32_t and + __int64_t. */ +#ifndef __INT_MAX__ +# ifdef INT_MAX +# define __INT_MAX__ INT_MAX +# else +# define __INT_MAX__ 2147483647 +# endif +#endif + +#ifndef __LONG_MAX__ +# ifdef LONG_MAX +# define __LONG_MAX__ LONG_MAX +# else +# if defined (__alpha__) || (defined (__sparc__) && defined(__arch64__)) \ + || defined (__sparcv9) +# define __LONG_MAX__ 9223372036854775807L +# else +# define __LONG_MAX__ 2147483647L +# endif /* __alpha__ || sparc64 */ +# endif +#endif +/* End of block that should be kept in sync with GCC's limits.h. */ + +#ifndef _POINTER_INT +#define _POINTER_INT long +#endif + +#ifdef __frv__ +#define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata"))) +#endif +#undef __RAND_MAX +#if __INT_MAX__ == 32767 +#define __RAND_MAX 32767 +#else +#define __RAND_MAX 0x7fffffff +#endif + +#if defined(__CYGWIN__) +#include +#endif + +#if defined(__rtems__) +#define __FILENAME_MAX__ 255 +#define _READ_WRITE_RETURN_TYPE _ssize_t +#define __DYNAMIC_REENT__ +#endif + +#ifndef __EXPORT +#define __EXPORT +#endif + +#ifndef __IMPORT +#define __IMPORT +#endif + +/* Define return type of read/write routines. In POSIX, the return type + for read()/write() is "ssize_t" but legacy newlib code has been using + "int" for some time. If not specified, "int" is defaulted. */ +#ifndef _READ_WRITE_RETURN_TYPE +#define _READ_WRITE_RETURN_TYPE int +#endif +/* Define `count' parameter of read/write routines. In POSIX, the `count' + parameter is "size_t" but legacy newlib code has been using "int" for some + time. If not specified, "int" is defaulted. */ +#ifndef _READ_WRITE_BUFSIZE_TYPE +#define _READ_WRITE_BUFSIZE_TYPE int +#endif + +#ifndef __WCHAR_MAX__ +#if __INT_MAX__ == 32767 || defined (_WIN32) +#define __WCHAR_MAX__ 0xffffu +#endif +#endif + +/* See if small reent asked for at configuration time and + is not chosen by the platform by default. */ +#ifdef _WANT_REENT_SMALL +#ifndef _REENT_SMALL +#define _REENT_SMALL +#endif +#endif + +#ifdef _WANT_USE_LONG_TIME_T +#ifndef _USE_LONG_TIME_T +#define _USE_LONG_TIME_T +#endif +#endif + +#ifdef _WANT_USE_GDTOA +#ifndef _USE_GDTOA +#define _USE_GDTOA +#endif +#endif + +#ifdef _WANT_REENT_BACKWARD_BINARY_COMPAT +#ifndef _REENT_BACKWARD_BINARY_COMPAT +#define _REENT_BACKWARD_BINARY_COMPAT +#endif +#endif + +#ifdef _WANT_REENT_THREAD_LOCAL +#ifndef _REENT_THREAD_LOCAL +#define _REENT_THREAD_LOCAL +#endif +#endif + +/* If _MB_EXTENDED_CHARSETS_ALL is set, we want all of the extended + charsets. The extended charsets add a few functions and a couple + of tables of a few K each. */ +#ifdef _MB_EXTENDED_CHARSETS_ALL +#define _MB_EXTENDED_CHARSETS_ISO 1 +#define _MB_EXTENDED_CHARSETS_WINDOWS 1 +#endif + +#endif /* __SYS_CONFIG_H__ */ diff --git a/lib/include/sys/custom_file.h b/lib/include/sys/custom_file.h new file mode 100644 index 0000000..96314fb --- /dev/null +++ b/lib/include/sys/custom_file.h @@ -0,0 +1,2 @@ +#error System-specific custom_file.h is missing. + diff --git a/lib/include/sys/dir.h b/lib/include/sys/dir.h new file mode 100644 index 0000000..220150d --- /dev/null +++ b/lib/include/sys/dir.h @@ -0,0 +1,10 @@ +/* BSD predecessor of POSIX.1 and struct dirent */ + +#ifndef _SYS_DIR_H_ +#define _SYS_DIR_H_ + +#include + +#define direct dirent + +#endif /*_SYS_DIR_H_*/ diff --git a/lib/include/sys/dirent.h b/lib/include/sys/dirent.h new file mode 100644 index 0000000..a3fb5c0 --- /dev/null +++ b/lib/include/sys/dirent.h @@ -0,0 +1,13 @@ +/* includes , which is this file. On a + system which supports , this file is overridden by + dirent.h in the libc/sys/.../sys directory. On a system which does + not support , we will get this file which uses #error to force + an error. */ + +#ifdef __cplusplus +extern "C" { +#endif +#error " not supported" +#ifdef __cplusplus +} +#endif diff --git a/lib/include/sys/endian.h b/lib/include/sys/endian.h new file mode 100644 index 0000000..3685322 --- /dev/null +++ b/lib/include/sys/endian.h @@ -0,0 +1,207 @@ +/*- + * Copyright (c) 2002 Thomas Moestl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: head/sys/sys/endian.h 208331 2010-05-20 06:16:13Z phk $ + */ + +#ifndef _SYS_ENDIAN_H_ +#define _SYS_ENDIAN_H_ + +#include +#include +#include + +#ifndef _UINT8_T_DECLARED +typedef __uint8_t uint8_t; +#define _UINT8_T_DECLARED +#endif + +#ifndef _UINT16_T_DECLARED +typedef __uint16_t uint16_t; +#define _UINT16_T_DECLARED +#endif + +#ifndef _UINT32_T_DECLARED +typedef __uint32_t uint32_t; +#define _UINT32_T_DECLARED +#endif + +#ifndef _UINT64_T_DECLARED +typedef __uint64_t uint64_t; +#define _UINT64_T_DECLARED +#endif + +/* + * General byte order swapping functions. + */ +#define bswap16(x) __bswap16(x) +#define bswap32(x) __bswap32(x) +#define bswap64(x) __bswap64(x) + +/* + * Host to big endian, host to little endian, big endian to host, and little + * endian to host byte order functions as detailed in byteorder(9). + */ +#if _BYTE_ORDER == _LITTLE_ENDIAN +#define htobe16(x) bswap16((x)) +#define htobe32(x) bswap32((x)) +#define htobe64(x) bswap64((x)) +#define htole16(x) ((uint16_t)(x)) +#define htole32(x) ((uint32_t)(x)) +#define htole64(x) ((uint64_t)(x)) + +#define be16toh(x) bswap16((x)) +#define be32toh(x) bswap32((x)) +#define be64toh(x) bswap64((x)) +#define le16toh(x) ((uint16_t)(x)) +#define le32toh(x) ((uint32_t)(x)) +#define le64toh(x) ((uint64_t)(x)) +#else /* _BYTE_ORDER != _LITTLE_ENDIAN */ +#define htobe16(x) ((uint16_t)(x)) +#define htobe32(x) ((uint32_t)(x)) +#define htobe64(x) ((uint64_t)(x)) +#define htole16(x) bswap16((x)) +#define htole32(x) bswap32((x)) +#define htole64(x) bswap64((x)) + +#define be16toh(x) ((uint16_t)(x)) +#define be32toh(x) ((uint32_t)(x)) +#define be64toh(x) ((uint64_t)(x)) +#define le16toh(x) bswap16((x)) +#define le32toh(x) bswap32((x)) +#define le64toh(x) bswap64((x)) +#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */ + +/* Alignment-agnostic encode/decode bytestream to/from little/big endian. */ + +static __inline uint16_t +be16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[0] << 8) | p[1]); +} + +static __inline uint32_t +be32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | + ((uint32_t)p[2] << 8) | p[3]); +} + +static __inline uint64_t +be64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)be32dec(p) << 32) | be32dec(p + 4)); +} + +static __inline uint16_t +le16dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((unsigned)p[1] << 8) | p[0]); +} + +static __inline uint32_t +le32dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16) | + ((uint32_t)p[1] << 8) | p[0]); +} + +static __inline uint64_t +le64dec(const void *pp) +{ + uint8_t const *p = (uint8_t const *)pp; + + return (((uint64_t)le32dec(p + 4) << 32) | le32dec(p)); +} + +static __inline void +be16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 8) & 0xff; + p[1] = u & 0xff; +} + +static __inline void +be32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = (u >> 24) & 0xff; + p[1] = (u >> 16) & 0xff; + p[2] = (u >> 8) & 0xff; + p[3] = u & 0xff; +} + +static __inline void +be64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + be32enc(p, (uint32_t)(u >> 32)); + be32enc(p + 4, (uint32_t)(u & 0xffffffffU)); +} + +static __inline void +le16enc(void *pp, uint16_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; +} + +static __inline void +le32enc(void *pp, uint32_t u) +{ + uint8_t *p = (uint8_t *)pp; + + p[0] = u & 0xff; + p[1] = (u >> 8) & 0xff; + p[2] = (u >> 16) & 0xff; + p[3] = (u >> 24) & 0xff; +} + +static __inline void +le64enc(void *pp, uint64_t u) +{ + uint8_t *p = (uint8_t *)pp; + + le32enc(p, (uint32_t)(u & 0xffffffffU)); + le32enc(p + 4, (uint32_t)(u >> 32)); +} + +#endif /* _SYS_ENDIAN_H_ */ diff --git a/lib/include/sys/errno.h b/lib/include/sys/errno.h new file mode 100644 index 0000000..f150971 --- /dev/null +++ b/lib/include/sys/errno.h @@ -0,0 +1,198 @@ +/* errno is not a global variable, because that would make using it + non-reentrant. Instead, its address is returned by the function + __errno. */ + +#ifndef _SYS_ERRNO_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_ERRNO_H_ + +#include + +#ifdef _REENT_THREAD_LOCAL +#define errno (_tls_errno) +#else /* _REENT_THREAD_LOCAL */ + +#ifndef _REENT_ONLY +#define errno (*__errno()) +extern int *__errno (void); +#endif + +#endif /* _REENT_THREAD_LOCAL */ + +/* Please don't use these variables directly. + Use strerror instead. */ +extern __IMPORT const char * const _sys_errlist[]; +extern __IMPORT int _sys_nerr; +#ifdef __CYGWIN__ +extern __IMPORT const char * const sys_errlist[]; +extern __IMPORT int sys_nerr; +extern __IMPORT char *program_invocation_name; +extern __IMPORT char *program_invocation_short_name; +#endif + +#define __errno_r(ptr) _REENT_ERRNO(ptr) + +#define EPERM 1 /* Not owner */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No children */ +#define EAGAIN 11 /* No more processes */ +#define ENOMEM 12 /* Not enough space */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENOTBLK 15 /* Block device required */ +#endif +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* Too many open files in system */ +#define EMFILE 24 /* File descriptor value too large */ +#define ENOTTY 25 /* Not a character device */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Mathematics argument out of domain of function */ +#define ERANGE 34 /* Result too large */ +#define ENOMSG 35 /* No message of desired type */ +#define EIDRM 36 /* Identifier removed */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ECHRNG 37 /* Channel number out of range */ +#define EL2NSYNC 38 /* Level 2 not synchronized */ +#define EL3HLT 39 /* Level 3 halted */ +#define EL3RST 40 /* Level 3 reset */ +#define ELNRNG 41 /* Link number out of range */ +#define EUNATCH 42 /* Protocol driver not attached */ +#define ENOCSI 43 /* No CSI structure available */ +#define EL2HLT 44 /* Level 2 halted */ +#endif +#define EDEADLK 45 /* Deadlock */ +#define ENOLCK 46 /* No lock */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define EBADE 50 /* Invalid exchange */ +#define EBADR 51 /* Invalid request descriptor */ +#define EXFULL 52 /* Exchange full */ +#define ENOANO 53 /* No anode */ +#define EBADRQC 54 /* Invalid request code */ +#define EBADSLT 55 /* Invalid slot */ +#define EDEADLOCK 56 /* File locking deadlock error */ +#define EBFONT 57 /* Bad font file fmt */ +#endif +#define ENOSTR 60 /* Not a stream */ +#define ENODATA 61 /* No data (for no delay io) */ +#define ETIME 62 /* Stream ioctl timeout */ +#define ENOSR 63 /* No stream resources */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* The object is remote */ +#endif +#define ENOLINK 67 /* Virtual circuit is gone */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#endif +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 74 /* Multihop attempted */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ELBIN 75 /* Inode is remote (not really error) */ +#define EDOTDOT 76 /* Cross mount point (not really error) */ +#endif +#define EBADMSG 77 /* Bad message */ +#define EFTYPE 79 /* Inappropriate file type or format */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENOTUNIQ 80 /* Given log. name not unique */ +#define EBADFD 81 /* f.d. invalid for this operation */ +#define EREMCHG 82 /* Remote address changed */ +#define ELIBACC 83 /* Can't access a needed shared lib */ +#define ELIBBAD 84 /* Accessing a corrupted shared lib */ +#define ELIBSCN 85 /* .lib section in a.out corrupted */ +#define ELIBMAX 86 /* Attempting to link in too many libs */ +#define ELIBEXEC 87 /* Attempting to exec a shared library */ +#endif +#define ENOSYS 88 /* Function not implemented */ +#ifdef __CYGWIN__ +#define ENMFILE 89 /* No more files */ +#endif +#define ENOTEMPTY 90 /* Directory not empty */ +#define ENAMETOOLONG 91 /* File or path name too long */ +#define ELOOP 92 /* Too many symbolic links */ +#define EOPNOTSUPP 95 /* Operation not supported on socket */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EAFNOSUPPORT 106 /* Address family not supported by protocol family */ +#define EPROTOTYPE 107 /* Protocol wrong type for socket */ +#define ENOTSOCK 108 /* Socket operation on non-socket */ +#define ENOPROTOOPT 109 /* Protocol not available */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ESHUTDOWN 110 /* Can't send after socket shutdown */ +#endif +#define ECONNREFUSED 111 /* Connection refused */ +#define EADDRINUSE 112 /* Address already in use */ +#define ECONNABORTED 113 /* Software caused connection abort */ +#define ENETUNREACH 114 /* Network is unreachable */ +#define ENETDOWN 115 /* Network interface is not configured */ +#define ETIMEDOUT 116 /* Connection timed out */ +#define EHOSTDOWN 117 /* Host is down */ +#define EHOSTUNREACH 118 /* Host is unreachable */ +#define EINPROGRESS 119 /* Connection already in progress */ +#define EALREADY 120 /* Socket already connected */ +#define EDESTADDRREQ 121 /* Destination address required */ +#define EMSGSIZE 122 /* Message too long */ +#define EPROTONOSUPPORT 123 /* Unknown protocol */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ESOCKTNOSUPPORT 124 /* Socket type not supported */ +#endif +#define EADDRNOTAVAIL 125 /* Address not available */ +#define ENETRESET 126 /* Connection aborted by network */ +#define EISCONN 127 /* Socket is already connected */ +#define ENOTCONN 128 /* Socket is not connected */ +#define ETOOMANYREFS 129 +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define EPROCLIM 130 +#define EUSERS 131 +#endif +#define EDQUOT 132 +#define ESTALE 133 +#define ENOTSUP 134 /* Not supported */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ENOMEDIUM 135 /* No medium (in tape drive) */ +#endif +#ifdef __CYGWIN__ +#define ENOSHARE 136 /* No such host or network path */ +#define ECASECLASH 137 /* Filename exists with different case */ +#endif +#define EILSEQ 138 /* Illegal byte sequence */ +#define EOVERFLOW 139 /* Value too large for defined data type */ +#define ECANCELED 140 /* Operation canceled */ +#define ENOTRECOVERABLE 141 /* State not recoverable */ +#define EOWNERDEAD 142 /* Previous owner died */ +#ifdef __LINUX_ERRNO_EXTENSIONS__ +#define ESTRPIPE 143 /* Streams pipe error */ +#endif +#define EWOULDBLOCK EAGAIN /* Operation would block */ + +#define __ELASTERROR 2000 /* Users can add values starting here */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_ERRNO_H */ diff --git a/lib/include/sys/fcntl.h b/lib/include/sys/fcntl.h new file mode 100644 index 0000000..be85f40 --- /dev/null +++ b/lib/include/sys/fcntl.h @@ -0,0 +1,4 @@ +#ifndef _SYS_FCNTL_H_ +#define _SYS_FCNTL_H_ +#include +#endif diff --git a/lib/include/sys/features.h b/lib/include/sys/features.h new file mode 100644 index 0000000..45476ce --- /dev/null +++ b/lib/include/sys/features.h @@ -0,0 +1,538 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2014. + * + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + +#ifndef _SYS_FEATURES_H +#define _SYS_FEATURES_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <_newlib_version.h> + +/* Macro to test version of GCC. Returns 0 for non-GCC or too old GCC. */ +#ifndef __GNUC_PREREQ +# if defined __GNUC__ && defined __GNUC_MINOR__ +# define __GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +# else +# define __GNUC_PREREQ(maj, min) 0 +# endif +#endif /* __GNUC_PREREQ */ +/* Version with trailing underscores for BSD compatibility. */ +#define __GNUC_PREREQ__(ma, mi) __GNUC_PREREQ(ma, mi) + + +/* + * Feature test macros control which symbols are exposed by the system + * headers. Any of these must be defined before including any headers. + * + * __STRICT_ANSI__ (defined by gcc -ansi, -std=c90, -std=c99, or -std=c11) + * ISO C + * + * _POSIX_SOURCE (deprecated by _POSIX_C_SOURCE=1) + * _POSIX_C_SOURCE >= 1 + * POSIX.1-1990 + * + * _POSIX_C_SOURCE >= 2 + * POSIX.2-1992 + * + * _POSIX_C_SOURCE >= 199309L + * POSIX.1b-1993 Real-time extensions + * + * _POSIX_C_SOURCE >= 199506L + * POSIX.1c-1995 Threads extensions + * + * _POSIX_C_SOURCE >= 200112L + * POSIX.1-2001 and C99 + * + * _POSIX_C_SOURCE >= 200809L + * POSIX.1-2008 + * + * _XOPEN_SOURCE + * POSIX.1-1990 and XPG4 + * + * _XOPEN_SOURCE_EXTENDED + * SUSv1 (POSIX.2-1992 plus XPG4v2) + * + * _XOPEN_SOURCE >= 500 + * SUSv2 (POSIX.1c-1995 plus XSI) + * + * _XOPEN_SOURCE >= 600 + * SUSv3 (POSIX.1-2001 plus XSI) and C99 + * + * _XOPEN_SOURCE >= 700 + * SUSv4 (POSIX.1-2008 plus XSI) + * + * _ISOC99_SOURCE or gcc -std=c99 or g++ + * ISO C99 + * + * _ISOC11_SOURCE or gcc -std=c11 or g++ -std=c++11 + * ISO C11 + * + * _ATFILE_SOURCE (implied by _POSIX_C_SOURCE >= 200809L) + * "at" functions + * + * _LARGEFILE_SOURCE (deprecated by _XOPEN_SOURCE >= 500) + * fseeko, ftello + * + * _GNU_SOURCE + * All of the above plus GNU extensions + * + * _BSD_SOURCE (deprecated by _DEFAULT_SOURCE) + * _SVID_SOURCE (deprecated by _DEFAULT_SOURCE) + * _DEFAULT_SOURCE (or none of the above) + * POSIX-1.2008 with BSD and SVr4 extensions + * + * _FORTIFY_SOURCE = 1 or 2 + * Object Size Checking function wrappers + */ + +#ifdef _GNU_SOURCE +#undef _ATFILE_SOURCE +#define _ATFILE_SOURCE 1 +#undef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE 1 +#undef _ISOC99_SOURCE +#define _ISOC99_SOURCE 1 +#undef _ISOC11_SOURCE +#define _ISOC11_SOURCE 1 +#undef _POSIX_SOURCE +#define _POSIX_SOURCE 1 +#undef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200809L +#undef _XOPEN_SOURCE +#define _XOPEN_SOURCE 700 +#undef _XOPEN_SOURCE_EXTENDED +#define _XOPEN_SOURCE_EXTENDED 1 +#endif /* _GNU_SOURCE */ + +#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || \ + (!defined(__STRICT_ANSI__) && !defined(_ANSI_SOURCE) && \ + !defined(_ISOC99_SOURCE) && !defined(_POSIX_SOURCE) && \ + !defined(_POSIX_C_SOURCE) && !defined(_XOPEN_SOURCE)) +#undef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE 1 +#endif + +#if defined(_DEFAULT_SOURCE) +#undef _POSIX_SOURCE +#define _POSIX_SOURCE 1 +#undef _POSIX_C_SOURCE +#define _POSIX_C_SOURCE 200809L +#endif + +#if !defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + ((!defined(__STRICT_ANSI__) && !defined(_ANSI_SOURCE)) || \ + (_XOPEN_SOURCE - 0) >= 500) +#define _POSIX_SOURCE 1 +#if !defined(_XOPEN_SOURCE) || (_XOPEN_SOURCE - 0) >= 700 +#define _POSIX_C_SOURCE 200809L +#elif (_XOPEN_SOURCE - 0) >= 600 +#define _POSIX_C_SOURCE 200112L +#elif (_XOPEN_SOURCE - 0) >= 500 +#define _POSIX_C_SOURCE 199506L +#elif (_XOPEN_SOURCE - 0) < 500 +#define _POSIX_C_SOURCE 2 +#endif +#endif + +#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200809 +#undef _ATFILE_SOURCE +#define _ATFILE_SOURCE 1 +#endif + +/* + * The following private macros are used throughout the headers to control + * which symbols should be exposed. They are for internal use only, as + * indicated by the leading double underscore, and must never be used outside + * of these headers. + * + * __POSIX_VISIBLE + * any version of POSIX.1; enabled by default, or with _POSIX_SOURCE, + * any value of _POSIX_C_SOURCE, or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 2 + * POSIX.2-1992; enabled by default, with _POSIX_C_SOURCE >= 2, + * or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 199309 + * POSIX.1b-1993; enabled by default, with _POSIX_C_SOURCE >= 199309L, + * or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 199506 + * POSIX.1c-1995; enabled by default, with _POSIX_C_SOURCE >= 199506L, + * or _XOPEN_SOURCE >= 500. + * + * __POSIX_VISIBLE >= 200112 + * POSIX.1-2001; enabled by default, with _POSIX_C_SOURCE >= 200112L, + * or _XOPEN_SOURCE >= 600. + * + * __POSIX_VISIBLE >= 200809 + * POSIX.1-2008; enabled by default, with _POSIX_C_SOURCE >= 200809L, + * or _XOPEN_SOURCE >= 700. + * + * __XSI_VISIBLE + * XPG4 XSI extensions; enabled with any version of _XOPEN_SOURCE. + * + * __XSI_VISIBLE >= 4 + * SUSv1 XSI extensions; enabled with both _XOPEN_SOURCE and + * _XOPEN_SOURCE_EXTENDED together. + * + * __XSI_VISIBLE >= 500 + * SUSv2 XSI extensions; enabled with _XOPEN_SOURCE >= 500. + * + * __XSI_VISIBLE >= 600 + * SUSv3 XSI extensions; enabled with _XOPEN_SOURCE >= 600. + * + * __XSI_VISIBLE >= 700 + * SUSv4 XSI extensions; enabled with _XOPEN_SOURCE >= 700. + * + * __ISO_C_VISIBLE >= 1999 + * ISO C99; enabled with gcc -std=c99 or newer (on by default since GCC 5), + * any version of C++, or with _ISOC99_SOURCE, _POSIX_C_SOURCE >= 200112L, + * or _XOPEN_SOURCE >= 600. + * + * __ISO_C_VISIBLE >= 2011 + * ISO C11; enabled with gcc -std=c11 or newer (on by default since GCC 5), + * g++ -std=c++11 or newer (on by default since GCC 6), or with + * _ISOC11_SOURCE. + * + * __ATFILE_VISIBLE + * "at" functions; enabled by default, with _ATFILE_SOURCE, + * _POSIX_C_SOURCE >= 200809L, or _XOPEN_SOURCE >= 700. + * + * __LARGEFILE_VISIBLE + * fseeko, ftello; enabled with _LARGEFILE_SOURCE or _XOPEN_SOURCE >= 500. + * + * __BSD_VISIBLE + * BSD extensions; enabled by default, or with _BSD_SOURCE. + * + * __SVID_VISIBLE + * SVr4 extensions; enabled by default, or with _SVID_SOURCE. + * + * __MISC_VISIBLE + * Extensions found in both BSD and SVr4 (shorthand for + * (__BSD_VISIBLE || __SVID_VISIBLE)), or newlib-specific + * extensions; enabled by default. + * + * __GNU_VISIBLE + * GNU extensions; enabled with _GNU_SOURCE. + * + * __SSP_FORTIFY_LEVEL + * Object Size Checking; defined to 0 (off), 1, or 2. + * + * In all cases above, "enabled by default" means either by defining + * _DEFAULT_SOURCE, or by not defining any of the public feature test macros. + */ + +#ifdef _ATFILE_SOURCE +#define __ATFILE_VISIBLE 1 +#else +#define __ATFILE_VISIBLE 0 +#endif + +#ifdef _DEFAULT_SOURCE +#define __BSD_VISIBLE 1 +#else +#define __BSD_VISIBLE 0 +#endif + +#ifdef _GNU_SOURCE +#define __GNU_VISIBLE 1 +#else +#define __GNU_VISIBLE 0 +#endif + +#if defined(_ISOC11_SOURCE) || \ + (__STDC_VERSION__ - 0) >= 201112L || (__cplusplus - 0) >= 201103L +#define __ISO_C_VISIBLE 2011 +#elif defined(_ISOC99_SOURCE) || (_POSIX_C_SOURCE - 0) >= 200112L || \ + (__STDC_VERSION__ - 0) >= 199901L || defined(__cplusplus) +#define __ISO_C_VISIBLE 1999 +#else +#define __ISO_C_VISIBLE 1990 +#endif + +#if defined(_LARGEFILE_SOURCE) || (_XOPEN_SOURCE - 0) >= 500 +#define __LARGEFILE_VISIBLE 1 +#else +#define __LARGEFILE_VISIBLE 0 +#endif + +#ifdef _DEFAULT_SOURCE +#define __MISC_VISIBLE 1 +#else +#define __MISC_VISIBLE 0 +#endif + +#if (_POSIX_C_SOURCE - 0) >= 200809L +#define __POSIX_VISIBLE 200809 +#elif (_POSIX_C_SOURCE - 0) >= 200112L +#define __POSIX_VISIBLE 200112 +#elif (_POSIX_C_SOURCE - 0) >= 199506L +#define __POSIX_VISIBLE 199506 +#elif (_POSIX_C_SOURCE - 0) >= 199309L +#define __POSIX_VISIBLE 199309 +#elif (_POSIX_C_SOURCE - 0) >= 2 || defined(_XOPEN_SOURCE) +#define __POSIX_VISIBLE 199209 +#elif defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) +#define __POSIX_VISIBLE 199009 +#else +#define __POSIX_VISIBLE 0 +#endif + +#ifdef _DEFAULT_SOURCE +#define __SVID_VISIBLE 1 +#else +#define __SVID_VISIBLE 0 +#endif + +#if (_XOPEN_SOURCE - 0) >= 700 +#define __XSI_VISIBLE 700 +#elif (_XOPEN_SOURCE - 0) >= 600 +#define __XSI_VISIBLE 600 +#elif (_XOPEN_SOURCE - 0) >= 500 +#define __XSI_VISIBLE 500 +#elif defined(_XOPEN_SOURCE) && defined(_XOPEN_SOURCE_EXTENDED) +#define __XSI_VISIBLE 4 +#elif defined(_XOPEN_SOURCE) +#define __XSI_VISIBLE 1 +#else +#define __XSI_VISIBLE 0 +#endif + +#if _FORTIFY_SOURCE > 0 && !defined(__cplusplus) && !defined(__lint__) && \ + (__OPTIMIZE__ > 0 || defined(__clang__)) && __GNUC_PREREQ__(4, 1) && \ + !defined(_LIBC) +# if _FORTIFY_SOURCE > 1 +# define __SSP_FORTIFY_LEVEL 2 +# else +# define __SSP_FORTIFY_LEVEL 1 +# endif +#else +# define __SSP_FORTIFY_LEVEL 0 +#endif + +/* RTEMS adheres to POSIX -- 1003.1b with some features from annexes. */ + +#ifdef __rtems__ +#define _POSIX_JOB_CONTROL 1 +#define _POSIX_SAVED_IDS 1 +#define _POSIX_VERSION 199309L +#define _POSIX_ASYNCHRONOUS_IO 1 +#define _POSIX_FSYNC 1 +#define _POSIX_MAPPED_FILES 1 +#define _POSIX_MEMLOCK 1 +#define _POSIX_MEMLOCK_RANGE 1 +#define _POSIX_MEMORY_PROTECTION 1 +#define _POSIX_MESSAGE_PASSING 1 +#define _POSIX_MONOTONIC_CLOCK 200112L +#define _POSIX_CLOCK_SELECTION 200112L +#define _POSIX_PRIORITIZED_IO 1 +#define _POSIX_PRIORITY_SCHEDULING 1 +#define _POSIX_REALTIME_SIGNALS 1 +#define _POSIX_SEMAPHORES 1 +#define _POSIX_SHARED_MEMORY_OBJECTS 1 +#define _POSIX_SYNCHRONIZED_IO 1 +#define _POSIX_TIMERS 1 +#define _POSIX_BARRIERS 200112L +#define _POSIX_READER_WRITER_LOCKS 200112L +#define _POSIX_SPIN_LOCKS 200112L + + +/* In P1003.1b but defined by drafts at least as early as P1003.1c/D10 */ +#define _POSIX_THREADS 1 +#define _POSIX_THREAD_ATTR_STACKADDR 1 +#define _POSIX_THREAD_ATTR_STACKSIZE 1 +#define _POSIX_THREAD_PRIORITY_SCHEDULING 1 +#define _POSIX_THREAD_PRIO_INHERIT 1 +#define _POSIX_THREAD_PRIO_PROTECT 1 +#define _POSIX_THREAD_PROCESS_SHARED 1 +#define _POSIX_THREAD_SAFE_FUNCTIONS 1 + +/* P1003.4b/D8 defines the constants below this comment. */ +#define _POSIX_SPAWN 1 +#define _POSIX_TIMEOUTS 1 +#define _POSIX_CPUTIME 1 +#define _POSIX_THREAD_CPUTIME 1 +#define _POSIX_SPORADIC_SERVER 1 +#define _POSIX_THREAD_SPORADIC_SERVER 1 +#define _POSIX_DEVICE_CONTROL 1 +#define _POSIX_DEVCTL_DIRECTION 1 +#define _POSIX_INTERRUPT_CONTROL 1 +#define _POSIX_ADVISORY_INFO 1 + +/* UNIX98 added some new pthread mutex attributes */ +#define _UNIX98_THREAD_MUTEX_ATTRIBUTES 1 + +/* POSIX 1003.26-2003 defined device control method */ +#define _POSIX_26_VERSION 200312L + +#endif + +/* XMK loosely adheres to POSIX -- 1003.1 */ +#ifdef __XMK__ +#define _POSIX_THREADS 1 +#define _POSIX_THREAD_PRIORITY_SCHEDULING 1 +#endif + + +#ifdef __svr4__ +# define _POSIX_JOB_CONTROL 1 +# define _POSIX_SAVED_IDS 1 +# define _POSIX_VERSION 199009L +#endif + +#ifdef __CYGWIN__ + +#if __POSIX_VISIBLE >= 200809 +#define _POSIX_VERSION 200809L +#define _POSIX2_VERSION 200809L +#elif __POSIX_VISIBLE >= 200112 +#define _POSIX_VERSION 200112L +#define _POSIX2_VERSION 200112L +#elif __POSIX_VISIBLE >= 199506 +#define _POSIX_VERSION 199506L +#define _POSIX2_VERSION 199506L +#elif __POSIX_VISIBLE >= 199309 +#define _POSIX_VERSION 199309L +#define _POSIX2_VERSION 199209L +#elif __POSIX_VISIBLE >= 199209 +#define _POSIX_VERSION 199009L +#define _POSIX2_VERSION 199209L +#elif __POSIX_VISIBLE +#define _POSIX_VERSION 199009L +#endif +#if __XSI_VISIBLE >= 4 +#define _XOPEN_VERSION __XSI_VISIBLE +#endif + +#define _POSIX_ADVISORY_INFO 200809L +#define _POSIX_ASYNCHRONOUS_IO 200809L +#define _POSIX_BARRIERS 200809L +#define _POSIX_CHOWN_RESTRICTED 1 +#define _POSIX_CLOCK_SELECTION 200809L +#define _POSIX_CPUTIME 200809L +#define _POSIX_FSYNC 200809L +#define _POSIX_IPV6 200809L +#define _POSIX_JOB_CONTROL 1 +#define _POSIX_MAPPED_FILES 200809L +/* #define _POSIX_MEMLOCK -1 */ +#define _POSIX_MEMLOCK_RANGE 200809L +#define _POSIX_MEMORY_PROTECTION 200809L +#define _POSIX_MESSAGE_PASSING 200809L +#define _POSIX_MONOTONIC_CLOCK 200809L +#define _POSIX_NO_TRUNC 1 +/* #define _POSIX_PRIORITIZED_IO -1 */ +#define _POSIX_PRIORITY_SCHEDULING 200809L +#define _POSIX_RAW_SOCKETS 200809L +#define _POSIX_READER_WRITER_LOCKS 200809L +#define _POSIX_REALTIME_SIGNALS 200809L +#define _POSIX_REGEXP 1 +#define _POSIX_SAVED_IDS 1 +#define _POSIX_SEMAPHORES 200809L +#define _POSIX_SHARED_MEMORY_OBJECTS 200809L +#define _POSIX_SHELL 1 +#define _POSIX_SPAWN 200809L +#define _POSIX_SPIN_LOCKS 200809L +/* #define _POSIX_SPORADIC_SERVER -1 */ +#define _POSIX_SYNCHRONIZED_IO 200809L +#define _POSIX_THREAD_ATTR_STACKADDR 200809L +#define _POSIX_THREAD_ATTR_STACKSIZE 200809L +#define _POSIX_THREAD_CPUTIME 200809L +/* #define _POSIX_THREAD_PRIO_INHERIT -1 */ +/* #define _POSIX_THREAD_PRIO_PROTECT -1 */ +#define _POSIX_THREAD_PRIORITY_SCHEDULING 200809L +#define _POSIX_THREAD_PROCESS_SHARED 200809L +#define _POSIX_THREAD_SAFE_FUNCTIONS 200809L +/* #define _POSIX_THREAD_SPORADIC_SERVER -1 */ +#define _POSIX_THREADS 200809L +#define _POSIX_TIMEOUTS 200809L +#define _POSIX_TIMERS 200809L +/* #define _POSIX_TRACE -1 */ +/* #define _POSIX_TRACE_EVENT_FILTER -1 */ +/* #define _POSIX_TRACE_INHERIT -1 */ +/* #define _POSIX_TRACE_LOG -1 */ +/* #define _POSIX_TYPED_MEMORY_OBJECTS -1 */ +#define _POSIX_VDISABLE '\0' + +#if __POSIX_VISIBLE >= 2 +#define _POSIX2_C_VERSION _POSIX2_VERSION +#define _POSIX2_C_BIND _POSIX2_VERSION +#define _POSIX2_C_DEV _POSIX2_VERSION +#define _POSIX2_CHAR_TERM _POSIX2_VERSION +/* #define _POSIX2_FORT_DEV -1 */ +/* #define _POSIX2_FORT_RUN -1 */ +/* #define _POSIX2_LOCALEDEF -1 */ +/* #define _POSIX2_PBS -1 */ +/* #define _POSIX2_PBS_ACCOUNTING -1 */ +/* #define _POSIX2_PBS_CHECKPOINT -1 */ +/* #define _POSIX2_PBS_LOCATE -1 */ +/* #define _POSIX2_PBS_MESSAGE -1 */ +/* #define _POSIX2_PBS_TRACK -1 */ +#define _POSIX2_SW_DEV _POSIX2_VERSION +#define _POSIX2_UPE _POSIX2_VERSION +#endif /* __POSIX_VISIBLE >= 2 */ + +#define _POSIX_V6_ILP32_OFF32 -1 +#ifdef __LP64__ +#define _POSIX_V6_ILP32_OFFBIG -1 +#define _POSIX_V6_LP64_OFF64 1 +#define _POSIX_V6_LPBIG_OFFBIG 1 +#else +#define _POSIX_V6_ILP32_OFFBIG 1 +#define _POSIX_V6_LP64_OFF64 -1 +#define _POSIX_V6_LPBIG_OFFBIG -1 +#endif +#define _POSIX_V7_ILP32_OFF32 _POSIX_V6_ILP32_OFF32 +#define _POSIX_V7_ILP32_OFFBIG _POSIX_V6_ILP32_OFFBIG +#define _POSIX_V7_LP64_OFF64 _POSIX_V6_LP64_OFF64 +#define _POSIX_V7_LPBIG_OFFBIG _POSIX_V6_LPBIG_OFFBIG +#define _XBS5_ILP32_OFF32 _POSIX_V6_ILP32_OFF32 +#define _XBS5_ILP32_OFFBIG _POSIX_V6_ILP32_OFFBIG +#define _XBS5_LP64_OFF64 _POSIX_V6_LP64_OFF64 +#define _XBS5_LPBIG_OFFBIG _POSIX_V6_LPBIG_OFFBIG + +#if __XSI_VISIBLE +#define _XOPEN_CRYPT 1 +#define _XOPEN_ENH_I18N 1 +/* #define _XOPEN_LEGACY -1 */ +/* #define _XOPEN_REALTIME -1 */ +/* #define _XOPEN_REALTIME_THREADS -1 */ +#define _XOPEN_SHM 1 +/* #define _XOPEN_STREAMS -1 */ +/* #define _XOPEN_UNIX -1 */ +#endif /* __XSI_VISIBLE */ + +/* + * newlib's wide char conversion functions were updated on + * 2019-01-12 + * to UNICODE version: + * 11.0.0 released 2018-06-05 + */ +#define __STDC_ISO_10646__ 201806L + +#endif /* __CYGWIN__ */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_FEATURES_H */ diff --git a/lib/include/sys/fenv.h b/lib/include/sys/fenv.h new file mode 100644 index 0000000..e0983fa --- /dev/null +++ b/lib/include/sys/fenv.h @@ -0,0 +1,113 @@ +/* + (c) Copyright 2019 Joel Sherrill + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _SYS_FENV_H_ +#define _SYS_FENV_H_ + +/******************************************************************************* + * THIS FILE IS A TEMPLATE, INTENDED TO BE USED AS A STARTING POINT FOR + * TARGET-SPECIFIC FLOATING-POINT IMPLEMENTATIONS. NOTES BELOW HIGHLIGHT THE + * BASICS OF WHAT NEEDS TO BE DEFINED. THE DEFAULT IMPLEMTATION IS + * DEGENERATE, WITH ALL FUNCTIONS RETURNING ERROR AND NO EXCEPTIONS AND NO + * ROUNDING MODES DEFINED (SINCE NONE ARE SUPPORTED). + * THE MACRO VALUES ARE EXAMPLES ONLY, ALTHOUGH TAKEN FROM A WORKING + * IMPLEMENTATION. + * REMOVE THIS NOTICE WHEN COPYING TO A REAL IMPLEMENTATION, REPLACING IT WITH + * ANY TARGET-SPECIFIC NOTES OF INTEREST. THE FENV FUNCTION MAN PAGES POINT TO + * THIS FILE AS A MEANS OF DETERMINING A FUNCTIONAL VS. NON-FUNCTIONAL + * IMPLEMENTATION. + ******************************************************************************/ +/* + * The following macros are to be defined if the respective exception is + * supported by the implementation, each with a unique bit mask: + * + * FE_DIVBYZERO + * FE_INEXACT + * FE_INVALID + * FE_OVERFLOW + * FE_UNDERFLOW + * + * Other implementation-specific exceptions may be defined, and must start + * with FE_ followed by a capital letter. + * + * FE_ALL_EXCEPT must be defined as the logical OR of all exceptions. + */ +//#define FE_DIVBYZERO 0x00000001 +//#define FE_INEXACT 0x00000002 +//#define FE_INVALID 0x00000004 +//#define FE_OVERFLOW 0x00000008 +//#define FE_UNDERFLOW 0x00000010 + +//#define FE_ALL_EXCEPT \ + //(FE_DIVBYZERO|FE_INEXACT|FE_INVALID|FE_OVERFLOW|FE_UNDERFLOW) +#define FE_ALL_EXCEPT 0 /* NONE SUPPORTED IN PLACEHOLDER TEMPLATE */ + +/* + * The following macros are to be defined if the respective rounding + * direction is supported by the implementation via the fegetround() and + * fesetround() functions, each with a unique positive value. + * + * FE_DOWNWARD + * FE_TONEAREST + * FE_TOWARDZERO + * FE_UPWARD + * + * Other implementation-specific rounding modes may be defined, and must start + * with FE_ followed by a capital letter. + */ +//#define FE_DOWNWARD 1 +//#define FE_TONEAREST 2 +//#define FE_TOWARDZERO 3 +//#define FE_UPWARD 4 + +/* + * The following typedefs are required. These should be defined properly + * to support the architecture specific implementation. See the C and + * POSIX standards for details: + * + * fenv_t + * fexcept_t + */ +typedef int fenv_t; +typedef int fexcept_t; + +/* + * Lastly, a FE_DFL_ENV macro must be defined, representing a pointer + * to const fenv_t that contains the value of the default floating point + * environment. + * + * NOTE: The extern'ed variable fe_default_env_p is an implementation + * detail of this stub. FE_DFL_ENV must point to an instance of + * fenv_t with the default fenv_t. The format of fenv_t and where + * FE_DFL_ENV is are implementation specific. + */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV _fe_dfl_env + +#endif /* _SYS_FENV_H_ */ diff --git a/lib/include/sys/file.h b/lib/include/sys/file.h new file mode 100644 index 0000000..58d4fac --- /dev/null +++ b/lib/include/sys/file.h @@ -0,0 +1,2 @@ + +#include diff --git a/lib/include/sys/iconvnls.h b/lib/include/sys/iconvnls.h new file mode 100644 index 0000000..d4ee0b7 --- /dev/null +++ b/lib/include/sys/iconvnls.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2003-2004, Artem B. Bityuckiy. + * Rights transferred to Franklin Electronic Publishers. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Funtions, macros, etc implimented in iconv library but used by other + * NLS-related subsystems too. + */ +#ifndef __SYS_ICONVNLS_H__ +#define __SYS_ICONVNLS_H__ + +#include <_ansi.h> +#include +#include +#include + +/* Iconv data path environment variable name */ +#define NLS_ENVVAR_NAME "NLSPATH" +/* Default NLSPATH value */ +#define ICONV_DEFAULT_NLSPATH "/usr/locale" +/* Direction markers */ +#define ICONV_NLS_FROM 0 +#define ICONV_NLS_TO 1 + +void +_iconv_nls_get_state (iconv_t cd, mbstate_t *ps, int direction); + +int +_iconv_nls_set_state (iconv_t cd, mbstate_t *ps, int direction); + +int +_iconv_nls_is_stateful (iconv_t cd, int direction); + +int +_iconv_nls_get_mb_cur_max (iconv_t cd, int direction); + +size_t +_iconv_nls_conv (struct _reent *rptr, iconv_t cd, + const char **inbuf, size_t *inbytesleft, + char **outbuf, size_t *outbytesleft); + +const char * +_iconv_nls_construct_filename (struct _reent *rptr, const char *file, + const char *dir, const char *ext); + + +int +_iconv_nls_open (struct _reent *rptr, const char *encoding, + iconv_t *towc, iconv_t *fromwc, int flag); + +char * +_iconv_resolve_encoding_name (struct _reent *rptr, const char *ca); + +#endif /* __SYS_ICONVNLS_H__ */ + diff --git a/lib/include/sys/lock.h b/lib/include/sys/lock.h new file mode 100644 index 0000000..5289049 --- /dev/null +++ b/lib/include/sys/lock.h @@ -0,0 +1,69 @@ +#ifndef __SYS_LOCK_H__ +#define __SYS_LOCK_H__ + +/* dummy lock routines for single-threaded aps */ + +#include +#include <_ansi.h> + +#if !defined(_RETARGETABLE_LOCKING) + +typedef int _LOCK_T; +typedef int _LOCK_RECURSIVE_T; + +#define __LOCK_INIT(class,lock) static int lock = 0; +#define __LOCK_INIT_RECURSIVE(class,lock) static int lock = 0; +#define __lock_init(lock) ((void) 0) +#define __lock_init_recursive(lock) ((void) 0) +#define __lock_close(lock) ((void) 0) +#define __lock_close_recursive(lock) ((void) 0) +#define __lock_acquire(lock) ((void) 0) +#define __lock_acquire_recursive(lock) ((void) 0) +#define __lock_try_acquire(lock) ((void) 0) +#define __lock_try_acquire_recursive(lock) ((void) 0) +#define __lock_release(lock) ((void) 0) +#define __lock_release_recursive(lock) ((void) 0) + +#else + +#ifdef __cplusplus +extern "C" { +#endif + +struct __lock; +typedef struct __lock * _LOCK_T; +#define _LOCK_RECURSIVE_T _LOCK_T + +#define __LOCK_INIT(class,lock) extern struct __lock __lock_ ## lock; \ + class _LOCK_T lock = &__lock_ ## lock +#define __LOCK_INIT_RECURSIVE(class,lock) __LOCK_INIT(class,lock) + +extern void __retarget_lock_init(_LOCK_T *lock); +#define __lock_init(lock) __retarget_lock_init(&lock) +extern void __retarget_lock_init_recursive(_LOCK_T *lock); +#define __lock_init_recursive(lock) __retarget_lock_init_recursive(&lock) +extern void __retarget_lock_close(_LOCK_T lock); +#define __lock_close(lock) __retarget_lock_close(lock) +extern void __retarget_lock_close_recursive(_LOCK_T lock); +#define __lock_close_recursive(lock) __retarget_lock_close_recursive(lock) +extern void __retarget_lock_acquire(_LOCK_T lock); +#define __lock_acquire(lock) __retarget_lock_acquire(lock) +extern void __retarget_lock_acquire_recursive(_LOCK_T lock); +#define __lock_acquire_recursive(lock) __retarget_lock_acquire_recursive(lock) +extern int __retarget_lock_try_acquire(_LOCK_T lock); +#define __lock_try_acquire(lock) __retarget_lock_try_acquire(lock) +extern int __retarget_lock_try_acquire_recursive(_LOCK_T lock); +#define __lock_try_acquire_recursive(lock) \ + __retarget_lock_try_acquire_recursive(lock) +extern void __retarget_lock_release(_LOCK_T lock); +#define __lock_release(lock) __retarget_lock_release(lock) +extern void __retarget_lock_release_recursive(_LOCK_T lock); +#define __lock_release_recursive(lock) __retarget_lock_release_recursive(lock) + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(_RETARGETABLE_LOCKING) */ + +#endif /* __SYS_LOCK_H__ */ diff --git a/lib/include/sys/param.h b/lib/include/sys/param.h new file mode 100644 index 0000000..9a6f115 --- /dev/null +++ b/lib/include/sys/param.h @@ -0,0 +1,35 @@ +/* This is a dummy file, not customized for any + particular system. If there is a param.h in libc/sys/SYSDIR/sys, + it will override this one. */ + +#ifndef _SYS_PARAM_H +# define _SYS_PARAM_H + +#include +#include +#include +#include + +#ifndef NBBY +# define NBBY 8 /* number of bits in a byte */ +#endif +#ifndef HZ +# define HZ (60) +#endif +#ifndef NOFILE +# define NOFILE (60) +#endif +#ifndef PATHSIZE +# define PATHSIZE (1024) +#endif + +#define MAXPATHLEN PATH_MAX + +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + +#ifndef howmany +#define howmany(x, y) (((x)+((y)-1))/(y)) +#endif + +#endif diff --git a/lib/include/sys/queue.h b/lib/include/sys/queue.h new file mode 100644 index 0000000..6392b62 --- /dev/null +++ b/lib/include/sys/queue.h @@ -0,0 +1,919 @@ +/*- + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + * $FreeBSD$ + */ + +#ifndef _SYS_QUEUE_H_ +#define _SYS_QUEUE_H_ + +#include + +/* + * This file defines four types of data structures: singly-linked lists, + * singly-linked tail queues, lists and tail queues. + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A singly-linked tail queue is headed by a pair of pointers, one to the + * head of the list and the other to the tail of the list. The elements are + * singly linked for minimum space and pointer manipulation overhead at the + * expense of O(n) removal for arbitrary elements. New elements can be added + * to the list after an existing element, at the head of the list, or at the + * end of the list. Elements being removed from the head of the tail queue + * should use the explicit macro for this purpose for optimum efficiency. + * A singly-linked tail queue may only be traversed in the forward direction. + * Singly-linked tail queues are ideal for applications with large datasets + * and few or no removals or for implementing a FIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may be traversed in either direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * For details on the use of these macros, see the queue(3) manual page. + * + * Below is a summary of implemented functions where: + * + means the macro is available + * - means the macro is not available + * s means the macro is available but is slow (runs in O(n) time) + * + * SLIST LIST STAILQ TAILQ + * _HEAD + + + + + * _CLASS_HEAD + + + + + * _HEAD_INITIALIZER + + + + + * _ENTRY + + + + + * _CLASS_ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - + - + + * _LAST - - + + + * _LAST_FAST - - - + + * _FOREACH + + + + + * _FOREACH_FROM + + + + + * _FOREACH_SAFE + + + + + * _FOREACH_FROM_SAFE + + + + + * _FOREACH_REVERSE - - - + + * _FOREACH_REVERSE_FROM - - - + + * _FOREACH_REVERSE_SAFE - - - + + * _FOREACH_REVERSE_FROM_SAFE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _CONCAT s s + + + * _REMOVE_AFTER + - + - + * _REMOVE_HEAD + - + - + * _REMOVE s + s + + * _SWAP + + + + + * + */ +#ifdef QUEUE_MACRO_DEBUG +#warn Use QUEUE_MACRO_DEBUG_TRACE and/or QUEUE_MACRO_DEBUG_TRASH +#define QUEUE_MACRO_DEBUG_TRACE +#define QUEUE_MACRO_DEBUG_TRASH +#endif + +#ifdef QUEUE_MACRO_DEBUG_TRACE +/* Store the last 2 places the queue element or head was altered */ +struct qm_trace { + unsigned long lastline; + unsigned long prevline; + const char *lastfile; + const char *prevfile; +}; + +#define TRACEBUF struct qm_trace trace; +#define TRACEBUF_INITIALIZER { __LINE__, 0, __FILE__, NULL } , + +#define QMD_TRACE_HEAD(head) do { \ + (head)->trace.prevline = (head)->trace.lastline; \ + (head)->trace.prevfile = (head)->trace.lastfile; \ + (head)->trace.lastline = __LINE__; \ + (head)->trace.lastfile = __FILE__; \ +} while (0) + +#define QMD_TRACE_ELEM(elem) do { \ + (elem)->trace.prevline = (elem)->trace.lastline; \ + (elem)->trace.prevfile = (elem)->trace.lastfile; \ + (elem)->trace.lastline = __LINE__; \ + (elem)->trace.lastfile = __FILE__; \ +} while (0) + +#else /* !QUEUE_MACRO_DEBUG_TRACE */ +#define QMD_TRACE_ELEM(elem) +#define QMD_TRACE_HEAD(head) +#define TRACEBUF +#define TRACEBUF_INITIALIZER +#endif /* QUEUE_MACRO_DEBUG_TRACE */ + +#ifdef QUEUE_MACRO_DEBUG_TRASH +#define TRASHIT(x) do {(x) = (void *)-1;} while (0) +#define QMD_IS_TRASHED(x) ((x) == (void *)(intptr_t)-1) +#else /* !QUEUE_MACRO_DEBUG_TRASH */ +#define TRASHIT(x) +#define QMD_IS_TRASHED(x) 0 +#endif /* QUEUE_MACRO_DEBUG_TRASH */ + +#if defined(QUEUE_MACRO_DEBUG_TRACE) || defined(QUEUE_MACRO_DEBUG_TRASH) +#define QMD_SAVELINK(name, link) void **name = (void *)&(link) +#else /* !QUEUE_MACRO_DEBUG_TRACE && !QUEUE_MACRO_DEBUG_TRASH */ +#define QMD_SAVELINK(name, link) +#endif /* QUEUE_MACRO_DEBUG_TRACE || QUEUE_MACRO_DEBUG_TRASH */ + +#ifdef __cplusplus +/* + * In C++ there can be structure lists and class lists: + */ +#define QUEUE_TYPEOF(type) type +#else +#define QUEUE_TYPEOF(type) struct type +#endif + +/* + * Singly-linked List declarations. + */ +#define SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define SLIST_CLASS_HEAD(name, type) \ +struct name { \ + class type *slh_first; /* first element */ \ +} + +#define SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +#define SLIST_CLASS_ENTRY(type) \ +struct { \ + class type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +#define QMD_SLIST_CHECK_PREVPTR(prevp, elm) do { \ + if (*(prevp) != (elm)) \ + panic("Bad prevptr *(%p) == %p != %p", \ + (prevp), *(prevp), (elm)); \ +} while (0) +#else +#define QMD_SLIST_CHECK_PREVPTR(prevp, elm) +#endif + +#define SLIST_CONCAT(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head1); \ + if (curelm == NULL) { \ + if ((SLIST_FIRST(head1) = SLIST_FIRST(head2)) != NULL) \ + SLIST_INIT(head2); \ + } else if (SLIST_FIRST(head2) != NULL) { \ + while (SLIST_NEXT(curelm, field) != NULL) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_NEXT(curelm, field) = SLIST_FIRST(head2); \ + SLIST_INIT(head2); \ + } \ +} while (0) + +#define SLIST_EMPTY(head) ((head)->slh_first == NULL) + +#define SLIST_FIRST(head) ((head)->slh_first) + +#define SLIST_FOREACH(var, head, field) \ + for ((var) = SLIST_FIRST((head)); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var); \ + (var) = SLIST_NEXT((var), field)) + +#define SLIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = SLIST_FIRST((head)); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : SLIST_FIRST((head))); \ + (var) && ((tvar) = SLIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for ((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != NULL; \ + (varp) = &SLIST_NEXT((var), field)) + +#define SLIST_INIT(head) do { \ + SLIST_FIRST((head)) = NULL; \ +} while (0) + +#define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field); \ + SLIST_NEXT((slistelm), field) = (elm); \ +} while (0) + +#define SLIST_INSERT_HEAD(head, elm, field) do { \ + SLIST_NEXT((elm), field) = SLIST_FIRST((head)); \ + SLIST_FIRST((head)) = (elm); \ +} while (0) + +#define SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define SLIST_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.sle_next); \ + if (SLIST_FIRST((head)) == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + QUEUE_TYPEOF(type) *curelm = SLIST_FIRST(head); \ + while (SLIST_NEXT(curelm, field) != (elm)) \ + curelm = SLIST_NEXT(curelm, field); \ + SLIST_REMOVE_AFTER(curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#define SLIST_REMOVE_AFTER(elm, field) do { \ + SLIST_NEXT(elm, field) = \ + SLIST_NEXT(SLIST_NEXT(elm, field), field); \ +} while (0) + +#define SLIST_REMOVE_HEAD(head, field) do { \ + SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field); \ +} while (0) + +#define SLIST_REMOVE_PREVPTR(prevp, elm, field) do { \ + QMD_SLIST_CHECK_PREVPTR(prevp, elm); \ + *(prevp) = SLIST_NEXT(elm, field); \ + TRASHIT((elm)->field.sle_next); \ +} while (0) + +#define SLIST_SWAP(head1, head2, type) do { \ + QUEUE_TYPEOF(type) *swap_first = SLIST_FIRST(head1); \ + SLIST_FIRST(head1) = SLIST_FIRST(head2); \ + SLIST_FIRST(head2) = swap_first; \ +} while (0) + +/* + * Singly-linked Tail queue declarations. + */ +#define STAILQ_HEAD(name, type) \ +struct name { \ + struct type *stqh_first;/* first element */ \ + struct type **stqh_last;/* addr of last next element */ \ +} + +#define STAILQ_CLASS_HEAD(name, type) \ +struct name { \ + class type *stqh_first; /* first element */ \ + class type **stqh_last; /* addr of last next element */ \ +} + +#define STAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).stqh_first } + +#define STAILQ_ENTRY(type) \ +struct { \ + struct type *stqe_next; /* next element */ \ +} + +#define STAILQ_CLASS_ENTRY(type) \ +struct { \ + class type *stqe_next; /* next element */ \ +} + +/* + * Singly-linked Tail queue functions. + */ +#define STAILQ_CONCAT(head1, head2) do { \ + if (!STAILQ_EMPTY((head2))) { \ + *(head1)->stqh_last = (head2)->stqh_first; \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_INIT((head2)); \ + } \ +} while (0) + +#define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) + +#define STAILQ_FIRST(head) ((head)->stqh_first) + +#define STAILQ_FOREACH(var, head, field) \ + for((var) = STAILQ_FIRST((head)); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var); \ + (var) = STAILQ_NEXT((var), field)) + +#define STAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = STAILQ_FIRST((head)); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : STAILQ_FIRST((head))); \ + (var) && ((tvar) = STAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define STAILQ_INIT(head) do { \ + STAILQ_FIRST((head)) = NULL; \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_NEXT((tqelm), field) = (elm); \ +} while (0) + +#define STAILQ_INSERT_HEAD(head, elm, field) do { \ + if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ + STAILQ_FIRST((head)) = (elm); \ +} while (0) + +#define STAILQ_INSERT_TAIL(head, elm, field) do { \ + STAILQ_NEXT((elm), field) = NULL; \ + *(head)->stqh_last = (elm); \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_LAST(head, type, field) \ + (STAILQ_EMPTY((head)) ? NULL : \ + __containerof((head)->stqh_last, \ + QUEUE_TYPEOF(type), field.stqe_next)) + +#define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) + +#define STAILQ_REMOVE(head, elm, type, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.stqe_next); \ + if (STAILQ_FIRST((head)) == (elm)) { \ + STAILQ_REMOVE_HEAD((head), field); \ + } \ + else { \ + QUEUE_TYPEOF(type) *curelm = STAILQ_FIRST(head); \ + while (STAILQ_NEXT(curelm, field) != (elm)) \ + curelm = STAILQ_NEXT(curelm, field); \ + STAILQ_REMOVE_AFTER(head, curelm, field); \ + } \ + TRASHIT(*oldnext); \ +} while (0) + +#define STAILQ_REMOVE_AFTER(head, elm, field) do { \ + if ((STAILQ_NEXT(elm, field) = \ + STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL) \ + (head)->stqh_last = &STAILQ_NEXT((elm), field); \ +} while (0) + +#define STAILQ_REMOVE_HEAD(head, field) do { \ + if ((STAILQ_FIRST((head)) = \ + STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ + if ((STAILQ_FIRST((head)) = STAILQ_NEXT((elm), field)) == NULL) \ + (head)->stqh_last = &STAILQ_FIRST((head)); \ +} while (0) + +#define STAILQ_SWAP(head1, head2, type) do { \ + QUEUE_TYPEOF(type) *swap_first = STAILQ_FIRST(head1); \ + QUEUE_TYPEOF(type) **swap_last = (head1)->stqh_last; \ + STAILQ_FIRST(head1) = STAILQ_FIRST(head2); \ + (head1)->stqh_last = (head2)->stqh_last; \ + STAILQ_FIRST(head2) = swap_first; \ + (head2)->stqh_last = swap_last; \ + if (STAILQ_EMPTY(head1)) \ + (head1)->stqh_last = &STAILQ_FIRST(head1); \ + if (STAILQ_EMPTY(head2)) \ + (head2)->stqh_last = &STAILQ_FIRST(head2); \ +} while (0) + + +/* + * List declarations. + */ +#define LIST_HEAD(name, type) \ +struct name { \ + struct type *lh_first; /* first element */ \ +} + +#define LIST_CLASS_HEAD(name, type) \ +struct name { \ + class type *lh_first; /* first element */ \ +} + +#define LIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define LIST_ENTRY(type) \ +struct { \ + struct type *le_next; /* next element */ \ + struct type **le_prev; /* address of previous next element */ \ +} + +#define LIST_CLASS_ENTRY(type) \ +struct { \ + class type *le_next; /* next element */ \ + class type **le_prev; /* address of previous next element */ \ +} + +/* + * List functions. + */ + +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_LIST_CHECK_HEAD(LIST_HEAD *head, LIST_ENTRY NAME) + * + * If the list is non-empty, validates that the first element of the list + * points back at 'head.' + */ +#define QMD_LIST_CHECK_HEAD(head, field) do { \ + if (LIST_FIRST((head)) != NULL && \ + LIST_FIRST((head))->field.le_prev != \ + &LIST_FIRST((head))) \ + panic("Bad list head %p first->prev != head", (head)); \ +} while (0) + +/* + * QMD_LIST_CHECK_NEXT(TYPE *elm, LIST_ENTRY NAME) + * + * If an element follows 'elm' in the list, validates that the next element + * points back at 'elm.' + */ +#define QMD_LIST_CHECK_NEXT(elm, field) do { \ + if (LIST_NEXT((elm), field) != NULL && \ + LIST_NEXT((elm), field)->field.le_prev != \ + &((elm)->field.le_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +/* + * QMD_LIST_CHECK_PREV(TYPE *elm, LIST_ENTRY NAME) + * + * Validates that the previous element (or head of the list) points to 'elm.' + */ +#define QMD_LIST_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.le_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_LIST_CHECK_HEAD(head, field) +#define QMD_LIST_CHECK_NEXT(elm, field) +#define QMD_LIST_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define LIST_CONCAT(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *curelm = LIST_FIRST(head1); \ + if (curelm == NULL) { \ + if ((LIST_FIRST(head1) = LIST_FIRST(head2)) != NULL) { \ + LIST_FIRST(head2)->field.le_prev = \ + &LIST_FIRST((head1)); \ + LIST_INIT(head2); \ + } \ + } else if (LIST_FIRST(head2) != NULL) { \ + while (LIST_NEXT(curelm, field) != NULL) \ + curelm = LIST_NEXT(curelm, field); \ + LIST_NEXT(curelm, field) = LIST_FIRST(head2); \ + LIST_FIRST(head2)->field.le_prev = &LIST_NEXT(curelm, field); \ + LIST_INIT(head2); \ + } \ +} while (0) + +#define LIST_EMPTY(head) ((head)->lh_first == NULL) + +#define LIST_FIRST(head) ((head)->lh_first) + +#define LIST_FOREACH(var, head, field) \ + for ((var) = LIST_FIRST((head)); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var); \ + (var) = LIST_NEXT((var), field)) + +#define LIST_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = LIST_FIRST((head)); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : LIST_FIRST((head))); \ + (var) && ((tvar) = LIST_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define LIST_INIT(head) do { \ + LIST_FIRST((head)) = NULL; \ +} while (0) + +#define LIST_INSERT_AFTER(listelm, elm, field) do { \ + QMD_LIST_CHECK_NEXT(listelm, field); \ + if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\ + LIST_NEXT((listelm), field)->field.le_prev = \ + &LIST_NEXT((elm), field); \ + LIST_NEXT((listelm), field) = (elm); \ + (elm)->field.le_prev = &LIST_NEXT((listelm), field); \ +} while (0) + +#define LIST_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_LIST_CHECK_PREV(listelm, field); \ + (elm)->field.le_prev = (listelm)->field.le_prev; \ + LIST_NEXT((elm), field) = (listelm); \ + *(listelm)->field.le_prev = (elm); \ + (listelm)->field.le_prev = &LIST_NEXT((elm), field); \ +} while (0) + +#define LIST_INSERT_HEAD(head, elm, field) do { \ + QMD_LIST_CHECK_HEAD((head), field); \ + if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL) \ + LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\ + LIST_FIRST((head)) = (elm); \ + (elm)->field.le_prev = &LIST_FIRST((head)); \ +} while (0) + +#define LIST_NEXT(elm, field) ((elm)->field.le_next) + +#define LIST_PREV(elm, head, type, field) \ + ((elm)->field.le_prev == &LIST_FIRST((head)) ? NULL : \ + __containerof((elm)->field.le_prev, \ + QUEUE_TYPEOF(type), field.le_next)) + +#define LIST_REMOVE(elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.le_next); \ + QMD_SAVELINK(oldprev, (elm)->field.le_prev); \ + QMD_LIST_CHECK_NEXT(elm, field); \ + QMD_LIST_CHECK_PREV(elm, field); \ + if (LIST_NEXT((elm), field) != NULL) \ + LIST_NEXT((elm), field)->field.le_prev = \ + (elm)->field.le_prev; \ + *(elm)->field.le_prev = LIST_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ +} while (0) + +#define LIST_SWAP(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *swap_tmp = LIST_FIRST(head1); \ + LIST_FIRST((head1)) = LIST_FIRST((head2)); \ + LIST_FIRST((head2)) = swap_tmp; \ + if ((swap_tmp = LIST_FIRST((head1))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head1)); \ + if ((swap_tmp = LIST_FIRST((head2))) != NULL) \ + swap_tmp->field.le_prev = &LIST_FIRST((head2)); \ +} while (0) + +/* + * Tail queue declarations. + */ +#define TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_CLASS_HEAD(name, type) \ +struct name { \ + class type *tqh_first; /* first element */ \ + class type **tqh_last; /* addr of last next element */ \ + TRACEBUF \ +} + +#define TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first, TRACEBUF_INITIALIZER } + +#define TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +#define TAILQ_CLASS_ENTRY(type) \ +struct { \ + class type *tqe_next; /* next element */ \ + class type **tqe_prev; /* address of previous next element */ \ + TRACEBUF \ +} + +/* + * Tail queue functions. + */ +#if (defined(_KERNEL) && defined(INVARIANTS)) +/* + * QMD_TAILQ_CHECK_HEAD(TAILQ_HEAD *head, TAILQ_ENTRY NAME) + * + * If the tailq is non-empty, validates that the first element of the tailq + * points back at 'head.' + */ +#define QMD_TAILQ_CHECK_HEAD(head, field) do { \ + if (!TAILQ_EMPTY(head) && \ + TAILQ_FIRST((head))->field.tqe_prev != \ + &TAILQ_FIRST((head))) \ + panic("Bad tailq head %p first->prev != head", (head)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_TAIL(TAILQ_HEAD *head, TAILQ_ENTRY NAME) + * + * Validates that the tail of the tailq is a pointer to pointer to NULL. + */ +#define QMD_TAILQ_CHECK_TAIL(head, field) do { \ + if (*(head)->tqh_last != NULL) \ + panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_NEXT(TYPE *elm, TAILQ_ENTRY NAME) + * + * If an element follows 'elm' in the tailq, validates that the next element + * points back at 'elm.' + */ +#define QMD_TAILQ_CHECK_NEXT(elm, field) do { \ + if (TAILQ_NEXT((elm), field) != NULL && \ + TAILQ_NEXT((elm), field)->field.tqe_prev != \ + &((elm)->field.tqe_next)) \ + panic("Bad link elm %p next->prev != elm", (elm)); \ +} while (0) + +/* + * QMD_TAILQ_CHECK_PREV(TYPE *elm, TAILQ_ENTRY NAME) + * + * Validates that the previous element (or head of the tailq) points to 'elm.' + */ +#define QMD_TAILQ_CHECK_PREV(elm, field) do { \ + if (*(elm)->field.tqe_prev != (elm)) \ + panic("Bad link elm %p prev->next != elm", (elm)); \ +} while (0) +#else +#define QMD_TAILQ_CHECK_HEAD(head, field) +#define QMD_TAILQ_CHECK_TAIL(head, headname) +#define QMD_TAILQ_CHECK_NEXT(elm, field) +#define QMD_TAILQ_CHECK_PREV(elm, field) +#endif /* (_KERNEL && INVARIANTS) */ + +#define TAILQ_CONCAT(head1, head2, field) do { \ + if (!TAILQ_EMPTY(head2)) { \ + *(head1)->tqh_last = (head2)->tqh_first; \ + (head2)->tqh_first->field.tqe_prev = (head1)->tqh_last; \ + (head1)->tqh_last = (head2)->tqh_last; \ + TAILQ_INIT((head2)); \ + QMD_TRACE_HEAD(head1); \ + QMD_TRACE_HEAD(head2); \ + } \ +} while (0) + +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) + +#define TAILQ_FIRST(head) ((head)->tqh_first) + +#define TAILQ_FOREACH(var, head, field) \ + for ((var) = TAILQ_FIRST((head)); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_FROM(var, head, field) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var); \ + (var) = TAILQ_NEXT((var), field)) + +#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \ + for ((var) = TAILQ_FIRST((head)); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_FROM_SAFE(var, head, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_FIRST((head))); \ + (var) && ((tvar) = TAILQ_NEXT((var), field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_FROM(var, head, headname, field) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var); \ + (var) = TAILQ_PREV((var), headname, field)) + +#define TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar) \ + for ((var) = TAILQ_LAST((head), headname); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_FOREACH_REVERSE_FROM_SAFE(var, head, headname, field, tvar) \ + for ((var) = ((var) ? (var) : TAILQ_LAST((head), headname)); \ + (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1); \ + (var) = (tvar)) + +#define TAILQ_INIT(head) do { \ + TAILQ_FIRST((head)) = NULL; \ + (head)->tqh_last = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ +} while (0) + +#define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + QMD_TAILQ_CHECK_NEXT(listelm, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else { \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + } \ + TAILQ_NEXT((listelm), field) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&(listelm)->field); \ +} while (0) + +#define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + QMD_TAILQ_CHECK_PREV(listelm, field); \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + TAILQ_NEXT((elm), field) = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_ELEM(&(elm)->field); \ + QMD_TRACE_ELEM(&(listelm)->field); \ +} while (0) + +#define TAILQ_INSERT_HEAD(head, elm, field) do { \ + QMD_TAILQ_CHECK_HEAD(head, field); \ + if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL) \ + TAILQ_FIRST((head))->field.tqe_prev = \ + &TAILQ_NEXT((elm), field); \ + else \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + TAILQ_FIRST((head)) = (elm); \ + (elm)->field.tqe_prev = &TAILQ_FIRST((head)); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_INSERT_TAIL(head, elm, field) do { \ + QMD_TAILQ_CHECK_TAIL(head, field); \ + TAILQ_NEXT((elm), field) = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &TAILQ_NEXT((elm), field); \ + QMD_TRACE_HEAD(head); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) + +/* + * The FAST function is fast in that it causes no data access other + * then the access to the head. The standard LAST function above + * will cause a data access of both the element you want and + * the previous element. FAST is very useful for instances when + * you may want to prefetch the last data element. + */ +#define TAILQ_LAST_FAST(head, type, field) \ + (TAILQ_EMPTY(head) ? NULL : __containerof((head)->tqh_last, QUEUE_TYPEOF(type), field.tqe_next)) + +#define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) + +#define TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) + +#define TAILQ_REMOVE(head, elm, field) do { \ + QMD_SAVELINK(oldnext, (elm)->field.tqe_next); \ + QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); \ + QMD_TAILQ_CHECK_NEXT(elm, field); \ + QMD_TAILQ_CHECK_PREV(elm, field); \ + if ((TAILQ_NEXT((elm), field)) != NULL) \ + TAILQ_NEXT((elm), field)->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else { \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + QMD_TRACE_HEAD(head); \ + } \ + *(elm)->field.tqe_prev = TAILQ_NEXT((elm), field); \ + TRASHIT(*oldnext); \ + TRASHIT(*oldprev); \ + QMD_TRACE_ELEM(&(elm)->field); \ +} while (0) + +#define TAILQ_SWAP(head1, head2, type, field) do { \ + QUEUE_TYPEOF(type) *swap_first = (head1)->tqh_first; \ + QUEUE_TYPEOF(type) **swap_last = (head1)->tqh_last; \ + (head1)->tqh_first = (head2)->tqh_first; \ + (head1)->tqh_last = (head2)->tqh_last; \ + (head2)->tqh_first = swap_first; \ + (head2)->tqh_last = swap_last; \ + if ((swap_first = (head1)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head1)->tqh_first; \ + else \ + (head1)->tqh_last = &(head1)->tqh_first; \ + if ((swap_first = (head2)->tqh_first) != NULL) \ + swap_first->field.tqe_prev = &(head2)->tqh_first; \ + else \ + (head2)->tqh_last = &(head2)->tqh_first; \ +} while (0) + +#ifdef _KERNEL + +/* + * XXX insque() and remque() are an old way of handling certain queues. + * They bogusly assumes that all queue heads look alike. + */ + +struct quehead { + struct quehead *qh_link; + struct quehead *qh_rlink; +}; + +#ifdef __GNUC__ + +static __inline void +insque(void *a, void *b) +{ + struct quehead *element = (struct quehead *)a, + *head = (struct quehead *)b; + + element->qh_link = head->qh_link; + element->qh_rlink = head; + head->qh_link = element; + element->qh_link->qh_rlink = element; +} + +static __inline void +remque(void *a) +{ + struct quehead *element = (struct quehead *)a; + + element->qh_link->qh_rlink = element->qh_rlink; + element->qh_rlink->qh_link = element->qh_link; + element->qh_rlink = 0; +} + +#else /* !__GNUC__ */ + +void insque(void *a, void *b); +void remque(void *a); + +#endif /* __GNUC__ */ + +#endif /* _KERNEL */ + +#endif /* !_SYS_QUEUE_H_ */ diff --git a/lib/include/sys/reent.h b/lib/include/sys/reent.h new file mode 100644 index 0000000..c71f75d --- /dev/null +++ b/lib/include/sys/reent.h @@ -0,0 +1,896 @@ +/* This header file provides the reentrancy. */ + +/* WARNING: All identifiers here must begin with an underscore. This file is + included by stdio.h and others and we therefore must only use identifiers + in the namespace allotted to us. */ + +#ifndef _SYS_REENT_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_REENT_H_ + +#include <_ansi.h> +#include +#include + +#define _NULL 0 + +#ifndef __Long +#if __LONG_MAX__ == 2147483647L +#define __Long long +typedef unsigned __Long __ULong; +#elif __INT_MAX__ == 2147483647 +#define __Long int +typedef unsigned __Long __ULong; +#endif +#endif + +#if !defined( __Long) +#include +#endif + +#ifndef __machine_flock_t_defined +#include +typedef _LOCK_RECURSIVE_T _flock_t; +#endif + +#ifndef __Long +#define __Long __int32_t +typedef __uint32_t __ULong; +#endif + +struct _reent; + +struct __locale_t; + +/* + * If _REENT_SMALL is defined, we make struct _reent as small as possible, + * by having nearly everything possible allocated at first use. + */ + +struct _Bigint +{ + struct _Bigint *_next; + int _k, _maxwds, _sign, _wds; + __ULong _x[1]; +}; + +/* needed by reentrant structure */ +struct __tm +{ + int __tm_sec; + int __tm_min; + int __tm_hour; + int __tm_mday; + int __tm_mon; + int __tm_year; + int __tm_wday; + int __tm_yday; + int __tm_isdst; +}; + +/* + * atexit() support. + */ + +#define _ATEXIT_SIZE 32 /* must be at least 32 to guarantee ANSI conformance */ + +struct _on_exit_args { + void * _fnargs[_ATEXIT_SIZE]; /* user fn args */ + void * _dso_handle[_ATEXIT_SIZE]; + /* Bitmask is set if user function takes arguments. */ + __ULong _fntypes; /* type of exit routine - + Must have at least _ATEXIT_SIZE bits */ + /* Bitmask is set if function was registered via __cxa_atexit. */ + __ULong _is_cxa; +}; + +#ifdef _REENT_SMALL +struct _atexit { + struct _atexit *_next; /* next in list */ + int _ind; /* next index in this table */ + void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */ + struct _on_exit_args * _on_exit_args_ptr; +}; +# define _ATEXIT_INIT {_NULL, 0, {_NULL}, _NULL} +#else +struct _atexit { + struct _atexit *_next; /* next in list */ + int _ind; /* next index in this table */ + /* Some entries may already have been called, and will be NULL. */ + void (*_fns[_ATEXIT_SIZE])(void); /* the table itself */ + struct _on_exit_args _on_exit_args; +}; +# define _ATEXIT_INIT {_NULL, 0, {_NULL}, {{_NULL}, {_NULL}, 0, 0}} +#endif + +/* + * Stdio buffers. + * + * This and __FILE are defined here because we need them for struct _reent, + * but we don't want stdio.h included when stdlib.h is. + */ + +struct __sbuf { + unsigned char *_base; + int _size; +}; + +/* + * Stdio state variables. + * + * The following always hold: + * + * if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR), + * _lbfsize is -_bf._size, else _lbfsize is 0 + * if _flags&__SRD, _w is 0 + * if _flags&__SWR, _r is 0 + * + * This ensures that the getc and putc macros (or inline functions) never + * try to write or read from a file that is in `read' or `write' mode. + * (Moreover, they can, and do, automatically switch from read mode to + * write mode, and back, on "r+" and "w+" files.) + * + * _lbfsize is used only to make the inline line-buffered output stream + * code as compact as possible. + * + * _ub, _up, and _ur are used when ungetc() pushes back more characters + * than fit in the current _bf, or when ungetc() pushes back a character + * that does not match the previous one in _bf. When this happens, + * _ub._base becomes non-nil (i.e., a stream has ungetc() data iff + * _ub._base!=NULL) and _up and _ur save the current values of _p and _r. + */ + +#define _REENT_SMALL_CHECK_INIT(ptr) /* nothing */ + +/* Cygwin must use __sFILE64 for backward compatibility, even though + it's not defining __LARGE64_FILES anymore. To make sure that __sFILE + is never defined, disable it here explicitely. */ +#ifndef __CYGWIN__ + +struct __sFILE { + unsigned char *_p; /* current position in (some) buffer */ + int _r; /* read space left for getc() */ + int _w; /* write space left for putc() */ + short _flags; /* flags, below; this FILE is free if 0 */ + short _file; /* fileno, if Unix descriptor, else -1 */ + struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ + int _lbfsize; /* 0 or -_bf._size, for inline putc */ + +#ifdef _REENT_SMALL + struct _reent *_data; +#endif + + /* operations */ + void * _cookie; /* cookie passed to io functions */ + + _READ_WRITE_RETURN_TYPE (*_read) (struct _reent *, void *, + char *, _READ_WRITE_BUFSIZE_TYPE); + _READ_WRITE_RETURN_TYPE (*_write) (struct _reent *, void *, + const char *, + _READ_WRITE_BUFSIZE_TYPE); + _fpos_t (*_seek) (struct _reent *, void *, _fpos_t, int); + int (*_close) (struct _reent *, void *); + + /* separate buffer for long sequences of ungetc() */ + struct __sbuf _ub; /* ungetc buffer */ + unsigned char *_up; /* saved _p when _p is doing ungetc data */ + int _ur; /* saved _r when _r is counting ungetc data */ + + /* tricks to meet minimum requirements even when malloc() fails */ + unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ + unsigned char _nbuf[1]; /* guarantee a getc() buffer */ + + /* separate buffer for fgetline() when line crosses buffer boundary */ + struct __sbuf _lb; /* buffer for fgetline() */ + + /* Unix stdio files get aligned to block boundaries on fseek() */ + int _blksize; /* stat.st_blksize (may be != _bf._size) */ + _off_t _offset; /* current lseek offset */ + +#ifndef _REENT_SMALL + struct _reent *_data; /* Here for binary compatibility? Remove? */ +#endif + +#ifndef __SINGLE_THREAD__ + _flock_t _lock; /* for thread-safety locking */ +#endif + _mbstate_t _mbstate; /* for wide char stdio functions. */ + int _flags2; /* for future use */ +}; + +#endif /* !__CYGWIN__ */ + +#ifdef __CUSTOM_FILE_IO__ + +/* Get custom _FILE definition. */ +#include + +#else /* !__CUSTOM_FILE_IO__ */ +/* Cygwin must use __sFILE64 for backward compatibility, even though + it's not defining __LARGE64_FILES anymore. It also has to make + sure the name is the same to satisfy C++ name mangling. Overloading + _fpos64_t just fixes a build problem. The _seek64 function is + actually never used without __LARGE64_FILES being defined. */ +#if defined (__LARGE64_FILES) || defined (__CYGWIN__) +#ifdef __CYGWIN__ +#define _fpos64_t _fpos_t +#endif + +struct __sFILE64 { + unsigned char *_p; /* current position in (some) buffer */ + int _r; /* read space left for getc() */ + int _w; /* write space left for putc() */ + short _flags; /* flags, below; this FILE is free if 0 */ + short _file; /* fileno, if Unix descriptor, else -1 */ + struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ + int _lbfsize; /* 0 or -_bf._size, for inline putc */ + + struct _reent *_data; + + /* operations */ + void * _cookie; /* cookie passed to io functions */ + + _READ_WRITE_RETURN_TYPE (*_read) (struct _reent *, void *, + char *, _READ_WRITE_BUFSIZE_TYPE); + _READ_WRITE_RETURN_TYPE (*_write) (struct _reent *, void *, + const char *, + _READ_WRITE_BUFSIZE_TYPE); + _fpos_t (*_seek) (struct _reent *, void *, _fpos_t, int); + int (*_close) (struct _reent *, void *); + + /* separate buffer for long sequences of ungetc() */ + struct __sbuf _ub; /* ungetc buffer */ + unsigned char *_up; /* saved _p when _p is doing ungetc data */ + int _ur; /* saved _r when _r is counting ungetc data */ + + /* tricks to meet minimum requirements even when malloc() fails */ + unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ + unsigned char _nbuf[1]; /* guarantee a getc() buffer */ + + /* separate buffer for fgetline() when line crosses buffer boundary */ + struct __sbuf _lb; /* buffer for fgetline() */ + + /* Unix stdio files get aligned to block boundaries on fseek() */ + int _blksize; /* stat.st_blksize (may be != _bf._size) */ + int _flags2; /* for future use */ + + _off64_t _offset; /* current lseek offset */ + _fpos64_t (*_seek64) (struct _reent *, void *, _fpos64_t, int); + +#ifndef __SINGLE_THREAD__ + _flock_t _lock; /* for thread-safety locking */ +#endif + _mbstate_t _mbstate; /* for wide char stdio functions. */ +}; +typedef struct __sFILE64 __FILE; +#else +typedef struct __sFILE __FILE; +#endif /* __LARGE64_FILES */ +#endif /* !__CUSTOM_FILE_IO__ */ + +extern __FILE __sf[3]; + +struct _glue +{ + struct _glue *_next; + int _niobs; + __FILE *_iobs; +}; + +extern struct _glue __sglue; + +/* + * rand48 family support + * + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ +#define _RAND48_SEED_0 (0x330e) +#define _RAND48_SEED_1 (0xabcd) +#define _RAND48_SEED_2 (0x1234) +#define _RAND48_MULT_0 (0xe66d) +#define _RAND48_MULT_1 (0xdeec) +#define _RAND48_MULT_2 (0x0005) +#define _RAND48_ADD (0x000b) +struct _rand48 { + unsigned short _seed[3]; + unsigned short _mult[3]; + unsigned short _add; +#ifdef _REENT_SMALL + /* Put this in here as well, for good luck. */ + __extension__ unsigned long long _rand_next; +#endif +}; + +/* How big the some arrays are. */ +#define _REENT_EMERGENCY_SIZE 25 +#define _REENT_ASCTIME_SIZE 26 +#define _REENT_SIGNAL_SIZE 24 + +#ifndef _REENT_THREAD_LOCAL + +#ifdef _REENT_BACKWARD_BINARY_COMPAT +#define _REENT_INIT_RESERVED_0 0, +#define _REENT_INIT_RESERVED_1 0, +#define _REENT_INIT_RESERVED_2 0, +#define _REENT_INIT_RESERVED_6_7 _NULL, _ATEXIT_INIT, +#define _REENT_INIT_RESERVED_8 {_NULL, 0, _NULL}, +#else +#define _REENT_INIT_RESERVED_0 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_1 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_2 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_6_7 /* Nothing to initialize */ +#define _REENT_INIT_RESERVED_8 /* Nothing to initialize */ +#endif + +/* + * struct _reent + * + * This structure contains the thread-local objects needed by the library. + * It's raison d'etre is to facilitate threads by making all library routines + * reentrant. The exit handler support and FILE maintenance use dedicated + * global objects which are not included in this structure. + */ + +#ifdef _REENT_SMALL + +struct _mprec +{ + /* used by mprec routines */ + struct _Bigint *_result; + int _result_k; + struct _Bigint *_p5s; + struct _Bigint **_freelist; +}; + + +struct _misc_reent +{ + /* miscellaneous reentrant data */ + char *_strtok_last; + _mbstate_t _mblen_state; + _mbstate_t _wctomb_state; + _mbstate_t _mbtowc_state; + char _l64a_buf[8]; + int _getdate_err; + _mbstate_t _mbrlen_state; + _mbstate_t _mbrtowc_state; + _mbstate_t _mbsrtowcs_state; + _mbstate_t _wcrtomb_state; + _mbstate_t _wcsrtombs_state; +}; + +/* This version of _reent is laid out with "int"s in pairs, to help + * ports with 16-bit int's but 32-bit pointers, align nicely. */ +struct _reent +{ + /* As an exception to the above put _errno first for binary + compatibility with non _REENT_SMALL targets. */ + int _errno; /* local copy of errno */ + + /* FILE is a big struct and may change over time. To try to achieve binary + compatibility with future versions, put stdin,stdout,stderr here. + These are pointers into member __sf defined below. */ + __FILE *_stdin, *_stdout, *_stderr; /* XXX */ + + int _inc; /* used by tmpnam */ + + char *_emergency; + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + int _reserved_0; + int _reserved_1; +#endif + struct __locale_t *_locale;/* per-thread locale */ + + struct _mprec *_mp; + + void (*__cleanup) (struct _reent *); + + int _gamma_signgam; + + /* used by some fp conversion routines */ + int _cvtlen; /* should be size_t */ + char *_cvtbuf; + + struct _rand48 *_r48; + struct __tm *_localtime_buf; + char *_asctime_buf; + + /* signal info */ + void (** _sig_func)(int); + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + struct _atexit *_reserved_6; + struct _atexit _reserved_7; + struct _glue _reserved_8; +#endif + + __FILE *__sf; /* file descriptors */ + struct _misc_reent *_misc; /* strtok, multibyte states */ + char *_signal_buf; /* strsignal */ +}; + +# define _REENT_INIT(var) \ + { 0, \ + &__sf[0], \ + &__sf[1], \ + &__sf[2], \ + 0, \ + _NULL, \ + _REENT_INIT_RESERVED_0 \ + _REENT_INIT_RESERVED_1 \ + _NULL, \ + _NULL, \ + _NULL, \ + 0, \ + 0, \ + _NULL, \ + _NULL, \ + _NULL, \ + _NULL, \ + _NULL, \ + _REENT_INIT_RESERVED_6_7 \ + _REENT_INIT_RESERVED_8 \ + _NULL, \ + _NULL, \ + _NULL \ + } + +#define _REENT_INIT_PTR_ZEROED(var) \ + { (var)->_stdin = &__sf[0]; \ + (var)->_stdout = &__sf[1]; \ + (var)->_stderr = &__sf[2]; \ + } + +/* Specify how to handle reent_check malloc failures. */ +#ifdef _REENT_CHECK_VERIFY +#include +#define __reent_assert(x) ((x) ? (void)0 : __assert_func(__FILE__, __LINE__, (char *)0, "REENT malloc succeeded")) +#else +#define __reent_assert(x) ((void)0) +#endif + +#ifdef __CUSTOM_FILE_IO__ +#error Custom FILE I/O and _REENT_SMALL not currently supported. +#endif + +/* Generic _REENT check macro. */ +#define _REENT_CHECK(var, what, type, size, init) do { \ + struct _reent *_r = (var); \ + if (_r->what == NULL) { \ + _r->what = (type)malloc(size); \ + __reent_assert(_r->what); \ + init; \ + } \ +} while (0) + +#define _REENT_CHECK_TM(var) \ + _REENT_CHECK(var, _localtime_buf, struct __tm *, sizeof *((var)->_localtime_buf), \ + /* nothing */) + +#define _REENT_CHECK_ASCTIME_BUF(var) \ + _REENT_CHECK(var, _asctime_buf, char *, _REENT_ASCTIME_SIZE, \ + memset((var)->_asctime_buf, 0, _REENT_ASCTIME_SIZE)) + +/* Handle the dynamically allocated rand48 structure. */ +#define _REENT_INIT_RAND48(var) do { \ + struct _reent *_r = (var); \ + _r->_r48->_seed[0] = _RAND48_SEED_0; \ + _r->_r48->_seed[1] = _RAND48_SEED_1; \ + _r->_r48->_seed[2] = _RAND48_SEED_2; \ + _r->_r48->_mult[0] = _RAND48_MULT_0; \ + _r->_r48->_mult[1] = _RAND48_MULT_1; \ + _r->_r48->_mult[2] = _RAND48_MULT_2; \ + _r->_r48->_add = _RAND48_ADD; \ + _r->_r48->_rand_next = 1; \ +} while (0) +#define _REENT_CHECK_RAND48(var) \ + _REENT_CHECK(var, _r48, struct _rand48 *, sizeof *((var)->_r48), _REENT_INIT_RAND48((var))) + +#define _REENT_INIT_MP(var) do { \ + struct _reent *_r = (var); \ + _r->_mp->_result_k = 0; \ + _r->_mp->_result = _r->_mp->_p5s = _NULL; \ + _r->_mp->_freelist = _NULL; \ +} while (0) +#define _REENT_CHECK_MP(var) \ + _REENT_CHECK(var, _mp, struct _mprec *, sizeof *((var)->_mp), _REENT_INIT_MP(var)) + +#define _REENT_CHECK_EMERGENCY(var) \ + _REENT_CHECK(var, _emergency, char *, _REENT_EMERGENCY_SIZE, /* nothing */) + +#define _REENT_INIT_MISC(var) do { \ + struct _reent *_r = (var); \ + _r->_misc->_strtok_last = _NULL; \ + _r->_misc->_mblen_state.__count = 0; \ + _r->_misc->_mblen_state.__value.__wch = 0; \ + _r->_misc->_wctomb_state.__count = 0; \ + _r->_misc->_wctomb_state.__value.__wch = 0; \ + _r->_misc->_mbtowc_state.__count = 0; \ + _r->_misc->_mbtowc_state.__value.__wch = 0; \ + _r->_misc->_mbrlen_state.__count = 0; \ + _r->_misc->_mbrlen_state.__value.__wch = 0; \ + _r->_misc->_mbrtowc_state.__count = 0; \ + _r->_misc->_mbrtowc_state.__value.__wch = 0; \ + _r->_misc->_mbsrtowcs_state.__count = 0; \ + _r->_misc->_mbsrtowcs_state.__value.__wch = 0; \ + _r->_misc->_wcrtomb_state.__count = 0; \ + _r->_misc->_wcrtomb_state.__value.__wch = 0; \ + _r->_misc->_wcsrtombs_state.__count = 0; \ + _r->_misc->_wcsrtombs_state.__value.__wch = 0; \ + _r->_misc->_l64a_buf[0] = '\0'; \ + _r->_misc->_getdate_err = 0; \ +} while (0) +#define _REENT_CHECK_MISC(var) \ + _REENT_CHECK(var, _misc, struct _misc_reent *, sizeof *((var)->_misc), _REENT_INIT_MISC(var)) + +#define _REENT_CHECK_SIGNAL_BUF(var) \ + _REENT_CHECK(var, _signal_buf, char *, _REENT_SIGNAL_SIZE, /* nothing */) + +#define _REENT_SIGNGAM(ptr) ((ptr)->_gamma_signgam) +#define _REENT_RAND_NEXT(ptr) ((ptr)->_r48->_rand_next) +#define _REENT_RAND48_SEED(ptr) ((ptr)->_r48->_seed) +#define _REENT_RAND48_MULT(ptr) ((ptr)->_r48->_mult) +#define _REENT_RAND48_ADD(ptr) ((ptr)->_r48->_add) +#define _REENT_MP_RESULT(ptr) ((ptr)->_mp->_result) +#define _REENT_MP_RESULT_K(ptr) ((ptr)->_mp->_result_k) +#define _REENT_MP_P5S(ptr) ((ptr)->_mp->_p5s) +#define _REENT_MP_FREELIST(ptr) ((ptr)->_mp->_freelist) +#define _REENT_ASCTIME_BUF(ptr) ((ptr)->_asctime_buf) +#define _REENT_TM(ptr) ((ptr)->_localtime_buf) +#define _REENT_STRTOK_LAST(ptr) ((ptr)->_misc->_strtok_last) +#define _REENT_MBLEN_STATE(ptr) ((ptr)->_misc->_mblen_state) +#define _REENT_MBTOWC_STATE(ptr)((ptr)->_misc->_mbtowc_state) +#define _REENT_WCTOMB_STATE(ptr)((ptr)->_misc->_wctomb_state) +#define _REENT_MBRLEN_STATE(ptr) ((ptr)->_misc->_mbrlen_state) +#define _REENT_MBRTOWC_STATE(ptr) ((ptr)->_misc->_mbrtowc_state) +#define _REENT_MBSRTOWCS_STATE(ptr) ((ptr)->_misc->_mbsrtowcs_state) +#define _REENT_WCRTOMB_STATE(ptr) ((ptr)->_misc->_wcrtomb_state) +#define _REENT_WCSRTOMBS_STATE(ptr) ((ptr)->_misc->_wcsrtombs_state) +#define _REENT_L64A_BUF(ptr) ((ptr)->_misc->_l64a_buf) +#define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_misc->_getdate_err)) +#define _REENT_SIGNAL_BUF(ptr) ((ptr)->_signal_buf) + +#else /* !_REENT_SMALL */ + +struct _reent +{ + int _errno; /* local copy of errno */ + + /* FILE is a big struct and may change over time. To try to achieve binary + compatibility with future versions, put stdin,stdout,stderr here. + These are pointers into member __sf defined below. */ + __FILE *_stdin, *_stdout, *_stderr; + + int _inc; /* used by tmpnam */ + char _emergency[_REENT_EMERGENCY_SIZE]; + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + int _reserved_1; +#endif + struct __locale_t *_locale;/* per-thread locale */ + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + int _reserved_0; +#endif + + void (*__cleanup) (struct _reent *); + + /* used by mprec routines */ + struct _Bigint *_result; + int _result_k; + struct _Bigint *_p5s; + struct _Bigint **_freelist; + + /* used by some fp conversion routines */ + int _cvtlen; /* should be size_t */ + char *_cvtbuf; + + union + { + struct + { +#ifdef _REENT_BACKWARD_BINARY_COMPAT + unsigned int _reserved_2; +#endif + char * _strtok_last; + char _asctime_buf[_REENT_ASCTIME_SIZE]; + struct __tm _localtime_buf; + int _gamma_signgam; + __extension__ unsigned long long _rand_next; + struct _rand48 _r48; + _mbstate_t _mblen_state; + _mbstate_t _mbtowc_state; + _mbstate_t _wctomb_state; + char _l64a_buf[8]; + char _signal_buf[_REENT_SIGNAL_SIZE]; + int _getdate_err; + _mbstate_t _mbrlen_state; + _mbstate_t _mbrtowc_state; + _mbstate_t _mbsrtowcs_state; + _mbstate_t _wcrtomb_state; + _mbstate_t _wcsrtombs_state; + int _h_errno; + } _reent; +#ifdef _REENT_BACKWARD_BINARY_COMPAT + struct + { + unsigned char * _reserved_3[30]; + unsigned int _reserved_4[30]; + } _reserved_5; +#endif + } _new; + +#ifdef _REENT_BACKWARD_BINARY_COMPAT + struct _atexit *_reserved_6; + struct _atexit _reserved_7; +#endif + + /* signal info */ + void (**_sig_func)(int); +}; + +#define _REENT_INIT(var) \ + { 0, \ + &__sf[0], \ + &__sf[1], \ + &__sf[2], \ + 0, \ + "", \ + _REENT_INIT_RESERVED_1 \ + _NULL, \ + _REENT_INIT_RESERVED_0 \ + _NULL, \ + _NULL, \ + 0, \ + _NULL, \ + _NULL, \ + 0, \ + _NULL, \ + { \ + { \ + _REENT_INIT_RESERVED_2 \ + _NULL, \ + "", \ + {0, 0, 0, 0, 0, 0, 0, 0, 0}, \ + 0, \ + 1, \ + { \ + {_RAND48_SEED_0, _RAND48_SEED_1, _RAND48_SEED_2}, \ + {_RAND48_MULT_0, _RAND48_MULT_1, _RAND48_MULT_2}, \ + _RAND48_ADD \ + }, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}}, \ + "", \ + "", \ + 0, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}}, \ + {0, {0}} \ + } \ + }, \ + _REENT_INIT_RESERVED_6_7 \ + _NULL \ + } + +#define _REENT_INIT_PTR_ZEROED(var) \ + { (var)->_stdin = &__sf[0]; \ + (var)->_stdout = &__sf[1]; \ + (var)->_stderr = &__sf[2]; \ + (var)->_new._reent._rand_next = 1; \ + (var)->_new._reent._r48._seed[0] = _RAND48_SEED_0; \ + (var)->_new._reent._r48._seed[1] = _RAND48_SEED_1; \ + (var)->_new._reent._r48._seed[2] = _RAND48_SEED_2; \ + (var)->_new._reent._r48._mult[0] = _RAND48_MULT_0; \ + (var)->_new._reent._r48._mult[1] = _RAND48_MULT_1; \ + (var)->_new._reent._r48._mult[2] = _RAND48_MULT_2; \ + (var)->_new._reent._r48._add = _RAND48_ADD; \ + } + +#define _REENT_CHECK_RAND48(ptr) /* nothing */ +#define _REENT_CHECK_MP(ptr) /* nothing */ +#define _REENT_CHECK_TM(ptr) /* nothing */ +#define _REENT_CHECK_ASCTIME_BUF(ptr) /* nothing */ +#define _REENT_CHECK_EMERGENCY(ptr) /* nothing */ +#define _REENT_CHECK_MISC(ptr) /* nothing */ +#define _REENT_CHECK_SIGNAL_BUF(ptr) /* nothing */ + +#define _REENT_SIGNGAM(ptr) ((ptr)->_new._reent._gamma_signgam) +#define _REENT_RAND_NEXT(ptr) ((ptr)->_new._reent._rand_next) +#define _REENT_RAND48_SEED(ptr) ((ptr)->_new._reent._r48._seed) +#define _REENT_RAND48_MULT(ptr) ((ptr)->_new._reent._r48._mult) +#define _REENT_RAND48_ADD(ptr) ((ptr)->_new._reent._r48._add) +#define _REENT_MP_RESULT(ptr) ((ptr)->_result) +#define _REENT_MP_RESULT_K(ptr) ((ptr)->_result_k) +#define _REENT_MP_P5S(ptr) ((ptr)->_p5s) +#define _REENT_MP_FREELIST(ptr) ((ptr)->_freelist) +#define _REENT_ASCTIME_BUF(ptr) ((ptr)->_new._reent._asctime_buf) +#define _REENT_TM(ptr) (&(ptr)->_new._reent._localtime_buf) +#define _REENT_STRTOK_LAST(ptr) ((ptr)->_new._reent._strtok_last) +#define _REENT_MBLEN_STATE(ptr) ((ptr)->_new._reent._mblen_state) +#define _REENT_MBTOWC_STATE(ptr)((ptr)->_new._reent._mbtowc_state) +#define _REENT_WCTOMB_STATE(ptr)((ptr)->_new._reent._wctomb_state) +#define _REENT_MBRLEN_STATE(ptr)((ptr)->_new._reent._mbrlen_state) +#define _REENT_MBRTOWC_STATE(ptr)((ptr)->_new._reent._mbrtowc_state) +#define _REENT_MBSRTOWCS_STATE(ptr)((ptr)->_new._reent._mbsrtowcs_state) +#define _REENT_WCRTOMB_STATE(ptr)((ptr)->_new._reent._wcrtomb_state) +#define _REENT_WCSRTOMBS_STATE(ptr)((ptr)->_new._reent._wcsrtombs_state) +#define _REENT_L64A_BUF(ptr) ((ptr)->_new._reent._l64a_buf) +#define _REENT_SIGNAL_BUF(ptr) ((ptr)->_new._reent._signal_buf) +#define _REENT_GETDATE_ERR_P(ptr) (&((ptr)->_new._reent._getdate_err)) + +#endif /* !_REENT_SMALL */ + +#define _REENT_CLEANUP(_ptr) ((_ptr)->__cleanup) +#define _REENT_CVTBUF(_ptr) ((_ptr)->_cvtbuf) +#define _REENT_CVTLEN(_ptr) ((_ptr)->_cvtlen) +#define _REENT_EMERGENCY(_ptr) ((_ptr)->_emergency) +#define _REENT_ERRNO(_ptr) ((_ptr)->_errno) +#define _REENT_INC(_ptr) ((_ptr)->_inc) +#define _REENT_LOCALE(_ptr) ((_ptr)->_locale) +#define _REENT_SIG_FUNC(_ptr) ((_ptr)->_sig_func) +#define _REENT_STDIN(_ptr) ((_ptr)->_stdin) +#define _REENT_STDOUT(_ptr) ((_ptr)->_stdout) +#define _REENT_STDERR(_ptr) ((_ptr)->_stderr) + +#define _REENT_INIT_PTR(var) \ + { memset((var), 0, sizeof(*(var))); \ + _REENT_INIT_PTR_ZEROED(var); \ + } + +/* + * All references to struct _reent are via this pointer. + * Internally, newlib routines that need to reference it should use _REENT. + */ + +#ifndef __ATTRIBUTE_IMPURE_PTR__ +#define __ATTRIBUTE_IMPURE_PTR__ +#endif + +extern struct _reent *_impure_ptr __ATTRIBUTE_IMPURE_PTR__; + +#ifndef __ATTRIBUTE_IMPURE_DATA__ +#define __ATTRIBUTE_IMPURE_DATA__ +#endif + +extern struct _reent _impure_data __ATTRIBUTE_IMPURE_DATA__; + +/* #define _REENT_ONLY define this to get only reentrant routines */ + +#if defined(__DYNAMIC_REENT__) && !defined(__SINGLE_THREAD__) +#ifndef __getreent + struct _reent * __getreent (void); +#endif +# define _REENT (__getreent()) +#else /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ +# define _REENT _impure_ptr +#endif /* __SINGLE_THREAD__ || !__DYNAMIC_REENT__ */ + +#define _REENT_IS_NULL(_ptr) ((_ptr) == NULL) + +#define _GLOBAL_REENT (&_impure_data) + +#else /* _REENT_THREAD_LOCAL */ + +#define _REENT NULL +#define _GLOBAL_REENT NULL + +/* + * Since _REENT is defined as NULL, this macro ensures that calls to + * CHECK_INIT() do not automatically fail. + */ +#define _REENT_IS_NULL(_ptr) 0 + +#define _REENT_CHECK_RAND48(ptr) /* nothing */ +#define _REENT_CHECK_MP(ptr) /* nothing */ +#define _REENT_CHECK_TM(ptr) /* nothing */ +#define _REENT_CHECK_ASCTIME_BUF(ptr) /* nothing */ +#define _REENT_CHECK_EMERGENCY(ptr) /* nothing */ +#define _REENT_CHECK_MISC(ptr) /* nothing */ +#define _REENT_CHECK_SIGNAL_BUF(ptr) /* nothing */ + +extern _Thread_local char _tls_asctime_buf[_REENT_ASCTIME_SIZE]; +#define _REENT_ASCTIME_BUF(_ptr) (_tls_asctime_buf) +extern _Thread_local char *_tls_cvtbuf; +#define _REENT_CVTBUF(_ptr) (_tls_cvtbuf) +extern _Thread_local int _tls_cvtlen; +#define _REENT_CVTLEN(_ptr) (_tls_cvtlen) +extern _Thread_local void (*_tls_cleanup)(struct _reent *); +#define _REENT_CLEANUP(_ptr) (_tls_cleanup) +extern _Thread_local char _tls_emergency[_REENT_EMERGENCY_SIZE]; +#define _REENT_EMERGENCY(_ptr) (_tls_emergency) +extern _Thread_local int _tls_errno; +#define _REENT_ERRNO(_ptr) (_tls_errno) +extern _Thread_local int _tls_getdate_err; +#define _REENT_GETDATE_ERR_P(_ptr) (&_tls_getdate_err) +extern _Thread_local int _tls_inc; +#define _REENT_INC(_ptr) (_tls_inc) +extern _Thread_local char _tls_l64a_buf[8]; +#define _REENT_L64A_BUF(_ptr) (_tls_l64a_buf) +extern _Thread_local struct __locale_t *_tls_locale; +#define _REENT_LOCALE(_ptr) (_tls_locale) +extern _Thread_local _mbstate_t _tls_mblen_state; +#define _REENT_MBLEN_STATE(_ptr) (_tls_mblen_state) +extern _Thread_local _mbstate_t _tls_mbrlen_state; +#define _REENT_MBRLEN_STATE(_ptr) (_tls_mbrlen_state) +extern _Thread_local _mbstate_t _tls_mbrtowc_state; +#define _REENT_MBRTOWC_STATE(_ptr) (_tls_mbrtowc_state) +extern _Thread_local _mbstate_t _tls_mbsrtowcs_state; +#define _REENT_MBSRTOWCS_STATE(_ptr) (_tls_mbsrtowcs_state) +extern _Thread_local _mbstate_t _tls_mbtowc_state; +#define _REENT_MBTOWC_STATE(_ptr) (_tls_mbtowc_state) +extern _Thread_local struct _Bigint **_tls_mp_freelist; +#define _REENT_MP_FREELIST(_ptr) (_tls_mp_freelist) +extern _Thread_local struct _Bigint *_tls_mp_p5s; +#define _REENT_MP_P5S(_ptr) (_tls_mp_p5s) +extern _Thread_local struct _Bigint *_tls_mp_result; +#define _REENT_MP_RESULT(_ptr) (_tls_mp_result) +extern _Thread_local int _tls_mp_result_k; +#define _REENT_MP_RESULT_K(_ptr) (_tls_mp_result_k) +extern _Thread_local unsigned short _tls_rand48_add; +#define _REENT_RAND48_ADD(_ptr) (_tls_rand48_add) +extern _Thread_local unsigned short _tls_rand48_mult[3]; +#define _REENT_RAND48_MULT(_ptr) (_tls_rand48_mult) +extern _Thread_local unsigned short _tls_rand48_seed[3]; +#define _REENT_RAND48_SEED(_ptr) (_tls_rand48_seed) +extern _Thread_local unsigned long long _tls_rand_next; +#define _REENT_RAND_NEXT(_ptr) (_tls_rand_next) +extern _Thread_local void (**_tls_sig_func)(int); +#define _REENT_SIG_FUNC(_ptr) (_tls_sig_func) +extern _Thread_local char _tls_signal_buf[_REENT_SIGNAL_SIZE]; +#define _REENT_SIGNAL_BUF(_ptr) (_tls_signal_buf) +extern _Thread_local int _tls_gamma_signgam; +#define _REENT_SIGNGAM(_ptr) (_tls_gamma_signgam) +extern _Thread_local __FILE *_tls_stdin; +#define _REENT_STDIN(_ptr) (_tls_stdin) +extern _Thread_local __FILE *_tls_stdout; +#define _REENT_STDOUT(_ptr) (_tls_stdout) +extern _Thread_local __FILE *_tls_stderr; +#define _REENT_STDERR(_ptr) (_tls_stderr) +extern _Thread_local char *_tls_strtok_last; +#define _REENT_STRTOK_LAST(_ptr) (_tls_strtok_last) +extern _Thread_local struct __tm _tls_localtime_buf; +#define _REENT_TM(_ptr) (&_tls_localtime_buf) +extern _Thread_local _mbstate_t _tls_wctomb_state; +#define _REENT_WCTOMB_STATE(_ptr) (_tls_wctomb_state) +extern _Thread_local _mbstate_t _tls_wcrtomb_state; +#define _REENT_WCRTOMB_STATE(_ptr) (_tls_wcrtomb_state) +extern _Thread_local _mbstate_t _tls_wcsrtombs_state; +#define _REENT_WCSRTOMBS_STATE(_ptr) (_tls_wcsrtombs_state) + +#endif /* !_REENT_THREAD_LOCAL */ + +/* This value is used in stdlib/misc.c. reent/reent.c has to know it + as well to make sure the freelist is correctly free'd. Therefore + we define it here, rather than in stdlib/misc.c, as before. */ +#define _Kmax (sizeof (size_t) << 3) + +extern struct _atexit *__atexit; /* points to head of LIFO stack */ +extern struct _atexit __atexit0; /* one guaranteed table, required by ANSI */ + +extern void (*__stdio_exit_handler) (void); + +void _reclaim_reent (struct _reent *); + +extern int _fwalk_sglue (struct _reent *, int (*)(struct _reent *, __FILE *), + struct _glue *); + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_REENT_H_ */ diff --git a/lib/include/sys/resource.h b/lib/include/sys/resource.h new file mode 100644 index 0000000..c0a0d20 --- /dev/null +++ b/lib/include/sys/resource.h @@ -0,0 +1,24 @@ +#ifndef _SYS_RESOURCE_H_ +#define _SYS_RESOURCE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define RUSAGE_SELF 0 /* calling process */ +#define RUSAGE_CHILDREN -1 /* terminated child processes */ + +struct rusage { + struct timeval ru_utime; /* user time used */ + struct timeval ru_stime; /* system time used */ +}; + +int getrusage (int, struct rusage*); + +#ifdef __cplusplus +} +#endif +#endif /* !_SYS_RESOURCE_H_ */ + diff --git a/lib/include/sys/sched.h b/lib/include/sys/sched.h new file mode 100644 index 0000000..4adb6e2 --- /dev/null +++ b/lib/include/sys/sched.h @@ -0,0 +1,69 @@ +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + * $Id$ + */ + + +#ifndef _SYS_SCHED_H_ +#define _SYS_SCHED_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Scheduling Policies */ +/* Open Group Specifications Issue 6 */ +#if defined(__CYGWIN__) +#define SCHED_OTHER 3 +#else +#define SCHED_OTHER 0 +#endif + +#define SCHED_FIFO 1 +#define SCHED_RR 2 + +#if defined(_POSIX_SPORADIC_SERVER) +#define SCHED_SPORADIC 4 +#endif + +/* Scheduling Parameters */ +/* Open Group Specifications Issue 6 */ + +struct sched_param { + int sched_priority; /* Process execution scheduling priority */ + +#if defined(_POSIX_SPORADIC_SERVER) || defined(_POSIX_THREAD_SPORADIC_SERVER) + int sched_ss_low_priority; /* Low scheduling priority for sporadic */ + /* server */ + struct timespec sched_ss_repl_period; + /* Replenishment period for sporadic server */ + struct timespec sched_ss_init_budget; + /* Initial budget for sporadic server */ + int sched_ss_max_repl; /* Maximum pending replenishments for */ + /* sporadic server */ +#endif +}; + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ + diff --git a/lib/include/sys/select.h b/lib/include/sys/select.h new file mode 100644 index 0000000..93d0b79 --- /dev/null +++ b/lib/include/sys/select.h @@ -0,0 +1,94 @@ +#ifndef _SYS_SELECT_H +#define _SYS_SELECT_H + +/* We don't define fd_set and friends if we are compiling POSIX + source, or if we have included (or may include as indicated + by __USE_W32_SOCKETS) the W32api winsock[2].h header which + defines Windows versions of them. Note that a program which + includes the W32api winsock[2].h header must know what it is doing; + it must not call the Cygwin select function. +*/ +# if !(defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) + +#include +#include +#include +#include + +#if !defined(_SIGSET_T_DECLARED) +#define _SIGSET_T_DECLARED +typedef __sigset_t sigset_t; +#endif + +# define _SYS_TYPES_FD_SET +/* + * Select uses bit masks of file descriptors in longs. + * These macros manipulate such bit fields (the filesystem macros use chars). + * FD_SETSIZE may be defined by the user, but the default here + * should be enough for most uses. + */ +#ifndef FD_SETSIZE +# ifdef __CYGWIN__ +# define FD_SETSIZE 1024 +# else +# define FD_SETSIZE 64 +# endif +#endif + +typedef unsigned long __fd_mask; +#if __BSD_VISIBLE +typedef __fd_mask fd_mask; +#endif + +#define _NFDBITS ((int)sizeof(__fd_mask) * 8) /* bits per mask */ +#if __BSD_VISIBLE +#define NFDBITS _NFDBITS +#endif + +#ifndef _howmany +#define _howmany(x,y) (((x) + ((y) - 1)) / (y)) +#endif + +typedef struct fd_set { + __fd_mask __fds_bits[_howmany(FD_SETSIZE, _NFDBITS)]; +} fd_set; +#if __BSD_VISIBLE +#define fds_bits __fds_bits +#endif + +#define __fdset_mask(n) ((__fd_mask)1 << ((n) % _NFDBITS)) +#define FD_CLR(n, p) ((p)->__fds_bits[(n)/_NFDBITS] &= ~__fdset_mask(n)) +#if __BSD_VISIBLE +#define FD_COPY(f, t) (void)(*(t) = *(f)) +#endif +#define FD_ISSET(n, p) (((p)->__fds_bits[(n)/_NFDBITS] & __fdset_mask(n)) != 0) +#define FD_SET(n, p) ((p)->__fds_bits[(n)/_NFDBITS] |= __fdset_mask(n)) +#define FD_ZERO(p) do { \ + fd_set *_p; \ + __size_t _n; \ + \ + _p = (p); \ + _n = _howmany(FD_SETSIZE, _NFDBITS); \ + while (_n > 0) \ + _p->__fds_bits[--_n] = 0; \ +} while (0) + +#if !defined (__INSIDE_CYGWIN_NET__) + +__BEGIN_DECLS + +int select __P ((int __n, fd_set *__readfds, fd_set *__writefds, + fd_set *__exceptfds, struct timeval *__timeout)); +#if __POSIX_VISIBLE >= 200112 +int pselect __P ((int __n, fd_set *__readfds, fd_set *__writefds, + fd_set *__exceptfds, const struct timespec *__timeout, + const sigset_t *__set)); +#endif + +__END_DECLS + +#endif /* !__INSIDE_CYGWIN_NET__ */ + +#endif /* !(_WINSOCK_H || _WINSOCKAPI_ || __USE_W32_SOCKETS) */ + +#endif /* sys/select.h */ diff --git a/lib/include/sys/signal.h b/lib/include/sys/signal.h new file mode 100644 index 0000000..8dc5fb9 --- /dev/null +++ b/lib/include/sys/signal.h @@ -0,0 +1,388 @@ +/* sys/signal.h */ + +#ifndef _SYS_SIGNAL_H +#define _SYS_SIGNAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "_ansi.h" +#include +#include +#include +#include +#include +#include + +#if !defined(_SIGSET_T_DECLARED) +#define _SIGSET_T_DECLARED +typedef __sigset_t sigset_t; +#endif + +#if defined(__CYGWIN__) +#include +#else + +#if defined(_POSIX_REALTIME_SIGNALS) || __POSIX_VISIBLE >= 199309 + +/* sigev_notify values + NOTE: P1003.1c/D10, p. 34 adds SIGEV_THREAD. */ + +#define SIGEV_NONE 1 /* No asynchronous notification shall be delivered */ + /* when the event of interest occurs. */ +#define SIGEV_SIGNAL 2 /* A queued signal, with an application defined */ + /* value, shall be delivered when the event of */ + /* interest occurs. */ +#define SIGEV_THREAD 3 /* A notification function shall be called to */ + /* perform notification. */ + +/* Signal Generation and Delivery, P1003.1b-1993, p. 63 + NOTE: P1003.1c/D10, p. 34 adds sigev_notify_function and + sigev_notify_attributes to the sigevent structure. */ + +union sigval { + int sival_int; /* Integer signal value */ + void *sival_ptr; /* Pointer signal value */ +}; + +struct sigevent { + int sigev_notify; /* Notification type */ + int sigev_signo; /* Signal number */ + union sigval sigev_value; /* Signal value */ + +#if defined(_POSIX_THREADS) + void (*sigev_notify_function)( union sigval ); + /* Notification function */ + pthread_attr_t *sigev_notify_attributes; /* Notification Attributes */ +#endif +}; + +/* Signal Actions, P1003.1b-1993, p. 64 */ +/* si_code values, p. 66 */ + +#define SI_USER 1 /* Sent by a user. kill(), abort(), etc */ +#define SI_QUEUE 2 /* Sent by sigqueue() */ +#define SI_TIMER 3 /* Sent by expiration of a timer_settime() timer */ +#define SI_ASYNCIO 4 /* Indicates completion of asycnhronous IO */ +#define SI_MESGQ 5 /* Indicates arrival of a message at an empty queue */ + +typedef struct { + int si_signo; /* Signal number */ + int si_code; /* Cause of the signal */ + union sigval si_value; /* Signal value */ +} siginfo_t; +#endif /* defined(_POSIX_REALTIME_SIGNALS) || __POSIX_VISIBLE >= 199309 */ + +#if defined(__rtems__) + +/* 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76 */ + +#define SA_NOCLDSTOP 0x1 /* Do not generate SIGCHLD when children stop */ +#define SA_SIGINFO 0x2 /* Invoke the signal catching function with */ + /* three arguments instead of one. */ +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +#define SA_ONSTACK 0x4 /* Signal delivery will be on a separate stack. */ +#endif + +/* struct sigaction notes from POSIX: + * + * (1) Routines stored in sa_handler should take a single int as + * their argument although the POSIX standard does not require this. + * This is not longer true since at least POSIX.1-2008 + * (2) The fields sa_handler and sa_sigaction may overlap, and a conforming + * application should not use both simultaneously. + */ + +typedef void (*_sig_func_ptr)(int); + +struct sigaction { + int sa_flags; /* Special flags to affect behavior of signal */ + sigset_t sa_mask; /* Additional set of signals to be blocked */ + /* during execution of signal-catching */ + /* function. */ + union { + _sig_func_ptr _handler; /* SIG_DFL, SIG_IGN, or pointer to a function */ +#if defined(_POSIX_REALTIME_SIGNALS) + void (*_sigaction)( int, siginfo_t *, void * ); +#endif + } _signal_handlers; +}; + +#define sa_handler _signal_handlers._handler +#if defined(_POSIX_REALTIME_SIGNALS) +#define sa_sigaction _signal_handlers._sigaction +#endif + +#else /* defined(__rtems__) */ + +#define SA_NOCLDSTOP 1 /* only value supported now for sa_flags */ + +typedef void (*_sig_func_ptr)(int); + +struct sigaction +{ + _sig_func_ptr sa_handler; + sigset_t sa_mask; + int sa_flags; +}; +#endif /* defined(__rtems__) */ +#endif /* defined(__CYGWIN__) */ + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +/* + * Minimum and default signal stack constants. Allow for target overrides + * from . + */ +#ifndef MINSIGSTKSZ +#define MINSIGSTKSZ 2048 +#endif +#ifndef SIGSTKSZ +#define SIGSTKSZ 8192 +#endif + +/* + * Possible values for ss_flags in stack_t below. + */ +#define SS_ONSTACK 0x1 +#define SS_DISABLE 0x2 + +#endif + +/* + * Structure used in sigaltstack call. + */ +typedef struct sigaltstack { + void *ss_sp; /* Stack base or pointer. */ + int ss_flags; /* Flags. */ + size_t ss_size; /* Stack size. */ +} stack_t; + +#if __POSIX_VISIBLE +#define SIG_SETMASK 0 /* set mask with sigprocmask() */ +#define SIG_BLOCK 1 /* set of signals to block */ +#define SIG_UNBLOCK 2 /* set of signals to, well, unblock */ + +int sigprocmask (int, const sigset_t *, sigset_t *); +#endif + +#if __POSIX_VISIBLE >= 199506 +int pthread_sigmask (int, const sigset_t *, sigset_t *); +#endif + +#ifdef _LIBC +int _kill (pid_t, int); +#endif /* _LIBC */ + +#if __POSIX_VISIBLE +int kill (pid_t, int); +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +int killpg (pid_t, int); +#endif +#if __POSIX_VISIBLE +int sigaction (int, const struct sigaction *, struct sigaction *); +int sigaddset (sigset_t *, const int); +int sigdelset (sigset_t *, const int); +int sigismember (const sigset_t *, int); +int sigfillset (sigset_t *); +int sigemptyset (sigset_t *); +int sigpending (sigset_t *); +int sigsuspend (const sigset_t *); +int sigwait (const sigset_t *, int *); + +#if !defined(__CYGWIN__) && !defined(__rtems__) +/* These depend upon the type of sigset_t, which right now + is always a long.. They're in the POSIX namespace, but + are not ANSI. */ +#define sigaddset(what,sig) (*(what) |= (1<<(sig)), 0) +#define sigdelset(what,sig) (*(what) &= ~(1<<(sig)), 0) +#define sigemptyset(what) (*(what) = 0, 0) +#define sigfillset(what) (*(what) = ~(0), 0) +#define sigismember(what,sig) (((*(what)) & (1<<(sig))) != 0) +#endif /* !__CYGWIN__ && !__rtems__ */ +#endif /* __POSIX_VISIBLE */ + +/* There are two common sigpause variants, both of which take an int argument. + If you request _XOPEN_SOURCE or _GNU_SOURCE, you get the System V version, + which removes the given signal from the process's signal mask; otherwise + you get the BSD version, which sets the process's signal mask to the given + value. */ +#if __XSI_VISIBLE && !defined(__INSIDE_CYGWIN__) +# ifdef __GNUC__ +int sigpause (int) __asm__ (__ASMNAME ("__xpg_sigpause")); +# else +int __xpg_sigpause (int); +# define sigpause __xpg_sigpause +# endif +#elif __BSD_VISIBLE +int sigpause (int); +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int sigaltstack (const stack_t *__restrict, stack_t *__restrict); +#endif + +#if __POSIX_VISIBLE >= 199506 +int pthread_kill (pthread_t, int); +#endif + +#if __POSIX_VISIBLE >= 199309 + +/* 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76 + NOTE: P1003.1c/D10, p. 39 adds sigwait(). */ + +int sigwaitinfo (const sigset_t *, siginfo_t *); +int sigtimedwait (const sigset_t *, siginfo_t *, const struct timespec *); +/* 3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78 */ +int sigqueue (pid_t, int, const union sigval); + +#endif /* __POSIX_VISIBLE >= 199309 */ + +/* Using __MISC_VISIBLE until POSIX Issue 8 is officially released */ +#if __MISC_VISIBLE + +/* POSIX Issue 8 adds sig2str() and str2sig() */ + +#if __SIZEOF_INT__ >= 4 +#define SIG2STR_MAX (sizeof("RTMAX+") + sizeof("4294967295") - 1) +#else +#define SIG2STR_MAX (sizeof("RTMAX+") + sizeof("65535") - 1) +#endif + +int sig2str(int, char *); +int str2sig(const char *__restrict, int *__restrict); + +#endif /* __MISC_VISIBLE */ + +#if defined(___AM29K__) +/* These all need to be defined for ANSI C, but I don't think they are + meaningful. */ +#define SIGABRT 1 +#define SIGFPE 1 +#define SIGILL 1 +#define SIGINT 1 +#define SIGSEGV 1 +#define SIGTERM 1 +/* These need to be defined for POSIX, and some others do too. */ +#define SIGHUP 1 +#define SIGQUIT 1 +#define NSIG 2 +#elif defined(__GO32__) +#define SIGINT 1 +#define SIGKILL 2 +#define SIGPIPE 3 +#define SIGFPE 4 +#define SIGHUP 5 +#define SIGTERM 6 +#define SIGSEGV 7 +#define SIGTSTP 8 +#define SIGQUIT 9 +#define SIGTRAP 10 +#define SIGILL 11 +#define SIGEMT 12 +#define SIGALRM 13 +#define SIGBUS 14 +#define SIGLOST 15 +#define SIGSTOP 16 +#define SIGABRT 17 +#define SIGUSR1 18 +#define SIGUSR2 19 +#define NSIG 20 +#elif !defined(SIGTRAP) +#define SIGHUP 1 /* hangup */ +#define SIGINT 2 /* interrupt */ +#define SIGQUIT 3 /* quit */ +#define SIGILL 4 /* illegal instruction (not reset when caught) */ +#define SIGTRAP 5 /* trace trap (not reset when caught) */ +#define SIGIOT 6 /* IOT instruction */ +#define SIGABRT 6 /* used by abort, replace SIGIOT in the future */ +#define SIGEMT 7 /* EMT instruction */ +#define SIGFPE 8 /* floating point exception */ +#define SIGKILL 9 /* kill (cannot be caught or ignored) */ +#define SIGBUS 10 /* bus error */ +#define SIGSEGV 11 /* segmentation violation */ +#define SIGSYS 12 /* bad argument to system call */ +#define SIGPIPE 13 /* write on a pipe with no one to read it */ +#define SIGALRM 14 /* alarm clock */ +#define SIGTERM 15 /* software termination signal from kill */ + +#if defined(__rtems__) +#define SIGURG 16 /* urgent condition on IO channel */ +#define SIGSTOP 17 /* sendable stop signal not from tty */ +#define SIGTSTP 18 /* stop signal from tty */ +#define SIGCONT 19 /* continue a stopped process */ +#define SIGCHLD 20 /* to parent on child stop or exit */ +#define SIGCLD 20 /* System V name for SIGCHLD */ +#define SIGTTIN 21 /* to readers pgrp upon background tty read */ +#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ +#define SIGIO 23 /* input/output possible signal */ +#define SIGPOLL SIGIO /* System V name for SIGIO */ +#define SIGWINCH 24 /* window changed */ +#define SIGUSR1 25 /* user defined signal 1 */ +#define SIGUSR2 26 /* user defined signal 2 */ + +/* Real-Time Signals Range, P1003.1b-1993, p. 61 + NOTE: By P1003.1b-1993, this should be at least RTSIG_MAX + (which is a minimum of 8) signals. + */ +#define SIGRTMIN 27 +#define SIGRTMAX 31 +#define __SIGFIRSTNOTRT SIGHUP +#define __SIGLASTNOTRT SIGUSR2 + +#define NSIG 32 /* signal 0 implied */ + +#elif defined(__svr4__) +/* svr4 specifics. different signals above 15, and sigaction. */ +#define SIGUSR1 16 +#define SIGUSR2 17 +#define SIGCLD 18 +#define SIGPWR 19 +#define SIGWINCH 20 +#define SIGPOLL 22 /* 20 for x.out binaries!!!! */ +#define SIGSTOP 23 /* sendable stop signal not from tty */ +#define SIGTSTP 24 /* stop signal from tty */ +#define SIGCONT 25 /* continue a stopped process */ +#define SIGTTIN 26 /* to readers pgrp upon background tty read */ +#define SIGTTOU 27 /* like TTIN for output if (tp->t_local<OSTOP) */ +#define NSIG 28 +#else +#define SIGURG 16 /* urgent condition on IO channel */ +#define SIGSTOP 17 /* sendable stop signal not from tty */ +#define SIGTSTP 18 /* stop signal from tty */ +#define SIGCONT 19 /* continue a stopped process */ +#define SIGCHLD 20 /* to parent on child stop or exit */ +#define SIGCLD 20 /* System V name for SIGCHLD */ +#define SIGTTIN 21 /* to readers pgrp upon background tty read */ +#define SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */ +#define SIGIO 23 /* input/output possible signal */ +#define SIGPOLL SIGIO /* System V name for SIGIO */ +#define SIGXCPU 24 /* exceeded CPU time limit */ +#define SIGXFSZ 25 /* exceeded file size limit */ +#define SIGVTALRM 26 /* virtual time alarm */ +#define SIGPROF 27 /* profiling time alarm */ +#define SIGWINCH 28 /* window changed */ +#define SIGLOST 29 /* resource lost (eg, record-lock lost) */ +#define SIGUSR1 30 /* user defined signal 1 */ +#define SIGUSR2 31 /* user defined signal 2 */ +#define NSIG 32 /* signal 0 implied */ +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#if defined(__CYGWIN__) +#if __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +#include +#endif +#endif + +#ifndef _SIGNAL_H_ +/* Some applications take advantage of the fact that + * and are equivalent in glibc. Allow for that here. */ +#include +#endif +#endif /* _SYS_SIGNAL_H */ diff --git a/lib/include/sys/stat.h b/lib/include/sys/stat.h new file mode 100644 index 0000000..98f5add --- /dev/null +++ b/lib/include/sys/stat.h @@ -0,0 +1,179 @@ +#ifndef _SYS_STAT_H +#define _SYS_STAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <_ansi.h> +#include +#include +#include +#include + +/* dj's stat defines _STAT_H_ */ +#ifndef _STAT_H_ + +/* It is intended that the layout of this structure not change when the + sizes of any of the basic types change (short, int, long) [via a compile + time option]. */ + +#ifdef __CYGWIN__ +#include +#ifdef _LIBC +#define stat64 stat +#endif +#else +struct stat +{ + dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + dev_t st_rdev; + off_t st_size; +#if defined(__svr4__) && !defined(__PPC__) && !defined(__sun__) + time_t st_atime; + time_t st_mtime; + time_t st_ctime; +#else + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + blksize_t st_blksize; + blkcnt_t st_blocks; +#if !defined(__rtems__) + long st_spare4[2]; +#endif +#endif +}; + +#if !(defined(__svr4__) && !defined(__PPC__) && !defined(__sun__)) +#define st_atime st_atim.tv_sec +#define st_ctime st_ctim.tv_sec +#define st_mtime st_mtim.tv_sec +#endif + +#endif + +#define _IFMT 0170000 /* type of file */ +#define _IFDIR 0040000 /* directory */ +#define _IFCHR 0020000 /* character special */ +#define _IFBLK 0060000 /* block special */ +#define _IFREG 0100000 /* regular */ +#define _IFLNK 0120000 /* symbolic link */ +#define _IFSOCK 0140000 /* socket */ +#define _IFIFO 0010000 /* fifo */ + +#define S_BLKSIZE 1024 /* size of a block */ + +#define S_ISUID 0004000 /* set user id on execution */ +#define S_ISGID 0002000 /* set group id on execution */ +#define S_ISVTX 0001000 /* save swapped text even after use */ +#if __BSD_VISIBLE +#define S_IREAD 0000400 /* read permission, owner */ +#define S_IWRITE 0000200 /* write permission, owner */ +#define S_IEXEC 0000100 /* execute/search permission, owner */ +#define S_ENFMT 0002000 /* enforcement-mode locking */ +#endif /* !_BSD_VISIBLE */ + +#define S_IFMT _IFMT +#define S_IFDIR _IFDIR +#define S_IFCHR _IFCHR +#define S_IFBLK _IFBLK +#define S_IFREG _IFREG +#define S_IFLNK _IFLNK +#define S_IFSOCK _IFSOCK +#define S_IFIFO _IFIFO + +#ifdef _WIN32 +/* The Windows header files define _S_ forms of these, so we do too + for easier portability. */ +#define _S_IFMT _IFMT +#define _S_IFDIR _IFDIR +#define _S_IFCHR _IFCHR +#define _S_IFIFO _IFIFO +#define _S_IFREG _IFREG +#define _S_IREAD 0000400 +#define _S_IWRITE 0000200 +#define _S_IEXEC 0000100 +#endif + +#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) +#define S_IRUSR 0000400 /* read permission, owner */ +#define S_IWUSR 0000200 /* write permission, owner */ +#define S_IXUSR 0000100/* execute/search permission, owner */ +#define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) +#define S_IRGRP 0000040 /* read permission, group */ +#define S_IWGRP 0000020 /* write permission, grougroup */ +#define S_IXGRP 0000010/* execute/search permission, group */ +#define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) +#define S_IROTH 0000004 /* read permission, other */ +#define S_IWOTH 0000002 /* write permission, other */ +#define S_IXOTH 0000001/* execute/search permission, other */ + +#if __BSD_VISIBLE +#define ACCESSPERMS (S_IRWXU | S_IRWXG | S_IRWXO) /* 0777 */ +#define ALLPERMS (S_ISUID | S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO) /* 07777 */ +#define DEFFILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) /* 0666 */ +#endif + +#define S_ISBLK(m) (((m)&_IFMT) == _IFBLK) +#define S_ISCHR(m) (((m)&_IFMT) == _IFCHR) +#define S_ISDIR(m) (((m)&_IFMT) == _IFDIR) +#define S_ISFIFO(m) (((m)&_IFMT) == _IFIFO) +#define S_ISREG(m) (((m)&_IFMT) == _IFREG) +#define S_ISLNK(m) (((m)&_IFMT) == _IFLNK) +#define S_ISSOCK(m) (((m)&_IFMT) == _IFSOCK) + +#if defined(__CYGWIN__) || defined(__rtems__) +/* Special tv_nsec values for futimens(2) and utimensat(2). */ +#define UTIME_NOW -2L +#define UTIME_OMIT -1L +#endif + +int chmod (const char *__path, mode_t __mode ); +int fchmod (int __fd, mode_t __mode); +int fstat (int __fd, struct stat *__sbuf ); +int mkdir (const char *_path, mode_t __mode ); +int mkfifo (const char *__path, mode_t __mode ); +int stat (const char *__restrict __path, struct stat *__restrict __sbuf ); +mode_t umask (mode_t __mask ); + +#if defined (__SPU__) || defined(__rtems__) || defined(__CYGWIN__) +int lstat (const char *__restrict __path, struct stat *__restrict __buf ); +int mknod (const char *__path, mode_t __mode, dev_t __dev ); +#endif + +#if __ATFILE_VISIBLE && !defined(__INSIDE_CYGWIN__) +int fchmodat (int, const char *, mode_t, int); +int fstatat (int, const char *__restrict , struct stat *__restrict, int); +int mkdirat (int, const char *, mode_t); +int mkfifoat (int, const char *, mode_t); +int mknodat (int, const char *, mode_t, dev_t); +int utimensat (int, const char *, const struct timespec [2], int); +#endif +#if __POSIX_VISIBLE >= 200809 && !defined(__INSIDE_CYGWIN__) +int futimens (int, const struct timespec [2]); +#endif + +/* Provide prototypes for most of the _ names that are + provided in newlib for some compilers. */ +#ifdef _LIBC +int _fstat (int __fd, struct stat *__sbuf ); +int _stat (const char *__restrict __path, struct stat *__restrict __sbuf ); +int _mkdir (const char *_path, mode_t __mode ); +#ifdef __LARGE64_FILES +struct stat64; +int _stat64 (const char *__restrict __path, struct stat64 *__restrict __sbuf ); +int _fstat64 (int __fd, struct stat64 *__sbuf ); +#endif +#endif + +#endif /* !_STAT_H_ */ +#ifdef __cplusplus +} +#endif +#endif /* _SYS_STAT_H */ diff --git a/lib/include/sys/stdio.h b/lib/include/sys/stdio.h new file mode 100644 index 0000000..91a2745 --- /dev/null +++ b/lib/include/sys/stdio.h @@ -0,0 +1,27 @@ +#ifndef _NEWLIB_STDIO_H +#define _NEWLIB_STDIO_H + +#include +#include + +/* Internal locking macros, used to protect stdio functions. In the + general case, expand to nothing. Use __SSTR flag in FILE _flags to + detect if FILE is private to sprintf/sscanf class of functions; if + set then do nothing as lock is not initialised. */ +#if !defined(_flockfile) +#ifndef __SINGLE_THREAD__ +# define _flockfile(fp) (((fp)->_flags & __SSTR) ? 0 : __lock_acquire_recursive((fp)->_lock)) +#else +# define _flockfile(fp) ((void) 0) +#endif +#endif + +#if !defined(_funlockfile) +#ifndef __SINGLE_THREAD__ +# define _funlockfile(fp) (((fp)->_flags & __SSTR) ? 0 : __lock_release_recursive((fp)->_lock)) +#else +# define _funlockfile(fp) ((void) 0) +#endif +#endif + +#endif /* _NEWLIB_STDIO_H */ diff --git a/lib/include/sys/string.h b/lib/include/sys/string.h new file mode 100644 index 0000000..ceedf4b --- /dev/null +++ b/lib/include/sys/string.h @@ -0,0 +1,2 @@ +/* This is a dummy used as a placeholder for + systems that need to have a special header file. */ diff --git a/lib/include/sys/syslimits.h b/lib/include/sys/syslimits.h new file mode 100644 index 0000000..c872d20 --- /dev/null +++ b/lib/include/sys/syslimits.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslimits.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD: src/sys/sys/syslimits.h,v 1.10 2001/06/18 20:24:54 wollman Exp $ + */ + +#ifndef _SYS_SYSLIMITS_H_ +#define _SYS_SYSLIMITS_H_ + +#define ARG_MAX 65536 /* max bytes for an exec function */ +#ifndef CHILD_MAX +#define CHILD_MAX 40 /* max simultaneous processes */ +#endif +#define LINK_MAX 32767 /* max file link count */ +#define MAX_CANON 255 /* max bytes in term canon input line */ +#define MAX_INPUT 255 /* max bytes in terminal input */ +#define NAME_MAX 255 /* max bytes in a file name */ +#define NGROUPS_MAX 16 /* max supplemental group id's */ +#ifndef OPEN_MAX +#define OPEN_MAX 64 /* max open files per process */ +#endif +#define PATH_MAX 1024 /* max bytes in pathname */ +#define PIPE_BUF 512 /* max bytes for atomic pipe writes */ +#define IOV_MAX 1024 /* max elements in i/o vector */ + +#define BC_BASE_MAX 99 /* max ibase/obase values in bc(1) */ +#define BC_DIM_MAX 2048 /* max array elements in bc(1) */ +#define BC_SCALE_MAX 99 /* max scale value in bc(1) */ +#define BC_STRING_MAX 1000 /* max const string length in bc(1) */ +#define COLL_WEIGHTS_MAX 0 /* max weights for order keyword */ +#define EXPR_NEST_MAX 32 /* max expressions nested in expr(1) */ +#define LINE_MAX 2048 /* max bytes in an input line */ +#define RE_DUP_MAX 255 /* max RE's in interval notation */ + +#endif diff --git a/lib/include/sys/time.h b/lib/include/sys/time.h new file mode 100644 index 0000000..5a3dec7 --- /dev/null +++ b/lib/include/sys/time.h @@ -0,0 +1,448 @@ +/* time.h -- An implementation of the standard Unix file. + Written by Geoffrey Noer + Public domain; no rights reserved. */ + +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * $FreeBSD: head/sys/sys/time.h 346176 2019-04-13 04:46:35Z imp $ + */ + +#ifndef _SYS_TIME_H_ +#define _SYS_TIME_H_ + +#include <_ansi.h> +#include +#include +#include +#include + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE +#include +#endif + +struct timezone { + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; +#define DST_NONE 0 /* not on dst */ +#define DST_USA 1 /* USA style dst */ +#define DST_AUST 2 /* Australian style dst */ +#define DST_WET 3 /* Western European dst */ +#define DST_MET 4 /* Middle European dst */ +#define DST_EET 5 /* Eastern European dst */ +#define DST_CAN 6 /* Canada */ + +#if __BSD_VISIBLE +struct bintime { + time_t sec; + uint64_t frac; +}; + +static __inline void +bintime_addx(struct bintime *_bt, uint64_t _x) +{ + uint64_t _u; + + _u = _bt->frac; + _bt->frac += _x; + if (_u > _bt->frac) + _bt->sec++; +} + +static __inline void +bintime_add(struct bintime *_bt, const struct bintime *_bt2) +{ + uint64_t _u; + + _u = _bt->frac; + _bt->frac += _bt2->frac; + if (_u > _bt->frac) + _bt->sec++; + _bt->sec += _bt2->sec; +} + +static __inline void +bintime_sub(struct bintime *_bt, const struct bintime *_bt2) +{ + uint64_t _u; + + _u = _bt->frac; + _bt->frac -= _bt2->frac; + if (_u < _bt->frac) + _bt->sec--; + _bt->sec -= _bt2->sec; +} + +static __inline void +bintime_mul(struct bintime *_bt, u_int _x) +{ + uint64_t _p1, _p2; + + _p1 = (_bt->frac & 0xffffffffull) * _x; + _p2 = (_bt->frac >> 32) * _x + (_p1 >> 32); + _bt->sec *= _x; + _bt->sec += (_p2 >> 32); + _bt->frac = (_p2 << 32) | (_p1 & 0xffffffffull); +} + +static __inline void +bintime_shift(struct bintime *_bt, int _exp) +{ + + if (_exp > 0) { + _bt->sec <<= _exp; + _bt->sec |= _bt->frac >> (64 - _exp); + _bt->frac <<= _exp; + } else if (_exp < 0) { + _bt->frac >>= -_exp; + _bt->frac |= (uint64_t)_bt->sec << (64 + _exp); + _bt->sec >>= -_exp; + } +} + +#define bintime_clear(a) ((a)->sec = (a)->frac = 0) +#define bintime_isset(a) ((a)->sec || (a)->frac) +#define bintime_cmp(a, b, cmp) \ + (((a)->sec == (b)->sec) ? \ + ((a)->frac cmp (b)->frac) : \ + ((a)->sec cmp (b)->sec)) + +#define SBT_1S ((sbintime_t)1 << 32) +#define SBT_1M (SBT_1S * 60) +#define SBT_1MS (SBT_1S / 1000) +#define SBT_1US (SBT_1S / 1000000) +#define SBT_1NS (SBT_1S / 1000000000) /* beware rounding, see nstosbt() */ +#define SBT_MAX 0x7fffffffffffffffLL + +static __inline int +sbintime_getsec(sbintime_t _sbt) +{ + + return (_sbt >> 32); +} + +static __inline sbintime_t +bttosbt(const struct bintime _bt) +{ + + return (((sbintime_t)_bt.sec << 32) + (_bt.frac >> 32)); +} + +static __inline struct bintime +sbttobt(sbintime_t _sbt) +{ + struct bintime _bt; + + _bt.sec = _sbt >> 32; + _bt.frac = _sbt << 32; + return (_bt); +} + +/* + * Decimal<->sbt conversions. Multiplying or dividing by SBT_1NS results in + * large roundoff errors which sbttons() and nstosbt() avoid. Millisecond and + * microsecond functions are also provided for completeness. + * + * These functions return the smallest sbt larger or equal to the + * number of seconds requested so that sbttoX(Xtosbt(y)) == y. Unlike + * top of second computations below, which require that we tick at the + * top of second, these need to be rounded up so we do whatever for at + * least as long as requested. + * + * The naive computation we'd do is this + * ((unit * 2^64 / SIFACTOR) + 2^32-1) >> 32 + * However, that overflows. Instead, we compute + * ((unit * 2^63 / SIFACTOR) + 2^31-1) >> 32 + * and use pre-computed constants that are the ceil of the 2^63 / SIFACTOR + * term to ensure we are using exactly the right constant. We use the lesser + * evil of ull rather than a uint64_t cast to ensure we have well defined + * right shift semantics. With these changes, we get all the ns, us and ms + * conversions back and forth right. + */ +static __inline int64_t +sbttons(sbintime_t _sbt) +{ + uint64_t ns; + + ns = _sbt; + if (ns >= SBT_1S) + ns = (ns >> 32) * 1000000000; + else + ns = 0; + + return (ns + (1000000000 * (_sbt & 0xffffffffu) >> 32)); +} + +static __inline sbintime_t +nstosbt(int64_t _ns) +{ + sbintime_t sb = 0; + + if (_ns >= SBT_1S) { + sb = (_ns / 1000000000) * SBT_1S; + _ns = _ns % 1000000000; + } + /* 9223372037 = ceil(2^63 / 1000000000) */ + sb += ((_ns * 9223372037ull) + 0x7fffffff) >> 31; + return (sb); +} + +static __inline int64_t +sbttous(sbintime_t _sbt) +{ + + return ((1000000 * _sbt) >> 32); +} + +static __inline sbintime_t +ustosbt(int64_t _us) +{ + sbintime_t sb = 0; + + if (_us >= SBT_1S) { + sb = (_us / 1000000) * SBT_1S; + _us = _us % 1000000; + } + /* 9223372036855 = ceil(2^63 / 1000000) */ + sb += ((_us * 9223372036855ull) + 0x7fffffff) >> 31; + return (sb); +} + +static __inline int64_t +sbttoms(sbintime_t _sbt) +{ + + return ((1000 * _sbt) >> 32); +} + +static __inline sbintime_t +mstosbt(int64_t _ms) +{ + sbintime_t sb = 0; + + if (_ms >= SBT_1S) { + sb = (_ms / 1000) * SBT_1S; + _ms = _ms % 1000; + } + /* 9223372036854776 = ceil(2^63 / 1000) */ + sb += ((_ms * 9223372036854776ull) + 0x7fffffff) >> 31; + return (sb); +} + +/*- + * Background information: + * + * When converting between timestamps on parallel timescales of differing + * resolutions it is historical and scientific practice to round down rather + * than doing 4/5 rounding. + * + * The date changes at midnight, not at noon. + * + * Even at 15:59:59.999999999 it's not four'o'clock. + * + * time_second ticks after N.999999999 not after N.4999999999 + */ + +static __inline void +bintime2timespec(const struct bintime *_bt, struct timespec *_ts) +{ + + _ts->tv_sec = _bt->sec; + _ts->tv_nsec = ((uint64_t)1000000000 * + (uint32_t)(_bt->frac >> 32)) >> 32; +} + +static __inline void +timespec2bintime(const struct timespec *_ts, struct bintime *_bt) +{ + + _bt->sec = _ts->tv_sec; + /* 18446744073 = int(2^64 / 1000000000) */ + _bt->frac = _ts->tv_nsec * (uint64_t)18446744073LL; +} + +static __inline void +bintime2timeval(const struct bintime *_bt, struct timeval *_tv) +{ + + _tv->tv_sec = _bt->sec; + _tv->tv_usec = ((uint64_t)1000000 * (uint32_t)(_bt->frac >> 32)) >> 32; +} + +static __inline void +timeval2bintime(const struct timeval *_tv, struct bintime *_bt) +{ + + _bt->sec = _tv->tv_sec; + /* 18446744073709 = int(2^64 / 1000000) */ + _bt->frac = _tv->tv_usec * (uint64_t)18446744073709LL; +} + +static __inline struct timespec +sbttots(sbintime_t _sbt) +{ + struct timespec _ts; + + _ts.tv_sec = _sbt >> 32; + _ts.tv_nsec = sbttons((uint32_t)_sbt); + return (_ts); +} + +static __inline sbintime_t +tstosbt(struct timespec _ts) +{ + + return (((sbintime_t)_ts.tv_sec << 32) + nstosbt(_ts.tv_nsec)); +} + +static __inline struct timeval +sbttotv(sbintime_t _sbt) +{ + struct timeval _tv; + + _tv.tv_sec = _sbt >> 32; + _tv.tv_usec = sbttous((uint32_t)_sbt); + return (_tv); +} + +static __inline sbintime_t +tvtosbt(struct timeval _tv) +{ + + return (((sbintime_t)_tv.tv_sec << 32) + ustosbt(_tv.tv_usec)); +} + +/* Operations on timespecs */ +#define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0) +#define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec) +#define timespeccmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) + +#define timespecadd(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec + (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec + (usp)->tv_nsec; \ + if ((vsp)->tv_nsec >= 1000000000L) { \ + (vsp)->tv_sec++; \ + (vsp)->tv_nsec -= 1000000000L; \ + } \ + } while (0) +#define timespecsub(tsp, usp, vsp) \ + do { \ + (vsp)->tv_sec = (tsp)->tv_sec - (usp)->tv_sec; \ + (vsp)->tv_nsec = (tsp)->tv_nsec - (usp)->tv_nsec; \ + if ((vsp)->tv_nsec < 0) { \ + (vsp)->tv_sec--; \ + (vsp)->tv_nsec += 1000000000L; \ + } \ + } while (0) + +#ifndef _KERNEL /* NetBSD/OpenBSD compatible interfaces */ + +#define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0) +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_usec cmp (uvp)->tv_usec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) +#define timeradd(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec; \ + if ((vvp)->tv_usec >= 1000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_usec -= 1000000; \ + } \ + } while (0) +#define timersub(tvp, uvp, vvp) \ + do { \ + (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ + (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ + if ((vvp)->tv_usec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_usec += 1000000; \ + } \ + } while (0) +#endif +#endif /* __BSD_VISIBLE */ + +/* + * Names of the interval timers, and structure + * defining a timer setting. + */ +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +struct itimerval { + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +#ifndef _KERNEL +#include + +__BEGIN_DECLS +int utimes (const char *, const struct timeval [2]); + +#if __BSD_VISIBLE +int adjtime (const struct timeval *, struct timeval *); +int futimes (int, const struct timeval [2]); +int lutimes (const char *, const struct timeval [2]); +int settimeofday (const struct timeval *, const struct timezone *); +#endif + +#if __MISC_VISIBLE || __XSI_VISIBLE +int getitimer (int __which, struct itimerval *__value); +int setitimer (int __which, const struct itimerval *__restrict __value, + struct itimerval *__restrict __ovalue); +#endif + +int gettimeofday (struct timeval *__restrict __p, + void *__restrict __tz); + +#if __GNU_VISIBLE +int futimesat (int, const char *, const struct timeval [2]); +#endif + +#ifdef _LIBC +int _gettimeofday (struct timeval *__p, void *__tz); +#endif + +__END_DECLS + +#endif /* !_KERNEL */ +#include + +#endif /* !_SYS_TIME_H_ */ diff --git a/lib/include/sys/timeb.h b/lib/include/sys/timeb.h new file mode 100644 index 0000000..ccf6649 --- /dev/null +++ b/lib/include/sys/timeb.h @@ -0,0 +1,40 @@ +/* timeb.h -- An implementation of the standard Unix file. + Written by Ian Lance Taylor + Public domain; no rights reserved. + + declares the structure used by the ftime function, as + well as the ftime function itself. Newlib does not provide an + implementation of ftime. */ + +#ifndef _SYS_TIMEB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define _SYS_TIMEB_H + +#include <_ansi.h> +#include + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +struct timeb +{ + time_t time; + unsigned short millitm; + short timezone; + short dstflag; +}; + +extern int ftime (struct timeb *); + +#ifdef __cplusplus +} +#endif + +#endif /* ! defined (_SYS_TIMEB_H) */ diff --git a/lib/include/sys/times.h b/lib/include/sys/times.h new file mode 100644 index 0000000..25dc8bd --- /dev/null +++ b/lib/include/sys/times.h @@ -0,0 +1,32 @@ +#ifndef _SYS_TIMES_H +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_TIMES_H + +#include <_ansi.h> +#include + +#if !defined(__clock_t_defined) && !defined(_CLOCK_T_DECLARED) +typedef _CLOCK_T_ clock_t; +#define __clock_t_defined +#define _CLOCK_T_DECLARED +#endif + +/* Get Process Times, P1003.1b-1993, p. 92 */ +struct tms { + clock_t tms_utime; /* user time */ + clock_t tms_stime; /* system time */ + clock_t tms_cutime; /* user time, children */ + clock_t tms_cstime; /* system time, children */ +}; + +clock_t times (struct tms *); +#ifdef _LIBC +clock_t _times (struct tms *); +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !_SYS_TIMES_H */ diff --git a/lib/include/sys/timespec.h b/lib/include/sys/timespec.h new file mode 100644 index 0000000..2505cef --- /dev/null +++ b/lib/include/sys/timespec.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)time.h 8.5 (Berkeley) 5/4/95 + * from: FreeBSD: src/sys/sys/time.h,v 1.43 2000/03/20 14:09:05 phk Exp + * $FreeBSD$ + */ + +#ifndef _SYS_TIMESPEC_H_ +#define _SYS_TIMESPEC_H_ + +#include +#include + +#if __BSD_VISIBLE +#define TIMEVAL_TO_TIMESPEC(tv, ts) \ + do { \ + (ts)->tv_sec = (tv)->tv_sec; \ + (ts)->tv_nsec = (tv)->tv_usec * 1000; \ + } while (0) +#define TIMESPEC_TO_TIMEVAL(tv, ts) \ + do { \ + (tv)->tv_sec = (ts)->tv_sec; \ + (tv)->tv_usec = (ts)->tv_nsec / 1000; \ + } while (0) + +#endif /* __BSD_VISIBLE */ + +/* + * Structure defined by POSIX.1b to be like a itimerval, but with + * timespecs. Used in the timer_*() system calls. + */ +struct itimerspec { + struct timespec it_interval; + struct timespec it_value; +}; + +#endif /* _SYS_TIMESPEC_H_ */ diff --git a/lib/include/sys/tree.h b/lib/include/sys/tree.h new file mode 100644 index 0000000..2d3cec0 --- /dev/null +++ b/lib/include/sys/tree.h @@ -0,0 +1,864 @@ +/* $NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $ */ +/* $OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $ */ +/* $FreeBSD: head/sys/sys/tree.h 347360 2019-05-08 18:47:00Z trasz $ */ + +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright 2002 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_TREE_H_ +#define _SYS_TREE_H_ + +#include + +/* + * This file defines data structures for different types of trees: + * splay trees and red-black trees. + * + * A splay tree is a self-organizing data structure. Every operation + * on the tree causes a splay to happen. The splay moves the requested + * node to the root of the tree and partly rebalances it. + * + * This has the benefit that request locality causes faster lookups as + * the requested nodes move to the top of the tree. On the other hand, + * every lookup causes memory writes. + * + * The Balance Theorem bounds the total access time for m operations + * and n inserts on an initially empty tree as O((m + n)lg n). The + * amortized cost for a sequence of m accesses to a splay tree is O(lg n); + * + * A red-black tree is a binary search tree with the node color as an + * extra attribute. It fulfills a set of conditions: + * - every search path from the root to a leaf consists of the + * same number of black nodes, + * - each red node (except for the root) has a black parent, + * - each leaf node is black. + * + * Every operation on a red-black tree is bounded as O(lg n). + * The maximum height of a red-black tree is 2lg (n+1). + */ + +#define SPLAY_HEAD(name, type) \ +struct name { \ + struct type *sph_root; /* root of the tree */ \ +} + +#define SPLAY_INITIALIZER(root) \ + { NULL } + +#define SPLAY_INIT(root) do { \ + (root)->sph_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ENTRY(type) \ +struct { \ + struct type *spe_left; /* left element */ \ + struct type *spe_right; /* right element */ \ +} + +#define SPLAY_LEFT(elm, field) (elm)->field.spe_left +#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right +#define SPLAY_ROOT(head) (head)->sph_root +#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) + +/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ +#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKLEFT(head, tmp, field) do { \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKRIGHT(head, tmp, field) do { \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ + SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ + +#define SPLAY_PROTOTYPE(name, type, field, cmp) \ +void name##_SPLAY(struct name *, struct type *); \ +void name##_SPLAY_MINMAX(struct name *, int); \ +struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ +struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ + \ +/* Finds the node with the same key as elm */ \ +static __unused __inline struct type * \ +name##_SPLAY_FIND(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) \ + return(NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) \ + return (head->sph_root); \ + return (NULL); \ +} \ + \ +static __unused __inline struct type * \ +name##_SPLAY_NEXT(struct name *head, struct type *elm) \ +{ \ + name##_SPLAY(head, elm); \ + if (SPLAY_RIGHT(elm, field) != NULL) { \ + elm = SPLAY_RIGHT(elm, field); \ + while (SPLAY_LEFT(elm, field) != NULL) { \ + elm = SPLAY_LEFT(elm, field); \ + } \ + } else \ + elm = NULL; \ + return (elm); \ +} \ + \ +static __unused __inline struct type * \ +name##_SPLAY_MIN_MAX(struct name *head, int val) \ +{ \ + name##_SPLAY_MINMAX(head, val); \ + return (SPLAY_ROOT(head)); \ +} + +/* Main splay operation. + * Moves node close to the key of elm to top + */ +#define SPLAY_GENERATE(name, type, field, cmp) \ +struct type * \ +name##_SPLAY_INSERT(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) { \ + SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ + } else { \ + int __comp; \ + name##_SPLAY(head, elm); \ + __comp = (cmp)(elm, (head)->sph_root); \ + if(__comp < 0) { \ + SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\ + SPLAY_RIGHT(elm, field) = (head)->sph_root; \ + SPLAY_LEFT((head)->sph_root, field) = NULL; \ + } else if (__comp > 0) { \ + SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\ + SPLAY_LEFT(elm, field) = (head)->sph_root; \ + SPLAY_RIGHT((head)->sph_root, field) = NULL; \ + } else \ + return ((head)->sph_root); \ + } \ + (head)->sph_root = (elm); \ + return (NULL); \ +} \ + \ +struct type * \ +name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *__tmp; \ + if (SPLAY_EMPTY(head)) \ + return (NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) { \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\ + } else { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\ + name##_SPLAY(head, elm); \ + SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ + } \ + return (elm); \ + } \ + return (NULL); \ +} \ + \ +void \ +name##_SPLAY(struct name *head, struct type *elm) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + int __comp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ + __left = __right = &__node; \ +\ + while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) > 0){ \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} \ + \ +/* Splay with either the minimum or the maximum element \ + * Used to find minimum or maximum element in tree. \ + */ \ +void name##_SPLAY_MINMAX(struct name *head, int __comp) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ +\ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\ + __left = __right = &__node; \ +\ + while (1) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp > 0) { \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} + +#define SPLAY_NEGINF -1 +#define SPLAY_INF 1 + +#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) +#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) +#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) +#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) +#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) +#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) + +#define SPLAY_FOREACH(x, name, head) \ + for ((x) = SPLAY_MIN(name, head); \ + (x) != NULL; \ + (x) = SPLAY_NEXT(name, head, x)) + +/* Macros that define a red-black tree */ +#define RB_HEAD(name, type) \ +struct name { \ + struct type *rbh_root; /* root of the tree */ \ +} + +#define RB_INITIALIZER(root) \ + { NULL } + +#define RB_INIT(root) do { \ + (root)->rbh_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define RB_BLACK 0 +#define RB_RED 1 +#define RB_ENTRY(type) \ +struct { \ + struct type *rbe_left; /* left element */ \ + struct type *rbe_right; /* right element */ \ + struct type *rbe_parent; /* parent element */ \ + int rbe_color; /* node color */ \ +} + +#define RB_LEFT(elm, field) (elm)->field.rbe_left +#define RB_RIGHT(elm, field) (elm)->field.rbe_right +#define RB_PARENT(elm, field) (elm)->field.rbe_parent +#define RB_COLOR(elm, field) (elm)->field.rbe_color +#define RB_ISRED(elm, field) ((elm) != NULL && RB_COLOR(elm, field) == RB_RED) +#define RB_ROOT(head) (head)->rbh_root +#define RB_EMPTY(head) (RB_ROOT(head) == NULL) + +#define RB_SET_PARENT(dst, src, field) do { \ + RB_PARENT(dst, field) = src; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET(elm, parent, field) do { \ + RB_SET_PARENT(elm, parent, field); \ + RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ + RB_COLOR(elm, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET_BLACKRED(black, red, field) do { \ + RB_COLOR(black, field) = RB_BLACK; \ + RB_COLOR(red, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +/* + * Something to be invoked in a loop at the root of every modified subtree, + * from the bottom up to the root, to update augmented node data. + */ +#ifndef RB_AUGMENT +#define RB_AUGMENT(x) break +#endif + +#define RB_SWAP_CHILD(head, out, in, field) do { \ + if (RB_PARENT(out, field) == NULL) \ + RB_ROOT(head) = (in); \ + else if ((out) == RB_LEFT(RB_PARENT(out, field), field)) \ + RB_LEFT(RB_PARENT(out, field), field) = (in); \ + else \ + RB_RIGHT(RB_PARENT(out, field), field) = (in); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_RIGHT(elm, field), elm, field); \ + } \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_LEFT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_LEFT(elm, field), elm, field); \ + } \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +/* + * The RB_PARENT_ROTATE_LEFT() and RB_PARENT_ROTATE_RIGHT() rotations are + * specialized versions of RB_ROTATE_LEFT() and RB_ROTATE_RIGHT() which may be + * used if the parent node exists and the direction of the child element is + * known. + */ + +#define RB_PARENT_ROTATE_LEFT(parent, left, tmp, field) do { \ + (tmp) = RB_RIGHT(left, field); \ + if ((RB_RIGHT(left, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_RIGHT(left, field), left, field); \ + } \ + RB_SET_PARENT(tmp, parent, field); \ + RB_LEFT(parent, field) = (tmp); \ + RB_LEFT(tmp, field) = (left); \ + RB_SET_PARENT(left, tmp, field); \ + RB_AUGMENT(left); \ +} while (/*CONSTCOND*/ 0) + +#define RB_PARENT_ROTATE_RIGHT(parent, right, tmp, field) do { \ + (tmp) = RB_LEFT(right, field); \ + if ((RB_LEFT(right, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_SET_PARENT(RB_LEFT(right, field), right, field); \ + } \ + RB_SET_PARENT(tmp, parent, field); \ + RB_RIGHT(parent, field) = (tmp); \ + RB_RIGHT(tmp, field) = (right); \ + RB_SET_PARENT(right, tmp, field); \ + RB_AUGMENT(right); \ +} while (/*CONSTCOND*/ 0) + +/* + * The RB_RED_ROTATE_LEFT() and RB_RED_ROTATE_RIGHT() rotations are specialized + * versions of RB_ROTATE_LEFT() and RB_ROTATE_RIGHT() which may be used if we + * rotate an element with a red child which has a black sibling. Such a red + * node must have at least two child nodes so that the following red-black tree + * invariant is fulfilled: + * + * Every path from a given node to any of its descendant NULL nodes goes + * through the same number of black nodes. + * + * elm (could be the root) + * / \ + * BLACK RED (left or right child) + * / \ + * BLACK BLACK + */ + +#define RB_RED_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + RB_RIGHT(elm, field) = RB_LEFT(tmp, field); \ + RB_SET_PARENT(RB_RIGHT(elm, field), elm, field); \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_LEFT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +#define RB_RED_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + RB_LEFT(elm, field) = RB_RIGHT(tmp, field); \ + RB_SET_PARENT(RB_LEFT(elm, field), elm, field); \ + RB_SET_PARENT(tmp, RB_PARENT(elm, field), field); \ + RB_SWAP_CHILD(head, elm, tmp, field); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_SET_PARENT(elm, tmp, field); \ + RB_AUGMENT(elm); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ + RB_PROTOTYPE_INSERT_COLOR(name, type, attr); \ + RB_PROTOTYPE_REMOVE_COLOR(name, type, attr); \ + RB_PROTOTYPE_INSERT(name, type, attr); \ + RB_PROTOTYPE_REMOVE(name, type, attr); \ + RB_PROTOTYPE_FIND(name, type, attr); \ + RB_PROTOTYPE_NFIND(name, type, attr); \ + RB_PROTOTYPE_NEXT(name, type, attr); \ + RB_PROTOTYPE_PREV(name, type, attr); \ + RB_PROTOTYPE_MINMAX(name, type, attr); \ + RB_PROTOTYPE_REINSERT(name, type, attr); +#define RB_PROTOTYPE_INSERT_COLOR(name, type, attr) \ + attr void name##_RB_INSERT_COLOR(struct name *, struct type *) +#define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr) \ + attr void name##_RB_REMOVE_COLOR(struct name *, struct type *) +#define RB_PROTOTYPE_REMOVE(name, type, attr) \ + attr struct type *name##_RB_REMOVE(struct name *, struct type *) +#define RB_PROTOTYPE_INSERT(name, type, attr) \ + attr struct type *name##_RB_INSERT(struct name *, struct type *) +#define RB_PROTOTYPE_FIND(name, type, attr) \ + attr struct type *name##_RB_FIND(struct name *, struct type *) +#define RB_PROTOTYPE_NFIND(name, type, attr) \ + attr struct type *name##_RB_NFIND(struct name *, struct type *) +#define RB_PROTOTYPE_NEXT(name, type, attr) \ + attr struct type *name##_RB_NEXT(struct type *) +#define RB_PROTOTYPE_PREV(name, type, attr) \ + attr struct type *name##_RB_PREV(struct type *) +#define RB_PROTOTYPE_MINMAX(name, type, attr) \ + attr struct type *name##_RB_MINMAX(struct name *, int) +#define RB_PROTOTYPE_REINSERT(name, type, attr) \ + attr struct type *name##_RB_REINSERT(struct name *, struct type *) + +/* Main rb operation. + * Moves node close to the key of elm to top + */ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ + RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ + RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ + RB_GENERATE_INSERT(name, type, field, cmp, attr) \ + RB_GENERATE_REMOVE(name, type, field, attr) \ + RB_GENERATE_FIND(name, type, field, cmp, attr) \ + RB_GENERATE_NFIND(name, type, field, cmp, attr) \ + RB_GENERATE_NEXT(name, type, field, attr) \ + RB_GENERATE_PREV(name, type, field, attr) \ + RB_GENERATE_MINMAX(name, type, field, attr) \ + RB_GENERATE_REINSERT(name, type, field, cmp, attr) + + +#define RB_GENERATE_INSERT_COLOR(name, type, field, attr) \ +attr void \ +name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ +{ \ + struct type *parent, *gparent, *tmp; \ + while (RB_ISRED((parent = RB_PARENT(elm, field)), field)) { \ + gparent = RB_PARENT(parent, field); \ + if (parent == RB_LEFT(gparent, field)) { \ + tmp = RB_RIGHT(gparent, field); \ + if (RB_ISRED(tmp, field)) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if (RB_RIGHT(parent, field) == elm) { \ + RB_PARENT_ROTATE_LEFT(gparent, parent, \ + tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_RIGHT(head, gparent, tmp, field); \ + } else { \ + tmp = RB_LEFT(gparent, field); \ + if (RB_ISRED(tmp, field)) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field);\ + elm = gparent; \ + continue; \ + } \ + if (RB_LEFT(parent, field) == elm) { \ + RB_PARENT_ROTATE_RIGHT(gparent, parent, \ + tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_LEFT(head, gparent, tmp, field); \ + } \ + } \ + RB_COLOR(head->rbh_root, field) = RB_BLACK; \ +} + +#define RB_GENERATE_REMOVE_COLOR(name, type, field, attr) \ +attr void \ +name##_RB_REMOVE_COLOR(struct name *head, struct type *parent) \ +{ \ + struct type *elm, *tmp; \ + elm = NULL; \ + do { \ + if (RB_LEFT(parent, field) == elm) { \ + tmp = RB_RIGHT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_RED_ROTATE_LEFT(head, parent, tmp, field); \ + tmp = RB_RIGHT(parent, field); \ + } \ + if (RB_ISRED(RB_RIGHT(tmp, field), field)) \ + RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \ + else if (RB_ISRED(RB_LEFT(tmp, field), field)) { \ + struct type *oleft; \ + RB_PARENT_ROTATE_RIGHT(parent, tmp, \ + oleft, field); \ + RB_COLOR(oleft, field) = RB_BLACK; \ + tmp = oleft; \ + } else { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + continue; \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } else { \ + tmp = RB_LEFT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_RED_ROTATE_RIGHT(head, parent, tmp, field); \ + tmp = RB_LEFT(parent, field); \ + } \ + if (RB_ISRED(RB_LEFT(tmp, field), field)) \ + RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \ + else if (RB_ISRED(RB_RIGHT(tmp, field), field)) { \ + struct type *oright; \ + RB_PARENT_ROTATE_LEFT(parent, tmp, \ + oright, field); \ + RB_COLOR(oright, field) = RB_BLACK; \ + tmp = oright; \ + } else { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + continue; \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } \ + } while (RB_COLOR(elm, field) == RB_BLACK && parent != NULL); \ + RB_COLOR(elm, field) = RB_BLACK; \ +} + +#define RB_GENERATE_REMOVE(name, type, field, attr) \ +attr struct type * \ +name##_RB_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *child, *old, *parent, *right; \ + int color; \ + \ + old = elm; \ + parent = RB_PARENT(elm, field); \ + right = RB_RIGHT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (RB_LEFT(elm, field) == NULL) \ + elm = child = right; \ + else if (right == NULL) \ + elm = child = RB_LEFT(elm, field); \ + else { \ + if ((child = RB_LEFT(right, field)) == NULL) { \ + child = RB_RIGHT(right, field); \ + RB_RIGHT(old, field) = child; \ + parent = elm = right; \ + } else { \ + do \ + elm = child; \ + while ((child = RB_LEFT(elm, field)) != NULL); \ + child = RB_RIGHT(elm, field); \ + parent = RB_PARENT(elm, field); \ + RB_LEFT(parent, field) = child; \ + RB_SET_PARENT(RB_RIGHT(old, field), elm, field); \ + } \ + RB_SET_PARENT(RB_LEFT(old, field), elm, field); \ + color = RB_COLOR(elm, field); \ + elm->field = old->field; \ + } \ + RB_SWAP_CHILD(head, old, elm, field); \ + if (child != NULL) { \ + RB_SET_PARENT(child, parent, field); \ + RB_COLOR(child, field) = RB_BLACK; \ + } else if (color != RB_RED && parent != NULL) \ + name##_RB_REMOVE_COLOR(head, parent); \ + while (parent != NULL) { \ + RB_AUGMENT(parent); \ + parent = RB_PARENT(parent, field); \ + } \ + return (old); \ +} + +#define RB_GENERATE_INSERT(name, type, field, cmp, attr) \ +/* Inserts a node into the RB tree */ \ +attr struct type * \ +name##_RB_INSERT(struct name *head, struct type *elm) \ +{ \ + struct type *tmp; \ + struct type *parent = NULL; \ + int comp = 0; \ + tmp = RB_ROOT(head); \ + while (tmp) { \ + parent = tmp; \ + comp = (cmp)(elm, parent); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + RB_SET(elm, parent, field); \ + if (parent != NULL) { \ + if (comp < 0) \ + RB_LEFT(parent, field) = elm; \ + else \ + RB_RIGHT(parent, field) = elm; \ + } else \ + RB_ROOT(head) = elm; \ + name##_RB_INSERT_COLOR(head, elm); \ + while (elm != NULL) { \ + RB_AUGMENT(elm); \ + elm = RB_PARENT(elm, field); \ + } \ + return (NULL); \ +} + +#define RB_GENERATE_FIND(name, type, field, cmp, attr) \ +/* Finds the node with the same key as elm */ \ +attr struct type * \ +name##_RB_FIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (NULL); \ +} + +#define RB_GENERATE_NFIND(name, type, field, cmp, attr) \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} + +#define RB_GENERATE_NEXT(name, type, field, attr) \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_NEXT(struct type *elm) \ +{ \ + if (RB_RIGHT(elm, field)) { \ + elm = RB_RIGHT(elm, field); \ + while (RB_LEFT(elm, field)) \ + elm = RB_LEFT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} + +#define RB_GENERATE_PREV(name, type, field, attr) \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if (RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while (RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field)))\ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} + +#define RB_GENERATE_MINMAX(name, type, field, attr) \ +attr struct type * \ +name##_RB_MINMAX(struct name *head, int val) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *parent = NULL; \ + while (tmp) { \ + parent = tmp; \ + if (val < 0) \ + tmp = RB_LEFT(tmp, field); \ + else \ + tmp = RB_RIGHT(tmp, field); \ + } \ + return (parent); \ +} + +#define RB_GENERATE_REINSERT(name, type, field, cmp, attr) \ +attr struct type * \ +name##_RB_REINSERT(struct name *head, struct type *elm) \ +{ \ + struct type *cmpelm; \ + if (((cmpelm = RB_PREV(name, head, elm)) != NULL && \ + cmp(cmpelm, elm) >= 0) || \ + ((cmpelm = RB_NEXT(name, head, elm)) != NULL && \ + cmp(elm, cmpelm) >= 0)) { \ + /* XXXLAS: Remove/insert is heavy handed. */ \ + RB_REMOVE(name, head, elm); \ + return (RB_INSERT(name, head, elm)); \ + } \ + return (NULL); \ +} \ + +#define RB_NEGINF -1 +#define RB_INF 1 + +#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) +#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) +#define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) +#define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) +#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) +#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) +#define RB_REINSERT(name, x, y) name##_RB_REINSERT(x, y) + +#define RB_FOREACH(x, name, head) \ + for ((x) = RB_MIN(name, head); \ + (x) != NULL; \ + (x) = name##_RB_NEXT(x)) + +#define RB_FOREACH_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_SAFE(x, name, head, y) \ + for ((x) = RB_MIN(name, head); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for ((x) = RB_MAX(name, head); \ + (x) != NULL; \ + (x) = name##_RB_PREV(x)) + +#define RB_FOREACH_REVERSE_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ + for ((x) = RB_MAX(name, head); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#endif /* _SYS_TREE_H_ */ diff --git a/lib/include/sys/types.h b/lib/include/sys/types.h new file mode 100644 index 0000000..5035d54 --- /dev/null +++ b/lib/include/sys/types.h @@ -0,0 +1,228 @@ +/* unified sys/types.h: + start with sef's sysvi386 version. + merge go32 version -- a few ifdefs. + h8300hms, h8300xray, and sysvnecv70 disagree on the following types: + + typedef int gid_t; + typedef int uid_t; + typedef int dev_t; + typedef int ino_t; + typedef int mode_t; + typedef int caddr_t; + + however, these aren't "reasonable" values, the sysvi386 ones make far + more sense, and should work sufficiently well (in particular, h8300 + doesn't have a stat, and the necv70 doesn't matter.) -- eichin + */ + +#ifndef _SYS_TYPES_H + +#include <_ansi.h> +#include +#include + +/* BSD types permitted by POSIX and always exposed as in Glibc. Only provided + for backward compatibility with BSD code. The uintN_t standard types should + be preferred in new code. */ +#if ___int8_t_defined +typedef __uint8_t u_int8_t; +#endif +#if ___int16_t_defined +typedef __uint16_t u_int16_t; +#endif +#if ___int32_t_defined +typedef __uint32_t u_int32_t; +#endif +#if ___int64_t_defined +typedef __uint64_t u_int64_t; +#endif +typedef __intptr_t register_t; +#define __BIT_TYPES_DEFINED__ 1 + +#ifndef __need_inttypes + +#define _SYS_TYPES_H +#include +#include + +#if __BSD_VISIBLE +#include +#include +# define physadr physadr_t +# define quad quad_t + +#ifndef _IN_ADDR_T_DECLARED +typedef __uint32_t in_addr_t; /* base type for internet address */ +#define _IN_ADDR_T_DECLARED +#endif + +#ifndef _IN_PORT_T_DECLARED +typedef __uint16_t in_port_t; +#define _IN_PORT_T_DECLARED +#endif + +typedef __uintptr_t u_register_t; +#endif /* __BSD_VISIBLE */ + +#if __MISC_VISIBLE +#ifndef _BSDTYPES_DEFINED +/* also defined in mingw/gmon.h and in w32api/winsock[2].h */ +#ifndef __u_char_defined +typedef unsigned char u_char; +#define __u_char_defined +#endif +#ifndef __u_short_defined +typedef unsigned short u_short; +#define __u_short_defined +#endif +#ifndef __u_int_defined +typedef unsigned int u_int; +#define __u_int_defined +#endif +#ifndef __u_long_defined +typedef unsigned long u_long; +#define __u_long_defined +#endif +#define _BSDTYPES_DEFINED +#endif +#endif /* __MISC_VISIBLE */ + +#if __MISC_VISIBLE +typedef unsigned short ushort; /* System V compatibility */ +typedef unsigned int uint; /* System V compatibility */ +typedef unsigned long ulong; /* System V compatibility */ +#endif + +#ifndef _BLKCNT_T_DECLARED +typedef __blkcnt_t blkcnt_t; +#define _BLKCNT_T_DECLARED +#endif + +#ifndef _BLKSIZE_T_DECLARED +typedef __blksize_t blksize_t; +#define _BLKSIZE_T_DECLARED +#endif + +#if !defined(__clock_t_defined) && !defined(_CLOCK_T_DECLARED) +typedef _CLOCK_T_ clock_t; +#define __clock_t_defined +#define _CLOCK_T_DECLARED +#endif + +#if !defined(__time_t_defined) && !defined(_TIME_T_DECLARED) +typedef _TIME_T_ time_t; +#define __time_t_defined +#define _TIME_T_DECLARED +#endif + +typedef __daddr_t daddr_t; + +#ifndef __caddr_t_defined +typedef char * caddr_t; +#define __caddr_t_defined +#endif + +#ifndef _FSBLKCNT_T_DECLARED /* for statvfs() */ +typedef __fsblkcnt_t fsblkcnt_t; +typedef __fsfilcnt_t fsfilcnt_t; +#define _FSBLKCNT_T_DECLARED +#endif + +#ifndef _ID_T_DECLARED +typedef __id_t id_t; /* can hold a uid_t or pid_t */ +#define _ID_T_DECLARED +#endif + +#ifndef _INO_T_DECLARED +typedef __ino_t ino_t; /* inode number */ +#define _INO_T_DECLARED +#endif + +#if defined(__i386__) && (defined(GO32) || defined(__MSDOS__)) +typedef char * addr_t; +typedef unsigned long vm_offset_t; +typedef unsigned long vm_size_t; +#endif /* __i386__ && (GO32 || __MSDOS__) */ + +/* + * All these should be machine specific - right now they are all broken. + * However, for all of Cygnus' embedded targets, we want them to all be + * the same. Otherwise things like sizeof (struct stat) might depend on + * how the file was compiled (e.g. -mint16 vs -mint32, etc.). + */ + +#ifndef _OFF_T_DECLARED +typedef __off_t off_t; /* file offset */ +#define _OFF_T_DECLARED +#endif +#ifndef _DEV_T_DECLARED +typedef __dev_t dev_t; /* device number or struct cdev */ +#define _DEV_T_DECLARED +#endif +#ifndef _UID_T_DECLARED +typedef __uid_t uid_t; /* user id */ +#define _UID_T_DECLARED +#endif +#ifndef _GID_T_DECLARED +typedef __gid_t gid_t; /* group id */ +#define _GID_T_DECLARED +#endif + +#ifndef _PID_T_DECLARED +typedef __pid_t pid_t; /* process id */ +#define _PID_T_DECLARED +#endif + +#ifndef _KEY_T_DECLARED +typedef __key_t key_t; /* IPC key */ +#define _KEY_T_DECLARED +#endif + +#ifndef _SSIZE_T_DECLARED +typedef _ssize_t ssize_t; +#define _SSIZE_T_DECLARED +#endif + +#ifndef _MODE_T_DECLARED +typedef __mode_t mode_t; /* permissions */ +#define _MODE_T_DECLARED +#endif + +#ifndef _NLINK_T_DECLARED +typedef __nlink_t nlink_t; /* link count */ +#define _NLINK_T_DECLARED +#endif + +#if !defined(__clockid_t_defined) && !defined(_CLOCKID_T_DECLARED) +typedef __clockid_t clockid_t; +#define __clockid_t_defined +#define _CLOCKID_T_DECLARED +#endif + +#if !defined(__timer_t_defined) && !defined(_TIMER_T_DECLARED) +typedef __timer_t timer_t; +#define __timer_t_defined +#define _TIMER_T_DECLARED +#endif + +#ifndef _USECONDS_T_DECLARED +typedef __useconds_t useconds_t; /* microseconds (unsigned) */ +#define _USECONDS_T_DECLARED +#endif + +#ifndef _SUSECONDS_T_DECLARED +typedef __suseconds_t suseconds_t; +#define _SUSECONDS_T_DECLARED +#endif + +typedef __int64_t sbintime_t; + +#include +#include +#include + +#endif /* !__need_inttypes */ + +#undef __need_inttypes + +#endif /* _SYS_TYPES_H */ diff --git a/lib/include/sys/unistd.h b/lib/include/sys/unistd.h new file mode 100644 index 0000000..216d779 --- /dev/null +++ b/lib/include/sys/unistd.h @@ -0,0 +1,586 @@ +#ifndef _SYS_UNISTD_H +#define _SYS_UNISTD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <_ansi.h> +#define __need_size_t +#define __need_ptrdiff_t +#include +#include +#include +#include + +extern char **environ; + +void _exit (int __status) _ATTRIBUTE ((__noreturn__)); + +int access (const char *__path, int __amode); +unsigned alarm (unsigned __secs); +int chdir (const char *__path); +int chmod (const char *__path, mode_t __mode); +int chown (const char *__path, uid_t __owner, gid_t __group); +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112) +int chroot (const char *__path); +#endif +int close (int __fildes); +#if __POSIX_VISIBLE >= 199209 +size_t confstr (int __name, char *__buf, size_t __len); +#endif +#if __XSI_VISIBLE +char * crypt (const char *__key, const char *__salt); +#endif +#if __XSI_VISIBLE && __XSI_VISIBLE < 700 +char * ctermid (char *__s); +#endif +#if __XSI_VISIBLE && __XSI_VISIBLE < 600 +char * cuserid (char *__s); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +int daemon (int nochdir, int noclose); +#endif +int dup (int __fildes); +int dup2 (int __fildes, int __fildes2); +#if __GNU_VISIBLE +int dup3 (int __fildes, int __fildes2, int flags); +int eaccess (const char *__path, int __mode); +#endif +#if __XSI_VISIBLE +void encrypt (char *__block, int __edflag); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +void endusershell (void); +#endif +#if __GNU_VISIBLE +int euidaccess (const char *__path, int __mode); +#endif +int execl (const char *__path, const char *, ...); +int execle (const char *__path, const char *, ...); +int execlp (const char *__file, const char *, ...); +#if __MISC_VISIBLE +int execlpe (const char *__file, const char *, ...); +#endif +int execv (const char *__path, char * const __argv[]); +int execve (const char *__path, char * const __argv[], char * const __envp[]); +int execvp (const char *__file, char * const __argv[]); +#if __GNU_VISIBLE +int execvpe (const char *__file, char * const __argv[], char * const __envp[]); +#endif +#if __ATFILE_VISIBLE +int faccessat (int __dirfd, const char *__path, int __mode, int __flags); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int fchdir (int __fildes); +#endif +#if __POSIX_VISIBLE >= 199309 +int fchmod (int __fildes, mode_t __mode); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int fchown (int __fildes, uid_t __owner, gid_t __group); +#endif +#if __ATFILE_VISIBLE +int fchownat (int __dirfd, const char *__path, uid_t __owner, gid_t __group, int __flags); +#endif +#if __POSIX_VISIBLE >= 200809 +int fexecve (int __fd, char * const __argv[], char * const __envp[]); +#endif +pid_t fork (void); +long fpathconf (int __fd, int __name); +int fsync (int __fd); +#if __POSIX_VISIBLE >= 199309 +int fdatasync (int __fd); +#endif +#if __GNU_VISIBLE +char * get_current_dir_name (void); +#endif +char * getcwd (char *__buf, size_t __size); +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +int getdomainname (char *__name, size_t __len); +#endif +#if __BSD_VISIBLE +int getentropy (void *, size_t); +#endif +gid_t getegid (void); +uid_t geteuid (void); +gid_t getgid (void); +int getgroups (int __gidsetsize, gid_t __grouplist[]); +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +long gethostid (void); +#endif +char * getlogin (void); +#if defined(_POSIX_THREAD_SAFE_FUNCTIONS) +int getlogin_r (char *name, size_t namesize) ; +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __POSIX_VISIBLE < 200112) +char * getpass (const char *__prompt); +int getpagesize (void); +#endif +#if __BSD_VISIBLE +int getpeereid (int, uid_t *, gid_t *); +#endif +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4 +pid_t getpgid (pid_t); +#endif +pid_t getpgrp (void); +pid_t getpid (void); +pid_t getppid (void); +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 4 +pid_t getsid (pid_t); +#endif +uid_t getuid (void); +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +char * getusershell (void); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200809) +char * getwd (char *__buf); +#endif +#if __BSD_VISIBLE +int iruserok (unsigned long raddr, int superuser, const char *ruser, const char *luser); +#endif +int isatty (int __fildes); +#if __BSD_VISIBLE +int issetugid (void); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 || __POSIX_VISIBLE >= 200809 +int lchown (const char *__path, uid_t __owner, gid_t __group); +#endif +int link (const char *__path1, const char *__path2); +#if __ATFILE_VISIBLE +int linkat (int __dirfd1, const char *__path1, int __dirfd2, const char *__path2, int __flags); +#endif +#if __MISC_VISIBLE || __XSI_VISIBLE +int nice (int __nice_value); +#endif +#if !defined(__INSIDE_CYGWIN__) +off_t lseek (int __fildes, off_t __offset, int __whence); +#endif +#if __MISC_VISIBLE || __XSI_VISIBLE >= 4 +#define F_ULOCK 0 +#define F_LOCK 1 +#define F_TLOCK 2 +#define F_TEST 3 +int lockf (int __fd, int __cmd, off_t __len); +#endif +long pathconf (const char *__path, int __name); +int pause (void); +#if __POSIX_VISIBLE >= 199506 +int pthread_atfork (void (*)(void), void (*)(void), void (*)(void)); +#endif +int pipe (int __fildes[2]); +#if __GNU_VISIBLE +int pipe2 (int __fildes[2], int flags); +#endif +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +ssize_t pread (int __fd, void *__buf, size_t __nbytes, off_t __offset); +ssize_t pwrite (int __fd, const void *__buf, size_t __nbytes, off_t __offset); +#endif +_READ_WRITE_RETURN_TYPE read (int __fd, void *__buf, size_t __nbyte); +#if __BSD_VISIBLE +int rresvport (int *__alport); +int revoke (char *__path); +#endif +int rmdir (const char *__path); +#if __BSD_VISIBLE +int ruserok (const char *rhost, int superuser, const char *ruser, const char *luser); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200112) +void * sbrk (ptrdiff_t __incr); +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 +int setegid (gid_t __gid); +int seteuid (uid_t __uid); +#endif +int setgid (gid_t __gid); +#if __BSD_VISIBLE +int setgroups (int ngroups, const gid_t *grouplist); +#endif +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +int sethostname (const char *, size_t); +#endif +int setpgid (pid_t __pid, pid_t __pgid); +#if __SVID_VISIBLE || __XSI_VISIBLE >= 500 +int setpgrp (void); +#endif +#if __BSD_VISIBLE || __XSI_VISIBLE >= 4 +int setregid (gid_t __rgid, gid_t __egid); +int setreuid (uid_t __ruid, uid_t __euid); +#endif +pid_t setsid (void); +int setuid (uid_t __uid); +#if __BSD_VISIBLE || (__XSI_VISIBLE && __XSI_VISIBLE < 500) +void setusershell (void); +#endif +unsigned sleep (unsigned int __seconds); +#if __XSI_VISIBLE +void swab (const void *__restrict, void *__restrict, ssize_t); +#endif +long sysconf (int __name); +pid_t tcgetpgrp (int __fildes); +int tcsetpgrp (int __fildes, pid_t __pgrp_id); +char * ttyname (int __fildes); +int ttyname_r (int, char *, size_t); +int unlink (const char *__path); +#if __XSI_VISIBLE >= 500 && __POSIX_VISIBLE < 200809 || __BSD_VISIBLE +int usleep (useconds_t __useconds); +#endif +#if __BSD_VISIBLE +int vhangup (void); +#endif +_READ_WRITE_RETURN_TYPE write (int __fd, const void *__buf, size_t __nbyte); + +#ifdef __CYGWIN__ +# define __UNISTD_GETOPT__ +# include +# undef __UNISTD_GETOPT__ +#else +extern char *optarg; /* getopt(3) external variables */ +extern int optind, opterr, optopt; +int getopt(int, char * const [], const char *); +extern int optreset; /* getopt(3) external variable */ +#endif + +#if __BSD_VISIBLE || (__XSI_VISIBLE >= 4 && __POSIX_VISIBLE < 200809) +pid_t vfork (void); +#endif + +#ifdef _LIBC +/* Provide prototypes for most of the _ names that are + provided in newlib for some compilers. */ +int _close (int __fildes); +pid_t _fork (void); +pid_t _getpid (void); +int _isatty (int __fildes); +int _link (const char *__path1, const char *__path2); +_off_t _lseek (int __fildes, _off_t __offset, int __whence); +#ifdef __LARGE64_FILES +_off64_t _lseek64 (int __filedes, _off64_t __offset, int __whence); +#endif +_READ_WRITE_RETURN_TYPE _read (int __fd, void *__buf, size_t __nbyte); +void * _sbrk (ptrdiff_t __incr); +int _unlink (const char *__path); +_READ_WRITE_RETURN_TYPE _write (int __fd, const void *__buf, size_t __nbyte); +int _execve (const char *__path, char * const __argv[], char * const __envp[]); +#endif + +#if !defined(__INSIDE_CYGWIN__) +#if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500 +int ftruncate (int __fd, off_t __length); +#endif +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +int truncate (const char *, off_t __length); +#endif +#endif + +#if __BSD_VISIBLE || __POSIX_VISIBLE < 200112 +int getdtablesize (void); +#endif +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE >= 500 +useconds_t ualarm (useconds_t __useconds, useconds_t __interval); +#endif + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 500 +#if !(defined (_WINSOCK_H) || defined (_WINSOCKAPI_) || defined (__USE_W32_SOCKETS)) +/* winsock[2].h defines as __stdcall, and with int as 2nd arg */ + int gethostname (char *__name, size_t __len); +#endif +#endif + +#if __MISC_VISIBLE +int setdtablesize (int); +#endif + +#if __BSD_VISIBLE || __XSI_VISIBLE >= 500 +void sync (void); +#endif + +#if __BSD_VISIBLE || __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE >= 4 +ssize_t readlink (const char *__restrict __path, + char *__restrict __buf, size_t __buflen); +int symlink (const char *__name1, const char *__name2); +#endif +#if __ATFILE_VISIBLE +ssize_t readlinkat (int __dirfd1, const char *__restrict __path, + char *__restrict __buf, size_t __buflen); +int symlinkat (const char *, int, const char *); +int unlinkat (int, const char *, int); +#endif + +#define F_OK 0 +#define R_OK 4 +#define W_OK 2 +#define X_OK 1 + +# define SEEK_SET 0 +# define SEEK_CUR 1 +# define SEEK_END 2 + +#include + +#define STDIN_FILENO 0 /* standard input file descriptor */ +#define STDOUT_FILENO 1 /* standard output file descriptor */ +#define STDERR_FILENO 2 /* standard error file descriptor */ + +/* + * sysconf values per IEEE Std 1003.1, 2008 Edition + */ + +#define _SC_ARG_MAX 0 +#define _SC_CHILD_MAX 1 +#define _SC_CLK_TCK 2 +#define _SC_NGROUPS_MAX 3 +#define _SC_OPEN_MAX 4 +#define _SC_JOB_CONTROL 5 +#define _SC_SAVED_IDS 6 +#define _SC_VERSION 7 +#define _SC_PAGESIZE 8 +#define _SC_PAGE_SIZE _SC_PAGESIZE +/* These are non-POSIX values we accidentally introduced in 2000 without + guarding them. Keeping them unguarded for backward compatibility. */ +#define _SC_NPROCESSORS_CONF 9 +#define _SC_NPROCESSORS_ONLN 10 +#define _SC_PHYS_PAGES 11 +#define _SC_AVPHYS_PAGES 12 +/* End of non-POSIX values. */ +#define _SC_MQ_OPEN_MAX 13 +#define _SC_MQ_PRIO_MAX 14 +#define _SC_RTSIG_MAX 15 +#define _SC_SEM_NSEMS_MAX 16 +#define _SC_SEM_VALUE_MAX 17 +#define _SC_SIGQUEUE_MAX 18 +#define _SC_TIMER_MAX 19 +#define _SC_TZNAME_MAX 20 +#define _SC_ASYNCHRONOUS_IO 21 +#define _SC_FSYNC 22 +#define _SC_MAPPED_FILES 23 +#define _SC_MEMLOCK 24 +#define _SC_MEMLOCK_RANGE 25 +#define _SC_MEMORY_PROTECTION 26 +#define _SC_MESSAGE_PASSING 27 +#define _SC_PRIORITIZED_IO 28 +#define _SC_REALTIME_SIGNALS 29 +#define _SC_SEMAPHORES 30 +#define _SC_SHARED_MEMORY_OBJECTS 31 +#define _SC_SYNCHRONIZED_IO 32 +#define _SC_TIMERS 33 +#define _SC_AIO_LISTIO_MAX 34 +#define _SC_AIO_MAX 35 +#define _SC_AIO_PRIO_DELTA_MAX 36 +#define _SC_DELAYTIMER_MAX 37 +#define _SC_THREAD_KEYS_MAX 38 +#define _SC_THREAD_STACK_MIN 39 +#define _SC_THREAD_THREADS_MAX 40 +#define _SC_TTY_NAME_MAX 41 +#define _SC_THREADS 42 +#define _SC_THREAD_ATTR_STACKADDR 43 +#define _SC_THREAD_ATTR_STACKSIZE 44 +#define _SC_THREAD_PRIORITY_SCHEDULING 45 +#define _SC_THREAD_PRIO_INHERIT 46 +/* _SC_THREAD_PRIO_PROTECT was _SC_THREAD_PRIO_CEILING in early drafts */ +#define _SC_THREAD_PRIO_PROTECT 47 +#define _SC_THREAD_PRIO_CEILING _SC_THREAD_PRIO_PROTECT +#define _SC_THREAD_PROCESS_SHARED 48 +#define _SC_THREAD_SAFE_FUNCTIONS 49 +#define _SC_GETGR_R_SIZE_MAX 50 +#define _SC_GETPW_R_SIZE_MAX 51 +#define _SC_LOGIN_NAME_MAX 52 +#define _SC_THREAD_DESTRUCTOR_ITERATIONS 53 +#define _SC_ADVISORY_INFO 54 +#define _SC_ATEXIT_MAX 55 +#define _SC_BARRIERS 56 +#define _SC_BC_BASE_MAX 57 +#define _SC_BC_DIM_MAX 58 +#define _SC_BC_SCALE_MAX 59 +#define _SC_BC_STRING_MAX 60 +#define _SC_CLOCK_SELECTION 61 +#define _SC_COLL_WEIGHTS_MAX 62 +#define _SC_CPUTIME 63 +#define _SC_EXPR_NEST_MAX 64 +#define _SC_HOST_NAME_MAX 65 +#define _SC_IOV_MAX 66 +#define _SC_IPV6 67 +#define _SC_LINE_MAX 68 +#define _SC_MONOTONIC_CLOCK 69 +#define _SC_RAW_SOCKETS 70 +#define _SC_READER_WRITER_LOCKS 71 +#define _SC_REGEXP 72 +#define _SC_RE_DUP_MAX 73 +#define _SC_SHELL 74 +#define _SC_SPAWN 75 +#define _SC_SPIN_LOCKS 76 +#define _SC_SPORADIC_SERVER 77 +#define _SC_SS_REPL_MAX 78 +#define _SC_SYMLOOP_MAX 79 +#define _SC_THREAD_CPUTIME 80 +#define _SC_THREAD_SPORADIC_SERVER 81 +#define _SC_TIMEOUTS 82 +#define _SC_TRACE 83 +#define _SC_TRACE_EVENT_FILTER 84 +#define _SC_TRACE_EVENT_NAME_MAX 85 +#define _SC_TRACE_INHERIT 86 +#define _SC_TRACE_LOG 87 +#define _SC_TRACE_NAME_MAX 88 +#define _SC_TRACE_SYS_MAX 89 +#define _SC_TRACE_USER_EVENT_MAX 90 +#define _SC_TYPED_MEMORY_OBJECTS 91 +#define _SC_V7_ILP32_OFF32 92 +#define _SC_V6_ILP32_OFF32 _SC_V7_ILP32_OFF32 +#define _SC_XBS5_ILP32_OFF32 _SC_V7_ILP32_OFF32 +#define _SC_V7_ILP32_OFFBIG 93 +#define _SC_V6_ILP32_OFFBIG _SC_V7_ILP32_OFFBIG +#define _SC_XBS5_ILP32_OFFBIG _SC_V7_ILP32_OFFBIG +#define _SC_V7_LP64_OFF64 94 +#define _SC_V6_LP64_OFF64 _SC_V7_LP64_OFF64 +#define _SC_XBS5_LP64_OFF64 _SC_V7_LP64_OFF64 +#define _SC_V7_LPBIG_OFFBIG 95 +#define _SC_V6_LPBIG_OFFBIG _SC_V7_LPBIG_OFFBIG +#define _SC_XBS5_LPBIG_OFFBIG _SC_V7_LPBIG_OFFBIG +#define _SC_XOPEN_CRYPT 96 +#define _SC_XOPEN_ENH_I18N 97 +#define _SC_XOPEN_LEGACY 98 +#define _SC_XOPEN_REALTIME 99 +#define _SC_STREAM_MAX 100 +#define _SC_PRIORITY_SCHEDULING 101 +#define _SC_XOPEN_REALTIME_THREADS 102 +#define _SC_XOPEN_SHM 103 +#define _SC_XOPEN_STREAMS 104 +#define _SC_XOPEN_UNIX 105 +#define _SC_XOPEN_VERSION 106 +#define _SC_2_CHAR_TERM 107 +#define _SC_2_C_BIND 108 +#define _SC_2_C_DEV 109 +#define _SC_2_FORT_DEV 110 +#define _SC_2_FORT_RUN 111 +#define _SC_2_LOCALEDEF 112 +#define _SC_2_PBS 113 +#define _SC_2_PBS_ACCOUNTING 114 +#define _SC_2_PBS_CHECKPOINT 115 +#define _SC_2_PBS_LOCATE 116 +#define _SC_2_PBS_MESSAGE 117 +#define _SC_2_PBS_TRACK 118 +#define _SC_2_SW_DEV 119 +#define _SC_2_UPE 120 +#define _SC_2_VERSION 121 +#define _SC_THREAD_ROBUST_PRIO_INHERIT 122 +#define _SC_THREAD_ROBUST_PRIO_PROTECT 123 +#define _SC_XOPEN_UUCP 124 +#define _SC_LEVEL1_ICACHE_SIZE 125 +#define _SC_LEVEL1_ICACHE_ASSOC 126 +#define _SC_LEVEL1_ICACHE_LINESIZE 127 +#define _SC_LEVEL1_DCACHE_SIZE 128 +#define _SC_LEVEL1_DCACHE_ASSOC 129 +#define _SC_LEVEL1_DCACHE_LINESIZE 130 +#define _SC_LEVEL2_CACHE_SIZE 131 +#define _SC_LEVEL2_CACHE_ASSOC 132 +#define _SC_LEVEL2_CACHE_LINESIZE 133 +#define _SC_LEVEL3_CACHE_SIZE 134 +#define _SC_LEVEL3_CACHE_ASSOC 135 +#define _SC_LEVEL3_CACHE_LINESIZE 136 +#define _SC_LEVEL4_CACHE_SIZE 137 +#define _SC_LEVEL4_CACHE_ASSOC 138 +#define _SC_LEVEL4_CACHE_LINESIZE 139 +#define _SC_POSIX_26_VERSION 140 + +/* + * pathconf values per IEEE Std 1003.1, 2008 Edition + */ + +#define _PC_LINK_MAX 0 +#define _PC_MAX_CANON 1 +#define _PC_MAX_INPUT 2 +#define _PC_NAME_MAX 3 +#define _PC_PATH_MAX 4 +#define _PC_PIPE_BUF 5 +#define _PC_CHOWN_RESTRICTED 6 +#define _PC_NO_TRUNC 7 +#define _PC_VDISABLE 8 +#define _PC_ASYNC_IO 9 +#define _PC_PRIO_IO 10 +#define _PC_SYNC_IO 11 +#define _PC_FILESIZEBITS 12 +#define _PC_2_SYMLINKS 13 +#define _PC_SYMLINK_MAX 14 +#define _PC_ALLOC_SIZE_MIN 15 +#define _PC_REC_INCR_XFER_SIZE 16 +#define _PC_REC_MAX_XFER_SIZE 17 +#define _PC_REC_MIN_XFER_SIZE 18 +#define _PC_REC_XFER_ALIGN 19 +#define _PC_TIMESTAMP_RESOLUTION 20 +#ifdef __CYGWIN__ +/* Ask for POSIX permission bits support. */ +#define _PC_POSIX_PERMISSIONS 90 +/* Ask for full POSIX permission support including uid/gid settings. */ +#define _PC_POSIX_SECURITY 91 +#define _PC_CASE_INSENSITIVE 92 +#endif + +/* + * confstr values per IEEE Std 1003.1, 2004 Edition + */ + +/* Only defined on Cygwin and RTEMS for now. */ +#if defined (__CYGWIN__) || defined(__rtems__) +#define _CS_PATH 0 +#define _CS_POSIX_V7_ILP32_OFF32_CFLAGS 1 +#define _CS_POSIX_V6_ILP32_OFF32_CFLAGS _CS_POSIX_V7_ILP32_OFF32_CFLAGS +#define _CS_XBS5_ILP32_OFF32_CFLAGS _CS_POSIX_V7_ILP32_OFF32_CFLAGS +#define _CS_POSIX_V7_ILP32_OFF32_LDFLAGS 2 +#define _CS_POSIX_V6_ILP32_OFF32_LDFLAGS _CS_POSIX_V7_ILP32_OFF32_LDFLAGS +#define _CS_XBS5_ILP32_OFF32_LDFLAGS _CS_POSIX_V7_ILP32_OFF32_LDFLAGS +#define _CS_POSIX_V7_ILP32_OFF32_LIBS 3 +#define _CS_POSIX_V6_ILP32_OFF32_LIBS _CS_POSIX_V7_ILP32_OFF32_LIBS +#define _CS_XBS5_ILP32_OFF32_LIBS _CS_POSIX_V7_ILP32_OFF32_LIBS +#define _CS_XBS5_ILP32_OFF32_LINTFLAGS 4 +#define _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS 5 +#define _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS +#define _CS_XBS5_ILP32_OFFBIG_CFLAGS _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS +#define _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS 6 +#define _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS +#define _CS_XBS5_ILP32_OFFBIG_LDFLAGS _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS +#define _CS_POSIX_V7_ILP32_OFFBIG_LIBS 7 +#define _CS_POSIX_V6_ILP32_OFFBIG_LIBS _CS_POSIX_V7_ILP32_OFFBIG_LIBS +#define _CS_XBS5_ILP32_OFFBIG_LIBS _CS_POSIX_V7_ILP32_OFFBIG_LIBS +#define _CS_XBS5_ILP32_OFFBIG_LINTFLAGS 8 +#define _CS_POSIX_V7_LP64_OFF64_CFLAGS 9 +#define _CS_POSIX_V6_LP64_OFF64_CFLAGS _CS_POSIX_V7_LP64_OFF64_CFLAGS +#define _CS_XBS5_LP64_OFF64_CFLAGS _CS_POSIX_V7_LP64_OFF64_CFLAGS +#define _CS_POSIX_V7_LP64_OFF64_LDFLAGS 10 +#define _CS_POSIX_V6_LP64_OFF64_LDFLAGS _CS_POSIX_V7_LP64_OFF64_LDFLAGS +#define _CS_XBS5_LP64_OFF64_LDFLAGS _CS_POSIX_V7_LP64_OFF64_LDFLAGS +#define _CS_POSIX_V7_LP64_OFF64_LIBS 11 +#define _CS_POSIX_V6_LP64_OFF64_LIBS _CS_POSIX_V7_LP64_OFF64_LIBS +#define _CS_XBS5_LP64_OFF64_LIBS _CS_POSIX_V7_LP64_OFF64_LIBS +#define _CS_XBS5_LP64_OFF64_LINTFLAGS 12 +#define _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS 13 +#define _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS +#define _CS_XBS5_LPBIG_OFFBIG_CFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS +#define _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS 14 +#define _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS +#define _CS_XBS5_LPBIG_OFFBIG_LDFLAGS _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS +#define _CS_POSIX_V7_LPBIG_OFFBIG_LIBS 15 +#define _CS_POSIX_V6_LPBIG_OFFBIG_LIBS _CS_POSIX_V7_LPBIG_OFFBIG_LIBS +#define _CS_XBS5_LPBIG_OFFBIG_LIBS _CS_POSIX_V7_LPBIG_OFFBIG_LIBS +#define _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS 16 +#define _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS 17 +#define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS +#define _CS_XBS5_WIDTH_RESTRICTED_ENVS _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS +#define _CS_POSIX_V7_THREADS_CFLAGS 18 +#define _CS_POSIX_V7_THREADS_LDFLAGS 19 +#define _CS_V7_ENV 20 +#define _CS_V6_ENV _CS_V7_ENV +#define _CS_LFS_CFLAGS 21 +#define _CS_LFS_LDFLAGS 22 +#define _CS_LFS_LIBS 23 +#define _CS_LFS_LINTFLAGS 24 +#endif + +#ifdef __cplusplus +} +#endif + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _SYS_UNISTD_H */ diff --git a/lib/include/sys/utime.h b/lib/include/sys/utime.h new file mode 100644 index 0000000..5e937f1 --- /dev/null +++ b/lib/include/sys/utime.h @@ -0,0 +1,22 @@ +#ifndef _SYS_UTIME_H +#define _SYS_UTIME_H + +/* This is a dummy file, not customized for any + particular system. If there is a utime.h in libc/sys/SYSDIR/sys, + it will override this one. */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct utimbuf +{ + time_t actime; + time_t modtime; +}; + +#ifdef __cplusplus +}; +#endif + +#endif /* _SYS_UTIME_H */ diff --git a/lib/include/sys/wait.h b/lib/include/sys/wait.h new file mode 100644 index 0000000..d15eec9 --- /dev/null +++ b/lib/include/sys/wait.h @@ -0,0 +1,44 @@ +#ifndef _SYS_WAIT_H +#define _SYS_WAIT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define WNOHANG 1 +#define WUNTRACED 2 + +/* A status looks like: + <1 byte info> <1 byte code> + + == 0, child has exited, info is the exit value + == 1..7e, child has exited, info is the signal number. + == 7f, child has stopped, info was the signal number. + == 80, there was a core dump. +*/ + +#define WIFEXITED(w) (((w) & 0xff) == 0) +#define WIFSIGNALED(w) (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f)) +#define WIFSTOPPED(w) (((w) & 0xff) == 0x7f) +#define WEXITSTATUS(w) (((w) >> 8) & 0xff) +#define WTERMSIG(w) ((w) & 0x7f) +#define WSTOPSIG WEXITSTATUS + +pid_t wait (int *); +pid_t waitpid (pid_t, int *, int); + +#ifdef _LIBC +pid_t _wait (int *); +#endif + +/* Provide prototypes for most of the _ names that are + provided in newlib for some compilers. */ +pid_t _wait (int *); + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/lib/include/tar.h b/lib/include/tar.h new file mode 100644 index 0000000..36437fc --- /dev/null +++ b/lib/include/tar.h @@ -0,0 +1,43 @@ +/* + * tar.h + */ + +#ifndef _TAR_H +#define _TAR_H + +#include + +/* General definitions */ +#define TMAGIC "ustar" /* ustar plus null byte. */ +#define TMAGLEN 6 /* Length of the above. */ +#define TVERSION "00" /* 00 without a null byte. */ +#define TVERSLEN 2 /* Length of the above. */ + +/* Typeflag field definitions */ +#define REGTYPE '0' /* Regular file. */ +#define AREGTYPE '\0' /* Regular file. */ +#define LNKTYPE '1' /* Link. */ +#define SYMTYPE '2' /* Symbolic link. */ +#define CHRTYPE '3' /* Character special. */ +#define BLKTYPE '4' /* Block special. */ +#define DIRTYPE '5' /* Directory. */ +#define FIFOTYPE '6' /* FIFO special. */ +#define CONTTYPE '7' /* Reserved. */ + +/* Mode field bit definitions (octal) */ +#define TSUID 04000 /* Set UID on execution. */ +#define TSGID 02000 /* Set GID on execution. */ +#if __XSI_VISIBLE || __POSIX_VISIBLE < 200112 +#define TSVTX 01000 /* On directories, restricted deletion flag. */ +#endif +#define TUREAD 00400 /* Read by owner. */ +#define TUWRITE 00200 /* Write by owner. */ +#define TUEXEC 00100 /* Execute/search by owner. */ +#define TGREAD 00040 /* Read by group. */ +#define TGWRITE 00020 /* Write by group. */ +#define TGEXEC 00010 /* Execute/search by group. */ +#define TOREAD 00004 /* Read by other. */ +#define TOWRITE 00002 /* Write by other. */ +#define TOEXEC 00001 /* Execute/search by other. */ + +#endif diff --git a/lib/include/termios.h b/lib/include/termios.h new file mode 100644 index 0000000..ee1820c --- /dev/null +++ b/lib/include/termios.h @@ -0,0 +1,7 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif diff --git a/lib/include/tgmath.h b/lib/include/tgmath.h new file mode 100644 index 0000000..97dc50e --- /dev/null +++ b/lib/include/tgmath.h @@ -0,0 +1,185 @@ +/* http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/tgmath.h.html */ +/*- + * Copyright (c) 2004 Stefan Farfeleder. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _TGMATH_H_ +#define _TGMATH_H_ + +#include +#include + +#ifdef log2 +#undef log2 +#endif + +/* + * This implementation of requires two implementation-dependent + * macros to be defined: + * __tg_impl_simple(x, y, z, fn, fnf, fnl, ...) + * Invokes fnl() if the corresponding real type of x, y or z is long + * double, fn() if it is double or any has an integer type, and fnf() + * otherwise. + * __tg_impl_full(x, y, z, fn, fnf, fnl, cfn, cfnf, cfnl, ...) + * Invokes [c]fnl() if the corresponding real type of x, y or z is long + * double, [c]fn() if it is double or any has an integer type, and + * [c]fnf() otherwise. The function with the 'c' prefix is called if + * any of x, y or z is a complex number. + * Both macros call the chosen function with all additional arguments passed + * to them, as given by __VA_ARGS__. + * + * Note that these macros cannot be implemented with C's ?: operator, + * because the return type of the whole expression would incorrectly be long + * double complex regardless of the argument types. + */ + +/* requires GCC >= 3.1 */ +#if !__GNUC_PREREQ (3, 1) +#error " not implemented for this compiler" +#endif + +#define __tg_type(__e, __t) \ + __builtin_types_compatible_p(__typeof__(__e), __t) +#define __tg_type3(__e1, __e2, __e3, __t) \ + (__tg_type(__e1, __t) || __tg_type(__e2, __t) || \ + __tg_type(__e3, __t)) +#define __tg_type_corr(__e1, __e2, __e3, __t) \ + (__tg_type3(__e1, __e2, __e3, __t) || \ + __tg_type3(__e1, __e2, __e3, __t _Complex)) +#define __tg_integer(__e1, __e2, __e3) \ + (((__typeof__(__e1))1.5 == 1) || ((__typeof__(__e2))1.5 == 1) || \ + ((__typeof__(__e3))1.5 == 1)) +#define __tg_is_complex(__e1, __e2, __e3) \ + (__tg_type3(__e1, __e2, __e3, float _Complex) || \ + __tg_type3(__e1, __e2, __e3, double _Complex) || \ + __tg_type3(__e1, __e2, __e3, long double _Complex) || \ + __tg_type3(__e1, __e2, __e3, __typeof__(_Complex_I))) + +#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) +#define __tg_impl_simple(x, y, z, fn, fnf, fnl, ...) \ + __builtin_choose_expr(__tg_type_corr(x, y, z, long double), \ + fnl(__VA_ARGS__), __builtin_choose_expr( \ + __tg_type_corr(x, y, z, double) || __tg_integer(x, y, z),\ + fn(__VA_ARGS__), fnf(__VA_ARGS__))) +#else +#define __tg_impl_simple(__x, __y, __z, __fn, __fnf, __fnl, ...) \ + (__tg_type_corr(__x, __y, __z, double) || __tg_integer(__x, __y, __z)) \ + ? __fn(__VA_ARGS__) : __fnf(__VA_ARGS__) +#endif + +#define __tg_impl_full(__x, __y, __z, __fn, __fnf, __fnl, __cfn, __cfnf, __cfnl, ...) \ + __builtin_choose_expr(__tg_is_complex(__x, __y, __z), \ + __tg_impl_simple(__x, __y, __z, __cfn, __cfnf, __cfnl, __VA_ARGS__), \ + __tg_impl_simple(__x, __y, __z, __fn, __fnf, __fnl, __VA_ARGS__)) + +/* Macros to save lots of repetition below */ +#define __tg_simple(__x, __fn) \ + __tg_impl_simple(__x, __x, __x, __fn, __fn##f, __fn##l, __x) +#define __tg_simple2(__x, __y, __fn) \ + __tg_impl_simple(__x, __x, __y, __fn, __fn##f, __fn##l, __x, __y) +#define __tg_simplev(__x, __fn, ...) \ + __tg_impl_simple(__x, __x, __x, __fn, __fn##f, __fn##l, __VA_ARGS__) +#define __tg_full(__x, __fn) \ + __tg_impl_full(__x, __x, __x, __fn, __fn##f, __fn##l, c##__fn, c##__fn##f, c##__fn##l, __x) + +/* 7.22#4 -- These macros expand to real or complex functions, depending on + * the type of their arguments. */ +#define acos(__x) __tg_full(__x, acos) +#define asin(__x) __tg_full(__x, asin) +#define atan(__x) __tg_full(__x, atan) +#define acosh(__x) __tg_full(__x, acosh) +#define asinh(__x) __tg_full(__x, asinh) +#define atanh(__x) __tg_full(__x, atanh) +#define cos(__x) __tg_full(__x, cos) +#define sin(__x) __tg_full(__x, sin) +#define tan(__x) __tg_full(__x, tan) +#define cosh(__x) __tg_full(__x, cosh) +#define sinh(__x) __tg_full(__x, sinh) +#define tanh(__x) __tg_full(__x, tanh) +#define exp(__x) __tg_full(__x, exp) +#define log(__x) __tg_full(__x, log) +#define pow(__x, __y) __tg_impl_full(__x, __x, __y, pow, powf, powl, \ + cpow, cpowf, cpowl, __x, __y) +#define sqrt(__x) __tg_full(__x, sqrt) + +/* "The corresponding type-generic macro for fabs and cabs is fabs." */ +#define fabs(__x) __tg_impl_full(__x, __x, __x, fabs, fabsf, fabsl, \ + cabs, cabsf, cabsl, __x) + +/* 7.22#5 -- These macros are only defined for arguments with real type. */ +#define atan2(__x, __y) __tg_simple2(__x, __y, atan2) +#define cbrt(__x) __tg_simple(__x, cbrt) +#define ceil(__x) __tg_simple(__x, ceil) +#define copysign(__x, __y) __tg_simple2(__x, __y, copysign) +#define erf(__x) __tg_simple(__x, erf) +#define erfc(__x) __tg_simple(__x, erfc) +#define exp2(__x) __tg_simple(__x, exp2) +#define expm1(__x) __tg_simple(__x, expm1) +#define fdim(__x, __y) __tg_simple2(__x, __y, fdim) +#define floor(__x) __tg_simple(__x, floor) +#define fma(__x, __y, __z) __tg_impl_simple(__x, __y, __z, fma, fmaf, fmal, \ + __x, __y, __z) +#define fmax(__x, __y) __tg_simple2(__x, __y, fmax) +#define fmin(__x, __y) __tg_simple2(__x, __y, fmin) +#define fmod(__x, __y) __tg_simple2(__x, __y, fmod) +#define frexp(__x, __y) __tg_simplev(__x, frexp, __x, __y) +#define hypot(__x, __y) __tg_simple2(__x, __y, hypot) +#define ilogb(__x) __tg_simple(__x, ilogb) +#define ldexp(__x, __y) __tg_simplev(__x, ldexp, __x, __y) +#define lgamma(__x) __tg_simple(__x, lgamma) +#define llrint(__x) __tg_simple(__x, llrint) +#define llround(__x) __tg_simple(__x, llround) +#define log10(__x) __tg_simple(__x, log10) +#define log1p(__x) __tg_simple(__x, log1p) +#define log2(__x) __tg_simple(__x, log2) +#define logb(__x) __tg_simple(__x, logb) +#define lrint(__x) __tg_simple(__x, lrint) +#define lround(__x) __tg_simple(__x, lround) +#define nearbyint(__x) __tg_simple(__x, nearbyint) +#define nextafter(__x, __y) __tg_simple2(__x, __y, nextafter) +/* not yet implemented even for _LDBL_EQ_DBL platforms */ +#ifdef __CYGWIN__ +#define nexttoward(__x, __y) __tg_simplev(__x, nexttoward, __x, __y) +#endif +#define remainder(__x, __y) __tg_simple2(__x, __y, remainder) +#define remquo(__x, __y, __z) __tg_impl_simple(__x, __x, __y, remquo, remquof, \ + remquol, __x, __y, __z) +#define rint(__x) __tg_simple(__x, rint) +#define round(__x) __tg_simple(__x, round) +#define scalbn(__x, __y) __tg_simplev(__x, scalbn, __x, __y) +#define scalbln(__x, __y) __tg_simplev(__x, scalbln, __x, __y) +#define tgamma(__x) __tg_simple(__x, tgamma) +#define trunc(__x) __tg_simple(__x, trunc) + +/* 7.22#6 -- These macros always expand to complex functions. */ +#define carg(__x) __tg_simple(__x, carg) +#define cimag(__x) __tg_simple(__x, cimag) +#define conj(__x) __tg_simple(__x, conj) +#define cproj(__x) __tg_simple(__x, cproj) +#define creal(__x) __tg_simple(__x, creal) + +#endif /* !_TGMATH_H_ */ diff --git a/lib/include/threads.h b/lib/include/threads.h new file mode 100644 index 0000000..9fb08b0 --- /dev/null +++ b/lib/include/threads.h @@ -0,0 +1,93 @@ +/*- + * Copyright (c) 2011 Ed Schouten + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _THREADS_H_ +#define _THREADS_H_ + +#include +#include + +typedef void (*tss_dtor_t)(void *); +typedef int (*thrd_start_t)(void *); + +enum { + mtx_plain = 0x1, + mtx_recursive = 0x2, + mtx_timed = 0x4 +}; + +enum { + thrd_busy = 1, + thrd_error = 2, + thrd_nomem = 3, + thrd_success = 4, + thrd_timedout = 5 +}; + +#if !defined(__cplusplus) || __cplusplus < 201103L +#define thread_local _Thread_local +#endif + +__BEGIN_DECLS +void call_once(once_flag *, void (*)(void)); +int cnd_broadcast(cnd_t *); +void cnd_destroy(cnd_t *); +int cnd_init(cnd_t *); +int cnd_signal(cnd_t *); +int cnd_timedwait(cnd_t *__restrict, mtx_t *__restrict __mtx, + const struct timespec *__restrict) + __requires_exclusive(*__mtx); +int cnd_wait(cnd_t *, mtx_t *__mtx) + __requires_exclusive(*__mtx); +void mtx_destroy(mtx_t *__mtx) + __requires_unlocked(*__mtx); +int mtx_init(mtx_t *__mtx, int) + __requires_unlocked(*__mtx); +int mtx_lock(mtx_t *__mtx) + __locks_exclusive(*__mtx); +int mtx_timedlock(mtx_t *__restrict __mtx, + const struct timespec *__restrict) + __trylocks_exclusive(thrd_success, *__mtx); +int mtx_trylock(mtx_t *__mtx) + __trylocks_exclusive(thrd_success, *__mtx); +int mtx_unlock(mtx_t *__mtx) + __unlocks(*__mtx); +int thrd_create(thrd_t *, thrd_start_t, void *); +thrd_t thrd_current(void); +int thrd_detach(thrd_t); +int thrd_equal(thrd_t, thrd_t); +_Noreturn void + thrd_exit(int); +int thrd_join(thrd_t, int *); +int thrd_sleep(const struct timespec *, struct timespec *); +void thrd_yield(void); +int tss_create(tss_t *, tss_dtor_t); +void tss_delete(tss_t); +void * tss_get(tss_t); +int tss_set(tss_t, void *); +__END_DECLS + +#endif /* !_THREADS_H_ */ diff --git a/lib/include/time.h b/lib/include/time.h new file mode 100644 index 0000000..ed6cc70 --- /dev/null +++ b/lib/include/time.h @@ -0,0 +1,313 @@ +/* + * time.h + * + * Struct and function declarations for dealing with time. + */ + +#ifndef _TIME_H_ +#define _TIME_H_ + +#include "_ansi.h" +#include +#include + +#define __need_size_t +#define __need_NULL +#include + +/* Get _CLOCKS_PER_SEC_ */ +#include + +#ifndef _CLOCKS_PER_SEC_ +#define _CLOCKS_PER_SEC_ 1000 +#endif + +#define CLOCKS_PER_SEC _CLOCKS_PER_SEC_ +#define CLK_TCK CLOCKS_PER_SEC + +#include +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +_BEGIN_STD_C + +struct tm +{ + int tm_sec; + int tm_min; + int tm_hour; + int tm_mday; + int tm_mon; + int tm_year; + int tm_wday; + int tm_yday; + int tm_isdst; +#ifdef __TM_GMTOFF + long __TM_GMTOFF; +#endif +#ifdef __TM_ZONE + const char *__TM_ZONE; +#endif +}; + +clock_t clock (void); +double difftime (time_t _time2, time_t _time1); +time_t mktime (struct tm *_timeptr); +time_t time (time_t *_timer); +#ifndef _REENT_ONLY +char *asctime (const struct tm *_tblock); +char *ctime (const time_t *_time); +struct tm *gmtime (const time_t *_timer); +struct tm *localtime (const time_t *_timer); +#endif +size_t strftime (char *__restrict _s, + size_t _maxsize, const char *__restrict _fmt, + const struct tm *__restrict _t); + +#if __POSIX_VISIBLE >= 200809 +extern size_t strftime_l (char *__restrict _s, size_t _maxsize, + const char *__restrict _fmt, + const struct tm *__restrict _t, locale_t _l); +#endif + +char *asctime_r (const struct tm *__restrict, + char *__restrict); +char *ctime_r (const time_t *, char *); +struct tm *gmtime_r (const time_t *__restrict, + struct tm *__restrict); +struct tm *localtime_r (const time_t *__restrict, + struct tm *__restrict); + +_END_STD_C + +#ifdef __cplusplus +extern "C" { +#endif + +#if __XSI_VISIBLE +char *strptime (const char *__restrict, + const char *__restrict, + struct tm *__restrict); +#endif +#if __GNU_VISIBLE +char *strptime_l (const char *__restrict, const char *__restrict, + struct tm *__restrict, locale_t); +#endif + +#if __POSIX_VISIBLE +void tzset (void); +#endif +void _tzset_r (struct _reent *); + +/* getdate functions */ + +#ifdef HAVE_GETDATE +#if __XSI_VISIBLE >= 4 +#ifndef _REENT_ONLY +#define getdate_err (*__getdate_err()) +int *__getdate_err (void); + +struct tm * getdate (const char *); +/* getdate_err is set to one of the following values to indicate the error. + 1 the DATEMSK environment variable is null or undefined, + 2 the template file cannot be opened for reading, + 3 failed to get file status information, + 4 the template file is not a regular file, + 5 an error is encountered while reading the template file, + 6 memory allication failed (not enough memory available), + 7 there is no line in the template that matches the input, + 8 invalid input specification */ +#endif /* !_REENT_ONLY */ +#endif /* __XSI_VISIBLE >= 4 */ + +#if __GNU_VISIBLE +/* getdate_r returns the error code as above */ +int getdate_r (const char *, struct tm *); +#endif /* __GNU_VISIBLE */ +#endif /* HAVE_GETDATE */ + +/* defines for the opengroup specifications Derived from Issue 1 of the SVID. */ +#if __SVID_VISIBLE || __XSI_VISIBLE +extern __IMPORT long _timezone; +extern __IMPORT int _daylight; +#endif +#if __POSIX_VISIBLE +extern __IMPORT char *_tzname[2]; + +/* POSIX defines the external tzname being defined in time.h */ +#ifndef tzname +#define tzname _tzname +#endif +#endif /* __POSIX_VISIBLE */ + +#ifdef __cplusplus +} +#endif + +#include + +#ifdef __CYGWIN__ +#include +#endif /*__CYGWIN__*/ + +#if defined(_POSIX_TIMERS) + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Clocks, P1003.1b-1993, p. 263 */ + +int clock_settime (clockid_t clock_id, const struct timespec *tp); +int clock_gettime (clockid_t clock_id, struct timespec *tp); +int clock_getres (clockid_t clock_id, struct timespec *res); + +/* Create a Per-Process Timer, P1003.1b-1993, p. 264 */ + +int timer_create (clockid_t clock_id, + struct sigevent *__restrict evp, + timer_t *__restrict timerid); + +/* Delete a Per_process Timer, P1003.1b-1993, p. 266 */ + +int timer_delete (timer_t timerid); + +/* Per-Process Timers, P1003.1b-1993, p. 267 */ + +int timer_settime (timer_t timerid, int flags, + const struct itimerspec *__restrict value, + struct itimerspec *__restrict ovalue); +int timer_gettime (timer_t timerid, struct itimerspec *value); +int timer_getoverrun (timer_t timerid); + +/* High Resolution Sleep, P1003.1b-1993, p. 269 */ + +int nanosleep (const struct timespec *rqtp, struct timespec *rmtp); + +#ifdef __cplusplus +} +#endif +#endif /* _POSIX_TIMERS */ + +#if defined(_POSIX_CLOCK_SELECTION) + +#ifdef __cplusplus +extern "C" { +#endif + +int clock_nanosleep (clockid_t clock_id, int flags, + const struct timespec *rqtp, struct timespec *rmtp); + +#ifdef __cplusplus +} +#endif + +#endif /* _POSIX_CLOCK_SELECTION */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* CPU-time Clock Attributes, P1003.4b/D8, p. 54 */ + +/* values for the clock enable attribute */ + +#define CLOCK_ENABLED 1 /* clock is enabled, i.e. counting execution time */ +#define CLOCK_DISABLED 0 /* clock is disabled */ + +/* values for the pthread cputime_clock_allowed attribute */ + +#define CLOCK_ALLOWED 1 /* If a thread is created with this value a */ + /* CPU-time clock attached to that thread */ + /* shall be accessible. */ +#define CLOCK_DISALLOWED 0 /* If a thread is created with this value, the */ + /* thread shall not have a CPU-time clock */ + /* accessible. */ + +/* Flag indicating time is "absolute" with respect to the clock + associated with a time. Value 4 is historic. */ + +#define TIMER_ABSTIME 4 + +/* Manifest Constants, P1003.1b-1993, p. 262 */ + +#if __GNU_VISIBLE +#define CLOCK_REALTIME_COARSE ((clockid_t) 0) +#endif + +#define CLOCK_REALTIME ((clockid_t) 1) + +/* Manifest Constants, P1003.4b/D8, p. 55 */ + +#if defined(_POSIX_CPUTIME) + +/* When used in a clock or timer function call, this is interpreted as + the identifier of the CPU_time clock associated with the PROCESS + making the function call. */ + +#define CLOCK_PROCESS_CPUTIME_ID ((clockid_t) 2) + +#endif + +#if defined(_POSIX_THREAD_CPUTIME) + +/* When used in a clock or timer function call, this is interpreted as + the identifier of the CPU_time clock associated with the THREAD + making the function call. */ + +#define CLOCK_THREAD_CPUTIME_ID ((clockid_t) 3) + +#endif + +#if defined(_POSIX_MONOTONIC_CLOCK) + +/* The identifier for the system-wide monotonic clock, which is defined + * as a clock whose value cannot be set via clock_settime() and which + * cannot have backward clock jumps. */ + +#define CLOCK_MONOTONIC ((clockid_t) 4) + +#endif + +#if __GNU_VISIBLE + +#define CLOCK_MONOTONIC_RAW ((clockid_t) 5) + +#define CLOCK_MONOTONIC_COARSE ((clockid_t) 6) + +#define CLOCK_BOOTTIME ((clockid_t) 7) + +#define CLOCK_REALTIME_ALARM ((clockid_t) 8) + +#define CLOCK_BOOTTIME_ALARM ((clockid_t) 9) + +#endif + +#if defined(_POSIX_CPUTIME) + +/* Accessing a Process CPU-time CLock, P1003.4b/D8, p. 55 */ + +int clock_getcpuclockid (pid_t pid, clockid_t *clock_id); + +#endif /* _POSIX_CPUTIME */ + +#if defined(_POSIX_CPUTIME) || defined(_POSIX_THREAD_CPUTIME) + +/* CPU-time Clock Attribute Access, P1003.4b/D8, p. 56 */ + +int clock_setenable_attr (clockid_t clock_id, int attr); +int clock_getenable_attr (clockid_t clock_id, int *attr); + +#endif /* _POSIX_CPUTIME or _POSIX_THREAD_CPUTIME */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TIME_H_ */ + diff --git a/lib/include/unctrl.h b/lib/include/unctrl.h new file mode 100644 index 0000000..3363328 --- /dev/null +++ b/lib/include/unctrl.h @@ -0,0 +1,42 @@ +/* From curses.h. */ +/* + * Copyright (c) 1981, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _UNCTRL_H_ +#define _UNCTRL_H_ + +#include <_ansi.h> + +#define unctrl(c) __unctrl[(c) & 0xff] +#define unctrllen(ch) __unctrllen[(ch) & 0xff] + +extern __IMPORT const char * const __unctrl[256]; /* Control strings. */ +extern __IMPORT const char __unctrllen[256]; /* Control strings length. */ + +#endif /* _UNCTRL_H_ */ diff --git a/lib/include/unistd.h b/lib/include/unistd.h new file mode 100644 index 0000000..f9fca84 --- /dev/null +++ b/lib/include/unistd.h @@ -0,0 +1,6 @@ +#ifndef _UNISTD_H_ +#define _UNISTD_H_ + +# include + +#endif /* _UNISTD_H_ */ diff --git a/lib/include/utime.h b/lib/include/utime.h new file mode 100644 index 0000000..652891a --- /dev/null +++ b/lib/include/utime.h @@ -0,0 +1,12 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#include <_ansi.h> + +/* The utime function is defined in libc/sys//sys if it exists. */ +#include + +#ifdef __cplusplus +} +#endif diff --git a/lib/include/utmp.h b/lib/include/utmp.h new file mode 100644 index 0000000..88cf6f8 --- /dev/null +++ b/lib/include/utmp.h @@ -0,0 +1,8 @@ +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + diff --git a/lib/include/wchar.h b/lib/include/wchar.h new file mode 100644 index 0000000..7c37427 --- /dev/null +++ b/lib/include/wchar.h @@ -0,0 +1,339 @@ +#ifndef _WCHAR_H_ +#define _WCHAR_H_ + +#include <_ansi.h> + +#include + +#define __need_size_t +#define __need_wchar_t +#define __need_wint_t +#define __need_NULL +#include + +/* For _mbstate_t definition. */ +#include +#include +/* For __STDC_ISO_10646__ */ +#include + +/* typedef only __gnuc_va_list, used throughout the header */ +#define __need___va_list +#include + +/* typedef va_list only when required */ +#if __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE +#ifdef __GNUC__ +#ifndef _VA_LIST_DEFINED +typedef __gnuc_va_list va_list; +#define _VA_LIST_DEFINED +#endif +#else /* !__GNUC__ */ +#include +#endif +#endif /* __POSIX_VISIBLE >= 200809 || __XSI_VISIBLE */ + +#if __XSI_VISIBLE /* && __XSI_VISIBLE < 800 */ && !__GNU_VISIBLE +#include +#endif + +#ifndef WEOF +# define WEOF ((wint_t)-1) +#endif + +/* This must match definition in */ +#ifndef WCHAR_MIN +#ifdef __WCHAR_MIN__ +#define WCHAR_MIN __WCHAR_MIN__ +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MIN (0 + L'\0') +#else +#define WCHAR_MIN (-0x7fffffff - 1 + L'\0') +#endif +#endif + +/* This must match definition in */ +#ifndef WCHAR_MAX +#ifdef __WCHAR_MAX__ +#define WCHAR_MAX __WCHAR_MAX__ +#elif defined(__WCHAR_UNSIGNED__) || (L'\0' - 1 > 0) +#define WCHAR_MAX (0xffffffffu + L'\0') +#else +#define WCHAR_MAX (0x7fffffff + L'\0') +#endif +#endif + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +_BEGIN_STD_C + +#if __POSIX_VISIBLE >= 200809 || _XSI_VISIBLE +/* As in stdio.h, defines __FILE. */ +#if !defined(__FILE_defined) +typedef __FILE FILE; +# define __FILE_defined +#endif +#endif + +/* As required by POSIX.1-2008, declare tm as incomplete type. + The actual definition is in time.h. */ +struct tm; + +#ifndef _MBSTATE_T +#define _MBSTATE_T +typedef _mbstate_t mbstate_t; +#endif /* _MBSTATE_T */ + +wint_t btowc (int); +int wctob (wint_t); +size_t mbrlen (const char *__restrict, size_t, mbstate_t *__restrict); +size_t mbrtowc (wchar_t *__restrict, const char *__restrict, size_t, + mbstate_t *__restrict); +size_t _mbrtowc_r (struct _reent *, wchar_t * , const char * , + size_t, mbstate_t *); +int mbsinit (const mbstate_t *); +#if __POSIX_VISIBLE >= 200809 +size_t mbsnrtowcs (wchar_t *__restrict, const char **__restrict, + size_t, size_t, mbstate_t *__restrict); +#endif +size_t _mbsnrtowcs_r (struct _reent *, wchar_t * , const char ** , + size_t, size_t, mbstate_t *); +size_t mbsrtowcs (wchar_t *__restrict, const char **__restrict, size_t, + mbstate_t *__restrict); +size_t _mbsrtowcs_r (struct _reent *, wchar_t * , const char ** , size_t, mbstate_t *); +size_t wcrtomb (char *__restrict, wchar_t, mbstate_t *__restrict); +size_t _wcrtomb_r (struct _reent *, char * , wchar_t, mbstate_t *); +#if __POSIX_VISIBLE >= 200809 +size_t wcsnrtombs (char *__restrict, const wchar_t **__restrict, + size_t, size_t, mbstate_t *__restrict); +#endif +size_t _wcsnrtombs_r (struct _reent *, char * , const wchar_t ** , + size_t, size_t, mbstate_t *); +size_t wcsrtombs (char *__restrict, const wchar_t **__restrict, + size_t, mbstate_t *__restrict); +size_t _wcsrtombs_r (struct _reent *, char * , const wchar_t ** , + size_t, mbstate_t *); +#if __POSIX_VISIBLE >= 200809 +int wcscasecmp (const wchar_t *, const wchar_t *); +#endif +wchar_t *wcscat (wchar_t *__restrict, const wchar_t *__restrict); +wchar_t *wcschr (const wchar_t *, wchar_t); +int wcscmp (const wchar_t *, const wchar_t *); +int wcscoll (const wchar_t *, const wchar_t *); +wchar_t *wcscpy (wchar_t *__restrict, const wchar_t *__restrict); +#if __POSIX_VISIBLE >= 200809 +wchar_t *wcpcpy (wchar_t *__restrict, + const wchar_t *__restrict); +wchar_t *wcsdup (const wchar_t *) __malloc_like __result_use_check; +#endif +wchar_t *_wcsdup_r (struct _reent *, const wchar_t * ); +size_t wcscspn (const wchar_t *, const wchar_t *); +size_t wcsftime (wchar_t *__restrict, size_t, + const wchar_t *__restrict, const struct tm *__restrict); +#if __GNU_VISIBLE +size_t wcsftime_l (wchar_t *__restrict, size_t, const wchar_t *__restrict, + const struct tm *__restrict, locale_t); +#endif +size_t wcslcat (wchar_t *, const wchar_t *, size_t); +size_t wcslcpy (wchar_t *, const wchar_t *, size_t); +size_t wcslen (const wchar_t *); +#if __POSIX_VISIBLE >= 200809 +int wcsncasecmp (const wchar_t *, const wchar_t *, size_t); +#endif +wchar_t *wcsncat (wchar_t *__restrict, + const wchar_t *__restrict, size_t); +int wcsncmp (const wchar_t *, const wchar_t *, size_t); +wchar_t *wcsncpy (wchar_t *__restrict, + const wchar_t *__restrict, size_t); +#if __POSIX_VISIBLE >= 200809 +wchar_t *wcpncpy (wchar_t *__restrict, + const wchar_t *__restrict, size_t); +size_t wcsnlen (const wchar_t *, size_t); +#endif +wchar_t *wcspbrk (const wchar_t *, const wchar_t *); +wchar_t *wcsrchr (const wchar_t *, wchar_t); +size_t wcsspn (const wchar_t *, const wchar_t *); +wchar_t *wcsstr (const wchar_t *__restrict, + const wchar_t *__restrict); +wchar_t *wcstok (wchar_t *__restrict, const wchar_t *__restrict, + wchar_t **__restrict); +double wcstod (const wchar_t *__restrict, wchar_t **__restrict); +double _wcstod_r (struct _reent *, const wchar_t *, wchar_t **); +#if __ISO_C_VISIBLE >= 1999 +float wcstof (const wchar_t *__restrict, wchar_t **__restrict); +#endif +float _wcstof_r (struct _reent *, const wchar_t *, wchar_t **); +#if __XSI_VISIBLE +int wcswidth (const wchar_t *, size_t); +#endif +size_t wcsxfrm (wchar_t *__restrict, const wchar_t *__restrict, + size_t); +#if __POSIX_VISIBLE >= 200809 +extern int wcscasecmp_l (const wchar_t *, const wchar_t *, locale_t); +extern int wcsncasecmp_l (const wchar_t *, const wchar_t *, size_t, locale_t); +extern int wcscoll_l (const wchar_t *, const wchar_t *, locale_t); +extern size_t wcsxfrm_l (wchar_t *__restrict, const wchar_t *__restrict, size_t, + locale_t); +#endif + +#if __XSI_VISIBLE +int wcwidth (const wchar_t); +#endif +wchar_t *wmemchr (const wchar_t *, wchar_t, size_t); +int wmemcmp (const wchar_t *, const wchar_t *, size_t); +wchar_t *wmemcpy (wchar_t *__restrict, const wchar_t *__restrict, + size_t); +wchar_t *wmemmove (wchar_t *, const wchar_t *, size_t); +#if __GNU_VISIBLE +wchar_t *wmempcpy (wchar_t *__restrict, const wchar_t *__restrict, + size_t); +#endif +wchar_t *wmemset (wchar_t *, wchar_t, size_t); + +long wcstol (const wchar_t *__restrict, wchar_t **__restrict, int); +#if __ISO_C_VISIBLE >= 1999 +long long wcstoll (const wchar_t *__restrict, wchar_t **__restrict, + int); +#endif +unsigned long wcstoul (const wchar_t *__restrict, wchar_t **__restrict, + int); +#if __ISO_C_VISIBLE >= 1999 +unsigned long long wcstoull (const wchar_t *__restrict, + wchar_t **__restrict, int); +#endif +long _wcstol_r (struct _reent *, const wchar_t *, wchar_t **, int); +long long _wcstoll_r (struct _reent *, const wchar_t *, wchar_t **, int); +unsigned long _wcstoul_r (struct _reent *, const wchar_t *, wchar_t **, int); +unsigned long long _wcstoull_r (struct _reent *, const wchar_t *, wchar_t **, int); +#if __ISO_C_VISIBLE >= 1999 +long double wcstold (const wchar_t *, wchar_t **); +#endif + +#if __GNU_VISIBLE +long wcstol_l (const wchar_t *__restrict, wchar_t **__restrict, int, locale_t); +long long wcstoll_l (const wchar_t *__restrict, wchar_t **__restrict, int, + locale_t); +unsigned long wcstoul_l (const wchar_t *__restrict, wchar_t **__restrict, int, + locale_t); +unsigned long long wcstoull_l (const wchar_t *__restrict, wchar_t **__restrict, + int, locale_t); +double wcstod_l (const wchar_t *, wchar_t **, locale_t); +float wcstof_l (const wchar_t *, wchar_t **, locale_t); +long double wcstold_l (const wchar_t *, wchar_t **, locale_t); +#endif + +wint_t fgetwc (__FILE *); +wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); +wint_t fputwc (wchar_t, __FILE *); +int fputws (const wchar_t *__restrict, __FILE *__restrict); +#if __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE >= 500 +int fwide (__FILE *, int); +#endif +wint_t getwc (__FILE *); +wint_t getwchar (void); +wint_t putwc (wchar_t, __FILE *); +wint_t putwchar (wchar_t); +wint_t ungetwc (wint_t wc, __FILE *); + +wint_t _fgetwc_r (struct _reent *, __FILE *); +wint_t _fgetwc_unlocked_r (struct _reent *, __FILE *); +wchar_t *_fgetws_r (struct _reent *, wchar_t *, int, __FILE *); +wchar_t *_fgetws_unlocked_r (struct _reent *, wchar_t *, int, __FILE *); +wint_t _fputwc_r (struct _reent *, wchar_t, __FILE *); +wint_t _fputwc_unlocked_r (struct _reent *, wchar_t, __FILE *); +int _fputws_r (struct _reent *, const wchar_t *, __FILE *); +int _fputws_unlocked_r (struct _reent *, const wchar_t *, __FILE *); +int _fwide_r (struct _reent *, __FILE *, int); +wint_t _getwc_r (struct _reent *, __FILE *); +wint_t _getwc_unlocked_r (struct _reent *, __FILE *); +wint_t _getwchar_r (struct _reent *); +wint_t _getwchar_unlocked_r (struct _reent *); +wint_t _putwc_r (struct _reent *, wchar_t, __FILE *); +wint_t _putwc_unlocked_r (struct _reent *, wchar_t, __FILE *); +wint_t _putwchar_r (struct _reent *, wchar_t); +wint_t _putwchar_unlocked_r (struct _reent *, wchar_t); +wint_t _ungetwc_r (struct _reent *, wint_t wc, __FILE *); + +#if __GNU_VISIBLE +wint_t fgetwc_unlocked (__FILE *); +wchar_t *fgetws_unlocked (wchar_t *__restrict, int, __FILE *__restrict); +wint_t fputwc_unlocked (wchar_t, __FILE *); +int fputws_unlocked (const wchar_t *__restrict, __FILE *__restrict); +wint_t getwc_unlocked (__FILE *); +wint_t getwchar_unlocked (void); +wint_t putwc_unlocked (wchar_t, __FILE *); +wint_t putwchar_unlocked (wchar_t); +#endif + +#if __POSIX_VISIBLE >= 200809 +__FILE *open_wmemstream (wchar_t **, size_t *); +#endif +__FILE *_open_wmemstream_r (struct _reent *, wchar_t **, size_t *); + +#ifndef __VALIST +#ifdef __GNUC__ +#define __VALIST __gnuc_va_list +#else +#define __VALIST char* +#endif +#endif + +#if __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE >= 500 +int fwprintf (__FILE *__restrict, const wchar_t *__restrict, ...); +int swprintf (wchar_t *__restrict, size_t, + const wchar_t *__restrict, ...); +int vfwprintf (__FILE *__restrict, const wchar_t *__restrict, + __VALIST); +int vswprintf (wchar_t *__restrict, size_t, + const wchar_t *__restrict, __VALIST); +int vwprintf (const wchar_t *__restrict, __VALIST); +int wprintf (const wchar_t *__restrict, ...); +#endif + +int _fwprintf_r (struct _reent *, __FILE *, const wchar_t *, ...); +int _swprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, ...); +int _vfwprintf_r (struct _reent *, __FILE *, const wchar_t *, __VALIST); +int _vswprintf_r (struct _reent *, wchar_t *, size_t, const wchar_t *, __VALIST); +int _vwprintf_r (struct _reent *, const wchar_t *, __VALIST); +int _wprintf_r (struct _reent *, const wchar_t *, ...); + +#if __ISO_C_VISIBLE >= 1999 || __XSI_VISIBLE >= 500 +int fwscanf (__FILE *__restrict, const wchar_t *__restrict, ...); +int swscanf (const wchar_t *__restrict, + const wchar_t *__restrict, ...); +int vfwscanf (__FILE *__restrict, const wchar_t *__restrict, + __VALIST); +int vswscanf (const wchar_t *__restrict, const wchar_t *__restrict, + __VALIST); +int vwscanf (const wchar_t *__restrict, __VALIST); +int wscanf (const wchar_t *__restrict, ...); +#endif + +int _fwscanf_r (struct _reent *, __FILE *, const wchar_t *, ...); +int _swscanf_r (struct _reent *, const wchar_t *, const wchar_t *, ...); +int _vfwscanf_r (struct _reent *, __FILE *, const wchar_t *, __VALIST); +int _vswscanf_r (struct _reent *, const wchar_t *, const wchar_t *, __VALIST); +int _vwscanf_r (struct _reent *, const wchar_t *, __VALIST); +int _wscanf_r (struct _reent *, const wchar_t *, ...); + +#define getwc(fp) fgetwc(fp) +#define putwc(wc,fp) fputwc((wc), (fp)) +#define getwchar() fgetwc(_REENT_STDIN(_REENT)) +#define putwchar(wc) fputwc((wc), _REENT_STDOUT(_REENT)) + +#if __GNU_VISIBLE +#define getwc_unlocked(fp) fgetwc_unlocked(fp) +#define putwc_unlocked(wc,fp) fputwc_unlocked((wc), (fp)) +#define getwchar_unlocked() fgetwc_unlocked(_REENT_STDIN(_REENT)) +#define putwchar_unlocked(wc) fputwc_unlocked((wc), _REENT_STDOUT(_REENT)) +#endif + +_END_STD_C + +#if __SSP_FORTIFY_LEVEL > 0 +#include +#endif + +#endif /* _WCHAR_H_ */ diff --git a/lib/include/wctype.h b/lib/include/wctype.h new file mode 100644 index 0000000..e5452bf --- /dev/null +++ b/lib/include/wctype.h @@ -0,0 +1,74 @@ +#ifndef _WCTYPE_H_ +#define _WCTYPE_H_ + +#include <_ansi.h> +#include + +#define __need_wint_t +#include + +#if __POSIX_VISIBLE >= 200809 +#include +#endif + +#ifndef WEOF +# define WEOF ((wint_t)-1) +#endif + +_BEGIN_STD_C + +#ifndef _WCTYPE_T +#define _WCTYPE_T +typedef int wctype_t; +#endif + +#ifndef _WCTRANS_T +#define _WCTRANS_T +typedef int wctrans_t; +#endif + +int iswalpha (wint_t); +int iswalnum (wint_t); +#if __ISO_C_VISIBLE >= 1999 +int iswblank (wint_t); +#endif +int iswcntrl (wint_t); +int iswctype (wint_t, wctype_t); +int iswdigit (wint_t); +int iswgraph (wint_t); +int iswlower (wint_t); +int iswprint (wint_t); +int iswpunct (wint_t); +int iswspace (wint_t); +int iswupper (wint_t); +int iswxdigit (wint_t); +wint_t towctrans (wint_t, wctrans_t); +wint_t towupper (wint_t); +wint_t towlower (wint_t); +wctrans_t wctrans (const char *); +wctype_t wctype (const char *); + +#if __POSIX_VISIBLE >= 200809 +extern int iswalpha_l (wint_t, locale_t); +extern int iswalnum_l (wint_t, locale_t); +extern int iswblank_l (wint_t, locale_t); +extern int iswcntrl_l (wint_t, locale_t); +extern int iswctype_l (wint_t, wctype_t, locale_t); +extern int iswdigit_l (wint_t, locale_t); +extern int iswgraph_l (wint_t, locale_t); +extern int iswlower_l (wint_t, locale_t); +extern int iswprint_l (wint_t, locale_t); +extern int iswpunct_l (wint_t, locale_t); +extern int iswspace_l (wint_t, locale_t); +extern int iswupper_l (wint_t, locale_t); +extern int iswxdigit_l (wint_t, locale_t); +extern wint_t towctrans_l (wint_t, wctrans_t, locale_t); +extern wint_t towupper_l (wint_t, locale_t); +extern wint_t towlower_l (wint_t, locale_t); +extern wctrans_t wctrans_l (const char *, locale_t); +extern wctype_t wctype_l (const char *, locale_t); +#endif + +_END_STD_C + +#endif /* _WCTYPE_H_ */ diff --git a/lib/include/wordexp.h b/lib/include/wordexp.h new file mode 100644 index 0000000..1f09a64 --- /dev/null +++ b/lib/include/wordexp.h @@ -0,0 +1,53 @@ +/* Copyright (C) 2002, 2010 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _WORDEXP_H_ +#define _WORDEXP_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct _wordexp_t +{ + size_t we_wordc; /* Count of words matched by words. */ + char **we_wordv; /* Pointer to list of expanded words. */ + size_t we_offs; /* Slots to reserve at the beginning of we_wordv. */ +}; + +typedef struct _wordexp_t wordexp_t; + +#define WRDE_DOOFFS 0x0001 /* Use we_offs. */ +#define WRDE_APPEND 0x0002 /* Append to output from previous call. */ +#define WRDE_NOCMD 0x0004 /* Don't perform command substitution. */ +#define WRDE_REUSE 0x0008 /* pwordexp points to a wordexp_t struct returned from + a previous successful call to wordexp. */ +#define WRDE_SHOWERR 0x0010 /* Print error messages to stderr. */ +#define WRDE_UNDEF 0x0020 /* Report attempt to expand undefined shell variable. */ + +enum { + WRDE_SUCCESS, + WRDE_NOSPACE, + WRDE_BADCHAR, + WRDE_BADVAL, + WRDE_CMDSUB, + WRDE_SYNTAX, + WRDE_NOSYS +}; + +/* Note: This implementation of wordexp requires a version of bash + that supports the --wordexp and --protected arguments to be present + on the system. It does not support the WRDE_UNDEF flag. */ +int wordexp(const char *__restrict, wordexp_t *__restrict, int); +void wordfree(wordexp_t *); + +#ifdef __cplusplus +} +#endif + +#endif /* _WORDEXP_H_ */ diff --git a/lib/libc.in.xml b/lib/libc.in.xml new file mode 100644 index 0000000..7bdbb22 --- /dev/null +++ b/lib/libc.in.xml @@ -0,0 +1,45 @@ + + + + + newlib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/libc.texi b/lib/libc.texi new file mode 100644 index 0000000..acb6afb --- /dev/null +++ b/lib/libc.texi @@ -0,0 +1,431 @@ +\input texinfo.tex +@setfilename libc.info + +@ifinfo +@format +@dircategory Newlib +@direntry +* libc: (libc). The ANSI C library. +@end direntry +@end format +@end ifinfo + +@ifinfo +This file documents the ANSI C library. + +Copyright (C) 1992, 1993, 1994-2014 Red Hat, Inc. + +@file{libc} includes software developed by the +University of California, Berkeley and its contributors. + +libc includes software developed by Martin Jackson, Graham Haley +and Steve Chamberlain of Tadpole Technology and released to Cygnus. + +libc uses floating-point conversion software developed at AT&T, which +includes this copyright information: + + The author of this software is David M. Gay. + + Copyright (c) 1991 by AT&T. + + Permission to use, copy, modify, and distribute this software for any + purpose without fee is hereby granted, provided that this entire notice + is included in all copies of any software which is or includes a copy + or modification of this software and in all copies of the supporting + documentation for such software. + + THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY + REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +@ignore +Permission is granted to process this file through Tex and print the +results, provided the printed document carries copying permission +notice identical to this one except for the removal of this paragraph +(this paragraph not being relevant to the printed manual). + +@end ignore +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, subject to the terms +of the GNU General Public License, which includes the provision that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end ifinfo +@iftex +@c @smallbook +@c @cropmarks +@finalout +@setchapternewpage odd +@settitle Red Hat newlib C Library, Full +@titlepage +@title The Red Hat newlib C Library +@subtitle Full Configuration +@sp 1 +@subtitle @code{libc} 4.3.0 +@subtitle January 2023 +@author {Steve Chamberlain} +@author {Roland Pesch} +@author {Red Hat Support} +@author {Jeff Johnston} +@page + +@tex +{\parskip=0pt +sac@@cygnus.com, pesch@@cygnus.com, jjohnstn@@redhat.com\hfill {\it The Red Hat newlib C Library}\par +Copyright \copyright{} 1992, 1993, 1994-2004 Red Hat Inc. +} +\global\parindent=0pt % Steve likes it this way +@end tex + +@file{libc} includes software developed by the +University of California, Berkeley and its contributors. + +@file{libc} includes software developed by Martin Jackson, Graham Haley +and Steve Chamberlain of Tadpole Technology and released to Cygnus. + +@file{libc} uses floating-point conversion software developed at AT&T, +which includes this copyright information: + +@cartouche +@quotation +The author of this software is David M. Gay. + +Copyright (c) 1991 by AT&T. + +Permission to use, copy, modify, and distribute this software for any +purpose without fee is hereby granted, provided that this entire notice +is included in all copies of any software which is or includes a copy +or modification of this software and in all copies of the supporting +documentation for such software. + +THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED +WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY +REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY +OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. +@end quotation +@end cartouche + +Permission is granted to make and distribute verbatim copies of +this manual provided the copyright notice and this permission notice +are preserved on all copies. + +Permission is granted to copy and distribute modified versions of this +manual under the conditions for verbatim copying, subject to the terms +of the GNU General Public License, which includes the provision that the +entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this manual +into another language, under the above conditions for modified versions. +@end titlepage +@end iftex + +@ifnottex +@node Top +@top The Red Hat newlib C Library + +@menu +* Introduction:: +* Stdlib:: +* Ctype:: +* Stdio:: +* Stdio64:: + +* Strings:: +* Wchar strings:: +* Signals:: + +* Timefns:: +* Locale:: +* Reentrancy:: + +* Misc:: +* Posix:: +* Syscalls:: +* Arglists:: +* Encoding conversions:: +* Overflow Protection:: + +* Document Index:: +@end menu +@end ifnottex + +@node Introduction +@chapter Introduction + +This reference manual describes the functions provided by the Red Hat +``newlib'' version of the standard ANSI C library. This document is not +intended as an overview or a tutorial for the C library. Each library +function is listed with a synopsis of its use, a brief description, +return values (including error handling), and portability issues. + +Some of the library functions depend on support from the underlying +operating system and may not be available on every platform. For +embedded systems in particular, many of these underlying operating +system services may not be available or may not be fully functional. +The specific operating system subroutines required for a particular +library function are listed in the ``Portability'' section of the +function description. @xref{Syscalls}, for a description of the +relevant operating system calls. + +@include targetdep.tex + +@node Arglists +@chapter Variable Argument Lists + +The @code{printf} family of functions is defined to accept a variable +number of arguments, rather than a fixed argument list. You can define +your own functions with a variable argument list, by using macro +definitions from either @file{stdarg.h} (for compatibility with ANSI C) +or from @file{varargs.h} (for compatibility with a popular convention +prior to ANSI C). + +@menu +* Stdarg:: +* Varargs:: +@end menu + +@node Stdarg +@section ANSI-standard macros, @file{stdarg.h} + +In ANSI C, a function has a variable number of arguments when its +parameter list ends in an ellipsis (@code{...}). The parameter list +must also include at least one explicitly named argument; that argument +is used to initialize the variable list data structure. + +ANSI C defines three macros (@code{va_start}, @code{va_arg}, and +@code{va_end}) to operate on variable argument lists. @file{stdarg.h} +also defines a special type to represent variable argument lists: this +type is called @code{va_list}. + +@menu +* va_start:: +* va_arg:: +* va_end:: +@end menu + +@page +@node va_start +@subsection Initialize variable argument list +@findex va_start +@strong{Synopsis} +@example +#include +void va_start(va_list @var{ap}, @var{rightmost}); +@end example + +@strong{Description}@* +Use @code{va_start} to initialize the variable argument list @var{ap}, +so that @code{va_arg} can extract values from it. @var{rightmost} is +the name of the last explicit argument in the parameter list (the +argument immediately preceding the ellipsis @samp{...} that flags +variable arguments in an ANSI C function header). You can only use +@code{va_start} in a function declared using this ellipsis notation +(not, for example, in one of its subfunctions). + +@strong{Returns}@* +@code{va_start} does not return a result. + +@strong{Portability}@* +ANSI C requires @code{va_start}. + +@page +@node va_arg +@subsection Extract a value from argument list +@findex va_arg +@strong{Synopsis} +@example +#include +@var{type} va_arg(va_list @var{ap}, @var{type}); +@end example + +@strong{Description}@* +@code{va_arg} returns the next unprocessed value from a variable +argument list @var{ap} (which you must previously create with +@var{va_start}). Specify the type for the value as the second parameter +to the macro, @var{type}. + +You may pass a @code{va_list} object @var{ap} to a subfunction, and use +@code{va_arg} from the subfunction rather than from the function +actually declared with an ellipsis in the header; however, in that case +you may @emph{only} use @code{va_arg} from the subfunction. ANSI C does +not permit extracting successive values from a single variable-argument +list from different levels of the calling stack. + +There is no mechanism for testing whether there is actually a next +argument available; you might instead pass an argument count (or some +other data that implies an argument count) as one of the fixed arguments +in your function call. + +@strong{Returns}@* +@code{va_arg} returns the next argument, an object of type @var{type}. + +@strong{Portability}@* +ANSI C requires @code{va_arg}. + +@page +@node va_end +@subsection Abandon a variable argument list +@findex va_end +@strong{Synopsis} +@example +#include +void va_end(va_list @var{ap}); +@end example + +@strong{Description}@* +Use @code{va_end} to declare that your program will not use the variable +argument list @var{ap} any further. + +@strong{Returns}@* +@code{va_end} does not return a result. + +@strong{Portability}@* +ANSI C requires @code{va_end}. + +@node Varargs +@section Traditional macros, @file{varargs.h} + +If your C compiler predates ANSI C, you may still be able to use +variable argument lists using the macros from the @file{varargs.h} +header file. These macros resemble their ANSI counterparts, but have +important differences in usage. In particular, since traditional C has +no declaration mechanism for variable argument lists, two additional +macros are provided simply for the purpose of defining functions with +variable argument lists. + +As with @file{stdarg.h}, the type @code{va_list} is used to hold a data +structure representing a variable argument list. + +@menu +* va_alist:: +* va_start-trad:: +* va_arg-trad:: +* va_end-trad:: +@end menu + +@page +@node va_alist +@subsection Declare variable arguments +@findex va_alist +@findex va_dcl +@strong{Synopsis} +@example +#include +@var{function}(va_alist) +va_dcl +@end example + +@strong{Description}@* +To use the @file{varargs.h} version of variable argument lists, you must +declare your function with a call to the macro @code{va_alist} as its +argument list, and use @code{va_dcl} as the declaration. @emph{Do not +use a semicolon after @code{va_dcl}.} + +@strong{Returns}@* +These macros cannot be used in a context where a return is syntactically +possible. + +@strong{Portability}@* +@var{va_alist} and @var{va_dcl} were the most widespread method of +declaring variable argument lists prior to ANSI C. + +@page +@node va_start-trad +@subsection Initialize variable argument list +@findex va_start +@strong{Synopsis} +@example +#include +va_list @var{ap}; +va_start(@var{ap}); +@end example + +@strong{Description}@* +With the @file{varargs.h} macros, use @code{va_start} to initialize a +data structure @var{ap} to permit manipulating a variable argument list. +@var{ap} must have the type @var{va_alist}. + +@strong{Returns}@* +@code{va_start} does not return a result. + +@strong{Portability}@* +@code{va_start} is also defined as a macro in ANSI C, but the +definitions are incompatible; the ANSI version has another parameter +besides @var{ap}. + +@page +@node va_arg-trad +@subsection Extract a value from argument list +@findex va_arg +@strong{Synopsis} +@example +#include +@var{type} va_arg(va_list @var{ap}, @var{type}); +@end example + +@strong{Description}@* +@code{va_arg} returns the next unprocessed value from a variable +argument list @var{ap} (which you must previously create with +@var{va_start}). Specify the type for the value as the second parameter +to the macro, @var{type}. + +@strong{Returns}@* +@code{va_arg} returns the next argument, an object of type @var{type}. + +@strong{Portability}@* +The @code{va_arg} defined in @file{varargs.h} has the same syntax and +usage as the ANSI C version from @file{stdarg.h}. + +@page +@node va_end-trad +@subsection Abandon a variable argument list +@findex va_end +@strong{Synopsis} +@example +#include +va_end(va_list @var{ap}); +@end example + +@strong{Description}@* +Use @code{va_end} to declare that your program will not use the variable +argument list @var{ap} any further. + +@strong{Returns}@* +@code{va_end} does not return a result. + +@strong{Portability}@* +The @code{va_end} defined in @file{varargs.h} has the same syntax and +usage as the ANSI C version from @file{stdarg.h}. + +@node Document Index +@unnumbered Document Index +@printindex cp + +@tex +% I think something like @@colophon should be in texinfo. In the +% meantime: +\long\def\colophon{\hbox to0pt{}\vfill +\centerline{The body of this manual is set in} +\centerline{\fontname\tenrm,} +\centerline{with headings in {\bf\fontname\tenbf}} +\centerline{and examples in {\tt\fontname\tentt}.} +\centerline{{\it\fontname\tenit\/} and} +\centerline{{\sl\fontname\tensl\/}} +\centerline{are used for emphasis.}\vfill} +\page\colophon +% Blame: pesch@@cygnus.com, 28mar91. +@end tex + +@contents +@bye + + diff --git a/lib/locale/Makefile.inc b/lib/locale/Makefile.inc new file mode 100644 index 0000000..cef4131 --- /dev/null +++ b/lib/locale/Makefile.inc @@ -0,0 +1,28 @@ +libc_a_SOURCES += \ + %D%/setlocale.h \ + %D%/locale.c \ + %D%/localeconv.c + +## The following interfaces are EL/IX level 2 +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/duplocale.c \ + %D%/freelocale.c \ + %D%/lctype.c \ + %D%/lmessages.c \ + %D%/lnumeric.c \ + %D%/lmonetary.c \ + %D%/newlocale.c \ + %D%/nl_langinfo.c \ + %D%/timelocal.c \ + %D%/uselocale.c +endif + +LIBC_CHEWOUT_FILES += \ + %D%/duplocale.def \ + %D%/freelocale.def \ + %D%/locale.def \ + %D%/newlocale.def \ + %D%/uselocale.def + +LIBC_CHAPTERS += %D%/locale.tex diff --git a/lib/locale/duplocale.c b/lib/locale/duplocale.c new file mode 100644 index 0000000..d3e7d78 --- /dev/null +++ b/lib/locale/duplocale.c @@ -0,0 +1,102 @@ +/* +FUNCTION + <>---duplicate a locale object + +INDEX + duplocale + +INDEX + _duplocale_r + +SYNOPSIS + #include + locale_t duplocale(locale_t <[locobj]>); + + locale_t _duplocale_r(void *<[reent]>, locale_t <[locobj]>); + +DESCRIPTION +The <> function shall create a duplicate copy of the locale +object referenced by the <[locobj]> argument. + +If the <[locobj]> argument is LC_GLOBAL_LOCALE, duplocale() shall create +a new locale object containing a copy of the global locale determined by +the setlocale() function. + +The behavior is undefined if the <[locobj]> argument is not a valid locale +object handle. + +RETURNS +Upon successful completion, the <> function shall return a +handle for a new locale object. Otherwise <> shall return +(locale_t) <<0>> and set errno to indicate the error. + +PORTABILITY +<> is POSIX-1.2008. +*/ + +#include +#include +#include +#include "setlocale.h" + +struct __locale_t * +_duplocale_r (struct _reent *p, struct __locale_t *locobj) +{ + struct __locale_t tmp_locale, *new_locale; + int i; + +#ifndef _MB_CAPABLE + return __get_C_locale (); +#else /* _MB_CAPABLE */ + /* LC_GLOBAL_LOCALE denotes the global locale. */ + if (locobj == LC_GLOBAL_LOCALE) + locobj = __get_global_locale (); + /* The "C" locale is used statically, never copied. */ + else if (locobj == __get_C_locale ()) + return __get_C_locale (); + /* Copy locale content. */ + tmp_locale = *locobj; +#ifdef __HAVE_LOCALE_INFO__ + for (i = 1; i < _LC_LAST; ++i) + if (locobj->lc_cat[i].buf) + { + /* If the object is not a "C" locale category, copy it. Just call + __loadlocale. It knows what to do to replicate the category. */ + tmp_locale.lc_cat[i].ptr = NULL; + tmp_locale.lc_cat[i].buf = NULL; + tmp_locale.categories[i][0] = '\0'; /* __loadlocale tests this! */ + if (!__loadlocale (&tmp_locale, i, locobj->categories[i])) + goto error; + } +#endif /* __HAVE_LOCALE_INFO__ */ + /* Allocate new locale_t. */ + new_locale = (struct __locale_t *) _calloc_r (p, 1, sizeof *new_locale); + if (!new_locale) + goto error; + + *new_locale = tmp_locale; + return new_locale; + +error: + /* An error occured while we had already (potentially) allocated memory. + Free memory and return NULL. errno is supposed to be set already. */ +#ifdef __HAVE_LOCALE_INFO__ + while (--i > 0) + if (tmp_locale.lc_cat[i].buf) + { + _free_r (p, (void *) tmp_locale.lc_cat[i].ptr); + _free_r (p, tmp_locale.lc_cat[i].buf); + } +#endif /* __HAVE_LOCALE_INFO__ */ + + return NULL; +#endif /* _MB_CAPABLE */ +} + +#ifndef _REENT_ONLY +struct __locale_t * +duplocale (struct __locale_t *locobj) +{ + return _duplocale_r (_REENT, locobj); +} +#endif diff --git a/lib/locale/freelocale.c b/lib/locale/freelocale.c new file mode 100644 index 0000000..f5d55f5 --- /dev/null +++ b/lib/locale/freelocale.c @@ -0,0 +1,64 @@ +/* +FUNCTION + <>---free resources allocated for a locale object + +INDEX + freelocale + +INDEX + _freelocale_r + +SYNOPSIS + #include + locale_t freelocale(locale_t <[locobj]>); + + locale_t _freelocale_r(void *<[reent]>, locale_t <[locobj]>); + +DESCRIPTION +The <> function shall cause the resources allocated for a +locale object returned by a call to the <> or <> +functions to be released. + +The behavior is undefined if the <[locobj]> argument is the special locale +object LC_GLOBAL_LOCALE or is not a valid locale object handle. + +Any use of a locale object that has been freed results in undefined +behavior. + +RETURNS +None. + +PORTABILITY +<> is POSIX-1.2008. +*/ + +#include +#include +#include +#include "setlocale.h" + +void +_freelocale_r (struct _reent *p, struct __locale_t *locobj) +{ + /* Nothing to do on !_MB_CAPABLE targets. */ +#ifdef _MB_CAPABLE + /* Sanity check. The "C" locale is static, don't try to free it. */ + if (!locobj || locobj == __get_C_locale () || locobj == LC_GLOBAL_LOCALE) + return; +#ifdef __HAVE_LOCALE_INFO__ + for (int i = 1; i < _LC_LAST; ++i) + if (locobj->lc_cat[i].buf) + { + _free_r (p, (void *) locobj->lc_cat[i].ptr); + _free_r (p, locobj->lc_cat[i].buf); + } +#endif /* __HAVE_LOCALE_INFO__ */ + _free_r (p, locobj); +#endif /* _MB_CAPABLE */ +} + +void +freelocale (struct __locale_t *locobj) +{ + _freelocale_r (_REENT, locobj); +} diff --git a/lib/locale/lctype.c b/lib/locale/lctype.c new file mode 100644 index 0000000..a07ab68 --- /dev/null +++ b/lib/locale/lctype.c @@ -0,0 +1,103 @@ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "setlocale.h" + +#define LCCTYPE_SIZE (sizeof(struct lc_ctype_T) / sizeof(char *)) + +static char numone[] = { '\1', '\0'}; + +const struct lc_ctype_T _C_ctype_locale = { + "ASCII", /* codeset */ + numone /* mb_cur_max */ +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + , + { "0", "1", "2", "3", "4", /* outdigits */ + "5", "6", "7", "8", "9" }, + { L"0", L"1", L"2", L"3", L"4", /* woutdigits */ + L"5", L"6", L"7", L"8", L"9" } +#endif +}; + +#ifdef __CYGWIN__ +static char numsix[] = { '\6', '\0'}; + +const struct lc_ctype_T _C_utf8_ctype_locale = { + "UTF-8", /* codeset */ + numsix /* mb_cur_max */ +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + , + { "0", "1", "2", "3", "4", /* outdigits */ + "5", "6", "7", "8", "9" }, + { L"0", L"1", L"2", L"3", L"4", /* woutdigits */ + L"5", L"6", L"7", L"8", L"9" } +#endif +}; +#endif + +/* NULL locale indicates global locale (called from setlocale) */ +int +__ctype_load_locale (struct __locale_t *locale, const char *name, + void *f_wctomb, const char *charset, int mb_cur_max) +{ + int ret; + struct lc_ctype_T ct; + char *bufp = NULL; + +#ifdef __CYGWIN__ + extern int __set_lc_ctype_from_win (const char *, const struct lc_ctype_T *, + struct lc_ctype_T *, char **, void *, + const char *, int); + ret = __set_lc_ctype_from_win (name, &_C_ctype_locale, &ct, &bufp, + f_wctomb, charset, mb_cur_max); + /* ret == -1: error, ret == 0: C/POSIX, ret > 0: valid */ + if (ret >= 0) + { + struct lc_ctype_T *ctp = NULL; + + if (ret > 0) + { + ctp = (struct lc_ctype_T *) calloc (1, sizeof *ctp); + if (!ctp) + { + free (bufp); + return -1; + } + *ctp = ct; + } + struct __lc_cats tmp = locale->lc_cat[LC_CTYPE]; + locale->lc_cat[LC_CTYPE].ptr = ret == 0 ? &_C_ctype_locale : ctp; + locale->lc_cat[LC_CTYPE].buf = bufp; + /* If buf is not NULL, both pointers have been alloc'ed */ + if (tmp.buf) + { + free ((void *) tmp.ptr); + free (tmp.buf); + } + ret = 0; + } +#else + /* TODO */ +#endif + return ret; +} diff --git a/lib/locale/lmessages.c b/lib/locale/lmessages.c new file mode 100644 index 0000000..7a5bb56 --- /dev/null +++ b/lib/locale/lmessages.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#include "setlocale.h" + +#define LCMESSAGES_SIZE_FULL (sizeof(struct lc_messages_T) / sizeof(char *)) +#define LCMESSAGES_SIZE_MIN \ + (offsetof(struct lc_messages_T, yesstr) / sizeof(char *)) + +#ifndef __CYGWIN__ +static char empty[] = ""; +#endif + +const struct lc_messages_T _C_messages_locale = { + "^[yY]" , /* yesexpr */ + "^[nN]" , /* noexpr */ + "yes" , /* yesstr */ + "no" /* nostr */ +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + , "ASCII" , /* codeset */ + L"^[yY]" , /* wyesexpr */ + L"^[nN]" , /* wnoexpr */ + L"yes" , /* wyesstr */ + L"no" /* wnostr */ +#endif +}; + +#ifndef __CYGWIN__ +static struct lc_messages_T _messages_locale; +static int _messages_using_locale; +static char *_messages_locale_buf; +#endif + +int +__messages_load_locale (struct __locale_t *locale, const char *name, + void *f_wctomb, const char *charset) +{ + int ret; + struct lc_messages_T me; + char *bufp = NULL; + +#ifdef __CYGWIN__ + extern int __set_lc_messages_from_win (const char *, + const struct lc_messages_T *, + struct lc_messages_T *, char **, + void *, const char *); + + ret = __set_lc_messages_from_win (name, &_C_messages_locale, &me, &bufp, + f_wctomb, charset); + /* ret == -1: error, ret == 0: C/POSIX, ret > 0: valid */ + if (ret >= 0) + { + struct lc_messages_T *mep = NULL; + + if (ret > 0) + { + mep = (struct lc_messages_T *) calloc (1, sizeof *mep); + if (!mep) + { + free (bufp); + return -1; + } + *mep = me; + } + struct __lc_cats tmp = locale->lc_cat[LC_MESSAGES]; + locale->lc_cat[LC_MESSAGES].ptr = ret == 0 ? &_C_messages_locale : mep; + locale->lc_cat[LC_MESSAGES].buf = bufp; + /* If buf is not NULL, both pointers have been alloc'ed */ + if (tmp.buf) + { + free ((void *) tmp.ptr); + free (tmp.buf); + } + ret = 0; + } +#else + /* TODO */ +#endif + return ret; +} diff --git a/lib/locale/lmonetary.c b/lib/locale/lmonetary.c new file mode 100644 index 0000000..995263b --- /dev/null +++ b/lib/locale/lmonetary.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2000, 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#include +#include "setlocale.h" + +#define LCMONETARY_SIZE (sizeof(struct lc_monetary_T) / sizeof(char *)) + +static char empty[] = ""; +static char numempty[] = { CHAR_MAX, '\0'}; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ +static wchar_t wempty[] = L""; +#endif + +const struct lc_monetary_T _C_monetary_locale = { + empty, /* int_curr_symbol */ + empty, /* currency_symbol */ + empty, /* mon_decimal_point */ + empty, /* mon_thousands_sep */ + numempty, /* mon_grouping */ + empty, /* positive_sign */ + empty, /* negative_sign */ + numempty, /* int_frac_digits */ + numempty, /* frac_digits */ + numempty, /* p_cs_precedes */ + numempty, /* p_sep_by_space */ + numempty, /* n_cs_precedes */ + numempty, /* n_sep_by_space */ + numempty, /* p_sign_posn */ + numempty /* n_sign_posn */ +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + , numempty, /* int_p_cs_precedes */ + numempty, /* int_p_sep_by_space */ + numempty, /* int_n_cs_precedes */ + numempty, /* int_n_sep_by_space */ + numempty, /* int_p_sign_posn */ + numempty, /* int_n_sign_posn */ + "ASCII", /* codeset */ + wempty, /* wint_curr_symbol */ + wempty, /* wcurrency_symbol */ + wempty, /* wmon_decimal_point */ + wempty, /* wmon_thousands_sep */ + wempty, /* wpositive_sign */ + wempty /* wnegative_sign */ +#endif +}; + +#ifndef __CYGWIN__ +static struct lc_monetary_T _monetary_locale; +static int _monetary_using_locale; +static char *_monetary_locale_buf; + +static char +cnv(const char *str) { + int i = strtol(str, NULL, 10); + if (i == -1) + i = CHAR_MAX; + return (char)i; +} +#endif + +int +__monetary_load_locale (struct __locale_t *locale, const char *name , + void *f_wctomb, const char *charset) +{ + int ret; + struct lc_monetary_T mo; + char *bufp = NULL; + +#ifdef __CYGWIN__ + extern int __set_lc_monetary_from_win (const char *, + const struct lc_monetary_T *, + struct lc_monetary_T *, char **, + void *, const char *); + ret = __set_lc_monetary_from_win (name, &_C_monetary_locale, &mo, &bufp, + f_wctomb, charset); + /* ret == -1: error, ret == 0: C/POSIX, ret > 0: valid */ + if (ret >= 0) + { + struct lc_monetary_T *mop = NULL; + + if (ret > 0) + { + mop = (struct lc_monetary_T *) calloc (1, sizeof *mop); + if (!mop) + { + free (bufp); + return -1; + } + *mop = mo; + } + struct __lc_cats tmp = locale->lc_cat[LC_MONETARY]; + locale->lc_cat[LC_MONETARY].ptr = ret == 0 ? &_C_monetary_locale : mop; + locale->lc_cat[LC_MONETARY].buf = bufp; + /* If buf is not NULL, both pointers have been alloc'ed */ + if (tmp.buf) + { + free ((void *) tmp.ptr); + free (tmp.buf); + } + ret = 0; + } +#else + /* TODO */ +#endif + return ret; +} diff --git a/lib/locale/lnumeric.c b/lib/locale/lnumeric.c new file mode 100644 index 0000000..b4ddbda --- /dev/null +++ b/lib/locale/lnumeric.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2000, 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "setlocale.h" + +#define LCNUMERIC_SIZE (sizeof(struct lc_numeric_T) / sizeof(char *)) + +static char numempty[] = { CHAR_MAX, '\0' }; + +const struct lc_numeric_T _C_numeric_locale = { + ".", /* decimal_point */ + "", /* thousands_sep */ + numempty /* grouping */ +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + , "ASCII", /* codeset */ + L".", /* wdecimal_point */ + L"", /* wthousands_sep */ +#endif +}; + +int +__numeric_load_locale (struct __locale_t *locale, const char *name , + void *f_wctomb, const char *charset) +{ + int ret; + struct lc_numeric_T nm; + char *bufp = NULL; + +#ifdef __CYGWIN__ + extern int __set_lc_numeric_from_win (const char *, + const struct lc_numeric_T *, + struct lc_numeric_T *, char **, + void *, const char *); + ret = __set_lc_numeric_from_win (name, &_C_numeric_locale, &nm, &bufp, + f_wctomb, charset); + /* ret == -1: error, ret == 0: C/POSIX, ret > 0: valid */ + if (ret >= 0) + { + struct lc_numeric_T *nmp = NULL; + + if (ret > 0) + { + nmp = (struct lc_numeric_T *) calloc (1, sizeof *nmp); + if (!nmp) + { + free (bufp); + return -1; + } + *nmp = nm; + } + struct __lc_cats tmp = locale->lc_cat[LC_NUMERIC]; + locale->lc_cat[LC_NUMERIC].ptr = ret == 0 ? &_C_numeric_locale : nmp; + locale->lc_cat[LC_NUMERIC].buf = bufp; + /* If buf is not NULL, both pointers have been alloc'ed */ + if (tmp.buf) + { + free ((void *) tmp.ptr); + free (tmp.buf); + } + ret = 0; + } +#else + /* TODO */ +#endif + return ret; +} diff --git a/lib/locale/locale.c b/lib/locale/locale.c new file mode 100644 index 0000000..3772106 --- /dev/null +++ b/lib/locale/locale.c @@ -0,0 +1,1031 @@ +/* +FUNCTION +<>, <>---select or query locale + +INDEX + setlocale +INDEX + localeconv +INDEX + _setlocale_r +INDEX + _localeconv_r + +SYNOPSIS + #include + char *setlocale(int <[category]>, const char *<[locale]>); + lconv *localeconv(void); + + char *_setlocale_r(void *<[reent]>, + int <[category]>, const char *<[locale]>); + lconv *_localeconv_r(void *<[reent]>); + +DESCRIPTION +<> is the facility defined by ANSI C to condition the +execution environment for international collating and formatting +information; <> reports on the settings of the current +locale. + +This is a minimal implementation, supporting only the required <<"POSIX">> +and <<"C">> values for <[locale]>; strings representing other locales are not +honored unless _MB_CAPABLE is defined. + +If _MB_CAPABLE is defined, POSIX locale strings are allowed, following +the form + + language[_TERRITORY][.charset][@@modifier] + +<<"language">> is a two character string per ISO 639, or, if not available +for a given language, a three character string per ISO 639-3. +<<"TERRITORY">> is a country code per ISO 3166. For <<"charset">> and +<<"modifier">> see below. + +Additionally to the POSIX specifier, the following extension is supported +for backward compatibility with older implementations using newlib: +<<"C-charset">>. +Instead of <<"C-">>, you can also specify <<"C.">>. Both variations allow +to specify language neutral locales while using other charsets than ASCII, +for instance <<"C.UTF-8">>, which keeps all settings as in the C locale, +but uses the UTF-8 charset. + +The following charsets are recognized: +<<"UTF-8">>, <<"JIS">>, <<"EUCJP">>, <<"SJIS">>, <<"KOI8-R">>, <<"KOI8-U">>, +<<"KOI8-T">>, <<"GEORGIAN-PS">>, <<"PT154">>, <<"TIS-620">>, <<"ISO-8859-x">> +with 1 <= x <= 16, or <<"CPxxx">> with xxx in [437, 720, 737, 775, 850, 852, +855, 857, 858, 862, 866, 874, 932, 1125, 1250, 1251, 1252, 1253, 1254, 1255, +1256, 1257, 1258]. + +Charsets are case insensitive. For instance, <<"EUCJP">> and <<"eucJP">> +are equivalent. Charset names with dashes can also be written without +dashes, as in <<"UTF8">>, <<"iso88591">> or <<"koi8r">>. <<"EUCJP">> and +<<"EUCKR">> are also recognized with dash, <<"EUC-JP">> and <<"EUC-KR">>. + +Full support for all of the above charsets requires that newlib has been +build with multibyte support and support for all ISO and Windows Codepage. +Otherwise all singlebyte charsets are simply mapped to ASCII. Right now, +only newlib for Cygwin is built with full charset support by default. +Under Cygwin, this implementation additionally supports the charsets +<<"GB18030">>, <<"GBK">>, <<"GB2312">>, <<"eucCN">>, <<"eucKR">>, and +<<"Big5">>. Cygwin does not support <<"JIS">>. + +Cygwin additionally supports locales from the file +/usr/share/locale/locale.alias. + +(<<"">> is also accepted; if given, the settings are read from the +corresponding LC_* environment variables and $LANG according to POSIX rules.) + +This implementation also supports the modifiers <<"cjknarrow">> and +<<"cjkwide">>, which affect how the functions <> and <> +handle characters from the "CJK Ambiguous Width" category of characters +described at http://www.unicode.org/reports/tr11/#Ambiguous. +These characters have a width of 1 for singlebyte charsets and UTF-8, +and a width of 2 for multibyte charsets other than UTF-8. Specifying +<<"cjknarrow">> or <<"cjkwide">> forces a width of 1 or 2, respectively. + +This implementation also supports the modifier <<"cjksingle">> +to enforce single-width character properties. + +If you use <> as the <[locale]> argument, <> returns a +pointer to the string representing the current locale. The acceptable +values for <[category]> are defined in `<>' as macros +beginning with <<"LC_">>. + +<> returns a pointer to a structure (also defined in +`<>') describing the locale-specific conventions currently +in effect. + +<<_localeconv_r>> and <<_setlocale_r>> are reentrant versions of +<> and <> respectively. The extra argument +<[reent]> is a pointer to a reentrancy structure. + +RETURNS +A successful call to <> returns a pointer to a string +associated with the specified category for the new locale. The string +returned by <> is such that a subsequent call using that +string will restore that category (or all categories in case of LC_ALL), +to that state. The application shall not modify the string returned +which may be overwritten by a subsequent call to <>. +On error, <> returns <>. + +<> returns a pointer to a structure of type <>, +which describes the formatting and collating conventions in effect (in +this implementation, always those of the C locale). + +PORTABILITY +ANSI C requires <>, but the only locale required across all +implementations is the C locale. + +NOTES +There is no ISO-8859-12 codepage. It's also refused by this implementation. + +No supporting OS subroutines are required. +*/ + +/* Parts of this code are originally taken from FreeBSD. */ +/* + * Copyright (c) 1996 - 2002 FreeBSD Project + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Borman at Krystal Technologies. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "setlocale.h" +#include "../ctype/ctype_.h" +#include "../stdlib/local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local struct __locale_t *_tls_locale; +#endif + +#ifdef __CYGWIN__ /* Has to be kept available as exported symbol for + backward compatibility. Set it in setlocale, but + otherwise ignore it. Applications compiled after + 2010 don't use it anymore. */ +int __EXPORT __mb_cur_max = 6; +#endif + +char *_PathLocale = NULL; + +#ifdef _MB_CAPABLE +/* + * Category names for getenv() + */ +static char *categories[_LC_LAST] = { + "LC_ALL", + "LC_COLLATE", + "LC_CTYPE", + "LC_MONETARY", + "LC_NUMERIC", + "LC_TIME", + "LC_MESSAGES", +}; +#endif /* _MB_CAPABLE */ + +/* + * Default locale per POSIX. Can be overridden on a per-target base. + */ +#ifndef DEFAULT_LOCALE +#define DEFAULT_LOCALE "C" +#endif + +#ifdef _MB_CAPABLE +/* + * This variable can be changed by any outside mechanism. This allows, + * for instance, to load the default locale from a file. + */ +char __default_locale[ENCODING_LEN + 1] = DEFAULT_LOCALE; + +const struct __locale_t __C_locale = +{ + { "C", "C", "C", "C", "C", "C", "C", }, + __ascii_wctomb, + __ascii_mbtowc, + 0, + DEFAULT_CTYPE_PTR, + { + ".", "", "", "", "", "", "", "", "", "", + CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX, + CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX, + CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX, + CHAR_MAX, CHAR_MAX + }, +#ifndef __HAVE_LOCALE_INFO__ + "\1", + "ASCII", + "ASCII", +#else /* __HAVE_LOCALE_INFO__ */ + { + { NULL, NULL }, /* LC_ALL */ +#ifdef __CYGWIN__ + { &_C_collate_locale, NULL }, /* LC_COLLATE */ +#else + { NULL, NULL }, /* LC_COLLATE */ +#endif + { &_C_ctype_locale, NULL }, /* LC_CTYPE */ + { &_C_monetary_locale, NULL }, /* LC_MONETARY */ + { &_C_numeric_locale, NULL }, /* LC_NUMERIC */ + { &_C_time_locale, NULL }, /* LC_TIME */ + { &_C_messages_locale, NULL }, /* LC_MESSAGES */ + }, +#endif /* __HAVE_LOCALE_INFO__ */ +}; +#endif /* _MB_CAPABLE */ + +struct __locale_t __global_locale = +{ + { "C", "C", DEFAULT_LOCALE, "C", "C", "C", "C", }, +#ifdef __CYGWIN__ + __utf8_wctomb, + __utf8_mbtowc, +#else + __ascii_wctomb, + __ascii_mbtowc, +#endif + 0, + DEFAULT_CTYPE_PTR, + { + ".", "", "", "", "", "", "", "", "", "", + CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX, + CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX, + CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX, + CHAR_MAX, CHAR_MAX + }, +#ifndef __HAVE_LOCALE_INFO__ + "\1", + "ASCII", + "ASCII", +#else /* __HAVE_LOCALE_INFO__ */ + { + { NULL, NULL }, /* LC_ALL */ +#ifdef __CYGWIN__ + { &_C_collate_locale, NULL }, /* LC_COLLATE */ + { &_C_utf8_ctype_locale, NULL }, /* LC_CTYPE */ +#else + { NULL, NULL }, /* LC_COLLATE */ + { &_C_ctype_locale, NULL }, /* LC_CTYPE */ +#endif + { &_C_monetary_locale, NULL }, /* LC_MONETARY */ + { &_C_numeric_locale, NULL }, /* LC_NUMERIC */ + { &_C_time_locale, NULL }, /* LC_TIME */ + { &_C_messages_locale, NULL }, /* LC_MESSAGES */ + }, +#endif /* __HAVE_LOCALE_INFO__ */ +}; + +#ifdef _MB_CAPABLE +/* Renamed from current_locale_string to make clear this is only the + *global* string for setlocale (LC_ALL, NULL). There's no equivalent + functionality for uselocale. */ +static char global_locale_string[_LC_LAST * (ENCODING_LEN + 1/*"/"*/ + 1)] + = "C"; +static char *currentlocale (void); + +#endif /* _MB_CAPABLE */ + +char * +_setlocale_r (struct _reent *p, + int category, + const char *locale) +{ +#ifndef _MB_CAPABLE + if (locale) + { + if (strcmp (locale, "POSIX") && strcmp (locale, "C") + && strcmp (locale, "")) + return NULL; + } + return "C"; +#else /* _MB_CAPABLE */ + static char new_categories[_LC_LAST][ENCODING_LEN + 1]; + static char saved_categories[_LC_LAST][ENCODING_LEN + 1]; + int i, j, len, saverr; + const char *env, *r; + char *ret; + + if (category < LC_ALL || category >= _LC_LAST) + { + p->_errno = EINVAL; + return NULL; + } + + if (locale == NULL) + return category != LC_ALL ? __get_global_locale ()->categories[category] + : global_locale_string; + + /* + * Default to the current locale for everything. + */ + for (i = 1; i < _LC_LAST; ++i) + strcpy (new_categories[i], __get_global_locale ()->categories[i]); + + /* + * Now go fill up new_categories from the locale argument + */ + if (!*locale) + { + if (category == LC_ALL) + { + for (i = 1; i < _LC_LAST; ++i) + { + env = __get_locale_env (p, i); + if (strlen (env) > ENCODING_LEN) + { + p->_errno = EINVAL; + return NULL; + } + strcpy (new_categories[i], env); + } + } + else + { + env = __get_locale_env (p, category); + if (strlen (env) > ENCODING_LEN) + { + p->_errno = EINVAL; + return NULL; + } + strcpy (new_categories[category], env); + } + } + else if (category != LC_ALL) + { + if (strlen (locale) > ENCODING_LEN) + { + p->_errno = EINVAL; + return NULL; + } + strcpy (new_categories[category], locale); + } + else + { + if ((r = strchr (locale, '/')) == NULL) + { + if (strlen (locale) > ENCODING_LEN) + { + p->_errno = EINVAL; + return NULL; + } + for (i = 1; i < _LC_LAST; ++i) + strcpy (new_categories[i], locale); + } + else + { + for (i = 1; r[1] == '/'; ++r) + ; + if (!r[1]) + { + p->_errno = EINVAL; + return NULL; /* Hmm, just slashes... */ + } + do + { + if (i == _LC_LAST) + break; /* Too many slashes... */ + if ((len = r - locale) > ENCODING_LEN) + { + p->_errno = EINVAL; + return NULL; + } + strlcpy (new_categories[i], locale, len + 1); + i++; + while (*r == '/') + r++; + locale = r; + while (*r && *r != '/') + r++; + } + while (*locale); + while (i < _LC_LAST) + { + strcpy (new_categories[i], new_categories[i-1]); + i++; + } + } + } + + if (category != LC_ALL) + { + ret = __loadlocale (__get_global_locale (), category, + new_categories[category]); + currentlocale (); + return ret; + } + + for (i = 1; i < _LC_LAST; ++i) + { + strcpy (saved_categories[i], __get_global_locale ()->categories[i]); + if (__loadlocale (__get_global_locale (), i, new_categories[i]) == NULL) + { + saverr = p->_errno; + for (j = 1; j < i; j++) + { + strcpy (new_categories[j], saved_categories[j]); + if (__loadlocale (__get_global_locale (), j, new_categories[j]) + == NULL) + { + strcpy (new_categories[j], "C"); + __loadlocale (__get_global_locale (), j, new_categories[j]); + } + } + p->_errno = saverr; + return NULL; + } + } + return currentlocale (); +#endif /* _MB_CAPABLE */ +} + +#ifdef _MB_CAPABLE +static char * +currentlocale () +{ + int i; + + strcpy (global_locale_string, __get_global_locale ()->categories[1]); + + for (i = 2; i < _LC_LAST; ++i) + if (strcmp (__get_global_locale ()->categories[1], + __get_global_locale ()->categories[i])) + { + for (i = 2; i < _LC_LAST; ++i) + { + (void)strcat(global_locale_string, "/"); + (void)strcat(global_locale_string, + __get_global_locale ()->categories[i]); + } + break; + } + return global_locale_string; +} + +extern void __set_ctype (struct __locale_t *, const char *charset); + +char * +__loadlocale (struct __locale_t *loc, int category, char *new_locale) +{ + /* At this point a full-featured system would just load the locale + specific data from the locale files. + What we do here for now is to check the incoming string for correctness. + The string must be in one of the allowed locale strings, either + one in POSIX-style, or one in the old newlib style to maintain + backward compatibility. If the local string is correct, the charset + is extracted and stored in ctype_codeset or message_charset + dependent on the cateogry. */ + char *locale = NULL; + char charset[ENCODING_LEN + 1]; + long val = 0; + char *end, *c = NULL; + int mbc_max; + wctomb_p l_wctomb; + mbtowc_p l_mbtowc; + int cjksingle = 0; + int cjknarrow = 0; + int cjkwide = 0; + + /* Avoid doing everything twice if nothing has changed. + + duplocale relies on this test to go wrong so the locale is actually + duplicated when required. Any change here has to be synced with a + matching change in duplocale. */ + if (!strcmp (new_locale, loc->categories[category])) + return loc->categories[category]; + +#ifdef __CYGWIN__ + /* This additional code handles the case that the incoming locale string + is not valid. If so, it calls the function __set_locale_from_locale_alias, + which is only available on Cygwin right now. The function reads the + file /usr/share/locale/locale.alias. The file contains locale aliases + and their replacement locale. For instance, the alias "french" is + translated to "fr_FR.ISO-8859-1", the alias "thai" is translated to + "th_TH.TIS-620". If successful, the function returns with a pointer + to the second argument, which is a buffer in which the replacement locale + gets stored. Otherwise the function returns NULL. */ + char tmp_locale[ENCODING_LEN + 1]; + int ret = 0; + +restart: + if (!locale) + locale = new_locale; + else if (locale != tmp_locale) + { + locale = __set_locale_from_locale_alias (locale, tmp_locale); + if (!locale) + return NULL; + } +# define FAIL goto restart +#else + locale = new_locale; +# define FAIL return NULL +#endif + + /* "POSIX" is translated to "C", as on Linux. */ + if (!strcmp (locale, "POSIX")) + strcpy (locale, "C"); + if (!strcmp (locale, "C")) /* Default "C" locale */ + strcpy (charset, "ASCII"); + else if (locale[0] == 'C' + && (locale[1] == '-' /* Old newlib style */ + || locale[1] == '.')) /* Extension for the C locale to allow + specifying different charsets while + sticking to the C locale in terms + of sort order, etc. Proposed in + the Debian project. */ + { + char *chp; + + c = locale + 2; + strcpy (charset, c); + if ((chp = strchr (charset, '@'))) + /* Strip off modifier */ + *chp = '\0'; + c += strlen (charset); + } + else /* POSIX style */ + { + c = locale; + + /* Don't use ctype macros here, they might be localized. */ + /* Language */ + if (c[0] < 'a' || c[0] > 'z' + || c[1] < 'a' || c[1] > 'z') + FAIL; + c += 2; + /* Allow three character Language per ISO 639-3 */ + if (c[0] >= 'a' && c[0] <= 'z') + ++c; + if (c[0] == '_') + { + /* Territory */ + ++c; + if (c[0] < 'A' || c[0] > 'Z' + || c[1] < 'A' || c[1] > 'Z') + FAIL; + c += 2; + } + if (c[0] == '.') + { + /* Charset */ + char *chp; + + ++c; + strcpy (charset, c); + if ((chp = strchr (charset, '@'))) + /* Strip off modifier */ + *chp = '\0'; + c += strlen (charset); + } + else if (c[0] == '\0' || c[0] == '@') + /* End of string or just a modifier */ +#ifdef __CYGWIN__ + /* The Cygwin-only function __set_charset_from_locale checks + for the default charset which is connected to the given locale. + The function uses Windows functions in turn so it can't be easily + adapted to other targets. However, if any other target provides + equivalent functionality, preferrably using the same function name + it would be sufficient to change the guarding #ifdef. */ + __set_charset_from_locale (locale, charset); +#else + strcpy (charset, "ISO-8859-1"); +#endif + else + /* Invalid string */ + FAIL; + } + if (c && c[0] == '@') + { + /* Modifier "cjksingle" is recognized to enforce single-width mode. */ + /* Modifiers "cjknarrow" or "cjkwide" are recognized to modify the + behaviour of wcwidth() and wcswidth() for East Asian languages. + For details see the comment at the end of this function. */ + if (!strcmp (c + 1, "cjksingle")) + cjksingle = 1; + else if (!strcmp (c + 1, "cjknarrow")) + cjknarrow = 1; + else if (!strcmp (c + 1, "cjkwide")) + cjkwide = 1; + } + /* We only support this subset of charsets. */ + switch (charset[0]) + { + case 'U': + case 'u': + if (strcasecmp (charset, "UTF-8") && strcasecmp (charset, "UTF8")) + FAIL; + strcpy (charset, "UTF-8"); + mbc_max = 6; + l_wctomb = __utf8_wctomb; + l_mbtowc = __utf8_mbtowc; + break; +#ifndef __CYGWIN__ + /* Cygwin does not support JIS at all. */ + case 'J': + case 'j': + if (strcasecmp (charset, "JIS")) + FAIL; + strcpy (charset, "JIS"); + mbc_max = 8; + l_wctomb = __jis_wctomb; + l_mbtowc = __jis_mbtowc; + break; +#endif /* !__CYGWIN__ */ + case 'E': + case 'e': + if (strncasecmp (charset, "EUC", 3)) + FAIL; + c = charset + 3; + if (*c == '-') + ++c; + if (!strcasecmp (c, "JP")) + { + strcpy (charset, "EUCJP"); + mbc_max = 3; + l_wctomb = __eucjp_wctomb; + l_mbtowc = __eucjp_mbtowc; + } +#ifdef __CYGWIN__ + /* Newlib does neither provide EUC-KR nor EUC-CN, and Cygwin's + implementation requires Windows support. */ + else if (!strcasecmp (c, "KR")) + { + strcpy (charset, "EUCKR"); + mbc_max = 2; + l_wctomb = __kr_wctomb; + l_mbtowc = __kr_mbtowc; + } + else if (!strcasecmp (c, "CN")) + { + strcpy (charset, "EUCCN"); + mbc_max = 2; + l_wctomb = __gbk_wctomb; + l_mbtowc = __gbk_mbtowc; + } +#endif /* __CYGWIN__ */ + else + FAIL; + break; + case 'S': + case 's': + if (strcasecmp (charset, "SJIS")) + FAIL; + strcpy (charset, "SJIS"); + mbc_max = 2; + l_wctomb = __sjis_wctomb; + l_mbtowc = __sjis_mbtowc; + break; + case 'I': + case 'i': + /* Must be exactly one of ISO-8859-1, [...] ISO-8859-16, except for + ISO-8859-12. This code also recognizes the aliases without dashes. */ + if (strncasecmp (charset, "ISO", 3)) + FAIL; + c = charset + 3; + if (*c == '-') + ++c; + if (strncasecmp (c, "8859", 4)) + FAIL; + c += 4; + if (*c == '-') + ++c; + val = strtol (c, &end, 10); + if (val < 1 || val > 16 || val == 12 || *end) + FAIL; + strcpy (charset, "ISO-8859-"); + c = charset + 9; + if (val > 10) + *c++ = '1'; + *c++ = val % 10 + '0'; + *c = '\0'; + mbc_max = 1; +#ifdef _MB_EXTENDED_CHARSETS_ISO + l_wctomb = __iso_wctomb (val); + l_mbtowc = __iso_mbtowc (val); +#else /* !_MB_EXTENDED_CHARSETS_ISO */ + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; +#endif /* _MB_EXTENDED_CHARSETS_ISO */ + break; + case 'C': + case 'c': + if (charset[1] != 'P' && charset[1] != 'p') + FAIL; + strncpy (charset, "CP", 2); + val = strtol (charset + 2, &end, 10); + if (*end) + FAIL; + switch (val) + { + case 437: + case 720: + case 737: + case 775: + case 850: + case 852: + case 855: + case 857: + case 858: + case 862: + case 866: + case 874: + case 1125: + case 1250: + case 1251: + case 1252: + case 1253: + case 1254: + case 1255: + case 1256: + case 1257: + case 1258: + mbc_max = 1; +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS + l_wctomb = __cp_wctomb (val); + l_mbtowc = __cp_mbtowc (val); +#else /* !_MB_EXTENDED_CHARSETS_WINDOWS */ + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + break; + case 932: + mbc_max = 2; + l_wctomb = __sjis_wctomb; + l_mbtowc = __sjis_mbtowc; + break; + default: + FAIL; + } + break; + case 'K': + case 'k': + /* KOI8-R, KOI8-U, KOI8-T and the aliases without dash */ + if (strncasecmp (charset, "KOI8", 4)) + FAIL; + c = charset + 4; + if (*c == '-') + ++c; + if (*c == 'R' || *c == 'r') + { + val = 20866; + strcpy (charset, "CP20866"); + } + else if (*c == 'U' || *c == 'u') + { + val = 21866; + strcpy (charset, "CP21866"); + } + else if (*c == 'T' || *c == 't') + { + val = 103; + strcpy (charset, "CP103"); + } + else + FAIL; + mbc_max = 1; +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS + l_wctomb = __cp_wctomb (val); + l_mbtowc = __cp_mbtowc (val); +#else /* !_MB_EXTENDED_CHARSETS_WINDOWS */ + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + break; + case 'A': + case 'a': + if (strcasecmp (charset, "ASCII")) + FAIL; + strcpy (charset, "ASCII"); + mbc_max = 1; + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; + break; + case 'G': + case 'g': +#ifdef __CYGWIN__ + /* Newlib does not provide GBK/GB2312 and Cygwin's implementation + requires Windows support. */ + if (!strcasecmp (charset, "GBK") + || !strcasecmp (charset, "GB2312")) + { + strcpy (charset, charset[2] == '2' ? "GB2312" : "GBK"); + mbc_max = 2; + l_wctomb = __gbk_wctomb; + l_mbtowc = __gbk_mbtowc; + } + else if (!strcasecmp (charset, "GB18030")) + { + strcpy (charset, "GB18030"); + mbc_max = 4; + l_wctomb = __gb18030_wctomb; + l_mbtowc = __gb18030_mbtowc; + } + else +#endif /* __CYGWIN__ */ + /* GEORGIAN-PS and the alias without dash */ + if (!strncasecmp (charset, "GEORGIAN", 8)) + { + c = charset + 8; + if (*c == '-') + ++c; + if (strcasecmp (c, "PS")) + FAIL; + val = 101; + strcpy (charset, "CP101"); + mbc_max = 1; +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS + l_wctomb = __cp_wctomb (val); + l_mbtowc = __cp_mbtowc (val); +#else /* !_MB_EXTENDED_CHARSETS_WINDOWS */ + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + } + else + FAIL; + break; + case 'P': + case 'p': + /* PT154 */ + if (strcasecmp (charset, "PT154")) + FAIL; + val = 102; + strcpy (charset, "CP102"); + mbc_max = 1; +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS + l_wctomb = __cp_wctomb (val); + l_mbtowc = __cp_mbtowc (val); +#else /* !_MB_EXTENDED_CHARSETS_WINDOWS */ + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + break; + case 'T': + case 't': + if (strncasecmp (charset, "TIS", 3)) + FAIL; + c = charset + 3; + if (*c == '-') + ++c; + if (strcmp (c, "620")) + FAIL; + val = 874; + strcpy (charset, "CP874"); + mbc_max = 1; +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS + l_wctomb = __cp_wctomb (val); + l_mbtowc = __cp_mbtowc (val); +#else /* !_MB_EXTENDED_CHARSETS_WINDOWS */ + l_wctomb = __ascii_wctomb; + l_mbtowc = __ascii_mbtowc; +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + break; +#ifdef __CYGWIN__ + /* Newlib does not provide Big5 and Cygwin's implementation + requires Windows support. */ + case 'B': + case 'b': + if (strcasecmp (charset, "BIG5")) + FAIL; + strcpy (charset, "BIG5"); + mbc_max = 2; + l_wctomb = __big5_wctomb; + l_mbtowc = __big5_mbtowc; + break; +#endif /* __CYGWIN__ */ + default: + FAIL; + } + switch (category) + { + case LC_CTYPE: +#ifndef __HAVE_LOCALE_INFO__ + strcpy (loc->ctype_codeset, charset); + loc->mb_cur_max[0] = mbc_max; +#endif +#ifdef __CYGWIN__ + __mb_cur_max = mbc_max; /* Only for backward compat */ +#endif + loc->wctomb = l_wctomb; + loc->mbtowc = l_mbtowc; + __set_ctype (loc, charset); + /* Set CJK width mode (1: ambiguous-wide, 0: normal, -1: disabled). */ + /* Determine the width for the "CJK Ambiguous Width" category of + characters. This is used in wcwidth(). Assume single width for + single-byte charsets, and double width for multi-byte charsets + other than UTF-8. For UTF-8, use single width. + Single width can also be forced with the "@cjknarrow" modifier. + Double width can also be forced with the "@cjkwide" modifier. + */ + loc->cjk_lang = cjkwide || + (!cjknarrow && mbc_max > 1 && charset[0] != 'U'); + if (cjksingle) + loc->cjk_lang = -1; /* Disable CJK dual-width */ +#ifdef __HAVE_LOCALE_INFO__ + ret = __ctype_load_locale (loc, locale, (void *) l_wctomb, charset, + mbc_max); +#endif /* __HAVE_LOCALE_INFO__ */ + break; + case LC_MESSAGES: +#ifdef __HAVE_LOCALE_INFO__ + ret = __messages_load_locale (loc, locale, (void *) l_wctomb, charset); + if (!ret) +#else + strcpy (loc->message_codeset, charset); +#endif /* __HAVE_LOCALE_INFO__ */ + break; +#ifdef __HAVE_LOCALE_INFO__ +#ifdef __CYGWIN__ + /* Right now only Cygwin supports a __collate_load_locale function at all. */ + case LC_COLLATE: + ret = __collate_load_locale (loc, locale, (void *) l_mbtowc, charset); + break; +#endif + case LC_MONETARY: + ret = __monetary_load_locale (loc, locale, (void *) l_wctomb, charset); + break; + case LC_NUMERIC: + ret = __numeric_load_locale (loc, locale, (void *) l_wctomb, charset); + break; + case LC_TIME: + ret = __time_load_locale (loc, locale, (void *) l_wctomb, charset); + break; +#endif /* __HAVE_LOCALE_INFO__ */ + default: + break; + } +#ifdef __HAVE_LOCALE_INFO__ + if (ret) + FAIL; +#endif /* __HAVE_LOCALE_INFO__ */ + return strcpy(loc->categories[category], new_locale); +} + +const char * +__get_locale_env (struct _reent *p, int category) +{ + const char *env; + + /* 1. check LC_ALL. */ + env = _getenv_r (p, categories[0]); + + /* 2. check LC_* */ + if (env == NULL || !*env) + env = _getenv_r (p, categories[category]); + + /* 3. check LANG */ + if (env == NULL || !*env) + env = _getenv_r (p, "LANG"); + + /* 4. if none is set, fall to default locale */ + if (env == NULL || !*env) + env = __default_locale; + + return env; +} +#endif /* _MB_CAPABLE */ + +int +__locale_mb_cur_max (void) +{ +#ifdef __HAVE_LOCALE_INFO__ + return __get_current_ctype_locale ()->mb_cur_max[0]; +#else + return __get_current_locale ()->mb_cur_max[0]; +#endif +} + +#ifdef __HAVE_LOCALE_INFO__ +const char * +__locale_ctype_ptr_l (struct __locale_t *locale) +{ + return locale->ctype_ptr; +} + +const char * +__locale_ctype_ptr (void) +{ + return __get_current_locale ()->ctype_ptr; +} +#endif /* __HAVE_LOCALE_INFO__ */ + +#ifndef _REENT_ONLY + +char * +setlocale (int category, + const char *locale) +{ + return _setlocale_r (_REENT, category, locale); +} + +#endif diff --git a/lib/locale/locale.tex b/lib/locale/locale.tex new file mode 100644 index 0000000..eee7d77 --- /dev/null +++ b/lib/locale/locale.tex @@ -0,0 +1,123 @@ +@node Locale +@chapter Locale (@file{locale.h}) + +A @dfn{locale} is the name for a collection of parameters (affecting +collating sequences and formatting conventions) that may be different +depending on location or culture. The @code{"C"} locale is the only +one defined in the ANSI C standard. + +This is a minimal implementation, supporting only the required @code{"C"} +value for locale; strings representing other locales are not +honored. (@code{""} is also accepted; it represents the default locale +for an implementation, here equivalent to @code{"C"}). + + +@file{locale.h} defines the structure @code{lconv} to collect the +information on a locale, with the following fields: + +@table @code +@item char *decimal_point +The decimal point character used to format ``ordinary'' numbers (all +numbers except those referring to amounts of money). @code{"."} in the +C locale. + +@item char *thousands_sep +The character (if any) used to separate groups of digits, when +formatting ordinary numbers. +@code{""} in the C locale. + +@item char *grouping +Specifications for how many digits to group (if any grouping is done at +all) when formatting ordinary numbers. The @emph{numeric value} of each +character in the string represents the number of digits for the next +group, and a value of @code{0} (that is, the string's trailing +@code{NULL}) means to continue grouping digits using the last value +specified. Use @code{CHAR_MAX} to indicate that no further grouping is +desired. @code{""} in the C locale. + +@item char *int_curr_symbol +The international currency symbol (first three characters), if any, and +the character used to separate it from numbers. +@code{""} in the C locale. + +@item char *currency_symbol +The local currency symbol, if any. +@code{""} in the C locale. + +@item char *mon_decimal_point +The symbol used to delimit fractions in amounts of money. +@code{""} in the C locale. + +@item char *mon_thousands_sep +Similar to @code{thousands_sep}, but used for amounts of money. +@code{""} in the C locale. + +@item char *mon_grouping +Similar to @code{grouping}, but used for amounts of money. +@code{""} in the C locale. + +@item char *positive_sign +A string to flag positive amounts of money when formatting. +@code{""} in the C locale. + +@item char *negative_sign +A string to flag negative amounts of money when formatting. +@code{""} in the C locale. + +@item char int_frac_digits +The number of digits to display when formatting amounts of money to +international conventions. +@code{CHAR_MAX} (the largest number representable as a @code{char}) in +the C locale. + +@item char frac_digits +The number of digits to display when formatting amounts of money to +local conventions. +@code{CHAR_MAX} in the C locale. + +@item char p_cs_precedes +@code{1} indicates the local currency symbol is used before a +@emph{positive or zero} formatted amount of money; @code{0} indicates +the currency symbol is placed after the formatted number. +@code{CHAR_MAX} in the C locale. + +@item char p_sep_by_space +@code{1} indicates the local currency symbol must be separated from +@emph{positive or zero} numbers by a space; @code{0} indicates that it +is immediately adjacent to numbers. +@code{CHAR_MAX} in the C locale. + +@item char n_cs_precedes +@code{1} indicates the local currency symbol is used before a +@emph{negative} formatted amount of money; @code{0} indicates +the currency symbol is placed after the formatted number. +@code{CHAR_MAX} in the C locale. + +@item char n_sep_by_space +@code{1} indicates the local currency symbol must be separated from +@emph{negative} numbers by a space; @code{0} indicates that it +is immediately adjacent to numbers. +@code{CHAR_MAX} in the C locale. + +@item char p_sign_posn +Controls the position of the @emph{positive} sign for +numbers representing money. @code{0} means parentheses surround the +number; @code{1} means the sign is placed before both the number and the +currency symbol; @code{2} means the sign is placed after both the number +and the currency symbol; @code{3} means the sign is placed just before +the currency symbol; and @code{4} means the sign is placed just after +the currency symbol. +@code{CHAR_MAX} in the C locale. + +@item char n_sign_posn +Controls the position of the @emph{negative} sign for numbers +representing money, using the same rules as @code{p_sign_posn}. +@code{CHAR_MAX} in the C locale. +@end table + +@menu +* setlocale:: Select or query locale +@end menu + +@page +@include locale/locale.def diff --git a/lib/locale/localeconv.c b/lib/locale/localeconv.c new file mode 100644 index 0000000..5f34a78 --- /dev/null +++ b/lib/locale/localeconv.c @@ -0,0 +1,68 @@ +#include "newlib.h" +#include +#include "setlocale.h" + +struct lconv * +__localeconv_l (struct __locale_t *locale) +{ + struct lconv *lconv = &locale->lconv; + if (locale == __get_C_locale ()) + return lconv; + +#ifdef __HAVE_LOCALE_INFO__ + const struct lc_numeric_T *n = __get_numeric_locale (locale); + const struct lc_monetary_T *m = __get_monetary_locale (locale); + + lconv->decimal_point = (char *) n->decimal_point; + lconv->thousands_sep = (char *) n->thousands_sep; + lconv->grouping = (char *) n->grouping; + lconv->int_curr_symbol = (char *) m->int_curr_symbol; + lconv->currency_symbol = (char *) m->currency_symbol; + lconv->mon_decimal_point = (char *) m->mon_decimal_point; + lconv->mon_thousands_sep = (char *) m->mon_thousands_sep; + lconv->mon_grouping = (char *) m->mon_grouping; + lconv->positive_sign = (char *) m->positive_sign; + lconv->negative_sign = (char *) m->negative_sign; + lconv->int_frac_digits = m->int_frac_digits[0]; + lconv->frac_digits = m->frac_digits[0]; + lconv->p_cs_precedes = m->p_cs_precedes[0]; + lconv->p_sep_by_space = m->p_sep_by_space[0]; + lconv->n_cs_precedes = m->n_cs_precedes[0]; + lconv->n_sep_by_space = m->n_sep_by_space[0]; + lconv->p_sign_posn = m->p_sign_posn[0]; + lconv->n_sign_posn = m->n_sign_posn[0]; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + lconv->int_p_cs_precedes = m->int_p_cs_precedes[0]; + lconv->int_p_sep_by_space = m->int_p_sep_by_space[0]; + lconv->int_n_cs_precedes = m->int_n_cs_precedes[0]; + lconv->int_n_sep_by_space = m->int_n_sep_by_space[0]; + lconv->int_n_sign_posn = m->int_n_sign_posn[0]; + lconv->int_p_sign_posn = m->int_p_sign_posn[0]; +#else /* !__HAVE_LOCALE_INFO_EXTENDED__ */ + lconv->int_p_cs_precedes = m->p_cs_precedes[0]; + lconv->int_p_sep_by_space = m->p_sep_by_space[0]; + lconv->int_n_cs_precedes = m->n_cs_precedes[0]; + lconv->int_n_sep_by_space = m->n_sep_by_space[0]; + lconv->int_n_sign_posn = m->n_sign_posn[0]; + lconv->int_p_sign_posn = m->p_sign_posn[0]; +#endif /* !__HAVE_LOCALE_INFO_EXTENDED__ */ +#endif /* __HAVE_LOCALE_INFO__ */ + return lconv; +} + +struct lconv * +_localeconv_r (struct _reent *data) +{ + /* Note that we always fall back to the global locale, even in case + of specifying a reent. Otherwise a call to _localeconv_r would just + crash if the reent locale pointer is NULL. */ + return __localeconv_l (__get_current_locale ()); +} + +#ifndef _REENT_ONLY +struct lconv * +localeconv (void) +{ + return __localeconv_l (__get_current_locale ()); +} +#endif diff --git a/lib/locale/newlocale.c b/lib/locale/newlocale.c new file mode 100644 index 0000000..278f78e --- /dev/null +++ b/lib/locale/newlocale.c @@ -0,0 +1,226 @@ +/* +FUNCTION + <>---create or modify a locale object + +INDEX + newlocale + +INDEX + _newlocale_r + +SYNOPSIS + #include + locale_t newlocale(int <[category_mask]>, const char *<[locale]>, + locale_t <[locobj]>); + + locale_t _newlocale_r(void *<[reent]>, int <[category_mask]>, + const char *<[locale]>, locale_t <[locobj]>); + +DESCRIPTION +The <> function shall create a new locale object or modify an +existing one. If the base argument is (locale_t) <<0>>, a new locale +object shall be created. It is unspecified whether the locale object +pointed to by base shall be modified, or freed and a new locale object +created. + +The category_mask argument specifies the locale categories to be set or +modified. Values for category_mask shall be constructed by a +bitwise-inclusive OR of the symbolic constants LC_CTYPE_MASK, +LC_NUMERIC_MASK, LC_TIME_MASK, LC_COLLATE_MASK, LC_MONETARY_MASK, and +LC_MESSAGES_MASK, or any of the other implementation-defined LC_*_MASK +values defined in . + +For each category with the corresponding bit set in category_mask the +data from the locale named by locale shall be used. In the case of +modifying an existing locale object, the data from the locale named by +locale shall replace the existing data within the locale object. If a +completely new locale object is created, the data for all sections not +requested by category_mask shall be taken from the default locale. + +The following preset values of locale are defined for all settings of +category_mask: + +"POSIX" Specifies the minimal environment for C-language translation +called the POSIX locale. + +"C" Equivalent to "POSIX". + +"" Specifies an implementation-defined native environment. This + corresponds to the value of the associated environment variables, + LC_* and LANG; see the Base Definitions volume of POSIX.1â€2008, + Chapter 7, Locale and Chapter 8, Environment Variables. + +If the base argument is not (locale_t) <<0>> and the <> +function call succeeds, the contents of base are unspecified. +Applications shall ensure that they stop using base as a locale object +before calling <>. If the function call fails and the base +argument is not (locale_t) <<0>>, the contents of base shall remain +valid and unchanged. + +The behavior is undefined if the base argument is the special locale +object LC_GLOBAL_LOCALE, or is not a valid locale object handle and is +not (locale_t) <<0>>. + +RETURNS +Upon successful completion, the <> function shall return a +handle which the caller may use on subsequent calls to <>, +<>, and other functions taking a locale_t argument. + +Upon failure, the <> function shall return (locale_t) <<0>> +and set errno to indicate the error. + +PORTABILITY +<> is POSIX-1.2008. +*/ + +#include +#include +#include +#include +#include "setlocale.h" + +#define LC_VALID_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MONETARY_MASK \ + | LC_NUMERIC_MASK | LC_TIME_MASK | LC_MESSAGES_MASK) + +struct __locale_t * +_newlocale_r (struct _reent *p, int category_mask, const char *locale, + struct __locale_t *base) +{ +#ifndef _MB_CAPABLE + return __get_C_locale (); +#else /* _MB_CAPABLE */ + char new_categories[_LC_LAST][ENCODING_LEN + 1]; + struct __locale_t tmp_locale, *new_locale; + int i; + + /* Convert LC_ALL_MASK to a mask containing all valid MASK values. + This simplifies the code below. */ + if (category_mask & LC_ALL_MASK) + { + category_mask &= ~LC_ALL_MASK; + category_mask |= LC_VALID_MASK; + } + /* Check for invalid mask values and valid locale ptr. */ + if ((category_mask & ~LC_VALID_MASK) || !locale) + { + p->_errno = EINVAL; + return NULL; + } + /* If the new locale is supposed to be all default locale, just return + a pointer to the default locale. */ + if ((!base && category_mask == 0) + || (category_mask == LC_VALID_MASK + && (!strcmp (locale, "C") || !strcmp (locale, "POSIX")))) + return __get_C_locale (); + /* Start with setting all values to the default locale values. */ + tmp_locale = *__get_C_locale (); + /* Fill out new category strings. */ + for (i = 1; i < _LC_LAST; ++i) + { + if (((1 << i) & category_mask) != 0) + { + /* If locale is "", fetch from environment. Otherwise use locale + name verbatim. */ + const char *cat = (locale[0] == '\0') ? __get_locale_env (p, i) + : locale; + if (strlen (cat) > ENCODING_LEN) + { + p->_errno = EINVAL; + return NULL; + } + strcpy (new_categories[i], cat); + } + else + strcpy (new_categories[i], base ? base->categories[i] : "C"); + } + /* Now go over all categories and set them. */ + for (i = 1; i < _LC_LAST; ++i) + { + /* If we have a base locale, and the category is not in category_mask + or the new category is the base categroy, just copy over. */ + if (base && (((1 << i) & category_mask) == 0 + || !strcmp (base->categories[i], new_categories[i]))) + { + strcpy (tmp_locale.categories[i], new_categories[i]); + if (i == LC_CTYPE) + { + tmp_locale.wctomb = base->wctomb; + tmp_locale.mbtowc = base->mbtowc; + tmp_locale.cjk_lang = base->cjk_lang; + tmp_locale.ctype_ptr = base->ctype_ptr; + } +#ifdef __HAVE_LOCALE_INFO__ + /* Mark the values as "has still to be copied". We do this in + two steps to simplify freeing new locale types in case of a + subsequent error. */ + tmp_locale.lc_cat[i].ptr = base->lc_cat[i].ptr; + tmp_locale.lc_cat[i].buf = (void *) -1; +#else /* !__HAVE_LOCALE_INFO__ */ + if (i == LC_CTYPE) + strcpy (tmp_locale.ctype_codeset, base->ctype_codeset); + else if (i == LC_MESSAGES) + strcpy (tmp_locale.message_codeset, base->message_codeset); +#endif /* !__HAVE_LOCALE_INFO__ */ + } + /* Otherwise, if the category is in category_mask, create entry. */ + else if (((1 << i) & category_mask) != 0) + { + /* Nothing to do for "C"/"POSIX" locale. */ + if (!strcmp (new_categories[i], "C") + || !strcmp (new_categories[i], "POSIX")) + continue; + /* Otherwise load locale data. */ + else if (!__loadlocale (&tmp_locale, i, new_categories[i])) + { + p->_errno = ENOENT; + goto error; + } + } + } + /* Allocate new locale_t. */ + new_locale = (struct __locale_t *) _calloc_r (p, 1, sizeof *new_locale); + if (!new_locale) + goto error; + if (base) + { +#ifdef __HAVE_LOCALE_INFO__ + /* Step 2 of copying over.. Make sure to invalidate the copied buffer + pointers in base, so the subsequent _freelocale_r (base) doesn't free + the buffers now used in the new locale. */ + for (i = 1; i < _LC_LAST; ++i) + if (tmp_locale.lc_cat[i].buf == (const void *) -1) + { + tmp_locale.lc_cat[i].buf = base->lc_cat[i].buf; + if (base != __get_C_locale ()) + base->lc_cat[i].ptr = base->lc_cat[i].buf = NULL; + } +#endif /* __HAVE_LOCALE_INFO__ */ + _freelocale_r (p, base); + } + + *new_locale = tmp_locale; + return new_locale; + +error: + /* An error occured while we had already (potentially) allocated memory. + Free memory and return NULL. errno is supposed to be set already. */ +#ifdef __HAVE_LOCALE_INFO__ + for (i = 1; i < _LC_LAST; ++i) + if (((1 << i) & category_mask) != 0 + && tmp_locale.lc_cat[i].buf + && tmp_locale.lc_cat[i].buf != (const void *) -1) + { + _free_r (p, (void *) tmp_locale.lc_cat[i].ptr); + _free_r (p, tmp_locale.lc_cat[i].buf); + } +#endif /* __HAVE_LOCALE_INFO__ */ + + return NULL; +#endif /* _MB_CAPABLE */ +} + +struct __locale_t * +newlocale (int category_mask, const char *locale, struct __locale_t *base) +{ + return _newlocale_r (_REENT, category_mask, locale, base); +} diff --git a/lib/locale/nl_langinfo.3 b/lib/locale/nl_langinfo.3 new file mode 100644 index 0000000..96819e1 --- /dev/null +++ b/lib/locale/nl_langinfo.3 @@ -0,0 +1,90 @@ +.\" Copyright (c) 2001 Alexey Zelkin +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/lib/libc/locale/nl_langinfo.3,v 1.4 2002/04/13 04:25:56 dd Exp $ +.\" +.Dd May 3, 2001 +.Dt NL_LANGINFO 3 +.Os +.Sh NAME +.Nm nl_langinfo +.Nd language information +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In langinfo.h +.Ft char * +.Fn nl_langinfo "nl_item item" +.Sh DESCRIPTION +The +.Fn nl_langinfo +function returns a pointer to a string containing information relevant to +the particular language or cultural area defined in the program's locale. +The manifest constant names and values of +.Fa item +are defined in +.Aq Pa langinfo.h . +.Pp +Calls to +.Fn setlocale +with a category corresponding to the category of +.Fa item , +or to the +category +.Dv LC_ALL , +may overwrite buffer pointed by the return value. +.Sh EXAMPLES +For example: +.Pp +.Dl nl_langinfo(ABDAY_1) +.Pp +would return a pointer to the string +.Qq Li Dom +if the identified language was +Portuguese, and +.Qq Li Sun +if the identified language was English. +.Sh RETURN VALUES +In a locale where langinfo data is not defined, +.Fn nl_langinfo +returns a pointer to the corresponding string in the +.Tn POSIX +locale. +In all locales, +.Fn nl_langinfo +returns a pointer to an empty string if +.Fa item +contains an invalid setting. +.Sh SEE ALSO +.Xr setlocale 3 +.Sh STANDARDS +The +.Fn nl_langinfo +function conforms to +.St -susv2 . +.Sh HISTORY +The +.Fn nl_langinfo +function first appeared in +.Fx 4.6 . diff --git a/lib/locale/nl_langinfo.c b/lib/locale/nl_langinfo.c new file mode 100644 index 0000000..aaa1aef --- /dev/null +++ b/lib/locale/nl_langinfo.c @@ -0,0 +1,398 @@ +/*- + * Copyright (c) 2001 Alexey Zelkin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE + +#include + +#include +#include +#include +#include +#include + +#include "setlocale.h" + +#undef offsetoff +#define _O(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) + +#define _NLITEM(cat,memb) { { cat:__get_##cat##_locale }, \ + _O (struct lc_##cat##_T, memb) } + +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ +static struct _nl_item_t +{ + union { + const struct lc_ctype_T * (*ctype)(struct __locale_t *); + const struct lc_time_T * (*time)(struct __locale_t *); + const struct lc_numeric_T * (*numeric)(struct __locale_t *); + const struct lc_monetary_T * (*monetary)(struct __locale_t *); + const struct lc_messages_T * (*messages)(struct __locale_t *); + void * (*base)(struct __locale_t *); + }; + _off_t offset; +} nl_ext[] = +{ + /* First element has an nl_item value of _NL_LOCALE_EXTENDED_FIRST_ENTRY */ + _NLITEM (ctype, outdigits[0]), + _NLITEM (ctype, outdigits[1]), + _NLITEM (ctype, outdigits[2]), + _NLITEM (ctype, outdigits[3]), + _NLITEM (ctype, outdigits[4]), + _NLITEM (ctype, outdigits[5]), + _NLITEM (ctype, outdigits[6]), + _NLITEM (ctype, outdigits[7]), + _NLITEM (ctype, outdigits[8]), + _NLITEM (ctype, outdigits[9]), + _NLITEM (ctype, woutdigits[0]), + _NLITEM (ctype, woutdigits[1]), + _NLITEM (ctype, woutdigits[2]), + _NLITEM (ctype, woutdigits[3]), + _NLITEM (ctype, woutdigits[4]), + _NLITEM (ctype, woutdigits[5]), + _NLITEM (ctype, woutdigits[6]), + _NLITEM (ctype, woutdigits[7]), + _NLITEM (ctype, woutdigits[8]), + _NLITEM (ctype, woutdigits[9]), + _NLITEM (time, codeset), + _NLITEM (time, wmon[1]), + _NLITEM (time, wmon[2]), + _NLITEM (time, wmon[3]), + _NLITEM (time, wmon[4]), + _NLITEM (time, wmon[5]), + _NLITEM (time, wmon[6]), + _NLITEM (time, wmon[7]), + _NLITEM (time, wmon[8]), + _NLITEM (time, wmon[9]), + _NLITEM (time, wmon[10]), + _NLITEM (time, wmon[11]), + _NLITEM (time, wmon[12]), + _NLITEM (time, wmonth[1]), + _NLITEM (time, wmonth[2]), + _NLITEM (time, wmonth[3]), + _NLITEM (time, wmonth[4]), + _NLITEM (time, wmonth[5]), + _NLITEM (time, wmonth[6]), + _NLITEM (time, wmonth[7]), + _NLITEM (time, wmonth[8]), + _NLITEM (time, wmonth[9]), + _NLITEM (time, wmonth[10]), + _NLITEM (time, wmonth[11]), + _NLITEM (time, wmonth[12]), + _NLITEM (time, wwday[1]), + _NLITEM (time, wwday[2]), + _NLITEM (time, wwday[3]), + _NLITEM (time, wwday[4]), + _NLITEM (time, wwday[5]), + _NLITEM (time, wwday[6]), + _NLITEM (time, wwday[7]), + _NLITEM (time, wweekday[1]), + _NLITEM (time, wweekday[2]), + _NLITEM (time, wweekday[3]), + _NLITEM (time, wweekday[4]), + _NLITEM (time, wweekday[5]), + _NLITEM (time, wweekday[6]), + _NLITEM (time, wweekday[7]), + _NLITEM (time, wX_fmt), + _NLITEM (time, wx_fmt), + _NLITEM (time, wc_fmt), + _NLITEM (time, wam_pm[0]), + _NLITEM (time, wam_pm[1]), + _NLITEM (time, wdate_fmt), + _NLITEM (time, wampm_fmt), + _NLITEM (time, wera), + _NLITEM (time, wera_d_fmt), + _NLITEM (time, wera_d_t_fmt), + _NLITEM (time, wera_t_fmt), + _NLITEM (time, walt_digits), + _NLITEM (numeric, codeset), + _NLITEM (numeric, grouping), + _NLITEM (numeric, wdecimal_point), + _NLITEM (numeric, wthousands_sep), + _NLITEM (monetary, int_curr_symbol), + _NLITEM (monetary, currency_symbol), + _NLITEM (monetary, mon_decimal_point), + _NLITEM (monetary, mon_thousands_sep), + _NLITEM (monetary, mon_grouping), + _NLITEM (monetary, positive_sign), + _NLITEM (monetary, negative_sign), + _NLITEM (monetary, int_frac_digits), + _NLITEM (monetary, frac_digits), + _NLITEM (monetary, p_cs_precedes), + _NLITEM (monetary, p_sep_by_space), + _NLITEM (monetary, n_cs_precedes), + _NLITEM (monetary, n_sep_by_space), + _NLITEM (monetary, p_sign_posn), + _NLITEM (monetary, n_sign_posn), + _NLITEM (monetary, int_p_cs_precedes), + _NLITEM (monetary, int_p_sep_by_space), + _NLITEM (monetary, int_n_cs_precedes), + _NLITEM (monetary, int_n_sep_by_space), + _NLITEM (monetary, int_p_sign_posn), + _NLITEM (monetary, int_n_sign_posn), + _NLITEM (monetary, codeset), + _NLITEM (monetary, wint_curr_symbol), + _NLITEM (monetary, wcurrency_symbol), + _NLITEM (monetary, wmon_decimal_point), + _NLITEM (monetary, wmon_thousands_sep), + _NLITEM (monetary, wpositive_sign), + _NLITEM (monetary, wnegative_sign), + _NLITEM (messages, codeset), + _NLITEM (messages, wyesexpr), + _NLITEM (messages, wnoexpr), + _NLITEM (messages, wyesstr), + _NLITEM (messages, wnostr), +}; +#endif /* __HAVE_LOCALE_INFO_EXTENDED__ */ + +#define _REL(BASE) ((int)item-BASE) + +char *nl_langinfo_l (nl_item item, struct __locale_t *locale) +{ + char *ret, *cs; +#ifndef __CYGWIN__ + char *s; +#endif + static char *csym = NULL; + char *nptr; + + switch (item) { +#ifdef __HAVE_LOCALE_INFO__ + case _NL_MESSAGES_CODESET: + ret = (char *) __get_messages_locale (locale)->codeset; + goto do_codeset; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + case _NL_TIME_CODESET: + ret = (char *) __get_time_locale (locale)->codeset; + goto do_codeset; + case _NL_NUMERIC_CODESET: + ret = (char *) __get_numeric_locale (locale)->codeset; + goto do_codeset; + case _NL_MONETARY_CODESET: + ret = (char *) __get_monetary_locale (locale)->codeset; + goto do_codeset; +#ifdef __CYGWIN__ + case _NL_COLLATE_CODESET: + { + ret = (char *) __get_collate_locale (locale)->codeset; + goto do_codeset; + } +#endif /* __CYGWIN__ */ +#endif /* __HAVE_LOCALE_INFO_EXTENDED__ */ +#endif /* __HAVE_LOCALE_INFO__ */ + case CODESET: +#ifdef _MB_CAPABLE + ret = (char *) __locale_charset (locale); +#endif +do_codeset: +#ifdef __CYGWIN__ + /* Convert charset to Linux compatible codeset string. */ + if (ret[0] == 'A'/*SCII*/) + ret = "ANSI_X3.4-1968"; + else if (ret[0] == 'E') + { + if (strcmp (ret, "EUCJP") == 0) + ret = "EUC-JP"; + else if (strcmp (ret, "EUCKR") == 0) + ret = "EUC-KR"; + else if (strcmp (ret, "EUCCN") == 0) + ret = "GB2312"; + } + else if (ret[0] == 'C'/*Pxxxx*/) + { + if (strcmp (ret + 2, "874") == 0) + ret = "TIS-620"; + else if (strcmp (ret + 2, "20866") == 0) + ret = "KOI8-R"; + else if (strcmp (ret + 2, "21866") == 0) + ret = "KOI8-U"; + else if (strcmp (ret + 2, "101") == 0) + ret = "GEORGIAN-PS"; + else if (strcmp (ret + 2, "102") == 0) + ret = "PT154"; + else if (strcmp (ret + 2, "103") == 0) + ret = "KOI8-T"; + } + else if (ret[0] == 'S'/*JIS*/) + { + /* Cygwin uses MSFT's implementation of SJIS, which differs + in some codepoints from the real thing, especially + 0x5c: yen sign instead of backslash, + 0x7e: overline instead of tilde. + We can't use the real SJIS since otherwise Win32 + pathnames would become invalid. OTOH, if we return + "SJIS" here, then libiconv will do mb<->wc conversion + differently to our internal functions. Therefore we + return what we really implement, CP932. This is handled + fine by libiconv. */ + ret = "CP932"; + } +#elif !defined (_MB_CAPABLE) + ret = "US-ASCII"; +#endif /* __CYGWIN__ */ + break; + case D_T_FMT: + ret = (char *) __get_time_locale (locale)->c_fmt; + break; + case D_FMT: + ret = (char *) __get_time_locale (locale)->x_fmt; + break; + case T_FMT: + ret = (char *) __get_time_locale (locale)->X_fmt; + break; + case T_FMT_AMPM: + ret = (char *) __get_time_locale (locale)->ampm_fmt; + break; + case AM_STR: + ret = (char *) __get_time_locale (locale)->am_pm[0]; + break; + case PM_STR: + ret = (char *) __get_time_locale (locale)->am_pm[1]; + break; + case DAY_1: case DAY_2: case DAY_3: + case DAY_4: case DAY_5: case DAY_6: case DAY_7: + ret = (char*) __get_time_locale (locale)->weekday[_REL(DAY_1)]; + break; + case ABDAY_1: case ABDAY_2: case ABDAY_3: + case ABDAY_4: case ABDAY_5: case ABDAY_6: case ABDAY_7: + ret = (char*) __get_time_locale (locale)->wday[_REL(ABDAY_1)]; + break; + case MON_1: case MON_2: case MON_3: case MON_4: + case MON_5: case MON_6: case MON_7: case MON_8: + case MON_9: case MON_10: case MON_11: case MON_12: + ret = (char*) __get_time_locale (locale)->month[_REL(MON_1)]; + break; + case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4: + case ABMON_5: case ABMON_6: case ABMON_7: case ABMON_8: + case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12: + ret = (char*) __get_time_locale (locale)->mon[_REL(ABMON_1)]; + break; + case ERA: + ret = (char*) __get_time_locale (locale)->era; + break; + case ERA_D_FMT: + ret = (char*) __get_time_locale (locale)->era_d_fmt; + break; + case ERA_D_T_FMT: + ret = (char*) __get_time_locale (locale)->era_d_t_fmt; + break; + case ERA_T_FMT: + ret = (char*) __get_time_locale (locale)->era_t_fmt; + break; + case ALT_DIGITS: + ret = (char*) __get_time_locale (locale)->alt_digits; + break; + case _DATE_FMT: /* GNU extension */ + ret = (char*) __get_time_locale (locale)->date_fmt; + break; + case RADIXCHAR: + ret = (char*) __get_numeric_locale (locale)->decimal_point; + break; + case THOUSEP: + ret = (char*) __get_numeric_locale (locale)->thousands_sep; + break; + case YESEXPR: + ret = (char*) __get_messages_locale (locale)->yesexpr; + break; + case NOEXPR: + ret = (char*) __get_messages_locale (locale)->noexpr; + break; + /* + * All items marked with LEGACY are available, but not recomended + * by SUSv2 to be used in portable applications since they're subject + * to remove in future specification editions + */ + case YESSTR: /* LEGACY */ + ret = (char*) __get_messages_locale (locale)->yesstr; + break; + case NOSTR: /* LEGACY */ + ret = (char*) __get_messages_locale (locale)->nostr; + break; + case CRNCYSTR: + ret = ""; + cs = (char*) __get_monetary_locale (locale)->currency_symbol; + if (*cs != '\0') { + char pos = __localeconv_l (locale)->p_cs_precedes; + + if (pos == __localeconv_l (locale)->n_cs_precedes) { + char psn = '\0'; + + if (pos == CHAR_MAX) { + if (strcmp(cs, __get_monetary_locale (locale)->mon_decimal_point) == 0) + psn = '.'; + } else + psn = pos ? '-' : '+'; + if (psn != '\0') { + int clen = strlen(cs); + + nptr = realloc(csym, clen + 2); + if (!nptr && csym) + free (csym); + + csym = nptr; + + if (csym != NULL) { + *csym = psn; + strcpy(csym + 1, cs); + ret = csym; + } + } + } + } + break; + case D_MD_ORDER: /* local extension */ + ret = (char *) __get_time_locale (locale)->md_order; + break; +#ifdef __HAVE_LOCALE_INFO__ + case _NL_CTYPE_MB_CUR_MAX: + ret = (char *) __get_ctype_locale (locale)->mb_cur_max; + break; +#endif + default: + /* Relies on the fact that LC_ALL is 0, and all other + LC_ constants are in ascending order. */ + if (item > NL_LOCALE_NAME(LC_ALL) + && item < NL_LOCALE_NAME(_LC_LAST)) { + return locale->categories[item + - NL_LOCALE_NAME(LC_ALL)]; + } +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + if (item > _NL_LOCALE_EXTENDED_FIRST_ENTRY + && item < _NL_LOCALE_EXTENDED_LAST_ENTRY) { + int idx = item - _NL_LOCALE_EXTENDED_FIRST_ENTRY - 1; + return *(char **) ((char *) (*nl_ext[idx].base)(locale) + + nl_ext[idx].offset); + } +#endif + ret = ""; + } + return (ret); +} + +char *nl_langinfo (nl_item item) +{ + return nl_langinfo_l (item, __get_current_locale ()); +} diff --git a/lib/locale/setlocale.h b/lib/locale/setlocale.h new file mode 100644 index 0000000..7abf92f --- /dev/null +++ b/lib/locale/setlocale.h @@ -0,0 +1,455 @@ +/*- + * Copyright (C) 1997 by Andrey A. Chernov, Moscow, Russia. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libc/locale/setlocale.h,v 1.4 2001/12/20 18:28:52 phantom Exp $ + */ + +#ifndef _SETLOCALE_H_ +#define _SETLOCALE_H_ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include + +__BEGIN_DECLS + +#define ENCODING_LEN 31 +#define CATEGORY_LEN 11 +#define _LC_LAST 7 + +#ifdef __CYGWIN__ +struct lc_collate_T +{ + wchar_t win_locale[ENCODING_LEN + 1]; + int (*mbtowc) (struct _reent *, wchar_t *, const char *, size_t, + mbstate_t *); + char codeset[ENCODING_LEN + 1]; +}; +extern const struct lc_collate_T _C_collate_locale; +#endif + +struct lc_ctype_T +{ + const char *codeset; /* codeset for mbtowc conversion */ + const char *mb_cur_max; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + const char *outdigits[10]; + const wchar_t *woutdigits[10]; +#endif +}; +extern const struct lc_ctype_T _C_ctype_locale; +#ifdef __CYGWIN__ +extern const struct lc_ctype_T _C_utf8_ctype_locale; +#endif + +struct lc_monetary_T +{ + const char *int_curr_symbol; + const char *currency_symbol; + const char *mon_decimal_point; + const char *mon_thousands_sep; + const char *mon_grouping; + const char *positive_sign; + const char *negative_sign; + const char *int_frac_digits; + const char *frac_digits; + const char *p_cs_precedes; + const char *p_sep_by_space; + const char *n_cs_precedes; + const char *n_sep_by_space; + const char *p_sign_posn; + const char *n_sign_posn; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + const char *int_p_cs_precedes; + const char *int_p_sep_by_space; + const char *int_n_cs_precedes; + const char *int_n_sep_by_space; + const char *int_p_sign_posn; + const char *int_n_sign_posn; + const char *codeset; /* codeset for mbtowc conversion */ + const wchar_t *wint_curr_symbol; + const wchar_t *wcurrency_symbol; + const wchar_t *wmon_decimal_point; + const wchar_t *wmon_thousands_sep; + const wchar_t *wpositive_sign; + const wchar_t *wnegative_sign; +#endif +}; +extern const struct lc_monetary_T _C_monetary_locale; + +struct lc_numeric_T +{ + const char *decimal_point; + const char *thousands_sep; + const char *grouping; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + const char *codeset; /* codeset for mbtowc conversion */ + const wchar_t *wdecimal_point; + const wchar_t *wthousands_sep; +#endif +}; +extern const struct lc_numeric_T _C_numeric_locale; + +struct lc_time_T +{ + const char *mon[12]; + const char *month[12]; + const char *wday[7]; + const char *weekday[7]; + const char *X_fmt; + const char *x_fmt; + const char *c_fmt; + const char *am_pm[2]; + const char *date_fmt; + const char *alt_month[12]; /* unused */ + const char *md_order; + const char *ampm_fmt; + const char *era; + const char *era_d_fmt; + const char *era_d_t_fmt; + const char *era_t_fmt; + const char *alt_digits; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + const char *codeset; /* codeset for mbtowc conversion */ + const wchar_t *wmon[12]; + const wchar_t *wmonth[12]; + const wchar_t *wwday[7]; + const wchar_t *wweekday[7]; + const wchar_t *wX_fmt; + const wchar_t *wx_fmt; + const wchar_t *wc_fmt; + const wchar_t *wam_pm[2]; + const wchar_t *wdate_fmt; + const wchar_t *wampm_fmt; + const wchar_t *wera; + const wchar_t *wera_d_fmt; + const wchar_t *wera_d_t_fmt; + const wchar_t *wera_t_fmt; + const wchar_t *walt_digits; +#endif +}; +extern const struct lc_time_T _C_time_locale; + +struct lc_messages_T +{ + const char *yesexpr; + const char *noexpr; + const char *yesstr; + const char *nostr; +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + const char *codeset; /* codeset for mbtowc conversion */ + const wchar_t *wyesexpr; + const wchar_t *wnoexpr; + const wchar_t *wyesstr; + const wchar_t *wnostr; +#endif +}; +extern const struct lc_messages_T _C_messages_locale; + +struct __lc_cats +{ + const void *ptr; + char *buf; +}; + +struct __locale_t +{ + char categories[_LC_LAST][ENCODING_LEN + 1]; + int (*wctomb) (struct _reent *, char *, wchar_t, + mbstate_t *); + int (*mbtowc) (struct _reent *, wchar_t *, + const char *, size_t, mbstate_t *); + int cjk_lang; + char *ctype_ptr; + struct lconv lconv; +#ifndef __HAVE_LOCALE_INFO__ + char mb_cur_max[2]; + char ctype_codeset[ENCODING_LEN + 1]; + char message_codeset[ENCODING_LEN + 1]; +#else + struct __lc_cats lc_cat[_LC_LAST]; +#endif +}; + +#ifdef _MB_CAPABLE +extern char *__loadlocale (struct __locale_t *, int, char *); +extern const char *__get_locale_env(struct _reent *, int); +#endif /* _MB_CAPABLE */ + +extern struct lconv *__localeconv_l (struct __locale_t *locale); + +extern size_t _wcsnrtombs_l (struct _reent *, char *, const wchar_t **, + size_t, size_t, mbstate_t *, struct __locale_t *); + +/* In POSIX terms the global locale is the process-wide locale. Use this + function to always refer to the global locale. */ +_ELIDABLE_INLINE struct __locale_t * +__get_global_locale () +{ + extern struct __locale_t __global_locale; + return &__global_locale; +} + +/* Per REENT locale. This is newlib-internal. */ +_ELIDABLE_INLINE struct __locale_t * +__get_locale_r (struct _reent *r) +{ +#ifdef __HAVE_LOCALE_INFO__ + return _REENT_LOCALE(r); +#else + return __get_global_locale(); +#endif +} + +/* In POSIX terms the current locale is the locale used by all functions + using locale info without providing a locale as parameter (*_l functions). + The current locale is either the locale of the current thread, if the + thread called uselocale, or the global locale if not. */ +_ELIDABLE_INLINE struct __locale_t * +__get_current_locale (void) +{ +#ifdef __HAVE_LOCALE_INFO__ + return _REENT_LOCALE(_REENT) ?: __get_global_locale (); +#else + return __get_global_locale(); +#endif +} + +/* Only access fixed "C" locale using this function. Fake for !_MB_CAPABLE + targets by returning ptr to globale locale. */ +_ELIDABLE_INLINE struct __locale_t * +__get_C_locale (void) +{ +#ifndef _MB_CAPABLE + return __get_global_locale (); +#else + extern const struct __locale_t __C_locale; + return (struct __locale_t *) &__C_locale; +#endif +} + +#ifdef __CYGWIN__ +_ELIDABLE_INLINE const struct lc_collate_T * +__get_collate_locale (struct __locale_t *locale) +{ + return (const struct lc_collate_T *) locale->lc_cat[LC_COLLATE].ptr; +} + +_ELIDABLE_INLINE const struct lc_collate_T * +__get_current_collate_locale (void) +{ + return (const struct lc_collate_T *) + __get_current_locale ()->lc_cat[LC_COLLATE].ptr; +} +#endif + +#ifdef __HAVE_LOCALE_INFO__ +_ELIDABLE_INLINE const struct lc_ctype_T * +__get_ctype_locale (struct __locale_t *locale) +{ + return (const struct lc_ctype_T *) (locale)->lc_cat[LC_CTYPE].ptr; +} + +_ELIDABLE_INLINE const struct lc_ctype_T * +__get_current_ctype_locale (void) +{ + return (const struct lc_ctype_T *) + __get_current_locale ()->lc_cat[LC_CTYPE].ptr; +} +#endif + +_ELIDABLE_INLINE int +__locale_mb_cur_max_l (struct __locale_t *locale) +{ +#ifdef __HAVE_LOCALE_INFO__ + return __get_ctype_locale (locale)->mb_cur_max[0]; +#else + return locale->mb_cur_max[0]; +#endif +} + +#ifdef __HAVE_LOCALE_INFO__ +_ELIDABLE_INLINE const struct lc_monetary_T * +__get_monetary_locale (struct __locale_t *locale) +{ + return (const struct lc_monetary_T *) (locale)->lc_cat[LC_MONETARY].ptr; +} + +_ELIDABLE_INLINE const struct lc_monetary_T * +__get_current_monetary_locale (void) +{ + return (const struct lc_monetary_T *) + __get_current_locale ()->lc_cat[LC_MONETARY].ptr; +} + +_ELIDABLE_INLINE const struct lc_numeric_T * +__get_numeric_locale (struct __locale_t *locale) +{ + return (const struct lc_numeric_T *) (locale)->lc_cat[LC_NUMERIC].ptr; +} + +_ELIDABLE_INLINE const struct lc_numeric_T * +__get_current_numeric_locale (void) +{ + return (const struct lc_numeric_T *) + __get_current_locale ()->lc_cat[LC_NUMERIC].ptr; +} + +_ELIDABLE_INLINE const struct lc_time_T * +__get_time_locale (struct __locale_t *locale) +{ + return (const struct lc_time_T *) (locale)->lc_cat[LC_TIME].ptr; +} + +_ELIDABLE_INLINE const struct lc_time_T * +__get_current_time_locale (void) +{ + return (const struct lc_time_T *) + __get_current_locale ()->lc_cat[LC_TIME].ptr; +} + +_ELIDABLE_INLINE const struct lc_messages_T * +__get_messages_locale (struct __locale_t *locale) +{ + return (const struct lc_messages_T *) (locale)->lc_cat[LC_MESSAGES].ptr; +} + +_ELIDABLE_INLINE const struct lc_messages_T * +__get_current_messages_locale (void) +{ + return (const struct lc_messages_T *) + __get_current_locale ()->lc_cat[LC_MESSAGES].ptr; +} +#else /* ! __HAVE_LOCALE_INFO__ */ +_ELIDABLE_INLINE const struct lc_monetary_T * +__get_monetary_locale (struct __locale_t *locale) +{ + return &_C_monetary_locale; +} + +_ELIDABLE_INLINE const struct lc_monetary_T * +__get_current_monetary_locale (void) +{ + return &_C_monetary_locale; +} + +_ELIDABLE_INLINE const struct lc_numeric_T * +__get_numeric_locale (struct __locale_t *locale) +{ + return &_C_numeric_locale; +} + +_ELIDABLE_INLINE const struct lc_numeric_T * +__get_current_numeric_locale (void) +{ + return &_C_numeric_locale; +} + +_ELIDABLE_INLINE const struct lc_time_T * +__get_time_locale (struct __locale_t *locale) +{ + return &_C_time_locale; +} + +_ELIDABLE_INLINE const struct lc_time_T * +__get_current_time_locale (void) +{ + return &_C_time_locale; +} + +_ELIDABLE_INLINE const struct lc_messages_T * +__get_messages_locale (struct __locale_t *locale) +{ + return &_C_messages_locale; +} + +_ELIDABLE_INLINE const struct lc_messages_T * +__get_current_messages_locale (void) +{ + return &_C_messages_locale; +} +#endif /* !__HAVE_LOCALE_INFO__ */ + +_ELIDABLE_INLINE const char * +__locale_charset (struct __locale_t *locale) +{ +#ifdef __HAVE_LOCALE_INFO__ + return __get_ctype_locale (locale)->codeset; +#else + return locale->ctype_codeset; +#endif +} + +_ELIDABLE_INLINE const char * +__current_locale_charset (void) +{ +#ifdef __HAVE_LOCALE_INFO__ + return __get_current_ctype_locale ()->codeset; +#else + return __get_current_locale ()->ctype_codeset; +#endif +} + +_ELIDABLE_INLINE const char * +__locale_msgcharset (void) +{ +#ifdef __HAVE_LOCALE_INFO__ + return (char *) __get_current_messages_locale ()->codeset; +#else + return (char *) __get_current_locale ()->message_codeset; +#endif +} + +_ELIDABLE_INLINE int +__locale_cjk_lang (void) +{ + return __get_current_locale ()->cjk_lang; +} + +int __ctype_load_locale (struct __locale_t *, const char *, void *, + const char *, int); +int __monetary_load_locale (struct __locale_t *, const char *, void *, + const char *); +int __numeric_load_locale (struct __locale_t *, const char *, void *, + const char *); +int __time_load_locale (struct __locale_t *, const char *, void *, + const char *); +int __messages_load_locale (struct __locale_t *, const char *, void *, + const char *); +#ifdef __CYGWIN__ +int __collate_load_locale (struct __locale_t *, const char *, void *, + const char *); + +extern void __set_charset_from_locale (const char *locale, char *charset); +extern char *__set_locale_from_locale_alias (const char *, char *); +#endif + +__END_DECLS + +#endif /* !_SETLOCALE_H_ */ diff --git a/lib/locale/timelocal.c b/lib/locale/timelocal.c new file mode 100644 index 0000000..e3a7fd0 --- /dev/null +++ b/lib/locale/timelocal.c @@ -0,0 +1,192 @@ +/*- + * Copyright (c) 2001 Alexey Zelkin + * Copyright (c) 1997 FreeBSD Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#include "setlocale.h" + +#define LCTIME_SIZE (sizeof(struct lc_time_T) / sizeof(char *)) + +const struct lc_time_T _C_time_locale = { + { + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }, { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }, { + "Sun", "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat" + }, { + "Sunday", "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday" + }, + + /* X_fmt */ + "%H:%M:%S", + + /* + * x_fmt + * Since the C language standard calls for + * "date, using locale's date format," anything goes. + * Using just numbers (as here) makes Quakers happier; + * it's also compatible with SVR4. + */ + "%m/%d/%y", + + /* + * c_fmt + */ + "%a %b %e %H:%M:%S %Y", + + /* am pm */ + { "AM", "PM" }, + + /* date_fmt */ + "%a %b %e %H:%M:%S %Z %Y", + + /* alt_month + * Standalone months forms for %OB + */ + { + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December" + }, + + /* md_order + * Month / day order in dates + */ + "md", + + /* ampm_fmt + * To determine 12-hour clock format time (empty, if N/A) + */ + "%I:%M:%S %p", + + /* era + * Era. This and the following entries are used if the alternative + * date format is specified in strftime + */ + "", + + /* era_d_fmt + * Era date format used with the %Ex + */ + "", + + /* era_d_t_fmt + * Era date/time format (%Ec) + */ + "", + + /* era_t_fmt + * Era time format (%EX) + */ + "", + + /* alt_digits + * Alternate digits used if %O format prefix is specified + */ + "" +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + , "ASCII", /* codeset */ + { + L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", + L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec" + }, { + L"January", L"February", L"March", L"April", L"May", L"June", + L"July", L"August", L"September", L"October", L"November", + L"December" + }, { + L"Sun", L"Mon", L"Tue", L"Wed", + L"Thu", L"Fri", L"Sat" + }, { + L"Sunday", L"Monday", L"Tuesday", L"Wednesday", + L"Thursday", L"Friday", L"Saturday" + }, + L"%H:%M:%S", + L"%m/%d/%y", + L"%a %b %e %H:%M:%S %Y", + { L"AM", L"PM" }, + L"%a %b %e %H:%M:%S %Z %Y", + L"%I:%M:%S %p", + L"", + L"", + L"", + L"", + L"" +#endif +}; + +int +__time_load_locale (struct __locale_t *locale, const char *name, + void *f_wctomb, const char *charset) +{ + int ret = 0; + struct lc_time_T ti; + char *bufp = NULL; + +#ifdef __HAVE_LOCALE_INFO__ +#ifdef __CYGWIN__ + extern int __set_lc_time_from_win (const char *, const struct lc_time_T *, + struct lc_time_T *, char **, void *, + const char *); + ret = __set_lc_time_from_win (name, &_C_time_locale, &ti, &bufp, + f_wctomb, charset); + /* ret == -1: error, ret == 0: C/POSIX, ret > 0: valid */ + if (ret >= 0) + { + struct lc_time_T *tip = NULL; + + if (ret > 0) + { + tip = (struct lc_time_T *) calloc (1, sizeof *tip); + if (!tip) + { + free (bufp); + return -1; + } + *tip = ti; + } + struct __lc_cats tmp = locale->lc_cat[LC_TIME]; + locale->lc_cat[LC_TIME].ptr = ret == 0 ? &_C_time_locale : tip; + locale->lc_cat[LC_TIME].buf = bufp; + /* If buf is not NULL, both pointers have been alloc'ed */ + if (tmp.buf) + { + free ((void *) tmp.ptr); + free (tmp.buf); + } + ret = 0; + } +#else + /* TODO */ +#endif +#endif /* __HAVE_LOCALE_INFO__ */ + return (ret); +} diff --git a/lib/locale/uselocale.c b/lib/locale/uselocale.c new file mode 100644 index 0000000..799fb72 --- /dev/null +++ b/lib/locale/uselocale.c @@ -0,0 +1,79 @@ +/* +FUNCTION + <>---free resources allocated for a locale object + +INDEX + uselocale + +INDEX + _uselocale_r + +SYNOPSIS + #include + locale_t uselocale(locale_t <[locobj]>); + + locale_t _uselocale_r(void *<[reent]>, locale_t <[locobj]>); + +DESCRIPTION +The <> function shall set the current locale for the current +thread to the locale represented by newloc. + +The value for the newloc argument shall be one of the following: + +1. A value returned by the <> or <> functions + +2. The special locale object descriptor LC_GLOBAL_LOCALE + +3. (locale_t) <<0>> + +Once the <> function has been called to install a thread-local +locale, the behavior of every interface using data from the current +locale shall be affected for the calling thread. The current locale for +other threads shall remain unchanged. + +If the newloc argument is (locale_t) <<0>>, the object returned is the +current locale or LC_GLOBAL_LOCALE if there has been no previous call to +<> for the current thread. + +If the newloc argument is LC_GLOBAL_LOCALE, the thread shall use the +global locale determined by the <> function. + +RETURNS +Upon successful completion, the <> function shall return the +locale handle from the previous call for the current thread, or +LC_GLOBAL_LOCALE if there was no such previous call. Otherwise, +<> shall return (locale_t) <<0>> and set errno to indicate +the error. + + +PORTABILITY +<> is POSIX-1.2008. +*/ + +#include +#include +#include +#include "setlocale.h" + +struct __locale_t * +_uselocale_r (struct _reent *p, struct __locale_t *newloc) +{ + struct __locale_t *current_locale; + + current_locale = __get_locale_r (p); + if (!current_locale) + current_locale = LC_GLOBAL_LOCALE; + if (newloc == LC_GLOBAL_LOCALE) + _REENT_LOCALE(p) = NULL; + else if (newloc) + _REENT_LOCALE(p) = newloc; + return current_locale; +} + +#ifndef _REENT_ONLY +struct __locale_t * +uselocale (struct __locale_t *newloc) +{ + return _uselocale_r (_REENT, newloc); +} +#endif diff --git a/lib/machine/Makefile.inc b/lib/machine/Makefile.inc new file mode 100644 index 0000000..8aae2c5 --- /dev/null +++ b/lib/machine/Makefile.inc @@ -0,0 +1,174 @@ +if HAVE_LIBC_MACHINE_AARCH64 +include %D%/aarch64/Makefile.inc +endif +if HAVE_LIBC_MACHINE_AMDGCN +include %D%/amdgcn/Makefile.inc +endif +if HAVE_LIBC_MACHINE_ARC +include %D%/arc/Makefile.inc +endif +if HAVE_LIBC_MACHINE_ARM +include %D%/arm/Makefile.inc +endif +if HAVE_LIBC_MACHINE_BFIN +include %D%/bfin/Makefile.inc +endif +if HAVE_LIBC_MACHINE_CR16 +include %D%/cr16/Makefile.inc +endif +if HAVE_LIBC_MACHINE_CRIS +include %D%/cris/Makefile.inc +endif +if HAVE_LIBC_MACHINE_CRX +include %D%/crx/Makefile.inc +endif +if HAVE_LIBC_MACHINE_CSKY +include %D%/csky/Makefile.inc +endif +if HAVE_LIBC_MACHINE_D10V +include %D%/d10v/Makefile.inc +endif +if HAVE_LIBC_MACHINE_D30V +include %D%/d30v/Makefile.inc +endif +if HAVE_LIBC_MACHINE_EPIPHANY +include %D%/epiphany/Makefile.inc +endif +if HAVE_LIBC_MACHINE_FR30 +include %D%/fr30/Makefile.inc +endif +if HAVE_LIBC_MACHINE_FRV +include %D%/frv/Makefile.inc +endif +if HAVE_LIBC_MACHINE_FT32 +include %D%/ft32/Makefile.inc +endif +if HAVE_LIBC_MACHINE_H8300 +include %D%/h8300/Makefile.inc +endif +if HAVE_LIBC_MACHINE_H8500 +include %D%/h8500/Makefile.inc +endif +if HAVE_LIBC_MACHINE_HPPA +include %D%/hppa/Makefile.inc +endif +if HAVE_LIBC_MACHINE_I386 +include %D%/i386/Makefile.inc +endif +if HAVE_LIBC_MACHINE_I960 +include %D%/i960/Makefile.inc +endif +if HAVE_LIBC_MACHINE_IQ2000 +include %D%/iq2000/Makefile.inc +endif +if HAVE_LIBC_MACHINE_LM32 +include %D%/lm32/Makefile.inc +endif +if HAVE_LIBC_MACHINE_M32C +include %D%/m32c/Makefile.inc +endif +if HAVE_LIBC_MACHINE_M32R +include %D%/m32r/Makefile.inc +endif +if HAVE_LIBC_MACHINE_M68HC11 +include %D%/m68hc11/Makefile.inc +endif +if HAVE_LIBC_MACHINE_M68K +include %D%/m68k/Makefile.inc +endif +if HAVE_LIBC_MACHINE_M88K +include %D%/m88k/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MEP +include %D%/mep/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MICROBLAZE +include %D%/microblaze/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MIPS +include %D%/mips/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MN10200 +include %D%/mn10200/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MN10300 +include %D%/mn10300/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MOXIE +include %D%/moxie/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MSP430 +include %D%/msp430/Makefile.inc +endif +if HAVE_LIBC_MACHINE_MT +include %D%/mt/Makefile.inc +endif +if HAVE_LIBC_MACHINE_NDS32 +include %D%/nds32/Makefile.inc +endif +if HAVE_LIBC_MACHINE_NECV70 +include %D%/necv70/Makefile.inc +endif +if HAVE_LIBC_MACHINE_NIOS2 +include %D%/nios2/Makefile.inc +endif +if HAVE_LIBC_MACHINE_NVPTX +include %D%/nvptx/Makefile.inc +endif +if HAVE_LIBC_MACHINE_OR1K +include %D%/or1k/Makefile.inc +endif +if HAVE_LIBC_MACHINE_POWERPC +include %D%/powerpc/Makefile.inc +endif +if HAVE_LIBC_MACHINE_PRU +include %D%/pru/Makefile.inc +endif +if HAVE_LIBC_MACHINE_RISCV +include %D%/riscv/Makefile.inc +endif +if HAVE_LIBC_MACHINE_RL78 +include %D%/rl78/Makefile.inc +endif +if HAVE_LIBC_MACHINE_RX +include %D%/rx/Makefile.inc +endif +if HAVE_LIBC_MACHINE_SH +include %D%/sh/Makefile.inc +endif +if HAVE_LIBC_MACHINE_SPARC +include %D%/sparc/Makefile.inc +endif +if HAVE_LIBC_MACHINE_SPU +include %D%/spu/Makefile.inc +endif +if HAVE_LIBC_MACHINE_TIC4X +include %D%/tic4x/Makefile.inc +endif +if HAVE_LIBC_MACHINE_TIC6X +include %D%/tic6x/Makefile.inc +endif +if HAVE_LIBC_MACHINE_TIC80 +include %D%/tic80/Makefile.inc +endif +if HAVE_LIBC_MACHINE_V850 +include %D%/v850/Makefile.inc +endif +if HAVE_LIBC_MACHINE_VISIUM +include %D%/visium/Makefile.inc +endif +if HAVE_LIBC_MACHINE_W65 +include %D%/w65/Makefile.inc +endif +if HAVE_LIBC_MACHINE_X86_64 +include %D%/x86_64/Makefile.inc +endif +if HAVE_LIBC_MACHINE_XC16X +include %D%/xc16x/Makefile.inc +endif +if HAVE_LIBC_MACHINE_XSTORMY16 +include %D%/xstormy16/Makefile.inc +endif +if HAVE_LIBC_MACHINE_Z8K +include %D%/z8k/Makefile.inc +endif diff --git a/lib/machine/aarch64/Makefile.inc b/lib/machine/aarch64/Makefile.inc new file mode 100644 index 0000000..063a2a8 --- /dev/null +++ b/lib/machine/aarch64/Makefile.inc @@ -0,0 +1,32 @@ +libc_a_SOURCES += \ + %D%/memchr-stub.c \ + %D%/memchr.S \ + %D%/memcmp-stub.c \ + %D%/memcmp.S \ + %D%/memcpy-stub.c \ + %D%/memcpy.S \ + %D%/memmove-stub.c \ + %D%/memmove.S \ + %D%/memset-stub.c \ + %D%/memset.S \ + %D%/rawmemchr.S \ + %D%/rawmemchr-stub.c \ + %D%/setjmp.S \ + %D%/stpcpy-stub.c \ + %D%/stpcpy.S \ + %D%/strchr-stub.c \ + %D%/strchr.S \ + %D%/strchrnul-stub.c \ + %D%/strchrnul.S \ + %D%/strcmp-stub.c \ + %D%/strcmp.S \ + %D%/strcpy-stub.c \ + %D%/strcpy.S \ + %D%/strlen-stub.c \ + %D%/strlen.S \ + %D%/strncmp-stub.c \ + %D%/strncmp.S \ + %D%/strnlen-stub.c \ + %D%/strnlen.S \ + %D%/strrchr-stub.c \ + %D%/strrchr.S diff --git a/lib/machine/aarch64/machine/_fpmath.h b/lib/machine/aarch64/machine/_fpmath.h new file mode 100644 index 0000000..fa62ae8 --- /dev/null +++ b/lib/machine/aarch64/machine/_fpmath.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2002, 2003 David Schultz + * Copyright (2) 2014 The FreeBSD Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Change unsigned int/long used by FreeBSD to fixed width types because + * ilp32 has a different size for unsigned long. --joel (20 Aug 2022) + */ +#include + +union IEEEl2bits { + long double e; + struct { + uint64_t manl :64; + uint64_t manh :48; + uint32_t exp :15; + uint32_t sign :1; + } bits; + /* TODO andrew: Check the packing here */ + struct { + uint64_t manl :64; + uint64_t manh :48; + uint32_t expsign :16; + } xbits; +}; + +#define LDBL_NBIT 0 +#define LDBL_IMPLICIT_NBIT +#define mask_nbit_l(u) ((void)0) + +#define LDBL_MANH_SIZE 48 +#define LDBL_MANL_SIZE 64 + +#define LDBL_TO_ARRAY32(u, a) do { \ + (a)[0] = (uint32_t)(u).bits.manl; \ + (a)[1] = (uint32_t)((u).bits.manl >> 32); \ + (a)[2] = (uint32_t)(u).bits.manh; \ + (a)[3] = (uint32_t)((u).bits.manh >> 32); \ +} while(0) diff --git a/lib/machine/aarch64/machine/_types.h b/lib/machine/aarch64/machine/_types.h new file mode 100644 index 0000000..c846741 --- /dev/null +++ b/lib/machine/aarch64/machine/_types.h @@ -0,0 +1,37 @@ +/* + Copyright (c) 2012 ARM Ltd + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _MACHINE__TYPES_H +#define _MACHINE__TYPES_H + +#include + +#define __machine_ssize_t_defined +typedef long signed int _ssize_t; + +#endif /* _MACHINE__TYPES_H */ diff --git a/lib/machine/aarch64/machine/fenv-fp.h b/lib/machine/aarch64/machine/fenv-fp.h new file mode 100644 index 0000000..d8ec3fc --- /dev/null +++ b/lib/machine/aarch64/machine/fenv-fp.h @@ -0,0 +1,156 @@ +/*- + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + + +__fenv_static __inline int +feclearexcept(int __excepts) +{ + fexcept_t __r; + + __mrs_fpsr(__r); + __r &= ~__excepts; + __msr_fpsr(__r); + return (0); +} + +__fenv_static inline int +fegetexceptflag(fexcept_t *__flagp, int __excepts) +{ + fexcept_t __r; + + __mrs_fpsr(__r); + *__flagp = __r & __excepts; + return (0); +} + +__fenv_static inline int +fesetexceptflag(const fexcept_t *__flagp, int __excepts) +{ + fexcept_t __r; + + __mrs_fpsr(__r); + __r &= ~__excepts; + __r |= *__flagp & __excepts; + __msr_fpsr(__r); + return (0); +} + +__fenv_static inline int +feraiseexcept(int __excepts) +{ + fexcept_t __r; + + __mrs_fpsr(__r); + __r |= __excepts; + __msr_fpsr(__r); + return (0); +} + +__fenv_static inline int +fetestexcept(int __excepts) +{ + fexcept_t __r; + + __mrs_fpsr(__r); + return (__r & __excepts); +} + +__fenv_static inline int +fegetround(void) +{ + fenv_t __r; + + __mrs_fpcr(__r); + return ((__r >> _ROUND_SHIFT) & _ROUND_MASK); +} + +__fenv_static inline int +fesetround(int __round) +{ + fenv_t __r; + + if (__round & ~_ROUND_MASK) + return (-1); + __mrs_fpcr(__r); + __r &= ~(_ROUND_MASK << _ROUND_SHIFT); + __r |= __round << _ROUND_SHIFT; + __msr_fpcr(__r); + return (0); +} + +__fenv_static inline int +fegetenv(fenv_t *__envp) +{ + fenv_t __r; + + __mrs_fpcr(__r); + *__envp = __r & _ENABLE_MASK; + + __mrs_fpsr(__r); + *__envp |= __r & (FE_ALL_EXCEPT | (_ROUND_MASK << _ROUND_SHIFT)); + + return (0); +} + +__fenv_static inline int +feholdexcept(fenv_t *__envp) +{ + fenv_t __r; + + __mrs_fpcr(__r); + *__envp = __r & _ENABLE_MASK; + __r &= ~(_ENABLE_MASK); + __msr_fpcr(__r); + + __mrs_fpsr(__r); + *__envp |= __r & (FE_ALL_EXCEPT | (_ROUND_MASK << _ROUND_SHIFT)); + __r &= ~(_ENABLE_MASK); + __msr_fpsr(__r); + return (0); +} + +__fenv_static inline int +fesetenv(const fenv_t *__envp) +{ + + __msr_fpcr((*__envp) & _ENABLE_MASK); + __msr_fpsr((*__envp) & (FE_ALL_EXCEPT | (_ROUND_MASK << _ROUND_SHIFT))); + return (0); +} + +__fenv_static inline int +feupdateenv(const fenv_t *__envp) +{ + fexcept_t __r; + + __mrs_fpsr(__r); + fesetenv(__envp); + feraiseexcept(__r & FE_ALL_EXCEPT); + return (0); +} + diff --git a/lib/machine/aarch64/memchr-stub.c b/lib/machine/aarch64/memchr-stub.c new file mode 100644 index 0000000..dc550aa --- /dev/null +++ b/lib/machine/aarch64/memchr-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/memchr.c" +#else +/* See memchr.S */ +#endif diff --git a/lib/machine/aarch64/memchr.S b/lib/machine/aarch64/memchr.S new file mode 100644 index 0000000..53f5d6b --- /dev/null +++ b/lib/machine/aarch64/memchr.S @@ -0,0 +1,176 @@ +/* + * memchr - find a character in a memory zone + * + * Copyright (c) 2014, ARM Limited + * All rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the company nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See memchr-stub.c */ +#else +/* Assumptions: + * + * ARMv8-a, AArch64 + * Neon Available. + */ + +/* Arguments and results. */ +#define srcin x0 +#define chrin w1 +#define cntin x2 + +#define result x0 + +#define src x3 +#define tmp x4 +#define wtmp2 w5 +#define synd x6 +#define soff x9 +#define cntrem x10 + +#define vrepchr v0 +#define vdata1 v1 +#define vdata2 v2 +#define vhas_chr1 v3 +#define vhas_chr2 v4 +#define vrepmask v5 +#define vend v6 + +/* + * Core algorithm: + * + * For each 32-byte chunk we calculate a 64-bit syndrome value, with two bits + * per byte. For each tuple, bit 0 is set if the relevant byte matched the + * requested character and bit 1 is not used (faster than using a 32bit + * syndrome). Since the bits in the syndrome reflect exactly the order in which + * things occur in the original string, counting trailing zeros allows to + * identify exactly which byte has matched. + */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn memchr + /* Do not dereference srcin if no bytes to compare. */ + cbz cntin, .Lzero_length + /* + * Magic constant 0x40100401 allows us to identify which lane matches + * the requested byte. + */ + mov wtmp2, #0x0401 + movk wtmp2, #0x4010, lsl #16 + dup vrepchr.16b, chrin + /* Work with aligned 32-byte chunks */ + bic src, srcin, #31 + dup vrepmask.4s, wtmp2 + ands soff, srcin, #31 + and cntrem, cntin, #31 + b.eq .Lloop + + /* + * Input string is not 32-byte aligned. We calculate the syndrome + * value for the aligned 32 bytes block containing the first bytes + * and mask the irrelevant part. + */ + + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + sub tmp, soff, #32 + adds cntin, cntin, tmp + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + and vhas_chr1.16b, vhas_chr1.16b, vrepmask.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b + addp vend.16b, vhas_chr1.16b, vhas_chr2.16b /* 256->128 */ + addp vend.16b, vend.16b, vend.16b /* 128->64 */ + mov synd, vend.2d[0] + /* Clear the soff*2 lower bits */ + lsl tmp, soff, #1 + lsr synd, synd, tmp + lsl synd, synd, tmp + /* The first block can also be the last */ + b.ls .Lmasklast + /* Have we found something already? */ + cbnz synd, .Ltail + +.Lloop: + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + subs cntin, cntin, #32 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + /* If we're out of data we finish regardless of the result */ + b.ls .Lend + /* Use a fast check for the termination condition */ + orr vend.16b, vhas_chr1.16b, vhas_chr2.16b + addp vend.2d, vend.2d, vend.2d + mov synd, vend.2d[0] + /* We're not out of data, loop if we haven't found the character */ + cbz synd, .Lloop + +.Lend: + /* Termination condition found, let's calculate the syndrome value */ + and vhas_chr1.16b, vhas_chr1.16b, vrepmask.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b + addp vend.16b, vhas_chr1.16b, vhas_chr2.16b /* 256->128 */ + addp vend.16b, vend.16b, vend.16b /* 128->64 */ + mov synd, vend.2d[0] + /* Only do the clear for the last possible block */ + b.hi .Ltail + +.Lmasklast: + /* Clear the (32 - ((cntrem + soff) % 32)) * 2 upper bits */ + add tmp, cntrem, soff + and tmp, tmp, #31 + sub tmp, tmp, #32 + neg tmp, tmp, lsl #1 + lsl synd, synd, tmp + lsr synd, synd, tmp + +.Ltail: + /* Count the trailing zeros using bit reversing */ + rbit synd, synd + /* Compensate the last post-increment */ + sub src, src, #32 + /* Check that we have found a character */ + cmp synd, #0 + /* And count the leading zeros */ + clz synd, synd + /* Compute the potential result */ + add result, src, synd, lsr #1 + /* Select result or NULL */ + csel result, xzr, result, eq + ret + +.Lzero_length: + mov result, #0 + ret + + .size memchr, . - memchr +#endif diff --git a/lib/machine/aarch64/memcmp-stub.c b/lib/machine/aarch64/memcmp-stub.c new file mode 100644 index 0000000..a4e4876 --- /dev/null +++ b/lib/machine/aarch64/memcmp-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/memcmp.c" +#else +/* See memcmp.S */ +#endif diff --git a/lib/machine/aarch64/memcmp.S b/lib/machine/aarch64/memcmp.S new file mode 100644 index 0000000..605d993 --- /dev/null +++ b/lib/machine/aarch64/memcmp.S @@ -0,0 +1,196 @@ +/* memcmp - compare memory + + Copyright (c) 2018 Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* + * Copyright (c) 2017 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See memcmp-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses. + */ + +#define L(l) .L ## l + +/* Parameters and result. */ +#define src1 x0 +#define src2 x1 +#define limit x2 +#define result w0 + +/* Internal variables. */ +#define data1 x3 +#define data1w w3 +#define data1h x4 +#define data2 x5 +#define data2w w5 +#define data2h x6 +#define tmp1 x7 +#define tmp2 x8 + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn memcmp p2align=6 + subs limit, limit, 8 + b.lo L(less8) + + ldr data1, [src1], 8 + ldr data2, [src2], 8 + cmp data1, data2 + b.ne L(return) + + subs limit, limit, 8 + b.gt L(more16) + + ldr data1, [src1, limit] + ldr data2, [src2, limit] + b L(return) + +L(more16): + ldr data1, [src1], 8 + ldr data2, [src2], 8 + cmp data1, data2 + bne L(return) + + /* Jump directly to comparing the last 16 bytes for 32 byte (or less) + strings. */ + subs limit, limit, 16 + b.ls L(last_bytes) + + /* We overlap loads between 0-32 bytes at either side of SRC1 when we + try to align, so limit it only to strings larger than 128 bytes. */ + cmp limit, 96 + b.ls L(loop16) + + /* Align src1 and adjust src2 with bytes not yet done. */ + and tmp1, src1, 15 + add limit, limit, tmp1 + sub src1, src1, tmp1 + sub src2, src2, tmp1 + + /* Loop performing 16 bytes per iteration using aligned src1. + Limit is pre-decremented by 16 and must be larger than zero. + Exit if <= 16 bytes left to do or if the data is not equal. */ + .p2align 4 +L(loop16): + ldp data1, data1h, [src1], 16 + ldp data2, data2h, [src2], 16 + subs limit, limit, 16 + ccmp data1, data2, 0, hi + ccmp data1h, data2h, 0, eq + b.eq L(loop16) + + cmp data1, data2 + bne L(return) + mov data1, data1h + mov data2, data2h + cmp data1, data2 + bne L(return) + + /* Compare last 1-16 bytes using unaligned access. */ +L(last_bytes): + add src1, src1, limit + add src2, src2, limit + ldp data1, data1h, [src1] + ldp data2, data2h, [src2] + cmp data1, data2 + bne L(return) + mov data1, data1h + mov data2, data2h + cmp data1, data2 + + /* Compare data bytes and set return value to 0, -1 or 1. */ +L(return): +#ifndef __AARCH64EB__ + rev data1, data1 + rev data2, data2 +#endif + cmp data1, data2 +L(ret_eq): + cset result, ne + cneg result, result, lo + ret + + .p2align 4 + /* Compare up to 8 bytes. Limit is [-8..-1]. */ +L(less8): + adds limit, limit, 4 + b.lo L(less4) + ldr data1w, [src1], 4 + ldr data2w, [src2], 4 + cmp data1w, data2w + b.ne L(return) + sub limit, limit, 4 +L(less4): + adds limit, limit, 4 + beq L(ret_eq) +L(byte_loop): + ldrb data1w, [src1], 1 + ldrb data2w, [src2], 1 + subs limit, limit, 1 + ccmp data1w, data2w, 0, ne /* NZCV = 0b0000. */ + b.eq L(byte_loop) + sub result, data1w, data2w + ret + + .size memcmp, . - memcmp +#endif diff --git a/lib/machine/aarch64/memcpy-stub.c b/lib/machine/aarch64/memcpy-stub.c new file mode 100644 index 0000000..cd6d72a --- /dev/null +++ b/lib/machine/aarch64/memcpy-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2012-2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/memcpy.c" +#else +/* See memcpy.S */ +#endif diff --git a/lib/machine/aarch64/memcpy.S b/lib/machine/aarch64/memcpy.S new file mode 100644 index 0000000..463bad0 --- /dev/null +++ b/lib/machine/aarch64/memcpy.S @@ -0,0 +1,230 @@ +/* Copyright (c) 2012-2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses. + * + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See memcpy-stub.c */ +#else + +#define dstin x0 +#define src x1 +#define count x2 +#define dst x3 +#define srcend x4 +#define dstend x5 +#define A_l x6 +#define A_lw w6 +#define A_h x7 +#define A_hw w7 +#define B_l x8 +#define B_lw w8 +#define B_h x9 +#define C_l x10 +#define C_h x11 +#define D_l x12 +#define D_h x13 +#define E_l src +#define E_h count +#define F_l srcend +#define F_h dst +#define tmp1 x9 + +#define L(l) .L ## l + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +/* Copies are split into 3 main cases: small copies of up to 16 bytes, + medium copies of 17..96 bytes which are fully unrolled. Large copies + of more than 96 bytes align the destination and use an unrolled loop + processing 64 bytes per iteration. + Small and medium copies read all data before writing, allowing any + kind of overlap, and memmove tailcalls memcpy for these cases as + well as non-overlapping copies. +*/ + +def_fn memcpy p2align=6 + prfm PLDL1KEEP, [src] + add srcend, src, count + add dstend, dstin, count + cmp count, 16 + b.ls L(copy16) + cmp count, 96 + b.hi L(copy_long) + + /* Medium copies: 17..96 bytes. */ + sub tmp1, count, 1 + ldp A_l, A_h, [src] + tbnz tmp1, 6, L(copy96) + ldp D_l, D_h, [srcend, -16] + tbz tmp1, 5, 1f + ldp B_l, B_h, [src, 16] + ldp C_l, C_h, [srcend, -32] + stp B_l, B_h, [dstin, 16] + stp C_l, C_h, [dstend, -32] +1: + stp A_l, A_h, [dstin] + stp D_l, D_h, [dstend, -16] + ret + + .p2align 4 + /* Small copies: 0..16 bytes. */ +L(copy16): + cmp count, 8 + b.lo 1f + ldr A_l, [src] + ldr A_h, [srcend, -8] + str A_l, [dstin] + str A_h, [dstend, -8] + ret + .p2align 4 +1: + tbz count, 2, 1f + ldr A_lw, [src] + ldr A_hw, [srcend, -4] + str A_lw, [dstin] + str A_hw, [dstend, -4] + ret + + /* Copy 0..3 bytes. Use a branchless sequence that copies the same + byte 3 times if count==1, or the 2nd byte twice if count==2. */ +1: + cbz count, 2f + lsr tmp1, count, 1 + ldrb A_lw, [src] + ldrb A_hw, [srcend, -1] + ldrb B_lw, [src, tmp1] + strb A_lw, [dstin] + strb B_lw, [dstin, tmp1] + strb A_hw, [dstend, -1] +2: ret + + .p2align 4 + /* Copy 64..96 bytes. Copy 64 bytes from the start and + 32 bytes from the end. */ +L(copy96): + ldp B_l, B_h, [src, 16] + ldp C_l, C_h, [src, 32] + ldp D_l, D_h, [src, 48] + ldp E_l, E_h, [srcend, -32] + ldp F_l, F_h, [srcend, -16] + stp A_l, A_h, [dstin] + stp B_l, B_h, [dstin, 16] + stp C_l, C_h, [dstin, 32] + stp D_l, D_h, [dstin, 48] + stp E_l, E_h, [dstend, -32] + stp F_l, F_h, [dstend, -16] + ret + + /* Align DST to 16 byte alignment so that we don't cross cache line + boundaries on both loads and stores. There are at least 96 bytes + to copy, so copy 16 bytes unaligned and then align. The loop + copies 64 bytes per iteration and prefetches one iteration ahead. */ + + .p2align 4 +L(copy_long): + and tmp1, dstin, 15 + bic dst, dstin, 15 + ldp D_l, D_h, [src] + sub src, src, tmp1 + add count, count, tmp1 /* Count is now 16 too large. */ + ldp A_l, A_h, [src, 16] + stp D_l, D_h, [dstin] + ldp B_l, B_h, [src, 32] + ldp C_l, C_h, [src, 48] + ldp D_l, D_h, [src, 64]! + subs count, count, 128 + 16 /* Test and readjust count. */ + b.ls 2f +1: + stp A_l, A_h, [dst, 16] + ldp A_l, A_h, [src, 16] + stp B_l, B_h, [dst, 32] + ldp B_l, B_h, [src, 32] + stp C_l, C_h, [dst, 48] + ldp C_l, C_h, [src, 48] + stp D_l, D_h, [dst, 64]! + ldp D_l, D_h, [src, 64]! + subs count, count, 64 + b.hi 1b + + /* Write the last full set of 64 bytes. The remainder is at most 64 + bytes, so it is safe to always copy 64 bytes from the end even if + there is just 1 byte left. */ +2: + ldp E_l, E_h, [srcend, -64] + stp A_l, A_h, [dst, 16] + ldp A_l, A_h, [srcend, -48] + stp B_l, B_h, [dst, 32] + ldp B_l, B_h, [srcend, -32] + stp C_l, C_h, [dst, 48] + ldp C_l, C_h, [srcend, -16] + stp D_l, D_h, [dst, 64] + stp E_l, E_h, [dstend, -64] + stp A_l, A_h, [dstend, -48] + stp B_l, B_h, [dstend, -32] + stp C_l, C_h, [dstend, -16] + ret + + .size memcpy, . - memcpy +#endif diff --git a/lib/machine/aarch64/memmove-stub.c b/lib/machine/aarch64/memmove-stub.c new file mode 100644 index 0000000..8fa4ab9 --- /dev/null +++ b/lib/machine/aarch64/memmove-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/memmove.c" +#else +/* See memmove.S */ +#endif diff --git a/lib/machine/aarch64/memmove.S b/lib/machine/aarch64/memmove.S new file mode 100644 index 0000000..597a8c8 --- /dev/null +++ b/lib/machine/aarch64/memmove.S @@ -0,0 +1,155 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See memmove-stub.c */ +#else + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +/* Parameters and result. */ +#define dstin x0 +#define src x1 +#define count x2 +#define srcend x3 +#define dstend x4 +#define tmp1 x5 +#define A_l x6 +#define A_h x7 +#define B_l x8 +#define B_h x9 +#define C_l x10 +#define C_h x11 +#define D_l x12 +#define D_h x13 +#define E_l count +#define E_h tmp1 + +/* All memmoves up to 96 bytes are done by memcpy as it supports overlaps. + Larger backwards copies are also handled by memcpy. The only remaining + case is forward large copies. The destination is aligned, and an + unrolled loop processes 64 bytes per iteration. +*/ + +def_fn memmove, 6 + sub tmp1, dstin, src + cmp count, 96 + ccmp tmp1, count, 2, hi + b.hs memcpy + + cbz tmp1, 3f + add dstend, dstin, count + add srcend, src, count + + /* Align dstend to 16 byte alignment so that we don't cross cache line + boundaries on both loads and stores. There are at least 96 bytes + to copy, so copy 16 bytes unaligned and then align. The loop + copies 64 bytes per iteration and prefetches one iteration ahead. */ + + and tmp1, dstend, 15 + ldp D_l, D_h, [srcend, -16] + sub srcend, srcend, tmp1 + sub count, count, tmp1 + ldp A_l, A_h, [srcend, -16] + stp D_l, D_h, [dstend, -16] + ldp B_l, B_h, [srcend, -32] + ldp C_l, C_h, [srcend, -48] + ldp D_l, D_h, [srcend, -64]! + sub dstend, dstend, tmp1 + subs count, count, 128 + b.ls 2f + nop +1: + stp A_l, A_h, [dstend, -16] + ldp A_l, A_h, [srcend, -16] + stp B_l, B_h, [dstend, -32] + ldp B_l, B_h, [srcend, -32] + stp C_l, C_h, [dstend, -48] + ldp C_l, C_h, [srcend, -48] + stp D_l, D_h, [dstend, -64]! + ldp D_l, D_h, [srcend, -64]! + subs count, count, 64 + b.hi 1b + + /* Write the last full set of 64 bytes. The remainder is at most 64 + bytes, so it is safe to always copy 64 bytes from the start even if + there is just 1 byte left. */ +2: + ldp E_l, E_h, [src, 48] + stp A_l, A_h, [dstend, -16] + ldp A_l, A_h, [src, 32] + stp B_l, B_h, [dstend, -32] + ldp B_l, B_h, [src, 16] + stp C_l, C_h, [dstend, -48] + ldp C_l, C_h, [src] + stp D_l, D_h, [dstend, -64] + stp E_l, E_h, [dstin, 48] + stp A_l, A_h, [dstin, 32] + stp B_l, B_h, [dstin, 16] + stp C_l, C_h, [dstin] +3: ret + + .size memmove, . - memmove +#endif diff --git a/lib/machine/aarch64/memset-stub.c b/lib/machine/aarch64/memset-stub.c new file mode 100644 index 0000000..7defee8 --- /dev/null +++ b/lib/machine/aarch64/memset-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2012-2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/memset.c" +#else +/* See memset.S */ +#endif diff --git a/lib/machine/aarch64/memset.S b/lib/machine/aarch64/memset.S new file mode 100644 index 0000000..103e3f8 --- /dev/null +++ b/lib/machine/aarch64/memset.S @@ -0,0 +1,240 @@ +/* Copyright (c) 2012-2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses + * + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See memset-stub.c */ +#else + +#define dstin x0 +#define val x1 +#define valw w1 +#define count x2 +#define dst x3 +#define dstend x4 +#define tmp1 x5 +#define tmp1w w5 +#define tmp2 x6 +#define tmp2w w6 +#define zva_len x7 +#define zva_lenw w7 + +#define L(l) .L ## l + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn memset p2align=6 + + dup v0.16B, valw + add dstend, dstin, count + + cmp count, 96 + b.hi L(set_long) + cmp count, 16 + b.hs L(set_medium) + mov val, v0.D[0] + + /* Set 0..15 bytes. */ + tbz count, 3, 1f + str val, [dstin] + str val, [dstend, -8] + ret + nop +1: tbz count, 2, 2f + str valw, [dstin] + str valw, [dstend, -4] + ret +2: cbz count, 3f + strb valw, [dstin] + tbz count, 1, 3f + strh valw, [dstend, -2] +3: ret + + /* Set 17..96 bytes. */ +L(set_medium): + str q0, [dstin] + tbnz count, 6, L(set96) + str q0, [dstend, -16] + tbz count, 5, 1f + str q0, [dstin, 16] + str q0, [dstend, -32] +1: ret + + .p2align 4 + /* Set 64..96 bytes. Write 64 bytes from the start and + 32 bytes from the end. */ +L(set96): + str q0, [dstin, 16] + stp q0, q0, [dstin, 32] + stp q0, q0, [dstend, -32] + ret + + .p2align 3 + nop +L(set_long): + and valw, valw, 255 + bic dst, dstin, 15 + str q0, [dstin] + cmp count, 256 + ccmp valw, 0, 0, cs + b.eq L(try_zva) +L(no_zva): + sub count, dstend, dst /* Count is 16 too large. */ + sub dst, dst, 16 /* Dst is biased by -32. */ + sub count, count, 64 + 16 /* Adjust count and bias for loop. */ +1: stp q0, q0, [dst, 32] + stp q0, q0, [dst, 64]! +L(tail64): + subs count, count, 64 + b.hi 1b +2: stp q0, q0, [dstend, -64] + stp q0, q0, [dstend, -32] + ret + + .p2align 3 +L(try_zva): + mrs tmp1, dczid_el0 + tbnz tmp1w, 4, L(no_zva) + and tmp1w, tmp1w, 15 + cmp tmp1w, 4 /* ZVA size is 64 bytes. */ + b.ne L(zva_128) + + /* Write the first and last 64 byte aligned block using stp rather + than using DC ZVA. This is faster on some cores. + */ +L(zva_64): + str q0, [dst, 16] + stp q0, q0, [dst, 32] + bic dst, dst, 63 + stp q0, q0, [dst, 64] + stp q0, q0, [dst, 96] + sub count, dstend, dst /* Count is now 128 too large. */ + sub count, count, 128+64+64 /* Adjust count and bias for loop. */ + add dst, dst, 128 + nop +1: dc zva, dst + add dst, dst, 64 + subs count, count, 64 + b.hi 1b + stp q0, q0, [dst, 0] + stp q0, q0, [dst, 32] + stp q0, q0, [dstend, -64] + stp q0, q0, [dstend, -32] + ret + + .p2align 3 +L(zva_128): + cmp tmp1w, 5 /* ZVA size is 128 bytes. */ + b.ne L(zva_other) + + str q0, [dst, 16] + stp q0, q0, [dst, 32] + stp q0, q0, [dst, 64] + stp q0, q0, [dst, 96] + bic dst, dst, 127 + sub count, dstend, dst /* Count is now 128 too large. */ + sub count, count, 128+128 /* Adjust count and bias for loop. */ + add dst, dst, 128 +1: dc zva, dst + add dst, dst, 128 + subs count, count, 128 + b.hi 1b + stp q0, q0, [dstend, -128] + stp q0, q0, [dstend, -96] + stp q0, q0, [dstend, -64] + stp q0, q0, [dstend, -32] + ret + +L(zva_other): + mov tmp2w, 4 + lsl zva_lenw, tmp2w, tmp1w + add tmp1, zva_len, 64 /* Max alignment bytes written. */ + cmp count, tmp1 + blo L(no_zva) + + sub tmp2, zva_len, 1 + add tmp1, dst, zva_len + add dst, dst, 16 + subs count, tmp1, dst /* Actual alignment bytes to write. */ + bic tmp1, tmp1, tmp2 /* Aligned dc zva start address. */ + beq 2f +1: stp q0, q0, [dst], 64 + stp q0, q0, [dst, -32] + subs count, count, 64 + b.hi 1b +2: mov dst, tmp1 + sub count, dstend, tmp1 /* Remaining bytes to write. */ + subs count, count, zva_len + b.lo 4f +3: dc zva, dst + add dst, dst, zva_len + subs count, count, zva_len + b.hs 3b +4: add count, count, zva_len + sub dst, dst, 32 /* Bias dst for tail loop. */ + b L(tail64) + + .size memset, . - memset +#endif diff --git a/lib/machine/aarch64/rawmemchr-stub.c b/lib/machine/aarch64/rawmemchr-stub.c new file mode 100644 index 0000000..4449412 --- /dev/null +++ b/lib/machine/aarch64/rawmemchr-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2015-2016, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/rawmemchr.c" +#else +/* See rawmemchr.S. */ +#endif diff --git a/lib/machine/aarch64/rawmemchr.S b/lib/machine/aarch64/rawmemchr.S new file mode 100644 index 0000000..26da810 --- /dev/null +++ b/lib/machine/aarch64/rawmemchr.S @@ -0,0 +1,68 @@ +/* Copyright (c) 2015-2016, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses + * + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See rawmemchr-stub.c. */ +#else + +#define L(l) .L ## l + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +/* Special case rawmemchr (s, 0) as strlen, otherwise tailcall memchr. + Call strlen without setting up a full frame - it preserves x14/x15. +*/ + +def_fn rawmemchr p2align=5 + .cfi_startproc + cbz w1, L(do_strlen) + mov x2, -1 + b memchr + +L(do_strlen): + mov x15, x30 + .cfi_return_column x15 + mov x14, x0 + bl strlen + add x0, x14, x0 + ret x15 + .cfi_endproc + + .size rawmemchr, . - rawmemchr +#endif + diff --git a/lib/machine/aarch64/setjmp.S b/lib/machine/aarch64/setjmp.S new file mode 100644 index 0000000..0856145 --- /dev/null +++ b/lib/machine/aarch64/setjmp.S @@ -0,0 +1,74 @@ +/* + Copyright (c) 2011, 2012 ARM Ltd + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#define GPR_LAYOUT \ + REG_PAIR (x19, x20, 0); \ + REG_PAIR (x21, x22, 16); \ + REG_PAIR (x23, x24, 32); \ + REG_PAIR (x25, x26, 48); \ + REG_PAIR (x27, x28, 64); \ + REG_PAIR (x29, x30, 80); \ + REG_ONE (x16, 96) + +#define FPR_LAYOUT \ + REG_PAIR ( d8, d9, 112); \ + REG_PAIR (d10, d11, 128); \ + REG_PAIR (d12, d13, 144); \ + REG_PAIR (d14, d15, 160); + +// int setjmp (jmp_buf) + .global setjmp + .type setjmp, %function +setjmp: + mov x16, sp +#define REG_PAIR(REG1, REG2, OFFS) stp REG1, REG2, [x0, OFFS] +#define REG_ONE(REG1, OFFS) str REG1, [x0, OFFS] + GPR_LAYOUT + FPR_LAYOUT +#undef REG_PAIR +#undef REG_ONE + mov w0, #0 + ret + .size setjmp, .-setjmp + +// void longjmp (jmp_buf, int) __attribute__ ((noreturn)) + .global longjmp + .type longjmp, %function +longjmp: +#define REG_PAIR(REG1, REG2, OFFS) ldp REG1, REG2, [x0, OFFS] +#define REG_ONE(REG1, OFFS) ldr REG1, [x0, OFFS] + GPR_LAYOUT + FPR_LAYOUT +#undef REG_PAIR +#undef REG_ONE + mov sp, x16 + cmp w1, #0 + cinc w0, w1, eq + // use br not ret, as ret is guaranteed to mispredict + br x30 + .size longjmp, .-longjmp diff --git a/lib/machine/aarch64/stpcpy-stub.c b/lib/machine/aarch64/stpcpy-stub.c new file mode 100644 index 0000000..bfaba5c --- /dev/null +++ b/lib/machine/aarch64/stpcpy-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2015, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/stpcpy.c" +#else +/* See stpcpy.S */ +#endif diff --git a/lib/machine/aarch64/stpcpy.S b/lib/machine/aarch64/stpcpy.S new file mode 100644 index 0000000..696b458 --- /dev/null +++ b/lib/machine/aarch64/stpcpy.S @@ -0,0 +1,34 @@ +/* + stpcpy - copy a string returning pointer to end. + + Copyright (c) 2015 ARM Ltd. + All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* This is just a wrapper that uses strcpy code with appropriate + pre-defines. */ + +#define BUILD_STPCPY +#include "strcpy.S" diff --git a/lib/machine/aarch64/strchr-stub.c b/lib/machine/aarch64/strchr-stub.c new file mode 100644 index 0000000..3f9ec2d --- /dev/null +++ b/lib/machine/aarch64/strchr-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2014, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strchr.c" +#else +/* See strchr.S */ +#endif diff --git a/lib/machine/aarch64/strchr.S b/lib/machine/aarch64/strchr.S new file mode 100644 index 0000000..2448dbc --- /dev/null +++ b/lib/machine/aarch64/strchr.S @@ -0,0 +1,164 @@ +/* + strchr - find a character in a string + + Copyright (c) 2014, ARM Limited + All rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strchr-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64 + * Neon Available. + */ + +/* Arguments and results. */ +#define srcin x0 +#define chrin w1 + +#define result x0 + +#define src x2 +#define tmp1 x3 +#define wtmp2 w4 +#define tmp3 x5 + +#define vrepchr v0 +#define vdata1 v1 +#define vdata2 v2 +#define vhas_nul1 v3 +#define vhas_nul2 v4 +#define vhas_chr1 v5 +#define vhas_chr2 v6 +#define vrepmask_0 v7 +#define vrepmask_c v16 +#define vend1 v17 +#define vend2 v18 + +/* Core algorithm. + + For each 32-byte hunk we calculate a 64-bit syndrome value, with + two bits per byte (LSB is always in bits 0 and 1, for both big + and little-endian systems). For each tuple, bit 0 is set iff + the relevant byte matched the requested character; bit 1 is set + iff the relevant byte matched the NUL end of string (we trigger + off bit0 for the special case of looking for NUL). Since the bits + in the syndrome reflect exactly the order in which things occur + in the original string a count_trailing_zeros() operation will + identify exactly which byte is causing the termination, and why. */ + +/* Locals and temporaries. */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn strchr + /* Magic constant 0x40100401 to allow us to identify which lane + matches the requested byte. Magic constant 0x80200802 used + similarly for NUL termination. */ + mov wtmp2, #0x0401 + movk wtmp2, #0x4010, lsl #16 + dup vrepchr.16b, chrin + bic src, srcin, #31 /* Work with aligned 32-byte hunks. */ + dup vrepmask_c.4s, wtmp2 + ands tmp1, srcin, #31 + add vrepmask_0.4s, vrepmask_c.4s, vrepmask_c.4s /* equiv: lsl #1 */ + b.eq .Lloop + + /* Input string is not 32-byte aligned. Rather than forcing + the padding bytes to a safe value, we calculate the syndrome + for all the bytes, but then mask off those bits of the + syndrome that are related to the padding. */ + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + neg tmp1, tmp1 + cmeq vhas_nul1.16b, vdata1.16b, #0 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_nul2.16b, vdata2.16b, #0 + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + and vhas_nul1.16b, vhas_nul1.16b, vrepmask_0.16b + and vhas_nul2.16b, vhas_nul2.16b, vrepmask_0.16b + and vhas_chr1.16b, vhas_chr1.16b, vrepmask_c.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask_c.16b + orr vend1.16b, vhas_nul1.16b, vhas_chr1.16b + orr vend2.16b, vhas_nul2.16b, vhas_chr2.16b + lsl tmp1, tmp1, #1 + addp vend1.16b, vend1.16b, vend2.16b // 256->128 + mov tmp3, #~0 + addp vend1.16b, vend1.16b, vend2.16b // 128->64 + lsr tmp1, tmp3, tmp1 + + mov tmp3, vend1.2d[0] + bic tmp1, tmp3, tmp1 // Mask padding bits. + cbnz tmp1, .Ltail + +.Lloop: + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + cmeq vhas_nul1.16b, vdata1.16b, #0 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_nul2.16b, vdata2.16b, #0 + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + /* Use a fast check for the termination condition. */ + orr vend1.16b, vhas_nul1.16b, vhas_chr1.16b + orr vend2.16b, vhas_nul2.16b, vhas_chr2.16b + orr vend1.16b, vend1.16b, vend2.16b + addp vend1.2d, vend1.2d, vend1.2d + mov tmp1, vend1.2d[0] + cbz tmp1, .Lloop + + /* Termination condition found. Now need to establish exactly why + we terminated. */ + and vhas_nul1.16b, vhas_nul1.16b, vrepmask_0.16b + and vhas_nul2.16b, vhas_nul2.16b, vrepmask_0.16b + and vhas_chr1.16b, vhas_chr1.16b, vrepmask_c.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask_c.16b + orr vend1.16b, vhas_nul1.16b, vhas_chr1.16b + orr vend2.16b, vhas_nul2.16b, vhas_chr2.16b + addp vend1.16b, vend1.16b, vend2.16b // 256->128 + addp vend1.16b, vend1.16b, vend2.16b // 128->64 + + mov tmp1, vend1.2d[0] +.Ltail: + /* Count the trailing zeros, by bit reversing... */ + rbit tmp1, tmp1 + /* Re-bias source. */ + sub src, src, #32 + clz tmp1, tmp1 /* And counting the leading zeros. */ + /* Tmp1 is even if the target charager was found first. Otherwise + we've found the end of string and we weren't looking for NUL. */ + tst tmp1, #1 + add result, src, tmp1, lsr #1 + csel result, result, xzr, eq + ret + + .size strchr, . - strchr +#endif diff --git a/lib/machine/aarch64/strchrnul-stub.c b/lib/machine/aarch64/strchrnul-stub.c new file mode 100644 index 0000000..b47e92d --- /dev/null +++ b/lib/machine/aarch64/strchrnul-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2014, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strchrnul.c" +#else +/* See strchrnul.S */ +#endif diff --git a/lib/machine/aarch64/strchrnul.S b/lib/machine/aarch64/strchrnul.S new file mode 100644 index 0000000..a0ac13b --- /dev/null +++ b/lib/machine/aarch64/strchrnul.S @@ -0,0 +1,149 @@ +/* + strchrnul - find a character or nul in a string + + Copyright (c) 2014, ARM Limited + All rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strchrnul-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64 + * Neon Available. + */ + +/* Arguments and results. */ +#define srcin x0 +#define chrin w1 + +#define result x0 + +#define src x2 +#define tmp1 x3 +#define wtmp2 w4 +#define tmp3 x5 + +#define vrepchr v0 +#define vdata1 v1 +#define vdata2 v2 +#define vhas_nul1 v3 +#define vhas_nul2 v4 +#define vhas_chr1 v5 +#define vhas_chr2 v6 +#define vrepmask v7 +#define vend1 v16 + +/* Core algorithm. + + For each 32-byte hunk we calculate a 64-bit syndrome value, with + two bits per byte (LSB is always in bits 0 and 1, for both big + and little-endian systems). For each tuple, bit 0 is set iff + the relevant byte matched the requested character or nul. Since the + bits in the syndrome reflect exactly the order in which things occur + in the original string a count_trailing_zeros() operation will + identify exactly which byte is causing the termination. */ + +/* Locals and temporaries. */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn strchrnul + /* Magic constant 0x40100401 to allow us to identify which lane + matches the termination condition. */ + mov wtmp2, #0x0401 + movk wtmp2, #0x4010, lsl #16 + dup vrepchr.16b, chrin + bic src, srcin, #31 /* Work with aligned 32-byte hunks. */ + dup vrepmask.4s, wtmp2 + ands tmp1, srcin, #31 + b.eq .Lloop + + /* Input string is not 32-byte aligned. Rather than forcing + the padding bytes to a safe value, we calculate the syndrome + for all the bytes, but then mask off those bits of the + syndrome that are related to the padding. */ + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + neg tmp1, tmp1 + cmeq vhas_nul1.16b, vdata1.16b, #0 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_nul2.16b, vdata2.16b, #0 + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + orr vhas_chr1.16b, vhas_chr1.16b, vhas_nul1.16b + orr vhas_chr2.16b, vhas_chr2.16b, vhas_nul2.16b + and vhas_chr1.16b, vhas_chr1.16b, vrepmask.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b + lsl tmp1, tmp1, #1 + addp vend1.16b, vhas_chr1.16b, vhas_chr2.16b // 256->128 + mov tmp3, #~0 + addp vend1.16b, vend1.16b, vend1.16b // 128->64 + lsr tmp1, tmp3, tmp1 + + mov tmp3, vend1.2d[0] + bic tmp1, tmp3, tmp1 // Mask padding bits. + cbnz tmp1, .Ltail + +.Lloop: + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + cmeq vhas_nul1.16b, vdata1.16b, #0 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_nul2.16b, vdata2.16b, #0 + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + /* Use a fast check for the termination condition. */ + orr vhas_chr1.16b, vhas_nul1.16b, vhas_chr1.16b + orr vhas_chr2.16b, vhas_nul2.16b, vhas_chr2.16b + orr vend1.16b, vhas_chr1.16b, vhas_chr2.16b + addp vend1.2d, vend1.2d, vend1.2d + mov tmp1, vend1.2d[0] + cbz tmp1, .Lloop + + /* Termination condition found. Now need to establish exactly why + we terminated. */ + and vhas_chr1.16b, vhas_chr1.16b, vrepmask.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b + addp vend1.16b, vhas_chr1.16b, vhas_chr2.16b // 256->128 + addp vend1.16b, vend1.16b, vend1.16b // 128->64 + + mov tmp1, vend1.2d[0] +.Ltail: + /* Count the trailing zeros, by bit reversing... */ + rbit tmp1, tmp1 + /* Re-bias source. */ + sub src, src, #32 + clz tmp1, tmp1 /* ... and counting the leading zeros. */ + /* tmp1 is twice the offset into the fragment. */ + add result, src, tmp1, lsr #1 + ret + + .size strchrnul, . - strchrnul +#endif diff --git a/lib/machine/aarch64/strcmp-stub.c b/lib/machine/aarch64/strcmp-stub.c new file mode 100644 index 0000000..871a241 --- /dev/null +++ b/lib/machine/aarch64/strcmp-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2012-2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strcmp.c" +#else +/* See strcmp.S */ +#endif diff --git a/lib/machine/aarch64/strcmp.S b/lib/machine/aarch64/strcmp.S new file mode 100644 index 0000000..e2bef2d --- /dev/null +++ b/lib/machine/aarch64/strcmp.S @@ -0,0 +1,202 @@ +/* Copyright (c) 2012-2018, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* Assumptions: + * + * ARMv8-a, AArch64 + */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strcmp-stub.c */ +#else + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +#define L(label) .L ## label + +#define REP8_01 0x0101010101010101 +#define REP8_7f 0x7f7f7f7f7f7f7f7f +#define REP8_80 0x8080808080808080 + +/* Parameters and result. */ +#define src1 x0 +#define src2 x1 +#define result x0 + +/* Internal variables. */ +#define data1 x2 +#define data1w w2 +#define data2 x3 +#define data2w w3 +#define has_nul x4 +#define diff x5 +#define syndrome x6 +#define tmp1 x7 +#define tmp2 x8 +#define tmp3 x9 +#define zeroones x10 +#define pos x11 + + /* Start of performance-critical section -- one 64B cache line. */ +def_fn strcmp p2align=6 + eor tmp1, src1, src2 + mov zeroones, #REP8_01 + tst tmp1, #7 + b.ne L(misaligned8) + ands tmp1, src1, #7 + b.ne L(mutual_align) + /* NUL detection works on the principle that (X - 1) & (~X) & 0x80 + (=> (X - 1) & ~(X | 0x7f)) is non-zero iff a byte is zero, and + can be done in parallel across the entire word. */ +L(loop_aligned): + ldr data1, [src1], #8 + ldr data2, [src2], #8 +L(start_realigned): + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + eor diff, data1, data2 /* Non-zero if differences found. */ + bic has_nul, tmp1, tmp2 /* Non-zero if NUL terminator. */ + orr syndrome, diff, has_nul + cbz syndrome, L(loop_aligned) + /* End of performance-critical section -- one 64B cache line. */ + +L(end): +#ifndef __AARCH64EB__ + rev syndrome, syndrome + rev data1, data1 + /* The MS-non-zero bit of the syndrome marks either the first bit + that is different, or the top bit of the first zero byte. + Shifting left now will bring the critical information into the + top bits. */ + clz pos, syndrome + rev data2, data2 + lsl data1, data1, pos + lsl data2, data2, pos + /* But we need to zero-extend (char is unsigned) the value and then + perform a signed 32-bit subtraction. */ + lsr data1, data1, #56 + sub result, data1, data2, lsr #56 + ret +#else + /* For big-endian we cannot use the trick with the syndrome value + as carry-propagation can corrupt the upper bits if the trailing + bytes in the string contain 0x01. */ + /* However, if there is no NUL byte in the dword, we can generate + the result directly. We can't just subtract the bytes as the + MSB might be significant. */ + cbnz has_nul, 1f + cmp data1, data2 + cset result, ne + cneg result, result, lo + ret +1: + /* Re-compute the NUL-byte detection, using a byte-reversed value. */ + rev tmp3, data1 + sub tmp1, tmp3, zeroones + orr tmp2, tmp3, #REP8_7f + bic has_nul, tmp1, tmp2 + rev has_nul, has_nul + orr syndrome, diff, has_nul + clz pos, syndrome + /* The MS-non-zero bit of the syndrome marks either the first bit + that is different, or the top bit of the first zero byte. + Shifting left now will bring the critical information into the + top bits. */ + lsl data1, data1, pos + lsl data2, data2, pos + /* But we need to zero-extend (char is unsigned) the value and then + perform a signed 32-bit subtraction. */ + lsr data1, data1, #56 + sub result, data1, data2, lsr #56 + ret +#endif + +L(mutual_align): + /* Sources are mutually aligned, but are not currently at an + alignment boundary. Round down the addresses and then mask off + the bytes that preceed the start point. */ + bic src1, src1, #7 + bic src2, src2, #7 + lsl tmp1, tmp1, #3 /* Bytes beyond alignment -> bits. */ + ldr data1, [src1], #8 + neg tmp1, tmp1 /* Bits to alignment -64. */ + ldr data2, [src2], #8 + mov tmp2, #~0 +#ifdef __AARCH64EB__ + /* Big-endian. Early bytes are at MSB. */ + lsl tmp2, tmp2, tmp1 /* Shift (tmp1 & 63). */ +#else + /* Little-endian. Early bytes are at LSB. */ + lsr tmp2, tmp2, tmp1 /* Shift (tmp1 & 63). */ +#endif + orr data1, data1, tmp2 + orr data2, data2, tmp2 + b L(start_realigned) + +L(misaligned8): + /* Align SRC1 to 8 bytes and then compare 8 bytes at a time, always + checking to make sure that we don't access beyond page boundary in + SRC2. */ + tst src1, #7 + b.eq L(loop_misaligned) +L(do_misaligned): + ldrb data1w, [src1], #1 + ldrb data2w, [src2], #1 + cmp data1w, #1 + ccmp data1w, data2w, #0, cs /* NZCV = 0b0000. */ + b.ne L(done) + tst src1, #7 + b.ne L(do_misaligned) + +L(loop_misaligned): + /* Test if we are within the last dword of the end of a 4K page. If + yes then jump back to the misaligned loop to copy a byte at a time. */ + and tmp1, src2, #0xff8 + eor tmp1, tmp1, #0xff8 + cbz tmp1, L(do_misaligned) + ldr data1, [src1], #8 + ldr data2, [src2], #8 + + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + eor diff, data1, data2 /* Non-zero if differences found. */ + bic has_nul, tmp1, tmp2 /* Non-zero if NUL terminator. */ + orr syndrome, diff, has_nul + cbz syndrome, L(loop_misaligned) + b L(end) + +L(done): + sub result, data1, data2 + ret + .size strcmp, .-strcmp + +#endif diff --git a/lib/machine/aarch64/strcpy-stub.c b/lib/machine/aarch64/strcpy-stub.c new file mode 100644 index 0000000..966277c --- /dev/null +++ b/lib/machine/aarch64/strcpy-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2014, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strcpy.c" +#else +/* See strcpy.S */ +#endif diff --git a/lib/machine/aarch64/strcpy.S b/lib/machine/aarch64/strcpy.S new file mode 100644 index 0000000..e5405f2 --- /dev/null +++ b/lib/machine/aarch64/strcpy.S @@ -0,0 +1,341 @@ +/* + strcpy/stpcpy - copy a string returning pointer to start/end. + + Copyright (c) 2013, 2014, 2015 ARM Ltd. + All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strchr-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses, min page size 4k. + */ + +/* To build as stpcpy, define BUILD_STPCPY before compiling this file. + + To test the page crossing code path more thoroughly, compile with + -DSTRCPY_TEST_PAGE_CROSS - this will force all copies through the slower + entry path. This option is not intended for production use. */ + +/* Arguments and results. */ +#define dstin x0 +#define srcin x1 + +/* Locals and temporaries. */ +#define src x2 +#define dst x3 +#define data1 x4 +#define data1w w4 +#define data2 x5 +#define data2w w5 +#define has_nul1 x6 +#define has_nul2 x7 +#define tmp1 x8 +#define tmp2 x9 +#define tmp3 x10 +#define tmp4 x11 +#define zeroones x12 +#define data1a x13 +#define data2a x14 +#define pos x15 +#define len x16 +#define to_align x17 + +#ifdef BUILD_STPCPY +#define STRCPY stpcpy +#else +#define STRCPY strcpy +#endif + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + + /* NUL detection works on the principle that (X - 1) & (~X) & 0x80 + (=> (X - 1) & ~(X | 0x7f)) is non-zero iff a byte is zero, and + can be done in parallel across the entire word. */ + +#define REP8_01 0x0101010101010101 +#define REP8_7f 0x7f7f7f7f7f7f7f7f +#define REP8_80 0x8080808080808080 + + /* AArch64 systems have a minimum page size of 4k. We can do a quick + page size check for crossing this boundary on entry and if we + do not, then we can short-circuit much of the entry code. We + expect early page-crossing strings to be rare (probability of + 16/MIN_PAGE_SIZE ~= 0.4%), so the branch should be quite + predictable, even with random strings. + + We don't bother checking for larger page sizes, the cost of setting + up the correct page size is just not worth the extra gain from + a small reduction in the cases taking the slow path. Note that + we only care about whether the first fetch, which may be + misaligned, crosses a page boundary - after that we move to aligned + fetches for the remainder of the string. */ + +#ifdef STRCPY_TEST_PAGE_CROSS + /* Make everything that isn't Qword aligned look like a page cross. */ +#define MIN_PAGE_P2 4 +#else +#define MIN_PAGE_P2 12 +#endif + +#define MIN_PAGE_SIZE (1 << MIN_PAGE_P2) + +def_fn STRCPY p2align=6 + /* For moderately short strings, the fastest way to do the copy is to + calculate the length of the string in the same way as strlen, then + essentially do a memcpy of the result. This avoids the need for + multiple byte copies and further means that by the time we + reach the bulk copy loop we know we can always use DWord + accesses. We expect strcpy to rarely be called repeatedly + with the same source string, so branch prediction is likely to + always be difficult - we mitigate against this by preferring + conditional select operations over branches whenever this is + feasible. */ + and tmp2, srcin, #(MIN_PAGE_SIZE - 1) + mov zeroones, #REP8_01 + and to_align, srcin, #15 + cmp tmp2, #(MIN_PAGE_SIZE - 16) + neg tmp1, to_align + /* The first fetch will straddle a (possible) page boundary iff + srcin + 15 causes bit[MIN_PAGE_P2] to change value. A 16-byte + aligned string will never fail the page align check, so will + always take the fast path. */ + b.gt .Lpage_cross + +.Lpage_cross_ok: + ldp data1, data2, [srcin] +#ifdef __AARCH64EB__ + /* Because we expect the end to be found within 16 characters + (profiling shows this is the most common case), it's worth + swapping the bytes now to save having to recalculate the + termination syndrome later. We preserve data1 and data2 + so that we can re-use the values later on. */ + rev tmp2, data1 + sub tmp1, tmp2, zeroones + orr tmp2, tmp2, #REP8_7f + bics has_nul1, tmp1, tmp2 + b.ne .Lfp_le8 + rev tmp4, data2 + sub tmp3, tmp4, zeroones + orr tmp4, tmp4, #REP8_7f +#else + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + bics has_nul1, tmp1, tmp2 + b.ne .Lfp_le8 + sub tmp3, data2, zeroones + orr tmp4, data2, #REP8_7f +#endif + bics has_nul2, tmp3, tmp4 + b.eq .Lbulk_entry + + /* The string is short (<=16 bytes). We don't know exactly how + short though, yet. Work out the exact length so that we can + quickly select the optimal copy strategy. */ +.Lfp_gt8: + rev has_nul2, has_nul2 + clz pos, has_nul2 + mov tmp2, #56 + add dst, dstin, pos, lsr #3 /* Bits to bytes. */ + sub pos, tmp2, pos +#ifdef __AARCH64EB__ + lsr data2, data2, pos +#else + lsl data2, data2, pos +#endif + str data2, [dst, #1] + str data1, [dstin] +#ifdef BUILD_STPCPY + add dstin, dst, #8 +#endif + ret + +.Lfp_le8: + rev has_nul1, has_nul1 + clz pos, has_nul1 + add dst, dstin, pos, lsr #3 /* Bits to bytes. */ + subs tmp2, pos, #24 /* Pos in bits. */ + b.lt .Lfp_lt4 +#ifdef __AARCH64EB__ + mov tmp2, #56 + sub pos, tmp2, pos + lsr data2, data1, pos + lsr data1, data1, #32 +#else + lsr data2, data1, tmp2 +#endif + /* 4->7 bytes to copy. */ + str data2w, [dst, #-3] + str data1w, [dstin] +#ifdef BUILD_STPCPY + mov dstin, dst +#endif + ret +.Lfp_lt4: + cbz pos, .Lfp_lt2 + /* 2->3 bytes to copy. */ +#ifdef __AARCH64EB__ + lsr data1, data1, #48 +#endif + strh data1w, [dstin] + /* Fall-through, one byte (max) to go. */ +.Lfp_lt2: + /* Null-terminated string. Last character must be zero! */ + strb wzr, [dst] +#ifdef BUILD_STPCPY + mov dstin, dst +#endif + ret + + .p2align 6 + /* Aligning here ensures that the entry code and main loop all lies + within one 64-byte cache line. */ +.Lbulk_entry: + sub to_align, to_align, #16 + stp data1, data2, [dstin] + sub src, srcin, to_align + sub dst, dstin, to_align + b .Lentry_no_page_cross + + /* The inner loop deals with two Dwords at a time. This has a + slightly higher start-up cost, but we should win quite quickly, + especially on cores with a high number of issue slots per + cycle, as we get much better parallelism out of the operations. */ +.Lmain_loop: + stp data1, data2, [dst], #16 +.Lentry_no_page_cross: + ldp data1, data2, [src], #16 + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, #REP8_7f + bic has_nul1, tmp1, tmp2 + bics has_nul2, tmp3, tmp4 + ccmp has_nul1, #0, #0, eq /* NZCV = 0000 */ + b.eq .Lmain_loop + + /* Since we know we are copying at least 16 bytes, the fastest way + to deal with the tail is to determine the location of the + trailing NUL, then (re)copy the 16 bytes leading up to that. */ + cmp has_nul1, #0 +#ifdef __AARCH64EB__ + /* For big-endian, carry propagation (if the final byte in the + string is 0x01) means we cannot use has_nul directly. The + easiest way to get the correct byte is to byte-swap the data + and calculate the syndrome a second time. */ + csel data1, data1, data2, ne + rev data1, data1 + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + bic has_nul1, tmp1, tmp2 +#else + csel has_nul1, has_nul1, has_nul2, ne +#endif + rev has_nul1, has_nul1 + clz pos, has_nul1 + add tmp1, pos, #72 + add pos, pos, #8 + csel pos, pos, tmp1, ne + add src, src, pos, lsr #3 + add dst, dst, pos, lsr #3 + ldp data1, data2, [src, #-32] + stp data1, data2, [dst, #-16] +#ifdef BUILD_STPCPY + sub dstin, dst, #1 +#endif + ret + +.Lpage_cross: + bic src, srcin, #15 + /* Start by loading two words at [srcin & ~15], then forcing the + bytes that precede srcin to 0xff. This means they never look + like termination bytes. */ + ldp data1, data2, [src] + lsl tmp1, tmp1, #3 /* Bytes beyond alignment -> bits. */ + tst to_align, #7 + csetm tmp2, ne +#ifdef __AARCH64EB__ + lsl tmp2, tmp2, tmp1 /* Shift (tmp1 & 63). */ +#else + lsr tmp2, tmp2, tmp1 /* Shift (tmp1 & 63). */ +#endif + orr data1, data1, tmp2 + orr data2a, data2, tmp2 + cmp to_align, #8 + csinv data1, data1, xzr, lt + csel data2, data2, data2a, lt + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, #REP8_7f + bic has_nul1, tmp1, tmp2 + bics has_nul2, tmp3, tmp4 + ccmp has_nul1, #0, #0, eq /* NZCV = 0000 */ + b.eq .Lpage_cross_ok + /* We now need to make data1 and data2 look like they've been + loaded directly from srcin. Do a rotate on the 128-bit value. */ + lsl tmp1, to_align, #3 /* Bytes->bits. */ + neg tmp2, to_align, lsl #3 +#ifdef __AARCH64EB__ + lsl data1a, data1, tmp1 + lsr tmp4, data2, tmp2 + lsl data2, data2, tmp1 + orr tmp4, tmp4, data1a + cmp to_align, #8 + csel data1, tmp4, data2, lt + rev tmp2, data1 + rev tmp4, data2 + sub tmp1, tmp2, zeroones + orr tmp2, tmp2, #REP8_7f + sub tmp3, tmp4, zeroones + orr tmp4, tmp4, #REP8_7f +#else + lsr data1a, data1, tmp1 + lsl tmp4, data2, tmp2 + lsr data2, data2, tmp1 + orr tmp4, tmp4, data1a + cmp to_align, #8 + csel data1, tmp4, data2, lt + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, #REP8_7f +#endif + bic has_nul1, tmp1, tmp2 + cbnz has_nul1, .Lfp_le8 + bic has_nul2, tmp3, tmp4 + b .Lfp_gt8 + + .size STRCPY, . - STRCPY +#endif diff --git a/lib/machine/aarch64/strlen-stub.c b/lib/machine/aarch64/strlen-stub.c new file mode 100644 index 0000000..717e209 --- /dev/null +++ b/lib/machine/aarch64/strlen-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strlen.c" +#else +/* See strlen.S */ +#endif diff --git a/lib/machine/aarch64/strlen.S b/lib/machine/aarch64/strlen.S new file mode 100644 index 0000000..872d136 --- /dev/null +++ b/lib/machine/aarch64/strlen.S @@ -0,0 +1,238 @@ +/* Copyright (c) 2013-2015, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strlen-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64, unaligned accesses, min page size 4k. + */ + +/* To test the page crossing code path more thoroughly, compile with + -DTEST_PAGE_CROSS - this will force all calls through the slower + entry path. This option is not intended for production use. */ + +/* Arguments and results. */ +#define srcin x0 +#define len x0 + +/* Locals and temporaries. */ +#define src x1 +#define data1 x2 +#define data2 x3 +#define has_nul1 x4 +#define has_nul2 x5 +#define tmp1 x4 +#define tmp2 x5 +#define tmp3 x6 +#define tmp4 x7 +#define zeroones x8 + +#define L(l) .L ## l + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + + /* NUL detection works on the principle that (X - 1) & (~X) & 0x80 + (=> (X - 1) & ~(X | 0x7f)) is non-zero iff a byte is zero, and + can be done in parallel across the entire word. A faster check + (X - 1) & 0x80 is zero for non-NUL ASCII characters, but gives + false hits for characters 129..255. */ + +#define REP8_01 0x0101010101010101 +#define REP8_7f 0x7f7f7f7f7f7f7f7f +#define REP8_80 0x8080808080808080 + +#ifdef TEST_PAGE_CROSS +# define MIN_PAGE_SIZE 15 +#else +# define MIN_PAGE_SIZE 4096 +#endif + + /* Since strings are short on average, we check the first 16 bytes + of the string for a NUL character. In order to do an unaligned ldp + safely we have to do a page cross check first. If there is a NUL + byte we calculate the length from the 2 8-byte words using + conditional select to reduce branch mispredictions (it is unlikely + strlen will be repeatedly called on strings with the same length). + + If the string is longer than 16 bytes, we align src so don't need + further page cross checks, and process 32 bytes per iteration + using the fast NUL check. If we encounter non-ASCII characters, + fallback to a second loop using the full NUL check. + + If the page cross check fails, we read 16 bytes from an aligned + address, remove any characters before the string, and continue + in the main loop using aligned loads. Since strings crossing a + page in the first 16 bytes are rare (probability of + 16/MIN_PAGE_SIZE ~= 0.4%), this case does not need to be optimized. + + AArch64 systems have a minimum page size of 4k. We don't bother + checking for larger page sizes - the cost of setting up the correct + page size is just not worth the extra gain from a small reduction in + the cases taking the slow path. Note that we only care about + whether the first fetch, which may be misaligned, crosses a page + boundary. */ + +def_fn strlen p2align=6 + and tmp1, srcin, MIN_PAGE_SIZE - 1 + mov zeroones, REP8_01 + cmp tmp1, MIN_PAGE_SIZE - 16 + b.gt L(page_cross) + ldp data1, data2, [srcin] +#ifdef __AARCH64EB__ + /* For big-endian, carry propagation (if the final byte in the + string is 0x01) means we cannot use has_nul1/2 directly. + Since we expect strings to be small and early-exit, + byte-swap the data now so has_null1/2 will be correct. */ + rev data1, data1 + rev data2, data2 +#endif + sub tmp1, data1, zeroones + orr tmp2, data1, REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, REP8_7f + bics has_nul1, tmp1, tmp2 + bic has_nul2, tmp3, tmp4 + ccmp has_nul2, 0, 0, eq + beq L(main_loop_entry) + + /* Enter with C = has_nul1 == 0. */ + csel has_nul1, has_nul1, has_nul2, cc + mov len, 8 + rev has_nul1, has_nul1 + clz tmp1, has_nul1 + csel len, xzr, len, cc + add len, len, tmp1, lsr 3 + ret + + /* The inner loop processes 32 bytes per iteration and uses the fast + NUL check. If we encounter non-ASCII characters, use a second + loop with the accurate NUL check. */ + .p2align 4 +L(main_loop_entry): + bic src, srcin, 15 + sub src, src, 16 +L(main_loop): + ldp data1, data2, [src, 32]! +.Lpage_cross_entry: + sub tmp1, data1, zeroones + sub tmp3, data2, zeroones + orr tmp2, tmp1, tmp3 + tst tmp2, zeroones, lsl 7 + bne 1f + ldp data1, data2, [src, 16] + sub tmp1, data1, zeroones + sub tmp3, data2, zeroones + orr tmp2, tmp1, tmp3 + tst tmp2, zeroones, lsl 7 + beq L(main_loop) + add src, src, 16 +1: + /* The fast check failed, so do the slower, accurate NUL check. */ + orr tmp2, data1, REP8_7f + orr tmp4, data2, REP8_7f + bics has_nul1, tmp1, tmp2 + bic has_nul2, tmp3, tmp4 + ccmp has_nul2, 0, 0, eq + beq L(nonascii_loop) + + /* Enter with C = has_nul1 == 0. */ +L(tail): +#ifdef __AARCH64EB__ + /* For big-endian, carry propagation (if the final byte in the + string is 0x01) means we cannot use has_nul1/2 directly. The + easiest way to get the correct byte is to byte-swap the data + and calculate the syndrome a second time. */ + csel data1, data1, data2, cc + rev data1, data1 + sub tmp1, data1, zeroones + orr tmp2, data1, REP8_7f + bic has_nul1, tmp1, tmp2 +#else + csel has_nul1, has_nul1, has_nul2, cc +#endif + sub len, src, srcin + rev has_nul1, has_nul1 + add tmp2, len, 8 + clz tmp1, has_nul1 + csel len, len, tmp2, cc + add len, len, tmp1, lsr 3 + ret + +L(nonascii_loop): + ldp data1, data2, [src, 16]! + sub tmp1, data1, zeroones + orr tmp2, data1, REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, REP8_7f + bics has_nul1, tmp1, tmp2 + bic has_nul2, tmp3, tmp4 + ccmp has_nul2, 0, 0, eq + bne L(tail) + ldp data1, data2, [src, 16]! + sub tmp1, data1, zeroones + orr tmp2, data1, REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, REP8_7f + bics has_nul1, tmp1, tmp2 + bic has_nul2, tmp3, tmp4 + ccmp has_nul2, 0, 0, eq + beq L(nonascii_loop) + b L(tail) + + /* Load 16 bytes from [srcin & ~15] and force the bytes that precede + srcin to 0x7f, so we ignore any NUL bytes before the string. + Then continue in the aligned loop. */ +L(page_cross): + bic src, srcin, 15 + ldp data1, data2, [src] + lsl tmp1, srcin, 3 + mov tmp4, -1 +#ifdef __AARCH64EB__ + /* Big-endian. Early bytes are at MSB. */ + lsr tmp1, tmp4, tmp1 /* Shift (tmp1 & 63). */ +#else + /* Little-endian. Early bytes are at LSB. */ + lsl tmp1, tmp4, tmp1 /* Shift (tmp1 & 63). */ +#endif + orr tmp1, tmp1, REP8_80 + orn data1, data1, tmp1 + orn tmp2, data2, tmp1 + tst srcin, 8 + csel data1, data1, tmp4, eq + csel data2, data2, tmp2, eq + b L(page_cross_entry) + + .size strlen, . - strlen +#endif diff --git a/lib/machine/aarch64/strncmp-stub.c b/lib/machine/aarch64/strncmp-stub.c new file mode 100644 index 0000000..1eb988f --- /dev/null +++ b/lib/machine/aarch64/strncmp-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strncmp.c" +#else +/* See strncmp.S */ +#endif diff --git a/lib/machine/aarch64/strncmp.S b/lib/machine/aarch64/strncmp.S new file mode 100644 index 0000000..ffdabc2 --- /dev/null +++ b/lib/machine/aarch64/strncmp.S @@ -0,0 +1,290 @@ +/* Copyright (c) 2013, 2018, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strcmp-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64 + */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +#define REP8_01 0x0101010101010101 +#define REP8_7f 0x7f7f7f7f7f7f7f7f +#define REP8_80 0x8080808080808080 + +/* Parameters and result. */ +#define src1 x0 +#define src2 x1 +#define limit x2 +#define result x0 + +/* Internal variables. */ +#define data1 x3 +#define data1w w3 +#define data2 x4 +#define data2w w4 +#define has_nul x5 +#define diff x6 +#define syndrome x7 +#define tmp1 x8 +#define tmp2 x9 +#define tmp3 x10 +#define zeroones x11 +#define pos x12 +#define limit_wd x13 +#define mask x14 +#define endloop x15 +#define count mask + + .text + .p2align 6 + .rep 7 + nop /* Pad so that the loop below fits a cache line. */ + .endr +def_fn strncmp + cbz limit, .Lret0 + eor tmp1, src1, src2 + mov zeroones, #REP8_01 + tst tmp1, #7 + and count, src1, #7 + b.ne .Lmisaligned8 + cbnz count, .Lmutual_align + /* Calculate the number of full and partial words -1. */ + sub limit_wd, limit, #1 /* limit != 0, so no underflow. */ + lsr limit_wd, limit_wd, #3 /* Convert to Dwords. */ + + /* NUL detection works on the principle that (X - 1) & (~X) & 0x80 + (=> (X - 1) & ~(X | 0x7f)) is non-zero iff a byte is zero, and + can be done in parallel across the entire word. */ + /* Start of performance-critical section -- one 64B cache line. */ +.Lloop_aligned: + ldr data1, [src1], #8 + ldr data2, [src2], #8 +.Lstart_realigned: + subs limit_wd, limit_wd, #1 + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + eor diff, data1, data2 /* Non-zero if differences found. */ + csinv endloop, diff, xzr, pl /* Last Dword or differences. */ + bics has_nul, tmp1, tmp2 /* Non-zero if NUL terminator. */ + ccmp endloop, #0, #0, eq + b.eq .Lloop_aligned + /* End of performance-critical section -- one 64B cache line. */ + + /* Not reached the limit, must have found the end or a diff. */ + tbz limit_wd, #63, .Lnot_limit + + /* Limit % 8 == 0 => all bytes significant. */ + ands limit, limit, #7 + b.eq .Lnot_limit + + lsl limit, limit, #3 /* Bits -> bytes. */ + mov mask, #~0 +#ifdef __AARCH64EB__ + lsr mask, mask, limit +#else + lsl mask, mask, limit +#endif + bic data1, data1, mask + bic data2, data2, mask + + /* Make sure that the NUL byte is marked in the syndrome. */ + orr has_nul, has_nul, mask + +.Lnot_limit: + orr syndrome, diff, has_nul + +#ifndef __AARCH64EB__ + rev syndrome, syndrome + rev data1, data1 + /* The MS-non-zero bit of the syndrome marks either the first bit + that is different, or the top bit of the first zero byte. + Shifting left now will bring the critical information into the + top bits. */ + clz pos, syndrome + rev data2, data2 + lsl data1, data1, pos + lsl data2, data2, pos + /* But we need to zero-extend (char is unsigned) the value and then + perform a signed 32-bit subtraction. */ + lsr data1, data1, #56 + sub result, data1, data2, lsr #56 + ret +#else + /* For big-endian we cannot use the trick with the syndrome value + as carry-propagation can corrupt the upper bits if the trailing + bytes in the string contain 0x01. */ + /* However, if there is no NUL byte in the dword, we can generate + the result directly. We can't just subtract the bytes as the + MSB might be significant. */ + cbnz has_nul, 1f + cmp data1, data2 + cset result, ne + cneg result, result, lo + ret +1: + /* Re-compute the NUL-byte detection, using a byte-reversed value. */ + rev tmp3, data1 + sub tmp1, tmp3, zeroones + orr tmp2, tmp3, #REP8_7f + bic has_nul, tmp1, tmp2 + rev has_nul, has_nul + orr syndrome, diff, has_nul + clz pos, syndrome + /* The MS-non-zero bit of the syndrome marks either the first bit + that is different, or the top bit of the first zero byte. + Shifting left now will bring the critical information into the + top bits. */ + lsl data1, data1, pos + lsl data2, data2, pos + /* But we need to zero-extend (char is unsigned) the value and then + perform a signed 32-bit subtraction. */ + lsr data1, data1, #56 + sub result, data1, data2, lsr #56 + ret +#endif + +.Lmutual_align: + /* Sources are mutually aligned, but are not currently at an + alignment boundary. Round down the addresses and then mask off + the bytes that precede the start point. + We also need to adjust the limit calculations, but without + overflowing if the limit is near ULONG_MAX. */ + bic src1, src1, #7 + bic src2, src2, #7 + ldr data1, [src1], #8 + neg tmp3, count, lsl #3 /* 64 - bits(bytes beyond align). */ + ldr data2, [src2], #8 + mov tmp2, #~0 + sub limit_wd, limit, #1 /* limit != 0, so no underflow. */ +#ifdef __AARCH64EB__ + /* Big-endian. Early bytes are at MSB. */ + lsl tmp2, tmp2, tmp3 /* Shift (count & 63). */ +#else + /* Little-endian. Early bytes are at LSB. */ + lsr tmp2, tmp2, tmp3 /* Shift (count & 63). */ +#endif + and tmp3, limit_wd, #7 + lsr limit_wd, limit_wd, #3 + /* Adjust the limit. Only low 3 bits used, so overflow irrelevant. */ + add limit, limit, count + add tmp3, tmp3, count + orr data1, data1, tmp2 + orr data2, data2, tmp2 + add limit_wd, limit_wd, tmp3, lsr #3 + b .Lstart_realigned + + .p2align 6 + /* Don't bother with dwords for up to 16 bytes. */ +.Lmisaligned8: + cmp limit, #16 + b.hs .Ltry_misaligned_words + +.Lbyte_loop: + /* Perhaps we can do better than this. */ + ldrb data1w, [src1], #1 + ldrb data2w, [src2], #1 + subs limit, limit, #1 + ccmp data1w, #1, #0, hi /* NZCV = 0b0000. */ + ccmp data1w, data2w, #0, cs /* NZCV = 0b0000. */ + b.eq .Lbyte_loop +.Ldone: + sub result, data1, data2 + ret + /* Align the SRC1 to a dword by doing a bytewise compare and then do + the dword loop. */ +.Ltry_misaligned_words: + lsr limit_wd, limit, #3 + cbz count, .Ldo_misaligned + + neg count, count + and count, count, #7 + sub limit, limit, count + lsr limit_wd, limit, #3 + +.Lpage_end_loop: + ldrb data1w, [src1], #1 + ldrb data2w, [src2], #1 + cmp data1w, #1 + ccmp data1w, data2w, #0, cs /* NZCV = 0b0000. */ + b.ne .Ldone + subs count, count, #1 + b.hi .Lpage_end_loop + +.Ldo_misaligned: + /* Prepare ourselves for the next page crossing. Unlike the aligned + loop, we fetch 1 less dword because we risk crossing bounds on + SRC2. */ + mov count, #8 + subs limit_wd, limit_wd, #1 + b.lo .Ldone_loop +.Lloop_misaligned: + and tmp2, src2, #0xff8 + eor tmp2, tmp2, #0xff8 + cbz tmp2, .Lpage_end_loop + + ldr data1, [src1], #8 + ldr data2, [src2], #8 + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + eor diff, data1, data2 /* Non-zero if differences found. */ + bics has_nul, tmp1, tmp2 /* Non-zero if NUL terminator. */ + ccmp diff, #0, #0, eq + b.ne .Lnot_limit + subs limit_wd, limit_wd, #1 + b.pl .Lloop_misaligned + +.Ldone_loop: + /* We found a difference or a NULL before the limit was reached. */ + and limit, limit, #7 + cbz limit, .Lnot_limit + /* Read the last word. */ + sub src1, src1, 8 + sub src2, src2, 8 + ldr data1, [src1, limit] + ldr data2, [src2, limit] + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + eor diff, data1, data2 /* Non-zero if differences found. */ + bics has_nul, tmp1, tmp2 /* Non-zero if NUL terminator. */ + ccmp diff, #0, #0, eq + b.ne .Lnot_limit + +.Lret0: + mov result, #0 + ret + .size strncmp, . - strncmp +#endif diff --git a/lib/machine/aarch64/strnlen-stub.c b/lib/machine/aarch64/strnlen-stub.c new file mode 100644 index 0000000..8e1903c --- /dev/null +++ b/lib/machine/aarch64/strnlen-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strnlen.c" +#else +/* See strnlen.S */ +#endif diff --git a/lib/machine/aarch64/strnlen.S b/lib/machine/aarch64/strnlen.S new file mode 100644 index 0000000..c255c3f --- /dev/null +++ b/lib/machine/aarch64/strnlen.S @@ -0,0 +1,187 @@ +/* strnlen - calculate the length of a string with limit. + + Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strlen-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64 + */ + +/* Arguments and results. */ +#define srcin x0 +#define len x0 +#define limit x1 + +/* Locals and temporaries. */ +#define src x2 +#define data1 x3 +#define data2 x4 +#define data2a x5 +#define has_nul1 x6 +#define has_nul2 x7 +#define tmp1 x8 +#define tmp2 x9 +#define tmp3 x10 +#define tmp4 x11 +#define zeroones x12 +#define pos x13 +#define limit_wd x14 + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +#define REP8_01 0x0101010101010101 +#define REP8_7f 0x7f7f7f7f7f7f7f7f +#define REP8_80 0x8080808080808080 + + .text + .p2align 6 +.Lstart: + /* Pre-pad to ensure critical loop begins an icache line. */ + .rep 7 + nop + .endr + /* Put this code here to avoid wasting more space with pre-padding. */ +.Lhit_limit: + mov len, limit + ret + +def_fn strnlen + cbz limit, .Lhit_limit + mov zeroones, #REP8_01 + bic src, srcin, #15 + ands tmp1, srcin, #15 + b.ne .Lmisaligned + /* Calculate the number of full and partial words -1. */ + sub limit_wd, limit, #1 /* Limit != 0, so no underflow. */ + lsr limit_wd, limit_wd, #4 /* Convert to Qwords. */ + + /* NUL detection works on the principle that (X - 1) & (~X) & 0x80 + (=> (X - 1) & ~(X | 0x7f)) is non-zero iff a byte is zero, and + can be done in parallel across the entire word. */ + /* The inner loop deals with two Dwords at a time. This has a + slightly higher start-up cost, but we should win quite quickly, + especially on cores with a high number of issue slots per + cycle, as we get much better parallelism out of the operations. */ + + /* Start of critial section -- keep to one 64Byte cache line. */ +.Lloop: + ldp data1, data2, [src], #16 +.Lrealigned: + sub tmp1, data1, zeroones + orr tmp2, data1, #REP8_7f + sub tmp3, data2, zeroones + orr tmp4, data2, #REP8_7f + bic has_nul1, tmp1, tmp2 + bic has_nul2, tmp3, tmp4 + subs limit_wd, limit_wd, #1 + orr tmp1, has_nul1, has_nul2 + ccmp tmp1, #0, #0, pl /* NZCV = 0000 */ + b.eq .Lloop + /* End of critical section -- keep to one 64Byte cache line. */ + + orr tmp1, has_nul1, has_nul2 + cbz tmp1, .Lhit_limit /* No null in final Qword. */ + + /* We know there's a null in the final Qword. The easiest thing + to do now is work out the length of the string and return + MIN (len, limit). */ + + sub len, src, srcin + cbz has_nul1, .Lnul_in_data2 +#ifdef __AARCH64EB__ + mov data2, data1 +#endif + sub len, len, #8 + mov has_nul2, has_nul1 +.Lnul_in_data2: +#ifdef __AARCH64EB__ + /* For big-endian, carry propagation (if the final byte in the + string is 0x01) means we cannot use has_nul directly. The + easiest way to get the correct byte is to byte-swap the data + and calculate the syndrome a second time. */ + rev data2, data2 + sub tmp1, data2, zeroones + orr tmp2, data2, #REP8_7f + bic has_nul2, tmp1, tmp2 +#endif + sub len, len, #8 + rev has_nul2, has_nul2 + clz pos, has_nul2 + add len, len, pos, lsr #3 /* Bits to bytes. */ + cmp len, limit + csel len, len, limit, ls /* Return the lower value. */ + ret + +.Lmisaligned: + /* Deal with a partial first word. + We're doing two things in parallel here; + 1) Calculate the number of words (but avoiding overflow if + limit is near ULONG_MAX) - to do this we need to work out + limit + tmp1 - 1 as a 65-bit value before shifting it; + 2) Load and mask the initial data words - we force the bytes + before the ones we are interested in to 0xff - this ensures + early bytes will not hit any zero detection. */ + sub limit_wd, limit, #1 + neg tmp4, tmp1 + cmp tmp1, #8 + + and tmp3, limit_wd, #15 + lsr limit_wd, limit_wd, #4 + mov tmp2, #~0 + + ldp data1, data2, [src], #16 + lsl tmp4, tmp4, #3 /* Bytes beyond alignment -> bits. */ + add tmp3, tmp3, tmp1 + +#ifdef __AARCH64EB__ + /* Big-endian. Early bytes are at MSB. */ + lsl tmp2, tmp2, tmp4 /* Shift (tmp1 & 63). */ +#else + /* Little-endian. Early bytes are at LSB. */ + lsr tmp2, tmp2, tmp4 /* Shift (tmp1 & 63). */ +#endif + add limit_wd, limit_wd, tmp3, lsr #4 + + orr data1, data1, tmp2 + orr data2a, data2, tmp2 + + csinv data1, data1, xzr, le + csel data2, data2, data2a, le + b .Lrealigned + .size strnlen, . - .Lstart /* Include pre-padding in size. */ + +#endif diff --git a/lib/machine/aarch64/strrchr-stub.c b/lib/machine/aarch64/strrchr-stub.c new file mode 100644 index 0000000..5923a44 --- /dev/null +++ b/lib/machine/aarch64/strrchr-stub.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2014, ARM Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/strrchr.c" +#else +/* See strrchr.S */ +#endif diff --git a/lib/machine/aarch64/strrchr.S b/lib/machine/aarch64/strrchr.S new file mode 100644 index 0000000..d64fc09 --- /dev/null +++ b/lib/machine/aarch64/strrchr.S @@ -0,0 +1,182 @@ +/* + strrchr - find last instance of a character in a string + + Copyright (c) 2014, ARM Limited + All rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the company nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +/* See strchr-stub.c */ +#else + +/* Assumptions: + * + * ARMv8-a, AArch64 + * Neon Available. + */ + +/* Arguments and results. */ +#define srcin x0 +#define chrin w1 + +#define result x0 + +#define src x2 +#define tmp1 x3 +#define wtmp2 w4 +#define tmp3 x5 +#define src_match x6 +#define src_offset x7 +#define const_m1 x8 +#define tmp4 x9 +#define nul_match x10 +#define chr_match x11 + +#define vrepchr v0 +#define vdata1 v1 +#define vdata2 v2 +#define vhas_nul1 v3 +#define vhas_nul2 v4 +#define vhas_chr1 v5 +#define vhas_chr2 v6 +#define vrepmask_0 v7 +#define vrepmask_c v16 +#define vend1 v17 +#define vend2 v18 + +/* Core algorithm. + + For each 32-byte hunk we calculate a 64-bit syndrome value, with + two bits per byte (LSB is always in bits 0 and 1, for both big + and little-endian systems). For each tuple, bit 0 is set iff + the relevant byte matched the requested character; bit 1 is set + iff the relevant byte matched the NUL end of string (we trigger + off bit0 for the special case of looking for NUL). Since the bits + in the syndrome reflect exactly the order in which things occur + in the original string a count_trailing_zeros() operation will + identify exactly which byte is causing the termination, and why. */ + +/* Locals and temporaries. */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn strrchr + /* Magic constant 0x40100401 to allow us to identify which lane + matches the requested byte. Magic constant 0x80200802 used + similarly for NUL termination. */ + mov wtmp2, #0x0401 + movk wtmp2, #0x4010, lsl #16 + dup vrepchr.16b, chrin + bic src, srcin, #31 /* Work with aligned 32-byte hunks. */ + dup vrepmask_c.4s, wtmp2 + mov src_offset, #0 + ands tmp1, srcin, #31 + add vrepmask_0.4s, vrepmask_c.4s, vrepmask_c.4s /* equiv: lsl #1 */ + b.eq .Laligned + + /* Input string is not 32-byte aligned. Rather than forcing + the padding bytes to a safe value, we calculate the syndrome + for all the bytes, but then mask off those bits of the + syndrome that are related to the padding. */ + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + neg tmp1, tmp1 + cmeq vhas_nul1.16b, vdata1.16b, #0 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_nul2.16b, vdata2.16b, #0 + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + and vhas_nul1.16b, vhas_nul1.16b, vrepmask_0.16b + and vhas_chr1.16b, vhas_chr1.16b, vrepmask_c.16b + and vhas_nul2.16b, vhas_nul2.16b, vrepmask_0.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask_c.16b + addp vhas_nul1.16b, vhas_nul1.16b, vhas_nul2.16b // 256->128 + addp vhas_chr1.16b, vhas_chr1.16b, vhas_chr2.16b // 256->128 + addp vhas_nul1.16b, vhas_nul1.16b, vhas_nul1.16b // 128->64 + addp vhas_chr1.16b, vhas_chr1.16b, vhas_chr1.16b // 128->64 + mov nul_match, vhas_nul1.2d[0] + lsl tmp1, tmp1, #1 + mov const_m1, #~0 + mov chr_match, vhas_chr1.2d[0] + lsr tmp3, const_m1, tmp1 + + bic nul_match, nul_match, tmp3 // Mask padding bits. + bic chr_match, chr_match, tmp3 // Mask padding bits. + cbnz nul_match, .Ltail + +.Lloop: + cmp chr_match, #0 + csel src_match, src, src_match, ne + csel src_offset, chr_match, src_offset, ne +.Laligned: + ld1 {vdata1.16b, vdata2.16b}, [src], #32 + cmeq vhas_nul1.16b, vdata1.16b, #0 + cmeq vhas_chr1.16b, vdata1.16b, vrepchr.16b + cmeq vhas_nul2.16b, vdata2.16b, #0 + cmeq vhas_chr2.16b, vdata2.16b, vrepchr.16b + addp vend1.16b, vhas_nul1.16b, vhas_nul2.16b // 256->128 + and vhas_chr1.16b, vhas_chr1.16b, vrepmask_c.16b + and vhas_chr2.16b, vhas_chr2.16b, vrepmask_c.16b + addp vhas_chr1.16b, vhas_chr1.16b, vhas_chr2.16b // 256->128 + addp vend1.16b, vend1.16b, vend1.16b // 128->64 + addp vhas_chr1.16b, vhas_chr1.16b, vhas_chr1.16b // 128->64 + mov nul_match, vend1.2d[0] + mov chr_match, vhas_chr1.2d[0] + cbz nul_match, .Lloop + + and vhas_nul1.16b, vhas_nul1.16b, vrepmask_0.16b + and vhas_nul2.16b, vhas_nul2.16b, vrepmask_0.16b + addp vhas_nul1.16b, vhas_nul1.16b, vhas_nul2.16b + addp vhas_nul1.16b, vhas_nul1.16b, vhas_nul1.16b + mov nul_match, vhas_nul1.2d[0] + +.Ltail: + /* Work out exactly where the string ends. */ + sub tmp4, nul_match, #1 + eor tmp4, tmp4, nul_match + ands chr_match, chr_match, tmp4 + /* And pick the values corresponding to the last match. */ + csel src_match, src, src_match, ne + csel src_offset, chr_match, src_offset, ne + + /* Count down from the top of the syndrome to find the last match. */ + clz tmp3, src_offset + /* Src_match points beyond the word containing the match, so we can + simply subtract half the bit-offset into the syndrome. Because + we are counting down, we need to go back one more character. */ + add tmp3, tmp3, #2 + sub result, src_match, tmp3, lsr #1 + /* But if the syndrome shows no match was found, then return NULL. */ + cmp src_offset, #0 + csel result, result, xzr, ne + + ret + + .size strrchr, . - strrchr +#endif diff --git a/lib/machine/aarch64/sys/fcntl.h b/lib/machine/aarch64/sys/fcntl.h new file mode 100644 index 0000000..7da1d46 --- /dev/null +++ b/lib/machine/aarch64/sys/fcntl.h @@ -0,0 +1,12 @@ +#ifndef _SYS_FCNTL_H_ +#define _SYS_FCNTL_H_ + +#include + +/* We want to support O_BINARY for the open syscall. + For example, the Demon debug monitor has a separate + flag value for "rb" vs "r". */ +#define _FBINARY 0x10000 +#define O_BINARY _FBINARY + +#endif /* _SYS_FCNTL_H_ */ diff --git a/lib/machine/aarch64/sys/fenv.h b/lib/machine/aarch64/sys/fenv.h new file mode 100644 index 0000000..6b08792 --- /dev/null +++ b/lib/machine/aarch64/sys/fenv.h @@ -0,0 +1,120 @@ +/*- + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _FENV_H_ +#define _FENV_H_ + +#include + +#ifndef __fenv_static +#define __fenv_static static +#endif + +typedef __uint64_t fenv_t; +typedef __uint64_t fexcept_t; + +/* Exception flags */ +#define FE_INVALID 0x00000001 +#define FE_DIVBYZERO 0x00000002 +#define FE_OVERFLOW 0x00000004 +#define FE_UNDERFLOW 0x00000008 +#define FE_INEXACT 0x00000010 +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +/* + * Rounding modes + * + * We can't just use the hardware bit values here, because that would + * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed. + */ +#define FE_TONEAREST 0x0 +#define FE_UPWARD 0x1 +#define FE_DOWNWARD 0x2 +#define FE_TOWARDZERO 0x3 +#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ + FE_UPWARD | FE_TOWARDZERO) +#define _ROUND_SHIFT 22 + + + +/* Default floating-point environment */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV _fe_dfl_env + +/* We need to be able to map status flag positions to mask flag positions */ +#define _FPUSW_SHIFT 8 +#define _ENABLE_MASK (FE_ALL_EXCEPT << _FPUSW_SHIFT) + +#define __mrs_fpcr(__r) __asm __volatile("mrs %0, fpcr" : "=r" (__r)) +#define __msr_fpcr(__r) __asm __volatile("msr fpcr, %0" : : "r" (__r)) + +#define __mrs_fpsr(__r) __asm __volatile("mrs %0, fpsr" : "=r" (__r)) +#define __msr_fpsr(__r) __asm __volatile("msr fpsr, %0" : : "r" (__r)) + + +#if __BSD_VISIBLE + +/* We currently provide no external definitions of the functions below. */ + +static inline int +feenableexcept(int __mask) +{ + fenv_t __old_r, __new_r; + + __mrs_fpcr(__old_r); + __new_r = __old_r | ((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT); + __msr_fpcr(__new_r); + return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT); +} + +static inline int +fedisableexcept(int __mask) +{ + fenv_t __old_r, __new_r; + + __mrs_fpcr(__old_r); + __new_r = __old_r & ~((__mask & FE_ALL_EXCEPT) << _FPUSW_SHIFT); + __msr_fpcr(__new_r); + return ((__old_r >> _FPUSW_SHIFT) & FE_ALL_EXCEPT); +} + +static inline int +fegetexcept(void) +{ + fenv_t __r; + + __mrs_fpcr(__r); + return ((__r & _ENABLE_MASK) >> _FPUSW_SHIFT); +} + +#endif /* __BSD_VISIBLE */ + + + +#endif /* !_FENV_H_ */ diff --git a/lib/machine/amdgcn/Makefile.inc b/lib/machine/amdgcn/Makefile.inc new file mode 100644 index 0000000..d26603a --- /dev/null +++ b/lib/machine/amdgcn/Makefile.inc @@ -0,0 +1,7 @@ +libc_a_SOURCES += \ + %D%/abort.c \ + %D%/exit.c \ + %D%/atexit.c \ + %D%/mlock.c \ + %D%/getreent.c \ + %D%/signal.c diff --git a/lib/machine/amdgcn/abort.c b/lib/machine/amdgcn/abort.c new file mode 100644 index 0000000..ca9a0a3 --- /dev/null +++ b/lib/machine/amdgcn/abort.c @@ -0,0 +1,25 @@ +/* + * Support file for amdgcn in newlib. + * Copyright (c) 2014-2017 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include +#include "exit-value.h" + +void __attribute__((noreturn)) +abort (void) +{ + write (2, "GCN Kernel Aborted\n", 19); + exit_with_status_and_signal (0, SIGABRT); +} diff --git a/lib/machine/amdgcn/atexit.c b/lib/machine/amdgcn/atexit.c new file mode 100644 index 0000000..6745714 --- /dev/null +++ b/lib/machine/amdgcn/atexit.c @@ -0,0 +1,25 @@ +/* + * Support file for amdgcn in newlib. + * Copyright (c) 2014-2017 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +int +atexit (void (*function)(void)) +{ + /* Our current implementation of exit does not run functions registered with + atexit, so fail here. */ + abort (); + return 1; +} diff --git a/lib/machine/amdgcn/exit-value.h b/lib/machine/amdgcn/exit-value.h new file mode 100644 index 0000000..7aa2508 --- /dev/null +++ b/lib/machine/amdgcn/exit-value.h @@ -0,0 +1,54 @@ +/* + * Support file for amdgcn in newlib. + * Copyright (c) 2017 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _AMDGCN_EXIT_VALUE_H_ +#define _AMDGCN_EXIT_VALUE_H_ + +static inline void __attribute__((noreturn)) +exit_with_int (int val) +{ + /* Write the exit value to the conventional place. */ + int *return_value; +#if defined(__has_builtin) && __has_builtin(__builtin_gcn_kernarg_ptr) + asm ("s_load_dwordx2 %0, %1, 16 glc\n\t" + "s_waitcnt 0" + : "=Sg"(return_value) : "r"(__builtin_gcn_kernarg_ptr())); +#else + asm ("s_load_dwordx2 %0, s[8:9], 16 glc\n\t" + "s_waitcnt 0" : "=Sg"(return_value)); +#endif + *return_value = val; + + /* Terminate the current kernel. */ + asm ("s_dcache_wb"); + asm ("s_endpgm"); + __builtin_unreachable (); +} + +static inline void __attribute__((noreturn)) +exit_with_status_and_signal (int val, int signal) +{ + if (signal == 0) + val = val & 0xff; + else + { + val = (128 + signal) & 0xff; + signal = signal & 0xff; + } + + exit_with_int ((0xffff << 16) | (signal << 8) | val); +} + +#endif diff --git a/lib/machine/amdgcn/exit.c b/lib/machine/amdgcn/exit.c new file mode 100644 index 0000000..bdd532e --- /dev/null +++ b/lib/machine/amdgcn/exit.c @@ -0,0 +1,23 @@ +/* + * Support file for amdgcn in newlib. + * Copyright (c) 2014-2017 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include "exit-value.h" + +void __attribute__((noreturn)) +exit (int val) +{ + exit_with_status_and_signal (val, 0); +} diff --git a/lib/machine/amdgcn/getreent.c b/lib/machine/amdgcn/getreent.c new file mode 100644 index 0000000..ef731f6 --- /dev/null +++ b/lib/machine/amdgcn/getreent.c @@ -0,0 +1,100 @@ +/* get thread-specific reentrant pointer */ + +#include +#include +#include +#include + +/* Copied from the HSA documentation. */ +typedef struct hsa_signal_s { + uint64_t handle; +} hsa_signal_t; +typedef struct hsa_kernel_dispatch_packet_s { + uint16_t header ; + uint16_t setup; + uint16_t workgroup_size_x ; + uint16_t workgroup_size_y ; + uint16_t workgroup_size_z; + uint16_t reserved0; + uint32_t grid_size_x ; + uint32_t grid_size_y ; + uint32_t grid_size_z; + uint32_t private_segment_size; + uint32_t group_segment_size; + uint64_t kernel_object; + uint64_t reserved2; + hsa_signal_t completion_signal; +} hsa_kernel_dispatch_packet_t; + +struct _reent * +__getreent (void) +{ + /* Place the reent data at the top of the stack allocation. */ + struct data { + int marker; + struct _reent reent; + } *data; + +#if defined(__has_builtin) \ + && __has_builtin(__builtin_gcn_get_stack_limit) \ + && __has_builtin(__builtin_gcn_first_call_this_thread_p) + unsigned long addr = (((unsigned long) __builtin_gcn_get_stack_limit() + - sizeof(struct data)) & ~7); + data = (struct data *)addr; + + register long sp asm("s16"); + + if (sp >= addr) + goto stackoverflow; + if (__builtin_gcn_first_call_this_thread_p()) + { + data->marker = 12345; + __builtin_memset (&data->reent, 0, sizeof(struct _reent)); + _REENT_INIT_PTR_ZEROED (&data->reent); + } + else if (data->marker != 12345) + goto stackoverflow; +#else + /* s[0:1] contains a 48-bit private segment base address. + s11 contains the offset to the base of the stack. + s[4:5] contains the dispatch pointer. + + WARNING: this code will break if s[0:1] is ever used for anything! */ + const register unsigned long buffer_descriptor asm("s0"); + unsigned long private_segment = buffer_descriptor & 0x0000ffffffffffff; + const register unsigned int stack_offset asm("s11"); + const register hsa_kernel_dispatch_packet_t *dispatch_ptr asm("s4"); + + unsigned long stack_base = private_segment + stack_offset; + unsigned long stack_end = stack_base + dispatch_ptr->private_segment_size * 64; + unsigned long addr = (stack_end - sizeof(struct data)) & ~7; + data = (struct data *)addr; + + register long sp asm("s16"); + if (sp >= addr) + goto stackoverflow; + + /* Stash a marker in the unused upper 16 bits of s[0:1] to indicate that + the reent data is initialized. */ + const register unsigned int s1 asm("s1"); + unsigned int marker = s1 >> 16; + if (marker != 12345) + { + asm("s_and_b32\ts1, s1, 0xffff"); + asm("s_or_b32\ts1, s1, (12345 << 16)"); + data->marker = 12345; + + __builtin_memset (&data->reent, 0, sizeof(struct _reent)); + _REENT_INIT_PTR_ZEROED (&data->reent); + } + else if (data->marker != 12345) + goto stackoverflow; +#endif + + return &data->reent; + +stackoverflow: + write (2, "GCN Stack Overflow!\n", 20); + abort (); +} + diff --git a/lib/machine/amdgcn/mlock.c b/lib/machine/amdgcn/mlock.c new file mode 100644 index 0000000..fbc4944 --- /dev/null +++ b/lib/machine/amdgcn/mlock.c @@ -0,0 +1,115 @@ +/* + * Support file for AMDGCN in newlib. + * Copyright (c) 2017 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include +#include + +/* _sbrk_r expects us to use the real errno, not the reentrant one. */ +#include +#undef errno +extern int errno; + +/* The runtime passes in heap space like this. */ +struct heap { + int64_t size; + char data[0]; +}; + +static char *__heap_ptr = (char*)-1; +static char *__heap_end = (char*)-1; +static int __heap_lock = 0; +static void *__heap_lock_id = NULL; +static int __heap_lock_cnt = 0; + +void * +sbrk (ptrdiff_t nbytes) +{ + if (__heap_ptr == (char *)-1) + { + /* Find the heap from kernargs. */ + char *kernargs; +#if defined(__has_builtin) && __has_builtin(__builtin_gcn_kernarg_ptr) + kernargs = __builtin_gcn_kernarg_ptr (); +#else + /* The kernargs pointer is in s[8:9]. + This will break if the enable_sgpr_* flags are ever changed. */ + asm ("s_mov_b64 %0, s[8:9]" : "=Sg"(kernargs)); +#endif + + /* The heap data is at kernargs[3]. */ + struct heap *heap = *(struct heap **)(kernargs + 24); + + __heap_ptr = heap->data; + __heap_end = __heap_ptr + heap->size; + } + + if ((__heap_ptr + nbytes) >= __heap_end) + { + errno = ENOMEM; + return (void*)-1; + } + + char *base = __heap_ptr; + __heap_ptr += nbytes; + + return base; +} + +void +__malloc_lock (struct _reent *reent) +{ + void *id = reent; + + if (id == __heap_lock_id) + { + if (__heap_lock_cnt < 1) + abort (); + ++__heap_lock_cnt; + return; + } + + while (__sync_lock_test_and_set (&__heap_lock, 1)) + /* A sleep seems like it should allow the wavefront to yeild (maybe?) + Use the shortest possible sleep time of 1*64 cycles. */ + asm volatile ("s_sleep\t1" ::: "memory"); + + if (__heap_lock_id != NULL) + abort (); + if (__heap_lock_cnt != 0) + abort (); + + __heap_lock_cnt = 1; + __heap_lock_id = id; +} + +void +__malloc_unlock (struct _reent *reent) +{ + void *id = reent; + + if (id != __heap_lock_id) + abort (); + if (__heap_lock_cnt < 1) + abort (); + + --__heap_lock_cnt; + + if (__heap_lock_cnt > 0) + return; + + __heap_lock_id = NULL; + __sync_lock_release (&__heap_lock); +} diff --git a/lib/machine/amdgcn/signal.c b/lib/machine/amdgcn/signal.c new file mode 100644 index 0000000..033d8e5 --- /dev/null +++ b/lib/machine/amdgcn/signal.c @@ -0,0 +1,10 @@ +#include +#include + +_sig_func_ptr +signal (int sig, + _sig_func_ptr func) +{ + errno = EINVAL; + return NULL; +} diff --git a/lib/machine/arc/Makefile.inc b/lib/machine/arc/Makefile.inc new file mode 100644 index 0000000..c0d6d7b --- /dev/null +++ b/lib/machine/arc/Makefile.inc @@ -0,0 +1,31 @@ +libc_a_SOURCES += \ + %D%/memcmp.S \ + %D%/memcmp-bs-norm.S \ + %D%/memcmp-stub.c \ + %D%/memcpy.S \ + %D%/memcpy-archs.S \ + %D%/memcpy-bs.S \ + %D%/memcpy-stub.c \ + %D%/memset.S \ + %D%/memset-archs.S \ + %D%/memset-bs.S \ + %D%/memset-stub.c \ + %D%/setjmp.S \ + %D%/strchr.S \ + %D%/strchr-bs.S \ + %D%/strchr-bs-norm.S \ + %D%/strchr-stub.c \ + %D%/strcmp.S \ + %D%/strcmp-archs.S \ + %D%/strcmp-stub.c \ + %D%/strcpy.S \ + %D%/strcpy-bs.S \ + %D%/strcpy-bs-arc600.S \ + %D%/strcpy-stub.c \ + %D%/strlen.S \ + %D%/strlen-bs.S \ + %D%/strlen-bs-norm.S \ + %D%/strlen-stub.c \ + %D%/strncpy.S \ + %D%/strncpy-stub.c \ + %D%/strncpy-bs.S diff --git a/lib/machine/arc/asm.h b/lib/machine/arc/asm.h new file mode 100644 index 0000000..663197c --- /dev/null +++ b/lib/machine/arc/asm.h @@ -0,0 +1,82 @@ +#ifndef ARC_NEWLIB_ASM_H +#define ARC_NEWLIB_ASM_H + +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#define _ENTRY(name) \ + .text ` .balign 4 ` .globl name ` name: +#define FUNC(name) .type name,@function +#define ENDFUNC0(name) .Lfe_##name: .size name,.Lfe_##name-name +#define ENDFUNC(name) ENDFUNC0 (name) +#define ENTRY(name) _ENTRY (name) ` FUNC (name) + +#define add_l add +#define bcc_l bcc +#define bclr_l bclr +#define beq_l beq +#define bic_l bic +#define b_l b +#define bne_l bne +#define breq_l breq +#define brne_l brne +#define j_l j +#define ldb_l ldb +#define ld_l ld +#define mov_l mov +#define or_l or +#define st_l st +#define stb_l stb +#define sub_l sub +#define tst_l tst +#define extb_l extb + +#define bcc_s bhs_s + +/* Compatibility with older ARC GCC, that doesn't provide some of the + preprocessor defines used by newlib for ARC. */ +#if defined (__Xbarrel_shifter) && !defined (__ARC_BARREL_SHIFTER__) +#define __ARC_BARREL_SHIFTER__ 1 +#endif + +#if defined (__EM__) && !defined (__ARCEM__) +#define __ARCEM__ 1 +#endif + +#if defined (__HS__) && !defined (__ARCHS__) +#define __ARCHS__ 1 +#endif + +#if defined (__LL64__) && !defined (__ARC_LL64__) +#define __ARC_LL64__ 1 +#endif + +#endif /* ARC_NEWLIB_ASM_H */ diff --git a/lib/machine/arc/memcmp-bs-norm.S b/lib/machine/arc/memcmp-bs-norm.S new file mode 100644 index 0000000..be2464a --- /dev/null +++ b/lib/machine/arc/memcmp-bs-norm.S @@ -0,0 +1,225 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memcmp.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if !defined (__ARC601__) && defined (__ARC_NORM__) \ + && defined (__ARC_BARREL_SHIFTER__) + +#ifdef __LITTLE_ENDIAN__ +#define WORD2 r2 +#define SHIFT r3 +#else /* BIG ENDIAN */ +#define WORD2 r3 +#define SHIFT r2 +#endif + +ENTRY (memcmp) + or r12,r0,r1 + asl_s r12,r12,30 +#if defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__) + sub_l r3,r2,1 + brls r2,r12,.Lbytewise +#else + brls.d r2,r12,.Lbytewise + sub_s r3,r2,1 +#endif + ld r4,[r0,0] + ld r5,[r1,0] + lsr.f lp_count,r3,3 +#ifdef __ARCEM__ + /* A branch can't be the last instruction in a zero overhead loop. + So we move the branch to the start of the loop, duplicate it + after the end, and set up r12 so that the branch isn't taken + initially. */ + mov_s r12,WORD2 + lpne .Loop_end + brne WORD2,r12,.Lodd + ld WORD2,[r0,4] +#else + lpne .Loop_end + ld_s WORD2,[r0,4] +#endif + ld_s r12,[r1,4] + brne r4,r5,.Leven + ld.a r4,[r0,8] + ld.a r5,[r1,8] +#ifdef __ARCEM__ +.Loop_end: + brne WORD2,r12,.Lodd +#else + brne WORD2,r12,.Lodd +#ifdef __ARCHS__ + nop +#endif +.Loop_end: +#endif + asl_s SHIFT,SHIFT,3 + bcc_s .Last_cmp + brne r4,r5,.Leven + ld r4,[r0,4] + ld r5,[r1,4] +#ifdef __LITTLE_ENDIAN__ +#if defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__) + nop_s + ; one more load latency cycle +.Last_cmp: + xor r0,r4,r5 + bset r0,r0,SHIFT + sub_s r1,r0,1 + bic_s r1,r1,r0 + norm r1,r1 + b.d .Leven_cmp + and r1,r1,24 +.Leven: + xor r0,r4,r5 + sub_s r1,r0,1 + bic_s r1,r1,r0 + norm r1,r1 + ; slow track insn + and r1,r1,24 +.Leven_cmp: + asl r2,r4,r1 + asl r12,r5,r1 + lsr_s r2,r2,1 + lsr_s r12,r12,1 + j_s.d [blink] + sub r0,r2,r12 + .balign 4 +.Lodd: + xor r0,WORD2,r12 + sub_s r1,r0,1 + bic_s r1,r1,r0 + norm r1,r1 + ; slow track insn + and r1,r1,24 + asl_s r2,r2,r1 + asl_s r12,r12,r1 + lsr_s r2,r2,1 + lsr_s r12,r12,1 + j_s.d [blink] + sub r0,r2,r12 +#else /* !__ARC700__ */ + .balign 4 +.Last_cmp: + xor r0,r4,r5 + b.d .Leven_cmp + bset r0,r0,SHIFT +.Lodd: + mov_s r4,WORD2 + mov_s r5,r12 +.Leven: + xor r0,r4,r5 +.Leven_cmp: + mov_s r1,0x80808080 + ; uses long immediate + sub_s r12,r0,1 + bic_s r0,r0,r12 + sub r0,r1,r0 + xor_s r0,r0,r1 + and r1,r5,r0 + and r0,r4,r0 + xor.f 0,r0,r1 + sub_s r0,r0,r1 + j_s.d [blink] + mov.mi r0,r1 +#endif /* !__ARC700__ */ +#else /* BIG ENDIAN */ +.Last_cmp: + neg_s SHIFT,SHIFT + lsr r4,r4,SHIFT + lsr r5,r5,SHIFT + ; slow track insn +.Leven: + sub.f r0,r4,r5 + mov.ne r0,1 + j_s.d [blink] + bset.cs r0,r0,31 +.Lodd: + cmp_s WORD2,r12 +#if defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__) + mov_s r0,1 + j_s.d [blink] + bset.cs r0,r0,31 +#else + j_s.d [blink] + rrc r0,2 +#endif /* __ARC700__ || __ARCEM__ || __ARCHS__ */ +#endif /* ENDIAN */ + .balign 4 +.Lbytewise: + breq r2,0,.Lnil + ldb r4,[r0,0] + ldb r5,[r1,0] + lsr.f lp_count,r3 +#ifdef __ARCEM__ + mov r12,r3 + lpne .Lbyte_end + brne r3,r12,.Lbyte_odd +#else + lpne .Lbyte_end +#endif + ldb_s r3,[r0,1] + ldb_l r12,[r1,1] + brne r4,r5,.Lbyte_even + ldb.a r4,[r0,2] + ldb.a r5,[r1,2] +#ifdef __ARCEM__ +.Lbyte_end: + brne r3,r12,.Lbyte_odd +#else + brne r3,r12,.Lbyte_odd +#ifdef __ARCHS__ + nop +#endif +.Lbyte_end: +#endif + bcc_l .Lbyte_even + brne r4,r5,.Lbyte_even + ldb_s r3,[r0,1] + ldb_s r12,[r1,1] +.Lbyte_odd: + j_s.d [blink] + sub r0,r3,r12 +.Lbyte_even: + j_s.d [blink] + sub r0,r4,r5 +.Lnil: + j_s.d [blink] + mov_l r0,0 +ENDFUNC (memcmp) +#endif /* !__ARC601__ && __ARC_NORM__ && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memcmp-stub.c b/lib/machine/arc/memcmp-stub.c new file mode 100644 index 0000000..30c7884 --- /dev/null +++ b/lib/machine/arc/memcmp-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/memcmp.c" +#else +/* See memcmp-*.S. */ +#endif diff --git a/lib/machine/arc/memcmp.S b/lib/machine/arc/memcmp.S new file mode 100644 index 0000000..7c5a058 --- /dev/null +++ b/lib/machine/arc/memcmp.S @@ -0,0 +1,154 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memcmp.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined (__ARC601__) || !defined (__ARC_NORM__) \ + || !defined (__ARC_BARREL_SHIFTER__) + +/* Addresses are unsigned, and at 0 is the vector table, so it's OK to assume + that we can subtract 8 from a source end address without underflow. */ + +ENTRY (memcmp) + or r12,r0,r1 + tst r12,3 + breq r2,0,.Lnil + add_s r3,r0,r2 + +/* This algorithm for big endian targets sometimes works incorrectly + when sources are aligned. To be precise the last step is omitted. + Just use a simple bytewise variant until the algorithm is reviewed + and fixed. */ + +#ifdef __LITTLE_ENDIAN__ + bne_s .Lbytewise +#else /* BIG ENDIAN */ + b_s .Lbytewise +#endif /* ENDIAN */ + sub r6,r3,8 + ld r4,[r0,0] + ld r5,[r1,0] +2: + brhs r0,r6,.Loop_end + ld_s r3,[r0,4] + ld_s r12,[r1,4] + brne r4,r5,.Leven + ld.a r4,[r0,8] + breq.d r3,r12,2b + ld.a r5,[r1,8] +#ifdef __LITTLE_ENDIAN__ + mov_s r4,r3 + b.d .Lodd + mov_s r5,r12 +#else /* BIG ENDIAN */ + cmp_s r3,r12 + j_s.d [blink] + rrc r0,2 +#endif /* ENDIAN */ + + .balign 4 +.Loop_end: + sub r3,r0,r6 + brhs r3,4,.Last_cmp + brne r4,r5,.Leven + ld r4,[r0,4] + ld r5,[r1,4] +#ifdef __LITTLE_ENDIAN__ + .balign 4 +.Last_cmp: + mov_l r0,24 + add3 r2,r0,r2 + xor r0,r4,r5 + b.d .Leven_cmp + bset r0,r0,r2 +.Lodd: +.Leven: + xor r0,r4,r5 +.Leven_cmp: + mov_s r1,0x80808080 + ; uses long immediate + sub_s r12,r0,1 + bic_s r0,r0,r12 + sub r0,r1,r0 + xor_s r0,r0,r1 + and r1,r5,r0 + and r0,r4,r0 +#else /* BIG ENDIAN */ +.Last_cmp: + mov_s r3,0 + sub3 r2,r3,r2 + sub_s r3,r3,1 + bclr r3,r3,r2 + add_l r3,r3,1 + and r0,r4,r3 + and r1,r5,r3 +.Leven: +#endif /* ENDIAN */ + xor.f 0,r0,r1 + sub_s r0,r0,r1 + j_s.d [blink] + mov.mi r0,r1 + .balign 4 +.Lbytewise: + ldb r4,[r0,0] + ldb r5,[r1,0] + sub r6,r3,2 +3: + brhs r0,r6,.Lbyte_end + ldb_s r3,[r0,1] + ldb_s r12,[r1,1] + brne r4,r5,.Lbyte_even + ldb.a r4,[r0,2] + breq.d r3,r12,3b + ldb.a r5,[r1,2] +.Lbyte_odd: + j_s.d [blink] + sub r0,r3,r12 + .balign 4 +.Lbyte_end: + bbit1 r2,0,.Lbyte_even + brne r4,r5,.Lbyte_even + ldb r4,[r0,1] + ldb r5,[r1,1] +.Lbyte_even: + j_s.d [blink] + sub r0,r4,r5 +.Lnil: + j_s.d [blink] + mov_s r0,0 +ENDFUNC (memcmp) +#endif /* __ARC601__ || !__ARC_NORM__ || !__ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memcpy-archs.S b/lib/machine/arc/memcpy-archs.S new file mode 100644 index 0000000..84e766a --- /dev/null +++ b/lib/machine/arc/memcpy-archs.S @@ -0,0 +1,327 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memcpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined (__ARCHS__) + +#ifdef __LITTLE_ENDIAN__ +# define SHIFT_1(RX,RY,IMM) asl RX, RY, IMM ; << +# define SHIFT_2(RX,RY,IMM) lsr RX, RY, IMM ; >> +# define MERGE_1(RX,RY,IMM) asl RX, RY, IMM +# define MERGE_2(RX,RY,IMM) +# define EXTRACT_1(RX,RY,IMM) and RX, RY, 0xFFFF +# define EXTRACT_2(RX,RY,IMM) lsr RX, RY, IMM +#else +# define SHIFT_1(RX,RY,IMM) lsr RX, RY, IMM ; >> +# define SHIFT_2(RX,RY,IMM) asl RX, RY, IMM ; << +# define MERGE_1(RX,RY,IMM) asl RX, RY, IMM ; << +# define MERGE_2(RX,RY,IMM) asl RX, RY, IMM ; << +# define EXTRACT_1(RX,RY,IMM) lsr RX, RY, IMM +# define EXTRACT_2(RX,RY,IMM) lsr RX, RY, 0x08 +#endif + +#ifdef __ARC_LL64__ +# define PREFETCH_READ(RX) prefetch [RX, 56] +# define PREFETCH_WRITE(RX) prefetchw [RX, 64] +# define LOADX(DST,RX) ldd.ab DST, [RX, 8] +# define STOREX(SRC,RX) std.ab SRC, [RX, 8] +# define ZOLSHFT 5 +# define ZOLAND 0x1F +#else +# define PREFETCH_READ(RX) prefetch [RX, 28] +# define PREFETCH_WRITE(RX) prefetchw [RX, 32] +# define LOADX(DST,RX) ld.ab DST, [RX, 4] +# define STOREX(SRC,RX) st.ab SRC, [RX, 4] +# define ZOLSHFT 4 +# define ZOLAND 0xF +#endif + +#ifdef __ARC_ALIGNED_ACCESS__ +ENTRY (memcpy) + prefetch [r1] ; Prefetch the read location + prefetchw [r0] ; Prefetch the write location + mov.f 0, r2 +; if size is zero + jz.d [blink] + mov r3, r0 ; don't clobber ret val + +; if size <= 8 + cmp r2, 8 + bls.d @.Lsmallchunk + mov.f lp_count, r2 + + and.f r4, r0, 0x03 + rsub lp_count, r4, 4 + lpnz @.Laligndestination + ; LOOP BEGIN + ldb.ab r5, [r1,1] + sub r2, r2, 1 + stb.ab r5, [r3,1] +.Laligndestination: + +; Check the alignment of the source + and.f r4, r1, 0x03 + bnz.d @.Lsourceunaligned + +; CASE 0: Both source and destination are 32bit aligned +; Convert len to Dwords, unfold x4 + lsr.f lp_count, r2, ZOLSHFT + lpnz @.Lcopy32_64bytes + ; LOOP START + LOADX (r6, r1) + PREFETCH_READ (r1) + PREFETCH_WRITE (r3) + LOADX (r8, r1) + LOADX (r10, r1) + LOADX (r4, r1) + STOREX (r6, r3) + STOREX (r8, r3) + STOREX (r10, r3) + STOREX (r4, r3) +.Lcopy32_64bytes: + + and.f lp_count, r2, ZOLAND ;Last remaining 31 bytes +.Lsmallchunk: + lpnz @.Lcopyremainingbytes + ; LOOP START + ldb.ab r5, [r1,1] + stb.ab r5, [r3,1] +.Lcopyremainingbytes: + + j [blink] +; END CASE 0 + +.Lsourceunaligned: + cmp r4, 2 + beq.d @.LunalignedOffby2 + sub r2, r2, 1 + + bhi.d @.LunalignedOffby3 + ldb.ab r5, [r1, 1] + +; CASE 1: The source is unaligned, off by 1 + ; Hence I need to read 1 byte for a 16bit alignment + ; and 2bytes to reach 32bit alignment + ldh.ab r6, [r1, 2] + sub r2, r2, 2 + ; Convert to words, unfold x2 + lsr.f lp_count, r2, 3 + MERGE_1 (r6, r6, 8) + MERGE_2 (r5, r5, 24) + or r5, r5, r6 + + ; Both src and dst are aligned + lpnz @.Lcopy8bytes_1 + ; LOOP START + ld.ab r6, [r1, 4] + prefetch [r1, 28] ;Prefetch the next read location + ld.ab r8, [r1,4] + prefetchw [r3, 32] ;Prefetch the next write location + + SHIFT_1 (r7, r6, 24) + or r7, r7, r5 + SHIFT_2 (r5, r6, 8) + + SHIFT_1 (r9, r8, 24) + or r9, r9, r5 + SHIFT_2 (r5, r8, 8) + + st.ab r7, [r3, 4] + st.ab r9, [r3, 4] +.Lcopy8bytes_1: + + ; Write back the remaining 16bits + EXTRACT_1 (r6, r5, 16) + sth.ab r6, [r3, 2] + ; Write back the remaining 8bits + EXTRACT_2 (r5, r5, 16) + stb.ab r5, [r3, 1] + + and.f lp_count, r2, 0x07 ;Last 8bytes + lpnz @.Lcopybytewise_1 + ; LOOP START + ldb.ab r6, [r1,1] + stb.ab r6, [r3,1] +.Lcopybytewise_1: + j [blink] + +.LunalignedOffby2: +; CASE 2: The source is unaligned, off by 2 + ldh.ab r5, [r1, 2] + sub r2, r2, 1 + + ; Both src and dst are aligned + ; Convert to words, unfold x2 + lsr.f lp_count, r2, 3 +#ifdef __BIG_ENDIAN__ + asl.nz r5, r5, 16 +#endif + lpnz @.Lcopy8bytes_2 + ; LOOP START + ld.ab r6, [r1, 4] + prefetch [r1, 28] ;Prefetch the next read location + ld.ab r8, [r1,4] + prefetchw [r3, 32] ;Prefetch the next write location + + SHIFT_1 (r7, r6, 16) + or r7, r7, r5 + SHIFT_2 (r5, r6, 16) + + SHIFT_1 (r9, r8, 16) + or r9, r9, r5 + SHIFT_2 (r5, r8, 16) + + st.ab r7, [r3, 4] + st.ab r9, [r3, 4] +.Lcopy8bytes_2: + +#ifdef __BIG_ENDIAN__ + lsr.nz r5, r5, 16 +#endif + sth.ab r5, [r3, 2] + + and.f lp_count, r2, 0x07 ;Last 8bytes + lpnz @.Lcopybytewise_2 + ; LOOP START + ldb.ab r6, [r1,1] + stb.ab r6, [r3,1] +.Lcopybytewise_2: + j [blink] + +.LunalignedOffby3: +; CASE 3: The source is unaligned, off by 3 +; Hence, I need to read 1byte for achieve the 32bit alignment + + ; Both src and dst are aligned + ; Convert to words, unfold x2 + lsr.f lp_count, r2, 3 +#ifdef __BIG_ENDIAN__ + asl.ne r5, r5, 24 +#endif + lpnz @.Lcopy8bytes_3 + ; LOOP START + ld.ab r6, [r1, 4] + prefetch [r1, 28] ;Prefetch the next read location + ld.ab r8, [r1,4] + prefetchw [r3, 32] ;Prefetch the next write location + + SHIFT_1 (r7, r6, 8) + or r7, r7, r5 + SHIFT_2 (r5, r6, 24) + + SHIFT_1 (r9, r8, 8) + or r9, r9, r5 + SHIFT_2 (r5, r8, 24) + + st.ab r7, [r3, 4] + st.ab r9, [r3, 4] +.Lcopy8bytes_3: + +#ifdef __BIG_ENDIAN__ + lsr.nz r5, r5, 24 +#endif + stb.ab r5, [r3, 1] + + and.f lp_count, r2, 0x07 ;Last 8bytes + lpnz @.Lcopybytewise_3 + ; LOOP START + ldb.ab r6, [r1,1] + stb.ab r6, [r3,1] +.Lcopybytewise_3: + j [blink] + +ENDFUNC (memcpy) + +#else + +ENTRY(memcpy) + prefetch [r1] ; Prefetch the read location + prefetchw [r0] ; Prefetch the write location + mov.f 0, r2 +;;; if size is zero + jz.d [blink] + mov r3, r0 ; don't clobber ret val + +;;; if size <= 8 + cmp r2, 8 + bls.d @.Lsmallchunk + mov.f lp_count, r2 + +;;; Convert len to Dwords, unfold x4 + lsr.f lp_count, r2, ZOLSHFT + lpnz @.Lcopyfast + ;; LOOP START + LOADX (r6, r1) + PREFETCH_READ (r1) + PREFETCH_WRITE (r3) + LOADX (r8, r1) + LOADX (r10, r1) + LOADX (r4, r1) + STOREX (r6, r3) + STOREX (r8, r3) + STOREX (r10, r3) + STOREX (r4, r3) +.Lcopyfast: + +#ifdef __ARC_LL64__ + and r2, r2, ZOLAND ;Remaining 31 bytes + lsr.f lp_count, r2, 3 ;Convert to 64-bit words. + lpnz @.Lcopy64b + ;; LOOP START + ldd.ab r6,[r1,8] + std.ab r6,[r3,8] +.Lcopy64b: + + and.f lp_count, r2, 0x07 ; Last 7 bytes +#else + and.f lp_count, r2, ZOLAND +#endif + +.Lsmallchunk: + lpnz @.Lcopyremainingbytes + ;; LOOP START + ldb.ab r5, [r1,1] + stb.ab r5, [r3,1] +.Lcopyremainingbytes: + + j [blink] + +ENDFUNC(memcpy) +#endif + +#endif /* __ARCHS__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memcpy-bs.S b/lib/machine/arc/memcpy-bs.S new file mode 100644 index 0000000..5a224eb --- /dev/null +++ b/lib/machine/arc/memcpy-bs.S @@ -0,0 +1,105 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memcpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if !defined (__ARC601__) && !defined (__ARCHS__) \ + && defined (__ARC_BARREL_SHIFTER__) + +/* Mostly optimized for ARC700, but not bad for ARC600 either. */ +/* This memcpy implementation does not support objects of 1GB or larger - + the check for alignment does not work then. */ +/* We assume that most sources and destinations are aligned, and + that also lengths are mostly a multiple of four, although to a lesser + extent. */ +ENTRY (memcpy) + or r3,r0,r1 + asl_s r3,r3,30 + mov_s r5,r0 + brls.d r2,r3,.Lcopy_bytewise + sub.f r3,r2,1 + ld_s r12,[r1,0] + asr.f lp_count,r3,3 + bbit0.d r3,2,.Lnox4 + bmsk_s r2,r2,1 + st.ab r12,[r5,4] + ld.a r12,[r1,4] +.Lnox4: + lppnz .Lendloop + ld_s r3,[r1,4] + st.ab r12,[r5,4] + ld.a r12,[r1,8] + st.ab r3,[r5,4] +.Lendloop: + breq_l r2,0,.Last_store + ld r3,[r5,0] +#ifdef __LITTLE_ENDIAN__ + add3 r2,-1,r2 + ; uses long immediate + xor_s r12,r12,r3 + bmsk r12,r12,r2 + xor_s r12,r12,r3 +#else /* BIG ENDIAN */ + sub3 r2,31,r2 + ; uses long immediate + xor_s r3,r3,r12 + bmsk r3,r3,r2 + xor_s r12,r12,r3 +#endif /* ENDIAN */ +.Last_store: + j_s.d [blink] + st r12,[r5,0] + + .balign 4 +.Lcopy_bytewise: + jcs [blink] + ldb_s r12,[r1,0] + lsr.f lp_count,r3 + bcc_s .Lnox1 + stb.ab r12,[r5,1] + ldb.a r12,[r1,1] +.Lnox1: + lppnz .Lendbloop + ldb_s r3,[r1,1] + stb.ab r12,[r5,1] + ldb.a r12,[r1,2] + stb.ab r3,[r5,1] +.Lendbloop: + j_s.d [blink] + stb r12,[r5,0] +ENDFUNC (memcpy) +#endif /* !__ARC601__ && !__ARCHS__ && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memcpy-stub.c b/lib/machine/arc/memcpy-stub.c new file mode 100644 index 0000000..cc46c2d --- /dev/null +++ b/lib/machine/arc/memcpy-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/memcpy.c" +#else +/* See memcpy-*.S. */ +#endif diff --git a/lib/machine/arc/memcpy.S b/lib/machine/arc/memcpy.S new file mode 100644 index 0000000..6452f97 --- /dev/null +++ b/lib/machine/arc/memcpy.S @@ -0,0 +1,111 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memcpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined (__ARC601__) || \ + (!defined (__ARC_BARREL_SHIFTER__) && !defined (__ARCHS__)) + +/* Adapted from memcpy-bs.S. */ +/* We assume that most sources and destinations are aligned, and + that also lengths are mostly a multiple of four, although to a lesser + extent. */ +ENTRY (memcpy) + or r3,r0,r1 + bmsk.f 0,r3,1 + breq_s r2,0,.Lnil + mov_s r5,r0 + bne.d .Lcopy_bytewise + add r6,r0,r2 + sub_s r3,r2,1 + ld_s r12,[r1,0] + bbit0.d r3,2,.Lnox4 + sub r6,r6,8 + st.ab r12,[r5,4] + ld.a r12,[r1,4] +.Lnox4: + brlo r2,9,.Lendloop +.Lnox4a: + ld_s r3,[r1,4] + st.ab r12,[r5,8] + ld.a r12,[r1,8] + brlo.d r5,r6,.Lnox4a + st r3,[r5,-4] +.Lendloop: +#ifdef __LITTLE_ENDIAN__ + ld r3,[r5,0] + add3 r2,-1,r2 + ; uses long immediate + xor_s r12,r12,r3 + bmsk r12,r12,r2 + xor_s r12,r12,r3 +#else /* BIG ENDIAN */ + bmsk_s r2,r2,1 + breq_s r2,0,.Last_store + ld r3,[r5,0] + sub3 r2,31,r2 + ; uses long immediate + xor_s r3,r3,r12 + bmsk r3,r3,r2 + xor_s r12,r12,r3 +#endif /* ENDIAN */ +.Last_store: + j_s.d [blink] + st r12,[r5,0] + +.Lnil: + j_s [blink] + .balign 4 +.Lcopy_bytewise: + ldb_s r12,[r1,0] + bbit1.d r2,0,.Lnox1 + sub r6,r6,2 + stb.ab r12,[r5,1] + ldb.a r12,[r1,1] +.Lnox1: + brlo r2,3,.Lendbloop +.Lnox1a: + ldb_s r3,[r1,1] + stb.ab r12,[r5,2] + ldb.a r12,[r1,2] + brlo.d r5,r6,.Lnox1a + stb r3,[r5,-1] +.Lendbloop: + j_s.d [blink] + stb r12,[r5,0] +ENDFUNC (memcpy) +#endif /* __ARC601__ || (!__ARC_BARREL_SHIFTER__ && !__ARCHS__) */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memset-archs.S b/lib/machine/arc/memset-archs.S new file mode 100644 index 0000000..dc912aa --- /dev/null +++ b/lib/machine/arc/memset-archs.S @@ -0,0 +1,148 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memset.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#ifdef __ARCHS__ + +#define USE_PREFETCH + +#ifdef USE_PREFETCH +#define PREWRITE(A,B) prefetchw [(A),(B)] +#else +#define PREWRITE(A,B) prealloc [(A),(B)] +#endif + +ENTRY (memset) + prefetchw [r0] ; Prefetch the write location + mov.f 0, r2 +; if size is zero + jz.d [blink] + mov r3, r0 ; don't clobber ret val + +; if length < 8 + brls.d.nt r2, 8, .Lsmallchunk + mov.f lp_count,r2 + + and.f r4, r0, 0x03 + rsub lp_count, r4, 4 + lpnz @.Laligndestination + ; LOOP BEGIN + stb.ab r1, [r3,1] + sub r2, r2, 1 +.Laligndestination: + +; Destination is aligned + and r1, r1, 0xFF + asl r4, r1, 8 + or r4, r4, r1 + asl r5, r4, 16 + or r5, r5, r4 + mov r4, r5 + + sub3 lp_count, r2, 8 + cmp r2, 64 + bmsk.hi r2, r2, 5 + mov.ls lp_count, 0 + add3.hi r2, r2, 8 + +; Convert len to Dwords, unfold x8 + lsr.f lp_count, lp_count, 6 + lpnz @.Lset64bytes + ; LOOP START + PREWRITE (r3, 64) ;Prefetch the next write location +#ifdef __ARC_LL64__ + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] +#else + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] +#endif +.Lset64bytes: + + lsr.f lp_count, r2, 5 ;Last remaining max 124 bytes + lpnz .Lset32bytes + ; LOOP START + prefetchw [r3, 32] ;Prefetch the next write location +#ifdef __ARC_LL64__ + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] + std.ab r4, [r3, 8] +#else + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] + st.ab r4, [r3, 4] +#endif +.Lset32bytes: + + and.f lp_count, r2, 0x1F ;Last remaining 31 bytes +.Lsmallchunk: + lpnz .Lcopy3bytes + ; LOOP START + stb.ab r1, [r3, 1] +.Lcopy3bytes: + + j [blink] + +ENDFUNC (memset) +#endif /* __ARCHS__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memset-bs.S b/lib/machine/arc/memset-bs.S new file mode 100644 index 0000000..0206668 --- /dev/null +++ b/lib/machine/arc/memset-bs.S @@ -0,0 +1,154 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memset.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +/* ARC HS has it's own implementation of memset, yet we want this function + still to be compiled under "__dummy_memset" disguise, because strncpy + function uses __strncpy_bzero as a second entry point into memset. Would be + better to add __strncpy_bzero label to memset for ARC HS though, and even + better would be to avoid a second entry point into function. ARC HS always + has barrel-shifter, so this implementation will be always used for this + purpose. */ +#if !defined (__ARC601__) && defined (__ARC_BARREL_SHIFTER__) + +/* To deal with alignment/loop issues, SMALL must be at least 2. */ +#define SMALL 7 + + .global __strncpy_bzero + .hidden __strncpy_bzero +/* __strncpy_bzero provides the following interface to strncpy: + r0: return value + r2: zeroing length + r3: zeroing start address + No attempt is made here for __strncpy_memset to speed up aligned + cases, because the copying of a string presumably leaves start address + and length alignment for the zeroing randomly distributed. */ + +#ifdef __ARCHS__ +ENTRY (__dummy_memset) +#else +ENTRY (memset) +#endif +#if !defined (__ARC700__) && !defined (__ARCEM__) +#undef SMALL +#define SMALL 8 /* Even faster if aligned. */ + brls.d r2,SMALL,.Ltiny +#endif + mov_s r3,r0 + or r12,r0,r2 + bmsk.f r12,r12,1 + extb_s r1,r1 + asl r12,r1,8 + beq.d .Laligned + or_s r1,r1,r12 +#if defined (__ARC700__) || defined (__ARCEM__) + brls r2,SMALL,.Ltiny +#endif +.Lnot_tiny: + add_s r12,r2,r0 + stb r1,[r12,-1] + bclr_l r12,r12,0 + stw r1,[r12,-2] + bmsk.f r12,r3,1 + add_s r2,r2,r12 + sub.ne r2,r2,4 + stb.ab r1,[r3,1] + bclr_s r3,r3,0 + stw.ab r1,[r3,2] + bclr_s r3,r3,1 +.Laligned: ; This code address should be aligned for speed. +#if defined (__ARC700__) || defined (__ARCEM__) + asl r12,r1,16 + lsr.f lp_count,r2,2 + or_s r1,r1,r12 + lpne .Loop_end + st.ab r1,[r3,4] +.Loop_end: + j_s [blink] +#else /* !__ARC700 */ + lsr.f lp_count,r2,3 + asl r12,r1,16 + or_s r1,r1,r12 + lpne .Loop_end + st.ab r1,[r3,4] + st.ab r1,[r3,4] +.Loop_end: + jcc [blink] + j_s.d [blink] + st_s r1,[r3] +#endif /* !__ARC700 */ + +#if defined (__ARC700__) || defined (__ARCEM__) + .balign 4 +__strncpy_bzero: + brhi.d r2,17,.Lnot_tiny + mov_l r1,0 +.Ltiny: + mov.f lp_count,r2 + lpne .Ltiny_end + stb.ab r1,[r3,1] +.Ltiny_end: + j_s [blink] +#else /* !__ARC700__ */ +#if SMALL > 8 +FIXME +#endif + .balign 4 +__strncpy_bzero: + brhi.d r2,8,.Lnot_tiny + mov_s r1,0 +.Ltiny: + sub_s r2,r2,11 + sub1 r12,pcl,r2 + j_s [r12] + stb_s r1,[r3,7] + stb_s r1,[r3,6] + stb_s r1,[r3,5] + stb_s r1,[r3,4] + stb_s r1,[r3,3] + stb_s r1,[r3,2] + stb_s r1,[r3,1] + stb_s r1,[r3] + j_s [blink] +#endif /* !__ARC700 */ +#ifdef __ARCHS__ +ENDFUNC (__dummy_memset) +#else +ENDFUNC (memset) +#endif +#endif /* !__ARC601__ && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/memset-stub.c b/lib/machine/arc/memset-stub.c new file mode 100644 index 0000000..981ca1f --- /dev/null +++ b/lib/machine/arc/memset-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/memset.c" +#else +/* See memset-*.S. */ +#endif diff --git a/lib/machine/arc/memset.S b/lib/machine/arc/memset.S new file mode 100644 index 0000000..126d9ff --- /dev/null +++ b/lib/machine/arc/memset.S @@ -0,0 +1,110 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/memset.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined (__ARC601__) \ + || (!defined (__ARC_BARREL_SHIFTER__) && !defined (__ARCHS__)) + +/* To deal with alignment/loop issues, SMALL must be at least 2. */ +#define SMALL 8 /* Even faster if aligned. */ + + .global __strncpy_bzero + .hidden __strncpy_bzero +/* __strncpy_bzero provides the following interface to strncpy: + r0: return value + r2: zeroing length + r3: zeroing start address + No attempt is made here for __strncpy_memset to speed up aligned + cases, because the copying of a string presumably leaves start address + and length alignment for the zeroing randomly distributed. */ + +ENTRY (memset) + brls.d r2,SMALL,.Ltiny + mov_s r3,r0 + or r12,r0,r2 + bmsk.f r12,r12,1 + breq_s r1,0,.Lbzero + mov r4,0 + stb.a r1,[sp,-4] + stb r1,[sp,1] + stb r1,[sp,2] + stb r1,[sp,3] + ld.ab r1,[sp,4] +.Lbzero: + beq.d .Laligned +.Lbzero2: + add r6,r2,r3 +.Lnot_tiny: + stb r1,[r6,-1] + bclr r12,r6,0 + stw r1,[r12,-2] + stb.ab r1,[r3,1] + bclr_s r3,r3,0 + stw.ab r1,[r3,2] + bclr_s r3,r3,1 +.Laligned: ; This code address should be aligned for speed. + sub r6,r6,8 + brlo.d r6,r3,.Loop_end + sub r6,r6,8 +3: + st_l r1,[r3,4] + brhs.d r6,r3,3b + st.ab r1,[r3,8] +.Loop_end: + bic r12,r6,3 + j_s.d [blink] + st_s r1,[r12,12] + .balign 4 +__strncpy_bzero: + brhi.d r2,8,.Lbzero2 + mov_s r1,0 +.Ltiny: + sub_s r2,r2,11 + sub1 r12,pcl,r2 + j_s [r12] + stb_s r1,[r3,7] + stb_s r1,[r3,6] + stb_s r1,[r3,5] + stb_s r1,[r3,4] + stb_s r1,[r3,3] + stb_s r1,[r3,2] + stb_s r1,[r3,1] + stb_s r1,[r3] + j_s [blink] +ENDFUNC (memset) +#endif /* __ARC601__ || (!__ARC_BARREL_SHIFTER__ && !__ARCHS__) */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/setjmp.S b/lib/machine/arc/setjmp.S new file mode 100644 index 0000000..8e824f5 --- /dev/null +++ b/lib/machine/arc/setjmp.S @@ -0,0 +1,165 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* ABI interface file + these are the stack mappings for the registers + as stored in the ABI for ARC */ + + .file "setjmp.S" + +ABIr13 = 0 +ABIr14 = ABIr13 + 4 +ABIr15 = ABIr14 + 4 +ABIr16 = ABIr15 + 4 +ABIr17 = ABIr16 + 4 +ABIr18 = ABIr17 + 4 +ABIr19 = ABIr18 + 4 +ABIr20 = ABIr19 + 4 +ABIr21 = ABIr20 + 4 +ABIr22 = ABIr21 + 4 +ABIr23 = ABIr22 + 4 +ABIr24 = ABIr23 + 4 +ABIr25 = ABIr24 + 4 +ABIr26 = ABIr25 + 4 +ABIr27 = ABIr26 + 4 +ABIr28 = ABIr27 + 4 +ABIr29 = ABIr28 + 4 +ABIr30 = ABIr29 + 4 +ABIr31 = ABIr30 + 4 +ABIlpc = ABIr31 + 4 +ABIlps = ABIlpc + 4 +ABIlpe = ABIlps + 4 + +ABIflg = ABIlpe + 4 +ABImlo = ABIflg + 4 +ABImhi = ABImlo + 4 + + .text + .align 4 + .global setjmp + .type setjmp,@function +setjmp: + st r13, [r0, ABIr13] + st r14, [r0, ABIr14] + st r15, [r0, ABIr15] + st r16, [r0, ABIr16] + st r17, [r0, ABIr17] + st r18, [r0, ABIr18] + st r19, [r0, ABIr19] + st r20, [r0, ABIr20] + st r21, [r0, ABIr21] + st r22, [r0, ABIr22] + st r23, [r0, ABIr23] + st r24, [r0, ABIr24] + st r25, [r0, ABIr25] + st r26, [r0, ABIr26] + st r27, [r0, ABIr27] + st r28, [r0, ABIr28] + st r29, [r0, ABIr29] + st r30, [r0, ABIr30] + st blink, [r0, ABIr31] + st lp_count, [r0, ABIlpc] + + lr r2, [lp_start] + lr r3, [lp_end] + st r2, [r0, ABIlps] + st r3, [r0, ABIlpe] + +#if (!defined (__ARC700__) && !defined (__ARCEM__) && !defined (__ARCHS__)) +; Till the configure changes are decided, and implemented, the code working on +; mlo/mhi and using mul64 should be disabled. +; st mlo, [r0, ABImlo] +; st mhi, [r0, ABImhi] + lr r2, [status32] + st r2, [r0, ABIflg] +#endif + + j.d [blink] + mov r0,0 +.Lfe1: + .size setjmp,.Lfe1-setjmp + + .align 4 + .global longjmp + .type longjmp,@function +longjmp: + + ; load registers + ld r13, [r0, ABIr13] + ld r14, [r0, ABIr14] + ld r15, [r0, ABIr15] + ld r16, [r0, ABIr16] + ld r17, [r0, ABIr17] + ld r18, [r0, ABIr18] + ld r19, [r0, ABIr19] + ld r20, [r0, ABIr20] + ld r21, [r0, ABIr21] + ld r22, [r0, ABIr22] + ld r23, [r0, ABIr23] + ld r24, [r0, ABIr24] + ld r25, [r0, ABIr25] + ld r26, [r0, ABIr26] + ld r27, [r0, ABIr27] + ld r28, [r0, ABIr28] + + ld r3, [r0, ABIr29] + mov r29, r3 + + ld r3, [r0, ABIr30] + mov r30, r3 + + ld blink, [r0, ABIr31] + + ld r3, [r0, ABIlpc] + mov lp_count, r3 + + ld r2, [r0, ABIlps] + ld r3, [r0, ABIlpe] + sr r2, [lp_start] + sr r3, [lp_end] + +#if (!defined (__ARC700__) && !defined (__ARCEM__) && !defined (__ARCHS__)) + ld r2, [r0, ABImlo] + ld r3, [r0, ABImhi] +; We do not support restoring of mulhi and mlo registers, yet. + +; mulu64 0,r2,1 ; restores mlo +; mov 0,mlo ; force multiply to finish +; sr r3, [mulhi] + ld r2, [r0, ABIflg] + flag r2 ; restore "status32" register +#endif + + mov.f r1, r1 ; to avoid return 0 from longjmp + mov.eq r1, 1 + j.d [blink] + mov r0,r1 +.Lfe2: + .size longjmp,.Lfe2-longjmp diff --git a/lib/machine/arc/strchr-bs-norm.S b/lib/machine/arc/strchr-bs-norm.S new file mode 100644 index 0000000..e69ac6c --- /dev/null +++ b/lib/machine/arc/strchr-bs-norm.S @@ -0,0 +1,166 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strchr.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +/* ARC700 has a relatively long pipeline and branch prediction, so we want + to avoid branches that are hard to predict. On the other hand, the + presence of the norm instruction makes it easier to operate on whole + words branch-free. */ +#include "asm.h" + +#if (defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__)) \ + && defined (__ARC_NORM__) && defined (__ARC_BARREL_SHIFTER__) + +ENTRY (strchr) + extb_s r1,r1 + asl r5,r1,8 + bmsk r2,r0,1 + or r5,r5,r1 + mov_s r3,0x01010101 + breq.d r2,r0,.Laligned + asl r4,r5,16 + sub_s r0,r0,r2 + asl r7,r2,3 + ld_s r2,[r0] +#ifdef __LITTLE_ENDIAN__ + asl r7,r3,r7 +#else + lsr r7,r3,r7 +#endif + or r5,r5,r4 + ror r4,r3 + sub r12,r2,r7 + bic_s r12,r12,r2 + and r12,r12,r4 + brne.d r12,0,.Lfound0_ua + xor r6,r2,r5 + ld.a r2,[r0,4] + sub r12,r6,r7 + bic r12,r12,r6 +#ifdef __LITTLE_ENDIAN__ + and r7,r12,r4 + breq r7,0,.Loop ; For speed, we want this branch to be unaligned. + b_l .Lfound_char ; Likewise this one. +#else + and r12,r12,r4 + breq_l r12,0,.Loop ; For speed, we want this branch to be unaligned. + lsr_s r12,r12,7 + bic r2,r7,r6 + b.d .Lfound_char_b + and_s r2,r2,r12 +#endif +; /* We require this code address to be unaligned for speed... */ +.Laligned: + ld_s r2,[r0] + or r5,r5,r4 + ror r4,r3 +; /* ... so that this code address is aligned, for itself and ... */ +.Loop: + sub r12,r2,r3 + bic_s r12,r12,r2 + and r12,r12,r4 + brne.d r12,0,.Lfound0 + xor r6,r2,r5 + ld.a r2,[r0,4] + sub r12,r6,r3 + bic r12,r12,r6 + and r7,r12,r4 + breq r7,0,.Loop /* ... so that this branch is unaligned. */ + ; Found searched-for character. r0 has already advanced to next word. +#ifdef __LITTLE_ENDIAN__ +/* We only need the information about the first matching byte + (i.e. the least significant matching byte) to be exact, + hence there is no problem with carry effects. */ +.Lfound_char: + sub r3,r7,1 + bic r3,r3,r7 + norm r2,r3 + sub_s r0,r0,1 + asr_s r2,r2,3 + j_l.d [blink] + sub_s r0,r0,r2 + + .balign 4 +.Lfound0_ua: + mov_l r3,r7 +.Lfound0: + sub r3,r6,r3 + bic r3,r3,r6 + and r2,r3,r4 + or_s r12,r12,r2 + sub_s r3,r12,1 + bic_s r3,r3,r12 + norm r3,r3 + add_s r0,r0,3 + asr_s r12,r3,3 + asl.f 0,r2,r3 + sub_s r0,r0,r12 + j_s.d [blink] + mov.pl r0,0 +#else /* BIG ENDIAN */ +.Lfound_char: + lsr r7,r7,7 + + bic r2,r7,r6 +.Lfound_char_b: + norm r2,r2 + sub_s r0,r0,4 + asr_s r2,r2,3 + j_l.d [blink] + add_s r0,r0,r2 + +.Lfound0_ua: + mov_s r3,r7 +.Lfound0: + asl_s r2,r2,7 + or r7,r6,r4 + bic_s r12,r12,r2 + sub r2,r7,r3 + or r2,r2,r6 + bic r12,r2,r12 + bic.f r3,r4,r12 + norm r3,r3 + + add.pl r3,r3,1 + asr_s r12,r3,3 + asl.f 0,r2,r3 + add_s r0,r0,r12 + j_s.d [blink] + mov.mi r0,0 +#endif /* ENDIAN */ +ENDFUNC (strchr) +#endif /* (__ARC700__ || __ARCEM__ || __ARCHS__) && __ARC_NORM__ + && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strchr-bs.S b/lib/machine/arc/strchr-bs.S new file mode 100644 index 0000000..eb61a3a --- /dev/null +++ b/lib/machine/arc/strchr-bs.S @@ -0,0 +1,202 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strchr.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +/* In order to search for a zero in a W, we calculate + X := (W - 0x01010101) & ~W & 0x80808080; + In the little endian case: + If no byte in W is zero, X will be zero; otherwise, the least significant + byte of X which is nonzero indicates the least significant byte of W that + is zero. + In the big endian case: + X will be zero iff no byte in W is zero. + If X is nonzero, to find out which is the most significant zero byte + in W, we calculate: + Y := ~(((W | 0x80808080) - 0x01010101) | W) & 0x80808080; + Each byte in Y is 0x80 if the the corresponding byte in + W is zero, otherwise that byte of Y is 0. */ + +#if defined (__ARC_BARREL_SHIFTER__) && \ + (defined (__ARC600__) || (!defined (__ARC_NORM__) && !defined (__ARC601__))) + +ENTRY (strchr) + bmsk.f r2,r0,1 + mov_s r3,0x01010101 + extb_s r1,r1 + asl r5,r1,8 + or r5,r5,r1 + beq.d .Laligned + asl r4,r5,16 + sub_s r0,r0,r2 + asl_s r2,r2,3 +#ifdef __LITTLE_ENDIAN__ + asl r7,r3,r2 +#else + lsr r7,r3,r2 +#endif + ld_s r2,[r0] + or r5,r5,r4 + ror r4,r3 + sub r12,r2,r7 + bic_s r12,r12,r2 + and r12,r12,r4 + + brne.d r12,0,.Lfound0_ua + xor r6,r2,r5 + ld.a r2,[r0,4] + sub r12,r6,r7 + bic r12,r12,r6 +#ifdef __LITTLE_ENDIAN__ + and.f r7,r12,r4 + sub r12,r2,r3 + bic_s r12,r12,r2 + beq.d .Loop + and r12,r12,r4 + b.d .Lfound_char_ua + btst r7,7 +#else + and.f r8,r12,r4 + sub r12,r2,r3 + bic_s r12,r12,r2 + beq.d .Loop + and r12,r12,r4 + bic r12,r7,r6 + asl_s r12,r12,7 + and.f r2,r8,r12 + b.d .Lfound_char_ua + sub_s r0,r0,4 +#endif + + .balign 4 +.Laligned: + ld_s r2,[r0] + or r5,r5,r4 + ror r4,r3 + sub r12,r2,r3 + bic_s r12,r12,r2 + and r12,r12,r4 +.Loop: + + brne.d r12,0,.Lfound0 + xor r6,r2,r5 + ld.a r2,[r0,4] + sub r12,r6,r3 + bic r12,r12,r6 + and.f r7,r12,r4 + sub r12,r2,r3 + bic_s r12,r12,r2 + beq.d .Loop + and r12,r12,r4 +; Found searched-for character. r0 has already advanced to next word. +#ifdef __LITTLE_ENDIAN__ +/* We only need the information about the first matching byte + (i.e. the least significant matching byte) to be exact, + hence there is no problem with carry effects. */ +.Lfound_char: + btst r7,7 +.Lfound_char_ua: + sub_s r0,r0,4 + add.eq r0,r0,1 + btst.eq r7,15 + add.eq r0,r0,1 + btst.eq r7,23 + j_s.d [blink] + add.eq r0,r0,1 + + .balign 4 +.Lfound0_ua: + mov_l r3,r7 +.Lfound0: + sub r2,r6,r3 + bic r2,r2,r6 + and r2,r2,r4 + or r3,r12,r2 + sub_s r12,r3,1 + xor_s r3,r3,r12 + tst_s r2,r3 + lsr r2,r3,31 + lsr r12,r3,16 + jeq.d [blink] + mov.eq r0,0 + lsr r3,r3,8 + sub_s r2,r2,r12 + sub_s r2,r2,r3 + bmsk_s r2,r2,1 + j_s.d [blink] + add_s r0,r0,r2 +#else /* BIG ENDIAN */ +.Lfound_char: + asl r6,r6,7 + sub_s r0,r0,4 + bic.f r2,r7,r6 +.Lfound_char_ua: + add.pl r0,r0,1 + jmi.d [blink] + btst_s r2,23 + add.eq r0,r0,1 + btst.eq r2,15 + j_s.d [blink] + add.eq r0,r0,1 + +; N.B. if we searched for a char zero and found it in the MSB, +; and ignored matches are identical, we will take the early exit +; like for an ordinary found zero - except for the extra stalls at jhi - +; but still compute the right result. +.Lfound0_ua: + mov_s r3,r7 +.Lfound0: + asl_s r2,r2,7 + or r7,r6,r4 + bic_s r12,r12,r2 + sub r2,r7,r3 + or r2,r2,r6 + bic r2,r4,r2 + cmp r12,r2 + mov.hi r0,0 + btst.ls r2,31 + jhi.d [blink] + add.eq r0,r0,1 + btst.eq r2,23 + add.eq r0,r0,1 + btst.eq r2,15 + j_s.d [blink] + add.eq r0,r0,1 +#endif /* ENDIAN */ +ENDFUNC (strchr) +#endif /* __ARC_BARREL_SHIFTER__ && + (__ARC600__ || (!__ARC_NORM__ && !__ARC601__)) */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strchr-stub.c b/lib/machine/arc/strchr-stub.c new file mode 100644 index 0000000..8d84a82 --- /dev/null +++ b/lib/machine/arc/strchr-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/strchr.c" +#else +/* See strchr-*.S. */ +#endif diff --git a/lib/machine/arc/strchr.S b/lib/machine/arc/strchr.S new file mode 100644 index 0000000..1bf6db9 --- /dev/null +++ b/lib/machine/arc/strchr.S @@ -0,0 +1,208 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strchr.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +/* In order to search for a zero in a W, we calculate + X := (W - 0x01010101) & ~W & 0x80808080; + In the little endian case: + If no byte in W is zero, X will be zero; otherwise, the least significant + byte of X which is nonzero indicates the least significant byte of W that + is zero. + In the big endian case: + X will be zero iff no byte in W is zero. + If X is nonzero, to find out which is the most significant zero byte + in W, we calculate: + Y := ~(((W | 0x80808080) - 0x01010101) | W) & 0x80808080; + Each byte in Y is 0x80 if the the corresponding byte in + W is zero, otherwise that byte of Y is 0. */ + +#if defined (__ARC601__) || !defined (__ARC_BARREL_SHIFTER__) +ENTRY (strchr) + bmsk.f r2,r0,1 + mov_s r3,0x01010101 + extb_s r1,r1 + mov r8,0 + add3 r5,r8,r1 + add3 r5,r8,r5 + add2 r5,r1,r5 + add3 r4,r8,r5 + add3 r4,r8,r4 + add3 r4,r8,r4 + add3 r4,r8,r4 + beq.d .Laligned + add3 r4,r8,r4 + sub_s r0,r0,r2 +#ifdef __LITTLE_ENDIAN__ + add3.f r2,-1,r2 + bmsk r7,r3,r2 + rsub.pl r7,r7,r3 +#else + mov_s r12,31 + sub3 r2,r12,r2 + bmsk r7,r3,r2 +#endif + ld_s r2,[r0] + add1 r5,r5,r4 + ror r4,r3 + sub r12,r2,r7 + bic_s r12,r12,r2 + and r12,r12,r4 + + brne.d r12,0,.Lfound0_ua + xor r6,r2,r5 + ld.a r2,[r0,4] + sub r12,r6,r7 + bic r12,r12,r6 +#ifdef __LITTLE_ENDIAN__ + and.f r7,r12,r4 + sub r12,r2,r3 + bic_s r12,r12,r2 + beq.d .Loop + and r12,r12,r4 + b.d .Lfound_char_ua + btst r7,7 +#else + and.f r8,r12,r4 + sub r12,r2,r3 + bic_s r12,r12,r2 + beq.d .Loop + and r12,r12,r4 + bic r12,r7,r6 + bic r2,r3,r12 + sub1 r2,r3,r2 + sub_s r0,r0,4 + b.d .Lfound_char_ua + bic.f r2,r8,r2 +#endif + + .balign 4 +.Laligned: + ld_s r2,[r0] + add1 r5,r5,r4 + ror r4,r3 + sub r12,r2,r3 + bic_s r12,r12,r2 + and r12,r12,r4 +.Loop: + + brne.d r12,0,.Lfound0 + xor r6,r2,r5 + ld.a r2,[r0,4] + sub r12,r6,r3 + bic r12,r12,r6 + and.f r7,r12,r4 + sub r12,r2,r3 + bic_s r12,r12,r2 + beq.d .Loop + and r12,r12,r4 +; Found searched-for character. r0 has already advanced to next word. +#ifdef __LITTLE_ENDIAN__ +/* We only need the information about the first matching byte + (i.e. the least significant matching byte) to be exact, + hence there is no problem with carry effects. */ +.Lfound_char: + btst r7,7 +.Lfound_char_ua: + sub_s r0,r0,4 + add.eq r0,r0,1 + btst.eq r7,15 + add.eq r0,r0,1 + btst.eq r7,23 + j_s.d [blink] + add.eq r0,r0,1 + + .balign 4 +.Lfound0_ua: + mov_l r3,r7 +.Lfound0: + sub r2,r6,r3 + bic r2,r2,r6 + and r2,r2,r4 + or r3,r12,r2 + sub_s r12,r3,1 + xor_s r3,r3,r12 + cmp 0xffff,r3 + ; cmp uses limm ; ARC600 would do: asl.f 0,r3,9 + tst_s r2,r3 + mov.eq r0,0 + add.mi r0,r0,1 + btst.ne r3,15 + j_s.d [blink] + adc.ne r0,r0,1 +#else /* BIG ENDIAN */ +.Lfound_char: + and r2,r6,r3 + sub1 r2,r3,r2 + sub_s r0,r0,4 + bic.f r2,r7,r2 +.Lfound_char_ua: + add.pl r0,r0,1 + jmi.d [blink] + btst_s r2,23 + add.eq r0,r0,1 + btst.eq r2,15 + j_s.d [blink] + add.eq r0,r0,1 + +; N.B. if we searched for a char zero and found it in the MSB, +; and ignored matches are identical, we will take the early exit +; like for an ordinary found zero - except for the extra stalls at jhi - +; but still compute the right result. +.Lfound0_ua: + mov_s r3,r7 +.Lfound0: + and_s r2,r2,r3 + sub1 r2,r3,r2 + or r7,r6,r4 + bic_s r12,r12,r2 + sub r2,r7,r3 + or r2,r2,r6 + bic r2,r4,r2 + cmp_s r12,r2 + mov.hi r0,0 + btst.ls r2,31 + jhi.d [blink] + add.eq r0,r0,1 + btst.eq r2,23 + add.eq r0,r0,1 + btst.eq r2,15 + j_s.d [blink] + add.eq r0,r0,1 +#endif /* ENDIAN */ +ENDFUNC (strchr) +#endif /* __ARC601__ || !__ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strcmp-archs.S b/lib/machine/arc/strcmp-archs.S new file mode 100644 index 0000000..6cccf27 --- /dev/null +++ b/lib/machine/arc/strcmp-archs.S @@ -0,0 +1,109 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strcmp.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#ifdef __ARCHS__ +ENTRY (strcmp) + or r2, r0, r1 + bmsk_s r2, r2, 1 + brne r2, 0, @.Lcharloop + +; s1 and s2 are word aligned + ld.ab r2, [r0, 4] + + mov_s r12, 0x01010101 + ror r11, r12 + .align 4 +.LwordLoop: + ld.ab r3, [r1, 4] + ; Detect NULL char in str1 + sub r4, r2, r12 + ld.ab r5, [r0, 4] + bic r4, r4, r2 + and r4, r4, r11 + brne.d.nt r4, 0, .LfoundNULL + ; Check if the read locations are the same + cmp r2, r3 + beq.d .LwordLoop + mov.eq r2, r5 + + ; A match is found, spot it out +#ifdef __LITTLE_ENDIAN__ + swape r3, r3 + mov_s r0, 1 + swape r2, r2 +#else + mov_s r0, 1 +#endif + cmp_s r2, r3 + j_s.d [blink] + bset.lo r0, r0, 31 + + .align 4 +.LfoundNULL: +#ifdef __BIG_ENDIAN__ + swape r4, r4 + swape r2, r2 + swape r3, r3 +#endif + ; Find null byte + ffs r0, r4 + bmsk r2, r2, r0 + bmsk r3, r3, r0 + swape r2, r2 + swape r3, r3 + ; make the return value + sub.f r0, r2, r3 + mov.hi r0, 1 + j_s.d [blink] + bset.lo r0, r0, 31 + + .align 4 +.Lcharloop: + ldb.ab r2, [r0, 1] + ldb.ab r3, [r1, 1] + nop + breq r2, 0, .Lcmpend + breq r2, r3, .Lcharloop + + .align 4 +.Lcmpend: + j_s.d [blink] + sub r0, r2, r3 +ENDFUNC (strcmp) +#endif /* __ARCHS__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strcmp-stub.c b/lib/machine/arc/strcmp-stub.c new file mode 100644 index 0000000..19528e3 --- /dev/null +++ b/lib/machine/arc/strcmp-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/strcmp.c" +#else +/* See strcmp-*.S. */ +#endif diff --git a/lib/machine/arc/strcmp.S b/lib/machine/arc/strcmp.S new file mode 100644 index 0000000..40a9e94 --- /dev/null +++ b/lib/machine/arc/strcmp.S @@ -0,0 +1,133 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strcmp.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +/* This is optimized primarily for the ARC700. + It would be possible to speed up the loops by one cycle / word + respective one cycle / byte by forcing double source 1 alignment, unrolling + by a factor of two, and speculatively loading the second word / byte of + source 1; however, that would increase the overhead for loop setup / finish, + and strcmp might often terminate early. */ +#ifndef __ARCHS__ + +ENTRY (strcmp) + or r2,r0,r1 + bmsk_s r2,r2,1 + brne_l r2,0,.Lcharloop + mov_s r12,0x01010101 + ror r5,r12 +.Lwordloop: + ld.ab r2,[r0,4] + ld.ab r3,[r1,4] + nop_s + sub r4,r2,r12 + bic r4,r4,r2 + and r4,r4,r5 + brne_l r4,0,.Lfound0 + breq r2,r3,.Lwordloop +#ifdef __LITTLE_ENDIAN__ + xor r0,r2,r3 ; mask for difference + sub_s r1,r0,1 + bic_s r0,r0,r1 ; mask for least significant difference bit + sub r1,r5,r0 + xor r0,r5,r1 ; mask for least significant difference byte + and_s r2,r2,r0 + and_s r3,r3,r0 +#endif /* LITTLE ENDIAN */ + cmp_s r2,r3 + mov_s r0,1 + j_s.d [blink] + bset.lo r0,r0,31 + + .balign 4 +#ifdef __LITTLE_ENDIAN__ +.Lfound0: + xor r0,r2,r3 ; mask for difference + or r0,r0,r4 ; or in zero indicator + sub_s r1,r0,1 + bic_s r0,r0,r1 ; mask for least significant difference bit + sub r1,r5,r0 + xor r0,r5,r1 ; mask for least significant difference byte + and_s r2,r2,r0 + and_s r3,r3,r0 + sub.f r0,r2,r3 + mov.hi r0,1 + j_s.d [blink] + bset.lo r0,r0,31 +#else /* BIG ENDIAN */ + /* The zero-detection above can mis-detect 0x01 bytes as zeroes + because of carry-propagateion from a lower significant zero byte. + We can compensate for this by checking that bit0 is zero. + This compensation is not necessary in the step where we + get a low estimate for r2, because in any affected bytes + we already have 0x00 or 0x01, which will remain unchanged + when bit 7 is cleared. */ + .balign 4 +.Lfound0: +#ifdef __ARC_BARREL_SHIFTER__ + lsr r0,r4,8 + lsr_s r1,r2 + bic_s r2,r2,r0 ; get low estimate for r2 and get ... + bic_s r0,r0,r1 ; + or_s r3,r3,r0 ; ... high estimate r3 so that r2 > r3 will ... + cmp_s r3,r2 ; ... be independent of trailing garbage + or_s r2,r2,r0 ; likewise for r3 > r2 + bic_s r3,r3,r0 + rlc r0,0 ; r0 := r2 > r3 ? 1 : 0 + cmp_s r2,r3 + j_s.d [blink] + bset.lo r0,r0,31 +#else /* __ARC_BARREL_SHIFTER__ */ + /* Fall through to .Lcharloop. */ + sub_s r0,r0,4 + sub_s r1,r1,4 +#endif /* __ARC_BARREL_SHIFTER__ */ +#endif /* ENDIAN */ + + .balign 4 +.Lcharloop: + ldb.ab r2,[r0,1] + ldb.ab r3,[r1,1] + nop_s + breq_l r2,0,.Lcmpend + breq r2,r3,.Lcharloop +.Lcmpend: + j_s.d [blink] + sub r0,r2,r3 +ENDFUNC (strcmp) +#endif /* !__ARCHS__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strcpy-bs-arc600.S b/lib/machine/arc/strcpy-bs-arc600.S new file mode 100644 index 0000000..e80ffe5 --- /dev/null +++ b/lib/machine/arc/strcpy-bs-arc600.S @@ -0,0 +1,120 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strcpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined (__ARC600__) && defined (__ARC_BARREL_SHIFTER__) +/* If dst and src are 4 byte aligned, copy 8 bytes at a time. + If the src is 4, but not 8 byte aligned, we first read 4 bytes to get + it 8 byte aligned. Thus, we can do a little read-ahead, without + dereferencing a cache line that we should not touch. + Note that short and long instructions have been scheduled to avoid + branch stalls. + This version is optimized for the ARC600 pipeline. */ + +ENTRY (strcpy) + or r2,r0,r1 + bmsk.f 0,r2,1 + mov r8,0x01010101 + bne.d .Lcharloop + mov_s r10,r0 + ld_l r3,[r1,0] + bbit0.d r1,2,.Loop_setup + ror r12,r8 + sub r2,r3,r8 + bic_s r2,r2,r3 + and_s r2,r2,r12 + brne_s r2,0,.Lr3z + st.ab r3,[r10,4] + ld.a r3,[r1,4] +.Loop_setup: + ld.a r4,[r1,4] + + sub r2,r3,r8 + and.f r2,r2,r12 + sub r5,r4,r8 + and.eq.f r5,r5,r12 + b.d .Loop_start + mov_s r6,r3 + .balign 4 +.Loop: + ld.a r3,[r1,4] + st r4,[r10,4] + ld.a r4,[r1,4] + sub r2,r3,r8 + and.f r2,r2,r12 + sub r5,r4,r8 + and.eq.f r5,r5,r12 + st.ab r6,[r10,8] + mov r6,r3 +.Loop_start: + beq.d .Loop + bic_s r2,r2,r3 + brne.d r2,0,.Lr3z + and r5,r5,r12 + bic r5,r5,r4 + breq.d r5,0,.Loop + mov_s r3,r4 + st.ab r6,[r10,4] +#ifdef __LITTLE_ENDIAN__ +.Lr3z: bmsk.f r1,r3,7 +.Lr3z_loop: + lsr_s r3,r3,8 + stb.ab r1,[r10,1] + bne.d .Lr3z_loop + bmsk.f r1,r3,7 + j_s [blink] +#else +.Lr3z: lsr.f r1,r3,24 +.Lr3z_loop: + asl_s r3,r3,8 + stb.ab r1,[r10,1] + bne.d .Lr3z_loop + lsr.f r1,r3,24 + j_s [blink] +#endif + + .balign 4 +.Lcharloop: + ldb.ab r3,[r1,1] + + + brne.d r3,0,.Lcharloop + stb.ab r3,[r10,1] + j [blink] +ENDFUNC (strcpy) +#endif /* __ARC600__ && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strcpy-bs.S b/lib/machine/arc/strcpy-bs.S new file mode 100644 index 0000000..26ac6c7 --- /dev/null +++ b/lib/machine/arc/strcpy-bs.S @@ -0,0 +1,103 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strcpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if (defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__)) \ + && defined (__ARC_BARREL_SHIFTER__) + +/* If dst and src are 4 byte aligned, copy 8 bytes at a time. + If the src is 4, but not 8 byte aligned, we first read 4 bytes to get + it 8 byte aligned. Thus, we can do a little read-ahead, without + dereferencing a cache line that we should not touch. + Note that short and long instructions have been scheduled to avoid + branch stalls. + The beq_s to r3z could be made unaligned & long to avoid a stall + there, but the it is not likely to be taken often, and it + would also be likey to cost an unaligned mispredict at the next call. */ + +ENTRY (strcpy) + or r2,r0,r1 + bmsk_s r2,r2,1 + brne.d r2,0,charloop + mov_s r10,r0 + ld_s r3,[r1,0] + mov r8,0x01010101 + bbit0.d r1,2,loop_start + ror r12,r8 + sub r2,r3,r8 + bic_s r2,r2,r3 + tst_s r2,r12 + bne_l r3z + mov_s r4,r3 + .balign 4 +loop: + ld.a r3,[r1,4] + st.ab r4,[r10,4] +loop_start: + ld.a r4,[r1,4] + sub r2,r3,r8 + bic_s r2,r2,r3 + tst_l r2,r12 + bne_l r3z + st.ab r3,[r10,4] + sub r2,r4,r8 + bic r2,r2,r4 + tst_l r2,r12 + beq_l loop + mov_s r3,r4 +#ifdef __LITTLE_ENDIAN__ +r3z: bmsk.f r1,r3,7 + lsr_s r3,r3,8 +#else +r3z: lsr.f r1,r3,24 + asl_s r3,r3,8 +#endif + bne.d r3z + stb.ab r1,[r10,1] + j_s [blink] + + .balign 4 +charloop: + ldb.ab r3,[r1,1] + + + brne.d r3,0,charloop + stb.ab r3,[r10,1] + j [blink] +ENDFUNC (strcpy) +#endif /* (__ARC700__ || __ARCEM__ || __ARCHS__) && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strcpy-stub.c b/lib/machine/arc/strcpy-stub.c new file mode 100644 index 0000000..80ea0e8 --- /dev/null +++ b/lib/machine/arc/strcpy-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/strcpy.c" +#else +/* See strcpy-*.S. */ +#endif diff --git a/lib/machine/arc/strcpy.S b/lib/machine/arc/strcpy.S new file mode 100644 index 0000000..e379b79 --- /dev/null +++ b/lib/machine/arc/strcpy.S @@ -0,0 +1,90 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strcpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined (__ARC601__) || !defined (__ARC_BARREL_SHIFTER__) +/* If dst and src are 4 byte aligned, copy 8 bytes at a time. + If the src is 4, but not 8 byte aligned, we first read 4 bytes to get + it 8 byte aligned. Thus, we can do a little read-ahead, without + dereferencing a cache line that we should not touch. + This version is a compromise between speed for the 601 pipeline and code + size. */ + +ENTRY (strcpy) + or r2,r0,r1 + bmsk.f 0,r2,1 + mov r8,0x01010101 + bne.d .Lcharloop + mov_s r10,r0 + ld_s r3,[r1] + bbit0.d r1,2,.Loop_start + ror r12,r8 + sub r2,r3,r8 + bic_s r2,r2,r3 + and_s r2,r2,r12 + brne_s r2,0,.Lr3z + mov r4,r3 + sub_s r1,r1,4 + .balign 4 +.Loop: + ld.a r3,[r1,8] + st.ab r4,[r10,4] +.Loop_start: + ld r4,[r1,4] + sub r2,r3,r8 + bic_s r2,r2,r3 + tst_s r2,r12 + sub r5,r4,r8 + bic r5,r5,r4 + bne_s .Lr3z + and r5,r5,r12 + breq.d r5,0,.Loop + st.ab r3,[r10,4] + + ;mov_s r3,r4 + add_s r1,r1,4 + + .balign 4 +.Lr3z: +.Lcharloop: + ldb.ab r3,[r1,1] + brne.d r3,0,.Lcharloop + stb.ab r3,[r10,1] + j_s [blink] +ENDFUNC (strcpy) +#endif /* __ARC601__ || !__ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strlen-bs-norm.S b/lib/machine/arc/strlen-bs-norm.S new file mode 100644 index 0000000..5f8db32 --- /dev/null +++ b/lib/machine/arc/strlen-bs-norm.S @@ -0,0 +1,116 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strlen.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" +#if (defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__)) \ + && defined (__ARC_NORM__) && defined (__ARC_BARREL_SHIFTER__) + +ENTRY (strlen) + or r3,r0,7 + ld r2,[r3,-7] + ld.a r6,[r3,-3] + mov r4,0x01010101 + ; uses long immediate +#ifdef __LITTLE_ENDIAN__ + asl_s r1,r0,3 + btst_s r0,2 + asl r7,r4,r1 + ror r5,r4 + sub r1,r2,r7 + bic_s r1,r1,r2 + mov.eq r7,r4 + sub r12,r6,r7 + bic r12,r12,r6 + or.eq r12,r12,r1 + and r12,r12,r5 + brne r12,0,.Learly_end +#else /* BIG ENDIAN */ + ror r5,r4 + btst_s r0,2 + mov_s r1,31 + sub3 r7,r1,r0 + sub r1,r2,r4 + bic_s r1,r1,r2 + bmsk r1,r1,r7 + sub r12,r6,r4 + bic r12,r12,r6 + bmsk.ne r12,r12,r7 + or.eq r12,r12,r1 + and r12,r12,r5 + brne r12,0,.Learly_end +#endif /* ENDIAN */ + +.Loop: + ld_s r2,[r3,4] + ld.a r6,[r3,8] + ; stall for load result + sub r1,r2,r4 + bic_s r1,r1,r2 + sub r12,r6,r4 + bic r12,r12,r6 + or_l r12,r12,r1 + and r12,r12,r5 + breq_l r12,0,.Loop +.Lend: + and.f r1,r1,r5 + sub.ne r3,r3,4 + mov.eq r1,r12 +#ifdef __LITTLE_ENDIAN__ + sub_s r2,r1,1 + bic_s r2,r2,r1 + norm r1,r2 + sub_s r0,r0,3 + lsr_s r1,r1,3 + sub r0,r3,r0 + j_s.d [blink] + sub_l r0,r0,r1 +#else /* BIG ENDIAN */ + lsr_s r1,r1,7 + mov.eq r2,r6 + bic_s r1,r1,r2 + norm r1,r1 + sub r0,r3,r0 + lsr_s r1,r1,3 + j_s.d [blink] + add_l r0,r0,r1 +#endif /* ENDIAN */ +.Learly_end: + b.d .Lend + sub_s.ne r1,r1,r1 +ENDFUNC (strlen) +#endif /* (__ARC700__ || __ARCEM__ || __ARCHS__) && __ARC_NORM__ + && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strlen-bs.S b/lib/machine/arc/strlen-bs.S new file mode 100644 index 0000000..59c3504 --- /dev/null +++ b/lib/machine/arc/strlen-bs.S @@ -0,0 +1,122 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strlen.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if (defined (__ARC600__) || !defined (__ARC_NORM__)) && !defined (__ARC601__) \ + && defined (__ARC_BARREL_SHIFTER__) +/* This code is optimized for the ARC600 pipeline. */ + +ENTRY (strlen) + or r3,r0,7 + ld r2,[r3,-7] + ld.a r6,[r3,-3] + mov r4,0x01010101 + ; uses long immediate +#ifdef __LITTLE_ENDIAN__ + asl_s r1,r0,3 + btst_s r0,2 + asl r7,r4,r1 + ror r5,r4 + sub r1,r2,r7 + bic_l r1,r1,r2 + mov.eq r7,r4 + sub r12,r6,r7 + bic r12,r12,r6 + or.eq r12,r12,r1 + and r12,r12,r5 + brne r12,0,.Learly_end +#else /* BIG ENDIAN */ + ror r5,r4 + btst_s r0,2 + mov_s r1,31 + sub3 r7,r1,r0 + sub r1,r2,r4 + bic_l r1,r1,r2 + bmsk r1,r1,r7 + sub r12,r6,r4 + bic r12,r12,r6 + bmsk.ne r12,r12,r7 + or.eq r12,r12,r1 + and r12,r12,r5 + brne r12,0,.Learly_end +#endif /* ENDIAN */ + +.Loop: + ld_s r2,[r3,4] + ld.a r6,[r3,8] + ; stall for load result + sub r1,r2,r4 + bic_s r1,r1,r2 + sub r12,r6,r4 + bic r12,r12,r6 + or_s r12,r12,r1 + and r12,r12,r5 + breq_s r12,0,.Loop +.Lend: + and.f r1,r1,r5 + sub.ne r3,r3,4 +#ifdef __LITTLE_ENDIAN__ + mov.eq r1,r12 + asr.f 0,r1,8 + bmsk.f 0,r1,15 + sub r0,r3,r0 + add.cc r0,r0,1 + jne.d [blink] + asl.f 0,r1,9 + j_s.d [blink] + sbc r0,r0,-2 +#else /* BIG ENDIAN */ + mov.eq r2,r6 + asl_s r2,r2,7 + mov.eq r1,r12 + bic_s r1,r1,r2 + asr.f 0,r1,16 + sub r0,r3,r0 + add.pl r0,r0,1 + jne.d [blink] + add.eq r0,r0,1 + j_s.d [blink] + add.cc r0,r0,1 +#endif /* ENDIAN */ + + .balign 4 +.Learly_end: + b.d .Lend + sub_s.ne r1,r1,r1 +ENDFUNC (strlen) +#endif /* (__ARC600__ || !__ARC_NORM__) && !__ARC601__ && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strlen-stub.c b/lib/machine/arc/strlen-stub.c new file mode 100644 index 0000000..942e9be --- /dev/null +++ b/lib/machine/arc/strlen-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/strlen.c" +#else +/* See strlen-*.S. */ +#endif diff --git a/lib/machine/arc/strlen.S b/lib/machine/arc/strlen.S new file mode 100644 index 0000000..67f820f --- /dev/null +++ b/lib/machine/arc/strlen.S @@ -0,0 +1,165 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strlen.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +#if defined(__ARC601__) || !defined (__ARC_BARREL_SHIFTER__) +/* This code is optimized for the ARC601 pipeline without barrel shifter. */ + +ENTRY (strlen) + or r3,r0,7 + ld r2,[r3,-7] + ld.a r6,[r3,-3] + mov r4,0x01010101 + ; uses long immediate +#ifdef __LITTLE_ENDIAN__ + bmsk.f 0,r0,1 + mov_s r1,31 + add3_s r1,r1,r0 + bmsk r7,r4,r1 + xor.ne r7,r7,r4 + btst_s r0,2 + ror r5,r4 + sub r1,r2,r7 + bic_s r1,r1,r2 + mov.eq r7,r4 + sub r12,r6,r7 + bic r12,r12,r6 + or.eq r12,r12,r1 + and r12,r12,r5 + brne r12,0,.Learly_end +#else /* BIG ENDIAN */ + add.f r1,r4,30 ; r1 mod 31 := -1; clear carry + ror r5,r4 + sub3 r7,r1,r0 + btst_s r0,2 + sub r1,r2,r4 + bic_s r1,r1,r2 + bmsk r1,r1,r7 + sub r12,r6,r4 + bic r12,r12,r6 + bmsk.ne r12,r12,r7 + or.eq r12,r12,r1 + and r12,r12,r5 + brne r12,0,.Learly_end +#endif /* ENDIAN */ + +.Loop: + ld_s r2,[r3,4] + ld.a r6,[r3,8] + ; stall for load result + sub r1,r2,r4 + bic_s r1,r1,r2 + sub r12,r6,r4 + bic r12,r12,r6 + or_s r12,r12,r1 + and r12,r12,r5 + breq_s r12,0,.Loop +.Lend: + and.f r1,r1,r5 + sub.ne r3,r3,4 +#ifdef __LITTLE_ENDIAN__ + mov.eq r1,r12 + btst_s r1,7 + sub r0,r3,r0 + add.eq r0,r0,1 + bmsk.f 0,r1,15 + add.eq r0,r0,1 + bmsk.f 0,r1,23 + j_s.d [blink] + add.eq r0,r0,1 +#else /* BIG ENDIAN */ +#ifdef __OPTIMIZE_SIZE__ +1: ldb_s r1,[r3] + breq_s r1,0,0f + ldb.a r1,[r3,1] + breq_s r1,0,0f + ldb.a r1,[r3,1] + breq_s r1,0,0f + add_s r3,r3,1 +0: j_s.d [blink] + sub r0,r3,r0 + +#define SPECIAL_EARLY_END +.Learly_end: + mov_s r3,r0 + b_s 1b +#elif 0 /* Need more information about pipeline to assess if this is faster. */ + mov.eq r2,r6 + and r2,r2,r5 + sub1 r2,r4,r2 + mov.eq r1,r12 + bic.f r1,r1,r2 + sub r0,r3,r0 + add.pl r0,r0,1 + btst.pl r1,23 + add.eq r0,r0,1 + btst.eq r1,15 + j_s.d [blink] + add.eq r0,r0,1 +#else /* !__OPTIMIZE_SIZE__ */ + /* Need carry clear here. */ + mov.eq r2,r6 +1: bmsk r1,r2,23 + breq r1,r2,0f + bmsk r2,r1,15 + breq.d r1,r2,0f + add_s r3,r3,1 + cmp r2,0x100 + add_s r3,r3,2 +0: j_s.d [blink] + sbc r0,r3,r0 + +#define SPECIAL_EARLY_END +.Learly_end: + sub_s.ne r1,r1,r1 + mov_s r12,0 + bset r12,r12,r7 + sub1 r2,r2,r12 + b.d .Lend + sub1.ne r6,r6,r12 +#endif /* !__OPTIMIZE_SIZE__ */ +#endif /* ENDIAN */ + +#ifndef SPECIAL_EARLY_END + .balign 4 +.Learly_end: + b.d .Lend + sub_s.ne r1,r1,r1 +#endif /* !SPECIAL_EARLY_END */ +ENDFUNC (strlen) +#endif /* __ARC601__ || !__ARC_BARREL_SHIFTER__*/ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strncpy-bs.S b/lib/machine/arc/strncpy-bs.S new file mode 100644 index 0000000..ec99152 --- /dev/null +++ b/lib/machine/arc/strncpy-bs.S @@ -0,0 +1,171 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strncpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +/* If dst and src are 4 byte aligned, copy 8 bytes at a time. + If the src is 4, but not 8 byte aligned, we first read 4 bytes to get + it 8 byte aligned. Thus, we can do a little read-ahead, without + dereferencing a cache line that we should not touch. + Note that short and long instructions have been scheduled to avoid + branch stalls. + The beq_s to r3z could be made unaligned & long to avoid a stall + there, but the it is not likely to be taken often, and it + would also be likey to cost an unaligned mispredict at the next call. */ + +#if !defined (__ARC601__) && defined (__ARC_BARREL_SHIFTER__) + +#if defined (__ARC700___) || defined (__ARCEM__) || defined (__ARCHS__) +#define BRand(a,b,l) tst a,b ` bne_l l +#else +#define BRand(a,b,l) and a,a,b ` brne_s a,0,l +#endif + +ENTRY (strncpy) + cmp_s r2,8 + or r12,r0,r1 + bmsk.cc.f r12,r12,1 + brne.d r12,0,.Lbytewise + mov_s r10,r0 + ld_s r3,[r1,0] + mov r8,0x01010101 + sub lp_count,r2,1 + bbit0.d r1,2,.Loop_start + ror r11,r8 + sub r12,r3,r8 + bic_l r12,r12,r3 + BRand (r12,r11,.Lr3z) + mov_s r4,r3 + ld.a r3,[r1,4] + sub lp_count,lp_count,4 + st.ab r4,[r10,4] + .balign 4 +.Loop_start: + lsr.f lp_count,lp_count,3 + lpne .Loop_end + ld.a r4,[r1,4] + sub r12,r3,r8 + bic_s r12,r12,r3 + BRand (r12,r11,.Lr3z) + st.ab r3,[r10,4] + sub r12,r4,r8 + bic r12,r12,r4 + BRand (r12,r11,.Lr4z) + ld.a r3,[r1,4] + st.ab r4,[r10,4] +.Loop_end: + bcc_s .Lastword + ld.a r4,[r1,4] + sub r12,r3,r8 + bic_s r12,r12,r3 + BRand (r12,r11,.Lr3z) + st.ab r3,[r10,4] + mov_s r3,r4 +.Lastword: + and.f lp_count,r2,3 + mov.eq lp_count,4 + lp .Last_byte_end +#ifdef __LITTLE_ENDIAN__ + bmsk.f r1,r3,7 + lsr.ne r3,r3,8 +#else + lsr.f r1,r3,24 + asl.ne r3,r3,8 +#endif + stb.ab r1,[r10,1] +.Last_byte_end: + j_s [blink] + + .balign 4 +.Lr4z: + mov_l r3,r4 +.Lr3z: +#if defined (__ARC700__) || defined (__ARCEM__) || defined (__ARCHS__) +#ifdef __LITTLE_ENDIAN__ + bmsk.f r1,r3,7 + lsr_s r3,r3,8 +#else + lsr.f r1,r3,24 + asl_s r3,r3,8 +#endif + bne.d .Lr3z + stb.ab r1,[r10,1] +#else /* ! __ARC700__ */ +#ifdef __LITTLE_ENDIAN__ + bmsk.f r1,r3,7 +.Lr3z_loop: + lsr_s r3,r3,8 + stb.ab r1,[r10,1] + bne.d .Lr3z_loop + bmsk.f r1,r3,7 +#else + lsr.f r1,r3,24 +.Lr3z_loop: + asl_s r3,r3,8 + stb.ab r1,[r10,1] + bne.d .Lr3z_loop + lsr.f r1,r3,24 +#endif /* ENDIAN */ +#endif /* ! __ARC700__ */ +.Lzero_rest: + ; __strncpy_bzero requires: + ; return value in r0 + ; zeroing length in r2 + ; zeroing start address in r3 + mov_s r3,r10 + add_s r2,r2,r0 + b.d __strncpy_bzero + sub_s r2,r2,r3 + + .balign 4 +.Lbytewise: + sub.f r2,r2,1 + mov_l r3,r0 + jcs [blink] +.Lcharloop: + ldb.ab r12,[r1,1] + beq.d .Last_byte + sub.f r2,r2,1 + brne.d r12,0,.Lcharloop + stb.ab r12,[r3,1] + b.d __strncpy_bzero + stb.ab r12,[r3,1] +.Last_byte: + j_s.d [blink] + stb_l r12,[r3] +ENDFUNC (strncpy) +#endif /* !__ARC601__ && __ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arc/strncpy-stub.c b/lib/machine/arc/strncpy-stub.c new file mode 100644 index 0000000..3f8f9db --- /dev/null +++ b/lib/machine/arc/strncpy-stub.c @@ -0,0 +1,36 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "../../string/strncpy.c" +#else +/* See strncpy-*.S. */ +#endif diff --git a/lib/machine/arc/strncpy.S b/lib/machine/arc/strncpy.S new file mode 100644 index 0000000..b04f589 --- /dev/null +++ b/lib/machine/arc/strncpy.S @@ -0,0 +1,134 @@ +/* + Copyright (c) 2015, Synopsys, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1) Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2) Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3) Neither the name of the Synopsys, Inc., nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +/* This implementation is optimized for performance. For code size a generic + implementation of this function from newlib/libc/string/strncpy.c will be + used. */ +#if !defined (__OPTIMIZE_SIZE__) && !defined (PREFER_SIZE_OVER_SPEED) + +#include "asm.h" + +/* If dst and src are 4 byte aligned, copy 8 bytes at a time. + If the src is 4, but not 8 byte aligned, we first read 4 bytes to get + it 8 byte aligned. Thus, we can do a little read-ahead, without + dereferencing a cache line that we should not touch. */ + +#if defined (__ARC601__) || !defined (__ARC_BARREL_SHIFTER__) + +#define BRand(a,b,l) and a,a,b ` brne_s a,0,l + +ENTRY (strncpy) + cmp_s r2,8 + or r12,r0,r1 + bmsk.cc.f r12,r12,1 + brne.d r12,0,.Lbytewise + mov_s r10,r0 + ld_s r3,[r1,0] + mov r8,0x01010101 + add r6,r0,r2 + sub r6,r6,8 + bbit0.d r1,2,.Loop_start + ror r11,r8 + sub r12,r3,r8 + bic_l r12,r12,r3 + BRand (r12,r11,.Lr3z) + mov_s r4,r3 + ld.a r3,[r1,4] + st.ab r4,[r10,4] + .balign 4 +.Loop_start: + brhs r10,r6,.Loop_end +1: + ld.a r4,[r1,4] + sub r12,r3,r8 + bic_s r12,r12,r3 + BRand (r12,r11,.Lr3z2) + st.ab r3,[r10,8] + sub r12,r4,r8 + bic r12,r12,r4 + BRand (r12,r11,.Lr4z) + ld.a r3,[r1,4] + brlo.d r10,r6,1b + st r4,[r10,-4] +.Loop_end: + add r6,r6,4 + brhs r10,r6,.Lastword + sub r12,r3,r8 + bic_s r12,r12,r3 + BRand (r12,r11,.Lr3z) + add_s r1,r1,4 + st.ab r3,[r10,4] +.Lastword: + sub_s r2,r2,1 + b.d .Lstart_charloop + bmsk.f r2,r2,1 + + .balign 4 + nop_s +.Lr3z2: sub_s r1,r1,4 +.Lr4z: +.Lr3z: + .balign 4 +.Lr3z_loop: + ldb.ab r3,[r1,1] + brne.d r3,0,.Lr3z_loop + stb.ab r3,[r10,1] + +.Lzero_rest: + ; __strncpy_bzero requires: + ; return value in r0 + ; zeroing length in r2 + ; zeroing start address in r3 + mov_s r3,r10 + add_s r2,r2,r0 + b.d __strncpy_bzero + sub_s r2,r2,r3 + + .balign 4 +.Lbytewise: + sub.f r2,r2,1 + jcs [blink] +.Lstart_charloop: + mov_s r3,r10 +.Lcharloop: + ldb.ab r12,[r1,1] + beq.d .Last_byte + sub.f r2,r2,1 + brne.d r12,0,.Lcharloop + stb.ab r12,[r3,1] + b.d __strncpy_bzero + stb.ab r12,[r3,1] +.Last_byte: + j_s.d [blink] + stb_s r12,[r3] +ENDFUNC (strncpy) +#endif /* __ARC601__ || !__ARC_BARREL_SHIFTER__ */ + +#endif /* !__OPTIMIZE_SIZE__ && !PREFER_SIZE_OVER_SPEED */ diff --git a/lib/machine/arm/Makefile.inc b/lib/machine/arm/Makefile.inc new file mode 100644 index 0000000..2d6c08d --- /dev/null +++ b/lib/machine/arm/Makefile.inc @@ -0,0 +1,11 @@ +libc_a_SOURCES += \ + %D%/setjmp.S %D%/strcmp.S %D%/strcpy.c \ + %D%/aeabi_memcpy.c %D%/aeabi_memcpy-armv7a.S \ + %D%/aeabi_memmove.c %D%/aeabi_memmove-soft.S \ + %D%/aeabi_memset.c %D%/aeabi_memset-soft.S %D%/aeabi_memclr.c \ + %D%/memchr-stub.c \ + %D%/memchr.S \ + %D%/memcpy-stub.c \ + %D%/memcpy.S \ + %D%/strlen-stub.c \ + %D%/strlen.S diff --git a/lib/machine/arm/aeabi_memclr.c b/lib/machine/arm/aeabi_memclr.c new file mode 100644 index 0000000..6da9135 --- /dev/null +++ b/lib/machine/arm/aeabi_memclr.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include <_ansi.h> + +/* Support the alias for the __aeabi_memclr which may + assume memory alignment. */ +void __aeabi_memclr4 (void *dest, size_t n) + _ATTRIBUTE ((alias ("__aeabi_memclr"))); + +void __aeabi_memclr8 (void *dest, size_t n) + _ATTRIBUTE ((alias ("__aeabi_memclr"))); + +/* Support the routine __aeabi_memclr. */ +void __aeabi_memclr (void *dest, size_t n) +{ + extern void __aeabi_memset (void *dest, size_t n, int c); + __aeabi_memset (dest, n, 0); +} diff --git a/lib/machine/arm/aeabi_memcpy-armv7a.S b/lib/machine/arm/aeabi_memcpy-armv7a.S new file mode 100644 index 0000000..0de3104 --- /dev/null +++ b/lib/machine/arm/aeabi_memcpy-armv7a.S @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +/* NOTE: This ifdef MUST match the one in aeabi_memcpy.c. */ +#if defined (__ARM_ARCH_7A__) && defined (__ARM_FEATURE_UNALIGNED) && \ + (defined (__ARM_NEON__) || !defined (__SOFTFP__)) + + .syntax unified + .global __aeabi_memcpy + .type __aeabi_memcpy, %function +__aeabi_memcpy: + /* Assumes that n >= 0, and dst, src are valid pointers. + If there is at least 8 bytes to copy, use LDRD/STRD. + If src and dst are misaligned with different offsets, + first copy byte by byte until dst is aligned, + and then copy using LDRD/STRD and shift if needed. + When less than 8 left, copy a word and then byte by byte. */ + + /* Save registers (r0 holds the return value): + optimized push {r0, r4, r5, lr}. + To try and improve performance, stack layout changed, + i.e., not keeping the stack looking like users expect + (highest numbered register at highest address). */ + push {r0, lr} + strd r4, r5, [sp, #-8]! + + /* Get copying of tiny blocks out of the way first. */ + /* Is there at least 4 bytes to copy? */ + subs r2, r2, #4 + blt copy_less_than_4 /* If n < 4. */ + + /* Check word alignment. */ + ands ip, r0, #3 /* ip = last 2 bits of dst. */ + bne dst_not_word_aligned /* If dst is not word-aligned. */ + + /* Get here if dst is word-aligned. */ + ands ip, r1, #3 /* ip = last 2 bits of src. */ + bne src_not_word_aligned /* If src is not word-aligned. */ +word_aligned: + /* Get here if source and dst both are word-aligned. + The number of bytes remaining to copy is r2+4. */ + + /* Is there is at least 64 bytes to copy? */ + subs r2, r2, #60 + blt copy_less_than_64 /* If r2 + 4 < 64. */ + + /* First, align the destination buffer to 8-bytes, + to make sure double loads and stores don't cross cache line boundary, + as they are then more expensive even if the data is in the cache + (require two load/store issue cycles instead of one). + If only one of the buffers is not 8-bytes aligned, + then it's more important to align dst than src, + because there is more penalty for stores + than loads that cross cacheline boundary. + This check and realignment are only worth doing + if there is a lot to copy. */ + + /* Get here if dst is word aligned, + i.e., the 2 least significant bits are 0. + If dst is not 2w aligned (i.e., the 3rd bit is not set in dst), + then copy 1 word (4 bytes). */ + ands r3, r0, #4 + beq two_word_aligned /* If dst already two-word aligned. */ + ldr r3, [r1], #4 + str r3, [r0], #4 + subs r2, r2, #4 + blt copy_less_than_64 + +two_word_aligned: + /* TODO: Align to cacheline (useful for PLD optimization). */ + + /* Every loop iteration copies 64 bytes. */ +1: + .irp offset, #0, #8, #16, #24, #32, #40, #48, #56 + ldrd r4, r5, [r1, \offset] + strd r4, r5, [r0, \offset] + .endr + + add r0, r0, #64 + add r1, r1, #64 + subs r2, r2, #64 + bge 1b /* If there is more to copy. */ + +copy_less_than_64: + + /* Get here if less than 64 bytes to copy, -64 <= r2 < 0. + Restore the count if there is more than 7 bytes to copy. */ + adds r2, r2, #56 + blt copy_less_than_8 + + /* Copy 8 bytes at a time. */ +2: + ldrd r4, r5, [r1], #8 + strd r4, r5, [r0], #8 + subs r2, r2, #8 + bge 2b /* If there is more to copy. */ + +copy_less_than_8: + + /* Get here if less than 8 bytes to copy, -8 <= r2 < 0. + Check if there is more to copy. */ + cmn r2, #8 + beq return /* If r2 + 8 == 0. */ + + /* Restore the count if there is more than 3 bytes to copy. */ + adds r2, r2, #4 + blt copy_less_than_4 + + /* Copy 4 bytes. */ + ldr r3, [r1], #4 + str r3, [r0], #4 + +copy_less_than_4: + /* Get here if less than 4 bytes to copy, -4 <= r2 < 0. */ + + /* Restore the count, check if there is more to copy. */ + adds r2, r2, #4 + beq return /* If r2 == 0. */ + + /* Get here with r2 is in {1,2,3}={01,10,11}. */ + /* Logical shift left r2, insert 0s, update flags. */ + lsls r2, r2, #31 + + /* Copy byte by byte. + Condition ne means the last bit of r2 is 0. + Condition cs means the second to last bit of r2 is set, + i.e., r2 is 1 or 3. */ + itt ne + ldrbne r3, [r1], #1 + strbne r3, [r0], #1 + + itttt cs + ldrbcs r4, [r1], #1 + ldrbcs r5, [r1] + strbcs r4, [r0], #1 + strbcs r5, [r0] + +return: + /* Restore registers: optimized pop {r0, r4, r5, pc} */ + ldrd r4, r5, [sp], #8 + pop {r0, pc} /* This is the only return point of memcpy. */ + +dst_not_word_aligned: + + /* Get here when dst is not aligned and ip has the last 2 bits of dst, + i.e., ip is the offset of dst from word. + The number of bytes that remains to copy is r2 + 4, + i.e., there are at least 4 bytes to copy. + Write a partial word (0 to 3 bytes), such that dst becomes + word-aligned. */ + + /* If dst is at ip bytes offset from a word (with 0 < ip < 4), + then there are (4 - ip) bytes to fill up to align dst to the next + word. */ + rsb ip, ip, #4 /* ip = #4 - ip. */ + cmp ip, #2 + + /* Copy byte by byte with conditionals. */ + itt gt + ldrbgt r3, [r1], #1 + strbgt r3, [r0], #1 + + itt ge + ldrbge r4, [r1], #1 + strbge r4, [r0], #1 + + ldrb lr, [r1], #1 + strb lr, [r0], #1 + + /* Update the count. + ip holds the number of bytes we have just copied. */ + subs r2, r2, ip /* r2 = r2 - ip. */ + blt copy_less_than_4 /* If r2 < ip. */ + + /* Get here if there are more than 4 bytes to copy. + Check if src is aligned. If beforehand src and dst were not word + aligned but congruent (same offset), then now they are both + word-aligned, and we can copy the rest efficiently (without + shifting). */ + ands ip, r1, #3 /* ip = last 2 bits of src. */ + beq word_aligned /* If r1 is word-aligned. */ + +src_not_word_aligned: + /* Get here when src is not word-aligned, but dst is word-aligned. + The number of bytes that remains to copy is r2+4. */ + + /* Copy word by word using LDR when alignment can be done in hardware, + i.e., SCTLR.A is set, supporting unaligned access in LDR and STR. */ + subs r2, r2, #60 + blt 8f + +7: + /* Copy 64 bytes in every loop iteration. */ + .irp offset, #0, #4, #8, #12, #16, #20, #24, #28, #32, #36, #40, #44, #48, #52, #56, #60 + ldr r3, [r1, \offset] + str r3, [r0, \offset] + .endr + + add r0, r0, #64 + add r1, r1, #64 + subs r2, r2, #64 + bge 7b + +8: + /* Get here if less than 64 bytes to copy, -64 <= r2 < 0. + Check if there is more than 3 bytes to copy. */ + adds r2, r2, #60 + blt copy_less_than_4 + +9: + /* Get here if there is less than 64 but at least 4 bytes to copy, + where the number of bytes to copy is r2+4. */ + ldr r3, [r1], #4 + str r3, [r0], #4 + subs r2, r2, #4 + bge 9b + + b copy_less_than_4 + + + .syntax unified + .global __aeabi_memcpy4 + .type __aeabi_memcpy4, %function +__aeabi_memcpy4: + /* Assumes that both of its arguments are 4-byte aligned. */ + + push {r0, lr} + strd r4, r5, [sp, #-8]! + + /* Is there at least 4 bytes to copy? */ + subs r2, r2, #4 + blt copy_less_than_4 /* If n < 4. */ + + bl word_aligned + + .syntax unified + .global __aeabi_memcpy8 + .type __aeabi_memcpy8, %function +__aeabi_memcpy8: + /* Assumes that both of its arguments are 8-byte aligned. */ + + push {r0, lr} + strd r4, r5, [sp, #-8]! + + /* Is there at least 4 bytes to copy? */ + subs r2, r2, #4 + blt copy_less_than_4 /* If n < 4. */ + + /* Is there at least 8 bytes to copy? */ + subs r2, r2, #4 + blt copy_less_than_8 /* If n < 8. */ + + /* Is there at least 64 bytes to copy? */ + subs r2, r2, #56 + blt copy_less_than_64 /* if n + 8 < 64. */ + + bl two_word_aligned + +#endif diff --git a/lib/machine/arm/aeabi_memcpy.c b/lib/machine/arm/aeabi_memcpy.c new file mode 100644 index 0000000..9837c35 --- /dev/null +++ b/lib/machine/arm/aeabi_memcpy.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include <_ansi.h> + +/* According to the Run-time ABI for the ARM Architecture. This + function is allowed to corrupt only the integer core register + permitted to be corrupted by the [AAPCS] (r0-r3, ip, lr, and + CPSR). + + The FP registers are used in memcpy for target __ARM_ARCH_7A. + Therefore, we can't just simply use alias to support the function + aeabi_memcpy for target __ARM_ARCH_7A. Instead, we choose the + previous versions of memcpy to suppport it as an alternative. */ + +/* NOTE: This ifdef MUST match the one in aeabi_memcpy-armv7a.S. */ +#if defined (__ARM_ARCH_7A__) && defined (__ARM_FEATURE_UNALIGNED) && \ + (defined (__ARM_NEON__) || !defined (__SOFTFP__)) + +/* Defined in aeabi_memcpy-armv7a.S. */ + +#else +/* Support the alias for the __aeabi_memcpy which may + assume memory alignment. */ +void __aeabi_memcpy4 (void *dest, const void *source, size_t n) + _ATTRIBUTE ((alias ("__aeabi_memcpy"))); + +void __aeabi_memcpy8 (void *dest, const void *source, size_t n) + _ATTRIBUTE ((alias ("__aeabi_memcpy"))); + +/* Support the routine __aeabi_memcpy. Can't alias to memcpy + because it's not defined in the same translation unit. */ +void __aeabi_memcpy (void *dest, const void *source, size_t n) +{ + extern void memcpy (void *dest, const void *source, size_t n); + memcpy (dest, source, n); +} +#endif diff --git a/lib/machine/arm/aeabi_memmove-arm.S b/lib/machine/arm/aeabi_memmove-arm.S new file mode 100644 index 0000000..541444d --- /dev/null +++ b/lib/machine/arm/aeabi_memmove-arm.S @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + .arm + .syntax unified + .global __aeabi_memmove + .type __aeabi_memmove, %function + ASM_ALIAS __aeabi_memmove4 __aeabi_memmove + ASM_ALIAS __aeabi_memmove8 __aeabi_memmove +__aeabi_memmove: + cmp r0, r1 + bls 2f + add r3, r1, r2 + cmp r0, r3 + bcs 2f + cmp r2, #0 + add r1, r0, r2 + bxeq lr + rsb r2, r2, r3 +1: + ldrb ip, [r3, #-1]! + cmp r2, r3 + strb ip, [r1, #-1]! + bne 1b + bx lr +2: + cmp r2, #0 + addne r2, r1, r2 + subne r3, r0, #1 + beq 4f +3: + ldrb ip, [r1], #1 + cmp r2, r1 + strb ip, [r3, #1]! + bne 3b + bx lr +4: + bx lr + .size __aeabi_memmove, . - __aeabi_memmove diff --git a/lib/machine/arm/aeabi_memmove-soft.S b/lib/machine/arm/aeabi_memmove-soft.S new file mode 100644 index 0000000..8c071bd --- /dev/null +++ b/lib/machine/arm/aeabi_memmove-soft.S @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +.macro ASM_ALIAS new old + .global \new + .type \new, %function +#if defined (__thumb__) + .thumb_set \new, \old +#else + .set \new, \old +#endif +.endm + +/* NOTE: This ifdef MUST match the one in aeabi_memmove.c. */ +#if !defined (__SOFTFP__) + +# if defined (__thumb2__) +# include "aeabi_memmove-thumb2.S" +# elif defined (__thumb__) +# include "aeabi_memmove-thumb.S" +# else +# include "aeabi_memmove-arm.S" +# endif + +#endif diff --git a/lib/machine/arm/aeabi_memmove-thumb.S b/lib/machine/arm/aeabi_memmove-thumb.S new file mode 100644 index 0000000..4881d34 --- /dev/null +++ b/lib/machine/arm/aeabi_memmove-thumb.S @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arm-acle-compat.h" + + .thumb + .syntax unified + .global __aeabi_memmove + .type __aeabi_memmove, %function + ASM_ALIAS __aeabi_memmove4 __aeabi_memmove + ASM_ALIAS __aeabi_memmove8 __aeabi_memmove +__aeabi_memmove: + push {r4, lr} + cmp r0, r1 + bls 3f + adds r4, r1, r2 + cmp r0, r4 + bcs 3f + subs r3, r2, #1 + cmp r2, #0 + beq 2f + subs r2, r4, r2 +1: + ldrb r1, [r2, r3] + strb r1, [r0, r3] + subs r3, r3, #1 + bcs 1b +2: +#if __ARM_ARCH >= 5 + pop {r4, pc} +#else + pop {r4} + pop {r1} + bx r1 +#endif +3: + movs r3, #0 + cmp r2, #0 + beq 2b +4: + ldrb r4, [r1, r3] + strb r4, [r0, r3] + adds r3, r3, #1 + cmp r2, r3 + bne 4b + b 2b + .size __aeabi_memmove, . - __aeabi_memmove diff --git a/lib/machine/arm/aeabi_memmove-thumb2.S b/lib/machine/arm/aeabi_memmove-thumb2.S new file mode 100644 index 0000000..20ca993 --- /dev/null +++ b/lib/machine/arm/aeabi_memmove-thumb2.S @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arm_asm.h" + + .thumb + .syntax unified + .global __aeabi_memmove + .type __aeabi_memmove, %function + ASM_ALIAS __aeabi_memmove4 __aeabi_memmove + ASM_ALIAS __aeabi_memmove8 __aeabi_memmove +__aeabi_memmove: + .fnstart + .cfi_startproc + prologue 4 + cmp r0, r1 + bls 3f + adds r3, r1, r2 + cmp r0, r3 + bcs 3f + adds r1, r0, r2 + cbz r2, 2f + subs r2, r3, r2 +1: + ldrb r4, [r3, #-1]! + cmp r2, r3 + strb r4, [r1, #-1]! + bne 1b +2: + .cfi_remember_state + epilogue 4 +3: + .cfi_restore_state + cmp r2, #0 + beq 2b + add r2, r2, r1 + subs r3, r0, #1 +4: + ldrb r4, [r1], #1 + cmp r2, r1 + strb r4, [r3, #1]! + bne 4b + epilogue 4 + .cfi_endproc + .cantunwind + .fnend + .size __aeabi_memmove, . - __aeabi_memmove diff --git a/lib/machine/arm/aeabi_memmove.c b/lib/machine/arm/aeabi_memmove.c new file mode 100644 index 0000000..1e2bbaf --- /dev/null +++ b/lib/machine/arm/aeabi_memmove.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include <_ansi.h> + +/* According to the run-time ABI for the ARM Architecture, this + function is allowed to corrupt only the integer core register + permitted to be corrupted by the [AAPCS] (r0-r3, ip, lr, and + CPSR). + + Therefore, we can't just simply use alias to support the function + aeabi_memmove for the targets with FP register. Instead, versions + for these specific targets are written in assembler (in + aeabi_memmove-soft.S). */ + +/* NOTE: This ifdef MUST match the one in aeabi_memmove-soft.S. */ +#if !defined (__SOFTFP__) + +/* Defined in aeabi_memmove-soft.S. */ + +#else +/* Support the alias for the __aeabi_memmove which may + assume memory alignment. */ +void __aeabi_memmove4 (void *dest, const void *source, size_t n) + _ATTRIBUTE ((alias ("__aeabi_memmove"))); + +void __aeabi_memmove8 (void *dest, const void *source, size_t n) + _ATTRIBUTE ((alias ("__aeabi_memmove"))); + +/* Support the routine __aeabi_memmove. Can't alias to memmove + because it's not defined in the same translation unit. */ +void __aeabi_memmove (void *dest, const void *source, size_t n) +{ + extern void memmove (void *dest, const void *source, size_t n); + memmove (dest, source, n); +} +#endif diff --git a/lib/machine/arm/aeabi_memset-arm.S b/lib/machine/arm/aeabi_memset-arm.S new file mode 100644 index 0000000..1c7bec5 --- /dev/null +++ b/lib/machine/arm/aeabi_memset-arm.S @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + .arm + .syntax unified + .global __aeabi_memset + .type __aeabi_memset, %function + ASM_ALIAS __aeabi_memset4 __aeabi_memset + ASM_ALIAS __aeabi_memset8 __aeabi_memset +__aeabi_memset: + tst r0, #3 + stmfd sp!, {r4, lr} + beq 10f + cmp r1, #0 + sub r1, r1, #1 + beq 9f + and ip, r2, #255 + mov r3, r0 + b 2f +1: + cmp r1, #0 + sub r1, r1, #1 + beq 9f +2: + strb ip, [r3], #1 + tst r3, #3 + bne 1b +3: + cmp r1, #3 + bls 7f + and lr, r2, #255 + orr lr, lr, lr, asl #8 + cmp r1, #15 + orr lr, lr, lr, asl #16 + bls 5f + mov r4, r1 + add ip, r3, #16 +4: + sub r4, r4, #16 + cmp r4, #15 + str lr, [ip, #-16] + str lr, [ip, #-12] + str lr, [ip, #-8] + str lr, [ip, #-4] + add ip, ip, #16 + bhi 4b + sub ip, r1, #16 + bic ip, ip, #15 + and r1, r1, #15 + add ip, ip, #16 + cmp r1, #3 + add r3, r3, ip + bls 7f +5: + mov r4, r3 + mov ip, r1 +6: + sub ip, ip, #4 + cmp ip, #3 + str lr, [r4], #4 + bhi 6b + sub ip, r1, #4 + bic ip, ip, #3 + add ip, ip, #4 + add r3, r3, ip + and r1, r1, #3 +7: + cmp r1, #0 + andne r2, r2, #255 + addne r1, r3, r1 + beq 9f +8: + strb r2, [r3], #1 + cmp r3, r1 + bne 8b +9: + ldmfd sp!, {r4, lr} + bx lr +10: + mov r3, r0 + b 3b + .size __aeabi_memset, . - __aeabi_memset diff --git a/lib/machine/arm/aeabi_memset-soft.S b/lib/machine/arm/aeabi_memset-soft.S new file mode 100644 index 0000000..cacf2f4 --- /dev/null +++ b/lib/machine/arm/aeabi_memset-soft.S @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +.macro ASM_ALIAS new old + .global \new + .type \new, %function +#if defined (__thumb__) + .thumb_set \new, \old +#else + .set \new, \old +#endif +.endm + +/* NOTE: This ifdef MUST match the one in aeabi_memset.c. */ +#if !defined (__SOFTFP__) + +# if defined (__thumb2__) +# include "aeabi_memset-thumb2.S" +# elif defined (__thumb__) +# include "aeabi_memset-thumb.S" +# else +# include "aeabi_memset-arm.S" +# endif + +#endif diff --git a/lib/machine/arm/aeabi_memset-thumb.S b/lib/machine/arm/aeabi_memset-thumb.S new file mode 100644 index 0000000..087c188 --- /dev/null +++ b/lib/machine/arm/aeabi_memset-thumb.S @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arm-acle-compat.h" + + .thumb + .syntax unified + .global __aeabi_memset + .type __aeabi_memset, %function + ASM_ALIAS __aeabi_memset4 __aeabi_memset + ASM_ALIAS __aeabi_memset8 __aeabi_memset +__aeabi_memset: + push {r4, r5, r6, lr} + lsls r3, r0, #30 + beq 10f + subs r4, r1, #1 + cmp r1, #0 + beq 9f + lsls r5, r2, #24 + lsrs r5, r5, #24 + movs r3, r0 + movs r6, #3 + b 2f +1: + subs r1, r4, #1 + cmp r4, #0 + beq 9f + movs r4, r1 +2: + adds r3, r3, #1 + subs r1, r3, #1 + strb r5, [r1] + tst r3, r6 + bne 1b +3: + cmp r4, #3 + bls 7f + movs r5, #255 + ands r5, r2 + lsls r1, r5, #8 + orrs r5, r1 + lsls r1, r5, #16 + orrs r5, r1 + cmp r4, #15 + bls 5f + movs r6, r4 + subs r6, r6, #16 + lsrs r6, r6, #4 + adds r6, r6, #1 + lsls r6, r6, #4 + movs r1, r3 + adds r3, r3, r6 +4: + str r5, [r1] + str r5, [r1, #4] + str r5, [r1, #8] + str r5, [r1, #12] + adds r1, r1, #16 + cmp r3, r1 + bne 4b + movs r1, #15 + ands r4, r1 + cmp r4, #3 + bls 7f +5: + subs r6, r4, #4 + lsrs r6, r6, #2 + adds r6, r6, #1 + lsls r6, r6, #2 + movs r1, r3 + adds r3, r3, r6 +6: + stmia r1!, {r5} + cmp r3, r1 + bne 6b + movs r1, #3 + ands r4, r1 +7: + cmp r4, #0 + beq 9f + lsls r2, r2, #24 + lsrs r2, r2, #24 + adds r4, r3, r4 +8: + strb r2, [r3] + adds r3, r3, #1 + cmp r4, r3 + bne 8b +9: +#if __ARM_ARCH >= 5 + pop {r4, r5, r6, pc} +#else + pop {r4, r5, r6} + pop {r1} + bx r1 +#endif +10: + movs r3, r0 + movs r4, r1 + b 3b + .size __aeabi_memset, . - __aeabi_memset diff --git a/lib/machine/arm/aeabi_memset-thumb2.S b/lib/machine/arm/aeabi_memset-thumb2.S new file mode 100644 index 0000000..6b77d38 --- /dev/null +++ b/lib/machine/arm/aeabi_memset-thumb2.S @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arm_asm.h" + + .thumb + .syntax unified + .global __aeabi_memset + .type __aeabi_memset, %function + .fnstart + .cfi_startproc + ASM_ALIAS __aeabi_memset4 __aeabi_memset + ASM_ALIAS __aeabi_memset8 __aeabi_memset +__aeabi_memset: + prologue 4 6 + lsls r4, r0, #30 + beq 10f + subs r4, r1, #1 + cmp r1, #0 + beq 9f + uxtb r5, r2 + mov r3, r0 + b 2f +1: + subs r1, r4, #1 + cbz r4, 9f + mov r4, r1 +2: + strb r5, [r3], #1 + lsls r1, r3, #30 + bne 1b +3: + cmp r4, #3 + bls 7f + uxtb r5, r2 + orr r5, r5, r5, lsl #8 + cmp r4, #15 + orr r5, r5, r5, lsl #16 + bls 5f + mov r6, r4 + add r1, r3, #16 +4: + subs r6, r6, #16 + cmp r6, #15 + str r5, [r1, #-16] + str r5, [r1, #-12] + str r5, [r1, #-8] + str r5, [r1, #-4] + add r1, r1, #16 + bhi 4b + sub r1, r4, #16 + bic r1, r1, #15 + and r4, r4, #15 + adds r1, r1, #16 + cmp r4, #3 + add r3, r3, r1 + bls 7f +5: + mov r6, r3 + mov r1, r4 +6: + subs r1, r1, #4 + cmp r1, #3 + str r5, [r6], #4 + bhi 6b + subs r1, r4, #4 + bic r1, r1, #3 + adds r1, r1, #4 + add r3, r3, r1 + and r4, r4, #3 +7: + cbz r4, 9f + uxtb r2, r2 + add r4, r4, r3 +8: + strb r2, [r3], #1 + cmp r3, r4 + bne 8b +9: + .cfi_remember_state + epilogue 4 6 +10: + .cfi_restore_state + mov r4, r1 + mov r3, r0 + b 3b + .cfi_endproc + .cantunwind + .fnend + .size __aeabi_memset, . - __aeabi_memset diff --git a/lib/machine/arm/aeabi_memset.c b/lib/machine/arm/aeabi_memset.c new file mode 100644 index 0000000..8a97320 --- /dev/null +++ b/lib/machine/arm/aeabi_memset.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include <_ansi.h> + +/* According to the run-time ABI for the ARM Architecture, this + function is allowed to corrupt only the integer core register + permitted to be corrupted by the [AAPCS] (r0-r3, ip, lr, and + CPSR). + + Therefore, we can't just simply use alias to support the function + aeabi_memset for the targets with FP register. Instead, versions + for these specific targets are written in assembler (in + aeabi_memset-soft.S). */ + +/* NOTE: This ifdef MUST match the one in aeabi_memset-soft.S. */ +#if !defined (__SOFTFP__) + +/* Defined in aeabi_memset-soft.S. */ + +#else +/* Support the alias for the __aeabi_memset which may + assume memory alignment. */ +void __aeabi_memset4 (void *dest, size_t n, int c) + _ATTRIBUTE ((alias ("__aeabi_memset"))); + +void __aeabi_memset8 (void *dest, size_t n, int c) + _ATTRIBUTE ((alias ("__aeabi_memset"))); + +/* Support the routine __aeabi_memset. Can't alias to memset + because it's not defined in the same translation unit. */ +void __aeabi_memset (void *dest, size_t n, int c) +{ + /*Note that relative to ANSI memset, __aeabi_memset hase the order + of its second and third arguments reversed. */ + extern void memset (void *dest, int c, size_t n); + memset (dest, c, n); +} +#endif diff --git a/lib/machine/arm/arm_asm.h b/lib/machine/arm/arm_asm.h new file mode 100644 index 0000000..d75bb8e --- /dev/null +++ b/lib/machine/arm/arm_asm.h @@ -0,0 +1,504 @@ +/* + * Copyright (c) 2009 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ARM_ASM__H +#define ARM_ASM__H + +#include "arm-acle-compat.h" + +#if __ARM_ARCH >= 7 && defined (__ARM_ARCH_ISA_ARM) +# define _ISA_ARM_7 +#endif + +#if __ARM_ARCH >= 6 && defined (__ARM_ARCH_ISA_ARM) +# define _ISA_ARM_6 +#endif + +#if __ARM_ARCH >= 5 +# define _ISA_ARM_5 +#endif + +#if __ARM_ARCH >= 4 && __ARM_ARCH_ISA_THUMB >= 1 +# define _ISA_ARM_4T +#endif + +#if __ARM_ARCH >= 4 && __ARM_ARCH_ISA_THUMB == 0 +# define _ISA_ARM_4 +#endif + + +#if __ARM_ARCH_ISA_THUMB >= 2 +# define _ISA_THUMB_2 +#endif + +#if __ARM_ARCH_ISA_THUMB >= 1 +# define _ISA_THUMB_1 +#endif + +/* Check whether leaf function PAC signing has been requested in the + -mbranch-protect compile-time option. */ +#define LEAF_PROTECT_BIT 2 + +#ifdef __ARM_FEATURE_PAC_DEFAULT +# define HAVE_PAC_LEAF \ + ((__ARM_FEATURE_PAC_DEFAULT & (1 << LEAF_PROTECT_BIT)) && 1) +#else +# define HAVE_PAC_LEAF 0 +#endif + +/* Provide default parameters for PAC-code handling in leaf-functions. */ +#if HAVE_PAC_LEAF +# ifndef PAC_LEAF_PUSH_IP +# define PAC_LEAF_PUSH_IP 1 +# endif +#else /* !HAVE_PAC_LEAF */ +# undef PAC_LEAF_PUSH_IP +# define PAC_LEAF_PUSH_IP 0 +#endif /* HAVE_PAC_LEAF */ + +#define STACK_ALIGN_ENFORCE 0 + +#ifdef __ASSEMBLER__ + +/****************************************************************************** +* Implementation of the prologue and epilogue assembler macros and their +* associated helper functions. +* +* These functions add support for the following: +* +* - M-profile branch target identification (BTI) landing-pads when compiled +* with `-mbranch-protection=bti'. +* - PAC-signing and verification instructions, depending on hardware support +* and whether the PAC-signing of leaf functions has been requested via the +* `-mbranch-protection=pac-ret+leaf' compiler argument. +* - 8-byte stack alignment preservation at function entry, defaulting to the +* value of STACK_ALIGN_ENFORCE. +* +* Notes: +* - Prologue stack alignment is implemented by detecting a push with an odd +* number of registers and prepending a dummy register to the list. +* - If alignment is attempted on a list containing r0, compilation will result +* in an error. +* - If alignment is attempted in a list containing r1, r0 will be prepended to +* the register list and r0 will be restored prior to function return. for +* functions with non-void return types, this will result in the corruption of +* the result register. +* - Stack alignment is enforced via the following helper macro call-chain: +* +* {prologue|epilogue} ->_align8 -> _preprocess_reglist -> +* _preprocess_reglist1 -> {_prologue|_epilogue} +* +* - Debug CFI directives are automatically added to prologues and epilogues, +* assisted by `cfisavelist' and `cfirestorelist', respectively. +* +* Arguments: +* prologue +* -------- +* - first - If `last' specified, this serves as start of general-purpose +* register (GPR) range to push onto stack, otherwise represents +* single GPR to push onto stack. If omitted, no GPRs pushed +* onto stack at prologue. +* - last - If given, specifies inclusive upper-bound of GPR range. +* - push_ip - Determines whether IP register is to be pushed to stack at +* prologue. When pac-signing is requested, this holds the +* the pac-key. Either 1 or 0 to push or not push, respectively. +* Default behavior: Set to value of PAC_LEAF_PUSH_IP macro. +* - push_lr - Determines whether to push lr to the stack on function entry. +* Either 1 or 0 to push or not push, respectively. +* - align8 - Whether to enforce alignment. Either 1 or 0, with 1 requesting +* alignment. +* +* epilogue +* -------- +* The epilogue should be called passing the same arguments as those passed to +* the prologue to ensure the stack is not corrupted on function return. +* +* Usage examples: +* +* prologue push_ip=1 -> push {ip} +* epilogue push_ip=1, align8=1 -> pop {r2, ip} +* prologue push_ip=1, push_lr=1 -> push {ip, lr} +* epilogue 1 -> pop {r1} +* prologue 1, align8=1 -> push {r0, r1} +* epilogue 1, push_ip=1 -> pop {r1, ip} +* prologue 1, 4 -> push {r1-r4} +* epilogue 1, 4 push_ip=1 -> pop {r1-r4, ip} +* +******************************************************************************/ + +/* Emit .cfi_restore directives for a consecutive sequence of registers. */ + .macro cfirestorelist first, last + .cfi_restore \last + .if \last-\first + cfirestorelist \first, \last-1 + .endif + .endm + +/* Emit .cfi_offset directives for a consecutive sequence of registers. */ + .macro cfisavelist first, last, index=1 + .cfi_offset \last, -4*(\index) + .if \last-\first + cfisavelist \first, \last-1, \index+1 + .endif + .endm + +.macro _prologue first=-1, last=-1, push_ip=PAC_LEAF_PUSH_IP, push_lr=0 + .if \push_ip & 1 != \push_ip + .error "push_ip may be either 0 or 1" + .endif + .if \push_lr & 1 != \push_lr + .error "push_lr may be either 0 or 1" + .endif + .if \first != -1 + .if \last == -1 + /* Upper-bound not provided: Set upper = lower. */ + _prologue \first, \first, \push_ip, \push_lr + .exitm + .endif + .endif +#if HAVE_PAC_LEAF +#if __ARM_FEATURE_BTI_DEFAULT + pacbti ip, lr, sp +#else + pac ip, lr, sp +#endif /* __ARM_FEATURE_BTI_DEFAULT */ + .cfi_register 143, 12 +#else +#if __ARM_FEATURE_BTI_DEFAULT + bti +#endif /* __ARM_FEATURE_BTI_DEFAULT */ +#endif /* HAVE_PAC_LEAF */ + .if \first != -1 + .if \last != \first + .if \last >= 13 + .error "SP cannot be in the save list" + .endif + .if \push_ip + .if \push_lr + /* Case 1: push register range, ip and lr registers. */ + push {r\first-r\last, ip, lr} + .cfi_adjust_cfa_offset ((\last-\first)+3)*4 + .cfi_offset 14, -4 + .cfi_offset 143, -8 + cfisavelist \first, \last, 3 + .else // !\push_lr + /* Case 2: push register range and ip register. */ + push {r\first-r\last, ip} + .cfi_adjust_cfa_offset ((\last-\first)+2)*4 + .cfi_offset 143, -4 + cfisavelist \first, \last, 2 + .endif + .else // !\push_ip + .if \push_lr + /* Case 3: push register range and lr register. */ + push {r\first-r\last, lr} + .cfi_adjust_cfa_offset ((\last-\first)+2)*4 + .cfi_offset 14, -4 + cfisavelist \first, \last, 2 + .else // !\push_lr + /* Case 4: push register range. */ + push {r\first-r\last} + .cfi_adjust_cfa_offset ((\last-\first)+1)*4 + cfisavelist \first, \last, 1 + .endif + .endif + .else // \last == \first + .if \push_ip + .if \push_lr + /* Case 5: push single GP register plus ip and lr registers. */ + push {r\first, ip, lr} + .cfi_adjust_cfa_offset 12 + .cfi_offset 14, -4 + .cfi_offset 143, -8 + cfisavelist \first, \first, 3 + .else // !\push_lr + /* Case 6: push single GP register plus ip register. */ + push {r\first, ip} + .cfi_adjust_cfa_offset 8 + .cfi_offset 143, -4 + cfisavelist \first, \first, 2 + .endif + .else // !\push_ip + .if \push_lr + /* Case 7: push single GP register plus lr register. */ + push {r\first, lr} + .cfi_adjust_cfa_offset 8 + .cfi_offset 14, -4 + cfisavelist \first, \first, 2 + .else // !\push_lr + /* Case 8: push single GP register. */ + push {r\first} + .cfi_adjust_cfa_offset 4 + cfisavelist \first, \first, 1 + .endif + .endif + .endif + .else // \first == -1 + .if \push_ip + .if \push_lr + /* Case 9: push ip and lr registers. */ + push {ip, lr} + .cfi_adjust_cfa_offset 8 + .cfi_offset 14, -4 + .cfi_offset 143, -8 + .else // !\push_lr + /* Case 10: push ip register. */ + push {ip} + .cfi_adjust_cfa_offset 4 + .cfi_offset 143, -4 + .endif + .else // !\push_ip + .if \push_lr + /* Case 11: push lr register. */ + push {lr} + .cfi_adjust_cfa_offset 4 + .cfi_offset 14, -4 + .endif + .endif + .endif +.endm + +.macro _epilogue first=-1, last=-1, push_ip=PAC_LEAF_PUSH_IP, push_lr=0 + .if \push_ip & 1 != \push_ip + .error "push_ip may be either 0 or 1" + .endif + .if \push_lr & 1 != \push_lr + .error "push_lr may be either 0 or 1" + .endif + .if \first != -1 + .if \last == -1 + /* Upper-bound not provided: Set upper = lower. */ + _epilogue \first, \first, \push_ip, \push_lr + .exitm + .endif + .if \last != \first + .if \last >= 13 + .error "SP cannot be in the save list" + .endif + .if \push_ip + .if \push_lr + /* Case 1: pop register range, ip and lr registers. */ + pop {r\first-r\last, ip, lr} + .cfi_restore 14 + .cfi_register 143, 12 + cfirestorelist \first, \last + .else // !\push_lr + /* Case 2: pop register range and ip register. */ + pop {r\first-r\last, ip} + .cfi_register 143, 12 + cfirestorelist \first, \last + .endif + .else // !\push_ip + .if \push_lr + /* Case 3: pop register range and lr register. */ + pop {r\first-r\last, lr} + .cfi_restore 14 + cfirestorelist \first, \last + .else // !\push_lr + /* Case 4: pop register range. */ + pop {r\first-r\last} + cfirestorelist \first, \last + .endif + .endif + .else // \last == \first + .if \push_ip + .if \push_lr + /* Case 5: pop single GP register plus ip and lr registers. */ + pop {r\first, ip, lr} + .cfi_restore 14 + .cfi_register 143, 12 + cfirestorelist \first, \first + .else // !\push_lr + /* Case 6: pop single GP register plus ip register. */ + pop {r\first, ip} + .cfi_register 143, 12 + cfirestorelist \first, \first + .endif + .else // !\push_ip + .if \push_lr + /* Case 7: pop single GP register plus lr register. */ + pop {r\first, lr} + .cfi_restore 14 + cfirestorelist \first, \first + .else // !\push_lr + /* Case 8: pop single GP register. */ + pop {r\first} + cfirestorelist \first, \first + .endif + .endif + .endif + .else // \first == -1 + .if \push_ip + .if \push_lr + /* Case 9: pop ip and lr registers. */ + pop {ip, lr} + .cfi_restore 14 + .cfi_register 143, 12 + .else // !\push_lr + /* Case 10: pop ip register. */ + pop {ip} + .cfi_register 143, 12 + .endif + .else // !\push_ip + .if \push_lr + /* Case 11: pop lr register. */ + pop {lr} + .cfi_restore 14 + .endif + .endif + .endif +#if HAVE_PAC_LEAF + aut ip, lr, sp +#endif /* HAVE_PAC_LEAF */ + bx lr +.endm + +# clean up expressions in 'last' +.macro _preprocess_reglist1 first:req, last:req, push_ip:req, push_lr:req, reglist_op:req + .if \last == 0 + \reglist_op \first, 0, \push_ip, \push_lr + .elseif \last == 1 + \reglist_op \first, 1, \push_ip, \push_lr + .elseif \last == 2 + \reglist_op \first, 2, \push_ip, \push_lr + .elseif \last == 3 + \reglist_op \first, 3, \push_ip, \push_lr + .elseif \last == 4 + \reglist_op \first, 4, \push_ip, \push_lr + .elseif \last == 5 + \reglist_op \first, 5, \push_ip, \push_lr + .elseif \last == 6 + \reglist_op \first, 6, \push_ip, \push_lr + .elseif \last == 7 + \reglist_op \first, 7, \push_ip, \push_lr + .elseif \last == 8 + \reglist_op \first, 8, \push_ip, \push_lr + .elseif \last == 9 + \reglist_op \first, 9, \push_ip, \push_lr + .elseif \last == 10 + \reglist_op \first, 10, \push_ip, \push_lr + .elseif \last == 11 + \reglist_op \first, 11, \push_ip, \push_lr + .else + .error "last (\last) out of range" + .endif +.endm + +# clean up expressions in 'first' +.macro _preprocess_reglist first:req, last, push_ip=0, push_lr=0, reglist_op:req + .ifb \last + _preprocess_reglist \first \first \push_ip \push_lr + .else + .if \first > \last + .error "last (\last) must be at least as great as first (\first)" + .endif + .if \first == 0 + _preprocess_reglist1 0, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 1 + _preprocess_reglist1 1, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 2 + _preprocess_reglist1 2, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 3 + _preprocess_reglist1 3, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 4 + _preprocess_reglist1 4, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 5 + _preprocess_reglist1 5, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 6 + _preprocess_reglist1 6, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 7 + _preprocess_reglist1 7, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 8 + _preprocess_reglist1 8, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 9 + _preprocess_reglist1 9, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 10 + _preprocess_reglist1 10, \last, \push_ip, \push_lr, \reglist_op + .elseif \first == 11 + _preprocess_reglist1 11, \last, \push_ip, \push_lr, \reglist_op + .else + .error "first (\first) out of range" + .endif + .endif +.endm + +.macro _align8 first, last, push_ip=0, push_lr=0, reglist_op=_prologue + .ifb \first + .ifnb \last + .error "can't have last (\last) without specifying first" + .else // \last not blank + .if ((\push_ip + \push_lr) % 2) == 0 + \reglist_op first=-1, last=-1, push_ip=\push_ip, push_lr=\push_lr + .exitm + .else // ((\push_ip + \push_lr) % 2) odd + _align8 2, 2, \push_ip, \push_lr, \reglist_op + .exitm + .endif // ((\push_ip + \push_lr) % 2) == 0 + .endif // .ifnb \last + .endif // .ifb \first + + .ifb \last + _align8 \first, \first, \push_ip, \push_lr, \reglist_op + .else + .if \push_ip & 1 <> \push_ip + .error "push_ip may be 0 or 1" + .endif + .if \push_lr & 1 <> \push_lr + .error "push_lr may be 0 or 1" + .endif + .ifeq (\last - \first + \push_ip + \push_lr) % 2 + .if \first == 0 + .error "Alignment required and first register is r0" + .exitm + .endif + _preprocess_reglist \first-1, \last, \push_ip, \push_lr, \reglist_op + .else + _preprocess_reglist \first \last, \push_ip, \push_lr, \reglist_op + .endif + .endif +.endm + +.macro prologue first, last, push_ip=PAC_LEAF_PUSH_IP, push_lr=0, align8=STACK_ALIGN_ENFORCE + .if \align8 + _align8 \first, \last, \push_ip, \push_lr, _prologue + .else + _prologue first=\first, last=\last, push_ip=\push_ip, push_lr=\push_lr + .endif +.endm + +.macro epilogue first, last, push_ip=PAC_LEAF_PUSH_IP, push_lr=0, align8=STACK_ALIGN_ENFORCE + .if \align8 + _align8 \first, \last, \push_ip, \push_lr, reglist_op=_epilogue + .else + _epilogue first=\first, last=\last, push_ip=\push_ip, push_lr=\push_lr + .endif +.endm + +#endif /* __ASSEMBLER__ */ + +#endif /* ARM_ASM__H */ diff --git a/lib/machine/arm/machine/_endian.h b/lib/machine/arm/machine/_endian.h new file mode 100644 index 0000000..3f50a69 --- /dev/null +++ b/lib/machine/arm/machine/_endian.h @@ -0,0 +1,39 @@ +/* ARM configuration file. + Copyright (c) 2015 ARM Ltd. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#ifndef __MACHINE_ENDIAN_H__ +#error "must be included via " +#endif /* !__MACHINE_ENDIAN_H__ */ + +#define _LITTLE_ENDIAN 1234 +#define _BIG_ENDIAN 4321 +#define _PDP_ENDIAN 3412 + +#ifdef __ARMEB__ +#define _BYTE_ORDER _BIG_ENDIAN +#else +#define _BYTE_ORDER _LITTLE_ENDIAN +#endif diff --git a/lib/machine/arm/machine/param.h b/lib/machine/arm/machine/param.h new file mode 100644 index 0000000..513f7b0 --- /dev/null +++ b/lib/machine/arm/machine/param.h @@ -0,0 +1,8 @@ +/* ARM configuration file; HZ is 100 rather than the default 60 */ + +#ifndef _MACHINE_PARAM_H +# define _MACHINE_PARAM_H + +# define HZ (100) + +#endif diff --git a/lib/machine/arm/memchr-stub.c b/lib/machine/arm/memchr-stub.c new file mode 100644 index 0000000..48451a1 --- /dev/null +++ b/lib/machine/arm/memchr-stub.c @@ -0,0 +1,38 @@ +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* The structure of the following #if #else #endif conditional chain + must match the chain in memchr.S. */ + +#include "arm-acle-compat.h" + +#if defined (__ARM_NEON__) || defined (__ARM_NEON) +/* Defined in memchr.S. */ +#elif __ARM_ARCH_ISA_THUMB >= 2 && defined (__ARM_FEATURE_DSP) +/* Defined in memchr.S. */ +#else +# include "../../string/memchr.c" +#endif diff --git a/lib/machine/arm/memchr.S b/lib/machine/arm/memchr.S new file mode 100644 index 0000000..d13ef8d --- /dev/null +++ b/lib/machine/arm/memchr.S @@ -0,0 +1,424 @@ +/* Copyright (c) 2010-2011, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Linaro Limited nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Written by Dave Gilbert + + This memchr routine is optimised on a Cortex-A9 and should work on + all ARMv7 processors. It has a fast path for short sizes, and has + an optimised path for large data sets; the worst case is finding the + match early in a large data set. */ + +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +@ 2011-02-07 david.gilbert@linaro.org +@ Extracted from local git a5b438d861 +@ 2011-07-14 david.gilbert@linaro.org +@ Import endianness fix from local git ea786f1b +@ 2011-10-11 david.gilbert@linaro.org +@ Import from cortex-strings bzr rev 63 +@ Flip to ldrd (as suggested by Greta Yorsh) +@ Make conditional on CPU type +@ tidy + +@ This code requires armv6t2 or later. Uses Thumb2. + + .syntax unified + +#include "arm-acle-compat.h" +#include "arm_asm.h" + +@ NOTE: This ifdef MUST match the one in memchr-stub.c +#if defined (__ARM_NEON__) || defined (__ARM_NEON) +#if __ARM_ARCH >= 8 && __ARM_ARCH_PROFILE == 'R' + .arch armv8-r +#else + .arch armv7-a +#endif + .fpu neon + + +/* Arguments */ +#define srcin r0 +#define chrin r1 +#define cntin r2 + +/* Retval */ +#define result r0 /* Live range does not overlap with srcin */ + +/* Working registers */ +#define src r1 /* Live range does not overlap with chrin */ +#define tmp r3 +#define synd r0 /* No overlap with srcin or result */ +#define soff r12 + +/* Working NEON registers */ +#define vrepchr q0 +#define vdata0 q1 +#define vdata0_0 d2 /* Lower half of vdata0 */ +#define vdata0_1 d3 /* Upper half of vdata0 */ +#define vdata1 q2 +#define vdata1_0 d4 /* Lower half of vhas_chr0 */ +#define vdata1_1 d5 /* Upper half of vhas_chr0 */ +#define vrepmask q3 +#define vrepmask0 d6 +#define vrepmask1 d7 +#define vend q4 +#define vend0 d8 +#define vend1 d9 + +/* + * Core algorithm: + * + * For each 32-byte chunk we calculate a 32-bit syndrome value, with one bit per + * byte. Each bit is set if the relevant byte matched the requested character + * and cleared otherwise. Since the bits in the syndrome reflect exactly the + * order in which things occur in the original string, counting trailing zeros + * allows to identify exactly which byte has matched. + */ + + .text + .thumb_func + .align 4 + .p2align 4,,15 + .global memchr + .type memchr,%function + +memchr: + .cfi_sections .debug_frame + .cfi_startproc + /* Use a simple loop if there are less than 8 bytes to search. */ + cmp cntin, #7 + bhi .Llargestr + and chrin, chrin, #0xff + +.Lsmallstr: + subs cntin, cntin, #1 + blo .Lnotfound /* Return not found if reached end. */ + ldrb tmp, [srcin], #1 + cmp tmp, chrin + bne .Lsmallstr /* Loop again if not found. */ + /* Otherwise fixup address and return. */ + sub result, result, #1 + bx lr + + +.Llargestr: + vdup.8 vrepchr, chrin /* Duplicate char across all lanes. */ + /* + * Magic constant 0x8040201008040201 allows us to identify which lane + * matches the requested byte. + */ + movw tmp, #0x0201 + movt tmp, #0x0804 + lsl soff, tmp, #4 + vmov vrepmask0, tmp, soff + vmov vrepmask1, tmp, soff + /* Work with aligned 32-byte chunks */ + bic src, srcin, #31 + ands soff, srcin, #31 + beq .Lloopintro /* Go straight to main loop if it's aligned. */ + + /* + * Input string is not 32-byte aligned. We calculate the syndrome + * value for the aligned 32 bytes block containing the first bytes + * and mask the irrelevant part. + */ + vld1.8 {vdata0, vdata1}, [src:256]! + sub tmp, soff, #32 + adds cntin, cntin, tmp + vceq.i8 vdata0, vdata0, vrepchr + vceq.i8 vdata1, vdata1, vrepchr + vand vdata0, vdata0, vrepmask + vand vdata1, vdata1, vrepmask + vpadd.i8 vdata0_0, vdata0_0, vdata0_1 + vpadd.i8 vdata1_0, vdata1_0, vdata1_1 + vpadd.i8 vdata0_0, vdata0_0, vdata1_0 + vpadd.i8 vdata0_0, vdata0_0, vdata0_0 + vmov synd, vdata0_0[0] + + /* Clear the soff lower bits */ + lsr synd, synd, soff + lsl synd, synd, soff + /* The first block can also be the last */ + bls .Lmasklast + /* Have we found something already? */ + cbnz synd, .Ltail + + +.Lloopintro: + vpush {vend} + /* 264/265 correspond to d8/d9 for q4 */ + .cfi_adjust_cfa_offset 16 + .cfi_rel_offset 264, 0 + .cfi_rel_offset 265, 8 + .p2align 3,,7 +.Lloop: + vld1.8 {vdata0, vdata1}, [src:256]! + subs cntin, cntin, #32 + vceq.i8 vdata0, vdata0, vrepchr + vceq.i8 vdata1, vdata1, vrepchr + /* If we're out of data we finish regardless of the result. */ + bls .Lend + /* Use a fast check for the termination condition. */ + vorr vend, vdata0, vdata1 + vorr vend0, vend0, vend1 + vmov synd, tmp, vend0 + orrs synd, synd, tmp + /* We're not out of data, loop if we haven't found the character. */ + beq .Lloop + +.Lend: + vpop {vend} + .cfi_adjust_cfa_offset -16 + .cfi_restore 264 + .cfi_restore 265 + + /* Termination condition found, let's calculate the syndrome value. */ + vand vdata0, vdata0, vrepmask + vand vdata1, vdata1, vrepmask + vpadd.i8 vdata0_0, vdata0_0, vdata0_1 + vpadd.i8 vdata1_0, vdata1_0, vdata1_1 + vpadd.i8 vdata0_0, vdata0_0, vdata1_0 + vpadd.i8 vdata0_0, vdata0_0, vdata0_0 + vmov synd, vdata0_0[0] + cbz synd, .Lnotfound + bhi .Ltail + + +.Lmasklast: + /* Clear the (-cntin) upper bits to avoid out-of-bounds matches. */ + neg cntin, cntin + lsl synd, synd, cntin + lsrs synd, synd, cntin + it eq + moveq src, #0 /* If no match, set src to 0 so the retval is 0. */ + + +.Ltail: + /* Count the trailing zeros using bit reversing */ + rbit synd, synd + /* Compensate the last post-increment */ + sub src, src, #32 + /* Count the leading zeros */ + clz synd, synd + /* Compute the potential result and return */ + add result, src, synd + bx lr + + +.Lnotfound: + /* Set result to NULL if not found and return */ + mov result, #0 + bx lr + + .cfi_endproc + .size memchr, . - memchr + +#elif __ARM_ARCH_ISA_THUMB >= 2 && defined (__ARM_FEATURE_DSP) + +#if __ARM_ARCH_PROFILE == 'M' +#if __ARM_ARCH >= 8 + /* keep config inherited from -march=. */ +#else + .arch armv7e-m +#endif /* __ARM_ARCH >= 8 */ +#else + .arch armv6t2 +#endif /* __ARM_ARCH_PROFILE == 'M' */ + +@ this lets us check a flag in a 00/ff byte easily in either endianness +#ifdef __ARMEB__ +#define CHARTSTMASK(c) 1<<(31-(c*8)) +#else +#define CHARTSTMASK(c) 1<<(c*8) +#endif + .text + .thumb + +@ --------------------------------------------------------------------------- + .thumb_func + .align 2 + .p2align 4,,15 + .global memchr + .type memchr,%function + .fnstart + .cfi_startproc +memchr: + @ r0 = start of memory to scan + @ r1 = character to look for + @ r2 = length + @ returns r0 = pointer to character or NULL if not found + prologue + and r1,r1,#0xff @ Don't trust the caller to pass a char + + cmp r2,#16 @ If short don't bother with anything clever + blt 20f + + tst r0, #7 @ If it's already aligned skip the next bit + beq 10f + + @ Work up to an aligned point +5: + ldrb r3, [r0],#1 + subs r2, r2, #1 + cmp r3, r1 + beq 50f @ If it matches exit found + tst r0, #7 + cbz r2, 40f @ If we run off the end, exit not found + bne 5b @ If not aligned yet then do next byte + +10: + @ We are aligned, we know we have at least 8 bytes to work with + push {r4,r5,r6,r7} + .cfi_adjust_cfa_offset 16 + .cfi_rel_offset 4, 0 + .cfi_rel_offset 5, 4 + .cfi_rel_offset 6, 8 + .cfi_rel_offset 7, 12 + orr r1, r1, r1, lsl #8 @ expand the match word across all bytes + orr r1, r1, r1, lsl #16 + bic r4, r2, #7 @ Number of double words to work with * 8 + mvns r7, #0 @ all F's + movs r3, #0 + +15: + ldrd r5,r6,[r0],#8 + subs r4, r4, #8 + eor r5,r5, r1 @ r5,r6 have 00's where bytes match the target + eor r6,r6, r1 + uadd8 r5, r5, r7 @ Par add 0xff - sets GE bits for bytes!=0 + sel r5, r3, r7 @ bytes are 00 for none-00 bytes, + @ or ff for 00 bytes - NOTE INVERSION + uadd8 r6, r6, r7 @ Par add 0xff - sets GE bits for bytes!=0 + sel r6, r5, r7 @ chained....bytes are 00 for none-00 bytes + @ or ff for 00 bytes - NOTE INVERSION + cbnz r6, 60f + bne 15b @ (Flags from the subs above) + + pop {r4,r5,r6,r7} + .cfi_restore 7 + .cfi_restore 6 + .cfi_restore 5 + .cfi_restore 4 + .cfi_adjust_cfa_offset -16 + and r1,r1,#0xff @ r1 back to a single character + and r2,r2,#7 @ Leave the count remaining as the number + @ after the double words have been done + +20: + cbz r2, 40f @ 0 length or hit the end already then not found + +21: @ Post aligned section, or just a short call + ldrb r3,[r0],#1 + subs r2,r2,#1 + eor r3,r3,r1 @ r3 = 0 if match - doesn't break flags from sub + cbz r3, 50f + bne 21b @ on r2 flags + +40: + .cfi_remember_state + movs r0,#0 @ not found + epilogue + +50: + .cfi_restore_state + .cfi_remember_state + subs r0,r0,#1 @ found + epilogue + +60: @ We're here because the fast path found a hit + @ now we have to track down exactly which word it was + @ r0 points to the start of the double word after the one tested + @ r5 has the 00/ff pattern for the first word, r6 has the chained value + @ This point is reached from cbnz midway through label 15 prior to + @ popping r4-r7 off the stack. .cfi_restore_state alone disregards + @ this, so we manually correct this. + .cfi_restore_state @ Standard post-prologue state + .cfi_adjust_cfa_offset 16 + .cfi_rel_offset 4, 0 + .cfi_rel_offset 5, 4 + .cfi_rel_offset 6, 8 + .cfi_rel_offset 7, 12 + cmp r5, #0 + itte eq + moveq r5, r6 @ the end is in the 2nd word + subeq r0,r0,#3 @ Points to 2nd byte of 2nd word + subne r0,r0,#7 @ or 2nd byte of 1st word + + @ r0 currently points to the 2nd byte of the word containing the hit + tst r5, # CHARTSTMASK(0) @ 1st character + bne 61f + adds r0,r0,#1 + tst r5, # CHARTSTMASK(1) @ 2nd character + ittt eq + addeq r0,r0,#1 + tsteq r5, # (3<<15) @ 2nd & 3rd character + @ If not the 3rd must be the last one + addeq r0,r0,#1 + +61: + pop {r4,r5,r6,r7} + .cfi_restore 7 + .cfi_restore 6 + .cfi_restore 5 + .cfi_restore 4 + .cfi_adjust_cfa_offset -16 + subs r0,r0,#1 + epilogue + .cfi_endproc + .cantunwind + .fnend +#else + /* Defined in memchr-stub.c. */ +#endif diff --git a/lib/machine/arm/memcpy-armv7a.S b/lib/machine/arm/memcpy-armv7a.S new file mode 100644 index 0000000..cd7962e --- /dev/null +++ b/lib/machine/arm/memcpy-armv7a.S @@ -0,0 +1,619 @@ +/* Copyright (c) 2013, Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Linaro Limited nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + This memcpy routine is optimised for Cortex-A15 cores and takes advantage + of VFP or NEON when built with the appropriate flags. + + Assumptions: + + ARMv6 (ARMv7-a if using Neon) + ARM state + Unaligned accesses + LDRD/STRD support unaligned word accesses + + If compiled with GCC, this file should be enclosed within following + pre-processing check: + if defined (__ARM_ARCH_7A__) && defined (__ARM_FEATURE_UNALIGNED) + + */ + .syntax unified + /* This implementation requires ARM state. */ + .arm + +#ifdef __ARM_NEON__ + + .fpu neon + .arch armv7-a +# define FRAME_SIZE 4 +# define USE_VFP +# define USE_NEON + +#elif !defined (__SOFTFP__) + + .arch armv6 + .fpu vfpv2 +# define FRAME_SIZE 32 +# define USE_VFP + +#else + .arch armv6 +# define FRAME_SIZE 32 + +#endif + +/* Old versions of GAS incorrectly implement the NEON align semantics. */ +#ifdef BROKEN_ASM_NEON_ALIGN +#define ALIGN(addr, align) addr,:align +#else +#define ALIGN(addr, align) addr:align +#endif + +#define PC_OFFSET 8 /* PC pipeline compensation. */ +#define INSN_SIZE 4 + +/* Call parameters. */ +#define dstin r0 +#define src r1 +#define count r2 + +/* Locals. */ +#define tmp1 r3 +#define dst ip +#define tmp2 r10 + +#ifndef USE_NEON +/* For bulk copies using GP registers. */ +#define A_l r2 /* Call-clobbered. */ +#define A_h r3 /* Call-clobbered. */ +#define B_l r4 +#define B_h r5 +#define C_l r6 +#define C_h r7 +#define D_l r8 +#define D_h r9 +#endif + +/* Number of lines ahead to pre-fetch data. If you change this the code + below will need adjustment to compensate. */ + +#define prefetch_lines 5 + +#ifdef USE_VFP + .macro cpy_line_vfp vreg, base + vstr \vreg, [dst, #\base] + vldr \vreg, [src, #\base] + vstr d0, [dst, #\base + 8] + vldr d0, [src, #\base + 8] + vstr d1, [dst, #\base + 16] + vldr d1, [src, #\base + 16] + vstr d2, [dst, #\base + 24] + vldr d2, [src, #\base + 24] + vstr \vreg, [dst, #\base + 32] + vldr \vreg, [src, #\base + prefetch_lines * 64 - 32] + vstr d0, [dst, #\base + 40] + vldr d0, [src, #\base + 40] + vstr d1, [dst, #\base + 48] + vldr d1, [src, #\base + 48] + vstr d2, [dst, #\base + 56] + vldr d2, [src, #\base + 56] + .endm + + .macro cpy_tail_vfp vreg, base + vstr \vreg, [dst, #\base] + vldr \vreg, [src, #\base] + vstr d0, [dst, #\base + 8] + vldr d0, [src, #\base + 8] + vstr d1, [dst, #\base + 16] + vldr d1, [src, #\base + 16] + vstr d2, [dst, #\base + 24] + vldr d2, [src, #\base + 24] + vstr \vreg, [dst, #\base + 32] + vstr d0, [dst, #\base + 40] + vldr d0, [src, #\base + 40] + vstr d1, [dst, #\base + 48] + vldr d1, [src, #\base + 48] + vstr d2, [dst, #\base + 56] + vldr d2, [src, #\base + 56] + .endm +#endif + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +def_fn memcpy p2align=6 + + mov dst, dstin /* Preserve dstin, we need to return it. */ + cmp count, #64 + bge .Lcpy_not_short + /* Deal with small copies quickly by dropping straight into the + exit block. */ + +.Ltail63unaligned: +#ifdef USE_NEON + and tmp1, count, #0x38 + rsb tmp1, tmp1, #(56 - PC_OFFSET + INSN_SIZE) + add pc, pc, tmp1 + vld1.8 {d0}, [src]! /* 14 words to go. */ + vst1.8 {d0}, [dst]! + vld1.8 {d0}, [src]! /* 12 words to go. */ + vst1.8 {d0}, [dst]! + vld1.8 {d0}, [src]! /* 10 words to go. */ + vst1.8 {d0}, [dst]! + vld1.8 {d0}, [src]! /* 8 words to go. */ + vst1.8 {d0}, [dst]! + vld1.8 {d0}, [src]! /* 6 words to go. */ + vst1.8 {d0}, [dst]! + vld1.8 {d0}, [src]! /* 4 words to go. */ + vst1.8 {d0}, [dst]! + vld1.8 {d0}, [src]! /* 2 words to go. */ + vst1.8 {d0}, [dst]! + + tst count, #4 + ldrne tmp1, [src], #4 + strne tmp1, [dst], #4 +#else + /* Copy up to 15 full words of data. May not be aligned. */ + /* Cannot use VFP for unaligned data. */ + and tmp1, count, #0x3c + add dst, dst, tmp1 + add src, src, tmp1 + rsb tmp1, tmp1, #(60 - PC_OFFSET/2 + INSN_SIZE/2) + /* Jump directly into the sequence below at the correct offset. */ + add pc, pc, tmp1, lsl #1 + + ldr tmp1, [src, #-60] /* 15 words to go. */ + str tmp1, [dst, #-60] + + ldr tmp1, [src, #-56] /* 14 words to go. */ + str tmp1, [dst, #-56] + ldr tmp1, [src, #-52] + str tmp1, [dst, #-52] + + ldr tmp1, [src, #-48] /* 12 words to go. */ + str tmp1, [dst, #-48] + ldr tmp1, [src, #-44] + str tmp1, [dst, #-44] + + ldr tmp1, [src, #-40] /* 10 words to go. */ + str tmp1, [dst, #-40] + ldr tmp1, [src, #-36] + str tmp1, [dst, #-36] + + ldr tmp1, [src, #-32] /* 8 words to go. */ + str tmp1, [dst, #-32] + ldr tmp1, [src, #-28] + str tmp1, [dst, #-28] + + ldr tmp1, [src, #-24] /* 6 words to go. */ + str tmp1, [dst, #-24] + ldr tmp1, [src, #-20] + str tmp1, [dst, #-20] + + ldr tmp1, [src, #-16] /* 4 words to go. */ + str tmp1, [dst, #-16] + ldr tmp1, [src, #-12] + str tmp1, [dst, #-12] + + ldr tmp1, [src, #-8] /* 2 words to go. */ + str tmp1, [dst, #-8] + ldr tmp1, [src, #-4] + str tmp1, [dst, #-4] +#endif + + lsls count, count, #31 + ldrhcs tmp1, [src], #2 + ldrbne src, [src] /* Src is dead, use as a scratch. */ + strhcs tmp1, [dst], #2 + strbne src, [dst] + bx lr + +.Lcpy_not_short: + /* At least 64 bytes to copy, but don't know the alignment yet. */ + str tmp2, [sp, #-FRAME_SIZE]! + and tmp2, src, #7 + and tmp1, dst, #7 + cmp tmp1, tmp2 + bne .Lcpy_notaligned + +#ifdef USE_VFP + /* Magic dust alert! Force VFP on Cortex-A9. Experiments show + that the FP pipeline is much better at streaming loads and + stores. This is outside the critical loop. */ + vmov.f32 s0, s0 +#endif + + /* SRC and DST have the same mutual 32-bit alignment, but we may + still need to pre-copy some bytes to get to natural alignment. + We bring DST into full 64-bit alignment. */ + lsls tmp2, dst, #29 + beq 1f + rsbs tmp2, tmp2, #0 + sub count, count, tmp2, lsr #29 + ldrmi tmp1, [src], #4 + strmi tmp1, [dst], #4 + lsls tmp2, tmp2, #2 + ldrhcs tmp1, [src], #2 + ldrbne tmp2, [src], #1 + strhcs tmp1, [dst], #2 + strbne tmp2, [dst], #1 + +1: + subs tmp2, count, #64 /* Use tmp2 for count. */ + blt .Ltail63aligned + + cmp tmp2, #512 + bge .Lcpy_body_long + +.Lcpy_body_medium: /* Count in tmp2. */ +#ifdef USE_VFP +1: + vldr d0, [src, #0] + subs tmp2, tmp2, #64 + vldr d1, [src, #8] + vstr d0, [dst, #0] + vldr d0, [src, #16] + vstr d1, [dst, #8] + vldr d1, [src, #24] + vstr d0, [dst, #16] + vldr d0, [src, #32] + vstr d1, [dst, #24] + vldr d1, [src, #40] + vstr d0, [dst, #32] + vldr d0, [src, #48] + vstr d1, [dst, #40] + vldr d1, [src, #56] + vstr d0, [dst, #48] + add src, src, #64 + vstr d1, [dst, #56] + add dst, dst, #64 + bge 1b + tst tmp2, #0x3f + beq .Ldone + +.Ltail63aligned: /* Count in tmp2. */ + and tmp1, tmp2, #0x38 + add dst, dst, tmp1 + add src, src, tmp1 + rsb tmp1, tmp1, #(56 - PC_OFFSET + INSN_SIZE) + add pc, pc, tmp1 + + vldr d0, [src, #-56] /* 14 words to go. */ + vstr d0, [dst, #-56] + vldr d0, [src, #-48] /* 12 words to go. */ + vstr d0, [dst, #-48] + vldr d0, [src, #-40] /* 10 words to go. */ + vstr d0, [dst, #-40] + vldr d0, [src, #-32] /* 8 words to go. */ + vstr d0, [dst, #-32] + vldr d0, [src, #-24] /* 6 words to go. */ + vstr d0, [dst, #-24] + vldr d0, [src, #-16] /* 4 words to go. */ + vstr d0, [dst, #-16] + vldr d0, [src, #-8] /* 2 words to go. */ + vstr d0, [dst, #-8] +#else + sub src, src, #8 + sub dst, dst, #8 +1: + ldrd A_l, A_h, [src, #8] + strd A_l, A_h, [dst, #8] + ldrd A_l, A_h, [src, #16] + strd A_l, A_h, [dst, #16] + ldrd A_l, A_h, [src, #24] + strd A_l, A_h, [dst, #24] + ldrd A_l, A_h, [src, #32] + strd A_l, A_h, [dst, #32] + ldrd A_l, A_h, [src, #40] + strd A_l, A_h, [dst, #40] + ldrd A_l, A_h, [src, #48] + strd A_l, A_h, [dst, #48] + ldrd A_l, A_h, [src, #56] + strd A_l, A_h, [dst, #56] + ldrd A_l, A_h, [src, #64]! + strd A_l, A_h, [dst, #64]! + subs tmp2, tmp2, #64 + bge 1b + tst tmp2, #0x3f + bne 1f + ldr tmp2,[sp], #FRAME_SIZE + bx lr +1: + add src, src, #8 + add dst, dst, #8 + +.Ltail63aligned: /* Count in tmp2. */ + /* Copy up to 7 d-words of data. Similar to Ltail63unaligned, but + we know that the src and dest are 32-bit aligned so we can use + LDRD/STRD to improve efficiency. */ + /* TMP2 is now negative, but we don't care about that. The bottom + six bits still tell us how many bytes are left to copy. */ + + and tmp1, tmp2, #0x38 + add dst, dst, tmp1 + add src, src, tmp1 + rsb tmp1, tmp1, #(56 - PC_OFFSET + INSN_SIZE) + add pc, pc, tmp1 + ldrd A_l, A_h, [src, #-56] /* 14 words to go. */ + strd A_l, A_h, [dst, #-56] + ldrd A_l, A_h, [src, #-48] /* 12 words to go. */ + strd A_l, A_h, [dst, #-48] + ldrd A_l, A_h, [src, #-40] /* 10 words to go. */ + strd A_l, A_h, [dst, #-40] + ldrd A_l, A_h, [src, #-32] /* 8 words to go. */ + strd A_l, A_h, [dst, #-32] + ldrd A_l, A_h, [src, #-24] /* 6 words to go. */ + strd A_l, A_h, [dst, #-24] + ldrd A_l, A_h, [src, #-16] /* 4 words to go. */ + strd A_l, A_h, [dst, #-16] + ldrd A_l, A_h, [src, #-8] /* 2 words to go. */ + strd A_l, A_h, [dst, #-8] + +#endif + tst tmp2, #4 + ldrne tmp1, [src], #4 + strne tmp1, [dst], #4 + lsls tmp2, tmp2, #31 /* Count (tmp2) now dead. */ + ldrhcs tmp1, [src], #2 + ldrbne tmp2, [src] + strhcs tmp1, [dst], #2 + strbne tmp2, [dst] + +.Ldone: + ldr tmp2, [sp], #FRAME_SIZE + bx lr + +.Lcpy_body_long: /* Count in tmp2. */ + + /* Long copy. We know that there's at least (prefetch_lines * 64) + bytes to go. */ +#ifdef USE_VFP + /* Don't use PLD. Instead, read some data in advance of the current + copy position into a register. This should act like a PLD + operation but we won't have to repeat the transfer. */ + + vldr d3, [src, #0] + vldr d4, [src, #64] + vldr d5, [src, #128] + vldr d6, [src, #192] + vldr d7, [src, #256] + + vldr d0, [src, #8] + vldr d1, [src, #16] + vldr d2, [src, #24] + add src, src, #32 + + subs tmp2, tmp2, #prefetch_lines * 64 * 2 + blt 2f +1: + cpy_line_vfp d3, 0 + cpy_line_vfp d4, 64 + cpy_line_vfp d5, 128 + add dst, dst, #3 * 64 + add src, src, #3 * 64 + cpy_line_vfp d6, 0 + cpy_line_vfp d7, 64 + add dst, dst, #2 * 64 + add src, src, #2 * 64 + subs tmp2, tmp2, #prefetch_lines * 64 + bge 1b + +2: + cpy_tail_vfp d3, 0 + cpy_tail_vfp d4, 64 + cpy_tail_vfp d5, 128 + add src, src, #3 * 64 + add dst, dst, #3 * 64 + cpy_tail_vfp d6, 0 + vstr d7, [dst, #64] + vldr d7, [src, #64] + vstr d0, [dst, #64 + 8] + vldr d0, [src, #64 + 8] + vstr d1, [dst, #64 + 16] + vldr d1, [src, #64 + 16] + vstr d2, [dst, #64 + 24] + vldr d2, [src, #64 + 24] + vstr d7, [dst, #64 + 32] + add src, src, #96 + vstr d0, [dst, #64 + 40] + vstr d1, [dst, #64 + 48] + vstr d2, [dst, #64 + 56] + add dst, dst, #128 + add tmp2, tmp2, #prefetch_lines * 64 + b .Lcpy_body_medium +#else + /* Long copy. Use an SMS style loop to maximize the I/O + bandwidth of the core. We don't have enough spare registers + to synthesise prefetching, so use PLD operations. */ + /* Pre-bias src and dst. */ + sub src, src, #8 + sub dst, dst, #8 + pld [src, #8] + pld [src, #72] + subs tmp2, tmp2, #64 + pld [src, #136] + ldrd A_l, A_h, [src, #8] + strd B_l, B_h, [sp, #8] + ldrd B_l, B_h, [src, #16] + strd C_l, C_h, [sp, #16] + ldrd C_l, C_h, [src, #24] + strd D_l, D_h, [sp, #24] + pld [src, #200] + ldrd D_l, D_h, [src, #32]! + b 1f + .p2align 6 +2: + pld [src, #232] + strd A_l, A_h, [dst, #40] + ldrd A_l, A_h, [src, #40] + strd B_l, B_h, [dst, #48] + ldrd B_l, B_h, [src, #48] + strd C_l, C_h, [dst, #56] + ldrd C_l, C_h, [src, #56] + strd D_l, D_h, [dst, #64]! + ldrd D_l, D_h, [src, #64]! + subs tmp2, tmp2, #64 +1: + strd A_l, A_h, [dst, #8] + ldrd A_l, A_h, [src, #8] + strd B_l, B_h, [dst, #16] + ldrd B_l, B_h, [src, #16] + strd C_l, C_h, [dst, #24] + ldrd C_l, C_h, [src, #24] + strd D_l, D_h, [dst, #32] + ldrd D_l, D_h, [src, #32] + bcs 2b + /* Save the remaining bytes and restore the callee-saved regs. */ + strd A_l, A_h, [dst, #40] + add src, src, #40 + strd B_l, B_h, [dst, #48] + ldrd B_l, B_h, [sp, #8] + strd C_l, C_h, [dst, #56] + ldrd C_l, C_h, [sp, #16] + strd D_l, D_h, [dst, #64] + ldrd D_l, D_h, [sp, #24] + add dst, dst, #72 + tst tmp2, #0x3f + bne .Ltail63aligned + ldr tmp2, [sp], #FRAME_SIZE + bx lr +#endif + +.Lcpy_notaligned: + pld [src] + pld [src, #64] + /* There's at least 64 bytes to copy, but there is no mutual + alignment. */ + /* Bring DST to 64-bit alignment. */ + lsls tmp2, dst, #29 + pld [src, #(2 * 64)] + beq 1f + rsbs tmp2, tmp2, #0 + sub count, count, tmp2, lsr #29 + ldrmi tmp1, [src], #4 + strmi tmp1, [dst], #4 + lsls tmp2, tmp2, #2 + ldrbne tmp1, [src], #1 + ldrhcs tmp2, [src], #2 + strbne tmp1, [dst], #1 + strhcs tmp2, [dst], #2 +1: + pld [src, #(3 * 64)] + subs count, count, #64 + ldrmi tmp2, [sp], #FRAME_SIZE + bmi .Ltail63unaligned + pld [src, #(4 * 64)] + +#ifdef USE_NEON + vld1.8 {d0-d3}, [src]! + vld1.8 {d4-d7}, [src]! + subs count, count, #64 + bmi 2f +1: + pld [src, #(4 * 64)] + vst1.8 {d0-d3}, [ALIGN (dst, 64)]! + vld1.8 {d0-d3}, [src]! + vst1.8 {d4-d7}, [ALIGN (dst, 64)]! + vld1.8 {d4-d7}, [src]! + subs count, count, #64 + bpl 1b +2: + vst1.8 {d0-d3}, [ALIGN (dst, 64)]! + vst1.8 {d4-d7}, [ALIGN (dst, 64)]! + ands count, count, #0x3f +#else + /* Use an SMS style loop to maximize the I/O bandwidth. */ + sub src, src, #4 + sub dst, dst, #8 + subs tmp2, count, #64 /* Use tmp2 for count. */ + ldr A_l, [src, #4] + ldr A_h, [src, #8] + strd B_l, B_h, [sp, #8] + ldr B_l, [src, #12] + ldr B_h, [src, #16] + strd C_l, C_h, [sp, #16] + ldr C_l, [src, #20] + ldr C_h, [src, #24] + strd D_l, D_h, [sp, #24] + ldr D_l, [src, #28] + ldr D_h, [src, #32]! + b 1f + .p2align 6 +2: + pld [src, #(5 * 64) - (32 - 4)] + strd A_l, A_h, [dst, #40] + ldr A_l, [src, #36] + ldr A_h, [src, #40] + strd B_l, B_h, [dst, #48] + ldr B_l, [src, #44] + ldr B_h, [src, #48] + strd C_l, C_h, [dst, #56] + ldr C_l, [src, #52] + ldr C_h, [src, #56] + strd D_l, D_h, [dst, #64]! + ldr D_l, [src, #60] + ldr D_h, [src, #64]! + subs tmp2, tmp2, #64 +1: + strd A_l, A_h, [dst, #8] + ldr A_l, [src, #4] + ldr A_h, [src, #8] + strd B_l, B_h, [dst, #16] + ldr B_l, [src, #12] + ldr B_h, [src, #16] + strd C_l, C_h, [dst, #24] + ldr C_l, [src, #20] + ldr C_h, [src, #24] + strd D_l, D_h, [dst, #32] + ldr D_l, [src, #28] + ldr D_h, [src, #32] + bcs 2b + + /* Save the remaining bytes and restore the callee-saved regs. */ + strd A_l, A_h, [dst, #40] + add src, src, #36 + strd B_l, B_h, [dst, #48] + ldrd B_l, B_h, [sp, #8] + strd C_l, C_h, [dst, #56] + ldrd C_l, C_h, [sp, #16] + strd D_l, D_h, [dst, #64] + ldrd D_l, D_h, [sp, #24] + add dst, dst, #72 + ands count, tmp2, #0x3f +#endif + ldr tmp2, [sp], #FRAME_SIZE + bne .Ltail63unaligned + bx lr + + .size memcpy, . - memcpy diff --git a/lib/machine/arm/memcpy-armv7m.S b/lib/machine/arm/memcpy-armv7m.S new file mode 100644 index 0000000..ec1ad64 --- /dev/null +++ b/lib/machine/arm/memcpy-armv7m.S @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2013 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* This memcpy routine is optimised for Cortex-M3/M4 cores with/without + unaligned access. + + If compiled with GCC, this file should be enclosed within following + pre-processing check: + if defined (__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) + + Prototype: void *memcpy (void *dst, const void *src, size_t count); + + The job will be done in 5 steps. + Step 1: Align src/dest pointers, copy mis-aligned if fail to align both + Step 2: Repeatedly copy big block size of __OPT_BIG_BLOCK_SIZE + Step 3: Repeatedly copy big block size of __OPT_MID_BLOCK_SIZE + Step 4: Copy word by word + Step 5: Copy byte-to-byte + + Tunable options: + __OPT_BIG_BLOCK_SIZE: Size of big block in words. Default to 64. + __OPT_MID_BLOCK_SIZE: Size of big block in words. Default to 16. + */ +#include "arm_asm.h" + +#ifndef __OPT_BIG_BLOCK_SIZE +#define __OPT_BIG_BLOCK_SIZE (4 * 16) +#endif + +#ifndef __OPT_MID_BLOCK_SIZE +#define __OPT_MID_BLOCK_SIZE (4 * 4) +#endif + +#if __OPT_BIG_BLOCK_SIZE == 16 +#define BEGIN_UNROLL_BIG_BLOCK \ + .irp offset, 0,4,8,12 +#elif __OPT_BIG_BLOCK_SIZE == 32 +#define BEGIN_UNROLL_BIG_BLOCK \ + .irp offset, 0,4,8,12,16,20,24,28 +#elif __OPT_BIG_BLOCK_SIZE == 64 +#define BEGIN_UNROLL_BIG_BLOCK \ + .irp offset, 0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60 +#else +#error "Illegal __OPT_BIG_BLOCK_SIZE" +#endif + +#if __OPT_MID_BLOCK_SIZE == 8 +#define BEGIN_UNROLL_MID_BLOCK \ + .irp offset, 0,4 +#elif __OPT_MID_BLOCK_SIZE == 16 +#define BEGIN_UNROLL_MID_BLOCK \ + .irp offset, 0,4,8,12 +#else +#error "Illegal __OPT_MID_BLOCK_SIZE" +#endif + +#define END_UNROLL .endr + + .syntax unified + .text + .align 2 + .global memcpy + .thumb + .thumb_func + .fnstart + .cfi_startproc + .type memcpy, %function +memcpy: + @ r0: dst + @ r1: src + @ r2: len +#ifdef __ARM_FEATURE_UNALIGNED + /* In case of UNALIGNED access supported, ip is not used in + function body. */ + prologue push_ip=HAVE_PAC_LEAF + mov ip, r0 +#else + prologue 0 push_ip=HAVE_PAC_LEAF +#endif /* __ARM_FEATURE_UNALIGNED */ + orr r3, r1, r0 + ands r3, r3, #3 + bne .Lmisaligned_copy + +.Lbig_block: + subs r2, __OPT_BIG_BLOCK_SIZE + blo .Lmid_block + + /* Kernel loop for big block copy */ + .align 2 +.Lbig_block_loop: + BEGIN_UNROLL_BIG_BLOCK +#ifdef __ARM_ARCH_7EM__ + ldr r3, [r1], #4 + str r3, [r0], #4 + END_UNROLL +#else /* __ARM_ARCH_7M__ */ + ldr r3, [r1, \offset] + str r3, [r0, \offset] + END_UNROLL + adds r0, __OPT_BIG_BLOCK_SIZE + adds r1, __OPT_BIG_BLOCK_SIZE +#endif + subs r2, __OPT_BIG_BLOCK_SIZE + bhs .Lbig_block_loop + +.Lmid_block: + adds r2, __OPT_BIG_BLOCK_SIZE - __OPT_MID_BLOCK_SIZE + blo .Lcopy_word_by_word + + /* Kernel loop for mid-block copy */ + .align 2 +.Lmid_block_loop: + BEGIN_UNROLL_MID_BLOCK +#ifdef __ARM_ARCH_7EM__ + ldr r3, [r1], #4 + str r3, [r0], #4 + END_UNROLL +#else /* __ARM_ARCH_7M__ */ + ldr r3, [r1, \offset] + str r3, [r0, \offset] + END_UNROLL + adds r0, __OPT_MID_BLOCK_SIZE + adds r1, __OPT_MID_BLOCK_SIZE +#endif + subs r2, __OPT_MID_BLOCK_SIZE + bhs .Lmid_block_loop + +.Lcopy_word_by_word: + adds r2, __OPT_MID_BLOCK_SIZE - 4 + blo .Lcopy_less_than_4 + + /* Kernel loop for small block copy */ + .align 2 +.Lcopy_word_by_word_loop: + ldr r3, [r1], #4 + str r3, [r0], #4 + subs r2, #4 + bhs .Lcopy_word_by_word_loop + +.Lcopy_less_than_4: + adds r2, #4 + beq .Ldone + + lsls r2, r2, #31 + itt ne + ldrbne r3, [r1], #1 + strbne r3, [r0], #1 + + bcc .Ldone +#ifdef __ARM_FEATURE_UNALIGNED + ldrh r3, [r1] + strh r3, [r0] +#else + ldrb r3, [r1] + strb r3, [r0] + ldrb r3, [r1, #1] + strb r3, [r0, #1] +#endif /* __ARM_FEATURE_UNALIGNED */ + +.Ldone: + .cfi_remember_state +#ifdef __ARM_FEATURE_UNALIGNED + mov r0, ip + epilogue push_ip=HAVE_PAC_LEAF +#else + epilogue 0 push_ip=HAVE_PAC_LEAF +#endif /* __ARM_FEATURE_UNALIGNED */ + + .align 2 +.Lmisaligned_copy: + .cfi_restore_state +#ifdef __ARM_FEATURE_UNALIGNED + /* Define label DST_ALIGNED to BIG_BLOCK. It will go to aligned copy + once destination is adjusted to aligned. */ +#define Ldst_aligned Lbig_block + + /* Copy word by word using LDR when alignment can be done in hardware, + i.e., SCTLR.A is set, supporting unaligned access in LDR and STR. */ + + cmp r2, #8 + blo .Lbyte_copy + + /* if src is aligned, just go to the big block loop. */ + lsls r3, r1, #30 + beq .Ldst_aligned +#else + /* if len < 12, misalignment adjustment has more overhead than + just byte-to-byte copy. Also, len must >=8 to guarantee code + afterward work correctly. */ + cmp r2, #12 + blo .Lbyte_copy +#endif /* __ARM_FEATURE_UNALIGNED */ + + /* Align dst only, not trying to align src. That is the because + handling of aligned src and misaligned dst need more overhead than + otherwise. By doing this the worst case is when initial src is aligned, + additional up to 4 byte additional copy will executed, which is + acceptable. */ + + ands r3, r0, #3 + beq .Ldst_aligned + + rsb r3, #4 + subs r2, r3 + + lsls r3, r3, #31 + itt ne + ldrbne r3, [r1], #1 + strbne r3, [r0], #1 + + bcc .Ldst_aligned + +#ifdef __ARM_FEATURE_UNALIGNED + ldrh r3, [r1], #2 + strh r3, [r0], #2 + b .Ldst_aligned +#else + ldrb r3, [r1], #1 + strb r3, [r0], #1 + ldrb r3, [r1], #1 + strb r3, [r0], #1 + /* Now that dst is aligned */ +.Ldst_aligned: + /* if r1 is aligned now, it means r0/r1 has the same misalignment, + and they are both aligned now. Go aligned copy. */ + ands r3, r1, #3 + beq .Lbig_block + + /* dst is aligned, but src isn't. Misaligned copy. */ + + push {r4, r5} + .cfi_adjust_cfa_offset 8 + .cfi_rel_offset 4, 0 + .cfi_rel_offset 5, 4 + subs r2, #4 + + /* Backward r1 by misaligned bytes, to make r1 aligned. + Since we need to restore r1 to unaligned address after the loop, + we need keep the offset bytes to ip and sub it from r1 afterward. */ + subs r1, r3 + rsb ip, r3, #4 + + /* Pre-load on word */ + ldr r4, [r1], #4 + + cmp r3, #2 + beq .Lmisaligned_copy_2_2 + cmp r3, #3 + beq .Lmisaligned_copy_3_1 + + .macro mis_src_copy shift +1: +#ifdef __ARM_BIG_ENDIAN + lsls r4, r4, \shift +#else + lsrs r4, r4, \shift +#endif + ldr r3, [r1], #4 +#ifdef __ARM_BIG_ENDIAN + lsrs r5, r3, 32-\shift +#else + lsls r5, r3, 32-\shift +#endif + orr r4, r4, r5 + str r4, [r0], #4 + mov r4, r3 + subs r2, #4 + bhs 1b + .endm + +.Lmisaligned_copy_1_3: + mis_src_copy shift=8 + b .Lsrc_misaligned_tail + +.Lmisaligned_copy_3_1: + mis_src_copy shift=24 + b .Lsrc_misaligned_tail + +.Lmisaligned_copy_2_2: + /* For 2_2 misalignment, ldr is still faster than 2 x ldrh. */ + mis_src_copy shift=16 + +.Lsrc_misaligned_tail: + adds r2, #4 + subs r1, ip + pop {r4, r5} + .cfi_restore 4 + .cfi_restore 5 + .cfi_adjust_cfa_offset -8 + +#endif /* __ARM_FEATURE_UNALIGNED */ + +.Lbyte_copy: + subs r2, #4 + blo .Lcopy_less_than_4 + +.Lbyte_copy_loop: + subs r2, #1 + ldrb r3, [r1], #1 + strb r3, [r0], #1 + bhs .Lbyte_copy_loop + + ldrb r3, [r1] + strb r3, [r0] + ldrb r3, [r1, #1] + strb r3, [r0, #1] + ldrb r3, [r1, #2] + strb r3, [r0, #2] + +#ifdef __ARM_FEATURE_UNALIGNED + mov r0, ip + epilogue push_ip=HAVE_PAC_LEAF +#else + epilogue 0 push_ip=HAVE_PAC_LEAF +#endif /* __ARM_FEATURE_UNALIGNED */ + .cfi_endproc + .cantunwind + .fnend + .size memcpy, .-memcpy diff --git a/lib/machine/arm/memcpy-stub.c b/lib/machine/arm/memcpy-stub.c new file mode 100644 index 0000000..6f41a85 --- /dev/null +++ b/lib/machine/arm/memcpy-stub.c @@ -0,0 +1,41 @@ +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* The structure of the following #if #else #endif conditional chain + must match the chain in memcpy.S. */ + +#include "arm-acle-compat.h" + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +# include "../../string/memcpy.c" +#elif (__ARM_ARCH >= 7 && __ARM_ARCH_PROFILE == 'A' \ + && defined (__ARM_FEATURE_UNALIGNED)) +/* Defined in memcpy.S. */ +#elif __ARM_ARCH_ISA_THUMB == 2 && !__ARM_ARCH_ISA_ARM +/* Defined in memcpy.S. */ +#else +# include "../../string/memcpy.c" +#endif diff --git a/lib/machine/arm/memcpy.S b/lib/machine/arm/memcpy.S new file mode 100644 index 0000000..8416232 --- /dev/null +++ b/lib/machine/arm/memcpy.S @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2013-2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* The structure of the following #if #else #endif conditional chain + must match the chain in memcpy-stub.c. */ + +#include "arm-acle-compat.h" + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) + /* Defined in memcpy-stub.c. */ + +#elif (__ARM_ARCH >= 7 && __ARM_ARCH_PROFILE == 'A' \ + && defined (__ARM_FEATURE_UNALIGNED)) +#include "memcpy-armv7a.S" + +#elif __ARM_ARCH_ISA_THUMB == 2 && !__ARM_ARCH_ISA_ARM +#include "memcpy-armv7m.S" + +#else + /* Defined in memcpy-stub.c. */ + +#endif diff --git a/lib/machine/arm/setjmp.S b/lib/machine/arm/setjmp.S new file mode 100644 index 0000000..5e59522 --- /dev/null +++ b/lib/machine/arm/setjmp.S @@ -0,0 +1,281 @@ +/* This is a simple version of setjmp and longjmp. + + Nick Clifton, Cygnus Solutions, 13 June 1997. */ + +#include "arm-acle-compat.h" + +/* ANSI concatenation macros. */ +#define CONCAT(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a##b + +#ifndef __USER_LABEL_PREFIX__ +#error __USER_LABEL_PREFIX__ not defined +#endif + +#define SYM(x) CONCAT (__USER_LABEL_PREFIX__, x) + +#ifdef __ELF__ +#define TYPE(x) .type SYM(x),function +#define SIZE(x) .size SYM(x), . - SYM(x) +#else +#define TYPE(x) +#define SIZE(x) +#endif + +/* Jump buffer allocation sizes. */ +#define JUMPBUF_CORE_REGS_SIZE (10 * 4) +#define JUMPBUF_FP_REGS_SIZE (8 * 8) +#define JUMPBUF_PAC (JUMPBUF_CORE_REGS_SIZE + JUMPBUF_FP_REGS_SIZE + 0) + +/* Arm/Thumb interworking support: + + The interworking scheme expects functions to use a BX instruction + to return control to their parent. Since we need this code to work + in both interworked and non-interworked environments as well as with + older processors which do not have the BX instruction we do the + following: + Test the return address. + If the bottom bit is clear perform an "old style" function exit. + (We know that we are in ARM mode and returning to an ARM mode caller). + Otherwise use the BX instruction to perform the function exit. + + We know that we will never attempt to perform the BX instruction on + an older processor, because that kind of processor will never be + interworked, and a return address with the bottom bit set will never + be generated. + + In addition, we do not actually assemble the BX instruction as this would + require us to tell the assembler that the processor is an ARM7TDMI and + it would store this information in the binary. We want this binary to be + able to be linked with binaries compiled for older processors however, so + we do not want such information stored there. + + If we are running using the APCS-26 convention however, then we never + test the bottom bit, because this is part of the processor status. + Instead we just do a normal return, since we know that we cannot be + returning to a Thumb caller - the Thumb does not support APCS-26. + + Function entry is much simpler. If we are compiling for the Thumb we + just switch into ARM mode and then drop through into the rest of the + function. The function exit code will take care of the restore to + Thumb mode. + + For Thumb-2 do everything in Thumb mode. */ + + .syntax unified + +/* GCC 12.1 and later will tell the assembler exactly which floating + point (or MVE) unit is required and we don't want to override + that. Conversely, older versions of the compiler don't pass this + information so we need to enable the VFP version that is most + appropriate. The choice here should support all suitable VFP + versions that the older toolchains can handle. */ +#if __GNUC__ && __GNUC__ < 12 +/* Ensure that FPU instructions are correctly compiled and, likewise, + the appropriate build attributes are added to the resulting object + file. Check whether the MVE extension is present and whether + we have support for hardware floating point-operations. VFPxd + covers all the cases we need in this file for hardware + floating-point and should be compatible with all required FPUs + that we need to support. */ +# if __ARM_FP + .fpu vfpxd +# endif +# if __ARM_FEATURE_MVE + .arch_extension mve +# endif +#endif + +#if __ARM_ARCH_ISA_THUMB == 1 && !__ARM_ARCH_ISA_ARM +/* ARMv6-M-like has to be implemented in Thumb mode. */ + +.thumb +.thumb_func + .globl SYM (setjmp) + TYPE (setjmp) +SYM (setjmp): + /* Save registers in jump buffer. */ + stmia r0!, {r4, r5, r6, r7} + mov r1, r8 + mov r2, r9 + mov r3, r10 + mov r4, fp + mov r5, sp + mov r6, lr + stmia r0!, {r1, r2, r3, r4, r5, r6} + subs r0, r0, #40 + /* Restore callee-saved low regs. */ + ldmia r0!, {r4, r5, r6, r7} + /* Return zero. */ + movs r0, #0 + bx lr + +.thumb_func + .globl SYM (longjmp) + TYPE (longjmp) +SYM (longjmp): + /* Restore High regs. */ + adds r0, r0, #16 + ldmia r0!, {r2, r3, r4, r5, r6} + mov r8, r2 + mov r9, r3 + mov r10, r4 + mov fp, r5 + mov sp, r6 + ldmia r0!, {r3} /* lr */ + /* Restore low regs. */ + subs r0, r0, #40 + ldmia r0!, {r4, r5, r6, r7} + /* Return the result argument, or 1 if it is zero. */ + movs r0, r1 + bne 1f + movs r0, #1 +1: + bx r3 + +#else + +#ifdef __APCS_26__ +#define RET movs pc, lr +#elif defined(__thumb2__) +#define RET bx lr +#else +#define RET tst lr, #1; \ + moveq pc, lr ; \ +.inst 0xe12fff1e /* bx lr */ +#endif + +#ifdef __thumb2__ +.macro COND where when + i\where \when +.endm +#else +.macro COND where when +.endm +#endif + +#if defined(__thumb2__) +.macro MODE + .thumb + .thumb_func +.endm +.macro PROLOGUE name +.endm + +#elif defined(__thumb__) +#define MODE .thumb_func +.macro PROLOGUE name + .code 16 + bx pc + nop + .code 32 +SYM (.arm_start_of.\name): +.endm +#else /* Arm */ +#define MODE .code 32 +.macro PROLOGUE name +.endm +#endif + +.macro FUNC_START name + .text + .align 2 + MODE + .globl SYM (\name) + .fnstart + .cfi_startproc + TYPE (\name) +SYM (\name): + PROLOGUE \name +.endm + +.macro FUNC_END name + RET + .cfi_endproc + .fnend + SIZE (\name) +.endm + +/* -------------------------------------------------------------------- + int setjmp (jmp_buf); + -------------------------------------------------------------------- */ + + FUNC_START setjmp + +#if __ARM_FEATURE_PAC_DEFAULT +# if __ARM_FEATURE_BTI_DEFAULT + pacbti ip, lr, sp +# else + pac ip, lr, sp +# endif /* __ARM_FEATURE_BTI_DEFAULT */ + mov r3, ip + str r3, [r0, #JUMPBUF_PAC] + .cfi_register 143, 12 +#else +# if __ARM_FEATURE_BTI_DEFAULT + bti +# endif /* __ARM_FEATURE_BTI_DEFAULT */ +#endif /* __ARM_FEATURE_PAC_DEFAULT */ + + /* Save all the callee-preserved registers into the jump buffer. */ +#ifdef __thumb2__ + mov ip, sp + stmia r0!, { r4-r10, fp, ip, lr } +#else + stmia r0!, { r4-r10, fp, sp, lr } +#endif +#if defined __ARM_FP || defined __ARM_FEATURE_MVE + vstm r0, { d8-d15 } +#endif + + /* When setting up the jump buffer return 0. */ + mov r0, #0 +#if __ARM_FEATURE_PAC_DEFAULT + mov ip, r3 + aut ip, lr, sp +#endif /* __ARM_FEATURE_PAC_DEFAULT */ + + FUNC_END setjmp + +/* -------------------------------------------------------------------- + volatile void longjmp (jmp_buf, int); + -------------------------------------------------------------------- */ + + FUNC_START longjmp + +#if __ARM_FEATURE_BTI_DEFAULT + bti +#endif /* __ARM_FEATURE_BTI_DEFAULT */ + +#if __ARM_FEATURE_PAC_DEFAULT + /* Keep original jmpbuf address for retrieving pac-code + for authentication. */ + mov r2, r0 +#endif /* __ARM_FEATURE_PAC_DEFAULT */ + + /* If we have stack extension code it ought to be handled here. */ + + /* Restore the registers, retrieving the state when setjmp() was called. */ +#ifdef __thumb2__ + ldmia r0!, { r4-r10, fp, ip, lr } + mov sp, ip +#else + ldmia r0!, { r4-r10, fp, sp, lr } +#endif +#if defined __ARM_FP || defined __ARM_FEATURE_MVE + vldm r0, { d8-d15 } +#endif + + /* Put the return value into the integer result register. + But if it is zero then return 1 instead. */ + movs r0, r1 + it eq + moveq r0, #1 + +#if __ARM_FEATURE_PAC_DEFAULT + ldr ip, [r2, #JUMPBUF_PAC] + aut ip, lr, sp +#endif /* __ARM_FEATURE_PAC_DEFAULT */ + + FUNC_END longjmp +#endif diff --git a/lib/machine/arm/strcmp-arm-tiny.S b/lib/machine/arm/strcmp-arm-tiny.S new file mode 100644 index 0000000..0bd2a2e --- /dev/null +++ b/lib/machine/arm/strcmp-arm-tiny.S @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Tiny version of strcmp in ARM state. Used only when optimizing + for size. Also supports Thumb-2. */ + +#include "arm_asm.h" + + .syntax unified +def_fn strcmp + .fnstart + .cfi_sections .debug_frame + .cfi_startproc + prologue +1: + ldrb r2, [r0], #1 + ldrb r3, [r1], #1 + cmp r2, #1 + it cs + cmpcs r2, r3 + beq 1b +2: + subs r0, r2, r3 + epilogue + .cfi_endproc + .cantunwind + .fnend + .size strcmp, . - strcmp diff --git a/lib/machine/arm/strcmp-armv4.S b/lib/machine/arm/strcmp-armv4.S new file mode 100644 index 0000000..e8d0e24 --- /dev/null +++ b/lib/machine/arm/strcmp-armv4.S @@ -0,0 +1,394 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /* Basic ARM implementation. This should run on anything except + for ARMv6-M, but there are better implementations for later + revisions of the architecture. This version can support ARMv4T + ARM/Thumb interworking. */ +/* Parameters and result. */ +#define src1 r0 +#define src2 r1 +#define result r0 /* Overlaps src1. */ + +/* Internal variables. */ +#define data1 r2 +#define data2 r3 +#define magic1 r4 +#define tmp2 r5 +#define tmp1 r12 +#define syndrome r12 /* Overlaps tmp1 */ + +/* For armv4t and newer, toolchains will transparently convert + 'bx lr' to 'mov pc, lr' if needed. GCC has deprecated support + for anything older than armv4t, but this should handle that + corner case in case anyone needs it anyway */ +.macro RETURN +#if __ARM_ARCH <= 4 && __ARM_ARCH_ISA_THUMB == 0 + mov pc, lr +#else + bx lr +#endif +.endm + + .arm +def_fn strcmp + .cfi_sections .debug_frame + .cfi_startproc + eor tmp1, src1, src2 + tst tmp1, #3 + /* Strings not at same byte offset from a word boundary. */ + bne .Lstrcmp_unaligned + ands tmp1, src1, #3 + bic src1, src1, #3 + bic src2, src2, #3 + ldr data1, [src1], #4 + ldreq data2, [src2], #4 + beq 1f + /* Although s1 and s2 have identical initial alignment, they are + not currently word aligned. Rather than comparing bytes, + make sure that any bytes fetched from before the addressed + bytes are forced to 0xff. Then they will always compare + equal. */ + eor tmp1, tmp1, #3 + mvn data2, #MSB + lsl tmp1, tmp1, #3 + S2LO tmp1, data2, tmp1 + ldr data2, [src2], #4 + orr data1, data1, tmp1 + orr data2, data2, tmp1 +1: + /* Load the 'magic' constant 0x01010101. */ + str r4, [sp, #-4]! + .cfi_def_cfa_offset 4 + .cfi_offset 4, -4 + mov magic1, #1 + orr magic1, magic1, magic1, lsl #8 + orr magic1, magic1, magic1, lsl #16 + .p2align 2 +4: + sub syndrome, data1, magic1 + cmp data1, data2 + /* check for any zero bytes in first word */ + biceq syndrome, syndrome, data1 + tsteq syndrome, magic1, lsl #7 + ldreq data1, [src1], #4 + ldreq data2, [src2], #4 + beq 4b +2: + /* There's a zero or a different byte in the word */ + S2HI result, data1, #24 + S2LO data1, data1, #8 + cmp result, #1 + cmpcs result, data2, S2HI #24 + S2LOEQ data2, data2, #8 + beq 2b + /* On a big-endian machine, RESULT contains the desired byte in bits + 0-7; on a little-endian machine they are in bits 24-31. In + both cases the other bits in RESULT are all zero. For DATA2 the + interesting byte is at the other end of the word, but the + other bits are not necessarily zero. We need a signed result + representing the differnece in the unsigned bytes, so for the + little-endian case we can't just shift the interesting bits + up. */ +#ifdef __ARM_BIG_ENDIAN + sub result, result, data2, lsr #24 +#else + and data2, data2, #255 + rsb result, data2, result, lsr #24 +#endif + ldr r4, [sp], #4 + .cfi_restore 4 + .cfi_def_cfa_offset 0 + RETURN + + +#if 0 + /* The assembly code below is based on the following alogrithm. */ +#ifdef __ARM_BIG_ENDIAN +#define RSHIFT << +#define LSHIFT >> +#else +#define RSHIFT >> +#define LSHIFT << +#endif + +#define body(shift) \ + mask = 0xffffffffU RSHIFT shift; \ + data1 = *src1++; \ + data2 = *src2++; \ + do \ + { \ + tmp2 = data1 & mask; \ + if (__builtin_expect(tmp2 != data2 RSHIFT shift, 0)) \ + { \ + data2 RSHIFT= shift; \ + break; \ + } \ + if (__builtin_expect(((data1 - b1) & ~data1) & (b1 << 7), 0)) \ + { \ + /* See comment in assembler below re syndrome on big-endian */\ + if ((((data1 - b1) & ~data1) & (b1 << 7)) & mask) \ + data2 RSHIFT= shift; \ + else \ + { \ + data2 = *src2; \ + tmp2 = data1 RSHIFT (32 - shift); \ + data2 = (data2 LSHIFT (32 - shift)) RSHIFT (32 - shift); \ + } \ + break; \ + } \ + data2 = *src2++; \ + tmp2 ^= data1; \ + if (__builtin_expect(tmp2 != data2 LSHIFT (32 - shift), 0)) \ + { \ + tmp2 = data1 >> (32 - shift); \ + data2 = (data2 << (32 - shift)) RSHIFT (32 - shift); \ + break; \ + } \ + data1 = *src1++; \ + } while (1) + + const unsigned* src1; + const unsigned* src2; + unsigned data1, data2; + unsigned mask; + unsigned shift; + unsigned b1 = 0x01010101; + char c1, c2; + unsigned tmp2; + + while (((unsigned) s1) & 3) + { + c1 = *s1++; + c2 = *s2++; + if (c1 == 0 || c1 != c2) + return c1 - (int)c2; + } + src1 = (unsigned*) (((unsigned)s1) & ~3); + src2 = (unsigned*) (((unsigned)s2) & ~3); + tmp2 = ((unsigned) s2) & 3; + if (tmp2 == 1) + { + body(8); + } + else if (tmp2 == 2) + { + body(16); + } + else + { + body (24); + } + + do + { +#ifdef __ARM_BIG_ENDIAN + c1 = (char) tmp2 >> 24; + c2 = (char) data2 >> 24; +#else /* not __ARM_BIG_ENDIAN */ + c1 = (char) tmp2; + c2 = (char) data2; +#endif /* not __ARM_BIG_ENDIAN */ + tmp2 RSHIFT= 8; + data2 RSHIFT= 8; + } while (c1 != 0 && c1 == c2); + return c1 - c2; +#endif /* 0 */ + + + /* First of all, compare bytes until src1(sp1) is word-aligned. */ +.Lstrcmp_unaligned: + tst src1, #3 + beq 2f + ldrb data1, [src1], #1 + ldrb data2, [src2], #1 + cmp data1, #1 + cmpcs data1, data2 + beq .Lstrcmp_unaligned + sub result, data1, data2 + RETURN + +2: + stmfd sp!, {r4, r5} + .cfi_def_cfa_offset 8 + .cfi_offset 4, -8 + .cfi_offset 5, -4 + mov magic1, #1 + orr magic1, magic1, magic1, lsl #8 + orr magic1, magic1, magic1, lsl #16 + + ldr data1, [src1], #4 + and tmp2, src2, #3 + bic src2, src2, #3 + ldr data2, [src2], #4 + cmp tmp2, #2 + beq .Loverlap2 + bhi .Loverlap1 + + /* Critical inner Loop: Block with 3 bytes initial overlap */ + .p2align 2 +.Loverlap3: + bic tmp2, data1, #MSB + cmp tmp2, data2, S2LO #8 + sub syndrome, data1, magic1 + bic syndrome, syndrome, data1 + bne 4f + ands syndrome, syndrome, magic1, lsl #7 + ldreq data2, [src2], #4 + bne 5f + eor tmp2, tmp2, data1 + cmp tmp2, data2, S2HI #24 + bne 6f + ldr data1, [src1], #4 + b .Loverlap3 +4: + S2LO data2, data2, #8 + b .Lstrcmp_tail + +5: +#ifdef __ARM_BIG_ENDIAN + /* The syndrome value may contain false ones if the string ends + with the bytes 0x01 0x00. */ + tst data1, #0xff000000 + tstne data1, #0x00ff0000 + tstne data1, #0x0000ff00 + beq .Lstrcmp_done_equal +#else + bics syndrome, syndrome, #0xff000000 + bne .Lstrcmp_done_equal +#endif + ldrb data2, [src2] + S2LO tmp2, data1, #24 +#ifdef __ARM_BIG_ENDIAN + lsl data2, data2, #24 +#endif + b .Lstrcmp_tail + +6: + S2LO tmp2, data1, #24 + and data2, data2, #LSB + b .Lstrcmp_tail + + /* Critical inner Loop: Block with 2 bytes initial overlap. */ + .p2align 2 +.Loverlap2: + S2HI tmp2, data1, #16 + sub syndrome, data1, magic1 + S2LO tmp2, tmp2, #16 + bic syndrome, syndrome, data1 + cmp tmp2, data2, S2LO #16 + bne 4f + ands syndrome, syndrome, magic1, lsl #7 + ldreq data2, [src2], #4 + bne 5f + eor tmp2, tmp2, data1 + cmp tmp2, data2, S2HI #16 + bne 6f + ldr data1, [src1], #4 + b .Loverlap2 + +5: +#ifdef __ARM_BIG_ENDIAN + /* The syndrome value may contain false ones if the string ends + with the bytes 0x01 0x00 */ + tst data1, #0xff000000 + tstne data1, #0x00ff0000 + beq .Lstrcmp_done_equal +#else + lsls syndrome, syndrome, #16 + bne .Lstrcmp_done_equal +#endif + ldrh data2, [src2] + S2LO tmp2, data1, #16 +#ifdef __ARM_BIG_ENDIAN + lsl data2, data2, #16 +#endif + b .Lstrcmp_tail + +6: + S2HI data2, data2, #16 + S2LO tmp2, data1, #16 +4: + S2LO data2, data2, #16 + b .Lstrcmp_tail + + /* Critical inner Loop: Block with 1 byte initial overlap. */ + .p2align 2 +.Loverlap1: + and tmp2, data1, #LSB + cmp tmp2, data2, S2LO #24 + sub syndrome, data1, magic1 + bic syndrome, syndrome, data1 + bne 4f + ands syndrome, syndrome, magic1, lsl #7 + ldreq data2, [src2], #4 + bne 5f + eor tmp2, tmp2, data1 + cmp tmp2, data2, S2HI #8 + bne 6f + ldr data1, [src1], #4 + b .Loverlap1 +4: + S2LO data2, data2, #24 + b .Lstrcmp_tail +5: + /* The syndrome value may contain false ones if the string ends + with the bytes 0x01 0x00. */ + tst data1, #LSB + beq .Lstrcmp_done_equal + ldr data2, [src2], #4 +6: + S2LO tmp2, data1, #8 + bic data2, data2, #MSB + b .Lstrcmp_tail +.Lstrcmp_done_equal: + mov result, #0 + .cfi_remember_state + ldmfd sp!, {r4, r5} + .cfi_restore 4 + .cfi_restore 5 + .cfi_def_cfa_offset 0 + RETURN + +.Lstrcmp_tail: + .cfi_restore_state + and r2, tmp2, #LSB + and result, data2, #LSB + cmp result, #1 + cmpcs result, r2 + S2LOEQ tmp2, tmp2, #8 + S2LOEQ data2, data2, #8 + beq .Lstrcmp_tail + sub result, r2, result + ldmfd sp!, {r4, r5} + .cfi_restore 4 + .cfi_restore 5 + .cfi_def_cfa_offset 0 + RETURN + .cfi_endproc + .size strcmp, . - strcmp diff --git a/lib/machine/arm/strcmp-armv4t.S b/lib/machine/arm/strcmp-armv4t.S new file mode 100644 index 0000000..d01d840 --- /dev/null +++ b/lib/machine/arm/strcmp-armv4t.S @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /* This version is only used when we want a very basic Thumb1 + implementation or for size, otherwise we use the base ARMv4 + version. This is also suitable for ARMv6-M. */ + + .thumb + .syntax unified + .arch armv4t + .eabi_attribute Tag_also_compatible_with, "\006\013" /* ARMv6-M. */ + .eabi_attribute Tag_ARM_ISA_use, 0 +def_fn strcmp + .cfi_sections .debug_frame + .cfi_startproc +1: + ldrb r2, [r0] + ldrb r3, [r1] + cmp r2, #0 + beq 2f + adds r0, r0, #1 + adds r1, r1, #1 + cmp r2, r3 + beq 1b +2: + subs r0, r2, r3 + bx lr + .cfi_endproc + .size strcmp, . - strcmp diff --git a/lib/machine/arm/strcmp-armv6.S b/lib/machine/arm/strcmp-armv6.S new file mode 100644 index 0000000..657c1ee --- /dev/null +++ b/lib/machine/arm/strcmp-armv6.S @@ -0,0 +1,470 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /* Implementation of strcmp for ARMv6. Use ldrd to support wider + loads, provided the data is sufficiently aligned. Use + saturating arithmetic to optimize the compares. */ + + /* Build Options: + STRCMP_NO_PRECHECK: Don't run a quick pre-check of the first + byte in the string. If comparing completely random strings + the pre-check will save time, since there is a very high + probability of a mismatch in the first character: we save + significant overhead if this is the common case. However, + if strings are likely to be identical (eg because we're + verifying a hit in a hash table), then this check is largely + redundant. */ + + .arm + +/* Parameters and result. */ +#define src1 r0 +#define src2 r1 +#define result r0 /* Overlaps src1. */ + +/* Internal variables. */ +#define tmp1 r4 +#define tmp2 r5 +#define const_m1 r12 + +/* Additional internal variables for 64-bit aligned data. */ +#define data1a r2 +#define data1b r3 +#define data2a r6 +#define data2b r7 +#define syndrome_a tmp1 +#define syndrome_b tmp2 + +/* Additional internal variables for 32-bit aligned data. */ +#define data1 r2 +#define data2 r3 +#define syndrome tmp2 + + + /* Macro to compute and return the result value for word-aligned + cases. */ + .macro strcmp_epilogue_aligned synd d1 d2 restore_r6 +#ifdef __ARM_BIG_ENDIAN + /* If data1 contains a zero byte, then syndrome will contain a 1 in + bit 7 of that byte. Otherwise, the highest set bit in the + syndrome will highlight the first different bit. It is therefore + sufficient to extract the eight bits starting with the syndrome + bit. */ + clz tmp1, \synd + lsl r1, \d2, tmp1 + .if \restore_r6 + ldrd r6, r7, [sp, #8] + .endif + .cfi_restore 6 + .cfi_restore 7 + lsl \d1, \d1, tmp1 + .cfi_remember_state + lsr result, \d1, #24 + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + sub result, result, r1, lsr #24 + bx lr +#else + /* To use the big-endian trick we'd have to reverse all three words. + that's slower than this approach. */ + rev \synd, \synd + clz tmp1, \synd + bic tmp1, tmp1, #7 + lsr r1, \d2, tmp1 + .cfi_remember_state + .if \restore_r6 + ldrd r6, r7, [sp, #8] + .endif + .cfi_restore 6 + .cfi_restore 7 + lsr \d1, \d1, tmp1 + and result, \d1, #255 + and r1, r1, #255 + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + sub result, result, r1 + + bx lr +#endif + .endm + + .text + .p2align 5 +.Lstrcmp_start_addr: +#ifndef STRCMP_NO_PRECHECK +.Lfastpath_exit: + sub r0, r2, r3 + bx lr +#endif +def_fn strcmp +#ifndef STRCMP_NO_PRECHECK + ldrb r2, [src1] + ldrb r3, [src2] + cmp r2, #1 + cmpcs r2, r3 + bne .Lfastpath_exit +#endif + .cfi_sections .debug_frame + .cfi_startproc + strd r4, r5, [sp, #-16]! + .cfi_def_cfa_offset 16 + .cfi_offset 4, -16 + .cfi_offset 5, -12 + orr tmp1, src1, src2 + strd r6, r7, [sp, #8] + .cfi_offset 6, -8 + .cfi_offset 7, -4 + mvn const_m1, #0 + tst tmp1, #7 + beq .Lloop_aligned8 + +.Lnot_aligned: + eor tmp1, src1, src2 + tst tmp1, #7 + bne .Lmisaligned8 + + /* Deal with mutual misalignment by aligning downwards and then + masking off the unwanted loaded data to prevent a difference. */ + and tmp1, src1, #7 + bic src1, src1, #7 + and tmp2, tmp1, #3 + bic src2, src2, #7 + lsl tmp2, tmp2, #3 /* Bytes -> bits. */ + ldrd data1a, data1b, [src1], #16 + tst tmp1, #4 + ldrd data2a, data2b, [src2], #16 + /* In ARM code we can't use ORN, but with do have MVN with a + register shift. */ + mvn tmp1, const_m1, S2HI tmp2 + orr data1a, data1a, tmp1 + orr data2a, data2a, tmp1 + beq .Lstart_realigned8 + orr data1b, data1b, tmp1 + mov data1a, const_m1 + orr data2b, data2b, tmp1 + mov data2a, const_m1 + b .Lstart_realigned8 + + /* Unwind the inner loop by a factor of 2, giving 16 bytes per + pass. */ + .p2align 5,,12 /* Don't start in the tail bytes of a cache line. */ + .p2align 2 /* Always word aligned. */ +.Lloop_aligned8: + ldrd data1a, data1b, [src1], #16 + ldrd data2a, data2b, [src2], #16 +.Lstart_realigned8: + uadd8 syndrome_b, data1a, const_m1 /* Only want GE bits, */ + eor syndrome_a, data1a, data2a + sel syndrome_a, syndrome_a, const_m1 + uadd8 syndrome_b, data1b, const_m1 /* Only want GE bits. */ + eor syndrome_b, data1b, data2b + sel syndrome_b, syndrome_b, const_m1 + orrs syndrome_b, syndrome_b, syndrome_a /* Only need if s_a == 0 */ + bne .Ldiff_found + + ldrd data1a, data1b, [src1, #-8] + ldrd data2a, data2b, [src2, #-8] + uadd8 syndrome_b, data1a, const_m1 /* Only want GE bits, */ + eor syndrome_a, data1a, data2a + sel syndrome_a, syndrome_a, const_m1 + uadd8 syndrome_b, data1b, const_m1 /* Only want GE bits. */ + eor syndrome_b, data1b, data2b + sel syndrome_b, syndrome_b, const_m1 + orrs syndrome_b, syndrome_b, syndrome_a /* Only need if s_a == 0 */ + beq .Lloop_aligned8 + +.Ldiff_found: + cmp syndrome_a, #0 + bne .Ldiff_in_a + +.Ldiff_in_b: + strcmp_epilogue_aligned syndrome_b, data1b, data2b 1 + +.Ldiff_in_a: + .cfi_restore_state + strcmp_epilogue_aligned syndrome_a, data1a, data2a 1 + + .cfi_restore_state +.Lmisaligned8: + tst tmp1, #3 + bne .Lmisaligned4 + ands tmp1, src1, #3 + bne .Lmutual_align4 + + /* Unrolled by a factor of 2, to reduce the number of post-increment + operations. */ +.Lloop_aligned4: + ldr data1, [src1], #8 + ldr data2, [src2], #8 +.Lstart_realigned4: + uadd8 syndrome, data1, const_m1 /* Only need GE bits. */ + eor syndrome, data1, data2 + sel syndrome, syndrome, const_m1 + cmp syndrome, #0 + bne .Laligned4_done + + ldr data1, [src1, #-4] + ldr data2, [src2, #-4] + uadd8 syndrome, data1, const_m1 + eor syndrome, data1, data2 + sel syndrome, syndrome, const_m1 + cmp syndrome, #0 + beq .Lloop_aligned4 + +.Laligned4_done: + strcmp_epilogue_aligned syndrome, data1, data2, 0 + +.Lmutual_align4: + .cfi_restore_state + /* Deal with mutual misalignment by aligning downwards and then + masking off the unwanted loaded data to prevent a difference. */ + lsl tmp1, tmp1, #3 /* Bytes -> bits. */ + bic src1, src1, #3 + ldr data1, [src1], #8 + bic src2, src2, #3 + ldr data2, [src2], #8 + + /* In ARM code we can't use ORN, but with do have MVN with a + register shift. */ + mvn tmp1, const_m1, S2HI tmp1 + orr data1, data1, tmp1 + orr data2, data2, tmp1 + b .Lstart_realigned4 + +.Lmisaligned4: + ands tmp1, src1, #3 + beq .Lsrc1_aligned + sub src2, src2, tmp1 + bic src1, src1, #3 + lsls tmp1, tmp1, #31 + ldr data1, [src1], #4 + beq .Laligned_m2 + bcs .Laligned_m1 + +#ifdef STRCMP_NO_PRECHECK + ldrb data2, [src2, #1] + uxtb tmp1, data1, ror #BYTE1_OFFSET + cmp tmp1, #1 + cmpcs tmp1, data2 + bne .Lmisaligned_exit + +.Laligned_m2: + ldrb data2, [src2, #2] + uxtb tmp1, data1, ror #BYTE2_OFFSET + cmp tmp1, #1 + cmpcs tmp1, data2 + bne .Lmisaligned_exit + +.Laligned_m1: + ldrb data2, [src2, #3] + uxtb tmp1, data1, ror #BYTE3_OFFSET + cmp tmp1, #1 + cmpcs tmp1, data2 + beq .Lsrc1_aligned + +#else /* STRCMP_NO_PRECHECK */ + /* If we've done the pre-check, then we don't need to check the + first byte again here. */ + ldrb data2, [src2, #2] + uxtb tmp1, data1, ror #BYTE2_OFFSET + cmp tmp1, #1 + cmpcs tmp1, data2 + bne .Lmisaligned_exit + +.Laligned_m2: + ldrb data2, [src2, #3] + uxtb tmp1, data1, ror #BYTE3_OFFSET + cmp tmp1, #1 + cmpcs tmp1, data2 + beq .Laligned_m1 +#endif + +.Lmisaligned_exit: + .cfi_remember_state + sub result, tmp1, data2 + ldr r4, [sp], #16 + .cfi_restore 4 + bx lr + +#ifndef STRCMP_NO_PRECHECK +.Laligned_m1: + add src2, src2, #4 +#endif +.Lsrc1_aligned: + .cfi_restore_state + /* src1 is word aligned, but src2 has no common alignment + with it. */ + ldr data1, [src1], #4 + lsls tmp1, src2, #31 /* C=src2[1], Z=src2[0]. */ + + bic src2, src2, #3 + ldr data2, [src2], #4 + bhi .Loverlap1 /* C=1, Z=0 => src2[1:0] = 0b11. */ + bcs .Loverlap2 /* C=1, Z=1 => src2[1:0] = 0b10. */ + + /* (overlap3) C=0, Z=0 => src2[1:0] = 0b01. */ +.Loverlap3: + bic tmp1, data1, #MSB + uadd8 syndrome, data1, const_m1 + eors syndrome, tmp1, data2, S2LO #8 + sel syndrome, syndrome, const_m1 + bne 4f + cmp syndrome, #0 + ldreq data2, [src2], #4 + bne 5f + + eor tmp1, tmp1, data1 + cmp tmp1, data2, S2HI #24 + bne 6f + ldr data1, [src1], #4 + b .Loverlap3 +4: + S2LO data2, data2, #8 + b .Lstrcmp_tail + +5: + bics syndrome, syndrome, #MSB + bne .Lstrcmp_done_equal + + /* We can only get here if the MSB of data1 contains 0, so + fast-path the exit. */ + ldrb result, [src2] + .cfi_remember_state + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + /* R6/7 Not used in this sequence. */ + .cfi_restore 6 + .cfi_restore 7 + neg result, result + bx lr + +6: + .cfi_restore_state + S2LO data1, data1, #24 + and data2, data2, #LSB + b .Lstrcmp_tail + + .p2align 5,,12 /* Ensure at least 3 instructions in cache line. */ +.Loverlap2: + and tmp1, data1, const_m1, S2LO #16 + uadd8 syndrome, data1, const_m1 + eors syndrome, tmp1, data2, S2LO #16 + sel syndrome, syndrome, const_m1 + bne 4f + cmp syndrome, #0 + ldreq data2, [src2], #4 + bne 5f + eor tmp1, tmp1, data1 + cmp tmp1, data2, S2HI #16 + bne 6f + ldr data1, [src1], #4 + b .Loverlap2 +4: + S2LO data2, data2, #16 + b .Lstrcmp_tail +5: + ands syndrome, syndrome, const_m1, S2LO #16 + bne .Lstrcmp_done_equal + + ldrh data2, [src2] + S2LO data1, data1, #16 +#ifdef __ARM_BIG_ENDIAN + lsl data2, data2, #16 +#endif + b .Lstrcmp_tail + +6: + S2LO data1, data1, #16 + and data2, data2, const_m1, S2LO #16 + b .Lstrcmp_tail + + .p2align 5,,12 /* Ensure at least 3 instructions in cache line. */ +.Loverlap1: + and tmp1, data1, #LSB + uadd8 syndrome, data1, const_m1 + eors syndrome, tmp1, data2, S2LO #24 + sel syndrome, syndrome, const_m1 + bne 4f + cmp syndrome, #0 + ldreq data2, [src2], #4 + bne 5f + eor tmp1, tmp1, data1 + cmp tmp1, data2, S2HI #8 + bne 6f + ldr data1, [src1], #4 + b .Loverlap1 +4: + S2LO data2, data2, #24 + b .Lstrcmp_tail +5: + tst syndrome, #LSB + bne .Lstrcmp_done_equal + ldr data2, [src2] +6: + S2LO data1, data1, #8 + bic data2, data2, #MSB + b .Lstrcmp_tail + +.Lstrcmp_done_equal: + mov result, #0 + .cfi_remember_state + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + /* R6/7 not used in this sequence. */ + .cfi_restore 6 + .cfi_restore 7 + bx lr + +.Lstrcmp_tail: + .cfi_restore_state +#ifndef __ARM_BIG_ENDIAN + rev data1, data1 + rev data2, data2 + /* Now everything looks big-endian... */ +#endif + uadd8 tmp1, data1, const_m1 + eor tmp1, data1, data2 + sel syndrome, tmp1, const_m1 + clz tmp1, syndrome + lsl data1, data1, tmp1 + lsl data2, data2, tmp1 + lsr result, data1, #24 + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + /* R6/7 not used in this sequence. */ + .cfi_restore 6 + .cfi_restore 7 + sub result, result, data2, lsr #24 + bx lr + .cfi_endproc + .size strcmp, . - .Lstrcmp_start_addr diff --git a/lib/machine/arm/strcmp-armv6m.S b/lib/machine/arm/strcmp-armv6m.S new file mode 100644 index 0000000..74f87cb --- /dev/null +++ b/lib/machine/arm/strcmp-armv6m.S @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Implementation of strcmp for ARMv6m. This version is only used in + ARMv6-M when we want an efficient implementation. Otherwize if the + code size is preferred, strcmp-armv4t.S will be used. */ + + .thumb_func + .syntax unified + .arch armv6-m + + .macro DoSub n, label + subs r0, r0, r1 +#ifdef __ARM_BIG_ENDIAN + lsrs r1, r4, \n +#else + lsls r1, r4, \n +#endif + orrs r1, r0 + bne \label + .endm + + .macro Byte_Test n, label + lsrs r0, r2, \n + lsrs r1, r3, \n + DoSub \n, \label + .endm + + .text +def_fn strcmp + .cfi_sections .debug_frame + .cfi_startproc + mov r2, r0 + push {r4, r5, r6, lr} + orrs r2, r1 + lsls r2, r2, #30 + bne 6f + ldr r5, =0x01010101 + lsls r6, r5, #7 +1: + ldmia r0!, {r2} + ldmia r1!, {r3} + subs r4, r2, r5 + bics r4, r2 + ands r4, r6 + beq 3f + +#ifdef __ARM_BIG_ENDIAN + Byte_Test #24, 4f + Byte_Test #16, 4f + Byte_Test #8, 4f + + b 7f +3: + cmp r2, r3 + beq 1b + cmp r2, r3 +#else + uxtb r0, r2 + uxtb r1, r3 + DoSub #24, 2f + + uxth r0, r2 + uxth r1, r3 + DoSub #16, 2f + + lsls r0, r2, #8 + lsls r1, r3, #8 + lsrs r0, r0, #8 + lsrs r1, r1, #8 + DoSub #8, 2f + + lsrs r0, r2, #24 + lsrs r1, r3, #24 + subs r0, r0, r1 +2: + pop {r4, r5, r6, pc} + +3: + cmp r2, r3 + beq 1b + rev r0, r2 + rev r1, r3 + cmp r0, r1 +#endif + + bls 5f + movs r0, #1 +4: + pop {r4, r5, r6, pc} +5: + movs r0, #0 + mvns r0, r0 + pop {r4, r5, r6, pc} +6: + ldrb r2, [r0, #0] + ldrb r3, [r1, #0] + adds r0, #1 + adds r1, #1 + cmp r2, #0 + beq 7f + cmp r2, r3 + bne 7f + ldrb r2, [r0, #0] + ldrb r3, [r1, #0] + adds r0, #1 + adds r1, #1 + cmp r2, #0 + beq 7f + cmp r2, r3 + beq 6b +7: + subs r0, r2, r3 + pop {r4, r5, r6, pc} + .cfi_endproc + .size strcmp, . - strcmp diff --git a/lib/machine/arm/strcmp-armv7.S b/lib/machine/arm/strcmp-armv7.S new file mode 100644 index 0000000..7cafca1 --- /dev/null +++ b/lib/machine/arm/strcmp-armv7.S @@ -0,0 +1,482 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + /* Implementation of strcmp for ARMv7 when DSP instructions are + available. Use ldrd to support wider loads, provided the data + is sufficiently aligned. Use saturating arithmetic to optimize + the compares. */ + + /* Build Options: + STRCMP_NO_PRECHECK: Don't run a quick pre-check of the first + byte in the string. If comparing completely random strings + the pre-check will save time, since there is a very high + probability of a mismatch in the first character: we save + significant overhead if this is the common case. However, + if strings are likely to be identical (eg because we're + verifying a hit in a hash table), then this check is largely + redundant. */ + + /* This version uses Thumb-2 code. */ + .thumb + .syntax unified + +#include "arm_asm.h" + +/* Parameters and result. */ +#define src1 r0 +#define src2 r1 +#define result r0 /* Overlaps src1. */ + +/* Internal variables. */ +#define tmp1 r4 +#define tmp2 r5 +#define const_m1 r12 + +/* Additional internal variables for 64-bit aligned data. */ +#define data1a r2 +#define data1b r3 +#define data2a r6 +#define data2b r7 +#define syndrome_a tmp1 +#define syndrome_b tmp2 + +/* Additional internal variables for 32-bit aligned data. */ +#define data1 r2 +#define data2 r3 +#define syndrome tmp2 + + + /* Macro to compute and return the result value for word-aligned + cases. */ + .macro strcmp_epilogue_aligned synd d1 d2 restore_r6 +#ifdef __ARM_BIG_ENDIAN + /* If data1 contains a zero byte, then syndrome will contain a 1 in + bit 7 of that byte. Otherwise, the highest set bit in the + syndrome will highlight the first different bit. It is therefore + sufficient to extract the eight bits starting with the syndrome + bit. */ + clz tmp1, \synd + lsl r1, \d2, tmp1 + .if \restore_r6 + ldrd r6, r7, [sp, #8] + .endif + .cfi_restore 6 + .cfi_restore 7 + lsl \d1, \d1, tmp1 + .cfi_remember_state + lsr result, \d1, #24 + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + .cfi_adjust_cfa_offset -16 + sub result, result, r1, lsr #24 + epilogue push_ip=HAVE_PAC_LEAF +#else + /* To use the big-endian trick we'd have to reverse all three words. + that's slower than this approach. */ + rev \synd, \synd + clz tmp1, \synd + bic tmp1, tmp1, #7 + lsr r1, \d2, tmp1 + .cfi_remember_state + .if \restore_r6 + ldrd r6, r7, [sp, #8] + .endif + .cfi_restore 6 + .cfi_restore 7 + lsr \d1, \d1, tmp1 + and result, \d1, #255 + and r1, r1, #255 + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + .cfi_adjust_cfa_offset -16 + sub result, result, r1 + + epilogue push_ip=HAVE_PAC_LEAF +#endif + .endm + + + .text + .p2align 5 +def_fn strcmp + .fnstart + .cfi_sections .debug_frame + .cfi_startproc + prologue push_ip=HAVE_PAC_LEAF +#ifndef STRCMP_NO_PRECHECK + ldrb r2, [src1] + ldrb r3, [src2] + cmp r2, #1 + it cs + cmpcs r2, r3 + bne .Lfastpath_exit +#endif + strd r4, r5, [sp, #-16]! + .cfi_adjust_cfa_offset 16 + .cfi_rel_offset 4, 0 + .cfi_rel_offset 5, 4 + orr tmp1, src1, src2 + strd r6, r7, [sp, #8] + .cfi_rel_offset 6, 8 + .cfi_rel_offset 7, 12 + mvn const_m1, #0 + lsl r2, tmp1, #29 + cbz r2, .Lloop_aligned8 + +.Lnot_aligned: + eor tmp1, src1, src2 + tst tmp1, #7 + bne .Lmisaligned8 + + /* Deal with mutual misalignment by aligning downwards and then + masking off the unwanted loaded data to prevent a difference. */ + and tmp1, src1, #7 + bic src1, src1, #7 + and tmp2, tmp1, #3 + bic src2, src2, #7 + lsl tmp2, tmp2, #3 /* Bytes -> bits. */ + ldrd data1a, data1b, [src1], #16 + tst tmp1, #4 + ldrd data2a, data2b, [src2], #16 + /* In thumb code we can't use MVN with a register shift, but + we do have ORN. */ + S2HI tmp1, const_m1, tmp2 + orn data1a, data1a, tmp1 + orn data2a, data2a, tmp1 + beq .Lstart_realigned8 + orn data1b, data1b, tmp1 + mov data1a, const_m1 + orn data2b, data2b, tmp1 + mov data2a, const_m1 + b .Lstart_realigned8 + + /* Unwind the inner loop by a factor of 2, giving 16 bytes per + pass. */ + .p2align 5,,12 /* Don't start in the tail bytes of a cache line. */ + .p2align 2 /* Always word aligned. */ +.Lloop_aligned8: + ldrd data1a, data1b, [src1], #16 + ldrd data2a, data2b, [src2], #16 +.Lstart_realigned8: + uadd8 syndrome_b, data1a, const_m1 /* Only want GE bits, */ + eor syndrome_a, data1a, data2a + sel syndrome_a, syndrome_a, const_m1 + cbnz syndrome_a, .Ldiff_in_a + uadd8 syndrome_b, data1b, const_m1 /* Only want GE bits. */ + eor syndrome_b, data1b, data2b + sel syndrome_b, syndrome_b, const_m1 + cbnz syndrome_b, .Ldiff_in_b + + ldrd data1a, data1b, [src1, #-8] + ldrd data2a, data2b, [src2, #-8] + uadd8 syndrome_b, data1a, const_m1 /* Only want GE bits, */ + eor syndrome_a, data1a, data2a + sel syndrome_a, syndrome_a, const_m1 + uadd8 syndrome_b, data1b, const_m1 /* Only want GE bits. */ + eor syndrome_b, data1b, data2b + sel syndrome_b, syndrome_b, const_m1 + /* Can't use CBZ for backwards branch. */ + orrs syndrome_b, syndrome_b, syndrome_a /* Only need if s_a == 0 */ + beq .Lloop_aligned8 + +.Ldiff_found: + cbnz syndrome_a, .Ldiff_in_a + +.Ldiff_in_b: + strcmp_epilogue_aligned syndrome_b, data1b, data2b 1 + +.Ldiff_in_a: + .cfi_restore_state + strcmp_epilogue_aligned syndrome_a, data1a, data2a 1 + + .cfi_restore_state +.Lmisaligned8: + tst tmp1, #3 + bne .Lmisaligned4 + ands tmp1, src1, #3 + bne .Lmutual_align4 + + /* Unrolled by a factor of 2, to reduce the number of post-increment + operations. */ +.Lloop_aligned4: + ldr data1, [src1], #8 + ldr data2, [src2], #8 +.Lstart_realigned4: + uadd8 syndrome, data1, const_m1 /* Only need GE bits. */ + eor syndrome, data1, data2 + sel syndrome, syndrome, const_m1 + cbnz syndrome, .Laligned4_done + ldr data1, [src1, #-4] + ldr data2, [src2, #-4] + uadd8 syndrome, data1, const_m1 + eor syndrome, data1, data2 + sel syndrome, syndrome, const_m1 + cmp syndrome, #0 + beq .Lloop_aligned4 + +.Laligned4_done: + strcmp_epilogue_aligned syndrome, data1, data2, 0 + +.Lmutual_align4: + .cfi_restore_state + /* Deal with mutual misalignment by aligning downwards and then + masking off the unwanted loaded data to prevent a difference. */ + lsl tmp1, tmp1, #3 /* Bytes -> bits. */ + bic src1, src1, #3 + ldr data1, [src1], #8 + bic src2, src2, #3 + ldr data2, [src2], #8 + + /* In thumb code we can't use MVN with a register shift, but + we do have ORN. */ + S2HI tmp1, const_m1, tmp1 + orn data1, data1, tmp1 + orn data2, data2, tmp1 + b .Lstart_realigned4 + +.Lmisaligned4: + ands tmp1, src1, #3 + beq .Lsrc1_aligned + sub src2, src2, tmp1 + bic src1, src1, #3 + lsls tmp1, tmp1, #31 + ldr data1, [src1], #4 + beq .Laligned_m2 + bcs .Laligned_m1 +#ifdef STRCMP_NO_PRECHECK + ldrb data2, [src2, #1] + uxtb tmp1, data1, ror #BYTE1_OFFSET + subs tmp1, tmp1, data2 + bne .Lmisaligned_exit + cbz data2, .Lmisaligned_exit + +.Laligned_m2: + ldrb data2, [src2, #2] + uxtb tmp1, data1, ror #BYTE2_OFFSET + subs tmp1, tmp1, data2 + bne .Lmisaligned_exit + cbz data2, .Lmisaligned_exit + +.Laligned_m1: + ldrb data2, [src2, #3] + uxtb tmp1, data1, ror #BYTE3_OFFSET + subs tmp1, tmp1, data2 + bne .Lmisaligned_exit + add src2, src2, #4 + cbnz data2, .Lsrc1_aligned +#else /* STRCMP_NO_PRECHECK */ + /* If we've done the pre-check, then we don't need to check the + first byte again here. */ + ldrb data2, [src2, #2] + uxtb tmp1, data1, ror #BYTE2_OFFSET + subs tmp1, tmp1, data2 + bne .Lmisaligned_exit + cbz data2, .Lmisaligned_exit + +.Laligned_m2: + ldrb data2, [src2, #3] + uxtb tmp1, data1, ror #BYTE3_OFFSET + subs tmp1, tmp1, data2 + bne .Lmisaligned_exit + cbnz data2, .Laligned_m1 +#endif + +.Lmisaligned_exit: + .cfi_remember_state + mov result, tmp1 + ldr r4, [sp], #16 + .cfi_restore 4 + .cfi_adjust_cfa_offset -16 + epilogue push_ip=HAVE_PAC_LEAF + +#ifndef STRCMP_NO_PRECHECK +.Lfastpath_exit: + .cfi_restore_state + .cfi_remember_state + sub r0, r2, r3 + epilogue push_ip=HAVE_PAC_LEAF + +.Laligned_m1: + .cfi_restore_state + .cfi_remember_state + add src2, src2, #4 +#endif +.Lsrc1_aligned: + .cfi_restore_state + /* src1 is word aligned, but src2 has no common alignment + with it. */ + ldr data1, [src1], #4 + lsls tmp1, src2, #31 /* C=src2[1], Z=src2[0]. */ + + bic src2, src2, #3 + ldr data2, [src2], #4 + bhi .Loverlap1 /* C=1, Z=0 => src2[1:0] = 0b11. */ + bcs .Loverlap2 /* C=1, Z=1 => src2[1:0] = 0b10. */ + + /* (overlap3) C=0, Z=0 => src2[1:0] = 0b01. */ +.Loverlap3: + bic tmp1, data1, #MSB + uadd8 syndrome, data1, const_m1 + eors syndrome, tmp1, data2, S2LO #8 + sel syndrome, syndrome, const_m1 + bne 4f + cbnz syndrome, 5f + ldr data2, [src2], #4 + eor tmp1, tmp1, data1 + cmp tmp1, data2, S2HI #24 + bne 6f + ldr data1, [src1], #4 + b .Loverlap3 +4: + S2LO data2, data2, #8 + b .Lstrcmp_tail + +5: + bics syndrome, syndrome, #MSB + bne .Lstrcmp_done_equal + + /* We can only get here if the MSB of data1 contains 0, so + fast-path the exit. */ + ldrb result, [src2] + .cfi_remember_state + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + /* R6/7 Not used in this sequence. */ + .cfi_restore 6 + .cfi_restore 7 + .cfi_adjust_cfa_offset -16 + neg result, result + epilogue push_ip=HAVE_PAC_LEAF + +6: + .cfi_restore_state + S2LO data1, data1, #24 + and data2, data2, #LSB + b .Lstrcmp_tail + + .p2align 5,,12 /* Ensure at least 3 instructions in cache line. */ +.Loverlap2: + and tmp1, data1, const_m1, S2LO #16 + uadd8 syndrome, data1, const_m1 + eors syndrome, tmp1, data2, S2LO #16 + sel syndrome, syndrome, const_m1 + bne 4f + cbnz syndrome, 5f + ldr data2, [src2], #4 + eor tmp1, tmp1, data1 + cmp tmp1, data2, S2HI #16 + bne 6f + ldr data1, [src1], #4 + b .Loverlap2 +4: + S2LO data2, data2, #16 + b .Lstrcmp_tail +5: + ands syndrome, syndrome, const_m1, S2LO #16 + bne .Lstrcmp_done_equal + + ldrh data2, [src2] + S2LO data1, data1, #16 +#ifdef __ARM_BIG_ENDIAN + lsl data2, data2, #16 +#endif + b .Lstrcmp_tail + +6: + S2LO data1, data1, #16 + and data2, data2, const_m1, S2LO #16 + b .Lstrcmp_tail + + .p2align 5,,12 /* Ensure at least 3 instructions in cache line. */ +.Loverlap1: + and tmp1, data1, #LSB + uadd8 syndrome, data1, const_m1 + eors syndrome, tmp1, data2, S2LO #24 + sel syndrome, syndrome, const_m1 + bne 4f + cbnz syndrome, 5f + ldr data2, [src2], #4 + eor tmp1, tmp1, data1 + cmp tmp1, data2, S2HI #8 + bne 6f + ldr data1, [src1], #4 + b .Loverlap1 +4: + S2LO data2, data2, #24 + b .Lstrcmp_tail +5: + tst syndrome, #LSB + bne .Lstrcmp_done_equal + ldr data2, [src2] +6: + S2LO data1, data1, #8 + bic data2, data2, #MSB + b .Lstrcmp_tail + +.Lstrcmp_done_equal: + mov result, #0 + .cfi_remember_state + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + /* R6/7 not used in this sequence. */ + .cfi_restore 6 + .cfi_restore 7 + .cfi_adjust_cfa_offset -16 + epilogue push_ip=HAVE_PAC_LEAF + +.Lstrcmp_tail: + .cfi_restore_state +#ifndef __ARM_BIG_ENDIAN + rev data1, data1 + rev data2, data2 + /* Now everything looks big-endian... */ +#endif + uadd8 tmp1, data1, const_m1 + eor tmp1, data1, data2 + sel syndrome, tmp1, const_m1 + clz tmp1, syndrome + lsl data1, data1, tmp1 + lsl data2, data2, tmp1 + lsr result, data1, #24 + ldrd r4, r5, [sp], #16 + .cfi_restore 4 + .cfi_restore 5 + /* R6/7 not used in this sequence. */ + .cfi_restore 6 + .cfi_restore 7 + .cfi_adjust_cfa_offset -16 + sub result, result, data2, lsr #24 + epilogue push_ip=HAVE_PAC_LEAF + .cfi_endproc + .cantunwind + .fnend + .size strcmp, . - strcmp diff --git a/lib/machine/arm/strcmp-armv7m.S b/lib/machine/arm/strcmp-armv7m.S new file mode 100644 index 0000000..825b6e7 --- /dev/null +++ b/lib/machine/arm/strcmp-armv7m.S @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Very similar to the generic code, but uses Thumb2 as implemented + in ARMv7-M. */ + +#include "arm_asm.h" + +/* Parameters and result. */ +#define src1 r0 +#define src2 r1 +#define result r0 /* Overlaps src1. */ + +/* Internal variables. */ +#define data1 r2 +#define data2 r3 +#define tmp2 r5 +#define tmp1 r12 +#define syndrome r12 /* Overlaps tmp1 */ + + .thumb + .syntax unified +def_fn strcmp + .fnstart + .cfi_sections .debug_frame + .cfi_startproc + prologue push_ip=HAVE_PAC_LEAF + eor tmp1, src1, src2 + tst tmp1, #3 + /* Strings not at same byte offset from a word boundary. */ + bne .Lstrcmp_unaligned + ands tmp1, src1, #3 + bic src1, src1, #3 + bic src2, src2, #3 + ldr data1, [src1], #4 + it eq + ldreq data2, [src2], #4 + beq 4f + /* Although s1 and s2 have identical initial alignment, they are + not currently word aligned. Rather than comparing bytes, + make sure that any bytes fetched from before the addressed + bytes are forced to 0xff. Then they will always compare + equal. */ + eor tmp1, tmp1, #3 + mvn data2, #MSB + lsl tmp1, tmp1, #3 + S2LO tmp1, data2, tmp1 + ldr data2, [src2], #4 + orr data1, data1, tmp1 + orr data2, data2, tmp1 + .p2align 2 + /* Critical loop. */ +4: + sub syndrome, data1, #0x01010101 + cmp data1, data2 + /* check for any zero bytes in first word */ + itttt eq + biceq syndrome, syndrome, data1 + tsteq syndrome, #0x80808080 + ldreq data1, [src1], #4 + ldreq data2, [src2], #4 + beq 4b +2: + .cfi_remember_state + /* There's a zero or a different byte in the word */ + S2HI result, data1, #24 + S2LO data1, data1, #8 + cmp result, #1 + it cs + cmpcs result, data2, S2HI #24 + it eq + S2LOEQ data2, data2, #8 + beq 2b + /* On a big-endian machine, RESULT contains the desired byte in bits + 0-7; on a little-endian machine they are in bits 24-31. In + both cases the other bits in RESULT are all zero. For DATA2 the + interesting byte is at the other end of the word, but the + other bits are not necessarily zero. We need a signed result + representing the differnece in the unsigned bytes, so for the + little-endian case we can't just shift the interesting bits + up. */ +#ifdef __ARM_BIG_ENDIAN + sub result, result, data2, lsr #24 +#else + and data2, data2, #255 + lsrs result, result, #24 + subs result, result, data2 +#endif + epilogue push_ip=HAVE_PAC_LEAF + + +#if 0 + /* The assembly code below is based on the following alogrithm. */ +#ifdef __ARM_BIG_ENDIAN +#define RSHIFT << +#define LSHIFT >> +#else +#define RSHIFT >> +#define LSHIFT << +#endif + +#define body(shift) \ + mask = 0xffffffffU RSHIFT shift; \ + data1 = *src1++; \ + data2 = *src2++; \ + do \ + { \ + tmp2 = data1 & mask; \ + if (__builtin_expect(tmp2 != data2 RSHIFT shift, 0)) \ + { \ + data2 RSHIFT= shift; \ + break; \ + } \ + if (__builtin_expect(((data1 - b1) & ~data1) & (b1 << 7), 0)) \ + { \ + /* See comment in assembler below re syndrome on big-endian */\ + if ((((data1 - b1) & ~data1) & (b1 << 7)) & mask) \ + data2 RSHIFT= shift; \ + else \ + { \ + data2 = *src2; \ + tmp2 = data1 RSHIFT (32 - shift); \ + data2 = (data2 LSHIFT (32 - shift)) RSHIFT (32 - shift); \ + } \ + break; \ + } \ + data2 = *src2++; \ + tmp2 ^= data1; \ + if (__builtin_expect(tmp2 != data2 LSHIFT (32 - shift), 0)) \ + { \ + tmp2 = data1 >> (32 - shift); \ + data2 = (data2 << (32 - shift)) RSHIFT (32 - shift); \ + break; \ + } \ + data1 = *src1++; \ + } while (1) + + const unsigned* src1; + const unsigned* src2; + unsigned data1, data2; + unsigned mask; + unsigned shift; + unsigned b1 = 0x01010101; + char c1, c2; + unsigned tmp2; + + while (((unsigned) s1) & 3) + { + c1 = *s1++; + c2 = *s2++; + if (c1 == 0 || c1 != c2) + return c1 - (int)c2; + } + src1 = (unsigned*) (((unsigned)s1) & ~3); + src2 = (unsigned*) (((unsigned)s2) & ~3); + tmp2 = ((unsigned) s2) & 3; + if (tmp2 == 1) + { + body(8); + } + else if (tmp2 == 2) + { + body(16); + } + else + { + body (24); + } + + do + { +#ifdef __ARM_BIG_ENDIAN + c1 = (char) tmp2 >> 24; + c2 = (char) data2 >> 24; +#else /* not __ARM_BIG_ENDIAN */ + c1 = (char) tmp2; + c2 = (char) data2; +#endif /* not __ARM_BIG_ENDIAN */ + tmp2 RSHIFT= 8; + data2 RSHIFT= 8; + } while (c1 != 0 && c1 == c2); + return c1 - c2; +#endif /* 0 */ + + + /* First of all, compare bytes until src1(sp1) is word-aligned. */ +.Lstrcmp_unaligned: + .cfi_restore_state + tst src1, #3 + beq 2f + .cfi_remember_state + ldrb data1, [src1], #1 + ldrb data2, [src2], #1 + cmp data1, #1 + it cs + cmpcs data1, data2 + beq .Lstrcmp_unaligned + sub result, data1, data2 + epilogue push_ip=HAVE_PAC_LEAF + +2: + .cfi_restore_state + stmfd sp!, {r5} + .cfi_adjust_cfa_offset 4 + .cfi_rel_offset 5, 0 + + ldr data1, [src1], #4 + and tmp2, src2, #3 + bic src2, src2, #3 + ldr data2, [src2], #4 + cmp tmp2, #2 + beq .Loverlap2 + bhi .Loverlap1 + + /* Critical inner Loop: Block with 3 bytes initial overlap */ + .p2align 2 +.Loverlap3: + bic tmp2, data1, #MSB + cmp tmp2, data2, S2LO #8 + sub syndrome, data1, #0x01010101 + bic syndrome, syndrome, data1 + bne 4f + ands syndrome, syndrome, #0x80808080 + it eq + ldreq data2, [src2], #4 + bne 5f + eor tmp2, tmp2, data1 + cmp tmp2, data2, S2HI #24 + bne 6f + ldr data1, [src1], #4 + b .Loverlap3 +4: + S2LO data2, data2, #8 + b .Lstrcmp_tail + +5: +#ifdef __ARM_BIG_ENDIAN + /* The syndrome value may contain false ones if the string ends + with the bytes 0x01 0x00. */ + tst data1, #0xff000000 + itt ne + tstne data1, #0x00ff0000 + tstne data1, #0x0000ff00 + beq .Lstrcmp_done_equal +#else + bics syndrome, syndrome, #0xff000000 + bne .Lstrcmp_done_equal +#endif + ldrb data2, [src2] + S2LO tmp2, data1, #24 +#ifdef __ARM_BIG_ENDIAN + lsl data2, data2, #24 +#endif + b .Lstrcmp_tail + +6: + S2LO tmp2, data1, #24 + and data2, data2, #LSB + b .Lstrcmp_tail + + /* Critical inner Loop: Block with 2 bytes initial overlap. */ + .p2align 2 +.Loverlap2: + S2HI tmp2, data1, #16 + sub syndrome, data1, #0x01010101 + S2LO tmp2, tmp2, #16 + bic syndrome, syndrome, data1 + cmp tmp2, data2, S2LO #16 + bne 4f + ands syndrome, syndrome, #0x80808080 + it eq + ldreq data2, [src2], #4 + bne 5f + eor tmp2, tmp2, data1 + cmp tmp2, data2, S2HI #16 + bne 6f + ldr data1, [src1], #4 + b .Loverlap2 + +5: +#ifdef __ARM_BIG_ENDIAN + /* The syndrome value may contain false ones if the string ends + with the bytes 0x01 0x00 */ + tst data1, #0xff000000 + it ne + tstne data1, #0x00ff0000 + beq .Lstrcmp_done_equal +#else + lsls syndrome, syndrome, #16 + bne .Lstrcmp_done_equal +#endif + ldrh data2, [src2] + S2LO tmp2, data1, #16 +#ifdef __ARM_BIG_ENDIAN + lsl data2, data2, #16 +#endif + b .Lstrcmp_tail + +6: + S2HI data2, data2, #16 + S2LO tmp2, data1, #16 +4: + S2LO data2, data2, #16 + b .Lstrcmp_tail + + /* Critical inner Loop: Block with 1 byte initial overlap. */ + .p2align 2 +.Loverlap1: + and tmp2, data1, #LSB + cmp tmp2, data2, S2LO #24 + sub syndrome, data1, #0x01010101 + bic syndrome, syndrome, data1 + bne 4f + ands syndrome, syndrome, #0x80808080 + it eq + ldreq data2, [src2], #4 + bne 5f + eor tmp2, tmp2, data1 + cmp tmp2, data2, S2HI #8 + bne 6f + ldr data1, [src1], #4 + b .Loverlap1 +4: + S2LO data2, data2, #24 + b .Lstrcmp_tail +5: + /* The syndrome value may contain false ones if the string ends + with the bytes 0x01 0x00. */ + tst data1, #LSB + beq .Lstrcmp_done_equal + ldr data2, [src2], #4 +6: + S2LO tmp2, data1, #8 + bic data2, data2, #MSB + b .Lstrcmp_tail +.Lstrcmp_done_equal: + mov result, #0 + .cfi_remember_state + ldmfd sp!, {r5} + .cfi_restore 5 + .cfi_adjust_cfa_offset -4 + epilogue push_ip=HAVE_PAC_LEAF + +.Lstrcmp_tail: + .cfi_restore_state + and r2, tmp2, #LSB + and result, data2, #LSB + cmp result, #1 + it cs + cmpcs result, r2 + itt eq + S2LOEQ tmp2, tmp2, #8 + S2LOEQ data2, data2, #8 + beq .Lstrcmp_tail + sub result, r2, result + ldmfd sp!, {r5} + .cfi_restore 5 + .cfi_adjust_cfa_offset -4 + epilogue push_ip=HAVE_PAC_LEAF + .cfi_endproc + .cantunwind + .fnend + .size strcmp, . - strcmp diff --git a/lib/machine/arm/strcmp.S b/lib/machine/arm/strcmp.S new file mode 100644 index 0000000..ae308cf --- /dev/null +++ b/lib/machine/arm/strcmp.S @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Wrapper for the various implementations of strcmp. */ + +#include "arm-acle-compat.h" + +#ifdef __ARM_BIG_ENDIAN +#define S2LO lsl +#define S2LOEQ lsleq +#define S2HI lsr +#define MSB 0x000000ff +#define LSB 0xff000000 +#define BYTE0_OFFSET 24 +#define BYTE1_OFFSET 16 +#define BYTE2_OFFSET 8 +#define BYTE3_OFFSET 0 +#else /* not __ARM_BIG_ENDIAN */ +#define S2LO lsr +#define S2LOEQ lsreq +#define S2HI lsl +#define BYTE0_OFFSET 0 +#define BYTE1_OFFSET 8 +#define BYTE2_OFFSET 16 +#define BYTE3_OFFSET 24 +#define MSB 0xff000000 +#define LSB 0x000000ff +#endif /* not __ARM_BIG_ENDIAN */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) \ + || (__ARM_ARCH_ISA_THUMB == 1 && !__ARM_ARCH_ISA_ARM) + +# if defined (__thumb__) && !defined (__thumb2__) +/* Thumb1 only variant. If size is preferred, use strcmp-armv4t.S. + If speed is preferred, the strcmp function in strcmp-armv6m.S + will be used. */ + +# if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) +# include "strcmp-armv4t.S" +# else +# include "strcmp-armv6m.S" +# endif + +# else +# include "strcmp-arm-tiny.S" +# endif + +#elif __ARM_ARCH_ISA_THUMB == 2 + +# ifdef __ARM_FEATURE_SIMD32 +# include "strcmp-armv7.S" +# else +# include "strcmp-armv7m.S" +# endif + +#elif __ARM_ARCH >= 6 + +# include "strcmp-armv6.S" + +#else + +# include "strcmp-armv4.S" + +#endif diff --git a/lib/machine/arm/strcpy.c b/lib/machine/arm/strcpy.c new file mode 100644 index 0000000..111528e --- /dev/null +++ b/lib/machine/arm/strcpy.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2008 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arm_asm.h" +#include <_ansi.h> +#include + +#ifdef __thumb2__ +#define magic1(REG) "#0x01010101" +#define magic2(REG) "#0x80808080" +#else +#define magic1(REG) #REG +#define magic2(REG) #REG ", lsl #7" +#endif + +char* __attribute__((naked)) +strcpy (char* dst, const char* src) +{ + asm ( + ".syntax unified\n\t" +#if !(defined(__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) || \ + (defined (__thumb__) && !defined (__thumb2__))) +#ifdef _ISA_ARM_7 + "pld [r1]\n\t" +#endif + "eor r2, r0, r1\n\t" + "mov ip, r0\n\t" + "tst r2, #3\n\t" + "bne 4f\n\t" + "tst r1, #3\n\t" + "bne 3f\n" + "5:\n\t" +#ifndef __thumb2__ + "str r5, [sp, #-4]!\n\t" + "mov r5, #0x01\n\t" + "orr r5, r5, r5, lsl #8\n\t" + "orr r5, r5, r5, lsl #16\n\t" +#endif + + "str r4, [sp, #-4]!\n\t" + "tst r1, #4\n\t" + "ldr r3, [r1], #4\n\t" + "beq 2f\n\t" + "sub r2, r3, "magic1(r5)"\n\t" + "bics r2, r2, r3\n\t" + "tst r2, "magic2(r5)"\n\t" + "itt eq\n\t" + "streq r3, [ip], #4\n\t" + "ldreq r3, [r1], #4\n" + "bne 1f\n\t" + /* Inner loop. We now know that r1 is 64-bit aligned, so we + can safely fetch up to two words. This allows us to avoid + load stalls. */ + ".p2align 2\n" + "2:\n\t" +#ifdef _ISA_ARM_7 + "pld [r1, #8]\n\t" +#endif + "ldr r4, [r1], #4\n\t" + "sub r2, r3, "magic1(r5)"\n\t" + "bics r2, r2, r3\n\t" + "tst r2, "magic2(r5)"\n\t" + "sub r2, r4, "magic1(r5)"\n\t" + "bne 1f\n\t" + "str r3, [ip], #4\n\t" + "bics r2, r2, r4\n\t" + "tst r2, "magic2(r5)"\n\t" + "itt eq\n\t" + "ldreq r3, [r1], #4\n\t" + "streq r4, [ip], #4\n\t" + "beq 2b\n\t" + "mov r3, r4\n" + "1:\n\t" +#ifdef __ARMEB__ + "rors r3, r3, #24\n\t" +#endif + "strb r3, [ip], #1\n\t" + "tst r3, #0xff\n\t" +#ifdef __ARMEL__ + "ror r3, r3, #8\n\t" +#endif + "bne 1b\n\t" + "ldr r4, [sp], #4\n\t" +#ifndef __thumb2__ + "ldr r5, [sp], #4\n\t" +#endif + "bx lr\n" + + /* Strings have the same offset from word alignment, but it's + not zero. */ + "3:\n\t" + "tst r1, #1\n\t" + "beq 1f\n\t" + "ldrb r2, [r1], #1\n\t" + "strb r2, [ip], #1\n\t" + "cmp r2, #0\n\t" + "it eq\n" + "bxeq lr\n" + "1:\n\t" + "tst r1, #2\n\t" + "beq 5b\n\t" + "ldrh r2, [r1], #2\n\t" +#ifdef __ARMEB__ + "tst r2, #0xff00\n\t" + "iteet ne\n\t" + "strhne r2, [ip], #2\n\t" + "lsreq r2, r2, #8\n\t" + "strbeq r2, [ip]\n\t" + "tstne r2, #0xff\n\t" +#else + "tst r2, #0xff\n\t" + "itet ne\n\t" + "strhne r2, [ip], #2\n\t" + "strbeq r2, [ip]\n\t" + "tstne r2, #0xff00\n\t" +#endif + "bne 5b\n\t" + "bx lr\n" + + /* src and dst do not have a common word-alignement. Fall back to + byte copying. */ + "4:\n\t" + "ldrb r2, [r1], #1\n\t" + "strb r2, [ip], #1\n\t" + "cmp r2, #0\n\t" + "bne 4b\n\t" + "bx lr\n\t" + +#elif !defined (__thumb__) || defined (__thumb2__) + "mov r3, r0\n\t" + "1:\n\t" + "ldrb r2, [r1], #1\n\t" + "strb r2, [r3], #1\n\t" + "cmp r2, #0\n\t" + "bne 1b\n\t" + "bx lr\n\t" +#else + "movs r3, r0\n\t" + "1:\n\t" + "ldrb r2, [r1]\n\t" + "adds r1, #1\n\t" + "strb r2, [r3]\n\t" + "adds r3, #1\n\t" + "cmp r2, #0\n\t" + "bne 1b\n\t" + "bx lr\n\t" +#endif + ); +} diff --git a/lib/machine/arm/strlen-armv7.S b/lib/machine/arm/strlen-armv7.S new file mode 100644 index 0000000..6aa122c --- /dev/null +++ b/lib/machine/arm/strlen-armv7.S @@ -0,0 +1,191 @@ +/* Copyright (c) 2010-2011,2013 Linaro Limited + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Linaro Limited nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Assumes: + ARMv6T2 or ARMv7E-M, AArch32 + */ + +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "arm-acle-compat.h" +#include "arm_asm.h" + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + +#ifdef __ARMEB__ +#define S2LO lsl +#define S2HI lsr +#else +#define S2LO lsr +#define S2HI lsl +#endif + + /* This code requires Thumb. */ +#if __ARM_ARCH_PROFILE == 'M' +#if __ARM_ARCH >= 8 + /* keep config inherited from -march=. */ +#else + .arch armv7e-m +#endif /* if __ARM_ARCH >= 8 */ +#else + .arch armv6t2 +#endif + .eabi_attribute Tag_ARM_ISA_use, 0 + .thumb + .syntax unified + +/* Parameters and result. */ +#define srcin r0 +#define result r0 + +/* Internal variables. */ +#define src r1 +#define data1a r2 +#define data1b r3 +#define const_m1 r12 +#define const_0 r4 +#define tmp1 r4 /* Overlaps const_0 */ +#define tmp2 r5 + +def_fn strlen p2align=6 + .fnstart + .cfi_startproc + prologue 4 5 push_ip=HAVE_PAC_LEAF + pld [srcin, #0] + bic src, srcin, #7 + mvn const_m1, #0 + ands tmp1, srcin, #7 /* (8 - bytes) to alignment. */ + pld [src, #32] + bne.w .Lmisaligned8 + mov const_0, #0 + mov result, #-8 +.Lloop_aligned: + /* Bytes 0-7. */ + ldrd data1a, data1b, [src] + pld [src, #64] + add result, result, #8 +.Lstart_realigned: + uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */ + sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */ + uadd8 data1b, data1b, const_m1 + sel data1b, data1a, const_m1 /* Only used if d1a == 0. */ + cbnz data1b, .Lnull_found + + /* Bytes 8-15. */ + ldrd data1a, data1b, [src, #8] + uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */ + add result, result, #8 + sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */ + uadd8 data1b, data1b, const_m1 + sel data1b, data1a, const_m1 /* Only used if d1a == 0. */ + cbnz data1b, .Lnull_found + + /* Bytes 16-23. */ + ldrd data1a, data1b, [src, #16] + uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */ + add result, result, #8 + sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */ + uadd8 data1b, data1b, const_m1 + sel data1b, data1a, const_m1 /* Only used if d1a == 0. */ + cbnz data1b, .Lnull_found + + /* Bytes 24-31. */ + ldrd data1a, data1b, [src, #24] + add src, src, #32 + uadd8 data1a, data1a, const_m1 /* Saturating GE<0:3> set. */ + add result, result, #8 + sel data1a, const_0, const_m1 /* Select based on GE<0:3>. */ + uadd8 data1b, data1b, const_m1 + sel data1b, data1a, const_m1 /* Only used if d1a == 0. */ + cmp data1b, #0 + beq .Lloop_aligned + +.Lnull_found: + .cfi_remember_state + cmp data1a, #0 + itt eq + addeq result, result, #4 + moveq data1a, data1b +#ifndef __ARMEB__ + rev data1a, data1a +#endif + clz data1a, data1a + add result, result, data1a, lsr #3 /* Bits -> Bytes. */ + epilogue 4 5 push_ip=HAVE_PAC_LEAF + +.Lmisaligned8: + .cfi_restore_state + ldrd data1a, data1b, [src] + and tmp2, tmp1, #3 + rsb result, tmp1, #0 + lsl tmp2, tmp2, #3 /* Bytes -> bits. */ + tst tmp1, #4 + pld [src, #64] + S2HI tmp2, const_m1, tmp2 + orn data1a, data1a, tmp2 + itt ne + ornne data1b, data1b, tmp2 + movne data1a, const_m1 + mov const_0, #0 + b .Lstart_realigned + .cfi_endproc + .cantunwind + .fnend + .size strlen, . - strlen diff --git a/lib/machine/arm/strlen-stub.c b/lib/machine/arm/strlen-stub.c new file mode 100644 index 0000000..fc2daf1 --- /dev/null +++ b/lib/machine/arm/strlen-stub.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2008-2015 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "arm_asm.h" +#include <_ansi.h> +#include +#include + +#if defined __OPTIMIZE_SIZE__ || defined PREFER_SIZE_OVER_SPEED +#if __ARM_ARCH_ISA_THUMB == 2 +/* Implemented in strlen.S. */ + +#elif defined (__ARM_ARCH_ISA_THUMB) +/* Implemented in strlen.S. */ + +#else +#include "../../string/strlen.c" + +#endif + +#else /* defined __OPTIMIZE_SIZE__ || defined PREFER_SIZE_OVER_SPEED */ +#if defined __thumb__ && ! defined __thumb2__ +#include "../../string/strlen.c" + +#elif __ARM_ARCH_ISA_THUMB >= 2 && defined __ARM_FEATURE_DSP + /* Implemented in strlen.S. */ + +#else +size_t __attribute__((naked)) +strlen (const char* str) +{ + asm ("len .req r0\n\t" + "data .req r3\n\t" + "addr .req r1\n\t" + +#ifdef _ISA_ARM_7 + "pld [r0]\n\t" +#endif + /* Word-align address */ + "bic addr, r0, #3\n\t" + /* Get adjustment for start ... */ + "ands len, r0, #3\n\t" + "neg len, len\n\t" + /* First word of data */ + "ldr data, [addr], #4\n\t" + /* Ensure bytes preceeding start ... */ + "add ip, len, #4\n\t" + "mov ip, ip, asl #3\n\t" + "mvn r2, #0\n\t" + /* ... are masked out */ +#ifdef __thumb__ + "itt ne\n\t" +# ifdef __ARMEB__ + "lslne r2, ip\n\t" +# else + "lsrne r2, ip\n\t" +# endif + "orrne data, data, r2\n\t" +#else + "it ne\n\t" +# ifdef __ARMEB__ + "orrne data, data, r2, lsl ip\n\t" +# else + "orrne data, data, r2, lsr ip\n\t" +# endif +#endif + /* Magic const 0x01010101 */ +#ifdef _ISA_ARM_7 + "movw ip, #0x101\n\t" +#else + "mov ip, #0x1\n\t" + "orr ip, ip, ip, lsl #8\n\t" +#endif + "orr ip, ip, ip, lsl #16\n" + + /* This is the main loop. We subtract one from each byte in + the word: the sign bit changes iff the byte was zero or + 0x80 -- we eliminate the latter case by anding the result + with the 1-s complement of the data. */ + "1:\n\t" + /* test (data - 0x01010101) */ + "sub r2, data, ip\n\t" + /* ... & ~data */ + "bic r2, r2, data\n\t" + /* ... & 0x80808080 == 0? */ + "ands r2, r2, ip, lsl #7\n\t" +#ifdef _ISA_ARM_7 + /* yes, get more data... */ + "itt eq\n\t" + "ldreq data, [addr], #4\n\t" + /* and 4 more bytes */ + "addeq len, len, #4\n\t" + /* Unroll the loop a bit. */ + "pld [addr, #8]\n\t" + /* test (data - 0x01010101) */ + "ittt eq\n\t" + "subeq r2, data, ip\n\t" + /* ... & ~data */ + "biceq r2, r2, data\n\t" + /* ... & 0x80808080 == 0? */ + "andeqs r2, r2, ip, lsl #7\n\t" +#endif + "itt eq\n\t" + /* yes, get more data... */ + "ldreq data, [addr], #4\n\t" + /* and 4 more bytes */ + "addeq len, len, #4\n\t" + "beq 1b\n\t" +#ifdef __ARMEB__ + "tst data, #0xff000000\n\t" + "itttt ne\n\t" + "addne len, len, #1\n\t" + "tstne data, #0xff0000\n\t" + "addne len, len, #1\n\t" + "tstne data, #0xff00\n\t" + "it ne\n\t" + "addne len, len, #1\n\t" +#else +# ifdef _ISA_ARM_5 + /* R2 is the residual sign bits from the above test. All we + need to do now is establish the position of the first zero + byte... */ + /* Little-endian is harder, we need the number of trailing + zeros / 8 */ +# ifdef _ISA_ARM_7 + "rbit r2, r2\n\t" + "clz r2, r2\n\t" +# else + "rsb r1, r2, #0\n\t" + "and r2, r2, r1\n\t" + "clz r2, r2\n\t" + "rsb r2, r2, #31\n\t" +# endif + "add len, len, r2, lsr #3\n\t" +# else /* No CLZ instruction */ + "tst data, #0xff\n\t" + "itttt ne\n\t" + "addne len, len, #1\n\t" + "tstne data, #0xff00\n\t" + "addne len, len, #1\n\t" + "tstne data, #0xff0000\n\t" + "it ne\n\t" + "addne len, len, #1\n\t" +# endif +#endif + "bx lr\n\t"); +} +#endif +#endif diff --git a/lib/machine/arm/strlen-thumb1-Os.S b/lib/machine/arm/strlen-thumb1-Os.S new file mode 100644 index 0000000..4b50430 --- /dev/null +++ b/lib/machine/arm/strlen-thumb1-Os.S @@ -0,0 +1,50 @@ +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + + .arch armv4t + .eabi_attribute Tag_also_compatible_with, "\006\013" /* ARMv6-M. */ + .eabi_attribute Tag_ARM_ISA_use, 0 + .thumb + .syntax unified + +def_fn strlen p2align=1 + movs r3, #0 +1: + ldrb r2, [r0, r3] + adds r3, r3, #1 + cmp r2, #0 + bne 1b + subs r0, r3, #1 + bx lr + .size strlen, . - strlen diff --git a/lib/machine/arm/strlen-thumb2-Os.S b/lib/machine/arm/strlen-thumb2-Os.S new file mode 100644 index 0000000..4adbc61 --- /dev/null +++ b/lib/machine/arm/strlen-thumb2-Os.S @@ -0,0 +1,62 @@ +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "arm-acle-compat.h" +#include "arm_asm.h" + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm +#if __ARM_ARCH_PROFILE == 'M' && __ARM_ARCH >= 8 + /* keep config inherited from -march=. */ +#elif __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7 + .arch armv7 +#else + .arch armv6t2 +#endif + .eabi_attribute Tag_ARM_ISA_use, 0 + .thumb + .syntax unified + +def_fn strlen p2align=1 + .fnstart + .cfi_startproc + prologue + mov r3, r0 +1: ldrb.w r2, [r3], #1 + cmp r2, #0 + bne 1b + subs r0, r3, r0 + subs r0, #1 + epilogue + .cfi_endproc + .cantunwind + .fnend + .size strlen, . - strlen diff --git a/lib/machine/arm/strlen.S b/lib/machine/arm/strlen.S new file mode 100644 index 0000000..d85a7ee --- /dev/null +++ b/lib/machine/arm/strlen.S @@ -0,0 +1,51 @@ +/* Copyright (c) 2015 ARM Ltd. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the Linaro nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "arm-acle-compat.h" + +#if defined __OPTIMIZE_SIZE__ || defined PREFER_SIZE_OVER_SPEED +#if __ARM_ARCH_ISA_THUMB == 2 +#include "strlen-thumb2-Os.S" + +#elif defined (__ARM_ARCH_ISA_THUMB) +#include "strlen-thumb1-Os.S" + +#else + /* Implemented in strlen-stub.c. */ + +#endif + +#else /* defined __OPTIMIZE_SIZE__ || defined PREFER_SIZE_OVER_SPEED */ +#if defined __thumb__ && ! defined __thumb2__ + /* Implemented in strlen-stub.c. */ + +#elif __ARM_ARCH_ISA_THUMB >= 2 && defined __ARM_FEATURE_DSP +#include "strlen-armv7.S" + +#else + /* Implemented in strlen-stub.c. */ +#endif +#endif diff --git a/lib/machine/arm/sys/fenv.h b/lib/machine/arm/sys/fenv.h new file mode 100644 index 0000000..70bd57b --- /dev/null +++ b/lib/machine/arm/sys/fenv.h @@ -0,0 +1,90 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_FENV_H_ +#define _SYS_FENV_H_ 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int fenv_t; +typedef int fexcept_t; + +/* Exception flags */ +#define FE_INVALID 0x0001 +#define FE_DIVBYZERO 0x0002 +#define FE_OVERFLOW 0x0004 +#define FE_UNDERFLOW 0x0008 +#define FE_INEXACT 0x0010 +#ifndef __SOFTFP__ +#define FE_DENORMAL 0x0080 +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW | FE_DENORMAL) +#else +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) +#endif + +/* Rounding modes */ +#define FE_TONEAREST 0x00000000 +#define FE_UPWARD 0x00400000 +#define FE_DOWNWARD 0x00800000 +#define FE_TOWARDZERO 0x00c00000 + +/* Default floating-point environment */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV (_fe_dfl_env) + +int feclearexcept(int); +int fegetexceptflag(fexcept_t *, int); +int fesetexceptflag(const fexcept_t *, int); +int feraiseexcept(int); +int fetestexcept(int); +int fegetround(void); +int fesetround(int); +int fegetenv(fenv_t *); +int feholdexcept(fenv_t *); +int fesetenv(const fenv_t *); +int feupdateenv(const fenv_t *); +#if __BSD_VISIBLE +int feenableexcept(int); +int fedisableexcept(int); +int fegetexcept(void); +#endif /* __BSD_VISIBLE */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_FENV_H_ */ diff --git a/lib/machine/bfin/Makefile.inc b/lib/machine/bfin/Makefile.inc new file mode 100644 index 0000000..646a813 --- /dev/null +++ b/lib/machine/bfin/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/longjmp.S diff --git a/lib/machine/bfin/longjmp.S b/lib/machine/bfin/longjmp.S new file mode 100644 index 0000000..1eda2ea --- /dev/null +++ b/lib/machine/bfin/longjmp.S @@ -0,0 +1,115 @@ +/* + * longjmp for the Blackfin processor + * + * Copyright (C) 2006 Analog Devices, Inc. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#define _ASM +#define _SETJMP_H + + +.text; +.align 4; +.globl _longjmp; +.type _longjmp, STT_FUNC; +_longjmp: + P0 = R0; + R0 = [P0 + 0x00]; + [--SP] = R0; /* Put P0 on the stack */ + + P1 = [P0 + 0x04]; + P2 = [P0 + 0x08]; + P3 = [P0 + 0x0C]; + P4 = [P0 + 0x10]; + P5 = [P0 + 0x14]; + + FP = [P0 + 0x18]; + R0 = [SP++]; /* Grab P0 from old stack */ + SP = [P0 + 0x1C]; /* Update Stack Pointer */ + [--SP] = R0; /* Put P0 on new stack */ + [--SP] = R1; /* Put VAL arg on new stack */ + + R0 = [P0 + 0x20]; /* Data Registers */ + R1 = [P0 + 0x24]; + R2 = [P0 + 0x28]; + R3 = [P0 + 0x2C]; + R4 = [P0 + 0x30]; + R5 = [P0 + 0x34]; + R6 = [P0 + 0x38]; + R7 = [P0 + 0x3C]; + + R0 = [P0 + 0x40]; + ASTAT = R0; + + R0 = [P0 + 0x44]; /* Loop Counters */ + LC0 = R0; + R0 = [P0 + 0x48]; + LC1 = R0; + + R0 = [P0 + 0x4C]; /* Accumulators */ + A0.W = R0; + R0 = [P0 + 0x50]; + A0.X = R0; + R0 = [P0 + 0x54]; + A1.W = R0; + R0 = [P0 + 0x58]; + A1.X = R0; + + R0 = [P0 + 0x5C]; /* Index Registers */ + I0 = R0; + R0 = [P0 + 0x60]; + I1 = R0; + R0 = [P0 + 0x64]; + I2 = R0; + R0 = [P0 + 0x68]; + I3 = R0; + + R0 = [P0 + 0x6C]; /* Modifier Registers */ + M0 = R0; + R0 = [P0 + 0x70]; + M1 = R0; + R0 = [P0 + 0x74]; + M2 = R0; + R0 = [P0 + 0x78]; + M3 = R0; + + R0 = [P0 + 0x7C]; /* Length Registers */ + L0 = R0; + R0 = [P0 + 0x80]; + L1 = R0; + R0 = [P0 + 0x84]; + L2 = R0; + R0 = [P0 + 0x88]; + L3 = R0; + + R0 = [P0 + 0x8C]; /* Base Registers */ + B0 = R0; + R0 = [P0 + 0x90]; + B1 = R0; + R0 = [P0 + 0x94]; + B2 = R0; + R0 = [P0 + 0x98]; + B3 = R0; + + R0 = [P0 + 0x9C]; /* Return Address (PC) */ + RETS = R0; + + R0 = [SP++]; + P0 = [SP++]; + + CC = R0 == 0; + IF !CC JUMP 1f; + R0 = 1; +1: + RTS; +.size _longjmp, .-_longjmp; diff --git a/lib/machine/bfin/setjmp.S b/lib/machine/bfin/setjmp.S new file mode 100644 index 0000000..d964dad --- /dev/null +++ b/lib/machine/bfin/setjmp.S @@ -0,0 +1,108 @@ +/* + * setjmp for the Blackfin processor + * + * Copyright (C) 2006 Analog Devices, Inc. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + + +#define _ASM +#define _SETJMP_H + +.text; +.align 4; +.globl _setjmp; +.type _setjmp, STT_FUNC; + +_setjmp: + [--SP] = P0; /* Save P0 */ + P0 = R0; + R0 = [SP++]; + [P0 + 0x00] = R0; /* Save saved P0 */ + [P0 + 0x04] = P1; + [P0 + 0x08] = P2; + [P0 + 0x0C] = P3; + [P0 + 0x10] = P4; + [P0 + 0x14] = P5; + + [P0 + 0x18] = FP; /* Frame Pointer */ + [P0 + 0x1C] = SP; /* Stack Pointer */ + + [P0 + 0x20] = P0; /* Data Registers */ + [P0 + 0x24] = R1; + [P0 + 0x28] = R2; + [P0 + 0x2C] = R3; + [P0 + 0x30] = R4; + [P0 + 0x34] = R5; + [P0 + 0x38] = R6; + [P0 + 0x3C] = R7; + + R0 = ASTAT; + [P0 + 0x40] = R0; + + R0 = LC0; /* Loop Counters */ + [P0 + 0x44] = R0; + R0 = LC1; + [P0 + 0x48] = R0; + + R0 = A0.W; /* Accumulators */ + [P0 + 0x4C] = R0; + R0 = A0.X; + [P0 + 0x50] = R0; + R0 = A1.W; + [P0 + 0x54] = R0; + R0 = A1.X; + [P0 + 0x58] = R0; + + R0 = I0; /* Index Registers */ + [P0 + 0x5C] = R0; + R0 = I1; + [P0 + 0x60] = R0; + R0 = I2; + [P0 + 0x64] = R0; + R0 = I3; + [P0 + 0x68] = R0; + + R0 = M0; /* Modifier Registers */ + [P0 + 0x6C] = R0; + R0 = M1; + [P0 + 0x70] = R0; + R0 = M2; + [P0 + 0x74] = R0; + R0 = M3; + [P0 + 0x78] = R0; + + R0 = L0; /* Length Registers */ + [P0 + 0x7c] = R0; + R0 = L1; + [P0 + 0x80] = R0; + R0 = L2; + [P0 + 0x84] = R0; + R0 = L3; + [P0 + 0x88] = R0; + + R0 = B0; /* Base Registers */ + [P0 + 0x8C] = R0; + R0 = B1; + [P0 + 0x90] = R0; + R0 = B2; + [P0 + 0x94] = R0; + R0 = B3; + [P0 + 0x98] = R0; + + R0 = RETS; + [P0 + 0x9C] = R0; + + R0 = 0; + + RTS; +.size _setjmp, .-_setjmp; diff --git a/lib/machine/cr16/Makefile.inc b/lib/machine/cr16/Makefile.inc new file mode 100644 index 0000000..8075d20 --- /dev/null +++ b/lib/machine/cr16/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/getenv.c diff --git a/lib/machine/cr16/getenv.c b/lib/machine/cr16/getenv.c new file mode 100644 index 0000000..75ef1cc --- /dev/null +++ b/lib/machine/cr16/getenv.c @@ -0,0 +1,24 @@ +/* getenv.c -- Implementation of the getenv() routine + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +/* getenv() is implemented as a low-level function, + thus we only invoke here the system call. */ +char * getenv (const char *name) +{ + char *_getenv(const char *); + + return (_getenv (name)); +} + diff --git a/lib/machine/cr16/setjmp.S b/lib/machine/cr16/setjmp.S new file mode 100644 index 0000000..d31643a --- /dev/null +++ b/lib/machine/cr16/setjmp.S @@ -0,0 +1,97 @@ + ############################################################################## + # setjmp.S -- CR16 setjmp routine # + # # + # Copyright (c) 2004 National Semiconductor Corporation # + # # + # The authors hereby grant permission to use, copy, modify, distribute, # + # and license this software and its documentation for any purpose, provided # + # that existing copyright notices are retained in all copies and that this # + # notice is included verbatim in any distributions. No written agreement, # + # license, or royalty fee is required for any of the authorized uses. # + # Modifications to this software may be copyrighted by their authors # + # and need not follow the licensing terms described here, provided that # + # the new terms are clearly indicated on the first page of each file where # + # they apply. # + # # + # C library -- setjmp, longjmp # + # longjmp(a,v) # + # will generate a "return(v)" # + # from the last call to # + # setjmp(a) # + # by restoring r7-ra, sp, # + # and pc from 'a' # + # and doing a return. (Makes sure that longjmp never returns 0). # + ############################################################################## + + .text + .file "setjmp.s" + .align 4 + + .globl _setjmp + .align 4 +_setjmp: + #r3, r2: .blkw + storw r7, 0(r3,r2) + addd $2, (r3,r2) + storw r8, 0(r3,r2) + addd $2, (r3,r2) + storw r9, 0(r3,r2) + addd $2, (r3,r2) + storw r10, 0(r3,r2) + addd $2, (r3,r2) + storw r11, 0(r3,r2) + addd $2, (r3,r2) + + stord (r12), 0(r3,r2) + addd $4, (r3,r2) + stord (r13), 0(r3,r2) + addd $4, (r3,r2) + + stord (ra), 0(r3,r2) + addd $4, (r3,r2) + stord (sp), 0(r3,r2) + + movd $0,(r1,r0) + jump (ra) + + .globl _longjmp +_longjmp: + #r3, r2: .blkw # pointer save area + #r5, r4: .blkw # ret vlaue + + loadw 0(r3,r2), r7 + addd $2, (r3,r2) + loadw 0(r3,r2), r8 + addd $2, (r3,r2) + loadw 0(r3,r2), r9 + addd $2, (r3,r2) + loadw 0(r3,r2), r10 + addd $2, (r3,r2) + loadw 0(r3,r2), r11 + addd $2, (r3,r2) + + loadd 0(r3,r2), (r12) + addd $4, (r3,r2) + loadd 0(r3,r2), (r13) + addd $4, (r3,r2) + + loadd 0(r3,r2), (ra) + addd $4, (r3,r2) + loadd 0(r3,r2), (sp) + +#ifdef __INT32__ + movd (r5,r4), (r1,r0) + cmpd $0, (r5,r4) + bne end1 + movd $1, (r1,r0) +#else + movw r4, r0 + cmpw $0, r4 + bne end1 + movw $1, r0 +#endif +end1: + jump (ra) + .align 4 + + diff --git a/lib/machine/cr16/sys/asm.h b/lib/machine/cr16/sys/asm.h new file mode 100644 index 0000000..cfc53e6 --- /dev/null +++ b/lib/machine/cr16/sys/asm.h @@ -0,0 +1,280 @@ +/* asm.h -- CR16 architecture intrinsic functions + * + * Copyright (c) 2012 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _ASM +#define _ASM + +/* Note that immediate input values are not checked for validity. It is + the user's responsibility to use the intrinsic functions with appropriate + immediate values. */ + +/* Addition Instructions */ +#define _addb_(src, dest) __asm__("addb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _addub_(src, dest) __asm__("addub %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _addw_(src, dest) __asm__("addw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _adduw_(src, dest) __asm__("adduw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _addd_(src, dest) __asm__("addd %1, %0" : "=r" (dest) : \ + "ri" ((unsigned long)src), "0" (dest) : "cc") + +/* Add with Carry */ +#define _addcb_(src, dest) __asm__("addcb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _addcw_(src, dest) __asm__("addcw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") + +/* Bitwise Logical AND */ +#define _andb_(src, dest) __asm__("andb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _andw_(src, dest) __asm__("andw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _andd_(src, dest) __asm__("andd %1,%0" : "=r" (dest) : \ + "ri" ((unsigned long)src) , "0" (dest)) + +/* Arithmetic shift Instructions */ +#define _ashub_(count, dest) __asm__("ashub %1,%0" : "=r" (dest) : \ + "ri" ((char)count) , "0" (dest) ) +#define _ashuw_(count, dest) __asm__("ashuw %1,%0" : "=r" (dest) : \ + "ri" ((char)count) , "0" (dest) ) +#define _ashud_(count, dest) __asm__("ashud %1,%0" : "=r" (dest) : \ + "ri" ((char)count) , "0" (dest) ) + +/* cbit (clear bit) Instructions */ +#define _cbitb_(pos, dest) __asm__("cbitb %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") +#define _cbitw_(pos, dest) __asm__("cbitw %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") + +/* Compare Instructions */ +#define _cmpb_(src1, src2) __asm__("cmpb %0,%1" : /* no output */ : \ + "ri" ((unsigned char)src1) , "r" (src2) : "cc") +#define _cmpw_(src1, src2) __asm__("cmpw %0,%1" : /* no output */ : \ + "ri" ((unsigned short)src1) , "r" (src2) : "cc") +#define _cmpd_(src1, src2) __asm__("cmpd %0,%1" : /* no output */ : \ + "ri" ((unsigned long)src1) , "r" (src2) : "cc") + +/* Disable Inerrupts instructions */ +#define _di_() __asm__ volatile ("di\n" : : : "cc") +#define _disable_() __asm__ volatile ("di\n" : : : "cc") +#define _disable_interrupt_() _di_ + +/* Enable Inerrupts instructions */ +#define _ei_() __asm__ volatile ("ei\n" : : : "cc") +#define _enable_() __asm__ volatile ("ei\n" : : : "cc") +#define _enable_interrupt_() _ei_ + +/* Enable Inerrupts instructions and Wait */ +#define _eiwait_() __asm__ volatile ("eiwait" : : : "cc") + +/* excp Instructions */ +#define _excp_(vector) __asm__ volatile ("excp " # vector) + +/* lpr and lprd Instructions */ +#define _lpr_(procreg, src) __asm__("lpr\t%0," procreg : \ + /* no output */ : "r" (src) : "cc") +#define _lprd_(procregd, src) __asm__("lprd\t%0," procregd : \ + /* no output */ : "r" (src) : "cc") +/* Left Shift Instructions */ +#define _lshb_(count, dest) __asm__("lshb %1,%0" : "=r" (dest) : \ + "ri" ((char)count) , "0" (dest) ) +#define _lshw_(count, dest) __asm__("lshw %1,%0" : "=r" (dest) : \ + "ri" ((char)count) , "0" (dest) ) +#define _lshd_(count, dest) __asm__("lshd %1,%0" : "=r" (dest) : \ + "ri" ((char)count) , "0" (dest) ) + +/* Load Instructions */ +#define _loadb_(base, dest) __asm__("loadb %1,%0" : "=r" (dest) : \ + "m" (base) , "0" (dest)) +#define _loadw_(base, dest) __asm__("loadw %1,%0" : "=r" (dest) : \ + "m" (base) , "0" (dest)) +#define _loadd_(base, dest) __asm__("loadd %1,%0" : "=r" (dest) : \ + "m" (base) , "0" (dest)) + +/* Load Multiple Instructions */ +#define _loadm_(src, mask) __asm__("loadm %0,%1" : /* No output */ : \ + "r" ((unsigned int)src) , "i" (mask)) +#define _loadmp_(src, mask) __asm__("loadmp %0,%1" : /* No output */ : \ + "r" ((unsigned int)src) , "i" (mask)) + +/* Multiply Accumulate Instrutions */ +#define _macsw_(hi, lo, src1, src2) __asm__("macsw %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((short)src1) , "r" (src2)) +#define _macuw_(hi, lo, src1, src2) __asm__("macuw %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((unsigned short)src1) , "r" (src2)) +#define _macqw_(src1, src2) __asm__("macqw %1,%0" \ + : =l (lo), =h (hi) \ + :"r" ((short)src1) , "r" (src2)) + +/* Move Instructions */ +#define _movb_(src, dest) __asm__("movb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _movw_(src, dest) __asm__("movw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _movd_(src, dest) __asm__("movd %1,%0" : "=r" (dest) : \ + "ri" ((unsigned int)src) , "0" (dest)) +#define _movxb_(src, dest) __asm__("movxb %1,%0" : "=r" (dest) : \ + "r" (src), "0" (dest) ) +#define _movzb_(src, dest) __asm__("movzb %1,%0" : "=r" (dest) : \ + "r" (src), "0" (dest) ) +#define _movxw_(src, dest) __asm__("movxw %1,%0" : "=r" (dest) : \ + "r" (src), "0" (dest) ) +#define _movzw_(src, dest) __asm__("movzw %1,%0" : "=r" (dest) : \ + "r" (src), "0" (dest) ) + +/* Multiplication Instructions */ +#define _mulb_(src, dest) __asm__("mulb %1,%0" : "=r" (dest) : \ + "ri" ((char)src) , "0" (dest)) +#define _mulw_(src, dest) __asm__("mulw %1,%0" : "=r" (dest) : \ + "ri" ((short)src) , "0" (dest)) +#define _mulsb_(src, dest) __asm__("mulsb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _mulsw_(src, dest) __asm__("mulsw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _muluw_(src, dest) __asm__("muluw %1,%0" : "=r" (dest) : \ + "r" ((unsigned short)src) , "0" (dest)) + +/* nop Instruction */ +#define _nop_() __asm__("nop") + +/* or Instructions */ +#define _orb_(src, dest) __asm__("orb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _orw_(src, dest) __asm__("orw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _ord_(src, dest) __asm__("ord %1,%0" : "=r" (dest) : \ + "ri" ((unsigned int)src) , "0" (dest)) + +/* retx Instruction */ +#define _retx_() __asm__("retx") + +/* Set Bit Instructions */ +#define _sbitb_(pos, dest) __asm__("sbitb %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") +#define _sbitw_(pos, dest) __asm__("sbitw %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") + +/* spr and sprd Instructions */ +#define _spr_(procreg, dest) __asm__("spr\t" procreg ",%0" : \ + "=r" (dest) : /* no input */ "0" (dest) : "cc") +#define _sprd_(procregd, dest) __asm__("sprd\t" procregd ",%0" : \ + "=r" (dest) : /* no input */ "0" (dest) : "cc") + +/* Store Instructions */ +#define _storb_(src, address) __asm__("storb %1,%0" : "=m" (address) : \ + "ri" ((unsigned int)src)) +#define _storw_(src, address) __asm__("storw %1,%0" : "=m" (address) : \ + "ri" ((unsigned int)src)) +#define _stord_(src, address) __asm__("stord %1,%0" : "=m" (address) : \ + "ri" ((unsigned int)src)) + +/* Store Multiple Instructions */ +#define _storm_(mask, src) __asm__("storm %1,%0" : /* No output here */ : \ + "i" (mask) , "r" ((unsigned int)src)) +#define _stormp_(mask, src) __asm__("stormp %1,%0" : /* No output here */ : \ + "i" (mask) , "r" ((unsigned int)src)) + +/* Substruct Instructions */ +#define _subb_(src, dest) __asm__("subb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _subw_(src, dest) __asm__("subw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _subd_(src, dest) __asm__("subd %1, %0" : "=r" (dest) : \ + "ri" ((unsigned long)src), "0" (dest) : "cc") + +/* Substruct with Carry Instructions */ +#define _subcb_(src, dest) __asm__("subcb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _subcw_(src, dest) __asm__("subcw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") + +/* Test Bit Instructions */ +#define _tbit_(offset, base) __asm__("tbit %0,%1" : /* no output */ : \ + "ri" ((unsigned char)offset) , "r" (base) : "cc") +#define _tbitb_(pos, dest) __asm__("tbitb %0,%1" : /* No output */ : \ + "i" ((unsigned char)pos) , "m" (dest) : "cc") +#define _tbitw_(pos, dest) __asm__("tbitw %0,%1" : /* No output */ : \ + "i" ((unsigned char)pos) , "m" (dest) : "cc") + +/* wait Instruction*/ +#define _wait_() __asm__ volatile ("wait" : : : "cc") + +/* xor Instructions */ +#define _xorb_(src, dest) __asm__("xorb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _xorw_(src, dest) __asm__("xorw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _xord_(src, dest) __asm__("xord %1,%0" : "=r" (dest) : \ + "ri" ((unsigned long)src) , "0" (dest)) + +#if !defined (__CR16C__) +#define _di_() __asm__ volatile ("di\n" : : : "cc") +#else +/* In CR16C architecture the "nop" instruction is required after the di instruction + in order to be sure the interrupts are indeed disabled. + For details, refer the the CR16C Programmers Reference Manual. */ +#define _di_() __asm__ volatile ("di\n\tnop" : : : "cc") +#endif + +/* mtgpr Instruction */ +#define _mtgpr_(src, gpr) \ +__asm__ volatile ("movd\t%[_src], " gpr : /* no output */ \ + : [_src] "ri" (src) \ + : gpr ) + +/* mfgpr Instruction */ +#define _mfgpr_(gpr, dest) \ +__asm__ volatile ("movd\t" gpr ", %[_dest]" : [_dest] "=r" (dest) \ + : /* no inputs */ ) + +/* set_i_bit Operation Definition */ +#define set_i_bit() \ + do \ + { \ + unsigned short tpsr; \ + _spr_("psr", tpsr); \ + tpsr |= 0x0800; \ + _lpr_("psr",tpsr); \ + } while(0) + +/* set_i_bit Macro Definition */ +#define _enable_global_interrupt_ set_i_bit + +/* clear_i_bit Operation Definition */ +#define clear_i_bit() \ + do \ + { \ + unsigned short tpsr; \ + _spr_("psr", tpsr); \ + tpsr &= 0xf7ff; \ + _lpr_("psr",tpsr); \ + } while(0) + +/* clear_i_bit Macro Definition */ +#define _disbale_global_interrupt_ clear_i_bit + +#define _save_asm_(x) \ + __asm__ volatile (x ::: "memory","cc", \ + "r0","r1","r2","r3","r4","r5","r6","r7", \ + "r8","r9","r10","r11","r12","r13") + +#endif /* _ASM */ + + + diff --git a/lib/machine/cr16/sys/libh.h b/lib/machine/cr16/sys/libh.h new file mode 100644 index 0000000..75f7c79 --- /dev/null +++ b/lib/machine/cr16/sys/libh.h @@ -0,0 +1,51 @@ +/* libh.h -- CR16 default handlers + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _LIBH +#define _LIBH + +/* These are the first 16 entries of the default dispatch table as defined + in the CompactRISC architecture: + + Entry Function + ----- -------- + 0 NULL + 1 nmi + 2 NULL + 3 NULL + 4 NULL + 5 svc + 6 dvz + 7 flg + 8 bpt + 9 trc + 10 und + 11 NULL + 12 iad + 13 NULL + 14 dbg + 15 ise +*/ + +extern void (* const _dispatch_table[])(void); + +/* Function prototypes */ +void svc_handler(void); +void dvz_handler(void); +void flg_handler(void); +void und_handler(void); +void iad_handler(void); + +#endif /* _LIBH */ diff --git a/lib/machine/cr16/sys/syscall.h b/lib/machine/cr16/sys/syscall.h new file mode 100644 index 0000000..b34d404 --- /dev/null +++ b/lib/machine/cr16/sys/syscall.h @@ -0,0 +1,60 @@ +/* syscall.h -- CR16 virtual I/O and trap service codes + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _SYSCALL_H +#define _SYSCALL_H + +#include + +/* SVC codes to pass to the debugger */ + +/* Virtual I/O services */ +#define SVC_OPEN 0x401 +#define SVC_CLOSE 0x402 +#define SVC_READ 0x403 +#define SVC_WRITE 0x404 +#define SVC_LSEEK 0x405 +#define SVC_RENAME 0x406 +#define SVC_UNLINK 0x407 +#define SVC_GETENV 0x408 + +/* Time service */ +#define SVC_TIME 0x300 + +/* Start/end of program services */ +#define SVC_EOP 0x410 + +/* Trap services */ +#define SVC_SVC 0x505 +#define SVC_DVZ 0x506 +#define SVC_FLG 0x507 +#define SVC_UND 0x50a +#define SVC_IAD 0x50c + + +/* Places the code of the requested service in R0, then transfers control + to the debugger using the BPT exception. + It is called from the start routine, VIO functions and the trap + handlers. */ + +#define STRINGIFY(x) #x +#define HOST_SERVICE(service) \ + do { \ + __asm__("movd\t$" STRINGIFY(service) ",(r1,r0)"); \ + _excp_(svc); \ + } while (0) + +#endif /* _SYSCALL_H */ + diff --git a/lib/machine/cris/Makefile.inc b/lib/machine/cris/Makefile.inc new file mode 100644 index 0000000..f1864e3 --- /dev/null +++ b/lib/machine/cris/Makefile.inc @@ -0,0 +1,13 @@ +libc_a_SOURCES += %D%/setjmp.c %D%/memcpy.c %D%/memset.c %D%/memmove.c %D%/libcdtor.c + +# We also make a library with just the useful +# machine-but-not-system-specific functions, usable as an add-on +# by itself together with e.g. uclibc. +toollib_LIBRARIES += %D%/libic.a +%C%_libic_a_SOURCES = +%C%_libic_a_LIBADD = \ + %D%/libc_a-setjmp.o \ + %D%/libc_a-memcpy.o \ + %D%/libc_a-memset.o \ + %D%/libc_a-memmove.o \ + %D%/libc_a-libcdtor.o diff --git a/lib/machine/cris/include/pthread.h b/lib/machine/cris/include/pthread.h new file mode 100644 index 0000000..d872d04 --- /dev/null +++ b/lib/machine/cris/include/pthread.h @@ -0,0 +1,93 @@ +/* pthread.h dummy. + Copyright (C) 2001, 2004, 2005 Axis Communications AB. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Neither the name of Axis Communications nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS + COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* Simple fallback-include to enable thread-enabled exception support + for libgcc, but with posix-interface to a default-dummy, so a posix + library can optionally be linked in, which isn't possible if + gthr-single.h is used. No other use is supported; *DO NOT* think + this gives you a valid pthread interface to use in your applications. */ + +#ifndef _PTHREAD_FAKE +#define _PTHREAD_FAKE + +#ifdef __cplusplus +extern "C" { +# ifndef __THROW +# define __THROW throw () +# endif +#else +# ifndef __THROW +# define __THROW +# endif +#endif + +typedef int pthread_once_t; +typedef unsigned int pthread_key_t; + +/* This must be layout-compatible with the linuxthreads type. */ +typedef struct +{ + int a, b; + void *c; + int d; + struct { long int e; int f; } g; +} pthread_mutex_t; + +/* This give bits equal to the linuxthreads initializer. */ +#define PTHREAD_MUTEX_INITIALIZER \ + {0, 0, 0, 0, {0, 0}} + +#define PTHREAD_ONCE_INIT 0 + +/* This isn't the right prototype, but it let's us get away with not + defining a lot of datatypes. */ +extern int pthread_create (void) __THROW; + +extern int pthread_once (pthread_once_t *, void (*) (void)) __THROW; + +extern int pthread_key_create (pthread_key_t *, void (*) (void *)) __THROW; + +extern int pthread_setspecific (pthread_key_t, const void *) __THROW; + +extern void *pthread_getspecific (pthread_key_t) __THROW; + +extern int pthread_mutex_lock (pthread_mutex_t *) __THROW; + +extern int pthread_key_delete (pthread_key_t) __THROW; + +extern int pthread_mutex_trylock (pthread_mutex_t *) __THROW; + +extern int pthread_mutex_unlock (pthread_mutex_t *) __THROW; + +#ifdef __cplusplus +} +#endif + +#undef __THROW + +#endif /* not _PTHREAD_FAKE */ diff --git a/lib/machine/cris/libcdtor.c b/lib/machine/cris/libcdtor.c new file mode 100644 index 0000000..3273477 --- /dev/null +++ b/lib/machine/cris/libcdtor.c @@ -0,0 +1,91 @@ +/* Call ctors and dtors from elinux a.out shared libraries. + Copyright (C) 1999, 2000, 2003, 2004, 2005 Axis Communications. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Neither the name of Axis Communications nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS + COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +typedef void (*vfnp) (void); + +/* The guts of the _Libctors and _Libdtors is "optimized" away into + empty functions when the definition is visible as well. Simplest + solution is to emit the definitions as asm. We have no .previous + directive in a.out, so we rely on the fact that everything in this + file goes into the .text section. */ +__asm__ +( + ".text\n\t.global .$global.lib.ctors\n.$global.lib.ctors:\n\t.dword 0" +); +__asm__ +( + ".text\n\t.global .$global.lib.dtors\n.$global.lib.dtors:\n\t.dword 0" +); + +extern vfnp * const _Ctors asm(".$global.lib.ctors"); +extern vfnp * const _Dtors asm(".$global.lib.dtors"); + +/* We better provide weak empty ctor and dtor lists, since they are + not created if the main program does not have ctor/dtors. Because + it's otherwise not used, GCC trunk "Mon Jul 25 22:33:14 UTC 2005" + thinks it can remove defaultors, so we need to artificially mark it + as used. FIXME: Perhaps a GCC bug. */ + +static vfnp const defaultors[] __attribute__ ((__used__)) = {0, 0}; + +extern vfnp * __CTOR_LIST__ __attribute__ ((weak, alias ("defaultors"))); +extern vfnp * __DTOR_LIST__ __attribute__ ((weak, alias ("defaultors"))); + +void +_Libctors (void) +{ + const vfnp *firstor = _Ctors; + const vfnp *ctors; + + /* Have to find the last ctor; they will run in opposite order as in + the table. */ + if (firstor != 0 && *firstor != 0) + { + for (ctors = firstor; *ctors != 0; ctors++) + ; + + while (--ctors != firstor) + { + (**ctors)(); + } + + (**ctors)(); + } +} + +void +_Libdtors(void) +{ + const vfnp *dtors = _Dtors; + + if (dtors) + while (*dtors != 0) + { + (**dtors++) (); + } +} diff --git a/lib/machine/cris/memcpy.c b/lib/machine/cris/memcpy.c new file mode 100644 index 0000000..c314ede --- /dev/null +++ b/lib/machine/cris/memcpy.c @@ -0,0 +1,238 @@ +/* A memcpy for CRIS. + Copyright (C) 1994-2005 Axis Communications. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Neither the name of Axis Communications nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS + COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* FIXME: This file should really only be used for reference, as the + result is somewhat depending on gcc generating what we expect rather + than what we describe. An assembly file should be used instead. */ + +#include +#include "../../string/local.h" + +/* Break even between movem and move16 is really at 38.7 * 2, but + modulo 44, so up to the next multiple of 44, we use ordinary code. */ +#define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2) + +/* No name ambiguities in this file. */ +__asm__ (".syntax no_register_prefix"); + +void * +__inhibit_loop_to_libcall +memcpy(void *__restrict pdst, const void *__restrict psrc, size_t pn) +{ + /* Now we want the parameters put in special registers. + Make sure the compiler is able to make something useful of this. + As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop). + + If gcc was allright, it really would need no temporaries, and no + stack space to save stuff on. */ + + register void *return_dst __asm__ ("r10") = pdst; + register unsigned char *dst __asm__ ("r13") = pdst; + register unsigned const char *src __asm__ ("r11") = psrc; + register int n __asm__ ("r12") = pn; + + /* When src is aligned but not dst, this makes a few extra needless + cycles. I believe it would take as many to check that the + re-alignment was unnecessary. */ + if (((unsigned long) dst & 3) != 0 + /* Don't align if we wouldn't copy more than a few bytes; so we + don't have to check further for overflows. */ + && n >= 3) + { + if ((unsigned long) dst & 1) + { + n--; + *dst = *src; + src++; + dst++; + } + + if ((unsigned long) dst & 2) + { + n -= 2; + *(short *) dst = *(short *) src; + src += 2; + dst += 2; + } + } + + /* Decide which copying method to use. */ + if (n >= MEMCPY_BY_BLOCK_THRESHOLD) + { + /* It is not optimal to tell the compiler about clobbering any + registers; that will move the saving/restoring of those registers + to the function prologue/epilogue, and make non-movem sizes + suboptimal. */ + __asm__ volatile + ("\ + ;; GCC does promise correct register allocations, but let's \n\ + ;; make sure it keeps its promises. \n\ + .ifnc %0-%1-%2,$r13-$r11-$r12 \n\ + .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\" \n\ + .endif \n\ + \n\ + ;; Save the registers we'll use in the movem process \n\ + ;; on the stack. \n\ + subq 11*4,sp \n\ + movem r10,[sp] \n\ + \n\ + ;; Now we've got this: \n\ + ;; r11 - src \n\ + ;; r13 - dst \n\ + ;; r12 - n \n\ + \n\ + ;; Update n for the first loop. \n\ + subq 44,r12 \n\ +0: \n\ +" +#ifdef __arch_common_v10_v32 + /* Cater to branch offset difference between v32 and v10. We + assume the branch below has an 8-bit offset. */ +" setf\n" +#endif +" movem [r11+],r10 \n\ + subq 44,r12 \n\ + bge 0b \n\ + movem r10,[r13+] \n\ + \n\ + ;; Compensate for last loop underflowing n. \n\ + addq 44,r12 \n\ + \n\ + ;; Restore registers from stack. \n\ + movem [sp+],r10" + + /* Outputs. */ + : "=r" (dst), "=r" (src), "=r" (n) + + /* Inputs. */ + : "0" (dst), "1" (src), "2" (n)); + } + + while (n >= 16) + { + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + + n -= 16; + } + + switch (n) + { + case 0: + break; + + case 1: + *dst = *src; + break; + + case 2: + *(short *) dst = *(short *) src; + break; + + case 3: + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + + case 4: + *(long *) dst = *(long *) src; + break; + + case 5: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *dst = *src; + break; + + case 6: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; + break; + + case 7: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + + case 8: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; + break; + + case 9: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *dst = *src; + break; + + case 10: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; + break; + + case 11: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + + case 12: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; + break; + + case 13: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *dst = *src; + break; + + case 14: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; + break; + + case 15: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + } + + return return_dst; +} diff --git a/lib/machine/cris/memmove.c b/lib/machine/cris/memmove.c new file mode 100644 index 0000000..b022eaa --- /dev/null +++ b/lib/machine/cris/memmove.c @@ -0,0 +1,257 @@ +/* A memmove for CRIS. + Copyright (C) 2000-2005 Axis Communications. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Neither the name of Axis Communications nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS + COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* FIXME: This file should really only be used for reference, as the + result is somewhat depending on gcc generating what we expect rather + than what we describe. An assembly file should be used instead. + + Even worse, we base it on memcpy, on the assumption that overlapping + moves are rare, and we will do no worse than the generic memmove. */ + +#include + +/* Break even between movem and move16 is really at 38.7 * 2, but + modulo 44, so up to the next multiple of 44, we use ordinary code. */ +#define MEMMOVE_BY_BLOCK_THRESHOLD (44 * 2) + +/* No name ambiguities in this file. */ +__asm__ (".syntax no_register_prefix"); + +void * +memmove(void *pdst, const void *psrc, size_t pn) +{ + /* Now we want the parameters put in special registers. + Make sure the compiler is able to make something useful of this. + As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop). + + If gcc was allright, it really would need no temporaries, and no + stack space to save stuff on. */ + + register void *return_dst __asm__ ("r10") = pdst; + register unsigned char *dst __asm__ ("r13") = pdst; + register unsigned const char *src __asm__ ("r11") = psrc; + register int n __asm__ ("r12") = pn; + + /* Check and handle overlap. */ + if (src < dst && dst < src + n) + { + /* Destructive overlap. We could optimize this, but we don't (for + the moment). */ + src += n; + dst += n; + while (n--) + { + *--dst = *--src; + } + + return return_dst; + } + /* Whew, no overlap. Proceed as with memcpy. We could call it instead + of having a copy here. That would spoil some of the optimization, so + we take the trouble with having two copies. */ + + /* When src is aligned but not dst, this makes a few extra needless + cycles. I believe it would take as many to check that the + re-alignment was unnecessary. */ + if (((unsigned long) dst & 3) != 0 + /* Don't align if we wouldn't copy more than a few bytes; so we + don't have to check further for overflows. */ + && n >= 3) + { + if ((unsigned long) dst & 1) + { + n--; + *dst = *src; + src++; + dst++; + } + + if ((unsigned long) dst & 2) + { + n -= 2; + *(short *) dst = *(short *) src; + src += 2; + dst += 2; + } + } + + /* Decide which copying method to use. */ + if (n >= MEMMOVE_BY_BLOCK_THRESHOLD) + { + /* It is not optimal to tell the compiler about clobbering any + registers; that will move the saving/restoring of those registers + to the function prologue/epilogue, and make non-movem sizes + suboptimal. */ + __asm__ volatile + ("\ + ;; GCC does promise correct register allocations, but let's \n\ + ;; make sure it keeps its promises. \n\ + .ifnc %0-%1-%2,$r13-$r11-$r12 \n\ + .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\" \n\ + .endif \n\ + \n\ + ;; Save the registers we'll use in the movem process \n\ + ;; on the stack. \n\ + subq 11*4,sp \n\ + movem r10,[sp] \n\ + \n\ + ;; Now we've got this: \n\ + ;; r11 - src \n\ + ;; r13 - dst \n\ + ;; r12 - n \n\ + \n\ + ;; Update n for the first loop. \n\ + subq 44,r12 \n\ +0: \n\ +" +#ifdef __arch_common_v10_v32 + /* Cater to branch offset difference between v32 and v10. We + assume the branch below has an 8-bit offset. */ +" setf\n" +#endif +" movem [r11+],r10 \n\ + subq 44,r12 \n\ + bge 0b \n\ + movem r10,[r13+] \n\ + \n\ + ;; Compensate for last loop underflowing n. \n\ + addq 44,r12 \n\ + \n\ + ;; Restore registers from stack. \n\ + movem [sp+],r10" + + /* Outputs. */ + : "=r" (dst), "=r" (src), "=r" (n) + + /* Inputs. */ + : "0" (dst), "1" (src), "2" (n)); + } + + while (n >= 16) + { + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + + n -= 16; + } + + switch (n) + { + case 0: + break; + + case 1: + *dst = *src; + break; + + case 2: + *(short *) dst = *(short *) src; + break; + + case 3: + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + + case 4: + *(long *) dst = *(long *) src; + break; + + case 5: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *dst = *src; + break; + + case 6: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; + break; + + case 7: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + + case 8: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; + break; + + case 9: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *dst = *src; + break; + + case 10: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; + break; + + case 11: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + + case 12: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; + break; + + case 13: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *dst = *src; + break; + + case 14: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; + break; + + case 15: + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(long *) dst = *(long *) src; dst += 4; src += 4; + *(short *) dst = *(short *) src; dst += 2; src += 2; + *dst = *src; + break; + } + + return return_dst; +} diff --git a/lib/machine/cris/memset.c b/lib/machine/cris/memset.c new file mode 100644 index 0000000..c94ea9b --- /dev/null +++ b/lib/machine/cris/memset.c @@ -0,0 +1,259 @@ +/* A memset for CRIS. + Copyright (C) 1999-2005 Axis Communications. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Neither the name of Axis Communications nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS + COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* FIXME: This file should really only be used for reference, as the + result is somewhat depending on gcc generating what we expect rather + than what we describe. An assembly file should be used instead. */ + +/* Note the multiple occurrence of the expression "12*4", including the + asm. It is hard to get it into the asm in a good way. Thus better to + expose the problem everywhere: no macro. */ + +/* Assuming one cycle per dword written or read (ok, not really true; the + world is not ideal), and one cycle per instruction, then 43+3*(n/48-1) + <= 24+24*(n/48-1) so n >= 45.7; n >= 0.9; we win on the first full + 48-byte block to set. */ + +#define MEMSET_BY_BLOCK_THRESHOLD (1 * 48) + +/* No name ambiguities in this file. */ +__asm__ (".syntax no_register_prefix"); + +void *memset(void *pdst, int c, unsigned int plen) +{ + /* Now we want the parameters in special registers. Make sure the + compiler does something usable with this. */ + + register char *return_dst __asm__ ("r10") = pdst; + register int n __asm__ ("r12") = plen; + register int lc __asm__ ("r11") = c; + + /* Most apps use memset sanely. Memsetting about 3..4 bytes or less get + penalized here compared to the generic implementation. */ + + /* This is fragile performancewise at best. Check with newer GCC + releases, if they compile cascaded "x |= x << 8" to sane code. */ + __asm__("movu.b %0,r13 \n\ + lslq 8,r13 \n\ + move.b %0,r13 \n\ + move.d r13,%0 \n\ + lslq 16,r13 \n\ + or.d r13,%0" + : "=r" (lc) /* Inputs. */ + : "0" (lc) /* Outputs. */ + : "r13"); /* Trash. */ + + { + register char *dst __asm__ ("r13") = pdst; + + if (((unsigned long) pdst & 3) != 0 + /* Oops! n = 0 must be a valid call, regardless of alignment. */ + && n >= 3) + { + if ((unsigned long) dst & 1) + { + *dst = (char) lc; + n--; + dst++; + } + + if ((unsigned long) dst & 2) + { + *(short *) dst = lc; + n -= 2; + dst += 2; + } + } + + /* Decide which setting method to use. */ + if (n >= MEMSET_BY_BLOCK_THRESHOLD) + { + /* It is not optimal to tell the compiler about clobbering any + registers; that will move the saving/restoring of those registers + to the function prologue/epilogue, and make non-block sizes + suboptimal. */ + __asm__ volatile + ("\ + ;; GCC does promise correct register allocations, but let's \n\ + ;; make sure it keeps its promises. \n\ + .ifnc %0-%1-%4,$r13-$r12-$r11 \n\ + .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\" \n\ + .endif \n\ + \n\ + ;; Save the registers we'll clobber in the movem process \n\ + ;; on the stack. Don't mention them to gcc, it will only be \n\ + ;; upset. \n\ + subq 11*4,sp \n\ + movem r10,[sp] \n\ + \n\ + move.d r11,r0 \n\ + move.d r11,r1 \n\ + move.d r11,r2 \n\ + move.d r11,r3 \n\ + move.d r11,r4 \n\ + move.d r11,r5 \n\ + move.d r11,r6 \n\ + move.d r11,r7 \n\ + move.d r11,r8 \n\ + move.d r11,r9 \n\ + move.d r11,r10 \n\ + \n\ + ;; Now we've got this: \n\ + ;; r13 - dst \n\ + ;; r12 - n \n\ + \n\ + ;; Update n for the first loop \n\ + subq 12*4,r12 \n\ +0: \n\ +" +#ifdef __arch_common_v10_v32 + /* Cater to branch offset difference between v32 and v10. We + assume the branch below has an 8-bit offset. */ +" setf\n" +#endif +" subq 12*4,r12 \n\ + bge 0b \n\ + movem r11,[r13+] \n\ + \n\ + ;; Compensate for last loop underflowing n. \n\ + addq 12*4,r12 \n\ + \n\ + ;; Restore registers from stack. \n\ + movem [sp+],r10" + + /* Outputs. */ + : "=r" (dst), "=r" (n) + + /* Inputs. */ + : "0" (dst), "1" (n), "r" (lc)); + } + + /* An ad-hoc unroll, used for 4*12-1..16 bytes. */ + while (n >= 16) + { + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + n -= 16; + } + + switch (n) + { + case 0: + break; + + case 1: + *dst = (char) lc; + break; + + case 2: + *(short *) dst = (short) lc; + break; + + case 3: + *(short *) dst = (short) lc; dst += 2; + *dst = (char) lc; + break; + + case 4: + *(long *) dst = lc; + break; + + case 5: + *(long *) dst = lc; dst += 4; + *dst = (char) lc; + break; + + case 6: + *(long *) dst = lc; dst += 4; + *(short *) dst = (short) lc; + break; + + case 7: + *(long *) dst = lc; dst += 4; + *(short *) dst = (short) lc; dst += 2; + *dst = (char) lc; + break; + + case 8: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; + break; + + case 9: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *dst = (char) lc; + break; + + case 10: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(short *) dst = (short) lc; + break; + + case 11: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(short *) dst = (short) lc; dst += 2; + *dst = (char) lc; + break; + + case 12: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; + break; + + case 13: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *dst = (char) lc; + break; + + case 14: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(short *) dst = (short) lc; + break; + + case 15: + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(long *) dst = lc; dst += 4; + *(short *) dst = (short) lc; dst += 2; + *dst = (char) lc; + break; + } + } + + return return_dst; +} diff --git a/lib/machine/cris/setjmp.c b/lib/machine/cris/setjmp.c new file mode 100644 index 0000000..ca54494 --- /dev/null +++ b/lib/machine/cris/setjmp.c @@ -0,0 +1,212 @@ +/* A setjmp.c for CRIS + Copyright (C) 1993-2005 Axis Communications. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Neither the name of Axis Communications nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS + COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + +/* For benefit of CRIS v0..v3, we save and restore CCR to be able to + correctly handle DI/EI; otherwise there would be no reason to save it. + Note also that the "move x,ccr" does NOT affect + the DMA enable bits (E and D) of v0..v3. + + We do not save mof; it is call-clobbered. It also does not exist in + v0..v8; it should be safe to read or write to it there, but better not. + + jmp_buf[0] - PC + jmp_buf[1] - SP (R14) + jmp_buf[2] - R13 + jmp_buf[3] - R12 + jmp_buf[4] - R11 + jmp_buf[5] - R10 + jmp_buf[6] - R9 + jmp_buf[7] - R8 + jmp_buf[8] - R7 + jmp_buf[9] - R6 + jmp_buf[10] - R5 + jmp_buf[11] - R4 + jmp_buf[12] - R3 + jmp_buf[13] - R2 + jmp_buf[14] - R1 + jmp_buf[15] - R0 + jmp_buf[16] - SRP + jmp_buf[17] - CCR + */ + +#include + +int +setjmp (jmp_buf buf) +{ + int ret; +#if defined (__arch_common_v10_v32) || defined (__arch_v32) + /* No offsets in the compatibility mode. Also, movem saves in + different order on v10 than on v32, so we use single move + instructions instead, this not being a speed-prioritized operation. + And we don't save CCR or CCS; since long unuseful. */ + __asm__ __volatile__ + ("move.d %1,$r13 \n\ + move 0f,$mof \n\ + move $mof,[$r13+] \n\ + move.d $sp,[$r13+] \n\ + clear.d [$r13+] \n\ + move.d $r12,[$r13+] \n\ + move.d $r11,[$r13+] \n\ + move.d $r10,[$r13+] \n\ + moveq 1,$r9 \n\ + move.d $r9,[$r13+] \n\ + move.d $r8,[$r13+] \n\ + move.d $r7,[$r13+] \n\ + move.d $r6,[$r13+] \n\ + move.d $r5,[$r13+] \n\ + move.d $r4,[$r13+] \n\ + move.d $r3,[$r13+] \n\ + move.d $r2,[$r13+] \n\ + move.d $r1,[$r13+] \n\ + move.d $r0,[$r13+] \n\ + move $srp,[$r13+] \n\ + clear.d [$r13+] \n\ + clear.d $r9 \n\ +0: \n\ + move.d $r9,%0" + + /* Output. */ + : "=&r" (ret) + + /* Input. */ + : "r" (buf) + + /* Clobber. */ + : "r9", "r13", "memory"); +#else /* not __arch_common_v10_v32 or __arch_v32 */ +#ifdef __PIC__ + __asm__ __volatile__ + ("moveq 1,$r9 \n\ + movem $sp,[%1+1*4] \n\ + move.d $pc,$r9 \n\ + addq 0f-.,$r9 \n\ + move.d $r9,[%1] \n\ + move $srp,[%1+16*4] \n\ + move $ccr,[%1+17*4] \n\ + clear.d $r9 \n\ +0: \n\ + move.d $r9,%0" + + /* Output. */ + : "=&r" (ret) + + /* Input. */ + : "r" (buf) + + /* Clobber. */ + : "r9", "memory"); +#else /* not PIC */ + __asm__ __volatile__ + ("moveq 1,$r9 \n\ + movem $sp,[%1+1*4] \n\ + move.d 0f,$r9 \n\ + move.d $r9,[%1] \n\ + move $srp,[%1+16*4] \n\ + move $ccr,[%1+17*4] \n\ + clear.d $r9 \n\ +0: \n\ + move.d $r9,%0" + + /* Output. */ + : "=&r" (ret) + + /* Input. */ + : "r" (buf) + + /* Clobber. */ + : "r9"); +#endif /* not PIC */ +#endif /* not __arch_common_v10_v32 or __arch_v32 */ + return ret; +} + +void +longjmp(jmp_buf buf, int val) +{ +#if defined (__arch_common_v10_v32) || defined (__arch_v32) + __asm__ __volatile__ + ("cmpq 0,%1 \n\ + beq 0f \n\ + move.d %0,$r13 ; In delay-slot. \n\ + addq 6*4,$r13 \n\ + move.d %1,[$r13] \n\ + subq 6*4,$r13 \n\ +0:\n" +#ifdef __arch_common_v10_v32 + /* Cater to branch offset difference between v32 and v10. We + assume the branch above is 8-bit. */ +" setf\n" +#endif +" move [$r13+],$mof \n\ + move.d [$r13+],$sp \n\ + addq 4,$r13 \n\ + move.d [$r13+],$r12 \n\ + move.d [$r13+],$r11 \n\ + move.d [$r13+],$r10 \n\ + move.d [$r13+],$r9 \n\ + move.d [$r13+],$r8 \n\ + move.d [$r13+],$r7 \n\ + move.d [$r13+],$r6 \n\ + move.d [$r13+],$r5 \n\ + move.d [$r13+],$r4 \n\ + move.d [$r13+],$r3 \n\ + move.d [$r13+],$r2 \n\ + move.d [$r13+],$r1 \n\ + move.d [$r13+],$r0 \n\ + move [$r13+],$srp \n\ + move $mof,$r13 \n\ + jump $r13 \n\ + setf" + + /* No outputs. */ + : + + /* Inputs. */ + : "r" (buf), "r" (val) + : "r13", "memory"); + +#else /* not __arch_common_v10_v32 or __arch_v32 */ + __asm__ __volatile__ + ("move [%0+17*4],$ccr \n\ + move [%0+16*4],$srp \n\ + test.d %1 \n\ + beq 0f \n\ + nop \n\ + move.d %1,[%0+6*4] ; Offset for r9. \n\ +0: \n\ + movem [%0],$pc" + + /* No outputs. */ + : + + /* Inputs. */ + : "r" (buf), "r" (val) + : "memory"); +#endif /* not __arch_common_v10_v32 or __arch_v32 */ +} diff --git a/lib/machine/cris/sys/errno.h b/lib/machine/cris/sys/errno.h new file mode 100644 index 0000000..c8113ed --- /dev/null +++ b/lib/machine/cris/sys/errno.h @@ -0,0 +1,177 @@ +/* This file is to be kept in sync with newlib/libc/include/sys/errno.h + on which it is based, except values used or returned by syscalls must + be those of the Linux/CRIS kernel. */ + +/* errno is not a global variable, because that would make using it + non-reentrant. Instead, its address is returned by the function + __errno. */ + +#ifndef _SYS_ERRNO_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_ERRNO_H_ + +#include + +#ifndef _REENT_ONLY +#define errno (*__errno()) +extern int *__errno (void); +#endif + +/* Please don't use these variables directly. + Use strerror instead. */ +extern const char * const _sys_errlist[]; +extern int _sys_nerr; + +#define __errno_r(ptr) _REENT_ERRNO(ptr) + +/* Adjusted to the linux asm/errno.h */ +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ + +#define EDEADLOCK EDEADLK + +#define EBFONT 59 /* Bad font file format */ +/* This is only used internally in newlib; not returned by the kernel. + EBFONT seems the closest match for a "bad file format" error. */ +#define EFTYPE EBFONT /* Inappropriate file type or format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ + +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ +#define ECANCELED 125 /* Operation Canceled */ +#define ENOKEY 126 /* Required key not available */ +#define EKEYEXPIRED 127 /* Key has expired */ +#define EKEYREVOKED 128 /* Key has been revoked */ +#define EKEYREJECTED 129 /* Key was rejected by service */ + +#define EOWNERDEAD 130 /* Owner died */ +#define ENOTRECOVERABLE 131 /* State not recoverable */ + +/* Widely known to be a synonym in Linux. */ +#define ENOTSUP EOPNOTSUPP + +#define __ELASTERROR 2000 /* Users can add values starting here */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_ERRNO_H */ diff --git a/lib/machine/cris/sys/fcntl.h b/lib/machine/cris/sys/fcntl.h new file mode 100644 index 0000000..5ba8015 --- /dev/null +++ b/lib/machine/cris/sys/fcntl.h @@ -0,0 +1,163 @@ +/* This file is to be kept in sync with newlib/libc/include/sys/fcntl.h, + on which it is based, except values used or returned by syscalls must + be those of the Linux/CRIS kernel. */ + +#ifndef _FCNTL_ +#ifdef __cplusplus +extern "C" { +#endif +#define _FCNTL_ +#include <_ansi.h> +#define _FOPEN (-1) /* from sys/file.h, kernel use only */ +#define _FREAD 0x0001 /* read enabled */ +#define _FWRITE 0x0002 /* write enabled */ +#define _FNDELAY 0x0800 /* non blocking I/O (4.2 style) */ +#define _FAPPEND 0x0400 /* append (writes guaranteed at the end) */ +#define _FMARK 0x0010 /* internal; mark during gc() */ +#define _FDEFER 0x0020 /* internal; defer for next gc pass */ +#define _FASYNC 0x2000 /* signal pgrp when data ready */ +#define _FCREAT 0x0040 /* open with file create */ +#define _FTRUNC 0x0200 /* open with truncation */ +#define _FEXCL 0x0080 /* error on open if file exists */ +#define _FNBIO _FNONBLOCK /* non blocking I/O (sys5 style) */ +#define _FSYNC 0x1000 /* do all writes synchronously */ +#define _FNONBLOCK 0x0800 /* non blocking I/O (POSIX style) */ +#define _FNOCTTY 0x0100 /* don't assign a ctty on this open */ + +#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) + +/* + * Flag values for open(2) and fcntl(2) + * The kernel adds 1 to the open modes to turn it into some + * combination of FREAD and FWRITE. + */ +#define O_RDONLY 0 /* +1 == FREAD */ +#define O_WRONLY 1 /* +1 == FWRITE */ +#define O_RDWR 2 /* +1 == FREAD|FWRITE */ +#define O_APPEND _FAPPEND +#define O_CREAT _FCREAT +#define O_TRUNC _FTRUNC +#define O_EXCL _FEXCL +/* O_SYNC _FSYNC not posix, defined below */ +/* O_NDELAY _FNDELAY set in include/fcntl.h */ +/* O_NDELAY _FNBIO set in 5include/fcntl.h */ +#define O_NONBLOCK _FNONBLOCK +#define O_NOCTTY _FNOCTTY + +#ifndef _POSIX_SOURCE + +#define O_SYNC _FSYNC + +/* + * Flags that work for fcntl(fd, F_SETFL, FXXXX) + */ +#define FAPPEND _FAPPEND +#define FSYNC _FSYNC +#define FASYNC _FASYNC +#define FNBIO _FNBIO +#define FNONBIO _FNONBLOCK /* XXX fix to be NONBLOCK everywhere */ +#define FNDELAY _FNDELAY + +/* + * Flags that are disallowed for fcntl's (FCNTLCANT); + * used for opens, internal state, or locking. + */ +#define FREAD _FREAD +#define FWRITE _FWRITE +#define FMARK _FMARK +#define FDEFER _FDEFER +#define FSHLOCK _FSHLOCK +#define FEXLOCK _FEXLOCK + +/* + * The rest of the flags, used only for opens + */ +#define FOPEN _FOPEN +#define FCREAT _FCREAT +#define FTRUNC _FTRUNC +#define FEXCL _FEXCL +#define FNOCTTY _FNOCTTY + +#endif /* !_POSIX_SOURCE */ + +/* XXX close on exec request; must match UF_EXCLOSE in user.h */ +#define FD_CLOEXEC 1 /* posix */ + +/* fcntl(2) requests */ +#define F_DUPFD 0 /* dup */ +#define F_GETFD 1 /* get f_flags */ +#define F_SETFD 2 /* set f_flags */ +#define F_GETFL 3 /* more flags (cloexec) */ +#define F_SETFL 4 +#define F_GETLK 5 +#define F_SETLK 6 +#define F_SETLKW 7 + +#define F_SETOWN 8 /* for sockets. */ +#define F_GETOWN 9 /* for sockets. */ + +/* for F_[GET|SET]FL */ +#define FD_CLOEXEC 1 /* actually anything with low bit set goes */ + +/* for posix fcntl() and lockf() */ +#define F_RDLCK 0 +#define F_WRLCK 1 +#define F_UNLCK 2 + +/* for old implementation of bsd flock () */ +#define F_EXLCK 4 /* or 3 */ +#define F_SHLCK 8 /* or 4 */ + +/* operations for bsd flock(), also used by the kernel implementation */ +#define LOCK_SH 1 /* shared lock */ +#define LOCK_EX 2 /* exclusive lock */ +#define LOCK_NB 4 /* or'd with one of the above to prevent + blocking */ +#define LOCK_UN 8 /* remove lock */ + +/* file segment locking set data type - information passed to system by user */ +struct flock { + short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ + short l_whence; /* flag to choose starting offset */ + long l_start; /* relative offset, in bytes */ + long l_len; /* length, in bytes; 0 means lock to EOF */ + short l_pid; /* returned with F_GETLK */ + short l_xxx; /* reserved for future use */ +}; + +#ifndef _POSIX_SOURCE +/* extended file segment locking set data type */ +struct eflock { + short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ + short l_whence; /* flag to choose starting offset */ + long l_start; /* relative offset, in bytes */ + long l_len; /* length, in bytes; 0 means lock to EOF */ + short l_pid; /* returned with F_GETLK */ + short l_xxx; /* reserved for future use */ + long l_rpid; /* Remote process id wanting this lock */ + long l_rsys; /* Remote system id wanting this lock */ +}; +#endif /* !_POSIX_SOURCE */ + + +#include +#include /* sigh. for the mode bits for open/creat */ + +extern int open (const char *, int, ...); +extern int creat (const char *, mode_t); +extern int fcntl (int, int, ...); + +/* Provide _ prototypes for functions provided by some versions + of newlib. */ +#ifdef _LIBC +extern int _open (const char *, int, ...); +extern int _fcntl (int, int, ...); +#ifdef __LARGE64_FILES +extern int _open64 (const char *, int, ...); +#endif +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !_FCNTL_ */ diff --git a/lib/machine/cris/sys/signal.h b/lib/machine/cris/sys/signal.h new file mode 100644 index 0000000..9cb7ba5 --- /dev/null +++ b/lib/machine/cris/sys/signal.h @@ -0,0 +1,93 @@ +/* This file is to be kept in sync (well, reasonably so, it's quite + different) with newlib/libc/include/sys/signal.h on which it is + based, except values used or returned by syscalls must be those of + the Linux/CRIS kernel. */ + +/* sys/signal.h */ + +#ifndef _SYS_SIGNAL_H +#define _SYS_SIGNAL_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "_ansi.h" + +typedef unsigned long sigset_t; + +/* Adjusted to linux, has unused sa_restorer field and unsigned long + sa_flags; relatively unimportant though. */ +/* Type of a signal handler. */ +typedef void (*__sighandler_t)(int); + +/* The type used in newlib sources. */ +typedef __sighandler_t _sig_func_ptr; + +struct sigaction { + __sighandler_t sa_handler; + sigset_t sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +}; + +/* Adjusted to glibc; other values. */ +#define SA_NOCLDSTOP 1 /* only value supported now for sa_flags */ +#define SIG_SETMASK 2 /* set mask with sigprocmask() */ +#define SIG_BLOCK 0 /* set of signals to block */ +#define SIG_UNBLOCK 1 /* set of signals to, well, unblock */ + +/* These depend upon the type of sigset_t, which right now + is always a long.. They're in the POSIX namespace, but + are not ANSI. */ +#define sigaddset(what,sig) (*(what) |= (1<<(sig))) +#define sigemptyset(what) (*(what) = 0) + +int sigprocmask (int __how, const sigset_t *__a, sigset_t *__b); + +/* The first argument is really a pid_t, but that's just a typedef'd + int, so let's avoid requiring sys/types only for this declaration. */ +int kill (int, int); + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +#define SIGPWR 30 +#define NSIG 31 + +#ifdef __cplusplus +} +#endif +#ifndef _SIGNAL_H_ +/* Some applications take advantage of the fact that + * and are equivalent in glibc. Allow for that here. */ +#include +#endif +#endif /* _SYS_SIGNAL_H */ diff --git a/lib/machine/crx/Makefile.inc b/lib/machine/crx/Makefile.inc new file mode 100644 index 0000000..8075d20 --- /dev/null +++ b/lib/machine/crx/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/getenv.c diff --git a/lib/machine/crx/getenv.c b/lib/machine/crx/getenv.c new file mode 100644 index 0000000..75ef1cc --- /dev/null +++ b/lib/machine/crx/getenv.c @@ -0,0 +1,24 @@ +/* getenv.c -- Implementation of the getenv() routine + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +/* getenv() is implemented as a low-level function, + thus we only invoke here the system call. */ +char * getenv (const char *name) +{ + char *_getenv(const char *); + + return (_getenv (name)); +} + diff --git a/lib/machine/crx/setjmp.S b/lib/machine/crx/setjmp.S new file mode 100644 index 0000000..19b7d6c --- /dev/null +++ b/lib/machine/crx/setjmp.S @@ -0,0 +1,51 @@ + ############################################################################## + # setjmp.S -- CRX setjmp routine # + # # + # Copyright (c) 2004 National Semiconductor Corporation # + # # + # The authors hereby grant permission to use, copy, modify, distribute, # + # and license this software and its documentation for any purpose, provided # + # that existing copyright notices are retained in all copies and that this # + # notice is included verbatim in any distributions. No written agreement, # + # license, or royalty fee is required for any of the authorized uses. # + # Modifications to this software may be copyrighted by their authors # + # and need not follow the licensing terms described here, provided that # + # the new terms are clearly indicated on the first page of each file where # + # they apply. # + # # + # C library -- setjmp, longjmp # + # longjmp(a,v) # + # will generate a "return(v)" # + # from the last call to # + # setjmp(a) # + # by restoring r7-ra, sp, # + # and pc from 'a' # + # and doing a return. (Makes sure that longjmp never returns 0). # + ############################################################################## + + .text + .file "setjmp.s" + .align 4 + + .globl _setjmp + .align 4 +_setjmp: + #r2: .blkw + storm r2,{r7,r8,r9,r10,r11,r12,r13,r14} + stord sp,0(r2) + movd $0,r0 + jump ra + + .globl _longjmp +_longjmp: + #r2: .blkw # pointer save area + #r3: .blkw # ret vlaue + loadm r2, {r7,r8,r9,r10,r11,r12,r13,ra} + loadd 0(r2), sp + movd r3, r0 + cmpd $0, r3 + bne end1 + movd $1, r0 +end1: + jump ra + .align 4 diff --git a/lib/machine/crx/sys/asm.h b/lib/machine/crx/sys/asm.h new file mode 100644 index 0000000..a8226d1 --- /dev/null +++ b/lib/machine/crx/sys/asm.h @@ -0,0 +1,421 @@ +/* asm.h -- CRX architecture intrinsic functions + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _ASM +#define _ASM + +/* Note that immediate input values are not checked for validity. It is + the user's responsibility to use the intrinsic functions with appropriate + immediate values. */ + +/* Absolute Instructions */ +#define _absb_(src, dest) __asm__("absb %1, %0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _absw_(src, dest) __asm__("absw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _absd_(src, dest) __asm__("absd %1, %0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) + +/* Addition Instructions */ +#define _addb_(src, dest) __asm__("addb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _addub_(src, dest) __asm__("addub %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _addw_(src, dest) __asm__("addw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _adduw_(src, dest) __asm__("adduw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _addd_(src, dest) __asm__("addd %1, %0" : "=r" (dest) : \ + "ri" ((unsigned int)src), "0" (dest) : "cc") +#define _addud_(src, dest) __asm__("addud %1, %0" : "=r" (dest) : \ + "ri" ((unsigned int)src), "0" (dest) : "cc") +/* Add with Carry */ +#define _addcb_(src, dest) __asm__("addcb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _addcw_(src, dest) __asm__("addcw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _addcd_(src, dest) __asm__("addcd %1, %0" : "=r" (dest) : \ + "ri" ((unsigned int)src), "0" (dest) : "cc") +/* Q-format Add */ +#define _addqb_(src, dest) __asm__("addqb %1, %0" : "=r" (dest) : \ + "r" ((unsigned char)src), "0" (dest) : "cc") +#define _addqw_(src, dest) __asm__("addqw %1, %0" : "=r" (dest) : \ + "r" ((unsigned short)src), "0" (dest) : "cc") +#define _addqd_(src, dest) __asm__("addqd %1, %0" : "=r" (dest) : \ + "r" ((unsigned int)src), "0" (dest) : "cc") + +/* Bitwise Logical AND */ + +#define _andb_(src, dest) __asm__("andb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _andw_(src, dest) __asm__("andw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _andd_(src, dest) __asm__("andd %1,%0" : "=r" (dest) : \ + "ri" ((unsigned int)src) , "0" (dest)) + +/* bswap Instruction */ +#define _bswap_(src, dest) __asm__("bswap %1,%0" : "=r" (dest) : \ + "r" ((unsigned int)src) , "0" (dest)) +/* cbit (clear bit) Instructions */ +#define _cbitb_(pos, dest) __asm__("cbitb %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") +#define _cbitw_(pos, dest) __asm__("cbitw %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") +#define _cbitd_(pos, dest) __asm__("cbitd %1,%0" : "=r" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") + +/* Compare Instructions */ +#define _cmpb_(src1, src2) __asm__("cmpb %0,%1" : /* no output */ : \ + "ri" ((unsigned char)src1) , "r" (src2) : "cc") +#define _cmpw_(src1,src2) __asm__("cmpw %0,%1" : /* no output */ \ + : "ri" ((unsigned short)src1) , "r" (src2) : "cc") +#define _cmpd_(src1,src2) __asm__("cmpd %0,%1" : /* no output */ \ + : "ri" ((unsigned int)src1) , "r" (src2) : "cc") + +/* cntl Count Leading Ones Instructions */ +#define _cntl1b_(src, dest) __asm__("cntl1b %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _cntl1w_(src, dest) __asm__("cntl1w %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _cntl1d_(src, dest) __asm__("cntl1d %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) + +/* cntl Count Leading Zeros Instructions */ +#define _cntl0b_(src, dest) __asm__("cntl0b %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _cntl0w_(src, dest) __asm__("cntl0w %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _cntl0d_(src, dest) __asm__("cntl0d %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) + +/* cntl Count Leading Signs Instructions */ +#define _cntlsb_(src, dest) __asm__("cntlsb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _cntlsw_(src, dest) __asm__("cntlsw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _cntlsd_(src, dest) __asm__("cntlsd %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) + +/* Disable Inerrupts instructions */ +#define _di_() __asm__ volatile ("di\n" : : : "cc") +#define _disable_() __asm__ volatile ("di\n" : : : "cc") + +/* Enable Inerrupts instructions */ +#define _ei_() __asm__ volatile ("ei\n" : : : "cc") +#define _enable_() __asm__ volatile ("ei\n" : : : "cc") + +/* Enable Inerrupts instructions and Wait */ +#define _eiwait_() __asm__ volatile ("eiwait" : : : "cc") + +/* excp Instructions */ +#define _excp_(vector) __asm__ volatile ("excp " # vector) + +/* getpid Instruction */ +#define _getrfid_(dest) __asm__("getrfid %0" : "=r" (dest) : \ + /* No input */ : "cc") + +/* Load Instructions */ +#define _loadb_(base,dest) __asm__("loadb %1,%0" : "=r" (dest) : \ + "m" (base) , "0" (dest)) +#define _loadw_(base,dest) __asm__("loadw %1,%0" : "=r" (dest) : \ + "m" (base) , "0" (dest)) +#define _loadd_(base,dest) __asm__("loadd %1,%0" : "=r" (dest) : \ + "m" (base) , "0" (dest)) + +/* Load Multiple Instructions */ +#define _loadm_(src, mask) __asm__("loadm %0,%1" : /* No output */ : \ + "r" ((unsigned int)src) , "i" (mask)) +#define _loadmp_(src, mask) __asm__("loadmp %0,%1" : /* No output */ : \ + "r" ((unsigned int)src) , "i" (mask)) + +/* Multiply Accumulate Instrutions */ +#define _macsb_(hi, lo, src1, src2) __asm__("macsb %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((char)src1) , "r" (src2)) +#define _macsw_(hi, lo, src1, src2) __asm__("macsw %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((short)src1) , "r" (src2)) +#define _macsd_(hi, lo, src1, src2) __asm__("macsd %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((int)src1) , "r" (src2)) +#define _macub_(hi, lo, src1, src2) __asm__("macub %1,%0" \ + : =l (lo), =h (hi) \ + :"r" ((unsigned char)src1) , "r" (src2)) +#define _macuw_(hi, lo, src1, src2) __asm__("macuw %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((unsigned short)src1) , "r" (src2)) +#define _macud_(hi, lo, src1, src2) __asm__("macud %1,%0" \ + : =l (lo), =h (hi) \ + : "r" ((unsigned int)src1) , "r" (src2)) + +/* Q-Format Multiply Accumulate Instrutions */ +#define _macqb_(src1, src2) __asm__("macqb %1,%0" \ + : =l (lo), =h (hi) \ + :"r" ((char)src1) , "r" (src2)) +#define _macqw_(src1, src2) __asm__("macqw %1,%0" \ + : =l (lo), =h (hi) \ + :"r" ((short)src1) , "r" (src2)) +#define _macqd_(src1, src2) __asm__("macqd %1,%0" \ + : =l (lo), =h (hi) \ + :"r" ((int)src1) , "r" (src2)) + +/* Maximum Instructions */ +#define _maxsb_(src, dest) __asm__("maxsb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _maxsw_(src, dest) __asm__("maxsw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _maxsd_(src, dest) __asm__("maxsd %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) +#define _maxub_(src, dest) __asm__("maxub %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)src) , "0" (dest)) +#define _maxuw_(src, dest) __asm__("maxuw %1,%0" : "=r" (dest) : \ + "r" ((unsigned short)src) , "0" (dest)) +#define _maxud_(src, dest) __asm__("maxud %1,%0" : "=r" (dest) : \ + "r" ((unsigned int)src) , "0" (dest)) + +/* Minimum Instructions */ +#define _minsb_(src, dest) __asm__("minsb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _minsw_(src, dest) __asm__("minsw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _minsd_(src, dest) __asm__("minsd %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) +#define _minub_(src, dest) __asm__("minub %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)src) , "0" (dest)) +#define _minuw_(src, dest) __asm__("minuw %1,%0" : "=r" (dest) : \ + "r" ((unsigned short)src) , "0" (dest)) +#define _minud_(src, dest) __asm__("minud %1,%0" : "=r" (dest) : \ + "r" ((unsigned int)src) , "0" (dest)) + +/* Move Instructions */ +#define _movb_(src, dest) __asm__("movb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _movw_(src, dest) __asm__("movw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _movd_(src, dest) __asm__("movd %1,%0" : "=r" (dest) : \ + "ri" ((unsigned int)src) , "0" (dest)) + +/* mtpr and mfpr Insturctions */ +#define _mtpr_(procregd, src) __asm__("mtpr\t%0," procregd : /* no output */ : \ + "r" (src) : "cc") +#define _mfpr_(procregd, dest) __asm__("mfpr\t" procregd ",%0" : "=r" (dest) : \ + /* no input */ "0" (dest) : "cc") + +/* Multiplication Instructions */ +#define _mulsbw_(src, dest) __asm__("mulsbw %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _mulubw_(src, dest) __asm__("mulubw %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)src) , "0" (dest)) +#define _mulswd_(src, dest) __asm__("mulswd %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _muluwd_(src, dest) __asm__("muluwd %1,%0" : "=r" (dest) : \ + "r" ((unsigned short)src) , "0" (dest)) +#define _mulb_(src, dest) __asm__("mulb %1,%0" : "=r" (dest) : \ + "ri" ((char)src) , "0" (dest)) +#define _mulw_(src, dest) __asm__("mulw %1,%0" : "=r" (dest) : \ + "ri" ((short)src) , "0" (dest)) +#define _muld_(src, dest) __asm__("muld %1,%0" : "=r" (dest) : \ + "ri" ((int)src) , "0" (dest)) +#define _mullsd_(hi, lo, src1, src2) __asm__("mullsd %2,%3" \ + : =l (lo), =h (hi) \ + : "r" ((unsigned int)src1) , "r" ((unsigned int)src2)) +#define _mullud_(hi, lo, src1, src2) __asm__("mullud %2,%3" \ + : =l (lo), =h (hi) \ + : "r" ((int)src1) , "r" ((int)src2)) + +/* Q-Format Multiplication Instructions */ +#define _mulqb_(src, dest) __asm__("mulqb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _mulqw_(src, dest) __asm__("mulqw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) + +/* nop Instruction */ +#define _nop_() __asm__("nop") + +/* Negate Instructions */ +#define _negb_(src, dest) __asm__("negb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _negw_(src, dest) __asm__("negw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _negd_(src, dest) __asm__("negd %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) + +/* or Instructions */ +#define _orb_(src, dest) __asm__("orb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _orw_(src, dest) __asm__("orw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _ord_(src, dest) __asm__("ord %1,%0" : "=r" (dest) : \ + "ri" ((unsigned int)src) , "0" (dest)) + +/* Pop 1's Count Instructions */ +#define _popcntb_(src, dest) __asm__("popcntb %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _popcntw_(src, dest) __asm__("popcntw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _popcntd_(src, dest) __asm__("popcntd %1,%0" : "=r" (dest) : \ + "r" ((int)src) , "0" (dest)) + +/* Rotate and Mask Instructions */ +#define _ram_(shift, end, begin, dest, src) __asm__("ram %1, %2, %3, %0, %4" : \ + "=r" (dest) : \ + "i" ((unsigned char) shift), \ + "i" (end), "i" (begin), \ + "r" (src), "0" (dest)) +#define _rim_(shift, end, begin, dest, src) __asm__("rim %1, %2, %3, %0, %4" : \ + "=r" (dest) : \ + "i" ((unsigned char) shift), \ + "i" (end), "i" (begin), \ + "r" (src), "0" (dest)) + +/* retx Instruction */ +#define _retx_() __asm__("retx") + +/* Rotate Instructions */ +#define _rotb_(shift, dest) __asm__("rotb %1,%0" : "=r" (dest) : \ + "i" ((unsigned char)shift) , "0" (dest)) +#define _rotw_(shift, dest) __asm__("rotw %1,%0" : "=r" (dest) : \ + "i" ((unsigned char)shift) , "0" (dest)) +#define _rotd_(shift, dest) __asm__("rotd %1,%0" : "=r" (dest) : \ + "i" ((unsigned char)shift) , "0" (dest)) +#define _rotlb_(shift, dest) __asm__("rotlb %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)shift) , "0" (dest)) +#define _rotlw_(shift, dest) __asm__("rotlw %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)shift) , "0" (dest)) +#define _rotld_(shift, dest) __asm__("rotld %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)shift) , "0" (dest)) +#define _rotrb_(shift, dest) __asm__("rotrb %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)shift) , "0" (dest)) +#define _rotrw_(shift, dest) __asm__("rotrw %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)shift) , "0" (dest)) +#define _rotrd_(shift, dest) __asm__("rotrd %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)shift) , "0" (dest)) + +/* Set Bit Instructions */ +#define _sbitb_(pos,dest) __asm__("sbitb %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") +#define _sbitw_(pos,dest) __asm__("sbitw %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") +#define _sbitd_(pos,dest) __asm__("sbitd %1,%0" : "=mr" (dest) : \ + "i" ((unsigned char)pos) , "0" (dest) : "cc") + +/* setrfid Instruction */ +#define _setrfid_(src) __asm__("setrfid %0" : /* No output */ : \ + "r" (src) : "cc") + +/* Sign Extend Instructions */ +#define _sextbw_(src, dest) __asm__("sextbw %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest) ) +#define _sextbd_(src, dest) __asm__("sextbd %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest) ) +#define _sextwd_(src, dest) __asm__("sextwd %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest) ) + +/* Shift Left Logical Instructions */ +#define _sllb_(src, dest) __asm__("sllb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _sllw_(src, dest) __asm__("sllw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _slld_(src, dest) __asm__("slld %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +/* Shift Right Arithmetic Instructions */ +#define _srab_(src, dest) __asm__("srab %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _sraw_(src, dest) __asm__("sraw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _srad_(src, dest) __asm__("srad %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) + +/* Shift Right Logical Instructions */ +#define _srlb_(src, dest) __asm__("srlb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _srlw_(src, dest) __asm__("srlw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _srld_(src, dest) __asm__("srld %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) + +/* Store Instructions */ +#define _storb_(src,address) __asm__("storb %1,%0" : "=m" (address) : \ + "ri" ((unsigned int)src)) +#define _storw_(src,address) __asm__("storw %1,%0" : "=m" (address) : \ + "ri" ((unsigned int)src)) +#define _stord_(src,address) __asm__("stord %1,%0" : "=m" (address) : \ + "ri" ((unsigned int)src)) + +/* Store Multiple Instructions */ +#define _storm_(mask, src) __asm__("storm %1,%0" : /* No output here */ : \ + "i" (mask) , "r" ((unsigned int)src)) +#define _stormp_(mask, src) __asm__("stormp %1,%0" : /* No output here */ : \ + "i" (mask) , "r" ((unsigned int)src)) + +/* Substruct Instructions */ +#define _subb_(src, dest) __asm__("subb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _subw_(src, dest) __asm__("subw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _subd_(src, dest) __asm__("subd %1, %0" : "=r" (dest) : \ + "ri" ((unsigned int)src), "0" (dest) : "cc") + +/* Substruct with Carry Instructions */ +#define _subcb_(src, dest) __asm__("subcb %1, %0" : "=r" (dest) : \ + "ri" ((unsigned char)src), "0" (dest) : "cc") +#define _subcw_(src, dest) __asm__("subcw %1, %0" : "=r" (dest) : \ + "ri" ((unsigned short)src), "0" (dest) : "cc") +#define _subcd_(src, dest) __asm__("subcd %1, %0" : "=r" (dest) : \ + "ri" ((unsigned int)src), "0" (dest) : "cc") + +/* Q-Format Substruct Instructions */ +#define _subqb_(src, dest) __asm__("subqw %1,%0" : "=r" (dest) : \ + "r" ((char)src) , "0" (dest)) +#define _subqw_(src, dest) __asm__("subqw %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) +#define _subqd_(src, dest) __asm__("subqd %1,%0" : "=r" (dest) : \ + "r" ((short)src) , "0" (dest)) + +/* Test Bit Instructions */ +#define _tbitb_(pos,dest) __asm__("tbitb %0,%1" : /* No output */ : \ + "i" ((unsigned char)pos) , "rm" (dest) : "cc") +#define _tbitw_(pos,dest) __asm__("tbitw %0,%1" : /* No output */ : \ + "i" ((unsigned char)pos) , "rm" (dest) : "cc") +#define _tbitd_(pos,dest) __asm__("tbitd %0,%1" : /* No output */ : \ + "i" ((unsigned char)pos) , "rm" (dest) : "cc") + +/* wait Instruction*/ +#define _wait_() __asm__ volatile ("wait" : : : "cc") + +/* xor Instructions */ +#define _xorb_(src, dest) __asm__("xorb %1,%0" : "=r" (dest) : \ + "ri" ((unsigned char)src) , "0" (dest)) +#define _xorw_(src, dest) __asm__("xorw %1,%0" : "=r" (dest) : \ + "ri" ((unsigned short)src) , "0" (dest)) +#define _xord_(src, dest) __asm__("xord %1,%0" : "=r" (dest) : \ + "ri" ((unsigned int)src) , "0" (dest)) + +/* Zero Extend Instructions */ +#define _zextbw_(src, dest) __asm__("zextbw %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)src) , "0" (dest)) +#define _zextbd_(src, dest) __asm__("zextbd %1,%0" : "=r" (dest) : \ + "r" ((unsigned char)src) , "0" (dest)) +#define _zextwd_(src, dest) __asm__("zextwd %1,%0" : "=r" (dest) : \ + "r" ((unsigned short)src) , "0" (dest)) + +#define _save_asm_(x) \ + __asm__ volatile (x ::: "memory","cc", \ + "r0","r1","r2","r3","r4","r5","r6","r7", \ + "r8","r9","r10","r11","r12","r13") + +#endif /* _ASM */ + + diff --git a/lib/machine/crx/sys/libh.h b/lib/machine/crx/sys/libh.h new file mode 100644 index 0000000..a7ac54b --- /dev/null +++ b/lib/machine/crx/sys/libh.h @@ -0,0 +1,51 @@ +/* libh.h -- CRX default handlers + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _LIBH +#define _LIBH + +/* These are the first 16 entries of the default dispatch table as defined + in the CompactRISC architecture: + + Entry Function + ----- -------- + 0 NULL + 1 nmi + 2 NULL + 3 NULL + 4 NULL + 5 svc + 6 dvz + 7 flg + 8 bpt + 9 trc + 10 und + 11 NULL + 12 iad + 13 NULL + 14 dbg + 15 ise +*/ + +extern void (* const _dispatch_table[])(void); + +/* Function prototypes */ +void svc_handler(void); +void dvz_handler(void); +void flg_handler(void); +void und_handler(void); +void iad_handler(void); + +#endif /* _LIBH */ diff --git a/lib/machine/crx/sys/syscall.h b/lib/machine/crx/sys/syscall.h new file mode 100644 index 0000000..f775fbb --- /dev/null +++ b/lib/machine/crx/sys/syscall.h @@ -0,0 +1,61 @@ +/* syscall.h -- CRX virtual I/O and trap service codes + * + * Copyright (c) 2004 National Semiconductor Corporation + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#ifndef _SYSCALL_H +#define _SYSCALL_H + +#include + +/* SVC codes to pass to the debugger */ + +/* Virtual I/O services */ +#define SVC_OPEN 0x401 +#define SVC_CLOSE 0x402 +#define SVC_READ 0x403 +#define SVC_WRITE 0x404 +#define SVC_LSEEK 0x405 +#define SVC_RENAME 0x406 +#define SVC_UNLINK 0x407 +#define SVC_GETENV 0x408 + +/* Time service */ +#define SVC_TIME 0x300 + +/* Start/end of program services */ +#define SVC_EOP 0x410 + +/* Trap services */ +#define SVC_SVC 0x505 +#define SVC_DVZ 0x506 +#define SVC_FLG 0x507 +#define SVC_UND 0x50a +#define SVC_IAD 0x50c + + +/* Places the code of the requested service in R0, then transfers control + to the debugger using the BPT exception. + It is called from the start routine, VIO functions and the trap + handlers. */ + +#define STRINGIFY(x) #x +#define HOST_SERVICE(service) \ + do { \ + __asm__("movd\t$" STRINGIFY(service) ",r0"); \ + _excp_(bpt); \ + __asm__(".short\t0xFFFF"); \ + } while (0) + +#endif /* _SYSCALL_H */ + diff --git a/lib/machine/csky/Makefile.inc b/lib/machine/csky/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/csky/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/csky/setjmp.S b/lib/machine/csky/setjmp.S new file mode 100644 index 0000000..b936873 --- /dev/null +++ b/lib/machine/csky/setjmp.S @@ -0,0 +1,79 @@ +/* Copyright (c) 2020 C-SKY Microsystems All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + + .section .text + .align 3 + .globl setjmp + .type setjmp,@function + .globl longjmp + .type longjmp,@function + +setjmp: + +#if defined(__CK801__) + stw r4, (r0, 0) + stw r5, (r0, 4) + stw r6, (r0, 8) + stw r7, (r0, 12) + stw r8, (r0, 16) + stw r15, (r0, 20) + stw sp, (r0, 24) +#elif defined(__CK802__) + stm r4-r11, (r0) + stw r15, (r0, 32) + stw sp, (r0, 36) +#else + stm r4-r11, (r0) + stw r15, (r0, 32) + stw r16, (r0, 36) + stw r17, (r0, 40) + stw r26, (r0, 44) + stw r27, (r0, 48) + stw r28, (r0, 52) + stw r29, (r0, 56) + stw r30, (r0, 60) + stw r31, (r0, 64) + stw sp, (r0, 68) +#endif + movi r0, 0 + rts + +longjmp: +#if defined(__CK801__) + ldw r4, (r0, 0) + ldw r5, (r0, 4) + ldw r6, (r0, 8) + ldw r7, (r0, 12) + ldw r8, (r0, 16) + ldw r15, (r0, 20) + ldw sp, (r0, 24) +#elif defined(__CK802__) + ldm r4-r11, (r0) + ldw r15, (r0, 32) + ldw sp, (r0, 36) +#else + ldm r4-r11, (r0) + ldw r15, (r0, 32) + ldw r16, (r0, 36) + ldw r17, (r0, 40) + ldw r26, (r0, 44) + ldw r27, (r0, 48) + ldw r28, (r0, 52) + ldw r29, (r0, 56) + ldw r30, (r0, 60) + ldw r31, (r0, 64) + ldw sp, (r0, 68) +#endif + mov r0, r1 + cmpnei r1, 0 + bt 1f + movi r0, 1 +1: rts diff --git a/lib/machine/d10v/Makefile.inc b/lib/machine/d10v/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/d10v/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/d10v/setjmp.S b/lib/machine/d10v/setjmp.S new file mode 100644 index 0000000..22287dd --- /dev/null +++ b/lib/machine/d10v/setjmp.S @@ -0,0 +1,55 @@ +; setjmp/longjmp for D10V. The jmpbuf looks like this: +; +; Register jmpbuf offset +; R6 0x00 +; R7 0x02 +; R8 0x04 +; R9 0x06 +; R10 0x08 +; R11 0x0a +; R13 (return address) 0x0c +; R15 (SP) 0x0E + + .text + .globl setjmp + .type setjmp,@function + .stabs "setjmp.S",100,0,0,setjmp + .stabs "int:t(0,1)=r(0,1);-65536;65535;",128,0,0,0 + .stabs "setjmp:F(0,1)",36,0,1,setjmp + +setjmp: +; Address of jmpbuf is passed in R0. Save the appropriate registers. + st2w r6, @r0+ + st2w r8, @r0+ + st2w r10, @r0+ + st r13, @r0+ + st r15, @r0+ + +; Return 0 to caller + ldi r0, 0 + jmp r13 +.Lsetjmp: + .size setjmp,.Lsetjmp-setjmp + .stabs "",36,0,0,.Lsetjmp-setjmp + + .globl longjmp + .type longjmp,@function + .stabs "longjmp:F(0,1)",36,0,1,longjmp +longjmp: +; Address of jmpbuf is in R0. Restore the registers. + ld2w r6, @r0+ + ld2w r8, @r0+ + ld2w r10, @r0+ + ld r13, @r0+ + ld r15, @r0+ + +; Value to return to caller is in R1. If caller attemped to return 0, +; return 1 instead. + + mv r0, r1 + cmpeqi r0, 0 + exef0t || ldi r0,1 + jmp r13 +.Llongjmp: + .size longjmp,.Llongjmp-longjmp + .stabs "",36,0,0,.Llongjmp-longjmp diff --git a/lib/machine/d30v/Makefile.inc b/lib/machine/d30v/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/d30v/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/d30v/setjmp.S b/lib/machine/d30v/setjmp.S new file mode 100644 index 0000000..c0ca825 --- /dev/null +++ b/lib/machine/d30v/setjmp.S @@ -0,0 +1,106 @@ +; setjmp/longjmp for D30V. + + .text + .globl setjmp + .type setjmp,@function + .stabs "setjmp.S",100,0,0,setjmp + .stabs "int:t(0,1)=r(0,1);-2147483648;2147483647;",128,0,0,0 + .stabs "setjmp:F(0,1)",36,0,1,setjmp + +setjmp: +; Address of jmpbuf is passed in R2. Save the appropriate registers. + st2w r26, @(r2+,r0) + st2w r28, @(r2+,r0) + st2w r30, @(r2+,r0) + st2w r32, @(r2+,r0) + st2w r34, @(r2+,r0) + st2w r36, @(r2+,r0) + st2w r38, @(r2+,r0) + st2w r40, @(r2+,r0) + st2w r42, @(r2+,r0) + st2w r44, @(r2+,r0) + st2w r46, @(r2+,r0) + st2w r48, @(r2+,r0) + st2w r50, @(r2+,r0) + st2w r52, @(r2+,r0) + st2w r54, @(r2+,r0) + st2w r56, @(r2+,r0) + st2w r58, @(r2+,r0) + st2w r60, @(r2+,r0) + st2w r62, @(r2+,r0) + + mvfacc r4, a1, 16 + mvfacc r5, a1, 0 + st2w r4, @(r2+,r0) + + mvfsys r4, psw + mvfsys r5, rpt_c + st2w r4, @(r2+,r0) + + mvfsys r4, rpt_s + mvfsys r5, rpt_e + st2w r4, @(r2+,r0) + + mvfsys r4, mod_s + mvfsys r5, mod_e + st2w r4, @(r2+,r0) + +; Return 0 to caller + add r2, r0, r0 + jmp link +.Lsetjmp: + .size setjmp,.Lsetjmp-setjmp + .stabs "",36,0,0,.Lsetjmp-setjmp + + .globl longjmp + .type longjmp,@function + .stabs "longjmp:F(0,1)",36,0,1,longjmp +longjmp: +; Address of jmpbuf is in R2. Restore the registers. + ld2w r26, @(r2+,r0) + ld2w r28, @(r2+,r0) + ld2w r30, @(r2+,r0) + ld2w r32, @(r2+,r0) + ld2w r34, @(r2+,r0) + ld2w r36, @(r2+,r0) + ld2w r38, @(r2+,r0) + ld2w r40, @(r2+,r0) + ld2w r42, @(r2+,r0) + ld2w r44, @(r2+,r0) + ld2w r46, @(r2+,r0) + ld2w r48, @(r2+,r0) + ld2w r50, @(r2+,r0) + ld2w r52, @(r2+,r0) + ld2w r54, @(r2+,r0) + ld2w r56, @(r2+,r0) + ld2w r58, @(r2+,r0) + ld2w r60, @(r2+,r0) + ld2w r62, @(r2+,r0) + + ld2w r4, @(r2+,r0) + mvtacc a1, r4, r5 + + mvfsys r6, psw + ld2w r4, @(r2+,r0) /* psw, rpt_c */ + and r6, r6, 0xfcff /* set rp, md bits from setjmp, leave */ + and r4, r4, 0x0300 /* all other psw bits the same */ + or r4, r4, r6 + mvtsys psw, r4 + mvtsys rpt_c, r5 + + ld2w r4, @(r2+,r0) + mvtsys rpt_s, r4 + mvtsys rpt_e, r5 + + ld2w r4, @(r2+,r0) + mvtsys mod_s, r4 + mvtsys mod_e, r5 + +; Value to return to caller is in R3. If caller attemped to return 0, +; return 1 instead. + + cmpeq f0, r3, 0 || add r2, r3, r0 + jmp link || add/tx r2, r2, 1 +.Llongjmp: + .size longjmp,.Llongjmp-longjmp + .stabs "",36,0,0,.Llongjmp-longjmp diff --git a/lib/machine/epiphany/Makefile.inc b/lib/machine/epiphany/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/epiphany/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/epiphany/setjmp.S b/lib/machine/epiphany/setjmp.S new file mode 100644 index 0000000..b981ee5 --- /dev/null +++ b/lib/machine/epiphany/setjmp.S @@ -0,0 +1,69 @@ +/* setjmp and longjmp + + Copyright (c) 2011, Adapteva, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Adapteva nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ + + .file "setjmp.S" + .section .text + .align 4 + .global _setjmp + .type _setjmp, %function +_setjmp: + strd lr,[r0] + strd r4,[r0,1] + strd r6,[r0,2] + strd r8,[r0,3] + strd r10,[r0,4] + strd r32,[r0,5] + strd r34,[r0,6] + strd r36,[r0,7] + strd r38,[r0,8] + str sp,[r0,18] + mov r0,#0 + rts + .size _setjmp, .-_setjmp + .global setjmp + .set setjmp, _setjmp + + .global _longjmp +_longjmp: + ldrd lr,[r0] ; return address / r15 + ldrd r4,[r0,1] + ldrd r6,[r0,2] + ldrd r8,[r0,3] + ldrd r10,[r0,4] + ldrd r32,[r0,5] + ldrd r34,[r0,6] + ldrd r36,[r0,7] + ldrd r38,[r0,8] + ldr sp,[r0,18] + sub r1,r1,0 + mov r0,#1 + movne r0,r1 + jr lr + .size _longjmp, .-_longjmp + .global longjmp + .set longjmp, _longjmp diff --git a/lib/machine/fr30/Makefile.inc b/lib/machine/fr30/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/fr30/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/fr30/setjmp.S b/lib/machine/fr30/setjmp.S new file mode 100644 index 0000000..98ac44d --- /dev/null +++ b/lib/machine/fr30/setjmp.S @@ -0,0 +1,64 @@ +# setjmp/longjmp for FR30. The jmpbuf looks like this: +# +# Register jmpbuf offset +# R8 0x00 +# R9 0x04 +# R10 0x08 +# R11 0x0c +# R12 0x10 +# R13 0x14 +# R14 (FP) 0x18 +# R15 (SP) 0x1c +# RP 0x20 + +.macro save reg + st \reg,@r4 + add #4,r4 +.endm + +.macro restore reg + ld @r4,\reg + add #4,r4 +.endm + + + .text + .global setjmp +setjmp: + save r8 + save r9 + save r10 + save r11 + save r12 + save r13 + save r14 + save r15 + mov RP,r5 + st r5,@r4 + +# Return 0 to caller. + ldi:8 #0,r4 + ret + + .global longjmp +longjmp: + restore r8 + restore r9 + restore r10 + restore r11 + restore r12 + restore r13 + restore r14 + restore r15 + ld @r4,r4 + mov r4,RP + +# If caller attempted to return 0, return 1 instead. + + mov r5,r4 + or r4,r4 + bne 1f + ldi:8 #1,r4 + 1: + ret + \ No newline at end of file diff --git a/lib/machine/frv/Makefile.inc b/lib/machine/frv/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/frv/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/frv/setjmp.S b/lib/machine/frv/setjmp.S new file mode 100644 index 0000000..a1dd159 --- /dev/null +++ b/lib/machine/frv/setjmp.S @@ -0,0 +1,126 @@ +# setjmp/longjmp for Frv. The jmpbuf looks like this: +# +# Register jmpbuf offset +# R16-R31 0x0-0x03c +# R48-R63 0x40-0x7c +# FR16-FR31 0x80-0xbc +# FR48-FR63 0xc0-0xfc +# LR 0x100 +# SP 0x104 +# FP 0x108 +# +# R8 contains the pointer to jmpbuf + +#include + + .text + .global EXT(setjmp) + .type EXT(setjmp),@function +EXT(setjmp): + stdi gr16, @(gr8,0) + stdi gr18, @(gr8,8) + stdi gr20, @(gr8,16) + stdi gr22, @(gr8,24) + stdi gr24, @(gr8,32) + stdi gr26, @(gr8,40) + stdi gr28, @(gr8,48) + stdi gr30, @(gr8,56) +#if __FRV_GPR__ != 32 + stdi gr48, @(gr8,64) + stdi gr50, @(gr8,72) + stdi gr52, @(gr8,80) + stdi gr54, @(gr8,88) + stdi gr56, @(gr8,96) + stdi gr58, @(gr8,104) + stdi gr60, @(gr8,112) + stdi gr62, @(gr8,120) +#endif + +#if __FRV_FPR__ != 0 + stdfi fr16, @(gr8,128) + stdfi fr18, @(gr8,136) + stdfi fr20, @(gr8,144) + stdfi fr22, @(gr8,152) + stdfi fr24, @(gr8,160) + stdfi fr26, @(gr8,168) + stdfi fr28, @(gr8,176) + stdfi fr30, @(gr8,184) +#if __FRV_FPR__ != 32 + stdfi fr48, @(gr8,192) + stdfi fr50, @(gr8,200) + stdfi fr52, @(gr8,208) + stdfi fr54, @(gr8,216) + stdfi fr56, @(gr8,224) + stdfi fr58, @(gr8,232) + stdfi fr60, @(gr8,240) + stdfi fr62, @(gr8,248) +#endif +#endif + + movsg lr, gr4 + sti gr4, @(gr8,256) + sti sp, @(gr8,260) + sti fp, @(gr8,264) + + mov gr0,gr8 + ret +.Lend1: + .size EXT(setjmp),.Lend1-EXT(setjmp) + + .global EXT(longjmp) + .type EXT(longjmp),@function +EXT(longjmp): + lddi @(gr8,0), gr16 + lddi @(gr8,8), gr18 + lddi @(gr8,16), gr20 + lddi @(gr8,24), gr22 + lddi @(gr8,32), gr24 + lddi @(gr8,40), gr26 + lddi @(gr8,48), gr28 + lddi @(gr8,56), gr30 +#if __FRV_GPR__ != 32 + lddi @(gr8,64), gr48 + lddi @(gr8,72), gr50 + lddi @(gr8,80), gr52 + lddi @(gr8,88), gr54 + lddi @(gr8,96), gr56 + lddi @(gr8,104), gr58 + lddi @(gr8,112), gr60 + lddi @(gr8,120), gr62 +#endif + +#if __FRV_FPR__ != 0 + lddfi @(gr8,128), fr16 + lddfi @(gr8,136), fr18 + lddfi @(gr8,144), fr20 + lddfi @(gr8,152), fr22 + lddfi @(gr8,160), fr24 + lddfi @(gr8,168), fr26 + lddfi @(gr8,176), fr28 + lddfi @(gr8,184), fr30 +#if __FRV_FPR__ != 32 + lddfi @(gr8,192), fr48 + lddfi @(gr8,200), fr50 + lddfi @(gr8,208), fr52 + lddfi @(gr8,216), fr54 + lddfi @(gr8,224), fr56 + lddfi @(gr8,232), fr58 + lddfi @(gr8,240), fr60 + lddfi @(gr8,248), fr62 +#endif +#endif + + ldi @(gr8,256), gr4 + movgs gr4,lr + + ldi @(gr8,260), sp + ldi @(gr8,264), fp + +# Value to return is in r9. If zero, return 1 + cmp gr9, gr0, icc0 + setlos #1, gr8 + ckne icc0, cc4 + cmov gr9, gr8, cc4, 1 + ret +.Lend2: + .size EXT(longjmp),.Lend2-EXT(longjmp) diff --git a/lib/machine/ft32/Makefile.inc b/lib/machine/ft32/Makefile.inc new file mode 100644 index 0000000..3638501 --- /dev/null +++ b/lib/machine/ft32/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/strlen.S %D%/memcpy.S %D%/strcmp.S %D%/memset.S %D%/strcpy.S diff --git a/lib/machine/ft32/memcpy.S b/lib/machine/ft32/memcpy.S new file mode 100644 index 0000000..b29179b --- /dev/null +++ b/lib/machine/ft32/memcpy.S @@ -0,0 +1,32 @@ +/* A memcpy.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + + .text + .global memcpy + .type memcpy,@function +memcpy: + ldk $r3,32764 +1: + cmp $r2,$r3 + jmpc lte,2f + memcpy.b $r0,$r1,$r3 + add $r0,$r0,$r3 + add $r1,$r1,$r3 + sub $r2,$r2,$r3 + jmp 1b +2: + memcpy.b $r0,$r1,$r2 + return +.Lend2: + .size memcpy,.Lend2-memcpy + diff --git a/lib/machine/ft32/memset.S b/lib/machine/ft32/memset.S new file mode 100644 index 0000000..60e7345 --- /dev/null +++ b/lib/machine/ft32/memset.S @@ -0,0 +1,30 @@ +/* A memset.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + + .text + .global memset + .type memset,@function +memset: + ldk $r3,32764 +1: + cmp $r2,$r3 + jmpc lte,2f + memset.b $r0,$r1,$r3 + add $r0,$r0,$r3 + sub $r2,$r2,$r3 + jmp 1b +2: + memset.b $r0,$r1,$r2 + return +.Lend2: + .size memset,.Lend2-memset diff --git a/lib/machine/ft32/setjmp.S b/lib/machine/ft32/setjmp.S new file mode 100644 index 0000000..30bfc6d --- /dev/null +++ b/lib/machine/ft32/setjmp.S @@ -0,0 +1,94 @@ +/* A setjmp.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + +# setjmp/longjmp for FT32. +# Total jumpbuf size is 108 bytes, or 27 words. +# + + .text + .global setjmp + .type setjmp,@function +setjmp: + pop.l $r5 # return address in $r5 + sti.l $r0,0,$r5 + sti.l $r0,4,$r6 + sti.l $r0,8,$r7 + sti.l $r0,12,$r8 + sti.l $r0,16,$r9 + sti.l $r0,20,$r10 + sti.l $r0,24,$r11 + sti.l $r0,28,$r12 + sti.l $r0,32,$r13 + sti.l $r0,36,$r14 + sti.l $r0,40,$r15 + sti.l $r0,44,$r16 + sti.l $r0,48,$r17 + sti.l $r0,52,$r18 + sti.l $r0,56,$r19 + sti.l $r0,60,$r20 + sti.l $r0,64,$r21 + sti.l $r0,68,$r22 + sti.l $r0,72,$r23 + sti.l $r0,76,$r24 + sti.l $r0,80,$r25 + sti.l $r0,84,$r26 + sti.l $r0,88,$r27 + sti.l $r0,92,$r28 + sti.l $r0,96,$r29 + sti.l $r0,100,$r30 + sti.l $r0,104,$r31 + ldk.l $r0,0 + jmpi $r5 + +.Lend1: + .size setjmp,.Lend1-setjmp + + .global longjmp + .type longjmp,@function +longjmp: + cmp.l $r1,0 + jmpc nz,.nonz + ldk.l $r1,1 +.nonz: + ldi.l $r5,$r0,0 + ldi.l $r6,$r0,4 + ldi.l $r7,$r0,8 + ldi.l $r8,$r0,12 + ldi.l $r9,$r0,16 + ldi.l $r10,$r0,20 + ldi.l $r11,$r0,24 + ldi.l $r12,$r0,28 + ldi.l $r13,$r0,32 + ldi.l $r14,$r0,36 + ldi.l $r15,$r0,40 + ldi.l $r16,$r0,44 + ldi.l $r17,$r0,48 + ldi.l $r18,$r0,52 + ldi.l $r19,$r0,56 + ldi.l $r20,$r0,60 + ldi.l $r21,$r0,64 + ldi.l $r22,$r0,68 + ldi.l $r23,$r0,72 + ldi.l $r24,$r0,76 + ldi.l $r25,$r0,80 + ldi.l $r26,$r0,84 + ldi.l $r27,$r0,88 + ldi.l $r28,$r0,92 + ldi.l $r29,$r0,96 + ldi.l $r30,$r0,100 + ldi.l $r31,$r0,104 + move.l $r0,$r1 + jmpi $r5 + +.Lend2: + .size longjmp,.Lend2-longjmp diff --git a/lib/machine/ft32/stpcmp.S b/lib/machine/ft32/stpcmp.S new file mode 100644 index 0000000..9fc0299 --- /dev/null +++ b/lib/machine/ft32/stpcmp.S @@ -0,0 +1,22 @@ +/* A strlen.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + + .text + .global strlen + .type strlen,@function +strlen: + strlen.b $r0,$r0 + return +.Lend2: + .size strlen,.Lend2-strlen + diff --git a/lib/machine/ft32/strcmp.S b/lib/machine/ft32/strcmp.S new file mode 100644 index 0000000..5e74734 --- /dev/null +++ b/lib/machine/ft32/strcmp.S @@ -0,0 +1,22 @@ +/* A strcmp.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + + .text + .global strcmp + .type strcmp,@function +strcmp: + strcmp.b $r0,$r0,$r1 + return +.Lend2: + .size strcmp,.Lend2-strcmp + diff --git a/lib/machine/ft32/strcpy.S b/lib/machine/ft32/strcpy.S new file mode 100644 index 0000000..fd6ef1d --- /dev/null +++ b/lib/machine/ft32/strcpy.S @@ -0,0 +1,23 @@ +/* A strcpy.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + + .text + .global strcpy + .type strcpy,@function +strcpy: + move.l $r5,$r0 + stpcpy.b $r5,$r1 + return +.Lend2: + .size strcpy,.Lend2-strcpy + diff --git a/lib/machine/ft32/strlen.S b/lib/machine/ft32/strlen.S new file mode 100644 index 0000000..9fc0299 --- /dev/null +++ b/lib/machine/ft32/strlen.S @@ -0,0 +1,22 @@ +/* A strlen.c for FT32 + Copyright (C) 2014 FTDI (support@ftdichip.com) + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + + .text + .global strlen + .type strlen,@function +strlen: + strlen.b $r0,$r0 + return +.Lend2: + .size strlen,.Lend2-strlen + diff --git a/lib/machine/h8300/Makefile.inc b/lib/machine/h8300/Makefile.inc new file mode 100644 index 0000000..7335d98 --- /dev/null +++ b/lib/machine/h8300/Makefile.inc @@ -0,0 +1,3 @@ +libc_a_SOURCES += \ + %D%/reg_memcpy.S %D%/reg_memset.S %D%/strcmp.S %D%/memcpy.S %D%/memset.S \ + %D%/setjmp.S %D%/h8sx_strcpy.S diff --git a/lib/machine/h8300/defines.h b/lib/machine/h8300/defines.h new file mode 100644 index 0000000..7ec12c4 --- /dev/null +++ b/lib/machine/h8300/defines.h @@ -0,0 +1,138 @@ + +#define A0 r0 +#define A0L r0l +#define A0H r0h + +#define A1 r1 +#define A1L r1l +#define A1H r1h + +#define A2 r2 +#define A2L r2l +#define A2H r2h + +#define A3 r3 +#define A3L r3l +#define A3H r3h + +#define S0 r4 +#define S0L r4l +#define S0H r4h + +#define S1 r5 +#define S1L r5l +#define S1H r5h + +#define S2 r6 +#define S2L r6l +#define S2H r6h + +#ifdef __H8300__ + +#define MOVP mov.w /* pointers are 16 bits */ +#define ADDP add.w +#define CMPP cmp.w +#define PUSHP push +#define POPP pop + +#define A0P r0 +#define A1P r1 +#define A2P r2 +#define A3P r3 +#define S0P r4 +#define S1P r5 +#define S2P r6 + +#endif /* __H8300__ */ + +#ifdef __H8300H__ + +#ifdef __NORMAL_MODE__ + +#define MOVP mov.w /* pointers are 16 bits */ +#define ADDP add.w +#define CMPP cmp.w +#define PUSHP push +#define POPP pop + +#define A0P r0 +#define A1P r1 +#define A2P r2 +#define A3P r3 +#define S0P r4 +#define S1P r5 +#define S2P r6 + +#else /* !__NORMAL_MODE__ */ + +#define MOVP mov.l /* pointers are 32 bits */ +#define ADDP add.l +#define CMPP cmp.l +#define PUSHP push.l +#define POPP pop.l + +#define A0P er0 +#define A1P er1 +#define A2P er2 +#define A3P er3 +#define S0P er4 +#define S1P er5 +#define S2P er6 + +#endif /* !__NORMAL_MODE__ */ + +#define A0E e0 +#define A1E e1 +#define A2E e2 +#define A3E e3 + +#endif /* __H8300H__ */ + +#if defined (__H8300S__) || defined (__H8300SX__) + +#ifdef __NORMAL_MODE__ + +#define MOVP mov.w /* pointers are 16 bits */ +#define ADDP add.w +#define CMPP cmp.w +#define PUSHP push +#define POPP pop + +#define A0P r0 +#define A1P r1 +#define A2P r2 +#define A3P r3 +#define S0P r4 +#define S1P r5 +#define S2P r6 + +#else /* !__NORMAL_MODE__ */ + +#define MOVP mov.l /* pointers are 32 bits */ +#define ADDP add.l +#define CMPP cmp.l +#define PUSHP push.l +#define POPP pop.l + +#define A0P er0 +#define A1P er1 +#define A2P er2 +#define A3P er3 +#define S0P er4 +#define S1P er5 +#define S2P er6 + +#endif /* !__NORMAL_MODE__ */ + +#define A0E e0 +#define A1E e1 +#define A2E e2 +#define A3E e3 + + +#ifdef __NORMAL_MODE__ +#define LEN(X) X +#else +#define LEN(X) e##X +#endif +#endif /* __H8300S__ */ diff --git a/lib/machine/h8300/h8sx_strcpy.S b/lib/machine/h8300/h8sx_strcpy.S new file mode 100644 index 0000000..db84771 --- /dev/null +++ b/lib/machine/h8300/h8sx_strcpy.S @@ -0,0 +1,14 @@ +; This file exists to provide a movsd implementation of strcpy(). +; Continue to use the generic version for targets other than h8sx. +#ifdef __H8300SX__ +#include "setarch.h" + + .global _strcpy +_strcpy: + stm.l er4-er6,@-er7 + mov.l er0,er6 + mov.l er1,er5 +1: movsd 2f + bra 1b +2: rts/l er4-er6 +#endif diff --git a/lib/machine/h8300/memcpy.S b/lib/machine/h8300/memcpy.S new file mode 100644 index 0000000..6af5a99 --- /dev/null +++ b/lib/machine/h8300/memcpy.S @@ -0,0 +1,149 @@ +#include "setarch.h" + +#include "defines.h" + +#ifdef __H8300SX__ + + .global _memcpy +_memcpy: + stm.l er4-er6,@-er7 + + ; Set up source and destination pointers for movmd. + mov.l er0,er6 + mov.l er1,er5 + + ; See whether the copy is long enough to use the movmd.l code. + ; Although the code can handle anything longer than 6 bytes, + ; it can be more expensive than movmd.b for small moves. + ; It's better to use a higher threshold to account for this. + ; + ; Note that the exact overhead of the movmd.l checks depends on + ; the alignments of the length and pointers. They are faster when + ; er0 & 3 == er1 & 3 == er2 & 3, faster still when these values + ; are 0. This threshold is a compromise between the various cases. + cmp #16,LEN(r2) + blo simple + + ; movmd.l only works for even addresses. If one of the addresses + ; is odd and the other is not, fall back on a simple move. + bld #0,r5l + bxor #0,r6l + bcs simple + + ; Make the addresses even. + bld #0,r5l + bcc word_aligned + mov.b @er5+,@er6+ + sub #1,LEN(r2) + +word_aligned: + ; See if copying one word would make the first operand longword + ; aligned. Although this is only really worthwhile if it aligns + ; the second operand as well, it's no worse if doesn't, so it + ; hardly seems worth the overhead of a "band" check. + bld #1,r6l + bcc fast_copy + mov.w @er5+,@er6+ + sub #2,LEN(r2) + +fast_copy: + ; Set (e)r4 to the number of longwords to copy. + mov LEN(r2),LEN(r4) + shlr #2,LEN(r4) + +#ifdef __NORMAL_MODE__ + ; 16-bit pointers and size_ts: one movmd.l is enough. This code + ; is never reached with r4 == 0. + movmd.l + and.w #3,r2 +simple: + mov.w r2,r4 + beq quit + movmd.b +quit: + rts/l er4-er6 +#else + ; Skip the first iteration if the number of longwords is divisible + ; by 0x10000. + mov.w r4,r4 + beq fast_loop_next + + ; This loop copies r4 (!= 0) longwords the first time round and 65536 + ; longwords on each iteration after that. +fast_loop: + movmd.l +fast_loop_next: + sub.w #1,e4 + bhs fast_loop + + ; Mop up any left-over bytes. We could just fall through to the + ; simple code after the "and" but the version below is quicker + ; and only takes 10 more bytes. + and.w #3,r2 + beq quit + mov.w r2,r4 + movmd.b +quit: + rts/l er4-er6 + +simple: + ; Simple bytewise copy. We need to handle all lengths, including zero. + mov.w r2,r4 + beq simple_loop_next +simple_loop: + movmd.b +simple_loop_next: + sub.w #1,e2 + bhs simple_loop + rts/l er4-er6 +#endif + +#else + + .global _memcpy +_memcpy: +; MOVP @(2/4,r7),A0P ; dst +; MOVP @(4/8,r7),A1P ; src +; MOVP @(6/12,r7),A2P ; len + + MOVP A0P,A3P ; keep copy of final dst + ADDP A2P,A0P ; point to end of dst + CMPP A0P,A3P ; see if anything to do + beq quit + + ADDP A2P,A1P ; point to end of src + + ; lets see if we can do this in words + or A0L,A2L ; or in the dst address + or A3L,A2L ; or the length + or A1L,A2L ; or the src address + btst #0,A2L ; see if the lsb is zero + bne byteloop + +wordloop: +#ifdef __NORMAL_MODE__ + sub #2,A1P +#else + subs #2,A1P ; point to word +#endif + mov.w @A1P,A2 ; get word + mov.w A2,@-A0P ; save word + CMPP A0P,A3P ; at the front again ? + bne wordloop + rts + +byteloop: +#ifdef __NORMAL_MODE__ + sub #1,A1P +#else + subs #1,A1P ; point to byte +#endif + mov.b @A1P,A2L ; get byte + mov.b A2L,@-A0P ; save byte + CMPP A0P,A3P ; at the front again ? + bne byteloop + + ; return with A0 pointing to dst +quit: rts + +#endif diff --git a/lib/machine/h8300/memset.S b/lib/machine/h8300/memset.S new file mode 100644 index 0000000..c92169c --- /dev/null +++ b/lib/machine/h8300/memset.S @@ -0,0 +1,102 @@ +#include "setarch.h" + +#include "defines.h" + +#if defined (__H8300SX__) + + .global _memset +_memset: + ; Use er3 is a temporary since er0 must remain unchanged on exit. + mov.l er0,er3 + + ; Fill er1 with the byte to copy. + mov.b r1l,r1h + mov.w r1,e1 + + ; Account for any excess bytes and words that will be copied after + ; the main loop. r2 >= 0 if there is a longword to copy. + sub #4,LEN(r2) + blo longs_done + + ; Copy one byte if doing so will make er3 word-aligned. + ; This isn't needed for correctness but it makes the main loop + ; slightly faster. + bld #0,r3l + bcc word_aligned + mov.b r1l,@er3+ + sub #1,LEN(r2) + blo longs_done + +word_aligned: + ; Likewise one word for longword alignment. + bld #1,r3l + bcc long_copy + mov.w r1,@er3+ + sub #2,LEN(r2) + blo longs_done + +long_copy: + ; Copy longwords. + mov.l er1,@er3+ + sub #4,LEN(r2) + bhs long_copy + +longs_done: + ; At this point, we need to copy r2 & 3 bytes. Copy a word + ; if necessary. + bld #1,r2l + bcc words_done + mov.w r1,@er3+ + +words_done: + ; Copy a byte. + bld #0,r2l + bcc bytes_done + mov.b r1l,@er3+ + +bytes_done: + rts + +#else + +; A0P pointer to cursor +; A1P thing to copy + .global _memset + +_memset: + +; MOVP @(2/4,r7),A2P ; dst +; MOVP @(4/8,r7),A1 ; src thing +; MOVP @(6/12,r7),A3P ; len + + MOVP A2P,A2P + beq quit + + ; A3 points to the end of the area + MOVP A0P,A3P + ADDP A2P,A3P + + ; see if we can do it in words + ; by oring in the start of the buffer to the end address + + or A0L,A2L + btst #0,A2L + bne byteloop + + ; we can do it a word at a time + + mov.b A1L,A1H + +wordloop: + mov.w A1,@-A3P + CMPP A3P,A0P + bne wordloop +quit: rts + +byteloop: + mov.b A1L,@-A3P + CMPP A3P,A0P + bne byteloop + rts + +#endif diff --git a/lib/machine/h8300/reg_memcpy.S b/lib/machine/h8300/reg_memcpy.S new file mode 100644 index 0000000..5402fc4 --- /dev/null +++ b/lib/machine/h8300/reg_memcpy.S @@ -0,0 +1,30 @@ +#include "setarch.h" + +#include "defines.h" + + ; dst A0 + ; src A1 + ; len A2 + .global ___reg_memcpy +___reg_memcpy: + + MOVP A0P,A3P ; keep copy of result + ADDP A2P,A0P ; point to end of dst + ADDP A2P,A1P ; point to end of src + CMPP A0P,A3P ; see if anything to do + beq quit + +loop: +#ifdef __NORMAL_MODE__ + sub #1,A1P ; point to byte +#else + subs #1,A1P ; point to byte +#endif + mov.b @A1P,A2L ; get byte + mov.b A2L,@-A0P ; save byte + CMPP A0P,A3P ; at the front again ? + bne loop + + ; return with A0 pointing to dst +quit: rts + diff --git a/lib/machine/h8300/reg_memset.S b/lib/machine/h8300/reg_memset.S new file mode 100644 index 0000000..ce4f5ca --- /dev/null +++ b/lib/machine/h8300/reg_memset.S @@ -0,0 +1,30 @@ +#include "setarch.h" + +#include "defines.h" + + ; dst A0 + ; src A1 + ; len A2 + + .global ___reg_memset +___reg_memset: + MOVP A0P,A3P + MOVP A2P,A2P + beq noset + +memloop: + mov.b A1L,@A0P +#ifdef __NORMAL_MODE__ + add #1,A0P + sub #1,A2P +#else + adds #1,A0P + subs #1,A2P +#endif + MOVP A2P,A2P + bne memloop + +noset: + MOVP A3P,A0P + rts + diff --git a/lib/machine/h8300/setarch.h b/lib/machine/h8300/setarch.h new file mode 100644 index 0000000..56bdaaf --- /dev/null +++ b/lib/machine/h8300/setarch.h @@ -0,0 +1,21 @@ +#ifdef __H8300H__ +#ifdef __NORMAL_MODE__ + .h8300hn +#else + .h8300h +#endif +#endif +#ifdef __H8300S__ +#ifdef __NORMAL_MODE__ + .h8300sn +#else + .h8300s +#endif +#endif +#ifdef __H8300SX__ +#ifdef __NORMAL_MODE__ + .h8300sxn +#else + .h8300sx +#endif +#endif diff --git a/lib/machine/h8300/setjmp.S b/lib/machine/h8300/setjmp.S new file mode 100644 index 0000000..cb79e49 --- /dev/null +++ b/lib/machine/h8300/setjmp.S @@ -0,0 +1,68 @@ +#include "setarch.h" + + .file "setjmp.S" + + .section .text + .align 2 + .global _setjmp +_setjmp: +#if defined(__H8300SX__) + mov.l er7,@er0+ + mov.l er6,@er0+ + mov.l er5,@er0+ + mov.l er4,@er0+ + mov.l @sp,@er0 + sub.l er0,er0 +#elif defined(__H8300H__) || defined(__H8300S__) + mov.l er7,@er0 + mov.l er6,@(4,er0) + mov.l er5,@(8,er0) + mov.l er4,@(12,er0) + mov.l @sp,er1 + mov.l er1,@(16,er0) + sub.l er0,er0 +#else + mov.w r7,@r0 + mov.w r6,@(2,r0) + mov.w r5,@(4,r0) + mov.w r4,@(6,r0) + mov.w @sp,r1 + mov.w r1,@(8,r0) + sub.w r0,r0 +#endif + rts + + .global _longjmp +_longjmp: +#if defined(__H8300H__) || defined (__H8300S__) || defined (__H8300SX__) + mov.l @er0+,er7 + mov.l @er0+,er6 + mov.l @er0+,er5 + mov.l @er0+,er4 +#if defined(__H8300SX__) + mov.l @er0,@sp +#else + mov.l @er0,er2 + mov.l er2,@sp +#endif +#if (__INT_MAX__ <= 32767) + mov.w r1,r0 +#else + mov.l er1,er0 +#endif + bne .L1 + sub er0,er0 + adds #1,er0 +#else + mov.w @r0+,r7 + mov.w @r0+,r6 + mov.w @r0+,r5 + mov.w @r0+,r4 + mov.w @r0,r2 + mov.w r2,@sp + mov.w r1,r0 + bne .L1 + mov.w #1,r0 +#endif +.L1: + rts diff --git a/lib/machine/h8300/strcmp.S b/lib/machine/h8300/strcmp.S new file mode 100644 index 0000000..c5d7094 --- /dev/null +++ b/lib/machine/h8300/strcmp.S @@ -0,0 +1,60 @@ +#include "setarch.h" + +#include "defines.h" + +#if defined (__H8300SX__) + .global _strcmp +_strcmp: + mov.l er0,er2 +loop: + mov.b @er2+,r0l + beq eos + sub.b @er1+,r0l + beq loop + exts.l #2,er0 + rts +eos: + sub.b @er1,r0l + exts.l #2,er0 + rts +#else + .section .text + .align 2 + .global _strcmp +_strcmp: + MOVP A0P,A2P + MOVP A1P,A3P +.L5: + mov.b @A2P+,A1L + beq .L3 + mov.b @A3P+,A0L + cmp.b A0L,A1L + beq .L5 +#ifdef __NORMAL_MODE__ + sub #1,A3P +#else + subs #1,A3P +#endif +.L3: + mov.b @(-1,A2P),A0L + mov.b @A3P,A1L + sub.b A1L,A0L + ; We have to sign extend the result to 32bits just in case + ; we are using 32bit integers. +#ifdef __H8300H__ + exts.w r0 + exts.l er0 +#else +#ifdef __H8300S__ + exts.w r0 + exts.l er0 +#else + bld #7,r0l + subx r0h,r0h + subx r1l,r1l + subx r1h,r1h +#endif +#endif + rts + .end +#endif diff --git a/lib/machine/h8500/Makefile.inc b/lib/machine/h8500/Makefile.inc new file mode 100644 index 0000000..b437158 --- /dev/null +++ b/lib/machine/h8500/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/divsi3.c %D%/mulsi3.c %D%/divhi3.S %D%/shifts.c %D%/cmpsi.c %D%/psi.S %D%/setjmp.S diff --git a/lib/machine/h8500/cmpsi.c b/lib/machine/h8500/cmpsi.c new file mode 100644 index 0000000..3357343 --- /dev/null +++ b/lib/machine/h8500/cmpsi.c @@ -0,0 +1,126 @@ + +union u +{ + struct + { + short int msw; + unsigned short lsw; + } w; + long l; +}; + +union us +{ + struct + { + short int msw; + unsigned short lsw; + } w; + long l; +}; + +int +__cmpsi2(long arga, + short int msw_b, unsigned short int lsw_b) +{ + union u u; + u.l = arga; + + if (u.w.msw != msw_b) + { + if (u.w.msw < msw_b) return 0; + return 2; + } + if (u.w.lsw != lsw_b) + { + if (u.w.lsw < lsw_b) return 0; + return 2; + } + return 1; +} + + +int +__ucmpsi2(unsigned long arga, + unsigned short int msw_b, unsigned short int lsw_b) +{ + union us u; + u.l = arga; + + if (u.w.msw != msw_b) + { + if (u.w.msw < msw_b) return 0; + return 2; + } + if (u.w.lsw != lsw_b) + { + if (u.w.lsw < lsw_b) return 0; + return 2; + } + return 1; +} + + +union pu +{ + struct { + char ignore; + signed char msb; + unsigned short lsw; + } w; + long l; +}; + +union pun +{ + struct { + char ignore; + unsigned char msb; + unsigned short lsw; + } w; + long l; +}; + + +int +__cmppsi2(long arga, long argb) +{ + union pu a; + union pu b; + a.l = arga; + b.l = argb; + + if (a.w.msb != b.w.msb) + { + if (a.w.msb < b.w.msb) return 0; + return 2; + } + if (a.w.lsw != b.w.lsw) + { + if (a.w.lsw < b.w.lsw) return 0; + return 2; + } + return 1; +} + + +int +__ucmppsi2(long arga, long argb) +{ + union pun a; + union pun b; + a.l = arga; + b.l = argb; + + if (a.w.msb != b.w.msb) + { + if (a.w.msb < b.w.msb) return 0; + return 2; + } + if (a.w.lsw != b.w.lsw) + { + if (a.w.lsw < b.w.lsw) return 0; + return 2; + } + return 1; +} diff --git a/lib/machine/h8500/divhi3.S b/lib/machine/h8500/divhi3.S new file mode 100644 index 0000000..ee31351 --- /dev/null +++ b/lib/machine/h8500/divhi3.S @@ -0,0 +1,54 @@ + .title "H8/500 DIVIDE" +!! 2 byte integer Divide code for the H8/500 +!! +!! Steve Chamberlain +!! sac@cygnus.com +!! +!! + +!! args in r1 and r4, result in r0/r1 + +#if __CODE__==32 +#define RET prts +#else +#define RET rts +#endif + .global __divmodhi4 + + +__divmodhi4: + clr.w r0 + tst.w r1 ! neg arg1 + bpl PU + + + neg.w r1 +NU: tst.w r4 + bmi NN + +NP: divxu.w r4,r0 + neg.w r0 + neg.w r1 + RET + +NN: neg.w r4 + divxu.w r4,r0 + neg.w r0 ! get rem sign right + RET + + +PU: + tst.w r4 + bpl PP + + +PN: neg.w r4 + divxu.w r4,r0 + neg.w r1 + RET + +PP: divxu.w r4,r0 ! rem in r0, q in r1 + RET + + + diff --git a/lib/machine/h8500/divsi3.c b/lib/machine/h8500/divsi3.c new file mode 100644 index 0000000..e19855d --- /dev/null +++ b/lib/machine/h8500/divsi3.c @@ -0,0 +1,134 @@ + +#define divnorm(num, den, sign) \ +{ \ + if (num < 0) \ + { \ + num = -num; \ + sign = 1; \ + } \ + else \ + { \ + sign = 0; \ + } \ + \ + if (den < 0) \ + { \ + den = - den; \ + sign = 1 - sign; \ + } \ +} + + + + + +unsigned long +divmodsi4(int modwanted, unsigned long num, unsigned long den) +{ + long int bit = 1; + long int res = 0; + long prevden; + while (den < num && bit && !(den & (1L<<31))) + { + den <<=1; + bit <<=1; + } + while (bit) + { + if (num >= den) + { + num -= den; + res |= bit; + } + bit >>=1; + den >>=1; + } + if (modwanted) return num; + return res; +} + + +#define exitdiv(sign, res) if (sign) { res = - res;} return res; + +long +__modsi3 (long numerator, long denominator) +{ + int sign = 0; + long dividend; + long modul; + + + if (numerator < 0) + { + numerator = -numerator; + sign = 1; + } + if (denominator < 0) + { + denominator = -denominator; + } + + modul = divmodsi4 (1, numerator, denominator); + if (sign) + return - modul; + return modul; +} + + +long +__divsi3 (long numerator, long denominator) +{ + int sign; + long dividend; + long modul; + divnorm (numerator, denominator, sign); + + dividend = divmodsi4 (0, numerator, denominator); + exitdiv (sign, dividend); +} + +long +__umodsi3 (unsigned long numerator, unsigned long denominator) +{ + long dividend; + long modul; + +modul= divmodsi4 (1, numerator, denominator); + return modul; +} + +long +__udivsi3 (unsigned long numerator, unsigned long denominator) +{ + int sign; + long dividend; + long modul; + dividend = divmodsi4 (0, numerator, denominator); + return dividend; +} + + + + + + +#ifdef TEST + + + +main () +{ + long int i, j, k, m; + for (i = -10000; i < 10000; i += 8) + { + for (j = -10000; j < 10000; j += 11) + { + k = i / j; + m = __divsi3 (i, j); + if (k != m) + printf ("fail %d %d %d %d\n", i, j, k, m); + } + } +} + +#endif diff --git a/lib/machine/h8500/mulhi3.c b/lib/machine/h8500/mulhi3.c new file mode 100644 index 0000000..869e131 --- /dev/null +++ b/lib/machine/h8500/mulhi3.c @@ -0,0 +1,21 @@ + + +short +__mulhi3(short a, short b) +{ + int r; + + r = 0; + while (a) + { + if (a & 1) + { + r += b; + a>>=1; + b<<=1; + } + } + return r; +} + + diff --git a/lib/machine/h8500/mulsi3.c b/lib/machine/h8500/mulsi3.c new file mode 100644 index 0000000..a923e8d --- /dev/null +++ b/lib/machine/h8500/mulsi3.c @@ -0,0 +1,72 @@ + +typedef union { + struct { + unsigned int msw; + unsigned int lsw; +} s; + long v; +} u; + +long __mulsi3(u a, u b) +{ + int s; + long pp1; + long pp2; + long r; + + if (a.s.msw == 0 && + b.s.msw == 0) + { + return (long)a.s.lsw * b.s.lsw; + } + + s = 0; + if (a.v < 0) + { + s = 1; + a.v = - a.v; + } + if (b.v < 0) + { + s = 1-s; + b.v = - b.v; + } + + pp1 = (long)a.s.lsw * b.s.lsw ; + pp2 = (long)a.s.lsw * b.s.msw + (long)a.s.msw * b.s.lsw; + + pp1 += pp2 << 16; + + if (s) + { + pp1 = -pp1; + } + return pp1; +} +long __mulpsi3(long a, long b) +{ + return a*b; +} + + +short +__mulhi3(short a, short b) +{ + int r; + + r = 0; + while (a) + { + if (a & 1) + { + r += b; + + } + b<<=1; + a>>=1; + + } + return r; +} + + diff --git a/lib/machine/h8500/negsi2.c b/lib/machine/h8500/negsi2.c new file mode 100644 index 0000000..c5b31b1 --- /dev/null +++ b/lib/machine/h8500/negsi2.c @@ -0,0 +1,7 @@ + + +long +__negsi2(long x) +{ + return ~x+1; +} diff --git a/lib/machine/h8500/psi.S b/lib/machine/h8500/psi.S new file mode 100644 index 0000000..47c8183 --- /dev/null +++ b/lib/machine/h8500/psi.S @@ -0,0 +1,136 @@ +/* convert psi to si inplace + +Note that `fp' below isn't a segment register. +It's r6, the frame pointer. */ + +#if __CODE__==32 +#define RET prts +#else +#define RET rts +#endif + +#define EXTPSISI_SN(r_msw,r_lsw,sp) ; \ + .global __extpsisi##r_msw ; \ +__extpsisi##r_msw: ; \ + mov r_msw,r_lsw ; \ + stc sp,r_msw ; \ + RET + + EXTPSISI_SN(r2,r3,dp) + EXTPSISI_SN(r4,r5,ep) + + +#define ADDPSI_AR_RN(sr,an,r_msw,r_lsw) \ + .global __addpsi##an##r_msw ; \ +__addpsi##an##r_msw: ; \ + stc sr,@-sp ; \ + add an,r_lsw ; \ + addx @sp+,r_msw ; \ + RET + + ADDPSI_AR_RN(dp,r2,r0,r1) + ADDPSI_AR_RN(dp,r2,r3,r4) + ADDPSI_AR_RN(ep,r4,r0,r1) + ADDPSI_AR_RN(ep,r4,r1,r2) + ADDPSI_AR_RN(ep,r4,r3,r4) + ADDPSI_AR_RN(ep,r4,r5,fp) + + ADDPSI_AR_RN(tp,fp,r0,r1) + + +#define ADDPSI_RN_AR(r_msw,r_lsw,sr,an,t_msw,t_lsw) \ + .global __addpsi##r_msw##an ; \ +__addpsi##r_msw##an: ; \ + mov.w t_msw,@-sp ; \ + mov.w t_lsw,@-sp ; \ + stc sr,t_msw ; \ + mov an,t_lsw ; \ + add r_lsw,t_lsw ; \ + addx r_msw,t_msw ; \ + ldc t_msw,sr ; \ + mov.w t_lsw,an ; \ + mov.w @sp+,t_lsw ; \ + mov.w @sp+,t_msw ; \ + RET + + ADDPSI_RN_AR(r0,r1,dp,r2,r4,r5) + ADDPSI_RN_AR(r0,r1,ep,r4,r2,r3) + + + +#define EXTPSIHI_RN_RN(rm,r_msw,r_lsw) ; \ + .global __extpsihi##rm##r_msw ; \ +__extpsihi##rm##r_msw: ; \ + mov rm,r_lsw ; \ + clr.w r_msw ; \ + RET + + EXTPSIHI_RN_RN(r3,r0,r1) + EXTPSIHI_RN_RN(r4,r0,r1) + EXTPSIHI_RN_RN(r5,r0,r1) + EXTPSIHI_RN_RN(r2,r0,r1) + + + +/* ifdefed out, because gcc doesn't like the # character in the above + macro. The macro expands into an assembly languange comment anyways, + so it serves no useful purpose. */ +#if 0 +#define EXTPSIHI_RN_SN(rm,r_msw,r_lsw) ; \ + .global __extpsihi##rm##r_lsw ; \ +__extpsihi##rm##r_lsw: ; \ + mov rm,r_lsw ; \ + ldc \#0,r_msw ; \ + RET + + EXTPSIHI_RN_SN(r0,dp,r2) + EXTPSIHI_RN_SN(r0,ep,r4) + EXTPSIHI_RN_SN(r1,dp,r2) + EXTPSIHI_RN_SN(r1,ep,r4) + EXTPSIHI_RN_SN(r3,dp,r2) + EXTPSIHI_RN_SN(r3,ep,r4) + EXTPSIHI_RN_SN(r5,dp,r2) + EXTPSIHI_RN_SN(r5,ep,r4) + EXTPSIHI_RN_SN(r2,ep,r4) +#endif + + +#define EXTPSISI_RN(r_msw,r_lsw) ; \ + .global __extpsisi##r_msw ; \ +__extpsisi##r_msw: ; \ + RET + + EXTPSISI_RN(r0,r1) + + + +#define ADDPSI_SA_SB(sa,ra,sb,rb) ; \ + .global __addpsi##ra##rb ; \ +__addpsi##ra##rb: ; \ + mov.w r0,@-sp ; \ + mov.w r1,@-sp ; \ + stc sa,r0 ; \ + stc sb,r1 ; \ + add.w ra,rb ; \ + addx r0,r1 ; \ + ldc r1,sb ; \ + mov.w @sp+,r1 ; \ + mov.w @sp+,r0 ; \ + RET + + + ADDPSI_SA_SB(dp,r2,ep,r4) + ADDPSI_SA_SB(ep,r4,dp,r2) + ADDPSI_SA_SB(tp,fp,dp,r2) + ADDPSI_SA_SB(tp,fp,ep,r4) + + ADDPSI_SA_SB(dp,r2,dp,r2) + + + + .global __addpsir0r0 +__addpsir0r0: + add.w r1,r1 + addx r0,r0 + RET + diff --git a/lib/machine/h8500/setjmp.S b/lib/machine/h8500/setjmp.S new file mode 100644 index 0000000..4b25fc0 --- /dev/null +++ b/lib/machine/h8500/setjmp.S @@ -0,0 +1,27 @@ +! + .file "setjmp.S" + .section .text + + .global _setjmp +_setjmp: + mov.w r7,@r0+ + mov.w r6,@r0+ + mov.w r5,@r0+ + mov.w @sp,r1 + mov.w r1,@r0 + clr.w r0 + rts + + .global _longjmp +_longjmp: + mov.w @r0+,r7 + mov.w @r0+,r6 + mov.w @r0+,r5 + mov.w @r0,r2 + mov.w r2,@sp + mov.w r1,r0 + tst.w r0 + bne .L1 + mov.w #1,r0 +.L1: + rts diff --git a/lib/machine/h8500/shifts.c b/lib/machine/h8500/shifts.c new file mode 100644 index 0000000..5b81069 --- /dev/null +++ b/lib/machine/h8500/shifts.c @@ -0,0 +1,45 @@ + + +int __ashrhi3(int a,int b) +{ + return a>>b; +} + +int __ashlhi3(int a,int b) +{ + return a<>b; +} + + + + +long __ashrsi3(long a, int b) +{ + return a>>b; +} + +long __ashlsi3(long a,int b) +{ + return a<>b; +} + diff --git a/lib/machine/hppa/DEFS.h b/lib/machine/hppa/DEFS.h new file mode 100644 index 0000000..12fcd8e --- /dev/null +++ b/lib/machine/hppa/DEFS.h @@ -0,0 +1,178 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "pcc_prefix.s" + +#define BLANK +#define BANNER(str) BLANK .VERSION str +#define ENTRY(Name) BLANK M_ENTRY (Name,PROF_/**/Name) +#define ENTRYC(Name) BLANK M_ENTRYC(Name,PROF_/**/Name) +#define EXIT(Name) BLANK M_EXIT (Name,PROF_/**/Name) +#define EXITC(Name) BLANK M_EXITC (Name,PROF_/**/Name) + +#if 0 +#define TEXT_SEGMENT \ + .SPACE $TEXT$ !\ + .SUBSPA $CODE$ +#define RO_SEGMENT \ + .SPACE $TEXT$ !\ + .SUBSPA $lit$ +#define DATA_SEGMENT \ + .SPACE $PRIVATE$ !\ + .SUBSPA $data$ +#define BSS_SEGMENT \ + .SPACE $PRIVATE$ !\ + .SUBSPA $bss$ +#else +#define TEXT_SEGMENT .text +#define RO_SEGMENT .rodata +#define DATA_SEGMENT .data +#define BSS_SEGMENT .bss +#endif + + + + +#ifdef PROF + +; +; All four argument registers are saved into caller save registers +; and restored after the call to _mcount. This is possible because +; the mcount routine does not modify them, so we can. Mcount takes +; 3 arguments; the first argument is the incoming 'rp', the second +; is the starting address of the profiled routine, and the third is +; the address of the PROF label (which is where mcount stores the +; profile data). +; +#define M_ENTRY(name,prof) \ + TEXT_SEGMENT !\ + .label name !\ + .PROC !\ + .CALLINFO CALLER,SAVE_RP !\ + .ENTRY !\ + stw rp,-20(sp) !\ + ldo 48(sp),sp !\ + or arg0,r0,r19 !\ + or arg1,r0,r20 !\ + or arg2,r0,r21 !\ + or arg3,r0,r22 !\ + or rp,r0,arg0 !\ + ldil L%name,r1 !\ + ldo R%name(r1),arg1 !\ + addil L%prof-$global$,dp !\ + bl _mcount,rp !\ + ldo R%prof-$global$(r1),arg2 !\ + ldw -68(sp),rp !\ + ldo -48(sp),sp !\ + or r19,r0,arg0 !\ + or r20,r0,arg1 !\ + or r21,r0,arg2 !\ + or r22,r0,arg3 !\ + + +#define M_ENTRYC(name,prof) \ + TEXT_SEGMENT !\ + .label name !\ + .PROC !\ + .CALLINFO CALLER,SAVE_RP !\ + .ENTRY !\ + stw rp,-20(sp) !\ + ldo 128(sp),sp !\ + or arg0,r0,r19 !\ + or arg1,r0,r20 !\ + or arg2,r0,r21 !\ + or arg3,r0,r22 !\ + or rp,r0,arg0 !\ + ldil L%name,r1 !\ + ldo R%name(r1),arg1 !\ + addil L%prof-$global$,dp !\ + bl _mcount,rp !\ + ldo R%prof-$global$(r1),arg2 !\ + ldw -148(sp),rp !\ + or r19,r0,arg0 !\ + or r20,r0,arg1 !\ + or r21,r0,arg2 !\ + or r22,r0,arg3 !\ + +; +; The HPUX profiler uses a word for each entrypoint to store the profiling +; information. The setup code passes the address to the _mcount routine. +; The EXIT macro defines a label (PROF_foo), and a word of storage. +; +#define M_EXIT(name,prof) \ + bv,n r0(rp) !\ + .EXIT !\ + .PROCEND !\ + .EXPORT name,ENTRY !\ + DATA_SEGMENT !\ + .label prof !\ + .WORD 0 !\ + .IMPORT $global$,DATA !\ + .IMPORT _mcount,CODE + +#define M_EXITC(name,prof) \ + bv r0(rp) !\ + ldo -128(sp),sp !\ + .EXIT !\ + .PROCEND !\ + .EXPORT name,ENTRY !\ + DATA_SEGMENT !\ + .label prof !\ + .WORD 0 !\ + .IMPORT $global$,DATA !\ + .IMPORT _mcount,CODE + +#else /* NOT profiling */ + +#define M_ENTRY(name,prof) \ + TEXT_SEGMENT !\ + .label name !\ + .PROC !\ + .CALLINFO !\ + .ENTRY + +#define M_ENTRYC(name,prof) \ + TEXT_SEGMENT !\ + .label name !\ + .PROC !\ + .CALLINFO CALLER,SAVE_RP !\ + .ENTRY !\ + stw rp,-20(sp) !\ + ldo 128(sp),sp + +#define M_EXIT(name,prof) \ + bv,n r0(rp) !\ + .EXIT !\ + .PROCEND !\ + .EXPORT name,ENTRY + +#define M_EXITC(name,prof) \ + ldw -148(sp),rp !\ + bv r0(rp) !\ + ldo -128(sp),sp !\ + .EXIT !\ + .PROCEND !\ + .EXPORT name,ENTRY + +#define ENTRY(Name) BLANK M_ENTRY (Name,PROF_/**/Name) +#define ENTRYC(Name) BLANK M_ENTRYC(Name,PROF_/**/Name) +#define EXIT(Name) BLANK M_EXIT (Name,PROF_/**/Name) +#define EXITC(Name) BLANK M_EXITC (Name,PROF_/**/Name) + + +#endif + diff --git a/lib/machine/hppa/Makefile.inc b/lib/machine/hppa/Makefile.inc new file mode 100644 index 0000000..c3d2da6 --- /dev/null +++ b/lib/machine/hppa/Makefile.inc @@ -0,0 +1,5 @@ +libc_a_SOURCES += \ + %D%/memchr.S %D%/memcmp.S %D%/memcpy.S %D%/memset.S \ + %D%/setjmp.S \ + %D%/strcat.S %D%/strcmp.S \ + %D%/strcpy.S %D%/strlen.S %D%/strncat.S %D%/strncmp.S %D%/strncpy.S diff --git a/lib/machine/hppa/memchr.S b/lib/machine/hppa/memchr.S new file mode 100644 index 0000000..1cca3e5 --- /dev/null +++ b/lib/machine/hppa/memchr.S @@ -0,0 +1,48 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* SPECTRUM_ID: @(#)memchr.s 37.4 86/04/23 */ +/* + * memchr(s, c, n) + * + * returns pointer to first occurrence of char c + * in first n characters of memory area s, + * or null if c does not occur. + */ + +#include "DEFS.h" + +#define FROM arg0 +#define CHAR arg1 +#define COUNT arg2 +#define TEMP1 r19 + +ENTRY(memchr) + comb,<= COUNT,r0,memchrexit /* return if count is zero */ + copy r0,ret0 /* null if c not found in n chars */ + depi 0,23,24,CHAR /* make char unsigned */ + + ldbs,ma 1(FROM),TEMP1 +memchrloop: + comb,=,n TEMP1,CHAR,memchrequal + addib,<> -1,COUNT,memchrloop + ldbs,ma 1(FROM),TEMP1 + b,n memchrexit + +memchrequal: + ldo -1(FROM),ret0 + +memchrexit: +EXIT(memchr) diff --git a/lib/machine/hppa/memcmp.S b/lib/machine/hppa/memcmp.S new file mode 100644 index 0000000..babb207 --- /dev/null +++ b/lib/machine/hppa/memcmp.S @@ -0,0 +1,183 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* memcmp(s1, s2, n) */ +/* returns integer: < 0 iff s1 lexicographically less than s2 */ +/* > 0 iff s1 lexicographically greater than s2 */ +/* = 0 iff s1 lexicographically equal to s2 */ +/* = 0 iff s1 lexicographically equal to s2 */ +/* quit after n charachters */ +#ifndef _NAMESPACE_CLEAN +#define NOSECDEF /* prevents _memcmp from becoming primary entry */ +#endif + +#include "DEFS.h" + +#define s1 26 +#define s2 25 +#define tmp1 19 +#define s2word 20 +#define tmp3 21 +#define tmp7 22 +#define s1word 29 +#define save 1 +#define tmp6 23 +#define tmp5 28 +#define count 24 + +ENTRY(memcmp) + combt,<,n r0,count,search /*N <= 0 yields equality */ + b done /**/ + copy 0,ret0 /*return 0 (DELAY SLOT) */ +search: combf,=,n s1,s2,findout /*s1 != s2? */ + b done + copy 0,ret0 /*return 0 (delay slot) */ +findout: + comibf,=,n 0,s1,checks1 /*s1 == NULL? */ + ldbs 0(0,s2),ret0 /**/ + b done /*quit */ + sub 0,ret0,ret0 /*ret0 <- -*s2 */ +checks1: + comibf,=,n 0,s2,checkitout /*s2 == NULL? */ + b done /* quit */ + ldbs 0(0,s1),28 /* return *s1 */ + +checkitout: + extru s2,31,2,tmp1 /* Extract the low two bits of the s2. */ + extru s1,31,2,tmp5 /* Extract the low two bits of the s1 */ + sub,= tmp5,tmp1,tmp3 /* Are s1 & s2 aligned with each other? */ + b not_aligned /* It's more complicated (not_aligned) */ + dep 0,31,2,s1 /* Compute word address of s1 (DELAY SLOT) */ + dep 0,31,2,s2 /* Compute word address of s2 */ + ldwm 4(0,s1),s1word /* get next s1 word s1+=4 */ + combt,= tmp5,r0,skipmask /* skip masking, if we can */ + ldwm 4(0,s2),s2word /* get next s2 word s2+=4 (DELAY SLOT) */ + add tmp5,count,count /* bump count by the number of bytes */ + /* we are going to mask */ + sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word /* mask s1word (s1) */ + or save,s2word,s2word /* mask s2word (s2) */ + + +skipmask: + combt,=,n s1word,s2word,checkN /* We may be done */ + +checkbyte: + extru s1word,7,8,tmp3 /* get first byte (character) */ +ckbyte2: extru s2word,7,8,tmp7 /* get first byte (character) */ + combf,= tmp3,tmp7,done /* quit if first byte is not equal */ + sub tmp3,tmp7,ret0 /* return difference (delay slot) */ + addibt,<=,n -1,count,done /* have we checked N chars? ret0 == 0 */ + extru s1word,15,8,tmp3 /* get second byte (character) */ + extru s2word,15,8,tmp7 /* get second byte (character) */ + combf,= tmp3,tmp7,done /* quit if second byte is not equal */ + sub tmp3,tmp7,ret0 /* return difference (delay slot) */ + addibt,<=,n -1,count,done /* have we checked N chars? */ + extru s1word,23,8,tmp3 /* get third byte (character) */ + extru s2word,23,8,tmp7 /* get third byte (character) */ + combf,= tmp3,tmp7,done /* done if third byte is not equal */ + sub tmp3,tmp7,ret0 /* return difference (delay slot) */ + addibt,<=,n -1,count,done /* have we checked N chars? */ + extru s1word,31,8,tmp3 /* get last byte (character) */ + extru s2word,31,8,tmp7 /* get last byte (character) */ + b done /* if we reach this point we know that */ + sub tmp3,tmp7,ret0 /* the last character in the word is */ + /* where the difference is, so return */ + /* the difference and we're outta here */ + + +checkN: + addibt,<=,n -4,count,zero /* have we checked N chars? */ + ldwm 4(0,s2),s2word /* get next s2 word s2+=4 */ + b skipmask /* keep checking */ + ldwm 4(0,s1),s1word /* get next s1 word s1+=4 */ + + +not_aligned: + dep r0,31,2,s2 /* Compute word address of s2 */ + combt,<,n r0,tmp3,shifts1 /* Do we shift s1 or s2 */ + sh3add tmp3,r0,tmp3 /* eight bits per byte so mul by 8 */ + ldwm 4(0,s1),s1word /* get first word of s1 */ + ldwm 4(0,s2),s2word /* get first word or s2 */ + combt,=,n r0,tmp5,masks2 /* Do we need to mask beginning of s1 */ + add tmp5,count,count /* bump count by the number of bytes */ + /* we are going to mask */ + sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word /**/ +masks2: sh3add tmp1,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s2word,s2word /**/ + subi 4,tmp1,tmp1 /* tmp1 now has the number of byte that */ + /* are valid in s2word before the vshd */ + mtctl tmp3,11 /* Move shift amount to CR11 */ +more: combt,<=,n count,tmp1,chunk1 /* Can we do the vshd? */ + ldwm 4(0,s2),tmp7 /* load second word to enable us to shift */ + vshd s2word,tmp7,s2word /**/ + combf,=,n s1word,s2word,ckbyte2 /**/ + extru s1word,7,8,tmp3 /* get first byte (DELAY SLOT) */ + addibt,<=,n -4,count,zero /* have we checked N chars? */ + copy tmp7,s2word /**/ + b more /* keep checking */ + ldwm 4(0,s1),s1word /* get next s1 (DELAY SLOT) */ + +chunk1: + vshd s2word,r0,s2word /* do an arithmetic shift left to position data */ + b ckbyte2 /**/ + extru s1word,7,8,tmp3 /**/ + + +shifts1: + sh3add tmp3,r0,tmp3 /* eight bits per byte so mul by 8 */ + sub r0,tmp3,tmp3 /* Get negative value for left shift */ + dep r0,31,2,s2 /* Compute word address of s2 */ + ldwm 4(0,s2),s2word /* get first word of s2 */ + ldwm 4(0,s1),s1word /* get first word or s1 */ + combt,=,n r0,tmp1,masks1 /*Do we need to mask beginning of s2 */ + add tmp1,count,count /*bump count by the number of bytes */ + /* we are going to mask */ + sh3add tmp1,r0,save /*save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /*load save with proper mask */ + or save,s2word,s2word /**/ +masks1: sh3add tmp5,r0,save /*save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /*load save with proper mask */ + or save,s1word,s1word /**/ + subi 4,tmp5,tmp5 /*tmp5 now has the number of byte that */ + /*are valid in s1word before the vshd */ + mtctl tmp3,11 /*Move shift amount to CR11 */ +more1: combt,<=,n count,tmp5,chunk2 /*Can we do the vshd? */ + ldwm 4(0,s1),tmp7 /*load second word to enable us to shift */ + vshd s1word,tmp7,s1word /**/ + combf,=,n s2word,s1word,ckbyte2 /**/ + extru s1word,7,8,tmp3 /*get first byte (DELAY SLOT) */ + addibt,<=,n -4,count,zero /*have we checked N chars? */ + copy tmp7,s1word /**/ + b more1 /*keep checking */ + ldwm 4(0,s2),s2word /*get next s2 (DELAY SLOT) */ + +chunk2: + vshd s1word,r0,s1word /**/ + b ckbyte2 /**/ + extru s1word,7,8,tmp3 /**/ + +zero: copy r0,ret0 +done: +EXIT(memcmp) diff --git a/lib/machine/hppa/memcpy.S b/lib/machine/hppa/memcpy.S new file mode 100644 index 0000000..713c1c1 --- /dev/null +++ b/lib/machine/hppa/memcpy.S @@ -0,0 +1,146 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* HPUX_ID: @(#) $Revision$ */ +/* + * memcpy(s1, s2, n) + * + * Copy n characters from s2 to s1; returns s1. + */ + +#define d_addr arg0 +#define s_addr arg1 +#define count arg2 +#define tmp5 arg3 +#define tmp1 r19 +#define tmp2 r20 +#define tmp3 r21 +#define tmp4 r22 +#define tmp6 r31 + +#include "DEFS.h" + +ENTRY(memcpy) + comib,>= 5,count,byteloop /* If count is <= 6 don't get fancy.*/ + movb,=,n d_addr,ret0,done /* The return value is defined to be the value of d_addr. DELAY SLOT */ + /* if d_addr is null then exit */ + extru s_addr,31,2,tmp1 /* Extract the low two bits of the source address. */ + extru d_addr,31,2,tmp2 /* Extract the low two bits of the destination address. */ + add count,tmp2,count /* pre increment the count to adjust for alignment of s1 */ + comb,<> tmp2,tmp1,not_aligned /* see if s1 is aligned w.r.t. s2. */ + dep 0,31,2,s_addr /* Compute the word address of the source. DELAY SLOT. */ + +/* aligned */ + +/* We will now begin the 16 byte at a time word move if count >= 16 ! */ +/* Else we will branch to the 4 byte-at-a time word move ! */ + + addibt,<,n -16,count,chekchunk /* If count < 16 then we can't move 16 byte chunks ! */ + /* actually we can legally move 13 or more bytes on the first loop. */ + /* These loads and stores are done so as to prevent processor interlock. */ +chunks: + ldwm 16(0,s_addr),tmp1 /* tmp1 = *s_addr s_addr += 16 */ + ldw -12(0,s_addr),tmp2 /* tmp2 = 2nd word */ + ldw -8(0,s_addr),tmp3 /* tmp3 = 3rd word */ + ldw -4(0,s_addr),tmp4 /* tmp4 = 4th word */ + /* Now store the results ! */ + stbys,b,m tmp1,4(0,d_addr) /* tmp1 = 1st word stored d_addr += 16 also take care of front porch. */ + stwm tmp2,4(0,d_addr) /* tmp2 = 2nd word stored. */ + stwm tmp3,4(0,d_addr) /* tmp3 = 3rd word stored. */ + addibf,< -16,count,chunks /* If count is still >= 16 do another loop. */ + stwm tmp4,4(0,d_addr) /* tmp4 = 4th word stored. DELAY SLOT */ + +chekchunk: + addibt,<,n 12,count,back_porch /* since the count is already decremented by -16 we're testing */ + /* to see if there are at least 4 bytes left ? */ +subchunk: + ldws,ma 4(s_addr),tmp1 /* tmp1 = *s_addr++ */ + addibf,< -4,count,subchunk /* count -= 4 */ + stbys,b,m tmp1,4(d_addr) /* *d_addr++ = tmp1 */ + + +back_porch: + addibt,=,n 4,count,done /* if count = 0 we're, of course, done ! */ + ldws 0(s_addr),tmp1 /* load up the back_porch */ + add d_addr,count,d_addr/* final store address is +1 too high ! */ + bv 0(r2) /* return--were done. */ + stbys,e tmp1,0(d_addr) /* kerplunk! whew ! */ + +/* Begin non_aligned code. (no refrence to politics) */ +not_aligned: + sub,>= tmp2,tmp1,tmp3 /* compute the shift quantity again and skip the load if tmp2 > tmp1. */ + ldwm 4(0,s_addr),tmp1 /* load up the first word from the source. tmp1 = *s_addr++ */ + zdep tmp3,28,29,tmp4 /* compute the number of bits to shift based on the number of bytes above. */ + mtctl tmp4,11 /* load the shift count into cr11 = shift count register. */ + + addibt,<,n -16,count,chkchnk2 /* first step in pre adjustment of count for looping. */ + +chunk2: + ldwm 16(0,s_addr),tmp2 /* get either first or second word . tmp2 = *s_addr++ */ + ldw -12(s_addr),tmp3 + ldw -8(s_addr),tmp4 + ldw -4(s_addr),tmp5 + vshd tmp1,tmp2,tmp6 /* position data ! */ + stbys,b,m tmp6,4(0,d_addr) /* store ! */ + + vshd tmp2,tmp3,tmp6 /* position data ! */ + stwm tmp6,4(0,d_addr) /* store ! */ + + vshd tmp3,tmp4,tmp6 /* position data ! */ + stwm tmp6,4(0,d_addr) /* store ! */ + + vshd tmp4,tmp5,tmp6 /* position data ! */ + stwm tmp6,4(0,d_addr) /* store the data ! */ + addibf,< -16,count,chunk2 /* If count is still >= 16 do another loop. */ + copy tmp5,tmp1 + + +chkchnk2: + addibt,<,n 12,count,bp_0 /* if we don't have 4 bytes left then do the back porch (bp_0) */ + +subchnk2: + ldwm 4(0,s_addr),tmp2 /* get next word ! */ + vshd tmp1,tmp2,tmp3 /* position data ! */ + addibt,< -4,count,bp_1 /* decrement count and when count < 4 goto back_porch (bp_1) */ + stbys,b,m tmp3,4(0,d_addr) /* store ! */ + + ldwm 4(0,s_addr),tmp1 /* get 4th word ! */ + vshd tmp2,tmp1,tmp3 /* position data ! */ + addib,>= -4,count,subchnk2 /* decrement count and when count <= 4 go to back porch (bp_2) */ + stbys,b,m tmp3,4(0,d_addr) /* store the data ! */ + +bp_0: copy tmp1,tmp2 /* switch registers used in the shift process. */ +bp_1: addibt,<=,n 4,count,done /* if count = -4 this implies that count = 0 -> done */ + add d_addr,count,d_addr /* bump destination address to be +1 too high ! */ + mfctl sar,tmp3 /* suppress final ldwm unless result used */ + extru tmp3,28,2,tmp3 /* convert bitshift to byteshift */ + sub,<= count,tmp3,r0 /* bytes unused if (count-byteshift <= 0*/ + + ldwm 4(0,s_addr),tmp1 /* get final word ! */ + vshd tmp2,tmp1,tmp3 /* position data ! */ + bv 0(r2) /* return */ + stbys,e tmp3,0(0,d_addr) /* store the data ! */ + +/* here we do ye old byte-at-a-time moves. */ +byteloop: + comb,>=,n 0,count,done + +encore: + ldbs,ma 1(s_addr),tmp1 + addibf,= -1,count,encore + stbs,ma tmp1,1(d_addr) + +done: +EXIT(memcpy) diff --git a/lib/machine/hppa/memset.S b/lib/machine/hppa/memset.S new file mode 100644 index 0000000..cea7382 --- /dev/null +++ b/lib/machine/hppa/memset.S @@ -0,0 +1,85 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* SPECTRUM_ID: @(#)memset.s 37.4 86/08/25 */ +/* + * memset(s, c, n) + * + * Sets first n chars in memory area s to value of character c. + * Returns s. + */ +#ifndef _NAMESPACE_CLEAN +#define NOSECDEF /* prevent _memset from being defined as entry */ +#endif + +#include "DEFS.h" + +#define TO arg0 +#define FILLCHAR arg1 +#define COUNT arg2 +#define TMP r31 + +ENTRY(memset) + comb,<= COUNT,r0,msexit /* return if count not positive */ + copy TO,ret0 /* return value is start of copy */ + comibf,<,n 5,COUNT,msbyteloop /* be straightforward */ + + dep FILLCHAR,23,8,FILLCHAR /* dup low byte */ + dep FILLCHAR,15,16,FILLCHAR /* into high bytes */ + + add TO,COUNT,TMP /* TMP points just past fill area */ + stbys,m FILLCHAR,0(TO) /* fill out first word */ + /* + * If we're pointing to high-order byte, no fill will happen, + * but permissions will be checked. We don't want this (we + * might be pointing at the beginning of a protected region), + * so we branch around stbys if neither low bits are set. + */ + bb,<,n TMP,31,filend /* if low bit is set, stbys */ + bb,>=,n TMP,30,endfil /* if next lowest bit isn't set */ + /* (and lowest isn't, either) */ + /* do not stbys */ +filend: + stbys,m,e FILLCHAR,0(TMP) /* fill out the last */ +endfil: + addi 4, TO, TO + sub TMP,TO,COUNT /* will now divide by 4 */ + comb,=,n COUNT,r0,msexit /* If count is zero ret. */ + + extru,<> COUNT,31,4,r1 + b msquadloop + depi 0,31,4,COUNT /* will now divide by 16 */ + + +mswordloop: + addib,<> -4,r1,mswordloop + stws,ma FILLCHAR,4(TO) + + comb,=,n COUNT,r0,msexit /* If count is zero ret. */ + +msquadloop: + stws,ma FILLCHAR,4(TO) + stws,ma FILLCHAR,4(TO) + stws,ma FILLCHAR,4(TO) + addib,<> -16,COUNT,msquadloop + stws,ma FILLCHAR,4(TO) + b,n msexit + +msbyteloop: + addib,<> -1,COUNT,msbyteloop + stbs,ma FILLCHAR,1(TO) + +msexit: +EXIT(memset) diff --git a/lib/machine/hppa/setjmp.S b/lib/machine/hppa/setjmp.S new file mode 100644 index 0000000..7dd7c74 --- /dev/null +++ b/lib/machine/hppa/setjmp.S @@ -0,0 +1,156 @@ +/* Copyright (c) 1995, 2002 Red Hat Incorporated. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * The name of Red Hat Incorporated may not be used to endorse + * or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Note I don't know an easy way to get the FP version into the + traditional C library and the non-FP version into the soft-float + library. Maybe we'll have to have -msoft-float trigger something + like -DSOFT_FLOAT if this issue ever arises. */ + +#include "DEFS.h" + +#if 0 + .SPACE $PRIVATE$ + .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31 + .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82 + .SPACE $TEXT$ + .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44 + .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY + .IMPORT $global$,DATA + .IMPORT $$dyncall,MILLICODE +; gcc_compiled.: +#endif + TEXT_SEGMENT + + .align 4 + .EXPORT setjmp,ENTRY,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR +setjmp + .PROC + .CALLINFO FRAME=64,NO_CALLS,SAVE_SP,ENTRY_GR=3 + .ENTRY + stwm %r30,4(%r26) + stwm %r2,4(%r26) + stwm %r3,4(%r26) + stwm %r4,4(%r26) + stwm %r5,4(%r26) + stwm %r6,4(%r26) + stwm %r7,4(%r26) + stwm %r8,4(%r26) + stwm %r9,4(%r26) + stwm %r10,4(%r26) + stwm %r11,4(%r26) + stwm %r12,4(%r26) + stwm %r13,4(%r26) + stwm %r14,4(%r26) + stwm %r15,4(%r26) + stwm %r16,4(%r26) + stwm %r17,4(%r26) + stwm %r18,4(%r26) + stwm %r27,4(%r26) +#ifdef FP + ; jmp_buf may only have a 4 byte alignment, so handle FP stores + ; very carefully. + fstds %fr12,-16(%r30) + ldw -16(%r30),%r28 + stwm %r28,4(%r26) + ldw -12(%r30),%r28 + stwm %r28,4(%r26) + fstds %fr13,-16(%r30) + ldw -16(%r30),%r28 + stwm %r28,4(%r26) + ldw -12(%r30),%r28 + stwm %r28,4(%r26) + fstds %fr14,-16(%r30) + ldw -16(%r30),%r28 + stwm %r28,4(%r26) + ldw -12(%r30),%r28 + stwm %r28,4(%r26) + fstds %fr15,-16(%r30) + ldw -16(%r30),%r28 + stwm %r28,4(%r26) + ldw -12(%r30),%r28 + stwm %r28,4(%r26) +#endif + + bv 0(%r2) + copy %r0,%r28 + .EXIT + .PROCEND + .align 4 + .EXPORT longjmp,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,RTNVAL=GR +longjmp + .PROC + .CALLINFO FRAME=64,NO_CALLS,SAVE_SP,ENTRY_GR=3 + .ENTRY + ldwm 4(%r26),%r30 + ldwm 4(%r26),%r2 + ldwm 4(%r26),%r3 + ldwm 4(%r26),%r4 + ldwm 4(%r26),%r5 + ldwm 4(%r26),%r6 + ldwm 4(%r26),%r7 + ldwm 4(%r26),%r8 + ldwm 4(%r26),%r9 + ldwm 4(%r26),%r10 + ldwm 4(%r26),%r11 + ldwm 4(%r26),%r12 + ldwm 4(%r26),%r13 + ldwm 4(%r26),%r14 + ldwm 4(%r26),%r15 + ldwm 4(%r26),%r16 + ldwm 4(%r26),%r17 + ldwm 4(%r26),%r18 + ldwm 4(%r26),%r27 +#ifdef FP + ldwm 4(%r26),%r28 + stw %r28,-16(%r30) + ldwm 4(%r26),%r28 + stw %r28,-12(%r30) + fldds -16(%r30),%fr12 + ldwm 4(%r26),%r28 + stw %r28,-16(%r30) + ldwm 4(%r26),%r28 + stw %r28,-12(%r30) + fldds -16(%r30),%fr13 + ldwm 4(%r26),%r28 + stw %r28,-16(%r30) + ldwm 4(%r26),%r28 + stw %r28,-12(%r30) + fldds -16(%r30),%fr14 + ldwm 4(%r26),%r28 + stw %r28,-16(%r30) + ldwm 4(%r26),%r28 + stw %r28,-12(%r30) + fldds -16(%r30),%fr15 +#endif + comclr,<> %r0,%r25,%r0 + ldi 1,%r25 + bv 0(%r2) + copy %r25,%r28 + .EXIT + .PROCEND diff --git a/lib/machine/hppa/strcat.S b/lib/machine/hppa/strcat.S new file mode 100644 index 0000000..9fcdd79 --- /dev/null +++ b/lib/machine/hppa/strcat.S @@ -0,0 +1,178 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* HPUX_ID: @(#) $Revision$ */ +/* + * strcat(s1, s2) + * + * Concatenate s2 on the end of s1. S1's space must be large enough. + * Return s1. + */ +#include "DEFS.h" + +#define d_addr r26 +#define s_addr r25 +#define tmp6 r24 +#define tmp1 r19 +#define tmp2 r20 +#define tmp3 r21 +#define tmp4 r22 +#define tmp5 arg3 +#define save r1 + + +ENTRY(strcat) + + comb,= r0,s_addr,done /* quit if s2=NULL */ + copy d_addr,ret0 /* The return value is the value of d_addr. DELAY SLOT*/ + +/* First look for end of s1 (d_addr) */ + + extru d_addr,31,2,tmp1 /* Extract the low two bits of the dest address. */ + combt,= tmp1,r0,dont_mask + dep 0,31,2,d_addr /*set word alignment */ + ldwm 4(d_addr),tmp2 + sh3add tmp1,r0,save /* build mask based on tmp1 */ + mtctl save,11 + zvdepi -2,32,save + or save,tmp2,tmp2 + uxor,nbz tmp2,r0,save +search: + b,n found_end /* nullified under uxor conditions above and below */ +dont_mask: + ldwm 4(d_addr),tmp2 + comib,tr r0,r0,search + uxor,nbz tmp2,r0,save + +found_end: /* at this point d_addr points to word */ + extru,<> save,7,8,r0 /* following word with null */ + addib,tr,n -4,d_addr,begin_copy /*set d_addr to end of s1 */ + extru,<> save,15,8,r0 + addib,tr,n -3,d_addr,begin_copy + extru,<> save,23,8,r0 + addi -1,d_addr,d_addr + addi -1,d_addr,d_addr + + +begin_copy: + + extru s_addr,31,2,tmp1 /* Extract the low two bits of the source address. */ + extru d_addr,31,2,tmp6 /* Extract the low two bits of the destination address. */ + sub,= tmp6,tmp1,tmp3 /* Compute the shift quantity and don't branch if tmp6=tmp1. */ + b not_aligned /* Not_aligned says that shifts Will be needed. */ + dep 0,31,2,s_addr /* Compute the word address of the source. DELAY SLOT. */ +/* aligned */ + + combt,= tmp6,r0,skip_mask + ldwm 4(0,s_addr),tmp1 /* tmp1 = *s_addr s_addr += 4 (DELAY SLOT) */ + sh3add tmp6,r0,save + mtctl save,r11 + zvdepi -2,32,save + or save,tmp1,tmp1 + uxor,nbz tmp1,r0,save + b,n first_null /* special case: null in first word */ + b,n skip_mask2 + +chunks: + b,n null_found /* delay slot for uxor below */ + +skip_mask2: + stbys,b,m tmp1,4(d_addr) + ldwm 4(s_addr),tmp1 +skip_mask: + comib,tr 0,0,chunks + uxor,nbz tmp1,r0,save + +/* Begin non_aligned code. */ + +not_aligned: + sh3add,>= tmp3,r0,tmp4 /* compute the shift amt.and skip load if tmp6 > tmp1. */ + ldwm 4(0,s_addr),tmp1 /* load up the first word from the source. tmp1 = *s_addr++ */ + ldwm 4(0,s_addr),tmp2 /* get either first or second word from source. */ + combt,= tmp6,r0,chunk2 /* don't mask if whole word is valid */ + mtctl tmp4,11 /* load the shift count into cr11 = shift count register. */ + vshd tmp1,tmp2,tmp3 /* position data ! (delay slot) */ + sh3add tmp6,r0,save /* setup r1 */ + mtctl save,r11 /* set-up cr11 for mask */ + zvdepi -2,32,save + or save, tmp3, tmp3 + uxor,nbz tmp3,r0,save + b,n first_null2 + b did_mask + mtctl tmp4,11 /* re-load the shift count into cr11 */ + +chunk2: + vshd tmp1,tmp2,tmp3 + uxor,nbz tmp3, r0, save + b,n null_found +did_mask: + stbys,b,m tmp3,4(0,d_addr) /* store ! */ + + ldwm 4(0,s_addr),tmp1 /* get next word ! */ + vshd tmp2,tmp1,tmp3 /* position data ! */ + uxor,nbz tmp3, r0, save + b,n null_found + stwm tmp3,4(d_addr) + comib,tr 0,0,chunk2 + ldwm 4(s_addr),tmp2 + + +null_found: /* adjust d_addr and store final word */ + + extru,<> save,7,8,r0 + addib,tr,n 1,d_addr,store_final + extru,<> save,15,8,r0 + addib,tr,n 2,d_addr,store_final + extru,<> save,23,8,r0 + addib,tr 3,d_addr,store_final2 + bv 0(r2) + stw save,0(d_addr) + +store_final: + bv 0(r2) +store_final2: + stbys,e save,0(d_addr) /* delay slot */ + +first_null: /* null found in first word of aligned (wrt d_addr) */ + addi -4,s_addr,s_addr + ldbx tmp6(s_addr),tmp4 + add tmp6,s_addr,s_addr + comib,= 0,tmp4,done + stbs,ma tmp4,1(d_addr) + ldbs 1(s_addr),tmp4 + comib,= 0,tmp4,done + stbs,ma tmp4,1(d_addr) + bv 0(r2) /* done */ + stbs 0,0(d_addr) + +first_null2: /* null found in first word of non-aligned (wrt d_addr) */ + addibt,= -1,tmp6,check3 /* check last 3 bytes of word */ + extru save,15,8,tmp4 + addibt,=,n -1,tmp6,check2 /* check last 2 bytes */ + bv 0(r2) + stbys,b save, 0(d_addr) + +check3: + combt,= tmp4,r0,done + stbs,ma tmp4,1(d_addr) +check2: + extru,<> save,23,8,tmp4 + bv 0(r2) + stbs,ma tmp4,1(d_addr) + bv 0(r2) + stbs r0,0(d_addr) + +done: +EXIT(strcat) diff --git a/lib/machine/hppa/strcmp.S b/lib/machine/hppa/strcmp.S new file mode 100644 index 0000000..007a648 --- /dev/null +++ b/lib/machine/hppa/strcmp.S @@ -0,0 +1,282 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* + + strcmp + + Jerry Huck + Edgar Circenis + +*/ +/* + * strcmp(s1, s2) + * + * returns integer: < 0 iff s1 lexicographically less than s2 + * > 0 iff s1 lexicographically greater than s2 + * = 0 iff s1 lexicographically equal to s2 + */ + +#include "DEFS.h" + +#define s1 26 +#define s2 25 +#define tmp1 19 +#define s2word 20 +#define tmp3 21 +#define tmp7 22 +#define s1word 23 +#define save 1 +#define tmp6 24 +#define tmp5 28 + +ENTRY(strcmp) + comb,=,n s1,s2,samestring + comib,=,n 0,s1,s1isnull + comib,=,n 0,s2,s2isnull +/* Hope for word alignment. Pick up low two bits of each adress */ + extru,<> s1,31,2,tmp1 + ldwm 4(s1),s1word + dep,= s2,29,2,tmp1 + b,n case_analysis + +/* Start looping until null is found in s1 or they mis-compare */ +loop: + ldwm 4(s2),s2word +loop_plus: + uxor,nbz s1word,r0,r0 /* Null in this? */ + b,n nullins1 + comb,=,n s1word,s2word,loop + ldwm 4(s1),s1word + +/* The words do not compare equal and s1 does not have a null. + Need to treat words as unsigned and generate either a positive + or negative return value */ +wordcomparereturn: + comclr,>> s1word,s2word,ret0 /*Set ret0 to 0 and skip if greater*/ + ldi -2,ret0 /*Set ret0 to -2 when less */ + bv r0(rp) + addi 1,ret0,ret0 /*Fix return value to be -1 or +1 */ + +/* s1 has a null. s2 has not been checked. */ +nullins1: + /*If s2 has no nulls this is simple, but assume that it might + and fix up s1 to allow the word comparision to work by + scanning s1 and duplicating all the bytes in s2 below that byte into + the remainder of s1. A remainder only exists if the zero byte + is found in the upper three bytes */ + extru,<> s1word,7,8,r0 /*in the first byte? */ + dep,tr s2word,31,24,s1word /*copy low 3 bytes of *s2 into *s1 */ + extru,<> s1word,15,8,r0 /*in the second byte? */ + dep,tr s2word,31,16,s1word /*copy low 2 bytes of *s2 into *s1 */ + extru,<> s1word,23,8,r0 /*in the third byte? */ + dep s2word,31,8,s1word /*copy low 1 byte of *s2 into *s1 */ + /* Do the normal unsigned compare and return */ + comclr,<> s1word,s2word,ret0 /*Set ret0 to 0 and skip if not equal */ + bv,n r0(rp) + comclr,>> s1word,s2word,ret0 /*Set ret0 to 0 and skip if greater*/ + ldi -2,ret0 /*Set ret0 to -2 when less */ + bv r0(rp) + addi 1,ret0,ret0 /*Fix return value to be -1 or +1 */ + +/* s1 and s2 are the same string and therefore equal */ +samestring: + bv r0(rp) + copy r0,ret0 +/* s1 is null. Treat as string of nulls. Therefore return + the negative of s2's first byte. s2 cannot be zero. */ +s1isnull: + ldbs 0(0,s2),ret0 + bv r0(rp) + sub 0,ret0,ret0 +/* s2 is null. Treat as string of nulls. Therefore return + s1's first byte. s1 cannot be zero. */ +s2isnull: + bv r0(rp) + ldbs 0(0,s1),ret0 + +case_analysis: + blr tmp1,r0 + nop + + /* + Case statement for non-aligned cases (we've already + checked the aligned case. + NOTE: for non-aligned cases, the absolute shift value + gets loaded into tmp3. + */ + + /* S2 S1 */ + nop /* 00 00 can't happen */ + nop + b shifts2 /* 00 01 */ + ldi 8,tmp3 /* load shift count (delay slot) */ + b shifts2 /* 00 10 */ + ldi 16,tmp3 /* load shift count (delay slot) */ + b shifts2 /* 00 11 */ + ldi 24,tmp3 /* load shift count (delay slot) */ + b shifts1_0 /* 01 00 */ + ldi 8,tmp3 /* load shift count (delay slot) */ + b eq_align1 /* 01 01 */ + ldbs,ma 1(s1),s1word + b shifts2 /* 01 10 */ + ldi 8,tmp3 /* load shift count (delay slot) */ + b shifts2 /* 01 11 */ + ldi 16,tmp3 /* load shift count (delay slot) */ + b shifts1_0 /* 10 00 */ + ldi 16,tmp3 /* load shift count (delay slot) */ + b shifts1 /* 10 01 */ + ldi 8,tmp3 /* load shift count (delay slot) */ + b eq_align2 /* 10 10 */ + ldhs,ma 2(s1),s1word + b shifts2 /* 10 11 */ + ldi 8,tmp3 /* load shift count (delay slot) */ + b shifts1_0 /* 11 00 */ + ldi 24,tmp3 /* load shift count (delay slot) */ + b shifts1 /* 11 01 */ + ldi 16,tmp3 /* load shift count (delay slot) */ + b shifts1 /* 11 10 */ + ldi 8,tmp3 /* load shift count (delay slot) */ + ldbs,ma 1(s1),s1word /* 11 11 */ + ldbs,ma 1(s2),s2word + sub,= s1word,s2word,ret0 /* if not equal, we can return now */ + bv,n r0(rp) + comclr,<> s1word,r0,ret0 + bv,n r0(rp) + b loop /* fall into main loop */ + ldwm 4(s1),s1word + +eq_align1: + ldbs,ma 1(s2),s2word + sub,= s1word,s2word,ret0 /* if not equal, we can return now */ + bv,n r0(rp) + comclr,<> s1word,r0,ret0 + bv,n r0(rp) + /* fall through to half-word aligned case */ + ldhs,ma 2(s1),s1word /* load next halfword */ +eq_align2: + ldhs,ma 2(s2),s2word /* load next halfword */ + /* form the mask: 0xffff0000 and mask leading nulls in s1word and s2word + so that we can fall into the main loop with word aligned data */ + ldi 16,save + mtctl save,r11 + zvdepi -2,32,save + or save,s1word,s1word + b loop_plus /* fall into main loop */ + or save,s2word,s2word + +/* s2's alignment is greater than s1's alignment, so we will shift s1 */ +shifts1_0: + addi -4,s1,s1 /* fix up s1 due to earlier read */ +shifts1: + extru s1,31,2,tmp1 + extru s2,31,2,tmp5 + dep r0,31,2,s1 /* Compute word address of s1 */ + dep r0,31,2,s2 /* Compute word address of s2 */ + ldwm 4(s1),s1word /* get first word of s1 */ + ldwm 4(s2),s2word /* get first word of s2 */ + combt,=,n r0,tmp1,masks2 /* Do we need to mask beginning of s1 */ + sh3add tmp1,r0,save /* save now has number of bits to mask */ + mtctl save,r11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word +masks2: + sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,r11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s2word,s2word + ldi -1,tmp7 /* load tmp7 with 0xffffffff */ + mtctl tmp3,r11 /* Move shift amount to CR11 */ +more: uxor,nbz s1word,r0,r0 /* Is there a null in s1? */ + b ends1 + vshd tmp7,s1word,save + combf,=,n save,s2word,cmps1 + ldwm 4(s1),tmp7 + ldwm 4(s2),s2word + uxor,nbz tmp7,r0,r0 /* is there a null in s1? */ + b ends1_0 + vshd s1word,tmp7,save + combf,=,n save,s2word,cmps1 + ldwm 4(s1),s1word + b more + ldwm 4(s2),s2word + +cmps1: movb,tr save,s1word,wordcomparereturn + nop + +ends1_0: + copy tmp7,s1word /* move tmp7 to s1word */ +ends1: + combf,=,n save,s2word,nullins1 /* branch if no match */ + copy save,s1word /* delay slot */ +/* At this point, we know that we've read a null */ +/* from s1, so we can't read more from s1 */ + uxor,nbz save,r0,r0 /* are the strings equal? */ + b,n samestring + vshd s1word,r0,s1word + b nullins1 + ldwm 4(s2),s2word + +/* s1's alignment is greater than s2's alignment, so we will shift s2 */ +shifts2: + extru s1,31,2,tmp1 + extru s2,31,2,tmp5 + dep r0,31,2,s1 /* Compute word address of s1 */ + dep r0,31,2,s2 /* Compute word address of s2 */ + ldwm 4(s2),s2word /* get first word of s2 */ + ldwm 4(s1),s1word /* get first word of s1 */ + combt,=,n r0,tmp5,masks1 /* Do we need to mask beginning of s2 */ + sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,r11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s2word,s2word +masks1: + sh3add tmp1,r0,save /* save now has number of bits to mask */ + mtctl save,r11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word + ldi -1,tmp7 /* load tmp7 with 0xffffffff */ + mtctl tmp3,r11 /* Move shift amount to CR11 */ +more1: uxor,nbz s2word,r0,r0 /* is there a null in s2? */ + b ends2 + vshd tmp7,s2word,save + combf,=,n s1word,save,cmps2 + ldwm 4(s2),tmp7 + ldwm 4(s1),s1word + uxor,nbz tmp7,r0,r0 /* is there a null in s2? */ + b ends2_0 + vshd s2word,tmp7,save + combf,=,n s1word,save,cmps2 + ldwm 4(s2),s2word + b more1 + ldwm 4(s1),s1word + +cmps2: movb,tr save,s2word,wordcomparereturn + nop + +ends2_0: + copy tmp7,s2word /* move tmp7 to s2word */ +ends2: + combf,=,n s1word,save,nullins1 /* branch if no match */ + copy save,s2word /* delay slot */ +/* At this point, we know that we've read a null */ +/* from s2, so we can't read more from s2 */ + uxor,nbz save,r0,r0 /* are the strings equal? */ + b,n samestring + vshd s2word,r0,s2word + b nullins1 + ldwm 4(s1),s1word + +EXIT(strcmp) diff --git a/lib/machine/hppa/strcpy.S b/lib/machine/hppa/strcpy.S new file mode 100644 index 0000000..3068cd5 --- /dev/null +++ b/lib/machine/hppa/strcpy.S @@ -0,0 +1,285 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* + A faster strcpy. + + by + + Jerry Huck (aligned case) + Daryl Odnert (equal-alignment case) + Edgar Circenis (non-aligned case) +*/ +/* + * strcpy(s1, s2) + * + * Copy string s2 to s1. s1 must be large enough. + * return s1 + */ + +#include "DEFS.h" + +#define d_addr r26 +#define s_addr r25 +#define tmp6 r24 +#define tmp1 r19 +#define evenside r19 +#define tmp2 r20 +#define oddside r20 +#define tmp3 r21 +#define tmp4 r22 +#define tmp5 arg3 +#define save r1 + + +ENTRY(strcpy) +/* Do some quick alignment checking on and fast path both word aligned */ + extru,<> s_addr,31,2,tmp6 /*Is source word aligned? */ + ldwm 4(0,s_addr),oddside /*Assume yes and guess that it + is double-word aligned. */ + dep,= d_addr,29,2,tmp6 /*Is target word aligned? */ + b case_analysis + copy d_addr,ret0 +/* Both are aligned. First source word already loaded assuming that + source was oddword aligned. Fall through (therefore fastest) code + shuffles the registers to join the main loop */ +bothaligned: + bb,>= s_addr,29,twoatatime /*Branch if source was odd aligned*/ + uxor,nbz oddside,r0,save + +/* Even aligned source. save holds that operand. + Do one iteration of the main copy loop juggling the registers to avoid + one copy. */ + b,n nullfound + ldwm 4(s_addr),oddside + stwm save,4(d_addr) + uxor,nbz oddside,r0,save + b,n nullfound + ldwm 4(s_addr),evenside + stwm oddside,4(d_addr) + uxor,nbz evenside,r0,save + b,n nullfound + ldwm 4(s_addr),oddside + +/* Main loop body. Entry expects evenside still to be stored, oddside + just loaded. */ +loop: + stwm evenside,4(d_addr) + uxor,nbz oddside,r0,save + +/* mid loop entry */ +twoatatime: + b,n nullfound + ldwm 4(s_addr),evenside + stwm oddside,4(d_addr) + uxor,sbz evenside,r0,save + b loop + ldwm 4(s_addr),oddside + +/* fall through when null found in evenside. oddside actually loaded */ +nullfound: /* adjust d_addr and store final word */ + + extru,<> save,7,8,r0 /* pick up leftmost byte */ + addib,tr,n 1,d_addr,store_final + extru,<> save,15,8,r0 + addib,tr,n 2,d_addr,store_final + extru,<> save,23,8,r0 + addib,tr 3,d_addr,store_final2 + bv 0(rp) + stw save,0(d_addr) + +store_final: + bv 0(rp) +store_final2: + stbys,e save,0(d_addr) /* delay slot */ + +case_analysis: + + blr tmp6,r0 + nop + + /* NOTE: the delay slots for the non-aligned cases load a */ + /* shift quantity which is TGT-SRC into tmp3. */ + /* Note also, the case for both strings being word aligned */ + /* is already checked before the BLR is executed, so that */ + /* case can never occur. */ + + /* TGT SRC */ + nop /* 00 00 can't happen */ + nop + b neg_aligned_copy /* 00 01 */ + ldi -1,tmp3 /* load shift quantity. delay slot */ + b neg_aligned_copy /* 00 10 */ + ldi -2,tmp3 /* load shift quantity. delay slot */ + b neg_aligned_copy /* 00 11 */ + ldi -3,tmp3 /* load shift quantity. delay slot */ + b pos_aligned_copy0 /* 01 00 */ + ldi 1,tmp3 /* load shift quantity. delay slot */ + b equal_alignment_1 /* 01 01 */ + ldbs,ma 1(s_addr),tmp1 + b neg_aligned_copy /* 01 10 */ + ldi -1,tmp3 /* load shift quantity. delay slot */ + b neg_aligned_copy /* 01 11 */ + ldi -2,tmp3 /* load shift quantity. delay slot */ + b pos_aligned_copy0 /* 10 00 */ + ldi 2,tmp3 /* load shift quantity. delay slot */ + b pos_aligned_copy /* 10 01 */ + ldi 1,tmp3 /* load shift quantity. delay slot */ + b equal_alignment_2 /* 10 10 */ + ldhs,ma 2(s_addr),tmp1 + b neg_aligned_copy /* 10 11 */ + ldi -1,tmp3 /* load shift quantity. delay slot */ + b pos_aligned_copy0 /* 11 00 */ + ldi 3,tmp3 /* load shift quantity. delay slot */ + b pos_aligned_copy /* 11 01 */ + ldi 2,tmp3 /* load shift quantity. delay slot */ + b pos_aligned_copy /* 11 10 */ + ldi 1,tmp3 /* load shift quantity. delay slot */ + ldbs,ma 1(s_addr),tmp1 /* 11 11 */ + comiclr,<> r0,tmp1,r0 + bv 0(rp) /* return if 1st byte was null */ + stbs,ma tmp1,1(d_addr) /* store a byte to dst string */ + b bothaligned /* can now goto word_aligned */ + ldwm 4(s_addr),oddside /* load next word of source */ + +equal_alignment_1: + comiclr,<> r0,tmp1,r0 /* nullify next if tmp1 <> 0 */ + bv 0(rp) /* return if null byte found */ + stbs,ma tmp1,1(d_addr) /* store a byte to dst string */ + ldhs,ma 2(s_addr),tmp1 /* load next halfword */ +equal_alignment_2: + extru,<> tmp1,23,8,tmp6 /* look at left byte of halfword */ + bv 0(rp) /* return if 1st byte was null */ + stbs,ma tmp6,1(d_addr) + extru,<> tmp1,31,8,r0 + bv 0(rp) /* return if 2nd byte was null */ + stbs,ma tmp1,1(d_addr) + b bothaligned + ldwm 4(s_addr),oddside /* load next word */ + +/* source and destination are not aligned, so we do it the hard way. */ + +/* target alignment is greater than source alignment */ +pos_aligned_copy0: + addi -4,s_addr,s_addr +pos_aligned_copy: + extru d_addr,31,2,tmp6 /* Extract low 2 bits of the dest addr */ + extru s_addr,31,2,tmp1 /* Extract low 2 bits of the src addr */ + dep r0,31,2,s_addr /* Compute word address of the source. */ + sh3add tmp3,r0,tmp4 /* compute shift amt */ + ldwm 4(0,s_addr),tmp2 /* get 1st source word */ + sh3add tmp1,r0,save /* setup mask shift amount */ + mtctl save,r11 /* set-up cr11 for mask */ + zvdepi -2,32,save /* create mask */ + or save,tmp2,tmp2 /* mask unused bytes in src */ + ldi -1,tmp1 /* load tmp1 with 0xffffffff */ + mtctl tmp4,r11 /* shift count -> shift count reg */ + vshd tmp1,tmp2,tmp3 /* position data ! */ + uxor,nbz tmp3,r0,save + b,n first_null + uxor,nbz tmp2,r0,save + b nullfound1 + mtctl tmp4,r11 /* re-load shift cnt (delay slot) */ + b loop_entry + ldwm 4(0,s_addr),tmp1 /* get next word. delay slot */ + +neg_aligned_copy: + extru d_addr,31,2,tmp6 /* Extract low 2 bits of the dest addr */ + extru s_addr,31,2,tmp2 /* Extract low 2 bits of the src addr */ + dep r0,31,2,s_addr /* Compute word address of the source. */ + sh3add tmp3,r0,tmp4 /* compute shift amt */ + ldwm 4(0,s_addr),tmp1 /* load first word from source. */ +/* check to see if next word can be read safely */ + sh3add tmp2,r0,save + mtctl save,r11 /* shift count -> shift count reg */ + zvdepi -2,32,save + or save, tmp1, tmp1 + uxor,nbz tmp1,r0,save /* any nulls in first word? */ + b first_null0 + mtctl tmp4,r11 + ldwm 4(0,s_addr),tmp2 /* load second word from source */ + combt,= tmp6,r0,chunk1 /* don't mask if whole word valid */ + vshd tmp1,tmp2,tmp3 /* position data ! */ + sh3add tmp6,r0,save /* setup r1 */ + mtctl save,r11 /* set-up cr11 for mask */ + zvdepi -2,32,save + or save, tmp3, tmp3 + uxor,nbz tmp3,r0,save + b,n first_null + uxor,nbz tmp2,r0,save + b nullfound1 + mtctl tmp4,r11 /* re-load shift cnt (delay slot) */ + b loop_entry + ldwm 4(0,s_addr),tmp1 /* get next word. delay slot */ + +chunk1: + uxor,nbz tmp2,r0,save + b nullfound0 + vshd tmp1,tmp2,tmp3 +did_mask: + ldwm 4(0,s_addr),tmp1 /* get next word ! */ +loop_entry: + stbys,b,m tmp3,4(0,d_addr) /* store ! */ + + uxor,nbz tmp1, r0, save + b nullfound2 + vshd tmp2,tmp1,tmp3 /* position data ! */ + ldwm 4(s_addr),tmp2 + stwm tmp3,4(d_addr) + uxor,sbz tmp2,r0,save + b did_mask +nullfound0: + vshd tmp1,tmp2,tmp3 /* delay slot */ + uxor,nbz tmp3,r0,save + b,n nullfound +nullfound1: + stbys,b,m tmp3,4(0,d_addr) + b nullfound + vshd tmp2,r0,save /* delay slot */ + +nullfound2: + uxor,nbz tmp3,r0,save + b,n nullfound + stwm tmp3,4(d_addr) + b nullfound + /* notice that delay slot is in next routine */ + +first_null0: /* null found in first word of non-aligned (wrt d_addr) */ + vshd tmp1,r0,save /* delay slot */ + combt,= tmp6,r0,check4 + extru save,7,8,tmp4 +first_null: + addibt,= -1,tmp6,check3 /* check last 3 bytes of word */ + extru save,15,8,tmp4 + addibt,=,n -1,tmp6,check2 /* check last 2 bytes */ + bv 0(rp) /* null in last byte--store and exit */ + stbys,b save, 0(d_addr) + +check4: + combt,= tmp4,r0,done + stbs,ma tmp4,1(d_addr) + extru,<> save,15,8,tmp4 +check3: + combt,= tmp4,r0,done + stbs,ma tmp4,1(d_addr) +check2: + extru,<> save,23,8,tmp4 + bv 0(rp) + stbs,ma tmp4,1(d_addr) + bv 0(rp) + stbs r0,0(d_addr) + +done: +EXIT(strcpy) diff --git a/lib/machine/hppa/strlen.S b/lib/machine/hppa/strlen.S new file mode 100644 index 0000000..12e9ef2 --- /dev/null +++ b/lib/machine/hppa/strlen.S @@ -0,0 +1,79 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* HPUX_ID = "@(#) $Revision$" */ +/* strlen(s): Return length of string s */ + +#define start arg0 +#define end ret0 +#define tmp1 arg1 +#define tmp2 arg2 + +#include "DEFS.h" + +ENTRY(strlen) + movb,=,n start,end,$null_ptr + depi 0,31,2,end + comb,<> start,end,$not_aligned + ldws,ma 4(end),tmp1 + comib,tr 0,0,$loop /* avoid INDIGO two register interlock */ + uxor,nbz 0,tmp1,0 +$not_aligned: + /* + ; Tricky code. The problem is that the value of of the word + ; including the start of the string has some garbage bytes that + ; may be 0. We don't want them to stop the string scan. So + ; we make those bytes non-zero (and any old non-zero value + ; will do). Notice that the end pointer has been rounded + ; down to a word boundary, and then incremented to the next + ; word by the time we get here. Therefore, (start-end) has + ; one of the values (-3, -2, or -1). Use uaddcm to do the + ; subtraction (instead of sub), and the result will be + ; (-4, -3, or -2). Multiply this by 8, and put into the + ; shift register (which truncates to the last 5 bits) and + ; the value will be (0, 8, or 16). Use this as a bit position, + ; and drop a mask down into tmp1. All the garbage bytes will + ; have at least 1 bit affected by the vdepi, so all the garbage + ; in this first word will be non-zero garbage. + */ + uaddcm start,end,tmp2 /* tmp2 <- { -4, -3, -2 } */ + sh3add tmp2,0,tmp2 /* tmp2 <- { -32, -24, -16 } */ + mtsar tmp2 /* sar <- { 0, 8, 16 } */ + vdepi -1,32,tmp1 + uxor,nbz 0,tmp1,0 +$loop: + b,n $end_loop + ldws,ma 4(end),tmp1 + comib,tr 0,0,$loop /* avoid INDIGO two register interlock */ + uxor,nbz 0,tmp1,0 +$end_loop: + /* adjust the end pointer to one past the end of the string */ + extru,<> tmp1,7,8,0 + addib,tr,n -3,end,$out + extru,<> tmp1,15,8,0 + addib,tr,n -2,end,$out + extru,<> tmp1,23,8,0 + addi -1,end,end +$out: + bv 0(rp) + /* + ; tricky code. the end pointer is just beyond the terminating + ; null byte, so the length is (end-start-1). use uaddcm + ; to do this in 1 instruction + */ + uaddcm end,start,ret0 + +$null_ptr: +EXIT(strlen) diff --git a/lib/machine/hppa/strncat.S b/lib/machine/hppa/strncat.S new file mode 100644 index 0000000..04bd156 --- /dev/null +++ b/lib/machine/hppa/strncat.S @@ -0,0 +1,238 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/*HPUX_ID: @(#) $Revision$ */ +/* strncat(s1,s2,n) : concatonate at most n characters from s2 onto s1 */ + +#include "DEFS.h" + +#define d_addr r26 +#define s_addr r25 +#define count r24 +#define tmp1 r19 +#define tmp2 r20 +#define tmp3 r21 +#define tmp4 r22 +#define tmp5 arg3 +#define tmp6 r31 +#define save r1 +#define tmp7 ret1 /* source offset-- reset to orig source addr if not aligned */ + + +ENTRY(strncat) + + comb,= r0,s_addr,quit /* quit if s2=NULL */ + copy d_addr,ret0 /* The return value is the value of d_addr. DELAY SLOT*/ + +/* First look for end of s1 (d_addr) */ + + extru d_addr,31,2,tmp1 /* Extract the low two bits of the dest address. */ + combt,= tmp1,r0,dont_mask + dep 0,31,2,d_addr /*set word alignment */ + ldwm 4(d_addr),tmp2 + sh3add tmp1,r0,save /* build mask based on tmp1 */ + mtctl save,11 + zvdepi -2,32,save + or save,tmp2,tmp2 + uxor,nbz tmp2,r0,save +search: + b,n found_end /* nullified under uxor conditions above and below */ +dont_mask: + ldwm 4(d_addr),tmp2 + comib,tr r0,r0,search + uxor,nbz tmp2,r0,save + +found_end: /* at this point d_addr points to word */ + extru,<> save,7,8,r0 /* following word with null */ + addib,tr,n -4,d_addr,begin_copy /*set d_addr to end of s1 */ + extru,<> save,15,8,r0 + addib,tr,n -3,d_addr,begin_copy + extru,<> save,23,8,r0 + addi -1,d_addr,d_addr + addi -1,d_addr,d_addr + + +begin_copy: + addibt,<,n -4,count,byteloop /* If count is <= 4 don't get fancy.*/ + + extru s_addr,31,2,tmp4 /* Extract the low two bits of the source address.*/ + extru d_addr,31,2,tmp5 /* Extract the low two bits of the destination address.*/ + add count,tmp5,count /* pre increment the count by the byte address so that the count is*/ + copy s_addr,tmp6 /* save original s_addr in case we find null in first word */ + copy s_addr, tmp7 /* save s_addr in case we find null before first store */ + comb,<> tmp5,tmp4,not_aligned /* branch if tmp5<>tmp4. */ + dep 0,31,2,s_addr /* Compute the word address of the source. DELAY SLOT.*/ +/* aligned*/ + combt,= tmp5,r0,skip_mask + ldwm 4(0,s_addr),tmp1 /* tmp1 = *s_addr s_addr += 4 (DELAY SLOT)*/ + sh3add tmp5,r0,save /* compute mask in save*/ + mtctl save,11 + zvdepi -2,32,save + or save,tmp1,tmp1 /* or mask with data*/ + uxor,nbz tmp1,r0,save /* check for null*/ + b,n null1 + addibt,< -4,count,back_porch + stbys,b,m tmp1,4(0,d_addr) /* store word (delay slot)*/ + +chunks: + ldwm 4(0,s_addr),tmp1 /* get a word*/ + +skip_mask: + uxor,nbz tmp1,r0,save /* check for null*/ + b,n align_null1 + addibf,< -4,count,chunks + stbys,b,m tmp1,4(0,d_addr) /* store word (delay slot)*/ + +back_porch: /* last word to store*/ + addibt,=,n 4,count,done /* if count = 0 we're, of course, done !*/ + ldws 0(s_addr),tmp1 /* load up the back_porch*/ + sh3add count,r0, save /* setup right mask based on count*/ + mtctl save,r11 + zvdepi -2,32,save /*save now has left-hand mask*/ + uaddcm r0,save,save /*form right hand mask */ + or tmp1,save,tmp1 /*and insert data*/ + uxor,nbz tmp1,r0,save /* check for null*/ + b,n null2 + add d_addr,count,d_addr/* final store address is +1 too high !*/ + b done + stbys,e tmp1,0(d_addr) /* done */ + +/* Begin non_aligned code. */ +not_aligned: + sub,>= tmp5,tmp4,tmp6 /* compute the shift amt.and skip load if tmp5 > tmp4.*/ + ldwm 4(0,s_addr),tmp1 /* load up the first word from the source. tmp1 = *s_addr++*/ + zdep tmp6,28,29,tmp4 /* compute the number of bits to shift */ + mtctl tmp4,11 /* load the shift count into cr11 = shift count register.*/ + addibt,<,n -4,count,chkchnk2 /* first step in pre adjustment of count for looping.*/ + + ldwm 4(0,s_addr),tmp2 /* get either first or second word from source. */ + combt,= tmp5,r0,skip_mask4 /* don't mask if whole word is valid*/ + vshd tmp1,tmp2,tmp3 /* position data ! (delay slot)*/ + sh3add tmp5,r0,save /* setup r1*/ + mtctl save,r11 /* setup mask in save*/ + zvdepi -2,32,save + or save, tmp3, tmp3 + mtctl tmp4,11 /* re-load the shift count into cr11 */ + +skip_mask4: + uxor,nbz tmp3, r0, save + b,n null4 /* special case for first word */ + copy r0, tmp5 /* zero out tmp5 so we don't try to mask again*/ + copy r0, tmp7 /* zero out tmp7 so we don't try to use original s_addr anymore */ + b continue + stbys,b,m tmp3,4(0,d_addr) /* store ! */ + +chunk2: + ldwm 4(0,s_addr),tmp2 + vshd tmp1,tmp2,tmp3 + +skip_mask2: + uxor,nbz tmp3, r0, save + b,n null3 + stbys,b,m tmp3,4(0,d_addr) /* store ! */ + +continue: + ldwm 4(0,s_addr),tmp1 /* get 2nd word ! */ + vshd tmp2,tmp1,tmp3 /* position data ! */ + uxor,nbz tmp3, r0, save + b,n null3 + + addibf,< -8,count,chunk2 /* If count is still >= 8 do another loop.*/ + stbys,b,m tmp3,4(0,d_addr) /* store !*/ + +chkchnk2: + addibt,<,n 4,count,bp_0 /* if we don't have 4 bytes left then do the back porch (bp_0)*/ + +subchnk2: /* we have less than 8 chars to copy*/ + + ldwm 4(0,s_addr),tmp2 /* get next word !*/ + combt,= tmp5,r0,skip_mask3 + vshd tmp1,tmp2,tmp3 /* position data !*/ + sh3add tmp5,r0,save /* setup r1*/ + mtctl save,r11 /* setup mask in save*/ + zvdepi -2,32,save + or save, tmp3, tmp3 + mtctl tmp4,11 /* restore shift value again */ +skip_mask3: + uxor,nbz tmp3,r0,save + b,n null3 + copy r0,tmp5 /* zero out tmp5 so null3 does correct alignment */ + copy r0,tmp7 /* zero out tmp7 so we don't use orignal s_addr since no longer valid */ + b bp_1 /* we now have less than 4 bytes to move*/ + stbys,b,m tmp3,4(0,d_addr) /* store !*/ + +bp_0: + copy tmp1,tmp2 /* switch registers for shift process */ + addibt,<=,n 4,count,done /* if count = -4 this implies that count = 0 -> done */ + +bp_1: + ldwm 4(0,s_addr),tmp1 /* get final word ! */ + vshd tmp2,tmp1,tmp3 /* position data !*/ + uxor,nbz tmp3,r0,save /* if no-byte-zero */ + b,n bp_null /* don't goto no_null-find which null instead */ +no_null: + add d_addr,count,d_addr /* set up d_addr for stbys,e */ + b done /* were done*/ + stbys,e tmp3,0(0,d_addr) /* store the data !*/ + +/* here we do ye old byte-at-a-time moves.*/ +align_null1: + b byteloop + addi -4,s_addr,s_addr +null1: + copy tmp6,s_addr /* restore orig s_addr (aligned only) */ +byteloop: + addibt,= 4,count,done +null2: + ldbs,ma 1(s_addr),tmp1 +encore: + combt,=,n tmp1,r0, done + stbs,ma tmp1,1(d_addr) + addibf,=,n -1,count,encore + ldbs,ma 1(s_addr),tmp1 + b,n done + +bp_null: + addi -4,count,count /* fudge count 'cause byteloop will re-increment */ + +null3: /* not_aligned case reset s_addr and finish byte-wise */ + combt,=,n r0,tmp7,null3a /* if tmp7 is not valid address then branch below */ + b byteloop /* otherwise reset s_addr to tmp7 and finish */ + copy tmp7, s_addr + +null3a: /* right shift target */ + addibt,<,n 0,tmp6,null3b /* if left shifting */ + sub r0,tmp6,tmp6 /* do null3b code */ + addi -4,tmp6,tmp6 + b byteloop + add tmp6,s_addr,s_addr /* reset s_addr by 4 + shift_amt */ + +null3b: + subi -8,tmp6,tmp6 + add tmp5,tmp6,tmp6 /* adjust by the dest offset if this is our first store */ + b byteloop + add tmp6,s_addr,s_addr /* adjust s_addr by (8-shift_amt-dest_off) */ + +null4: + add,> tmp6,r0,tmp6 /* if left shift */ + b,n null3 /* then do null3 */ + b byteloop + addi -4,s_addr,s_addr /* adj source only by 4 */ + +done: + bv 0(r2) + stbs r0,0(d_addr) +quit: +EXIT(strncat) diff --git a/lib/machine/hppa/strncmp.S b/lib/machine/hppa/strncmp.S new file mode 100644 index 0000000..222384e --- /dev/null +++ b/lib/machine/hppa/strncmp.S @@ -0,0 +1,189 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* strcmp(s1, s2) */ +/* returns integer: < 0 iff s1 lexicographically less than s2 */ +/* > 0 iff s1 lexicographically greater than s2 */ +/* = 0 iff s1 lexicographically equal to s2 */ +/* = 0 iff s1 lexicographically equal to s2 */ +/* quit after n charachters */ +#include "DEFS.h" + +#define s1 26 +#define s2 25 +#define tmp1 19 +#define s2word 20 +#define tmp3 21 +#define tmp7 22 +#define s1word 29 +#define save 1 +#define tmp6 23 +#define tmp5 28 +#define count 24 + +ENTRY(strncmp) + combt,<,n r0,count,search /* N <= 0 yields equality */ + bv r0(rp) /* */ + copy 0,ret0 /* return 0 (DELAY SLOT) */ +search: combf,=,n s1,s2,findout /* s1 != s2? */ + bv r0(rp) /* */ + copy 0,ret0 /* return 0 (delay slot) */ +findout: + comibf,=,n 0,s1,checks1 /* s1 == NULL? */ + ldbs 0(0,s2),ret0 /* */ + bv r0(rp) /* */ + subi 0,ret0,ret0 /* ret0 <- -*s2 */ +checks1: + comibf,=,n 0,s2,checkitout /* s2 == NULL? */ + bv r0(rp) /* */ + ldbs 0(0,s1),28 /* return *s1 */ + +checkitout: + extru s2,31,2,tmp1 /* Extract the low two bits of the s2. */ + extru s1,31,2,tmp5 /* Extract the low two bits of the s1 */ + sub,= tmp5,tmp1,tmp3 /* Are s1 & s2 aligned with each other? */ + b not_aligned /* It's more complicated (not_aligned) */ + dep 0,31,2,s1 /* Compute word address of s1 (DELAY SLOT) */ + dep 0,31,2,s2 /* Compute word address of s2 */ + ldwm 4(0,s1),s1word /* get next s1 word s1+=4 */ + combt,= tmp5,r0,skipmask /* skip masking, if we can */ + ldwm 4(0,s2),s2word /* get next s2 word s2+=4 (DELAY SLOT) */ + add tmp5,count,count /* bump count by the number of bytes */ + /* we are going to mask */ + sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word /* mask s1word (s1) */ + or save,s2word,s2word /* mask s2word (s2) */ + + +skipmask: + combt,=,n s1word,s2word,chknulls /* are these words equal? */ + +checkbyte: + extru s1word,7,8,tmp3 /* get first byte (character) */ +ckbyte2: extru s2word,7,8,tmp7 /* get first byte (character) */ + combf,= tmp3,tmp7,done /* quit if first byte is not equal */ + sub tmp3,tmp7,ret0 /* return difference (delay slot) */ + comibt,=,n 0,tmp3,done /* have we reached the end of string */ + /* if so done ret0 already has zero */ + addibt,<=,n -1,count,done /* have we checked N chars? ret0 == 0 */ + extru s1word,15,8,tmp3 /* get second byte (character) */ + extru s2word,15,8,tmp7 /* get second byte (character) */ + combf,= tmp3,tmp7,done /* quit if second byte is not equal */ + sub tmp3,tmp7,ret0 /* return difference (delay slot) */ + comibt,=,n 0,tmp3,done /* have we reached the end of string */ + /* if so done ret0 already has zero */ + addibt,<=,n -1,count,done /* have we checked N chars? */ + extru s1word,23,8,tmp3 /* get third byte (character) */ + extru s2word,23,8,tmp7 /* get third byte (character) */ + combf,= tmp3,tmp7,done /* done if third byte is not equal */ + sub tmp3,tmp7,ret0 /* return difference (delay slot) */ + comibt,=,n 0,tmp3,done /* have we reached the end of string */ + /* if so done ret0 already has zero */ + addibt,<=,n -1,count,done /* have we checked N chars? */ + extru s1word,31,8,tmp3 /* get last byte (character) */ + extru s2word,31,8,tmp7 /* get last byte (character) */ + bv r0(rp) /* */ + sub tmp3,tmp7,ret0 /* the last characters in the word is */ + /* where the difference is, so return */ + /* the difference and we're outta here */ + + +chknulls: + addibt,<=,n -4,count,zero /* have we checked N chars? */ + uxor,nbz s1word,0,0 /* don't have to check s2 Just quit */ + bv r0(rp) /* */ + copy 0,28 /* return 0 */ + ldwm 4(0,s2),s2word /* get next s2 word s2+=4 */ + b skipmask /* keep checking */ + ldwm 4(0,s1),s1word /* get next s1 word s1+=4 */ + + +not_aligned: + dep r0,31,2,s2 /* Compute word address of s2 */ + combt,<,n r0,tmp3,shifts1 /* Do we shift s1 or s2 */ + sh3add tmp3,r0,tmp3 /* eight bits per byte so mul by 8 */ + ldwm 4(0,s1),s1word /* get first word of s1 */ + ldwm 4(0,s2),s2word /* get first word or s2 */ + combt,=,n r0,tmp5,masks2 /* Do we need to mask beginning of s1 */ + add tmp5,count,count /* bump count by the number of bytes */ + /* we are going to mask */ + sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word /* */ +masks2: sh3add tmp1,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s2word,s2word /* */ + mtctl tmp3,11 /* Move shift amount to CR11 */ +more: uxor,nbz s2word,r0,r0 /* Is there a null in first word */ + b,n chunk1 /* */ + ldwm 4(0,s2),tmp7 /* load second word to enable us to shift */ + vshd s2word,tmp7,s2word /* */ + combf,=,n s1word,s2word,ckbyte2 /* */ + extru s1word,7,8,tmp3 /* get first byte (DELAY SLOT) */ + addibt,<=,n -4,count,zero /* have we checked N chars? */ + uxor,nbz s1word,0,0 /* even though they're equal we could be done */ + b,n zero + copy tmp7,s2word /* */ + b more /* keep checking */ + ldwm 4(0,s1),s1word /* get next s1 (DELAY SLOT) */ + +chunk1: + vshd s2word,r0,s2word /* */ + b ckbyte2 /* */ + extru s1word,7,8,tmp3 /* */ + + +shifts1: + sh3add tmp3,r0,tmp3 /* eight bits per byte so mul by 4 */ + sub r0,tmp3,tmp3 /* Get negative value for left shift */ + ldwm 4(0,s2),s2word /* get first word of s2 */ + ldwm 4(0,s1),s1word /* get first word or s1 */ + combt,=,n r0,tmp1,masks1 /* Do we need to mask beginning of s2 */ + add tmp1,count,count /* bump count by the number of bytes */ + /* we are going to mask */ + sh3add tmp1,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s2word,s2word /* */ +masks1: sh3add tmp5,r0,save /* save now has number of bits to mask */ + mtctl save,11 + zvdepi -2,32,save /* load save with proper mask */ + or save,s1word,s1word /* */ + mtctl tmp3,11 /* Move shift amount to CR11 */ +more1: uxor,nbz s1word,r0,r0 /* Is there a null in first byte */ + b,n chunk2 /* */ + ldwm 4(0,s1),tmp7 /* load second word to enable us to shift */ + vshd s1word,tmp7,s1word /* */ + combf,=,n s2word,s1word,ckbyte2 /* */ + extru s1word,7,8,tmp3 /* get first byte (DELAY SLOT) */ + addibt,<=,n -4,count,zero /* have we checked N chars? */ + uxor,nbz s2word,0,0 /* even though they're equal we could be done */ + b,n zero /* zero ret0 and quit */ + copy tmp7,s1word /* */ + b more1 /* keep checking */ + ldwm 4(0,s2),s2word /* get next s2 (DELAY SLOT) */ + +chunk2: + vshd s1word,r0,s1word /* */ + b ckbyte2 /* */ + extru s1word,7,8,tmp3 /* */ + +zero: copy r0,ret0 +done: +EXIT(strncmp) diff --git a/lib/machine/hppa/strncpy.S b/lib/machine/hppa/strncpy.S new file mode 100644 index 0000000..37ed832 --- /dev/null +++ b/lib/machine/hppa/strncpy.S @@ -0,0 +1,256 @@ +/* + * (c) Copyright 1986 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided "AS IS" + * without any express or implied warranty: + * permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies, and that the name of Hewlett-Packard Company not be + * used in advertising or publicity pertaining to distribution + * of the software without specific, written prior permission. + * Hewlett-Packard Company makes no representations about the + * suitability of this software for any purpose. + */ + +/* HPUX_ID: @(#) $Revision$ */ +/* + * strncpy(s1, s2, n) + * + * Copy s2 to s1, truncating or null-padding to always copy n bytes + * return s1 + */ + +#include "DEFS.h" + +#define d_addr r26 +#define s_addr r25 +#define count r24 +#define tmp1 r19 +#define tmp2 r20 +#define tmp3 r21 +#define tmp4 r22 +#define tmp5 arg3 +#define save r1 + + +ENTRY(strncpy) + + combt,= s_addr,r0,pad_null_bytes1 /* if s2==NULL then pad nulls and exit */ + copy d_addr,ret0 /* The return value is defined to be the value of d_addr. DELAY SLOT*/ + addibt,<,n -4,count,byteloop /* If count is <= 4 don't get fancy.*/ + + extru s_addr,31,2,tmp1 /* Extract the low two bits of the source address.*/ + extru d_addr,31,2,tmp5 /* Extract the low two bits of the destination address.*/ + add count,tmp5,count /* pre increment the count by the byte address so that the count is*/ + comb,<> tmp5,tmp1,not_aligned /* branch if tmp5<>tmp1. */ + dep 0,31,2,s_addr /* Compute the word address of the source. DELAY SLOT.*/ +/* aligned*/ + combt,= tmp5,r0,skip_mask + ldwm 4(0,s_addr),tmp1 /* tmp1 = *s_addr s_addr += 4 (DELAY SLOT)*/ + sh3add tmp5,r0,save /* compute mask in save*/ + mtctl save,11 + zvdepi -2,32,save + b skip_mask /* don't reload tmp1*/ + or save,tmp1,tmp1 /* or mask with data*/ + +chunks: + ldwm 4(0,s_addr),tmp1 /* get a word*/ + +skip_mask: + uxor,nbz tmp1,r0,save /* check for null*/ + b,n null1 + addibf,< -4,count,chunks + stbys,b,m tmp1,4(0,d_addr) /* store word (delay slot)*/ + +/* back_porch last word to store*/ + addibt,=,n 4,count,done /* if count = 0 we're, of course, done !*/ + ldws 0(s_addr),tmp1 /* load up the back_porch*/ + add d_addr,count,d_addr/* final store address is +1 too high !*/ + sh3add count,r0, save /* setup right mask based on count*/ + mtctl save,r11 + zvdepi -2,32,save /*save now has left-hand mask*/ + uaddcm r0,save,save /*form right hand mask */ + or tmp1,save,tmp1 /*and insert data*/ + uxor,nbz tmp1,r0,save /* check for null*/ + b,n null2 + bv 0(r2) + stbys,e tmp1,0(d_addr) /* done */ + +/* Begin non_aligned code. */ +not_aligned: + sub,>= tmp5,tmp1,tmp3 /* compute the shift amt.and skip load if tmp5 > tmp1.*/ + ldwm 4(0,s_addr),tmp1 /* load up the first word from the source. tmp1 = *s_addr++*/ + zdep tmp3,28,29,tmp4 /* compute the number of bits to shift */ + mtctl tmp4,11 /* load the shift count into cr11 = shift count register.*/ + addibt,<,n -4,count,chkchnk2 /* first step in pre adjustment of count for looping.*/ + + ldwm 4(0,s_addr),tmp2 /* get either first or second word from source. */ + combt,= tmp5,r0,skip_mask2 /* don't mask if whole word is valid*/ + vshd tmp1,tmp2,tmp3 /* position data ! (delay slot)*/ + sh3add tmp5,r0,save /* setup r1*/ + mtctl save,r11 /* setup mask in save*/ + zvdepi -2,32,save + or save, tmp3, tmp3 + mtctl tmp4,11 /* re-load the shift count into cr11 */ + b skip_mask2 + copy r0, tmp5 /* zero out tmp5 so we don't try to mask again*/ + +chunk2: + ldwm 4(0,s_addr),tmp2 + vshd tmp1,tmp2,tmp3 + +skip_mask2: + uxor,nbz tmp3, r0, save + b,n null3 + stbys,b,m tmp3,4(0,d_addr) /* store ! */ + + ldwm 4(0,s_addr),tmp1 /* get 2nd word ! */ + vshd tmp2,tmp1,tmp3 /* position data ! */ + uxor,nbz tmp3, r0, save + b,n null4 + + addibf,< -8,count,chunk2 /* If count is still >= 8 do another loop.*/ + stbys,b,m tmp3,4(0,d_addr) /* store !*/ + +chkchnk2: + addibt,<,n 4,count,bp_0 /* if we don't have 4 bytes left then do the back porch (bp_0)*/ + +subchnk2: /* we have less than 8 chars to copy*/ + + ldwm 4(0,s_addr),tmp2 /* get next word !*/ + combt,= tmp5,r0,skip_mask3 + vshd tmp1,tmp2,tmp3 /* position data !*/ + sh3add tmp5,r0,save /* setup r1*/ + mtctl save,r11 /* setup mask in save*/ + zvdepi -2,32,save + or save, tmp3, tmp3 + mtctl tmp4,11 /* restore shift value again */ + copy r0, tmp5 /* zero out tmp5 so we don't try to mask again*/ +skip_mask3: + uxor,nbz tmp3,r0,save + b,n null4 + b bp_1 /* we now have less than 4 bytes to move*/ + stbys,b,m tmp3,4(0,d_addr) /* store !*/ + +bp_0: + copy tmp1,tmp2 /* switch registers used in the shift process.*/ + addibt,<=,n 4,count,done /* if count = -4 this implies that count = 0 -> done */ + +bp_1: + ldwm 4(0,s_addr),tmp1 /* get final word ! */ + vshd tmp2,tmp1,tmp3 /* position data !*/ + uxor,sbz tmp3,r0,save /* if some-byte-zero */ + b no_null /* don't goto no_null-find which null instead */ + add d_addr,count,d_addr /* get d_addr ready for stbys,e */ + extru,<> save,7,8,r0 + b found_null5 + copy r0, tmp5 + extru,<> save,15,8,r0 + b found_null5 + ldil 0x1FE000,tmp5 /* setup mask (FF000000)*/ + extru,<> save,23,8,r0 + b found_null5 + ldil 0x1FFFE0,tmp5 /* setup mask (FFFF0000)*/ + ldo -1(r0),tmp5 /* setup mask (FFFFFFFF)*/ +found_null5: + and tmp3,tmp5,tmp3 /* zero out tmp5 based on mask in tmp5*/ +no_null: + bv 0(r2) /* were done*/ + stbys,e tmp3,0(0,d_addr) /* store the data !*/ + +/* here we do ye old byte-at-a-time moves.*/ +byteloop: + addibt,=,n 4,count,done + comb,= 0,s_addr,done + stbs r0,0(d_addr) /* store null in case s_addr == NULL */ + ldbs,ma 1(s_addr),tmp1 +encore: + combt,=,n tmp1,r0, pad_null_bytes1 + stbs,ma tmp1,1(d_addr) + addibf,=,n -1,count,encore + ldbs,ma 1(s_addr),tmp1 + b,n done + +pnb_1: + addibt,=,n 4,count,done /* if count was already 0 then we're done*/ + +pad_null_bytes1: + combt,=,n count,r0,done /* if count==0 then exit */ +pad_null_bytes2: + addibf,= -1,count,pad_null_bytes2 + stbs,ma r0,1(d_addr) + b,n done + +pad_nulls: + addibf,<=,n -4,count,pad_nulls + stwm r0,4(d_addr) + b,n pnb_1 + + +null1: + extru,<> save,7,8,r0 + b found_null1 + copy r0, tmp5 + extru,<> save,15,8,r0 + b found_null1 + ldil 0x1FE000,tmp5 /* setup mask (FF000000)*/ + extru,<> save,23,8,r0 + b found_null1 + ldil 0x1FFFE0,tmp5 /* setup mask (FFFF0000)*/ + ldo -1(r0),tmp5 /* setup mask (FFFFFFFF)*/ +found_null1: + and tmp1,tmp5,tmp1 /*zero out tmp1 according to mask*/ + b pad_nulls /* nullify remaining count bytes*/ + stbys,b,m tmp1,4(0,d_addr) /* first word (account for alignment)*/ + + +null2: /* back porch case. We have less than 4 bytes to go.*/ + extru,<> save,7,8,r0 /* is null in 1st byte? */ + b found_null2 + copy r0, tmp5 + extru,<> save,15,8,r0 /* is null in 2nd byte? */ + b found_null2 + ldil 0x1FE000,tmp5 /* setup mask (FF000000)*/ + b found_null2 /* null must be in 3rd byte */ + ldil 0x1FFFE0,tmp5 /* setup mask (FFFF0000)*/ +found_null2: + and tmp1,tmp5,tmp1 /*zero out tmp1 according to mask*/ + bv 0(r2) /* we're done*/ + stbys,e tmp1,0(0,d_addr) /* last word (back porch)*/ + +null3: /* not_aligned case where null is found in first of two words--adjust count*/ + extru,<> save,7,8,r0 + b found_null3 + copy r0, tmp5 + extru,<> save,15,8,r0 + b found_null3 + ldil 0x1FE000,tmp5 /* setup mask (FF000000)*/ + extru,<> save,23,8,r0 + b found_null3 + ldil 0x1FFFE0,tmp5 /* setup mask (FFFF0000)*/ + ldo -1(r0),tmp5 /* setup mask (FFFFFFFF)*/ +found_null3: + addi 4,count,count /* fix count since null is in first of two words*/ + and tmp3,tmp5,tmp3 /*zero out tmp3 according to mask*/ + b pad_nulls /* nullify remaining count bytes*/ + stbys,b,m tmp3,4(d_addr) + +null4: /* not_aligned case where null is found in second of two words*/ + extru,<> save,7,8,r0 + b found_null4 + copy r0, tmp5 + extru,<> save,15,8,r0 + b found_null4 + ldil 0x1FE000,tmp5 /* setup mask (FF000000)*/ + extru,<> save,23,8,r0 + b found_null4 + ldil 0x1FFFE0,tmp5 /* setup mask (FFFF0000)*/ + ldo -1(r0),tmp5 /* setup mask (FFFFFFFF)*/ +found_null4: + and tmp3,tmp5,tmp3 /*zero out tmp4 according to mask*/ + b pad_nulls /* nullify remaining count bytes*/ + stbys,b,m tmp3,4(d_addr) + +done: +EXIT(strncpy) diff --git a/lib/machine/i386/Makefile.inc b/lib/machine/i386/Makefile.inc new file mode 100644 index 0000000..60c5c13 --- /dev/null +++ b/lib/machine/i386/Makefile.inc @@ -0,0 +1,7 @@ +if MACH_ADD_SETJMP +libc_a_SOURCES += %D%/setjmp.S +endif + +libc_a_SOURCES += \ + %D%/memchr.S %D%/memcmp.S %D%/memcpy.S %D%/memset.S %D%/strchr.S \ + %D%/memmove.S %D%/strlen.S %D%/i386mach.h diff --git a/lib/machine/i386/i386mach.h b/lib/machine/i386/i386mach.h new file mode 100644 index 0000000..403d24b --- /dev/null +++ b/lib/machine/i386/i386mach.h @@ -0,0 +1,83 @@ +/* This file was based on the modified setjmp.S performed by + * Joel Sherill (joel@OARcorp.com) which specified the use + * of the __USER_LABEL_PREFIX__ and __REGISTER_PREFIX__ macros. + ** + ** This file is distributed WITHOUT ANY WARRANTY; without even the implied + ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* These are predefined by new versions of GNU cpp. */ + +#ifndef __USER_LABEL_PREFIX__ +#define __USER_LABEL_PREFIX__ _ +#endif + +#define __REG_PREFIX__ % + +/* ANSI concatenation macros. */ + +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a##b + +/* Use the right prefix for global labels. */ + +#define SYM(x) CONCAT1(__USER_LABEL_PREFIX__, x) + +/* Use the right prefix for registers. */ + +#define REG(x) CONCAT1(__REG_PREFIX__, x) + +#define eax REG(eax) +#define ebx REG(ebx) +#define ecx REG(ecx) +#define edx REG(edx) +#define esi REG(esi) +#define edi REG(edi) +#define ebp REG(ebp) +#define esp REG(esp) + +#define st0 REG(st) +#define st1 REG(st(1)) +#define st2 REG(st(2)) +#define st3 REG(st(3)) +#define st4 REG(st(4)) +#define st5 REG(st(5)) +#define st6 REG(st(6)) +#define st7 REG(st(7)) + +#define ax REG(ax) +#define bx REG(bx) +#define cx REG(cx) +#define dx REG(dx) + +#define ah REG(ah) +#define bh REG(bh) +#define ch REG(ch) +#define dh REG(dh) + +#define al REG(al) +#define bl REG(bl) +#define cl REG(cl) +#define dl REG(dl) + +#define mm1 REG(mm1) +#define mm2 REG(mm2) +#define mm3 REG(mm3) +#define mm4 REG(mm4) +#define mm5 REG(mm5) +#define mm6 REG(mm6) +#define mm7 REG(mm7) + +#ifdef _I386MACH_NEED_SOTYPE_FUNCTION +#define SOTYPE_FUNCTION(sym) .type SYM(sym),@function +#else +#define SOTYPE_FUNCTION(sym) +#endif + +#ifndef _I386MACH_DISABLE_HW_INTERRUPTS +#define __CLI +#define __STI +#else +#define __CLI cli +#define __STI sti +#endif diff --git a/lib/machine/i386/machine/_fpmath.h b/lib/machine/i386/machine/_fpmath.h new file mode 100644 index 0000000..874439c --- /dev/null +++ b/lib/machine/i386/machine/_fpmath.h @@ -0,0 +1,56 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2002, 2003 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +union IEEEl2bits { + long double e; + struct { + unsigned int manl :32; + unsigned int manh :32; + unsigned int exp :15; + unsigned int sign :1; + unsigned int junk :16; + } bits; + struct { + unsigned long long man :64; + unsigned int expsign :16; + unsigned int junk :16; + } xbits; +}; + +#define LDBL_NBIT 0x80000000 +#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT) + +#define LDBL_MANH_SIZE 32 +#define LDBL_MANL_SIZE 32 + +#define LDBL_TO_ARRAY32(u, a) do { \ + (a)[0] = (uint32_t)(u).bits.manl; \ + (a)[1] = (uint32_t)(u).bits.manh; \ +} while (0) diff --git a/lib/machine/i386/machine/fastmath.h b/lib/machine/i386/machine/fastmath.h new file mode 100644 index 0000000..accfa87 --- /dev/null +++ b/lib/machine/i386/machine/fastmath.h @@ -0,0 +1,122 @@ +#ifndef _MACHFASTMATH_H +#define _MACHFASTMATH_H + +#if defined(__GNUC__) && __STDC__ - 0 > 0 + +#define __str1__(__x) #__x +#define __str2__(__x) __str1__(__x) +#define __U_L_PREFIX__ __str2__(__USER_LABEL_PREFIX__) + +__extension__ double atan2(double, double) + __asm__(__U_L_PREFIX__ "_f_atan2"); +__extension__ double exp(double) + __asm__(__U_L_PREFIX__ "_f_exp"); +__extension__ double frexp(double, int*) + __asm__(__U_L_PREFIX__ "_f_frexp"); +__extension__ double ldexp(double, int) + __asm__(__U_L_PREFIX__ "_f_ldexp"); +__extension__ double log(double) + __asm__(__U_L_PREFIX__ "_f_log"); +__extension__ double log10(double) + __asm__(__U_L_PREFIX__ "_f_log10"); +__extension__ double pow(double, double) + __asm__(__U_L_PREFIX__ "_f_pow"); +__extension__ double tan(double) + __asm__(__U_L_PREFIX__ "_f_tan"); + +#if !defined(__STRICT_ANSI__) || defined(__cplusplus) || __STDC_VERSION__ >= 199901L + + +__extension__ float atan2f(float, float) + __asm__(__U_L_PREFIX__ "_f_atan2f"); +__extension__ float expf(float) + __asm__(__U_L_PREFIX__ "_f_expf"); +__extension__ float frexpf(float, int*) + __asm__(__U_L_PREFIX__ "_f_frexpf"); +__extension__ float ldexpf(float, int) + __asm__(__U_L_PREFIX__ "_f_ldexpf"); +__extension__ long long llrint(double) + __asm__(__U_L_PREFIX__ "_f_llrint"); +__extension__ long long llrintf(float) + __asm__(__U_L_PREFIX__ "_f_llrintf"); +__extension__ long long llrintl(long double) + __asm__(__U_L_PREFIX__ "_f_llrintl"); +__extension__ float logf(float) + __asm__(__U_L_PREFIX__ "_f_logf"); +__extension__ float log10f(float) + __asm__(__U_L_PREFIX__ "_f_log10f"); +__extension__ long lrint(double) + __asm__(__U_L_PREFIX__ "_f_lrint"); +__extension__ long lrintf(float) + __asm__(__U_L_PREFIX__ "_f_lrintf"); +__extension__ long lrintl(long double) + __asm__(__U_L_PREFIX__ "_f_lrintl"); +__extension__ float powf(float, float) + __asm__(__U_L_PREFIX__ "_f_powf"); +__extension__ double rint(double) + __asm__(__U_L_PREFIX__ "_f_rint"); +__extension__ float rintf(float) + __asm__(__U_L_PREFIX__ "_f_rintf"); +__extension__ long double rintl(long double) + __asm__(__U_L_PREFIX__ "_f_rintl"); +__extension__ float tanf(float) + __asm__(__U_L_PREFIX__ "_f_tanf"); +#endif + +#else + +double EXFUN(_f_atan2,(double, double)); +double EXFUN(_f_exp,(double)); +double EXFUN(_f_frexp,(double, int*)); +double EXFUN(_f_ldexp,(double, int)); +double EXFUN(_f_log,(double)); +double EXFUN(_f_log10,(double)); +double EXFUN(_f_pow,(double, double)); + +#define atan2(__y,__x) _f_atan2((__y),(__x)) +#define exp(__x) _f_exp(__x) +#define frexp(__x,__p) _f_frexp((__x),(__p)) +#define ldexp(__x,__e) _f_ldexp((__x),(__e)) +#define log(__x) _f_log(__x) +#define log10(__x) _f_log10(__x) +#define pow(__x,__y) _f_pow((__x),(__y)) + +#ifndef __STRICT_ANSI__ + +float EXFUN(_f_atan2f,(float, float)); +float EXFUN(_f_expf,(float)); +float EXFUN(_f_frexpf,(float, int*)); +float EXFUN(_f_ldexpf,(float, int)); +long long EXFUN(_f_llrint,(double)); +long long EXFUN(_f_llrintf,(float)); +long long EXFUN(_f_llrintl,(long double)); +float EXFUN(_f_logf,(float)); +float EXFUN(_f_log10f,(float)); +long EXFUN(_f_lrint,(double)); +long EXFUN(_f_lrintf,(float)); +long EXFUN(_f_lrintl,(long double)); +float EXFUN(_f_powf,(float, float)); +float EXFUN(_f_rint,(double)); +double EXFUN(_f_rintf,(float)); +long double EXFUN(_f_rintl,(long double)); + +#define atan2f(__y,__x) _f_atan2f((__y),(__x)) +#define expf(__x) _f_expf(__x) +#define frexpf(__x,__p) _f_frexpf((__x),(__p)) +#define ldexpf(__x,__e) _f_ldexpf((__x),(__e)) +#define llrint(__x) _f_llrint((__x)) +#define llrintf(__x) _f_llrintf((__x)) +#define llrintl(__x) _f_llrintl((__x)) +#define logf(__x) _f_logf(__x) +#define log10f(__x) _f_log10f(__x) +#define lrint(__x) _f_lrint((__x)) +#define lrintf(__x) _f_lrintf((__x)) +#define lrintl(__x) _f_lrintl((__x)) +#define powf(__x,y) _f_powf((__x),(__y)) +#define rint(__x) _f_rint((__x)) +#define rintf(__x) _f_rintf((__x)) +#define rintl(__x) _f_rintl((__x)) +#endif + +#endif /* GCC */ +#endif /* _MACHFASTMATH_H */ diff --git a/lib/machine/i386/memchr.S b/lib/machine/i386/memchr.S new file mode 100644 index 0000000..d9b0bf2 --- /dev/null +++ b/lib/machine/i386/memchr.S @@ -0,0 +1,135 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (memchr) + SOTYPE_FUNCTION(memchr) + +SYM (memchr): +#ifdef __iamcu__ + pushl edi + movl eax,edi + movl edx,eax + xorl edx,edx + testl ecx,ecx + jz L20 + + repnz + scasb + + setnz dl + decl edi + + decl edx + andl edi,edx +L20: + movl edx,eax + + popl edi +#else + pushl ebp + movl esp,ebp + pushl edi + movzbl 12(ebp),eax + movl 16(ebp),ecx + movl 8(ebp),edi + xorl edx,edx + testl ecx,ecx + jz L20 + +#ifdef __OPTIMIZE_SIZE__ + + cld + repnz + scasb + + setnz dl + decl edi + +#else /* !__OPTIMIZE_SIZE__ */ +/* Do byte-wise checks until string is aligned. */ + testl $3,edi + je L5 + cmpb (edi),al + je L15 + incl edi + decl ecx + je L20 + + testl $3,edi + je L5 + cmpb (edi),al + je L15 + incl edi + decl ecx + je L20 + + testl $3,edi + je L5 + cmpb (edi),al + je L15 + incl edi + decl ecx + je L20 + +/* Create a mask, then check a word at a time. */ +L5: + movb al,ah + movl eax,edx + sall $16,edx + orl edx,eax + pushl ebx + + .p2align 4,,7 +L8: + subl $4,ecx + jc L9 + movl (edi),edx + addl $4,edi + xorl eax,edx + leal -16843009(edx),ebx + notl edx + andl edx,ebx + testl $-2139062144,ebx + je L8 + + subl $4,edi + +L9: + popl ebx + xorl edx,edx + addl $4,ecx + je L20 + +/* Final byte-wise checks. */ + .p2align 4,,7 +L10: + cmpb (edi),al + je L15 + incl edi + decl ecx + jne L10 + + xorl edi,edi + +#endif /* !__OPTIMIZE_SIZE__ */ + +L15: + decl edx + andl edi,edx +L20: + movl edx,eax + + leal -4(ebp),esp + popl edi + leave +#endif + ret diff --git a/lib/machine/i386/memcmp.S b/lib/machine/i386/memcmp.S new file mode 100644 index 0000000..4a01b82 --- /dev/null +++ b/lib/machine/i386/memcmp.S @@ -0,0 +1,104 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (memcmp) + SOTYPE_FUNCTION(memcmp) + +SYM (memcmp): + +#ifdef __iamcu__ + pushl edi + pushl esi + movl eax,edi + movl edx,esi + cld + +/* check if length is zero in which case just return 0 */ + + xorl eax,eax + testl ecx,ecx + jz L4 + +/* compare any unaligned bytes or remainder bytes */ + repz + cmpsb + +/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */ + xorl edx,edx + movb -1(esi),dl + movb -1(edi),al + subl edx,eax + +L4: + popl esi + popl edi +#else + pushl ebp + movl esp,ebp + subl $16,esp + pushl ebx + pushl edi + pushl esi + movl 8(ebp),edi + movl 12(ebp),esi + movl 16(ebp),ecx + cld + +/* check if length is zero in which case just return 0 */ + + xorl eax,eax + testl ecx,ecx + jz L4 + +#ifndef __OPTIMIZE_SIZE__ + +/* if aligned on long boundary, compare doublewords at a time first */ + + movl edi,eax + orl esi,eax + testb $3,al + jne BYTECMP + movl ecx,ebx + shrl $2,ecx /* calculate number of long words to compare */ + repz + cmpsl + jz L5 + subl $4,esi + subl $4,edi + movl $4,ecx + jmp BYTECMP +L5: + andl $3,ebx /* calculate number of remaining bytes */ + movl ebx,ecx + +#endif /* not __OPTIMIZE_SIZE__ */ + +BYTECMP: /* compare any unaligned bytes or remainder bytes */ + repz + cmpsb + +/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */ +L3: + xorl edx,edx + movb -1(esi),dl + xorl eax,eax + movb -1(edi),al + subl edx,eax + +L4: + leal -28(ebp),esp + popl esi + popl edi + popl ebx + leave +#endif + ret diff --git a/lib/machine/i386/memcpy.S b/lib/machine/i386/memcpy.S new file mode 100644 index 0000000..a14aa2a --- /dev/null +++ b/lib/machine/i386/memcpy.S @@ -0,0 +1,86 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (memcpy) + SOTYPE_FUNCTION(memcpy) + +SYM (memcpy): + +#ifdef __iamcu__ + pushl esi + pushl edi + movl eax,edi + movl edx,esi + + rep movsb + + popl edi + popl esi +#else + pushl ebp + movl esp,ebp + pushl esi + pushl edi + pushl ebx + movl 8(ebp),edi + movl 16(ebp),ecx + movl 12(ebp),esi + cld + +#ifndef __OPTIMIZE_SIZE__ + + cmpl $8,ecx + jbe .L3 + +/* move any preceding bytes until destination address is long word aligned */ + + movl edi,edx + movl ecx,ebx + andl $3,edx + jz .L11 + movl $4,ecx + subl edx,ecx + andl $3,ecx + subl ecx,ebx + rep + movsb + + mov ebx,ecx + +/* move bytes a long word at a time */ + +.L11: + shrl $2,ecx + .p2align 2 + rep + movsl + + movl ebx,ecx + andl $3,ecx + +#endif /* !__OPTIMIZE_SIZE__ */ + +/* handle any remaining bytes */ + +.L3: + rep + movsb +.L5: + movl 8(ebp),eax + + leal -12(ebp),esp + popl ebx + popl edi + popl esi + leave +#endif + ret diff --git a/lib/machine/i386/memmove.S b/lib/machine/i386/memmove.S new file mode 100644 index 0000000..1026582 --- /dev/null +++ b/lib/machine/i386/memmove.S @@ -0,0 +1,173 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (memmove) + SOTYPE_FUNCTION(memmove) + +SYM (memmove): + +#ifdef __iamcu__ + pushl esi + pushl edi + movl eax,edi + movl edx,esi + cmp esi,edi + ja .Lcopy_backward + je .Lbwd_write_0bytes + + rep movsb + + popl edi + popl esi + ret + +.Lcopy_backward: + lea -1(edi,ecx),edi + lea -1(esi,ecx),esi + std + rep movsb + cld + +.Lbwd_write_0bytes: + popl edi + popl esi +#else + pushl ebp + movl esp,ebp + pushl esi + pushl edi + pushl ebx + movl 8(ebp),edi + movl 16(ebp),ecx + movl 12(ebp),esi + +/* check for destructive overlap (src < dst && dst < src + length) */ + + cld + cmpl edi,esi + jae .L2 + leal -1(ecx,esi),ebx + cmpl ebx,edi + ja .L2 + +/* IF: destructive overlap, must copy backwards */ + + addl ecx,esi + addl ecx,edi + std + +#ifndef __OPTIMIZE_SIZE__ + + cmpl $8,ecx + jbe .L13 +.L18: + +/* move trailing bytes in reverse until destination address is long word aligned */ + + movl edi,edx + movl ecx,ebx + andl $3,edx + jz .L21 + + movl edx,ecx + decl esi + decl edi + subl ecx,ebx + rep + movsb + + mov ebx,ecx + incl esi + incl edi + +.L21: + +/* move bytes in reverse, a long word at a time */ + + shrl $2,ecx + subl $4,esi + subl $4,edi + rep + movsl + + addl $4,esi + addl $4,edi + movl ebx,ecx + andl $3,ecx + +#endif /* !__OPTIMIZE_SIZE__ */ + +/* handle any remaining bytes not on a long word boundary */ + +.L13: + decl esi + decl edi + +.L15: + rep + movsb + jmp .L5 + .p2align 4,,7 + +/* ELSE: no destructive overlap so we copy forwards */ + +.L2: + +#ifndef __OPTIMIZE_SIZE__ + + cmpl $8,ecx + jbe .L3 + +/* move any preceding bytes until destination address is long word aligned */ + + movl edi,edx + movl ecx,ebx + andl $3,edx + jz .L11 + movl $4,ecx + subl edx,ecx + andl $3,ecx + subl ecx,ebx + rep + movsb + + mov ebx,ecx + +/* move bytes a long word at a time */ + +.L11: + shrl $2,ecx + .p2align 2 + rep + movsl + + movl ebx,ecx + andl $3,ecx + +#endif /* !__OPTIMIZE_SIZE__ */ + +/* handle any remaining bytes */ + +.L3: + rep + movsb +.L5: + movl 8(ebp),eax + cld + + leal -12(ebp),esp + popl ebx + popl edi + popl esi + leave +#endif + ret diff --git a/lib/machine/i386/memset.S b/lib/machine/i386/memset.S new file mode 100644 index 0000000..83b2556 --- /dev/null +++ b/lib/machine/i386/memset.S @@ -0,0 +1,109 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (memset) + SOTYPE_FUNCTION(memset) + +SYM (memset): + +#ifdef __iamcu__ + pushl edi + movl eax,edi + movzbl dl,eax + mov edi,edx + rep stosb + mov edx,eax + popl edi +#else + pushl ebp + movl esp,ebp + pushl edi + movl 8(ebp),edi + movzbl 12(ebp),eax + movl 16(ebp),ecx + cld + +#ifndef __OPTIMIZE_SIZE__ +/* Less than 16 bytes won't benefit from the 'rep stosl' loop. */ + cmpl $16,ecx + jbe .L19 + testl $7,edi + je .L10 + +/* It turns out that 8-byte aligned 'rep stosl' outperforms + 4-byte aligned on some x86 platforms. */ + movb al,(edi) + incl edi + decl ecx + testl $7,edi + je .L10 + + movb al,(edi) + incl edi + decl ecx + testl $7,edi + je .L10 + + movb al,(edi) + incl edi + decl ecx + testl $7,edi + je .L10 + + movb al,(edi) + incl edi + decl ecx + testl $7,edi + je .L10 + + movb al,(edi) + incl edi + decl ecx + testl $7,edi + je .L10 + + movb al,(edi) + incl edi + decl ecx + testl $7,edi + je .L10 + + movb al,(edi) + incl edi + decl ecx + +/* At this point, ecx>8 and edi%8==0. */ +.L10: + movb al,ah + movl eax,edx + sall $16,edx + orl edx,eax + + movl ecx,edx + shrl $2,ecx + andl $3,edx + rep + stosl + movl edx,ecx +#endif /* not __OPTIMIZE_SIZE__ */ + +.L19: + rep + stosb + + movl 8(ebp),eax + + leal -4(ebp),esp + popl edi + leave +#endif + ret diff --git a/lib/machine/i386/setjmp.S b/lib/machine/i386/setjmp.S new file mode 100644 index 0000000..45c689f --- /dev/null +++ b/lib/machine/i386/setjmp.S @@ -0,0 +1,132 @@ +/* This is file is a merger of SETJMP.S and LONGJMP.S */ +/* + * This file was modified to use the __USER_LABEL_PREFIX__ and + * __REGISTER_PREFIX__ macros defined by later versions of GNU cpp by + * Joel Sherrill (joel@OARcorp.com) + * Slight change: now includes i386mach.h for this (Werner Almesberger) + * + * Copyright (C) 1991 DJ Delorie + * All rights reserved. + * + * Redistribution, modification, and use in source and binary forms is permitted + * provided that the above copyright notice and following paragraph are + * duplicated in all such forms. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + + /* + ** jmp_buf: + ** eax ebx ecx edx esi edi ebp esp eip + ** 0 4 8 12 16 20 24 28 32 + ** + ** Intel MCU jmp_buf: + ** ebx esi edi ebp esp eip + ** 0 4 8 12 16 20 + */ + + #include "i386mach.h" + + .global SYM (setjmp) + .global SYM (longjmp) + SOTYPE_FUNCTION(setjmp) + SOTYPE_FUNCTION(longjmp) + +SYM (setjmp): + +#ifdef __iamcu__ + /* Store EIP. */ + movl 0(esp),ecx + movl ecx,20(eax) + + movl ebx,0 (eax) + movl esi,4 (eax) + movl edi,8 (eax) + movl ebp,12(eax) + + /* Skip return address, which will be pushed onto stack in + longjmp, and store SP. */ + leal 4(esp),ecx + movl ecx,16(eax) + + xorl eax,eax +#else + pushl ebp + movl esp,ebp + + pushl edi + movl 8 (ebp),edi + + movl eax,0 (edi) + movl ebx,4 (edi) + movl ecx,8 (edi) + movl edx,12 (edi) + movl esi,16 (edi) + + movl -4 (ebp),eax + movl eax,20 (edi) + + movl 0 (ebp),eax + movl eax,24 (edi) + + movl esp,eax + addl $12,eax + movl eax,28 (edi) + + movl 4 (ebp),eax + movl eax,32 (edi) + + popl edi + movl $0,eax + leave +#endif + ret + +SYM (longjmp): +#ifdef __iamcu__ + /* Check retval. */ + testl edx,edx + jne 0f + incl edx +0: + /* Restore stack first. */ + movl 16(eax),esp + + /* Put return address on stack. */ + pushl 20(eax) + + movl 0(eax),ebx + movl 4(eax),esi + movl 8(eax),edi + movl 12(eax),ebp + movl edx,eax +#else + pushl ebp + movl esp,ebp + + movl 8(ebp),edi /* get jmp_buf */ + movl 12(ebp),eax /* store retval in j->eax */ + testl eax,eax + jne 0f + incl eax +0: + movl eax,0(edi) + + movl 24(edi),ebp + + __CLI + movl 28(edi),esp + + pushl 32(edi) + + movl 0(edi),eax + movl 4(edi),ebx + movl 8(edi),ecx + movl 12(edi),edx + movl 16(edi),esi + movl 20(edi),edi + __STI +#endif + + ret diff --git a/lib/machine/i386/strchr.S b/lib/machine/i386/strchr.S new file mode 100644 index 0000000..43ee0fb --- /dev/null +++ b/lib/machine/i386/strchr.S @@ -0,0 +1,197 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (strchr) + SOTYPE_FUNCTION(strchr) + +SYM (strchr): + +#ifdef __iamcu__ + xorl ecx,ecx + movb dl,cl + +/* loop while (*s && *s++ != c) */ + leal -1(eax),eax +L15: + incl eax + movb (eax),dl + testb dl,dl + je L14 + cmpb cl,dl + jne L15 + +L14: +/* if (*s == c) return address otherwise return NULL */ + cmpb cl,(eax) + je L19 + xorl eax,eax + +L19: + ret +#else + pushl ebp + movl esp,ebp + pushl edi + pushl ebx + xorl ebx,ebx + movl 8(ebp),edi + addb 12(ebp),bl + +#ifndef __OPTIMIZE_SIZE__ +/* Special case strchr(p,0). */ + je L25 + +/* Do byte-wise checks until string is aligned. */ + test $3,edi + je L5 + movl edi,eax + movb (eax),cl + testb cl,cl + je L14 + cmpb bl,cl + je L19 + incl edi + + test $3,edi + je L5 + movl edi,eax + movb (eax),cl + testb cl,cl + je L14 + cmpb bl,cl + je L19 + incl edi + + test $3,edi + je L5 + movl edi,eax + movb (eax),cl + testb cl,cl + je L14 + cmpb bl,cl + je L19 + incl edi + +/* create 4 byte mask which is just the desired byte repeated 4 times */ +L5: + movl ebx,ecx + sall $8,ebx + subl $4,edi + orl ecx,ebx + movl ebx,edx + sall $16,ebx + orl edx,ebx + +/* loop performing 4 byte mask checking for 0 byte or desired byte */ + .p2align 4,,7 +L10: + addl $4,edi + movl (edi),ecx + leal -16843009(ecx),edx + movl ecx,eax + notl eax + andl eax,edx + testl $-2139062144,edx + jne L9 + + xorl ebx,ecx + leal -16843009(ecx),edx + notl ecx + andl ecx,edx + testl $-2139062144,edx + je L10 +#endif /* not __OPTIMIZE_SIZE__ */ + +/* loop while (*s && *s++ != c) */ +L9: + leal -1(edi),eax + .p2align 4,,7 +L15: + incl eax + movb (eax),dl + testb dl,dl + je L14 + cmpb bl,dl + jne L15 + +L14: +/* if (*s == c) return address otherwise return NULL */ + cmpb bl,(eax) + je L19 + xorl eax,eax + +L19: + leal -8(ebp),esp + popl ebx + popl edi + leave + ret + +#ifndef __OPTIMIZE_SIZE__ +/* Special case strchr(p,0). */ +#if 0 + /* Hideous performance on modern machines. */ +L25: + cld + movl $-1,ecx + xor eax,eax + repnz + scasb + leal -1(edi),eax + jmp L19 +#endif +L25: +/* Do byte-wise checks until string is aligned. */ + test $3,edi + je L26 + movl edi,eax + movb (eax),cl + testb cl,cl + je L19 + incl edi + + test $3,edi + je L26 + movl edi,eax + movb (eax),cl + testb cl,cl + je L19 + incl edi + + test $3,edi + je L26 + movl edi,eax + movb (eax),cl + testb cl,cl + je L19 + incl edi + +L26: + subl $4,edi + +/* loop performing 4 byte mask checking for desired 0 byte */ + .p2align 4,,7 +L27: + addl $4,edi + movl (edi),ecx + leal -16843009(ecx),edx + movl ecx,eax + notl eax + andl eax,edx + testl $-2139062144,edx + je L27 + + jmp L9 + +#endif /* !__OPTIMIZE_SIZE__ */ + +#endif /* __iamcu__ */ diff --git a/lib/machine/i386/strlen.S b/lib/machine/i386/strlen.S new file mode 100644 index 0000000..373ea0f --- /dev/null +++ b/lib/machine/i386/strlen.S @@ -0,0 +1,102 @@ +/* + * ==================================================== + * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "i386mach.h" + + .global SYM (strlen) + SOTYPE_FUNCTION(strlen) + +SYM (strlen): + + pushl ebp + movl esp,ebp + pushl edi +#ifdef __iamcu__ + movl eax,edx +#else + movl 8(ebp),edx +#endif + +#if defined __OPTIMIZE_SIZE__ || defined __iamcu__ + cld + movl edx,edi + movl $4294967295,ecx + xor eax,eax + repnz + scasb +#else +/* Modern x86 hardware is much faster at double-word + manipulation than with bytewise repnz scasb. */ + +/* Do byte-wise checks until string is aligned. */ + movl edx,edi + test $3,edi + je L5 + movb (edi),cl + incl edi + testb cl,cl + je L15 + + test $3,edi + je L5 + movb (edi),cl + incl edi + testb cl,cl + je L15 + + test $3,edi + je L5 + movb (edi),cl + incl edi + testb cl,cl + je L15 + +L5: + subl $4,edi + +/* loop performing 4 byte mask checking for desired 0 byte */ + .p2align 4,,7 +L10: + addl $4,edi + movl (edi),ecx + leal -16843009(ecx),eax + notl ecx + andl ecx,eax + testl $-2139062144,eax + je L10 + +/* Find which of four bytes is 0. */ + notl ecx + incl edi + + testb cl,cl + je L15 + incl edi + shrl $8,ecx + + testb cl,cl + je L15 + incl edi + shrl $8,ecx + + testb cl,cl + je L15 + incl edi + +#endif + +L15: + subl edx,edi + leal -1(edi),eax + + leal -4(ebp),esp + popl edi + leave + ret diff --git a/lib/machine/i960/Makefile.inc b/lib/machine/i960/Makefile.inc new file mode 100644 index 0000000..cb78946 --- /dev/null +++ b/lib/machine/i960/Makefile.inc @@ -0,0 +1,29 @@ +libc_a_SOURCES += \ + %D%/memccpy_ca.S \ + %D%/memccpy.S \ + %D%/memchr_ca.S \ + %D%/memchr.S \ + %D%/memcmp_ca.S \ + %D%/memcmp.S \ + %D%/memcpy_ca.S \ + %D%/memcpy.S \ + %D%/memset.S \ + %D%/setjmp.S \ + %D%/strchr_ca.S \ + %D%/strchr.S \ + %D%/strcmp_ca.S \ + %D%/strcmp.S \ + %D%/strcpy_ca.S \ + %D%/strcpy.S \ + %D%/strcspn.S \ + %D%/strdup.S \ + %D%/strlen_ca.S \ + %D%/strlen.S \ + %D%/strncat_ca.S \ + %D%/strncat.S \ + %D%/strncmp_ca.S \ + %D%/strncmp.S \ + %D%/strncpy_ca.S \ + %D%/strncpy.S \ + %D%/strpbrk.S \ + %D%/strrchr.S diff --git a/lib/machine/i960/memccpy.S b/lib/machine/i960/memccpy.S new file mode 100644 index 0000000..df19472 --- /dev/null +++ b/lib/machine/i960/memccpy.S @@ -0,0 +1,143 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memccpy.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1989,1993 Intel Corp., all rights reserved + */ +/* + procedure memccpy (optimized assembler version for the 80960K series) + + dest_addr = memccpy (dest_addr, src_addr, char, len) + + copy len bytes pointed to by src_addr to the space pointed to by + dest_addr, stopping if char is copied. If char is copied, + return address of byte after char in dest string; else null. + + + Undefined behavior will occur if the end of the source array is in + the last two words of the program's allocated memory space. This + is so because the routine fetches ahead. Disallowing the fetch + ahead would impose a severe performance penalty. + + Undefined behavior will also occur if the source and destination + strings overlap. + + Strategy: + + Fetch the source array by words and store them by words to the + destination array, until there are fewer than three bytes left + to copy. Then, using the last word of the source (the one that + contains the remaining 0, 1, 2, or 3 bytes to be copied), store + a byte at a time until Ldone. + + Tactics: + + 1) Do NOT try to fetch and store the words in a word aligned manner + because, in my judgement, the performance degradation experienced due + to non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. This is supported by the intuition that most source and + destination arrays (even more true of most big source arrays) will + be word aligned to begin with. + + 2) Rather than decrementing len to zero, + I calculate the address of the byte after the last byte of the + destination array, and quit when the destination byte pointer passes + that. + +*/ + + .globl _memccpy + .leafproc _memccpy, __memccpy + .align 2 +_memccpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memccpy: + mov g14, g13 # preserve return address + cmpibge 0,g3,Lexit_char_not_found + + addo g3,g1,g3 # compute beyond end of src + ld (g1), g7 # fetch first word of source + lda 0xff,g5 # mask for char + and g5,g2,g2 # extract only char + shlo 8,g2,g6 + or g2,g6,g6 + shlo 16,g6,g4 + or g6,g4,g6 # word of char + b Lwloop_b + +Lwloop_a: + ld (g1), g7 # fetch ahead next word of source + st g4, (g0) # store word to dest + addo 4, g0, g0 # post-increment dest pointer +Lwloop_b: # word copying loop + addo 4, g1, g1 # pre-increment src pointer + cmpo g3, g1 # is len <= 3 ? + mov g7, g4 # keep a copy of the current word + bl Lcloop_setup # quit word loop if less than 4 bytes + scanbyte g6, g7 # check for char + bno Lwloop_a # continue word loop if char not found. + +Lcloop_setup: + subo 4, g1, g1 # back down src pointer + cmpobe g1, g3, Lexit_char_not_found + +Lcloop_a: # character copying loop (len < 3) + and g5,g4,g7 # check the byte against char + cmpo g7,g2 + stob g7,(g0) # store the byte + addo 1, g0, g0 + be Lexit_char_found + addo 1,g1,g1 + cmpo g1,g3 + shro 8,g4,g4 # position next byte + bne Lcloop_a + +Lexit_char_not_found: + mov 0, g0 +Lexit_char_found: + lda 0,g14 + bx (g13) # g0 = dest array address; g14 = 0 +Lrett: + ret + + +/* end of memccpy */ diff --git a/lib/machine/i960/memccpy_ca.S b/lib/machine/i960/memccpy_ca.S new file mode 100644 index 0000000..60c197b --- /dev/null +++ b/lib/machine/i960/memccpy_ca.S @@ -0,0 +1,245 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "mccpy_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1989,1993 Intel Corp., all rights reserved + */ + +/* + procedure memccpy (optimized assembler version for the 80960CA) + + dest_addr = memccpy (dest_addr, src_addr, char, len) + + copy len bytes pointed to by src_addr to the space pointed to by + dest_addr, stopping if char is copied. If char is copied, + return address of byte after char in dest string; else null. + + Undefined behavior will occur if the end of the source array is in + the last two words of the program's allocated memory space. This + is so because the routine fetches ahead. Disallowing the fetch + ahead would impose a severe performance penalty. + + Undefined behavior will also occur if the source and destination + strings overlap. + + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source is word aligned, destination is not + 4) destination is word aligned, source is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g6 +#define LSW g7 +#else +#define LSW g6 +#define MSW g7 +#endif + + .globl _memccpy + .leafproc _memccpy, __memccpy + .align 2 +_memccpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memccpy: + notand g1,3,g5 # extract word addr of start of src + lda (g14),g13 # preserve return address + cmpibge.f 0,g3,Lexit_char_not_found # Lexit if # of bytes to move is <= 0 + cmpo g5,g1 # check alignment of src + ld (g5),LSW # fetch word containing at least first byte + notand g0,3,g4 # extract word addr of start of dest + lda 4(g5),g5 # advance src word addr + shlo 24,g2,g2 # reduce char to single byte + bne.f Lcase_245 # branch if src is NOT word aligned + +Lcase_13: + cmpobe.t g0,g4,Lcase_1_setup # branch if dest word aligned + +Lcase_3: # src is word aligned; dest is not + mov LSW,MSW # make copy of first word of src + addo 4,g4,g1 # move dest word ptr to first word boundary + lda 32,g14 # initialize shift count to zero + +Lcase_25: +Lcase_3_cloop_at_start: # character copying loop for start of dest str + cmpdeci 0,g3,g3 # is max_bytes exhausted? +#if __i960_BIG_ENDIAN__ + lda -8(g14),g14 # augment the shift counter +#else + lda 8(g14),g14 # augment the shift counter +#endif + be.f Lexit_char_not_found # Lexit if max_bytes is exhausted +#if __i960_BIG_ENDIAN__ + rotate 8,MSW,MSW # move next byte into position for extraction +#endif + shlo 24,MSW,g4 + stob MSW,(g0) # store the byte in dest + cmpo g4,g2 + lda 1(g0),g0 # post-increment dest ptr +#if ! __i960_BIG_ENDIAN__ + shro 8,MSW,MSW # move next byte into position for extraction +#endif + be.f Lexit_char_found # Lexit if char found + cmpobne.t g1,g0,Lcase_3_cloop_at_start # branch if reached word boundary + + ld (g5),MSW # fetch msw of operand for double shift + +Lcase_4: + shro 8,g2,g4 + or g4,g2,g1 + shro 16,g1,g4 + or g4,g1,g4 + +#if __i960_BIG_ENDIAN__ + cmpobne 0,g14,Lcase_3_wloop + +Lcase_3_wloop2: + cmpi g3,4 # less than four bytes to move? + lda 4(g5),g5 # post-increment src word addr + mov LSW,g1 # extract 4 bytes of src + bl.f Lcase_13_cloop_setup # branch if < four bytes left to move + scanbyte g4,g1 # branch if word has char in it + bo.f Lcase_13_cloop_setup + mov MSW,LSW # move msw to lsw + ld (g5),MSW # pre-fetch msw of operand for double shift + subi 4,g3,g3 # decrease max_byte count by the 4 bytes moved + st g1,(g0) # store 4 bytes to dest + addo 4,g0,g0 # post-increment dest ptr + b Lcase_3_wloop2 +#endif + +Lcase_3_wloop: + cmpi g3,4 # less than four bytes to move? + lda 4(g5),g5 # post-increment src word addr + eshro g14,g6,g1 # extract 4 bytes of src + bl.f Lcase_13_cloop_setup # branch if < four bytes left to move + scanbyte g4,g1 # branch if word has char in it + bo.f Lcase_13_cloop_setup + mov MSW,LSW # move msw to lsw + ld (g5),MSW # pre-fetch msw of operand for double shift + subi 4,g3,g3 # decrease max_byte count by the 4 bytes moved + st g1,(g0) # store 4 bytes to dest + addo 4,g0,g0 # post-increment dest ptr + b Lcase_3_wloop + +Lcase_1_setup: + subo 4,g0,g0 # store is pre-incrementing; back up dest addr + shro 8,g2,g4 + or g4,g2,MSW + shro 16,MSW,g4 + or g4,MSW,g4 + b Lcase_1 +Lcase_1_wloop: # word copying loop + subi 4,g3,g3 # decrease max_byte count by the 4 bytes moved + ld (g5),LSW # pre-fetch next word of src + addo 4,g5,g5 # post-increment src addr + st g1,(g0) # store word in dest string +Lcase_1: # src and dest are word aligned + cmpi g3,4 # check for fewer than four bytes to move + addo 4,g0,g0 # pre-increment dest addr + lda (LSW),g1 # keep a copy of the src word + bl.f Lcase_13_cloop_setup # branch if less than four bytes to copy + scanbyte LSW,g4 # branch if char is not in foursome + bno.t Lcase_1_wloop +Lcase_13_cloop_setup: + cmpibe.f 0,g3,Lexit_char_not_found # Lexit if max_bytes is exhausted + +Lcase_1_cloop: +#if __i960_BIG_ENDIAN__ + rotate 8,g1,g1 # move next byte into position for extraction +#endif + shlo 24,g1,g4 + stob g1,(g0) # store the byte in dest + cmpo g4,g2 + lda 1(g0),g0 # post-increment dest byte addr + subi 1,g3,g3 + be.f Lexit_char_found # Lexit if char reached + cmpi 0,g3 +#if ! __i960_BIG_ENDIAN__ + shro 8,g1,g1 # move next byte into position for extraction +#endif + bne.t Lcase_1_cloop # continue if len not exhausted + +Lexit_char_not_found: + mov 0,g0 +Lexit_char_found: + lda 0,g14 + bx (g13) # g0 = dest array address; g14 = 0 +Lrett: + ret + + +Lcase_245: + cmpo g0,g4 # check alignment of dest + ld (g5),MSW # pre-fetch second half + and 3,g1,g1 # compute shift count + shlo 3,g1,g14 +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # adjust shift count for big endian +#endif + be.t Lcase_4 # branch if dest is word aligned + or g4,g1,g1 # is src earlier in word, later, or sync w/ dst + cmpo g0,g1 # < indicates first word of dest has more bytes + /* than first word of source. */ + eshro g14,g6,g4 # extract four bytes + lda 4(g0),g1 # move dest word addr to first word boundary +#if __i960_BIG_ENDIAN__ + bge.f 1f +#else + bg.f 1f +#endif + mov MSW,LSW + lda 4(g5),g5 # move src word addr to second word boundary +1: + notand g1,3,g1 + mov g4,MSW + b Lcase_25 + +/* end of memccpy */ diff --git a/lib/machine/i960/memchr.S b/lib/machine/i960/memchr.S new file mode 100644 index 0000000..e9a4e42 --- /dev/null +++ b/lib/machine/i960/memchr.S @@ -0,0 +1,130 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memchr.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure memchr (optimized assembler version for the 80960K series) + + src_addr = memchr (src_addr, char, max_bytes) + + searching from src_addr for a span of max_bytes bytes, return a + pointer to the first byte in the source array that contains the + indicated char. Return null if the char is not found. + + Undefined behavior will occur if the last byte of the source array + is in the last two words of the program's allocated memory space. + This is so because memchr fetches ahead. Disallowing the fetch + ahead would impose a severe performance penalty. + + Strategy: + + Fetch the source array by words and scanbyte the words for the + char until either a word with the byte is found or max_bytes is + exhausted. In the former case, move through the word to find the + matching byte and return its memory address. In the latter case, + return zero (null). + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble that would be necessary to assure alignment. This + is supported by the intuition that most source arrays (even more + true of most big source arrays) will be word aligned to begin with. + + 2) Rather than decrementing max_bytes to zero, I calculate the + address of the byte after the last byte of the source array, and + quit when the source byte pointer passes that. Refining, actually + I calculate the address of the fifth byte after the last byte of + the source array, because the source byte pointer is ahead of the + actual examination point due to fetch ahead. +*/ + + .globl _memchr + .globl __memchr + .leafproc _memchr, __memchr + .align 2 +_memchr: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memchr: + + mov g14,g13 # preserve return address + lda 0xff,g7 # byte extraction mask + and g1,g7,g1 # make char an 8-bit ordinal + mov 0,g14 # conform to register linkage standard + cmpibge 0,g2,Lnot_found # do nothing if max_bytes <= 0 + addo 4,g0,g6 # post-increment src word pointer + addo g2,g6,g2 # compute ending address from start and len + ld (g0),g4 # fetch first word + shlo 8,g1,g3 # broadcast the char to four bytes + or g1,g3,g3 + shlo 16,g3,g5 + or g3,g5,g3 + +Lsearch_for_word_with_char: + mov g4,g5 # keep a copy of word + scanbyte g3,g5 # check for byte with char + ld (g6),g4 # fetch next word of src + bo Lsearch_for_char # branch if null found + addo 4,g6,g6 # post-increment src word pointer + cmpobge g2,g6,Lsearch_for_word_with_char # branch if max_bytes > 3 + +Lnot_found: + mov 0,g0 # char not found. Return null + bx (g13) # g0 = addr of char in src (or null); g14 = 0 +Lrett: + ret + +Lsearch_for_char: + cmpobe.f g6,g2,Lnot_found # quit if max_bytes exhausted + and g5,g7,g0 # extract byte + cmpo g1,g0 # is it char? + addo 1,g6,g6 # bump src byte ptr + shro 8,g5,g5 # shift word to position next byte + bne.t Lsearch_for_char + subo 5,g6,g0 # back up the byte pointer + bx (g13) + +/* end of memchr */ diff --git a/lib/machine/i960/memchr_ca.S b/lib/machine/i960/memchr_ca.S new file mode 100644 index 0000000..ac80be7 --- /dev/null +++ b/lib/machine/i960/memchr_ca.S @@ -0,0 +1,153 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memchr_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure memchr (optimized assembler version for the CA) + + src_addr = memchr (src_addr, char, max_bytes) + + searching from src_addr for max_bytes bytes, return a pointer to the + first byte that contains the indicated byte in the source string. + Return null if the byte is not found. + + Undefined behavior will occur if the end of the source string (i.e. + the terminating null byte) is in the last two words of the program's + allocated memory space. This is so because, in several cases, memchr + will fetch ahead. Disallowing the fetch ahead would impose a severe + performance penalty. + + This program handles two cases: + + 1) the argument starts on a word boundary + 2) the argument doesn't start on a word boundary + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 src ptr; upon return it is a pointer to the matching byte, or null + g1 char to seek + g2 maximum number of bytes to check + g3 char to seek, broadcast to all four bytes + g4 word of the source string + g5 copy of the word + g6 mask to avoid unimportant bytes in first word + g7 byte extraction mask + g13 return address + g14 +*/ + + .globl _memchr + .globl __memchr + .leafproc _memchr, __memchr + .align 2 +_memchr: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memchr: + + mov g14,g13 # preserve return address + lda 0xff,g7 # byte extraction mask + and g1,g7,g1 # make char an 8-bit ordinal + lda 0,g14 # conform to register linkage standard + cmpibge.f 0,g2,Lnot_found # do nothing if max_bytes <= 0 + addo g0,g2,g2 # compute ending address from start and len + and g0,3,g6 # extract byte offset of src + notand g0,3,g0 # extract word addr of start of src + shlo 8,g1,g3 # broadcast the char to four bytes + ld (g0),g4 # fetch word containing at least first byte + or g1,g3,g3 + shlo 16,g3,g5 + cmpo g1,g7 # is char being sought 0xff? + or g5,g3,g3 + shlo 3,g6,g6 # get shift count for making mask for first word + subi 1,0,g5 # mask initially all ones +#if __i960_BIG_ENDIAN__ + shro g6,g5,g5 # get mask for bytes needed from first word +#else + shlo g6,g5,g5 # get mask for bytes needed from first word +#endif + notor g4,g5,g4 # set unneeded bytes to all ones + be.f Lsearch_for_0xff # branch if seeking 0xff + +Lsearch_for_word_with_char: + scanbyte g3,g4 # check for byte with char + lda 4(g0),g0 # pre-increment src word pointer + mov g4,g5 # keep a copy of word + ld (g0),g4 # fetch next word of src + bo.f Lsearch_for_char # branch if null found + cmpoble.t g0,g2,Lsearch_for_word_with_char # branch if not null + +Lnot_found: + mov 0,g0 # char not found. Return null +Lexit_code: + bx (g13) # g0 = addr of char in src (or null); g14 = 0 +Lrett: + ret + +Lsearch_for_char: + subo 4,g0,g0 # back up the byte pointer +Lsearch_for_char.a: + cmpobe.f g0,g2,Lnot_found # quit if max_bytes exhausted +#if __i960_BIG_ENDIAN__ + rotate 8,g5,g5 # shift word to position next byte +#endif + and g5,g7,g6 # extract byte + cmpo g1,g6 # is it char? + lda 1(g0),g0 # bump src byte ptr +#if ! __i960_BIG_ENDIAN__ + shro 8,g5,g5 # shift word to position next byte +#endif + bne.t Lsearch_for_char.a + subo 1,g0,g0 # back up the byte pointer + b Lexit_code + +Lsearch_for_0xff: + lda 0xf0f0f0f0,g6 # make first comparison mask for char=-1 case. + or g6,g5,g6 + and g4,g6,g4 # make unimportant bytes of first word 0x0f + b Lsearch_for_word_with_char + +/* end of memchr */ diff --git a/lib/machine/i960/memcmp.S b/lib/machine/i960/memcmp.S new file mode 100644 index 0000000..709eb2b --- /dev/null +++ b/lib/machine/i960/memcmp.S @@ -0,0 +1,128 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memcmp.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure memcmp (optimized assembler version for the 80960K series) + + result = memcmp (src1_addr, src2_addr, max_bytes) + + compare the byte array pointed to by src1_addr to the byte array + pointed to by src2_addr. Return 0 iff the arrays are equal, -1 iff + src1_addr is lexicographically less than src2_addr, and 1 iff it is + lexicographically greater. Do not compare more than max_bytes bytes. + + Undefined behavior will occur if the end of either source array + is in the last two words of the program's allocated memory space. + This is so because memcmp fetches ahead. Disallowing the fetch ahead + would impose a severe performance penalty. + + Strategy: + + Fetch the source strings by words and compare the words until either + a differing word is found or max_bytes is exhausted. In the former + case, move through the words to find the differing byte and return + plus or minus one, appropriately. In the latter case, return zero + (equality). + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble that would be necessary to assure alignment. This + is supported by the intuition that most source arrays (even more + true of most big source arrays) will be word aligned to begin with. + + 2) Rather than decrementing max_bytes to zero, I calculate the + address of the byte after the last byte of the source_1 array, and + quit when the source byte pointer passes that. +*/ + + .globl _memcmp + .globl __memcmp + .leafproc _memcmp,__memcmp + .align 2 + +_memcmp: +#ifndef __PIC + lda .Lrett,g14 +#else + lda .Lrett-(.+8)(ip),g14 +#endif +__memcmp: + mov g14,g13 # preserve return address + ldconst 0,g14 # conform to register conventions + cmpibge 0,g2,Lequal_exit # quit if max_bytes <= 0 + addo g0,g2,g2 # calculate byte addr of byte after last in src1 + +.Lwloop: + cmpo g0,g2 + ld (g0), g5 # fetch word of source_1 + bge Lequal_exit # quit (equal) if max_bytes exhausted + ld (g1), g3 # fetch word of source_2 + addo 4,g0,g0 # post-increment source_1 byte ptr + addo 4,g1,g1 # post-increment source_2 byte ptr + cmpobe g5,g3,.Lwloop # branch if source words are equal + + ldconst 0xff,g4 # byte extraction mask + subo 4,g0,g0 # back up src1 pointer + +.Lcloop: and g4,g5,g7 # extract and compare individual bytes + and g4,g3,g6 + cmpobne g7,g6,.diff # branch if they are different + shlo 8,g4,g4 # position mask for next extraction + addo 1,g0,g0 + cmpobl g0,g2,.Lcloop # quit if max_bytes is exhausted + +Lequal_exit: + mov 0,g0 + bx (g13) +.Lrett: + ret + +.diff: bl .neg # arrays differ at current byte. + /* return 1 or -1 appropriately */ + mov 1,g0 + bx (g13) +.neg: subi 1,0,g0 +.Lexit: + bx (g13) + +/* end or memcmp */ diff --git a/lib/machine/i960/memcmp_ca.S b/lib/machine/i960/memcmp_ca.S new file mode 100644 index 0000000..317ea89 --- /dev/null +++ b/lib/machine/i960/memcmp_ca.S @@ -0,0 +1,205 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memcm_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1992,1993 Intel Corp., all rights reserved + */ + +/* + procedure memcmp (optimized assembler version for the CA) + + result = memcmp (src1_addr, src2_addr, max_bytes) + + compare the byte array pointed to by src1_addr to the byte array + pointed to by src2_addr. Return 0 iff the arrays are equal, -1 if + src1_addr is lexicly less than src2_addr, and 1 if it is lexicly + greater. Do not compare more than max_bytes bytes. + + Undefined behavior will occur if the end of either source array + is in the last word of the program's allocated memory space. This + is so because, in several cases, memcmp will fetch ahead one word. + Disallowing the fetch ahead would impose a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source1 is word aligned, source2 is not + 4) source2 is word aligned, source1 is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g14 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers are sufficient to implement the routine. + The registers are used as follows: + + g0 original src1 ptr; extracted word; return result + g1 src2 ptr; byt extraction mask + g2 maximum number of bytes to compare + g3 src2 word ptr + Little endian + g4 lsw of src1 + g5 msw of src1 + g6 src2 word + g7 src1 word ptr + Big endian + g4 msw of src1 + g5 lsw of src1 + g6 src1 word ptr + g7 src2 word + g13 return address + g14 shift count +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g4 +#define LSW g5 +#define SRC1 g6 +#define SRC2 g7 +#else +#define LSW g4 +#define MSW g5 +#define SRC2 g6 +#define SRC1 g7 +#endif + + .globl _memcmp + .globl __memcmp + .leafproc _memcmp, __memcmp + .align 2 +_memcmp: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memcmp: +Lrestart: +#if __i960_BIG_ENDIAN__ + subo 1,g0,SRC1 + notand SRC1,3,SRC1 # extract word addr of start of src1 +#else + notand g0,3,SRC1 # extract word addr of start of src1 +#endif + lda (g14),g13 # preserve return address + cmpibge.f 0,g2,Lequal_exit # return equality if number bytes 0 + notand g1,3,g3 # extract word addr of start of src2 + ld (SRC1),LSW # fetch word with at least first byte of src1 + cmpo g3,g1 # check alignment of src2 + ld 4(SRC1),MSW # fetch second word of src1 + shlo 3,g0,g14 # compute shift count for src1 +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # adjust shift count for big endian. +#endif + ld (g3),SRC2 # fetch word with at least first byte of src2 + eshro g14,g4,LSW # extract word of src1 + lda 8(SRC1),SRC1 # advance src1 word addr + bne.f Lsrc2_unaligned # branch if src2 is NOT word aligned + + mov LSW,g0 # at least src2 is word aligned + + lda 0xff,g1 + +Lwloop: # word comparing loop + cmpo SRC2,g0 # compare src1 and src2 words + lda 4(g3),g3 # pre-increment src2 addr + mov MSW,LSW # move msw of src1 to lsw + ld (SRC1),MSW # pre-fetch next msw of src1 + subi 4,g2,g2 # decrement maximum byte count + bne.f Lcloop # branch if src1 and src2 unequal + cmpi 0,g2 + ld (g3),SRC2 # pre-fetch next word of src2 + eshro g14,g4,g0 # extract word of src1 + lda 4(SRC1),SRC1 # post-increment src1 addr + bl.t Lwloop # branch if max_bytes not reached yet + + b Lequal_exit # strings were equal up through max_bytes + +Lcloop_setup: # setup for coming from Lsrc2_unaligned + mov LSW,g0 # restore extracted src1 word + subo 4,g2,g2 # make up for later re-incrementing + lda 0xff,g1 # byte extraction mask + +Lcloop: # character comparing loop +#if __i960_BIG_ENDIAN__ + rotate 24,g1,g1 # shift mask for next byte +#endif + and SRC2,g1,g3 # extract next char of src2 + and g0,g1,LSW # extract next char of src1 + cmpobne.f LSW,g3,.diff # check for equality +#if ! __i960_BIG_ENDIAN__ + shlo 8,g1,g1 # shift mask for next byte +#endif + subi 1,g2,g2 # decrement character counter + b Lcloop # branch if null not reached + + +Lequal_exit: # words are equal up thru null byte + mov 0,g14 # conform to register conventions + lda 0,g0 # return zero, indicating equality + bx (g13) # return +Lrett: + ret + +.diff: + addo 4,g2,g2 # to make up for extra decrement in loop + lda 0,g14 + bl Lless_than_exit +Lgreater_than_exit: + cmpibge.f 0,g2,Lequal_exit # branch if difference is beyond max_bytes + mov 1,g0 + bx (g13) # g0 = 1 (src1 > src2) +Lless_than_exit: + cmpibge.f 0,g2,Lequal_exit # branch if difference is beyond max_bytes + subi 1,0,g0 + bx (g13) # g0 = -1 (src1 < src2) + +Lsrc2_unaligned: + notor g1,3,g14 # first step in computing new src1 ptr + ld 4(g3),SRC1 # fetch second word of src2 + shlo 3,g1,MSW # compute shift count for src2 +#if __i960_BIG_ENDIAN__ + subo MSW,0,MSW +#endif + eshro MSW,g6,SRC2 # extract word of src2 + cmpo LSW,SRC2 # compare src1 and src2 words + lda 4(g3),g1 # set new src2 ptr + bne.f Lcloop_setup # first four bytes differ + subo g14,g0,g0 # second (final) step in computing new src1 ptr + addi g14,g2,g2 # compute new max_bytes too + lda (g13),g14 # prepare return pointer for Lrestart + b Lrestart # continue with both string fetches shifted diff --git a/lib/machine/i960/memcpy.S b/lib/machine/i960/memcpy.S new file mode 100644 index 0000000..8465e47 --- /dev/null +++ b/lib/machine/i960/memcpy.S @@ -0,0 +1,160 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memcpy.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure memmove (optimized assembler version for the 80960K series) + procedure memcpy (optimized assembler version for the 80960K series) + + dest_addr = memmove (dest_addr, src_addr, len) + dest_addr = memcpy (dest_addr, src_addr, len) + + copy len bytes pointed to by src_addr to the space pointed to by + dest_addr. Return the original dest_addr. + + These routines will work even if the arrays overlap. The standard + requires this of memmove, but memcpy is allowed to fail if overlap + is present. Nevertheless, it is implemented the same as memmove + because the overhead is trifling. + + Undefined behavior will occur if the end of the source array is in + the last two words of the program's allocated memory space. This + is so because the routine fetches ahead. Disallowing the fetch + ahead would impose a severe performance penalty. + + Strategy: + + Fetch the source array by words and store them by words to the + destination array, until there are fewer than three bytes left + to copy. Then, using the last word of the source (the one that + contains the remaining 0, 1, 2, or 3 bytes to be copied), store + a byte at a time until Ldone. + + Tactics: + + 1) Do NOT try to fetch and store the words in a word aligned manner + because, in my judgement, the performance degradation experienced due + to non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. This is supported by the intuition that most source and + destination arrays (even more true of most big source arrays) will + be word aligned to begin with. + + 2) For non-overlapping arrays, rather than decrementing len to zero, + I calculate the address of the byte after the last byte of the + destination array, and quit when the destination byte pointer passes + that. + + 3) For overlapping arrays where the source starts at a lower address + than the destination the move is performed in reverse order. + + 4) Overlapping arrays where the source starts at a higher address + are treated like non-overlapping case. Where the two arrays exactly + coincide, the routine is short-circuited; no move is Ldone at all. + This costs only one cycle. +*/ + + .globl _memcpy, _memmove + .globl __memcpy, __memmove + .leafproc _memmove, __memmove + .leafproc _memcpy, __memcpy + .align 2 +_memmove: +_memcpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memmove: +__memcpy: + mov g14, g13 # preserve return address + cmpibge 0,g2,Lexit # exit if number of bytes to move is <= zero. + cmpo g0,g1 # does start of dest overlap end of src? + addo g2,g1,g3 + be Lexit # no move necessary if src and dest are same + concmpo g3,g0 + addo g2, g0, g6 + bg Lbackwards # if overlap, then do move backwards + + ld (g1), g7 # fetch first word of source + mov g0, g5 + b Lwloop_b + +Lwloop_a: + ld (g1), g7 # fetch ahead next word of source + st g4, (g5) # store word to dest + addo 4, g5, g5 # post-increment dest pointer +Lwloop_b: # word copying loop + addo 4, g1, g1 # pre-increment src pointer + cmpo g3, g1 # is len <= 3 ? + mov g7, g4 # keep a copy of the current word + bge Lwloop_a # loop if more than 3 bytes to move + cmpobe g6, g5, Lexit # quit if no more bytes to move + +Lcloop_a: # character copying loop (len < 3) + stob g4, (g5) # store a byte + shro 8, g4, g4 # position next byte for storing + addo 1, g5, g5 + cmpobne g6, g5, Lcloop_a # quit if no more bytes to move + +Lexit: + mov 0, g14 + bx (g13) # g0 = dest array address; g14 = 0 +Lrett: + ret + +Lwloop.a: + subo 4, g6, g6 # pre-decrement dest pointer + st g7, (g6) # store word to dest +Lbackwards: # word copying loop + subo 4, g3, g3 # pre-decrement src pointer + cmpo g1, g3 # is len <= 3? + ld (g3), g7 # fetch ahead next word of source + ble Lwloop.a # loop if more than 3 bytes to move + cmpobe g6, g0, Lexit # quit if no more bytes to move + +Lcloop.a: + subo 1, g6, g6 + rotate 8, g7, g7 # position byte for storing + stob g7, (g6) # store byte + cmpobne g6, g0, Lcloop.a # quit if no more bytes to move + b Lexit + +/* end of memmove */ diff --git a/lib/machine/i960/memcpy_ca.S b/lib/machine/i960/memcpy_ca.S new file mode 100644 index 0000000..eebfa88 --- /dev/null +++ b/lib/machine/i960/memcpy_ca.S @@ -0,0 +1,353 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memcp_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1992,1993 Intel Corp., all rights reserved + */ + +/* + procedure memmove (optimized assembler version for the CA) + procedure memcpy (optimized assembler version for the CA) + + dest_addr = memmove (dest_addr, src_addr, len) + dest_addr = memcpy (dest_addr, src_addr, len) + + copy len bytes pointed to by src_addr to the space pointed to by + dest_addr. Return the original dest_addr. + + Memcpy will fail if the source and destination string overlap + (in particular, if the end of the source is overlapped by the + beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + Memmove will not fail if overlap exists. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last word of the program's + allocated memory space. This is so because, in several cases, the + routine will fetch ahead one word. Disallowing the fetch ahead would + impose a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source is word aligned, destination is not + 4) destination is word aligned, source is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 dest ptr; not modified, so that it may be returned + g1 src ptr; shift count + g2 len + g3 src ptr (word aligned) + g4 dest ptr (word aligned) + g5 -4 for Lbackwards move + Little endian + g6 lsw of double word for extraction of 4 bytes + g7 msw of double word for extraction of 4 bytes + Big endian + g6 msw of double word for extraction of 4 bytes + g7 lsw of double word for extraction of 4 bytes + g13 return address + g14 byte extracted. +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g6 +#define LSW g7 +#else +#define LSW g6 +#define MSW g7 +#endif + + .globl _memmove, _memcpy + .globl __memmove, __memcpy + .leafproc _memmove, __memmove + .leafproc _memcpy, __memcpy + .align 2 +_memcpy: +_memmove: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memcpy: +__memmove: + cmpibge.f 0,g2,Lquick_exit # Lexit if number of bytes to move is <= zero. + cmpo g0,g1 # if dest starts earlier than src ... + lda (g14),g13 # preserve return address + addo g2,g1,g5 # compute addr of byte after last byte of src + be.f Lexit_code # no move necessary if src and dest are same + concmpo g5,g0 # ... or if dest starts after end of src ... + notand g1,3,g3 # extract word addr of start of src + bg.f Lbackwards # ... then drop thru, else do move backwards + cmpo g3,g1 # check alignment of src + ld (g3),LSW # fetch word containing at least first byte + notand g0,3,g4 # extract word addr of start of dest + lda 4(g3),g3 # advance src word addr + bne.f Lcase_245 # branch if src is NOT word aligned + +Lcase_13: + cmpo g0,g4 # check alignment of dest + subo 4,g4,g4 # store is pre-incrementing; back up dest addr + be.t Lcase_1 # branch if dest word aligned + +Lcase_3: # src is word aligned; dest is not + addo 8,g4,g4 # move dest word ptr to first word boundary + lda (g0),g1 # copy dest byte ptr + mov LSW,MSW # make copy of first word of src + lda 32,g14 # initialize shift count to zero (mod 32) + +Lcase_25: +Lcase_3_cloop_at_start: # character copying loop for start of dest str + cmpdeci 0,g2,g2 # is max_bytes exhausted? + be.f Lexit_code # Lexit if max_bytes is exhausted +#if __i960_BIG_ENDIAN__ + rotate 8,MSW,MSW # move next byte into position for extraction + subo 8,g14,g14 # augment the shift counter + stob MSW,(g1) # store the byte in dest +#else + addo 8,g14,g14 # augment the shift counter + stob MSW,(g1) # store the byte in dest + shro 8,MSW,MSW # move next byte into position for extraction +#endif + lda 1(g1),g1 # post-increment dest ptr + cmpobne.t g1,g4,Lcase_3_cloop_at_start # branch if reached word boundary + + ld (g3),MSW # fetch msw of operand for double shift + +Lcase_4: +Lcase_3_wloop: + cmpi g2,4 # less than four bytes to move? + lda 4(g3),g3 # post-increment src word addr + eshro g14,g6,g1 # extract 4 bytes of src + bl.f Lcase_3_cloop # branch if < four bytes left to move + mov MSW,LSW # move msw to lsw + ld (g3),MSW # pre-fetch msw of operand for double shift + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + st g1,(g4) # store 4 bytes to dest + addo 4,g4,g4 # post-increment dest ptr + b Lcase_3_wloop + +Lcase_1_wloop: # word copying loop + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + ld (g3),LSW # pre-fetch next word of src + addo 4,g3,g3 # post-increment src addr + st g1,(g4) # store word in dest string +Lcase_1: # src and dest are word aligned + cmpi g2,4 # check for fewer than four bytes to move + addo 4,g4,g4 # pre-increment dest addr + lda (LSW),g1 # keep a copy of the src word + bge.t Lcase_1_wloop # branch if at least four bytes to copy +Lcase_3_cloop: + cmpibe.f 0,g2,Lexit_code # Lexit if max_bytes is exhausted + +Lcase_1_cloop: +#if __i960_BIG_ENDIAN__ + rotate 8,g1,g1 # move next byte into position for extraction +#endif + subi 1,g2,g2 + stob g1,(g4) # store the byte in dest + cmpi 0,g2 + lda 1(g4),g4 # post-increment dest byte addr +#if ! __i960_BIG_ENDIAN__ + shro 8,g1,g1 # move next byte into position for extraction +#endif + bne.t Lcase_1_cloop # Lexit if max_bytes is exhausted + +Lexit_code: + mov 0,g14 # conform to register conventions + bx (g13) # g0 = addr of dest; g14 = 0 +Lrett: + ret + + +Lcase_245: + cmpo g0,g4 # check alignment of dest + ld (g3),MSW # pre-fetch second half + and 3,g1,g1 # compute shift count + shlo 3,g1,g14 +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # adjust shift count for big endian +#endif + be.t Lcase_4 # branch if dest is word aligned + or g4,g1,g1 # is src earlier in word, later, or sync w/ dst + cmpo g0,g1 # < indicates first word of dest has more bytes + lda 4(g4),g4 # move dest word addr to first word boundary + eshro g14,g6,g5 # extract four bytes + lda (g0),g1 +#if __i960_BIG_ENDIAN__ + bge.f 1f +#else + bg.f 1f +#endif + mov MSW,LSW + lda 4(g3),g3 # move src word addr to second word boundary +1: + mov g5,MSW + b Lcase_25 + + +Lbackwards: + notand g5,3,MSW # extract word addr of byte after end of src + cmpo MSW,g5 # check alignment of end of src + subo 4,MSW,g3 # retreat src word addr + addo g2,g0,g1 # compute addr of byte after end of dest + notand g1,3,g4 # extract word addr of start of dest + bne.f Lcase.245 # branch if src is NOT word aligned + +Lcase.13: + cmpo g1,g4 # check alignment of dest + ld (g3),MSW # fetch last word of src + subo 4,g3,g3 # retreat src word addr + be.t Lcase.1 # branch if dest word aligned + +Lcase.3: # src is word aligned; dest is not + mov MSW,LSW # make copy of first word of src + lda 32,g14 # initialize shift count to zero (mod 32) + +Lcase.25: +Lcase.3_cloop_at_start: # character copying loop for start of dest str + cmpdeci 0,g2,g2 # is max.bytes exhausted? + be.f Lexit_code # Lexit if max_bytes is exhausted +#if ! __i960_BIG_ENDIAN__ + rotate 8,LSW,LSW # move next byte into position for storing +#endif + lda -1(g1),g1 # pre-decrement dest ptr + cmpo g1,g4 # have we reached word boundary in dest yet? + stob LSW,(g1) # store the byte in dest +#if __i960_BIG_ENDIAN__ + shro 8,LSW,LSW # move next byte into position for storing + addo 8,g14,g14 # augment the shift counter +#else + subo 8,g14,g14 # augment the shift counter +#endif + bne.t Lcase.3_cloop_at_start # branch if reached word boundary? + + ld (g3),LSW # fetch lsw of operand for double shift + +#if __i960_BIG_ENDIAN__ + cmpobne 0,g14,Lcase.3_wloop +Lcase.3_wloop2: + cmpi g2,4 # less than four bytes to move? + lda -4(g3),g3 # post-decrement src word addr + mov MSW,g1 # extract 4 bytes of src + lda (LSW),MSW # move lsw to msw + subo 4,g4,g4 # pre-decrement dest ptr + bl.f Lcase.3_cloop # branch if < four bytes left to move + ld (g3),LSW # pre-fetch lsw of operand for double shift + subi 4,g2,g2 # decrease max.byte count by the 4 bytes moved + st g1,(g4) # store 4 bytes to dest + b Lcase.3_wloop2 +#endif + +Lcase.4: +Lcase.3_wloop: + cmpi g2,4 # less than four bytes to move? + lda -4(g3),g3 # post-decrement src word addr + eshro g14,g6,g1 # extract 4 bytes of src + lda (LSW),MSW # move lsw to msw + subo 4,g4,g4 # pre-decrement dest ptr + bl.f Lcase.3_cloop # branch if < four bytes left to move + ld (g3),LSW # pre-fetch lsw of operand for double shift + subi 4,g2,g2 # decrease max.byte count by the 4 bytes moved + st g1,(g4) # store 4 bytes to dest + b Lcase.3_wloop + +Lcase.1_wloop: # word copying loop + subi 4,g2,g2 # decrease max.byte count by the 4 bytes moved + ld (g3),MSW # pre-fetch next word of src + subo 4,g3,g3 # post-decrement src addr + st g1,(g4) # store word in dest string +Lcase.1: # src and dest are word aligned + cmpi g2,4 # check for fewer than four bytes to move + subo 4,g4,g4 # pre-decrement dest addr + lda (MSW),g1 # keep a copy of the src word + bge.t Lcase.1_wloop # branch if at least four bytes to copy +Lcase.3_cloop: + cmpibe.f 0,g2,Lexit_code # Lexit if max_bytes is exhausted +#if ! __i960_BIG_ENDIAN__ + rotate 8,g1,g1 # move next byte into position for storing +#endif + lda 4(g4),g4 # pre-decremented dest addr 4 too much + +Lcase.1_cloop: + subi 1,g4,g4 # pre-decrement dest byte addr + cmpi g4,g0 # has dest ptr reached beginning of dest? + stob g1,(g4) # store the byte in dest +#if __i960_BIG_ENDIAN__ + shro 8,g1,g1 # move next byte into position for storing +#else + rotate 8,g1,g1 # move next byte into position for storing +#endif + bne.t Lcase.1_cloop # Lexit if move is completed + b Lexit_code + +Lcase.245: + cmpo g1,g4 # check alignment of dest + ld (MSW),MSW # pre-fetch word with at least last byte + and 3,g5,g5 # compute shift count + ld (g3),LSW # pre-fetch second to last word + shlo 3,g5,g14 +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # adjust shift count for big endian +#endif + be.t Lcase.4 # branch if dest is word aligned + or g4,g5,g5 # is src earlier in word, later, or sync w/ dst + cmpo g1,g5 # < indicates last word of dest has less bytes + eshro g14,g6,g5 # extract four bytes + bl.t 1f + mov LSW,MSW +#if ! __i960_BIG_ENDIAN__ + be.t 1f +#endif + subo 4,g3,g3 # move src word addr to second word boundary +1: + mov g5,LSW + b Lcase.25 + + +Lquick_exit: + mov g14,g13 + b Lexit_code + +/* end of memmove */ diff --git a/lib/machine/i960/memset.S b/lib/machine/i960/memset.S new file mode 100644 index 0000000..9121d45 --- /dev/null +++ b/lib/machine/i960/memset.S @@ -0,0 +1,121 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "memset.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1989,1993 Intel Corp., all rights reserved + */ + +/* + procedure memset (optimized assembler version: 80960K series, 80960CA) + + dest_addr = memset (dest_addr, char, len) + + Fill len bytes pointed to by dest_addr with the value of char. + Return the original address of dest_addr. + + This program avoids performing unaligned accesses. It stores + from zero to seven bytes, and then stores aligned longwords, + and then stores from zero to seven bytes, as necessary to + store len bytes starting at dest_addr. + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. +*/ + + .globl _memset + .globl __memset + .leafproc _memset, __memset + .align 2 +_memset: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__memset: + cmpo 7,g2 # are there fewer than seven characters to move? + lda (g14),g13 # save return address + notand g0,7,g3 # test for non-aligned dest_ptr + lda 0,g14 # conform to register conventions + shlo 24,g1,g4 # prepare word of char + lda (g0),g6 # preserve dest_ptr for return + shro 8,g4,g5 + bge.f Lcloop_setup + cmpo g3,g0 # is dest longword aligned + lda 7(g3),g3 # bump dest_ptr to next longword boundary + or g4,g5,g4 + be.t Lwloop_setup + +Lbgn_cloop: + cmpo g6,g3 # Have we reached longword boundary? + stob g1,(g6) # store one byte of char + subo 1,g2,g2 # decrement len + lda 1(g6),g6 # increment dest_ptr + bne.t Lbgn_cloop # loop if more bytes to store before longword + + cmpobge.f 7,g2,Lcloop + +Lwloop_setup: + shro 16,g4,g5 + or g4,g5,g4 + mov g4,g5 # now have a longword of char + +Lwloop: + cmpo 15,g2 # Do we have to store more longwords? + stl g4,(g6) # Store longword of char + subo 8,g2,g2 # Decrement len + lda 8(g6),g6 # Increment dest_ptr + bl.t Lwloop # loop if more longwords to store + +Lcloop_setup: + cmpobge.t 0,g2,Lexit + +Lcloop: + cmpo 1,g2 # Is len exhausted? + stob g1,(g6) # Store byte + subo 1,g2,g2 # Decrement len + lda 1(g6),g6 # Increment dest_ptr + bne.t Lcloop # loop if more bytes to store + +Lexit: + bx (g13) +Lrett: + ret + +/* end of memset */ diff --git a/lib/machine/i960/setjmp.S b/lib/machine/i960/setjmp.S new file mode 100644 index 0000000..804df0e --- /dev/null +++ b/lib/machine/i960/setjmp.S @@ -0,0 +1,96 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + +/******************************************************************************/ +/* */ +/* setjmp(), longjmp() */ +/* */ +/******************************************************************************/ + .file "setjmp.as" + .text + /* .link_pix */ + + .align 4 + .globl _setjmp +_setjmp: + flushreg + andnot 0xf,pfp,g1 /* get pfp, mask out return status bits */ + st g1, 0x58(g0) /* save fp of caller*/ + /* save globals not killed by the calling convention */ + stq g8, 0x40(g0) /* save g8-g11*/ + st g12, 0x50(g0) /* save g12*/ + st g14, 0x54(g0) /* save g14*/ + /* save previous frame local registers */ + ldq (g1), g4 /* get previous frame pfp, sp, rip, r3 */ + stq g4, (g0) /* save pfp, sp, rip, r3 */ + ldq 0x10(g1), g4 /* get previous frame r4-r7 */ + stq g4, 0x10(g0) /* save r4-r7 */ + ldq 0x20(g1), g4 /* get previous frame r8-r11 */ + stq g4, 0x20(g0) /* save r8-r11 */ + ldq 0x30(g1), g4 /* get previous frame r12-r15 */ + stq g4, 0x30(g0) /* save r12-r15 */ + + mov 0, g0 /* return 0 */ + ret + + /* + * fake a return to the place that called the corresponding _setjmp + */ + .align 4 + .globl _longjmp +_longjmp: + call 0f /* ensure there is at least one stack frame */ + +0: + flushreg /* do this before swapping stack */ + ld 0x58(g0), pfp /* get fp of caller of setjmp */ + /* restore local registers + * the following code modifies the frame of the function which originally + * called setjmp. + */ + ldq (g0), g4 /* get pfp, sp, rip, r3 */ + stq g4, (pfp) /* restore pfp, sp, rip, r3 */ + ldq 0x10(g0), g4 /* get r4-r7 */ + stq g4, 0x10(pfp) /* restore r4-r7 */ + ldq 0x20(g0), g4 /* get r8-r11 */ + stq g4, 0x20(pfp) /* restore r8-r11 */ + ldq 0x30(g0), g4 /* get r12-r15 */ + stq g4, 0x30(pfp) /* restore r12-r15 */ + /* restore global registers */ + ldq 0x40(g0), g8 /* get old g8-g11 values */ + ld 0x50(g0), g12 /* get old g12 value */ + ld 0x54(g0), g14 /* get old g14 value */ + + mov g1, g0 /* get return value */ + cmpo g0, 0 /* make sure it is not zero */ + bne 0f + mov 1, g0 /* return 1 by default */ +0: + ret /* return to caller of _setjmp */ diff --git a/lib/machine/i960/strchr.S b/lib/machine/i960/strchr.S new file mode 100644 index 0000000..bc50c2c --- /dev/null +++ b/lib/machine/i960/strchr.S @@ -0,0 +1,123 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strchr.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strchr (optimized assembler version for the 80960K series) + + src_addr = strchr (src_addr, char) + + return a pointer to the first byte that contains the indicated + byte in the source string. Return null if the byte is not found. + + Undefined behavior will occur if the end of the source string (i.e. + the terminating null byte) is in the last two words of the program's + allocated memory space. This is so because strchr fetches ahead. + Disallowing the fetch ahead would impose a severe performance penalty. + + Strategy: + + Fetch the source string by words and scanbyte the words for the + char until either a word with the byte is found or the null byte is + encountered. In the former case, move through the word to find the + matching byte and return its memory address. In the latter case, + return zero (null). + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble that would be necessary to assure alignment. This + is supported by the intuition that most source arrays (even more + true of most big source arrays) will be word aligned to begin with. +*/ + + .globl _strchr + .globl __strchr + .leafproc _strchr, __strchr + .align 2 +_strchr: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strchr: + + ld (g0),g4 # fetch first word + lda 0xff,g7 # byte extraction mask + and g1,g7,g1 # make char an 8-bit ordinal + shlo 8,g1,g2 # broadcast the char to four bytes + or g1,g2,g2 + shlo 16,g2,g5 + or g2,g5,g3 + mov g14,g13 # preserve return address + addo 4,g0,g0 # post-increment src pointer + mov 0,g14 # conform to register linkage standard + +Lsearch_for_word_with_char_or_null: + mov g4,g5 # copy word + scanbyte g3,g5 # check for byte with char + ld (g0),g4 # fetch next word of src + bo Lsearch_for_char # branch if char found + scanbyte 0,g5 # check for null byte + addo 4,g0,g0 # post-increment src pointer + bno Lsearch_for_word_with_char_or_null # branch if not null + +Lnot_found: + mov 0,g0 # char not found. Return null +Lexit_code: + bx (g13) # g0 = addr of char in src (or null); g14 = 0 +Lrett: + ret + +Lsearch_for_char: + subo 5,g0,g0 # back up the byte pointer +Lsearch_for_char.a: + and g5,g7,g6 # extract byte + cmpo g1,g6 # is it char? + addo 1,g0,g0 # bump src byte ptr + shro 8,g5,g5 # shift word to position next byte + be Lexit_code + cmpobne 0,g6,Lsearch_for_char.a # quit if null comes before char + b Lnot_found + +/* end of strchr */ diff --git a/lib/machine/i960/strchr_ca.S b/lib/machine/i960/strchr_ca.S new file mode 100644 index 0000000..f52eae2 --- /dev/null +++ b/lib/machine/i960/strchr_ca.S @@ -0,0 +1,152 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strch_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strchr (optimized assembler version for the CA) + + src_addr = strchr (src_addr, char) + + return a pointer to the first byte that contains the indicated + byte in the source string. Return null if the byte is not found. + + Undefined behavior will occur if the end of the source string (i.e. + the terminating null byte) is in the last two words of the program's + allocated memory space. This is so because, in several cases, strchr + will fetch ahead. Disallowing the fetch ahead would impose a severe + performance penalty. + + This program handles two cases: + + 1) the argument starts on a word boundary + 2) the argument doesn't start on a word boundary + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 src ptr; upon return it is a pointer to the matching byte, or null + g1 char to seek + g2 mask to avoid unimportant bytes in first word + g3 char to seek, broadcast to all four bytes + g4 word of the source string + g5 copy of the word + g6 extracted character + g7 byte extraction mask + g13 return address + g14 +*/ + + .globl _strchr + .globl __strchr + .leafproc _strchr, __strchr + .align 2 +_strchr: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strchr: + + lda 0xff,g7 # byte extraction mask + and g1,g7,g1 # make char an 8-bit ordinal + shlo 8,g1,g2 # broadcast the char to four bytes + or g1,g2,g2 + shlo 16,g2,g4 + cmpo g1,g7 # is char being sought 0xff? + or g4,g2,g3 + lda (g14),g13 # preserve return address + notand g0,3,g5 # extract word addr of start of src + lda 0,g14 # conform to register linkage standard + and g0,3,g6 # extract byte offset of src + ld (g5),g4 # fetch word containing at least first byte + shlo 3,g6,g6 # get shift count for making mask for first word + lda 4(g5),g0 # post-increment src word pointer + subi 1,0,g5 # mask initially all ones +#if __i960_BIG_ENDIAN__ + shro g6,g5,g5 # get mask for bytes needed from first word +#else + shlo g6,g5,g5 # get mask for bytes needed from first word +#endif + notor g4,g5,g4 # set unneeded bytes to all ones + be.f Lsearch_for_0xff # branch if seeking 0xff + +Lsearch_for_word_with_char_or_null: + scanbyte g3,g4 # check for byte with char + lda (g4),g5 # copy word + ld (g0),g4 # fetch next word of src + bo.f Lsearch_for_char # branch if null found + scanbyte 0,g5 # check for null byte + lda 4(g0),g0 # post-increment src word pointer + bno.t Lsearch_for_word_with_char_or_null # branch if not null + +Lnot_found: + mov 0,g0 # char not found. Return null +Lexit_code: + bx (g13) # g0 = addr of char in src (or null); g14 = 0 +Lrett: + ret + +Lsearch_for_char: + subo 5,g0,g0 # back up the byte pointer +Lsearch_for_char.a: +#if __i960_BIG_ENDIAN__ + rotate 8,g5,g5 # shift word to position next byte +#endif + and g5,g7,g6 # extract byte + cmpo g1,g6 # is it char? + lda 1(g0),g0 # bump src byte ptr +#if ! __i960_BIG_ENDIAN__ + shro 8,g5,g5 # shift word to position next byte +#endif + be.f Lexit_code + cmpobne.t 0,g6,Lsearch_for_char.a # quit if null comes before char + b Lnot_found + +Lsearch_for_0xff: + lda 0xf0f0f0f0,g2 # make first comparison mask for char=-1 case. + or g5,g2,g2 + and g4,g2,g4 # make unimportant bytes of first word 0x0f + b Lsearch_for_word_with_char_or_null + +/* end of strchr */ + diff --git a/lib/machine/i960/strcmp.S b/lib/machine/i960/strcmp.S new file mode 100644 index 0000000..c0cd4bd --- /dev/null +++ b/lib/machine/i960/strcmp.S @@ -0,0 +1,118 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strcmp.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure strcmp (optimized assembler version for the 80960K Series) + + result = strcmp (src1_addr, src2_addr) + + compare the null terminated string pointed to by src1_addr to + the string pointed to by src2_addr. Return 0 iff the strings + are equal, -1 if src1_addr is lexicographically less than src2_addr, + and 1 if it is lexicographically greater. + + Undefined behavior will occur if the end of either source string + (i.e. the terminating null byte) is in the last two words of the + program's allocated memory space. This is so because strcmp fetches + ahead. Disallowing the fetch ahead would impose a severe performance + penalty. + + Strategy: + + Fetch the source strings by words and compare the words until either + differing words are found or the null byte is encountered. In either + case, move through the word until either the differing byte if found, + in which case return -1 or 1 appropriately; or the null byte is + encountered, in which case, return zero (equality). + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. This is supported by the intuition that many source + strings will be word aligned to begin with. +*/ + + .globl _strcmp + .globl __strcmp + .leafproc _strcmp,__strcmp + .align 2 + +_strcmp: +#ifndef __PIC + lda .Lrett,g14 +#else + lda .Lrett-(.+8)(ip),g14 +#endif +__strcmp: + ld (g0), g5 # fetch first word of source_1 + mov g14,g7 # preserve return address + ldconst 0,g14 # conform to register conventions + ldconst 0xff,g4 # byte extraction mask +.Lwloop: + addo 4,g0,g0 # post-increment source_1 byte ptr + ld (g1), g3 # fetch word of source_2 + scanbyte 0,g5 # does word have a null byte? + mov g5,g2 # save a copy of the source_1 word + be .Lcloop # branch if null byte encountered + cmpo g2,g3 # are the source words the same? + addo 4,g1,g1 # post-increment source_2 byte ptr + ld (g0), g5 # fetch ahead next word of source_1 + be .Lwloop # fall thru if words are unequal + +.Lcloop: and g4,g2,g5 # extract and compare individual bytes + and g4,g3,g6 + cmpobne g5,g6,.diff # if they differ, go return 1 or -1 + cmpo 0,g6 # they are the same. Are they null? + shlo 8,g4,g4 # position mask for next extraction + bne .Lcloop # loop if null not encountered + + mov 0,g0 # return equality + bx (g7) +.Lrett: + ret +.diff: bl .neg + mov 1,g0 + bx (g7) +.neg: subi 1,0,g0 +.Lexit: + bx (g7) diff --git a/lib/machine/i960/strcmp_ca.S b/lib/machine/i960/strcmp_ca.S new file mode 100644 index 0000000..0298ffa --- /dev/null +++ b/lib/machine/i960/strcmp_ca.S @@ -0,0 +1,246 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strcm_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strcmp (optimized assembler version for the CA) + + result = strcmp (src1_addr, src2_addr) + + compare the null terminated string pointed to by src1_addr to + the string space pointed to by src2_addr. Return 0 iff the strings + are equal, -1 if src1_addr is lexicly less than src2_addr, and 1 + if it is lexicly greater. + + Undefined behavior will occur if the end of either source string + (i.e. the terminating null byte) is in the last word of the program's + allocated memory space. This is so because, in several cases, strcmp + will fetch ahead one word. Disallowing the fetch ahead would impose + a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source1 is word aligned, source2 is not + 4) source2 is word aligned, source1 is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g14 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers are sufficient to implement the routine. + The registers are used as follows: + + g0 original src1 ptr; return result + g1 src2 ptr; 0xff -- byte extraction mask + g2 src1 word ptr + g3 src2 word ptr + Little endian: + g4 lsw of src1 + g5 msw of src1 + g6 src2 word + g7 extracted src1 + Big endian: + g4 msw of src1 + g5 lsw of src1 + g6 extracted src1 + g7 src2 word + g13 return address + g14 shift count +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g4 +#define LSW g5 +#define SRC1 g6 +#define SRC2 g7 +#else +#define LSW g4 +#define MSW g5 +#define SRC2 g6 +#define SRC1 g7 +#endif + + .globl _strcmp + .globl __strcmp + .leafproc _strcmp, __strcmp + .align 2 +_strcmp: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif + +__strcmp: +Lrestart: + notand g0,3,g2 # extract word addr of start of src1 + lda (g14),g13 # preserve return address +#if __i960_BIG_ENDIAN__ + cmpo g0,g2 # check alignment of src1 +#endif + ld (g2),LSW # fetch word with at least first byte of src1 + notand g1,3,g3 # extract word addr of start of src2 + ld 4(g2),MSW # fetch second word of src1 +#if __i960_BIG_ENDIAN__ + bne Lsrc1_unaligned # branch if src1 is unaligned + cmpo g3,g1 # check alignment of src2 + ld (g3),SRC2 # fetch word with at least first byte of src2 + mov LSW,SRC1 # extract word of src1 + lda 8(g2),g2 # advance src1 word addr + bne.f Lsrc2_unaligned # branch if src2 is NOT word aligned + + /* src2 is word aligned */ + +Lwloop2: # word comparing loop + cmpo SRC2,SRC1 # compare src1 and src2 words + lda 0xff000000,g1 # byte extraction mask + mov MSW,LSW # move msw of src1 to lsw + ld (g2),MSW # pre-fetch next msw of src1 + addo 4,g2,g2 # post-increment src1 addr + lda 4(g3),g3 # pre-increment src2 addr + bne.f Lcloop # branch if src1 and src2 unequal + scanbyte 0,SRC1 # check for null byte in src1 word + ld (g3),SRC2 # pre-fetch next word of src2 + mov LSW,SRC1 # extract word of src1 + lda 0,g0 # prepare to return zero, indicating equality + bno.t Lwloop2 # branch if null byte not encountered + + /* words were equal and contained null byte */ + + mov 0,g14 # conform to register conventions + bx (g13) # return + + +Lsrc1_unaligned: +#endif + cmpo g3,g1 # check alignment of src2 + ld (g3),SRC2 # fetch word with at least first byte of src2 + shlo 3,g0,g14 # compute shift count for src1 +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # 32 - shift count for big endian. +#endif + eshro g14,g4,SRC1 # extract word of src1 + lda 8(g2),g2 # advance src1 word addr + bne.f Lsrc2_unaligned # branch if src2 is NOT word aligned + + /* at least src2 is word aligned */ + +Lwloop: # word comparing loop + cmpo SRC2,SRC1 # compare src1 and src2 words +#if __i960_BIG_ENDIAN__ + lda 0xff000000,g1 # byte extraction mask +#else + lda 0xff,g1 # byte extraction mask +#endif + mov MSW,LSW # move msw of src1 to lsw + ld (g2),MSW # pre-fetch next msw of src1 + addo 4,g2,g2 # post-increment src1 addr + lda 4(g3),g3 # pre-increment src2 addr + bne.f Lcloop # branch if src1 and src2 unequal + scanbyte 0,SRC1 # check for null byte in src1 word + ld (g3),SRC2 # pre-fetch next word of src2 + eshro g14,g4,SRC1 # extract word of src1 + lda 0,g0 # prepare to return zero, indicating equality + bno.t Lwloop # branch if null byte not encountered + + /* words were equal and contained null byte */ + + mov 0,g14 # conform to register conventions + bx (g13) # return + +Lcloop_setup: # setup for coming from Lsrc2_unaligned + mov LSW,SRC1 # restore extracted src1 word +#if __i960_BIG_ENDIAN__ + lda 0xff000000,g1 # byte extraction mask +#else + lda 0xff,g1 # byte extraction mask +#endif + +Lcloop: # character comparing loop + and SRC2,g1,g3 # extract next char of src2 + and SRC1,g1,g0 # extract next char of src1 + cmpobne.f g0,g3,.diff # check for equality + cmpo 0,g0 # check for null byte +#if __i960_BIG_ENDIAN__ + shro 8,g1,g1 # shift mask for next byte +#else + shlo 8,g1,g1 # shift mask for next byte +#endif + bne.t Lcloop # branch if null not reached + + /* words are equal up thru null byte */ + + mov 0,g14 + bx (g13) # g0 = 0 (src1 == src2) +Lrett: + ret + +.diff: + mov 0,g14 + bl Lless_than_exit +Lgreater_than_exit: + mov 1,g0 + bx (g13) # g0 = 1 (src1 > src2) +Lless_than_exit: + subi 1,0,g0 + bx (g13) # g0 = -1 (src1 < src2) + +Lsrc2_unaligned: + mov SRC1,LSW # retain src1 extracted word + ld 4(g3),SRC1 # fetch second word of src2 + shlo 3,g1,MSW # compute shift count for src2 +#if __i960_BIG_ENDIAN__ + subo MSW,0,MSW # 32 - shift count for big endian. +#endif + eshro MSW,g6,SRC2 # extract word of src2 + cmpo LSW,SRC2 # compare src1 and src2 words + notor g1,3,MSW # first step in computing new src1 ptr + lda 4(g3),g1 # set new src2 ptr + bne.f Lcloop_setup # first four bytes differ + scanbyte 0,LSW # check for null byte + lda (g13),g14 # prepare return pointer for Lrestart + subo MSW,g0,g0 # second (final) step in computing new src1 ptr + bno.t Lrestart # if null byte not encountered, continue + /* with both string fetches shifted such that */ + /* src2 is now word aligned. */ + mov 0,g14 # conform to register conventions. + lda 0,g0 # return indicator of equality. + bx (g13) diff --git a/lib/machine/i960/strcpy.S b/lib/machine/i960/strcpy.S new file mode 100644 index 0000000..ed8bb72 --- /dev/null +++ b/lib/machine/i960/strcpy.S @@ -0,0 +1,177 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strcpy.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure strcpy (optimized assembler version for the 80960K series) + procedure strcat (optimized assembler version for the 80960K series) + + dest_addr = strcpy (dest_addr, src_addr) + + copy the null terminated string pointed to by src_addr to + the string space pointed to by dest_addr. Return the original + dest_addr. + + This routine will fail if the source and destination string + overlap (in particular, if the end of the source is overlapped + by the beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last two words of the + program's allocated memory space. This is so because strcpy fetches + ahead. Disallowing the fetch ahead would impose a severe performance + penalty. + + Strategy: + + Fetch the source string and store the destination string by words + until the null byte is encountered. When the word with the null + byte is reached, store it by bytes up through the null byte only. + + Tactics: + + 1) Do NOT try to fetch and store the words in a word aligned manner + because, in my judgement, the performance degradation experienced due + to non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. This is supported by the intuition that most source and + destination strings will be word aligned to begin with. + + + procedure strcat + + dest_addr = strcat (dest_addr, src_addr) + + Appends the string pointed to by src_addr to the string pointed + to by dest_addr. The first character of the source string is + copied to the location initially occupied by the trailing null + byte of the destination string. Thereafter, characters are copied + from the source to the destination up thru the null byte that + trails the source string. + + See the strcpy routine, above, for its caveats, as they apply here too. + + Strategy: + + Skip to the end (null byte) of the destination string, and then drop + into the strcpy code. + + Tactics: + + Skipping to the null byte is Ldone by reading the destination string + in long-words and scanbyte'ing them, then examining the bytes of the + word that contains the null byte, until the address of the null byte is + known. Then we drop into the strcpy routine. It is probable (approx. + three out of four times) that the destination string as strcpy sees + it will NOT be word aligned (i.e. that the null byte won't be the + last byte of a word). But it is not worth the complication to that + routine to force word aligned memory accesses to be gaurenteed. +*/ + .globl _strcpy, _strcat + .globl __strcpy, __strcat + .leafproc _strcpy,__strcpy + .leafproc _strcat,__strcat + .align 2 +_strcat: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strcat: + mov g14,g13 # preserve return address + ldl (g0),g4 # fetch first two words + addo 8,g0,g2 # post-increment src word pointer + lda 0xff,g3 # byte extraction mask + +Lsearch_for_word_with_null_byte: + scanbyte 0,g4 # check for null byte + mov g5,g7 # copy second word + bo.f Lsearch_for_null # branch if null found + scanbyte 0,g7 # check for null byte + ldl (g2),g4 # fetch next pair of word of src + addo 8,g2,g2 # post-increment src word pointer + bno Lsearch_for_word_with_null_byte # branch if null not found yet + + subo 4,g2,g2 # back up the byte pointer + mov g7,g4 # move word with null to search word +Lsearch_for_null: + subo 9,g2,g5 # back up the byte pointer +Lsearch_for_null.a: + and g4,g3,g6 # extract byte + cmpo 0,g6 # is it null? + addo 1,g5,g5 # bump src byte ptr + shro 8,g4,g4 # shift word to position next byte + bne Lsearch_for_null.a + b Lend_of_dest_found + +_strcpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strcpy: + mov g0, g5 +Lend_of_dest_found: + ld (g1), g2 # fetch first word of source + mov g14,g6 # preserve return address + lda 0xff, g3 # byte extraction mask = 0xff; +Lwloop: # word copying loop + addo 4, g1, g1 # post-increment source ptr + scanbyte 0, g2 # does source word contain null byte? + mov g2, g4 # save a copy of the source word + be Lcloop # branch if null present + ld (g1), g2 # pre-fetch next word of source + st g4, (g5) # store current word + addo 4, g5, g5 # post-increment dest ptr + b Lwloop + +Lcloop: # character copying loop + and g3, g4, g14 # extract next char + shro 8, g4, g4 # position word for next byte extraction + cmpo 0, g14 # is it null? + stob g14, (g5) # store the byte + addo 1, g5, g5 # post-increment dest ptr + bne Lcloop # quit if null encountered + + bx (g6) # g0 = dest string address; g14 = 0 +Lrett: + ret diff --git a/lib/machine/i960/strcpy_ca.S b/lib/machine/i960/strcpy_ca.S new file mode 100644 index 0000000..dbb9444 --- /dev/null +++ b/lib/machine/i960/strcpy_ca.S @@ -0,0 +1,284 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strcp_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strcpy (optimized assembler version for the CA) + + dest_addr = strcpy (dest_addr, src_addr) + + copy the null terminated string pointed to by src_addr to + the string space pointed to by dest_addr. Return the original + dest_addr. + + This routine will fail if the source and destination string + overlap (in particular, if the end of the source is overlapped + by the beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last word of the program's + allocated memory space. This is so because, in several cases, strcpy + will fetch ahead one word. Disallowing the fetch ahead would impose + a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source is word aligned, destination is not + 4) destination is word aligned, source is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 original dest ptr; not modified, so that it may be returned. + g1 src ptr; shift count + g2 dest ptr; 4 bytes of src + g3 src ptr (word aligned) + g4 dest ptr (word aligned) + g5 0xff -- byte extraction mask + g6 lsw of double word for extraction of 4 bytes (little endian) + msw of double word for extraction of 4 bytes (big endian) + g7 msw of double word for extraction of 4 bytes (little endian) + lsw of double word for extraction of 4 bytes (big endian) + g13 return address + g14 byte extracted. When reaches null byte, which is zero, we will + be in conformance with register conventions, and can return to + the caller with a clear conscience. + + procedure strcat + + dest_addr = strcat (dest_addr, src_addr) + + Appends the string pointed to by src_addr to the string pointed + to by dest_addr. The first character of the source string is + copied to the location initially occupied by the trailing null + byte of the destination string. Thereafter, characters are copied + from the source to the destination up thru the null byte that + trails the source string. +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g6 +#define LSW g7 +#else +#define LSW g6 +#define MSW g7 +#endif + + .globl _strcpy, _strcat + .globl __strcpy, __strcat + .leafproc _strcpy, __strcpy + .leafproc _strcat, __strcat + .align 2 +_strcat: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strcat: + notand g0,3,g4 # extract word addr of start of dest + lda (g14),g13 # preserve return address + and g0,3,LSW # extract byte offset of dest + ld (g4),MSW # fetch word containing at least first byte + shlo 3,LSW,g14 # get shift count for making mask for first word + subi 1,0,LSW # mask initially all ones +#if __i960_BIG_ENDIAN__ + shro g14,LSW,LSW # get mask for bytes needed from first word + lda 0xff000000,g5 # byte extraction mask +#else + shlo g14,LSW,LSW # get mask for bytes needed from first word + lda 0xff,g5 # byte extraction mask +#endif + notor MSW,LSW,MSW # set unneeded bytes to all ones +Lsearch_for_word_with_null: + scanbyte 0,MSW # check for null byte + lda 4(g4),g4 # post-increment dest word pointer + mov MSW,LSW # keep a copy of current word + ld (g4),MSW # fetch next word of dest + bno.t Lsearch_for_word_with_null # branch if null not found yet + and g5,LSW,g14 # extract byte + cmpo 0,g14 # branch if null is first byte of word + subo 4,g4,g4 # move dest word ptr back to word with null + notand g1,3,g3 # extract word addr of start of src + lda (g4),g2 # set dest byte ptr to 1st byte of word w/ null + be.f Lcase_14 +Lsearch_for_null: +#if __i960_BIG_ENDIAN__ + shro 8,g5,g5 # move mask down to next byte +#else + shlo 8,g5,g5 # move mask up to next byte +#endif + lda 1(g2),g2 # move dest byte ptr to next byte + and g5,LSW,g14 # extract byte + cmpobne.t 0,g14,Lsearch_for_null # branch if null is not yet found + lda 0xff,g5 # byte extraction mask + b Lcase_235.a + + +_strcpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strcpy: + notand g0,3,g4 # extract word addr of start of dest + lda (g14),g13 # preserve return address + cmpo g0,g4 # check alignment of dest + lda 0xff,g5 # load mask for byte extraction + notand g1,3,g3 # extract word addr of start of src + bne.f Lcase_235 # branch if dest is NOT word aligned + +Lcase_14: + cmpo g3,g1 # check alignment of src + ld (g3),LSW # fetch word containing at least first byte + shlo 3,g1,g1 # compute shift count + lda 4(g3),g3 # advance src word addr +#if __i960_BIG_ENDIAN__ + lda 0xff,g5 # byte extraction mask +#endif + bne.f Lcase_4 # branch if src is NOT word aligned + +Lcase_1: # src and dest are word aligned + subo 4,g4,g4 # store is pre-incrementing; back up dest addr +Lcase_1_wloop: # word copying loop + scanbyte 0,LSW # check for null byte in src word + lda (LSW),g2 # keep a copy of the src word + addo 4,g4,g4 # pre-increment dest addr + ld (g3),LSW # pre-fetch next word of src + addo 4,g3,g3 # post-increment src addr + bo.f Lcase_1_cloop # branch if word contains null byte + st g2,(g4) # store word in dest string + b Lcase_1_wloop + +Lcase_3_cloop: +Lcase_1_cloop: # character copying loop +#if __i960_BIG_ENDIAN__ + rotate 8,g2,g2 # move next byte into position for extraction + and g5,g2,g14 # extract next char +#else + and g5,g2,g14 # extract next char + shro 8,g2,g2 # move next byte into position for extraction +#endif + cmpo 0,g14 # check for null byte + stob g14,(g4) # store the byte in dest + lda 1(g4),g4 # post-increment dest byte addr + bne.t Lcase_1_cloop # branch if null not reached + +Lexit_code: + bx (g13) # g0 = addr of dest; g14 = 0 +Lrett: + ret + +Lcase_3: # src is word aligned; dest is not + addo 4,g4,g4 # move dest word ptr to first word boundary + mov LSW,MSW # make copy of first word of src + lda 0,g1 # initialize shift count to zero + +Lcase_25: +Lcase_3_cloop_at_start: # character copying loop for start of dest str +#if __i960_BIG_ENDIAN__ + rotate 8,MSW,MSW # move next byte into position for extraction + and g5,MSW,g14 # extract next char +#else + and g5,MSW,g14 # extract next char + shro 8,MSW,MSW # move next byte into position for extraction +#endif + cmpo 0,g14 # check for null byte + stob g14,(g2) # store the byte in dest + lda 1(g2),g2 # post-increment dest ptr + be.f Lexit_code # branch if null byte reached + cmpo g2,g4 # have we reached word boundary in dest? + lda 8(g1),g1 # augment the shift counter + bne.t Lcase_3_cloop_at_start + +Lcase_4: + ld (g3),MSW # fetch msw of operand for double shift +#if __i960_BIG_ENDIAN__ + subo g1,0,g1 # Adjust shift count for big endian. +#endif + +Lcase_3_wloop: + eshro g1,g6,g2 # extract 4 bytes of src + lda 4(g3),g3 # post-increment src word addr + scanbyte 0,g2 # check for null byte + lda (MSW),LSW # move msw to lsw + ld (g3),MSW # pre-fetch msw of operand for double shift + bo.f Lcase_3_cloop # branch if word contains null byte + st g2,(g4) # store 4 bytes to dest + addo 4,g4,g4 # post-increment dest ptr + b Lcase_3_wloop + +Lcase_235: + lda (g0),g2 # copy dest ptr +Lcase_235.a: + cmpo g3,g1 # check alignment of src + ld (g3),LSW # fetch word containing at least first byte + and 3,g1,g14 # compute shift count + lda 4(g3),g3 # advance src word addr + shlo 3,g14,g1 + be.t Lcase_3 # branch if dest is word aligned + or g4,g14,g14 # is src earlier in word, later, or sync w/ dst + ld (g3),MSW # pre-fetch second half + cmpo g2,g14 # < indicates first word of dest has more bytes + lda 4(g4),g4 # move dest word addr to first word boundary + /* than first word of source. */ +#if __i960_BIG_ENDIAN__ + subo g1,0,g14 # Adjust shift count for big endian. + eshro g14,g6,g14 # extract four bytes + bge.f 1f +#else + eshro g1,g6,g14 # extract four bytes + bg.f 1f +#endif + mov MSW,LSW + lda 4(g3),g3 # move src word addr to second word boundary +1: + mov g14,MSW + b Lcase_25 + +/* end of strcpy */ + diff --git a/lib/machine/i960/strcspn.S b/lib/machine/i960/strcspn.S new file mode 100644 index 0000000..cd7b2e6 --- /dev/null +++ b/lib/machine/i960/strcspn.S @@ -0,0 +1,94 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strcspn.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1989,1993 Intel Corp., all rights reserved + */ + +/* + procedure strcspn (optimized assembler version: 80960K series, 80960CA) + + len = strcspn (string, charset) + + Return the number of characters in the maximum leading segment + of string which consists solely of characters NOT from charset. + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. +*/ + + .globl _strcspn + .globl __strcspn + .leafproc _strcspn, __strcspn + .align 2 + +_strcspn: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strcspn: + mov g14,g13 # save return address + lda (g0),g3 # copy string pointer + mov 0,g14 # conform to register conventions + +Lnext_char: + ldob (g3),g7 # fetch next character of string + addo 1,g1,g2 # g2 will be the charset ptr + ldob (g1),g6 # fetch first character of charset + cmpobe.f 0,g7,Lexit # quit if at end of string +Lscan_set: + cmpo g6,g7 # is charset char same as string char? + ldob (g2),g5 # fetch next charset char + addo 1,g2,g2 # bump charset ptr + be.f Lexit + cmpo g6,0 # is charset exhausted? + lda (g5),g6 + bne.t Lscan_set # check next character of charset + addo 1,g3,g3 # check next character of string + b Lnext_char + +Lexit: + subo g0,g3,g0 # compute string length + bx (g13) +Lrett: + ret + +/* end of strcspn */ diff --git a/lib/machine/i960/strdup.S b/lib/machine/i960/strdup.S new file mode 100644 index 0000000..7e879ff --- /dev/null +++ b/lib/machine/i960/strdup.S @@ -0,0 +1,66 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strdup.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif + +/* + * (c) copyright 1989,1993 Intel Corp., all rights reserved + */ + +/* + procedure strdup (optimized assembler version: 80960K series, 80960CA) + + dest_addr = strdup (src_addr) + + Allocate memory and copy thereto the string pointed to by src_addr. + Return the address of the copy, or null if unable to perform the + operation. +*/ + + .text + .align 2 + .globl _strdup +_strdup: + mov g0,r3 # Keep a copy of the original string addr + callj _strlen # Determine how much to allocate + addo 1,g0,g0 # Add one byte for the null byte at end + callj _malloc # Allocate the storage + cmpo 0,g0 + mov r3,g1 # Original string addr is now src for copy + bne.t _strcpy # Jump if allocation was successful + ret # Return the null ptr otherwise + +/* end of strdup */ diff --git a/lib/machine/i960/strlen.S b/lib/machine/i960/strlen.S new file mode 100644 index 0000000..dfbeec2 --- /dev/null +++ b/lib/machine/i960/strlen.S @@ -0,0 +1,117 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strlen.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif + +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strlen (optimized assembler version for the 80960K series) + + src_addr = strlen (src_addr) + + return the number of bytes that precede the null byte in the + string pointed to by src_addr. + + Undefined behavior will occur if the end of the source string (i.e. + the terminating null byte) is in the last four words of the program's + allocated memory space. This is so because strlen fetches ahead + several words. Disallowing the fetch ahead would impose a severe + performance penalty. + + Strategy: + + Fetch the source array by long-words and scanbyte the words for the + null byte until found. Examine the word in which the null byte is + found, to determine its actual position, and return the length. + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble that would be necessary to assure alignment. This + is supported by the intuition that many source strings will be word + aligned to begin with. +*/ + + .globl _strlen + .globl __strlen + .leafproc _strlen, __strlen + .align 2 +_strlen: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strlen: + + mov g14,g13 # preserve return address + ldl (g0),g4 # fetch first two words + addo 8,g0,g2 # post-increment src word pointer + lda 0xff,g3 # byte extraction mask + + +Lsearch_for_word_with_null_byte: + scanbyte 0,g4 # check for null byte + mov g5,g7 # copy second word + bo.f Lsearch_for_null # branch if null found + scanbyte 0,g7 # check for null byte + ldl (g2),g4 # fetch next pair of word of src + addo 8,g2,g2 # post-increment src word pointer + bno Lsearch_for_word_with_null_byte # branch if null not found yet + + subo 4,g2,g2 # back up the byte pointer + mov g7,g4 # move word with null to search word +Lsearch_for_null: + subo 9,g2,g2 # back up the byte pointer +Lsearch_for_null.a: + and g4,g3,g14 # extract byte + cmpo 0,g14 # is it null? + addo 1,g2,g2 # bump src byte ptr + shro 8,g4,g4 # shift word to position next byte + bne Lsearch_for_null.a + +Lexit_code: + subo g0,g2,g0 # calculate string length + bx (g13) # g0 = addr of src; g14 = 0 +Lrett: + ret + +/* end of strlen */ diff --git a/lib/machine/i960/strlen_ca.S b/lib/machine/i960/strlen_ca.S new file mode 100644 index 0000000..350423b --- /dev/null +++ b/lib/machine/i960/strlen_ca.S @@ -0,0 +1,146 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strle_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strlen (optimized assembler version for the CA) + + src_addr = strlen (src_addr) + + return the number of bytes that precede the null byte in the + string pointed to by src_addr. + + Undefined behavior will occur if the end of the source string (i.e. + the terminating null byte) is in the last four words of the program's + allocated memory space. This is so because, in several cases, strlen + will fetch ahead several words. Disallowing the fetch ahead would + impose a severe performance penalty. + + This program handles two cases: + + 1) the argument starts on a word boundary + 2) the argument doesn't start on a word boundary + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 original src ptr; upon return it is the byte count. + g1 + g2 src ptr + g3 mask + g4 even word of the source string + g5 odd word of the source string + g6 copy of even word, shift count + g7 copy of odd word + g13 return address + g14 byte extracted. +*/ + + .globl _strlen + .globl __strlen + .leafproc _strlen, __strlen + .align 2 +_strlen: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strlen: + + notand g0,3,g2 # extract word addr of start of src + lda (g14),g13 # preserve return address + and g0,3,g7 # extract byte offset of src + ld (g2),g5 # fetch word containing at least first byte + shlo 3,g7,g7 # get shift count for making mask for first word + lda 4(g2),g2 # post-increment src word pointer + subi 1,0,g3 # mask initially all ones + chkbit 2,g2 # are we on an even word boundary or an odd one? +#if __i960_BIG_ENDIAN__ + shro g7,g3,g3 # get mask for bytes needed from first word + notor g5,g3,g7 # set unneeded bytes to all ones + lda 0xff000000,g3 # byte extraction mask +#else + shlo g7,g3,g3 # get mask for bytes needed from first word + notor g5,g3,g7 # set unneeded bytes to all ones + lda 0xff,g3 # byte extraction mask +#endif + bno.f Lodd_word # branch if first word is odd + mov g7,g4 # move first word to copy thereof + ld (g2),g5 # load odd word + lda 4(g2),g2 # post-increment src word pointer + + +Leven_word: + scanbyte 0,g4 # check for null byte + movl g4,g6 # copy both words +Lodd_word: # trickery! if we branch here, following branch + /* instruction will fall thru, as we want, */ + /* effecting the load of g4 and g5 only. */ + ldl (g2),g4 # fetch next pair of word of src + bo.f Lsearch_for_null # branch if null found + scanbyte 0,g7 # check for null byte + lda 8(g2),g2 # post-increment src word pointer + bno.t Leven_word # branch if null not found yet + + subo 4,g2,g2 # back up the byte pointer + lda (g7),g6 # move odd word to search word +Lsearch_for_null: + subo 9,g2,g2 # back up the byte pointer +Lsearch_for_null.a: + and g6,g3,g14 # extract byte + cmpo 0,g14 # is it null? + lda 1(g2),g2 # bump src byte ptr +#if __i960_BIG_ENDIAN__ + shlo 8,g6,g6 # shift word to position next byte +#else + shro 8,g6,g6 # shift word to position next byte +#endif + bne.t Lsearch_for_null.a + +Lexit_code: + subo g0,g2,g0 # calculate string length + bx (g13) # g0 = addr of src; g14 = 0 +Lrett: + ret + +/* end of strlen */ diff --git a/lib/machine/i960/strncat.S b/lib/machine/i960/strncat.S new file mode 100644 index 0000000..a655824 --- /dev/null +++ b/lib/machine/i960/strncat.S @@ -0,0 +1,155 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strncat.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure strncat (optimized assembler version for the 80960K Series) + + dest_addr = strncat (dest_addr, src_addr, max_bytes) + + append the null terminated string pointed to by src_addr to the null + terminated string pointed to by dest_addr. Return the original + dest_addr. If the source string is longer than max_bytes, then + append only max_bytes bytes, and tack on a null byte on the end. + + This routine will fail if the source and destination string + overlap (in particular, if the end of the source is overlapped + by the beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last two words of the + program's allocated memory space. This is so because strncat fetches + ahead. Disallowing the fetch ahead would impose a severe performance + penalty. + + Strategy: + + First, skip to the null byte in the destination string. Then + fetch the source string by words and store them by words to the + destination string, until there are fewer than three bytes left + to copy. Then, using the last word of the source (the one that + contains the remaining 0, 1, 2, or 3 bytes to be copied), store + a byte at a time until Ldone. + + If, before exhausting the max_byte count, the null byte is encountered + in the source string, then just copy up thru the null byte. + + Tactics: + + 1) Do NOT try to fetch and store the words in a word aligned manner + because, in my judgement, the performance degradation experienced due + to non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. +*/ + + .globl _strncat + .globl __strncat + .leafproc _strncat,__strncat + .align 2 +_strncat: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strncat: + mov g14,g6 + cmpibge 0, g2, Lno_operation # Lexit early if max_bytes <= 0 + mov g0, g5 +Lskip_word_loop: + ld (g5), g7 # fetch word of dest string + addo 4, g5, g5 # post-increment dest ptr + scanbyte 0, g7 # does it contain null byte? + bno Lskip_word_loop # if not, loop + subo 5, g5, g5 # adjust dest ptr + lda 0xff, g3 # byte extraction mask = 0xff; +Lskip_byte_loop: + and g7, g3, g14 # extract byte of last word of dest string + cmpo 0, g14 # is it null? + addo 1, g5, g5 # adjust dest ptr + shro 8, g7, g7 # position next byte for extraction + bne Lskip_byte_loop # loop if null not found yet + + ld (g1), g7 # fetch first word of source string +Lwloop: # word copying loop + cmpo 4, g2 # max_bytes < 4 ? + addo 4, g1, g1 # post-increment source ptr + bge Lcloop.a # branch if less than 4 bytes to move + scanbyte 0, g7 # is null byte reached yet? + mov g7, g4 # keep a copy of the source word + be Lcloop # branch if null byte reached + ld (g1), g7 # pre-fetch next word of source + subo 4, g2, g2 # reduce max_byte counter + st g4, (g5) # store current word + addo 4, g5, g5 # post-increment destination ptr + b Lwloop + +Lcloop.b: + addo 1, g5, g5 # post-increment destination ptr + shro 8, g7, g7 # position next byte for extraction +Lcloop: # character copying loop (max_byte > 3) + and g3, g7, g4 # extract character + cmpo 0, g4 # is it null? + stob g4, (g5) # store it + bne Lcloop.b # loop if null not encountered yet + + bx (g6) # g0 = dest string address; g14 = 0 +Lrett: + ret + +Lcloop.c: + addo 1, g5, g5 # post-increment destination ptr + shro 8, g7, g7 # position next byte for extraction +Lcloop.a: # character copying loop (max_byte <= 3) + cmpdeco 0,g2,g2 # max_byte == 0? + and g3, g7, g4 # extract character + be Ldone # store null and Lexit if max_byte exhausted + cmpo 0, g4 # is it null? + stob g4, (g5) # store it + bne Lcloop.c # loop if null not encountered yet + +Ldone: stob g14, (g5) # store trailing null + bx (g6) # g0 = dest string address; g14 = 0 + +Lno_operation: mov 0, g14 # conform to register conventions + bx (g6) + +/* end of strncat */ diff --git a/lib/machine/i960/strncat_ca.S b/lib/machine/i960/strncat_ca.S new file mode 100644 index 0000000..45c5e17 --- /dev/null +++ b/lib/machine/i960/strncat_ca.S @@ -0,0 +1,300 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "sncat_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strncat (optimized assembler version for the CA) + + dest_addr = strncat (dest_addr, src_addr, max_bytes) + + append the null terminated string pointed to by src_addr to the null + terminated string pointed to by dest_addr. Return the original + dest_addr. If the source string is longer than max_bytes, then + append only max_bytes bytes, and tack on a null byte on the end + + This routine will fail if the source and destination string + overlap (in particular, if the end of the source is overlapped + by the beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last word of the program's + allocated memory space. This is so because, in several cases, strncat + will fetch ahead one word. Disallowing the fetch ahead would impose + a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source is word aligned, destination is not + 4) destination is word aligned, source is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 original dest ptr; not modified, so that it may be returned. + g1 src ptr; shift count + g2 max_bytes + g3 src ptr (word aligned) + g4 dest ptr (word aligned) + g5 0xff -- byte extraction mask + Little endian: + g6 lsw of double word for extraction of 4 bytes + g7 msw of double word for extraction of 4 bytes + Big endian: + g6 msw of double word for extraction of 4 bytes + g7 lsw of double word for extraction of 4 bytes + g13 return address + g14 byte extracted. +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g6 +#define LSW g7 +#else +#define LSW g6 +#define MSW g7 +#endif + + .globl _strncat + .globl __strncat + .leafproc _strncat, __strncat + .align 2 +_strncat: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strncat: + notand g0,3,g4 # extract word addr of start of dest + lda (g14),g13 # preserve return address + cmpibge.f 0,g2,Lexit_code # Lexit if number of bytes to move is <= zero. + and g0,3,LSW # extract byte offset of dest + ld (g4),MSW # fetch word containing at least first byte + shlo 3,LSW,g14 # get shift count for making mask for first word + subi 1,0,LSW # mask initially all ones +#if __i960_BIG_ENDIAN__ + shro g14,LSW,LSW # get mask for bytes needed from first word +#else + shlo g14,LSW,LSW # get mask for bytes needed from first word +#endif + notor MSW,LSW,MSW # set unneeded bytes to all ones + lda 0xff,g5 # byte extraction mask +Lsearch_for_word_with_null: + scanbyte 0,MSW # check for null byte + lda 4(g4),g4 # post-increment dest word pointer + mov MSW,LSW # keep a copy of current word + ld (g4),MSW # fetch next word of dest + bno.t Lsearch_for_word_with_null # branch if null not found yet +#if __i960_BIG_ENDIAN__ + shro 24,LSW,g14 # extract byte +#else + and g5,LSW,g14 # extract byte +#endif + cmpo 0,g14 # branch if null is first byte of word + subo 4,g4,g4 # move dest word ptr to word with null + notand g1,3,g3 # extract word addr of start of src + bne.t Lsearch_for_null + +Lcase_14: + cmpo g1,g3 # check alignment of source + ld (g3),LSW # fetch first word of source + shlo 3,g1,g14 # compute shift count + lda 4(g3),g3 # post-increment src addr + bne.f Lcase_4 # branch if source is unaligned +Lcase_1: +Lcase_1_wloop: # word copying loop + cmpi g2,4 # check for fewer than four bytes to move + lda (LSW),g1 # keep a copy of the src word + bl.f Lcase_1_cloop # branch if fewer than four bytes to copy + scanbyte 0,g1 # check for null byte in src word + ld (g3),LSW # pre-fetch next word of src + addo 4,g3,g3 # post-increment src addr + bo.f Lcase_1_cloop # branch if word contains null byte + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + st g1,(g4) # store word in dest string + addo 4,g4,g4 # post-increment dest addr + b Lcase_1_wloop + +Lcase_3_cloop: +Lcase_1_cloop: # character copying loop (max_bytes <= 3) + cmpdeci 0,g2,g2 # is max_bytes exhausted? +#if __i960_BIG_ENDIAN__ + rotate 8,g1,g1 # move next byte into position for extraction +#endif + and g5,g1,g14 # extract next char + be.f Lstore_null # if max_bytes is exhausted, store null and quit + cmpo 0,g14 # check for null byte + stob g14,(g4) # store the byte in dest +#if ! __i960_BIG_ENDIAN__ + shro 8,g1,g1 # move next byte into position for extraction +#endif + lda 1(g4),g4 # post-increment dest byte addr + bne.t Lcase_1_cloop # branch if null not reached + bx (g13) # Lexit (g14 == 0) + +Lstore_null: + mov 0,g14 # store null, and set g14 to zero + stob g14,(g4) + bx (g13) + + +Lsearch_for_null: +#if __i960_BIG_ENDIAN__ + shlo 8,LSW,LSW # check next byte + shro 24,LSW,g14 +#else + shlo 8,g5,g5 # move mask up to next byte + and g5,LSW,g14 # extract byte +#endif + lda 1(g4),g4 # move dest byte ptr to next byte + cmpobne.t 0,g14,Lsearch_for_null # branch if null is not yet found + +Lcase_235: + cmpo g1,g3 # check alignment of src + ld (g3),LSW # pre-fetch word with start of src + and 3,g1,g1 # compute shift count + lda 0xff,g5 # load mask for byte extraction + shlo 3,g1,g14 + lda 4(g3),g3 # post-increment src word counter + be.t Lcase_3 # branch if src is word aligned + and g4,3,MSW # extract byte offset for dest string + cmpo MSW,g1 # < indicates first word of dest has more bytes + /* than first word of source. */ + ld (g3),MSW # fetch second word of src +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # adjust shift count for big endian +#endif + eshro g14,g6,g5 # extract four bytes +#if __i960_BIG_ENDIAN__ + bge.f 1f +#else + bg.f 1f +#endif + mov MSW,LSW + lda 4(g3),g3 # move src word addr to second word boundary +1: + mov g5,MSW + lda 0xff,g5 + b Lcase_25 + +Lcase_3: # src is word aligned; dest is not + mov LSW,MSW # make copy of first word of src + lda 32,g14 # initialize shift count to zero (mod 32) +Lcase_25: + +Lcase_3_cloop_at_start: # character copying loop for start of dest str + cmpdeci 0,g2,g2 # is max_bytes exhausted? +#if __i960_BIG_ENDIAN__ + shro 24,MSW,g5 # extract next char +#else + and g5,MSW,g5 # extract next char +#endif + be.f Lstore_null # Lexit if max_bytes is exhausted + cmpo 0,g5 # check for null byte + stob g5,(g4) # store the byte in dest + addo 1,g4,g4 # post-increment dest ptr + lda 0xff,g5 # re-initialize byte extraction mask + notand g4,3,g1 # extract word address + be.t Lexit_code # Lexit if null byte reached + cmpo g1,g4 # have we reached word boundary in dest yet? +#if __i960_BIG_ENDIAN__ + lda -8(g14),g14 # augment the shift counter + rotate 8,MSW,MSW # move next byte into position for extraction +#else + lda 8(g14),g14 # augment the shift counter + shro 8,MSW,MSW # move next byte into position for extraction +#endif + bne.t Lcase_3_cloop_at_start # branch if reached word boundary? + +#if __i960_BIG_ENDIAN__ + cmpo 0,g14 + ld (g3),MSW # fetch msw of operand for double shift + bne Lcase_3_wloop # branch if src is still unaligned. + +Lcase_3_wloop2: + cmpi g2,4 # less than four bytes to move? + mov LSW,g1 # extract 4 bytes of src + lda 4(g3),g3 # post-increment src word addr + bl.f Lcase_3_cloop # branch if < four bytes left to move + scanbyte 0,g1 # check for null byte + mov MSW,LSW # move msw to lsw + ld (g3),MSW # pre-fetch msw of operand for double shift + bo.f Lcase_3_cloop # branch if word contains null byte + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + st g1,(g4) # store 4 bytes to dest + addo 4,g4,g4 # post-increment dest ptr + b Lcase_3_wloop2 +Lcase_4: + subo g14,0,g14 # adjust shift count for big endian +#else +Lcase_4: +#endif + + ld (g3),MSW # fetch msw of operand for double shift + +Lcase_3_wloop: + cmpi g2,4 # less than four bytes to move? + eshro g14,g6,g1 # extract 4 bytes of src + lda 4(g3),g3 # post-increment src word addr + bl.f Lcase_3_cloop # branch if < four bytes left to move + scanbyte 0,g1 # check for null byte + mov MSW,LSW # move msw to lsw + ld (g3),MSW # pre-fetch msw of operand for double shift + bo.f Lcase_3_cloop # branch if word contains null byte + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + st g1,(g4) # store 4 bytes to dest + addo 4,g4,g4 # post-increment dest ptr + b Lcase_3_wloop + + +Lexit_code: + mov 0,g14 # conform to register conventions + bx (g13) # g0 = addr of dest; g14 = 0 +Lrett: + ret + +/* end of strncat */ + diff --git a/lib/machine/i960/strncmp.S b/lib/machine/i960/strncmp.S new file mode 100644 index 0000000..030b750 --- /dev/null +++ b/lib/machine/i960/strncmp.S @@ -0,0 +1,129 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strncmp.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure strncmp (optimized assembler version for the 80960K Series) + + result = strncmp (src1_addr, src2_addr, max_bytes) + + compare the null terminated string pointed to by src1_addr to + the string pointed to by src2_addr. Return 0 iff the strings + are equal, -1 if src1_addr is lexicographically less than src2_addr, + and 1 if it is lexicographically greater. Do not compare more than + max_bytes bytes. + + Undefined behavior will occur if the end of either source string + (i.e. the terminating null byte) is in the last two words of the + program's allocated memory space. This is so because strncmp + will fetch ahead. Disallowing the fetch ahead would impose + a severe performance penalty. + + Strategy: + + Fetch and compare the strings by words and go to a character + comparison loop as soon as a pair of words differ. If the + words are equal up through either the exhaustion of max_bytes + or the presence of the null byte, return 0 (equality). Otherwise, + the character comparator will return -1 or 1 for inequality, or + 0 if the differing byte is after the null byte or after the + exhaustion of max_bytes. + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. +*/ + + .globl _strncmp + .globl __strncmp + .leafproc _strncmp,__strncmp + .align 2 + +_strncmp: +#ifndef __PIC + lda .Lrett,g14 +#else + lda .Lrett-(.+8)(ip),g14 +#endif +__strncmp: + mov g14,g13 + ldconst 0,g14 + cmpibge 0,g2,Lequal_exit # Lexit early if max_bytes <= 0 + addo g2,g0,g2 +.Lwloop: + cmpo g0,g2 # are max_bytes exhausted? + ld (g0), g5 # fetch word of source_1 + bge Lequal_exit # Lexit (equality) if max_bytes exhausted + ld (g1), g3 # fetch word of source_2 + addo 4,g0,g0 # post-increment source_1 ptr + scanbyte 0,g5 # is a null byte present? + addo 4,g1,g1 # post-increment source_1 ptr + be .Lcloop.a # perform char comparator if null byte found + cmpobe g5,g3,.Lwloop # perform char comparator if words are unequal + +.Lcloop.a: subo 4,g0,g0 # adjust max_byte counter + ldconst 0xff,g4 # byte extraction mask + +.Lcloop: and g4,g5,g7 # compare individual bytes + and g4,g3,g6 + cmpobne g7,g6,.diff # if different, return -1 or 1 + cmpo 0,g6 # they are equal. are they null? + shlo 8,g4,g4 # position mask to extract next byte + be Lequal_exit # if they are null, Lexit (equality) + addo 1,g0,g0 # is max_bytes exhausted? + cmpobl g0,g2,.Lcloop # if not, loop. if so, Lexit (equality) + +Lequal_exit: + mov 0,g0 + bx (g13) +.Lrett: + ret +.diff: bl .neg + mov 1,g0 + bx (g13) + +.neg: subi 1,0,g0 +.Lexit: + bx (g13) + +/* end of strncmp */ diff --git a/lib/machine/i960/strncmp_ca.S b/lib/machine/i960/strncmp_ca.S new file mode 100644 index 0000000..0b1a8ff --- /dev/null +++ b/lib/machine/i960/strncmp_ca.S @@ -0,0 +1,253 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "sncmp_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strncmp (optimized assembler version for the CA) + + result = strncmp (src1_addr, src2_addr, max_bytes) + + compare the null terminated string pointed to by src1_addr to + the string space pointed to by src2_addr. Return 0 iff the strings + are equal, -1 if src1_addr is lexicly less than src2_addr, and 1 + if it is lexicly greater. Do not compare more than max_bytes bytes. + + Undefined behavior will occur if the end of either source string + (i.e. the terminating null byte) is in the last word of the program's + allocated memory space. This is so because, in several cases, strncmp + will fetch ahead one word. Disallowing the fetch ahead would impose + a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source1 is word aligned, source2 is not + 4) source2 is word aligned, source1 is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g14 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers are sufficient to implement the routine. + The registers are used as follows: + + g0 original src1 ptr; extracted word; return result + g1 src2 ptr; 0xff -- byte extraction mask + g2 maximum number of bytes to compare + g3 src2 word ptr + Little endian: + g4 lsw of src1 + g5 msw of src1 + g6 src2 word + g7 src1 word ptr + Big endian: + g4 msw of src1 + g5 lsw of src1 + g6 src1 word ptr + g7 src2 word + g13 return address + g14 shift count +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g4 +#define LSW g5 +#define SRC1 g6 +#define SRC2 g7 +#else +#define LSW g4 +#define MSW g5 +#define SRC2 g6 +#define SRC1 g7 +#endif + + .globl _strncmp + .globl __strncmp + .leafproc _strncmp, __strncmp + .align 2 +_strncmp: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strncmp: +Lrestart: + notand g0,3,SRC1 # extract word addr of start of src1 + lda (g14),g13 # preserve return address + cmpibge.f 0,g2,Lequal_exit # return equality if number of bytes to + /* compare is none. */ +#if __i960_BIG_ENDIAN__ + cmpo g0,SRC1 # check alignment of src1 +#endif + ld (SRC1),LSW # fetch word with at least first byte of src1 + notand g1,3,g3 # extract word addr of start of src2 + ld 4(SRC1),MSW # fetch second word of src1 +#if __i960_BIG_ENDIAN__ + bne Lsrc1_unaligned # branch if src1 is unaligned + cmpo g3,g1 # check alignment of src2 + ld (g3),SRC2 # fetch word with at least first byte of src2 + shlo 3,g0,g14 # compute shift count for src1 + subo g14,0,g14 # adjust shift count for big endian + lda 8(SRC1),SRC1 # advance src1 word addr + bne.f Lsrc2_unaligned # branch if src2 is NOT word aligned + + /* src2 is word aligned */ + + mov LSW,g0 + +Lwloop2: # word comparing loop + cmpo SRC2,g0 # compare src1 and src2 words + lda 0xff000000,g1 # byte extraction mask + mov MSW,LSW # move msw of src1 to lsw + ld (SRC1),MSW # pre-fetch next msw of src1 + addo 4,SRC1,SRC1 # post-increment src1 addr + lda 4(g3),g3 # pre-increment src2 addr + bne.f Lcloop # branch if src1 and src2 unequal + scanbyte 0,g0 # check for null byte in src1 word + ld (g3),SRC2 # pre-fetch next word of src2 + mov LSW,g0 # extract word of src1 + subi 4,g2,g2 # decrement maximum byte count + bo.f Lequal_exit # branch if null byte encountered + cmpibl.t 0,g2,Lwloop2 # branch if max_bytes not reached yet + + b Lequal_exit # strings were equal up through max_bytes + +Lsrc1_unaligned: +#endif + cmpo g3,g1 # check alignment of src2 + ld (g3),SRC2 # fetch word with at least first byte of src2 + shlo 3,g0,g14 # compute shift count for src1 +#if __i960_BIG_ENDIAN__ + subo g14,0,g14 # adjust shift count for big endian +#endif + eshro g14,g4,LSW # extract word of src1 + lda 8(SRC1),SRC1 # advance src1 word addr + bne.f Lsrc2_unaligned # branch if src2 is NOT word aligned + + /* at least src2 is word aligned */ + + mov LSW,g0 + +Lwloop: # word comparing loop + cmpo SRC2,g0 # compare src1 and src2 words +#if __i960_BIG_ENDIAN__ + lda 0xff000000,g1 # byte extraction mask +#else + lda 0xff,g1 # byte extraction mask +#endif + mov MSW,LSW # move msw of src1 to lsw + ld (SRC1),MSW # pre-fetch next msw of src1 + addo 4,SRC1,SRC1 # post-increment src1 addr + lda 4(g3),g3 # pre-increment src2 addr + bne.f Lcloop # branch if src1 and src2 unequal + scanbyte 0,g0 # check for null byte in src1 word + ld (g3),SRC2 # pre-fetch next word of src2 + eshro g14,g4,g0 # extract word of src1 + subi 4,g2,g2 # decrement maximum byte count + bo.f Lequal_exit # branch if null byte encountered + cmpibl.t 0,g2,Lwloop # branch if max_bytes not reached yet + + b Lequal_exit # strings were equal up through max_bytes + +Lcloop_setup: # setup for coming from Lsrc2_unaligned + mov LSW,g0 # restore extracted src1 word +#if __i960_BIG_ENDIAN__ + lda 0xff000000,g1 # byte extraction mask +#else + lda 0xff,g1 # byte extraction mask +#endif + +Lcloop: # character comparing loop + and SRC2,g1,g3 # extract next char of src2 + and g0,g1,LSW # extract next char of src1 + cmpobne.f LSW,g3,.diff # check for equality + cmpo 0,LSW # check for null byte +#if __i960_BIG_ENDIAN__ + shro 8,g1,g1 # shift mask for next byte +#else + shlo 8,g1,g1 # shift mask for next byte +#endif + subi 1,g2,g2 # decrement character counter + bne.t Lcloop # branch if null not reached + + /* words are equal up thru null byte */ + +Lequal_exit: + mov 0,g14 # conform to register conventions + lda 0,g0 # return zero, indicating equality + bx (g13) # return + +Lrett: + ret + +.diff: + mov 0,g14 + bl Lless_than_exit +Lgreater_than_exit: + cmpibge.f 0,g2,Lequal_exit # branch if difference is beyond max_bytes + mov 1,g0 + bx (g13) # g0 = 1 (src1 > src2) +Lless_than_exit: + cmpibge.f 0,g2,Lequal_exit # branch if difference is beyond max_bytes + subi 1,0,g0 + bx (g13) # g0 = -1 (src1 < src2) + +Lsrc2_unaligned: + notor g1,3,g14 # first step in computing new src1 ptr + ld 4(g3),SRC1 # fetch second word of src2 + shlo 3,g1,MSW # compute shift count for src2 +#if __i960_BIG_ENDIAN__ + subo MSW,0,MSW # adjust shift count for big endian +#endif + eshro MSW,g6,SRC2 # extract word of src2 + cmpo LSW,SRC2 # compare src1 and src2 words + lda 4(g3),g1 # set new src2 ptr + bne.f Lcloop_setup # first four bytes differ + scanbyte 0,LSW # check for null byte + subo g14,g0,g0 # second (final) step in computing new src1 ptr + addi g14,g2,g2 # compute new max_bytes too + lda (g13),g14 # prepare return pointer for Lrestart + bno.t Lrestart # if null byte not encountered, continue + /* with both string fetches shifted such that*/ + /* src2 is now word aligned.*/ + mov 0,g14 # conform to register conventions. + lda 0,g0 # return indicator of equality. + bx (g13) diff --git a/lib/machine/i960/strncpy.S b/lib/machine/i960/strncpy.S new file mode 100644 index 0000000..9f51b60 --- /dev/null +++ b/lib/machine/i960/strncpy.S @@ -0,0 +1,154 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strncpy.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ +/* + procedure strncpy (optimized assembler version for the 80960K Series) + + dest_addr = strncpy (dest_addr, src_addr, max_bytes) + + copy the null terminated string pointed to by src_addr to the + string pointed to by dest_addr. Return the original dest_addr. + If the source string is shorter than max_bytes, then null-pad + the destination string. If it is longer than max_bytes, the + copy stops at max_bytes bytes (and no terminating null appears + in the destination string). + + This routine will fail if the source and destination string + overlap (in particular, if the end of the source is overlapped + by the beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last two words of the + program's allocated memory space. This is so because strncpy fetches + ahead. Disallowing the fetch ahead would impose a severe performance + penalty. + + Strategy: + + Fetch and store the strings by words and go to a character move loop + as soon as a null byte is encountered. If max_bytes is exhausted + first, then terminate after moving only max_bytes (with the last + 0, 1, 2, or 3 bytes moved as single bytes, not as a word). + Otherwise, the character move loop moves the last bytes or the + source string, and then null-pads the destination string until + max_bytes is exhausted. + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble and convoluted body that would be necessary to assure + alignment. + + 2) When the null byte is encountered in a source word, null out the + higher-numbered bytes in that word, store the word in the destination, + and go to the word null-padder, which may eventually go to the byte + null-padder. +*/ + + .globl _strncpy + .globl __strncpy + .leafproc _strncpy,__strncpy + .align 2 +_strncpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strncpy: + mov g14, g13 + cmpibge 0,g2,Lexit # quit early if max_bytes <= 0 + ld (g1), g7 # fetch the first word of the source + mov g0, g5 + lda 0xff, g3 # byte extraction mask + addo g1, g2, g6 + addo g2, g5, g2 +Lwloop: # word copying loop + addo 4, g1, g1 # post-increment source ptr + cmpo g6, g1 # max_bytes < 4 ? + mov g7, g4 # keep a copy of source word + bl Lcloop.a # if less than four bytes to go, go to char loop + scanbyte 0, g4 # null byte found? + ld (g1), g7 # pre-fetch next word of the source + be Lcloop.c # go to char loop if null encountered + st g4, (g5) # store current word + addo 4, g5, g5 # post-increment destination ptr + b Lwloop + +Lcloop.a: # character copying loop (max_bytes < 3) + and g3, g4, g14 # extract byte +Lcloop.b: + cmpo g2, g5 # max_bytes <= 0 ? + shro 8, g4, g4 # position word to extract next byte + be Lexit # exit if max_bytes exhausted + cmpo 0, g14 # is it null? + stob g14, (g5) # store it + addo 1, g5, g5 # post-increment dest ptr + bne Lcloop.a # branch if we are NOT null padding + b Lcloop.b # branch if we are null padding + +Lexit: + mov 0, g14 + bx (g13) # g0 = dest string address; g14 = 0 +Lrett: + ret + +Lcloop.c: # character copying loop + and g3, g4, g14 # extract byte + cmpo 0, g14 # is it null? + mov g3, g7 # save mask + shlo 8, g3, g3 # shift mask to next byte position + bne Lcloop.c # loop until null found + subo 1, g7, g3 # mask to null pad after null byte + and g3, g4, g4 # null-out stuff after null byte + st g4, (g5) # store last part of src and first of null-pad + subo 8,g2,g6 # adjust max_byte counter + +Lzwloop: + cmpo g5, g6 # max_bytes < 4 ? + addo 4, g5, g5 + bg Lcloop.b # if so, goto character loop + st g14, (g5) # store four null bytes + b Lzwloop + +/* end of strncpy */ diff --git a/lib/machine/i960/strncpy_ca.S b/lib/machine/i960/strncpy_ca.S new file mode 100644 index 0000000..1f90acf --- /dev/null +++ b/lib/machine/i960/strncpy_ca.S @@ -0,0 +1,289 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "sncpy_ca.s" +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strncpy (optimized assembler version for the CA) + + dest_addr = strncpy (dest_addr, src_addr, max_bytes) + + copy the null terminated string pointed to by src_addr to + the string space pointed to by dest_addr. Return the original + dest_addr. If the source string is shorter than max_bytes, + then null-pad the destination string. + + This routine will fail if the source and destination string + overlap (in particular, if the end of the source is overlapped + by the beginning of the destination). The behavior is undefined. + This is acceptable according to the draft C standard. + + Undefined behavior will also occur if the end of the source string + (i.e. the terminating null byte) is in the last word of the program's + allocated memory space. This is so because, in several cases, strcpy + will fetch ahead one word. Disallowing the fetch ahead would impose + a severe performance penalty. + + This program handles five cases: + + 1) both arguments start on a word boundary + 2) neither are word aligned, but they are offset by the same amount + 3) source is word aligned, destination is not + 4) destination is word aligned, source is not + 5) neither is word aligned, and they are offset by differing amounts + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. The registers are used as follows: + + g0 original dest ptr; not modified, so that it may be returned. + g1 src ptr; shift count + g2 max_bytes + g3 src ptr (word aligned) + g4 dest ptr (word aligned) + g5 0xff -- byte extraction mask + Little endian: + g6 lsw of double word for extraction of 4 bytes + g7 msw of double word for extraction of 4 bytes + Big endian: + g6 msw of double word for extraction of 4 bytes + g7 lsw of double word for extraction of 4 bytes + g13 return address + g14 byte extracted. +*/ + +#if __i960_BIG_ENDIAN__ +#define MSW g6 +#define LSW g7 +#else +#define LSW g6 +#define MSW g7 +#endif + + .globl _strncpy + .globl __strncpy + .leafproc _strncpy, __strncpy + .align 2 +_strncpy: +#ifndef __PIC + lda Lrett,g14 +#else + lda Lrett-(.+8)(ip),g14 +#endif +__strncpy: + notand g1,3,g3 # extract word addr of start of src + lda (g14),g13 # preserve return address + cmpibge.f 0,g2,Lexit_code # Lexit if number of bytes to move is <= zero. + cmpo g3,g1 # check alignment of src + ld (g3),LSW # fetch word containing at least first byte + notand g0,3,g4 # extract word addr of start of dest + lda 4(g3),g3 # advance src word addr + bne.f Lcase_245 # branch if src is NOT word aligned + +Lcase_13: + cmpo g0,g4 # check alignment of dest + lda 0xff,g5 # load mask for byte extraction + subo 4,g4,g4 # store is pre-incrementing; back up dest addr + bne.f Lcase_3 # branch if dest not word aligned + +Lcase_1: # src and dest are word aligned +Lcase_1_wloop: # word copying loop + cmpi g2,4 # check for fewer than four bytes to move + lda (LSW),g1 # keep a copy of the src word + addo 4,g4,g4 # pre-increment dest addr + bl.f Lcase_1_cloop.a # branch if fewer than four bytes to copy + scanbyte 0,g1 # check for null byte in src word + ld (g3),LSW # pre-fetch next word of src + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + bo.f Lcase_1_cloop.c # branch if word contains null byte + addo 4,g3,g3 # post-increment src addr + st g1,(g4) # store word in dest string + b Lcase_1_wloop + +Lcase_3_cloop.a: +Lcase_1_cloop.a: # character copying loop (max_bytes <= 3) +#if __i960_BIG_ENDIAN__ + rotate 8,g1,g1 # move next byte into position for extraction +#endif + and g5,g1,g14 # extract next char +Lcase_1_cloop.b: + cmpdeci 0,g2,g2 # is max_bytes exhausted? + be.f Lexit_code # Lexit if max_bytes is exhausted + cmpo 0,g14 # check for null byte + stob g14,(g4) # store the byte in dest +#if ! __i960_BIG_ENDIAN__ + shro 8,g1,g1 # move next byte into position for extraction +#endif + lda 1(g4),g4 # post-increment dest byte addr + bne.t Lcase_1_cloop.a # branch if null not reached + b Lcase_1_cloop.b + +Lexit_code: + mov 0,g14 # conform to register conventions + bx (g13) # g0 = addr of dest; g14 = 0 +Lrett: + ret + +Lcase_1_cloop.c: +Lcase_3_cloop.c: +#if __i960_BIG_ENDIAN__ + rotate 24,g5,g5 # move mask into position for testing next byte +#endif + and g5,g1,g14 # extract next char + cmpo 0,g14 # check for null byte +#if ! __i960_BIG_ENDIAN__ + lda (g5),LSW # keep a copy of the current mask + shlo 8,g5,g5 # move mask into position for testing next byte +#endif + bne.t Lcase_1_cloop.c # branch if null not reached +#if __i960_BIG_ENDIAN__ + subo 1,g5,g5 # null pad. + andnot g5,g1,g1 # last bytes to copy, and null pad rest of word +#else + subo 1,LSW,g5 # mask to get last bytes to copy, and null pad + and g5,g1,g1 # last bytes to copy, and null pad rest of word +#endif + st g1,(g4) + +Lcase_1_zwloop: # zero word loop + cmpi g2,4 # check for fewer than four bytes to move + addo 4,g4,g4 # pre-increment dest addr + bl.f Lcase_1_cloop.b # branch if fewer than four bytes to copy + subo 4,g2,g2 # decrease max_byte count by the 4 bytes moved + st g14,(g4) # store word in dest string + b Lcase_1_zwloop + +Lcase_3: # src is word aligned; dest is not + addo 8,g4,g4 # move dest word ptr to first word boundary + lda (g0),g1 # copy dest byte ptr + mov LSW,MSW # make copy of first word of src + lda 32,g14 # initialize shift count to zero (mod 32) + +Lcase_25: +Lcase_3_cloop_at_start: # character copying loop for start of dest str + cmpdeci 0,g2,g2 # is max_bytes exhausted? +#if __i960_BIG_ENDIAN__ + shro 24,MSW,g5 # extract next char +#else + and g5,MSW,g5 # extract next char +#endif + be.f Lexit_code # Lexit if max_bytes is exhausted + cmpo 0,g5 # check for null byte + stob g5,(g1) # store the byte in dest + addo 1,g1,g1 # post-increment dest ptr + lda 0xff,g5 # re-initialize byte extraction mask + bne.t 1f # drop thru if null byte reached (to pad) + movl 0,g6 # blank out remainder of input buffer +1: + cmpo g1,g4 # have we reached word boundary in dest yet? +#if __i960_BIG_ENDIAN__ + lda -8(g14),g14 # augment the shift counter + rotate 8,MSW,MSW # move next byte into position for extraction +#else + lda 8(g14),g14 # augment the shift counter + shro 8,MSW,MSW # move next byte into position for extraction +#endif + bne.t Lcase_3_cloop_at_start # branch if reached word boundary? + + ld (g3),MSW # fetch msw of operand for double shift + +Lcase_4: + +#if __i960_BIG_ENDIAN__ + cmpobne 0,g14,Lcase_3_wloop # branch if src is still unaligned. + +Lcase_3_wloop2: + cmpi g2,4 # less than four bytes to move? + lda (LSW),g1 # extract 4 bytes of src + lda 4(g3),g3 # post-increment src word addr + bl.f Lcase_3_cloop.a # branch if < four bytes left to move + scanbyte 0,g1 # check for null byte + lda (MSW),LSW # move msw to lsw + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + ld (g3),MSW # pre-fetch msw of operand for double shift + bo.f Lcase_3_cloop.c # branch if word contains null byte + st g1,(g4) # store 4 bytes to dest + addo 4,g4,g4 # post-increment dest ptr + b Lcase_3_wloop2 + +#endif + +Lcase_3_wloop: + cmpi g2,4 # less than four bytes to move? + eshro g14,g6,g1 # extract 4 bytes of src + lda 4(g3),g3 # post-increment src word addr + bl.f Lcase_3_cloop.a # branch if < four bytes left to move + scanbyte 0,g1 # check for null byte + lda (MSW),LSW # move msw to lsw + subi 4,g2,g2 # decrease max_byte count by the 4 bytes moved + ld (g3),MSW # pre-fetch msw of operand for double shift + bo.f Lcase_3_cloop.c # branch if word contains null byte + st g1,(g4) # store 4 bytes to dest + addo 4,g4,g4 # post-increment dest ptr + b Lcase_3_wloop + +Lcase_245: + cmpo g0,g4 # check alignment of dest + ld (g3),MSW # pre-fetch second half + and 3,g1,g1 # compute shift count + lda 0xff,g5 # load mask for byte extraction +#if __i960_BIG_ENDIAN__ + subo g1,4,g14 # adjust shift count for big endian. + shlo 3,g14,g14 +#else + shlo 3,g1,g14 +#endif + be.t Lcase_4 # branch if dest is word aligned + or g4,g1,g1 # is src earlier in word, later, or sync w/ dst + cmpo g0,g1 # < indicates first word of dest has more bytes + /* than first word of source. */ + lda 4(g4),g4 # move dest word addr to first word boundary + eshro g14,g6,g5 # extract four bytes + lda (g0),g1 + bg.f 1f + mov MSW,LSW + lda 4(g3),g3 # move src word addr to second word boundary +1: + mov g5,MSW + lda 0xff,g5 + b Lcase_25 + +/* end of strncpy */ + diff --git a/lib/machine/i960/strpbrk.S b/lib/machine/i960/strpbrk.S new file mode 100644 index 0000000..bae909f --- /dev/null +++ b/lib/machine/i960/strpbrk.S @@ -0,0 +1,100 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + +/* + * (c) copyright 1989,1993 Intel Corp., all rights reserved + */ + +/* + procedure strpbrk (optimized assembler version: 80960K series, 80960CA) + + char_addr = strpbrk (string, brkset_string) + + Return the address of the first character in string that is NOT + in the brkset_string. Return NULL if none exists. + + At the time of this writing, only g0 thru g7 and g13 are available + for use in this leafproc; other registers would have to be saved and + restored. These nine registers, plus tricky use of g14 are sufficient + to implement the routine. + + This routine stays out of g3 and g4 altogether. They may be used by + the strtok routine, which calls this routine in an incestuous way. +*/ +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif + + .file "strprk.s" + .globl _strpbrk + .globl __strpbrk + .leafproc _strpbrk, __strpbrk + .align 2 + +_strpbrk: +#ifdef __PIC + lda Lrett-(.+8)(ip),g14 + b __strpbrk +#else + lda Lrett,g14 + b __strpbrk +#endif + +Lrett: ret + +__strpbrk: + +Lnext_char_strpbrk: + addo 1,g1,g2 # g2 will be the brkset ptr + ldob (g0),g7 # fetch next character of string + ldob (g1),g6 # fetch first character of brkset + cmpobe.f 0,g7,Lexit_char_not_found # quit if at end of string +Lscan_set_strpbrk: + cmpo g6,g7 # is brkset char equal to string char? + ldob (g2),g5 # fetch next brkset char + addo 1,g2,g2 # bump brkset ptr + be.f Lexit_char_found + cmpo g6,0 # is brkset_string exhausted? + lda (g5),g6 + bne.t Lscan_set_strpbrk # check next character of brkset + addo 1,g0,g0 # check next character of string + b Lnext_char_strpbrk + +Lexit_char_not_found: + mov 0,g0 # return null if brkset char not found in string +Lexit_char_found: + mov g14,g13 # save return address + lda 0,g14 # conform to register conventions + bx (g13) + +/* end of strpbrk */ diff --git a/lib/machine/i960/strrchr.S b/lib/machine/i960/strrchr.S new file mode 100644 index 0000000..96fe5c2 --- /dev/null +++ b/lib/machine/i960/strrchr.S @@ -0,0 +1,137 @@ +/******************************************************************************* + * + * Copyright (c) 1993 Intel Corporation + * + * Intel hereby grants you permission to copy, modify, and distribute this + * software and its documentation. Intel grants this permission provided + * that the above copyright notice appears in all copies and that both the + * copyright notice and this permission notice appear in supporting + * documentation. In addition, Intel grants this permission provided that + * you prominently mark as "not part of the original" any modifications + * made to this software or documentation, and that the name of Intel + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software or the documentation without specific, + * written prior permission. + * + * Intel Corporation provides this AS IS, WITHOUT ANY WARRANTY, EXPRESS OR + * IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY + * OR FITNESS FOR A PARTICULAR PURPOSE. Intel makes no guarantee or + * representations regarding the use of, or the results of the use of, + * the software and documentation in terms of correctness, accuracy, + * reliability, currentness, or otherwise; and you rely on the software, + * documentation and results solely at your own risk. + * + * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY LOSS OF USE, LOSS OF BUSINESS, + * LOSS OF PROFITS, INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES + * OF ANY KIND. IN NO EVENT SHALL INTEL'S TOTAL LIABILITY EXCEED THE SUM + * PAID TO INTEL FOR THE PRODUCT LICENSED HEREUNDER. + * + ******************************************************************************/ + + .file "strrchr.s" +#ifdef __i960_BIG_ENDIAN__ +#error "This does not work in big-endian" +#endif + +#ifdef __PIC + .pic +#endif +#ifdef __PID + .pid +#endif + +/* + * (c) copyright 1988,1993 Intel Corp., all rights reserved + */ + +/* + procedure strrchr (optimized assembler version for the 80960K series) + + src_addr = strrchr (src_addr, char) + + return a pointer to the last byte that contains the indicated + byte in the source string. Return null if the byte is not found. + + Undefined behavior will occur if the end of the source string (i.e. + the terminating null byte) is in the last two words of the program's + allocated memory space. This is so because strrchr fetches ahead. + Disallowing the fetch ahead would impose a severe performance penalty. + + Strategy: + + Fetch the source string by words and scanbyte the words for the + char until either a word with the byte is found or the null byte is + encountered. In the former case, move through the word to find the + matching byte and save its memory address, then continue the search. + In the latter case, return the saved address, or zero (null) if none + was ever found to save. + + Tactics: + + 1) Do NOT try to fetch the words in a word aligned manner because, + in my judgement, the performance degradation experienced due to + non-aligned accesses does NOT outweigh the time and complexity added + by the preamble that would be necessary to assure alignment. This + is supported by the intuition that most source arrays (even more + true of most big source arrays) will be word aligned to begin with. +*/ + + .globl _strrchr + .globl __strrchr + .leafproc _strrchr, __strrchr + .align 2 +_strrchr: +#ifdef __PIC + lda Lrett-(.+8)(ip),g14 +#else + lda Lrett,g14 +#endif +__strrchr: + + ld (g0),g4 # fetch first word + lda 0xff,g7 # byte extraction mask + and g1,g7,g1 # make char an 8-bit ordinal + shlo 8,g1,g2 # broadcast the char to four bytes + or g1,g2,g2 + shlo 16,g2,g5 + or g2,g5,g3 + mov g14,g13 # preserve return address + addo 4,g0,g2 # post-increment src pointer + mov 1,g0 # prepare to return null pointer + mov g3,g6 # prepare to return null pointer + +Lsearch_for_word_with_char_or_null: + mov g4,g5 # copy word + scanbyte 0,g5 # check for null byte + ld (g2),g4 # fetch next word of src + bo Lword_has_null # branch if null found + scanbyte g3,g5 # check for byte with char + addo 4,g2,g2 # post-increment src pointer + bno Lsearch_for_word_with_char_or_null # branch if no copy of char + mov g5,g6 # save word that has char in it (at least once) + subo 4,g2,g0 # save addr of byte after word with char + b Lsearch_for_word_with_char_or_null + +Lword_has_null: + subo 4,g2,g2 # move src pointer back to word with null +Lfind_null: + addo 1,g2,g2 # advance src pointer to byte after current + and g7,g5,g14 # extract next byte + cmpo g1,g14 # is current byte char? + shro 8,g5,g5 # position next byte for extraction + bne 1f # skip if not char sought after + mov g2,g0 # save addr of byte after char + mov g3,g6 # save word of all char to short circuit search +1: cmpobne 0,g14,Lfind_null # is current byte null? + +Lfind_last_char: + rotate 8,g6,g6 # position next highest byte + and g7,g6,g5 # extract byte + subo 1,g0,g0 # move pointer to that byte (or nullify) + cmpobne g5,g1,Lfind_last_char # branch if not at char + + bx (g13) # g0 = addr of char in src (or null); g14 = 0 +Lrett: + ret + +/* end of strrchr */ diff --git a/lib/machine/iq2000/Makefile.inc b/lib/machine/iq2000/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/iq2000/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/iq2000/setjmp.S b/lib/machine/iq2000/setjmp.S new file mode 100644 index 0000000..cb09463 --- /dev/null +++ b/lib/machine/iq2000/setjmp.S @@ -0,0 +1,51 @@ +/* This is a simple version of setjmp and longjmp for iq2000. */ + + +/* int setjmp (jmp_buf); */ + .globl setjmp + .ent setjmp +setjmp: + sw r16,0(r4) /* rs0 */ + sw r17,4(r4) /* rs1 */ + sw r18,8(r4) /* rs2 */ + sw r19,12(r4) /* rs3 */ + sw r20,16(r4) /* rs4 */ + sw r21,20(r4) /* rs5 */ + sw r22,24(r4) /* rs6 */ + sw r23,28(r4) /* rs7 */ + sw r30,32(r4) /* rs8 */ + + sw r29,36(r4) + sw r31,40(r4) + + move r2,r0 + + j r31 + + .end setjmp + +/* volatile void longjmp (jmp_buf, int); */ + .globl longjmp + .ent longjmp +longjmp: + lw r16,0(r4) /* rs0 */ + lw r17,4(r4) /* rs1 */ + lw r18,8(r4) /* rs2 */ + lw r19,12(r4) /* rs3 */ + lw r20,16(r4) /* rs4 */ + lw r21,20(r4) /* rs5 */ + lw r22,24(r4) /* rs6 */ + lw r23,28(r4) /* rs7 */ + lw r30,32(r4) /* rs8 */ + + lw r29,36(r4) + lw r31,40(r4) + + bne r5,r0,1f + li r5,1 +1: + move r2,r5 + + j r31 + + .end longjmp diff --git a/lib/machine/lm32/Makefile.inc b/lib/machine/lm32/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/lm32/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/lm32/setjmp.S b/lib/machine/lm32/setjmp.S new file mode 100644 index 0000000..666df5e --- /dev/null +++ b/lib/machine/lm32/setjmp.S @@ -0,0 +1,94 @@ +/* + * setjmp/longjmp for LatticeMico32. + * Contributed by Jon Beniston + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + .section .text + .align 4 + + .globl setjmp + .type setjmp,@function + .globl longjmp + .type longjmp,@function + +/* setjmp: save all callee saves into jmp_buf + r1 - Address of jmp_buf +*/ + +setjmp: + sw (r1+0), r11 + sw (r1+4), r12 + sw (r1+8), r13 + sw (r1+12), r14 + sw (r1+16), r15 + sw (r1+20), r16 + sw (r1+24), r17 + sw (r1+28), r18 + sw (r1+32), r19 + sw (r1+36), r20 + sw (r1+40), r21 + sw (r1+44), r22 + sw (r1+48), r23 + sw (r1+52), r24 + sw (r1+56), r25 + sw (r1+60), gp + sw (r1+64), fp + sw (r1+68), sp + sw (r1+72), ra + mvi r1, 0 + ret + +/* longjmp: restore all callee saves from jmp_buf + r1 - Address of jmb_buf + r2 - Value to return with +*/ + + .global longjmp + .type longjmp,@function + .align 4 + +longjmp: + lw r11, (r1+0) + lw r12, (r1+4) + lw r13, (r1+8) + lw r14, (r1+12) + lw r15, (r1+16) + lw r16, (r1+20) + lw r17, (r1+24) + lw r18, (r1+28) + lw r19, (r1+32) + lw r20, (r1+36) + lw r21, (r1+40) + lw r22, (r1+44) + lw r23, (r1+48) + lw r24, (r1+52) + lw r25, (r1+56) + lw gp, (r1+60) + lw fp, (r1+64) + lw sp, (r1+68) + lw ra, (r1+72) + mv r1, r2 + ret + + diff --git a/lib/machine/m32c/Makefile.inc b/lib/machine/m32c/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/m32c/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/m32c/setjmp.S b/lib/machine/m32c/setjmp.S new file mode 100644 index 0000000..96cd0f2 --- /dev/null +++ b/lib/machine/m32c/setjmp.S @@ -0,0 +1,133 @@ +/* + +Copyright (c) 2005 Red Hat Incorporated. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#if defined(__r8c_cpu__) || defined(__m16c_cpu__) +#define A16 1 +#endif + +/* We implement setjmp/longjmp much like the way gcc implements + exceptions - we create new stack frames, then switch to them and + return. Thus, the two setjmp's below each push all the relevent + registers, then copy the whole frame into the buffer (first $sp is + moved, then smovf copies the frame itself), and the two longjmps + restore $sp, copy the frame back into place, and issue the same + return as the setjmp would have used. + + Since the sizes of registers differs between the 16 and 24 bit + models, we provide separate implementations for each rather than + trying to parameterize them. + + Jump buffer sizes: 21 bytes for 16 bit, 34 bytes for 24 bit. +*/ + + .text + +#ifdef A16 /* 16 bit versions */ + + .global _setjmp +_setjmp: + enter #0 + pushm r1,r2,r3,a0,a1,sb,fb + +; At this point, the stack looks like this: +; ... [pc:3] [oldfb:2] [r1:2] [r2:2] [r3:2] [a0:2] [a1:2] [sb:2] [fb:2] */ + + mov.w r1,a1 ; a1 is the destination of smovf + mov.b #0,r1h + stc sp,a0 ; r1h:a0 is the source of smovf + mov.w a0,[a1] + add.w #2,a1 + mov.w #19,r3 ; plus two for sp later + smovf.b + + ; Return 0 to caller. + mov.w #0,r0 + popm r1,r2,r3,a0,a1,sb,fb + exitd + + .global _longjmp +_longjmp: + enter #0 + mov.w r1,a0 ; pointer to jump buf + mov.w r2,r0 ; setjmp's "new" return value + + mov.b #0,r1h ; r1h: a0 is the source, now jmpbuf + mov.w [a0],a1 ; dest is new stack + ldc a1,sp + add.w #2,a0 + mov.w #19,r3 + smovf.b + + ;; now return to our caller with this newly restored frame + popm r1,r2,r3,a0,a1,sb,fb + exitd + +#else /* 24 bit versions */ + + .global _setjmp +_setjmp: + enter #0 + pushm r1,r2,r3,a0,a1,sb,fb + +; At this point, the stack looks like this: +; ... [jbuf:4] [pc:4] [oldfb:4] [r1:2] [r2:2] [r3:2] [a0:4] [a1:4] [sb:4] [fb:4] */ + + mov.l 8[fb],a1 ; a1 is the destination of smovf + stc sp,a0 ; r1h:a0 is the source of smovf + mov.l a0,[a1] + add.l #4,a1 + mov.w #30,r3 ; plus two for sp later + smovf.b + + ; Return 0 to caller. + mov.w #0,r0 + popm r1,r2,r3,a0,a1,sb,fb + exitd + + .global _longjmp +_longjmp: + enter #0 +; ... [rv:2] [jbuf:4] [pc:4] [oldfb:4] + mov.l 8[fb],a0 ; pointer to jump buf + mov.w 12[fb],r0 ; setjmp's "new" return value + + mov.l [a0],a1 ; dest is new stack + ldc a1,sp + add.l #4,a0 + mov.w #30,r3 + smovf.b + + ;; now return to our caller with this newly restored frame + popm r1,r2,r3,a0,a1,sb,fb + exitd +#endif + diff --git a/lib/machine/m32r/Makefile.inc b/lib/machine/m32r/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/m32r/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/m32r/setjmp.S b/lib/machine/m32r/setjmp.S new file mode 100644 index 0000000..e6938ef --- /dev/null +++ b/lib/machine/m32r/setjmp.S @@ -0,0 +1,52 @@ +# setjmp/longjmp for m32r. The jmpbuf looks like this: +# +# Register jmpbuf offset +# reserved 0x00 +# R8 0x04 +# R9 0x08 +# R10 0x0c +# R11 0x10 +# R12 0x14 +# R13 (FP) 0x18 +# R14 (LR) 0x1c +# R15 (SP) 0x20 +# reserved 0x24 + + .text + .global setjmp +setjmp: + ;addi r0, #-4 ; commented out as first word is reserved + ;st r1, @+r0 + st r8, @+r0 + st r9, @+r0 + st r10, @+r0 + st r11, @+r0 + st r12, @+r0 + st r13, @+r0 + st r14, @+r0 + st r15, @+r0 + +# Return 0 to caller. + ldi r0, #0 + jmp lr + + .global longjmp +longjmp: + addi r0, #4 ; first word is reserved + ;ld r1, @r0+ + ld r8, @r0+ + ld r9, @r0+ + ld r10, @r0+ + ld r11, @r0+ + ld r12, @r0+ + ld r13, @r0+ + ld r2, @r0+ ; return address + ld r15, @r0+ + +# If caller attempted to return 0, return 1 instead. + + mv r0, r1 + bnez r0, .Lnonzero + ldi r0, #1 +.Lnonzero: + jmp r2 diff --git a/lib/machine/m68hc11/Makefile.inc b/lib/machine/m68hc11/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/m68hc11/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/m68hc11/setjmp.S b/lib/machine/m68hc11/setjmp.S new file mode 100644 index 0000000..38d1188 --- /dev/null +++ b/lib/machine/m68hc11/setjmp.S @@ -0,0 +1,141 @@ +/* setjmp/longjmp routines for M68HC11 & M68HC12. + * Copyright (C) 1999, 2000, 2001, 2002 Stephane Carrez (stcarrez@nerim.fr) + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#if __INT__ == 32 +# define val 4 +# define INT32(X) X +#else +# define val 2 +# define INT32(X) +#endif + +#ifdef mc6811 +# define REG(X) *X +#else +# define REG(X) X +#endif + + .sect .text + .global setjmp + .global longjmp + +#ifdef mc6811 +setjmp: + xgdx + tsy + ldd 0,y + std 0,x + sty 2,x + ldd REG(_.frame) + std 4,x + ldd REG(_.d1) + std 6,x + ldd REG(_.d2) + std 8,x + ldd REG(_.d3) + std 10,x + ldd REG(_.d4) + std 12,x + ldd REG(_.d5) + std 14,x + ldd REG(_.d6) + std 16,x + ldd REG(_.d7) + std 18,x + ldd REG(_.d8) + std 20,x +INT32( ldx #0) + clra + clrb + rts +#else +setjmp: + xgdx + movw 0,sp,2,x+ + sts 2,x+ + movw _.frame,2,x+ + movw _.d1,2,x+ + movw _.d2,2,x+ + movw _.d3,2,x+ + movw _.d4,2,x+ + movw _.d5,2,x+ + movw _.d6,2,x+ + movw _.d7,2,x+ + movw _.d8,2,x+ +INT32( ldx #0) + clra + clrb + rts +#endif + +#ifdef mc6811 +longjmp: + xgdx + tsy + ldd val,y + bne do_jump + ldd #1 +do_jump: + xgdy + ldd 4,x + std REG(_.frame) + ldd 6,x + std REG(_.d1) + ldd 8,x + std REG(_.d2) + ldd 10,x + std REG(_.d3) + ldd 12,x + std REG(_.d4) + ldd 14,x + std REG(_.d5) + ldd 16,x + std REG(_.d6) + ldd 18,x + std REG(_.d7) + ldd 20,x + std REG(_.d8) + ldd 0,x + ldx 2,x + txs + std 0,x +INT32( ldx #0) + xgdy + rts +#else + +longjmp: + xgdx + ldy val,sp + bne do_jump + ldy #1 +do_jump: + ldd 4,x+ + movw 2,x+,_.frame + movw 0,x,_.d1 + movw 2,x,_.d2 + movw 4,x,_.d3 + movw 6,x,_.d4 + movw 8,x,_.d5 + movw 10,x,_.d6 + movw 12,x,_.d7 + movw 14,x,_.d8 + ldx -4,x + txs + std 0,x +INT32( ldx #0) + xgdy + rts +#endif + diff --git a/lib/machine/m68k/Makefile.inc b/lib/machine/m68k/Makefile.inc new file mode 100644 index 0000000..262e4b4 --- /dev/null +++ b/lib/machine/m68k/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/strcpy.c %D%/strlen.c %D%/memcpy.S %D%/memset.S diff --git a/lib/machine/m68k/m68kasm.h b/lib/machine/m68k/m68kasm.h new file mode 100644 index 0000000..a5c610a --- /dev/null +++ b/lib/machine/m68k/m68kasm.h @@ -0,0 +1,40 @@ +/* These are predefined by new versions of GNU cpp. */ + +#ifndef __USER_LABEL_PREFIX__ +#define __USER_LABEL_PREFIX__ _ +#endif + +#ifndef __REGISTER_PREFIX__ +#define __REGISTER_PREFIX__ +#endif + +/* ANSI concatenation macros. */ + +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ + +#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) + +/* Use the right prefix for registers. */ + +#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x) + +#define d0 REG (d0) +#define d1 REG (d1) +#define d2 REG (d2) +#define d3 REG (d3) +#define d4 REG (d4) +#define d5 REG (d5) +#define d6 REG (d6) +#define d7 REG (d7) +#define a0 REG (a0) +#define a1 REG (a1) +#define a2 REG (a2) +#define a3 REG (a3) +#define a4 REG (a4) +#define a5 REG (a5) +#define a6 REG (a6) +#define fp REG (fp) +#define sp REG (sp) diff --git a/lib/machine/m68k/memcpy.S b/lib/machine/m68k/memcpy.S new file mode 100644 index 0000000..464da95 --- /dev/null +++ b/lib/machine/m68k/memcpy.S @@ -0,0 +1,112 @@ +/* a-memcpy.s -- memcpy, optimised for m68k asm + * + * Copyright (c) 2007 mocom software GmbH & Co KG) + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include "m68kasm.h" + +#if defined (__mcoldfire__) || defined (__mc68030__) || defined (__mc68040__) || defined (__mc68060__) +# define MISALIGNED_OK 1 +#else +# define MISALIGNED_OK 0 +#endif + + .text + .align 4 + + .globl SYM(memcpy) + .type SYM(memcpy), @function + +/* memcpy, optimised + * + * strategy: + * - no argument testing (the original memcpy from the GNU lib does + * no checking either) + * - make sure the destination pointer (the write pointer) is long word + * aligned. This is the best you can do, because writing to unaligned + * addresses can be the most costfull thing you could do. + * - Once you have figured that out, we do a little loop unrolling + * to further improve speed. + */ + +SYM(memcpy): + move.l 4(sp),a0 | dest ptr + move.l 8(sp),a1 | src ptr + move.l 12(sp),d1 | len + cmp.l #8,d1 | if fewer than 8 bytes to transfer, + blo .Lresidue | do not optimise + +#if !MISALIGNED_OK + /* Goto .Lresidue if either dest or src is not 4-byte aligned */ + move.l a0,d0 + and.l #3,d0 + bne .Lresidue + move.l a1,d0 + and.l #3,d0 + bne .Lresidue +#else /* MISALIGNED_OK */ + /* align dest */ + move.l a0,d0 | copy of dest + neg.l d0 + and.l #3,d0 | look for the lower two only + beq 2f | is aligned? + sub.l d0,d1 + lsr.l #1,d0 | word align needed? + bcc 1f + move.b (a1)+,(a0)+ +1: + lsr.l #1,d0 | long align needed? + bcc 2f + move.w (a1)+,(a0)+ +2: +#endif /* !MISALIGNED_OK */ + + /* long word transfers */ + move.l d1,d0 + and.l #3,d1 | byte residue + lsr.l #3,d0 + bcc 1f | carry set for 4-byte residue + move.l (a1)+,(a0)+ +1: + lsr.l #1,d0 | number of 16-byte transfers + bcc .Lcopy | carry set for 8-byte residue + bra .Lcopy8 + +1: + move.l (a1)+,(a0)+ + move.l (a1)+,(a0)+ +.Lcopy8: + move.l (a1)+,(a0)+ + move.l (a1)+,(a0)+ +.Lcopy: +#if !defined (__mcoldfire__) + dbra d0,1b + sub.l #0x10000,d0 +#else + subq.l #1,d0 +#endif + bpl 1b + bra .Lresidue + +1: + move.b (a1)+,(a0)+ | move residue bytes + +.Lresidue: +#if !defined (__mcoldfire__) + dbra d1,1b | loop until done +#else + subq.l #1,d1 + bpl 1b +#endif + move.l 4(sp),d0 | return value + rts diff --git a/lib/machine/m68k/memset.S b/lib/machine/m68k/memset.S new file mode 100644 index 0000000..622cf01 --- /dev/null +++ b/lib/machine/m68k/memset.S @@ -0,0 +1,100 @@ +/* a-memset.s -- memset, optimised for fido asm + * + * Copyright (c) 2007 mocom software GmbH & Co KG) + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include "m68kasm.h" + + .text + .align 4 + + .globl SYM(memset) + .type SYM(memset), @function + +| memset, optimised +| +| strategy: +| - no argument testing (the original memcpy from the GNU lib does +| no checking either) +| - make sure the destination pointer (the write pointer) is long word +| aligned. This is the best you can do, because writing to unaligned +| addresses can be the most costfull thing one could do. +| - we fill long word wise if possible +| +| VG, 2006 +| +| bugfixes: +| - distribution of byte value improved - in cases someone gives +| non-byte value +| - residue byte transfer was not working +| +| VG, April 2007 +| +SYM(memset): + move.l 4(sp),a0 | dest ptr + move.l 8(sp),d0 | value + move.l 12(sp),d1 | len + cmp.l #16,d1 + blo .Lbset | below, byte fills + | + move.l d2,-(sp) | need a register + move.b d0,d2 | distribute low byte to all byte in word + lsl.l #8,d0 + move.b d2,d0 + move.w d0,d2 + swap d0 | rotate 16 + move.w d2,d0 + | + move.l a0,d2 | copy of src + neg.l d2 | 1 2 3 ==> 3 2 1 + and.l #3,d2 + beq 2f | is aligned + | + sub.l d2,d1 | fix length + lsr.l #1,d2 | word align needed? + bcc 1f + move.b d0,(a0)+ | fill byte +1: + lsr.l #1,d2 | long align needed? + bcc 2f + move.w d0,(a0)+ | fill word +2: + move.l d1,d2 | number of long transfers (at least 3) + lsr.l #2,d2 + subq.l #1,d2 + +1: + move.l d0,(a0)+ | fill long words +.Llset: +#if !defined (__mcoldfire__) + dbra d2,1b | loop until done + sub.l #0x10000,d2 +#else + subq.l #1,d2 +#endif + bpl 1b + and.l #3,d1 | residue byte transfers, fixed + move.l (sp)+,d2 | restore d2 + bra .Lbset + +1: + move.b d0,(a0)+ | fill residue bytes +.Lbset: +#if !defined (__mcoldfire__) + dbra d1,1b | loop until done +#else + subq.l #1,d1 + bpl 1b +#endif + move.l 4(sp),d0 | return value + rts diff --git a/lib/machine/m68k/setjmp.S b/lib/machine/m68k/setjmp.S new file mode 100644 index 0000000..4b260ef --- /dev/null +++ b/lib/machine/m68k/setjmp.S @@ -0,0 +1,49 @@ +#include "m68kasm.h" + +.global SYM (setjmp) +.global SYM (longjmp) + +SYM (setjmp): + moveal sp@(4),a0 + movel sp@(0),a0@(12) + movel sp,a0@(8) + moveml d2-d7/a2-a6,a0@(20) + clrl d0 + rts + +SYM (longjmp): + moveal sp@(4),a0 + movel sp@(8),d0 + bne 1f + movel &1,d0 +1: + moveml a0@(20),d2-d7/a2-a6 + moveal a0@(8),sp + movel a0@(12),sp@ + rts + +#ifdef M68881 +.global SYM (setjmp_68881) +.global SYM (longjmp_68881) + +SYM (setjmp_68881): + moveal sp@(4),a0 + movel sp@(0),a0@(12) + movel sp,a0@(8) + moveml d2-d7/a2-a6,a0@(20) + fmovemx fp2-fp7,a0@(64) + clrl d0 + rts + +SYM (longjmp_68881): + moveal sp@(4),a0 + fmovemx a0@(64),fp2-fp7 + movel sp@(8),d0 + bne 1f + movel &1,d0 +1: + moveml a0@(20),d2-d7/a2-a6 + moveal a0@(8),sp + movel a0@(12),sp@ + rts +#endif diff --git a/lib/machine/m68k/strcpy.c b/lib/machine/m68k/strcpy.c new file mode 100644 index 0000000..ccc9141 --- /dev/null +++ b/lib/machine/m68k/strcpy.c @@ -0,0 +1,36 @@ +/* + * C library strcpy routine + * + * This routine has been optimized for the CPU32+. + * It should run on all 68k machines. + * + * W. Eric Norum + * Saskatchewan Accelerator Laboratory + * University of Saskatchewan + * Saskatoon, Saskatchewan, CANADA + * eric@skatter.usask.ca + */ + +#include + +/* + * Copy bytes using CPU32+ loop mode if possible + */ + +char * +strcpy (char *to, const char *from) +{ + char *pto = to; + unsigned int n = 0xFFFF; + + asm volatile ("1:\n" + "\tmove.b (%0)+,(%1)+\n" +#if defined(__mcpu32__) + "\tdbeq %2,1b\n" +#endif + "\tbne.b 1b\n" : + "=a" (from), "=a" (pto), "=d" (n) : + "0" (from), "1" (pto), "2" (n) : + "cc", "memory"); + return to; +} diff --git a/lib/machine/m68k/strlen.c b/lib/machine/m68k/strlen.c new file mode 100644 index 0000000..589a697 --- /dev/null +++ b/lib/machine/m68k/strlen.c @@ -0,0 +1,35 @@ +/* + * C library strlen routine + * + * This routine has been optimized for the CPU32+. + * It should run on all 68k machines. + * + * W. Eric Norum + * Saskatchewan Accelerator Laboratory + * University of Saskatchewan + * Saskatoon, Saskatchewan, CANADA + * eric@skatter.usask.ca + */ + +#include + +/* + * Test bytes using CPU32+ loop mode if possible. + */ +size_t +strlen (const char *str) +{ + unsigned int n = ~0; + const char *cp = str; + + asm volatile ("1:\n" + "\ttst.b (%0)+\n" +#if defined(__mcpu32__) + "\tdbeq %1,1b\n" +#endif + "\tbne.b 1b\n" : + "=a" (cp), "=d" (n) : + "0" (cp), "1" (n) : + "cc"); + return (cp - str) - 1; +} diff --git a/lib/machine/m88k/Makefile.inc b/lib/machine/m88k/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/m88k/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/m88k/setjmp.S b/lib/machine/m88k/setjmp.S new file mode 100644 index 0000000..24d44b6 --- /dev/null +++ b/lib/machine/m88k/setjmp.S @@ -0,0 +1,48 @@ +/* This is a simple version of setjmp and longjmp. + + Ian Lance Taylor, Cygnus Support, 15 July 1993. */ + +/* We need to save the address of the return instruction, which is in + r1, as well as general register r14 through r25. If we are + compiling for the 88110 with the extended register file, we also + need to save registers x22 through x29. The jmp_buf should be 52 + bytes long in the one case, 84 bytes in the other. */ + +/* int setjmp (jmp_buf); */ + globl _setjmp +_setjmp: + st r1,r2,0 + st.d r14,r2,4 + st.d r16,r2,12 + st.d r18,r2,20 + st.d r20,r2,28 + st.d r22,r2,36 + st.d r24,r2,44 +#ifdef __m88110__ + /* These instructions are just a guess, and gas doesn't + support them anyhow. */ + st.d x22,r2,52 + st.d x24,r2,60 + st.d x26,r2,68 + st.d x28,r2,76 +#endif + jmp r1 + + global _longjmp +_longjmp: + ld r1,r2,0 + ld.d r14,r2,4 + ld.d r16,r2,12 + ld.d r18,r2,20 + ld.d r20,r2,28 + ld.d r22,r2,36 + ld.d r24,r2,44 +#ifdef __m88110__ + /* These instructions are just a guess, and gas doesn't + support them anyhow. */ + ld.d x22,r2,52 + ld.d x24,r2,60 + ld.d x26,r2,68 + ld.d x28,r2,76 +#endif + jmp r1 diff --git a/lib/machine/mep/Makefile.inc b/lib/machine/mep/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/mep/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/mep/setjmp.S b/lib/machine/mep/setjmp.S new file mode 100644 index 0000000..3b39bcf --- /dev/null +++ b/lib/machine/mep/setjmp.S @@ -0,0 +1,118 @@ +# +# Setjmp/longjmp for MeP +# +# DJ Delorie, Red Hat Inc. +# +# 19 32-bit words in the jmpbuf: +# $0 +# $1 +# ... +# $15 +# $pc +# $hi +# $lo +# +# Note that $0 is saved but not restored. It can't be restored +# as it's the return value of setjmp, but we save it in case +# some application wants to see it in the jmp_buf. Ideally, +# we should not need to save anything that is call-clobbered, +# but you never know what the user is going to tell gcc with -f +# options. + + .noregerr + .text + + .globl setjmp + .type setjmp,@function + +setjmp: + + # $1 is the address of the buffer. We return 0 in $0. + + sw $0, ($1) + sw $1, 4($1) + sw $2, 8($1) + sw $3, 12($1) + sw $4, 16($1) + sw $5, 20($1) + sw $6, 24($1) + sw $7, 28($1) + sw $8, 32($1) + sw $9, 36($1) + sw $10, 40($1) + sw $11, 44($1) + sw $12, 48($1) + sw $13, 52($1) + sw $14, 56($1) + sw $15, 60($1) + + ldc $0, $lp + sw $0, 64($1) + ldc $0, $opt + sra $0, 24 + and3 $0, $0, 3 + beqz $0, sj_skip_hilo + ldc $0, $hi + sw $0, 68($1) + ldc $0, $lo + sw $0, 72($1) +sj_skip_hilo: + + mov $0, 0 + ret + + .globl longjmp + .type longjmp,@function + +longjmp: + + # $1 is the address of the buffer. $2 is the value setjmp + # returns. We do not faithfully restore $0 or $lp, because + # the act of calling setjmp clobbered those anyway. + + bnez $2, rv_not_zero + mov $2, 1 +rv_not_zero: + + # We restore $sp first so we can save the return value there, + # otherwise we'd need to have another unrestored register. + lw $15, 60($1) + add3 $sp, $sp, -4 + sw $2, ($sp) + + # Now restore the general registers. + lw $2, 8($1) + lw $3, 12($1) + lw $4, 16($1) + lw $5, 20($1) + lw $6, 24($1) + lw $7, 28($1) + lw $8, 32($1) + lw $9, 36($1) + lw $10, 40($1) + lw $11, 44($1) + lw $12, 48($1) + lw $13, 52($1) + lw $14, 56($1) + + # We restore $pc's value to $lp so that we can just ret later. + lw $0, 64($1) + stc $0, $lp + ldc $0, $opt + sra $0, 24 + and3 $0, $0, 3 + beqz $0, lj_skip_hilo + lw $0, 68($1) + stc $0, $hi + lw $0, 72($1) + stc $0, $lo +lj_skip_hilo: + + # Restore $1 + lw $1, 8($1) + + # Get the return value off the stack, and restore the stack. + lw $0, ($sp) + add3 $sp, $sp, 4 + + ret diff --git a/lib/machine/microblaze/Makefile.inc b/lib/machine/microblaze/Makefile.inc new file mode 100644 index 0000000..3fc3b9a --- /dev/null +++ b/lib/machine/microblaze/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/strlen.c %D%/strcmp.c %D%/strcpy.c %D%/setjmp.S %D%/longjmp.S diff --git a/lib/machine/microblaze/abort.c b/lib/machine/microblaze/abort.c new file mode 100644 index 0000000..1af7b36 --- /dev/null +++ b/lib/machine/microblaze/abort.c @@ -0,0 +1,60 @@ +/* NetWare can not use this implementation of abort. It provides its + own version of abort in clib.nlm. If we can not use clib.nlm, then + we must write abort in sys/netware. */ + +#ifdef ABORT_PROVIDED + +int _dummy_abort = 1; + +#else + +/* +FUNCTION +<>---abnormal termination of a program + +INDEX + abort + +SYNOPSIS + #include + void abort(void); + +DESCRIPTION +Use <> to signal that your program has detected a condition it +cannot deal with. Normally, <> ends your program's execution. + +Before terminating your program, <> raises the exception <> +(using `<>'). If you have used <> to register +an exception handler for this condition, that handler has the +opportunity to retain control, thereby avoiding program termination. + +In this implementation, <> does not perform any stream- or +file-related cleanup (the host environment may do so; if not, you can +arrange for your program to do its own cleanup with a <> +exception handler). + +RETURNS +<> does not return to its caller. + +PORTABILITY +ANSI C requires <>. + +Supporting OS subroutines required: <<_exit>> and optionally, <>. +*/ + +#include +#include +#include + +void +abort (void) +{ +#ifdef ABORT_MESSAGE + write (2, "Abort called\n", sizeof ("Abort called\n")-1); +#endif + + while (1) + { + exit(1); + } +} diff --git a/lib/machine/microblaze/longjmp.S b/lib/machine/microblaze/longjmp.S new file mode 100644 index 0000000..f972bbd --- /dev/null +++ b/lib/machine/microblaze/longjmp.S @@ -0,0 +1,80 @@ +/* Copyright (c) 2001, 2009 Xilinx, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Xilinx nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * + * longjmp - non-local jump to a saved stack context + * args - r5 - jmp_buf + * r6 - val + * + * jmpbuf frame structure + * --------------------- + * + * +-------------+ + 0 + * | r1 | + * +-------------+ + 4 + * | r13 | + * | . | + * | . | + * | . | + * | r31 | + * +-------------+ + 80 + * | . | + * | . | + */ + + +.globl longjmp +.section .text +.align 2 +.ent longjmp +longjmp: + lwi r1, r5, 0 + lwi r13, r5, 4 + lwi r14, r5, 8 + lwi r15, r5, 12 + lwi r16, r5, 16 + lwi r17, r5, 20 + lwi r18, r5, 24 + lwi r19, r5, 28 + lwi r20, r5, 32 + lwi r21, r5, 36 + lwi r22, r5, 40 + lwi r23, r5, 44 + lwi r24, r5, 48 + lwi r25, r5, 52 + lwi r26, r5, 56 + lwi r27, r5, 60 + lwi r28, r5, 64 + lwi r29, r5, 68 + lwi r30, r5, 72 + lwi r31, r5, 76 + + rtsd r15, 8 + or r3, r0, r6 +.end longjmp diff --git a/lib/machine/microblaze/mb_endian.h b/lib/machine/microblaze/mb_endian.h new file mode 100644 index 0000000..fb217ec --- /dev/null +++ b/lib/machine/microblaze/mb_endian.h @@ -0,0 +1,15 @@ +#ifndef _MB_ENDIAN_H +#define _MB_ENDIAN_H + +/* Convenience macros for loading and store 4 bytes in a byte invariant way with + * a singe instruction. Endianess affects this and we rely on MicroBlaze + * load/store reverse instructions to do the trick on little-endian systems. + */ +#ifdef __LITTLE_ENDIAN__ +#define LOAD4BYTES(rD,rA,rB) "\tlwr\t" rD ", " rA ", " rB "\n" +#define STORE4BYTES(rD,rA,rB) "\tswr\t" rD ", " rA ", " rB "\n" +#else +#define LOAD4BYTES(rD,rA,rB) "\tlw\t" rD ", " rA ", " rB "\n" +#define STORE4BYTES(rD,rA,rB) "\tsw\t" rD ", " rA ", " rB "\n" +#endif +#endif diff --git a/lib/machine/microblaze/setjmp.S b/lib/machine/microblaze/setjmp.S new file mode 100644 index 0000000..cdd87c7 --- /dev/null +++ b/lib/machine/microblaze/setjmp.S @@ -0,0 +1,79 @@ +/* Copyright (c) 2001, 2009 Xilinx, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Xilinx nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + * + * setjmp - save stack context for non-local goto + * args - r5 - jmp_buf + * + * jmpbuf frame structure + * --------------------- + * + * +-------------+ + 0 + * | r1 | + * +-------------+ + 4 + * | r13 | + * | . | + * | . | + * | . | + * | r31 | + * +-------------+ + 80 + * | . | + * | . | + */ + + +.globl setjmp +.section .text +.align 2 +.ent setjmp +setjmp: + swi r1, r5, 0 + swi r13, r5, 4 + swi r14, r5, 8 + swi r15, r5, 12 + swi r16, r5, 16 + swi r17, r5, 20 + swi r18, r5, 24 + swi r19, r5, 28 + swi r20, r5, 32 + swi r21, r5, 36 + swi r22, r5, 40 + swi r23, r5, 44 + swi r24, r5, 48 + swi r25, r5, 52 + swi r26, r5, 56 + swi r27, r5, 60 + swi r28, r5, 64 + swi r29, r5, 68 + swi r30, r5, 72 + swi r31, r5, 76 + + rtsd r15, 8 + or r3, r0, r0 +.end setjmp diff --git a/lib/machine/microblaze/strcmp.c b/lib/machine/microblaze/strcmp.c new file mode 100644 index 0000000..434195e --- /dev/null +++ b/lib/machine/microblaze/strcmp.c @@ -0,0 +1,191 @@ +/* Copyright (c) 2009 Xilinx, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Xilinx nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +FUNCTION + <>---character string compare + +INDEX + strcmp + +SYNOPSIS + #include + int strcmp(const char *<[a]>, const char *<[b]>); + +DESCRIPTION + <> compares the string at <[a]> to + the string at <[b]>. + +RETURNS + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>>, + <> returns a number greater than zero. If the two + strings match, <> returns zero. If <<*<[a]>>> + sorts lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strcmp ansi pure +*/ + +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* DETECTNULL returns nonzero if (long)X contains a NULL byte. */ +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +int +strcmp (const char *s1, + const char *s2) +{ + +#ifndef HAVE_HW_PCMP + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +#else + unsigned long *a1; + unsigned long *a2; + + /* If s1 or s2 are unaligned, then compare bytes. */ + if (!UNALIGNED (s1, s2)) + { + /* If s1 and s2 are word-aligned, compare them a word at a time. */ + a1 = (unsigned long*)s1; + a2 = (unsigned long*)s2; + while (*a1 == *a2) + { + /* To get here, *a1 == *a2, thus if we find a null in *a1, + then the strings must be equal, so return zero. */ + if (DETECTNULL (*a1)) + return 0; + + a1++; + a2++; + } + + /* A difference was detected in last few bytes of s1, so search bytewise */ + s1 = (char*)a1; + s2 = (char*)a2; + } + + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +#endif /* not PREFER_SIZE_OVER_SPEED */ + +#else + +#include "mb_endian.h" + + asm volatile (" \n\ + or r9, r0, r0 /* Index register */\n\ +check_alignment: \n\ + andi r3, r5, 3 \n\ + andi r4, r6, 3 \n\ + bnei r3, try_align_args \n\ + bnei r4, regular_strcmp /* At this point we don't have a choice */ \n\ +cmp_loop: \n" + LOAD4BYTES("r3", "r5", "r9") + LOAD4BYTES("r4", "r6", "r9") +" \n\ + pcmpbf r7, r3, r0 /* See if there is Null byte */ \n\ + bnei r7, end_cmp_loop /* IF yes (r7 > 0) use byte compares in end_cmp_loop */ \n\ + cmpu r7, r4, r3 /* ELSE compare whole word */ \n\ + bnei r7, end_cmp \n\ + brid cmp_loop \n\ + addik r9, r9, 4 /* delay slot */ \n\ +end_cmp_loop: \n\ + lbu r3, r5, r9 /* byte compare loop */ \n\ + lbu r4, r6, r9 \n\ + cmpu r7, r4, r3 /* Compare bytes */ \n\ + bnei r7, end_cmp_early \n\ + bneid r3, end_cmp_loop /* If reached null on one string, terminate */ \n\ + addik r9, r9, 1 /* delay slot */ \n\ +end_cmp_early: \n\ + rtsd r15, 8 \n\ + or r3, r0, r7 \n\ +try_align_args: \n\ + xor r7, r4, r3 \n\ + bnei r7, regular_strcmp /* cannot align args */ \n\ + rsubik r10, r3, 4 /* Number of initial bytes to align */ \n\ +align_loop: \n\ + lbu r3, r5, r9 \n\ + lbu r4, r6, r9 \n\ + cmpu r7, r4, r3 \n\ + bnei r7, end_cmp \n\ + beqi r3, end_cmp \n\ + addik r10, r10, -1 \n\ + beqid r10, cmp_loop \n\ + addik r9, r9, 1 \n\ + bri align_loop \n\ +regular_strcmp: \n\ + lbu r3, r5, r9 \n\ + lbu r4, r6, r9 \n\ + cmpu r7, r4, r3 \n\ + bnei r7, end_cmp \n\ + beqi r3, end_cmp \n\ + brid regular_strcmp \n\ + addik r9, r9, 1 \n\ +end_cmp: \n\ + rtsd r15, 8 \n\ + or r3, r0, r7 /* Return strcmp result */"); + +#endif /* ! HAVE_HW_PCMP */ +} + diff --git a/lib/machine/microblaze/strcpy.c b/lib/machine/microblaze/strcpy.c new file mode 100644 index 0000000..62072fa --- /dev/null +++ b/lib/machine/microblaze/strcpy.c @@ -0,0 +1,180 @@ +/* Copyright (c) 2009 Xilinx, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Xilinx nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +FUNCTION + <>---copy string + +INDEX + strcpy + +SYNOPSIS + #include + char *strcpy(char *restrict <[dst]>, const char *restrict <[src]>); + +DESCRIPTION + <> copies the string pointed to by <[src]> + (including the terminating null character) to the array + pointed to by <[dst]>. + +RETURNS + This function returns the initial value of <[dst]>. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strcpy ansi pure +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +char* +strcpy (char *__restrict dst0, + const char *__restrict src0) +{ + +#ifndef HAVE_HW_PCMP + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *s = dst0; + + while (*dst0++ = *src0++) + ; + + return s; +#else + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + + /* If SRC or DEST is unaligned, then copy bytes. */ + if (!UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (!DETECTNULL(*aligned_src)) + { + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (*dst++ = *src++) + ; + return dst0; +#endif /* not PREFER_SIZE_OVER_SPEED */ + +#else + +#include "mb_endian.h" + + asm volatile (" \n\ + or r9, r0, r0 /* Index register */ \n\ +check_alignment: \n\ + andi r3, r5, 3 \n\ + andi r4, r6, 3 \n\ + bnei r3, try_align_args \n\ + bnei r4, regular_strcpy /* At this point we dont have a choice */ \n\ +cpy_loop: \n" + LOAD4BYTES("r3", "r6", "r9") +" \n\ + pcmpbf r4, r0, r3 \n\ + bnei r4, cpy_bytes /* If r4 != 0, then null present within string */\n" + STORE4BYTES("r3", "r5", "r9") +" \n\ + brid cpy_loop \n\ + addik r9, r9, 4 \n\ +cpy_bytes: \n\ + lbu r3, r6, r9 \n\ + sb r3, r5, r9 \n\ + addik r4, r4, -1 \n\ + bneid r4, cpy_bytes \n\ + addik r9, r9, 1 /* delay slot */\n\ +cpy_null: \n\ + rtsd r15, 8 \n\ + or r3, r0, r5 /* Return strcpy result */\n\ +try_align_args: \n\ + xor r7, r4, r3 \n\ + bnei r7, regular_strcpy /* cannot align args */\n\ + rsubik r10, r3, 4 /* Number of initial bytes to align */\n\ +align_loop: \n\ + lbu r3, r6, r9 \n\ + sb r3, r5, r9 \n\ + beqid r3, end_cpy /* Break if we have seen null character */\n\ + addik r10, r10, -1 \n\ + bneid r10, align_loop \n\ + addik r9, r9, 1 \n\ + bri cpy_loop \n\ +regular_strcpy: \n\ + lbu r3, r6, r9 \n\ + sb r3, r5, r9 \n\ + bneid r3, regular_strcpy \n\ + addik r9, r9, 1 \n\ +end_cpy: \n\ + rtsd r15, 8 \n\ + or r3, r0, r5 /* Return strcpy result */"); +#endif /* ! HAVE_HW_PCMP */ +} + + + + + diff --git a/lib/machine/microblaze/strlen.c b/lib/machine/microblaze/strlen.c new file mode 100644 index 0000000..acb4464 --- /dev/null +++ b/lib/machine/microblaze/strlen.c @@ -0,0 +1,150 @@ +/* Copyright (c) 2009 Xilinx, Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of Xilinx nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +FUNCTION + <>---character string length + +INDEX + strlen + +SYNOPSIS + #include + size_t strlen(const char *<[str]>); + +DESCRIPTION + The <> function works out the length of the string + starting at <<*<[str]>>> by counting chararacters until it + reaches a <> character. + +RETURNS + <> returns the character count. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strlen ansi pure +*/ + +#include <_ansi.h> +#include +#include + +#define LBLOCKSIZE (sizeof (long)) +#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +size_t +strlen (const char *str) +{ + +#ifndef HAVE_HW_PCMP + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + const char *start = str; + + while (*str) + str++; + + return str - start; +#else + const char *start = str; + unsigned long *aligned_addr; + + if (!UNALIGNED (str)) + { + /* If the string is word-aligned, we can check for the presence of + a null in each word-sized block. */ + aligned_addr = (unsigned long*)str; + while (!DETECTNULL (*aligned_addr)) + aligned_addr++; + + /* Once a null is detected, we check each byte in that block for a + precise position of the null. */ + str = (char*)aligned_addr; + } + + while (*str) + str++; + return str - start; +#endif /* not PREFER_SIZE_OVER_SPEED */ + +#else + +#include "mb_endian.h" + + asm volatile (" \n\ + or r9, r0, r0 /* Index register */ \n\ +check_alignment: \n\ + andi r3, r5, 3 \n\ + bnei r3, align_arg \n\ +len_loop: \n" + LOAD4BYTES("r3", "r5", "r9") +" \n\ + pcmpbf r4, r3, r0 \n\ + bnei r4, end_len \n\ + brid len_loop \n\ + addik r9, r9, 4 \n\ +end_len: \n\ + lbu r3, r5, r9 \n\ + beqi r3, done_len \n\ + brid end_len \n\ + addik r9, r9, 1 \n\ +done_len: \n\ + rtsd r15, 8 \n\ + or r3, r0, r9 /* Return len */ \n\ +align_arg: \n\ + rsubik r10, r3, 4 \n\ +align_loop: \n\ + lbu r3, r5, r9 \n\ + beqid r3, done_len \n\ + addik r10, r10, -1 \n\ + bneid r10, align_loop \n\ + addik r9, r9, 1 \n\ + bri len_loop"); + +#endif /* ! HAVE_HW_PCMP */ +} diff --git a/lib/machine/mips/Makefile.inc b/lib/machine/mips/Makefile.inc new file mode 100644 index 0000000..22f0c6e --- /dev/null +++ b/lib/machine/mips/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/strlen.c %D%/strcmp.S %D%/strncpy.c %D%/memset.S %D%/memcpy.S diff --git a/lib/machine/mips/machine/asm.h b/lib/machine/mips/machine/asm.h new file mode 100644 index 0000000..dcd290e --- /dev/null +++ b/lib/machine/mips/machine/asm.h @@ -0,0 +1,361 @@ +/* + * Copyright (c) 1996-2007 MIPS Technologies, Inc. + * Copyright (C) 2009 CodeSourcery, LLC. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with + * the distribution. + * * Neither the name of MIPS Technologies Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * asm.h: various macros to help assembly language writers + */ + +#ifndef _MIPS_ASM_H_ +#define _MIPS_ASM_H_ + +/* ABI specific stack frame layout and manipulation. */ +#if _MIPS_SIM==_ABIO32 && ! __mips64 +/* Standard O32 */ +#define SZREG 4 /* saved register size */ +#define REG_S sw /* store saved register */ +#define REG_L lw /* load saved register */ +#define SZARG 4 /* argument register size */ +#define NARGSAVE 4 /* arg register space on caller stack */ +#define ALSZ 7 /* stack alignment - 1 */ +#define ALMASK (~7) /* stack alignment mask */ +#define LOG2_STACK_ALGN 3 /* log2(8) */ +#define SZPTR 4 /* pointer size */ +#define LOG2_SZPTR 2 /* log2(4) */ +#define PTR_S sw /* store pointer */ +#define PTR_L lw /* load pointer */ +#define PTR_SUBU subu /* decrement pointer */ +#define PTR_ADDU addu /* increment pointer */ +#define PTR .word /* pointer type pseudo */ +#elif _MIPS_SIM==_ABIO32 && __mips64 +/* Algorithmics O32+64-bit */ +#define SZREG 8 /* saved register size */ +#define REG_S sd /* store saved register */ +#define REG_L ld /* load saved register */ +#define SZARG 4 /* argument register size */ +#define NARGSAVE 4 /* arg register space on caller stack */ +#define ALSZ 7 /* stack alignment - 1 */ +#define ALMASK (~7) /* stack alignment mask */ +#define LOG2_STACK_ALGN 3 /* log2(8) */ +#define SZPTR 4 /* pointer size */ +#define LOG2_SZPTR 2 /* log2(4) */ +#define PTR_S sw /* store pointer */ +#define PTR_L lw /* load pointer */ +#define PTR_SUBU subu /* decrement pointer */ +#define PTR_ADDU addu /* increment pointer */ +#define PTR .word /* pointer type pseudo */ +#elif _MIPS_SIM==_ABIO64 +/* Cygnus O64 */ +#define SZREG 8 /* saved register size */ +#define REG_S sd /* store saved register */ +#define REG_L ld /* load saved register */ +#define SZARG 8 /* argument register size */ +#define NARGSAVE 4 /* arg register space on caller stack */ +#define ALSZ 7 /* stack alignment - 1 */ +#define ALMASK (~7) /* stack alignment mask */ +#define LOG2_STACK_ALGN 3 /* log2(8) */ +#define SZPTR 4 /* pointer size */ +#define LOG2_SZPTR 2 /* log2(4) */ +#define PTR_S sw /* store pointer */ +#define PTR_L lw /* load pointer */ +#define PTR_SUBU subu /* decrement pointer */ +#define PTR_ADDU addu /* increment pointer */ +#define PTR .word /* pointer type pseudo */ +#elif _MIPS_SIM==_ABIN32 +/* Standard N32 */ +#define SZREG 8 /* saved register size */ +#define REG_S sd /* store saved register */ +#define REG_L ld /* load saved register */ +#define SZARG 8 /* argument register size */ +#define NARGSAVE 0 /* arg register space on caller stack */ +#define ALSZ 15 /* stack alignment - 1 */ +#define ALMASK (~15) /* stack alignment mask */ +#define LOG2_STACK_ALGN 4 /* log2(16) */ +#define SZPTR 4 /* pointer size */ +#define LOG2_SZPTR 2 /* log2(4) */ +#define PTR_S sw /* store pointer */ +#define PTR_L lw /* load pointer */ +#define PTR_SUBU subu /* decrement pointer (SGI uses sub) */ +#define PTR_ADDU addu /* increment pointer (SGI uses add) */ +#define PTR .word /* pointer type pseudo */ +#elif _MIPS_SIM==_ABI64 +/* Standard N64 */ +#define SZREG 8 /* saved register size */ +#define REG_S sd /* store saved register */ +#define REG_L ld /* load saved register */ +#define SZARG 8 /* argument register size */ +#define NARGSAVE 0 /* arg register space on caller stack */ +#define ALSZ 15 /* stack alignment - 1 */ +#define ALMASK (~15) /* stack alignment mask */ +#define LOG2_STACK_ALGN 4 /* log2(16) */ +#define SZPTR 8 /* pointer size */ +#define LOG2_SZPTR 3 /* log2(8) */ +#define PTR_S sd /* store pointer */ +#define PTR_L ld /* load pointer */ +#define PTR_SUBU dsubu /* decrement pointer */ +#define PTR_ADDU daddu /* increment pointer */ +#define PTR .dword /* pointer type pseudo */ +#else +#error Unknown ABI +#endif + +/* Concatenate two names. */ +#ifdef __STDC__ +# define _ASMCONCAT(A, B) A ## B +#else +# define _ASMCONCAT(A, B) A/**/B +#endif + +/* Name of reset code section. */ +#ifndef _RESET_SECTION +# define _RESET_SECTION .section .reset, "ax", @progbits +#endif + +#ifndef _RESET_SECTION_NAMED +/* No function section support for now, since binutils fails to cope with + external branches. */ +# define _RESET_SECTION_NAMED(name) .pushsection .reset, "ax", @progbits +#endif + +/* Name of boot code section. */ +#ifndef _BOOT_SECTION +# define _BOOT_SECTION .section .boot, "ax", @progbits +#endif + +#ifndef _BOOT_SECTION_NAMED +/* No function section support for now, since binutils fails to cope with + external branches. */ +# define _BOOT_SECTION_NAMED(name) .pushsection .boot, "ax", @progbits +#endif + +/* Name of standard code section. */ +#ifndef _NORMAL_SECTION_UNNAMED +# define _NORMAL_SECTION_UNNAMED .section .text, "ax", @progbits +#endif + +#ifndef _NORMAL_SECTION_NAMED +# ifdef _FUNCTION_SECTIONS_ +# define _NORMAL_SECTION_NAMED(name) .pushsection .text ##.name, "ax", @progbits +# else +# define _NORMAL_SECTION_NAMED(name) .pushsection .text, "ax", @progbits +# endif +#endif + +/* Default code section. */ +#ifndef _TEXT_SECTION_NAMED +# if defined(_RESETCODE) +# define _TEXT_SECTION_NAMED _RESET_SECTION_NAMED +# elif defined(_BOOTCODE) +# define _TEXT_SECTION_NAMED _BOOT_SECTION_NAMED +# else +# define _TEXT_SECTION_NAMED _NORMAL_SECTION_NAMED +# endif +#endif + +#ifndef _TEXT_SECTION +# if defined(_RESETCODE) +# define _TEXT_SECTION _RESET_SECTION +# elif defined(_BOOTCODE) +# define _TEXT_SECTION _BOOT_SECTION +# else +# define _TEXT_SECTION _NORMAL_SECTION_UNNAMED +# endif + _TEXT_SECTION +#endif + +/* + * Leaf functions declarations. + */ + +/* Global leaf function. */ +#define LEAF(name) \ + _TEXT_SECTION_NAMED(name); \ + .globl name; \ + .balign 4; \ + .ent name; \ +name: + +/* Static/Local leaf function. */ +#define SLEAF(name) \ + _TEXT_SECTION_NAMED(name); \ + .balign 4; \ + .ent name; \ +name: + +/* Weak leaf function. */ +#define WLEAF(name) \ + _TEXT_SECTION_NAMED(name); \ + .weakext name; \ + .balign 4; \ + .ent name; \ +name: + +/* Weak alias leaf function. */ +#define ALEAF(name,alias) \ + _TEXT_SECTION_NAMED(name); \ + .weakext alias,name; \ + .balign 4; \ + .ent name; \ +name: + +/* + * Alternative function entrypoints. + */ + +/* Global alternative entrypoint. */ +#define AENT(name) \ + .globl name; \ + .balign 4; \ + .aent name; \ +name: +#define XLEAF(name) AENT(name) + +/* Local/static alternative entrypoint. */ +#define SAENT(name) \ + .balign 4; \ + .aent name; \ +name: +#define SXLEAF(name) SAENT(name) + + +/* + * Leaf functions declarations. + */ + +/* Global nested function. */ +#define NESTED(name, framesz, rareg) \ + _TEXT_SECTION_NAMED(name); \ + .globl name; \ + .balign 4; \ + .ent name; \ + .frame sp, framesz, rareg; \ +name: + +/* Static/Local nested function. */ +#define SNESTED(name, framesz, rareg) \ + _TEXT_SECTION_NAMED(name); \ + .balign 4; \ + .ent name; \ + .frame sp, framesz, rareg; \ +name: + +/* Weak nested function. */ +#define WNESTED(name, framesz, rareg) \ + _TEXT_SECTION_NAMED(name); \ + .weakext name; \ + .balign 4; \ + .ent name; \ + .frame sp, framesz, rareg; \ +name: + +/* Weak alias nested function. */ +#define ANESTED(name, alias, framesz, rareg) \ + _TEXT_SECTION_NAMED(name); \ + .weakext alias, name; \ + .balign 4; \ + .ent name; \ + .frame sp, framesz, rareg; \ +name: + +/* + * Function termination + */ +#define END(name) \ + .size name,.-name; \ + .end name; \ + .popsection + +#define SEND(name) END(name) +#define WEND(name) END(name) +#define AEND(name,alias) END(name) + +/* + * Global data declaration. + */ +#define EXPORT(name) \ + .globl name; \ + .type name,@object; \ +name: + +/* + * Global data declaration with size. + */ +#define EXPORTS(name,sz) \ + .globl name; \ + .type name,@object; \ + .size name,sz; \ +name: + +/* + * Weak data declaration with size. + */ +#define WEXPORT(name,sz) \ + .weakext name; \ + .type name,@object; \ + .size name,sz; \ +name: + +/* + * Global data reference with size. + */ +#define IMPORT(name, size) \ + .extern name,size + +/* + * Global zeroed data. + */ +#define BSS(name,size) \ + .type name,@object; \ + .comm name,size + +/* + * Local zeroed data. + */ +#define LBSS(name,size) \ + .lcomm name,size + +/* + * Insert call to _mcount if profiling. + */ +#ifdef __PROFILING__ +#define _MCOUNT \ + .set push; \ + .set noat; \ + move $1,$31; \ + jal _mcount; \ + .set pop +#else +#define _MCOUNT +#endif + +#endif diff --git a/lib/machine/mips/machine/fenv-fp.h b/lib/machine/mips/machine/fenv-fp.h new file mode 100644 index 0000000..5f446e3 --- /dev/null +++ b/lib/machine/mips/machine/fenv-fp.h @@ -0,0 +1,207 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +__fenv_static inline int +feclearexcept(int excepts) +{ + fexcept_t fcsr; + + excepts &= FE_ALL_EXCEPT; + __cfc1(fcsr); + fcsr &= ~(excepts | (excepts << _FCSR_CAUSE_SHIFT)); + __ctc1(fcsr); + + return (0); +} + +__fenv_static inline int +fegetexceptflag(fexcept_t *flagp, int excepts) +{ + fexcept_t fcsr; + + excepts &= FE_ALL_EXCEPT; + __cfc1(fcsr); + *flagp = fcsr & excepts; + + return (0); +} + +__fenv_static inline int +fesetexceptflag(const fexcept_t *flagp, int excepts) +{ + fexcept_t fcsr; + + excepts &= FE_ALL_EXCEPT; + __cfc1(fcsr); + fcsr &= ~excepts; + fcsr |= *flagp & excepts; + __ctc1(fcsr); + + return (0); +} + +__fenv_static inline int +feraiseexcept(int excepts) +{ + fexcept_t fcsr; + + excepts &= FE_ALL_EXCEPT; + __cfc1(fcsr); + fcsr |= excepts | (excepts << _FCSR_CAUSE_SHIFT); + __ctc1(fcsr); + + return (0); +} + +__fenv_static inline int +fetestexcept(int excepts) +{ + fexcept_t fcsr; + + excepts &= FE_ALL_EXCEPT; + __cfc1(fcsr); + + return (fcsr & excepts); +} + +__fenv_static inline int +fegetround(void) +{ + fexcept_t fcsr; + + __cfc1(fcsr); + + return (fcsr & _ROUND_MASK); +} + +__fenv_static inline int +fesetround(int rounding_mode) +{ + fexcept_t fcsr; + + if (rounding_mode & ~_ROUND_MASK) + return (-1); + + __cfc1(fcsr); + fcsr &= ~_ROUND_MASK; + fcsr |= rounding_mode; + __ctc1(fcsr); + + return (0); +} + +__fenv_static inline int +fegetenv(fenv_t *envp) +{ + + __cfc1(*envp); + + return (0); +} + +__fenv_static inline int +feholdexcept(fenv_t *envp) +{ + fexcept_t fcsr; + + __cfc1(fcsr); + *envp = fcsr; + fcsr &= ~(FE_ALL_EXCEPT | _ENABLE_MASK); + __ctc1(fcsr); + + return (0); +} + +__fenv_static inline int +fesetenv(const fenv_t *envp) +{ + + __ctc1(*envp); + + return (0); +} + +__fenv_static inline int +feupdateenv(const fenv_t *envp) +{ + fexcept_t fcsr; + + __cfc1(fcsr); + fesetenv(envp); + feraiseexcept(fcsr); + + return (0); +} +#if __BSD_VISIBLE + +/* We currently provide no external definitions of the functions below. */ + +#ifdef __mips_soft_float +int feenableexcept(int __mask); +int fedisableexcept(int __mask); +int fegetexcept(void); +#else +static inline int +feenableexcept(int __mask) +{ + fenv_t __old_fcsr, __new_fcsr; + + __cfc1(__old_fcsr); + __new_fcsr = __old_fcsr | (__mask & FE_ALL_EXCEPT) << _ENABLE_SHIFT; + __ctc1(__new_fcsr); + + return ((__old_fcsr >> _ENABLE_SHIFT) & FE_ALL_EXCEPT); +} + +static inline int +fedisableexcept(int __mask) +{ + fenv_t __old_fcsr, __new_fcsr; + + __cfc1(__old_fcsr); + __new_fcsr = __old_fcsr & ~((__mask & FE_ALL_EXCEPT) << _ENABLE_SHIFT); + __ctc1(__new_fcsr); + + return ((__old_fcsr >> _ENABLE_SHIFT) & FE_ALL_EXCEPT); +} + +static inline int +fegetexcept(void) +{ + fexcept_t fcsr; + + __cfc1(fcsr); + + return ((fcsr & _ENABLE_MASK) >> _ENABLE_SHIFT); +} + +#endif /* !__mips_soft_float */ + +#endif /* __BSD_VISIBLE */ \ No newline at end of file diff --git a/lib/machine/mips/machine/fenv-softfloat.h b/lib/machine/mips/machine/fenv-softfloat.h new file mode 100644 index 0000000..43340e5 --- /dev/null +++ b/lib/machine/mips/machine/fenv-softfloat.h @@ -0,0 +1,169 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2004-2011 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * This file implements the functionality of on platforms that + * lack an FPU and use softfloat in libc for floating point. To use it, + * you must write an that provides the following: + * + * - a typedef for fenv_t, which may be an integer or struct type + * - a typedef for fexcept_t (XXX This file assumes fexcept_t is a + * simple integer type containing the exception mask.) + * - definitions of FE_* constants for the five exceptions and four + * rounding modes in IEEE 754, as described in fenv(3) + * - a definition, and the corresponding external symbol, for FE_DFL_ENV + * - a macro __set_env(env, flags, mask, rnd), which sets the given fenv_t + * from the exception flags, mask, and rounding mode + * - macros __env_flags(env), __env_mask(env), and __env_round(env), which + * extract fields from an fenv_t + * - a definition of __fenv_static + * + * If the architecture supports an optional FPU, it's recommended that you + * define fenv_t and fexcept_t to match the hardware ABI. Otherwise, it + * doesn't matter how you define them. + */ +#include + +__fenv_static inline int +feclearexcept(int excepts) +{ + + return (0); +} + +__fenv_static inline int +fegetexceptflag(fexcept_t *flagp, int excepts) +{ + + return (0); + +} + +__fenv_static inline int +fesetexceptflag(const fexcept_t *flagp, int excepts) +{ + + return (0); +} + +__fenv_static inline int +feraiseexcept(int excepts) +{ + + return( excepts != 0 ); + +} + +__fenv_static inline int +fetestexcept(int excepts) +{ + + return (0); +} + +__fenv_static inline int +fegetround(void) +{ + +#ifdef FE_TONEAREST + return FE_TONEAREST; +#else + return 0; +#endif + +} + +__fenv_static inline int +fesetround(int rounding_mode) +{ + + return (0); +} + +__fenv_static inline int +fegetenv(fenv_t *envp) +{ + + return (0); +} + +__fenv_static inline int +feholdexcept(fenv_t *envp) +{ + + return (0); +} + +__fenv_static inline int +fesetenv(const fenv_t *envp) +{ + + + return (0); +} + +__fenv_static inline int +feupdateenv(const fenv_t *envp) +{ + +#if defined FE_NOMASK_ENV && FE_ALL_EXCEPT != 0 + if (envp == FE_NOMASK_ENV) + return 1; +#endif + + return (0); +} + +#if __BSD_VISIBLE + +/* We currently provide no external definitions of the functions below. */ + +__fenv_static inline int +feenableexcept(int __mask) +{ + + return (0); +} + +__fenv_static inline int +fedisableexcept(int __mask) +{ + + return (0); +} + +__fenv_static inline int +fegetexcept(void) +{ + + return (0); +} + +#endif /* __BSD_VISIBLE */ diff --git a/lib/machine/mips/machine/regdef.h b/lib/machine/mips/machine/regdef.h new file mode 100644 index 0000000..0164164 --- /dev/null +++ b/lib/machine/mips/machine/regdef.h @@ -0,0 +1,103 @@ +/* + * Copyright (c) 1996-2007 MIPS Technologies, Inc. + * Copyright (C) 2009 CodeSourcery, LLC. + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright + * notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with + * the distribution. + * * Neither the name of MIPS Technologies Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * regdef.h : MIPS Rx000 symbolic register names for assembler + */ + +#ifndef _MIPS_REGDEF_H_ +#define _MIPS_REGDEF_H_ + +#define zero $0 + +#define AT $1 + +#define v0 $2 +#define v1 $3 + +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 + +#if _MIPS_SIM==_ABIN32 || _MIPS_SIM==_ABI64 || _MIPS_SIM==_ABIEABI +#define a4 $8 +#define a5 $9 +#define a6 $10 +#define a7 $11 +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +#define ta0 $8 /* alias for $a4 */ +#define ta1 $9 /* alias for $a5 */ +#define ta2 $10 /* alias for $a6 */ +#define ta3 $11 /* alias for $a7 */ +#else +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +#define t4 $12 +#define t5 $13 +#define t6 $14 +#define t7 $15 +#define ta0 $12 /* alias for $t4 */ +#define ta1 $13 /* alias for $t5 */ +#define ta2 $14 /* alias for $t6 */ +#define ta3 $15 /* alias for $t7 */ +#endif + +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +#define s8 $30 /* == fp */ + +#define t8 $24 +#define t9 $25 +#define k0 $26 +#define k1 $27 + +#define gp $28 + +#define sp $29 +#define fp $30 +#define ra $31 + +#endif diff --git a/lib/machine/mips/memcpy.S b/lib/machine/mips/memcpy.S new file mode 100644 index 0000000..471343f --- /dev/null +++ b/lib/machine/mips/memcpy.S @@ -0,0 +1,873 @@ +/* + * Copyright (c) 2012-2015 + * MIPS Technologies, Inc., California. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef ANDROID_CHANGES +# include "machine/asm.h" +# include "machine/regdef.h" +# define USE_MEMMOVE_FOR_OVERLAP +# define PREFETCH_LOAD_HINT PREFETCH_HINT_LOAD_STREAMED +# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE +#elif _LIBC +# include "machine/asm.h" +# include "machine/regdef.h" +# define PREFETCH_LOAD_HINT PREFETCH_HINT_LOAD_STREAMED +# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE +#else +# include +# include +#endif + +/* Check to see if the MIPS architecture we are compiling for supports + * prefetching. + */ + +#if (__mips == 4) || (__mips == 5) || (__mips == 32) || (__mips == 64) +# ifndef DISABLE_PREFETCH +# define USE_PREFETCH +# endif +#endif + +#if defined(_MIPS_SIM) && ((_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32)) +# ifndef DISABLE_DOUBLE +# define USE_DOUBLE +# endif +#endif + + +#if __mips_isa_rev > 5 +# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) +# undef PREFETCH_STORE_HINT +# define PREFETCH_STORE_HINT PREFETCH_HINT_STORE_STREAMED +# endif +# define R6_CODE +#endif + +/* Some asm.h files do not have the L macro definition. */ +#ifndef L +# if _MIPS_SIM == _ABIO32 +# define L(label) $L ## label +# else +# define L(label) .L ## label +# endif +#endif + +/* Some asm.h files do not have the PTR_ADDIU macro definition. */ +#ifndef PTR_ADDIU +# ifdef USE_DOUBLE +# define PTR_ADDIU daddiu +# else +# define PTR_ADDIU addiu +# endif +#endif + +/* Some asm.h files do not have the PTR_SRA macro definition. */ +#ifndef PTR_SRA +# ifdef USE_DOUBLE +# define PTR_SRA dsra +# else +# define PTR_SRA sra +# endif +#endif + +/* New R6 instructions that may not be in asm.h. */ +#ifndef PTR_LSA +# if _MIPS_SIM == _ABI64 +# define PTR_LSA dlsa +# else +# define PTR_LSA lsa +# endif +#endif + +/* + * Using PREFETCH_HINT_LOAD_STREAMED instead of PREFETCH_LOAD on load + * prefetches appears to offer a slight preformance advantage. + * + * Using PREFETCH_HINT_PREPAREFORSTORE instead of PREFETCH_STORE + * or PREFETCH_STORE_STREAMED offers a large performance advantage + * but PREPAREFORSTORE has some special restrictions to consider. + * + * Prefetch with the 'prepare for store' hint does not copy a memory + * location into the cache, it just allocates a cache line and zeros + * it out. This means that if you do not write to the entire cache + * line before writing it out to memory some data will get zero'ed out + * when the cache line is written back to memory and data will be lost. + * + * Also if you are using this memcpy to copy overlapping buffers it may + * not behave correctly when using the 'prepare for store' hint. If you + * use the 'prepare for store' prefetch on a memory area that is in the + * memcpy source (as well as the memcpy destination), then you will get + * some data zero'ed out before you have a chance to read it and data will + * be lost. + * + * If you are going to use this memcpy routine with the 'prepare for store' + * prefetch you may want to set USE_MEMMOVE_FOR_OVERLAP in order to avoid + * the problem of running memcpy on overlapping buffers. + * + * There are ifdef'ed sections of this memcpy to make sure that it does not + * do prefetches on cache lines that are not going to be completely written. + * This code is only needed and only used when PREFETCH_STORE_HINT is set to + * PREFETCH_HINT_PREPAREFORSTORE. This code assumes that cache lines are + * 32 bytes and if the cache line is larger it will not work correctly. + */ + +#ifdef USE_PREFETCH +# define PREFETCH_HINT_LOAD 0 +# define PREFETCH_HINT_STORE 1 +# define PREFETCH_HINT_LOAD_STREAMED 4 +# define PREFETCH_HINT_STORE_STREAMED 5 +# define PREFETCH_HINT_LOAD_RETAINED 6 +# define PREFETCH_HINT_STORE_RETAINED 7 +# define PREFETCH_HINT_WRITEBACK_INVAL 25 +# define PREFETCH_HINT_PREPAREFORSTORE 30 + +/* + * If we have not picked out what hints to use at this point use the + * standard load and store prefetch hints. + */ +# ifndef PREFETCH_STORE_HINT +# define PREFETCH_STORE_HINT PREFETCH_HINT_STORE +# endif +# ifndef PREFETCH_LOAD_HINT +# define PREFETCH_LOAD_HINT PREFETCH_HINT_LOAD +# endif + +/* + * We double everything when USE_DOUBLE is true so we do 2 prefetches to + * get 64 bytes in that case. The assumption is that each individual + * prefetch brings in 32 bytes. + */ + +# ifdef USE_DOUBLE +# define PREFETCH_CHUNK 64 +# define PREFETCH_FOR_LOAD(chunk, reg) \ + pref PREFETCH_LOAD_HINT, (chunk)*64(reg); \ + pref PREFETCH_LOAD_HINT, ((chunk)*64)+32(reg) +# define PREFETCH_FOR_STORE(chunk, reg) \ + pref PREFETCH_STORE_HINT, (chunk)*64(reg); \ + pref PREFETCH_STORE_HINT, ((chunk)*64)+32(reg) +# else +# define PREFETCH_CHUNK 32 +# define PREFETCH_FOR_LOAD(chunk, reg) \ + pref PREFETCH_LOAD_HINT, (chunk)*32(reg) +# define PREFETCH_FOR_STORE(chunk, reg) \ + pref PREFETCH_STORE_HINT, (chunk)*32(reg) +# endif +/* MAX_PREFETCH_SIZE is the maximum size of a prefetch, it must not be less + * than PREFETCH_CHUNK, the assumed size of each prefetch. If the real size + * of a prefetch is greater than MAX_PREFETCH_SIZE and the PREPAREFORSTORE + * hint is used, the code will not work correctly. If PREPAREFORSTORE is not + * used then MAX_PREFETCH_SIZE does not matter. */ +# define MAX_PREFETCH_SIZE 128 +/* PREFETCH_LIMIT is set based on the fact that we never use an offset greater + * than 5 on a STORE prefetch and that a single prefetch can never be larger + * than MAX_PREFETCH_SIZE. We add the extra 32 when USE_DOUBLE is set because + * we actually do two prefetches in that case, one 32 bytes after the other. */ +# ifdef USE_DOUBLE +# define PREFETCH_LIMIT (5 * PREFETCH_CHUNK) + 32 + MAX_PREFETCH_SIZE +# else +# define PREFETCH_LIMIT (5 * PREFETCH_CHUNK) + MAX_PREFETCH_SIZE +# endif +# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) \ + && ((PREFETCH_CHUNK * 4) < MAX_PREFETCH_SIZE) +/* We cannot handle this because the initial prefetches may fetch bytes that + * are before the buffer being copied. We start copies with an offset + * of 4 so avoid this situation when using PREPAREFORSTORE. */ +#error "PREFETCH_CHUNK is too large and/or MAX_PREFETCH_SIZE is too small." +# endif +#else /* USE_PREFETCH not defined */ +# define PREFETCH_FOR_LOAD(offset, reg) +# define PREFETCH_FOR_STORE(offset, reg) +#endif + +/* Allow the routine to be named something else if desired. */ +#ifndef MEMCPY_NAME +# define MEMCPY_NAME memcpy +#endif + +/* We use these 32/64 bit registers as temporaries to do the copying. */ +#define REG0 t0 +#define REG1 t1 +#define REG2 t2 +#define REG3 t3 +#if defined(_MIPS_SIM) && (_MIPS_SIM == _ABIO32 || _MIPS_SIM == _ABIO64) +# define REG4 t4 +# define REG5 t5 +# define REG6 t6 +# define REG7 t7 +#else +# define REG4 ta0 +# define REG5 ta1 +# define REG6 ta2 +# define REG7 ta3 +#endif + +/* We load/store 64 bits at a time when USE_DOUBLE is true. + * The C_ prefix stands for CHUNK and is used to avoid macro name + * conflicts with system header files. */ + +#ifdef USE_DOUBLE +# define C_ST sd +# define C_LD ld +# if __MIPSEB +# define C_LDHI ldl /* high part is left in big-endian */ +# define C_STHI sdl /* high part is left in big-endian */ +# define C_LDLO ldr /* low part is right in big-endian */ +# define C_STLO sdr /* low part is right in big-endian */ +# else +# define C_LDHI ldr /* high part is right in little-endian */ +# define C_STHI sdr /* high part is right in little-endian */ +# define C_LDLO ldl /* low part is left in little-endian */ +# define C_STLO sdl /* low part is left in little-endian */ +# endif +# define C_ALIGN dalign /* r6 align instruction */ +#else +# define C_ST sw +# define C_LD lw +# if __MIPSEB +# define C_LDHI lwl /* high part is left in big-endian */ +# define C_STHI swl /* high part is left in big-endian */ +# define C_LDLO lwr /* low part is right in big-endian */ +# define C_STLO swr /* low part is right in big-endian */ +# else +# define C_LDHI lwr /* high part is right in little-endian */ +# define C_STHI swr /* high part is right in little-endian */ +# define C_LDLO lwl /* low part is left in little-endian */ +# define C_STLO swl /* low part is left in little-endian */ +# endif +# define C_ALIGN align /* r6 align instruction */ +#endif + +/* Bookkeeping values for 32 vs. 64 bit mode. */ +#ifdef USE_DOUBLE +# define NSIZE 8 +# define NSIZEMASK 0x3f +# define NSIZEDMASK 0x7f +#else +# define NSIZE 4 +# define NSIZEMASK 0x1f +# define NSIZEDMASK 0x3f +#endif +#define UNIT(unit) ((unit)*NSIZE) +#define UNITM1(unit) (((unit)*NSIZE)-1) + +#ifdef ANDROID_CHANGES +LEAF(MEMCPY_NAME, 0) +#else +LEAF(MEMCPY_NAME) +#endif + .set nomips16 + .set noreorder +/* + * Below we handle the case where memcpy is called with overlapping src and dst. + * Although memcpy is not required to handle this case, some parts of Android + * like Skia rely on such usage. We call memmove to handle such cases. + */ +#ifdef USE_MEMMOVE_FOR_OVERLAP + PTR_SUBU t0,a0,a1 + PTR_SRA t2,t0,31 + xor t1,t0,t2 + PTR_SUBU t0,t1,t2 + sltu t2,t0,a2 + beq t2,zero,L(memcpy) + la t9,memmove + jr t9 + nop +L(memcpy): +#endif +/* + * If the size is less than 2*NSIZE (8 or 16), go to L(lastb). Regardless of + * size, copy dst pointer to v0 for the return value. + */ + slti t2,a2,(2 * NSIZE) + bne t2,zero,L(lasts) +#if defined(RETURN_FIRST_PREFETCH) || defined(RETURN_LAST_PREFETCH) + move v0,zero +#else + move v0,a0 +#endif + +#ifndef R6_CODE + +/* + * If src and dst have different alignments, go to L(unaligned), if they + * have the same alignment (but are not actually aligned) do a partial + * load/store to make them aligned. If they are both already aligned + * we can start copying at L(aligned). + */ + xor t8,a1,a0 + andi t8,t8,(NSIZE-1) /* t8 is a0/a1 word-displacement */ + bne t8,zero,L(unaligned) + PTR_SUBU a3, zero, a0 + + andi a3,a3,(NSIZE-1) /* copy a3 bytes to align a0/a1 */ + beq a3,zero,L(aligned) /* if a3=0, it is already aligned */ + PTR_SUBU a2,a2,a3 /* a2 is the remining bytes count */ + + C_LDHI t8,0(a1) + PTR_ADDU a1,a1,a3 + C_STHI t8,0(a0) + PTR_ADDU a0,a0,a3 + +#else /* R6_CODE */ + +/* + * Align the destination and hope that the source gets aligned too. If it + * doesn't we jump to L(r6_unaligned*) to do unaligned copies using the r6 + * align instruction. + */ + andi t8,a0,7 + lapc t9,L(atable) + PTR_LSA t9,t8,t9,2 + jrc t9 +L(atable): + bc L(lb0) + bc L(lb7) + bc L(lb6) + bc L(lb5) + bc L(lb4) + bc L(lb3) + bc L(lb2) + bc L(lb1) +L(lb7): + lb a3, 6(a1) + sb a3, 6(a0) +L(lb6): + lb a3, 5(a1) + sb a3, 5(a0) +L(lb5): + lb a3, 4(a1) + sb a3, 4(a0) +L(lb4): + lb a3, 3(a1) + sb a3, 3(a0) +L(lb3): + lb a3, 2(a1) + sb a3, 2(a0) +L(lb2): + lb a3, 1(a1) + sb a3, 1(a0) +L(lb1): + lb a3, 0(a1) + sb a3, 0(a0) + + li t9,8 + subu t8,t9,t8 + PTR_SUBU a2,a2,t8 + PTR_ADDU a0,a0,t8 + PTR_ADDU a1,a1,t8 +L(lb0): + + andi t8,a1,(NSIZE-1) + lapc t9,L(jtable) + PTR_LSA t9,t8,t9,2 + jrc t9 +L(jtable): + bc L(aligned) + bc L(r6_unaligned1) + bc L(r6_unaligned2) + bc L(r6_unaligned3) +# ifdef USE_DOUBLE + bc L(r6_unaligned4) + bc L(r6_unaligned5) + bc L(r6_unaligned6) + bc L(r6_unaligned7) +# endif +#endif /* R6_CODE */ + +L(aligned): + +/* + * Now dst/src are both aligned to (word or double word) aligned addresses + * Set a2 to count how many bytes we have to copy after all the 64/128 byte + * chunks are copied and a3 to the dst pointer after all the 64/128 byte + * chunks have been copied. We will loop, incrementing a0 and a1 until a0 + * equals a3. + */ + + andi t8,a2,NSIZEDMASK /* any whole 64-byte/128-byte chunks? */ + beq a2,t8,L(chkw) /* if a2==t8, no 64-byte/128-byte chunks */ + PTR_SUBU a3,a2,t8 /* subtract from a2 the reminder */ + PTR_ADDU a3,a0,a3 /* Now a3 is the final dst after loop */ + +/* When in the loop we may prefetch with the 'prepare to store' hint, + * in this case the a0+x should not be past the "t0-32" address. This + * means: for x=128 the last "safe" a0 address is "t0-160". Alternatively, + * for x=64 the last "safe" a0 address is "t0-96" In the current version we + * will use "prefetch hint,128(a0)", so "t0-160" is the limit. + */ +#if defined(USE_PREFETCH) && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + PTR_ADDU t0,a0,a2 /* t0 is the "past the end" address */ + PTR_SUBU t9,t0,PREFETCH_LIMIT /* t9 is the "last safe pref" address */ +#endif + PREFETCH_FOR_LOAD (0, a1) + PREFETCH_FOR_LOAD (1, a1) + PREFETCH_FOR_LOAD (2, a1) + PREFETCH_FOR_LOAD (3, a1) +#if defined(USE_PREFETCH) && (PREFETCH_STORE_HINT != PREFETCH_HINT_PREPAREFORSTORE) + PREFETCH_FOR_STORE (1, a0) + PREFETCH_FOR_STORE (2, a0) + PREFETCH_FOR_STORE (3, a0) +#endif +#if defined(RETURN_FIRST_PREFETCH) && defined(USE_PREFETCH) +# if PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE + sltu v1,t9,a0 + bgtz v1,L(skip_set) + nop + PTR_ADDIU v0,a0,(PREFETCH_CHUNK*4) +L(skip_set): +# else + PTR_ADDIU v0,a0,(PREFETCH_CHUNK*1) +# endif +#endif +#if defined(RETURN_LAST_PREFETCH) && defined(USE_PREFETCH) \ + && (PREFETCH_STORE_HINT != PREFETCH_HINT_PREPAREFORSTORE) + PTR_ADDIU v0,a0,(PREFETCH_CHUNK*3) +# ifdef USE_DOUBLE + PTR_ADDIU v0,v0,32 +# endif +#endif +L(loop16w): + C_LD t0,UNIT(0)(a1) +#if defined(USE_PREFETCH) && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + sltu v1,t9,a0 /* If a0 > t9 don't use next prefetch */ + bgtz v1,L(skip_pref) +#endif + C_LD t1,UNIT(1)(a1) +#ifndef R6_CODE + PREFETCH_FOR_STORE (4, a0) + PREFETCH_FOR_STORE (5, a0) +#else + PREFETCH_FOR_STORE (2, a0) +#endif +#if defined(RETURN_LAST_PREFETCH) && defined(USE_PREFETCH) + PTR_ADDIU v0,a0,(PREFETCH_CHUNK*5) +# ifdef USE_DOUBLE + PTR_ADDIU v0,v0,32 +# endif +#endif +L(skip_pref): + C_LD REG2,UNIT(2)(a1) + C_LD REG3,UNIT(3)(a1) + C_LD REG4,UNIT(4)(a1) + C_LD REG5,UNIT(5)(a1) + C_LD REG6,UNIT(6)(a1) + C_LD REG7,UNIT(7)(a1) +#ifndef R6_CODE + PREFETCH_FOR_LOAD (4, a1) +#else + PREFETCH_FOR_LOAD (3, a1) +#endif + C_ST t0,UNIT(0)(a0) + C_ST t1,UNIT(1)(a0) + C_ST REG2,UNIT(2)(a0) + C_ST REG3,UNIT(3)(a0) + C_ST REG4,UNIT(4)(a0) + C_ST REG5,UNIT(5)(a0) + C_ST REG6,UNIT(6)(a0) + C_ST REG7,UNIT(7)(a0) + + C_LD t0,UNIT(8)(a1) + C_LD t1,UNIT(9)(a1) + C_LD REG2,UNIT(10)(a1) + C_LD REG3,UNIT(11)(a1) + C_LD REG4,UNIT(12)(a1) + C_LD REG5,UNIT(13)(a1) + C_LD REG6,UNIT(14)(a1) + C_LD REG7,UNIT(15)(a1) +#ifndef R6_CODE + PREFETCH_FOR_LOAD (5, a1) +#endif + C_ST t0,UNIT(8)(a0) + C_ST t1,UNIT(9)(a0) + C_ST REG2,UNIT(10)(a0) + C_ST REG3,UNIT(11)(a0) + C_ST REG4,UNIT(12)(a0) + C_ST REG5,UNIT(13)(a0) + C_ST REG6,UNIT(14)(a0) + C_ST REG7,UNIT(15)(a0) + PTR_ADDIU a0,a0,UNIT(16) /* adding 64/128 to dest */ + bne a0,a3,L(loop16w) + PTR_ADDIU a1,a1,UNIT(16) /* adding 64/128 to src */ + move a2,t8 + +/* Here we have src and dest word-aligned but less than 64-bytes or + * 128 bytes to go. Check for a 32(64) byte chunk and copy if if there + * is one. Otherwise jump down to L(chk1w) to handle the tail end of + * the copy. + */ + +L(chkw): + PREFETCH_FOR_LOAD (0, a1) + andi t8,a2,NSIZEMASK /* Is there a 32-byte/64-byte chunk. */ + /* The t8 is the reminder count past 32-bytes */ + beq a2,t8,L(chk1w) /* When a2=t8, no 32-byte chunk */ + nop + C_LD t0,UNIT(0)(a1) + C_LD t1,UNIT(1)(a1) + C_LD REG2,UNIT(2)(a1) + C_LD REG3,UNIT(3)(a1) + C_LD REG4,UNIT(4)(a1) + C_LD REG5,UNIT(5)(a1) + C_LD REG6,UNIT(6)(a1) + C_LD REG7,UNIT(7)(a1) + PTR_ADDIU a1,a1,UNIT(8) + C_ST t0,UNIT(0)(a0) + C_ST t1,UNIT(1)(a0) + C_ST REG2,UNIT(2)(a0) + C_ST REG3,UNIT(3)(a0) + C_ST REG4,UNIT(4)(a0) + C_ST REG5,UNIT(5)(a0) + C_ST REG6,UNIT(6)(a0) + C_ST REG7,UNIT(7)(a0) + PTR_ADDIU a0,a0,UNIT(8) + +/* + * Here we have less than 32(64) bytes to copy. Set up for a loop to + * copy one word (or double word) at a time. Set a2 to count how many + * bytes we have to copy after all the word (or double word) chunks are + * copied and a3 to the dst pointer after all the (d)word chunks have + * been copied. We will loop, incrementing a0 and a1 until a0 equals a3. + */ +L(chk1w): + andi a2,t8,(NSIZE-1) /* a2 is the reminder past one (d)word chunks */ + beq a2,t8,L(lastw) + PTR_SUBU a3,t8,a2 /* a3 is count of bytes in one (d)word chunks */ + PTR_ADDU a3,a0,a3 /* a3 is the dst address after loop */ + +/* copying in words (4-byte or 8-byte chunks) */ +L(wordCopy_loop): + C_LD REG3,UNIT(0)(a1) + PTR_ADDIU a0,a0,UNIT(1) + PTR_ADDIU a1,a1,UNIT(1) + bne a0,a3,L(wordCopy_loop) + C_ST REG3,UNIT(-1)(a0) + +/* If we have been copying double words, see if we can copy a single word + before doing byte copies. We can have, at most, one word to copy. */ + +L(lastw): +#ifdef USE_DOUBLE + andi t8,a2,3 /* a2 is the remainder past 4 byte chunks. */ + beq t8,a2,L(lastb) + move a2,t8 + lw REG3,0(a1) + sw REG3,0(a0) + PTR_ADDIU a0,a0,4 + PTR_ADDIU a1,a1,4 +#endif + +/* Copy the last 8 (or 16) bytes */ +L(lastb): + blez a2,L(leave) + PTR_ADDU a3,a0,a2 /* a3 is the last dst address */ +L(lastbloop): + lb v1,0(a1) + PTR_ADDIU a0,a0,1 + PTR_ADDIU a1,a1,1 + bne a0,a3,L(lastbloop) + sb v1,-1(a0) +L(leave): + j ra + nop + +/* We jump here with a memcpy of less than 8 or 16 bytes, depending on + whether or not USE_DOUBLE is defined. Instead of just doing byte + copies, check the alignment and size and use lw/sw if possible. + Otherwise, do byte copies. */ + +L(lasts): + andi t8,a2,3 + beq t8,a2,L(lastb) + + andi t9,a0,3 + bne t9,zero,L(lastb) + andi t9,a1,3 + bne t9,zero,L(lastb) + + PTR_SUBU a3,a2,t8 + PTR_ADDU a3,a0,a3 + +L(wcopy_loop): + lw REG3,0(a1) + PTR_ADDIU a0,a0,4 + PTR_ADDIU a1,a1,4 + bne a0,a3,L(wcopy_loop) + sw REG3,-4(a0) + + b L(lastb) + move a2,t8 + +#ifndef R6_CODE +/* + * UNALIGNED case, got here with a3 = "negu a0" + * This code is nearly identical to the aligned code above + * but only the destination (not the source) gets aligned + * so we need to do partial loads of the source followed + * by normal stores to the destination (once we have aligned + * the destination). + */ + +L(unaligned): + andi a3,a3,(NSIZE-1) /* copy a3 bytes to align a0/a1 */ + beqz a3,L(ua_chk16w) /* if a3=0, it is already aligned */ + PTR_SUBU a2,a2,a3 /* a2 is the remining bytes count */ + + C_LDHI v1,UNIT(0)(a1) + C_LDLO v1,UNITM1(1)(a1) + PTR_ADDU a1,a1,a3 + C_STHI v1,UNIT(0)(a0) + PTR_ADDU a0,a0,a3 + +/* + * Now the destination (but not the source) is aligned + * Set a2 to count how many bytes we have to copy after all the 64/128 byte + * chunks are copied and a3 to the dst pointer after all the 64/128 byte + * chunks have been copied. We will loop, incrementing a0 and a1 until a0 + * equals a3. + */ + +L(ua_chk16w): + andi t8,a2,NSIZEDMASK /* any whole 64-byte/128-byte chunks? */ + beq a2,t8,L(ua_chkw) /* if a2==t8, no 64-byte/128-byte chunks */ + PTR_SUBU a3,a2,t8 /* subtract from a2 the reminder */ + PTR_ADDU a3,a0,a3 /* Now a3 is the final dst after loop */ + +# if defined(USE_PREFETCH) && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + PTR_ADDU t0,a0,a2 /* t0 is the "past the end" address */ + PTR_SUBU t9,t0,PREFETCH_LIMIT /* t9 is the "last safe pref" address */ +# endif + PREFETCH_FOR_LOAD (0, a1) + PREFETCH_FOR_LOAD (1, a1) + PREFETCH_FOR_LOAD (2, a1) +# if defined(USE_PREFETCH) && (PREFETCH_STORE_HINT != PREFETCH_HINT_PREPAREFORSTORE) + PREFETCH_FOR_STORE (1, a0) + PREFETCH_FOR_STORE (2, a0) + PREFETCH_FOR_STORE (3, a0) +# endif +# if defined(RETURN_FIRST_PREFETCH) && defined(USE_PREFETCH) +# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + sltu v1,t9,a0 + bgtz v1,L(ua_skip_set) + nop + PTR_ADDIU v0,a0,(PREFETCH_CHUNK*4) +L(ua_skip_set): +# else + PTR_ADDIU v0,a0,(PREFETCH_CHUNK*1) +# endif +# endif +L(ua_loop16w): + PREFETCH_FOR_LOAD (3, a1) + C_LDHI t0,UNIT(0)(a1) + C_LDHI t1,UNIT(1)(a1) + C_LDHI REG2,UNIT(2)(a1) +# if defined(USE_PREFETCH) && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + sltu v1,t9,a0 + bgtz v1,L(ua_skip_pref) +# endif + C_LDHI REG3,UNIT(3)(a1) + PREFETCH_FOR_STORE (4, a0) + PREFETCH_FOR_STORE (5, a0) +L(ua_skip_pref): + C_LDHI REG4,UNIT(4)(a1) + C_LDHI REG5,UNIT(5)(a1) + C_LDHI REG6,UNIT(6)(a1) + C_LDHI REG7,UNIT(7)(a1) + C_LDLO t0,UNITM1(1)(a1) + C_LDLO t1,UNITM1(2)(a1) + C_LDLO REG2,UNITM1(3)(a1) + C_LDLO REG3,UNITM1(4)(a1) + C_LDLO REG4,UNITM1(5)(a1) + C_LDLO REG5,UNITM1(6)(a1) + C_LDLO REG6,UNITM1(7)(a1) + C_LDLO REG7,UNITM1(8)(a1) + PREFETCH_FOR_LOAD (4, a1) + C_ST t0,UNIT(0)(a0) + C_ST t1,UNIT(1)(a0) + C_ST REG2,UNIT(2)(a0) + C_ST REG3,UNIT(3)(a0) + C_ST REG4,UNIT(4)(a0) + C_ST REG5,UNIT(5)(a0) + C_ST REG6,UNIT(6)(a0) + C_ST REG7,UNIT(7)(a0) + C_LDHI t0,UNIT(8)(a1) + C_LDHI t1,UNIT(9)(a1) + C_LDHI REG2,UNIT(10)(a1) + C_LDHI REG3,UNIT(11)(a1) + C_LDHI REG4,UNIT(12)(a1) + C_LDHI REG5,UNIT(13)(a1) + C_LDHI REG6,UNIT(14)(a1) + C_LDHI REG7,UNIT(15)(a1) + C_LDLO t0,UNITM1(9)(a1) + C_LDLO t1,UNITM1(10)(a1) + C_LDLO REG2,UNITM1(11)(a1) + C_LDLO REG3,UNITM1(12)(a1) + C_LDLO REG4,UNITM1(13)(a1) + C_LDLO REG5,UNITM1(14)(a1) + C_LDLO REG6,UNITM1(15)(a1) + C_LDLO REG7,UNITM1(16)(a1) + PREFETCH_FOR_LOAD (5, a1) + C_ST t0,UNIT(8)(a0) + C_ST t1,UNIT(9)(a0) + C_ST REG2,UNIT(10)(a0) + C_ST REG3,UNIT(11)(a0) + C_ST REG4,UNIT(12)(a0) + C_ST REG5,UNIT(13)(a0) + C_ST REG6,UNIT(14)(a0) + C_ST REG7,UNIT(15)(a0) + PTR_ADDIU a0,a0,UNIT(16) /* adding 64/128 to dest */ + bne a0,a3,L(ua_loop16w) + PTR_ADDIU a1,a1,UNIT(16) /* adding 64/128 to src */ + move a2,t8 + +/* Here we have src and dest word-aligned but less than 64-bytes or + * 128 bytes to go. Check for a 32(64) byte chunk and copy if if there + * is one. Otherwise jump down to L(ua_chk1w) to handle the tail end of + * the copy. */ + +L(ua_chkw): + PREFETCH_FOR_LOAD (0, a1) + andi t8,a2,NSIZEMASK /* Is there a 32-byte/64-byte chunk. */ + /* t8 is the reminder count past 32-bytes */ + beq a2,t8,L(ua_chk1w) /* When a2=t8, no 32-byte chunk */ + nop + C_LDHI t0,UNIT(0)(a1) + C_LDHI t1,UNIT(1)(a1) + C_LDHI REG2,UNIT(2)(a1) + C_LDHI REG3,UNIT(3)(a1) + C_LDHI REG4,UNIT(4)(a1) + C_LDHI REG5,UNIT(5)(a1) + C_LDHI REG6,UNIT(6)(a1) + C_LDHI REG7,UNIT(7)(a1) + C_LDLO t0,UNITM1(1)(a1) + C_LDLO t1,UNITM1(2)(a1) + C_LDLO REG2,UNITM1(3)(a1) + C_LDLO REG3,UNITM1(4)(a1) + C_LDLO REG4,UNITM1(5)(a1) + C_LDLO REG5,UNITM1(6)(a1) + C_LDLO REG6,UNITM1(7)(a1) + C_LDLO REG7,UNITM1(8)(a1) + PTR_ADDIU a1,a1,UNIT(8) + C_ST t0,UNIT(0)(a0) + C_ST t1,UNIT(1)(a0) + C_ST REG2,UNIT(2)(a0) + C_ST REG3,UNIT(3)(a0) + C_ST REG4,UNIT(4)(a0) + C_ST REG5,UNIT(5)(a0) + C_ST REG6,UNIT(6)(a0) + C_ST REG7,UNIT(7)(a0) + PTR_ADDIU a0,a0,UNIT(8) +/* + * Here we have less than 32(64) bytes to copy. Set up for a loop to + * copy one word (or double word) at a time. + */ +L(ua_chk1w): + andi a2,t8,(NSIZE-1) /* a2 is the reminder past one (d)word chunks */ + beq a2,t8,L(ua_smallCopy) + PTR_SUBU a3,t8,a2 /* a3 is count of bytes in one (d)word chunks */ + PTR_ADDU a3,a0,a3 /* a3 is the dst address after loop */ + +/* copying in words (4-byte or 8-byte chunks) */ +L(ua_wordCopy_loop): + C_LDHI v1,UNIT(0)(a1) + C_LDLO v1,UNITM1(1)(a1) + PTR_ADDIU a0,a0,UNIT(1) + PTR_ADDIU a1,a1,UNIT(1) + bne a0,a3,L(ua_wordCopy_loop) + C_ST v1,UNIT(-1)(a0) + +/* Copy the last 8 (or 16) bytes */ +L(ua_smallCopy): + beqz a2,L(leave) + PTR_ADDU a3,a0,a2 /* a3 is the last dst address */ +L(ua_smallCopy_loop): + lb v1,0(a1) + PTR_ADDIU a0,a0,1 + PTR_ADDIU a1,a1,1 + bne a0,a3,L(ua_smallCopy_loop) + sb v1,-1(a0) + + j ra + nop + +#else /* R6_CODE */ + +# if __MIPSEB +# define SWAP_REGS(X,Y) X, Y +# define ALIGN_OFFSET(N) (N) +# else +# define SWAP_REGS(X,Y) Y, X +# define ALIGN_OFFSET(N) (NSIZE-N) +# endif +# define R6_UNALIGNED_WORD_COPY(BYTEOFFSET) \ + andi REG7, a2, (NSIZE-1);/* REG7 is # of bytes to by bytes. */ \ + beq REG7, a2, L(lastb); /* Check for bytes to copy by word */ \ + PTR_SUBU a3, a2, REG7; /* a3 is number of bytes to be copied in */ \ + /* (d)word chunks. */ \ + move a2, REG7; /* a2 is # of bytes to copy byte by byte */ \ + /* after word loop is finished. */ \ + PTR_ADDU REG6, a0, a3; /* REG6 is the dst address after loop. */ \ + PTR_SUBU REG2, a1, t8; /* REG2 is the aligned src address. */ \ + PTR_ADDU a1, a1, a3; /* a1 is addr of source after word loop. */ \ + C_LD t0, UNIT(0)(REG2); /* Load first part of source. */ \ +L(r6_ua_wordcopy##BYTEOFFSET): \ + C_LD t1, UNIT(1)(REG2); /* Load second part of source. */ \ + C_ALIGN REG3, SWAP_REGS(t1,t0), ALIGN_OFFSET(BYTEOFFSET); \ + PTR_ADDIU a0, a0, UNIT(1); /* Increment destination pointer. */ \ + PTR_ADDIU REG2, REG2, UNIT(1); /* Increment aligned source pointer.*/ \ + move t0, t1; /* Move second part of source to first. */ \ + bne a0, REG6,L(r6_ua_wordcopy##BYTEOFFSET); \ + C_ST REG3, UNIT(-1)(a0); \ + j L(lastb); \ + nop + + /* We are generating R6 code, the destination is 4 byte aligned and + the source is not 4 byte aligned. t8 is 1, 2, or 3 depending on the + alignment of the source. */ + +L(r6_unaligned1): + R6_UNALIGNED_WORD_COPY(1) +L(r6_unaligned2): + R6_UNALIGNED_WORD_COPY(2) +L(r6_unaligned3): + R6_UNALIGNED_WORD_COPY(3) +# ifdef USE_DOUBLE +L(r6_unaligned4): + R6_UNALIGNED_WORD_COPY(4) +L(r6_unaligned5): + R6_UNALIGNED_WORD_COPY(5) +L(r6_unaligned6): + R6_UNALIGNED_WORD_COPY(6) +L(r6_unaligned7): + R6_UNALIGNED_WORD_COPY(7) +# endif +#endif /* R6_CODE */ + + .set at + .set reorder +END(MEMCPY_NAME) diff --git a/lib/machine/mips/memset.S b/lib/machine/mips/memset.S new file mode 100644 index 0000000..972c57b --- /dev/null +++ b/lib/machine/mips/memset.S @@ -0,0 +1,427 @@ +/* + * Copyright (c) 2013 + * MIPS Technologies, Inc., California. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef ANDROID_CHANGES +# include "machine/asm.h" +# include "machine/regdef.h" +# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE +#elif _LIBC +# include "machine/asm.h" +# include "machine/regdef.h" +# define PREFETCH_STORE_HINT PREFETCH_HINT_PREPAREFORSTORE +#else +# include +# include +#endif + +/* Check to see if the MIPS architecture we are compiling for supports + prefetching. */ + +#if (__mips == 4) || (__mips == 5) || (__mips == 32) || (__mips == 64) +# ifndef DISABLE_PREFETCH +# define USE_PREFETCH +# endif +#endif + +#if defined(_MIPS_SIM) && ((_MIPS_SIM == _ABI64) || (_MIPS_SIM == _ABIN32)) +# ifndef DISABLE_DOUBLE +# define USE_DOUBLE +# endif +#endif + +#ifndef USE_DOUBLE +# ifndef DISABLE_DOUBLE_ALIGN +# define DOUBLE_ALIGN +# endif +#endif + +/* Some asm.h files do not have the L macro definition. */ +#ifndef L +# if _MIPS_SIM == _ABIO32 +# define L(label) $L ## label +# else +# define L(label) .L ## label +# endif +#endif + +/* Some asm.h files do not have the PTR_ADDIU macro definition. */ +#ifndef PTR_ADDIU +# ifdef USE_DOUBLE +# define PTR_ADDIU daddiu +# else +# define PTR_ADDIU addiu +# endif +#endif + +/* New R6 instructions that may not be in asm.h. */ +#ifndef PTR_LSA +# if _MIPS_SIM == _ABI64 +# define PTR_LSA dlsa +# else +# define PTR_LSA lsa +# endif +#endif + +/* Using PREFETCH_HINT_PREPAREFORSTORE instead of PREFETCH_STORE + or PREFETCH_STORE_STREAMED offers a large performance advantage + but PREPAREFORSTORE has some special restrictions to consider. + + Prefetch with the 'prepare for store' hint does not copy a memory + location into the cache, it just allocates a cache line and zeros + it out. This means that if you do not write to the entire cache + line before writing it out to memory some data will get zero'ed out + when the cache line is written back to memory and data will be lost. + + There are ifdef'ed sections of this memcpy to make sure that it does not + do prefetches on cache lines that are not going to be completely written. + This code is only needed and only used when PREFETCH_STORE_HINT is set to + PREFETCH_HINT_PREPAREFORSTORE. This code assumes that cache lines are + less than MAX_PREFETCH_SIZE bytes and if the cache line is larger it will + not work correctly. */ + +#ifdef USE_PREFETCH +# define PREFETCH_HINT_STORE 1 +# define PREFETCH_HINT_STORE_STREAMED 5 +# define PREFETCH_HINT_STORE_RETAINED 7 +# define PREFETCH_HINT_PREPAREFORSTORE 30 + +/* If we have not picked out what hints to use at this point use the + standard load and store prefetch hints. */ +# ifndef PREFETCH_STORE_HINT +# define PREFETCH_STORE_HINT PREFETCH_HINT_STORE +# endif + +/* We double everything when USE_DOUBLE is true so we do 2 prefetches to + get 64 bytes in that case. The assumption is that each individual + prefetch brings in 32 bytes. */ +# ifdef USE_DOUBLE +# define PREFETCH_CHUNK 64 +# define PREFETCH_FOR_STORE(chunk, reg) \ + pref PREFETCH_STORE_HINT, (chunk)*64(reg); \ + pref PREFETCH_STORE_HINT, ((chunk)*64)+32(reg) +# else +# define PREFETCH_CHUNK 32 +# define PREFETCH_FOR_STORE(chunk, reg) \ + pref PREFETCH_STORE_HINT, (chunk)*32(reg) +# endif + +/* MAX_PREFETCH_SIZE is the maximum size of a prefetch, it must not be less + than PREFETCH_CHUNK, the assumed size of each prefetch. If the real size + of a prefetch is greater than MAX_PREFETCH_SIZE and the PREPAREFORSTORE + hint is used, the code will not work correctly. If PREPAREFORSTORE is not + used than MAX_PREFETCH_SIZE does not matter. */ +# define MAX_PREFETCH_SIZE 128 +/* PREFETCH_LIMIT is set based on the fact that we never use an offset greater + than 5 on a STORE prefetch and that a single prefetch can never be larger + than MAX_PREFETCH_SIZE. We add the extra 32 when USE_DOUBLE is set because + we actually do two prefetches in that case, one 32 bytes after the other. */ +# ifdef USE_DOUBLE +# define PREFETCH_LIMIT (5 * PREFETCH_CHUNK) + 32 + MAX_PREFETCH_SIZE +# else +# define PREFETCH_LIMIT (5 * PREFETCH_CHUNK) + MAX_PREFETCH_SIZE +# endif + +# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) \ + && ((PREFETCH_CHUNK * 4) < MAX_PREFETCH_SIZE) +/* We cannot handle this because the initial prefetches may fetch bytes that + are before the buffer being copied. We start copies with an offset + of 4 so avoid this situation when using PREPAREFORSTORE. */ +# error "PREFETCH_CHUNK is too large and/or MAX_PREFETCH_SIZE is too small." +# endif +#else /* USE_PREFETCH not defined */ +# define PREFETCH_FOR_STORE(offset, reg) +#endif + +#if __mips_isa_rev > 5 +# if (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) +# undef PREFETCH_STORE_HINT +# define PREFETCH_STORE_HINT PREFETCH_HINT_STORE_STREAMED +# endif +# define R6_CODE +#endif + +/* Allow the routine to be named something else if desired. */ +#ifndef MEMSET_NAME +# define MEMSET_NAME memset +#endif + +/* We load/store 64 bits at a time when USE_DOUBLE is true. + The C_ prefix stands for CHUNK and is used to avoid macro name + conflicts with system header files. */ + +#ifdef USE_DOUBLE +# define C_ST sd +# if __MIPSEB +# define C_STHI sdl /* high part is left in big-endian */ +# else +# define C_STHI sdr /* high part is right in little-endian */ +# endif +#else +# define C_ST sw +# if __MIPSEB +# define C_STHI swl /* high part is left in big-endian */ +# else +# define C_STHI swr /* high part is right in little-endian */ +# endif +#endif + +/* Bookkeeping values for 32 vs. 64 bit mode. */ +#ifdef USE_DOUBLE +# define NSIZE 8 +# define NSIZEMASK 0x3f +# define NSIZEDMASK 0x7f +#else +# define NSIZE 4 +# define NSIZEMASK 0x1f +# define NSIZEDMASK 0x3f +#endif +#define UNIT(unit) ((unit)*NSIZE) +#define UNITM1(unit) (((unit)*NSIZE)-1) + +#ifdef ANDROID_CHANGES +LEAF(MEMSET_NAME,0) +#else +LEAF(MEMSET_NAME) +#endif + + .set nomips16 + .set noreorder +/* If the size is less than 2*NSIZE (8 or 16), go to L(lastb). Regardless of + size, copy dst pointer to v0 for the return value. */ + slti t2,a2,(2 * NSIZE) + bne t2,zero,L(lastb) + move v0,a0 + +/* If memset value is not zero, we copy it to all the bytes in a 32 or 64 + bit word. */ + beq a1,zero,L(set0) /* If memset value is zero no smear */ + PTR_SUBU a3,zero,a0 + nop + + /* smear byte into 32 or 64 bit word */ +#if ((__mips == 64) || (__mips == 32)) && (__mips_isa_rev >= 2) +# ifdef USE_DOUBLE + dins a1, a1, 8, 8 /* Replicate fill byte into half-word. */ + dins a1, a1, 16, 16 /* Replicate fill byte into word. */ + dins a1, a1, 32, 32 /* Replicate fill byte into dbl word. */ +# else + ins a1, a1, 8, 8 /* Replicate fill byte into half-word. */ + ins a1, a1, 16, 16 /* Replicate fill byte into word. */ +# endif +#else +# ifdef USE_DOUBLE + and a1,0xff + dsll t2,a1,8 + or a1,t2 + dsll t2,a1,16 + or a1,t2 + dsll t2,a1,32 + or a1,t2 +# else + and a1,0xff + sll t2,a1,8 + or a1,t2 + sll t2,a1,16 + or a1,t2 +# endif +#endif + +/* If the destination address is not aligned do a partial store to get it + aligned. If it is already aligned just jump to L(aligned). */ +L(set0): +#ifndef R6_CODE + andi t2,a3,(NSIZE-1) /* word-unaligned address? */ + beq t2,zero,L(aligned) /* t2 is the unalignment count */ + PTR_SUBU a2,a2,t2 + C_STHI a1,0(a0) + PTR_ADDU a0,a0,t2 +#else /* R6_CODE */ + andi t2,a0,(NSIZE-1) + lapc t9,L(atable) + PTR_LSA t9,t2,t9,2 + jrc t9 +L(atable): + bc L(aligned) +# ifdef USE_DOUBLE + bc L(lb7) + bc L(lb6) + bc L(lb5) + bc L(lb4) +# endif + bc L(lb3) + bc L(lb2) + bc L(lb1) +L(lb7): + sb a1,6(a0) +L(lb6): + sb a1,5(a0) +L(lb5): + sb a1,4(a0) +L(lb4): + sb a1,3(a0) +L(lb3): + sb a1,2(a0) +L(lb2): + sb a1,1(a0) +L(lb1): + sb a1,0(a0) + + li t9,NSIZE + subu t2,t9,t2 + PTR_SUBU a2,a2,t2 + PTR_ADDU a0,a0,t2 +#endif /* R6_CODE */ + +L(aligned): +/* If USE_DOUBLE is not set we may still want to align the data on a 16 + byte boundry instead of an 8 byte boundry to maximize the opportunity + of proAptiv chips to do memory bonding (combining two sequential 4 + byte stores into one 8 byte store). We know there are at least 4 bytes + left to store or we would have jumped to L(lastb) earlier in the code. */ +#ifdef DOUBLE_ALIGN + andi t2,a3,4 + beq t2,zero,L(double_aligned) + PTR_SUBU a2,a2,t2 + sw a1,0(a0) + PTR_ADDU a0,a0,t2 +L(double_aligned): +#endif + +/* Now the destination is aligned to (word or double word) aligned address + Set a2 to count how many bytes we have to copy after all the 64/128 byte + chunks are copied and a3 to the dest pointer after all the 64/128 byte + chunks have been copied. We will loop, incrementing a0 until it equals + a3. */ + andi t8,a2,NSIZEDMASK /* any whole 64-byte/128-byte chunks? */ + beq a2,t8,L(chkw) /* if a2==t8, no 64-byte/128-byte chunks */ + PTR_SUBU a3,a2,t8 /* subtract from a2 the reminder */ + PTR_ADDU a3,a0,a3 /* Now a3 is the final dst after loop */ + +/* When in the loop we may prefetch with the 'prepare to store' hint, + in this case the a0+x should not be past the "t0-32" address. This + means: for x=128 the last "safe" a0 address is "t0-160". Alternatively, + for x=64 the last "safe" a0 address is "t0-96" In the current version we + will use "prefetch hint,128(a0)", so "t0-160" is the limit. */ +#if defined(USE_PREFETCH) \ + && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + PTR_ADDU t0,a0,a2 /* t0 is the "past the end" address */ + PTR_SUBU t9,t0,PREFETCH_LIMIT /* t9 is the "last safe pref" address */ +#endif +#if defined(USE_PREFETCH) \ + && (PREFETCH_STORE_HINT != PREFETCH_HINT_PREPAREFORSTORE) + PREFETCH_FOR_STORE (1, a0) + PREFETCH_FOR_STORE (2, a0) + PREFETCH_FOR_STORE (3, a0) +#endif + +L(loop16w): +#if defined(USE_PREFETCH) \ + && (PREFETCH_STORE_HINT == PREFETCH_HINT_PREPAREFORSTORE) + sltu v1,t9,a0 /* If a0 > t9 don't use next prefetch */ + bgtz v1,L(skip_pref) + nop +#endif +#ifndef R6_CODE + PREFETCH_FOR_STORE (4, a0) + PREFETCH_FOR_STORE (5, a0) +#else + PREFETCH_FOR_STORE (2, a0) +#endif +L(skip_pref): + C_ST a1,UNIT(0)(a0) + C_ST a1,UNIT(1)(a0) + C_ST a1,UNIT(2)(a0) + C_ST a1,UNIT(3)(a0) + C_ST a1,UNIT(4)(a0) + C_ST a1,UNIT(5)(a0) + C_ST a1,UNIT(6)(a0) + C_ST a1,UNIT(7)(a0) + C_ST a1,UNIT(8)(a0) + C_ST a1,UNIT(9)(a0) + C_ST a1,UNIT(10)(a0) + C_ST a1,UNIT(11)(a0) + C_ST a1,UNIT(12)(a0) + C_ST a1,UNIT(13)(a0) + C_ST a1,UNIT(14)(a0) + C_ST a1,UNIT(15)(a0) + PTR_ADDIU a0,a0,UNIT(16) /* adding 64/128 to dest */ + bne a0,a3,L(loop16w) + nop + move a2,t8 + +/* Here we have dest word-aligned but less than 64-bytes or 128 bytes to go. + Check for a 32(64) byte chunk and copy if if there is one. Otherwise + jump down to L(chk1w) to handle the tail end of the copy. */ +L(chkw): + andi t8,a2,NSIZEMASK /* is there a 32-byte/64-byte chunk. */ + /* the t8 is the reminder count past 32-bytes */ + beq a2,t8,L(chk1w)/* when a2==t8, no 32-byte chunk */ + nop + C_ST a1,UNIT(0)(a0) + C_ST a1,UNIT(1)(a0) + C_ST a1,UNIT(2)(a0) + C_ST a1,UNIT(3)(a0) + C_ST a1,UNIT(4)(a0) + C_ST a1,UNIT(5)(a0) + C_ST a1,UNIT(6)(a0) + C_ST a1,UNIT(7)(a0) + PTR_ADDIU a0,a0,UNIT(8) + +/* Here we have less than 32(64) bytes to set. Set up for a loop to + copy one word (or double word) at a time. Set a2 to count how many + bytes we have to copy after all the word (or double word) chunks are + copied and a3 to the dest pointer after all the (d)word chunks have + been copied. We will loop, incrementing a0 until a0 equals a3. */ +L(chk1w): + andi a2,t8,(NSIZE-1) /* a2 is the reminder past one (d)word chunks */ + beq a2,t8,L(lastb) + PTR_SUBU a3,t8,a2 /* a3 is count of bytes in one (d)word chunks */ + PTR_ADDU a3,a0,a3 /* a3 is the dst address after loop */ + +/* copying in words (4-byte or 8 byte chunks) */ +L(wordCopy_loop): + PTR_ADDIU a0,a0,UNIT(1) + bne a0,a3,L(wordCopy_loop) + C_ST a1,UNIT(-1)(a0) + +/* Copy the last 8 (or 16) bytes */ +L(lastb): + blez a2,L(leave) + PTR_ADDU a3,a0,a2 /* a3 is the last dst address */ +L(lastbloop): + PTR_ADDIU a0,a0,1 + bne a0,a3,L(lastbloop) + sb a1,-1(a0) +L(leave): + j ra + nop + + .set at + .set reorder +END(MEMSET_NAME) diff --git a/lib/machine/mips/setjmp.S b/lib/machine/mips/setjmp.S new file mode 100644 index 0000000..cfc1d51 --- /dev/null +++ b/lib/machine/mips/setjmp.S @@ -0,0 +1,159 @@ +/* This is a simple version of setjmp and longjmp for MIPS 32 and 64. + + Ian Lance Taylor, Cygnus Support, 13 May 1993. */ + +#ifdef __mips16 +/* This file contains 32 bit assembly code. */ + .set nomips16 +#endif + +#define GPR_LAYOUT \ + GPR_OFFSET ($16, 0); \ + GPR_OFFSET ($17, 1); \ + GPR_OFFSET ($18, 2); \ + GPR_OFFSET ($19, 3); \ + GPR_OFFSET ($20, 4); \ + GPR_OFFSET ($21, 5); \ + GPR_OFFSET ($22, 6); \ + GPR_OFFSET ($23, 7); \ + GPR_OFFSET ($29, 8); \ + GPR_OFFSET ($30, 9); \ + GPR_OFFSET ($31, 10) + +#define NUM_GPRS_SAVED 11 + +#ifdef __mips_hard_float +#if _MIPS_SIM == _ABIN32 +#define FPR_LAYOUT \ + FPR_OFFSET ($f20, 0); \ + FPR_OFFSET ($f22, 1); \ + FPR_OFFSET ($f24, 2); \ + FPR_OFFSET ($f26, 3); \ + FPR_OFFSET ($f28, 4); \ + FPR_OFFSET ($f30, 5); +#elif _MIPS_SIM == _ABI64 +#define FPR_LAYOUT \ + FPR_OFFSET ($f24, 0); \ + FPR_OFFSET ($f25, 1); \ + FPR_OFFSET ($f26, 2); \ + FPR_OFFSET ($f27, 3); \ + FPR_OFFSET ($f28, 4); \ + FPR_OFFSET ($f29, 5); \ + FPR_OFFSET ($f30, 6); \ + FPR_OFFSET ($f31, 7); +#elif __mips_fpr == 0 || __mips_fpr == 64 + +/* This deals with the o32 FPXX and FP64 cases. Here we must use + SDC1 and LDC1 to access the FPRs. These instructions require + 8-byte aligned addresses. + Unfortunately, the MIPS jmp_buf only guarantees 4-byte alignment + and this cannot be increased without breaking compatibility with + pre-existing objects built against newlib. There are 11 GPRS + saved in the jmp_buf so a buffer that happens to be 8-byte aligned + ends up leaving the FPR slots 4-byte aligned and an (only) 4-byte + aligned buffer leads to the FPR slots being 8-byte aligned! + + To resolve this, we move the location of $31 to the last slot + in the jmp_buf when the overall buffer is 8-byte aligned. $31 + is simply loaded/stored twice to avoid adding complexity to the + GPR_LAYOUT macro above as well as FPR_LAYOUT. + + The location of the last slot is index 22 which is calculated + from there being 11 GPRs saved and then 12 FPRs saved so the + index of the last FPR is 11+11. + + The base of the jmp_buf is modified in $4 to allow the + FPR_OFFSET macros to just use the usual constant slot numbers + regardless of whether the realignment happened or not. */ + +#define FPR_LAYOUT \ + and $8, $4, 4; \ + beq $8, $0, 1f; \ + GPR_OFFSET ($31, 22); \ + addiu $4, $4, -4; \ +1: \ + FPR_OFFSET ($f20, 0); \ + FPR_OFFSET ($f22, 2); \ + FPR_OFFSET ($f24, 4); \ + FPR_OFFSET ($f26, 6); \ + FPR_OFFSET ($f28, 8); \ + FPR_OFFSET ($f30, 10); +#else /* Assuming _MIPS_SIM == _ABIO32 */ +#define FPR_LAYOUT \ + FPR_OFFSET ($f20, 0); \ + FPR_OFFSET ($f21, 1); \ + FPR_OFFSET ($f22, 2); \ + FPR_OFFSET ($f23, 3); \ + FPR_OFFSET ($f24, 4); \ + FPR_OFFSET ($f25, 5); \ + FPR_OFFSET ($f26, 6); \ + FPR_OFFSET ($f27, 7); \ + FPR_OFFSET ($f28, 8); \ + FPR_OFFSET ($f29, 9); \ + FPR_OFFSET ($f30, 10); \ + FPR_OFFSET ($f31, 11); +#endif +#else +#define FPR_LAYOUT +#endif + +#ifdef __mips64 +#define BYTES_PER_WORD 8 +#define LOAD_GPR ld +#define LOAD_FPR ldc1 +#define STORE_GPR sd +#define STORE_FPR sdc1 +#else +#define LOAD_GPR lw +#define STORE_GPR sw +#define BYTES_PER_WORD 4 +#if __mips_fpr == 0 || __mips_fpr == 64 +#define LOAD_FPR ldc1 +#define STORE_FPR sdc1 +#else +#define LOAD_FPR lwc1 +#define STORE_FPR swc1 +#endif +#endif + +#define GPOFF(INDEX) (INDEX * BYTES_PER_WORD) +#define FPOFF(INDEX) ((INDEX + NUM_GPRS_SAVED) * BYTES_PER_WORD) + +/* int setjmp (jmp_buf); */ + .globl setjmp + .ent setjmp +setjmp: + .frame $sp,0,$31 + +#define GPR_OFFSET(REG, INDEX) STORE_GPR REG,GPOFF(INDEX)($4) +#define FPR_OFFSET(REG, INDEX) STORE_FPR REG,FPOFF(INDEX)($4) + GPR_LAYOUT + FPR_LAYOUT +#undef GPR_OFFSET +#undef FPR_OFFSET + + move $2,$0 + j $31 + + .end setjmp + +/* volatile void longjmp (jmp_buf, int); */ + .globl longjmp + .ent longjmp +longjmp: + .frame $sp,0,$31 + +#define GPR_OFFSET(REG, INDEX) LOAD_GPR REG,GPOFF(INDEX)($4) +#define FPR_OFFSET(REG, INDEX) LOAD_FPR REG,FPOFF(INDEX)($4) + GPR_LAYOUT + FPR_LAYOUT +#undef GPR_OFFSET +#undef FPR_OFFSET + + bne $5,$0,1f + li $5,1 +1: + move $2,$5 + j $31 + + .end longjmp diff --git a/lib/machine/mips/strcmp.S b/lib/machine/mips/strcmp.S new file mode 100644 index 0000000..9d33a4e --- /dev/null +++ b/lib/machine/mips/strcmp.S @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2014 + * Imagination Technologies Limited. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY IMAGINATION TECHNOLOGIES LIMITED ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL IMAGINATION TECHNOLOGIES LIMITED BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef ANDROID_CHANGES +# include "machine/asm.h" +# include "machine/regdef.h" +#elif _LIBC +# include "machine/asm.h" +# include "machine/regdef.h" +#else +# include +# include +#endif + +/* Technically strcmp should not read past the end of the strings being + compared. We will read a full word that may contain excess bits beyond + the NULL string terminator but unless ENABLE_READAHEAD is set, we will not + read the next word after the end of string. Setting ENABLE_READAHEAD will + improve performance but is technically illegal based on the definition of + strcmp. */ +#ifdef ENABLE_READAHEAD +# define DELAY_READ +#else +# define DELAY_READ nop +#endif + +/* Testing on a little endian machine showed using CLZ was a + performance loss, so we are not turning it on by default. */ +#if defined(ENABLE_CLZ) && (__mips_isa_rev > 1) +# define USE_CLZ +#endif + +/* Some asm.h files do not have the L macro definition. */ +#ifndef L +# if _MIPS_SIM == _ABIO32 +# define L(label) $L ## label +# else +# define L(label) .L ## label +# endif +#endif + +/* Some asm.h files do not have the PTR_ADDIU macro definition. */ +#ifndef PTR_ADDIU +# ifdef USE_DOUBLE +# define PTR_ADDIU daddiu +# else +# define PTR_ADDIU addiu +# endif +#endif + +/* Allow the routine to be named something else if desired. */ +#ifndef STRCMP_NAME +# define STRCMP_NAME strcmp +#endif + +#ifdef ANDROID_CHANGES +LEAF(STRCMP_NAME, 0) +#else +LEAF(STRCMP_NAME) +#endif + .set nomips16 + .set noreorder + + or t0, a0, a1 + andi t0,0x3 + bne t0, zero, L(byteloop) + +/* Both strings are 4 byte aligned at this point. */ + + lui t8, 0x0101 + ori t8, t8, 0x0101 + lui t9, 0x7f7f + ori t9, 0x7f7f + +#define STRCMP32(OFFSET) \ + lw v0, OFFSET(a0); \ + lw v1, OFFSET(a1); \ + subu t0, v0, t8; \ + bne v0, v1, L(worddiff); \ + nor t1, v0, t9; \ + and t0, t0, t1; \ + bne t0, zero, L(returnzero) + +L(wordloop): + STRCMP32(0) + DELAY_READ + STRCMP32(4) + DELAY_READ + STRCMP32(8) + DELAY_READ + STRCMP32(12) + DELAY_READ + STRCMP32(16) + DELAY_READ + STRCMP32(20) + DELAY_READ + STRCMP32(24) + DELAY_READ + STRCMP32(28) + PTR_ADDIU a0, a0, 32 + b L(wordloop) + PTR_ADDIU a1, a1, 32 + +L(returnzero): + j ra + move v0, zero + +L(worddiff): +#ifdef USE_CLZ + subu t0, v0, t8 + nor t1, v0, t9 + and t1, t0, t1 + xor t0, v0, v1 + or t0, t0, t1 +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + wsbh t0, t0 + rotr t0, t0, 16 +# endif + clz t1, t0 + and t1, 0xf8 +# if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + neg t1 + addu t1, 24 +# endif + rotrv v0, v0, t1 + rotrv v1, v1, t1 + and v0, v0, 0xff + and v1, v1, 0xff + j ra + subu v0, v0, v1 +#else /* USE_CLZ */ +# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + andi t0, v0, 0xff + beq t0, zero, L(wexit01) + andi t1, v1, 0xff + bne t0, t1, L(wexit01) + + srl t8, v0, 8 + srl t9, v1, 8 + andi t8, t8, 0xff + beq t8, zero, L(wexit89) + andi t9, t9, 0xff + bne t8, t9, L(wexit89) + + srl t0, v0, 16 + srl t1, v1, 16 + andi t0, t0, 0xff + beq t0, zero, L(wexit01) + andi t1, t1, 0xff + bne t0, t1, L(wexit01) + + srl t8, v0, 24 + srl t9, v1, 24 +# else /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */ + srl t0, v0, 24 + beq t0, zero, L(wexit01) + srl t1, v1, 24 + bne t0, t1, L(wexit01) + + srl t8, v0, 16 + srl t9, v1, 16 + andi t8, t8, 0xff + beq t8, zero, L(wexit89) + andi t9, t9, 0xff + bne t8, t9, L(wexit89) + + srl t0, v0, 8 + srl t1, v1, 8 + andi t0, t0, 0xff + beq t0, zero, L(wexit01) + andi t1, t1, 0xff + bne t0, t1, L(wexit01) + + andi t8, v0, 0xff + andi t9, v1, 0xff +# endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */ + +L(wexit89): + j ra + subu v0, t8, t9 +L(wexit01): + j ra + subu v0, t0, t1 +#endif /* USE_CLZ */ + +/* It might seem better to do the 'beq' instruction between the two 'lbu' + instructions so that the nop is not needed but testing showed that this + code is actually faster (based on glibc strcmp test). */ +#define BYTECMP01(OFFSET) \ + lbu v0, OFFSET(a0); \ + lbu v1, OFFSET(a1); \ + beq v0, zero, L(bexit01); \ + nop; \ + bne v0, v1, L(bexit01) + +#define BYTECMP89(OFFSET) \ + lbu t8, OFFSET(a0); \ + lbu t9, OFFSET(a1); \ + beq t8, zero, L(bexit89); \ + nop; \ + bne t8, t9, L(bexit89) + +L(byteloop): + BYTECMP01(0) + BYTECMP89(1) + BYTECMP01(2) + BYTECMP89(3) + BYTECMP01(4) + BYTECMP89(5) + BYTECMP01(6) + BYTECMP89(7) + PTR_ADDIU a0, a0, 8 + b L(byteloop) + PTR_ADDIU a1, a1, 8 + +L(bexit01): + j ra + subu v0, v0, v1 +L(bexit89): + j ra + subu v0, t8, t9 + + .set at + .set reorder + +END(STRCMP_NAME) diff --git a/lib/machine/mips/strlen.c b/lib/machine/mips/strlen.c new file mode 100644 index 0000000..a87bddd --- /dev/null +++ b/lib/machine/mips/strlen.c @@ -0,0 +1,74 @@ +/* + * strlen.c -- strlen function. On at least some MIPS chips, a simple + * strlen is faster than the 'optimized' C version. + * + * Copyright (c) 2001, 2002 Red Hat, Inc. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include + +/* MIPS16 needs to come first. */ + +#if defined(__mips16) +size_t +strlen (const char *str) +{ + const char *start = str; + + while (*str++ != '\0') + ; + + return str - start - 1; +} +#elif defined(__mips64) +__asm__("" /* 64-bit MIPS targets */ + " .set noreorder\n" + " .set nomacro\n" + " .globl strlen\n" + " .ent strlen\n" + "strlen:\n" + " daddiu $2,$4,1\n" + "\n" + "1: lbu $3,0($4)\n" + " bnez $3,1b\n" + " daddiu $4,$4,1\n" + "\n" + " jr $31\n" + " dsubu $2,$4,$2\n" + " .end strlen\n" + " .set macro\n" + " .set reorder\n"); + +#else +__asm__("" /* 32-bit MIPS targets */ + " .set noreorder\n" + " .set nomacro\n" + " .globl strlen\n" + " .ent strlen\n" + "strlen:\n" + " addiu $2,$4,1\n" + "\n" + "1: lbu $3,0($4)\n" +#if defined(_R3000) + " nop \n" +#endif + " bnez $3,1b\n" + " addiu $4,$4,1\n" + "\n" + " jr $31\n" + " subu $2,$4,$2\n" + " .end strlen\n" + " .set macro\n" + " .set reorder\n"); +#endif diff --git a/lib/machine/mips/strncpy.c b/lib/machine/mips/strncpy.c new file mode 100644 index 0000000..47413cb --- /dev/null +++ b/lib/machine/mips/strncpy.c @@ -0,0 +1,250 @@ +/* + * strncpy.S -- strncmp function. On at least some MIPS chips, you get better + * code by hand unrolling the loops, and by using store words to zero the + * remainder of the buffer than the default newlib C version. + * + * Copyright (c) 2001 Red Hat, Inc. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. */ + +#include +#include +#include +#include + +#if !defined(__GNUC__) || (__GNUC__ < 3) +#define __builtin_expect(a,b) a + +#else +#ifdef __mips64 +/* Don't use limits test for the size of long, in order to allow the use of + 64-bit stores on MIPS3 machines, even if -mlong32 was used. */ +typedef unsigned word_type __attribute__ ((mode (DI))); +#else +typedef unsigned word_type __attribute__ ((mode (SI))); +#endif + +typedef unsigned si_type __attribute__ ((mode (SI))); +typedef unsigned hi_type __attribute__ ((mode (HI))); + +#ifndef UNROLL_FACTOR +#define UNROLL_FACTOR 4 + +#elif (UNROLL_FACTOR != 2) && (UNROLL_FACTOR != 4) +#error "UNROLL_FACTOR must be 2 or 4" +#endif +#endif + +char * +strncpy (char *dst0, const char *src0, size_t count) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) || defined(__mips16) || !defined(__GNUC__) || (__GNUC__ < 3) + char *dst, *end; + const char *src; + int ch; + + dst = dst0; + src = src0; + end = dst + count; + while (dst != end) + { + *dst++ = ch = *src++; + if (__builtin_expect (ch == '\0', 0)) + { + while (dst != end) + *dst++ = '\0'; + + break; + } + } + + return dst0; + +#else + unsigned char *dst; + unsigned char *dst_end; + unsigned char *end; + const unsigned char *src; + int ch0, ch1; +#if UNROLL_FACTOR > 2 + int ch2, ch3; +#endif + int ch; + int odd_bytes; + size_t long_count; + + dst = (unsigned char *)dst0; + src = (unsigned const char *)src0; + /* Take care of any odd bytes in the source data because we + * want to unroll where we read ahead 2 or 4 bytes at a time and then + * check each byte for the null terminator. This can result in + * a segfault for the case where the source pointer is unaligned, + * the null terminator is in valid memory, but reading 2 or 4 bytes at a + * time blindly eventually goes outside of valid memory. */ + while (((uintptr_t) src & (UNROLL_FACTOR - 1)) != 0 && count > 0) + { + *dst++ = ch = *src++; + --count; + if (ch == '\0') + { + end = dst + count; + while (dst != end) + *dst++ = '\0'; + + return dst0; + } + } + + if (__builtin_expect (count >= 4, 1)) + { + odd_bytes = (count & (UNROLL_FACTOR - 1)); + count -= odd_bytes; + + do + { + ch0 = src[0]; + ch1 = src[1]; +#if UNROLL_FACTOR > 2 + ch2 = src[2]; + ch3 = src[3]; +#endif + src += UNROLL_FACTOR; + count -= UNROLL_FACTOR; + + dst[0] = ch0; + if (ch0 == '\0') + goto found_null0; + + dst[1] = ch1; + if (ch1 == '\0') + goto found_null1; + +#if UNROLL_FACTOR > 2 + dst[2] = ch2; + if (ch2 == '\0') + goto found_null2; + + dst[3] = ch3; + if (ch3 == '\0') + goto found_null3; +#endif + + dst += UNROLL_FACTOR; + } + while (count); + + /* fall through, count == 0, no null found, deal with last bytes */ + count = odd_bytes; + } + + end = dst + count; + while (dst != end) + { + *dst++ = ch = *src++; + if (ch == '\0') + { + while (dst != end) + *dst++ = '\0'; + + break; + } + } + + return dst0; + + /* Found null byte in first byte, count has been decremented by 4, null has + been stored in dst[0]. */ + found_null0: + count++; /* add 1 to cover remaining byte */ + dst -= 1; /* adjust dst += 4 gets correct ptr */ + /* fall through */ + + /* Found null byte in second byte, count has been decremented by 4, null has + been stored in dst[1]. */ + found_null1: +#if UNROLL_FACTOR > 2 + count++; /* add 1 to cover remaining byte */ + dst -= 1; /* adjust dst += 4 gets correct ptr */ + /* fall through */ + + /* Found null byte in third byte, count has been decremented by 4, null has + been stored in dst[2]. */ + found_null2: + count++; /* add 1 to cover remaining byte */ + dst -= 1; /* adjust dst += 4 gets correct ptr */ + /* fall through */ + + /* Found null byte in fourth byte, count is accurate, dst has not been + updated yet. */ + found_null3: +#endif + count += odd_bytes; /* restore odd byte count */ + dst += UNROLL_FACTOR; + + /* Zero fill remainder of the array. Unroll the loop, and use word/dword + stores where we can. */ + while (count && (((long)dst) & (sizeof (word_type) - 1)) != 0) + { + count--; + *dst++ = 0; + } + + while (count >= UNROLL_FACTOR*sizeof (word_type)) + { + count -= UNROLL_FACTOR*sizeof (word_type); + dst += UNROLL_FACTOR*sizeof (word_type); +#if UNROLL_FACTOR > 2 + ((word_type *)(void *)dst)[-4] = 0; + ((word_type *)(void *)dst)[-3] = 0; +#endif + ((word_type *)(void *)dst)[-2] = 0; + ((word_type *)(void *)dst)[-1] = 0; + } + +#if UNROLL_FACTOR > 2 + if (count >= 2*sizeof (word_type)) + { + count -= 2*sizeof (word_type); + ((word_type *)(void *)dst)[0] = 0; + ((word_type *)(void *)dst)[1] = 0; + dst += 2*sizeof (word_type); + } +#endif + + if (count >= sizeof (word_type)) + { + count -= sizeof (word_type); + ((word_type *)(void *)dst)[0] = 0; + dst += sizeof (word_type); + } + +#ifdef __mips64 + if (count >= sizeof (si_type)) + { + count -= sizeof (si_type); + ((si_type *)(void *)dst)[0] = 0; + dst += sizeof (si_type); + } +#endif + + if (count >= sizeof (hi_type)) + { + count -= sizeof (hi_type); + ((hi_type *)(void *)dst)[0] = 0; + dst += sizeof (hi_type); + } + + if (count) + *dst = '\0'; + + return dst0; +#endif +} diff --git a/lib/machine/mips/sys/fenv.h b/lib/machine/mips/sys/fenv.h new file mode 100644 index 0000000..282d68c --- /dev/null +++ b/lib/machine/mips/sys/fenv.h @@ -0,0 +1,88 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_FENV_H_ +#define _SYS_FENV_H_ + +#include + +#ifndef __fenv_static +#define __fenv_static static +#endif + +typedef int fenv_t; +typedef int fexcept_t; + +/* Exception flags */ +#ifdef __mips_soft_float +#define _FPUSW_SHIFT 16 +#define FE_INVALID 0x0001 +#define FE_DIVBYZERO 0x0002 +#define FE_OVERFLOW 0x0004 +#define FE_UNDERFLOW 0x0008 +#define FE_INEXACT 0x0010 +#else +#define _FCSR_CAUSE_SHIFT 10 +#define FE_INVALID 0x0040 +#define FE_DIVBYZERO 0x0020 +#define FE_OVERFLOW 0x0010 +#define FE_UNDERFLOW 0x0008 +#define FE_INEXACT 0x0004 +#endif +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +/* Rounding modes */ +#define FE_TONEAREST 0x0000 +#define FE_TOWARDZERO 0x0001 +#define FE_UPWARD 0x0002 +#define FE_DOWNWARD 0x0003 +#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ + FE_UPWARD | FE_TOWARDZERO) + + +/* Default floating-point environment */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV (_fe_dfl_env) + +/* We need to be able to map status flag positions to mask flag positions */ +#define _ENABLE_SHIFT 5 +#define _ENABLE_MASK (FE_ALL_EXCEPT << _ENABLE_SHIFT) + +#if !defined(__mips_soft_float) && !defined(__mips_hard_float) +#error compiler didnt set soft/hard float macros +#endif + +#ifndef __mips_soft_float +#define __cfc1(__fcsr) __asm __volatile("cfc1 %0, $31" : "=r" (__fcsr)) +#define __ctc1(__fcsr) __asm __volatile("ctc1 %0, $31" :: "r" (__fcsr)) +#endif + +#endif /* !_FENV_H_ */ diff --git a/lib/machine/mn10200/Makefile.inc b/lib/machine/mn10200/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/mn10200/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/mn10200/setjmp.S b/lib/machine/mn10200/setjmp.S new file mode 100644 index 0000000..f0036b1 --- /dev/null +++ b/lib/machine/mn10200/setjmp.S @@ -0,0 +1,33 @@ + .file "setjmp.S" + + .section .text + .align 1 + .global _setjmp +_setjmp: + mov d0,a0 + movx d2,(0,a0) + movx d3,(4,a0) + mov a1,(8,a0) + mov a2,(12,a0) + mov a3,(16,a0) + movx (0,a3),d0 + movx d0,(20,a0) + sub d0,d0 + rts + + .global _longjmp +_longjmp: + mov d0,a0 + movx (0,a0),d2 + movx (4,a0),d3 + mov (8,a0),a1 + mov (12,a0),a2 + mov (16,a0),a3 + movx (20,a0),d0 + movx d0,(0,a3) + cmp 0,d1 + bne L1 + mov 1,d1 +L1: + mov d1,d0 + rts diff --git a/lib/machine/mn10300/Makefile.inc b/lib/machine/mn10300/Makefile.inc new file mode 100644 index 0000000..299a388 --- /dev/null +++ b/lib/machine/mn10300/Makefile.inc @@ -0,0 +1,5 @@ +libc_a_CCASFLAGS_%C% = -Wa,--gdwarf-2 + +libc_a_SOURCES += \ + %D%/setjmp.S %D%/memchr.S %D%/memcmp.S %D%/memcpy.S %D%/memset.S %D%/strchr.S \ + %D%/strcmp.S %D%/strcpy.S %D%/strlen.S diff --git a/lib/machine/mn10300/memchr.S b/lib/machine/mn10300/memchr.S new file mode 100644 index 0000000..90b0f46 --- /dev/null +++ b/lib/machine/mn10300/memchr.S @@ -0,0 +1,108 @@ + .file "memchr.S" + + .section .text + .global _memchr + .type _memchr,@function +_memchr: + movm [d2,d3,a2,a3],(sp) +.Lend_of_prologue: + mov d0,a0 + mov d1,d2 + mov (28,sp),a1 +#ifndef __OPTIMIZE_SIZE__ + cmp 3,a1 + bls .L44 + mov a0,d3 + btst 3,d3 + bne .L44 + mov a0,a2 + mov 0,a3 + clr d1 + setlb + mov a3,d0 + asl 8,d0 + mov d2,a3 + add d0,a3 + inc d1 + cmp 3,d1 + lls + cmp 3,a1 + bls .L48 +.L33: + mov (a2),d0 + mov a3,d3 + xor d3,d0 + mov d0,d1 + not d1 + add -16843009,d0 + and d1,d0 + btst -2139062144,d0 + beq .L34 + mov a2,a0 + clr d1 + setlb + movbu (a0),d0 + cmp d2,d0 + beq .Lepilogue + inc a0 + inc d1 + cmp 3,d1 + lls +.L34: + add -4,a1 + inc4 a2 + cmp 3,a1 + bhi .L33 +.L48: + mov a2,a0 +.L44: +#endif + cmp 0,a1 + beq .L50 + setlb + movbu (a0),d0 + cmp d2,d0 + beq .Lepilogue + inc a0 + sub 1,a1 + lne +.L50: + mov 0,a0 +.Lepilogue: + ret [d2,d3,a2,a3],16 +.Lend_of_memchr: + .size _memchr, .Lend_of_memchr - _memchr + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _memchr # FDE initial location + .4byte .Lend_of_memchr - _memchr # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _memchr + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/memcmp.S b/lib/machine/mn10300/memcmp.S new file mode 100644 index 0000000..e272c54 --- /dev/null +++ b/lib/machine/mn10300/memcmp.S @@ -0,0 +1,85 @@ + .file "memcmp.S" + + .section .text + .global _memcmp + .type _memcmp,@function +_memcmp: + movm [d2,d3,a2,a3],(sp) +.Lend_of_prologue: + mov d0,a0 + mov d1,a1 + mov (28,sp),a2 +#ifndef __OPTIMIZE_SIZE__ + cmp 3,a2 + bls .L22 + mov a1,d2 + or d2,d0 + btst 3,d0 + bne .L22 + setlb + mov (a0),d1 + mov (a1),d0 + cmp d0,d1 + bne .L22 + inc4 a0 + inc4 a1 + add -4,a2 + cmp 3,a2 + lhi +.L22: +#endif + cmp 0,a2 + beq .L24 + setlb + movbu (a0),d3 + movbu (a1),d2 + cmp d2,d3 + beq .L23 + mov d3,d0 + sub d2,d0 + jmp .Lepilogue +.L23: + inc a0 + inc a1 + sub 1,a2 + lne +.L24: + clr d0 +.Lepilogue: + ret [d2,d3,a2,a3],16 +.Lend_of_func: + .size _memcmp, .Lend_of_func - _memcmp + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _memcmp # FDE initial location + .4byte .Lend_of_func - _memcmp # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _memcmp + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/memcpy.S b/lib/machine/mn10300/memcpy.S new file mode 100644 index 0000000..8f2ab08 --- /dev/null +++ b/lib/machine/mn10300/memcpy.S @@ -0,0 +1,101 @@ + .file "memcpy.S" + + .section .text + .global _memcpy + .type _memcpy,@function +_memcpy: + movm [d2,d3,a2,a3],(sp) +.Lend_of_prologue: + mov d0,d2 + mov d1,a0 + mov d2,a1 + mov (28,sp),d1 +#ifndef __OPTIMIZE_SIZE__ + mov a0,d0 + or d2,d0 + btst 3,d0 + bne .L37 + cmp 15,d1 + bls .L34 + setlb + mov (a0),d0 + mov d0,(a1) + inc4 a0 + inc4 a1 + mov (a0),d0 + mov d0,(a1) + inc4 a0 + inc4 a1 + mov (a0),d0 + mov d0,(a1) + inc4 a0 + inc4 a1 + mov (a0),d0 + mov d0,(a1) + inc4 a0 + inc4 a1 + add -16,d1 + cmp 15,d1 + lhi +.L34: + cmp 3,d1 + bls .L37 + setlb + mov (a0),d0 + mov d0,(a1) + inc4 a0 + inc4 a1 + add -4,d1 + cmp 3,d1 + lhi +.L37: +#endif + cmp 0,d1 + beq .L36 + setlb + movbu (a0),d0 + movbu d0,(a1) + inc a0 + inc a1 + sub 1,d1 + lne +.L36: + mov d2,a0 +.Lepilogue: + ret [d2,d3,a2,a3],16 +.Lend_of_memcpy: + .size _memcpy, .Lend_of_memcpy - _memcpy + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _memcpy # FDE initial location + .4byte .Lend_of_memcpy - _memcpy # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _memcpy + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/memset.S b/lib/machine/mn10300/memset.S new file mode 100644 index 0000000..a927a5e --- /dev/null +++ b/lib/machine/mn10300/memset.S @@ -0,0 +1,95 @@ + .file "memset.S" + + .section .text + .global _memset + .type _memset,@function +_memset: + movm [d2,d3,a2,a3], (sp) +.Lend_of_prologue: + mov d0, d3 + mov d1, d2 + mov (28, sp),a1 + mov d3, a0 +#ifndef __OPTIMIZE_SIZE__ + cmp 3, a1 + bls .L41 + btst 3, d3 + bne .L41 + extbu d2 + mov d2, d1 + asl 8, d1 + or d2, d1 + mov d1, d0 + asl 16, d0 + or d0, d1 + cmp 15, a1 + bls .L36 + setlb + mov d1, (a0) + inc4 a0 + mov d1, (a0) + inc4 a0 + mov d1, (a0) + inc4 a0 + mov d1, (a0) + inc4 a0 + add -16, a1 + cmp 15, a1 + lhi +.L36: + cmp 3, a1 + bls .L41 + setlb + mov d1, (a0) + inc4 a0 + add -4, a1 + cmp 3, a1 + lhi +.L41: +#endif + cmp 0, a1 + beq .Lepilogue + setlb + movbu d2, (a0) + inc a0 + sub 1, a1 + lne +.Lepilogue: + mov d3,a0 + ret [d2,d3,a2,a3], 16 +.Lend_of_memset: + .size _memset, .Lend_of_memset - _memset + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _memset # FDE initial location + .4byte .Lend_of_memset - _memset # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _memset + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/setjmp.S b/lib/machine/mn10300/setjmp.S new file mode 100644 index 0000000..1444449 --- /dev/null +++ b/lib/machine/mn10300/setjmp.S @@ -0,0 +1,92 @@ + .file "setjmp.S" + + .section .text + .align 1 + .global _setjmp +#ifdef __AM33__ +#ifdef __AM33_2__ + .am33_2 +#else + .am33 +#endif +#endif +_setjmp: + mov d0,a0 + mov d2,(0,a0) + mov d3,(4,a0) + mov mdr,d1 + mov d1,(8,a0) + mov a2,(12,a0) + mov a3,(16,a0) + mov sp,a1 + mov a1,(20,a0) +#ifdef __AM33__ + add 24,a0 + mov r4,(a0+) + mov r5,(a0+) + mov r6,(a0+) + mov r7,(a0+) +#ifdef __AM33_2__ + fmov fs4,(a0+) + fmov fs5,(a0+) + fmov fs6,(a0+) + fmov fs7,(a0+) + fmov fs8,(a0+) + fmov fs9,(a0+) + fmov fs10,(a0+) + fmov fs11,(a0+) + fmov fs12,(a0+) + fmov fs13,(a0+) + fmov fs14,(a0+) + fmov fs15,(a0+) + fmov fs16,(a0+) + fmov fs17,(a0+) + fmov fs18,(a0+) + fmov fs19,(a0+) +#endif +#endif + sub d0,d0 + rets + + .global _longjmp +_longjmp: + mov d0,a0 + mov (8,a0),d2 + mov d2,mdr + mov (0,a0),d2 + mov (4,a0),d3 + mov (12,a0),a2 + mov (16,a0),a3 + mov (20,a0),a1 + mov a1,sp +#ifdef __AM33__ + add 24,a0 + mov (a0+),r4 + mov (a0+),r5 + mov (a0+),r6 + mov (a0+),r7 +#ifdef __AM33_2__ + fmov (a0+),fs4 + fmov (a0+),fs5 + fmov (a0+),fs6 + fmov (a0+),fs7 + fmov (a0+),fs8 + fmov (a0+),fs9 + fmov (a0+),fs10 + fmov (a0+),fs11 + fmov (a0+),fs12 + fmov (a0+),fs13 + fmov (a0+),fs14 + fmov (a0+),fs15 + fmov (a0+),fs16 + fmov (a0+),fs17 + fmov (a0+),fs18 + fmov (a0+),fs19 +#endif +#endif + cmp 0,d1 + bne L1 + mov 1,d1 +L1: + mov d1,d0 + retf [],0 diff --git a/lib/machine/mn10300/strchr.S b/lib/machine/mn10300/strchr.S new file mode 100644 index 0000000..21d9dc1 --- /dev/null +++ b/lib/machine/mn10300/strchr.S @@ -0,0 +1,121 @@ + .file "strchr.S" + + .section .text + .global _strchr + .type _strchr,@function +_strchr: + movm [d2,d3,a2,a3],(sp) + add -12,sp +.Lend_of_prologue: + mov d0,a1 + movbu d1,(7,sp) +#ifndef __OPTIMIZE_SIZE__ + btst 3,d0 + bne .L20 + clr d0 + setlb + mov sp,a2 + mov d0,d3 + add d3,a2 + mov a2,a0 + add 12,a0 + movbu (7,sp),d3 + movbu d3,(-4,a0) + inc d0 + cmp 3,d0 + lls + mov a1,a0 + mov -16843009,a1 + mov (a0),d2 + mov a1,d1 + add d2,d1 + mov d2,d0 + not d0 + and d0,d1 + mov -2139062144,d3 + mov d3,(0,sp) + btst -2139062144,d1 + bne .L27 + jmp .L38 +.L28: + inc4 a0 + mov (a0),d2 + mov a1,d1 + add d2,d1 + mov d2,d0 + not d0 + and d0,d1 + mov (0,sp),d3 + and d3,d1 + bne .L27 +.L38: + mov (8,sp),d0 + xor d2,d0 + mov a1,d1 + add d0,d1 + not d0 + and d0,d1 + and d3,d1 + beq .L28 +.L27: + mov a0,a1 +.L20: +#endif + movbu (a1),d0 + cmp 0,d0 + beq .L32 + movbu (7,sp),d1 + setlb + cmp d1,d0 + beq .L36 + inc a1 + movbu (a1),d0 + cmp 0,d0 + lne +.L32: + movbu (7,sp),d0 + movbu (a1),d3 + cmp d0,d3 + beq .L36 + mov 0,a0 + jmp .Lepilogue +.L36: + mov a1,a0 +.Lepilogue: + ret [d2,d3,a2,a3],28 +.Lend_of_strchr: + .size _strchr, .Lend_of_strchr - _strchr + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _strchr # FDE initial location + .4byte .Lend_of_strchr - _strchr # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _strchr + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/strcmp.S b/lib/machine/mn10300/strcmp.S new file mode 100644 index 0000000..c9c245b --- /dev/null +++ b/lib/machine/mn10300/strcmp.S @@ -0,0 +1,88 @@ + .file "strcmp.S" + + .section .text + .global _strcmp + .type _strcmp,@function +_strcmp: + movm [d2,d3,a2,a3],(sp) +.Lend_of_prologue: + mov d0,a0 + mov d1,a1 +#ifndef __OPTIMIZE_SIZE__ + or d1,d0 + btst 3,d0 + bne .L11 + mov (a0),d1 + mov (a1),d0 + cmp d0,d1 + bne .L11 + mov -16843009,d3 + setlb + mov (a0),d0 + mov d3,d1 + add d0,d1 + not d0 + and d0,d1 + and -2139062144,d1 + beq .L6 + clr d0 + jmp .Lepilogue +.L6: + inc4 a0 + inc4 a1 + mov (a0),d1 + mov (a1),d0 + cmp d0,d1 + leq +.L11: +#endif + setlb + movbu (a1),d2 + movbu (a0),d0 + cmp 0,d0 + beq .L9 + cmp d2,d0 + bne .L9 + inc a0 + inc a1 + lra +.L9: + sub d2,d0 +.Lepilogue: + ret [d2,d3,a2,a3],16 +.Lend_of_strcmp: + .size _strcmp, .Lend_of_strcmp - _strcmp + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _strcmp # FDE initial location + .4byte .Lend_of_strcmp - _strcmp # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _strcmp + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/strcpy.S b/lib/machine/mn10300/strcpy.S new file mode 100644 index 0000000..8afb0e0 --- /dev/null +++ b/lib/machine/mn10300/strcpy.S @@ -0,0 +1,85 @@ + .file "strcpy.S" + + .section .text + .global _strcpy + .type _strcpy,@function +_strcpy: + movm [d2,d3,a2,a3],(sp) +.Lend_of_prologue: + mov d0,d3 + mov d1,a0 + mov d3,a1 + mov a0,d0 +#ifndef __OPTIMIZE_SIZE__ + or d3,d0 + btst 3,d0 + bne .L2 + mov (a0),d0 + mov -16843009,a2 + mov a2,d1 + add d0,d1 + not d0 + and d0,d1 + mov -2139062144,d2 + btst -2139062144,d1 + bne .L2 + setlb + mov (a0),d0 + mov d0,(a1) + inc4 a0 + inc4 a1 + mov (a0),d0 + mov a2,d1 + add d0,d1 + not d0 + and d0,d1 + and d2,d1 + leq +.L2: +#endif + setlb + movbu (a0),d0 + movbu d0,(a1) + inc a0 + inc a1 + cmp 0,d0 + lne + mov d3,a0 +.Lepilogue: + ret [d2,d3,a2,a3],16 +.Lend_of_strcpy: + .size _strcpy, .Lend_of_strcpy - _strcpy + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _strcpy # FDE initial location + .4byte .Lend_of_strcpy - _strcpy # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _strcpy + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/mn10300/strlen.S b/lib/machine/mn10300/strlen.S new file mode 100644 index 0000000..62cc972 --- /dev/null +++ b/lib/machine/mn10300/strlen.S @@ -0,0 +1,79 @@ + .file "strlen.S" + + .section .text + .global _strlen + .type _strlen,@function +_strlen: + movm [d2,d3,a2,a3],(sp) +.Lend_of_prologue: + mov d0,a0 + mov a0,a2 +#ifndef __OPTIMIZE_SIZE__ + btst 3,d0 + bne .L21 + mov (a0),d0 + mov -16843009,a1 + mov a1,d1 + add d0,d1 + not d0 + and d0,d1 + mov -2139062144,d2 + btst -2139062144,d1 + bne .L21 + setlb + inc4 a0 + mov (a0),d0 + mov a1,d1 + add d0,d1 + not d0 + and d0,d1 + and d2,d1 + leq + jmp .L21 +#endif +.L19: + inc a0 +.L21: + movbu (a0),d3 + cmp 0,d3 + bne .L19 + sub a2,a0 + mov a0,d0 +.Lepilogue: + ret [d2,d3,a2,a3],16 +.Lend_of_strlen: + .size _strlen, .Lend_of_strlen - _strlen + + .section .debug_frame,"",@progbits +.Lstart_of_debug_frame: + # Common Information Entry (CIE) + .4byte .Lend_of_CIE - .Lstart_of_CIE # CIE Length +.Lstart_of_CIE: + .4byte 0xffffffff # CIE Identifier Tag + .byte 0x1 # CIE Version + .ascii "\0" # CIE Augmentation + .uleb128 0x1 # CIE Code Alignment Factor + .sleb128 -4 # CIE Data Alignment Factor + .byte 0x32 # CIE RA Column + .byte 0xc # DW_CFA_def_cfa + .uleb128 0x9 + .uleb128 0x0 + .byte 0xb2 # DW_CFA_offset, column 0x32 + .uleb128 0x0 + .align 2 +.Lend_of_CIE: + + # Frame Description Entry (FDE) + .4byte .Lend_of_FDE - .Lstart_of_FDE # FDE Length +.Lstart_of_FDE: + .4byte .Lstart_of_debug_frame # FDE CIE offset + .4byte _strlen # FDE initial location + .4byte .Lend_of_strlen - _strlen # FDE address range + .byte 0x4 # DW_CFA_advance_loc4 + .4byte .Lend_of_prologue - _strlen + .byte 0xe # DW_CFA_def_cfa_offset + .uleb128 0x4 + .byte 0x87 # DW_CFA_offset, column 0x7 + .uleb128 0x1 + .align 2 +.Lend_of_FDE: diff --git a/lib/machine/moxie/Makefile.inc b/lib/machine/moxie/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/moxie/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/moxie/setjmp.S b/lib/machine/moxie/setjmp.S new file mode 100644 index 0000000..014368d --- /dev/null +++ b/lib/machine/moxie/setjmp.S @@ -0,0 +1,76 @@ +/* A setjmp.c for Moxie + Copyright (C) 2009, 2019 Anthony Green + + The authors hereby grant permission to use, copy, modify, distribute, + and license this software and its documentation for any purpose, provided + that existing copyright notices are retained in all copies and that this + notice is included verbatim in any distributions. No written agreement, + license, or royalty fee is required for any of the authorized uses. + Modifications to this software may be copyrighted by their authors + and need not follow the licensing terms described here, provided that + the new terms are clearly indicated on the first page of each file where + they apply. */ + +# setjmp/longjmp for moxie. The jmpbuf looks like this: +# +# Register jmpbuf offset +# $r6 0x00 +# $r7 0x04 +# $r8 0x08 +# $r9 0x0c +# $r10 0x10 +# $fp 0x14 +# $sp 0x18 +# stack frame fp 0x1c +# stack frame ra 0x20 +# stack frame sc 0x25 + + .text + .global setjmp + .type setjmp,@function +setjmp: + st.l ($r0), $r6 + sto.l 0x04($r0), $r7 + sto.l 0x08($r0), $r8 + sto.l 0x0c($r0), $r9 + sto.l 0x10($r0), $r10 + sto.l 0x14($r0), $sp + sto.l 0x18($r0), $fp + ldo.l $r1, 0x00($fp) + sto.l 0x1c($r0), $r1 + ldo.l $r1, 0x04($fp) + sto.l 0x20($r0), $r1 + ldo.l $r1, 0x08($fp) + sto.l 0x24($r0), $r1 + xor $r0, $r0 + ret +.Lend1: + .size setjmp,.Lend1-setjmp + + .global longjmp + .type longjmp,@function +longjmp: + ldo.l $r6, 0x00($r0) + ldo.l $r7, 0x04($r0) + ldo.l $r8, 0x08($r0) + ldo.l $r9, 0x0c($r0) + ldo.l $r10, 0x10($r0) + ldo.l $sp, 0x14($r0) + ldo.l $fp, 0x18($r0) + ldo.l $r2, 0x1c($r0) + sto.l 0x0($fp), $r2 + ldo.l $r2, 0x20($r0) + sto.l 0x4($fp), $r2 + ldo.l $r2, 0x24($r0) + sto.l 0x8($fp), $r2 + ldo.l $r2, 0x08($r0) + mov $r0, $r1 + xor $r2, $r2 + cmp $r0, $r2 + beq .Lreturn1 + ret +.Lreturn1: + inc $r0, 1 + ret +.Lend2: + .size longjmp,.Lend2-longjmp diff --git a/lib/machine/msp430/Makefile.inc b/lib/machine/msp430/Makefile.inc new file mode 100644 index 0000000..0571a60 --- /dev/null +++ b/lib/machine/msp430/Makefile.inc @@ -0,0 +1,8 @@ +libc_a_SOURCES += %D%/setjmp.S + +## tiny-printf.c and tiny-puts.c are derived from the nano printf/puts +## functions, so other supporting nano functions are required, and the tiny +## printf/puts will not work without them. +if NEWLIB_NANO_FORMATTED_IO +libc_a_SOURCES += %D%/tiny-puts.c %D%/tiny-printf.c +endif diff --git a/lib/machine/msp430/setjmp.S b/lib/machine/msp430/setjmp.S new file mode 100644 index 0000000..f3deefa --- /dev/null +++ b/lib/machine/msp430/setjmp.S @@ -0,0 +1,107 @@ +/* Copyright (c) 2013 Red Hat, Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the BSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. Any Red Hat trademarks that are + incorporated in the source code or documentation are not subject to + the BSD License and may only be used or replicated with the express + permission of Red Hat, Inc. +*/ + +# setjmp/longjmp for msp430. The jmpbuf looks like this: +# +# Register Jmpbuf offset +# small large +# r0 (pc) 0x00 0x00 +# r1 (sp) 0x02 0x04 +# r4 0x04 0x08 +# r5 0x06 0x0c +# r6 0x08 0x10 +# r7 0x0a 0x14 +# r8 0x0c 0x18 +# r9 0x0e 0x1c +# r10 0x10 0x20 + + .text + .global setjmp +setjmp: + ; Upon entry r12 points to the jump buffer. + ; Returns 0 to caller. + +#if defined __MSP430X_LARGE__ + mova @r1, r13 + mova r13, 0(r12) + mova r1, 4(r12) + mova r4, 8(r12) + mova r5, 12(r12) + mova r6, 16(r12) + mova r7, 20(r12) + mova r8, 24(r12) + mova r9, 28(r12) + mova r10, 32(r12) + clr r12 + reta +#else + ;; Get the return address off the stack + mov.w @r1, r13 + mov.w r13, 0(r12) + mov.w r1, 2(r12) + mov.w r4, 4(r12) + mov.w r5, 6(r12) + mov.w r6, 8(r12) + mov.w r7, 10(r12) + mov.w r8, 12(r12) + mov.w r9, 14(r12) + mov.w r10, 16(r12) + clr r12 + ret +#endif + .size setjmp , . - setjmp + + + .global longjmp +longjmp: + ; Upon entry r12 points to the jump buffer and + ; r13 contains the value to be returned by setjmp. + +#if defined __MSP430X_LARGE__ + mova @r12+, r14 + mova @r12+, r1 + mova @r12+, r4 + mova @r12+, r5 + mova @r12+, r6 + mova @r12+, r7 + mova @r12+, r8 + mova @r12+, r9 + mova @r12+, r10 +#else + mov.w @r12+, r14 + mov.w @r12+, r1 + mov.w @r12+, r4 + mov.w @r12+, r5 + mov.w @r12+, r6 + mov.w @r12+, r7 + mov.w @r12+, r8 + mov.w @r12+, r9 + mov.w @r12+, r10 +#endif + ; If caller attempts to return 0, return 1 instead. + cmp.w #0, r13 + jne .Lnot_zero + mov.w #1, r13 +.Lnot_zero: + mov.w r13, r12 + +#if defined __MSP430X_LARGE__ + adda #4, r1 + mova r14, r0 +#else + add.w #2, r1 + mov.w r14, r0 +#endif + .size longjmp , . - longjmp + diff --git a/lib/machine/msp430/tiny-printf.c b/lib/machine/msp430/tiny-printf.c new file mode 100644 index 0000000..f2412a0 --- /dev/null +++ b/lib/machine/msp430/tiny-printf.c @@ -0,0 +1,272 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +/*static char *sccsid = "from: @(#)vfprintf.c 5.50 (Berkeley) 12/16/92";*/ +static char *rcsid = "$Id$"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../stdio/local.h" +#include "../../stdlib/local.h" +#include "../../stdio/fvwrite.h" +#include "../../stdio/nano-vfprintf_local.h" + +/* Bypass *putc* fns called by the default _sfputs_r to save code size. + Among other things, this means there is no buffering of the string before + it is sent to <>, but <> does its own buffering so we won't + lose chars when buf is larger than sizeof(CIOBUF). */ +int +__tiny__sfputs_r (struct _reent *ptr, + FILE *fp, + const char *buf, + size_t len) +{ + return write (1, buf, len); +} + +/* VFPRINTF_R from nano-vfprintf.c but: + - No support for reentrancy + - No support for streams + - __SINGLE_THREAD__ assumed. + - No STRING_ONLY variant (either way the formatted string would end up + being sent to <> via <<__tiny__sfputs_r>>. + Basically, format the string as normal, and send it to write. */ +int +__tiny_vfprintf_r (struct _reent *data, + FILE * fp, + const char *fmt0, + va_list ap) +{ + register char *fmt; /* Format string. */ + register int n, m; /* Handy integers (short term usage). */ + register char *cp; /* Handy char pointer (short term usage). */ + const char *flag_chars; + struct _prt_data_t prt_data; /* All data for decoding format string. */ + va_list ap_copy; + + /* Output function pointer. */ + int (*pfunc)(struct _reent *, FILE *, const char *, size_t len); + + pfunc = __tiny__sfputs_r; + + fmt = (char *)fmt0; + prt_data.ret = 0; + prt_data.blank = ' '; + prt_data.zero = '0'; + + /* GCC PR 14577 at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 */ + va_copy (ap_copy, ap); + + /* Scan the format for conversions (`%' character). */ + for (;;) + { + cp = fmt; + while (*fmt != '\0' && *fmt != '%') + fmt += 1; + + if ((m = fmt - cp) != 0) + { + PRINT (cp, m); + prt_data.ret += m; + } + if (*fmt == '\0') + goto done; + + fmt++; /* Skip over '%'. */ + + prt_data.flags = 0; + prt_data.width = 0; + prt_data.prec = -1; + prt_data.dprec = 0; + prt_data.l_buf[0] = '\0'; +#ifdef FLOATING_POINT + prt_data.lead = 0; +#endif + /* The flags. */ + /* + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flag_chars = "#-0+ "; + for (; cp = memchr (flag_chars, *fmt, 5); fmt++) + prt_data.flags |= (1 << (cp - flag_chars)); + + if (prt_data.flags & SPACESGN) + prt_data.l_buf[0] = ' '; + + /* + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (prt_data.flags & PLUSSGN) + prt_data.l_buf[0] = '+'; + + /* The width. */ + if (*fmt == '*') + { + /* + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + prt_data.width = GET_ARG (n, ap_copy, int); + if (prt_data.width < 0) + { + prt_data.width = -prt_data.width; + prt_data.flags |= LADJUST; + } + fmt++; + } + else + { + for (; is_digit (*fmt); fmt++) + prt_data.width = 10 * prt_data.width + to_digit (*fmt); + } + + /* The precision. */ + if (*fmt == '.') + { + fmt++; + if (*fmt == '*') + { + fmt++; + prt_data.prec = GET_ARG (n, ap_copy, int); + if (prt_data.prec < 0) + prt_data.prec = -1; + } + else + { + prt_data.prec = 0; + for (; is_digit (*fmt); fmt++) + prt_data.prec = 10 * prt_data.prec + to_digit (*fmt); + } + } + + /* The length modifiers. */ + flag_chars = "hlL"; + if ((cp = memchr (flag_chars, *fmt, 3)) != NULL) + { + prt_data.flags |= (SHORTINT << (cp - flag_chars)); + fmt++; + } + + /* The conversion specifiers. */ + prt_data.code = *fmt++; + cp = memchr ("efgEFG", prt_data.code, 6); +#ifdef FLOATING_POINT + /* If cp is not NULL, we are facing FLOATING POINT NUMBER. */ + if (cp) + { + /* Consume floating point argument if _printf_float is not + linked. */ + if (_printf_float == NULL) + { + if (prt_data.flags & LONGDBL) + GET_ARG (N, ap_copy, _LONG_DOUBLE); + else + GET_ARG (N, ap_copy, double); + } + else + n = _printf_float (data, &prt_data, fp, pfunc, &ap_copy); + } + else +#endif + n = _printf_i (data, &prt_data, fp, pfunc, &ap_copy); + + if (n == -1) + goto error; + + prt_data.ret += n; + } +done: +error: + va_end (ap_copy); + return (__sferror (fp) ? EOF : prt_data.ret); +} + +int +__wrap_printf (const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + struct _reent *ptr = _REENT; + + va_start (ap, fmt); + ret = __tiny_vfprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} + +int printf (const char *__restrict fmt, ...) __attribute__ ((weak, alias ("__wrap_printf"))); diff --git a/lib/machine/msp430/tiny-puts.c b/lib/machine/msp430/tiny-puts.c new file mode 100644 index 0000000..6a59f23 --- /dev/null +++ b/lib/machine/msp430/tiny-puts.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +int write (int fd, const char *buf, int len); + +int +__wrap_puts (const char * s) +{ + int res = write (1, s, strlen (s)); + if (res == EOF) + { + write (1, "\n", 1); + return EOF; + } + return write (1, "\n", 1); +} + +int puts (const char * s) __attribute__ ((weak, alias ("__wrap_puts"))); diff --git a/lib/machine/mt/Makefile.inc b/lib/machine/mt/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/mt/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/mt/setjmp.S b/lib/machine/mt/setjmp.S new file mode 100644 index 0000000..e93bd33 --- /dev/null +++ b/lib/machine/mt/setjmp.S @@ -0,0 +1,99 @@ +# setjmp/longjmp for mt. +# +# The jmpbuf looks like this: +# +# Register jmpbuf offset +# R0 --- -- +# R1 0x4 4 +# R2 0x8 8 +# R3 0xc 12 +# R4 0x10 16 +# R5 0x14 20 +# R6 0x18 24 +# R7 0x1c 28 +# R8 0x20 32 +# R9 ---- -- +# R10 ---- -- +# R11 0x2c 44 +# R12 0x30 48 +# R13 0x34 52 +# R14 0x38 56 +# R15 0x3c 60 +# +# R1 contains the pointer to jmpbuf + .text + .global setjmp + .type setjmp ,@function +setjmp: + + stw r1, r1, #4 + or r0, r0, r0 + stw r2, r1, #8 + or r0, r0, r0 + stw r3, r1, #12 + or r0, r0, r0 + stw r4, r1, #16 + or r0, r0, r0 + stw r5, r1, #20 + or r0, r0, r0 + stw r6, r1, #24 + or r0, r0, r0 + stw r7, r1, #28 + or r0, r0, r0 + stw r8, r1, #32 + or r0, r0, r0 + stw r11, r1, #44 + or r0, r0, r0 + stw r12, r1, #48 + or r0, r0, r0 + stw r13, r1, #52 + or r0, r0, r0 + stw r14, r1, #56 + or r0, r0, r0 + stw r15, r1, #60 + + jal r0, r14 + addi r11, r0, #0 +.Lend1: + .size setjmp,.Lend1-setjmp + + .global longjmp + .type longjmp,@function +longjmp: + or r9, r1, r1 + or r11, r2, r2 + ldw r1, r1, #4 + or r0, r0, r0 + ldw r2, r1, #8 + or r0, r0, r0 + ldw r3, r1, #12 + or r0, r0, r0 + ldw r4, r1, #16 + or r0, r0, r0 + ldw r5, r1, #20 + or r0, r0, r0 + ldw r6, r1, #24 + or r0, r0, r0 + ldw r7, r1, #28 + or r0, r0, r0 + ldw r8, r1, #32 + or r0, r0, r0 + + + ldw r12, r1, #48 + or r0, r0, r0 + ldw r13, r1, #52 + or r0, r0, r0 + ldw r14, r1, #56 + or r0, r0, r0 + ldw r15, r1, #60 + + brne r0, r11, .L01 + or r0, r0, r0 + + addi r11, r0, #1 +.L01: + jal r0, r14 + or r0, r0, r0 +.Lend2: + .size longjmp,.Lend2-longjmp2 diff --git a/lib/machine/nds32/Makefile.inc b/lib/machine/nds32/Makefile.inc new file mode 100644 index 0000000..b0fdfa0 --- /dev/null +++ b/lib/machine/nds32/Makefile.inc @@ -0,0 +1,8 @@ +libc_a_SOURCES += \ + %D%/abort.c \ + %D%/setjmp.S \ + %D%/strcmp.S \ + %D%/strcpy.S +if !IS_NDS32_ISA_V3M +libc_a_SOURCES += %D%/memcpy.S %D%/memset.S +endif diff --git a/lib/machine/nds32/abort.c b/lib/machine/nds32/abort.c new file mode 100644 index 0000000..5fa0b6e --- /dev/null +++ b/lib/machine/nds32/abort.c @@ -0,0 +1,38 @@ +/* +FUNCTION +<>---abnormal termination of a program + +INDEX + abort + +SYNOPSIS + #include + void abort(void); + +DESCRIPTION +Use <> to signal that your program has detected a condition it +cannot deal with. Normally, <> ends your program's execution. + +In general implementation, <> raises the exception <>. +But for nds32 target, currently it is not necessary for MCU platform. +We can just call <<_exit>> to terminate program. + +RETURNS +<> does not return to its caller. + +PORTABILITY +ANSI C requires <>. + +Supporting OS subroutines required: <<_exit>>. +*/ + +#include + +void +abort (void) +{ + while (1) + { + _exit (1); + } +} diff --git a/lib/machine/nds32/acinclude.m4 b/lib/machine/nds32/acinclude.m4 new file mode 100644 index 0000000..ae8ea5d --- /dev/null +++ b/lib/machine/nds32/acinclude.m4 @@ -0,0 +1,11 @@ +if test "${machine_dir}" = "nds32"; then + dnl Use builtin macro to detect if this is for "AndeStar ISA V3m". + AC_CACHE_CHECK([for nds32 V3M ISA], newlib_cv_nds32_isa_v3m, [dnl + AC_PREPROC_IFELSE([AC_LANG_PROGRAM( +[[#ifdef __NDS32_ISA_V3M__ +# error "This is nds32_isa_v3m." +#endif +]])], [newlib_cv_nds32_isa_v3m="no"], [newlib_cv_nds32_isa_v3m="yes"])]) +fi + +AM_CONDITIONAL(IS_NDS32_ISA_V3M, test "$newlib_cv_nds32_isa_v3m" = "yes") diff --git a/lib/machine/nds32/memcpy.S b/lib/machine/nds32/memcpy.S new file mode 100644 index 0000000..f27858c --- /dev/null +++ b/lib/machine/nds32/memcpy.S @@ -0,0 +1,77 @@ +/* +Copyright (c) 2013 Andes Technology Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Function: + memcpy - copy memory regions + Syntax: + void *memcpy(void *s1, const void *s2, size_t n); + Description: + The memcpy function copies n characters from the object pointed to + by s2 into the object pointed to by s1. If copying takes place + between objects that overlap, the behavior is undeï¬ned. + Return value: + The memcpy function returns the value of s1. +*/ + .text + .align 2 + .globl memcpy + .type memcpy, @function +memcpy: + /* Corner cases. If *s1 equals *s2 + or size_t is zero, just go return. */ + beq $r0, $r1, .Lend_memcpy + beqz $r2, .Lend_memcpy + + /* Keep *s1 as return value. + Set $r3 as how many words to copy. + Set $r2 as how many bytes are less than a word. */ + move $r5, $r0 + srli $r3, $r2, 2 + andi $r2, $r2, 3 + beqz $r3, .Lbyte_copy + +.Lword_copy: + /* Do the word copy $r3 times. Then, do the byte copy $r2 times. */ + lmw.bim $r4, [$r1], $r4, 0 + addi $r3, $r3, -1 + smw.bim $r4, [$r5], $r4, 0 + bnez $r3, .Lword_copy /* Loop again ? */ + beqz $r2, .Lend_memcpy /* Fall THRU or go return ? */ + +.Lbyte_copy: + /* Do the byte copy $r2 times. */ + lbi.bi $r4, [$r1], 1 + addi $r2, $r2, -1 + sbi.bi $r4, [$r5], 1 + bnez $r2, .Lbyte_copy /* Loop again ? */ + +.Lend_memcpy: + ret + .size memcpy, .-memcpy diff --git a/lib/machine/nds32/memset.S b/lib/machine/nds32/memset.S new file mode 100644 index 0000000..51e5ff2 --- /dev/null +++ b/lib/machine/nds32/memset.S @@ -0,0 +1,80 @@ +/* +Copyright (c) 2013 Andes Technology Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Function: + memset - fill memory with a constant byte + Syntax: + void *memset(void *s, int c, size_t n); + Description: + The memset function copies the value of c (converted to an unsigned char) + into each of the first n characters of the object pointed to by s. + Return value: + The memset function returns the value of s. +*/ + .text + .align 2 + .globl memset + .type memset, @function +memset: + /* Corner case. If n is zero, just go return. */ + beqz $r2, .Lend_memset + + /* Keep $r0 as return value. + Set $r4 as how many words to copy. + Set $r2 as how many bytes are less than a word. */ + move $r5, $r0 + srli $r4, $r2, 2 + andi $r2, $r2, 3 + beqz $r4, .Lbyte_set + + /* Set $r1 a word-size pattern composed of the value of c + (converted to an unsigned char). Convert ??????ab to abababab. */ + andi $r1, $r1, 0xff /* Set $r1 = 000000ab. */ + slli $r3, $r1, 8 /* Set $r3 = 0000ab00. */ + or $r1, $r1, $r3 /* Set $r1 = 0000abab. */ + slli $r3, $r1, 16 /* Set $r3 = abab0000. */ + or $r1, $r1, $r3 /* Set $r1 = abababab. */ + +.Lword_set: + /* Do the word set $r4 times. Then, do the byte set $r2 times. */ + addi $r4, $r4, -1 + smw.bim $r1, [$r5], $r1 /* Set a word-size. */ + bnez $r4, .Lword_set /* Loop again ? */ + beqz $r2, .Lend_memset /* Fall THRU or go return ? */ + +.Lbyte_set: + /* Do the byte set $r2 times. */ + addi $r2, $r2, -1 + sbi.p $r1, [$r5], 1 /* Set a byte-size. */ + bnez $r2, .Lbyte_set /* Loop again ? */ + +.Lend_memset: + ret + .size memset, .-memset diff --git a/lib/machine/nds32/setjmp.S b/lib/machine/nds32/setjmp.S new file mode 100644 index 0000000..7197c86 --- /dev/null +++ b/lib/machine/nds32/setjmp.S @@ -0,0 +1,166 @@ +/* +Copyright (c) 2013 Andes Technology Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +The setjmp/longjmp for nds32. +The usage of thirty-two 32-bit General Purpose Registers (GPR): + $r28 : $fp + $r29 : $gp + $r30 : $lp + $r31 : $sp + + caller-save registers: $r0 ~ $r5, $r16 ~ $r23 + callee-save registers: $r6 ~ $r10, $r11 ~ $r14 + reserved for assembler : $r15 + reserved for other use : $r24, $r25, $r26, $r27 + +Save all callee-save registers and $fp, $gp, $lp and $sp is enough in theory. +For debugging issue, the layout of jum_buf in here should be in sync with GDB. +The $r16 ~ $r19 are used to store D0/D1, keep them for backward-compatible. +*/ + +/* int setjmp(jmp_buf env); */ + .text + .align 2 + .global setjmp + .type setjmp, @function +setjmp: +#if __NDS32_REDUCED_REGS__ + smw.bim $r6, [$r0], $r10, #0b0000 + addi $r0, $r0, #32 /* Leave room to keep jum_buf all the same. */ + smw.bim $r31, [$r0], $r31, #0b1111 +#else + smw.bim $r6, [$r0], $r14, #0b0000 + smw.bim $r16, [$r0], $r19, #0b1111 +#endif + +#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__ + + /* Extract $fpcfg.freg (b[3:2]), then save into jmp_buf. */ + fmfcfg $r2 + slli $r2, $r2, #28 + srli $r2, $r2, #30 + swi.bi $r2, [$r0], #4 + + /* Make sure $r0 is double-word-aligned. */ + addi $r0, $r0, #7 + bitci $r0, $r0, #7 + + /* Case switch according to $fpcfg.freg */ + beqz $r2, .LCFG0_save /* Branch if $fpcfg.freg = 0b00. */ + xori $r15, $r2, #0b10 + beqz $r15, .LCFG2_save /* Branch $fpcfg.freg = 0b10. */ + srli $r2, $r2, #0b01 + beqz $r2, .LCFG1_save /* Branch if $fpcfg.freg = 0b01. */ + /* Fall-through if $fpcfg.freg = 0b11. */ +.LCFG3_save: + fsdi.bi $fd31, [$r0], #8 + fsdi.bi $fd29, [$r0], #8 + fsdi.bi $fd27, [$r0], #8 + fsdi.bi $fd25, [$r0], #8 + fsdi.bi $fd23, [$r0], #8 + fsdi.bi $fd21, [$r0], #8 + fsdi.bi $fd19, [$r0], #8 + fsdi.bi $fd17, [$r0], #8 +.LCFG2_save: + fsdi.bi $fd15, [$r0], #8 + fsdi.bi $fd13, [$r0], #8 + fsdi.bi $fd11, [$r0], #8 + fsdi.bi $fd9, [$r0], #8 +.LCFG1_save: + fsdi.bi $fd7, [$r0], #8 + fsdi.bi $fd5, [$r0], #8 +.LCFG0_save: + fsdi.bi $fd3, [$r0], #8 +#endif + + /* Set return value to zero. */ + movi $r0, 0 + ret + .size setjmp, .-setjmp + + +/* void longjmp(jmp_buf env, int val); */ + .text + .align 2 + .global longjmp + .type longjmp, @function +longjmp: +#if __NDS32_REDUCED_REGS__ + lmw.bim $r6, [$r0], $r10, #0b0000 + addi $r0, $r0, #32 + lmw.bim $r31, [$r0], $r31, #0b1111 +#else + lmw.bim $r6, [$r0], $r14, #0b0000 + lmw.bim $r16, [$r0], $r19, #0b1111 +#endif + +#if __NDS32_EXT_FPU_SP__ || __NDS32_EXT_FPU_DP__ + + /* Restore value of $fpcfg.freg (b[3:2]). */ + lwi.bi $r2, [$r0], #4 + + /* Make sure $r0 is double-word-aligned. */ + addi $r0, $r0, #7 + bitci $r0, $r0, #7 + + /* Case switch according to $fpcfg.freg */ + beqz $r2, .LCFG0_restore /* Branch if $fpcfg.freg = 0b00. */ + xori $r15, $r2, #0b10 + beqz $r15, .LCFG2_restore /* Branch $fpcfg.freg = 0b10. */ + srli $r2, $r2, #0b01 + beqz $r2, .LCFG1_restore /* Branch if $fpcfg.freg = 0b01. */ + /* Fall-through if $fpcfg.freg = 0b11. */ +.LCFG3_restore: + fldi.bi $fd31, [$r0], #8 + fldi.bi $fd29, [$r0], #8 + fldi.bi $fd27, [$r0], #8 + fldi.bi $fd25, [$r0], #8 + fldi.bi $fd23, [$r0], #8 + fldi.bi $fd21, [$r0], #8 + fldi.bi $fd19, [$r0], #8 + fldi.bi $fd17, [$r0], #8 +.LCFG2_restore: + fldi.bi $fd15, [$r0], #8 + fldi.bi $fd13, [$r0], #8 + fldi.bi $fd11, [$r0], #8 + fldi.bi $fd9, [$r0], #8 +.LCFG1_restore: + fldi.bi $fd7, [$r0], #8 + fldi.bi $fd5, [$r0], #8 +.LCFG0_restore: + fldi.bi $fd3, [$r0], #8 +#endif + + /* Set val as return value. If the value val is 0, 1 will be returned + instead. */ + movi $r0, 1 + cmovn $r0, $r1, $r1 /* r0=(r1!=0)? r1: r0 */ + ret + .size longjmp, .-longjmp diff --git a/lib/machine/nds32/strcmp.S b/lib/machine/nds32/strcmp.S new file mode 100644 index 0000000..f3f37fb --- /dev/null +++ b/lib/machine/nds32/strcmp.S @@ -0,0 +1,96 @@ +/* +Copyright (c) 2013 Andes Technology Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Function: + strcmp - compare two strings. + Syntax: + int strcmp(const char *s1, const char *s2); + Description: + This function compares the two strings s1 and s2. It returns an + integer less than, equal to, or greater than zero if s1 is found, + respectively, to be less than, to match, or be greater than s2. + Return value: + strcmp returns an integer less than, equal to, or greater than + zero if s1 (or the first n bytes thereof) is found, respectively, + to be less than, to match, or be greater than s2. +*/ + .text + .align 2 + .globl strcmp + .type strcmp, @function +strcmp: + /* If s1 or s2 are unaligned, then compare bytes. */ + or $r5, $r1, $r0 + andi $r5, $r5, #3 + bnez $r5, .Lbyte_mode + + /* If s1 and s2 are word-aligned, compare them a word at a time. */ + lwi $r5, [$r0+(0)] + lwi $r3, [$r1+(0)] + bne $r5, $r3, .Lbyte_mode /* A difference was detected, so + search bytewise. */ + + /* It's more efficient to set bit mask outside the word_mode loop. */ + sethi $r4, hi20(0xFEFEFEFF) /* Set $r4 as -0x01010101. */ + ori $r4, $r4, lo12(0xFEFEFEFF) + sethi $r2, hi20(0x80808080) + ori $r2, $r2, lo12(0x80808080) + b .Ldetect_null + +.align 2 +.Lword_mode: + lmw.aim $r5, [$r0], $r5 + lmw.aim $r3, [$r1], $r3 + bne $r5, $r3, .Lbyte_mode + +.Ldetect_null: + /* #define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) + DETECTNULL returns nonzero if (long)X contains a NULL byte. */ + nor $r3, $r5, $r5 /* r3 = ~(X) */ + add $r5, $r5, $r4 /* r2 = ((X) - 0x01010101) */ + and $r5, $r5, $r3 /* r2 = ~(X) & ((X) - 0x01010101) */ + and $r5, $r5, $r2 /* r2= r2 & 0x80808080 */ + beqz $r5, .Lword_mode /* No NULL byte, compare next word. */ + + /* To get here, *a1 == *a2, thus if we find a null in *a1, + then the strings must be equal, so return zero. */ + movi $r0, #0 + ret + +.Lbyte_mode: + /* Byte-mode compare. */ + lbi.bi $r5, [$r0], #1 + lbi.bi $r3, [$r1], #1 + bne $r5, $r3, 1f /* Mismatch, done. */ + bnez $r5, .Lbyte_mode +1: + sub $r0, $r5, $r3 + ret + .size strcmp, .-strcmp diff --git a/lib/machine/nds32/strcpy.S b/lib/machine/nds32/strcpy.S new file mode 100644 index 0000000..6d94396 --- /dev/null +++ b/lib/machine/nds32/strcpy.S @@ -0,0 +1,76 @@ +/* +Copyright (c) 2013 Andes Technology Corporation. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + Function: + strcpy - copy a string. + Syntax: + char *strcpy(char *dest, const char *src); + Description: + This function copies the string pointed to by src into the array + point to by dest (include the teminating null character). + Return value: + strcpy returns the dest as given. +*/ + .text + .align 2 + .globl strcpy + .type strcpy, @function +strcpy: + move $r3, $r0 /* Keep r0 as reture value. */ + /* If SRC or DEST is unaligned, then copy bytes. */ + or $r2, $r1, $r0 + andi $r2, $r2, #3 + bnez $r2, .Lbyte_mode + +.Lword_mode: + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + /* #define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) + DETECTNULL returns nonzero if (long)X contains a NULL byte. */ + lwi $r2, [$r1+(0)] /* r2 is X */ + sethi $r4, hi20(0xFEFEFEFF) + ori $r4, $r4, lo12(0xFEFEFEFF) + add $r4, $r2, $r4 /* r4 = ((X) - 0x01010101) */ + nor $r5, $r2, $r2 /* r5 = ~(X) */ + and $r4, $r5, $r4 /* r4 = ~(X) & ((X) - 0x01010101) */ + sethi $r5, hi20(0x80808080) + ori $r5, $r5, lo12(0x80808080) + and $r4, $r4, $r5 /* r4 = r4 & 0x80808080 */ + bnez $r4, .Lbyte_mode /* Contains a NULL byte. */ + swi.bi $r2, [$r3], #4 + addi $r1, $r1, #4 + b .Lword_mode + +.Lbyte_mode: + lbi.bi $r4, [$r1], #1 /* r4 <- *src++ */ + sbi.bi $r4, [$r3], #1 /* r4 -> *dest++ */ + bnez $r4, .Lbyte_mode + ret + .size strcpy, .-strcpy diff --git a/lib/machine/necv70/Makefile.inc b/lib/machine/necv70/Makefile.inc new file mode 100644 index 0000000..c9cb8f1 --- /dev/null +++ b/lib/machine/necv70/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/fastmath.S %D%/setjmp.S diff --git a/lib/machine/necv70/fastmath.S b/lib/machine/necv70/fastmath.S new file mode 100644 index 0000000..bccb20f --- /dev/null +++ b/lib/machine/necv70/fastmath.S @@ -0,0 +1,251 @@ + .globl _fast_sin +_fast_sin: + fsin.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_sinf +_fast_sinf: + fsin.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_cos +_fast_cos: + fcos.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_cosf +_fast_cosf: + fcos.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_tan +_fast_tan: + ftan.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_tanf +_fast_tanf: + ftan.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + + .globl _fast_fabs +_fast_fabs: + fabs.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_fabsf +_fast_fabsf: + fabs.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_sqrt +_fast_sqrt: + fsqrt.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_sqrtf +_fast_sqrtf: + fsqrt.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_acos +_fast_acos: + facos.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_acosf +_fast_acosf: + facos.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_asin +_fast_asin: + fasin.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_asinf +_fast_asinf: + fasin.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_atan +_fast_atan: + fatan.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_atanf +_fast_atanf: + fatan.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_cosh +_fast_cosh: + fcosh.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_coshf +_fast_coshf: + fcosh.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_sinh +_fast_sinh: + fsin.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_sinhf +_fast_sinhf: + fsin.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_tanh +_fast_tanh: + ftanh.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_tanhf +_fast_tanhf: + ftanh.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_atanh +_fast_atanh: + fatanh.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_atanhf +_fast_atanhf: + fatanh.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + .globl _fast_exp2 +_fast_exp2: + fexp2.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_exp2f +_fast_exp2f: + fexp2.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_exp10 +_fast_exp10: + fexp10.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_exp10f +_fast_exp10f: + fexp10.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_expe +_fast_expe: + fexpe.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_expef +_fast_expef: + fexpe.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_log2 +_fast_log2: + flog2.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_log2f +_fast_log2f: + flog2.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + .globl _fast_log10 +_fast_log10: + flog10.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_log10f +_fast_log10f: + flog10.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + + .globl _fast_loge +_fast_loge: + floge.l [ap],[ap] + mov.d [ap],r0 + ret #0 + + + .globl _fast_logef +_fast_logef: + floge.s [ap],[ap] + mov.w [ap],r0 + ret #0 + + diff --git a/lib/machine/necv70/machine/registers.h b/lib/machine/necv70/machine/registers.h new file mode 100644 index 0000000..9f02ed3 --- /dev/null +++ b/lib/machine/necv70/machine/registers.h @@ -0,0 +1,14 @@ + + +typedef struct +{ + int fp_rounding:2; /* fp rounding control */ + int integer_rounding:1; /* integer rounding */ + int rfu:1; /* reserved */ + int fp_trap:5; /* floating point trap bits */ + int otm:1; + int rfu2:3; + int att:3; + int rfu3:16; +} v60_tkcw_type; + diff --git a/lib/machine/necv70/necv70.tex b/lib/machine/necv70/necv70.tex new file mode 100644 index 0000000..c7858c2 --- /dev/null +++ b/lib/machine/necv70/necv70.tex @@ -0,0 +1,99 @@ +@node machine,,syscalls,Top +@chapter NEC V70 Specific Functions + +The NEC V70 has machine instructions for fast IEEE floating-point +arithmetic, including operations normally provided by the library. + +When you use the @file{/usr/include/fastmath.h} header file, the +names of several library math functions are redefined to call the +@code{fastmath} routine (using the corresponding V70 machine instructions) +whenever possible. + +For example, +@example + +#include + +double sqsin(x) +double x; +@{ + return sin(x*x); +@} + +@end example +expands into the code +@example + +@dots{} +double sqsin(x) +double x; +@{ + return fast_sin(x*x); +@} + +@end example + +The library has an entry @code{fast_sin} which uses the machine +instruction @code{fsin.l} to perform the operation. Note that the +built-in instructions cannot set @code{errno} +in the same way that the C coded functions do. Refer to a V70 +instruction manual to see how errors are generated and handled. + +Also, the library provides true @code{float} entry points. The +@code{fast_sinf} entry point really performs a @code{fsin.s} +operation. Because of this, the instructions are only useful when +using code compiled with an ANSI C compiler. The prototypes +and definitions for the floating-point versions of the math library +routines are only defined if compiling a module with an ANSI C +compiler. + +@page +@section Entry points +The functions provided by @file{fastmath.h} are +@example + + double fast_sin(double); /* fsin.l */ + double fast_cos(double); /* fcos.l */ + double fast_tan(double); /* ftan.l */ + double fast_asin(double); /* fasin.l */ + double fast_acos(double); /* facos.l */ + double fast_atan(double); /* fatan.l */ + double fast_sinh(double); /* fsinh.l */ + double fast_cosh(double); /* fcosh.l */ + double fast_tanh(double); /* ftanh.l */ + double fast_asinh(double); /* fasinh.l */ + double fast_acosh(double); /* facosh.l */ + double fast_atanh(double); /* fatanh.l */ + double fast_fabs(double); /* fabs.l */ + double fast_sqrt(double); /* fsqrt.l */ + double fast_exp2(double); /* fexp2.l */ + double fast_exp10(double); /* fexp10.l */ + double fast_expe(double); /* fexpe.l */ + double fast_log10(double); /* flog10.l */ + double fast_log2(double); /* flog2.l */ + double fast_loge(double); /* floge.l */ + + float fast_sinf(float); /* fsin.s */ + float fast_cosf(float); /* fcos.s */ + float fast_tanf(float); /* ftan.s */ + float fast_asinf(float); /* fasin.s */ + float fast_acosf(float); /* facos.s */ + float fast_atanf(float); /* fatan.s */ + float fast_sinhf(float); /* fsinh.s */ + float fast_coshf(float); /* fcosh.s */ + float fast_tanhf(float); /* ftanh.s */ + float fast_asinhf(float); /* fasinh.s */ + float fast_acoshf(float); /* facosh.s */ + float fast_atanhf(float); /* fatanh.s */ + float fast_fabsf(float); /* fabs.s */ + float fast_sqrtf(float); /* fsqrt.s */ + float fast_exp2f(float); /* fexp2.s */ + float fast_exp10f(float); /* fexp10.s */ + float fast_expef(float); /* fexpe.s */ + float fast_log10f(float); /* flog10.s */ + float fast_log2f(float); /* flog2.s */ + float fast_logef(float); /* floge.s */ + +@end example + + diff --git a/lib/machine/necv70/setjmp.S b/lib/machine/necv70/setjmp.S new file mode 100644 index 0000000..d8aca1d --- /dev/null +++ b/lib/machine/necv70/setjmp.S @@ -0,0 +1,33 @@ + .globl _setjmp +_setjmp: + mov.w [ap],r0 + mov.d r15,[r0+] + mov.d r17,[r0+] + mov.d r19,[r0+] + mov.d r21,[r0+] + mov.d r23,[r0+] + mov.w -0x4[ap],[r0+] + mov.w fp,[r0+] + mov.w ap,[r0+] + mov.w -0x8[ap],[r0] + xor.w r0,r0 + ret #0x0 + + .globl _longjmp +_longjmp: + mov.w 0x4[ap],r0 + mov.w [ap],r1 + mov.d [r1+],r15 + mov.d [r1+],r17 + mov.d [r1+],r19 + mov.d [r1+],r21 + mov.d [r1+],r23 + mov.d [r1+],ap + mov.w [r1+],sp + test.w r0 + jne noz + mov.w #0x1,r0 +noz: jmp [0x0[r1]] + + + diff --git a/lib/machine/nios2/Makefile.inc b/lib/machine/nios2/Makefile.inc new file mode 100644 index 0000000..3b3f2dc --- /dev/null +++ b/lib/machine/nios2/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.s diff --git a/lib/machine/nvptx/Makefile.inc b/lib/machine/nvptx/Makefile.inc new file mode 100644 index 0000000..9dc50dc --- /dev/null +++ b/lib/machine/nvptx/Makefile.inc @@ -0,0 +1,5 @@ +libc_a_SOURCES += \ + %D%/_exit.c \ + %D%/calloc.c %D%/callocr.c %D%/malloc.c %D%/mallocr.c %D%/realloc.c %D%/reallocr.c \ + %D%/free.c %D%/write.c %D%/assert.c %D%/puts.c %D%/putchar.c %D%/printf.c %D%/abort.c \ + %D%/misc.c %D%/clock.c diff --git a/lib/machine/nvptx/_exit.c b/lib/machine/nvptx/_exit.c new file mode 100644 index 0000000..f2253df --- /dev/null +++ b/lib/machine/nvptx/_exit.c @@ -0,0 +1,41 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include + +/* Sadly, PTX doesn't support weak declarations, only weak + definitions. Weakly define it here in case we're not using crt0 + (for instance in offloading). You probably shouldn't be calling + 'exit' in an offloaded region anyway, but that'd be a runtime + error, not a link error. */ +int *__attribute((weak)) __exitval_ptr; + +void __attribute__((noreturn)) +_exit (int status) +{ + if (__exitval_ptr) + { + *__exitval_ptr = status; + for (;;) + asm ("exit;" ::: "memory"); + } + else /* offloading */ + { + /* Map to 'abort'; see + '[nvptx] "exit" in offloaded region doesn't terminate process'. */ + abort (); + } +} diff --git a/lib/machine/nvptx/abort.c b/lib/machine/nvptx/abort.c new file mode 100644 index 0000000..f0ce154 --- /dev/null +++ b/lib/machine/nvptx/abort.c @@ -0,0 +1,23 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +void __attribute__((noreturn)) +abort (void) +{ + for (;;) + __builtin_trap (); +} diff --git a/lib/machine/nvptx/assert.c b/lib/machine/nvptx/assert.c new file mode 100644 index 0000000..19c809c --- /dev/null +++ b/lib/machine/nvptx/assert.c @@ -0,0 +1,40 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2016-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include +#include + +#ifndef HAVE_ASSERT_FUNC +/* func can be NULL, in which case no function information is given. */ +void +__assert_func (const char *file, + int line, + const char *func, + const char *failedexpr) +{ + abort(); + /* NOTREACHED */ +} +#endif /* HAVE_ASSERT_FUNC */ + +void +__assert (const char *file, + int line, + const char *failedexpr) +{ + __assert_func (file, line, NULL, failedexpr); + /* NOTREACHED */ +} diff --git a/lib/machine/nvptx/calloc.c b/lib/machine/nvptx/calloc.c new file mode 100644 index 0000000..f0ccf90 --- /dev/null +++ b/lib/machine/nvptx/calloc.c @@ -0,0 +1,26 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include + +void * +calloc (size_t size, size_t len) +{ + void *p = malloc (size * len); + if (!p) + return p; + return memset (p, 0, size * len); +} diff --git a/lib/machine/nvptx/callocr.c b/lib/machine/nvptx/callocr.c new file mode 100644 index 0000000..fa10f53 --- /dev/null +++ b/lib/machine/nvptx/callocr.c @@ -0,0 +1,22 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +void * +_calloc_r (struct _reent *ptr, size_t size, size_t len) +{ + return calloc (size, len); +} diff --git a/lib/machine/nvptx/clock.c b/lib/machine/nvptx/clock.c new file mode 100644 index 0000000..1ad69f1 --- /dev/null +++ b/lib/machine/nvptx/clock.c @@ -0,0 +1,18 @@ +/* clock.c + * Support file for nvptx in newlib. + */ +#include + +clock_t +clock () +{ + unsigned long long now; +#if __PTX_SM__ >= 310 + asm volatile("mov.u64 %0, %%globaltimer;" : "=r"(now)); + return now/((1000000000ull)/CLOCKS_PER_SEC); +#else + asm volatile("mov.u64 %0, %%clock64;" : "=r"(now)); + // Assume a GPU base clock frequency of 1250MHz. + return now/((1250000000ull)/CLOCKS_PER_SEC); +#endif +} diff --git a/lib/machine/nvptx/free.c b/lib/machine/nvptx/free.c new file mode 100644 index 0000000..7d329ce --- /dev/null +++ b/lib/machine/nvptx/free.c @@ -0,0 +1,26 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2016-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +/* The CUDA-provided free. */ +void sys_free (void *) __asm__ ("free"); + +/* The user-visible free (renamed by compiler). */ +void free (void *ptr) +{ + if (ptr) + sys_free ((long long *)ptr - 1); +} diff --git a/lib/machine/nvptx/malloc.c b/lib/machine/nvptx/malloc.c new file mode 100644 index 0000000..37ab75a --- /dev/null +++ b/lib/machine/nvptx/malloc.c @@ -0,0 +1,29 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2016-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +/* The CUDA-provided malloc. */ +void *sys_malloc (size_t) __asm__ ("malloc"); + +/* The user-visible malloc (renamed by compiler). */ +void *malloc (size_t size) +{ + long long *ptr = sys_malloc (size + sizeof (long long)); + if (ptr) + *(size_t *)ptr++ = size; + + return ptr; +} diff --git a/lib/machine/nvptx/mallocr.c b/lib/machine/nvptx/mallocr.c new file mode 100644 index 0000000..bef89de --- /dev/null +++ b/lib/machine/nvptx/mallocr.c @@ -0,0 +1,26 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +void *_malloc_r (struct _reent *r, size_t n) +{ + return malloc (n); +} + +void _free_r (struct _reent *r, void *p) +{ + free (p); +} diff --git a/lib/machine/nvptx/misc.c b/lib/machine/nvptx/misc.c new file mode 100644 index 0000000..56e66b9 --- /dev/null +++ b/lib/machine/nvptx/misc.c @@ -0,0 +1,83 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include +#include +#include + +#undef errno +extern int errno; + +int +close(int fd) { + return -1; +} + +int +fstat (int fd, struct stat *buf) { + return -1; +} + +int +gettimeofday (struct timeval *tv, void *tz) { + return -1; +} + +int +getpid (void) { + return 0; +} + +int +isatty (int fd) { + return fd == 1; +} + +int +kill (int pid, int sig) { + errno = ESRCH; + return -1; +} + +off_t +lseek(int fd, off_t offset, int whence) { + return 0; +} + +int +open (const char *pathname, int flags, ...) { + return -1; +} + +int +read(int fd, void *buf, size_t count) { + return 0; +} + +int +stat (const char *file, struct stat *pstat) { + errno = EACCES; + return -1; +} + +void +sync (void) { +} + +int +unlink (const char *pathname) { + return -1; +} diff --git a/lib/machine/nvptx/printf.c b/lib/machine/nvptx/printf.c new file mode 100644 index 0000000..d3f12bd --- /dev/null +++ b/lib/machine/nvptx/printf.c @@ -0,0 +1,30 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2015-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern int vprintf (const char *, va_list); + +int +printf (const char *fmt, ...) +{ + va_list args; + int res; + + va_start (args, fmt); + res = vprintf (fmt, args); + va_end (args); + return res; +} diff --git a/lib/machine/nvptx/putchar.c b/lib/machine/nvptx/putchar.c new file mode 100644 index 0000000..cb7537f --- /dev/null +++ b/lib/machine/nvptx/putchar.c @@ -0,0 +1,31 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2015-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern int vprintf (const char *, va_list); + +int +putchar (int c) +{ + unsigned valist[1]; + + c = (unsigned char)c; + valist[0] = c; + int ret = vprintf ("%c", valist); + if (ret < 0) + c = -1; + return c; +} diff --git a/lib/machine/nvptx/puts.c b/lib/machine/nvptx/puts.c new file mode 100644 index 0000000..ce4d17f --- /dev/null +++ b/lib/machine/nvptx/puts.c @@ -0,0 +1,27 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2015-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +extern int vprintf (const char *, va_list); + +int +puts (const char *str) +{ + void *valist[1]; + + valist[0] = str; + return vprintf ("%s\n", valist); +} diff --git a/lib/machine/nvptx/realloc.c b/lib/machine/nvptx/realloc.c new file mode 100644 index 0000000..1cb84df --- /dev/null +++ b/lib/machine/nvptx/realloc.c @@ -0,0 +1,32 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2016-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +void * +realloc (void *old_ptr, size_t new_size) +{ + void *new_ptr = malloc (new_size); + + if (old_ptr && new_ptr) + { + size_t old_size = *(size_t *)((long long *)old_ptr - 1); + size_t copy_size = old_size > new_size ? new_size : old_size; + __builtin_memcpy (new_ptr, old_ptr, copy_size); + free (old_ptr); + } + + return new_ptr; +} diff --git a/lib/machine/nvptx/reallocr.c b/lib/machine/nvptx/reallocr.c new file mode 100644 index 0000000..e942f06 --- /dev/null +++ b/lib/machine/nvptx/reallocr.c @@ -0,0 +1,21 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include + +void *_realloc_r (struct _reent *r, void *p, size_t n) _NOTHROW +{ + return realloc (p, n); +} diff --git a/lib/machine/nvptx/write.c b/lib/machine/nvptx/write.c new file mode 100644 index 0000000..0544dd0 --- /dev/null +++ b/lib/machine/nvptx/write.c @@ -0,0 +1,33 @@ +/* + * Support file for nvptx in newlib. + * Copyright (c) 2014-2018 Mentor Graphics. + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +#include +#include +#include +#include + +_READ_WRITE_RETURN_TYPE write (int fd, const void *buf, size_t count) +{ + size_t i; + char *b = (char *)buf; + if (fd != 1 && fd != 2) + { + errno = EBADF; + return -1; + } + for (i = 0; i < count; i++) + printf ("%c", b[i]); + return count; +} diff --git a/lib/machine/or1k/Makefile.inc b/lib/machine/or1k/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/or1k/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/or1k/setjmp.S b/lib/machine/or1k/setjmp.S new file mode 100644 index 0000000..f0663f3 --- /dev/null +++ b/lib/machine/or1k/setjmp.S @@ -0,0 +1,108 @@ +/* +Copyright (c) 2014, Hesham ALMatary +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +.align 4 +.global setjmp +.type setjmp,@function +setjmp: + + l.sw 0(r3), r1 + l.sw 4(r3), r2 + /* Skip r3-r8 as they are not preserved across function calls */ + l.sw 8(r3), r9 + /* Skip r10 as it's preserved to be used by TLS */ + /* Skip r11, setjmp always set it to 0 */ + /* The following set if registers are preserved across function calls */ + l.sw 12(r3), r14 + l.sw 16(r3), r16 + l.sw 20(r3), r18 + l.sw 24(r3), r20 + l.sw 28(r3), r22 + l.sw 32(r3), r24 + l.sw 36(r3), r26 + l.sw 40(r3), r28 + l.sw 44(r3), r30 + /* Save Status Register */ + l.mfspr r13, r0, 17 + l.sw 48(r3), r13 +/* Set result register to 0 and jump */ +// Different cases for optional delay slot +#if defined(__OR1K_NODELAY__) + l.addi r11, r0, 0 + l.jr r9 +#elif defined(__OR1K_DELAY__) + l.jr r9 + l.addi r11, r0, 0 +#else + l.addi r11, r0, 0 + l.jr r9 + l.nop +#endif + +.align 4 +.global longjmp +.type longjmp,@function +longjmp: + + /* If the second argument to longjmp is zero, set return address to 1, + otherwise set it to the value of the second argument */ + l.addi r11, r0, 1 + l.sfeq r4, r0 + l.bf 1f + l.nop + l.addi r11, r4, 0 + + /* Load status register */ +1: + l.lwz r15, 48(r3) + l.mtspr r0, r15, 17 + + l.lwz r1, 0(r3) + l.lwz r2, 4(r3) + /* Skip r3-r8 as they are not preserved across function calls */ + l.lwz r9, 8(r3) + /* Skip r11 as it's always set by longjmp */ + l.lwz r14, 12(r3) + l.lwz r16, 16(r3) + l.lwz r18, 20(r3) + l.lwz r20, 24(r3) + l.lwz r22, 28(r3) + l.lwz r24, 32(r3) + l.lwz r26, 36(r3) + l.lwz r28, 40(r3) + +// Different cases for optional delay slot +#if defined(__OR1K_NODELAY__) + l.lwz r30, 44(r3) + l.jr r9 +#elif defined(__OR1K_DELAY__) + l.jr r9 + l.lwz r30, 44(r3) +#else + l.lwz r30, 44(r3) + l.jr r9 + l.nop +#endif diff --git a/lib/machine/powerpc/Makefile.inc b/lib/machine/powerpc/Makefile.inc new file mode 100644 index 0000000..55c7ebd --- /dev/null +++ b/lib/machine/powerpc/Makefile.inc @@ -0,0 +1,35 @@ +libc_a_CPPFLAGS_%C% = -I$(srcdir)/libc/stdio -I$(srcdir)/libc/stdlib + +libc_a_SOURCES += %D%/setjmp.S + +if HAVE_POWERPC_ALTIVEC +libc_a_SOURCES += \ + %D%/vfprintf.c \ + %D%/vfscanf.c \ + %D%/vec_malloc.c \ + %D%/vec_calloc.c \ + %D%/vec_free.c \ + %D%/vec_realloc.c \ + %D%/vec_mallocr.c \ + %D%/vec_callocr.c \ + %D%/vec_reallocr.c +endif +if HAVE_POWERPC_SPE +libc_a_SOURCES += \ + %D%/atosfix16.c \ + %D%/atosfix32.c \ + %D%/atosfix64.c \ + %D%/atoufix16.c \ + %D%/atoufix32.c \ + %D%/atoufix64.c \ + %D%/simdldtoa.c \ + %D%/strtosfix16.c \ + %D%/strtosfix32.c \ + %D%/strtosfix64.c \ + %D%/strtoufix16.c \ + %D%/strtoufix32.c \ + %D%/strtoufix64.c \ + %D%/ufix64toa.c \ + %D%/vfprintf.c \ + %D%/vfscanf.c +endif diff --git a/lib/machine/powerpc/acinclude.m4 b/lib/machine/powerpc/acinclude.m4 new file mode 100644 index 0000000..7057398 --- /dev/null +++ b/lib/machine/powerpc/acinclude.m4 @@ -0,0 +1,10 @@ +HAVE_POWERPC_ALTIVEC=no +HAVE_POWERPC_SPE=no +if test "${machine_dir}" = "powerpc"; then + case $host in + powerpc*-*altivec*) HAVE_POWERPC_ALTIVEC=yes ;; + powerpc*-*spe*) HAVE_POWERPC_SPE=yes ;; + esac +fi +AM_CONDITIONAL(HAVE_POWERPC_ALTIVEC, [test "$HAVE_POWERPC_ALTIVEC" = yes]) +AM_CONDITIONAL(HAVE_POWERPC_SPE, [test "$HAVE_POWERPC_SPE" = yes]) diff --git a/lib/machine/powerpc/atosfix16.c b/lib/machine/powerpc/atosfix16.c new file mode 100644 index 0000000..b069d71 --- /dev/null +++ b/lib/machine/powerpc/atosfix16.c @@ -0,0 +1,80 @@ +/* +FUNCTION + <>, <>, <>---string to signed fixed-point + +INDEX + atosfix16 +INDEX + atosfix32 +INDEX + atosfix64 +INDEX + _atosfix16_r +INDEX + _atosfix32_r +INDEX + _atosfix64_r + +SYNOPSIS + #include + __int16_t atosfix16(const char *<[s]>); + __int32_t atosfix32(const char *<[s]>); + __int64_t atosfix32(const char *<[s]>); + + __int16_t _atosfix16_r(struct __reent *, const char *<[s]>); + __int32_t _atosfix32_r(struct __reent *, const char *<[s]>); + __int64_t _atosfix32_r(struct __reent *, const char *<[s]>); + +DESCRIPTION + <> converts the initial portion of a string to a sign + + 15-bit fraction fixed point value. + <> converts the initial portion of a string to a sign + + 31-bit fraction fixed point value. + <> converts the initial portion of a string to a sign + + 63-bit fraction fixed point value. + <> is implemented as <> + <> is implemented as <> + <> is implemented as <> + + The alternate functions <<_atosfix16_r>>, <<_atosfix32_r>>, + and <<_atosfix64_r>> are reentrant versions. + The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS + The functions return the converted value, if any. If no conversion was + made, <<0>> is returned. If saturation occurs, <> is stored + in errno. + +PORTABILITY + <>, <>, and <> are non-standard. + + No supporting OS subroutines are directly required. The + OS subroutines required by <> are used. +*/ + +/* + * Jeff Johnston - 02/13/2002 + */ + +#ifdef __SPE__ + +#include +#include <_ansi.h> + +__int16_t +_atosfix16_r (struct _reent *reent, + const char *s) +{ + return _strtosfix16_r (reent, s, NULL); +} + +#ifndef _REENT_ONLY +__int16_t +atosfix16 (const char *s) +{ + return strtosfix16 (s, NULL); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/atosfix32.c b/lib/machine/powerpc/atosfix32.c new file mode 100644 index 0000000..e1915b2 --- /dev/null +++ b/lib/machine/powerpc/atosfix32.c @@ -0,0 +1,26 @@ +/* + * Jeff Johnston - 02/13/2002 + */ + +#ifdef __SPE__ + +#include +#include <_ansi.h> + +__int32_t +_atosfix32_r (struct _reent *reent, + const char *s) +{ + return _strtosfix32_r (reent, s, NULL); +} + +#ifndef _REENT_ONLY +__int32_t +atosfix32 (const char *s) +{ + return strtosfix32 (s, NULL); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/atosfix64.c b/lib/machine/powerpc/atosfix64.c new file mode 100644 index 0000000..5340b1e --- /dev/null +++ b/lib/machine/powerpc/atosfix64.c @@ -0,0 +1,26 @@ +/* + * Jeff Johnston - 02/13/2002 + */ + +#ifdef __SPE__ + +#include +#include <_ansi.h> + +__int64_t +_atosfix64_r (struct _reent *reent, + const char *s) +{ + return _strtosfix64_r (reent, s, NULL); +} + +#ifndef _REENT_ONLY +__int64_t +atosfix64 (const char *s) +{ + return strtosfix64 (s, NULL); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/atoufix16.c b/lib/machine/powerpc/atoufix16.c new file mode 100644 index 0000000..4cc8338 --- /dev/null +++ b/lib/machine/powerpc/atoufix16.c @@ -0,0 +1,80 @@ +/* +FUNCTION + <>, <>, <>---string to unsigned fixed-point + +INDEX + atoufix16 +INDEX + atoufix32 +INDEX + atoufix64 +INDEX + _atoufix16_r +INDEX + _atoufix32_r +INDEX + _atoufix64_r + +SYNOPSIS + #include + __uint16_t atoufix16(const char *<[s]>); + __uint32_t atoufix32(const char *<[s]>); + __uint64_t atoufix32(const char *<[s]>); + + __uint16_t _atoufix16_r(struct __reent *, const char *<[s]>); + __uint32_t _atoufix32_r(struct __reent *, const char *<[s]>); + __uint64_t _atoufix32_r(struct __reent *, const char *<[s]>); + +DESCRIPTION + <> converts the initial portion of a string to a + 16-bit fraction unsigned fixed point value. + <> converts the initial portion of a string to a + 32-bit fraction unsigned fixed point value. + <> converts the initial portion of a string to a + 64-bit fraction unsigned fixed point value. + <> is implemented as <> + <> is implemented as <> + <> is implemented as <> + + The alternate functions <<_atoufix16_r>>, <<_atoufix32_r>>, + and <<_atoufix64_r>> are reentrant versions. + The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS + The functions return the converted value, if any. If no conversion was + made, <<0>> is returned. If saturation occurs, <> is stored + in errno. + +PORTABILITY + <>, <>, and <> are non-standard. + + No supporting OS subroutines are directly required. The + OS subroutines required by <> are used. +*/ + +/* + * Jeff Johnston - 02/13/2002 + */ + +#ifdef __SPE__ + +#include +#include <_ansi.h> + +__uint16_t +_atoufix16_r (struct _reent *reent, + const char *s) +{ + return _strtoufix16_r (reent, s, NULL); +} + +#ifndef _REENT_ONLY +__uint16_t +atoufix16 (const char *s) +{ + return strtoufix16 (s, NULL); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/atoufix32.c b/lib/machine/powerpc/atoufix32.c new file mode 100644 index 0000000..aa2333a --- /dev/null +++ b/lib/machine/powerpc/atoufix32.c @@ -0,0 +1,26 @@ +/* + * Jeff Johnston - 02/13/2002 + */ + +#ifdef __SPE__ + +#include +#include <_ansi.h> + +__uint32_t +_atoufix32_r (struct _reent *reent, + const char *s) +{ + return _strtoufix32_r (reent, s, NULL); +} + +#ifndef _REENT_ONLY +__uint32_t +atoufix32 (const char *s) +{ + return strtoufix32 (s, NULL); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/atoufix64.c b/lib/machine/powerpc/atoufix64.c new file mode 100644 index 0000000..cf9517e --- /dev/null +++ b/lib/machine/powerpc/atoufix64.c @@ -0,0 +1,26 @@ +/* + * Jeff Johnston - 02/13/2002 + */ + +#ifdef __SPE__ + +#include +#include <_ansi.h> + +__uint64_t +_atoufix64_r (struct _reent *reent, + const char *s) +{ + return _strtoufix64_r (reent, s, NULL); +} + +#ifndef _REENT_ONLY +__uint64_t +atoufix64 (const char *s) +{ + return strtoufix64 (s, NULL); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/fix64.h b/lib/machine/powerpc/fix64.h new file mode 100644 index 0000000..ce94820 --- /dev/null +++ b/lib/machine/powerpc/fix64.h @@ -0,0 +1,80 @@ +#ifndef _FIX64_H_ + +#define _FIX64_H_ + +#include +#include +#include +#include +#include + +#ifdef __IEEE_LITTLE_ENDIAN +#define IEEE_8087 +#endif + +#ifdef __IEEE_BIG_ENDIAN +#define IEEE_MC68k +#endif + +#ifdef __Z8000__ +#define Just_16 +#endif + +#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 +Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. +#endif + +union long_double_union +{ + long double ld; + __uint32_t i[4]; +}; + +typedef union long_double_union LONG_DOUBLE_UNION; + +extern void _simdstrtold (char *, char **, LONG_DOUBLE_UNION *); +extern int _simdldcheck (LONG_DOUBLE_UNION *); + +#define SIMD_LDBL_MANT_DIG 113 + +#ifdef IEEE_8087 +# define word0(x) (x.i[3]) +# define word1(x) (x.i[2]) +# define word2(x) (x.i[1]) +# define word3(x) (x.i[0]) +#else /* !IEEE_8087 */ +# define word0(x) (x.i[0]) +# define word1(x) (x.i[1]) +# define word2(x) (x.i[2]) +# define word3(x) (x.i[3]) +#endif /* !IEEE_8087 */ + +#undef Exp_shift +#define Exp_shift 16 +#undef Exp_mask +#define Exp_mask ((__uint32_t)0x7fff0000L) +#undef Exp_msk1 +#define Exp_msk1 ((__uint32_t)0x00010000L) +#undef Bias +#define Bias 16383 +#undef Ebits +#define Ebits 15 +#undef Sign_bit +#define Sign_bit ((__uint32_t)0x80000000L) +#define init(x) {} + +union fix64_union +{ + __uint64_t ll; + __uint32_t j[2]; +}; + +#ifdef __LITTLE_ENDIAN__ +# define hiword(y) (y.j[1]) +# define loword(y) (y.j[0]) +#else /* __BIG_ENDIAN__ */ +# define hiword(y) (y.j[0]) +# define loword(y) (y.j[1]) +#endif /* __BIG_ENDIAN__ */ + +#endif /* _FIX64_H_ */ diff --git a/lib/machine/powerpc/machine/fenv-fp.h b/lib/machine/powerpc/machine/fenv-fp.h new file mode 100644 index 0000000..7cf2021 --- /dev/null +++ b/lib/machine/powerpc/machine/fenv-fp.h @@ -0,0 +1,198 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +__fenv_static inline int +feclearexcept(int excepts) +{ + union __fpscr __r; + + if (excepts & FE_INVALID) + excepts |= FE_ALL_INVALID; + __mffs(&__r); + __r.__bits.__reg &= ~excepts; + __mtfsf(__r); + return (0); +} + + +__fenv_static inline int +fegetexceptflag(fexcept_t *flagp, int excepts) +{ + union __fpscr __r; + + __mffs(&__r); + *flagp = __r.__bits.__reg & excepts; + return (0); +} + +__fenv_static inline int +fesetexceptflag(const fexcept_t *flagp, int excepts) +{ + union __fpscr __r; + + if (excepts & FE_INVALID) + excepts |= FE_ALL_EXCEPT; + __mffs(&__r); + __r.__bits.__reg &= ~excepts; + __r.__bits.__reg |= *flagp & excepts; + __mtfsf(__r); + return (0); +} + +__fenv_static inline int +feraiseexcept(int excepts) +{ + union __fpscr __r; + + if (excepts & FE_INVALID) + excepts |= FE_VXSOFT; + __mffs(&__r); + __r.__bits.__reg |= excepts; + __mtfsf(__r); + return (0); +} + +__fenv_static inline int +fetestexcept(int excepts) +{ + union __fpscr __r; + + __mffs(&__r); + return (__r.__bits.__reg & excepts); +} + +__fenv_static inline int +fegetround(void) +{ + union __fpscr __r; + + __mffs(&__r); + return (__r.__bits.__reg & _ROUND_MASK); +} + +__fenv_static inline int +fesetround(int rounding_mode) +{ + union __fpscr __r; + + if (rounding_mode & ~_ROUND_MASK) + return (-1); + __mffs(&__r); + __r.__bits.__reg &= ~_ROUND_MASK; + __r.__bits.__reg |= rounding_mode; + __mtfsf(__r); + return (0); +} + +__fenv_static inline int +fegetenv(fenv_t *envp) +{ + union __fpscr __r; + + __mffs(&__r); + *envp = __r.__bits.__reg; + return (0); +} + +__fenv_static inline int +feholdexcept(fenv_t *envp) +{ + union __fpscr __r; + + __mffs(&__r); + *envp = __r.__bits.__reg; + __r.__bits.__reg &= ~(FE_ALL_EXCEPT | _ENABLE_MASK); + __mtfsf(__r); + return (0); +} + +__fenv_static inline int +fesetenv(const fenv_t *envp) +{ + union __fpscr __r; + + __r.__bits.__reg = *envp; + __mtfsf(__r); + return (0); +} + +__fenv_static inline int +feupdateenv(const fenv_t *envp) +{ + union __fpscr __r; + + __mffs(&__r); + __r.__bits.__reg &= FE_ALL_EXCEPT; + __r.__bits.__reg |= *envp; + __mtfsf(__r); + return (0); +} + +#if __BSD_VISIBLE + +/* We currently provide no external definitions of the functions below. */ + +static inline int +feenableexcept(int __mask) +{ + union __fpscr __r; + fenv_t __oldmask; + + __mffs(&__r); + __oldmask = __r.__bits.__reg; + __r.__bits.__reg |= (__mask & FE_ALL_EXCEPT) >> _FPUSW_SHIFT; + __mtfsf(__r); + return ((__oldmask & _ENABLE_MASK) << _FPUSW_SHIFT); +} + +static inline int +fedisableexcept(int __mask) +{ + union __fpscr __r; + fenv_t __oldmask; + + __mffs(&__r); + __oldmask = __r.__bits.__reg; + __r.__bits.__reg &= ~((__mask & FE_ALL_EXCEPT) >> _FPUSW_SHIFT); + __mtfsf(__r); + return ((__oldmask & _ENABLE_MASK) << _FPUSW_SHIFT); +} + +static inline int +fegetexcept(void) +{ + union __fpscr __r; + + __mffs(&__r); + return ((__r.__bits.__reg & _ENABLE_MASK) << _FPUSW_SHIFT); +} + +#endif /* __BSD_VISIBLE */ + diff --git a/lib/machine/powerpc/machine/malloc.h b/lib/machine/powerpc/machine/malloc.h new file mode 100644 index 0000000..32fbb26 --- /dev/null +++ b/lib/machine/powerpc/machine/malloc.h @@ -0,0 +1,20 @@ +#ifndef _MACHMALLOC_H_ +#define _MACHMALLOC_H_ + +# if defined(__ALTIVEC__) + +void *vec_calloc (size_t __nmemb, size_t __size); +void *_vec_calloc_r (struct _reent *, size_t __nmemb, size_t __size); +void vec_free (void *); +#define _vec_freer _freer +void *vec_malloc (size_t __size); +#define _vec_mallocr _memalign_r +void *vec_realloc (void *__r, size_t __size); +void *_vec_realloc_r (struct _reent *, void *__r, size_t __size); + +# endif /* __ALTIVEC__ */ + + +#endif /* _MACHMALLOC_H_ */ + + diff --git a/lib/machine/powerpc/machine/stdlib.h b/lib/machine/powerpc/machine/stdlib.h new file mode 100644 index 0000000..2db8010 --- /dev/null +++ b/lib/machine/powerpc/machine/stdlib.h @@ -0,0 +1,71 @@ +#ifndef _MACHSTDLIB_H_ +#define _MACHSTDLIB_H_ + +#ifndef __STRICT_ANSI__ + +# if defined(__ALTIVEC__) + +void *vec_calloc (size_t __nmemb, size_t __size); +void *_vec_calloc_r (struct _reent *, size_t __nmemb, size_t __size); +void vec_free (void *); +#define _vec_freer _freer +void *vec_malloc (size_t __size); +#define _vec_mallocr _memalign_r +void *vec_realloc (void *__r, size_t __size); +void *_vec_realloc_r (struct _reent *, void *__r, size_t __size); + +# endif /* __ALTIVEC__ */ + +# if defined(__SPE__) + +#define __need_inttypes +#include + +#ifdef __cplusplus +extern "C" { +#endif +__int16_t atosfix16 (const char *__str); +__int16_t _atosfix16_r (struct _reent *, const char *__str); +__int32_t atosfix32 (const char *__str); +__int32_t _atosfix32_r (struct _reent *, const char *__str); +__int64_t atosfix64 (const char *__str); +__int64_t _atosfix64_r (struct _reent *, const char *__str); + +__uint16_t atoufix16 (const char *__str); +__uint16_t _atoufix16_r (struct _reent *, const char *__str); +__uint32_t atoufix32 (const char *__str); +__uint32_t _atoufix32_r (struct _reent *, const char *__str); +__uint64_t atoufix64 (const char *__str); +__uint64_t _atoufix64_r (struct _reent *, const char *__str); + +__int16_t strtosfix16 (const char *__str, char **__endptr); +__int16_t _strtosfix16_r (struct _reent *, const char *__str, + char **__endptr); +__int32_t strtosfix32 (const char *__str, char **__endptr); +__int32_t _strtosfix32_r (struct _reent *, const char *__str, + char **__endptr); +__int64_t strtosfix64 (const char *__str, char **__endptr); +__int64_t _strtosfix64_r (struct _reent *, const char *__str, + char **__endptr); + +__uint16_t strtoufix16 (const char *__str, char **__endptr); +__uint16_t _strtoufix16_r (struct _reent *, const char *__str, + char **__endptr); +__uint32_t strtoufix32 (const char *__str, char **__endptr); +__uint32_t _strtoufix32_r (struct _reent *, const char *__str, + char **__endptr); +__uint64_t strtoufix64 (const char *__str, char **__endptr); +__uint64_t _strtoufix64_r (struct _reent *, const char *__str, + char **__endptr); +#ifdef __cplusplus +} +#endif + +# endif /* __SPE__ */ + +#endif /* !__STRICT_ANSI__ */ + + +#endif /* _MACHSTDLIB_H_ */ + + diff --git a/lib/machine/powerpc/setjmp.S b/lib/machine/powerpc/setjmp.S new file mode 100644 index 0000000..c7af5b1 --- /dev/null +++ b/lib/machine/powerpc/setjmp.S @@ -0,0 +1,387 @@ +/* This is a simple version of setjmp and longjmp for the PowerPC. + Ian Lance Taylor, Cygnus Support, 9 Feb 1994. + Modified by Jeff Johnston, Red Hat Inc. 2 Oct 2001. + Modified by Sebastian Huber, embedded brains GmbH. 22 Sep 2022. */ + +#include "ppc-asm.h" + +FUNC_START(setjmp) +#ifdef __ALTIVEC__ + addi 3,3,15 # align Altivec to 16 byte boundary +#if __powerpc64__ + clrrdi 3,3,4 +#else + rlwinm 3,3,0,0,27 +#endif +#else + addi 3,3,7 # align to 8 byte boundary +#if __powerpc64__ + clrrdi 3,3,3 +#else + rlwinm 3,3,0,0,28 +#endif +#endif +#if __SPE__ + /* If we are E500, then save 64-bit registers. */ + evstdd 1,0(3) # offset 0 + evstdd 2,8(3) # offset 8 + evstdd 13,16(3) # offset 16 + evstdd 14,24(3) # offset 24 + evstdd 15,32(3) # offset 32 + evstdd 16,40(3) # offset 40 + evstdd 17,48(3) # offset 48 + evstdd 18,56(3) # offset 56 + evstdd 19,64(3) # offset 64 + evstdd 20,72(3) # offset 72 + evstdd 21,80(3) # offset 80 + evstdd 22,88(3) # offset 88 + evstdd 23,96(3) # offset 96 + evstdd 24,104(3) # offset 104 + evstdd 25,112(3) # offset 112 + evstdd 26,120(3) # offset 120 + evstdd 27,128(3) # offset 128 + evstdd 28,136(3) # offset 136 + evstdd 29,144(3) # offset 144 + evstdd 30,152(3) # offset 152 + evstdd 31,160(3) # offset 160 + + /* Add 164 to r3 to account for the amount of data we just + stored. Note that we are not adding 168 because the next + store instruction uses an offset of 4. */ + addi 3,3,164 +#elif __powerpc64__ + /* In the first store, add 8 to r3 so that the subsequent floating + point stores are aligned on an 8 byte boundary and the Altivec + stores are aligned on a 16 byte boundary. */ + stdu 1,8(3) # offset 8 + stdu 2,8(3) # offset 16 + stdu 13,8(3) # offset 24 + stdu 14,8(3) # offset 32 + stdu 15,8(3) # offset 40 + stdu 16,8(3) # offset 48 + stdu 17,8(3) # offset 56 + stdu 18,8(3) # offset 64 + stdu 19,8(3) # offset 72 + stdu 20,8(3) # offset 80 + stdu 21,8(3) # offset 88 + stdu 22,8(3) # offset 96 + stdu 23,8(3) # offset 104 + stdu 24,8(3) # offset 112 + stdu 25,8(3) # offset 120 + stdu 26,8(3) # offset 128 + stdu 27,8(3) # offset 136 + stdu 28,8(3) # offset 144 + stdu 29,8(3) # offset 152 + stdu 30,8(3) # offset 160 + stdu 31,8(3) # offset 168 + mflr 4 + stdu 4,8(3) # offset 176 + mfcr 4 + stwu 4,8(3) # offset 184 +#else + stw 1,0(3) # offset 0 + stwu 2,4(3) # offset 4 + stwu 13,4(3) # offset 8 + stwu 14,4(3) # offset 12 + stwu 15,4(3) # offset 16 + stwu 16,4(3) # offset 20 + stwu 17,4(3) # offset 24 + stwu 18,4(3) # offset 28 + stwu 19,4(3) # offset 32 + stwu 20,4(3) # offset 36 + stwu 21,4(3) # offset 40 + stwu 22,4(3) # offset 44 + stwu 23,4(3) # offset 48 + stwu 24,4(3) # offset 52 + stwu 25,4(3) # offset 56 + stwu 26,4(3) # offset 60 + stwu 27,4(3) # offset 64 + stwu 28,4(3) # offset 68 + stwu 29,4(3) # offset 72 + stwu 30,4(3) # offset 76 + stwu 31,4(3) # offset 80 +#endif + +#if !__powerpc64__ + /* If __SPE__, then add 84 to the offset shown from this point on until + the end of this function. This difference comes from the fact that + we save 21 64-bit registers instead of 21 32-bit registers above. */ + mflr 4 + stwu 4,4(3) # offset 84 + mfcr 4 + stwu 4,4(3) # offset 88 + # one word pad to get floating point aligned on 8 byte boundary +#endif + + /* Check whether we need to save FPRs. Checking __NO_FPRS__ + on its own would be enough for GCC 4.1 and above, but older + compilers only define _SOFT_FLOAT, so check both. */ +#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT) +#if defined (__rtems__) && !defined (__PPC_CPU_E6500__) + /* For some RTEMS multilibs, the FPU and Altivec units are disabled + during interrupt handling. Do not save and restore the + corresponding registers in this case. */ + mfmsr 5 + andi. 5,5,0x2000 + beq 1f +#endif + + /* If __powerpc64__, then add 96 to the offset shown from this point on until + the end of this function. This difference comes from the fact that + we save 23 64-bit registers instead of 23 32-bit registers above and + we take alignement requirements of floating point and Altivec stores + into account. */ + + stfdu 14,8(3) # offset 96 + stfdu 15,8(3) # offset 104 + stfdu 16,8(3) # offset 112 + stfdu 17,8(3) # offset 120 + stfdu 18,8(3) # offset 128 + stfdu 19,8(3) # offset 136 + stfdu 20,8(3) # offset 144 + stfdu 21,8(3) # offset 152 + stfdu 22,8(3) # offset 160 + stfdu 23,8(3) # offset 168 + stfdu 24,8(3) # offset 176 + stfdu 25,8(3) # offset 184 + stfdu 26,8(3) # offset 192 + stfdu 27,8(3) # offset 200 + stfdu 28,8(3) # offset 208 + stfdu 29,8(3) # offset 216 + stfdu 30,8(3) # offset 224 + stfdu 31,8(3) # offset 232 +1: +#endif + + /* This requires a total of 21 * 4 + 18 * 8 + 4 + 4 + 4 + bytes == 60 * 4 bytes == 240 bytes. */ + +#ifdef __ALTIVEC__ +#if defined (__rtems__) && !defined (__PPC_CPU_E6500__) + mfmsr 5 + andis. 5,5,0x200 + beq 1f +#endif + /* save Altivec vrsave and vr20-vr31 registers */ + mfspr 4,256 # vrsave register + stwu 4,16(3) # offset 248 + addi 3,3,8 + stvx 20,0,3 # offset 256 + addi 3,3,16 + stvx 21,0,3 # offset 272 + addi 3,3,16 + stvx 22,0,3 # offset 288 + addi 3,3,16 + stvx 23,0,3 # offset 304 + addi 3,3,16 + stvx 24,0,3 # offset 320 + addi 3,3,16 + stvx 25,0,3 # offset 336 + addi 3,3,16 + stvx 26,0,3 # offset 352 + addi 3,3,16 + stvx 27,0,3 # offset 368 + addi 3,3,16 + stvx 28,0,3 # offset 384 + addi 3,3,16 + stvx 29,0,3 # offset 400 + addi 3,3,16 + stvx 30,0,3 # offset 416 + addi 3,3,16 + stvx 31,0,3 # offset 432 +1: + + /* This requires a total of 240 + 8 + 8 + 12 * 16 == 448 bytes. */ +#endif + li 3,0 + blr +FUNC_END(setjmp) + + +FUNC_START(longjmp) +#ifdef __ALTIVEC__ + addi 3,3,15 # align Altivec to 16 byte boundary +#if __powerpc64__ + clrrdi 3,3,4 +#else + rlwinm 3,3,0,0,27 +#endif +#else + addi 3,3,7 # align to 8 byte boundary +#if __powerpc64__ + clrrdi 3,3,3 +#else + rlwinm 3,3,0,0,28 +#endif +#endif +#if __SPE__ + /* If we are E500, then restore 64-bit registers. */ + evldd 1,0(3) # offset 0 + evldd 2,8(3) # offset 8 + evldd 13,16(3) # offset 16 + evldd 14,24(3) # offset 24 + evldd 15,32(3) # offset 32 + evldd 16,40(3) # offset 40 + evldd 17,48(3) # offset 48 + evldd 18,56(3) # offset 56 + evldd 19,64(3) # offset 64 + evldd 20,72(3) # offset 72 + evldd 21,80(3) # offset 80 + evldd 22,88(3) # offset 88 + evldd 23,96(3) # offset 96 + evldd 24,104(3) # offset 104 + evldd 25,112(3) # offset 112 + evldd 26,120(3) # offset 120 + evldd 27,128(3) # offset 128 + evldd 28,136(3) # offset 136 + evldd 29,144(3) # offset 144 + evldd 30,152(3) # offset 152 + evldd 31,160(3) # offset 160 + + /* Add 164 to r3 to account for the amount of data we just + loaded. Note that we are not adding 168 because the next + load instruction uses an offset of 4. */ + addi 3,3,164 +#elif __powerpc64__ + /* In the first load, add 8 to r3 so that the subsequent floating + point loades are aligned on an 8 byte boundary and the Altivec + loads are aligned on a 16 byte boundary. */ + ldu 1,8(3) # offset 8 + ldu 2,8(3) # offset 16 + ldu 13,8(3) # offset 24 + ldu 14,8(3) # offset 32 + ldu 15,8(3) # offset 40 + ldu 16,8(3) # offset 48 + ldu 17,8(3) # offset 56 + ldu 18,8(3) # offset 64 + ldu 19,8(3) # offset 72 + ldu 20,8(3) # offset 80 + ldu 21,8(3) # offset 88 + ldu 22,8(3) # offset 96 + ldu 23,8(3) # offset 104 + ldu 24,8(3) # offset 112 + ldu 25,8(3) # offset 120 + ldu 26,8(3) # offset 128 + ldu 27,8(3) # offset 136 + ldu 28,8(3) # offset 144 + ldu 29,8(3) # offset 152 + ldu 30,8(3) # offset 160 + ldu 31,8(3) # offset 168 + ldu 5,8(3) # offset 176 + mtlr 5 + lwzu 5,8(3) # offset 184 + mtcrf 255,5 +#else + lwz 1,0(3) # offset 0 + lwzu 2,4(3) # offset 4 + lwzu 13,4(3) # offset 8 + lwzu 14,4(3) # offset 12 + lwzu 15,4(3) # offset 16 + lwzu 16,4(3) # offset 20 + lwzu 17,4(3) # offset 24 + lwzu 18,4(3) # offset 28 + lwzu 19,4(3) # offset 32 + lwzu 20,4(3) # offset 36 + lwzu 21,4(3) # offset 40 + lwzu 22,4(3) # offset 44 + lwzu 23,4(3) # offset 48 + lwzu 24,4(3) # offset 52 + lwzu 25,4(3) # offset 56 + lwzu 26,4(3) # offset 60 + lwzu 27,4(3) # offset 64 + lwzu 28,4(3) # offset 68 + lwzu 29,4(3) # offset 72 + lwzu 30,4(3) # offset 76 + lwzu 31,4(3) # offset 80 +#endif + /* If __SPE__, then add 84 to the offset shown from this point on until + the end of this function. This difference comes from the fact that + we restore 22 64-bit registers instead of 22 32-bit registers above. */ + +#if !__powerpc64__ + lwzu 5,4(3) # offset 84 + mtlr 5 + lwzu 5,4(3) # offset 88 + mtcrf 255,5 + # one word pad to get floating point aligned on 8 byte boundary +#endif + + /* Check whether we need to restore FPRs. Checking + __NO_FPRS__ on its own would be enough for GCC 4.1 and + above, but older compilers only define _SOFT_FLOAT, so + check both. */ +#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT) +#if defined (__rtems__) && !defined (__PPC_CPU_E6500__) + mfmsr 5 + andi. 5,5,0x2000 + beq 1f +#endif + + /* If __powerpc64__, then add 96 to the offset shown from this point on until + the end of this function. This difference comes from the fact that + we restore 23 64-bit registers instead of 23 32-bit registers above and + we take alignement requirements of floating point and Altivec loads + into account. */ + + lfdu 14,8(3) # offset 96 + lfdu 15,8(3) # offset 104 + lfdu 16,8(3) # offset 112 + lfdu 17,8(3) # offset 120 + lfdu 18,8(3) # offset 128 + lfdu 19,8(3) # offset 136 + lfdu 20,8(3) # offset 144 + lfdu 21,8(3) # offset 152 + lfdu 22,8(3) # offset 160 + lfdu 23,8(3) # offset 168 + lfdu 24,8(3) # offset 176 + lfdu 25,8(3) # offset 184 + lfdu 26,8(3) # offset 192 + lfdu 27,8(3) # offset 200 + lfdu 28,8(3) # offset 208 + lfdu 29,8(3) # offset 216 + lfdu 30,8(3) # offset 224 + lfdu 31,8(3) # offset 232 +1: +#endif + +#ifdef __ALTIVEC__ +#if defined (__rtems__) && !defined (__PPC_CPU_E6500__) + mfmsr 5 + andis. 5,5,0x200 + beq 1f +#endif + /* restore Altivec vrsave and v20-v31 registers */ + lwzu 5,16(3) # offset 248 + mtspr 256,5 # vrsave + addi 3,3,8 + lvx 20,0,3 # offset 256 + addi 3,3,16 + lvx 21,0,3 # offset 272 + addi 3,3,16 + lvx 22,0,3 # offset 288 + addi 3,3,16 + lvx 23,0,3 # offset 304 + addi 3,3,16 + lvx 24,0,3 # offset 320 + addi 3,3,16 + lvx 25,0,3 # offset 336 + addi 3,3,16 + lvx 26,0,3 # offset 352 + addi 3,3,16 + lvx 27,0,3 # offset 368 + addi 3,3,16 + lvx 28,0,3 # offset 384 + addi 3,3,16 + lvx 29,0,3 # offset 400 + addi 3,3,16 + lvx 30,0,3 # offset 416 + addi 3,3,16 + lvx 31,0,3 # offset 432 +1: +#endif + + mr. 3,4 + bclr+ 4,2 + li 3,1 + blr +FUNC_END(longjmp) diff --git a/lib/machine/powerpc/simdldtoa.c b/lib/machine/powerpc/simdldtoa.c new file mode 100644 index 0000000..9a90e64 --- /dev/null +++ b/lib/machine/powerpc/simdldtoa.c @@ -0,0 +1,3722 @@ + + /* Extended precision arithmetic functions for long double I/O. + * This program has been placed in the public domain. + */ + +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" +#include "fix64.h" + +/* These are the externally visible entries. */ +/* linux name: long double _IO_strtold (char *, char **); */ +void _simdstrtold (char *, char **, LONG_DOUBLE_UNION *); +char * _simdldtoa_r (struct _reent *, LONG_DOUBLE_UNION *, int, int, int *, int *, char **); + + /* Number of 16 bit words in external x type format */ + #define NE 10 + + /* Number of 16 bit words in internal format */ + #define NI (NE+3) + + /* Array offset to exponent */ + #define E 1 + + /* Array offset to high guard word */ + #define M 2 + + /* Number of bits of precision */ + #define NBITS ((NI-4)*16) + + /* Maximum number of decimal digits in ASCII conversion + * = NBITS*log10(2) + */ + #define NDEC (NBITS*8/27) + + /* The exponent of 1.0 */ + #define EXONE (0x3fff) + + /* Maximum exponent digits - base 10 */ + #define MAX_EXP_DIGITS 5 + +/* Control structure for long doublue conversion including rounding precision values. + * rndprc can be set to 80 (if NE=6), 64, 56, 53, or 24 bits. + */ +typedef struct +{ + int rlast; + int rndprc; + int rw; + int re; + int outexpon; + unsigned short rmsk; + unsigned short rmbit; + unsigned short rebit; + unsigned short rbit[NI]; + unsigned short equot[NI]; +} LDPARMS; + +static void esub(short unsigned int *a, short unsigned int *b, short unsigned int *c, LDPARMS *ldp); +static void emul(short unsigned int *a, short unsigned int *b, short unsigned int *c, LDPARMS *ldp); +static void ediv(short unsigned int *a, short unsigned int *b, short unsigned int *c, LDPARMS *ldp); +static int ecmp(short unsigned int *a, short unsigned int *b); +static int enormlz(short unsigned int *x); +static int eshift(short unsigned int *x, int sc); +static void eshup1(register short unsigned int *x); +static void eshup8(register short unsigned int *x); +static void eshup6(register short unsigned int *x); +static void eshdn1(register short unsigned int *x); +static void eshdn8(register short unsigned int *x); +static void eshdn6(register short unsigned int *x); +static void eneg(short unsigned int *x); +static void emov(register short unsigned int *a, register short unsigned int *b); +static void eclear(register short unsigned int *x); +static void einfin(register short unsigned int *x, register LDPARMS *ldp); +static void efloor(short unsigned int *x, short unsigned int *y, LDPARMS *ldp); +static void etoasc(short unsigned int *x, char *string, int ndigs, int outformat, LDPARMS *ldp); + +#if SIMD_LDBL_MANT_DIG == 24 +static void e24toe(short unsigned int *pe, short unsigned int *y, LDPARMS *ldp); +#elif SIMD_LDBL_MANT_DIG == 53 +static void e53toe(short unsigned int *pe, short unsigned int *y, LDPARMS *ldp); +#elif SIMD_LDBL_MANT_DIG == 64 +static void e64toe(short unsigned int *pe, short unsigned int *y, LDPARMS *ldp); +#else +static void e113toe(short unsigned int *pe, short unsigned int *y, LDPARMS *ldp); +#endif + +/* econst.c */ +/* e type constants used by high precision check routines */ + +#if NE == 10 +/* 0.0 */ +static unsigned short ezero[NE] = + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,}; + +/* 1.0E0 */ +static unsigned short eone[NE] = + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,}; + +#else + +/* 0.0 */ +static unsigned short ezero[NE] = { +0, 0000000,0000000,0000000,0000000,0000000,}; +/* 1.0E0 */ +static unsigned short eone[NE] = { +0, 0000000,0000000,0000000,0100000,0x3fff,}; + +#endif + +/* Debugging routine for displaying errors */ +#ifdef DEBUG +/* Notice: the order of appearance of the following + * messages is bound to the error codes defined + * in mconf.h. + */ +static char *ermsg[7] = { +"unknown", /* error code 0 */ +"domain", /* error code 1 */ +"singularity", /* et seq. */ +"overflow", +"underflow", +"total loss of precision", +"partial loss of precision" +}; +#define mtherr(name, code) printf( "\n%s %s error\n", name, ermsg[code] ); +#else +#define mtherr(name, code) +#endif + +/* ieee.c + * + * Extended precision IEEE binary floating point arithmetic routines + * + * Numbers are stored in C language as arrays of 16-bit unsigned + * short integers. The arguments of the routines are pointers to + * the arrays. + * + * + * External e type data structure, simulates Intel 8087 chip + * temporary real format but possibly with a larger significand: + * + * NE-1 significand words (least significant word first, + * most significant bit is normally set) + * exponent (value = EXONE for 1.0, + * top bit is the sign) + * + * + * Internal data structure of a number (a "word" is 16 bits): + * + * ei[0] sign word (0 for positive, 0xffff for negative) + * ei[1] biased exponent (value = EXONE for the number 1.0) + * ei[2] high guard word (always zero after normalization) + * ei[3] + * to ei[NI-2] significand (NI-4 significand words, + * most significant word first, + * most significant bit is set) + * ei[NI-1] low guard word (0x8000 bit is rounding place) + * + * + * + * Routines for external format numbers + * + * asctoe( string, e ) ASCII string to extended double e type + * asctoe64( string, &d ) ASCII string to long double + * asctoe53( string, &d ) ASCII string to double + * asctoe24( string, &f ) ASCII string to single + * asctoeg( string, e, prec, ldp ) ASCII string to specified precision + * e24toe( &f, e, ldp ) IEEE single precision to e type + * e53toe( &d, e, ldp ) IEEE double precision to e type + * e64toe( &d, e, ldp ) IEEE long double precision to e type + * e113toe( &d, e, ldp ) IEEE long double precision to e type + * eabs(e) absolute value + * eadd( a, b, c ) c = b + a + * eclear(e) e = 0 + * ecmp (a, b) Returns 1 if a > b, 0 if a == b, + * -1 if a < b, -2 if either a or b is a NaN. + * ediv( a, b, c, ldp ) c = b / a + * efloor( a, b, ldp ) truncate to integer, toward -infinity + * efrexp( a, exp, s ) extract exponent and significand + * eifrac( e, &l, frac ) e to long integer and e type fraction + * euifrac( e, &l, frac ) e to unsigned long integer and e type fraction + * einfin( e, ldp ) set e to infinity, leaving its sign alone + * eldexp( a, n, b ) multiply by 2**n + * emov( a, b ) b = a + * emul( a, b, c, ldp ) c = b * a + * eneg(e) e = -e + * eround( a, b ) b = nearest integer value to a + * esub( a, b, c, ldp ) c = b - a + * e24toasc( &f, str, n ) single to ASCII string, n digits after decimal + * e53toasc( &d, str, n ) double to ASCII string, n digits after decimal + * e64toasc( &d, str, n ) long double to ASCII string + * etoasc(e,str,n,fmt,ldp)e to ASCII string, n digits after decimal + * etoe24( e, &f ) convert e type to IEEE single precision + * etoe53( e, &d ) convert e type to IEEE double precision + * etoe64( e, &d ) convert e type to IEEE long double precision + * ltoe( &l, e ) long (32 bit) integer to e type + * ultoe( &l, e ) unsigned long (32 bit) integer to e type + * eisneg( e ) 1 if sign bit of e != 0, else 0 + * eisinf( e ) 1 if e has maximum exponent (non-IEEE) + * or is infinite (IEEE) + * eisnan( e ) 1 if e is a NaN + * esqrt( a, b ) b = square root of a + * + * + * Routines for internal format numbers + * + * eaddm( ai, bi ) add significands, bi = bi + ai + * ecleaz(ei) ei = 0 + * ecleazs(ei) set ei = 0 but leave its sign alone + * ecmpm( ai, bi ) compare significands, return 1, 0, or -1 + * edivm( ai, bi, ldp ) divide significands, bi = bi / ai + * emdnorm(ai,l,s,exp,ldp) normalize and round off + * emovi( a, ai ) convert external a to internal ai + * emovo( ai, a, ldp ) convert internal ai to external a + * emovz( ai, bi ) bi = ai, low guard word of bi = 0 + * emulm( ai, bi, ldp ) multiply significands, bi = bi * ai + * enormlz(ei) left-justify the significand + * eshdn1( ai ) shift significand and guards down 1 bit + * eshdn8( ai ) shift down 8 bits + * eshdn6( ai ) shift down 16 bits + * eshift( ai, n ) shift ai n bits up (or down if n < 0) + * eshup1( ai ) shift significand and guards up 1 bit + * eshup8( ai ) shift up 8 bits + * eshup6( ai ) shift up 16 bits + * esubm( ai, bi ) subtract significands, bi = bi - ai + * + * + * The result is always normalized and rounded to NI-4 word precision + * after each arithmetic operation. + * + * Exception flags are NOT fully supported. + * + * Define INFINITY in mconf.h for support of infinity; otherwise a + * saturation arithmetic is implemented. + * + * Define NANS for support of Not-a-Number items; otherwise the + * arithmetic will never produce a NaN output, and might be confused + * by a NaN input. + * If NaN's are supported, the output of ecmp(a,b) is -2 if + * either a or b is a NaN. This means asking if(ecmp(a,b) < 0) + * may not be legitimate. Use if(ecmp(a,b) == -1) for less-than + * if in doubt. + * Signaling NaN's are NOT supported; they are treated the same + * as quiet NaN's. + * + * Denormals are always supported here where appropriate (e.g., not + * for conversion to DEC numbers). + */ + +/* + * Revision history: + * + * 5 Jan 84 PDP-11 assembly language version + * 6 Dec 86 C language version + * 30 Aug 88 100 digit version, improved rounding + * 15 May 92 80-bit long double support + * 22 Nov 00 Revised to fit into newlib by Jeff Johnston + * + * Author: S. L. Moshier. + * + * Copyright (c) 1984,2000 S.L. Moshier + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + */ + +#include +/* #include "\usr\include\stdio.h" */ +/*#include "ehead.h"*/ +/*#include "mconf.h"*/ +/* mconf.h + * + * Common include file for math routines + * + * + * + * SYNOPSIS: + * + * #include "mconf.h" + * + * + * + * DESCRIPTION: + * + * This file contains definitions for error codes that are + * passed to the common error handling routine mtherr() + * (which see). + * + * The file also includes a conditional assembly definition + * for the type of computer arithmetic (IEEE, DEC, Motorola + * IEEE, or UNKnown). + * + * For Digital Equipment PDP-11 and VAX computers, certain + * IBM systems, and others that use numbers with a 56-bit + * significand, the symbol DEC should be defined. In this + * mode, most floating point constants are given as arrays + * of octal integers to eliminate decimal to binary conversion + * errors that might be introduced by the compiler. + * + * For computers, such as IBM PC, that follow the IEEE + * Standard for Binary Floating Point Arithmetic (ANSI/IEEE + * Std 754-1985), the symbol IBMPC should be defined. These + * numbers have 53-bit significands. In this mode, constants + * are provided as arrays of hexadecimal 16 bit integers. + * + * To accommodate other types of computer arithmetic, all + * constants are also provided in a normal decimal radix + * which one can hope are correctly converted to a suitable + * format by the available C language compiler. To invoke + * this mode, the symbol UNK is defined. + * + * An important difference among these modes is a predefined + * set of machine arithmetic constants for each. The numbers + * MACHEP (the machine roundoff error), MAXNUM (largest number + * represented), and several other parameters are preset by + * the configuration symbol. Check the file const.c to + * ensure that these values are correct for your computer. + * + * For ANSI C compatibility, define ANSIC equal to 1. Currently + * this affects only the atan2() function and others that use it. + */ + +/* Constant definitions for math error conditions + */ + +#define DOMAIN 1 /* argument domain error */ +#define SING 2 /* argument singularity */ +#define OVERFLOW 3 /* overflow range error */ +#define UNDERFLOW 4 /* underflow range error */ +#define TLOSS 5 /* total loss of precision */ +#define PLOSS 6 /* partial loss of precision */ + +#define EDOM 33 +#define ERANGE 34 + +typedef struct + { + double r; + double i; + }cmplx; + +/* Type of computer arithmetic */ + +#ifndef DEC +#ifdef __IEEE_LITTLE_ENDIAN +#define IBMPC 1 +#else /* !__IEEE_LITTLE_ENDIAN */ +#define MIEEE 1 +#endif /* !__IEEE_LITTLE_ENDIAN */ +#endif /* !DEC */ + +/* Define 1 for ANSI C atan2() function + * See atan.c and clog.c. + */ +#define ANSIC 1 + +/*define VOLATILE volatile*/ +#define VOLATILE + +#define NANS +#define INFINITY + +/* NaN's require infinity support. */ +#ifdef NANS +#ifndef INFINITY +#define INFINITY +#endif +#endif + +/* This handles 64-bit long ints. */ +#define LONGBITS (8 * sizeof(long)) + + +static void eaddm(short unsigned int *x, short unsigned int *y); +static void esubm(short unsigned int *x, short unsigned int *y); +static void emdnorm(short unsigned int *s, int lost, int subflg, long int exp, int rcntrl, LDPARMS *ldp); +static int asctoeg(char *ss, short unsigned int *y, int oprec, LDPARMS *ldp); +static void enan(short unsigned int *nan, int size); +#if SIMD_LDBL_MANT_DIG == 24 +static void toe24(short unsigned int *x, short unsigned int *y); +#elif SIMD_LDBL_MANT_DIG == 53 +static void toe53(short unsigned int *x, short unsigned int *y); +#elif SIMD_LDBL_MANT_DIG == 64 +static void toe64(short unsigned int *a, short unsigned int *b); +#else +static void toe113(short unsigned int *a, short unsigned int *b); +#endif +static void eiremain(short unsigned int *den, short unsigned int *num, LDPARMS *ldp); +static int ecmpm(register short unsigned int *a, register short unsigned int *b); +static int edivm(short unsigned int *den, short unsigned int *num, LDPARMS *ldp); +static int emulm(short unsigned int *a, short unsigned int *b, LDPARMS *ldp); +static int eisneg(short unsigned int *x); +static int eisinf(short unsigned int *x); +static void emovi(short unsigned int *a, short unsigned int *b); +static void emovo(short unsigned int *a, short unsigned int *b, LDPARMS *ldp); +static void emovz(register short unsigned int *a, register short unsigned int *b); +static void ecleaz(register short unsigned int *xi); +static void eadd1(short unsigned int *a, short unsigned int *b, short unsigned int *c, int subflg, LDPARMS *ldp); +static int eisnan(short unsigned int *x); +static int eiisnan(short unsigned int *x); + +#ifdef DEC +static void etodec(), todec(), dectoe(); +#endif + +/* +; Clear out entire external format number. +; +; unsigned short x[]; +; eclear( x ); +*/ + +static void eclear(register short unsigned int *x) +{ +register int i; + +for( i=0; irndprc < NBITS ) + { + if (ldp->rndprc == 113) + { + *(x - 9) = 0; + *(x - 8) = 0; + } + if( ldp->rndprc == 64 ) + { + *(x-5) = 0; + } + if( ldp->rndprc == 53 ) + { + *(x-4) = 0xf800; + } + else + { + *(x-4) = 0; + *(x-3) = 0; + *(x-2) = 0xff00; + } + } +#endif +} + +/* Move in external format number, + * converting it to internal format. + */ +static void emovi(short unsigned int *a, short unsigned int *b) +{ +register unsigned short *p, *q; +int i; + +q = b; +p = a + (NE-1); /* point to last word of external number */ +/* get the sign bit */ +if( *p & 0x8000 ) + *q++ = 0xffff; +else + *q++ = 0; +/* get the exponent */ +*q = *p--; +*q++ &= 0x7fff; /* delete the sign bit */ +#ifdef INFINITY +if( (*(q-1) & 0x7fff) == 0x7fff ) + { +#ifdef NANS + if( eisnan(a) ) + { + *q++ = 0; + for( i=3; i b +; 0 if a == b +; -1 if a < b +*/ +static int ecmpm(register short unsigned int *a, register short unsigned int *b) +{ +int i; + +a += M; /* skip up to significand area */ +b += M; +for( i=M; i *(--b) ) + return(1); +else + return(-1); +} + + +/* +; Shift significand down by 1 bit +*/ + +static void eshdn1(register short unsigned int *x) +{ +register unsigned short bits; +int i; + +x += M; /* point to significand area */ + +bits = 0; +for( i=M; i>= 1; + if( bits & 2 ) + *x |= 0x8000; + bits <<= 1; + ++x; + } +} + + + +/* +; Shift significand up by 1 bit +*/ + +static void eshup1(register short unsigned int *x) +{ +register unsigned short bits; +int i; + +x += NI-1; +bits = 0; + +for( i=M; i>= 8; + *x |= oldbyt; + oldbyt = newbyt; + ++x; + } +} + +/* +; Shift significand up by 8 bits +*/ + +static void eshup8(register short unsigned int *x) +{ +int i; +register unsigned short newbyt, oldbyt; + +x += NI-1; +oldbyt = 0; + +for( i=M; i> 8; + *x <<= 8; + *x |= oldbyt; + oldbyt = newbyt; + --x; + } +} + +/* +; Shift significand up by 16 bits +*/ + +static void eshup6(register short unsigned int *x) +{ +int i; +register unsigned short *p; + +p = x + M; +x += M + 1; + +for( i=M; i> 16) + (m >> 16) + *pp; + *pp = (unsigned short )carry; + *(pp-1) = carry >> 16; + } + } +for( i=M; iequot; + +p = &equot[0]; +*p++ = num[0]; +*p++ = num[1]; + +for( i=M; i tdenm ) + tquot = 0xffff; +*/ + /* Multiply denominator by trial quotient digit. */ + m16m( tquot, den, tprod ); + /* The quotient digit may have been overestimated. */ + if( ecmpm( tprod, num ) > 0 ) + { + tquot -= 1; + esubm( den, tprod ); + if( ecmpm( tprod, num ) > 0 ) + { + tquot -= 1; + esubm( den, tprod ); + } + } +/* + if( ecmpm( tprod, num ) > 0 ) + { + eshow( "tprod", tprod ); + eshow( "num ", num ); + printf( "tnum = %08lx, tden = %04x, tquot = %04x\n", + tnum, den[M+1], tquot ); + } +*/ + esubm( tprod, num ); +/* + if( ecmpm( num, den ) >= 0 ) + { + eshow( "num ", num ); + eshow( "den ", den ); + printf( "tnum = %08lx, tden = %04x, tquot = %04x\n", + tnum, den[M+1], tquot ); + } +*/ + equot[i] = tquot; + eshup6(num); + } +/* test for nonzero remainder after roundoff bit */ +p = &num[M]; +j = 0; +for( i=M; iequot; + +equot[0] = b[0]; +equot[1] = b[1]; +for( i=M; i NBITS ) + { + ecleazs( s ); + return; + } +#endif +exp -= j; +#ifndef INFINITY +if( exp >= 32767L ) + goto overf; +#else +if( (j > NBITS) && (exp < 32767L) ) + { + ecleazs( s ); + return; + } +#endif +if( exp < 0L ) + { + if( exp > (long )(-NBITS-1) ) + { + j = (int )exp; + i = eshift( s, j ); + if( i ) + lost = 1; + } + else + { + ecleazs( s ); + return; + } + } +/* Round off, unless told not to by rcntrl. */ +if( rcntrl == 0 ) + goto mdfin; +/* Set up rounding parameters if the control register changed. */ +if( ldp->rndprc != ldp->rlast ) + { + ecleaz( ldp->rbit ); + switch( ldp->rndprc ) + { + default: + case NBITS: + ldp->rw = NI-1; /* low guard word */ + ldp->rmsk = 0xffff; + ldp->rmbit = 0x8000; + ldp->rebit = 1; + ldp->re = ldp->rw - 1; + break; + case 113: + ldp->rw = 10; + ldp->rmsk = 0x7fff; + ldp->rmbit = 0x4000; + ldp->rebit = 0x8000; + ldp->re = ldp->rw; + break; + case 64: + ldp->rw = 7; + ldp->rmsk = 0xffff; + ldp->rmbit = 0x8000; + ldp->rebit = 1; + ldp->re = ldp->rw-1; + break; +/* For DEC arithmetic */ + case 56: + ldp->rw = 6; + ldp->rmsk = 0xff; + ldp->rmbit = 0x80; + ldp->rebit = 0x100; + ldp->re = ldp->rw; + break; + case 53: + ldp->rw = 6; + ldp->rmsk = 0x7ff; + ldp->rmbit = 0x0400; + ldp->rebit = 0x800; + ldp->re = ldp->rw; + break; + case 24: + ldp->rw = 4; + ldp->rmsk = 0xff; + ldp->rmbit = 0x80; + ldp->rebit = 0x100; + ldp->re = ldp->rw; + break; + } + ldp->rbit[ldp->re] = ldp->rebit; + ldp->rlast = ldp->rndprc; + } + +/* Shift down 1 temporarily if the data structure has an implied + * most significant bit and the number is denormal. + * For rndprc = 64 or NBITS, there is no implied bit. + * But Intel long double denormals lose one bit of significance even so. + */ +#if IBMPC +if( (exp <= 0) && (ldp->rndprc != NBITS) ) +#else +if( (exp <= 0) && (ldp->rndprc != 64) && (ldp->rndprc != NBITS) ) +#endif + { + lost |= s[NI-1] & 1; + eshdn1(s); + } +/* Clear out all bits below the rounding bit, + * remembering in r if any were nonzero. + */ +r = s[ldp->rw] & ldp->rmsk; +if( ldp->rndprc < NBITS ) + { + i = ldp->rw + 1; + while( i < NI ) + { + if( s[i] ) + r |= 1; + s[i] = 0; + ++i; + } + } +s[ldp->rw] &= ~ldp->rmsk; +if( (r & ldp->rmbit) != 0 ) + { + if( r == ldp->rmbit ) + { + if( lost == 0 ) + { /* round to even */ + if( (s[ldp->re] & ldp->rebit) == 0 ) + goto mddone; + } + else + { + if( subflg != 0 ) + goto mddone; + } + } + eaddm( ldp->rbit, s ); + } +mddone: +#if IBMPC +if( (exp <= 0) && (ldp->rndprc != NBITS) ) +#else +if( (exp <= 0) && (ldp->rndprc != 64) && (ldp->rndprc != NBITS) ) +#endif + { + eshup1(s); + } +if( s[2] != 0 ) + { /* overflow on roundoff */ + eshdn1(s); + exp += 1; + } +mdfin: +s[NI-1] = 0; +if( exp >= 32767L ) + { +#ifndef INFINITY +overf: +#endif +#ifdef INFINITY + s[1] = 32767; + for( i=2; irndprc < 64) || (ldp->rndprc == 113) ) + { + s[ldp->rw] &= ~ldp->rmsk; + if( ldp->rndprc == 24 ) + { + s[5] = 0; + s[6] = 0; + } + } +#endif + return; + } +if( exp < 0 ) + s[1] = 0; +else + s[1] = (unsigned short )exp; +} + + + +/* +; Subtract external format numbers. +; +; unsigned short a[NE], b[NE], c[NE]; +; LDPARMS *ldp; +; esub( a, b, c, ldp ); c = b - a +*/ + +static void esub(short unsigned int *a, short unsigned int *b, short unsigned int *c, LDPARMS *ldp) +{ + +#ifdef NANS +if( eisnan(a) ) + { + emov (a, c); + return; + } +if( eisnan(b) ) + { + emov(b,c); + return; + } +/* Infinity minus infinity is a NaN. + * Test for subtracting infinities of the same sign. + */ +if( eisinf(a) && eisinf(b) && ((eisneg (a) ^ eisneg (b)) == 0)) + { + mtherr( "esub", DOMAIN ); + enan( c, NBITS ); + return; + } +#endif +eadd1( a, b, c, 1, ldp ); +} + + + +static void eadd1(short unsigned int *a, short unsigned int *b, short unsigned int *c, int subflg, LDPARMS *ldp) +{ +unsigned short ai[NI], bi[NI], ci[NI]; +int i, lost, j, k; +long lt, lta, ltb; + +#ifdef INFINITY +if( eisinf(a) ) + { + emov(a,c); + if( subflg ) + eneg(c); + return; + } +if( eisinf(b) ) + { + emov(b,c); + return; + } +#endif +emovi( a, ai ); +emovi( b, bi ); +if( subflg ) + ai[0] = ~ai[0]; + +/* compare exponents */ +lta = ai[E]; +ltb = bi[E]; +lt = lta - ltb; +if( lt > 0L ) + { /* put the larger number in bi */ + emovz( bi, ci ); + emovz( ai, bi ); + emovz( ci, ai ); + ltb = bi[E]; + lt = -lt; + } +lost = 0; +if( lt != 0L ) + { + if( lt < (long )(-NBITS-1) ) + goto done; /* answer same as larger addend */ + k = (int )lt; + lost = eshift( ai, k ); /* shift the smaller number down */ + } +else + { +/* exponents were the same, so must compare significands */ + i = ecmpm( ai, bi ); + if( i == 0 ) + { /* the numbers are identical in magnitude */ + /* if different signs, result is zero */ + if( ai[0] != bi[0] ) + { + eclear(c); + return; + } + /* if same sign, result is double */ + /* double denomalized tiny number */ + if( (bi[E] == 0) && ((bi[3] & 0x8000) == 0) ) + { + eshup1( bi ); + goto done; + } + /* add 1 to exponent unless both are zero! */ + for( j=1; j 0 ) + { /* put the larger number in bi */ + emovz( bi, ci ); + emovz( ai, bi ); + emovz( ci, ai ); + } + } +if( ai[0] == bi[0] ) + { + eaddm( ai, bi ); + subflg = 0; + } +else + { + esubm( ai, bi ); + subflg = 1; + } +emdnorm( bi, lost, subflg, ltb, 64, ldp ); + +done: +emovo( bi, c, ldp ); +} + + + +/* +; Divide. +; +; unsigned short a[NE], b[NE], c[NE]; +; LDPARMS *ldp; +; ediv( a, b, c, ldp ); c = b / a +*/ +static void ediv(short unsigned int *a, short unsigned int *b, short unsigned int *c, LDPARMS *ldp) +{ +unsigned short ai[NI], bi[NI]; +int i; +long lt, lta, ltb; + +#ifdef NANS +/* Return any NaN input. */ +if( eisnan(a) ) + { + emov(a,c); + return; + } +if( eisnan(b) ) + { + emov(b,c); + return; + } +/* Zero over zero, or infinity over infinity, is a NaN. */ +if( ((ecmp(a,ezero) == 0) && (ecmp(b,ezero) == 0)) + || (eisinf (a) && eisinf (b)) ) + { + mtherr( "ediv", DOMAIN ); + enan( c, NBITS ); + return; + } +#endif +/* Infinity over anything else is infinity. */ +#ifdef INFINITY +if( eisinf(b) ) + { + if( eisneg(a) ^ eisneg(b) ) + *(c+(NE-1)) = 0x8000; + else + *(c+(NE-1)) = 0; + einfin(c, ldp); + return; + } +if( eisinf(a) ) + { + eclear(c); + return; + } +#endif +emovi( a, ai ); +emovi( b, bi ); +lta = ai[E]; +ltb = bi[E]; +if( bi[E] == 0 ) + { /* See if numerator is zero. */ + for( i=1; i 64 +static void e113toe(short unsigned int *pe, short unsigned int *y, LDPARMS *ldp) +{ +register unsigned short r; +unsigned short *e, *p; +unsigned short yy[NI]; +int denorm, i; + +e = pe; +denorm = 0; +ecleaz(yy); +#ifdef IBMPC +e += 7; +#endif +r = *e; +yy[0] = 0; +if( r & 0x8000 ) + yy[0] = 0xffff; +r &= 0x7fff; +#ifdef INFINITY +if( r == 0x7fff ) + { +#ifdef NANS +#ifdef IBMPC + for( i=0; i<7; i++ ) + { + if( pe[i] != 0 ) + { + enan( y, NBITS ); + return; + } + } +#else /* !IBMPC */ + for( i=1; i<8; i++ ) + { + if( pe[i] != 0 ) + { + enan( y, NBITS ); + return; + } + } +#endif /* !IBMPC */ +#endif /* NANS */ + eclear( y ); + einfin( y, ldp ); + if( *e & 0x8000 ) + eneg(y); + return; + } +#endif /* INFINITY */ +yy[E] = r; +p = &yy[M + 1]; +#ifdef IBMPC +for( i=0; i<7; i++ ) + *p++ = *(--e); +#else /* IBMPC */ +++e; +for( i=0; i<7; i++ ) + *p++ = *e++; +#endif /* IBMPC */ +/* If denormal, remove the implied bit; else shift down 1. */ +if( r == 0 ) + { + yy[M] = 0; + } +else + { + yy[M] = 1; + eshift( yy, -1 ); + } +emovo(yy,y,ldp); +} + +/* move out internal format to ieee long double */ +static void toe113(short unsigned int *a, short unsigned int *b) +{ +register unsigned short *p, *q; +unsigned short i; + +#ifdef NANS +if( eiisnan(a) ) + { + enan( b, 113 ); + return; + } +#endif +p = a; +#ifdef MIEEE +q = b; +#else +q = b + 7; /* point to output exponent */ +#endif + +/* If not denormal, delete the implied bit. */ +if( a[E] != 0 ) + { + eshup1 (a); + } +/* combine sign and exponent */ +i = *p++; +#ifdef MIEEE +if( i ) + *q++ = *p++ | 0x8000; +else + *q++ = *p++; +#else +if( i ) + *q-- = *p++ | 0x8000; +else + *q-- = *p++; +#endif +/* skip over guard word */ +++p; +/* move the significand */ +#ifdef MIEEE +for (i = 0; i < 7; i++) + *q++ = *p++; +#else +for (i = 0; i < 7; i++) + *q-- = *p++; +#endif +} +#endif /* SIMD_LDBL_MANT_DIG > 64 */ + + +#if SIMD_LDBL_MANT_DIG == 64 +static void e64toe(short unsigned int *pe, short unsigned int *y, LDPARMS *ldp) +{ +unsigned short yy[NI]; +unsigned short *p, *q, *e; +int i; + +e = pe; +p = yy; + +for( i=0; i>= 4; +/* If zero exponent, then the significand is denormalized. + * So, take back the understood high significand bit. */ +if( r == 0 ) + { + denorm = 1; + yy[M] &= ~0x10; + } +r += EXONE - 01777; +yy[E] = r; +p = &yy[M+1]; +#ifdef IBMPC +*p++ = *(--e); +*p++ = *(--e); +*p++ = *(--e); +#else /* !IBMPC */ +++e; +*p++ = *e++; +*p++ = *e++; +*p++ = *e++; +#endif /* !IBMPC */ +(void )eshift( yy, -5 ); +if( denorm ) + { /* if zero exponent, then normalize the significand */ + if( (k = enormlz(yy)) > NBITS ) + ecleazs(yy); + else + yy[E] -= (unsigned short )(k-1); + } +emovo( yy, y, ldp ); +#endif /* !DEC */ +} + +/* +; e type to IEEE double precision +; double d; +; unsigned short x[NE]; +; etoe53( x, &d ); +*/ + +#ifdef DEC + +static void etoe53( x, e ) +unsigned short *x, *e; +{ +etodec( x, e ); /* see etodec.c */ +} + +static void toe53( x, y ) +unsigned short *x, *y; +{ +todec( x, y ); +} + +#else + +static void toe53(short unsigned int *x, short unsigned int *y) +{ +unsigned short i; +unsigned short *p; + + +#ifdef NANS +if( eiisnan(x) ) + { + enan( y, 53 ); + return; + } +#endif +p = &x[0]; +#ifdef IBMPC +y += 3; +#endif +#ifdef DEC +y += 3; +#endif +*y = 0; /* output high order */ +if( *p++ ) + *y = 0x8000; /* output sign bit */ + +i = *p++; +if( i >= (unsigned int )2047 ) + { /* Saturate at largest number less than infinity. */ +#ifdef INFINITY + *y |= 0x7ff0; +#ifdef IBMPC + *(--y) = 0; + *(--y) = 0; + *(--y) = 0; +#else /* !IBMPC */ + ++y; + *y++ = 0; + *y++ = 0; + *y++ = 0; +#endif /* IBMPC */ +#else /* !INFINITY */ + *y |= (unsigned short )0x7fef; +#ifdef IBMPC + *(--y) = 0xffff; + *(--y) = 0xffff; + *(--y) = 0xffff; +#else /* !IBMPC */ + ++y; + *y++ = 0xffff; + *y++ = 0xffff; + *y++ = 0xffff; +#endif +#endif /* !INFINITY */ + return; + } +if( i == 0 ) + { + (void )eshift( x, 4 ); + } +else + { + i <<= 4; + (void )eshift( x, 5 ); + } +i |= *p++ & (unsigned short )0x0f; /* *p = xi[M] */ +*y |= (unsigned short )i; /* high order output already has sign bit set */ +#ifdef IBMPC +*(--y) = *p++; +*(--y) = *p++; +*(--y) = *p; +#else /* !IBMPC */ +++y; +*y++ = *p++; +*y++ = *p++; +*y++ = *p++; +#endif /* !IBMPC */ +} + +#endif /* not DEC */ +#endif /* SIMD_LDBL_MANT_DIG == 53 */ + +#if SIMD_LDBL_MANT_DIG == 24 +/* +; Convert IEEE single precision to e type +; float d; +; unsigned short x[N+2]; +; dtox( &d, x ); +*/ +void e24toe( short unsigned int *pe, short unsigned int *y, LDPARMS *ldp ) +{ +register unsigned short r; +register unsigned short *p, *e; +unsigned short yy[NI]; +int denorm, k; + +e = pe; +denorm = 0; /* flag if denormalized number */ +ecleaz(yy); +#ifdef IBMPC +e += 1; +#endif +#ifdef DEC +e += 1; +#endif +r = *e; +yy[0] = 0; +if( r & 0x8000 ) + yy[0] = 0xffff; +yy[M] = (r & 0x7f) | 0200; +r &= ~0x807f; /* strip sign and 7 significand bits */ +#ifdef INFINITY +if( r == 0x7f80 ) + { +#ifdef NANS +#ifdef MIEEE + if( ((pe[0] & 0x7f) != 0) || (pe[1] != 0) ) + { + enan( y, NBITS ); + return; + } +#else /* !MIEEE */ + if( ((pe[1] & 0x7f) != 0) || (pe[0] != 0) ) + { + enan( y, NBITS ); + return; + } +#endif /* !MIEEE */ +#endif /* NANS */ + eclear( y ); + einfin( y, ldp ); + if( yy[0] ) + eneg(y); + return; + } +#endif +r >>= 7; +/* If zero exponent, then the significand is denormalized. + * So, take back the understood high significand bit. */ +if( r == 0 ) + { + denorm = 1; + yy[M] &= ~0200; + } +r += EXONE - 0177; +yy[E] = r; +p = &yy[M+1]; +#ifdef IBMPC +*p++ = *(--e); +#endif +#ifdef DEC +*p++ = *(--e); +#endif +#ifdef MIEEE +++e; +*p++ = *e++; +#endif +(void )eshift( yy, -8 ); +if( denorm ) + { /* if zero exponent, then normalize the significand */ + if( (k = enormlz(yy)) > NBITS ) + ecleazs(yy); + else + yy[E] -= (unsigned short )(k-1); + } +emovo( yy, y, ldp ); +} + +static void toe24(short unsigned int *x, short unsigned int *y) +{ +unsigned short i; +unsigned short *p; + +#ifdef NANS +if( eiisnan(x) ) + { + enan( y, 24 ); + return; + } +#endif +p = &x[0]; +#ifdef IBMPC +y += 1; +#endif +#ifdef DEC +y += 1; +#endif +*y = 0; /* output high order */ +if( *p++ ) + *y = 0x8000; /* output sign bit */ + +i = *p++; +if( i >= 255 ) + { /* Saturate at largest number less than infinity. */ +#ifdef INFINITY + *y |= (unsigned short )0x7f80; +#ifdef IBMPC + *(--y) = 0; +#endif +#ifdef DEC + *(--y) = 0; +#endif +#ifdef MIEEE + ++y; + *y = 0; +#endif +#else /* !INFINITY */ + *y |= (unsigned short )0x7f7f; +#ifdef IBMPC + *(--y) = 0xffff; +#endif +#ifdef DEC + *(--y) = 0xffff; +#endif +#ifdef MIEEE + ++y; + *y = 0xffff; +#endif +#endif /* !INFINITY */ + return; + } +if( i == 0 ) + { + (void )eshift( x, 7 ); + } +else + { + i <<= 7; + (void )eshift( x, 8 ); + } +i |= *p++ & (unsigned short )0x7f; /* *p = xi[M] */ +*y |= i; /* high order output already has sign bit set */ +#ifdef IBMPC +*(--y) = *p; +#endif +#ifdef DEC +*(--y) = *p; +#endif +#ifdef MIEEE +++y; +*y = *p; +#endif +} +#endif /* SIMD_LDBL_MANT_DIG == 24 */ + +/* Compare two e type numbers. + * + * unsigned short a[NE], b[NE]; + * ecmp( a, b ); + * + * returns +1 if a > b + * 0 if a == b + * -1 if a < b + * -2 if either a or b is a NaN. + */ +static int ecmp(short unsigned int *a, short unsigned int *b) +{ +unsigned short ai[NI], bi[NI]; +register unsigned short *p, *q; +register int i; +int msign; + +#ifdef NANS +if (eisnan (a) || eisnan (b)) + return( -2 ); +#endif +emovi( a, ai ); +p = ai; +emovi( b, bi ); +q = bi; + +if( *p != *q ) + { /* the signs are different */ +/* -0 equals + 0 */ + for( i=1; i 0 ); + +return(0); /* equality */ + + + +diff: + +if( *(--p) > *(--q) ) + return( msign ); /* p is bigger */ +else + return( -msign ); /* p is littler */ +} + + +/* +; Shift significand +; +; Shifts significand area up or down by the number of bits +; given by the variable sc. +*/ +static int eshift(short unsigned int *x, int sc) +{ +unsigned short lost; +unsigned short *p; + +if( sc == 0 ) + return( 0 ); + +lost = 0; +p = x + NI-1; + +if( sc < 0 ) + { + sc = -sc; + while( sc >= 16 ) + { + lost |= *p; /* remember lost bits */ + eshdn6(x); + sc -= 16; + } + + while( sc >= 8 ) + { + lost |= *p & 0xff; + eshdn8(x); + sc -= 8; + } + + while( sc > 0 ) + { + lost |= *p & 1; + eshdn1(x); + sc -= 1; + } + } +else + { + while( sc >= 16 ) + { + eshup6(x); + sc -= 16; + } + + while( sc >= 8 ) + { + eshup8(x); + sc -= 8; + } + + while( sc > 0 ) + { + eshup1(x); + sc -= 1; + } + } +if( lost ) + lost = 1; +return( (int )lost ); +} + + + +/* +; normalize +; +; Shift normalizes the significand area pointed to by argument +; shift count (up = positive) is returned. +*/ +static int enormlz(short unsigned int *x) +{ +register unsigned short *p; +int sc; + +sc = 0; +p = &x[M]; +if( *p != 0 ) + goto normdn; +++p; +if( *p & 0x8000 ) + return( 0 ); /* already normalized */ +while( *p == 0 ) + { + eshup6(x); + sc += 16; +/* With guard word, there are NBITS+16 bits available. + * return true if all are zero. + */ + if( sc > NBITS ) + return( sc ); + } +/* see if high byte is zero */ +while( (*p & 0xff00) == 0 ) + { + eshup8(x); + sc += 8; + } +/* now shift 1 bit at a time */ +while( (*p & 0x8000) == 0) + { + eshup1(x); + sc += 1; + if( sc > (NBITS+16) ) + { + mtherr( "enormlz", UNDERFLOW ); + return( sc ); + } + } +return( sc ); + +/* Normalize by shifting down out of the high guard word + of the significand */ +normdn: + +if( *p & 0xff00 ) + { + eshdn8(x); + sc -= 8; + } +while( *p != 0 ) + { + eshdn1(x); + sc -= 1; + + if( sc < -NBITS ) + { + mtherr( "enormlz", OVERFLOW ); + return( sc ); + } + } +return( sc ); +} + + + + +/* Convert e type number to decimal format ASCII string. + * The constants are for 64 bit precision. + */ + +#define NTEN 12 +#define MAXP 4096 + +#if NE == 10 +static unsigned short etens[NTEN + 1][NE] = +{ + {0x6576, 0x4a92, 0x804a, 0x153f, + 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */ + {0x6a32, 0xce52, 0x329a, 0x28ce, + 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */ + {0x526c, 0x50ce, 0xf18b, 0x3d28, + 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,}, + {0x9c66, 0x58f8, 0xbc50, 0x5c54, + 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,}, + {0x851e, 0xeab7, 0x98fe, 0x901b, + 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,}, + {0x0235, 0x0137, 0x36b1, 0x336c, + 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,}, + {0x50f8, 0x25fb, 0xc76b, 0x6b71, + 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */ +}; + +static unsigned short emtens[NTEN + 1][NE] = +{ + {0x2030, 0xcffc, 0xa1c3, 0x8123, + 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */ + {0x8264, 0xd2cb, 0xf2ea, 0x12d4, + 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */ + {0xf53f, 0xf698, 0x6bd3, 0x0158, + 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,}, + {0xe731, 0x04d4, 0xe3f2, 0xd332, + 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,}, + {0xa23e, 0x5308, 0xfefb, 0x1155, + 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,}, + {0xe26d, 0xdbde, 0xd05d, 0xb3f6, + 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,}, + {0x2a20, 0x6224, 0x47b3, 0x98d7, + 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,}, + {0x0b5b, 0x4af2, 0xa581, 0x18ed, + 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,}, + {0xbf71, 0xa9b3, 0x7989, 0xbe68, + 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,}, + {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b, + 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,}, + {0xc155, 0xa4a8, 0x404e, 0x6113, + 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,}, + {0xd70a, 0x70a3, 0x0a3d, 0xa3d7, + 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,}, + {0xcccd, 0xcccc, 0xcccc, 0xcccc, + 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */ +}; +#else +static unsigned short etens[NTEN+1][NE] = { +{0xc94c,0x979a,0x8a20,0x5202,0xc460,0x7525,},/* 10**4096 */ +{0xa74d,0x5de4,0xc53d,0x3b5d,0x9e8b,0x5a92,},/* 10**2048 */ +{0x650d,0x0c17,0x8175,0x7586,0xc976,0x4d48,}, +{0xcc65,0x91c6,0xa60e,0xa0ae,0xe319,0x46a3,}, +{0xddbc,0xde8d,0x9df9,0xebfb,0xaa7e,0x4351,}, +{0xc66f,0x8cdf,0x80e9,0x47c9,0x93ba,0x41a8,}, +{0x3cbf,0xa6d5,0xffcf,0x1f49,0xc278,0x40d3,}, +{0xf020,0xb59d,0x2b70,0xada8,0x9dc5,0x4069,}, +{0x0000,0x0000,0x0400,0xc9bf,0x8e1b,0x4034,}, +{0x0000,0x0000,0x0000,0x2000,0xbebc,0x4019,}, +{0x0000,0x0000,0x0000,0x0000,0x9c40,0x400c,}, +{0x0000,0x0000,0x0000,0x0000,0xc800,0x4005,}, +{0x0000,0x0000,0x0000,0x0000,0xa000,0x4002,}, /* 10**1 */ +}; + +static unsigned short emtens[NTEN+1][NE] = { +{0x2de4,0x9fde,0xd2ce,0x04c8,0xa6dd,0x0ad8,}, /* 10**-4096 */ +{0x4925,0x2de4,0x3436,0x534f,0xceae,0x256b,}, /* 10**-2048 */ +{0x87a6,0xc0bd,0xda57,0x82a5,0xa2a6,0x32b5,}, +{0x7133,0xd21c,0xdb23,0xee32,0x9049,0x395a,}, +{0xfa91,0x1939,0x637a,0x4325,0xc031,0x3cac,}, +{0xac7d,0xe4a0,0x64bc,0x467c,0xddd0,0x3e55,}, +{0x3f24,0xe9a5,0xa539,0xea27,0xa87f,0x3f2a,}, +{0x67de,0x94ba,0x4539,0x1ead,0xcfb1,0x3f94,}, +{0x4c2f,0xe15b,0xc44d,0x94be,0xe695,0x3fc9,}, +{0xfdc2,0xcefc,0x8461,0x7711,0xabcc,0x3fe4,}, +{0xd3c3,0x652b,0xe219,0x1758,0xd1b7,0x3ff1,}, +{0x3d71,0xd70a,0x70a3,0x0a3d,0xa3d7,0x3ff8,}, +{0xcccd,0xcccc,0xcccc,0xcccc,0xcccc,0x3ffb,}, /* 10**-1 */ +}; +#endif + + + +/* ASCII string outputs for unix */ + + +#if 0 +void _IO_ldtostr(x, string, ndigs, flags, fmt) +long double *x; +char *string; +int ndigs; +int flags; +char fmt; +{ +unsigned short w[NI]; +char *t, *u; +LDPARMS rnd; +LDPARMS *ldp = &rnd; + +rnd.rlast = -1; +rnd.rndprc = NBITS; + +if (sizeof(long double) == 16) + e113toe( (unsigned short *)x, w, ldp ); +else + e64toe( (unsigned short *)x, w, ldp ); + +etoasc( w, string, ndigs, -1, ldp ); +if( ndigs == 0 && flags == 0 ) + { + /* Delete the decimal point unless alternate format. */ + t = string; + while( *t != '.' ) + ++t; + u = t + 1; + while( *t != '\0' ) + *t++ = *u++; + } +if (*string == ' ') + { + t = string; + u = t + 1; + while( *t != '\0' ) + *t++ = *u++; + } +if (fmt == 'E') + { + t = string; + while( *t != 'e' ) + ++t; + *t = 'E'; + } +} + +#endif + +/* This routine will not return more than NDEC+1 digits. */ + +char * +_simdldtoa_r (struct _reent *ptr, LONG_DOUBLE_UNION *d, int mode, int ndigits, int *decpt, + int *sign, char **rve) +{ +unsigned short e[NI]; +char *s, *p; +int i, j, k; +LDPARMS rnd; +LDPARMS *ldp = &rnd; +char *outstr; + +rnd.rlast = -1; +rnd.rndprc = NBITS; + + _REENT_CHECK_MP(ptr); + +/* reentrancy addition to use mprec storage pool */ +if (_REENT_MP_RESULT(ptr)) + { + _REENT_MP_RESULT(ptr)->_k = _REENT_MP_RESULT_K(ptr); + _REENT_MP_RESULT(ptr)->_maxwds = 1 << _REENT_MP_RESULT_K(ptr); + Bfree (ptr, _REENT_MP_RESULT(ptr)); + _REENT_MP_RESULT(ptr) = 0; + } + +#if SIMD_LDBL_MANT_DIG == 24 +e24toe( (unsigned short *)d, e, ldp ); +#elif SIMD_LDBL_MANT_DIG == 53 +e53toe( (unsigned short *)d, e, ldp ); +#elif SIMD_LDBL_MANT_DIG == 64 +e64toe( (unsigned short *)d, e, ldp ); +#else +e113toe( (unsigned short *)d, e, ldp ); +#endif + +if( eisneg(e) ) + *sign = 1; +else + *sign = 0; +/* Mode 3 is "f" format. */ +if( mode != 3 ) + ndigits -= 1; +/* Mode 0 is for %.999 format, which is supposed to give a + minimum length string that will convert back to the same binary value. + For now, just ask for 20 digits which is enough but sometimes too many. */ +if( mode == 0 ) + ndigits = 20; + +/* reentrancy addition to use mprec storage pool */ +/* we want to have enough space to hold the formatted result */ +i = ndigits + (mode == 3 ? (MAX_EXP_DIGITS + 1) : 1); +j = sizeof (__ULong); +for (_REENT_MP_RESULT_K(ptr) = 0; sizeof (_Bigint) - sizeof (__ULong) + j <= (unsigned)i; j <<= 1) + _REENT_MP_RESULT_K(ptr)++; +_REENT_MP_RESULT(ptr) = Balloc (ptr, _REENT_MP_RESULT_K(ptr)); +outstr = (char *)_REENT_MP_RESULT(ptr); + +/* This sanity limit must agree with the corresponding one in etoasc, to + keep straight the returned value of outexpon. */ +if( ndigits > NDEC ) + ndigits = NDEC; + +etoasc( e, outstr, ndigits, mode, ldp ); +s = outstr; +if( eisinf(e) || eisnan(e) ) + { + *decpt = 9999; + goto stripspaces; + } +*decpt = ldp->outexpon + 1; + +/* Transform the string returned by etoasc into what the caller wants. */ + +/* Look for decimal point and delete it from the string. */ +s = outstr; +while( *s != '\0' ) + { + if( *s == '.' ) + goto yesdecpt; + ++s; + } +goto nodecpt; + +yesdecpt: + +/* Delete the decimal point. */ +while( *s != '\0' ) + { + *s = *(s+1); + ++s; + } + +nodecpt: + +/* Back up over the exponent field. */ +while( *s != 'E' && s > outstr) + --s; +*s = '\0'; + +stripspaces: + +/* Strip leading spaces and sign. */ +p = outstr; +while( *p == ' ' || *p == '-') + ++p; + +/* Find new end of string. */ +s = outstr; +while( (*s++ = *p++) != '\0' ) + ; +--s; + +/* Strip trailing zeros. */ +if( mode == 2 ) + k = 1; +else if( ndigits > ldp->outexpon ) + k = ndigits; +else + k = ldp->outexpon; + +while( *(s-1) == '0' && ((s - outstr) > k)) + *(--s) = '\0'; + +/* In f format, flush small off-scale values to zero. + Rounding has been taken care of by etoasc. */ +if( mode == 3 && ((ndigits + ldp->outexpon) < 0)) + { + s = outstr; + *s = '\0'; + *decpt = 0; + } + +if( rve ) + *rve = s; +return outstr; +} + +/* Routine used to tell if long double is NaN or Infinity or regular number. + Returns: 0 = regular number + 1 = Nan + 2 = Infinity +*/ +int +_simdldcheck (LONG_DOUBLE_UNION *d) +{ +unsigned short e[NI]; +LDPARMS rnd; +LDPARMS *ldp = &rnd; + +rnd.rlast = -1; +rnd.rndprc = NBITS; + +#if SIMD_LDBL_MANT_DIG == 24 +e24toe( (unsigned short *)d, e, ldp ); +#elif SIMD_LDBL_MANT_DIG == 53 +e53toe( (unsigned short *)d, e, ldp ); +#elif SIMD_LDBL_MANT_DIG == 64 +e64toe( (unsigned short *)d, e, ldp ); +#else +e113toe( (unsigned short *)d, e, ldp ); +#endif + +if( (e[NE-1] & 0x7fff) == 0x7fff ) + { +#ifdef NANS + if( eisnan(e) ) + return( 1 ); +#endif + return( 2 ); + } +else + return( 0 ); +} /* _ldcheck */ + +static void etoasc(short unsigned int *x, char *string, int ndigits, int outformat, LDPARMS *ldp) +{ +long digit; +unsigned short y[NI], t[NI], u[NI], w[NI]; +unsigned short *p, *r, *ten; +unsigned short sign; +int i, j, k, expon, rndsav, ndigs; +char *s, *ss; +unsigned short m; +unsigned short *equot = ldp->equot; + +ndigs = ndigits; +rndsav = ldp->rndprc; +#ifdef NANS +if( eisnan(x) ) + { + sprintf( string, " NaN " ); + expon = 9999; + goto bxit; + } +#endif +ldp->rndprc = NBITS; /* set to full precision */ +emov( x, y ); /* retain external format */ +if( y[NE-1] & 0x8000 ) + { + sign = 0xffff; + y[NE-1] &= 0x7fff; + } +else + { + sign = 0; + } +expon = 0; +ten = &etens[NTEN][0]; +emov( eone, t ); +/* Test for zero exponent */ +if( y[NE-1] == 0 ) + { + for( k=0; k>= 1; + } +while( m != 0 ); + +/* Rescale from integer significand */ + u[NE-1] += y[NE-1] - (unsigned int )(EXONE + NBITS - 1); + emov( u, y ); +/* Find power of 10 */ + emov( eone, t ); + m = MAXP; + p = &etens[0][0]; + while( ecmp( ten, u ) <= 0 ) + { + if( ecmp( p, u ) <= 0 ) + { + ediv( p, u, u, ldp ); + emul( p, t, t, ldp ); + expon += (int )m; + } + m >>= 1; + if( m == 0 ) + break; + p += NE; + } + } +else + { /* Number is less than 1.0 */ +/* Pad significand with trailing decimal zeros. */ + if( y[NE-1] == 0 ) + { + while( (y[NE-2] & 0x8000) == 0 ) + { + emul( ten, y, y, ldp ); + expon -= 1; + } + } + else + { + emovi( y, w ); + for( i=0; i 0 ) + { + if( ecmp( p, w ) >= 0 ) + { + emul( r, w, w, ldp ); + emul( r, t, t, ldp ); + expon += k; + } + k /= 2; + if( k == 0 ) + break; + p += NE; + r += NE; + } + ediv( t, eone, t, ldp ); + } +isone: +/* Find the first (leading) digit. */ +emovi( t, w ); +emovz( w, t ); +emovi( y, w ); +emovz( w, y ); +eiremain( t, y, ldp ); +digit = equot[NI-1]; +while( (digit == 0) && (ecmp(y,ezero) != 0) ) + { + eshup1( y ); + emovz( y, u ); + eshup1( u ); + eshup1( u ); + eaddm( u, y ); + eiremain( t, y, ldp ); + digit = equot[NI-1]; + expon -= 1; + } +s = string; +if( sign ) + *s++ = '-'; +else + *s++ = ' '; +/* Examine number of digits requested by caller. */ +if( outformat == 3 ) + ndigs += expon; +/* +else if( ndigs < 0 ) + ndigs = 0; +*/ +if( ndigs > NDEC ) + ndigs = NDEC; +if( digit == 10 ) + { + *s++ = '1'; + *s++ = '.'; + if( ndigs > 0 ) + { + *s++ = '0'; + ndigs -= 1; + } + expon += 1; + if( ndigs < 0 ) + { + ss = s; + goto doexp; + } + } +else + { + *s++ = (char )digit + '0'; + *s++ = '.'; + } +/* Generate digits after the decimal point. */ +for( k=0; k<=ndigs; k++ ) + { +/* multiply current number by 10, without normalizing */ + eshup1( y ); + emovz( y, u ); + eshup1( u ); + eshup1( u ); + eaddm( u, y ); + eiremain( t, y, ldp ); + *s++ = (char )equot[NI-1] + '0'; + } +digit = equot[NI-1]; +--s; +ss = s; +/* round off the ASCII string */ +if( digit > 4 ) + { +/* Test for critical rounding case in ASCII output. */ + if( digit == 5 ) + { + emovo( y, t, ldp ); + if( ecmp(t,ezero) != 0 ) + goto roun; /* round to nearest */ + if( (*(s-1) & 1) == 0 ) + goto doexp; /* round to even */ + } +/* Round up and propagate carry-outs */ +roun: + --s; + k = *s & 0x7f; +/* Carry out to most significant digit? */ + if( ndigs < 0 ) + { + /* This will print like "1E-6". */ + *s = '1'; + expon += 1; + goto doexp; + } + else if( k == '.' ) + { + --s; + k = *s; + k += 1; + *s = (char )k; +/* Most significant digit carries to 10? */ + if( k > '9' ) + { + expon += 1; + *s = '1'; + } + goto doexp; + } +/* Round up and carry out from less significant digits */ + k += 1; + *s = (char )k; + if( k > '9' ) + { + *s = '0'; + goto roun; + } + } +doexp: +#ifdef __GO32__ +if( expon >= 0 ) + sprintf( ss, "e+%02d", expon ); +else + sprintf( ss, "e-%02d", -expon ); +#else + sprintf( ss, "E%d", expon ); +#endif +bxit: +ldp->rndprc = rndsav; +ldp->outexpon = expon; +} + + + + +/* +; ASCTOQ +; ASCTOQ.MAC LATEST REV: 11 JAN 84 +; SLM, 3 JAN 78 +; +; Convert ASCII string to quadruple precision floating point +; +; Numeric input is free field decimal number +; with max of 15 digits with or without +; decimal point entered as ASCII from teletype. +; Entering E after the number followed by a second +; number causes the second number to be interpreted +; as a power of 10 to be multiplied by the first number +; (i.e., "scientific" notation). +; +; Usage: +; asctoq( string, q ); +*/ + +void _simdstrtold (char *s, char **se, LONG_DOUBLE_UNION *x) +{ + LDPARMS rnd; + LDPARMS *ldp = &rnd; + int lenldstr; + + rnd.rlast = -1; + rnd.rndprc = NBITS; + + lenldstr = asctoeg( s, (unsigned short *)x, SIMD_LDBL_MANT_DIG, ldp ); + if (se) + *se = s + lenldstr; +} + +#define REASONABLE_LEN 200 + +static int +asctoeg(char *ss, short unsigned int *y, int oprec, LDPARMS *ldp) +{ +unsigned short yy[NI], xt[NI], tt[NI]; +int esign, decflg, sgnflg, nexp, exp, prec, lost; +int k, trail, c, rndsav; +long lexp; +unsigned short nsign, *p; +char *sp, *s, *lstr; +int lenldstr; +int mflag = 0; +char tmpstr[REASONABLE_LEN]; + +/* Copy the input string. */ +c = strlen (ss) + 2; +if (c <= REASONABLE_LEN) + lstr = tmpstr; +else + { + lstr = (char *) calloc (c, 1); + mflag = 1; + } +s = ss; +lenldstr = 0; +while( *s == ' ' ) /* skip leading spaces */ + { + ++s; + ++lenldstr; + } +sp = lstr; +for( k=0; krndprc; +ldp->rndprc = NBITS; /* Set to full precision */ +lost = 0; +nsign = 0; +decflg = 0; +sgnflg = 0; +nexp = 0; +exp = 0; +prec = 0; +ecleaz( yy ); +trail = 0; + +nxtcom: +k = *s - '0'; +if( (k >= 0) && (k <= 9) ) + { +/* Ignore leading zeros */ + if( (prec == 0) && (decflg == 0) && (k == 0) ) + goto donchr; +/* Identify and strip trailing zeros after the decimal point. */ + if( (trail == 0) && (decflg != 0) ) + { + sp = s; + while( (*sp >= '0') && (*sp <= '9') ) + ++sp; +/* Check for syntax error */ + c = *sp & 0x7f; + if( (c != 'e') && (c != 'E') && (c != '\0') + && (c != '\n') && (c != '\r') && (c != ' ') + && (c != ',') ) + goto error; + --sp; + while( *sp == '0' ) + *sp-- = 'z'; + trail = 1; + if( *s == 'z' ) + goto donchr; + } +/* If enough digits were given to more than fill up the yy register, + * continuing until overflow into the high guard word yy[2] + * guarantees that there will be a roundoff bit at the top + * of the low guard word after normalization. + */ + if( yy[2] == 0 ) + { + if( decflg ) + nexp += 1; /* count digits after decimal point */ + eshup1( yy ); /* multiply current number by 10 */ + emovz( yy, xt ); + eshup1( xt ); + eshup1( xt ); + eaddm( xt, yy ); + ecleaz( xt ); + xt[NI-2] = (unsigned short )k; + eaddm( xt, yy ); + } + else + { + /* Mark any lost non-zero digit. */ + lost |= k; + /* Count lost digits before the decimal point. */ + if (decflg == 0) + nexp -= 1; + } + prec += 1; + goto donchr; + } + +switch( *s ) + { + case 'z': + break; + case 'E': + case 'e': + goto expnt; + case '.': /* decimal point */ + if( decflg ) + goto error; + ++decflg; + break; + case '-': + nsign = 0xffff; + if( sgnflg ) + goto error; + ++sgnflg; + break; + case '+': + if( sgnflg ) + goto error; + ++sgnflg; + break; + case ',': + case ' ': + case '\0': + case '\n': + case '\r': + goto daldone; + case 'i': + case 'I': + goto infinite; + default: + error: +#ifdef NANS + enan( yy, NI*16 ); +#else + mtherr( "asctoe", DOMAIN ); + ecleaz(yy); +#endif + goto aexit; + } +donchr: +++s; +goto nxtcom; + +/* Exponent interpretation */ +expnt: + +esign = 1; +exp = 0; +++s; +/* check for + or - */ +if( *s == '-' ) + { + esign = -1; + ++s; + } +if( *s == '+' ) + ++s; +while( (*s >= '0') && (*s <= '9') ) + { + exp *= 10; + exp += *s++ - '0'; + if (exp > 4977) + { + if (esign < 0) + goto zero; + else + goto infinite; + } + } +if( esign < 0 ) + exp = -exp; +if( exp > 4932 ) + { +infinite: + ecleaz(yy); + yy[E] = 0x7fff; /* infinity */ + goto aexit; + } +if( exp < -4977 ) + { +zero: + ecleaz(yy); + goto aexit; + } + +daldone: +nexp = exp - nexp; +/* Pad trailing zeros to minimize power of 10, per IEEE spec. */ +while( (nexp > 0) && (yy[2] == 0) ) + { + emovz( yy, xt ); + eshup1( xt ); + eshup1( xt ); + eaddm( yy, xt ); + eshup1( xt ); + if( xt[2] != 0 ) + break; + nexp -= 1; + emovz( xt, yy ); + } +if( (k = enormlz(yy)) > NBITS ) + { + ecleaz(yy); + goto aexit; + } +lexp = (EXONE - 1 + NBITS) - k; +emdnorm( yy, lost, 0, lexp, 64, ldp ); +/* convert to external format */ + + +/* Multiply by 10**nexp. If precision is 64 bits, + * the maximum relative error incurred in forming 10**n + * for 0 <= n <= 324 is 8.2e-20, at 10**180. + * For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947. + * For 0 >= n >= -999, it is -1.55e-19 at 10**-435. + */ +lexp = yy[E]; +if( nexp == 0 ) + { + k = 0; + goto expdon; + } +esign = 1; +if( nexp < 0 ) + { + nexp = -nexp; + esign = -1; + if( nexp > 4096 ) + { /* Punt. Can't handle this without 2 divides. */ + emovi( etens[0], tt ); + lexp -= tt[E]; + k = edivm( tt, yy, ldp ); + lexp += EXONE; + nexp -= 4096; + } + } +p = &etens[NTEN][0]; +emov( eone, xt ); +exp = 1; +do + { + if( exp & nexp ) + emul( p, xt, xt, ldp ); + p -= NE; + exp = exp + exp; + } +while( exp <= MAXP ); + +emovi( xt, tt ); +if( esign < 0 ) + { + lexp -= tt[E]; + k = edivm( tt, yy, ldp ); + lexp += EXONE; + } +else + { + lexp += tt[E]; + k = emulm( tt, yy, ldp ); + lexp -= EXONE - 1; + } + +expdon: + +/* Round and convert directly to the destination type */ +if( oprec == 53 ) + lexp -= EXONE - 0x3ff; +else if( oprec == 24 ) + lexp -= EXONE - 0177; +#ifdef DEC +else if( oprec == 56 ) + lexp -= EXONE - 0201; +#endif +ldp->rndprc = oprec; +emdnorm( yy, k, 0, lexp, 64, ldp ); + +aexit: + +ldp->rndprc = rndsav; +yy[0] = nsign; +switch( oprec ) + { +#ifdef DEC + case 56: + todec( yy, y ); /* see etodec.c */ + break; +#endif +#if SIMD_LDBL_MANT_DIG == 53 + case 53: + toe53( yy, y ); + break; +#elif SIMD_LDBL_MANT_DIG == 24 + case 24: + toe24( yy, y ); + break; +#elif SIMD_LDBL_MANT_DIG == 64 + case 64: + toe64( yy, y ); + break; +#elif SIMD_LDBL_MANT_DIG == 113 + case 113: + toe113( yy, y ); + break; +#else + case NBITS: + emovo( yy, y, ldp ); + break; +#endif + } +lenldstr += s - lstr; +if (mflag) + free (lstr); +return lenldstr; +} + + + +/* y = largest integer not greater than x + * (truncated toward minus infinity) + * + * unsigned short x[NE], y[NE] + * LDPARMS *ldp + * + * efloor( x, y, ldp ); + */ +static unsigned short bmask[] = { +0xffff, +0xfffe, +0xfffc, +0xfff8, +0xfff0, +0xffe0, +0xffc0, +0xff80, +0xff00, +0xfe00, +0xfc00, +0xf800, +0xf000, +0xe000, +0xc000, +0x8000, +0x0000, +}; + +static void efloor(short unsigned int *x, short unsigned int *y, LDPARMS *ldp) +{ +register unsigned short *p; +int e, expon, i; +unsigned short f[NE]; + +emov( x, f ); /* leave in external format */ +expon = (int )f[NE-1]; +e = (expon & 0x7fff) - (EXONE - 1); +if( e <= 0 ) + { + eclear(y); + goto isitneg; + } +/* number of bits to clear out */ +e = NBITS - e; +emov( f, y ); +if( e <= 0 ) + return; + +p = &y[0]; +while( e >= 16 ) + { + *p++ = 0; + e -= 16; + } +/* clear the remaining bits */ +*p &= bmask[e]; +/* truncate negatives toward minus infinity */ +isitneg: + +if( (unsigned short )expon & (unsigned short )0x8000 ) + { + for( i=0; iequot; + +ld = den[E]; +ld -= enormlz( den ); +ln = num[E]; +ln -= enormlz( num ); +ecleaz( equot ); +while( ln >= ld ) + { + if( ecmpm(den,num) <= 0 ) + { + esubm(den, num); + j = 1; + } + else + { + j = 0; + } + eshup1(equot); + equot[NI-1] |= j; + eshup1(num); + ln -= 1; + } +emdnorm( num, 0, 0, ln, 0, ldp ); +} + +/* NaN bit patterns + */ +#ifdef MIEEE +static unsigned short nan113[8] = { + 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; +static unsigned short nan64[6] = {0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; +static unsigned short nan53[4] = {0x7fff, 0xffff, 0xffff, 0xffff}; +static unsigned short nan24[2] = {0x7fff, 0xffff}; +#else /* !MIEEE */ +static unsigned short nan113[8] = {0, 0, 0, 0, 0, 0, 0x8000, 0x7fff}; +static unsigned short nan64[6] = {0, 0, 0, 0, 0xc000, 0x7fff}; +static unsigned short nan53[4] = {0, 0, 0, 0x7ff8}; +static unsigned short nan24[2] = {0, 0x7fc0}; +#endif /* !MIEEE */ + + +static void enan (short unsigned int *nan, int size) +{ +int i, n; +unsigned short *p; + +switch( size ) + { +#ifndef DEC + case 113: + n = 8; + p = nan113; + break; + + case 64: + n = 6; + p = nan64; + break; + + case 53: + n = 4; + p = nan53; + break; + + case 24: + n = 2; + p = nan24; + break; + + case NBITS: + for( i=0; i>, <>, <>---string to signed fixed point + +INDEX + strtosfix16 +INDEX + strtosfix32 +INDEX + strtosfix64 +INDEX + _strtosfix16_r +INDEX + _strtosfix32_r +INDEX + _strtosfix64_r + +SYNOPSIS + #include + __int16 strtosfix16 (const char *<[s]>, char **<[ptr]>); + + __int32 strtosfix32 (const char *<[s]>, char **<[ptr]>); + + __int64 strtosfix64 (const char *<[s]>, char **<[ptr]>); + + __int16 _strtosfix16_r (void *<[reent]>, + const char *<[s]>, char **<[ptr]>); + + __int32 _strtosfix32_r (void *<[reent]>, + const char *<[s]>, char **<[ptr]>); + + __int64 _strtosfix64_r (void *<[reent]>, + const char *<[s]>, char **<[ptr]>); + +DESCRIPTION + The function <> converts the string <<*<[s]>>> to + a fixed-point sign + 15-bits fraction representation. The function + follows the same rules as <>. + + The substring converted is the longest initial + subsequence of <[s]>, beginning with the first + non-whitespace character, that has the format: + .[+|-]<[digits]>[.][<[digits]>][(e|E)[+|-]<[digits]>] + The substring contains no characters if <[s]> is empty, consists + entirely of whitespace, or if the first non-whitespace + character is something other than <<+>>, <<->>, <<.>>, or a + digit. If the substring is empty, no conversion is done, and + the value of <[s]> is stored in <<*<[ptr]>>>. Otherwise, + the substring is converted, and a pointer to the final string + (which will contain at least the terminating null character of + <[s]>) is stored in <<*<[ptr]>>>. If you want no + assignment to <<*<[ptr]>>>, pass a null pointer as <[ptr]>. + + <> is identical to <> except that it + converts to fixed-point sign + 31-bits fraction representation. + <> is also similar, except that it converts + to fixed-point sign + 63-bit fraction format. + + The alternate functions <<_strtosfix16_r>>, <<_strtosfix32_r>>, + and <<_strtosfix64_r>> are reentrant versions. + The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS + The functions return the converted substring value, if any. If + no conversion can be performed, then 0 is returned. If the converted + value is a NaN, 0 is returned and errno is set to <>. + If the converted value exceeds the maximum positive fixed-point value, + the output value is saturated to the maximum value and <> is stored in + errno. If the converted value is less than the minimum fixed-point negative + value, then the output is saturated to the minimum value and <> is stored + in errno. Otherwise, the converted value is returned in the + specified fixed-point format. + +PORTABILITY + <>, <>, and <> are non-standard. + + The OS subroutines of <> are required. +*/ + +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "vfieeefp.h" + +/* + * Convert a string to a fixed-point (sign + 15-bits) value. + * + * Ignores `locale' stuff. + */ +__int16_t +_strtosfix16_r (struct _reent *rptr, + const char *nptr, + char **endptr) +{ + union double_union dbl; + unsigned long tmp, tmp2; + int exp, negexp, sign; + __int16_t result; + + dbl.d = _strtod_r (rptr, nptr, endptr); + + /* treat NAN as domain error, +/- infinity as saturation */ + if (!finite(dbl.d)) + { + if (isnan (dbl.d)) + { + _REENT_ERRNO(rptr) = EDOM; + return 0; + } + _REENT_ERRNO(rptr) = ERANGE; + if (word0(dbl) & Sign_bit) + return SHRT_MIN; + return SHRT_MAX; + } + + /* check for normal saturation */ + if (dbl.d >= 1.0) + { + _REENT_ERRNO(rptr) = ERANGE; + return SHRT_MAX; + } + else if (dbl.d < -1.0) + { + _REENT_ERRNO(rptr) = ERANGE; + return SHRT_MIN; + } + + /* otherwise we have normal number in range */ + + /* strip off sign and exponent */ + sign = word0(dbl) & Sign_bit; + exp = ((word0(dbl) & Exp_mask) >> Exp_shift) - Bias; + negexp = -exp; + if (negexp > 15) + return 0; + /* add in implicit normalized bit */ + tmp = word0(dbl) | Exp_msk1; + /* remove exponent and sign */ + tmp <<= Ebits; + if (negexp != 0) + { + /* perform rounding */ + tmp2 = tmp + (1 << (negexp - 1)); + result = (short)(tmp2 >> (negexp + 16)); + /* check if rounding caused carry bit which must be added into result */ + if (tmp2 < tmp) + result |= (1 << (16 - negexp)); + /* check if positive saturation has occurred because of rounding */ + if (!sign && result < 0) + { + _REENT_ERRNO(rptr) = ERANGE; + return SHRT_MAX; + } + } + else + { + /* we have -1.0, no rounding necessary */ + return SHRT_MIN; + } + + return sign ? -result : result; +} + +#ifndef _REENT_ONLY + +__int16_t +strtosfix16 (const char *s, + char **ptr) +{ + return _strtosfix16_r (_REENT, s, ptr); +} + +#endif + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/strtosfix32.c b/lib/machine/powerpc/strtosfix32.c new file mode 100644 index 0000000..6941be5 --- /dev/null +++ b/lib/machine/powerpc/strtosfix32.c @@ -0,0 +1,102 @@ +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "vfieeefp.h" + +/* + * Convert a string to a fixed-point (sign + 31-bits) value. + * + * Ignores `locale' stuff. + */ +__int32_t +_strtosfix32_r (struct _reent *rptr, + const char *nptr, + char **endptr) +{ + union double_union dbl; + int exp, negexp, sign; + unsigned long tmp, tmp2; + long result = 0; + + dbl.d = _strtod_r (rptr, nptr, endptr); + + /* treat NAN as domain error, +/- infinity as saturation */ + if (!finite(dbl.d)) + { + if (isnan (dbl.d)) + { + _REENT_ERRNO(rptr) = EDOM; + return 0; + } + _REENT_ERRNO(rptr) = ERANGE; + if (word0(dbl) & Sign_bit) + return LONG_MIN; + return LONG_MAX; + } + + /* check for normal saturation */ + if (dbl.d >= 1.0) + { + _REENT_ERRNO(rptr) = ERANGE; + return LONG_MAX; + } + else if (dbl.d < -1.0) + { + _REENT_ERRNO(rptr) = ERANGE; + return LONG_MIN; + } + + /* otherwise we have normal number in range */ + + /* strip off sign and exponent */ + sign = word0(dbl) & Sign_bit; + exp = ((word0(dbl) & Exp_mask) >> Exp_shift) - Bias; + negexp = -exp; + if (negexp > 31) + return 0; + word0(dbl) &= ~(Exp_mask | Sign_bit); + /* add in implicit normalized bit */ + word0(dbl) |= Exp_msk1; + /* shift so result is contained in single word */ + tmp = word0(dbl) << Ebits; + tmp |= ((unsigned long)word1(dbl) >> (32 - Ebits)); + if (negexp != 0) + { + /* perform rounding */ + tmp2 = tmp + (1 << (negexp - 1)); + result = (long)(tmp2 >> negexp); + /* check if rounding caused carry bit which must be added into result */ + if (tmp2 < tmp) + result |= (1 << (32 - negexp)); + /* check if positive saturation has occurred because of rounding */ + if (!sign && result < 0) + { + _REENT_ERRNO(rptr) = ERANGE; + return LONG_MAX; + } + } + else + { + /* we have -1.0, no rounding necessary */ + return LONG_MIN; + } + + return sign ? -result : result; +} + +#ifndef _REENT_ONLY + +__int32_t +strtosfix32 (const char *s, + char **ptr) +{ + return _strtosfix32_r (_REENT, s, ptr); +} + +#endif + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/strtosfix64.c b/lib/machine/powerpc/strtosfix64.c new file mode 100644 index 0000000..9da3ffa --- /dev/null +++ b/lib/machine/powerpc/strtosfix64.c @@ -0,0 +1,115 @@ +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "fix64.h" + +/* + * Convert a string to a fixed-point (sign + 63-bits) value. + * + * Ignores `locale' stuff. + */ +__int64_t +_strtosfix64_r (struct _reent *rptr, + const char *nptr, + char **endptr) +{ + union long_double_union ldbl; + int exp, negexp, sign, ld_type; + __uint64_t tmp, tmp2; + __int64_t result = 0; + + init(ldbl); + + _simdstrtold ((char *)nptr, endptr, &ldbl); + + /* treat NAN as domain error, +/- infinity as saturation */ + ld_type = _simdldcheck (&ldbl); + if (ld_type != 0) + { + if (ld_type == 1) + { + _REENT_ERRNO(rptr) = EDOM; + return 0; + } + _REENT_ERRNO(rptr) = ERANGE; + if (word0(ldbl) & Sign_bit) + return LONG_LONG_MIN; + return LONG_LONG_MAX; + } + + /* strip off sign and exponent */ + sign = word0(ldbl) & Sign_bit; + exp = ((word0(ldbl) & Exp_mask) >> Exp_shift) - Bias; + negexp = -exp; + if (negexp > 63) + return 0; + word0(ldbl) &= ~(Exp_mask | Sign_bit); + /* add in implicit normalized bit */ + word0(ldbl) |= Exp_msk1; + /* shift so result is contained in single word */ + tmp = word0(ldbl) << Ebits; + tmp |= ((unsigned long)word1(ldbl) >> (32 - Ebits)); + tmp <<= 32; + if (Ebits < 32) + tmp |= ((unsigned long)word1(ldbl) << Ebits); + tmp |= ((unsigned long)word2(ldbl) >> (32 - Ebits)); + + /* check for saturation */ + if (sign) + { + if (exp > 0 || (exp == 0 && tmp != 0x8000000000000000LL)) + { + _REENT_ERRNO(rptr) = ERANGE; + return LONG_LONG_MIN; + } + } + else + { + if (exp >= 0) + { + _REENT_ERRNO(rptr) = ERANGE; + return LONG_LONG_MAX; + } + } + + /* otherwise we have normal number in range */ + if (negexp != 0) + { + /* perform rounding */ + tmp2 = tmp + (1 << (negexp - 1)); + result = (long long)(tmp2 >> negexp); + /* check if rounding caused carry bit which must be added into result */ + if (tmp2 < tmp) + result |= (1 << (64 - negexp)); + /* check if positive saturation has occurred because of rounding */ + if (!sign && result < 0) + { + _REENT_ERRNO(rptr) = ERANGE; + return LONG_LONG_MAX; + } + } + else + { + /* we have -1.0, no rounding necessary */ + return LONG_LONG_MIN; + } + + return sign ? -result : result; +} + +#ifndef _REENT_ONLY + +__int64_t +strtosfix64 (const char *s, + char **ptr) +{ + return _strtosfix64_r (_REENT, s, ptr); +} + +#endif + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/strtoufix16.c b/lib/machine/powerpc/strtoufix16.c new file mode 100644 index 0000000..415652d --- /dev/null +++ b/lib/machine/powerpc/strtoufix16.c @@ -0,0 +1,170 @@ +/* +FUNCTION + <>, <>, <>---string to signed fixed point + +INDEX + strtoufix16 +INDEX + strtoufix32 +INDEX + strtoufix64 +INDEX + _strtoufix16_r +INDEX + _strtoufix32_r +INDEX + _strtoufix64_r + +SYNOPSIS + #include + __uint16_t strtoufix16 (const char *<[s]>, char **<[ptr]>); + + __uint32_t strtoufix32 (const char *<[s]>, char **<[ptr]>); + + __uint64_t strtoufix64 (const char *<[s]>, char **<[ptr]>); + + __uint16_t _strtoufix16_r (void *<[reent]>, + const char *<[s]>, char **<[ptr]>); + + __uint32_t _strtoufix32_r (void *<[reent]>, + const char *<[s]>, char **<[ptr]>); + + __uint64_t _strtoufix64_r (void *<[reent]>, + const char *<[s]>, char **<[ptr]>); + +DESCRIPTION + The function <> converts the string <<*<[s]>>> to + a fixed-point 16-bits fraction representation. The function + follows the same rules as <>. + + The substring converted is the longest initial + subsequence of <[s]>, beginning with the first + non-whitespace character, that has the format: + .[+|-]<[digits]>[.][<[digits]>][(e|E)[+|-]<[digits]>] + The substring contains no characters if <[s]> is empty, consists + entirely of whitespace, or if the first non-whitespace + character is something other than <<+>>, <<->>, <<.>>, or a + digit. If the substring is empty, no conversion is done, and + the value of <[s]> is stored in <<*<[ptr]>>>. Otherwise, + the substring is converted, and a pointer to the final string + (which will contain at least the terminating null character of + <[s]>) is stored in <<*<[ptr]>>>. If you want no + assignment to <<*<[ptr]>>>, pass a null pointer as <[ptr]>. + + <> is identical to <> except that it + converts to fixed-point 32-bit fraction representation. + <> is also similar, except that it converts + to fixed-point 64-bit fraction. + + The alternate functions <<_strtoufix16_r>>, <<_strtoufix32_r>>, + and <<_strtoufix64_r>> are reentrant versions. + The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS + The functions return the converted substring value, if any. If + no conversion can be performed, then 0 is returned. If the converted + value is a NaN, 0 is returned and errno is set to <>. + If the converted value exceeds the maximum positive unsigned fixed-point value, + the output value is saturated to the maximum value and <> is stored in + errno. If the converted value is less than 0, then the output is saturated to 0 + and <> is stored in errno. Otherwise, the converted value is returned in the + specified fixed-point format. + +PORTABILITY + <>, <>, and <> are non-standard. + + The OS subroutines of <> are required. +*/ + +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "vfieeefp.h" + +/* + * Convert a string to a fixed-point 16-bit value. + * + * Ignores `locale' stuff. + */ +__uint16_t +_strtoufix16_r (struct _reent *rptr, + const char *nptr, + char **endptr) +{ + union double_union dbl; + unsigned long tmp, tmp2, result; + int exp, negexp; + + dbl.d = _strtod_r (rptr, nptr, endptr); + + /* treat NAN as domain error, +/- infinity as saturation */ + if (!finite(dbl.d)) + { + if (isnan (dbl.d)) + { + _REENT_ERRNO(rptr) = EDOM; + return 0; + } + _REENT_ERRNO(rptr) = ERANGE; + if (word0(dbl) & Sign_bit) + return 0; + return USHRT_MAX; + } + + /* check for normal saturation */ + if (dbl.d >= 1.0) + { + _REENT_ERRNO(rptr) = ERANGE; + return USHRT_MAX; + } + else if (dbl.d < 0) + { + _REENT_ERRNO(rptr) = ERANGE; + return 0; + } + + /* otherwise we have normal postive number in range */ + + /* strip off exponent */ + exp = ((word0(dbl) & Exp_mask) >> Exp_shift) - Bias; + negexp = -exp; + if (negexp > 16) + return 0; + /* add in implicit normalized bit */ + tmp = word0(dbl) | Exp_msk1; + /* remove exponent and sign */ + tmp <<= Ebits; + /* perform rounding */ + tmp2 = tmp + (1 << (negexp + 14)); + result = tmp2 >> (negexp + 15); + /* if rounding causes carry, must add carry bit in */ + if (tmp2 < tmp) + { + if (negexp == 0) + { + /* we have overflow which means saturation */ + _REENT_ERRNO(rptr) = ERANGE; + return USHRT_MAX; + } + result |= (1 << (16 - negexp)); + } + + return (__uint16_t)result; +} + +#ifndef _REENT_ONLY + +__uint16_t +strtoufix16 (const char *s, + char **ptr) +{ + return _strtoufix16_r (_REENT, s, ptr); +} + +#endif + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/strtoufix32.c b/lib/machine/powerpc/strtoufix32.c new file mode 100644 index 0000000..4340c71 --- /dev/null +++ b/lib/machine/powerpc/strtoufix32.c @@ -0,0 +1,99 @@ +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "vfieeefp.h" + +/* + * Convert a string to a fixed-point 32-bit value. + * + * Ignores `locale' stuff. + */ +__uint32_t +_strtoufix32_r (struct _reent *rptr, + const char *nptr, + char **endptr) +{ + union double_union dbl; + int exp, negexp; + __uint32_t tmp, tmp2, result = 0; + + dbl.d = _strtod_r (rptr, nptr, endptr); + + /* treat NAN as domain error, +/- infinity as saturation */ + if (!finite(dbl.d)) + { + if (isnan (dbl.d)) + { + _REENT_ERRNO(rptr) = EDOM; + return 0; + } + _REENT_ERRNO(rptr) = ERANGE; + if (word0(dbl) & Sign_bit) + return 0; + return ULONG_MAX; + } + + /* check for normal saturation */ + if (dbl.d >= 1.0) + { + _REENT_ERRNO(rptr) = ERANGE; + return ULONG_MAX; + } + else if (dbl.d < 0) + { + _REENT_ERRNO(rptr) = ERANGE; + return 0; + } + + /* otherwise we have normal positive number in range */ + + /* strip off exponent */ + exp = ((word0(dbl) & Exp_mask) >> Exp_shift) - Bias; + negexp = -exp; + if (negexp > 32) + return 0; + word0(dbl) &= ~(Exp_mask | Sign_bit); + /* add in implicit normalized bit */ + word0(dbl) |= Exp_msk1; + /* shift so result is contained left-justified in word */ + tmp = word0(dbl) << Ebits; + tmp |= ((unsigned long)word1(dbl) >> (32 - Ebits)); + /* perform rounding */ + if (negexp > 1) + { + tmp2 = tmp + (1 << (negexp - 2)); + result = (tmp2 >> (negexp - 1)); + /* if rounding causes carry, add carry bit in */ + if (tmp2 < tmp) + result += 1 << (32 - negexp); + } + else + { + result = tmp + ((word1(dbl) & (1 << (32 - Ebits - 1))) != 0); + /* if rounding causes carry, then saturation has occurred */ + if (result < tmp) + { + _REENT_ERRNO(rptr) = ERANGE; + return ULONG_MAX; + } + } + + return result; +} + +#ifndef _REENT_ONLY + +__uint32_t +strtoufix32 (const char *s, + char **ptr) +{ + return _strtoufix32_r (_REENT, s, ptr); +} + +#endif + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/strtoufix64.c b/lib/machine/powerpc/strtoufix64.c new file mode 100644 index 0000000..2057068 --- /dev/null +++ b/lib/machine/powerpc/strtoufix64.c @@ -0,0 +1,114 @@ +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "fix64.h" + +/* + * Convert a string to a fixed-point 64-bit unsigned value. + * + * Ignores `locale' stuff. + */ +__uint64_t +_strtoufix64_r (struct _reent *rptr, + const char *nptr, + char **endptr) +{ + union long_double_union ldbl; + int exp, sign, negexp, ld_type; + __uint64_t tmp, tmp2, result = 0; + + init(ldbl); + + _simdstrtold ((char *)nptr, endptr, &ldbl); + + /* treat NAN as domain error, +/- infinity as saturation */ + ld_type = _simdldcheck (&ldbl); + if (ld_type != 0) + { + if (ld_type == 1) + { + _REENT_ERRNO(rptr) = EDOM; + return 0; + } + _REENT_ERRNO(rptr) = ERANGE; + if (word0(ldbl) & Sign_bit) + return 0; + return ULONG_LONG_MAX; + } + + /* strip off sign and exponent */ + sign = word0(ldbl) & Sign_bit; + exp = ((word0(ldbl) & Exp_mask) >> Exp_shift) - Bias; + negexp = -exp; + if (negexp > 63) + return 0; + word0(ldbl) &= ~(Exp_mask | Sign_bit); + /* add in implicit normalized bit */ + word0(ldbl) |= Exp_msk1; + /* shift so result is contained in single word */ + tmp = word0(ldbl) << Ebits; + tmp |= ((unsigned long)word1(ldbl) >> (32 - Ebits)); + tmp <<= 32; + if (Ebits < 32) + tmp |= ((unsigned long)word1(ldbl) << Ebits); + tmp |= ((unsigned long)word2(ldbl) >> (32 - Ebits)); + + /* check for saturation */ + if (sign) + { + _REENT_ERRNO(rptr) = ERANGE; + return 0; + } + else + { + if (exp > 0 || (exp == 0 && tmp >= 0x8000000000000000LL)) + { + _REENT_ERRNO(rptr) = ERANGE; + return ULONG_LONG_MAX; + } + } + + /* otherwise we have normal number in range */ + if (negexp > 1) + { + tmp2 = tmp + (1 << (negexp - 2)); + result = (tmp2 >> (negexp - 1)); + /* if rounding causes carry, add carry bit in */ + if (tmp2 < tmp) + result += 1 << (64 - negexp); + } + else + { + if (Ebits < 32) + { + result = tmp + ((word2(ldbl) & (1 << (32 - Ebits - 1))) != 0); + /* if rounding causes carry, then saturation has occurred */ + if (result < tmp) + { + _REENT_ERRNO(rptr) = ERANGE; + return ULONG_LONG_MAX; + } + } + else + result = tmp; + } + + return result; +} + +#ifndef _REENT_ONLY + +__uint64_t +strtoufix64 (const char *s, + char **ptr) +{ + return _strtoufix64_r (_REENT, s, ptr); +} + +#endif + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/sys/fenv.h b/lib/machine/powerpc/sys/fenv.h new file mode 100644 index 0000000..39f12bf --- /dev/null +++ b/lib/machine/powerpc/sys/fenv.h @@ -0,0 +1,132 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_FENV_H_ +#define _SYS_FENV_H_ + +#include +#include + +#ifndef __fenv_static +#define __fenv_static static +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef int fenv_t; +typedef int fexcept_t; + +/* Exception flags */ +#define FE_INEXACT 0x02000000 +#define FE_DIVBYZERO 0x04000000 +#define FE_UNDERFLOW 0x08000000 +#define FE_OVERFLOW 0x10000000 +#define FE_INVALID 0x20000000 /* all types of invalid FP ops */ + +/* + * The PowerPC architecture has extra invalid flags that indicate the + * specific type of invalid operation occurred. These flags may be + * tested, set, and cleared---but not masked---separately. All of + * these bits are cleared when FE_INVALID is cleared, but only + * FE_VXSOFT is set when FE_INVALID is explicitly set in software. + */ +#define FE_VXCVI 0x00000100 /* invalid integer convert */ +#define FE_VXSQRT 0x00000200 /* square root of a negative */ +#define FE_VXSOFT 0x00000400 /* software-requested exception */ +#define FE_VXVC 0x00080000 /* ordered comparison involving NaN */ +#define FE_VXIMZ 0x00100000 /* inf * 0 */ +#define FE_VXZDZ 0x00200000 /* 0 / 0 */ +#define FE_VXIDI 0x00400000 /* inf / inf */ +#define FE_VXISI 0x00800000 /* inf - inf */ +#define FE_VXSNAN 0x01000000 /* operation on a signalling NaN */ +#define FE_ALL_INVALID (FE_VXCVI | FE_VXSQRT | FE_VXSOFT | FE_VXVC | \ + FE_VXIMZ | FE_VXZDZ | FE_VXIDI | FE_VXISI | \ + FE_VXSNAN | FE_INVALID) +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_ALL_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +/* Rounding modes */ +#define FE_TONEAREST 0x0000 +#define FE_TOWARDZERO 0x0001 +#define FE_UPWARD 0x0002 +#define FE_DOWNWARD 0x0003 +#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ + FE_UPWARD | FE_TOWARDZERO) + + + +/* Default floating-point environment */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV (_fe_dfl_env) + +/* We need to be able to map status flag positions to mask flag positions */ +#define _FPUSW_SHIFT 22 +#define _ENABLE_MASK ((FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \ + FE_OVERFLOW | FE_UNDERFLOW) >> _FPUSW_SHIFT) + +#ifndef _SOFT_FLOAT +#ifdef __SPE__ +#define __mffs(__env) \ + __asm __volatile("mfspr %0, 512" : "=r" ((__env)->__bits.__reg)) +#define __mtfsf(__env) \ + __asm __volatile("mtspr 512,%0;isync" :: "r" ((__env).__bits.__reg)) +#else +#define __mffs(__env) \ + __asm __volatile("mffs %0" : "=f" ((__env)->__d)) +#define __mtfsf(__env) \ + __asm __volatile("mtfsf 255,%0" :: "f" ((__env).__d)) +#endif +#else +#define __mffs(__env) +#define __mtfsf(__env) +#endif + +union __fpscr { + double __d; + struct { +#if _BYTE_ORDER == _LITTLE_ENDIAN + fenv_t __reg; + __uint32_t __junk; +#else + __uint32_t __junk; + fenv_t __reg; +#endif + } __bits; +}; + + +#ifdef __cplusplus +} +#endif + + +#endif /* !_SYS_FENV_H_ */ diff --git a/lib/machine/powerpc/ufix64toa.c b/lib/machine/powerpc/ufix64toa.c new file mode 100644 index 0000000..c829b9b --- /dev/null +++ b/lib/machine/powerpc/ufix64toa.c @@ -0,0 +1,90 @@ +/* _ufix64toa_r: convert unsigned 64-bit fixed point to ASCII string. + * + * This routine converts an unsigned fixed-point number to long double format and + * then calls _ldtoa_r to do the conversion. + * + * Written by Jeff Johnston. + */ + +#ifdef __SPE__ + +#include <_ansi.h> +#include +#include +#include +#include +#include "fix64.h" + +extern char *_simdldtoa_r (struct _reent *, LONG_DOUBLE_UNION *, int, + int, int *, int *, char **); + +/* + * Convert an unsigned fixed-point 64-bit value to string. + * + * Ignores `locale' stuff. + */ + +char * +_ufix64toa_r (struct _reent *rptr, + __uint64_t value, + int mode, + int ndigits, + int *decpt, + int *sign, + char **rve) +{ + union long_double_union ldbl; + union fix64_union fix64; + unsigned long tmp; + int exp, negexp; + + /* if input is 0, no additional work is needed */ + if (value == 0) + { + ldbl.i[0] = ldbl.i[1] = ldbl.i[2] = ldbl.i[3] = 0; + } + else /* otherwise, we calculate long double equivalent of value */ + { + /* find exponent by locating most-significant one-bit */ + fix64.ll = value; + negexp = 1; + if (hiword(fix64) == 0) + { + tmp = loword(fix64); + negexp = 33; + } + else + { + tmp = hiword(fix64); + negexp = 1; + } + + while (negexp < 65) + { + if (tmp & 0x80000000) + break; + ++negexp; + tmp <<= 1; + } + + /* shift input appropriately */ + fix64.ll = value << (negexp - 1 + (Exp_msk1 != 0)); + + /* build long double */ + exp = -negexp + Bias; + word0(ldbl) = (exp << Exp_shift); + word1(ldbl) = hiword(fix64) << (32-Ebits-1); + word2(ldbl) = loword(fix64) << (32-Ebits-1); + word3(ldbl) = 0; + if (Ebits+1 < 32) + { + word0(ldbl) |= hiword(fix64) >> (Ebits + 1); + word1(ldbl) |= loword(fix64) >> (Ebits + 1); + } + } + + /* convert long double to character */ + return _simdldtoa_r (rptr, &ldbl, mode, ndigits, decpt, sign, rve); +} + +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/vec_calloc.c b/lib/machine/powerpc/vec_calloc.c new file mode 100644 index 0000000..7a90d57 --- /dev/null +++ b/lib/machine/powerpc/vec_calloc.c @@ -0,0 +1,53 @@ +/* +FUNCTION +<>---allocate space for arrays + +INDEX + vec_calloc + +INDEX + _vec_calloc_r + +SYNOPSIS + #include + void *vec_calloc(size_t <[n]>, size_t <[s]>); + void *vec_calloc_r(void *<[reent]>, size_t , <[s]>); + +DESCRIPTION +Use <> to request a block of memory sufficient to hold an +array of <[n]> elements, each of which has size <[s]>. + +The memory allocated by <> comes out of the same memory pool +used by <>, but the memory block is initialized to all zero +bytes. (To avoid the overhead of initializing the space, use +<> instead.) + +The alternate function <<_vec_calloc_r>> is reentrant. +The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +If successful, a pointer to the newly allocated space. + +If unsuccessful, <>. + +PORTABILITY +<> is an non-ANSI extension described in the AltiVec Programming +Interface Manual. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include +#include + +#ifndef _REENT_ONLY + +void * +vec_calloc (size_t n, + size_t size) +{ + return _vec_calloc_r (_REENT, n, size); +} + +#endif diff --git a/lib/machine/powerpc/vec_callocr.c b/lib/machine/powerpc/vec_callocr.c new file mode 100644 index 0000000..6ce00d0 --- /dev/null +++ b/lib/machine/powerpc/vec_callocr.c @@ -0,0 +1,2 @@ +#define DEFINE_VECCALLOC +#include "vec_mallocr.c" diff --git a/lib/machine/powerpc/vec_free.c b/lib/machine/powerpc/vec_free.c new file mode 100644 index 0000000..c893e5a --- /dev/null +++ b/lib/machine/powerpc/vec_free.c @@ -0,0 +1,14 @@ +/* vec_free.c - a wrapper for _free_r */ +#include <_ansi.h> +#include +#include + +#ifndef _REENT_ONLY + +void +vec_free (void *aptr) +{ + _free_r (_REENT, aptr); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/machine/powerpc/vec_malloc.c b/lib/machine/powerpc/vec_malloc.c new file mode 100644 index 0000000..b62fe07 --- /dev/null +++ b/lib/machine/powerpc/vec_malloc.c @@ -0,0 +1,105 @@ +/* +FUNCTION +<>, <>, <>---manage vector memory + +INDEX + vec_malloc +INDEX + vec_realloc +INDEX + vec_free +INDEX + _vec_malloc_r +INDEX + _vec_realloc_r +INDEX + _vec_free_r + +SYNOPSIS + #include + void *vec_malloc(size_t <[nbytes]>); + void *vec_realloc(void *<[aptr]>, size_t <[nbytes]>); + void vec_free(void *<[aptr]>); + + + void *_vec_malloc_r(void *<[reent]>, size_t <[nbytes]>); + void *_vec_realloc_r(void *<[reent]>, + void *<[aptr]>, size_t <[nbytes]>); + void _vec_free_r(void *<[reent]>, void *<[aptr]>); + +DESCRIPTION +These functions manage a pool of system memory that is 16-byte aligned.. + +Use <> to request allocation of an object with at least +<[nbytes]> bytes of storage available and is 16-byte aligned. If the space is +available, <> returns a pointer to a newly allocated block as its result. + +If you already have a block of storage allocated by <>, but +you no longer need all the space allocated to it, you can make it +smaller by calling <> with both the object pointer and the +new desired size as arguments. <> guarantees that the +contents of the smaller object match the beginning of the original object. + +Similarly, if you need more space for an object, use <> to +request the larger size; again, <> guarantees that the +beginning of the new, larger object matches the contents of the +original object. + +When you no longer need an object originally allocated by <> +or <> (or the related function <>), return it to the +memory storage pool by calling <> with the address of the object +as the argument. You can also use <> for this purpose by +calling it with <<0>> as the <[nbytes]> argument. + +The alternate functions <<_vec_malloc_r>>, <<_vec_realloc_r>>, <<_vec_free_r>>, +are reentrant versions. The extra argument <[reent]> is a pointer to a reentrancy +structure. + +If you have multiple threads of execution which may call any of these +routines, or if any of these routines may be called reentrantly, then +you must provide implementations of the <<__vec_malloc_lock>> and +<<__vec_malloc_unlock>> functions for your system. See the documentation +for those functions. + +These functions operate by calling the function <<_sbrk_r>> or +<>, which allocates space. You may need to provide one of these +functions for your system. <<_sbrk_r>> is called with a positive +value to allocate more space, and with a negative value to release +previously allocated space if it is no longer required. +@xref{Stubs}. + +RETURNS +<> returns a pointer to the newly allocated space, if +successful; otherwise it returns <>. If your application needs +to generate empty objects, you may use <> for this purpose. + +<> returns a pointer to the new block of memory, or <> +if a new block could not be allocated. <> is also the result +when you use `<,0)>>' (which has the same effect as +`<)>>'). You should always check the result of +<>; successful vec_reallocation is not guaranteed even when +you request a smaller object. + +<> does not return a result. + +PORTABILITY +<>, <>, and <> are all extensions +specified in the AltiVec Programming Interface Manual. + +Supporting OS subroutines required: <>. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +void * +vec_malloc (size_t nbytes) /* get a block */ +{ + return _memalign_r (_REENT, 16, nbytes); +} + +#endif + diff --git a/lib/machine/powerpc/vec_mallocr.c b/lib/machine/powerpc/vec_mallocr.c new file mode 100644 index 0000000..c375c8b --- /dev/null +++ b/lib/machine/powerpc/vec_mallocr.c @@ -0,0 +1,424 @@ +/* This code is based on mallocr.c written by Doug Lea which is released + to the public domain. Any changes to libc/stdlib/mallocr.c + should be reflected here as well. */ + +/* Preliminaries */ + +#ifndef __STD_C +#ifdef __STDC__ +#define __STD_C 1 +#else +#if __cplusplus +#define __STD_C 1 +#else +#define __STD_C 0 +#endif /*__cplusplus*/ +#endif /*__STDC__*/ +#endif /*__STD_C*/ + +#ifndef Void_t +#if __STD_C +#define Void_t void +#else +#define Void_t char +#endif +#endif /*Void_t*/ + +#if __STD_C +#include /* for size_t */ +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* + In newlib, all the publically visible routines take a reentrancy + pointer. We don't currently do anything much with it, but we do + pass it to the lock routine. + */ + +#include +#include +#include + +#define MALLOC_LOCK __malloc_lock(reent_ptr) +#define MALLOC_UNLOCK __malloc_unlock(reent_ptr) + +#ifdef SMALL_MEMORY +#define malloc_getpagesize (128) +#else +#define malloc_getpagesize (4096) +#endif + +#if __STD_C +extern void __malloc_lock(struct _reent *); +extern void __malloc_unlock(struct _reent *); +#else +extern void __malloc_lock(); +extern void __malloc_unlock(); +#endif + +#if __STD_C +#define RARG struct _reent *reent_ptr, +#define RONEARG struct _reent *reent_ptr +#else +#define RARG reent_ptr +#define RONEARG reent_ptr +#define RDECL struct _reent *reent_ptr; +#endif + +#define RCALL reent_ptr, +#define RONECALL reent_ptr + +/* + Define MALLOC_LOCK and MALLOC_UNLOCK to C expressions to run to + lock and unlock the malloc data structures. MALLOC_LOCK may be + called recursively. + */ + +#ifndef MALLOC_LOCK +#define MALLOC_LOCK +#endif + +#ifndef MALLOC_UNLOCK +#define MALLOC_UNLOCK +#endif + +/* + INTERNAL_SIZE_T is the word-size used for internal bookkeeping + of chunk sizes. On a 64-bit machine, you can reduce malloc + overhead by defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' + at the expense of not being able to handle requests greater than + 2^31. This limitation is hardly ever a concern; you are encouraged + to set this. However, the default version is the same as size_t. +*/ + +#ifndef INTERNAL_SIZE_T +#define INTERNAL_SIZE_T size_t +#endif + +/* + Following is needed on implementations whereby long > size_t. + The problem is caused because the code performs subtractions of + size_t values and stores the result in long values. In the case + where long > size_t and the first value is actually less than + the second value, the resultant value is positive. For example, + (long)(x - y) where x = 0 and y is 1 ends up being 0x00000000FFFFFFFF + which is 2*31 - 1 instead of 0xFFFFFFFFFFFFFFFF. This is due to the + fact that assignment from unsigned to signed won't sign extend. +*/ + +#ifdef SIZE_T_SMALLER_THAN_LONG +#define long_sub_size_t(x, y) ( (x < y) ? -((long)(y - x)) : (x - y) ); +#else +#define long_sub_size_t(x, y) ( (long)(x - y) ) +#endif + +/* + REALLOC_ZERO_BYTES_FREES should be set if a call to + realloc with zero bytes should be the same as a call to free. + Some people think it should. Otherwise, since this malloc + returns a unique pointer for malloc(0), so does realloc(p, 0). +*/ + +/* The following macros are only invoked with (2n+1)-multiples of + INTERNAL_SIZE_T units, with a positive integer n. This is exploited + for fast inline execution when n is small. */ + +#define MALLOC_ZERO(charp, nbytes) \ +do { \ + INTERNAL_SIZE_T mzsz = (nbytes); \ + if(mzsz <= 9*sizeof(mzsz)) { \ + INTERNAL_SIZE_T* mz = (INTERNAL_SIZE_T*) (charp); \ + if(mzsz >= 5*sizeof(mzsz)) { *mz++ = 0; \ + *mz++ = 0; \ + if(mzsz >= 7*sizeof(mzsz)) { *mz++ = 0; \ + *mz++ = 0; \ + if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \ + *mz++ = 0; }}} \ + *mz++ = 0; \ + *mz++ = 0; \ + *mz = 0; \ + } else memset((charp), 0, mzsz); \ +} while(0) + +#define MALLOC_COPY(dest,src,nbytes) \ +do { \ + INTERNAL_SIZE_T mcsz = (nbytes); \ + if(mcsz <= 9*sizeof(mcsz)) { \ + INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src); \ + INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest); \ + if(mcsz >= 5*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; \ + if(mcsz >= 7*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; \ + if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; }}} \ + *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; \ + *mcdst = *mcsrc ; \ + } else memcpy(dest, src, mcsz); \ +} while(0) + +#define vECCALLOc _vec_calloc_r +#define fREe _free_r +#define mEMALIGn _memalign_r +#define vECREALLOc _vec_realloc_r +# +#if __STD_C + +Void_t* vECREALLOc(RARG Void_t*, size_t); +Void_t* vECCALLOc(RARG size_t, size_t); +#else +Void_t* vECREALLOc(); +Void_t* vECCALLOc(); +#endif + + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif + +/* + Type declarations +*/ + +struct malloc_chunk +{ + INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ + INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk* mchunkptr; + +/* sizes, alignments */ + +#define SIZE_SZ (sizeof(INTERNAL_SIZE_T)) +#define MALLOC_ALIGN 16 +#define MALLOC_ALIGNMENT 16 +#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1) +#define MINSIZE (sizeof(struct malloc_chunk)) + +/* conversion from malloc headers to user pointers, and back */ + +#define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ)) +/* pad request bytes into a usable size */ + +#define request2size(req) \ + (((long)((req) + (SIZE_SZ + MALLOC_ALIGN_MASK)) < \ + (long)(MINSIZE + MALLOC_ALIGN_MASK)) ? ((MINSIZE + MALLOC_ALIGN_MASK) & ~(MALLOC_ALIGN_MASK)) : \ + (((req) + (SIZE_SZ + MALLOC_ALIGN_MASK)) & ~(MALLOC_ALIGN_MASK))) + + +/* Check if m has acceptable alignment */ + +#define aligned_OK(m) (((unsigned long)((m)) & (MALLOC_ALIGN_MASK)) == 0) + +/* + Physical chunk operations +*/ + + +/* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */ + +#define PREV_INUSE 0x1 + +/* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */ + +#define IS_MMAPPED 0x2 + +/* Bits to mask off when extracting size */ + +#define SIZE_BITS (PREV_INUSE|IS_MMAPPED) + + +/* Ptr to next physical malloc_chunk. */ + +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~PREV_INUSE) )) + +/* Ptr to previous physical malloc_chunk */ + +#define prev_chunk(p)\ + ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) )) + + +/* Treat space at ptr + offset as a chunk */ + +#define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) + + + + +/* + Dealing with use bits +*/ + +/* extract p's inuse bit */ + +#define inuse(p)\ +((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE) + +/* extract inuse bit of previous chunk */ + +#define prev_inuse(p) ((p)->size & PREV_INUSE) + +/* check for mmap()'ed chunk */ + +#define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED) + +/* set/clear chunk as in use without otherwise disturbing */ + +#define set_inuse(p)\ +((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size |= PREV_INUSE + +#define clear_inuse(p)\ +((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size &= ~(PREV_INUSE) + +/* check/set/clear inuse bits in known places */ + +#define inuse_bit_at_offset(p, s)\ + (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE) + +#define set_inuse_bit_at_offset(p, s)\ + (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE) + +#define clear_inuse_bit_at_offset(p, s)\ + (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE)) + + + +/* + Dealing with size fields +*/ + +/* Get size, ignoring use bits */ + +#define chunksize(p) ((p)->size & ~(SIZE_BITS)) + +/* Set size at head, without disturbing its use bit */ + +#define set_head_size(p, s) ((p)->size = (((p)->size & PREV_INUSE) | (s))) + +/* Set size/use ignoring previous bits in header */ + +#define set_head(p, s) ((p)->size = (s)) + + + +#ifdef DEFINE_VECREALLOC + + +#if __STD_C +Void_t* vECREALLOc(RARG Void_t* oldmem, size_t bytes) +#else +Void_t* vECREALLOc(RARG oldmem, bytes) RDECL Void_t* oldmem; size_t bytes; +#endif +{ + INTERNAL_SIZE_T nb; /* padded request size */ + + mchunkptr oldp; /* chunk corresponding to oldmem */ + INTERNAL_SIZE_T oldsize; /* its size */ + + mchunkptr newp; /* chunk to return */ + INTERNAL_SIZE_T newsize; /* its size */ + Void_t* newmem; /* corresponding user mem */ + + mchunkptr remainder; /* holds split off extra space from newp */ + INTERNAL_SIZE_T remainder_size; /* its size */ + +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { fREe(RCALL oldmem); return 0; } +#endif + + + /* realloc of null is supposed to be same as malloc */ + if (oldmem == 0) return mEMALIGn(RCALL 16, bytes); + + MALLOC_LOCK; + + newp = oldp = mem2chunk(oldmem); + newsize = oldsize = chunksize(oldp); + + nb = request2size(bytes); + + if ((long)(oldsize) < (long)(nb)) + { + /* Must allocate */ + + newmem = mEMALIGn (RCALL 16, bytes); + + if (newmem == 0) /* propagate failure */ + { + MALLOC_UNLOCK; + return 0; + } + + /* copy, free, and exit */ + MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ); + fREe(RCALL oldmem); + MALLOC_UNLOCK; + return newmem; + } + + remainder_size = long_sub_size_t(newsize, nb); + + if (remainder_size >= (long)MINSIZE) /* split off remainder */ + { + remainder = chunk_at_offset(newp, nb); + set_head_size(newp, nb); + set_head(remainder, remainder_size | PREV_INUSE); + set_inuse_bit_at_offset(remainder, remainder_size); + fREe(RCALL chunk2mem(remainder)); /* let free() deal with it */ + } + else + { + set_head_size(newp, newsize); + set_inuse_bit_at_offset(newp, newsize); + } + + MALLOC_UNLOCK; + return chunk2mem(newp); +} + +#endif /* DEFINE_VECREALLOC */ + + +#ifdef DEFINE_VECCALLOC + +/* + + calloc calls malloc, then zeroes out the allocated chunk. + +*/ + +#if __STD_C +Void_t* vECCALLOc(RARG size_t n, size_t elem_size) +#else +Void_t* vECCALLOc(RARG n, elem_size) RDECL size_t n; size_t elem_size; +#endif +{ + INTERNAL_SIZE_T sz = n * elem_size; + + Void_t* mem; + + mem = mEMALIGn (RCALL 16, sz); + + if (mem == 0) + { + return 0; + } + + MALLOC_ZERO(mem, sz); + return mem; +} + +#endif /* DEFINE_VECCALLOC */ + diff --git a/lib/machine/powerpc/vec_realloc.c b/lib/machine/powerpc/vec_realloc.c new file mode 100644 index 0000000..db6f320 --- /dev/null +++ b/lib/machine/powerpc/vec_realloc.c @@ -0,0 +1,16 @@ +/* vec_realloc.c -- a wrapper for _vec_realloc_r. */ + +#include <_ansi.h> +#include +#include + +#ifndef _REENT_ONLY + +void * +vec_realloc (void *ap, + size_t nbytes) +{ + return _vec_realloc_r (_REENT, ap, nbytes); +} + +#endif diff --git a/lib/machine/powerpc/vec_reallocr.c b/lib/machine/powerpc/vec_reallocr.c new file mode 100644 index 0000000..d1d99de --- /dev/null +++ b/lib/machine/powerpc/vec_reallocr.c @@ -0,0 +1,2 @@ +#define DEFINE_VECREALLOC +#include "vec_mallocr.c" diff --git a/lib/machine/powerpc/vfprintf.c b/lib/machine/powerpc/vfprintf.c new file mode 100644 index 0000000..a8af4c3 --- /dev/null +++ b/lib/machine/powerpc/vfprintf.c @@ -0,0 +1,1377 @@ +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + vprintf +INDEX + vfprintf +INDEX + vsprintf +INDEX + vsnprintf + +SYNOPSIS + #include + #include + int vprintf(const char *<[fmt]>, va_list <[list]>); + int vfprintf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsprintf(char *<[str]>, const char *<[fmt]>, va_list <[list]>); + int vsnprintf(char *<[str]>, size_t <[size]>, const char *<[fmt]>, va_list <[list]>); + + int _vprintf_r(void *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfprintf_r(void *<[reent]>, FILE *<[fp]>, const char *<[fmt]>, + va_list <[list]>); + int _vsprintf_r(void *<[reent]>, char *<[str]>, const char *<[fmt]>, + va_list <[list]>); + int _vsnprintf_r(void *<[reent]>, char *<[str]>, size_t <[size]>, const char *<[fmt]>, + va_list <[list]>); + +DESCRIPTION +<>, <>, <> and <> are (respectively) +variants of <>, <>, <> and <>. They differ +only in allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than directly +accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of bytes in the output string, +save that the concluding <> is not counted. +<> and <> return the number of characters transmitted. +If an error occurs, <> and <> return <>. No +error returns occur for <>. + +PORTABILITY +ANSI C requires all three functions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +/*static char *sccsid = "from: @(#)vfprintf.c 5.50 (Berkeley) 12/16/92";*/ +static char *rcsid = "$Id$"; +#endif /* LIBC_SCCS and not lint */ + +/* + * Actual printf innards. + * + * This code is large and complicated... + */ + +#ifdef INTEGER_ONLY +#define VFPRINTF vfiprintf +#define _VFPRINTF_R _vfiprintf_r +#else +#define VFPRINTF vfprintf +#define _VFPRINTF_R _vfprintf_r +#ifndef NO_FLOATING_POINT +#define FLOATING_POINT +#endif +#endif + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#ifdef __ALTIVEC__ +#include +#endif + +#include + +#include "local.h" +#include "fvwrite.h" +#include "vfieeefp.h" + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL +#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG) +#undef _NO_LONGDBL +#endif + +#define _NO_LONGLONG +#if defined _WANT_IO_LONG_LONG && defined __GNUC__ +# undef _NO_LONGLONG +#endif + +#ifdef __ALTIVEC__ +typedef union +{ + vector int v; + float f[4]; + int i[16 / sizeof(int)]; + long l[4]; + short s[8]; + signed char c[16]; +} vec_16_byte_union; +#endif /* __ALTIVEC__ */ + +/* + * Flush out all the vectors defined by the given uio, + * then reset it so that it can be reused. + */ +static int +__sprint_r(rptr, fp, uio) + struct _reent *rptr; + FILE *fp; + register struct __suio *uio; +{ + register int err; + + if (uio->uio_resid == 0) { + uio->uio_iovcnt = 0; + return (0); + } + err = __sfvwrite_r(rptr, fp, uio); + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return (err); +} + +/* + * Helper function for `fprintf to unbuffered unix file': creates a + * temporary buffer. We only work on write-only files; this avoids + * worries about ungetc buffers and so forth. + */ +static int +__sbprintf_r(rptr, fp, fmt, ap) + struct _reent *rptr; + register FILE *fp; + const char *fmt; + va_list ap; +{ + int ret; + FILE fake; + unsigned char buf[BUFSIZ]; + + /* copy the important variables */ + fake._flags = fp->_flags & ~__SNBF; + fake._file = fp->_file; + fake._cookie = fp->_cookie; + fake._write = fp->_write; + + /* set up the buffer */ + fake._bf._base = fake._p = buf; + fake._bf._size = fake._w = sizeof(buf); + fake._lbfsize = 0; /* not actually used, but Just In Case */ + + /* do the work, then copy any error status */ + ret = _VFPRINTF_R(rptr, &fake, fmt, ap); + if (ret >= 0 && _fflush_r(rptr, &fake)) + ret = EOF; + if (fake._flags & __SERR) + fp->_flags |= __SERR; + return (ret); +} + + +#ifdef FLOATING_POINT +#include +#include +#include "floatio.h" + +#define BUF (MAXEXP+MAXFRACT+1) /* + decimal point */ +#define DEFPREC 6 + +#ifdef _NO_LONGDBL +static char *cvt (struct _reent *, double, int, int, char *, int *, int, int *); +#else +static char *cvt (struct _reent *, _LONG_DOUBLE, int, int, char *, int *, int, int *); +extern int _ldcheck (_LONG_DOUBLE *); +#endif + +static int exponent (char *, int, int); + +#ifdef __SPE__ +static char *cvt_ufix64 (struct _reent *, unsigned long long, int, int *, int *); +#endif /* __SPE__ */ + +#else /* no FLOATING_POINT */ + +#define BUF 40 + +#endif /* FLOATING_POINT */ + + +/* + * Macros for converting digits to letters and vice versa + */ +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit(c) <= 9) +#define to_char(n) ((n) + '0') + +/* + * Flags used during conversion. + */ +#define ALT 0x001 /* alternate form */ +#define HEXPREFIX 0x002 /* add 0x or 0X prefix */ +#define LADJUST 0x004 /* left adjustment */ +#define LONGDBL 0x008 /* long double */ +#define LONGINT 0x010 /* long integer */ +#ifndef _NO_LONGLONG +#define QUADINT 0x020 /* quad integer */ +#else /* ifdef _NO_LONGLONG, make QUADINT equivalent to LONGINT, so + that %lld behaves the same as %ld, not as %d, as expected if: + sizeof (long long) = sizeof long > sizeof int */ +#define QUADINT LONGINT +#endif +#define SHORTINT 0x040 /* short integer */ +#define ZEROPAD 0x080 /* zero (as opposed to blank) pad */ +#define FPT 0x100 /* Floating point number */ +#define VECTOR 0x200 /* vector */ +#define FIXEDPOINT 0x400 /* fixed-point */ + +int +VFPRINTF (FILE * fp, + const char *fmt0, + va_list ap) +{ + CHECK_INIT (_REENT, fp); + return _VFPRINTF_R (_REENT, fp, fmt0, ap); +} + +int +_VFPRINTF_R (struct _reent *data, + FILE * fp, + const char *fmt0, + va_list ap) +{ + register char *fmt; /* format string */ + register int ch; /* character from fmt */ + register int n, m; /* handy integers (short term usage) */ + register char *cp; /* handy char pointer (short term usage) */ + register struct __siov *iovp;/* for PRINT macro */ + register int flags; /* flags as above */ + int ret; /* return value accumulator */ + int width; /* width from format (%8d), or 0 */ + int prec; /* precision from format (%.3d), or -1 */ + char sign; /* sign prefix (' ', '+', '-', or \0) */ + char old_sign; /* saved value of sign when looping for vectors */ + int old_ch; /* saved value of ch when looping for vectors */ + char *format_anchor; /* start of format to process */ + wchar_t wc; +#ifdef FLOATING_POINT + char *decimal_point = localeconv()->decimal_point; + char softsign; /* temporary negative sign for floats */ +#ifdef _NO_LONGDBL + union { int i; double d; } _double_ = {0}; + #define _fpvalue (_double_.d) +#else + union { int i; _LONG_DOUBLE ld; } _long_double_ = {0}; + #define _fpvalue (_long_double_.ld) + int tmp; +#endif + int expt; /* integer value of exponent */ + int expsize = 0; /* character count for expstr */ + int ndig; /* actual number of digits returned by cvt */ + char expstr[7]; /* buffer for exponent string */ +#endif + +#ifndef _NO_LONGLONG +#define quad_t long long +#define u_quad_t unsigned long long +#else +#define quad_t long +#define u_quad_t u_long +#endif + + u_quad_t _uquad; /* integer arguments %[diouxX] */ + enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */ + int dprec; /* a copy of prec if [diouxX], 0 otherwise */ + int realsz; /* field size expanded by dprec */ + int size; /* size of converted field or string */ + char *xdigs = NULL; /* digits for [xX] conversion */ +#define NIOV 8 + struct __suio uio; /* output information: summary */ + struct __siov iov[NIOV];/* ... and individual io vectors */ + char buf[BUF]; /* space for %c, %[diouxX], %[eEfgG] */ + char ox[2]; /* space for 0x hex-prefix */ +#ifdef __ALTIVEC__ + char vec_sep; /* vector separator char */ + int vec_print_count; /* number of vector chunks remaining */ + vec_16_byte_union vec_tmp; +#endif /* __ALTIVEC__ */ + mbstate_t state; /* mbtowc calls from library must not change state */ + + /* + * Choose PADSIZE to trade efficiency vs. size. If larger printf + * fields occur frequently, increase PADSIZE and make the initialisers + * below longer. + */ +#define PADSIZE 16 /* pad chunk size */ + static const char blanks[PADSIZE] = + {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}; + static const char zeroes[PADSIZE] = + {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}; + + /* + * BEWARE, these `goto error' on error, and PAD uses `n'. + */ +#define PRINT(ptr, len) { \ + iovp->iov_base = (ptr); \ + iovp->iov_len = (len); \ + uio.uio_resid += (len); \ + iovp++; \ + if (++uio.uio_iovcnt >= NIOV) { \ + if (__sprint_r(data, fp, &uio)) \ + goto error; \ + iovp = iov; \ + } \ +} +#define PAD(howmany, with) { \ + if ((n = (howmany)) > 0) { \ + while (n > PADSIZE) { \ + PRINT(with, PADSIZE); \ + n -= PADSIZE; \ + } \ + PRINT(with, n); \ + } \ +} +#define FLUSH() { \ + if (uio.uio_resid && __sprint_r(data, fp, &uio)) \ + goto error; \ + uio.uio_iovcnt = 0; \ + iovp = iov; \ +} + +#ifdef __ALTIVEC__ +#define GET_SHORT(ap) \ + (flags&VECTOR ? \ + (vec_print_count < 8 ? (short)vec_tmp.s[8 - vec_print_count] : \ + (vec_tmp.v = va_arg(ap, vector int), (short)vec_tmp.s[0])) : \ + (short)va_arg(ap, int)) +#define GET_USHORT(ap) \ + (flags&VECTOR ? \ + (vec_print_count < 8 ? (u_short)vec_tmp.s[8 - vec_print_count] : \ + (vec_tmp.v = va_arg(ap, vector int), (u_short)vec_tmp.s[0])) : \ + (u_short)va_arg(ap, int)) + +#define GET_LONG(ap) \ + (flags&VECTOR ? \ + (vec_print_count < 4 ? (long)vec_tmp.l[4 - vec_print_count] : \ + (vec_tmp.v = va_arg(ap, vector int), vec_tmp.l[0])) : \ + va_arg(ap, long int)) +#define GET_ULONG(ap) \ + (flags&VECTOR ? \ + (vec_print_count < 4 ? (u_long)vec_tmp.l[4 - vec_print_count] : \ + (vec_tmp.v = va_arg(ap, vector int), (u_long)vec_tmp.l[0])) : \ + (u_long)va_arg(ap, unsigned long int)) + +#define GET_INT(ap) \ + (flags&VECTOR ? \ + (vec_print_count < 16 ? \ + vec_tmp.c[16 - vec_print_count] : \ + (vec_tmp.v = va_arg(ap, vector int), (int)vec_tmp.c[0])) : \ + va_arg(ap, int)) +#define GET_UINT(ap) \ + (flags&VECTOR ? \ + (vec_print_count < 16 ? \ + (u_int)((unsigned char)vec_tmp.c[16 - vec_print_count]) : \ + (vec_tmp.v = va_arg(ap, vector int), (u_int)((unsigned char)vec_tmp.c[0]))) : \ + (u_int)va_arg(ap, unsigned int)) +#else /* !__ALTIVEC__ */ +#define GET_SHORT(ap) ((short)va_arg(ap, int)) +#define GET_USHORT(ap) ((u_short)va_arg(ap, int)) +#define GET_LONG(ap) (va_arg(ap, long int)) +#define GET_ULONG(ap) ((u_long)va_arg(ap, unsigned long int)) +#define GET_INT(ap) ((int)va_arg(ap, int)) +#define GET_UINT(ap) ((u_int)va_arg(ap, unsigned int)) +#endif /* !__ALTIVEC__ */ + +#ifndef _NO_LONGLONG +#define SARG() \ + (flags&QUADINT ? va_arg(ap, quad_t) : \ + flags&LONGINT ? GET_LONG(ap) : \ + flags&SHORTINT ? (long)GET_SHORT(ap) : \ + (long)GET_INT(ap)) +#define UARG() \ + (flags&QUADINT ? va_arg(ap, u_quad_t) : \ + flags&LONGINT ? GET_ULONG(ap) : \ + flags&SHORTINT ? (u_long)GET_USHORT(ap) : \ + (u_long)GET_UINT(ap)) +#ifdef __SPE__ +#define SFPARG() \ + (flags&LONGINT ? va_arg(ap, quad_t) : \ + flags&SHORTINT ? (long)GET_SHORT(ap) : \ + (long)va_arg(ap, int)) +#define UFPARG() \ + (flags&LONGINT ? va_arg(ap, u_quad_t) : \ + flags&SHORTINT ? (u_long)GET_USHORT(ap) : \ + (u_long)va_arg(ap, u_int)) +#endif /* __SPE__ */ +#else +#define SARG() \ + (flags&LONGINT ? GET_LONG(ap) : \ + flags&SHORTINT ? (long)GET_SHORT(ap) : \ + (long)GET_INT(ap)) +#define UARG() \ + (flags&LONGINT ? GET_ULONG(ap) : \ + flags&SHORTINT ? (u_long)GET_USHORT(ap) : \ + (u_long)GET_UINT(ap)) +#ifdef __SPE__ +#define SFPARG() \ + (flags&LONGINT ? (va_arg(ap, long) << 32) : \ + flags&SHORTINT ? (long)GET_SHORT(ap) : \ + (long)va_arg(ap, int)) +#define UFPARG() \ + (flags&LONGINT ? (va_arg(ap, u_long) <<32) : \ + flags&SHORTINT ? (u_long)GET_USHORT(ap) : \ + (u_long)va_arg(ap, u_int)) +#endif /* __SPE__ */ +#endif + + memset (&state, '\0', sizeof (state)); + + /* sorry, fprintf(read_only_file, "") returns EOF, not 0 */ + if (cantwrite (data, fp)) { + _funlockfile (fp); + return (EOF); + } + + /* optimise fprintf(stderr) (and other unbuffered Unix files) */ + if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) && + fp->_file >= 0) + return (__sbprintf_r(data, fp, fmt0, ap)); + + fmt = (char *)fmt0; + uio.uio_iov = iovp = iov; + uio.uio_resid = 0; + uio.uio_iovcnt = 0; + ret = 0; + + /* + * Scan the format for conversions (`%' character). + */ + + for (;;) { + cp = fmt; + while ((n = _mbtowc_r(data, &wc, fmt, MB_CUR_MAX, &state)) > 0) { + fmt += n; + if (wc == '%') { + fmt--; + break; + } + } + if ((m = fmt - cp) != 0) { + PRINT(cp, m); + ret += m; + } + if (n <= 0) + goto done; + fmt++; /* skip over '%' */ + + flags = 0; + dprec = 0; + width = 0; + prec = -1; + sign = '\0'; + old_sign = '\0'; +#ifdef __ALTIVEC__ + vec_print_count = 0; + vec_sep = ' '; +#endif /* __ALTIVEC__ */ + + format_anchor = fmt; +rflag: ch = *fmt++; + old_ch = ch; +reswitch: switch (ch) { + case ' ': + /* + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (!sign) + sign = ' '; + goto rflag; + case '#': + flags |= ALT; + goto rflag; + case '*': + /* + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + if ((width = va_arg(ap, int)) >= 0) + goto rflag; + width = -width; + /* FALLTHROUGH */ + case '-': + flags |= LADJUST; + goto rflag; + case '+': + sign = '+'; + goto rflag; +#ifdef __ALTIVEC__ + case ',': + case ';': + case ':': + case '_': + if (vec_sep != ' ') + { + fmt = format_anchor; + continue; + } + vec_sep = ch; + goto rflag; +#endif /* __ALTIVEC__ */ + case '.': + if ((ch = *fmt++) == '*') { + n = va_arg(ap, int); + prec = n < 0 ? -1 : n; + goto rflag; + } + n = 0; + while (is_digit(ch)) { + n = 10 * n + to_digit(ch); + ch = *fmt++; + } + prec = n < 0 ? -1 : n; + goto reswitch; + case '0': + /* + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flags |= ZEROPAD; + goto rflag; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n = 0; + do { + n = 10 * n + to_digit(ch); + ch = *fmt++; + } while (is_digit(ch)); + width = n; + goto reswitch; +#ifdef FLOATING_POINT + case 'L': +#ifdef __ALTIVEC__ + if (flags & VECTOR) + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ + flags |= LONGDBL; + goto rflag; +#endif + case 'h': + if (flags & LONGINT) + { + fmt = format_anchor; + continue; + } + flags |= SHORTINT; +#ifdef __ALTIVEC__ + if (flags & VECTOR) + vec_print_count = 8; +#endif + goto rflag; + case 'l': + if (flags & SHORTINT) + { + fmt = format_anchor; + continue; + } + if (*fmt == 'l') { + fmt++; + flags |= QUADINT; + flags &= ~VECTOR; + } else { + flags |= LONGINT; +#ifdef __ALTIVEC__ + if (flags & VECTOR) + vec_print_count = 4; +#endif + } + goto rflag; +#ifdef __ALTIVEC__ + case 'v': + if (flags & VECTOR) + { + fmt = format_anchor; + continue; + } + flags |= VECTOR; + vec_print_count = (flags & SHORTINT) ? 8 : + ((flags & LONGINT) ? 4 : 16); + goto rflag; +#endif + case 'q': +#ifdef __ALTIVEC__ + if (flags & VECTOR) + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ + flags |= QUADINT; + goto rflag; + case 'c': +#ifdef __ALTIVEC__ + if (flags & VECTOR) + { + int k; + vec_16_byte_union tmp; + if (flags & (SHORTINT | LONGINT)) + { + fmt = format_anchor; + continue; + } + tmp.v = va_arg(ap, vector int); + cp = buf; + for (k = 0; k < 15; ++k) + { + *cp++ = tmp.c[k]; + if (vec_sep != ' ') + *cp++ = vec_sep; + } + *cp++ = tmp.c[15]; + size = cp - buf; + cp = buf; + vec_print_count = 0; + } + else +#endif /* __ALTIVEC__ */ + { + *(cp = buf) = va_arg(ap, int); + size = 1; + } + sign = '\0'; + break; + case 'D': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'd': + case 'i': +#ifdef __ALTIVEC__ + if (!(flags & VECTOR) && vec_sep != ' ') + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ + _uquad = SARG(); + if ((quad_t)_uquad < 0) + { + _uquad = -(quad_t)_uquad; + old_sign = sign; + sign = '-'; + } + base = DEC; + goto number; +#ifdef FLOATING_POINT + case 'e': + case 'E': + case 'f': + case 'g': + case 'G': + if (prec == -1) { + prec = DEFPREC; + } else if ((ch == 'g' || ch == 'G') && prec == 0) { + prec = 1; + } + +#ifdef _NO_LONGDBL + if (flags & LONGDBL) { + _fpvalue = (double) va_arg(ap, _LONG_DOUBLE); +#ifdef __ALTIVEC__ + } else if (flags & VECTOR) { + if (vec_print_count >= 4) + { + vec_print_count = 4; + vec_tmp.v = va_arg(ap, vector int); + } + _fpvalue = (double)vec_tmp.f[4 - vec_print_count]; + } else if (vec_sep != ' ') { + fmt = format_anchor; + continue; + +#endif /* __ALTIVEC__ */ + } else { + _fpvalue = va_arg(ap, double); + } + + /* do this before tricky precision changes */ + if (isinf(_fpvalue)) { + if (_fpvalue < 0) + { + old_sign = sign; + sign = '-'; + } + + cp = "Inf"; + size = 3; + break; + } + if (isnan(_fpvalue)) { + cp = "NaN"; + size = 3; + break; + } + +#else /* !_NO_LONGDBL */ + + if (flags & LONGDBL) { + _fpvalue = va_arg(ap, _LONG_DOUBLE); +#ifdef __ALTIVEC__ + } else if (flags & VECTOR) { + if (vec_print_count >= 4) + { + vec_print_count = 4; + vec_tmp.v = va_arg(ap, vector int); + } + _fpvalue = (_LONG_DOUBLE)k.f[4 - vec_print_count]; +#endif /* __ALTIVEC__ */ + } else { + _fpvalue = (_LONG_DOUBLE)va_arg(ap, double); + } + + /* do this before tricky precision changes */ + tmp = _ldcheck (&_fpvalue); + if (tmp == 2) { + if (_fpvalue < 0) + { + old_sign = sign; + sign = '-'; + } + cp = "Inf"; + size = 3; + break; + } + if (tmp == 1) { + cp = "NaN"; + size = 3; + break; + } +#endif /* !_NO_LONGDBL */ + + flags |= FPT; + + cp = cvt(data, _fpvalue, prec, flags, &softsign, + &expt, ch, &ndig); + + if (ch == 'g' || ch == 'G') { + if (expt <= -4 || expt > prec) + { + old_ch = ch; + ch = (ch == 'g') ? 'e' : 'E'; + } + else + ch = 'g'; + } + if (ch <= 'e') { /* 'e' or 'E' fmt */ + --expt; + expsize = exponent(expstr, expt, ch); + size = expsize + ndig; + if (ndig > 1 || flags & ALT) + ++size; + } else if (ch == 'f') { /* f fmt */ + if (expt > 0) { + size = expt; + if (prec || flags & ALT) + size += prec + 1; + } else /* "0.X" */ + size = (prec || flags & ALT) + ? prec + 2 + : 1; + } else if (expt >= ndig) { /* fixed g fmt */ + size = expt; + if (flags & ALT) + ++size; + } else + size = ndig + (expt > 0 ? + 1 : 2 - expt); + + if (softsign) + { + old_sign = sign; + sign = '-'; + } + break; +#endif /* FLOATING_POINT */ +#ifdef __SPE__ + case 'r': + flags |= FIXEDPOINT; + _uquad = SFPARG(); + if ((quad_t)_uquad < 0) + { + sign = '-'; + _uquad = -(quad_t)_uquad; + } + if (flags & SHORTINT) + _uquad <<= (sizeof(quad_t) - sizeof(short)) * 8 + 1; + else if (flags & LONGINT) + _uquad <<= 1; + else + _uquad <<= (sizeof(quad_t) - sizeof(long)) * 8 + 1; + + if (_uquad == 0 && sign) + { + /* we have -1.0 which has to be handled special */ + cp = "100000"; + expt = 1; + ndig = 6; + break; + } + + goto fixed_nosign; + case 'R': + flags |= FIXEDPOINT; + _uquad = UFPARG(); + if (flags & SHORTINT) + _uquad <<= (sizeof(quad_t) - sizeof(short)) * 8; + else if (!(flags & LONGINT)) + _uquad <<= (sizeof(quad_t) - sizeof(long)) * 8; + +fixed_nosign: + if (prec == -1) + prec = DEFPREC; + +#ifndef _NO_LONGLONG + cp = cvt_ufix64 (data, _uquad, prec, &expt, &ndig); +#else + cp = cvs_ufix32 (data, _uquad, prec, &expt, &ndig); +#endif + + /* act like %f of format "0.X" */ + size = prec + 2; + + break; +#endif /* __SPE__ */ + case 'n': +#ifdef __ALTIVEC__ + if (flags & VECTOR) + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ +#ifndef _NO_LONGLONG + if (flags & QUADINT) + *va_arg(ap, quad_t *) = ret; + else +#endif + if (flags & LONGINT) + *va_arg(ap, long *) = ret; + else if (flags & SHORTINT) + *va_arg(ap, short *) = ret; + else + *va_arg(ap, int *) = ret; + continue; /* no output */ + case 'O': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'o': +#ifdef __ALTIVEC__ + if (!(flags & VECTOR) && vec_sep != ' ') + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ + _uquad = UARG(); + base = OCT; + goto nosign; + case 'p': + /* + * ``The argument shall be a pointer to void. The + * value of the pointer is converted to a sequence + * of printable characters, in an implementation- + * defined manner.'' + * -- ANSI X3J11 + */ + /* NOSTRICT */ +#ifdef __ALTIVEC__ + if (flags & VECTOR) + _uquad = UARG(); + else if (vec_sep != ' ') + { + fmt = format_anchor; + continue; + } + else +#endif /* __ALTIVEC__ */ + _uquad = (u_long)(unsigned _POINTER_INT)va_arg(ap, void *); + base = HEX; + xdigs = "0123456789abcdef"; + flags |= HEXPREFIX; + ch = 'x'; + goto nosign; + case 's': +#ifdef __ALTIVEC__ + if (flags & VECTOR) + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ + if ((cp = va_arg(ap, char *)) == NULL) + cp = "(null)"; + if (prec >= 0) { + /* + * can't use strlen; can only look for the + * NUL in the first `prec' characters, and + * strlen() will go further. + */ + char *p = memchr(cp, 0, prec); + + if (p != NULL) { + size = p - cp; + if (size > prec) + size = prec; + } else + size = prec; + } else + size = strlen(cp); + sign = '\0'; + break; + case 'U': + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'u': +#ifdef __ALTIVEC__ + if (!(flags & VECTOR) && vec_sep != ' ') + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ + _uquad = UARG(); + base = DEC; + goto nosign; + case 'X': + xdigs = "0123456789ABCDEF"; + goto hex; + case 'x': + xdigs = "0123456789abcdef"; +#ifdef __ALTIVEC__ + if (!(flags & VECTOR) && vec_sep != ' ') + { + fmt = format_anchor; + continue; + } +#endif /* __ALTIVEC__ */ +hex: _uquad = UARG(); + base = HEX; + /* leading 0x/X only if non-zero */ + if (flags & ALT && _uquad != 0) + flags |= HEXPREFIX; + + /* unsigned conversions */ +nosign: sign = '\0'; + /* + * ``... diouXx conversions ... if a precision is + * specified, the 0 flag will be ignored.'' + * -- ANSI X3J11 + */ +number: if ((dprec = prec) >= 0) + flags &= ~ZEROPAD; + + /* + * ``The result of converting a zero value with an + * explicit precision of zero is no characters.'' + * -- ANSI X3J11 + */ + cp = buf + BUF; + if (_uquad != 0 || prec != 0) { + /* + * Unsigned mod is hard, and unsigned mod + * by a constant is easier than that by + * a variable; hence this switch. + */ + switch (base) { + case OCT: + do { + *--cp = to_char(_uquad & 7); + _uquad >>= 3; + } while (_uquad); + /* handle octal leading 0 */ + if (flags & ALT && *cp != '0') + *--cp = '0'; + break; + + case DEC: + /* many numbers are 1 digit */ + while (_uquad >= 10) { + *--cp = to_char(_uquad % 10); + _uquad /= 10; + } + *--cp = to_char(_uquad); + break; + + case HEX: + do { + *--cp = xdigs[_uquad & 15]; + _uquad >>= 4; + } while (_uquad); + break; + + default: + cp = "bug in vfprintf: bad base"; + size = strlen(cp); + goto skipsize; + } + } + /* + * ...result is to be converted to an 'alternate form'. + * For o conversion, it increases the precision to force + * the first digit of the result to be a zero." + * -- ANSI X3J11 + * + * To demonstrate this case, compile and run: + * printf ("%#.0o",0); + */ + else if (base == OCT && (flags & ALT)) + *--cp = '0'; + + size = buf + BUF - cp; + skipsize: + break; + default: /* "%?" prints ?, unless ? is NUL */ + flags &= ~VECTOR; + if (ch == '\0') + goto done; + /* pretend it was %c with argument ch */ + cp = buf; + *cp = ch; + size = 1; + sign = '\0'; + break; + } + + /* + * All reasonable formats wind up here. At this point, `cp' + * points to a string which (if not flags&LADJUST) should be + * padded out to `width' places. If flags&ZEROPAD, it should + * first be prefixed by any sign or other prefix; otherwise, + * it should be blank padded before the prefix is emitted. + * After any left-hand padding and prefixing, emit zeroes + * required by a decimal [diouxX] precision, then print the + * string proper, then emit zeroes required by any leftover + * floating precision; finally, if LADJUST, pad with blanks. + * + * Compute actual size, so we know how much to pad. + * size excludes decimal prec; realsz includes it. + */ + realsz = dprec > size ? dprec : size; + if (sign) + realsz++; + else if (flags & HEXPREFIX) + realsz+= 2; + + /* right-adjusting blank padding */ + if ((flags & (LADJUST|ZEROPAD)) == 0) + PAD(width - realsz, blanks); + + /* prefix */ + if (sign) { + PRINT(&sign, 1); + } else if (flags & HEXPREFIX) { + ox[0] = '0'; + ox[1] = ch; + PRINT(ox, 2); + } + + /* right-adjusting zero padding */ + if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) + PAD(width - realsz, zeroes); + + /* leading zeroes from decimal precision */ + PAD(dprec - size, zeroes); + + /* the string or number proper */ +#ifdef FLOATING_POINT + if ((flags & FPT) == 0) { +#ifdef __SPE__ + if (flags & FIXEDPOINT) { + if (_uquad == 0 && !sign) { + /* kludge for __dtoa irregularity */ + PRINT("0", 1); + if (expt < ndig || (flags & ALT) != 0) { + PRINT(decimal_point, 1); + PAD(ndig - 1, zeroes); + } + } else if (expt <= 0) { + PRINT("0", 1); + if(expt || ndig) { + PRINT(decimal_point, 1); + PAD(-expt, zeroes); + PRINT(cp, ndig); + } + } else if (expt >= ndig) { + PRINT(cp, ndig); + PAD(expt - ndig, zeroes); + if (flags & ALT) + PRINT(".", 1); + } else { + PRINT(cp, expt); + cp += expt; + PRINT(".", 1); + PRINT(cp, ndig-expt); + } + } else +#endif /* __SPE__ */ + PRINT(cp, size); + } else { /* glue together f_p fragments */ + if (ch >= 'f') { /* 'f' or 'g' */ + if (_fpvalue == 0) { + /* kludge for __dtoa irregularity */ + PRINT("0", 1); + if (expt < ndig || (flags & ALT) != 0) { + PRINT(decimal_point, 1); + PAD(ndig - 1, zeroes); + } + } else if (expt <= 0) { + PRINT("0", 1); + if(expt || ndig) { + PRINT(decimal_point, 1); + PAD(-expt, zeroes); + PRINT(cp, ndig); + } + } else if (expt >= ndig) { + PRINT(cp, ndig); + PAD(expt - ndig, zeroes); + if (flags & ALT) + PRINT(".", 1); + } else { + PRINT(cp, expt); + cp += expt; + PRINT(".", 1); + PRINT(cp, ndig-expt); + } + } else { /* 'e' or 'E' */ + if (ndig > 1 || flags & ALT) { + ox[0] = *cp++; + ox[1] = '.'; + PRINT(ox, 2); + if (_fpvalue) { + PRINT(cp, ndig-1); + } else /* 0.[0..] */ + /* __dtoa irregularity */ + PAD(ndig - 1, zeroes); + } else /* XeYYY */ + PRINT(cp, 1); + PRINT(expstr, expsize); + } + } +#else + PRINT(cp, size); +#endif + /* left-adjusting padding (always blank) */ + if (flags & LADJUST) + PAD(width - realsz, blanks); + + /* finally, adjust ret */ + ret += width > realsz ? width : realsz; + +#ifdef __ALTIVEC__ + if ((flags & VECTOR) && vec_print_count-- > 1) + { + /* add vector separator */ + if (ch != 'c' || vec_sep != ' ') + { + PRINT(&vec_sep, 1); + ret += 1; + } + FLUSH(); + sign = old_sign; + ch = old_ch; + goto reswitch; + } +#endif /* __ALTIVEC__ */ + FLUSH(); /* copy out the I/O vectors */ + } +done: + FLUSH(); +error: + return (__sferror(fp) ? EOF : ret); + /* NOTREACHED */ +} + +#ifdef FLOATING_POINT + +#ifdef _NO_LONGDBL +extern char *_dtoa_r (struct _reent *, double, int, + int, int *, int *, char **); +#else +extern char *_ldtoa_r (struct _reent *, _LONG_DOUBLE, int, + int, int *, int *, char **); +#undef word0 +#define word0(x) ldword0(x) +#endif + +static char * +cvt(data, value, ndigits, flags, sign, decpt, ch, length) + struct _reent *data; +#ifdef _NO_LONGDBL + double value; +#else + _LONG_DOUBLE value; +#endif + int ndigits, flags, *decpt, ch, *length; + char *sign; +{ + int mode, dsgn; + char *digits, *bp, *rve; +#ifdef _NO_LONGDBL + union double_union tmp; +#else + struct ldieee *ldptr; +#endif + + if (ch == 'f') { + mode = 3; /* ndigits after the decimal point */ + } else { + /* To obtain ndigits after the decimal point for the 'e' + * and 'E' formats, round to ndigits + 1 significant + * figures. + */ + if (ch == 'e' || ch == 'E') { + ndigits++; + } + mode = 2; /* ndigits significant digits */ + } + +#ifdef _NO_LONGDBL + tmp.d = value; + + if (word0(tmp) & Sign_bit) { /* this will check for < 0 and -0.0 */ + value = -value; + *sign = '-'; + } else + *sign = '\000'; + + digits = _dtoa_r(data, value, mode, ndigits, decpt, &dsgn, &rve); +#else /* !_NO_LONGDBL */ + ldptr = (struct ldieee *)&value; + if (ldptr->sign) { /* this will check for < 0 and -0.0 */ + value = -value; + *sign = '-'; + } else + *sign = '\000'; + + digits = _ldtoa_r(data, value, mode, ndigits, decpt, &dsgn, &rve); +#endif /* !_NO_LONGDBL */ + + if ((ch != 'g' && ch != 'G') || flags & ALT) { /* Print trailing zeros */ + bp = digits + ndigits; + if (ch == 'f') { + if (*digits == '0' && value) + *decpt = -ndigits + 1; + bp += *decpt; + } + if (value == 0) /* kludge for __dtoa irregularity */ + rve = bp; + while (rve < bp) + *rve++ = '0'; + } + *length = rve - digits; + return (digits); +} + +static int +exponent(p0, exp, fmtch) + char *p0; + int exp, fmtch; +{ + register char *p, *t; + char expbuf[40]; + + p = p0; + *p++ = fmtch; + if (exp < 0) { + exp = -exp; + *p++ = '-'; + } + else + *p++ = '+'; + t = expbuf + 40; + if (exp > 9) { + do { + *--t = to_char(exp % 10); + } while ((exp /= 10) > 9); + *--t = to_char(exp); + for (; t < expbuf + 40; *p++ = *t++); + } + else { + *p++ = '0'; + *p++ = to_char(exp); + } + return (p - p0); +} +#endif /* FLOATING_POINT */ + +#ifdef __SPE__ +extern char *_ufix64toa_r (struct _reent *, unsigned long long, int, + int, int *, int *, char **); +static char * +cvt_ufix64 (data, value, ndigits, decpt, length) + struct _reent *data; + unsigned long long value; + int ndigits, *decpt, *length; +{ + int dsgn; + char *digits, *bp, *rve; + + /* treat the same as %f format and use mode=3 */ + digits = _ufix64toa_r (data, value, 3, ndigits, decpt, &dsgn, &rve); + + /* print trailing zeroes */ + bp = digits + ndigits; + if (*digits == '0' && value) + *decpt = -ndigits + 1; + bp += *decpt; + if (value == 0) /* kludge for __dtoa irregularity */ + rve = bp; + while (rve < bp) + *rve++ = '0'; + *length = rve - digits; + return (digits); +} +#endif /* __SPE__ */ diff --git a/lib/machine/powerpc/vfscanf.c b/lib/machine/powerpc/vfscanf.c new file mode 100644 index 0000000..ccd290f --- /dev/null +++ b/lib/machine/powerpc/vfscanf.c @@ -0,0 +1,1219 @@ +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + vscanf +INDEX + vfscanf +INDEX + vsscanf + +SYNOPSIS + #include + #include + int vscanf(const char *restrict <[fmt]>, va_list <[list]>); + int vfscanf(FILE *restrict <[fp]>, const char *restrict <[fmt]>, va_list <[list]>); + int vsscanf(const char *restrict <[str]>, const char *restrict <[fmt]>, va_list <[list]>); + + int _vscanf_r(void *<[reent]>, const char *restrict <[fmt]>, + va_list <[list]>); + int _vfscanf_r(void *<[reent]>, FILE *restrict <[fp]>, const char *restrict <[fmt]>, + va_list <[list]>); + int _vsscanf_r(void *<[reent]>, const char *restrict <[str]>, const char *restrict <[fmt]>, + va_list <[list]>); + +DESCRIPTION +<>, <>, and <> are (respectively) variants +of <>, <>, and <>. They differ only in +allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than +directly accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of input fields successfully scanned, +converted, and stored; the return value does not include scanned +fields which were not stored. + +If <> attempts to read at end-of-file, the return value +is <>. + +If no fields were stored, the return value is <<0>>. + +The routines <<_vscanf_r>>, <<_vfscanf_f>>, and <<_vsscanf_r>> are +reentrant versions which take an additional first parameter which points to the +reentrancy structure. + +PORTABILITY +These are GNU extensions. + +Supporting OS subroutines required: +*/ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +#ifndef NO_FLOATING_POINT +#define FLOATING_POINT +#endif + +#ifdef FLOATING_POINT +#include + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL +#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG) +#undef _NO_LONGDBL +#endif + +#define _NO_LONGLONG +#if defined _WANT_IO_LONG_LONG && defined __GNUC__ +# undef _NO_LONGLONG +#endif + +#include "floatio.h" +#define BUF (MAXEXP+MAXFRACT+3) /* 3 = sign + decimal point + NUL */ +/* An upper bound for how long a long prints in decimal. 4 / 13 approximates + log (2). Add one char for roundoff compensation and one for the sign. */ +#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long) - 1) * 4 / 13 + 2) +#else +#define BUF 40 +#endif + +/* + * Flags used during conversion. + */ + +#define LONG 0x01 /* l: long or double */ +#define LONGDBL 0x02 /* L: long double or long long */ +#define SHORT 0x04 /* h: short */ +#define SUPPRESS 0x10 /* suppress assignment */ +#define POINTER 0x20 /* weird %p pointer (`fake hex') */ +#define NOSKIP 0x40 /* do not skip blanks */ + +/* + * The following are used in numeric conversions only: + * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point; + * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral. + */ + +#define SIGNOK 0x80 /* +/- is (still) legal */ +#define NDIGITS 0x100 /* no digits detected */ + +#define DPTOK 0x200 /* (float) decimal point is still legal */ +#define EXPOK 0x400 /* (float) exponent (e+3, etc) still legal */ + +#define PFXOK 0x200 /* 0x prefix is (still) legal */ +#define NZDIGITS 0x400 /* no zero digits detected */ +#define NNZDIGITS 0x800 /* no non-zero digits detected */ + +#define VECTOR 0x2000 /* v: vector */ +#define FIXEDPOINT 0x4000 /* r/R: fixed-point */ +#define SIGNED 0x8000 /* r: signed fixed-point */ + +/* + * Conversion types. + */ + +#define CT_CHAR 0 /* %c conversion */ +#define CT_CCL 1 /* %[...] conversion */ +#define CT_STRING 2 /* %s conversion */ +#define CT_INT 3 /* integer, i.e., strtol or strtoul */ +#define CT_FLOAT 4 /* floating, i.e., strtod */ + +#if 0 +#define u_char unsigned char +#endif +#define u_char char +#define u_long unsigned long + +#ifndef _NO_LONGLONG +typedef unsigned long long u_long_long; +#endif + +typedef union +{ + char c[16] __attribute__ ((__aligned__ (16))); + short h[8]; + long l[4]; + int i[4]; + float f[4]; +} vec_union; + +/* + * vfscanf + */ + +#define BufferEmpty (fp->_r <= 0 && __srefill(fp)) + +#ifndef _REENT_ONLY + +int +vfscanf (register FILE *__restrict fp, + const char *__restrict fmt, + va_list ap) +{ + CHECK_INIT(_REENT, fp); + return __svfscanf_r (_REENT, fp, fmt, ap); +} + +int +__svfscanf (fp, fmt0, ap) + register FILE *fp; + char const *fmt0; + va_list ap; +{ + return __svfscanf_r (_REENT, fp, fmt0, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vfscanf_r (struct _reent *data, + register FILE *__restrict fp, + const char *__restrict fmt, + va_list ap) +{ + return __svfscanf_r (data, fp, fmt, ap); +} + + +int +__svfscanf_r (rptr, fp, fmt0, ap) + struct _reent *rptr; + register FILE *fp; + char const *fmt0; + va_list ap; +{ + register u_char *fmt = (u_char *) fmt0; + register int c; /* character from format, or conversion */ + register int type; /* conversion type */ + register size_t width; /* field width, or 0 */ + register char *p; /* points into all kinds of strings */ + register int n; /* handy integer */ + register int flags; /* flags as defined above */ + register char *p0; /* saves original value of p when necessary */ + int orig_flags; /* saved flags used when processing vector */ + int int_width; /* tmp area to store width when processing int */ + int nassigned; /* number of fields assigned */ + int nread; /* number of characters consumed from fp */ + int base = 0; /* base argument to strtol/strtoul */ + int nbytes = 1; /* number of bytes read from fmt string */ + wchar_t wc; /* wchar to use to read format string */ + char vec_sep; /* vector separator char */ + char last_space_char; /* last white-space char eaten - needed for vec support */ + int vec_read_count; /* number of vector items to read separately */ + int looped; /* has vector processing looped */ + u_long (*ccfn) () = 0; /* conversion function (strtol/strtoul) */ + char ccltab[256]; /* character class table for %[...] */ + char buf[BUF]; /* buffer for numeric conversions */ + vec_union vec_buf; + char *lptr; /* literal pointer */ +#ifdef _MB_CAPABLE + mbstate_t state; /* value to keep track of multibyte state */ +#endif + + char *ch_dest; + short *sp; + int *ip; + float *flp; + _LONG_DOUBLE *ldp; + double *dp; + long *lp; +#ifndef _NO_LONGLONG + long long *llp; +#else + u_long _uquad; +#endif + + /* `basefix' is used to avoid `if' tests in the integer scanner */ + static const short basefix[17] = + {10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + + nassigned = 0; + nread = 0; + for (;;) + { +#ifndef _MB_CAPABLE + wc = *fmt; +#else + memset (&state, '\0', sizeof (state)); + nbytes = _mbtowc_r (rptr, &wc, fmt, MB_CUR_MAX, &state); +#endif + fmt += nbytes; + if (wc == 0) + return nassigned; + if (nbytes == 1 && isspace (wc)) + { + for (;;) + { + if (BufferEmpty) + return nassigned; + if (!isspace (*fp->_p)) + break; + nread++, fp->_r--, fp->_p++; + } + continue; + } + if (wc != '%') + goto literal; + width = 0; + flags = 0; + vec_sep = ' '; + vec_read_count = 0; + looped = 0; + + /* + * switch on the format. continue if done; break once format + * type is derived. + */ + + again: + c = *fmt++; + + switch (c) + { + case '%': + literal: + lptr = fmt - nbytes; + for (n = 0; n < nbytes; ++n) + { + if (BufferEmpty) + goto input_failure; + if (*fp->_p != *lptr) + goto match_failure; + fp->_r--, fp->_p++; + nread++; + ++lptr; + } + continue; + + case '*': + flags |= SUPPRESS; + goto again; + case ',': + case ';': + case ':': + case '_': + if (flags == SUPPRESS || flags == 0) + vec_sep = c; + goto again; + case 'l': + if (flags & SHORT) + continue; /* invalid format, don't process any further */ + if (flags & LONG) + { + flags &= ~LONG; + flags &= ~VECTOR; + flags |= LONGDBL; + } + else + { + flags |= LONG; + if (flags & VECTOR) + vec_read_count = 4; + } + goto again; + case 'L': + flags |= LONGDBL; + flags &= ~VECTOR; + goto again; + case 'h': + flags |= SHORT; + if (flags & LONG) + continue; /* invalid format, don't process any further */ + if (flags & VECTOR) + vec_read_count = 8; + goto again; +#ifdef __ALTIVEC__ + case 'v': + flags |= VECTOR; + vec_read_count = (flags & SHORT) ? 8 : ((flags & LONG) ? 4 : 16); + goto again; +#endif + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + width = width * 10 + c - '0'; + goto again; + + /* + * Conversions. Those marked `compat' are for + * 4.[123]BSD compatibility. + * + * (According to ANSI, E and X formats are supposed to + * the same as e and x. Sorry about that.) + */ + + case 'D': /* compat */ + flags |= LONG; + /* FALLTHROUGH */ + case 'd': + type = CT_INT; + ccfn = (u_long (*)())_strtol_r; + base = 10; + break; + + case 'i': + type = CT_INT; + ccfn = (u_long (*)())_strtol_r; + base = 0; + break; + + case 'O': /* compat */ + flags |= LONG; + /* FALLTHROUGH */ + case 'o': + type = CT_INT; + ccfn = _strtoul_r; + base = 8; + break; + + case 'u': + type = CT_INT; + ccfn = _strtoul_r; + base = 10; + break; + + case 'X': /* compat XXX */ + case 'x': + flags |= PFXOK; /* enable 0x prefixing */ + type = CT_INT; + ccfn = _strtoul_r; + base = 16; + break; + +#ifdef FLOATING_POINT + case 'E': /* compat XXX */ + case 'G': /* compat XXX */ +/* ANSI says that E,G and X behave the same way as e,g,x */ + /* FALLTHROUGH */ + case 'e': + case 'f': + case 'g': + type = CT_FLOAT; + if (flags & VECTOR) + vec_read_count = 4; + break; + +# ifdef __SPE__ + /* treat fixed-point like %f floating point */ + case 'r': + flags |= SIGNED; + /* fallthrough */ + case 'R': + flags |= FIXEDPOINT; + type = CT_FLOAT; + break; +# endif +#endif + + case 's': + flags &= ~VECTOR; + type = CT_STRING; + break; + + case '[': + fmt = __sccl (ccltab, fmt); + flags |= NOSKIP; + flags &= ~VECTOR; + type = CT_CCL; + break; + + case 'c': + flags |= NOSKIP; + type = CT_CHAR; + if (flags & VECTOR) + { + /* not allowed to have h or l with c specifier */ + if (flags & (LONG | SHORT)) + continue; /* invalid format don't process any further */ + width = 0; + vec_read_count = 16; + } + break; + + case 'p': /* pointer format is like hex */ + flags |= POINTER | PFXOK; + type = CT_INT; + ccfn = _strtoul_r; + base = 16; + break; + + case 'n': + if (flags & SUPPRESS) /* ??? */ + continue; + flags &= ~VECTOR; + if (flags & SHORT) + { + sp = va_arg (ap, short *); + *sp = nread; + } + else if (flags & LONG) + { + lp = va_arg (ap, long *); + *lp = nread; + } +#ifndef _NO_LONGLONG + else if (flags & LONGDBL) + { + llp = va_arg (ap, long long*); + *llp = nread; + } +#endif + else + { + ip = va_arg (ap, int *); + *ip = nread; + } + continue; + + /* + * Disgusting backwards compatibility hacks. XXX + */ + case '\0': /* compat */ + return EOF; + + default: /* compat */ + if (isupper (c)) + flags |= LONG; + type = CT_INT; + ccfn = (u_long (*)())_strtol_r; + base = 10; + break; + } + + process: + /* + * We have a conversion that requires input. + */ + if (BufferEmpty) + goto input_failure; + + /* + * Consume leading white space, except for formats that + * suppress this. + */ + last_space_char = '\0'; + + if ((flags & NOSKIP) == 0) + { + while (isspace (*fp->_p)) + { + last_space_char = *fp->_p; + nread++; + if (--fp->_r > 0) + fp->_p++; + else +#ifndef CYGNUS_NEC + if (__srefill (fp)) +#endif + goto input_failure; + } + /* + * Note that there is at least one character in the + * buffer, so conversions that do not set NOSKIP ca + * no longer result in an input failure. + */ + } + + /* for vector formats process separator characters after first loop */ + if (looped && (flags & VECTOR)) + { + flags = orig_flags; + /* all formats other than default char have a separator char */ + if (vec_sep != ' ' || type != CT_CHAR) + { + if (vec_sep == ' ' && last_space_char != ' ' || + vec_sep != ' ' && *fp->_p != vec_sep) + goto match_failure; + if (vec_sep != ' ') + { + nread++; + if (--fp->_r > 0) + fp->_p++; + else +#ifndef CYGNUS_NEC + if (__srefill (fp)) +#endif + goto input_failure; + } + } + /* after eating the separator char, we must eat any white-space + after the separator char that precedes the data to convert */ + if ((flags & NOSKIP) == 0) + { + while (isspace (*fp->_p)) + { + last_space_char = *fp->_p; + nread++; + if (--fp->_r > 0) + fp->_p++; + else +#ifndef CYGNUS_NEC + if (__srefill (fp)) +#endif + goto input_failure; + } + } + + } + else /* save to counter-act changes made to flags when processing */ + orig_flags = flags; + + /* + * Do the conversion. + */ + switch (type) + { + + case CT_CHAR: + /* scan arbitrary characters (sets NOSKIP) */ + if (width == 0) + width = 1; + if (flags & SUPPRESS) + { + size_t sum = 0; + + for (;;) + { + if ((n = fp->_r) < (int)width) + { + sum += n; + width -= n; + fp->_p += n; +#ifndef CYGNUS_NEC + if (__srefill (fp)) + { +#endif + if (sum == 0) + goto input_failure; + break; +#ifndef CYGNUS_NEC + } +#endif + } + else + { + sum += width; + fp->_r -= width; + fp->_p += width; + break; + } + } + nread += sum; + } + else + { + int n = width; + if (!looped) + { + if (flags & VECTOR) + ch_dest = vec_buf.c; + else + ch_dest = va_arg (ap, char *); + } +#ifdef CYGNUS_NEC + /* Kludge city for the moment */ + if (fp->_r == 0) + goto input_failure; + + while (n && fp->_r) + { + *ch_dest++ = *(fp->_p++); + n--; + fp->_r--; + nread++; + } +#else + size_t r = fread (ch_dest, 1, width, fp); + + if (r == 0) + goto input_failure; + nread += r; + ch_dest += r; +#endif + if (!(flags & VECTOR)) + nassigned++; + } + break; + + case CT_CCL: + /* scan a (nonempty) character class (sets NOSKIP) */ + if (width == 0) + width = ~0; /* `infinity' */ + /* take only those things in the class */ + if (flags & SUPPRESS) + { + n = 0; + while (ccltab[*fp->_p]) + { + n++, fp->_r--, fp->_p++; + if (--width == 0) + break; + if (BufferEmpty) + { + if (n == 0) + goto input_failure; + break; + } + } + if (n == 0) + goto match_failure; + } + else + { + p0 = p = va_arg (ap, char *); + while (ccltab[*fp->_p]) + { + fp->_r--; + *p++ = *fp->_p++; + if (--width == 0) + break; + if (BufferEmpty) + { + if (p == p0) + goto input_failure; + break; + } + } + n = p - p0; + if (n == 0) + goto match_failure; + *p = 0; + nassigned++; + } + nread += n; + break; + + case CT_STRING: + /* like CCL, but zero-length string OK, & no NOSKIP */ + if (width == 0) + width = ~0; + if (flags & SUPPRESS) + { + n = 0; + while (!isspace (*fp->_p)) + { + n++, fp->_r--, fp->_p++; + if (--width == 0) + break; + if (BufferEmpty) + break; + } + nread += n; + } + else + { + p0 = p = va_arg (ap, char *); + while (!isspace (*fp->_p)) + { + fp->_r--; + *p++ = *fp->_p++; + if (--width == 0) + break; + if (BufferEmpty) + break; + } + *p = 0; + nread += p - p0; + nassigned++; + } + continue; + + case CT_INT: + { + unsigned int_width_left = 0; + int skips = 0; + int_width = width; +#ifdef hardway + if (int_width == 0 || int_width > sizeof (buf) - 1) +#else + /* size_t is unsigned, hence this optimisation */ + if (int_width - 1 > sizeof (buf) - 2) +#endif + { + int_width_left = width - (sizeof (buf) - 1); + int_width = sizeof (buf) - 1; + } + flags |= SIGNOK | NDIGITS | NZDIGITS | NNZDIGITS; + for (p = buf; int_width; int_width--) + { + c = *fp->_p; + /* + * Switch on the character; `goto ok' if we + * accept it as a part of number. + */ + switch (c) + { + /* + * The digit 0 is always legal, but is special. + * For %i conversions, if no digits (zero or nonzero) + * have been scanned (only signs), we will have base==0. + * In that case, we should set it to 8 and enable 0x + * prefixing. Also, if we have not scanned zero digits + * before this, do not turn off prefixing (someone else + * will turn it off if we have scanned any nonzero digits). + */ + case '0': + if (! (flags & NNZDIGITS)) + goto ok; + if (base == 0) + { + base = 8; + flags |= PFXOK; + } + if (flags & NZDIGITS) + { + flags &= ~(SIGNOK | NZDIGITS | NDIGITS); + goto ok; + } + flags &= ~(SIGNOK | PFXOK | NDIGITS); + if (int_width_left) + { + int_width_left--; + int_width++; + } + ++skips; + goto skip; + + /* 1 through 7 always legal */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + base = basefix[base]; + flags &= ~(SIGNOK | PFXOK | NDIGITS | NNZDIGITS); + goto ok; + + /* digits 8 and 9 ok iff decimal or hex */ + case '8': + case '9': + base = basefix[base]; + if (base <= 8) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS | NNZDIGITS); + goto ok; + + /* letters ok iff hex */ + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + /* no need to fix base here */ + if (base <= 10) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS | NNZDIGITS); + goto ok; + + /* sign ok only as first character */ + case '+': + case '-': + if (flags & SIGNOK) + { + flags &= ~SIGNOK; + goto ok; + } + break; + + /* x ok iff flag still set & 2nd char */ + case 'x': + case 'X': + if (flags & PFXOK && p == buf + 1) + { + base = 16;/* if %i */ + flags &= ~PFXOK; + /* We must reset the NZDIGITS and NDIGITS + flags that would have been unset by seeing + the zero that preceded the X or x. */ + flags |= NZDIGITS | NDIGITS; + goto ok; + } + break; + } + + /* + * If we got here, c is not a legal character + * for a number. Stop accumulating digits. + */ + break; + ok: + /* + * c is legal: store it and look at the next. + */ + *p++ = c; + skip: + if (--fp->_r > 0) + fp->_p++; + else +#ifndef CYGNUS_NEC + if (__srefill (fp)) +#endif + break; /* EOF */ + } + /* + * If we had only a sign, it is no good; push back the sign. + * If the number ends in `x', it was [sign] '0' 'x', so push back + * the x and treat it as [sign] '0'. + */ + if (flags & NDIGITS) + { + if (p > buf) + (void) ungetc (*(u_char *)-- p, fp); + goto match_failure; + } + c = ((u_char *) p)[-1]; + if (c == 'x' || c == 'X') + { + --p; + /*(void)*/ ungetc (c, fp); + } + if ((flags & SUPPRESS) == 0) + { + u_long res; + + *p = 0; + res = (*ccfn) (rptr, buf, (char **) NULL, base); + if ((flags & POINTER) && !(flags & VECTOR)) + *(va_arg (ap, void **)) = (void *) (unsigned _POINTER_INT) res; + else if (flags & SHORT) + { + if (!(flags & VECTOR)) + sp = va_arg (ap, short *); + else if (!looped) + sp = vec_buf.h; + *sp++ = res; + } + else if (flags & LONG) + { + if (!(flags & VECTOR)) + lp = va_arg (ap, long *); + else if (!looped) + lp = vec_buf.l; + *lp++ = res; + } +#ifndef _NO_LONGLONG + else if (flags & LONGDBL) + { + u_long_long resll; + if (ccfn == _strtoul_r) + resll = _strtoull_r (rptr, buf, (char **) NULL, base); + else + resll = _strtoll_r (rptr, buf, (char **) NULL, base); + llp = va_arg (ap, long long*); + *llp = resll; + } +#endif + else + { + if (!(flags & VECTOR)) + { + ip = va_arg (ap, int *); + *ip++ = res; + } + else + { + if (!looped) + ch_dest = vec_buf.c; + *ch_dest++ = (char)res; + } + } + if (!(flags & VECTOR)) + nassigned++; + } + nread += p - buf + skips; + break; + } + +#ifdef FLOATING_POINT + case CT_FLOAT: + { + /* scan a floating point number as if by strtod */ + /* This code used to assume that the number of digits is reasonable. + However, ANSI / ISO C makes no such stipulation; we have to get + exact results even when there is an unreasonable amount of + leading zeroes. */ + long leading_zeroes = 0; + long zeroes, exp_adjust; + char *exp_start = NULL; + unsigned fl_width = width; + unsigned width_left = 0; +#ifdef hardway + if (fl_width == 0 || fl_width > sizeof (buf) - 1) +#else + /* size_t is unsigned, hence this optimisation */ + if (fl_width - 1 > sizeof (buf) - 2) +#endif + { + width_left = fl_width - (sizeof (buf) - 1); + fl_width = sizeof (buf) - 1; + } + flags |= SIGNOK | NDIGITS | DPTOK | EXPOK; + zeroes = 0; + exp_adjust = 0; + for (p = buf; fl_width; ) + { + c = *fp->_p; + /* + * This code mimicks the integer conversion + * code, but is much simpler. + */ + switch (c) + { + + case '0': + if (flags & NDIGITS) + { + flags &= ~SIGNOK; + zeroes++; + if (width_left) + { + width_left--; + fl_width++; + } + goto fskip; + } + /* Fall through. */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + flags &= ~(SIGNOK | NDIGITS); + goto fok; + + case '+': + case '-': + if (flags & SIGNOK) + { + flags &= ~SIGNOK; + goto fok; + } + break; + case '.': + if (flags & DPTOK) + { + flags &= ~(SIGNOK | DPTOK); + leading_zeroes = zeroes; + goto fok; + } + break; + case 'e': + case 'E': + /* no exponent without some digits */ + if ((flags & (NDIGITS | EXPOK)) == EXPOK + || ((flags & EXPOK) && zeroes)) + { + if (! (flags & DPTOK)) + { + exp_adjust = zeroes - leading_zeroes; + exp_start = p; + } + flags = + (flags & ~(EXPOK | DPTOK)) | + SIGNOK | NDIGITS; + zeroes = 0; + goto fok; + } + break; + } + break; + fok: + *p++ = c; + fskip: + fl_width--; + ++nread; + if (--fp->_r > 0) + fp->_p++; + else +#ifndef CYGNUS_NEC + if (__srefill (fp)) +#endif + break; /* EOF */ + } + if (zeroes) + flags &= ~NDIGITS; + /* + * If no digits, might be missing exponent digits + * (just give back the exponent) or might be missing + * regular digits, but had sign and/or decimal point. + */ + if (flags & NDIGITS) + { + if (flags & EXPOK) + { + /* no digits at all */ + while (p > buf) + { + ungetc (*(u_char *)-- p, fp); + --nread; + } + goto match_failure; + } + /* just a bad exponent (e and maybe sign) */ + c = *(u_char *)-- p; + --nread; + if (c != 'e' && c != 'E') + { + (void) ungetc (c, fp); /* sign */ + c = *(u_char *)-- p; + --nread; + } + (void) ungetc (c, fp); + } + if ((flags & SUPPRESS) == 0) + { +#ifdef _NO_LONGDBL + double res; +#else /* !_NO_LONG_DBL */ + long double res; +#endif /* !_NO_LONG_DBL */ + long new_exp = 0; + + *p = 0; + if ((flags & (DPTOK | EXPOK)) == EXPOK) + { + exp_adjust = zeroes - leading_zeroes; + new_exp = -exp_adjust; + exp_start = p; + } + else if (exp_adjust) + new_exp = _strtol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust; + if (exp_adjust) + { + + /* If there might not be enough space for the new exponent, + truncate some trailing digits to make room. */ + if (exp_start >= buf + sizeof (buf) - MAX_LONG_LEN) + exp_start = buf + sizeof (buf) - MAX_LONG_LEN - 1; + sprintf (exp_start, "e%ld", new_exp); + } +#ifdef __SPE__ + if (flags & FIXEDPOINT) + { + __uint64_t ufix64; + if (flags & SIGNED) + ufix64 = (__uint64_t)_strtosfix64_r (rptr, buf, NULL); + else + ufix64 = _strtoufix64_r (rptr, buf, NULL); + if (flags & SHORT) + { + __uint16_t *sp = va_arg (ap, __uint16_t *); + *sp = (__uint16_t)(ufix64 >> 48); + } + else if (flags & LONG) + { + __uint64_t *llp = va_arg (ap, __uint64_t *); + *llp = ufix64; + } + else + { + __uint32_t *lp = va_arg (ap, __uint32_t *); + *lp = (__uint32_t)(ufix64 >> 32); + } + nassigned++; + break; + } + +#endif /* __SPE__ */ +#ifdef _NO_LONGDBL + res = _strtod_r (rptr, buf, NULL); +#else /* !_NO_LONGDBL */ + res = _strtold_r (rptr, buf, NULL); +#endif /* !_NO_LONGDBL */ + if (flags & LONG) + { + dp = va_arg (ap, double *); + *dp = res; + } + else if (flags & LONGDBL) + { + ldp = va_arg (ap, _LONG_DOUBLE *); + *ldp = res; + } + else + { + if (!(flags & VECTOR)) + flp = va_arg (ap, float *); + else if (!looped) + flp = vec_buf.f; + *flp++ = res; + } + if (!(flags & VECTOR)) + nassigned++; + } + break; + } +#endif /* FLOATING_POINT */ + } + if (vec_read_count-- > 1) + { + looped = 1; + goto process; + } + if (flags & VECTOR) + { + int i; + unsigned long *vp = va_arg (ap, unsigned long *); + for (i = 0; i < 4; ++i) + *vp++ = vec_buf.l[i]; + nassigned++; + } + } +input_failure: + return nassigned ? nassigned : -1; +match_failure: + return nassigned; +} + diff --git a/lib/machine/pru/Makefile.inc b/lib/machine/pru/Makefile.inc new file mode 100644 index 0000000..3b3f2dc --- /dev/null +++ b/lib/machine/pru/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.s diff --git a/lib/machine/riscv/Makefile.inc b/lib/machine/riscv/Makefile.inc new file mode 100644 index 0000000..47bbce0 --- /dev/null +++ b/lib/machine/riscv/Makefile.inc @@ -0,0 +1,3 @@ +libc_a_SOURCES += \ + %D%/memmove.S %D%/memmove-stub.c %D%/memset.S %D%/memcpy-asm.S %D%/memcpy.c %D%/strlen.c \ + %D%/strcpy.c %D%/strcmp.S %D%/setjmp.S %D%/ieeefp.c %D%/ffs.c diff --git a/lib/machine/riscv/ffs.c b/lib/machine/riscv/ffs.c new file mode 100644 index 0000000..2f2176e --- /dev/null +++ b/lib/machine/riscv/ffs.c @@ -0,0 +1,32 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ +#include + +int +ffs (int word) +{ +#if __riscv_xlen == 32 + return (__builtin_ffs (word)); +#else + int i; + + if (!word) + return 0; + + i = 0; + for (;;) + { + if (((1 << i++) & word) != 0) + return i; + } + return 0; +#endif +} diff --git a/lib/machine/riscv/ieeefp.c b/lib/machine/riscv/ieeefp.c new file mode 100644 index 0000000..60ecacf --- /dev/null +++ b/lib/machine/riscv/ieeefp.c @@ -0,0 +1,144 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#include + +#ifdef __riscv_flen +static void +fssr(unsigned value) +{ + asm volatile ("fscsr %0" :: "r"(value)); +} + +static unsigned +frsr() +{ + unsigned value; + asm volatile ("frcsr %0" : "=r" (value)); + return value; +} + +static fp_rnd +frm_fp_rnd (unsigned frm) +{ + switch (frm) + { + case 0: return FP_RN; + case 1: return FP_RZ; + case 2: return FP_RM; + case 3: return FP_RP; + /* 4 ~ 7 is invalid value, so just retun FP_RP. */ + default:return FP_RP; + } +} + +static fp_except +frm_fp_except (unsigned except) +{ + fp_except fp = 0; + if (except & (1 << 0)) + fp |= FP_X_IMP; + if (except & (1 << 1)) + fp |= FP_X_UFL; + if (except & (1 << 2)) + fp |= FP_X_OFL; + if (except & (1 << 3)) + fp |= FP_X_DX; + if (except & (1 << 4)) + fp |= FP_X_INV; + return fp; +} + +static unsigned +frm_except(fp_except fp) +{ + unsigned except = 0; + if (fp & FP_X_IMP) + except |= (1 << 0); + if (fp & FP_X_UFL) + except |= (1 << 1); + if (fp & FP_X_OFL) + except |= (1 << 2); + if (fp & FP_X_DX) + except |= (1 << 3); + if (fp & FP_X_INV) + except |= (1 << 4); + return except; +} + +#endif /* __riscv_flen */ + +fp_except +fpgetmask(void) +{ + return 0; +} + +fp_rnd +fpgetround(void) +{ +#ifdef __riscv_flen + unsigned rm = (frsr () >> 5) & 0x7; + return frm_fp_rnd (rm); +#else + return FP_RZ; +#endif /* __riscv_flen */ +} + +fp_except +fpgetsticky(void) +{ +#ifdef __riscv_flen + return frm_fp_except(frsr ()); +#else + return 0; +#endif /* __riscv_flen */ +} + +fp_except +fpsetmask(fp_except mask) +{ + return -1; +} + +fp_rnd +fpsetround(fp_rnd rnd_dir) +{ +#ifdef __riscv_flen + unsigned fsr = frsr (); + unsigned rm = (fsr >> 5) & 0x7; + unsigned new_rm; + switch (rnd_dir) + { + case FP_RN: new_rm = 0; break; + case FP_RZ: new_rm = 1; break; + case FP_RM: new_rm = 2; break; + case FP_RP: new_rm = 3; break; + default: return -1; + } + fssr (new_rm << 5 | fsr & 0x1f); + return frm_fp_rnd (rm); +#else + return -1; +#endif /* __riscv_flen */ +} + +fp_except +fpsetsticky(fp_except sticky) +{ +#ifdef __riscv_flen + unsigned fsr = frsr (); + fssr (frm_except(sticky) | (fsr & ~0x1f)); + return frm_fp_except(fsr); +#else + return -1; +#endif /* __riscv_flen */ +} diff --git a/lib/machine/riscv/memcpy-asm.S b/lib/machine/riscv/memcpy-asm.S new file mode 100644 index 0000000..5571e47 --- /dev/null +++ b/lib/machine/riscv/memcpy-asm.S @@ -0,0 +1,32 @@ +/* Copyright (c) 2019 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) +.text +.global memcpy +.type memcpy, @function +memcpy: + mv t1, a0 + beqz a2, 2f + +1: + lb t2, 0(a1) + sb t2, 0(t1) + add a2, a2, -1 + add t1, t1, 1 + add a1, a1, 1 + bnez a2, 1b + +2: + ret + + .size memcpy, .-memcpy +#endif diff --git a/lib/machine/riscv/memcpy.c b/lib/machine/riscv/memcpy.c new file mode 100644 index 0000000..4098f3a --- /dev/null +++ b/lib/machine/riscv/memcpy.c @@ -0,0 +1,88 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) +//memcpy defined in memcpy-asm.S +#else + +#include +#include +#include "../../string/local.h" + +#define unlikely(X) __builtin_expect (!!(X), 0) + +void * +__inhibit_loop_to_libcall +memcpy(void *__restrict aa, const void *__restrict bb, size_t n) +{ + #define BODY(a, b, t) { \ + t tt = *b; \ + a++, b++; \ + *(a - 1) = tt; \ + } + + char *a = (char *)aa; + const char *b = (const char *)bb; + char *end = a + n; + uintptr_t msk = sizeof (long) - 1; + if (unlikely ((((uintptr_t)a & msk) != ((uintptr_t)b & msk)) + || n < sizeof (long))) + { +small: + if (__builtin_expect (a < end, 1)) + while (a < end) + BODY (a, b, char); + return aa; + } + + if (unlikely (((uintptr_t)a & msk) != 0)) + while ((uintptr_t)a & msk) + BODY (a, b, char); + + long *la = (long *)a; + const long *lb = (const long *)b; + long *lend = (long *)((uintptr_t)end & ~msk); + + if (unlikely (lend - la > 8)) + { + while (lend - la > 8) + { + long b0 = *lb++; + long b1 = *lb++; + long b2 = *lb++; + long b3 = *lb++; + long b4 = *lb++; + long b5 = *lb++; + long b6 = *lb++; + long b7 = *lb++; + long b8 = *lb++; + *la++ = b0; + *la++ = b1; + *la++ = b2; + *la++ = b3; + *la++ = b4; + *la++ = b5; + *la++ = b6; + *la++ = b7; + *la++ = b8; + } + } + + while (la < lend) + BODY (la, lb, long); + + a = (char *)la; + b = (const char *)lb; + if (unlikely (a < end)) + goto small; + return aa; +} +#endif diff --git a/lib/machine/riscv/memmove-stub.c b/lib/machine/riscv/memmove-stub.c new file mode 100644 index 0000000..d882e46 --- /dev/null +++ b/lib/machine/riscv/memmove-stub.c @@ -0,0 +1,14 @@ +/* Copyright (c) 2019 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) +#include "../../string/memmove.c" +#endif diff --git a/lib/machine/riscv/memmove.S b/lib/machine/riscv/memmove.S new file mode 100644 index 0000000..66d9cd4 --- /dev/null +++ b/lib/machine/riscv/memmove.S @@ -0,0 +1,40 @@ +/* Copyright (c) 2019 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) +.text +.global memmove +.type memmove, @function +memmove: + beqz a2, 2f + + mv t1, a0 + li a3, 1 + bgtu a1, a0, 1f + + li a3, -1 + addi a4, a2 , -1 + add t1, t1, a4 + add a1, a1, a4 + +1: + lb t2, 0(a1) + sb t2, 0(t1) + add a2, a2, -1 + add t1, t1, a3 + add a1, a1, a3 + bnez a2, 1b + +2: + ret + + .size memmove, .-memmove +#endif diff --git a/lib/machine/riscv/memset.S b/lib/machine/riscv/memset.S new file mode 100644 index 0000000..a717ae7 --- /dev/null +++ b/lib/machine/riscv/memset.S @@ -0,0 +1,113 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +.text +.global memset +.type memset, @function +memset: +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + mv t1, a0 + beqz a2, 2f + +1: + sb a1, 0(t1) + add a2, a2, -1 + add t1, t1, 1 + bnez a2, 1b + +2: + ret + +#else + li t1, 15 + move a4, a0 + bleu a2, t1, .Ltiny + and a5, a4, 15 + bnez a5, .Lmisaligned + +.Laligned: + bnez a1, .Lwordify + +.Lwordified: + and a3, a2, ~15 + and a2, a2, 15 + add a3, a3, a4 + +#if __riscv_xlen == 64 +1:sd a1, 0(a4) + sd a1, 8(a4) +#else +1:sw a1, 0(a4) + sw a1, 4(a4) + sw a1, 8(a4) + sw a1, 12(a4) +#endif + add a4, a4, 16 + bltu a4, a3, 1b + + bnez a2, .Ltiny + ret + +.Ltiny: + sub a3, t1, a2 + sll a3, a3, 2 +1:auipc t0, %pcrel_hi(.Ltable) + add a3, a3, t0 +.option push +.option norvc +.Ltable_misaligned: + jr a3, %pcrel_lo(1b) +.Ltable: + sb a1,14(a4) + sb a1,13(a4) + sb a1,12(a4) + sb a1,11(a4) + sb a1,10(a4) + sb a1, 9(a4) + sb a1, 8(a4) + sb a1, 7(a4) + sb a1, 6(a4) + sb a1, 5(a4) + sb a1, 4(a4) + sb a1, 3(a4) + sb a1, 2(a4) + sb a1, 1(a4) + sb a1, 0(a4) +.option pop + ret + +.Lwordify: + and a1, a1, 0xFF + sll a3, a1, 8 + or a1, a1, a3 + sll a3, a1, 16 + or a1, a1, a3 +#if __riscv_xlen == 64 + sll a3, a1, 32 + or a1, a1, a3 +#endif + j .Lwordified + +.Lmisaligned: + sll a3, a5, 2 +1:auipc t0, %pcrel_hi(.Ltable_misaligned) + add a3, a3, t0 + mv t0, ra + jalr a3, %pcrel_lo(1b) + mv ra, t0 + + add a5, a5, -16 + sub a4, a4, a5 + add a2, a2, a5 + bleu a2, t1, .Ltiny + j .Laligned +#endif + .size memset, .-memset diff --git a/lib/machine/riscv/setjmp.S b/lib/machine/riscv/setjmp.S new file mode 100644 index 0000000..eef242e --- /dev/null +++ b/lib/machine/riscv/setjmp.S @@ -0,0 +1,98 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#include + +/* int setjmp (jmp_buf); */ + .globl setjmp + .type setjmp, @function +setjmp: + REG_S ra, 0*SZREG(a0) + REG_S s0, 1*SZREG(a0) + REG_S s1, 2*SZREG(a0) + +#ifndef __riscv_32e + REG_S s2, 3*SZREG(a0) + REG_S s3, 4*SZREG(a0) + REG_S s4, 5*SZREG(a0) + REG_S s5, 6*SZREG(a0) + REG_S s6, 7*SZREG(a0) + REG_S s7, 8*SZREG(a0) + REG_S s8, 9*SZREG(a0) + REG_S s9, 10*SZREG(a0) + REG_S s10,11*SZREG(a0) + REG_S s11,12*SZREG(a0) + REG_S sp, 13*SZREG(a0) +#else + REG_S sp, 3*SZREG(a0) +#endif + +#ifndef __riscv_float_abi_soft + FREG_S fs0, 14*SZREG+ 0*SZFREG(a0) + FREG_S fs1, 14*SZREG+ 1*SZFREG(a0) + FREG_S fs2, 14*SZREG+ 2*SZFREG(a0) + FREG_S fs3, 14*SZREG+ 3*SZFREG(a0) + FREG_S fs4, 14*SZREG+ 4*SZFREG(a0) + FREG_S fs5, 14*SZREG+ 5*SZFREG(a0) + FREG_S fs6, 14*SZREG+ 6*SZFREG(a0) + FREG_S fs7, 14*SZREG+ 7*SZFREG(a0) + FREG_S fs8, 14*SZREG+ 8*SZFREG(a0) + FREG_S fs9, 14*SZREG+ 9*SZFREG(a0) + FREG_S fs10,14*SZREG+10*SZFREG(a0) + FREG_S fs11,14*SZREG+11*SZFREG(a0) +#endif + + li a0, 0 + ret + .size setjmp, .-setjmp + +/* volatile void longjmp (jmp_buf, int); */ + .globl longjmp + .type longjmp, @function +longjmp: + REG_L ra, 0*SZREG(a0) + REG_L s0, 1*SZREG(a0) + REG_L s1, 2*SZREG(a0) +#ifndef __riscv_32e + REG_L s2, 3*SZREG(a0) + REG_L s3, 4*SZREG(a0) + REG_L s4, 5*SZREG(a0) + REG_L s5, 6*SZREG(a0) + REG_L s6, 7*SZREG(a0) + REG_L s7, 8*SZREG(a0) + REG_L s8, 9*SZREG(a0) + REG_L s9, 10*SZREG(a0) + REG_L s10,11*SZREG(a0) + REG_L s11,12*SZREG(a0) + REG_L sp, 13*SZREG(a0) +#else + REG_L sp, 3*SZREG(a0) +#endif + +#ifndef __riscv_float_abi_soft + FREG_L fs0, 14*SZREG+ 0*SZFREG(a0) + FREG_L fs1, 14*SZREG+ 1*SZFREG(a0) + FREG_L fs2, 14*SZREG+ 2*SZFREG(a0) + FREG_L fs3, 14*SZREG+ 3*SZFREG(a0) + FREG_L fs4, 14*SZREG+ 4*SZFREG(a0) + FREG_L fs5, 14*SZREG+ 5*SZFREG(a0) + FREG_L fs6, 14*SZREG+ 6*SZFREG(a0) + FREG_L fs7, 14*SZREG+ 7*SZFREG(a0) + FREG_L fs8, 14*SZREG+ 8*SZFREG(a0) + FREG_L fs9, 14*SZREG+ 9*SZFREG(a0) + FREG_L fs10,14*SZREG+10*SZFREG(a0) + FREG_L fs11,14*SZREG+11*SZFREG(a0) +#endif + + seqz a0, a1 + add a0, a0, a1 # a0 = (a1 == 0) ? 1 : a1 + ret + .size longjmp, .-longjmp diff --git a/lib/machine/riscv/strcmp.S b/lib/machine/riscv/strcmp.S new file mode 100644 index 0000000..9af9ca1 --- /dev/null +++ b/lib/machine/riscv/strcmp.S @@ -0,0 +1,196 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#include + +.text +.globl strcmp +.type strcmp, @function +strcmp: +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) +1: + lbu a2, 0(a0) + lbu a3, 0(a1) + add a0, a0, 1 + add a1, a1, 1 + bne a2, a3, 2f + bnez a2, 1b + +2: + sub a0, a2, a3 + ret + +.size strcmp, .-strcmp +#else + or a4, a0, a1 + li t2, -1 + and a4, a4, SZREG-1 + bnez a4, .Lmisaligned + +#if SZREG == 4 + li a5, 0x7f7f7f7f +#else + ld a5, mask +#endif + + .macro check_one_word i n + REG_L a2, \i*SZREG(a0) + REG_L a3, \i*SZREG(a1) + + and t0, a2, a5 + or t1, a2, a5 + add t0, t0, a5 + or t0, t0, t1 + + bne t0, t2, .Lnull\i + .if \i+1-\n + bne a2, a3, .Lmismatch + .else + add a0, a0, \n*SZREG + add a1, a1, \n*SZREG + beq a2, a3, .Lloop + # fall through to .Lmismatch + .endif + .endm + + .macro foundnull i n + .ifne \i + .Lnull\i: + add a0, a0, \i*SZREG + add a1, a1, \i*SZREG + .ifeq \i-1 + .Lnull0: + .endif + bne a2, a3, .Lmisaligned + li a0, 0 + ret + .endif + .endm + +.Lloop: + # examine full words at a time, favoring strings of a couple dozen chars +#if __riscv_xlen == 32 + check_one_word 0 5 + check_one_word 1 5 + check_one_word 2 5 + check_one_word 3 5 + check_one_word 4 5 +#else + check_one_word 0 3 + check_one_word 1 3 + check_one_word 2 3 +#endif + # backwards branch to .Lloop contained above + +.Lmismatch: + # words don't match, but a2 has no null byte. + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + +#if __riscv_xlen == 64 + sll a4, a2, 48 + sll a5, a3, 48 + bne a4, a5, .Lmismatch_upper + sll a4, a2, 32 + sll a5, a3, 32 + bne a4, a5, .Lmismatch_upper +#endif + sll a4, a2, 16 + sll a5, a3, 16 + bne a4, a5, .Lmismatch_upper + + srl a4, a2, 8*SZREG-16 + srl a5, a3, 8*SZREG-16 + sub a0, a4, a5 + and a1, a0, 0xff + bnez a1, 1f + ret + +.Lmismatch_upper: + srl a4, a4, 8*SZREG-16 + srl a5, a5, 8*SZREG-16 + sub a0, a4, a5 + and a1, a0, 0xff + bnez a1, 1f + ret + +1:and a4, a4, 0xff + and a5, a5, 0xff + sub a0, a4, a5 + ret + +#else + +#if __riscv_xlen == 64 + srl a4, a2, 48 + srl a5, a3, 48 + bne a4, a5, .Lmismatch_lower + srl a4, a2, 32 + srl a5, a3, 32 + bne a4, a5, .Lmismatch_lower +#endif + srl a4, a2, 16 + srl a5, a3, 16 + bne a4, a5, .Lmismatch_lower + + srl a4, a2, 8 + srl a5, a3, 8 + bne a4, a5, 1f + and a4, a2, 0xff + and a5, a3, 0xff +1:sub a0, a4, a5 + ret + +.Lmismatch_lower: + srl a2, a4, 8 + srl a3, a5, 8 + bne a2, a3, 1f + and a2, a4, 0xff + and a3, a5, 0xff +1:sub a0, a2, a3 + ret + +#endif + +.Lmisaligned: + # misaligned + lbu a2, 0(a0) + lbu a3, 0(a1) + add a0, a0, 1 + add a1, a1, 1 + bne a2, a3, 1f + bnez a2, .Lmisaligned + +1: + sub a0, a2, a3 + ret + + # cases in which a null byte was detected +#if __riscv_xlen == 32 + foundnull 0 5 + foundnull 1 5 + foundnull 2 5 + foundnull 3 5 + foundnull 4 5 +#else + foundnull 0 3 + foundnull 1 3 + foundnull 2 3 +#endif +.size strcmp, .-strcmp + +#if SZREG == 8 +.section .srodata.cst8,"aM",@progbits,8 +.align 3 +mask: +.dword 0x7f7f7f7f7f7f7f7f +#endif +#endif diff --git a/lib/machine/riscv/strcpy.c b/lib/machine/riscv/strcpy.c new file mode 100644 index 0000000..6d802fa --- /dev/null +++ b/lib/machine/riscv/strcpy.c @@ -0,0 +1,64 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#include +#include + +char *strcpy(char *dst, const char *src) +{ + char *dst0 = dst; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + int misaligned = ((uintptr_t)dst | (uintptr_t)src) & (sizeof (long) - 1); + if (__builtin_expect(!misaligned, 1)) + { + long *ldst = (long *)dst; + const long *lsrc = (const long *)src; + + while (!__libc_detect_null(*lsrc)) + *ldst++ = *lsrc++; + + dst = (char *)ldst; + src = (const char *)lsrc; + + char c0 = src[0]; + char c1 = src[1]; + char c2 = src[2]; + if (!(*dst++ = c0)) return dst0; + if (!(*dst++ = c1)) return dst0; + char c3 = src[3]; + if (!(*dst++ = c2)) return dst0; + if (sizeof (long) == 4) goto out; + char c4 = src[4]; + if (!(*dst++ = c3)) return dst0; + char c5 = src[5]; + if (!(*dst++ = c4)) return dst0; + char c6 = src[6]; + if (!(*dst++ = c5)) return dst0; + if (!(*dst++ = c6)) return dst0; + +out: + *dst++ = 0; + return dst0; + } +#endif /* not PREFER_SIZE_OVER_SPEED */ + + char ch; + do + { + ch = *src; + src++; + dst++; + *(dst - 1) = ch; + } while (ch); + + return dst0; +} diff --git a/lib/machine/riscv/strlen.c b/lib/machine/riscv/strlen.c new file mode 100644 index 0000000..3b04066 --- /dev/null +++ b/lib/machine/riscv/strlen.c @@ -0,0 +1,53 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#include +#include + +size_t strlen(const char *str) +{ + const char *start = str; + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + while (*str++) + ; + return str - start - 1; +#else + if (__builtin_expect ((uintptr_t)str & (sizeof (long) - 1), 0)) do + { + char ch = *str; + str++; + if (!ch) + return str - start - 1; + } while ((uintptr_t)str & (sizeof (long) - 1)); + + unsigned long *ls = (unsigned long *)str; + while (!__libc_detect_null (*ls++)) + ; + asm volatile ("" : "+r"(ls)); /* prevent "optimization" */ + + str = (const char *)ls; + size_t ret = str - start, sl = sizeof (long); + + char c0 = str[0 - sl], c1 = str[1 - sl], c2 = str[2 - sl], c3 = str[3 - sl]; + if (c0 == 0) return ret + 0 - sl; + if (c1 == 0) return ret + 1 - sl; + if (c2 == 0) return ret + 2 - sl; + if (sl == 4 || c3 == 0) return ret + 3 - sl; + + c0 = str[4 - sl], c1 = str[5 - sl], c2 = str[6 - sl], c3 = str[7 - sl]; + if (c0 == 0) return ret + 4 - sl; + if (c1 == 0) return ret + 5 - sl; + if (c2 == 0) return ret + 6 - sl; + + return ret + 7 - sl; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/machine/riscv/sys/asm.h b/lib/machine/riscv/sys/asm.h new file mode 100644 index 0000000..8c8aeb3 --- /dev/null +++ b/lib/machine/riscv/sys/asm.h @@ -0,0 +1,50 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#ifndef _SYS_ASM_H +#define _SYS_ASM_H + +/* + * Macros to handle different pointer/register sizes for 32/64-bit code + */ +#if __riscv_xlen == 64 +# define PTRLOG 3 +# define SZREG 8 +# define REG_S sd +# define REG_L ld +#elif __riscv_xlen == 32 +# define PTRLOG 2 +# define SZREG 4 +# define REG_S sw +# define REG_L lw +#else +# error __riscv_xlen must equal 32 or 64 +#endif + +#ifndef __riscv_float_abi_soft +/* For ABI uniformity, reserve 8 bytes for floats, even if double-precision + floating-point is not supported in hardware. */ +# define SZFREG 8 +# ifdef __riscv_float_abi_single +# define FREG_L flw +# define FREG_S fsw +# elif defined(__riscv_float_abi_double) +# define FREG_L fld +# define FREG_S fsd +# elif defined(__riscv_float_abi_quad) +# define FREG_L flq +# define FREG_S fsq +# else +# error unsupported FLEN +# endif +#endif + +#endif /* sys/asm.h */ diff --git a/lib/machine/riscv/sys/fenv.h b/lib/machine/riscv/sys/fenv.h new file mode 100644 index 0000000..772f383 --- /dev/null +++ b/lib/machine/riscv/sys/fenv.h @@ -0,0 +1,88 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#ifndef _SYS_FENV_H +#define _SYS_FENV_H + +#include + +#if __riscv_flen + +/* Per "The RISC-V Instruction Set Manual: Volume I: User-Level ISA: + * Version 2.1", Section 8.2, "Floating-Point Control and Status + * Register": + * + * Flag Mnemonic Flag Meaning + * ------------- ----------------- + * NV Invalid Operation + * DZ Divide by Zero + * OF Overflow + * UF Underflow + * NX Inexact + */ + +#define FE_INVALID 0x00000010 +#define FE_DIVBYZERO 0x00000008 +#define FE_OVERFLOW 0x00000004 +#define FE_UNDERFLOW 0x00000002 +#define FE_INEXACT 0x00000001 + +#define FE_ALL_EXCEPT (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW|FE_INEXACT) + +/* Per "The RISC-V Instruction Set Manual: Volume I: User-Level ISA: + * Version 2.1", Section 8.2, "Floating-Point Control and Status + * Register": + * + * Rounding Mode Mnemonic Meaning Meaning + * ------------- ---------------- ------- + * 000 RNE Round to Nearest, ties to Even + * 001 RTZ Round towards Zero + * 010 RDN Round Down (towards −∞) + * 011 RUP Round Up (towards +∞) + * 100 RMM Round to Nearest, ties to Max Magnitude + * 101 Invalid. Reserved for future use. + * 110 Invalid. Reserved for future use. + * 111 In instruction’s rm field, selects dynamic rounding mode; + * In Rounding Mode register, Invalid + */ + +#define FE_TONEAREST_MM 0x00000004 +#define FE_UPWARD 0x00000003 +#define FE_DOWNWARD 0x00000002 +#define FE_TOWARDZERO 0x00000001 +#define FE_TONEAREST 0x00000000 + +#define FE_RMODE_MASK 0x7 + +/* Per "The RISC-V Instruction Set Manual: Volume I: User-Level ISA: + * Version 2.1": + * + * "The F extension adds 32 floating-point registers, f0–f31, each 32 + * bits wide, and a floating-point control and status register fcsr, + * which contains the operating mode and exception status of the + * floating-point unit." + */ + +#else /* !__riscv_flen */ + +#define FE_ALL_EXCEPT 0x00000000 +#define FE_TONEAREST 0x00000000 + +#endif /* !__riscv_flen */ + +typedef size_t fenv_t; +typedef size_t fexcept_t; +extern const fenv_t fe_dfl_env; +extern const fenv_t *fe_dfl_env_p; + +#define FE_DFL_ENV fe_dfl_env_p + +#endif /* _SYS_FENV_H */ diff --git a/lib/machine/riscv/sys/string.h b/lib/machine/riscv/sys/string.h new file mode 100644 index 0000000..beebe31 --- /dev/null +++ b/lib/machine/riscv/sys/string.h @@ -0,0 +1,23 @@ +/* Copyright (c) 2017 SiFive Inc. All rights reserved. + + This copyrighted material is made available to anyone wishing to use, + modify, copy, or redistribute it subject to the terms and conditions + of the FreeBSD License. This program is distributed in the hope that + it will be useful, but WITHOUT ANY WARRANTY expressed or implied, + including the implied warranties of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. A copy of this license is available at + http://www.opensource.org/licenses. +*/ + +#ifndef _SYS_STRING_H +#define _SYS_STRING_H + +static __inline unsigned long __libc_detect_null(unsigned long w) +{ + unsigned long mask = 0x7f7f7f7f; + if (sizeof (long) == 8) + mask = ((mask << 16) << 16) | mask; + return ~(((w & mask) + mask) | w | mask); +} + +#endif diff --git a/lib/machine/rl78/Makefile.inc b/lib/machine/rl78/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/rl78/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/rl78/setjmp.S b/lib/machine/rl78/setjmp.S new file mode 100644 index 0000000..552f8e1 --- /dev/null +++ b/lib/machine/rl78/setjmp.S @@ -0,0 +1,186 @@ +/* + +Copyright (c) 2011 Red Hat Incorporated. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifdef __RL78_G10__ +; clobberable +r8 = 0xffec8 +r9 = 0xffec9 +r10 = 0xffeca +r11 = 0xffecb +r12 = 0xffecc +r13 = 0xffecd +r14 = 0xffece +r15 = 0xffecf +; preserved +r16 = 0xffed0 +r17 = 0xffed1 +r18 = 0xffed2 +r19 = 0xffed3 +r20 = 0xffed4 +r21 = 0xffed5 +r22 = 0xffed6 +r23 = 0xffed7 +#else +; clobberable +r8 = 0xffef0 +r9 = 0xffef1 +r10 = 0xffef2 +r11 = 0xffef3 +r12 = 0xffef4 +r13 = 0xffef5 +r14 = 0xffef6 +r15 = 0xffef7 +; preserved +r16 = 0xffee8 +r17 = 0xffee9 +r18 = 0xffeea +r19 = 0xffeeb +r20 = 0xffeec +r21 = 0xffeed +r22 = 0xffeee +r23 = 0xffeef +#endif + +/* The jump buffer has the following structure: + R0 .. R23 3*8 bytes + SP 2 bytes + ES 1 byte + CS 1 byte + PC 4 bytes +*/ + + .macro _saveb ofs,reg + mov a,\reg + mov [hl+\ofs],a + .endm + .macro _save ofs,reg + movw ax,\reg + movw [hl+\ofs],ax + .endm + + .global _setjmp + .type _setjmp, @function +_setjmp: + ;; R8 = setjmp (jmp_buf *[sp+4].w) + ;; must return zero !! + push ax + push hl + push ax + movw ax, [sp+10] + movw hl, ax + pop ax + movw [hl], ax + _save 2, bc + _save 4, de + pop ax + movw [hl+6], ax + _save 8, r8 + _save 10, r10 + _save 12, r12 + _save 14, r14 + _save 16, r16 + _save 18, r18 + _save 20, r20 + _save 22, r22 + + ;; The sp we have now includes one more pushed reg, plus $PC + movw ax, sp + addw ax, #6 + movw [hl+24], ax + + _saveb 26, es + _saveb 27, cs + _save 28, [sp+2] + _save 30, [sp+4] + + clrw ax + movw r8, ax + pop ax + ret + + .size _setjmp, . - _setjmp + + .macro _loadb ofs,reg + mov a,[hl+\ofs] + mov \reg,a + .endm + .macro _load ofs,reg + movw ax,[hl+\ofs] + movw \reg,ax + .endm + .macro _push ofs + movw ax,[hl+\ofs] + push ax + .endm + + .global _longjmp + .type _longjmp, @function +_longjmp: + ;; noreturn longjmp (jmp_buf *[sp+4].w, int [sp+6].w) + movw ax, [sp+6] + cmpw ax,#0 + sknz + onew ax + movw r8, ax + + movw ax, [sp+4] + movw hl, ax + movw ax, [hl+24] + movw sp, ax ; this is the *new* stack + + _push 30 ; high half of PC + _push 28 ; low half of PC + _push 6 ; HL + _push 0 ; AX + + _load 2, bc + _load 4, de + + _load 10, r10 + _load 12, r12 + _load 14, r14 + _load 16, r16 + _load 18, r18 + _load 20, r20 + _load 22, r22 + + _loadb 26, es + _loadb 27, cs + + pop ax + pop hl + + + ret ; pops PC (4 bytes) + + .size _longjmp, . - _longjmp + diff --git a/lib/machine/rx/Makefile.inc b/lib/machine/rx/Makefile.inc new file mode 100644 index 0000000..5c28f06 --- /dev/null +++ b/lib/machine/rx/Makefile.inc @@ -0,0 +1,4 @@ +libc_a_SOURCES += \ + %D%/setjmp.S \ + %D%/strncmp.S %D%/strcmp.S %D%/strncpy.S %D%/strcpy.S %D%/strlen.S %D%/strcat.S %D%/strncat.S \ + %D%/memset.S %D%/mempcpy.S %D%/memcpy.S %D%/memmove.S %D%/memchr.S diff --git a/lib/machine/rx/memchr.S b/lib/machine/rx/memchr.S new file mode 100644 index 0000000..cdc97c8 --- /dev/null +++ b/lib/machine/rx/memchr.S @@ -0,0 +1,32 @@ + .file "memchr.S" + + .section .text + + .global _memchr + .type _memchr,@function +_memchr: + ;; R1: string pointer + ;; R2: byte sought + ;; R3: max number to scan +#ifdef __RX_DISALLOW_STRING_INSNS__ + mov.b r2, r2 ; The mov.b below sign extends as it loads, so make sure that r2 is sign-extended as well. +2: cmp #0, r3 + beq 1f + sub #1, r3 + mov.b [r1+], r5 + cmp r5, r2 + bne 2b + + sub #1, r1 ; We have found a match, bit now R1 points to the byte after the match. +1: rts +#else + cmp #0, r3 ; If r3 is 0 suntil.b will do nothing and not set any flags... + stz #1, r1 ; ...so store 1 into r1. It will be decremented by the SUB later. + suntil.b ; Search until *r1 == r2 or r3 bytes have been examined. + stnz #1, r1 ; If no match was found return NULL. + sub #1, r1 ; suntil.b leaves r1 pointing at the address *after* the match. + rts +#endif + + .size _memchr, . - _memchr + diff --git a/lib/machine/rx/memcpy.S b/lib/machine/rx/memcpy.S new file mode 100644 index 0000000..eb671c0 --- /dev/null +++ b/lib/machine/rx/memcpy.S @@ -0,0 +1,31 @@ + .file "memcpy.S" + + .section .text + .global _memcpy + .type _memcpy,@function +_memcpy: +#ifdef __RX_DISALLOW_STRING_INSNS__ + /* Do not use the string instructions - they might prefetch + bytes from outside of valid memory. This is particularly + dangerous in I/O space. */ + + ;; FIXME: It would be more space efficient to just branch to _memmove... + + cmp #0, r3 ; If the count is zero, do nothing + beq 1f + + mov r1, r14 ; Save a copy of DEST + +2: mov.b [r2+], r5 + mov.b r5, [r14+] + sub #1, r3 + bne 2b + +1: rts +#else + mov r1, r4 ; Save a copy of DEST + smovf ; Copy R2 (source) to R1 (dest). Stop after R3 bytes. + mov r4, r1 ; Return DEST + rts +#endif + .size _memcpy, . - _memcpy diff --git a/lib/machine/rx/memmove.S b/lib/machine/rx/memmove.S new file mode 100644 index 0000000..60b7683 --- /dev/null +++ b/lib/machine/rx/memmove.S @@ -0,0 +1,57 @@ + .file "memmove.S" + + .section .text + .global _memmove + .type _memmove,@function +_memmove: + ;; R1: DEST + ;; R2: SRC + ;; R3: COUNT +#ifdef __RX_DISALLOW_STRING_INSNS__ + /* Do not use the string instructions - they might prefetch + bytes from outside of valid memory. This is particularly + dangerous in I/O space. */ + + cmp #0, r3 ; If the count is zero, do nothing + beq 4f + + cmp r1, r2 + blt 3f ; If SRC < DEST copy backwards + + mov r1, r14 ; Save a copy of DEST + +5: mov.b [r2+], r5 + mov.b r5, [r14+] + sub #1, r3 + bne 5b + +4: rts + +3: add r3, r1 + add r3, r2 + +6: mov.b [-r2], r5 + mov.b r5, [-r1] + sub #1, r3 + bne 6b + + rts +#else + mov r1, r4 ; Save a copy of DEST + cmp r1, r2 + blt 2f ; If SRC (r2) is less than DEST (r1) then copy backwards + smovf +1: + mov r4, r1 ; Return DEST + rts +2: + add r3, r1 ; The SMOVB instructions requires the DEST in r1 and the + add r3, r2 ; SRC in r2 but it needs them to point the last bytes of + sub #1, r2 ; the regions involved not the first bytes, hence these + sub #1, r1 ; additions and subtractions. + smovb + bra 1b + +#endif /* SMOVF allowed. */ + + .size _memmove, . - _memmove diff --git a/lib/machine/rx/mempcpy.S b/lib/machine/rx/mempcpy.S new file mode 100644 index 0000000..f824524 --- /dev/null +++ b/lib/machine/rx/mempcpy.S @@ -0,0 +1,25 @@ + .file "mempcpy.S" + + .section .text + .global _mempcpy + .type _mempcpy,@function +_mempcpy: +#ifdef __RX_DISALLOW_STRING_INSNS__ + /* Do not use the string instructions - they might prefetch + bytes from outside of valid memory. This is particularly + dangerous in I/O space. */ + + cmp #0, r3 ; If the count is zero, do nothing + beq 2f + +1: mov.b [r2+], r5 + mov.b r5, [r1+] + sub #1, r3 + bne 1b + +2: rts +#else + smovf + rts +#endif + .size _mempcpy, . - _mempcpy diff --git a/lib/machine/rx/memset.S b/lib/machine/rx/memset.S new file mode 100644 index 0000000..5ce7a3b --- /dev/null +++ b/lib/machine/rx/memset.S @@ -0,0 +1,13 @@ + .file "memset.S" + + .section .text + .global _memset + .type _memset,@function +_memset: + mov r1, r4 + sstr.b + mov r4, r1 + rts + + .size _memset, . - _memset + diff --git a/lib/machine/rx/setjmp.S b/lib/machine/rx/setjmp.S new file mode 100644 index 0000000..bccc503 --- /dev/null +++ b/lib/machine/rx/setjmp.S @@ -0,0 +1,89 @@ +# setjmp/longjmp for Renesas RX. +# +# The jmpbuf looks like this: +# +# Register jmpbuf offset +# R0 0x0 +# R1 0x4 +# R2 0x8 +# R3 0xc +# R4 0x10 +# R5 0x14 +# R6 0x18 +# R7 0x1c +# R8 0x20 +# R9 0x24 +# R10 0x28 +# R11 0x2c +# R12 0x30 +# R13 0x34 +# R14 0x38 +# R15 0x3c +# PC 0x40 +# +# R1 contains the pointer to jmpbuf: +# +# int R1 = setjmp (jmp_buf R1) +# void longjmp (jmp_buf R1, int R2) +# +# The ABI allows for R1-R5 to be clobbered by functions. We must be +# careful to always leave the stack in a usable state in case an +# interrupt happens. + + .text + .global _setjmp + .type _setjmp, @function +_setjmp: + mov.l r0, [r1] ; save all the general registers + mov.l r1, 0x4[r1] ; longjmp won't use this, but someone else might. + mov.l r2, 0x8[r1] + mov.l r3, 0xc[r1] + mov.l r4, 0x10[r1] + mov.l r5, 0x14[r1] + mov.l r6, 0x18[r1] + mov.l r7, 0x1c[r1] + mov.l r8, 0x20[r1] + mov.l r9, 0x24[r1] + mov.l r10, 0x28[r1] + mov.l r11, 0x2c[r1] + mov.l r12, 0x30[r1] + mov.l r13, 0x34[r1] + mov.l r14, 0x38[r1] + mov.l r15, 0x3c[r1] + mov.l [r0], r2 ; get return address off the stack + mov.l r2, 0x40[r1] ; PC + mov #0, r1 ; Return 0. + rts +.Lend1: + .size _setjmp, .Lend1 - _setjmp + + + .global _longjmp + .type _longjmp, @function +_longjmp: + tst r2, r2 ; Set the Z flag if r2 is 0. + stz #1, r2 ; If the Z flag was set put 1 into the return register. + mov r2, 4[r1] ; Put r2 (our return value) into the setjmp buffer as r1. + + mov.l [r1], r0 ; Restore the stack - there's a slot for PC + mov.l 0x40[r1], r2 ; Get the saved PC + mov.l r2, [r0] ; Overwrite the old return address + + mov.l 0x3c[r1], r15 + mov.l 0x38[r1], r14 + mov.l 0x34[r1], r13 + mov.l 0x30[r1], r12 + mov.l 0x2c[r1], r11 + mov.l 0x28[r1], r10 + mov.l 0x24[r1], r9 + mov.l 0x20[r1], r8 + mov.l 0x1c[r1], r7 + mov.l 0x18[r1], r6 + mov.l 0x14[r1], r5 + mov.l 0x10[r1], r4 + mov.l 0xc[r1], r3 + mov.l 0x8[r1], r2 + mov.l 0x4[r1], r1 ; This sets up the new return value + rts +.Lend2: + .size _longjmp, .Lend2 - _longjmp diff --git a/lib/machine/rx/strcat.S b/lib/machine/rx/strcat.S new file mode 100644 index 0000000..22533fc --- /dev/null +++ b/lib/machine/rx/strcat.S @@ -0,0 +1,41 @@ + .file "strcat.S" + + .section .text + .global _strcat + .type _strcat,@function +_strcat: + ;; On entry: r1 => Destination + ;; r2 => Source +#ifdef __RX_DISALLOW_STRING_INSNS__ + mov r1, r4 ; Save a copy of the dest pointer. + +1: mov.b [r4+], r5 ; Find the NUL byte at the end of R4. + cmp #0, r5 + bne 1b + + sub #1, r4 ; Move R4 back to point at the NUL byte. + +2: mov.b [r2+], r5 ; Copy bytes from R2 to R4 until we reach a NUL byte. + mov.b r5, [r4+] + cmp #0, r5 + bne 2b + + rts +#else + mov r1, r4 ; Save a copy of the dest pointer. + mov r2, r5 ; Save a copy of the source pointer. + + mov #0, r2 ; Search for the NUL byte. + mov #-1, r3 ; Limit on the number of bytes examined. + suntil.b ; Find the end of the destination string. + sub #1, r1 ; suntil.b leaves r1 pointing to the byte beyond the match. + + mov #-1, r3 ; Set a limit on the number of bytes copied. + mov r5, r2 ; Restore the source pointer. + smovu ; Copy source to destination + + mov r4, r1 ; Return the original dest pointer. + rts +#endif + .size _strcat, . - _strcat + diff --git a/lib/machine/rx/strcmp.S b/lib/machine/rx/strcmp.S new file mode 100644 index 0000000..6a06e6c --- /dev/null +++ b/lib/machine/rx/strcmp.S @@ -0,0 +1,33 @@ + .file "strcmp.S" + + .section .text + + .global _strcmp + .type _strcmp,@function +_strcmp: +#ifdef __RX_DISALLOW_STRING_INSNS__ +2: mov.b [r1+], r4 + mov.b [r2+], r5 + cmp #0, r4 + beq 3f + cmp #0, r5 + beq 3f + cmp r4, r5 + beq 2b + +3: and #0xff, r4 ; We need to perform an unsigned comparison of the bytes. + and #0xff, r5 + sub r5, r4, r1 + rts +#else + mov #-1, r3 ; Strictly speaking this is incorrect, but I doubt if anyone will ever know. + scmpu ; Perform the string comparison + bnc 1f ; If Carry is not set skip over + scne.L r1 ; Set result based on Z flag + rts ; +1: ; + mov #-1,r1 ; Carry not set, result should be negative + rts ; +#endif + .size _strcmp, . - _strcmp + diff --git a/lib/machine/rx/strcpy.S b/lib/machine/rx/strcpy.S new file mode 100644 index 0000000..05766cc --- /dev/null +++ b/lib/machine/rx/strcpy.S @@ -0,0 +1,25 @@ + .file "strcpy.S" + + .section .text + .global _strcpy + .type _strcpy,@function +_strcpy: + ;; R1: dest + ;; R2: source +#ifdef __RX_DISALLOW_STRING_INSNS__ + mov r1, r4 ; Leave the destination address unchanged in the result register. + +1: mov.b [r2+], r5 + mov.b r5, [r4+] + cmp #0, r5 + bne 1b + + rts +#else + mov r1, r4 + mov #-1, r3 ; Strictly speaking this is incorrect, but I doubt if anyone will ever know. + smovu + mov r4, r1 + rts +#endif + .size _strcpy, . - _strcpy diff --git a/lib/machine/rx/strlen.S b/lib/machine/rx/strlen.S new file mode 100644 index 0000000..bf12c0c --- /dev/null +++ b/lib/machine/rx/strlen.S @@ -0,0 +1,29 @@ + .file "strlen.S" + + .section .text + + .global _strlen + .type _strlen,@function +_strlen: +#ifdef __RX_DISALLOW_STRING_INSNS__ + mov r1, r4 + +1: mov.b [r1+], r5 + cmp #0, r5 + bne 1b + + sub #1, r1 + sub r4, r1 + rts +#else + add #0, r1, r4 ; Save a copy of the string start address and set the condition flags. + beq null_string ; Test for a NULL pointer. + mov #-1, r3 ; Set a limit on the number of bytes examined. + mov #0, r2 ; Stop searching when we find a NUL byte. + suntil.b ; Search until *r1 == r2 + sub #1, r1 ; suntil.b leaves r1 pointing to the byte beyond the match. +null_string: + sub r4, r1 ; Compute the length. + rts +#endif + .size _strlen, . - _strlen diff --git a/lib/machine/rx/strncat.S b/lib/machine/rx/strncat.S new file mode 100644 index 0000000..ba544a4 --- /dev/null +++ b/lib/machine/rx/strncat.S @@ -0,0 +1,58 @@ + .file "strncat.S" + + .section .text + .global _strncat + .type _strncat,@function +_strncat: + ;; On entry: r1 => Destination + ;; r2 => Source + ;; r3 => Max number of bytes to copy +#ifdef __RX_DISALLOW_STRING_INSNS__ + cmp #0, r3 ; If max is zero we have nothing to do. + beq 2f + + mov r1, r4 ; Leave the desintation pointer intact for the return value. + +1: mov.b [r4+], r5 ; Find the NUL byte at the end of the destination. + cmp #0, r5 + bne 1b + + sub #1, r4 + +3: mov.b [r2+], r5 ; Copy bytes from the source into the destination ... + mov.b r5, [r4+] + cmp #0, r5 ; ... until we reach a NUL byte ... + beq 2f + sub #1, r3 + bne 3b ; ... or we have copied N bytes. + +2: rts +#else + mov r1, r4 ; Save a copy of the dest pointer. + mov r2, r5 ; Save a copy of the source pointer. + mov r3, r14 ; Save a copy of the byte count. + + mov #0, r2 ; Search for the NUL byte. + mov #-1, r3 ; Search until we run out of memory. + suntil.b ; Find the end of the destination string. + sub #1, r1 ; suntil.b leaves r1 pointing to the byte beyond the NUL. + + mov r14, r3 ; Restore the limit on the number of bytes copied. + mov r5, r2 ; Restore the source pointer. + mov r1, r5 ; Save a copy of the dest pointer. + smovu ; Copy source to destination. + + add #0, r14, r3 ; Restore the number of bytes to copy (again), but this time set the Z flag as well. + beq 1f ; If we copied 0 bytes then we already know that the dest string is NUL terminated, so we do not have to do anything. + mov #0, r2 ; Otherwise we must check to see if a NUL byte + mov r5, r1 ; was included in the bytes that were copied. + suntil.b + beq 1f ; Z flag is set if a match was found. + add r14, r5 ; Point at byte after end of copied bytes. + mov.b #0, [r5] ; Store a NUL there. +1: + mov r4, r1 ; Return the original dest pointer. + rts +#endif + .size _strncat, . - _strncat + diff --git a/lib/machine/rx/strncmp.S b/lib/machine/rx/strncmp.S new file mode 100644 index 0000000..4be8076 --- /dev/null +++ b/lib/machine/rx/strncmp.S @@ -0,0 +1,41 @@ + .file "strncmp.S" + + .section .text + .global _strncmp + .type _strncmp,@function +_strncmp: + ;; R1: string1 + ;; R2: string2 + ;; R3: max number of bytes to compare +#ifdef __RX_DISALLOW_STRING_INSNS__ + cmp #0, r3 ; For a length of zero, return zero + beq 4f + +2: mov.b [r1+], r4 + mov.b [r2+], r5 + cmp #0, r4 + beq 3f + cmp #0, r5 + beq 3f + sub #1, r3 + beq 3f + cmp r4, r5 + beq 2b + +3: and #0xff, r4 ; We need to perform an unsigned comparison of the bytes. + and #0xff, r5 + sub r5, r4, r1 + rts + +4: mov #0, r1 + rts +#else + scmpu ; Perform the string comparison + bnc 1f ; If Carry is not set skip over + scne.L r1 ; Set result based on Z flag + rts ; +1: ; + mov #-1,r1 ; Carry not set, result should be negative + rts ; +#endif + .size _strncmp, . - _strncmp diff --git a/lib/machine/rx/strncpy.S b/lib/machine/rx/strncpy.S new file mode 100644 index 0000000..e5b6a83 --- /dev/null +++ b/lib/machine/rx/strncpy.S @@ -0,0 +1,41 @@ + .file "strncpy.S" + + .section .text + .global _strncpy + .type _strncpy,@function +_strncpy: +#ifdef __RX_DISALLOW_STRING_INSNS__ + cmp #0, r3 + beq 3f + + mov r1, r4 ; Preserve R1 for the return value. + +2: mov.b [r2+], r5 ; Copy bytes until... + mov.b r5, [r4+] + sub #1, r3 + beq 3f ; ... our count reaches zero + cmp #0, r5 + bne 2b ; ... or we have written a NUL byte + +4: mov.b r5, [r4+] ; Continue to write further NUL bytes + sub #1, r3 + bne 4b ; until the count reaches zero. + +3: rts + +#else + mov r1, r4 ; Save a copy of the dest pointer. + mov r3, r5 ; Save a copy of the byte count + smovu ; Copy the bytes + cmp #0, r3 ; If we have copied the number of bytes requested + beq 1f ; then skip the next bit: + add r4, r5, r1 ; Point to the last byte that we are supposed to write. + sub r3, r1 ; Subtract the number of bytes left to be written. + mov #0, r2 ; Fill the remaining bytes with NULs, + sstr.b +1: + mov r4, r1 ; Return the destination pointer + rts +#endif + .size _strncpy, . - _strncpy + diff --git a/lib/machine/sh/Makefile.inc b/lib/machine/sh/Makefile.inc new file mode 100644 index 0000000..fd9e26d --- /dev/null +++ b/lib/machine/sh/Makefile.inc @@ -0,0 +1,5 @@ +libc_a_SOURCES += %D%/memcpy.S %D%/memset.S %D%/setjmp.S %D%/strcpy.S %D%/strlen.S %D%/strcmp.S + +if SH64 +libc_a_SOURCES += %D%/strncpy.S +endif diff --git a/lib/machine/sh/acinclude.m4 b/lib/machine/sh/acinclude.m4 new file mode 100644 index 0000000..66ec3b4 --- /dev/null +++ b/lib/machine/sh/acinclude.m4 @@ -0,0 +1,10 @@ +if test "${machine_dir}" = "sh"; then + AC_CACHE_CHECK([for SH5 (64-bit)], newlib_cv_sh64, [dnl + AC_PREPROC_IFELSE([AC_LANG_PROGRAM( +[[#if !defined(__SH5__) +# error "not SH5" +#endif +]])], [newlib_cv_sh64=yes], [newlib_cv_sh64=no])]) +fi + +AM_CONDITIONAL(SH64, [test "$newlib_cv_sh64" = yes]) diff --git a/lib/machine/sh/asm.h b/lib/machine/sh/asm.h new file mode 100644 index 0000000..db30b14 --- /dev/null +++ b/lib/machine/sh/asm.h @@ -0,0 +1,42 @@ +#ifdef __STDC__ +# define _C_LABEL(x) _ ## x +#else +# define _C_LABEL(x) _/**/x +#endif +#define _ASM_LABEL(x) x + +#if __SH5__ +# if __SH5__ == 32 && __SHMEDIA__ +# define TEXT .section .text..SHmedia32, "ax" +# else +# define TEXT .text +# endif + +# define _ENTRY(name) \ + TEXT; .balign 8; .globl name; name: +#else +#define _ENTRY(name) \ + .text; .align 2; .globl name; name: +#endif /* __SH5__ */ + +#define ENTRY(name) \ + _ENTRY(_C_LABEL(name)) + +#if (defined (__sh2__) || defined (__SH2E__) || defined (__sh3__) || defined (__SH3E__) \ + || defined (__SH4_SINGLE__) || defined (__SH4__)) \ + || defined (__SH4_SINGLE_ONLY__) || defined (__SH5__) || defined (__SH2A__) +#define DELAYED_BRANCHES +#define SL(branch, dest, in_slot, in_slot_arg2) \ + branch##.s dest; in_slot, in_slot_arg2 +#else +#define SL(branch, dest, in_slot, in_slot_arg2) \ + in_slot, in_slot_arg2; branch dest +#endif + +#ifdef __LITTLE_ENDIAN__ +#define SHHI shlld +#define SHLO shlrd +#else +#define SHHI shlrd +#define SHLO shlld +#endif diff --git a/lib/machine/sh/memcpy.S b/lib/machine/sh/memcpy.S new file mode 100644 index 0000000..56e6c6f --- /dev/null +++ b/lib/machine/sh/memcpy.S @@ -0,0 +1,395 @@ +! +! Fast SH memcpy +! +! by Toshiyasu Morita (tm@netcom.com) +! hacked by J"orn Rernnecke (joern.rennecke@superh.com) ("o for o-umlaut) +! SH5 code Copyright 2002 SuperH Ltd. +! +! Entry: ARG0: destination pointer +! ARG1: source pointer +! ARG3: byte count +! +! Exit: RESULT: destination pointer +! any other registers in the range r0-r7: trashed +! +! Notes: Usually one wants to do small reads and write a longword, but +! unfortunately it is difficult in some cases to concatanate bytes +! into a longword on the SH, so this does a longword read and small +! writes. +! +! This implementation makes two assumptions about how it is called: +! +! 1.: If the byte count is nonzero, the address of the last byte to be +! copied is unsigned greater than the address of the first byte to +! be copied. This could be easily swapped for a signed comparison, +! but the algorithm used needs some comparison. +! +! 2.: When there are two or three bytes in the last word of an 11-or-more +! bytes memory chunk to b copied, the rest of the word can be read +! without side effects. +! This could be easily changed by increasing the minumum size of +! a fast memcpy and the amount subtracted from r7 before L_2l_loop be 2, +! however, this would cost a few extra cyles on average. +! For SHmedia, the assumption is that any quadword can be read in its +! enirety if at least one byte is included in the copy. +! + +#include "asm.h" + +ENTRY(memcpy) + +#if __SHMEDIA__ + +#define LDUAQ(P,O,D0,D1) ldlo.q P,O,D0; ldhi.q P,O+7,D1 +#define STUAQ(P,O,D0,D1) stlo.q P,O,D0; sthi.q P,O+7,D1 +#define LDUAL(P,O,D0,D1) ldlo.l P,O,D0; ldhi.l P,O+3,D1 +#define STUAL(P,O,D0,D1) stlo.l P,O,D0; sthi.l P,O+3,D1 + + ld.b r3,0,r63 + pta/l Large,tr0 + movi 25,r0 + bgeu/u r4,r0,tr0 + nsb r4,r0 + shlli r0,5,r0 + movi (L1-L0+63*32 + 1) & 0xffff,r1 + sub r1, r0, r0 +L0: ptrel r0,tr0 + add r2,r4,r5 + ptabs r18,tr1 + add r3,r4,r6 + blink tr0,r63 + + .balign 8 +L1: + /* 0 byte memcpy */ + blink tr1,r63 + +L4_7: /* 4..7 byte memcpy cntd. */ + stlo.l r2, 0, r0 + or r6, r7, r6 + sthi.l r5, -1, r6 + stlo.l r5, -4, r6 + blink tr1,r63 + +L2_3: /* 2 or 3 byte memcpy cntd. */ + st.b r5,-1,r6 + blink tr1,r63 + + /* 1 byte memcpy */ + ld.b r3,0,r0 + st.b r2,0,r0 + blink tr1,r63 + +L8_15: /* 8..15 byte memcpy cntd. */ + stlo.q r2, 0, r0 + or r6, r7, r6 + sthi.q r5, -1, r6 + stlo.q r5, -8, r6 + blink tr1,r63 + + /* 2 or 3 byte memcpy */ + ld.b r3,0,r0 + ld.b r2,0,r63 + ld.b r3,1,r1 + st.b r2,0,r0 + pta/l L2_3,tr0 + ld.b r6,-1,r6 + st.b r2,1,r1 + blink tr0, r63 + + /* 4 .. 7 byte memcpy */ + LDUAL (r3, 0, r0, r1) + pta L4_7, tr0 + ldlo.l r6, -4, r7 + or r0, r1, r0 + sthi.l r2, 3, r0 + ldhi.l r6, -1, r6 + blink tr0, r63 + + /* 8 .. 15 byte memcpy */ + LDUAQ (r3, 0, r0, r1) + pta L8_15, tr0 + ldlo.q r6, -8, r7 + or r0, r1, r0 + sthi.q r2, 7, r0 + ldhi.q r6, -1, r6 + blink tr0, r63 + + /* 16 .. 24 byte memcpy */ + LDUAQ (r3, 0, r0, r1) + LDUAQ (r3, 8, r8, r9) + or r0, r1, r0 + sthi.q r2, 7, r0 + or r8, r9, r8 + sthi.q r2, 15, r8 + ldlo.q r6, -8, r7 + ldhi.q r6, -1, r6 + stlo.q r2, 8, r8 + stlo.q r2, 0, r0 + or r6, r7, r6 + sthi.q r5, -1, r6 + stlo.q r5, -8, r6 + blink tr1,r63 + +Large: + ld.b r2, 0, r63 + pta/l Loop_ua, tr1 + ori r3, -8, r7 + sub r2, r7, r22 + sub r3, r2, r6 + add r2, r4, r5 + ldlo.q r3, 0, r0 + addi r5, -16, r5 + movi 64+8, r27 // could subtract r7 from that. + stlo.q r2, 0, r0 + sthi.q r2, 7, r0 + ldx.q r22, r6, r0 + bgtu/l r27, r4, tr1 + + addi r5, -48, r27 + pta/l Loop_line, tr0 + addi r6, 64, r36 + addi r6, -24, r19 + addi r6, -16, r20 + addi r6, -8, r21 + +Loop_line: + ldx.q r22, r36, r63 + alloco r22, 32 + addi r22, 32, r22 + ldx.q r22, r19, r23 + sthi.q r22, -25, r0 + ldx.q r22, r20, r24 + ldx.q r22, r21, r25 + stlo.q r22, -32, r0 + ldx.q r22, r6, r0 + sthi.q r22, -17, r23 + sthi.q r22, -9, r24 + sthi.q r22, -1, r25 + stlo.q r22, -24, r23 + stlo.q r22, -16, r24 + stlo.q r22, -8, r25 + bgeu r27, r22, tr0 + +Loop_ua: + addi r22, 8, r22 + sthi.q r22, -1, r0 + stlo.q r22, -8, r0 + ldx.q r22, r6, r0 + bgtu/l r5, r22, tr1 + + add r3, r4, r7 + ldlo.q r7, -8, r1 + sthi.q r22, 7, r0 + ldhi.q r7, -1, r7 + ptabs r18,tr1 + stlo.q r22, 0, r0 + or r1, r7, r1 + sthi.q r5, 15, r1 + stlo.q r5, 8, r1 + blink tr1, r63 + +#else /* ! SHMEDIA, i.e. SH1 .. SH4 / SHcompact */ + +#ifdef __SH5__ +#define DST r2 +#define SRC r3 +#define COUNT r4 +#define TMP0 r5 +#define TMP1 r6 +#define RESULT r2 +#else +#define DST r4 +#define SRC r5 +#define COUNT r6 +#define TMP0 r2 +#define TMP1 r3 +#define RESULT r0 +#endif + +#ifdef __LITTLE_ENDIAN__ + ! Little endian version copies with increasing addresses. + mov DST,TMP1 ! Save return value + mov #11,r0 ! Check if small number of bytes + cmp/hs r0,COUNT + ! COUNT becomes src end address + SL(bf, L_small, add SRC,COUNT) + mov #1,r1 + tst r1,SRC ! check if source even + SL(bt, L_even, mov COUNT,r7) + mov.b @SRC+,r0 ! no, make it even. + mov.b r0,@DST + add #1,DST +L_even: tst r1,DST ! check if destination is even + add #-3,r7 + SL(bf, L_odddst, mov #2,r1) + tst r1,DST ! check if destination is 4-byte aligned + mov DST,r0 + SL(bt, L_al4dst, sub SRC,r0) + mov.w @SRC+,TMP0 + mov.w TMP0,@DST + ! add #2,DST DST is dead here. +L_al4dst: + tst r1,SRC + bt L_al4both + mov.w @SRC+,r1 + swap.w r1,r1 + add #-6,r0 + add #-6,r7 ! r7 := src end address minus 9. + .align 2 +L_2l_loop: + mov.l @SRC+,TMP0 ! Read & write two longwords per iteration + xtrct TMP0,r1 + mov.l r1,@(r0,SRC) + cmp/hs r7,SRC + mov.l @SRC+,r1 + xtrct r1,TMP0 + mov.l TMP0,@(r0,SRC) + bf L_2l_loop + add #-2,SRC + bra L_cleanup + add #5,r0 +L_al4both: + add #-4,r0 + .align 2 +L_al4both_loop: + mov.l @SRC+,DST ! Read longword, write longword per iteration + cmp/hs r7,SRC + SL(bf, L_al4both_loop, mov.l DST,@(r0,SRC)) + + bra L_cleanup + add #3,r0 + +L_odddst: + tst r1,SRC + SL(bt, L_al4src, add #-1,DST) + mov.w @SRC+,r0 + mov.b r0,@(1,DST) + shlr8 r0 + mov.b r0,@(2,DST) + add #2,DST +L_al4src: + .align 2 +L_odd_loop: + mov.l @SRC+,r0 ! Read longword, write byte, word, byte per iteration + cmp/hs r7,SRC + mov.b r0,@(1,DST) + shlr8 r0 + mov.w r0,@(2,DST) + shlr16 r0 + mov.b r0,@(4,DST) + SL(bf, L_odd_loop, add #4,DST) + .align 2 ! avoid nop in more frequently executed code. +L_cleanup2: + mov DST,r0 + sub SRC,r0 +L_cleanup: + cmp/eq COUNT,SRC + bt L_ready + .align 2 +L_cleanup_loop: + mov.b @SRC+,r1 + cmp/eq COUNT,SRC + mov.b r1,@(r0,SRC) + bf L_cleanup_loop +L_ready: + rts + mov TMP1,RESULT +L_small: + bra L_cleanup2 + add #-1,DST +#else /* ! __LITTLE_ENDIAN__ */ + ! Big endian version copies with decreasing addresses. + mov DST,r0 + add COUNT,r0 + sub DST,SRC + mov #11,r1 + cmp/hs r1,COUNT + SL(bf, L_small, add #-1,SRC) + mov SRC,TMP1 + add r0,TMP1 + shlr TMP1 + SL(bt, L_even, + mov DST,r7) + mov.b @(r0,SRC),TMP0 + add #-1,TMP1 + mov.b TMP0,@-r0 +L_even: + tst #1,r0 + add #-1,SRC + SL(bf, L_odddst, add #8,r7) + tst #2,r0 + bt L_al4dst + add #-1,TMP1 + mov.w @(r0,SRC),r1 + mov.w r1,@-r0 +L_al4dst: + shlr TMP1 + bt L_al4both + mov.w @(r0,SRC),r1 + swap.w r1,r1 + add #4,r7 + add #-4,SRC + .align 2 +L_2l_loop: + mov.l @(r0,SRC),TMP0 + xtrct TMP0,r1 + mov.l r1,@-r0 + cmp/hs r7,r0 + mov.l @(r0,SRC),r1 + xtrct r1,TMP0 + mov.l TMP0,@-r0 + bt L_2l_loop + bra L_cleanup + add #5,SRC + + nop ! avoid nop in executed code. +L_al4both: + add #-2,SRC + .align 2 +L_al4both_loop: + mov.l @(r0,SRC),r1 + cmp/hs r7,r0 + SL(bt, L_al4both_loop, + mov.l r1,@-r0) + bra L_cleanup + add #3,SRC + + nop ! avoid nop in executed code. +L_odddst: + shlr TMP1 + bt L_al4src + mov.w @(r0,SRC),r1 + mov.b r1,@-r0 + shlr8 r1 + mov.b r1,@-r0 +L_al4src: + add #-2,SRC + .align 2 +L_odd_loop: + mov.l @(r0,SRC),TMP0 + cmp/hs r7,r0 + mov.b TMP0,@-r0 + shlr8 TMP0 + mov.w TMP0,@-r0 + shlr16 TMP0 + mov.b TMP0,@-r0 + bt L_odd_loop + + add #3,SRC +L_cleanup: +L_small: + cmp/eq DST,r0 + bt L_ready + add #1,DST + .align 2 +L_cleanup_loop: + mov.b @(r0,SRC),TMP0 + cmp/eq DST,r0 + mov.b TMP0,@-r0 + bf L_cleanup_loop +L_ready: + rts + mov r0,RESULT +#endif /* ! __LITTLE_ENDIAN__ */ +#endif /* ! SHMEDIA */ diff --git a/lib/machine/sh/memset.S b/lib/machine/sh/memset.S new file mode 100644 index 0000000..2b45aff --- /dev/null +++ b/lib/machine/sh/memset.S @@ -0,0 +1,164 @@ +! +! Fast SH memset +! +! by Toshiyasu Morita (tm@netcom.com) +! +! SH5 code by J"orn Rennecke (joern.rennecke@superh.com) +! Copyright 2002 SuperH Ltd. +! + +#include "asm.h" + +ENTRY(memset) +#if __SHMEDIA__ + pta/l multiquad, tr0 + ptabs r18, tr2 + + andi r2, -8, r25 + add r2, r4, r5 + addi r5, -1, r20 // calculate end address. + andi r20, -8, r20 + cmveq r4, r25, r20 + bne/u r25, r20, tr0 // multiquad + +! This sequence could clobber volatile objects that are in the same +! quadword as a very short char array. +! ldlo.q r2, 0, r7 +! shlli r4, 2, r4 +! movi -1, r8 +! SHHI r8, r4, r8 +! SHHI r8, r4, r8 +! mcmv r7, r8, r3 +! stlo.q r2, 0, r3 + + pta/l setlongs, tr0 + movi 4, r8 + bgeu/u r4, r8, tr0 + pta/l endset, tr0 + beqi/u r4, 0, tr0 + st.b r2, 0, r3 + beqi/u r4, 1, tr0 + nop + st.b r2, 1, r3 + beqi/l r4, 2, tr0 + st.b r2,2,r3 +endset: blink tr2, r63 +setlongs: + mshflo.b r3, r3, r3 + mperm.w r3, r63, r3 // Fill pattern now in every byte of r3 + stlo.l r2, 0, r3 + nop + nop + sthi.l r5, -1, r3 + blink tr2, r63 + +multiquad: + mshflo.b r3, r3, r3 + mperm.w r3, r63, r3 // Fill pattern now in every byte of r3 + pta/l lastquad, tr0 + stlo.q r2, 0, r3 + sub r20, r25, r24 + movi 64, r9 + beqi/u r24, 8, tr0 // lastquad + pta/l loop, tr1 + addi r20, -7*8, r8 // loop end address; This might overflow, so we need + // to use a different test before we start the loop + bgeu/u r24, r9, tr1// loop + st.q r25, 8, r3 + shlri r24, 4, r24 + st.q r20, -8, r3 + beqi/u r24, 1, tr0 // lastquad + st.q r25, 16, r3 + st.q r20, -16, r3 + beqi/u r24, 2, tr0 // lastquad + st.q r25, 24, r3 + st.q r20, -24, r3 +lastquad: + sthi.q r5, -1, r3 + blink tr2,r63 + +loop: + alloco r25, 32 + st.q r25, 8, r3 + st.q r25, 16, r3 + st.q r25, 24, r3 + st.q r25, 32, r3 + addi r25, 32, r25 + bgeu/l r8, r25, tr1 // loop + + st.q r20, -40, r3 + st.q r20, -32, r3 + st.q r20, -24, r3 + st.q r20, -16, r3 + st.q r20, -8, r3 + sthi.q r5, -1, r3 + blink tr2,r63 +#else /* ! SHMEDIA, i.e. SH1 .. SH4 / SHcompact */ +! Entry: r4: destination pointer +! r5: fill value +! r6: byte count +! +! Exit: r0-r3: trashed +! + +! This assumes that the first four bytes of the address space (0..3) are +! reserved - usually by the linker script. Otherwise, we would had to check +! for the case of objects of the size 12..15 at address 0..3 . + +#ifdef __SH5__ +#define DST r2 +#define VAL r3 +#define CNT r4 +#define TMP r5 +#else +#define DST r4 +#define VAL r5 +#define CNT r6 +#define TMP r2 +#endif + + mov #12,r0 ! Check for small number of bytes + cmp/gt CNT,r0 + mov DST,r0 + SL(bt, L_store_byte_loop_check0, add DST,CNT) + + tst #3,r0 ! Align destination + SL(bt, L_dup_bytes, extu.b r5,r5) + .balignw 4,0x0009 +L_align_loop: + mov.b VAL,@r0 + add #1,r0 + tst #3,r0 + bf L_align_loop + +L_dup_bytes: + swap.b VAL,TMP ! Duplicate bytes across longword + or TMP,VAL + swap.w VAL,TMP + or TMP,VAL + + add #-16,CNT + + .balignw 4,0x0009 +L_store_long_loop: + mov.l VAL,@r0 ! Store double longs to memory + cmp/hs CNT,r0 + mov.l VAL,@(4,r0) + SL(bf, L_store_long_loop, add #8,r0) + + add #16,CNT + +L_store_byte_loop_check0: + cmp/eq CNT,r0 + bt L_exit + .balignw 4,0x0009 +L_store_byte_loop: + mov.b VAL,@r0 ! Store bytes to memory + add #1,r0 + cmp/eq CNT,r0 + bf L_store_byte_loop + +L_exit: + rts + mov r4,r0 +#endif /* ! SHMEDIA */ diff --git a/lib/machine/sh/setjmp.S b/lib/machine/sh/setjmp.S new file mode 100644 index 0000000..520218f --- /dev/null +++ b/lib/machine/sh/setjmp.S @@ -0,0 +1,191 @@ +/* We want to pretend we're in SHmedia mode, even when assembling for + SHcompact. */ +#if __SH5__ == 32 && ! __SHMEDIA__ +# undef __SHMEDIA__ +# define __SHMEDIA__ 1 +#endif + +#if __SHMEDIA__ + .mode SHmedia +#endif + +#include "asm.h" + +ENTRY(setjmp) +#if __SH5__ + ptabs r18, tr0 + gettr tr5, r5 + gettr tr6, r6 + gettr tr7, r7 + st.q r2, 0*8, r18 + st.q r2, 1*8, r10 + st.q r2, 2*8, r11 + st.q r2, 3*8, r12 + st.q r2, 4*8, r13 + st.q r2, 5*8, r14 + st.q r2, 6*8, r15 + st.q r2, 7*8, r28 + st.q r2, 8*8, r29 + st.q r2, 9*8, r30 + st.q r2, 10*8, r31 + st.q r2, 11*8, r32 + st.q r2, 12*8, r33 + st.q r2, 13*8, r34 + st.q r2, 14*8, r35 + st.q r2, 15*8, r44 + st.q r2, 16*8, r45 + st.q r2, 17*8, r46 + st.q r2, 18*8, r47 + st.q r2, 19*8, r48 + st.q r2, 20*8, r49 + st.q r2, 21*8, r50 + st.q r2, 22*8, r51 + st.q r2, 23*8, r52 + st.q r2, 24*8, r53 + st.q r2, 25*8, r54 + st.q r2, 26*8, r55 + st.q r2, 27*8, r56 + st.q r2, 28*8, r57 + st.q r2, 29*8, r58 + st.q r2, 30*8, r59 + st.q r2, 31*8, r5 + st.q r2, 32*8, r6 + st.q r2, 33*8, r7 +#if ! __SH4_NOFPU__ + fst.d r2, 34*8, dr12 + fst.d r2, 35*8, dr14 + fst.d r2, 36*8, dr36 + fst.d r2, 37*8, dr38 + fst.d r2, 38*8, dr40 + fst.d r2, 39*8, dr42 + fst.d r2, 40*8, dr44 + fst.d r2, 41*8, dr46 + fst.d r2, 42*8, dr48 + fst.d r2, 43*8, dr50 + fst.d r2, 44*8, dr52 + fst.d r2, 45*8, dr54 + fst.d r2, 46*8, dr56 + fst.d r2, 47*8, dr58 + fst.d r2, 48*8, dr60 + fst.d r2, 49*8, dr62 +#endif + movi 0, r2 + blink tr0, r63 +#else +#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + add #(13*4),r4 +#else + add #(9*4),r4 +#endif + + sts.l pr,@-r4 + +#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + fmov.s fr15,@-r4 ! call saved floating point registers + fmov.s fr14,@-r4 + fmov.s fr13,@-r4 + fmov.s fr12,@-r4 +#endif + + mov.l r15,@-r4 ! call saved integer registers + mov.l r14,@-r4 + mov.l r13,@-r4 + mov.l r12,@-r4 + + mov.l r11,@-r4 + mov.l r10,@-r4 + mov.l r9,@-r4 + mov.l r8,@-r4 + + rts + mov #0,r0 +#endif /* __SH5__ */ + +ENTRY(longjmp) +#if __SH5__ + ld.q r2, 0*8, r18 + ptabs r18, tr0 + ld.q r2, 1*8, r10 + ld.q r2, 2*8, r11 + ld.q r2, 3*8, r12 + ld.q r2, 4*8, r13 + ld.q r2, 5*8, r14 + ld.q r2, 6*8, r15 + ld.q r2, 7*8, r28 + ld.q r2, 8*8, r29 + ld.q r2, 9*8, r30 + ld.q r2, 10*8, r31 + ld.q r2, 11*8, r32 + ld.q r2, 12*8, r33 + ld.q r2, 13*8, r34 + ld.q r2, 14*8, r35 + ld.q r2, 15*8, r44 + ld.q r2, 16*8, r45 + ld.q r2, 17*8, r46 + ld.q r2, 18*8, r47 + ld.q r2, 19*8, r48 + ld.q r2, 20*8, r49 + ld.q r2, 21*8, r50 + ld.q r2, 22*8, r51 + ld.q r2, 23*8, r52 + ld.q r2, 24*8, r53 + ld.q r2, 25*8, r54 + ld.q r2, 26*8, r55 + ld.q r2, 27*8, r56 + ld.q r2, 28*8, r57 + ld.q r2, 29*8, r58 + ld.q r2, 30*8, r59 + ld.q r2, 31*8, r5 + ld.q r2, 32*8, r6 + ld.q r2, 33*8, r7 + ptabs r5, tr5 + ptabs r6, tr6 + ptabs r7, tr7 +#if ! __SH4_NOFPU__ + fld.d r2, 34*8, dr12 + fld.d r2, 35*8, dr14 + fld.d r2, 36*8, dr36 + fld.d r2, 37*8, dr38 + fld.d r2, 38*8, dr40 + fld.d r2, 39*8, dr42 + fld.d r2, 40*8, dr44 + fld.d r2, 41*8, dr46 + fld.d r2, 42*8, dr48 + fld.d r2, 43*8, dr50 + fld.d r2, 44*8, dr52 + fld.d r2, 45*8, dr54 + fld.d r2, 46*8, dr56 + fld.d r2, 47*8, dr58 + fld.d r2, 48*8, dr60 + fld.d r2, 49*8, dr62 +#endif + movi 1, r2 + cmvne r3, r3, r2 + blink tr0, r63 +#else + mov.l @r4+,r8 + mov.l @r4+,r9 + mov.l @r4+,r10 + mov.l @r4+,r11 + + mov.l @r4+,r12 + mov.l @r4+,r13 + mov.l @r4+,r14 + mov.l @r4+,r15 + +#if defined (__SH2E__) || defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + fmov.s @r4+,fr12 ! call saved floating point registers + fmov.s @r4+,fr13 + fmov.s @r4+,fr14 + fmov.s @r4+,fr15 +#endif + + lds.l @r4+,pr + + mov r5,r0 + tst r0,r0 + bf retr4 + movt r0 +retr4: rts + nop +#endif /* __SH5__ */ diff --git a/lib/machine/sh/strcmp.S b/lib/machine/sh/strcmp.S new file mode 100644 index 0000000..8dcc20b --- /dev/null +++ b/lib/machine/sh/strcmp.S @@ -0,0 +1,225 @@ +! SH5 code Copyright 2002 SuperH Ltd. + +#include "asm.h" + +ENTRY(strcmp) + +#if __SHMEDIA__ + ld.ub r2,0,r4 + pt/l quickret0,tr0 + ld.ub r3,0,r5 + ptabs r18,tr2 + beqi/u r4,0,tr0 + ld.ub r2,1,r6 + bne/u r4,r5,tr0 + pt/l quickret1,tr1 + ld.ub r3,1,r7 + beqi/u r6,0,tr1 + ld.ub r2,2,r4 + bne/u r6,r7,tr1 + ld.ub r3,2,r5 + beqi/u r4,0,tr0 + ld.ub r2,3,r6 + bne/u r4,r5,tr0 + ld.ub r3,3,r7 + beqi/u r6,0,tr1 + ld.ub r2,4,r4 + bne/u r6,r7,tr1 + ld.ub r3,4,r5 + beqi/u r4,0,tr0 + ld.ub r2,5,r6 + bne/u r4,r5,tr0 + ld.ub r3,5,r7 + beqi/u r6,0,tr1 + ld.ub r2,6,r4 + bne/u r6,r7,tr1 + ld.ub r3,6,r5 + beqi/u r4,0,tr0 + ld.ub r2,7,r6 + bne/u r4,r5,tr0 + ld.ub r3,7,r7 + beqi/u r6,0,tr1 + sub r3,r2,r3 + bne/u r6,r7,tr1 + + andi r2,-8,r2 + add r3,r2,r3 + ldlo.q r3,8,r23 + pt r23_zero,tr0 + shlli r3,3,r22 + sub r63,r22,r20 + movi 0x101,r6 + mperm.w r6,r63,r6 + SHLO r6,r22,r7 + msubs.ub r7,r23,r8 + pt loop,tr1 + bnei/u r8,0,tr0 // r23_zero + pt found_zero,tr0 + addi r3,15,r3 + andi r3,-8,r3 + sub r3,r2,r3 + bne/l r7,r6,tr1 // loop + /* The strings are aligned to each other. */ + /* It is possible to have a loop with six cycles / iteration + by re-ordering the exit conditions, but then it needs extra + time and/or code to sort out the r4 != r5 case. */ + pt al_loop,tr1 + pt al_found_zero,tr0 +al_loop: + ld.q r2,8,r4 + ldx.q r2,r3,r5 + addi r2,8,r2 + mcmpeq.b r63,r4,r8 + pt cmp_quad,tr3 + bnei/u r8,0,tr0 // al_found_zero + beq/l r4,r5,tr1 // al_loop + blink tr3,r63 // cmp_quad + + .balign 8 +quickret0: + sub r4,r5,r2 + blink tr2,r63 +quickret1: + sub r6,r7,r2 + blink tr2,r63 + +loop: + ld.q r2,8,r4 + ldx.q r2,r3,r19 + addi r2,8,r2 + msubs.ub r6,r4,r8 + mcmpeq.b r63,r19,r9 + SHHI r19,r20,r21 + or r21,r23,r5 + SHLO r19,r22,r23 + bne/u r8,r9,tr0 // found_zero + beq/l r4,r5,tr1 // loop +cmp_quad: +#ifdef __LITTLE_ENDIAN__ + byterev r4,r4 + byterev r5,r5 +#endif + cmpgtu r4,r5,r6 + cmpgtu r5,r4,r7 + sub r6,r7,r2 + blink tr2,r63 +found_zero: + pt zero_now,tr0 + pt cmp_quad,tr1 + SHHI r9,r20,r7 + bne/u r8,r7,tr0 // zero_now + bne/u r4,r5,tr1 // cmp_quad + SHLO r9,r22,r8 +r23_zero: + ld.q r2,8,r4 + add r23,r63,r5 +zero_now: +al_found_zero: +/* We konw that one of the values has at lest one zero, and r8 holds + an 0x01 or 0xff mask for every zero found in one of the operands. + If both operands have the first zero in the same place, this mask + allows us to truncate the comparison to the valid bytes in the + strings. If the first zero is in different places, it doesn't + matter if some invalid bytes are included, since the comparison + of the zero with the non-zero will determine the outcome. */ +#ifdef __LITTLE_ENDIAN__ + shlli r8,8,r8 + addi r8,-1,r9 + andc r9,r8,r8 + and r8,r4,r4 + and r8,r5,r5 +#else + shlri r8,1,r8 + nsb r8,r8 + addi r8,8,r8 + andi r8,56,r8 + sub r63,r8,r8 + shlrd r4,r8,r4 + shlrd r5,r8,r5 +#endif +#ifdef __LITTLE_ENDIAN__ + byterev r4,r4 + byterev r5,r5 +#endif + cmpgtu r4,r5,r6 + cmpgtu r5,r4,r7 + sub r6,r7,r2 + blink tr2,r63 + +#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */ + +#ifdef __SH5__ +#define STR1 r2 +#define STR2 r3 +#define RESULT r2 +#define TMP r4 +#else +! Entry: r4: string1 +! r5: string2 +! Exit: r0: result +! r1-r2,r4-r5: clobbered +#define STR1 r4 +#define STR2 r5 +#define RESULT r0 +#define TMP r2 +#endif /* __SH5__ */ + + mov STR1,r0 + or STR2,r0 + tst #3,r0 + bf L_setup_char_loop + mov #0,r0 +#ifdef DELAYED_BRANCHES + mov.l @STR1+,r1 + .align 2 +Longword_loop: + mov.l @STR2+,TMP + cmp/str r0,r1 + bt Longword_loop_end + cmp/eq r1,TMP + bt.s Longword_loop + mov.l @STR1+,r1 + add #-4, STR1 +Longword_loop_end: + add #-4, STR1 + add #-4, STR2 +L_setup_char_loop: + mov.b @STR1+,r0 + .align 2 +L_char_loop: + mov.b @STR2+,r1 + tst r0,r0 + bt L_return + cmp/eq r0,r1 + bt.s L_char_loop + mov.b @STR1+,r0 + add #-2,STR1 + mov.b @STR1,r0 +#else /* ! DELAYED_BRANCHES */ + .align 2 +Longword_loop: + mov.l @r4+,r1 + mov.l @r5+,r2 + cmp/str r0,r1 + bt Longword_loop_end + cmp/eq r1,r2 + bt Longword_loop +Longword_loop_end: + add #-4, r4 + add #-4, r5 + .align 2 +L_setup_char_loop: +L_char_loop: + mov.b @r4+,r0 + mov.b @r5+,r1 + tst r0,r0 + bt L_return + cmp/eq r0,r1 + bt L_char_loop +#endif +L_return: + extu.b r0,RESULT + extu.b r1,r1 + rts + sub r1,RESULT +#endif /* ! __SHMEDIA__ */ diff --git a/lib/machine/sh/strcpy.S b/lib/machine/sh/strcpy.S new file mode 100644 index 0000000..da951cd --- /dev/null +++ b/lib/machine/sh/strcpy.S @@ -0,0 +1,134 @@ +! Entry: arg0: destination +! arg1: source +! Exit: result: destination +! +! SH5 code Copyright 2002 SuperH Ltd. + +#include "asm.h" + +ENTRY(strcpy) + +#if __SHMEDIA__ + + pta/l shortstring,tr1 + ldlo.q r3,0,r4 + ptabs r18,tr4 + shlli r3,3,r7 + addi r2, 8, r0 + mcmpeq.b r4,r63,r6 + SHHI r6,r7,r6 + bnei/u r6,0,tr1 // shortstring + pta/l no_lddst, tr2 + ori r3,-8,r23 + sub r2, r23, r0 + sub r3, r2, r21 + addi r21, 8, r20 + ldx.q r0, r21, r5 + pta/l loop, tr0 + ori r2,-8,r22 + mcmpeq.b r5, r63, r6 + bgt/u r22, r23, tr2 // no_lddst + + // r22 < r23 : Need to do a load from the destination. + // r22 == r23 : Doesn't actually need to load from destination, + // but still can be handled here. + ldlo.q r2, 0, r9 + movi -1, r8 + SHLO r8, r7, r8 + mcmv r4, r8, r9 + stlo.q r2, 0, r9 + beqi/l r6, 0, tr0 // loop + + add r5, r63, r4 + addi r0, 8, r0 + blink tr1, r63 // shortstring +no_lddst: + // r22 > r23: note that for r22 == r23 the sthi.q would clobber + // bytes before the destination region. + stlo.q r2, 0, r4 + SHHI r4, r7, r4 + sthi.q r0, -1, r4 + beqi/l r6, 0, tr0 // loop + + add r5, r63, r4 + addi r0, 8, r0 +shortstring: +#ifndef __LITTLE_ENDIAN__ + pta/l shortstring2,tr1 + byterev r4,r4 +#endif +shortstring2: + st.b r0,-8,r4 + andi r4,0xff,r5 + shlri r4,8,r4 + addi r0,1,r0 + bnei/l r5,0,tr1 + blink tr4,r63 // return + + .balign 8 +loop: + stlo.q r0, 0, r5 + ldx.q r0, r20, r4 + addi r0, 16, r0 + sthi.q r0, -9, r5 + mcmpeq.b r4, r63, r6 + bnei/u r6, 0, tr1 // shortstring + ldx.q r0, r21, r5 + stlo.q r0, -8, r4 + sthi.q r0, -1, r4 + mcmpeq.b r5, r63, r6 + beqi/l r6, 0, tr0 // loop + + add r5, r63, r4 + addi r0, 8, r0 + blink tr1, r63 // shortstring + +#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */ + +#ifdef __SH5__ +#define DST r2 +#define SRC r3 +#define TMP r4 +#define RESULT R2 +! r0,r1,r3,r4: clobbered +#else +#define DST r4 +#define SRC r5 +#define TMP r2 +#define RESULT r0 +! r1-r2,r5: clobbered +#endif + mov DST,r0 + or SRC,r0 + tst #3,r0 + SL(bf, L_setup_char_loop, mov DST,r0) + mov.l @SRC+,r1 + mov #0,TMP + cmp/str TMP,r1 + SL(bt, Longword_loop_end, sub SRC,r0) + .align 2 +Longword_loop: + mov.l r1,@(r0,SRC) + mov.l @SRC+,r1 + cmp/str TMP,r1 + bt Longword_loop_end + mov.l r1,@(r0,SRC) + mov.l @SRC+,r1 + cmp/str TMP,r1 + bf Longword_loop +Longword_loop_end: + add #-4,SRC + add #3,r0 + .align 2 +L_char_loop: + mov.b @SRC+,r1 +L_char_loop_start: + tst r1,r1 + SL(bf, L_char_loop, mov.b r1,@(r0,SRC)) + rts + mov DST,RESULT +L_setup_char_loop: + mov.b @SRC+,r1 + bra L_char_loop_start + sub SRC,r0 +#endif /* ! __SHMEDIA__ */ diff --git a/lib/machine/sh/strlen.S b/lib/machine/sh/strlen.S new file mode 100644 index 0000000..b55b86b --- /dev/null +++ b/lib/machine/sh/strlen.S @@ -0,0 +1,87 @@ +! Entry: arg0: string start address +! Exit: result: length +! +! Copyright 2002 SuperH Ltd. + +#include "asm.h" + +ENTRY(strlen) + +#if __SHMEDIA__ + + ldlo.q r2,0,r3 + ptabs/l r18,tr0 + pta/l loop,tr1 + andi r2,-8,r0 + shlli r2,3,r1 + mcmpeq.b r3,r63,r3 + SHHI r3,r1,r4 + beqi/u r4,0,tr1 // loop +#ifdef __LITTLE_ENDIAN__ + movi -1,r2 + addi r3,-1,r4 + msad.ubq r3,r4,r2 +#else + shlri r3,1,r3 + nsb r3,r3 + shlri r3,3,r2 +#endif + blink tr0,r63 + +loop: + ldlo.q r0,8,r3 + addi r0,8,r0 + ldlo.q r0,8,r63 + mcmpeq.b r3,r63,r3 + beqi/l r3,0,tr1 // loop + sub r0,r2,r2 +#ifdef __LITTLE_ENDIAN__ + addi r3,-1,r4 + addi r2,-1,r2 + msad.ubq r3,r4,r2 +#else + shlri r3,1,r3 + nsb r3,r3 + shlri r3,3,r3 + add r2,r3,r2 +#endif + blink tr0,r63 + +#else /* ! __SHMEDIA__, i.e. SH 1..4 / SHcompact */ + +#ifdef __SH5__ +#define STR_INIT r2 +#define STR_ORIG r0 +#define STR_COPY STR_ORIG +#define MASK r1 +#define TMP r3 +#define RESULT r2 +! r0,r1,r3: clobbered +#else +#define STR_INIT r4 +#define STR_ORIG STR_INIT +#define STR_COPY STR +#define MASK r1 +#define TMP r3 +#define RESULT r0 +! r1,r3: clobbered +#endif +#define STR RESULT + + mov #3,MASK + and STR_INIT,MASK + tst MASK,MASK + SL(bf, L_char_loop, mov STR_INIT, STR_COPY) +L_word_loop: + mov.l @STR+,TMP + cmp/str MASK,TMP + bf L_word_loop + add #-4,STR +L_char_loop: + mov.b @STR+,TMP + tst TMP,TMP + bf L_char_loop + add #-1,STR + rts + sub STR_ORIG,STR +#endif /* ! __SHMEDIA__ */ diff --git a/lib/machine/sh/strncpy.S b/lib/machine/sh/strncpy.S new file mode 100644 index 0000000..c22ae66 --- /dev/null +++ b/lib/machine/sh/strncpy.S @@ -0,0 +1,209 @@ +/* Copyright 2003 SuperH Ltd. */ + +#include "asm.h" + +#ifdef __SH5__ +#if __SHMEDIA__ + +#ifdef __LITTLE_ENDIAN__ +#define ZPAD_MASK(src, dst) addi src, -1, dst +#else +#define ZPAD_MASK(src, dst) \ + byterev src, dst; addi dst, -1, dst; byterev dst, dst +#endif + + +/* We assume that the destination is not in the first 16 bytes of memory. + A typical linker script will put the text section first, and as + this code is longer that 16 bytes, you have to get out of your way + to put data there. */ +ENTRY(strncpy) + pt L_small, tr2 + ldlo.q r3, 0, r0 + shlli r3, 3, r19 + mcmpeq.b r0, r63, r1 + SHHI r1, r19, r7 + add r2, r4, r20 + addi r20, -8, r5 + /* If the size is greater than 8, we know we can read beyond the first + (possibly partial) quadword, and write out a full first and last + (possibly unaligned and/or overlapping) quadword. */ + bge/u r2, r5, tr2 // L_small + pt L_found0, tr0 + addi r2, 8, r22 + bnei/u r7, 0, tr0 // L_found0 + ori r3, -8, r38 + pt L_end_early, tr1 + sub r2, r38, r22 + stlo.q r2, 0, r0 + sthi.q r2, 7, r0 + sub r3, r2, r6 + ldx.q r22, r6, r0 + /* Before each iteration, check that we can store in full the next quad we + are about to fetch. */ + addi r5, -8, r36 + bgtu/u r22, r36, tr1 // L_end_early + pt L_scan0, tr1 +L_scan0: + addi r22, 8, r22 + mcmpeq.b r0, r63, r1 + stlo.q r22, -8, r0 + bnei/u r1, 0, tr0 // L_found0 + sthi.q r22, -1, r0 + ldx.q r22, r6, r0 + bgeu/l r36, r22, tr1 // L_scan0 +L_end: + // At end; we might re-read a few bytes when we fetch the last quad. + // branch mispredict, so load is ready now. + mcmpeq.b r0, r63, r1 + addi r22, 8, r22 + bnei/u r1, 0, tr0 // L_found0 + add r3, r4, r7 + ldlo.q r7, -8, r1 + ldhi.q r7, -1, r7 + ptabs r18, tr0 + stlo.q r22, -8, r0 + or r1, r7, r1 + mcmpeq.b r1, r63, r7 + sthi.q r22, -1, r0 + ZPAD_MASK (r7, r7) + and r1, r7, r1 // mask out non-zero bytes after first zero byte + stlo.q r20, -8, r1 + sthi.q r20, -1, r1 + blink tr0, r63 + +L_end_early: + /* Check if we can store the current quad in full. */ + pt L_end, tr1 + add r3, r4, r7 + bgtu/u r5, r22, tr1 // L_end // Not really unlikely, but gap is short. + /* If not, that means we can just proceed to process the last quad. + Two pipeline stalls are unavoidable, as we don't have enough ILP. */ + ldlo.q r7, -8, r1 + ldhi.q r7, -1, r7 + ptabs r18, tr0 + or r1, r7, r1 + mcmpeq.b r1, r63, r7 + ZPAD_MASK (r7, r7) + and r1, r7, r1 // mask out non-zero bytes after first zero byte + stlo.q r20, -8, r1 + sthi.q r20, -1, r1 + blink tr0, r63 + +L_found0: + // r0: string to store, not yet zero-padding normalized. + // r1: result of mcmpeq.b r0, r63, r1. + // r22: store address plus 8. I.e. address where zero padding beyond the + // string in r0 goes. + // r20: store end address. + // r5: store end address minus 8. + pt L_write0_multiquad, tr0 + ZPAD_MASK (r1, r1) + and r0, r1, r0 // mask out non-zero bytes after first zero byte + stlo.q r22, -8, r0 + sthi.q r22, -1, r0 + andi r22, -8, r1 // Check if zeros to write fit in one quad word. + bgtu/l r5, r1, tr0 // L_write0_multiquad + ptabs r18, tr1 + sub r20, r22, r1 + shlli r1, 2, r1 // Do shift in two steps so that 64 bit case is + SHLO r0, r1, r0 // handled correctly. + SHLO r0, r1, r0 + sthi.q r20, -1, r0 + blink tr1, r63 + +L_write0_multiquad: + pt L_write0_loop, tr0 + ptabs r18, tr1 + stlo.q r22, 0, r63 + sthi.q r20, -1, r63 + addi r1, 8, r1 + bgeu/l r5, r1, tr0 // L_write0_loop + blink tr1, r63 + +L_write0_loop: + st.q r1, 0 ,r63 + addi r1, 8, r1 + bgeu/l r5, r1, tr0 // L_write0_loop + blink tr1, r63 + +L_small: + // r0: string to store, not yet zero-padding normalized. + // r1: result of mcmpeq.b r0, r63, r1. + // r7: nonzero indicates relevant zero found r0. + // r2: store address. + // r3: read address. + // r4: size, max 8 + // r20: store end address. + // r5: store end address minus 8. + pt L_nohi, tr0 + pt L_small_storelong, tr1 + ptabs r18, tr2 + sub r63, r4, r23 + bnei/u r7, 0, tr0 // L_nohi + ori r3, -8, r7 + bge/l r23, r7, tr0 // L_nohi + ldhi.q r3, 7, r1 + or r0, r1, r0 + mcmpeq.b r0, r63, r1 +L_nohi: + ZPAD_MASK (r1, r1) + and r0, r1, r0 + movi 4, r19 + bge/u r4, r19, tr1 // L_small_storelong + + pt L_small_end, tr0 +#ifndef __LITTLE_ENDIAN__ + byterev r0, r0 +#endif + beqi/u r4, 0, tr0 // L_small_end + st.b r2, 0, r0 + beqi/u r4, 1, tr0 // L_small_end + shlri r0, 8, r0 + st.b r2, 1, r0 + beqi/u r4, 2, tr0 // L_small_end + shlri r0, 8, r0 + st.b r2, 2, r0 +L_small_end: + blink tr2, r63 + +L_small_storelong: + shlli r23, 3, r7 + SHHI r0, r7, r1 +#ifdef __LITTLE_ENDIAN__ + shlri r1, 32, r1 +#else + shlri r0, 32, r0 +#endif + stlo.l r2, 0, r0 + sthi.l r2, 3, r0 + stlo.l r20, -4, r1 + sthi.l r20, -1, r1 + blink tr2, r63 + +#else /* SHcompact */ + +/* This code is optimized for size. Instruction selection is SH5 specific. + SH4 should use a different version. */ +ENTRY(strncpy) + mov #0, r6 + cmp/eq r4, r6 + bt return + mov r2, r5 + add #-1, r5 + add r5, r4 +loop: + bt/s found0 + add #1, r5 + mov.b @r3+, r1 +found0: + cmp/eq r5,r4 + mov.b r1, @r5 + bf/s loop + cmp/eq r1, r6 +return: + rts + nop + +#endif /* SHcompact */ +#endif /* __SH5__ */ diff --git a/lib/machine/shared_x86/sys/fenv.h b/lib/machine/shared_x86/sys/fenv.h new file mode 100644 index 0000000..243cac2 --- /dev/null +++ b/lib/machine/shared_x86/sys/fenv.h @@ -0,0 +1,179 @@ +/* + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2010-2019 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _SYS_FENV_H +#define _SYS_FENV_H 1 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Primary sources: + + The Open Group Base Specifications Issue 6: + http://www.opengroup.org/onlinepubs/000095399/basedefs/fenv.h.html + + C99 Language spec (draft n1256): + + + Intel(R) 64 and IA-32 Architectures Software Developer's Manuals: + http://www.intel.com/products/processor/manuals/ + + GNU C library manual pages: + http://www.gnu.org/software/libc/manual/html_node/Control-Functions.html + http://www.gnu.org/software/libc/manual/html_node/Rounding.html + http://www.gnu.org/software/libc/manual/html_node/FP-Exceptions.html + http://www.gnu.org/software/libc/manual/html_node/Status-bit-operations.html + + Linux online man page(s): + http://linux.die.net/man/3/fegetexcept + + The documentation quotes these sources for reference. All definitions and + code have been developed solely based on the information from these specs. + +*/ + +/* Represents the entire floating-point environment. The floating-point + environment refers collectively to any floating-point status flags and + control modes supported by the implementation. + In this implementation, the struct contains the state information from + the fstenv/fnstenv instructions and a copy of the SSE MXCSR, since GCC + uses SSE for a lot of floating-point operations. (Cygwin assumes i686 + or above these days, as does the compiler.) */ + +typedef struct _fenv_t +{ + struct _fpu_env_info { + unsigned int _fpu_cw; /* low 16 bits only. */ + unsigned int _fpu_sw; /* low 16 bits only. */ + unsigned int _fpu_tagw; /* low 16 bits only. */ + unsigned int _fpu_ipoff; + unsigned int _fpu_ipsel; + unsigned int _fpu_opoff; + unsigned int _fpu_opsel; /* low 16 bits only. */ + } _fpu; + unsigned int _sse_mxcsr; +} fenv_t; + +/* Represents the floating-point status flags collectively, including + any status the implementation associates with the flags. A floating-point + status flag is a system variable whose value is set (but never cleared) + when a floating-point exception is raised, which occurs as a side effect + of exceptional floating-point arithmetic to provide auxiliary information. + A floating-point control mode is a system variable whose value may be + set by the user to affect the subsequent behavior of floating-point + arithmetic. */ + +typedef __uint32_t fexcept_t; + +/* The header shall define the following constants if and only + if the implementation supports the floating-point exception by means + of the floating-point functions feclearexcept(), fegetexceptflag(), + feraiseexcept(), fesetexceptflag(), and fetestexcept(). Each expands to + an integer constant expression with values such that bitwise-inclusive + ORs of all combinations of the constants result in distinct values. */ + +#define FE_DIVBYZERO (1 << 2) +#define FE_INEXACT (1 << 5) +#define FE_INVALID (1 << 0) +#define FE_OVERFLOW (1 << 3) +#define FE_UNDERFLOW (1 << 4) + +/* The header shall define the following constant, which is + simply the bitwise-inclusive OR of all floating-point exception + constants defined above: */ + +/* in agreement w/ Linux the subnormal exception will always be masked */ +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_UNDERFLOW | FE_OVERFLOW | FE_DIVBYZERO | FE_INVALID) + +/* The header shall define the following constants if and only + if the implementation supports getting and setting the represented + rounding direction by means of the fegetround() and fesetround() + functions. Each expands to an integer constant expression whose values + are distinct non-negative vales. */ + +#define FE_DOWNWARD (1) +#define FE_TONEAREST (0) +#define FE_TOWARDZERO (3) +#define FE_UPWARD (2) + +/* Only Solaris and QNX implement fegetprec/fesetprec. As Solaris, use the + values defined by http://www.open-std.org/jtc1/sc22//WG14/www/docs/n752.htm + QNX defines different values. */ +#if __MISC_VISIBLE +#define FE_FLTPREC (0) +#define FE_DBLPREC (2) +#define FE_LDBLPREC (3) +#endif + +/* The header shall define the following constant, which + represents the default floating-point environment (that is, the one + installed at program startup) and has type pointer to const-qualified + fenv_t. It can be used as an argument to the functions within the + header that manage the floating-point environment. */ + +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV (_fe_dfl_env) + +/* Additional implementation-defined environments, with macro + definitions beginning with FE_ and an uppercase letter,and having + type "pointer to const-qualified fenv_t",may also be specified by + the implementation. */ + +#if __GNU_VISIBLE +/* If possible, the GNU C Library defines a macro FE_NOMASK_ENV which + represents an environment where every exception raised causes a trap + to occur. You can test for this macro using #ifdef. It is only defined + if _GNU_SOURCE is defined. */ +extern const fenv_t *_fe_nomask_env; +#define FE_NOMASK_ENV (_fe_nomask_env) + +/* These are GNU extensions defined in glibc. */ +int feenableexcept (int __excepts); +int fedisableexcept (int __excepts); +int fegetexcept (void); +#endif /* __GNU_VISIBLE */ + +#ifdef __CYGWIN__ + +#if __MISC_VISIBLE +int fegetprec (void); +int fesetprec (int __prec); +#endif + +#endif /* __CYGWIN__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _FENV_H */ diff --git a/lib/machine/sparc/Makefile.inc b/lib/machine/sparc/Makefile.inc new file mode 100644 index 0000000..0630987 --- /dev/null +++ b/lib/machine/sparc/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/scan.c %D%/shuffle.c %D%/setjmp.S diff --git a/lib/machine/sparc/machine/sparclet.h b/lib/machine/sparc/machine/sparclet.h new file mode 100644 index 0000000..34a0e82 --- /dev/null +++ b/lib/machine/sparc/machine/sparclet.h @@ -0,0 +1,32 @@ +/* Various stuff for the sparclet processor. + + This file is in the public domain. */ + +#ifndef _MACHINE_SPARCLET_H_ +#define _MACHINE_SPARCLET_H_ + +#ifdef __sparclet__ + +/* sparclet scan instruction */ + +extern __inline__ int +scan (int a, int b) +{ + int res; + __asm__ ("scan %1,%2,%0" : "=r" (res) : "r" (a), "r" (b)); + return res; +} + +/* sparclet shuffle instruction */ + +extern __inline__ int +shuffle (int a, int b) +{ + int res; + __asm__ ("shuffle %1,%2,%0" : "=r" (res) : "r" (a), "r" (b)); + return res; +} + +#endif /* __sparclet__ */ + +#endif /* _MACHINE_SPARCLET_H_ */ diff --git a/lib/machine/sparc/scan.c b/lib/machine/sparc/scan.c new file mode 100644 index 0000000..d76c0b9 --- /dev/null +++ b/lib/machine/sparc/scan.c @@ -0,0 +1,15 @@ +/* Cover function to sparclet `scan' instruction. + + This file is in the public domain. */ + +#ifdef __sparclet__ + +int +scan (int a, int b) +{ + int res; + __asm__ ("scan %1,%2,%0" : "=r" (res) : "r" (a), "r" (b)); + return res; +} + +#endif diff --git a/lib/machine/sparc/setjmp.S b/lib/machine/sparc/setjmp.S new file mode 100644 index 0000000..613df2b --- /dev/null +++ b/lib/machine/sparc/setjmp.S @@ -0,0 +1,144 @@ +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Modified for incorporation into newlib by Joel Sherrill + * (joel@OARcorp.com), On-Line Applications Research, 1995. + * Did the following: + * + merged in DEFS.h + * + removed error check since it prevented using this setjmp + * to "context switch" + * + added the support for the "user label" and "register" prefix + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: $Header$ + */ + +#if defined(LIBC_SCCS) && !defined(lint) + .asciz "@(#)_setjmp.s 8.1 (Berkeley) 6/4/93" +#endif /* LIBC_SCCS and not lint */ + +/* + * Recent versions of GNU cpp define variables which indicate the + * need for underscores and percents. If not using GNU cpp or + * the version does not support this, then you will obviously + * have to define these as appropriate. + */ + +#ifndef __USER_LABEL_PREFIX__ +#define __USER_LABEL_PREFIX__ _ +#endif + +#ifndef __REGISTER_PREFIX__ +#define __REGISTER_PREFIX__ +#endif + +/* ANSI concatenation macros. */ + +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ + +#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) + +/********************************************************************* + ********************************************************************* + * Contents of DEFS.h * + ********************************************************************* + *********************************************************************/ + +#ifdef PROF +#define ENTRY(x) \ + .align 4; .globl SYM(x); .proc 1; SYM(x):; .data; .align 4; 1: .long 0; \ + .text; save %sp,-96,%sp; sethi %hi(1b),%o0; call mcount; \ + or %lo(1b),%o0,%o0; restore +#else +#define ENTRY(x) \ + .align 4; .globl SYM(x); .proc 1; SYM(x): +#endif + + + +/********************************************************************* + ********************************************************************* + * END of DEFS.h * + ********************************************************************* + *********************************************************************/ + + +/* + * C library -- _setjmp, _longjmp + * + * _longjmp(a,v) + * will generate a "return(v?v:1)" from + * the last call to + * _setjmp(a) + * by unwinding the call stack. + * The previous signal state is NOT restored. + */ + + +/* #include "DEFS.h" */ + +ENTRY(setjmp) +ENTRY(_setjmp) + st %sp, [%o0] /* caller's stack pointer */ + st %i7, [%o0+4] /* caller's return pc */ + st %fp, [%o0+8] /* store caller's frame pointer */ + st %o7, [%o0+12] + retl + clr %o0 ! return 0 + +ENTRY(longjmp) +ENTRY(_longjmp) + ta 0x03 /* flush registers */ + addcc %o1, %g0, %g1 ! compute v ? v : 1 in a global register + be,a 0f + mov 1, %g1 +0: + ld [%o0], %sp /* caller's stack pointer */ + + ldd [%sp], %l0 + ldd [%sp+8], %l2 + ldd [%sp+16], %l4 + ldd [%sp+24], %l6 + + ldd [%sp+32], %i0 + ldd [%sp+40], %i2 + ldd [%sp+48], %i4 + + ld [%o0+4], %i7 /* caller's return pc */ + ld [%o0+8], %fp /* caller's frame pointer */ + ld [%o0+12], %o7 + + jmp %o7 + 8 ! success, return %g1 + mov %g1, %o0 + diff --git a/lib/machine/sparc/shuffle.c b/lib/machine/sparc/shuffle.c new file mode 100644 index 0000000..2c2ec1c --- /dev/null +++ b/lib/machine/sparc/shuffle.c @@ -0,0 +1,15 @@ +/* Cover function to sparclet `shuffle' instruction. + + This file is in the public domain. */ + +#ifdef __sparclet__ + +int +shuffle (int a, int b) +{ + int res; + __asm__ ("shuffle %1,%2,%0" : "=r" (res) : "r" (a), "r" (b)); + return res; +} + +#endif diff --git a/lib/machine/sparc/sys/fenv.h b/lib/machine/sparc/sys/fenv.h new file mode 100644 index 0000000..0d8fb13 --- /dev/null +++ b/lib/machine/sparc/sys/fenv.h @@ -0,0 +1,85 @@ +/* $NetBSD: fenv.h,v 1.2 2017/01/14 12:00:13 martin Exp $ */ + +/*- + * Copyright (c) 2004-2005 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _SYS_FENV_H_ +#define _SYS_FENV_H_ + +#include + +#ifdef __arch64__ +typedef uint64_t fenv_t; +typedef uint64_t fexcept_t; +#else +typedef uint32_t fenv_t; +typedef uint32_t fexcept_t; +#endif + +/* + * Exception flags + * + * Symbols are defined in such a way, to correspond to the accrued + * exception bits (aexc) fields of FSR. + */ +#define FE_INEXACT 0x00000020 /* 0000100000 */ +#define FE_DIVBYZERO 0x00000040 /* 0001000000 */ +#define FE_UNDERFLOW 0x00000080 /* 0010000000 */ +#define FE_OVERFLOW 0x00000100 /* 0100000000 */ +#define FE_INVALID 0x00000200 /* 1000000000 */ + +#define FE_ALL_EXCEPT (FE_DIVBYZERO | FE_INEXACT | \ + FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW) + +/* + * Rounding modes + * + * We can't just use the hardware bit values here, because that would + * make FE_UPWARD and FE_DOWNWARD negative, which is not allowed. + */ +#define FE_TONEAREST 0 /* round to nearest representable number */ +#define FE_TOWARDZERO 1 /* round to zero (truncate) */ +#define FE_UPWARD 2 /* round toward positive infinity */ +#define FE_DOWNWARD 3 /* round toward negative infinity */ +#define _ROUND_MASK (FE_TONEAREST | FE_DOWNWARD | \ + FE_UPWARD | FE_TOWARDZERO) +#define _ROUND_SHIFT 30 + + + +/* Default floating-point environment */ +extern const fenv_t *_fe_dfl_env; +#define FE_DFL_ENV _fe_dfl_env + +/* We need to be able to map status flag positions to mask flag positions */ +#define _FPUSW_SHIFT 18 +#define _ENABLE_MASK (FE_ALL_EXCEPT << _FPUSW_SHIFT) + + + +#endif /* !_SYS_FENV_H_ */ diff --git a/lib/machine/spu/Makefile.inc b/lib/machine/spu/Makefile.inc new file mode 100644 index 0000000..5384a5f --- /dev/null +++ b/lib/machine/spu/Makefile.inc @@ -0,0 +1,28 @@ +libc_a_SOURCES += \ + %D%/setjmp.S %D%/assert.c %D%/clearerr.c %D%/creat.c %D%/fclose.c %D%/feof.c \ + %D%/ferror.c %D%/fflush.c %D%/fgetc.c %D%/fgetpos.c %D%/fgets.c %D%/fileno.c %D%/fiprintf.S \ + %D%/fiscanf.S %D%/fopen.c %D%/fprintf.S %D%/fputc.c %D%/fputs.c %D%/fread.c %D%/freopen.c \ + %D%/fscanf.S %D%/fseek.c %D%/fsetpos.c %D%/ftell.c %D%/fwrite.c %D%/getc.c %D%/getchar.c \ + %D%/gets.c %D%/iprintf.S %D%/iscanf.S %D%/memcmp.c %D%/memcpy.c %D%/memmove.c \ + %D%/memset.c %D%/perror.c %D%/printf.S %D%/putc.c %D%/putchar.c %D%/puts.c %D%/remove.c \ + %D%/rename.c %D%/rewind.c %D%/scanf.S %D%/setbuf.c %D%/setvbuf.c %D%/siprintf.S %D%/siscanf.S \ + %D%/sleep.c %D%/sniprintf.S %D%/snprintf.S %D%/sprintf.S %D%/sscanf.S %D%/stdio.c %D%/strcat.c \ + %D%/strchr.c %D%/strcmp.c %D%/strcpy.c %D%/strcspn.c %D%/strlen.c %D%/strncat.c %D%/strncmp.c \ + %D%/strncpy.c %D%/strpbrk.c %D%/strrchr.c %D%/strspn.c %D%/strxfrm.c %D%/tmpfile.c \ + %D%/tmpnam.c %D%/ungetc.c %D%/usleep.c %D%/vfiprintf.c %D%/vfiscanf.c %D%/vfprintf.c \ + %D%/vfscanf.c %D%/viprintf.c %D%/viscanf.c %D%/vprintf.c %D%/vscanf.c %D%/vsiprintf.c \ + %D%/vsiscanf.c %D%/vsniprintf.c %D%/vsnprintf.c %D%/vsprintf.c %D%/vsscanf.c \ + %D%/stack_reg_va.S %D%/spu_clock_svcs.c %D%/spu_clock_stop.c %D%/spu_timer_flih.S \ + %D%/spu_timer_slih.c %D%/spu_timer_slih_reg.c %D%/spu_timer_svcs.c \ + %D%/spu_timer_stop.c %D%/spu_timer_free.c %D%/spu_timebase.c %D%/fdopen.c + +if HAVE_SPU_EA +libc_a_SOURCES += \ + %D%/calloc_ea.c %D%/free_ea.c %D%/malloc_ea.c %D%/memchr_ea.c %D%/memcmp_ea.c \ + %D%/memcpy_ea.c %D%/memmove_ea.c %D%/memset_ea.c %D%/mmap_ea.c %D%/mremap_ea.c %D%/msync_ea.c \ + %D%/munmap_ea.c %D%/posix_memalign_ea.c %D%/realloc_ea.c %D%/strcat_ea.c %D%/strchr_ea.c \ + %D%/strcmp_ea.c %D%/strcpy_ea.c %D%/strcspn_ea.c %D%/strlen_ea.c %D%/strncat_ea.c %D%/strncmp_ea.c \ + %D%/strncpy_ea.c %D%/strpbrk_ea.c %D%/strrchr_ea.c %D%/strspn_ea.c %D%/strstr_ea.c %D%/read_ea.c \ + %D%/pread_ea.c %D%/readv_ea.c %D%/write_ea.c %D%/pwrite_ea.c %D%/writev_ea.c %D%/spu-mcount.S \ + %D%/spu-gmon.c +endif diff --git a/lib/machine/spu/acinclude.m4 b/lib/machine/spu/acinclude.m4 new file mode 100644 index 0000000..bca70e3 --- /dev/null +++ b/lib/machine/spu/acinclude.m4 @@ -0,0 +1,9 @@ +if test "${machine_dir}" = "spu"; then + AC_CACHE_CHECK([whether the compiler supports __ea], newlib_cv_spu_compiler_has_ea, [dnl + AC_PREPROC_IFELSE([AC_LANG_PROGRAM( +[[#if !defined (__EA32__) && !defined (__EA64__) +# error "__ea not supported" +#endif +]])], [newlib_cv_spu_compiler_has_ea=yes], [newlib_cv_spu_compiler_has_ea=no])]) +fi +AM_CONDITIONAL(HAVE_SPU_EA, test "$newlib_cv_spu_compiler_has_ea" = yes) diff --git a/lib/machine/spu/assert.c b/lib/machine/spu/assert.c new file mode 100644 index 0000000..90e94eb --- /dev/null +++ b/lib/machine/spu/assert.c @@ -0,0 +1,39 @@ +#include +#include +#include + +/* + * SPU specific assert: just directly call exit(6), and use fprintf. That + * way we do not pull in the abort, signal.o code, nor (the likely + * otherwise unused) fiprintf. + */ + +/* func can be NULL, in which case no function information is given. */ +void +__assert_func (const char *file, + int line, + const char *func, + const char *failedexpr) +{ + fprintf(stderr, + "assertion \"%s\" failed: file \"%s\", line %d%s%s\n", + failedexpr, file, line, + func ? ", function: " : "", func ? func : ""); + /* + * On the SPU, we do not have signaling. Previously, standard newlib + * abort code was used. That eventually leads to a kill(SIGABRT), and + * for SPU too an exit(SIGABRT). SIGABRT was 6, so just use that value + * here. + */ + exit(6); + /* NOTREACHED */ +} + +void +__assert (const char *file, + int line, + const char *failedexpr) +{ + __assert_func (file, line, NULL, failedexpr); + /* NOTREACHED */ +} diff --git a/lib/machine/spu/c99ppe.h b/lib/machine/spu/c99ppe.h new file mode 100644 index 0000000..6e03d2c --- /dev/null +++ b/lib/machine/spu/c99ppe.h @@ -0,0 +1,115 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#ifndef __ASSEMBLER__ +#include +#include +#endif /* !__ASSEMBLER__ */ + +#define SPE_C99_SIGNALCODE 0x2100 + +#define SPE_C99_OP_SHIFT 24 +#define SPE_C99_OP_MASK 0xff +#define SPE_C99_DATA_MASK 0xffffff + +#define SPE_C99_CLEARERR 1 +#define SPE_C99_FCLOSE 2 +#define SPE_C99_FEOF 3 +#define SPE_C99_FERROR 4 +#define SPE_C99_FFLUSH 5 +#define SPE_C99_FGETC 6 +#define SPE_C99_FGETPOS 7 +#define SPE_C99_FGETS 8 +#define SPE_C99_FILENO 9 +#define SPE_C99_FOPEN 10 //implemented +#define SPE_C99_FPUTC 11 +#define SPE_C99_FPUTS 12 +#define SPE_C99_FREAD 13 +#define SPE_C99_FREOPEN 14 +#define SPE_C99_FSEEK 15 +#define SPE_C99_FSETPOS 16 +#define SPE_C99_FTELL 17 +#define SPE_C99_FWRITE 18 +#define SPE_C99_GETC 19 +#define SPE_C99_GETCHAR 20 +#define SPE_C99_GETS 21 +#define SPE_C99_PERROR 22 +#define SPE_C99_PUTC 23 +#define SPE_C99_PUTCHAR 24 +#define SPE_C99_PUTS 25 +#define SPE_C99_REMOVE 26 +#define SPE_C99_RENAME 27 +#define SPE_C99_REWIND 28 +#define SPE_C99_SETBUF 29 +#define SPE_C99_SETVBUF 30 +#define SPE_C99_SYSTEM 31 //not yet implemented in newlib +#define SPE_C99_TMPFILE 32 +#define SPE_C99_TMPNAM 33 +#define SPE_C99_UNGETC 34 +#define SPE_C99_VFPRINTF 35 +#define SPE_C99_VFSCANF 36 +#define SPE_C99_VPRINTF 37 +#define SPE_C99_VSCANF 38 +#define SPE_C99_VSNPRINTF 39 +#define SPE_C99_VSPRINTF 40 +#define SPE_C99_VSSCANF 41 +#define SPE_C99_LAST_OPCODE 42 + +#define SPE_C99_NR_OPCODES ((SPE_C99_LAST_OPCODE - SPE_C99_CLEARERR) + 1) + +#define SPE_STDIN 1 +#define SPE_STDOUT 2 +#define SPE_STDERR 3 +#define SPE_FOPEN_MAX FOPEN_MAX + +#ifdef __ASSEMBLER__ +#define SPE_STACK_REGS 72 /* Number of registers preserved in stack + in case of variable argument API. */ +#else /* !__ASSEMBLER__ */ +struct spe_reg128{ + unsigned int slot[4]; +}; + +void __sinit (struct _reent *); +FILE *__sfp (struct _reent *); +#define __sfp_free(fp) ( (fp)->_fp = 0 ) + +#define CHECK_INIT(ptr) \ + do \ + { \ + if (!_REENT_IS_NULL(ptr) && \ + !_REENT_CLEANUP(ptr)) \ + __sinit (ptr); \ + } \ + while (0) +#define CHECK_STR_INIT(ptr) /* currently, do nothing */ +#endif /* __ASSEMBLER__ */ diff --git a/lib/machine/spu/calloc_ea.c b/lib/machine/spu/calloc_ea.c new file mode 100644 index 0000000..019bf4b --- /dev/null +++ b/lib/machine/spu/calloc_ea.c @@ -0,0 +1,56 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +typedef struct +{ + unsigned long long nmemb; + unsigned int pad0[2]; + unsigned long long length; + unsigned int pad1[2]; +} calloc_ea_t; + +COMPAT_EA_ALIAS (calloc_ea); + +__ea void * +calloc_ea (size_ea_t nmemb, size_ea_t length) +{ + calloc_ea_t args; + + args.nmemb = (unsigned long long) nmemb; + args.length = (unsigned long long) length; + __send_to_ppe (JSRE_LIBEA_SIGNALCODE, SPE_LIBEA_CALLOC, &args); + return ull_to_eavoid (args.nmemb); +} diff --git a/lib/machine/spu/clearerr.c b/lib/machine/spu/clearerr.c new file mode 100644 index 0000000..27f726a --- /dev/null +++ b/lib/machine/spu/clearerr.c @@ -0,0 +1,53 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +void +clearerr (FILE * fp) + +{ + int ret; + + CHECK_INIT(_REENT); + + ret = fp->_fp; + + __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_CLEARERR, &ret); + + return; +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/creat.c b/lib/machine/spu/creat.c new file mode 100644 index 0000000..5b8c603 --- /dev/null +++ b/lib/machine/spu/creat.c @@ -0,0 +1,14 @@ +/* creat() "system call" */ + +/* copied from libc/posix/creat.c */ + +/* This is needed by f2c and therefore the SPEC benchmarks. */ + +#include + +int +creat (const char *path, + mode_t mode) +{ + return open (path, O_WRONLY | O_CREAT | O_TRUNC, mode); +} diff --git a/lib/machine/spu/ea_internal.h b/lib/machine/spu/ea_internal.h new file mode 100644 index 0000000..4f10d2e --- /dev/null +++ b/lib/machine/spu/ea_internal.h @@ -0,0 +1,147 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __EA_INTERNAL_H +#define __EA_INTERNAL_H + +#include +#define JSRE_POSIX1_SIGNALCODE 0x2101 +#define SPE_POSIX1_FTOK 0x05 +#define SPE_POSIX1_MMAP 0x0b +#define SPE_POSIX1_MUNMAP 0x0e +/* implemented to here */ +#define SPE_POSIX1_MREMAP 0x0c +#define SPE_POSIX1_MSYNC 0x0d +#define SPE_POSIX1_SHMGET 0x14 +#define SPE_POSIX1_SHMCTL 0x12 +#define SPE_POSIX1_SHMAT 0x11 +#define SPE_POSIX1_SHMDT 0x13 +#define SPE_POSIX1_SHM_OPEN 0x15 +#define SPE_POSIX1_SHM_UNLINK 0x16 + +#define JSRE_LIBEA_SIGNALCODE 0x2105 +#define SPE_LIBEA_CALLOC 0x01 +#define SPE_LIBEA_FREE 0x02 +#define SPE_LIBEA_MALLOC 0x03 +#define SPE_LIBEA_REALLOC 0x04 +#define SPE_LIBEA_POSIX_MEMALIGN 0x05 + +#define PAD_INT 3 +#ifdef __EA64__ +#define PAD_LONG 2 +#else /* 32 bit */ +#define PAD_LONG 3 +#endif + +#define ROUND_UP_NEXT_128(x) (((x) + 128) & (~127)) +#define ROUND_DOWN_128(x) ((x) & (~127)) + +/* Macro that generates an __ea alias. */ +#ifdef __EA64__ +#define COMPAT_EA_ALIAS(name) asm (".global\t__" #name "64\n\t.set\t__" #name "64," #name) +#else +#define COMPAT_EA_ALIAS(name) asm (".global\t__" #name "32\n\t.set\t__" #name "32," #name) +#endif + +static inline __ea void* round_down_128_ea(__ea void* x) +{ + size_ea_t tmp = (size_ea_t) x; + tmp &= (~127); + return (__ea void*)tmp; +} + +static +inline __ea void* round_up_next_128_ea(__ea void* x) +{ + size_ea_t tmp = (size_ea_t) x; + tmp += 128; + tmp &= (~127); + return (__ea void*)tmp; +} + +#define __cache_fetch_dirty_all(x) \ + __cache_fetch_dirty(round_down_128_ea(x), 128) + +/* please optimize, this hurts my eyes */ +static inline size_t +three_way_min(size_t x, size_t y, size_t z) +{ + if (x < y) + if (x < z) + return x; + else + return z; + else + if (y < z) + return y; + else + return z; +} + +#undef eavoid_to_ul +#define eavoid_to_ul(X) ({ \ + unsigned long _y; \ + __asm__ ("# %0 %1" : "=r" (_y) : "0" (X)); \ + _y; \ +}) + +#undef eavoid_to_ull +#define eavoid_to_ull(X) ({ \ + unsigned long long _y; \ + __asm__ ("# %0 %1" : "=r" (_y) : "0" (X)); \ + _y; \ +}) + +#ifdef __EA32__ +#undef ull_to_eavoid +#define ull_to_eavoid(X) ({ \ + __ea void* _y; \ + unsigned long long X2; \ + (X2) = (X) << 32;\ + __asm__ ("# %0 %1" : "=r" (_y) : "0" (X2)); \ + _y; \ +}) +#else /*__EA64__*/ +#define ull_to_eavoid(X) ({ \ + __ea void* _y; \ + __asm__ ("# %0 %1" : "=r" (_y) : "0" (X)); \ + _y; \ +}) +#endif + +#undef ul_to_eavoid +#define ul_to_eavoid(X) ({ \ + __ea void* _y; \ + __asm__ ("# %0 %1" : "=r" (_y) : "0" (X)); \ + _y; \ +}) + +#endif /*__EA_INTERNAL_H*/ diff --git a/lib/machine/spu/fclose.c b/lib/machine/spu/fclose.c new file mode 100644 index 0000000..6a3e507 --- /dev/null +++ b/lib/machine/spu/fclose.c @@ -0,0 +1,54 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY +int +fclose (FILE * fp) +{ + int ret; + + CHECK_INIT(_REENT); + + ret = fp->_fp; + + ret = __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FCLOSE, &ret); + + __sfp_free(fp); + + return ret; +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fdopen.c b/lib/machine/spu/fdopen.c new file mode 100644 index 0000000..6244e50 --- /dev/null +++ b/lib/machine/spu/fdopen.c @@ -0,0 +1,43 @@ +/* +(C) Copyright IBM Corp. 2009 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +#ifndef _REENT_ONLY +/* Just a stub for now. */ +FILE * +fdopen (int fd, + const char *mode) +{ + errno = ENOSYS; + return NULL; +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/feof.c b/lib/machine/spu/feof.c new file mode 100644 index 0000000..8e87414 --- /dev/null +++ b/lib/machine/spu/feof.c @@ -0,0 +1,50 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +int +feof (FILE * fp) +{ + int result; + + CHECK_INIT(_REENT); + + result = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FEOF, &result); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/ferror.c b/lib/machine/spu/ferror.c new file mode 100644 index 0000000..be7970f --- /dev/null +++ b/lib/machine/spu/ferror.c @@ -0,0 +1,50 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +int +ferror (FILE * fp) +{ + int result; + + CHECK_INIT(_REENT); + + result = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FERROR, &result); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fflush.c b/lib/machine/spu/fflush.c new file mode 100644 index 0000000..6b45ac4 --- /dev/null +++ b/lib/machine/spu/fflush.c @@ -0,0 +1,49 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY +int +fflush (FILE * fp) +{ + int result; + + CHECK_INIT(_REENT); + + result = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FFLUSH, &result); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fgetc.c b/lib/machine/spu/fgetc.c new file mode 100644 index 0000000..8e191cf --- /dev/null +++ b/lib/machine/spu/fgetc.c @@ -0,0 +1,50 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +int +fgetc (FILE * fp) +{ + int result; + + CHECK_INIT(_REENT); + + result = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FGETC, &result); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fgetpos.c b/lib/machine/spu/fgetpos.c new file mode 100644 index 0000000..68d41ac --- /dev/null +++ b/lib/machine/spu/fgetpos.c @@ -0,0 +1,59 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + _fpos_t * pos; +} c99_fgetpos_t; + +#ifndef _REENT_ONLY + +int +fgetpos (FILE *__restrict fp, + _fpos_t *__restrict pos) +{ + c99_fgetpos_t arg; + + CHECK_INIT(_REENT); + + arg.fp = fp->_fp; + arg.pos = pos; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FGETPOS, &arg); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fgets.c b/lib/machine/spu/fgets.c new file mode 100644 index 0000000..cde29da --- /dev/null +++ b/lib/machine/spu/fgets.c @@ -0,0 +1,63 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +typedef struct +{ + char *buf; + unsigned int pad0[3]; + int n; + unsigned int pad1[3]; + int fp; +} c99_fgets_t; + +#ifndef _REENT_ONLY + +char * +fgets (char *__restrict buf, + int n, + FILE *__restrict fp) +{ + c99_fgets_t args; + + CHECK_INIT(_REENT); + + args.buf = buf; + args.n = n; + args.fp = fp->_fp; + + return (char*) __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FGETS, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fileno.c b/lib/machine/spu/fileno.c new file mode 100644 index 0000000..cbf9e50 --- /dev/null +++ b/lib/machine/spu/fileno.c @@ -0,0 +1,51 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +int +fileno (FILE *fp) + +{ + int ret; + + CHECK_INIT(_REENT); + + ret = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FILENO, &ret); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fiprintf.S b/lib/machine/spu/fiprintf.S new file mode 100644 index 0000000..c0d23ca --- /dev/null +++ b/lib/machine/spu/fiprintf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define fprintf fiprintf +#include "fprintf.S" diff --git a/lib/machine/spu/fiscanf.S b/lib/machine/spu/fiscanf.S new file mode 100644 index 0000000..5211572 --- /dev/null +++ b/lib/machine/spu/fiscanf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define fscanf fiscanf +#include "fscanf.S" diff --git a/lib/machine/spu/fopen.c b/lib/machine/spu/fopen.c new file mode 100644 index 0000000..13ecdad --- /dev/null +++ b/lib/machine/spu/fopen.c @@ -0,0 +1,77 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + const char* file; + unsigned int pad0[ 3 ]; + const char* mode; + unsigned int pad1[ 3 ]; +} c99_fopen_t; + +#ifndef _REENT_ONLY +FILE * +fopen (const char *__restrict file, + const char *__restrict mode) +{ + int ret; + c99_fopen_t args; + FILE *fp; + struct _reent *ptr = _REENT; + + CHECK_INIT(ptr); + + fp = __sfp(ptr); + if (!fp) { + return NULL; + } + + args.file = file; + args.mode = mode; + + ret = __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FOPEN, &args); + + if (ret) { + fp->_fp = ret; + return fp; + } + else { + __sfp_free(fp); + return NULL; + } +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fprintf.S b/lib/machine/spu/fprintf.S new file mode 100644 index 0000000..c4a3efa --- /dev/null +++ b/lib/machine/spu/fprintf.S @@ -0,0 +1,57 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL fprintf + .type fprintf, @function +fprintf: + stqd $0, 16($sp) /* save caller address */ + il $2, 2 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + brsl $0, __check_init + lqd $3, 16*2($sp) /* $3 <- saved FP on the stack frame */ + lqd $2, 0($3) /* FP = fp->_fp */ + rotqby $2, $2, $3 + stqd $2, 16*2($sp) /* replace FP on the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VFPRINTF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size fprintf, .-fprintf diff --git a/lib/machine/spu/fputc.c b/lib/machine/spu/fputc.c new file mode 100644 index 0000000..bf25526 --- /dev/null +++ b/lib/machine/spu/fputc.c @@ -0,0 +1,62 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int ch; + unsigned int pad0[ 3 ]; + int fp; + unsigned int pad1[ 3 ]; +} c99_fputc_t; + +#ifndef _REENT_ONLY + +int +fputc (c, fp) + int c; + register FILE *fp; +{ + c99_fputc_t args; + + CHECK_INIT(_REENT); + + args.ch = c; + args.fp = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FPUTC, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fputs.c b/lib/machine/spu/fputs.c new file mode 100644 index 0000000..8984186 --- /dev/null +++ b/lib/machine/spu/fputs.c @@ -0,0 +1,61 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + const char* s; + unsigned int pad0[ 3 ]; + int fp; + unsigned int pad1[ 3 ]; +} c99_fputs_t; + +#ifndef _REENT_ONLY + +int +fputs (char const *__restrict s, + FILE *__restrict fp) +{ + c99_fputs_t args; + + CHECK_INIT(_REENT); + + args.s = s; + args.fp = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FPUTS, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fread.c b/lib/machine/spu/fread.c new file mode 100644 index 0000000..12b6bb7 --- /dev/null +++ b/lib/machine/spu/fread.c @@ -0,0 +1,68 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + char* buf; + unsigned int pad0[ 3 ]; + size_t size; + unsigned int pad1[ 3 ]; + size_t count; + unsigned int pad2[ 3 ]; + int fp; +} c99_fread_t; + +#ifndef _REENT_ONLY + +size_t +fread (void *__restrict buf, + size_t size, + size_t count, + FILE *__restrict fp) +{ + c99_fread_t args; + + CHECK_INIT(_REENT); + + args.buf = buf; + args.size = size; + args.count = count; + args.fp = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FREAD, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/free_ea.c b/lib/machine/spu/free_ea.c new file mode 100644 index 0000000..ac206a1 --- /dev/null +++ b/lib/machine/spu/free_ea.c @@ -0,0 +1,51 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include +#include + +extern void __cache_flush (void) __attribute__ ((weak)); + +COMPAT_EA_ALIAS (free_ea); + +void free_ea(__ea void *ptr) +{ + unsigned long long ptr_arg; + ptr_arg = (unsigned long long) (size_ea_t) ptr; + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + __send_to_ppe(JSRE_LIBEA_SIGNALCODE, SPE_LIBEA_FREE , &ptr_arg); + return; +} diff --git a/lib/machine/spu/freopen.c b/lib/machine/spu/freopen.c new file mode 100644 index 0000000..8babcfe --- /dev/null +++ b/lib/machine/spu/freopen.c @@ -0,0 +1,74 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + const char *file; + unsigned int pad0[ 3 ]; + const char *mode; + unsigned int pad1[ 3 ]; + int fp; +} c99_freopen_t; + +#ifndef _REENT_ONLY + +FILE * +freopen (const char *__restrict file, + const char *__restrict mode, + FILE *__restrict fp) +{ + int ret; + c99_freopen_t args; + + CHECK_INIT(_REENT); + + args.file = file; + args.mode = mode; + args.fp = fp->_fp; + + ret = __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FREOPEN, &args); + + if (ret) { + fp->_fp = ret; + return fp; + } + else { + __sfp_free(fp); + return NULL; + } +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fscanf.S b/lib/machine/spu/fscanf.S new file mode 100644 index 0000000..e0d5f7f --- /dev/null +++ b/lib/machine/spu/fscanf.S @@ -0,0 +1,57 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL fscanf + .type fscanf, @function +fscanf: + stqd $0, 16($sp) /* save caller address */ + il $2, 2 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + brsl $0, __check_init + lqd $3, 16*2($sp) /* $3 <- saved FP on the stack frame */ + lqd $2, 0($3) /* FP = fp->_fp */ + rotqby $2, $2, $3 + stqd $2, 16*2($sp) /* replace FP on the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VFSCANF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size fscanf, .-fscanf diff --git a/lib/machine/spu/fseek.c b/lib/machine/spu/fseek.c new file mode 100644 index 0000000..df33ed8 --- /dev/null +++ b/lib/machine/spu/fseek.c @@ -0,0 +1,64 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + long offset; + unsigned int pad1[ 3 ]; + int whence; +} c99_fseek_t; + +#ifndef _REENT_ONLY + +int +fseek (register FILE *fp, + long offset, + int whence) +{ + c99_fseek_t args; + + CHECK_INIT(_REENT); + + args.fp = fp->_fp; + args.offset = offset; + args.whence = whence; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FSEEK, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fsetpos.c b/lib/machine/spu/fsetpos.c new file mode 100644 index 0000000..87daa4c --- /dev/null +++ b/lib/machine/spu/fsetpos.c @@ -0,0 +1,60 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + const _fpos_t *pos; +} c99_fsetpos_t; + +#ifndef _REENT_ONLY + +int +fsetpos (FILE * iop, + const _fpos_t * pos) +{ + c99_fsetpos_t args; + + CHECK_INIT(_REENT); + + args.fp = iop->_fp; + args.pos = pos; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FSETPOS, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/ftell.c b/lib/machine/spu/ftell.c new file mode 100644 index 0000000..8e56983 --- /dev/null +++ b/lib/machine/spu/ftell.c @@ -0,0 +1,51 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + + +#ifndef _REENT_ONLY + +long +ftell (FILE * fp) +{ + long ret; + + CHECK_INIT(_REENT); + + ret = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FTELL, &ret); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/fwrite.c b/lib/machine/spu/fwrite.c new file mode 100644 index 0000000..84572af --- /dev/null +++ b/lib/machine/spu/fwrite.c @@ -0,0 +1,68 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +typedef struct +{ + const char* buf; + unsigned int pad0[ 3 ]; + size_t size; + unsigned int pad1[ 3 ]; + size_t count; + unsigned int pad2[ 3 ]; + int fp; +} c99_fwrite_t; + +size_t +fwrite (const void *__restrict buf, + size_t size, + size_t count, + FILE * fp) +{ + c99_fwrite_t args; + + CHECK_INIT(_REENT); + + args.buf = buf; + args.size = size; + args.count = count; + args.fp = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_FWRITE, &args); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/getc.c b/lib/machine/spu/getc.c new file mode 100644 index 0000000..213bada --- /dev/null +++ b/lib/machine/spu/getc.c @@ -0,0 +1,54 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" +/* + * A subroutine version of the macro getc. + */ + +#ifndef _REENT_ONLY + +int +getc (fp) + FILE *fp; +{ + int ret; + + CHECK_INIT(_REENT); + + ret = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_GETC, &ret); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/getchar.c b/lib/machine/spu/getchar.c new file mode 100644 index 0000000..b166bba --- /dev/null +++ b/lib/machine/spu/getchar.c @@ -0,0 +1,48 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#undef getchar + +#ifndef _REENT_ONLY + +int +getchar () +{ + int ret; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_GETCHAR, &ret); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/gets.c b/lib/machine/spu/gets.c new file mode 100644 index 0000000..1047c5f --- /dev/null +++ b/lib/machine/spu/gets.c @@ -0,0 +1,47 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +char * +gets (buf) + char *buf; +{ + /* The return value gets written over buf + */ + return (char*) __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_GETS, &buf); +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/include/ea.h b/lib/machine/spu/include/ea.h new file mode 100644 index 0000000..01e0dcc --- /dev/null +++ b/lib/machine/spu/include/ea.h @@ -0,0 +1,137 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef __EA_H +#define __EA_H + +#include +#include +#include +#include +#include + +/* + * take this out when compiler support is common + */ +#if (!defined( __EA32__ ) && !defined( __EA64__ )) +#warning "need __ea support in compiler to compile to take advantage of libea features" +#define __ea +#define __EA32__ +#endif + +#ifdef __EA64__ + +typedef uint64_t size_ea_t; +typedef int64_t ssize_ea_t; +typedef uint64_t key_ea_t; +#define MAP_FAILED_EA ((__ea void *) -1LL) + +#else + +typedef uint32_t size_ea_t; +typedef int32_t ssize_ea_t; +typedef uint32_t key_ea_t; +#define MAP_FAILED_EA ((__ea void *) -1) + +#endif + +typedef __ea void * eaptr; +struct iovec_ea +{ +#ifdef __EA32__ + unsigned int __pad1; /* 32 bit padding */ +#endif + /*__ea void *iov_base;*/ + eaptr iov_base; /* Starting address */ +#ifdef __EA32__ + unsigned int __pad2; /* 32 bit padding */ +#endif + size_ea_t iov_len; /* Number of bytes */ +}; + + +/* Memory Mapping functions */ +__ea void *mmap_ea (__ea void *start, size_ea_t length, int prot, int + flags, int fd, off_t offset); +int munmap_ea (__ea void *start, size_ea_t length); +__ea void *mremap_ea (__ea void *old_address, size_ea_t old_size, + size_ea_t new_size, unsigned long flags); +int msync_ea (__ea void *start, size_ea_t length, int flags); + +/* EA memory mangement functions */ +__ea void *calloc_ea (size_ea_t nmemb, size_ea_t length); +void free_ea (__ea void *ptr); +__ea void *malloc_ea (size_ea_t size); +__ea void *realloc_ea (__ea void *ptr, size_ea_t size); +int posix_memalign_ea (__ea void **memptr, size_ea_t alignment, size_ea_t size); + +/* String copying functions */ +__ea void *memcpy_ea (__ea void *dest, __ea const void *src, size_ea_t n); +__ea void *memmove_ea (__ea void *dest, __ea const void *src, size_ea_t n); +__ea char *strcpy_ea (__ea char *dest, __ea const char *src); +__ea char *strncpy_ea (__ea char *dest, __ea const char *src, size_ea_t n); + +/* Concatenation functions */ +__ea char *strcat_ea (__ea char *dest, __ea const char *src); +__ea char *strncat_ea (__ea char *dest, __ea const char *src, size_ea_t n); + +/* Comparison functions */ +int memcmp_ea (__ea void *s1, __ea const void *s2, size_ea_t n); +int strcmp_ea (__ea char *s1, __ea const char *s2); +int strncmp_ea (__ea void *s1, __ea const void *s2, size_ea_t n3); + +/* Search functions*/ +__ea void *memchr_ea (__ea const void *s, int c, size_ea_t n); +__ea char *strchr_ea (__ea const char *s, int c); +size_ea_t strcspn_ea (__ea const char *s, const char *reject); +__ea char *strpbrk_ea (__ea const char *s, const char *accept); +__ea char *strrchr_ea (__ea const char *s, int c); +size_ea_t strspn_ea (__ea const char *s, const char *accept); +__ea char * strstr_ea (__ea const char *s1, __ea const char *s2); + +/* Misc functions */ +__ea void *memset_ea (__ea void *dest, int c, size_ea_t n); +size_ea_t strlen_ea (__ea const char *s); + +/* Linux system call functions */ +ssize_ea_t read_ea(int fd, __ea void *buf, size_ea_t count); +ssize_ea_t pread_ea(int fd, __ea void *buf, size_ea_t count, off_t offset); +ssize_ea_t readv_ea(int fd, struct iovec_ea *vector, int count); +ssize_ea_t write_ea(int fd, __ea const void *buf, size_ea_t count); +ssize_ea_t pwrite_ea(int fd, __ea const void *buf, size_ea_t count, off_t offset); +ssize_ea_t writev_ea(int fd, struct iovec_ea *vector, int count); + + +#if defined( __EA64__ ) && defined( __EA32__ ) +#error __EA64__ and __EA32__ are both defined +#endif + +#endif diff --git a/lib/machine/spu/include/fenv.h b/lib/machine/spu/include/fenv.h new file mode 100644 index 0000000..6252c99 --- /dev/null +++ b/lib/machine/spu/include/fenv.h @@ -0,0 +1,64 @@ +/* + (C) Copyright 2006, 2007 + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _FENV_H +#define _FENV_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exception */ +void feclearexcept(int excepts); +void fegetexceptflag(fexcept_t *flagp, int excepts); +void feraiseexcept(int excepts); +void fesetexceptflag(const fexcept_t *flagp, int excepts); +int fetestexcept(int excepts); + +/* Rounding mode */ +int fegetround(void); +int fesetround(int rounding_mode); + +/* Float environment */ +void fegetenv(fenv_t *envp); +int feholdexcept(fenv_t *envp); +void fesetenv(const fenv_t *envp); +void feupdateenv(const fenv_t *envp); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/machine/spu/include/spu_timer.h b/lib/machine/spu/include/spu_timer.h new file mode 100644 index 0000000..4116aac --- /dev/null +++ b/lib/machine/spu/include/spu_timer.h @@ -0,0 +1,85 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _SPU_TIMER_H_ +#define _SPU_TIMER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Clock services. */ +extern void spu_clock_start (void); +extern int spu_clock_stop (void); +extern uint64_t spu_clock_read (void); + +/* Timer services. */ +extern int spu_timer_alloc (int interval, void (*func) (int)); +extern int spu_timer_free (int id); +extern int spu_timer_start (int id); +extern int spu_timer_stop (int id); +extern unsigned spu_timebase (void); + +/* Interrupt services. */ +extern void spu_slih_register (unsigned event_mask, + unsigned (*slih) (unsigned)); +extern unsigned spu_clock_slih (unsigned event_mask); + +/* Number of supported timers. */ +#define SPU_TIMER_NTIMERS 4 + +/* Recommended minimun spu timer interval time from (cat /proc/cpuinfo) + * QS20 100/14318000 = 6.98 usec + * QS21/QS22 100/26666666 = 3.75 usec + * PS3 100/79800000 = 1.25 usec */ +#define SPU_TIMER_MIN_INTERVAL 100 + +/* Clock error codes. */ +#define SPU_CLOCK_ERR_NOT_RUNNING -2 +#define SPU_CLOCK_ERR_STILL_RUNNING -3 +#define SPU_CLOCK_ERR_TIMERS_ACTIVE -4 + +/* Timer error codes. */ +#define SPU_TIMER_ERR_INVALID_PARM -10 +#define SPU_TIMER_ERR_NONE_FREE -11 +#define SPU_TIMER_ERR_INVALID_ID -12 +#define SPU_TIMER_ERR_ACTIVE -13 +#define SPU_TIMER_ERR_NOT_ACTIVE -14 +#define SPU_TIMER_ERR_NOCLOCK -15 +#define SPU_TIMER_ERR_FREE -16 +#define SPU_TIMER_ERR_NOT_STOPPED -17 + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/machine/spu/iprintf.S b/lib/machine/spu/iprintf.S new file mode 100644 index 0000000..1c3440b --- /dev/null +++ b/lib/machine/spu/iprintf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define printf iprintf +#include "printf.S" diff --git a/lib/machine/spu/iscanf.S b/lib/machine/spu/iscanf.S new file mode 100644 index 0000000..f96be15 --- /dev/null +++ b/lib/machine/spu/iscanf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define scanf iscanf +#include "scanf.S" diff --git a/lib/machine/spu/machine/_types.h b/lib/machine/spu/machine/_types.h new file mode 100644 index 0000000..edff175 --- /dev/null +++ b/lib/machine/spu/machine/_types.h @@ -0,0 +1,60 @@ +/* + Copyright 2007 + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _MACHINE__TYPES_H +#define _MACHINE__TYPES_H + +#include + +/* + * fpos_t large enough for either 32 or 64 bit ppc glibc fpos_t. + */ +#define __machine_fpos_t_defined +typedef struct { + char __pos[16]; +} _fpos_t; + +#ifdef __LARGE64_FILES +#define __machine_fpos64_t_defined +typedef _fpos_t _fpos64_t; +#endif + +#define __machine_dev_t_defined +typedef int __dev_t; + +#define __machine_uid_t_defined +typedef unsigned int __uid_t; +#define __machine_gid_t_defined +typedef unsigned int __gid_t; + +#endif /* _MACHINE__TYPES_H */ diff --git a/lib/machine/spu/malloc_ea.c b/lib/machine/spu/malloc_ea.c new file mode 100644 index 0000000..e5f9e2f --- /dev/null +++ b/lib/machine/spu/malloc_ea.c @@ -0,0 +1,47 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (malloc_ea); + +__ea void * +malloc_ea (size_ea_t size) +{ + unsigned long long sz; + + sz = (unsigned long long) size; + __send_to_ppe (JSRE_LIBEA_SIGNALCODE, SPE_LIBEA_MALLOC, &sz); + return ull_to_eavoid (sz); +} diff --git a/lib/machine/spu/memchr_ea.c b/lib/machine/spu/memchr_ea.c new file mode 100644 index 0000000..10d0d59 --- /dev/null +++ b/lib/machine/spu/memchr_ea.c @@ -0,0 +1,73 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (memchr_ea); + +__ea void * +memchr_ea (__ea const void *s, int c, size_ea_t n) +{ + __ea void *curr_s = (__ea void *) s; + void *local_s; + size_ea_t left_in_cacheline; + size_ea_t search_size; + void *where; + size_ea_t ret; + + while (n) + { + left_in_cacheline = ROUND_UP_NEXT_128 ((size_ea_t) curr_s) - + (size_ea_t) curr_s; + search_size = left_in_cacheline < n ? left_in_cacheline : n; + + local_s = __cache_fetch (curr_s); + where = memchr (local_s, c, search_size); + + if (where) + { + ret = (size_ea_t) curr_s + + ((size_ea_t) (int) where - (size_ea_t) (int) local_s); + return (__ea void *) ret; + } + + /* update values to take into account what we copied */ + curr_s += search_size; + n -= search_size; + } + + /* if we got here n was initially 0 */ + return NULL; +} diff --git a/lib/machine/spu/memcmp.c b/lib/machine/spu/memcmp.c new file mode 100644 index 0000000..a0f5449 --- /dev/null +++ b/lib/machine/spu/memcmp.c @@ -0,0 +1,43 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include "strncmp.h" + +/* + * Compare the two strings s1 and s2 of length n. Returns an integer less + * than, equal to, or greater than zero if s1 is found, respectively, + * to be less than, to match, or be greater than s2. + */ +int memcmp(const void *s1, const void *s2, size_t n) +{ + vec_uint4 end_v; + return _strncmp_internal (s1, s2, n, &end_v, 0 /* no zero check */); +} diff --git a/lib/machine/spu/memcmp_ea.c b/lib/machine/spu/memcmp_ea.c new file mode 100644 index 0000000..4088bcc --- /dev/null +++ b/lib/machine/spu/memcmp_ea.c @@ -0,0 +1,78 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include +#include + +COMPAT_EA_ALIAS (memcmp_ea); + +int +memcmp_ea (__ea void *s1, __ea const void *s2, size_ea_t n) +{ + __ea void *curr_s1 = s1; + __ea void *curr_s2 = (__ea void *) s2; + void *l_s1; + void *l_s2; + size_ea_t local_n; + size_ea_t s2_n; + size_ea_t s1_n; + int ret; + + ret = 0; + while (n) + { + l_s2 = __cache_fetch (curr_s2); + l_s1 = __cache_fetch (curr_s1); + + /* + * Use the smaller of the size left to compare (n), the space left in + * s2 cacheline (s2_n), or the space left in the s1 cacheline (s1_n). + */ + s2_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_s2) - (size_ea_t) curr_s2; + s1_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_s1) - (size_ea_t) curr_s1; + local_n = three_way_min (s2_n, s1_n, n); + + ret = memcmp (l_s1, l_s2, local_n); + if (ret) + return ret; + + /* update values to take into account what we copied */ + curr_s2 += local_n; + curr_s1 += local_n; + n -= local_n; + + } + + return ret; +} diff --git a/lib/machine/spu/memcpy.c b/lib/machine/spu/memcpy.c new file mode 100644 index 0000000..0483cd2 --- /dev/null +++ b/lib/machine/spu/memcpy.c @@ -0,0 +1,118 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include "../../string/local.h" + +/* Copy n bytes from memory area src to memory area dest. + * The memory areas may not overlap. The memcpy subroutine + * returns a pointer to dest. + * + * Faster implementation of this function can be implemented + * either with prior knowledge of the alignment or special + * casing specific optimal alignments. + */ +void * +__inhibit_loop_to_libcall +memcpy(void * __restrict__ dest, const void * __restrict__ src, size_t n) +{ + int adjust, delta; + unsigned int soffset1, doffset1, doffset2; + vec_uchar16 *vSrc, *vDst; + vec_uchar16 sdata1, sdata2, sdata, ddata, shuffle; + vec_uchar16 mask, mask1, mask2, mask3; + + vSrc = (vec_uchar16 *)(src); + vDst = (vec_uchar16 *)(dest); + + /* Handle any leading destination partial quadwords as + * well a very short copy (ie, such that the n characters + * all reside in a single (destination) quadword. + */ + soffset1 = (unsigned int)(src) & 15; + doffset1 = (unsigned int)(dest) & 15; + doffset2 = ((unsigned int)(dest) + n) & 15; + + /* Compute a shuffle pattern used to align the source string + * with the alignment of the destination string. + */ + + adjust = (int)spu_extract(spu_cmpgt(spu_promote(doffset1, 0), spu_promote(soffset1, 0)), 0); + delta = (int)soffset1 - (int)doffset1; + delta += adjust & 16; + + shuffle = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char)delta), + VEC_LITERAL(vec_uint4, 0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + + vSrc += adjust; + + sdata1 = *vSrc++; + sdata2 = *vSrc++; + + ddata = *vDst; + sdata = spu_shuffle(sdata1, sdata2, shuffle); + + /* Construct a series of masks used to data insert. The masks + * contain 0 when the destination word is unchanged, 1 when it + * must be replaced by source bytes. + * + * mask1 = mask for leading unchanged bytes + * mask2 = mask for trailing unchange bytes + * mask3 = mask indicating the more than one qword is being changed. + */ + mask = spu_splats((unsigned char)-1); + mask1 = spu_rlmaskqwbyte(mask, -doffset1); + mask2 = spu_slqwbyte(mask, 16-doffset2); + mask3 = (vec_uchar16)spu_cmpgt(spu_splats((unsigned int)(doffset1 + n)), 15); + + *vDst++ = spu_sel(ddata, sdata, spu_and(mask1, spu_or(mask2, mask3))); + + n += doffset1; + + /* Handle complete destination quadwords + */ + while (n > 31) { + sdata1 = sdata2; + sdata2 = *vSrc++; + *vDst++ = spu_shuffle(sdata1, sdata2, shuffle); + n -= 16; + } + + /* Handle any trailing partial (destination) quadwords + */ + mask = spu_and((vec_uchar16)spu_cmpgt(spu_splats((unsigned int)n), 16), mask2); + *vDst = spu_sel(*vDst, spu_shuffle(sdata2, *vSrc, shuffle), mask); + + return (dest); +} diff --git a/lib/machine/spu/memcpy_ea.c b/lib/machine/spu/memcpy_ea.c new file mode 100644 index 0000000..ae67f86 --- /dev/null +++ b/lib/machine/spu/memcpy_ea.c @@ -0,0 +1,78 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include +#include +#include "../../string/local.h" + +COMPAT_EA_ALIAS (memcpy_ea); + +__ea void * +__inhibit_loop_to_libcall +memcpy_ea (__ea void *dest, __ea const void *src, size_ea_t n) +{ + __ea void *curr_dest = dest; + __ea const void *curr_src = src; + void *l_dest; + void *l_src; + size_ea_t local_n; + size_ea_t src_n; + size_ea_t dst_n; + + while (n) + { + l_src = __cache_fetch ((__ea void *) curr_src); + + /* + * use the smaller of the size left to copy (n), the space left in the + * src cacheline (src_n), or the space left in the destination + * cacheline (dst_n) + */ + src_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_src) - (size_ea_t) curr_src; + dst_n = + ROUND_UP_NEXT_128 ((size_ea_t) curr_dest) - (size_ea_t) curr_dest; + local_n = three_way_min (src_n, dst_n, n); + + l_dest = __cache_fetch_dirty (curr_dest, local_n); + + memcpy (l_dest, l_src, local_n); + + /* update values to take into account what we copied */ + curr_src += local_n; + curr_dest += local_n; + n -= local_n; + } + + return dest; +} diff --git a/lib/machine/spu/memmove.c b/lib/machine/spu/memmove.c new file mode 100644 index 0000000..f2fe4f9 --- /dev/null +++ b/lib/machine/spu/memmove.c @@ -0,0 +1,216 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "vec_literal.h" + +/* Copy n bytes from memory area src to memory area dest. + * Copying is performed as if the n characters pointed to + * by src are first copied into a temporary array that does + * not overlap the src and dest arrays. Then the n characters + * of the temporary array are copied into the destination + * array. The memmove subroutine returns a pointer to dest. + */ + +void * memmove(void * __restrict__ dest, const void * __restrict__ src, size_t n) +{ + int adjust, delta; + unsigned int soffset1, soffset2, doffset1, doffset2; + vec_uchar16 *vSrc, *vDst; + vec_uchar16 sdata1, sdata2, sdata, ddata, shuffle; + vec_uchar16 mask, mask1, mask2, mask3, one = spu_splats((unsigned char)-1); + + soffset1 = (unsigned int)(src) & 15; + doffset1 = (unsigned int)(dest) & 15; + doffset2 = ((unsigned int)(dest) + n) & 15; + + /* Construct a series of masks used to data insert. The masks + * contains 0 bit when the destination word is unchanged, 1 when it + * must be replaced by source bits. + * + * mask1 = mask for leading unchanged bytes + * mask2 = mask for trailing unchange bytes + * mask3 = mask indicating the more than one qword is being changed. + */ + mask = one; + mask1 = spu_rlmaskqwbyte(mask, -doffset1); + mask2 = spu_slqwbyte(mask, 16-doffset2); + mask3 = (vec_uchar16)spu_cmpgt(spu_splats((unsigned int)(doffset1 + n)), 15); + + vDst = (vec_uchar16 *)(dest); + + delta = (int)soffset1 - (int)doffset1; + + /* The follow check only works if the SPU addresses are not + * wrapped. No provisions have been made to correct for this + * limitation. + */ + if (((unsigned int)dest - (unsigned int)src) >= (unsigned int)n) { + /* Forward copy. Perform a memcpy. + * + * Handle any leading destination partial quadwords as + * well a very short copy (ie, such that the n characters + * all reside in a single (destination) quadword. + */ + vSrc = (vec_uchar16 *)(src); + vDst = (vec_uchar16 *)(dest); + + /* Handle any leading destination partial quadwords as + * well a very short copy (ie, such that the n characters + * all reside in a single (destination) quadword. + */ + soffset1 = (unsigned int)(src) & 15; + doffset1 = (unsigned int)(dest) & 15; + doffset2 = ((unsigned int)(dest) + n) & 15; + + /* Compute a shuffle pattern used to align the source string + * with the alignment of the destination string. + */ + + adjust = (int)spu_extract(spu_cmpgt(spu_promote(doffset1, 0), spu_promote(soffset1, 0)), 0); + delta = (int)soffset1 - (int)doffset1; + delta += adjust & 16; + + shuffle = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char)delta), + VEC_LITERAL(vec_uint4, 0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + + vSrc += adjust; + + sdata1 = *vSrc++; + sdata2 = *vSrc++; + + ddata = *vDst; + sdata = spu_shuffle(sdata1, sdata2, shuffle); + + /* Construct a series of masks used to data insert. The masks + * contain 0 when the destination word is unchanged, 1 when it + * must be replaced by source bytes. + * + * mask1 = mask for leading unchanged bytes + * mask2 = mask for trailing unchange bytes + * mask3 = mask indicating the more than one qword is being changed. + */ + mask = one; + mask1 = spu_rlmaskqwbyte(mask, -doffset1); + mask2 = spu_slqwbyte(mask, 16-doffset2); + mask3 = (vec_uchar16)spu_cmpgt(spu_splats((unsigned int)(doffset1 + n)), 15); + + *vDst++ = spu_sel(ddata, sdata, spu_and(mask1, spu_or(mask2, mask3))); + + n += doffset1; + + /* Handle complete destination quadwords + */ + while (n > 31) { + sdata1 = sdata2; + sdata2 = *vSrc++; + *vDst++ = spu_shuffle(sdata1, sdata2, shuffle); + n -= 16; + } + + /* Handle any trailing partial (destination) quadwords + */ + mask = spu_and((vec_uchar16)spu_cmpgt(spu_splats((unsigned int)n), 16), mask2); + *vDst = spu_sel(*vDst, spu_shuffle(sdata2, *vSrc, shuffle), mask); + + } else { + /* Backward copy. + * + * Handle any leading destination partial quadwords as + * well a very short copy (ie, such that the n characters + * all reside in a single (destination) quadword. + */ + vSrc = (vec_uchar16 *)((unsigned int)src + n-1); + vDst = (vec_uchar16 *)((unsigned int)dest + n-1); + + /* Handle any leading destination partial quadwords as + * well a very short copy (ie, such that the n characters + * all reside in a single (destination) quadword. + */ + soffset1 = (unsigned int)(src) & 15; + soffset2 = (unsigned int)(vSrc) & 15; + doffset1 = (unsigned int)(dest) & 15; + doffset2 = (unsigned int)(vDst) & 15; + + /* Compute a shuffle pattern used to align the source string + * with the alignment of the destination string. + */ + adjust = (int)spu_extract(spu_cmpgt(spu_promote(soffset2, 0), spu_promote(doffset2, 0)), 0); + delta = (int)doffset2 - (int)soffset2; + delta += adjust & 16; + + shuffle = (vec_uchar16)spu_sub(VEC_LITERAL(vec_uint4, 0x10111213, 0x14151617, 0x18191A1B, 0x1C1D1E1F), + (vec_uint4)spu_splats((unsigned char)delta)); + + vSrc -= adjust; + + sdata2 = *vSrc--; + sdata1 = *vSrc--; + + ddata = *vDst; + sdata = spu_shuffle(sdata1, sdata2, shuffle); + + /* Construct a series of masks used to data insert. The masks + * contain 0 when the destination word is unchanged, 1 when it + * must be replaced by source bytes. + * + * mask1 = mask for leading unchanged bytes + * mask2 = mask for trailing unchange bytes + * mask3 = mask indicating the more than one qword is being changed. + */ + mask = one; + mask1 = spu_rlmaskqwbyte(mask, -doffset1); + mask2 = spu_slqwbyte(mask, 15-doffset2); + mask3 = (vec_uchar16)spu_cmpgt(spu_splats((int)(doffset2 - n)), -2); + + *vDst-- = spu_sel(ddata, sdata, spu_and(mask2, spu_orc(mask1, mask3))); + + n -= doffset2 + 1; + + /* Handle complete destination quadwords + */ + while ((int)n > 15) { + sdata2 = sdata1; + sdata1 = *vSrc--; + *vDst-- = spu_shuffle(sdata1, sdata2, shuffle); + n -= 16; + } + + /* Handle any trailing partial (destination) quadwords + */ + mask = spu_and((vec_uchar16)spu_cmpgt(spu_splats((int)n), 0), mask1); + *vDst = spu_sel(*vDst, spu_shuffle(*vSrc, sdata1, shuffle), mask); + } + return (dest); +} + diff --git a/lib/machine/spu/memmove_ea.c b/lib/machine/spu/memmove_ea.c new file mode 100644 index 0000000..356ab56 --- /dev/null +++ b/lib/machine/spu/memmove_ea.c @@ -0,0 +1,77 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include +#include + +COMPAT_EA_ALIAS (memmove_ea); + +__ea void * +memmove_ea (__ea void *dest, __ea const void *src, size_ea_t n) +{ + __ea void *curr_dest = dest; + __ea void *curr_src; + void *l_dest; + void *l_src; + size_ea_t local_n; + size_ea_t src_n; + size_ea_t dst_n; + + curr_src = (__ea void *) src; + while (n) + { + l_src = __cache_fetch (curr_src); + + /* + * use the smaller of the size left to copy (n), the space left in the + * src cacheline (src_n), or the space left in the destination + * cacheline (dst_n). + */ + src_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_src) - (size_ea_t) curr_src; + dst_n = + ROUND_UP_NEXT_128 ((size_ea_t) curr_dest) - (size_ea_t) curr_dest; + local_n = three_way_min (src_n, dst_n, n); + + l_dest = __cache_fetch_dirty (curr_dest, local_n); + + memmove (l_dest, l_src, local_n); + + /* update values to take into account what we copied */ + curr_src += local_n; + curr_dest += local_n; + n -= local_n; + } + + return dest; +} diff --git a/lib/machine/spu/memset.c b/lib/machine/spu/memset.c new file mode 100644 index 0000000..0b1958d --- /dev/null +++ b/lib/machine/spu/memset.c @@ -0,0 +1,90 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include + +/* Fills the first n bytes of the memory area pointed to by s + * with the constant byte c. Returns a pointer to the memory area s. + */ +void * memset(void *s, int c, size_t n) +{ + int skip, cnt, i; + vec_uchar16 *vs; + vec_uchar16 vc, mask, one = spu_splats((unsigned char)-1); + + vs = (vec_uchar16 *)(s); + vc = spu_splats((unsigned char)c); + cnt = (int)(n); + + /* Handle any leading partial quadwords as well a + * very short settings (ie, such that the n characters + * all reside in a single quadword. + */ + skip = (int)(s) & 15; + if (skip) { + mask = spu_rlmaskqwbyte(one, -skip); + cnt -= 16 - skip; + if (cnt < 0) { + mask = spu_and(mask, spu_slqwbyte(one, (unsigned int)(-cnt))); + } + *vs = spu_sel(*vs, vc, mask); + vs++; + } + + /* Handle 8 quadwords at a time + */ + for (i=127; i 0) { + mask = spu_slqwbyte(one, (unsigned int)(16-cnt)); + *vs = spu_sel(*vs, vc, mask); + } + + return (s); +} diff --git a/lib/machine/spu/memset_ea.c b/lib/machine/spu/memset_ea.c new file mode 100644 index 0000000..1d60273 --- /dev/null +++ b/lib/machine/spu/memset_ea.c @@ -0,0 +1,66 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include +#include "ea_internal.h" +#include +#include "../../string/local.h" + +COMPAT_EA_ALIAS (memset_ea); + +__ea void * +__inhibit_loop_to_libcall +memset_ea (__ea void *dest, int c, size_ea_t n) +{ + __ea void *curr_dest = dest; + void *l_dest; + size_ea_t local_n; + size_ea_t dst_n; + + while (n) + { + dst_n = + ROUND_UP_NEXT_128 ((size_ea_t) curr_dest) - (size_ea_t) curr_dest; + local_n = dst_n < n ? dst_n : n; + + l_dest = __cache_fetch_dirty (curr_dest, local_n); + + memset (l_dest, c, local_n); + + /* update values to take into account what we copied */ + curr_dest += local_n; + n -= local_n; + } + + return dest; +} diff --git a/lib/machine/spu/mk_syscalls b/lib/machine/spu/mk_syscalls new file mode 100644 index 0000000..8ed87e5 --- /dev/null +++ b/lib/machine/spu/mk_syscalls @@ -0,0 +1,101 @@ +#!/usr/bin/perl -w +# +# (C) Copyright 2007 TOSHIBA CORPORATION +# All Rights Reserved +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the names of Toshiba nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +open(DEFS, "syscall.def"); + +while ($line = ) { + next if ($line =~ /^#.*/); + + ($opcode, $name, $fp, $parms) = split(" ", $line); + $filename = ">" . $name . ".S"; + open(SOURCE, $filename); + + print SOURCE "\/\*\n"; + print SOURCE " Copyright (c) 2007, Toshiba Corporation\n\n"; + + print SOURCE " All rights reserved.\n\n"; + + print SOURCE " Redistribution and use in source and binary forms, with or without\n"; + print SOURCE " modification, are permitted provided that the following conditions are met:\n\n"; + + print SOURCE " \* Redistributions of source code must retain the above copyright notice,\n"; + print SOURCE " this list of conditions and the following disclaimer.\n"; + print SOURCE " \* Redistributions in binary form must reproduce the above copyright\n"; + print SOURCE " notice, this list of conditions and the following disclaimer in the\n"; + print SOURCE " documentation and/or other materials provided with the distribution.\n"; + print SOURCE " \* Neither the names of Toshiba nor the names of its\n"; + print SOURCE " contributors may be used to endorse or promote products derived from this\n"; + print SOURCE " software without specific prior written permission.\n\n"; + + print SOURCE " THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n"; + print SOURCE " AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n"; + print SOURCE " IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n"; + print SOURCE " ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n"; + print SOURCE " LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n"; + print SOURCE " CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n"; + print SOURCE " SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n"; + print SOURCE " INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n"; + print SOURCE " CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n"; + print SOURCE " ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n"; + print SOURCE " POSSIBILITY OF SUCH DAMAGE.\n"; + print SOURCE " \*\/\n\n"; + print SOURCE "#include \"c99ppe.h\"\n\n"; + print SOURCE " .text\n"; + print SOURCE " .align 4\n"; + print SOURCE " GLOBL ", $name, "\n"; + print SOURCE " .type ", $name, ", \@function\n"; + print SOURCE $name, ":\n"; + + print SOURCE " stqd \$0, 16(\$sp) \/\* save caller address \*\/\n"; + print SOURCE " il \$2, ", $parms, " \/\* number of fixed arguments \*\/\n"; + print SOURCE " brsl \$0, __stack_reg_va \/\* save register to the stack frame \*\/\n\n"; + + if ($fp > 0) { + print SOURCE " brsl \$0, __check_init\n"; + print SOURCE " lqd \$3, 16\*2(\$sp) \/\* \$3 <- saved FP on the stack frame \*\/\n"; + print SOURCE " lqd \$2, 0(\$3) \/\* FP = fp->_fp \*\/\n"; + print SOURCE " rotqby \$2, \$2, \$3\n"; + print SOURCE " stqd \$2, 16\*2(\$sp) \/\* replace FP on the stack frame \*\/\n\n"; + } + + print SOURCE " il \$3, SPE_C99_SIGNALCODE\n"; + print SOURCE " il \$4, ", $opcode, "\n"; + print SOURCE " ai \$5, \$sp, 16\*2 \/\* data (\$3 save address) \*\/\n"; + print SOURCE " brsl \$0, __send_to_ppe\n\n"; + + print SOURCE " il \$2, 16\*(SPE_STACK_REGS+2+2)\n"; + print SOURCE " a \$sp, \$sp, \$2\n"; + print SOURCE " lqd \$0, 16(\$sp) \/\* load caller address \*\/\n"; + print SOURCE " bi \$0 \/\* return to caller \*\/\n"; + + print SOURCE " .size ", $name, ", .-", $name, "\n"; + + close(SOURCE); +} + diff --git a/lib/machine/spu/mmap_ea.c b/lib/machine/spu/mmap_ea.c new file mode 100644 index 0000000..0b4a5d8 --- /dev/null +++ b/lib/machine/spu/mmap_ea.c @@ -0,0 +1,66 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (mmap_ea); + +__ea void *mmap_ea (__ea void *start, size_ea_t length, int prot, int + flags, int fd, off_t offset) +{ +#ifdef __EA64__ + if (length > 0xffffffffULL) { + errno = ENOMEM; + return MAP_FAILED_EADDR; + } else { + return (__ea void *) mmap_eaddr ((unsigned long long) start, + (size_t) length, prot, flags, fd, offset); + } +#else /* __EA32__ */ + unsigned long long res; + /* + * mmap_eaddr returns 64 bits. For ea32, only the lower 32 bits can be + * returned. + */ + res = mmap_eaddr ((unsigned long long) (unsigned int) start, length, + prot, flags, fd, offset); + if (res != MAP_FAILED_EADDR && res > 0xffffffffULL) { + munmap_eaddr (res, length); + errno = ENOMEM; + res = MAP_FAILED_EADDR; + } + return (__ea void *) (int) res; +#endif +} diff --git a/lib/machine/spu/mremap_ea.c b/lib/machine/spu/mremap_ea.c new file mode 100644 index 0000000..dfd778e --- /dev/null +++ b/lib/machine/spu/mremap_ea.c @@ -0,0 +1,62 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (mremap_ea); + +__ea void * +mremap_ea (__ea void *old_address, size_ea_t old_size, + size_ea_t new_size, unsigned long flags) +{ +#ifdef __EA64__ + return (__ea void *) mremap_eaddr ((unsigned long long) old_address, + old_size, new_size, flags); +#else /* __EA32__ */ + unsigned long long res; + res = mremap_eaddr ((unsigned long long) (unsigned int) old_address, + old_size, new_size, flags); + if (res != MAP_FAILED_EADDR && res > 0xffffffffULL) + { + /* + * We cannot reliably undo the successful remap, so unmap the address. + */ + munmap_eaddr (res, new_size); + errno = ENOMEM; + res = MAP_FAILED_EADDR; + } + return (__ea void *) (int) res; +#endif +} diff --git a/lib/machine/spu/msync_ea.c b/lib/machine/spu/msync_ea.c new file mode 100644 index 0000000..cfb9597 --- /dev/null +++ b/lib/machine/spu/msync_ea.c @@ -0,0 +1,44 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (msync_ea); + +int +msync_ea (__ea void *start, size_ea_t length, int flags) +{ + return msync_eaddr ((unsigned long long) (size_ea_t) start, length, + flags); +} diff --git a/lib/machine/spu/munmap_ea.c b/lib/machine/spu/munmap_ea.c new file mode 100644 index 0000000..7b4f624 --- /dev/null +++ b/lib/machine/spu/munmap_ea.c @@ -0,0 +1,43 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (munmap_ea); + +int +munmap_ea (__ea void *start, size_ea_t length) +{ + return munmap_eaddr ((unsigned long long) (size_ea_t) start, length); +} diff --git a/lib/machine/spu/perror.c b/lib/machine/spu/perror.c new file mode 100644 index 0000000..ec073b2 --- /dev/null +++ b/lib/machine/spu/perror.c @@ -0,0 +1,28 @@ +#include +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +typedef struct +{ + const char* str; + unsigned int pad0[ 3 ]; + int arg_errno; + unsigned int pad1[ 3 ]; +} c99_perror_t; + +void +perror (const char *s) + +{ + c99_perror_t arg; + + arg.str = s; + arg.arg_errno = errno; + __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_PERROR, &arg); + + return; +} +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/posix_memalign_ea.c b/lib/machine/spu/posix_memalign_ea.c new file mode 100644 index 0000000..a1a7361 --- /dev/null +++ b/lib/machine/spu/posix_memalign_ea.c @@ -0,0 +1,66 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +typedef struct +{ + unsigned int memptr; + unsigned int pad0[3]; + unsigned long long align; + unsigned int pad1[2]; + unsigned long long size; + unsigned int pad2[2]; +} memalign_ea_t; + +COMPAT_EA_ALIAS (posix_memalign_ea); + +int +posix_memalign_ea (__ea void **memptr, size_ea_t align, size_ea_t size) +{ + memalign_ea_t arg; + + /* + * Note that memptr is an LS address that will store an EA address. So, + * it fits in 32 bits. + * + * The assist call will store 32 or 64 bits, depending on whether it's + * 32 or 64 bit ppu code. + */ + arg.memptr = (unsigned int) memptr; + arg.align = (unsigned long long) align; + arg.size = (unsigned long long) size; + return __send_to_ppe (JSRE_LIBEA_SIGNALCODE, SPE_LIBEA_POSIX_MEMALIGN, + &arg); +} diff --git a/lib/machine/spu/pread_ea.c b/lib/machine/spu/pread_ea.c new file mode 100644 index 0000000..124afcd --- /dev/null +++ b/lib/machine/spu/pread_ea.c @@ -0,0 +1,59 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include "ea_internal.h" +#include +#include +#include "sys/linux_syscalls.h" + +extern void __cache_flush (void) __attribute__ ((weak)); + +COMPAT_EA_ALIAS (pread_ea); + +ssize_ea_t +pread_ea (int fd, __ea void *buf, size_ea_t count, off_t offset) +{ + struct spu_syscall_block s = { + __NR_pread64, + { + fd, + (size_ea_t) buf, + count, + offset, + 0, + 0} + }; + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + return __linux_syscall (&s); +} diff --git a/lib/machine/spu/printf.S b/lib/machine/spu/printf.S new file mode 100644 index 0000000..d4485c9 --- /dev/null +++ b/lib/machine/spu/printf.S @@ -0,0 +1,51 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL printf + .type printf, @function +printf: + stqd $0, 16($sp) /* save caller address */ + il $2, 1 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VPRINTF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size printf, .-printf diff --git a/lib/machine/spu/putc.c b/lib/machine/spu/putc.c new file mode 100644 index 0000000..dc478d3 --- /dev/null +++ b/lib/machine/spu/putc.c @@ -0,0 +1,63 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int ch; + unsigned int pad0[ 3 ]; + int fp; + unsigned int pad1[ 3 ]; +} c99_putc_t; + +#ifndef _REENT_ONLY + +int +putc (c, fp) + int c; + register FILE *fp; +{ + c99_putc_t args; + + CHECK_INIT(_REENT); + + args.ch = c; + args.fp = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_PUTC, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/putchar.c b/lib/machine/spu/putchar.c new file mode 100644 index 0000000..7da00e0 --- /dev/null +++ b/lib/machine/spu/putchar.c @@ -0,0 +1,18 @@ +#include + +#include "c99ppe.h" + +#undef putchar + +#ifndef _REENT_ONLY + +int +putchar (c) + int c; +{ + /* c gets overwritten before return */ + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_PUTCHAR, &c); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/puts.c b/lib/machine/spu/puts.c new file mode 100644 index 0000000..2f05067 --- /dev/null +++ b/lib/machine/spu/puts.c @@ -0,0 +1,15 @@ +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +int +puts (char const * s) +{ + /* The return value gets written over s + */ + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_PUTS, &s); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/pwrite_ea.c b/lib/machine/spu/pwrite_ea.c new file mode 100644 index 0000000..e08012c --- /dev/null +++ b/lib/machine/spu/pwrite_ea.c @@ -0,0 +1,59 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include "ea_internal.h" +#include +#include +#include "sys/linux_syscalls.h" + +extern void __cache_flush (void) __attribute__ ((weak)); + +COMPAT_EA_ALIAS (pwrite_ea); + +ssize_ea_t +pwrite_ea (int fd, __ea const void *buf, size_ea_t count, off_t offset) +{ + struct spu_syscall_block s = { + __NR_pwrite64, + { + fd, + (size_ea_t) buf, + count, + offset, + 0, + 0} + }; + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + return __linux_syscall (&s); +} diff --git a/lib/machine/spu/read_ea.c b/lib/machine/spu/read_ea.c new file mode 100644 index 0000000..adc72d2 --- /dev/null +++ b/lib/machine/spu/read_ea.c @@ -0,0 +1,59 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include "ea_internal.h" +#include +#include +#include "sys/linux_syscalls.h" + +extern void __cache_flush (void) __attribute__ ((weak)); + +COMPAT_EA_ALIAS (read_ea); + +ssize_ea_t +read_ea (int fd, __ea void *buf, size_ea_t count) +{ + struct spu_syscall_block s = { + __NR_read, + { + fd, + (size_ea_t) buf, + count, + 0, + 0, + 0} + }; + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + return __linux_syscall (&s); +} diff --git a/lib/machine/spu/readv_ea.c b/lib/machine/spu/readv_ea.c new file mode 100644 index 0000000..f8875d9 --- /dev/null +++ b/lib/machine/spu/readv_ea.c @@ -0,0 +1,69 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include "ea_internal.h" +#include +#include +#include "sys/linux_syscalls.h" + +extern void __cache_flush (void) __attribute__ ((weak)); + +COMPAT_EA_ALIAS (readv_ea); + +ssize_ea_t +readv_ea (int fd, struct iovec_ea *vector, int count) +{ +#ifdef __EA32__ + int i; +#endif + struct spu_syscall_block s = { + __NR_readv, + { + fd, + (size_ea_t) (__ea void *) vector, + count, + 0, + 0, + 0} + }; +#ifdef __EA32__ + for (i = 0; i < count; ++i) + { + vector[i].__pad1 = 0x0; /* 32 bit padding */ + vector[i].__pad2 = 0x0; /* 32 bit padding */ + } +#endif + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + return __linux_syscall (&s); +} diff --git a/lib/machine/spu/realloc_ea.c b/lib/machine/spu/realloc_ea.c new file mode 100644 index 0000000..4b7dc87 --- /dev/null +++ b/lib/machine/spu/realloc_ea.c @@ -0,0 +1,55 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include"ea_internal.h" +#include + +typedef struct +{ + unsigned long long ptr; + unsigned int pad0[2]; + unsigned long long size; + unsigned int pad1[2]; +} realloc_ea_t; + +COMPAT_EA_ALIAS (realloc_ea); + +__ea void * +realloc_ea (__ea void *ptr, size_ea_t size) +{ + realloc_ea_t args; + args.ptr = (unsigned long long) (size_ea_t) ptr; + args.size = (unsigned long long) size; + __send_to_ppe (JSRE_LIBEA_SIGNALCODE, SPE_LIBEA_REALLOC, &args); + return ull_to_eavoid (args.ptr); +} diff --git a/lib/machine/spu/remove.c b/lib/machine/spu/remove.c new file mode 100644 index 0000000..1a379de --- /dev/null +++ b/lib/machine/spu/remove.c @@ -0,0 +1,46 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +int +remove (filename) + const char *filename; +{ + + /* The return value gets written over buf + */ + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_REMOVE, &filename); +} + diff --git a/lib/machine/spu/rename.c b/lib/machine/spu/rename.c new file mode 100644 index 0000000..e60355d --- /dev/null +++ b/lib/machine/spu/rename.c @@ -0,0 +1,56 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + const char *old; + unsigned int pad0[ 3 ]; + const char *new; + unsigned int pad1[ 3 ]; +} c99_rename_t; + +int +rename (old, new) + const char *old; + const char *new; +{ + c99_rename_t args; + args.old = old; + args.new = new; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_RENAME, &args); +} diff --git a/lib/machine/spu/rewind.c b/lib/machine/spu/rewind.c new file mode 100644 index 0000000..e075fc7 --- /dev/null +++ b/lib/machine/spu/rewind.c @@ -0,0 +1,53 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +void +rewind (FILE * fp) +{ + int ret; + + CHECK_INIT(_REENT); + + ret = fp->_fp; + + __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_REWIND, &ret); + + return; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/scanf.S b/lib/machine/spu/scanf.S new file mode 100644 index 0000000..0400658 --- /dev/null +++ b/lib/machine/spu/scanf.S @@ -0,0 +1,51 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL scanf + .type scanf, @function +scanf: + stqd $0, 16($sp) /* save caller address */ + il $2, 1 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VSCANF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size scanf, .-scanf diff --git a/lib/machine/spu/setbuf.c b/lib/machine/spu/setbuf.c new file mode 100644 index 0000000..427d5dc --- /dev/null +++ b/lib/machine/spu/setbuf.c @@ -0,0 +1,64 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + char *buf; + unsigned int pad1[ 3 ]; +} c99_setbuf_t; + +#ifndef _REENT_ONLY + +void +setbuf (FILE *__restrict fp, + char *__restrict buf) +{ + c99_setbuf_t args; + + CHECK_INIT(_REENT); + + args.fp = fp->_fp; + args.buf = buf; + + __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_SETBUF, &args); + + return; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/setjmp.S b/lib/machine/spu/setjmp.S new file mode 100644 index 0000000..891806b --- /dev/null +++ b/lib/machine/spu/setjmp.S @@ -0,0 +1,183 @@ +/* +(C) Copyright IBM Corp. 2005, 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Andreas Neukoetter (ti95neuk@de.ibm.com) +*/ + +/* + int setjmp( jmp_buf env ); +*/ + .text + .align 2 + .global setjmp + .type setjmp, @function +setjmp: + stqd $80, 2*16($3) + stqd $81, 3*16($3) + stqd $82, 4*16($3) + stqd $83, 5*16($3) + stqd $84, 6*16($3) + stqd $85, 7*16($3) + stqd $86, 8*16($3) + stqd $87, 9*16($3) + stqd $88, 10*16($3) + stqd $89, 11*16($3) + stqd $90, 12*16($3) + stqd $91, 13*16($3) + stqd $92, 14*16($3) + stqd $93, 15*16($3) + stqd $94, 16*16($3) + stqd $95, 17*16($3) + stqd $96, 18*16($3) + stqd $97, 19*16($3) + stqd $98, 20*16($3) + stqd $99, 21*16($3) + stqd $100, 22*16($3) + stqd $101, 23*16($3) + stqd $102, 24*16($3) + stqd $103, 25*16($3) + stqd $104, 26*16($3) + stqd $105, 27*16($3) + stqd $106, 28*16($3) + stqd $107, 29*16($3) + stqd $108, 30*16($3) + stqd $109, 31*16($3) + stqd $110, 32*16($3) + stqd $111, 33*16($3) + stqd $112, 34*16($3) + stqd $113, 35*16($3) + stqd $114, 36*16($3) + stqd $115, 37*16($3) + stqd $116, 38*16($3) + stqd $117, 39*16($3) + stqd $118, 40*16($3) + stqd $119, 41*16($3) + + hbr setjmp_ret, $0 + lnop # pipe1 bubble added for instruction fetch + + stqd $120, 42*16($3) + stqd $121, 43*16($3) + stqd $122, 44*16($3) + stqd $123, 45*16($3) + stqd $124, 46*16($3) + stqd $125, 47*16($3) + stqd $126, 48*16($3) + stqd $127, 49*16($3) + + stqd $0, 0*16($3) + stqd $1, 1*16($3) + + il $3, 0 + +setjmp_ret: + bi $0 + .size setjmp, .-setjmp + +/* + int longjmp( jmp_buf env, int val ); +*/ + .text + .align 2 + .global longjmp + .type longjmp, @function +longjmp: + lr $127, $1 + + lqd $0, 0*16($3) + lqd $1, 1*16($3) + + sf $126, $127, $1 + rotqbyi $126, $126, 12 + fsmbi $127, 0x0F00 + and $126, $126, $127 + a $1, $1, $126 + + # restore all the non-volatile registers + + lqd $80, 2*16($3) + lqd $81, 3*16($3) + lqd $82, 4*16($3) + lqd $83, 5*16($3) + lqd $84, 6*16($3) + lqd $85, 7*16($3) + lqd $86, 8*16($3) + lqd $87, 9*16($3) + lqd $88, 10*16($3) + lqd $89, 11*16($3) + lqd $90, 12*16($3) + lqd $91, 13*16($3) + lqd $92, 14*16($3) + lqd $93, 15*16($3) + lqd $94, 16*16($3) + lqd $95, 17*16($3) + lqd $96, 18*16($3) + lqd $97, 19*16($3) + lqd $98, 20*16($3) + lqd $99, 21*16($3) + lqd $100, 22*16($3) + lqd $101, 23*16($3) + lqd $102, 24*16($3) + lqd $103, 25*16($3) + lqd $104, 26*16($3) + lqd $105, 27*16($3) + lqd $106, 28*16($3) + lqd $107, 29*16($3) + lqd $108, 30*16($3) + lqd $109, 31*16($3) + + hbr longjmp_ret, $0 + + lqd $110, 32*16($3) + lqd $111, 33*16($3) + lqd $112, 34*16($3) + lqd $113, 35*16($3) + lqd $114, 36*16($3) + lqd $115, 37*16($3) + lqd $116, 38*16($3) + lqd $117, 39*16($3) + lqd $118, 40*16($3) + lqd $119, 41*16($3) + lqd $120, 42*16($3) + lqd $121, 43*16($3) + lqd $122, 44*16($3) + lqd $123, 45*16($3) + lqd $124, 46*16($3) + lqd $125, 47*16($3) + + ceqi $5, $4, 0 + lqd $126, 48*16($3) + lqd $127, 49*16($3) + + sf $3, $5, $4 + +longjmp_ret: + bi $0 + .size longjmp, .-longjmp + diff --git a/lib/machine/spu/setvbuf.c b/lib/machine/spu/setvbuf.c new file mode 100644 index 0000000..91c1cf3 --- /dev/null +++ b/lib/machine/spu/setvbuf.c @@ -0,0 +1,70 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + char *buf; + unsigned int pad1[ 3 ]; + int mode; + unsigned int pad2[ 3 ]; + size_t size; + unsigned int pad3[ 3 ]; +} c99_setvbuf_t; + +#ifndef _REENT_ONLY + +int +setvbuf (FILE * fp, + char *buf, + int mode, + size_t size) +{ + c99_setvbuf_t args; + + CHECK_INIT(_REENT); + + args.fp = fp->_fp; + args.buf = buf; + args.mode = mode; + args.size = size; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_SETVBUF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/siprintf.S b/lib/machine/spu/siprintf.S new file mode 100644 index 0000000..9463501 --- /dev/null +++ b/lib/machine/spu/siprintf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define sprintf siprintf +#include "sprintf.S" diff --git a/lib/machine/spu/siscanf.S b/lib/machine/spu/siscanf.S new file mode 100644 index 0000000..4f8755f --- /dev/null +++ b/lib/machine/spu/siscanf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define sscanf siscanf +#include "sscanf.S" diff --git a/lib/machine/spu/sleep.c b/lib/machine/spu/sleep.c new file mode 100644 index 0000000..f3aa979 --- /dev/null +++ b/lib/machine/spu/sleep.c @@ -0,0 +1,18 @@ +/* Copied from libc/posix/sleep.c, removed the check for HAVE_NANOSLEEP */ + +/* Written 2000 by Werner Almesberger */ + +#include +#include +#include + +unsigned sleep(unsigned seconds) +{ + struct timespec ts; + + ts.tv_sec = seconds; + ts.tv_nsec = 0; + if (!nanosleep(&ts,&ts)) return 0; + if (errno == EINTR) return ts.tv_sec; + return -1; +} diff --git a/lib/machine/spu/sniprintf.S b/lib/machine/spu/sniprintf.S new file mode 100644 index 0000000..e62278e --- /dev/null +++ b/lib/machine/spu/sniprintf.S @@ -0,0 +1,32 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#define snprintf sniprintf +#include "snprintf.S" diff --git a/lib/machine/spu/snprintf.S b/lib/machine/spu/snprintf.S new file mode 100644 index 0000000..17d03e3 --- /dev/null +++ b/lib/machine/spu/snprintf.S @@ -0,0 +1,51 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL snprintf + .type snprintf, @function +snprintf: + stqd $0, 16($sp) /* save caller address */ + il $2, 3 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VSNPRINTF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size snprintf, .-snprintf diff --git a/lib/machine/spu/sprintf.S b/lib/machine/spu/sprintf.S new file mode 100644 index 0000000..9464aed --- /dev/null +++ b/lib/machine/spu/sprintf.S @@ -0,0 +1,51 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL sprintf + .type sprintf, @function +sprintf: + stqd $0, 16($sp) /* save caller address */ + il $2, 2 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VSPRINTF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size sprintf, .-sprintf diff --git a/lib/machine/spu/spu-gmon.c b/lib/machine/spu/spu-gmon.c new file mode 100644 index 0000000..5709bf6 --- /dev/null +++ b/lib/machine/spu/spu-gmon.c @@ -0,0 +1,440 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Magic cookie. */ +#define GMON_MAGIC_COOKIE "gmon" + +/* Version number. */ +#define GMON_VERSION 1 + +/* Fraction of text space to allocate for histogram counters. */ +#define HISTFRACTION 4 + +/* Histogram counter type. */ +#define HISTCOUNTER unsigned short + +/* Fraction of text space to allocate for "from" hash buckets. HASHFRACTION is + based on the minimum number of bytes of separation between two subroutine + call points in the object code. */ +#define HASHFRACTION 4 + +/* Percent of text space to allocate for tostructs with a minimum. */ +#define ARCDENSITY 3 + +/* Minimal amount of arcs. */ +#define MINARCS 50 + +/* Rounding macros. */ +#define ROUNDDOWN(x,y) (((x)/(y))*(y)) +#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) + +/* Sampling rate in Hertz. */ +#define SAMPLE_INTERVAL 100 + +/* Tag definitions for the gmon.out sub headers. */ +#define GMON_TAG_TIME_HIST 0 +#define GMON_TAG_CG_ARC 1 + +struct tostruct +{ + uintptr_t selfpc; + long count; + unsigned short link; +}; + +struct gmon_hdr +{ + char cookie[4]; + int32_t version; + char spare[3 * 4]; +}; + +struct gmon_hist_hdr +{ + uintptr_t low_pc; + uintptr_t high_pc; + int32_t hist_size; + int32_t prof_rate; + char dimen[15]; + char dimen_abbrev; +} __attribute__ ((packed)); + +struct rawarc +{ + uintptr_t raw_frompc; + uintptr_t raw_selfpc; + long raw_count; +} __attribute__ ((packed)); + +/* start and end of the text section */ +extern char _start; +extern char _etext; + +/* EAR entry for the starting address of SPE executable image. */ +extern const unsigned long long _EAR_; +asm (".section .toe,\"a\",@nobits\n\r" + ".align 4\n\r" + ".type _EAR_, @object\n\r" + ".size _EAR_, 16\n" "_EAR_: .space 16\n" ".previous"); + +/* froms are indexing tos */ +static __ea unsigned short *froms; +static __ea struct tostruct *tos = 0; +static long tolimit = 0; +static uintptr_t s_lowpc = 0; +static uintptr_t s_highpc = 0; +static unsigned long s_textsize = 0; + +static int fd; +static int hist_size; +static int timer_id; + +void +__sample (int id) +{ + unsigned int pc; + unsigned int pc_backup; + off_t offset; + unsigned short val; + + if (id != timer_id) + return; + + /* Fetch program counter. */ + pc = spu_read_srr0 () & ~3; + pc_backup = pc; + if (pc < s_lowpc || pc > s_highpc) + return; + pc -= (uintptr_t) & _start; + offset = pc / HISTFRACTION * sizeof (HISTCOUNTER) + sizeof (struct gmon_hdr) + + 1 + sizeof (struct gmon_hist_hdr); + + /* Read, increment and write the counter. */ + if (pread (fd, &val, 2, offset) != 2) + { + perror ("can't read the histogram"); + return; + } + if (val < USHRT_MAX) + ++val; + if (pwrite (fd, &val, 2, offset) != 2) + { + perror ("can't write the histogram"); + } +} + +static void +write_histogram (int fd) +{ + struct gmon_hist_hdr hist_hdr; + u_char tag = GMON_TAG_TIME_HIST; + hist_hdr.low_pc = s_lowpc; + hist_hdr.high_pc = s_highpc; + hist_hdr.hist_size = hist_size / sizeof (HISTCOUNTER); /* Amount of bins. */ + hist_hdr.prof_rate = 100; /* Hertz. */ + strncpy (hist_hdr.dimen, "seconds", sizeof (hist_hdr.dimen)); + hist_hdr.dimen_abbrev = 's'; + struct iovec iov[2] = { + {&tag, sizeof (tag)}, + {&hist_hdr, sizeof (struct gmon_hist_hdr)} + }; + if (writev (fd, iov, 2) != sizeof (struct gmon_hist_hdr) + sizeof (tag)) + perror ("can't write the histogram header"); + + /* Skip the already written histogram data. */ + lseek (fd, hist_size, SEEK_CUR); +} + +static void +write_callgraph (int fd) +{ + int fromindex, endfrom; + uintptr_t frompc; + int toindex; + struct rawarc rawarc; + u_char tag = GMON_TAG_CG_ARC; + endfrom = s_textsize / (HASHFRACTION * sizeof (*froms)); + for (fromindex = 0; fromindex < endfrom; ++fromindex) + { + if (froms[fromindex]) + { + frompc = s_lowpc + (fromindex * HASHFRACTION * sizeof (*froms)); + for (toindex = froms[fromindex]; toindex != 0; + toindex = tos[toindex].link) + { + rawarc.raw_frompc = frompc; + rawarc.raw_selfpc = tos[toindex].selfpc; + rawarc.raw_count = tos[toindex].count; + struct iovec iov[2] = { + {&tag, sizeof (tag)}, + {&rawarc, sizeof (struct rawarc)} + }; + if (writev (fd, iov, 2) != sizeof (tag) + sizeof (struct rawarc)) + perror ("can't write the callgraph"); + } + } + } +} + +void +__mcleanup (void) +{ + struct gmon_hdr ghdr; + + /* Disable sampling. */ + spu_timer_stop (timer_id); + spu_timer_free (timer_id); + spu_clock_stop (); + + /* Jump to the beginning of the gmon.out file. */ + if (lseek (fd, 0, SEEK_SET) == -1) + { + perror ("Cannot seek to the beginning of the gmon.out file."); + close (fd); + return; + } + + /* Write the gmon.out header. */ + memset (&ghdr, '\0', sizeof (struct gmon_hdr)); + memcpy (&ghdr.cookie[0], GMON_MAGIC_COOKIE, sizeof (ghdr.cookie)); + ghdr.version = GMON_VERSION; + if (write (fd, &ghdr, sizeof (struct gmon_hdr)) == -1) + { + perror ("Cannot write the gmon header to the gmon.out file."); + close (fd); + return; + } + + /* Write the sampling buffer (histogram). */ + write_histogram (fd); + + /* Write the call graph. */ + write_callgraph (fd); + + close (fd); +} + +void +__monstartup (unsigned long long spu_id) +{ + char filename[64]; + s_lowpc = + ROUNDDOWN ((uintptr_t) & _start, HISTFRACTION * sizeof (HISTCOUNTER)); + s_highpc = + ROUNDUP ((uintptr_t) & _etext, HISTFRACTION * sizeof (HISTCOUNTER)); + s_textsize = s_highpc - s_lowpc; + + hist_size = s_textsize / HISTFRACTION * sizeof (HISTCOUNTER); + + /* Allocate froms. */ + froms = malloc_ea (s_textsize / HASHFRACTION); + if (froms == NULL) + { + fprintf (stderr, "Cannot allocate ea memory for the froms array.\n"); + return; + } + memset_ea (froms, 0, s_textsize / HASHFRACTION); + + /* Determine tolimit. */ + tolimit = s_textsize * ARCDENSITY / 100; + if (tolimit < MINARCS) + tolimit = MINARCS; + + /* Allocate tos. */ + tos = malloc_ea (tolimit * sizeof (struct tostruct)); + if (tos == NULL) + { + fprintf (stderr, "Cannot allocate ea memory for the tos array.\n"); + return; + } + memset_ea (tos, 0, tolimit * sizeof (struct tostruct)); + + /* Determine the gmon.out file name. */ + if (spu_id) + snprintf (filename, sizeof (filename), "gmon-%d-%llu-%llu.out", + linux_getpid (), spu_id, _EAR_); + else + strncpy (filename, "gmon.out", sizeof (filename)); + /* Open the gmon.out file. */ + fd = open (filename, O_RDWR | O_CREAT | O_TRUNC, 0644); + if (fd == -1) + { + char errstr[128]; + snprintf (errstr, sizeof (errstr), "Cannot open file: %s", filename); + perror (errstr); + return; + } + /* Truncate the file up to the size where the histogram fits in. */ + if (ftruncate (fd, + sizeof (struct gmon_hdr) + 1 + + sizeof (struct gmon_hist_hdr) + hist_size) == -1) + { + char errstr[128]; + snprintf (errstr, sizeof (errstr), "Cannot truncate file: %s", filename); + perror (errstr); + return; + } + + /* Start the histogram sampler. */ + spu_slih_register (MFC_DECREMENTER_EVENT, spu_clock_slih); + timer_id = spu_timer_alloc (spu_timebase () / SAMPLE_INTERVAL, __sample); + spu_clock_start (); + spu_timer_start (timer_id); + + atexit (__mcleanup); +} + +void +__mcount_internal (uintptr_t frompc, uintptr_t selfpc) +{ + /* sefpc: the address of the function just entered. */ + /* frompc: the caller of the function just entered. */ + unsigned int mach_stat; + __ea unsigned short *frompcindex; + unsigned short toindex; + __ea struct tostruct *top; + __ea struct tostruct *prevtop; + + /* Save current state and disable interrupts. */ + mach_stat = spu_readch(SPU_RdMachStat); + spu_idisable (); + + /* Sanity checks. */ + if (frompc < s_lowpc || frompc > s_highpc) + goto done; + frompc -= s_lowpc; + if (frompc > s_textsize) + goto done; + + /* frompc indexes into the froms array the value at that position indexes + into the tos array. */ + frompcindex = &froms[(frompc) / (HASHFRACTION * sizeof (*froms))]; + toindex = *frompcindex; + if (toindex == 0) + { + /* First time traversing this arc link of tos[0] incremented. */ + toindex = ++tos[0].link; + /* Sanity check. */ + if (toindex >= tolimit) + { + --tos[0].link; + goto done; + } + /* Save the index into the froms array for the next time we traverse this arc. */ + *frompcindex = toindex; + top = &tos[toindex]; + /* Sets the address of the function just entered. */ + top->selfpc = selfpc; + top->count = 1; + top->link = 0; + goto done; + } + + /* toindex points to a tostruct */ + top = &tos[toindex]; + if (top->selfpc == selfpc) + { + /* The arc is at front of the chain. This is the most common case. */ + top->count++; + goto done; + } + + /* top->selfpc != selfpc + The pc we have got is not the pc we already stored (i.e. multiple function + calls to the same fuction within a function. The arc is not at front of + the chain. */ + for (;;) + { + if (top->link == 0) + { + /* We are at the end of the chain and selfpc was not found. Thus we create + a new tostruct and link it to the head of the chain. */ + toindex = ++tos[0].link; + /* Sanity check. */ + if (toindex >= tolimit) + { + --tos[0].link; + goto done; + } + top = &tos[toindex]; + top->selfpc = selfpc; + top->count = 1; + /* Link back to the old tos entry. */ + top->link = *frompcindex; + /* Store a link to the new top in the froms array which makes the + current tos head of the chain. */ + *frompcindex = toindex; + goto done; + } + else + { + /* Otherwise check the next arc on the chain. */ + prevtop = top; + top = &tos[top->link]; + if (top->selfpc == selfpc) + { + /* selfpc matches; increment its count. */ + top->count++; + /* Move it to the head of the chain. */ + /* Save previous tos index. */ + toindex = prevtop->link; + /* Link the former to to the current tos. */ + prevtop->link = top->link; + /* Link back to the old tos entry. */ + top->link = *frompcindex; + /* Store a link to the new top in the froms array which makes the + current tos head of the chain. */ + *frompcindex = toindex; + goto done; + } + } + } +done: + /* Enable interrupts if necessary. */ + if (__builtin_expect (mach_stat & 1, 0)) + spu_ienable (); +} diff --git a/lib/machine/spu/spu-mcount.S b/lib/machine/spu/spu-mcount.S new file mode 100644 index 0000000..624dc76 --- /dev/null +++ b/lib/machine/spu/spu-mcount.S @@ -0,0 +1,93 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +/* _mcount extracts the address of the function just entered and the address + of the caller of that function and then calls __mcount_internal. The + prologue calls mcount without saving any registers. The return address is + stored in $75. The _mcount function has to: + - create a new stack frame + - save registers $2 to $75 on the stack + - copy the two addresses ($0 and $75) into the argument registers $3 and $4 + - call __mcount_internal + - restore registers + - return to $75 */ + +/* The following two convenience macros assist in the coding of the + saving and restoring the register. + + saveregs first, last Saves registers from first to the last. + restoreregs first, last Restores registers from last down to first. + + Note: first must be less than or equal to last. */ +.macro saveregs first, last + stqd $\first, \first*16($SP) +.if \last-\first + saveregs "(\first+1)",\last +.endif +.endm + +.macro restoreregs first, last + lqd $\last, \last*16($SP) +.if \last-\first + restoreregs \first,"(\last-1)" +.endif +.endm + +/* _mcount needs to be resident since the overlay manager uses the scratch + registers too. */ +.text + .align 3 /* 8 byte alignment. */ + .global _mcount + .type _mcount, @function + +_mcount: + stqd $lr, 16($sp) /* Save link register in the callers stack frame. */ + stqd $lr, -1216($sp) /* Store back pointer. */ + il $lr, -1216 /* Push a new stack frame. */ + a $sp, $sp, $lr /* Frame size: 16 * (74 + 2) = 1216. */ + + /* Save registers $2 to $75 on the stack. */ + saveregs 2, 75 + + /* Bring the __mcount_internal arguments in place. */ + lqd $3, 1232($sp) /* frompc (the link register). */ + ori $4, $75, 0 /* selfpc (the gcc prologue puts "brsl $75, _mcount" in + front of every function). */ + brsl $lr, __mcount_internal + + /* Restore register $2 to $75 from the stack. */ + restoreregs 2, 75 + + il $lr, 1216 + a $sp, $sp, $lr /* Pop the stack frame. */ + lqd $lr, 16($sp) /* Restore link register. */ + bi $75 /* Branch to the called function. */ diff --git a/lib/machine/spu/spu_clock_stop.c b/lib/machine/spu/spu_clock_stop.c new file mode 100644 index 0000000..da31b42 --- /dev/null +++ b/lib/machine/spu/spu_clock_stop.c @@ -0,0 +1,67 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* SPU clock stop library service. */ +#include +#include "spu_timer_internal.h" + +/* Stops the SPU clock: + * decrements clock start count + * when count is zero, disables the decrementer event and stops the + decrementer + Returns 0 on success and <0 on failure: + * SPU_CLOCK_ERR_NOT_RUNNING - clock was already off + * SPU_CLOCK_ERR_TIMERS_ACTIVE - active timers exist + * SPU_CLOCK_ERR_STILL_RUNNING - start count was decremented but clock was + not stopped */ +int +spu_clock_stop (void) +{ + if (__spu_clock_startcnt == 0) + return SPU_CLOCK_ERR_NOT_RUNNING; + + if (__spu_clock_startcnt == 1 && (__spu_timers_active || __spu_timers_handled)) + return SPU_CLOCK_ERR_TIMERS_ACTIVE; + + /* Don't stop clock if the clock is still in use. */ + if (--__spu_clock_startcnt != 0) + return SPU_CLOCK_ERR_STILL_RUNNING; + + /* Clock stopped, stop decrementer. */ + __disable_spu_decr (); + + /* Clock is enabled on clock start - restore to original state (saved at start). */ + if (__likely (!__spu_clock_state_was_enabled)) + { + spu_idisable (); + } + + return 0; +} diff --git a/lib/machine/spu/spu_clock_svcs.c b/lib/machine/spu/spu_clock_svcs.c new file mode 100644 index 0000000..6cc2af4 --- /dev/null +++ b/lib/machine/spu/spu_clock_svcs.c @@ -0,0 +1,93 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* SPU clock start and read library services. */ +#include +#include "spu_timer_internal.h" + +/* The software managed timebase value. */ +volatile uint64_t __spu_tb_val __attribute__ ((aligned (16))); + +/* Timeout value of the current interval. */ +volatile int __spu_tb_timeout __attribute__ ((aligned (16))); + +/* Clock start count (clock is running if >0). */ +volatile unsigned __spu_clock_startcnt __attribute__ ((aligned (16))); + +/* Saved interrupt state from clock_start. */ +volatile unsigned __spu_clock_state_was_enabled; + +/* Initializes the software managed timebase, enables the decrementer event, + starts the decrementer and enables interrupts. Must be called before + clock or timer services can be used. Should only be called by base app/lib + code (not from an interrupt/timer handler). + Returns with interrupts ENABLED. */ +void +spu_clock_start (void) +{ + /* Increment clock start and return if it was already running. */ + if (++__spu_clock_startcnt > 1) + return; + + __spu_clock_state_was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + + spu_idisable (); + __spu_tb_timeout = CLOCK_START_VALUE; + __spu_tb_val = 0; + + /* Disable, write, enable the decrementer. */ + __enable_spu_decr (__spu_tb_timeout, __disable_spu_decr ()); + + spu_ienable (); + + return; +} + +/* Returns a monotonically increasing, 64-bit counter, in timebase units, + relative to the last call to spu_clock_start(). */ +uint64_t +spu_clock_read (void) +{ + int64_t time; + unsigned was_enabled; + + /* Return 0 if clock is off. */ + if (__spu_clock_startcnt == 0) + return 0LL; + + was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + spu_idisable (); + + time = __spu_tb_val + (__spu_tb_timeout - spu_readch (SPU_RdDec)); + + if (__likely (was_enabled)) + spu_ienable (); + return time; +} diff --git a/lib/machine/spu/spu_timebase.c b/lib/machine/spu/spu_timebase.c new file mode 100644 index 0000000..cb8f34d --- /dev/null +++ b/lib/machine/spu/spu_timebase.c @@ -0,0 +1,51 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include + +/* This function queries /proc/cpuinfo and returns the SPU time base in + Hertz. */ +unsigned int +spu_timebase (void) +{ + FILE *f; + unsigned tb = 0; + char line[64]; + if ((f = fopen ("/proc/cpuinfo", "r"))) + { + while (fgets (line, sizeof (line), f)) + if (sscanf (line, "timebase : %u", &tb)) + break; + fclose (f); + } + return (tb); +} + diff --git a/lib/machine/spu/spu_timer_flih.S b/lib/machine/spu/spu_timer_flih.S new file mode 100644 index 0000000..63f5f07 --- /dev/null +++ b/lib/machine/spu/spu_timer_flih.S @@ -0,0 +1,152 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* First-level interrupt handler. */ + +/* The following two convenience macros assist in the coding of the + saving and restoring the volatile register starting from register + 2 up to register 79. + + saveregs first, last Saves registers from first to the last. + restoreregs first, last Restores registers from last down to first. + + Note: first must be less than or equal to last. */ + +.macro saveregs first, last + stqd $\first, -(STACK_SKIP+\first)*16($SP) +.if \last-\first + saveregs "(\first+1)",\last +.endif +.endm + + +.macro restoreregs first, last + lqd $\last, (82-\last)*16($SP) +.if \last-\first + restoreregs \first,"(\last-1)" +.endif +.endm + + .section .interrupt,"ax" + .align 3 + .type spu_flih, @function +spu_flih: + /* Adjust the stack pointer to skip the maximum register save area + (STACK_SKIP quadword registers) in case an interrupt occurred while + executing a leaf function that used the stack area without actually + allocating its own stack frame. */ + .set STACK_SKIP, 125 + + /* Save the current link register on a new stack frame for the + normal spu_flih() version of this file. */ + stqd $0, -(STACK_SKIP+80)*16($SP) + stqd $SP, -(STACK_SKIP+82)*16($SP) /* Save back chain pointer. */ + + saveregs 2, 39 + + il $2, -(STACK_SKIP+82)*16 /* Stack frame size. */ + rdch $3, $SPU_RdEventStat /* Read event status. */ + + rdch $6, $SPU_RdEventMask /* Read event mask. */ + hbrp /* Open a slot for instruction prefetch. */ + + saveregs 40,59 + + clz $4, $3 /* Get first slih index. */ + stqd $6, -(STACK_SKIP+1)*16($SP) /* Save event mask on stack. */ + + saveregs 60, 67 + + /* Do not disable/ack the decrementer event here. + The timer library manages this and expects it + to be enabled upon entry to the SLIH. */ + il $7, 0x20 + andc $5, $3, $7 + andc $7, $6, $5 /* Clear event bits. */ + saveregs 68, 69 + + wrch $SPU_WrEventAck, $3 /* Ack events(s) - include decrementer event. */ + wrch $SPU_WrEventMask, $7 /* Disable event(s) - exclude decrementer event. */ + + saveregs 70, 79 + + a $SP, $SP, $2 /* Instantiate flih stack frame. */ +next_event: + /* Fetch and dispatch the event handler for the first non-zero event. The + dispatch handler is indexed into the __spu_slih_handlers array using the + count of zero off the event status as an index. */ + ila $5, __spu_slih_handlers /* Slih array offset. */ + + shli $4, $4, 2 /* Slih entry offset. */ + lqx $5, $4, $5 /* Load slih address. */ + rotqby $5, $5, $4 /* Rotate to word 0. */ + bisl $0, $5 /* Branch to slih. */ + + clz $4, $3 /* Get next slih index. */ + brnz $3, next_event + + + lqd $2, 81*16($SP) /* Read event mask from stack. */ + + restoreregs 40, 79 + + wrch $SPU_WrEventMask, $2 /* Restore event mask. */ + hbrp /* Open a slot for instruction pre-fetch. */ + + restoreregs 2, 39 + + /* Restore the link register from the new stack frame for the + normal spu_flih() version of this file. */ + lqd $0, 2*16($SP) + + lqd $SP, 0*16($SP) /* restore stack pointer from back chain ptr. */ + + irete /* Return from interrupt and re-enable interrupts. */ + .size spu_flih, .-spu_flih +/* spu_slih_handlers[] + Here we initialize 33 default event handlers. The first entry in this array + corresponds to the event handler for the event associated with bit 0 of + Channel 0 (External Event Status). The 32nd entry in this array corresponds + to bit 31 of Channel 0 (DMA Tag Status Update Event). The 33rd entry in + this array is a special case entry to handle "phantom events" which occur + when the channel count for Channel 0 is 1, causing an asynchronous SPU + interrupt, but the value returned for a read of Channel 0 is 0. The index + calculated into this array by spu_flih() for this case is 32, hence the + 33rd entry. */ +.data + .align 4 + .extern __spu_default_slih + .global __spu_slih_handlers + .type __spu_slih_handlers, @object +__spu_slih_handlers: + .rept 33 + .long __spu_default_slih + .endr + .size __spu_slih_handlers, .-__spu_slih_handlers diff --git a/lib/machine/spu/spu_timer_free.c b/lib/machine/spu/spu_timer_free.c new file mode 100644 index 0000000..9fb3e0c --- /dev/null +++ b/lib/machine/spu/spu_timer_free.c @@ -0,0 +1,86 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* SPU timer free library service. */ +#include +#include "spu_timer_internal.h" + + +/* Frees an allocated timer. The timer must be in the stopped state for this + to succeed. Maybe be called: + * after allocated, before it's started + * after it's been explicitly stopped + Returns 0 on success, timer sucessfully deallocated. Returns <0 on failure + * SPU_TIMER_INVALID_ID - id out of range + * SPU_TIMER_ERR_FREE - id in free state + * SPU_TIMER_ERR_ACTIVE - id in handled or active state */ +int +spu_timer_free (int id) +{ + spu_timer_t *t, **pn; + unsigned was_enabled; + + if (id < 0 || id >= SPU_TIMER_NTIMERS) + return SPU_TIMER_ERR_INVALID_ID; + + if (__spu_timers[id].state == SPU_TIMER_STOPPED) + { + + was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + spu_idisable (); + + t = __spu_timers_stopped; + pn = &__spu_timers_stopped; + + while (t && (t->id != id)) + { + pn = &t->next; + t = t->next; + } +#ifdef SPU_TIMER_DEBUG + if (!t) + ABORT (); +#endif + *pn = t->next; + + /* Add timer back to free list (mask). */ + __spu_timers_avail |= (1 << (id)); + __spu_timers[id].state = SPU_TIMER_FREE; + + if (__likely (was_enabled)) + spu_ienable (); + + return 0; + } + + /* Handle invalid states. */ + return (__spu_timers[id].state == SPU_TIMER_FREE) ? + SPU_TIMER_ERR_FREE : SPU_TIMER_ERR_ACTIVE; +} diff --git a/lib/machine/spu/spu_timer_internal.h b/lib/machine/spu/spu_timer_internal.h new file mode 100644 index 0000000..132235a --- /dev/null +++ b/lib/machine/spu/spu_timer_internal.h @@ -0,0 +1,140 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* Internal definitions for SPU timer library. */ +#ifndef _SPU_TIMER_INTERNAL_H_ +#define _SPU_TIMER_INTERNAL_H_ + +#include +#include +#include +#include + +#ifdef SPU_TIMER_DEBUG +#include +#include +#endif + +/* The timer state tells which list its on. */ +typedef enum spu_timer_state +{ + SPU_TIMER_FREE = 0, + SPU_TIMER_ACTIVE = 1, + SPU_TIMER_HANDLED = 2, + SPU_TIMER_STOPPED = 3 +} spu_timer_state_t; + +typedef struct spu_timer +{ + int tmout __attribute__ ((__aligned__ (16))); /* Time until expiration (tb). */ + int intvl __attribute__ ((__aligned__ (16))); /* Interval. */ + int id __attribute__ ((__aligned__ (16))); + spu_timer_state_t state __attribute__ ((__aligned__ (16))); + void (*func) (int) __attribute__ ((__aligned__ (16))); /* Handler. */ + struct spu_timer *next __attribute__ ((__aligned__ (16))); +} spu_timer_t; + + +/* Max decrementer value. */ +#define DECR_MAX 0xFFFFFFFFU + + /* Arbitrary non-triggering value. */ +#define CLOCK_START_VALUE 0x7FFFFFFF + +#define MIN_INTVL 1 +#define MAX_INTVL INT_MAX + +/* Timers within 15 tics will expire together. */ +#define TIMER_INTERVAL_WINDOW 15 + +/* Disables the decrementer and returns the saved event mask for a subsequent + call to __enable_spu_decr. The decrementer interrupt is acknowledged in the + flih when the event is received, but is required also as part of the + procedure to stop the decrementer. */ +static inline unsigned +__disable_spu_decr (void) +{ + unsigned mask = spu_readch (SPU_RdEventMask); + spu_writech (SPU_WrEventMask, mask & ~MFC_DECREMENTER_EVENT); + spu_writech (SPU_WrEventAck, MFC_DECREMENTER_EVENT); + spu_sync_c (); + return mask; +} + +/* Writes and enables the decrementer, along with the given event mask. */ +static inline void +__enable_spu_decr (int val, unsigned mask) +{ + spu_writech (SPU_WrDec, (val)); + spu_writech (SPU_WrEventMask, mask | MFC_DECREMENTER_EVENT); + spu_sync_c (); +} + +/* These are shared between modules but are not inlined, to save space. */ +extern void __spu_timer_start (int id, int reset); +extern void __reset_spu_decr (int val); + +/* The timers. */ +extern spu_timer_t __spu_timers[]; + +/* Active timer list. */ +extern spu_timer_t *__spu_timers_active; + +/* Stopped (allocated) timer list. */ +extern spu_timer_t *__spu_timers_stopped; + +/* List of timers being handled. */ +extern spu_timer_t *__spu_timers_handled; + +/* Bitmask of available timers. */ +extern unsigned __spu_timers_avail; + +/* The software managed timebase value. */ +extern volatile uint64_t __spu_tb_val; + +/* Timeout value of the current interval. */ +extern volatile int __spu_tb_timeout; + +/* Clock start count (clock is running if >0). */ +extern volatile unsigned __spu_clock_startcnt; + +/* Saved interrupt state from clock_start. */ +extern volatile unsigned __spu_clock_state_was_enabled; + +#define __likely(_c) __builtin_expect((_c), 1) +#define __unlikely(_c) __builtin_expect((_c), 0) + +#define ABORT() \ +{\ + fprintf(stderr, "Internal error, aborting: %s:%d\n", __FILE__, __LINE__);\ + assert(0);\ +} + +#endif diff --git a/lib/machine/spu/spu_timer_slih.c b/lib/machine/spu/spu_timer_slih.c new file mode 100644 index 0000000..8b54b13 --- /dev/null +++ b/lib/machine/spu/spu_timer_slih.c @@ -0,0 +1,221 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* Second Level Interrupt handler and related services for SPU timers. */ +#include "spu_timer_internal.h" +/* Resets decrementer to the specified value. Also updates software timebase + to account for the time between the last decrementer reset and now. There + are two cases: + * Called by application to start a new timer. + * Called by spu_clock to active the next timer. + In both cases, the amount of time is the current interval timeout minus the + current decrementer value. */ +void +__reset_spu_decr (int val) +{ + + /* The interrupt occurs when the msb goes from 0 to 1 or when the decrementer + goes from 0 to -1. To be precisely accurate we should set the timer to + the intverval -1, unless the interval passed in is 0 in which case it + should be left at 0. */ + int enable_val = (__likely (val)) ? val - 1 : 0; + + /* Decrementer must be stopped before writing it - minimize the time + stopped. */ + unsigned mask = __disable_spu_decr (); + + /* Perform tb correction before resettting the decrementer. the corrected + value is the current timeout value minus the current decrementer value. + Occasionally the read returns 0 - a second read will clear this + condition. */ + spu_readch (SPU_RdDec); + int decval = spu_readch (SPU_RdDec); + /* Restart decrementer with next timeout val. */ + __enable_spu_decr (enable_val, mask); + + /* Update the timebase values before enabling for interrupts. */ + __spu_tb_val += __spu_tb_timeout - decval; + __spu_tb_timeout = enable_val; +} + +/* Update software timebase and timeout value for the 'next to expire' timer. + Called when starting a new timer so the timer list will have timeouts + relative to the current time. */ +static inline void +__update_spu_tb_val (void) +{ + int elapsed = __spu_tb_timeout - spu_readch (SPU_RdDec); +#ifdef SPU_TIMER_DEBUG + if (elapsed < 0) + ABORT (); +#endif + __spu_tb_val += elapsed; + + /* Adjust the timeout for the timer next to expire. Note this could cause + the timeout to go negative, if it was just about to expire when we called + spu_timer_start. This is OK, since this can happen any time interrupts + are disabled. We just schedule an immediate timeout in this case. */ + if (__spu_timers_active) + { + __spu_timers_active->tmout -= elapsed; + if (__spu_timers_active->tmout < 0) + __spu_timers_active->tmout = 0; + } +} + +/* Add an allocated timer to the active list. The active list is sorted by + timeout value. The timer at the head of the list is the timer that will + expire next. The rest of the timers have a timeout value that is relative + to the timer ahead of it on the list. This relative value is determined + here, when the timer is added to the active list. When its position in the + list is found, the timer's timeout value is set to its interval minus the + sum of all the timeout values ahead of it. The timeout value for the timer + following the newly added timer is then adjusted to a new relative value. If + the newly added timer is at the head of the list, the decrementer is reset. + This function is called by SLIH to restart multiple timers (reset == 0) or + by spu_timer_start() to start a single timer (reset == 1). */ +void +__spu_timer_start (int id, int reset) +{ + spu_timer_t *t; + spu_timer_t **pn; + spu_timer_t *start = &__spu_timers[id]; + unsigned tmout_time = 0; + unsigned my_intvl = start->intvl; + unsigned was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + + spu_idisable (); + + t = __spu_timers_active; + pn = &__spu_timers_active; + + /* If the active list is empty, just add the timer with the timeout set to + the interval. Otherwise find the place in the list for the timer, setting + its timeout to its interval minus the sum of timeouts ahead of it. */ + start->state = SPU_TIMER_ACTIVE; + if (__likely (!t)) + { + __spu_timers_active = start; + start->next = NULL; + start->tmout = my_intvl; + } + else + { + + /* Update swtb and timeout val of the next timer, so all times are + relative to now. */ + if (reset) + __update_spu_tb_val (); + + while (t && (my_intvl >= (tmout_time + t->tmout))) + { + tmout_time += t->tmout; + pn = &t->next;; + t = t->next; + } + start->next = t; + start->tmout = my_intvl - tmout_time; + *pn = start; + + /* Adjust timeout for timer after us. */ + if (t) + t->tmout -= start->tmout; + } + + if (reset && (__spu_timers_active == start)) + __reset_spu_decr (__spu_timers_active->tmout); + + if (__unlikely (was_enabled)) + spu_ienable (); +} + +/* SLIH for decrementer. Manages software timebase and timers. + Called by SPU FLIH. Assumes decrementer is still running + (event not yet acknowledeged). */ +unsigned int +spu_clock_slih (unsigned status) +{ + int decr_reset_val; + spu_timer_t *active, *handled; + unsigned was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + + status &= ~MFC_DECREMENTER_EVENT; + + spu_idisable (); + + /* The decrementer has now expired. The decrementer event was acknowledged + in the FLIH but not disabled. The decrementer will continue to run while + we're running the clock/timer handler. The software clock keeps running, + and accounts for all the time spent running handlers. Add the current + timeout to the software timebase and set the timeout to DECR_MAX. This + allows the "clock read" code to continue to work while we're in here, and + gives us the most possible time to finish before another underflow. */ + __spu_tb_val += __spu_tb_timeout; + __spu_tb_timeout = DECR_MAX; + + /* For all timers that have the current timeout value, move them from the + active list to the handled list and call their handlers. Note that the + handled/stopped lists may be manipulated by the handlers if they wish to + stop/free the timers. Note that only the first expired timer will reflect + the real timeout value; the rest of the timers that had the same timeout + value will have a relative value of zero. */ + if (__spu_timers_active) + { + __spu_timers_active->tmout = 0; + while ((active = __spu_timers_active) + && (active->tmout <= TIMER_INTERVAL_WINDOW)) + { + __spu_timers_active = active->next; + active->next = __spu_timers_handled; + __spu_timers_handled = active; + active->state = SPU_TIMER_HANDLED; + (*active->func) (active->id); + } + } + + /* put the handled timers back on the list and restart decrementer. */ + while ((handled = __spu_timers_handled) != NULL) + { + __spu_timers_handled = handled->next; + __spu_timer_start (handled->id, 0); + } + + /* Reset the decrementer before returning. If we have any active timers, we + set it to the timeout value for the timer at the head of the list, else + the default clock value. */ + decr_reset_val = __spu_timers_active ? __spu_timers_active->tmout : CLOCK_START_VALUE; + + __reset_spu_decr (decr_reset_val); + + if (__likely (was_enabled)) + spu_ienable (); + + return status; +} diff --git a/lib/machine/spu/spu_timer_slih_reg.c b/lib/machine/spu/spu_timer_slih_reg.c new file mode 100644 index 0000000..cd1e86f --- /dev/null +++ b/lib/machine/spu/spu_timer_slih_reg.c @@ -0,0 +1,72 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + + +/* Services for SLIH registration. */ +#include +#include + +#define SPU_EVENT_ID(_mask) \ + (spu_extract(spu_cntlz(spu_promote(_mask, 0)), 0)) +typedef unsigned (*spu_slih_t) (unsigned); + +extern spu_slih_t __spu_slih_handlers[]; + +/* This function is called whenever an event occurs for which no second level + event handler was registered. The default event handler does nothing and + zeros the most significant event bit indicating that the event was processed + (when in reality, it was discarded). */ +unsigned +__spu_default_slih (unsigned events) +{ + unsigned int mse; + + mse = 0x80000000 >> SPU_EVENT_ID (events); + events &= ~mse; + + return (events); +} + +/* Registers a SPU second level interrupt handler for the events specified by + mask. The event mask consists of a set of bits corresponding to the event + status bits (see channel 0 description). A mask containing multiple 1 bits + will set the second level event handler for each of the events. */ +void +spu_slih_register (unsigned mask, spu_slih_t func) +{ + unsigned int id; + + while (mask) + { + id = SPU_EVENT_ID (mask); + __spu_slih_handlers[id] = (func) ? func : __spu_default_slih; + mask &= ~(0x80000000 >> id); + } +} diff --git a/lib/machine/spu/spu_timer_stop.c b/lib/machine/spu/spu_timer_stop.c new file mode 100644 index 0000000..94286c9 --- /dev/null +++ b/lib/machine/spu/spu_timer_stop.c @@ -0,0 +1,101 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* SPU timer stop library service. */ +#include +#include "spu_timer_internal.h" + +/* Stop a timer. Moves it from either the active or handled list to the + stopped list. Returns 0 on sucess, timer was successfully stopped. + Returns <0 - Failure: + * SPU_TIMER_ERR_NOT_ACTIVE - timer was not active + * SPU_TIMER_ERR_INVALID_ID - invalid timer id + * SPU_TIMER_ERR_NOCLOCK - spu clock is not running */ +int +spu_timer_stop (int id) +{ + spu_timer_t *t, **pn; + unsigned was_enabled; + + if (id < 0 || id >= SPU_TIMER_NTIMERS) + return SPU_TIMER_ERR_INVALID_ID; + + if (__spu_clock_startcnt == 0) + return SPU_TIMER_ERR_NOCLOCK; + + + /* Free or stopped states. */ + if (__spu_timers[id].state == SPU_TIMER_ACTIVE || + __spu_timers[id].state == SPU_TIMER_HANDLED) + { + was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + spu_idisable (); + + /* Timer is on either active list or handled list. */ + t = (__spu_timers[id].state == SPU_TIMER_ACTIVE) + ? __spu_timers_active : __spu_timers_handled; + + pn = (__spu_timers[id].state == SPU_TIMER_ACTIVE) + ? &__spu_timers_active : &__spu_timers_handled; + + while (t && t->id != id) + { + pn = &t->next; + t = t->next; + } +#ifdef SPU_TIMER_DEBUG + if (!t) + ABORT (); /* Internal error. */ +#endif + /* Fix timeout of next timer and decrementer if we were at the head of + the active list. */ + if (t->next) + { + t->next->tmout += t->tmout; + if (__spu_timers_active == t) + __reset_spu_decr (t->next->tmout); + } + else + __reset_spu_decr (CLOCK_START_VALUE); + + *pn = t->next; /* Update this elements to pointer. */ + t->next = __spu_timers_stopped; + __spu_timers_stopped = t; + + __spu_timers[id].state = SPU_TIMER_STOPPED; + + if (__likely (was_enabled)) + spu_ienable (); + + return 0; + } + + return SPU_TIMER_ERR_NOT_ACTIVE; +} diff --git a/lib/machine/spu/spu_timer_svcs.c b/lib/machine/spu/spu_timer_svcs.c new file mode 100644 index 0000000..8e7013c --- /dev/null +++ b/lib/machine/spu/spu_timer_svcs.c @@ -0,0 +1,115 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +/* SPU timer start and alloc library services. */ +#include +#include "spu_timer_internal.h" + +/* The timers. */ +spu_timer_t __spu_timers[SPU_TIMER_NTIMERS] __attribute__ ((aligned (16))); + +/* Active timer list. */ +spu_timer_t *__spu_timers_active; + +/* Stopped (allocated) timer list. */ +spu_timer_t *__spu_timers_stopped; + +/* List of timers being handled. */ +spu_timer_t *__spu_timers_handled; + +/* Bitmask of available timers. */ +unsigned __spu_timers_avail = + ((1 << (SPU_TIMER_NTIMERS - 1)) + ((1 << (SPU_TIMER_NTIMERS - 1)) - 1)); + +/* Allocates an SPU interval timer and returns the timer ID. Must be called + before starting a timer. interval specifies the expiration interval in + timebase units. func specifies the function pointer to expiration handler. + Returns the timer ID on success or <0 on Failure: + * SPU_TIMER_ERR_NONE_FREE - no free timers to allocate + * SPU_TIMER_ERR_INVALID_PARM - invalid parm */ +int +spu_timer_alloc (int interval, void (*func) (int)) +{ + unsigned was_enabled; + int id; + if (interval < MIN_INTVL || interval > MAX_INTVL || func == NULL) + return SPU_TIMER_ERR_INVALID_PARM; + + was_enabled = spu_readch (SPU_RdMachStat) & 0x1; + + /* Get id of next available timer. */ + id = spu_extract ((spu_sub ((unsigned) 31, + spu_cntlz (spu_promote + (__spu_timers_avail, 0)))), 0); + + /* No timers avail. */ + if (id == -1) + return SPU_TIMER_ERR_NONE_FREE; + + /* Higher order bits represent lower timer ids. */ + __spu_timers_avail &= ~(1 << (id)); + id = (SPU_TIMER_NTIMERS - 1) - id; + + /* Initialize timer and put it on stopped list. */ + (__spu_timers + id)->func = func; + (__spu_timers + id)->intvl = interval; + (__spu_timers + id)->id = id; + (__spu_timers + id)->state = SPU_TIMER_STOPPED; + + spu_idisable (); + (__spu_timers + id)->next = __spu_timers_stopped; + __spu_timers_stopped = &__spu_timers[id]; + + if (__likely (was_enabled)) + spu_ienable (); + return id; +} + +/* External interface for starting a timer. See description of + __spu_timer_start(). Returns 0 on success and <0 on failure: + * SPU_TIMER_ERR_INVALID_ID - invalid id + * SPU_TIMER_ERR_NOCLOCK - clock is off + * SPU_TIMER_ERR_NOT_STOPPED - timer not in stopped state */ +int +spu_timer_start (int id) +{ + if (id < 0 || id >= SPU_TIMER_NTIMERS) + return SPU_TIMER_ERR_INVALID_ID; + + if (__spu_clock_startcnt == 0) + return SPU_TIMER_ERR_NOCLOCK; + + if (__spu_timers[id].state != SPU_TIMER_STOPPED) + return SPU_TIMER_ERR_NOT_STOPPED; + + __spu_timer_start (id, 1); + + return 0; +} diff --git a/lib/machine/spu/sscanf.S b/lib/machine/spu/sscanf.S new file mode 100644 index 0000000..a3dbb01 --- /dev/null +++ b/lib/machine/spu/sscanf.S @@ -0,0 +1,51 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#include "c99ppe.h" + + .text + .align 4 + GLOBL sscanf + .type sscanf, @function +sscanf: + stqd $0, 16($sp) /* save caller address */ + il $2, 2 /* number of fixed arguments */ + brsl $0, __stack_reg_va /* save register to the stack frame */ + + il $3, SPE_C99_SIGNALCODE + il $4, SPE_C99_VSSCANF + ai $5, $sp, 16*2 /* data ($3 save address) */ + brsl $0, __send_to_ppe + + il $2, 16*(SPE_STACK_REGS+2+2) + a $sp, $sp, $2 + lqd $0, 16($sp) /* load caller address */ + bi $0 /* return to caller */ + .size sscanf, .-sscanf diff --git a/lib/machine/spu/stack_reg_va.S b/lib/machine/spu/stack_reg_va.S new file mode 100644 index 0000000..754e4e6 --- /dev/null +++ b/lib/machine/spu/stack_reg_va.S @@ -0,0 +1,170 @@ +/* + Copyright (c) 2007, Toshiba Corporation + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of Toshiba nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ +/* + * This file contains code use to construct a PIC, spu side, syscall + * function with variable parameters in accordance with the CBE ABI. + * + * This function is equivalent to constructing a va_list structure and + * calling the va_list form of the function. Therefore, for example, + * a printf function stack frame will look like this: + * + * | Stack | high memory + * | Parms | + * | | + * |------------| + * | Link Reg | + * |------------| + * | Back Chain |<-----. <---- input SP + * |------------| | + * | Reg 74 | | + * |------------| | + * | Reg 73 | | + * |------------| | + * // ... // | + * |------------| | + * | Reg 5 | | + * |------------| | + * | Reg 4 |<--. | + * |------------| | | + * va_list.| call_stack |------' + * |------------| | + * va_list.| next_arg |---' + * |------------| + * | format (r3)| <---- start of parameters + * |------------| |------------| + * | stack | | | + * | code | |(Back Chain)| <---- output SP + * | 1-3 qwords | <---- code_ptr `------------' + * `------------' + * low memory + * + * This was written in assembly so that it is smaller than what would + * be produced by using va_start. + */ + +#include "c99ppe.h" + +#define parms $2 /* Number of fixed arguments */ + +#define offset $67 +#define flag $68 +#define regdec $69 +#define link $70 + +#define code_ptr $71 +#define ptr $72 +#define inst $73 +#define tmp $74 + + .text + .global __stack_reg_va + .type __stack_reg_va, @function + +__stack_reg_va: + + /* Save registers 69-74 explicitly so that we have some + * working registers. + */ + stqd $74, 16*(-1)($sp) + stqd $73, 16*(-2)($sp) + stqd $72, 16*(-3)($sp) + stqd $71, 16*(-4)($sp) + stqd $70, 16*(-5)($sp) + stqd $69, 16*(-6)($sp) + + /* Construct self-modifying stack code that saves the remaining + * volatile registers onto the stack. + */ + il regdec, -1 /* for decrement register value in save instruction */ + shlqbyi regdec, regdec, 12 + il tmp, -(SPE_STACK_REGS+2+3)*16 + a code_ptr, $sp, tmp + lqr tmp, save_regs_1 /* store stack code */ + stqd tmp, 0(code_ptr) + lqr inst, save_regs_2 + ai ptr, $sp, 16*(-6) + sync + bisl link, code_ptr /* branch to the constructed stack code */ + + /* Adjust pointer so that it points to the first variable + * argument on the stack. + */ + ai offset, parms, -1 /* offset = parms - 1 */ + mpyi offset, offset, 16 /* offset = offset * 16 */ + a ptr, ptr, offset /* ptr = ptr + offset */ + + /* Store the va_list to the parameter list. + */ + stqd $sp, 16*(-1)(ptr) + stqd ptr, 16*(-2)(ptr) + + /* Make $3 store address. + */ + ai offset, parms, 2 /* offset = parms + 2 */ + mpyi offset, offset, -16 /* offset = offset * -16 */ + a ptr, ptr, offset /* ptr = ptr + offset */ + + /* Save all the fixed (non-variable arguments on the stack) + */ + ceqi flag, parms, 0x01 /* if(parms==1) flag=0xFFFFFFFF */ + brnz flag, reg_3 /* if(flag!=0) jump */ + ceqi flag, parms, 0x02 /* if(parms==2) flag=0xFFFFFFFF */ + brnz flag, reg_4 /* if(flag!=0) jump */ + stqd $5, 16*2(ptr) +reg_4: + stqd $4, 16*1(ptr) +reg_3: + stqd $3, 0(ptr) + + il $3, -16*(SPE_STACK_REGS+2+2) + stqx $sp, $3, $sp /* save back chain */ + a $sp, $sp, $3 + bi $0 /* return to caller */ + +/***************************** stack code *********************************************/ + + /* The following code is copied into the stack for re-entract, + * self-modified, code execution. This code copies the volatile + * registers into a va_list parameter array. + */ + .balignl 16, 0 +save_regs_1: + stqd inst, 16(code_ptr) /* store instruction */ + sync + a inst, inst, regdec /* decrement register number in the instruction */ + ceqbi tmp, inst, 3 /* if (reg-num == 3) tmp = 0x000000FF 000..0 */ +save_regs_2: + stqd $68, -16(ptr) + ai ptr, ptr, -16 + brz tmp, save_regs_1 /* if (tmp == 0) jump */ + bi link /* finish to make va_list */ + + .size __stack_reg_va, .-__stack_reg_va + diff --git a/lib/machine/spu/stdio.c b/lib/machine/spu/stdio.c new file mode 100644 index 0000000..fd45b00 --- /dev/null +++ b/lib/machine/spu/stdio.c @@ -0,0 +1,84 @@ +/* +Copyright (C) 2007 Sony Computer Entertainment Inc. +Copyright 2007 Sony Corp. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Kazunori Asayama +*/ + +#include + +#include "c99ppe.h" + + +static FILE __fp[SPE_FOPEN_MAX]; + +FILE * +__sfp (struct _reent *d) +{ + int i; + for (i = 0; i < SPE_FOPEN_MAX; i++) { + if (!__fp[i]._fp) { + return &__fp[i]; + } + } + _REENT_ERRNO(d) = EMFILE; + return NULL; +} + +static void +__cleanup (struct _reent *s) +{ + int i; + for (i = 0; i < SPE_FOPEN_MAX; i++) { + if (__fp[i]._fp) { + fclose(&__fp[i]); + } + } +} + +void +__sinit (struct _reent *s) +{ + _REENT_CLEANUP(s) = __cleanup; + + _REENT_STDIN(s) = &s->__sf[0]; + _REENT_STDIN(s)->_fp = SPE_STDIN; + + _REENT_STDOUT(s) = &s->__sf[1]; + _REENT_STDOUT(s)->_fp = SPE_STDOUT; + + _REENT_STDERR(s) = &s->__sf[2]; + _REENT_STDERR(s)->_fp = SPE_STDERR; +} + +void +__check_init (void) +{ + CHECK_INIT(_REENT); +} diff --git a/lib/machine/spu/straddr.h b/lib/machine/spu/straddr.h new file mode 100644 index 0000000..3de594d --- /dev/null +++ b/lib/machine/spu/straddr.h @@ -0,0 +1,75 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include "vec_literal.h" + +/* + * Supply the inline _straddr for use by strncpy and strncat. +* +* _straddr: search the string s, and return the address of the first byte +* containing zero. +*/ +static inline char *_straddr(const char *s) +{ + unsigned int cnt, cmp, skip, mask; + vec_uchar16 *ptr, data; + + /* + * Compensate for unaligned strings. + */ + ptr = (vec_uchar16 *)s; /* implicit (s & ~0xf) */ + skip = (unsigned int)(ptr) & 0xf; + /* + * skip the first skip bytes starting at (s & ~0xf). + */ + mask = 0xFFFF >> skip; + + data = *ptr; + cmp = spu_extract(spu_gather(spu_cmpeq(data, 0)), 0); + cmp &= mask; + + cnt = spu_extract(spu_cntlz(spu_promote(cmp, 0)), 0); + + while (cnt == 32) { + data = *++ptr; + cnt = spu_extract(spu_cntlz(spu_gather(spu_cmpeq(data, 0))), 0); + /* + * The first 16 bits for gather on a byte vector are zero, so if cnt + * is 32, none of the 16 bytes in data was zero. And, there are (cnt - + * 16) non-zero bytes in data. + */ + } + /* + * The first non-zero byte is at ptr aligned down plus the number of + * non-zero bytes seen. + */ + return ((char*) (((int) ptr & ~0xf) + (cnt - 16))); +} diff --git a/lib/machine/spu/strcat.c b/lib/machine/spu/strcat.c new file mode 100644 index 0000000..9a5185c --- /dev/null +++ b/lib/machine/spu/strcat.c @@ -0,0 +1,46 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include +#include "straddr.h" +#include "strcpy.h" + +/* + * Appends the string pointed to by src (up to and including the /0 + * character) to the array pointed to by dest overwriting the + * /0 character at the end of dest. The strings may not overlap and + * the dest string must have enough space for the result. + */ +char *strcat(char * __restrict__ dest, const char * __restrict__ src) +{ + _strncpy(_straddr(dest), src, 0, 0, 0); + return dest; +} diff --git a/lib/machine/spu/strcat_ea.c b/lib/machine/spu/strcat_ea.c new file mode 100644 index 0000000..f6178e4 --- /dev/null +++ b/lib/machine/spu/strcat_ea.c @@ -0,0 +1,55 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (strcat_ea); + +/* + * Maybe not the fastest thing ever since it reads through the data once on + * strlen and once on memcpy, but it should work. + */ +__ea char * +strcat_ea (__ea char *dest, __ea const char *src) +{ + size_ea_t length_src; + size_ea_t length_dest; + __ea char *new_dest; + + length_src = strlen_ea (src); + length_dest = strlen_ea (dest); + new_dest = dest + length_dest; + memcpy_ea ((__ea void *) new_dest, (__ea void *) src, length_src + 1); + return dest; +} diff --git a/lib/machine/spu/strchr.c b/lib/machine/spu/strchr.c new file mode 100644 index 0000000..dc93d60 --- /dev/null +++ b/lib/machine/spu/strchr.c @@ -0,0 +1,82 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include + +/* Scans the string pointed to by s for the character c and + * returns a pointer to the first occurance of c. If + * c is not found, then NULL is returned. + */ +char *strchr(const char *s, int c) +{ + unsigned int cmp, skip; + vec_uchar16 *ptr, data, vc; + vec_uint4 cmp_c, cmp_0; + vec_uint4 result; + vec_uint4 mask; + vec_uint4 one = spu_splats(0xffffU); + /* Scan memory array a quadword at a time. Skip leading + * mis-aligned bytes. + */ + ptr = (vec_uchar16 *)s; + + skip = (unsigned int)(ptr) & 15; + mask = spu_rlmask(one, -skip); + + vc = spu_splats((unsigned char)(c)); + + data = *ptr++; + + cmp_c = spu_and(spu_gather(spu_cmpeq(data, vc)), mask); + cmp_0 = spu_and(spu_gather(spu_cmpeq(data, 0)), mask); + + cmp = spu_extract(spu_or(cmp_c, cmp_0), 0); + + while (cmp == 0) { + data = *ptr++; + cmp_c = spu_gather(spu_cmpeq(data, vc)); + cmp_0 = spu_gather(spu_cmpeq(data, 0)); + + cmp = spu_extract(spu_or(cmp_c, cmp_0), 0); + } + + /* Compute the location of the first character. If it is beyond + * the end of the string, then return NULL. + */ + result = spu_add(spu_promote((unsigned int)ptr - (skip+32), 0), + spu_cntlz(spu_promote(cmp, 0))); + + result = spu_andc(result, spu_cmpgt(cmp_0, cmp_c)); + + return ((char *)spu_extract(result, 0)); +} diff --git a/lib/machine/spu/strchr_ea.c b/lib/machine/spu/strchr_ea.c new file mode 100644 index 0000000..6c751c8 --- /dev/null +++ b/lib/machine/spu/strchr_ea.c @@ -0,0 +1,47 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (strchr_ea); + +__ea char * +strchr_ea (__ea const char *s, int c) +{ + size_ea_t size; + + size = strlen_ea (s); + return (char *) memchr_ea (s, c, size); +} diff --git a/lib/machine/spu/strcmp.c b/lib/machine/spu/strcmp.c new file mode 100644 index 0000000..2db1a13 --- /dev/null +++ b/lib/machine/spu/strcmp.c @@ -0,0 +1,94 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "vec_literal.h" + +/* Compare the two strings s1 and s2. Return an integer less than, equal + * to, or greater than zero if s1 is found, respectively, to be less than, + * to match, or be greater than s2. + */ + +int strcmp(const char *s1, const char *s2) +{ + unsigned int offset1, offset2; + vec_uint4 gt_v, lt_v, mask_v; + vec_uint4 cnt1_v, cnt2_v; + vec_uint4 end1_v, end2_v, end_v, neq_v; + vec_uchar16 shuffle1, shuffle2; + vec_uchar16 data1A, data1B, data1, data2A, data2B, data2; + vec_uchar16 *ptr1, *ptr2; + + ptr1 = (vec_uchar16 *)s1; + ptr2 = (vec_uchar16 *)s2; + + offset1 = (unsigned int)(ptr1) & 15; + offset2 = (unsigned int)(ptr2) & 15; + + shuffle1 = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char)offset1), + VEC_LITERAL(vec_uint4, 0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + shuffle2 = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char)offset2), + VEC_LITERAL(vec_uint4, 0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + + data1A = *ptr1++; + data2A = *ptr2++; + + do { + data1B = *ptr1++; + data2B = *ptr2++; + + data1 = spu_shuffle(data1A, data1B, shuffle1); + data2 = spu_shuffle(data2A, data2B, shuffle2); + + data1A = data1B; + data2A = data2B; + + neq_v = spu_gather(spu_xor(spu_cmpeq(data1, data2), -1)); + + end1_v = spu_gather(spu_cmpeq(data1, 0)); + end2_v = spu_gather(spu_cmpeq(data2, 0)); + end_v = spu_or(end1_v, end2_v), 0; + } while (spu_extract(spu_or(end_v, neq_v), 0) == 0); + + cnt1_v = spu_cntlz(end1_v); + cnt2_v = spu_cntlz(end2_v); + + gt_v = spu_gather(spu_cmpgt(data1, data2)); + lt_v = spu_gather(spu_cmpgt(data2, data1)); + + mask_v = spu_and(spu_cmpeq(cnt1_v, cnt2_v), + spu_cmpeq(spu_rlmask(neq_v, (vec_int4)spu_add((vec_uint4)cnt1_v, -32)), 0)); + + gt_v = spu_sub(-1, spu_sl(spu_cmpgt(gt_v, lt_v), 1)); + + return (spu_extract(spu_andc(gt_v, mask_v), 0)); +} diff --git a/lib/machine/spu/strcmp_ea.c b/lib/machine/spu/strcmp_ea.c new file mode 100644 index 0000000..2c9c5eb --- /dev/null +++ b/lib/machine/spu/strcmp_ea.c @@ -0,0 +1,86 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include +#include +#include +#include "ea_internal.h" +#include "strncmp.h" +#include + +COMPAT_EA_ALIAS (strcmp_ea); + +/* + * It's not clear what is returned if both strings are equal to + * each other up to the length of the shorter string. + */ +int +strcmp_ea (__ea char *s1, __ea const char *s2) +{ + __ea char *curr_s1 = (__ea char *) s1; + __ea char *curr_s2 = (__ea char *) s2; + void *l_s1; + void *l_s2; + size_ea_t s2_n; + size_ea_t s1_n; + int min; + int ret; + vec_uint4 end_v; + + while (1) + { + l_s2 = __cache_fetch (curr_s2); + l_s1 = __cache_fetch (curr_s1); + /* + * Use the smaller of the the space left in s2 cacheline or + * the space left in the s1 cacheline. + */ + s2_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_s2) - (size_ea_t) curr_s2; + s1_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_s1) - (size_ea_t) curr_s1; + min = MIN (s2_n, s1_n); + + ret = _strncmp_internal (l_s1, l_s2, min, &end_v, 1); + /* + * Only the first slot of end_v is set. + */ + if (ret || spu_extract (end_v, 0)) + /* + * If any NUL values were seen (end_v values of zero) we still have + * to return ret, as it might not be zero. + */ + return ret; + + curr_s1 += min; + curr_s2 += min; + } +} diff --git a/lib/machine/spu/strcpy.c b/lib/machine/spu/strcpy.c new file mode 100644 index 0000000..69045ba --- /dev/null +++ b/lib/machine/spu/strcpy.c @@ -0,0 +1,41 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include "strcpy.h" + +/* + * Copy the string pointed to by src (up to and including the /0 + * character) into the array pointed to by dest. If copy between + * two arrays that overlap, then behavior is undefined. + */ +char * strcpy(char * __restrict__ dest, const char * __restrict__ src) +{ + return _strncpy(dest, src, 0, 0, 0); +} diff --git a/lib/machine/spu/strcpy.h b/lib/machine/spu/strcpy.h new file mode 100644 index 0000000..9040575 --- /dev/null +++ b/lib/machine/spu/strcpy.h @@ -0,0 +1,185 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include "vec_literal.h" +#include + +/* + * Supply an inline _strncpy for strcpy/cat and strncpy/cat. Relies on + * checklen and lastzero code being optimized out when they are constant + * zero values. + */ +static inline void * _strncpy(char * __restrict__ dest, const char * + __restrict__ src, size_t maxlen, int + checklen, int lastzero) +{ + int adjust, offset, soffset, doffset, shift; + vec_uchar16 *vsrc, *vdest; + vec_uchar16 sdata1, sdata2, sdata, shuffle; + vec_uchar16 mask1, maskzero, cmp0; + vec_uint4 nonzeroes, gathered_cmp, vtmp, vtmp2; + vec_uint4 curlen; /* assumes size_t is 4 bytes */ + const vec_uint4 val31 = { 31, 31, 31, 31 }; + const vec_uint4 val_0123 = { 0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F }; + const vec_uchar16 all_ones = { 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff }; + + vsrc = (vec_uchar16 *) src; + vdest = (vec_uchar16 *) dest; + soffset = (int) src & 15; + doffset = (int) dest & 15; + + if (checklen) { + /* + * Set curlen so it is the number of bytes we would copy if starting + * from vdest & ~0xf. + * + * curlen could probably be replaced by comparing vdest plus some + * offset to dest + maxlen, that would help mainly in the while loop + * but would lose only one instruction (the curlen -= 16). + */ + curlen = spu_splats((unsigned int) (maxlen + doffset)); + } + + /* + * Setup a shuffle pattern to align the source string with the + * alignment of the destination string. + */ + vtmp = spu_cmpgt(spu_promote(doffset, 0), spu_promote(soffset, 0)); + adjust = spu_extract(vtmp, 0); + offset = soffset - doffset; + offset += adjust & 16; + shuffle = spu_splats((unsigned char) offset); + shuffle = (vec_uchar16) spu_add((vec_uint4) shuffle, val_0123); + + vsrc += adjust; + sdata1 = *vsrc++; + sdata2 = *vsrc++; + sdata = spu_shuffle(sdata1, sdata2, shuffle); + + /* + * mask out leading bytes + */ + mask1 = spu_rlmaskqwbyte(all_ones, -doffset); + + cmp0 = spu_and(mask1, spu_cmpeq(sdata, 0)); + nonzeroes = spu_cntlz(spu_gather(cmp0)); + /* + * First element of nonzeroes - 15 is the number of leading non-zero + * bytes plus 1 for the zero byte. + */ + if (checklen) { + vtmp = spu_add(curlen, 15); + vtmp2 = spu_cmpgt(nonzeroes, vtmp); + nonzeroes = spu_sel(nonzeroes, vtmp, vtmp2); + } + + vtmp = spu_cmpgt(nonzeroes, val31); + /* + * Note: using immediate (constant 31) vs a vector value (val31) does + * not give different results, and we have to have a vector val31 for + * the spu_sel below, so use val31 everywhere. + */ + vtmp = spu_sel(nonzeroes, val31, vtmp); + /* + * So vtmp is now min(nonzeroes, 31), the number of bytes + 16 that we + * want to copy from the first 16 bytes of the source. + */ + if (checklen) { + curlen = spu_sub(vtmp, curlen); + curlen = spu_sub(15, curlen); + } + + /* + * We want a right shift 0xff with fill by ones of (vtmp - 15) bytes, but + * that doesn't exist so use spu_slqwbyte and vtmp all ones left by + * (31 - vtmp). Note: this can also use spu_rlqwbytebc with spu_rlqw. + */ + shift = spu_extract(spu_sub(val31, vtmp), 0); + maskzero = spu_slqwbyte(all_ones, shift); + maskzero = spu_and(mask1, maskzero); + *vdest = spu_sel(*vdest, sdata, maskzero); + + vtmp = spu_cmpgt(nonzeroes, val31); + if (checklen) { + vtmp2 = spu_cmpgt(curlen, 0); + vtmp = spu_and(vtmp, vtmp2); + } + if (spu_extract(vtmp, 0)) { + sdata1 = sdata2; + sdata2 = *vsrc++; + sdata = spu_shuffle(sdata1, sdata2, shuffle); + cmp0 = spu_cmpeq(sdata, 0); + gathered_cmp = spu_gather(cmp0); + /* + * Copy 16 bytes at a time. + */ + while ((spu_extract(gathered_cmp, 0) == 0) && + (!checklen || (spu_extract(curlen, 0) > 15))) { + if (checklen) + curlen = spu_add(curlen, -16); + *++vdest = sdata; + sdata1 = sdata2; + sdata2 = *vsrc++; + sdata = spu_shuffle(sdata1, sdata2, shuffle); + cmp0 = spu_cmpeq(sdata, 0); + gathered_cmp = spu_gather(cmp0); + } + /* + * Copy 0 to 15 trailing bytes, either up to the smaller of curlen or + * the number of non-zero bytes. + */ + nonzeroes = spu_cntlz(gathered_cmp); + if (checklen) { + vtmp = spu_add(curlen, 15); + vtmp2 = spu_cmpgt(nonzeroes, vtmp); + nonzeroes = spu_sel(nonzeroes, vtmp, vtmp2); + curlen = spu_sub(nonzeroes, curlen); + curlen = spu_sub(15, curlen); + } + shift = spu_extract(spu_sub(val31, nonzeroes), 0); + maskzero = spu_slqwbyte(all_ones, shift); + ++vdest; + *vdest = spu_sel(*vdest, sdata, maskzero); + } + + if (checklen && lastzero) { + /* + * For strncat. + */ + dest[maxlen - spu_extract(curlen, 0)] = '\0'; + } + + /* Pad null bytes if the length of the "src" is less than "n" (strncpy). */ + if (checklen && !lastzero && spu_extract(curlen, 0)) + memset(dest + maxlen - spu_extract(curlen, 0), 0, spu_extract(curlen, 0)); + return (dest); +} diff --git a/lib/machine/spu/strcpy_ea.c b/lib/machine/spu/strcpy_ea.c new file mode 100644 index 0000000..7d39058 --- /dev/null +++ b/lib/machine/spu/strcpy_ea.c @@ -0,0 +1,51 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (strcpy_ea); + +/* + * Not the fastest since it reads through the data once on + * strlen and once on memcpy. + */ +__ea char * +strcpy_ea (__ea char *dest, __ea const char *src) +{ + size_ea_t length; + + length = strlen_ea (src); + memcpy_ea ((__ea void *) dest, (__ea void *) src, length + 1); + return dest; +} diff --git a/lib/machine/spu/strcspn.c b/lib/machine/spu/strcspn.c new file mode 100644 index 0000000..5f75a29 --- /dev/null +++ b/lib/machine/spu/strcspn.c @@ -0,0 +1,96 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "vec_literal.h" + +/* Computes the length of the maximum initial segement + * of the string pointed to by s1 which consists entirely + * of characters not contained in the string pointed to by s2. + */ +size_t strcspn(const char *s1, const char *s2) +{ + size_t len, cnt; + unsigned int offset; + vec_uchar16 shuffle, match, initial_splat, splat; + vec_uchar16 data1, data2, dataA, dataB, *ptr1, *ptr2; + + ptr1 = (vec_uchar16 *)s1; + + offset = (unsigned int)(s1) & 15; + shuffle = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char) offset), + VEC_LITERAL(vec_uint4, 0x0010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + + len = 0; + + dataA = *ptr1++; + dataB = *ptr1++; + + initial_splat = spu_splats((unsigned char)((unsigned int)(s2) & 0xF)); + + /* For each quadword of the string s1. + */ + do { + data1 = spu_shuffle(dataA, dataB, shuffle); + + + ptr2 = (vec_uchar16 *)s2; + data2 = *ptr2; + data2 = spu_shuffle(data2, data2, initial_splat); + ptr2 = (vec_uchar16 *)((unsigned int)(ptr2) + 1); + splat = initial_splat; + + match = spu_cmpeq(data1, 0); + + /* For each character of s2, compare agains a quadword of s1, + * accumulating match success in the variable match. + */ + while (spu_extract((vec_uint4)data2, 0)) { + match = spu_or(match, spu_cmpeq(data1, data2)); + + splat = spu_and((vec_uchar16)(spu_add((vec_uint4)splat, VEC_SPLAT_U32(0x01010101))), 0xF); + + data2 = *ptr2; + data2 = spu_shuffle(data2, data2, splat); + ptr2 = (vec_uchar16 *)((unsigned int)(ptr2) + 1); + } + + cnt = spu_extract(spu_cntlz(spu_gather(match)), 0); + len = (len - 16) + cnt; + + dataA = dataB; + dataB = *ptr1++; + } while (cnt == 32); + + return (len); +} diff --git a/lib/machine/spu/strcspn_ea.c b/lib/machine/spu/strcspn_ea.c new file mode 100644 index 0000000..2cc0f08 --- /dev/null +++ b/lib/machine/spu/strcspn_ea.c @@ -0,0 +1,63 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (strcspn_ea); + +size_ea_t +strcspn_ea (__ea const char *s, const char *reject) +{ + size_ea_t s_length; + size_ea_t found_length; + __ea void *found_it; + size_ea_t ret; + size_t i; + size_t rej_length; + + s_length = strlen_ea (s); + rej_length = strlen (reject); + ret = s_length; + + for (i = 0; i < rej_length; i++) + { + found_it = memchr_ea (s, reject[i], s_length); + found_length = (size_ea_t) found_it - (size_ea_t) s; + if (found_length < ret) + ret = found_length; + } + + return ret; +} diff --git a/lib/machine/spu/strlen.c b/lib/machine/spu/strlen.c new file mode 100644 index 0000000..a8403e0 --- /dev/null +++ b/lib/machine/spu/strlen.c @@ -0,0 +1,68 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include + +/* + * Calculates the length of the string s, not including the terminating + * \0 character. + */ +size_t strlen(const char *s) +{ + unsigned int cnt, cmp, skip, mask; + vec_uchar16 *ptr, data; + + /* + * Compensate for initial mis-aligned string. + */ + ptr = (vec_uchar16 *)s; /* implicit 16 byte alignment when dereferenced */ + skip = (unsigned int)(ptr) & 15; + mask = 0xFFFF >> skip; + + data = *ptr; + cmp = spu_extract(spu_gather(spu_cmpeq(data, 0)), 0); + cmp &= mask; + + cnt = spu_extract(spu_cntlz(spu_promote(cmp, 0)), 0); + + while (cnt == 32) { + data = *++ptr; + cnt = spu_extract(spu_cntlz(spu_gather(spu_cmpeq(data, 0))), 0); + } + + /* + * The length is ptr aligned down to a 16 byte boundary, plus the offset + * to the zero byte, minus the starting address s. + */ + return ((((int) ptr & ~0xf) + (cnt - 16)) - (int) s); +} diff --git a/lib/machine/spu/strlen_ea.c b/lib/machine/spu/strlen_ea.c new file mode 100644 index 0000000..f00cec2 --- /dev/null +++ b/lib/machine/spu/strlen_ea.c @@ -0,0 +1,67 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (strlen_ea); + +size_ea_t +strlen_ea (__ea const char *s) +{ + __ea void *curr_s = (__ea void *) s; + void *local_s; + size_ea_t left_in_cacheline; + void *where_null; + size_ea_t length_of_string = 0; + + while (1) + { + left_in_cacheline = + ROUND_UP_NEXT_128 ((size_ea_t) curr_s) - (size_ea_t) curr_s; + local_s = __cache_fetch (curr_s); + where_null = memchr (local_s, '\0', left_in_cacheline); + + if (where_null) + { + length_of_string += ((size_ea_t) (int) where_null - (size_ea_t) + (int) local_s); + return length_of_string; + } + + /* update values to take into account what we copied */ + curr_s += left_in_cacheline; + length_of_string += left_in_cacheline; + } +} diff --git a/lib/machine/spu/strncat.c b/lib/machine/spu/strncat.c new file mode 100644 index 0000000..3eeea7a --- /dev/null +++ b/lib/machine/spu/strncat.c @@ -0,0 +1,46 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "straddr.h" +#include "strcpy.h" + +/* + * Appends the string pointed to by src (up to and including the /0 + * character) to the array pointed to by dest (overwriting the + * /0 character at the end of dest. The strings may not overlap and + * the dest string must have enough space for the result. + */ +char * strncat(char * __restrict__ dest, const char * __restrict__ src, + size_t n) +{ + _strncpy(_straddr(dest), src, n, 1, 1); + return dest; +} diff --git a/lib/machine/spu/strncat_ea.c b/lib/machine/spu/strncat_ea.c new file mode 100644 index 0000000..b6c7389 --- /dev/null +++ b/lib/machine/spu/strncat_ea.c @@ -0,0 +1,60 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (strncat_ea); + +/* + * Not the fastest thing ever since it reads through the data once on + * strlen and once on memcpy. + */ +__ea char * +strncat_ea (__ea char *dest, __ea const char *src, size_ea_t n) +{ + size_ea_t length_src; + size_ea_t length_dest; + __ea char *new_dest; + size_ea_t smaller_length; + + length_src = strlen_ea (src); + length_dest = strlen_ea (dest); + new_dest = dest + length_dest; + smaller_length = length_src < n ? length_src : n; + memcpy_ea ((__ea void *) new_dest, (__ea void *) src, smaller_length); + /* null out last character */ + memset_ea ((__ea void *) (new_dest + smaller_length), 0, 1); + + return dest; +} diff --git a/lib/machine/spu/strncmp.c b/lib/machine/spu/strncmp.c new file mode 100644 index 0000000..d96504c --- /dev/null +++ b/lib/machine/spu/strncmp.c @@ -0,0 +1,46 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "strncmp.h" + +/* + * Compare the two strings s1 and s2 of length n. Returns an integer less + * than, equal to, or greater than zero if s1 is found, respectively, + * to be less than, to match, or be greater than s2. + */ +int strncmp(const char *s1, const char *s2, size_t n) +{ + vec_uint4 end_v; + return _strncmp_internal (s1, s2, n, &end_v, 1); +} diff --git a/lib/machine/spu/strncmp.h b/lib/machine/spu/strncmp.h new file mode 100644 index 0000000..f464564 --- /dev/null +++ b/lib/machine/spu/strncmp.h @@ -0,0 +1,155 @@ +/* + (C) Copyright 2001,2006,2008 + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include + +/* + * Internal _strncmp_internal for strncmp and memcmp: + * + * Compare the two strings s1 and s2 of length n. Returns an integer less + * than, equal to, or greater than zero if s1 is found, respectively, + * to be less than, to match, or be greater than s2. Check for zero bytes + * only if check_zeroes is set. In additin, the vector value *end_v will + * contain all zeroes if we hit a NUL character that caused the comparison + * to complete, *end_v is modified only if check_zeroes is set. + */ +static inline int +_strncmp_internal(const char *s1, const char *s2, size_t n, vec_uint4 + *end_v, int check_zeroes) +{ + unsigned int offset1, offset2; + vec_int4 n_v; + vec_uint4 cnt1_v, cnt2_v, max_cnt_v; + vec_uint4 gt_v, lt_v, mask_v, end1_v, end2_v, neq_v, tmp1_v; + vec_uint4 shift_n_v, shift_eos_v, max_shift_v; + vec_uchar16 shuffle1, shuffle2; + vec_uchar16 data1A, data1B, data1, data2A, data2B, data2; + vec_uchar16 *ptr1, *ptr2; + + data1 = data2 = spu_splats((unsigned char)0); + + ptr1 = (vec_uchar16 *)s1; + ptr2 = (vec_uchar16 *)s2; + + offset1 = (unsigned int)(ptr1) & 15; + offset2 = (unsigned int)(ptr2) & 15; + + shuffle1 = (vec_uchar16) + spu_add((vec_uint4)spu_splats((unsigned char)offset1), + ((vec_uint4) {0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F})); + shuffle2 = (vec_uchar16) + spu_add((vec_uint4)spu_splats((unsigned char)offset2), + ((vec_uint4) {0x00010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F})); + data1A = *ptr1++; + data2A = *ptr2++; + + n_v = spu_promote((int)n, 0); + + do { + data1B = *ptr1++; + data2B = *ptr2++; + + /* + * Quadword align each of the input strings so that we operate on full + * quadwords. + */ + data1 = spu_shuffle(data1A, data1B, shuffle1); + data2 = spu_shuffle(data2A, data2B, shuffle2); + + data1A = data1B; + data2A = data2B; + + neq_v = spu_gather(spu_xor(spu_cmpeq(data1, data2), -1)); + + if (check_zeroes) { + end1_v = spu_gather(spu_cmpeq(data1, 0)); + end2_v = spu_gather(spu_cmpeq(data2, 0)); + *end_v = spu_or(end1_v, end2_v); + } + + n_v = spu_add(n_v, -16); + + /* + * Repeat until either + * 1) the character count expired + * 2) check_zeroes is set and a null character is discovered in one of + * the input strings + * 3) the strings do not compare equal + */ + if (check_zeroes) { + tmp1_v = spu_or(*end_v, neq_v); + tmp1_v = spu_cmpeq(tmp1_v, 0); + } else { + tmp1_v = spu_cmpeq(neq_v, 0); + } + tmp1_v = spu_and(tmp1_v, spu_cmpgt(n_v, 0)); + } while (spu_extract(tmp1_v, 0)); + + /* + * Construct a mask to eliminate characters that are not of interest + * in the comparison. + */ + mask_v = spu_splats((unsigned int)0xFFFF); + shift_n_v = + spu_andc((__vector unsigned int)spu_sub(0, n_v), spu_cmpgt(n_v, -1)); + if (check_zeroes) { + cnt1_v = spu_cntlz(end1_v); + cnt2_v = spu_cntlz(end2_v); + max_cnt_v = spu_sel(cnt1_v, cnt2_v, spu_cmpgt(cnt2_v, cnt1_v)); + shift_eos_v = spu_sub(32, max_cnt_v); + max_shift_v = + spu_sel(shift_n_v, shift_eos_v, spu_cmpgt(shift_eos_v, shift_n_v)); + mask_v = spu_and(spu_sl(mask_v, spu_extract(max_shift_v, 0)), mask_v); + } else { + mask_v = spu_and(spu_sl(mask_v, spu_extract(shift_n_v, 0)), mask_v); + } + + /* + * Determine if greater then or less then in the case that they are + * not equal. gt_v is either 1 (in the case s1 is greater then s2), or + * -1 (in the case that s2 is greater then s1). + * + * There are no byte vector math instructions, so we can't subtract + * data1 from data2. + */ + gt_v = spu_gather(spu_cmpgt(data1, data2)); + lt_v = spu_gather(spu_cmpgt(data2, data1)); + gt_v = spu_sub(-1, spu_sl(spu_cmpgt(gt_v, lt_v), 1)); + + /* + * Construct a mask to be applied to gt_v if the strings are discovered + * to be equal. + */ + mask_v = spu_cmpeq(spu_and(neq_v, mask_v), 0); + return (spu_extract(spu_andc(gt_v, mask_v), 0)); +} diff --git a/lib/machine/spu/strncmp_ea.c b/lib/machine/spu/strncmp_ea.c new file mode 100644 index 0000000..1a4f366 --- /dev/null +++ b/lib/machine/spu/strncmp_ea.c @@ -0,0 +1,87 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include +#include +#include "ea_internal.h" +#include "strncmp.h" +#include + +COMPAT_EA_ALIAS (strncmp_ea); + +int +strncmp_ea (__ea void *s1, __ea const void *s2, size_ea_t n3) +{ + __ea void *curr_s1 = (__ea void *) s1; + __ea void *curr_s2 = (__ea void *) s2; + void *l_s1; + void *l_s2; + int min; + size_ea_t s2_n; + size_ea_t s1_n; + int ret; + vec_uint4 end_v; + + ret = 0; /* in case n3 is 0 */ + while (n3) + { + l_s2 = __cache_fetch (curr_s2); + l_s1 = __cache_fetch (curr_s1); + + /* + * Use the smaller of the size left to compare (n3), the space left in + * s2 cacheline (s2_n), or the space left in the s1 cacheline (s1_n) + */ + s2_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_s2) - (size_ea_t) curr_s2; + s1_n = ROUND_UP_NEXT_128 ((size_ea_t) curr_s1) - (size_ea_t) curr_s1; + min = three_way_min (s2_n, s1_n, n3); + + ret = _strncmp_internal (l_s1, l_s2, min, &end_v, 1); + /* + * Only the first slot of end_v is set. + */ + /* if (ret || spu_extract(spu_cmpeq(end_v, 0), 0)) { */ + /* if (ret || spu_extract(spu_gather(spu_cmpeq(end_v, 0)), 0)) { */ + if (ret || spu_extract (end_v, 0)) + /* + * If any NUL values were seen (end_v values of zero) we still have + * to return ret, as it might not be zero. + */ + return ret; + + curr_s2 += min; + curr_s1 += min; + n3 -= min; + } + return ret; +} diff --git a/lib/machine/spu/strncpy.c b/lib/machine/spu/strncpy.c new file mode 100644 index 0000000..9c70b04 --- /dev/null +++ b/lib/machine/spu/strncpy.c @@ -0,0 +1,42 @@ +/* + (C) Copyright 2008 + International Business Machines Corporation, + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "strcpy.h" + +/* + * Copy the string up to n character from memory area src to memory area + * dest. The memory areas may not overlap. The strncpy subroutine returns + * a pointer to dest. + */ +char * strncpy(char * __restrict__ dest, const char * __restrict__ src, size_t n) +{ + return _strncpy(dest, src, n, 1, 0); +} diff --git a/lib/machine/spu/strncpy_ea.c b/lib/machine/spu/strncpy_ea.c new file mode 100644 index 0000000..c29ba91 --- /dev/null +++ b/lib/machine/spu/strncpy_ea.c @@ -0,0 +1,57 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include +#include "ea_internal.h" +#include + +COMPAT_EA_ALIAS (strncpy_ea); + +/* + * Not the fastest since it reads through the data once on strlen and once + * on memcpy. + */ +__ea char * +strncpy_ea (__ea char *dest, __ea const char *src, size_ea_t n) +{ + size_ea_t length = strlen_ea (src); + if (length < n) + { + memcpy_ea ((__ea void *) dest, (__ea void *) src, length); + memset_ea ((__ea void *) (dest + length), 0, n - length); + } + else + { + memcpy_ea ((__ea void *) dest, (__ea void *) src, n); + } + return dest; +} diff --git a/lib/machine/spu/strpbrk.c b/lib/machine/spu/strpbrk.c new file mode 100644 index 0000000..461a586 --- /dev/null +++ b/lib/machine/spu/strpbrk.c @@ -0,0 +1,96 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "vec_literal.h" + +/* Locates the first occurance in string pointed to by s1 of + * any character in the string pointed to by s2. A null pointer + * is returned if no character in s2 occurs in s1. + */ +char * strpbrk(const char *s1, const char *s2) +{ + unsigned int offset; + vec_uint4 cnt; + vec_uchar16 shuffle, match, initial_splat, splat, eos; + vec_uchar16 data1, data2, dataA, dataB, *ptr1, *ptr2; + + ptr1 = (vec_uchar16 *)s1; + + offset = (unsigned int)(s1) & 15; + shuffle = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char) offset), + VEC_LITERAL(vec_uint4, 0x0010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + + dataA = *ptr1++; + dataB = *ptr1++; + + initial_splat = spu_splats((unsigned char)((unsigned int)(s2) & 0xF)); + + /* For each quadword of the string s1. + */ + do { + data1 = spu_shuffle(dataA, dataB, shuffle); + + eos = match = spu_cmpeq(data1, 0); + + ptr2 = (vec_uchar16 *)s2; + data2 = *ptr2; + data2 = spu_shuffle(data2, data2, initial_splat); + ptr2 = (vec_uchar16 *)((unsigned int)(ptr2) + 1); + splat = initial_splat; + + /* For each character of s2, compare agains a quadword of s1, + * accumulating match success in the variable match. + */ + while (spu_extract((vec_uint4)data2, 0)) { + match = spu_or(match, spu_cmpeq(data1, data2)); + + splat = spu_and((vec_uchar16)(spu_add((vec_uint4)splat, VEC_SPLAT_U32(0x01010101))), 0xF); + + data2 = *ptr2; + data2 = spu_shuffle(data2, data2, splat); + ptr2 = (vec_uchar16 *)((unsigned int)(ptr2) + 1); + } + + cnt = spu_cntlz(spu_gather(match)); + + dataA = dataB; + dataB = *ptr1++; + } while (spu_extract(cnt, 0) == 32); + + /* Compute the first match pointer, zeroing it (NIL) if it is the end of + * string. + */ + return ((char *)spu_extract(spu_andc(spu_add(spu_add(spu_promote((unsigned int)(ptr1), 0), -64), cnt), + spu_cmpeq(cnt, spu_cntlz(spu_gather(eos)))), 0)); +} diff --git a/lib/machine/spu/strpbrk_ea.c b/lib/machine/spu/strpbrk_ea.c new file mode 100644 index 0000000..a8b69f5 --- /dev/null +++ b/lib/machine/spu/strpbrk_ea.c @@ -0,0 +1,47 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (strpbrk_ea); + +__ea char * +strpbrk_ea (__ea const char *s, const char *accept) +{ + size_ea_t where; + + where = strcspn_ea (s, accept); + return (__ea char *) ((size_ea_t) s + where); +} diff --git a/lib/machine/spu/strrchr.c b/lib/machine/spu/strrchr.c new file mode 100644 index 0000000..d311710 --- /dev/null +++ b/lib/machine/spu/strrchr.c @@ -0,0 +1,115 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "vec_literal.h" + +/* Scans the string pointed to by s for the character c and + * returns a pointer to the last occurance of c. If + * c is not found, then NULL is returned. + */ +char * strrchr(const char *s, int c) +{ + int nskip; + vec_uchar16 *ptr, data, vc; + vec_uint4 cmp_c, cmp_0, cmp; + vec_uint4 res_ptr, res_cmp; + vec_uint4 mask, result; + vec_uint4 one = spu_splats(0xffffU); + /* Scan memory array a quadword at a time. Skip leading + * mis-aligned bytes. + */ + ptr = (vec_uchar16 *)s; + + nskip = -((unsigned int)(ptr) & 15); + mask = spu_rlmask(one, nskip); + + vc = spu_splats((unsigned char)(c)); + + data = *ptr++; + ptr = (vec_uchar16 *)((unsigned int)ptr & ~15); + + cmp_c = spu_and(spu_gather(spu_cmpeq(data, vc)), mask); + cmp_0 = spu_and(spu_gather(spu_cmpeq(data, 0)), mask); + + res_ptr = spu_splats(0U); + res_cmp = spu_splats(0U); + + while (spu_extract(cmp_0, 0) == 0) { + cmp = spu_cmpeq(cmp_c, 0); + + res_ptr = spu_sel(spu_promote((unsigned int)(ptr), 0), res_ptr, cmp); + res_cmp = spu_sel(cmp_c, res_cmp, cmp); + + data = *ptr++; + + cmp_c = spu_gather(spu_cmpeq(data, vc)); + cmp_0 = spu_gather(spu_cmpeq(data, 0)); + + cmp = spu_cmpeq(cmp_c, 0); + } + + /* Compute the location of the last character before termination + * character. + * + * First mask off compare results following the first termination character. + */ + mask = spu_sl(one, 31 - spu_extract(spu_cntlz(cmp_0), 0)); + cmp_c = spu_and(cmp_c, mask); + + /* Conditionally update res_ptr and res_cmd if a match was found in the last + * quadword. + */ + cmp = spu_cmpeq(cmp_c, 0); + + res_ptr = spu_sel(spu_promote((unsigned int)(ptr), 0), res_ptr, cmp); + res_cmp = spu_sel(cmp_c, res_cmp, cmp); + + /* Bit reserve res_cmp for locating last occurance. + */ + mask = spu_cmpeq(res_cmp, 0); + + res_cmp = (vec_uint4)spu_maskb(spu_extract(res_cmp, 0)); + res_cmp = spu_gather((vec_uchar16)spu_shuffle(res_cmp, res_cmp, + VEC_LITERAL(vec_uchar16, + 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0))); + + /* Compute the location (ptr) of the last occurance of c. If no + * occurance was found (ie, element 0 of res_cmp == 0, then return + * NULL. + */ + result = spu_sub(spu_add(res_ptr, 15), spu_cntlz(res_cmp)); + result = spu_andc(result, mask); + + return ((char *)spu_extract(result, 0)); +} diff --git a/lib/machine/spu/strrchr_ea.c b/lib/machine/spu/strrchr_ea.c new file mode 100644 index 0000000..76ebb31 --- /dev/null +++ b/lib/machine/spu/strrchr_ea.c @@ -0,0 +1,84 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +static __ea char * +similie_ls_to_ea (char *l1, __ea char *ea1, char *l2) +{ + return (__ea char *) ((size_ea_t) ea1 + + ((size_ea_t) (int) l2 - (size_ea_t) (int) l1)); +} + +COMPAT_EA_ALIAS (strrchr_ea); + +__ea char * +strrchr_ea (__ea const char *s, int c) +{ + size_ea_t string_length; + char *curr_ptr; + __ea char *string_start_local; + __ea char *end_of_string_ea; + __ea char *start_of_cacheline_ea; + char *start_of_cachline_local; + + string_start_local = __cache_fetch ((__ea char *) s); + string_length = strlen_ea (s); + end_of_string_ea = (__ea char *) s + string_length; + + start_of_cacheline_ea = round_down_128_ea (end_of_string_ea - 1); + start_of_cachline_local = __cache_fetch (start_of_cacheline_ea); + /*this next line should be the same cacheline, just the end of the string */ + curr_ptr = __cache_fetch (end_of_string_ea - 1); + + while (1) + { + /*search backwards through this cachline */ + while (curr_ptr >= start_of_cachline_local) + { + if (*curr_ptr == (char) c) + return similie_ls_to_ea (start_of_cachline_local, + start_of_cacheline_ea, curr_ptr); + curr_ptr--; + if (curr_ptr < string_start_local) + return NULL; + } + + /* iterate cacheline backwards */ + start_of_cacheline_ea -= 128; + start_of_cachline_local = __cache_fetch (start_of_cacheline_ea); + curr_ptr = __cache_fetch (start_of_cacheline_ea + 128); + } +} diff --git a/lib/machine/spu/strspn.c b/lib/machine/spu/strspn.c new file mode 100644 index 0000000..511e631 --- /dev/null +++ b/lib/machine/spu/strspn.c @@ -0,0 +1,95 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include "vec_literal.h" + +/* Computes the length of the maximum initial segement + * of the string pointed to by s1 which consists entirely + * of characters from the string pointed to by s2. + */ +size_t strspn(const char *s1, const char *s2) +{ + size_t len, cnt; + unsigned int offset; + vec_uchar16 shuffle, match, initial_splat, splat; + vec_uchar16 data1, data2, dataA, dataB, *ptr1, *ptr2; + + ptr1 = (vec_uchar16 *)s1; + + offset = (unsigned int)(s1) & 15; + shuffle = (vec_uchar16)spu_add((vec_uint4)spu_splats((unsigned char) offset), + VEC_LITERAL(vec_uint4, 0x0010203, 0x04050607, 0x08090A0B, 0x0C0D0E0F)); + + len = 0; + + dataA = *ptr1++; + dataB = *ptr1++; + + initial_splat = spu_splats((unsigned char)((unsigned int)(s2) & 0xF)); + + /* For each quadword of the string s1. + */ + do { + data1 = spu_shuffle(dataA, dataB, shuffle); + + match = spu_splats((unsigned char)0); + + ptr2 = (vec_uchar16 *)s2; + data2 = *ptr2; + data2 = spu_shuffle(data2, data2, initial_splat); + ptr2 = (vec_uchar16 *)((unsigned int)(ptr2) + 1); + splat = initial_splat; + + /* For each character of s2, compare agains a quadword of s1, + * accumulating match success in the variable match. + */ + while (spu_extract((vec_uint4)data2, 0)) { + match = spu_or(match, spu_cmpeq(data1, data2)); + + splat = spu_and((vec_uchar16)(spu_add((vec_uint4)splat, VEC_SPLAT_U32(0x01010101))), 0xF); + + data2 = *ptr2; + data2 = spu_shuffle(data2, data2, splat); + ptr2 = (vec_uchar16 *)((unsigned int)(ptr2) + 1); + } + + cnt = spu_extract(spu_cntlz(spu_gather(spu_xor(match, -1))), 0); + len = (len - 16) + cnt; + + dataA = dataB; + dataB = *ptr1++; + } while (cnt == 32); + + return (len); +} diff --git a/lib/machine/spu/strspn_ea.c b/lib/machine/spu/strspn_ea.c new file mode 100644 index 0000000..d1e2947 --- /dev/null +++ b/lib/machine/spu/strspn_ea.c @@ -0,0 +1,65 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (strspn_ea); + +size_ea_t +strspn_ea (__ea const char *s, const char *accept) +{ + __ea void *curr_s = (__ea void *) s; + char *local_s; + size_ea_t length_of_string = 0; + size_ea_t s_len; + int i; + + s_len = strlen_ea (s); + + for (i = 0; i < s_len; i++) + { + local_s = (char *) __cache_fetch (curr_s); + if (!strchr (accept, local_s[0])) + { + return length_of_string; + } + else + { + length_of_string++; + curr_s++; + } + } + return length_of_string; +} diff --git a/lib/machine/spu/strstr_ea.c b/lib/machine/spu/strstr_ea.c new file mode 100644 index 0000000..9200cbf --- /dev/null +++ b/lib/machine/spu/strstr_ea.c @@ -0,0 +1,75 @@ +/* +(C) Copyright IBM Corp. 2007, 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include +#include "ea_internal.h" +#include +#include +#include + +COMPAT_EA_ALIAS (strstr_ea); + +__ea char *strstr_ea (__ea const char *s1, __ea const char *s2) +{ + __ea char *ret; + __ea char *curr; + size_ea_t s2_length; + size_ea_t s1_length; + int i; + int found; + + ret = (__ea char *) s1; + s2_length = strlen_ea (s2); + s1_length = strlen_ea (s1); + while (ret < (s1 + s1_length)) { + /* search for first letter */ + //temporary hack for broken 64 bit compiler + ret = strchr_ea (ret, s2[0]); + /*if we find it search for the rest */ + if (ret) { + found = 1; + for (i = 1; i < s2_length; i++) { + //temporary hack for broken 64 bit compiler + curr = strchr_ea (ret, s2[i]); + /* if the letter doesn't exist or isn't in the right spot we unfind */ + if (!curr || (curr != (ret + i))) + found = 0; + } + } + if (found) { + return ret; + } else { + ret++; + } + /*go back and try again with the rest of it */ + } + return NULL; +} diff --git a/lib/machine/spu/strxfrm.c b/lib/machine/spu/strxfrm.c new file mode 100644 index 0000000..02bb9a8 --- /dev/null +++ b/lib/machine/spu/strxfrm.c @@ -0,0 +1,61 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#include +#include +#include + +#define min(a, b) (a) < (b) ? (a) : (b) + +/* The strxfrm() function transforms the src string into a form such that + * the result of strcmp() on two strings that have been transformed with + * strxfrm() is the same as the result of strcoll() on the two strings + * before their transformation. The first n characters of the transformed + * string are placed in dest. + * + * The strxfrm() function returns the number of bytes required to store + * the transformed string in dest excluding the terminating character + * If the value returned is n or more, the contents of dest are indeterminate. + * + * Note: Since this library/function only supports a single locale, no + * transformation is performed. + */ + +size_t strxfrm(char * __restrict__ dest, const char * __restrict__ src, size_t n) +{ + size_t len; + + len = strlen(src); + (void)memcpy((void *)dest, (void *)src, min(n,len + 1)); + + return len; +} diff --git a/lib/machine/spu/sys/custom_file.h b/lib/machine/spu/sys/custom_file.h new file mode 100644 index 0000000..60c0d23 --- /dev/null +++ b/lib/machine/spu/sys/custom_file.h @@ -0,0 +1,13 @@ +#ifndef __CUSTOM_FILE_H__ +#define __CUSTOM_FILE_H__ 1 + +/* + * Cell SPE support + */ +struct __sFILE_spu { + int _fp; /* pseudo FILE pointer on PPE */ +}; +typedef struct __sFILE_spu __FILE; + +#endif /* __CUSTOM_FILE_H__ */ + diff --git a/lib/machine/spu/sys/dirent.h b/lib/machine/spu/sys/dirent.h new file mode 100644 index 0000000..00ed414 --- /dev/null +++ b/lib/machine/spu/sys/dirent.h @@ -0,0 +1,57 @@ +/* + Copyright 2007 + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _SYS_DIRENT_H +#define _SYS_DIRENT_H +#ifdef __cplusplus +extern "C" { +#endif + +#define MAXNAMLEN 255 + +struct dirent { + ino_t d_ino; + char d_name[MAXNAMLEN + 1]; +}; + +typedef struct { + unsigned long long ppc_dir; + /* + * Allow one readdir for each opendir, and store the data here. + */ + struct dirent dirent; +} DIR; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/machine/spu/sys/errno.h b/lib/machine/spu/sys/errno.h new file mode 100644 index 0000000..8758283 --- /dev/null +++ b/lib/machine/spu/sys/errno.h @@ -0,0 +1,178 @@ +/* + * The SPU must have these values match those on the PPU linux side, so + * the assisted calls (system or library ones) that set errno will use the + * same values. + * + * This file is based on the CRIS file, with these modifications: + * + * EDEADLOCK - instead of EDEADLK (35) use 58 (for some reason ppc only does + * this, it is not used by ppc kernel code nor glibc code). + * + * ECANCELED value of 125 added, in linux and posix value of 125, in generic + * newlib errno.h, value of 140 + * + * ENOTSUP as EOPNOTSUPP (95) added, in linux and posix value 95, in + * generic newlib errno.h, value of 134 + */ + +/* This file is to be kept in sync with newlib/libc/include/sys/errno.h + on which it is based, except values used or returned by syscalls must + be those of the Linux ppc. */ + +#ifndef _SYS_ERRNO_H_ +#ifdef __cplusplus +extern "C" { +#endif +#define _SYS_ERRNO_H_ + +#include + +#define errno (_impure_data._errno) + +/* Please don't use these variables directly. + Use strerror instead. */ +extern const char * const _sys_errlist[]; +extern int _sys_nerr; + +#define __errno_r(ptr) _REENT_ERRNO(ptr) + +/* Adjusted to the linux asm/errno.h */ +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ + +#define EDEADLOCK 58 + +#define EBFONT 59 /* Bad font file format */ +/* This is only used internally in newlib; not returned by the kernel. + EBFONT seems the closest match for a "bad file format" error. */ +#define EFTYPE EBFONT /* Inappropriate file type or format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define ENOTSUP EOPNOTSUPP +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ + +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ +#define ECANCELED 125 /* Operation Canceled */ + +#define __ELASTERROR 2000 /* Users can add values starting here */ + +#ifdef __cplusplus +} +#endif +#endif /* _SYS_ERRNO_H */ diff --git a/lib/machine/spu/sys/fenv.h b/lib/machine/spu/sys/fenv.h new file mode 100644 index 0000000..e74fa96 --- /dev/null +++ b/lib/machine/spu/sys/fenv.h @@ -0,0 +1,144 @@ +/* + (C) Copyright 2006, 2007 + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ +#ifndef _SYS_FENV_H +#define _SYS_FENV_H + +/* + * The exception macros are such that the functions to pack/unpack them + * will map a 32 bit fenv_t from/to the 128 bit fpscr. + * + * Suffixes: + * _SNGL: single precision + * _DBL: double precision + * _N: element number, no suffix for element 0. + */ + +#define FE_OVERFLOW_SNGL 0x08000000 +#define FE_UNDERFLOW_SNGL 0x04000000 +#define FE_DIFF_SNGL 0x02000000 +#define FE_DIVBYZERO_SNGL 0x00000040 + +#define FE_OVERFLOW_SNGL_1 0x00040000 +#define FE_UNDERFLOW_SNGL_1 0x00020000 +#define FE_DIFF_SNGL_1 0x00010000 +#define FE_DIVBYZERO_SNGL_1 0x00000020 + +#define FE_OVERFLOW_SNGL_2 0x00000200 +#define FE_UNDERFLOW_SNGL_2 0x00000100 +#define FE_DIFF_SNGL_2 0x00000080 +#define FE_DIVBYZERO_SNGL_2 0x00000010 + +#define FE_OVERFLOW_SNGL_3 0x00000004 +#define FE_UNDERFLOW_SNGL_3 0x00000002 +#define FE_DIFF_SNGL_3 0x00000001 +#define FE_DIVBYZERO_SNGL_3 0x00000008 + +#define FE_ALL_EXCEPT_SNGL (FE_OVERFLOW_SNGL | FE_UNDERFLOW_SNGL \ + | FE_DIFF_SNGL | FE_DIVBYZERO_SNGL) +#define FE_ALL_EXCEPT_SNGL_1 (FE_OVERFLOW_SNGL_1 | FE_UNDERFLOW_SNGL_1 \ + | FE_DIFF_SNGL_1 | FE_DIVBYZERO_SNGL_1) +#define FE_ALL_EXCEPT_SNGL_2 (FE_OVERFLOW_SNGL_2 | FE_UNDERFLOW_SNGL_2 \ + | FE_DIFF_SNGL_2 | FE_DIVBYZERO_SNGL_2) +#define FE_ALL_EXCEPT_SNGL_3 (FE_OVERFLOW_SNGL_3 | FE_UNDERFLOW_SNGL_3 \ + | FE_DIFF_SNGL_3 | FE_DIVBYZERO_SNGL_3) + +#define FE_OVERFLOW_DBL 0x01000000 +#define FE_UNDERFLOW_DBL 0x00800000 +#define FE_INEXACT_DBL 0x00400000 +#define FE_INVALID_DBL 0x00200000 +#define FE_NC_NAN_DBL 0x00100000 +#define FE_NC_DENORM_DBL 0x00080000 + +#define FE_OVERFLOW_DBL_1 0x00008000 +#define FE_UNDERFLOW_DBL_1 0x00004000 +#define FE_INEXACT_DBL_1 0x00002000 +#define FE_INVALID_DBL_1 0x00001000 +#define FE_NC_NAN_DBL_1 0x00000800 +#define FE_NC_DENORM_DBL_1 0x00000400 + +#define FE_ALL_EXCEPT_DBL (FE_OVERFLOW_DBL | FE_UNDERFLOW_DBL | \ + FE_INEXACT_DBL | FE_INVALID_DBL | \ + FE_NC_NAN_DBL | FE_NC_DENORM_DBL) +#define FE_ALL_EXCEPT_DBL_1 (FE_OVERFLOW_DBL_1 | FE_UNDERFLOW_DBL_1 | \ + FE_INEXACT_DBL_1 | FE_INVALID_DBL_1 | \ + FE_NC_NAN_DBL_1 | FE_NC_DENORM_DBL_1) + +#define FE_ALL_EXCEPT (FE_ALL_EXCEPT_SNGL | FE_ALL_EXCEPT_SNGL_1 | \ + FE_ALL_EXCEPT_SNGL_2 | FE_ALL_EXCEPT_SNGL_3 | \ + FE_ALL_EXCEPT_DBL | FE_ALL_EXCEPT_DBL_1) + +/* + * Warning: some of these are single and some double precision only, + * because of the hardware implementation. + */ +#define FE_DIVBYZERO (FE_DIVBYZERO_SNGL | FE_DIVBYZERO_SNGL_1 | \ + FE_DIVBYZERO_SNGL_2 | FE_DIVBYZERO_SNGL_3) +#define FE_INEXACT (FE_INEXACT_DBL | FE_INEXACT_DBL_1) +#define FE_INVALID (FE_INVALID_DBL | FE_INVALID_DBL_1) +#define FE_NC_NAN (FE_NC_NAN_DBL | FE_NC_NAN_DBL_1) +#define FE_NC_DENORM (FE_NC_DENORM_DBL | FE_NC_DENORM_DBL_1) + +/* + * __FE_ROUND_ELE_n values are set so that they can easily be used as a + * mask when setting the fpscr. These tell us whether we are setting the + * round mode for a specific element (double precision floating point + * only, so there are only two elements). + */ +#define __FE_ROUND_ELE_0 0xc00 +#define __FE_ROUND_ELE_1 0x300 + +/* + * The following map directly to round values in the fpscr. + */ +#define __FE_SPU_TONEAREST 0 +#define __FE_SPU_TOWARDZERO 1 +#define __FE_SPU_UPWARD 2 +#define __FE_SPU_DOWNWARD 3 + +#define FE_TONEAREST (__FE_ROUND_ELE_0 | (__FE_SPU_TONEAREST << 2)) +#define FE_TOWARDZERO (__FE_ROUND_ELE_0 | (__FE_SPU_TOWARDZERO << 2)) +#define FE_UPWARD (__FE_ROUND_ELE_0 | (__FE_SPU_UPWARD << 2)) +#define FE_DOWNWARD (__FE_ROUND_ELE_0 | (__FE_SPU_DOWNWARD << 2)) + +#define FE_TONEAREST_1 (__FE_ROUND_ELE_1 | __FE_SPU_TONEAREST) +#define FE_TOWARDZERO_1 (__FE_ROUND_ELE_1 | __FE_SPU_TOWARDZERO) +#define FE_UPWARD_1 (__FE_ROUND_ELE_1 | __FE_SPU_UPWARD) +#define FE_DOWNWARD_1 (__FE_ROUND_ELE_1 | __FE_SPU_DOWNWARD) + +typedef unsigned int fexcept_t; +typedef unsigned int fenv_t; + +extern const fenv_t __fe_dfl_env; +#define FE_DFL_ENV (&__fe_dfl_env) + +#endif /* fenv.h */ diff --git a/lib/machine/spu/sys/linux_syscalls.h b/lib/machine/spu/sys/linux_syscalls.h new file mode 100644 index 0000000..a02e897 --- /dev/null +++ b/lib/machine/spu/sys/linux_syscalls.h @@ -0,0 +1,310 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#ifndef __LINUX_SYSCALLS_H +#define __LINUX_SYSCALLS_H + +#include + +/* The system call numbers. See kernel source file + arch/powerpc/include/asm/unistd.h. */ +#define __NR_read 3 +#define __NR_write 4 +#define __NR_open 5 +#define __NR_close 6 +#define __NR_waitpid 7 +#define __NR_creat 8 +#define __NR_link 9 +#define __NR_unlink 10 + +#define __NR_chdir 12 +#define __NR_time 13 +#define __NR_mkdod 14 +#define __NR_chmod 15 +#define __NR_lchown 16 + +#define __NR_lseek 19 +#define __NR_getpid 20 + +#define __NR_setuid 23 +#define __NR_getuid 24 +#define __NR_stime 25 + +#define __NR_alarm 27 + +#define __NR_access 33 +#define __NR_nice 34 + +#define __NR_sync 36 +#define __NR_kill 37 +#define __NR_rename 38 +#define __NR_mkdir 39 +#define __NR_rmdir 40 +#define __NR_dup 41 +#define __NR_pipe 42 +#define __NR_times 43 + +#define __NR_brk 45 +#define __NR_setgid 46 +#define __NR_getgid 47 + +#define __NR_geteuid 49 +#define __NR_getegid 50 + +#define __NR_ioctl 54 +#define __NR_fcntl 55 + +#define __NR_setpgid 57 + +#define __NR_umask 60 +#define __NR_chroot 61 + +#define __NR_dup2 63 +#define __NR_getppid 64 +#define __NR_getpgrp 65 +#define __NR_setsid 66 + +#define __NR_sgetmask 68 +#define __NR_ssetmask 69 +#define __NR_setreuid 70 +#define __NR_setregid 71 + +#define __NR_sethostname 74 +#define __NR_setrlimit 75 + +#define __NR_getrusage 77 +#define __NR_gettimeofday 78 +#define __NR_settimeofday 79 +#define __NR_getgroups 80 +#define __NR_setgroups 81 + +#define __NR_symlink 83 + +#define __NR_readlink 85 + +#define __NR_mmap 90 +#define __NR_munmap 91 +#define __NR_truncate 92 +#define __NR_ftruncate 93 +#define __NR_fchmod 94 +#define __NR_fchown 95 +#define __NR_getpriority 96 +#define __NR_setpriority 97 + +#define __NR_socketcall 102 +#define __NR_syslog 103 +#define __NR_setitimer 104 +#define __NR_getitimer 105 +#define __NR_newstat 106 +#define __NR_newlstat 107 +#define __NR_newfstat 108 + +#define __NR_vhangup 111 + +#define __NR_wait4 114 + +#define __NR_sysinfo 116 + +#define __NR_fsync 118 + +#define __NR_setdomainname 121 +#define __NR_newuname 122 + +#define __NR_adjtimex 124 +#define __NR_mprotect 125 + +#define __NR_getpgid 132 +#define __NR_fchdir 133 +#define __NR_bdflush 134 + +#define __NR_personality 136 + +#define __NR_setfsuid 138 +#define __NR_setfsgid 139 +#define __NR__llseek 140 +#define __NR_getdents 141 +#define __NR__newselect 142 +#define __NR_flock 143 +#define __NR_msync 144 +#define __NR_readv 145 +#define __NR_writev 146 +#define __NR_getsid 147 +#define __NR_fdatasync 148 + +#define __NR_mlock 150 +#define __NR_munlock 151 +#define __NR_mlockall 152 +#define __NR_munlockall 153 +#define __NR_sched_setparam 154 +#define __NR_sched_getparam 155 +#define __NR_sched_setscheduler 156 +#define __NR_sched_getscheduler 157 +#define __NR_sched_yield 158 +#define __NR_sched_get_priority_max 159 +#define __NR_sched_get_priority_min 160 +#define __NR_sched_rr_get_interval 161 +#define __NR_nanosleep 162 +#define __NR_mremap 163 +#define __NR_setresuid 164 +#define __NR_getresuid 165 + +#define __NR_poll 167 + +#define __NR_setresgid 169 +#define __NR_getresgid 170 +#define __NR_prctl 171 + +#define __NR_pread64 179 +#define __NR_pwrite64 180 +#define __NR_chown 181 +#define __NR_getcwd 182 +#define __NR_capget 183 +#define __NR_capset 184 + +#define __NR_sendfile 185 + +#define __NR_getrlimit 190 +#define __NR_readahead 191 + +#define __NR_getdents64 202 +#define __NR_pivot_root 203 + +#define __NR_madvise 205 +#define __NR_mincore 206 +#define __NR_gettid 207 +#define __NR_tkill 208 +#define __NR_setxattr 209 +#define __NR_lsetxattr 210 +#define __NR_fsetxattr 211 +#define __NR_getxattr 212 +#define __NR_lgetxattr 213 +#define __NR_fgetxattr 214 +#define __NR_listxattr 215 +#define __NR_llistxattr 216 +#define __NR_flistxattr 217 +#define __NR_removexattr 218 +#define __NR_lremovexattr 219 +#define __NR_fremovexattr 220 +#define __NR_futex 221 +#define __NR_sched_setaffinity 222 +#define __NR_sched_getaffinity 223 + +#define __NR_io_setup 227 +#define __NR_io_destroy 228 +#define __NR_io_getevents 229 +#define __NR_io_submit 230 +#define __NR_io_cancel 231 + +#define __NR_fadvise64 233 + +#define __NR_epoll_create 236 +#define __NR_epoll_ctl 237 +#define __NR_epoll_wait 238 +#define __NR_remap_file_pages 239 +#define __NR_timer_create 240 +#define __NR_timer_settime 241 +#define __NR_timer_gettime 242 +#define __NR_timer_getoverrun 243 +#define __NR_timer_delete 244 +#define __NR_clock_settime 245 +#define __NR_clock_gettime 246 +#define __NR_clock_getres 247 +#define __NR_clock_nanosleep 248 + +#define __NR_tgkill 250 +#define __NR_utimes 251 +#define __NR_statfs64 252 +#define __NR_fstatfs64 253 + +#define __NR_rtas 255 + +#define __NR_unshare 282 +#define __NR_splice 283 +#define __NR_tee 284 +#define __NR_vmsplice 285 +#define __NR_openat 286 +#define __NR_mkdirat 287 +#define __NR_mknodat 288 +#define __NR_fchownat 289 +#define __NR_futimesat 290 +#define __NR_fstatat64 291 +#define __NR_unlinkat 292 +#define __NR_renameat 293 +#define __NR_linkat 294 +#define __NR_symlinkat 295 +#define __NR_readlinkat 296 +#define __NR_fchmodat 297 +#define __NR_faccessat 298 +#define __NR_get_robust_list 299 +#define __NR_set_robust_list 300 +#define __NR_move_pages 301 +#define __NR_getcpu 302 + +#define __NR_utimensat 304 +#define __NR_signalfd 305 +#define __NR_timerfd 306 +#define __NR_eventfd 307 +#define __NR_sync_file_range2 308 +#define __NR_fallocate 309 +#define __NR_subpage_prot 310 +#define __NR_timerfd_settime 311 +#define __NR_timerfd_gettime 312 +#define __NR_signalfd4 313 +#define __NR_eventfd2 314 +#define __NR_epoll_create1 315 +#define __NR_dup3 316 +#define __NR_pipe2 317 +#define __NR_inotify_init1 318 + +/* System callbacks from the SPU. See kernel source file + arch/powerpc/include/asm/spu.h. */ +struct spu_syscall_block +{ + unsigned long long nr_ret; /* System call nr and return value. */ + unsigned long long parm[6]; /* System call arguments. */ +}; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Issues a Linux system call. */ +int __linux_syscall (struct spu_syscall_block *s); + +/* Linux system calls. */ +pid_t linux_getpid(void); +pid_t linux_gettid(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/machine/spu/sys/mman.h b/lib/machine/spu/sys/mman.h new file mode 100644 index 0000000..84fad62 --- /dev/null +++ b/lib/machine/spu/sys/mman.h @@ -0,0 +1,85 @@ +/* +(C) Copyright IBM Corp. 2007 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef _MMAN_H_ +#define _MMAN_H_ + +#include + +/* + * Prots to 'mmap'. + */ +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 +#define PROT_NONE 0x0 +/* + * Flags to 'mmap'. + */ +#define MAP_SHARED 0x001 +#define MAP_PRIVATE 0x002 +#define MAP_FIXED 0x010 +#define MAP_FILE 0x000 +#define MAP_ANONYMOUS 0x020 +#define MAP_ANON MAP_ANONYMOUS +#define MAP_GROWSDOWN 0x0100 +#define MAP_DENYWRITE 0x0800 +#define MAP_EXECUTABLE 0x1000 +#define MAP_LOCKED 0x0080 +#define MAP_NORESERVE 0x0040 +/* + * Failed flag from 'mmap'. + */ +#define MAP_FAILED_EADDR ((unsigned long long) (-1LL)) +/* + * Flags to 'mremap'. + */ +#define MREMAP_MAYMOVE 1 +/* + * Flags to 'msync'. + */ +#define MS_ASYNC 1 +#define MS_SYNC 4 +#define MS_INVALIDATE 2 + + +extern int shm_open(const char *name, int oflag, mode_t mode); +extern int shm_unlink(const char * name); + +unsigned long long mmap_eaddr(unsigned long long start, size_t length, int + prot, int flags, int fd, off_t offset); +unsigned long long mremap_eaddr(unsigned long long old_addr, size_t + old_size, size_t new_size, int flags); +unsigned long long msync_eaddr(unsigned long long start, size_t length, + int flags); +unsigned long long munmap_eaddr(unsigned long long start, size_t length); + +#endif /* _MMAN_H_ */ diff --git a/lib/machine/spu/sys/sched.h b/lib/machine/spu/sys/sched.h new file mode 100644 index 0000000..60d95c9 --- /dev/null +++ b/lib/machine/spu/sys/sched.h @@ -0,0 +1,12 @@ +#ifndef _SYS_SCHED_H +#define _SYS_SCHED_H +#ifdef __cplusplus +extern "C" { +#endif + +int sched_yield(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/machine/spu/sys/syscall.h b/lib/machine/spu/sys/syscall.h new file mode 100644 index 0000000..caac531 --- /dev/null +++ b/lib/machine/spu/sys/syscall.h @@ -0,0 +1,10 @@ +#ifndef _SYS_SYSCALL_H +#define _SYS_SYSCALL_H +#ifdef __cplusplus +extern "C" { +#endif +int __send_to_ppe(unsigned int signalcode, unsigned int opcode, void *data); +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/machine/spu/sys/uio.h b/lib/machine/spu/sys/uio.h new file mode 100644 index 0000000..9ed1549 --- /dev/null +++ b/lib/machine/spu/sys/uio.h @@ -0,0 +1,26 @@ +#ifndef _SYS_UIO_H +#define _SYS_UIO_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Per POSIX + */ + +struct iovec { + void *iov_base; + size_t iov_len; +}; + +ssize_t readv(int, const struct iovec *, int); +ssize_t writev(int, const struct iovec *, int); + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/lib/machine/spu/sys/utime.h b/lib/machine/spu/sys/utime.h new file mode 100644 index 0000000..18731a1 --- /dev/null +++ b/lib/machine/spu/sys/utime.h @@ -0,0 +1,23 @@ +#ifndef _SYS_UTIME_H +#define _SYS_UTIME_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Per POSIX + */ +struct utimbuf +{ + time_t actime; + time_t modtime; +}; + +int utime(const char *, const struct utimbuf *); + +#ifdef __cplusplus +}; +#endif + +#endif diff --git a/lib/machine/spu/syscall.def b/lib/machine/spu/syscall.def new file mode 100644 index 0000000..bcf2e47 --- /dev/null +++ b/lib/machine/spu/syscall.def @@ -0,0 +1,38 @@ +# +# (C) Copyright 2007 TOSHIBA CORPORATION +# All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the names of Toshiba nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# +# OPCODE NAME FP PARMS(Number of fixed arguments) +# +SPE_C99_VFPRINTF fprintf 1 2 +SPE_C99_VFSCANF fscanf 1 2 +SPE_C99_VPRINTF printf 0 1 +SPE_C99_VSCANF scanf 0 1 +SPE_C99_VSNPRINTF snprintf 0 3 +SPE_C99_VSPRINTF sprintf 0 2 +SPE_C99_VSSCANF sscanf 0 2 diff --git a/lib/machine/spu/tmpfile.c b/lib/machine/spu/tmpfile.c new file mode 100644 index 0000000..e926cbc --- /dev/null +++ b/lib/machine/spu/tmpfile.c @@ -0,0 +1,65 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +#ifndef _REENT_ONLY + +FILE * +tmpfile (void) +{ + int ret; + FILE* fp; + struct _reent *ptr = _REENT; + + CHECK_INIT(ptr); + + fp = __sfp(ptr); + if (!fp) { + return NULL; + } + + ret = __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_TMPFILE, &ret); + + if (ret) { + fp->_fp = ret; + return fp; + } + else { + __sfp_free(fp); + return NULL; + } +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/tmpnam.c b/lib/machine/spu/tmpnam.c new file mode 100644 index 0000000..898a1a7 --- /dev/null +++ b/lib/machine/spu/tmpnam.c @@ -0,0 +1,43 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include + +#include "c99ppe.h" + +char * +tmpnam (char *s) +{ + /* The return value gets written over buf + */ + return (char*) __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_TMPNAM, &s); +} diff --git a/lib/machine/spu/ungetc.c b/lib/machine/spu/ungetc.c new file mode 100644 index 0000000..631e71d --- /dev/null +++ b/lib/machine/spu/ungetc.c @@ -0,0 +1,63 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +typedef struct +{ + int c; + unsigned int pad0[ 3 ]; + int fp; + unsigned int pad1[ 3 ]; +} c99_ungetc_t; + +#ifndef _REENT_ONLY + +int +ungetc (c, fp) + int c; + register FILE *fp; +{ + c99_ungetc_t args; + + CHECK_INIT(_REENT); + + args.c = c; + args.fp = fp->_fp; + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_UNGETC, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/usleep.c b/lib/machine/spu/usleep.c new file mode 100644 index 0000000..c587f31 --- /dev/null +++ b/lib/machine/spu/usleep.c @@ -0,0 +1,18 @@ +/* Copied from libc/posix/usleep.c, removed the check for HAVE_NANOSLEEP */ + +/* Written 2002 by Jeff Johnston */ + +#include +#include +#include + +int usleep(useconds_t useconds) +{ + struct timespec ts; + + ts.tv_sec = (long int)useconds / 1000000; + ts.tv_nsec = ((long int)useconds % 1000000) * 1000; + if (!nanosleep(&ts,&ts)) return 0; + if (errno == EINTR) return ts.tv_sec; + return -1; +} diff --git a/lib/machine/spu/vec_literal.h b/lib/machine/spu/vec_literal.h new file mode 100644 index 0000000..d376a1b --- /dev/null +++ b/lib/machine/spu/vec_literal.h @@ -0,0 +1,70 @@ +/* + (C) Copyright 2001,2006, + International Business Machines Corporation, + Sony Computer Entertainment, Incorporated, + Toshiba Corporation, + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the names of the copyright holders nor the names of their + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef _VEC_LITERAL_H_ +#define _VEC_LITERAL_H_ + +/* This header files provides an abstraction for the various implementations + * of vector literal construction. The two formats are: + * + * 1) Altivec styled using parenthesis + * 2) C grammer friendly styled using curly braces + * + * The macro, VEC_LITERAL has been developed to provide some portability + * in these two styles. To achieve true portability, user must specify all + * elements of the vector being initialized. A single element can be provided + * but only the first element guarenteed across both construction styles. + * + * The VEC_SPLAT_* macros have been provided for portability of vector literal + * construction when all the elements of the vector contain the same value. + */ + +/* Use curly brace style. + */ +#define VEC_LITERAL(_type, ...) ((_type){__VA_ARGS__}) + +#define VEC_SPLAT_U8(_val) ((__vector unsigned char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val}) +#define VEC_SPLAT_S8(_val) ((__vector signed char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val}) + +#define VEC_SPLAT_U16(_val) ((__vector unsigned short){_val, _val, _val, _val, _val, _val, _val, _val}) +#define VEC_SPLAT_S16(_val) ((__vector signed short){_val, _val, _val, _val, _val, _val, _val, _val}) + +#define VEC_SPLAT_U32(_val) ((__vector unsigned int){_val, _val, _val, _val}) +#define VEC_SPLAT_S32(_val) ((__vector signed int){_val, _val, _val, _val}) +#define VEC_SPLAT_F32(_val) ((__vector float){_val, _val, _val, _val}) + +#define VEC_SPLAT_U64(_val) ((__vector unsigned long long){_val, _val}) +#define VEC_SPLAT_S64(_val) ((__vector signed long long){_val, _val}) +#define VEC_SPLAT_F64(_val) ((__vector double){_val, _val}) + +#endif /* _VEC_LITERAL_H_ */ diff --git a/lib/machine/spu/vfiprintf.c b/lib/machine/spu/vfiprintf.c new file mode 100644 index 0000000..83394a6 --- /dev/null +++ b/lib/machine/spu/vfiprintf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vfprintf.c" diff --git a/lib/machine/spu/vfiscanf.c b/lib/machine/spu/vfiscanf.c new file mode 100644 index 0000000..261122e --- /dev/null +++ b/lib/machine/spu/vfiscanf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vfscanf.c" diff --git a/lib/machine/spu/vfprintf.c b/lib/machine/spu/vfprintf.c new file mode 100644 index 0000000..deda415 --- /dev/null +++ b/lib/machine/spu/vfprintf.c @@ -0,0 +1,71 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vfprintf vfiprintf +#endif + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + char* fmt; + unsigned int pad1[ 3 ]; + va_list ap; +} c99_vfprintf_t; + +#ifndef _REENT_ONLY + +int +vfprintf (FILE *__restrict fp, + const char *__restrict fmt0, + va_list ap) +{ + c99_vfprintf_t args; + + CHECK_INIT(_REENT); + + args.fp = fp->_fp; + args.fmt = (char*) fmt0; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VFPRINTF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/vfscanf.c b/lib/machine/spu/vfscanf.c new file mode 100644 index 0000000..9e093ba --- /dev/null +++ b/lib/machine/spu/vfscanf.c @@ -0,0 +1,71 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vfscanf vfiscanf +#endif + +typedef struct +{ + int fp; + unsigned int pad0[ 3 ]; + char* fmt; + unsigned int pad1[ 3 ]; + va_list ap; +} c99_vfscanf_t; + +#ifndef _REENT_ONLY + +int +vfscanf (FILE *__restrict fp, + const char *__restrict fmt, + va_list ap) +{ + c99_vfscanf_t args; + + CHECK_INIT(_REENT); + + args.fp = fp->_fp; + args.fmt = (char*) fmt; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VFSCANF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/viprintf.c b/lib/machine/spu/viprintf.c new file mode 100644 index 0000000..f0753ff --- /dev/null +++ b/lib/machine/spu/viprintf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vprintf.c" diff --git a/lib/machine/spu/viscanf.c b/lib/machine/spu/viscanf.c new file mode 100644 index 0000000..4e239e3 --- /dev/null +++ b/lib/machine/spu/viscanf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vscanf.c" diff --git a/lib/machine/spu/vprintf.c b/lib/machine/spu/vprintf.c new file mode 100644 index 0000000..d2ebc4e --- /dev/null +++ b/lib/machine/spu/vprintf.c @@ -0,0 +1,33 @@ +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vprintf viprintf +#endif + +typedef struct +{ + const char* fmt; + unsigned int pad0[ 3 ]; + va_list ap; +} c99_vprintf_t; + +#ifndef _REENT_ONLY + +int +vprintf (const char *fmt, + va_list ap) +{ + c99_vprintf_t args; + + args.fmt = fmt; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VPRINTF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/vscanf.c b/lib/machine/spu/vscanf.c new file mode 100644 index 0000000..c246d57 --- /dev/null +++ b/lib/machine/spu/vscanf.c @@ -0,0 +1,65 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vscanf viscanf +#endif + +typedef struct +{ + char* fmt; + unsigned int pad0[ 3 ]; + va_list ap; +} c99_vscanf_t; + +#ifndef _REENT_ONLY + +int +vscanf (const char *fmt, + va_list ap) +{ + c99_vscanf_t args; + + args.fmt = (char*) fmt; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VSCANF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/vsiprintf.c b/lib/machine/spu/vsiprintf.c new file mode 100644 index 0000000..fbd64e4 --- /dev/null +++ b/lib/machine/spu/vsiprintf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vsprintf.c" diff --git a/lib/machine/spu/vsiscanf.c b/lib/machine/spu/vsiscanf.c new file mode 100644 index 0000000..73a44cd --- /dev/null +++ b/lib/machine/spu/vsiscanf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vsscanf.c" diff --git a/lib/machine/spu/vsniprintf.c b/lib/machine/spu/vsniprintf.c new file mode 100644 index 0000000..fb6f641 --- /dev/null +++ b/lib/machine/spu/vsniprintf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vsnprintf.c" diff --git a/lib/machine/spu/vsnprintf.c b/lib/machine/spu/vsnprintf.c new file mode 100644 index 0000000..298165f --- /dev/null +++ b/lib/machine/spu/vsnprintf.c @@ -0,0 +1,43 @@ +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vsnprintf vsniprintf +#endif + +typedef struct +{ + char* str; + unsigned int pad0[ 3 ]; + size_t size; + unsigned int pad1[ 3 ]; + const char* fmt; + unsigned int pad2[ 3 ]; + va_list ap; +} c99_vsnprintf_t; + +#ifndef _REENT_ONLY + +int +vsnprintf (char *__restrict str, + size_t size, + const char *__restrict fmt, + va_list ap) +{ + c99_vsnprintf_t args; + + CHECK_STR_INIT(_REENT); + + args.str = str; + args.size = size; + args.fmt = fmt; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VSNPRINTF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/vsprintf.c b/lib/machine/spu/vsprintf.c new file mode 100644 index 0000000..8317a66 --- /dev/null +++ b/lib/machine/spu/vsprintf.c @@ -0,0 +1,40 @@ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vsprintf vsiprintf +#endif + +typedef struct +{ + char *str; + unsigned int pad0[ 3 ]; + char *fmt; + unsigned int pad1[ 3 ]; + va_list ap; +} c99_vsprintf_t; + +#ifndef _REENT_ONLY + +int +vsprintf (char *__restrict str, + const char *__restrict fmt, + va_list ap) +{ + c99_vsprintf_t args; + + CHECK_STR_INIT(_REENT); + + args.str = str; + args.fmt = (char*) fmt; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VSPRINTF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/vsscanf.c b/lib/machine/spu/vsscanf.c new file mode 100644 index 0000000..ed64214 --- /dev/null +++ b/lib/machine/spu/vsscanf.c @@ -0,0 +1,71 @@ +/* +(C) Copyright IBM Corp. 2006 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Joel Schopp +*/ + +#include <_ansi.h> +#include + +#include "c99ppe.h" + +#include + +#ifdef INTEGER_ONLY +# define vsscanf vsiscanf +#endif + +typedef struct +{ + const char *str; + unsigned int pad0[ 3 ]; + const char *fmt; + unsigned int pad1[ 3 ]; + va_list ap; +} c99_vsscanf_t; + +#ifndef _REENT_ONLY + +int +vsscanf (const char *__restrict str, + const char *__restrict fmt, + va_list ap) +{ + c99_vsscanf_t args; + + CHECK_STR_INIT(_REENT); + + args.str = str; + args.fmt = (char*) fmt; + va_copy(args.ap,ap); + + return __send_to_ppe(SPE_C99_SIGNALCODE, SPE_C99_VSSCANF, &args); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/machine/spu/write_ea.c b/lib/machine/spu/write_ea.c new file mode 100644 index 0000000..05d6bdf --- /dev/null +++ b/lib/machine/spu/write_ea.c @@ -0,0 +1,60 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include "ea_internal.h" +#include +#include +#include "sys/linux_syscalls.h" + +extern void __cache_flush (void) __attribute__ ((weak)); + + +COMPAT_EA_ALIAS (write_ea); + +ssize_ea_t +write_ea (int fd, __ea const void *buf, size_ea_t count) +{ + struct spu_syscall_block s = { + __NR_write, + { + fd, + (size_ea_t) buf, + count, + 0, + 0, + 0} + }; + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + return __linux_syscall (&s); +} diff --git a/lib/machine/spu/writev_ea.c b/lib/machine/spu/writev_ea.c new file mode 100644 index 0000000..efda38b --- /dev/null +++ b/lib/machine/spu/writev_ea.c @@ -0,0 +1,69 @@ +/* +(C) Copyright IBM Corp. 2008 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +Author: Ken Werner +*/ + +#include "ea_internal.h" +#include +#include +#include "sys/linux_syscalls.h" + +extern void __cache_flush (void) __attribute__ ((weak)); + +COMPAT_EA_ALIAS (writev_ea); + +ssize_ea_t +writev_ea (int fd, struct iovec_ea *vector, int count) +{ +#ifdef __EA32__ + int i; +#endif + struct spu_syscall_block s = { + __NR_writev, + { + fd, + (size_ea_t) (__ea void *) vector, + count, + 0, + 0, + 0} + }; +#ifdef __EA32__ + for (i = 0; i < count; ++i) + { + vector[i].__pad1 = 0x0; /* 32 bit padding */ + vector[i].__pad2 = 0x0; /* 32 bit padding */ + } +#endif + /* Flush cache only if the application really uses the software cache. */ + if (__cache_flush) + __cache_flush (); + return __linux_syscall (&s); +} diff --git a/lib/machine/tic4x/Makefile.inc b/lib/machine/tic4x/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/tic4x/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/tic4x/setjmp.S b/lib/machine/tic4x/setjmp.S new file mode 100644 index 0000000..d6e8d25 --- /dev/null +++ b/lib/machine/tic4x/setjmp.S @@ -0,0 +1,75 @@ +/* setjmp/longjmp routines. + * + * Written by Michael Hayes . + * + * The author hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + + .sect .text + .global setjmp + .global longjmp + +setjmp: + pop r1 + ldi sp, ar0 +#ifndef _REGPARM + ldi *ar0, ar2 +#endif + + sti r4, *ar2++ + sti r5, *ar2++ + stf r6, *ar2++ + stf r7, *ar2++ +#ifdef _TMS320C4x + sti r8, *ar2++ +#endif + sti ar3, *ar2++ + sti ar4, *ar2++ + sti ar5, *ar2++ + sti ar6, *ar2++ + sti ar7, *ar2++ + bd r1 + sti r1, *ar2++ + sti ar0, *ar2 + ldi 0, r0 + + +longjmp: +#ifndef _REGPARM + ldi sp, ar0 + ldi *-ar0(1), ar2 + ldi *-ar0(2), r0 + ldiz 1, r0 +#else + ldi r2, r0 + ldiz 1, r0 +#endif + + ldi *ar2++, r4 + ldi *ar2++, r5 + ldf *ar2++, r6 + ldf *ar2++, r7 +#ifdef _TMS320C4x + ldi *ar2++, r8 +#endif + ldi *ar2++, ar3 + ldi *ar2++, ar4 + ldi *ar2++, ar5 + ldi *ar2++, ar6 + ldi *ar2++, ar7 + ldi *ar2++, r1 + ldi *ar2, sp + + b r1 + .end + + + diff --git a/lib/machine/tic6x/Makefile.inc b/lib/machine/tic6x/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/tic6x/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/tic6x/setjmp.S b/lib/machine/tic6x/setjmp.S new file mode 100644 index 0000000..cd40d58 --- /dev/null +++ b/lib/machine/tic6x/setjmp.S @@ -0,0 +1,96 @@ +;****************************************************************************** +;* SETJMP v7.2.0I10181 * +;* * +;* Copyright (c) 1996-2010 Texas Instruments Incorporated * +;* http://www.ti.com/ * +;* * +;* Redistribution and use in source and binary forms, with or without * +;* modification, are permitted provided that the following conditions * +;* are met: * +;* * +;* Redistributions of source code must retain the above copyright * +;* notice, this list of conditions and the following disclaimer. * +;* * +;* Redistributions in binary form must reproduce the above copyright * +;* notice, this list of conditions and the following disclaimer in * +;* the documentation and/or other materials provided with the * +;* distribution. * +;* * +;* Neither the name of Texas Instruments Incorporated nor the names * +;* of its contributors may be used to endorse or promote products * +;* derived from this software without specific prior written * +;* permission. * +;* * +;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * +;* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * +;* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * +;* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * +;* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * +;* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * +;* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * +;* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * +;* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * +;* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * +;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * +;* * +;****************************************************************************** + +.text +.globl setjmp +.type setjmp,%function +setjmp: + MV .L2X A4, B4 +|| STW .D1T2 B3, *+A4(48) + + STW .D1T1 A10, *+A4(0) +|| STW .D2T2 B10, *+B4(4) +|| RET .S2 B3 + + STW .D1T1 A11, *+A4(8) +|| STW .D2T2 B11, *+B4(12) + + STW .D1T1 A12, *+A4(16) +|| STW .D2T2 B12, *+B4(20) + + STW .D1T1 A13, *+A4(24) +|| STW .D2T2 B13, *+B4(28) + + STW .D1T1 A14, *+A4(32) +|| STW .D2T2 B14, *+B4(36) + + STW .D1T1 A15, *+A4(40) +|| STW .D2T2 B15, *+B4(44) +|| ZERO .S1 A4 +.size setjmp, . - setjmp + +.globl longjmp +.type longjmp,%function +longjmp: + LDW .D1T1 *+A4(48), A3 + + MV .L2X A4, B6 +|| MV .S1 A4, A6 +|| MV .D2 B4, B2 + + LDW .D1T1 *+A6(0), A10 +|| LDW .D2T2 *+B6(4), B10 +|| [B2] MV .L1X B4, A4 +|| [!B2] MVK .S1 1, A4 + + LDW .D1T1 *+A6(8), A11 +|| LDW .D2T2 *+B6(12), B11 + + LDW .D1T1 *+A6(16), A12 +|| LDW .D2T2 *+B6(20), B12 + + LDW .D1T1 *+A6(24), A13 +|| LDW .D2T2 *+B6(28), B13 + + LDW .D1T1 *+A6(32), A14 +|| LDW .D2T2 *+B6(36), B14 + + LDW .D1T1 *+A6(40), A15 +|| LDW .D2T2 *+B6(44), B15 +|| RET .S2X A3 + NOP 5 +.size longjmp, . - longjmp diff --git a/lib/machine/tic80/Makefile.inc b/lib/machine/tic80/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/tic80/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/tic80/setjmp.S b/lib/machine/tic80/setjmp.S new file mode 100644 index 0000000..1946344 --- /dev/null +++ b/lib/machine/tic80/setjmp.S @@ -0,0 +1,50 @@ +/* These are predefined by new versions of GNU cpp. */ + +#ifndef __USER_LABEL_PREFIX__ +#define __USER_LABEL_PREFIX__ _ +#endif + +/* ANSI concatenation macros. */ + +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ + +#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x) + + .global SYM (setjmp) + .global SYM (_setjmp) + .global SYM (longjmp) + + .section .text,"x" + .align 4 +SYM (_setjmp): +SYM (setjmp): + st.d 0(r2),r20 + st.d 8(r2),r22 + st.d 16(r2),r24 + st.d 24(r2),r26 + st.d 32(r2),r28 + st.d 40(r2),r30 + st 48(r2),r1 + jsr r31(r0),r0 + addu 0,r0,r2 + + .section .text,"x" + .align 4 +SYM (longjmp): + ld.d 0(r2),r20 + ld.d 8(r2),r22 + ld.d 16(r2),r24 + ld.d 24(r2),r26 + ld.d 32(r2),r28 + ld.d 40(r2),r30 + bcnd L1,r4,ne0.w + ld 48(r2),r1 + + jsr r31(r0),r0 + addu 1,r0,r2 +L1: + jsr r31(r0),r0 + addu r4,r0,r2 diff --git a/lib/machine/v850/Makefile.inc b/lib/machine/v850/Makefile.inc new file mode 100644 index 0000000..67137bc --- /dev/null +++ b/lib/machine/v850/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S diff --git a/lib/machine/v850/setjmp.S b/lib/machine/v850/setjmp.S new file mode 100644 index 0000000..4b01537 --- /dev/null +++ b/lib/machine/v850/setjmp.S @@ -0,0 +1,47 @@ + .file "setjmp.S" + + .section .text + .align 1 + .global _setjmp +_setjmp: + st.w r1,0[r6] + st.w r3,4[r6] + st.w r4,8[r6] + st.w r20,12[r6] + st.w r21,16[r6] + st.w r22,20[r6] + st.w r23,24[r6] + st.w r24,28[r6] + st.w r25,32[r6] + st.w r26,36[r6] + st.w r27,40[r6] + st.w r28,44[r6] + st.w r29,48[r6] + st.w r30,52[r6] + st.w r31,56[r6] + mov r0, r10 + jmp [r31] + + .global _longjmp +_longjmp: + ld.w 0[r6],r1 + ld.w 4[r6],r3 + ld.w 8[r6],r4 + ld.w 12[r6],r20 + ld.w 16[r6],r21 + ld.w 20[r6],r22 + ld.w 24[r6],r23 + ld.w 28[r6],r24 + ld.w 32[r6],r25 + ld.w 36[r6],r26 + ld.w 40[r6],r27 + ld.w 44[r6],r28 + ld.w 48[r6],r29 + ld.w 52[r6],r30 + ld.w 56[r6],r31 + cmp r7, r0 + jne 1f + mov 1,r7 +1: + mov r7, r10 + jmp [r31] diff --git a/lib/machine/visium/Makefile.inc b/lib/machine/visium/Makefile.inc new file mode 100644 index 0000000..f931eaa --- /dev/null +++ b/lib/machine/visium/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/memcpy.c %D%/memset.c %D%/memmove.c %D%/setjmp.S diff --git a/lib/machine/visium/memcpy.c b/lib/machine/visium/memcpy.c new file mode 100644 index 0000000..e644031 --- /dev/null +++ b/lib/machine/visium/memcpy.c @@ -0,0 +1,879 @@ +/* memcpy for the Visium processor. + + Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. */ + +/* This file must be kept in sync with libgcc/config/visium/memcpy.c */ + +#include +#include "memcpy.h" +#include "../../string/local.h" + +#define INST_BARRIER __asm__ __volatile__ ("":::"memory"); + +#define MOVE_32_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + out [7] = m3; \ + INST_BARRIER \ + m0 = in [8]; \ + m1 = in [9]; \ + m2 = in [10]; \ + m3 = in [11]; \ + out [8] = m0; \ + out [9] = m1; \ + out [10] = m2; \ + out [11] = m3; \ + INST_BARRIER \ + m0 = in [12]; \ + m1 = in [13]; \ + m2 = in [14]; \ + m3 = in [15]; \ + out [12] = m0; \ + out [13] = m1; \ + out [14] = m2; \ + out [15] = m3; \ + INST_BARRIER \ + m0 = in [16]; \ + m1 = in [17]; \ + m2 = in [18]; \ + m3 = in [19]; \ + out [16] = m0; \ + out [17] = m1; \ + out [18] = m2; \ + out [19] = m3; \ + INST_BARRIER \ + m0 = in [20]; \ + m1 = in [21]; \ + m2 = in [22]; \ + m3 = in [23]; \ + out [20] = m0; \ + out [21] = m1; \ + out [22] = m2; \ + out [23] = m3; \ + INST_BARRIER \ + m0 = in [24]; \ + m1 = in [25]; \ + m2 = in [26]; \ + m3 = in [27]; \ + out [24] = m0; \ + out [25] = m1; \ + out [26] = m2; \ + out [27] = m3; \ + INST_BARRIER \ + m0 = in [28]; \ + m1 = in [29]; \ + m2 = in [30]; \ + m3 = in [31]; \ + out [28] = m0; \ + out [29] = m1; \ + out [30] = m2; \ + out [31] = m3; \ + INST_BARRIER \ + in += 32; \ + out += 32; \ +} while(0) + +#define MOVE_16_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + out [7] = m3; \ + INST_BARRIER \ + m0 = in [8]; \ + m1 = in [9]; \ + m2 = in [10]; \ + m3 = in [11]; \ + out [8] = m0; \ + out [9] = m1; \ + out [10] = m2; \ + out [11] = m3; \ + INST_BARRIER \ + m0 = in [12]; \ + m1 = in [13]; \ + m2 = in [14]; \ + m3 = in [15]; \ + out [12] = m0; \ + out [13] = m1; \ + out [14] = m2; \ + out [15] = m3; \ + INST_BARRIER \ + in += 16; \ + out += 16; \ +} while(0) + +#define MOVE_12_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + out [7] = m3; \ + INST_BARRIER \ + m0 = in [8]; \ + m1 = in [9]; \ + m2 = in [10]; \ + m3 = in [11]; \ + out [8] = m0; \ + out [9] = m1; \ + out [10] = m2; \ + out [11] = m3; \ + INST_BARRIER \ + in += 12; \ + out += 12; \ +} while(0) + +#define MOVE_11_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + out [7] = m3; \ + INST_BARRIER \ + m0 = in [8]; \ + m1 = in [9]; \ + m2 = in [10]; \ + out [8] = m0; \ + out [9] = m1; \ + out [10] = m2; \ + INST_BARRIER \ + in += 11; \ + out += 11; \ +} while(0) + +#define MOVE_10_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + m0 = in [8]; \ + out [5] = m1; \ + m1 = in [9]; \ + out [6] = m2; \ + out [7] = m3; \ + out [8] = m0; \ + out [9] = m1; \ + INST_BARRIER \ + in += 10; \ + out += 10; \ +} while(0) + +#define MOVE_9_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + out [7] = m3; \ + INST_BARRIER \ + m0 = in [8]; \ + out [8] = m0; \ + in += 9; \ + out += 9; \ +} while(0) + +#define MOVE_8_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + m3 = in [7]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + out [7] = m3; \ + INST_BARRIER \ + in += 8; \ + out += 8; \ +} while(0) + +#define MOVE_7_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + m0 = in [4]; \ + m1 = in [5]; \ + m2 = in [6]; \ + out [4] = m0; \ + out [5] = m1; \ + out [6] = m2; \ + INST_BARRIER \ + in += 7; \ + out += 7; \ +} while(0) + +#define MOVE_6_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + INST_BARRIER \ + m0 = in [4]; \ + out [1] = m1; \ + INST_BARRIER \ + m1 = in [5]; \ + out [2] = m2; \ + out [3] = m3; \ + out [4] = m0; \ + out [5] = m1; \ + INST_BARRIER \ + in += 6; \ + out += 6; \ +} while(0) + +#define MOVE_5_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + INST_BARRIER \ + out [0] = m0; \ + m0 = in [4]; \ + INST_BARRIER \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + out [4] = m0; \ + INST_BARRIER \ + in += 5; \ + out += 5; \ +} while(0) + +#define MOVE_4_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + m3 = in [3]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + out [3] = m3; \ + INST_BARRIER \ + in += 4; \ + out += 4; \ +} while(0) + +#define MOVE_3_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + m2 = in [2]; \ + out [0] = m0; \ + out [1] = m1; \ + out [2] = m2; \ + INST_BARRIER \ + in += 3; \ + out += 3; \ +} while(0) + +#define MOVE_2_OBJECTS(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + m1 = in [1]; \ + out [0] = m0; \ + out [1] = m1; \ + INST_BARRIER \ + in += 2; \ + out += 2; \ +} while(0) + +#define MOVE_1_OBJECT(in,out) \ +do { \ + INST_BARRIER \ + m0 = in [0]; \ + out [0] = m0; \ + INST_BARRIER \ + in += 1; \ + out += 1; \ +} while(0) + + +static inline void +__inhibit_loop_to_libcall +__int_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) +{ + int value = n; + int loop_var; + const int *in = s2; + int *out = s1; + int count; + int m0,m1,m2,m3; + + /* This code currently give a stall for any value with a 1->2 in the low 5 + bits, i.e. 1,2, 33,34 ? not acceptable! */ + switch (value & 0x1f) + { + case 0: + break; + case 1: + MOVE_1_OBJECT (in, out); + break; + case 2: + MOVE_2_OBJECTS (in, out); + break; + case 3: + MOVE_3_OBJECTS (in, out); + break; + case 4: + MOVE_4_OBJECTS (in, out); + break; + case 5: + MOVE_5_OBJECTS (in, out); + break; + case 6: + MOVE_6_OBJECTS (in, out); + break; + case 7: + MOVE_7_OBJECTS (in, out); + break; + case 8: + MOVE_8_OBJECTS (in, out); + break; + case 9: + MOVE_9_OBJECTS (in, out); + break; + case 10: + MOVE_10_OBJECTS (in, out); + break; + case 11: + MOVE_11_OBJECTS (in, out); + break; + case 12: + MOVE_12_OBJECTS (in, out); + break; + case 13: + MOVE_9_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 14: + MOVE_12_OBJECTS (in, out); + MOVE_2_OBJECTS (in, out); + break; + case 15: + MOVE_11_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 16: + MOVE_16_OBJECTS (in, out); + break; + case 17: + MOVE_11_OBJECTS (in, out); + MOVE_6_OBJECTS (in, out); + break; + case 18: + MOVE_9_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + break; + case 19: + MOVE_16_OBJECTS (in, out); + MOVE_3_OBJECTS (in, out); + break; + case 20: + MOVE_16_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 21: + MOVE_16_OBJECTS (in, out); + MOVE_5_OBJECTS (in, out); + break; + case 22: + MOVE_16_OBJECTS (in, out); + MOVE_6_OBJECTS (in, out); + break; + case 23: + MOVE_16_OBJECTS (in, out); + MOVE_7_OBJECTS (in, out); + break; + case 24: + MOVE_16_OBJECTS (in, out); + MOVE_8_OBJECTS (in, out); + break; + case 25: + MOVE_16_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + break; + case 26: + MOVE_16_OBJECTS (in, out); + MOVE_10_OBJECTS (in, out); + break; + case 27: + MOVE_16_OBJECTS (in, out); + MOVE_11_OBJECTS (in, out); + break; + case 28: + MOVE_16_OBJECTS (in, out); + MOVE_8_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 29: + MOVE_16_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 30: + MOVE_16_OBJECTS (in, out); + MOVE_12_OBJECTS (in, out); + MOVE_2_OBJECTS (in, out); + break; + case 31: + MOVE_16_OBJECTS (in, out); + MOVE_11_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + } + + /* This loop governs the asmptoptic behaviour of this algorithm, for long + word copies. */ + count = value >> 5; + for (loop_var = 0; loop_var < count; loop_var++) + MOVE_32_OBJECTS (in, out); +} + +static inline void +__inhibit_loop_to_libcall +__shrt_int_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) +{ + int value = n; + int loop_var; + const short int *in = s2; + int short *out = s1; + int count; + int m0,m1,m2,m3; + + /* This code currently give a stall for any value with a 1->2 in the low 5 + bits, i.e. 1,2, 33,34 ? not acceptable! */ + switch (value & 0x1f) + { + case 0: + break; + case 1: + MOVE_1_OBJECT (in, out); + break; + case 2: + MOVE_2_OBJECTS (in, out); + break; + case 3: + MOVE_3_OBJECTS (in, out); + break; + case 4: + MOVE_4_OBJECTS (in, out); + break; + case 5: + MOVE_5_OBJECTS (in, out); + break; + case 6: + MOVE_6_OBJECTS (in, out); + break; + case 7: + MOVE_7_OBJECTS (in, out); + break; + case 8: + MOVE_8_OBJECTS (in, out); + break; + case 9: + MOVE_9_OBJECTS (in, out); + break; + case 10: + MOVE_10_OBJECTS (in, out); + break; + case 11: + MOVE_11_OBJECTS (in, out); + break; + case 12: + MOVE_12_OBJECTS (in, out); + break; + case 13: + MOVE_9_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 14: + MOVE_12_OBJECTS (in, out); + MOVE_2_OBJECTS (in, out); + break; + case 15: + MOVE_11_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 16: + MOVE_16_OBJECTS (in, out); + break; + case 17: + MOVE_11_OBJECTS (in, out); + MOVE_6_OBJECTS (in, out); + break; + case 18: + MOVE_9_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + break; + case 19: + MOVE_16_OBJECTS (in, out); + MOVE_3_OBJECTS (in, out); + break; + case 20: + MOVE_16_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 21: + MOVE_16_OBJECTS (in, out); + MOVE_5_OBJECTS (in, out); + break; + case 22: + MOVE_16_OBJECTS (in, out); + MOVE_6_OBJECTS (in, out); + break; + case 23: + MOVE_16_OBJECTS (in, out); + MOVE_7_OBJECTS (in, out); + break; + case 24: + MOVE_16_OBJECTS (in, out); + MOVE_8_OBJECTS (in, out); + break; + case 25: + MOVE_16_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + break; + case 26: + MOVE_16_OBJECTS (in, out); + MOVE_10_OBJECTS (in, out); + break; + case 27: + MOVE_16_OBJECTS (in, out); + MOVE_11_OBJECTS (in, out); + break; + case 28: + MOVE_16_OBJECTS (in, out); + MOVE_8_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 29: + MOVE_16_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 30: + MOVE_16_OBJECTS (in, out); + MOVE_12_OBJECTS (in, out); + MOVE_2_OBJECTS (in, out); + break; + case 31: + MOVE_16_OBJECTS (in, out); + MOVE_11_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + } + + /* This loop governs the asmptoptic behaviour of this algorithm, for long + word copies. */ + count = value >> 5; + for (loop_var = 0; loop_var < count; loop_var++) + MOVE_32_OBJECTS (in, out); +} + + +static inline void +__inhibit_loop_to_libcall +__byte_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) +{ + int value = n; + int loop_var; + const char *in = s2; + char *out = s1; + int count; + int m0,m1,m2,m3; + + /* This code currently give a stall for any value with a 1->2 in the low 5 + bits, i.e. 1,2, 33,34 ? not acceptable! */ + switch (value & 0x1f) + { + case 0: + break; + case 1: + MOVE_1_OBJECT (in, out); + break; + case 2: + MOVE_2_OBJECTS (in, out); + break; + case 3: + MOVE_3_OBJECTS (in, out); + break; + case 4: + MOVE_4_OBJECTS (in, out); + break; + case 5: + MOVE_5_OBJECTS (in, out); + break; + case 6: + MOVE_6_OBJECTS (in, out); + break; + case 7: + MOVE_7_OBJECTS (in, out); + break; + case 8: + MOVE_8_OBJECTS (in, out); + break; + case 9: + MOVE_9_OBJECTS (in, out); + break; + case 10: + MOVE_10_OBJECTS (in, out); + break; + case 11: + MOVE_11_OBJECTS (in, out); + break; + case 12: + MOVE_12_OBJECTS (in, out); + break; + case 13: + MOVE_9_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 14: + MOVE_12_OBJECTS (in, out); + MOVE_2_OBJECTS (in, out); + break; + case 15: + MOVE_11_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 16: + MOVE_16_OBJECTS (in, out); + break; + case 17: + MOVE_11_OBJECTS (in, out); + MOVE_6_OBJECTS (in, out); + break; + case 18: + MOVE_9_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + break; + case 19: + MOVE_16_OBJECTS (in, out); + MOVE_3_OBJECTS (in, out); + break; + case 20: + MOVE_16_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 21: + MOVE_16_OBJECTS (in, out); + MOVE_5_OBJECTS (in, out); + break; + case 22: + MOVE_16_OBJECTS (in, out); + MOVE_6_OBJECTS (in, out); + break; + case 23: + MOVE_16_OBJECTS (in, out); + MOVE_7_OBJECTS (in, out); + break; + case 24: + MOVE_16_OBJECTS (in, out); + MOVE_8_OBJECTS (in, out); + break; + case 25: + MOVE_16_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + break; + case 26: + MOVE_16_OBJECTS (in, out); + MOVE_10_OBJECTS (in, out); + break; + case 27: + MOVE_16_OBJECTS (in, out); + MOVE_11_OBJECTS (in, out); + break; + case 28: + MOVE_16_OBJECTS (in, out); + MOVE_8_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 29: + MOVE_16_OBJECTS (in, out); + MOVE_9_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + case 30: + MOVE_16_OBJECTS (in, out); + MOVE_12_OBJECTS (in, out); + MOVE_2_OBJECTS (in, out); + break; + case 31: + MOVE_16_OBJECTS (in, out); + MOVE_11_OBJECTS (in, out); + MOVE_4_OBJECTS (in, out); + break; + } + + /* This loop governs the asmptoptic behaviour of this algorithm, for long + word copies. */ + count = value >> 5; + for (loop_var = 0; loop_var < count; loop_var++) + MOVE_32_OBJECTS (in, out); +} + + +/* Exposed interface. */ + +void * +__inhibit_loop_to_libcall +memcpy (void *__restrict s1, const void *__restrict s2, size_t n) +{ + void *result = s1; + + /* None of the following handles copying zero bytes. */ + if (n != 0) + { + unsigned test = (unsigned) s2 | (unsigned) s1 | (unsigned) n; + + if (test & 1) + __byte_memcpy (s1, s2, n); + else if (test & 2) + __shrt_int_memcpy (s1, s2, n >> 1); + else +#ifdef __VISIUM_ARCH_BMI__ + __asm__ __volatile__ ("bmd %0,%1,%2" + : "+t" (s1), "+u" (s2), "+v" (n) + : + : "r4", "r5", "r6", "memory"); +#else + __int_memcpy (s1, s2, n >> 2); +#endif /* __VISIUM_ARCH_BMI__ */ + } + + return result; +} diff --git a/lib/machine/visium/memcpy.h b/lib/machine/visium/memcpy.h new file mode 100644 index 0000000..a645aa7 --- /dev/null +++ b/lib/machine/visium/memcpy.h @@ -0,0 +1,31 @@ +/* memcpy for the Visium processor. + + Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. */ + +void * +memcpy (void *__restrict s1, const void *__restrict s2, size_t n); diff --git a/lib/machine/visium/memmove.c b/lib/machine/visium/memmove.c new file mode 100644 index 0000000..d594213 --- /dev/null +++ b/lib/machine/visium/memmove.c @@ -0,0 +1,52 @@ +/* memmove for the Visium processor. + + Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. */ + +#include + +void * +memmove (void *dst, const void *src, size_t len) +{ + char *d = dst; + const char *s = src; + + /* The overlap case is allegedly rare - with this implementation + it will have a high penalty on the GR6. */ + if (s < d && d < s + len) + { + s += len; + d += len; + + while (len--) + *--d = *--s; + + return dst; + } + + return memcpy (dst, src, len); +} diff --git a/lib/machine/visium/memset.c b/lib/machine/visium/memset.c new file mode 100644 index 0000000..5c3906a --- /dev/null +++ b/lib/machine/visium/memset.c @@ -0,0 +1,681 @@ +/* memset for the Visium processor. + + Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. */ + +/* This file must be kept in sync with libgcc/config/visium/memset.c */ + +#include +#include "memset.h" +#include "../../string/local.h" + +#define SET_32_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out [8] = m0; \ + out [9] = m0; \ + out [10] = m0; \ + out [11] = m0; \ + out [12] = m0; \ + out [13] = m0; \ + out [14] = m0; \ + out [15] = m0; \ + out [16] = m0; \ + out [17] = m0; \ + out [18] = m0; \ + out [19] = m0; \ + out [20] = m0; \ + out [21] = m0; \ + out [22] = m0; \ + out [23] = m0; \ + out [24] = m0; \ + out [25] = m0; \ + out [26] = m0; \ + out [27] = m0; \ + out [28] = m0; \ + out [29] = m0; \ + out [30] = m0; \ + out [31] = m0; \ + out += 32; \ +} while(0) + +#define SET_16_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out [8] = m0; \ + out [9] = m0; \ + out [10] = m0; \ + out [11] = m0; \ + out [12] = m0; \ + out [13] = m0; \ + out [14] = m0; \ + out [15] = m0; \ + out += 16; \ +} while(0) + +#define SET_12_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out [8] = m0; \ + out [9] = m0; \ + out [10] = m0; \ + out [11] = m0; \ + out += 12; \ +} while(0) + +#define SET_11_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out [8] = m0; \ + out [9] = m0; \ + out [10] = m0; \ + out += 11; \ +} while(0) + +#define SET_10_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out [8] = m0; \ + out [9] = m0; \ + out += 10; \ +} while(0) + +#define SET_9_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out [8] = m0; \ + out += 9; \ +} while(0) + +#define SET_8_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out [7] = m0; \ + out += 8; \ +} while(0) + +#define SET_7_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out [6] = m0; \ + out += 7; \ +} while(0) + +#define SET_6_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out [5] = m0; \ + out += 6; \ +} while(0) + +#define SET_5_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out [4] = m0; \ + out += 5; \ +} while(0) + +#define SET_4_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out [3] = m0; \ + out += 4; \ +} while(0) + +#define SET_3_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out [2] = m0; \ + out += 3; \ +} while(0) + +#define SET_2_OBJECTS(out) \ +do { \ + out [0] = m0; \ + out [1] = m0; \ + out += 2; \ +} while(0) + +#define SET_1_OBJECT(out) \ +do { \ + out [0] = m0; \ + out += 1; \ +} while(0) + +static inline void +__inhibit_loop_to_libcall +__int_memset (void *__restrict s1, int val, size_t n) +{ + int value = n; + int loop_var; + int *out = s1; + int count; + int m0 = val; + + /* This code currently give a stall for any value with a 1->2 in the low 5 + bits, i.e. 1,2, 33,34 ? not acceptable! */ + switch (value & 0x1f) + { + case 0: + break; + case 1: + SET_1_OBJECT (out); + break; + case 2: + SET_2_OBJECTS (out); + break; + case 3: + SET_3_OBJECTS (out); + break; + case 4: + SET_4_OBJECTS (out); + break; + case 5: + SET_5_OBJECTS (out); + break; + case 6: + SET_6_OBJECTS (out); + break; + case 7: + SET_7_OBJECTS (out); + break; + case 8: + SET_8_OBJECTS (out); + break; + case 9: + SET_9_OBJECTS (out); + break; + case 10: + SET_10_OBJECTS (out); + break; + case 11: + SET_11_OBJECTS (out); + break; + case 12: + SET_12_OBJECTS (out); + break; + case 13: + SET_9_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 14: + SET_12_OBJECTS (out); + SET_2_OBJECTS (out); + break; + case 15: + SET_11_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 16: + SET_16_OBJECTS (out); + break; + case 17: + SET_11_OBJECTS (out); + SET_6_OBJECTS (out); + break; + case 18: + SET_9_OBJECTS (out); + SET_9_OBJECTS (out); + break; + case 19: + SET_16_OBJECTS (out); + SET_3_OBJECTS (out); + break; + case 20: + SET_16_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 21: + SET_16_OBJECTS (out); + SET_5_OBJECTS (out); + break; + case 22: + SET_16_OBJECTS (out); + SET_6_OBJECTS (out); + break; + case 23: + SET_16_OBJECTS (out); + SET_7_OBJECTS (out); + break; + case 24: + SET_16_OBJECTS (out); + SET_8_OBJECTS (out); + break; + case 25: + SET_16_OBJECTS (out); + SET_9_OBJECTS (out); + break; + case 26: + SET_16_OBJECTS (out); + SET_10_OBJECTS (out); + break; + case 27: + SET_16_OBJECTS (out); + SET_11_OBJECTS (out); + break; + case 28: + SET_16_OBJECTS (out); + SET_8_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 29: + SET_16_OBJECTS (out); + SET_9_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 30: + SET_16_OBJECTS (out); + SET_12_OBJECTS (out); + SET_2_OBJECTS (out); + break; + case 31: + SET_16_OBJECTS (out); + SET_11_OBJECTS (out); + SET_4_OBJECTS (out); + break; + } + + /* This loop governs the asmptoptic behaviour of this algorithm, for long + word copies. */ + count = value >> 5; + for (loop_var = 0; loop_var < count; loop_var++) + SET_32_OBJECTS (out); +} + +static inline void +__inhibit_loop_to_libcall +__short_int_memset (void *__restrict s1, int val, size_t n) +{ + int value = n; + int loop_var; + int short *out = s1; + int count; + int m0 = val; + + /* This code currently give a stall for any value with a 1->2 in the low 5 + bits, i.e. 1,2, 33,34 ? not acceptable! */ + switch (value & 0x1f) + { + case 0: + break; + case 1: + SET_1_OBJECT (out); + break; + case 2: + SET_2_OBJECTS (out); + break; + case 3: + SET_3_OBJECTS (out); + break; + case 4: + SET_4_OBJECTS (out); + break; + case 5: + SET_5_OBJECTS (out); + break; + case 6: + SET_6_OBJECTS (out); + break; + case 7: + SET_7_OBJECTS (out); + break; + case 8: + SET_8_OBJECTS (out); + break; + case 9: + SET_9_OBJECTS (out); + break; + case 10: + SET_10_OBJECTS (out); + break; + case 11: + SET_11_OBJECTS (out); + break; + case 12: + SET_12_OBJECTS (out); + break; + case 13: + SET_9_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 14: + SET_12_OBJECTS (out); + SET_2_OBJECTS (out); + break; + case 15: + SET_11_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 16: + SET_16_OBJECTS (out); + break; + case 17: + SET_11_OBJECTS (out); + SET_6_OBJECTS (out); + break; + case 18: + SET_9_OBJECTS (out); + SET_9_OBJECTS (out); + break; + case 19: + SET_16_OBJECTS (out); + SET_3_OBJECTS (out); + break; + case 20: + SET_16_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 21: + SET_16_OBJECTS (out); + SET_5_OBJECTS (out); + break; + case 22: + SET_16_OBJECTS (out); + SET_6_OBJECTS (out); + break; + case 23: + SET_16_OBJECTS (out); + SET_7_OBJECTS (out); + break; + case 24: + SET_16_OBJECTS (out); + SET_8_OBJECTS (out); + break; + case 25: + SET_16_OBJECTS (out); + SET_9_OBJECTS (out); + break; + case 26: + SET_16_OBJECTS (out); + SET_10_OBJECTS (out); + break; + case 27: + SET_16_OBJECTS (out); + SET_11_OBJECTS (out); + break; + case 28: + SET_16_OBJECTS (out); + SET_8_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 29: + SET_16_OBJECTS (out); + SET_9_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 30: + SET_16_OBJECTS (out); + SET_12_OBJECTS (out); + SET_2_OBJECTS (out); + break; + case 31: + SET_16_OBJECTS (out); + SET_11_OBJECTS (out); + SET_4_OBJECTS (out); + break; + } + + /* This loop governs the asmptoptic behaviour of this algorithm, for long + word copies. */ + count = value >> 5; + for (loop_var = 0; loop_var < count; loop_var++) + SET_32_OBJECTS (out); +} + +static inline void +__inhibit_loop_to_libcall +__byte_memset (void *__restrict s1, int val, size_t n) +{ + int value = n; + int loop_var; + char *out = s1; + int count; + int m0 = val; + + /* This code currently give a stall for any value with a 1->2 in the low 5 + bits, i.e. 1,2, 33,34 ? not acceptable! */ + switch (value & 0x1f) + { + case 0: + break; + case 1: + SET_1_OBJECT (out); + break; + case 2: + SET_2_OBJECTS (out); + break; + case 3: + SET_3_OBJECTS (out); + break; + case 4: + SET_4_OBJECTS (out); + break; + case 5: + SET_5_OBJECTS (out); + break; + case 6: + SET_6_OBJECTS (out); + break; + case 7: + SET_7_OBJECTS (out); + break; + case 8: + SET_8_OBJECTS (out); + break; + case 9: + SET_9_OBJECTS (out); + break; + case 10: + SET_10_OBJECTS (out); + break; + case 11: + SET_11_OBJECTS (out); + break; + case 12: + SET_12_OBJECTS (out); + break; + case 13: + SET_9_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 14: + SET_12_OBJECTS (out); + SET_2_OBJECTS (out); + break; + case 15: + SET_11_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 16: + SET_16_OBJECTS (out); + break; + case 17: + SET_11_OBJECTS (out); + SET_6_OBJECTS (out); + break; + case 18: + SET_9_OBJECTS (out); + SET_9_OBJECTS (out); + break; + case 19: + SET_16_OBJECTS (out); + SET_3_OBJECTS (out); + break; + case 20: + SET_16_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 21: + SET_16_OBJECTS (out); + SET_5_OBJECTS (out); + break; + case 22: + SET_16_OBJECTS (out); + SET_6_OBJECTS (out); + break; + case 23: + SET_16_OBJECTS (out); + SET_7_OBJECTS (out); + break; + case 24: + SET_16_OBJECTS (out); + SET_8_OBJECTS (out); + break; + case 25: + SET_16_OBJECTS (out); + SET_9_OBJECTS (out); + break; + case 26: + SET_16_OBJECTS (out); + SET_10_OBJECTS (out); + break; + case 27: + SET_16_OBJECTS (out); + SET_11_OBJECTS (out); + break; + case 28: + SET_16_OBJECTS (out); + SET_8_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 29: + SET_16_OBJECTS (out); + SET_9_OBJECTS (out); + SET_4_OBJECTS (out); + break; + case 30: + SET_16_OBJECTS (out); + SET_12_OBJECTS (out); + SET_2_OBJECTS (out); + break; + case 31: + SET_16_OBJECTS (out); + SET_11_OBJECTS (out); + SET_4_OBJECTS (out); + break; + } + + /* This loop governs the asmptoptic behaviour of this algorithm, for long + word copies. */ + count = value >> 5; + for (loop_var = 0; loop_var < count; loop_var++) + SET_32_OBJECTS (out); +} + + +/* Exposed interface. */ + +void * +__inhibit_loop_to_libcall +memset (void *s, int c, size_t n) +{ + void *result = s; + + /* None of the following handles setting zero bytes. */ + if (n != 0) + { + unsigned test = (unsigned) s | (unsigned) n; + + if (test & 1) + __byte_memset (s, c, n); + else if (test & 2) + { + short int sc = (short int) ((c << 8) + (char) c); + __short_int_memset (s, sc, n >> 1); + } + else + { + int ic = (c << 24) + ((char) c << 16) + ((char) c << 8) + (char) c; + __int_memset (s, ic, n >> 2); + } + } + + return result; +} diff --git a/lib/machine/visium/memset.h b/lib/machine/visium/memset.h new file mode 100644 index 0000000..0ca5974 --- /dev/null +++ b/lib/machine/visium/memset.h @@ -0,0 +1,31 @@ +/* memset for the Visium processor. + + Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. */ + +void * +memset (void *s, int c, size_t n); diff --git a/lib/machine/visium/setjmp.S b/lib/machine/visium/setjmp.S new file mode 100644 index 0000000..5ef429b --- /dev/null +++ b/lib/machine/visium/setjmp.S @@ -0,0 +1,67 @@ +/* setjmp/longjmp for the Visium processor. + + Copyright (c) 2015 Rolls-Royce Controls and Data Services Limited. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Rolls-Royce Controls and Data Services Limited nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. */ + + .text + .globl setjmp + .type setjmp, @function +setjmp: + write.l 0(r1),r11 + write.l 1(r1),r12 + write.l 2(r1),r13 + write.l 3(r1),r14 + write.l 4(r1),r15 + write.l 5(r1),r16 + write.l 6(r1),r17 + write.l 7(r1),r18 + write.l 8(r1),r19 + write.l 9(r1),r21 + write.l 10(r1),r22 + write.l 11(r1),r23 + bra tr,r21,r0 + moviq r1,0 + .size setjmp, .-setjmp + + .globl longjmp + .type longjmp, @function +longjmp: + read.l r11,0(r1) + read.l r12,1(r1) + read.l r13,2(r1) + read.l r14,3(r1) + read.l r15,4(r1) + read.l r16,5(r1) + read.l r17,6(r1) + read.l r18,7(r1) + read.l r19,8(r1) + read.l r21,9(r1) + read.l r22,10(r1) + read.l r23,11(r1) + bra tr,r21,r0 + move.l r1,r2 + .size longjmp, .-longjmp diff --git a/lib/machine/w65/Makefile.inc b/lib/machine/w65/Makefile.inc new file mode 100644 index 0000000..c06f859 --- /dev/null +++ b/lib/machine/w65/Makefile.inc @@ -0,0 +1,3 @@ +libc_a_SOURCES += \ + %D%/udivhi3.S %D%/umodhi3.S %D%/smulhi3.S %D%/lshrhi.S %D%/sdivhi3.S %D%/mulsi3.c \ + %D%/divsi3.c %D%/cmpsi.c diff --git a/lib/machine/w65/cmpsi.c b/lib/machine/w65/cmpsi.c new file mode 100644 index 0000000..3773c9d --- /dev/null +++ b/lib/machine/w65/cmpsi.c @@ -0,0 +1,28 @@ + +union u { + struct { + short int msw; + unsigned short lsw; +} w; +long l; +}; + +int +__cmpsi2(long arga, + short int msw_b, unsigned short int lsw_b) +{ + union u u; + u.l = arga; + + if (u.w.msw != msw_b) + { + if (u.w.msw < msw_b) return 0; + return 2; + } + if (u.w.lsw != lsw_b) + { + if (u.w.lsw < lsw_b) return 0; + return 2; + } + return 1; +} diff --git a/lib/machine/w65/divsi3.c b/lib/machine/w65/divsi3.c new file mode 100644 index 0000000..bf74992 --- /dev/null +++ b/lib/machine/w65/divsi3.c @@ -0,0 +1,134 @@ + +#define divnorm(num, den, sign) \ +{ \ + if (num < 0) \ + { \ + num = -num; \ + sign = 1; \ + } \ + else \ + { \ + sign = 0; \ + } \ + \ + if (den < 0) \ + { \ + den = - den; \ + sign = 1 - sign; \ + } \ +} + + + + + +static unsigned long +divmodsi4(int modwanted, unsigned long num, unsigned long den) +{ + long int bit = 1; + long int res = 0; + long prevden; + while (den < num && bit && !(den & (1L<<31))) + { + den <<=1; + bit <<=1; + } + while (bit) + { + if (num >= den) + { + num -= den; + res |= bit; + } + bit >>=1; + den >>=1; + } + if (modwanted) return num; + return res; +} + + +#define exitdiv(sign, res) if (sign) { res = - res;} return res; + +long +__modsi3 (long numerator, long denominator) +{ + int sign = 0; + long dividend; + long modul; + + + if (numerator < 0) + { + numerator = -numerator; + sign = 1; + } + if (denominator < 0) + { + denominator = -denominator; + } + + modul = divmodsi4 (1, numerator, denominator); + if (sign) + return - modul; + return modul; +} + + +long +__divsi3 (long numerator, long denominator) +{ + int sign; + long dividend; + long modul; + divnorm (numerator, denominator, sign); + + dividend = divmodsi4 (0, numerator, denominator); + exitdiv (sign, dividend); +} + +long +__umodsi3 (unsigned long numerator, unsigned long denominator) +{ + long dividend; + long modul; + +modul= divmodsi4 (1, numerator, denominator); + return modul; +} + +long +__udivsi3 (unsigned long numerator, unsigned long denominator) +{ + int sign; + long dividend; + long modul; + dividend = divmodsi4 (0, numerator, denominator); + return dividend; +} + + + + + + +#ifdef TEST + + + +main () +{ + long int i, j, k, m; + for (i = -10000; i < 10000; i += 8) + { + for (j = -10000; j < 10000; j += 11) + { + k = i / j; + m = __divsi3 (i, j); + if (k != m) + printf ("fail %d %d %d %d\n", i, j, k, m); + } + } +} + +#endif diff --git a/lib/machine/w65/lshrhi.S b/lib/machine/w65/lshrhi.S new file mode 100644 index 0000000..564229f --- /dev/null +++ b/lib/machine/w65/lshrhi.S @@ -0,0 +1,48 @@ + + + .global ___lshrhi15 +___lshrhi15: + lsr a + + .global ___lshrhi14 +___lshrhi14: + lsr a + .global ___lshrhi13 +___lshrhi13: + lsr a + .global ___lshrhi12 +___lshrhi12: + lsr a + .global ___lshrhi11 +___lshrhi11: + lsr a + .global ___lshrhi10 +___lshrhi10: + lsr a + .global ___lshrhi9 +___lshrhi9: + lsr a + .global ___lshrhi8 +___lshrhi8: + lsr a + .global ___lshrhi7 +___lshrhi7: + lsr a + .global ___lshrhi6 +___lshrhi6: + lsr a + .global ___lshrhi5 +___lshrhi5: + lsr a + .global ___lshrhi4 +___lshrhi4: + lsr a + .global ___lshrhi3 +___lshrhi3: + lsr a + .global ___lshrhi2 +___lshrhi2: + lsr a + lsr a + rtl + diff --git a/lib/machine/w65/mulsi3.c b/lib/machine/w65/mulsi3.c new file mode 100644 index 0000000..b48fe97 --- /dev/null +++ b/lib/machine/w65/mulsi3.c @@ -0,0 +1,17 @@ + + +long +__mulsi3(unsigned long a, unsigned long b) +{ + long res = 0; + while (a) + { + if (a & 1) + { + res += b; + } + b <<= 1; + a >>=1; + } + return res; +} diff --git a/lib/machine/w65/sdivhi3.S b/lib/machine/w65/sdivhi3.S new file mode 100644 index 0000000..7958f11 --- /dev/null +++ b/lib/machine/w65/sdivhi3.S @@ -0,0 +1,35 @@ + .global ___sdivhi3 + +___sdivhi3: + lda udv + ply + beq Lend !if positive result + + eor #0xFFFF !negate result + inc a + +Lend: sta ___udivhi3 + stx + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +union IEEEl2bits { + long double e; + struct { + unsigned int manl :32; + unsigned int manh :32; + unsigned int exp :15; + unsigned int sign :1; + unsigned int junkl :16; + unsigned int junkh :32; + } bits; + struct { + unsigned long man :64; + unsigned int expsign :16; + unsigned long junk :48; + } xbits; +}; + +#define LDBL_NBIT 0x80000000 +#define mask_nbit_l(u) ((u).bits.manh &= ~LDBL_NBIT) + +#define LDBL_MANH_SIZE 32 +#define LDBL_MANL_SIZE 32 + +#define LDBL_TO_ARRAY32(u, a) do { \ + (a)[0] = (uint32_t)(u).bits.manl; \ + (a)[1] = (uint32_t)(u).bits.manh; \ +} while (0) diff --git a/lib/machine/x86_64/memcpy.S b/lib/machine/x86_64/memcpy.S new file mode 100644 index 0000000..81dd0c4 --- /dev/null +++ b/lib/machine/x86_64/memcpy.S @@ -0,0 +1,113 @@ +/* + * ==================================================== + * Copyright (C) 2007 by Ellips BV. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "x86_64mach.h" + + .global SYM (memcpy) + SOTYPE_FUNCTION(memcpy) + +SYM (memcpy): + movq rdi, rax /* Store destination in return value */ + cmpq $16, rdx + jb byte_copy + + movq rdi, r8 /* Align destination on quad word boundary */ + andq $7, r8 + jz quadword_aligned + movq $8, rcx + subq r8, rcx + subq rcx, rdx + rep movsb + +quadword_aligned: + cmpq $256, rdx + jb quadword_copy + + pushq rax + pushq r12 + pushq r13 + pushq r14 + + movq rdx, rcx /* Copy 128 bytes at a time with minimum cache polution */ + shrq $7, rcx + + .p2align 4 +loop: + prefetchnta 768 (rsi) + prefetchnta 832 (rsi) + + movq (rsi), rax + movq 8 (rsi), r8 + movq 16 (rsi), r9 + movq 24 (rsi), r10 + movq 32 (rsi), r11 + movq 40 (rsi), r12 + movq 48 (rsi), r13 + movq 56 (rsi), r14 + + movntiq rax, (rdi) + movntiq r8 , 8 (rdi) + movntiq r9 , 16 (rdi) + movntiq r10, 24 (rdi) + movntiq r11, 32 (rdi) + movntiq r12, 40 (rdi) + movntiq r13, 48 (rdi) + movntiq r14, 56 (rdi) + + movq 64 (rsi), rax + movq 72 (rsi), r8 + movq 80 (rsi), r9 + movq 88 (rsi), r10 + movq 96 (rsi), r11 + movq 104 (rsi), r12 + movq 112 (rsi), r13 + movq 120 (rsi), r14 + + movntiq rax, 64 (rdi) + movntiq r8 , 72 (rdi) + movntiq r9 , 80 (rdi) + movntiq r10, 88 (rdi) + movntiq r11, 96 (rdi) + movntiq r12, 104 (rdi) + movntiq r13, 112 (rdi) + movntiq r14, 120 (rdi) + + leaq 128 (rsi), rsi + leaq 128 (rdi), rdi + + dec rcx + jnz loop + + sfence + movq rdx, rcx + andq $127, rcx + rep movsb + popq r14 + popq r13 + popq r12 + popq rax + ret + + +byte_copy: + movq rdx, rcx + rep movsb + ret + + +quadword_copy: + movq rdx, rcx + shrq $3, rcx + .p2align 4 + rep movsq + movq rdx, rcx + andq $7, rcx + rep movsb /* Copy the remaining bytes */ + ret diff --git a/lib/machine/x86_64/memset.S b/lib/machine/x86_64/memset.S new file mode 100644 index 0000000..4ba53e3 --- /dev/null +++ b/lib/machine/x86_64/memset.S @@ -0,0 +1,88 @@ +/* + * ==================================================== + * Copyright (C) 2007 by Ellips BV. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + #include "x86_64mach.h" + + .global SYM (memset) + SOTYPE_FUNCTION(memset) + +SYM (memset): + movq rdi, r9 /* Save return value */ + movq rsi, rax + movq rdx, rcx + cmpq $16, rdx + jb byte_set + + movq rdi, r8 /* Align on quad word boundary */ + andq $7, r8 + jz quadword_aligned + movq $8, rcx + subq r8, rcx + subq rcx, rdx + rep stosb + movq rdx, rcx + +quadword_aligned: + movabs $0x0101010101010101, r8 + movzbl sil, eax + imul r8, rax + cmpq $256, rdx + jb quadword_set + + shrq $7, rcx /* Store 128 bytes at a time with minimum cache polution */ + + .p2align 4 +loop: + movntiq rax, (rdi) + movntiq rax, 8 (rdi) + movntiq rax, 16 (rdi) + movntiq rax, 24 (rdi) + movntiq rax, 32 (rdi) + movntiq rax, 40 (rdi) + movntiq rax, 48 (rdi) + movntiq rax, 56 (rdi) + movntiq rax, 64 (rdi) + movntiq rax, 72 (rdi) + movntiq rax, 80 (rdi) + movntiq rax, 88 (rdi) + movntiq rax, 96 (rdi) + movntiq rax, 104 (rdi) + movntiq rax, 112 (rdi) + movntiq rax, 120 (rdi) + + leaq 128 (rdi), rdi + + dec rcx + jnz loop + + sfence + movq rdx, rcx + andq $127, rcx + rep stosb + movq r9, rax + ret + + +byte_set: + rep stosb + movq r9, rax + ret + + +quadword_set: + shrq $3, rcx + .p2align 4 + rep stosq + movq rdx, rcx + andq $7, rcx + rep stosb /* Store the remaining bytes */ + movq r9, rax + ret + diff --git a/lib/machine/x86_64/setjmp.S b/lib/machine/x86_64/setjmp.S new file mode 100644 index 0000000..5f5e03d --- /dev/null +++ b/lib/machine/x86_64/setjmp.S @@ -0,0 +1,53 @@ +/* + * ==================================================== + * Copyright (C) 2007 by Ellips BV. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + + /* + ** jmp_buf: + ** rbx rbp r12 r13 r14 r15 rsp rip + ** 0 8 16 24 32 40 48 56 + */ + + #include "x86_64mach.h" + + .global SYM (setjmp) + .global SYM (longjmp) + SOTYPE_FUNCTION(setjmp) + SOTYPE_FUNCTION(longjmp) + +SYM (setjmp): + movq rbx, 0 (rdi) + movq rbp, 8 (rdi) + movq r12, 16 (rdi) + movq r13, 24 (rdi) + movq r14, 32 (rdi) + movq r15, 40 (rdi) + leaq 8 (rsp), rax + movq rax, 48 (rdi) + movq (rsp), rax + movq rax, 56 (rdi) + movq $0, rax + ret + +SYM (longjmp): + movq rsi, rax /* Return value */ + + movq 8 (rdi), rbp + + __CLI + movq 48 (rdi), rsp + pushq 56 (rdi) + movq 0 (rdi), rbx + movq 16 (rdi), r12 + movq 24 (rdi), r13 + movq 32 (rdi), r14 + movq 40 (rdi), r15 + __STI + + ret diff --git a/lib/machine/x86_64/x86_64mach.h b/lib/machine/x86_64/x86_64mach.h new file mode 100644 index 0000000..05e6392 --- /dev/null +++ b/lib/machine/x86_64/x86_64mach.h @@ -0,0 +1,113 @@ +/* + ** This file is distributed WITHOUT ANY WARRANTY; without even the implied + ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef __USER_LABEL_PREFIX__ +#define __USER_LABEL_PREFIX__ _ +#endif + +#define __REG_PREFIX__ % + +/* ANSI concatenation macros. */ + +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a##b + +/* Use the right prefix for global labels. */ + +#define SYM(x) CONCAT1(__USER_LABEL_PREFIX__, x) + +/* Use the right prefix for registers. */ + +#define REG(x) CONCAT1(__REG_PREFIX__, x) + +#define rax REG(rax) +#define rbx REG(rbx) +#define rcx REG(rcx) +#define rdx REG(rdx) +#define rsi REG(rsi) +#define rdi REG(rdi) +#define rbp REG(rbp) +#define rsp REG(rsp) + +#define r8 REG(r8) +#define r9 REG(r9) +#define r10 REG(r10) +#define r11 REG(r11) +#define r12 REG(r12) +#define r13 REG(r13) +#define r14 REG(r14) +#define r15 REG(r15) + +#define eax REG(eax) +#define ebx REG(ebx) +#define ecx REG(ecx) +#define edx REG(edx) +#define esi REG(esi) +#define edi REG(edi) +#define ebp REG(ebp) +#define esp REG(esp) + +#define st0 REG(st) +#define st1 REG(st(1)) +#define st2 REG(st(2)) +#define st3 REG(st(3)) +#define st4 REG(st(4)) +#define st5 REG(st(5)) +#define st6 REG(st(6)) +#define st7 REG(st(7)) + +#define ax REG(ax) +#define bx REG(bx) +#define cx REG(cx) +#define dx REG(dx) + +#define ah REG(ah) +#define bh REG(bh) +#define ch REG(ch) +#define dh REG(dh) + +#define al REG(al) +#define bl REG(bl) +#define cl REG(cl) +#define dl REG(dl) + +#define sil REG(sil) + +#define mm1 REG(mm1) +#define mm2 REG(mm2) +#define mm3 REG(mm3) +#define mm4 REG(mm4) +#define mm5 REG(mm5) +#define mm6 REG(mm6) +#define mm7 REG(mm7) + +#define xmm0 REG(xmm0) +#define xmm1 REG(xmm1) +#define xmm2 REG(xmm2) +#define xmm3 REG(xmm3) +#define xmm4 REG(xmm4) +#define xmm5 REG(xmm5) +#define xmm6 REG(xmm6) +#define xmm7 REG(xmm7) + +#define cr0 REG(cr0) +#define cr1 REG(cr1) +#define cr2 REG(cr2) +#define cr3 REG(cr3) +#define cr4 REG(cr4) + +#ifdef _I386MACH_NEED_SOTYPE_FUNCTION +#define SOTYPE_FUNCTION(sym) .type SYM(sym),@function +#else +#define SOTYPE_FUNCTION(sym) +#endif + +#ifndef _I386MACH_DISABLE_HW_INTERRUPTS +#define __CLI +#define __STI +#else +#define __CLI cli +#define __STI sti +#endif diff --git a/lib/machine/xc16x/Makefile.inc b/lib/machine/xc16x/Makefile.inc new file mode 100644 index 0000000..853f9ad --- /dev/null +++ b/lib/machine/xc16x/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/puts.c %D%/putchar.c diff --git a/lib/machine/xc16x/putchar.c b/lib/machine/xc16x/putchar.c new file mode 100644 index 0000000..13a6aa3 --- /dev/null +++ b/lib/machine/xc16x/putchar.c @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2006 KPIT Cummins + * Copyright (C) 2009 Conny Marco Menebröcker + * All rights reserved. + * + * Redistribution and use in source and binary forms is permitted + * provided that the above copyright notice and following paragraph are + * duplicated in all such forms. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ +void putchar (int c) +{ + asm("trap #1"); +} + diff --git a/lib/machine/xc16x/puts.c b/lib/machine/xc16x/puts.c new file mode 100644 index 0000000..c833a8f --- /dev/null +++ b/lib/machine/xc16x/puts.c @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2006 KPIT Cummins + * Copyright (C) 2009 Conny Marco Menebröcker + * All rights reserved. + * + * Redistribution and use in source and binary forms is permitted + * provided that the above copyright notice and following paragraph are + * duplicated in all such forms. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ +int puts(const char *s) +{ /* Print string Function */ + + int a; + while ((a = *s++)) + putchar(a); + return putchar('\n'); +} + diff --git a/lib/machine/xc16x/setjmp.S b/lib/machine/xc16x/setjmp.S new file mode 100644 index 0000000..fc0b5c1 --- /dev/null +++ b/lib/machine/xc16x/setjmp.S @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2006 KPIT Cummins + * Copyright (C) 2009 Conny Marco Menebröcker + * All rights reserved. + * + * Redistribution and use in source and binary forms is permitted + * provided that the above copyright notice and following paragraph are + * duplicated in all such forms. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +.section .text +.global setjmp +_setjmp: +#ifdef __xc16xL__ +rets + +#else + +ret +#endif diff --git a/lib/machine/xstormy16/Makefile.inc b/lib/machine/xstormy16/Makefile.inc new file mode 100644 index 0000000..c8df172 --- /dev/null +++ b/lib/machine/xstormy16/Makefile.inc @@ -0,0 +1,14 @@ +libc_a_SOURCES += \ + %D%/setjmp.S \ + %D%/calloc.c \ + %D%/callocr.c \ + %D%/cfree.c \ + %D%/freer.c \ + %D%/malign.c \ + %D%/malloc.c \ + %D%/mallocr.c \ + %D%/msize.c \ + %D%/mstats.c \ + %D%/realloc.c \ + %D%/reallocr.c \ + %D%/valloc.c diff --git a/lib/machine/xstormy16/calloc.c b/lib/machine/xstormy16/calloc.c new file mode 100644 index 0000000..46adf7f --- /dev/null +++ b/lib/machine/xstormy16/calloc.c @@ -0,0 +1,2 @@ +#define DEFINE_CALLOC +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/callocr.c b/lib/machine/xstormy16/callocr.c new file mode 100644 index 0000000..3e5053c --- /dev/null +++ b/lib/machine/xstormy16/callocr.c @@ -0,0 +1,7 @@ +#include + +void * +_calloc_r (struct _reent *r, size_t a, size_t b) +{ + return calloc (a, b); +} diff --git a/lib/machine/xstormy16/cfree.c b/lib/machine/xstormy16/cfree.c new file mode 100644 index 0000000..2ab5913 --- /dev/null +++ b/lib/machine/xstormy16/cfree.c @@ -0,0 +1,2 @@ +#define DEFINE_CFREE +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/freer.c b/lib/machine/xstormy16/freer.c new file mode 100644 index 0000000..f79ef55 --- /dev/null +++ b/lib/machine/xstormy16/freer.c @@ -0,0 +1,7 @@ +#include + +void +_free_r (struct _reent *r, void *x) +{ + free (x); +} diff --git a/lib/machine/xstormy16/malign.c b/lib/machine/xstormy16/malign.c new file mode 100644 index 0000000..2daba41 --- /dev/null +++ b/lib/machine/xstormy16/malign.c @@ -0,0 +1,2 @@ +#define DEFINE_MEMALIGN +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/malloc.c b/lib/machine/xstormy16/malloc.c new file mode 100644 index 0000000..f590201 --- /dev/null +++ b/lib/machine/xstormy16/malloc.c @@ -0,0 +1,4 @@ +/* stdlib/malloc.c defines all these symbols in this file. */ +#define DEFINE_FREE +#define DEFINE_MALLOC +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/mallocr.c b/lib/machine/xstormy16/mallocr.c new file mode 100644 index 0000000..d54df0b --- /dev/null +++ b/lib/machine/xstormy16/mallocr.c @@ -0,0 +1,7 @@ +#include + +void * +_malloc_r (struct _reent *r, size_t sz) +{ + return malloc (sz); +} diff --git a/lib/machine/xstormy16/msize.c b/lib/machine/xstormy16/msize.c new file mode 100644 index 0000000..90b0848 --- /dev/null +++ b/lib/machine/xstormy16/msize.c @@ -0,0 +1,2 @@ +#define DEFINE_MALLOC_USABLE_SIZE +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/mstats.c b/lib/machine/xstormy16/mstats.c new file mode 100644 index 0000000..1bd24da --- /dev/null +++ b/lib/machine/xstormy16/mstats.c @@ -0,0 +1,6 @@ +/* stdlib/mstats.c defines all these symbols in this file. + TODO: Missing mstats function. */ +#define DEFINE_MALLINFO +#define DEFINE_MALLOC_STATS +#define DEFINE_MALLOPT +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/realloc.c b/lib/machine/xstormy16/realloc.c new file mode 100644 index 0000000..64a29fa --- /dev/null +++ b/lib/machine/xstormy16/realloc.c @@ -0,0 +1,2 @@ +#define DEFINE_REALLOC +#include "tiny-malloc.c" diff --git a/lib/machine/xstormy16/reallocr.c b/lib/machine/xstormy16/reallocr.c new file mode 100644 index 0000000..2bf5385 --- /dev/null +++ b/lib/machine/xstormy16/reallocr.c @@ -0,0 +1,7 @@ +#include + +void * +_realloc_r (struct _reent *r, void *x, size_t sz) +{ + return realloc (x, sz); +} diff --git a/lib/machine/xstormy16/setjmp.S b/lib/machine/xstormy16/setjmp.S new file mode 100644 index 0000000..f2f7210 --- /dev/null +++ b/lib/machine/xstormy16/setjmp.S @@ -0,0 +1,57 @@ +;; xstormy16 +;; Copyright (C) 2001 by Red Hat, Incorporated. All rights reserved. +;; +;; Permission to use, copy, modify, and distribute this software +;; is freely granted, provided that this notice is preserved. +;; + .file "setjmp.S" + + .section .text + .align 1 + .global setjmp + .type setjmp,@function +setjmp: + mov r0,r10 + mov (r2++),r0 + mov r0,r11 + mov (r2++),r0 + mov r0,r12 + mov (r2++),r0 + mov r0,r13 + mov (r2++),r0 + pop r0 ; PC high word + pop r1 ; PC low word + mov (r2++), r0 + mov (r2++), r1 + mov r3,sp + mov (r2++),r3 + mov.w r2,#0 + mov r8, r0 + mov r9, r1 + jmp r8, r9 + .size setjmp,.-setjmp + + .global longjmp + .type longjmp,@function +longjmp: + mov r0,(r2++) + mov r10,r0 + mov r0,(r2++) + mov r11,r0 + mov r0,(r2++) + mov r12,r0 + mov r0,(r2++) + mov r13,r0 + mov r0,(r2++) + mov r8, r0 + mov r1,(r2++) + mov r9, r1 + mov r4,(r2++) + mov sp,r4 +;; status arg (r3) to longjmp is return value +;; if it's zero, return 1 + bnz r3, #0, 0f + mov.w r3,#1 +0: mov r2, r3 + jmp r8,r9 + .size longjmp,.-longjmp diff --git a/lib/machine/xstormy16/tiny-malloc.c b/lib/machine/xstormy16/tiny-malloc.c new file mode 100644 index 0000000..e6f67a8 --- /dev/null +++ b/lib/machine/xstormy16/tiny-malloc.c @@ -0,0 +1,603 @@ +/* A replacement malloc with: + - Much reduced code size; + - Smaller RAM footprint; + - The ability to handle downward-growing heaps; + but + - Slower; + - Probably higher memory fragmentation; + - Doesn't support threads (but, if it did support threads, + it wouldn't need a global lock, only a compare-and-swap instruction); + - Assumes the maximum alignment required is the alignment of a pointer; + - Assumes that memory is already there and doesn't need to be allocated. + +* Synopsis of public routines + + malloc(size_t n); + Return a pointer to a newly allocated chunk of at least n bytes, or null + if no space is available. + free(void* p); + Release the chunk of memory pointed to by p, or no effect if p is null. + realloc(void* p, size_t n); + Return a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. The returned pointer may or may not be + the same as p. If p is null, equivalent to malloc. Unless the + #define REALLOC_ZERO_BYTES_FREES below is set, realloc with a + size argument of zero (re)allocates a minimum-sized chunk. + memalign(size_t alignment, size_t n); + Return a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument, which must be a power of + two. Will fail if 'alignment' is too large. + calloc(size_t unit, size_t quantity); + Returns a pointer to quantity * unit bytes, with all locations + set to zero. + cfree(void* p); + Equivalent to free(p). + malloc_trim(size_t pad); + Release all but pad bytes of freed top-most memory back + to the system. Return 1 if successful, else 0. + malloc_usable_size(void* p); + Report the number usable allocated bytes associated with allocated + chunk p. This may or may not report more bytes than were requested, + due to alignment and minimum size constraints. + malloc_stats(); + Prints brief summary statistics on stderr. + mallinfo() + Returns (by copy) a struct containing various summary statistics. + mallopt(int parameter_number, int parameter_value) + Changes one of the tunable parameters described below. Returns + 1 if successful in changing the parameter, else 0. Actually, returns 0 + always, as no parameter can be changed. +*/ + +#ifdef __xstormy16__ +#define MALLOC_DIRECTION -1 +#endif + +#ifndef MALLOC_DIRECTION +#define MALLOC_DIRECTION 1 +#endif + +#include + +void* malloc(size_t); +void free(void*); +void* realloc(void*, size_t); +void* memalign(size_t, size_t); +void* valloc(size_t); +void* pvalloc(size_t); +void* calloc(size_t, size_t); +void cfree(void*); +int malloc_trim(size_t); +size_t malloc_usable_size(void*); +void malloc_stats(void); +int mallopt(int, int); +struct mallinfo mallinfo(void); + +typedef struct freelist_entry { + size_t size; + struct freelist_entry *next; +} *fle; + +extern void * __malloc_end; +extern fle __malloc_freelist; + +/* Return the number of bytes that need to be added to X to make it + aligned to an ALIGN boundary. ALIGN must be a power of 2. */ +#define M_ALIGN(x, align) (-(size_t)(x) & ((align) - 1)) + +/* Return the number of bytes that need to be subtracted from X to make it + aligned to an ALIGN boundary. ALIGN must be a power of 2. */ +#define M_ALIGN_SUB(x, align) ((size_t)(x) & ((align) - 1)) + +extern void __malloc_start; + +/* This is the minimum gap allowed between __malloc_end and the top of + the stack. This is only checked for when __malloc_end is + decreased; if instead the stack grows into the heap, silent data + corruption will result. */ +#define MALLOC_MINIMUM_GAP 32 + +#ifdef __xstormy16__ +register void * stack_pointer asm ("r15"); +#define MALLOC_LIMIT stack_pointer +#else +#define MALLOC_LIMIT __builtin_frame_address (0) +#endif + +#if MALLOC_DIRECTION < 0 +#define CAN_ALLOC_P(required) \ + (((size_t) __malloc_end - (size_t)MALLOC_LIMIT \ + - MALLOC_MINIMUM_GAP) >= (required)) +#else +#define CAN_ALLOC_P(required) \ + (((size_t)MALLOC_LIMIT - (size_t) __malloc_end \ + - MALLOC_MINIMUM_GAP) >= (required)) +#endif + +/* real_size is the size we actually have to allocate, allowing for + overhead and alignment. */ +#define REAL_SIZE(sz) \ + ((sz) < sizeof (struct freelist_entry) - sizeof (size_t) \ + ? sizeof (struct freelist_entry) \ + : sz + sizeof (size_t) + M_ALIGN(sz, sizeof (size_t))) + +#ifdef DEFINE_MALLOC + +void * __malloc_end = &__malloc_start; +fle __malloc_freelist; + +void * +malloc (size_t sz) +{ + fle *nextfree; + fle block; + + /* real_size is the size we actually have to allocate, allowing for + overhead and alignment. */ + size_t real_size = REAL_SIZE (sz); + + /* Look for the first block on the freelist that is large enough. */ + for (nextfree = &__malloc_freelist; + *nextfree; + nextfree = &(*nextfree)->next) + { + block = *nextfree; + + if (block->size >= real_size) + { + /* If the block found is just the right size, remove it from + the free list. Otherwise, split it. */ + if (block->size < real_size + sizeof (struct freelist_entry)) + { + *nextfree = block->next; + return (void *)&block->next; + } + else + { + size_t newsize = block->size - real_size; + fle newnext = block->next; + *nextfree = (fle)((size_t)block + real_size); + (*nextfree)->size = newsize; + (*nextfree)->next = newnext; + goto done; + } + } + + /* If this is the last block on the freelist, and it was too small, + enlarge it. */ + if (! block->next + && __malloc_end == (void *)((size_t)block + block->size)) + { + size_t moresize = real_size - block->size; + if (! CAN_ALLOC_P (moresize)) + return NULL; + + *nextfree = NULL; + if (MALLOC_DIRECTION < 0) + { + block = __malloc_end = (void *)((size_t)block - moresize); + } + else + { + __malloc_end = (void *)((size_t)block + real_size); + } + + goto done; + } + } + + /* No free space at the end of the free list. Allocate new space + and use that. */ + + if (! CAN_ALLOC_P (real_size)) + return NULL; + + if (MALLOC_DIRECTION > 0) + { + block = __malloc_end; + __malloc_end = (void *)((size_t)__malloc_end + real_size); + } + else + { + block = __malloc_end = (void *)((size_t)__malloc_end - real_size); + } + done: + block->size = real_size; + return (void *)&block->next; +} + +#endif + +#ifdef DEFINE_FREE + +void +free (void *block_p) +{ + fle *nextfree; + fle block = (fle)((size_t) block_p - offsetof (struct freelist_entry, next)); + + if (block_p == NULL) + return; + + /* Look on the freelist to see if there's a free block just before + or just after this block. */ + for (nextfree = &__malloc_freelist; + *nextfree; + nextfree = &(*nextfree)->next) + { + fle thisblock = *nextfree; + if ((size_t)thisblock + thisblock->size == (size_t) block) + { + thisblock->size += block->size; + if (MALLOC_DIRECTION > 0 + && thisblock->next + && (size_t) block + block->size == (size_t) thisblock->next) + { + thisblock->size += thisblock->next->size; + thisblock->next = thisblock->next->next; + } + return; + } + else if ((size_t) thisblock == (size_t) block + block->size) + { + if (MALLOC_DIRECTION < 0 + && thisblock->next + && (size_t) block == ((size_t) thisblock->next + + thisblock->next->size)) + { + *nextfree = thisblock->next; + thisblock->next->size += block->size + thisblock->size; + } + else + { + block->size += thisblock->size; + block->next = thisblock->next; + *nextfree = block; + } + return; + } + else if ((MALLOC_DIRECTION > 0 + && (size_t) thisblock > (size_t) block) + || (MALLOC_DIRECTION < 0 + && (size_t) thisblock < (size_t) block)) + break; + } + + block->next = *nextfree; + *nextfree = block; + return; +} +#endif + +#ifdef DEFINE_REALLOC +#include + +void * +realloc (void *block_p, size_t sz) +{ + fle block = (fle)((size_t) block_p - offsetof (struct freelist_entry, next)); + size_t real_size = REAL_SIZE (sz); + size_t old_real_size; + + if (block_p == NULL) + return malloc (sz); + + old_real_size = block->size; + + /* Perhaps we need to allocate more space. */ + if (old_real_size < real_size) + { + void *result; + size_t old_size = old_real_size - sizeof (size_t); + + /* Need to allocate, copy, and free. */ + result = malloc (sz); + if (result == NULL) + return NULL; + memcpy (result, block_p, old_size < sz ? old_size : sz); + free (block_p); + return result; + } + /* Perhaps we can free some space. */ + if (old_real_size - real_size >= sizeof (struct freelist_entry)) + { + fle newblock = (fle)((size_t)block + real_size); + block->size = real_size; + newblock->size = old_real_size - real_size; + free (&newblock->next); + } + return block_p; +} +#endif + +#ifdef DEFINE_CALLOC +#include + +void * +calloc (size_t n, size_t elem_size) +{ + void *result; + size_t sz = n * elem_size; + result = malloc (sz); + if (result != NULL) + memset (result, 0, sz); + return result; +} +#endif + +#ifdef DEFINE_CFREE +void +cfree (void *p) +{ + free (p); +} +#endif + +#ifdef DEFINE_MEMALIGN +void * +memalign (size_t align, size_t sz) +{ + fle *nextfree; + fle block; + + /* real_size is the size we actually have to allocate, allowing for + overhead and alignment. */ + size_t real_size = REAL_SIZE (sz); + + /* Some sanity checking on 'align'. */ + if ((align & (align - 1)) != 0 + || align <= 0) + return NULL; + + /* Look for the first block on the freelist that is large enough. */ + /* One tricky part is this: We want the result to be a valid pointer + to free. That means that there has to be room for a size_t + before the block. If there's additional space before the block, + it should go on the freelist, or it'll be lost---we could add it + to the size of the block before it in memory, but finding the + previous block is expensive. */ + for (nextfree = &__malloc_freelist; + ; + nextfree = &(*nextfree)->next) + { + size_t before_size; + size_t old_size; + + /* If we've run out of free blocks, allocate more space. */ + if (! *nextfree) + { + old_size = real_size; + if (MALLOC_DIRECTION < 0) + { + old_size += M_ALIGN_SUB (((size_t)__malloc_end + - old_size + sizeof (size_t)), + align); + if (! CAN_ALLOC_P (old_size)) + return NULL; + block = __malloc_end = (void *)((size_t)__malloc_end - old_size); + } + else + { + block = __malloc_end; + old_size += M_ALIGN ((size_t)__malloc_end + sizeof (size_t), + align); + if (! CAN_ALLOC_P (old_size)) + return NULL; + __malloc_end = (void *)((size_t)__malloc_end + old_size); + } + *nextfree = block; + block->size = old_size; + block->next = NULL; + } + else + { + block = *nextfree; + old_size = block->size; + } + + + before_size = M_ALIGN (&block->next, align); + if (before_size != 0) + before_size = sizeof (*block) + M_ALIGN (&(block+1)->next, align); + + /* If this is the last block on the freelist, and it is too small, + enlarge it. */ + if (! block->next + && old_size < real_size + before_size + && __malloc_end == (void *)((size_t)block + block->size)) + { + if (MALLOC_DIRECTION < 0) + { + size_t moresize = real_size - block->size; + moresize += M_ALIGN_SUB ((size_t)&block->next - moresize, align); + if (! CAN_ALLOC_P (moresize)) + return NULL; + block = __malloc_end = (void *)((size_t)block - moresize); + block->next = NULL; + block->size = old_size = old_size + moresize; + before_size = 0; + } + else + { + if (! CAN_ALLOC_P (before_size + real_size - block->size)) + return NULL; + __malloc_end = (void *)((size_t)block + before_size + real_size); + block->size = old_size = before_size + real_size; + } + + /* Two out of the four cases below will now be possible; which + two depends on MALLOC_DIRECTION. */ + } + + if (old_size >= real_size + before_size) + { + /* This block will do. If there needs to be space before it, + split the block. */ + if (before_size != 0) + { + fle old_block = block; + + old_block->size = before_size; + block = (fle)((size_t)block + before_size); + + /* If there's no space after the block, we're now nearly + done; just make a note of the size required. + Otherwise, we need to create a new free space block. */ + if (old_size - before_size + <= real_size + sizeof (struct freelist_entry)) + { + block->size = old_size - before_size; + return (void *)&block->next; + } + else + { + fle new_block; + new_block = (fle)((size_t)block + real_size); + new_block->size = old_size - before_size - real_size; + if (MALLOC_DIRECTION > 0) + { + new_block->next = old_block->next; + old_block->next = new_block; + } + else + { + new_block->next = old_block; + *nextfree = new_block; + } + goto done; + } + } + else + { + /* If the block found is just the right size, remove it from + the free list. Otherwise, split it. */ + if (old_size <= real_size + sizeof (struct freelist_entry)) + { + *nextfree = block->next; + return (void *)&block->next; + } + else + { + size_t newsize = old_size - real_size; + fle newnext = block->next; + *nextfree = (fle)((size_t)block + real_size); + (*nextfree)->size = newsize; + (*nextfree)->next = newnext; + goto done; + } + } + } + } + + done: + block->size = real_size; + return (void *)&block->next; +} +#endif + +#ifdef DEFINE_VALLOC +void * +valloc (size_t sz) +{ + return memalign (128, sz); +} +#endif +#ifdef DEFINE_PVALLOC +void * +pvalloc (size_t sz) +{ + return memalign (128, sz + M_ALIGN (sz, 128)); +} +#endif + +#ifdef DEFINE_MALLINFO +#include "malloc.h" +#include + +struct mallinfo +mallinfo (void) +{ + struct mallinfo r; + fle fr; + size_t free_size; + size_t total_size; + size_t free_blocks; + + memset (&r, 0, sizeof (r)); + + free_size = 0; + free_blocks = 0; + for (fr = __malloc_freelist; fr; fr = fr->next) + { + free_size += fr->size; + free_blocks++; + if (! fr->next) + { + int atend; + if (MALLOC_DIRECTION > 0) + atend = (void *)((size_t)fr + fr->size) == __malloc_end; + else + atend = (void *)fr == __malloc_end; + if (atend) + r.keepcost = fr->size; + } + } + + if (MALLOC_DIRECTION > 0) + total_size = (char *)__malloc_end - (char *)&__malloc_start; + else + total_size = (char *)&__malloc_start - (char *)__malloc_end; + +#ifdef DEBUG + /* Fixme: should walk through all the in-use blocks and see if + they're valid. */ +#endif + + r.arena = total_size; + r.fordblks = free_size; + r.uordblks = total_size - free_size; + r.ordblks = free_blocks; + return r; +} +#endif + +#ifdef DEFINE_MALLOC_STATS +#include "malloc.h" +#include + +void +malloc_stats(void) +{ + struct mallinfo i; + FILE *fp; + + fp = stderr; + i = mallinfo(); + fprintf (fp, "malloc has reserved %u bytes between %p and %p\n", + i.arena, &__malloc_start, __malloc_end); + fprintf (fp, "there are %u bytes free in %u chunks\n", + i.fordblks, i.ordblks); + fprintf (fp, "of which %u bytes are at the end of the reserved space\n", + i.keepcost); + fprintf (fp, "and %u bytes are in use.\n", i.uordblks); +} +#endif + +#ifdef DEFINE_MALLOC_USABLE_SIZE +size_t +malloc_usable_size (void *block_p) +{ + fle block = (fle)((size_t) block_p - offsetof (struct freelist_entry, next)); + return block->size - sizeof (size_t); +} +#endif + +#ifdef DEFINE_MALLOPT +int +mallopt (int n, int v) +{ + (void)n; (void)v; + return 0; +} +#endif diff --git a/lib/machine/xstormy16/valloc.c b/lib/machine/xstormy16/valloc.c new file mode 100644 index 0000000..d6543bc --- /dev/null +++ b/lib/machine/xstormy16/valloc.c @@ -0,0 +1,4 @@ +/* stdlib/valloc.c defines all these symbols in this file. */ +#define DEFINE_PVALLOC +#define DEFINE_VALLOC +#include "tiny-malloc.c" diff --git a/lib/machine/z8k/Makefile.inc b/lib/machine/z8k/Makefile.inc new file mode 100644 index 0000000..5e4a2a1 --- /dev/null +++ b/lib/machine/z8k/Makefile.inc @@ -0,0 +1 @@ +libc_a_SOURCES += %D%/setjmp.S %D%/memset.S %D%/memcpy.S %D%/memmove.S %D%/memcmp.S diff --git a/lib/machine/z8k/args.h b/lib/machine/z8k/args.h new file mode 100644 index 0000000..3f60624 --- /dev/null +++ b/lib/machine/z8k/args.h @@ -0,0 +1,13 @@ +#ifdef __Z8001__ + +segm +#define PARG_0 rr6 +#else +unsegm +#define PARG_0 r7 +#endif + +#define LARG_0 rr6 +#define ARG_0 r7 + +#define LARG_1 rr4 diff --git a/lib/machine/z8k/memcmp.S b/lib/machine/z8k/memcmp.S new file mode 100644 index 0000000..ae41e63 --- /dev/null +++ b/lib/machine/z8k/memcmp.S @@ -0,0 +1,185 @@ +/* + * memcmp routine for Z8000 + * Copyright (C) 2004 Christian Groessler + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* int memcmp(const void *b1, const void *b2, size_t length); + */ + + name "memcmp.S" + + .text + even +global _memcmp + +_memcmp: + +#ifdef __Z8001__ + segm + +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) + ldl rr4,rr14(#8) + ldl rr2,rr14(#12) +#endif + +/* rr2 - length (high word ignored) + * rr4 - b2 + * rr6 - b1 + */ + + clr r1 /* initialize return value */ + testl rr2 + jr z,finish + + bitb rl7,#0 /* odd b1? */ + jr nz,testb2 + bitb rl5,#0 /* odd b2? */ + jr nz,odd_cmp /* b1 even, b2 odd */ + jr t,even_cmp + +testb2: + bitb rl5,#0 + jr z,odd_cmp /* b2 even, b1 odd */ + + cpsib @rr6,@rr4,r3,eq + jr z,beq /* bytes are the same */ + jr t,byte_diff + +beq: jr ov,finish /* jump if r3 is zero now */ + +/* compare words */ +even_cmp: + ld r2,r3 /* remember length */ + srl r3,#1 + jr z,no_words + + cpsir @rr6,@rr4,r3,ne + jr nz,no_words + + dec r7,#2 + dec r5,#2 /* point to different bytes */ + ldk r3,#2 + jr t,odd_cmp + +no_words: + bitb rl2,#0 /* odd length? */ + jr z,finish + + cpsib @rr6,@rr4,r3,eq + jr z,finish /* last bytes are the same */ + jr t,byte_diff + +/* compare bytes */ +odd_cmp: + cpsirb @rr6,@rr4,r3,ne + jr nz,finish + +byte_diff: + dec r7,#1 + dec r5,#1 /* point to different bytes */ + + ldb rl1,@rr6 + clr r0 + ldb rl0,@rr4 + sub r1,r0 + +finish: /* set return value */ +#ifdef __STD_CALL__ + ld r7,r1 +#else + ld r2,r1 +#endif + + +#else /* above Z8001, below Z8002 */ + + + unsegm + +#ifdef __STD_CALL__ + ld r7,r15(#2) + ld r6,r15(#4) + ld r5,r15(#6) +#endif + +/* r5 - length + * r6 - b2 + * r7 - b1 + */ + + clr r1 /* initialize return value */ + test r5 + jr z,finish + + bitb rl7,#0 /* odd destination address? */ + jr nz,testb2 + bitb rl6,#0 /* odd source address? */ + jr nz,odd_cmp /* b1 even, b2 odd */ + jr t,even_cmp + +testb2: + bitb rl6,#0 + jr z,odd_cmp /* b2 even, b1 odd */ + + cpsib @r7,@r6,r5,eq + jr z,beq /* bytes are the same */ + jr t,byte_diff + +beq: jr ov,finish /* jump if r3 is zero now */ + +/* compare words */ +even_cmp: + ld r4,r5 /* remember length */ + srl r5,#1 + jr z,no_words + + cpsir @r7,@r6,r5,ne + jr nz,no_words + + dec r7,#2 + dec r6,#2 /* point to different bytes */ + ldk r5,#2 + jr t,odd_cmp + +no_words: + bitb rl4,#0 /* odd length? */ + jr z,finish + + cpsib @r7,@r6,r4,eq + jr z,finish /* last bytes are the same */ + jr t,byte_diff + +/* compare bytes */ +odd_cmp: + cpsirb @r7,@r6,r5,ne + jr nz,finish + +byte_diff: + dec r7,#1 + dec r6,#1 /* point to different bytes */ + + ldb rl1,@r7 + clr r0 + ldb rl0,@r6 + sub r1,r0 + +finish: +#ifdef __STD_CALL__ + ld r7,r1 +#else + ld r2,r1 +#endif + +#endif /* Z8002 */ + + ret + .end diff --git a/lib/machine/z8k/memcpy.S b/lib/machine/z8k/memcpy.S new file mode 100644 index 0000000..ede6037 --- /dev/null +++ b/lib/machine/z8k/memcpy.S @@ -0,0 +1,145 @@ +/* + * memcpy routine for Z8000 + * Copyright (C) 2004 Christian Groessler + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* void *memcpy(void *dest, const void *src, size_t length); + */ + + name "memcpy.S" + + .text + even +global _memcpy +global memmove_entry + +_memcpy: + +#ifdef __Z8001__ + segm + +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) + ldl rr4,rr14(#8) + ldl rr2,rr14(#12) +#else + pushl @rr14,rr6 +#endif + +/* rr2 - length (high word ignored) + * rr4 - src + * rr6 - dest + */ + + testl rr2 + jr z,finish + +memmove_entry: /* external entry point from memmove */ + + bitb rl7,#0 /* odd destination address? */ + jr nz,testsrc + bitb rl5,#0 /* odd source address? */ + jr nz,odd_copy + jr t,even_copy /* dest even, src odd */ + +testsrc: + bitb rl5,#0 + jr z,odd_copy /* src even, dest odd */ + ldib @rr6,@rr4,r3 + jr ov,finish /* jump if r3 is zero now */ + +/* copy words */ +even_copy: + ld r2,r3 /* remember length */ + srl r3,#1 + jr z,no_words + + ldir @rr6,@rr4,r3 + +no_words: + bitb rl2,#0 /* odd length? */ + jr z,finish + ldib @rr6,@rr4,r2 /* yes, copy last byte */ + jr finish + +/* copy bytes */ +odd_copy: + ldirb @rr6,@rr4,r3 + +finish: +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) +#else + popl rr2,@rr14 +#endif + + +#else /* above Z8001, below Z8002 */ + + + unsegm + +#ifdef __STD_CALL__ + ld r7,r15(#2) + ld r6,r15(#4) + ld r5,r15(#6) +#else + ld r2,r7 /* buffer pointer return value */ +#endif + +/* r5 - length + * r6 - src + * r7 - dest + */ + test r5 + jr z,finish + +memmove_entry: /* external entry point from memmove */ + + bitb rl7,#0 /* odd destination address? */ + jr nz,testsrc + bitb rl6,#0 /* odd source address? */ + jr nz,odd_copy + jr t,even_copy /* dest even, src odd */ + +testsrc: + bitb rl6,#0 + jr z,odd_copy /* src even, dest odd */ + ldib @r7,@r6,r5 + jr ov,finish /* jump if r5 is zero now */ + +/* copy words */ +even_copy: + ld r4,r5 /* remember length */ + srl r5,#1 + jr z,no_words + + ldir @r7,@r6,r5 + +no_words: + bitb rl4,#0 /* odd length? */ + jr z,finish + ldib @r7,@r6,r4 /* yes, copy last byte */ + jr finish + +/* copy bytes */ +odd_copy: + ldirb @r7,@r6,r5 + +finish: +#ifdef __STD_CALL__ + ld r7,r15(#2) +#endif + +#endif /* Z8002 */ + + ret + .end diff --git a/lib/machine/z8k/memmove.S b/lib/machine/z8k/memmove.S new file mode 100644 index 0000000..c4d0c73 --- /dev/null +++ b/lib/machine/z8k/memmove.S @@ -0,0 +1,180 @@ +/* + * memmove routine for Z8000 + * Copyright (C) 2004 Christian Groessler + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* void *memmove(void *dest, const void *src, size_t length); + */ + + name "memmove.S" + + .text + even +global _memmove + +_memmove: + +#ifdef __Z8001__ + segm + +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) + ldl rr4,rr14(#8) + ldl rr2,rr14(#12) +#else + pushl @rr14,rr6 +#endif + +/* rr2 - length (high word ignored) + * rr4 - src + * rr6 - dest + */ + + testl rr2 + jr z,finish + +/* check for destructive overlap (src < dest && dest < src + length) */ + + cpl rr6,rr4 + jp ule,memmove_entry /* non-destructive, let memcpy do the work */ + ldl rr0,rr2 + addl rr0,rr4 /* rr0 = src + length */ + cpl rr0,rr6 + jp ult,memmove_entry /* non-destructive, let memcpy do the work */ + +/* set-up pointers to copy backwards, add (length - 1) */ + addl rr4,rr2 /* src + length */ + addl rr6,rr2 /* dest + length */ + subl rr4,#1 + subl rr6,#1 + +/* check alignment */ + bitb rl7,#0 /* odd destination address? */ + jr z,testsrc + bitb rl5,#0 /* odd source address? */ + jr z,odd_copy + jr even_copy + +testsrc: + bitb rl5,#0 + jr nz,odd_copy /* src even, dest odd */ + lddb @rr6,@rr4,r3 + jr ov,finish /* jump if r5 is zero now */ + +/* copy words */ +even_copy: + ld r2,r3 /* remember length */ + srl r3,#1 +/* jr z,no_words it cannot be zero here */ + + dec r5,#1 + dec r7,#1 + lddr @rr6,@rr4,r3 + +no_words: + bitb rl2,#0 /* odd length? */ + jr z,finish + inc r5,#1 + inc r7,#1 + lddb @rr6,@rr4,r2 /* yes, copy last byte */ + jr finish + +/* copy bytes */ +odd_copy: + lddrb @rr6,@rr4,r3 + +finish: +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) +#else + popl rr2,@rr14 +#endif + + +#else /* above Z8001, below Z8002 */ + + + unsegm + +#ifdef __STD_CALL__ + ld r7,r15(#2) + ld r6,r15(#4) + ld r5,r15(#6) +#else + ld r2,r7 /* buffer pointer return value */ +#endif + +/* r5 - length + * r6 - src + * r7 - dest + */ + test r5 + jr z,finish + +/* check for destructive overlap (src < dest && dest < src + length) */ + + cp r7,r6 + jp ule,memmove_entry /* non-destructive, let memcpy do the work */ + ld r0,r5 + add r0,r6 /* r0 = src + length */ + cp r0,r7 + jp ult,memmove_entry /* non-destructive, let memcpy do the work */ + +/* set-up pointers to copy backwards, add (length - 1) */ + add r6,r5 /* src + length */ + add r7,r5 /* dest + length */ + dec r6,#1 + dec r7,#1 + +/* check alignment */ + bitb rl7,#0 /* odd destination address? */ + jr z,testsrc + bitb rl6,#0 /* odd source address? */ + jr z,odd_copy + jr even_copy + +testsrc: + bitb rl6,#0 + jr nz,odd_copy /* src even, dest odd */ + lddb @r7,@r6,r5 + jr ov,finish /* jump if r5 is zero now */ + +/* copy words */ +even_copy: + ld r4,r5 /* remember length */ + srl r5,#1 +/* jr z,no_words it cannot be zero here */ + + dec r6,#1 + dec r7,#1 + lddr @r7,@r6,r5 + +no_words: + bitb rl4,#0 /* odd length? */ + jr z,finish + inc r6,#1 + inc r7,#1 + lddb @r7,@r6,r4 /* yes, copy last byte */ + jr finish + +/* copy bytes */ +odd_copy: + lddrb @r7,@r6,r5 + +finish: +#ifdef __STD_CALL__ + ld r7,r15(#2) +#endif + +#endif /* Z8002 */ + + ret + .end diff --git a/lib/machine/z8k/memset.S b/lib/machine/z8k/memset.S new file mode 100644 index 0000000..43184c7 --- /dev/null +++ b/lib/machine/z8k/memset.S @@ -0,0 +1,135 @@ +/* + * memset routine for Z8000 + * Copyright (C) 2004 Christian Groessler + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* void *memset(void *buffer, int value, size_t length); + */ + + name "memset.S" + + .text + even +global _memset + +_memset: + +#ifdef __Z8001__ + segm + +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) + ld r5,rr14(#8) + ldl rr2,rr14(#10) +#else + pushl @rr14,rr6 +#endif + +/* rr2 - length + * rl5 - value + * rr6 - buffer + */ + testl rr2 + jr z,finish + + ldb rh5,rl5 + ld r1,r5 /* r1 contains value */ + bit r7,#0 + jr z,not_odd + + ldb @rr6,rl1 + inc r7,#1 + subl rr2,#1 + jr z,finish + +not_odd:ld r0,r3 /* remember length */ + srl r3,#1 + jr z,no_words + + ldl rr4,rr6 + ld @rr6,r1 + inc r7,#2 + dec r3,#1 + jr z,no_words + + ldir @rr6,@rr4,r3 /* fill words */ + +no_words: + bit r0,#0 /* one byte remaining? */ + jr z,finish + + ldb @rr6,rl1 + +finish: +#ifdef __STD_CALL__ + ldl rr6,rr14(#4) +#else + popl rr2,@rr14 +#endif + + +#else /* above Z8001, below Z8002 */ + + + unsegm + +#ifdef __STD_CALL__ + ld r7,r15(#2) + ld r6,r15(#4) + ld r5,r15(#6) +#else + ld r2,r7 /* buffer pointer return value */ +#endif + +/* r5 - length + * r6 - value + * r7 - buffer + */ + test r5 + jr z,finish + + ldb rh6,rl6 + ld r1,r6 /* r1 contains value */ + bit r7,#0 + jr z,not_odd + + ldb @r7,rl1 + inc r7,#1 + dec r5,#1 + jr z,finish + +not_odd:ld r0,r5 /* remember length */ + srl r5,#1 + jr z,no_words + + ld r4,r7 + ld @r7,r1 + inc r7,#2 + dec r5,#1 + jr z,no_words + + ldir @r7,@r4,r5 /* fill words */ + +no_words: + bit r0,#0 /* one byte remaining? */ + jr z,finish + + ldb @r7,rl1 + +finish: +#ifdef __STD_CALL__ + ld r7,r15(#2) +#endif + +#endif /* Z8002 */ + + ret + .end diff --git a/lib/machine/z8k/setjmp.S b/lib/machine/z8k/setjmp.S new file mode 100644 index 0000000..30240e1 --- /dev/null +++ b/lib/machine/z8k/setjmp.S @@ -0,0 +1,102 @@ + .global _setjmp + .global _longjmp + +#ifdef __Z8001__ + segm + +#ifdef __STD_CALL__ + +_setjmp: + ldl rr6,rr14(#4) ! get argument + ldl rr2,@rr14 ! fetch pc + ldl @rr6,rr2 ! save it + ldl rr6(#16),rr8 + ldl rr6(#4),rr10 + ldl rr6(#8),rr12 ! remember frame pointer + ldl rr6(#12),rr14 ! remember stack pointer + ldk r7,#0 + ret t + +_longjmp: + ldl rr4,rr14(#4) ! get first argument + ld r7,rr14(#8) ! get return value + ldl rr8,rr4(#16) + ldl rr10,rr4(#4) + ldl rr12,rr4(#8) ! restore old frame pointer + ldl rr14,rr4(#12) ! restore old stack pointer + ldl rr4,@rr4 ! return address + inc r15,#4 + jp @rr4 + +#else /* above __STD_CALL_, below not */ + +_setjmp: + ldl rr2,@rr14 ! fetch pc + ldl @rr6,rr2 ! save it + ldl rr6(16),rr8 + ldl rr6(4),rr10 + ldl rr6(8),rr12 ! and the other special regs + ldl rr6(12),rr14 + ldk r2,#0 + ret t + +_longjmp: + ld r2,r5 ! get return value + ldl rr4,rr6(0) + ldl rr8,rr6(16) + ldl rr10,rr6(4) + ldl rr12,rr6(8) + ldl rr14,rr6(12) + inc r15,#4 + jp @rr4 + +#endif /* not __STD_CALL__ */ +#else /* above Z8001, below Z8002 */ + unseg + +#ifdef __STD_CALL__ + +_setjmp: + ld r7,r15(#2) ! get argument + ld r2,@r15 ! fetch pc + ld @r7,r2 ! save it + ldl r7(#14),rr8 + ldl r7(#2),rr10 + ldl r7(#6),rr12 ! remember frame pointer + ldl r7(#10),rr14 ! remember stack pointer + ldk r7,#0 + ret t + +_longjmp: + ld r4,r15(#2) ! get first argument (jmp_buf) + ld r7,r15(#4) ! get return value + ldl rr8,r4(#14) + ldl rr10,r4(#2) + ldl rr12,r4(#6) ! restore old frame pointer + ldl rr14,r4(#10) ! restore old stack pointer + ld r4,@r4 ! return address + inc r15,#2 + jp @r4 + +#else /* above __STD_CALL_, below not */ + +_setjmp: + ld r2,@r15 ! fetch pc + ld @r7,r2 ! save it + ldl r7(4),rr10 + ldl r7(8),rr12 ! and the other special regs + ldl r7(12),rr14 + ldk r2,#0 + ret t + +_longjmp: + ld r2,r6 ! get return value + ld r4,@r7 + ldl rr10,r7(4) + ldl rr12,r7(8) + ldl rr14,r7(12) + inc r15,#2 + jp @r4 + +#endif /* not __STD_CALL__ */ +#endif /* Z8002 version */ diff --git a/lib/misc/Makefile.inc b/lib/misc/Makefile.inc new file mode 100644 index 0000000..78bb022 --- /dev/null +++ b/lib/misc/Makefile.inc @@ -0,0 +1,18 @@ +libc_a_SOURCES += \ + %D%/__dprintf.c \ + %D%/unctrl.c \ + %D%/ffs.c \ + %D%/init.c \ + %D%/fini.c + +if NEWLIB_RETARGETABLE_LOCKING +libc_a_SOURCES += \ + %D%/lock.c +endif + +LIBC_CHEWOUT_FILES += \ + %D%/ffs.def \ + %D%/lock.def \ + %D%/unctrl.def + +LIBC_CHAPTERS += %D%/misc.tex diff --git a/lib/misc/__dprintf.c b/lib/misc/__dprintf.c new file mode 100644 index 0000000..31454f4 --- /dev/null +++ b/lib/misc/__dprintf.c @@ -0,0 +1,268 @@ +/* Debugging printf, for debugging the library itself. + + We don't assume stdio is working. + We do assume _write_r is working. +*/ + +#include <_ansi.h> +#include "ctype.h" +#include "reent.h" +#include "string.h" +#include "unctrl.h" + +#ifdef __STDC__ +#include "stdarg.h" +#else +#include "varargs.h" +#endif + +#if 0 +static char *parse_number (); +#endif + +static long get_number (char *, long, int); +static void print_number (int, int, long); +static void write_char (char c); +static void write_string (const char *s); + +/* Non-zero for big-endian systems. */ +static int big_endian_p; + +/* For now hardcode 2 (stderr) as the console file descriptor. + May wish to let the caller pass in a file descriptor or some such but + this is only for debugging purposes anyway. */ +#define CONSOLE_FD 2 + +/* Standalone printf routine. + + The format string has been enhanced so that multiple values can be dumped + without having to have a %-field for each one (say if you want to dump + 20 words at a certain address). A modifier of `N' says the next argument + is a count, and the one after that is a pointer. + + Example: __dprintf ("%Nx\n", 20, p); /-* print 20 ints at `p' *-/ + + Supported formats are: c d u x s p. + + All ints are retrieved a byte at a time so alignment issues are not + a problem. + + This routine is used in situations where the only debugging capability + is console output and was written to aid debugging newlib itself. We don't + use printf ourselves as we may be debugging it. We do assume _write_r is + working. +*/ + +void +#ifdef __STDC__ +__dprintf (const char *fmt, ...) +#else +__dprintf (fmt, va_alist) + char *fmt; + va_dcl +#endif +{ + va_list args; + + /* Which endian are we? */ + { + short tmp = 1; + big_endian_p = *(char *) &tmp == 0; + } + +#ifdef __STDC__ + va_start (args, fmt); +#else + va_start (args); +#endif + + while (*fmt) + { + char c, *p; + int count; + long l; + + if (*fmt != '%' || *++fmt == '%') + { + write_char (*fmt++); + continue; + } + + if (*fmt == 'N') + { + count = va_arg (args, int); + p = va_arg (args, char *); + ++fmt; + c = *fmt++; + + while (--count >= 0) + { + switch (c) + { + case 'c' : + write_string (unctrl (*p++)); + break; + case 'p' : + print_number (16, 1, get_number (p, sizeof (char *), 1)); + p += sizeof (char *); + break; + case 'd' : + case 'u' : + case 'x' : + print_number (c == 'x' ? 16 : 10, c != 'd', + get_number (p, sizeof (int), c != 'd')); + p += sizeof (int); + break; + case 's' : + write_string (*(char **) p); + p += sizeof (char *); + break; + } + if (count > 0) + write_char (' '); + } + } + else + { + switch (c = *fmt++) + { + case 'c' : + c = va_arg (args, int); + write_string (unctrl (c)); + break; + case 'p' : + l = (_POINTER_INT) va_arg (args, char *); + print_number (16, 1, l); + break; + case 'd' : + case 'u' : + case 'x' : + l = va_arg (args, int); + print_number (c == 'x' ? 16 : 10, c != 'd', l); + break; + case 's' : + p = va_arg (args, char *); + write_string (p); + break; + } + } + } + + va_end (args); +} + +#if 0 +/* Parse a positive decimal integer at S. + FIXME: Was used in earlier version, but not currently used. + Keep for now. */ + +static char * +parse_number (s, p) + char *s; + long *p; +{ + long x = 0; + + while (isdigit (*s)) + { + x = (x * 10) + (*s - '0'); + ++s; + } + + *p = x; + return s; +} +#endif + +/* Fetch the number at S of SIZE bytes. */ + +static long +get_number (char *s, + long size, + int unsigned_p) +{ + long x; + unsigned char *p = (unsigned char *) s; + + switch (size) + { + case 1 : + x = *p; + if (!unsigned_p) + x = (x ^ 0x80) - 0x80; + return x; + case 2 : + if (big_endian_p) + x = (p[0] << 8) | p[1]; + else + x = (p[1] << 8) | p[0]; + if (!unsigned_p) + x = (x ^ 0x8000) - 0x8000; + return x; + case 4 : + if (big_endian_p) + x = ((long)p[0] << 24) | ((long)p[1] << 16) | (p[2] << 8) | p[3]; + else + x = ((long)p[3] << 24) | ((long)p[2] << 16) | (p[1] << 8) | p[0]; + if (!unsigned_p) + x = (x ^ 0x80000000L) - 0x80000000L; + return x; +#if 0 /* FIXME: Is there a standard mechanism for knowing if + long longs exist? */ + case 8 : +#endif + default : + return 0; + } +} + +/* Print X in base BASE. */ + +static void +print_number (int base, + int unsigned_p, + long n) +{ + static char chars[16] = "0123456789abcdef"; + char *p, buf[32]; + unsigned long x; + + if (!unsigned_p && n < 0) + { + write_char ('-'); + x = -n; + } + else + x = n; + + p = buf + sizeof (buf); + *--p = '\0'; + do + { + *--p = chars[x % base]; + x /= base; + } + while (x != 0); + + write_string (p); +} + +/* Write C to the console. + We go through the file descriptor directly because we can't assume + stdio is working. */ + +static void +write_char (char c) +{ + _write_r (_REENT, CONSOLE_FD, &c, 1); +} + +/* Write S to the console. + We go through the file descriptor directly because we can't assume + stdio is working. */ + +static void +write_string (const char *s) +{ + _write_r (_REENT, CONSOLE_FD, s, strlen (s)); +} diff --git a/lib/misc/ffs.c b/lib/misc/ffs.c new file mode 100644 index 0000000..068f254 --- /dev/null +++ b/lib/misc/ffs.c @@ -0,0 +1,32 @@ +/* +FUNCTION + <>---find first bit set in a word + +INDEX + ffs + +SYNOPSIS + #include + int ffs(int <[word]>); + +DESCRIPTION + +<> returns the first bit set in a word. + +RETURNS +<> returns 0 if <[c]> is 0, 1 if <[c]> is odd, 2 if <[c]> is a multiple of +2, etc. + +PORTABILITY +<> is not ANSI C. + +No supporting OS subroutines are required. */ + +#include + +int +ffs(int i) +{ + + return (__builtin_ffs(i)); +} diff --git a/lib/misc/fini.c b/lib/misc/fini.c new file mode 100644 index 0000000..5f20160 --- /dev/null +++ b/lib/misc/fini.c @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2010 CodeSourcery, Inc. + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Handle ELF .{pre_init,init,fini}_array sections. */ +#include + +#ifdef _HAVE_INITFINI_ARRAY +extern void (*__fini_array_start []) (void) __attribute__((weak)); +extern void (*__fini_array_end []) (void) __attribute__((weak)); + +#ifdef _HAVE_INIT_FINI +extern void _fini (void); +#endif + +/* Run all the cleanup routines. */ +void +__libc_fini_array (void) +{ + size_t count; + size_t i; + + count = __fini_array_end - __fini_array_start; + for (i = count; i > 0; i--) + __fini_array_start[i-1] (); + +#ifdef _HAVE_INIT_FINI + _fini (); +#endif +} +#endif diff --git a/lib/misc/init.c b/lib/misc/init.c new file mode 100644 index 0000000..3aef7ad --- /dev/null +++ b/lib/misc/init.c @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2004 CodeSourcery, LLC + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Handle ELF .{pre_init,init,fini}_array sections. */ +#include + +#ifdef _HAVE_INITFINI_ARRAY + +/* These magic symbols are provided by the linker. */ +extern void (*__preinit_array_start []) (void) __attribute__((weak)); +extern void (*__preinit_array_end []) (void) __attribute__((weak)); +extern void (*__init_array_start []) (void) __attribute__((weak)); +extern void (*__init_array_end []) (void) __attribute__((weak)); + +#ifdef _HAVE_INIT_FINI +extern void _init (void); +#endif + +/* Iterate over all the init routines. */ +void +__libc_init_array (void) +{ + size_t count; + size_t i; + + count = __preinit_array_end - __preinit_array_start; + for (i = 0; i < count; i++) + __preinit_array_start[i] (); + +#ifdef _HAVE_INIT_FINI + _init (); +#endif + + count = __init_array_end - __init_array_start; + for (i = 0; i < count; i++) + __init_array_start[i] (); +} +#endif diff --git a/lib/misc/lock.c b/lib/misc/lock.c new file mode 100644 index 0000000..c03c36a --- /dev/null +++ b/lib/misc/lock.c @@ -0,0 +1,153 @@ +/* +FUNCTION +<<__retarget_lock_init>>, <<__retarget_lock_init_recursive>>, <<__retarget_lock_close>>, <<__retarget_lock_close_recursive>>, <<__retarget_lock_acquire>>, <<__retarget_lock_acquire_recursive>>, <<__retarget_lock_try_acquire>>, <<__retarget_lock_try_acquire_recursive>>, <<__retarget_lock_release>>, <<__retarget_lock_release_recursive>>---locking routines + +INDEX + __lock___sfp_recursive_mutex +INDEX + __lock___atexit_recursive_mutex +INDEX + __lock___at_quick_exit_mutex +INDEX + __lock___malloc_recursive_mutex +INDEX + __lock___env_recursive_mutex +INDEX + __lock___tz_mutex +INDEX + __lock___dd_hash_mutex +INDEX + __lock___arc4random_mutex + +INDEX + __retarget_lock_init +INDEX + __retarget_lock_init_recursive +INDEX + __retarget_lock_close +INDEX + __retarget_lock_close_recursive +INDEX + __retarget_lock_acquire +INDEX + __retarget_lock_acquire_recursive +INDEX + __retarget_lock_try_acquire +INDEX + __retarget_lock_try_acquire_recursive +INDEX + __retarget_lock_release +INDEX + __retarget_lock_release_recursive + +SYNOPSIS + #include + struct __lock __lock___sfp_recursive_mutex; + struct __lock __lock___atexit_recursive_mutex; + struct __lock __lock___at_quick_exit_mutex; + struct __lock __lock___malloc_recursive_mutex; + struct __lock __lock___env_recursive_mutex; + struct __lock __lock___tz_mutex; + struct __lock __lock___dd_hash_mutex; + struct __lock __lock___arc4random_mutex; + + void __retarget_lock_init (_LOCK_T * <[lock_ptr]>); + void __retarget_lock_init_recursive (_LOCK_T * <[lock_ptr]>); + void __retarget_lock_close (_LOCK_T <[lock]>); + void __retarget_lock_close_recursive (_LOCK_T <[lock]>); + void __retarget_lock_acquire (_LOCK_T <[lock]>); + void __retarget_lock_acquire_recursive (_LOCK_T <[lock]>); + int __retarget_lock_try_acquire (_LOCK_T <[lock]>); + int __retarget_lock_try_acquire_recursive (_LOCK_T <[lock]>); + void __retarget_lock_release (_LOCK_T <[lock]>); + void __retarget_lock_release_recursive (_LOCK_T <[lock]>); + +DESCRIPTION +Newlib was configured to allow the target platform to provide the locking +routines and static locks at link time. As such, a dummy default +implementation of these routines and static locks is provided for +single-threaded application to link successfully out of the box on bare-metal +systems. + +For multi-threaded applications the target platform is required to provide +an implementation for @strong{all} these routines and static locks. If some +routines or static locks are missing, the link will fail with doubly defined +symbols. + +PORTABILITY +These locking routines and static lock are newlib-specific. Supporting OS +subroutines are required for linking multi-threaded applications. +*/ + +/* dummy lock routines and static locks for single-threaded apps */ + +#ifndef __SINGLE_THREAD__ + +#include + +struct __lock { + char unused; +}; + +struct __lock __lock___sfp_recursive_mutex; +struct __lock __lock___atexit_recursive_mutex; +struct __lock __lock___at_quick_exit_mutex; +struct __lock __lock___malloc_recursive_mutex; +struct __lock __lock___env_recursive_mutex; +struct __lock __lock___tz_mutex; +struct __lock __lock___dd_hash_mutex; +struct __lock __lock___arc4random_mutex; + +void +__retarget_lock_init (_LOCK_T *lock) +{ +} + +void +__retarget_lock_init_recursive(_LOCK_T *lock) +{ +} + +void +__retarget_lock_close(_LOCK_T lock) +{ +} + +void +__retarget_lock_close_recursive(_LOCK_T lock) +{ +} + +void +__retarget_lock_acquire (_LOCK_T lock) +{ +} + +void +__retarget_lock_acquire_recursive (_LOCK_T lock) +{ +} + +int +__retarget_lock_try_acquire(_LOCK_T lock) +{ + return 1; +} + +int +__retarget_lock_try_acquire_recursive(_LOCK_T lock) +{ + return 1; +} + +void +__retarget_lock_release (_LOCK_T lock) +{ +} + +void +__retarget_lock_release_recursive (_LOCK_T lock) +{ +} + +#endif /* !defined(__SINGLE_THREAD__) */ diff --git a/lib/misc/misc.tex b/lib/misc/misc.tex new file mode 100644 index 0000000..248243b --- /dev/null +++ b/lib/misc/misc.tex @@ -0,0 +1,18 @@ +@node Misc +@chapter Miscellaneous Macros and Functions +This chapter describes miscellaneous routines not covered elsewhere. + +@menu +* ffs:: Return first bit set in a word +* __retarget_lock_init:: Retargetable locking routines +* unctrl:: Return printable representation of a character +@end menu + +@page +@include misc/ffs.def + +@page +@include misc/lock.def + +@page +@include misc/unctrl.def diff --git a/lib/misc/unctrl.c b/lib/misc/unctrl.c new file mode 100644 index 0000000..cd2d937 --- /dev/null +++ b/lib/misc/unctrl.c @@ -0,0 +1,137 @@ +/* +FUNCTION + <>---get printable representation of a character + +INDEX + unctrl +INDEX + unctrllen + +SYNOPSIS + #include + char *unctrl(int <[c]>); + int unctrllen(int <[c]>); + +DESCRIPTION +<> is a macro which returns the printable representation of <[c]> +as a string. +<> is a macro which returns the length of the printable +representation of <[c]>. + +RETURNS +<> returns a string of the printable representation of <[c]>. + +<> returns the length of the string which is the printable +representation of <[c]>. + +PORTABILITY +<> and <> are not ANSI C. + +No supporting OS subroutines are required. +*/ + +/* + * Copyright (c) 1981, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)unctrl.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ + +const char * const __unctrl[256] = { + "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", + "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O", + "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W", + "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_", + " ", "!", "\"", "#", "$", "%", "&", "'", + "(", ")", "*", "+", ",", "-", ".", "/", + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", ":", ";", "<", "=", ">", "?", + "@", "A", "B", "C", "D", "E", "F", "G", + "H", "I", "J", "K", "L", "M", "N", "O", + "P", "Q", "R", "S", "T", "U", "V", "W", + "X", "Y", "Z", "[", "\\", "]", "^", "_", + "`", "a", "b", "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", "m", "n", "o", + "p", "q", "r", "s", "t", "u", "v", "w", + "x", "y", "z", "{", "|", "}", "~", "^?", + + "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87", + "0x88", "0x89", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f", + "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97", + "0x98", "0x99", "0x9a", "0x9b", "0x9c", "0x9d", "0x9e", "0x9f", + "0xa0", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", "0xa7", + "0xa8", "0xa9", "0xaa", "0xab", "0xac", "0xad", "0xae", "0xaf", + "0xb0", "0xb1", "0xb2", "0xb3", "0xb4", "0xb5", "0xb6", "0xb7", + "0xb8", "0xb9", "0xba", "0xbb", "0xbc", "0xbd", "0xbe", "0xbf", + "0xc0", "0xc1", "0xc2", "0xc3", "0xc4", "0xc5", "0xc6", "0xc7", + "0xc8", "0xc9", "0xca", "0xcb", "0xcc", "0xcd", "0xce", "0xcf", + "0xd0", "0xd1", "0xd2", "0xd3", "0xd4", "0xd5", "0xd6", "0xd7", + "0xd8", "0xd9", "0xda", "0xdb", "0xdc", "0xdd", "0xde", "0xdf", + "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", "0xe6", "0xe7", + "0xe8", "0xe9", "0xea", "0xeb", "0xec", "0xed", "0xee", "0xef", + "0xf0", "0xf1", "0xf2", "0xf3", "0xf4", "0xf5", "0xf6", "0xf7", + "0xf8", "0xf9", "0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff", +}; + +const char __unctrllen[256] = { + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, +}; diff --git a/lib/posix/COPYRIGHT b/lib/posix/COPYRIGHT new file mode 100644 index 0000000..dc823b1 --- /dev/null +++ b/lib/posix/COPYRIGHT @@ -0,0 +1,52 @@ +Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. +This software is not subject to any license of the American Telephone +and Telegraph Company or of the Regents of the University of California. + +Permission is granted to anyone to use this software for any purpose on +any computer system, and to alter it and redistribute it, subject +to the following restrictions: + +1. The author is not responsible for the consequences of use of this + software, no matter how awful, even if they arise from flaws in it. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. Since few users ever read sources, + credits must appear in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. Since few users + ever read sources, credits must appear in the documentation. + +4. This notice may not be removed or altered. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +/*- + * Copyright (c) 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94 + */ diff --git a/lib/posix/Makefile.inc b/lib/posix/Makefile.inc new file mode 100644 index 0000000..9995805 --- /dev/null +++ b/lib/posix/Makefile.inc @@ -0,0 +1,43 @@ +if HAVE_POSIX_DIR + +libc_a_SOURCES += \ + %D%/closedir.c %D%/collate.c %D%/collcmp.c %D%/creat.c %D%/dirfd.c \ + %D%/fnmatch.c %D%/glob.c %D%/_isatty.c %D%/isatty.c \ + %D%/opendir.c %D%/readdir.c %D%/readdir_r.c \ + %D%/regcomp.c %D%/regerror.c %D%/regexec.c %D%/regfree.c \ + %D%/rewinddir.c %D%/sleep.c %D%/usleep.c \ + %D%/telldir.c %D%/ftw.c %D%/nftw.c + +%C%_ELIX_2_SOURCES = \ + %D%/scandir.c %D%/seekdir.c + +%C%_ELIX_3_SOURCES = \ + %D%/execl.c %D%/execle.c %D%/execlp.c %D%/execv.c \ + %D%/execve.c %D%/execvp.c %D%/wordexp.c %D%/wordfree.c + +%C%_ELIX_4_SOURCES = \ + %D%/popen.c %D%/posix_spawn.c + +if ELIX_LEVEL_1 +libc_a_SOURCES += +else +if ELIX_LEVEL_2 +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) +else +if ELIX_LEVEL_3 +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_3_SOURCES) +else +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_3_SOURCES) $(%C%_ELIX_4_SOURCES) +endif +endif +endif + +endif + +libc_a_CPPFLAGS_%C% = -D_GNU_SOURCE + +LIBC_CHEWOUT_FILES += \ + %D%/popen.def \ + %D%/posix_spawn.def + +LIBC_CHAPTERS += %D%/posix.tex diff --git a/lib/posix/_isatty.c b/lib/posix/_isatty.c new file mode 100644 index 0000000..c4dcc1f --- /dev/null +++ b/lib/posix/_isatty.c @@ -0,0 +1,21 @@ +/* isatty.c */ + +/* Dumb implementation so programs will at least run. */ + +#include +#include + +int +_isatty (int fd) +{ + struct stat buf; + + if (fstat (fd, &buf) < 0) { + errno = EBADF; + return 0; + } + if (S_ISCHR (buf.st_mode)) + return 1; + errno = ENOTTY; + return 0; +} diff --git a/lib/posix/cclass.h b/lib/posix/cclass.h new file mode 100644 index 0000000..08343d4 --- /dev/null +++ b/lib/posix/cclass.h @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cclass.h 8.3 (Berkeley) 3/20/94 + * $FreeBSD: src/lib/libc/regex/cclass.h,v 1.4 2002/03/22 23:41:56 obrien Exp $ + */ + + +typedef enum {CALNUM, CALPHA, CBLANK, CCNTRL, CDIGIT, CGRAPH, + CLOWER, CPRINT, CPUNCT, CSPACE, CUPPER, CXDIGIT} citype; + +/* character-class table */ +static struct cclass { + char *name; + citype fidx; +} cclasses[] = { + {"alnum", CALNUM}, + {"alpha", CALPHA}, + {"blank", CBLANK}, + {"cntrl", CCNTRL}, + {"digit", CDIGIT}, + {"graph", CGRAPH}, + {"lower", CLOWER}, + {"print", CPRINT}, + {"punct", CPUNCT}, + {"space", CSPACE}, + {"upper", CUPPER}, + {"xdigit", CXDIGIT}, + {NULL, } +}; diff --git a/lib/posix/closedir.c b/lib/posix/closedir.c new file mode 100644 index 0000000..c19e21f --- /dev/null +++ b/lib/posix/closedir.c @@ -0,0 +1,66 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)closedir.c 5.9 (Berkeley) 2/23/91"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include + +extern void _cleanupdir (DIR *dirp); + +/* + * close a directory. + */ +int +closedir (register DIR *dirp) +{ + int rc; + +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#endif + rc = close(dirp->dd_fd); + _cleanupdir(dirp); + free((void *)dirp->dd_buf); +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); + __lock_close_recursive(dirp->dd_lock); +#endif + free((void *)dirp); + return rc; +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/cname.h b/lib/posix/cname.h new file mode 100644 index 0000000..efb177c --- /dev/null +++ b/lib/posix/cname.h @@ -0,0 +1,138 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cname.h 8.3 (Berkeley) 3/20/94 + * $FreeBSD: src/lib/libc/regex/cname.h,v 1.3 2002/03/22 23:41:56 obrien Exp $ + */ + +/* character-name table */ +static struct cname { + char *name; + char code; +} cnames[] = { + {"NUL", '\0'}, + {"SOH", '\001'}, + {"STX", '\002'}, + {"ETX", '\003'}, + {"EOT", '\004'}, + {"ENQ", '\005'}, + {"ACK", '\006'}, + {"BEL", '\007'}, + {"alert", '\007'}, + {"BS", '\010'}, + {"backspace", '\b'}, + {"HT", '\011'}, + {"tab", '\t'}, + {"LF", '\012'}, + {"newline", '\n'}, + {"VT", '\013'}, + {"vertical-tab", '\v'}, + {"FF", '\014'}, + {"form-feed", '\f'}, + {"CR", '\015'}, + {"carriage-return", '\r'}, + {"SO", '\016'}, + {"SI", '\017'}, + {"DLE", '\020'}, + {"DC1", '\021'}, + {"DC2", '\022'}, + {"DC3", '\023'}, + {"DC4", '\024'}, + {"NAK", '\025'}, + {"SYN", '\026'}, + {"ETB", '\027'}, + {"CAN", '\030'}, + {"EM", '\031'}, + {"SUB", '\032'}, + {"ESC", '\033'}, + {"IS4", '\034'}, + {"FS", '\034'}, + {"IS3", '\035'}, + {"GS", '\035'}, + {"IS2", '\036'}, + {"RS", '\036'}, + {"IS1", '\037'}, + {"US", '\037'}, + {"space", ' '}, + {"exclamation-mark", '!'}, + {"quotation-mark", '"'}, + {"number-sign", '#'}, + {"dollar-sign", '$'}, + {"percent-sign", '%'}, + {"ampersand", '&'}, + {"apostrophe", '\''}, + {"left-parenthesis", '('}, + {"right-parenthesis", ')'}, + {"asterisk", '*'}, + {"plus-sign", '+'}, + {"comma", ','}, + {"hyphen", '-'}, + {"hyphen-minus", '-'}, + {"period", '.'}, + {"full-stop", '.'}, + {"slash", '/'}, + {"solidus", '/'}, + {"zero", '0'}, + {"one", '1'}, + {"two", '2'}, + {"three", '3'}, + {"four", '4'}, + {"five", '5'}, + {"six", '6'}, + {"seven", '7'}, + {"eight", '8'}, + {"nine", '9'}, + {"colon", ':'}, + {"semicolon", ';'}, + {"less-than-sign", '<'}, + {"equals-sign", '='}, + {"greater-than-sign", '>'}, + {"question-mark", '?'}, + {"commercial-at", '@'}, + {"left-square-bracket", '['}, + {"backslash", '\\'}, + {"reverse-solidus", '\\'}, + {"right-square-bracket",']'}, + {"circumflex", '^'}, + {"circumflex-accent", '^'}, + {"underscore", '_'}, + {"low-line", '_'}, + {"grave-accent", '`'}, + {"left-brace", '{'}, + {"left-curly-bracket", '{'}, + {"vertical-line", '|'}, + {"right-brace", '}'}, + {"right-curly-bracket", '}'}, + {"tilde", '~'}, + {"DEL", '\177'}, + {NULL, 0} +}; diff --git a/lib/posix/collate.c b/lib/posix/collate.c new file mode 100644 index 0000000..a2f62c9 --- /dev/null +++ b/lib/posix/collate.c @@ -0,0 +1,215 @@ +/*- + * Copyright (c) 1995 Alex Tatmanjants + * at Electronni Visti IA, Kiev, Ukraine. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include "namespace.h" +#include "rune.h" +#include +#include +#include +#include +#include +#include "sysexits.h" +#include "un-namespace.h" + +#include "collate.h" + +extern char *_PathLocale; +int __collate_load_error = 1; +int __collate_substitute_nontrivial; +char __collate_version[STR_LEN]; +u_char __collate_substitute_table[UCHAR_MAX + 1][STR_LEN]; +struct __collate_st_char_pri __collate_char_pri_table[UCHAR_MAX + 1]; +struct __collate_st_chain_pri __collate_chain_pri_table[TABLE_SIZE]; + +#define FREAD(a, b, c, d) \ + do { \ + if (fread(a, b, c, d) != c) { \ + fclose(d); \ + return -1; \ + } \ + } while(0) + +void __collate_err(int ex, const char *f); + +int +__collate_load_tables(encoding) + char *encoding; +{ + char buf[PATH_MAX]; + FILE *fp; + int i, save_load_error; + + save_load_error = __collate_load_error; + __collate_load_error = 1; + if (!encoding) { + __collate_load_error = save_load_error; + return -1; + } + if (!strcmp(encoding, "C") || !strcmp(encoding, "POSIX")) + return 0; + if (!_PathLocale) { + __collate_load_error = save_load_error; + return -1; + } + /* Range checking not needed, encoding has fixed size */ + (void) strcpy(buf, _PathLocale); + (void) strcat(buf, "/"); + (void) strcat(buf, encoding); + (void) strcat(buf, "/LC_COLLATE"); + if ((fp = fopen(buf, "r")) == NULL) { + __collate_load_error = save_load_error; + return -1; + } + FREAD(__collate_version, sizeof(__collate_version), 1, fp); + if (strcmp(__collate_version, COLLATE_VERSION) != 0) { + fclose(fp); + return -1; + } + FREAD(__collate_substitute_table, sizeof(__collate_substitute_table), + 1, fp); + FREAD(__collate_char_pri_table, sizeof(__collate_char_pri_table), 1, + fp); + FREAD(__collate_chain_pri_table, sizeof(__collate_chain_pri_table), 1, + fp); + fclose(fp); + __collate_load_error = 0; + + __collate_substitute_nontrivial = 0; + for (i = 0; i < UCHAR_MAX + 1; i++) { + if (__collate_substitute_table[i][0] != i || + __collate_substitute_table[i][1] != 0) { + __collate_substitute_nontrivial = 1; + break; + } + } + + return 0; +} + +u_char * +__collate_substitute(s) + const u_char *s; +{ + int dest_len, len, nlen; + int delta = strlen((const char *) s); + u_char *dest_str = NULL; + + if(s == NULL || *s == '\0') + return __collate_strdup((u_char *) ""); + delta += delta / 8; + dest_str = (u_char *) malloc(dest_len = delta); + if(dest_str == NULL) + __collate_err(EX_OSERR, __FUNCTION__); + len = 0; + while(*s) { + nlen = len + strlen((const char *) + __collate_substitute_table[*s]); + if (dest_len <= nlen) { + dest_str = reallocf(dest_str, dest_len = nlen + delta); + if(dest_str == NULL) + __collate_err(EX_OSERR, __FUNCTION__); + } + strcpy((char *) dest_str + len, + (const char *) __collate_substitute_table[*s++]); + len = nlen; + } + return dest_str; +} + +void +__collate_lookup(t, len, prim, sec) + const u_char *t; + int *len, *prim, *sec; +{ + struct __collate_st_chain_pri *p2; + + *len = 1; + *prim = *sec = 0; + for(p2 = __collate_chain_pri_table; p2->str[0]; p2++) { + if(strncmp((const char *) t, (const char *) p2->str, + strlen((const char *) p2->str)) == 0) { + *len = strlen((const char *) p2->str); + *prim = p2->prim; + *sec = p2->sec; + return; + } + } + *prim = __collate_char_pri_table[*t].prim; + *sec = __collate_char_pri_table[*t].sec; +} + +u_char * +__collate_strdup(s) + u_char *s; +{ + u_char *t = (u_char *) strdup((const char *) s); + + if (t == NULL) + __collate_err(EX_OSERR, __FUNCTION__); + return t; +} + +void +__collate_err(int ex, const char *f) +{ + const char *s; + int serrno = errno; + int dummy; + + /* Be careful to change write counts if you change the strings */ + write(STDERR_FILENO, "collate_error: ", 15); + write(STDERR_FILENO, f, strlen(f)); + write(STDERR_FILENO, ": ", 2); + s = _strerror_r(_REENT, serrno, 1, &dummy); + write(STDERR_FILENO, s, strlen(s)); + write(STDERR_FILENO, "\n", 1); + exit(ex); +} + +#ifdef COLLATE_DEBUG +void +__collate_print_tables() +{ + int i; + struct __collate_st_chain_pri *p2; + + printf("Substitute table:\n"); + for (i = 0; i < UCHAR_MAX + 1; i++) + if (i != *__collate_substitute_table[i]) + printf("\t'%c' --> \"%s\"\n", i, + __collate_substitute_table[i]); + printf("Chain priority table:\n"); + for (p2 = __collate_chain_pri_table; p2->str[0]; p2++) + printf("\t\"%s\" : %d %d\n\n", p2->str, p2->prim, p2->sec); + printf("Char priority table:\n"); + for (i = 0; i < UCHAR_MAX + 1; i++) + printf("\t'%c' : %d %d\n", i, __collate_char_pri_table[i].prim, + __collate_char_pri_table[i].sec); +} +#endif diff --git a/lib/posix/collate.h b/lib/posix/collate.h new file mode 100644 index 0000000..2e04518 --- /dev/null +++ b/lib/posix/collate.h @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 1995 Alex Tatmanjants + * at Electronni Visti IA, Kiev, Ukraine. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libc/locale/collate.h,v 1.11 2002/03/21 22:46:54 obrien Exp $ + */ + +#ifndef _COLLATE_H_ +#define _COLLATE_H_ + +#include +#include +#include + +#define STR_LEN 10 +#define TABLE_SIZE 100 +#define COLLATE_VERSION "1.0\n" + +struct __collate_st_char_pri { + int prim, sec; +}; +struct __collate_st_chain_pri { + u_char str[STR_LEN]; + int prim, sec; +}; + +extern int __collate_load_error; +extern int __collate_substitute_nontrivial; +extern char __collate_version[STR_LEN]; +extern u_char __collate_substitute_table[UCHAR_MAX + 1][STR_LEN]; +extern struct __collate_st_char_pri __collate_char_pri_table[UCHAR_MAX + 1]; +extern struct __collate_st_chain_pri __collate_chain_pri_table[TABLE_SIZE]; + +__BEGIN_DECLS +u_char *__collate_strdup(u_char *); +u_char *__collate_substitute(const u_char *); +int __collate_load_tables(char *); +void __collate_lookup(const u_char *, int *, int *, int *); +int __collate_range_cmp(int, int); +#ifdef COLLATE_DEBUG +void __collate_print_tables(void); +#endif +__END_DECLS + +#endif /* !_COLLATE_H_ */ diff --git a/lib/posix/collcmp.c b/lib/posix/collcmp.c new file mode 100644 index 0000000..7770897 --- /dev/null +++ b/lib/posix/collcmp.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 1996 by Andrey A. Chernov, Moscow, Russia. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#define ASCII_COMPATIBLE_COLLATE /* see share/colldef */ + +#include +#include "collate.h" +#ifndef ASCII_COMPATIBLE_COLLATE +#include +#endif + +/* + * Compare two characters converting collate information + * into ASCII-compatible range, it allows to handle + * "[a-z]"-type ranges with national characters. + */ + +int __collate_range_cmp (c1, c2) + int c1, c2; +{ + static char s1[2], s2[2]; + int ret; +#ifndef ASCII_COMPATIBLE_COLLATE + int as1, as2, al1, al2; +#endif + + c1 &= UCHAR_MAX; + c2 &= UCHAR_MAX; + if (c1 == c2) + return (0); + +#ifndef ASCII_COMPATIBLE_COLLATE + as1 = isascii(c1); + as2 = isascii(c2); + al1 = isalpha(c1); + al2 = isalpha(c2); + + if (as1 || as2 || al1 || al2) { + if ((as1 && as2) || (!al1 && !al2)) + return (c1 - c2); + if (al1 && !al2) { + if (isupper(c1)) + return ('A' - c2); + else + return ('a' - c2); + } else if (al2 && !al1) { + if (isupper(c2)) + return (c1 - 'A'); + else + return (c1 - 'a'); + } + } +#endif + s1[0] = c1; + s2[0] = c2; + if ((ret = strcoll(s1, s2)) != 0) + return (ret); + return (c1 - c2); +} diff --git a/lib/posix/creat.c b/lib/posix/creat.c new file mode 100644 index 0000000..fab8073 --- /dev/null +++ b/lib/posix/creat.c @@ -0,0 +1,12 @@ +/* creat() "system call" */ + +/* This is needed by f2c and therefore the SPEC benchmarks. */ + +#include + +int +creat (const char *path, + mode_t mode) +{ + return open (path, O_WRONLY | O_CREAT | O_TRUNC, mode); +} diff --git a/lib/posix/dirfd.c b/lib/posix/dirfd.c new file mode 100644 index 0000000..439dfa2 --- /dev/null +++ b/lib/posix/dirfd.c @@ -0,0 +1,38 @@ +#ifndef HAVE_OPENDIR + +/*- + * Copyright (c) 2018 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +int +dirfd(DIR *dirp) +{ + + return (__dirfd(dirp)); +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/engine.c b/lib/posix/engine.c new file mode 100644 index 0000000..c80834a --- /dev/null +++ b/lib/posix/engine.c @@ -0,0 +1,1141 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)engine.c 8.5 (Berkeley) 3/20/94 + */ + +#include +#include <_ansi.h> + +/* + * The matching engine and friends. This file is #included by regexec.c + * after suitable #defines of a variety of macros used herein, so that + * different state representations can be used without duplicating masses + * of code. + */ + +#ifdef SNAMES +#define matcher smatcher +#define fast sfast +#define slow sslow +#define dissect sdissect +#define backref sbackref +#define step sstep +#define print sprint +#define at sat +#define match smat +#endif +#ifdef LNAMES +#define matcher lmatcher +#define fast lfast +#define slow lslow +#define dissect ldissect +#define backref lbackref +#define step lstep +#define print lprint +#define at lat +#define match lmat +#endif + +/* another structure passed up and down to avoid zillions of parameters */ +struct match { + struct re_guts *g; + int eflags; + regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ + char *offp; /* offsets work from here */ + char *beginp; /* start of string -- virtual NUL precedes */ + char *endp; /* end of string -- virtual NUL here */ + char *coldp; /* can be no match starting before here */ + char **lastpos; /* [nplus+1] */ + STATEVARS; + states st; /* current states */ + states fresh; /* states for a fresh start */ + states tmp; /* temporary */ + states empty; /* empty set of states */ +}; + +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === engine.c === */ +static int matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); +static char *dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static char *backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); +static char *fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static char *slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static states step(struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft); +#define BOL (OUT+1) +#define EOL (BOL+1) +#define BOLEOL (BOL+2) +#define NOTHING (BOL+3) +#define BOW (BOL+4) +#define EOW (BOL+5) +#define CODEMAX (BOL+5) /* highest code used */ +#define NONCHAR(c) ((c) > CHAR_MAX) +#define NNONCHAR (CODEMAX-CHAR_MAX) +#ifdef REDEBUG +static void print(struct match *m, char *caption, states st, int ch, FILE *d); +#endif +#ifdef REDEBUG +static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst); +#endif +#ifdef REDEBUG +static char *pchar(int ch); +#endif + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ + +#ifdef REDEBUG +#define SP(t, s, c) print(m, t, s, c, stdout) +#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2) +#define NOTE(str) { if (m->eflags®_TRACE) printf("=%s\n", (str)); } +#else +#define SP(t, s, c) /* nothing */ +#define AT(t, p1, p2, s1, s2) /* nothing */ +#define NOTE(s) /* nothing */ +#endif + +/* + - matcher - the actual matching engine + == static int matcher(struct re_guts *g, char *string, \ + == size_t nmatch, regmatch_t pmatch[], int eflags); + */ +static int /* 0 success, REG_NOMATCH failure */ +matcher(g, string, nmatch, pmatch, eflags) +struct re_guts *g; +char *string; +size_t nmatch; +regmatch_t pmatch[]; +int eflags; +{ + char *endp; + int i; + struct match mv; + struct match *m = &mv; + char *dp = NULL; + const sopno gf = g->firststate+1; /* +1 for OEND */ + const sopno gl = g->laststate; + char *start; + char *stop; + /* Boyer-Moore algorithms variables */ + char *pp; + int cj, mj; + char *mustfirst; + char *mustlast; + int *matchjump; + int *charjump; + + /* simplify the situation where possible */ + if (g->cflags®_NOSUB) + nmatch = 0; + if (eflags®_STARTEND) { + start = string + pmatch[0].rm_so; + stop = string + pmatch[0].rm_eo; + } else { + start = string; + stop = start + strlen(start); + } + if (stop < start) + return(REG_INVARG); + + /* prescreening; this does wonders for this rather slow code */ + if (g->must != NULL) { + if (g->charjump != NULL && g->matchjump != NULL) { + mustfirst = g->must; + mustlast = g->must + g->mlen - 1; + charjump = g->charjump; + matchjump = g->matchjump; + pp = mustlast; + for (dp = start+g->mlen-1; dp < stop;) { + /* Fast skip non-matches */ + while (dp < stop && charjump[(unsigned char) *dp]) + dp += charjump[(unsigned char) *dp]; + + if (dp >= stop) + break; + + /* Greedy matcher */ + /* We depend on not being used for + * for strings of length 1 + */ + while (*--dp == *--pp && pp != mustfirst); + + if (*dp == *pp) + break; + + /* Jump to next possible match */ + mj = matchjump[pp - mustfirst]; + cj = charjump[(unsigned char) *dp]; + dp += (cj < mj ? mj : cj); + pp = mustlast; + } + if (pp != mustfirst) + return(REG_NOMATCH); + } else { + for (dp = start; dp < stop; dp++) + if (*dp == g->must[0] && + stop - dp >= g->mlen && + memcmp(dp, g->must, (size_t)g->mlen) == 0) + break; + if (dp == stop) /* we didn't find g->must */ + return(REG_NOMATCH); + } + } + + /* match struct setup */ + m->g = g; + m->eflags = eflags; + m->pmatch = NULL; + m->lastpos = NULL; + m->offp = string; + m->beginp = start; + m->endp = stop; + STATESETUP(m, 4); + SETUP(m->st); + SETUP(m->fresh); + SETUP(m->tmp); + SETUP(m->empty); + CLEAR(m->empty); + + /* Adjust start according to moffset, to speed things up */ + if (g->moffset > -1) + start = ((dp - g->moffset) < start) ? start : dp - g->moffset; + + /* this loop does only one repetition except for backrefs */ + for (;;) { + endp = fast(m, start, stop, gf, gl); + if (endp == NULL) { /* a miss */ + STATETEARDOWN(m); + return(REG_NOMATCH); + } + if (nmatch == 0 && !g->backrefs) + break; /* no further info needed */ + + /* where? */ + assert(m->coldp != NULL); + for (;;) { + NOTE("finding start"); + endp = slow(m, m->coldp, stop, gf, gl); + if (endp != NULL) + break; + assert(m->coldp < m->endp); + m->coldp++; + } + if (nmatch == 1 && !g->backrefs) + break; /* no further info needed */ + + /* oh my, he wants the subexpressions... */ + if (m->pmatch == NULL) + m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * + sizeof(regmatch_t)); + if (m->pmatch == NULL) { + STATETEARDOWN(m); + return(REG_ESPACE); + } + for (i = 1; i <= m->g->nsub; i++) + m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; + if (!g->backrefs && !(m->eflags®_BACKR)) { + NOTE("dissecting"); + dp = dissect(m, m->coldp, endp, gf, gl); + } else { + if (g->nplus > 0 && m->lastpos == NULL) + m->lastpos = (char **)malloc((g->nplus+1) * + sizeof(char *)); + if (g->nplus > 0 && m->lastpos == NULL) { + free(m->pmatch); + STATETEARDOWN(m); + return(REG_ESPACE); + } + NOTE("backref dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + if (dp != NULL) + break; + + /* uh-oh... we couldn't find a subexpression-level match */ + assert(g->backrefs); /* must be back references doing it */ + assert(g->nplus == 0 || m->lastpos != NULL); + for (;;) { + if (dp != NULL || endp <= m->coldp) + break; /* defeat */ + NOTE("backoff"); + endp = slow(m, m->coldp, endp-1, gf, gl); + if (endp == NULL) + break; /* defeat */ + /* try it on a shorter possibility */ +#ifndef NDEBUG + for (i = 1; i <= m->g->nsub; i++) { + assert(m->pmatch[i].rm_so == -1); + assert(m->pmatch[i].rm_eo == -1); + } +#endif + NOTE("backoff dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + assert(dp == NULL || dp == endp); + if (dp != NULL) /* found a shorter one */ + break; + + /* despite initial appearances, there is no match here */ + NOTE("false alarm"); + start = m->coldp + 1; /* recycle starting later */ + assert(start <= stop); + } + + /* fill in the details if requested */ + if (nmatch > 0) { + pmatch[0].rm_so = m->coldp - m->offp; + pmatch[0].rm_eo = endp - m->offp; + } + if (nmatch > 1) { + assert(m->pmatch != NULL); + for (i = 1; i < nmatch; i++) + if (i <= m->g->nsub) + pmatch[i] = m->pmatch[i]; + else { + pmatch[i].rm_so = -1; + pmatch[i].rm_eo = -1; + } + } + + if (m->pmatch != NULL) + free((char *)m->pmatch); + if (m->lastpos != NULL) + free((char *)m->lastpos); + STATETEARDOWN(m); + return(0); +} + +/* + - dissect - figure out what matched what, no back references + == static char *dissect(struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* == stop (success) always */ +dissect(m, start, stop, startst, stopst) +struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + int i; + sopno ss; /* start sop of current subRE */ + sopno es; /* end sop of current subRE */ + char *sp; /* start of string matched by it */ + char *stp; /* string matched by it cannot pass here */ + char *rest; /* start of rest of string */ + char *tail; /* string unmatched by rest of RE */ + sopno ssub; /* start sop of subsubRE */ + sopno esub; /* end sop of subsubRE */ + char *ssp; /* start of string matched by subsubRE */ + char *sep; /* end of string matched by subsubRE */ + char *oldssp; /* previous ssp */ +#if __GNUC_PREREQ (4, 6) +/* dp is only used for assertion testing which, for some reason, is not + recognized as usage. */ +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif + char *dp; + + AT("diss", start, stop, startst, stopst); + sp = start; + for (ss = startst; ss < stopst; ss = es) { + /* identify end of subRE */ + es = ss; + switch (OP(m->g->strip[es])) { + case OPLUS_: + case OQUEST_: + es += OPND(m->g->strip[es]); + break; + case OCH_: + while (OP(m->g->strip[es]) != O_CH) + es += OPND(m->g->strip[es]); + break; + } + es++; + + /* figure out what it matched */ + switch (OP(m->g->strip[ss])) { + case OEND: + assert(nope); + break; + case OCHAR: + sp++; + break; + case OBOL: + case OEOL: + case OBOW: + case OEOW: + break; + case OANY: + case OANYOF: + sp++; + break; + case OBACK_: + case O_BACK: + assert(nope); + break; + /* cases where length of match is hard to find */ + case OQUEST_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + /* did innards match? */ + if (slow(m, sp, rest, ssub, esub) != NULL) { + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + } else /* no */ + assert(sp == rest); + sp = rest; + break; + case OPLUS_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + ssp = sp; + oldssp = ssp; + for (;;) { /* find last match of innards */ + sep = slow(m, ssp, rest, ssub, esub); + if (sep == NULL || sep == ssp) + break; /* failed or matched null */ + oldssp = ssp; /* on to next try */ + ssp = sep; + } + if (sep == NULL) { + /* last successful match */ + sep = ssp; + ssp = oldssp; + } + assert(sep == rest); /* must exhaust substring */ + assert(slow(m, ssp, sep, ssub, esub) == rest); + dp = dissect(m, ssp, sep, ssub, esub); + assert(dp == sep); + sp = rest; + break; + case OCH_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = ss + OPND(m->g->strip[ss]) - 1; + assert(OP(m->g->strip[esub]) == OOR1); + for (;;) { /* find first matching branch */ + if (slow(m, sp, rest, ssub, esub) == rest) + break; /* it matched all of it */ + /* that one missed, try next one */ + assert(OP(m->g->strip[esub]) == OOR1); + esub++; + assert(OP(m->g->strip[esub]) == OOR2); + ssub = esub + 1; + esub += OPND(m->g->strip[esub]); + if (OP(m->g->strip[esub]) == OOR2) + esub--; + else + assert(OP(m->g->strip[esub]) == O_CH); + } + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + sp = rest; + break; + case O_PLUS: + case O_QUEST: + case OOR1: + case OOR2: + case O_CH: + assert(nope); + break; + case OLPAREN: + i = OPND(m->g->strip[ss]); + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_so = sp - m->offp; + break; + case ORPAREN: + i = OPND(m->g->strip[ss]); + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_eo = sp - m->offp; + break; + default: /* uh oh */ + assert(nope); + break; + } + } + + assert(sp == stop); + return(sp); +} + +/* + - backref - figure out what matched what, figuring in back references + == static char *backref(struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst, sopno lev); + */ +static char * /* == stop (success) or NULL (failure) */ +backref(m, start, stop, startst, stopst, lev) +struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +sopno lev; /* PLUS nesting level */ +{ + int i; + sopno ss; /* start sop of current subRE */ + char *sp; /* start of string matched by it */ + sopno ssub; /* start sop of subsubRE */ + sopno esub; /* end sop of subsubRE */ + char *ssp; /* start of string matched by subsubRE */ + char *dp; + size_t len; + int hard; + sop s; + regoff_t offsave; + cset *cs; + + AT("back", start, stop, startst, stopst); + sp = start; + + /* get as far as we can with easy stuff */ + hard = 0; + for (ss = startst; !hard && ss < stopst; ss++) + switch (OP(s = m->g->strip[ss])) { + case OCHAR: + if (sp == stop || *sp++ != (char)OPND(s)) + return(NULL); + break; + case OANY: + if (sp == stop) + return(NULL); + sp++; + break; + case OANYOF: + cs = &m->g->sets[OPND(s)]; + if (sp == stop || !CHIN(cs, *sp++)) + return(NULL); + break; + case OBOL: + if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOL: + if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OBOW: + if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp > m->beginp && + !ISWORD(*(sp-1))) ) && + (sp < m->endp && ISWORD(*sp)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOW: + if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp < m->endp && !ISWORD(*sp)) ) && + (sp > m->beginp && ISWORD(*(sp-1))) ) + { /* yes */ } + else + return(NULL); + break; + case O_QUEST: + break; + case OOR1: /* matches null but needs to skip */ + ss++; + s = m->g->strip[ss]; + do { + assert(OP(s) == OOR2); + ss += OPND(s); + } while (OP(s = m->g->strip[ss]) != O_CH); + /* note that the ss++ gets us past the O_CH */ + break; + default: /* have to make a choice */ + hard = 1; + break; + } + if (!hard) { /* that was it! */ + if (sp != stop) + return(NULL); + return(sp); + } + ss--; /* adjust for the for's final increment */ + + /* the hard stuff */ + AT("hard", sp, stop, ss, stopst); + s = m->g->strip[ss]; + switch (OP(s)) { + case OBACK_: /* the vilest depths */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + if (m->pmatch[i].rm_eo == -1) + return(NULL); + assert(m->pmatch[i].rm_so != -1); + len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; + assert(stop - m->beginp >= len); + if (sp > stop - len) + return(NULL); /* not enough left to match */ + ssp = m->offp + m->pmatch[i].rm_so; + if (memcmp(sp, ssp, len) != 0) + return(NULL); + while (m->g->strip[ss] != SOP(O_BACK, i)) + ss++; + return(backref(m, sp+len, stop, ss+1, stopst, lev)); + break; + case OQUEST_: /* to null or not */ + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); /* not */ + return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); + break; + case OPLUS_: + assert(m->lastpos != NULL); + assert(lev+1 <= m->g->nplus); + m->lastpos[lev+1] = sp; + return(backref(m, sp, stop, ss+1, stopst, lev+1)); + break; + case O_PLUS: + if (sp == m->lastpos[lev]) /* last pass matched null */ + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + /* try another pass */ + m->lastpos[lev] = sp; + dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); + if (dp == NULL) + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + else + return(dp); + break; + case OCH_: /* find the right one, if any */ + ssub = ss + 1; + esub = ss + OPND(s) - 1; + assert(OP(m->g->strip[esub]) == OOR1); + for (;;) { /* find first matching branch */ + dp = backref(m, sp, stop, ssub, esub, lev); + if (dp != NULL) + return(dp); + /* that one missed, try next one */ + if (OP(m->g->strip[esub]) == O_CH) + return(NULL); /* there is none */ + esub++; + assert(OP(m->g->strip[esub]) == OOR2); + ssub = esub + 1; + esub += OPND(m->g->strip[esub]); + if (OP(m->g->strip[esub]) == OOR2) + esub--; + else + assert(OP(m->g->strip[esub]) == O_CH); + } + break; + case OLPAREN: /* must undo assignment if rest fails */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_so; + m->pmatch[i].rm_so = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_so = offsave; + return(NULL); + break; + case ORPAREN: /* must undo assignment if rest fails */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_eo; + m->pmatch[i].rm_eo = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_eo = offsave; + return(NULL); + break; + default: /* uh oh */ + assert(nope); + break; + } + + /* "can't happen" */ + assert(nope); + /* NOTREACHED */ + return "shut up gcc"; +} + +/* + - fast - step through the string at top speed + == static char *fast(struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* where tentative match ended, or NULL */ +fast(m, start, stop, startst, stopst) +struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + states st = m->st; + states fresh = m->fresh; + states tmp = m->tmp; + char *p = start; + int c = (start == m->beginp) ? OUT : *(start-1); + int lastc; /* previous c */ + int flagch; + int i; + char *coldp; /* last p after which no match was underway */ + + CLEAR(st); + SET1(st, startst); + st = step(m->g, startst, stopst, st, NOTHING, st); + ASSIGN(fresh, st); + SP("start", st, *p); + coldp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + if (EQ(st, fresh)) + coldp = p; + + /* is there an EOL and/or BOL between lastc and c? */ + flagch = '\0'; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flagch = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flagch = (flagch == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flagch, st); + SP("boleol", st, c); + } + + /* how about a word boundary? */ + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flagch = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + flagch = EOW; + } + if (flagch == BOW || flagch == EOW) { + st = step(m->g, startst, stopst, st, flagch, st); + SP("boweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, fresh); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, c, st); + SP("aft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); + p++; + } + + assert(coldp != NULL); + m->coldp = coldp; + if (ISSET(st, stopst)) + return(p+1); + else + return(NULL); +} + +/* + - slow - step through the string more deliberately + == static char *slow(struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* where it ended */ +slow(m, start, stop, startst, stopst) +struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + states st = m->st; + states empty = m->empty; + states tmp = m->tmp; + char *p = start; + int c = (start == m->beginp) ? OUT : *(start-1); + int lastc; /* previous c */ + int flagch; + int i; + char *matchp; /* last p at which a match ended */ + + AT("slow", start, stop, startst, stopst); + CLEAR(st); + SET1(st, startst); + SP("sstart", st, *p); + st = step(m->g, startst, stopst, st, NOTHING, st); + matchp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + + /* is there an EOL and/or BOL between lastc and c? */ + flagch = '\0'; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flagch = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flagch = (flagch == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flagch, st); + SP("sboleol", st, c); + } + + /* how about a word boundary? */ + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flagch = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + flagch = EOW; + } + if (flagch == BOW || flagch == EOW) { + st = step(m->g, startst, stopst, st, flagch, st); + SP("sboweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst)) + matchp = p; + if (EQ(st, empty) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, empty); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, c, st); + SP("saft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); + p++; + } + + return(matchp); +} + + +/* + - step - map set of states reachable before char to set reachable after + == static states step(struct re_guts *g, sopno start, sopno stop, \ + == states bef, int ch, states aft); + == #define BOL (OUT+1) + == #define EOL (BOL+1) + == #define BOLEOL (BOL+2) + == #define NOTHING (BOL+3) + == #define BOW (BOL+4) + == #define EOW (BOL+5) + == #define CODEMAX (BOL+5) // highest code used + == #define NONCHAR(c) ((c) > CHAR_MAX) + == #define NNONCHAR (CODEMAX-CHAR_MAX) + */ +static states +step(g, start, stop, bef, ch, aft) +struct re_guts *g; +sopno start; /* start state within strip */ +sopno stop; /* state after stop state within strip */ +states bef; /* states reachable before */ +int ch; /* character or NONCHAR code */ +states aft; /* states already known reachable after */ +{ + cset *cs; + sop s; + sopno pc; + onestate here; /* note, macros know this name */ + sopno look; + int i; + + for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { + s = g->strip[pc]; + switch (OP(s)) { + case OEND: + assert(pc == stop-1); + break; + case OCHAR: + /* only characters can match */ + assert(!NONCHAR(ch) || ch != (char)OPND(s)); + if (ch == (char)OPND(s)) + FWD(aft, bef, 1); + break; + case OBOL: + if (ch == BOL || ch == BOLEOL) + FWD(aft, bef, 1); + break; + case OEOL: + if (ch == EOL || ch == BOLEOL) + FWD(aft, bef, 1); + break; + case OBOW: + if (ch == BOW) + FWD(aft, bef, 1); + break; + case OEOW: + if (ch == EOW) + FWD(aft, bef, 1); + break; + case OANY: + if (!NONCHAR(ch)) + FWD(aft, bef, 1); + break; + case OANYOF: + cs = &g->sets[OPND(s)]; + if (!NONCHAR(ch) && CHIN(cs, ch)) + FWD(aft, bef, 1); + break; + case OBACK_: /* ignored here */ + case O_BACK: + FWD(aft, aft, 1); + break; + case OPLUS_: /* forward, this is just an empty */ + FWD(aft, aft, 1); + break; + case O_PLUS: /* both forward and back */ + FWD(aft, aft, 1); + i = ISSETBACK(aft, OPND(s)); + BACK(aft, aft, OPND(s)); + if (!i && ISSETBACK(aft, OPND(s))) { + /* oho, must reconsider loop body */ + pc -= OPND(s) + 1; + INIT(here, pc); + } + break; + case OQUEST_: /* two branches, both forward */ + FWD(aft, aft, 1); + FWD(aft, aft, OPND(s)); + break; + case O_QUEST: /* just an empty */ + FWD(aft, aft, 1); + break; + case OLPAREN: /* not significant here */ + case ORPAREN: + FWD(aft, aft, 1); + break; + case OCH_: /* mark the first two branches */ + FWD(aft, aft, 1); + assert(OP(g->strip[pc+OPND(s)]) == OOR2); + FWD(aft, aft, OPND(s)); + break; + case OOR1: /* done a branch, find the O_CH */ + if (ISSTATEIN(aft, here)) { + for (look = 1; + OP(s = g->strip[pc+look]) != O_CH; + look += OPND(s)) + assert(OP(s) == OOR2); + FWD(aft, aft, look); + } + break; + case OOR2: /* propagate OCH_'s marking */ + FWD(aft, aft, 1); + if (OP(g->strip[pc+OPND(s)]) != O_CH) { + assert(OP(g->strip[pc+OPND(s)]) == OOR2); + FWD(aft, aft, OPND(s)); + } + break; + case O_CH: /* just empty */ + FWD(aft, aft, 1); + break; + default: /* ooooops... */ + assert(nope); + break; + } + } + + return(aft); +} + +#ifdef REDEBUG +/* + - print - print a set of states + == #ifdef REDEBUG + == static void print(struct match *m, char *caption, states st, \ + == int ch, FILE *d); + == #endif + */ +static void +print(m, caption, st, ch, d) +struct match *m; +char *caption; +states st; +int ch; +FILE *d; +{ + struct re_guts *g = m->g; + int i; + int first = 1; + + if (!(m->eflags®_TRACE)) + return; + + fprintf(d, "%s", caption); + if (ch != '\0') + fprintf(d, " %s", pchar(ch)); + for (i = 0; i < g->nstates; i++) + if (ISSET(st, i)) { + fprintf(d, "%s%d", (first) ? "\t" : ", ", i); + first = 0; + } + fprintf(d, "\n"); +} + +/* + - at - print current situation + == #ifdef REDEBUG + == static void at(struct match *m, char *title, char *start, char *stop, \ + == sopno startst, sopno stopst); + == #endif + */ +static void +at(m, title, start, stop, startst, stopst) +struct match *m; +char *title; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + if (!(m->eflags®_TRACE)) + return; + + printf("%s %s-", title, pchar(*start)); + printf("%s ", pchar(*stop)); + printf("%ld-%ld\n", (long)startst, (long)stopst); +} + +#ifndef PCHARDONE +#define PCHARDONE /* never again */ +/* + - pchar - make a character printable + == #ifdef REDEBUG + == static char *pchar(int ch); + == #endif + * + * Is this identical to regchar() over in debug.c? Well, yes. But a + * duplicate here avoids having a debugging-capable regexec.o tied to + * a matching debug.o, and this is convenient. It all disappears in + * the non-debug compilation anyway, so it doesn't matter much. + */ +static char * /* -> representation */ +pchar(ch) +int ch; +{ + static char pbuf[10]; + + if (isprint((uch)ch) || ch == ' ') + sprintf(pbuf, "%c", ch); + else + sprintf(pbuf, "\\%o", ch); + return(pbuf); +} +#endif +#endif + +#undef matcher +#undef fast +#undef slow +#undef dissect +#undef backref +#undef step +#undef print +#undef at +#undef match diff --git a/lib/posix/execl.c b/lib/posix/execl.c new file mode 100644 index 0000000..c3b4e55 --- /dev/null +++ b/lib/posix/execl.c @@ -0,0 +1,39 @@ +#ifndef _NO_EXECVE + +/* execl.c */ + +/* This and the other exec*.c files in this directory require + the target to provide the _execve syscall. */ + +#include <_ansi.h> +#include + +/* Only deal with a pointer to environ, to work around subtle bugs with shared + libraries and/or small data systems where the user declares his own + 'environ'. */ +static char ***p_environ = &environ; + + +#include + +int +execl (const char *path, + const char *arg0, ...) + + +{ + int i; + va_list args; + const char *argv[256]; + + va_start (args, arg0); + argv[0] = arg0; + i = 1; + do + argv[i] = va_arg (args, const char *); + while (argv[i++] != NULL); + va_end (args); + + return _execve (path, (char * const *) argv, *p_environ); +} +#endif /* !_NO_EXECVE */ diff --git a/lib/posix/execle.c b/lib/posix/execle.c new file mode 100644 index 0000000..34f0ea3 --- /dev/null +++ b/lib/posix/execle.c @@ -0,0 +1,37 @@ +#ifndef _NO_EXECVE + +/* execle.c */ + +/* This and the other exec*.c files in this directory require + the target to provide the _execve syscall. */ + +#include <_ansi.h> +#include + + +#include + +int +execle (const char *path, + const char *arg0, ...) + + +{ + int i; + va_list args; + const char * const *envp; + const char *argv[256]; + + va_start (args, arg0); + argv[0] = arg0; + i = 1; + do + argv[i] = va_arg (args, const char *); + while (argv[i++] != NULL); + envp = va_arg (args, const char * const *); + va_end (args); + + return _execve (path, (char * const *) argv, (char * const *) envp); +} + +#endif /* !_NO_EXECVE */ diff --git a/lib/posix/execlp.c b/lib/posix/execlp.c new file mode 100644 index 0000000..b845c88 --- /dev/null +++ b/lib/posix/execlp.c @@ -0,0 +1,35 @@ +#ifndef _NO_EXECVE + +/* execlp.c */ + +/* This and the other exec*.c files in this directory require + the target to provide the _execve syscall. */ + +#include <_ansi.h> +#include + + +#include + +int +execlp (const char *path, + const char *arg0, ...) + + +{ + int i; + va_list args; + const char *argv[256]; + + va_start (args, arg0); + argv[0] = arg0; + i = 1; + do + argv[i] = va_arg (args, const char *); + while (argv[i++] != NULL); + va_end (args); + + return execvp (path, (char * const *) argv); +} + +#endif /* !_NO_EXECVE */ diff --git a/lib/posix/execv.c b/lib/posix/execv.c new file mode 100644 index 0000000..6a1052c --- /dev/null +++ b/lib/posix/execv.c @@ -0,0 +1,23 @@ +#ifndef _NO_EXECVE + +/* execv.c */ + +/* This and the other exec*.c files in this directory require + the target to provide the _execve syscall. */ + +#include <_ansi.h> +#include + +/* Only deal with a pointer to environ, to work around subtle bugs with shared + libraries and/or small data systems where the user declares his own + 'environ'. */ +static char ***p_environ = &environ; + +int +execv (const char *path, + char * const argv[]) +{ + return _execve (path, (char * const *) argv, *p_environ); +} + +#endif /* !_NO_EXECVE */ diff --git a/lib/posix/execve.c b/lib/posix/execve.c new file mode 100644 index 0000000..99c1454 --- /dev/null +++ b/lib/posix/execve.c @@ -0,0 +1,20 @@ +#ifndef _NO_EXECVE + +/* execve.c */ + +/* This and the other exec*.c files in this directory require + the target to provide the _execve syscall. */ + + +#include + + +int +execve (const char *path, + char * const argv[], + char * const envp[]) +{ + return _execve (path, argv, envp); +} + +#endif /* !_NO_EXECVE */ diff --git a/lib/posix/execvp.c b/lib/posix/execvp.c new file mode 100644 index 0000000..be7e71c --- /dev/null +++ b/lib/posix/execvp.c @@ -0,0 +1,71 @@ +#ifndef _NO_EXECVE + +/* execvp.c */ + +/* This and the other exec*.c files in this directory require + the target to provide the _execve syscall. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include + +#define PATH_DELIM ':' + +/* + * Copy string, until c or is encountered. + * NUL-terminate the destination string (s1). + */ + +static char * +strccpy (char *s1, + char *s2, + char c) +{ + char *dest = s1; + + while (*s2 && *s2 != c) + *s1++ = *s2++; + *s1 = 0; + + return dest; +} + +int +execvp (const char *file, + char * const argv[]) +{ + char *path = getenv ("PATH"); + char buf[MAXNAMLEN]; + + /* If $PATH doesn't exist, just pass FILE on unchanged. */ + if (!path) + return execv (file, argv); + + /* If FILE contains a directory, don't search $PATH. */ + if (strchr (file, '/') + ) + return execv (file, argv); + + while (*path) + { + strccpy (buf, path, PATH_DELIM); + /* An empty entry means the current directory. */ + if (*buf != 0 && buf[strlen(buf) - 1] != '/') + strcat (buf, "/"); + strcat (buf, file); + if (execv (buf, argv) == -1 && errno != ENOENT) + return -1; + while (*path && *path != PATH_DELIM) + path++; + if (*path == PATH_DELIM) + path++; /* skip over delim */ + } + + return -1; +} + +#endif /* !_NO_EXECVE */ diff --git a/lib/posix/fnmatch.3 b/lib/posix/fnmatch.3 new file mode 100644 index 0000000..aec25ea --- /dev/null +++ b/lib/posix/fnmatch.3 @@ -0,0 +1,147 @@ +.\" Copyright (c) 1989, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Guido van Rossum. +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)fnmatch.3 8.3 (Berkeley) 4/28/95 +.\" $FreeBSD: src/lib/libc/gen/fnmatch.3,v 1.12 2001/10/01 16:08:50 ru Exp $ +.\" +.Dd April 28, 1995 +.Dt FNMATCH 3 +.Os +.Sh NAME +.Nm fnmatch +.Nd match filename or pathname +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In fnmatch.h +.Ft int +.Fn fnmatch "const char *pattern" "const char *string" "int flags" +.Sh DESCRIPTION +The +.Fn fnmatch +function +matches patterns according to the rules used by the shell. +It checks the string specified by the +.Fa string +argument to see if it matches the pattern specified by the +.Fa pattern +argument. +.Pp +The +.Fa flags +argument modifies the interpretation of +.Fa pattern +and +.Fa string . +The value of +.Fa flags +is the bitwise inclusive +.Tn OR +of any of the following +constants, which are defined in the include file +.Pa fnmatch.h . +.Bl -tag -width FNM_PATHNAME +.It Dv FNM_NOESCAPE +Normally, every occurrence of a backslash +.Pq Ql \e +followed by a character in +.Fa pattern +is replaced by that character. +This is done to negate any special meaning for the character. +If the +.Dv FNM_NOESCAPE +flag is set, a backslash character is treated as an ordinary character. +.It Dv FNM_PATHNAME +Slash characters in +.Fa string +must be explicitly matched by slashes in +.Fa pattern . +If this flag is not set, then slashes are treated as regular characters. +.It Dv FNM_PERIOD +Leading periods in +.Fa string +must be explicitly matched by periods in +.Fa pattern . +If this flag is not set, then leading periods are treated as regular +characters. +The definition of +.Dq leading +is related to the specification of +.Dv FNM_PATHNAME . +A period is always +.Dq leading +if it is the first character in +.Ar string . +Additionally, if +.Dv FNM_PATHNAME +is set, +a period is +leading +if it immediately follows a slash. +.It Dv FNM_LEADING_DIR +Ignore +.Nm /* +rest after successful +.Fa pattern +matching. +.It Dv FNM_CASEFOLD +Ignore case distinctions in both the +.Fa pattern +and the +.Fa string . +.El +.Sh RETURN VALUES +The +.Fn fnmatch +function returns zero if +.Fa string +matches the pattern specified by +.Fa pattern , +otherwise, it returns the value +.Dv FNM_NOMATCH . +.Sh SEE ALSO +.Xr sh 1 , +.Xr glob 3 , +.Xr regex 3 +.Sh STANDARDS +The +.Fn fnmatch +function conforms to +.St -p1003.2 . +.Sh HISTORY +The +.Fn fnmatch +function first appeared in +.Bx 4.4 . +.Sh BUGS +The pattern +.Ql * +matches the empty string, even if +.Dv FNM_PATHNAME +is specified. diff --git a/lib/posix/fnmatch.c b/lib/posix/fnmatch.c new file mode 100644 index 0000000..1a679ab --- /dev/null +++ b/lib/posix/fnmatch.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _NO_FNMATCH + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +/* + * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. + * Compares a filename or pathname to a pattern. + */ + +#include +#include +#include +#include + +#include "collate.h" + +#define EOS '\0' + +#define RANGE_MATCH 1 +#define RANGE_NOMATCH 0 +#define RANGE_ERROR (-1) + +static int rangematch(const char *, char, int, char **); + +int +fnmatch(pattern, string, flags) + const char *pattern, *string; + int flags; +{ + const char *stringstart; + char *newp; + char c, test; + + for (stringstart = string;;) + switch (c = *pattern++) { + case EOS: + if ((flags & FNM_LEADING_DIR) && *string == '/') + return (0); + return (*string == EOS ? 0 : FNM_NOMATCH); + case '?': + if (*string == EOS) + return (FNM_NOMATCH); + if (*string == '/' && (flags & FNM_PATHNAME)) + return (FNM_NOMATCH); + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + ++string; + break; + case '*': + c = *pattern; + /* Collapse multiple stars. */ + while (c == '*') + c = *++pattern; + + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + + /* Optimize for pattern with * at end or before /. */ + if (c == EOS) + if (flags & FNM_PATHNAME) + return ((flags & FNM_LEADING_DIR) || + strchr(string, '/') == NULL ? + 0 : FNM_NOMATCH); + else + return (0); + else if (c == '/' && flags & FNM_PATHNAME) { + if ((string = strchr(string, '/')) == NULL) + return (FNM_NOMATCH); + break; + } + + /* General case, use recursion. */ + while ((test = *string) != EOS) { + if (!fnmatch(pattern, string, flags & ~FNM_PERIOD)) + return (0); + if (test == '/' && flags & FNM_PATHNAME) + break; + ++string; + } + return (FNM_NOMATCH); + case '[': + if (*string == EOS) + return (FNM_NOMATCH); + if (*string == '/' && (flags & FNM_PATHNAME)) + return (FNM_NOMATCH); + if (*string == '.' && (flags & FNM_PERIOD) && + (string == stringstart || + ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) + return (FNM_NOMATCH); + + switch (rangematch(pattern, *string, flags, &newp)) { + case RANGE_ERROR: + goto norm; + case RANGE_MATCH: + pattern = newp; + break; + case RANGE_NOMATCH: + return (FNM_NOMATCH); + } + ++string; + break; + case '\\': + if (!(flags & FNM_NOESCAPE)) { + if ((c = *pattern++) == EOS) { + c = '\\'; + --pattern; + } + } + /* FALLTHROUGH */ + default: + norm: + if (c == *string) + ; + else if ((flags & FNM_CASEFOLD) && + (tolower((unsigned char)c) == + tolower((unsigned char)*string))) + ; + else + return (FNM_NOMATCH); + string++; + break; + } + /* NOTREACHED */ +} + +static int +rangematch(pattern, test, flags, newp) + const char *pattern; + char test; + int flags; + char **newp; +{ + int negate, ok; + char c, c2; + + /* + * A bracket expression starting with an unquoted circumflex + * character produces unspecified results (IEEE 1003.2-1992, + * 3.13.2). This implementation treats it like '!', for + * consistency with the regular expression syntax. + * J.T. Conklin (conklin@ngai.kaleida.com) + */ + if ( (negate = (*pattern == '!' || *pattern == '^')) ) + ++pattern; + + if (flags & FNM_CASEFOLD) + test = tolower((unsigned char)test); + + /* + * A right bracket shall lose its special meaning and represent + * itself in a bracket expression if it occurs first in the list. + * -- POSIX.2 2.8.3.2 + */ + ok = 0; + c = *pattern++; + do { + if (c == '\\' && !(flags & FNM_NOESCAPE)) + c = *pattern++; + if (c == EOS) + return (RANGE_ERROR); + + if (c == '/' && (flags & FNM_PATHNAME)) + return (RANGE_NOMATCH); + + if (flags & FNM_CASEFOLD) + c = tolower((unsigned char)c); + + if (*pattern == '-' + && (c2 = *(pattern+1)) != EOS && c2 != ']') { + pattern += 2; + if (c2 == '\\' && !(flags & FNM_NOESCAPE)) + c2 = *pattern++; + if (c2 == EOS) + return (RANGE_ERROR); + + if (flags & FNM_CASEFOLD) + c2 = tolower((unsigned char)c2); + + if (__collate_load_error ? + c <= test && test <= c2 : + __collate_range_cmp(c, test) <= 0 + && __collate_range_cmp(test, c2) <= 0 + ) + ok = 1; + } else if (c == test) + ok = 1; + } while ((c = *pattern++) != ']'); + + *newp = (char *)pattern; + return (ok == negate ? RANGE_NOMATCH : RANGE_MATCH); +} + +#endif /* !_NO_FNMATCH */ diff --git a/lib/posix/ftw.c b/lib/posix/ftw.c new file mode 100644 index 0000000..18cfc24 --- /dev/null +++ b/lib/posix/ftw.c @@ -0,0 +1,33 @@ +/* +* Copyright © 2005-2020 Rich Felker, et al. +* +* 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include + +int ftw(const char *path, int (*fn)(const char *, const struct stat *, int), int fd_limit) +{ + /* The following cast assumes that calling a function with one + * argument more than it needs behaves as expected. This is + * actually undefined, but works on all real-world machines. */ + return nftw(path, (int (*)())fn, fd_limit, FTW_PHYS); +} + diff --git a/lib/posix/glob.3 b/lib/posix/glob.3 new file mode 100644 index 0000000..d90a1b5 --- /dev/null +++ b/lib/posix/glob.3 @@ -0,0 +1,462 @@ +.\" Copyright (c) 1989, 1991, 1993, 1994 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Guido van Rossum. +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)glob.3 8.3 (Berkeley) 4/16/94 +.\" $FreeBSD: src/lib/libc/gen/glob.3,v 1.20 2001/10/01 16:08:51 ru Exp $ +.\" +.Dd April 16, 1994 +.Dt GLOB 3 +.Os +.Sh NAME +.Nm glob , +.Nm globfree +.Nd generate pathnames matching a pattern +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In glob.h +.Ft int +.Fn glob "const char *pattern" "int flags" "int (*errfunc)(const char *, int)" "glob_t *pglob" +.Ft void +.Fn globfree "glob_t *pglob" +.Sh DESCRIPTION +The +.Fn glob +function +is a pathname generator that implements the rules for file name pattern +matching used by the shell. +.Pp +The include file +.Pa glob.h +defines the structure type +.Fa glob_t , +which contains at least the following fields: +.Bd -literal +typedef struct { + int gl_pathc; /* count of total paths so far */ + int gl_matchc; /* count of paths matching pattern */ + int gl_offs; /* reserved at beginning of gl_pathv */ + int gl_flags; /* returned flags */ + char **gl_pathv; /* list of paths matching pattern */ +} glob_t; +.Ed +.Pp +The argument +.Fa pattern +is a pointer to a pathname pattern to be expanded. +The +.Fn glob +argument +matches all accessible pathnames against the pattern and creates +a list of the pathnames that match. +In order to have access to a pathname, +.Fn glob +requires search permission on every component of a path except the last +and read permission on each directory of any filename component of +.Fa pattern +that contains any of the special characters +.Ql * , +.Ql ?\& +or +.Ql \&[ . +.Pp +The +.Fn glob +argument +stores the number of matched pathnames into the +.Fa gl_pathc +field, and a pointer to a list of pointers to pathnames into the +.Fa gl_pathv +field. +The first pointer after the last pathname is +.Dv NULL . +If the pattern does not match any pathnames, the returned number of +matched paths is set to zero. +.Pp +It is the caller's responsibility to create the structure pointed to by +.Fa pglob . +The +.Fn glob +function allocates other space as needed, including the memory pointed +to by +.Fa gl_pathv . +.Pp +The argument +.Fa flags +is used to modify the behavior of +.Fn glob . +The value of +.Fa flags +is the bitwise inclusive +.Tn OR +of any of the following +values defined in +.Pa glob.h : +.Bl -tag -width GLOB_ALTDIRFUNC +.It Dv GLOB_APPEND +Append pathnames generated to the ones from a previous call (or calls) +to +.Fn glob . +The value of +.Fa gl_pathc +will be the total matches found by this call and the previous call(s). +The pathnames are appended to, not merged with the pathnames returned by +the previous call(s). +Between calls, the caller must not change the setting of the +.Dv GLOB_DOOFFS +flag, nor change the value of +.Fa gl_offs +when +.Dv GLOB_DOOFFS +is set, nor (obviously) call +.Fn globfree +for +.Fa pglob . +.It Dv GLOB_DOOFFS +Make use of the +.Fa gl_offs +field. +If this flag is set, +.Fa gl_offs +is used to specify how many +.Dv NULL +pointers to prepend to the beginning +of the +.Fa gl_pathv +field. +In other words, +.Fa gl_pathv +will point to +.Fa gl_offs +.Dv NULL +pointers, +followed by +.Fa gl_pathc +pathname pointers, followed by a +.Dv NULL +pointer. +.It Dv GLOB_ERR +Causes +.Fn glob +to return when it encounters a directory that it cannot open or read. +Ordinarily, +.Fn glob +continues to find matches. +.It Dv GLOB_MARK +Each pathname that is a directory that matches +.Fa pattern +has a slash +appended. +.It Dv GLOB_NOCHECK +If +.Fa pattern +does not match any pathname, then +.Fn glob +returns a list +consisting of only +.Fa pattern , +with the number of total pathnames is set to 1, and the number of matched +pathnames set to 0. +If +.Dv GLOB_QUOTE +is set, its effect is present in the pattern returned. +.It Dv GLOB_NOSORT +By default, the pathnames are sorted in ascending +.Tn ASCII +order; +this flag prevents that sorting (speeding up +.Fn glob ) . +.El +.Pp +The following values may also be included in +.Fa flags , +however, they are non-standard extensions to +.St -p1003.2 . +.Bl -tag -width GLOB_ALTDIRFUNC +.It Dv GLOB_ALTDIRFUNC +The following additional fields in the pglob structure have been +initialized with alternate functions for glob to use to open, read, +and close directories and to get stat information on names found +in those directories. +.Bd -literal +void *(*gl_opendir)(const char * name); +struct dirent *(*gl_readdir)(void *); +void (*gl_closedir)(void *); +int (*gl_lstat)(const char *name, struct stat *st); +int (*gl_stat)(const char *name, struct stat *st); +.Ed +.Pp +This extension is provided to allow programs such as +.Xr restore 8 +to provide globbing from directories stored on tape. +.It Dv GLOB_BRACE +Pre-process the pattern string to expand +.Ql {pat,pat,...} +strings like +.Xr csh 1 . +The pattern +.Ql {} +is left unexpanded for historical reasons (and +.Xr csh 1 +does the same thing to +ease typing +of +.Xr find 1 +patterns). +.It Dv GLOB_MAGCHAR +Set by the +.Fn glob +function if the pattern included globbing characters. +See the description of the usage of the +.Fa gl_matchc +structure member for more details. +.It Dv GLOB_NOMAGIC +Is the same as +.Dv GLOB_NOCHECK +but it only appends the +.Fa pattern +if it does not contain any of the special characters ``*'', ``?'' or ``[''. +.Dv GLOB_NOMAGIC +is provided to simplify implementing the historic +.Xr csh 1 +globbing behavior and should probably not be used anywhere else. +.It Dv GLOB_QUOTE +Use the backslash +.Pq Ql \e +character for quoting: every occurrence of +a backslash followed by a character in the pattern is replaced by that +character, avoiding any special interpretation of the character. +.It Dv GLOB_TILDE +Expand patterns that start with +.Ql ~ +to user name home directories. +.It Dv GLOB_LIMIT +Limit the total number of returned pathnames to the value provided in +.Fa gl_matchc +(default +.Dv ARG_MAX ) . +This option should be set for programs +that can be coerced into a denial of service attack +via patterns that expand to a very large number of matches, +such as a long string of +.Ql */../*/.. . +.El +.Pp +If, during the search, a directory is encountered that cannot be opened +or read and +.Fa errfunc +is +.Pf non- Dv NULL , +.Fn glob +calls +.Fa \*(lp*errfunc\*(rp Ns ( Fa path , errno ) . +This may be unintuitive: a pattern like +.Ql */Makefile +will try to +.Xr stat 2 +.Ql foo/Makefile +even if +.Ql foo +is not a directory, resulting in a +call to +.Fa errfunc . +The error routine can suppress this action by testing for +.Er ENOENT +and +.Er ENOTDIR ; +however, the +.Dv GLOB_ERR +flag will still cause an immediate +return when this happens. +.Pp +If +.Fa errfunc +returns non-zero, +.Fn glob +stops the scan and returns +.Dv GLOB_ABEND +after setting +.Fa gl_pathc +and +.Fa gl_pathv +to reflect any paths already matched. +This also happens if an error is encountered and +.Dv GLOB_ERR +is set in +.Fa flags , +regardless of the return value of +.Fa errfunc , +if called. +If +.Dv GLOB_ERR +is not set and either +.Fa errfunc +is +.Dv NULL +or +.Fa errfunc +returns zero, the error is ignored. +.Pp +The +.Fn globfree +function frees any space associated with +.Fa pglob +from a previous call(s) to +.Fn glob . +.Sh RETURN VALUES +On successful completion, +.Fn glob +returns zero. +In addition the fields of +.Fa pglob +contain the values described below: +.Bl -tag -width GLOB_NOCHECK +.It Fa gl_pathc +contains the total number of matched pathnames so far. +This includes other matches from previous invocations of +.Fn glob +if +.Dv GLOB_APPEND +was specified. +.It Fa gl_matchc +contains the number of matched pathnames in the current invocation of +.Fn glob . +.It Fa gl_flags +contains a copy of the +.Fa flags +parameter with the bit +.Dv GLOB_MAGCHAR +set if +.Fa pattern +contained any of the special characters ``*'', ``?'' or ``['', cleared +if not. +.It Fa gl_pathv +contains a pointer to a +.Dv NULL Ns -terminated +list of matched pathnames. +However, if +.Fa gl_pathc +is zero, the contents of +.Fa gl_pathv +are undefined. +.El +.Pp +If +.Fn glob +terminates due to an error, it sets errno and returns one of the +following non-zero constants, which are defined in the include +file +.Aq Pa glob.h : +.Bl -tag -width GLOB_NOCHECK +.It Dv GLOB_NOSPACE +An attempt to allocate memory failed, or if +.Fa errno +was 0 +.Dv GLOB_LIMIT +was specified in the flags and +.Fa pglob\->gl_matchc +or more patterns were matched. +.It Dv GLOB_ABEND +The scan was stopped because an error was encountered and either +.Dv GLOB_ERR +was set or +.Fa \*(lp*errfunc\*(rp\*(lp\*(rp +returned non-zero. +.El +.Pp +The arguments +.Fa pglob\->gl_pathc +and +.Fa pglob\->gl_pathv +are still set as specified above. +.Sh EXAMPLES +A rough equivalent of +.Ql "ls -l *.c *.h" +can be obtained with the +following code: +.Bd -literal -offset indent +glob_t g; + +g.gl_offs = 2; +glob("*.c", GLOB_DOOFFS, NULL, &g); +glob("*.h", GLOB_DOOFFS | GLOB_APPEND, NULL, &g); +g.gl_pathv[0] = "ls"; +g.gl_pathv[1] = "-l"; +execvp("ls", g.gl_pathv); +.Ed +.Sh SEE ALSO +.Xr sh 1 , +.Xr fnmatch 3 , +.Xr regexp 3 +.Sh STANDARDS +The +.Fn glob +function is expected to be +.St -p1003.2 +compatible with the exception +that the flags +.Dv GLOB_ALTDIRFUNC , +.Dv GLOB_BRACE , +.Dv GLOB_LIMIT , +.Dv GLOB_MAGCHAR , +.Dv GLOB_NOMAGIC , +.Dv GLOB_QUOTE , +and +.Dv GLOB_TILDE , +and the fields +.Fa gl_matchc +and +.Fa gl_flags +should not be used by applications striving for strict +.Tn POSIX +conformance. +.Sh HISTORY +The +.Fn glob +and +.Fn globfree +functions first appeared in +.Bx 4.4 . +.Sh BUGS +Patterns longer than +.Dv MAXPATHLEN +may cause unchecked errors. +.Pp +The +.Fn glob +argument +may fail and set errno for any of the errors specified for the +library routines +.Xr stat 2 , +.Xr closedir 3 , +.Xr opendir 3 , +.Xr readdir 3 , +.Xr malloc 3 , +and +.Xr free 3 . diff --git a/lib/posix/glob.c b/lib/posix/glob.c new file mode 100644 index 0000000..5e6c2fc --- /dev/null +++ b/lib/posix/glob.c @@ -0,0 +1,913 @@ +/* + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Guido van Rossum. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef __CYGWIN__ +#define _NO_GLOB /* Cygwin provides its own glob. */ +#endif + +#ifndef _NO_GLOB + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93"; +#endif /* LIBC_SCCS and not lint */ +#include + +/* + * glob(3) -- a superset of the one defined in POSIX 1003.2. + * + * The [!...] convention to negate a range is supported (SysV, Posix, ksh). + * + * Optional extra services, controlled by flags not defined by POSIX: + * + * GLOB_QUOTE: + * Escaping convention: \ inhibits any special meaning the following + * character might have (except \ at end of string is retained). + * GLOB_MAGCHAR: + * Set in gl_flags if pattern contained a globbing character. + * GLOB_NOMAGIC: + * Same as GLOB_NOCHECK, but it will only append pattern if it did + * not contain any magic characters. [Used in csh style globbing] + * GLOB_ALTDIRFUNC: + * Use alternately specified directory access functions. + * GLOB_TILDE: + * expand ~user/foo to the /home/dir/of/user/foo + * GLOB_BRACE: + * expand {1,2}{a,b} to 1a 1b 2a 2b + * gl_matchc: + * Number of matches in the current invocation of glob. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "collate.h" + +#define DOLLAR '$' +#define DOT '.' +#define EOS '\0' +#define LBRACKET '[' +#define NOT '!' +#define QUESTION '?' +#define QUOTE '\\' +#define RANGE '-' +#define RBRACKET ']' +#define SEP '/' +#define STAR '*' +#define TILDE '~' +#define UNDERSCORE '_' +#define LBRACE '{' +#define RBRACE '}' +#define SLASH '/' +#define COMMA ',' + +#ifndef DEBUG + +#define M_QUOTE 0x8000 +#define M_PROTECT 0x4000 +#define M_MASK 0xffff +#define M_ASCII 0x00ff + +typedef u_short Char; + +#else + +#define M_QUOTE 0x80 +#define M_PROTECT 0x40 +#define M_MASK 0xff +#define M_ASCII 0x7f + +typedef char Char; + +#endif + + +#define CHAR(c) ((Char)((c)&M_ASCII)) +#define META(c) ((Char)((c)|M_QUOTE)) +#define M_ALL META('*') +#define M_END META(']') +#define M_NOT META('!') +#define M_ONE META('?') +#define M_RNG META('-') +#define M_SET META('[') +#define ismeta(c) (((c)&M_QUOTE) != 0) + + +static int compare(const void *, const void *); +static int g_Ctoc(const Char *, char *, u_int); +static int g_lstat(Char *, struct stat *, glob_t *); +static DIR *g_opendir(Char *, glob_t *); +static Char *g_strchr(Char *, int); +#ifdef notdef +static Char *g_strcat(Char *, const Char *); +#endif +static int g_stat(Char *, struct stat *, glob_t *); +static int glob0(const Char *, glob_t *, int *); +static int glob1(Char *, glob_t *, int *); +static int glob2(Char *, Char *, Char *, Char *, glob_t *, int *); +static int glob3(Char *, Char *, Char *, Char *, Char *, glob_t *, int *); +static int globextend(const Char *, glob_t *, int *); +static const Char * + globtilde(const Char *, Char *, size_t, glob_t *); +static int globexp1(const Char *, glob_t *, int *); +static int globexp2(const Char *, const Char *, glob_t *, int *, int *); +static int match(Char *, Char *, Char *); +#ifdef DEBUG +static void qprintf(const char *, Char *); +#endif + +int +glob(pattern, flags, errfunc, pglob) + const char *__restrict pattern; + int flags, (*errfunc)(const char *, int); + glob_t *__restrict pglob; +{ + const u_char *patnext; + int c, limit; + Char *bufnext, *bufend, patbuf[MAXPATHLEN]; + + patnext = (u_char *) pattern; + if (!(flags & GLOB_APPEND)) { + pglob->gl_pathc = 0; + pglob->gl_pathv = NULL; + if (!(flags & GLOB_DOOFFS)) + pglob->gl_offs = 0; + } + if (flags & GLOB_LIMIT) { + limit = pglob->gl_matchc; + if (limit == 0) + limit = ARG_MAX; + } else + limit = 0; + pglob->gl_flags = flags & ~GLOB_MAGCHAR; + pglob->gl_errfunc = errfunc; + pglob->gl_matchc = 0; + + bufnext = patbuf; + bufend = bufnext + MAXPATHLEN - 1; + if (flags & GLOB_QUOTE) { + /* Protect the quoted characters. */ + while (bufnext < bufend && (c = *patnext++) != EOS) + if (c == QUOTE) { + if ((c = *patnext++) == EOS) { + c = QUOTE; + --patnext; + } + *bufnext++ = c | M_PROTECT; + } + else + *bufnext++ = c; + } + else + while (bufnext < bufend && (c = *patnext++) != EOS) + *bufnext++ = c; + *bufnext = EOS; + + if (flags & GLOB_BRACE) + return globexp1(patbuf, pglob, &limit); + else + return glob0(patbuf, pglob, &limit); +} + +/* + * Expand recursively a glob {} pattern. When there is no more expansion + * invoke the standard globbing routine to glob the rest of the magic + * characters + */ +static int +globexp1(pattern, pglob, limit) + const Char *pattern; + glob_t *pglob; + int *limit; +{ + const Char* ptr = pattern; + int rv; + + /* Protect a single {}, for find(1), like csh */ + if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS) + return glob0(pattern, pglob, limit); + + while ((ptr = (const Char *) g_strchr((Char *) ptr, LBRACE)) != NULL) + if (!globexp2(ptr, pattern, pglob, &rv, limit)) + return rv; + + return glob0(pattern, pglob, limit); +} + + +/* + * Recursive brace globbing helper. Tries to expand a single brace. + * If it succeeds then it invokes globexp1 with the new pattern. + * If it fails then it tries to glob the rest of the pattern and returns. + */ +static int +globexp2(ptr, pattern, pglob, rv, limit) + const Char *ptr, *pattern; + glob_t *pglob; + int *rv, *limit; +{ + int i; + Char *lm, *ls; + const Char *pe, *pm, *pl; + Char patbuf[MAXPATHLEN]; + + /* copy part up to the brace */ + for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++) + continue; + *lm = EOS; + ls = lm; + + /* Find the balanced brace */ + for (i = 0, pe = ++ptr; *pe; pe++) + if (*pe == LBRACKET) { + /* Ignore everything between [] */ + for (pm = pe++; *pe != RBRACKET && *pe != EOS; pe++) + continue; + if (*pe == EOS) { + /* + * We could not find a matching RBRACKET. + * Ignore and just look for RBRACE + */ + pe = pm; + } + } + else if (*pe == LBRACE) + i++; + else if (*pe == RBRACE) { + if (i == 0) + break; + i--; + } + + /* Non matching braces; just glob the pattern */ + if (i != 0 || *pe == EOS) { + *rv = glob0(patbuf, pglob, limit); + return 0; + } + + for (i = 0, pl = pm = ptr; pm <= pe; pm++) + switch (*pm) { + case LBRACKET: + /* Ignore everything between [] */ + for (pl = pm++; *pm != RBRACKET && *pm != EOS; pm++) + continue; + if (*pm == EOS) { + /* + * We could not find a matching RBRACKET. + * Ignore and just look for RBRACE + */ + pm = pl; + } + break; + + case LBRACE: + i++; + break; + + case RBRACE: + if (i) { + i--; + break; + } + /* FALLTHROUGH */ + case COMMA: + if (i && *pm == COMMA) + break; + else { + /* Append the current string */ + for (lm = ls; (pl < pm); *lm++ = *pl++) + continue; + /* + * Append the rest of the pattern after the + * closing brace + */ + for (pl = pe + 1; (*lm++ = *pl++) != EOS;) + continue; + + /* Expand the current pattern */ +#ifdef DEBUG + qprintf("globexp2:", patbuf); +#endif + *rv = globexp1(patbuf, pglob, limit); + + /* move after the comma, to the next string */ + pl = pm + 1; + } + break; + + default: + break; + } + *rv = 0; + return 0; +} + + + +/* + * expand tilde from the passwd file. + */ +static const Char * +globtilde(pattern, patbuf, patbuf_len, pglob) + const Char *pattern; + Char *patbuf; + size_t patbuf_len; + glob_t *pglob; +{ + struct passwd *pwd; + char *h; + const Char *p; + Char *b, *eb; + + if (*pattern != TILDE || !(pglob->gl_flags & GLOB_TILDE)) + return pattern; + + /* + * Copy up to the end of the string or / + */ + eb = &patbuf[patbuf_len - 1]; + for (p = pattern + 1, h = (char *) patbuf; + h < (char *)eb && *p && *p != SLASH; *h++ = *p++) + continue; + + *h = EOS; + + if (((char *) patbuf)[0] == EOS) { + /* + * handle a plain ~ or ~/ by expanding $HOME first (iff + * we're not running setuid or setgid) and then trying + * the password file + */ + if ( +#ifndef __NETBSD_SYSCALLS + issetugid() != 0 || +#endif + (h = getenv("HOME")) == NULL) { +/* If we are not EL/IX level 4, we cannot use getpwxxx interfaces */ +#if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 4 + if (((h = getlogin()) != NULL && + (pwd = getpwnam(h)) != NULL) || + (pwd = getpwuid(getuid())) != NULL) + h = pwd->pw_dir; + else +#endif /* !_ELIX_LEVEL || _ELIX_LEVEL >= 4 */ + return pattern; + } + } + else { + /* + * Expand a ~user + */ + +#if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 4 + if ((pwd = getpwnam((char*) patbuf)) != NULL) + h = pwd->pw_dir; + else +#endif /* !_ELIX_LEVEL || _ELIX_LEVEL >= 4 */ + return pattern; + } + + /* Copy the home directory */ + for (b = patbuf; b < eb && *h; *b++ = *h++) + continue; + + /* Append the rest of the pattern */ + while (b < eb && (*b++ = *p++) != EOS) + continue; + *b = EOS; + + return patbuf; +} + + +/* + * The main glob() routine: compiles the pattern (optionally processing + * quotes), calls glob1() to do the real pattern matching, and finally + * sorts the list (unless unsorted operation is requested). Returns 0 + * if things went well, nonzero if errors occurred. It is not an error + * to find no matches. + */ +static int +glob0(pattern, pglob, limit) + const Char *pattern; + glob_t *pglob; + int *limit; +{ + const Char *qpatnext; + int c, err, oldpathc; + Char *bufnext, patbuf[MAXPATHLEN]; + + qpatnext = globtilde(pattern, patbuf, MAXPATHLEN, pglob); + oldpathc = pglob->gl_pathc; + bufnext = patbuf; + + /* We don't need to check for buffer overflow any more. */ + while ((c = *qpatnext++) != EOS) { + switch (c) { + case LBRACKET: + c = *qpatnext; + if (c == NOT) + ++qpatnext; + if (*qpatnext == EOS || + g_strchr((Char *) qpatnext+1, RBRACKET) == NULL) { + *bufnext++ = LBRACKET; + if (c == NOT) + --qpatnext; + break; + } + *bufnext++ = M_SET; + if (c == NOT) + *bufnext++ = M_NOT; + c = *qpatnext++; + do { + *bufnext++ = CHAR(c); + if (*qpatnext == RANGE && + (c = qpatnext[1]) != RBRACKET) { + *bufnext++ = M_RNG; + *bufnext++ = CHAR(c); + qpatnext += 2; + } + } while ((c = *qpatnext++) != RBRACKET); + pglob->gl_flags |= GLOB_MAGCHAR; + *bufnext++ = M_END; + break; + case QUESTION: + pglob->gl_flags |= GLOB_MAGCHAR; + *bufnext++ = M_ONE; + break; + case STAR: + pglob->gl_flags |= GLOB_MAGCHAR; + /* collapse adjacent stars to one, + * to avoid exponential behavior + */ + if (bufnext == patbuf || bufnext[-1] != M_ALL) + *bufnext++ = M_ALL; + break; + default: + *bufnext++ = CHAR(c); + break; + } + } + *bufnext = EOS; +#ifdef DEBUG + qprintf("glob0:", patbuf); +#endif + + if ((err = glob1(patbuf, pglob, limit)) != 0) + return(err); + + /* + * If there was no match we are going to append the pattern + * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified + * and the pattern did not contain any magic characters + * GLOB_NOMAGIC is there just for compatibility with csh. + */ + if (pglob->gl_pathc == oldpathc && + ((pglob->gl_flags & GLOB_NOCHECK) || + ((pglob->gl_flags & GLOB_NOMAGIC) && + !(pglob->gl_flags & GLOB_MAGCHAR)))) + return(globextend(pattern, pglob, limit)); + else if (!(pglob->gl_flags & GLOB_NOSORT)) + qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc, + pglob->gl_pathc - oldpathc, sizeof(char *), compare); + return(0); +} + +static int +compare(p, q) + const void *p, *q; +{ + return(strcmp(*(char **)p, *(char **)q)); +} + +static int +glob1(pattern, pglob, limit) + Char *pattern; + glob_t *pglob; + int *limit; +{ + Char pathbuf[MAXPATHLEN]; + + /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */ + if (*pattern == EOS) + return(0); + return(glob2(pathbuf, pathbuf, pathbuf + MAXPATHLEN - 1, + pattern, pglob, limit)); +} + +/* + * The functions glob2 and glob3 are mutually recursive; there is one level + * of recursion for each segment in the pattern that contains one or more + * meta characters. + */ +static int +glob2(pathbuf, pathend, pathend_last, pattern, pglob, limit) + Char *pathbuf, *pathend, *pathend_last, *pattern; + glob_t *pglob; + int *limit; +{ + struct stat sb; + Char *p, *q; + int anymeta; + + /* + * Loop over pattern segments until end of pattern or until + * segment with meta character found. + */ + for (anymeta = 0;;) { + if (*pattern == EOS) { /* End of pattern? */ + *pathend = EOS; + if (g_lstat(pathbuf, &sb, pglob)) + return(0); + + if (((pglob->gl_flags & GLOB_MARK) && + pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) + || (S_ISLNK(sb.st_mode) && + (g_stat(pathbuf, &sb, pglob) == 0) && + S_ISDIR(sb.st_mode)))) { + if (pathend + 1 > pathend_last) + return (1); + *pathend++ = SEP; + *pathend = EOS; + } + ++pglob->gl_matchc; + return(globextend(pathbuf, pglob, limit)); + } + + /* Find end of next segment, copy tentatively to pathend. */ + q = pathend; + p = pattern; + while (*p != EOS && *p != SEP) { + if (ismeta(*p)) + anymeta = 1; + if (q + 1 > pathend_last) + return (1); + *q++ = *p++; + } + + if (!anymeta) { /* No expansion, do next segment. */ + pathend = q; + pattern = p; + while (*pattern == SEP) { + if (pathend + 1 > pathend_last) + return (1); + *pathend++ = *pattern++; + } + } else /* Need expansion, recurse. */ + return(glob3(pathbuf, pathend, pathend_last, pattern, p, + pglob, limit)); + } + /* NOTREACHED */ +} + +static int +glob3(pathbuf, pathend, pathend_last, pattern, restpattern, pglob, limit) + Char *pathbuf, *pathend, *pathend_last, *pattern, *restpattern; + glob_t *pglob; + int *limit; +{ + struct dirent *dp; + DIR *dirp; + int err; + char buf[MAXPATHLEN]; + + /* + * The readdirfunc declaration can't be prototyped, because it is + * assigned, below, to two functions which are prototyped in glob.h + * and dirent.h as taking pointers to differently typed opaque + * structures. + */ + struct dirent *(*readdirfunc)(); + + if (pathend > pathend_last) + return (1); + *pathend = EOS; + errno = 0; + + if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { + /* TODO: don't call for ENOENT or ENOTDIR? */ + if (pglob->gl_errfunc) { + if (g_Ctoc(pathbuf, buf, sizeof(buf))) + return (GLOB_ABEND); + if (pglob->gl_errfunc(buf, errno) || + pglob->gl_flags & GLOB_ERR) + return (GLOB_ABEND); + } + return(0); + } + + err = 0; + + /* Search directory for matching names. */ + if (pglob->gl_flags & GLOB_ALTDIRFUNC) + readdirfunc = pglob->gl_readdir; + else + readdirfunc = readdir; + while ((dp = (*readdirfunc)(dirp))) { + u_char *sc; + Char *dc; + + /* Initial DOT must be matched literally. */ + if (dp->d_name[0] == DOT && *pattern != DOT) + continue; + dc = pathend; + sc = (u_char *) dp->d_name; + while (dc < pathend_last && (*dc++ = *sc++) != EOS) + ; + if (!match(pathend, pattern, restpattern)) { + *pathend = EOS; + continue; + } + err = glob2(pathbuf, --dc, pathend_last, restpattern, + pglob, limit); + if (err) + break; + } + + if (pglob->gl_flags & GLOB_ALTDIRFUNC) + (*pglob->gl_closedir)(dirp); + else + closedir(dirp); + return(err); +} + + +/* + * Extend the gl_pathv member of a glob_t structure to accomodate a new item, + * add the new item, and update gl_pathc. + * + * This assumes the BSD realloc, which only copies the block when its size + * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic + * behavior. + * + * Return 0 if new item added, error code if memory couldn't be allocated. + * + * Invariant of the glob_t structure: + * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and + * gl_pathv points to (gl_offs + gl_pathc + 1) items. + */ +static int +globextend(path, pglob, limit) + const Char *path; + glob_t *pglob; + int *limit; +{ + char **pathv; + int i; + u_int newsize, len; + char *copy; + const Char *p; + + if (*limit && pglob->gl_pathc > *limit) { + errno = 0; + return (GLOB_NOSPACE); + } + + newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); + pathv = pglob->gl_pathv ? + realloc((char *)pglob->gl_pathv, newsize) : + malloc(newsize); + if (pathv == NULL) { + if (pglob->gl_pathv) { + free(pglob->gl_pathv); + pglob->gl_pathv = NULL; + } + return(GLOB_NOSPACE); + } + + if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) { + /* first time around -- clear initial gl_offs items */ + pathv += pglob->gl_offs; + for (i = pglob->gl_offs; --i >= 0; ) + *--pathv = NULL; + } + pglob->gl_pathv = pathv; + + for (p = path; *p++;) + continue; + len = (size_t)(p - path); + if ((copy = malloc(len)) != NULL) { + if (g_Ctoc(path, copy, len)) { + free(copy); + return (GLOB_NOSPACE); + } + pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; + } + pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; + return(copy == NULL ? GLOB_NOSPACE : 0); +} + +/* + * pattern matching function for filenames. Each occurrence of the * + * pattern causes a recursion level. + */ +static int +match(name, pat, patend) + Char *name, *pat, *patend; +{ + int ok, negate_range; + Char c, k; + + while (pat < patend) { + c = *pat++; + switch (c & M_MASK) { + case M_ALL: + if (pat == patend) + return(1); + do + if (match(name, pat, patend)) + return(1); + while (*name++ != EOS); + return(0); + case M_ONE: + if (*name++ == EOS) + return(0); + break; + case M_SET: + ok = 0; + if ((k = *name++) == EOS) + return(0); + if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS) + ++pat; + while (((c = *pat++) & M_MASK) != M_END) + if ((*pat & M_MASK) == M_RNG) { + if (__collate_load_error ? + CHAR(c) <= CHAR(k) && CHAR(k) <= CHAR(pat[1]) : + __collate_range_cmp(CHAR(c), CHAR(k)) <= 0 + && __collate_range_cmp(CHAR(k), CHAR(pat[1])) <= 0 + ) + ok = 1; + pat += 2; + } else if (c == k) + ok = 1; + if (ok == negate_range) + return(0); + break; + default: + if (*name++ != c) + return(0); + break; + } + } + return(*name == EOS); +} + +/* Free allocated data belonging to a glob_t structure. */ +void +globfree(pglob) + glob_t *pglob; +{ + int i; + char **pp; + + if (pglob->gl_pathv != NULL) { + pp = pglob->gl_pathv + pglob->gl_offs; + for (i = pglob->gl_pathc; i--; ++pp) + if (*pp) + free(*pp); + free(pglob->gl_pathv); + pglob->gl_pathv = NULL; + } +} + +static DIR * +g_opendir(str, pglob) + Char *str; + glob_t *pglob; +{ + char buf[MAXPATHLEN]; + + if (!*str) + strcpy(buf, "."); + else { + if (g_Ctoc(str, buf, sizeof(buf))) + return (NULL); + } + + if (pglob->gl_flags & GLOB_ALTDIRFUNC) + return((*pglob->gl_opendir)(buf)); + + return(opendir(buf)); +} + +static int +g_lstat(fn, sb, pglob) + Char *fn; + struct stat *sb; + glob_t *pglob; +{ + char buf[MAXPATHLEN]; + + if (g_Ctoc(fn, buf, sizeof(buf))) { + errno = ENAMETOOLONG; + return (-1); + } + if (pglob->gl_flags & GLOB_ALTDIRFUNC) + return((*pglob->gl_lstat)(buf, sb)); + return(lstat(buf, sb)); +} + +static int +g_stat(fn, sb, pglob) + Char *fn; + struct stat *sb; + glob_t *pglob; +{ + char buf[MAXPATHLEN]; + + if (g_Ctoc(fn, buf, sizeof(buf))) { + errno = ENAMETOOLONG; + return (-1); + } + if (pglob->gl_flags & GLOB_ALTDIRFUNC) + return((*pglob->gl_stat)(buf, sb)); + return(stat(buf, sb)); +} + +static Char * +g_strchr(str, ch) + Char *str; + int ch; +{ + do { + if (*str == ch) + return (str); + } while (*str++); + return (NULL); +} + +static int +g_Ctoc(str, buf, len) + const Char *str; + char *buf; + u_int len; +{ + + while (len--) { + if ((*buf++ = *str++) == '\0') + return (0); + } + return (1); +} + +#ifdef DEBUG +static void +qprintf(str, s) + const char *str; + Char *s; +{ + Char *p; + + (void)printf("%s:\n", str); + for (p = s; *p; p++) + (void)printf("%c", CHAR(*p)); + (void)printf("\n"); + for (p = s; *p; p++) + (void)printf("%c", *p & M_PROTECT ? '"' : ' '); + (void)printf("\n"); + for (p = s; *p; p++) + (void)printf("%c", ismeta(*p) ? '_' : ' '); + (void)printf("\n"); +} +#endif +#endif /* !_NO_GLOB */ diff --git a/lib/posix/isatty.c b/lib/posix/isatty.c new file mode 100644 index 0000000..8a6740a --- /dev/null +++ b/lib/posix/isatty.c @@ -0,0 +1,10 @@ +/* isatty.c */ + +#include +#include + +int +isatty (int fd) +{ + return _isatty (fd); +} diff --git a/lib/posix/namespace.h b/lib/posix/namespace.h new file mode 100644 index 0000000..807349b --- /dev/null +++ b/lib/posix/namespace.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2001 Daniel Eischen . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libc/include/namespace.h,v 1.9 2002/03/29 22:43:42 markm Exp $ + */ + +#ifndef _NAMESPACE_H_ +#define _NAMESPACE_H_ + +/* + * Adjust names so that headers declare "hidden" names. + */ + +/* + * ISO C (C90) section. Most names in libc aren't in ISO C, so they + * should be here. Most aren't here... + */ +#define err _err +#define warn _warn + +/* + * Prototypes for syscalls/functions that need to be overridden + * in libc_r/libpthread. + */ +#define accept _accept +#define __acl_aclcheck_fd ___acl_aclcheck_fd +#define __acl_delete_fd ___acl_delete_fd +#define __acl_get_fd ___acl_get_fd +#define __acl_set_fd ___acl_set_fd +#define bind _bind +#define __cap_get_fd ___cap_get_fd +#define __cap_set_fd ___cap_set_fd +#define close _close +#define connect _connect +#define dup _dup +#define dup2 _dup2 +#define execve _execve +#define fcntl _fcntl +/*#define flock _flock */ +#define fstat _fstat +#define fstatfs _fstatfs +#define fsync _fsync +#define getdirentries _getdirentries +#define getlogin _getlogin +#define getpeername _getpeername +#define getprogname _getprogname +#define getsockname _getsockname +#define getsockopt _getsockopt +#define ioctl _ioctl +/* #define kevent _kevent */ +#define listen _listen +#define nanosleep _nanosleep +#define open _open +#define poll _poll +#define pthread_cond_signal _pthread_cond_signal +#define pthread_cond_wait _pthread_cond_wait +#define pthread_cond_init _pthread_cond_init +#define pthread_exit _pthread_exit +#define pthread_getspecific _pthread_getspecific +#define pthread_key_create _pthread_key_create +#define pthread_key_delete _pthread_key_delete +#define pthread_main_np _pthread_main_np +#define pthread_mutex_destroy _pthread_mutex_destroy +#define pthread_mutex_init _pthread_mutex_init +#define pthread_mutex_lock _pthread_mutex_lock +#define pthread_mutex_trylock _pthread_mutex_trylock +#define pthread_mutex_unlock _pthread_mutex_unlock +#define pthread_mutexattr_init _pthread_mutexattr_init +#define pthread_mutexattr_destroy _pthread_mutexattr_destroy +#define pthread_mutexattr_settype _pthread_mutexattr_settype +#define pthread_once _pthread_once +#define pthread_rwlock_init _pthread_rwlock_init +#define pthread_rwlock_rdlock _pthread_rwlock_rdlock +#define pthread_rwlock_wrlock _pthread_rwlock_wrlock +#define pthread_rwlock_unlock _pthread_rwlock_unlock +#define pthread_self _pthread_self +#define pthread_setspecific _pthread_setspecific +#define pthread_sigmask _pthread_sigmask +#define read _read +#define readv _readv +#define recvfrom _recvfrom +#define recvmsg _recvmsg +#define select _select +#define sendmsg _sendmsg +#define sendto _sendto +#define setsockopt _setsockopt +/*#define sigaction _sigaction*/ +#define sigprocmask _sigprocmask +#define sigsuspend _sigsuspend +#define socket _socket +#define socketpair _socketpair +#define wait4 _wait4 +/*#define write _write*/ +#define writev _writev + + +/* + * Other hidden syscalls/functions that libc_r needs to override + * but are not used internally by libc. + * + * XXX - When modifying libc to use one of the following, remove + * the prototype from below and place it in the list above. + */ +#if 0 +#define creat _creat +#define fchflags _fchflags +#define fchmod _fchmod +#define fpathconf _fpathconf +#define msync _msync +#define nfssvc _nfssvc +#define pause _pause +#define pthread_rwlock_destroy _pthread_rwlock_destroy +#define pthread_rwlock_tryrdlock _pthread_rwlock_tryrdlock +#define pthread_rwlock_trywrlock _pthread_rwlock_trywrlock +#define pthread_rwlockattr_init _pthread_rwlockattr_init +#define pthread_rwlockattr_destroy _pthread_rwlockattr_destroy +#define sched_yield _sched_yield +#define sendfile _sendfile +#define shutdown _shutdown +#define sigaltstack _sigaltstack +#define sigpending _sigpending +#define sigreturn _sigreturn +#define sigsetmask _sigsetmask +#define sleep _sleep +#define system _system +#define tcdrain _tcdrain +#define wait _wait +#define waitpid _waitpid +#endif + +#endif /* _NAMESPACE_H_ */ diff --git a/lib/posix/nftw.c b/lib/posix/nftw.c new file mode 100644 index 0000000..c45cc8f --- /dev/null +++ b/lib/posix/nftw.c @@ -0,0 +1,156 @@ +/* +* Copyright © 2005-2020 Rich Felker, et al. +* +* 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +/* Pull in _STDIO_WITH_THREAD_CANCELLATION_SUPPORT */ +#include "../stdio/local.h" + +struct history +{ + struct history *chain; + dev_t dev; + ino_t ino; + int level; + int base; +}; + +#undef dirfd +#define dirfd(d) (*(int *)d) + +static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags, struct history *h) +{ + size_t l = strlen(path), j = l && path[l-1]=='/' ? l-1 : l; + struct stat st; + struct history new; + int type; + int r; + struct FTW lev; + + if ((flags & FTW_PHYS) ? lstat(path, &st) : stat(path, &st) < 0) { + if (!(flags & FTW_PHYS) && errno==ENOENT && !lstat(path, &st)) + type = FTW_SLN; + else if (errno != EACCES) return -1; + else type = FTW_NS; + } else if (S_ISDIR(st.st_mode)) { + if (access(path, R_OK) < 0) type = FTW_DNR; + else if (flags & FTW_DEPTH) type = FTW_DP; + else type = FTW_D; + } else if (S_ISLNK(st.st_mode)) { + if (flags & FTW_PHYS) type = FTW_SL; + else type = FTW_SLN; + } else { + type = FTW_F; + } + + if ((flags & FTW_MOUNT) && h && st.st_dev != h->dev) + return 0; + + new.chain = h; + new.dev = st.st_dev; + new.ino = st.st_ino; + new.level = h ? h->level+1 : 0; + new.base = j+1; + + lev.level = new.level; + if (h) { + lev.base = h->base; + } else { + size_t k; + for (k=j; k && path[k]=='/'; k--); + for (; k && path[k-1]!='/'; k--); + lev.base = k; + } + + if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) + return r; + + for (; h; h = h->chain) + if (h->dev == st.st_dev && h->ino == st.st_ino) + return 0; + + if ((type == FTW_D || type == FTW_DP) && fd_limit) { + DIR *d = opendir(path); + if (d) { + struct dirent *de; + while ((de = readdir(d))) { + if (de->d_name[0] == '.' + && (!de->d_name[1] + || (de->d_name[1]=='.' + && !de->d_name[2]))) continue; + if (strlen(de->d_name) >= PATH_MAX-l) { + errno = ENAMETOOLONG; + closedir(d); + return -1; + } + path[j]='/'; + strcpy(path+j+1, de->d_name); + if ((r=do_nftw(path, fn, fd_limit-1, flags, &new))) { + closedir(d); + return r; + } + } + closedir(d); + } else if (errno != EACCES) { + return -1; + } + } + + path[l] = 0; + if ((flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) + return r; + + return 0; +} + +int nftw(const char *path, int (*fn)(const char *, const struct stat *, int, struct FTW *), int fd_limit, int flags) +{ + int r, cs; + size_t l; + char pathbuf[PATH_MAX+1]; + + if (fd_limit <= 0) return 0; + + l = strlen(path); + if (l > PATH_MAX) { + errno = ENAMETOOLONG; + return -1; + } + memcpy(pathbuf, path, l+1); + +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); +#endif + r = do_nftw(pathbuf, fn, fd_limit, flags, NULL); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate(cs, 0); +#endif + return r; +} + diff --git a/lib/posix/opendir.c b/lib/posix/opendir.c new file mode 100644 index 0000000..4dbad1a --- /dev/null +++ b/lib/posix/opendir.c @@ -0,0 +1,99 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)opendir.c 5.11 (Berkeley) 2/23/91"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include + +static DIR * +_opendir_common(int fd) +{ + DIR *dirp; + + if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) { + close (fd); + return NULL; + } + /* + * If CLSIZE is an exact multiple of DIRBLKSIZ, use a CLSIZE + * buffer that it cluster boundary aligned. + * Hopefully this can be a big win someday by allowing page trades + * to user space to be done by getdirentries() + */ + dirp->dd_buf = malloc (512); + dirp->dd_len = 512; + + if (dirp->dd_buf == NULL) { + free (dirp); + close (fd); + return NULL; + } + dirp->dd_fd = fd; + dirp->dd_loc = 0; + dirp->dd_seek = 0; + /* + * Set up seek point for rewinddir. + */ + +#ifdef HAVE_DD_LOCK + /* if we have a locking mechanism, initialize it */ + __lock_init_recursive(dirp->dd_lock); +#endif + + return dirp; +} + +DIR * +opendir(const char *name) +{ + int fd; + + if ((fd = open(name, O_RDONLY | O_DIRECTORY | O_CLOEXEC)) == -1) + return (NULL); + return (_opendir_common(fd)); +} + +DIR * +fdopendir(int fd) +{ + + if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) + return (NULL); + return (_opendir_common(fd)); +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/popen.c b/lib/posix/popen.c new file mode 100644 index 0000000..04aca4c --- /dev/null +++ b/lib/posix/popen.c @@ -0,0 +1,228 @@ +/* $NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $ */ + +/* + * Copyright (c) 1988, 1993, 2006 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software written by Ken Arnold and + * published in UNIX Review, Vol. 6, No. 8. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---tie a stream to a command string + +INDEX + popen +INDEX + pclose + +SYNOPSIS + #include + FILE *popen(const char *<[s]>, const char *<[mode]>); + + int pclose(FILE *<[f]>); + +DESCRIPTION +Use <> to create a stream to a child process executing a +command string <<*<[s]>>> as processed by <> on your system. +The argument <[mode]> must start with either `<>', where the stream +reads from the child's <>, or `<>', where the stream writes +to the child's <>. As an extension, <[mode]> may also contain +`<>' to set the close-on-exec bit of the parent's file descriptor. +The stream created by <> must be closed by <> to avoid +resource leaks. + +Streams created by prior calls to <> are not visible in +subsequent <> children, regardless of the close-on-exec bit. + +Use ``<>'' to test whether your system has <> +available. + +RETURNS +<> returns a file stream opened with the specified <[mode]>, +or <> if a child process could not be created. <> +returns -1 if the stream was not created by <> or if the +application used <> or similar to steal the status; otherwise +it returns the exit status of the child which can be interpreted +in the same manner as a status obtained by <>. + +PORTABILITY +POSIX.2 requires <> and <>, but only specifies a mode +of just <> or <>. Where <> is found is left unspecified. + +Supporting OS subroutines required: <<_exit>>, <<_execve>>, <<_fork_r>>, +<<_wait_r>>, <>, <>, <>. +*/ + +#ifndef _NO_POPEN + +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)popen.c 8.1 (Berkeley) 6/4/93"; +#else +static char rcsid[] = "$NetBSD: popen.c,v 1.11 1995/06/16 07:05:33 jtc Exp $"; +#endif +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static struct pid { + struct pid *next; + FILE *fp; + pid_t pid; +} *pidlist; + +FILE * +popen (const char *program, + const char *type) +{ + struct pid *cur; + FILE *iop; + int pdes[2], pid; + + if ((*type != 'r' && *type != 'w') + || (type[1] +#ifdef HAVE_FCNTL + && (type[2] || (type[1] != 'e')) +#endif + )) { + errno = EINVAL; + return (NULL); + } + + if ((cur = malloc(sizeof(struct pid))) == NULL) + return (NULL); + + if (pipe(pdes) < 0) { + free(cur); + return (NULL); + } + + switch (pid = vfork()) { + case -1: /* Error. */ + (void)close(pdes[0]); + (void)close(pdes[1]); + free(cur); + return (NULL); + /* NOTREACHED */ + case 0: /* Child. */ + if (*type == 'r') { + if (pdes[1] != STDOUT_FILENO) { + (void)dup2(pdes[1], STDOUT_FILENO); + (void)close(pdes[1]); + } + if (pdes[0] != STDOUT_FILENO) { + (void) close(pdes[0]); + } + } else { + if (pdes[0] != STDIN_FILENO) { + (void)dup2(pdes[0], STDIN_FILENO); + (void)close(pdes[0]); + } + (void)close(pdes[1]); + } + /* Close all fd's created by prior popen. */ + for (cur = pidlist; cur; cur = cur->next) + (void)close (fileno (cur->fp)); + execl(_PATH_BSHELL, "sh", "-c", program, NULL); + _exit(127); + /* NOTREACHED */ + } + + /* Parent; assume fdopen can't fail. */ + if (*type == 'r') { + iop = fdopen(pdes[0], type); + (void)close(pdes[1]); + } else { + iop = fdopen(pdes[1], type); + (void)close(pdes[0]); + } + +#ifdef HAVE_FCNTL + /* Mark pipe cloexec if requested. */ + if (type[1] == 'e') + fcntl (fileno (iop), F_SETFD, + fcntl (fileno (iop), F_GETFD, 0) | FD_CLOEXEC); +#endif /* HAVE_FCNTL */ + + /* Link into list of file descriptors. */ + cur->fp = iop; + cur->pid = pid; + cur->next = pidlist; + pidlist = cur; + + return (iop); +} + +/* + * pclose -- + * Pclose returns -1 if stream is not associated with a `popened' command, + * if already `pclosed', or waitpid returns an error. + */ +int +pclose (FILE *iop) +{ + register struct pid *cur, *last; + int pstat; + pid_t pid; + + (void)fclose(iop); + + /* Find the appropriate file pointer. */ + for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next) + if (cur->fp == iop) + break; + if (cur == NULL) + return (-1); + + do { + pid = waitpid(cur->pid, &pstat, 0); + } while (pid == -1 && errno == EINTR); + + /* Remove the entry from the linked list. */ + if (last == NULL) + pidlist = cur->next; + else + last->next = cur->next; + free(cur); + + return (pid == -1 ? -1 : pstat); +} + +#endif /* !_NO_POPEN */ diff --git a/lib/posix/posix.tex b/lib/posix/posix.tex new file mode 100644 index 0000000..6fb662b --- /dev/null +++ b/lib/posix/posix.tex @@ -0,0 +1,16 @@ +@node Posix +@chapter Posix Functions + +This chapter groups several utility functions specified by POSIX, but +not by C. Each function documents which header to use. + +@menu +* popen:: Create a stream tied to a child process +* posix_spawn:: Spawn a process +@end menu + +@page +@include posix/popen.def + +@page +@include posix/posix_spawn.def diff --git a/lib/posix/posix_spawn.c b/lib/posix/posix_spawn.c new file mode 100644 index 0000000..6fd6159 --- /dev/null +++ b/lib/posix/posix_spawn.c @@ -0,0 +1,710 @@ +/*- + * Copyright (c) 2008 Ed Schouten + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---spawn a process + +INDEX + posix_spawn +INDEX + posix_spawnp + +SYNOPSIS + #include + + int posix_spawn(pid_t *<[pid]>, const char *<[path]>, + const posix_spawn_file_actions_t *<[file_actions]>, + const posix_spawnattr_t *<[attrp]>, + char *const <[argv]>[], char *const <[envp]>[]); + int posix_spawnp(pid_t *<[pid]>, const char *<[file]>, + const posix_spawn_file_actions_t *<[file_actions]>, + const posix_spawnattr_t *<[attrp]>, + char *const <[argv]>[], char *const <[envp]>[]); + +DESCRIPTION +Use <> and <> to create a new child process +from the specified process image file. <> is the argument count +and <> is an array of argument strings passed to the new program. +<> is an array of stings, which are passed as environment to the +new program. + +The <> argument to <> identifies the new process +image file to execute. The <> argument to <> is +used to construct a pathname that identifies the new process image +file by duplicating the actions of the shell in searching for an +executable file if the specified filename does not contain a `<>' +character. The <> is sought in the colon-separated list of +directory pathnames specified in the <> environment variable. + +The file descriptors remain open across <> and +<> except for those marked as close-on-exec. The open +file descriptors in the child process can be modified by the spawn file +actions object pointed to by <>. + +The spawn attributes object type pointed to by <> argument +may contain any of the attributes defined in <>. + +RETURNS +<> and <> return the process ID of the newly +spawned child process in the variable pointed by a non-NULL <<*<[pid]>>> +argument and zero as the function return value upon successful +completion. Otherwise, <> and <> return an +error number as the function return value to indicate the error; the +value stored into the variable pointed to by a non-NULL <<*<[pid]>>> +argument is unspecified. + +PORTABILITY +POSIX.1-2008 requires <> and <>. + +Supporting OS subroutines required: <<_close>>, <>, <<_fcntl>>, +<<_execve>>, <>, <<_exit>>, <<_open>>, <>, +<>, <>, <>, +<>, <>, <>, <>, <>. +*/ + +#ifndef _NO_POSIX_SPAWN + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Only deal with a pointer to environ, to work around subtle bugs with shared + libraries and/or small data systems where the user declares his own + 'environ'. */ +static char ***p_environ = &environ; + +struct __posix_spawnattr { + short sa_flags; + pid_t sa_pgroup; + struct sched_param sa_schedparam; + int sa_schedpolicy; + sigset_t sa_sigdefault; + sigset_t sa_sigmask; +}; + +struct __posix_spawn_file_actions { + STAILQ_HEAD(, __posix_spawn_file_actions_entry) fa_list; +}; + +typedef struct __posix_spawn_file_actions_entry { + STAILQ_ENTRY(__posix_spawn_file_actions_entry) fae_list; + enum { + FAE_OPEN, + FAE_DUP2, + FAE_CLOSE, + FAE_CHDIR, + FAE_FCHDIR + } fae_action; + + int fae_fildes; + union { + struct { + char *path; +#define fae_path fae_data.open.path + int oflag; +#define fae_oflag fae_data.open.oflag + mode_t mode; +#define fae_mode fae_data.open.mode + } open; + struct { + int newfildes; +#define fae_newfildes fae_data.dup2.newfildes + } dup2; + char *dir; +#define fae_dir fae_data.dir + int dirfd; +#define fae_dirfd fae_data.dirfd + } fae_data; +} posix_spawn_file_actions_entry_t; + +/* + * Spawn routines + */ + +static int +process_spawnattr(const posix_spawnattr_t sa) +{ + struct sigaction sigact = { .sa_flags = 0, .sa_handler = SIG_DFL }; + int i; + + /* + * POSIX doesn't really describe in which order everything + * should be set. We'll just set them in the order in which they + * are mentioned. + */ + + /* Set process group */ + if (sa->sa_flags & POSIX_SPAWN_SETPGROUP) { + if (setpgid(0, sa->sa_pgroup) != 0) + return (errno); + } + + /* Set scheduler policy */ + if (sa->sa_flags & POSIX_SPAWN_SETSCHEDULER) { + if (sched_setscheduler(0, sa->sa_schedpolicy, + &sa->sa_schedparam) != 0) + return (errno); + } else if (sa->sa_flags & POSIX_SPAWN_SETSCHEDPARAM) { + if (sched_setparam(0, &sa->sa_schedparam) != 0) + return (errno); + } + + /* Reset user ID's */ + if (sa->sa_flags & POSIX_SPAWN_RESETIDS) { + if (setegid(getgid()) != 0) + return (errno); + if (seteuid(getuid()) != 0) + return (errno); + } + + /* Set signal masks/defaults */ + if (sa->sa_flags & POSIX_SPAWN_SETSIGMASK) { + sigprocmask(SIG_SETMASK, &sa->sa_sigmask, NULL); + } + + if (sa->sa_flags & POSIX_SPAWN_SETSIGDEF) { + for (i = 1; i < NSIG; i++) { + if (sigismember(&sa->sa_sigdefault, i)) + if (sigaction(i, &sigact, NULL) != 0) + return (errno); + } + } + + return (0); +} + +static int +process_file_actions_entry(posix_spawn_file_actions_entry_t *fae) +{ + int fd; + + switch (fae->fae_action) { + case FAE_OPEN: + /* Perform an open(), make it use the right fd */ + fd = _open(fae->fae_path, fae->fae_oflag, fae->fae_mode); + if (fd < 0) + return (errno); + if (fd != fae->fae_fildes) { + if (dup2(fd, fae->fae_fildes) == -1) + return (errno); + if (_close(fd) != 0) { + if (errno == EBADF) + return (EBADF); + } + } +#ifdef HAVE_FCNTL + if (_fcntl(fae->fae_fildes, F_SETFD, 0) == -1) + return (errno); +#endif /* HAVE_FCNTL */ + break; + case FAE_DUP2: + /* Perform a dup2() */ + if (dup2(fae->fae_fildes, fae->fae_newfildes) == -1) + return (errno); +#ifdef HAVE_FCNTL + if (_fcntl(fae->fae_newfildes, F_SETFD, 0) == -1) + return (errno); +#endif /* HAVE_FCNTL */ + break; + case FAE_CLOSE: + /* Perform a close(), do not fail if already closed */ + (void)_close(fae->fae_fildes); + break; +#ifdef HAVE_CHDIR + case FAE_CHDIR: + /* Perform a chdir. */ + if (chdir (fae->fae_dir) == -1) + return (errno); + break; +#endif +#ifdef HAVE_FCHDIR + case FAE_FCHDIR: + /* Perform a chdir. */ + if (fchdir (fae->fae_dirfd) == -1) + return (errno); + break; + } +#endif + return (0); +} + +static int +process_file_actions(const posix_spawn_file_actions_t fa) +{ + posix_spawn_file_actions_entry_t *fae; + int error; + + /* Replay all file descriptor modifications */ + STAILQ_FOREACH(fae, &fa->fa_list, fae_list) { + error = process_file_actions_entry(fae); + if (error) + return (error); + } + return (0); +} + +#ifdef __CYGWIN__ +/* Cygwin's vfork does not follow BSD vfork semantics. Rather it's equivalent + to fork. While that's POSIX compliant, the below FreeBSD implementation + relying on BSD vfork semantics doesn't work as expected on Cygwin. The + following Cygwin-specific code handles the synchronization FreeBSD gets + for free by using vfork. */ + +extern int __posix_spawn_sem_create (void **semp); +extern void __posix_spawn_sem_release (void *sem, int error); +extern int __posix_spawn_sem_wait_and_close (void *sem, void *proc); +extern int __posix_spawn_fork (void **proc); +extern int __posix_spawn_execvpe (const char *path, char * const *argv, + char *const *envp, void *sem, + int use_env_path); + + +static int +do_posix_spawn(pid_t *pid, const char *path, + const posix_spawn_file_actions_t *fa, + const posix_spawnattr_t *sa, + char * const argv[], char * const envp[], int use_env_path) +{ + int error; + void *sem, *proc; + pid_t p; + + error = __posix_spawn_sem_create(&sem); + if (error) + return error; + + p = __posix_spawn_fork(&proc); + switch (p) { + case -1: + return (errno); + case 0: + if (sa != NULL) { + error = process_spawnattr(*sa); + if (error) { + __posix_spawn_sem_release(sem, error); + _exit(127); + } + } + if (fa != NULL) { + error = process_file_actions(*fa); + if (error) { + __posix_spawn_sem_release(sem, error); + _exit(127); + } + } + __posix_spawn_execvpe(path, argv, + envp != NULL ? envp : *p_environ, + sem, use_env_path); + _exit(127); + default: + error = __posix_spawn_sem_wait_and_close(sem, proc); + if (error != 0) + waitpid(p, NULL, WNOHANG); + else if (pid != NULL) + *pid = p; + return (error); + } +} +#else +static int +do_posix_spawn(pid_t *pid, const char *path, + const posix_spawn_file_actions_t *fa, + const posix_spawnattr_t *sa, + char * const argv[], char * const envp[], int use_env_path) +{ + pid_t p; + volatile int error = 0; + + p = vfork(); + switch (p) { + case -1: + return (errno); + case 0: + if (sa != NULL) { + error = process_spawnattr(*sa); + if (error) + _exit(127); + } + if (fa != NULL) { + error = process_file_actions(*fa); + if (error) + _exit(127); + } + if (use_env_path) + execvpe(path, argv, envp != NULL ? envp : *p_environ); + else + _execve(path, argv, envp != NULL ? envp : *p_environ); + error = errno; + _exit(127); + default: + if (error != 0) + waitpid(p, NULL, WNOHANG); + else if (pid != NULL) + *pid = p; + return (error); + } +} +#endif + +int +posix_spawn (pid_t *pid, + const char *path, + const posix_spawn_file_actions_t *fa, + const posix_spawnattr_t *sa, + char * const argv[], + char * const envp[]) +{ + return do_posix_spawn(pid, path, fa, sa, argv, envp, 0); +} + +int +posix_spawnp (pid_t *pid, + const char *path, + const posix_spawn_file_actions_t *fa, + const posix_spawnattr_t *sa, + char * const argv[], + char * const envp[]) +{ + return do_posix_spawn(pid, path, fa, sa, argv, envp, 1); +} + +/* + * File descriptor actions + */ + +int +posix_spawn_file_actions_init (posix_spawn_file_actions_t *ret) +{ + posix_spawn_file_actions_t fa; + + fa = malloc(sizeof(struct __posix_spawn_file_actions)); + if (fa == NULL) + return (-1); + + STAILQ_INIT(&fa->fa_list); + *ret = fa; + return (0); +} + +int +posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *fa) +{ + posix_spawn_file_actions_entry_t *fae; + + while ((fae = STAILQ_FIRST(&(*fa)->fa_list)) != NULL) { + /* Remove file action entry from the queue */ + STAILQ_REMOVE_HEAD(&(*fa)->fa_list, fae_list); + + /* Deallocate file action entry */ + switch (fae->fae_action) { + case FAE_OPEN: + free(fae->fae_path); + break; +#ifdef HAVE_CHDIR + case FAE_CHDIR: + free(fae->fae_dir); + break; +#endif + default: + break; + } + free(fae); + } + + free(*fa); + return (0); +} + +int +posix_spawn_file_actions_addopen (posix_spawn_file_actions_t * __restrict fa, + int fildes, + const char * __restrict path, + int oflag, + mode_t mode) +{ + posix_spawn_file_actions_entry_t *fae; + int error; + + if (fildes < 0) + return (EBADF); + + /* Allocate object */ + fae = malloc(sizeof(posix_spawn_file_actions_entry_t)); + if (fae == NULL) + return (errno); + + /* Set values and store in queue */ + fae->fae_action = FAE_OPEN; + fae->fae_path = strdup(path); + if (fae->fae_path == NULL) { + error = errno; + free(fae); + return (error); + } + fae->fae_fildes = fildes; + fae->fae_oflag = oflag; + fae->fae_mode = mode; + + STAILQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list); + return (0); +} + +int +posix_spawn_file_actions_adddup2 (posix_spawn_file_actions_t *fa, + int fildes, + int newfildes) +{ + posix_spawn_file_actions_entry_t *fae; + + if (fildes < 0 || newfildes < 0) + return (EBADF); + + /* Allocate object */ + fae = malloc(sizeof(posix_spawn_file_actions_entry_t)); + if (fae == NULL) + return (errno); + + /* Set values and store in queue */ + fae->fae_action = FAE_DUP2; + fae->fae_fildes = fildes; + fae->fae_newfildes = newfildes; + + STAILQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list); + return (0); +} + +int +posix_spawn_file_actions_addclose (posix_spawn_file_actions_t *fa, + int fildes) +{ + posix_spawn_file_actions_entry_t *fae; + + if (fildes < 0) + return (EBADF); + + /* Allocate object */ + fae = malloc(sizeof(posix_spawn_file_actions_entry_t)); + if (fae == NULL) + return (errno); + + /* Set values and store in queue */ + fae->fae_action = FAE_CLOSE; + fae->fae_fildes = fildes; + + STAILQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list); + return (0); +} + +#ifdef HAVE_CHDIR +int +posix_spawn_file_actions_addchdir_np ( + posix_spawn_file_actions_t * __restrict fa, + const char * __restrict path) +{ + posix_spawn_file_actions_entry_t *fae; + int error; + + /* Allocate object */ + fae = malloc(sizeof(posix_spawn_file_actions_entry_t)); + if (fae == NULL) + return (errno); + + /* Set values and store in queue */ + fae->fae_action = FAE_CHDIR; + fae->fae_dir = strdup(path); + if (fae->fae_dir == NULL) { + error = errno; + free(fae); + return (error); + } + + STAILQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list); + return (0); +} +#endif + +#ifdef HAVE_FCHDIR +int +posix_spawn_file_actions_addfchdir_np ( + posix_spawn_file_actions_t * __restrict fa, + int fd) +{ + posix_spawn_file_actions_entry_t *fae; + + /* POSIX proposal documents it as implemented in FreeBSD and Musl. + Return EBADF if fd is negative. + https://www.austingroupbugs.net/view.php?id=1208 */ + if (fd < 0) + return EBADF; + + /* Allocate object */ + fae = malloc(sizeof(posix_spawn_file_actions_entry_t)); + if (fae == NULL) + return (errno); + + /* Set values and store in queue */ + fae->fae_action = FAE_FCHDIR; + fae->fae_dirfd = fd; + + STAILQ_INSERT_TAIL(&(*fa)->fa_list, fae, fae_list); + return (0); +} +#endif + +/* + * Spawn attributes + */ + +int +posix_spawnattr_init (posix_spawnattr_t *ret) +{ + posix_spawnattr_t sa; + + sa = calloc(1, sizeof(struct __posix_spawnattr)); + if (sa == NULL) + return (errno); + + /* Set defaults as specified by POSIX, cleared above */ + *ret = sa; + return (0); +} + +int +posix_spawnattr_destroy (posix_spawnattr_t *sa) +{ + free(*sa); + return (0); +} + +int +posix_spawnattr_getflags (const posix_spawnattr_t * __restrict sa, + short * __restrict flags) +{ + *flags = (*sa)->sa_flags; + return (0); +} + +int +posix_spawnattr_getpgroup (const posix_spawnattr_t * __restrict sa, + pid_t * __restrict pgroup) +{ + *pgroup = (*sa)->sa_pgroup; + return (0); +} + +int +posix_spawnattr_getschedparam (const posix_spawnattr_t * __restrict sa, + struct sched_param * __restrict schedparam) +{ + *schedparam = (*sa)->sa_schedparam; + return (0); +} + +int +posix_spawnattr_getschedpolicy (const posix_spawnattr_t * __restrict sa, + int * __restrict schedpolicy) +{ + *schedpolicy = (*sa)->sa_schedpolicy; + return (0); +} + +int +posix_spawnattr_getsigdefault (const posix_spawnattr_t * __restrict sa, + sigset_t * __restrict sigdefault) +{ + *sigdefault = (*sa)->sa_sigdefault; + return (0); +} + +int +posix_spawnattr_getsigmask (const posix_spawnattr_t * __restrict sa, + sigset_t * __restrict sigmask) +{ + *sigmask = (*sa)->sa_sigmask; + return (0); +} + +int +posix_spawnattr_setflags (posix_spawnattr_t *sa, + short flags) +{ + (*sa)->sa_flags = flags; + return (0); +} + +int +posix_spawnattr_setpgroup (posix_spawnattr_t *sa, + pid_t pgroup) +{ + (*sa)->sa_pgroup = pgroup; + return (0); +} + +int +posix_spawnattr_setschedparam (posix_spawnattr_t * __restrict sa, + const struct sched_param * __restrict schedparam) +{ + (*sa)->sa_schedparam = *schedparam; + return (0); +} + +int +posix_spawnattr_setschedpolicy (posix_spawnattr_t *sa, + int schedpolicy) +{ + (*sa)->sa_schedpolicy = schedpolicy; + return (0); +} + +int +posix_spawnattr_setsigdefault (posix_spawnattr_t * __restrict sa, + const sigset_t * __restrict sigdefault) +{ + (*sa)->sa_sigdefault = *sigdefault; + return (0); +} + +int +posix_spawnattr_setsigmask (posix_spawnattr_t * __restrict sa, + const sigset_t * __restrict sigmask) +{ + (*sa)->sa_sigmask = *sigmask; + return (0); +} + +#endif /* !_NO_POSIX_SPAWN */ diff --git a/lib/posix/readdir.c b/lib/posix/readdir.c new file mode 100644 index 0000000..fef83c1 --- /dev/null +++ b/lib/posix/readdir.c @@ -0,0 +1,87 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)readdir.c 5.7 (Berkeley) 6/1/90"; +#endif /* LIBC_SCCS and not lint */ + +#include + +extern int getdents (int fd, void *dp, int count); + +/* + * get next entry in a directory. + */ +struct dirent * +readdir (register DIR *dirp) +{ + register struct dirent *dp; + +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#endif + + for (;;) { + if (dirp->dd_loc == 0) { + dirp->dd_size = getdents (dirp->dd_fd, + dirp->dd_buf, + dirp->dd_len); + + if (dirp->dd_size <= 0) { +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + return NULL; + } + } + if (dirp->dd_loc >= dirp->dd_size) { + dirp->dd_loc = 0; + continue; + } + dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc); + if (dp->d_reclen <= 0 || + dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc) { +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + return NULL; + } + dirp->dd_loc += dp->d_reclen; + if (dp->d_ino == 0) + continue; +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + return (dp); + } +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/readdir_r.c b/lib/posix/readdir_r.c new file mode 100644 index 0000000..ac55cc8 --- /dev/null +++ b/lib/posix/readdir_r.c @@ -0,0 +1,100 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* this code is modified from readdir.c by Jeff Johnston, June 5, 2002 */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)readdir.c 5.7 (Berkeley) 6/1/90"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include + +extern int getdents (int fd, void *dp, int count); + +/* + * get next entry in a directory using supplied dirent structure. + */ +int +readdir_r (register DIR *__restrict dirp, + struct dirent *__restrict dp, + struct dirent **__restrict dpp) { + +struct dirent *tmpdp; + +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#endif + + for (;;) { + if (dirp->dd_loc == 0) { + dirp->dd_size = getdents (dirp->dd_fd, + dirp->dd_buf, + dirp->dd_len); + + if (dirp->dd_size <= 0) { +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + *dpp = NULL; + return dirp->dd_size == 0 ? 0 : errno; + } + } + if (dirp->dd_loc >= dirp->dd_size) { + dirp->dd_loc = 0; + continue; + } + tmpdp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc); + + if (tmpdp->d_reclen <= 0 || + tmpdp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc) { +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + *dpp = NULL; + return -1; + } + memcpy (dp, tmpdp, MIN (tmpdp->d_reclen, sizeof (struct dirent))); + + dirp->dd_loc += dp->d_reclen; + if (dp->d_ino == 0) + continue; +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + *dpp = dp; + return 0; + } +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/regcomp.c b/lib/posix/regcomp.c new file mode 100644 index 0000000..002f978 --- /dev/null +++ b/lib/posix/regcomp.c @@ -0,0 +1,2088 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regcomp.c 8.5 (Berkeley) 3/20/94 + */ + +#ifndef _NO_REGEX + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regcomp.c 8.5 (Berkeley) 3/20/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "collate.h" + +#include "utils.h" +#include "regex2.h" + +#include "cclass.h" +#include "cname.h" + +/* + * parse structure, passed up and down to avoid global variables and + * other clumsinesses + */ +struct parse { + char *next; /* next character in RE */ + char *end; /* end of string (-> NUL normally) */ + int error; /* has an error been seen? */ + sop *strip; /* malloced strip */ + sopno ssize; /* malloced strip size (allocated) */ + sopno slen; /* malloced strip length (used) */ + int ncsalloc; /* number of csets allocated */ + struct re_guts *g; +# define NPAREN 10 /* we need to remember () 1-9 for back refs */ + sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ + sopno pend[NPAREN]; /* -> ) ([0] unused) */ +}; + +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regcomp.c === */ +static void p_ere(struct parse *p, int stop); +static void p_ere_exp(struct parse *p); +static void p_str(struct parse *p); +static void p_bre(struct parse *p, int end1, int end2); +static int p_simp_re(struct parse *p, int starordinary); +static int p_count(struct parse *p); +static void p_bracket(struct parse *p); +static void p_b_term(struct parse *p, cset *cs); +static void p_b_cclass(struct parse *p, cset *cs); +static void p_b_eclass(struct parse *p, cset *cs); +static char p_b_symbol(struct parse *p); +static char p_b_coll_elem(struct parse *p, int endc); +static char othercase(int ch); +static void bothcases(struct parse *p, int ch); +static void ordinary(struct parse *p, int ch); +static void nonnewline(struct parse *p); +static void repeat(struct parse *p, sopno start, int from, int to); +static int seterr(struct parse *p, int e); +static cset *allocset(struct parse *p); +static void freeset(struct parse *p, cset *cs); +static int freezeset(struct parse *p, cset *cs); +static int firstch(struct parse *p, cset *cs); +static int nch(struct parse *p, cset *cs); +#if used +static void mcadd(struct parse *p, cset *cs, char *cp); +static void mcsub(cset *cs, char *cp); +static int mcin(cset *cs, char *cp); +static char *mcfind(cset *cs, char *cp); +#endif +static void mcinvert(struct parse *p, cset *cs); +static void mccase(struct parse *p, cset *cs); +static int isinsets(struct re_guts *g, int c); +static int samesets(struct re_guts *g, int c1, int c2); +static void categorize(struct parse *p, struct re_guts *g); +static sopno dupl(struct parse *p, sopno start, sopno finish); +static void doemit(struct parse *p, sop op, size_t opnd); +static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos); +static void dofwd(struct parse *p, sopno pos, sop value); +static void enlarge(struct parse *p, sopno size); +static void stripsnug(struct parse *p, struct re_guts *g); +static void findmust(struct parse *p, struct re_guts *g); +static int altoffset(sop *scan, int offset, int mccs); +static void computejumps(struct parse *p, struct re_guts *g); +static void computematchjumps(struct parse *p, struct re_guts *g); +static sopno pluscount(struct parse *p, struct re_guts *g); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ + +static char nuls[10]; /* place to point scanner in event of error */ + +/* + * macros for use with parse structure + * BEWARE: these know that the parse structure is named `p' !!! + */ +#define PEEK() (*p->next) +#define PEEK2() (*(p->next+1)) +#define MORE() (p->next < p->end) +#define MORE2() (p->next+1 < p->end) +#define SEE(c) (MORE() && PEEK() == (c)) +#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) +#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) +#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) +#define NEXT() (p->next++) +#define NEXT2() (p->next += 2) +#define NEXTn(n) (p->next += (n)) +#define GETNEXT() (*p->next++) +#define SETERROR(e) seterr(p, (e)) +#define REQUIRE(co, e) ((co) || SETERROR(e)) +#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e)) +#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e)) +#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e)) +#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) +#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) +#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) +#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) +#define HERE() (p->slen) +#define THERE() (p->slen - 1) +#define THERETHERE() (p->slen - 2) +#define DROP(n) (p->slen -= (n)) + +#ifndef NDEBUG +static int never = 0; /* for use in asserts; shuts lint up */ +#else +#define never 0 /* some s have bugs too */ +#endif + +/* Macro used by computejump()/computematchjump() */ +#define MIN(a,b) ((a)<(b)?(a):(b)) + +/* + - regcomp - interface for parser and compilation + = extern int regcomp(regex_t *__restrict, const char *__restrict, int); + = #define REG_BASIC 0000 + = #define REG_EXTENDED 0001 + = #define REG_ICASE 0002 + = #define REG_NOSUB 0004 + = #define REG_NEWLINE 0010 + = #define REG_NOSPEC 0020 + = #define REG_PEND 0040 + = #define REG_DUMP 0200 + */ +int /* 0 success, otherwise REG_something */ +regcomp(preg, pattern, cflags) +regex_t *__restrict preg; +const char *__restrict pattern; +int cflags; +{ + struct parse pa; + struct re_guts *g; + struct parse *p = &pa; + int i; + size_t len; +#ifdef REDEBUG +# define GOODFLAGS(f) (f) +#else +# define GOODFLAGS(f) ((f)&~REG_DUMP) +#endif + + cflags = GOODFLAGS(cflags); + if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) + return(REG_INVARG); + + if (cflags®_PEND) { + if (preg->re_endp < pattern) + return(REG_INVARG); + len = preg->re_endp - pattern; + } else + len = strlen((char *)pattern); + + /* do the mallocs early so failure handling is easy */ + g = (struct re_guts *)malloc(sizeof(struct re_guts) + + (NC-1)*sizeof(cat_t)); + if (g == NULL) + return(REG_ESPACE); + p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ + p->strip = (sop *)malloc(p->ssize * sizeof(sop)); + p->slen = 0; + if (p->strip == NULL) { + free((char *)g); + return(REG_ESPACE); + } + + /* set things up */ + p->g = g; + p->next = (char *)pattern; /* convenience; we do not modify it */ + p->end = p->next + len; + p->error = 0; + p->ncsalloc = 0; + for (i = 0; i < NPAREN; i++) { + p->pbegin[i] = 0; + p->pend[i] = 0; + } + g->csetsize = NC; + g->sets = NULL; + g->setbits = NULL; + g->ncsets = 0; + g->cflags = cflags; + g->iflags = 0; + g->nbol = 0; + g->neol = 0; + g->must = NULL; + g->moffset = -1; + g->charjump = NULL; + g->matchjump = NULL; + g->mlen = 0; + g->nsub = 0; + g->ncategories = 1; /* category 0 is "everything else" */ + g->categories = &g->catspace[-(CHAR_MIN)]; + (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); + g->backrefs = 0; + + /* do it */ + EMIT(OEND, 0); + g->firststate = THERE(); + if (cflags®_EXTENDED) + p_ere(p, OUT); + else if (cflags®_NOSPEC) + p_str(p); + else + p_bre(p, OUT, OUT); + EMIT(OEND, 0); + g->laststate = THERE(); + + /* tidy up loose ends and fill things in */ + categorize(p, g); + stripsnug(p, g); + findmust(p, g); + /* only use Boyer-Moore algorithm if the pattern is bigger + * than three characters + */ + if(g->mlen > 3) { + computejumps(p, g); + computematchjumps(p, g); + if(g->matchjump == NULL && g->charjump != NULL) { + free(g->charjump); + g->charjump = NULL; + } + } + g->nplus = pluscount(p, g); + g->magic = MAGIC2; + preg->re_nsub = g->nsub; + preg->re_g = g; + preg->re_magic = MAGIC1; +#ifndef REDEBUG + /* not debugging, so can't rely on the assert() in regexec() */ + if (g->iflags&BAD) + SETERROR(REG_ASSERT); +#endif + + /* win or lose, we're done */ + if (p->error != 0) /* lose */ + regfree(preg); + return(p->error); +} + +/* + - p_ere - ERE parser top level, concatenation and alternation + == static void p_ere(struct parse *p, int stop); + */ +static void +p_ere(p, stop) +struct parse *p; +int stop; /* character this ERE should end at */ +{ + char c; + sopno prevback = 0; + sopno prevfwd = 0; + sopno conc; + int first = 1; /* is this the first alternative? */ + + for (;;) { + /* do a bunch of concatenated expressions */ + conc = HERE(); + while (MORE() && (c = PEEK()) != '|' && c != stop) + p_ere_exp(p); + (void)REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ + + if (!EAT('|')) + break; /* NOTE BREAK OUT */ + + if (first) { + INSERT(OCH_, conc); /* offset is wrong */ + prevfwd = conc; + prevback = conc; + first = 0; + } + ASTERN(OOR1, prevback); + prevback = THERE(); + AHEAD(prevfwd); /* fix previous offset */ + prevfwd = HERE(); + EMIT(OOR2, 0); /* offset is very wrong */ + } + + if (!first) { /* tail-end fixups */ + AHEAD(prevfwd); + ASTERN(O_CH, prevback); + } + + assert(!MORE() || SEE(stop)); +} + +/* + - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op + == static void p_ere_exp(struct parse *p); + */ +static void +p_ere_exp(p) +struct parse *p; +{ + char c; + sopno pos; + int count; + int count2; + sopno subno; + int wascaret = 0; + + assert(MORE()); /* caller should have ensured this */ + c = GETNEXT(); + + pos = HERE(); + switch (c) { + case '(': + (void)REQUIRE(MORE(), REG_EPAREN); + p->g->nsub++; + subno = p->g->nsub; + if (subno < NPAREN) + p->pbegin[subno] = HERE(); + EMIT(OLPAREN, subno); + if (!SEE(')')) + p_ere(p, ')'); + if (subno < NPAREN) { + p->pend[subno] = HERE(); + assert(p->pend[subno] != 0); + } + EMIT(ORPAREN, subno); + (void)MUSTEAT(')', REG_EPAREN); + break; +#ifndef POSIX_MISTAKE + case ')': /* happens only if no current unmatched ( */ + /* + * You may ask, why the ifndef? Because I didn't notice + * this until slightly too late for 1003.2, and none of the + * other 1003.2 regular-expression reviewers noticed it at + * all. So an unmatched ) is legal POSIX, at least until + * we can get it fixed. + */ + SETERROR(REG_EPAREN); + break; +#endif + case '^': + EMIT(OBOL, 0); + p->g->iflags |= USEBOL; + p->g->nbol++; + wascaret = 1; + break; + case '$': + EMIT(OEOL, 0); + p->g->iflags |= USEEOL; + p->g->neol++; + break; + case '|': + SETERROR(REG_EMPTY); + break; + case '*': + case '+': + case '?': + SETERROR(REG_BADRPT); + break; + case '.': + if (p->g->cflags®_NEWLINE) + nonnewline(p); + else + EMIT(OANY, 0); + break; + case '[': + p_bracket(p); + break; + case '\\': + (void)REQUIRE(MORE(), REG_EESCAPE); + c = GETNEXT(); + ordinary(p, c); + break; + case '{': /* okay as ordinary except if digit follows */ + (void)REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT); + /* FALLTHROUGH */ + default: + ordinary(p, c); + break; + } + + if (!MORE()) + return; + c = PEEK(); + /* we call { a repetition if followed by a digit */ + if (!( c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && isdigit((uch)PEEK2())) )) + return; /* no repetition, we're done */ + NEXT(); + + (void)REQUIRE(!wascaret, REG_BADRPT); + switch (c) { + case '*': /* implemented as +? */ + /* this case does not require the (y|) trick, noKLUDGE */ + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + INSERT(OQUEST_, pos); + ASTERN(O_QUEST, pos); + break; + case '+': + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + break; + case '?': + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, pos); /* offset slightly wrong */ + ASTERN(OOR1, pos); /* this one's right */ + AHEAD(pos); /* fix the OCH_ */ + EMIT(OOR2, 0); /* offset very wrong... */ + AHEAD(THERE()); /* ...so fix it */ + ASTERN(O_CH, THERETHERE()); + break; + case '{': + count = p_count(p); + if (EAT(',')) { + if (isdigit((uch)PEEK())) { + count2 = p_count(p); + (void)REQUIRE(count <= count2, REG_BADBR); + } else /* single number with comma */ + count2 = INFINITY; + } else /* just a single number */ + count2 = count; + repeat(p, pos, count, count2); + if (!EAT('}')) { /* error heuristics */ + while (MORE() && PEEK() != '}') + NEXT(); + (void)REQUIRE(MORE(), REG_EBRACE); + SETERROR(REG_BADBR); + } + break; + } + + if (!MORE()) + return; + c = PEEK(); + if (!( c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && isdigit((uch)PEEK2())) ) ) + return; + SETERROR(REG_BADRPT); +} + +/* + - p_str - string (no metacharacters) "parser" + == static void p_str(struct parse *p); + */ +static void +p_str(p) +struct parse *p; +{ + (void)REQUIRE(MORE(), REG_EMPTY); + while (MORE()) + ordinary(p, GETNEXT()); +} + +/* + - p_bre - BRE parser top level, anchoring and concatenation + == static void p_bre(struct parse *p, int end1, \ + == int end2); + * Giving end1 as OUT essentially eliminates the end1/end2 check. + * + * This implementation is a bit of a kludge, in that a trailing $ is first + * taken as an ordinary character and then revised to be an anchor. The + * only undesirable side effect is that '$' gets included as a character + * category in such cases. This is fairly harmless; not worth fixing. + * The amount of lookahead needed to avoid this kludge is excessive. + */ +static void +p_bre(p, end1, end2) +struct parse *p; +int end1; /* first terminating character */ +int end2; /* second terminating character */ +{ + sopno start = HERE(); + int first = 1; /* first subexpression? */ + int wasdollar = 0; + + if (EAT('^')) { + EMIT(OBOL, 0); + p->g->iflags |= USEBOL; + p->g->nbol++; + } + while (MORE() && !SEETWO(end1, end2)) { + wasdollar = p_simp_re(p, first); + first = 0; + } + if (wasdollar) { /* oops, that was a trailing anchor */ + DROP(1); + EMIT(OEOL, 0); + p->g->iflags |= USEEOL; + p->g->neol++; + } + + (void)REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ +} + +/* + - p_simp_re - parse a simple RE, an atom possibly followed by a repetition + == static int p_simp_re(struct parse *p, int starordinary); + */ +static int /* was the simple RE an unbackslashed $? */ +p_simp_re(p, starordinary) +struct parse *p; +int starordinary; /* is a leading * an ordinary character? */ +{ + int c; + int count; + int count2; + sopno pos; + int i; + sopno subno; +# define BACKSL (1<g->cflags®_NEWLINE) + nonnewline(p); + else + EMIT(OANY, 0); + break; + case '[': + p_bracket(p); + break; + case BACKSL|'{': + SETERROR(REG_BADRPT); + break; + case BACKSL|'(': + p->g->nsub++; + subno = p->g->nsub; + if (subno < NPAREN) + p->pbegin[subno] = HERE(); + EMIT(OLPAREN, subno); + /* the MORE here is an error heuristic */ + if (MORE() && !SEETWO('\\', ')')) + p_bre(p, '\\', ')'); + if (subno < NPAREN) { + p->pend[subno] = HERE(); + assert(p->pend[subno] != 0); + } + EMIT(ORPAREN, subno); + (void)REQUIRE(EATTWO('\\', ')'), REG_EPAREN); + break; + case BACKSL|')': /* should not get here -- must be user */ + case BACKSL|'}': + SETERROR(REG_EPAREN); + break; + case BACKSL|'1': + case BACKSL|'2': + case BACKSL|'3': + case BACKSL|'4': + case BACKSL|'5': + case BACKSL|'6': + case BACKSL|'7': + case BACKSL|'8': + case BACKSL|'9': + i = (c&~BACKSL) - '0'; + assert(i < NPAREN); + if (p->pend[i] != 0) { + assert(i <= p->g->nsub); + EMIT(OBACK_, i); + assert(p->pbegin[i] != 0); + assert(OP(p->strip[p->pbegin[i]]) == OLPAREN); + assert(OP(p->strip[p->pend[i]]) == ORPAREN); + (void) dupl(p, p->pbegin[i]+1, p->pend[i]); + EMIT(O_BACK, i); + } else + SETERROR(REG_ESUBREG); + p->g->backrefs = 1; + break; + case '*': + (void)REQUIRE(starordinary, REG_BADRPT); + /* FALLTHROUGH */ + default: + ordinary(p, (char)c); + break; + } + + if (EAT('*')) { /* implemented as +? */ + /* this case does not require the (y|) trick, noKLUDGE */ + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + INSERT(OQUEST_, pos); + ASTERN(O_QUEST, pos); + } else if (EATTWO('\\', '{')) { + count = p_count(p); + if (EAT(',')) { + if (MORE() && isdigit((uch)PEEK())) { + count2 = p_count(p); + (void)REQUIRE(count <= count2, REG_BADBR); + } else /* single number with comma */ + count2 = INFINITY; + } else /* just a single number */ + count2 = count; + repeat(p, pos, count, count2); + if (!EATTWO('\\', '}')) { /* error heuristics */ + while (MORE() && !SEETWO('\\', '}')) + NEXT(); + (void)REQUIRE(MORE(), REG_EBRACE); + SETERROR(REG_BADBR); + } + } else if (c == '$') /* $ (but not \$) ends it */ + return(1); + + return(0); +} + +/* + - p_count - parse a repetition count + == static int p_count(struct parse *p); + */ +static int /* the value */ +p_count(p) +struct parse *p; +{ + int count = 0; + int ndigits = 0; + + while (MORE() && isdigit((uch)PEEK()) && count <= DUPMAX) { + count = count*10 + (GETNEXT() - '0'); + ndigits++; + } + + (void)REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); + return(count); +} + +/* + - p_bracket - parse a bracketed character list + == static void p_bracket(struct parse *p); + * + * Note a significant property of this code: if the allocset() did SETERROR, + * no set operations are done. + */ +static void +p_bracket(p) +struct parse *p; +{ + cset *cs = allocset(p); + int invert = 0; + + /* Dept of Truly Sickening Special-Case Kludges */ + if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) { + EMIT(OBOW, 0); + NEXTn(6); + return; + } + if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) { + EMIT(OEOW, 0); + NEXTn(6); + return; + } + + if (EAT('^')) + invert++; /* make note to invert set at end */ + if (EAT(']')) + CHadd(cs, ']'); + else if (EAT('-')) + CHadd(cs, '-'); + while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) + p_b_term(p, cs); + if (EAT('-')) + CHadd(cs, '-'); + (void)MUSTEAT(']', REG_EBRACK); + + if (p->error != 0) /* don't mess things up further */ + return; + + if (p->g->cflags®_ICASE) { + int i; + int ci; + + for (i = p->g->csetsize - 1; i >= 0; i--) + if (CHIN(cs, i) && isalpha(i)) { + ci = othercase(i); + if (ci != i) + CHadd(cs, ci); + } + if (cs->multis != NULL) + mccase(p, cs); + } + if (invert) { + int i; + + for (i = p->g->csetsize - 1; i >= 0; i--) + if (CHIN(cs, i)) + CHsub(cs, i); + else + CHadd(cs, i); + if (p->g->cflags®_NEWLINE) + CHsub(cs, '\n'); + if (cs->multis != NULL) + mcinvert(p, cs); + } + + assert(cs->multis == NULL); /* xxx */ + + if (nch(p, cs) == 1) { /* optimize singleton sets */ + ordinary(p, firstch(p, cs)); + freeset(p, cs); + } else + EMIT(OANYOF, freezeset(p, cs)); +} + +/* + - p_b_term - parse one term of a bracketed character list + == static void p_b_term(struct parse *p, cset *cs); + */ +static void +p_b_term(p, cs) +struct parse *p; +cset *cs; +{ + char c; + char start, finish; + int i; + + /* classify what we've got */ + switch ((MORE()) ? PEEK() : '\0') { + case '[': + c = (MORE2()) ? PEEK2() : '\0'; + break; + case '-': + SETERROR(REG_ERANGE); + return; /* NOTE RETURN */ + break; + default: + c = '\0'; + break; + } + + switch (c) { + case ':': /* character class */ + NEXT2(); + (void)REQUIRE(MORE(), REG_EBRACK); + c = PEEK(); + (void)REQUIRE(c != '-' && c != ']', REG_ECTYPE); + p_b_cclass(p, cs); + (void)REQUIRE(MORE(), REG_EBRACK); + (void)REQUIRE(EATTWO(':', ']'), REG_ECTYPE); + break; + case '=': /* equivalence class */ + NEXT2(); + (void)REQUIRE(MORE(), REG_EBRACK); + c = PEEK(); + (void)REQUIRE(c != '-' && c != ']', REG_ECOLLATE); + p_b_eclass(p, cs); + (void)REQUIRE(MORE(), REG_EBRACK); + (void)REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); + break; + default: /* symbol, ordinary character, or range */ +/* xxx revision needed for multichar stuff */ + start = p_b_symbol(p); + if (SEE('-') && MORE2() && PEEK2() != ']') { + /* range */ + NEXT(); + if (EAT('-')) + finish = '-'; + else + finish = p_b_symbol(p); + } else + finish = start; + if (start == finish) + CHadd(cs, start); + else { + if (__collate_load_error) { + (void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE); + for (i = (uch)start; i <= (uch)finish; i++) + CHadd(cs, i); + } else { + (void)REQUIRE(__collate_range_cmp(start, finish) <= 0, REG_ERANGE); + for (i = CHAR_MIN; i <= CHAR_MAX; i++) { + if ( __collate_range_cmp(start, i) <= 0 + && __collate_range_cmp(i, finish) <= 0 + ) + CHadd(cs, i); + } + } + } + break; + } +} + +/* + - p_b_cclass - parse a character-class name and deal with it + == static void p_b_cclass(struct parse *p, cset *cs); + */ +static void +p_b_cclass(p, cs) +struct parse *p; +cset *cs; +{ + int c; + char *sp = p->next; + struct cclass *cp; + size_t len; + + while (MORE() && isalpha((uch)PEEK())) + NEXT(); + len = p->next - sp; + for (cp = cclasses; cp->name != NULL; cp++) + if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') + break; + if (cp->name == NULL) { + /* oops, didn't find it */ + SETERROR(REG_ECTYPE); + return; + } + + switch (cp->fidx) { + case CALNUM: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isalnum((uch)c)) + CHadd(cs, c); + break; + case CALPHA: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isalpha((uch)c)) + CHadd(cs, c); + break; + case CBLANK: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isblank((uch)c)) + CHadd(cs, c); + break; + case CCNTRL: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (iscntrl((uch)c)) + CHadd(cs, c); + break; + case CDIGIT: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isdigit((uch)c)) + CHadd(cs, c); + break; + case CGRAPH: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isgraph((uch)c)) + CHadd(cs, c); + break; + case CLOWER: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (islower((uch)c)) + CHadd(cs, c); + break; + case CPRINT: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isprint((uch)c)) + CHadd(cs, c); + break; + case CPUNCT: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (ispunct((uch)c)) + CHadd(cs, c); + break; + case CSPACE: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isspace((uch)c)) + CHadd(cs, c); + break; + case CUPPER: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isupper((uch)c)) + CHadd(cs, c); + break; + case CXDIGIT: + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (isxdigit((uch)c)) + CHadd(cs, c); + break; + } +#if 0 + for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) + MCadd(p, cs, u); +#endif +} + +/* + - p_b_eclass - parse an equivalence-class name and deal with it + == static void p_b_eclass(struct parse *p, cset *cs); + * + * This implementation is incomplete. xxx + */ +static void +p_b_eclass(p, cs) +struct parse *p; +cset *cs; +{ + char c; + + c = p_b_coll_elem(p, '='); + CHadd(cs, c); +} + +/* + - p_b_symbol - parse a character or [..]ed multicharacter collating symbol + == static char p_b_symbol(struct parse *p); + */ +static char /* value of symbol */ +p_b_symbol(p) +struct parse *p; +{ + char value; + + (void)REQUIRE(MORE(), REG_EBRACK); + if (!EATTWO('[', '.')) + return(GETNEXT()); + + /* collating symbol */ + value = p_b_coll_elem(p, '.'); + (void)REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); + return(value); +} + +/* + - p_b_coll_elem - parse a collating-element name and look it up + == static char p_b_coll_elem(struct parse *p, int endc); + */ +static char /* value of collating element */ +p_b_coll_elem(p, endc) +struct parse *p; +int endc; /* name ended by endc,']' */ +{ + char *sp = p->next; + struct cname *cp; + int len; + + while (MORE() && !SEETWO(endc, ']')) + NEXT(); + if (!MORE()) { + SETERROR(REG_EBRACK); + return(0); + } + len = p->next - sp; + for (cp = cnames; cp->name != NULL; cp++) + if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') + return(cp->code); /* known name */ + if (len == 1) + return(*sp); /* single character */ + SETERROR(REG_ECOLLATE); /* neither */ + return(0); +} + +/* + - othercase - return the case counterpart of an alphabetic + == static char othercase(int ch); + */ +static char /* if no counterpart, return ch */ +othercase(ch) +int ch; +{ + ch = (uch)ch; + assert(isalpha(ch)); + if (isupper(ch)) + return(tolower(ch)); + else if (islower(ch)) + return(toupper(ch)); + else /* peculiar, but could happen */ + return(ch); +} + +/* + - bothcases - emit a dualcase version of a two-case character + == static void bothcases(struct parse *p, int ch); + * + * Boy, is this implementation ever a kludge... + */ +static void +bothcases(p, ch) +struct parse *p; +int ch; +{ + char *oldnext = p->next; + char *oldend = p->end; + char bracket[3]; + + ch = (uch)ch; + assert(othercase(ch) != ch); /* p_bracket() would recurse */ + p->next = bracket; + p->end = bracket+2; + bracket[0] = ch; + bracket[1] = ']'; + bracket[2] = '\0'; + p_bracket(p); + assert(p->next == bracket+2); + p->next = oldnext; + p->end = oldend; +} + +/* + - ordinary - emit an ordinary character + == static void ordinary(struct parse *p, int ch); + */ +static void +ordinary(p, ch) +struct parse *p; +int ch; +{ + cat_t *cap = p->g->categories; + + if ((p->g->cflags®_ICASE) && isalpha((uch)ch) && othercase(ch) != ch) + bothcases(p, ch); + else { + EMIT(OCHAR, (uch)ch); + if (cap[ch] == 0) + cap[ch] = p->g->ncategories++; + } +} + +/* + - nonnewline - emit REG_NEWLINE version of OANY + == static void nonnewline(struct parse *p); + * + * Boy, is this implementation ever a kludge... + */ +static void +nonnewline(p) +struct parse *p; +{ + char *oldnext = p->next; + char *oldend = p->end; + char bracket[4]; + + p->next = bracket; + p->end = bracket+3; + bracket[0] = '^'; + bracket[1] = '\n'; + bracket[2] = ']'; + bracket[3] = '\0'; + p_bracket(p); + assert(p->next == bracket+3); + p->next = oldnext; + p->end = oldend; +} + +/* + - repeat - generate code for a bounded repetition, recursively if needed + == static void repeat(struct parse *p, sopno start, int from, int to); + */ +static void +repeat(p, start, from, to) +struct parse *p; +sopno start; /* operand from here to end of strip */ +int from; /* repeated from this number */ +int to; /* to this number of times (maybe INFINITY) */ +{ + sopno finish = HERE(); +# define N 2 +# define INF 3 +# define REP(f, t) ((f)*8 + (t)) +# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) + sopno copy; + + if (p->error != 0) /* head off possible runaway recursion */ + return; + + assert(from <= to); + + switch (REP(MAP(from), MAP(to))) { + case REP(0, 0): /* must be user doing this */ + DROP(finish-start); /* drop the operand */ + break; + case REP(0, 1): /* as x{1,1}? */ + case REP(0, N): /* as x{1,n}? */ + case REP(0, INF): /* as x{1,}? */ + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, start); /* offset is wrong... */ + repeat(p, start+1, 1, to); + ASTERN(OOR1, start); + AHEAD(start); /* ... fix it */ + EMIT(OOR2, 0); + AHEAD(THERE()); + ASTERN(O_CH, THERETHERE()); + break; + case REP(1, 1): /* trivial case */ + /* done */ + break; + case REP(1, N): /* as x?x{1,n-1} */ + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, start); + ASTERN(OOR1, start); + AHEAD(start); + EMIT(OOR2, 0); /* offset very wrong... */ + AHEAD(THERE()); /* ...so fix it */ + ASTERN(O_CH, THERETHERE()); + copy = dupl(p, start+1, finish+1); + assert(copy == finish+4); + repeat(p, copy, 1, to-1); + break; + case REP(1, INF): /* as x+ */ + INSERT(OPLUS_, start); + ASTERN(O_PLUS, start); + break; + case REP(N, N): /* as xx{m-1,n-1} */ + copy = dupl(p, start, finish); + repeat(p, copy, from-1, to-1); + break; + case REP(N, INF): /* as xx{n-1,INF} */ + copy = dupl(p, start, finish); + repeat(p, copy, from-1, to); + break; + default: /* "can't happen" */ + SETERROR(REG_ASSERT); /* just in case */ + break; + } +} + +/* + - seterr - set an error condition + == static int seterr(struct parse *p, int e); + */ +static int /* useless but makes type checking happy */ +seterr(p, e) +struct parse *p; +int e; +{ + if (p->error == 0) /* keep earliest error condition */ + p->error = e; + p->next = nuls; /* try to bring things to a halt */ + p->end = nuls; + return(0); /* make the return value well-defined */ +} + +/* + - allocset - allocate a set of characters for [] + == static cset *allocset(struct parse *p); + */ +static cset * +allocset(p) +struct parse *p; +{ + int no = p->g->ncsets++; + size_t nc; + size_t nbytes; + cset *cs; + size_t css = (size_t)p->g->csetsize; + int i; + + if (no >= p->ncsalloc) { /* need another column of space */ + p->ncsalloc += CHAR_BIT; + nc = p->ncsalloc; + assert(nc % CHAR_BIT == 0); + nbytes = nc / CHAR_BIT * css; + if (p->g->sets == NULL) + p->g->sets = (cset *)malloc(nc * sizeof(cset)); + else + p->g->sets = (cset *)reallocf((char *)p->g->sets, + nc * sizeof(cset)); + if (p->g->setbits == NULL) + p->g->setbits = (uch *)malloc(nbytes); + else { + p->g->setbits = (uch *)reallocf((char *)p->g->setbits, + nbytes); + /* xxx this isn't right if setbits is now NULL */ + for (i = 0; i < no; i++) + p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); + } + if (p->g->sets != NULL && p->g->setbits != NULL) + (void) memset((char *)p->g->setbits + (nbytes - css), + 0, css); + else { + no = 0; + SETERROR(REG_ESPACE); + /* caller's responsibility not to do set ops */ + } + } + + assert(p->g->sets != NULL); /* xxx */ + cs = &p->g->sets[no]; + cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); + cs->mask = 1 << ((no) % CHAR_BIT); + cs->hash = 0; + cs->smultis = 0; + cs->multis = NULL; + + return(cs); +} + +/* + - freeset - free a now-unused set + == static void freeset(struct parse *p, cset *cs); + */ +static void +freeset(p, cs) +struct parse *p; +cset *cs; +{ + int i; + cset *top = &p->g->sets[p->g->ncsets]; + size_t css = (size_t)p->g->csetsize; + + for (i = 0; i < css; i++) + CHsub(cs, i); + if (cs == top-1) /* recover only the easy case */ + p->g->ncsets--; +} + +/* + - freezeset - final processing on a set of characters + == static int freezeset(struct parse *p, cset *cs); + * + * The main task here is merging identical sets. This is usually a waste + * of time (although the hash code minimizes the overhead), but can win + * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash + * is done using addition rather than xor -- all ASCII [aA] sets xor to + * the same value! + */ +static int /* set number */ +freezeset(p, cs) +struct parse *p; +cset *cs; +{ + short h = cs->hash; + int i; + cset *top = &p->g->sets[p->g->ncsets]; + cset *cs2; + size_t css = (size_t)p->g->csetsize; + + /* look for an earlier one which is the same */ + for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) + if (cs2->hash == h && cs2 != cs) { + /* maybe */ + for (i = 0; i < css; i++) + if (!!CHIN(cs2, i) != !!CHIN(cs, i)) + break; /* no */ + if (i == css) + break; /* yes */ + } + + if (cs2 < top) { /* found one */ + freeset(p, cs); + cs = cs2; + } + + return((int)(cs - p->g->sets)); +} + +/* + - firstch - return first character in a set (which must have at least one) + == static int firstch(struct parse *p, cset *cs); + */ +static int /* character; there is no "none" value */ +firstch(p, cs) +struct parse *p; +cset *cs; +{ + int i; + size_t css = (size_t)p->g->csetsize; + + for (i = 0; i < css; i++) + if (CHIN(cs, i)) + return((char)i); + assert(never); + return(0); /* arbitrary */ +} + +/* + - nch - number of characters in a set + == static int nch(struct parse *p, cset *cs); + */ +static int +nch(p, cs) +struct parse *p; +cset *cs; +{ + int i; + size_t css = (size_t)p->g->csetsize; + int n = 0; + + for (i = 0; i < css; i++) + if (CHIN(cs, i)) + n++; + return(n); +} + +#if used +/* + - mcadd - add a collating element to a cset + == static void mcadd(struct parse *p, cset *cs, \ + == char *cp); + */ +static void +mcadd(p, cs, cp) +struct parse *p; +cset *cs; +char *cp; +{ + size_t oldend = cs->smultis; + + cs->smultis += strlen(cp) + 1; + if (cs->multis == NULL) + cs->multis = malloc(cs->smultis); + else + cs->multis = reallocf(cs->multis, cs->smultis); + if (cs->multis == NULL) { + SETERROR(REG_ESPACE); + return; + } + + (void) strcpy(cs->multis + oldend - 1, cp); + cs->multis[cs->smultis - 1] = '\0'; +} + +/* + - mcsub - subtract a collating element from a cset + == static void mcsub(cset *cs, char *cp); + */ +static void +mcsub(cs, cp) +cset *cs; +char *cp; +{ + char *fp = mcfind(cs, cp); + size_t len = strlen(fp); + + assert(fp != NULL); + (void) memmove(fp, fp + len + 1, + cs->smultis - (fp + len + 1 - cs->multis)); + cs->smultis -= len; + + if (cs->smultis == 0) { + free(cs->multis); + cs->multis = NULL; + return; + } + + cs->multis = reallocf(cs->multis, cs->smultis); + assert(cs->multis != NULL); +} + +/* + - mcin - is a collating element in a cset? + == static int mcin(cset *cs, char *cp); + */ +static int +mcin(cs, cp) +cset *cs; +char *cp; +{ + return(mcfind(cs, cp) != NULL); +} + +/* + - mcfind - find a collating element in a cset + == static char *mcfind(cset *cs, char *cp); + */ +static char * +mcfind(cs, cp) +cset *cs; +char *cp; +{ + char *p; + + if (cs->multis == NULL) + return(NULL); + for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) + if (strcmp(cp, p) == 0) + return(p); + return(NULL); +} +#endif + +/* + - mcinvert - invert the list of collating elements in a cset + == static void mcinvert(struct parse *p, cset *cs); + * + * This would have to know the set of possibilities. Implementation + * is deferred. + */ +static void +mcinvert(p, cs) +struct parse *p; +cset *cs; +{ + assert(cs->multis == NULL); /* xxx */ +} + +/* + - mccase - add case counterparts of the list of collating elements in a cset + == static void mccase(struct parse *p, cset *cs); + * + * This would have to know the set of possibilities. Implementation + * is deferred. + */ +static void +mccase(p, cs) +struct parse *p; +cset *cs; +{ + assert(cs->multis == NULL); /* xxx */ +} + +/* + - isinsets - is this character in any sets? + == static int isinsets(struct re_guts *g, int c); + */ +static int /* predicate */ +isinsets(g, c) +struct re_guts *g; +int c; +{ + uch *col; + int i; + int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + unsigned uc = (uch)c; + + for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) + if (col[uc] != 0) + return(1); + return(0); +} + +/* + - samesets - are these two characters in exactly the same sets? + == static int samesets(struct re_guts *g, int c1, int c2); + */ +static int /* predicate */ +samesets(g, c1, c2) +struct re_guts *g; +int c1; +int c2; +{ + uch *col; + int i; + int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + unsigned uc1 = (uch)c1; + unsigned uc2 = (uch)c2; + + for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) + if (col[uc1] != col[uc2]) + return(0); + return(1); +} + +/* + - categorize - sort out character categories + == static void categorize(struct parse *p, struct re_guts *g); + */ +static void +categorize(p, g) +struct parse *p; +struct re_guts *g; +{ + cat_t *cats = g->categories; + int c; + int c2; + cat_t cat; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (cats[c] == 0 && isinsets(g, c)) { + cat = g->ncategories++; + cats[c] = cat; + for (c2 = c+1; c2 <= CHAR_MAX; c2++) + if (cats[c2] == 0 && samesets(g, c, c2)) + cats[c2] = cat; + } +} + +/* + - dupl - emit a duplicate of a bunch of sops + == static sopno dupl(struct parse *p, sopno start, sopno finish); + */ +static sopno /* start of duplicate */ +dupl(p, start, finish) +struct parse *p; +sopno start; /* from here */ +sopno finish; /* to this less one */ +{ + sopno ret = HERE(); + sopno len = finish - start; + + assert(finish >= start); + if (len == 0) + return(ret); + enlarge(p, p->ssize + len); /* this many unexpected additions */ + assert(p->ssize >= p->slen + len); + (void) memcpy((char *)(p->strip + p->slen), + (char *)(p->strip + start), (size_t)len*sizeof(sop)); + p->slen += len; + return(ret); +} + +/* + - doemit - emit a strip operator + == static void doemit(struct parse *p, sop op, size_t opnd); + * + * It might seem better to implement this as a macro with a function as + * hard-case backup, but it's just too big and messy unless there are + * some changes to the data structures. Maybe later. + */ +static void +doemit(p, op, opnd) +struct parse *p; +sop op; +size_t opnd; +{ + /* avoid making error situations worse */ + if (p->error != 0) + return; + + /* deal with oversize operands ("can't happen", more or less) */ + assert(opnd < 1<slen >= p->ssize) + enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */ + assert(p->slen < p->ssize); + + /* finally, it's all reduced to the easy case */ + p->strip[p->slen++] = SOP(op, opnd); +} + +/* + - doinsert - insert a sop into the strip + == static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos); + */ +static void +doinsert(p, op, opnd, pos) +struct parse *p; +sop op; +size_t opnd; +sopno pos; +{ + sopno sn; + sop s; + int i; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + sn = HERE(); + EMIT(op, opnd); /* do checks, ensure space */ + assert(HERE() == sn+1); + s = p->strip[sn]; + + /* adjust paren pointers */ + assert(pos > 0); + for (i = 1; i < NPAREN; i++) { + if (p->pbegin[i] >= pos) { + p->pbegin[i]++; + } + if (p->pend[i] >= pos) { + p->pend[i]++; + } + } + + memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], + (HERE()-pos-1)*sizeof(sop)); + p->strip[pos] = s; +} + +/* + - dofwd - complete a forward reference + == static void dofwd(struct parse *p, sopno pos, sop value); + */ +static void +dofwd(p, pos, value) +struct parse *p; +sopno pos; +sop value; +{ + /* avoid making error situations worse */ + if (p->error != 0) + return; + + assert(value < 1<strip[pos] = OP(p->strip[pos]) | value; +} + +/* + - enlarge - enlarge the strip + == static void enlarge(struct parse *p, sopno size); + */ +static void +enlarge(p, size) +struct parse *p; +sopno size; +{ + sop *sp; + + if (p->ssize >= size) + return; + + sp = (sop *)realloc(p->strip, size*sizeof(sop)); + if (sp == NULL) { + SETERROR(REG_ESPACE); + return; + } + p->strip = sp; + p->ssize = size; +} + +/* + - stripsnug - compact the strip + == static void stripsnug(struct parse *p, struct re_guts *g); + */ +static void +stripsnug(p, g) +struct parse *p; +struct re_guts *g; +{ + g->nstates = p->slen; + g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); + if (g->strip == NULL) { + SETERROR(REG_ESPACE); + g->strip = p->strip; + } +} + +/* + - findmust - fill in must and mlen with longest mandatory literal string + == static void findmust(struct parse *p, struct re_guts *g); + * + * This algorithm could do fancy things like analyzing the operands of | + * for common subsequences. Someday. This code is simple and finds most + * of the interesting cases. + * + * Note that must and mlen got initialized during setup. + */ +static void +findmust(p, g) +struct parse *p; +struct re_guts *g; +{ + sop *scan; + sop *start = NULL; + sop *newstart = NULL; + sopno newlen; + sop s; + char *cp; + sopno i; + int offset; + int cs, mccs; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + /* Find out if we can handle OANYOF or not */ + mccs = 0; + for (cs = 0; cs < g->ncsets; cs++) + if (g->sets[cs].multis != NULL) + mccs = 1; + + /* find the longest OCHAR sequence in strip */ + newlen = 0; + offset = 0; + g->moffset = 0; + scan = g->strip + 1; + do { + s = *scan++; + switch (OP(s)) { + case OCHAR: /* sequence member */ + if (newlen == 0) /* new sequence */ + newstart = scan - 1; + newlen++; + break; + case OPLUS_: /* things that don't break one */ + case OLPAREN: + case ORPAREN: + break; + case OQUEST_: /* things that must be skipped */ + case OCH_: + offset = altoffset(scan, offset, mccs); + scan--; + do { + scan += OPND(s); + s = *scan; + /* assert() interferes w debug printouts */ + if (OP(s) != O_QUEST && OP(s) != O_CH && + OP(s) != OOR2) { + g->iflags |= BAD; + return; + } + } while (OP(s) != O_QUEST && OP(s) != O_CH); + /* fallthrough */ + case OBOW: /* things that break a sequence */ + case OEOW: + case OBOL: + case OEOL: + case O_QUEST: + case O_CH: + case OEND: + if (newlen > g->mlen) { /* ends one */ + start = newstart; + g->mlen = newlen; + if (offset > -1) { + g->moffset += offset; + offset = newlen; + } else + g->moffset = offset; + } else { + if (offset > -1) + offset += newlen; + } + newlen = 0; + break; + case OANY: + if (newlen > g->mlen) { /* ends one */ + start = newstart; + g->mlen = newlen; + if (offset > -1) { + g->moffset += offset; + offset = newlen; + } else + g->moffset = offset; + } else { + if (offset > -1) + offset += newlen; + } + if (offset > -1) + offset++; + newlen = 0; + break; + case OANYOF: /* may or may not invalidate offset */ + /* First, everything as OANY */ + if (newlen > g->mlen) { /* ends one */ + start = newstart; + g->mlen = newlen; + if (offset > -1) { + g->moffset += offset; + offset = newlen; + } else + g->moffset = offset; + } else { + if (offset > -1) + offset += newlen; + } + if (offset > -1) + offset++; + newlen = 0; + /* And, now, if we found out we can't deal with + * it, make offset = -1. + */ + if (mccs) + offset = -1; + break; + default: + /* Anything here makes it impossible or too hard + * to calculate the offset -- so we give up; + * save the last known good offset, in case the + * must sequence doesn't occur later. + */ + if (newlen > g->mlen) { /* ends one */ + start = newstart; + g->mlen = newlen; + if (offset > -1) + g->moffset += offset; + else + g->moffset = offset; + } + offset = -1; + newlen = 0; + break; + } + } while (OP(s) != OEND); + + if (g->mlen == 0) { /* there isn't one */ + g->moffset = -1; + return; + } + + /* turn it into a character string */ + g->must = malloc((size_t)g->mlen + 1); + if (g->must == NULL) { /* argh; just forget it */ + g->mlen = 0; + g->moffset = -1; + return; + } + cp = g->must; + scan = start; + for (i = g->mlen; i > 0; i--) { + while (OP(s = *scan++) != OCHAR) + continue; + assert(cp < g->must + g->mlen); + *cp++ = (char)OPND(s); + } + assert(cp == g->must + g->mlen); + *cp++ = '\0'; /* just on general principles */ +} + +/* + - altoffset - choose biggest offset among multiple choices + == static int altoffset(sop *scan, int offset, int mccs); + * + * Compute, recursively if necessary, the largest offset among multiple + * re paths. + */ +static int +altoffset(scan, offset, mccs) +sop *scan; +int offset; +int mccs; +{ + int largest; + int try; + sop s; + + /* If we gave up already on offsets, return */ + if (offset == -1) + return -1; + + largest = 0; + try = 0; + s = *scan++; + while (OP(s) != O_QUEST && OP(s) != O_CH) { + switch (OP(s)) { + case OOR1: + if (try > largest) + largest = try; + try = 0; + break; + case OQUEST_: + case OCH_: + try = altoffset(scan, try, mccs); + if (try == -1) + return -1; + scan--; + do { + scan += OPND(s); + s = *scan; + if (OP(s) != O_QUEST && OP(s) != O_CH && + OP(s) != OOR2) + return -1; + } while (OP(s) != O_QUEST && OP(s) != O_CH); + /* We must skip to the next position, or we'll + * leave altoffset() too early. + */ + scan++; + break; + case OANYOF: + if (mccs) + return -1; + case OCHAR: + case OANY: + try++; + case OBOW: + case OEOW: + case OLPAREN: + case ORPAREN: + case OOR2: + break; + default: + try = -1; + break; + } + if (try == -1) + return -1; + s = *scan++; + } + + if (try > largest) + largest = try; + + return largest+offset; +} + +/* + - computejumps - compute char jumps for BM scan + == static void computejumps(struct parse *p, struct re_guts *g); + * + * This algorithm assumes g->must exists and is has size greater than + * zero. It's based on the algorithm found on Computer Algorithms by + * Sara Baase. + * + * A char jump is the number of characters one needs to jump based on + * the value of the character from the text that was mismatched. + */ +static void +computejumps(p, g) +struct parse *p; +struct re_guts *g; +{ + int ch; + int mindex; + + /* Avoid making errors worse */ + if (p->error != 0) + return; + + g->charjump = (int*) malloc((NC + 1) * sizeof(int)); + if (g->charjump == NULL) /* Not a fatal error */ + return; + /* Adjust for signed chars, if necessary */ + g->charjump = &g->charjump[-(CHAR_MIN)]; + + /* If the character does not exist in the pattern, the jump + * is equal to the number of characters in the pattern. + */ + for (ch = CHAR_MIN; ch < (CHAR_MAX + 1); ch++) + g->charjump[ch] = g->mlen; + + /* If the character does exist, compute the jump that would + * take us to the last character in the pattern equal to it + * (notice that we match right to left, so that last character + * is the first one that would be matched). + */ + for (mindex = 0; mindex < g->mlen; mindex++) + g->charjump[(unsigned char) g->must[mindex]] = g->mlen - mindex - 1; +} + +/* + - computematchjumps - compute match jumps for BM scan + == static void computematchjumps(struct parse *p, struct re_guts *g); + * + * This algorithm assumes g->must exists and is has size greater than + * zero. It's based on the algorithm found on Computer Algorithms by + * Sara Baase. + * + * A match jump is the number of characters one needs to advance based + * on the already-matched suffix. + * Notice that all values here are minus (g->mlen-1), because of the way + * the search algorithm works. + */ +static void +computematchjumps(p, g) +struct parse *p; +struct re_guts *g; +{ + int mindex; /* General "must" iterator */ + int suffix; /* Keeps track of matching suffix */ + int ssuffix; /* Keeps track of suffixes' suffix */ + int* pmatches; /* pmatches[k] points to the next i + * such that i+1...mlen is a substring + * of k+1...k+mlen-i-1 + */ + + /* Avoid making errors worse */ + if (p->error != 0) + return; + + pmatches = (int*) malloc(g->mlen * sizeof(unsigned int)); + if (pmatches == NULL) { + g->matchjump = NULL; + return; + } + + g->matchjump = (int*) malloc(g->mlen * sizeof(unsigned int)); + if (g->matchjump == NULL) /* Not a fatal error */ + return; + + /* Set maximum possible jump for each character in the pattern */ + for (mindex = 0; mindex < g->mlen; mindex++) + g->matchjump[mindex] = 2*g->mlen - mindex - 1; + + /* Compute pmatches[] */ + for (mindex = g->mlen - 1, suffix = g->mlen; mindex >= 0; + mindex--, suffix--) { + pmatches[mindex] = suffix; + + /* If a mismatch is found, interrupting the substring, + * compute the matchjump for that position. If no + * mismatch is found, then a text substring mismatched + * against the suffix will also mismatch against the + * substring. + */ + while (suffix < g->mlen + && g->must[mindex] != g->must[suffix]) { + g->matchjump[suffix] = MIN(g->matchjump[suffix], + g->mlen - mindex - 1); + suffix = pmatches[suffix]; + } + } + + /* Compute the matchjump up to the last substring found to jump + * to the beginning of the largest must pattern prefix matching + * it's own suffix. + */ + for (mindex = 0; mindex <= suffix; mindex++) + g->matchjump[mindex] = MIN(g->matchjump[mindex], + g->mlen + suffix - mindex); + + ssuffix = pmatches[suffix]; + while (suffix < g->mlen) { + while (suffix <= ssuffix && suffix < g->mlen) { + g->matchjump[suffix] = MIN(g->matchjump[suffix], + g->mlen + ssuffix - suffix); + suffix++; + } + if (suffix < g->mlen) + ssuffix = pmatches[ssuffix]; + } + + free(pmatches); +} + +/* + - pluscount - count + nesting + == static sopno pluscount(struct parse *p, struct re_guts *g); + */ +static sopno /* nesting depth */ +pluscount(p, g) +struct parse *p; +struct re_guts *g; +{ + sop *scan; + sop s; + sopno plusnest = 0; + sopno maxnest = 0; + + if (p->error != 0) + return(0); /* there may not be an OEND */ + + scan = g->strip + 1; + do { + s = *scan++; + switch (OP(s)) { + case OPLUS_: + plusnest++; + break; + case O_PLUS: + if (plusnest > maxnest) + maxnest = plusnest; + plusnest--; + break; + } + } while (OP(s) != OEND); + if (plusnest != 0) + g->iflags |= BAD; + return(maxnest); +} + +#endif /* !_NO_REGEX */ diff --git a/lib/posix/regerror.c b/lib/posix/regerror.c new file mode 100644 index 0000000..a48d37c --- /dev/null +++ b/lib/posix/regerror.c @@ -0,0 +1,178 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regerror.c 8.4 (Berkeley) 3/20/94 + */ + +#ifndef _NO_REGEX + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regerror.c === */ +static char *regatoi(const regex_t *preg, char *localbuf); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ +/* + = #define REG_NOMATCH 1 + = #define REG_BADPAT 2 + = #define REG_ECOLLATE 3 + = #define REG_ECTYPE 4 + = #define REG_EESCAPE 5 + = #define REG_ESUBREG 6 + = #define REG_EBRACK 7 + = #define REG_EPAREN 8 + = #define REG_EBRACE 9 + = #define REG_BADBR 10 + = #define REG_ERANGE 11 + = #define REG_ESPACE 12 + = #define REG_BADRPT 13 + = #define REG_EMPTY 14 + = #define REG_ASSERT 15 + = #define REG_INVARG 16 + = #define REG_ATOI 255 // convert name to number (!) + = #define REG_ITOA 0400 // convert number to name (!) + */ +static struct rerr { + int code; + char *name; + char *explain; +} rerrs[] = { + {REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match"}, + {REG_BADPAT, "REG_BADPAT", "invalid regular expression"}, + {REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element"}, + {REG_ECTYPE, "REG_ECTYPE", "invalid character class"}, + {REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)"}, + {REG_ESUBREG, "REG_ESUBREG", "invalid backreference number"}, + {REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced"}, + {REG_EPAREN, "REG_EPAREN", "parentheses not balanced"}, + {REG_EBRACE, "REG_EBRACE", "braces not balanced"}, + {REG_BADBR, "REG_BADBR", "invalid repetition count(s)"}, + {REG_ERANGE, "REG_ERANGE", "invalid character range"}, + {REG_ESPACE, "REG_ESPACE", "out of memory"}, + {REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid"}, + {REG_EMPTY, "REG_EMPTY", "empty (sub)expression"}, + {REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug"}, + {REG_INVARG, "REG_INVARG", "invalid argument to regex routine"}, + {0, "", "*** unknown regexp error code ***"} +}; + +/* + - regerror - the interface to error numbers + = extern size_t regerror(int, const regex_t *__restrict, + = char *__restrict, size_t); + */ +/* ARGSUSED */ +size_t +regerror(errcode, preg, errbuf, errbuf_size) +int errcode; +const regex_t *__restrict preg; +char *__restrict errbuf; +size_t errbuf_size; +{ + struct rerr *r; + size_t len; + int target = errcode &~ REG_ITOA; + char *s; + char convbuf[50]; + + if (errcode == REG_ATOI) + s = regatoi(preg, convbuf); + else { + for (r = rerrs; r->code != 0; r++) + if (r->code == target) + break; + + if (errcode®_ITOA) { + if (r->code != 0) + (void) strcpy(convbuf, r->name); + else + sprintf(convbuf, "REG_0x%x", target); + assert(strlen(convbuf) < sizeof(convbuf)); + s = convbuf; + } else + s = r->explain; + } + + len = strlen(s) + 1; + if (errbuf_size > 0) { + if (errbuf_size > len) + (void) strcpy(errbuf, s); + else { + (void) strncpy(errbuf, s, errbuf_size-1); + errbuf[errbuf_size-1] = '\0'; + } + } + + return(len); +} + +/* + - regatoi - internal routine to implement REG_ATOI + == static char *regatoi(const regex_t *preg, char *localbuf); + */ +static char * +regatoi(preg, localbuf) +const regex_t *preg; +char *localbuf; +{ + struct rerr *r; + + for (r = rerrs; r->code != 0; r++) + if (strcmp(r->name, preg->re_endp) == 0) + break; + if (r->code == 0) + return("0"); + + sprintf(localbuf, "%d", r->code); + return(localbuf); +} +#endif /* !_NO_REGEX */ diff --git a/lib/posix/regex.3 b/lib/posix/regex.3 new file mode 100644 index 0000000..d9bf901 --- /dev/null +++ b/lib/posix/regex.3 @@ -0,0 +1,697 @@ +.\" Copyright (c) 1992, 1993, 1994 Henry Spencer. +.\" Copyright (c) 1992, 1993, 1994 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Henry Spencer. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)regex.3 8.4 (Berkeley) 3/20/94 +.\" $FreeBSD: src/lib/libc/regex/regex.3,v 1.9 2001/10/01 16:08:58 ru Exp $ +.\" +.Dd March 20, 1994 +.Dt REGEX 3 +.Os +.Sh NAME +.Nm regcomp , +.Nm regexec , +.Nm regerror , +.Nm regfree +.Nd regular-expression library +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In sys/types.h +.In regex.h +.Ft int +.Fn regcomp "regex_t *restrict preg" "const char *_restrictpattern" "int cflags" +.Ft int +.Fo regexec +.Fa "const regex_t *_restrict preg" "const char *_restrict string" +.Fa "size_t nmatch" "regmatch_t pmatch[_restrict]" "int eflags" +.Fc +.Ft size_t +.Fo regerror +.Fa "int errcode" "const regex_t *_restrict preg" +.Fa "char *_restrict errbuf" "size_t errbuf_size" +.Fc +.Ft void +.Fn regfree "regex_t *preg" +.Sh DESCRIPTION +These routines implement +.St -p1003.2 +regular expressions +.Pq Do RE Dc Ns s ; +see +.Xr re_format 7 . +.Fn Regcomp +compiles an RE written as a string into an internal form, +.Fn regexec +matches that internal form against a string and reports results, +.Fn regerror +transforms error codes from either into human-readable messages, +and +.Fn regfree +frees any dynamically-allocated storage used by the internal form +of an RE. +.Pp +The header +.Aq Pa regex.h +declares two structure types, +.Ft regex_t +and +.Ft regmatch_t , +the former for compiled internal forms and the latter for match reporting. +It also declares the four functions, +a type +.Ft regoff_t , +and a number of constants with names starting with +.Dq Dv REG_ . +.Pp +.Fn Regcomp +compiles the regular expression contained in the +.Fa pattern +string, +subject to the flags in +.Fa cflags , +and places the results in the +.Ft regex_t +structure pointed to by +.Fa preg . +.Fa Cflags +is the bitwise OR of zero or more of the following flags: +.Bl -tag -width REG_EXTENDED +.It Dv REG_EXTENDED +Compile modern +.Pq Dq extended +REs, +rather than the obsolete +.Pq Dq basic +REs that +are the default. +.It Dv REG_BASIC +This is a synonym for 0, +provided as a counterpart to +.Dv REG_EXTENDED +to improve readability. +.It Dv REG_NOSPEC +Compile with recognition of all special characters turned off. +All characters are thus considered ordinary, +so the +.Dq RE +is a literal string. +This is an extension, +compatible with but not specified by +.St -p1003.2 , +and should be used with +caution in software intended to be portable to other systems. +.Dv REG_EXTENDED +and +.Dv REG_NOSPEC +may not be used +in the same call to +.Fn regcomp . +.It Dv REG_ICASE +Compile for matching that ignores upper/lower case distinctions. +See +.Xr re_format 7 . +.It Dv REG_NOSUB +Compile for matching that need only report success or failure, +not what was matched. +.It Dv REG_NEWLINE +Compile for newline-sensitive matching. +By default, newline is a completely ordinary character with no special +meaning in either REs or strings. +With this flag, +.Ql [^ +bracket expressions and +.Ql .\& +never match newline, +a +.Ql ^\& +anchor matches the null string after any newline in the string +in addition to its normal function, +and the +.Ql $\& +anchor matches the null string before any newline in the +string in addition to its normal function. +.It Dv REG_PEND +The regular expression ends, +not at the first NUL, +but just before the character pointed to by the +.Va re_endp +member of the structure pointed to by +.Fa preg . +The +.Va re_endp +member is of type +.Ft "const char *" . +This flag permits inclusion of NULs in the RE; +they are considered ordinary characters. +This is an extension, +compatible with but not specified by +.St -p1003.2 , +and should be used with +caution in software intended to be portable to other systems. +.El +.Pp +When successful, +.Fn regcomp +returns 0 and fills in the structure pointed to by +.Fa preg . +One member of that structure +(other than +.Va re_endp ) +is publicized: +.Va re_nsub , +of type +.Ft size_t , +contains the number of parenthesized subexpressions within the RE +(except that the value of this member is undefined if the +.Dv REG_NOSUB +flag was used). +If +.Fn regcomp +fails, it returns a non-zero error code; +see +.Sx DIAGNOSTICS . +.Pp +.Fn Regexec +matches the compiled RE pointed to by +.Fa preg +against the +.Fa string , +subject to the flags in +.Fa eflags , +and reports results using +.Fa nmatch , +.Fa pmatch , +and the returned value. +The RE must have been compiled by a previous invocation of +.Fn regcomp . +The compiled form is not altered during execution of +.Fn regexec , +so a single compiled RE can be used simultaneously by multiple threads. +.Pp +By default, +the NUL-terminated string pointed to by +.Fa string +is considered to be the text of an entire line, minus any terminating +newline. +The +.Fa eflags +argument is the bitwise OR of zero or more of the following flags: +.Bl -tag -width REG_STARTEND +.It Dv REG_NOTBOL +The first character of +the string +is not the beginning of a line, so the +.Ql ^\& +anchor should not match before it. +This does not affect the behavior of newlines under +.Dv REG_NEWLINE . +.It Dv REG_NOTEOL +The NUL terminating +the string +does not end a line, so the +.Ql $\& +anchor should not match before it. +This does not affect the behavior of newlines under +.Dv REG_NEWLINE . +.It Dv REG_STARTEND +The string is considered to start at +.Fa string ++ +.Fa pmatch Ns [0]. Ns Va rm_so +and to have a terminating NUL located at +.Fa string ++ +.Fa pmatch Ns [0]. Ns Va rm_eo +(there need not actually be a NUL at that location), +regardless of the value of +.Fa nmatch . +See below for the definition of +.Fa pmatch +and +.Fa nmatch . +This is an extension, +compatible with but not specified by +.St -p1003.2 , +and should be used with +caution in software intended to be portable to other systems. +Note that a non-zero +.Va rm_so +does not imply +.Dv REG_NOTBOL ; +.Dv REG_STARTEND +affects only the location of the string, +not how it is matched. +.El +.Pp +See +.Xr re_format 7 +for a discussion of what is matched in situations where an RE or a +portion thereof could match any of several substrings of +.Fa string . +.Pp +Normally, +.Fn regexec +returns 0 for success and the non-zero code +.Dv REG_NOMATCH +for failure. +Other non-zero error codes may be returned in exceptional situations; +see +.Sx DIAGNOSTICS . +.Pp +If +.Dv REG_NOSUB +was specified in the compilation of the RE, +or if +.Fa nmatch +is 0, +.Fn regexec +ignores the +.Fa pmatch +argument (but see below for the case where +.Dv REG_STARTEND +is specified). +Otherwise, +.Fa pmatch +points to an array of +.Fa nmatch +structures of type +.Ft regmatch_t . +Such a structure has at least the members +.Va rm_so +and +.Va rm_eo , +both of type +.Ft regoff_t +(a signed arithmetic type at least as large as an +.Ft off_t +and a +.Ft ssize_t ) , +containing respectively the offset of the first character of a substring +and the offset of the first character after the end of the substring. +Offsets are measured from the beginning of the +.Fa string +argument given to +.Fn regexec . +An empty substring is denoted by equal offsets, +both indicating the character following the empty substring. +.Pp +The 0th member of the +.Fa pmatch +array is filled in to indicate what substring of +.Fa string +was matched by the entire RE. +Remaining members report what substring was matched by parenthesized +subexpressions within the RE; +member +.Va i +reports subexpression +.Va i , +with subexpressions counted (starting at 1) by the order of their opening +parentheses in the RE, left to right. +Unused entries in the array (corresponding either to subexpressions that +did not participate in the match at all, or to subexpressions that do not +exist in the RE (that is, +.Va i +> +.Fa preg Ns -> Ns Va re_nsub ) ) +have both +.Va rm_so +and +.Va rm_eo +set to -1. +If a subexpression participated in the match several times, +the reported substring is the last one it matched. +(Note, as an example in particular, that when the RE +.Ql "(b*)+" +matches +.Ql bbb , +the parenthesized subexpression matches each of the three +.So Li b Sc Ns s +and then +an infinite number of empty strings following the last +.Ql b , +so the reported substring is one of the empties.) +.Pp +If +.Dv REG_STARTEND +is specified, +.Fa pmatch +must point to at least one +.Ft regmatch_t +(even if +.Fa nmatch +is 0 or +.Dv REG_NOSUB +was specified), +to hold the input offsets for +.Dv REG_STARTEND . +Use for output is still entirely controlled by +.Fa nmatch ; +if +.Fa nmatch +is 0 or +.Dv REG_NOSUB +was specified, +the value of +.Fa pmatch Ns [0] +will not be changed by a successful +.Fn regexec . +.Pp +.Fn Regerror +maps a non-zero +.Fa errcode +from either +.Fn regcomp +or +.Fn regexec +to a human-readable, printable message. +If +.Fa preg +is +.No non\- Ns Dv NULL , +the error code should have arisen from use of +the +.Ft regex_t +pointed to by +.Fa preg , +and if the error code came from +.Fn regcomp , +it should have been the result from the most recent +.Fn regcomp +using that +.Ft regex_t . +.No ( Fn Regerror +may be able to supply a more detailed message using information +from the +.Ft regex_t . ) +.Fn Regerror +places the NUL-terminated message into the buffer pointed to by +.Fa errbuf , +limiting the length (including the NUL) to at most +.Fa errbuf_size +bytes. +If the whole message won't fit, +as much of it as will fit before the terminating NUL is supplied. +In any case, +the returned value is the size of buffer needed to hold the whole +message (including terminating NUL). +If +.Fa errbuf_size +is 0, +.Fa errbuf +is ignored but the return value is still correct. +.Pp +If the +.Fa errcode +given to +.Fn regerror +is first ORed with +.Dv REG_ITOA , +the +.Dq message +that results is the printable name of the error code, +e.g.\& +.Dq Dv REG_NOMATCH , +rather than an explanation thereof. +If +.Fa errcode +is +.Dv REG_ATOI , +then +.Fa preg +shall be +.No non\- Ns Dv NULL +and the +.Va re_endp +member of the structure it points to +must point to the printable name of an error code; +in this case, the result in +.Fa errbuf +is the decimal digits of +the numeric value of the error code +(0 if the name is not recognized). +.Dv REG_ITOA +and +.Dv REG_ATOI +are intended primarily as debugging facilities; +they are extensions, +compatible with but not specified by +.St -p1003.2 , +and should be used with +caution in software intended to be portable to other systems. +Be warned also that they are considered experimental and changes are possible. +.Pp +.Fn Regfree +frees any dynamically-allocated storage associated with the compiled RE +pointed to by +.Fa preg . +The remaining +.Ft regex_t +is no longer a valid compiled RE +and the effect of supplying it to +.Fn regexec +or +.Fn regerror +is undefined. +.Pp +None of these functions references global variables except for tables +of constants; +all are safe for use from multiple threads if the arguments are safe. +.Sh IMPLEMENTATION CHOICES +There are a number of decisions that +.St -p1003.2 +leaves up to the implementor, +either by explicitly saying +.Dq undefined +or by virtue of them being +forbidden by the RE grammar. +This implementation treats them as follows. +.Pp +See +.Xr re_format 7 +for a discussion of the definition of case-independent matching. +.Pp +There is no particular limit on the length of REs, +except insofar as memory is limited. +Memory usage is approximately linear in RE size, and largely insensitive +to RE complexity, except for bounded repetitions. +See +.Sx BUGS +for one short RE using them +that will run almost any system out of memory. +.Pp +A backslashed character other than one specifically given a magic meaning +by +.St -p1003.2 +(such magic meanings occur only in obsolete +.Bq Dq basic +REs) +is taken as an ordinary character. +.Pp +Any unmatched +.Ql [\& +is a +.Dv REG_EBRACK +error. +.Pp +Equivalence classes cannot begin or end bracket-expression ranges. +The endpoint of one range cannot begin another. +.Pp +.Dv RE_DUP_MAX , +the limit on repetition counts in bounded repetitions, is 255. +.Pp +A repetition operator +.Ql ( ?\& , +.Ql *\& , +.Ql +\& , +or bounds) +cannot follow another +repetition operator. +A repetition operator cannot begin an expression or subexpression +or follow +.Ql ^\& +or +.Ql |\& . +.Pp +.Ql |\& +cannot appear first or last in a (sub)expression or after another +.Ql |\& , +i.e. an operand of +.Ql |\& +cannot be an empty subexpression. +An empty parenthesized subexpression, +.Ql "()" , +is legal and matches an +empty (sub)string. +An empty string is not a legal RE. +.Pp +A +.Ql {\& +followed by a digit is considered the beginning of bounds for a +bounded repetition, which must then follow the syntax for bounds. +A +.Ql {\& +.Em not +followed by a digit is considered an ordinary character. +.Pp +.Ql ^\& +and +.Ql $\& +beginning and ending subexpressions in obsolete +.Pq Dq basic +REs are anchors, not ordinary characters. +.Sh SEE ALSO +.Xr grep 1 , +.Xr re_format 7 +.Pp +.St -p1003.2 , +sections 2.8 (Regular Expression Notation) +and +B.5 (C Binding for Regular Expression Matching). +.Sh DIAGNOSTICS +Non-zero error codes from +.Fn regcomp +and +.Fn regexec +include the following: +.Pp +.Bl -tag -width REG_ECOLLATE -compact +.It Dv REG_NOMATCH +.Fn regexec +failed to match +.It Dv REG_BADPAT +invalid regular expression +.It Dv REG_ECOLLATE +invalid collating element +.It Dv REG_ECTYPE +invalid character class +.It Dv REG_EESCAPE +.Ql \e +applied to unescapable character +.It Dv REG_ESUBREG +invalid backreference number +.It Dv REG_EBRACK +brackets +.Ql "[ ]" +not balanced +.It Dv REG_EPAREN +parentheses +.Ql "( )" +not balanced +.It Dv REG_EBRACE +braces +.Ql "{ }" +not balanced +.It Dv REG_BADBR +invalid repetition count(s) in +.Ql "{ }" +.It Dv REG_ERANGE +invalid character range in +.Ql "[ ]" +.It Dv REG_ESPACE +ran out of memory +.It Dv REG_BADRPT +.Ql ?\& , +.Ql *\& , +or +.Ql +\& +operand invalid +.It Dv REG_EMPTY +empty (sub)expression +.It Dv REG_ASSERT +can't happen - you found a bug +.It Dv REG_INVARG +invalid argument, e.g. negative-length string +.El +.Sh HISTORY +Originally written by +.An Henry Spencer . +Altered for inclusion in the +.Bx 4.4 +distribution. +.Sh BUGS +This is an alpha release with known defects. +Please report problems. +.Pp +The back-reference code is subtle and doubts linger about its correctness +in complex cases. +.Pp +.Fn Regexec +performance is poor. +This will improve with later releases. +.Fa Nmatch +exceeding 0 is expensive; +.Fa nmatch +exceeding 1 is worse. +.Fn Regexec +is largely insensitive to RE complexity +.Em except +that back +references are massively expensive. +RE length does matter; in particular, there is a strong speed bonus +for keeping RE length under about 30 characters, +with most special characters counting roughly double. +.Pp +.Fn Regcomp +implements bounded repetitions by macro expansion, +which is costly in time and space if counts are large +or bounded repetitions are nested. +An RE like, say, +.Ql "((((a{1,100}){1,100}){1,100}){1,100}){1,100}" +will (eventually) run almost any existing machine out of swap space. +.Pp +There are suspected problems with response to obscure error conditions. +Notably, +certain kinds of internal overflow, +produced only by truly enormous REs or by multiply nested bounded repetitions, +are probably not handled well. +.Pp +Due to a mistake in +.St -p1003.2 , +things like +.Ql "a)b" +are legal REs because +.Ql )\& +is +a special character only in the presence of a previous unmatched +.Ql (\& . +This can't be fixed until the spec is fixed. +.Pp +The standard's definition of back references is vague. +For example, does +.Ql "a\e(\e(b\e)*\e2\e)*d" +match +.Ql "abbbd" ? +Until the standard is clarified, +behavior in such cases should not be relied on. +.Pp +The implementation of word-boundary matching is a bit of a kludge, +and bugs may lurk in combinations of word-boundary matching and anchoring. diff --git a/lib/posix/regex2.h b/lib/posix/regex2.h new file mode 100644 index 0000000..595bd89 --- /dev/null +++ b/lib/posix/regex2.h @@ -0,0 +1,173 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regex2.h 8.4 (Berkeley) 3/20/94 + * $FreeBSD: src/lib/libc/regex/regex2.h,v 1.6 2002/03/22 23:41:56 obrien Exp $ + */ + +/* + * First, the stuff that ends up in the outside-world include file + = typedef off_t regoff_t; + = typedef struct { + = int re_magic; + = size_t re_nsub; // number of parenthesized subexpressions + = const char *re_endp; // end pointer for REG_PEND + = struct re_guts *re_g; // none of your business :-) + = } regex_t; + = typedef struct { + = regoff_t rm_so; // start of match + = regoff_t rm_eo; // end of match + = } regmatch_t; + */ +/* + * internals of regex_t + */ +#define MAGIC1 ((('r'^0200)<<8) | 'e') + +/* + * The internal representation is a *strip*, a sequence of + * operators ending with an endmarker. (Some terminology etc. is a + * historical relic of earlier versions which used multiple strips.) + * Certain oddities in the representation are there to permit running + * the machinery backwards; in particular, any deviation from sequential + * flow must be marked at both its source and its destination. Some + * fine points: + * + * - OPLUS_ and O_PLUS are *inside* the loop they create. + * - OQUEST_ and O_QUEST are *outside* the bypass they create. + * - OCH_ and O_CH are *outside* the multi-way branch they create, while + * OOR1 and OOR2 are respectively the end and the beginning of one of + * the branches. Note that there is an implicit OOR2 following OCH_ + * and an implicit OOR1 preceding O_CH. + * + * In state representations, an operator's bit is on to signify a state + * immediately *preceding* "execution" of that operator. + */ +typedef unsigned long sop; /* strip operator */ +typedef long sopno; +#define OPRMASK 0xf8000000L +#define OPDMASK 0x07ffffffL +#define OPSHIFT ((unsigned)27) +#define OP(n) ((n)&OPRMASK) +#define OPND(n) ((n)&OPDMASK) +#define SOP(op, opnd) ((op)|(opnd)) +/* operators meaning operand */ +/* (back, fwd are offsets) */ +#define OEND (1L< uch [csetsize] */ + uch mask; /* bit within array */ + short hash; /* hash code */ + size_t smultis; + char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ +} cset; +/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ +#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (uch)(c)) +#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (uch)(c)) +#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) +#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ +#define MCsub(p, cs, cp) mcsub(p, cs, cp) +#define MCin(p, cs, cp) mcin(p, cs, cp) + +/* stuff for character categories */ +typedef unsigned char cat_t; + +/* + * main compiled-expression structure + */ +struct re_guts { + int magic; +# define MAGIC2 ((('R'^0200)<<8)|'E') + sop *strip; /* malloced area for strip */ + int csetsize; /* number of bits in a cset vector */ + int ncsets; /* number of csets in use */ + cset *sets; /* -> cset [ncsets] */ + uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ + int cflags; /* copy of regcomp() cflags argument */ + sopno nstates; /* = number of sops */ + sopno firststate; /* the initial OEND (normally 0) */ + sopno laststate; /* the final OEND */ + int iflags; /* internal flags */ +# define USEBOL 01 /* used ^ */ +# define USEEOL 02 /* used $ */ +# define BAD 04 /* something wrong */ + int nbol; /* number of ^ used */ + int neol; /* number of $ used */ + int ncategories; /* how many character categories */ + cat_t *categories; /* ->catspace[-CHAR_MIN] */ + char *must; /* match must contain this string */ + int moffset; /* latest point at which must may be located */ + int *charjump; /* Boyer-Moore char jump table */ + int *matchjump; /* Boyer-Moore match jump table */ + int mlen; /* length of must */ + size_t nsub; /* copy of re_nsub */ + int backrefs; /* does it use back references? */ + sopno nplus; /* how deep does it nest +s? */ + /* catspace must be last */ + cat_t catspace[1]; /* actually [NC] */ +}; + +/* misc utilities */ +#define OUT (CHAR_MAX+1) /* a non-character value */ +#define ISWORD(c) (isalnum((uch)(c)) || (c) == '_') diff --git a/lib/posix/regexec.c b/lib/posix/regexec.c new file mode 100644 index 0000000..6e39e9e --- /dev/null +++ b/lib/posix/regexec.c @@ -0,0 +1,184 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regexec.c 8.3 (Berkeley) 3/20/94 + */ + +#ifndef _NO_REGEX + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +/* + * the outer shell of regexec() + * + * This file includes engine.c *twice*, after muchos fiddling with the + * macros that code uses. This lets the same code operate on two different + * representations for state sets. + */ +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +#ifndef NDEBUG +static int nope = 0; /* for use in asserts; shuts lint up */ +#endif + +/* macros for manipulating states, small version */ +#define states long +#define states1 states /* for later use in regexec() decision */ +#define CLEAR(v) ((v) = 0) +#define SET0(v, n) ((v) &= ~((unsigned long)1 << (n))) +#define SET1(v, n) ((v) |= (unsigned long)1 << (n)) +#define ISSET(v, n) (((v) & ((unsigned long)1 << (n))) != 0) +#define ASSIGN(d, s) ((d) = (s)) +#define EQ(a, b) ((a) == (b)) +#define STATEVARS long dummy /* dummy version */ +#define STATESETUP(m, n) /* nothing */ +#define STATETEARDOWN(m) /* nothing */ +#define SETUP(v) ((v) = 0) +#define onestate long +#define INIT(o, n) ((o) = (unsigned long)1 << (n)) +#define INC(o) ((o) <<= 1) +#define ISSTATEIN(v, o) (((v) & (o)) != 0) +/* some abbreviations; note that some of these know variable names! */ +/* do "if I'm here, I can also be there" etc without branches */ +#define FWD(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) << (n)) +#define BACK(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) >> (n)) +#define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0) +/* function names */ +#define SNAMES /* engine.c looks after details */ + +#include "engine.c" + +/* now undo things */ +#undef states +#undef CLEAR +#undef SET0 +#undef SET1 +#undef ISSET +#undef ASSIGN +#undef EQ +#undef STATEVARS +#undef STATESETUP +#undef STATETEARDOWN +#undef SETUP +#undef onestate +#undef INIT +#undef INC +#undef ISSTATEIN +#undef FWD +#undef BACK +#undef ISSETBACK +#undef SNAMES + +/* macros for manipulating states, large version */ +#define states char * +#define CLEAR(v) memset(v, 0, m->g->nstates) +#define SET0(v, n) ((v)[n] = 0) +#define SET1(v, n) ((v)[n] = 1) +#define ISSET(v, n) ((v)[n]) +#define ASSIGN(d, s) memcpy(d, s, m->g->nstates) +#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0) +#define STATEVARS long vn; char *space +#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \ + if ((m)->space == NULL) return(REG_ESPACE); \ + (m)->vn = 0; } +#define STATETEARDOWN(m) { free((m)->space); } +#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates]) +#define onestate long +#define INIT(o, n) ((o) = (n)) +#define INC(o) ((o)++) +#define ISSTATEIN(v, o) ((v)[o]) +/* some abbreviations; note that some of these know variable names! */ +/* do "if I'm here, I can also be there" etc without branches */ +#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here]) +#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) +#define ISSETBACK(v, n) ((v)[here - (n)]) +/* function names */ +#define LNAMES /* flag */ + +#include "engine.c" + +/* + - regexec - interface for matching + = extern int regexec(const regex_t *__restrict, const char *__restrict, + = size_t, regmatch_t [__restrict], int); + = #define REG_NOTBOL 00001 + = #define REG_NOTEOL 00002 + = #define REG_STARTEND 00004 + = #define REG_TRACE 00400 // tracing of execution + = #define REG_LARGE 01000 // force large representation + = #define REG_BACKR 02000 // force use of backref code + * + * We put this here so we can exploit knowledge of the state representation + * when choosing which matcher to call. Also, by this point the matchers + * have been prototyped. + */ +int /* 0 success, REG_NOMATCH failure */ +regexec(preg, string, nmatch, pmatch, eflags) +const regex_t *__restrict preg; +const char *__restrict string; +size_t nmatch; +regmatch_t pmatch[__restrict]; +int eflags; +{ + struct re_guts *g = preg->re_g; +#ifdef REDEBUG +# define GOODFLAGS(f) (f) +#else +# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND)) +#endif + + if (preg->re_magic != MAGIC1 || g->magic != MAGIC2) + return(REG_BADPAT); + assert(!(g->iflags&BAD)); + if (g->iflags&BAD) /* backstop for no-debug case */ + return(REG_BADPAT); + eflags = GOODFLAGS(eflags); + + if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) + return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); + else + return(lmatcher(g, (char *)string, nmatch, pmatch, eflags)); +} + +#endif /* !_NO_REGEX */ diff --git a/lib/posix/regfree.c b/lib/posix/regfree.c new file mode 100644 index 0000000..bed8f91 --- /dev/null +++ b/lib/posix/regfree.c @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regfree.c 8.3 (Berkeley) 3/20/94 + */ + +#ifndef _NO_REGEX + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regfree.c 8.3 (Berkeley) 3/20/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +/* + - regfree - free everything + = extern void regfree(regex_t *); + */ +void +regfree(preg) +regex_t *preg; +{ + struct re_guts *g; + + if (preg->re_magic != MAGIC1) /* oops */ + return; /* nice to complain, but hard */ + + g = preg->re_g; + if (g == NULL || g->magic != MAGIC2) /* oops again */ + return; + preg->re_magic = 0; /* mark it invalid */ + g->magic = 0; /* mark it invalid */ + + if (g->strip != NULL) + free((char *)g->strip); + if (g->sets != NULL) + free((char *)g->sets); + if (g->setbits != NULL) + free((char *)g->setbits); + if (g->must != NULL) + free(g->must); + if (g->charjump != NULL) + free(&g->charjump[CHAR_MIN]); + if (g->matchjump != NULL) + free(g->matchjump); + free((char *)g); +} + +#endif /* !_NO_REGEX */ diff --git a/lib/posix/rewinddir.c b/lib/posix/rewinddir.c new file mode 100644 index 0000000..da5e0de --- /dev/null +++ b/lib/posix/rewinddir.c @@ -0,0 +1,52 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)rewinddir.c 5.1 (Berkeley) 5/25/90"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +void +rewinddir (DIR *dirp) +{ +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#endif + _seekdir((dirp), 0L); +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/rune.h b/lib/posix/rune.h new file mode 100644 index 0000000..888e6fb --- /dev/null +++ b/lib/posix/rune.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Borman at Krystal Technologies. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rune.h 8.1 (Berkeley) 6/27/93 + * $FreeBSD: src/include/rune.h,v 1.2 2002/03/23 17:24:53 imp Exp $ + */ + +#ifndef _RUNE_H_ +#define _RUNE_H_ + +#include "runetype.h" +#include + +#define _PATH_LOCALE "/usr/share/locale" + +#define _INVALID_RUNE _CurrentRuneLocale->invalid_rune + +#define __sgetrune _CurrentRuneLocale->sgetrune +#define __sputrune _CurrentRuneLocale->sputrune + +#define sgetrune(s, n, r) (*__sgetrune)((s), (n), (r)) +#define sputrune(c, s, n, r) (*__sputrune)((c), (s), (n), (r)) + +__BEGIN_DECLS +char *mbrune(const char *, rune_t); +char *mbrrune(const char *, rune_t); +char *mbmb(const char *, char *); +long fgetrune(FILE *); +int fputrune(rune_t, FILE *); +int fungetrune(rune_t, FILE *); +int setrunelocale(char *); +void setinvalidrune(rune_t); +__END_DECLS + +#endif /*! _RUNE_H_ */ diff --git a/lib/posix/runetype.h b/lib/posix/runetype.h new file mode 100644 index 0000000..4562521 --- /dev/null +++ b/lib/posix/runetype.h @@ -0,0 +1,98 @@ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Paul Borman at Krystal Technologies. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)runetype.h 8.1 (Berkeley) 6/2/93 + * $FreeBSD: src/include/runetype.h,v 1.5 2002/03/26 01:35:05 bde Exp $ + */ + +#ifndef _RUNETYPE_H_ +#define _RUNETYPE_H_ + +#include +#include +#include + +#ifdef _BSD_RUNE_T_ +typedef _BSD_RUNE_T_ rune_t; +#undef _BSD_RUNE_T_ +#else +typedef int rune_t; +#endif + +#define _CACHED_RUNES (1 <<8 ) /* Must be a power of 2 */ +#define _CRMASK (~(_CACHED_RUNES - 1)) + +/* + * The lower 8 bits of runetype[] contain the digit value of the rune. + */ +typedef struct { + rune_t min; /* First rune of the range */ + rune_t max; /* Last rune (inclusive) of the range */ + rune_t map; /* What first maps to in maps */ + unsigned long *types; /* Array of types in range */ +} _RuneEntry; + +typedef struct { + int nranges; /* Number of ranges stored */ + _RuneEntry *ranges; /* Pointer to the ranges */ +} _RuneRange; + +typedef struct { + char magic[8]; /* Magic saying what version we are */ + char encoding[32]; /* ASCII name of this encoding */ + + rune_t (*sgetrune)(const char *, size_t, char const **); + int (*sputrune)(rune_t, char *, size_t, char **); + rune_t invalid_rune; + + unsigned long runetype[_CACHED_RUNES]; + rune_t maplower[_CACHED_RUNES]; + rune_t mapupper[_CACHED_RUNES]; + + /* + * The following are to deal with Runes larger than _CACHED_RUNES - 1. + * Their data is actually contiguous with this structure so as to make + * it easier to read/write from/to disk. + */ + _RuneRange runetype_ext; + _RuneRange maplower_ext; + _RuneRange mapupper_ext; + + void *variable; /* Data which depends on the encoding */ + int variable_len; /* how long that data is */ +} _RuneLocale; + +#define _RUNE_MAGIC_1 "RuneMagi" /* Indicates version 0 of RuneLocale */ + +extern _RuneLocale _DefaultRuneLocale; +extern _RuneLocale *_CurrentRuneLocale; + +#endif /* !_RUNETYPE_H_ */ diff --git a/lib/posix/scandir.c b/lib/posix/scandir.c new file mode 100644 index 0000000..7fd0089 --- /dev/null +++ b/lib/posix/scandir.c @@ -0,0 +1,157 @@ +#ifndef HAVE_OPENDIR + +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1983, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__SCCSID("@(#)scandir.c 8.3 (Berkeley) 1/2/94"); +__FBSDID("$FreeBSD: head/lib/libc/gen/scandir.c 335898 2018-07-03 17:31:45Z jhb $"); + +/* + * Scan the directory dirname calling select to make a list of selected + * directory entries then sort using qsort and compare routine dcomp. + * Returns the number of entries and a pointer to a list of pointers to + * struct dirent (through namelist). Returns -1 if there were any errors. + */ + +#include +#include +#include +#include +#include + +/* + * The DIRSIZ macro gives the minimum record length which will hold + * the directory entry. This requires the amount of space in struct dirent + * without the d_name field, plus enough space for the name with a terminating + * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary. + */ +#undef DIRSIZ +#ifdef _DIRENT_HAVE_D_NAMLEN +#define DIRSIZ(dp) \ + (offsetof (struct dirent, d_name) + (((dp)->d_namlen+1 + 3) &~ 3)) +#else +#define DIRSIZ(dp) \ + (offsetof (struct dirent, d_name) + ((strlen((dp)->d_name)+1 + 3) &~ 3)) +#endif + + +int +scandir(const char *dirname, struct dirent ***namelist, + int (*select)(const struct dirent *), int (*dcomp)(const struct dirent **, + const struct dirent **)) +{ + register struct dirent *d, *p, **names = NULL; + register size_t arraysz, numitems; + DIR *dirp; + + if ((dirp = opendir(dirname)) == NULL) + return(-1); +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#endif + + numitems = 0; + arraysz = 32; /* initial estimate of the array size */ + names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *)); + if (names == NULL) + goto fail; + + while ((d = readdir(dirp)) != NULL) { + if (select != NULL && !(*select)(d)) + continue; /* just selected names */ + /* + * Make a minimum size copy of the data + */ + p = (struct dirent *)malloc(DIRSIZ(d)); + if (p == NULL) + goto fail; + p->d_ino = d->d_ino; +#ifdef DT_UNKNOWN + p->d_type = d->d_type; +#endif + p->d_reclen = d->d_reclen; +#ifdef _DIRENT_HAVE_D_NAMLEN + p->d_namlen = d->d_namlen; + bcopy(d->d_name, p->d_name, p->d_namlen + 1); +#else + strcpy(p->d_name, d->d_name); +#endif + /* + * Check to make sure the array has space left and + * realloc the maximum size. + */ + if (numitems >= arraysz) { + struct dirent **names2; + + names2 = reallocarray(names, arraysz, + 2 * sizeof(struct dirent *)); + if (names2 == NULL) { + free(p); + goto fail; + } + names = names2; + arraysz *= 2; + } + names[numitems++] = p; + } + closedir(dirp); + if (numitems && dcomp != NULL) + qsort(names, numitems, sizeof(struct dirent *), (void *)dcomp); + *namelist = names; +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + return (numitems); + +fail: + while (numitems > 0) + free(names[--numitems]); + free(names); + closedir(dirp); +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif + return (-1); +} + +/* + * Alphabetic order comparison routine for those who want it. + * POSIX 2008 requires that alphasort() uses strcoll(). + */ +int +alphasort(const struct dirent **d1, const struct dirent **d2) +{ + + return (strcoll((*d1)->d_name, (*d2)->d_name)); +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/seekdir.c b/lib/posix/seekdir.c new file mode 100644 index 0000000..cb47bb1 --- /dev/null +++ b/lib/posix/seekdir.c @@ -0,0 +1,57 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)seekdir.c 5.7 (Berkeley) 6/1/90"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +/* + * Seek to an entry in a directory. + * _seekdir is in telldir.c so that it can share opaque data structures. + */ +void +seekdir (DIR *dirp, + long loc) +{ +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#endif + _seekdir(dirp, loc); +#ifdef HAVE_DD_LOCK + __lock_release_recursive(dirp->dd_lock); +#endif +} + +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/sleep.c b/lib/posix/sleep.c new file mode 100644 index 0000000..0d6cd71 --- /dev/null +++ b/lib/posix/sleep.c @@ -0,0 +1,23 @@ +/* libc/posix/sleep.c - sleep function */ + +/* Written 2000 by Werner Almesberger */ + +#ifdef HAVE_NANOSLEEP + +#include +#include +#include +#include + +unsigned sleep(unsigned seconds) +{ + struct timespec ts; + + ts.tv_sec = seconds; + ts.tv_nsec = 0; + if (!nanosleep(&ts,&ts)) return 0; + if (errno == EINTR) return ts.tv_sec & UINT_MAX; + return -1; +} + +#endif diff --git a/lib/posix/sysexits.h b/lib/posix/sysexits.h new file mode 100644 index 0000000..37246b6 --- /dev/null +++ b/lib/posix/sysexits.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sysexits.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _SYSEXITS_H +#define _SYSEXITS_H 1 + +/* + * SYSEXITS.H -- Exit status codes for system programs. + * + * This include file attempts to categorize possible error + * exit statuses for system programs, notably delivermail + * and the Berkeley network. + * + * Error numbers begin at EX__BASE to reduce the possibility of + * clashing with other exit statuses that random programs may + * already return. The meaning of the codes is approximately + * as follows: + * + * EX_USAGE -- The command was used incorrectly, e.g., with + * the wrong number of arguments, a bad flag, a bad + * syntax in a parameter, or whatever. + * EX_DATAERR -- The input data was incorrect in some way. + * This should only be used for user's data & not + * system files. + * EX_NOINPUT -- An input file (not a system file) did not + * exist or was not readable. This could also include + * errors like "No message" to a mailer (if it cared + * to catch it). + * EX_NOUSER -- The user specified did not exist. This might + * be used for mail addresses or remote logins. + * EX_NOHOST -- The host specified did not exist. This is used + * in mail addresses or network requests. + * EX_UNAVAILABLE -- A service is unavailable. This can occur + * if a support program or file does not exist. This + * can also be used as a catchall message when something + * you wanted to do doesn't work, but you don't know + * why. + * EX_SOFTWARE -- An internal software error has been detected. + * This should be limited to non-operating system related + * errors as possible. + * EX_OSERR -- An operating system error has been detected. + * This is intended to be used for such things as "cannot + * fork", "cannot create pipe", or the like. It includes + * things like getuid returning a user that does not + * exist in the passwd file. + * EX_OSFILE -- Some system file (e.g., /etc/passwd, /etc/utmp, + * etc.) does not exist, cannot be opened, or has some + * sort of error (e.g., syntax error). + * EX_CANTCREAT -- A (user specified) output file cannot be + * created. + * EX_IOERR -- An error occurred while doing I/O on some file. + * EX_TEMPFAIL -- temporary failure, indicating something that + * is not really an error. In sendmail, this means + * that a mailer (e.g.) could not create a connection, + * and the request should be reattempted later. + * EX_PROTOCOL -- the remote system returned something that + * was "not possible" during a protocol exchange. + * EX_NOPERM -- You did not have sufficient permission to + * perform the operation. This is not intended for + * file system problems, which should use NOINPUT or + * CANTCREAT, but rather for higher level permissions. + */ + +#define EX_OK 0 /* successful termination */ + +#define EX__BASE 64 /* base value for error messages */ + +#define EX_USAGE 64 /* command line usage error */ +#define EX_DATAERR 65 /* data format error */ +#define EX_NOINPUT 66 /* cannot open input */ +#define EX_NOUSER 67 /* addressee unknown */ +#define EX_NOHOST 68 /* host name unknown */ +#define EX_UNAVAILABLE 69 /* service unavailable */ +#define EX_SOFTWARE 70 /* internal software error */ +#define EX_OSERR 71 /* system error (e.g., can't fork) */ +#define EX_OSFILE 72 /* critical OS file missing */ +#define EX_CANTCREAT 73 /* can't create (user) output file */ +#define EX_IOERR 74 /* input/output error */ +#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */ +#define EX_PROTOCOL 76 /* remote error in protocol */ +#define EX_NOPERM 77 /* permission denied */ +#define EX_CONFIG 78 /* configuration error */ + +#define EX__MAX 78 /* maximum listed value */ + +#endif /* sysexits.h */ diff --git a/lib/posix/telldir.c b/lib/posix/telldir.c new file mode 100644 index 0000000..beac537 --- /dev/null +++ b/lib/posix/telldir.c @@ -0,0 +1,204 @@ +#ifndef HAVE_OPENDIR + +/* + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)telldir.c 5.9 (Berkeley) 2/23/91"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include + +/* + * The option SINGLEUSE may be defined to say that a telldir + * cookie may be used only once before it is freed. This option + * is used to avoid having memory usage grow without bound. + */ +#define SINGLEUSE + +/* + * One of these structures is malloced to describe the current directory + * position each time telldir is called. It records the current magic + * cookie returned by getdirentries and the offset within the buffer + * associated with that return value. + */ +struct ddloc { + struct ddloc *loc_next;/* next structure in list */ + long loc_index; /* key associated with structure */ + long loc_seek; /* magic cookie returned by getdirentries */ + long loc_loc; /* offset of entry in buffer */ + DIR *loc_dirp; /* DIR pointer */ +}; + +#define NDIRHASH 32 /* Num of hash lists, must be a power of 2 */ +#define LOCHASH(i) ((i)&(NDIRHASH-1)) + +static long dd_loccnt = 1; /* Index of entry for sequential readdir's */ +static struct ddloc *dd_hash[NDIRHASH]; /* Hash list heads for ddlocs */ + +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) +__LOCK_INIT(static, __dd_hash_mutex); +#endif + +/* + * return a pointer into a directory + */ + +#if !defined(_ELIX_LEVEL) || (_ELIX_LEVEL >= 2) + +long +telldir (DIR *dirp) +{ + register int index; + register struct ddloc *lp; + + if ((lp = (struct ddloc *)malloc(sizeof(struct ddloc))) == NULL) + return (-1); + +#ifdef HAVE_DD_LOCK + __lock_acquire_recursive(dirp->dd_lock); +#ifndef __SINGLE_THREAD__ + __lock_acquire(__dd_hash_mutex); +#endif +#endif + index = dd_loccnt++; + lp->loc_index = index; + lp->loc_seek = dirp->dd_seek; + lp->loc_loc = dirp->dd_loc; + lp->loc_dirp = dirp; + lp->loc_next = dd_hash[LOCHASH(index)]; + dd_hash[LOCHASH(index)] = lp; +#ifdef HAVE_DD_LOCK +#ifndef __SINGLE_THREAD__ + __lock_release(__dd_hash_mutex); +#endif + __lock_release_recursive(dirp->dd_lock); +#endif + return (index); +} + +#endif /* !_ELIX_LEVEL || _ELIX_LEVEL >= 2 */ + +/* + * seek to an entry in a directory. + * Only values returned by "telldir" should be passed to seekdir. + */ +void +_seekdir (register DIR *dirp, + long loc) +{ + register struct ddloc *lp; + register struct ddloc **prevlp; + struct dirent *dp; + +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) + __lock_acquire(__dd_hash_mutex); +#endif + if (loc != 0) { + prevlp = &dd_hash[LOCHASH(loc)]; + lp = *prevlp; + while (lp != NULL) { + if (lp->loc_index == loc) + break; + prevlp = &lp->loc_next; + lp = lp->loc_next; + } + if (lp == NULL) { +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) + __lock_release(__dd_hash_mutex); +#endif + return; + } + if (lp->loc_loc == dirp->dd_loc && lp->loc_seek == dirp->dd_seek) + goto found; + (void) lseek(dirp->dd_fd, lp->loc_seek, 0); + dirp->dd_seek = lp->loc_seek; + dirp->dd_loc = 0; + while (dirp->dd_loc < lp->loc_loc) { + dp = readdir(dirp); + if (dp == NULL) + break; + } +found: +#ifdef SINGLEUSE + *prevlp = lp->loc_next; + free((caddr_t)lp); +#endif + } else { + // loc 0 means rewinding + (void) lseek(dirp->dd_fd, 0, 0); + dirp->dd_seek = 0; + dirp->dd_loc = 0; + } +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) + __lock_release(__dd_hash_mutex); +#endif +} + +/* clean out any hash entries from a closed directory */ +void +_cleanupdir (register DIR *dirp) +{ + int i; + +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) + __lock_acquire(__dd_hash_mutex); +#endif + for (i = 0; i < NDIRHASH; ++i) { + struct ddloc head; + register struct ddloc *lp; + register struct ddloc *prevlp; + + lp = dd_hash[i]; + head.loc_next = lp; + prevlp = &head; + while (lp != NULL) { + struct ddloc *nextlp; + + nextlp = lp->loc_next; + if (lp->loc_dirp == dirp) { + prevlp->loc_next = nextlp; + free((caddr_t)lp); + } + else + prevlp = lp; + lp = nextlp; + } + dd_hash[i] = head.loc_next; + } +#if !defined(__SINGLE_THREAD__) && defined(HAVE_DD_LOCK) + __lock_release(__dd_hash_mutex); +#endif + +} +#endif /* ! HAVE_OPENDIR */ diff --git a/lib/posix/un-namespace.h b/lib/posix/un-namespace.h new file mode 100644 index 0000000..01d9b8f --- /dev/null +++ b/lib/posix/un-namespace.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2001 Daniel Eischen . + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/lib/libc/include/un-namespace.h,v 1.7 2002/03/29 22:43:42 markm Exp $ + */ + +#ifndef _UN_NAMESPACE_H_ +#define _UN_NAMESPACE_H_ + +#undef accept +#undef __acl_aclcheck_fd +#undef __acl_delete_fd +#undef __acl_get_fd +#undef __acl_set_fd +#undef bind +#undef __cap_get_fd +#undef __cap_set_fd +#undef close +#undef connect +#undef dup +#undef dup2 +#undef execve +#undef fcntl +#undef flock +#undef fstat +#undef fstatfs +#undef fsync +#undef getdirentries +#undef getlogin +#undef getpeername +#undef getprogname +#undef getsockname +#undef getsockopt +#undef ioctl +#undef kevent +#undef listen +#undef nanosleep +#undef open +#undef pthread_getspecific +#undef pthread_key_create +#undef pthread_key_delete +#undef pthread_mutex_destroy +#undef pthread_mutex_init +#undef pthread_mutex_lock +#undef pthread_mutex_trylock +#undef pthread_mutex_unlock +#undef pthread_mutexattr_init +#undef pthread_mutexattr_destroy +#undef pthread_mutexattr_settype +#undef pthread_once +#undef pthread_self +#undef pthread_setspecific +#undef read +#undef readv +#undef recvfrom +#undef recvmsg +#undef select +#undef sendmsg +#undef sendto +#undef setsockopt +#undef sigaction +#undef sigprocmask +#undef sigsuspend +#undef socket +#undef socketpair +#undef wait4 +#undef write +#undef writev + +#if 0 +#undef creat +#undef fchflags +#undef fchmod +#undef fpathconf +#undef msync +#undef nfssvc +#undef pause +#undef poll +#undef pthread_rwlock_destroy +#undef pthread_rwlock_init +#undef pthread_rwlock_rdlock +#undef pthread_rwlock_tryrdlock +#undef pthread_rwlock_trywrlock +#undef pthread_rwlock_unlock +#undef pthread_rwlock_wrlock +#undef pthread_rwlockattr_init +#undef pthread_rwlockattr_destroy +#undef sched_yield +#undef sendfile +#undef shutdown +#undef sigaltstack +#undef sigpending +#undef sigreturn +#undef sigsetmask +#undef sleep +#undef system +#undef tcdrain +#undef wait +#undef waitpid +#endif /* 0 */ + +#ifdef _SIGNAL_H_ +int _sigaction(int, const struct sigaction *, struct sigaction *); +#endif + +#ifdef _SYS_EVENT_H_ +int _kevent(int, const struct kevent *, int, struct kevent *, + int, const struct timespec *); +#endif + +#ifdef _SYS_FCNTL_H_ +int _flock(int, int); +#endif + +#undef err +#undef warn + +#endif /* _UN_NAMESPACE_H_ */ diff --git a/lib/posix/usleep.c b/lib/posix/usleep.c new file mode 100644 index 0000000..cc1b314 --- /dev/null +++ b/lib/posix/usleep.c @@ -0,0 +1,21 @@ +/* libc/posix/usleep.c - usleep function */ + +/* Written 2002 by Jeff Johnston */ + +#ifdef HAVE_NANOSLEEP + +#include +#include +#include + +int usleep(useconds_t useconds) +{ + struct timespec ts; + + ts.tv_sec = (long int)useconds / 1000000; + ts.tv_nsec = ((long int)useconds % 1000000) * 1000; + if (!nanosleep(&ts,&ts)) return 0; + return -1; +} + +#endif diff --git a/lib/posix/utils.h b/lib/posix/utils.h new file mode 100644 index 0000000..e4499b3 --- /dev/null +++ b/lib/posix/utils.h @@ -0,0 +1,54 @@ +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)utils.h 8.3 (Berkeley) 3/20/94 + * $FreeBSD: src/lib/libc/regex/utils.h,v 1.2 2002/03/22 23:41:56 obrien Exp $ + */ + +/* utility definitions */ +#define DUPMAX _POSIX2_RE_DUP_MAX /* xxx is this right? */ +#define INFINITY (DUPMAX + 1) +#define NC (CHAR_MAX - CHAR_MIN + 1) +typedef unsigned char uch; + +/* switch off assertions (if not already off) if no REDEBUG */ +#ifndef REDEBUG +#ifndef NDEBUG +#define NDEBUG /* no assertions please */ +#endif +#endif +#include + +/* for old systems with bcopy() but no memmove() */ +#ifdef USEBCOPY +#define memmove(d, s, c) bcopy(s, d, c) +#endif diff --git a/lib/posix/wordexp.c b/lib/posix/wordexp.c new file mode 100644 index 0000000..dcda3d2 --- /dev/null +++ b/lib/posix/wordexp.c @@ -0,0 +1,243 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +#ifndef _NO_WORDEXP + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "wordexp2.h" + +#define MAXLINELEN 500 + +/* Note: This implementation of wordexp requires a version of bash + that supports the --wordexp and --protected arguments to be present + on the system. It does not support the WRDE_UNDEF flag. */ +int +wordexp(const char *__restrict words, wordexp_t *__restrict pwordexp, int flags) +{ + FILE *f = NULL; + FILE *f_err = NULL; + char tmp[MAXLINELEN]; + int i = 0; + int offs = 0; + char *iter; + pid_t pid; + int num_words = 0; + int num_bytes = 0; + int fd[2]; + int fd_err[2]; + int err = WRDE_NOSPACE; + ext_wordv_t *wordv = NULL; + char *eword; + struct ewords_entry *entry; + + if (pwordexp == NULL) + { + return WRDE_NOSPACE; + } + + if (flags & WRDE_REUSE) + wordfree(pwordexp); + + if ((flags & WRDE_APPEND) == 0) + { + pwordexp->we_wordc = 0; + pwordexp->we_wordv = NULL; + } + + if (flags & WRDE_DOOFFS) + { + offs = pwordexp->we_offs; + + if (pwordexp->we_wordv) + wordv = WE_WORDV_TO_EXT_WORDV(pwordexp->we_wordv); + wordv = (ext_wordv_t *)realloc(wordv, sizeof(ext_wordv_t) + (offs + pwordexp->we_wordc) * sizeof(char *)); + if (!wordv) + return err; + if (!pwordexp->we_wordv) + SLIST_INIT(&wordv->list); + pwordexp->we_wordv = wordv->we_wordv; + + for (i = 0; i < offs; i++) + pwordexp->we_wordv[i] = NULL; + } + + if (pipe(fd)) + return err; + if (pipe(fd_err)) + { + close(fd[0]); + close(fd[1]); + return err; + } + pid = fork(); + + if (pid == -1) + { + /* In "parent" process, but fork failed */ + close(fd_err[0]); + close(fd_err[1]); + close(fd[0]); + close(fd[1]); + return err; + } + else if (pid > 0) + { + /* In parent process. */ + + /* Close write end of parent's pipe. */ + close(fd[1]); + close(fd_err[1]); + + /* f_err is the standard error from the shell command. */ + if (!(f_err = fdopen(fd_err[0], "r"))) + goto cleanup; + + /* Check for errors. */ + if (fgets(tmp, MAXLINELEN, f_err)) + { + if (strstr(tmp, "EOF")) + err = WRDE_SYNTAX; + else if (strstr(tmp, "`\n'") || strstr(tmp, "`|'") + || strstr(tmp, "`&'") || strstr(tmp, "`;'") + || strstr(tmp, "`<'") || strstr(tmp, "`>'") + || strstr(tmp, "`('") || strstr(tmp, "`)'") + || strstr(tmp, "`{'") || strstr(tmp, "`}'")) + err = WRDE_BADCHAR; + else if (strstr(tmp, "command substitution")) + err = WRDE_CMDSUB; + else + err = WRDE_SYNTAX; + + if (flags & WRDE_SHOWERR) + { + fputs(tmp, stderr); + while(fgets(tmp, MAXLINELEN, f_err)) + fputs(tmp, stderr); + } + + goto cleanup; + } + + /* f is the standard output from the shell command. */ + if (!(f = fdopen(fd[0], "r"))) + goto cleanup; + + /* Get number of words expanded by shell. */ + if (!fgets(tmp, MAXLINELEN, f)) + goto cleanup; + + if((iter = strchr(tmp, '\n'))) + *iter = '\0'; + + num_words = atoi(tmp); + + if (pwordexp->we_wordv) + wordv = WE_WORDV_TO_EXT_WORDV(pwordexp->we_wordv); + wordv = (ext_wordv_t *)realloc(wordv, sizeof(ext_wordv_t) + (offs + pwordexp->we_wordc + num_words) * sizeof(char *)); + if (!wordv) + return err; + if (!pwordexp->we_wordv) + SLIST_INIT(&wordv->list); + pwordexp->we_wordv = wordv->we_wordv; + + /* Get number of bytes required for storage of all num_words words. */ + if (!fgets(tmp, MAXLINELEN, f)) + goto cleanup; + + if((iter = strchr(tmp, '\n'))) + *iter = '\0'; + + num_bytes = atoi(tmp); + + if (!(entry = (struct ewords_entry *)malloc(sizeof(struct ewords_entry) + num_bytes + num_words))) + goto cleanup; + SLIST_INSERT_HEAD(&wordv->list, entry, next); + + /* Get expansion from the shell output. */ + if (!fread(entry->ewords, 1, num_bytes + num_words, f)) + goto cleanup; + entry->ewords[num_bytes + num_words] = 0; + + /* Store each entry in pwordexp's we_wordv vector. */ + eword = entry->ewords; + for(i = 0; i < num_words; i++, eword = iter) + { + if (!eword) + break; + pwordexp->we_wordv[offs + pwordexp->we_wordc + i] = eword; + if ((iter = strchr(eword, '\n'))) + *iter++ = '\0'; + } + + pwordexp->we_wordv[offs + pwordexp->we_wordc + i] = NULL; + pwordexp->we_wordc += num_words; + if (i == num_words) + err = WRDE_SUCCESS; + +cleanup: + if (f) + fclose(f); + else + close(fd[0]); + if (f_err) + fclose(f_err); + else + close(fd_err[0]); + + /* Wait for child to finish. */ + waitpid (pid, NULL, 0); + + return err; + } + else + { + /* In child process. */ + + /* Close read end of child's pipe. */ + close(fd[0]); + close(fd_err[0]); + + /* Pipe standard output to parent process via fd. */ + if (fd[1] != STDOUT_FILENO) + { + if (dup2(fd[1], STDOUT_FILENO) == -1) + _exit(EXIT_FAILURE); + /* fd[1] no longer required. */ + close(fd[1]); + } + + /* Pipe standard error to parent process via fd_err. */ + if (fd_err[1] != STDERR_FILENO) + { + if (dup2(fd_err[1], STDERR_FILENO) == -1) + _exit(EXIT_FAILURE); + /* fd_err[1] no longer required. */ + close(fd_err[1]); + } + + if (flags & WRDE_NOCMD) + execl("/bin/bash", "bash", "--protected", "--wordexp", words, (char *)0); + else + execl("/bin/bash", "bash", "--wordexp", words, (char *)0); + _exit(EXIT_FAILURE); + } + return WRDE_SUCCESS; +} +#endif /* !_NO_WORDEXP */ diff --git a/lib/posix/wordexp2.h b/lib/posix/wordexp2.h new file mode 100644 index 0000000..2030832 --- /dev/null +++ b/lib/posix/wordexp2.h @@ -0,0 +1,21 @@ +/* Copyright (C) 2012 by Peter Rosin. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +#ifndef _WORDEXP2_H_ + +struct ewords_entry { + SLIST_ENTRY(ewords_entry) next; + char ewords[1]; +}; + +typedef struct { + SLIST_HEAD(ewords_head, ewords_entry) list; + char *we_wordv[1]; +} ext_wordv_t; + +#define WE_WORDV_TO_EXT_WORDV(wordv) \ + (ext_wordv_t *)((void *)(wordv) - offsetof(ext_wordv_t, we_wordv)) + +#endif /* !_WORDEXP2_H_ */ diff --git a/lib/posix/wordfree.c b/lib/posix/wordfree.c new file mode 100644 index 0000000..024a619 --- /dev/null +++ b/lib/posix/wordfree.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +#ifndef _NO_WORDEXP + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "wordexp2.h" + +void +wordfree(wordexp_t *pwordexp) +{ + ext_wordv_t *wordv; + + if (pwordexp == NULL) + return; + + if (pwordexp->we_wordv == NULL) + return; + + wordv = WE_WORDV_TO_EXT_WORDV(pwordexp->we_wordv); + while (!SLIST_EMPTY(&wordv->list)) { + struct ewords_entry *entry = SLIST_FIRST(&wordv->list); + SLIST_REMOVE_HEAD(&wordv->list, next); + free(entry); + } + + free(wordv); + pwordexp->we_wordv = NULL; +} + +#endif /* !_NO_WORDEXP */ diff --git a/lib/reent/Makefile.inc b/lib/reent/Makefile.inc new file mode 100644 index 0000000..38ddf57 --- /dev/null +++ b/lib/reent/Makefile.inc @@ -0,0 +1,67 @@ +libc_a_SOURCES += \ + %D%/closer.c \ + %D%/reent.c \ + %D%/impure.c \ + %D%/fcntlr.c \ + %D%/fstatr.c \ + %D%/getreent.c \ + %D%/gettimeofdayr.c \ + %D%/isattyr.c \ + %D%/linkr.c \ + %D%/lseekr.c \ + %D%/mkdirr.c \ + %D%/openr.c \ + %D%/readr.c \ + %D%/renamer.c \ + %D%/signalr.c \ + %D%/sbrkr.c \ + %D%/statr.c \ + %D%/timesr.c \ + %D%/unlinkr.c \ + %D%/writer.c + +%C%_ELIX_2_SOURCES = +if HAVE_STDIO64_DIR +%C%_ELIX_2_SOURCES += \ + %D%/fstat64r.c \ + %D%/lseek64r.c \ + %D%/stat64r.c \ + %D%/open64r.c +endif +%C%_ELIX_3_SOURCES = %D%/execr.c + +if ELIX_LEVEL_1 +libc_a_SOURCES += +else +if ELIX_LEVEL_2 +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) +else +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_3_SOURCES) +endif +endif + +LIBC_CHEWOUT_FILES += \ + %D%/closer.def \ + %D%/reent.def \ + %D%/execr.def \ + %D%/fcntlr.def \ + %D%/fstatr.def \ + %D%/gettimeofdayr.def \ + %D%/linkr.def \ + %D%/lseekr.def \ + %D%/mkdirr.def \ + %D%/openr.def \ + %D%/readr.def \ + %D%/renamer.def \ + %D%/signalr.def \ + %D%/sbrkr.def \ + %D%/statr.def \ + %D%/timesr.def \ + %D%/unlinkr.def \ + %D%/fstat64r.def \ + %D%/lseek64r.def \ + %D%/stat64r.def \ + %D%/open64r.def \ + %D%/writer.def + +LIBC_CHAPTERS += %D%/reent.tex diff --git a/lib/reent/closer.c b/lib/reent/closer.c new file mode 100644 index 0000000..2d72b2a --- /dev/null +++ b/lib/reent/closer.c @@ -0,0 +1,52 @@ +/* Reentrant version of close system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_close_r>>---Reentrant version of close + +INDEX + _close_r + +SYNOPSIS + #include + int _close_r(struct _reent *<[ptr]>, int <[fd]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_close_r (ptr, fd) + struct _reent *ptr; + int fd; +{ + int ret; + + errno = 0; + if ((ret = _close (fd)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/execr.c b/lib/reent/execr.c new file mode 100644 index 0000000..541fb86 --- /dev/null +++ b/lib/reent/execr.c @@ -0,0 +1,125 @@ +/* Reentrant versions of execution system calls. These + implementations just call the usual system calls. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +/* If NO_EXEC is defined, we don't need these functions. */ + +#if defined (REENTRANT_SYSCALLS_PROVIDED) || defined (NO_EXEC) + +int _dummy_exec_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_execve_r>>---Reentrant version of execve +INDEX + _execve_r + +SYNOPSIS + #include + int _execve_r(struct _reent *<[ptr]>, const char *<[name]>, + char *const <[argv]>[], char *const <[env]>[]); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_execve_r (struct _reent *ptr, + const char *name, + char *const argv[], + char *const env[]) +{ + int ret; + + errno = 0; + if ((ret = _execve (name, argv, env)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + + +/* +NEWPAGE +FUNCTION + <<_fork_r>>---Reentrant version of fork + +INDEX + _fork_r + +SYNOPSIS + #include + int _fork_r(struct _reent *<[ptr]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +#ifndef NO_FORK + +int +_fork_r (struct _reent *ptr) +{ + int ret; + + errno = 0; + if ((ret = _fork ()) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif + +/* +NEWPAGE +FUNCTION + <<_wait_r>>---Reentrant version of wait + +INDEX + _wait_r + +SYNOPSIS + #include + int _wait_r(struct _reent *<[ptr]>, int *<[status]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_wait_r (struct _reent *ptr, + int *status) +{ + int ret; + + errno = 0; + if ((ret = _wait (status)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/fcntlr.c b/lib/reent/fcntlr.c new file mode 100644 index 0000000..f60aa09 --- /dev/null +++ b/lib/reent/fcntlr.c @@ -0,0 +1,56 @@ +/* Reentrant versions of fcntl system call. This implementation just + calls the fcntl system call. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_fcntl_r>>---Reentrant version of fcntl + +INDEX + _fcntl_r + +SYNOPSIS + #include + int _fcntl_r(struct _reent *<[ptr]>, + int <[fd]>, int <[cmd]>, <[arg]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_fcntl_r (struct _reent *ptr, + int fd, + int cmd, + int arg) +{ + int ret; + + errno = 0; + if ((ret = _fcntl (fd, cmd, arg)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/fstat64r.c b/lib/reent/fstat64r.c new file mode 100644 index 0000000..a049206 --- /dev/null +++ b/lib/reent/fstat64r.c @@ -0,0 +1,64 @@ +/* Reentrant versions of fstat system call. This implementation just + calls the fstat system call. */ + +#include +#include +#include +#include <_syslist.h> + +#ifdef __LARGE64_FILES + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_fstat_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_fstat64_r>>---Reentrant version of fstat64 + +INDEX + _fstat64_r + +SYNOPSIS + #include + int _fstat64_r(struct _reent *<[ptr]>, + int <[fd]>, struct stat64 *<[pstat]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. This function is only enabled on systems + that define __LARGE64_FILES. +*/ + +int +_fstat64_r (struct _reent *ptr, + int fd, + struct stat64 *pstat) +{ + int ret; + + errno = 0; + if ((ret = _fstat64 (fd, pstat)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/reent/fstatr.c b/lib/reent/fstatr.c new file mode 100644 index 0000000..9a02e9a --- /dev/null +++ b/lib/reent/fstatr.c @@ -0,0 +1,60 @@ +/* Reentrant versions of fstat system call. This implementation just + calls the fstat system call. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_fstat_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_fstat_r>>---Reentrant version of fstat + +INDEX + _fstat_r + +SYNOPSIS + #include + int _fstat_r(struct _reent *<[ptr]>, + int <[fd]>, struct stat *<[pstat]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_fstat_r (ptr, fd, pstat) + struct _reent *ptr; + int fd; + struct stat *pstat; +{ + int ret; + + errno = 0; + if ((ret = _fstat (fd, pstat)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/getreent.c b/lib/reent/getreent.c new file mode 100644 index 0000000..5fa98e9 --- /dev/null +++ b/lib/reent/getreent.c @@ -0,0 +1,22 @@ +/* default reentrant pointer when multithread enabled */ + +#ifdef GETREENT_PROVIDED + +int _dummy_getreent; + +#else + +#include <_ansi.h> +#include + +#ifdef __getreent +#undef __getreent +#endif + +struct _reent * +__getreent (void) +{ + return _impure_ptr; +} + +#endif diff --git a/lib/reent/gettimeofdayr.c b/lib/reent/gettimeofdayr.c new file mode 100644 index 0000000..aa60e5e --- /dev/null +++ b/lib/reent/gettimeofdayr.c @@ -0,0 +1,67 @@ +/* Reentrant version of gettimeofday system call + This implementation just calls the times/gettimeofday system calls. + Gettimeofday may not be available on all targets. It's presence + here is dubious. Consider it for internal use only. */ + +#include +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_gettimeofday_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_gettimeofday_r>>---Reentrant version of gettimeofday + +INDEX + _gettimeofday_r + +SYNOPSIS + #include + #include + int _gettimeofday_r(struct _reent *<[ptr]>, + struct timeval *<[ptimeval]>, + void *<[ptimezone]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. + + This function is only available for a few targets. + Check libc.a to see if its available on yours. +*/ + +int +_gettimeofday_r (struct _reent *ptr, + struct timeval *ptimeval, + void *ptimezone) +{ + int ret; + + errno = 0; + if ((ret = _gettimeofday (ptimeval, ptimezone)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/impure.c b/lib/reent/impure.c new file mode 100644 index 0000000..a87b91f --- /dev/null +++ b/lib/reent/impure.c @@ -0,0 +1,20 @@ +#include + +#ifndef _REENT_THREAD_LOCAL + +/* Redeclare these symbols locally as weak so that the file containing + their definitions (along with a lot of other stuff) isn't sucked in + unless they are actually used by other compilation units. This is + important to reduce image size for targets with very small amounts + of memory. */ +#ifdef _REENT_SMALL +extern __FILE __sf[3] _ATTRIBUTE ((weak)); +#endif + +struct _reent __ATTRIBUTE_IMPURE_DATA__ _impure_data = _REENT_INIT (_impure_data); +#ifdef __CYGWIN__ +extern struct _reent reent_data __attribute__ ((alias("_impure_data"))); +#endif +struct _reent *__ATTRIBUTE_IMPURE_PTR__ _impure_ptr = &_impure_data; + +#endif /* _REENT_THREAD_LOCAL */ diff --git a/lib/reent/isattyr.c b/lib/reent/isattyr.c new file mode 100644 index 0000000..f769455 --- /dev/null +++ b/lib/reent/isattyr.c @@ -0,0 +1,57 @@ +/* Reentrant versions of isatty system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_isatty_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_isatty_r>>---Reentrant version of isatty + +INDEX + _isatty_r + +SYNOPSIS + #include + int _isatty_r(struct _reent *<[ptr]>, + int <[fd]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_isatty_r (ptr, fd) + struct _reent *ptr; + int fd; +{ + int ret; + + errno = 0; + if ((ret = _isatty (fd)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/linkr.c b/lib/reent/linkr.c new file mode 100644 index 0000000..169b6ee --- /dev/null +++ b/lib/reent/linkr.c @@ -0,0 +1,58 @@ +/* Reentrant versions of file system calls. These implementations + just call the usual system calls. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_link_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_link_r>>---Reentrant version of link + +INDEX + _link_r + +SYNOPSIS + #include + int _link_r(struct _reent *<[ptr]>, + const char *<[old]>, const char *<[new]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_link_r (struct _reent *ptr, + const char *old, + const char *new) +{ + int ret; + + errno = 0; + if ((ret = _link (old, new)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/lseek64r.c b/lib/reent/lseek64r.c new file mode 100644 index 0000000..c9afd01 --- /dev/null +++ b/lib/reent/lseek64r.c @@ -0,0 +1,59 @@ +/* Reentrant versions of lseek system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef __LARGE64_FILES + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_lseek64_r>>---Reentrant version of lseek + +INDEX + _lseek64_r + +SYNOPSIS + #include + off64_t _lseek64_r(struct _reent *<[ptr]>, + int <[fd]>, off64_t <[pos]>, int <[whence]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. This function only exists on a system + with large file support. +*/ + +_off64_t +_lseek64_r (struct _reent *ptr, + int fd, + _off64_t pos, + int whence) +{ + _off64_t ret; + + errno = 0; + if ((ret = _lseek64 (fd, pos, whence)) == (_off64_t) -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/reent/lseekr.c b/lib/reent/lseekr.c new file mode 100644 index 0000000..77e66b8 --- /dev/null +++ b/lib/reent/lseekr.c @@ -0,0 +1,54 @@ +/* Reentrant versions of lseek system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_lseek_r>>---Reentrant version of lseek + +INDEX + _lseek_r + +SYNOPSIS + #include + off_t _lseek_r(struct _reent *<[ptr]>, + int <[fd]>, off_t <[pos]>, int <[whence]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +_off_t +_lseek_r (struct _reent *ptr, + int fd, + _off_t pos, + int whence) +{ + _off_t ret; + + errno = 0; + if ((ret = _lseek (fd, pos, whence)) == (_off_t) -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/mkdirr.c b/lib/reent/mkdirr.c new file mode 100644 index 0000000..cf66a24 --- /dev/null +++ b/lib/reent/mkdirr.c @@ -0,0 +1,56 @@ +/* Reentrant versions of mkdir system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_mkdir_r>>---Reentrant version of mkdir + +INDEX + _mkdir_r + +SYNOPSIS + #include + int _mkdir_r(struct _reent *<[ptr]>, + const char *<[path]>, int <[mode]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +#include + +int +_mkdir_r (struct _reent *ptr, + const char *path, + int mode) +{ + int ret; + + errno = 0; + if ((ret = _mkdir (path, mode)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/open64r.c b/lib/reent/open64r.c new file mode 100644 index 0000000..fe288d0 --- /dev/null +++ b/lib/reent/open64r.c @@ -0,0 +1,61 @@ +/* Reentrant versions of open system call. */ + +#include +#include +#include +#include <_syslist.h> + +#ifdef __LARGE64_FILES + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_open64_r>>---Reentrant version of open64 + +INDEX + _open64_r + +SYNOPSIS + #include + int _open64_r(struct _reent *<[ptr]>, + const char *<[file]>, int <[flags]>, int <[mode]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. This function only exists on systems with + large file support. +*/ + +int +_open64_r (ptr, file, flags, mode) + struct _reent *ptr; + const char *file; + int flags; + int mode; +{ + int ret; + + errno = 0; + if ((ret = _open64 (file, flags, mode)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/reent/openr.c b/lib/reent/openr.c new file mode 100644 index 0000000..8243154 --- /dev/null +++ b/lib/reent/openr.c @@ -0,0 +1,56 @@ +/* Reentrant versions of open system call. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_open_r>>---Reentrant version of open + +INDEX + _open_r + +SYNOPSIS + #include + int _open_r(struct _reent *<[ptr]>, + const char *<[file]>, int <[flags]>, int <[mode]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_open_r (struct _reent *ptr, + const char *file, + int flags, + int mode) +{ + int ret; + + errno = 0; + if ((ret = _open (file, flags, mode)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/readr.c b/lib/reent/readr.c new file mode 100644 index 0000000..b2ae300 --- /dev/null +++ b/lib/reent/readr.c @@ -0,0 +1,54 @@ +/* Reentrant versions of read system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_read_r>>---Reentrant version of read + +INDEX + _read_r + +SYNOPSIS + #include + _ssize_t _read_r(struct _reent *<[ptr]>, + int <[fd]>, void *<[buf]>, size_t <[cnt]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +_ssize_t +_read_r (struct _reent *ptr, + int fd, + void *buf, + size_t cnt) +{ + _ssize_t ret; + + errno = 0; + if ((ret = (_ssize_t)_read (fd, buf, cnt)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/reent.c b/lib/reent/reent.c new file mode 100644 index 0000000..db80ca0 --- /dev/null +++ b/lib/reent/reent.c @@ -0,0 +1,101 @@ +/* +FUNCTION + <>---definition of impure data. + +INDEX + reent + +DESCRIPTION + This module defines the impure data area used by the + non-reentrant functions, such as strtok. +*/ + +#include +#include + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +int errno; + +#endif + +void +_reclaim_reent (struct _reent *ptr) +{ +#ifndef _REENT_THREAD_LOCAL + if (ptr != _impure_ptr) +#endif + { + /* used by mprec routines. */ +#ifdef _REENT_SMALL + if (ptr->_mp) /* don't bother allocating it! */ + { +#endif + if (_REENT_MP_FREELIST(ptr)) + { + int i; + for (i = 0; i < _Kmax; i++) + { + struct _Bigint *thisone, *nextone; + + nextone = _REENT_MP_FREELIST(ptr)[i]; + while (nextone) + { + thisone = nextone; + nextone = nextone->_next; + _free_r (ptr, thisone); + } + } + + _free_r (ptr, _REENT_MP_FREELIST(ptr)); + } + if (_REENT_MP_RESULT(ptr)) + _free_r (ptr, _REENT_MP_RESULT(ptr)); +#ifdef _REENT_SMALL + } +#endif + +#ifdef _REENT_SMALL + if (_REENT_EMERGENCY(ptr)) + _free_r (ptr, _REENT_EMERGENCY(ptr)); + if (ptr->_mp) + _free_r (ptr, ptr->_mp); + if (ptr->_r48) + _free_r (ptr, ptr->_r48); + if (ptr->_localtime_buf) + _free_r (ptr, ptr->_localtime_buf); + if (ptr->_asctime_buf) + _free_r (ptr, ptr->_asctime_buf); + if (ptr->_signal_buf) + _free_r (ptr, ptr->_signal_buf); + if (ptr->_misc) + _free_r (ptr, ptr->_misc); +#endif + + if (_REENT_CVTBUF(ptr)) + _free_r (ptr, _REENT_CVTBUF(ptr)); + /* We should free _sig_func to avoid a memory leak, but how to + do it safely considering that a signal may be delivered immediately + after the free? + if (_REENT_SIG_FUNC(ptr)) + _free_r (ptr, _REENT_SIG_FUNC(ptr));*/ + + if (_REENT_CLEANUP(ptr)) + { + /* cleanup won't reclaim memory 'coz usually it's run + before the program exits, and who wants to wait for that? */ + _REENT_CLEANUP(ptr) (ptr); + } + + /* Malloc memory not reclaimed; no good way to return memory anyway. */ + + } +} diff --git a/lib/reent/reent.tex b/lib/reent/reent.tex new file mode 100644 index 0000000..881c572 --- /dev/null +++ b/lib/reent/reent.tex @@ -0,0 +1,117 @@ +@node Reentrancy +@chapter Reentrancy + +@cindex reentrancy +Reentrancy is a characteristic of library functions which allows multiple +processes to use the same address space with assurance that the values stored +in those spaces will remain constant between calls. The Red Hat +newlib implementation of the library functions ensures that +whenever possible, these library functions are reentrant. However, +there are some functions that can not be trivially made reentrant. +Hooks have been provided to allow you to use these functions in a fully +reentrant fashion. + +@findex _reent +@findex reent.h +@cindex reentrancy structure +These hooks use the structure @code{_reent} defined in @file{reent.h}. +A variable defined as @samp{struct _reent} is called a @dfn{reentrancy +structure}. All functions which must manipulate global information are +available in two versions. The first version has the usual name, and +uses a single global instance of the reentrancy structure. The second +has a different name, normally formed by prepending @samp{_} and +appending @samp{_r}, and takes a pointer to the particular reentrancy +structure to use. + +For example, the function @code{fopen} takes two arguments, @var{file} +and @var{mode}, and uses the global reentrancy structure. The function +@code{_fopen_r} takes the arguments, @var{struct_reent}, which is a +pointer to an instance of the reentrancy structure, @var{file} +and @var{mode}. + +There are two versions of @samp{struct _reent}, a normal one and one +for small memory systems, controlled by the @code{_REENT_SMALL} +definition from the (automatically included) @file{}. + +@cindex global reentrancy structure +@findex _impure_ptr +Each function which uses the global reentrancy structure uses the global +variable @code{_impure_ptr}, which points to a reentrancy structure. + +This means that you have two ways to achieve reentrancy. Both require +that each thread of execution control initialize a unique global +variable of type @samp{struct _reent}: + +@enumerate +@item +@cindex extra argument, reentrant fns +Use the reentrant versions of the library functions, after initializing +a global reentrancy structure for each process. Use the pointer to this +structure as the extra argument for all library functions. + +@item +Ensure that each thread of execution control has a pointer to its own +unique reentrancy structure in the global variable @code{_impure_ptr}, +and call the standard library subroutines. +@end enumerate + +@cindex list of reentrant functions +@cindex reentrant function list +The following functions are provided in both reentrant +and non-reentrant versions. + +@example +@exdent @emph{Equivalent for errno variable:} +_errno_r + +@exdent @emph{Locale functions:} +_localeconv_r _setlocale_r + +@exdent @emph{Equivalents for stdio variables:} +_stdin_r _stdout_r _stderr_r + +@page +@exdent @emph{Stdio functions:} +_fdopen_r _perror_r _tempnam_r +_fopen_r _putchar_r _tmpnam_r +_getchar_r _puts_r _tmpfile_r +_gets_r _remove_r _vfprintf_r +_iprintf_r _rename_r _vsnprintf_r +_mkstemp_r _snprintf_r _vsprintf_r +_mktemp_t _sprintf_r + +@exdent @emph{Signal functions:} +_init_signal_r _signal_r +_kill_r __sigtramp_r +_raise_r + +@exdent @emph{Stdlib functions:} +_calloc_r _mblen_r _setenv_r +_dtoa_r _mbstowcs_r _srand_r +_free_r _mbtowc_r _strtod_r +_getenv_r _memalign_r _strtol_r +_mallinfo_r _mstats_r _strtoul_r +_malloc_r _putenv_r _system_r +_malloc_r _rand_r _wcstombs_r +_malloc_stats_r _realloc_r _wctomb_r + +@exdent @emph{String functions:} +_strdup_r _strtok_r + +@exdent @emph{System functions:} +_close_r _link_r _unlink_r +_execve_r _lseek_r _wait_r +_fcntl_r _open_r _write_r +_fork_r _read_r +_fstat_r _sbrk_r +_gettimeofday_r _stat_r +_getpid_r _times_r + +@ifset STDIO64 +@exdent @emph{Additional 64-bit I/O System functions:} +_fstat64_r _lseek64_r _open64_r +@end ifset + +@exdent @emph{Time function:} +_asctime_r +@end example diff --git a/lib/reent/renamer.c b/lib/reent/renamer.c new file mode 100644 index 0000000..7e1e111 --- /dev/null +++ b/lib/reent/renamer.c @@ -0,0 +1,66 @@ +/* Reentrant version of rename system call. */ + +#include +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_rename_r>>---Reentrant version of rename + +INDEX + _rename_r + +SYNOPSIS + #include + int _rename_r(struct _reent *<[ptr]>, + const char *<[old]>, const char *<[new]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_rename_r (struct _reent *ptr, + const char *old, + const char *new) +{ + int ret = 0; + +#ifdef HAVE_RENAME + errno = 0; + if ((ret = _rename (old, new)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; +#else + if (_link_r (ptr, old, new) == -1) + return -1; + + if (_unlink_r (ptr, old) == -1) + { + /* ??? Should we unlink new? (rhetorical question) */ + return -1; + } +#endif + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/sbrkr.c b/lib/reent/sbrkr.c new file mode 100644 index 0000000..ec948fe --- /dev/null +++ b/lib/reent/sbrkr.c @@ -0,0 +1,56 @@ +/* Reentrant version of sbrk system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#if defined (REENTRANT_SYSCALLS_PROVIDED) + +int _dummy_sbrk_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_sbrk_r>>---Reentrant version of sbrk + +INDEX + _sbrk_r + +SYNOPSIS + #include + void *_sbrk_r(struct _reent *<[ptr]>, ptrdiff_t <[incr]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +void * +_sbrk_r (struct _reent *ptr, + ptrdiff_t incr) +{ + char *ret; + void *_sbrk(ptrdiff_t); + + errno = 0; + if ((ret = (char *)(_sbrk (incr))) == (void *) -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/signalr.c b/lib/reent/signalr.c new file mode 100644 index 0000000..863ae74 --- /dev/null +++ b/lib/reent/signalr.c @@ -0,0 +1,87 @@ +/* Reentrant versions of syscalls need to support signal/raise. + These implementations just call the usual system calls. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_link_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_kill_r>>---Reentrant version of kill + +INDEX + _kill_r + +SYNOPSIS + #include + int _kill_r(struct _reent *<[ptr]>, int <[pid]>, int <[sig]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_kill_r (struct _reent *ptr, + int pid, + int sig) +{ + int ret; + + errno = 0; + if ((ret = _kill (pid, sig)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +/* +NEWPAGE +FUNCTION + <<_getpid_r>>---Reentrant version of getpid + +INDEX + _getpid_r + +SYNOPSIS + #include + int _getpid_r(struct _reent *<[ptr]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. + + We never need <>, of course, but for consistency we + still must have the reentrant pointer argument. +*/ + +int +_getpid_r (struct _reent *ptr) +{ + int ret; + ret = _getpid (); + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/stat64r.c b/lib/reent/stat64r.c new file mode 100644 index 0000000..160d08e --- /dev/null +++ b/lib/reent/stat64r.c @@ -0,0 +1,60 @@ +/* Reentrant versions of stat64 system call. This implementation just + calls the stat64 system call. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in + TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_stat64_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_stat64_r>>---Reentrant version of stat64 + +INDEX + _stat64_r + +SYNOPSIS + #include + int _stat64_r(struct _reent *<[ptr]>, + const char *<[file]>, struct stat64 *<[pstat]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_stat64_r (struct _reent *ptr, + const char *file, + struct stat64 *pstat) +{ + int ret; + + errno = 0; + if ((ret = _stat64 (file, pstat)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/statr.c b/lib/reent/statr.c new file mode 100644 index 0000000..99453e7 --- /dev/null +++ b/lib/reent/statr.c @@ -0,0 +1,60 @@ +/* Reentrant versions of stat system call. This implementation just + calls the stat system call. */ + +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in + TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_stat_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_stat_r>>---Reentrant version of stat + +INDEX + _stat_r + +SYNOPSIS + #include + int _stat_r(struct _reent *<[ptr]>, + const char *<[file]>, struct stat *<[pstat]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_stat_r (struct _reent *ptr, + const char *file, + struct stat *pstat) +{ + int ret; + + errno = 0; + if ((ret = _stat (file, pstat)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/timesr.c b/lib/reent/timesr.c new file mode 100644 index 0000000..bb89003 --- /dev/null +++ b/lib/reent/timesr.c @@ -0,0 +1,55 @@ +/* Reentrant versions of times system calls */ + +#include +#include +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifdef REENTRANT_SYSCALLS_PROVIDED + +int _dummy_times_syscalls = 1; + +#else + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_times_r>>---Reentrant version of times + +INDEX + _times_r + +SYNOPSIS + #include + #include + clock_t _times_r(struct _reent *<[ptr]>, struct tms *<[ptms]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +clock_t +_times_r (struct _reent *ptr, + struct tms *ptms) +{ + clock_t ret; + + ret = _times (ptms); + return ret; +} +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/unlinkr.c b/lib/reent/unlinkr.c new file mode 100644 index 0000000..495e65b --- /dev/null +++ b/lib/reent/unlinkr.c @@ -0,0 +1,52 @@ +/* Reentrant versions of file system calls. These implementations + just call the usual system calls. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of these functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_unlink_r>>---Reentrant version of unlink + +INDEX + _unlink_r + +SYNOPSIS + #include + int _unlink_r(struct _reent *<[ptr]>, const char *<[file]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +int +_unlink_r (struct _reent *ptr, + const char *file) +{ + int ret; + + errno = 0; + if ((ret = _unlink (file)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/reent/writer.c b/lib/reent/writer.c new file mode 100644 index 0000000..ac2217c --- /dev/null +++ b/lib/reent/writer.c @@ -0,0 +1,54 @@ +/* Reentrant versions of write system call. */ + +#include +#include +#include <_syslist.h> + +/* Some targets provides their own versions of this functions. Those + targets should define REENTRANT_SYSCALLS_PROVIDED in TARGET_CFLAGS. */ + +#ifdef _REENT_ONLY +#ifndef REENTRANT_SYSCALLS_PROVIDED +#define REENTRANT_SYSCALLS_PROVIDED +#endif +#endif + +#ifndef REENTRANT_SYSCALLS_PROVIDED + +/* We use the errno variable used by the system dependent layer. */ +#undef errno +extern int errno; + +/* +FUNCTION + <<_write_r>>---Reentrant version of write + +INDEX + _write_r + +SYNOPSIS + #include + _ssize_t _write_r(struct _reent *<[ptr]>, + int <[fd]>, const void *<[buf]>, size_t <[cnt]>); + +DESCRIPTION + This is a reentrant version of <>. It + takes a pointer to the global data block, which holds + <>. +*/ + +_ssize_t +_write_r (struct _reent *ptr, + int fd, + const void *buf, + size_t cnt) +{ + _ssize_t ret; + + errno = 0; + if ((ret = (_ssize_t)_write (fd, buf, cnt)) == -1 && errno != 0) + _REENT_ERRNO(ptr) = errno; + return ret; +} + +#endif /* ! defined (REENTRANT_SYSCALLS_PROVIDED) */ diff --git a/lib/search/Makefile.inc b/lib/search/Makefile.inc new file mode 100644 index 0000000..5c28f19 --- /dev/null +++ b/lib/search/Makefile.inc @@ -0,0 +1,45 @@ +libc_a_SOURCES += \ + %D%/bsearch.c \ + %D%/db_local.h \ + %D%/extern.h \ + %D%/hash.h \ + %D%/ndbm.c \ + %D%/page.h \ + %D%/qsort.c + +## Following are EL/IX level 2 interfaces +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/hash.c \ + %D%/hash_bigkey.c \ + %D%/hash_buf.c \ + %D%/hash_func.c \ + %D%/hash_log2.c \ + %D%/hash_page.c \ + %D%/hcreate.c \ + %D%/hcreate_r.c \ + %D%/tdelete.c \ + %D%/tdestroy.c \ + %D%/tfind.c \ + %D%/tsearch.c \ + %D%/twalk.c +endif + +## Following are EL/IX level 4 interfaces +if ELIX_LEVEL_1 +else +if ELIX_LEVEL_2 +else +if ELIX_LEVEL_3 +else +libc_a_SOURCES += \ + %D%/bsd_qsort_r.c \ + %D%/qsort_r.c +endif !ELIX_LEVEL_3 +endif !ELIX_LEVEL_2 +endif !ELIX_LEVEL_1 + +LIBC_CHEWOUT_FILES += \ + %D%/bsearch.def \ + %D%/qsort.def \ + %D%/qsort_r.def diff --git a/lib/search/bsd_qsort_r.c b/lib/search/bsd_qsort_r.c new file mode 100644 index 0000000..f4a3757 --- /dev/null +++ b/lib/search/bsd_qsort_r.c @@ -0,0 +1,2 @@ +#define I_AM_QSORT_R +#include "qsort.c" diff --git a/lib/search/bsearch.c b/lib/search/bsearch.c new file mode 100644 index 0000000..29b7874 --- /dev/null +++ b/lib/search/bsearch.c @@ -0,0 +1,91 @@ +/* + * bsearch.c + * Original Author: G. Haley + * Rewritten by: G. Noer + * + * Searches an array of nmemb members, the initial member of which is pointed + * to by base, for a member that matches the object pointed to by key. The + * contents of the array shall be in ascending order according to a comparison + * function pointed to by compar. The function shall return an integer less + * than, equal to or greater than zero if the first argument is considered to be + * respectively less than, equal to or greater than the second. Returns a + * pointer to the matching member of the array, or a null pointer if no match + * is found. + */ + +/* +FUNCTION +<>---binary search + +INDEX + bsearch + +SYNOPSIS + #include + void *bsearch(const void *<[key]>, const void *<[base]>, + size_t <[nmemb]>, size_t <[size]>, + int (*<[compar]>)(const void *, const void *)); + +DESCRIPTION +<> searches an array beginning at <[base]> for any element +that matches <[key]>, using binary search. <[nmemb]> is the element +count of the array; <[size]> is the size of each element. + +The array must be sorted in ascending order with respect to the +comparison function <[compar]> (which you supply as the last argument of +<>). + +You must define the comparison function <<(*<[compar]>)>> to have two +arguments; its result must be negative if the first argument is +less than the second, zero if the two arguments match, and +positive if the first argument is greater than the second (where +``less than'' and ``greater than'' refer to whatever arbitrary +ordering is appropriate). + +RETURNS +Returns a pointer to an element of <[array]> that matches <[key]>. If +more than one matching element is available, the result may point to +any of them. + +PORTABILITY +<> is ANSI. + +No supporting OS subroutines are required. +*/ + +#include + +void * +bsearch (const void *key, + const void *base, + size_t nmemb, + size_t size, + int (*compar) (const void *, const void *)) +{ + void *current; + size_t lower = 0; + size_t upper = nmemb; + size_t index; + int result; + + if (nmemb == 0 || size == 0) + return NULL; + + while (lower < upper) + { + index = (lower + upper) / 2; + current = (void *) (((char *) base) + (index * size)); + + result = compar (key, current); + + if (result < 0) + upper = index; + else if (result > 0) + lower = index + 1; + else + return current; + } + + return NULL; +} + diff --git a/lib/search/db_local.h b/lib/search/db_local.h new file mode 100644 index 0000000..8167953 --- /dev/null +++ b/lib/search/db_local.h @@ -0,0 +1,214 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)db.h 8.7 (Berkeley) 6/16/94 + * $FreeBSD: src/include/db.h,v 1.5 2002/03/26 01:35:05 bde Exp $ + */ + +#ifndef _DB_H_ +#define _DB_H_ + +#include +#include +#include + +#include + +#define RET_ERROR -1 /* Return values. */ +#define RET_SUCCESS 0 +#define RET_SPECIAL 1 + +#define MAX_PAGE_NUMBER 0xffffffff /* >= # of pages in a file */ +typedef __uint32_t pgno_t; +#define MAX_PAGE_OFFSET 65535 /* >= # of bytes in a page */ +typedef __uint16_t indx_t; +#define MAX_REC_NUMBER 0xffffffff /* >= # of records in a tree */ +typedef __uint32_t recno_t; + +/* Key/data structure -- a Data-Base Thang. */ +typedef struct { + void *data; /* data */ + size_t size; /* data length */ +} DBT; + +/* Routine flags. */ +#define R_CURSOR 1 /* del, put, seq */ +#define __R_UNUSED 2 /* UNUSED */ +#define R_FIRST 3 /* seq */ +#define R_IAFTER 4 /* put (RECNO) */ +#define R_IBEFORE 5 /* put (RECNO) */ +#define R_LAST 6 /* seq (BTREE, RECNO) */ +#define R_NEXT 7 /* seq */ +#define R_NOOVERWRITE 8 /* put */ +#define R_PREV 9 /* seq (BTREE, RECNO) */ +#define R_SETCURSOR 10 /* put (RECNO) */ +#define R_RECNOSYNC 11 /* sync (RECNO) */ + +typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE; + +/* + * !!! + * The following flags are included in the dbopen(3) call as part of the + * open(2) flags. In order to avoid conflicts with the open flags, start + * at the top of the 16 or 32-bit number space and work our way down. If + * the open flags were significantly expanded in the future, it could be + * a problem. Wish I'd left another flags word in the dbopen call. + * + * !!! + * None of this stuff is implemented yet. The only reason that it's here + * is so that the access methods can skip copying the key/data pair when + * the DB_LOCK flag isn't set. + */ +#if UINT_MAX > 65535 +#define DB_LOCK 0x20000000 /* Do locking. */ +#define DB_SHMEM 0x40000000 /* Use shared memory. */ +#define DB_TXN 0x80000000 /* Do transactions. */ +#else +#define DB_LOCK 0x2000 /* Do locking. */ +#define DB_SHMEM 0x4000 /* Use shared memory. */ +#define DB_TXN 0x8000 /* Do transactions. */ +#endif + +/* Access method description structure. */ +typedef struct __db { + DBTYPE type; /* Underlying db type. */ + int (*close)(struct __db *); + int (*del)(const struct __db *, const DBT *, u_int); + int (*get)(const struct __db *, const DBT *, DBT *, u_int); + int (*put)(const struct __db *, DBT *, const DBT *, u_int); + int (*seq)(const struct __db *, DBT *, DBT *, u_int); + int (*sync)(const struct __db *, u_int); + void *internal; /* Access method private. */ + int (*fd)(const struct __db *); +} DB; + +#define BTREEMAGIC 0x053162 +#define BTREEVERSION 3 + +/* Structure used to pass parameters to the btree routines. */ +typedef struct { +#define R_DUP 0x01 /* duplicate keys */ + u_long flags; + u_int cachesize; /* bytes to cache */ + int maxkeypage; /* maximum keys per page */ + int minkeypage; /* minimum keys per page */ + u_int psize; /* page size */ + int (*compare) /* comparison function */ + (const DBT *, const DBT *); + size_t (*prefix) /* prefix function */ + (const DBT *, const DBT *); + int lorder; /* byte order */ +} BTREEINFO; + +#define HASHMAGIC 0x061561L +#define HASHVERSION 2 + +/* Structure used to pass parameters to the hashing routines. */ +typedef struct { + u_int bsize; /* bucket size */ + u_int ffactor; /* fill factor */ + u_int nelem; /* number of elements */ + u_int cachesize; /* bytes to cache */ + __uint32_t /* hash function */ + (*hash)(const void *, size_t); + int lorder; /* byte order */ +} HASHINFO; + +/* Structure used to pass parameters to the record routines. */ +typedef struct { +#define R_FIXEDLEN 0x01 /* fixed-length records */ +#define R_NOKEY 0x02 /* key not required */ +#define R_SNAPSHOT 0x04 /* snapshot the input */ + u_long flags; + u_int cachesize; /* bytes to cache */ + u_int psize; /* page size */ + int lorder; /* byte order */ + size_t reclen; /* record length (fixed-length records) */ + u_char bval; /* delimiting byte (variable-length records */ + char *bfname; /* btree file name */ +} RECNOINFO; + +/* + * Little endian <==> big endian 32-bit swap macros. + * M_32_SWAP swap a memory location + * P_32_SWAP swap a referenced memory location + * P_32_COPY swap from one location to another + */ +#define M_32_SWAP(a) { \ + __uint32_t _tmp = a; \ + ((char *)&a)[0] = ((char *)&_tmp)[3]; \ + ((char *)&a)[1] = ((char *)&_tmp)[2]; \ + ((char *)&a)[2] = ((char *)&_tmp)[1]; \ + ((char *)&a)[3] = ((char *)&_tmp)[0]; \ +} +#define P_32_SWAP(a) { \ + __uint32_t _tmp = *(__uint32_t *)a; \ + ((char *)a)[0] = ((char *)&_tmp)[3]; \ + ((char *)a)[1] = ((char *)&_tmp)[2]; \ + ((char *)a)[2] = ((char *)&_tmp)[1]; \ + ((char *)a)[3] = ((char *)&_tmp)[0]; \ +} +#define P_32_COPY(a, b) { \ + ((char *)&(b))[0] = ((char *)&(a))[3]; \ + ((char *)&(b))[1] = ((char *)&(a))[2]; \ + ((char *)&(b))[2] = ((char *)&(a))[1]; \ + ((char *)&(b))[3] = ((char *)&(a))[0]; \ +} + +/* + * Little endian <==> big endian 16-bit swap macros. + * M_16_SWAP swap a memory location + * P_16_SWAP swap a referenced memory location + * P_16_COPY swap from one location to another + */ +#define M_16_SWAP(a) { \ + __uint16_t _tmp = a; \ + ((char *)&a)[0] = ((char *)&_tmp)[1]; \ + ((char *)&a)[1] = ((char *)&_tmp)[0]; \ +} +#define P_16_SWAP(a) { \ + __uint16_t _tmp = *(__uint16_t *)a; \ + ((char *)a)[0] = ((char *)&_tmp)[1]; \ + ((char *)a)[1] = ((char *)&_tmp)[0]; \ +} +#define P_16_COPY(a, b) { \ + ((char *)&(b))[0] = ((char *)&(a))[1]; \ + ((char *)&(b))[1] = ((char *)&(a))[0]; \ +} + +__BEGIN_DECLS +DB *dbopen(const char *, int, int, DBTYPE, const void *); + +#ifdef __DBINTERFACE_PRIVATE +DB *__bt_open(const char *, int, int, const BTREEINFO *, int); +DB *__hash_open(const char *, int, int, int, const HASHINFO *); +DB *__rec_open(const char *, int, int, const RECNOINFO *, int); +void __dbpanic(DB *dbp); +#endif +__END_DECLS +#endif /* !_DB_H_ */ diff --git a/lib/search/extern.h b/lib/search/extern.h new file mode 100644 index 0000000..58a2a04 --- /dev/null +++ b/lib/search/extern.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 1991, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)extern.h 8.4 (Berkeley) 6/16/94 + * $FreeBSD: src/lib/libc/db/hash/extern.h,v 1.3 2002/03/22 09:18:22 obrien Exp $ + */ + +BUFHEAD *__add_ovflpage(HTAB *, BUFHEAD *); +int __addel(HTAB *, BUFHEAD *, const DBT *, const DBT *); +int __big_delete(HTAB *, BUFHEAD *); +int __big_insert(HTAB *, BUFHEAD *, const DBT *, const DBT *); +int __big_keydata(HTAB *, BUFHEAD *, DBT *, DBT *, int); +int __big_return(HTAB *, BUFHEAD *, int, DBT *, int); +int __big_split(HTAB *, BUFHEAD *, BUFHEAD *, BUFHEAD *, + int, __uint32_t, SPLIT_RETURN *); +int __buf_free(HTAB *, int, int); +void __buf_init(HTAB *, int); +__uint32_t __call_hash(HTAB *, char *, int); +int __delpair(HTAB *, BUFHEAD *, int); +int __expand_table(HTAB *); +int __find_bigpair(HTAB *, BUFHEAD *, int, char *, int); +__uint16_t __find_last_page(HTAB *, BUFHEAD **); +void __free_ovflpage(HTAB *, BUFHEAD *); +BUFHEAD *__get_buf(HTAB *, __uint32_t, BUFHEAD *, int); +int __get_page(HTAB *, char *, __uint32_t, int, int, int); +int __ibitmap(HTAB *, int, int, int); +__uint32_t __log2(__uint32_t); +int __put_page(HTAB *, char *, __uint32_t, int, int); +void __reclaim_buf(HTAB *, BUFHEAD *); +int __split_page(HTAB *, __uint32_t, __uint32_t); + +/* Default hash routine. */ +extern __uint32_t (*__default_hash)(const void *, size_t); + +#ifdef HASH_STATISTICS +extern int hash_accesses, hash_collisions, hash_expansions, hash_overflows; +#endif diff --git a/lib/search/hash.c b/lib/search/hash.c new file mode 100644 index 0000000..33ff275 --- /dev/null +++ b/lib/search/hash.c @@ -0,0 +1,1037 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)hash.c 8.9 (Berkeley) 6/16/94"; +#endif /* LIBC_SCCS and not lint */ +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef DEBUG +#include +#endif + +#define __DBINTERFACE_PRIVATE /* activate prototypes from db_local.h */ +#include "db_local.h" +#include "hash.h" +#include "page.h" +#include "extern.h" + +static int alloc_segs(HTAB *, int); +static int flush_meta(HTAB *); +static int hash_access(HTAB *, ACTION, DBT *, DBT *); +static int hash_close(DB *); +static int hash_delete(const DB *, const DBT *, u_int); +static int hash_fd(const DB *); +static int hash_get(const DB *, const DBT *, DBT *, u_int); +static int hash_put(const DB *, DBT *, const DBT *, u_int); +static void *hash_realloc(SEGMENT **, int, int); +static int hash_seq(const DB *, DBT *, DBT *, u_int); +static int hash_sync(const DB *, u_int); +static int hdestroy(HTAB *); +static HTAB *init_hash(HTAB *, const char *, const HASHINFO *); +static int init_htab(HTAB *, int); +#if (BYTE_ORDER == LITTLE_ENDIAN) +static void swap_header(HTAB *); +static void swap_header_copy(HASHHDR *, HASHHDR *); +#endif + +/* Macros for min/max. */ +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* Fast arithmetic, relying on powers of 2, */ +#define MOD(x, y) ((x) & ((y) - 1)) + +#define RETURN_ERROR(ERR, LOC) { save_errno = ERR; goto LOC; } + +/* Return values */ +#define SUCCESS (0) +#define ERROR (-1) +#define ABNORMAL (1) + +#ifdef HASH_STATISTICS +int hash_accesses, hash_collisions, hash_expansions, hash_overflows; +#endif + +/************************** INTERFACE ROUTINES ***************************/ +/* OPEN/CLOSE */ + +extern DB * +__hash_open (const char *file, + int flags, + int mode, + int dflags, + const HASHINFO *info) /* Special directives for create */ +{ + HTAB *hashp; + +#ifdef __USE_INTERNAL_STAT64 + struct stat64 statbuf; +#else + struct stat statbuf; +#endif + DB *dbp; + int bpages, hdrsize, new_table, nsegs, save_errno; + + if ((flags & O_ACCMODE) == O_WRONLY) { + errno = EINVAL; + return (NULL); + } + + if (!(hashp = (HTAB *)calloc(1, sizeof(HTAB)))) + return (NULL); + hashp->fp = -1; + + /* + * Even if user wants write only, we need to be able to read + * the actual file, so we need to open it read/write. But, the + * field in the hashp structure needs to be accurate so that + * we can check accesses. + */ + hashp->flags = flags; + + new_table = 0; + if (!file || (flags & O_TRUNC) || +#ifdef __USE_INTERNAL_STAT64 + (_stat64_r(_REENT, file, &statbuf) && (errno == ENOENT))) { +#else + (_stat_r(_REENT, file, &statbuf) && (errno == ENOENT))) { +#endif + if (errno == ENOENT) + errno = 0; /* Just in case someone looks at errno */ + new_table = 1; + } + if (file) { + if ((hashp->fp = open(file, flags, mode)) == -1) + RETURN_ERROR(errno, error0); + + /* if the .db file is empty, and we had permission to create + a new .db file, then reinitialize the database */ + if ((flags & O_CREAT) && +#ifdef __USE_INTERNAL_STAT64 + _fstat64_r(_REENT, hashp->fp, &statbuf) == 0 && statbuf.st_size == 0) +#else + _fstat_r(_REENT, hashp->fp, &statbuf) == 0 && statbuf.st_size == 0) +#endif + new_table = 1; + +#ifdef HAVE_FCNTL + (void)fcntl(hashp->fp, F_SETFD, 1); +#endif + } + if (new_table) { + if (!(hashp = init_hash(hashp, file, (HASHINFO *)info))) + RETURN_ERROR(errno, error1); + } else { + /* Table already exists */ + if (info && info->hash) + hashp->hash = info->hash; + else + hashp->hash = __default_hash; + + hdrsize = read(hashp->fp, &hashp->hdr, sizeof(HASHHDR)); +#if (BYTE_ORDER == LITTLE_ENDIAN) + swap_header(hashp); +#endif + if (hdrsize == -1) + RETURN_ERROR(errno, error1); + if (hdrsize != sizeof(HASHHDR)) + RETURN_ERROR(EFTYPE, error1); + /* Verify file type, versions and hash function */ + if (hashp->MAGIC != HASHMAGIC) + RETURN_ERROR(EFTYPE, error1); +#define OLDHASHVERSION 1 + if (hashp->HASH_VERSION != HASHVERSION && + hashp->HASH_VERSION != OLDHASHVERSION) + RETURN_ERROR(EFTYPE, error1); + if (hashp->hash(CHARKEY, sizeof(CHARKEY)) != hashp->H_CHARKEY) + RETURN_ERROR(EFTYPE, error1); + /* Check bucket size isn't too big for target int. */ + if (hashp->BSIZE > INT_MAX) + RETURN_ERROR(EFTYPE, error1); + /* + * Figure out how many segments we need. Max_Bucket is the + * maximum bucket number, so the number of buckets is + * max_bucket + 1. + */ + nsegs = (hashp->MAX_BUCKET + 1 + hashp->SGSIZE - 1) / + hashp->SGSIZE; + hashp->nsegs = 0; + if (alloc_segs(hashp, nsegs)) + /* + * If alloc_segs fails, table will have been destroyed + * and errno will have been set. + */ + return (NULL); + /* Read in bitmaps */ + bpages = (hashp->SPARES[hashp->OVFL_POINT] + + (hashp->BSIZE << BYTE_SHIFT) - 1) >> + (hashp->BSHIFT + BYTE_SHIFT); + + hashp->nmaps = bpages; + (void)memset(&hashp->mapp[0], 0, bpages * sizeof(__uint32_t *)); + } + + /* Initialize Buffer Manager */ + if (info && info->cachesize) + __buf_init(hashp, info->cachesize); + else + __buf_init(hashp, DEF_BUFSIZE); + + hashp->new_file = new_table; + hashp->save_file = file && (hashp->flags & O_RDWR); + hashp->cbucket = -1; + if (!(dbp = (DB *)malloc(sizeof(DB)))) { + save_errno = errno; + hdestroy(hashp); + errno = save_errno; + return (NULL); + } + dbp->internal = hashp; + dbp->close = hash_close; + dbp->del = hash_delete; + dbp->fd = hash_fd; + dbp->get = hash_get; + dbp->put = hash_put; + dbp->seq = hash_seq; + dbp->sync = hash_sync; + dbp->type = DB_HASH; + +#ifdef DEBUG + (void)fprintf(stderr, +"%s\n%s%x\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%d\n%s%x\n%s%x\n%s%d\n%s%d\n", + "init_htab:", + "TABLE POINTER ", hashp, + "BUCKET SIZE ", hashp->BSIZE, + "BUCKET SHIFT ", hashp->BSHIFT, + "DIRECTORY SIZE ", hashp->DSIZE, + "SEGMENT SIZE ", hashp->SGSIZE, + "SEGMENT SHIFT ", hashp->SSHIFT, + "FILL FACTOR ", hashp->FFACTOR, + "MAX BUCKET ", hashp->MAX_BUCKET, + "OVFL POINT ", hashp->OVFL_POINT, + "LAST FREED ", hashp->LAST_FREED, + "HIGH MASK ", hashp->HIGH_MASK, + "LOW MASK ", hashp->LOW_MASK, + "NSEGS ", hashp->nsegs, + "NKEYS ", hashp->NKEYS); +#endif +#ifdef HASH_STATISTICS + hash_overflows = hash_accesses = hash_collisions = hash_expansions = 0; +#endif + return (dbp); + +error1: + if (hashp != NULL) + (void)close(hashp->fp); + +error0: + free(hashp); + errno = save_errno; + return (NULL); +} + +static int +hash_close(dbp) + DB *dbp; +{ + HTAB *hashp; + int retval; + + if (!dbp) + return (ERROR); + + hashp = (HTAB *)dbp->internal; + retval = hdestroy(hashp); + free(dbp); + return (retval); +} + +static int +hash_fd(dbp) + const DB *dbp; +{ + HTAB *hashp; + + if (!dbp) + return (ERROR); + + hashp = (HTAB *)dbp->internal; + if (hashp->fp == -1) { + errno = ENOENT; + return (-1); + } + return (hashp->fp); +} + +/************************** LOCAL CREATION ROUTINES **********************/ +static HTAB * +init_hash(hashp, file, info) + HTAB *hashp; + const char *file; + const HASHINFO *info; +{ +#ifdef __USE_INTERNAL_STAT64 + struct stat64 statbuf; +#else + struct stat statbuf; +#endif + int nelem; + + nelem = 1; + hashp->NKEYS = 0; + hashp->LORDER = DB_BYTE_ORDER; + hashp->BSIZE = DEF_BUCKET_SIZE; + hashp->BSHIFT = DEF_BUCKET_SHIFT; + hashp->SGSIZE = DEF_SEGSIZE; + hashp->SSHIFT = DEF_SEGSIZE_SHIFT; + hashp->DSIZE = DEF_DIRSIZE; + hashp->FFACTOR = DEF_FFACTOR; + hashp->hash = __default_hash; + memset(hashp->SPARES, 0, sizeof(hashp->SPARES)); + memset(hashp->BITMAPS, 0, sizeof (hashp->BITMAPS)); + + /* Fix bucket size to be optimal for file system */ + if (file != NULL) { +#ifdef __USE_INTERNAL_STAT64 + if (_stat64_r(_REENT, file, &statbuf)) +#else + if (_stat_r(_REENT, file, &statbuf)) +#endif + return (NULL); + hashp->BSIZE = MIN(statbuf.st_blksize, MAX_BSIZE); + hashp->BSHIFT = __log2(hashp->BSIZE); + } + + if (info) { + if (info->bsize) { + /* Round pagesize up to power of 2 */ + hashp->BSHIFT = __log2(info->bsize); + hashp->BSIZE = 1 << hashp->BSHIFT; + if (hashp->BSIZE > MAX_BSIZE) { + errno = EINVAL; + return (NULL); + } + } + if (info->ffactor) + hashp->FFACTOR = info->ffactor; + if (info->hash) + hashp->hash = info->hash; + if (info->nelem) + nelem = info->nelem; + if (info->lorder) { + if (info->lorder != DB_BIG_ENDIAN && + info->lorder != DB_LITTLE_ENDIAN) { + errno = EINVAL; + return (NULL); + } + hashp->LORDER = info->lorder; + } + } + /* init_htab should destroy the table and set errno if it fails */ + if (init_htab(hashp, nelem)) + return (NULL); + else + return (hashp); +} +/* + * This calls alloc_segs which may run out of memory. Alloc_segs will destroy + * the table and set errno, so we just pass the error information along. + * + * Returns 0 on No Error + */ +static int +init_htab(hashp, nelem) + HTAB *hashp; + int nelem; +{ + int nbuckets, nsegs; + int l2; + + /* + * Divide number of elements by the fill factor and determine a + * desired number of buckets. Allocate space for the next greater + * power of two number of buckets. + */ + nelem = (nelem - 1) / hashp->FFACTOR + 1; + + l2 = __log2(MAX(nelem, 2)); + nbuckets = 1 << l2; + + hashp->SPARES[l2] = l2 + 1; + hashp->SPARES[l2 + 1] = l2 + 1; + hashp->OVFL_POINT = l2; + hashp->LAST_FREED = 2; + + /* First bitmap page is at: splitpoint l2 page offset 1 */ + if (__ibitmap(hashp, OADDR_OF(l2, 1), l2 + 1, 0)) + return (-1); + + hashp->MAX_BUCKET = hashp->LOW_MASK = nbuckets - 1; + hashp->HIGH_MASK = (nbuckets << 1) - 1; + hashp->HDRPAGES = ((MAX(sizeof(HASHHDR), MINHDRSIZE) - 1) >> + hashp->BSHIFT) + 1; + + nsegs = (nbuckets - 1) / hashp->SGSIZE + 1; + nsegs = 1 << __log2(nsegs); + + if (nsegs > hashp->DSIZE) + hashp->DSIZE = nsegs; + return (alloc_segs(hashp, nsegs)); +} + +/********************** DESTROY/CLOSE ROUTINES ************************/ + +/* + * Flushes any changes to the file if necessary and destroys the hashp + * structure, freeing all allocated space. + */ +static int +hdestroy(hashp) + HTAB *hashp; +{ + int i, save_errno; + + save_errno = 0; + +#ifdef HASH_STATISTICS + (void)fprintf(stderr, "hdestroy: accesses %ld collisions %ld\n", + hash_accesses, hash_collisions); + (void)fprintf(stderr, "hdestroy: expansions %ld\n", + hash_expansions); + (void)fprintf(stderr, "hdestroy: overflows %ld\n", + hash_overflows); + (void)fprintf(stderr, "keys %ld maxp %d segmentcount %d\n", + hashp->NKEYS, hashp->MAX_BUCKET, hashp->nsegs); + + for (i = 0; i < NCACHED; i++) + (void)fprintf(stderr, + "spares[%d] = %d\n", i, hashp->SPARES[i]); +#endif + /* + * Call on buffer manager to free buffers, and if required, + * write them to disk. + */ + if (__buf_free(hashp, 1, hashp->save_file)) + save_errno = errno; + if (hashp->dir) { + free(*hashp->dir); /* Free initial segments */ + /* Free extra segments */ + while (hashp->exsegs--) + free(hashp->dir[--hashp->nsegs]); + free(hashp->dir); + } + if (flush_meta(hashp) && !save_errno) + save_errno = errno; + /* Free Bigmaps */ + for (i = 0; i < hashp->nmaps; i++) + if (hashp->mapp[i]) + free(hashp->mapp[i]); + + if (hashp->fp != -1) + (void)close(hashp->fp); + + free(hashp); + + if (save_errno) { + errno = save_errno; + return (ERROR); + } + return (SUCCESS); +} +/* + * Write modified pages to disk + * + * Returns: + * 0 == OK + * -1 ERROR + */ +static int +hash_sync(dbp, flags) + const DB *dbp; + u_int flags; +{ + HTAB *hashp; + + if (flags != 0) { + errno = EINVAL; + return (ERROR); + } + + if (!dbp) + return (ERROR); + + hashp = (HTAB *)dbp->internal; + if (!hashp->save_file) + return (0); + if (__buf_free(hashp, 0, 1) || flush_meta(hashp)) + return (ERROR); + hashp->new_file = 0; + return (0); +} + +/* + * Returns: + * 0 == OK + * -1 indicates that errno should be set + */ +static int +flush_meta(hashp) + HTAB *hashp; +{ + HASHHDR *whdrp; +#if (BYTE_ORDER == LITTLE_ENDIAN) + HASHHDR whdr; +#endif + int fp, i, wsize; + + if (!hashp->save_file) + return (0); + hashp->MAGIC = HASHMAGIC; + hashp->HASH_VERSION = HASHVERSION; + hashp->H_CHARKEY = hashp->hash(CHARKEY, sizeof(CHARKEY)); + + fp = hashp->fp; + whdrp = &hashp->hdr; +#if (BYTE_ORDER == LITTLE_ENDIAN) + whdrp = &whdr; + swap_header_copy(&hashp->hdr, whdrp); +#endif + if ((lseek(fp, (off_t)0, SEEK_SET) == -1) || + ((wsize = write(fp, whdrp, sizeof(HASHHDR))) == -1)) + return (-1); + else + if (wsize != sizeof(HASHHDR)) { + errno = EFTYPE; + hashp->error = errno; + return (-1); + } + for (i = 0; i < NCACHED; i++) + if (hashp->mapp[i]) + if (__put_page(hashp, (char *)hashp->mapp[i], + hashp->BITMAPS[i], 0, 1)) + return (-1); + return (0); +} + +/*******************************SEARCH ROUTINES *****************************/ +/* + * All the access routines return + * + * Returns: + * 0 on SUCCESS + * 1 to indicate an external ERROR (i.e. key not found, etc) + * -1 to indicate an internal ERROR (i.e. out of memory, etc) + */ +static int +hash_get(dbp, key, data, flag) + const DB *dbp; + const DBT *key; + DBT *data; + u_int flag; +{ + HTAB *hashp; + + hashp = (HTAB *)dbp->internal; + if (flag) { + hashp->error = errno = EINVAL; + return (ERROR); + } + return (hash_access(hashp, HASH_GET, (DBT *)key, data)); +} + +static int +hash_put(dbp, key, data, flag) + const DB *dbp; + DBT *key; + const DBT *data; + u_int flag; +{ + HTAB *hashp; + + hashp = (HTAB *)dbp->internal; + if (flag && flag != R_NOOVERWRITE) { + hashp->error = EINVAL; + errno = EINVAL; + return (ERROR); + } + if ((hashp->flags & O_ACCMODE) == O_RDONLY) { + hashp->error = errno = EPERM; + return (ERROR); + } + return (hash_access(hashp, flag == R_NOOVERWRITE ? + HASH_PUTNEW : HASH_PUT, (DBT *)key, (DBT *)data)); +} + +static int +hash_delete(dbp, key, flag) + const DB *dbp; + const DBT *key; + u_int flag; /* Ignored */ +{ + HTAB *hashp; + + hashp = (HTAB *)dbp->internal; + if (flag && flag != R_CURSOR) { + hashp->error = errno = EINVAL; + return (ERROR); + } + if ((hashp->flags & O_ACCMODE) == O_RDONLY) { + hashp->error = errno = EPERM; + return (ERROR); + } + return (hash_access(hashp, HASH_DELETE, (DBT *)key, NULL)); +} + +/* + * Assume that hashp has been set in wrapper routine. + */ +static int +hash_access(hashp, action, key, val) + HTAB *hashp; + ACTION action; + DBT *key, *val; +{ + BUFHEAD *rbufp; + BUFHEAD *bufp, *save_bufp; + __uint16_t *bp; + int n, ndx, off, size; + char *kp; + __uint16_t pageno; + +#ifdef HASH_STATISTICS + hash_accesses++; +#endif + + off = hashp->BSIZE; + size = key->size; + kp = (char *)key->data; + rbufp = __get_buf(hashp, __call_hash(hashp, kp, size), NULL, 0); + if (!rbufp) + return (ERROR); + save_bufp = rbufp; + + /* Pin the bucket chain */ + rbufp->flags |= BUF_PIN; + for (bp = (__uint16_t *)rbufp->page, n = *bp++, ndx = 1; ndx < n;) + if (bp[1] >= REAL_KEY) { + /* Real key/data pair */ + if (size == off - *bp && + memcmp(kp, rbufp->page + *bp, size) == 0) + goto found; + off = bp[1]; +#ifdef HASH_STATISTICS + hash_collisions++; +#endif + bp += 2; + ndx += 2; + } else if (bp[1] == OVFLPAGE) { + rbufp = __get_buf(hashp, *bp, rbufp, 0); + if (!rbufp) { + save_bufp->flags &= ~BUF_PIN; + return (ERROR); + } + /* FOR LOOP INIT */ + bp = (__uint16_t *)rbufp->page; + n = *bp++; + ndx = 1; + off = hashp->BSIZE; + } else if (bp[1] < REAL_KEY) { + if ((ndx = + __find_bigpair(hashp, rbufp, ndx, kp, size)) > 0) + goto found; + if (ndx == -2) { + bufp = rbufp; + if (!(pageno = + __find_last_page(hashp, &bufp))) { + ndx = 0; + rbufp = bufp; + break; /* FOR */ + } + rbufp = __get_buf(hashp, pageno, bufp, 0); + if (!rbufp) { + save_bufp->flags &= ~BUF_PIN; + return (ERROR); + } + /* FOR LOOP INIT */ + bp = (__uint16_t *)rbufp->page; + n = *bp++; + ndx = 1; + off = hashp->BSIZE; + } else { + save_bufp->flags &= ~BUF_PIN; + return (ERROR); + } + } + + /* Not found */ + switch (action) { + case HASH_PUT: + case HASH_PUTNEW: + if (__addel(hashp, rbufp, key, val)) { + save_bufp->flags &= ~BUF_PIN; + return (ERROR); + } else { + save_bufp->flags &= ~BUF_PIN; + return (SUCCESS); + } + case HASH_GET: + case HASH_DELETE: + default: + save_bufp->flags &= ~BUF_PIN; + return (ABNORMAL); + } + +found: + switch (action) { + case HASH_PUTNEW: + save_bufp->flags &= ~BUF_PIN; + return (ABNORMAL); + case HASH_GET: + bp = (__uint16_t *)rbufp->page; + if (bp[ndx + 1] < REAL_KEY) { + if (__big_return(hashp, rbufp, ndx, val, 0)) + return (ERROR); + } else { + val->data = (u_char *)rbufp->page + (int)bp[ndx + 1]; + val->size = bp[ndx] - bp[ndx + 1]; + } + break; + case HASH_PUT: + if ((__delpair(hashp, rbufp, ndx)) || + (__addel(hashp, rbufp, key, val))) { + save_bufp->flags &= ~BUF_PIN; + return (ERROR); + } + break; + case HASH_DELETE: + if (__delpair(hashp, rbufp, ndx)) + return (ERROR); + break; + default: + abort(); + } + save_bufp->flags &= ~BUF_PIN; + return (SUCCESS); +} + +static int +hash_seq(dbp, key, data, flag) + const DB *dbp; + DBT *key, *data; + u_int flag; +{ + __uint32_t bucket; + BUFHEAD *bufp; + HTAB *hashp; + __uint16_t *bp, ndx; + + hashp = (HTAB *)dbp->internal; + if (flag && flag != R_FIRST && flag != R_NEXT) { + hashp->error = errno = EINVAL; + return (ERROR); + } +#ifdef HASH_STATISTICS + hash_accesses++; +#endif + if ((hashp->cbucket < 0) || (flag == R_FIRST)) { + hashp->cbucket = 0; + hashp->cndx = 1; + hashp->cpage = NULL; + } + + for (bp = NULL; !bp || !bp[0]; ) { + if (!(bufp = hashp->cpage)) { + for (bucket = hashp->cbucket; + bucket <= hashp->MAX_BUCKET; + bucket++, hashp->cndx = 1) { + bufp = __get_buf(hashp, bucket, NULL, 0); + if (!bufp) + return (ERROR); + hashp->cpage = bufp; + bp = (__uint16_t *)bufp->page; + if (bp[0]) + break; + } + hashp->cbucket = bucket; + if (hashp->cbucket > hashp->MAX_BUCKET) { + hashp->cbucket = -1; + return (ABNORMAL); + } + } else + bp = (__uint16_t *)hashp->cpage->page; + +#ifdef DEBUG + assert(bp); + assert(bufp); +#endif + while (bp[hashp->cndx + 1] == OVFLPAGE) { + bufp = hashp->cpage = + __get_buf(hashp, bp[hashp->cndx], bufp, 0); + if (!bufp) + return (ERROR); + bp = (__uint16_t *)(bufp->page); + hashp->cndx = 1; + } + if (!bp[0]) { + hashp->cpage = NULL; + ++hashp->cbucket; + } + } + ndx = hashp->cndx; + if (bp[ndx + 1] < REAL_KEY) { + if (__big_keydata(hashp, bufp, key, data, 1)) + return (ERROR); + } else { + key->data = (u_char *)hashp->cpage->page + bp[ndx]; + key->size = (ndx > 1 ? bp[ndx - 1] : hashp->BSIZE) - bp[ndx]; + data->data = (u_char *)hashp->cpage->page + bp[ndx + 1]; + data->size = bp[ndx] - bp[ndx + 1]; + ndx += 2; + if (ndx > bp[0]) { + hashp->cpage = NULL; + hashp->cbucket++; + hashp->cndx = 1; + } else + hashp->cndx = ndx; + } + return (SUCCESS); +} + +/********************************* UTILITIES ************************/ + +/* + * Returns: + * 0 ==> OK + * -1 ==> Error + */ +extern int +__expand_table(hashp) + HTAB *hashp; +{ + __uint32_t old_bucket, new_bucket; + int dirsize, new_segnum, spare_ndx; + +#ifdef HASH_STATISTICS + hash_expansions++; +#endif + new_bucket = ++hashp->MAX_BUCKET; + old_bucket = (hashp->MAX_BUCKET & hashp->LOW_MASK); + + new_segnum = new_bucket >> hashp->SSHIFT; + + /* Check if we need a new segment */ + if (new_segnum >= hashp->nsegs) { + /* Check if we need to expand directory */ + if (new_segnum >= hashp->DSIZE) { + /* Reallocate directory */ + dirsize = hashp->DSIZE * sizeof(SEGMENT *); + if (!hash_realloc(&hashp->dir, dirsize, dirsize << 1)) + return (-1); + hashp->DSIZE = dirsize << 1; + } + if ((hashp->dir[new_segnum] = + (SEGMENT)calloc(hashp->SGSIZE, sizeof(SEGMENT))) == NULL) + return (-1); + hashp->exsegs++; + hashp->nsegs++; + } + /* + * If the split point is increasing (MAX_BUCKET's log base 2 + * * increases), we need to copy the current contents of the spare + * split bucket to the next bucket. + */ + spare_ndx = __log2(hashp->MAX_BUCKET + 1); + if (spare_ndx > hashp->OVFL_POINT) { + hashp->SPARES[spare_ndx] = hashp->SPARES[hashp->OVFL_POINT]; + hashp->OVFL_POINT = spare_ndx; + } + + if (new_bucket > hashp->HIGH_MASK) { + /* Starting a new doubling */ + hashp->LOW_MASK = hashp->HIGH_MASK; + hashp->HIGH_MASK = new_bucket | hashp->LOW_MASK; + } + /* Relocate records to the new bucket */ + return (__split_page(hashp, old_bucket, new_bucket)); +} + +/* + * If realloc guarantees that the pointer is not destroyed if the realloc + * fails, then this routine can go away. + */ +static void * +hash_realloc(p_ptr, oldsize, newsize) + SEGMENT **p_ptr; + int oldsize, newsize; +{ + void *p; + + if ( (p = malloc(newsize)) ) { + memmove(p, *p_ptr, oldsize); + memset((char *)p + oldsize, 0, newsize - oldsize); + free(*p_ptr); + *p_ptr = p; + } + return (p); +} + +extern __uint32_t +__call_hash(hashp, k, len) + HTAB *hashp; + char *k; + int len; +{ + int n, bucket; + + n = hashp->hash(k, len); + bucket = n & hashp->HIGH_MASK; + if (bucket > hashp->MAX_BUCKET) + bucket = bucket & hashp->LOW_MASK; + return (bucket); +} + +/* + * Allocate segment table. On error, destroy the table and set errno. + * + * Returns 0 on success + */ +static int +alloc_segs(hashp, nsegs) + HTAB *hashp; + int nsegs; +{ + int i; + SEGMENT store; + + int save_errno; + + if ((hashp->dir = + (SEGMENT *)calloc(hashp->DSIZE, sizeof(SEGMENT *))) == NULL) { + save_errno = errno; + (void)hdestroy(hashp); + errno = save_errno; + return (-1); + } + /* Allocate segments */ + if ((store = + (SEGMENT)calloc(nsegs << hashp->SSHIFT, sizeof(SEGMENT))) == NULL) { + save_errno = errno; + (void)hdestroy(hashp); + errno = save_errno; + return (-1); + } + for (i = 0; i < nsegs; i++, hashp->nsegs++) + hashp->dir[i] = &store[i << hashp->SSHIFT]; + return (0); +} + +#if (BYTE_ORDER == LITTLE_ENDIAN) +/* + * Hashp->hdr needs to be byteswapped. + */ +static void +swap_header_copy(srcp, destp) + HASHHDR *srcp, *destp; +{ + int i; + + P_32_COPY(srcp->magic, destp->magic); + P_32_COPY(srcp->version, destp->version); + P_32_COPY(srcp->lorder, destp->lorder); + P_32_COPY(srcp->bsize, destp->bsize); + P_32_COPY(srcp->bshift, destp->bshift); + P_32_COPY(srcp->dsize, destp->dsize); + P_32_COPY(srcp->ssize, destp->ssize); + P_32_COPY(srcp->sshift, destp->sshift); + P_32_COPY(srcp->ovfl_point, destp->ovfl_point); + P_32_COPY(srcp->last_freed, destp->last_freed); + P_32_COPY(srcp->max_bucket, destp->max_bucket); + P_32_COPY(srcp->high_mask, destp->high_mask); + P_32_COPY(srcp->low_mask, destp->low_mask); + P_32_COPY(srcp->ffactor, destp->ffactor); + P_32_COPY(srcp->nkeys, destp->nkeys); + P_32_COPY(srcp->hdrpages, destp->hdrpages); + P_32_COPY(srcp->h_charkey, destp->h_charkey); + for (i = 0; i < NCACHED; i++) { + P_32_COPY(srcp->spares[i], destp->spares[i]); + P_16_COPY(srcp->bitmaps[i], destp->bitmaps[i]); + } +} + +static void +swap_header(hashp) + HTAB *hashp; +{ + HASHHDR *hdrp; + int i; + + hdrp = &hashp->hdr; + + M_32_SWAP(hdrp->magic); + M_32_SWAP(hdrp->version); + M_32_SWAP(hdrp->lorder); + M_32_SWAP(hdrp->bsize); + M_32_SWAP(hdrp->bshift); + M_32_SWAP(hdrp->dsize); + M_32_SWAP(hdrp->ssize); + M_32_SWAP(hdrp->sshift); + M_32_SWAP(hdrp->ovfl_point); + M_32_SWAP(hdrp->last_freed); + M_32_SWAP(hdrp->max_bucket); + M_32_SWAP(hdrp->high_mask); + M_32_SWAP(hdrp->low_mask); + M_32_SWAP(hdrp->ffactor); + M_32_SWAP(hdrp->nkeys); + M_32_SWAP(hdrp->hdrpages); + M_32_SWAP(hdrp->h_charkey); + for (i = 0; i < NCACHED; i++) { + M_32_SWAP(hdrp->spares[i]); + M_16_SWAP(hdrp->bitmaps[i]); + } +} +#endif diff --git a/lib/search/hash.h b/lib/search/hash.h new file mode 100644 index 0000000..5f64592 --- /dev/null +++ b/lib/search/hash.h @@ -0,0 +1,317 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)hash.h 8.3 (Berkeley) 5/31/94 + * $FreeBSD: src/lib/libc/db/hash/hash.h,v 1.6 2002/03/21 22:46:26 obrien Exp $ + */ + +#include +#define __need_size_t +#include +#include + +/* Check that newlib understands the byte order of its target system. */ +#ifndef BYTE_ORDER +#error BYTE_ORDER not defined by sys/param.h +#endif + +/* Define DB endianness constants based on target endianness. */ +#define DB_LITTLE_ENDIAN 1234 +#define DB_BIG_ENDIAN 4321 +#if (BYTE_ORDER == LITTLE_ENDIAN) +#define DB_BYTE_ORDER DB_LITTLE_ENDIAN +#else +#define DB_BYTE_ORDER DB_BIG_ENDIAN +#endif + +/* Operations */ +typedef enum { + HASH_GET, HASH_PUT, HASH_PUTNEW, HASH_DELETE, HASH_FIRST, HASH_NEXT +} ACTION; + +/* Buffer Management structures */ +typedef struct _bufhead BUFHEAD; + +struct _bufhead { + BUFHEAD *prev; /* LRU links */ + BUFHEAD *next; /* LRU links */ + BUFHEAD *ovfl; /* Overflow page buffer header */ + __uint32_t addr; /* Address of this page */ + char *page; /* Actual page data */ + char flags; +#define BUF_MOD 0x0001 +#define BUF_DISK 0x0002 +#define BUF_BUCKET 0x0004 +#define BUF_PIN 0x0008 +}; + +#define IS_BUCKET(X) ((X) & BUF_BUCKET) + +typedef BUFHEAD **SEGMENT; + +/* Hash Table Information */ +typedef struct hashhdr { /* Disk resident portion */ + int32_t magic; /* Magic NO for hash tables */ + int32_t version; /* Version ID */ + __uint32_t lorder; /* Byte Order */ + int32_t bsize; /* Bucket/Page Size */ + int32_t bshift; /* Bucket shift */ + int32_t dsize; /* Directory Size */ + int32_t ssize; /* Segment Size */ + int32_t sshift; /* Segment shift */ + int32_t ovfl_point; /* Where overflow pages are being + * allocated */ + int32_t last_freed; /* Last overflow page freed */ + int32_t max_bucket; /* ID of Maximum bucket in use */ + int32_t high_mask; /* Mask to modulo into entire table */ + int32_t low_mask; /* Mask to modulo into lower half of + * table */ + int32_t ffactor; /* Fill factor */ + int32_t nkeys; /* Number of keys in hash table */ + int32_t hdrpages; /* Size of table header */ + int32_t h_charkey; /* value of hash(CHARKEY) */ +#define NCACHED 32 /* number of bit maps and spare + * points */ + int32_t spares[NCACHED];/* spare pages for overflow */ + __uint16_t bitmaps[NCACHED]; /* address of overflow page + * bitmaps */ +} HASHHDR; + +typedef struct htab { /* Memory resident data structure */ + HASHHDR hdr; /* Header */ + int nsegs; /* Number of allocated segments */ + int exsegs; /* Number of extra allocated + * segments */ + __uint32_t /* Hash function */ + (*hash)(const void *, size_t); + int flags; /* Flag values */ + int fp; /* File pointer */ + char *tmp_buf; /* Temporary Buffer for BIG data */ + char *tmp_key; /* Temporary Buffer for BIG keys */ + BUFHEAD *cpage; /* Current page */ + int32_t cbucket; /* Current bucket */ + int cndx; /* Index of next item on cpage */ + int error; /* Error Number -- for DBM + * compatibility */ + int new_file; /* Indicates if fd is backing store + * or no */ + int save_file; /* Indicates whether we need to flush + * file at + * exit */ + __uint32_t *mapp[NCACHED]; /* Pointers to page maps */ + int nmaps; /* Initial number of bitmaps */ + int nbufs; /* Number of buffers left to + * allocate */ + BUFHEAD bufhead; /* Header of buffer lru list */ + SEGMENT *dir; /* Hash Bucket directory */ +} HTAB; + +/* + * Constants + */ +#if INT_MAX == 32767 +#define MAX_BSIZE 4096 +#else +#define MAX_BSIZE 65536 /* 2^16 */ +#endif +#define MIN_BUFFERS 6 +#define MINHDRSIZE 512 +#if INT_MAX == 32767 +#define DEF_BUFSIZE 4096 +#else +#define DEF_BUFSIZE 65536 /* 64 K */ +#endif +#define DEF_BUCKET_SIZE 4096 +#define DEF_BUCKET_SHIFT 12 /* log2(BUCKET) */ +#define DEF_SEGSIZE 256 +#define DEF_SEGSIZE_SHIFT 8 /* log2(SEGSIZE) */ +#define DEF_DIRSIZE 256 +#define DEF_FFACTOR 65536 +#define MIN_FFACTOR 4 +#define SPLTMAX 8 +#define CHARKEY "%$sniglet^&" +#define NUMKEY 1038583 +#define BYTE_SHIFT 3 +#define INT_TO_BYTE 2 +#define INT_BYTE_SHIFT 5 +#define ALL_SET ((__uint32_t)0xFFFFFFFF) +#define ALL_CLEAR 0 + +#define PTROF(X) ((BUFHEAD *)((ptrdiff_t)(X)&~0x3)) +#define ISMOD(X) ((__uint32_t)(ptrdiff_t)(X)&0x1) +#define DOMOD(X) ((X) = (char *)((ptrdiff_t)(X)|0x1)) +#define ISDISK(X) ((__uint32_t)(ptrdiff_t)(X)&0x2) +#define DODISK(X) ((X) = (char *)((ptrdiff_t)(X)|0x2)) + +#define BITS_PER_MAP 32 + +/* Given the address of the beginning of a big map, clear/set the nth bit */ +#define CLRBIT(A, N) ((A)[(N)/BITS_PER_MAP] &= ~(1<<((N)%BITS_PER_MAP))) +#define SETBIT(A, N) ((A)[(N)/BITS_PER_MAP] |= (1<<((N)%BITS_PER_MAP))) +#define ISSET(A, N) ((A)[(N)/BITS_PER_MAP] & (1<<((N)%BITS_PER_MAP))) + +/* Overflow management */ +/* + * Overflow page numbers are allocated per split point. At each doubling of + * the table, we can allocate extra pages. So, an overflow page number has + * the top 5 bits indicate which split point and the lower 11 bits indicate + * which page at that split point is indicated (pages within split points are + * numberered starting with 1). + */ + +#define SPLITSHIFT 11 +#define SPLITMASK 0x7FF +#define SPLITNUM(N) (((__uint32_t)(N)) >> SPLITSHIFT) +#define OPAGENUM(N) ((N) & SPLITMASK) +#define OADDR_OF(S,O) ((__uint32_t)((__uint32_t)(S) << SPLITSHIFT) + (O)) + +#define BUCKET_TO_PAGE(B) \ + (B) + hashp->HDRPAGES + ((B) ? hashp->SPARES[__log2((B)+1)-1] : 0) +#define OADDR_TO_PAGE(B) \ + BUCKET_TO_PAGE ( (1 << SPLITNUM((B))) -1 ) + OPAGENUM((B)); + +/* + * page.h contains a detailed description of the page format. + * + * Normally, keys and data are accessed from offset tables in the top of + * each page which point to the beginning of the key and data. There are + * four flag values which may be stored in these offset tables which indicate + * the following: + * + * + * OVFLPAGE Rather than a key data pair, this pair contains + * the address of an overflow page. The format of + * the pair is: + * OVERFLOW_PAGE_NUMBER OVFLPAGE + * + * PARTIAL_KEY This must be the first key/data pair on a page + * and implies that page contains only a partial key. + * That is, the key is too big to fit on a single page + * so it starts on this page and continues on the next. + * The format of the page is: + * KEY_OFF PARTIAL_KEY OVFL_PAGENO OVFLPAGE + * + * KEY_OFF -- offset of the beginning of the key + * PARTIAL_KEY -- 1 + * OVFL_PAGENO - page number of the next overflow page + * OVFLPAGE -- 0 + * + * FULL_KEY This must be the first key/data pair on the page. It + * is used in two cases. + * + * Case 1: + * There is a complete key on the page but no data + * (because it wouldn't fit). The next page contains + * the data. + * + * Page format it: + * KEY_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE + * + * KEY_OFF -- offset of the beginning of the key + * FULL_KEY -- 2 + * OVFL_PAGENO - page number of the next overflow page + * OVFLPAGE -- 0 + * + * Case 2: + * This page contains no key, but part of a large + * data field, which is continued on the next page. + * + * Page format it: + * DATA_OFF FULL_KEY OVFL_PAGENO OVFL_PAGE + * + * KEY_OFF -- offset of the beginning of the data on + * this page + * FULL_KEY -- 2 + * OVFL_PAGENO - page number of the next overflow page + * OVFLPAGE -- 0 + * + * FULL_KEY_DATA + * This must be the first key/data pair on the page. + * There are two cases: + * + * Case 1: + * This page contains a key and the beginning of the + * data field, but the data field is continued on the + * next page. + * + * Page format is: + * KEY_OFF FULL_KEY_DATA OVFL_PAGENO DATA_OFF + * + * KEY_OFF -- offset of the beginning of the key + * FULL_KEY_DATA -- 3 + * OVFL_PAGENO - page number of the next overflow page + * DATA_OFF -- offset of the beginning of the data + * + * Case 2: + * This page contains the last page of a big data pair. + * There is no key, only the tail end of the data + * on this page. + * + * Page format is: + * DATA_OFF FULL_KEY_DATA + * + * DATA_OFF -- offset of the beginning of the data on + * this page + * FULL_KEY_DATA -- 3 + * OVFL_PAGENO - page number of the next overflow page + * OVFLPAGE -- 0 + * + * OVFL_PAGENO and OVFLPAGE are optional (they are + * not present if there is no next page). + */ + +#define OVFLPAGE 0 +#define PARTIAL_KEY 1 +#define FULL_KEY 2 +#define FULL_KEY_DATA 3 +#define REAL_KEY 4 + +/* Short hands for accessing structure */ +#define BSIZE hdr.bsize +#define BSHIFT hdr.bshift +#define DSIZE hdr.dsize +#define SGSIZE hdr.ssize +#define SSHIFT hdr.sshift +#define LORDER hdr.lorder +#define OVFL_POINT hdr.ovfl_point +#define LAST_FREED hdr.last_freed +#define MAX_BUCKET hdr.max_bucket +#define FFACTOR hdr.ffactor +#define HIGH_MASK hdr.high_mask +#define LOW_MASK hdr.low_mask +#define NKEYS hdr.nkeys +#define HDRPAGES hdr.hdrpages +#define SPARES hdr.spares +#define BITMAPS hdr.bitmaps +#define HASH_VERSION hdr.version +#define MAGIC hdr.magic +#define NEXT_FREE hdr.next_free +#define H_CHARKEY hdr.h_charkey diff --git a/lib/search/hash_bigkey.c b/lib/search/hash_bigkey.c new file mode 100644 index 0000000..e110e46 --- /dev/null +++ b/lib/search/hash_bigkey.c @@ -0,0 +1,666 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)hash_bigkey.c 8.3 (Berkeley) 5/31/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +/* + * PACKAGE: hash + * DESCRIPTION: + * Big key/data handling for the hashing package. + * + * ROUTINES: + * External + * __big_keydata + * __big_split + * __big_insert + * __big_return + * __big_delete + * __find_last_page + * Internal + * collect_key + * collect_data + */ + +#include + +#include +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +#include "db_local.h" +#include "hash.h" +#include "page.h" +#include "extern.h" + +static int collect_key(HTAB *, BUFHEAD *, int, DBT *, int); +static int collect_data(HTAB *, BUFHEAD *, int, int); + +/* + * Big_insert + * + * You need to do an insert and the key/data pair is too big + * + * Returns: + * 0 ==> OK + *-1 ==> ERROR + */ +extern int +__big_insert(hashp, bufp, key, val) + HTAB *hashp; + BUFHEAD *bufp; + const DBT *key, *val; +{ + __uint16_t *p; + int key_size, n, val_size; + __uint16_t space, move_bytes, off; + char *cp, *key_data, *val_data; + + cp = bufp->page; /* Character pointer of p. */ + p = (__uint16_t *)cp; + + key_data = (char *)key->data; + key_size = key->size; + val_data = (char *)val->data; + val_size = val->size; + + /* First move the Key */ + for (space = FREESPACE(p) - BIGOVERHEAD; key_size; + space = FREESPACE(p) - BIGOVERHEAD) { + move_bytes = MIN(space, key_size); + off = OFFSET(p) - move_bytes; + memmove(cp + off, key_data, move_bytes); + key_size -= move_bytes; + key_data += move_bytes; + n = p[0]; + p[++n] = off; + p[0] = ++n; + FREESPACE(p) = off - PAGE_META(n); + OFFSET(p) = off; + p[n] = PARTIAL_KEY; + bufp = __add_ovflpage(hashp, bufp); + if (!bufp) + return (-1); + n = p[0]; + if (!key_size) { + if (FREESPACE(p)) { + move_bytes = MIN(FREESPACE(p), val_size); + off = OFFSET(p) - move_bytes; + p[n] = off; + memmove(cp + off, val_data, move_bytes); + val_data += move_bytes; + val_size -= move_bytes; + p[n - 2] = FULL_KEY_DATA; + FREESPACE(p) = FREESPACE(p) - move_bytes; + OFFSET(p) = off; + } else + p[n - 2] = FULL_KEY; + } + p = (__uint16_t *)bufp->page; + cp = bufp->page; + bufp->flags |= BUF_MOD; + } + + /* Now move the data */ + for (space = FREESPACE(p) - BIGOVERHEAD; val_size; + space = FREESPACE(p) - BIGOVERHEAD) { + move_bytes = MIN(space, val_size); + /* + * Here's the hack to make sure that if the data ends on the + * same page as the key ends, FREESPACE is at least one. + */ + if (space == val_size && val_size == val->size) + move_bytes--; + off = OFFSET(p) - move_bytes; + memmove(cp + off, val_data, move_bytes); + val_size -= move_bytes; + val_data += move_bytes; + n = p[0]; + p[++n] = off; + p[0] = ++n; + FREESPACE(p) = off - PAGE_META(n); + OFFSET(p) = off; + if (val_size) { + p[n] = FULL_KEY; + bufp = __add_ovflpage(hashp, bufp); + if (!bufp) + return (-1); + cp = bufp->page; + p = (__uint16_t *)cp; + } else + p[n] = FULL_KEY_DATA; + bufp->flags |= BUF_MOD; + } + return (0); +} + +/* + * Called when bufp's page contains a partial key (index should be 1) + * + * All pages in the big key/data pair except bufp are freed. We cannot + * free bufp because the page pointing to it is lost and we can't get rid + * of its pointer. + * + * Returns: + * 0 => OK + *-1 => ERROR + */ +extern int +__big_delete(hashp, bufp) + HTAB *hashp; + BUFHEAD *bufp; +{ + BUFHEAD *last_bfp, *rbufp; + __uint16_t *bp, pageno; + int key_done, n; + + rbufp = bufp; + last_bfp = NULL; + bp = (__uint16_t *)bufp->page; + pageno = 0; + key_done = 0; + + while (!key_done || (bp[2] != FULL_KEY_DATA)) { + if (bp[2] == FULL_KEY || bp[2] == FULL_KEY_DATA) + key_done = 1; + + /* + * If there is freespace left on a FULL_KEY_DATA page, then + * the data is short and fits entirely on this page, and this + * is the last page. + */ + if (bp[2] == FULL_KEY_DATA && FREESPACE(bp)) + break; + pageno = bp[bp[0] - 1]; + rbufp->flags |= BUF_MOD; + rbufp = __get_buf(hashp, pageno, rbufp, 0); + if (last_bfp) + __free_ovflpage(hashp, last_bfp); + last_bfp = rbufp; + if (!rbufp) + return (-1); /* Error. */ + bp = (__uint16_t *)rbufp->page; + } + + /* + * If we get here then rbufp points to the last page of the big + * key/data pair. Bufp points to the first one -- it should now be + * empty pointing to the next page after this pair. Can't free it + * because we don't have the page pointing to it. + */ + + /* This is information from the last page of the pair. */ + n = bp[0]; + pageno = bp[n - 1]; + + /* Now, bp is the first page of the pair. */ + bp = (__uint16_t *)bufp->page; + if (n > 2) { + /* There is an overflow page. */ + bp[1] = pageno; + bp[2] = OVFLPAGE; + bufp->ovfl = rbufp->ovfl; + } else + /* This is the last page. */ + bufp->ovfl = NULL; + n -= 2; + bp[0] = n; + FREESPACE(bp) = hashp->BSIZE - PAGE_META(n); + OFFSET(bp) = hashp->BSIZE - 1; + + bufp->flags |= BUF_MOD; + if (rbufp) + __free_ovflpage(hashp, rbufp); + if (last_bfp != rbufp) + __free_ovflpage(hashp, last_bfp); + + hashp->NKEYS--; + return (0); +} +/* + * Returns: + * 0 = key not found + * -1 = get next overflow page + * -2 means key not found and this is big key/data + * -3 error + */ +extern int +__find_bigpair(hashp, bufp, ndx, key, size) + HTAB *hashp; + BUFHEAD *bufp; + int ndx; + char *key; + int size; +{ + __uint16_t *bp; + char *p; + int ksize; + __uint16_t bytes; + char *kkey; + + bp = (__uint16_t *)bufp->page; + p = bufp->page; + ksize = size; + kkey = key; + + for (bytes = hashp->BSIZE - bp[ndx]; + bytes <= size && bp[ndx + 1] == PARTIAL_KEY; + bytes = hashp->BSIZE - bp[ndx]) { + if (memcmp(p + bp[ndx], kkey, bytes)) + return (-2); + kkey += bytes; + ksize -= bytes; + bufp = __get_buf(hashp, bp[ndx + 2], bufp, 0); + if (!bufp) + return (-3); + p = bufp->page; + bp = (__uint16_t *)p; + ndx = 1; + } + + if (bytes != ksize || memcmp(p + bp[ndx], kkey, bytes)) { +#ifdef HASH_STATISTICS + ++hash_collisions; +#endif + return (-2); + } else + return (ndx); +} + +/* + * Given the buffer pointer of the first overflow page of a big pair, + * find the end of the big pair + * + * This will set bpp to the buffer header of the last page of the big pair. + * It will return the pageno of the overflow page following the last page + * of the pair; 0 if there isn't any (i.e. big pair is the last key in the + * bucket) + */ +extern __uint16_t +__find_last_page(hashp, bpp) + HTAB *hashp; + BUFHEAD **bpp; +{ + BUFHEAD *bufp; + __uint16_t *bp, pageno; + int n; + + bufp = *bpp; + bp = (__uint16_t *)bufp->page; + for (;;) { + n = bp[0]; + + /* + * This is the last page if: the tag is FULL_KEY_DATA and + * either only 2 entries OVFLPAGE marker is explicit there + * is freespace on the page. + */ + if (bp[2] == FULL_KEY_DATA && + ((n == 2) || (bp[n] == OVFLPAGE) || (FREESPACE(bp)))) + break; + + pageno = bp[n - 1]; + bufp = __get_buf(hashp, pageno, bufp, 0); + if (!bufp) + return (0); /* Need to indicate an error! */ + bp = (__uint16_t *)bufp->page; + } + + *bpp = bufp; + if (bp[0] > 2) + return (bp[3]); + else + return (0); +} + +/* + * Return the data for the key/data pair that begins on this page at this + * index (index should always be 1). + */ +extern int +__big_return(hashp, bufp, ndx, val, set_current) + HTAB *hashp; + BUFHEAD *bufp; + int ndx; + DBT *val; + int set_current; +{ + BUFHEAD *save_p; + __uint16_t *bp, len, off, save_addr; + char *tp; + + bp = (__uint16_t *)bufp->page; + while (bp[ndx + 1] == PARTIAL_KEY) { + bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!bufp) + return (-1); + bp = (__uint16_t *)bufp->page; + ndx = 1; + } + + if (bp[ndx + 1] == FULL_KEY) { + bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!bufp) + return (-1); + bp = (__uint16_t *)bufp->page; + save_p = bufp; + save_addr = save_p->addr; + off = bp[1]; + len = 0; + } else + if (!FREESPACE(bp)) { + /* + * This is a hack. We can't distinguish between + * FULL_KEY_DATA that contains complete data or + * incomplete data, so we require that if the data + * is complete, there is at least 1 byte of free + * space left. + */ + off = bp[bp[0]]; + len = bp[1] - off; + save_p = bufp; + save_addr = bufp->addr; + bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!bufp) + return (-1); + bp = (__uint16_t *)bufp->page; + } else { + /* The data is all on one page. */ + tp = (char *)bp; + off = bp[bp[0]]; + val->data = (u_char *)tp + off; + val->size = bp[1] - off; + if (set_current) { + if (bp[0] == 2) { /* No more buckets in + * chain */ + hashp->cpage = NULL; + hashp->cbucket++; + hashp->cndx = 1; + } else { + hashp->cpage = __get_buf(hashp, + bp[bp[0] - 1], bufp, 0); + if (!hashp->cpage) + return (-1); + hashp->cndx = 1; + if (!((__uint16_t *) + hashp->cpage->page)[0]) { + hashp->cbucket++; + hashp->cpage = NULL; + } + } + } + return (0); + } + + val->size = collect_data(hashp, bufp, (int)len, set_current); + if (val->size == -1) + return (-1); + if (save_p->addr != save_addr) { + /* We are pretty short on buffers. */ + errno = EINVAL; /* OUT OF BUFFERS */ + return (-1); + } + memmove(hashp->tmp_buf, (save_p->page) + off, len); + val->data = (u_char *)hashp->tmp_buf; + return (0); +} +/* + * Count how big the total datasize is by recursing through the pages. Then + * allocate a buffer and copy the data as you recurse up. + */ +static int +collect_data(hashp, bufp, len, set) + HTAB *hashp; + BUFHEAD *bufp; + int len, set; +{ + __uint16_t *bp; + char *p; + BUFHEAD *xbp; + __uint16_t save_addr; + int mylen, totlen; + + p = bufp->page; + bp = (__uint16_t *)p; + mylen = hashp->BSIZE - bp[1]; + save_addr = bufp->addr; + + if (bp[2] == FULL_KEY_DATA) { /* End of Data */ + totlen = len + mylen; + if (hashp->tmp_buf) + free(hashp->tmp_buf); + if ((hashp->tmp_buf = (char *)malloc(totlen)) == NULL) + return (-1); + if (set) { + hashp->cndx = 1; + if (bp[0] == 2) { /* No more buckets in chain */ + hashp->cpage = NULL; + hashp->cbucket++; + } else { + hashp->cpage = + __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!hashp->cpage) + return (-1); + else if (!((__uint16_t *)hashp->cpage->page)[0]) { + hashp->cbucket++; + hashp->cpage = NULL; + } + } + } + } else { + xbp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!xbp || ((totlen = + collect_data(hashp, xbp, len + mylen, set)) < 1)) + return (-1); + } + if (bufp->addr != save_addr) { + errno = EINVAL; /* Out of buffers. */ + return (-1); + } + memmove(&hashp->tmp_buf[len], (bufp->page) + bp[1], mylen); + return (totlen); +} + +/* + * Fill in the key and data for this big pair. + */ +extern int +__big_keydata(hashp, bufp, key, val, set) + HTAB *hashp; + BUFHEAD *bufp; + DBT *key, *val; + int set; +{ + key->size = collect_key(hashp, bufp, 0, val, set); + if (key->size == -1) + return (-1); + key->data = (u_char *)hashp->tmp_key; + return (0); +} + +/* + * Count how big the total key size is by recursing through the pages. Then + * collect the data, allocate a buffer and copy the key as you recurse up. + */ +static int +collect_key(hashp, bufp, len, val, set) + HTAB *hashp; + BUFHEAD *bufp; + int len; + DBT *val; + int set; +{ + BUFHEAD *xbp; + char *p; + int mylen, totlen; + __uint16_t *bp, save_addr; + + p = bufp->page; + bp = (__uint16_t *)p; + mylen = hashp->BSIZE - bp[1]; + + save_addr = bufp->addr; + totlen = len + mylen; + if (bp[2] == FULL_KEY || bp[2] == FULL_KEY_DATA) { /* End of Key. */ + if (hashp->tmp_key != NULL) + free(hashp->tmp_key); + if ((hashp->tmp_key = (char *)malloc(totlen)) == NULL) + return (-1); + if (__big_return(hashp, bufp, 1, val, set)) + return (-1); + } else { + xbp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!xbp || ((totlen = + collect_key(hashp, xbp, totlen, val, set)) < 1)) + return (-1); + } + if (bufp->addr != save_addr) { + errno = EINVAL; /* MIS -- OUT OF BUFFERS */ + return (-1); + } + memmove(&hashp->tmp_key[len], (bufp->page) + bp[1], mylen); + return (totlen); +} + +/* + * Returns: + * 0 => OK + * -1 => error + */ +extern int +__big_split(hashp, op, np, big_keyp, addr, obucket, ret) + HTAB *hashp; + BUFHEAD *op; /* Pointer to where to put keys that go in old bucket */ + BUFHEAD *np; /* Pointer to new bucket page */ + /* Pointer to first page containing the big key/data */ + BUFHEAD *big_keyp; + int addr; /* Address of big_keyp */ + __uint32_t obucket;/* Old Bucket */ + SPLIT_RETURN *ret; +{ + BUFHEAD *tmpp; + __uint16_t *tp; + BUFHEAD *bp; + DBT key, val; + __uint32_t change; + __uint16_t free_space, n, off; + + bp = big_keyp; + + /* Now figure out where the big key/data goes */ + if (__big_keydata(hashp, big_keyp, &key, &val, 0)) + return (-1); + change = (__call_hash(hashp, key.data, key.size) != obucket); + + if ( (ret->next_addr = __find_last_page(hashp, &big_keyp)) ) { + if (!(ret->nextp = + __get_buf(hashp, ret->next_addr, big_keyp, 0))) + return (-1);; + } else + ret->nextp = NULL; + + /* Now make one of np/op point to the big key/data pair */ +#ifdef DEBUG + assert(np->ovfl == NULL); +#endif + if (change) + tmpp = np; + else + tmpp = op; + + tmpp->flags |= BUF_MOD; +#ifdef DEBUG1 + (void)fprintf(stderr, + "BIG_SPLIT: %d->ovfl was %d is now %d\n", tmpp->addr, + (tmpp->ovfl ? tmpp->ovfl->addr : 0), (bp ? bp->addr : 0)); +#endif + tmpp->ovfl = bp; /* one of op/np point to big_keyp */ + tp = (__uint16_t *)tmpp->page; +#ifdef DEBUG + assert(FREESPACE(tp) >= OVFLSIZE); +#endif + n = tp[0]; + off = OFFSET(tp); + free_space = FREESPACE(tp); + tp[++n] = (__uint16_t)addr; + tp[++n] = OVFLPAGE; + tp[0] = n; + OFFSET(tp) = off; + FREESPACE(tp) = free_space - OVFLSIZE; + + /* + * Finally, set the new and old return values. BIG_KEYP contains a + * pointer to the last page of the big key_data pair. Make sure that + * big_keyp has no following page (2 elements) or create an empty + * following page. + */ + + ret->newp = np; + ret->oldp = op; + + tp = (__uint16_t *)big_keyp->page; + big_keyp->flags |= BUF_MOD; + if (tp[0] > 2) { + /* + * There may be either one or two offsets on this page. If + * there is one, then the overflow page is linked on normally + * and tp[4] is OVFLPAGE. If there are two, tp[4] contains + * the second offset and needs to get stuffed in after the + * next overflow page is added. + */ + n = tp[4]; + free_space = FREESPACE(tp); + off = OFFSET(tp); + tp[0] -= 2; + FREESPACE(tp) = free_space + OVFLSIZE; + OFFSET(tp) = off; + tmpp = __add_ovflpage(hashp, big_keyp); + if (!tmpp) + return (-1); + tp[4] = n; + } else + tmpp = big_keyp; + + if (change) + ret->newp = tmpp; + else + ret->oldp = tmpp; + return (0); +} diff --git a/lib/search/hash_buf.c b/lib/search/hash_buf.c new file mode 100644 index 0000000..2b92168 --- /dev/null +++ b/lib/search/hash_buf.c @@ -0,0 +1,360 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)hash_buf.c 8.5 (Berkeley) 7/15/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +/* + * PACKAGE: hash + * + * DESCRIPTION: + * Contains buffer management + * + * ROUTINES: + * External + * __buf_init + * __get_buf + * __buf_free + * __reclaim_buf + * Internal + * newbuf + */ + +#include + +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +#include "db_local.h" +#include "hash.h" +#include "page.h" +#include "extern.h" + +static BUFHEAD *newbuf(HTAB *, __uint32_t, BUFHEAD *); + +/* Unlink B from its place in the lru */ +#define BUF_REMOVE(B) { \ + (B)->prev->next = (B)->next; \ + (B)->next->prev = (B)->prev; \ +} + +/* Insert B after P */ +#define BUF_INSERT(B, P) { \ + (B)->next = (P)->next; \ + (B)->prev = (P); \ + (P)->next = (B); \ + (B)->next->prev = (B); \ +} + +#define MRU hashp->bufhead.next +#define LRU hashp->bufhead.prev + +#define MRU_INSERT(B) BUF_INSERT((B), &hashp->bufhead) +#define LRU_INSERT(B) BUF_INSERT((B), LRU) + +/* Macros for min/max. */ +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +/* + * We are looking for a buffer with address "addr". If prev_bp is NULL, then + * address is a bucket index. If prev_bp is not NULL, then it points to the + * page previous to an overflow page that we are trying to find. + * + * CAVEAT: The buffer header accessed via prev_bp's ovfl field may no longer + * be valid. Therefore, you must always verify that its address matches the + * address you are seeking. + */ +extern BUFHEAD * +__get_buf(hashp, addr, prev_bp, newpage) + HTAB *hashp; + __uint32_t addr; + BUFHEAD *prev_bp; + int newpage; /* If prev_bp set, indicates a new overflow page. */ +{ + BUFHEAD *bp; + __uint32_t is_disk_mask; + int is_disk, segment_ndx = 0; + SEGMENT segp = NULL; + + is_disk = 0; + is_disk_mask = 0; + if (prev_bp) { + bp = prev_bp->ovfl; + if (!bp || (bp->addr != addr)) + bp = NULL; + if (!newpage) + is_disk = BUF_DISK; + } else { + /* Grab buffer out of directory */ + segment_ndx = addr & (hashp->SGSIZE - 1); + + /* valid segment ensured by __call_hash() */ + segp = hashp->dir[addr >> hashp->SSHIFT]; +#ifdef DEBUG + assert(segp != NULL); +#endif + bp = PTROF(segp[segment_ndx]); + is_disk_mask = ISDISK(segp[segment_ndx]); + is_disk = is_disk_mask || !hashp->new_file; + } + + if (!bp) { + bp = newbuf(hashp, addr, prev_bp); + if (!bp || + __get_page(hashp, bp->page, addr, !prev_bp, is_disk, 0)) + return (NULL); + if (!prev_bp) + segp[segment_ndx] = + (BUFHEAD *)((ptrdiff_t)bp | (intptr_t)is_disk_mask); + } else { + BUF_REMOVE(bp); + MRU_INSERT(bp); + } + return (bp); +} + +/* + * We need a buffer for this page. Either allocate one, or evict a resident + * one (if we have as many buffers as we're allowed) and put this one in. + * + * If newbuf finds an error (returning NULL), it also sets errno. + */ +static BUFHEAD * +newbuf(hashp, addr, prev_bp) + HTAB *hashp; + __uint32_t addr; + BUFHEAD *prev_bp; +{ + BUFHEAD *bp; /* The buffer we're going to use */ + BUFHEAD *xbp; /* Temp pointer */ + BUFHEAD *next_xbp; + SEGMENT segp; + int segment_ndx; + __uint16_t oaddr, *shortp; + + oaddr = 0; + bp = LRU; + /* + * If LRU buffer is pinned, the buffer pool is too small. We need to + * allocate more buffers. + */ + if (hashp->nbufs || (bp->flags & BUF_PIN)) { + /* Allocate a new one */ + if ((bp = (BUFHEAD *)malloc(sizeof(BUFHEAD))) == NULL) + return (NULL); +#ifdef PURIFY + memset(bp, 0xff, sizeof(BUFHEAD)); +#endif + if ((bp->page = (char *)malloc(hashp->BSIZE)) == NULL) { + free(bp); + return (NULL); + } +#ifdef PURIFY + memset(bp->page, 0xff, hashp->BSIZE); +#endif + if (hashp->nbufs) + hashp->nbufs--; + } else { + /* Kick someone out */ + BUF_REMOVE(bp); + /* + * If this is an overflow page with addr 0, it's already been + * flushed back in an overflow chain and initialized. + */ + if ((bp->addr != 0) || (bp->flags & BUF_BUCKET)) { + /* + * Set oaddr before __put_page so that you get it + * before bytes are swapped. + */ + shortp = (__uint16_t *)bp->page; + if (shortp[0]) + oaddr = shortp[shortp[0] - 1]; + if ((bp->flags & BUF_MOD) && __put_page(hashp, bp->page, + bp->addr, (int)IS_BUCKET(bp->flags), 0)) + return (NULL); + /* + * Update the pointer to this page (i.e. invalidate it). + * + * If this is a new file (i.e. we created it at open + * time), make sure that we mark pages which have been + * written to disk so we retrieve them from disk later, + * rather than allocating new pages. + */ + if (IS_BUCKET(bp->flags)) { + segment_ndx = bp->addr & (hashp->SGSIZE - 1); + segp = hashp->dir[bp->addr >> hashp->SSHIFT]; +#ifdef DEBUG + assert(segp != NULL); +#endif + + if (hashp->new_file && + ((bp->flags & BUF_MOD) || + ISDISK(segp[segment_ndx]))) + segp[segment_ndx] = (BUFHEAD *)BUF_DISK; + else + segp[segment_ndx] = NULL; + } + /* + * Since overflow pages can only be access by means of + * their bucket, free overflow pages associated with + * this bucket. + */ + for (xbp = bp; xbp->ovfl;) { + next_xbp = xbp->ovfl; + xbp->ovfl = 0; + xbp = next_xbp; + + /* Check that ovfl pointer is up date. */ + if (IS_BUCKET(xbp->flags) || + (oaddr != xbp->addr)) + break; + + shortp = (__uint16_t *)xbp->page; + if (shortp[0]) + /* set before __put_page */ + oaddr = shortp[shortp[0] - 1]; + if ((xbp->flags & BUF_MOD) && __put_page(hashp, + xbp->page, xbp->addr, 0, 0)) + return (NULL); + xbp->addr = 0; + xbp->flags = 0; + BUF_REMOVE(xbp); + LRU_INSERT(xbp); + } + } + } + + /* Now assign this buffer */ + bp->addr = addr; +#ifdef DEBUG1 + (void)fprintf(stderr, "NEWBUF1: %d->ovfl was %d is now %d\n", + bp->addr, (bp->ovfl ? bp->ovfl->addr : 0), 0); +#endif + bp->ovfl = NULL; + if (prev_bp) { + /* + * If prev_bp is set, this is an overflow page, hook it in to + * the buffer overflow links. + */ +#ifdef DEBUG1 + (void)fprintf(stderr, "NEWBUF2: %d->ovfl was %d is now %d\n", + prev_bp->addr, (prev_bp->ovfl ? bp->ovfl->addr : 0), + (bp ? bp->addr : 0)); +#endif + prev_bp->ovfl = bp; + bp->flags = 0; + } else + bp->flags = BUF_BUCKET; + MRU_INSERT(bp); + return (bp); +} + +extern void +__buf_init(hashp, nbytes) + HTAB *hashp; + int nbytes; +{ + BUFHEAD *bfp; + int npages; + + bfp = &(hashp->bufhead); + npages = (nbytes + hashp->BSIZE - 1) >> hashp->BSHIFT; + npages = MAX(npages, MIN_BUFFERS); + + hashp->nbufs = npages; + bfp->next = bfp; + bfp->prev = bfp; + /* + * This space is calloc'd so these are already null. + * + * bfp->ovfl = NULL; + * bfp->flags = 0; + * bfp->page = NULL; + * bfp->addr = 0; + */ +} + +extern int +__buf_free(hashp, do_free, to_disk) + HTAB *hashp; + int do_free, to_disk; +{ + BUFHEAD *bp; + + /* Need to make sure that buffer manager has been initialized */ + if (!LRU) + return (0); + for (bp = LRU; bp != &hashp->bufhead;) { + /* Check that the buffer is valid */ + if (bp->addr || IS_BUCKET(bp->flags)) { + if (to_disk && (bp->flags & BUF_MOD) && + __put_page(hashp, bp->page, + bp->addr, IS_BUCKET(bp->flags), 0)) + return (-1); + } + /* Check if we are freeing stuff */ + if (do_free) { + if (bp->page) + free(bp->page); + BUF_REMOVE(bp); + free(bp); + bp = LRU; + } else + bp = bp->prev; + } + return (0); +} + +extern void +__reclaim_buf(hashp, bp) + HTAB *hashp; + BUFHEAD *bp; +{ + bp->ovfl = 0; + bp->addr = 0; + bp->flags = 0; + BUF_REMOVE(bp); + LRU_INSERT(bp); +} diff --git a/lib/search/hash_func.c b/lib/search/hash_func.c new file mode 100644 index 0000000..30263d0 --- /dev/null +++ b/lib/search/hash_func.c @@ -0,0 +1,216 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)hash_func.c 8.2 (Berkeley) 2/21/94"; +#endif /* LIBC_SCCS and not lint */ +#include +#include + +#include "db_local.h" +#include "hash.h" +#include "page.h" +#include "extern.h" + +#if 0 +static __uint32_t hash1(const void *, size_t); +static __uint32_t hash2(const void *, size_t); +static __uint32_t hash3(const void *, size_t); +#endif +static __uint32_t hash4(const void *, size_t); + +/* Global default hash function */ +__uint32_t (*__default_hash)(const void *, size_t) = hash4; + +/* + * HASH FUNCTIONS + * + * Assume that we've already split the bucket to which this key hashes, + * calculate that bucket, and check that in fact we did already split it. + * + * This came from ejb's hsearch. + */ + +#define PRIME1 37 +#define PRIME2 1048583 + +#if 0 +static __uint32_t +hash1(keyarg, len) + const void *keyarg; + size_t len; +{ + const u_char *key; + __uint32_t h; + + /* Convert string to integer */ + for (key = keyarg, h = 0; len--;) + h = h * PRIME1 ^ (*key++ - ' '); + h %= PRIME2; + return (h); +} +#endif + +/* + * Phong's linear congruential hash + */ +#define dcharhash(h, c) ((h) = 0x63c63cd9*(h) + 0x9c39c33d + (c)) + +#if 0 +static __uint32_t +hash2(keyarg, len) + const void *keyarg; + size_t len; +{ + const u_char *e, *key; + __uint32_t h; + u_char c; + + key = keyarg; + e = key + len; + for (h = 0; key != e;) { + c = *key++; + if (!c && key > e) + break; + dcharhash(h, c); + } + return (h); +} +#endif + +/* + * This is INCREDIBLY ugly, but fast. We break the string up into 8 byte + * units. On the first time through the loop we get the "leftover bytes" + * (strlen % 8). On every other iteration, we perform 8 HASHC's so we handle + * all 8 bytes. Essentially, this saves us 7 cmp & branch instructions. If + * this routine is heavily used enough, it's worth the ugly coding. + * + * OZ's original sdbm hash + */ +#if 0 +static __uint32_t +hash3(keyarg, len) + const void *keyarg; + size_t len; +{ + const u_char *key; + size_t loop; + __uint32_t h; + +#define HASHC h = *key++ + 65599 * h + + h = 0; + key = keyarg; + if (len > 0) { + loop = (len + 8 - 1) >> 3; + + switch (len & (8 - 1)) { + case 0: + do { + HASHC; + /* FALLTHROUGH */ + case 7: + HASHC; + /* FALLTHROUGH */ + case 6: + HASHC; + /* FALLTHROUGH */ + case 5: + HASHC; + /* FALLTHROUGH */ + case 4: + HASHC; + /* FALLTHROUGH */ + case 3: + HASHC; + /* FALLTHROUGH */ + case 2: + HASHC; + /* FALLTHROUGH */ + case 1: + HASHC; + } while (--loop); + } + } + return (h); +} +#endif + +/* Hash function from Chris Torek. */ +static __uint32_t +hash4(keyarg, len) + const void *keyarg; + size_t len; +{ + const u_char *key; + size_t loop; + __uint32_t h; + +#define HASH4a h = (h << 5) - h + *key++; +#define HASH4b h = (h << 5) + h + *key++; +#define HASH4 HASH4b + + h = 0; + key = keyarg; + if (len > 0) { + loop = (len + 8 - 1) >> 3; + + switch (len & (8 - 1)) { + case 0: + do { + HASH4; + /* FALLTHROUGH */ + case 7: + HASH4; + /* FALLTHROUGH */ + case 6: + HASH4; + /* FALLTHROUGH */ + case 5: + HASH4; + /* FALLTHROUGH */ + case 4: + HASH4; + /* FALLTHROUGH */ + case 3: + HASH4; + /* FALLTHROUGH */ + case 2: + HASH4; + /* FALLTHROUGH */ + case 1: + HASH4; + } while (--loop); + } + } + return (h); +} diff --git a/lib/search/hash_log2.c b/lib/search/hash_log2.c new file mode 100644 index 0000000..622c228 --- /dev/null +++ b/lib/search/hash_log2.c @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)hash_log2.c 8.2 (Berkeley) 5/31/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +#include + +#include "db_local.h" + +__uint32_t +__log2(num) + __uint32_t num; +{ + __uint32_t i, limit; + + limit = 1; + for (i = 0; limit < num; limit = limit << 1, i++); + return (i); +} diff --git a/lib/search/hash_page.c b/lib/search/hash_page.c new file mode 100644 index 0000000..9d15b0c --- /dev/null +++ b/lib/search/hash_page.c @@ -0,0 +1,944 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)hash_page.c 8.7 (Berkeley) 8/16/94"; +#endif /* LIBC_SCCS and not lint */ +#include + +/* + * PACKAGE: hashing + * + * DESCRIPTION: + * Page manipulation for hashing package. + * + * ROUTINES: + * + * External + * __get_page + * __add_ovflpage + * Internal + * overflow_page + * open_temp + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#ifdef DEBUG +#include +#endif + +#include "db_local.h" +#include "hash.h" +#include "page.h" +#include "extern.h" + +static __uint32_t *fetch_bitmap(HTAB *, int); +static __uint32_t first_free(__uint32_t); +static int open_temp(HTAB *); +static __uint16_t overflow_page(HTAB *); +static void putpair(char *, const DBT *, const DBT *); +static void squeeze_key(__uint16_t *, const DBT *, const DBT *); +static int ugly_split +(HTAB *, __uint32_t, BUFHEAD *, BUFHEAD *, int, int); + +#define PAGE_INIT(P) { \ + ((__uint16_t *)(P))[0] = 0; \ + ((__uint16_t *)(P))[1] = hashp->BSIZE - 3 * sizeof(__uint16_t); \ + ((__uint16_t *)(P))[2] = hashp->BSIZE; \ +} + +/* + * This is called AFTER we have verified that there is room on the page for + * the pair (PAIRFITS has returned true) so we go right ahead and start moving + * stuff on. + */ +static void +putpair(p, key, val) + char *p; + const DBT *key, *val; +{ + __uint16_t *bp, n, off; + + bp = (__uint16_t *)p; + + /* Enter the key first. */ + n = bp[0]; + + off = OFFSET(bp) - key->size; + memmove(p + off, key->data, key->size); + bp[++n] = off; + + /* Now the data. */ + off -= val->size; + memmove(p + off, val->data, val->size); + bp[++n] = off; + + /* Adjust page info. */ + bp[0] = n; + bp[n + 1] = off - ((n + 3) * sizeof(__uint16_t)); + bp[n + 2] = off; +} + +/* + * Returns: + * 0 OK + * -1 error + */ +extern int +__delpair(hashp, bufp, ndx) + HTAB *hashp; + BUFHEAD *bufp; + int ndx; +{ + __uint16_t *bp, newoff; + int n; + __uint16_t pairlen; + + bp = (__uint16_t *)bufp->page; + n = bp[0]; + + if (bp[ndx + 1] < REAL_KEY) + return (__big_delete(hashp, bufp)); + if (ndx != 1) + newoff = bp[ndx - 1]; + else + newoff = hashp->BSIZE; + pairlen = newoff - bp[ndx + 1]; + + if (ndx != (n - 1)) { + /* Hard Case -- need to shuffle keys */ + int i; + char *src = bufp->page + (int)OFFSET(bp); + char *dst = src + (int)pairlen; + memmove(dst, src, bp[ndx + 1] - OFFSET(bp)); + + /* Now adjust the pointers */ + for (i = ndx + 2; i <= n; i += 2) { + if (bp[i + 1] == OVFLPAGE) { + bp[i - 2] = bp[i]; + bp[i - 1] = bp[i + 1]; + } else { + bp[i - 2] = bp[i] + pairlen; + bp[i - 1] = bp[i + 1] + pairlen; + } + } + } + /* Finally adjust the page data */ + bp[n] = OFFSET(bp) + pairlen; + bp[n - 1] = bp[n + 1] + pairlen + 2 * sizeof(__uint16_t); + bp[0] = n - 2; + hashp->NKEYS--; + + bufp->flags |= BUF_MOD; + return (0); +} +/* + * Returns: + * 0 ==> OK + * -1 ==> Error + */ +extern int +__split_page(hashp, obucket, nbucket) + HTAB *hashp; + __uint32_t obucket, nbucket; +{ + BUFHEAD *new_bufp, *old_bufp; + __uint16_t *ino; + char *np; + DBT key, val; + int n, ndx, retval; + __uint16_t copyto, diff, off, moved; + char *op; + + copyto = (__uint16_t)hashp->BSIZE; + off = (__uint16_t)hashp->BSIZE; + old_bufp = __get_buf(hashp, obucket, NULL, 0); + if (old_bufp == NULL) + return (-1); + new_bufp = __get_buf(hashp, nbucket, NULL, 0); + if (new_bufp == NULL) + return (-1); + + old_bufp->flags |= (BUF_MOD | BUF_PIN); + new_bufp->flags |= (BUF_MOD | BUF_PIN); + + ino = (__uint16_t *)(op = old_bufp->page); + np = new_bufp->page; + + moved = 0; + + for (n = 1, ndx = 1; n < ino[0]; n += 2) { + if (ino[n + 1] < REAL_KEY) { + retval = ugly_split(hashp, obucket, old_bufp, new_bufp, + (int)copyto, (int)moved); + old_bufp->flags &= ~BUF_PIN; + new_bufp->flags &= ~BUF_PIN; + return (retval); + + } + key.data = (u_char *)op + ino[n]; + key.size = off - ino[n]; + + if (__call_hash(hashp, key.data, key.size) == obucket) { + /* Don't switch page */ + diff = copyto - off; + if (diff) { + copyto = ino[n + 1] + diff; + memmove(op + copyto, op + ino[n + 1], + off - ino[n + 1]); + ino[ndx] = copyto + ino[n] - ino[n + 1]; + ino[ndx + 1] = copyto; + } else + copyto = ino[n + 1]; + ndx += 2; + } else { + /* Switch page */ + val.data = (u_char *)op + ino[n + 1]; + val.size = ino[n] - ino[n + 1]; + putpair(np, &key, &val); + moved += 2; + } + + off = ino[n + 1]; + } + + /* Now clean up the page */ + ino[0] -= moved; + FREESPACE(ino) = copyto - sizeof(__uint16_t) * (ino[0] + 3); + OFFSET(ino) = copyto; + +#ifdef DEBUG3 + (void)fprintf(stderr, "split %d/%d\n", + ((__uint16_t *)np)[0] / 2, + ((__uint16_t *)op)[0] / 2); +#endif + /* unpin both pages */ + old_bufp->flags &= ~BUF_PIN; + new_bufp->flags &= ~BUF_PIN; + return (0); +} + +/* + * Called when we encounter an overflow or big key/data page during split + * handling. This is special cased since we have to begin checking whether + * the key/data pairs fit on their respective pages and because we may need + * overflow pages for both the old and new pages. + * + * The first page might be a page with regular key/data pairs in which case + * we have a regular overflow condition and just need to go on to the next + * page or it might be a big key/data pair in which case we need to fix the + * big key/data pair. + * + * Returns: + * 0 ==> success + * -1 ==> failure + */ +static int +ugly_split(hashp, obucket, old_bufp, new_bufp, copyto, moved) + HTAB *hashp; + __uint32_t obucket; /* Same as __split_page. */ + BUFHEAD *old_bufp, *new_bufp; + int copyto; /* First byte on page which contains key/data values. */ + int moved; /* Number of pairs moved to new page. */ +{ + BUFHEAD *bufp; /* Buffer header for ino */ + __uint16_t *ino; /* Page keys come off of */ + __uint16_t *np; /* New page */ + __uint16_t *op; /* Page keys go on to if they aren't moving */ + + BUFHEAD *last_bfp; /* Last buf header OVFL needing to be freed */ + DBT key, val; + SPLIT_RETURN ret; + __uint16_t n, off, ov_addr, scopyto; + char *cino; /* Character value of ino */ + + bufp = old_bufp; + ino = (__uint16_t *)old_bufp->page; + np = (__uint16_t *)new_bufp->page; + op = (__uint16_t *)old_bufp->page; + last_bfp = NULL; + scopyto = (__uint16_t)copyto; /* ANSI */ + + n = ino[0] - 1; + while (n < ino[0]) { + if (ino[2] < REAL_KEY && ino[2] != OVFLPAGE) { + if (__big_split(hashp, old_bufp, + new_bufp, bufp, bufp->addr, obucket, &ret)) + return (-1); + old_bufp = ret.oldp; + if (!old_bufp) + return (-1); + op = (__uint16_t *)old_bufp->page; + new_bufp = ret.newp; + if (!new_bufp) + return (-1); + np = (__uint16_t *)new_bufp->page; + bufp = ret.nextp; + if (!bufp) + return (0); + cino = (char *)bufp->page; + ino = (__uint16_t *)cino; + last_bfp = ret.nextp; + } else if (ino[n + 1] == OVFLPAGE) { + ov_addr = ino[n]; + /* + * Fix up the old page -- the extra 2 are the fields + * which contained the overflow information. + */ + ino[0] -= (moved + 2); + FREESPACE(ino) = + scopyto - sizeof(__uint16_t) * (ino[0] + 3); + OFFSET(ino) = scopyto; + + bufp = __get_buf(hashp, ov_addr, bufp, 0); + if (!bufp) + return (-1); + + ino = (__uint16_t *)bufp->page; + n = 1; + scopyto = hashp->BSIZE; + moved = 0; + + if (last_bfp) + __free_ovflpage(hashp, last_bfp); + last_bfp = bufp; + } + /* Move regular sized pairs of there are any */ + off = hashp->BSIZE; + for (n = 1; (n < ino[0]) && (ino[n + 1] >= REAL_KEY); n += 2) { + cino = (char *)ino; + key.data = (u_char *)cino + ino[n]; + key.size = off - ino[n]; + val.data = (u_char *)cino + ino[n + 1]; + val.size = ino[n] - ino[n + 1]; + off = ino[n + 1]; + + if (__call_hash(hashp, key.data, key.size) == obucket) { + /* Keep on old page */ + if (PAIRFITS(op, (&key), (&val))) + putpair((char *)op, &key, &val); + else { + old_bufp = + __add_ovflpage(hashp, old_bufp); + if (!old_bufp) + return (-1); + op = (__uint16_t *)old_bufp->page; + putpair((char *)op, &key, &val); + } + old_bufp->flags |= BUF_MOD; + } else { + /* Move to new page */ + if (PAIRFITS(np, (&key), (&val))) + putpair((char *)np, &key, &val); + else { + new_bufp = + __add_ovflpage(hashp, new_bufp); + if (!new_bufp) + return (-1); + np = (__uint16_t *)new_bufp->page; + putpair((char *)np, &key, &val); + } + new_bufp->flags |= BUF_MOD; + } + } + } + if (last_bfp) + __free_ovflpage(hashp, last_bfp); + return (0); +} + +/* + * Add the given pair to the page + * + * Returns: + * 0 ==> OK + * 1 ==> failure + */ +extern int +__addel(hashp, bufp, key, val) + HTAB *hashp; + BUFHEAD *bufp; + const DBT *key, *val; +{ + __uint16_t *bp, *sop; + int do_expand; + + bp = (__uint16_t *)bufp->page; + do_expand = 0; + while (bp[0] && (bp[2] < REAL_KEY || bp[bp[0]] < REAL_KEY)) + /* Exception case */ + if (bp[2] == FULL_KEY_DATA && bp[0] == 2) + /* This is the last page of a big key/data pair + and we need to add another page */ + break; + else if (bp[2] < REAL_KEY && bp[bp[0]] != OVFLPAGE) { + bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!bufp) + return (-1); + bp = (__uint16_t *)bufp->page; + } else + /* Try to squeeze key on this page */ + if (FREESPACE(bp) > PAIRSIZE(key, val)) { + squeeze_key(bp, key, val); + return (0); + } else { + bufp = __get_buf(hashp, bp[bp[0] - 1], bufp, 0); + if (!bufp) + return (-1); + bp = (__uint16_t *)bufp->page; + } + + if (PAIRFITS(bp, key, val)) + putpair(bufp->page, key, val); + else { + do_expand = 1; + bufp = __add_ovflpage(hashp, bufp); + if (!bufp) + return (-1); + sop = (__uint16_t *)bufp->page; + + if (PAIRFITS(sop, key, val)) + putpair((char *)sop, key, val); + else + if (__big_insert(hashp, bufp, key, val)) + return (-1); + } + bufp->flags |= BUF_MOD; + /* + * If the average number of keys per bucket exceeds the fill factor, + * expand the table. + */ + hashp->NKEYS++; + if (do_expand || + (hashp->NKEYS / (hashp->MAX_BUCKET + 1) > hashp->FFACTOR)) + return (__expand_table(hashp)); + return (0); +} + +/* + * + * Returns: + * pointer on success + * NULL on error + */ +extern BUFHEAD * +__add_ovflpage(hashp, bufp) + HTAB *hashp; + BUFHEAD *bufp; +{ + __uint16_t *sp; + __uint16_t ndx, ovfl_num; +#ifdef DEBUG1 + int tmp1, tmp2; +#endif + sp = (__uint16_t *)bufp->page; + + /* Check if we are dynamically determining the fill factor */ + if (hashp->FFACTOR == DEF_FFACTOR) { + hashp->FFACTOR = sp[0] >> 1; + if (hashp->FFACTOR < MIN_FFACTOR) + hashp->FFACTOR = MIN_FFACTOR; + } + bufp->flags |= BUF_MOD; + ovfl_num = overflow_page(hashp); +#ifdef DEBUG1 + tmp1 = bufp->addr; + tmp2 = bufp->ovfl ? bufp->ovfl->addr : 0; +#endif + if (!ovfl_num || !(bufp->ovfl = __get_buf(hashp, ovfl_num, bufp, 1))) + return (NULL); + bufp->ovfl->flags |= BUF_MOD; +#ifdef DEBUG1 + (void)fprintf(stderr, "ADDOVFLPAGE: %d->ovfl was %d is now %d\n", + tmp1, tmp2, bufp->ovfl->addr); +#endif + ndx = sp[0]; + /* + * Since a pair is allocated on a page only if there's room to add + * an overflow page, we know that the OVFL information will fit on + * the page. + */ + sp[ndx + 4] = OFFSET(sp); + sp[ndx + 3] = FREESPACE(sp) - OVFLSIZE; + sp[ndx + 1] = ovfl_num; + sp[ndx + 2] = OVFLPAGE; + sp[0] = ndx + 2; +#ifdef HASH_STATISTICS + hash_overflows++; +#endif + return (bufp->ovfl); +} + +/* + * Returns: + * 0 indicates SUCCESS + * -1 indicates FAILURE + */ +extern int +__get_page(hashp, p, bucket, is_bucket, is_disk, is_bitmap) + HTAB *hashp; + char *p; + __uint32_t bucket; + int is_bucket, is_disk, is_bitmap; +{ + int fd, page, size; + int rsize; + __uint16_t *bp; + + fd = hashp->fp; + size = hashp->BSIZE; + + if ((fd == -1) || !is_disk) { + PAGE_INIT(p); + return (0); + } + if (is_bucket) + page = BUCKET_TO_PAGE(bucket); + else + page = OADDR_TO_PAGE(bucket); + if ((lseek(fd, (off_t)page << hashp->BSHIFT, SEEK_SET) == -1) || + ((rsize = read(fd, p, size)) == -1)) + return (-1); + bp = (__uint16_t *)p; + if (!rsize) + bp[0] = 0; /* We hit the EOF, so initialize a new page */ + else + if (rsize != size) { + errno = EFTYPE; + return (-1); + } + if (!is_bitmap && !bp[0]) { + PAGE_INIT(p); + } else + if (hashp->LORDER != DB_BYTE_ORDER) { + int i, max; + + if (is_bitmap) { + max = hashp->BSIZE >> 2; /* divide by 4 */ + for (i = 0; i < max; i++) + M_32_SWAP(((int *)p)[i]); + } else { + M_16_SWAP(bp[0]); + max = bp[0] + 2; + for (i = 1; i <= max; i++) + M_16_SWAP(bp[i]); + } + } + return (0); +} + +/* + * Write page p to disk + * + * Returns: + * 0 ==> OK + * -1 ==>failure + */ +extern int +__put_page(hashp, p, bucket, is_bucket, is_bitmap) + HTAB *hashp; + char *p; + __uint32_t bucket; + int is_bucket, is_bitmap; +{ + int fd, page, size; + int wsize; + + size = hashp->BSIZE; + if ((hashp->fp == -1) && open_temp(hashp)) + return (-1); + fd = hashp->fp; + + if (hashp->LORDER != DB_BYTE_ORDER) { + int i; + int max; + + if (is_bitmap) { + max = hashp->BSIZE >> 2; /* divide by 4 */ + for (i = 0; i < max; i++) + M_32_SWAP(((int *)p)[i]); + } else { + max = ((__uint16_t *)p)[0] + 2; + for (i = 0; i <= max; i++) + M_16_SWAP(((__uint16_t *)p)[i]); + } + } + if (is_bucket) + page = BUCKET_TO_PAGE(bucket); + else + page = OADDR_TO_PAGE(bucket); + if ((lseek(fd, (off_t)page << hashp->BSHIFT, SEEK_SET) == -1) || + ((wsize = write(fd, p, size)) == -1)) + /* Errno is set */ + return (-1); + if (wsize != size) { + errno = EFTYPE; + return (-1); + } + return (0); +} + +#define BYTE_MASK ((1 << INT_BYTE_SHIFT) -1) +/* + * Initialize a new bitmap page. Bitmap pages are left in memory + * once they are read in. + */ +extern int +__ibitmap(hashp, pnum, nbits, ndx) + HTAB *hashp; + int pnum, nbits, ndx; +{ + __uint32_t *ip; + int clearbytes, clearints; + + if ((ip = (__uint32_t *)malloc(hashp->BSIZE)) == NULL) + return (1); + hashp->nmaps++; + clearints = ((nbits - 1) >> INT_BYTE_SHIFT) + 1; + clearbytes = clearints << INT_TO_BYTE; + (void)memset((char *)ip, 0, clearbytes); + (void)memset(((char *)ip) + clearbytes, 0xFF, + hashp->BSIZE - clearbytes); + ip[clearints - 1] = ALL_SET << (nbits & BYTE_MASK); + SETBIT(ip, 0); + hashp->BITMAPS[ndx] = (__uint16_t)pnum; + hashp->mapp[ndx] = ip; + return (0); +} + +static __uint32_t +first_free(map) + __uint32_t map; +{ + __uint32_t i, mask; + + mask = 0x1; + for (i = 0; i < BITS_PER_MAP; i++) { + if (!(mask & map)) + return (i); + mask = mask << 1; + } + return (i); +} + +static __uint16_t +overflow_page(hashp) + HTAB *hashp; +{ + __uint32_t *freep = NULL; + int max_free, offset, splitnum; + __uint16_t addr; + int bit, first_page, free_bit, free_page, i, in_use_bits, j; +#ifdef DEBUG2 + int tmp1, tmp2; +#endif + splitnum = hashp->OVFL_POINT; + max_free = hashp->SPARES[splitnum]; + + free_page = (max_free - 1) >> (hashp->BSHIFT + BYTE_SHIFT); + free_bit = (max_free - 1) & ((hashp->BSIZE << BYTE_SHIFT) - 1); + + /* Look through all the free maps to find the first free block */ + first_page = hashp->LAST_FREED >>(hashp->BSHIFT + BYTE_SHIFT); + for ( i = first_page; i <= free_page; i++ ) { + if (!(freep = (__uint32_t *)hashp->mapp[i]) && + !(freep = fetch_bitmap(hashp, i))) + return (0); + if (i == free_page) + in_use_bits = free_bit; + else + in_use_bits = (hashp->BSIZE << BYTE_SHIFT) - 1; + + if (i == first_page) { + bit = hashp->LAST_FREED & + ((hashp->BSIZE << BYTE_SHIFT) - 1); + j = bit / BITS_PER_MAP; + bit = bit & ~(BITS_PER_MAP - 1); + } else { + bit = 0; + j = 0; + } + for (; bit <= in_use_bits; j++, bit += BITS_PER_MAP) + if (freep[j] != ALL_SET) + goto found; + } + + /* No Free Page Found */ + hashp->LAST_FREED = hashp->SPARES[splitnum]; + hashp->SPARES[splitnum]++; + offset = hashp->SPARES[splitnum] - + (splitnum ? hashp->SPARES[splitnum - 1] : 0); + +#define OVMSG "HASH: Out of overflow pages. Increase page size\n" + if (offset > SPLITMASK) { + if (++splitnum >= NCACHED) { + (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1); + return (0); + } + hashp->OVFL_POINT = splitnum; + hashp->SPARES[splitnum] = hashp->SPARES[splitnum-1]; + hashp->SPARES[splitnum-1]--; + offset = 1; + } + + /* Check if we need to allocate a new bitmap page */ + if (free_bit == (hashp->BSIZE << BYTE_SHIFT) - 1) { + free_page++; + if (free_page >= NCACHED) { + (void)write(STDERR_FILENO, OVMSG, sizeof(OVMSG) - 1); + return (0); + } + /* + * This is tricky. The 1 indicates that you want the new page + * allocated with 1 clear bit. Actually, you are going to + * allocate 2 pages from this map. The first is going to be + * the map page, the second is the overflow page we were + * looking for. The init_bitmap routine automatically, sets + * the first bit of itself to indicate that the bitmap itself + * is in use. We would explicitly set the second bit, but + * don't have to if we tell init_bitmap not to leave it clear + * in the first place. + */ + if (__ibitmap(hashp, + (int)OADDR_OF(splitnum, offset), 1, free_page)) + return (0); + hashp->SPARES[splitnum]++; +#ifdef DEBUG2 + free_bit = 2; +#endif + offset++; + if (offset > SPLITMASK) { + if (++splitnum >= NCACHED) { + (void)write(STDERR_FILENO, OVMSG, + sizeof(OVMSG) - 1); + return (0); + } + hashp->OVFL_POINT = splitnum; + hashp->SPARES[splitnum] = hashp->SPARES[splitnum-1]; + hashp->SPARES[splitnum-1]--; + offset = 0; + } + } else { + /* + * Free_bit addresses the last used bit. Bump it to address + * the first available bit. + */ + free_bit++; + SETBIT(freep, free_bit); + } + + /* Calculate address of the new overflow page */ + addr = OADDR_OF(splitnum, offset); +#ifdef DEBUG2 + (void)fprintf(stderr, "OVERFLOW_PAGE: ADDR: %d BIT: %d PAGE %d\n", + addr, free_bit, free_page); +#endif + return (addr); + +found: + bit = bit + first_free(freep[j]); + SETBIT(freep, bit); +#ifdef DEBUG2 + tmp1 = bit; + tmp2 = i; +#endif + /* + * Bits are addressed starting with 0, but overflow pages are addressed + * beginning at 1. Bit is a bit addressnumber, so we need to increment + * it to convert it to a page number. + */ + bit = 1 + bit + (i * (hashp->BSIZE << BYTE_SHIFT)); + if (bit >= hashp->LAST_FREED) + hashp->LAST_FREED = bit - 1; + + /* Calculate the split number for this page */ + for (i = 0; (i < splitnum) && (bit > hashp->SPARES[i]); i++); + offset = (i ? bit - hashp->SPARES[i - 1] : bit); + if (offset >= SPLITMASK) + return (0); /* Out of overflow pages */ + addr = OADDR_OF(i, offset); +#ifdef DEBUG2 + (void)fprintf(stderr, "OVERFLOW_PAGE: ADDR: %d BIT: %d PAGE %d\n", + addr, tmp1, tmp2); +#endif + + /* Allocate and return the overflow page */ + return (addr); +} + +/* + * Mark this overflow page as free. + */ +extern void +__free_ovflpage(hashp, obufp) + HTAB *hashp; + BUFHEAD *obufp; +{ + __uint16_t addr; + __uint32_t *freep; + int bit_address, free_page, free_bit; + __uint16_t ndx; + + addr = obufp->addr; +#ifdef DEBUG1 + (void)fprintf(stderr, "Freeing %d\n", addr); +#endif + ndx = (((__uint16_t)addr) >> SPLITSHIFT); + bit_address = + (ndx ? hashp->SPARES[ndx - 1] : 0) + (addr & SPLITMASK) - 1; + if (bit_address < hashp->LAST_FREED) + hashp->LAST_FREED = bit_address; + free_page = (bit_address >> (hashp->BSHIFT + BYTE_SHIFT)); + free_bit = bit_address & ((hashp->BSIZE << BYTE_SHIFT) - 1); + + if (!(freep = hashp->mapp[free_page])) + freep = fetch_bitmap(hashp, free_page); +#ifdef DEBUG + /* + * This had better never happen. It means we tried to read a bitmap + * that has already had overflow pages allocated off it, and we + * failed to read it from the file. + */ + if (!freep) + assert(0); +#endif + CLRBIT(freep, free_bit); +#ifdef DEBUG2 + (void)fprintf(stderr, "FREE_OVFLPAGE: ADDR: %d BIT: %d PAGE %d\n", + obufp->addr, free_bit, free_page); +#endif + __reclaim_buf(hashp, obufp); +} + +/* + * Returns: + * 0 success + * -1 failure + */ +static int +open_temp(hashp) + HTAB *hashp; +{ + sigset_t set, oset; + static char namestr[] = "_hashXXXXXX"; + + /* Block signals; make sure file goes away at process exit. */ + (void)sigfillset(&set); + (void)sigprocmask(SIG_BLOCK, &set, &oset); + if ((hashp->fp = mkstemp(namestr)) != -1) { + (void)unlink(namestr); +#ifdef HAVE_FCNTL + (void)fcntl(hashp->fp, F_SETFD, 1); +#endif + } + (void)sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL); + return (hashp->fp != -1 ? 0 : -1); +} + +/* + * We have to know that the key will fit, but the last entry on the page is + * an overflow pair, so we need to shift things. + */ +static void +squeeze_key(sp, key, val) + __uint16_t *sp; + const DBT *key, *val; +{ + char *p; + __uint16_t free_space, n, off, pageno; + + p = (char *)sp; + n = sp[0]; + free_space = FREESPACE(sp); + off = OFFSET(sp); + + pageno = sp[n - 1]; + off -= key->size; + sp[n - 1] = off; + memmove(p + off, key->data, key->size); + off -= val->size; + sp[n] = off; + memmove(p + off, val->data, val->size); + sp[0] = n + 2; + sp[n + 1] = pageno; + sp[n + 2] = OVFLPAGE; + FREESPACE(sp) = free_space - PAIRSIZE(key, val); + OFFSET(sp) = off; +} + +static __uint32_t * +fetch_bitmap(hashp, ndx) + HTAB *hashp; + int ndx; +{ + if (ndx >= hashp->nmaps) + return (NULL); + if ((hashp->mapp[ndx] = (__uint32_t *)malloc(hashp->BSIZE)) == NULL) + return (NULL); + if (__get_page(hashp, + (char *)hashp->mapp[ndx], hashp->BITMAPS[ndx], 0, 1, 1)) { + free(hashp->mapp[ndx]); + return (NULL); + } + return (hashp->mapp[ndx]); +} + +#ifdef DEBUG4 +int +print_chain(addr) + int addr; +{ + BUFHEAD *bufp; + short *bp, oaddr; + + (void)fprintf(stderr, "%d ", addr); + bufp = __get_buf(hashp, addr, NULL, 0); + bp = (short *)bufp->page; + while (bp[0] && ((bp[bp[0]] == OVFLPAGE) || + ((bp[0] > 2) && bp[2] < REAL_KEY))) { + oaddr = bp[bp[0] - 1]; + (void)fprintf(stderr, "%d ", (int)oaddr); + bufp = __get_buf(hashp, (int)oaddr, bufp, 0); + bp = (short *)bufp->page; + } + (void)fprintf(stderr, "\n"); +} +#endif diff --git a/lib/search/hcreate.3 b/lib/search/hcreate.3 new file mode 100644 index 0000000..1619c98 --- /dev/null +++ b/lib/search/hcreate.3 @@ -0,0 +1,206 @@ +.\" $FreeBSD: src/lib/libc/stdlib/hcreate.3,v 1.2 2001/07/09 15:54:36 ru Exp $ +.\" +.Dd May 8, 2001 +.Os +.Dt HCREATE 3 +.Sh NAME +.Nm hcreate , hdestroy , hsearch +.Nd manage hash search table +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In search.h +.Ft int +.Fn hcreate "size_t nel" +.Ft void +.Fn hdestroy void +.Ft ENTRY * +.Fn hsearch "ENTRY item" "ACTION action" +.Sh DESCRIPTION +The +.Fn hcreate , +.Fn hdestroy , +and +.Fn hsearch +functions manage hash search tables. +.Pp +The +.Fn hcreate +function allocates sufficient space for the table, and the application should +ensure it is called before +.Fn hsearch +is used. +The +.Fa nel +argument is an estimate of the maximum +number of entries that the table should contain. +This number may be adjusted upward by the +algorithm in order to obtain certain mathematically favorable circumstances. +.Pp +The +.Fn hdestroy +function disposes of the search table, and may be followed by another call to +.Fn hcreate . +After the call to +.Fn hdestroy , +the data can no longer be considered accessible. +.Pp +The +.Fn hsearch +function is a hash-table search routine. +It returns a pointer into a hash table +indicating the location at which an entry can be found. +The +.Fa item +argument is a structure of type +.Vt ENTRY +(defined in the +.Aq Pa search.h +header) containing two pointers: +.Fa item.key +points to the comparison key (a +.Vt "char *" ) , +and +.Fa item.data +(a +.Vt "void *" ) +points to any other data to be associated with +that key. +The comparison function used by +.Fn hsearch +is +.Xr strcmp 3 . +The +.Fa action +argument is a +member of an enumeration type +.Vt ACTION +indicating the disposition of the entry if it cannot be +found in the table. +.Dv ENTER +indicates that the +.Fa item +should be inserted in the table at an +appropriate point. +.Dv FIND +indicates that no entry should be made. +Unsuccessful resolution is +indicated by the return of a +.Dv NULL +pointer. +.Sh RETURN VALUES +The +.Fn hcreate +function returns 0 if it cannot allocate sufficient space for the table; +otherwise, it returns non-zero. +.Pp +The +.Fn hdestroy +function does not return a value. +.Pp +The +.Fn hsearch +function returns a +.Dv NULL +pointer if either the +.Fa action +is +.Dv FIND +and the +.Fa item +could not be found or the +.Fa action +is +.Dv ENTER +and the table is full. +.Sh ERRORS +The +.Fn hcreate +and +.Fn hsearch +functions may fail if: +.Bl -tag -width Er +.It Bq Er ENOMEM +Insufficient storage space is available. +.El +.Sh EXAMPLES +The following example reads in strings followed by two numbers +and stores them in a hash table, discarding duplicates. +It then reads in strings and finds the matching entry in the hash +table and prints it out. +.Bd -literal +#include +#include +#include + +struct info { /* This is the info stored in the table */ + int age, room; /* other than the key. */ +}; + +#define NUM_EMPL 5000 /* # of elements in search table. */ + +int +main(void) +{ + char string_space[NUM_EMPL*20]; /* Space to store strings. */ + struct info info_space[NUM_EMPL]; /* Space to store employee info. */ + char *str_ptr = string_space; /* Next space in string_space. */ + struct info *info_ptr = info_space; /* Next space in info_space. */ + ENTRY item; + ENTRY *found_item; /* Name to look for in table. */ + char name_to_find[30]; + int i = 0; + + /* Create table; no error checking is performed. */ + (void) hcreate(NUM_EMPL); + + while (scanf("%s%d%d", str_ptr, &info_ptr->age, + &info_ptr->room) != EOF && i++ < NUM_EMPL) { + /* Put information in structure, and structure in item. */ + item.key = str_ptr; + item.data = info_ptr; + str_ptr += strlen(str_ptr) + 1; + info_ptr++; + /* Put item into table. */ + (void) hsearch(item, ENTER); + } + + /* Access table. */ + item.key = name_to_find; + while (scanf("%s", item.key) != EOF) { + if ((found_item = hsearch(item, FIND)) != NULL) { + /* If item is in the table. */ + (void)printf("found %s, age = %d, room = %d\en", + found_item->key, + ((struct info *)found_item->data)->age, + ((struct info *)found_item->data)->room); + } else + (void)printf("no such employee %s\en", name_to_find); + } + return 0; +} +.Ed +.Sh SEE ALSO +.Xr bsearch 3 , +.Xr lsearch 3 , +.Xr malloc 3 , +.Xr strcmp 3 , +.Xr tsearch 3 +.Sh STANDARDS +The +.Fn hcreate , +.Fn hdestroy , +and +.Fn hsearch +functions conform to +.St -xpg4.2 . +.Sh HISTORY +The +.Fn hcreate , +.Fn hdestroy , +and +.Fn hsearch +functions first appeared in +.At V . +.Sh BUGS +The interface permits the use of only one hash table at a time. diff --git a/lib/search/hcreate.c b/lib/search/hcreate.c new file mode 100644 index 0000000..7664353 --- /dev/null +++ b/lib/search/hcreate.c @@ -0,0 +1,80 @@ +/* $NetBSD: hcreate.c,v 1.2 2001/02/19 21:26:04 ross Exp $ */ + +/* + * Copyright (c) 2001 Christopher G. Demetriou + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * <> + */ + +/* + * hcreate() / hsearch() / hdestroy() + * + * SysV/XPG4 hash table functions. + * + * Implementation done based on NetBSD manual page and Solaris manual page, + * plus my own personal experience about how they're supposed to work. + * + * I tried to look at Knuth (as cited by the Solaris manual page), but + * nobody had a copy in the office, so... + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: hcreate.c,v 1.2 2001/02/19 21:26:04 ross Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#include +#include +#include +#include + +static struct hsearch_data htab; + +int +hcreate (size_t nel) +{ + return hcreate_r (nel, &htab); +} + +void +hdestroy (void) +{ + hdestroy_r (&htab); +} + +ENTRY * +hsearch (ENTRY item, + ACTION action) +{ + ENTRY *retval; + + hsearch_r (item, action, &retval, &htab); + + return retval; +} diff --git a/lib/search/hcreate_r.c b/lib/search/hcreate_r.c new file mode 100644 index 0000000..400a57f --- /dev/null +++ b/lib/search/hcreate_r.c @@ -0,0 +1,194 @@ +/* $NetBSD: hcreate.c,v 1.2 2001/02/19 21:26:04 ross Exp $ */ + +/* + * Copyright (c) 2001 Christopher G. Demetriou + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * <> + */ + +/* + * hcreate() / hsearch() / hdestroy() + * + * SysV/XPG4 hash table functions. + * + * Implementation done based on NetBSD manual page and Solaris manual page, + * plus my own personal experience about how they're supposed to work. + * + * I tried to look at Knuth (as cited by the Solaris manual page), but + * nobody had a copy in the office, so... + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: hcreate.c,v 1.2 2001/02/19 21:26:04 ross Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#include +#include +#include +#include +#include + +/* + * DO NOT MAKE THIS STRUCTURE LARGER THAN 32 BYTES (4 ptrs on 64-bit + * ptr machine) without adjusting MAX_BUCKETS_LG2 below. + */ +struct internal_entry { + SLIST_ENTRY(internal_entry) link; + ENTRY ent; +}; +SLIST_HEAD(internal_head, internal_entry); + +#define MIN_BUCKETS_LG2 4 +#define MIN_BUCKETS (1 << MIN_BUCKETS_LG2) + +/* + * max * sizeof internal_entry must fit into size_t. + * assumes internal_entry is <= 32 (2^5) bytes. + */ +#ifdef __MSP430X_LARGE__ +/* 20-bit size_t. */ +#define MAX_BUCKETS_LG2 (20 - 1 - 5) +#else +#define MAX_BUCKETS_LG2 (sizeof (size_t) * 8 - 1 - 5) +#endif +#define MAX_BUCKETS ((size_t)1 << MAX_BUCKETS_LG2) + +/* Default hash function, from db/hash/hash_func.c */ +extern __uint32_t (*__default_hash)(const void *, size_t); + +int +hcreate_r(size_t nel, struct hsearch_data *htab) +{ + size_t idx; + unsigned int p2; + + /* Make sure this this isn't called when a table already exists. */ + if (htab->htable != NULL) { + errno = EINVAL; + return 0; + } + + /* If nel is too small, make it min sized. */ + if (nel < MIN_BUCKETS) + nel = MIN_BUCKETS; + + /* If it's too large, cap it. */ + if (nel > MAX_BUCKETS) + nel = MAX_BUCKETS; + + /* If it's is not a power of two in size, round up. */ + if ((nel & (nel - 1)) != 0) { + for (p2 = 0; nel != 0; p2++) + nel >>= 1; + nel = 1 << p2; + } + + /* Allocate the table. */ + htab->htablesize = nel; + htab->htable = malloc(htab->htablesize * sizeof htab->htable[0]); + if (htab->htable == NULL) { + errno = ENOMEM; + return 0; + } + + /* Initialize it. */ + for (idx = 0; idx < htab->htablesize; idx++) + SLIST_INIT(&(htab->htable[idx])); + + return 1; +} + +void +hdestroy_r(struct hsearch_data *htab) +{ +#if 0 + struct internal_entry *ie; + size_t idx; +#endif + if (htab->htable == NULL) + return; + +#if 0 + for (idx = 0; idx < htab->htablesize; idx++) { + while (!SLIST_EMPTY(&(htab->htable[idx]))) { + ie = SLIST_FIRST(&(htab->htable[idx])); + SLIST_REMOVE_HEAD(&(htab->htable[idx]), link); + free(ie->ent.key); + free(ie); + } + } +#endif + free(htab->htable); + htab->htable = NULL; +} + +int +hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab) +{ + struct internal_head *head; + struct internal_entry *ie; + __uint32_t hashval; + size_t len; + + len = strlen(item.key); + hashval = (*__default_hash)(item.key, len); + + head = &(htab->htable[hashval & (htab->htablesize - 1)]); + ie = SLIST_FIRST(head); + while (ie != NULL) { + if (strcmp(ie->ent.key, item.key) == 0) + break; + ie = SLIST_NEXT(ie, link); + } + + if (ie != NULL) + { + *retval = &ie->ent; + return 1; + } + else if (action == FIND) + { + *retval = NULL; + return 0; + } + + ie = malloc(sizeof *ie); + if (ie == NULL) + { + *retval = NULL; + return 0; + } + ie->ent.key = item.key; + ie->ent.data = item.data; + + SLIST_INSERT_HEAD(head, ie, link); + *retval = &ie->ent; + return 1; +} diff --git a/lib/search/ndbm.c b/lib/search/ndbm.c new file mode 100644 index 0000000..7f32960 --- /dev/null +++ b/lib/search/ndbm.c @@ -0,0 +1,217 @@ +/*- + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)ndbm.c 8.4 (Berkeley) 7/21/94"; +#endif /* LIBC_SCCS and not lint */ +#include +__FBSDID("$FreeBSD$ : src/lib/libc/db/hash/ndbm.c Nov 20 19:49:47 2017 UTC by pfg - SVN Revision 326025"); + +/* + * This package provides a dbm compatible interface to the new hashing + * package described in db(3). + */ + +#include + +#include +#include +#include + +#include +#include "hash.h" + +#define __DBINTERFACE_PRIVATE /* activate prototypes from db_local.h */ +#include "db_local.h" + +/* + * Returns: + * *DBM on success + * NULL on failure + */ +extern DBM * +dbm_open(const char *file, int flags, mode_t mode) +{ + HASHINFO info; + char path[MAXPATHLEN]; + + info.bsize = 4096; + info.ffactor = 40; + info.nelem = 1; + info.cachesize = 0; + info.hash = NULL; + info.lorder = 0; + + if( strlen(file) >= sizeof(path) - strlen(DBM_SUFFIX)) { + errno = ENAMETOOLONG; + return(NULL); + } + (void)strcpy(path, file); + (void)strcat(path, DBM_SUFFIX); + return ((DBM *)__hash_open(path, flags, mode, 0, &info)); +} + +extern void +dbm_close(DBM *db) +{ + (void)(db->close)(db); +} + +/* + * Returns: + * DATUM on success + * NULL on failure + */ +extern datum +dbm_fetch(DBM *db, datum key) +{ + datum retdata; + int status; + DBT dbtkey, dbtretdata; + + dbtkey.data = key.dptr; + dbtkey.size = key.dsize; + status = (db->get)(db, &dbtkey, &dbtretdata, 0); + if (status) { + dbtretdata.data = NULL; + dbtretdata.size = 0; + } + retdata.dptr = dbtretdata.data; + retdata.dsize = dbtretdata.size; + return (retdata); +} + +/* + * Returns: + * DATUM on success + * NULL on failure + */ +extern datum +dbm_firstkey(DBM *db) +{ + int status; + datum retkey; + DBT dbtretkey, dbtretdata; + + status = (db->seq)(db, &dbtretkey, &dbtretdata, R_FIRST); + if (status) + dbtretkey.data = NULL; + retkey.dptr = dbtretkey.data; + retkey.dsize = dbtretkey.size; + return (retkey); +} + +/* + * Returns: + * DATUM on success + * NULL on failure + */ +extern datum +dbm_nextkey(DBM *db) +{ + int status; + datum retkey; + DBT dbtretkey, dbtretdata; + + status = (db->seq)(db, &dbtretkey, &dbtretdata, R_NEXT); + if (status) + dbtretkey.data = NULL; + retkey.dptr = dbtretkey.data; + retkey.dsize = dbtretkey.size; + return (retkey); +} + +/* + * Returns: + * 0 on success + * <0 failure + */ +extern int +dbm_delete(DBM *db, datum key) +{ + int status; + DBT dbtkey; + + dbtkey.data = key.dptr; + dbtkey.size = key.dsize; + status = (db->del)(db, &dbtkey, 0); + if (status) + return (-1); + else + return (0); +} + +/* + * Returns: + * 0 on success + * <0 failure + * 1 if DBM_INSERT and entry exists + */ +extern int +dbm_store(DBM *db, datum key, datum data, int flags) +{ + DBT dbtkey, dbtdata; + + dbtkey.data = key.dptr; + dbtkey.size = key.dsize; + dbtdata.data = data.dptr; + dbtdata.size = data.dsize; + return ((db->put)(db, &dbtkey, &dbtdata, + (flags == DBM_INSERT) ? R_NOOVERWRITE : 0)); +} + +extern int +dbm_error(DBM *db) +{ + HTAB *hp; + + hp = (HTAB *)db->internal; + return (hp->error); +} + +extern int +dbm_clearerr(DBM *db) +{ + HTAB *hp; + + hp = (HTAB *)db->internal; + hp->error = 0; + return (0); +} + +extern int +dbm_dirfno(DBM *db) +{ + return(((HTAB *)db->internal)->fp); +} diff --git a/lib/search/page.h b/lib/search/page.h new file mode 100644 index 0000000..f9afc70 --- /dev/null +++ b/lib/search/page.h @@ -0,0 +1,89 @@ +/*- + * Copyright (c) 1990, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Margo Seltzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)page.h 8.2 (Berkeley) 5/31/94 + * $FreeBSD: src/lib/libc/db/hash/page.h,v 1.2 2002/03/22 23:41:40 obrien Exp $ + */ + +/* + * Definitions for hashing page file format. + */ + +/* + * routines dealing with a data page + * + * page format: + * +------------------------------+ + * p | n | keyoff | datoff | keyoff | + * +------------+--------+--------+ + * | datoff | free | ptr | --> | + * +--------+---------------------+ + * | F R E E A R E A | + * +--------------+---------------+ + * | <---- - - - | data | + * +--------+-----+----+----------+ + * | key | data | key | + * +--------+----------+----------+ + * + * Pointer to the free space is always: p[p[0] + 2] + * Amount of free space on the page is: p[p[0] + 1] + */ + +/* + * How many bytes required for this pair? + * 2 shorts in the table at the top of the page + room for the + * key and room for the data + * + * We prohibit entering a pair on a page unless there is also room to append + * an overflow page. The reason for this it that you can get in a situation + * where a single key/data pair fits on a page, but you can't append an + * overflow page and later you'd have to split the key/data and handle like + * a big pair. + * You might as well do this up front. + */ + +#define PAIRSIZE(K,D) (2*sizeof(__uint16_t) + (K)->size + (D)->size) +#define BIGOVERHEAD (4*sizeof(__uint16_t)) +#define KEYSIZE(K) (4*sizeof(__uint16_t) + (K)->size); +#define OVFLSIZE (2*sizeof(__uint16_t)) +#define FREESPACE(P) ((P)[(P)[0]+1]) +#define OFFSET(P) ((P)[(P)[0]+2]) +#define PAIRFITS(P,K,D) \ + (((P)[2] >= REAL_KEY) && \ + (PAIRSIZE((K),(D)) + OVFLSIZE) <= FREESPACE((P))) +#define PAGE_META(N) (((N)+3) * sizeof(__uint16_t)) + +typedef struct { + BUFHEAD *newp; + BUFHEAD *oldp; + BUFHEAD *nextp; + __uint16_t next_addr; +} SPLIT_RETURN; diff --git a/lib/search/qsort.c b/lib/search/qsort.c new file mode 100644 index 0000000..b53400a --- /dev/null +++ b/lib/search/qsort.c @@ -0,0 +1,345 @@ +/* +FUNCTION +<>---sort an array + +INDEX + qsort + +SYNOPSIS + #include + void qsort(void *<[base]>, size_t <[nmemb]>, size_t <[size]>, + int (*<[compar]>)(const void *, const void *) ); + +DESCRIPTION +<> sorts an array (beginning at <[base]>) of <[nmemb]> objects. +<[size]> describes the size of each element of the array. + +You must supply a pointer to a comparison function, using the argument +shown as <[compar]>. (This permits sorting objects of unknown +properties.) Define the comparison function to accept two arguments, +each a pointer to an element of the array starting at <[base]>. The +result of <<(*<[compar]>)>> must be negative if the first argument is +less than the second, zero if the two arguments match, and positive if +the first argument is greater than the second (where ``less than'' and +``greater than'' refer to whatever arbitrary ordering is appropriate). + +The array is sorted in place; that is, when <> returns, the +array elements beginning at <[base]> have been reordered. + +RETURNS +<> does not return a result. + +PORTABILITY +<> is required by ANSI (without specifying the sorting algorithm). +*/ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include + +#ifndef __GNUC__ +#define inline +#endif + +#if defined(I_AM_QSORT_R) +typedef int cmp_t(void *, const void *, const void *); +#elif defined(I_AM_GNU_QSORT_R) +typedef int cmp_t(const void *, const void *, void *); +#else +typedef int cmp_t(const void *, const void *); +#endif +static inline char *med3 (char *, char *, char *, cmp_t *, void *); +static inline void swapfunc (char *, char *, int, int); + +#define min(a, b) (a) < (b) ? a : b + +/* + * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". + */ +#define swapcode(TYPE, parmi, parmj, n) { \ + long i = (n) / sizeof (TYPE); \ + TYPE *pi = (TYPE *) (parmi); \ + TYPE *pj = (TYPE *) (parmj); \ + do { \ + TYPE t = *pi; \ + *pi++ = *pj; \ + *pj++ = t; \ + } while (--i > 0); \ +} + +#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \ + es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1; + +static inline void +swapfunc (char *a, + char *b, + int n, + int swaptype) +{ + if(swaptype <= 1) + swapcode(long, a, b, n) + else + swapcode(char, a, b, n) +} + +#define swap(a, b) \ + if (swaptype == 0) { \ + long t = *(long *)(a); \ + *(long *)(a) = *(long *)(b); \ + *(long *)(b) = t; \ + } else \ + swapfunc(a, b, es, swaptype) + +#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) + +#if defined(I_AM_QSORT_R) +#define CMP(t, x, y) (cmp((t), (x), (y))) +#elif defined(I_AM_GNU_QSORT_R) +#define CMP(t, x, y) (cmp((x), (y), (t))) +#else +#define CMP(t, x, y) (cmp((x), (y))) +#endif + +static inline char * +med3 (char *a, + char *b, + char *c, + cmp_t *cmp, + void *thunk +#if !defined(I_AM_QSORT_R) && !defined(I_AM_GNU_QSORT_R) +__unused +#endif +) +{ + return CMP(thunk, a, b) < 0 ? + (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) + :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); +} + +/* + * Classical function call recursion wastes a lot of stack space. Each + * recursion level requires a full stack frame comprising all local variables + * and additional space as dictated by the processor calling convention. + * + * This implementation instead stores the variables that are unique for each + * recursion level in a parameter stack array, and uses iteration to emulate + * recursion. Function call recursion is not used until the array is full. + * + * To ensure the stack consumption isn't worsened by this design, the size of + * the parameter stack array is chosen to be similar to the stack frame + * excluding the array. Each function call recursion level can handle this + * number of iterative recursion levels. + */ +#define PARAMETER_STACK_LEVELS 8u + +#if defined(I_AM_QSORT_R) +void +__bsd_qsort_r (void *a, + size_t n, + size_t es, + void *thunk, + cmp_t *cmp) +#elif defined(I_AM_GNU_QSORT_R) +void +qsort_r (void *a, + size_t n, + size_t es, + cmp_t *cmp, + void *thunk) +#else +#define thunk NULL +void +qsort (void *a, + size_t n, + size_t es, + cmp_t *cmp) +#endif +{ + char *pa, *pb, *pc, *pd, *pl, *pm, *pn; + size_t d, r; + int cmp_result; + int swaptype, swap_cnt; + size_t recursion_level = 0; + struct { void *a; size_t n; } parameter_stack[PARAMETER_STACK_LEVELS]; + + SWAPINIT(a, es); +loop: swap_cnt = 0; + if (n < 7) { + /* Short arrays are insertion sorted. */ + for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) + for (pl = pm; pl > (char *) a && CMP(thunk, pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + goto pop; + } + + /* Select a pivot element, move it to the left. */ + pm = (char *) a + (n / 2) * es; + if (n > 7) { + pl = a; + pn = (char *) a + (n - 1) * es; + if (n > 40) { + d = (n / 8) * es; + pl = med3(pl, pl + d, pl + 2 * d, cmp, thunk); + pm = med3(pm - d, pm, pm + d, cmp, thunk); + pn = med3(pn - 2 * d, pn - d, pn, cmp, thunk); + } + pm = med3(pl, pm, pn, cmp, thunk); + } + swap(a, pm); + + /* + * Sort the array relative the pivot in four ranges as follows: + * { elems == pivot, elems < pivot, elems > pivot, elems == pivot } + */ + pa = pb = (char *) a + es; + pc = pd = (char *) a + (n - 1) * es; + for (;;) { + /* Scan left to right stopping at first element > pivot. */ + while (pb <= pc && (cmp_result = CMP(thunk, pb, a)) <= 0) { + /* Move elements == pivot to the left (to pa) */ + if (cmp_result == 0) { + swap_cnt = 1; + swap(pa, pb); + pa += es; + } + pb += es; + } + /* Scan right to left stopping at first element < pivot. */ + while (pb <= pc && (cmp_result = CMP(thunk, pc, a)) >= 0) { + /* Move elements == pivot to the right (to pd) */ + if (cmp_result == 0) { + swap_cnt = 1; + swap(pc, pd); + pd -= es; + } + pc -= es; + } + if (pb > pc) + break; + /* The scan has found two elements to swap with each other. */ + swap(pb, pc); + swap_cnt = 1; + pb += es; + pc -= es; + } + if (swap_cnt == 0) { /* Switch to insertion sort */ + for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es) + for (pl = pm; pl > (char *) a && CMP(thunk, pl - es, pl) > 0; + pl -= es) + swap(pl, pl - es); + goto pop; + } + + /* + * Rearrange the array in three parts sorted like this: + * { elements < pivot, elements == pivot, elements > pivot } + */ + pn = (char *) a + n * es; + r = min(pa - (char *)a, pb - pa); + vecswap(a, pb - r, r); + r = min(pd - pc, pn - pd - es); + vecswap(pb, pn - r, r); + d = pb - pa; /* d = Size of left part. */ + r = pd - pc; /* r = Size of right part. */ + pn -= r; /* pn = Base of right part. */ + + /* + * Check which of the left and right parts are larger. + * Set (a, n) to (base, size) of the larger part. + * Set (pa, r) to (base, size) of the smaller part. + */ + if (r > d) { /* Right part is the larger part */ + pa = a; + a = pn; + n = r; + r = d; + } + else { /* Left part is the larger part, or both are equal. */ + pa = pn; + n = d; + } + + /* + * The left and right parts each need further sorting if they + * contain two elements or more. If both need sorting we use + * recursion to sort the smaller part and save the larger part + * to be sorted by iteration after the recursion. + * Using recursion only for the smaller part guarantees a + * recursion depth that is bounded to be less than (log2(n)). + */ + if (r > es) { /* Smaller part > 1 element. Both parts need sorting. */ + if (recursion_level < PARAMETER_STACK_LEVELS) { + /* + * The smaller part needs to be recursively sorted + * before the larger part is sorted. To avoid function + * call recursion the parameters for the larger part + * are pushed on the parameter_stack array. The smaller + * part is sorted using iteration and the larger part + * will be sorted when the parameter_stack is popped + * after the smaller part has been sorted. + */ + parameter_stack[recursion_level].a = a; + parameter_stack[recursion_level].n = n / es; + recursion_level++; + a = pa; + n = r / es; + goto loop; + } + else { + /* + * The parameter_stack array is full. The smaller part + * is sorted using function call recursion. The larger + * part will be sorted after the function call returns. + */ +#if defined(I_AM_QSORT_R) + __bsd_qsort_r(pa, r / es, es, thunk, cmp); +#elif defined(I_AM_GNU_QSORT_R) + qsort_r(pa, r / es, es, cmp, thunk); +#else + qsort(pa, r / es, es, cmp); +#endif + } + } + if (n > es) { /* The larger part needs sorting. Iterate to sort. */ + n = n / es; + goto loop; + } + /* Both left and right parts are one element or less - level done. */ +pop: + if (recursion_level != 0) { + recursion_level--; + a = parameter_stack[recursion_level].a; + n = parameter_stack[recursion_level].n; + goto loop; + } +} diff --git a/lib/search/qsort_r.c b/lib/search/qsort_r.c new file mode 100644 index 0000000..c4b6fb7 --- /dev/null +++ b/lib/search/qsort_r.c @@ -0,0 +1,48 @@ +/* +FUNCTION +<>---sort an array + +INDEX + qsort_r + +SYNOPSIS + #define _BSD_SOURCE + #include + void qsort_r(void *<[base]>, size_t <[nmemb]>, size_t <[size]>, + void *<[thunk]>, + int (*<[compar]>)(void*, const void *, const void *)); + + #define _GNU_SOURCE + #include + void qsort_r(void *<[base]>, size_t <[nmemb]>, size_t <[size]>, + int (*<[compar]>)(const void *, const void *, void *), + void *<[thunk]>); + +DESCRIPTION +<> sorts an array (beginning at <[base]>) of <[nmemb]> objects. +<[size]> describes the size of each element of the array. + +You must supply a pointer to a comparison function, using the argument +shown as <[compar]>. (This permits sorting objects of unknown +properties.) There are two forms of this function, in each the +comparison function is defined to accept three arguments, but in a +different order. Two are pointers to an element of the array starting at +<[base]>, and another being an arbitrary pointer <[thunk]>. The +result of <<(*<[compar]>)>> must be negative if the first argument is +less than the second, zero if the two arguments match, and positive if +the first argument is greater than the second (where ``less than'' and +``greater than'' refer to whatever arbitrary ordering is appropriate). + +The array is sorted in place; that is, when <> returns, the +array elements beginning at <[base]> have been reordered. + +RETURNS +<> does not return a result. + +PORTABILITY +<>, in various forms, appears in both BSD and glibc. +*/ + +#define _GNU_SOURCE +#define I_AM_GNU_QSORT_R +#include "qsort.c" diff --git a/lib/search/tdelete.c b/lib/search/tdelete.c new file mode 100644 index 0000000..a595200 --- /dev/null +++ b/lib/search/tdelete.c @@ -0,0 +1,66 @@ +/* $NetBSD: tdelete.c,v 1.2 1999/09/16 11:45:37 lukem Exp $ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: tdelete.c,v 1.2 1999/09/16 11:45:37 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#define _SEARCH_PRIVATE +#include +#include + + +/* delete node with given key */ +void * +tdelete (const void *__restrict vkey, /* key to be deleted */ + void **__restrict vrootp, /* address of the root of tree */ + int (*compar)(const void *, const void *)) +{ + node_t **rootp = (node_t **)vrootp; + node_t *p, *q, *r; + int cmp; + + if (rootp == NULL || (p = *rootp) == NULL) + return NULL; + + while ((cmp = (*compar)(vkey, (*rootp)->key)) != 0) { + p = *rootp; + rootp = (cmp < 0) ? + &(*rootp)->llink : /* follow llink branch */ + &(*rootp)->rlink; /* follow rlink branch */ + if (*rootp == NULL) + return NULL; /* key not found */ + } + r = (*rootp)->rlink; /* D1: */ + if ((q = (*rootp)->llink) == NULL) /* Left NULL? */ + q = r; + else if (r != NULL) { /* Right link is NULL? */ + if (r->llink == NULL) { /* D2: Find successor */ + r->llink = q; + q = r; + } else { /* D3: Find NULL link */ + for (q = r->llink; q->llink != NULL; q = r->llink) + r = q; + r->llink = q->rlink; + q->llink = (*rootp)->llink; + q->rlink = (*rootp)->rlink; + } + } + free(*rootp); /* D4: Free node */ + *rootp = q; /* link parent to new node */ + return p; +} diff --git a/lib/search/tdestroy.c b/lib/search/tdestroy.c new file mode 100644 index 0000000..04c6b70 --- /dev/null +++ b/lib/search/tdestroy.c @@ -0,0 +1,50 @@ +/* $NetBSD: tdelete.c,v 1.2 1999/09/16 11:45:37 lukem Exp $ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: tdelete.c,v 1.2 1999/09/16 11:45:37 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#define _SEARCH_PRIVATE +#include +#include + + +/* Walk the nodes of a tree */ +static void +trecurse(root, free_action) + node_t *root; /* Root of the tree to be walked */ + void (*free_action)(void *); +{ + if (root->llink != NULL) + trecurse(root->llink, free_action); + if (root->rlink != NULL) + trecurse(root->rlink, free_action); + + (*free_action) ((void *) root->key); + free(root); +} + +void +tdestroy (void *vrootp, + void (*freefct)(void *)) +{ + node_t *root = (node_t *) vrootp; + + if (root != NULL) + trecurse(root, freefct); +} diff --git a/lib/search/tfind.c b/lib/search/tfind.c new file mode 100644 index 0000000..670f41f --- /dev/null +++ b/lib/search/tfind.c @@ -0,0 +1,47 @@ +/* $NetBSD: tfind.c,v 1.2 1999/09/16 11:45:37 lukem Exp $ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: tfind.c,v 1.2 1999/09/16 11:45:37 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#define _SEARCH_PRIVATE +#include +#include + +/* find a node, or return 0 */ +void * +tfind (const void *vkey, /* key to be found */ + void **vrootp, /* address of the tree root */ + int (*compar)(const void *, const void *)) +{ + node_t **rootp = (node_t **)vrootp; + + if (rootp == NULL) + return NULL; + + while (*rootp != NULL) { /* T1: */ + int r; + + if ((r = (*compar)(vkey, (*rootp)->key)) == 0) /* T2: */ + return *rootp; /* key found */ + rootp = (r < 0) ? + &(*rootp)->llink : /* T3: follow left branch */ + &(*rootp)->rlink; /* T4: follow right branch */ + } + return NULL; +} diff --git a/lib/search/tsearch.3 b/lib/search/tsearch.3 new file mode 100644 index 0000000..a36fe89 --- /dev/null +++ b/lib/search/tsearch.3 @@ -0,0 +1,118 @@ +.\" $NetBSD$ +.\" Copyright (c) 1997 Todd C. Miller +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, +.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +.\" AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +.\" THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +.\" EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +.\" PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +.\" OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +.\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +.\" OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" OpenBSD: tsearch.3,v 1.2 1998/06/21 22:13:49 millert Exp +.\" $FreeBSD: src/lib/libc/stdlib/tsearch.3,v 1.7 2001/09/07 14:46:36 asmodai Exp $ +.\" +.Dd June 15, 1997 +.Dt TSEARCH 3 +.Os +.Sh NAME +.Nm tsearch , tfind , tdelete , twalk +.Nd manipulate binary search trees +.Sh SYNOPSIS +.In search.h +.Ft void * +.Fn tdelete "const void *key" "void **rootp" "int (*compar) (const void *, const void *)" +.Ft void * +.Fn tfind "const void *key" "void **rootp" "int (*compar) (const void *, const void *)" +.Ft void * +.Fn tsearch "const void *key" "void **rootp" "int (*compar) (const void *, const void *)" +.Ft void +.Fn twalk "const void *root" "void (*compar) (const void *, VISIT, int)" +.Sh DESCRIPTION +The +.Fn tdelete , +.Fn tfind , +.Fn tsearch , +and +.Fn twalk +functions manage binary search trees based on algorithms T and D +from Knuth (6.2.2). The comparison function passed in by +the user has the same style of return values as +.Xr strcmp 3 . +.Pp +.Fn Tfind +searches for the datum matched by the argument +.Fa key +in the binary tree rooted at +.Fa rootp , +returning a pointer to the datum if it is found and NULL +if it is not. +.Pp +.Fn Tsearch +is identical to +.Fn tfind +except that if no match is found, +.Fa key +is inserted into the tree and a pointer to it is returned. If +.Fa rootp +points to a NULL value a new binary search tree is created. +.Pp +.Fn Tdelete +deletes a node from the specified binary search tree and returns +a pointer to the parent of the node to be deleted. +It takes the same arguments as +.Fn tfind +and +.Fn tsearch . +If the node to be deleted is the root of the binary search tree, +.Fa rootp +will be adjusted. +.Pp +.Fn Twalk +walks the binary search tree rooted in +.Fa root +and calls the function +.Fa action +on each node. +.Fa Action +is called with three arguments: a pointer to the current node, +a value from the enum +.Sy "typedef enum { preorder, postorder, endorder, leaf } VISIT;" +specifying the traversal type, and a node level (where level +zero is the root of the tree). +.Sh SEE ALSO +.Xr bsearch 3 , +.Xr hsearch 3 , +.Xr lsearch 3 +.Sh RETURN VALUES +The +.Fn tsearch +function returns NULL if allocation of a new node fails (usually +due to a lack of free memory). +.Pp +.Fn Tfind , +.Fn tsearch , +and +.Fn tdelete +return NULL if +.Fa rootp +is NULL or the datum cannot be found. +.Pp +The +.Fn twalk +function returns no value. diff --git a/lib/search/tsearch.c b/lib/search/tsearch.c new file mode 100644 index 0000000..82d6944 --- /dev/null +++ b/lib/search/tsearch.c @@ -0,0 +1,57 @@ +/* $NetBSD: tsearch.c,v 1.3 1999/09/16 11:45:37 lukem Exp $ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: tsearch.c,v 1.3 1999/09/16 11:45:37 lukem Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#define _SEARCH_PRIVATE +#include +#include + +/* find or insert datum into search tree */ +void * +tsearch (const void *vkey, /* key to be located */ + void **vrootp, /* address of tree root */ + int (*compar)(const void *, const void *)) +{ + node_t *q; + node_t **rootp = (node_t **)vrootp; + + if (rootp == NULL) + return NULL; + + while (*rootp != NULL) { /* Knuth's T1: */ + int r; + + if ((r = (*compar)(vkey, (*rootp)->key)) == 0) /* T2: */ + return *rootp; /* we found it! */ + + rootp = (r < 0) ? + &(*rootp)->llink : /* T3: follow left branch */ + &(*rootp)->rlink; /* T4: follow right branch */ + } + + q = malloc(sizeof(node_t)); /* T5: key not found */ + if (q != 0) { /* make new node */ + *rootp = q; /* link new node to old */ + /* LINTED const castaway ok */ + q->key = (void *)vkey; /* initialize new node */ + q->llink = q->rlink = NULL; + } + return q; +} diff --git a/lib/search/twalk.c b/lib/search/twalk.c new file mode 100644 index 0000000..02ef522 --- /dev/null +++ b/lib/search/twalk.c @@ -0,0 +1,57 @@ +/* $NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $ */ + +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: twalk.c,v 1.1 1999/02/22 10:33:16 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ +#endif + +#include +#define _SEARCH_PRIVATE +#include +#include + +static void trecurse(const node_t *, + void (*action)(const void *, VISIT, int), int level); + +/* Walk the nodes of a tree */ +static void +trecurse(root, action, level) + const node_t *root; /* Root of the tree to be walked */ + void (*action)(const void *, VISIT, int); + int level; +{ + + if (root->llink == NULL && root->rlink == NULL) + (*action)(root, leaf, level); + else { + (*action)(root, preorder, level); + if (root->llink != NULL) + trecurse(root->llink, action, level + 1); + (*action)(root, postorder, level); + if (root->rlink != NULL) + trecurse(root->rlink, action, level + 1); + (*action)(root, endorder, level); + } +} + +/* Walk the nodes of a tree */ +void +twalk (const void *vroot, /* Root of the tree to be walked */ + void (*action)(const void *, VISIT, int)) +{ + if (vroot != NULL && action != NULL) + trecurse(vroot, action, 0); +} diff --git a/lib/signal/Makefile.inc b/lib/signal/Makefile.inc new file mode 100644 index 0000000..edf53f8 --- /dev/null +++ b/lib/signal/Makefile.inc @@ -0,0 +1,14 @@ +if HAVE_SIGNAL_DIR + +libc_a_SOURCES += \ + %D%/psignal.c %D%/raise.c %D%/signal.c %D%/sig2str.c + +endif + +LIBC_CHEWOUT_FILES += \ + %D%/psignal.def \ + %D%/raise.def \ + %D%/signal.def \ + %D%/sig2str.def + +LIBC_CHAPTERS += %D%/signal.tex diff --git a/lib/signal/psignal.c b/lib/signal/psignal.c new file mode 100644 index 0000000..f847ab2 --- /dev/null +++ b/lib/signal/psignal.c @@ -0,0 +1,68 @@ +/* Copyright 2002, 2011 Red Hat Inc. */ +/* +FUNCTION +<>---print a signal message on standard error + +INDEX + psignal + +SYNOPSIS + #include + void psignal(int <[signal]>, const char *<[prefix]>); + +DESCRIPTION +Use <> to print (on standard error) a signal message +corresponding to the value of the signal number <[signal]>. +Unless you use <> as the value of the argument <[prefix]>, the +signal message will begin with the string at <[prefix]>, followed by a +colon and a space (<<: >>). The remainder of the signal message is one +of the strings described for <>. + +RETURNS +<> returns no result. + +PORTABILITY +POSIX.1-2008 requires <>, but the strings issued vary from one +implementation to another. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include + +#define WRITE_STR(str) \ +{ \ + const char *p = (str); \ + size_t len = strlen (p); \ + while (len) \ + { \ + ssize_t len1 = write (fileno (stderr), p, len); \ + if (len1 < 0) \ + break; \ + len -= len1; \ + p += len1; \ + } \ +} + +void +psignal (int sig, + const char *s) +{ + fflush (stderr); + if (s != NULL && *s != '\0') + { + WRITE_STR (s); + WRITE_STR (": "); + } + WRITE_STR (strsignal (sig)); + +#ifdef __SCLE + WRITE_STR ((stderr->_flags & __SCLE) ? "\r\n" : "\n"); +#else + WRITE_STR ("\n"); +#endif +} diff --git a/lib/signal/raise.c b/lib/signal/raise.c new file mode 100644 index 0000000..c678c6e --- /dev/null +++ b/lib/signal/raise.c @@ -0,0 +1,69 @@ +/* Embedded systems may want the simulated signals if no other form exists, + but UNIX versions will want to use the host facilities. + Define SIMULATED_SIGNALS when you want to use the simulated versions. +*/ + +/* +FUNCTION +<>---send a signal + +INDEX + raise +INDEX + _raise_r + +SYNOPSIS + #include + int raise(int <[sig]>); + + int _raise_r(void *<[reent]>, int <[sig]>); + +DESCRIPTION +Send the signal <[sig]> (one of the macros from `<>'). +This interrupts your program's normal flow of execution, and allows a signal +handler (if you've defined one, using <>) to take control. + +The alternate function <<_raise_r>> is a reentrant version. The extra +argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +The result is <<0>> if <[sig]> was successfully raised, <<1>> +otherwise. However, the return value (since it depends on the normal +flow of execution) may not be visible, unless the signal handler for +<[sig]> terminates with a <> or unless <> is in +effect for this signal. + +PORTABILITY +ANSI C requires <>, but allows the full set of signal numbers +to vary from one implementation to another. + +Required OS subroutines: <>, <>. +*/ + +#ifndef SIGNAL_PROVIDED + +int _dummy_raise; + +#else + +#include +#include + +#ifndef _REENT_ONLY + +int +raise (int sig) +{ + return _raise_r (_REENT, sig); +} + +#endif + +int +_raise_r (struct _reent *reent, + int sig) +{ + return _kill_r (reent, _getpid_r (reent), sig); +} + +#endif /* SIGNAL_PROVIDED */ diff --git a/lib/signal/sig2str.c b/lib/signal/sig2str.c new file mode 100644 index 0000000..f4df913 --- /dev/null +++ b/lib/signal/sig2str.c @@ -0,0 +1,302 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ +/* + * Copyright (C) 2021 Matthew Joyce + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---Translate between signal number and name + +INDEX + sig2str +INDEX + str2sig + +SYNOPSIS + #include + int sig2str(int <[signum]>, char *<[str]>); + + int str2sig(const char *restrict <[str]>, int *restrict <[pnum]>); + +DESCRIPTION +The <> function translates the signal number specified by <[signum]> to +a signal name and stores this string in the location specified by <[str]>. The +application must ensure that <[str]> points to a location that can store the +string including the terminating null byte. The symbolic constant +<[SIG2STR_MAX]> defined in `<>' gives the maximum number of bytes +required. + +The <> function translates the signal name in the string pointed to by +<[str]> to a signal number and stores this value in the location specified by +<[pnum]>. + +RETURNS +<> returns <<0>> if <[signum]>> is a valid, supported signal number. +Otherwise, it returns <<-1>>. + +<> returns <<0>> if it stores a value in the location pointed to by +<[pnum]>. Otherwise it returns <<-1>>. +*/ + +#include +#include +#include +#include + +#define SPACES_TO_N 6 /* Allows indexing to RT Signal number in str2sig */ +#define NUM_OF_SIGS (sizeof(sig_array) / sizeof(sig_name_and_num)) + +typedef struct sig_name_and_num { + const char *sig_name; + const int sig_num; +} sig_name_and_num; + +static const sig_name_and_num sig_array[] = { + { "EXIT", 0 }, + #ifdef SIGHUP + { "HUP", SIGHUP }, + #endif + #ifdef SIGINT + { "INT", SIGINT }, + #endif + #ifdef SIGQUIT + { "QUIT", SIGQUIT }, + #endif + #ifdef SIGILL + { "ILL", SIGILL }, + #endif + #ifdef SIGTRAP + { "TRAP", SIGTRAP }, + #endif + #ifdef SIGABRT + { "ABRT", SIGABRT }, + #endif + #ifdef SIGIOT + { "IOT", SIGIOT}, + #endif + #ifdef SIGEMT + { "EMT", SIGEMT }, + #endif + #ifdef SIGFPE + { "FPE", SIGFPE }, + #endif + #ifdef SIGKILL + { "KILL", SIGKILL }, + #endif + #ifdef SIGBUS + { "BUS", SIGBUS }, + #endif + #ifdef SIGSEGV + { "SEGV", SIGSEGV }, + #endif + #ifdef SIGSYS + { "SYS", SIGSYS }, + #endif + #ifdef SIGPIPE + { "PIPE", SIGPIPE }, + #endif + #ifdef SIGALRM + { "ALRM", SIGALRM }, + #endif + #ifdef SIGTERM + { "TERM", SIGTERM }, + #endif + #ifdef SIGURG + { "URG", SIGURG }, + #endif + #ifdef SIGSTOP + { "STOP", SIGSTOP }, + #endif + #ifdef SIGTSTP + { "TSTP", SIGTSTP }, + #endif + #ifdef SIGCONT + { "CONT", SIGCONT }, + #endif + #ifdef SIGCHLD + { "CHLD", SIGCHLD }, + #endif + #ifdef SIGCLD + { "CLD", SIGCLD }, + #endif + #ifdef SIGTTIN + { "TTIN", SIGTTIN }, + #endif + #ifdef SIGTTOU + { "TTOU", SIGTTOU }, + #endif + #ifdef SIGIO + { "IO", SIGIO }, + #endif + #ifdef SIGPOLL + { "POLL", SIGPOLL }, + #endif + #ifdef SIGWINCH + { "WINCH", SIGWINCH }, + #endif + #ifdef SIGUSR1 + { "USR1", SIGUSR1 }, + #endif + #ifdef SIGUSR2 + { "USR2", SIGUSR2 }, + #endif + #ifdef SIGPWR + { "PWR", SIGPWR }, + #endif + #ifdef SIGXCPU + { "XCPU", SIGXCPU }, + #endif + #ifdef SIGXFSZ + { "XFSZ", SIGXFSZ }, + #endif + #ifdef SIGVTALRM + { "VTALRM", SIGVTALRM }, + #endif + #ifdef SIGPROF + { "PROF", SIGPROF }, + #endif + #ifdef SIGLOST + { "LOST", SIGLOST }, + #endif + /* The Issue 8 standard requires that SIGRTMIN and SIGRTMAX be included + * as valid results to be saved from calls to sig2str/str2sig. */ + #ifdef SIGRTMIN + { "RTMIN", SIGRTMIN }, + #endif + #ifdef SIGRTMAX + { "RTMAX", SIGRTMAX } + #endif +}; + +int +sig2str(int signum, char *str) +{ + const sig_name_and_num *sptr; + +#if defined (SIGRTMIN) && defined (SIGRTMAX) + /* If signum falls in lower half of the real time signals range, define + * the saved str value as "RTMIN+n" according to the Issue 8 standard */ + if ((SIGRTMIN + 1) <= signum && + signum <= (SIGRTMIN + SIGRTMAX) / 2) { + sprintf(str, "RTMIN+%d", (signum-SIGRTMIN)); + return 0; + } + + /* If signum falls in upper half of the real time signals range, define + * the saved str value as "RTMAX-m" according to the Issue 8 standard */ + if ((((SIGRTMIN + SIGRTMAX) / 2) + 1) <= signum && + signum <= (SIGRTMAX - 1)) { + sprintf(str, "RTMAX-%d", (SIGRTMAX - signum)); + return 0; + } +#endif + + /* Otherwise, search for signal matching signum in sig_array. If found, + * save its string value in str. */ + for (sptr = sig_array; sptr < &sig_array[NUM_OF_SIGS]; sptr++) { + if (sptr->sig_num == signum) { + strcpy(str, sptr->sig_name); + return 0; + } + } + + /* If signum is not a recognized signal number, return -1 */ + return -1; +} + +int +str2sig(const char *__restrict str, int *__restrict pnum) +{ + unsigned long j = 0; + char *endp; + const sig_name_and_num *sptr; + unsigned long is_valid_decimal; + +#if defined (SIGRTMIN) && defined (SIGRTMAX) + /* i686 Cygwin only supports one RT signal. For this case, skip checks + * for "RTMIN+n" and "RTMAX-m". */ + if (SIGRTMIN != SIGRTMAX) { + + /* If str is in RT signal range, get number of of RT signal, save it as an + * integer. */ + if (strncmp(str, "RTMIN+", SPACES_TO_N) == 0) { + j = strtoul(&str[SPACES_TO_N], &endp, 10); + + /* If number is valid, save it in pnum. */ + if (*endp == '\0') { + if (1 <= j && + j <= ((SIGRTMAX - SIGRTMIN)-1)) { + *pnum = (SIGRTMIN + j); + return 0; + } + return -1; + } + return -1; + } + + /* If str is in RT signal range, get number of of RT signal, save it as an + * integer. */ + if (strncmp(str, "RTMAX-", SPACES_TO_N) == 0) { + j = strtoul(&str[SPACES_TO_N], &endp, 10); // and endptr null check + + /* If number is valid, save it in pnum. */ + if (*endp == '\0') { + if (1 <= j && + j <= ((SIGRTMAX - SIGRTMIN)-1)) { + *pnum = (SIGRTMAX - j); + return 0; + } + return -1; + } + return -1; + } + } +#endif + + /*If str is a valid signal name, save its corresponding number in pnum. */ + for (sptr = sig_array; sptr < &sig_array[NUM_OF_SIGS]; sptr++) { + if (strcmp(sptr->sig_name, str) == 0) { + *pnum = sptr->sig_num; + return 0; + } + } + + /* str was not found in sig_array. Check whether str is a string + * representation of a valid integer. */ + is_valid_decimal = strtoul(str, &endp, 10); + + if (*endp != '\0') { + return -1; + } + + /* If str is a representation of a decimal value, save its integer value + * in pnum. */ + if (1 <= is_valid_decimal && + is_valid_decimal <= (NSIG - 1)) { + *pnum = is_valid_decimal; + return 0; + } + + return -1; +} diff --git a/lib/signal/signal.c b/lib/signal/signal.c new file mode 100644 index 0000000..77d78f0 --- /dev/null +++ b/lib/signal/signal.c @@ -0,0 +1,227 @@ +/* +FUNCTION +<>---specify handler subroutine for a signal + +INDEX + signal +INDEX + _signal_r + +SYNOPSIS + #include + void (*signal(int <[sig]>, void(*<[func]>)(int))) (int); + + void (*_signal_r(void *<[reent]>, int <[sig]>, void(*<[func]>)(int))) (int); + +DESCRIPTION +<> provides a simple signal-handling implementation for embedded +targets. + +<> allows you to request changed treatment for a particular +signal <[sig]>. You can use one of the predefined macros <> +(select system default handling) or <> (ignore this signal) +as the value of <[func]>; otherwise, <[func]> is a function pointer +that identifies a subroutine in your program as the handler for this signal. + +Some of the execution environment for signal handlers is +unpredictable; notably, the only library function required to work +correctly from within a signal handler is <> itself, and +only when used to redefine the handler for the current signal value. + +Static storage is likewise unreliable for signal handlers, with one +exception: if you declare a static storage location as `<>', then you may use that location in a signal handler to +store signal values. + +If your signal handler terminates using <> (or implicit +return), your program's execution continues at the point +where it was when the signal was raised (whether by your program +itself, or by an external event). Signal handlers can also +use functions such as <> and <> to avoid returning. + +The alternate function <<_signal_r>> is the reentrant version. +The extra argument <[reent]> is a pointer to a reentrancy structure. + +@c FIXME: do we have setjmp.h and assoc fns? + +RETURNS +If your request for a signal handler cannot be honored, the result is +<>; a specific error number is also recorded in <>. + +Otherwise, the result is the previous handler (a function pointer or +one of the predefined macros). + +PORTABILITY +ANSI C requires <>. + +No supporting OS subroutines are required to link with <>, but +it will not have any useful effects, except for software generated signals, +without an operating system that can actually raise exceptions. +*/ + +/* + * signal.c + * Original Author: G. Haley + * + * signal associates the function pointed to by func with the signal sig. When + * a signal occurs, the value of func determines the action taken as follows: + * if func is SIG_DFL, the default handling for that signal will occur; if func + * is SIG_IGN, the signal will be ignored; otherwise, the default handling for + * the signal is restored (SIG_DFL), and the function func is called with sig + * as its argument. Returns the value of func for the previous call to signal + * for the signal sig, or SIG_ERR if the request fails. + */ + +/* _init_signal initialises the signal handlers for each signal. This function + is called by crt0 at program startup. */ + +#ifdef SIGNAL_PROVIDED + +int _dummy_simulated_signal; + +#else + +#include +#include +#include +#include +#include +#include <_syslist.h> + +#ifdef _REENT_THREAD_LOCAL +_Thread_local void (**_tls_sig_func)(int); +#endif + +int +_init_signal_r (struct _reent *ptr) +{ + int i; + + if (_REENT_SIG_FUNC(ptr) == NULL) + { + _REENT_SIG_FUNC(ptr) = (_sig_func_ptr *)_malloc_r (ptr, sizeof (_sig_func_ptr) * NSIG); + if (_REENT_SIG_FUNC(ptr) == NULL) + return -1; + + for (i = 0; i < NSIG; i++) + _REENT_SIG_FUNC(ptr)[i] = SIG_DFL; + } + + return 0; +} + +_sig_func_ptr +_signal_r (struct _reent *ptr, + int sig, + _sig_func_ptr func) +{ + _sig_func_ptr old_func; + + if (sig < 0 || sig >= NSIG) + { + _REENT_ERRNO(ptr) = EINVAL; + return SIG_ERR; + } + + if (_REENT_SIG_FUNC(ptr) == NULL && _init_signal_r (ptr) != 0) + return SIG_ERR; + + old_func = _REENT_SIG_FUNC(ptr)[sig]; + _REENT_SIG_FUNC(ptr)[sig] = func; + + return old_func; +} + +int +_raise_r (struct _reent *ptr, + int sig) +{ + _sig_func_ptr func; + + if (sig < 0 || sig >= NSIG) + { + _REENT_ERRNO(ptr) = EINVAL; + return -1; + } + + if (_REENT_SIG_FUNC(ptr) == NULL) + func = SIG_DFL; + else + func = _REENT_SIG_FUNC(ptr)[sig]; + + if (func == SIG_DFL) + return _kill_r (ptr, _getpid_r (ptr), sig); + else if (func == SIG_IGN) + return 0; + else if (func == SIG_ERR) + { + _REENT_ERRNO(ptr) = EINVAL; + return 1; + } + else + { + _REENT_SIG_FUNC(ptr)[sig] = SIG_DFL; + func (sig); + return 0; + } +} + +int +__sigtramp_r (struct _reent *ptr, + int sig) +{ + _sig_func_ptr func; + + if (sig < 0 || sig >= NSIG) + { + return -1; + } + + if (_REENT_SIG_FUNC(ptr) == NULL && _init_signal_r (ptr) != 0) + return -1; + + func = _REENT_SIG_FUNC(ptr)[sig]; + if (func == SIG_DFL) + return 1; + else if (func == SIG_ERR) + return 2; + else if (func == SIG_IGN) + return 3; + else + { + _REENT_SIG_FUNC(ptr)[sig] = SIG_DFL; + func (sig); + return 0; + } +} + +#ifndef _REENT_ONLY + +int +raise (int sig) +{ + return _raise_r (_REENT, sig); +} + +_sig_func_ptr +signal (int sig, + _sig_func_ptr func) +{ + return _signal_r (_REENT, sig, func); +} + +int +_init_signal (void) +{ + return _init_signal_r (_REENT); +} + +int +__sigtramp (int sig) +{ + return __sigtramp_r (_REENT, sig); +} + +#endif + +#endif /* !SIGNAL_PROVIDED */ diff --git a/lib/signal/signal.tex b/lib/signal/signal.tex new file mode 100644 index 0000000..f7dbf9d --- /dev/null +++ b/lib/signal/signal.tex @@ -0,0 +1,78 @@ +@node Signals +@chapter Signal Handling (@file{signal.h}) + +A @dfn{signal} is an event that interrupts the normal flow of control +in your program. Your operating environment normally defines the full +set of signals available (see @file{sys/signal.h}), as well as the +default means of dealing with them---typically, either printing an +error message and aborting your program, or ignoring the signal. + +All systems support at least the following signals: +@table @code +@item SIGABRT +Abnormal termination of a program; raised by the @code{abort} function. + +@item SIGFPE +A domain error in arithmetic, such as overflow, or division by zero. + +@item SIGILL +Attempt to execute as a function data that is not executable. + +@item SIGINT +Interrupt; an interactive attention signal. + +@item SIGSEGV +An attempt to access a memory location that is not available. + +@item SIGTERM +A request that your program end execution. +@end table + +Two functions are available for dealing with asynchronous +signals---one to allow your program to send signals to itself (this is +called @dfn{raising} a signal), and one to specify subroutines (called +@dfn{handlers} to handle particular signals that you anticipate may +occur---whether raised by your own program or the operating environment. + +To support these functions, @file{signal.h} defines three macros: + +@table @code +@item SIG_DFL +Used with the @code{signal} function in place of a pointer to a +handler subroutine, to select the operating environment's default +handling of a signal. + +@item SIG_IGN +Used with the @code{signal} function in place of a pointer to a +handler, to ignore a particular signal. + +@item SIG_ERR +Returned by the @code{signal} function in place of a pointer to a +handler, to indicate that your request to set up a handler could not +be honored for some reason. +@end table + +@file{signal.h} also defines an integral type, @code{sig_atomic_t}. +This type is not used in any function declarations; it exists only to +allow your signal handlers to declare a static storage location where +they may store a signal value. (Static storage is not otherwise +reliable from signal handlers.) + +@menu +* psignal:: Print a signal message to standard error +* raise:: Send a signal +* sig2str:: Translate between signal number and name +* signal:: Specify handler subroutine for a signal +@end menu + +@page +@include signal/psignal.def + +@page +@include signal/raise.def + +@page +@include signal/sig2str.def + +@page +@include signal/signal.def diff --git a/lib/ssp/Makefile.inc b/lib/ssp/Makefile.inc new file mode 100644 index 0000000..f1dc912 --- /dev/null +++ b/lib/ssp/Makefile.inc @@ -0,0 +1,46 @@ +## General sources. +%C%_ELIX_SOURCES = \ + %D%/chk_fail.c \ + %D%/stack_protector.c + +## String sources. +%C%_ELIX_SOURCES += \ + %D%/memcpy_chk.c \ + %D%/memmove_chk.c \ + %D%/mempcpy_chk.c \ + %D%/memset_chk.c \ + %D%/stpcpy_chk.c \ + %D%/stpncpy_chk.c \ + %D%/strcat_chk.c \ + %D%/strcpy_chk.c \ + %D%/strncat_chk.c \ + %D%/strncpy_chk.c + +## Stdio sources. +if HAVE_STDIO_DIR +%C%_ELIX_SOURCES += \ + %D%/gets_chk.c \ + %D%/snprintf_chk.c \ + %D%/sprintf_chk.c \ + %D%/vsnprintf_chk.c \ + %D%/vsprintf_chk.c +endif + +## None of these functions are specified by EL/IX +if ELIX_LEVEL_1 +else +if ELIX_LEVEL_2 +else +if ELIX_LEVEL_3 +else +if ELIX_LEVEL_4 +else +libc_a_SOURCES += $(%C%_ELIX_SOURCES) +endif +endif +endif +endif + +LIBC_CHEWOUT_FILES += + +LIBC_CHAPTERS += %D%/ssp.tex diff --git a/lib/ssp/chk_fail.c b/lib/ssp/chk_fail.c new file mode 100644 index 0000000..b1f8e42 --- /dev/null +++ b/lib/ssp/chk_fail.c @@ -0,0 +1,13 @@ +#include +#include +#include + +void +__attribute__((__noreturn__)) +__chk_fail(void) +{ + char msg[] = "*** buffer overflow detected ***: terminated\n"; + write (2, msg, strlen (msg)); + raise (SIGABRT); + _exit (127); +} diff --git a/lib/ssp/gets_chk.c b/lib/ssp/gets_chk.c new file mode 100644 index 0000000..b4f7015 --- /dev/null +++ b/lib/ssp/gets_chk.c @@ -0,0 +1,78 @@ +/* $NetBSD: gets_chk.c,v 1.7 2013/10/04 20:49:16 christos Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: gets_chk.c,v 1.7 2013/10/04 20:49:16 christos Exp $"); + +/*LINTLIBRARY*/ + +#include +#include +#include +#include +#include +#include + +extern char *__gets(char *); +#undef gets +#ifdef __NEWLIB__ +#define __gets gets +#endif + +char * +__gets_chk(char * __restrict buf, size_t slen) +{ + char *abuf; + size_t len; + + if (slen >= (size_t)INT_MAX) + return __gets(buf); + + if ((abuf = malloc(slen + 1)) == NULL) + return __gets(buf); + + if (fgets(abuf, (int)(slen + 1), stdin) == NULL) { + free(abuf); + return NULL; + } + + len = strlen(abuf); + if (len > 0 && abuf[len - 1] == '\n') + --len; + + if (len >= slen) + __chk_fail(); + + (void)memcpy(buf, abuf, len); + + buf[len] = '\0'; + free(abuf); + return buf; +} diff --git a/lib/ssp/memcpy_chk.c b/lib/ssp/memcpy_chk.c new file mode 100644 index 0000000..63f536d --- /dev/null +++ b/lib/ssp/memcpy_chk.c @@ -0,0 +1,54 @@ +/* $NetBSD: memcpy_chk.c,v 1.7 2015/05/13 19:57:16 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: memcpy_chk.c,v 1.7 2015/05/13 19:57:16 joerg Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef memcpy + +void *__memcpy_chk(void * __restrict, const void * __restrict, size_t, size_t); + +void * +__memcpy_chk(void * __restrict dst, const void * __restrict src, size_t len, + size_t slen) +{ + if (len > slen) + __chk_fail(); + + if (__ssp_overlap((const char *)src, (const char *)dst, len)) + __chk_fail(); + + return memcpy(dst, src, len); +} diff --git a/lib/ssp/memmove_chk.c b/lib/ssp/memmove_chk.c new file mode 100644 index 0000000..f8f03d7 --- /dev/null +++ b/lib/ssp/memmove_chk.c @@ -0,0 +1,50 @@ +/* $NetBSD: memmove_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: memmove_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef memmove + +void *__memmove_chk(void *, void *src, size_t, size_t); + +void * +__memmove_chk(void *dst, void *src, size_t len, + size_t slen) +{ + if (len > slen) + __chk_fail(); + return memmove(dst, src, len); +} diff --git a/lib/ssp/mempcpy_chk.c b/lib/ssp/mempcpy_chk.c new file mode 100644 index 0000000..fc2ccf8 --- /dev/null +++ b/lib/ssp/mempcpy_chk.c @@ -0,0 +1,21 @@ +#define _GNU_SOURCE +#include +#include +#include + +#undef mempcpy + +void *__mempcpy_chk(void * __restrict, const void * __restrict, size_t, size_t); + +void * +__mempcpy_chk(void * __restrict dst, const void * __restrict src, size_t len, + size_t slen) +{ + if (len > slen) + __chk_fail(); + + if (__ssp_overlap((const char *)src, (const char *)dst, len)) + __chk_fail(); + + return mempcpy(dst, src, len); +} diff --git a/lib/ssp/memset_chk.c b/lib/ssp/memset_chk.c new file mode 100644 index 0000000..0e303b9 --- /dev/null +++ b/lib/ssp/memset_chk.c @@ -0,0 +1,49 @@ +/* $NetBSD: memset_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: memset_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef memset + +void *__memset_chk(void * __restrict, int, size_t, size_t); + +void * +__memset_chk(void * __restrict dst, int val, size_t len, size_t slen) +{ + if (len > slen) + __chk_fail(); + return memset(dst, val, len); +} diff --git a/lib/ssp/snprintf_chk.c b/lib/ssp/snprintf_chk.c new file mode 100644 index 0000000..cede5a4 --- /dev/null +++ b/lib/ssp/snprintf_chk.c @@ -0,0 +1,59 @@ +/* $NetBSD: snprintf_chk.c,v 1.5 2008/04/28 20:23:00 martin Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: snprintf_chk.c,v 1.5 2008/04/28 20:23:00 martin Exp $"); + +/*LINTLIBRARY*/ + +#include +#include +#include +#include + +#undef vsnprintf + +/*ARGSUSED*/ +int +__snprintf_chk(char * __restrict buf, size_t len, int flags, size_t slen, + const char * __restrict fmt, ...) +{ + va_list ap; + int rv; + + if (len > slen) + __chk_fail(); + + va_start(ap, fmt); + rv = vsnprintf(buf, len, fmt, ap); + va_end(ap); + + return rv; +} diff --git a/lib/ssp/sprintf_chk.c b/lib/ssp/sprintf_chk.c new file mode 100644 index 0000000..1e92479 --- /dev/null +++ b/lib/ssp/sprintf_chk.c @@ -0,0 +1,63 @@ +/* $NetBSD: sprintf_chk.c,v 1.6 2009/02/05 05:40:36 lukem Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: sprintf_chk.c,v 1.6 2009/02/05 05:40:36 lukem Exp $"); + +/*LINTLIBRARY*/ + +#include +#include +#include +#include +#include + +#undef vsnprintf +#undef vsprintf + +int +/*ARGSUSED*/ +__sprintf_chk(char * __restrict buf, int flags, size_t slen, + const char * __restrict fmt, ...) +{ + va_list ap; + int rv; + + va_start(ap, fmt); + if (slen > (size_t)INT_MAX) + rv = vsprintf(buf, fmt, ap); + else { + if ((rv = vsnprintf(buf, slen, fmt, ap)) >= 0 && (size_t)rv >= slen) + __chk_fail(); + } + va_end(ap); + + return rv; +} diff --git a/lib/ssp/ssp.tex b/lib/ssp/ssp.tex new file mode 100644 index 0000000..9270350 --- /dev/null +++ b/lib/ssp/ssp.tex @@ -0,0 +1,57 @@ +@node Overflow Protection +@chapter Overflow Protection + +@menu +* Stack Smashing Protection:: Checks enabled with -fstack-protector* +* Object Size Checking:: Checks enabled with _FORTIFY_SOURCE +@end menu + +@node Stack Smashing Protection +@section Stack Smashing Protection +Stack Smashing Protection is a compiler feature which emits extra code +to check for stack smashing attacks. It depends on a canary, which is +initialized with the process, and functions for process termination when +an overflow is detected. These are private entry points intended solely +for use by the compiler, and are used when any of the @code{-fstack-protector}, +@code{-fstack-protector-all}, @code{-fstack-protector-explicit}, or +@code{-fstack-protector-strong} compiler flags are enabled. + +@node Object Size Checking +@section Object Size Checking +Object Size Checking is a feature which wraps certain functions with checks +to prevent buffer overflows. These are enabled when compiling with +optimization (@code{-O1} and higher) and @code{_FORTIFY_SOURCE} defined +to 1, or for stricter checks, to 2. + +@cindex list of overflow protected functions +The following functions use object size checking to detect buffer overflows +when enabled: + +@example +@exdent @emph{String functions:} +bcopy memmove strcpy +bzero mempcpy strcat +explicit_bzero memset strncat +memcpy stpcpy strncpy + +@exdent @emph{Wide Character String functions:} +fgetws wcrtomb wcsrtombs +fgetws_unlocked wcscat wmemcpy +mbsnrtowcs wcscpy wmemmove +mbsrtowcs wcsncat wmempcpy +wcpcpy wcsncpy wmemset +wcpncpy wcsnrtombs + +@exdent @emph{Stdio functions:} +fgets fread_unlocked sprintf +fgets_unlocked gets vsnprintf +fread snprintf vsprintf + +@exdent @emph{Stdlib functions:} +mbstowcs wcstombs wctomb + +@exdent @emph{System functions:} +getcwd read ttyname_r +pread readlink + +@end example diff --git a/lib/ssp/stack_protector.c b/lib/ssp/stack_protector.c new file mode 100644 index 0000000..5e9d75f --- /dev/null +++ b/lib/ssp/stack_protector.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +#include +#include + +#if defined(__AMDGCN__) || defined(__nvptx__) +/* Global constructors not supported on this target, yet. */ +uintptr_t __stack_chk_guard = 0x00000aff; /* 0, 0, '\n', 255 */ + +#else +uintptr_t __stack_chk_guard = 0; + +void +__attribute__((__constructor__)) +__stack_chk_init (void) +{ + if (__stack_chk_guard != 0) + return; + +#if defined(__CYGWIN__) || defined(__rtems__) + arc4random_buf(&__stack_chk_guard, sizeof(__stack_chk_guard)); +#else + /* If getentropy is not available, use the "terminator canary". */ + ((unsigned char *)&__stack_chk_guard)[0] = 0; + ((unsigned char *)&__stack_chk_guard)[1] = 0; + ((unsigned char *)&__stack_chk_guard)[2] = '\n'; + ((unsigned char *)&__stack_chk_guard)[3] = 255; +#endif +} +#endif + +void +__attribute__((__noreturn__)) +__stack_chk_fail (void) +{ + char msg[] = "*** stack smashing detected ***: terminated\n"; + write (2, msg, strlen (msg)); + raise (SIGABRT); + _exit (127); +} + +#ifdef __ELF__ +void +__attribute__((visibility ("hidden"))) +__stack_chk_fail_local (void) +{ + __stack_chk_fail(); +} +#endif diff --git a/lib/ssp/stpcpy_chk.c b/lib/ssp/stpcpy_chk.c new file mode 100644 index 0000000..ed1d74a --- /dev/null +++ b/lib/ssp/stpcpy_chk.c @@ -0,0 +1,58 @@ +/* $NetBSD: stpcpy_chk.c,v 1.6 2015/05/09 15:42:21 christos Exp $ */ + +/*- + * Copyright (c) 2013 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: stpcpy_chk.c,v 1.6 2015/05/09 15:42:21 christos Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef memcpy + +#if !__GNUC_PREREQ__(4, 8) +char *__stpcpy_chk(char * __restrict, const char * __restrict, size_t); +#endif + +char * +__stpcpy_chk(char * __restrict dst, const char * __restrict src, size_t slen) +{ + size_t len = strlen(src); + + if (len >= slen) + __chk_fail(); + + if (__ssp_overlap(src, dst, len)) + __chk_fail(); + + (void)memcpy(dst, src, len + 1); + return dst + len; +} diff --git a/lib/ssp/stpncpy_chk.c b/lib/ssp/stpncpy_chk.c new file mode 100644 index 0000000..7566261 --- /dev/null +++ b/lib/ssp/stpncpy_chk.c @@ -0,0 +1,56 @@ +/* $NetBSD: stpncpy_chk.c,v 1.3 2015/05/09 15:42:21 christos Exp $ */ + +/*- + * Copyright (c) 2013 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: stpncpy_chk.c,v 1.3 2015/05/09 15:42:21 christos Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef stpncpy + +#if !__GNUC_PREREQ__(4, 8) +char *__stpncpy_chk(char * __restrict, const char * __restrict, size_t, size_t); +#endif + +char * +__stpncpy_chk(char * __restrict dst, const char * __restrict src, size_t len, + size_t slen) +{ + if (len > slen) + __chk_fail(); + + if (__ssp_overlap(src, dst, len)) + __chk_fail(); + + return stpncpy(dst, src, len); +} diff --git a/lib/ssp/strcat_chk.c b/lib/ssp/strcat_chk.c new file mode 100644 index 0000000..d57f955 --- /dev/null +++ b/lib/ssp/strcat_chk.c @@ -0,0 +1,62 @@ +/* $NetBSD: strcat_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: strcat_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +char *__strcat_chk(char * __restrict, const char * __restrict, size_t); + +char * +__strcat_chk(char * __restrict dst, const char * __restrict src, size_t slen) +{ + char *d; + + for (d = dst; *d; d++) { + if (slen-- == 0) + __chk_fail(); + } + + while (*src) { + if (slen-- == 0) + __chk_fail(); + *d++ = *src++; + } + + if (slen-- == 0) + __chk_fail(); + + *d = '\0'; + return dst; +} diff --git a/lib/ssp/strcpy_chk.c b/lib/ssp/strcpy_chk.c new file mode 100644 index 0000000..cef160a --- /dev/null +++ b/lib/ssp/strcpy_chk.c @@ -0,0 +1,55 @@ +/* $NetBSD: strcpy_chk.c,v 1.8 2015/05/09 15:42:21 christos Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: strcpy_chk.c,v 1.8 2015/05/09 15:42:21 christos Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef memcpy + +char *__strcpy_chk(char * __restrict, const char * __restrict, size_t); + +char * +__strcpy_chk(char * __restrict dst, const char * __restrict src, size_t slen) +{ + size_t len = strlen(src) + 1; + + if (len > slen) + __chk_fail(); + + if (__ssp_overlap(src, dst, len)) + __chk_fail(); + + return memcpy(dst, src, len); +} diff --git a/lib/ssp/strncat_chk.c b/lib/ssp/strncat_chk.c new file mode 100644 index 0000000..5ce5a9e --- /dev/null +++ b/lib/ssp/strncat_chk.c @@ -0,0 +1,73 @@ +/* $NetBSD: strncat_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: strncat_chk.c,v 1.5 2014/09/17 00:39:28 joerg Exp $"); + +/*LINTLIBRARY*/ + +#include +#include +#include + +char *__strncat_chk(char * __restrict, const char * __restrict, size_t, + size_t); + +char * +__strncat_chk(char * __restrict dst, const char * __restrict src, size_t len, + size_t slen) +{ + char *d; + + if (len == 0) + return dst; + + if (len > slen) + __chk_fail(); + + for (d = dst; *d; d++) { + if (slen-- == 0) + __chk_fail(); + } + + do { + if ((*d = *src++) == '\0') + break; + if (slen-- == 0) + __chk_fail(); + d++; + } while (--len != 0); + + if (slen-- == 0) + __chk_fail(); + + *d = '\0'; + return dst; +} diff --git a/lib/ssp/strncpy_chk.c b/lib/ssp/strncpy_chk.c new file mode 100644 index 0000000..591157a --- /dev/null +++ b/lib/ssp/strncpy_chk.c @@ -0,0 +1,55 @@ +/* $NetBSD: strncpy_chk.c,v 1.6 2015/05/09 15:42:21 christos Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: strncpy_chk.c,v 1.6 2015/05/09 15:42:21 christos Exp $"); + +/*LINTLIBRARY*/ + +#include +#include + +#undef strncpy + +char *__strncpy_chk(char * __restrict, const char * __restrict, size_t, + size_t); + +char * +__strncpy_chk(char * __restrict dst, const char * __restrict src, size_t len, + size_t slen) +{ + if (len > slen) + __chk_fail(); + + if (__ssp_overlap(src, dst, len)) + __chk_fail(); + + return strncpy(dst, src, len); +} diff --git a/lib/ssp/vsnprintf_chk.c b/lib/ssp/vsnprintf_chk.c new file mode 100644 index 0000000..2b88029 --- /dev/null +++ b/lib/ssp/vsnprintf_chk.c @@ -0,0 +1,51 @@ +/* $NetBSD: vsnprintf_chk.c,v 1.5 2008/04/28 20:23:00 martin Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: vsnprintf_chk.c,v 1.5 2008/04/28 20:23:00 martin Exp $"); + +/*LINTLIBRARY*/ + +#include +#include +#include +#include + +#undef vsnprintf + +int +__vsnprintf_chk(char * __restrict buf, size_t len, int flags, size_t slen, + const char * __restrict fmt, va_list ap) +{ + if (len > slen) + __chk_fail(); + + return vsnprintf(buf, len, fmt, ap); +} diff --git a/lib/ssp/vsprintf_chk.c b/lib/ssp/vsprintf_chk.c new file mode 100644 index 0000000..fec8a18 --- /dev/null +++ b/lib/ssp/vsprintf_chk.c @@ -0,0 +1,60 @@ +/* $NetBSD: vsprintf_chk.c,v 1.6 2009/02/05 05:39:38 lukem Exp $ */ + +/*- + * Copyright (c) 2006 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Christos Zoulas. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include +__RCSID("$NetBSD: vsprintf_chk.c,v 1.6 2009/02/05 05:39:38 lukem Exp $"); + +/*LINTLIBRARY*/ + +#include +#include +#include +#include +#include + +#undef vsprintf +#undef vsnprintf + +/*ARGSUSED*/ +int +__vsprintf_chk(char * __restrict buf, int flags, size_t slen, + const char * __restrict fmt, va_list ap) +{ + int rv; + + if (slen > (size_t)INT_MAX) + rv = vsprintf(buf, fmt, ap); + else { + if ((rv = vsnprintf(buf, slen, fmt, ap)) >= 0 && (size_t)rv >= slen) + __chk_fail(); + } + + return rv; +} diff --git a/lib/stdio/Makefile.inc b/lib/stdio/Makefile.inc new file mode 100644 index 0000000..2126cea --- /dev/null +++ b/lib/stdio/Makefile.inc @@ -0,0 +1,285 @@ +if HAVE_STDIO_DIR + +if NEWLIB_NANO_FORMATTED_IO +libc_a_SOURCES += \ + %D%/nano-vfprintf_float.c \ + %D%/nano-svfprintf.c \ + %D%/nano-svfscanf.c \ + %D%/nano-vfprintf.c \ + %D%/nano-vfprintf_i.c \ + %D%/nano-vfscanf.c \ + %D%/nano-vfscanf_i.c \ + %D%/nano-vfscanf_float.c +else +libc_a_SOURCES += \ + %D%/fiprintf.c \ + %D%/fiscanf.c \ + %D%/iprintf.c \ + %D%/iscanf.c \ + %D%/siprintf.c \ + %D%/siscanf.c \ + %D%/sniprintf.c \ + %D%/svfiprintf.c \ + %D%/svfiscanf.c \ + %D%/svfprintf.c \ + %D%/svfscanf.c \ + %D%/vdiprintf.c \ + %D%/vfprintf.c \ + %D%/vfiprintf.c \ + %D%/vfiscanf.c \ + %D%/vfscanf.c \ + %D%/vfwprintf.c \ + %D%/viprintf.c \ + %D%/viscanf.c \ + %D%/vsiprintf.c \ + %D%/vsiscanf.c \ + %D%/vsniprintf.c +endif + +libc_a_SOURCES += \ + %D%/clearerr.c \ + %D%/fclose.c \ + %D%/fdopen.c \ + %D%/feof.c \ + %D%/ferror.c \ + %D%/fflush.c \ + %D%/fgetc.c \ + %D%/fgetpos.c \ + %D%/fgets.c \ + %D%/fileno.c \ + %D%/findfp.c \ + %D%/flags.c \ + %D%/fopen.c \ + %D%/fprintf.c \ + %D%/fputc.c \ + %D%/fputs.c \ + %D%/fread.c \ + %D%/freopen.c \ + %D%/fscanf.c \ + %D%/fseek.c \ + %D%/fsetpos.c \ + %D%/ftell.c \ + %D%/fvwrite.c \ + %D%/fwalk.c \ + %D%/fwrite.c \ + %D%/getc.c \ + %D%/getchar.c \ + %D%/getc_u.c \ + %D%/getchar_u.c \ + %D%/getdelim.c \ + %D%/getline.c \ + %D%/gets.c \ + %D%/makebuf.c \ + %D%/perror.c \ + %D%/printf.c \ + %D%/putc.c \ + %D%/putchar.c \ + %D%/putc_u.c \ + %D%/putchar_u.c \ + %D%/puts.c \ + %D%/refill.c \ + %D%/remove.c \ + %D%/rename.c \ + %D%/rewind.c \ + %D%/rget.c \ + %D%/scanf.c \ + %D%/sccl.c \ + %D%/setbuf.c \ + %D%/setbuffer.c \ + %D%/setlinebuf.c \ + %D%/setvbuf.c \ + %D%/snprintf.c \ + %D%/sprintf.c \ + %D%/sscanf.c \ + %D%/stdio.c \ + %D%/svfiwprintf.c \ + %D%/svfiwscanf.c \ + %D%/svfwprintf.c \ + %D%/svfwscanf.c \ + %D%/tmpfile.c \ + %D%/tmpnam.c \ + %D%/ungetc.c \ + %D%/vdprintf.c \ + %D%/vfiwprintf.c \ + %D%/vfiwscanf.c \ + %D%/vfwscanf.c \ + %D%/vprintf.c \ + %D%/vscanf.c \ + %D%/vsnprintf.c \ + %D%/vsprintf.c \ + %D%/vsscanf.c \ + %D%/wbuf.c \ + %D%/wsetup.c + +## The following are EL/IX level 2 interfaces +if !ELIX_LEVEL_1 +%C%_ELIX_2_SOURCES = \ + %D%/asprintf.c \ + %D%/fcloseall.c \ + %D%/fseeko.c \ + %D%/ftello.c \ + %D%/getw.c \ + %D%/mktemp.c \ + %D%/putw.c \ + %D%/vasprintf.c +if !NEWLIB_NANO_FORMATTED_IO +%C%_ELIX_2_SOURCES += \ + %D%/asiprintf.c \ + %D%/vasiprintf.c +endif !NEWLIB_NANO_FORMATTED_IO +endif !ELIX_LEVEL_1 + +## The following are EL/IX level 2 interfaces +if ELIX_LEVEL_1 +%C%_ELIX_4_SOURCES = +else +if ELIX_LEVEL_2 +%C%_ELIX_4_SOURCES = +else +if ELIX_LEVEL_3 +%C%_ELIX_4_SOURCES = +else +%C%_ELIX_4_SOURCES = \ + %D%/asnprintf.c \ + %D%/clearerr_u.c \ + %D%/dprintf.c \ + %D%/feof_u.c \ + %D%/ferror_u.c \ + %D%/fflush_u.c \ + %D%/fgetc_u.c \ + %D%/fgets_u.c \ + %D%/fgetwc.c \ + %D%/fgetwc_u.c \ + %D%/fgetws.c \ + %D%/fgetws_u.c \ + %D%/fileno_u.c \ + %D%/fmemopen.c \ + %D%/fopencookie.c \ + %D%/fpurge.c \ + %D%/fputc_u.c \ + %D%/fputs_u.c \ + %D%/fputwc.c \ + %D%/fputwc_u.c \ + %D%/fputws.c \ + %D%/fputws_u.c \ + %D%/fread_u.c \ + %D%/fsetlocking.c \ + %D%/funopen.c \ + %D%/fwide.c \ + %D%/fwprintf.c \ + %D%/fwrite_u.c \ + %D%/fwscanf.c \ + %D%/getwc.c \ + %D%/getwc_u.c \ + %D%/getwchar.c \ + %D%/getwchar_u.c \ + %D%/open_memstream.c \ + %D%/putwc.c \ + %D%/putwc_u.c \ + %D%/putwchar.c \ + %D%/putwchar_u.c \ + %D%/stdio_ext.c \ + %D%/swprintf.c \ + %D%/swscanf.c \ + %D%/ungetwc.c \ + %D%/vasnprintf.c \ + %D%/vswprintf.c \ + %D%/vswscanf.c \ + %D%/vwprintf.c \ + %D%/vwscanf.c \ + %D%/wprintf.c \ + %D%/wscanf.c +if !NEWLIB_NANO_FORMATTED_IO +%C%_ELIX_4_SOURCES += \ + %D%/asniprintf.c \ + %D%/diprintf.c \ + %D%/vasniprintf.c +endif !NEWLIB_NANO_FORMATTED_IO +endif !ELIX_LEVEL_3 +endif !ELIX_LEVEL_2 +endif !ELIX_LEVEL_1 + +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_4_SOURCES) + +endif + +LIBC_CHEWOUT_FILES += \ + %D%/clearerr.def \ + %D%/diprintf.def \ + %D%/dprintf.def \ + %D%/fcloseall.def \ + %D%/fclose.def \ + %D%/fdopen.def \ + %D%/feof.def \ + %D%/ferror.def \ + %D%/fflush.def \ + %D%/fgetc.def \ + %D%/fgetpos.def \ + %D%/fgets.def \ + %D%/fgetwc.def \ + %D%/fgetws.def \ + %D%/fileno.def \ + %D%/fmemopen.def \ + %D%/fopen.def \ + %D%/fopencookie.def \ + %D%/fpurge.def \ + %D%/fputc.def \ + %D%/fputs.def \ + %D%/fputwc.def \ + %D%/fputws.def \ + %D%/fread.def \ + %D%/freopen.def \ + %D%/fseek.def \ + %D%/fsetlocking.def \ + %D%/fsetpos.def \ + %D%/ftell.def \ + %D%/funopen.def \ + %D%/fwide.def \ + %D%/fwrite.def \ + %D%/getc.def \ + %D%/getc_u.def \ + %D%/getchar.def \ + %D%/getchar_u.def \ + %D%/getdelim.def \ + %D%/getline.def \ + %D%/gets.def \ + %D%/getw.def \ + %D%/getwchar.def \ + %D%/mktemp.def \ + %D%/nano-vfprintf.def \ + %D%/nano-vfscanf.def \ + %D%/open_memstream.def \ + %D%/perror.def \ + %D%/putc.def \ + %D%/putc_u.def \ + %D%/putchar.def \ + %D%/putchar_u.def \ + %D%/puts.def \ + %D%/putw.def \ + %D%/putwchar.def \ + %D%/remove.def \ + %D%/rename.def \ + %D%/rewind.def \ + %D%/setbuf.def \ + %D%/setbuffer.def \ + %D%/setlinebuf.def \ + %D%/setvbuf.def \ + %D%/siprintf.def \ + %D%/siscanf.def \ + %D%/sprintf.def \ + %D%/sscanf.def \ + %D%/stdio_ext.def \ + %D%/swprintf.def \ + %D%/swscanf.def \ + %D%/tmpfile.def \ + %D%/tmpnam.def \ + %D%/ungetc.def \ + %D%/ungetwc.def \ + %D%/vfprintf.def \ + %D%/vfscanf.def \ + %D%/vfwprintf.def \ + %D%/vfwscanf.def \ + %D%/viprintf.def \ + %D%/viscanf.def + +LIBC_CHAPTERS += %D%/stdio.tex diff --git a/lib/stdio/asiprintf.c b/lib/stdio/asiprintf.c new file mode 100644 index 0000000..af25e9a --- /dev/null +++ b/lib/stdio/asiprintf.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This code was copied from asprintf.c */ +/* doc in siprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_asiprintf_r (struct _reent *ptr, + char **strp, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret >= 0) + { + *f._p = 0; + *strp = (char *) f._bf._base; + } + return (ret); +} + +#ifndef _REENT_ONLY + +int +asiprintf (char **strp, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (_REENT, &f, fmt, ap); + va_end (ap); + if (ret >= 0) + { + *f._p = 0; + *strp = (char *) f._bf._base; + } + return (ret); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/asniprintf.c b/lib/stdio/asniprintf.c new file mode 100644 index 0000000..97e7774 --- /dev/null +++ b/lib/stdio/asniprintf.c @@ -0,0 +1,106 @@ +/* Copyright (C) 2007, 2008 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +/* This code was derived from asprintf.c */ +/* doc in siprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +char * +_asniprintf_r (struct _reent *ptr, + char *buf, + size_t *lenp, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + size_t len = *lenp; + + if (buf && len) + { + /* mark an existing buffer, but allow allocation of larger string */ + f._flags = __SWR | __SSTR | __SOPT; + } + else + { + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + len = 0; + buf = NULL; + } + f._bf._base = f._p = (unsigned char *) buf; + /* For now, inherit the 32-bit signed limit of FILE._bf._size. + FIXME - it would be nice to rewrite sys/reent.h to support size_t + for _size. */ + if (len > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return NULL; + } + f._bf._size = f._w = len; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < 0) + return NULL; + *lenp = ret; + *f._p = '\0'; + return (char *) f._bf._base; +} + +#ifndef _REENT_ONLY + +char * +asniprintf (char *buf, + size_t *lenp, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + size_t len = *lenp; + struct _reent *ptr = _REENT; + + if (buf && len) + { + /* mark an existing buffer, but allow allocation of larger string */ + f._flags = __SWR | __SSTR | __SOPT; + } + else + { + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + len = 0; + buf = NULL; + } + f._bf._base = f._p = (unsigned char *) buf; + /* For now, inherit the 32-bit signed limit of FILE._bf._size. + FIXME - it would be nice to rewrite sys/reent.h to support size_t + for _size. */ + if (len > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return NULL; + } + f._bf._size = f._w = len; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < 0) + return NULL; + *lenp = ret; + *f._p = '\0'; + return (char *) f._bf._base; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/asnprintf.c b/lib/stdio/asnprintf.c new file mode 100644 index 0000000..f825561 --- /dev/null +++ b/lib/stdio/asnprintf.c @@ -0,0 +1,117 @@ +/* Copyright (C) 2007, 2008 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +/* This code was derived from asprintf.c */ +/* doc in sprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +char * +_asnprintf_r (struct _reent *__restrict ptr, + char *buf, + size_t *lenp, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + size_t len = *lenp; + + if (buf && len) + { + /* mark an existing buffer, but allow allocation of larger string */ + f._flags = __SWR | __SSTR | __SOPT; + } + else + { + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + len = 0; + buf = NULL; + } + f._bf._base = f._p = (unsigned char *) buf; + /* For now, inherit the 32-bit signed limit of FILE._bf._size. + FIXME - it would be nice to rewrite sys/reent.h to support size_t + for _size. */ + if (len > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return NULL; + } + f._bf._size = f._w = len; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < 0) + return NULL; + *lenp = ret; + *f._p = '\0'; + return (char *) f._bf._base; +} + +#ifdef _NANO_FORMATTED_IO +char * +_asniprintf_r (struct _reent *, char *, size_t *, const char *, ...) + _ATTRIBUTE ((__alias__("_asnprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +char * +asnprintf (char *__restrict buf, + size_t *__restrict lenp, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + size_t len = *lenp; + struct _reent *ptr = _REENT; + + if (buf && len) + { + /* mark an existing buffer, but allow allocation of larger string */ + f._flags = __SWR | __SSTR | __SOPT; + } + else + { + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + len = 0; + buf = NULL; + } + f._bf._base = f._p = (unsigned char *) buf; + /* For now, inherit the 32-bit signed limit of FILE._bf._size. + FIXME - it would be nice to rewrite sys/reent.h to support size_t + for _size. */ + if (len > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return NULL; + } + f._bf._size = f._w = len; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < 0) + return NULL; + *lenp = ret; + *f._p = '\0'; + return (char *) f._bf._base; +} + +#ifdef _NANO_FORMATTED_IO +char * +asniprintf (char *, size_t *, const char *, ...) + _ATTRIBUTE ((__alias__("asnprintf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/asprintf.c b/lib/stdio/asprintf.c new file mode 100644 index 0000000..542e70e --- /dev/null +++ b/lib/stdio/asprintf.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This code was copied from sprintf.c */ +/* doc in sprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_asprintf_r (struct _reent *ptr, + char **__restrict strp, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret >= 0) + { + *f._p = 0; + *strp = (char *) f._bf._base; + } + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +_asiprintf_r (struct _reent *, char **, const char *, ...) + _ATTRIBUTE ((__alias__("_asprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +asprintf (char **__restrict strp, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (_REENT, &f, fmt, ap); + va_end (ap); + if (ret >= 0) + { + *f._p = 0; + *strp = (char *) f._bf._base; + } + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +asiprintf (char **, const char *, ...) + _ATTRIBUTE ((__alias__("asprintf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/clearerr.c b/lib/stdio/clearerr.c new file mode 100644 index 0000000..ff08a8b --- /dev/null +++ b/lib/stdio/clearerr.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---clear file or stream error indicator + +INDEX + clearerr +INDEX + clearerr_unlocked + +SYNOPSIS + #include + void clearerr(FILE *<[fp]>); + + #define _BSD_SOURCE + #include + void clearerr_unlocked(FILE *<[fp]>); + +DESCRIPTION +The <> functions maintain an error indicator with each file +pointer <[fp]>, to record whether any read or write errors have +occurred on the associated file or stream. Similarly, it maintains an +end-of-file indicator to record whether there is no more data in the +file. + +Use <> to reset both of these indicators. + +See <> and <> to query the two indicators. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +RETURNS +<> does not return a result. + +PORTABILITY +ANSI C requires <>. + +<> is a BSD extension also provided by GNU libc. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include "local.h" + +/* A subroutine version of the macro clearerr. */ + +#undef clearerr + +void +clearerr (FILE * fp) +{ + CHECK_INIT(_REENT, fp); + _newlib_flockfile_start (fp); + __sclearerr (fp); + _newlib_flockfile_end (fp); +} diff --git a/lib/stdio/clearerr_u.c b/lib/stdio/clearerr_u.c new file mode 100644 index 0000000..4952f77 --- /dev/null +++ b/lib/stdio/clearerr_u.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include "local.h" + +/* A subroutine version of the macro clearerr_unlocked. */ + +#undef clearerr_unlocked + +void +clearerr_unlocked (FILE * fp) +{ + CHECK_INIT(_REENT, fp); + __sclearerr (fp); +} diff --git a/lib/stdio/diprintf.c b/lib/stdio/diprintf.c new file mode 100644 index 0000000..8ac5835 --- /dev/null +++ b/lib/stdio/diprintf.c @@ -0,0 +1,80 @@ +/* Copyright (C) 2005, 2007 Shaun Jackman + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>, <>---print to a file descriptor (integer only) + +INDEX + diprintf +INDEX + _diprintf_r +INDEX + vdiprintf +INDEX + _vdiprintf_r + +SYNOPSIS + #include + #include + int diprintf(int <[fd]>, const char *<[format]>, ...); + int vdiprintf(int <[fd]>, const char *<[format]>, va_list <[ap]>); + int _diprintf_r(struct _reent *<[ptr]>, int <[fd]>, + const char *<[format]>, ...); + int _vdiprintf_r(struct _reent *<[ptr]>, int <[fd]>, + const char *<[format]>, va_list <[ap]>); + +DESCRIPTION +<> and <> are similar to <> and <>, +except that only integer format specifiers are processed. + +The functions <<_diprintf_r>> and <<_vdiprintf_r>> are simply +reentrant versions of the functions above. + +RETURNS +Similar to <> and <>. + +PORTABILITY +This set of functions is an integer-only extension, and is not portable. + +Supporting OS subroutines required: <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include + +int +_diprintf_r (struct _reent *ptr, + int fd, + const char *format, ...) +{ + va_list ap; + int n; + + va_start (ap, format); + n = _vdiprintf_r (ptr, fd, format, ap); + va_end (ap); + return n; +} + +#ifndef _REENT_ONLY + +int +diprintf (int fd, + const char *format, ...) +{ + va_list ap; + int n; + + va_start (ap, format); + n = _vdiprintf_r (_REENT, fd, format, ap); + va_end (ap); + return n; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/dprintf.c b/lib/stdio/dprintf.c new file mode 100644 index 0000000..ae9f86d --- /dev/null +++ b/lib/stdio/dprintf.c @@ -0,0 +1,97 @@ +/* Copyright 2005, 2007 Shaun Jackman + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>, <>---print to a file descriptor + +INDEX + dprintf +INDEX + _dprintf_r +INDEX + vdprintf +INDEX + _vdprintf_r + +SYNOPSIS + #include + #include + int dprintf(int <[fd]>, const char *restrict <[format]>, ...); + int vdprintf(int <[fd]>, const char *restrict <[format]>, + va_list <[ap]>); + int _dprintf_r(struct _reent *<[ptr]>, int <[fd]>, + const char *restrict <[format]>, ...); + int _vdprintf_r(struct _reent *<[ptr]>, int <[fd]>, + const char *restrict <[format]>, va_list <[ap]>); + +DESCRIPTION +<> and <> allow printing a format, similarly to +<>, but write to a file descriptor instead of to a <> +stream. + +The functions <<_dprintf_r>> and <<_vdprintf_r>> are simply +reentrant versions of the functions above. + +RETURNS +The return value and errors are exactly as for <>, except that +<> may also be set to <> if the heap is exhausted. + +PORTABILITY +This function is originally a GNU extension in glibc and is not portable. + +Supporting OS subroutines required: <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_dprintf_r (struct _reent *ptr, + int fd, + const char *__restrict format, ...) +{ + va_list ap; + int n; + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, format); + n = _vdprintf_r (ptr, fd, format, ap); + va_end (ap); + return n; +} + +#ifdef _NANO_FORMATTED_IO +int +_diprintf_r (struct _reent *, int, const char *, ...) + _ATTRIBUTE ((__alias__("_dprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +dprintf (int fd, + const char *__restrict format, ...) +{ + va_list ap; + int n; + struct _reent *ptr = _REENT; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, format); + n = _vdprintf_r (ptr, fd, format, ap); + va_end (ap); + return n; +} + +#ifdef _NANO_FORMATTED_IO +int +diprintf (int, const char *, ...) + _ATTRIBUTE ((__alias__("dprintf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/fclose.c b/lib/stdio/fclose.c new file mode 100644 index 0000000..983ae2c --- /dev/null +++ b/lib/stdio/fclose.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---close a file + +INDEX + fclose +INDEX + _fclose_r + +SYNOPSIS + #include + int fclose(FILE *<[fp]>); + int _fclose_r(struct _reent *<[reent]>, FILE *<[fp]>); + +DESCRIPTION +If the file or stream identified by <[fp]> is open, <> closes +it, after first ensuring that any pending data is written (by calling +<)>>). + +The alternate function <<_fclose_r>> is a reentrant version. +The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<> returns <<0>> if successful (including when <[fp]> is +<> or not an open file); otherwise, it returns <>. + +PORTABILITY +<> is required by ANSI C. + +Required OS subroutines: <>, <>, <>, <>, +<>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_fclose_r (struct _reent *rptr, + register FILE * fp) +{ + int r; + + if (fp == NULL) + return (0); /* on NULL */ + + CHECK_INIT (rptr, fp); + + /* We can't use the _newlib_flockfile_XXX macros here due to the + interlocked locking with the sfp_lock. */ +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + int __oldcancel; + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldcancel); +#endif + if (!(fp->_flags2 & __SNLK)) + _flockfile (fp); + + if (fp->_flags == 0) /* not open! */ + { + if (!(fp->_flags2 & __SNLK)) + _funlockfile (fp); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + return (0); + } +#ifdef _STDIO_BSD_SEMANTICS + /* BSD and Glibc systems only flush streams which have been written to. */ + r = (fp->_flags & __SWR) ? __sflush_r (rptr, fp) : 0; +#else + /* Follow POSIX semantics exactly. Unconditionally flush to allow + special handling for seekable read files to reposition file to last + byte processed as opposed to last byte read ahead into the buffer. */ + r = __sflush_r (rptr, fp); +#endif + if (fp->_close != NULL && fp->_close (rptr, fp->_cookie) < 0) + r = EOF; + if (fp->_flags & __SMBF) + _free_r (rptr, (char *) fp->_bf._base); + if (HASUB (fp)) + FREEUB (rptr, fp); + if (HASLB (fp)) + FREELB (rptr, fp); + __sfp_lock_acquire (); + fp->_flags = 0; /* release this FILE for reuse */ + if (!(fp->_flags2 & __SNLK)) + _funlockfile (fp); +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + + __sfp_lock_release (); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + + return (r); +} + +#ifndef _REENT_ONLY + +int +fclose (register FILE * fp) +{ + return _fclose_r(_REENT, fp); +} + +#endif diff --git a/lib/stdio/fcloseall.c b/lib/stdio/fcloseall.c new file mode 100644 index 0000000..e840af2 --- /dev/null +++ b/lib/stdio/fcloseall.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---close all files + +INDEX + fcloseall +INDEX + _fcloseall_r + +SYNOPSIS + #include + int fcloseall(void); + int _fcloseall_r (struct _reent *<[ptr]>); + +DESCRIPTION +<> closes all files in the current reentrancy struct's domain. +The function <<_fcloseall_r>> is the same function, except the reentrancy +struct is passed in as the <[ptr]> argument. + +This function is not recommended as it closes all streams, including +the std streams. + +RETURNS +<> returns <<0>> if all closes are successful. Otherwise, +EOF is returned. + +PORTABILITY +<> is a glibc extension. + +Required OS subroutines: <>, <>, <>, <>, +<>, <>, <>. +*/ +/* This file based upon fwalk.c. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_fcloseall_r (struct _reent *ptr) +{ + /* There are no thread-specific FILE objects */ + return 0; +} + +#ifndef _REENT_ONLY + +int +fcloseall (void) +{ + return _fwalk_sglue (_GLOBAL_REENT, _fclose_r, &__sglue); +} + +#endif diff --git a/lib/stdio/fdopen.c b/lib/stdio/fdopen.c new file mode 100644 index 0000000..3481154 --- /dev/null +++ b/lib/stdio/fdopen.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---turn open file into a stream + +INDEX + fdopen +INDEX + _fdopen_r + +SYNOPSIS + #include + FILE *fdopen(int <[fd]>, const char *<[mode]>); + FILE *_fdopen_r(struct _reent *<[reent]>, + int <[fd]>, const char *<[mode]>); + +DESCRIPTION +<> produces a file descriptor of type <>, from a +descriptor for an already-open file (returned, for example, by the +system subroutine <> rather than by <>). +The <[mode]> argument has the same meanings as in <>. + +RETURNS +File pointer or <>, as for <>. + +PORTABILITY +<> is ANSI. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" +#include <_syslist.h> + +FILE * +_fdopen_r (struct _reent *ptr, + int fd, + const char *mode) +{ + register FILE *fp; + int flags, oflags; +#ifdef HAVE_FCNTL + int fdflags, fdmode; +#endif + + if ((flags = __sflags (ptr, mode, &oflags)) == 0) + return 0; + + /* make sure the mode the user wants is a subset of the actual mode */ +#ifdef HAVE_FCNTL + if ((fdflags = _fcntl_r (ptr, fd, F_GETFL, 0)) < 0) + return 0; + fdmode = fdflags & O_ACCMODE; + if (fdmode != O_RDWR && (fdmode != (oflags & O_ACCMODE))) + { + _REENT_ERRNO(ptr) = EBADF; + return 0; + } +#endif + + if ((fp = __sfp (ptr)) == 0) + return 0; + + _newlib_flockfile_start (fp); + + fp->_flags = flags; + /* POSIX recommends setting the O_APPEND bit on fd to match append + streams. Someone may later clear O_APPEND on fileno(fp), but the + stream must still remain in append mode. Rely on __sflags + setting __SAPP properly. */ +#ifdef HAVE_FCNTL + if ((oflags & O_APPEND) && !(fdflags & O_APPEND)) + _fcntl_r (ptr, fd, F_SETFL, fdflags | O_APPEND); +#endif + fp->_file = fd; + fp->_cookie = (void *) fp; + +#undef _read +#undef _write +#undef _seek +#undef _close + + fp->_read = __sread; + fp->_write = __swrite; + fp->_seek = __sseek; + fp->_close = __sclose; + +#ifdef __SCLE + /* Explicit given mode results in explicit setting mode on fd */ + if (oflags & O_BINARY) + setmode (fp->_file, O_BINARY); + else if (oflags & O_TEXT) + setmode (fp->_file, O_TEXT); + if (__stextmode (fp->_file)) + fp->_flags |= __SCLE; +#endif + + _newlib_flockfile_end (fp); + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +fdopen (int fd, + const char *mode) +{ + return _fdopen_r (_REENT, fd, mode); +} + +#endif diff --git a/lib/stdio/feof.c b/lib/stdio/feof.c new file mode 100644 index 0000000..674986b --- /dev/null +++ b/lib/stdio/feof.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---test for end of file + +INDEX + feof +INDEX + feof_unlocked + +SYNOPSIS + #include + int feof(FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int feof_unlocked(FILE *<[fp]>); + +DESCRIPTION +<> tests whether or not the end of the file identified by <[fp]> +has been reached. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +RETURNS +<> returns <<0>> if the end of file has not yet been reached; if +at end of file, the result is nonzero. + +PORTABILITY +<> is required by ANSI C. + +<> is a BSD extension also provided by GNU libc. + +No supporting OS subroutines are required. +*/ + +#include +#include "local.h" + +/* A subroutine version of the macro feof. */ + +#undef feof + +int +feof (FILE * fp) +{ + int result; + CHECK_INIT(_REENT, fp); + _newlib_flockfile_start (fp); + result = __sfeof (fp); + _newlib_flockfile_end (fp); + return result; +} diff --git a/lib/stdio/feof_u.c b/lib/stdio/feof_u.c new file mode 100644 index 0000000..e9238e1 --- /dev/null +++ b/lib/stdio/feof_u.c @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include "local.h" + +/* A subroutine version of the macro feof_unlocked. */ + +#undef feof_unlocked + +int +feof_unlocked (FILE * fp) +{ + CHECK_INIT(_REENT, fp); + return __sfeof (fp); +} diff --git a/lib/stdio/ferror.c b/lib/stdio/ferror.c new file mode 100644 index 0000000..dc4d830 --- /dev/null +++ b/lib/stdio/ferror.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---test whether read/write error has occurred + +INDEX + ferror +INDEX + ferror_unlocked + +SYNOPSIS + #include + int ferror(FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int ferror_unlocked(FILE *<[fp]>); + +DESCRIPTION +The <> functions maintain an error indicator with each file +pointer <[fp]>, to record whether any read or write errors have +occurred on the associated file or stream. +Use <> to query this indicator. + +See <> to reset the error indicator. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +RETURNS +<> returns <<0>> if no errors have occurred; it returns a +nonzero value otherwise. + +PORTABILITY +ANSI C requires <>. + +<> is a BSD extension also provided by GNU libc. + +No supporting OS subroutines are required. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include "local.h" + +/* A subroutine version of the macro ferror. */ + +#undef ferror + +int +ferror (FILE * fp) +{ + int result; + CHECK_INIT(_REENT, fp); + _newlib_flockfile_start (fp); + result = __sferror (fp); + _newlib_flockfile_end (fp); + return result; +} diff --git a/lib/stdio/ferror_u.c b/lib/stdio/ferror_u.c new file mode 100644 index 0000000..ae1e278 --- /dev/null +++ b/lib/stdio/ferror_u.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include "local.h" + +/* A subroutine version of the macro ferror_unlocked. */ + +#undef ferror_unlocked + +int +ferror_unlocked (FILE * fp) +{ + CHECK_INIT(_REENT, fp); + return __sferror (fp); +} diff --git a/lib/stdio/fflush.c b/lib/stdio/fflush.c new file mode 100644 index 0000000..d51e901 --- /dev/null +++ b/lib/stdio/fflush.c @@ -0,0 +1,294 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---flush buffered file output + +INDEX + fflush +INDEX + fflush_unlocked +INDEX + _fflush_r +INDEX + _fflush_unlocked_r + +SYNOPSIS + #include + int fflush(FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int fflush_unlocked(FILE *<[fp]>); + + #include + int _fflush_r(struct _reent *<[reent]>, FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int _fflush_unlocked_r(struct _reent *<[reent]>, FILE *<[fp]>); + +DESCRIPTION +The <> output functions can buffer output before delivering it +to the host system, in order to minimize the overhead of system calls. + +Use <> to deliver any such pending output (for the file +or stream identified by <[fp]>) to the host system. + +If <[fp]> is <>, <> delivers pending output from all +open files. + +Additionally, if <[fp]> is a seekable input stream visiting a file +descriptor, set the position of the file descriptor to match next +unread byte, useful for obeying POSIX semantics when ending a process +without consuming all input from the stream. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The alternate functions <<_fflush_r>> and <<_fflush_unlocked_r>> are +reentrant versions, where the extra argument <[reent]> is a pointer to +a reentrancy structure, and <[fp]> must not be NULL. + +RETURNS +<> returns <<0>> unless it encounters a write error; in that +situation, it returns <>. + +PORTABILITY +ANSI C requires <>. The behavior on input streams is only +specified by POSIX, and not all implementations follow POSIX rules. + +<> is a BSD extension also provided by GNU libc. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include +#include "local.h" + +#ifdef __IMPL_UNLOCKED__ +#define _fflush_r _fflush_unlocked_r +#define fflush fflush_unlocked +#endif + +#ifndef __IMPL_UNLOCKED__ +/* Flush a single file, or (if fp is NULL) all files. */ + +/* Core function which does not lock file pointer. This gets called + directly from __srefill. */ +int +__sflush_r (struct _reent *ptr, + register FILE * fp) +{ + register unsigned char *p; + register _READ_WRITE_BUFSIZE_TYPE n; + register _READ_WRITE_RETURN_TYPE t; + short flags; + + flags = fp->_flags; + if ((flags & __SWR) == 0) + { +#ifdef _FSEEK_OPTIMIZATION + /* For a read stream, an fflush causes the next seek to be + unoptimized (i.e. forces a system-level seek). This conforms + to the POSIX and SUSv3 standards. */ + fp->_flags |= __SNPT; +#endif + + /* For a seekable stream with buffered read characters, we will attempt + a seek to the current position now. A subsequent read will then get + the next byte from the file rather than the buffer. This conforms + to the POSIX and SUSv3 standards. Note that the standards allow + this seek to be deferred until necessary, but we choose to do it here + to make the change simpler, more contained, and less likely + to miss a code scenario. */ + if ((fp->_r > 0 || fp->_ur > 0) && fp->_seek != NULL) + { + int tmp_errno; +#ifdef __LARGE64_FILES + _fpos64_t curoff; +#else + _fpos_t curoff; +#endif + + /* Save last errno and set errno to 0, so we can check if a device + returns with a valid position -1. We restore the last errno if + no other error condition has been encountered. */ + tmp_errno = _REENT_ERRNO(ptr); + _REENT_ERRNO(ptr) = 0; + /* Get the physical position we are at in the file. */ + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else + { + /* We don't know current physical offset, so ask for it. + Only ESPIPE and EINVAL are ignorable. */ +#ifdef __LARGE64_FILES + if (fp->_flags & __SL64) + curoff = fp->_seek64 (ptr, fp->_cookie, 0, SEEK_CUR); + else +#endif + curoff = fp->_seek (ptr, fp->_cookie, 0, SEEK_CUR); + if (curoff == -1L && _REENT_ERRNO(ptr) != 0) + { + int result = EOF; + if (_REENT_ERRNO(ptr) == ESPIPE || _REENT_ERRNO(ptr) == EINVAL) + { + result = 0; + _REENT_ERRNO(ptr) = tmp_errno; + } + else + fp->_flags |= __SERR; + return result; + } + } + if (fp->_flags & __SRD) + { + /* Current offset is at end of buffer. Compensate for + characters not yet read. */ + curoff -= fp->_r; + if (HASUB (fp)) + curoff -= fp->_ur; + } + /* Now physically seek to after byte last read. */ +#ifdef __LARGE64_FILES + if (fp->_flags & __SL64) + curoff = fp->_seek64 (ptr, fp->_cookie, curoff, SEEK_SET); + else +#endif + curoff = fp->_seek (ptr, fp->_cookie, curoff, SEEK_SET); + if (curoff != -1 || _REENT_ERRNO(ptr) == 0 + || _REENT_ERRNO(ptr) == ESPIPE || _REENT_ERRNO(ptr) == EINVAL) + { + /* Seek successful or ignorable error condition. + We can clear read buffer now. */ +#ifdef _FSEEK_OPTIMIZATION + fp->_flags &= ~__SNPT; +#endif + fp->_r = 0; + fp->_p = fp->_bf._base; + if ((fp->_flags & __SOFF) && (curoff != -1 || _REENT_ERRNO(ptr) == 0)) + fp->_offset = curoff; + _REENT_ERRNO(ptr) = tmp_errno; + if (HASUB (fp)) + FREEUB (ptr, fp); + } + else + { + fp->_flags |= __SERR; + return EOF; + } + } + return 0; + } + if ((p = fp->_bf._base) == NULL) + { + /* Nothing to flush. */ + return 0; + } + n = fp->_p - p; /* write this much */ + + /* + * Set these immediately to avoid problems with longjmp + * and to allow exchange buffering (via setvbuf) in user + * write function. + */ + fp->_p = p; + fp->_w = flags & (__SLBF | __SNBF) ? 0 : fp->_bf._size; + + while (n > 0) + { + t = fp->_write (ptr, fp->_cookie, (char *) p, n); + if (t <= 0) + { + fp->_flags |= __SERR; + return EOF; + } + p += t; + n -= t; + } + return 0; +} + +#ifdef _STDIO_BSD_SEMANTICS +/* Called from cleanup_stdio(). At exit time, we don't need file locking, + and we don't want to move the underlying file pointer unless we're + writing. */ +int +__sflushw_r (struct _reent *ptr, + register FILE *fp) +{ + return (fp->_flags & __SWR) ? __sflush_r (ptr, fp) : 0; +} +#endif + +#endif /* __IMPL_UNLOCKED__ */ + +int +_fflush_r (struct _reent *ptr, + register FILE * fp) +{ + int ret; + +#ifdef _REENT_SMALL + /* For REENT_SMALL platforms, it is possible we are being + called for the first time on a std stream. This std + stream can belong to a reentrant struct that is not + _REENT. If CHECK_INIT gets called below based on _REENT, + we will end up changing said file pointers to the equivalent + std stream off of _REENT. This causes unexpected behavior if + there is any data to flush on the _REENT std stream. There + are two alternatives to fix this: 1) make a reentrant fflush + or 2) simply recognize that this file has nothing to flush + and return immediately before performing a CHECK_INIT. Choice + 2 is implemented here due to its simplicity. */ + if (fp->_bf._base == NULL) + return 0; +#endif /* _REENT_SMALL */ + + CHECK_INIT (ptr, fp); + + if (!fp->_flags) + return 0; + + _newlib_flockfile_start (fp); + ret = __sflush_r (ptr, fp); + _newlib_flockfile_end (fp); + return ret; +} + +#ifndef _REENT_ONLY + +int +fflush (register FILE * fp) +{ + if (fp == NULL) + return _fwalk_sglue (_GLOBAL_REENT, _fflush_r, &__sglue); + + return _fflush_r (_REENT, fp); +} + +#endif /* _REENT_ONLY */ diff --git a/lib/stdio/fflush_u.c b/lib/stdio/fflush_u.c new file mode 100644 index 0000000..adcc460 --- /dev/null +++ b/lib/stdio/fflush_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fflush.c" diff --git a/lib/stdio/fgetc.c b/lib/stdio/fgetc.c new file mode 100644 index 0000000..21a6a9d --- /dev/null +++ b/lib/stdio/fgetc.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---get a character from a file or stream + +INDEX + fgetc +INDEX + fgetc_unlocked +INDEX + _fgetc_r +INDEX + _fgetc_unlocked_r + +SYNOPSIS + #include + int fgetc(FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int fgetc_unlocked(FILE *<[fp]>); + + #include + int _fgetc_r(struct _reent *<[ptr]>, FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int _fgetc_unlocked_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +Use <> to get the next single character from the file or stream +identified by <[fp]>. As a side effect, <> advances the file's +current position indicator. + +For a macro version of this function, see <>. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The functions <<_fgetc_r>> and <<_fgetc_unlocked_r>> are simply reentrant +versions that are passed the additional reentrant structure pointer +argument: <[ptr]>. + +RETURNS +The next character (read as an <>, and cast to +<>), unless there is no more data, or the host system reports a +read error; in either of these situations, <> returns <>. + +You can distinguish the two situations that cause an <> result by +using the <> and <> functions. + +PORTABILITY +ANSI C requires <>. + +<> is a BSD extension also provided by GNU libc. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include "local.h" + +int +_fgetc_r (struct _reent * ptr, + FILE * fp) +{ + int result; + CHECK_INIT(ptr, fp); + _newlib_flockfile_start (fp); + result = __sgetc_r (ptr, fp); + _newlib_flockfile_end (fp); + return result; +} + +#ifndef _REENT_ONLY + +int +fgetc (FILE * fp) +{ +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + int result; + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + _newlib_flockfile_start (fp); + result = __sgetc_r (reent, fp); + _newlib_flockfile_end (fp); + return result; +#else + return _fgetc_r (_REENT, fp); +#endif +} + +#endif /* !_REENT_ONLY */ + diff --git a/lib/stdio/fgetc_u.c b/lib/stdio/fgetc_u.c new file mode 100644 index 0000000..9a5719c --- /dev/null +++ b/lib/stdio/fgetc_u.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include "local.h" + +int +_fgetc_unlocked_r (struct _reent * ptr, + FILE * fp) +{ + CHECK_INIT(ptr, fp); + return __sgetc_r (ptr, fp); +} + +#ifndef _REENT_ONLY + +int +fgetc_unlocked (FILE * fp) +{ +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return __sgetc_r (reent, fp); +#else + return _fgetc_unlocked_r (_REENT, fp); +#endif +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fgetpos.c b/lib/stdio/fgetpos.c new file mode 100644 index 0000000..ba92730 --- /dev/null +++ b/lib/stdio/fgetpos.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---record position in a stream or file + +INDEX + fgetpos +INDEX + _fgetpos_r + +SYNOPSIS + #include + int fgetpos(FILE *restrict <[fp]>, fpos_t *restrict <[pos]>); + int _fgetpos_r(struct _reent *<[ptr]>, FILE *restrict <[fp]>, fpos_t *restrict <[pos]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <> to report on the current position for a file +identified by <[fp]>; <> will write a value +representing that position at <<*<[pos]>>>. Later, you can +use this value with <> to return the file to this +position. + +In the current implementation, <> simply uses a character +count to represent the file position; this is the same number that +would be returned by <>. + +RETURNS +<> returns <<0>> when successful. If <> fails, the +result is <<1>>. Failure occurs on streams that do not support +positioning; the global <> indicates this condition with the +value <>. + +PORTABILITY +<> is required by the ANSI C standard, but the meaning of the +value it records is not specified beyond requiring that it be +acceptable as an argument to <>. In particular, other +conforming C implementations may return a different result from +<> than what <> writes at <<*<[pos]>>>. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#include + +int +_fgetpos_r (struct _reent * ptr, + FILE *__restrict fp, + _fpos_t *__restrict pos) +{ + *pos = _ftell_r (ptr, fp); + + if (*pos != -1) + { + return 0; + } + return 1; +} + +#ifndef _REENT_ONLY + +int +fgetpos (FILE *__restrict fp, + _fpos_t *__restrict pos) +{ + return _fgetpos_r (_REENT, fp, pos); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fgets.c b/lib/stdio/fgets.c new file mode 100644 index 0000000..96a44a7 --- /dev/null +++ b/lib/stdio/fgets.c @@ -0,0 +1,198 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---get character string from a file or stream + +INDEX + fgets +INDEX + fgets_unlocked +INDEX + _fgets_r +INDEX + _fgets_unlocked_r + +SYNOPSIS + #include + char *fgets(char *restrict <[buf]>, int <[n]>, FILE *restrict <[fp]>); + + #define _GNU_SOURCE + #include + char *fgets_unlocked(char *restrict <[buf]>, int <[n]>, FILE *restrict <[fp]>); + + #include + char *_fgets_r(struct _reent *<[ptr]>, char *restrict <[buf]>, int <[n]>, FILE *restrict <[fp]>); + + #include + char *_fgets_unlocked_r(struct _reent *<[ptr]>, char *restrict <[buf]>, int <[n]>, FILE *restrict <[fp]>); + +DESCRIPTION + Reads at most <[n-1]> characters from <[fp]> until a newline + is found. The characters including to the newline are stored + in <[buf]>. The buffer is terminated with a 0. + + <> is a non-thread-safe version of <>. + <> may only safely be used within a scope + protected by flockfile() (or ftrylockfile()) and funlockfile(). This + function may safely be used in a multi-threaded program if and only + if they are called while the invoking thread owns the (FILE *) + object, as is the case after a successful call to the flockfile() or + ftrylockfile() functions. If threads are disabled, then + <> is equivalent to <>. + + The functions <<_fgets_r>> and <<_fgets_unlocked_r>> are simply + reentrant versions that are passed the additional reentrant structure + pointer argument: <[ptr]>. + +RETURNS + <> returns the buffer passed to it, with the data + filled in. If end of file occurs with some data already + accumulated, the data is returned with no other indication. If + no data are read, NULL is returned instead. + +PORTABILITY + <> should replace all uses of <>. Note however + that <> returns all of the data, while <> removes + the trailing newline (with no indication that it has done so.) + + <> is a GNU extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include "local.h" + +#ifdef __IMPL_UNLOCKED__ +#define _fgets_r _fgets_unlocked_r +#define fgets fgets_unlocked +#endif + +/* + * Read at most n-1 characters from the given file. + * Stop when a newline has been read, or the count runs out. + * Return first argument, or NULL if no characters were read. + */ + +char * +_fgets_r (struct _reent * ptr, + char *__restrict buf, + int n, + FILE *__restrict fp) +{ + size_t len; + char *s; + unsigned char *p, *t; + + if (n < 2) /* sanity check */ + return 0; + + s = buf; + + CHECK_INIT(ptr, fp); + + _newlib_flockfile_start (fp); +#ifdef __SCLE + if (fp->_flags & __SCLE) + { + int c = 0; + /* Sorry, have to do it the slow way */ + while (--n > 0 && (c = __sgetc_r (ptr, fp)) != EOF) + { + *s++ = c; + if (c == '\n') + break; + } + if (c == EOF && s == buf) + { + _newlib_flockfile_exit (fp); + return NULL; + } + *s = 0; + _newlib_flockfile_exit (fp); + return buf; + } +#endif + + n--; /* leave space for NUL */ + do + { + /* + * If the buffer is empty, refill it. + */ + if ((len = fp->_r) <= 0) + { + if (__srefill_r (ptr, fp)) + { + /* EOF: stop with partial or no line */ + if (s == buf) + { + _newlib_flockfile_exit (fp); + return 0; + } + break; + } + len = fp->_r; + } + p = fp->_p; + + /* + * Scan through at most n bytes of the current buffer, + * looking for '\n'. If found, copy up to and including + * newline, and stop. Otherwise, copy entire chunk + * and loop. + */ + if (len > n) + len = n; + t = (unsigned char *) memchr ((void *) p, '\n', len); + if (t != 0) + { + len = ++t - p; + fp->_r -= len; + fp->_p = t; + (void) memcpy ((void *) s, (void *) p, len); + s[len] = 0; + _newlib_flockfile_exit (fp); + return (buf); + } + fp->_r -= len; + fp->_p += len; + (void) memcpy ((void *) s, (void *) p, len); + s += len; + } + while ((n -= len) != 0); + *s = 0; + _newlib_flockfile_end (fp); + return buf; +} + +#ifndef _REENT_ONLY + +char * +fgets (char *__restrict buf, + int n, + FILE *__restrict fp) +{ + return _fgets_r (_REENT, buf, n, fp); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fgets_u.c b/lib/stdio/fgets_u.c new file mode 100644 index 0000000..b36748d --- /dev/null +++ b/lib/stdio/fgets_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fgets.c" diff --git a/lib/stdio/fgetwc.c b/lib/stdio/fgetwc.c new file mode 100644 index 0000000..522697e --- /dev/null +++ b/lib/stdio/fgetwc.c @@ -0,0 +1,193 @@ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>, <>---get a wide character from a file or stream + +INDEX + fgetwc +INDEX + fgetwc_unlocked +INDEX + _fgetwc_r +INDEX + _fgetwc_unlocked_r +INDEX + getwc +INDEX + getwc_unlocked +INDEX + _getwc_r +INDEX + _getwc_unlocked_r + +SYNOPSIS + #include + #include + wint_t fgetwc(FILE *<[fp]>); + + #define _GNU_SOURCE + #include + #include + wint_t fgetwc_unlocked(FILE *<[fp]>); + + #include + #include + wint_t _fgetwc_r(struct _reent *<[ptr]>, FILE *<[fp]>); + + #include + #include + wint_t _fgetwc_unlocked_r(struct _reent *<[ptr]>, FILE *<[fp]>); + + #include + #include + wint_t getwc(FILE *<[fp]>); + + #define _GNU_SOURCE + #include + #include + wint_t getwc_unlocked(FILE *<[fp]>); + + #include + #include + wint_t _getwc_r(struct _reent *<[ptr]>, FILE *<[fp]>); + + #include + #include + wint_t _getwc_unlocked_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +Use <> to get the next wide character from the file or stream +identified by <[fp]>. As a side effect, <> advances the file's +current position indicator. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The <> and <> functions or macros functions identically +to <> and <>. It may be implemented as a macro, and +may evaluate its argument more than once. There is no reason ever to use it. + +<<_fgetwc_r>>, <<_getwc_r>>, <<_fgetwc_unlocked_r>>, and <<_getwc_unlocked_r>> +are simply reentrant versions of the above functions that are passed the +additional reentrant structure pointer argument: <[ptr]>. + +RETURNS +The next wide character cast to <>, unless there is no more data, +or the host system reports a read error; in either of these situations, +<> and <> return <>. + +You can distinguish the two situations that cause an <> result by +using the <> and <> functions. + +PORTABILITY +<> and <> are required by C99 and POSIX.1-2001. + +<> and <> are GNU extensions. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +wint_t +__fgetwc (struct _reent *ptr, + register FILE *fp) +{ + wchar_t wc; + size_t nconv; + + if (fp->_r <= 0 && __srefill_r (ptr, fp)) + return (WEOF); + if (MB_CUR_MAX == 1) + { + /* Fast path for single-byte encodings. */ + wc = *fp->_p++; + fp->_r--; + return (wc); + } + do + { + nconv = _mbrtowc_r (ptr, &wc, (char *) fp->_p, fp->_r, &fp->_mbstate); + if (nconv == (size_t)-1) + break; + else if (nconv == (size_t)-2) + continue; + else if (nconv == 0) + { + /* + * Assume that the only valid representation of + * the null wide character is a single null byte. + */ + fp->_p++; + fp->_r--; + return (L'\0'); + } + else + { + fp->_p += nconv; + fp->_r -= nconv; + return (wc); + } + } + while (__srefill_r(ptr, fp) == 0); + fp->_flags |= __SERR; + errno = EILSEQ; + return (WEOF); +} + +wint_t +_fgetwc_r (struct _reent *ptr, + register FILE *fp) +{ + wint_t r; + + _newlib_flockfile_start (fp); + ORIENT(fp, 1); + r = __fgetwc (ptr, fp); + _newlib_flockfile_end (fp); + return r; +} + +wint_t +fgetwc (FILE *fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return _fgetwc_r (reent, fp); +} diff --git a/lib/stdio/fgetwc_u.c b/lib/stdio/fgetwc_u.c new file mode 100644 index 0000000..cbb9736 --- /dev/null +++ b/lib/stdio/fgetwc_u.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include "local.h" + +wint_t +_fgetwc_unlocked_r (struct _reent *ptr, + register FILE *fp) +{ + ORIENT(fp, 1); + return __fgetwc (ptr, fp); +} + +wint_t +fgetwc_unlocked (FILE *fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return _fgetwc_unlocked_r (reent, fp); +} diff --git a/lib/stdio/fgetws.c b/lib/stdio/fgetws.c new file mode 100644 index 0000000..c942806 --- /dev/null +++ b/lib/stdio/fgetws.c @@ -0,0 +1,182 @@ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---get wide character string from a file or stream + +INDEX + fgetws +INDEX + fgetws_unlocked +INDEX + _fgetws_r +INDEX + _fgetws_unlocked_r + +SYNOPSIS + #include + wchar_t *fgetws(wchar_t *__restrict <[ws]>, int <[n]>, + FILE *__restrict <[fp]>); + + #define _GNU_SOURCE + #include + wchar_t *fgetws_unlocked(wchar_t *__restrict <[ws]>, int <[n]>, + FILE *__restrict <[fp]>); + + #include + wchar_t *_fgetws_r(struct _reent *<[ptr]>, wchar_t *<[ws]>, + int <[n]>, FILE *<[fp]>); + + #include + wchar_t *_fgetws_unlocked_r(struct _reent *<[ptr]>, wchar_t *<[ws]>, + int <[n]>, FILE *<[fp]>); + +DESCRIPTION +Reads at most <[n-1]> wide characters from <[fp]> until a newline +is found. The wide characters including to the newline are stored +in <[ws]>. The buffer is terminated with a 0. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The <<_fgetws_r>> and <<_fgetws_unlocked_r>> functions are simply reentrant +version of the above and are passed an additional reentrancy structure +pointer: <[ptr]>. + +RETURNS +<> returns the buffer passed to it, with the data +filled in. If end of file occurs with some data already +accumulated, the data is returned with no other indication. If +no data are read, NULL is returned instead. + +PORTABILITY +<> is required by C99 and POSIX.1-2001. + +<> is a GNU extension. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +#ifdef __IMPL_UNLOCKED__ +#define _fgetws_r _fgetws_unlocked_r +#define fgetws fgetws_unlocked +#endif + +wchar_t * +_fgetws_r (struct _reent *ptr, + wchar_t * ws, + int n, + FILE * fp) +{ + wchar_t *wsp; + size_t nconv; + const char *src; + unsigned char *nl; + + _newlib_flockfile_start (fp); + ORIENT (fp, 1); + + if (n <= 0) + { + errno = EINVAL; + goto error; + } + + if (fp->_r <= 0 && __srefill_r (ptr, fp)) + /* EOF */ + goto error; + wsp = ws; + do + { + src = (char *) fp->_p; + nl = memchr (fp->_p, '\n', fp->_r); + nconv = _mbsnrtowcs_r (ptr, wsp, &src, + /* Read all bytes up to the next NL, or up to the + end of the buffer if there is no NL. */ + nl != NULL ? (nl - fp->_p + 1) : fp->_r, + /* But never more than n - 1 wide chars. */ + n - 1, + &fp->_mbstate); + if (nconv == (size_t) -1) + /* Conversion error */ + goto error; + if (src == NULL) + { + /* + * We hit a null byte. Increment the character count, + * since mbsnrtowcs()'s return value doesn't include + * the terminating null, then resume conversion + * after the null. + */ + nconv++; + src = memchr (fp->_p, '\0', fp->_r); + src++; + } + fp->_r -= (unsigned char *) src - fp->_p; + fp->_p = (unsigned char *) src; + n -= nconv; + wsp += nconv; + } + while (wsp[-1] != L'\n' && n > 1 && (fp->_r > 0 + || __srefill_r (ptr, fp) == 0)); + if (wsp == ws) + /* EOF */ + goto error; + if (!mbsinit (&fp->_mbstate)) + /* Incomplete character */ + goto error; + *wsp++ = L'\0'; + _newlib_flockfile_exit (fp); + return ws; + +error: + _newlib_flockfile_end (fp); + return NULL; +} + +wchar_t * +fgetws (wchar_t *__restrict ws, + int n, + FILE *__restrict fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT (reent, fp); + return _fgetws_r (reent, ws, n, fp); +} diff --git a/lib/stdio/fgetws_u.c b/lib/stdio/fgetws_u.c new file mode 100644 index 0000000..ae4d7d9 --- /dev/null +++ b/lib/stdio/fgetws_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fgetws.c" diff --git a/lib/stdio/fileno.c b/lib/stdio/fileno.c new file mode 100644 index 0000000..4faa6a8 --- /dev/null +++ b/lib/stdio/fileno.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---return file descriptor associated with stream + +INDEX + fileno +INDEX + fileno_unlocked + +SYNOPSIS + #include + int fileno(FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int fileno_unlocked(FILE *<[fp]>); + +DESCRIPTION +You can use <> to return the file descriptor identified by <[fp]>. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +RETURNS +<> returns a non-negative integer when successful. +If <[fp]> is not an open stream, <> returns -1. + +PORTABILITY +<> is not part of ANSI C. +POSIX requires <>. + +<> is a BSD extension also provided by GNU libc. + +Supporting OS subroutines required: none. +*/ + +#include <_ansi.h> +#include +#include +#include "local.h" + +int +fileno (FILE * f) +{ + int result; + CHECK_INIT (_REENT, f); + _newlib_flockfile_start (f); + if (f->_flags) + result = __sfileno (f); + else + { + result = -1; + _REENT_ERRNO(_REENT) = EBADF; + } + _newlib_flockfile_end (f); + return result; +} diff --git a/lib/stdio/fileno_u.c b/lib/stdio/fileno_u.c new file mode 100644 index 0000000..f3940e8 --- /dev/null +++ b/lib/stdio/fileno_u.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include "local.h" + +int +fileno_unlocked (FILE * f) +{ + int result; + CHECK_INIT (_REENT, f); + if (f->_flags) + result = __sfileno (f); + else + { + result = -1; + _REENT_ERRNO(_REENT) = EBADF; + } + return result; +} diff --git a/lib/stdio/findfp.c b/lib/stdio/findfp.c new file mode 100644 index 0000000..2cc5495 --- /dev/null +++ b/lib/stdio/findfp.c @@ -0,0 +1,311 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +void (*__stdio_exit_handler) (void); + +__FILE __sf[3]; + +struct _glue __sglue = {NULL, 3, &__sf[0]}; + +#ifdef _REENT_THREAD_LOCAL +_Thread_local __FILE *_tls_stdin = &__sf[0]; +_Thread_local __FILE *_tls_stdout = &__sf[1]; +_Thread_local __FILE *_tls_stderr = &__sf[2]; +_Thread_local void (*_tls_cleanup)(struct _reent *); +#endif + +#ifdef _STDIO_BSD_SEMANTICS + /* BSD and Glibc systems only flush streams which have been written to + at exit time. Calling flush rather than close for speed, as on + the aforementioned systems. */ +#define CLEANUP_FILE __sflushw_r +#else + /* Otherwise close files and flush read streams, too. + Note we call flush directly if "--enable-lite-exit" is in effect. */ +#ifdef _LITE_EXIT +#define CLEANUP_FILE _fflush_r +#else +#define CLEANUP_FILE _fclose_r +#endif +#endif + +#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)) +_NOINLINE_STATIC void +#else +static void +#endif +std (FILE *ptr, + int flags, + int file) +{ + ptr->_p = 0; + ptr->_r = 0; + ptr->_w = 0; + ptr->_flags = flags; + ptr->_flags2 = 0; + ptr->_file = file; + ptr->_bf._base = 0; + ptr->_bf._size = 0; + ptr->_lbfsize = 0; + memset (&ptr->_mbstate, 0, sizeof (_mbstate_t)); + ptr->_cookie = ptr; + ptr->_read = __sread; +#ifndef __LARGE64_FILES + ptr->_write = __swrite; +#else /* __LARGE64_FILES */ + ptr->_write = __swrite64; + ptr->_seek64 = __sseek64; + ptr->_flags |= __SL64; +#endif /* __LARGE64_FILES */ + ptr->_seek = __sseek; +#ifdef _STDIO_CLOSE_PER_REENT_STD_STREAMS + ptr->_close = __sclose; +#else /* _STDIO_CLOSE_STD_STREAMS */ + ptr->_close = NULL; +#endif /* _STDIO_CLOSE_STD_STREAMS */ +#ifndef __SINGLE_THREAD__ + if (ptr == &__sf[0] || ptr == &__sf[1] || ptr == &__sf[2]) + __lock_init_recursive (ptr->_lock); +#endif +#ifdef __SCLE + if (__stextmode (ptr->_file)) + ptr->_flags |= __SCLE; +#endif +} + +static inline void +stdin_init(FILE *ptr) +{ + std (ptr, __SRD, 0); +} + +static inline void +stdout_init(FILE *ptr) +{ + /* On platforms that have true file system I/O, we can verify + whether stdout is an interactive terminal or not, as part of + __smakebuf on first use of the stream. For all other platforms, + we will default to line buffered mode here. Technically, POSIX + requires both stdin and stdout to be line-buffered, but tradition + leaves stdin alone on systems without fcntl. */ +#ifdef HAVE_FCNTL + std (ptr, __SWR, 1); +#else + std (ptr, __SWR | __SLBF, 1); +#endif +} + +static inline void +stderr_init(FILE *ptr) +{ + /* POSIX requires stderr to be opened for reading and writing, even + when the underlying fd 2 is write-only. */ + std (ptr, __SRW | __SNBF, 2); +} + +struct glue_with_file { + struct _glue glue; + FILE file; +}; + +static struct _glue * +sfmoreglue (struct _reent *d, int n) +{ + struct glue_with_file *g; + + g = (struct glue_with_file *) + _malloc_r (d, sizeof (*g) + (n - 1) * sizeof (FILE)); + if (g == NULL) + return NULL; + g->glue._next = NULL; + g->glue._niobs = n; + g->glue._iobs = &g->file; + memset (&g->file, 0, n * sizeof (FILE)); + return &g->glue; +} + +static void +stdio_exit_handler (void) +{ + (void) _fwalk_sglue (_GLOBAL_REENT, CLEANUP_FILE, &__sglue); +} + +static void +global_stdio_init (void) +{ + if (__stdio_exit_handler == NULL) { + __stdio_exit_handler = stdio_exit_handler; + stdin_init (&__sf[0]); + stdout_init (&__sf[1]); + stderr_init (&__sf[2]); + } +} + +/* + * Find a free FILE for fopen et al. + */ + +FILE * +__sfp (struct _reent *d) +{ + FILE *fp; + int n; + struct _glue *g; + + _newlib_sfp_lock_start (); + global_stdio_init (); + + for (g = &__sglue;; g = g->_next) + { + for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++) + if (fp->_flags == 0) + goto found; + if (g->_next == NULL && + (g->_next = sfmoreglue (d, NDYNAMIC)) == NULL) + break; + } + _newlib_sfp_lock_exit (); + _REENT_ERRNO(d) = ENOMEM; + return NULL; + +found: + fp->_file = -1; /* no file */ + fp->_flags = 1; /* reserve this slot; caller sets real flags */ + fp->_flags2 = 0; +#ifndef __SINGLE_THREAD__ + __lock_init_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + + fp->_p = NULL; /* no current pointer */ + fp->_w = 0; /* nothing to read or write */ + fp->_r = 0; + fp->_bf._base = NULL; /* no buffer */ + fp->_bf._size = 0; + fp->_lbfsize = 0; /* not line buffered */ + memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); + /* fp->_cookie = ; */ /* caller sets cookie, _read/_write etc */ + fp->_ub._base = NULL; /* no ungetc buffer */ + fp->_ub._size = 0; + fp->_lb._base = NULL; /* no line buffer */ + fp->_lb._size = 0; + + return fp; +} + +/* + * exit() calls _cleanup() through *__cleanup, set whenever we + * open or buffer a file. This chicanery is done so that programs + * that do not use stdio need not link it all in. + * + * The name `_cleanup' is, alas, fairly well known outside stdio. + */ + +static void +cleanup_stdio (struct _reent *ptr) +{ + if (_REENT_STDIN(ptr) != &__sf[0]) + CLEANUP_FILE (ptr, _REENT_STDIN(ptr)); + if (_REENT_STDOUT(ptr) != &__sf[1]) + CLEANUP_FILE (ptr, _REENT_STDOUT(ptr)); + if (_REENT_STDERR(ptr) != &__sf[2]) + CLEANUP_FILE (ptr, _REENT_STDERR(ptr)); +} + +/* + * __sinit() is called whenever stdio's internal variables must be set up. + */ + +void +__sinit (struct _reent *s) +{ + __sfp_lock_acquire (); + + if (_REENT_CLEANUP(s)) + { + __sfp_lock_release (); + return; + } + + /* make sure we clean up on exit */ + _REENT_CLEANUP(s) = cleanup_stdio; /* conservative */ + + global_stdio_init (); + __sfp_lock_release (); +} + +#ifndef __SINGLE_THREAD__ + +__LOCK_INIT_RECURSIVE(static, __sfp_recursive_mutex); + +void +__sfp_lock_acquire (void) +{ + __lock_acquire_recursive (__sfp_recursive_mutex); +} + +void +__sfp_lock_release (void) +{ + __lock_release_recursive (__sfp_recursive_mutex); +} + +/* Walkable file locking routine. */ +static int +__fp_lock (struct _reent * ptr __unused, FILE * fp) +{ + if (!(fp->_flags2 & __SNLK)) + _flockfile (fp); + + return 0; +} + +/* Walkable file unlocking routine. */ +static int +__fp_unlock (struct _reent * ptr __unused, FILE * fp) +{ + if (!(fp->_flags2 & __SNLK)) + _funlockfile (fp); + + return 0; +} + +void +__fp_lock_all (void) +{ + __sfp_lock_acquire (); + (void) _fwalk_sglue (NULL, __fp_lock, &__sglue); +} + +void +__fp_unlock_all (void) +{ + (void) _fwalk_sglue (NULL, __fp_unlock, &__sglue); + __sfp_lock_release (); +} +#endif diff --git a/lib/stdio/fiprintf.c b/lib/stdio/fiprintf.c new file mode 100644 index 0000000..8829eb8 --- /dev/null +++ b/lib/stdio/fiprintf.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in siprintf.c */ + +#include <_ansi.h> +#include +#include +#include + +int +_fiprintf_r (struct _reent *ptr, + FILE * fp, + const char *fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfiprintf_r (ptr, fp, fmt, ap); + va_end (ap); + return ret; +} + +#ifndef _REENT_ONLY + +int +fiprintf (FILE * fp, + const char *fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfiprintf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/fiscanf.c b/lib/stdio/fiscanf.c new file mode 100644 index 0000000..a1c8361 --- /dev/null +++ b/lib/stdio/fiscanf.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +fiscanf(FILE *fp, const char *fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = __svfiscanf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_fiscanf_r(struct _reent *ptr, FILE *fp, const char *fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = __svfiscanf_r (ptr, fp, fmt, ap); + va_end (ap); + return (ret); +} + diff --git a/lib/stdio/flags.c b/lib/stdio/flags.c new file mode 100644 index 0000000..d686fa0 --- /dev/null +++ b/lib/stdio/flags.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92 */ + +#include <_ansi.h> +#include +#include +#include +#include +#include + +/* + * Return the (stdio) flags for a given mode. Store the flags + * to be passed to an open() syscall through *optr. + * Return 0 on error. + */ + +int +__sflags (struct _reent *ptr, + register char *mode, + int *optr) +{ + register int ret, m, o; + + switch (mode[0]) + { + case 'r': /* open for reading */ + ret = __SRD; + m = O_RDONLY; + o = 0; + break; + + case 'w': /* open for writing */ + ret = __SWR; + m = O_WRONLY; + o = O_CREAT | O_TRUNC; + break; + + case 'a': /* open for appending */ + ret = __SWR | __SAPP; + m = O_WRONLY; + o = O_CREAT | O_APPEND; + break; + default: /* illegal mode */ + _REENT_ERRNO(ptr) = EINVAL; + return (0); + } + while (*++mode) + { + switch (*mode) + { + case '+': + ret = (ret & ~(__SRD | __SWR)) | __SRW; + m = (m & ~O_ACCMODE) | O_RDWR; + break; + case 'b': +#ifdef O_BINARY + m |= O_BINARY; +#endif + break; +#ifdef __CYGWIN__ + case 't': + m |= O_TEXT; + break; +#endif +#if defined (O_CLOEXEC) && defined (_GLIBC_EXTENSION) + case 'e': + m |= O_CLOEXEC; + break; +#endif + case 'x': + m |= O_EXCL; + break; + default: + break; + } + } + *optr = m | o; + return ret; +} diff --git a/lib/stdio/floatio.h b/lib/stdio/floatio.h new file mode 100644 index 0000000..4bddcb7 --- /dev/null +++ b/lib/stdio/floatio.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * %W% (Berkeley) %G% + */ + +/* + * Floating point scanf/printf (input/output) definitions. + */ + +#ifdef _NO_LONGDBL +/* 11-bit exponent (VAX G floating point) is 308 decimal digits */ +#define MAXEXP 308 +#else /* !_NO_LONGDBL */ +/* 15-bit exponent (Intel extended floating point) is 4932 decimal digits */ +#define MAXEXP 4932 +#endif /* !_NO_LONGDBL */ +/* 128 bit fraction takes up 39 decimal digits; max reasonable precision */ +#define MAXFRACT 39 diff --git a/lib/stdio/fmemopen.c b/lib/stdio/fmemopen.c new file mode 100644 index 0000000..886ba7e --- /dev/null +++ b/lib/stdio/fmemopen.c @@ -0,0 +1,364 @@ +/* Copyright (C) 2007 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>---open a stream around a fixed-length string + +INDEX + fmemopen + +SYNOPSIS + #include + FILE *fmemopen(void *restrict <[buf]>, size_t <[size]>, + const char *restrict <[mode]>); + +DESCRIPTION +<> creates a seekable <> stream that wraps a +fixed-length buffer of <[size]> bytes starting at <[buf]>. The stream +is opened with <[mode]> treated as in <>, where append mode +starts writing at the first NUL byte. If <[buf]> is NULL, then +<[size]> bytes are automatically provided as if by <>, with +the initial size of 0, and <[mode]> must contain <<+>> so that data +can be read after it is written. + +The stream maintains a current position, which moves according to +bytes read or written, and which can be one past the end of the array. +The stream also maintains a current file size, which is never greater +than <[size]>. If <[mode]> starts with <>, the position starts at +<<0>>, and file size starts at <[size]> if <[buf]> was provided. If +<[mode]> starts with <>, the position and file size start at <<0>>, +and if <[buf]> was provided, the first byte is set to NUL. If +<[mode]> starts with <>, the position and file size start at the +location of the first NUL byte, or else <[size]> if <[buf]> was +provided. + +When reading, NUL bytes have no significance, and reads cannot exceed +the current file size. When writing, the file size can increase up to +<[size]> as needed, and NUL bytes may be embedded in the stream (see +<> for an alternative that automatically enlarges the +buffer). When the stream is flushed or closed after a write that +changed the file size, a NUL byte is written at the current position +if there is still room; if the stream is not also open for reading, a +NUL byte is additionally written at the last byte of <[buf]> when the +stream has exceeded <[size]>, so that a write-only <[buf]> is always +NUL-terminated when the stream is flushed or closed (and the initial +<[size]> should take this into account). It is not possible to seek +outside the bounds of <[size]>. A NUL byte written during a flush is +restored to its previous value when seeking elsewhere in the string. + +RETURNS +The return value is an open FILE pointer on success. On error, +<> is returned, and <> will be set to EINVAL if <[size]> +is zero or <[mode]> is invalid, ENOMEM if <[buf]> was NULL and memory +could not be allocated, or EMFILE if too many streams are already +open. + +PORTABILITY +This function is being added to POSIX 200x, but is not in POSIX 2001. + +Supporting OS subroutines required: <>. +*/ + +#include +#include +#include +#include +#include "local.h" + +/* Describe details of an open memstream. */ +typedef struct fmemcookie { + void *storage; /* storage to free on close */ + char *buf; /* buffer start */ + size_t pos; /* current position */ + size_t eof; /* current file size */ + size_t max; /* maximum file size */ + char append; /* nonzero if appending */ + char writeonly; /* 1 if write-only */ + char saved; /* saved character that lived at pos before write-only NUL */ +} fmemcookie; + +/* Read up to non-zero N bytes into BUF from stream described by + COOKIE; return number of bytes read (0 on EOF). */ +static _READ_WRITE_RETURN_TYPE +fmemreader (struct _reent *ptr, + void *cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + fmemcookie *c = (fmemcookie *) cookie; + /* Can't read beyond current size, but EOF condition is not an error. */ + if (c->pos > c->eof) + return 0; + if (n >= c->eof - c->pos) + n = c->eof - c->pos; + memcpy (buf, c->buf + c->pos, n); + c->pos += n; + return n; +} + +/* Write up to non-zero N bytes of BUF into the stream described by COOKIE, + returning the number of bytes written or EOF on failure. */ +static _READ_WRITE_RETURN_TYPE +fmemwriter (struct _reent *ptr, + void *cookie, + const char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + fmemcookie *c = (fmemcookie *) cookie; + int adjust = 0; /* true if at EOF, but still need to write NUL. */ + + /* Append always seeks to eof; otherwise, if we have previously done + a seek beyond eof, ensure all intermediate bytes are NUL. */ + if (c->append) + c->pos = c->eof; + else if (c->pos > c->eof) + memset (c->buf + c->eof, '\0', c->pos - c->eof); + /* Do not write beyond EOF; saving room for NUL on write-only stream. */ + if (c->pos + n > c->max - c->writeonly) + { + adjust = c->writeonly; + n = c->max - c->pos; + } + /* Now n is the number of bytes being modified, and adjust is 1 if + the last byte is NUL instead of from buf. Write a NUL if + write-only; or if read-write, eof changed, and there is still + room. When we are within the file contents, remember what we + overwrite so we can restore it if we seek elsewhere later. */ + if (c->pos + n > c->eof) + { + c->eof = c->pos + n; + if (c->eof - adjust < c->max) + c->saved = c->buf[c->eof - adjust] = '\0'; + } + else if (c->writeonly) + { + if (n) + { + c->saved = c->buf[c->pos + n - adjust]; + c->buf[c->pos + n - adjust] = '\0'; + } + else + adjust = 0; + } + c->pos += n; + if (n - adjust) + memcpy (c->buf + c->pos - n, buf, n - adjust); + else + { + _REENT_ERRNO(ptr) = ENOSPC; + return EOF; + } + return n; +} + +/* Seek to position POS relative to WHENCE within stream described by + COOKIE; return resulting position or fail with EOF. */ +static _fpos_t +fmemseeker (struct _reent *ptr, + void *cookie, + _fpos_t pos, + int whence) +{ + fmemcookie *c = (fmemcookie *) cookie; +#ifndef __LARGE64_FILES + off_t offset = (off_t) pos; +#else /* __LARGE64_FILES */ + _off64_t offset = (_off64_t) pos; +#endif /* __LARGE64_FILES */ + + if (whence == SEEK_CUR) + offset += c->pos; + else if (whence == SEEK_END) + offset += c->eof; + if (offset < 0) + { + _REENT_ERRNO(ptr) = EINVAL; + offset = -1; + } + else if (offset > c->max) + { + _REENT_ERRNO(ptr) = ENOSPC; + offset = -1; + } +#ifdef __LARGE64_FILES + else if ((_fpos_t) offset != offset) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + offset = -1; + } +#endif /* __LARGE64_FILES */ + else + { + if (c->writeonly && c->pos < c->eof) + { + c->buf[c->pos] = c->saved; + c->saved = '\0'; + } + c->pos = offset; + if (c->writeonly && c->pos < c->eof) + { + c->saved = c->buf[c->pos]; + c->buf[c->pos] = '\0'; + } + } + return (_fpos_t) offset; +} + +/* Seek to position POS relative to WHENCE within stream described by + COOKIE; return resulting position or fail with EOF. */ +#ifdef __LARGE64_FILES +static _fpos64_t +fmemseeker64 (struct _reent *ptr, + void *cookie, + _fpos64_t pos, + int whence) +{ + _off64_t offset = (_off64_t) pos; + fmemcookie *c = (fmemcookie *) cookie; + if (whence == SEEK_CUR) + offset += c->pos; + else if (whence == SEEK_END) + offset += c->eof; + if (offset < 0) + { + _REENT_ERRNO(ptr) = EINVAL; + offset = -1; + } + else if (offset > c->max) + { + _REENT_ERRNO(ptr) = ENOSPC; + offset = -1; + } + else + { + if (c->writeonly && c->pos < c->eof) + { + c->buf[c->pos] = c->saved; + c->saved = '\0'; + } + c->pos = offset; + if (c->writeonly && c->pos < c->eof) + { + c->saved = c->buf[c->pos]; + c->buf[c->pos] = '\0'; + } + } + return (_fpos64_t) offset; +} +#endif /* __LARGE64_FILES */ + +/* Reclaim resources used by stream described by COOKIE. */ +static int +fmemcloser (struct _reent *ptr, + void *cookie) +{ + fmemcookie *c = (fmemcookie *) cookie; + _free_r (ptr, c->storage); + return 0; +} + +/* Open a memstream around buffer BUF of SIZE bytes, using MODE. + Return the new stream, or fail with NULL. */ +FILE * +_fmemopen_r (struct _reent *ptr, + void *__restrict buf, + size_t size, + const char *__restrict mode) +{ + FILE *fp; + fmemcookie *c; + int flags; + int dummy; + + if ((flags = __sflags (ptr, mode, &dummy)) == 0) + return NULL; + if (!size || !(buf || flags & __SRW)) + { + _REENT_ERRNO(ptr) = EINVAL; + return NULL; + } + if ((fp = __sfp (ptr)) == NULL) + return NULL; + if ((c = (fmemcookie *) _malloc_r (ptr, sizeof *c + (buf ? 0 : size))) + == NULL) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + return NULL; + } + + c->storage = c; + c->max = size; + /* 9 modes to worry about. */ + /* w/a, buf or no buf: Guarantee a NUL after any file writes. */ + c->writeonly = (flags & __SWR) != 0; + c->saved = '\0'; + if (!buf) + { + /* r+/w+/a+, and no buf: file starts empty. */ + c->buf = (char *) (c + 1); + c->buf[0] = '\0'; + c->pos = c->eof = 0; + c->append = (flags & __SAPP) != 0; + } + else + { + c->buf = (char *) buf; + switch (*mode) + { + case 'a': + /* a/a+ and buf: position and size at first NUL. */ + buf = memchr (c->buf, '\0', size); + c->eof = c->pos = buf ? (char *) buf - c->buf : size; + if (!buf && c->writeonly) + /* a: guarantee a NUL within size even if no writes. */ + c->buf[size - 1] = '\0'; + c->append = 1; + break; + case 'r': + /* r/r+ and buf: read at beginning, full size available. */ + c->pos = c->append = 0; + c->eof = size; + break; + case 'w': + /* w/w+ and buf: write at beginning, truncate to empty. */ + c->pos = c->append = c->eof = 0; + *c->buf = '\0'; + break; + default: + abort (); + } + } + + _newlib_flockfile_start (fp); + fp->_file = -1; + fp->_flags = flags; + fp->_cookie = c; + fp->_read = flags & (__SRD | __SRW) ? fmemreader : NULL; + fp->_write = flags & (__SWR | __SRW) ? fmemwriter : NULL; + fp->_seek = fmemseeker; +#ifdef __LARGE64_FILES + fp->_seek64 = fmemseeker64; + fp->_flags |= __SL64; +#endif + fp->_close = fmemcloser; + _newlib_flockfile_end (fp); + return fp; +} + +#ifndef _REENT_ONLY +FILE * +fmemopen (void *__restrict buf, + size_t size, + const char *__restrict mode) +{ + return _fmemopen_r (_REENT, buf, size, mode); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fopen.c b/lib/stdio/fopen.c new file mode 100644 index 0000000..1ac551f --- /dev/null +++ b/lib/stdio/fopen.c @@ -0,0 +1,171 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---open a file + +INDEX + fopen +INDEX + _fopen_r + +SYNOPSIS + #include + FILE *fopen(const char *<[file]>, const char *<[mode]>); + + FILE *_fopen_r(struct _reent *<[reent]>, + const char *<[file]>, const char *<[mode]>); + +DESCRIPTION +<> initializes the data structures needed to read or write a +file. Specify the file's name as the string at <[file]>, and the kind +of access you need to the file with the string at <[mode]>. + +The alternate function <<_fopen_r>> is a reentrant version. +The extra argument <[reent]> is a pointer to a reentrancy structure. + +Three fundamental kinds of access are available: read, write, and append. +<<*<[mode]>>> must begin with one of the three characters `<>', +`<>', or `<>', to select one of these: + +o+ +o r +Open the file for reading; the operation will fail if the file does +not exist, or if the host system does not permit you to read it. + +o w +Open the file for writing @emph{from the beginning} of the file: +effectively, this always creates a new file. If the file whose name you +specified already existed, its old contents are discarded. + +o a +Open the file for appending data, that is writing from the end of +file. When you open a file this way, all data always goes to the +current end of file; you cannot change this using <>. +o- + +Some host systems distinguish between ``binary'' and ``text'' files. +Such systems may perform data transformations on data written to, or +read from, files opened as ``text''. +If your system is one of these, then you can append a `<>' to any +of the three modes above, to specify that you are opening the file as +a binary file (the default is to open the file as a text file). + +`<>', then, means ``read binary''; `<>', ``write binary''; and +`<>', ``append binary''. + +To make C programs more portable, the `<>' is accepted on all +systems, whether or not it makes a difference. + +Finally, you might need to both read and write from the same file. +You can also append a `<<+>>' to any of the three modes, to permit +this. (If you want to append both `<>' and `<<+>>', you can do it +in either order: for example, <<"rb+">> means the same thing as +<<"r+b">> when used as a mode string.) + +Use <<"r+">> (or <<"rb+">>) to permit reading and writing anywhere in +an existing file, without discarding any data; <<"w+">> (or <<"wb+">>) +to create a new file (or begin by discarding all data from an old one) +that permits reading and writing anywhere in it; and <<"a+">> (or +<<"ab+">>) to permit reading anywhere in an existing file, but writing +only at the end. + +RETURNS +<> returns a file pointer which you can use for other file +operations, unless the file you requested could not be opened; in that +situation, the result is <>. If the reason for failure was an +invalid string at <[mode]>, <> is set to <>. + +PORTABILITY +<> is required by ANSI C. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include +#ifdef __CYGWIN__ +#include +#endif +#include "local.h" + +FILE * +_fopen_r (struct _reent *ptr, + const char *__restrict file, + const char *__restrict mode) +{ + register FILE *fp; + register int f; + int flags, oflags; + + if ((flags = __sflags (ptr, mode, &oflags)) == 0) + return NULL; + if ((fp = __sfp (ptr)) == NULL) + return NULL; + + if ((f = _open_r (ptr, file, oflags, 0666)) < 0) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + return NULL; + } + + _newlib_flockfile_start (fp); + + fp->_file = f; + fp->_flags = flags; + fp->_cookie = (void *) fp; + fp->_read = __sread; + fp->_write = __swrite; + fp->_seek = __sseek; + fp->_close = __sclose; + + if (fp->_flags & __SAPP) + _fseek_r (ptr, fp, 0, SEEK_END); + +#ifdef __SCLE + if (__stextmode (fp->_file)) + fp->_flags |= __SCLE; +#endif + + _newlib_flockfile_end (fp); + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +fopen (const char *file, + const char *mode) +{ + return _fopen_r (_REENT, file, mode); +} + +#endif diff --git a/lib/stdio/fopencookie.c b/lib/stdio/fopencookie.c new file mode 100644 index 0000000..ab406a8 --- /dev/null +++ b/lib/stdio/fopencookie.c @@ -0,0 +1,256 @@ +/* Copyright (C) 2007 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>---open a stream with custom callbacks + +INDEX + fopencookie + +SYNOPSIS + #include + FILE *fopencookie(const void *<[cookie]>, const char *<[mode]>, + cookie_io_functions_t <[functions]>); + +DESCRIPTION +<> creates a <> stream where I/O is performed using +custom callbacks. The callbacks are registered via the structure: + + typedef ssize_t (*cookie_read_function_t)(void *_cookie, char *_buf, + size_t _n); + typedef ssize_t (*cookie_write_function_t)(void *_cookie, + const char *_buf, size_t _n); + typedef int (*cookie_seek_function_t)(void *_cookie, off_t *_off, + int _whence); + typedef int (*cookie_close_function_t)(void *_cookie); + +. typedef struct +. { +. cookie_read_function_t *read; +. cookie_write_function_t *write; +. cookie_seek_function_t *seek; +. cookie_close_function_t *close; +. } cookie_io_functions_t; + +The stream is opened with <[mode]> treated as in <>. The +callbacks <[functions.read]> and <[functions.write]> may only be NULL +when <[mode]> does not require them. + +<[functions.read]> should return -1 on failure, or else the number of +bytes read (0 on EOF). It is similar to <>, except that +<[cookie]> will be passed as the first argument. + +<[functions.write]> should return -1 on failure, or else the number of +bytes written. It is similar to <>, except that <[cookie]> +will be passed as the first argument. + +<[functions.seek]> should return -1 on failure, and 0 on success, with +*<[_off]> set to the current file position. It is a cross between +<> and <>, with the <[_whence]> argument interpreted in +the same manner. A NULL <[functions.seek]> makes the stream behave +similarly to a pipe in relation to stdio functions that require +positioning. + +<[functions.close]> should return -1 on failure, or 0 on success. It +is similar to <>, except that <[cookie]> will be passed as the +first argument. A NULL <[functions.close]> merely flushes all data +then lets <> succeed. A failed close will still invalidate +the stream. + +Read and write I/O functions are allowed to change the underlying +buffer on fully buffered or line buffered streams by calling +<>. They are also not required to completely fill or empty +the buffer. They are not, however, allowed to change streams from +unbuffered to buffered or to change the state of the line buffering +flag. They must also be prepared to have read or write calls occur on +buffers other than the one most recently specified. + +RETURNS +The return value is an open FILE pointer on success. On error, +<> is returned, and <> will be set to EINVAL if a +function pointer is missing or <[mode]> is invalid, ENOMEM if the +stream cannot be created, or EMFILE if too many streams are already +open. + +PORTABILITY +This function is a newlib extension, copying the prototype from Linux. +It is not portable. See also the <> interface from BSD. + +Supporting OS subroutines required: <>. +*/ + +#define _GNU_SOURCE +#include +#include +#include +#include "local.h" + +typedef struct fccookie { + void *cookie; + FILE *fp; + cookie_read_function_t *readfn; + cookie_write_function_t *writefn; + cookie_seek_function_t *seekfn; + cookie_close_function_t *closefn; +} fccookie; + +static _READ_WRITE_RETURN_TYPE +fcreader (struct _reent *ptr, + void *cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + int result; + fccookie *c = (fccookie *) cookie; + errno = 0; + if ((result = c->readfn (c->cookie, buf, n)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + return result; +} + +static _READ_WRITE_RETURN_TYPE +fcwriter (struct _reent *ptr, + void *cookie, + const char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + int result; + fccookie *c = (fccookie *) cookie; + if (c->fp->_flags & __SAPP && c->fp->_seek) + { +#ifdef __LARGE64_FILES + c->fp->_seek64 (ptr, cookie, 0, SEEK_END); +#else + c->fp->_seek (ptr, cookie, 0, SEEK_END); +#endif + } + errno = 0; + if ((result = c->writefn (c->cookie, buf, n)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + return result; +} + +static _fpos_t +fcseeker (struct _reent *ptr, + void *cookie, + _fpos_t pos, + int whence) +{ + fccookie *c = (fccookie *) cookie; +#ifndef __LARGE64_FILES + off_t offset = (off_t) pos; +#else /* __LARGE64_FILES */ + _off64_t offset = (_off64_t) pos; +#endif /* __LARGE64_FILES */ + + errno = 0; + if (c->seekfn (c->cookie, &offset, whence) < 0 && errno) + _REENT_ERRNO(ptr) = errno; +#ifdef __LARGE64_FILES + else if ((_fpos_t)offset != offset) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + offset = -1; + } +#endif /* __LARGE64_FILES */ + return (_fpos_t) offset; +} + +#ifdef __LARGE64_FILES +static _fpos64_t +fcseeker64 (struct _reent *ptr, + void *cookie, + _fpos64_t pos, + int whence) +{ + _off64_t offset; + fccookie *c = (fccookie *) cookie; + errno = 0; + if (c->seekfn (c->cookie, &offset, whence) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + return (_fpos64_t) offset; +} +#endif /* __LARGE64_FILES */ + +static int +fccloser (struct _reent *ptr, + void *cookie) +{ + int result = 0; + fccookie *c = (fccookie *) cookie; + if (c->closefn) + { + errno = 0; + if ((result = c->closefn (c->cookie)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + } + _free_r (ptr, c); + return result; +} + +FILE * +_fopencookie_r (struct _reent *ptr, + void *cookie, + const char *mode, + cookie_io_functions_t functions) +{ + FILE *fp; + fccookie *c; + int flags; + int dummy; + + if ((flags = __sflags (ptr, mode, &dummy)) == 0) + return NULL; + if (((flags & (__SRD | __SRW)) && !functions.read) + || ((flags & (__SWR | __SRW)) && !functions.write)) + { + _REENT_ERRNO(ptr) = EINVAL; + return NULL; + } + if ((fp = __sfp (ptr)) == NULL) + return NULL; + if ((c = (fccookie *) _malloc_r (ptr, sizeof *c)) == NULL) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + return NULL; + } + + _newlib_flockfile_start (fp); + fp->_file = -1; + fp->_flags = flags; + c->cookie = cookie; + c->fp = fp; + fp->_cookie = c; + c->readfn = functions.read; + fp->_read = fcreader; + c->writefn = functions.write; + fp->_write = fcwriter; + c->seekfn = functions.seek; + fp->_seek = functions.seek ? fcseeker : NULL; +#ifdef __LARGE64_FILES + fp->_seek64 = functions.seek ? fcseeker64 : NULL; + fp->_flags |= __SL64; +#endif + c->closefn = functions.close; + fp->_close = fccloser; + _newlib_flockfile_end (fp); + return fp; +} + +#ifndef _REENT_ONLY +FILE * +fopencookie (void *cookie, + const char *mode, + cookie_io_functions_t functions) +{ + return _fopencookie_r (_REENT, cookie, mode, functions); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fprintf.c b/lib/stdio/fprintf.c new file mode 100644 index 0000000..b6c0ea8 --- /dev/null +++ b/lib/stdio/fprintf.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in sprintf.c */ + +#include <_ansi.h> +#include +#include +#include + +int +_fprintf_r (struct _reent *ptr, + FILE *__restrict fp, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfprintf_r (ptr, fp, fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +_fiprintf_r (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE ((__alias__("_fprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +fprintf (FILE *__restrict fp, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfprintf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +fiprintf (FILE *, const char *, ...) + _ATTRIBUTE ((__alias__("fprintf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/fpurge.c b/lib/stdio/fpurge.c new file mode 100644 index 0000000..93ac0e2 --- /dev/null +++ b/lib/stdio/fpurge.c @@ -0,0 +1,110 @@ +/* Copyright (C) 2009 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>---discard pending file I/O + +INDEX + fpurge +INDEX + _fpurge_r +INDEX + __fpurge + +SYNOPSIS + #include + int fpurge(FILE *<[fp]>); + + int _fpurge_r(struct _reent *<[reent]>, FILE *<[fp]>); + + #include + #include + void __fpurge(FILE *<[fp]>); + + +DESCRIPTION +Use <> to clear all buffers of the given stream. For output +streams, this discards data not yet written to disk. For input streams, +this discards any data from <> and any data retrieved from disk +but not yet read via <>. This is more severe than <>, +and generally is only needed when manually altering the underlying file +descriptor of a stream. + +<<__fpurge>> behaves exactly like <> but does not return a value. + +The alternate function <<_fpurge_r>> is a reentrant version, where the +extra argument <[reent]> is a pointer to a reentrancy structure, and +<[fp]> must not be NULL. + +RETURNS +<> returns <<0>> unless <[fp]> is not valid, in which case it +returns <> and sets <>. + +PORTABILITY +These functions are not portable to any standard. + +No supporting OS subroutines are required. +*/ + +#include <_ansi.h> +#include +#ifndef __rtems__ +#include +#endif +#include +#include "local.h" + +/* Discard I/O from a single file. */ + +int +_fpurge_r (struct _reent *ptr, + register FILE * fp) +{ + int t; + + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start (fp); + + t = fp->_flags; + if (!t) + { + _REENT_ERRNO(ptr) = EBADF; + _newlib_flockfile_exit (fp); + return EOF; + } + fp->_p = fp->_bf._base; + if ((t & __SWR) == 0) + { + fp->_r = 0; + if (HASUB (fp)) + FREEUB (ptr, fp); + } + else + fp->_w = t & (__SLBF | __SNBF) ? 0 : fp->_bf._size; + _newlib_flockfile_end (fp); + return 0; +} + +#ifndef _REENT_ONLY + +int +fpurge (register FILE * fp) +{ + return _fpurge_r (_REENT, fp); +} + +#ifndef __rtems__ + +void +__fpurge (register FILE * fp) +{ + _fpurge_r (_REENT, fp); +} + +#endif + +#endif /* _REENT_ONLY */ diff --git a/lib/stdio/fputc.c b/lib/stdio/fputc.c new file mode 100644 index 0000000..5dfa9c0 --- /dev/null +++ b/lib/stdio/fputc.c @@ -0,0 +1,120 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---write a character on a stream or file + +INDEX + fputc +INDEX + fputc_unlocked +INDEX + _fputc_r +INDEX + _fputc_unlocked_r + +SYNOPSIS + #include + int fputc(int <[ch]>, FILE *<[fp]>); + + #define _BSD_SOURCE + #include + int fputc_unlocked(int <[ch]>, FILE *<[fp]>); + + #include + int _fputc_r(struct _rent *<[ptr]>, int <[ch]>, FILE *<[fp]>); + + #include + int _fputc_unlocked_r(struct _rent *<[ptr]>, int <[ch]>, FILE *<[fp]>); + +DESCRIPTION +<> converts the argument <[ch]> from an <> to an +<>, then writes it to the file or stream identified by +<[fp]>. + +If the file was opened with append mode (or if the stream cannot +support positioning), then the new character goes at the end of the +file or stream. Otherwise, the new character is written at the +current value of the position indicator, and the position indicator +oadvances by one. + +For a macro version of this function, see <>. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The <<_fputc_r>> and <<_fputc_unlocked_r>> functions are simply reentrant +versions of the above that take an additional reentrant structure +argument: <[ptr]>. + +RETURNS +If successful, <> returns its argument <[ch]>. If an error +intervenes, the result is <>. You can use `<)>>' to +query for errors. + +PORTABILITY +<> is required by ANSI C. + +<> is a BSD extension also provided by GNU libc. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include "local.h" + +int +_fputc_r (struct _reent *ptr, + int ch, + FILE * file) +{ + int result; + CHECK_INIT(ptr, file); + _newlib_flockfile_start (file); + result = _putc_r (ptr, ch, file); + _newlib_flockfile_end (file); + return result; +} + +#ifndef _REENT_ONLY +int +fputc (int ch, + FILE * file) +{ +#if !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) + int result; + struct _reent *reent = _REENT; + + CHECK_INIT(reent, file); + _newlib_flockfile_start (file); + result = _putc_r (reent, ch, file); + _newlib_flockfile_end (file); + return result; +#else + return _fputc_r (_REENT, ch, file); +#endif +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fputc_u.c b/lib/stdio/fputc_u.c new file mode 100644 index 0000000..9e16069 --- /dev/null +++ b/lib/stdio/fputc_u.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include "local.h" + +int +_fputc_unlocked_r (struct _reent *ptr, + int ch, + FILE * file) +{ + CHECK_INIT(ptr, file); + return _putc_unlocked_r (ptr, ch, file); +} + +#ifndef _REENT_ONLY +int +fputc_unlocked (int ch, + FILE * file) +{ +#if !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) + struct _reent *reent = _REENT; + + CHECK_INIT(reent, file); + return _putc_unlocked_r (reent, ch, file); +#else + return _fputc_unlocked_r (_REENT, ch, file); +#endif +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fputs.c b/lib/stdio/fputs.c new file mode 100644 index 0000000..4e9cb75 --- /dev/null +++ b/lib/stdio/fputs.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---write a character string in a file or stream + +INDEX + fputs +INDEX + fputs_unlocked +INDEX + _fputs_r +INDEX + _fputs_unlocked_r + +SYNOPSIS + #include + int fputs(const char *restrict <[s]>, FILE *restrict <[fp]>); + + #define _GNU_SOURCE + #include + int fputs_unlocked(const char *restrict <[s]>, FILE *restrict <[fp]>); + + #include + int _fputs_r(struct _reent *<[ptr]>, const char *restrict <[s]>, FILE *restrict <[fp]>); + + #include + int _fputs_unlocked_r(struct _reent *<[ptr]>, const char *restrict <[s]>, FILE *restrict <[fp]>); + +DESCRIPTION +<> writes the string at <[s]> (but without the trailing null) +to the file or stream identified by <[fp]>. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +<<_fputs_r>> and <<_fputs_unlocked_r>> are simply reentrant versions of the +above that take an additional reentrant struct pointer argument: <[ptr]>. + +RETURNS +If successful, the result is <<0>>; otherwise, the result is <>. + +PORTABILITY +ANSI C requires <>, but does not specify that the result on +success must be <<0>>; any non-negative value is permitted. + +<> is a GNU extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include "fvwrite.h" +#include "local.h" + +#ifdef __IMPL_UNLOCKED__ +#define _fputs_r _fputs_unlocked_r +#define fputs fputs_unlocked +#endif + +/* + * Write the given string to the given file. + */ +int +_fputs_r (struct _reent * ptr, + char const *__restrict s, + FILE *__restrict fp) +{ +#ifdef _FVWRITE_IN_STREAMIO + int result; + struct __suio uio; + struct __siov iov; + + iov.iov_base = s; + iov.iov_len = uio.uio_resid = strlen (s); + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + + CHECK_INIT(ptr, fp); + + _newlib_flockfile_start (fp); + ORIENT (fp, -1); + result = __sfvwrite_r (ptr, fp, &uio); + _newlib_flockfile_end (fp); + return result; +#else + const char *p = s; + + CHECK_INIT(ptr, fp); + + _newlib_flockfile_start (fp); + ORIENT (fp, -1); + /* Make sure we can write. */ + if (cantwrite (ptr, fp)) + goto error; + + while (*p) + { + if (__sputc_r (ptr, *p++, fp) == EOF) + goto error; + } + _newlib_flockfile_exit (fp); + return 0; + +error: + _newlib_flockfile_end (fp); + return EOF; +#endif +} + +#ifndef _REENT_ONLY +int +fputs (char const *__restrict s, + FILE *__restrict fp) +{ + return _fputs_r (_REENT, s, fp); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fputs_u.c b/lib/stdio/fputs_u.c new file mode 100644 index 0000000..3b03cec --- /dev/null +++ b/lib/stdio/fputs_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fputs.c" diff --git a/lib/stdio/fputwc.c b/lib/stdio/fputwc.c new file mode 100644 index 0000000..9a4e80d --- /dev/null +++ b/lib/stdio/fputwc.c @@ -0,0 +1,186 @@ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>, <>---write a wide character on a stream or file + +INDEX + fputwc +INDEX + fputwc_unlocked +INDEX + _fputwc_r +INDEX + _fputwc_unlocked_r +INDEX + putwc +INDEX + putwc_unlocked +INDEX + _putwc_r +INDEX + _putwc_unlocked_r + +SYNOPSIS + #include + #include + wint_t fputwc(wchar_t <[wc]>, FILE *<[fp]>); + + #define _GNU_SOURCE + #include + #include + wint_t fputwc_unlocked(wchar_t <[wc]>, FILE *<[fp]>); + + #include + #include + wint_t _fputwc_r(struct _reent *<[ptr]>, wchar_t <[wc]>, FILE *<[fp]>); + + #include + #include + wint_t _fputwc_unlocked_r(struct _reent *<[ptr]>, wchar_t <[wc]>, FILE *<[fp]>); + + #include + #include + wint_t putwc(wchar_t <[wc]>, FILE *<[fp]>); + + #define _GNU_SOURCE + #include + #include + wint_t putwc_unlocked(wchar_t <[wc]>, FILE *<[fp]>); + + #include + #include + wint_t _putwc_r(struct _reent *<[ptr]>, wchar_t <[wc]>, FILE *<[fp]>); + + #include + #include + wint_t _putwc_unlocked_r(struct _reent *<[ptr]>, wchar_t <[wc]>, FILE *<[fp]>); + +DESCRIPTION +<> writes the wide character argument <[wc]> to the file or +stream identified by <[fp]>. + +If the file was opened with append mode (or if the stream cannot +support positioning), then the new wide character goes at the end of the +file or stream. Otherwise, the new wide character is written at the +current value of the position indicator, and the position indicator +oadvances by one. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The <> and <> functions or macros function identically +to <> and <>. They may be implemented as a macro, and +may evaluate its argument more than once. There is no reason ever to use them. + +The <<_fputwc_r>>, <<_putwc_r>>, <<_fputwc_unlocked_r>>, and +<<_putwc_unlocked_r>> functions are simply reentrant versions of the above +that take an additional reentrant structure argument: <[ptr]>. + +RETURNS +If successful, <> and <> return their argument <[wc]>. +If an error intervenes, the result is <>. You can use +`<)>>' to query for errors. + +PORTABILITY +<> and <> are required by C99 and POSIX.1-2001. + +<> and <> are GNU extensions. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include "local.h" + +wint_t +__fputwc (struct _reent *ptr, + wchar_t wc, + FILE *fp) +{ + char buf[MB_LEN_MAX]; + size_t i, len; + + if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) + { + /* + * Assume single-byte locale with no special encoding. + * A more careful test would be to check + * _CurrentRuneLocale->encoding. + */ + *buf = (unsigned char)wc; + len = 1; + } + else + { + if ((len = _wcrtomb_r (ptr, buf, wc, &fp->_mbstate)) == (size_t) -1) + { + fp->_flags |= __SERR; + return WEOF; + } + } + + for (i = 0; i < len; i++) + if (__sputc_r (ptr, (unsigned char) buf[i], fp) == EOF) + return WEOF; + + return (wint_t) wc; +} + +wint_t +_fputwc_r (struct _reent *ptr, + wchar_t wc, + FILE *fp) +{ + wint_t r; + + _newlib_flockfile_start (fp); + ORIENT(fp, 1); + r = __fputwc(ptr, wc, fp); + _newlib_flockfile_end (fp); + return r; +} + +wint_t +fputwc (wchar_t wc, + FILE *fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return _fputwc_r (reent, wc, fp); +} diff --git a/lib/stdio/fputwc_u.c b/lib/stdio/fputwc_u.c new file mode 100644 index 0000000..d4e5153 --- /dev/null +++ b/lib/stdio/fputwc_u.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include "local.h" + +wint_t +_fputwc_unlocked_r (struct _reent *ptr, + wchar_t wc, + FILE *fp) +{ + ORIENT(fp, 1); + return __fputwc(ptr, wc, fp); +} + +wint_t +fputwc_unlocked (wchar_t wc, + FILE *fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return _fputwc_unlocked_r (reent, wc, fp); +} diff --git a/lib/stdio/fputws.c b/lib/stdio/fputws.c new file mode 100644 index 0000000..92f2cbf --- /dev/null +++ b/lib/stdio/fputws.c @@ -0,0 +1,167 @@ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---write a wide character string in a file or stream + +INDEX + fputws +INDEX + fputws_unlocked +INDEX + _fputws_r +INDEX + _fputws_unlocked_r + +SYNOPSIS + #include + int fputws(const wchar_t *__restrict <[ws]>, FILE *__restrict <[fp]>); + + #define _GNU_SOURCE + #include + int fputws_unlocked(const wchar_t *__restrict <[ws]>, FILE *__restrict <[fp]>); + + #include + int _fputws_r(struct _reent *<[ptr]>, const wchar_t *<[ws]>, + FILE *<[fp]>); + + #include + int _fputws_unlocked_r(struct _reent *<[ptr]>, const wchar_t *<[ws]>, + FILE *<[fp]>); + +DESCRIPTION +<> writes the wide character string at <[ws]> (but without the +trailing null) to the file or stream identified by <[fp]>. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +<<_fputws_r>> and <<_fputws_unlocked_r>> are simply reentrant versions of the +above that take an additional reentrant struct pointer argument: <[ptr]>. + +RETURNS +If successful, the result is a non-negative integer; otherwise, the result +is <<-1>> to indicate an error. + +PORTABILITY +<> is required by C99 and POSIX.1-2001. + +<> is a GNU extension. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "fvwrite.h" +#include "local.h" + +#ifdef __IMPL_UNLOCKED__ +#define _fputws_r _fputws_unlocked_r +#define fputws fputws_unlocked +#endif + +int +_fputws_r (struct _reent *ptr, + const wchar_t *ws, + FILE *fp) +{ + size_t nbytes; + char buf[BUFSIZ]; +#ifdef _FVWRITE_IN_STREAMIO + struct __suio uio; + struct __siov iov; + + _newlib_flockfile_start (fp); + ORIENT (fp, 1); + if (cantwrite (ptr, fp) != 0) + goto error; + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + iov.iov_base = buf; + do + { + nbytes = _wcsrtombs_r(ptr, buf, &ws, sizeof (buf), &fp->_mbstate); + if (nbytes == (size_t) -1) + goto error; + iov.iov_len = uio.uio_resid = nbytes; + if (__sfvwrite_r(ptr, fp, &uio) != 0) + goto error; + } + while (ws != NULL); + _newlib_flockfile_exit (fp); + return (0); + +error: + _newlib_flockfile_end (fp); + return (-1); +#else + _newlib_flockfile_start (fp); + ORIENT (fp, 1); + if (cantwrite (ptr, fp) != 0) + goto error; + + do + { + size_t i = 0; + nbytes = _wcsrtombs_r (ptr, buf, &ws, sizeof (buf), &fp->_mbstate); + if (nbytes == (size_t) -1) + goto error; + while (i < nbytes) + { + if (__sputc_r (ptr, buf[i], fp) == EOF) + goto error; + i++; + } + } + while (ws != NULL); + _newlib_flockfile_exit (fp); + return (0); + +error: + _newlib_flockfile_end (fp); + return (-1); +#endif +} + +int +fputws (const wchar_t *__restrict ws, + FILE *__restrict fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT (reent, fp); + return _fputws_r (reent, ws, fp); +} diff --git a/lib/stdio/fputws_u.c b/lib/stdio/fputws_u.c new file mode 100644 index 0000000..0583e79 --- /dev/null +++ b/lib/stdio/fputws_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fputws.c" diff --git a/lib/stdio/fread.c b/lib/stdio/fread.c new file mode 100644 index 0000000..df83214 --- /dev/null +++ b/lib/stdio/fread.c @@ -0,0 +1,268 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---read array elements from a file + +INDEX + fread +INDEX + fread_unlocked +INDEX + _fread_r +INDEX + _fread_unlocked_r + +SYNOPSIS + #include + size_t fread(void *restrict <[buf]>, size_t <[size]>, size_t <[count]>, + FILE *restrict <[fp]>); + + #define _BSD_SOURCE + #include + size_t fread_unlocked(void *restrict <[buf]>, size_t <[size]>, size_t <[count]>, + FILE *restrict <[fp]>); + + #include + size_t _fread_r(struct _reent *<[ptr]>, void *restrict <[buf]>, + size_t <[size]>, size_t <[count]>, FILE *restrict <[fp]>); + + #include + size_t _fread_unlocked_r(struct _reent *<[ptr]>, void *restrict <[buf]>, + size_t <[size]>, size_t <[count]>, FILE *restrict <[fp]>); + +DESCRIPTION +<> attempts to copy, from the file or stream identified by +<[fp]>, <[count]> elements (each of size <[size]>) into memory, +starting at <[buf]>. <> may copy fewer elements than +<[count]> if an error, or end of file, intervenes. + +<> also advances the file position indicator (if any) for +<[fp]> by the number of @emph{characters} actually read. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +<<_fread_r>> and <<_fread_unlocked_r>> are simply reentrant versions of the +above that take an additional reentrant structure pointer argument: <[ptr]>. + +RETURNS +The result of <> is the number of elements it succeeded in +reading. + +PORTABILITY +ANSI C requires <>. + +<> is a BSD extension also provided by GNU libc. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifdef __IMPL_UNLOCKED__ +#define _fread_r _fread_unlocked_r +#define fread fread_unlocked +#endif + +#ifdef __SCLE +static size_t +crlf_r (struct _reent * ptr, + FILE * fp, + char * buf, + size_t count, + int eof) +{ + int r; + char *s, *d, *e; + + if (count == 0) + return 0; + + e = buf + count; + for (s=d=buf; s_r < 0) + fp->_r = 0; + total = resid; + p = buf; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + + /* Optimize unbuffered I/O. */ + if (fp->_flags & __SNBF) + { + /* First copy any available characters from ungetc buffer. */ + int copy_size = resid > fp->_r ? fp->_r : resid; + (void) memcpy ((void *) p, (void *) fp->_p, (size_t) copy_size); + fp->_p += copy_size; + fp->_r -= copy_size; + p += copy_size; + resid -= copy_size; + + /* If still more data needed, free any allocated ungetc buffer. */ + if (HASUB (fp) && resid > 0) + FREEUB (ptr, fp); + + /* Finally read directly into user's buffer if needed. */ + while (resid > 0) + { + int rc = 0; + /* save fp buffering state */ + void *old_base = fp->_bf._base; + void * old_p = fp->_p; + int old_size = fp->_bf._size; + /* allow __refill to use user's buffer */ + fp->_bf._base = (unsigned char *) p; + fp->_bf._size = resid; + fp->_p = (unsigned char *) p; + rc = __srefill_r (ptr, fp); + /* restore fp buffering back to original state */ + fp->_bf._base = old_base; + fp->_bf._size = old_size; + fp->_p = old_p; + resid -= fp->_r; + p += fp->_r; + fp->_r = 0; + if (rc) + { +#ifdef __SCLE + if (fp->_flags & __SCLE) + { + _newlib_flockfile_exit (fp); + return crlf_r (ptr, fp, buf, total-resid, 1) / size; + } +#endif + _newlib_flockfile_exit (fp); + return (total - resid) / size; + } + } + } + else +#endif /* !PREFER_SIZE_OVER_SPEED && !__OPTIMIZE_SIZE__ */ + { + while (resid > (r = fp->_r)) + { + (void) memcpy ((void *) p, (void *) fp->_p, (size_t) r); + fp->_p += r; + /* fp->_r = 0 ... done in __srefill */ + p += r; + resid -= r; + if (__srefill_r (ptr, fp)) + { + /* no more input: return partial result */ +#ifdef __SCLE + if (fp->_flags & __SCLE) + { + _newlib_flockfile_exit (fp); + return crlf_r (ptr, fp, buf, total-resid, 1) / size; + } +#endif + _newlib_flockfile_exit (fp); + return (total - resid) / size; + } + } + (void) memcpy ((void *) p, (void *) fp->_p, resid); + fp->_r -= resid; + fp->_p += resid; + } + + /* Perform any CR/LF clean-up if necessary. */ +#ifdef __SCLE + if (fp->_flags & __SCLE) + { + _newlib_flockfile_exit (fp); + return crlf_r(ptr, fp, buf, total, 0) / size; + } +#endif + _newlib_flockfile_end (fp); + return count; +} + +#ifndef _REENT_ONLY +size_t +fread (void *__restrict buf, + size_t size, + size_t count, + FILE *__restrict fp) +{ + return _fread_r (_REENT, buf, size, count, fp); +} +#endif diff --git a/lib/stdio/fread_u.c b/lib/stdio/fread_u.c new file mode 100644 index 0000000..48239a9 --- /dev/null +++ b/lib/stdio/fread_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fread.c" diff --git a/lib/stdio/freopen.c b/lib/stdio/freopen.c new file mode 100644 index 0000000..f0da9a1 --- /dev/null +++ b/lib/stdio/freopen.c @@ -0,0 +1,252 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---open a file using an existing file descriptor + +INDEX + freopen +INDEX + _freopen_r + +SYNOPSIS + #include + FILE *freopen(const char *restrict <[file]>, const char *restrict <[mode]>, + FILE *restrict <[fp]>); + FILE *_freopen_r(struct _reent *<[ptr]>, const char *restrict <[file]>, + const char *restrict <[mode]>, FILE *restrict <[fp]>); + +DESCRIPTION +Use this variant of <> if you wish to specify a particular file +descriptor <[fp]> (notably <>, <>, or <>) for +the file. + +If <[fp]> was associated with another file or stream, <> +closes that other file or stream (but ignores any errors while closing +it). + +<[file]> and <[mode]> are used just as in <>. + +If <[file]> is <>, the underlying stream is modified rather than +closed. The file cannot be given a more permissive access mode (for +example, a <[mode]> of "w" will fail on a read-only file descriptor), +but can change status such as append or binary mode. If modification +is not possible, failure occurs. + +RETURNS +If successful, the result is the same as the argument <[fp]>. If the +file cannot be opened as specified, the result is <>. + +PORTABILITY +ANSI C requires <>. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +/* + * Re-direct an existing, open (probably) file to some other file. + */ + +FILE * +_freopen_r (struct _reent *ptr, + const char *__restrict file, + const char *__restrict mode, + register FILE *__restrict fp) +{ + register int f; + int flags, oflags, oflags2; + int e = 0; + + CHECK_INIT (ptr, fp); + + /* We can't use the _newlib_flockfile_XXX macros here due to the + interlocked locking with the sfp_lock. */ +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + int __oldcancel; + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldcancel); +#endif + oflags2 = fp->_flags2; + if (!(oflags2 & __SNLK)) + _flockfile (fp); + + if ((flags = __sflags (ptr, mode, &oflags)) == 0) + { + if (!(oflags2 & __SNLK)) + _funlockfile (fp); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + _fclose_r (ptr, fp); + return NULL; + } + + /* + * Remember whether the stream was open to begin with, and + * which file descriptor (if any) was associated with it. + * If it was attached to a descriptor, defer closing it, + * so that, e.g., freopen("/dev/stdin", "r", stdin) works. + * This is unnecessary if it was not a Unix file. + */ + + if (fp->_flags == 0) + fp->_flags = __SEOF; /* hold on to it */ + else + { + if (fp->_flags & __SWR) + _fflush_r (ptr, fp); + /* + * If close is NULL, closing is a no-op, hence pointless. + * If file is NULL, the file should not be closed. + */ + if (fp->_close != NULL && file != NULL) + fp->_close (ptr, fp->_cookie); + } + + /* + * Now get a new descriptor to refer to the new file, or reuse the + * existing file descriptor if file is NULL. + */ + + if (file != NULL) + { + f = _open_r (ptr, (char *) file, oflags, 0666); + e = _REENT_ERRNO(ptr); + } + else + { +#ifdef HAVE_FCNTL + int oldflags; + /* + * Reuse the file descriptor, but only if the new access mode is + * equal or less permissive than the old. F_SETFL correctly + * ignores creation flags. + */ + f = fp->_file; + if ((oldflags = _fcntl_r (ptr, f, F_GETFL, 0)) == -1 + || ! ((oldflags & O_ACCMODE) == O_RDWR + || ((oldflags ^ oflags) & O_ACCMODE) == 0) + || _fcntl_r (ptr, f, F_SETFL, oflags) == -1) + f = -1; +#else + /* We cannot modify without fcntl support. */ + f = -1; +#endif + +#ifdef __SCLE + /* + * F_SETFL doesn't change textmode. Don't mess with modes of ttys. + */ + if (0 <= f && ! _isatty_r (ptr, f) + && setmode (f, oflags & (O_BINARY | O_TEXT)) == -1) + f = -1; +#endif + + if (f < 0) + { + e = EBADF; + if (fp->_close != NULL) + fp->_close (ptr, fp->_cookie); + } + } + + /* + * Finish closing fp. Even if the open succeeded above, + * we cannot keep fp->_base: it may be the wrong size. + * This loses the effect of any setbuffer calls, + * but stdio has always done this before. + */ + + if (fp->_flags & __SMBF) + _free_r (ptr, (char *) fp->_bf._base); + fp->_w = 0; + fp->_r = 0; + fp->_p = NULL; + fp->_bf._base = NULL; + fp->_bf._size = 0; + fp->_lbfsize = 0; + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_ub._size = 0; + if (HASLB (fp)) + FREELB (ptr, fp); + fp->_lb._size = 0; + fp->_flags &= ~__SORD; + fp->_flags2 &= ~__SWID; + memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); + + if (f < 0) + { /* did not get it after all */ + __sfp_lock_acquire (); + fp->_flags = 0; /* set it free */ + _REENT_ERRNO(ptr) = e; /* restore in case _close clobbered */ + if (!(oflags2 & __SNLK)) + _funlockfile (fp); +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + __sfp_lock_release (); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + return NULL; + } + + fp->_flags = flags; + fp->_file = f; + fp->_cookie = (void *) fp; + fp->_read = __sread; + fp->_write = __swrite; + fp->_seek = __sseek; + fp->_close = __sclose; + +#ifdef __SCLE + if (__stextmode (fp->_file)) + fp->_flags |= __SCLE; +#endif + + if (!(oflags2 & __SNLK)) + _funlockfile (fp); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +freopen (const char *__restrict file, + const char *__restrict mode, + register FILE *__restrict fp) +{ + return _freopen_r (_REENT, file, mode, fp); +} + +#endif /*!_REENT_ONLY */ diff --git a/lib/stdio/fscanf.c b/lib/stdio/fscanf.c new file mode 100644 index 0000000..40964d2 --- /dev/null +++ b/lib/stdio/fscanf.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +fscanf(FILE *__restrict fp, const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfscanf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +fiscanf (FILE *, const char *, ...) + _ATTRIBUTE ((__alias__("fscanf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_fscanf_r(struct _reent *ptr, FILE *__restrict fp, const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfscanf_r (ptr, fp, fmt, ap); + va_end (ap); + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +_fiscanf_r (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE ((__alias__("_fscanf_r"))); +#endif diff --git a/lib/stdio/fseek.c b/lib/stdio/fseek.c new file mode 100644 index 0000000..e9278af --- /dev/null +++ b/lib/stdio/fseek.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---set file position + +INDEX + fseek +INDEX + fseeko +INDEX + _fseek_r +INDEX + _fseeko_r + +SYNOPSIS + #include + int fseek(FILE *<[fp]>, long <[offset]>, int <[whence]>); + int fseeko(FILE *<[fp]>, off_t <[offset]>, int <[whence]>); + int _fseek_r(struct _reent *<[ptr]>, FILE *<[fp]>, + long <[offset]>, int <[whence]>); + int _fseeko_r(struct _reent *<[ptr]>, FILE *<[fp]>, + off_t <[offset]>, int <[whence]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <>/<> to set the position for the file identified by +<[fp]>. The value of <[offset]> determines the new position, in one +of three ways selected by the value of <[whence]> (defined as macros +in `<>'): + +<>---<[offset]> is the absolute file position (an offset +from the beginning of the file) desired. <[offset]> must be positive. + +<>---<[offset]> is relative to the current file position. +<[offset]> can meaningfully be either positive or negative. + +<>---<[offset]> is relative to the current end of file. +<[offset]> can meaningfully be either positive (to increase the size +of the file) or negative. + +See <>/<> to determine the current file position. + +RETURNS +<>/<> return <<0>> when successful. On failure, the +result is <>. The reason for failure is indicated in <>: +either <> (the stream identified by <[fp]> doesn't support +repositioning) or <> (invalid file position). + +PORTABILITY +ANSI C requires <>. + +<> is defined by the Single Unix specification. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +int +_fseek_r (struct _reent *ptr, + register FILE *fp, + long offset, + int whence) +{ + return _fseeko_r (ptr, fp, offset, whence); +} + +#ifndef _REENT_ONLY + +int +fseek (register FILE *fp, + long offset, + int whence) +{ + return _fseek_r (_REENT, fp, offset, whence); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fseeko.c b/lib/stdio/fseeko.c new file mode 100644 index 0000000..6fcc8ef --- /dev/null +++ b/lib/stdio/fseeko.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---set file position + +INDEX + fseek +INDEX + fseeko +INDEX + _fseek_r +INDEX + _fseeko_r + +SYNOPSIS + #include + int fseek(FILE *<[fp]>, long <[offset]>, int <[whence]>) + int fseeko(FILE *<[fp]>, off_t <[offset]>, int <[whence]>) + int _fseek_r(struct _reent *<[ptr]>, FILE *<[fp]>, + long <[offset]>, int <[whence]>) + int _fseeko_r(struct _reent *<[ptr]>, FILE *<[fp]>, + off_t <[offset]>, int <[whence]>) + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <>/<> to set the position for the file identified by +<[fp]>. The value of <[offset]> determines the new position, in one +of three ways selected by the value of <[whence]> (defined as macros +in `<>'): + +<>---<[offset]> is the absolute file position (an offset +from the beginning of the file) desired. <[offset]> must be positive. + +<>---<[offset]> is relative to the current file position. +<[offset]> can meaningfully be either positive or negative. + +<>---<[offset]> is relative to the current end of file. +<[offset]> can meaningfully be either positive (to increase the size +of the file) or negative. + +See <>/<> to determine the current file position. + +RETURNS +<>/<> return <<0>> when successful. On failure, the +result is <>. The reason for failure is indicated in <>: +either <> (the stream identified by <[fp]> doesn't support +repositioning) or <> (invalid file position). + +PORTABILITY +ANSI C requires <>. + +<> is defined by the Single Unix specification. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +#define POS_ERR (-(_fpos_t)1) + +/* + * Seek the given file to the given offset. + * `Whence' must be one of the three SEEK_* macros. + */ + +int +_fseeko_r (struct _reent *ptr, + register FILE *fp, + _off_t offset, + int whence) +{ + _fpos_t (*seekfn) (struct _reent *, void *, _fpos_t, int); + _fpos_t target; + _fpos_t curoff = 0; + size_t n; +#ifdef __USE_INTERNAL_STAT64 + struct stat64 st; +#else + struct stat st; +#endif + int havepos; + + /* Make sure stdio is set up. */ + + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start (fp); + + /* If we've been doing some writing, and we're in append mode + then we don't really know where the filepos is. */ + + if (fp->_flags & __SAPP && fp->_flags & __SWR) + { + /* So flush the buffer and seek to the end. */ + _fflush_r (ptr, fp); + } + + /* Have to be able to seek. */ + + if ((seekfn = fp->_seek) == NULL) + { + _REENT_ERRNO(ptr) = ESPIPE; /* ??? */ + _newlib_flockfile_exit (fp); + return EOF; + } + + /* + * Change any SEEK_CUR to SEEK_SET, and check `whence' argument. + * After this, whence is either SEEK_SET or SEEK_END. + */ + + switch (whence) + { + case SEEK_CUR: + /* + * In order to seek relative to the current stream offset, + * we have to first find the current stream offset a la + * ftell (see ftell for details). + */ + _fflush_r (ptr, fp); /* may adjust seek offset on append stream */ + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else + { + curoff = seekfn (ptr, fp->_cookie, (_fpos_t) 0, SEEK_CUR); + if (curoff == -1L) + { + _newlib_flockfile_exit (fp); + return EOF; + } + } + if (fp->_flags & __SRD) + { + curoff -= fp->_r; + if (HASUB (fp)) + curoff -= fp->_ur; + } + else if (fp->_flags & __SWR && fp->_p != NULL) + curoff += fp->_p - fp->_bf._base; + + offset += curoff; + whence = SEEK_SET; + havepos = 1; + break; + + case SEEK_SET: + case SEEK_END: + havepos = 0; + break; + + default: + _REENT_ERRNO(ptr) = EINVAL; + _newlib_flockfile_exit (fp); + return (EOF); + } + + /* + * Can only optimise if: + * reading (and not reading-and-writing); + * not unbuffered; and + * this is a `regular' Unix file (and hence seekfn==__sseek). + * We must check __NBF first, because it is possible to have __NBF + * and __SOPT both set. + */ + + if (fp->_bf._base == NULL) + __smakebuf_r (ptr, fp); + +#ifdef _FSEEK_OPTIMIZATION + if (fp->_flags & (__SWR | __SRW | __SNBF | __SNPT)) + goto dumb; + if ((fp->_flags & __SOPT) == 0) + { + if (seekfn != __sseek + || fp->_file < 0 +#ifdef __USE_INTERNAL_STAT64 + || _fstat64_r (ptr, fp->_file, &st) +#else + || _fstat_r (ptr, fp->_file, &st) +#endif + || (st.st_mode & S_IFMT) != S_IFREG) + { + fp->_flags |= __SNPT; + goto dumb; + } +#ifdef HAVE_BLKSIZE + fp->_blksize = st.st_blksize; +#else + fp->_blksize = 1024; +#endif + fp->_flags |= __SOPT; + } + + /* + * We are reading; we can try to optimise. + * Figure out where we are going and where we are now. + */ + + if (whence == SEEK_SET) + target = offset; + else + { +#ifdef __USE_INTERNAL_STAT64 + if (_fstat64_r (ptr, fp->_file, &st)) +#else + if (_fstat_r (ptr, fp->_file, &st)) +#endif + goto dumb; + target = st.st_size + offset; + } + + if (!havepos) + { + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else + { + curoff = seekfn (ptr, fp->_cookie, 0L, SEEK_CUR); + if (curoff == POS_ERR) + goto dumb; + } + curoff -= fp->_r; + if (HASUB (fp)) + curoff -= fp->_ur; + } + + /* + * Compute the number of bytes in the input buffer (pretending + * that any ungetc() input has been discarded). Adjust current + * offset backwards by this count so that it represents the + * file offset for the first byte in the current input buffer. + */ + + if (HASUB (fp)) + { + curoff += fp->_r; /* kill off ungetc */ + n = fp->_up - fp->_bf._base; + curoff -= n; + n += fp->_ur; + } + else + { + n = fp->_p - fp->_bf._base; + curoff -= n; + n += fp->_r; + } + + /* + * If the target offset is within the current buffer, + * simply adjust the pointers, clear EOF, undo ungetc(), + * and return. + */ + + if (target >= curoff && target < curoff + n) + { + register int o = target - curoff; + + fp->_p = fp->_bf._base + o; + fp->_r = n - o; + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_flags &= ~__SEOF; + memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); + _newlib_flockfile_exit (fp); + return 0; + } + + /* + * The place we want to get to is not within the current buffer, + * but we can still be kind to the kernel copyout mechanism. + * By aligning the file offset to a block boundary, we can let + * the kernel use the VM hardware to map pages instead of + * copying bytes laboriously. Using a block boundary also + * ensures that we only read one block, rather than two. + */ + + curoff = target & ~(fp->_blksize - 1); + if (seekfn (ptr, fp->_cookie, curoff, SEEK_SET) == POS_ERR) + goto dumb; + fp->_r = 0; + fp->_p = fp->_bf._base; + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_flags &= ~__SEOF; + n = target - curoff; + if (n) + { + if (__srefill_r (ptr, fp) || fp->_r < n) + goto dumb; + fp->_p += n; + fp->_r -= n; + } + memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); + _newlib_flockfile_exit (fp); + return 0; + + /* + * We get here if we cannot optimise the seek ... just + * do it. Allow the seek function to change fp->_bf._base. + */ +#endif + +dumb: + if (_fflush_r (ptr, fp) + || seekfn (ptr, fp->_cookie, offset, whence) == POS_ERR) + { + _newlib_flockfile_exit (fp); + return EOF; + } + /* success: clear EOF indicator and discard ungetc() data */ + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_p = fp->_bf._base; + fp->_r = 0; + /* fp->_w = 0; *//* unnecessary (I think...) */ + fp->_flags &= ~__SEOF; + /* Reset no-optimization flag after successful seek. The + no-optimization flag may be set in the case of a read + stream that is flushed which by POSIX/SUSv3 standards, + means that a corresponding seek must not optimize. The + optimization is then allowed if no subsequent flush + is performed. */ + fp->_flags &= ~__SNPT; + memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); + _newlib_flockfile_end (fp); + return 0; +} + +#ifndef _REENT_ONLY + +int +fseeko (register FILE *fp, + _off_t offset, + int whence) +{ + return _fseeko_r (_REENT, fp, offset, whence); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fsetlocking.c b/lib/stdio/fsetlocking.c new file mode 100644 index 0000000..062b93a --- /dev/null +++ b/lib/stdio/fsetlocking.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* +FUNCTION +<<__fsetlocking>>---set or query locking mode on FILE stream + +INDEX + __fsetlocking + +SYNOPSIS + #include + #include + int __fsetlocking(FILE *<[fp]>, int <[type]>); + +DESCRIPTION +This function sets how the stdio functions handle locking of FILE <[fp]>. +The following values describe <[type]>: + +<> is the default state, where stdio functions +automatically lock and unlock the stream. + +<> means that automatic locking in stdio functions +is disabled. Applications which set this take all responsibility for file +locking themselves. + +<> returns the current locking mode without changing it. + +RETURNS +<<__fsetlocking>> returns the current locking mode of <[fp]>. + +PORTABILITY +This function originates from Solaris and is also provided by GNU libc. + +No supporting OS subroutines are required. +*/ + +#ifndef __rtems__ + +#include <_ansi.h> +#include +#include +#include "local.h" + +int +__fsetlocking (FILE * fp, + int type) +{ + int result; + CHECK_INIT(_REENT, fp); + result = (fp->_flags2 & __SNLK) ? FSETLOCKING_BYCALLER : FSETLOCKING_INTERNAL; + switch (type) + { + case FSETLOCKING_BYCALLER: + fp->_flags2 |= __SNLK; + break; + case FSETLOCKING_INTERNAL: + fp->_flags2 &= ~__SNLK; + break; + case FSETLOCKING_QUERY: + default: + break; + } + return result; +} + +#endif /* __rtems__ */ diff --git a/lib/stdio/fsetpos.c b/lib/stdio/fsetpos.c new file mode 100644 index 0000000..6258600 --- /dev/null +++ b/lib/stdio/fsetpos.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---restore position of a stream or file + +INDEX + fsetpos +INDEX + _fsetpos_r + +SYNOPSIS + #include + int fsetpos(FILE *<[fp]>, const fpos_t *<[pos]>); + int _fsetpos_r(struct _reent *<[ptr]>, FILE *<[fp]>, + const fpos_t *<[pos]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <> to return the file identified by <[fp]> to a previous +position <<*<[pos]>>> (after first recording it with <>). + +See <> for a similar facility. + +RETURNS +<> returns <<0>> when successful. If <> fails, the +result is <<1>>. The reason for failure is indicated in <>: +either <> (the stream identified by <[fp]> doesn't support +repositioning) or <> (invalid file position). + +PORTABILITY +ANSI C requires <>, but does not specify the nature of +<<*<[pos]>>> beyond identifying it as written by <>. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include + +int +_fsetpos_r (struct _reent * ptr, + FILE * iop, + const _fpos_t * pos) +{ + int x = _fseek_r (ptr, iop, *pos, SEEK_SET); + + if (x != 0) + return 1; + return 0; +} + +#ifndef _REENT_ONLY + +int +fsetpos (FILE * iop, + const _fpos_t * pos) +{ + return _fsetpos_r (_REENT, iop, pos); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/ftell.c b/lib/stdio/ftell.c new file mode 100644 index 0000000..f68b3af --- /dev/null +++ b/lib/stdio/ftell.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---return position in a stream or file + +INDEX + ftell +INDEX + ftello +INDEX + _ftell_r +INDEX + _ftello_r + +SYNOPSIS + #include + long ftell(FILE *<[fp]>); + off_t ftello(FILE *<[fp]>); + long _ftell_r(struct _reent *<[ptr]>, FILE *<[fp]>); + off_t _ftello_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +The result of <>/<> is the current position for a file +identified by <[fp]>. If you record this result, you can later +use it with <>/<> to return the file to this +position. The difference between <> and <> is that +<> returns <> and <> returns <>. + +In the current implementation, <>/<> simply uses a character +count to represent the file position; this is the same number that +would be recorded by <>. + +RETURNS +<>/<> return the file position, if possible. If they cannot do +this, they return <<-1L>>. Failure occurs on streams that do not support +positioning; the global <> indicates this condition with the +value <>. + +PORTABILITY +<> is required by the ANSI C standard, but the meaning of its +result (when successful) is not specified beyond requiring that it be +acceptable as an argument to <>. In particular, other +conforming C implementations may return a different result from +<> than what <> records. + +<> is defined by the Single Unix specification. + +No supporting OS subroutines are required. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * ftell: return current offset. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +long +_ftell_r (struct _reent *ptr, + register FILE * fp) +{ + _fpos_t pos; + + pos = _ftello_r (ptr, fp); + if ((long)pos != pos) + { + pos = -1; + _REENT_ERRNO(ptr) = EOVERFLOW; + } + return (long)pos; +} + +#ifndef _REENT_ONLY + +long +ftell (register FILE * fp) +{ + return _ftell_r (_REENT, fp); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/ftello.c b/lib/stdio/ftello.c new file mode 100644 index 0000000..d62d48a --- /dev/null +++ b/lib/stdio/ftello.c @@ -0,0 +1,160 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---return position in a stream or file + +INDEX + ftell +INDEX + ftello +INDEX + _ftell_r +INDEX + _ftello_r + +SYNOPSIS + #include + long ftell(FILE *<[fp]>); + off_t ftello(FILE *<[fp]>); + long _ftell_r(struct _reent *<[ptr]>, FILE *<[fp]>); + off_t _ftello_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +The result of <>/<> is the current position for a file +identified by <[fp]>. If you record this result, you can later +use it with <>/<> to return the file to this +position. The difference between <> and <> is that +<> returns <> and <> returns <>. + +In the current implementation, <>/<> simply uses a character +count to represent the file position; this is the same number that +would be recorded by <>. + +RETURNS +<>/<> return the file position, if possible. If they cannot do +this, they return <<-1L>>. Failure occurs on streams that do not support +positioning; the global <> indicates this condition with the +value <>. + +PORTABILITY +<> is required by the ANSI C standard, but the meaning of its +result (when successful) is not specified beyond requiring that it be +acceptable as an argument to <>. In particular, other +conforming C implementations may return a different result from +<> than what <> records. + +<> is defined by the Single Unix specification. + +No supporting OS subroutines are required. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * ftello: return current offset. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +_off_t +_ftello_r (struct _reent * ptr, + register FILE * fp) +{ + _fpos_t pos; + + /* Ensure stdio is set up. */ + + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start (fp); + + if (fp->_seek == NULL) + { + _REENT_ERRNO(ptr) = ESPIPE; + _newlib_flockfile_exit (fp); + return (_off_t) -1; + } + + /* Find offset of underlying I/O object, then adjust for buffered bytes. */ + if (!(fp->_flags & __SRD) && (fp->_flags & __SWR) && + fp->_p != NULL && fp->_p - fp->_bf._base > 0 && + (fp->_flags & __SAPP)) + { + pos = fp->_seek (ptr, fp->_cookie, (_fpos_t) 0, SEEK_END); + if (pos == (_fpos_t) -1) + { + _newlib_flockfile_exit (fp); + return (_off_t) -1; + } + } + else if (fp->_flags & __SOFF) + pos = fp->_offset; + else + { + pos = fp->_seek (ptr, fp->_cookie, (_fpos_t) 0, SEEK_CUR); + if (pos == (_fpos_t) -1) + { + _newlib_flockfile_exit (fp); + return (_off_t) -1; + } + } + if (fp->_flags & __SRD) + { + /* + * Reading. Any unread characters (including + * those from ungetc) cause the position to be + * smaller than that in the underlying object. + */ + pos -= fp->_r; + if (HASUB (fp)) + pos -= fp->_ur; + } + else if ((fp->_flags & __SWR) && fp->_p != NULL) + { + /* + * Writing. Any buffered characters cause the + * position to be greater than that in the + * underlying object. + */ + pos += fp->_p - fp->_bf._base; + } + + _newlib_flockfile_end (fp); + return (_off_t) pos; +} + +#ifndef _REENT_ONLY + +_off_t +ftello (register FILE * fp) +{ + return _ftello_r (_REENT, fp); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/funopen.c b/lib/stdio/funopen.c new file mode 100644 index 0000000..4ed5019 --- /dev/null +++ b/lib/stdio/funopen.c @@ -0,0 +1,272 @@ +/* Copyright (C) 2007 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>, <>, <>---open a stream with custom callbacks + +INDEX + funopen +INDEX + fropen +INDEX + fwopen + +SYNOPSIS + #include + FILE *funopen(const void *<[cookie]>, + int (*<[readfn]>) (void *cookie, char *buf, int n), + int (*<[writefn]>) (void *cookie, const char *buf, int n), + fpos_t (*<[seekfn]>) (void *cookie, fpos_t off, int whence), + int (*<[closefn]>) (void *cookie)); + FILE *fropen(const void *<[cookie]>, + int (*<[readfn]>) (void *cookie, char *buf, int n)); + FILE *fwopen(const void *<[cookie]>, + int (*<[writefn]>) (void *cookie, const char *buf, int n)); + +DESCRIPTION +<> creates a <> stream where I/O is performed using +custom callbacks. At least one of <[readfn]> and <[writefn]> must be +provided, which determines whether the stream behaves with mode <"r">, +<"w">, or <"r+">. + +<[readfn]> should return -1 on failure, or else the number of bytes +read (0 on EOF). It is similar to <>, except that rather +than bounds a transaction size, and <[cookie]> will be passed +as the first argument. A NULL <[readfn]> makes attempts to read the +stream fail. + +<[writefn]> should return -1 on failure, or else the number of bytes +written. It is similar to <>, except that rather than + bounds a transaction size, and <[cookie]> will be passed as +the first argument. A NULL <[writefn]> makes attempts to write the +stream fail. + +<[seekfn]> should return (fpos_t)-1 on failure, or else the current +file position. It is similar to <>, except that <[cookie]> +will be passed as the first argument. A NULL <[seekfn]> makes the +stream behave similarly to a pipe in relation to stdio functions that +require positioning. This implementation assumes fpos_t and off_t are +the same type. + +<[closefn]> should return -1 on failure, or 0 on success. It is +similar to <>, except that <[cookie]> will be passed as the +first argument. A NULL <[closefn]> merely flushes all data then lets +<> succeed. A failed close will still invalidate the stream. + +Read and write I/O functions are allowed to change the underlying +buffer on fully buffered or line buffered streams by calling +<>. They are also not required to completely fill or empty +the buffer. They are not, however, allowed to change streams from +unbuffered to buffered or to change the state of the line buffering +flag. They must also be prepared to have read or write calls occur on +buffers other than the one most recently specified. + +The functions <> and <> are convenience macros around +<> that only use the specified callback. + +RETURNS +The return value is an open FILE pointer on success. On error, +<> is returned, and <> will be set to EINVAL if a +function pointer is missing, ENOMEM if the stream cannot be created, +or EMFILE if too many streams are already open. + +PORTABILITY +This function is a newlib extension, copying the prototype from BSD. +It is not portable. See also the <> interface from Linux. + +Supporting OS subroutines required: <>. +*/ + +#include +#include +#include +#include "local.h" + +typedef int (*funread)(void *_cookie, char *_buf, _READ_WRITE_BUFSIZE_TYPE _n); +typedef int (*funwrite)(void *_cookie, const char *_buf, + _READ_WRITE_BUFSIZE_TYPE _n); +#ifdef __LARGE64_FILES +typedef _fpos64_t (*funseek)(void *_cookie, _fpos64_t _off, int _whence); +#else +typedef fpos_t (*funseek)(void *_cookie, fpos_t _off, int _whence); +#endif +typedef int (*funclose)(void *_cookie); + +typedef struct funcookie { + void *cookie; + funread readfn; + funwrite writefn; + funseek seekfn; + funclose closefn; +} funcookie; + +static _READ_WRITE_RETURN_TYPE +funreader (struct _reent *ptr, + void *cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + int result; + funcookie *c = (funcookie *) cookie; + errno = 0; + if ((result = c->readfn (c->cookie, buf, n)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + return result; +} + +static _READ_WRITE_RETURN_TYPE +funwriter (struct _reent *ptr, + void *cookie, + const char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + int result; + funcookie *c = (funcookie *) cookie; + errno = 0; + if ((result = c->writefn (c->cookie, buf, n)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + return result; +} + +static _fpos_t +funseeker (struct _reent *ptr, + void *cookie, + _fpos_t off, + int whence) +{ + funcookie *c = (funcookie *) cookie; +#ifndef __LARGE64_FILES + fpos_t result; + errno = 0; + if ((result = c->seekfn (c->cookie, (fpos_t) off, whence)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; +#else /* __LARGE64_FILES */ + _fpos64_t result; + errno = 0; + if ((result = c->seekfn (c->cookie, (_fpos64_t) off, whence)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + else if ((_fpos_t)result != result) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + result = -1; + } +#endif /* __LARGE64_FILES */ + return result; +} + +#ifdef __LARGE64_FILES +static _fpos64_t +funseeker64 (struct _reent *ptr, + void *cookie, + _fpos64_t off, + int whence) +{ + _fpos64_t result; + funcookie *c = (funcookie *) cookie; + errno = 0; + if ((result = c->seekfn (c->cookie, off, whence)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + return result; +} +#endif /* __LARGE64_FILES */ + +static int +funcloser (struct _reent *ptr, + void *cookie) +{ + int result = 0; + funcookie *c = (funcookie *) cookie; + if (c->closefn) + { + errno = 0; + if ((result = c->closefn (c->cookie)) < 0 && errno) + _REENT_ERRNO(ptr) = errno; + } + _free_r (ptr, c); + return result; +} + +FILE * +_funopen_r (struct _reent *ptr, + const void *cookie, + funread readfn, + funwrite writefn, + funseek seekfn, + funclose closefn) +{ + FILE *fp; + funcookie *c; + + if (!readfn && !writefn) + { + _REENT_ERRNO(ptr) = EINVAL; + return NULL; + } + if ((fp = __sfp (ptr)) == NULL) + return NULL; + if ((c = (funcookie *) _malloc_r (ptr, sizeof *c)) == NULL) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + return NULL; + } + + _newlib_flockfile_start (fp); + fp->_file = -1; + c->cookie = (void *) cookie; /* cast away const */ + fp->_cookie = c; + if (readfn) + { + c->readfn = readfn; + fp->_read = funreader; + if (writefn) + { + fp->_flags = __SRW; + c->writefn = writefn; + fp->_write = funwriter; + } + else + { + fp->_flags = __SRD; + c->writefn = NULL; + fp->_write = NULL; + } + } + else + { + fp->_flags = __SWR; + c->writefn = writefn; + fp->_write = funwriter; + c->readfn = NULL; + fp->_read = NULL; + } + c->seekfn = seekfn; + fp->_seek = seekfn ? funseeker : NULL; +#ifdef __LARGE64_FILES + fp->_seek64 = seekfn ? funseeker64 : NULL; + fp->_flags |= __SL64; +#endif + c->closefn = closefn; + fp->_close = funcloser; + _newlib_flockfile_end (fp); + return fp; +} + +#ifndef _REENT_ONLY +FILE * +funopen (const void *cookie, + funread readfn, + funwrite writefn, + funseek seekfn, + funclose closefn) +{ + return _funopen_r (_REENT, cookie, readfn, writefn, seekfn, closefn); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/fvwrite.c b/lib/stdio/fvwrite.c new file mode 100644 index 0000000..34361cb --- /dev/null +++ b/lib/stdio/fvwrite.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" +#include "fvwrite.h" + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define COPY(n) (void) memmove ((void *) fp->_p, (void *) p, (size_t) (n)) + +#define GETIOV(extra_work) \ + while (len == 0) \ + { \ + extra_work; \ + p = iov->iov_base; \ + len = iov->iov_len; \ + iov++; \ + } + +/* + * Write some memory regions. Return zero on success, EOF on error. + * + * This routine is large and unsightly, but most of the ugliness due + * to the three different kinds of output buffering is handled here. + */ + +int +__sfvwrite_r (struct _reent *ptr, + register FILE *fp, + register struct __suio *uio) +{ + register size_t len; + register const char *p = NULL; + register struct __siov *iov; + register _READ_WRITE_RETURN_TYPE w, s; + char *nl; + int nlknown, nldist; + + if ((len = uio->uio_resid) == 0) + return 0; + + /* make sure we can write */ + if (cantwrite (ptr, fp)) + return EOF; + + iov = uio->uio_iov; + len = 0; + +#ifdef __SCLE + if (fp->_flags & __SCLE) /* text mode */ + { + do + { + GETIOV (;); + while (len > 0) + { + if (putc (*p, fp) == EOF) + return EOF; + p++; + len--; + uio->uio_resid--; + } + } + while (uio->uio_resid > 0); + return 0; + } +#endif + + if (fp->_flags & __SNBF) + { + /* + * Unbuffered: Split buffer in the largest multiple of BUFSIZ < INT_MAX + * as some legacy code may expect int instead of size_t. + */ + do + { + GETIOV (;); + w = fp->_write (ptr, fp->_cookie, p, + MIN (len, INT_MAX - INT_MAX % BUFSIZ)); + if (w <= 0) + goto err; + p += w; + len -= w; + } + while ((uio->uio_resid -= w) != 0); + } + else if ((fp->_flags & __SLBF) == 0) + { + /* + * Fully buffered: fill partially full buffer, if any, + * and then flush. If there is no partial buffer, write + * one _bf._size byte chunk directly (without copying). + * + * String output is a special case: write as many bytes + * as fit, but pretend we wrote everything. This makes + * snprintf() return the number of bytes needed, rather + * than the number used, and avoids its write function + * (so that the write function can be invalid). If + * we are dealing with the asprintf routines, we will + * dynamically increase the buffer size as needed. + */ + do + { + GETIOV (;); + w = fp->_w; + if (fp->_flags & __SSTR) + { + if (len >= w && fp->_flags & (__SMBF | __SOPT)) + { /* must be asprintf family */ + unsigned char *str; + int curpos = (fp->_p - fp->_bf._base); + /* Choose a geometric growth factor to avoid + quadratic realloc behavior, but use a rate less + than (1+sqrt(5))/2 to accomodate malloc + overhead. asprintf EXPECTS us to overallocate, so + that it can add a trailing \0 without + reallocating. The new allocation should thus be + max(prev_size*1.5, curpos+len+1). */ + int newsize = fp->_bf._size * 3 / 2; + if (newsize < curpos + len + 1) + newsize = curpos + len + 1; + if (fp->_flags & __SOPT) + { + /* asnprintf leaves original buffer alone. */ + str = (unsigned char *)_malloc_r (ptr, newsize); + if (!str) + { + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + memcpy (str, fp->_bf._base, curpos); + fp->_flags = (fp->_flags & ~__SOPT) | __SMBF; + } + else + { + str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, + newsize); + if (!str) + { + /* Free buffer which is no longer used and clear + __SMBF flag to avoid double free in fclose. */ + _free_r (ptr, fp->_bf._base); + fp->_flags &= ~__SMBF; + /* Ensure correct errno, even if free changed it. */ + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + } + fp->_bf._base = str; + fp->_p = str + curpos; + fp->_bf._size = newsize; + w = len; + fp->_w = newsize - curpos; + } + if (len < w) + w = len; + COPY (w); /* copy MIN(fp->_w,len), */ + fp->_w -= w; + fp->_p += w; + w = len; /* but pretend copied all */ + } + else if (fp->_p > fp->_bf._base || len < fp->_bf._size) + { + /* pass through the buffer */ + w = MIN (len, w); + COPY (w); + fp->_w -= w; + fp->_p += w; + if (fp->_w == 0 && _fflush_r (ptr, fp)) + goto err; + } + else + { + /* write directly */ + w = ((int)MIN (len, INT_MAX)) / fp->_bf._size * fp->_bf._size; + w = fp->_write (ptr, fp->_cookie, p, w); + if (w <= 0) + goto err; + } + p += w; + len -= w; + } + while ((uio->uio_resid -= w) != 0); + } + else + { + /* + * Line buffered: like fully buffered, but we + * must check for newlines. Compute the distance + * to the first newline (including the newline), + * or `infinity' if there is none, then pretend + * that the amount to write is MIN(len,nldist). + */ + nlknown = 0; + nldist = 0; + do + { + GETIOV (nlknown = 0); + if (!nlknown) + { + nl = memchr ((void *) p, '\n', len); + nldist = nl ? nl + 1 - p : len + 1; + nlknown = 1; + } + s = MIN (len, nldist); + w = fp->_w + fp->_bf._size; + if (fp->_p > fp->_bf._base && s > w) + { + COPY (w); + /* fp->_w -= w; */ + fp->_p += w; + if (_fflush_r (ptr, fp)) + goto err; + } + else if (s >= (w = fp->_bf._size)) + { + w = fp->_write (ptr, fp->_cookie, p, w); + if (w <= 0) + goto err; + } + else + { + w = s; + COPY (w); + fp->_w -= w; + fp->_p += w; + } + if ((nldist -= w) == 0) + { + /* copied the newline: flush and forget */ + if (_fflush_r (ptr, fp)) + goto err; + nlknown = 0; + } + p += w; + len -= w; + } + while ((uio->uio_resid -= w) != 0); + } + return 0; + +err: + fp->_flags |= __SERR; + return EOF; +} diff --git a/lib/stdio/fvwrite.h b/lib/stdio/fvwrite.h new file mode 100644 index 0000000..767174b --- /dev/null +++ b/lib/stdio/fvwrite.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* %W% (Berkeley) %G% */ +#include <_ansi.h> + +/* + * I/O descriptors for __sfvwrite_r(). + */ +struct __siov { + const void *iov_base; + size_t iov_len; +}; +struct __suio { + struct __siov *uio_iov; + int uio_iovcnt; + size_t uio_resid; +}; + + +extern int __sfvwrite_r (struct _reent *, FILE *, struct __suio *); +extern int __swsetup_r (struct _reent *, FILE *); diff --git a/lib/stdio/fwalk.c b/lib/stdio/fwalk.c new file mode 100644 index 0000000..b1284c6 --- /dev/null +++ b/lib/stdio/fwalk.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include + +int +_fwalk_sglue (struct _reent *ptr, int (*func) (struct _reent *, FILE *), + struct _glue *g) +{ + FILE *fp; + int n, ret = 0; + + /* + * It should be safe to walk the list without locking it; + * new nodes are only added to the end and none are ever + * removed. + * + * Avoid locking this list while walking it or else you will + * introduce a potential deadlock in [at least] refill.c. + */ + do { + for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++) + if (fp->_flags != 0 && fp->_flags != 1 && fp->_file != -1) + ret |= (*func) (ptr, fp); + g = g->_next; + } while (g != NULL); + + return ret; +} diff --git a/lib/stdio/fwide.c b/lib/stdio/fwide.c new file mode 100644 index 0000000..9b5a3d1 --- /dev/null +++ b/lib/stdio/fwide.c @@ -0,0 +1,76 @@ +/* +FUNCTION +<>---set and determine the orientation of a FILE stream + +INDEX + fwide +INDEX + _fwide_r + +SYNOPSIS + #include + int fwide(FILE *<[fp]>, int <[mode]>); + + int _fwide_r(struct _reent *<[ptr]>, FILE *<[fp]>, int <[mode]>); + +DESCRIPTION +When <[mode]> is zero, the <> function determines the current +orientation of <[fp]>. It returns a value > 0 if <[fp]> is +wide-character oriented, i.e. if wide character I/O is permitted but +char I/O is disallowed. It returns a value < 0 if <[fp]> is byte +oriented, i.e. if char I/O is permitted but wide character I/O is +disallowed. It returns zero if <[fp]> has no orientation yet; in +this case the next I/O operation might change the orientation (to byte +oriented if it is a char I/O operation, or to wide-character oriented +if it is a wide character I/O operation). + +Once a stream has an orientation, it cannot be changed and persists +until the stream is closed, unless the stream is re-opened with freopen, +which removes the orientation of the stream. + +When <[mode]> is non-zero, the <> function first attempts to set +<[fp]>'s orientation (to wide-character oriented if <[mode]> > 0, or to +byte oriented if <[mode]> < 0). It then returns a value denoting the +current orientation, as above. + +RETURNS +The <> function returns <[fp]>'s orientation, after possibly +changing it. A return value > 0 means wide-character oriented. A return +value < 0 means byte oriented. A return value of zero means undecided. + +PORTABILITY +C99, POSIX.1-2001. + +*/ + +#include <_ansi.h> +#include +#include "local.h" + +int +_fwide_r (struct _reent *ptr, + FILE *fp, + int mode) +{ + int ret; + + CHECK_INIT(ptr, fp); + + _newlib_flockfile_start (fp); + if (mode != 0) { + ORIENT (fp, mode); + } + if (!(fp->_flags & __SORD)) + ret = 0; + else + ret = (fp->_flags2 & __SWID) ? 1 : -1; + _newlib_flockfile_end (fp); + return ret; +} + +int +fwide (FILE *fp, + int mode) +{ + return _fwide_r (_REENT, fp, mode); +} diff --git a/lib/stdio/fwprintf.c b/lib/stdio/fwprintf.c new file mode 100644 index 0000000..e578664 --- /dev/null +++ b/lib/stdio/fwprintf.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in swprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include + +int +_fwprintf_r (struct _reent *ptr, + FILE *fp, + const wchar_t *fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfwprintf_r (ptr, fp, fmt, ap); + va_end (ap); + return ret; +} + +#ifndef _REENT_ONLY + +int +fwprintf (FILE *__restrict fp, + const wchar_t *__restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfwprintf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/fwrite.c b/lib/stdio/fwrite.c new file mode 100644 index 0000000..d499f6f --- /dev/null +++ b/lib/stdio/fwrite.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>---write array elements + +INDEX + fwrite +INDEX + fwrite_unlocked +INDEX + _fwrite_r +INDEX + _fwrite_unlocked_r + +SYNOPSIS + #include + size_t fwrite(const void *restrict <[buf]>, size_t <[size]>, + size_t <[count]>, FILE *restrict <[fp]>); + + #define _BSD_SOURCE + #include + size_t fwrite_unlocked(const void *restrict <[buf]>, size_t <[size]>, + size_t <[count]>, FILE *restrict <[fp]>); + + #include + size_t _fwrite_r(struct _reent *<[ptr]>, const void *restrict <[buf]>, size_t <[size]>, + size_t <[count]>, FILE *restrict <[fp]>); + + #include + size_t _fwrite_unlocked_r(struct _reent *<[ptr]>, const void *restrict <[buf]>, size_t <[size]>, + size_t <[count]>, FILE *restrict <[fp]>); + +DESCRIPTION +<> attempts to copy, starting from the memory location +<[buf]>, <[count]> elements (each of size <[size]>) into the file or +stream identified by <[fp]>. <> may copy fewer elements than +<[count]> if an error intervenes. + +<> also advances the file position indicator (if any) for +<[fp]> by the number of @emph{characters} actually written. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +<<_fwrite_r>> and <<_fwrite_unlocked_r>> are simply reentrant versions of the +above that take an additional reentrant structure argument: <[ptr]>. + +RETURNS +If <> succeeds in writing all the elements you specify, the +result is the same as the argument <[count]>. In any event, the +result is the number of complete elements that <> copied to +the file. + +PORTABILITY +ANSI C requires <>. + +<> is a BSD extension also provided by GNU libc. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#if 0 +#include +#endif +#include "local.h" +#if 1 +#include "fvwrite.h" +#endif + +#ifdef __IMPL_UNLOCKED__ +#define _fwrite_r _fwrite_unlocked_r +#define fwrite fwrite_unlocked +#endif + +/* + * Write `count' objects (each size `size') from memory to the given file. + * Return the number of whole objects written. + */ + +size_t +_fwrite_r (struct _reent * ptr, + const void *__restrict buf, + size_t size, + size_t count, + FILE * __restrict fp) +{ + size_t n; +#ifdef _FVWRITE_IN_STREAMIO + struct __suio uio; + struct __siov iov; + + iov.iov_base = buf; + uio.uio_resid = iov.iov_len = n = count * size; + uio.uio_iov = &iov; + uio.uio_iovcnt = 1; + + /* + * The usual case is success (__sfvwrite_r returns 0); + * skip the divide if this happens, since divides are + * generally slow and since this occurs whenever size==0. + */ + + CHECK_INIT(ptr, fp); + + _newlib_flockfile_start (fp); + ORIENT (fp, -1); + if (__sfvwrite_r (ptr, fp, &uio) == 0) + { + _newlib_flockfile_exit (fp); + return count; + } + _newlib_flockfile_end (fp); + return (n - uio.uio_resid) / size; +#else + size_t i = 0; + const char *p = buf; + n = count * size; + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start (fp); + ORIENT (fp, -1); + /* Make sure we can write. */ + if (cantwrite (ptr, fp)) + goto ret; + + while (i < n) + { + if (__sputc_r (ptr, p[i], fp) == EOF) + break; + + i++; + } + +ret: + _newlib_flockfile_end (fp); + return i / size; +#endif +} + +#ifndef _REENT_ONLY +size_t +fwrite (const void *__restrict buf, + size_t size, + size_t count, + FILE * fp) +{ + return _fwrite_r (_REENT, buf, size, count, fp); +} +#endif diff --git a/lib/stdio/fwrite_u.c b/lib/stdio/fwrite_u.c new file mode 100644 index 0000000..80154a0 --- /dev/null +++ b/lib/stdio/fwrite_u.c @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define __IMPL_UNLOCKED__ +#include "fwrite.c" diff --git a/lib/stdio/fwscanf.c b/lib/stdio/fwscanf.c new file mode 100644 index 0000000..59a96dd --- /dev/null +++ b/lib/stdio/fwscanf.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* Doc in swscanf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +fwscanf (FILE *__restrict fp, const wchar_t *__restrict fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfwscanf_r (_REENT, fp, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_fwscanf_r (struct _reent *ptr, FILE *fp, const wchar_t *fmt, ...) +{ + int ret; + va_list ap; + + va_start (ap, fmt); + ret = _vfwscanf_r (ptr, fp, fmt, ap); + va_end (ap); + return (ret); +} + diff --git a/lib/stdio/getc.c b/lib/stdio/getc.c new file mode 100644 index 0000000..c878132 --- /dev/null +++ b/lib/stdio/getc.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---read a character (macro) + +INDEX + getc +INDEX + _getc_r + +SYNOPSIS + #include + int getc(FILE *<[fp]>); + + #include + int _getc_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +<> is a macro, defined in <>. You can use <> +to get the next single character from the file or stream +identified by <[fp]>. As a side effect, <> advances the file's +current position indicator. + +For a subroutine version of this macro, see <>. + +The <<_getc_r>> function is simply the reentrant version of <> +which passes an additional reentrancy structure pointer argument: <[ptr]>. + +RETURNS +The next character (read as an <>, and cast to +<>), unless there is no more data, or the host system reports a +read error; in either of these situations, <> returns <>. + +You can distinguish the two situations that cause an <> result by +using the <> and <> functions. + +PORTABILITY +ANSI C requires <>; it suggests, but does not require, that +<> be implemented as a macro. The standard explicitly permits +macro implementations of <> to use the argument more than once; +therefore, in a portable program, you should not use an expression +with side effects as the <> argument. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include "local.h" + +/* + * A subroutine version of the macro getc. + */ + +#undef getc + +int +_getc_r (struct _reent *ptr, + register FILE *fp) +{ + int result; + CHECK_INIT (ptr, fp); + _newlib_flockfile_start (fp); + result = __sgetc_r (ptr, fp); + _newlib_flockfile_end (fp); + return result; +} + +#ifndef _REENT_ONLY + +int +getc (register FILE *fp) +{ + int result; + struct _reent *reent = _REENT; + + CHECK_INIT (reent, fp); + _newlib_flockfile_start (fp); + result = __sgetc_r (reent, fp); + _newlib_flockfile_end (fp); + return result; +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/getc_u.c b/lib/stdio/getc_u.c new file mode 100644 index 0000000..8bbbb4e --- /dev/null +++ b/lib/stdio/getc_u.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---non-thread-safe version of getc (macro) + +INDEX + getc_unlocked +INDEX + _getc_unlocked_r + +SYNOPSIS + #include + int getc_unlocked(FILE *<[fp]>); + + #include + int _getc_unlocked_r(FILE *<[fp]>); + +DESCRIPTION +<> is a non-thread-safe version of <> declared in +<>. <> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). These +functions may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the ( FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The <<_getc_unlocked_r>> function is simply the reentrant version of +<> which passes an additional reentrancy structure pointer +argument: <[ptr]>. + +RETURNS +See <>. + +PORTABILITY +POSIX 1003.1 requires <>. <> may be +implemented as a macro, so arguments should not have side-effects. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include + +/* + * A subroutine version of the macro getc_unlocked. + */ + +#undef getc_unlocked + +int +_getc_unlocked_r (struct _reent *ptr, + register FILE *fp) +{ + /* CHECK_INIT is called (eventually) by __srefill_r. */ + + return __sgetc_r (ptr, fp); +} + +#ifndef _REENT_ONLY + +int +getc_unlocked (register FILE *fp) +{ + return __sgetc_r (_REENT, fp); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/getchar.c b/lib/stdio/getchar.c new file mode 100644 index 0000000..e6b18f0 --- /dev/null +++ b/lib/stdio/getchar.c @@ -0,0 +1,93 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---read a character (macro) + +INDEX + getchar +INDEX + _getchar_r + +SYNOPSIS + #include + int getchar(void); + + int _getchar_r(struct _reent *<[reent]>); + +DESCRIPTION +<> is a macro, defined in <>. You can use <> +to get the next single character from the standard input stream. +As a side effect, <> advances the standard input's +current position indicator. + +The alternate function <<_getchar_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + + +RETURNS +The next character (read as an <>, and cast to +<>), unless there is no more data, or the host system reports a +read error; in either of these situations, <> returns <>. + +You can distinguish the two situations that cause an <> result by +using `<>' and `<>'. + +PORTABILITY +ANSI C requires <>; it suggests, but does not require, that +<> be implemented as a macro. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * A subroutine version of the macro getchar. + */ + +#include <_ansi.h> +#include +#include +#include "local.h" + +#undef getchar + +int +_getchar_r (struct _reent *reent) +{ + _REENT_SMALL_CHECK_INIT (reent); + return _getc_r (reent, _stdin_r (reent)); +} + +#ifndef _REENT_ONLY + +int +getchar (void) +{ + struct _reent *reent = _REENT; + + /* CHECK_INIT is called (eventually) by __srefill_r. */ + _REENT_SMALL_CHECK_INIT (reent); + return _getc_r (reent, _stdin_r (reent)); +} + +#endif diff --git a/lib/stdio/getchar_u.c b/lib/stdio/getchar_u.c new file mode 100644 index 0000000..f4ba0f9 --- /dev/null +++ b/lib/stdio/getchar_u.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---non-thread-safe version of getchar (macro) + +INDEX + getchar_unlocked +INDEX + _getchar_unlocked_r + +SYNOPSIS + #include + int getchar_unlocked(void); + + #include + int _getchar_unlocked_r(struct _reent *<[ptr]>); + +DESCRIPTION +<> is a non-thread-safe version of <> +declared in <>. <> may only safely be used +within a scope protected by flockfile() (or ftrylockfile()) and +funlockfile(). These functions may safely be used in a multi-threaded +program if and only if they are called while the invoking thread owns +the ( FILE *) object, as is the case after a successful call to the +flockfile() or ftrylockfile() functions. If threads are disabled, +then <> is equivalent to <>. + +The <<_getchar_unlocked_r>> function is simply the reentrant version of +<> which passes an addtional reentrancy structure pointer +argument: <[ptr]>. + +RETURNS +See <>. + +PORTABILITY +POSIX 1003.1 requires <>. <> may +be implemented as a macro. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * A subroutine version of the macro getchar_unlocked. + */ + +#include <_ansi.h> +#include +#include + +#undef getchar_unlocked + +int +_getchar_unlocked_r (struct _reent *ptr) +{ + return _getc_unlocked_r (ptr, _stdin_r (ptr)); +} + +#ifndef _REENT_ONLY + +int +getchar_unlocked (void) +{ + /* CHECK_INIT is called (eventually) by __srefill_r. */ + + return _getc_unlocked_r (_REENT, _stdin_r (_REENT)); +} + +#endif diff --git a/lib/stdio/getdelim.c b/lib/stdio/getdelim.c new file mode 100644 index 0000000..90cd5d4 --- /dev/null +++ b/lib/stdio/getdelim.c @@ -0,0 +1,133 @@ +/* Copyright 2002, Red Hat Inc. - all rights reserved */ +/* +FUNCTION +<>---read a line up to a specified line delimiter + +INDEX + getdelim + +SYNOPSIS + #include + int getdelim(char **<[bufptr]>, size_t *<[n]>, + int <[delim]>, FILE *<[fp]>); + +DESCRIPTION +<> reads a file <[fp]> up to and possibly including a specified +delimiter <[delim]>. The line is read into a buffer pointed to +by <[bufptr]> and designated with size *<[n]>. If the buffer is +not large enough, it will be dynamically grown by <>. +As the buffer is grown, the pointer to the size <[n]> will be +updated. + +RETURNS +<> returns <<-1>> if no characters were successfully read; +otherwise, it returns the number of bytes successfully read. +At end of file, the result is nonzero. + +PORTABILITY +<> is a glibc extension. + +No supporting OS subroutines are directly required. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#define MIN_LINE_SIZE 4 +#define DEFAULT_LINE_SIZE 128 + +ssize_t +__getdelim (char **bufptr, + size_t *n, + int delim, + FILE *fp) +{ + char *buf; + char *ptr; + size_t newsize, numbytes; + int pos; + int ch; + int cont; + + if (fp == NULL || bufptr == NULL || n == NULL) + { + errno = EINVAL; + return -1; + } + + buf = *bufptr; + if (buf == NULL || *n < MIN_LINE_SIZE) + { + buf = (char *)realloc (*bufptr, DEFAULT_LINE_SIZE); + if (buf == NULL) + { + return -1; + } + *bufptr = buf; + *n = DEFAULT_LINE_SIZE; + } + + CHECK_INIT (_REENT, fp); + + _newlib_flockfile_start (fp); + + numbytes = *n; + ptr = buf; + + cont = 1; + + while (cont) + { + /* fill buffer - leaving room for nul-terminator */ + while (--numbytes > 0) + { + if ((ch = getc_unlocked (fp)) == EOF) + { + cont = 0; + break; + } + else + { + *ptr++ = ch; + if (ch == delim) + { + cont = 0; + break; + } + } + } + + if (cont) + { + /* Buffer is too small so reallocate a larger buffer. */ + pos = ptr - buf; + newsize = (*n << 1); + buf = realloc (buf, newsize); + if (buf == NULL) + { + cont = 0; + break; + } + + /* After reallocating, continue in new buffer */ + *bufptr = buf; + *n = newsize; + ptr = buf + pos; + numbytes = newsize - pos; + } + } + + _newlib_flockfile_end (fp); + + /* if no input data, return failure */ + if (ptr == buf) + return -1; + + /* otherwise, nul-terminate and return number of bytes read */ + *ptr = '\0'; + return (ssize_t)(ptr - buf); +} + diff --git a/lib/stdio/getline.c b/lib/stdio/getline.c new file mode 100644 index 0000000..1c59afd --- /dev/null +++ b/lib/stdio/getline.c @@ -0,0 +1,46 @@ +/* Copyright 2002, Red Hat Inc. - all rights reserved */ +/* +FUNCTION +<>---read a line from a file + +INDEX + getline + +SYNOPSIS + #include + ssize_t getline(char **<[bufptr]>, size_t *<[n]>, FILE *<[fp]>); + +DESCRIPTION +<> reads a file <[fp]> up to and possibly including the +newline character. The line is read into a buffer pointed to +by <[bufptr]> and designated with size *<[n]>. If the buffer is +not large enough, it will be dynamically grown by <>. +As the buffer is grown, the pointer to the size <[n]> will be +updated. + +<> is equivalent to getdelim(bufptr, n, '\n', fp); + +RETURNS +<> returns <<-1>> if no characters were successfully read, +otherwise, it returns the number of bytes successfully read. +at end of file, the result is nonzero. + +PORTABILITY +<> is a glibc extension. + +No supporting OS subroutines are directly required. +*/ + +#include <_ansi.h> +#include + +extern ssize_t __getdelim (char **, size_t *, int, FILE *); + +ssize_t +__getline (char **lptr, + size_t *n, + FILE *fp) +{ + return __getdelim (lptr, n, '\n', fp); +} + diff --git a/lib/stdio/gets.c b/lib/stdio/gets.c new file mode 100644 index 0000000..82bfc57 --- /dev/null +++ b/lib/stdio/gets.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---get character string (obsolete, use <> instead) + +INDEX + gets +INDEX + _gets_r + +SYNOPSIS + #include + + char *gets(char *<[buf]>); + + char *_gets_r(struct _reent *<[reent]>, char *<[buf]>); + +DESCRIPTION + Reads characters from standard input until a newline is found. + The characters up to the newline are stored in <[buf]>. The + newline is discarded, and the buffer is terminated with a 0. + + This is a @emph{dangerous} function, as it has no way of checking + the amount of space available in <[buf]>. One of the attacks + used by the Internet Worm of 1988 used this to overrun a + buffer allocated on the stack of the finger daemon and + overwrite the return address, causing the daemon to execute + code downloaded into it over the connection. + + The alternate function <<_gets_r>> is a reentrant version. The extra + argument <[reent]> is a pointer to a reentrancy structure. + + +RETURNS + <> returns the buffer passed to it, with the data filled + in. If end of file occurs with some data already accumulated, + the data is returned with no other indication. If end of file + occurs with no data in the buffer, NULL is returned. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include "local.h" + +char * +_gets_r (struct _reent *ptr, + char *buf) +{ + register int c; + register char *s = buf; + FILE *fp; + + _REENT_SMALL_CHECK_INIT (ptr); + fp = _stdin_r (ptr); + CHECK_INIT (ptr, fp); + _newlib_flockfile_start (fp); + while ((c = __sgetc_r (ptr, fp)) != '\n') + if (c == EOF) + if (s == buf) + { + _newlib_flockfile_exit (fp); + return NULL; + } + else + break; + else + *s++ = c; + *s = 0; + _newlib_flockfile_end (fp); + return buf; +} + +#ifndef _REENT_ONLY + +char * +gets (char *buf) +{ + return _gets_r (_REENT, buf); +} + +#endif diff --git a/lib/stdio/getw.c b/lib/stdio/getw.c new file mode 100644 index 0000000..38ef778 --- /dev/null +++ b/lib/stdio/getw.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---read a word (int) + +INDEX + getw + +SYNOPSIS + #include + int getw(FILE *<[fp]>); + +DESCRIPTION +<> is a function, defined in <>. You can use <> +to get the next word from the file or stream identified by <[fp]>. As +a side effect, <> advances the file's current position +indicator. + +RETURNS +The next word (read as an <>), unless there is no more +data or the host system reports a read error; in either of these +situations, <> returns <>. Since <> is a valid +<>, you must use <> or <> to distinguish these +situations. + +PORTABILITY +<> is a remnant of K&R C; it is not part of any ISO C Standard. +<> should be used instead. In fact, this implementation of +<> is based upon <>. + +Supporting OS subroutines required: <>. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include + +int +getw (register FILE *fp) +{ + int result; + if (fread ((char*)&result, sizeof (result), 1, fp) != 1) + return EOF; + return result; +} diff --git a/lib/stdio/getwc.c b/lib/stdio/getwc.c new file mode 100644 index 0000000..15b3974 --- /dev/null +++ b/lib/stdio/getwc.c @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef getwc + +wint_t +_getwc_r (struct _reent *ptr, + FILE *fp) +{ + return _fgetwc_r (ptr, fp); +} + +/* + * Synonym for fgetwc(). The only difference is that getwc(), if it is a + * macro, may evaluate `fp' more than once. + */ +wint_t +getwc (FILE *fp) +{ + return fgetwc(fp); +} diff --git a/lib/stdio/getwc_u.c b/lib/stdio/getwc_u.c new file mode 100644 index 0000000..366ab0f --- /dev/null +++ b/lib/stdio/getwc_u.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef getwc_unlocked + +wint_t +_getwc_unlocked_r (struct _reent *ptr, + FILE *fp) +{ + return _fgetwc_unlocked_r (ptr, fp); +} + +/* + * Synonym for fgetwc_unlocked(). The only difference is that getwc(), if it is + * a macro, may evaluate `fp' more than once. + */ +wint_t +getwc_unlocked (FILE *fp) +{ + return fgetwc_unlocked(fp); +} diff --git a/lib/stdio/getwchar.c b/lib/stdio/getwchar.c new file mode 100644 index 0000000..1485392 --- /dev/null +++ b/lib/stdio/getwchar.c @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---read a wide character from standard input + +INDEX + getwchar +INDEX + getwchar_unlocked +INDEX + _getwchar_r +INDEX + _getwchar_unlocked_r + +SYNOPSIS + #include + wint_t getwchar(void); + + #define _GNU_SOURCE + #include + wint_t getwchar_unlocked(void); + + #include + wint_t _getwchar_r(struct _reent *<[reent]>); + + #include + wint_t _getwchar_unlocked_r(struct _reent *<[reent]>); + +DESCRIPTION +<> function or macro is the wide character equivalent of +the <> function. You can use <> to get the next +wide character from the standard input stream. As a side effect, +<> advances the standard input's current position indicator. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The alternate functions <<_getwchar_r>> and <<_getwchar_unlocked_r>> are +reentrant versions of the above. The extra argument <[reent]> is a pointer to +a reentrancy structure. + +RETURNS +The next wide character cast to <>, unless there is no more +data, or the host system reports a read error; in either of these +situations, <> returns <>. + +You can distinguish the two situations that cause an <> result by +using `<>' and `<>'. + +PORTABILITY +<> is required by C99. + +<> is a GNU extension. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef getwchar + +wint_t +_getwchar_r (struct _reent *ptr) +{ + return _fgetwc_r (ptr, stdin); +} + +/* + * Synonym for fgetwc(stdin). + */ +wint_t +getwchar (void) +{ + _REENT_SMALL_CHECK_INIT (_REENT); + return fgetwc (stdin); +} diff --git a/lib/stdio/getwchar_u.c b/lib/stdio/getwchar_u.c new file mode 100644 index 0000000..c1f8d2d --- /dev/null +++ b/lib/stdio/getwchar_u.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef getwchar_unlocked + +wint_t +_getwchar_unlocked_r (struct _reent *ptr) +{ + return _fgetwc_unlocked_r (ptr, stdin); +} + +/* + * Synonym for fgetwc_unlocked(stdin). + */ +wint_t +getwchar_unlocked (void) +{ + _REENT_SMALL_CHECK_INIT (_REENT); + return fgetwc_unlocked (stdin); +} diff --git a/lib/stdio/iprintf.c b/lib/stdio/iprintf.c new file mode 100644 index 0000000..7e32eda --- /dev/null +++ b/lib/stdio/iprintf.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in siprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +iprintf (const char *fmt, ...) +{ + int ret; + va_list ap; + struct _reent *ptr = _REENT; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfiprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} + +#endif /* ! _REENT_ONLY */ + +int +_iprintf_r (struct _reent *ptr, + const char *fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfiprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} diff --git a/lib/stdio/iscanf.c b/lib/stdio/iscanf.c new file mode 100644 index 0000000..35c3899 --- /dev/null +++ b/lib/stdio/iscanf.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +iscanf(const char *fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (_REENT); + va_start (ap, fmt); + ret = __svfiscanf_r (_REENT, _stdin_r (_REENT), fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_iscanf_r(struct _reent *ptr, const char *fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = __svfiscanf_r (ptr, _stdin_r (ptr), fmt, ap); + va_end (ap); + return (ret); +} + diff --git a/lib/stdio/local.h b/lib/stdio/local.h new file mode 100644 index 0000000..b34c7c9 --- /dev/null +++ b/lib/stdio/local.h @@ -0,0 +1,321 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * %W% (UofMD/Berkeley) %G% + */ + +/* + * Information local to this implementation of stdio, + * in particular, macros and private variables. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#ifdef __SCLE +# include +#endif + +/* The following define determines if the per-reent stdin, stdout and stderr + streams are closed during _reclaim_reent(). The stdin, stdout and stderr + streams are initialized to use file descriptors 0, 1 and 2 respectively. In + case _STDIO_CLOSE_PER_REENT_STD_STREAMS is defined these file descriptors + will be closed via close() provided the owner of the reent structure + triggerd the on demand reent initilization, see CHECK_INIT(). */ +#if !defined(__tirtos__) +#define _STDIO_CLOSE_PER_REENT_STD_STREAMS +#endif + +/* The following macros are supposed to replace calls to _flockfile/_funlockfile + and __sfp_lock_acquire/__sfp_lock_release. In case of multi-threaded + environments using pthreads, it's not sufficient to lock the stdio functions + against concurrent threads accessing the same data, the locking must also be + secured against thread cancellation. + + The below macros have to be used in pairs. The _newlib_XXX_start macro + starts with a opening curly brace, the _newlib_XXX_end macro ends with a + closing curly brace, so the start macro and the end macro mark the code + start and end of a critical section. In case the code leaves the critical + section before reaching the end of the critical section's code end, use + the appropriate _newlib_XXX_exit macro. */ + +#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS) \ + && !defined (__rtems__) +#define _STDIO_WITH_THREAD_CANCELLATION_SUPPORT +#endif + +#if defined(__SINGLE_THREAD__) || defined(__IMPL_UNLOCKED__) + +# define _newlib_flockfile_start(_fp) +# define _newlib_flockfile_exit(_fp) +# define _newlib_flockfile_end(_fp) +# define _newlib_sfp_lock_start() +# define _newlib_sfp_lock_exit() +# define _newlib_sfp_lock_end() + +#elif defined(_STDIO_WITH_THREAD_CANCELLATION_SUPPORT) +#include + +/* Start a stream oriented critical section: */ +# define _newlib_flockfile_start(_fp) \ + { \ + int __oldfpcancel; \ + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldfpcancel); \ + if (!(_fp->_flags2 & __SNLK)) \ + _flockfile (_fp) + +/* Exit from a stream oriented critical section prematurely: */ +# define _newlib_flockfile_exit(_fp) \ + if (!(_fp->_flags2 & __SNLK)) \ + _funlockfile (_fp); \ + pthread_setcancelstate (__oldfpcancel, &__oldfpcancel); + +/* End a stream oriented critical section: */ +# define _newlib_flockfile_end(_fp) \ + if (!(_fp->_flags2 & __SNLK)) \ + _funlockfile (_fp); \ + pthread_setcancelstate (__oldfpcancel, &__oldfpcancel); \ + } + +/* Start a stream list oriented critical section: */ +# define _newlib_sfp_lock_start() \ + { \ + int __oldsfpcancel; \ + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldsfpcancel); \ + __sfp_lock_acquire () + +/* Exit from a stream list oriented critical section prematurely: */ +# define _newlib_sfp_lock_exit() \ + __sfp_lock_release (); \ + pthread_setcancelstate (__oldsfpcancel, &__oldsfpcancel); + +/* End a stream list oriented critical section: */ +# define _newlib_sfp_lock_end() \ + __sfp_lock_release (); \ + pthread_setcancelstate (__oldsfpcancel, &__oldsfpcancel); \ + } + +#else /* !__SINGLE_THREAD__ && !__IMPL_UNLOCKED__ && !_STDIO_WITH_THREAD_CANCELLATION_SUPPORT */ + +# define _newlib_flockfile_start(_fp) \ + { \ + if (!(_fp->_flags2 & __SNLK)) \ + _flockfile (_fp) + +# define _newlib_flockfile_exit(_fp) \ + if (!(_fp->_flags2 & __SNLK)) \ + _funlockfile(_fp); \ + +# define _newlib_flockfile_end(_fp) \ + if (!(_fp->_flags2 & __SNLK)) \ + _funlockfile(_fp); \ + } + +# define _newlib_sfp_lock_start() \ + { \ + __sfp_lock_acquire () + +# define _newlib_sfp_lock_exit() \ + __sfp_lock_release (); + +# define _newlib_sfp_lock_end() \ + __sfp_lock_release (); \ + } + +#endif /* __SINGLE_THREAD__ || __IMPL_UNLOCKED__ */ + +extern wint_t __fgetwc (struct _reent *, FILE *); +extern wint_t __fputwc (struct _reent *, wchar_t, FILE *); +extern u_char *__sccl (char *, u_char *fmt); +extern int __svfscanf_r (struct _reent *,FILE *, const char *,va_list); +extern int __ssvfscanf_r (struct _reent *,FILE *, const char *,va_list); +extern int __svfiscanf_r (struct _reent *,FILE *, const char *,va_list); +extern int __ssvfiscanf_r (struct _reent *,FILE *, const char *,va_list); +extern int __svfwscanf_r (struct _reent *,FILE *, const wchar_t *,va_list); +extern int __ssvfwscanf_r (struct _reent *,FILE *, const wchar_t *,va_list); +extern int __svfiwscanf_r (struct _reent *,FILE *, const wchar_t *,va_list); +extern int __ssvfiwscanf_r (struct _reent *,FILE *, const wchar_t *,va_list); +int _svfprintf_r (struct _reent *, FILE *, const char *, + va_list) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _svfiprintf_r (struct _reent *, FILE *, const char *, + va_list) + _ATTRIBUTE ((__format__ (__printf__, 3, 0))); +int _svfwprintf_r (struct _reent *, FILE *, const wchar_t *, + va_list); +int _svfiwprintf_r (struct _reent *, FILE *, const wchar_t *, + va_list); +extern FILE *__sfp (struct _reent *); +extern int __sflags (struct _reent *,const char*, int*); +extern int __sflush_r (struct _reent *,FILE *); +#ifdef _STDIO_BSD_SEMANTICS +extern int __sflushw_r (struct _reent *,FILE *); +#endif +extern int __srefill_r (struct _reent *,FILE *); +extern _READ_WRITE_RETURN_TYPE __sread (struct _reent *, void *, char *, + _READ_WRITE_BUFSIZE_TYPE); +extern _READ_WRITE_RETURN_TYPE __seofread (struct _reent *, void *, + char *, + _READ_WRITE_BUFSIZE_TYPE); +extern _READ_WRITE_RETURN_TYPE __swrite (struct _reent *, void *, + const char *, + _READ_WRITE_BUFSIZE_TYPE); +extern _fpos_t __sseek (struct _reent *, void *, _fpos_t, int); +extern int __sclose (struct _reent *, void *); +extern int __stextmode (int); +extern void __sinit (struct _reent *); +extern void __smakebuf_r (struct _reent *, FILE *); +extern int __swhatbuf_r (struct _reent *, FILE *, size_t *, int *); +extern int __submore (struct _reent *, FILE *); + +#ifdef __LARGE64_FILES +extern _fpos64_t __sseek64 (struct _reent *, void *, _fpos64_t, int); +extern _READ_WRITE_RETURN_TYPE __swrite64 (struct _reent *, void *, + const char *, + _READ_WRITE_BUFSIZE_TYPE); +#endif + +/* Called by the main entry point fns to ensure stdio has been initialized. */ + +#define CHECK_INIT(ptr, fp) \ + do \ + { \ + struct _reent *_check_init_ptr = (ptr); \ + if (!_REENT_IS_NULL(_check_init_ptr) && \ + !_REENT_CLEANUP(_check_init_ptr)) \ + __sinit (_check_init_ptr); \ + } \ + while (0) + +/* Return true and set errno and stream error flag iff the given FILE + cannot be written now. */ + +#define cantwrite(ptr, fp) \ + ((((fp)->_flags & __SWR) == 0 || (fp)->_bf._base == NULL) && \ + __swsetup_r(ptr, fp)) + +/* Test whether the given stdio file has an active ungetc buffer; + release such a buffer, without restoring ordinary unread data. */ + +#define HASUB(fp) ((fp)->_ub._base != NULL) +#define FREEUB(ptr, fp) { \ + if ((fp)->_ub._base != (fp)->_ubuf) \ + _free_r(ptr, (char *)(fp)->_ub._base); \ + (fp)->_ub._base = NULL; \ +} + +/* Test for an fgetline() buffer. */ + +#define HASLB(fp) ((fp)->_lb._base != NULL) +#define FREELB(ptr, fp) { _free_r(ptr,(char *)(fp)->_lb._base); \ + (fp)->_lb._base = NULL; } + +#ifdef _WIDE_ORIENT +/* + * Set the orientation for a stream. If o > 0, the stream has wide- + * orientation. If o < 0, the stream has byte-orientation. + */ +#define ORIENT(fp,ori) \ + do \ + { \ + if (!((fp)->_flags & __SORD)) \ + { \ + (fp)->_flags |= __SORD; \ + if (ori > 0) \ + (fp)->_flags2 |= __SWID; \ + else \ + (fp)->_flags2 &= ~__SWID; \ + } \ + } \ + while (0) +#else +#define ORIENT(fp,ori) +#endif + +/* WARNING: _dcvt is defined in the stdlib directory, not here! */ + +char *_dcvt (struct _reent *, char *, double, int, int, char, int); +char *_sicvt (char *, short, char); +char *_icvt (char *, int, char); +char *_licvt (char *, long, char); +#ifdef __GNUC__ +char *_llicvt (char *, long long, char); +#endif + +#define CVT_BUF_SIZE 128 + +#define NDYNAMIC 4 /* add four more whenever necessary */ + +#ifdef __SINGLE_THREAD__ +#define __sfp_lock_acquire() +#define __sfp_lock_release() +#define __sinit_lock_acquire() +#define __sinit_lock_release() +#else +void __sfp_lock_acquire (void); +void __sfp_lock_release (void); +#endif + +/* Types used in positional argument support in vfprinf/vfwprintf. + The implementation is char/wchar_t dependent but the class and state + tables are only defined once in vfprintf.c. */ +typedef enum __packed { + ZERO, /* '0' */ + DIGIT, /* '1-9' */ + DOLLAR, /* '$' */ + MODFR, /* spec modifier */ + SPEC, /* format specifier */ + DOT, /* '.' */ + STAR, /* '*' */ + FLAG, /* format flag */ + OTHER, /* all other chars */ + MAX_CH_CLASS /* place-holder */ +} __CH_CLASS; + +typedef enum __packed { + START, /* start */ + SFLAG, /* seen a flag */ + WDIG, /* seen digits in width area */ + WIDTH, /* processed width */ + SMOD, /* seen spec modifier */ + SDOT, /* seen dot */ + VARW, /* have variable width specifier */ + VARP, /* have variable precision specifier */ + PREC, /* processed precision */ + VWDIG, /* have digits in variable width specification */ + VPDIG, /* have digits in variable precision specification */ + DONE, /* done */ + MAX_STATE, /* place-holder */ +} __STATE; + +typedef enum __packed { + NOOP, /* do nothing */ + NUMBER, /* build a number from digits */ + SKIPNUM, /* skip over digits */ + GETMOD, /* get and process format modifier */ + GETARG, /* get and process argument */ + GETPW, /* get variable precision or width */ + GETPWB, /* get variable precision or width and pushback fmt char */ + GETPOS, /* get positional parameter value */ + PWPOS, /* get positional parameter value for variable width or precision */ +} __ACTION; + +extern const __CH_CLASS __chclass[256]; +extern const __STATE __state_table[MAX_STATE][MAX_CH_CLASS]; +extern const __ACTION __action_table[MAX_STATE][MAX_CH_CLASS]; diff --git a/lib/stdio/makebuf.c b/lib/stdio/makebuf.c new file mode 100644 index 0000000..b9c75bb --- /dev/null +++ b/lib/stdio/makebuf.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +#define _DEFAULT_ASPRINTF_BUFSIZE 64 + +/* + * Allocate a file buffer, or switch to unbuffered I/O. + * Per the ANSI C standard, ALL tty devices default to line buffered. + * + * As a side effect, we set __SOPT or __SNPT (en/dis-able fseek + * optimization) right after the _fstat() that finds the buffer size. + */ + +void +__smakebuf_r (struct _reent *ptr, + register FILE *fp) +{ + register void *p; + int flags; + size_t size; + int couldbetty; + + if (fp->_flags & __SNBF) + { + fp->_bf._base = fp->_p = fp->_nbuf; + fp->_bf._size = 1; + return; + } + flags = __swhatbuf_r (ptr, fp, &size, &couldbetty); + if ((p = _malloc_r (ptr, size)) == NULL) + { + if (!(fp->_flags & __SSTR)) + { + fp->_flags = (fp->_flags & ~__SLBF) | __SNBF; + fp->_bf._base = fp->_p = fp->_nbuf; + fp->_bf._size = 1; + } + } + else + { + fp->_flags |= __SMBF; + fp->_bf._base = fp->_p = (unsigned char *) p; + fp->_bf._size = size; + if (couldbetty && _isatty_r (ptr, fp->_file)) + fp->_flags = (fp->_flags & ~__SNBF) | __SLBF; + fp->_flags |= flags; + } +} + +/* + * Internal routine to determine `proper' buffering for a file. + */ +int +__swhatbuf_r (struct _reent *ptr, + FILE *fp, + size_t *bufsize, + int *couldbetty) +{ +#ifdef _FSEEK_OPTIMIZATION + const int snpt = __SNPT; +#else + const int snpt = 0; +#endif + +#ifdef __USE_INTERNAL_STAT64 + struct stat64 st; + + if (fp->_file < 0 || _fstat64_r (ptr, fp->_file, &st) < 0) +#else + struct stat st; + + if (fp->_file < 0 || _fstat_r (ptr, fp->_file, &st) < 0) +#endif + { + *couldbetty = 0; + /* Check if we are be called by asprintf family for initial buffer. */ + if (fp->_flags & __SMBF) + *bufsize = _DEFAULT_ASPRINTF_BUFSIZE; + else + *bufsize = BUFSIZ; + return (0); + } + + /* could be a tty iff it is a character device */ + *couldbetty = S_ISCHR(st.st_mode); +#ifdef HAVE_BLKSIZE + if (st.st_blksize > 0) + { + /* + * Optimise fseek() only if it is a regular file. (The test for + * __sseek is mainly paranoia.) It is safe to set _blksize + * unconditionally; it will only be used if __SOPT is also set. + */ + *bufsize = st.st_blksize; + fp->_blksize = st.st_blksize; + return ((st.st_mode & S_IFMT) == S_IFREG ? __SOPT : snpt); + } +#endif + *bufsize = BUFSIZ; + return (snpt); +} diff --git a/lib/stdio/mktemp.c b/lib/stdio/mktemp.c new file mode 100644 index 0000000..2659681 --- /dev/null +++ b/lib/stdio/mktemp.c @@ -0,0 +1,371 @@ +/* + * Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This is file MKTEMP.C */ +/* This file may have been modified by DJ Delorie (Jan 1991). If so, +** these modifications are Copyright (C) 1991 DJ Delorie. +*/ + +/* +FUNCTION +<>, <>, <>, <>, +<>---generate unused file name +<>---generate unused directory + +INDEX + mktemp +INDEX + mkdtemp +INDEX + mkstemp +INDEX + mkstemps +INDEX + mkostemp +INDEX + mkostemps +INDEX + _mktemp_r +INDEX + _mkdtemp_r +INDEX + _mkstemp_r +INDEX + _mkstemps_r +INDEX + _mkostemp_r +INDEX + _mkostemps_r + +SYNOPSIS + #include + char *mktemp(char *<[path]>); + char *mkdtemp(char *<[path]>); + int mkstemp(char *<[path]>); + int mkstemps(char *<[path]>, int <[suffixlen]>); + int mkostemp(char *<[path]>, int <[flags]>); + int mkostemps(char *<[path]>, int <[suffixlen]>, int <[flags]>); + + char *_mktemp_r(struct _reent *<[reent]>, char *<[path]>); + char *_mkdtemp_r(struct _reent *<[reent]>, char *<[path]>); + int *_mkstemp_r(struct _reent *<[reent]>, char *<[path]>); + int *_mkstemps_r(struct _reent *<[reent]>, char *<[path]>, int <[len]>); + int *_mkostemp_r(struct _reent *<[reent]>, char *<[path]>, + int <[flags]>); + int *_mkostemps_r(struct _reent *<[reent]>, char *<[path]>, int <[len]>, + int <[flags]>); + +DESCRIPTION +<>, <>, and <> attempt to generate a file name +that is not yet in use for any existing file. <> and <> +create the file and open it for reading and writing; <> simply +generates the file name (making <> a security risk). <> +and <> allow the addition of other <> flags, such +as <>, <>, or <>. On platforms with a +separate text mode, <> forces <>, while <> +allows the choice between <>, <>, or 0 for default. +<> attempts to create a directory instead of a file, with a +permissions mask of 0700. + +You supply a simple pattern for the generated file name, as the string +at <[path]>. The pattern should be a valid filename (including path +information if you wish) ending with at least six `<>' +characters. The generated filename will match the leading part of the +name you supply, with the trailing `<>' characters replaced by some +combination of digits and letters. With <>, the `<>' +characters end <[suffixlen]> bytes before the end of the string. + +The alternate functions <<_mktemp_r>>, <<_mkdtemp_r>>, <<_mkstemp_r>>, +<<_mkostemp_r>>, <<_mkostemps_r>>, and <<_mkstemps_r>> are reentrant +versions. The extra argument <[reent]> is a pointer to a reentrancy +structure. + +RETURNS +<> returns the pointer <[path]> to the modified string +representing an unused filename, unless it could not generate one, or +the pattern you provided is not suitable for a filename; in that case, +it returns <>. Be aware that there is an inherent race between +generating the name and attempting to create a file by that name; +you are advised to use <>. + +<> returns the pointer <[path]> to the modified string if the +directory was created, otherwise it returns <>. + +<>, <>, <>, and <> return a file +descriptor to the newly created file, unless it could not generate an +unused filename, or the pattern you provided is not suitable for a +filename; in that case, it returns <<-1>>. + +NOTES +Never use <>. The generated filenames are easy to guess and +there's a race between the test if the file exists and the creation +of the file. In combination this makes <> prone to attacks +and using it is a security risk. Whenever possible use <> +instead. It doesn't suffer the race condition. + +PORTABILITY +ANSI C does not require either <> or <>; the System +V Interface Definition requires <> as of Issue 2. POSIX 2001 +requires <>, and POSIX 2008 requires <> while +deprecating <>. <>, <>, and <> +are not standardized. + +Supporting OS subroutines required: <>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include + +static int +_gettemp (struct _reent *ptr, + char *path, + register int *doopen, + int domkdir, + size_t suffixlen, + int flags) +{ + register char *start, *trv; + char *end; +#ifdef __USE_INTERNAL_STAT64 + struct stat64 sbuf; +#else + struct stat sbuf; +#endif + unsigned int pid; + + pid = _getpid_r (ptr); + for (trv = path; *trv; ++trv) /* extra X's get set to 0's */ + continue; + if (trv - path < suffixlen) + { + _REENT_ERRNO(ptr) = EINVAL; + return 0; + } + trv -= suffixlen; + end = trv; + while (path < trv && *--trv == 'X') + { + *trv = (pid % 10) + '0'; + pid /= 10; + } + if (end - trv < 6) + { + _REENT_ERRNO(ptr) = EINVAL; + return 0; + } + + /* + * Check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + + for (start = trv + 1;; --trv) + { + if (trv <= path) + break; + if (*trv == '/') + { + *trv = '\0'; +#ifdef __USE_INTERNAL_STAT64 + if (_stat64_r (ptr, path, &sbuf)) +#else + if (_stat_r (ptr, path, &sbuf)) +#endif + return (0); + if (!(sbuf.st_mode & S_IFDIR)) + { + _REENT_ERRNO(ptr) = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) + { +#if !defined _ELIX_LEVEL || _ELIX_LEVEL >= 4 + if (domkdir) + { +#ifdef HAVE_MKDIR + if (_mkdir_r (ptr, path, 0700) == 0) + return 1; + if (_REENT_ERRNO(ptr) != EEXIST) + return 0; +#else /* !HAVE_MKDIR */ + _REENT_ERRNO(ptr) = ENOSYS; + return 0; +#endif /* !HAVE_MKDIR */ + } + else +#endif /* _ELIX_LEVEL */ + if (doopen) + { + if ((*doopen = _open_r (ptr, path, O_CREAT | O_EXCL | O_RDWR | flags, + 0600)) >= 0) + return 1; + if (_REENT_ERRNO(ptr) != EEXIST) + return 0; + } +#ifdef __USE_INTERNAL_STAT64 + else if (_stat64_r (ptr, path, &sbuf)) +#else + else if (_stat_r (ptr, path, &sbuf)) +#endif + return (_REENT_ERRNO(ptr) == ENOENT ? 1 : 0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) + { + if (trv == end) + return 0; + if (*trv == 'z') + *trv++ = 'a'; + else + { + /* Safe, since it only encounters 7-bit characters. */ + if (isdigit ((unsigned char) *trv)) + *trv = 'a'; + else + ++ * trv; + break; + } + } + } + /*NOTREACHED*/ +} + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +int +_mkstemp_r (struct _reent *ptr, + char *path) +{ + int fd; + + return (_gettemp (ptr, path, &fd, 0, 0, O_BINARY) ? fd : -1); +} + +#if !defined _ELIX_LEVEL || _ELIX_LEVEL >= 4 +char * +_mkdtemp_r (struct _reent *ptr, + char *path) +{ + return (_gettemp (ptr, path, (int *) NULL, 1, 0, 0) ? path : NULL); +} + +int +_mkstemps_r (struct _reent *ptr, + char *path, + int len) +{ + int fd; + + return (_gettemp (ptr, path, &fd, 0, len, O_BINARY) ? fd : -1); +} + +int +_mkostemp_r (struct _reent *ptr, + char *path, + int flags) +{ + int fd; + + return (_gettemp (ptr, path, &fd, 0, 0, flags & ~O_ACCMODE) ? fd : -1); +} + +int +_mkostemps_r (struct _reent *ptr, + char *path, + int len, + int flags) +{ + int fd; + + return (_gettemp (ptr, path, &fd, 0, len, flags & ~O_ACCMODE) ? fd : -1); +} +#endif /* _ELIX_LEVEL */ + +char * +_mktemp_r (struct _reent *ptr, + char *path) +{ + return (_gettemp (ptr, path, (int *) NULL, 0, 0, 0) ? path : (char *) NULL); +} + +#ifndef _REENT_ONLY + +int +mkstemp (char *path) +{ + int fd; + + return (_gettemp (_REENT, path, &fd, 0, 0, O_BINARY) ? fd : -1); +} + +# if !defined _ELIX_LEVEL || _ELIX_LEVEL >= 4 +char * +mkdtemp (char *path) +{ + return (_gettemp (_REENT, path, (int *) NULL, 1, 0, 0) ? path : NULL); +} + +int +mkstemps (char *path, + int len) +{ + int fd; + + return (_gettemp (_REENT, path, &fd, 0, len, O_BINARY) ? fd : -1); +} + +int +mkostemp (char *path, + int flags) +{ + int fd; + + return (_gettemp (_REENT, path, &fd, 0, 0, flags & ~O_ACCMODE) ? fd : -1); +} + +int +mkostemps (char *path, + int len, + int flags) +{ + int fd; + + return (_gettemp (_REENT, path, &fd, 0, len, flags & ~O_ACCMODE) ? fd : -1); +} +# endif /* _ELIX_LEVEL */ + +char * +mktemp (char *path) +{ + return (_gettemp (_REENT, path, (int *) NULL, 0, 0, 0) ? path : (char *) NULL); +} + +#endif /* ! defined (_REENT_ONLY) */ diff --git a/lib/stdio/nano-svfprintf.c b/lib/stdio/nano-svfprintf.c new file mode 100644 index 0000000..6d2daef --- /dev/null +++ b/lib/stdio/nano-svfprintf.c @@ -0,0 +1,2 @@ +#define STRING_ONLY +#include "nano-vfprintf.c" diff --git a/lib/stdio/nano-svfscanf.c b/lib/stdio/nano-svfscanf.c new file mode 100644 index 0000000..8fe4d9b --- /dev/null +++ b/lib/stdio/nano-svfscanf.c @@ -0,0 +1,2 @@ +#define STRING_ONLY +#include "nano-vfscanf.c" diff --git a/lib/stdio/nano-vfprintf.c b/lib/stdio/nano-vfprintf.c new file mode 100644 index 0000000..0d42a94 --- /dev/null +++ b/lib/stdio/nano-vfprintf.c @@ -0,0 +1,661 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>, <>, <>, <>---format argument list + +INDEX + vfprintf +INDEX + _vfprintf_r +INDEX + vprintf +INDEX + _vprintf_r +INDEX + vsprintf +INDEX + _vsprintf_r +INDEX + vsnprintf +INDEX + _vsnprintf_r +INDEX + vasprintf +INDEX + _vasprintf_r +INDEX + vasnprintf +INDEX + _vasnprintf_r + +SYNOPSIS + #include + #include + int vprintf(const char *<[fmt]>, va_list <[list]>); + int vfprintf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsprintf(char *<[str]>, const char *<[fmt]>, va_list <[list]>); + int vsnprintf(char *<[str]>, size_t <[size]>, const char *<[fmt]>, + va_list <[list]>); + int vasprintf(char **<[strp]>, const char *<[fmt]>, va_list <[list]>); + char *vasnprintf(char *<[str]>, size_t *<[size]>, const char *<[fmt]>, + va_list <[list]>); + + int _vprintf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfprintf_r(struct _reent *<[reent]>, FILE *<[fp]>, + const char *<[fmt]>, va_list <[list]>); + int _vsprintf_r(struct _reent *<[reent]>, char *<[str]>, + const char *<[fmt]>, va_list <[list]>); + int _vasprintf_r(struct _reent *<[reent]>, char **<[str]>, + const char *<[fmt]>, va_list <[list]>); + int _vsnprintf_r(struct _reent *<[reent]>, char *<[str]>, + size_t <[size]>, const char *<[fmt]>, va_list <[list]>); + char *_vasnprintf_r(struct _reent *<[reent]>, char *<[str]>, + size_t *<[size]>, const char *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, <>, <>, <>, +and <> are (respectively) variants of <>, +<>, <>, <>, <>, and +<>. They differ only in allowing their caller to pass the +variable argument list as a <> object (initialized by +<>) rather than directly accepting a variable number of +arguments. The caller is responsible for calling <>. + +<<_vprintf_r>>, <<_vfprintf_r>>, <<_vasprintf_r>>, <<_vsprintf_r>>, +<<_vsnprintf_r>>, and <<_vasnprintf_r>> are reentrant versions of the +above. + +RETURNS +The return values are consistent with the corresponding functions. + +PORTABILITY +ANSI C requires <>, <>, <>, and +<>. The remaining functions are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +/*static char *sccsid = "from: @(#)vfprintf.c 5.50 (Berkeley) 12/16/92";*/ +static char *rcsid = "$Id$"; +#endif /* LIBC_SCCS and not lint */ + +/* Actual printf innards. + This code is large and complicated... */ +#include + +#define VFPRINTF vfprintf +#ifdef STRING_ONLY +# define _VFPRINTF_R _svfprintf_r +#else +# define _VFPRINTF_R _vfprintf_r +#endif + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" +#include "fvwrite.h" +#include "vfieeefp.h" +#include "nano-vfprintf_local.h" + +/* The __ssputs_r function is shared between all versions of vfprintf + and vfwprintf. */ +#ifdef STRING_ONLY +int +__ssputs_r (struct _reent *ptr, + FILE *fp, + const char *buf, + size_t len) +{ + register int w; + + w = fp->_w; + if (len >= w && fp->_flags & (__SMBF | __SOPT)) + { + /* Must be asprintf family. */ + unsigned char *str; + int curpos = (fp->_p - fp->_bf._base); + /* Choose a geometric growth factor to avoid + * quadratic realloc behavior, but use a rate less + * than (1+sqrt(5))/2 to accomodate malloc + * overhead. asprintf EXPECTS us to overallocate, so + * that it can add a trailing \0 without + * reallocating. The new allocation should thus be + * max(prev_size*1.5, curpos+len+1). */ + int newsize = fp->_bf._size * 3 / 2; + if (newsize < curpos + len + 1) + newsize = curpos + len + 1; + if (fp->_flags & __SOPT) + { + /* asnprintf leaves original buffer alone. */ + str = (unsigned char *)_malloc_r (ptr, newsize); + if (!str) + { + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + memcpy (str, fp->_bf._base, curpos); + fp->_flags = (fp->_flags & ~__SOPT) | __SMBF; + } + else + { + str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, newsize); + if (!str) + { + /* Free unneeded buffer. */ + _free_r (ptr, fp->_bf._base); + /* Ensure correct errno, even if free changed it. */ + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + } + fp->_bf._base = str; + fp->_p = str + curpos; + fp->_bf._size = newsize; + w = len; + fp->_w = newsize - curpos; + } + if (len < w) + w = len; + + (void)memmove ((void *) fp->_p, (void *) buf, (size_t) (w)); + fp->_w -= w; + fp->_p += w; + return 0; + +err: + fp->_flags |= __SERR; + return EOF; +} +/* __ssprint_r is the original implementation of __SPRINT. In nano + version formatted IO it is reimplemented as __ssputs_r for non-wide + char output, but __ssprint_r cannot be discarded because it is used + by a serial of functions like svfwprintf for wide char output. */ +int +__ssprint_r (struct _reent *ptr, + FILE *fp, + register struct __suio *uio) +{ + register size_t len; + register int w; + register struct __siov *iov; + register const char *p = NULL; + + iov = uio->uio_iov; + len = 0; + + if (uio->uio_resid == 0) + { + uio->uio_iovcnt = 0; + return (0); + } + + do + { + while (len == 0) + { + p = iov->iov_base; + len = iov->iov_len; + iov++; + } + w = fp->_w; + if (len >= w && fp->_flags & (__SMBF | __SOPT)) + { + /* Must be asprintf family. */ + unsigned char *str; + int curpos = (fp->_p - fp->_bf._base); + /* Choose a geometric growth factor to avoid + * quadratic realloc behavior, but use a rate less + * than (1+sqrt(5))/2 to accomodate malloc + * overhead. asprintf EXPECTS us to overallocate, so + * that it can add a trailing \0 without + * reallocating. The new allocation should thus be + * max(prev_size*1.5, curpos+len+1). */ + int newsize = fp->_bf._size * 3 / 2; + if (newsize < curpos + len + 1) + newsize = curpos + len + 1; + + if (fp->_flags & __SOPT) + { + /* asnprintf leaves original buffer alone. */ + str = (unsigned char *)_malloc_r (ptr, newsize); + if (!str) + { + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + memcpy (str, fp->_bf._base, curpos); + fp->_flags = (fp->_flags & ~__SOPT) | __SMBF; + } + else + { + str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, + newsize); + if (!str) + { + /* Free unneeded buffer. */ + _free_r (ptr, fp->_bf._base); + /* Ensure correct errno, even if free changed it. */ + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + } + fp->_bf._base = str; + fp->_p = str + curpos; + fp->_bf._size = newsize; + w = len; + fp->_w = newsize - curpos; + } + if (len < w) + w = len; + + (void)memmove ((void *) fp->_p, (void *) p, (size_t) (w)); + fp->_w -= w; + fp->_p += w; + /* Pretend we copied all. */ + w = len; + p += w; + len -= w; + } + while ((uio->uio_resid -= w) != 0); + + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return 0; + +err: + fp->_flags |= __SERR; + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return EOF; +} +#else +/* As __ssputs_r, __sprint_r is used by output functions for wide char, + like vfwprint. */ +/* Flush out all the vectors defined by the given uio, + then reset it so that it can be reused. */ +int +__sprint_r (struct _reent *ptr, + FILE *fp, + register struct __suio *uio) +{ + register int err = 0; + + if (uio->uio_resid == 0) + { + uio->uio_iovcnt = 0; + return 0; + } +#if defined _WIDE_ORIENT && (!defined _ELIX_LEVEL || _ELIX_LEVEL >= 4) + if (fp->_flags2 & __SWID) + { + struct __siov *iov; + wchar_t *p; + int i, len; + + iov = uio->uio_iov; + for (; uio->uio_resid != 0; + uio->uio_resid -= len * sizeof (wchar_t), iov++) + { + p = (wchar_t *) iov->iov_base; + len = iov->iov_len / sizeof (wchar_t); + for (i = 0; i < len; i++) + { + if (_fputwc_r (ptr, p[i], fp) == WEOF) + { + err = -1; + goto out; + } + } + } + } + else +#endif + err = __sfvwrite_r(ptr, fp, uio); +out: + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return err; +} + +_NOINLINE_STATIC int +__sfputc_r (struct _reent *ptr, + int c, + FILE *fp) +{ + if (--fp->_w >= 0 || (fp->_w >= fp->_lbfsize && (char)c != '\n')) + return (*fp->_p++ = c); + else + return (__swbuf_r(ptr, c, fp)); +} + +int +__sfputs_r (struct _reent *ptr, + FILE *fp, + const char *buf, + size_t len) +{ + register int i; + +#if defined _WIDE_ORIENT && (!defined _ELIX_LEVEL || _ELIX_LEVEL >= 4) + if (fp->_flags2 & __SWID) + { + wchar_t *p; + + p = (wchar_t *) buf; + for (i = 0; i < (len / sizeof (wchar_t)); i++) + { + if (_fputwc_r (ptr, p[i], fp) == WEOF) + return -1; + } + } + else +#endif + { + for (i = 0; i < len; i++) + { + /* Call __sfputc_r to skip _fputc_r. */ + if (__sfputc_r (ptr, (int)buf[i], fp) == EOF) + return -1; + } + } + return (0); +} +#endif /* STRING_ONLY. */ + +int _VFPRINTF_R (struct _reent *, FILE *, const char *, va_list); + +#ifndef STRING_ONLY +int +VFPRINTF (FILE * fp, + const char *fmt0, + va_list ap) +{ + int result; + result = _VFPRINTF_R (_REENT, fp, fmt0, ap); + return result; +} + +int +vfiprintf (FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vfprintf"))); +#endif + +#ifdef STRING_ONLY +# define __SPRINT __ssputs_r +#else +# define __SPRINT __sfputs_r +#endif + +/* Do not need FLUSH for all sprintf functions. */ +#ifdef STRING_ONLY +# define FLUSH() +#else +# define FLUSH() +#endif + +int +_VFPRINTF_R (struct _reent *data, + FILE * fp, + const char *fmt0, + va_list ap) +{ + register char *fmt; /* Format string. */ + register int n, m; /* Handy integers (short term usage). */ + register char *cp; /* Handy char pointer (short term usage). */ + const char *flag_chars; + struct _prt_data_t prt_data; /* All data for decoding format string. */ + va_list ap_copy; + + /* Output function pointer. */ + int (*pfunc)(struct _reent *, FILE *, const char *, size_t len); + + pfunc = __SPRINT; + +#ifndef STRING_ONLY + /* Initialize std streams if not dealing with sprintf family. */ + CHECK_INIT (data, fp); + _newlib_flockfile_start (fp); + + /* Sorry, fprintf(read_only_file, "") returns EOF, not 0. */ + if (cantwrite (data, fp)) + { + _newlib_flockfile_exit (fp); + return (EOF); + } + +#else + /* Create initial buffer if we are called by asprintf family. */ + if (fp->_flags & __SMBF && !fp->_bf._base) + { + fp->_bf._base = fp->_p = _malloc_r (data, 64); + if (!fp->_p) + { + _REENT_ERRNO(data) = ENOMEM; + return EOF; + } + fp->_bf._size = 64; + } +#endif + + fmt = (char *)fmt0; + prt_data.ret = 0; + prt_data.blank = ' '; + prt_data.zero = '0'; + + /* GCC PR 14577 at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 */ + va_copy (ap_copy, ap); + + /* Scan the format for conversions (`%' character). */ + for (;;) + { + cp = fmt; + while (*fmt != '\0' && *fmt != '%') + fmt += 1; + + if ((m = fmt - cp) != 0) + { + PRINT (cp, m); + prt_data.ret += m; + } + if (*fmt == '\0') + goto done; + + fmt++; /* Skip over '%'. */ + + prt_data.flags = 0; + prt_data.width = 0; + prt_data.prec = -1; + prt_data.dprec = 0; + prt_data.l_buf[0] = '\0'; +#ifdef FLOATING_POINT + prt_data.lead = 0; +#endif + /* The flags. */ + /* + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flag_chars = "#-0+ "; + for (; cp = memchr (flag_chars, *fmt, 5); fmt++) + prt_data.flags |= (1 << (cp - flag_chars)); + + if (prt_data.flags & SPACESGN) + prt_data.l_buf[0] = ' '; + + /* + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (prt_data.flags & PLUSSGN) + prt_data.l_buf[0] = '+'; + + /* The width. */ + if (*fmt == '*') + { + /* + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + prt_data.width = GET_ARG (n, ap_copy, int); + if (prt_data.width < 0) + { + prt_data.width = -prt_data.width; + prt_data.flags |= LADJUST; + } + fmt++; + } + else + { + for (; is_digit (*fmt); fmt++) + prt_data.width = 10 * prt_data.width + to_digit (*fmt); + } + + /* The precision. */ + if (*fmt == '.') + { + fmt++; + if (*fmt == '*') + { + fmt++; + prt_data.prec = GET_ARG (n, ap_copy, int); + if (prt_data.prec < 0) + prt_data.prec = -1; + } + else + { + prt_data.prec = 0; + for (; is_digit (*fmt); fmt++) + prt_data.prec = 10 * prt_data.prec + to_digit (*fmt); + } + } + + /* The length modifiers. */ + flag_chars = "hlL"; + if ((cp = memchr (flag_chars, *fmt, 3)) != NULL) + { + prt_data.flags |= (SHORTINT << (cp - flag_chars)); + fmt++; + } + + /* The conversion specifiers. */ + prt_data.code = *fmt++; + cp = memchr ("efgEFG", prt_data.code, 6); +#ifdef FLOATING_POINT + /* If cp is not NULL, we are facing FLOATING POINT NUMBER. */ + if (cp) + { + /* Consume floating point argument if _printf_float is not + linked. */ + if (_printf_float == NULL) + { + if (prt_data.flags & LONGDBL) + GET_ARG (N, ap_copy, _LONG_DOUBLE); + else + GET_ARG (N, ap_copy, double); + } + else + n = _printf_float (data, &prt_data, fp, pfunc, &ap_copy); + } + else +#endif + n = _printf_i (data, &prt_data, fp, pfunc, &ap_copy); + + if (n == -1) + goto error; + + prt_data.ret += n; + } +done: + FLUSH (); +error: +#ifndef STRING_ONLY + _newlib_flockfile_end (fp); +#endif + va_end (ap_copy); + return (__sferror (fp) ? EOF : prt_data.ret); +} + +#ifdef STRING_ONLY +int +_svfiprintf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_svfprintf_r"))); +#else +int +_vfiprintf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vfprintf_r"))); +#endif diff --git a/lib/stdio/nano-vfprintf_float.c b/lib/stdio/nano-vfprintf_float.c new file mode 100644 index 0000000..524f67a --- /dev/null +++ b/lib/stdio/nano-vfprintf_float.c @@ -0,0 +1,367 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" +#include "fvwrite.h" +#include "vfieeefp.h" +#include "nano-vfprintf_local.h" + +char *__cvt (struct _reent *data, _PRINTF_FLOAT_TYPE value, int ndigits, + int flags, char *sign, int *decpt, int ch, int *length, + char *buf); + +int __exponent (char *p0, int exp, int fmtch); + +#ifdef FLOATING_POINT + +/* Using reentrant DATA, convert finite VALUE into a string of digits + with no decimal point, using NDIGITS precision and FLAGS as guides + to whether trailing zeros must be included. Set *SIGN to nonzero + if VALUE was negative. Set *DECPT to the exponent plus one. Set + *LENGTH to the length of the returned string. CH must be one of + [aAeEfFgG]; if it is [aA], then the return string lives in BUF, + otherwise the return value shares the mprec reentrant storage. */ +char * +__cvt (struct _reent *data, _PRINTF_FLOAT_TYPE value, int ndigits, int flags, + char *sign, int *decpt, int ch, int *length, char *buf) +{ + int mode, dsgn; + char *digits, *bp, *rve; + union double_union tmp; + + tmp.d = value; + /* This will check for "< 0" and "-0.0". */ + if (word0 (tmp) & Sign_bit) + { + value = -value; + *sign = '-'; + } + else + *sign = '\000'; + + if (ch == 'f' || ch == 'F') + { + /* Ndigits after the decimal point. */ + mode = 3; + } + else + { + /* To obtain ndigits after the decimal point for the 'e' + and 'E' formats, round to ndigits + 1 significant figures. */ + if (ch == 'e' || ch == 'E') + { + ndigits++; + } + /* Ndigits significant digits. */ + mode = 2; + } + + digits = _DTOA_R (data, value, mode, ndigits, decpt, &dsgn, &rve); + + /* Print trailing zeros. */ + if ((ch != 'g' && ch != 'G') || flags & ALT) + { + bp = digits + ndigits; + if (ch == 'f' || ch == 'F') + { + if (*digits == '0' && value) + *decpt = -ndigits + 1; + bp += *decpt; + } + /* Kludge for __dtoa irregularity. */ + if (value == 0) + rve = bp; + while (rve < bp) + *rve++ = '0'; + } + *length = rve - digits; + return (digits); +} + +/* This function is copied from exponent in vfprintf.c with support for + C99 formats removed. We don't use the original function in order to + decouple nano implementation of formatted IO from the Newlib one. */ +int +__exponent (char *p0, int exp, int fmtch) +{ + register char *p, *t; + char expbuf[MAXEXPLEN]; +#define isa 0 + + p = p0; + *p++ = isa ? 'p' - 'a' + fmtch : fmtch; + if (exp < 0) + { + exp = -exp; + *p++ = '-'; + } + else + *p++ = '+'; + t = expbuf + MAXEXPLEN; + if (exp > 9) + { + do + { + *--t = to_char (exp % 10); + } + while ((exp /= 10) > 9); + *--t = to_char (exp); + for (; t < expbuf + MAXEXPLEN; *p++ = *t++); + } + else + { + if (!isa) + *p++ = '0'; + *p++ = to_char (exp); + } + return (p - p0); +} + +/* Decode and print floating point number specified by "eEfgG". */ +int +_printf_float (struct _reent *data, + struct _prt_data_t *pdata, + FILE * fp, + int (*pfunc) (struct _reent *, FILE *, const char *, + size_t len), va_list * ap) +{ +#define _fpvalue (pdata->_double_) + + char *decimal_point = _localeconv_r (data)->decimal_point; + size_t decp_len = strlen (decimal_point); + /* Temporary negative sign for floats. */ + char softsign; + /* Integer value of exponent. */ + int expt; + /* Character count for expstr. */ + int expsize = 0; + /* Actual number of digits returned by cvt. */ + int ndig = 0; + char *cp; + int n; + /* Field size expanded by dprec(not for _printf_float). */ + int realsz; + char code = pdata->code; + + if (pdata->flags & LONGDBL) + { + _fpvalue = (double) GET_ARG (N, *ap, _LONG_DOUBLE); + } + else + { + _fpvalue = GET_ARG (N, *ap, double); + } + + /* Do this before tricky precision changes. + + If the output is infinite or NaN, leading + zeros are not permitted. Otherwise, scanf + could not read what printf wrote. */ + if (isinf (_fpvalue)) + { + if (_fpvalue < 0) + pdata->l_buf[0] = '-'; + if (code <= 'G') /* 'A', 'E', 'F', or 'G'. */ + cp = "INF"; + else + cp = "inf"; + pdata->size = 3; + pdata->flags &= ~ZEROPAD; + goto print_float; + } + if (isnan (_fpvalue)) + { + if (signbit (_fpvalue)) + pdata->l_buf[0] = '-'; + if (code <= 'G') /* 'A', 'E', 'F', or 'G'. */ + cp = "NAN"; + else + cp = "nan"; + pdata->size = 3; + pdata->flags &= ~ZEROPAD; + goto print_float; + } + + if (pdata->prec == -1) + { + pdata->prec = DEFPREC; + } + else if ((code == 'g' || code == 'G') && pdata->prec == 0) + { + pdata->prec = 1; + } + + pdata->flags |= FPT; + + cp = __cvt (data, _fpvalue, pdata->prec, pdata->flags, &softsign, + &expt, code, &ndig, cp); + + if (code == 'g' || code == 'G') + { + if (expt <= -4 || expt > pdata->prec) + /* 'e' or 'E'. */ + code -= 2; + else + code = 'g'; + } + if (code <= 'e') + { + /* 'a', 'A', 'e', or 'E' fmt. */ + --expt; + expsize = __exponent (pdata->expstr, expt, code); + pdata->size = expsize + ndig; + if (ndig > 1 || pdata->flags & ALT) + ++pdata->size; + } + else + { + if (code == 'f') + { + /* 'f' fmt. */ + if (expt > 0) + { + pdata->size = expt; + if (pdata->prec || pdata->flags & ALT) + pdata->size += pdata->prec + 1; + } + else + /* "0.X". */ + pdata->size = (pdata->prec || pdata->flags & ALT) + ? pdata->prec + 2 : 1; + } + else if (expt >= ndig) + { + /* Fixed g fmt. */ + pdata->size = expt; + if (pdata->flags & ALT) + ++pdata->size; + } + else + pdata->size = ndig + (expt > 0 ? 1 : 2 - expt); + pdata->lead = expt; + } + + if (softsign) + pdata->l_buf[0] = '-'; +print_float: + if (_printf_common (data, pdata, &realsz, fp, pfunc) == -1) + goto error; + + if ((pdata->flags & FPT) == 0) + { + PRINT (cp, pdata->size); + } + else + { + /* Glue together f_p fragments. */ + if (code >= 'f') + { + /* 'f' or 'g'. */ + if (_fpvalue == 0) + { + /* Kludge for __dtoa irregularity. */ + PRINT ("0", 1); + if (expt < ndig || pdata->flags & ALT) + { + PRINT (decimal_point, decp_len); + PAD (ndig - 1, pdata->zero); + } + } + else if (expt <= 0) + { + PRINT ("0", 1); + if (expt || ndig || pdata->flags & ALT) + { + PRINT (decimal_point, decp_len); + PAD (-expt, pdata->zero); + PRINT (cp, ndig); + } + } + else + { + char *convbuf = cp; + PRINTANDPAD (cp, convbuf + ndig, pdata->lead, pdata->zero); + cp += pdata->lead; + if (expt < ndig || pdata->flags & ALT) + PRINT (decimal_point, decp_len); + PRINTANDPAD (cp, convbuf + ndig, ndig - expt, pdata->zero); + } + } + else + { + /* 'a', 'A', 'e', or 'E'. */ + if (ndig > 1 || pdata->flags & ALT) + { + PRINT (cp, 1); + cp++; + PRINT (decimal_point, decp_len); + if (_fpvalue) + { + PRINT (cp, ndig - 1); + } + /* "0.[0..]". */ + else + /* __dtoa irregularity. */ + PAD (ndig - 1, pdata->zero); + } + else /* "XeYYY". */ + PRINT (cp, 1); + PRINT (pdata->expstr, expsize); + } + } + + /* Left-adjusting padding (always blank). */ + if (pdata->flags & LADJUST) + PAD (pdata->width - realsz, pdata->blank); + + return (pdata->width > realsz ? pdata->width : realsz); +error: + return -1; + +#undef _fpvalue +} + +#endif diff --git a/lib/stdio/nano-vfprintf_i.c b/lib/stdio/nano-vfprintf_i.c new file mode 100644 index 0000000..f7da952 --- /dev/null +++ b/lib/stdio/nano-vfprintf_i.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" +#include "fvwrite.h" +#include "vfieeefp.h" +#include "nano-vfprintf_local.h" + +/* Decode and print non-floating point data. */ +int +_printf_common (struct _reent *data, + struct _prt_data_t *pdata, + int *realsz, + FILE *fp, + int (*pfunc)(struct _reent *, FILE *, + const char *, size_t len)) +{ + int n; + /* + * All reasonable formats wind up here. At this point, `cp' + * points to a string which (if not flags&LADJUST) should be + * padded out to `width' places. If flags&ZEROPAD, it should + * first be prefixed by any sign or other prefix; otherwise, + * it should be blank padded before the prefix is emitted. + * After any left-hand padding and prefixing, emit zeroes + * required by a decimal [diouxX] precision, then print the + * string proper, then emit zeroes required by any leftover + * floating precision; finally, if LADJUST, pad with blanks. + * If flags&FPT, ch must be in [aAeEfg]. + * + * Compute actual size, so we know how much to pad. + * size excludes decimal prec; realsz includes it. + */ + *realsz = pdata->dprec > pdata->size ? pdata->dprec : pdata->size; + if (pdata->l_buf[0]) + (*realsz)++; + + if (pdata->flags & HEXPREFIX) + *realsz += 2; + + /* Right-adjusting blank padding. */ + if ((pdata->flags & (LADJUST|ZEROPAD)) == 0) + PAD (pdata->width - *realsz, pdata->blank); + + /* Prefix. */ + n = 0; + if (pdata->l_buf[0]) + n++; + + if (pdata->flags & HEXPREFIX) + { + pdata->l_buf[n++] = '0'; + pdata->l_buf[n++] = pdata->l_buf[2]; + } + + PRINT (pdata->l_buf, n); + n = pdata->width - *realsz; + if ((pdata->flags & (LADJUST|ZEROPAD)) != ZEROPAD || n < 0) + n = 0; + + if (pdata->dprec > pdata->size) + n += pdata->dprec - pdata->size; + + PAD (n, pdata->zero); + return 0; +error: + return -1; +} +int +_printf_i (struct _reent *data, struct _prt_data_t *pdata, FILE *fp, + int (*pfunc)(struct _reent *, FILE *, const char *, size_t len), + va_list *ap) +{ + /* Field size expanded by dprec. */ + int realsz; + u_quad_t _uquad; + int base; + int n; + char *cp = pdata->buf + BUF; + char *xdigs = "0123456789ABCDEF"; + + /* Decoding the conversion specifier. */ + switch (pdata->code) + { + case 'c': + *--cp = GET_ARG (N, *ap, int); + pdata->size = 1; + goto non_number_nosign; + case 'd': + case 'i': + _uquad = SARG (pdata->flags); + if ((long) _uquad < 0) + { + _uquad = -_uquad; + pdata->l_buf[0] = '-'; + } + base = 10; + goto number; + case 'u': + case 'o': + _uquad = UARG (pdata->flags); + base = (pdata->code == 'o') ? 8 : 10; + goto nosign; + case 'X': + pdata->l_buf[2] = 'X'; + goto hex; + case 'p': + /* + * ``The argument shall be a pointer to void. The + * value of the pointer is converted to a sequence + * of printable characters, in an implementation- + * defined manner.'' + * -- ANSI X3J11 + */ + pdata->flags |= HEXPREFIX; + if (sizeof (void*) > sizeof (int)) + pdata->flags |= LONGINT; + /* NOSTRICT. */ + case 'x': + pdata->l_buf[2] = 'x'; + xdigs = "0123456789abcdef"; +hex: + _uquad = UARG (pdata->flags); + base = 16; + if (pdata->flags & ALT) + pdata->flags |= HEXPREFIX; + + /* Leading 0x/X only if non-zero. */ + if (_uquad == 0) + pdata->flags &= ~HEXPREFIX; + + /* Unsigned conversions. */ +nosign: + pdata->l_buf[0] = '\0'; + /* + * ``... diouXx conversions ... if a precision is + * specified, the 0 flag will be ignored.'' + * -- ANSI X3J11 + */ +number: + if ((pdata->dprec = pdata->prec) >= 0) + pdata->flags &= ~ZEROPAD; + + /* + * ``The result of converting a zero value with an + * explicit precision of zero is no characters.'' + * -- ANSI X3J11 + */ + if (_uquad != 0 || pdata->prec != 0) + { + do + { + *--cp = xdigs[_uquad % base]; + _uquad /= base; + } + while (_uquad); + } + /* For 'o' conversion, '#' increases the precision to force the first + digit of the result to be zero. */ + if (base == 8 && (pdata->flags & ALT) && pdata->prec <= pdata->size) + *--cp = '0'; + + pdata->size = pdata->buf + BUF - cp; + break; + case 'n': + if (pdata->flags & LONGINT) + *GET_ARG (N, *ap, long_ptr_t) = pdata->ret; + else if (pdata->flags & SHORTINT) + *GET_ARG (N, *ap, short_ptr_t) = pdata->ret; + else + *GET_ARG (N, *ap, int_ptr_t) = pdata->ret; + case '\0': + pdata->size = 0; + break; + case 's': + cp = GET_ARG (N, *ap, char_ptr_t); + /* Precision gives the maximum number of chars to be written from a + string, and take prec == -1 into consideration. + Use normal Newlib approach here to support case where cp is not + nul-terminated. */ + char *p = memchr (cp, 0, pdata->prec); + + if (p != NULL) + pdata->prec = p - cp; + + pdata->size = pdata->prec; + goto non_number_nosign; + default: + /* "%?" prints ?, unless ? is NUL. */ + /* Pretend it was %c with argument ch. */ + *--cp = pdata->code; + pdata->size = 1; +non_number_nosign: + pdata->l_buf[0] = '\0'; + break; + } + + /* Output. */ + n = _printf_common (data, pdata, &realsz, fp, pfunc); + if (n == -1) + goto error; + + PRINT (cp, pdata->size); + /* Left-adjusting padding (always blank). */ + if (pdata->flags & LADJUST) + PAD (pdata->width - realsz, pdata->blank); + + return (pdata->width > realsz ? pdata->width : realsz); +error: + return -1; +} + diff --git a/lib/stdio/nano-vfprintf_local.h b/lib/stdio/nano-vfprintf_local.h new file mode 100644 index 0000000..15ddce0 --- /dev/null +++ b/lib/stdio/nano-vfprintf_local.h @@ -0,0 +1,234 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef VFPRINTF_LOCAL +#define VFPRINTF_LOCAL + +#ifndef NO_FLOATING_POINT +# define FLOATING_POINT +#endif + +#define _NO_POS_ARGS +#undef _WANT_IO_C99_FORMATS + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL + +#define _NO_LONGLONG + +#define _PRINTF_FLOAT_TYPE double + +#if defined (FLOATING_POINT) +# include +#endif +#ifdef FLOATING_POINT +# include + +/* For %La, an exponent of 15 bits occupies the exponent character, + a sign, and up to 5 digits. */ +# define MAXEXPLEN 7 +# define DEFPREC 6 + +extern char *_dtoa_r (struct _reent *, double, int, + int, int *, int *, char **); + +# define _DTOA_R _dtoa_r +# define FREXP frexp + +#endif /* FLOATING_POINT. */ + +/* BUF must be big enough for the maximum %#llo (assuming long long is + at most 64 bits, this would be 23 characters), the maximum + multibyte character %C, and the maximum default precision of %La + (assuming long double is at most 128 bits with 113 bits of + mantissa, this would be 29 characters). %e, %f, and %g use + reentrant storage shared with mprec. All other formats that use + buf get by with fewer characters. Making BUF slightly bigger + reduces the need for malloc in %.*a and %S, when large precision or + long strings are processed. + The bigger size of 100 bytes is used on systems which allow number + strings using the locale's grouping character. Since that's a multibyte + value, we should use a conservative value. */ +#define BUF 40 + +#define quad_t long +#define u_quad_t unsigned long + +typedef quad_t * quad_ptr_t; +typedef void *void_ptr_t; +typedef char * char_ptr_t; +typedef long * long_ptr_t; +typedef int * int_ptr_t; +typedef short * short_ptr_t; + +/* Macros for converting digits to letters and vice versa. */ +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit (c) <= 9) +#define to_char(n) ((n) + '0') + +/* Flags used during conversion. */ +#define ALT 0x001 /* Alternate form. */ +#define LADJUST 0x002 /* Left adjustment. */ +#define ZEROPAD 0x004 /* Zero (as opposed to blank) pad. */ +#define PLUSSGN 0x008 /* Plus sign flag. */ +#define SPACESGN 0x010 /* Space flag. */ +#define HEXPREFIX 0x020 /* Add 0x or 0X prefix. */ +#define SHORTINT 0x040 /* Short integer. */ +#define LONGINT 0x080 /* Long integer. */ +#define LONGDBL 0x100 /* Long double. */ +/* ifdef _NO_LONGLONG, make QUADINT equivalent to LONGINT, so + that %lld behaves the same as %ld, not as %d, as expected if: + sizeof (long long) = sizeof long > sizeof int. */ +#define QUADINT LONGINT +#define FPT 0x400 /* Floating point number. */ +/* Define as 0, to make SARG and UARG occupy fewer instructions. */ +# define CHARINT 0 + +/* Macros to support positional arguments. */ +#define GET_ARG(n, ap, type) (va_arg ((ap), type)) + +/* To extend shorts properly, we need both signed and unsigned + argument extraction methods. Also they should be used in nano-vfprintf_i.c + and nano-vfprintf_float.c only, since ap is a pointer to va_list. */ +#define SARG(flags) \ + (flags&LONGINT ? GET_ARG (N, (*ap), long) : \ + flags&SHORTINT ? (long)(short)GET_ARG (N, (*ap), int) : \ + flags&CHARINT ? (long)(signed char)GET_ARG (N, (*ap), int) : \ + (long)GET_ARG (N, (*ap), int)) +#define UARG(flags) \ + (flags&LONGINT ? GET_ARG (N, (*ap), u_long) : \ + flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, (*ap), int) : \ + flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, (*ap), int) : \ + (u_long)GET_ARG (N, (*ap), u_int)) + +/* BEWARE, these `goto error' on error. And they are used + in more than one functions. + + Following macros are each referred about twice in printf for integer, + so it is not worth to rewrite them into functions. This situation may + change in the future. */ +#define PRINT(ptr, len) { \ + if (pfunc (data, fp, (ptr), (len)) == EOF) \ + goto error; \ +} +#define PAD(howmany, ch) { \ + int temp_i = 0; \ + while (temp_i < (howmany)) \ + { \ + if (pfunc (data, fp, &(ch), 1) == EOF) \ + goto error; \ + temp_i++; \ + } \ +} +#define PRINTANDPAD(p, ep, len, ch) { \ + int temp_n = (ep) - (p); \ + if (temp_n > (len)) \ + temp_n = (len); \ + if (temp_n > 0) \ + PRINT((p), temp_n); \ + PAD((len) - (temp_n > 0 ? temp_n : 0), (ch)); \ +} + +/* All data needed to decode format string are kept in below struct. */ +struct _prt_data_t +{ + int flags; /* Flags. */ + int prec; /* Precision. */ + int dprec; /* Decimal precision. */ + int width; /* Width. */ + int size; /* Size of converted field or string. */ + int ret; /* Return value accumulator. */ + char code; /* Current conversion specifier. */ + char blank; /* Blank character. */ + char zero; /* Zero character. */ + char buf[BUF]; /* Output buffer for non-floating point number. */ + char l_buf[3]; /* Sign&hex_prefix, "+/-" and "0x/X". */ +#ifdef FLOATING_POINT + _PRINTF_FLOAT_TYPE _double_; /* Double value. */ + char expstr[MAXEXPLEN]; /* Buffer for exponent string. */ + int lead; /* The sig figs before decimal or group sep. */ +#endif +}; + +extern int +_printf_common (struct _reent *data, + struct _prt_data_t *pdata, + int *realsz, + FILE *fp, + int (*pfunc)(struct _reent *, FILE *, + const char *, size_t len)); + +extern int +_printf_i (struct _reent *data, struct _prt_data_t *pdata, FILE *fp, + int (*pfunc)(struct _reent *, FILE *, const char *, size_t len), + va_list *ap); + +/* Make _printf_float weak symbol, so it won't be linked in if target program + does not need it. */ +extern int +_printf_float (struct _reent *data, + struct _prt_data_t *pdata, + FILE *fp, + int (*pfunc)(struct _reent *, FILE *, + const char *, size_t len), + va_list *ap) _ATTRIBUTE((__weak__)); +#endif diff --git a/lib/stdio/nano-vfscanf.c b/lib/stdio/nano-vfscanf.c new file mode 100644 index 0000000..57d25b8 --- /dev/null +++ b/lib/stdio/nano-vfscanf.c @@ -0,0 +1,465 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + vfscanf +INDEX + _vfscanf_r +INDEX + vscanf +INDEX + _vscanf_r +INDEX + vsscanf +INDEX + _vsscanf_r + +SYNOPSIS + #include + #include + int vscanf(const char *<[fmt]>, va_list <[list]>); + int vfscanf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsscanf(const char *<[str]>, const char *<[fmt]>, va_list <[list]>); + + int _vscanf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfscanf_r(struct _reent *<[reent]>, FILE *<[fp]>, const char *<[fmt]>, + va_list <[list]>); + int _vsscanf_r(struct _reent *<[reent]>, const char *<[str]>, + const char *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, and <> are (respectively) variants +of <>, <>, and <>. They differ only in +allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than +directly accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of input fields successfully scanned, +converted, and stored; the return value does not include scanned +fields which were not stored. + +If <> attempts to read at end-of-file, the return value +is <>. + +If no fields were stored, the return value is <<0>>. + +The routines <<_vscanf_r>>, <<_vfscanf_f>>, and <<_vsscanf_r>> are +reentrant versions which take an additional first parameter which points to the +reentrancy structure. + +PORTABILITY +These are GNU extensions. + +Supporting OS subroutines required: +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" +#include "nano-vfscanf_local.h" + +#define VFSCANF vfscanf +#define _VFSCANF_R _vfscanf_r +#define __SVFSCANF __svfscanf +#ifdef STRING_ONLY +# define __SVFSCANF_R __ssvfscanf_r +#else +# define __SVFSCANF_R __svfscanf_r +#endif + +/* vfscanf. */ + +#ifndef STRING_ONLY + +#ifndef _REENT_ONLY + +int +VFSCANF (register FILE *fp, + const char *fmt, + va_list ap) +{ + CHECK_INIT(_REENT, fp); + return __SVFSCANF_R (_REENT, fp, fmt, ap); +} + +int +vfiscanf (FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vfscanf"))); + +int +__SVFSCANF (register FILE *fp, + char const *fmt0, + va_list ap) +{ + return __SVFSCANF_R (_REENT, fp, fmt0, ap); +} + +#endif + +int +_VFSCANF_R (struct _reent *data, + register FILE *fp, + const char *fmt, + va_list ap) +{ + CHECK_INIT(data, fp); + return __SVFSCANF_R (data, fp, fmt, ap); +} + +int +_vfiscanf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vfscanf_r"))); +#endif /* !STRING_ONLY. */ + +#if defined (STRING_ONLY) +/* When dealing with the sscanf family, we don't want to use the + regular ungetc which will drag in file I/O items we don't need. + So, we create our own trimmed-down version. */ +int +_sungetc_r (struct _reent *data, + int c, + register FILE *fp) +{ + if (c == EOF) + return (EOF); + + /* After ungetc, we won't be at eof anymore. */ + fp->_flags &= ~__SEOF; + c = (unsigned char) c; + + /* If we are in the middle of ungetc'ing, just continue. + This may require expanding the current ungetc buffer. */ + + if (HASUB (fp)) + { + if (fp->_r >= fp->_ub._size && __submore (data, fp)) + return EOF; + + *--fp->_p = c; + fp->_r++; + return c; + } + + /* If we can handle this by simply backing up, do so, + but never replace the original character. + (This makes sscanf() work when scanning `const' data). */ + if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c) + { + fp->_p--; + fp->_r++; + return c; + } + + /* Create an ungetc buffer. + Initially, we will use the `reserve' buffer. */ + fp->_ur = fp->_r; + fp->_up = fp->_p; + fp->_ub._base = fp->_ubuf; + fp->_ub._size = sizeof (fp->_ubuf); + fp->_ubuf[sizeof (fp->_ubuf) - 1] = c; + fp->_p = &fp->_ubuf[sizeof (fp->_ubuf) - 1]; + fp->_r = 1; + return c; +} + +/* String only version of __srefill_r for sscanf family. */ +int +__ssrefill_r (struct _reent * ptr, + register FILE * fp) +{ + /* Our only hope of further input is the ungetc buffer. + If there is anything in that buffer to read, return. */ + if (HASUB (fp)) + { + FREEUB (ptr, fp); + if ((fp->_r = fp->_ur) != 0) + { + fp->_p = fp->_up; + return 0; + } + } + + /* Otherwise we are out of character input. */ + fp->_p = fp->_bf._base; + fp->_r = 0; + fp->_flags |= __SEOF; + return EOF; +} + +#else +int _sungetc_r (struct _reent *, int, register FILE *); +int __ssrefill_r (struct _reent *, register FILE *); +size_t _sfread_r (struct _reent *, void *buf, size_t, size_t, FILE *); +#endif /* !STRING_ONLY. */ + +int +__SVFSCANF_R (struct _reent *rptr, + register FILE *fp, + char const *fmt0, + va_list ap) +{ + register u_char *fmt = (u_char *) fmt0; + register int c; /* Character from format, or conversion. */ + register char *p; /* Points into all kinds of strings. */ + char ccltab[256]; /* Character class table for %[...]. */ + va_list ap_copy; + + int ret; + char *cp; + + struct _scan_data_t scan_data; + int (*scan_func)(struct _reent*, struct _scan_data_t*, FILE *, va_list *); + + _newlib_flockfile_start (fp); + + scan_data.nassigned = 0; + scan_data.nread = 0; + scan_data.ccltab = ccltab; + scan_data.pfn_ungetc = _ungetc_r; + scan_data.pfn_refill = __srefill_r; + + /* GCC PR 14577 at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557 */ + va_copy (ap_copy, ap); + + for (;;) + { + if (*fmt == 0) + goto all_done; + + if (isspace (*fmt)) + { + while ((fp->_r > 0 || !scan_data.pfn_refill(rptr, fp)) + && isspace (*fp->_p)) + { + scan_data.nread++; + fp->_r--; + fp->_p++; + } + fmt++; + continue; + } + if ((c = *fmt++) != '%') + goto literal; + + scan_data.width = 0; + scan_data.flags = 0; + + if (*fmt == '*') + { + scan_data.flags |= SUPPRESS; + fmt++; + } + + for (; is_digit (*fmt); fmt++) + scan_data.width = 10 * scan_data.width + to_digit (*fmt); + + /* The length modifiers. */ + p = "hlL"; + if ((cp = memchr (p, *fmt, 3)) != NULL) { + scan_data.flags |= (SHORT << (cp - p)); + fmt++; + } + + /* Switch on the format. continue if done; break once format + type is derived. */ + c = *fmt++; + switch (c) + { + case '%': + literal: + if ((fp->_r <= 0 && scan_data.pfn_refill(rptr, fp))) + goto input_failure; + if (*fp->_p != c) + goto match_failure; + fp->_r--, fp->_p++; + scan_data.nread++; + continue; + + case 'p': + scan_data.flags |= POINTER; + case 'x': + case 'X': + scan_data.flags |= PFXOK; + scan_data.base = 16; + goto number; + case 'd': + case 'u': + scan_data.base = 10; + goto number; + case 'i': + scan_data.base = 0; + goto number; + case 'o': + scan_data.base = 8; + number: + scan_data.code = (c < 'o') ? CT_INT : CT_UINT; + break; + + case '[': + fmt = (u_char *) __sccl (ccltab, (unsigned char *) fmt); + scan_data.flags |= NOSKIP; + scan_data.code = CT_CCL; + break; + case 'c': + scan_data.flags |= NOSKIP; + scan_data.code = CT_CHAR; + break; + case 's': + scan_data.code = CT_STRING; + break; + + case 'n': + if (scan_data.flags & SUPPRESS) /* ??? */ + continue; + + if (scan_data.flags & SHORT) + *GET_ARG (N, ap_copy, short *) = scan_data.nread; + else if (scan_data.flags & LONG) + *GET_ARG (N, ap_copy, long *) = scan_data.nread; + else + *GET_ARG (N, ap_copy, int *) = scan_data.nread; + + continue; + + /* Disgusting backwards compatibility hacks. XXX. */ + case '\0': /* compat. */ + _newlib_flockfile_exit (fp); + va_end (ap_copy); + return EOF; + +#ifdef FLOATING_POINT + case 'e': case 'E': + case 'f': case 'F': + case 'g': case 'G': + scan_data.code = CT_FLOAT; + break; +#endif + default: /* compat. */ + scan_data.code = CT_INT; + scan_data.base = 10; + break; + } + + /* We have a conversion that requires input. */ + if ((fp->_r <= 0 && scan_data.pfn_refill (rptr, fp))) + goto input_failure; + + /* Consume leading white space, except for formats that + suppress this. */ + if ((scan_data.flags & NOSKIP) == 0) + { + while (isspace (*fp->_p)) + { + scan_data.nread++; + if (--fp->_r > 0) + fp->_p++; + else if (scan_data.pfn_refill (rptr, fp)) + goto input_failure; + } + /* Note that there is at least one character in the + buffer, so conversions that do not set NOSKIP ca + no longer result in an input failure. */ + } + ret = 0; + if (scan_data.code < CT_INT) + ret = _scanf_chars (rptr, &scan_data, fp, &ap_copy); + else if (scan_data.code < CT_FLOAT) + ret = _scanf_i (rptr, &scan_data, fp, &ap_copy); +#ifdef FLOATING_POINT + else if (_scanf_float) + ret = _scanf_float (rptr, &scan_data, fp, &ap_copy); +#endif + + if (ret == MATCH_FAILURE) + goto match_failure; + else if (ret == INPUT_FAILURE) + goto input_failure; + } +input_failure: + /* On read failure, return EOF failure regardless of matches; errno + should have been set prior to here. On EOF failure (including + invalid format string), return EOF if no matches yet, else number + of matches made prior to failure. */ + _newlib_flockfile_exit (fp); + va_end (ap_copy); + return scan_data.nassigned && !(fp->_flags & __SERR) ? scan_data.nassigned + : EOF; +match_failure: +all_done: + /* Return number of matches, which can be 0 on match failure. */ + _newlib_flockfile_end (fp); + va_end (ap_copy); + return scan_data.nassigned; +} + +#ifdef STRING_ONLY +int +__ssvfiscanf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("__ssvfscanf_r"))); +#else +int +__svfiscanf_r (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("__svfscanf_r"))); +#endif + diff --git a/lib/stdio/nano-vfscanf_float.c b/lib/stdio/nano-vfscanf_float.c new file mode 100644 index 0000000..056046f --- /dev/null +++ b/lib/stdio/nano-vfscanf_float.c @@ -0,0 +1,342 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" +#include "nano-vfscanf_local.h" + +#ifdef FLOATING_POINT +int +_scanf_float (struct _reent *rptr, + struct _scan_data_t *pdata, + FILE *fp, va_list *ap) +{ + int c; + char *p; + float *flp; + _LONG_DOUBLE *ldp; + + /* Scan a floating point number as if by strtod. */ + /* This code used to assume that the number of digits is reasonable. + However, ANSI / ISO C makes no such stipulation; we have to get + exact results even when there is an unreasonable amount of leading + zeroes. */ + long leading_zeroes = 0; + long zeroes, exp_adjust; + char *exp_start = NULL; + unsigned width_left = 0; + char nancount = 0; + char infcount = 0; +#ifdef hardway + if (pdata->width == 0 || pdata->width > BUF - 1) +#else + /* size_t is unsigned, hence this optimisation. */ + if (pdata->width - 1 > BUF - 2) +#endif + { + width_left = pdata->width - (BUF - 1); + pdata->width = BUF - 1; + } + pdata->flags |= SIGNOK | NDIGITS | DPTOK | EXPOK; + zeroes = 0; + exp_adjust = 0; + for (p = pdata->buf; pdata->width; ) + { + c = *fp->_p; + /* This code mimicks the integer conversion code, + but is much simpler. */ + switch (c) + { + case '0': + if (pdata->flags & NDIGITS) + { + pdata->flags &= ~SIGNOK; + zeroes++; + if (width_left) + { + width_left--; + pdata->width++; + } + goto fskip; + } + /* Fall through. */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (nancount + infcount == 0) + { + pdata->flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + break; + + case '+': + case '-': + if (pdata->flags & SIGNOK) + { + pdata->flags &= ~SIGNOK; + goto fok; + } + break; + case 'n': + case 'N': + if (nancount == 0 && zeroes == 0 + && (pdata->flags & (NDIGITS | DPTOK | EXPOK)) == + (NDIGITS | DPTOK | EXPOK)) + { + pdata->flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS); + nancount = 1; + goto fok; + } + if (nancount == 2) + { + nancount = 3; + goto fok; + } + if (infcount == 1 || infcount == 4) + { + infcount++; + goto fok; + } + break; + case 'a': + case 'A': + if (nancount == 1) + { + nancount = 2; + goto fok; + } + break; + case 'i': + case 'I': + if (infcount == 0 && zeroes == 0 + && (pdata->flags & (NDIGITS | DPTOK | EXPOK)) == + (NDIGITS | DPTOK | EXPOK)) + { + pdata->flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS); + infcount = 1; + goto fok; + } + if (infcount == 3 || infcount == 5) + { + infcount++; + goto fok; + } + break; + case 'f': + case 'F': + if (infcount == 2) + { + infcount = 3; + goto fok; + } + break; + case 't': + case 'T': + if (infcount == 6) + { + infcount = 7; + goto fok; + } + break; + case 'y': + case 'Y': + if (infcount == 7) + { + infcount = 8; + goto fok; + } + break; + case '.': + if (pdata->flags & DPTOK) + { + pdata->flags &= ~(SIGNOK | DPTOK); + leading_zeroes = zeroes; + goto fok; + } + break; + case 'e': + case 'E': + /* No exponent without some digits. */ + if ((pdata->flags & (NDIGITS | EXPOK)) == EXPOK + || ((pdata->flags & EXPOK) && zeroes)) + { + if (! (pdata->flags & DPTOK)) + { + exp_adjust = zeroes - leading_zeroes; + exp_start = p; + } + pdata->flags = + (pdata->flags & ~(EXPOK | DPTOK)) | SIGNOK | NDIGITS; + zeroes = 0; + goto fok; + } + break; + } + break; +fok: + *p++ = c; +fskip: + pdata->width--; + ++pdata->nread; + if (--fp->_r > 0) + fp->_p++; + else if (pdata->pfn_refill (rptr, fp)) + /* "EOF". */ + break; + } + if (zeroes) + pdata->flags &= ~NDIGITS; + /* We may have a 'N' or possibly even [sign] 'N' 'a' as the + start of 'NaN', only to run out of chars before it was + complete (or having encountered a non-matching char). So + check here if we have an outstanding nancount, and if so + put back the chars we did swallow and treat as a failed + match. + + FIXME - we still don't handle NAN([0xdigits]). */ + if (nancount - 1U < 2U) + { + /* "nancount && nancount < 3". */ + /* Newlib's ungetc works even if we called __srefill in + the middle of a partial parse, but POSIX does not + guarantee that in all implementations of ungetc. */ + while (p > pdata->buf) + { + pdata->pfn_ungetc (rptr, *--p, fp); /* "[-+nNaA]". */ + --pdata->nread; + } + return MATCH_FAILURE; + } + /* Likewise for 'inf' and 'infinity'. But be careful that + 'infinite' consumes only 3 characters, leaving the stream + at the second 'i'. */ + if (infcount - 1U < 7U) + { + /* "infcount && infcount < 8". */ + if (infcount >= 3) /* valid 'inf', but short of 'infinity'. */ + while (infcount-- > 3) + { + pdata->pfn_ungetc (rptr, *--p, fp); /* "[iInNtT]". */ + --pdata->nread; + } + else + { + while (p > pdata->buf) + { + pdata->pfn_ungetc (rptr, *--p, fp); /* "[-+iInN]". */ + --pdata->nread; + } + return MATCH_FAILURE; + } + } + /* If no digits, might be missing exponent digits + (just give back the exponent) or might be missing + regular digits, but had sign and/or decimal point. */ + if (pdata->flags & NDIGITS) + { + if (pdata->flags & EXPOK) + { + /* No digits at all. */ + while (p > pdata->buf) + { + pdata->pfn_ungetc (rptr, *--p, fp); /* "[-+.]". */ + --pdata->nread; + } + return MATCH_FAILURE; + } + /* Just a bad exponent (e and maybe sign). */ + c = *--p; + --pdata->nread; + if (c != 'e' && c != 'E') + { + pdata->pfn_ungetc (rptr, c, fp); /* "[-+]". */ + c = *--p; + --pdata->nread; + } + pdata->pfn_ungetc (rptr, c, fp); /* "[eE]". */ + } + if ((pdata->flags & SUPPRESS) == 0) + { + double fp; + long new_exp = 0; + + *p = 0; + if ((pdata->flags & (DPTOK | EXPOK)) == EXPOK) + { + exp_adjust = zeroes - leading_zeroes; + new_exp = -exp_adjust; + exp_start = p; + } + else if (exp_adjust) + new_exp = _strtol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust; + + if (exp_adjust) + { + /* If there might not be enough space for the new exponent, + truncate some trailing digits to make room. */ + if (exp_start >= pdata->buf + BUF - MAX_LONG_LEN) + exp_start = pdata->buf + BUF - MAX_LONG_LEN - 1; + sprintf (exp_start, "e%ld", new_exp); + } + + /* Current _strtold routine is markedly slower than + _strtod_r. Only use it if we have a long double + result. */ + fp = _strtod_r (rptr, pdata->buf, NULL); + + /* Do not support long double. */ + if (pdata->flags & LONG) + *GET_ARG (N, *ap, double *) = fp; + else if (pdata->flags & LONGDBL) + { + ldp = GET_ARG (N, *ap, _LONG_DOUBLE *); + *ldp = fp; + } + else + { + flp = GET_ARG (N, *ap, float *); + if (isnan (fp)) + *flp = nanf (""); + else + *flp = fp; + } + pdata->nassigned++; + } + return 0; +} +#endif + diff --git a/lib/stdio/nano-vfscanf_i.c b/lib/stdio/nano-vfscanf_i.c new file mode 100644 index 0000000..fc80117 --- /dev/null +++ b/lib/stdio/nano-vfscanf_i.c @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" + +#include "nano-vfscanf_local.h" + +int +_scanf_chars (struct _reent *rptr, + struct _scan_data_t *pdata, + FILE *fp, va_list *ap) +{ + int n; + char *p; + + if (pdata->width == 0) + pdata->width = (pdata->code == CT_CHAR) ? 1 : (size_t)~0; + + n = 0; + if ((pdata->flags & SUPPRESS) == 0) + p = GET_ARG (N, *ap, char *); + + /* It's impossible to have EOF when we get here. */ + while ((pdata->code == CT_CHAR) + || (pdata->code == CT_CCL && pdata->ccltab[*fp->_p]) + || (pdata->code == CT_STRING && !isspace (*fp->_p))) + { + n++; + if ((pdata->flags & SUPPRESS) == 0) + *p++ = *fp->_p; + + fp->_r--, fp->_p++; + if (--pdata->width == 0) + break; + + if ((fp->_r <= 0 && pdata->pfn_refill (rptr, fp))) + break; + } + /* For CT_CHAR, it is impossible to have input_failure(n == 0) here. + For CT_CCL, it is impossible to have input_failure here. + For CT_STRING, it is possible to have empty string. */ + if (n == 0 && pdata->code == CT_CCL) + return MATCH_FAILURE; + + if ((pdata->flags & SUPPRESS) == 0) + { + pdata->nassigned++; + if (pdata->code != CT_CHAR) + *p = 0; + } + pdata->nread += n; + return 0; +} +int +_scanf_i (struct _reent *rptr, + struct _scan_data_t *pdata, + FILE *fp, va_list *ap) +{ +#define CCFN_PARAMS (struct _reent *, const char *, char **, int) + /* Conversion function (strtol/strtoul). */ + u_long (*ccfn)CCFN_PARAMS=0; + char *p; + int n; + char *xdigits = "A-Fa-f8901234567]"; + char *prefix_chars[3] = {"+-", "00", "xX"}; + + /* Scan an integer as if by strtol/strtoul. */ + unsigned width_left = 0; + int skips = 0; + + ccfn = (pdata->code == CT_INT) ? (u_long (*)CCFN_PARAMS)_strtol_r : _strtoul_r; +#ifdef hardway + if (pdata->width == 0 || pdata->width > BUF - 1) +#else + /* size_t is unsigned, hence this optimisation. */ + if (pdata->width - 1 > BUF - 2) +#endif + { + width_left = pdata->width - (BUF - 1); + pdata->width = BUF - 1; + } + p = pdata->buf; + pdata->flags |= NDIGITS | NZDIGITS | NNZDIGITS; + + /* Process [sign] [0] [xX] prefixes sequently. */ + for (n = 0; n < 3; n++) + { + if (!memchr (prefix_chars[n], *fp->_p, 2)) + continue; + + if (n == 1) + { + if (pdata->base == 0) + { + pdata->base = 8; + pdata->flags |= PFXOK; + } + pdata->flags &= ~(NZDIGITS | NDIGITS); + } + else if (n == 2) + { + if ((pdata->flags & (PFXOK | NZDIGITS)) != PFXOK) + continue; + pdata->base = 16; + + /* We must reset the NZDIGITS and NDIGITS + flags that would have been unset by seeing + the zero that preceded the X or x. + + ??? It seems unnecessary to reset the NZDIGITS. */ + pdata->flags |= NDIGITS; + } + if (pdata->width-- > 0) + { + *p++ = *fp->_p++; + fp->_r--; + if ((fp->_r <= 0 && pdata->pfn_refill (rptr, fp))) + goto match_end; + } + } + + if (pdata->base == 0) + pdata->base = 10; + + /* The check is un-necessary if xdigits points to exactly the string: + "A-Fa-f8901234567]". The code is kept only for reading's sake. */ +#if 0 + if (pdata->base != 16) +#endif + xdigits = xdigits + 16 - pdata->base; + + /* Initilize ccltab according to pdata->base. */ + __sccl (pdata->ccltab, (unsigned char *) xdigits); + for (; pdata->width; pdata->width--) + { + n = *fp->_p; + if (pdata->ccltab[n] == 0) + break; + else if (n == '0' && (pdata->flags & NNZDIGITS)) + { + ++skips; + if (width_left) + { + width_left--; + pdata->width++; + } + goto skip; + } + pdata->flags &= ~(NDIGITS | NNZDIGITS); + /* Char is legal: store it and look at the next. */ + *p++ = *fp->_p; +skip: + if (--fp->_r > 0) + fp->_p++; + else if (pdata->pfn_refill (rptr, fp)) + /* "EOF". */ + break; + } + /* If we had only a sign, it is no good; push back the sign. + If the number ends in `x', it was [sign] '0' 'x', so push back + the x and treat it as [sign] '0'. + Use of ungetc here and below assumes ASCII encoding; we are only + pushing back 7-bit characters, so casting to unsigned char is + not necessary. */ +match_end: + if (pdata->flags & NDIGITS) + { + if (p > pdata->buf) + pdata->pfn_ungetc (rptr, *--p, fp); /* "[-+xX]". */ + + if (p == pdata->buf) + return MATCH_FAILURE; + } + if ((pdata->flags & SUPPRESS) == 0) + { + u_long ul; + *p = 0; + ul = (*ccfn) (rptr, pdata->buf, (char **) NULL, pdata->base); + if (pdata->flags & POINTER) + *GET_ARG (N, *ap, void **) = (void *) (uintptr_t) ul; + else if (pdata->flags & SHORT) + *GET_ARG (N, *ap, short *) = ul; + else if (pdata->flags & LONG) + *GET_ARG (N, *ap, long *) = ul; + else + *GET_ARG (N, *ap, int *) = ul; + + pdata->nassigned++; + } + pdata->nread += p - pdata->buf + skips; + return 0; +} + diff --git a/lib/stdio/nano-vfscanf_local.h b/lib/stdio/nano-vfscanf_local.h new file mode 100644 index 0000000..d696ec0 --- /dev/null +++ b/lib/stdio/nano-vfscanf_local.h @@ -0,0 +1,178 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Copyright (c) 2012-2014 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef VFSCANF_LOCAL +#define VFSCANF_LOCAL + +#ifndef NO_FLOATING_POINT +#define FLOATING_POINT +#endif + +#ifdef STRING_ONLY +#undef _newlib_flockfile_start +#undef _newlib_flockfile_exit +#undef _newlib_flockfile_end +#define _newlib_flockfile_start(x) {} +#define _newlib_flockfile_exit(x) {} +#define _newlib_flockfile_end(x) {} +#define _ungetc_r _sungetc_r +#define __srefill_r __ssrefill_r +#endif + +#ifdef FLOATING_POINT +#include +#include + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL + +#include "floatio.h" + +#if ((MAXEXP+MAXFRACT+3) > MB_LEN_MAX) +/* "3 = sign + decimal point + NUL". */ +# define BUF (MAXEXP+MAXFRACT+3) +#else +# define BUF MB_LEN_MAX +#endif + +/* An upper bound for how long a long prints in decimal. 4 / 13 approximates + log (2). Add one char for roundoff compensation and one for the sign. */ +#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long) - 1) * 4 / 13 + 2) +#else +#define BUF 40 +#endif + + +#define _NO_LONGLONG +#undef _WANT_IO_C99_FORMATS +#undef _WANT_IO_POS_ARGS + +#define _NO_POS_ARGS + +/* Macros for converting digits to letters and vice versa. */ +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit (c) <= 9) +#define to_char(n) ((n) + '0') + +/* + * Flags used during conversion. + */ + +#define SHORT 0x01 /* "h": short. */ +#define LONG 0x02 /* "l": long or double. */ +#define LONGDBL 0x04 /* "L/ll": long double or long long. */ +#define CHAR 0x08 /* "hh": 8 bit integer. */ +#define SUPPRESS 0x10 /* Suppress assignment. */ +#define POINTER 0x20 /* Weird %p pointer (`fake hex'). */ +#define NOSKIP 0x40 /* Do not skip blanks */ + +/* The following are used in numeric conversions only: + SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point; + SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral. */ + +#define SIGNOK 0x80 /* "+/-" is (still) legal. */ +#define NDIGITS 0x100 /* No digits detected. */ + +#define DPTOK 0x200 /* (Float) decimal point is still legal. */ +#define EXPOK 0x400 /* (Float) exponent (e+3, etc) still legal. */ + +#define PFXOK 0x200 /* "0x" prefix is (still) legal. */ +#define NZDIGITS 0x400 /* No zero digits detected. */ +#define NNZDIGITS 0x800 /* No non-zero digits detected. */ + +/* Conversion types. */ + +#define CT_CHAR 0 /* "%c" conversion. */ +#define CT_CCL 1 /* "%[...]" conversion. */ +#define CT_STRING 2 /* "%s" conversion. */ +#define CT_INT 3 /* Integer, i.e., strtol. */ +#define CT_UINT 4 /* Unsigned integer, i.e., strtoul. */ +#define CT_FLOAT 5 /* Floating, i.e., strtod. */ + +#define u_char unsigned char +#define u_long unsigned long + +/* Macro to support positional arguments. */ +#define GET_ARG(n, ap, type) (va_arg ((ap), type)) + +#define MATCH_FAILURE 1 +#define INPUT_FAILURE 2 + + +/* All data needed to decode format string are kept in below struct. */ +struct _scan_data_t +{ + int flags; /* Flags. */ + int base; /* Base. */ + size_t width; /* Width. */ + int nassigned; /* Number of assignments so far. */ + int nread; /* Number of chars read so far. */ + char *ccltab; /* Table used for [ format. */ + int code; /* Current conversion specifier. */ + char buf[BUF]; /* Internal buffer for scan. */ + /* Internal buffer for scan. */ + int (*pfn_ungetc)(struct _reent*, int, FILE*); + /* Internal buffer for scan. */ + int (*pfn_refill)(struct _reent*, FILE*); +}; + +extern int +_scanf_chars (struct _reent *rptr, + struct _scan_data_t *pdata, + FILE *fp, va_list *ap); +extern int +_scanf_i (struct _reent *rptr, + struct _scan_data_t *pdata, + FILE *fp, va_list *ap); +/* Make _scanf_float weak symbol, so it won't be linked in if target program + does not need it. */ +extern int +_scanf_float (struct _reent *rptr, + struct _scan_data_t *pdata, + FILE *fp, va_list *ap) _ATTRIBUTE((__weak__)); + +#endif diff --git a/lib/stdio/open_memstream.c b/lib/stdio/open_memstream.c new file mode 100644 index 0000000..e3a52ed --- /dev/null +++ b/lib/stdio/open_memstream.c @@ -0,0 +1,405 @@ +/* Copyright (C) 2007 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* +FUNCTION +<>, <>---open a write stream around an arbitrary-length string + +INDEX + open_memstream +INDEX + open_wmemstream + +SYNOPSIS + #include + FILE *open_memstream(char **restrict <[buf]>, + size_t *restrict <[size]>); + + #include + FILE *open_wmemstream(wchar_t **restrict <[buf]>, + size_t *restrict <[size]>); + +DESCRIPTION +<> creates a seekable, byte-oriented <> stream that +wraps an arbitrary-length buffer, created as if by <>. The current +contents of *<[buf]> are ignored; this implementation uses *<[size]> +as a hint of the maximum size expected, but does not fail if the hint +was wrong. The parameters <[buf]> and <[size]> are later stored +through following any call to <> or <>, set to the +current address and usable size of the allocated string; although +after fflush, the pointer is only valid until another stream operation +that results in a write. Behavior is undefined if the user alters +either *<[buf]> or *<[size]> prior to <>. + +<> is like <> just with the associated +stream being wide-oriented. The size set in <[size]> in subsequent +operations is the number of wide characters. + +The stream is write-only, since the user can directly read *<[buf]> +after a flush; see <> for a way to wrap a string with a +readable stream. The user is responsible for calling <> on +the final *<[buf]> after <>. + +Any time the stream is flushed, a NUL byte is written at the current +position (but is not counted in the buffer length), so that the string +is always NUL-terminated after at most *<[size]> bytes (or wide characters +in case of <>). However, data previously written beyond +the current stream offset is not lost, and the NUL value written during a +flush is restored to its previous value when seeking elsewhere in the string. + +RETURNS +The return value is an open FILE pointer on success. On error, +<> is returned, and <> will be set to EINVAL if <[buf]> +or <[size]> is NULL, ENOMEM if memory could not be allocated, or +EMFILE if too many streams are already open. + +PORTABILITY +POSIX.1-2008 + +Supporting OS subroutines required: <>. +*/ + +#include +#include +#include +#include +#include +#include +#include "local.h" + +#ifndef __LARGE64_FILES +# define OFF_T off_t +#else +# define OFF_T _off64_t +#endif + +/* Describe details of an open memstream. */ +typedef struct memstream { + void *storage; /* storage to free on close */ + char **pbuf; /* pointer to the current buffer */ + size_t *psize; /* pointer to the current size, smaller of pos or eof */ + size_t pos; /* current position */ + size_t eof; /* current file size */ + size_t max; /* current malloc buffer size, always > eof */ + union { + char c; + wchar_t w; + } saved; /* saved character that lived at *psize before NUL */ + int8_t wide; /* wide-oriented (>0) or byte-oriented (<0) */ +} memstream; + +/* Write up to non-zero N bytes of BUF into the stream described by COOKIE, + returning the number of bytes written or EOF on failure. */ +static _READ_WRITE_RETURN_TYPE +memwriter (struct _reent *ptr, + void *cookie, + const char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + memstream *c = (memstream *) cookie; + char *cbuf = *c->pbuf; + + /* size_t is unsigned, but off_t is signed. Don't let stream get so + big that user cannot do ftello. */ + if (sizeof (OFF_T) == sizeof (size_t) && (ssize_t) (c->pos + n) < 0) + { + _REENT_ERRNO(ptr) = EFBIG; + return EOF; + } + /* Grow the buffer, if necessary. Choose a geometric growth factor + to avoid quadratic realloc behavior, but use a rate less than + (1+sqrt(5))/2 to accomodate malloc overhead. Overallocate, so + that we can add a trailing \0 without reallocating. The new + allocation should thus be max(prev_size*1.5, c->pos+n+1). */ + if (c->pos + n >= c->max) + { + size_t newsize = c->max * 3 / 2; + if (newsize < c->pos + n + 1) + newsize = c->pos + n + 1; + cbuf = _realloc_r (ptr, cbuf, newsize); + if (! cbuf) + return EOF; /* errno already set to ENOMEM */ + *c->pbuf = cbuf; + c->max = newsize; + } + /* If we have previously done a seek beyond eof, ensure all + intermediate bytes are NUL. */ + if (c->pos > c->eof) + memset (cbuf + c->eof, '\0', c->pos - c->eof); + memcpy (cbuf + c->pos, buf, n); + c->pos += n; + /* If the user has previously written further, remember what the + trailing NUL is overwriting. Otherwise, extend the stream. */ + if (c->pos > c->eof) + c->eof = c->pos; + else if (c->wide > 0) + c->saved.w = *(wchar_t *)(cbuf + c->pos); + else + c->saved.c = cbuf[c->pos]; + cbuf[c->pos] = '\0'; + *c->psize = (c->wide > 0) ? c->pos / sizeof (wchar_t) : c->pos; + return n; +} + +/* Seek to position POS relative to WHENCE within stream described by + COOKIE; return resulting position or fail with EOF. */ +static _fpos_t +memseeker (struct _reent *ptr, + void *cookie, + _fpos_t pos, + int whence) +{ + memstream *c = (memstream *) cookie; + OFF_T offset = (OFF_T) pos; + + if (whence == SEEK_CUR) + offset += c->pos; + else if (whence == SEEK_END) + offset += c->eof; + if (offset < 0) + { + _REENT_ERRNO(ptr) = EINVAL; + offset = -1; + } + else if ((size_t) offset != offset) + { + _REENT_ERRNO(ptr) = ENOSPC; + offset = -1; + } +#ifdef __LARGE64_FILES + else if ((_fpos_t) offset != offset) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + offset = -1; + } +#endif /* __LARGE64_FILES */ + else + { + if (c->pos < c->eof) + { + if (c->wide > 0) + *(wchar_t *)((*c->pbuf) + c->pos) = c->saved.w; + else + (*c->pbuf)[c->pos] = c->saved.c; + c->saved.w = L'\0'; + } + c->pos = offset; + if (c->pos < c->eof) + { + if (c->wide > 0) + { + c->saved.w = *(wchar_t *)((*c->pbuf) + c->pos); + *(wchar_t *)((*c->pbuf) + c->pos) = L'\0'; + *c->psize = c->pos / sizeof (wchar_t); + } + else + { + c->saved.c = (*c->pbuf)[c->pos]; + (*c->pbuf)[c->pos] = '\0'; + *c->psize = c->pos; + } + } + else if (c->wide > 0) + *c->psize = c->eof / sizeof (wchar_t); + else + *c->psize = c->eof; + } + return (_fpos_t) offset; +} + +/* Seek to position POS relative to WHENCE within stream described by + COOKIE; return resulting position or fail with EOF. */ +#ifdef __LARGE64_FILES +static _fpos64_t +memseeker64 (struct _reent *ptr, + void *cookie, + _fpos64_t pos, + int whence) +{ + _off64_t offset = (_off64_t) pos; + memstream *c = (memstream *) cookie; + + if (whence == SEEK_CUR) + offset += c->pos; + else if (whence == SEEK_END) + offset += c->eof; + if (offset < 0) + { + _REENT_ERRNO(ptr) = EINVAL; + offset = -1; + } + else if ((size_t) offset != offset) + { + _REENT_ERRNO(ptr) = ENOSPC; + offset = -1; + } + else + { + if (c->pos < c->eof) + { + if (c->wide > 0) + *(wchar_t *)((*c->pbuf) + c->pos) = c->saved.w; + else + (*c->pbuf)[c->pos] = c->saved.c; + c->saved.w = L'\0'; + } + c->pos = offset; + if (c->pos < c->eof) + { + if (c->wide > 0) + { + c->saved.w = *(wchar_t *)((*c->pbuf) + c->pos); + *(wchar_t *)((*c->pbuf) + c->pos) = L'\0'; + *c->psize = c->pos / sizeof (wchar_t); + } + else + { + c->saved.c = (*c->pbuf)[c->pos]; + (*c->pbuf)[c->pos] = '\0'; + *c->psize = c->pos; + } + } + else if (c->wide > 0) + *c->psize = c->eof / sizeof (wchar_t); + else + *c->psize = c->eof; + } + return (_fpos64_t) offset; +} +#endif /* __LARGE64_FILES */ + +/* Reclaim resources used by stream described by COOKIE. */ +static int +memcloser (struct _reent *ptr, + void *cookie) +{ + memstream *c = (memstream *) cookie; + char *buf; + + /* Be nice and try to reduce any unused memory. */ + buf = _realloc_r (ptr, *c->pbuf, + c->wide > 0 ? (*c->psize + 1) * sizeof (wchar_t) + : *c->psize + 1); + if (buf) + *c->pbuf = buf; + _free_r (ptr, c->storage); + return 0; +} + +/* Open a memstream that tracks a dynamic buffer in BUF and SIZE. + Return the new stream, or fail with NULL. */ +static FILE * +internal_open_memstream_r (struct _reent *ptr, + char **buf, + size_t *size, + int wide) +{ + FILE *fp; + memstream *c; + + if (!buf || !size) + { + _REENT_ERRNO(ptr) = EINVAL; + return NULL; + } + if ((fp = __sfp (ptr)) == NULL) + return NULL; + if ((c = (memstream *) _malloc_r (ptr, sizeof *c)) == NULL) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + return NULL; + } + /* Use *size as a hint for initial sizing, but bound the initial + malloc between 64 bytes (same as asprintf, to avoid frequent + mallocs on small strings) and 64k bytes (to avoid overusing the + heap if *size was garbage). */ + c->max = *size; + if (wide == 1) + c->max *= sizeof(wchar_t); + if (c->max < 64) + c->max = 64; +#if (SIZE_MAX >= 64 * 1024) + else if (c->max > (size_t)64 * 1024) + c->max = (size_t)64 * 1024; +#endif + *size = 0; + *buf = _malloc_r (ptr, c->max); + if (!*buf) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + _free_r (ptr, c); + return NULL; + } + if (wide == 1) + **((wchar_t **)buf) = L'\0'; + else + **buf = '\0'; + + c->storage = c; + c->pbuf = buf; + c->psize = size; + c->pos = 0; + c->eof = 0; + c->saved.w = L'\0'; + c->wide = (int8_t) wide; + + _newlib_flockfile_start (fp); + fp->_file = -1; + fp->_flags = __SWR; + fp->_cookie = c; + fp->_read = NULL; + fp->_write = memwriter; + fp->_seek = memseeker; +#ifdef __LARGE64_FILES + fp->_seek64 = memseeker64; + fp->_flags |= __SL64; +#endif + fp->_close = memcloser; + ORIENT (fp, wide); + _newlib_flockfile_end (fp); + return fp; +} + +FILE * +_open_memstream_r (struct _reent *ptr, + char **buf, + size_t *size) +{ + return internal_open_memstream_r (ptr, buf, size, -1); +} + +FILE * +_open_wmemstream_r (struct _reent *ptr, + wchar_t **buf, + size_t *size) +{ + return internal_open_memstream_r (ptr, (char **)buf, size, 1); +} + +#ifndef _REENT_ONLY +FILE * +open_memstream (char **buf, + size_t *size) +{ + return _open_memstream_r (_REENT, buf, size); +} + +FILE * +open_wmemstream (wchar_t **buf, + size_t *size) +{ + return _open_wmemstream_r (_REENT, buf, size); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/perror.c b/lib/stdio/perror.c new file mode 100644 index 0000000..2033a6f --- /dev/null +++ b/lib/stdio/perror.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---print an error message on standard error + +INDEX + perror +INDEX + _perror_r + +SYNOPSIS + #include + void perror(char *<[prefix]>); + + void _perror_r(struct _reent *<[reent]>, char *<[prefix]>); + +DESCRIPTION +Use <> to print (on standard error) an error message +corresponding to the current value of the global variable <>. +Unless you use <> as the value of the argument <[prefix]>, the +error message will begin with the string at <[prefix]>, followed by a +colon and a space (<<: >>). The remainder of the error message is one +of the strings described for <>. + +The alternate function <<_perror_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<> returns no result. + +PORTABILITY +ANSI C requires <>, but the strings issued vary from one +implementation to another. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#define WRITE_STR(str) \ +{ \ + const char *p = (str); \ + size_t len = strlen (p); \ + while (len) \ + { \ + ssize_t len1 = _write_r (ptr, fileno (fp), p, len); \ + if (len1 < 0) \ + break; \ + len -= len1; \ + p += len1; \ + } \ +} + +void +_perror_r (struct _reent *ptr, + const char *s) +{ + char *error; + int dummy; + FILE *fp = _stderr_r (ptr); + + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start(fp); + _fflush_r (ptr, fp); + if (s != NULL && *s != '\0') + { + WRITE_STR (s); + WRITE_STR (": "); + } + + if ((error = _strerror_r (ptr, _REENT_ERRNO(ptr), 1, &dummy)) != NULL) + WRITE_STR (error); + +#ifdef __SCLE + WRITE_STR ((fp->_flags & __SCLE) ? "\r\n" : "\n"); +#else + WRITE_STR ("\n"); +#endif + fp->_flags &= ~__SOFF; + _newlib_flockfile_end(fp); +} + +#ifndef _REENT_ONLY + +void +perror (const char *s) +{ + _perror_r (_REENT, s); +} + +#endif diff --git a/lib/stdio/printf.c b/lib/stdio/printf.c new file mode 100644 index 0000000..3a07164 --- /dev/null +++ b/lib/stdio/printf.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in sprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +int +_printf_r (struct _reent *ptr, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +_iprintf_r (struct _reent *, const char *, ...) + _ATTRIBUTE ((__alias__("_printf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +printf (const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + struct _reent *ptr = _REENT; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +iprintf (const char *, ...) + _ATTRIBUTE ((__alias__("printf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/putc.c b/lib/stdio/putc.c new file mode 100644 index 0000000..6a410e2 --- /dev/null +++ b/lib/stdio/putc.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---write a character (macro) + +INDEX + putc +INDEX + _putc_r + +SYNOPSIS + #include + int putc(int <[ch]>, FILE *<[fp]>); + + #include + int _putc_r(struct _reent *<[ptr]>, int <[ch]>, FILE *<[fp]>); + +DESCRIPTION +<> is a macro, defined in <>. <> +writes the argument <[ch]> to the file or stream identified by +<[fp]>, after converting it from an <> to an <>. + +If the file was opened with append mode (or if the stream cannot +support positioning), then the new character goes at the end of the +file or stream. Otherwise, the new character is written at the +current value of the position indicator, and the position indicator +advances by one. + +For a subroutine version of this macro, see <>. + +The <<_putc_r>> function is simply the reentrant version of +<> that takes an additional reentrant structure argument: <[ptr]>. + +RETURNS +If successful, <> returns its argument <[ch]>. If an error +intervenes, the result is <>. You can use `<)>>' to +query for errors. + +PORTABILITY +ANSI C requires <>; it suggests, but does not require, that +<> be implemented as a macro. The standard explicitly permits +macro implementations of <> to use the <[fp]> argument more than once; +therefore, in a portable program, you should not use an expression +with side effects as this argument. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include "local.h" + +/* + * A subroutine version of the macro putc. + */ + +#undef putc + +int +_putc_r (struct _reent *ptr, + int c, + register FILE *fp) +{ + int result; + CHECK_INIT (ptr, fp); + _newlib_flockfile_start (fp); + result = __sputc_r (ptr, c, fp); + _newlib_flockfile_end (fp); + return result; +} + +#ifndef _REENT_ONLY +int +putc (int c, + register FILE *fp) +{ +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + int result; + struct _reent *reent = _REENT; + + CHECK_INIT (reent, fp); + _newlib_flockfile_start (fp); + result = __sputc_r (reent, c, fp); + _newlib_flockfile_end (fp); + return result; +#else + return _putc_r (_REENT, c, fp); +#endif +} +#endif /* !_REENT_ONLY */ + diff --git a/lib/stdio/putc_u.c b/lib/stdio/putc_u.c new file mode 100644 index 0000000..3bb53e5 --- /dev/null +++ b/lib/stdio/putc_u.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---non-thread-safe version of putc (macro) + +INDEX + putc_unlocked +INDEX + _putc_unlocked_r + +SYNOPSIS + #include + int putc_unlocked(int <[ch]>, FILE *<[fp]>); + + #include + int _putc_unlocked_r(struct _reent *<[ptr]>, int <[ch]>, FILE *<[fp]>); + +DESCRIPTION +<> is a non-thread-safe version of <> declared in +<>. <> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). These +functions may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the ( FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The function <<_putc_unlocked_r>> is simply the reentrant version of +<> that takes an additional reentrant structure pointer +argument: <[ptr]>. + +RETURNS +See <>. + +PORTABILITY +POSIX 1003.1 requires <>. <> may be +implemented as a macro, so arguments should not have side-effects. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include + +/* + * A subroutine version of the macro putc_unlocked. + */ + +#undef putc_unlocked + +int +_putc_unlocked_r (struct _reent *ptr, + int c, + register FILE *fp) +{ + /* CHECK_INIT is (eventually) called by __swbuf. */ + + return __sputc_r (ptr, c, fp); +} + +#ifndef _REENT_ONLY +int +putc_unlocked (int c, + register FILE *fp) +{ + /* CHECK_INIT is (eventually) called by __swbuf. */ + + return __sputc_r (_REENT, c, fp); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/putchar.c b/lib/stdio/putchar.c new file mode 100644 index 0000000..6e1b1f1 --- /dev/null +++ b/lib/stdio/putchar.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---write a character (macro) + +INDEX + putchar +INDEX + _putchar_r + +SYNOPSIS + #include + int putchar(int <[ch]>); + + int _putchar_r(struct _reent *<[reent]>, int <[ch]>); + +DESCRIPTION +<> is a macro, defined in <>. <> +writes its argument to the standard output stream, +after converting it from an <> to an <>. + +The alternate function <<_putchar_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +If successful, <> returns its argument <[ch]>. If an error +intervenes, the result is <>. You can use `<>' to +query for errors. + +PORTABILITY +ANSI C requires <>; it suggests, but does not require, that +<> be implemented as a macro. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * A subroutine version of the macro putchar. + */ + +#include <_ansi.h> +#include +#include +#include "local.h" + +#undef putchar + +int +_putchar_r (struct _reent *ptr, + int c) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return _putc_r (ptr, c, _stdout_r (ptr)); +} + +#ifndef _REENT_ONLY + +int +putchar (int c) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return _putc_r (reent, c, _stdout_r (reent)); +} + +#endif diff --git a/lib/stdio/putchar_u.c b/lib/stdio/putchar_u.c new file mode 100644 index 0000000..0292435 --- /dev/null +++ b/lib/stdio/putchar_u.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---non-thread-safe version of putchar (macro) + +INDEX + putchar_unlocked + +SYNOPSIS + #include + int putchar_unlocked(int <[ch]>); + +DESCRIPTION +<> is a non-thread-safe version of <> +declared in <>. <> may only safely be used +within a scope protected by flockfile() (or ftrylockfile()) and +funlockfile(). These functions may safely be used in a multi-threaded +program if and only if they are called while the invoking thread owns +the ( FILE *) object, as is the case after a successful call to the +flockfile() or ftrylockfile() functions. If threads are disabled, +then <> is equivalent to <>. + +RETURNS +See <>. + +PORTABILITY +POSIX 1003.1 requires <>. <> may +be implemented as a macro. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * A subroutine version of the macro putchar_unlocked. + */ + +#include <_ansi.h> +#include +#include + +#undef putchar_unlocked + +int +_putchar_unlocked_r (struct _reent *ptr, + int c) +{ + return putc_unlocked (c, _stdout_r (ptr)); +} + +#ifndef _REENT_ONLY + +int +putchar_unlocked (int c) +{ + /* CHECK_INIT is (eventually) called by __swbuf. */ + + return _putchar_unlocked_r (_REENT, c); +} + +#endif diff --git a/lib/stdio/puts.c b/lib/stdio/puts.c new file mode 100644 index 0000000..d4d7b7f --- /dev/null +++ b/lib/stdio/puts.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---write a character string + +INDEX + puts +INDEX + _puts_r + +SYNOPSIS + #include + int puts(const char *<[s]>); + + int _puts_r(struct _reent *<[reent]>, const char *<[s]>); + +DESCRIPTION +<> writes the string at <[s]> (followed by a newline, instead of +the trailing null) to the standard output stream. + +The alternate function <<_puts_r>> is a reentrant version. The extra +argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +If successful, the result is a nonnegative integer; otherwise, the +result is <>. + +PORTABILITY +ANSI C requires <>, but does not specify that the result on +success must be <<0>>; any non-negative value is permitted. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include "fvwrite.h" +#include "local.h" + +/* + * Write the given string to stdout, appending a newline. + */ + +int +_puts_r (struct _reent *ptr, + const char * s) +{ +#ifdef _FVWRITE_IN_STREAMIO + int result; + size_t c = strlen (s); + struct __suio uio; + struct __siov iov[2]; + FILE *fp; + + iov[0].iov_base = s; + iov[0].iov_len = c; + iov[1].iov_base = "\n"; + iov[1].iov_len = 1; + uio.uio_resid = c + 1; + uio.uio_iov = &iov[0]; + uio.uio_iovcnt = 2; + + _REENT_SMALL_CHECK_INIT (ptr); + fp = _stdout_r (ptr); + CHECK_INIT (ptr, fp); + _newlib_flockfile_start (fp); + ORIENT (fp, -1); + result = (__sfvwrite_r (ptr, fp, &uio) ? EOF : '\n'); + _newlib_flockfile_end (fp); + return result; +#else + int result = EOF; + const char *p = s; + FILE *fp; + _REENT_SMALL_CHECK_INIT (ptr); + + fp = _stdout_r (ptr); + CHECK_INIT (ptr, fp); + _newlib_flockfile_start (fp); + ORIENT (fp, -1); + /* Make sure we can write. */ + if (cantwrite (ptr, fp)) + goto err; + + while (*p) + { + if (__sputc_r (ptr, *p++, fp) == EOF) + goto err; + } + if (__sputc_r (ptr, '\n', fp) == EOF) + goto err; + + result = '\n'; + +err: + _newlib_flockfile_end (fp); + return result; +#endif +} + +#ifndef _REENT_ONLY + +int +puts (char const * s) +{ + return _puts_r (_REENT, s); +} + +#endif diff --git a/lib/stdio/putw.c b/lib/stdio/putw.c new file mode 100644 index 0000000..bec9aa2 --- /dev/null +++ b/lib/stdio/putw.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---write a word (int) + +INDEX + putw + +SYNOPSIS + #include + int putw(int <[w]>, FILE *<[fp]>); + +DESCRIPTION +<> is a function, defined in <>. You can use <> +to write a word to the file or stream identified by <[fp]>. As a side +effect, <> advances the file's current position indicator. + +RETURNS +Zero on success, <> on failure. + +PORTABILITY +<> is a remnant of K&R C; it is not part of any ISO C Standard. +<> should be used instead. In fact, this implementation of +<> is based upon <>. + +Supporting OS subroutines required: <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include + +int +putw (int w, + register FILE *fp) +{ + if (fwrite ((const char*)&w, sizeof (w), 1, fp) != 1) + return EOF; + return 0; +} diff --git a/lib/stdio/putwc.c b/lib/stdio/putwc.c new file mode 100644 index 0000000..a6c3100 --- /dev/null +++ b/lib/stdio/putwc.c @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef putwc + +wint_t +_putwc_r (struct _reent *ptr, + wchar_t wc, + FILE *fp) +{ + return _fputwc_r (ptr, wc, fp); +} +/* + * Synonym for fputwc(). The only difference is that putwc(), if it is a + * macro, may evaluate `fp' more than once. + */ +wint_t +putwc (wchar_t wc, + FILE *fp) +{ + return fputwc (wc, fp); +} diff --git a/lib/stdio/putwc_u.c b/lib/stdio/putwc_u.c new file mode 100644 index 0000000..0ec11f0 --- /dev/null +++ b/lib/stdio/putwc_u.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef putwc_unlocked + +wint_t +_putwc_unlocked_r (struct _reent *ptr, + wchar_t wc, + FILE *fp) +{ + return _fputwc_unlocked_r (ptr, wc, fp); +} +/* + * Synonym for fputwc_unlocked(). The only difference is that putwc_unlocked(), + * if it is a macro, may evaluate `fp' more than once. + */ +wint_t +putwc_unlocked (wchar_t wc, + FILE *fp) +{ + return fputwc_unlocked (wc, fp); +} diff --git a/lib/stdio/putwchar.c b/lib/stdio/putwchar.c new file mode 100644 index 0000000..238cb50 --- /dev/null +++ b/lib/stdio/putwchar.c @@ -0,0 +1,104 @@ +/*- + * Copyright (c) 2002 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>---write a wide character to standard output + +INDEX + putwchar +INDEX + putwchar_unlocked +INDEX + _putwchar_r +INDEX + _putwchar_unlocked_r + +SYNOPSIS + #include + wint_t putwchar(wchar_t <[wc]>); + + #include + wint_t putwchar_unlocked(wchar_t <[wc]>); + + #include + wint_t _putwchar_r(struct _reent *<[reent]>, wchar_t <[wc]>); + + #include + wint_t _putwchar_unlocked_r(struct _reent *<[reent]>, wchar_t <[wc]>); + +DESCRIPTION +The <> function or macro is the wide-character equivalent of +the <> function. It writes the wide character wc to stdout. + +<> is a non-thread-safe version of <>. +<> may only safely be used within a scope +protected by flockfile() (or ftrylockfile()) and funlockfile(). This +function may safely be used in a multi-threaded program if and only +if they are called while the invoking thread owns the (FILE *) +object, as is the case after a successful call to the flockfile() or +ftrylockfile() functions. If threads are disabled, then +<> is equivalent to <>. + +The alternate functions <<_putwchar_r>> and <<_putwchar_unlocked_r>> are +reentrant versions of the above. The extra argument <[reent]> is a pointer +to a reentrancy structure. + +RETURNS +If successful, <> returns its argument <[wc]>. If an error +intervenes, the result is <>. You can use `<>' to +query for errors. + +PORTABILITY +<> is required by C99. + +<> is a GNU extension. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef putwchar + +wint_t +_putwchar_r (struct _reent *ptr, + wchar_t wc) +{ + return _fputwc_r (ptr, wc, stdout); +} + +/* + * Synonym for fputwc(wc, stdout). + */ +wint_t +putwchar (wchar_t wc) +{ + _REENT_SMALL_CHECK_INIT (_REENT); + return fputwc (wc, stdout); +} diff --git a/lib/stdio/putwchar_u.c b/lib/stdio/putwchar_u.c new file mode 100644 index 0000000..a5e6a57 --- /dev/null +++ b/lib/stdio/putwchar_u.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014 Red Hat, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#undef putwchar_unlocked + +wint_t +_putwchar_unlocked_r (struct _reent *ptr, + wchar_t wc) +{ + return _fputwc_unlocked_r (ptr, wc, stdout); +} + +/* + * Synonym for fputwc_unlocked(wc, stdout). + */ +wint_t +putwchar_unlocked (wchar_t wc) +{ + _REENT_SMALL_CHECK_INIT (_REENT); + return fputwc_unlocked (wc, stdout); +} diff --git a/lib/stdio/refill.c b/lib/stdio/refill.c new file mode 100644 index 0000000..7bd3880 --- /dev/null +++ b/lib/stdio/refill.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +static int +lflush (struct _reent * ptr __unused, FILE *fp) +{ + if ((fp->_flags & (__SLBF | __SWR)) == (__SLBF | __SWR)) + return _fflush_r (_REENT, fp); + return 0; +} + +/* + * Refill a stdio buffer. + * Return EOF on eof or error, 0 otherwise. + */ + +int +__srefill_r (struct _reent * ptr, + register FILE * fp) +{ + /* make sure stdio is set up */ + + CHECK_INIT (ptr, fp); + + ORIENT (fp, -1); + + fp->_r = 0; /* largely a convenience for callers */ + + /* SysV does not make this test; take it out for compatibility */ + if (fp->_flags & __SEOF) + return EOF; + + /* if not already reading, have to be reading and writing */ + if ((fp->_flags & __SRD) == 0) + { + if ((fp->_flags & __SRW) == 0) + { + _REENT_ERRNO(ptr) = EBADF; + fp->_flags |= __SERR; + return EOF; + } + /* switch to reading */ + if (fp->_flags & __SWR) + { + if (_fflush_r (ptr, fp)) + return EOF; + fp->_flags &= ~__SWR; + fp->_w = 0; + fp->_lbfsize = 0; + } + fp->_flags |= __SRD; + } + else + { + /* + * We were reading. If there is an ungetc buffer, + * we must have been reading from that. Drop it, + * restoring the previous buffer (if any). If there + * is anything in that buffer, return. + */ + if (HASUB (fp)) + { + FREEUB (ptr, fp); + if ((fp->_r = fp->_ur) != 0) + { + fp->_p = fp->_up; + return 0; + } + } + } + + if (fp->_bf._base == NULL) + __smakebuf_r (ptr, fp); + + /* + * Before reading from a line buffered or unbuffered file, + * flush all line buffered output files, per the ANSI C + * standard. + */ + if (fp->_flags & (__SLBF | __SNBF)) + { + /* Ignore this file in _fwalk_sglue to avoid potential deadlock. */ + short orig_flags = fp->_flags; + fp->_flags = 1; + (void) _fwalk_sglue (_GLOBAL_REENT, lflush, &__sglue); + fp->_flags = orig_flags; + + /* Now flush this file without locking it. */ + if ((fp->_flags & (__SLBF|__SWR)) == (__SLBF|__SWR)) + __sflush_r (ptr, fp); + } + + fp->_p = fp->_bf._base; + fp->_r = fp->_read (ptr, fp->_cookie, (char *) fp->_p, fp->_bf._size); + if (fp->_r <= 0) + { + if (fp->_r == 0) + fp->_flags |= __SEOF; + else + { + fp->_r = 0; + fp->_flags |= __SERR; + } + return EOF; + } + return 0; +} diff --git a/lib/stdio/remove.c b/lib/stdio/remove.c new file mode 100644 index 0000000..d8dfdbd --- /dev/null +++ b/lib/stdio/remove.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---delete a file's name + +INDEX + remove +INDEX + _remove_r + +SYNOPSIS + #include + int remove(char *<[filename]>); + + int _remove_r(struct _reent *<[reent]>, char *<[filename]>); + +DESCRIPTION +Use <> to dissolve the association between a particular +filename (the string at <[filename]>) and the file it represents. +After calling <> with a particular filename, you will no +longer be able to open the file by that name. + +In this implementation, you may use <> on an open file without +error; existing file descriptors for the file will continue to access +the file's data until the program using them closes the file. + +The alternate function <<_remove_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<> returns <<0>> if it succeeds, <<-1>> if it fails. + +PORTABILITY +ANSI C requires <>, but only specifies that the result on +failure be nonzero. The behavior of <> when you call it on an +open file may vary among implementations. + +Supporting OS subroutine required: <>. +*/ + +#include <_ansi.h> +#include +#include + +int +_remove_r (struct _reent *ptr, + const char *filename) +{ + if (_unlink_r (ptr, filename) == -1) + return -1; + + return 0; +} + +#ifndef _REENT_ONLY + +int +remove (const char *filename) +{ + return _remove_r (_REENT, filename); +} + +#endif diff --git a/lib/stdio/rename.c b/lib/stdio/rename.c new file mode 100644 index 0000000..16ef3e3 --- /dev/null +++ b/lib/stdio/rename.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---rename a file + +INDEX + rename + +SYNOPSIS + #include + int rename(const char *<[old]>, const char *<[new]>); + +DESCRIPTION +Use <> to establish a new name (the string at <[new]>) for a +file now known by the string at <[old]>. After a successful +<>, the file is no longer accessible by the string at <[old]>. + +If <> fails, the file named <<*<[old]>>> is unaffected. The +conditions for failure depend on the host operating system. + +RETURNS +The result is either <<0>> (when successful) or <<-1>> (when the file +could not be renamed). + +PORTABILITY +ANSI C requires <>, but only specifies that the result on +failure be nonzero. The effects of using the name of an existing file +as <<*<[new]>>> may vary from one implementation to another. + +Supporting OS subroutines required: <>, <>, or <>. +*/ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +int +rename (const char *old, + const char *new) +{ + return _rename_r (_REENT, old, new); +} + +#endif diff --git a/lib/stdio/rewind.c b/lib/stdio/rewind.c new file mode 100644 index 0000000..aafac0c --- /dev/null +++ b/lib/stdio/rewind.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---reinitialize a file or stream + +INDEX + rewind +INDEX + _rewind_r + +SYNOPSIS + #include + void rewind(FILE *<[fp]>); + void _rewind_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +<> returns the file position indicator (if any) for the file +or stream identified by <[fp]> to the beginning of the file. It also +clears any error indicator and flushes any pending output. + +RETURNS +<> does not return a result. + +PORTABILITY +ANSI C requires <>. + +No supporting OS subroutines are required. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include + +void +_rewind_r (struct _reent * ptr, + register FILE * fp) +{ + (void) _fseek_r (ptr, fp, 0L, SEEK_SET); + clearerr (fp); +} + +#ifndef _REENT_ONLY + +void +rewind (register FILE * fp) +{ + _rewind_r (_REENT, fp); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/rget.c b/lib/stdio/rget.c new file mode 100644 index 0000000..a9a0d2f --- /dev/null +++ b/lib/stdio/rget.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include "local.h" + +/* + * Handle getc() when the buffer ran out: + * Refill, then return the first character + * in the newly-filled buffer. + */ + +int +__srget_r (struct _reent *ptr, + register FILE *fp) +{ + /* Ensure that any fake std stream is resolved before + we call __srefill_r so we may access the true read buffer. */ + CHECK_INIT(ptr, fp); + + if (__srefill_r (ptr, fp) == 0) + { + fp->_r--; + return *fp->_p++; + } + return EOF; +} + +/* This function isn't any longer declared in stdio.h, but it's + required for backward compatibility with applications built against + earlier dynamically built newlib libraries. */ +int +__srget (register FILE *fp) +{ + return __srget_r (_REENT, fp); +} diff --git a/lib/stdio/scanf.c b/lib/stdio/scanf.c new file mode 100644 index 0000000..a9d23b9 --- /dev/null +++ b/lib/stdio/scanf.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +scanf(const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + va_start (ap, fmt); + ret = _vfscanf_r (reent, _stdin_r (reent), fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +iscanf (const char *, ...) + _ATTRIBUTE ((__alias__("scanf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_scanf_r(struct _reent *ptr, const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfscanf_r (ptr, _stdin_r (ptr), fmt, ap); + va_end (ap); + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +_iscanf_r (struct _reent *, const char *, ...) + _ATTRIBUTE ((__alias__("_scanf_r"))); +#endif diff --git a/lib/stdio/sccl.c b/lib/stdio/sccl.c new file mode 100644 index 0000000..dd705e4 --- /dev/null +++ b/lib/stdio/sccl.c @@ -0,0 +1,126 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Split from vfscanf.c */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +/* + * Fill in the given table from the scanset at the given format + * (just after `['). Return a pointer to the character past the + * closing `]'. The table has a 1 wherever characters should be + * considered part of the scanset. + */ + +u_char * +__sccl (register char *tab, + register u_char *fmt) +{ + register int c, n, v; + + /* first `clear' the whole table */ + c = *fmt++; /* first char hat => negated scanset */ + if (c == '^') + { + v = 1; /* default => accept */ + c = *fmt++; /* get new first char */ + } + else + v = 0; /* default => reject */ + /* should probably use memset here */ + for (n = 0; n < 256; n++) + tab[n] = v; + if (c == 0) + return fmt - 1; /* format ended before closing ] */ + + /* + * Now set the entries corresponding to the actual scanset to the + * opposite of the above. + * + * The first character may be ']' (or '-') without being special; the + * last character may be '-'. + */ + + v = 1 - v; + for (;;) + { + tab[c] = v; /* take character c */ + doswitch: + n = *fmt++; /* and examine the next */ + switch (n) + { + + case 0: /* format ended too soon */ + return fmt - 1; + + case '-': + /* + * A scanset of the form [01+-] is defined as `the digit 0, the + * digit 1, the character +, the character -', but the effect of a + * scanset such as [a-zA-Z0-9] is implementation defined. The V7 + * Unix scanf treats `a-z' as `the letters a through z', but treats + * `a-a' as `the letter a, the character -, and the letter a'. + * + * For compatibility, the `-' is not considerd to define a range if + * the character following it is either a close bracket (required by + * ANSI) or is not numerically greater than the character we just + * stored in the table (c). + */ + n = *fmt; + if (n == ']' || n < c) + { + c = '-'; + break; /* resume the for(;;) */ + } + fmt++; + do + { /* fill in the range */ + tab[++c] = v; + } + while (c < n); +#if 1 /* XXX another disgusting compatibility hack */ + /* + * Alas, the V7 Unix scanf also treats formats such + * as [a-c-e] as `the letters a through e'. This too + * is permitted by the standard.... + */ + goto doswitch; +#else + c = *fmt++; + if (c == 0) + return fmt - 1; + if (c == ']') + return fmt; +#endif + + break; + + + case ']': /* end of scanset */ + return fmt; + + default: /* just another character */ + c = n; + break; + } + } + /* NOTREACHED */ +} diff --git a/lib/stdio/setbuf.c b/lib/stdio/setbuf.c new file mode 100644 index 0000000..92739ee --- /dev/null +++ b/lib/stdio/setbuf.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---specify full buffering for a file or stream + +INDEX + setbuf + +SYNOPSIS + #include + void setbuf(FILE *<[fp]>, char *<[buf]>); + +DESCRIPTION +<> specifies that output to the file or stream identified by <[fp]> +should be fully buffered. All output for this file will go to a +buffer (of size <>, specified in `<>'). Output will +be passed on to the host system only when the buffer is full, or when +an input operation intervenes. + +You may, if you wish, supply your own buffer by passing a pointer to +it as the argument <[buf]>. It must have size <>. You can +also use <> as the value of <[buf]>, to signal that the +<> function is to allocate the buffer. + +WARNINGS +You may only use <> before performing any file operation other +than opening the file. + +If you supply a non-null <[buf]>, you must ensure that the associated +storage continues to be available until you close the stream +identified by <[fp]>. + +RETURNS +<> does not return a result. + +PORTABILITY +Both ANSI C and the System V Interface Definition (Issue 2) require +<>. However, they differ on the meaning of a <> buffer +pointer: the SVID issue 2 specification says that a <> buffer +pointer requests unbuffered output. For maximum portability, avoid +<> buffer pointers. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include "local.h" + +void +setbuf (FILE *__restrict fp, + char *__restrict buf) +{ + (void) setvbuf (fp, buf, buf ? _IOFBF : _IONBF, BUFSIZ); +} diff --git a/lib/stdio/setbuffer.c b/lib/stdio/setbuffer.c new file mode 100644 index 0000000..de0a480 --- /dev/null +++ b/lib/stdio/setbuffer.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* +Modified copy of setbuf.c to support the setbuffer function +defined as part of BSD. +Modifications by Gareth Pearce, 2001. +*/ + +/* +FUNCTION +<>---specify full buffering for a file or stream with size + +INDEX + setbuffer + +SYNOPSIS + #include + void setbuffer(FILE *<[fp]>, char *<[buf]>, int <[size]>); + +DESCRIPTION +<> specifies that output to the file or stream identified by +<[fp]> should be fully buffered. All output for this file will go to a +buffer (of size <[size]>). Output will be passed on to the host system +only when the buffer is full, or when an input operation intervenes. + +You may, if you wish, supply your own buffer by passing a pointer to +it as the argument <[buf]>. It must have size <[size]>. You can +also use <> as the value of <[buf]>, to signal that the +<> function is to allocate the buffer. + +WARNINGS +You may only use <> before performing any file operation +other than opening the file. + +If you supply a non-null <[buf]>, you must ensure that the associated +storage continues to be available until you close the stream +identified by <[fp]>. + +RETURNS +<> does not return a result. + +PORTABILITY +This function comes from BSD not ANSI or POSIX. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include "local.h" + +void +setbuffer (FILE * fp, + char *buf, + int size) +{ + (void) setvbuf (fp, buf, buf ? _IOFBF : _IONBF, (size_t) size); +} diff --git a/lib/stdio/setlinebuf.c b/lib/stdio/setlinebuf.c new file mode 100644 index 0000000..70c48ad --- /dev/null +++ b/lib/stdio/setlinebuf.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* +Modified copy of setbuf.c to support setlinebuf function +defined as part of BSD. +Modifications by Gareth Pearce, 2001. +*/ + +/* +FUNCTION +<>---specify line buffering for a file or stream + +INDEX + setlinebuf + +SYNOPSIS + #include + void setlinebuf(FILE *<[fp]>); + +DESCRIPTION +<> specifies that output to the file or stream identified by +<[fp]> should be line buffered. This causes the file or stream to pass +on output to the host system at every newline, as well as when the +buffer is full, or when an input operation intervenes. + +WARNINGS +You may only use <> before performing any file operation +other than opening the file. + +RETURNS +<> returns as per setvbuf. + +PORTABILITY +This function comes from BSD not ANSI or POSIX. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include "local.h" + +int +setlinebuf (FILE * fp) +{ + return (setvbuf (fp, (char *) NULL, _IOLBF, (size_t) 0)); +} diff --git a/lib/stdio/setvbuf.c b/lib/stdio/setvbuf.c new file mode 100644 index 0000000..e27ea08 --- /dev/null +++ b/lib/stdio/setvbuf.c @@ -0,0 +1,222 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---specify file or stream buffering + +INDEX + setvbuf + +SYNOPSIS + #include + int setvbuf(FILE *<[fp]>, char *<[buf]>, + int <[mode]>, size_t <[size]>); + +DESCRIPTION +Use <> to specify what kind of buffering you want for the +file or stream identified by <[fp]>, by using one of the following +values (from <>) as the <[mode]> argument: + +o+ +o _IONBF +Do not use a buffer: send output directly to the host system for the +file or stream identified by <[fp]>. + +o _IOFBF +Use full output buffering: output will be passed on to the host system +only when the buffer is full, or when an input operation intervenes. + +o _IOLBF +Use line buffering: pass on output to the host system at every +newline, as well as when the buffer is full, or when an input +operation intervenes. +o- + +Use the <[size]> argument to specify how large a buffer you wish. You +can supply the buffer itself, if you wish, by passing a pointer to a +suitable area of memory as <[buf]>. Otherwise, you may pass <> +as the <[buf]> argument, and <> will allocate the buffer. + +WARNINGS +You may only use <> before performing any file operation other +than opening the file. + +If you supply a non-null <[buf]>, you must ensure that the associated +storage continues to be available until you close the stream +identified by <[fp]>. + +RETURNS +A <<0>> result indicates success, <> failure (invalid <[mode]> or +<[size]> can cause failure). + +PORTABILITY +Both ANSI C and the System V Interface Definition (Issue 2) require +<>. However, they differ on the meaning of a <> buffer +pointer: the SVID issue 2 specification says that a <> buffer +pointer requests unbuffered output. For maximum portability, avoid +<> buffer pointers. + +Both specifications describe the result on failure only as a +nonzero value. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include "local.h" + +/* + * Set one of the three kinds of buffering, optionally including a buffer. + */ + +int +setvbuf (register FILE * fp, + char *buf, + register int mode, + register size_t size) +{ + int ret = 0; + struct _reent *reent = _REENT; + size_t iosize; + int ttyflag; + + CHECK_INIT (reent, fp); + + /* + * Verify arguments. The `int' limit on `size' is due to this + * particular implementation. Note, buf and size are ignored + * when setting _IONBF. + */ + if (mode != _IONBF) + if ((mode != _IOFBF && mode != _IOLBF) || (int)(_POINTER_INT) size < 0) + return (EOF); + + + /* + * Write current buffer, if any; drop read count, if any. + * Make sure putc() will not think fp is line buffered. + * Free old buffer if it was from malloc(). Clear line and + * non buffer flags, and clear malloc flag. + */ + _newlib_flockfile_start (fp); + _fflush_r (reent, fp); + if (HASUB(fp)) + FREEUB(reent, fp); + fp->_r = fp->_lbfsize = 0; + if (fp->_flags & __SMBF) + _free_r (reent, (void *) fp->_bf._base); + fp->_flags &= ~(__SLBF | __SNBF | __SMBF | __SOPT | __SNPT | __SEOF); + + if (mode == _IONBF) + goto nbf; + + /* + * Find optimal I/O size for seek optimization. This also returns + * a `tty flag' to suggest that we check isatty(fd), but we do not + * care since our caller told us how to buffer. + */ + fp->_flags |= __swhatbuf_r (reent, fp, &iosize, &ttyflag); + if (size == 0) + { + buf = NULL; + size = iosize; + } + + /* Allocate buffer if needed. */ + if (buf == NULL) + { + if ((buf = malloc (size)) == NULL) + { + /* + * Unable to honor user's request. We will return + * failure, but try again with file system size. + */ + ret = EOF; + if (size != iosize) + { + size = iosize; + buf = malloc (size); + } + } + if (buf == NULL) + { + /* No luck; switch to unbuffered I/O. */ +nbf: + fp->_flags |= __SNBF; + fp->_w = 0; + fp->_bf._base = fp->_p = fp->_nbuf; + fp->_bf._size = 1; + _newlib_flockfile_exit (fp); + return (ret); + } + fp->_flags |= __SMBF; + } + + /* + * We're committed to buffering from here, so make sure we've + * registered to flush buffers on exit. + */ + if (!_REENT_CLEANUP(reent)) + __sinit(reent); + +#ifdef _FSEEK_OPTIMIZATION + /* + * Kill any seek optimization if the buffer is not the + * right size. + * + * SHOULD WE ALLOW MULTIPLES HERE (i.e., ok iff (size % iosize) == 0)? + */ + if (size != iosize) + fp->_flags |= __SNPT; +#endif + + /* + * Fix up the FILE fields, and set __cleanup for output flush on + * exit (since we are buffered in some way). + */ + if (mode == _IOLBF) + fp->_flags |= __SLBF; + fp->_bf._base = fp->_p = (unsigned char *) buf; + fp->_bf._size = size; + /* fp->_lbfsize is still 0 */ + if (fp->_flags & __SWR) + { + /* + * Begin or continue writing: see __swsetup(). Note + * that __SNBF is impossible (it was handled earlier). + */ + if (fp->_flags & __SLBF) + { + fp->_w = 0; + fp->_lbfsize = -fp->_bf._size; + } + else + fp->_w = size; + } + else + { + /* begin/continue reading, or stay in intermediate state */ + fp->_w = 0; + } + + _newlib_flockfile_end (fp); + return 0; +} diff --git a/lib/stdio/siprintf.c b/lib/stdio/siprintf.c new file mode 100644 index 0000000..bd29edd --- /dev/null +++ b/lib/stdio/siprintf.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>, <>, <>, <>---format output (integer only) + +INDEX + fiprintf +INDEX + _fiprintf_r +INDEX + iprintf +INDEX + _iprintf_r +INDEX + siprintf +INDEX + _siprintf_r +INDEX + sniprintf +INDEX + _sniprintf_r +INDEX + asiprintf +INDEX + _asiprintf_r +INDEX + asniprintf +INDEX + _asniprintf_r + +SYNOPSIS + #include + + int iprintf(const char *<[format]>, ...); + int fiprintf(FILE *<[fd]>, const char *<[format]> , ...); + int siprintf(char *<[str]>, const char *<[format]>, ...); + int sniprintf(char *<[str]>, size_t <[size]>, const char *<[format]>, + ...); + int asiprintf(char **<[strp]>, const char *<[format]>, ...); + char *asniprintf(char *<[str]>, size_t *<[size]>, + const char *<[format]>, ...); + + int _iprintf_r(struct _reent *<[ptr]>, const char *<[format]>, ...); + int _fiprintf_r(struct _reent *<[ptr]>, FILE *<[fd]>, + const char *<[format]>, ...); + int _siprintf_r(struct _reent *<[ptr]>, char *<[str]>, + const char *<[format]>, ...); + int _sniprintf_r(struct _reent *<[ptr]>, char *<[str]>, size_t <[size]>, + const char *<[format]>, ...); + int _asiprintf_r(struct _reent *<[ptr]>, char **<[strp]>, + const char *<[format]>, ...); + char *_asniprintf_r(struct _reent *<[ptr]>, char *<[str]>, + size_t *<[size]>, const char *<[format]>, ...); + +DESCRIPTION + <>, <>, <>, <>, + <>, and <> are the same as <>, + <>, <>, <>, <>, and + <>, respectively, except that they restrict usage + to non-floating-point format specifiers. + + <<_iprintf_r>>, <<_fiprintf_r>>, <<_asiprintf_r>>, + <<_siprintf_r>>, <<_sniprintf_r>>, <<_asniprintf_r>> are + simply reentrant versions of the functions above. + +RETURNS +Similar to <>, <>, <>, <>, <>, +and <>. + +PORTABILITY +<>, <>, <>, <>, <>, +and <> are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_siprintf_r (struct _reent *ptr, + char *str, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (ptr, &f, fmt, ap); + va_end (ap); + *f._p = 0; + return (ret); +} + +#ifndef _REENT_ONLY + +int +siprintf (char *str, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (_REENT, &f, fmt, ap); + va_end (ap); + *f._p = 0; + return (ret); +} + +#endif diff --git a/lib/stdio/siscanf.c b/lib/stdio/siscanf.c new file mode 100644 index 0000000..b88b810 --- /dev/null +++ b/lib/stdio/siscanf.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---scan and format non-floating input + +INDEX + iscanf +INDEX + _iscanf_r +INDEX + fiscanf +INDEX + _fiscanf_r +INDEX + siscanf +INDEX + _siscanf_r + +SYNOPSIS + #include + + int iscanf(const char *<[format]>, ...); + int fiscanf(FILE *<[fd]>, const char *<[format]>, ...); + int siscanf(const char *<[str]>, const char *<[format]>, ...); + + int _iscanf_r(struct _reent *<[ptr]>, const char *<[format]>, ...); + int _fiscanf_r(struct _reent *<[ptr]>, FILE *<[fd]>, + const char *<[format]>, ...); + int _siscanf_r(struct _reent *<[ptr]>, const char *<[str]>, + const char *<[format]>, ...); + +DESCRIPTION + <>, <>, and <> are the same as + <>, <>, and <> respectively, only that + they restrict the available formats to non-floating-point + format specifiers. + + The routines <<_iscanf_r>>, <<_fiscanf_r>>, and <<_siscanf_r>> are reentrant + versions of <>, <>, and <> that take an additional + first argument pointing to a reentrancy structure. + +RETURNS + <> returns the number of input fields successfully + scanned, converted and stored; the return value does + not include scanned fields which were not stored. + + If <> attempts to read at end-of-file, the return + value is <>. + + If no fields were stored, the return value is <<0>>. + +PORTABILITY +<>, <>, and <> are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +siscanf (const char *str, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = __ssvfiscanf_r (_REENT, &f, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_siscanf_r (struct _reent *ptr, + const char *str, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = __ssvfiscanf_r (ptr, &f, fmt, ap); + va_end (ap); + return ret; +} diff --git a/lib/stdio/sniprintf.c b/lib/stdio/sniprintf.c new file mode 100644 index 0000000..b05ffcb --- /dev/null +++ b/lib/stdio/sniprintf.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* This code created by modifying snprintf.c so copyright inherited. */ +/* doc in siprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +int +_sniprintf_r (struct _reent *ptr, + char *str, + size_t size, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + if (size > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < EOF) + _REENT_ERRNO(ptr) = EOVERFLOW; + if (size > 0) + *f._p = 0; + return (ret); +} + +#ifndef _REENT_ONLY + +int +sniprintf (char *str, + size_t size, + const char *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + struct _reent *ptr = _REENT; + + if (size > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfiprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < EOF) + _REENT_ERRNO(ptr) = EOVERFLOW; + if (size > 0) + *f._p = 0; + return (ret); +} + +#endif diff --git a/lib/stdio/snprintf.c b/lib/stdio/snprintf.c new file mode 100644 index 0000000..4a3084b --- /dev/null +++ b/lib/stdio/snprintf.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in sprintf.c */ +/* This code created by modifying sprintf.c so copyright inherited. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +int +_snprintf_r (struct _reent *ptr, + char *__restrict str, + size_t size, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + if (size > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < EOF) + _REENT_ERRNO(ptr) = EOVERFLOW; + if (size > 0) + *f._p = 0; + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +_sniprintf_r (struct _reent *, char *, size_t, const char *, ...) + _ATTRIBUTE ((__alias__("_snprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +snprintf (char *__restrict str, + size_t size, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + struct _reent *ptr = _REENT; + + if (size > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (ptr, &f, fmt, ap); + va_end (ap); + if (ret < EOF) + _REENT_ERRNO(ptr) = EOVERFLOW; + if (size > 0) + *f._p = 0; + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +sniprintf (char *, size_t, const char *, ...) + _ATTRIBUTE ((__alias__("snprintf"))); +#endif +#endif diff --git a/lib/stdio/sprintf.c b/lib/stdio/sprintf.c new file mode 100644 index 0000000..be66ec6 --- /dev/null +++ b/lib/stdio/sprintf.c @@ -0,0 +1,629 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>, <>, <>, <>---format output + +INDEX + fprintf +INDEX + _fprintf_r +INDEX + printf +INDEX + _printf_r +INDEX + asprintf +INDEX + _asprintf_r +INDEX + sprintf +INDEX + _sprintf_r +INDEX + snprintf +INDEX + _snprintf_r +INDEX + asnprintf +INDEX + _asnprintf_r + +SYNOPSIS + #include + + int printf(const char *restrict <[format]>, ...); + int fprintf(FILE *restrict <[fd]>, const char *restrict <[format]>, ...); + int sprintf(char *restrict <[str]>, const char *restrict <[format]>, ...); + int snprintf(char *restrict <[str]>, size_t <[size]>, const char *restrict <[format]>, + ...); + int asprintf(char **restrict <[strp]>, const char *restrict <[format]>, ...); + char *asnprintf(char *restrict <[str]>, size_t *restrict <[size]>, const char *restrict <[format]>, + ...); + + int _printf_r(struct _reent *<[ptr]>, const char *restrict <[format]>, ...); + int _fprintf_r(struct _reent *<[ptr]>, FILE *restrict <[fd]>, + const char *restrict <[format]>, ...); + int _sprintf_r(struct _reent *<[ptr]>, char *restrict <[str]>, + const char *restrict <[format]>, ...); + int _snprintf_r(struct _reent *<[ptr]>, char *restrict <[str]>, size_t <[size]>, + const char *restrict <[format]>, ...); + int _asprintf_r(struct _reent *<[ptr]>, char **restrict <[strp]>, + const char *restrict <[format]>, ...); + char *_asnprintf_r(struct _reent *<[ptr]>, char *restrict <[str]>, + size_t *restrict <[size]>, const char *restrict <[format]>, ...); + +DESCRIPTION + <> accepts a series of arguments, applies to each a + format specifier from <<*<[format]>>>, and writes the + formatted data to <>, without a terminating NUL + character. The behavior of <> is undefined if there + are not enough arguments for the format. <> returns + when it reaches the end of the format string. If there are + more arguments than the format requires, excess arguments are + ignored. + + <> is like <>, except that output is directed + to the stream <[fd]> rather than <>. + + <> is like <>, except that output is directed + to the buffer <[str]>, and a terminating NUL is output. + Behavior is undefined if more output is generated than the + buffer can hold. + + <> is like <>, except that output is + limited to at most <[size]> bytes, including the terminating + <>. As a special case, if <[size]> is 0, <[str]> can be + NULL, and <> merely calculates how many bytes would + be printed. + + <> is like <>, except that the output is + stored in a dynamically allocated buffer, <[pstr]>, which + should be freed later with <>. + + <> is like <>, except that the return type + is either the original <[str]> if it was large enough, or a + dynamically allocated string if the output exceeds *<[size]>; + the length of the result is returned in *<[size]>. When + dynamic allocation occurs, the contents of the original + <[str]> may have been modified. + + For <>, <>, and <>, the behavior + is undefined if the output <<*<[str]>>> overlaps with one of + the arguments. Behavior is also undefined if the argument for + <<%n>> within <<*<[format]>>> overlaps another argument. + + <[format]> is a pointer to a character string containing two + types of objects: ordinary characters (other than <<%>>), + which are copied unchanged to the output, and conversion + specifications, each of which is introduced by <<%>>. (To + include <<%>> in the output, use <<%%>> in the format string.) + A conversion specification has the following form: + +. %[<[pos]>][<[flags]>][<[width]>][.<[prec]>][<[size]>]<[type]> + + The fields of the conversion specification have the following + meanings: + + O+ + o <[pos]> + + Conversions normally consume arguments in the order that they + are presented. However, it is possible to consume arguments + out of order, and reuse an argument for more than one + conversion specification (although the behavior is undefined + if the same argument is requested with different types), by + specifying <[pos]>, which is a decimal integer followed by + '$'. The integer must be between 1 and from + limits.h, and if argument <<%n$>> is requested, all earlier + arguments must be requested somewhere within <[format]>. If + positional parameters are used, then all conversion + specifications except for <<%%>> must specify a position. + This positional parameters method is a POSIX extension to the C + standard definition for the functions. + + o <[flags]> + + <[flags]> is an optional sequence of characters which control + output justification, numeric signs, decimal points, trailing + zeros, and octal and hex prefixes. The flag characters are + minus (<<->>), plus (<<+>>), space ( ), zero (<<0>>), sharp + (<<#>>), and quote (<<'>>). They can appear in any + combination, although not all flags can be used for all + conversion specification types. + + o+ + o ' + A POSIX extension to the C standard. However, this + implementation presently treats it as a no-op, which + is the default behavior for the C locale, anyway. (If + it did what it is supposed to, when <[type]> were <>, + <>, <>, <>, <>, <>, or <>, the + integer portion of the conversion would be formatted + with thousands' grouping wide characters.) + + o - + The result of the conversion is left + justified, and the right is padded with + blanks. If you do not use this flag, the + result is right justified, and padded on the + left. + + o + + The result of a signed conversion (as + determined by <[type]> of <>, <>, <>, + <>, <>, <>, <>, <>, <>, or + <>) will always begin with a plus or minus + sign. (If you do not use this flag, positive + values do not begin with a plus sign.) + + o " " (space) + If the first character of a signed conversion + specification is not a sign, or if a signed + conversion results in no characters, the + result will begin with a space. If the space + ( ) flag and the plus (<<+>>) flag both + appear, the space flag is ignored. + + o 0 + If the <[type]> character is <>, <>, + <>, <>, <>, <>, <>, <>, + <>, <>, <>, <>, <>, or <>: leading + zeros are used to pad the field width + (following any indication of sign or base); no + spaces are used for padding. If the zero + (<<0>>) and minus (<<->>) flags both appear, + the zero (<<0>>) flag will be ignored. For + <>, <>, <>, <>, <>, and <> + conversions, if a precision <[prec]> is + specified, the zero (<<0>>) flag is ignored. + + Note that <<0>> is interpreted as a flag, not + as the beginning of a field width. + + o # + The result is to be converted to an + alternative form, according to the <[type]> + character. + o- + + The alternative form output with the # flag depends on the <[type]> + character: + + o+ + o o + Increases precision to force the first + digit of the result to be a zero. + + o x + A non-zero result will have a <<0x>> + prefix. + + o X + A non-zero result will have a <<0X>> + prefix. + + o a, A, e, E, f, or F + The result will always contain a + decimal point even if no digits follow + the point. (Normally, a decimal point + appears only if a digit follows it.) + Trailing zeros are removed. + + o g or G + The result will always contain a + decimal point even if no digits follow + the point. Trailing zeros are not + removed. + + o all others + Undefined. + + o- + + o <[width]> + + <[width]> is an optional minimum field width. You can + either specify it directly as a decimal integer, or + indirectly by using instead an asterisk (<<*>>), in + which case an <> argument is used as the field + width. If positional arguments are used, then the + width must also be specified positionally as <<*m$>>, + with m as a decimal integer. Negative field widths + are treated as specifying the minus (<<->>) flag for + left justfication, along with a positive field width. + The resulting format may be wider than the specified + width. + + o <[prec]> + + <[prec]> is an optional field; if present, it is + introduced with `<<.>>' (a period). You can specify + the precision either directly as a decimal integer or + indirectly by using an asterisk (<<*>>), in which case + an <> argument is used as the precision. If + positional arguments are used, then the precision must + also be specified positionally as <<*m$>>, with m as a + decimal integer. Supplying a negative precision is + equivalent to omitting the precision. If only a + period is specified the precision is zero. The effect + depends on the conversion <[type]>. + + o+ + o d, i, o, u, x, or X + Minimum number of digits to appear. If no + precision is given, defaults to 1. + + o a or A + Number of digits to appear after the decimal + point. If no precision is given, the + precision defaults to the minimum needed for + an exact representation. + + o e, E, f or F + Number of digits to appear after the decimal + point. If no precision is given, the + precision defaults to 6. + + o g or G + Maximum number of significant digits. A + precision of 0 is treated the same as a + precision of 1. If no precision is given, the + precision defaults to 6. + + o s or S + Maximum number of characters to print from the + string. If no precision is given, the entire + string is printed. + + o all others + undefined. + + o- + + o <[size]> + + <[size]> is an optional modifier that changes the data + type that the corresponding argument has. Behavior is + unspecified if a size is given that does not match the + <[type]>. + + o+ + o hh + With <>, <>, <>, <>, <>, or + <>, specifies that the argument should be + converted to a <> or <> before printing. + + With <>, specifies that the argument is a + pointer to a <>. + + o h + With <>, <>, <>, <>, <>, or + <>, specifies that the argument should be + converted to a <> or <> + before printing. + + With <>, specifies that the argument is a + pointer to a <>. + + o l + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a + <> or <>. + + With <>, specifies that the argument has + type <>. + + With <>, specifies that the argument is a + pointer to <>. + + With <>, specifies that the argument is a + pointer to a <>. + + With <>, <>, <>, <>, <>, <>, + <>, or <>, has no effect (because of + vararg promotion rules, there is no need to + distinguish between <> and <>). + + o ll + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a + <> or <>. + + With <>, specifies that the argument is a + pointer to a <>. + + o j + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is an + <> or <>. + + With <>, specifies that the argument is a + pointer to an <>. + + o z + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a <>. + + With <>, specifies that the argument is a + pointer to a <>. + + o t + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a + <>. + + With <>, specifies that the argument is a + pointer to a <>. + + o L + With <>, <>, <>, <>, <>, <>, + <>, or <>, specifies that the argument + is a <>. + + o- + + o <[type]> + + <[type]> specifies what kind of conversion <> + performs. Here is a table of these: + + o+ + o % + Prints the percent character (<<%>>). + + o c + Prints <[arg]> as single character. If the + <> size specifier is in effect, a multibyte + character is printed. + + o C + Short for <<%lc>>. A POSIX extension to the C standard. + + o s + Prints the elements of a pointer to <> + until the precision or a null character is + reached. If the <> size specifier is in + effect, the pointer is to an array of + <>, and the string is converted to + multibyte characters before printing. + + o S + Short for <<%ls>>. A POSIX extension to the C standard. + + o d or i + Prints a signed decimal integer; takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o D + Newlib extension, short for <<%ld>>. + + o o + Prints an unsigned octal integer; takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o O + Newlib extension, short for <<%lo>>. + + o u + Prints an unsigned decimal integer; takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o U + Newlib extension, short for <<%lu>>. + + o x + Prints an unsigned hexadecimal integer (using + <> as digits beyond <<9>>); takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o X + Like <>, but uses <> as digits + beyond <<9>>. + + o f + Prints a signed value of the form + <<[-]9999.9999>>, with the precision + determining how many digits follow the decimal + point; takes a <> (remember that + <> promotes to <> as a vararg). + The low order digit is rounded to even. If + the precision results in at most DECIMAL_DIG + digits, the result is rounded correctly; if + more than DECIMAL_DIG digits are printed, the + result is only guaranteed to round back to the + original value. + + If the value is infinite, the result is + <>, and no zero padding is performed. If + the value is not a number, the result is + <>, and no zero padding is performed. + + o F + Like <>, but uses <> and <> for + non-finite numbers. + + o e + Prints a signed value of the form + <<[-]9.9999e[+|-]999>>; takes a <>. + The digit before the decimal point is non-zero + if the value is non-zero. The precision + determines how many digits appear between + <<.>> and <>, and the exponent always + contains at least two digits. The value zero + has an exponent of zero. If the value is not + finite, it is printed like <>. + + o E + Like <>, but using <> to introduce the + exponent, and like <> for non-finite + values. + + o g + Prints a signed value in either <> or <> + form, based on the given value and + precision---an exponent less than -4 or + greater than the precision selects the <> + form. Trailing zeros and the decimal point + are printed only if necessary; takes a + <>. + + o G + Like <>, except use <> or <> form. + + o a + Prints a signed value of the form + <<[-]0x1.ffffp[+|-]9>>; takes a <>. + The letters <> are used for digits + beyond <<9>>. The precision determines how + many digits appear after the decimal point. + The exponent contains at least one digit, and + is a decimal value representing the power of + 2; a value of 0 has an exponent of 0. + Non-finite values are printed like <>. + + o A + Like <>, except uses <>, <

>, and + <> instead of lower case. + + o n + Takes a pointer to <>, and stores a count + of the number of bytes written so far. No + output is created. + + o p + Takes a pointer to <>, and prints it in + an implementation-defined format. This + implementation is similar to <<%#tx>>), except + that <<0x>> appears even for the NULL pointer. + + o m + Prints the output of <>; no + argument is required. A GNU extension. + + o- + O- + + <<_printf_r>>, <<_fprintf_r>>, <<_asprintf_r>>, + <<_sprintf_r>>, <<_snprintf_r>>, <<_asnprintf_r>> are simply + reentrant versions of the functions above. + +RETURNS +On success, <> and <> return the number of bytes in +the output string, except the concluding <> is not counted. +<> returns the number of bytes that would be in the output +string, except the concluding <> is not counted. <> and +<> return the number of characters transmitted. +<> returns the original <[str]> if there was enough room, +otherwise it returns an allocated string. + +If an error occurs, the result of <>, <>, +<>, and <> is a negative value, and the result of +<> is NULL. No error returns occur for <>. For +<> and <>, <> may be set according to +<>. For <> and <>, <> may be set +to ENOMEM if allocation fails, and for <>, <> may be +set to EOVERFLOW if <[size]> or the output length exceeds INT_MAX. + +BUGS +The ``''' (quote) flag does not work when locale's thousands_sep is not empty. + +PORTABILITY +ANSI C requires <>, <>, <>, and +<>. <> and <> are newlib extensions. + +The ANSI C standard specifies that implementations must support at +least formatted output of up to 509 characters. This implementation +has no inherent limit. + +Depending on how newlib was configured, not all format specifiers are +supported. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_sprintf_r (struct _reent *ptr, + char *__restrict str, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (ptr, &f, fmt, ap); + va_end (ap); + *f._p = '\0'; /* terminate the string */ + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +_siprintf_r (struct _reent *, char *, const char *, ...) + _ATTRIBUTE ((__alias__("_sprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +sprintf (char *__restrict str, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfprintf_r (_REENT, &f, fmt, ap); + va_end (ap); + *f._p = '\0'; /* terminate the string */ + return (ret); +} + +#ifdef _NANO_FORMATTED_IO +int +siprintf (char *, const char *, ...) + _ATTRIBUTE ((__alias__("sprintf"))); +#endif +#endif diff --git a/lib/stdio/sscanf.c b/lib/stdio/sscanf.c new file mode 100644 index 0000000..9c50361 --- /dev/null +++ b/lib/stdio/sscanf.c @@ -0,0 +1,478 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---scan and format input + +INDEX + scanf +INDEX + _scanf_r +INDEX + fscanf +INDEX + _fscanf_r +INDEX + sscanf +INDEX + _sscanf_r + +SYNOPSIS + #include + + int scanf(const char *restrict <[format]>, ...); + int fscanf(FILE *restrict <[fd]>, const char *restrict <[format]>, ...); + int sscanf(const char *restrict <[str]>, const char *restrict <[format]>, ...); + + int _scanf_r(struct _reent *<[ptr]>, const char *restrict <[format]>, ...); + int _fscanf_r(struct _reent *<[ptr]>, FILE *restrict <[fd]>, + const char *restrict <[format]>, ...); + int _sscanf_r(struct _reent *<[ptr]>, const char *restrict <[str]>, + const char *restrict <[format]>, ...); + +DESCRIPTION + <> scans a series of input fields from standard input, + one character at a time. Each field is interpreted according to + a format specifier passed to <> in the format string at + <<*<[format]>>>. <> stores the interpreted input from + each field at the address passed to it as the corresponding argument + following <[format]>. You must supply the same number of + format specifiers and address arguments as there are input fields. + + There must be sufficient address arguments for the given format + specifiers; if not the results are unpredictable and likely + disasterous. Excess address arguments are merely ignored. + + <> often produces unexpected results if the input diverges from + an expected pattern. Since the combination of <> or <> + followed by <> is safe and easy, that is the preferred way + to be certain that a program is synchronized with input at the end + of a line. + + <> and <> are identical to <>, other than the + source of input: <> reads from a file, and <> + from a string. + + The routines <<_scanf_r>>, <<_fscanf_r>>, and <<_sscanf_r>> are reentrant + versions of <>, <>, and <> that take an additional + first argument pointing to a reentrancy structure. + + The string at <<*<[format]>>> is a character sequence composed + of zero or more directives. Directives are composed of + one or more whitespace characters, non-whitespace characters, + and format specifications. + + Whitespace characters are blank (<< >>), tab (<<\t>>), or + newline (<<\n>>). + When <> encounters a whitespace character in the format string + it will read (but not store) all consecutive whitespace characters + up to the next non-whitespace character in the input. + + Non-whitespace characters are all other ASCII characters except the + percent sign (<<%>>). When <> encounters a non-whitespace + character in the format string it will read, but not store + a matching non-whitespace character. + + Format specifications tell <> to read and convert characters + from the input field into specific types of values, and store then + in the locations specified by the address arguments. + + Trailing whitespace is left unread unless explicitly + matched in the format string. + + The format specifiers must begin with a percent sign (<<%>>) + and have the following form: + +. %[*][<[width]>][<[size]>]<[type]> + + Each format specification begins with the percent character (<<%>>). + The other fields are: + O+ + o * + + an optional marker; if present, it suppresses interpretation and + assignment of this input field. + + o <[width]> + + an optional maximum field width: a decimal integer, + which controls the maximum number of characters that + will be read before converting the current input field. If the + input field has fewer than <[width]> characters, <> + reads all the characters in the field, and then + proceeds with the next field and its format specification. + + If a whitespace or a non-convertable character occurs + before <[width]> character are read, the characters up + to that character are read, converted, and stored. + Then <> proceeds to the next format specification. + + o <[size]> + + <>, <>, <>, <>, <>, and <> are optional size + characters which override the default way that <> + interprets the data type of the corresponding argument. + + @multitable @columnfractions 0.18 0.30 0.52 + @headitem + Modifier + @tab + Type(s) + @tab + @item + hh + @tab + d, i, o, u, x, n + @tab + convert input to char, store in char object + @item + h + @tab + d, i, o, u, x, n + @tab + convert input to short, store in short object + @item + h + @tab + D, I, O, U, X, e, f, c, s, p + @tab + no effect + @item + j + @tab + d, i, o, u, x, n + @tab + convert input to intmax_t, store in intmax_t object + @item + j + @tab + all others + @tab + no effect + @item + l + @tab + d, i, o, u, x, n + @tab + convert input to long, store in long object + @item + l + @tab + e, f, g + @tab + convert input to double, store in a double object + @item + l + @tab + D, I, O, U, X, c, s, p + @tab + no effect + @item + ll + @tab + d, i, o, u, x, n + @tab + convert to long long, store in long long object + @item + L + @tab + d, i, o, u, x, n + @tab + convert to long long, store in long long object + @item + L + @tab + e, f, g, E, G + @tab + convert to long double, store in long double object + @item + L + @tab + all others + @tab + no effect + @item + t + @tab + d, i, o, u, x, n + @tab + convert input to ptrdiff_t, store in ptrdiff_t object + @item + t + @tab + all others + @tab + no effect + @item + z + @tab + d, i, o, u, x, n + @tab + convert input to size_t, store in size_t object + @item + z + @tab + all others + @tab + no effect + @end multitable + + o <[type]> + + A character to specify what kind of conversion + <> performs. Here is a table of the conversion + characters: + + o+ + o % + No conversion is done; the percent character (<<%>>) is stored. + + o c + Scans one character. Corresponding <[arg]>: <<(char *arg)>>. + + o s + Reads a character string into the array supplied. + Corresponding <[arg]>: <<(char arg[])>>. + + o [<[pattern]>] + Reads a non-empty character string into memory + starting at <[arg]>. This area must be large + enough to accept the sequence and a + terminating null character which will be added + automatically. (<[pattern]> is discussed in the paragraph following + this table). Corresponding <[arg]>: <<(char *arg)>>. + + o d + Reads a decimal integer into the corresponding <[arg]>: <<(int *arg)>>. + + o D + Reads a decimal integer into the corresponding + <[arg]>: <<(long *arg)>>. + + o o + Reads an octal integer into the corresponding <[arg]>: <<(int *arg)>>. + + o O + Reads an octal integer into the corresponding <[arg]>: <<(long *arg)>>. + + o u + Reads an unsigned decimal integer into the corresponding + <[arg]>: <<(unsigned int *arg)>>. + + o U + Reads an unsigned decimal integer into the corresponding <[arg]>: + <<(unsigned long *arg)>>. + + o x,X + Read a hexadecimal integer into the corresponding <[arg]>: + <<(int *arg)>>. + + o e, f, g + Read a floating-point number into the corresponding <[arg]>: + <<(float *arg)>>. + + o E, F, G + Read a floating-point number into the corresponding <[arg]>: + <<(double *arg)>>. + + o i + Reads a decimal, octal or hexadecimal integer into the + corresponding <[arg]>: <<(int *arg)>>. + + o I + Reads a decimal, octal or hexadecimal integer into the + corresponding <[arg]>: <<(long *arg)>>. + + o n + Stores the number of characters read in the corresponding + <[arg]>: <<(int *arg)>>. + + o p + Stores a scanned pointer. ANSI C leaves the details + to each implementation; this implementation treats + <<%p>> exactly the same as <<%U>>. Corresponding + <[arg]>: <<(void **arg)>>. + o- + + A <[pattern]> of characters surrounded by square brackets can be used + instead of the <> type character. <[pattern]> is a set of + characters which define a search set of possible characters making up + the <> input field. If the first character in the brackets is a + caret (<<^>>), the search set is inverted to include all ASCII characters + except those between the brackets. There is also a range facility + which you can use as a shortcut. <<%[0-9] >> matches all decimal digits. + The hyphen must not be the first or last character in the set. + The character prior to the hyphen must be lexically less than the + character after it. + + Here are some <[pattern]> examples: + o+ + o %[abcd] + matches strings containing only <>, <>, <>, and <>. + + o %[^abcd] + matches strings containing any characters except <>, <>, + <>, or <> + + o %[A-DW-Z] + matches strings containing <>, <>, <>, <>, <>, + <>, <>, <> + + o %[z-a] + matches the characters <>, <<->>, and <> + o- + + Floating point numbers (for field types <>, <>, <>, <>, + <>, <>) must correspond to the following general form: + +. [+/-] ddddd[.]ddd [E|e[+|-]ddd] + + where objects inclosed in square brackets are optional, and <> + represents decimal, octal, or hexadecimal digits. + O- + +RETURNS + <> returns the number of input fields successfully + scanned, converted and stored; the return value does + not include scanned fields which were not stored. + + If <> attempts to read at end-of-file, the return + value is <>. + + If no fields were stored, the return value is <<0>>. + + <> might stop scanning a particular field before + reaching the normal field end character, or may + terminate entirely. + + <> stops scanning and storing the current field + and moves to the next input field (if any) + in any of the following situations: + + O+ + o The assignment suppressing character (<<*>>) appears + after the <<%>> in the format specification; the current + input field is scanned but not stored. + + o <[width]> characters have been read (<[width]> is a + width specification, a positive decimal integer). + + o The next character read cannot be converted + under the the current format (for example, + if a <> is read when the format is decimal). + + o The next character in the input field does not appear + in the search set (or does appear in the inverted search set). + O- + + When <> stops scanning the current input field for one of + these reasons, the next character is considered unread and + used as the first character of the following input field, or the + first character in a subsequent read operation on the input. + + <> will terminate under the following circumstances: + + O+ + o The next character in the input field conflicts + with a corresponding non-whitespace character in the + format string. + + o The next character in the input field is <>. + + o The format string has been exhausted. + O- + + When the format string contains a character sequence that is + not part of a format specification, the same character + sequence must appear in the input; <> will + scan but not store the matched characters. If a + conflict occurs, the first conflicting character remains in the input + as if it had never been read. + +PORTABILITY +<> is ANSI C. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +sscanf (const char *__restrict str, + const char * fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = __ssvfscanf_r (_REENT, &f, fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +siscanf (const char *, const char *, ...) + _ATTRIBUTE ((__alias__("sscanf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_sscanf_r (struct _reent *ptr, + const char *__restrict str, + const char *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = __ssvfscanf_r (ptr, &f, fmt, ap); + va_end (ap); + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +_siscanf_r (struct _reent *, const char *, const char *, ...) + _ATTRIBUTE ((__alias__("_sscanf_r"))); +#endif diff --git a/lib/stdio/stdio.c b/lib/stdio/stdio.c new file mode 100644 index 0000000..6347949 --- /dev/null +++ b/lib/stdio/stdio.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +/* + * Small standard I/O/seek/close functions. + * These maintain the `known seek offset' for seek optimisation. + */ + +_READ_WRITE_RETURN_TYPE +__sread (struct _reent *ptr, + void *cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + register FILE *fp = (FILE *) cookie; + register ssize_t ret; + +#ifdef __SCLE + int oldmode = 0; + if (fp->_flags & __SCLE) + oldmode = setmode (fp->_file, O_BINARY); +#endif + + ret = _read_r (ptr, fp->_file, buf, n); + +#ifdef __SCLE + if (oldmode) + setmode (fp->_file, oldmode); +#endif + + /* If the read succeeded, update the current offset. */ + + if (ret >= 0) + fp->_offset += ret; + else + fp->_flags &= ~__SOFF; /* paranoia */ + return ret; +} + +/* Dummy function used in sscanf/swscanf. */ +_READ_WRITE_RETURN_TYPE +__seofread (struct _reent *_ptr, + void *cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE len) +{ + return 0; +} + +_READ_WRITE_RETURN_TYPE +__swrite (struct _reent *ptr, + void *cookie, + char const *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + register FILE *fp = (FILE *) cookie; + ssize_t w; +#ifdef __SCLE + int oldmode=0; +#endif + + if (fp->_flags & __SAPP) + _lseek_r (ptr, fp->_file, (_off_t) 0, SEEK_END); + fp->_flags &= ~__SOFF; /* in case O_APPEND mode is set */ + +#ifdef __SCLE + if (fp->_flags & __SCLE) + oldmode = setmode (fp->_file, O_BINARY); +#endif + + w = _write_r (ptr, fp->_file, buf, n); + +#ifdef __SCLE + if (oldmode) + setmode (fp->_file, oldmode); +#endif + + return w; +} + +_fpos_t +__sseek (struct _reent *ptr, + void *cookie, + _fpos_t offset, + int whence) +{ + register FILE *fp = (FILE *) cookie; + register _off_t ret; + + ret = _lseek_r (ptr, fp->_file, (_off_t) offset, whence); + if (ret == -1L) + fp->_flags &= ~__SOFF; + else + { + fp->_flags |= __SOFF; + fp->_offset = ret; + } + return ret; +} + +int +__sclose (struct _reent *ptr, + void *cookie) +{ + FILE *fp = (FILE *) cookie; + + return _close_r (ptr, fp->_file); +} + +#ifdef __SCLE +int +__stextmode (int fd) +{ +#ifdef __CYGWIN__ + extern int _cygwin_istext_for_stdio (int); + return _cygwin_istext_for_stdio (fd); +#else + return 0; +#endif +} +#endif diff --git a/lib/stdio/stdio.tex b/lib/stdio/stdio.tex new file mode 100644 index 0000000..5352c54 --- /dev/null +++ b/lib/stdio/stdio.tex @@ -0,0 +1,327 @@ +@node Stdio +@chapter Input and Output (@file{stdio.h}) + +This chapter comprises functions to manage files +or other input/output streams. Among these functions are subroutines +to generate or scan strings according to specifications from a format string. + +The underlying facilities for input and output depend on the host +system, but these functions provide a uniform interface. + +The corresponding declarations are in @file{stdio.h}. + +The reentrant versions of these functions use macros + +@example +_stdin_r(@var{reent}) +_stdout_r(@var{reent}) +_stderr_r(@var{reent}) +@end example + +@noindent +instead of the globals @code{stdin}, @code{stdout}, and +@code{stderr}. The argument @var{reent} is a pointer to a reentrancy +structure. + +@menu +* clearerr:: Clear file or stream error indicator +* diprintf:: Print to a file descriptor (integer only) +* dprintf:: Print to a file descriptor +* fclose:: Close a file +* fcloseall:: Close all files +* fdopen:: Turn an open file into a stream +* feof:: Test for end of file +* ferror:: Test whether read/write error has occurred +* fflush:: Flush buffered file output +* fgetc:: Get a character from a file or stream +* fgetpos:: Record position in a stream or file +* fgets:: Get character string from a file or stream +* fgetwc:: Get a wide character from a file or stream +* fgetws:: Get a wide character string from a file or stream +* fileno:: Get file descriptor associated with stream +* fmemopen:: Open a stream around a fixed-length buffer +* fopen:: Open a file +* fopencookie:: Open a stream with custom callbacks +* fpurge:: Discard all pending I/O on a stream +* fputc:: Write a character on a stream or file +* fputs:: Write a character string in a file or stream +* fputwc:: Write a wide character to a file or stream +* fputws:: Write a wide character string to a file or stream +* fread:: Read array elements from a file +* freopen:: Open a file using an existing file descriptor +* fseek:: Set file position +* __fsetlocking:: Set or query locking mode on FILE stream +* fsetpos:: Restore position of a stream or file +* ftell:: Return position in a stream or file +* funopen:: Open a stream with custom callbacks +* fwide:: Set and determine the orientation of a FILE stream +* fwrite:: Write array elements from memory to a file or stream +* getc:: Get a character from a file or stream (macro) +* getc_unlocked:: Get a character from a file or stream (macro) +* getchar:: Get a character from standard input (macro) +* getchar_unlocked:: Get a character from standard input (macro) +* getdelim:: Get character string from a file or stream +* getline:: Get character string from a file or stream +* gets:: Get character string from standard input (obsolete) +* getw:: Get a word (int) from a file or stream +* getwchar:: Get a wide character from standard input +* mktemp:: Generate unused file name +* open_memstream:: Open a write stream around an arbitrary-length buffer +* perror:: Print an error message on standard error +* putc:: Write a character on a stream or file (macro) +* putc_unlocked:: Write a character on a stream or file (macro) +* putchar:: Write a character on standard output (macro) +* putchar_unlocked:: Write a character on standard output (macro) +* puts:: Write a character string on standard output +* putw:: Write a word (int) to a file or stream +* putwchar:: Write a wide character to standard output +* remove:: Delete a file's name +* rename:: Rename a file +* rewind:: Reinitialize a file or stream +* setbuf:: Specify full buffering for a file or stream +* setbuffer:: Specify full buffering for a file or stream with size +* setlinebuf:: Specify line buffering for a file or stream +* setvbuf:: Specify buffering for a file or stream +* siprintf:: Write formatted output (integer only) +* siscanf:: Scan and format input (integer only) +* sprintf:: Write formatted output +* sscanf:: Scan and format input +* stdio_ext:: Access internals of FILE structure +* swprintf:: Write formatted wide character output +* swscanf:: Scan and format wide character input +* tmpfile:: Create a temporary file +* tmpnam:: Generate name for a temporary file +* ungetc:: Push data back into a stream +* ungetwc:: Push wide character data back into a stream +* vfprintf:: Format variable argument list +* vfscanf:: Scan variable argument list +* vfwprintf:: Format variable wide character argument list +* vfwscanf:: Scan and format argument list from wide character input +* viprintf:: Format variable argument list (integer only) +* viscanf:: Scan variable format list (integer only) +@end menu + +@page +@include stdio/clearerr.def + +@page +@include stdio/diprintf.def + +@page +@include stdio/dprintf.def + +@page +@include stdio/fclose.def + +@page +@include stdio/fcloseall.def + +@page +@include stdio/fdopen.def + +@page +@include stdio/feof.def + +@page +@include stdio/ferror.def + +@page +@include stdio/fflush.def + +@page +@include stdio/fgetc.def + +@page +@include stdio/fgetpos.def + +@page +@include stdio/fgets.def + +@page +@include stdio/fgetwc.def + +@page +@include stdio/fgetws.def + +@page +@include stdio/fileno.def + +@page +@include stdio/fmemopen.def + +@page +@include stdio/fopen.def + +@page +@include stdio/fopencookie.def + +@page +@include stdio/fpurge.def + +@page +@include stdio/fputc.def + +@page +@include stdio/fputs.def + +@page +@include stdio/fputwc.def + +@page +@include stdio/fputws.def + +@page +@include stdio/fread.def + +@page +@include stdio/freopen.def + +@page +@include stdio/fseek.def + +@page +@include stdio/fsetlocking.def + +@page +@include stdio/fsetpos.def + +@page +@include stdio/ftell.def + +@page +@include stdio/funopen.def + +@page +@include stdio/fwide.def + +@page +@include stdio/fwrite.def + +@page +@include stdio/getc.def + +@page +@include stdio/getc_u.def + +@page +@include stdio/getchar.def + +@page +@include stdio/getchar_u.def + +@page +@include stdio/getdelim.def + +@page +@include stdio/getline.def + +@page +@include stdio/gets.def + +@page +@include stdio/getw.def + +@page +@include stdio/getwchar.def + +@page +@include stdio/mktemp.def + +@page +@include stdio/open_memstream.def + +@page +@include stdio/perror.def + +@page +@include stdio/putc.def + +@page +@include stdio/putc_u.def + +@page +@include stdio/putchar.def + +@page +@include stdio/putchar_u.def + +@page +@include stdio/puts.def + +@page +@include stdio/putw.def + +@page +@include stdio/putwchar.def + +@page +@include stdio/remove.def + +@page +@include stdio/rename.def + +@page +@include stdio/rewind.def + +@page +@include stdio/setbuf.def + +@page +@include stdio/setbuffer.def + +@page +@include stdio/setlinebuf.def + +@page +@include stdio/setvbuf.def + +@page +@include stdio/siprintf.def + +@page +@include stdio/siscanf.def + +@page +@include stdio/sprintf.def + +@page +@include stdio/sscanf.def + +@page +@include stdio/stdio_ext.def + +@page +@include stdio/swprintf.def + +@page +@include stdio/swscanf.def + +@page +@include stdio/tmpfile.def + +@page +@include stdio/tmpnam.def + +@page +@include stdio/ungetc.def + +@page +@include stdio/ungetwc.def + +@page +@include stdio/vfprintf.def + +@page +@include stdio/vfscanf.def + +@page +@include stdio/vfwprintf.def + +@page +@include stdio/vfwscanf.def + +@page +@include stdio/viprintf.def + +@page +@include stdio/viscanf.def diff --git a/lib/stdio/stdio_ext.c b/lib/stdio/stdio_ext.c new file mode 100644 index 0000000..857091f --- /dev/null +++ b/lib/stdio/stdio_ext.c @@ -0,0 +1,106 @@ +/* +FUNCTION +<>,<<__fbufsize>>,<<__fpending>>,<<__flbf>>,<<__freadable>>,<<__fwritable>>,<<__freading>>,<<__fwriting>>---access internals of FILE structure + +INDEX + __fbufsize +INDEX + __fpending +INDEX + __flbf +INDEX + __freadable +INDEX + __fwritable +INDEX + __freading +INDEX + __fwriting + +SYNOPSIS + #include + #include + size_t __fbufsize(FILE *<[fp]>); + size_t __fpending(FILE *<[fp]>); + int __flbf(FILE *<[fp]>); + int __freadable(FILE *<[fp]>); + int __fwritable(FILE *<[fp]>); + int __freading(FILE *<[fp]>); + int __fwriting(FILE *<[fp]>); + +DESCRIPTION +These functions provides access to the internals of the FILE structure <[fp]>. + +RETURNS +<<__fbufsize>> returns the number of bytes in the buffer of stream <[fp]>. + +<<__fpending>> returns the number of bytes in the output buffer of stream <[fp]>. + +<<__flbf>> returns nonzero if stream <[fp]> is line-buffered, and <<0>> if not. + +<<__freadable>> returns nonzero if stream <[fp]> may be read, and <<0>> if not. + +<<__fwritable>> returns nonzero if stream <[fp]> may be written, and <<0>> if not. + +<<__freading>> returns nonzero if stream <[fp]> if the last operation on +it was a read, or if it read-only, and <<0>> if not. + +<<__fwriting>> returns nonzero if stream <[fp]> if the last operation on +it was a write, or if it write-only, and <<0>> if not. + +PORTABILITY +These functions originate from Solaris and are also provided by GNU libc. + +No supporting OS subroutines are required. +*/ + +#ifndef __rtems__ + +#include <_ansi.h> +#include + +/* Subroutine versions of the inline or macro functions. */ + +size_t +__fbufsize (FILE * fp) +{ + return (size_t) fp->_bf._size; +} + +size_t +__fpending (FILE * fp) +{ + return fp->_p - fp->_bf._base; +} + +int +__flbf (FILE * fp) +{ + return (fp->_flags & __SLBF) != 0; +} + +int +__freadable (FILE * fp) +{ + return (fp->_flags & (__SRD | __SRW)) != 0; +} + +int +__fwritable (FILE * fp) +{ + return (fp->_flags & (__SWR | __SRW)) != 0; +} + +int +__freading (FILE * fp) +{ + return (fp->_flags & __SRD) != 0; +} + +int +__fwriting (FILE * fp) +{ + return (fp->_flags & __SWR) != 0; +} + +#endif /* __rtems__ */ diff --git a/lib/stdio/svfiprintf.c b/lib/stdio/svfiprintf.c new file mode 100644 index 0000000..bbcc81c --- /dev/null +++ b/lib/stdio/svfiprintf.c @@ -0,0 +1,3 @@ +#define INTEGER_ONLY +#define STRING_ONLY +#include "vfprintf.c" diff --git a/lib/stdio/svfiscanf.c b/lib/stdio/svfiscanf.c new file mode 100644 index 0000000..e79cc79 --- /dev/null +++ b/lib/stdio/svfiscanf.c @@ -0,0 +1,3 @@ +#define INTEGER_ONLY +#define STRING_ONLY +#include "vfscanf.c" diff --git a/lib/stdio/svfiwprintf.c b/lib/stdio/svfiwprintf.c new file mode 100644 index 0000000..a9df2ca --- /dev/null +++ b/lib/stdio/svfiwprintf.c @@ -0,0 +1,3 @@ +#define INTEGER_ONLY +#define STRING_ONLY +#include "vfwprintf.c" diff --git a/lib/stdio/svfiwscanf.c b/lib/stdio/svfiwscanf.c new file mode 100644 index 0000000..7e6a36f --- /dev/null +++ b/lib/stdio/svfiwscanf.c @@ -0,0 +1,3 @@ +#define INTEGER_ONLY +#define STRING_ONLY +#include "vfwscanf.c" diff --git a/lib/stdio/svfprintf.c b/lib/stdio/svfprintf.c new file mode 100644 index 0000000..fe053c2 --- /dev/null +++ b/lib/stdio/svfprintf.c @@ -0,0 +1,2 @@ +#define STRING_ONLY +#include "vfprintf.c" diff --git a/lib/stdio/svfscanf.c b/lib/stdio/svfscanf.c new file mode 100644 index 0000000..ed01020 --- /dev/null +++ b/lib/stdio/svfscanf.c @@ -0,0 +1,2 @@ +#define STRING_ONLY +#include "vfscanf.c" diff --git a/lib/stdio/svfwprintf.c b/lib/stdio/svfwprintf.c new file mode 100644 index 0000000..1ee9dd5 --- /dev/null +++ b/lib/stdio/svfwprintf.c @@ -0,0 +1,2 @@ +#define STRING_ONLY +#include "vfwprintf.c" diff --git a/lib/stdio/svfwscanf.c b/lib/stdio/svfwscanf.c new file mode 100644 index 0000000..3b2987d --- /dev/null +++ b/lib/stdio/svfwscanf.c @@ -0,0 +1,2 @@ +#define STRING_ONLY +#include "vfwscanf.c" diff --git a/lib/stdio/swprintf.c b/lib/stdio/swprintf.c new file mode 100644 index 0000000..634b22b --- /dev/null +++ b/lib/stdio/swprintf.c @@ -0,0 +1,633 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---wide character format output + +INDEX + fwprintf +INDEX + _fwprintf_r +INDEX + wprintf +INDEX + _wprintf_r +INDEX + swprintf +INDEX + _swprintf_r + +SYNOPSIS + #include + + int wprintf(const wchar_t *<[format]>, ...); + int fwprintf(FILE *__restrict <[fd]>, + const wchar_t *__restrict <[format]>, ...); + int swprintf(wchar_t *__restrict <[str]>, size_t <[size]>, + const wchar_t *__restrict <[format]>, ...); + + int _wprintf_r(struct _reent *<[ptr]>, const wchar_t *<[format]>, ...); + int _fwprintf_r(struct _reent *<[ptr]>, FILE *<[fd]>, + const wchar_t *<[format]>, ...); + int _swprintf_r(struct _reent *<[ptr]>, wchar_t *<[str]>, + size_t <[size]>, const wchar_t *<[format]>, ...); + +DESCRIPTION + <> accepts a series of arguments, applies to each a + format specifier from <<*<[format]>>>, and writes the + formatted data to <>, without a terminating NUL + wide character. The behavior of <> is undefined if there + are not enough arguments for the format or if any argument is not the + right type for the corresponding conversion specifier. <> + returns when it reaches the end of the format string. If there are + more arguments than the format requires, excess arguments are + ignored. + + <> is like <>, except that output is directed + to the stream <[fd]> rather than <>. + + <> is like <>, except that output is directed + to the buffer <[str]> with a terminating wide <>, and the + resulting string length is limited to at most <[size]> wide characters, + including the terminating <>. It is considered an error if the + output (including the terminating wide-<>) does not fit into + <[size]> wide characters. (This error behavior is not the same as for + <>, which <> is otherwise completely analogous to. + While <> allows the needed size to be known simply by giving + <[size]>=0, <> does not, giving an error instead.) + + For <> the behavior is undefined if the output + <<*<[str]>>> overlaps with one of the arguments. Behavior is also + undefined if the argument for <<%n>> within <<*<[format]>>> + overlaps another argument. + + <[format]> is a pointer to a wide character string containing two + types of objects: ordinary characters (other than <<%>>), + which are copied unchanged to the output, and conversion + specifications, each of which is introduced by <<%>>. (To + include <<%>> in the output, use <<%%>> in the format string.) + A conversion specification has the following form: + +. %[<[pos]>][<[flags]>][<[width]>][.<[prec]>][<[size]>]<[type]> + + The fields of the conversion specification have the following + meanings: + + O+ + o <[pos]> + + Conversions normally consume arguments in the order that they + are presented. However, it is possible to consume arguments + out of order, and reuse an argument for more than one + conversion specification (although the behavior is undefined + if the same argument is requested with different types), by + specifying <[pos]>, which is a decimal integer followed by + '$'. The integer must be between 1 and from + limits.h, and if argument <<%n$>> is requested, all earlier + arguments must be requested somewhere within <[format]>. If + positional parameters are used, then all conversion + specifications except for <<%%>> must specify a position. + This positional parameters method is a POSIX extension to the C + standard definition for the functions. + + o <[flags]> + + <[flags]> is an optional sequence of characters which control + output justification, numeric signs, decimal points, trailing + zeros, and octal and hex prefixes. The flag characters are + minus (<<->>), plus (<<+>>), space ( ), zero (<<0>>), sharp + (<<#>>), and quote (<<'>>). They can appear in any + combination, although not all flags can be used for all + conversion specification types. + + o+ + o ' + A POSIX extension to the C standard. However, this + implementation presently treats it as a no-op, which + is the default behavior for the C locale, anyway. (If + it did what it is supposed to, when <[type]> were <>, + <>, <>, <>, <>, <>, or <>, the + integer portion of the conversion would be formatted + with thousands' grouping wide characters.) + + o - + The result of the conversion is left + justified, and the right is padded with + blanks. If you do not use this flag, the + result is right justified, and padded on the + left. + + o + + The result of a signed conversion (as + determined by <[type]> of <>, <>, <>, + <>, <>, <>, <>, <>, <>, or + <>) will always begin with a plus or minus + sign. (If you do not use this flag, positive + values do not begin with a plus sign.) + + o " " (space) + If the first character of a signed conversion + specification is not a sign, or if a signed + conversion results in no characters, the + result will begin with a space. If the space + ( ) flag and the plus (<<+>>) flag both + appear, the space flag is ignored. + + o 0 + If the <[type]> character is <>, <>, + <>, <>, <>, <>, <>, <>, + <>, <>, <>, <>, <>, or <>: leading + zeros are used to pad the field width + (following any indication of sign or base); no + spaces are used for padding. If the zero + (<<0>>) and minus (<<->>) flags both appear, + the zero (<<0>>) flag will be ignored. For + <>, <>, <>, <>, <>, and <> + conversions, if a precision <[prec]> is + specified, the zero (<<0>>) flag is ignored. + + Note that <<0>> is interpreted as a flag, not + as the beginning of a field width. + + o # + The result is to be converted to an + alternative form, according to the <[type]> + character. + o- + + The alternative form output with the # flag depends on the <[type]> + character: + + o+ + o o + Increases precision to force the first + digit of the result to be a zero. + + o x + A non-zero result will have a <<0x>> + prefix. + + o X + A non-zero result will have a <<0X>> + prefix. + + o a, A, e, E, f, or F + The result will always contain a + decimal point even if no digits follow + the point. (Normally, a decimal point + appears only if a digit follows it.) + Trailing zeros are removed. + + o g or G + The result will always contain a + decimal point even if no digits follow + the point. Trailing zeros are not + removed. + + o all others + Undefined. + + o- + + + o <[width]> + + <[width]> is an optional minimum field width. You can + either specify it directly as a decimal integer, or + indirectly by using instead an asterisk (<<*>>), in + which case an <> argument is used as the field + width. If positional arguments are used, then the + width must also be specified positionally as <<*m$>>, + with m as a decimal integer. Negative field widths + are treated as specifying the minus (<<->>) flag for + left justfication, along with a positive field width. + The resulting format may be wider than the specified + width. + + o <[prec]> + + <[prec]> is an optional field; if present, it is + introduced with `<<.>>' (a period). You can specify + the precision either directly as a decimal integer or + indirectly by using an asterisk (<<*>>), in which case + an <> argument is used as the precision. If + positional arguments are used, then the precision must + also be specified positionally as <<*m$>>, with m as a + decimal integer. Supplying a negative precision is + equivalent to omitting the precision. If only a + period is specified the precision is zero. The effect + depends on the conversion <[type]>. + + o+ + o d, i, o, u, x, or X + Minimum number of digits to appear. If no + precision is given, defaults to 1. + + o a or A + Number of digits to appear after the decimal + point. If no precision is given, the + precision defaults to the minimum needed for + an exact representation. + + o e, E, f or F + Number of digits to appear after the decimal + point. If no precision is given, the + precision defaults to 6. + + o g or G + Maximum number of significant digits. A + precision of 0 is treated the same as a + precision of 1. If no precision is given, the + precision defaults to 6. + + o s or S + Maximum number of characters to print from the + string. If no precision is given, the entire + string is printed. + + o all others + undefined. + + o- + + o <[size]> + + <[size]> is an optional modifier that changes the data + type that the corresponding argument has. Behavior is + unspecified if a size is given that does not match the + <[type]>. + + o+ + o hh + With <>, <>, <>, <>, <>, or + <>, specifies that the argument should be + converted to a <> or <> before printing. + + With <>, specifies that the argument is a + pointer to a <>. + + o h + With <>, <>, <>, <>, <>, or + <>, specifies that the argument should be + converted to a <> or <> + before printing. + + With <>, specifies that the argument is a + pointer to a <>. + + o l + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a + <> or <>. + + With <>, specifies that the argument has + type <>. + + With <>, specifies that the argument is a + pointer to <>. + + With <>, specifies that the argument is a + pointer to a <>. + + With <>, <>, <>, <>, <>, <>, + <>, or <>, has no effect (because of + vararg promotion rules, there is no need to + distinguish between <> and <>). + + o ll + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a + <> or <>. + + With <>, specifies that the argument is a + pointer to a <>. + + o j + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is an + <> or <>. + + With <>, specifies that the argument is a + pointer to an <>. + + o z + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a <>. + + With <>, specifies that the argument is a + pointer to a <>. + + o t + With <>, <>, <>, <>, <>, or + <>, specifies that the argument is a + <>. + + With <>, specifies that the argument is a + pointer to a <>. + + o L + With <>, <>, <>, <>, <>, <>, + <>, or <>, specifies that the argument + is a <>. + + o- + + o <[type]> + + <[type]> specifies what kind of conversion <> + performs. Here is a table of these: + + o+ + o % + Prints the percent character (<<%>>). + + o c + If no <> qualifier is present, the int argument shall + be converted to a wide character as if by calling + the btowc() function and the resulting wide character + shall be written. Otherwise, the wint_t argument + shall be converted to wchar_t, and written. + + o C + Short for <<%lc>>. A POSIX extension to the C standard. + + o s + If no <> qualifier is present, the application + shall ensure that the argument is a pointer to a + character array containing a character sequence + beginning in the initial shift state. Characters + from the array shall be converted as if by repeated + calls to the mbrtowc() function, with the conversion + state described by an mbstate_t object initialized to + zero before the first character is converted, and + written up to (but not including) the terminating + null wide character. If the precision is specified, + no more than that many wide characters shall be + written. If the precision is not specified, or is + greater than the size of the array, the application + shall ensure that the array contains a null wide + character. + + If an <> qualifier is present, the application + shall ensure that the argument is a pointer to an + array of type wchar_t. Wide characters from the array + shall be written up to (but not including) a + terminating null wide character. If no precision is + specified, or is greater than the size of the array, + the application shall ensure that the array contains + a null wide character. If a precision is specified, + no more than that many wide characters shall be + written. + + o S + Short for <<%ls>>. A POSIX extension to the C standard. + + o d or i + Prints a signed decimal integer; takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o o + Prints an unsigned octal integer; takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o u + Prints an unsigned decimal integer; takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o x + Prints an unsigned hexadecimal integer (using + <> as digits beyond <<9>>); takes an + <>. Leading zeros are inserted as + necessary to reach the precision. A value of 0 with + a precision of 0 produces an empty string. + + o X + Like <>, but uses <> as digits + beyond <<9>>. + + o f + Prints a signed value of the form + <<[-]9999.9999>>, with the precision + determining how many digits follow the decimal + point; takes a <> (remember that + <> promotes to <> as a vararg). + The low order digit is rounded to even. If + the precision results in at most DECIMAL_DIG + digits, the result is rounded correctly; if + more than DECIMAL_DIG digits are printed, the + result is only guaranteed to round back to the + original value. + + If the value is infinite, the result is + <>, and no zero padding is performed. If + the value is not a number, the result is + <>, and no zero padding is performed. + + o F + Like <>, but uses <> and <> for + non-finite numbers. + + o e + Prints a signed value of the form + <<[-]9.9999e[+|-]999>>; takes a <>. + The digit before the decimal point is non-zero + if the value is non-zero. The precision + determines how many digits appear between + <<.>> and <>, and the exponent always + contains at least two digits. The value zero + has an exponent of zero. If the value is not + finite, it is printed like <>. + + o E + Like <>, but using <> to introduce the + exponent, and like <> for non-finite + values. + + o g + Prints a signed value in either <> or <> + form, based on the given value and + precision---an exponent less than -4 or + greater than the precision selects the <> + form. Trailing zeros and the decimal point + are printed only if necessary; takes a + <>. + + o G + Like <>, except use <> or <> form. + + o a + Prints a signed value of the form + <<[-]0x1.ffffp[+|-]9>>; takes a <>. + The letters <> are used for digits + beyond <<9>>. The precision determines how + many digits appear after the decimal point. + The exponent contains at least one digit, and + is a decimal value representing the power of + 2; a value of 0 has an exponent of 0. + Non-finite values are printed like <>. + + o A + Like <>, except uses <>, <

>, and + <> instead of lower case. + + o n + Takes a pointer to <>, and stores a count + of the number of bytes written so far. No + output is created. + + o p + Takes a pointer to <>, and prints it in + an implementation-defined format. This + implementation is similar to <<%#tx>>), except + that <<0x>> appears even for the NULL pointer. + + o m + Prints the output of <>; no + argument is required. A GNU extension. + + o- + O- + + <<_wprintf_r>>, <<_fwprintf_r>>, <<_swprintf_r>>, are simply + reentrant versions of the functions above. + +RETURNS +On success, <> return the number of wide characters in +the output string, except the concluding <> is not counted. +<> and <> return the number of characters transmitted. + +If an error occurs, the result of <>, <>, and +<> is a negative value. For <> and <>, +<> may be set according to <>. For <>, <> +may be set to EOVERFLOW if <[size]> is greater than INT_MAX / sizeof (wchar_t), +or when the output does not fit into <[size]> wide characters (including the +terminating wide <>). + +BUGS +The ``''' (quote) flag does not work when locale's thousands_sep is not empty. + +PORTABILITY +POSIX-1.2008 with extensions; C99 (compliant except for POSIX extensions). + +Depending on how newlib was configured, not all format specifiers are +supported. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include "local.h" + +/* NOTE: _swprintf_r() should be identical to swprintf() except for the + * former having ptr as a parameter and the latter needing to declare it as + * a variable set to _REENT. */ + +int +_swprintf_r (struct _reent *ptr, + wchar_t *str, + size_t size, + const wchar_t *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + if (size > INT_MAX / sizeof (wchar_t)) + { + _REENT_ERRNO(ptr) = EOVERFLOW; /* POSIX extension */ + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0); + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfwprintf_r (ptr, &f, fmt, ap); + va_end (ap); + /* _svfwprintf_r() does not put in a terminating NUL, so add one if + * appropriate, which is whenever size is > 0. _svfwprintf_r() stops + * after n-1, so always just put at the end. */ + if (size > 0) { + *(wchar_t *)f._p = L'\0'; /* terminate the string */ + } + if(ret >= size) { + /* _svfwprintf_r() returns how many wide characters it would have printed + * if there were enough space. Return an error if too big to fit in str, + * unlike snprintf, which returns the size needed. */ + _REENT_ERRNO(ptr) = EOVERFLOW; /* POSIX extension */ + ret = -1; + } + return (ret); +} + +#ifndef _REENT_ONLY + +int +swprintf (wchar_t *__restrict str, + size_t size, + const wchar_t *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + struct _reent *ptr = _REENT; + + if (size > INT_MAX / sizeof (wchar_t)) + { + _REENT_ERRNO(ptr) = EOVERFLOW; /* POSIX extension */ + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0); + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = _svfwprintf_r (ptr, &f, fmt, ap); + va_end (ap); + /* _svfwprintf_r() does not put in a terminating NUL, so add one if + * appropriate, which is whenever size is > 0. _svfwprintf_r() stops + * after n-1, so always just put at the end. */ + if (size > 0) { + *(wchar_t *)f._p = L'\0'; /* terminate the string */ + } + if(ret >= size) { + /* _svfwprintf_r() returns how many wide characters it would have printed + * if there were enough space. Return an error if too big to fit in str, + * unlike snprintf, which returns the size needed. */ + _REENT_ERRNO(ptr) = EOVERFLOW; /* POSIX extension */ + ret = -1; + } + return (ret); +} + +#endif diff --git a/lib/stdio/swscanf.c b/lib/stdio/swscanf.c new file mode 100644 index 0000000..578ac3c --- /dev/null +++ b/lib/stdio/swscanf.c @@ -0,0 +1,459 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---scan and format wide character input + +INDEX + wscanf +INDEX + _wscanf_r +INDEX + fwscanf +INDEX + _fwscanf_r +INDEX + swscanf +INDEX + _swscanf_r + +SYNOPSIS + #include + + int wscanf(const wchar_t *__restrict <[format]>, ...); + int fwscanf(FILE *__restrict <[fd]>, + const wchar_t *__restrict <[format]>, ...); + int swscanf(const wchar_t *__restrict <[str]>, + const wchar_t *__restrict <[format]>, ...); + + int _wscanf_r(struct _reent *<[ptr]>, const wchar_t *<[format]>, ...); + int _fwscanf_r(struct _reent *<[ptr]>, FILE *<[fd]>, + const wchar_t *<[format]>, ...); + int _swscanf_r(struct _reent *<[ptr]>, const wchar_t *<[str]>, + const wchar_t *<[format]>, ...); + +DESCRIPTION + <> scans a series of input fields from standard input, + one wide character at a time. Each field is interpreted according to + a format specifier passed to <> in the format string at + <<*<[format]>>>. <> stores the interpreted input from + each field at the address passed to it as the corresponding argument + following <[format]>. You must supply the same number of + format specifiers and address arguments as there are input fields. + + There must be sufficient address arguments for the given format + specifiers; if not the results are unpredictable and likely + disasterous. Excess address arguments are merely ignored. + + <> often produces unexpected results if the input diverges from + an expected pattern. Since the combination of <> or <> + followed by <> is safe and easy, that is the preferred way + to be certain that a program is synchronized with input at the end + of a line. + + <> and <> are identical to <>, other than the + source of input: <> reads from a file, and <> + from a string. + + The routines <<_wscanf_r>>, <<_fwscanf_r>>, and <<_swscanf_r>> are reentrant + versions of <>, <>, and <> that take an additional + first argument pointing to a reentrancy structure. + + The string at <<*<[format]>>> is a wide character sequence composed + of zero or more directives. Directives are composed of + one or more whitespace characters, non-whitespace characters, + and format specifications. + + Whitespace characters are blank (<< >>), tab (<<\t>>), or + newline (<<\n>>). + When <> encounters a whitespace character in the format string + it will read (but not store) all consecutive whitespace characters + up to the next non-whitespace character in the input. + + Non-whitespace characters are all other ASCII characters except the + percent sign (<<%>>). When <> encounters a non-whitespace + character in the format string it will read, but not store + a matching non-whitespace character. + + Format specifications tell <> to read and convert characters + from the input field into specific types of values, and store then + in the locations specified by the address arguments. + + Trailing whitespace is left unread unless explicitly + matched in the format string. + + The format specifiers must begin with a percent sign (<<%>>) + and have the following form: + +. %[*][<[width]>][<[size]>]<[type]> + + Each format specification begins with the percent character (<<%>>). + The other fields are: + O+ + o * + + an optional marker; if present, it suppresses interpretation and + assignment of this input field. + + o <[width]> + + an optional maximum field width: a decimal integer, + which controls the maximum number of characters that + will be read before converting the current input field. If the + input field has fewer than <[width]> characters, <> + reads all the characters in the field, and then + proceeds with the next field and its format specification. + + If a whitespace or a non-convertable wide character occurs + before <[width]> character are read, the characters up + to that character are read, converted, and stored. + Then <> proceeds to the next format specification. + + o <[size]> + + <>, <>, <>, <>, <>, and <> are optional size + characters which override the default way that <> + interprets the data type of the corresponding argument. + + @multitable @columnfractions 0.18 0.30 0.52 + @headitem + Modifier + @tab + Type(s) + @tab + @item + hh + @tab + d, i, o, u, x, n + @tab + convert input to char, store in char object + @item + h + @tab + d, i, o, u, x, n + @tab + convert input to short, store in short object + @item + h + @tab + e, f, c, s, p + @tab + no effect + @item + j + @tab + d, i, o, u, x, n + @tab + convert input to intmax_t, store in intmax_t object + @item + j + @tab + all others + @tab + no effect + @item + l + @tab + d, i, o, u, x, n + @tab + convert input to long, store in long object + @item + l + @tab + e, f, g + @tab + convert input to double, store in a double object + @item + l + @tab + c, s, [ + @tab + the input is stored in a wchar_t object + @item + l + @tab + p + @tab + no effect + @item + ll + @tab + d, i, o, u, x, n + @tab + convert to long long, store in long long object + @item + L + @tab + d, i, o, u, x, n + @tab + convert to long long, store in long long object + @item + L + @tab + e, f, g, E, G + @tab + convert to long double, store in long double object + @item + L + @tab + all others + @tab + no effect + @item + t + @tab + d, i, o, u, x, n + @tab + convert input to ptrdiff_t, store in ptrdiff_t object + @item + t + @tab + all others + @tab + no effect + @item + z + @tab + d, i, o, u, x, n + @tab + convert input to size_t, store in size_t object + @item + z + @tab + all others + @tab + no effect + @end multitable + + o <[type]> + + A character to specify what kind of conversion + <> performs. Here is a table of the conversion + characters: + + o+ + o % + No conversion is done; the percent character (<<%>>) is stored. + + o c + Scans one wide character. Corresponding <[arg]>: <<(char *arg)>>. + Otherwise, if an <> specifier is present, the corresponding + <[arg]> is a <<(wchar_t *arg)>>. + + o s + Reads a character string into the array supplied. + Corresponding <[arg]>: <<(char arg[])>>. + If an <> specifier is present, the corresponding <[arg]> is a <<(wchar_t *arg)>>. + + o [<[pattern]>] + Reads a non-empty character string into memory + starting at <[arg]>. This area must be large + enough to accept the sequence and a + terminating null character which will be added + automatically. (<[pattern]> is discussed in the paragraph following + this table). Corresponding <[arg]>: <<(char *arg)>>. + If an <> specifier is present, the corresponding <[arg]> is + a <<(wchar_t *arg)>>. + + o d + Reads a decimal integer into the corresponding <[arg]>: <<(int *arg)>>. + + o o + Reads an octal integer into the corresponding <[arg]>: <<(int *arg)>>. + + o u + Reads an unsigned decimal integer into the corresponding + <[arg]>: <<(unsigned int *arg)>>. + + o x,X + Read a hexadecimal integer into the corresponding <[arg]>: + <<(int *arg)>>. + + o e, f, g + Read a floating-point number into the corresponding <[arg]>: + <<(float *arg)>>. + + o E, F, G + Read a floating-point number into the corresponding <[arg]>: + <<(double *arg)>>. + + o i + Reads a decimal, octal or hexadecimal integer into the + corresponding <[arg]>: <<(int *arg)>>. + + o n + Stores the number of characters read in the corresponding + <[arg]>: <<(int *arg)>>. + + o p + Stores a scanned pointer. ANSI C leaves the details + to each implementation; this implementation treats + <<%p>> exactly the same as <<%U>>. Corresponding + <[arg]>: <<(void **arg)>>. + o- + + A <[pattern]> of characters surrounded by square brackets can be used + instead of the <> type character. <[pattern]> is a set of + characters which define a search set of possible characters making up + the <> input field. If the first character in the brackets is a + caret (<<^>>), the search set is inverted to include all ASCII characters + except those between the brackets. There is no range facility as is + defined in the corresponding non-wide character scanf functions. + Ranges are not part of the POSIX standard. + + Here are some <[pattern]> examples: + o+ + o %[abcd] + matches wide character strings containing only + <>, <>, <>, and <>. + + o %[^abcd] + matches wide character strings containing any characters except + <>, <>, <>, or <>. + + o %[A-DW-Z] + Note: No wide character ranges, so this expression matches wide + character strings containing <>, <<->>, <>, <>, <>. + o- + + Floating point numbers (for field types <>, <>, <>, <>, + <>, <>) must correspond to the following general form: + +. [+/-] ddddd[.]ddd [E|e[+|-]ddd] + + where objects inclosed in square brackets are optional, and <> + represents decimal, octal, or hexadecimal digits. + O- + +RETURNS + <> returns the number of input fields successfully + scanned, converted and stored; the return value does + not include scanned fields which were not stored. + + If <> attempts to read at end-of-file, the return + value is <>. + + If no fields were stored, the return value is <<0>>. + + <> might stop scanning a particular field before + reaching the normal field end character, or may + terminate entirely. + + <> stops scanning and storing the current field + and moves to the next input field (if any) + in any of the following situations: + + O+ + o The assignment suppressing character (<<*>>) appears + after the <<%>> in the format specification; the current + input field is scanned but not stored. + + o <[width]> characters have been read (<[width]> is a + width specification, a positive decimal integer). + + o The next wide character read cannot be converted + under the the current format (for example, + if a <> is read when the format is decimal). + + o The next wide character in the input field does not appear + in the search set (or does appear in the inverted search set). + O- + + When <> stops scanning the current input field for one of + these reasons, the next character is considered unread and + used as the first character of the following input field, or the + first character in a subsequent read operation on the input. + + <> will terminate under the following circumstances: + + O+ + o The next wide character in the input field conflicts + with a corresponding non-whitespace character in the + format string. + + o The next wide character in the input field is <>. + + o The format string has been exhausted. + O- + + When the format string contains a wide character sequence that is + not part of a format specification, the same wide character + sequence must appear in the input; <> will + scan but not store the matched characters. If a + conflict occurs, the first conflicting wide character remains in the + input as if it had never been read. + +PORTABILITY +<> is C99, POSIX-1.2008. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +swscanf (const wchar_t *__restrict str, const wchar_t *__restrict fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = wcslen (str) * sizeof (wchar_t); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._flags2 = 0; + f._ur = 0; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = __ssvfwscanf_r (_REENT, &f, fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_swscanf_r (struct _reent *ptr, const wchar_t *str, const wchar_t *fmt, ...) +{ + int ret; + va_list ap; + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = wcslen (str) * sizeof (wchar_t); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + va_start (ap, fmt); + ret = __ssvfwscanf_r (ptr, &f, fmt, ap); + va_end (ap); + return ret; +} diff --git a/lib/stdio/tmpfile.c b/lib/stdio/tmpfile.c new file mode 100644 index 0000000..5fe6e3b --- /dev/null +++ b/lib/stdio/tmpfile.c @@ -0,0 +1,88 @@ +/* +FUNCTION +<>---create a temporary file + +INDEX + tmpfile +INDEX + _tmpfile_r + +SYNOPSIS + #include + FILE *tmpfile(void); + + FILE *_tmpfile_r(struct _reent *<[reent]>); + +DESCRIPTION +Create a temporary file (a file which will be deleted automatically), +using a name generated by <>. The temporary file is opened with +the mode <<"wb+">>, permitting you to read and write anywhere in it +as a binary file (without any data transformations the host system may +perform for text files). + +The alternate function <<_tmpfile_r>> is a reentrant version. The +argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<> normally returns a pointer to the temporary file. If no +temporary file could be created, the result is NULL, and <> +records the reason for failure. + +PORTABILITY +Both ANSI C and the System V Interface Definition (Issue 2) require +<>. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>, <>. + +<> also requires the global pointer <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +FILE * +_tmpfile_r (struct _reent *ptr) +{ + FILE *fp; + int e; + char *f; + char buf[L_tmpnam]; + int fd; + + do + { + if ((f = _tmpnam_r (ptr, buf)) == NULL) + return NULL; + fd = _open_r (ptr, f, O_RDWR | O_CREAT | O_EXCL | O_BINARY, + S_IRUSR | S_IWUSR); + } + while (fd < 0 && _REENT_ERRNO(ptr) == EEXIST); + if (fd < 0) + return NULL; + fp = _fdopen_r (ptr, fd, "wb+"); + e = _REENT_ERRNO(ptr); + if (!fp) + _close_r (ptr, fd); + (void) _remove_r (ptr, f); + _REENT_ERRNO(ptr) = e; + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +tmpfile (void) +{ + return _tmpfile_r (_REENT); +} + +#endif diff --git a/lib/stdio/tmpnam.c b/lib/stdio/tmpnam.c new file mode 100644 index 0000000..dc04cf3 --- /dev/null +++ b/lib/stdio/tmpnam.c @@ -0,0 +1,191 @@ +/* + * tmpname.c + * Original Author: G. Haley + */ +/* +FUNCTION +<>, <>---name for a temporary file + +INDEX + tmpnam +INDEX + tempnam +INDEX + _tmpnam_r +INDEX + _tempnam_r + +SYNOPSIS + #include + char *tmpnam(char *<[s]>); + char *tempnam(char *<[dir]>, char *<[pfx]>); + char *_tmpnam_r(struct _reent *<[reent]>, char *<[s]>); + char *_tempnam_r(struct _reent *<[reent]>, char *<[dir]>, char *<[pfx]>); + +DESCRIPTION +Use either of these functions to generate a name for a temporary file. +The generated name is guaranteed to avoid collision with other files +(for up to <> calls of either function). + +<> generates file names with the value of <> +(defined in `<>') as the leading directory component of the path. + +You can use the <> argument <[s]> to specify a suitable area +of memory for the generated filename; otherwise, you can call +<> to use an internal static buffer. + +<> allows you more control over the generated filename: you +can use the argument <[dir]> to specify the path to a directory for +temporary files, and you can use the argument <[pfx]> to specify a +prefix for the base filename. + +If <[dir]> is <>, <> will attempt to use the value of +environment variable <> instead; if there is no such value, +<> uses the value of <> (defined in `<>'). + +If you don't need any particular prefix to the basename of temporary +files, you can pass <> as the <[pfx]> argument to <>. + +<<_tmpnam_r>> and <<_tempnam_r>> are reentrant versions of <> +and <> respectively. The extra argument <[reent]> is a +pointer to a reentrancy structure. + +WARNINGS +The generated filenames are suitable for temporary files, but do not +in themselves make files temporary. Files with these names must still +be explicitly removed when you no longer want them. + +If you supply your own data area <[s]> for <>, you must ensure +that it has room for at least <> elements of type <>. + +RETURNS +Both <> and <> return a pointer to the newly +generated filename. + +PORTABILITY +ANSI C requires <>, but does not specify the use of +<>. The System V Interface Definition (Issue 2) requires +both <> and <>. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>, <>. + +The global pointer <> is also required. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local int _tls_inc; +_Thread_local char _tls_emergency[_REENT_EMERGENCY_SIZE]; +#endif + +/* Try to open the file specified, if it can't be opened then try + another one. Return nonzero if successful, otherwise zero. */ + +static int +worker (struct _reent *ptr, + char *result, + const char *part1, + const char *part2, + int part3, + int *part4) +{ + /* Generate the filename and make sure that there isn't one called + it already. */ + + while (1) + { + int t; + _sprintf_r (ptr, result, "%s/%s%x.%x", part1, part2, part3, *part4); + (*part4)++; + t = _open_r (ptr, result, O_RDONLY, 0); + if (t == -1) + { + if (_REENT_ERRNO(ptr) == ENOSYS) + { + result[0] = '\0'; + return 0; + } + break; + } + _close_r (ptr, t); + } + return 1; +} + +char * +_tmpnam_r (struct _reent *p, + char *s) +{ + char *result; + int pid; + + if (s == NULL) + { + /* ANSI states we must use an internal static buffer if s is NULL */ + _REENT_CHECK_EMERGENCY(p); + result = _REENT_EMERGENCY(p); + } + else + { + result = s; + } + pid = _getpid_r (p); + + if (worker (p, result, P_tmpdir, "t", pid, &_REENT_INC(p))) + { + _REENT_INC(p)++; + return result; + } + + return NULL; +} + +char * +_tempnam_r (struct _reent *p, + const char *dir, + const char *pfx) +{ + char *filename; + int length; + const char *prefix = (pfx) ? pfx : ""; + if (dir == NULL && (dir = getenv ("TMPDIR")) == NULL) + dir = P_tmpdir; + + /* two 8 digit numbers + . / */ + length = strlen (dir) + strlen (prefix) + (4 * sizeof (int)) + 2 + 1; + + filename = _malloc_r (p, length); + if (filename) + { + if (! worker (p, filename, dir, prefix, + _getpid_r (p) ^ (int) (_POINTER_INT) p, &_REENT_INC(p))) + return NULL; + } + return filename; +} + +#ifndef _REENT_ONLY + +char * +tempnam (const char *dir, + const char *pfx) +{ + return _tempnam_r (_REENT, dir, pfx); +} + +char * +tmpnam (char *s) +{ + return _tmpnam_r (_REENT, s); +} + +#endif diff --git a/lib/stdio/ungetc.c b/lib/stdio/ungetc.c new file mode 100644 index 0000000..533c28e --- /dev/null +++ b/lib/stdio/ungetc.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* +FUNCTION +<>---push data back into a stream + +INDEX + ungetc +INDEX + _ungetc_r + +SYNOPSIS + #include + int ungetc(int <[c]>, FILE *<[stream]>); + + int _ungetc_r(struct _reent *<[reent]>, int <[c]>, FILE *<[stream]>); + +DESCRIPTION +<> is used to return bytes back to <[stream]> to be read again. +If <[c]> is EOF, the stream is unchanged. Otherwise, the unsigned +char <[c]> is put back on the stream, and subsequent reads will see +the bytes pushed back in reverse order. Pushed byes are lost if the +stream is repositioned, such as by <>, <>, or +<>. + +The underlying file is not changed, but it is possible to push back +something different than what was originally read. Ungetting a +character will clear the end-of-stream marker, and decrement the file +position indicator. Pushing back beyond the beginning of a file gives +unspecified behavior. + +The alternate function <<_ungetc_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +The character pushed back, or <> on error. + +PORTABILITY +ANSI C requires <>, but only requires a pushback buffer of one +byte; although this implementation can handle multiple bytes, not all +can. Pushing back a signed char is a common application bug. + +Supporting OS subroutines required: <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +/* + * Expand the ungetc buffer `in place'. That is, adjust fp->_p when + * the buffer moves, so that it points the same distance from the end, + * and move the bytes in the buffer around as necessary so that they + * are all at the end (stack-style). + */ + +/*static*/ +int +__submore (struct _reent *rptr, + register FILE *fp) +{ + register int i; + register unsigned char *p; + + if (fp->_ub._base == fp->_ubuf) + { + /* + * Get a new buffer (rather than expanding the old one). + */ + if ((p = (unsigned char *) _malloc_r (rptr, (size_t) BUFSIZ)) == NULL) + return EOF; + fp->_ub._base = p; + fp->_ub._size = BUFSIZ; + p += BUFSIZ - sizeof (fp->_ubuf); + for (i = sizeof (fp->_ubuf); --i >= 0;) + p[i] = fp->_ubuf[i]; + fp->_p = p; + return 0; + } + i = fp->_ub._size; + p = (unsigned char *) _realloc_r (rptr, (void *) (fp->_ub._base), i << 1); + if (p == NULL) + return EOF; + (void) memcpy ((void *) (p + i), (void *) p, (size_t) i); + fp->_p = p + i; + fp->_ub._base = p; + fp->_ub._size = i << 1; + return 0; +} + +int +_ungetc_r (struct _reent *rptr, + int c, + register FILE *fp) +{ + if (c == EOF) + return (EOF); + + /* Ensure stdio has been initialized. + ??? Might be able to remove this as some other stdio routine should + have already been called to get the char we are un-getting. */ + + CHECK_INIT (rptr, fp); + + _newlib_flockfile_start (fp); + + ORIENT (fp, -1); + + /* After ungetc, we won't be at eof anymore */ + fp->_flags &= ~__SEOF; + + if ((fp->_flags & __SRD) == 0) + { + /* + * Not already reading: no good unless reading-and-writing. + * Otherwise, flush any current write stuff. + */ + if ((fp->_flags & __SRW) == 0) + { + _newlib_flockfile_exit (fp); + return EOF; + } + if (fp->_flags & __SWR) + { + if (_fflush_r (rptr, fp)) + { + _newlib_flockfile_exit (fp); + return EOF; + } + fp->_flags &= ~__SWR; + fp->_w = 0; + fp->_lbfsize = 0; + } + fp->_flags |= __SRD; + } + c = (unsigned char) c; + + /* + * If we are in the middle of ungetc'ing, just continue. + * This may require expanding the current ungetc buffer. + */ + + if (HASUB (fp)) + { + if (fp->_r >= fp->_ub._size && __submore (rptr, fp)) + { + _newlib_flockfile_exit (fp); + return EOF; + } + *--fp->_p = c; + fp->_r++; + _newlib_flockfile_exit (fp); + return c; + } + + /* + * If we can handle this by simply backing up, do so, + * but never replace the original character. + * (This makes sscanf() work when scanning `const' data.) + */ + + if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c) + { + fp->_p--; + fp->_r++; + _newlib_flockfile_exit (fp); + return c; + } + + /* + * Create an ungetc buffer. + * Initially, we will use the `reserve' buffer. + */ + + fp->_ur = fp->_r; + fp->_up = fp->_p; + fp->_ub._base = fp->_ubuf; + fp->_ub._size = sizeof (fp->_ubuf); + fp->_ubuf[sizeof (fp->_ubuf) - 1] = c; + fp->_p = &fp->_ubuf[sizeof (fp->_ubuf) - 1]; + fp->_r = 1; + _newlib_flockfile_end (fp); + return c; +} + +#ifndef _REENT_ONLY +int +ungetc (int c, + register FILE *fp) +{ + return _ungetc_r (_REENT, c, fp); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/ungetwc.c b/lib/stdio/ungetwc.c new file mode 100644 index 0000000..16d37f2 --- /dev/null +++ b/lib/stdio/ungetwc.c @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 2002-2004 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>---push wide character data back into a stream + +INDEX + ungetwc +INDEX + _ungetwc_r + +SYNOPSIS + #include + #include + wint_t ungetwc(wint_t <[wc]>, FILE *<[stream]>); + + wint_t _ungetwc_r(struct _reent *<[reent]>, wint_t <[wc]>, FILE *<[stream]>); + +DESCRIPTION +<> is used to return wide characters back to <[stream]> to be +read again. If <[wc]> is WEOF, the stream is unchanged. Otherwise, the +wide character <[wc]> is put back on the stream, and subsequent reads will see +the wide chars pushed back in reverse order. Pushed wide chars are lost if the +stream is repositioned, such as by <>, <>, or +<>. + +The underlying file is not changed, but it is possible to push back +something different than what was originally read. Ungetting a +character will clear the end-of-stream marker, and decrement the file +position indicator. Pushing back beyond the beginning of a file gives +unspecified behavior. + +The alternate function <<_ungetwc_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +The wide character pushed back, or <> on error. + +PORTABILITY +C99 +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include "local.h" + +wint_t +_ungetwc_r (struct _reent *ptr, + wint_t wc, + register FILE *fp) +{ + char buf[MB_LEN_MAX]; + size_t len; + + _newlib_flockfile_start (fp); + ORIENT (fp, 1); + if (wc == WEOF) + wc = WEOF; + else if ((len = _wcrtomb_r(ptr, buf, wc, &fp->_mbstate)) == (size_t)-1) + { + fp->_flags |= __SERR; + wc = WEOF; + } + else + while (len-- != 0) + if (_ungetc_r(ptr, (unsigned char)buf[len], fp) == EOF) + { + wc = WEOF; + break; + } + _newlib_flockfile_end (fp); + return wc; +} + +/* + * MT-safe version. + */ +wint_t +ungetwc (wint_t wc, + FILE *fp) +{ + struct _reent *reent = _REENT; + + CHECK_INIT (reent, fp); + return _ungetwc_r (reent, wc, fp); +} diff --git a/lib/stdio/vasiprintf.c b/lib/stdio/vasiprintf.c new file mode 100644 index 0000000..1deb2db --- /dev/null +++ b/lib/stdio/vasiprintf.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This code was based on vsiprintf.c */ +/* doc in vfprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include + +#include "local.h" + +#ifndef _REENT_ONLY + +int +vasiprintf (char **strp, + const char *fmt, + va_list ap) +{ + return _vasiprintf_r (_REENT, strp, fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vasiprintf_r (struct _reent *ptr, + char **strp, + const char *fmt, + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR | __SMBF ; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + ret = _svfiprintf_r (ptr, &f, fmt, ap); + if (ret >= 0) + { + *f._p = 0; + *strp = (char *) f._bf._base; + } + return ret; +} diff --git a/lib/stdio/vasniprintf.c b/lib/stdio/vasniprintf.c new file mode 100644 index 0000000..b24cd96 --- /dev/null +++ b/lib/stdio/vasniprintf.c @@ -0,0 +1,69 @@ +/* Copyright (C) 2007, 2008 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +/* This code was derived from asprintf.c */ +/* doc in viprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +char * +_vasniprintf_r (struct _reent *ptr, + char *buf, + size_t *lenp, + const char *fmt, + va_list ap) +{ + int ret; + FILE f; + size_t len = *lenp; + + if (buf && len) + { + /* mark an existing buffer, but allow allocation of larger string */ + f._flags = __SWR | __SSTR | __SOPT; + } + else + { + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + len = 0; + buf = NULL; + } + f._bf._base = f._p = (unsigned char *) buf; + /* For now, inherit the 32-bit signed limit of FILE._bf._size. + FIXME - it would be nice to rewrite sys/reent.h to support size_t + for _size. */ + if (len > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return NULL; + } + f._bf._size = f._w = len; + f._file = -1; /* No file. */ + ret = _svfiprintf_r (ptr, &f, fmt, ap); + if (ret < 0) + return NULL; + *lenp = ret; + *f._p = '\0'; + return (char *) f._bf._base; +} + +#ifndef _REENT_ONLY + +char * +vasniprintf (char *buf, + size_t *lenp, + const char *fmt, + va_list ap) +{ + return _vasniprintf_r (_REENT, buf, lenp, fmt, ap); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/vasnprintf.c b/lib/stdio/vasnprintf.c new file mode 100644 index 0000000..b3787ec --- /dev/null +++ b/lib/stdio/vasnprintf.c @@ -0,0 +1,81 @@ +/* Copyright (C) 2007 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +/* This code was derived from asprintf.c */ +/* doc in vfprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +char * +_vasnprintf_r (struct _reent *ptr, + char *buf, + size_t *lenp, + const char *fmt, + va_list ap) +{ + int ret; + FILE f; + size_t len = *lenp; + + if (buf && len) + { + /* mark an existing buffer, but allow allocation of larger string */ + f._flags = __SWR | __SSTR | __SOPT; + } + else + { + /* mark a zero-length reallocatable buffer */ + f._flags = __SWR | __SSTR | __SMBF; + len = 0; + buf = NULL; + } + f._bf._base = f._p = (unsigned char *) buf; + /* For now, inherit the 32-bit signed limit of FILE._bf._size. + FIXME - it would be nice to rewrite sys/reent.h to support size_t + for _size. */ + if (len > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return NULL; + } + f._bf._size = f._w = len; + f._file = -1; /* No file. */ + ret = _svfprintf_r (ptr, &f, fmt, ap); + if (ret < 0) + return NULL; + *lenp = ret; + *f._p = '\0'; + return (char *) f._bf._base; +} + +#ifdef _NANO_FORMATTED_IO +char * +_vasniprintf_r (struct _reent*, char *, size_t *, + const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vasnprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +char * +vasnprintf (char *buf, + size_t *lenp, + const char *fmt, + va_list ap) +{ + return _vasnprintf_r (_REENT, buf, lenp, fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +char * +vasniprintf (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vasnprintf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/vasprintf.c b/lib/stdio/vasprintf.c new file mode 100644 index 0000000..d7ec9c8 --- /dev/null +++ b/lib/stdio/vasprintf.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* This code was based on vsprintf.c */ +/* doc in vfprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include + +#include "local.h" + +#ifndef _REENT_ONLY + +int +vasprintf (char **strp, + const char *fmt, + va_list ap) +{ + return _vasprintf_r (_REENT, strp, fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +vasiprintf (char **, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vasprintf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_vasprintf_r (struct _reent *ptr, + char **strp, + const char *fmt, + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR | __SMBF ; + f._bf._base = f._p = NULL; + f._bf._size = f._w = 0; + f._file = -1; /* No file. */ + ret = _svfprintf_r (ptr, &f, fmt, ap); + if (ret >= 0) + { + *f._p = 0; + *strp = (char *) f._bf._base; + } + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +_vasiprintf_r (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vasprintf_r"))); +#endif diff --git a/lib/stdio/vdiprintf.c b/lib/stdio/vdiprintf.c new file mode 100644 index 0000000..22a71b3 --- /dev/null +++ b/lib/stdio/vdiprintf.c @@ -0,0 +1,45 @@ +/* Copyright 2005, 2007 Shaun Jackman + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +/* doc in diprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +int +_vdiprintf_r (struct _reent *ptr, + int fd, + const char *format, + va_list ap) +{ + char *p; + char buf[512]; + size_t n = sizeof buf; + + _REENT_SMALL_CHECK_INIT (ptr); + p = _vasniprintf_r (ptr, buf, &n, format, ap); + if (!p) + return -1; + n = _write_r (ptr, fd, p, n); + if (p != buf) + _free_r (ptr, p); + return n; +} + +#ifndef _REENT_ONLY + +int +vdiprintf (int fd, + const char *format, + va_list ap) +{ + return _vdiprintf_r (_REENT, fd, format, ap); +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/vdprintf.c b/lib/stdio/vdprintf.c new file mode 100644 index 0000000..d22463e --- /dev/null +++ b/lib/stdio/vdprintf.c @@ -0,0 +1,56 @@ +/* Copyright 2005, 2007 Shaun Jackman + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ +/* doc in dprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +int +_vdprintf_r (struct _reent *ptr, + int fd, + const char *__restrict format, + va_list ap) +{ + char *p; + char buf[512]; + size_t n = sizeof buf; + + _REENT_SMALL_CHECK_INIT (ptr); + p = _vasnprintf_r (ptr, buf, &n, format, ap); + if (!p) + return -1; + n = _write_r (ptr, fd, p, n); + if (p != buf) + _free_r (ptr, p); + return n; +} + +#ifdef _NANO_FORMATTED_IO +int +_vdiprintf_r (struct _reent *, int, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vdprintf_r"))); +#endif + +#ifndef _REENT_ONLY + +int +vdprintf (int fd, + const char *__restrict format, + va_list ap) +{ + return _vdprintf_r (_REENT, fd, format, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +vdiprintf (int, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vdprintf"))); +#endif +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/vfieeefp.h b/lib/stdio/vfieeefp.h new file mode 100644 index 0000000..e85cabb --- /dev/null +++ b/lib/stdio/vfieeefp.h @@ -0,0 +1,284 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991 by AT&T. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Please send bug reports to + David M. Gay + AT&T Bell Laboratories, Room 2C-463 + 600 Mountain Avenue + Murray Hill, NJ 07974-2070 + U.S.A. + dmg@research.att.com or research!dmg + */ + +/* This header file is a modification of mprec.h that only contains floating + point union code. */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __IEEE_LITTLE_ENDIAN +#define IEEE_8087 +#endif + +#ifdef __IEEE_BIG_ENDIAN +#define IEEE_MC68k +#endif + +#ifdef __Z8000__ +#define Just_16 +#endif + +#ifdef Unsigned_Shifts +#define Sign_Extend(a,b) if (b < 0) a |= (__uint32_t)0xffff0000; +#else +#define Sign_Extend(a,b) /*no-op*/ +#endif + +#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 +Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. +#endif + +#ifdef _WANT_IO_LONG_DOUBLE +/* If we are going to examine or modify specific bits in a long double using + the lword0 or lwordx macros, then we must wrap the long double inside + a union. This is necessary to avoid undefined behavior according to + the ANSI C spec. */ + +#ifdef IEEE_8087 +#if LDBL_MANT_DIG == 24 +struct ldieee +{ + unsigned manh:23; + unsigned exp:8; + unsigned sign:1; +} __packed; +#elif LDBL_MANT_DIG == 53 +struct ldieee +{ + unsigned manl:20; + unsigned manh:32; + unsigned exp:11; + unsigned sign:1; +} __packed; +#elif LDBL_MANT_DIG == 64 +struct ldieee +{ + unsigned manl:32; + unsigned manh:32; + unsigned exp:15; + unsigned sign:1; +} __packed; +#elif LDBL_MANT_DIG > 64 +struct ldieee +{ + unsigned manl3:16; + unsigned manl2:32; + unsigned manl:32; + unsigned manh:32; + unsigned exp:15; + unsigned sign:1; +} __packed; +#endif /* LDBL_MANT_DIG */ +#else /* !IEEE_8087 */ +#if LDBL_MANT_DIG == 24 +struct ldieee +{ + unsigned sign:1; + unsigned exp:8; + unsigned manh:23; +} __packed; +#elif LDBL_MANT_DIG == 53 +struct ldieee +{ + unsigned sign:1; + unsigned exp:11; + unsigned manh:32; + unsigned manl:20; +} __packed; +#elif LDBL_MANT_DIG == 64 +struct ldieee +{ + unsigned sign:1; + unsigned exp:15; + unsigned manh:32; + unsigned manl:32; +} __packed; +#elif LDBL_MANT_DIG > 64 +struct ldieee +{ + unsigned sign:1; + unsigned exp:15; + unsigned manh:32; + unsigned manl:32; + unsigned manl2:32; + unsigned manl3:16; +} __packed; +#endif /* LDBL_MANT_DIG */ +#endif /* !IEEE_8087 */ +#endif /* _WANT_IO_LONG_DOUBLE */ + +/* If we are going to examine or modify specific bits in a double using + the word0 and/or word1 macros, then we must wrap the double inside + a union. This is necessary to avoid undefined behavior according to + the ANSI C spec. */ +union double_union +{ + double d; + __uint32_t i[2]; +}; + +#ifdef IEEE_8087 +#define word0(x) (x.i[1]) +#define word1(x) (x.i[0]) +#else +#define word0(x) (x.i[0]) +#define word1(x) (x.i[1]) +#endif + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#if defined(IEEE_8087) + defined(IEEE_MC68k) +#if defined (_DOUBLE_IS_32BITS) +#define Exp_shift 23 +#define Exp_shift1 23 +#define Exp_msk1 ((__uint32_t)0x00800000L) +#define Exp_msk11 ((__uint32_t)0x00800000L) +#define Exp_mask ((__uint32_t)0x7f800000L) +#define P 24 +#define Bias 127 +#define IEEE_Arith +#define Emin (-126) +#define Exp_1 ((__uint32_t)0x3f800000L) +#define Exp_11 ((__uint32_t)0x3f800000L) +#define Ebits 8 +#define Frac_mask ((__uint32_t)0x007fffffL) +#define Frac_mask1 ((__uint32_t)0x007fffffL) +#define Ten_pmax 10 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Ten_pmax 10 +#define Bletch 2 +#define Bndry_mask ((__uint32_t)0x007fffffL) +#define Bndry_mask1 ((__uint32_t)0x007fffffL) +#define LSB 1 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 5 +#define Int_max 6 +#define Infinite(x) (word0(x) == ((__uint32_t)0x7f800000L)) +#undef word0 +#undef word1 + +#define word0(x) (x.i[0]) +#define word1(x) 0 +#else + +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 ((__uint32_t)0x100000L) +#define Exp_msk11 ((__uint32_t)0x100000L) +#define Exp_mask ((__uint32_t)0x7ff00000L) +#define P 53 +#define Bias 1023 +#define IEEE_Arith +#define Emin (-1022) +#define Exp_1 ((__uint32_t)0x3ff00000L) +#define Exp_11 ((__uint32_t)0x3ff00000L) +#define Ebits 11 +#define Frac_mask ((__uint32_t)0xfffffL) +#define Frac_mask1 ((__uint32_t)0xfffffL) +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask ((__uint32_t)0xfffffL) +#define Bndry_mask1 ((__uint32_t)0xfffffL) +#define LSB 1 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 +#define Infinite(x) (word0(x) == ((__uint32_t)0x7ff00000L)) /* sufficient test for here */ +#endif + +#else +#undef Sudden_Underflow +#define Sudden_Underflow +#ifdef IBM +#define Exp_shift 24 +#define Exp_shift1 24 +#define Exp_msk1 ((__uint32_t)0x1000000L) +#define Exp_msk11 ((__uint32_t)0x1000000L) +#define Exp_mask ((__uint32_t)0x7f000000L) +#define P 14 +#define Bias 65 +#define Exp_1 ((__uint32_t)0x41000000L) +#define Exp_11 ((__uint32_t)0x41000000L) +#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ +#define Frac_mask ((__uint32_t)0xffffffL) +#define Frac_mask1 ((__uint32_t)0xffffffL) +#define Bletch 4 +#define Ten_pmax 22 +#define Bndry_mask ((__uint32_t)0xefffffL) +#define Bndry_mask1 ((__uint32_t)0xffffffL) +#define LSB 1 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Log2P 4 +#define Tiny0 ((__uint32_t)0x100000L) +#define Tiny1 0 +#define Quick_max 14 +#define Int_max 15 +#else /* VAX */ +#define Exp_shift 23 +#define Exp_shift1 7 +#define Exp_msk1 0x80 +#define Exp_msk11 ((__uint32_t)0x800000L) +#define Exp_mask ((__uint32_t)0x7f80L) +#define P 56 +#define Bias 129 +#define Exp_1 ((__uint32_t)0x40800000L) +#define Exp_11 ((__uint32_t)0x4080L) +#define Ebits 8 +#define Frac_mask ((__uint32_t)0x7fffffL) +#define Frac_mask1 ((__uint32_t)0xffff007fL) +#define Ten_pmax 24 +#define Bletch 2 +#define Bndry_mask ((__uint32_t)0xffff007fL) +#define Bndry_mask1 ((__uint32_t)0xffff007fL) +#define LSB ((__uint32_t)0x10000L) +#define Sign_bit ((__uint32_t)0x8000L) +#define Log2P 1 +#define Tiny0 0x80 +#define Tiny1 0 +#define Quick_max 15 +#define Int_max 15 +#endif +#endif + + diff --git a/lib/stdio/vfiprintf.c b/lib/stdio/vfiprintf.c new file mode 100644 index 0000000..83394a6 --- /dev/null +++ b/lib/stdio/vfiprintf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vfprintf.c" diff --git a/lib/stdio/vfiscanf.c b/lib/stdio/vfiscanf.c new file mode 100644 index 0000000..261122e --- /dev/null +++ b/lib/stdio/vfiscanf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vfscanf.c" diff --git a/lib/stdio/vfiwprintf.c b/lib/stdio/vfiwprintf.c new file mode 100644 index 0000000..32546b5 --- /dev/null +++ b/lib/stdio/vfiwprintf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vfwprintf.c" diff --git a/lib/stdio/vfiwscanf.c b/lib/stdio/vfiwscanf.c new file mode 100644 index 0000000..8b96cd3 --- /dev/null +++ b/lib/stdio/vfiwscanf.c @@ -0,0 +1,2 @@ +#define INTEGER_ONLY +#include "vfwscanf.c" diff --git a/lib/stdio/vfprintf.c b/lib/stdio/vfprintf.c new file mode 100644 index 0000000..6a198e2 --- /dev/null +++ b/lib/stdio/vfprintf.c @@ -0,0 +1,2345 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>, <>, <>, <>---format argument list + +INDEX + vfprintf +INDEX + _vfprintf_r +INDEX + vprintf +INDEX + _vprintf_r +INDEX + vsprintf +INDEX + _vsprintf_r +INDEX + vsnprintf +INDEX + _vsnprintf_r +INDEX + vasprintf +INDEX + _vasprintf_r +INDEX + vasnprintf +INDEX + _vasnprintf_r + +SYNOPSIS + #include + #include + int vprintf(const char *<[fmt]>, va_list <[list]>); + int vfprintf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsprintf(char *<[str]>, const char *<[fmt]>, va_list <[list]>); + int vsnprintf(char *<[str]>, size_t <[size]>, const char *<[fmt]>, + va_list <[list]>); + int vasprintf(char **<[strp]>, const char *<[fmt]>, va_list <[list]>); + char *vasnprintf(char *<[str]>, size_t *<[size]>, const char *<[fmt]>, + va_list <[list]>); + + int _vprintf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfprintf_r(struct _reent *<[reent]>, FILE *<[fp]>, + const char *<[fmt]>, va_list <[list]>); + int _vsprintf_r(struct _reent *<[reent]>, char *<[str]>, + const char *<[fmt]>, va_list <[list]>); + int _vasprintf_r(struct _reent *<[reent]>, char **<[str]>, + const char *<[fmt]>, va_list <[list]>); + int _vsnprintf_r(struct _reent *<[reent]>, char *<[str]>, + size_t <[size]>, const char *<[fmt]>, va_list <[list]>); + char *_vasnprintf_r(struct _reent *<[reent]>, char *<[str]>, + size_t *<[size]>, const char *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, <>, <>, <>, +and <> are (respectively) variants of <>, +<>, <>, <>, <>, and +<>. They differ only in allowing their caller to pass the +variable argument list as a <> object (initialized by +<>) rather than directly accepting a variable number of +arguments. The caller is responsible for calling <>. + +<<_vprintf_r>>, <<_vfprintf_r>>, <<_vasprintf_r>>, <<_vsprintf_r>>, +<<_vsnprintf_r>>, and <<_vasnprintf_r>> are reentrant versions of the +above. + +RETURNS +The return values are consistent with the corresponding functions. + +PORTABILITY +ANSI C requires <>, <>, <>, and +<>. The remaining functions are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +/*static char *sccsid = "from: @(#)vfprintf.c 5.50 (Berkeley) 12/16/92";*/ +static char *rcsid = "$Id$"; +#endif /* LIBC_SCCS and not lint */ + +/* + * Actual printf innards. + * + * This code is large and complicated... + */ +#include + +#ifdef INTEGER_ONLY +# define VFPRINTF vfiprintf +# ifdef STRING_ONLY +# define _VFPRINTF_R _svfiprintf_r +# else +# define _VFPRINTF_R _vfiprintf_r +# endif +#else +# define VFPRINTF vfprintf +# ifdef STRING_ONLY +# define _VFPRINTF_R _svfprintf_r +# else +# define _VFPRINTF_R _vfprintf_r +# endif +# ifndef NO_FLOATING_POINT +# define FLOATING_POINT +# endif +#endif + +#define _NO_POS_ARGS +#ifdef _WANT_IO_POS_ARGS +# undef _NO_POS_ARGS +#endif + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" +#include "fvwrite.h" +#include "vfieeefp.h" + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL +#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG) +#undef _NO_LONGDBL +#endif + +#define _NO_LONGLONG +#if defined _WANT_IO_LONG_LONG \ + && (defined __GNUC__ || __STDC_VERSION__ >= 199901L) +# undef _NO_LONGLONG +#endif + +#ifdef STRING_ONLY +# ifdef _FVWRITE_IN_STREAMIO +# define __SPRINT __ssprint_r +# else +# define __SPRINT __ssputs_r +# endif +#else +# ifdef _FVWRITE_IN_STREAMIO +# define __SPRINT __sprint_r +# else +# define __SPRINT __sfputs_r +# endif +#endif + +/* The __sprint_r/__ssprint_r functions are shared between all versions of + vfprintf and vfwprintf. They must only be defined once, which we do in + the INTEGER_ONLY versions here. */ +#ifdef STRING_ONLY +#ifdef INTEGER_ONLY +#ifndef _FVWRITE_IN_STREAMIO +int +__ssputs_r (struct _reent *ptr, + FILE *fp, + const char *buf, + size_t len) +{ + register int w; + + w = fp->_w; + if (len >= w && fp->_flags & (__SMBF | __SOPT)) { + /* must be asprintf family */ + unsigned char *str; + int curpos = (fp->_p - fp->_bf._base); + /* Choose a geometric growth factor to avoid + * quadratic realloc behavior, but use a rate less + * than (1+sqrt(5))/2 to accomodate malloc + * overhead. asprintf EXPECTS us to overallocate, so + * that it can add a trailing \0 without + * reallocating. The new allocation should thus be + * max(prev_size*1.5, curpos+len+1). */ + int newsize = fp->_bf._size * 3 / 2; + if (newsize < curpos + len + 1) + newsize = curpos + len + 1; + if (fp->_flags & __SOPT) + { + /* asnprintf leaves original buffer alone. */ + str = (unsigned char *)_malloc_r (ptr, newsize); + if (!str) + { + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + memcpy (str, fp->_bf._base, curpos); + fp->_flags = (fp->_flags & ~__SOPT) | __SMBF; + } + else + { + str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, + newsize); + if (!str) { + /* Free unneeded buffer. */ + _free_r (ptr, fp->_bf._base); + /* Ensure correct errno, even if free + * changed it. */ + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + } + fp->_bf._base = str; + fp->_p = str + curpos; + fp->_bf._size = newsize; + w = len; + fp->_w = newsize - curpos; + } + if (len < w) + w = len; + (void)memmove ((void *) fp->_p, (void *) buf, (size_t) (w)); + fp->_w -= w; + fp->_p += w; + + return 0; + +err: + fp->_flags |= __SERR; + return EOF; +} +#endif + +int +__ssprint_r (struct _reent *ptr, + FILE *fp, + register struct __suio *uio) +{ + register size_t len; + register int w; + register struct __siov *iov; + register const char *p = NULL; + + iov = uio->uio_iov; + len = 0; + + if (uio->uio_resid == 0) { + uio->uio_iovcnt = 0; + return (0); + } + + do { + while (len == 0) { + p = iov->iov_base; + len = iov->iov_len; + iov++; + } + w = fp->_w; + if (len >= w && fp->_flags & (__SMBF | __SOPT)) { + /* must be asprintf family */ + unsigned char *str; + int curpos = (fp->_p - fp->_bf._base); + /* Choose a geometric growth factor to avoid + * quadratic realloc behavior, but use a rate less + * than (1+sqrt(5))/2 to accomodate malloc + * overhead. asprintf EXPECTS us to overallocate, so + * that it can add a trailing \0 without + * reallocating. The new allocation should thus be + * max(prev_size*1.5, curpos+len+1). */ + int newsize = fp->_bf._size * 3 / 2; + if (newsize < curpos + len + 1) + newsize = curpos + len + 1; + if (fp->_flags & __SOPT) + { + /* asnprintf leaves original buffer alone. */ + str = (unsigned char *)_malloc_r (ptr, newsize); + if (!str) + { + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + memcpy (str, fp->_bf._base, curpos); + fp->_flags = (fp->_flags & ~__SOPT) | __SMBF; + } + else + { + str = (unsigned char *)_realloc_r (ptr, fp->_bf._base, + newsize); + if (!str) { + /* Free unneeded buffer. */ + _free_r (ptr, fp->_bf._base); + /* Ensure correct errno, even if free + * changed it. */ + _REENT_ERRNO(ptr) = ENOMEM; + goto err; + } + } + fp->_bf._base = str; + fp->_p = str + curpos; + fp->_bf._size = newsize; + w = len; + fp->_w = newsize - curpos; + } + if (len < w) + w = len; + (void)memmove ((void *) fp->_p, (void *) p, (size_t) (w)); + fp->_w -= w; + fp->_p += w; + w = len; /* pretend we copied all */ + p += w; + len -= w; + } while ((uio->uio_resid -= w) != 0); + + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return 0; + +err: + fp->_flags |= __SERR; + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return EOF; +} +#else /* !INTEGER_ONLY */ +#ifndef _FVWRITE_IN_STREAMIO +int __ssputs_r (struct _reent *, FILE *, const char *, size_t); +#endif +int __ssprint_r (struct _reent *, FILE *, register struct __suio *); +#endif /* !INTEGER_ONLY */ + +#else /* !STRING_ONLY */ +#ifdef INTEGER_ONLY + +#ifndef _FVWRITE_IN_STREAMIO +int +__sfputs_r (struct _reent *ptr, + FILE *fp, + const char *buf, + size_t len) +{ + register int i; + +#if defined _WIDE_ORIENT && (!defined _ELIX_LEVEL || _ELIX_LEVEL >= 4) + if (fp->_flags2 & __SWID) { + wchar_t *p; + + p = (wchar_t *) buf; + for (i = 0; i < (len / sizeof (wchar_t)); i++) { + if (_fputwc_r (ptr, p[i], fp) == WEOF) + return -1; + } + } else { +#else + { +#endif + for (i = 0; i < len; i++) { + if (_fputc_r (ptr, buf[i], fp) == EOF) + return -1; + } + } + return (0); +} +#endif +/* + * Flush out all the vectors defined by the given uio, + * then reset it so that it can be reused. + */ +int +__sprint_r (struct _reent *ptr, + FILE *fp, + register struct __suio *uio) +{ + register int err = 0; + + if (uio->uio_resid == 0) { + uio->uio_iovcnt = 0; + return (0); + } +#if defined _WIDE_ORIENT && (!defined _ELIX_LEVEL || _ELIX_LEVEL >= 4) + if (fp->_flags2 & __SWID) { + struct __siov *iov; + wchar_t *p; + int i, len; + + iov = uio->uio_iov; + for (; uio->uio_resid != 0; + uio->uio_resid -= len * sizeof (wchar_t), iov++) { + p = (wchar_t *) iov->iov_base; + len = iov->iov_len / sizeof (wchar_t); + for (i = 0; i < len; i++) { + if (_fputwc_r (ptr, p[i], fp) == WEOF) { + err = -1; + goto out; + } + } + } + } else +#endif + err = __sfvwrite_r(ptr, fp, uio); +out: + uio->uio_resid = 0; + uio->uio_iovcnt = 0; + return (err); +} +#else /* !INTEGER_ONLY */ +#ifndef _FVWRITE_IN_STREAMIO +int __sfputs_r (struct _reent *, FILE *, const char *buf, size_t); +#endif +int __sprint_r (struct _reent *, FILE *, register struct __suio *); +#endif /* !INTEGER_ONLY */ + +#ifdef _UNBUF_STREAM_OPT +/* + * Helper function for `fprintf to unbuffered unix file': creates a + * temporary buffer. We only work on write-only files; this avoids + * worries about ungetc buffers and so forth. + * + * Make sure to avoid inlining. + */ +_NOINLINE_STATIC int +__sbprintf (struct _reent *rptr, + register FILE *fp, + const char *fmt, + va_list ap) +{ + int ret; + FILE fake; + unsigned char buf[BUFSIZ]; + + /* copy the important variables */ + fake._flags = fp->_flags & ~__SNBF; + fake._flags2 = fp->_flags2; + fake._file = fp->_file; + fake._cookie = fp->_cookie; + fake._write = fp->_write; + + /* set up the buffer */ + fake._bf._base = fake._p = buf; + fake._bf._size = fake._w = sizeof (buf); + fake._lbfsize = 0; /* not actually used, but Just In Case */ +#ifndef __SINGLE_THREAD__ + __lock_init_recursive (fake._lock); +#endif + + /* do the work, then copy any error status */ + ret = _VFPRINTF_R (rptr, &fake, fmt, ap); + if (ret >= 0 && _fflush_r (rptr, &fake)) + ret = EOF; + if (fake._flags & __SERR) + fp->_flags |= __SERR; + +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fake._lock); +#endif + return (ret); +} +#endif /* _UNBUF_STREAM_OPT */ +#endif /* !STRING_ONLY */ + + +#if defined (FLOATING_POINT) || defined (_WANT_IO_C99_FORMATS) +# include +#endif +#ifdef FLOATING_POINT +# include + +/* For %La, an exponent of 15 bits occupies the exponent character, a + sign, and up to 5 digits. */ +# define MAXEXPLEN 7 +# define DEFPREC 6 + +# ifdef _NO_LONGDBL + +extern char *_dtoa_r (struct _reent *, double, int, + int, int *, int *, char **); + +# define _PRINTF_FLOAT_TYPE double +# define _DTOA_R _dtoa_r +# define FREXP frexp + +# else /* !_NO_LONGDBL */ + +extern char *_ldtoa_r (struct _reent *, _LONG_DOUBLE, int, + int, int *, int *, char **); + +extern int _ldcheck (_LONG_DOUBLE *); + +# define _PRINTF_FLOAT_TYPE _LONG_DOUBLE +# define _DTOA_R _ldtoa_r +# define FREXP frexpl +# endif /* !_NO_LONGDBL */ + +static char *cvt(struct _reent *, _PRINTF_FLOAT_TYPE, int, int, char *, int *, + int, int *, char *); + +static int exponent(char *, int, int); + +#endif /* FLOATING_POINT */ + +/* BUF must be big enough for the maximum %#llo (assuming long long is + at most 64 bits, this would be 23 characters), the maximum + multibyte character %C, and the maximum default precision of %La + (assuming long double is at most 128 bits with 113 bits of + mantissa, this would be 29 characters). %e, %f, and %g use + reentrant storage shared with mprec. All other formats that use + buf get by with fewer characters. Making BUF slightly bigger + reduces the need for malloc in %.*a and %S, when large precision or + long strings are processed. + The bigger size of 100 bytes is used on systems which allow number + strings using the locale's grouping character. Since that's a multibyte + value, we should use a conservative value. + */ +#ifdef _WANT_IO_C99_FORMATS +#define BUF 100 +#else +#define BUF 40 +#endif +#if defined _MB_CAPABLE && MB_LEN_MAX > BUF +# undef BUF +# define BUF MB_LEN_MAX +#endif + +#ifndef _NO_LONGLONG +# define quad_t long long +# define u_quad_t unsigned long long +#else +# define quad_t long +# define u_quad_t unsigned long +#endif + +typedef quad_t * quad_ptr_t; +typedef void *void_ptr_t; +typedef char * char_ptr_t; +typedef long * long_ptr_t; +typedef int * int_ptr_t; +typedef short * short_ptr_t; + +#ifndef _NO_POS_ARGS +# ifdef NL_ARGMAX +# define MAX_POS_ARGS NL_ARGMAX +# else +# define MAX_POS_ARGS 32 +# endif + +union arg_val +{ + int val_int; + u_int val_u_int; + long val_long; + u_long val_u_long; + float val_float; + double val_double; + _LONG_DOUBLE val__LONG_DOUBLE; + int_ptr_t val_int_ptr_t; + short_ptr_t val_short_ptr_t; + long_ptr_t val_long_ptr_t; + char_ptr_t val_char_ptr_t; + quad_ptr_t val_quad_ptr_t; + void_ptr_t val_void_ptr_t; + quad_t val_quad_t; + u_quad_t val_u_quad_t; + wint_t val_wint_t; +}; + +static union arg_val * +get_arg (struct _reent *data, int n, char *fmt, + va_list *ap, int *numargs, union arg_val *args, + int *arg_type, char **last_fmt); +#endif /* !_NO_POS_ARGS */ + +/* + * Macros for converting digits to letters and vice versa + */ +#define to_digit(c) ((c) - '0') +#define is_digit(c) ((unsigned)to_digit (c) <= 9) +#define to_char(n) ((n) + '0') + +/* + * Flags used during conversion. + */ +#define ALT 0x001 /* alternate form */ +#define HEXPREFIX 0x002 /* add 0x or 0X prefix */ +#define LADJUST 0x004 /* left adjustment */ +#define LONGDBL 0x008 /* long double */ +#define LONGINT 0x010 /* long integer */ +#ifndef _NO_LONGLONG +# define QUADINT 0x020 /* quad integer */ +#else /* ifdef _NO_LONGLONG, make QUADINT equivalent to LONGINT, so + that %lld behaves the same as %ld, not as %d, as expected if: + sizeof (long long) = sizeof long > sizeof int */ +# define QUADINT LONGINT +#endif +#define SHORTINT 0x040 /* short integer */ +#define ZEROPAD 0x080 /* zero (as opposed to blank) pad */ +#define FPT 0x100 /* Floating point number */ +#ifdef _WANT_IO_C99_FORMATS +# define CHARINT 0x200 /* char as integer */ +#else /* define as 0, to make SARG and UARG occupy fewer instructions */ +# define CHARINT 0 +#endif +#ifdef _WANT_IO_C99_FORMATS +# define GROUPING 0x400 /* use grouping ("'" flag) */ +#endif + +int _VFPRINTF_R (struct _reent *, FILE *, const char *, va_list); + +#ifndef STRING_ONLY +int +VFPRINTF (FILE * fp, + const char *fmt0, + va_list ap) +{ + int result; + result = _VFPRINTF_R (_REENT, fp, fmt0, ap); + return result; +} +#endif /* STRING_ONLY */ + +int +_VFPRINTF_R (struct _reent *data, + FILE * fp, + const char *fmt0, + va_list ap) +{ + register char *fmt; /* format string */ + register int ch; /* character from fmt */ + register int n, m; /* handy integers (short term usage) */ + register char *cp; /* handy char pointer (short term usage) */ + register int flags; /* flags as above */ + char *fmt_anchor; /* current format spec being processed */ +#ifndef _NO_POS_ARGS + int N; /* arg number */ + int arg_index; /* index into args processed directly */ + int numargs; /* number of varargs read */ + char *saved_fmt; /* saved fmt pointer */ + union arg_val args[MAX_POS_ARGS]; + int arg_type[MAX_POS_ARGS]; + int is_pos_arg; /* is current format positional? */ + int old_is_pos_arg; /* is current format positional? */ +#endif + int ret; /* return value accumulator */ + int width; /* width from format (%8d), or 0 */ + int prec; /* precision from format (%.3d), or -1 */ + char sign; /* sign prefix (' ', '+', '-', or \0) */ +#ifdef _WANT_IO_C99_FORMATS + /* locale specific numeric grouping */ + char *thousands_sep = NULL; + size_t thsnd_len = 0; + const char *grouping = NULL; +#endif +#ifdef FLOATING_POINT + char *decimal_point = _localeconv_r (data)->decimal_point; + size_t decp_len = strlen (decimal_point); + char softsign; /* temporary negative sign for floats */ + union { int i; _PRINTF_FLOAT_TYPE fp; } _double_ = {0}; +# define _fpvalue (_double_.fp) + int expt; /* integer value of exponent */ + int expsize = 0; /* character count for expstr */ + char expstr[MAXEXPLEN]; /* buffer for exponent string */ + int lead; /* sig figs before decimal or group sep */ +#endif /* FLOATING_POINT */ +#if defined (FLOATING_POINT) || defined (_WANT_IO_C99_FORMATS) + int ndig = 0; /* actual number of digits returned by cvt */ +#endif +#if defined (FLOATING_POINT) && defined (_WANT_IO_C99_FORMATS) + int nseps; /* number of group separators with ' */ + int nrepeats; /* number of repeats of the last group */ +#endif + u_quad_t _uquad; /* integer arguments %[diouxX] */ + enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */ + int dprec; /* a copy of prec if [diouxX], 0 otherwise */ + int realsz; /* field size expanded by dprec */ + int size; /* size of converted field or string */ + char *xdigs = NULL; /* digits for [xX] conversion */ +#ifdef _FVWRITE_IN_STREAMIO +#define NIOV 8 + struct __suio uio; /* output information: summary */ + struct __siov iov[NIOV];/* ... and individual io vectors */ + register struct __siov *iovp;/* for PRINT macro */ +#endif + char buf[BUF]; /* space for %c, %S, %[diouxX], %[aA] */ + char ox[2]; /* space for 0x hex-prefix */ +#ifdef _MB_CAPABLE + wchar_t wc; + mbstate_t state; /* mbtowc calls from library must not change state */ +#endif + char *malloc_buf = NULL;/* handy pointer for malloced buffers */ + + /* + * Choose PADSIZE to trade efficiency vs. size. If larger printf + * fields occur frequently, increase PADSIZE and make the initialisers + * below longer. + */ +#define PADSIZE 16 /* pad chunk size */ + static const char blanks[PADSIZE] = + {' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}; + static const char zeroes[PADSIZE] = + {'0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'}; + +#ifdef _MB_CAPABLE + memset (&state, '\0', sizeof (state)); +#endif + /* + * BEWARE, these `goto error' on error, and PAD uses `n'. + */ +#ifdef _FVWRITE_IN_STREAMIO +#define PRINT(ptr, len) { \ + iovp->iov_base = (ptr); \ + iovp->iov_len = (len); \ + uio.uio_resid += (len); \ + iovp++; \ + if (++uio.uio_iovcnt >= NIOV) { \ + if (__SPRINT(data, fp, &uio)) \ + goto error; \ + iovp = iov; \ + } \ +} +#define PAD(howmany, with) { \ + if ((n = (howmany)) > 0) { \ + while (n > PADSIZE) { \ + PRINT (with, PADSIZE); \ + n -= PADSIZE; \ + } \ + PRINT (with, n); \ + } \ +} +#define PRINTANDPAD(p, ep, len, with) { \ + int n = (ep) - (p); \ + if (n > (len)) \ + n = (len); \ + if (n > 0) \ + PRINT((p), n); \ + PAD((len) - (n > 0 ? n : 0), (with)); \ +} +#define FLUSH() { \ + if (uio.uio_resid && __SPRINT(data, fp, &uio)) \ + goto error; \ + uio.uio_iovcnt = 0; \ + iovp = iov; \ +} +#else +#define PRINT(ptr, len) { \ + if (__SPRINT (data, fp, (ptr), (len)) == EOF) \ + goto error; \ +} +#define PAD(howmany, with) { \ + if ((n = (howmany)) > 0) { \ + while (n > PADSIZE) { \ + PRINT (with, PADSIZE); \ + n -= PADSIZE; \ + } \ + PRINT (with, n); \ + } \ +} +#define PRINTANDPAD(p, ep, len, with) { \ + int n = (ep) - (p); \ + if (n > (len)) \ + n = (len); \ + if (n > 0) \ + PRINT((p), n); \ + PAD((len) - (n > 0 ? n : 0), (with)); \ +} +#define FLUSH() +#endif + + /* Macros to support positional arguments */ +#ifndef _NO_POS_ARGS +# define GET_ARG(n, ap, type) \ + (is_pos_arg \ + ? (n < numargs \ + ? args[n].val_##type \ + : get_arg (data, n, fmt_anchor, &ap, &numargs, args, \ + arg_type, &saved_fmt)->val_##type) \ + : (arg_index++ < numargs \ + ? args[n].val_##type \ + : (numargs < MAX_POS_ARGS \ + ? args[numargs++].val_##type = va_arg (ap, type) \ + : va_arg (ap, type)))) +#else +# define GET_ARG(n, ap, type) (va_arg (ap, type)) +#endif + + /* + * To extend shorts properly, we need both signed and unsigned + * argument extraction methods. + */ +#ifndef _NO_LONGLONG +#define SARG() \ + (flags&QUADINT ? GET_ARG (N, ap, quad_t) : \ + flags&LONGINT ? GET_ARG (N, ap, long) : \ + flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (long)(signed char)GET_ARG (N, ap, int) : \ + (long)GET_ARG (N, ap, int)) +#define UARG() \ + (flags&QUADINT ? GET_ARG (N, ap, u_quad_t) : \ + flags&LONGINT ? GET_ARG (N, ap, u_long) : \ + flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, ap, int) : \ + (u_long)GET_ARG (N, ap, u_int)) +#else +#define SARG() \ + (flags&LONGINT ? GET_ARG (N, ap, long) : \ + flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (long)(signed char)GET_ARG (N, ap, int) : \ + (long)GET_ARG (N, ap, int)) +#define UARG() \ + (flags&LONGINT ? GET_ARG (N, ap, u_long) : \ + flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, ap, int) : \ + (u_long)GET_ARG (N, ap, u_int)) +#endif + +#ifndef STRING_ONLY + /* Initialize std streams if not dealing with sprintf family. */ + CHECK_INIT (data, fp); + _newlib_flockfile_start (fp); + + ORIENT(fp, -1); + + /* sorry, fprintf(read_only_file, "") returns EOF, not 0 */ + if (cantwrite (data, fp)) { + _newlib_flockfile_exit (fp); + return (EOF); + } + +#ifdef _UNBUF_STREAM_OPT + /* optimise fprintf(stderr) (and other unbuffered Unix files) */ + if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) && + fp->_file >= 0) { + _newlib_flockfile_exit (fp); + return (__sbprintf (data, fp, fmt0, ap)); + } +#endif +#else /* STRING_ONLY */ + /* Create initial buffer if we are called by asprintf family. */ + if (fp->_flags & __SMBF && !fp->_bf._base) + { + fp->_bf._base = fp->_p = _malloc_r (data, 64); + if (!fp->_p) + { + _REENT_ERRNO(data) = ENOMEM; + return EOF; + } + fp->_bf._size = 64; + } +#endif /* STRING_ONLY */ + + fmt = (char *)fmt0; +#ifdef _FVWRITE_IN_STREAMIO + uio.uio_iov = iovp = iov; + uio.uio_resid = 0; + uio.uio_iovcnt = 0; +#endif + ret = 0; +#ifndef _NO_POS_ARGS + arg_index = 0; + saved_fmt = NULL; + arg_type[0] = -1; + numargs = 0; + is_pos_arg = 0; +#endif + + /* + * Scan the format for conversions (`%' character). + */ + for (;;) { + cp = fmt; +#ifdef _MB_CAPABLE + while ((n = __MBTOWC (data, &wc, fmt, MB_CUR_MAX, + &state)) != 0) { + if (n < 0) { + /* Wave invalid chars through. */ + memset (&state, 0, sizeof state); + n = 1; + } + else if (wc == '%') + break; + fmt += n; + } +#else + while (*fmt != '\0' && *fmt != '%') + fmt += 1; +#endif + if ((m = fmt - cp) != 0) { + PRINT (cp, m); + ret += m; + } +#ifdef _MB_CAPABLE + if (n <= 0) + goto done; +#else + if (*fmt == '\0') + goto done; +#endif + fmt_anchor = fmt; + fmt++; /* skip over '%' */ + + flags = 0; + dprec = 0; + width = 0; + prec = -1; + sign = '\0'; +#ifdef FLOATING_POINT + lead = 0; +#ifdef _WANT_IO_C99_FORMATS + nseps = nrepeats = 0; +#endif +#endif +#ifndef _NO_POS_ARGS + N = arg_index; + is_pos_arg = 0; +#endif + +rflag: ch = *fmt++; +reswitch: switch (ch) { +#ifdef _WANT_IO_C99_FORMATS + case '\'': + thousands_sep = _localeconv_r (data)->thousands_sep; + thsnd_len = strlen (thousands_sep); + grouping = _localeconv_r (data)->grouping; + if (thsnd_len > 0 && grouping && *grouping) + flags |= GROUPING; + goto rflag; +#endif + case ' ': + /* + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (!sign) + sign = ' '; + goto rflag; + case '#': + flags |= ALT; + goto rflag; + case '*': +#ifndef _NO_POS_ARGS + /* we must check for positional arg used for dynamic width */ + n = N; + old_is_pos_arg = is_pos_arg; + is_pos_arg = 0; + if (is_digit (*fmt)) { + char *old_fmt = fmt; + + n = 0; + ch = *fmt++; + do { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } while (is_digit (ch)); + + if (ch == '$') { + if (n <= MAX_POS_ARGS) { + n -= 1; + is_pos_arg = 1; + } + else + goto error; + } + else { + fmt = old_fmt; + goto rflag; + } + } +#endif /* !_NO_POS_ARGS */ + + /* + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + width = GET_ARG (n, ap, int); +#ifndef _NO_POS_ARGS + is_pos_arg = old_is_pos_arg; +#endif + if (width >= 0) + goto rflag; + width = -width; + /* FALLTHROUGH */ + case '-': + flags |= LADJUST; + goto rflag; + case '+': + sign = '+'; + goto rflag; + case '.': + if ((ch = *fmt++) == '*') { +#ifndef _NO_POS_ARGS + /* we must check for positional arg used for dynamic width */ + n = N; + old_is_pos_arg = is_pos_arg; + is_pos_arg = 0; + if (is_digit (*fmt)) { + char *old_fmt = fmt; + + n = 0; + ch = *fmt++; + do { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } while (is_digit (ch)); + + if (ch == '$') { + if (n <= MAX_POS_ARGS) { + n -= 1; + is_pos_arg = 1; + } + else + goto error; + } + else { + fmt = old_fmt; + goto rflag; + } + } +#endif /* !_NO_POS_ARGS */ + prec = GET_ARG (n, ap, int); +#ifndef _NO_POS_ARGS + is_pos_arg = old_is_pos_arg; +#endif + if (prec < 0) + prec = -1; + goto rflag; + } + n = 0; + while (is_digit (ch)) { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } + prec = n < 0 ? -1 : n; + goto reswitch; + case '0': + /* + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flags |= ZEROPAD; + goto rflag; + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n = 0; + do { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } while (is_digit (ch)); +#ifndef _NO_POS_ARGS + if (ch == '$') { + if (n <= MAX_POS_ARGS) { + N = n - 1; + is_pos_arg = 1; + goto rflag; + } + else + goto error; + } +#endif /* !_NO_POS_ARGS */ + width = n; + goto reswitch; +#ifdef FLOATING_POINT + case 'L': + flags |= LONGDBL; + goto rflag; +#endif + case 'h': +#ifdef _WANT_IO_C99_FORMATS + if (*fmt == 'h') { + fmt++; + flags |= CHARINT; + } else +#endif + flags |= SHORTINT; + goto rflag; + case 'l': +#if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG + if (*fmt == 'l') { + fmt++; + flags |= QUADINT; + } else +#endif + flags |= LONGINT; + goto rflag; + case 'q': /* extension */ + flags |= QUADINT; + goto rflag; +#ifdef _WANT_IO_C99_FORMATS + case 'j': + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONGINT; + else + flags |= QUADINT; + goto rflag; + case 'z': + if (sizeof (size_t) < sizeof (int)) + /* POSIX states size_t is 16 or more bits, as is short. */ + flags |= SHORTINT; + else if (sizeof (size_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= QUADINT; + goto rflag; + case 't': + if (sizeof (ptrdiff_t) < sizeof (int)) + /* POSIX states ptrdiff_t is 16 or more bits, as + is short. */ + flags |= SHORTINT; + else if (sizeof (ptrdiff_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= QUADINT; + goto rflag; + case 'C': +#endif /* _WANT_IO_C99_FORMATS */ + case 'c': + cp = buf; +#ifdef _MB_CAPABLE + if (ch == 'C' || (flags & LONGINT)) { + mbstate_t ps; + + memset ((void *)&ps, '\0', sizeof (mbstate_t)); + if ((size = (int)_wcrtomb_r (data, cp, + (wchar_t)GET_ARG (N, ap, wint_t), + &ps)) == -1) { + fp->_flags |= __SERR; + goto error; + } + } + else +#endif /* _MB_CAPABLE */ + { + *cp = GET_ARG (N, ap, int); + size = 1; + } + sign = '\0'; + break; + case 'D': /* extension */ + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'd': + case 'i': + _uquad = SARG (); +#ifndef _NO_LONGLONG + if ((quad_t)_uquad < 0) +#else + if ((long) _uquad < 0) +#endif + { + + _uquad = -_uquad; + sign = '-'; + } + base = DEC; + goto number; +#ifdef FLOATING_POINT +# ifdef _WANT_IO_C99_FORMATS + case 'a': + case 'A': + case 'F': +# endif + case 'e': + case 'E': + case 'f': + case 'g': + case 'G': +# ifdef _NO_LONGDBL + if (flags & LONGDBL) { + _fpvalue = (double) GET_ARG (N, ap, _LONG_DOUBLE); + } else { + _fpvalue = GET_ARG (N, ap, double); + } + + /* do this before tricky precision changes + + If the output is infinite or NaN, leading + zeros are not permitted. Otherwise, scanf + could not read what printf wrote. + */ + if (isinf (_fpvalue)) { + if (_fpvalue < 0) + sign = '-'; + if (ch <= 'G') /* 'A', 'E', 'F', or 'G' */ + cp = "INF"; + else + cp = "inf"; + size = 3; + flags &= ~ZEROPAD; + break; + } + if (isnan (_fpvalue)) { + if (signbit (_fpvalue)) + sign = '-'; + if (ch <= 'G') /* 'A', 'E', 'F', or 'G' */ + cp = "NAN"; + else + cp = "nan"; + size = 3; + flags &= ~ZEROPAD; + break; + } + +# else /* !_NO_LONGDBL */ + + if (flags & LONGDBL) { + _fpvalue = GET_ARG (N, ap, _LONG_DOUBLE); + } else { + _fpvalue = (_LONG_DOUBLE)GET_ARG (N, ap, double); + } + + /* do this before tricky precision changes */ + expt = _ldcheck (&_fpvalue); + if (expt == 2) { + if (_fpvalue < 0) + sign = '-'; + if (ch <= 'G') /* 'A', 'E', 'F', or 'G' */ + cp = "INF"; + else + cp = "inf"; + size = 3; + flags &= ~ZEROPAD; + break; + } + if (expt == 1) { + if (signbit (_fpvalue)) + sign = '-'; + if (ch <= 'G') /* 'A', 'E', 'F', or 'G' */ + cp = "NAN"; + else + cp = "nan"; + size = 3; + flags &= ~ZEROPAD; + break; + } +# endif /* !_NO_LONGDBL */ + +# ifdef _WANT_IO_C99_FORMATS + if (ch == 'a' || ch == 'A') { + ox[0] = '0'; + ox[1] = ch == 'a' ? 'x' : 'X'; + flags |= HEXPREFIX; + if (prec >= BUF) + { + if ((malloc_buf = + (char *)_malloc_r (data, prec + 1)) + == NULL) + { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; + } + else + cp = buf; + } else +# endif /* _WANT_IO_C99_FORMATS */ + if (prec == -1) { + prec = DEFPREC; + } else if ((ch == 'g' || ch == 'G') && prec == 0) { + prec = 1; + } + + flags |= FPT; + + cp = cvt (data, _fpvalue, prec, flags, &softsign, + &expt, ch, &ndig, cp); + + if (ch == 'g' || ch == 'G') { + if (expt <= -4 || expt > prec) + ch -= 2; /* 'e' or 'E' */ + else + ch = 'g'; + } +# ifdef _WANT_IO_C99_FORMATS + else if (ch == 'F') + ch = 'f'; +# endif + if (ch <= 'e') { /* 'a', 'A', 'e', or 'E' fmt */ + --expt; + expsize = exponent (expstr, expt, ch); + size = expsize + ndig; + if (ndig > 1 || flags & ALT) + size += decp_len; +# ifdef _WANT_IO_C99_FORMATS + flags &= ~GROUPING; +# endif + } else { + if (ch == 'f') { /* f fmt */ + if (expt > 0) { + size = expt; + if (prec || flags & ALT) + size += prec + decp_len; + } else /* "0.X" */ + size = (prec || flags & ALT) + ? prec + 1 + decp_len + : 1; + } else if (expt >= ndig) { /* fixed g fmt */ + size = expt; + if (flags & ALT) + size += decp_len; + } else { + size = ndig + decp_len; + if (expt <= 0) + size += 1 - expt; + } +# ifdef _WANT_IO_C99_FORMATS + if ((flags & GROUPING) && expt > 0) { + /* space for thousands' grouping */ + nseps = nrepeats = 0; + lead = expt; + while (*grouping != CHAR_MAX) { + if (lead <= *grouping) + break; + lead -= *grouping; + if (grouping[1]) { + nseps++; + grouping++; + } else + nrepeats++; + } + size += (nseps + nrepeats) * thsnd_len; + } else +# endif + lead = expt; + } + + if (softsign) + sign = '-'; + break; +#endif /* FLOATING_POINT */ +#ifdef _GLIBC_EXTENSION + case 'm': /* extension */ + { + int dummy; + cp = _strerror_r (data, _REENT_ERRNO(data), 1, &dummy); + } + flags &= ~LONGINT; + goto string; +#endif + case 'n': +#ifndef _NO_LONGLONG + if (flags & QUADINT) + *GET_ARG (N, ap, quad_ptr_t) = ret; + else +#endif + if (flags & LONGINT) + *GET_ARG (N, ap, long_ptr_t) = ret; + else if (flags & SHORTINT) + *GET_ARG (N, ap, short_ptr_t) = ret; +#ifdef _WANT_IO_C99_FORMATS + else if (flags & CHARINT) + *GET_ARG (N, ap, char_ptr_t) = ret; +#endif + else + *GET_ARG (N, ap, int_ptr_t) = ret; + continue; /* no output */ + case 'O': /* extension */ + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'o': + _uquad = UARG (); + base = OCT; +#ifdef _WANT_IO_C99_FORMATS + flags &= ~GROUPING; +#endif + goto nosign; + case 'p': + /* + * ``The argument shall be a pointer to void. The + * value of the pointer is converted to a sequence + * of printable characters, in an implementation- + * defined manner.'' + * -- ANSI X3J11 + */ + /* NOSTRICT */ + _uquad = (uintptr_t) GET_ARG (N, ap, void_ptr_t); + base = HEX; + xdigs = "0123456789abcdef"; + flags |= HEXPREFIX; + ox[0] = '0'; + ox[1] = ch = 'x'; + goto nosign; + case 's': +#ifdef _WANT_IO_C99_FORMATS + case 'S': +#endif + cp = GET_ARG (N, ap, char_ptr_t); +#ifdef _GLIBC_EXTENSION +string: +#endif + sign = '\0'; +#ifndef __OPTIMIZE_SIZE__ + /* Behavior is undefined if the user passed a + NULL string when precision is not 0. + However, if we are not optimizing for size, + we might as well mirror glibc behavior. */ + if (cp == NULL) { + cp = "(null)"; + size = ((unsigned) prec > 6U) ? 6 : prec; + } + else +#endif /* __OPTIMIZE_SIZE__ */ +#ifdef _MB_CAPABLE + if (ch == 'S' || (flags & LONGINT)) { + mbstate_t ps; + const wchar_t *wcp; + + wcp = (const wchar_t *)cp; + size = m = 0; + memset ((void *)&ps, '\0', sizeof (mbstate_t)); + + /* Count number of bytes needed for multibyte + string that will be produced from widechar + string. */ + if (prec >= 0) { + while (1) { + if (wcp[m] == L'\0') + break; + if ((n = (int)_wcrtomb_r (data, + buf, wcp[m], &ps)) == -1) { + fp->_flags |= __SERR; + goto error; + } + if (n + size > prec) + break; + m += 1; + size += n; + if (size == prec) + break; + } + } + else { + if ((size = (int)_wcsrtombs_r (data, + NULL, &wcp, 0, &ps)) == -1) { + fp->_flags |= __SERR; + goto error; + } + wcp = (const wchar_t *)cp; + } + + if (size == 0) + break; + + if (size >= BUF) { + if ((malloc_buf = + (char *)_malloc_r (data, size + 1)) + == NULL) { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; + } else + cp = buf; + + /* Convert widechar string to multibyte string. */ + memset ((void *)&ps, '\0', sizeof (mbstate_t)); + if (_wcsrtombs_r (data, cp, &wcp, size, &ps) + != size) { + fp->_flags |= __SERR; + goto error; + } + cp[size] = '\0'; + } + else +#endif /* _MB_CAPABLE */ + if (prec >= 0) { + /* + * can't use strlen; can only look for the + * NUL in the first `prec' characters, and + * strlen () will go further. + */ + char *p = memchr (cp, 0, prec); + + if (p != NULL) + size = p - cp; + else + size = prec; + } else + size = strlen (cp); + + break; + case 'U': /* extension */ + flags |= LONGINT; + /*FALLTHROUGH*/ + case 'u': + _uquad = UARG (); + base = DEC; + goto nosign; + case 'X': + xdigs = "0123456789ABCDEF"; + goto hex; + case 'x': + xdigs = "0123456789abcdef"; +hex: _uquad = UARG (); + base = HEX; + /* leading 0x/X only if non-zero */ + if (flags & ALT && _uquad != 0) { + ox[0] = '0'; + ox[1] = ch; + flags |= HEXPREFIX; + } + +#ifdef _WANT_IO_C99_FORMATS + flags &= ~GROUPING; +#endif + /* unsigned conversions */ +nosign: sign = '\0'; + /* + * ``... diouXx conversions ... if a precision is + * specified, the 0 flag will be ignored.'' + * -- ANSI X3J11 + */ +number: if ((dprec = prec) >= 0) + flags &= ~ZEROPAD; + + /* + * ``The result of converting a zero value with an + * explicit precision of zero is no characters.'' + * -- ANSI X3J11 + */ + cp = buf + BUF; + if (_uquad != 0 || prec != 0) { + /* + * Unsigned mod is hard, and unsigned mod + * by a constant is easier than that by + * a variable; hence this switch. + */ + switch (base) { + case OCT: + do { + *--cp = to_char (_uquad & 7); + _uquad >>= 3; + } while (_uquad); + /* handle octal leading 0 */ + if (flags & ALT && *cp != '0') + *--cp = '0'; + break; + + case DEC: + /* many numbers are 1 digit */ + if (_uquad < 10) { + *--cp = to_char(_uquad); + break; + } +#ifdef _WANT_IO_C99_FORMATS + ndig = 0; +#endif + do { + *--cp = to_char (_uquad % 10); +#ifdef _WANT_IO_C99_FORMATS + ndig++; + /* If (*grouping == CHAR_MAX) then no + more grouping */ + if ((flags & GROUPING) + && ndig == *grouping + && *grouping != CHAR_MAX + && _uquad > 9) { + cp -= thsnd_len; + strncpy (cp, thousands_sep, + thsnd_len); + ndig = 0; + /* If (grouping[1] == '\0') then we + have to use *grouping character + (last grouping rule) for all + next cases. */ + if (grouping[1] != '\0') + grouping++; + } +#endif + _uquad /= 10; + } while (_uquad != 0); + break; + + case HEX: + do { + *--cp = xdigs[_uquad & 15]; + _uquad >>= 4; + } while (_uquad); + break; + + default: + cp = "bug in vfprintf: bad base"; + size = strlen (cp); + goto skipsize; + } + } + /* + * ...result is to be converted to an 'alternate form'. + * For o conversion, it increases the precision to force + * the first digit of the result to be a zero." + * -- ANSI X3J11 + * + * To demonstrate this case, compile and run: + * printf ("%#.0o",0); + */ + else if (base == OCT && (flags & ALT)) + *--cp = '0'; + + size = buf + BUF - cp; + skipsize: + break; + default: /* "%?" prints ?, unless ? is NUL */ + if (ch == '\0') + goto done; + /* pretend it was %c with argument ch */ + cp = buf; + *cp = ch; + size = 1; + sign = '\0'; + break; + } + + /* + * All reasonable formats wind up here. At this point, `cp' + * points to a string which (if not flags&LADJUST) should be + * padded out to `width' places. If flags&ZEROPAD, it should + * first be prefixed by any sign or other prefix; otherwise, + * it should be blank padded before the prefix is emitted. + * After any left-hand padding and prefixing, emit zeroes + * required by a decimal [diouxX] precision, then print the + * string proper, then emit zeroes required by any leftover + * floating precision; finally, if LADJUST, pad with blanks. + * If flags&FPT, ch must be in [aAeEfg]. + * + * Compute actual size, so we know how much to pad. + * size excludes decimal prec; realsz includes it. + */ + realsz = dprec > size ? dprec : size; + if (sign) + realsz++; + if (flags & HEXPREFIX) + realsz+= 2; + + /* right-adjusting blank padding */ + if ((flags & (LADJUST|ZEROPAD)) == 0) + PAD (width - realsz, blanks); + + /* prefix */ + if (sign) + PRINT (&sign, 1); + if (flags & HEXPREFIX) + PRINT (ox, 2); + + /* right-adjusting zero padding */ + if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) + PAD (width - realsz, zeroes); + + /* leading zeroes from decimal precision */ + PAD (dprec - size, zeroes); + + /* the string or number proper */ +#ifdef FLOATING_POINT + if ((flags & FPT) == 0) { + PRINT (cp, size); + } else { /* glue together f_p fragments */ + if (ch >= 'f') { /* 'f' or 'g' */ + if (_fpvalue == 0) { + /* kludge for __dtoa irregularity */ + PRINT ("0", 1); + if (expt < ndig || flags & ALT) { + PRINT (decimal_point, decp_len); + PAD (ndig - 1, zeroes); + } + } else if (expt <= 0) { + PRINT ("0", 1); + if (expt || ndig || flags & ALT) { + PRINT (decimal_point, decp_len); + PAD (-expt, zeroes); + PRINT (cp, ndig); + } + } else { + char *convbuf = cp; + PRINTANDPAD(cp, convbuf + ndig, + lead, zeroes); + cp += lead; +#ifdef _WANT_IO_C99_FORMATS + if (flags & GROUPING) { + while (nseps > 0 || nrepeats > 0) { + if (nrepeats > 0) + nrepeats--; + else { + grouping--; + nseps--; + } + PRINT(thousands_sep, thsnd_len); + PRINTANDPAD (cp, convbuf + ndig, + *grouping, zeroes); + cp += *grouping; + } + if (cp > convbuf + ndig) + cp = convbuf + ndig; + } +#endif + if (expt < ndig || flags & ALT) + PRINT (decimal_point, decp_len); + PRINTANDPAD (cp, convbuf + ndig, + ndig - expt, zeroes); + } + } else { /* 'a', 'A', 'e', or 'E' */ + if (ndig > 1 || flags & ALT) { + PRINT (cp, 1); + cp++; + PRINT (decimal_point, decp_len); + if (_fpvalue) { + PRINT (cp, ndig - 1); + } else /* 0.[0..] */ + /* __dtoa irregularity */ + PAD (ndig - 1, zeroes); + } else /* XeYYY */ + PRINT (cp, 1); + PRINT (expstr, expsize); + } + } +#else /* !FLOATING_POINT */ + PRINT (cp, size); +#endif + /* left-adjusting padding (always blank) */ + if (flags & LADJUST) + PAD (width - realsz, blanks); + + /* finally, adjust ret */ + ret += width > realsz ? width : realsz; + + FLUSH (); /* copy out the I/O vectors */ + + if (malloc_buf != NULL) { + _free_r (data, malloc_buf); + malloc_buf = NULL; + } + } +done: + FLUSH (); +error: + if (malloc_buf != NULL) + _free_r (data, malloc_buf); +#ifndef STRING_ONLY + _newlib_flockfile_end (fp); +#endif + return (__sferror (fp) ? EOF : ret); + /* NOTREACHED */ +} + +#ifdef FLOATING_POINT + +/* Using reentrant DATA, convert finite VALUE into a string of digits + with no decimal point, using NDIGITS precision and FLAGS as guides + to whether trailing zeros must be included. Set *SIGN to nonzero + if VALUE was negative. Set *DECPT to the exponent plus one. Set + *LENGTH to the length of the returned string. CH must be one of + [aAeEfFgG]; if it is [aA], then the return string lives in BUF, + otherwise the return value shares the mprec reentrant storage. */ +static char * +cvt(struct _reent *data, _PRINTF_FLOAT_TYPE value, int ndigits, int flags, + char *sign, int *decpt, int ch, int *length, char *buf) +{ + int mode, dsgn; + char *digits, *bp, *rve; +# ifdef _NO_LONGDBL + union double_union tmp; + + tmp.d = value; + if (word0 (tmp) & Sign_bit) { /* this will check for < 0 and -0.0 */ + value = -value; + *sign = '-'; + } else + *sign = '\000'; +# else /* !_NO_LONGDBL */ + union + { + struct ldieee ieee; + _LONG_DOUBLE val; + } ld; + + ld.val = value; + if (ld.ieee.sign) { /* this will check for < 0 and -0.0 */ + value = -value; + *sign = '-'; + } else + *sign = '\000'; +# endif /* !_NO_LONGDBL */ + +# ifdef _WANT_IO_C99_FORMATS + if (ch == 'a' || ch == 'A') { + /* This code assumes FLT_RADIX is a power of 2. The initial + division ensures the digit before the decimal will be less + than FLT_RADIX (unless it is rounded later). There is no + loss of precision in these calculations. */ + value = FREXP (value, decpt) / 8; + if (!value) + *decpt = 1; + digits = ch == 'a' ? "0123456789abcdef" : "0123456789ABCDEF"; + bp = buf; + do { + value *= 16; + mode = (int) value; + value -= mode; + *bp++ = digits[mode]; + } while (ndigits-- && value); + if (value > 0.5 || (value == 0.5 && mode & 1)) { + /* round to even */ + rve = bp; + while (*--rve == digits[0xf]) { + *rve = '0'; + } + *rve = *rve == '9' ? digits[0xa] : *rve + 1; + } else { + while (ndigits-- >= 0) { + *bp++ = '0'; + } + } + *length = bp - buf; + return buf; + } +# endif /* _WANT_IO_C99_FORMATS */ + if (ch == 'f' || ch == 'F') { + mode = 3; /* ndigits after the decimal point */ + } else { + /* To obtain ndigits after the decimal point for the 'e' + * and 'E' formats, round to ndigits + 1 significant + * figures. + */ + if (ch == 'e' || ch == 'E') { + ndigits++; + } + mode = 2; /* ndigits significant digits */ + } + + digits = _DTOA_R (data, value, mode, ndigits, decpt, &dsgn, &rve); + + if ((ch != 'g' && ch != 'G') || flags & ALT) { /* Print trailing zeros */ + bp = digits + ndigits; + if (ch == 'f' || ch == 'F') { + if (*digits == '0' && value) + *decpt = -ndigits + 1; + bp += *decpt; + } + if (value == 0) /* kludge for __dtoa irregularity */ + rve = bp; + while (rve < bp) + *rve++ = '0'; + } + *length = rve - digits; + return (digits); +} + +static int +exponent(char *p0, int exp, int fmtch) +{ + register char *p, *t; + char expbuf[MAXEXPLEN]; +# ifdef _WANT_IO_C99_FORMATS + int isa = fmtch == 'a' || fmtch == 'A'; +# else +# define isa 0 +# endif + + p = p0; + *p++ = isa ? 'p' - 'a' + fmtch : fmtch; + if (exp < 0) { + exp = -exp; + *p++ = '-'; + } + else + *p++ = '+'; + t = expbuf + MAXEXPLEN; + if (exp > 9) { + do { + *--t = to_char (exp % 10); + } while ((exp /= 10) > 9); + *--t = to_char (exp); + for (; t < expbuf + MAXEXPLEN; *p++ = *t++); + } + else { + if (!isa) + *p++ = '0'; + *p++ = to_char (exp); + } + return (p - p0); +} +#endif /* FLOATING_POINT */ + + +#ifndef _NO_POS_ARGS + +/* Positional argument support. + Written by Jeff Johnston + + Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* The below constant state tables are shared between all versions of + vfprintf and vfwprintf. They must only be defined once, which we do in + the STRING_ONLY/INTEGER_ONLY versions here. */ +#if defined (STRING_ONLY) && defined(INTEGER_ONLY) + +const __CH_CLASS __chclass[256] = { + /* 00-07 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 08-0f */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 10-17 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 18-1f */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 20-27 */ FLAG, OTHER, OTHER, FLAG, DOLLAR, OTHER, OTHER, FLAG, + /* 28-2f */ OTHER, OTHER, STAR, FLAG, OTHER, FLAG, DOT, OTHER, + /* 30-37 */ ZERO, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, + /* 38-3f */ DIGIT, DIGIT, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 40-47 */ OTHER, SPEC, OTHER, SPEC, SPEC, SPEC, SPEC, SPEC, + /* 48-4f */ OTHER, OTHER, OTHER, OTHER, MODFR, OTHER, OTHER, SPEC, + /* 50-57 */ OTHER, OTHER, OTHER, SPEC, OTHER, SPEC, OTHER, OTHER, + /* 58-5f */ SPEC, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 60-67 */ OTHER, SPEC, OTHER, SPEC, SPEC, SPEC, SPEC, SPEC, + /* 68-6f */ MODFR, SPEC, MODFR, OTHER, MODFR, OTHER, SPEC, SPEC, + /* 70-77 */ SPEC, MODFR, OTHER, SPEC, MODFR, SPEC, OTHER, OTHER, + /* 78-7f */ SPEC, OTHER, MODFR, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 80-87 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 88-8f */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 90-97 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* 98-9f */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* a0-a7 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* a8-af */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* b0-b7 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* b8-bf */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* c0-c7 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* c8-cf */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* d0-d7 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* d8-df */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* e0-e7 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* e8-ef */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* f0-f7 */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + /* f8-ff */ OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, +}; + +const __STATE __state_table[MAX_STATE][MAX_CH_CLASS] = { + /* '0' '1-9' '$' MODFR SPEC '.' '*' FLAG OTHER */ + /* START */ { SFLAG, WDIG, DONE, SMOD, DONE, SDOT, VARW, SFLAG, DONE }, + /* SFLAG */ { SFLAG, WDIG, DONE, SMOD, DONE, SDOT, VARW, SFLAG, DONE }, + /* WDIG */ { DONE, DONE, WIDTH, SMOD, DONE, SDOT, DONE, DONE, DONE }, + /* WIDTH */ { DONE, DONE, DONE, SMOD, DONE, SDOT, DONE, DONE, DONE }, + /* SMOD */ { DONE, DONE, DONE, DONE, DONE, DONE, DONE, DONE, DONE }, + /* SDOT */ { SDOT, PREC, DONE, SMOD, DONE, DONE, VARP, DONE, DONE }, + /* VARW */ { DONE, VWDIG, DONE, SMOD, DONE, SDOT, DONE, DONE, DONE }, + /* VARP */ { DONE, VPDIG, DONE, SMOD, DONE, DONE, DONE, DONE, DONE }, + /* PREC */ { DONE, DONE, DONE, SMOD, DONE, DONE, DONE, DONE, DONE }, + /* VWDIG */ { DONE, DONE, WIDTH, DONE, DONE, DONE, DONE, DONE, DONE }, + /* VPDIG */ { DONE, DONE, PREC, DONE, DONE, DONE, DONE, DONE, DONE }, +}; + +const __ACTION __action_table[MAX_STATE][MAX_CH_CLASS] = { + /* '0' '1-9' '$' MODFR SPEC '.' '*' FLAG OTHER */ + /* START */ { NOOP, NUMBER, NOOP, GETMOD, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* SFLAG */ { NOOP, NUMBER, NOOP, GETMOD, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* WDIG */ { NOOP, NOOP, GETPOS, GETMOD, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* WIDTH */ { NOOP, NOOP, NOOP, GETMOD, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* SMOD */ { NOOP, NOOP, NOOP, NOOP, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* SDOT */ { NOOP, SKIPNUM, NOOP, GETMOD, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* VARW */ { NOOP, NUMBER, NOOP, GETPW, GETPWB, GETPW, NOOP, NOOP, NOOP }, + /* VARP */ { NOOP, NUMBER, NOOP, GETPW, GETPWB, NOOP, NOOP, NOOP, NOOP }, + /* PREC */ { NOOP, NOOP, NOOP, GETMOD, GETARG, NOOP, NOOP, NOOP, NOOP }, + /* VWDIG */ { NOOP, NOOP, PWPOS, NOOP, NOOP, NOOP, NOOP, NOOP, NOOP }, + /* VPDIG */ { NOOP, NOOP, PWPOS, NOOP, NOOP, NOOP, NOOP, NOOP, NOOP }, +}; + +#endif /* STRING_ONLY && INTEGER_ONLY */ + +/* function to get positional parameter N where n = N - 1 */ +static union arg_val * +get_arg (struct _reent *data, + int n, + char *fmt, + va_list *ap, + int *numargs_p, + union arg_val *args, + int *arg_type, + char **last_fmt) +{ + int ch; + int number, flags; + int spec_type; + int numargs = *numargs_p; + __CH_CLASS chtype; + __STATE state, next_state; + __ACTION action; + int pos, last_arg; + int max_pos_arg = n; + /* Only need types that can be reached via vararg promotions. */ + enum types { INT, LONG_INT, QUAD_INT, CHAR_PTR, DOUBLE, LONG_DOUBLE, WIDE_CHAR }; +# ifdef _MB_CAPABLE + wchar_t wc; + mbstate_t wc_state; + int nbytes; +# endif + + /* if this isn't the first call, pick up where we left off last time */ + if (*last_fmt != NULL) + fmt = *last_fmt; + +# ifdef _MB_CAPABLE + memset (&wc_state, '\0', sizeof (wc_state)); +# endif + + /* we need to process either to end of fmt string or until we have actually + read the desired parameter from the vararg list. */ + while (*fmt && n >= numargs) + { +# ifdef _MB_CAPABLE + while ((nbytes = __MBTOWC (data, &wc, fmt, MB_CUR_MAX, &wc_state)) > 0) + { + fmt += nbytes; + if (wc == '%') + break; + } + + if (nbytes <= 0) + break; +# else + while (*fmt != '\0' && *fmt != '%') + fmt += 1; + + if (*fmt == '\0') + break; + + fmt++; +# endif /* ! _MB_CAPABLE */ + state = START; + flags = 0; + pos = -1; + number = 0; + spec_type = INT; + + /* Use state/action table to process format specifiers. We ignore invalid + formats and we are only interested in information that tells us how to + read the vararg list. */ + while (state != DONE) + { + ch = *fmt++; + chtype = __chclass[ch]; + next_state = __state_table[state][chtype]; + action = __action_table[state][chtype]; + state = next_state; + + switch (action) + { + case GETMOD: /* we have format modifier */ + switch (ch) + { + case 'h': + /* No flag needed, since short and char promote to int. */ + break; + case 'L': + flags |= LONGDBL; + break; + case 'q': + flags |= QUADINT; + break; +# ifdef _WANT_IO_C99_FORMATS + case 'j': + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONGINT; + else + flags |= QUADINT; + break; + case 'z': + if (sizeof (size_t) <= sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= QUADINT; + break; + case 't': + if (sizeof (ptrdiff_t) <= sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= QUADINT; + break; +# endif /* _WANT_IO_C99_FORMATS */ + case 'l': + default: +# if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG + if (*fmt == 'l') + { + flags |= QUADINT; + ++fmt; + } + else +# endif + flags |= LONGINT; + break; + } + break; + case GETARG: /* we have format specifier */ + { + numargs &= (MAX_POS_ARGS - 1); + /* process the specifier and translate it to a type to fetch from varargs */ + switch (ch) + { + case 'd': + case 'i': + case 'o': + case 'x': + case 'X': + case 'u': + if (flags & LONGINT) + spec_type = LONG_INT; +# ifndef _NO_LONGLONG + else if (flags & QUADINT) + spec_type = QUAD_INT; +# endif + else + spec_type = INT; + break; + case 'D': + case 'U': + case 'O': + spec_type = LONG_INT; + break; +# ifdef _WANT_IO_C99_FORMATS + case 'a': + case 'A': + case 'F': +# endif + case 'f': + case 'g': + case 'G': + case 'E': + case 'e': +# ifndef _NO_LONGDBL + if (flags & LONGDBL) + spec_type = LONG_DOUBLE; + else +# endif + spec_type = DOUBLE; + break; + case 's': +# ifdef _WANT_IO_C99_FORMATS + case 'S': +# endif + case 'p': + case 'n': + spec_type = CHAR_PTR; + break; + case 'c': +# ifdef _WANT_IO_C99_FORMATS + if (flags & LONGINT) + spec_type = WIDE_CHAR; + else +# endif + spec_type = INT; + break; +# ifdef _WANT_IO_C99_FORMATS + case 'C': + spec_type = WIDE_CHAR; + break; +# endif + } + + /* if we have a positional parameter, just store the type, otherwise + fetch the parameter from the vararg list */ + if (pos != -1) + arg_type[pos] = spec_type; + else + { + switch (spec_type) + { + case LONG_INT: + args[numargs++].val_long = va_arg (*ap, long); + break; + case QUAD_INT: + args[numargs++].val_quad_t = va_arg (*ap, quad_t); + break; + case WIDE_CHAR: + args[numargs++].val_wint_t = va_arg (*ap, wint_t); + break; + case INT: + args[numargs++].val_int = va_arg (*ap, int); + break; + case CHAR_PTR: + args[numargs++].val_char_ptr_t = va_arg (*ap, char *); + break; + case DOUBLE: + args[numargs++].val_double = va_arg (*ap, double); + break; + case LONG_DOUBLE: + args[numargs++].val__LONG_DOUBLE = va_arg (*ap, _LONG_DOUBLE); + break; + } + } + } + break; + case GETPOS: /* we have positional specifier */ + if (arg_type[0] == -1) + memset (arg_type, 0, sizeof (int) * MAX_POS_ARGS); + pos = number - 1; + max_pos_arg = (max_pos_arg > pos ? max_pos_arg : pos); + break; + case PWPOS: /* we have positional specifier for width or precision */ + if (arg_type[0] == -1) + memset (arg_type, 0, sizeof (int) * MAX_POS_ARGS); + number -= 1; + arg_type[number] = INT; + max_pos_arg = (max_pos_arg > number ? max_pos_arg : number); + break; + case GETPWB: /* we require format pushback */ + --fmt; + /* fallthrough */ + case GETPW: /* we have a variable precision or width to acquire */ + args[numargs++].val_int = va_arg (*ap, int); + break; + case NUMBER: /* we have a number to process */ + number = (ch - '0'); + while ((ch = *fmt) != '\0' && is_digit (ch)) + { + number = number * 10 + (ch - '0'); + ++fmt; + } + break; + case SKIPNUM: /* we have a number to skip */ + while ((ch = *fmt) != '\0' && is_digit (ch)) + ++fmt; + break; + case NOOP: + default: + break; /* do nothing */ + } + } + } + + /* process all arguments up to at least the one we are looking for and if we + have seen the end of the string, then process up to the max argument needed */ + if (*fmt == '\0') + last_arg = max_pos_arg; + else + last_arg = n; + + while (numargs <= last_arg) + { + switch (arg_type[numargs]) + { + case LONG_INT: + args[numargs++].val_long = va_arg (*ap, long); + break; + case QUAD_INT: + args[numargs++].val_quad_t = va_arg (*ap, quad_t); + break; + case CHAR_PTR: + args[numargs++].val_char_ptr_t = va_arg (*ap, char *); + break; + case DOUBLE: + args[numargs++].val_double = va_arg (*ap, double); + break; + case LONG_DOUBLE: + args[numargs++].val__LONG_DOUBLE = va_arg (*ap, _LONG_DOUBLE); + break; + case WIDE_CHAR: + args[numargs++].val_wint_t = va_arg (*ap, wint_t); + break; + case INT: + default: + args[numargs++].val_int = va_arg (*ap, int); + break; + } + } + + /* alter the global numargs value and keep a reference to the last bit of the fmt + string we processed here because the caller will continue processing where we started */ + *numargs_p = numargs; + *last_fmt = fmt; + return &args[n]; +} +#endif /* !_NO_POS_ARGS */ diff --git a/lib/stdio/vfscanf.c b/lib/stdio/vfscanf.c new file mode 100644 index 0000000..cfeea98 --- /dev/null +++ b/lib/stdio/vfscanf.c @@ -0,0 +1,1991 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + vfscanf +INDEX + _vfscanf_r +INDEX + vscanf +INDEX + _vscanf_r +INDEX + vsscanf +INDEX + _vsscanf_r + +SYNOPSIS + #include + #include + int vscanf(const char *<[fmt]>, va_list <[list]>); + int vfscanf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsscanf(const char *<[str]>, const char *<[fmt]>, va_list <[list]>); + + int _vscanf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfscanf_r(struct _reent *<[reent]>, FILE *<[fp]>, const char *<[fmt]>, + va_list <[list]>); + int _vsscanf_r(struct _reent *<[reent]>, const char *<[str]>, + const char *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, and <> are (respectively) variants +of <>, <>, and <>. They differ only in +allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than +directly accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of input fields successfully scanned, +converted, and stored; the return value does not include scanned +fields which were not stored. + +If <> attempts to read at end-of-file, the return value +is <>. + +If no fields were stored, the return value is <<0>>. + +The routines <<_vscanf_r>>, <<_vfscanf_f>>, and <<_vsscanf_r>> are +reentrant versions which take an additional first parameter which points to the +reentrancy structure. + +PORTABILITY +These are GNU extensions. + +Supporting OS subroutines required: +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../stdlib/local.h" + +#ifdef INTEGER_ONLY +#define VFSCANF vfiscanf +#define _VFSCANF_R _vfiscanf_r +#define __SVFSCANF __svfiscanf +#ifdef STRING_ONLY +# define __SVFSCANF_R __ssvfiscanf_r +#else +# define __SVFSCANF_R __svfiscanf_r +#endif +#else +#define VFSCANF vfscanf +#define _VFSCANF_R _vfscanf_r +#define __SVFSCANF __svfscanf +#ifdef STRING_ONLY +# define __SVFSCANF_R __ssvfscanf_r +#else +# define __SVFSCANF_R __svfscanf_r +#endif +#ifndef NO_FLOATING_POINT +#define FLOATING_POINT +#endif +#endif + +#ifdef STRING_ONLY +#undef _newlib_flockfile_start +#undef _newlib_flockfile_exit +#undef _newlib_flockfile_end +#define _newlib_flockfile_start(x) {} +#define _newlib_flockfile_exit(x) {} +#define _newlib_flockfile_end(x) {} +#define _ungetc_r _sungetc_r +#define __srefill_r __ssrefill_r +#define _fread_r _sfread_r +#endif + +#ifdef FLOATING_POINT +#include +#include +#include + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL +#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG) +#undef _NO_LONGDBL +#endif + +#include "floatio.h" + +#define BUF (MAXEXP+MAXFRACT+MB_LEN_MAX+2) /* decimal point + sign + NUL */ + +/* An upper bound for how long a long prints in decimal. 4 / 13 approximates + log (2). Add one char for roundoff compensation and one for the sign. */ +#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long) - 1) * 4 / 13 + 2) +#else +#define BUF 40 +#endif + +#define _NO_LONGLONG +#if defined _WANT_IO_LONG_LONG \ + && (defined __GNUC__ || __STDC_VERSION__ >= 199901L) +# undef _NO_LONGLONG +#endif + +#define _NO_POS_ARGS +#ifdef _WANT_IO_POS_ARGS +# undef _NO_POS_ARGS +# ifdef NL_ARGMAX +# define MAX_POS_ARGS NL_ARGMAX +# else +# define MAX_POS_ARGS 32 +# endif + +static void * get_arg (int, va_list *, int *, void **); +#endif /* _WANT_IO_POS_ARGS */ + +/* + * Flags used during conversion. + */ + +#define LONG 0x01 /* l: long or double */ +#define LONGDBL 0x02 /* L/ll: long double or long long */ +#define SHORT 0x04 /* h: short */ +#define CHAR 0x08 /* hh: 8 bit integer */ +#define SUPPRESS 0x10 /* suppress assignment */ +#define POINTER 0x20 /* weird %p pointer (`fake hex') */ +#define NOSKIP 0x40 /* do not skip blanks */ +#define MALLOC 0x80 /* handle 'm' modifier */ + +/* + * The following are used in numeric conversions only: + * SIGNOK, NDIGITS, DPTOK, EXPOK and HEXFLT are for floating point; + * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral. + */ + +#define SIGNOK 0x80 /* +/- is (still) legal */ +#define NDIGITS 0x100 /* no digits detected */ + +#define DPTOK 0x200 /* (float) decimal point is still legal */ +#define EXPOK 0x400 /* (float) exponent (e+3, etc) still legal */ +#define HEXFLT 0x800 /* (float) hex prefix found, expect hex float */ + +#define PFXOK 0x200 /* 0x prefix is (still) legal */ +#define NZDIGITS 0x400 /* no zero digits detected */ +#define NNZDIGITS 0x800 /* no non-zero digits detected */ + +/* + * Conversion types. + */ + +#define CT_CHAR 0 /* %c conversion */ +#define CT_CCL 1 /* %[...] conversion */ +#define CT_STRING 2 /* %s conversion */ +#define CT_INT 3 /* integer, i.e., strtol or strtoul */ +#define CT_FLOAT 4 /* floating, i.e., strtod */ + +#define u_char unsigned char +#define u_long unsigned long + +#ifndef _NO_LONGLONG +typedef unsigned long long u_long_long; +#endif + +/* + * vfscanf + */ + +#define BufferEmpty (fp->_r <= 0 && __srefill_r(rptr, fp)) + +#ifndef STRING_ONLY + +#ifndef _REENT_ONLY + +int +VFSCANF (register FILE *fp, + const char *fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return __SVFSCANF_R (reent, fp, fmt, ap); +} + +int +__SVFSCANF (register FILE *fp, + char const *fmt0, + va_list ap) +{ + return __SVFSCANF_R (_REENT, fp, fmt0, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_VFSCANF_R (struct _reent *data, + register FILE *fp, + const char *fmt, + va_list ap) +{ + CHECK_INIT(data, fp); + return __SVFSCANF_R (data, fp, fmt, ap); +} +#endif /* !STRING_ONLY */ + +#if defined (STRING_ONLY) && defined (INTEGER_ONLY) +/* When dealing with the sscanf family, we don't want to use the + * regular ungetc which will drag in file I/O items we don't need. + * So, we create our own trimmed-down version. */ +int +_sungetc_r (struct _reent *data, + int c, + register FILE *fp) +{ + if (c == EOF) + return (EOF); + + /* After ungetc, we won't be at eof anymore */ + fp->_flags &= ~__SEOF; + c = (unsigned char) c; + + /* + * If we are in the middle of ungetc'ing, just continue. + * This may require expanding the current ungetc buffer. + */ + + if (HASUB (fp)) + { + if (fp->_r >= fp->_ub._size && __submore (data, fp)) + { + return EOF; + } + *--fp->_p = c; + fp->_r++; + return c; + } + + /* + * If we can handle this by simply backing up, do so, + * but never replace the original character. + * (This makes sscanf() work when scanning `const' data.) + */ + + if (fp->_bf._base != NULL && fp->_p > fp->_bf._base && fp->_p[-1] == c) + { + fp->_p--; + fp->_r++; + return c; + } + + /* + * Create an ungetc buffer. + * Initially, we will use the `reserve' buffer. + */ + + fp->_ur = fp->_r; + fp->_up = fp->_p; + fp->_ub._base = fp->_ubuf; + fp->_ub._size = sizeof (fp->_ubuf); + fp->_ubuf[sizeof (fp->_ubuf) - 1] = c; + fp->_p = &fp->_ubuf[sizeof (fp->_ubuf) - 1]; + fp->_r = 1; + return c; +} + +/* String only version of __srefill_r for sscanf family. */ +int +__ssrefill_r (struct _reent * ptr, + register FILE * fp) +{ + /* + * Our only hope of further input is the ungetc buffer. + * If there is anything in that buffer to read, return. + */ + if (HASUB (fp)) + { + FREEUB (ptr, fp); + if ((fp->_r = fp->_ur) != 0) + { + fp->_p = fp->_up; + return 0; + } + } + + /* Otherwise we are out of character input. */ + fp->_p = fp->_bf._base; + fp->_r = 0; + fp->_flags |= __SEOF; + return EOF; +} + +size_t +_sfread_r (struct _reent * ptr, + void *buf, + size_t size, + size_t count, + FILE * fp) +{ + register size_t resid; + register char *p; + register int r; + size_t total; + + if ((resid = count * size) == 0) + return 0; + + total = resid; + p = buf; + + while (resid > (r = fp->_r)) + { + (void) memcpy ((void *) p, (void *) fp->_p, (size_t) r); + fp->_p += r; + fp->_r = 0; + p += r; + resid -= r; + if (__ssrefill_r (ptr, fp)) + { + /* no more input: return partial result */ + return (total - resid) / size; + } + } + (void) memcpy ((void *) p, (void *) fp->_p, resid); + fp->_r -= resid; + fp->_p += resid; + return count; +} +#else /* !STRING_ONLY || !INTEGER_ONLY */ +int _sungetc_r (struct _reent *, int, register FILE *); +int __ssrefill_r (struct _reent *, register FILE *); +size_t _sfread_r (struct _reent *, void *buf, size_t, size_t, FILE *); +#endif /* !STRING_ONLY || !INTEGER_ONLY */ + +static inline int +__wctob (struct _reent *rptr, wint_t wc) +{ + mbstate_t mbs; + unsigned char pmb[MB_LEN_MAX]; + + if (wc == WEOF) + return EOF; + memset (&mbs, '\0', sizeof (mbs)); + return __WCTOMB (rptr, (char *) pmb, wc, &mbs) == 1 ? (int) pmb[0] : 0; +} + +int +__SVFSCANF_R (struct _reent *rptr, + register FILE *fp, + char const *fmt0, + va_list ap) +{ + register u_char *fmt = (u_char *) fmt0; + register int c; /* character from format, or conversion */ + register size_t width; /* field width, or 0 */ + register char *p; /* points into all kinds of strings */ + register int n; /* handy integer */ + register int flags; /* flags as defined above */ + register char *p0; /* saves original value of p when necessary */ + int nassigned; /* number of fields assigned */ + int nread; /* number of characters consumed from fp */ +#ifndef _NO_POS_ARGS + int N; /* arg number */ + int arg_index = 0; /* index into args processed directly */ + int numargs = 0; /* number of varargs read */ + void *args[MAX_POS_ARGS]; /* positional args read */ + int is_pos_arg; /* is current format positional? */ +#endif + int base = 0; /* base argument to strtol/strtoul */ + int nbytes = 1; /* number of bytes read from fmt string */ + wchar_t wc; /* wchar to use to read format string */ + wchar_t *wcp; /* handy wide character pointer */ + size_t mbslen = 0; /* length of converted multibyte sequence */ +#ifdef _MB_CAPABLE + mbstate_t state; /* value to keep track of multibyte state */ +#endif +#ifdef _WANT_IO_C99_FORMATS +#define _WANT_IO_POSIX_EXTENSIONS +#endif +#ifdef _WANT_IO_POSIX_EXTENSIONS + /* POSIX requires that fscanf frees all allocated strings from 'm' + conversions in case it returns EOF. m_ptr is used to keep track. + It will be allocated on the stack the first time an 'm' conversion + takes place, and it will be free'd on return from the function. + This implementation tries to save space by only allocating 8 + pointer slots at a time. Most scenarios should never have to call + realloc again. This implementation allows only up to 65528 'm' + conversions per fscanf invocation for now. That should be enough + for almost all scenarios, right? */ + struct m_ptrs { + void ***m_arr; /* Array of pointer args to 'm' conversion */ + uint16_t m_siz; /* Number of slots in m_arr */ + uint16_t m_cnt; /* Number of valid entries in m_arr */ + } *m_ptr = NULL; + #define init_m_ptr() \ + do \ + { \ + if (!m_ptr) \ + { \ + m_ptr = (struct m_ptrs *) alloca (sizeof *m_ptr); \ + m_ptr->m_arr = NULL; \ + m_ptr->m_siz = 0; \ + m_ptr->m_cnt = 0; \ + } \ + } \ + while (0) + #define push_m_ptr(arg) \ + do \ + { \ + if (m_ptr->m_cnt >= m_ptr->m_siz) \ + { \ + void ***n = NULL; \ + \ + if (m_ptr->m_siz + 8 > 0 && m_ptr->m_siz + 8 < UINT16_MAX) \ + n = (void ***) realloc (m_ptr->m_arr, \ + (m_ptr->m_siz + 8) * \ + sizeof (void **)); \ + if (!n) \ + { \ + nassigned = EOF; \ + goto match_failure; \ + } \ + m_ptr->m_arr = n; \ + m_ptr->m_siz += 8; \ + } \ + m_ptr->m_arr[m_ptr->m_cnt++] = (void **) (arg); \ + } \ + while (0) + #define alloc_m_ptr(_type, _p, _p0, _p_p, _w) \ + ({ \ + _p_p = GET_ARG (N, ap, _type **); \ + if (!_p_p) \ + goto match_failure; \ + _p0 = (_type *) malloc ((_w) * sizeof (_type)); \ + if (!_p0) \ + { \ + nassigned = EOF; \ + goto match_failure; \ + } \ + *_p_p = _p0; \ + push_m_ptr (_p_p); \ + _p = _p0; \ + _w; \ + }) + /* For systems with wchar_t == 2 (UTF-16) check if there's room for + at least 2 wchar_t's (surrogate pairs). */ + #define realloc_m_ptr(_type, _p, _p0, _p_p, _w) \ + ({ \ + size_t _nw = (_w); \ + ptrdiff_t _dif = _p - _p0; \ + if (_p_p && \ + ((sizeof (_type) == 2 && _dif >= _nw - 1) \ + || _dif >= _nw)) \ + { \ + _p0 = (_type *) realloc (_p0, (_nw << 1) * sizeof (_type)); \ + if (!_p0) \ + { \ + nassigned = EOF; \ + goto match_failure; \ + } \ + _p = _p0 + _dif; \ + *_p_p = _p0; \ + _nw <<= 1; \ + } \ + _nw; \ + }) + #define shrink_m_ptr(_type, _p_p, _w, _cw) \ + ({ \ + size_t _nw = (_w); \ + if (_p_p && _nw < _cw) \ + { \ + _type *_np_p = (_type *) \ + realloc (*_p_p, _nw * sizeof (_type)); \ + if (_np_p) \ + *_p_p = _np_p; \ + } \ + }) + #define free_m_ptr() \ + do \ + { \ + if (m_ptr) \ + { \ + if (nassigned == EOF) \ + { \ + int i; \ + for (i = 0; i < m_ptr->m_cnt; ++i) \ + { \ + free (*m_ptr->m_arr[i]); \ + *m_ptr->m_arr[i] = NULL; \ + } \ + } \ + if (m_ptr->m_arr) \ + free (m_ptr->m_arr); \ + } \ + } \ + while (0) +#endif + + #define CCFN_PARAMS (struct _reent *, const char *, char **, int) + u_long (*ccfn)CCFN_PARAMS=0; /* conversion function (strtol/strtoul) */ + char ccltab[256]; /* character class table for %[...] */ + char buf[BUF]; /* buffer for numeric conversions */ + unsigned char *lptr; /* literal pointer */ + + char *cp; + short *sp; + int *ip; +#ifdef FLOATING_POINT + float *flp; + _LONG_DOUBLE *ldp; + double *dp; +#endif + long *lp; +#ifndef _NO_LONGLONG + long long *llp; +#endif + + /* `basefix' is used to avoid `if' tests in the integer scanner */ + static const short basefix[17] = + {10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + + /* Macro to support positional arguments */ +#ifndef _NO_POS_ARGS +# define GET_ARG(n, ap, type) \ + ((type) (is_pos_arg \ + ? (n < numargs \ + ? args[n] \ + : get_arg (n, &ap, &numargs, args)) \ + : (arg_index++ < numargs \ + ? args[n] \ + : (numargs < MAX_POS_ARGS \ + ? args[numargs++] = va_arg (ap, void *) \ + : va_arg (ap, void *))))) +#else +# define GET_ARG(n, ap, type) (va_arg (ap, type)) +#endif + + _newlib_flockfile_start (fp); + + ORIENT (fp, -1); + + nassigned = 0; + nread = 0; +#ifdef _MB_CAPABLE + memset (&state, 0, sizeof (state)); +#endif + + for (;;) + { +#ifndef _MB_CAPABLE + wc = *fmt; +#else + nbytes = __MBTOWC (rptr, &wc, (char *) fmt, MB_CUR_MAX, &state); + if (nbytes < 0) { + wc = 0xFFFD; /* Unicode replacement character */ + nbytes = 1; + memset (&state, 0, sizeof (state)); + } +#endif + fmt += nbytes; + + if (wc == 0) + goto all_done; + if (nbytes == 1 && isspace (wc)) + { + for (;;) + { + if (BufferEmpty || !isspace (*fp->_p)) + break; + nread++, fp->_r--, fp->_p++; + } + continue; + } + if (wc != '%') + goto literal; + width = 0; + flags = 0; +#ifndef _NO_POS_ARGS + N = arg_index; + is_pos_arg = 0; +#endif + + /* + * switch on the format. continue if done; break once format + * type is derived. + */ + + again: + c = *fmt++; + + switch (c) + { + case '%': + literal: + lptr = fmt - nbytes; + for (n = 0; n < nbytes; ++n) + { + if (BufferEmpty) + goto input_failure; + if (*fp->_p != *lptr) + goto match_failure; + fp->_r--, fp->_p++; + nread++; + ++lptr; + } + continue; + + case '*': + if ((flags & (CHAR | SHORT | LONG | LONGDBL | SUPPRESS | MALLOC)) + || width) + goto match_failure; + flags |= SUPPRESS; + goto again; + case 'l': + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; +#if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG + if (*fmt == 'l') /* Check for 'll' = long long (SUSv3) */ + { + ++fmt; + flags |= LONGDBL; + } + else +#endif + flags |= LONG; + goto again; + case 'L': + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + flags |= LONGDBL; + goto again; + case 'h': + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; +#ifdef _WANT_IO_C99_FORMATS + if (*fmt == 'h') /* Check for 'hh' = char int (SUSv3) */ + { + ++fmt; + flags |= CHAR; + } + else +#endif + flags |= SHORT; + goto again; +#ifdef _WANT_IO_C99_FORMATS + case 'j': /* intmax_t */ + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONG; + else + flags |= LONGDBL; + goto again; + case 't': /* ptrdiff_t */ + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (sizeof (ptrdiff_t) < sizeof (int)) + /* POSIX states ptrdiff_t is 16 or more bits, as + is short. */ + flags |= SHORT; + else if (sizeof (ptrdiff_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONG; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= LONGDBL; + goto again; + case 'z': /* size_t */ + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (sizeof (size_t) < sizeof (int)) + /* POSIX states size_t is 16 or more bits, as is short. */ + flags |= SHORT; + else if (sizeof (size_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONG; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= LONGDBL; + goto again; +#endif /* _WANT_IO_C99_FORMATS */ +#ifdef _WANT_IO_POSIX_EXTENSIONS + case 'm': + if (flags & (CHAR | SHORT | LONG | LONGDBL | MALLOC)) + goto match_failure; + init_m_ptr (); + flags |= MALLOC; + goto again; +#endif + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (flags & (CHAR | SHORT | LONG | LONGDBL | MALLOC)) + goto match_failure; + width = width * 10 + c - '0'; + goto again; + +#ifndef _NO_POS_ARGS + case '$': + if (flags & (CHAR | SHORT | LONG | LONGDBL | SUPPRESS | MALLOC)) + goto match_failure; + if (width <= MAX_POS_ARGS) + { + N = width - 1; + is_pos_arg = 1; + width = 0; + goto again; + } + _REENT_ERRNO(rptr) = EINVAL; + goto input_failure; +#endif /* !_NO_POS_ARGS */ + + /* + * Conversions. Those marked `compat' are for + * 4.[123]BSD compatibility. + * + * (According to ANSI, E and X formats are supposed to + * the same as e and x. Sorry about that.) + */ + + case 'D': /* compat */ + flags |= LONG; + /* FALLTHROUGH */ + case 'd': + c = CT_INT; + ccfn = (u_long (*)CCFN_PARAMS)_strtol_r; + base = 10; + break; + + case 'i': + c = CT_INT; + ccfn = (u_long (*)CCFN_PARAMS)_strtol_r; + base = 0; + break; + + case 'O': /* compat */ + flags |= LONG; + /* FALLTHROUGH */ + case 'o': + c = CT_INT; + ccfn = _strtoul_r; + base = 8; + break; + + case 'u': + c = CT_INT; + ccfn = _strtoul_r; + base = 10; + break; + + case 'X': + case 'x': + flags |= PFXOK; /* enable 0x prefixing */ + c = CT_INT; + ccfn = _strtoul_r; + base = 16; + break; + +#ifdef FLOATING_POINT +# ifdef _WANT_IO_C99_FORMATS + case 'a': + case 'A': + case 'F': +# endif + case 'E': + case 'G': + case 'e': + case 'f': + case 'g': + c = CT_FLOAT; + break; +#endif + +#ifdef _WANT_IO_C99_FORMATS + case 'S': + flags |= LONG; + /* FALLTHROUGH */ +#endif + + case 's': + c = CT_STRING; + break; + + case '[': + fmt = (u_char *) __sccl (ccltab, (unsigned char *) fmt); + flags |= NOSKIP; + c = CT_CCL; + break; + +#ifdef _WANT_IO_C99_FORMATS + case 'C': + flags |= LONG; + /* FALLTHROUGH */ +#endif + + case 'c': + flags |= NOSKIP; + c = CT_CHAR; + break; + + case 'p': /* pointer format is like hex */ + flags |= POINTER | PFXOK; + c = CT_INT; + ccfn = _strtoul_r; + base = 16; + break; + + case 'n': + if (flags & SUPPRESS) /* ??? */ + continue; +#ifdef _WANT_IO_C99_FORMATS + if (flags & CHAR) + { + cp = GET_ARG (N, ap, char *); + *cp = nread; + } + else +#endif + if (flags & SHORT) + { + sp = GET_ARG (N, ap, short *); + *sp = nread; + } + else if (flags & LONG) + { + lp = GET_ARG (N, ap, long *); + *lp = nread; + } +#ifndef _NO_LONGLONG + else if (flags & LONGDBL) + { + llp = GET_ARG (N, ap, long long*); + *llp = nread; + } +#endif + else + { + ip = GET_ARG (N, ap, int *); + *ip = nread; + } + continue; + + default: + goto match_failure; + } + + /* + * We have a conversion that requires input. + */ + if (BufferEmpty) + goto input_failure; + + /* + * Consume leading white space, except for formats that + * suppress this. + */ + if ((flags & NOSKIP) == 0) + { + while (isspace (*fp->_p)) + { + nread++; + if (--fp->_r > 0) + fp->_p++; + else + if (__srefill_r (rptr, fp)) + goto input_failure; + } + /* + * Note that there is at least one character in the + * buffer, so conversions that do not set NOSKIP ca + * no longer result in an input failure. + */ + } + + /* + * Do the conversion. + */ + switch (c) + { + + case CT_CHAR: + /* scan arbitrary characters (sets NOSKIP) */ + if (width == 0) + width = 1; +#if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 2 + if (flags & LONG) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wchar_t **wcp_p = NULL; + wchar_t *wcp0 = NULL; + size_t wcp_siz = 0; +#endif + mbstate_t state; + if (flags & SUPPRESS) + wcp = NULL; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + wcp_siz = alloc_m_ptr (wchar_t, wcp, wcp0, wcp_p, 32); +#endif + else + wcp = GET_ARG (N, ap, wchar_t *); + n = 0; + while (width != 0) + { + if (n == MB_CUR_MAX) + goto input_failure; + buf[n++] = *fp->_p; + fp->_r -= 1; + fp->_p += 1; + /* Got a high surrogate, allow low surrogate to slip + through */ + if (mbslen != 3 || state.__count != 4) + memset (&state, 0, sizeof (mbstate_t)); + if ((mbslen = _mbrtowc_r (rptr, wcp, buf, n, &state)) + == (size_t)-1) + goto input_failure; /* Invalid sequence */ + if (mbslen == 0 && !(flags & SUPPRESS)) + *wcp = L'\0'; + if (mbslen != (size_t)-2) /* Incomplete sequence */ + { + nread += n; + /* Handle high surrogate */ + if (mbslen != 3 || state.__count != 4) + width -= 1; + if (!(flags & SUPPRESS)) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wcp_siz = realloc_m_ptr (wchar_t, wcp, wcp0, wcp_p, + wcp_siz); +#endif + wcp++; + } + n = 0; + } + if (BufferEmpty) + { + if (n != 0) + goto input_failure; + break; + } + } +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (wchar_t, wcp_p, wcp - wcp0, wcp_siz); +#endif + if (!(flags & SUPPRESS)) + nassigned++; + } + else +#endif /* ELIX_LEVEL */ + if (flags & SUPPRESS) + { + size_t sum = 0; + for (;;) + { + if ((n = fp->_r) < (int)width) + { + sum += n; + width -= n; + fp->_p += n; + if (__srefill_r (rptr, fp)) + { + if (sum == 0) + goto input_failure; + break; + } + } + else + { + sum += width; + fp->_r -= width; + fp->_p += width; + break; + } + } + nread += sum; + } + else + { + size_t r; +#ifdef _WANT_IO_POSIX_EXTENSIONS + char **p_p = NULL; + if (flags & MALLOC) + alloc_m_ptr (char, p, p0, p_p, width); + else +#endif + p = GET_ARG (N, ap, char *); + r = _fread_r (rptr, p, 1, width, fp); + if (r == 0) + goto input_failure; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (char, p_p, r, width); +#endif + nread += r; + nassigned++; + } + break; + + case CT_CCL: + /* scan a (nonempty) character class (sets NOSKIP) */ + if (width == 0) + width = SIZE_MAX; + /* take only those things in the class */ +#if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 2 + if (flags & LONG) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wchar_t **wcp_p = NULL; + wchar_t *wcp0 = NULL; + size_t wcp_siz = 0; +#endif + mbstate_t state; + if (flags & SUPPRESS) + wcp = &wc; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + wcp_siz = alloc_m_ptr (wchar_t, wcp, wcp0, wcp_p, 32); +#endif + else + wcp = GET_ARG (N, ap, wchar_t *); + n = 0; + while (width != 0) { + if (n == MB_CUR_MAX) + goto input_failure; + buf[n++] = *fp->_p; + fp->_r -= 1; + fp->_p += 1; + /* Got a high surrogate, allow low surrogate to slip + through */ + if (mbslen != 3 || state.__count != 4) + memset (&state, 0, sizeof (mbstate_t)); + if ((mbslen = _mbrtowc_r (rptr, wcp, buf, n, &state)) + == (size_t)-1) + goto input_failure; + if (mbslen == 0) + *wcp = L'\0'; + if (mbslen != (size_t)-2) /* Incomplete sequence */ + { + if (!ccltab[__wctob (rptr, *wcp)]) + { + while (n != 0) + _ungetc_r (rptr, (unsigned char) buf[--n], fp); + break; + } + nread += n; + /* Handle high surrogate */ + if (mbslen != 3 || state.__count != 4) + width -= 1; + if ((flags & SUPPRESS) == 0) + { + wcp += 1; +#ifdef _WANT_IO_POSIX_EXTENSIONS + wcp_siz = realloc_m_ptr (wchar_t, wcp, wcp0, wcp_p, + wcp_siz); +#endif + } + n = 0; + } + if (BufferEmpty) + { + if (n != 0) + goto input_failure; + break; + } + } + if (!(flags & SUPPRESS)) + { + *wcp = L'\0'; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (wchar_t, wcp_p, wcp - wcp0 + 1, wcp_siz); +#endif + nassigned++; + } + } + else +#endif /* ELIX_LEVEL */ + if (flags & SUPPRESS) + { + n = 0; + while (ccltab[*fp->_p]) + { + n++, fp->_r--, fp->_p++; + if (--width == 0) + break; + if (BufferEmpty) + { + if (n == 0) + goto input_failure; + break; + } + } + if (n == 0) + goto match_failure; + nread += n; + } + else + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + char **p_p = NULL; + size_t p_siz = 0; + + if (flags & MALLOC) + p_siz = alloc_m_ptr (char, p, p0, p_p, 32); + else +#endif + p0 = p = GET_ARG (N, ap, char *); + while (ccltab[*fp->_p]) + { + fp->_r--; + *p++ = *fp->_p++; +#ifdef _WANT_IO_POSIX_EXTENSIONS + p_siz = realloc_m_ptr (char, p, p0, p_p, p_siz); +#endif + if (--width == 0) + break; + if (BufferEmpty) + { + if (p == p0) + goto input_failure; + break; + } + } + n = p - p0; + if (n == 0) + goto match_failure; + *p = 0; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (char, p_p, n + 1, p_siz); +#endif + nassigned++; + nread += n; + } + break; + + case CT_STRING: + /* like CCL, but zero-length string OK, & no NOSKIP */ + if (width == 0) + width = SIZE_MAX; +#if !defined(_ELIX_LEVEL) || _ELIX_LEVEL >= 2 + if (flags & LONG) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wchar_t **wcp_p = NULL; + wchar_t *wcp0 = NULL; + size_t wcp_siz = 0; +#endif + /* Process %S and %ls placeholders */ + mbstate_t state; + if (flags & SUPPRESS) + wcp = &wc; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + wcp_siz = alloc_m_ptr (wchar_t, wcp, wcp0, wcp_p, 32); +#endif + else + wcp = GET_ARG (N, ap, wchar_t *); + n = 0; + while (!isspace (*fp->_p) && width != 0) + { + if (n == MB_CUR_MAX) + goto input_failure; + buf[n++] = *fp->_p; + fp->_r -= 1; + fp->_p += 1; + /* Got a high surrogate, allow low surrogate to slip + through */ + if (mbslen != 3 || state.__count != 4) + memset (&state, 0, sizeof (mbstate_t)); + if ((mbslen = _mbrtowc_r (rptr, wcp, buf, n, &state)) + == (size_t)-1) + goto input_failure; + if (mbslen == 0) + *wcp = L'\0'; + if (mbslen != (size_t)-2) /* Incomplete sequence */ + { + if (iswspace(*wcp)) + { + while (n != 0) + _ungetc_r (rptr, (unsigned char) buf[--n], fp); + break; + } + nread += n; + /* Handle high surrogate */ + if (mbslen != 3 || state.__count != 4) + width -= 1; + if ((flags & SUPPRESS) == 0) + { + wcp += 1; +#ifdef _WANT_IO_POSIX_EXTENSIONS + wcp_siz = realloc_m_ptr (wchar_t, wcp, wcp0, wcp_p, + wcp_siz); +#endif + } + n = 0; + } + if (BufferEmpty) + { + if (n != 0) + goto input_failure; + break; + } + } + if (!(flags & SUPPRESS)) + { + *wcp = L'\0'; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (wchar_t, wcp_p, wcp - wcp0 + 1, wcp_siz); +#endif + nassigned++; + } + } + else +#endif + if (flags & SUPPRESS) + { + n = 0; + while (!isspace (*fp->_p)) + { + n++, fp->_r--, fp->_p++; + if (--width == 0) + break; + if (BufferEmpty) + break; + } + nread += n; + } + else + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + char **p_p = NULL; + size_t p_siz = 0; + + if (flags & MALLOC) + p_siz = alloc_m_ptr (char, p, p0, p_p, 32); + else +#endif + p0 = GET_ARG (N, ap, char *); + p = p0; + while (!isspace (*fp->_p)) + { + fp->_r--; + *p++ = *fp->_p++; +#ifdef _WANT_IO_POSIX_EXTENSIONS + p_siz = realloc_m_ptr (char, p, p0, p_p, p_siz); +#endif + if (--width == 0) + break; + if (BufferEmpty) + break; + } + *p = 0; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (char, p_p, p - p0 + 1, p_siz); +#endif + nread += p - p0; + nassigned++; + } + continue; + + case CT_INT: + { + /* scan an integer as if by strtol/strtoul */ + unsigned width_left = 0; + int skips = 0; +#ifdef hardway + if (width == 0 || width > sizeof (buf) - 1) +#else + /* size_t is unsigned, hence this optimisation */ + if (width - 1 > sizeof (buf) - 2) +#endif + { + width_left = width - (sizeof (buf) - 1); + width = sizeof (buf) - 1; + } + flags |= SIGNOK | NDIGITS | NZDIGITS | NNZDIGITS; + for (p = buf; width; width--) + { + c = *fp->_p; + /* + * Switch on the character; `goto ok' if we + * accept it as a part of number. + */ + switch (c) + { + /* + * The digit 0 is always legal, but is special. + * For %i conversions, if no digits (zero or nonzero) + * have been scanned (only signs), we will have base==0. + * In that case, we should set it to 8 and enable 0x + * prefixing. Also, if we have not scanned zero digits + * before this, do not turn off prefixing (someone else + * will turn it off if we have scanned any nonzero digits). + */ + case '0': + if (! (flags & NNZDIGITS)) + goto ok; + if (base == 0) + { + base = 8; + flags |= PFXOK; + } + if (flags & NZDIGITS) + { + flags &= ~(SIGNOK | NZDIGITS | NDIGITS); + goto ok; + } + flags &= ~(SIGNOK | PFXOK | NDIGITS); + if (width_left) + { + width_left--; + width++; + } + ++skips; + goto skip; + + /* 1 through 7 always legal */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + base = basefix[base]; + flags &= ~(SIGNOK | PFXOK | NDIGITS | NNZDIGITS); + goto ok; + + /* digits 8 and 9 ok iff decimal or hex */ + case '8': + case '9': + base = basefix[base]; + if (base <= 8) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS | NNZDIGITS); + goto ok; + + /* letters ok iff hex */ + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + /* no need to fix base here */ + if (base <= 10) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS | NNZDIGITS); + goto ok; + + /* sign ok only as first character */ + case '+': + case '-': + if (flags & SIGNOK) + { + flags &= ~SIGNOK; + goto ok; + } + break; + + /* x ok iff flag still set & single 0 seen */ + case 'x': + case 'X': + if ((flags & (PFXOK | NZDIGITS)) == PFXOK) + { + base = 16;/* if %i */ + flags &= ~PFXOK; + /* We must reset the NZDIGITS and NDIGITS + flags that would have been unset by seeing + the zero that preceded the X or x. */ + flags |= NZDIGITS | NDIGITS; + goto ok; + } + break; + } + + /* + * If we got here, c is not a legal character + * for a number. Stop accumulating digits. + */ + break; + ok: + /* + * c is legal: store it and look at the next. + */ + *p++ = c; + skip: + if (--fp->_r > 0) + fp->_p++; + else + if (__srefill_r (rptr, fp)) + break; /* EOF */ + } + /* + * If we had only a sign, it is no good; push back the sign. + * If the number ends in `x', it was [sign] '0' 'x', so push back + * the x and treat it as [sign] '0'. + * Use of ungetc here and below assumes ASCII encoding; we are only + * pushing back 7-bit characters, so casting to unsigned char is + * not necessary. + */ + if (flags & NDIGITS) + { + if (p > buf) + _ungetc_r (rptr, *--p, fp); /* [-+xX] */ + if (p == buf) + goto match_failure; + } + if ((flags & SUPPRESS) == 0) + { + u_long res; + + *p = 0; + res = (*ccfn) (rptr, buf, (char **) NULL, base); + if (flags & POINTER) + { + void **vp = GET_ARG (N, ap, void **); +#ifndef _NO_LONGLONG + if (sizeof (uintptr_t) > sizeof (u_long)) + { + u_long_long resll; + resll = _strtoull_r (rptr, buf, (char **) NULL, base); + *vp = (void *) (uintptr_t) resll; + } + else +#endif /* !_NO_LONGLONG */ + *vp = (void *) (uintptr_t) res; + } +#ifdef _WANT_IO_C99_FORMATS + else if (flags & CHAR) + { + cp = GET_ARG (N, ap, char *); + *cp = res; + } +#endif + else if (flags & SHORT) + { + sp = GET_ARG (N, ap, short *); + *sp = res; + } + else if (flags & LONG) + { + lp = GET_ARG (N, ap, long *); + *lp = res; + } +#ifndef _NO_LONGLONG + else if (flags & LONGDBL) + { + u_long_long resll; + if (ccfn == _strtoul_r) + resll = _strtoull_r (rptr, buf, (char **) NULL, base); + else + resll = _strtoll_r (rptr, buf, (char **) NULL, base); + llp = GET_ARG (N, ap, long long*); + *llp = resll; + } +#endif + else + { + ip = GET_ARG (N, ap, int *); + *ip = res; + } + nassigned++; + } + nread += p - buf + skips; + break; + } +#ifdef FLOATING_POINT + case CT_FLOAT: + { + /* scan a floating point number as if by strtod */ + /* This code used to assume that the number of digits is reasonable. + However, ANSI / ISO C makes no such stipulation; we have to get + exact results even when there is an unreasonable amount of + leading zeroes. */ + long leading_zeroes = 0; + long zeroes, exp_adjust; + char *exp_start = NULL; + unsigned width_left = 0; + char nancount = 0; + char infcount = 0; + const char *decpt = _localeconv_r (rptr)->decimal_point; +#ifdef _MB_CAPABLE + int decptpos = 0; +#endif +#ifdef hardway + if (width == 0 || width > sizeof (buf) - 1) +#else + /* size_t is unsigned, hence this optimisation */ + if (width - 1 > sizeof (buf) - 2) +#endif + { + width_left = width - (sizeof (buf) - 1); + width = sizeof (buf) - 1; + } + flags |= SIGNOK | NDIGITS | DPTOK | EXPOK; + zeroes = 0; + exp_adjust = 0; + for (p = buf; width; ) + { + c = *fp->_p; + /* + * This code mimicks the integer conversion + * code, but is much simpler. + */ + switch (c) + { + case '0': + if (flags & NDIGITS) + { + flags &= ~SIGNOK; + zeroes++; + if (width_left) + { + width_left--; + width++; + } + goto fskip; + } + /* Fall through. */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (nancount + infcount == 0) + { + flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + break; + + /* Chars a, e and f have various special meanings apart from + their hex value. They are handled separately, see below. */ + case 'b': + case 'B': + case 'c': + case 'C': + case 'd': + case 'D': + if ((flags & HEXFLT) && nancount + infcount == 0) + { + flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + break; + + case 'x': + case 'X': + /* Did we have exactly one leading zero yet? */ + if ((flags & (SIGNOK | NDIGITS | HEXFLT)) == NDIGITS + && zeroes == 1) + { + flags |= HEXFLT; + flags &= ~NDIGITS; + /* We skipped the first zero, so we have to add + it now to the buffer. */ + *p++ = '0'; + width--; + zeroes = 0; + goto fok; + } + break; + + case '+': + case '-': + if (flags & SIGNOK) + { + flags &= ~SIGNOK; + goto fok; + } + break; + case 'n': + case 'N': + if (nancount == 0 && zeroes == 0 + && (flags & (NDIGITS | DPTOK | EXPOK)) == + (NDIGITS | DPTOK | EXPOK)) + { + flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS); + nancount = 1; + goto fok; + } + if (nancount == 2) + { + nancount = 3; + goto fok; + } + if (infcount == 1 || infcount == 4) + { + infcount++; + goto fok; + } + break; + case 'a': + case 'A': + if ((flags & HEXFLT) && nancount + infcount == 0) + { + flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + if (nancount == 1) + { + nancount = 2; + goto fok; + } + break; + case 'i': + case 'I': + if (infcount == 0 && zeroes == 0 + && (flags & (NDIGITS | DPTOK | EXPOK)) == + (NDIGITS | DPTOK | EXPOK)) + { + flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS); + infcount = 1; + goto fok; + } + if (infcount == 3 || infcount == 5) + { + infcount++; + goto fok; + } + break; + case 'f': + case 'F': + if ((flags & HEXFLT) && nancount + infcount == 0) + { + flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + if (infcount == 2) + { + infcount = 3; + goto fok; + } + break; + case 't': + case 'T': + if (infcount == 6) + { + infcount = 7; + goto fok; + } + break; + case 'y': + case 'Y': + if (infcount == 7) + { + infcount = 8; + goto fok; + } + break; + + case 'p': + case 'P': + /* p is the exponent marker in hex case. */ + if (!(flags & HEXFLT)) + break; + goto fexp; + case 'e': + case 'E': + /* e is just a digit in hex case, not the exponent marker. */ + if (flags & HEXFLT) + { + if (nancount + infcount == 0) + { + flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + break; + } + + fexp: + /* no exponent without some digits */ + if ((flags & (NDIGITS | EXPOK)) == EXPOK + || ((flags & EXPOK) && zeroes)) + { + if (! (flags & DPTOK)) + { + exp_adjust = zeroes - leading_zeroes; + exp_start = p; + } + flags = + (flags & ~(EXPOK | DPTOK | HEXFLT)) | + SIGNOK | NDIGITS; + zeroes = 0; + goto fok; + } + break; + default: +#ifndef _MB_CAPABLE + if ((unsigned char) c == (unsigned char) decpt[0] + && (flags & DPTOK)) + { + flags &= ~(SIGNOK | DPTOK); + leading_zeroes = zeroes; + goto fok; + } + break; +#else + if (flags & DPTOK) + { + while ((unsigned char) c + == (unsigned char) decpt[decptpos]) + { + if (decpt[++decptpos] == '\0') + { + /* We read the complete decpt seq. */ + flags &= ~(SIGNOK | DPTOK); + leading_zeroes = zeroes; + p = stpncpy (p, decpt, decptpos); + decptpos = 0; + goto fskip; + } + ++nread; + if (--fp->_r > 0) + fp->_p++; + else if (__srefill_r (rptr, fp)) + break; /* EOF */ + c = *fp->_p; + } + if (decptpos > 0) + { + /* We read part of a multibyte decimal point, + but the rest is invalid or we're at EOF, + so back off. */ + while (decptpos-- > 0) + { + _ungetc_r (rptr, (unsigned char) decpt[decptpos], + fp); + --nread; + } + } + } + break; +#endif + } + break; + fok: + *p++ = c; + fskip: + width--; + ++nread; + if (--fp->_r > 0) + fp->_p++; + else + if (__srefill_r (rptr, fp)) + break; /* EOF */ + } + if (zeroes) + flags &= ~NDIGITS; + /* We may have a 'N' or possibly even [sign] 'N' 'a' as the + start of 'NaN', only to run out of chars before it was + complete (or having encountered a non-matching char). So + check here if we have an outstanding nancount, and if so + put back the chars we did swallow and treat as a failed + match. + + FIXME - we still don't handle NAN([0xdigits]). */ + if (nancount - 1U < 2U) /* nancount && nancount < 3 */ + { + /* Newlib's ungetc works even if we called __srefill in + the middle of a partial parse, but POSIX does not + guarantee that in all implementations of ungetc. */ + while (p > buf) + { + _ungetc_r (rptr, *--p, fp); /* [-+nNaA] */ + --nread; + } + goto match_failure; + } + /* Likewise for 'inf' and 'infinity'. But be careful that + 'infinite' consumes only 3 characters, leaving the stream + at the second 'i'. */ + if (infcount - 1U < 7U) /* infcount && infcount < 8 */ + { + if (infcount >= 3) /* valid 'inf', but short of 'infinity' */ + while (infcount-- > 3) + { + _ungetc_r (rptr, *--p, fp); /* [iInNtT] */ + --nread; + } + else + { + while (p > buf) + { + _ungetc_r (rptr, *--p, fp); /* [-+iInN] */ + --nread; + } + goto match_failure; + } + } + /* + * If no digits, might be missing exponent digits + * (just give back the exponent) or might be missing + * regular digits, but had sign and/or decimal point. + */ + if (flags & NDIGITS) + { + if (flags & EXPOK) + { + /* no digits at all */ + while (p > buf) + { + _ungetc_r (rptr, *--p, fp); /* [-+.] */ + --nread; + } + goto match_failure; + } + /* just a bad exponent (e and maybe sign) */ + c = *--p; + --nread; + if (c != 'e' && c != 'E') + { + _ungetc_r (rptr, c, fp); /* [-+] */ + c = *--p; + --nread; + } + _ungetc_r (rptr, c, fp); /* [eE] */ + } + if ((flags & SUPPRESS) == 0) + { + double res = 0; +#ifdef _NO_LONGDBL +#define QUAD_RES res; +#else /* !_NO_LONG_DBL */ + long double qres = 0; +#define QUAD_RES qres; +#endif /* !_NO_LONG_DBL */ + long new_exp = 0; + + *p = 0; + if ((flags & (DPTOK | EXPOK)) == EXPOK) + { + exp_adjust = zeroes - leading_zeroes; + new_exp = -exp_adjust; + exp_start = p; + } + else if (exp_adjust) + new_exp = _strtol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust; + if (exp_adjust) + { + + /* If there might not be enough space for the new exponent, + truncate some trailing digits to make room. */ + if (exp_start >= buf + sizeof (buf) - MAX_LONG_LEN) + exp_start = buf + sizeof (buf) - MAX_LONG_LEN - 1; + sprintf (exp_start, "e%ld", new_exp); + } + + /* FIXME: Is that still true? + Current _strtold routine is markedly slower than + _strtod_r. Only use it if we have a long double + result. */ +#ifndef _NO_LONGDBL /* !_NO_LONGDBL */ + if (flags & LONGDBL) + qres = _strtold_r (rptr, buf, NULL); + else +#endif + res = _strtod_r (rptr, buf, NULL); + + if (flags & LONG) + { + dp = GET_ARG (N, ap, double *); + *dp = res; + } + else if (flags & LONGDBL) + { + ldp = GET_ARG (N, ap, _LONG_DOUBLE *); + *ldp = QUAD_RES; + } + else + { + flp = GET_ARG (N, ap, float *); + if (isnan (res)) + *flp = nanf (""); + else + *flp = res; + } + nassigned++; + } + break; + } +#endif /* FLOATING_POINT */ + } + } +input_failure: + /* On read failure, return EOF failure regardless of matches; errno + should have been set prior to here. On EOF failure (including + invalid format string), return EOF if no matches yet, else number + of matches made prior to failure. */ + nassigned = nassigned && !(fp->_flags & __SERR) ? nassigned : EOF; +match_failure: +all_done: + /* Return number of matches, which can be 0 on match failure. */ + _newlib_flockfile_end (fp); +#ifdef _WANT_IO_POSIX_EXTENSIONS + free_m_ptr (); +#endif + return nassigned; +} + +#ifndef _NO_POS_ARGS +/* Process all intermediate arguments. Fortunately, with scanf, all + intermediate arguments are sizeof(void*), so we don't need to scan + ahead in the format string. */ +static void * +get_arg (int n, va_list *ap, int *numargs_p, void **args) +{ + int numargs = *numargs_p; + while (n >= numargs) + args[numargs++] = va_arg (*ap, void *); + *numargs_p = numargs; + return args[n]; +} +#endif /* !_NO_POS_ARGS */ diff --git a/lib/stdio/vfwprintf.c b/lib/stdio/vfwprintf.c new file mode 100644 index 0000000..7807a12 --- /dev/null +++ b/lib/stdio/vfwprintf.c @@ -0,0 +1,2016 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* +FUNCTION +<>, <>, <>---wide character format argument list + +INDEX + vfwprintf +INDEX + _vfwprintf_r +INDEX + vwprintf +INDEX + _vwprintf_r +INDEX + vswprintf +INDEX + _vswprintf_r + +SYNOPSIS + #include + #include + #include + int vwprintf(const wchar_t *__restrict <[fmt]>, va_list <[list]>); + int vfwprintf(FILE *__restrict <[fp]>, + const wchar_t *__restrict <[fmt]>, va_list <[list]>); + int vswprintf(wchar_t * __restrict <[str]>, size_t <[size]>, + const wchar_t *__ restrict <[fmt]>, va_list <[list]>); + + int _vwprintf_r(struct _reent *<[reent]>, const wchar_t *<[fmt]>, + va_list <[list]>); + int _vfwprintf_r(struct _reent *<[reent]>, FILE *<[fp]>, + const wchar_t *<[fmt]>, va_list <[list]>); + int _vswprintf_r(struct _reent *<[reent]>, wchar_t *<[str]>, + size_t <[size]>, const wchar_t *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <> and <> are (respectively) variants +of <>, <> and <>. They differ only in allowing +their caller to pass the variable argument list as a <> object +(initialized by <>) rather than directly accepting a variable +number of arguments. The caller is responsible for calling <>. + +<<_vwprintf_r>>, <<_vfwprintf_r>> and <<_vswprintf_r>> are reentrant +versions of the above. + +RETURNS +The return values are consistent with the corresponding functions. + +PORTABILITY +POSIX-1.2008 with extensions; C99 (compliant except for POSIX extensions). + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. + +SEEALSO +<>, <> and <>. +*/ + +/* + * Actual wprintf innards. + * + * This code is large and complicated... + */ +#include + +#ifdef INTEGER_ONLY +# define VFWPRINTF vfiwprintf +# ifdef STRING_ONLY +# define _VFWPRINTF_R _svfiwprintf_r +# else +# define _VFWPRINTF_R _vfiwprintf_r +# endif +#else +# define VFWPRINTF vfwprintf +# ifdef STRING_ONLY +# define _VFWPRINTF_R _svfwprintf_r +# else +# define _VFWPRINTF_R _vfwprintf_r +# endif +# ifndef NO_FLOATING_POINT +# define FLOATING_POINT +# endif +#endif + +#define _NO_POS_ARGS +#ifdef _WANT_IO_POS_ARGS +# undef _NO_POS_ARGS +#endif + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "fvwrite.h" +#include "vfieeefp.h" +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ +#include "../locale/setlocale.h" +#endif + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL +#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG) +#undef _NO_LONGDBL +#endif + +#define _NO_LONGLONG +#if defined _WANT_IO_LONG_LONG \ + && (defined __GNUC__ || __STDC_VERSION__ >= 199901L) +# undef _NO_LONGLONG +#endif + +int _VFWPRINTF_R (struct _reent *, FILE *, const wchar_t *, va_list); +/* Defined in vfprintf.c. */ +#ifdef _FVWRITE_IN_STREAMIO +# ifdef STRING_ONLY +# define __SPRINT __ssprint_r +# else +# define __SPRINT __sprint_r +# endif +int __SPRINT (struct _reent *, FILE *, register struct __suio *); +#else +# ifdef STRING_ONLY +# define __SPRINT __ssputs_r +# else +# define __SPRINT __sfputs_r +# endif +int __SPRINT (struct _reent *, FILE *, const char *, size_t); +#endif +#ifndef STRING_ONLY +#ifdef _UNBUF_STREAM_OPT +/* + * Helper function for `fprintf to unbuffered unix file': creates a + * temporary buffer. We only work on write-only files; this avoids + * worries about ungetc buffers and so forth. + */ +static int +__sbwprintf (struct _reent *rptr, + register FILE *fp, + const wchar_t *fmt, + va_list ap) +{ + int ret; + FILE fake; + unsigned char buf[BUFSIZ]; + + /* copy the important variables */ + fake._flags = fp->_flags & ~__SNBF; + fake._flags2 = fp->_flags2; + fake._file = fp->_file; + fake._cookie = fp->_cookie; + fake._write = fp->_write; + + /* set up the buffer */ + fake._bf._base = fake._p = buf; + fake._bf._size = fake._w = sizeof (buf); + fake._lbfsize = 0; /* not actually used, but Just In Case */ +#ifndef __SINGLE_THREAD__ + __lock_init_recursive (fake._lock); +#endif + + /* do the work, then copy any error status */ + ret = _VFWPRINTF_R (rptr, &fake, fmt, ap); + if (ret >= 0 && _fflush_r (rptr, &fake)) + ret = EOF; + if (fake._flags & __SERR) + fp->_flags |= __SERR; + +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fake._lock); +#endif + return (ret); +} +#endif /* _UNBUF_STREAM_OPT */ +#endif /* !STRING_ONLY */ + + +#if defined (FLOATING_POINT) || defined (_WANT_IO_C99_FORMATS) +# include +#endif +#ifdef FLOATING_POINT +# include + +/* For %La, an exponent of 15 bits occupies the exponent character, a + sign, and up to 5 digits. */ +# define MAXEXPLEN 7 +# define DEFPREC 6 + +# ifdef _NO_LONGDBL + +extern char *_dtoa_r (struct _reent *, double, int, + int, int *, int *, char **); + +# define _PRINTF_FLOAT_TYPE double +# define _DTOA_R _dtoa_r +# define FREXP frexp + +# else /* !_NO_LONGDBL */ + +extern char *_ldtoa_r (struct _reent *, _LONG_DOUBLE, int, + int, int *, int *, char **); + +extern int _ldcheck (_LONG_DOUBLE *); + +# define _PRINTF_FLOAT_TYPE _LONG_DOUBLE +# define _DTOA_R _ldtoa_r +# define FREXP frexpl +# endif /* !_NO_LONGDBL */ + +static wchar_t *wcvt(struct _reent *, _PRINTF_FLOAT_TYPE, int, int, wchar_t *, + int *, int, int *, wchar_t *, int); + +static int wexponent(wchar_t *, int, int); + +#endif /* FLOATING_POINT */ + +/* BUF must be big enough for the maximum %#llo (assuming long long is + at most 64 bits, this would be 23 characters), the maximum + multibyte character %C, and the maximum default precision of %La + (assuming long double is at most 128 bits with 113 bits of + mantissa, this would be 29 characters). %e, %f, and %g use + reentrant storage shared with mprec. All other formats that use + buf get by with fewer characters. Making BUF slightly bigger + reduces the need for malloc in %.*a and %ls/%S, when large precision or + long strings are processed. + The bigger size of 100 bytes is used on systems which allow number + strings using the locale's grouping character. Since that's a multibyte + value, we should use a conservative value. + */ +#ifdef _WANT_IO_C99_FORMATS +#define BUF 100 +#else +#define BUF 40 +#endif +#if defined _MB_CAPABLE && MB_LEN_MAX > BUF +# undef BUF +# define BUF MB_LEN_MAX +#endif + +#ifndef _NO_LONGLONG +# define quad_t long long +# define u_quad_t unsigned long long +#else +# define quad_t long +# define u_quad_t unsigned long +#endif + +typedef quad_t * quad_ptr_t; +typedef void *void_ptr_t; +typedef char * char_ptr_t; +typedef wchar_t* wchar_ptr_t; +typedef long * long_ptr_t; +typedef int * int_ptr_t; +typedef short * short_ptr_t; + +#ifndef _NO_POS_ARGS +# ifdef NL_ARGMAX +# define MAX_POS_ARGS NL_ARGMAX +# else +# define MAX_POS_ARGS 32 +# endif + +union arg_val +{ + int val_int; + u_int val_u_int; + long val_long; + u_long val_u_long; + float val_float; + double val_double; + _LONG_DOUBLE val__LONG_DOUBLE; + int_ptr_t val_int_ptr_t; + short_ptr_t val_short_ptr_t; + long_ptr_t val_long_ptr_t; + char_ptr_t val_char_ptr_t; + wchar_ptr_t val_wchar_ptr_t; + quad_ptr_t val_quad_ptr_t; + void_ptr_t val_void_ptr_t; + quad_t val_quad_t; + u_quad_t val_u_quad_t; + wint_t val_wint_t; +}; + +static union arg_val * +get_arg (struct _reent *data, int n, wchar_t *fmt, + va_list *ap, int *numargs, union arg_val *args, + int *arg_type, wchar_t **last_fmt); +#endif /* !_NO_POS_ARGS */ + +/* + * Macros for converting digits to letters and vice versa + */ +#define to_digit(c) ((c) - L'0') +#define is_digit(c) ((unsigned)to_digit (c) <= 9) +#define to_char(n) ((n) + L'0') + +/* + * Flags used during conversion. + */ +#define ALT 0x001 /* alternate form */ +#define HEXPREFIX 0x002 /* add 0x or 0X prefix */ +#define LADJUST 0x004 /* left adjustment */ +#define LONGDBL 0x008 /* long double */ +#define LONGINT 0x010 /* long integer */ +#ifndef _NO_LONGLONG +# define QUADINT 0x020 /* quad integer */ +#else /* ifdef _NO_LONGLONG, make QUADINT equivalent to LONGINT, so + that %lld behaves the same as %ld, not as %d, as expected if: + sizeof (long long) = sizeof long > sizeof int */ +# define QUADINT LONGINT +#endif +#define SHORTINT 0x040 /* short integer */ +#define ZEROPAD 0x080 /* zero (as opposed to blank) pad */ +#define FPT 0x100 /* Floating point number */ +#ifdef _WANT_IO_C99_FORMATS +# define CHARINT 0x200 /* char as integer */ +#else /* define as 0, to make SARG and UARG occupy fewer instructions */ +# define CHARINT 0 +#endif +#ifdef _WANT_IO_C99_FORMATS +# define GROUPING 0x400 /* use grouping ("'" flag) */ +#endif + +#ifndef STRING_ONLY +int +VFWPRINTF (FILE *__restrict fp, + const wchar_t *__restrict fmt0, + va_list ap) +{ + int result; + result = _VFWPRINTF_R (_REENT, fp, fmt0, ap); + return result; +} +#endif /* STRING_ONLY */ + +int +_VFWPRINTF_R (struct _reent *data, + FILE * fp, + const wchar_t *fmt0, + va_list ap) +{ + register wchar_t *fmt; /* format string */ + register wint_t ch; /* character from fmt */ + register int n, m; /* handy integers (short term usage) */ + register wchar_t *cp; /* handy char pointer (short term usage) */ + register int flags; /* flags as above */ + wchar_t *fmt_anchor; /* current format spec being processed */ +#ifndef _NO_POS_ARGS + int N; /* arg number */ + int arg_index; /* index into args processed directly */ + int numargs; /* number of varargs read */ + wchar_t *saved_fmt; /* saved fmt pointer */ + union arg_val args[MAX_POS_ARGS]; + int arg_type[MAX_POS_ARGS]; + int is_pos_arg; /* is current format positional? */ + int old_is_pos_arg; /* is current format positional? */ +#endif + int ret; /* return value accumulator */ + int width; /* width from format (%8d), or 0 */ + int prec; /* precision from format (%.3d), or -1 */ + wchar_t sign; /* sign prefix (' ', '+', '-', or \0) */ +#ifdef _WANT_IO_C99_FORMATS + /* locale specific numeric grouping */ + wchar_t thousands_sep = L'\0'; + const char *grouping = NULL; +#endif +#if defined (_MB_CAPABLE) && !defined (__HAVE_LOCALE_INFO_EXTENDED__) \ + && (defined (FLOATING_POINT) || defined (_WANT_IO_C99_FORMATS)) + mbstate_t state; /* mbtowc calls from library must not change state */ +#endif +#ifdef FLOATING_POINT + wchar_t decimal_point; + wchar_t softsign; /* temporary negative sign for floats */ + union { int i; _PRINTF_FLOAT_TYPE fp; } _double_ = {0}; +# define _fpvalue (_double_.fp) + int expt; /* integer value of exponent */ + int expsize = 0; /* character count for expstr */ + wchar_t expstr[MAXEXPLEN]; /* buffer for exponent string */ + int lead; /* sig figs before decimal or group sep */ +#endif /* FLOATING_POINT */ +#if defined (FLOATING_POINT) || defined (_WANT_IO_C99_FORMATS) + int ndig = 0; /* actual number of digits returned by cvt */ +#endif +#if defined (FLOATING_POINT) && defined (_WANT_IO_C99_FORMATS) + int nseps; /* number of group separators with ' */ + int nrepeats; /* number of repeats of the last group */ +#endif + u_quad_t _uquad; /* integer arguments %[diouxX] */ + enum { OCT, DEC, HEX } base;/* base for [diouxX] conversion */ + int dprec; /* a copy of prec if [diouxX], 0 otherwise */ + int realsz; /* field size expanded by dprec */ + int size = 0; /* size of converted field or string */ + wchar_t *xdigs = NULL; /* digits for [xX] conversion */ +#ifdef _FVWRITE_IN_STREAMIO +#define NIOV 8 + struct __suio uio; /* output information: summary */ + struct __siov iov[NIOV];/* ... and individual io vectors */ + register struct __siov *iovp;/* for PRINT macro */ +#endif + wchar_t buf[BUF]; /* space for %c, %ls/%S, %[diouxX], %[aA] */ + wchar_t ox[2]; /* space for 0x hex-prefix */ + wchar_t *malloc_buf = NULL;/* handy pointer for malloced buffers */ + + /* + * Choose PADSIZE to trade efficiency vs. size. If larger printf + * fields occur frequently, increase PADSIZE and make the initialisers + * below longer. + */ +#define PADSIZE 16 /* pad chunk size */ + static const wchar_t blanks[PADSIZE] = + {L' ',L' ',L' ',L' ',L' ',L' ',L' ',L' ', + L' ',L' ',L' ',L' ',L' ',L' ',L' ',L' '}; + static const wchar_t zeroes[PADSIZE] = + {L'0',L'0',L'0',L'0',L'0',L'0',L'0',L'0', + L'0',L'0',L'0',L'0',L'0',L'0',L'0',L'0'}; + +#ifdef FLOATING_POINT +#ifdef _MB_CAPABLE +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + decimal_point = *__get_current_numeric_locale ()->wdecimal_point; +#else + { + size_t nconv; + + memset (&state, '\0', sizeof (state)); + nconv = _mbrtowc_r (data, &decimal_point, + _localeconv_r (data)->decimal_point, + MB_CUR_MAX, &state); + if (nconv == (size_t) -1 || nconv == (size_t) -2) + decimal_point = L'.'; + } +#endif +#else + decimal_point = (wchar_t) *_localeconv_r (data)->decimal_point; +#endif +#endif + /* + * BEWARE, these `goto error' on error, and PAD uses `n'. + */ +#ifdef _FVWRITE_IN_STREAMIO +#define PRINT(ptr, len) { \ + iovp->iov_base = (char *) (ptr); \ + iovp->iov_len = (len) * sizeof (wchar_t); \ + uio.uio_resid += (len) * sizeof (wchar_t); \ + iovp++; \ + if (++uio.uio_iovcnt >= NIOV) { \ + if (__SPRINT(data, fp, &uio)) \ + goto error; \ + iovp = iov; \ + } \ +} +#define PAD(howmany, with) { \ + if ((n = (howmany)) > 0) { \ + while (n > PADSIZE) { \ + PRINT (with, PADSIZE); \ + n -= PADSIZE; \ + } \ + PRINT (with, n); \ + } \ +} +#define PRINTANDPAD(p, ep, len, with) { \ + int n = (ep) - (p); \ + if (n > (len)) \ + n = (len); \ + if (n > 0) \ + PRINT((p), n); \ + PAD((len) - (n > 0 ? n : 0), (with)); \ +} +#define FLUSH() { \ + if (uio.uio_resid && __SPRINT(data, fp, &uio)) \ + goto error; \ + uio.uio_iovcnt = 0; \ + iovp = iov; \ +} +#else +#define PRINT(ptr, len) { \ + if (__SPRINT (data, fp, (const char *)(ptr), (len) * sizeof (wchar_t)) == EOF) \ + goto error; \ +} +#define PAD(howmany, with) { \ + if ((n = (howmany)) > 0) { \ + while (n > PADSIZE) { \ + PRINT (with, PADSIZE); \ + n -= PADSIZE; \ + } \ + PRINT (with, n); \ + } \ +} +#define PRINTANDPAD(p, ep, len, with) { \ + int n = (ep) - (p); \ + if (n > (len)) \ + n = (len); \ + if (n > 0) \ + PRINT((p), n); \ + PAD((len) - (n > 0 ? n : 0), (with)); \ +} +#define FLUSH() +#endif + + /* Macros to support positional arguments */ +#ifndef _NO_POS_ARGS +# define GET_ARG(n, ap, type) \ + (is_pos_arg \ + ? (n < numargs \ + ? args[n].val_##type \ + : get_arg (data, n, fmt_anchor, &ap, &numargs, args, \ + arg_type, &saved_fmt)->val_##type) \ + : (arg_index++ < numargs \ + ? args[n].val_##type \ + : (numargs < MAX_POS_ARGS \ + ? args[numargs++].val_##type = va_arg (ap, type) \ + : va_arg (ap, type)))) +#else +# define GET_ARG(n, ap, type) (va_arg (ap, type)) +#endif + + /* + * To extend shorts properly, we need both signed and unsigned + * argument extraction methods. + */ +#ifndef _NO_LONGLONG +#define SARG() \ + (flags&QUADINT ? GET_ARG (N, ap, quad_t) : \ + flags&LONGINT ? GET_ARG (N, ap, long) : \ + flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (long)(signed char)GET_ARG (N, ap, int) : \ + (long)GET_ARG (N, ap, int)) +#define UARG() \ + (flags&QUADINT ? GET_ARG (N, ap, u_quad_t) : \ + flags&LONGINT ? GET_ARG (N, ap, u_long) : \ + flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, ap, int) : \ + (u_long)GET_ARG (N, ap, u_int)) +#else +#define SARG() \ + (flags&LONGINT ? GET_ARG (N, ap, long) : \ + flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (long)(signed char)GET_ARG (N, ap, int) : \ + (long)GET_ARG (N, ap, int)) +#define UARG() \ + (flags&LONGINT ? GET_ARG (N, ap, u_long) : \ + flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ + flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, ap, int) : \ + (u_long)GET_ARG (N, ap, u_int)) +#endif + +#ifndef STRING_ONLY + /* Initialize std streams if not dealing with sprintf family. */ + CHECK_INIT (data, fp); + _newlib_flockfile_start (fp); + + ORIENT(fp, 1); + + /* sorry, fwprintf(read_only_file, "") returns EOF, not 0 */ + if (cantwrite (data, fp)) { + _newlib_flockfile_exit (fp); + return (EOF); + } + +#ifdef _UNBUF_STREAM_OPT + /* optimise fwprintf(stderr) (and other unbuffered Unix files) */ + if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) && + fp->_file >= 0) { + _newlib_flockfile_exit (fp); + return (__sbwprintf (data, fp, fmt0, ap)); + } +#endif +#else /* STRING_ONLY */ + /* Create initial buffer if we are called by asprintf family. */ + if (fp->_flags & __SMBF && !fp->_bf._base) + { + fp->_bf._base = fp->_p = _malloc_r (data, 64); + if (!fp->_p) + { + _REENT_ERRNO(data) = ENOMEM; + return EOF; + } + fp->_bf._size = 64; + } +#endif /* STRING_ONLY */ + + fmt = (wchar_t *)fmt0; +#ifdef _FVWRITE_IN_STREAMIO + uio.uio_iov = iovp = iov; + uio.uio_resid = 0; + uio.uio_iovcnt = 0; +#endif + ret = 0; +#ifndef _NO_POS_ARGS + arg_index = 0; + saved_fmt = NULL; + arg_type[0] = -1; + numargs = 0; + is_pos_arg = 0; +#endif + + /* + * Scan the format for conversions (`%' character). + */ + for (;;) { + cp = fmt; + while (*fmt != L'\0' && *fmt != L'%') + ++fmt; + if ((m = fmt - cp) != 0) { + PRINT (cp, m); + ret += m; + } + if (*fmt == L'\0') + goto done; + fmt_anchor = fmt; + fmt++; /* skip over '%' */ + + flags = 0; + dprec = 0; + width = 0; + prec = -1; + sign = L'\0'; +#ifdef FLOATING_POINT + lead = 0; +#ifdef _WANT_IO_C99_FORMATS + nseps = nrepeats = 0; +#endif +#endif +#ifndef _NO_POS_ARGS + N = arg_index; + is_pos_arg = 0; +#endif + +rflag: ch = *fmt++; +reswitch: switch (ch) { +#ifdef _WANT_IO_C99_FORMATS + case L'\'': +#ifdef _MB_CAPABLE +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + thousands_sep = *__get_current_numeric_locale ()->wthousands_sep; +#else + { + size_t nconv; + + memset (&state, '\0', sizeof (state)); + nconv = _mbrtowc_r (data, &thousands_sep, + _localeconv_r (data)->thousands_sep, + MB_CUR_MAX, &state); + if (nconv == (size_t) -1 || nconv == (size_t) -2) + thousands_sep = L'\0'; + } +#endif +#else + thousands_sep = (wchar_t) *_localeconv_r(data)->thousands_sep; +#endif + grouping = _localeconv_r (data)->grouping; + if (thousands_sep && grouping && *grouping) + flags |= GROUPING; + goto rflag; +#endif + case L' ': + /* + * ``If the space and + flags both appear, the space + * flag will be ignored.'' + * -- ANSI X3J11 + */ + if (!sign) + sign = L' '; + goto rflag; + case L'#': + flags |= ALT; + goto rflag; + case L'*': +#ifndef _NO_POS_ARGS + /* we must check for positional arg used for dynamic width */ + n = N; + old_is_pos_arg = is_pos_arg; + is_pos_arg = 0; + if (is_digit (*fmt)) { + wchar_t *old_fmt = fmt; + + n = 0; + ch = *fmt++; + do { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } while (is_digit (ch)); + + if (ch == L'$') { + if (n <= MAX_POS_ARGS) { + n -= 1; + is_pos_arg = 1; + } + else + goto error; + } + else { + fmt = old_fmt; + goto rflag; + } + } +#endif /* !_NO_POS_ARGS */ + + /* + * ``A negative field width argument is taken as a + * - flag followed by a positive field width.'' + * -- ANSI X3J11 + * They don't exclude field widths read from args. + */ + width = GET_ARG (n, ap, int); +#ifndef _NO_POS_ARGS + is_pos_arg = old_is_pos_arg; +#endif + if (width >= 0) + goto rflag; + width = -width; + /* FALLTHROUGH */ + case L'-': + flags |= LADJUST; + goto rflag; + case L'+': + sign = L'+'; + goto rflag; + case L'.': + if ((ch = *fmt++) == L'*') { +#ifndef _NO_POS_ARGS + /* we must check for positional arg used for dynamic width */ + n = N; + old_is_pos_arg = is_pos_arg; + is_pos_arg = 0; + if (is_digit (*fmt)) { + wchar_t *old_fmt = fmt; + + n = 0; + ch = *fmt++; + do { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } while (is_digit (ch)); + + if (ch == L'$') { + if (n <= MAX_POS_ARGS) { + n -= 1; + is_pos_arg = 1; + } + else + goto error; + } + else { + fmt = old_fmt; + goto rflag; + } + } +#endif /* !_NO_POS_ARGS */ + prec = GET_ARG (n, ap, int); +#ifndef _NO_POS_ARGS + is_pos_arg = old_is_pos_arg; +#endif + if (prec < 0) + prec = -1; + goto rflag; + } + n = 0; + while (is_digit (ch)) { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } + prec = n < 0 ? -1 : n; + goto reswitch; + case L'0': + /* + * ``Note that 0 is taken as a flag, not as the + * beginning of a field width.'' + * -- ANSI X3J11 + */ + flags |= ZEROPAD; + goto rflag; + case L'1': case L'2': case L'3': case L'4': + case L'5': case L'6': case L'7': case L'8': case L'9': + n = 0; + do { + n = 10 * n + to_digit (ch); + ch = *fmt++; + } while (is_digit (ch)); +#ifndef _NO_POS_ARGS + if (ch == L'$') { + if (n <= MAX_POS_ARGS) { + N = n - 1; + is_pos_arg = 1; + goto rflag; + } + else + goto error; + } +#endif /* !_NO_POS_ARGS */ + width = n; + goto reswitch; +#ifdef FLOATING_POINT + case L'L': + flags |= LONGDBL; + goto rflag; +#endif + case L'h': +#ifdef _WANT_IO_C99_FORMATS + if (*fmt == L'h') { + fmt++; + flags |= CHARINT; + } else +#endif + flags |= SHORTINT; + goto rflag; + case L'l': +#if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG + if (*fmt == L'l') { + fmt++; + flags |= QUADINT; + } else +#endif + flags |= LONGINT; + goto rflag; + case L'q': /* GNU extension */ + flags |= QUADINT; + goto rflag; +#ifdef _WANT_IO_C99_FORMATS + case L'j': + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONGINT; + else + flags |= QUADINT; + goto rflag; + case L'z': + if (sizeof (size_t) < sizeof (int)) + /* POSIX states size_t is 16 or more bits, as is short. */ + flags |= SHORTINT; + else if (sizeof (size_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= QUADINT; + goto rflag; + case L't': + if (sizeof (ptrdiff_t) < sizeof (int)) + /* POSIX states ptrdiff_t is 16 or more bits, as + is short. */ + flags |= SHORTINT; + else if (sizeof (ptrdiff_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= QUADINT; + goto rflag; + case L'C': /* POSIX extension */ +#endif /* _WANT_IO_C99_FORMATS */ + case L'c': + cp = buf; + if (ch == L'c' && !(flags & LONGINT)) { + wint_t wc = btowc ((int) GET_ARG (N, ap, int)); + if (wc == WEOF) { + fp->_flags |= __SERR; + goto error; + } + cp[0] = (wchar_t) wc; + } + else + { + cp[0] = GET_ARG (N, ap, int); + } + cp[1] = L'\0'; + size = 1; + sign = L'\0'; + break; + case L'd': + case L'i': + _uquad = SARG (); +#ifndef _NO_LONGLONG + if ((quad_t)_uquad < 0) +#else + if ((long) _uquad < 0) +#endif + { + + _uquad = -_uquad; + sign = L'-'; + } + base = DEC; + goto number; +#ifdef FLOATING_POINT +# ifdef _WANT_IO_C99_FORMATS + case L'a': + case L'A': + case L'F': +# endif + case L'e': + case L'E': + case L'f': + case L'g': + case L'G': +# ifdef _NO_LONGDBL + if (flags & LONGDBL) { + _fpvalue = (double) GET_ARG (N, ap, _LONG_DOUBLE); + } else { + _fpvalue = GET_ARG (N, ap, double); + } + + /* do this before tricky precision changes + + If the output is infinite or NaN, leading + zeros are not permitted. Otherwise, scanf + could not read what printf wrote. + */ + if (isinf (_fpvalue)) { + if (_fpvalue < 0) + sign = '-'; + if (ch <= L'G') /* 'A', 'E', 'F', or 'G' */ + cp = L"INF"; + else + cp = L"inf"; + size = 3; + flags &= ~ZEROPAD; + break; + } + if (isnan (_fpvalue)) { + if (signbit (_fpvalue)) + sign = L'-'; + if (ch <= L'G') /* 'A', 'E', 'F', or 'G' */ + cp = L"NAN"; + else + cp = L"nan"; + size = 3; + flags &= ~ZEROPAD; + break; + } + +# else /* !_NO_LONGDBL */ + + if (flags & LONGDBL) { + _fpvalue = GET_ARG (N, ap, _LONG_DOUBLE); + } else { + _fpvalue = (_LONG_DOUBLE)GET_ARG (N, ap, double); + } + + /* do this before tricky precision changes */ + expt = _ldcheck (&_fpvalue); + if (expt == 2) { + if (_fpvalue < 0) + sign = L'-'; + if (ch <= L'G') /* 'A', 'E', 'F', or 'G' */ + cp = L"INF"; + else + cp = L"inf"; + size = 3; + flags &= ~ZEROPAD; + break; + } + if (expt == 1) { + if (signbit (_fpvalue)) + sign = L'-'; + if (ch <= L'G') /* 'A', 'E', 'F', or 'G' */ + cp = L"NAN"; + else + cp = L"nan"; + size = 3; + flags &= ~ZEROPAD; + break; + } +# endif /* !_NO_LONGDBL */ + + cp = buf; +# ifdef _WANT_IO_C99_FORMATS + if (ch == L'a' || ch == L'A') { + ox[0] = L'0'; + ox[1] = ch == L'a' ? L'x' : L'X'; + flags |= HEXPREFIX; + if (prec >= BUF) + { + if ((malloc_buf = + (wchar_t *)_malloc_r (data, (prec + 1) * sizeof (wchar_t))) + == NULL) + { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; + } + } else +# endif /* _WANT_IO_C99_FORMATS */ + if (prec == -1) { + prec = DEFPREC; + } else if ((ch == L'g' || ch == L'G') && prec == 0) { + prec = 1; + } + + flags |= FPT; + + cp = wcvt (data, _fpvalue, prec, flags, &softsign, + &expt, ch, &ndig, cp, BUF); + + /* If buf is not large enough for the converted wchar_t + sequence, call wcvt again with a malloced new buffer. + This should happen fairly rarely. + */ + if (cp == buf && ndig > BUF && malloc_buf == NULL) { + if ((malloc_buf = + (wchar_t *)_malloc_r (data, ndig * sizeof (wchar_t))) + == NULL) + { + fp->_flags |= __SERR; + goto error; + } + cp = wcvt (data, _fpvalue, prec, flags, &softsign, + &expt, ch, &ndig, malloc_buf, ndig); + } + + if (ch == L'g' || ch == L'G') { + if (expt <= -4 || expt > prec) + ch -= 2; /* 'e' or 'E' */ + else + ch = L'g'; + } +# ifdef _WANT_IO_C99_FORMATS + else if (ch == L'F') + ch = L'f'; +# endif + if (ch <= L'e') { /* 'a', 'A', 'e', or 'E' fmt */ + --expt; + expsize = wexponent (expstr, expt, ch); + size = expsize + ndig; + if (ndig > 1 || flags & ALT) + ++size; +# ifdef _WANT_IO_C99_FORMATS + flags &= ~GROUPING; +# endif + } else { + if (ch == L'f') { /* f fmt */ + if (expt > 0) { + size = expt; + if (prec || flags & ALT) + size += prec + 1; + } else /* "0.X" */ + size = (prec || flags & ALT) + ? prec + 2 + : 1; + } else if (expt >= ndig) { /* fixed g fmt */ + size = expt; + if (flags & ALT) + ++size; + } else + size = ndig + (expt > 0 ? + 1 : 2 - expt); +# ifdef _WANT_IO_C99_FORMATS + if ((flags & GROUPING) && expt > 0) { + /* space for thousands' grouping */ + nseps = nrepeats = 0; + lead = expt; + while (*grouping != CHAR_MAX) { + if (lead <= *grouping) + break; + lead -= *grouping; + if (grouping[1]) { + nseps++; + grouping++; + } else + nrepeats++; + } + size += nseps + nrepeats; + } else +# endif + lead = expt; + } + if (softsign) + sign = L'-'; + break; +#endif /* FLOATING_POINT */ +#ifdef _GLIBC_EXTENSION + case L'm': /* GNU extension */ + { + int dummy; + cp = (wchar_t *) _strerror_r (data, _REENT_ERRNO(data), 1, &dummy); + } + flags &= ~LONGINT; + goto string; +#endif + case L'n': +#ifndef _NO_LONGLONG + if (flags & QUADINT) + *GET_ARG (N, ap, quad_ptr_t) = ret; + else +#endif + if (flags & LONGINT) + *GET_ARG (N, ap, long_ptr_t) = ret; + else if (flags & SHORTINT) + *GET_ARG (N, ap, short_ptr_t) = ret; +#ifdef _WANT_IO_C99_FORMATS + else if (flags & CHARINT) + *GET_ARG (N, ap, char_ptr_t) = ret; +#endif + else + *GET_ARG (N, ap, int_ptr_t) = ret; + continue; /* no output */ + case L'o': + _uquad = UARG (); + base = OCT; +#ifdef _WANT_IO_C99_FORMATS + flags &= ~GROUPING; +#endif + goto nosign; + case L'p': + /* + * ``The argument shall be a pointer to void. The + * value of the pointer is converted to a sequence + * of printable characters, in an implementation- + * defined manner.'' + * -- ANSI X3J11 + */ + /* NOSTRICT */ + _uquad = (uintptr_t) GET_ARG (N, ap, void_ptr_t); + base = HEX; + xdigs = L"0123456789abcdef"; + flags |= HEXPREFIX; + ox[0] = L'0'; + ox[1] = ch = L'x'; + goto nosign; + case L's': +#ifdef _WANT_IO_C99_FORMATS + case L'S': /* POSIX extension */ +#endif + cp = GET_ARG (N, ap, wchar_ptr_t); +#ifdef _GLIBC_EXTENSION +string: +#endif + sign = '\0'; +#ifndef __OPTIMIZE_SIZE__ + /* Behavior is undefined if the user passed a + NULL string when precision is not 0. + However, if we are not optimizing for size, + we might as well mirror glibc behavior. */ + if (cp == NULL) { + cp = L"(null)"; + size = ((unsigned) prec > 6U) ? 6 : prec; + } + else +#endif /* __OPTIMIZE_SIZE__ */ +#ifdef _MB_CAPABLE + if (ch != L'S' && !(flags & LONGINT)) { + char *arg = (char *) cp; + size_t insize = 0, nchars = 0, nconv = 0; + mbstate_t ps; + wchar_t *p; + + if (prec >= 0) { + char *p = arg; + memset ((void *)&ps, '\0', sizeof (mbstate_t)); + while (nchars < (size_t)prec) { + nconv = mbrlen (p, MB_CUR_MAX, &ps); + if (nconv == 0 || nconv == (size_t)-1 || + nconv == (size_t)-2) + break; + p += nconv; + ++nchars; + insize += nconv; + } + if (nconv == (size_t) -1 || nconv == (size_t) -2) { + fp->_flags |= __SERR; + goto error; + } + } else + insize = strlen(arg); + if (insize >= BUF) { + if ((malloc_buf = (wchar_t *) _malloc_r (data, (insize + 1) * sizeof (wchar_t))) + == NULL) { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; + } else + cp = buf; + memset ((void *)&ps, '\0', sizeof (mbstate_t)); + p = cp; + while (insize != 0) { + nconv = _mbrtowc_r (data, p, arg, insize, &ps); + if (nconv == 0 || nconv == (size_t)-1 || nconv == (size_t)-2) + break; + ++p; + arg += nconv; + insize -= nconv; + } + if (nconv == (size_t) -1 || nconv == (size_t) -2) { + fp->_flags |= __SERR; + goto error; + } + *p = L'\0'; + size = p - cp; + } +#else + if (ch != L'S' && !(flags & LONGINT)) { + char *arg = (char *) cp; + size_t insize = 0; + + if (prec >= 0) { + char *p = memchr (arg, '\0', prec); + insize = p ? p - arg : prec; + } else + insize = strlen (arg); + if (insize >= BUF) { + if ((malloc_buf = (wchar_t *) _malloc_r (data, (insize + 1) * sizeof (wchar_t))) + == NULL) { + fp->_flags |= __SERR; + goto error; + } + cp = malloc_buf; + } else + cp = buf; + for (size = 0; size < insize; ++size) + cp[size] = arg[size]; + cp[size] = L'\0'; + } +#endif /* _MB_CAPABLE */ + else if (prec >= 0) { + /* + * can't use wcslen; can only look for the + * NUL in the first `prec' characters, and + * strlen () will go further. + */ + wchar_t *p = wmemchr (cp, L'\0', prec); + + if (p != NULL) { + size = p - cp; + if (size > prec) + size = prec; + } else + size = prec; + } else + size = wcslen (cp); + + break; + case L'u': + _uquad = UARG (); + base = DEC; + goto nosign; + case L'X': + xdigs = L"0123456789ABCDEF"; + goto hex; + case L'x': + xdigs = L"0123456789abcdef"; +hex: _uquad = UARG (); + base = HEX; + /* leading 0x/X only if non-zero */ + if (flags & ALT && _uquad != 0) { + ox[0] = L'0'; + ox[1] = ch; + flags |= HEXPREFIX; + } + +#ifdef _WANT_IO_C99_FORMATS + flags &= ~GROUPING; +#endif + /* unsigned conversions */ +nosign: sign = L'\0'; + /* + * ``... diouXx conversions ... if a precision is + * specified, the 0 flag will be ignored.'' + * -- ANSI X3J11 + */ +number: if ((dprec = prec) >= 0) + flags &= ~ZEROPAD; + + /* + * ``The result of converting a zero value with an + * explicit precision of zero is no characters.'' + * -- ANSI X3J11 + */ + cp = buf + BUF; + if (_uquad != 0 || prec != 0) { + /* + * Unsigned mod is hard, and unsigned mod + * by a constant is easier than that by + * a variable; hence this switch. + */ + switch (base) { + case OCT: + do { + *--cp = to_char (_uquad & 7); + _uquad >>= 3; + } while (_uquad); + /* handle octal leading 0 */ + if (flags & ALT && *cp != L'0') + *--cp = L'0'; + break; + + case DEC: + /* many numbers are 1 digit */ + if (_uquad < 10) { + *--cp = to_char(_uquad); + break; + } +#ifdef _WANT_IO_C99_FORMATS + ndig = 0; +#endif + do { + *--cp = to_char (_uquad % 10); +#ifdef _WANT_IO_C99_FORMATS + ndig++; + /* If (*grouping == CHAR_MAX) then no + more grouping */ + if ((flags & GROUPING) + && ndig == *grouping + && *grouping != CHAR_MAX + && _uquad > 9) { + *--cp = thousands_sep; + ndig = 0; + /* If (grouping[1] == '\0') then we + have to use *grouping character + (last grouping rule) for all + next cases. */ + if (grouping[1] != '\0') + grouping++; + } +#endif + _uquad /= 10; + } while (_uquad != 0); + break; + + case HEX: + do { + *--cp = xdigs[_uquad & 15]; + _uquad >>= 4; + } while (_uquad); + break; + + default: + cp = L"bug in vfprintf: bad base"; + size = wcslen (cp); + goto skipsize; + } + } + /* + * ...result is to be converted to an 'alternate form'. + * For o conversion, it increases the precision to force + * the first digit of the result to be a zero." + * -- ANSI X3J11 + * + * To demonstrate this case, compile and run: + * printf ("%#.0o",0); + */ + else if (base == OCT && (flags & ALT)) + *--cp = L'0'; + + size = buf + BUF - cp; + skipsize: + break; + default: /* "%?" prints ?, unless ? is NUL */ + if (ch == L'\0') + goto done; + /* pretend it was %c with argument ch */ + cp = buf; + *cp = ch; + size = 1; + sign = L'\0'; + break; + } + + /* + * All reasonable formats wind up here. At this point, `cp' + * points to a string which (if not flags&LADJUST) should be + * padded out to `width' places. If flags&ZEROPAD, it should + * first be prefixed by any sign or other prefix; otherwise, + * it should be blank padded before the prefix is emitted. + * After any left-hand padding and prefixing, emit zeroes + * required by a decimal [diouxX] precision, then print the + * string proper, then emit zeroes required by any leftover + * floating precision; finally, if LADJUST, pad with blanks. + * If flags&FPT, ch must be in [aAeEfg]. + * + * Compute actual size, so we know how much to pad. + * size excludes decimal prec; realsz includes it. + */ + realsz = dprec > size ? dprec : size; + if (sign) + realsz++; + if (flags & HEXPREFIX) + realsz+= 2; + + /* right-adjusting blank padding */ + if ((flags & (LADJUST|ZEROPAD)) == 0) + PAD (width - realsz, blanks); + + /* prefix */ + if (sign) + PRINT (&sign, 1); + if (flags & HEXPREFIX) + PRINT (ox, 2); + + /* right-adjusting zero padding */ + if ((flags & (LADJUST|ZEROPAD)) == ZEROPAD) + PAD (width - realsz, zeroes); + + /* leading zeroes from decimal precision */ + PAD (dprec - size, zeroes); + + /* the string or number proper */ +#ifdef FLOATING_POINT + if ((flags & FPT) == 0) { + PRINT (cp, size); + } else { /* glue together f_p fragments */ + if (ch >= L'f') { /* 'f' or 'g' */ + if (_fpvalue == 0) { + /* kludge for __dtoa irregularity */ + PRINT (L"0", 1); + if (expt < ndig || flags & ALT) { + PRINT (&decimal_point, 1); + PAD (ndig - 1, zeroes); + } + } else if (expt <= 0) { + PRINT (L"0", 1); + if (expt || ndig || flags & ALT) { + PRINT (&decimal_point, 1); + PAD (-expt, zeroes); + PRINT (cp, ndig); + } + } else { + wchar_t *convbuf = cp; + PRINTANDPAD(cp, convbuf + ndig, + lead, zeroes); + cp += lead; +#ifdef _WANT_IO_C99_FORMATS + if (flags & GROUPING) { + while (nseps > 0 || nrepeats > 0) { + if (nrepeats > 0) + nrepeats--; + else { + grouping--; + nseps--; + } + PRINT (&thousands_sep, 1); + PRINTANDPAD (cp, convbuf + ndig, + *grouping, zeroes); + cp += *grouping; + } + if (cp > convbuf + ndig) + cp = convbuf + ndig; + } +#endif + if (expt < ndig || flags & ALT) + PRINT (&decimal_point, 1); + PRINTANDPAD (cp, convbuf + ndig, + ndig - expt, zeroes); + } + + } else { /* 'a', 'A', 'e', or 'E' */ + if (ndig > 1 || flags & ALT) { + PRINT (cp, 1); + cp++; + PRINT (&decimal_point, 1); + if (_fpvalue) { + PRINT (cp, ndig - 1); + } else /* 0.[0..] */ + /* __dtoa irregularity */ + PAD (ndig - 1, zeroes); + } else /* XeYYY */ + PRINT (cp, 1); + PRINT (expstr, expsize); + } + } +#else /* !FLOATING_POINT */ + PRINT (cp, size); +#endif + /* left-adjusting padding (always blank) */ + if (flags & LADJUST) + PAD (width - realsz, blanks); + + /* finally, adjust ret */ + ret += width > realsz ? width : realsz; + + FLUSH (); /* copy out the I/O vectors */ + + if (malloc_buf != NULL) { + _free_r (data, malloc_buf); + malloc_buf = NULL; + } + } +done: + FLUSH (); +error: + if (malloc_buf != NULL) + _free_r (data, malloc_buf); +#ifndef STRING_ONLY + _newlib_flockfile_end (fp); +#endif + return (__sferror (fp) ? EOF : ret); + /* NOTREACHED */ +} + +#ifdef FLOATING_POINT + +/* Using reentrant DATA, convert finite VALUE into a string of digits + with no decimal point, using NDIGITS precision and FLAGS as guides + to whether trailing zeros must be included. Set *SIGN to nonzero + if VALUE was negative. Set *DECPT to the exponent plus one. Set + *LENGTH to the length of the returned string. CH must be one of + [aAeEfFgG]; different from vfprintf.c:cvt(), the return string + lives in BUF regardless of CH. LEN is the length of BUF, except + when CH is [aA], in which case LEN is not in use. If BUF is not + large enough for the converted string, only the first LEN number + of characters will be returned in BUF, but *LENGTH will be set to + the full length of the string before the truncation. */ +static wchar_t * +wcvt(struct _reent *data, _PRINTF_FLOAT_TYPE value, int ndigits, int flags, + wchar_t *sign, int *decpt, int ch, int *length, wchar_t *buf, int len) +{ + int mode, dsgn; +# ifdef _NO_LONGDBL + union double_union tmp; + + tmp.d = value; + if (word0 (tmp) & Sign_bit) { /* this will check for < 0 and -0.0 */ + value = -value; + *sign = L'-'; + } else + *sign = L'\0'; +# else /* !_NO_LONGDBL */ + union + { + struct ldieee ieee; + _LONG_DOUBLE val; + } ld; + + ld.val = value; + if (ld.ieee.sign) { /* this will check for < 0 and -0.0 */ + value = -value; + *sign = L'-'; + } else + *sign = L'\0'; +# endif /* !_NO_LONGDBL */ + +# ifdef _WANT_IO_C99_FORMATS + if (ch == L'a' || ch == L'A') { + wchar_t *digits, *bp, *rve; + /* This code assumes FLT_RADIX is a power of 2. The initial + division ensures the digit before the decimal will be less + than FLT_RADIX (unless it is rounded later). There is no + loss of precision in these calculations. */ + value = FREXP (value, decpt) / 8; + if (!value) + *decpt = 1; + digits = ch == L'a' ? L"0123456789abcdef" : L"0123456789ABCDEF"; + bp = buf; + do { + value *= 16; + mode = (int) value; + value -= mode; + *bp++ = digits[mode]; + } while (ndigits-- && value); + if (value > 0.5 || (value == 0.5 && mode & 1)) { + /* round to even */ + rve = bp; + while (*--rve == digits[0xf]) { + *rve = L'0'; + } + *rve = *rve == L'9' ? digits[0xa] : *rve + 1; + } else { + while (ndigits-- >= 0) { + *bp++ = L'0'; + } + } + *length = bp - buf; + return buf; + } +# endif /* _WANT_IO_C99_FORMATS */ + if (ch == L'f' || ch == L'F') { + mode = 3; /* ndigits after the decimal point */ + } else { + /* To obtain ndigits after the decimal point for the 'e' + * and 'E' formats, round to ndigits + 1 significant + * figures. + */ + if (ch == L'e' || ch == L'E') { + ndigits++; + } + mode = 2; /* ndigits significant digits */ + } + + { + char *digits, *bp, *rve; +#ifndef _MB_CAPABLE + int i; +#endif + + digits = _DTOA_R (data, value, mode, ndigits, decpt, &dsgn, &rve); + + if ((ch != L'g' && ch != L'G') || flags & ALT) { /* Print trailing zeros */ + bp = digits + ndigits; + if (ch == L'f' || ch == L'F') { + if (*digits == L'0' && value) + *decpt = -ndigits + 1; + bp += *decpt; + } + if (value == 0) /* kludge for __dtoa irregularity */ + rve = bp; + while (rve < bp) + *rve++ = '0'; + } + + *length = rve - digits; /* full length of the string */ +#ifdef _MB_CAPABLE + _mbsnrtowcs_r (data, buf, (const char **) &digits, *length, + len, NULL); +#else + for (i = 0; i < *length && i < len; ++i) + buf[i] = (wchar_t) digits[i]; +#endif + return buf; + } +} + +static int +wexponent(wchar_t *p0, int exp, int fmtch) +{ + register wchar_t *p, *t; + wchar_t expbuf[MAXEXPLEN]; +# ifdef _WANT_IO_C99_FORMATS + int isa = fmtch == L'a' || fmtch == L'A'; +# else +# define isa 0 +# endif + + p = p0; + *p++ = isa ? L'p' - L'a' + fmtch : fmtch; + if (exp < 0) { + exp = -exp; + *p++ = L'-'; + } + else + *p++ = L'+'; + t = expbuf + MAXEXPLEN; + if (exp > 9) { + do { + *--t = to_char (exp % 10); + } while ((exp /= 10) > 9); + *--t = to_char (exp); + for (; t < expbuf + MAXEXPLEN; *p++ = *t++); + } + else { + if (!isa) + *p++ = L'0'; + *p++ = to_char (exp); + } + return (p - p0); +} +#endif /* FLOATING_POINT */ + + +#ifndef _NO_POS_ARGS + +/* Positional argument support. + Written by Jeff Johnston + + Copyright (c) 2002 Red Hat Incorporated. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + The name of Red Hat Incorporated may not be used to endorse + or promote products derived from this software without specific + prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* function to get positional parameter N where n = N - 1 */ +static union arg_val * +get_arg (struct _reent *data, + int n, + wchar_t *fmt, + va_list *ap, + int *numargs_p, + union arg_val *args, + int *arg_type, + wchar_t **last_fmt) +{ + wchar_t ch; + int number, flags; + int spec_type; + int numargs = *numargs_p; + __CH_CLASS chtype; + __STATE state, next_state; + __ACTION action; + int pos, last_arg; + int max_pos_arg = n; + /* Only need types that can be reached via vararg promotions. */ + enum types { INT, LONG_INT, QUAD_INT, CHAR_PTR, DOUBLE, LONG_DOUBLE, WIDE_CHAR }; + + /* if this isn't the first call, pick up where we left off last time */ + if (*last_fmt != NULL) + fmt = *last_fmt; + + /* we need to process either to end of fmt string or until we have actually + read the desired parameter from the vararg list. */ + while (*fmt && n >= numargs) + { + while (*fmt != L'\0' && *fmt != L'%') + fmt += 1; + + if (*fmt == L'\0') + break; + state = START; + flags = 0; + pos = -1; + number = 0; + spec_type = INT; + + /* Use state/action table to process format specifiers. We ignore invalid + formats and we are only interested in information that tells us how to + read the vararg list. */ + while (state != DONE) + { + ch = *fmt++; + chtype = ch < (wchar_t) 256 ? __chclass[ch] : OTHER; + next_state = __state_table[state][chtype]; + action = __action_table[state][chtype]; + state = next_state; + + switch (action) + { + case GETMOD: /* we have format modifier */ + switch (ch) + { + case L'h': + /* No flag needed, since short and char promote to int. */ + break; + case L'L': + flags |= LONGDBL; + break; + case L'q': + flags |= QUADINT; + break; +# ifdef _WANT_IO_C99_FORMATS + case L'j': + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONGINT; + else + flags |= QUADINT; + break; + case L'z': + if (sizeof (size_t) <= sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= QUADINT; + break; + case L't': + if (sizeof (ptrdiff_t) <= sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONGINT; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= QUADINT; + break; +# endif /* _WANT_IO_C99_FORMATS */ + case L'l': + default: +# if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG + if (*fmt == L'l') + { + flags |= QUADINT; + ++fmt; + } + else +# endif + flags |= LONGINT; + break; + } + break; + case GETARG: /* we have format specifier */ + { + numargs &= (MAX_POS_ARGS - 1); + /* process the specifier and translate it to a type to fetch from varargs */ + switch (ch) + { + case L'd': + case L'i': + case L'o': + case L'x': + case L'X': + case L'u': + if (flags & LONGINT) + spec_type = LONG_INT; +# ifndef _NO_LONGLONG + else if (flags & QUADINT) + spec_type = QUAD_INT; +# endif + else + spec_type = INT; + break; +# ifdef _WANT_IO_C99_FORMATS + case L'a': + case L'A': + case L'F': +# endif + case L'f': + case L'g': + case L'G': + case L'E': + case L'e': +# ifndef _NO_LONGDBL + if (flags & LONGDBL) + spec_type = LONG_DOUBLE; + else +# endif + spec_type = DOUBLE; + break; + case L's': +# ifdef _WANT_IO_C99_FORMATS + case L'S': /* POSIX extension */ +# endif + case L'p': + case L'n': + spec_type = CHAR_PTR; + break; + case L'c': +# ifdef _WANT_IO_C99_FORMATS + if (flags & LONGINT) + spec_type = WIDE_CHAR; + else +# endif + spec_type = INT; + break; +# ifdef _WANT_IO_C99_FORMATS + case L'C': /* POSIX extension */ + spec_type = WIDE_CHAR; + break; +# endif + } + + /* if we have a positional parameter, just store the type, otherwise + fetch the parameter from the vararg list */ + if (pos != -1) + arg_type[pos] = spec_type; + else + { + switch (spec_type) + { + case LONG_INT: + args[numargs++].val_long = va_arg (*ap, long); + break; + case QUAD_INT: + args[numargs++].val_quad_t = va_arg (*ap, quad_t); + break; + case WIDE_CHAR: + args[numargs++].val_wint_t = va_arg (*ap, wint_t); + break; + case INT: + args[numargs++].val_int = va_arg (*ap, int); + break; + case CHAR_PTR: + args[numargs++].val_wchar_ptr_t = va_arg (*ap, wchar_t *); + break; + case DOUBLE: + args[numargs++].val_double = va_arg (*ap, double); + break; + case LONG_DOUBLE: + args[numargs++].val__LONG_DOUBLE = va_arg (*ap, _LONG_DOUBLE); + break; + } + } + } + break; + case GETPOS: /* we have positional specifier */ + if (arg_type[0] == -1) + memset (arg_type, 0, sizeof (int) * MAX_POS_ARGS); + pos = number - 1; + max_pos_arg = (max_pos_arg > pos ? max_pos_arg : pos); + break; + case PWPOS: /* we have positional specifier for width or precision */ + if (arg_type[0] == -1) + memset (arg_type, 0, sizeof (int) * MAX_POS_ARGS); + number -= 1; + arg_type[number] = INT; + max_pos_arg = (max_pos_arg > number ? max_pos_arg : number); + break; + case GETPWB: /* we require format pushback */ + --fmt; + /* fallthrough */ + case GETPW: /* we have a variable precision or width to acquire */ + args[numargs++].val_int = va_arg (*ap, int); + break; + case NUMBER: /* we have a number to process */ + number = (ch - '0'); + while ((ch = *fmt) != '\0' && is_digit (ch)) + { + number = number * 10 + (ch - '0'); + ++fmt; + } + break; + case SKIPNUM: /* we have a number to skip */ + while ((ch = *fmt) != '\0' && is_digit (ch)) + ++fmt; + break; + case NOOP: + default: + break; /* do nothing */ + } + } + } + + /* process all arguments up to at least the one we are looking for and if we + have seen the end of the string, then process up to the max argument needed */ + if (*fmt == '\0') + last_arg = max_pos_arg; + else + last_arg = n; + + while (numargs <= last_arg) + { + switch (arg_type[numargs]) + { + case LONG_INT: + args[numargs++].val_long = va_arg (*ap, long); + break; + case QUAD_INT: + args[numargs++].val_quad_t = va_arg (*ap, quad_t); + break; + case CHAR_PTR: + args[numargs++].val_wchar_ptr_t = va_arg (*ap, wchar_t *); + break; + case DOUBLE: + args[numargs++].val_double = va_arg (*ap, double); + break; + case LONG_DOUBLE: + args[numargs++].val__LONG_DOUBLE = va_arg (*ap, _LONG_DOUBLE); + break; + case WIDE_CHAR: + args[numargs++].val_wint_t = va_arg (*ap, wint_t); + break; + case INT: + default: + args[numargs++].val_int = va_arg (*ap, int); + break; + } + } + + /* alter the global numargs value and keep a reference to the last bit of the fmt + string we processed here because the caller will continue processing where we started */ + *numargs_p = numargs; + *last_fmt = fmt; + return &args[n]; +} +#endif /* !_NO_POS_ARGS */ diff --git a/lib/stdio/vfwscanf.c b/lib/stdio/vfwscanf.c new file mode 100644 index 0000000..df966f9 --- /dev/null +++ b/lib/stdio/vfwscanf.c @@ -0,0 +1,1646 @@ +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---scan and format argument list from wide character input + +INDEX + vfwscanf +INDEX + _vfwscanf +INDEX + vwscanf +INDEX + _vwscanf +INDEX + vswscanf +INDEX + _vswscanf + +SYNOPSIS + #include + #include + int vwscanf(const wchar_t *__restrict <[fmt]>, va_list <[list]>); + int vfwscanf(FILE *__restrict <[fp]>, + const wchar_t *__restrict <[fmt]>, va_list <[list]>); + int vswscanf(const wchar_t *__restrict <[str]>, + const wchar_t *__restrict <[fmt]>, va_list <[list]>); + + int _vwscanf(struct _reent *<[reent]>, const wchar_t *<[fmt]>, + va_list <[list]>); + int _vfwscanf(struct _reent *<[reent]>, FILE *<[fp]>, + const wchar_t *<[fmt]>, va_list <[list]>); + int _vswscanf(struct _reent *<[reent]>, const wchar_t *<[str]>, + const wchar_t *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, and <> are (respectively) variants +of <>, <>, and <>. They differ only in +allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than +directly accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of input fields successfully scanned, +converted, and stored; the return value does not include scanned +fields which were not stored. + +If <> attempts to read at end-of-file, the return value +is <>. + +If no fields were stored, the return value is <<0>>. + +The routines <<_vwscanf>>, <<_vfwscanf>>, and <<_vswscanf>> are +reentrant versions which take an additional first parameter which points +to the reentrancy structure. + +PORTABILITY +C99, POSIX-1.2008 +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +#ifdef INTEGER_ONLY +#define VFWSCANF vfiwscanf +#define _VFWSCANF_R _vfiwscanf_r +#define __SVFWSCANF __svfiwscanf +#ifdef STRING_ONLY +# define __SVFWSCANF_R __ssvfiwscanf_r +#else +# define __SVFWSCANF_R __svfiwscanf_r +#endif +#else +#define VFWSCANF vfwscanf +#define _VFWSCANF_R _vfwscanf_r +#define __SVFWSCANF __svfwscanf +#ifdef STRING_ONLY +# define __SVFWSCANF_R __ssvfwscanf_r +#else +# define __SVFWSCANF_R __svfwscanf_r +#endif +#ifndef NO_FLOATING_POINT +#define FLOATING_POINT +#endif +#endif + +#ifdef STRING_ONLY +#undef _newlib_flockfile_start +#undef _newlib_flockfile_exit +#undef _newlib_flockfile_end +#define _newlib_flockfile_start(x) {} +#define _newlib_flockfile_exit(x) {} +#define _newlib_flockfile_end(x) {} +#define _ungetwc_r _sungetwc_r +#define __srefill_r __ssrefill_r +#define _fgetwc_r _sfgetwc_r +#endif + +#ifdef FLOATING_POINT +#include +#include +#include +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ +#include "../locale/setlocale.h" +#endif + +/* Currently a test is made to see if long double processing is warranted. + This could be changed in the future should the _ldtoa_r code be + preferred over _dtoa_r. */ +#define _NO_LONGDBL +#if defined _WANT_IO_LONG_DOUBLE && (LDBL_MANT_DIG > DBL_MANT_DIG) +#undef _NO_LONGDBL +extern _LONG_DOUBLE _wcstold_r (wchar_t *s, wchar_t **sptr); +#endif + +#include "floatio.h" + +#if ((MAXEXP+MAXFRACT+3) > MB_LEN_MAX) +# define BUF (MAXEXP+MAXFRACT+3) /* 3 = sign + decimal point + NUL */ +#else +# define BUF MB_LEN_MAX +#endif + +/* An upper bound for how long a long prints in decimal. 4 / 13 approximates + log (2). Add one char for roundoff compensation and one for the sign. */ +#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long) - 1) * 4 / 13 + 2) +#else +#define BUF 40 +#endif + +#define _NO_LONGLONG +#if defined _WANT_IO_LONG_LONG \ + && (defined __GNUC__ || __STDC_VERSION__ >= 199901L) +# undef _NO_LONGLONG +#endif + +#define _NO_POS_ARGS +#ifdef _WANT_IO_POS_ARGS +# undef _NO_POS_ARGS +# ifdef NL_ARGMAX +# define MAX_POS_ARGS NL_ARGMAX +# else +# define MAX_POS_ARGS 32 +# endif + +static void * get_arg (int, va_list *, int *, void **); +#endif /* _WANT_IO_POS_ARGS */ + +/* + * Flags used during conversion. + */ + +#define LONG 0x01 /* l: long or double */ +#define LONGDBL 0x02 /* L/ll: long double or long long */ +#define SHORT 0x04 /* h: short */ +#define CHAR 0x08 /* hh: 8 bit integer */ +#define SUPPRESS 0x10 /* suppress assignment */ +#define POINTER 0x20 /* weird %p pointer (`fake hex') */ +#define NOSKIP 0x40 /* do not skip blanks */ +#define MALLOC 0x80 /* handle 'm' modifier */ + +/* + * The following are used in numeric conversions only: + * SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point; + * SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral. + */ + +#define SIGNOK 0x80 /* +/- is (still) legal */ +#define NDIGITS 0x100 /* no digits detected */ + +#define DPTOK 0x200 /* (float) decimal point is still legal */ +#define EXPOK 0x400 /* (float) exponent (e+3, etc) still legal */ + +#define PFXOK 0x200 /* 0x prefix is (still) legal */ +#define NZDIGITS 0x400 /* no zero digits detected */ +#define HAVESIGN 0x10000 /* sign detected */ + +/* + * Conversion types. + */ + +#define CT_CHAR 0 /* %c conversion */ +#define CT_CCL 1 /* %[...] conversion */ +#define CT_STRING 2 /* %s conversion */ +#define CT_INT 3 /* integer, i.e., wcstol or wcstoul */ +#define CT_FLOAT 4 /* floating, i.e., wcstod */ + +#define INCCL(_c) \ + (cclcompl ? (wmemchr(ccls, (_c), ccle - ccls) == NULL) : \ + (wmemchr(ccls, (_c), ccle - ccls) != NULL)) + +/* + * vfwscanf + */ + +#ifndef STRING_ONLY + +#ifndef _REENT_ONLY + +int +VFWSCANF (register FILE *__restrict fp, + const wchar_t *__restrict fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + CHECK_INIT(reent, fp); + return __SVFWSCANF_R (reent, fp, fmt, ap); +} + +int +__SVFWSCANF (register FILE *fp, + wchar_t const *fmt0, + va_list ap) +{ + return __SVFWSCANF_R (_REENT, fp, fmt0, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_VFWSCANF_R (struct _reent *data, + register FILE *fp, + const wchar_t *fmt, + va_list ap) +{ + CHECK_INIT(data, fp); + return __SVFWSCANF_R (data, fp, fmt, ap); +} +#endif /* !STRING_ONLY */ + +#ifdef STRING_ONLY +/* When dealing with the swscanf family, we don't want to use the + * regular ungetwc which will drag in file I/O items we don't need. + * So, we create our own trimmed-down version. */ +static wint_t +_sungetwc_r (struct _reent *data, + wint_t wc, + register FILE *fp) +{ + if (wc == WEOF) + return (WEOF); + + /* After ungetc, we won't be at eof anymore */ + fp->_flags &= ~__SEOF; + + /* All ungetwc usage in scanf un-gets the current character, so + * just back up over the string if we aren't at the start + */ + if (fp->_bf._base != NULL && fp->_p > fp->_bf._base) + { + fp->_p -= sizeof (wchar_t); + fp->_r += sizeof (wchar_t); + } + + return wc; +} + +extern int __ssrefill_r (struct _reent *ptr, register FILE * fp); + +static size_t +_sfgetwc_r (struct _reent * ptr, + FILE * fp) +{ + wchar_t wc; + + if (fp->_r <= 0 && __ssrefill_r (ptr, fp)) + return (WEOF); + wc = *(wchar_t *) fp->_p; + fp->_p += sizeof (wchar_t); + fp->_r -= sizeof (wchar_t); + return (wc); +} +#endif /* STRING_ONLY */ + +int +__SVFWSCANF_R (struct _reent *rptr, + register FILE *fp, + wchar_t const *fmt0, + va_list ap) +{ + register wchar_t *fmt = (wchar_t *) fmt0; + register wint_t c; /* character from format, or conversion */ + register size_t width; /* field width, or 0 */ + register wchar_t *p = NULL; /* points into all kinds of strings */ + register int n; /* handy integer */ + register int flags; /* flags as defined above */ + register wchar_t *p0; /* saves original value of p when necessary */ + int nassigned; /* number of fields assigned */ + int nread; /* number of characters consumed from fp */ +#ifndef _NO_POS_ARGS + int N; /* arg number */ + int arg_index = 0; /* index into args processed directly */ + int numargs = 0; /* number of varargs read */ + void *args[MAX_POS_ARGS]; /* positional args read */ + int is_pos_arg; /* is current format positional? */ +#endif + int base = 0; /* base argument to wcstol/wcstoul */ + + mbstate_t mbs; /* value to keep track of multibyte state */ + + #define CCFN_PARAMS (struct _reent *, const wchar_t *, wchar_t **, int) + unsigned long (*ccfn)CCFN_PARAMS=0; /* conversion function (wcstol/wcstoul) */ + wchar_t buf[BUF]; /* buffer for numeric conversions */ + const wchar_t *ccls; /* character class start */ + const wchar_t *ccle; /* character class end */ + int cclcompl = 0; /* ccl is complemented? */ + wint_t wi; /* handy wint_t */ + char *mbp = NULL; /* multibyte string pointer for %c %s %[ */ + size_t nconv; /* number of bytes in mb. conversion */ + char mbbuf[MB_LEN_MAX]; /* temporary mb. character buffer */ + + char *cp; + short *sp; + int *ip; +#ifdef FLOATING_POINT + float *flp; + _LONG_DOUBLE *ldp; + double *dp; + wchar_t decpt; +#endif + long *lp; +#ifndef _NO_LONGLONG + long long *llp; +#endif +#ifdef _WANT_IO_C99_FORMATS +#define _WANT_IO_POSIX_EXTENSIONS +#endif +#ifdef _WANT_IO_POSIX_EXTENSIONS + /* POSIX requires that fwscanf frees all allocated strings from 'm' + conversions in case it returns EOF. m_ptr is used to keep track. + It will be allocated on the stack the first time an 'm' conversion + takes place, and it will be free'd on return from the function. + This implementation tries to save space by only allocating 8 + pointer slots at a time. Most scenarios should never have to call + realloc again. This implementation allows only up to 65528 'm' + conversions per fwscanf invocation for now. That should be enough + for almost all scenarios, right? */ + struct m_ptrs { + void ***m_arr; /* Array of pointer args to 'm' conversion */ + uint16_t m_siz; /* Number of slots in m_arr */ + uint16_t m_cnt; /* Number of valid entries in m_arr */ + } *m_ptr = NULL; + #define init_m_ptr() \ + do \ + { \ + if (!m_ptr) \ + { \ + m_ptr = (struct m_ptrs *) alloca (sizeof *m_ptr); \ + m_ptr->m_arr = NULL; \ + m_ptr->m_siz = 0; \ + m_ptr->m_cnt = 0; \ + } \ + } \ + while (0) + #define push_m_ptr(arg) \ + do \ + { \ + if (m_ptr->m_cnt >= m_ptr->m_siz) \ + { \ + void ***n = NULL; \ + \ + if (m_ptr->m_siz + 8 > 0 && m_ptr->m_siz + 8 < UINT16_MAX) \ + n = (void ***) realloc (m_ptr->m_arr, \ + (m_ptr->m_siz + 8) * \ + sizeof (void **)); \ + if (!n) \ + { \ + nassigned = EOF; \ + goto match_failure; \ + } \ + m_ptr->m_arr = n; \ + m_ptr->m_siz += 8; \ + } \ + m_ptr->m_arr[m_ptr->m_cnt++] = (void **) (arg); \ + } \ + while (0) + #define alloc_m_ptr(_type, _p, _p0, _p_p, _w) \ + ({ \ + _p_p = GET_ARG (N, ap, _type **); \ + if (!_p_p) \ + goto match_failure; \ + _p0 = (_type *) malloc ((_w) * sizeof (_type)); \ + if (!_p0) \ + { \ + nassigned = EOF; \ + goto match_failure; \ + } \ + *_p_p = _p0; \ + push_m_ptr (_p_p); \ + _p = _p0; \ + _w; \ + }) + /* For char output, check if there's room for at least MB_CUR_MAX + characters. */ + #define realloc_m_ptr(_type, _p, _p0, _p_p, _w) \ + ({ \ + size_t _nw = (_w); \ + ptrdiff_t _dif = _p - _p0; \ + if (_p_p && \ + ((sizeof (_type) == 1 && _dif >= _nw - MB_CUR_MAX) \ + || _dif >= _nw)) \ + { \ + _p0 = (_type *) realloc (_p0, (_nw << 1) * sizeof (_type)); \ + if (!_p0) \ + { \ + nassigned = EOF; \ + goto match_failure; \ + } \ + _p = _p0 + _dif; \ + *_p_p = _p0; \ + _nw <<= 1; \ + } \ + _nw; \ + }) + #define shrink_m_ptr(_type, _p_p, _w, _cw) \ + ({ \ + size_t _nw = (_w); \ + if (_p_p && _nw < _cw) \ + { \ + _type *_np_p = (_type *) \ + realloc (*_p_p, _nw * sizeof (_type)); \ + if (_np_p) \ + *_p_p = _np_p; \ + } \ + }) + #define free_m_ptr() \ + do \ + { \ + if (m_ptr) \ + { \ + if (nassigned == EOF) \ + { \ + int i; \ + for (i = 0; i < m_ptr->m_cnt; ++i) \ + { \ + free (*m_ptr->m_arr[i]); \ + *m_ptr->m_arr[i] = NULL; \ + } \ + } \ + if (m_ptr->m_arr) \ + free (m_ptr->m_arr); \ + } \ + } \ + while (0) +#endif + + /* `basefix' is used to avoid `if' tests in the integer scanner */ + static const short basefix[17] = + {10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; + + /* Macro to support positional arguments */ +#ifndef _NO_POS_ARGS +# define GET_ARG(n, ap, type) \ + ((type) (is_pos_arg \ + ? (n < numargs \ + ? args[n] \ + : get_arg (n, &ap, &numargs, args)) \ + : (arg_index++ < numargs \ + ? args[n] \ + : (numargs < MAX_POS_ARGS \ + ? args[numargs++] = va_arg (ap, void *) \ + : va_arg (ap, void *))))) +#else +# define GET_ARG(n, ap, type) (va_arg (ap, type)) +#endif + +#ifdef FLOATING_POINT +#ifdef _MB_CAPABLE +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + decpt = *__get_current_numeric_locale ()->wdecimal_point; +#else + { + size_t nconv; + + memset (&mbs, '\0', sizeof (mbs)); + nconv = _mbrtowc_r (rptr, &decpt, + _localeconv_r (rptr)->decimal_point, + MB_CUR_MAX, &mbs); + if (nconv == (size_t) -1 || nconv == (size_t) -2) + decpt = L'.'; + } +#endif /* !__HAVE_LOCALE_INFO_EXTENDED__ */ +#else + decpt = (wchar_t) *_localeconv_r (rptr)->decimal_point; +#endif /* !_MB_CAPABLE */ +#endif /* FLOATING_POINT */ + + _newlib_flockfile_start (fp); + + ORIENT (fp, 1); + + nassigned = 0; + nread = 0; + ccls = ccle = NULL; + for (;;) + { + c = *fmt++; + if (c == L'\0') + goto all_done; + if (iswspace (c)) + { + while ((c = _fgetwc_r (rptr, fp)) != WEOF && iswspace(c)) + ; + if (c != WEOF) + _ungetwc_r (rptr, c, fp); + continue; + } + if (c != L'%') + goto literal; + width = 0; + flags = 0; +#ifndef _NO_POS_ARGS + N = arg_index; + is_pos_arg = 0; +#endif + + /* + * switch on the format. continue if done; break once format + * type is derived. + */ + + again: + c = *fmt++; + + switch (c) + { + case L'%': + literal: + if ((wi = _fgetwc_r (rptr, fp)) == WEOF) + goto input_failure; + if (wi != c) + { + _ungetwc_r (rptr, wi, fp); + goto input_failure; + } + nread++; + continue; + + case L'*': + if ((flags & (CHAR | SHORT | LONG | LONGDBL | SUPPRESS | MALLOC)) + || width) + goto match_failure; + flags |= SUPPRESS; + goto again; + case L'l': + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; +#if defined _WANT_IO_C99_FORMATS || !defined _NO_LONGLONG + if (*fmt == L'l') /* Check for 'll' = long long (SUSv3) */ + { + ++fmt; + flags |= LONGDBL; + } + else +#endif + flags |= LONG; + goto again; + case L'L': + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + flags |= LONGDBL; + goto again; + case L'h': +#ifdef _WANT_IO_C99_FORMATS + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (*fmt == 'h') /* Check for 'hh' = char int (SUSv3) */ + { + ++fmt; + flags |= CHAR; + } + else +#endif + flags |= SHORT; + goto again; +#ifdef _WANT_IO_C99_FORMATS + case L'j': /* intmax_t */ + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (sizeof (intmax_t) == sizeof (long)) + flags |= LONG; + else + flags |= LONGDBL; + goto again; + case L't': /* ptrdiff_t */ + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (sizeof (ptrdiff_t) < sizeof (int)) + /* POSIX states ptrdiff_t is 16 or more bits, as + is short. */ + flags |= SHORT; + else if (sizeof (ptrdiff_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (ptrdiff_t) <= sizeof (long)) + flags |= LONG; + else + /* POSIX states that at least one programming + environment must support ptrdiff_t no wider than + long, but that means other environments can + have ptrdiff_t as wide as long long. */ + flags |= LONGDBL; + goto again; + case L'z': /* size_t */ + if (flags & (CHAR | SHORT | LONG | LONGDBL)) + goto match_failure; + if (sizeof (size_t) < sizeof (int)) + /* POSIX states size_t is 16 or more bits, as is short. */ + flags |= SHORT; + else if (sizeof (size_t) == sizeof (int)) + /* no flag needed */; + else if (sizeof (size_t) <= sizeof (long)) + flags |= LONG; + else + /* POSIX states that at least one programming + environment must support size_t no wider than + long, but that means other environments can + have size_t as wide as long long. */ + flags |= LONGDBL; + goto again; +#endif /* _WANT_IO_C99_FORMATS */ +#ifdef _WANT_IO_POSIX_EXTENSIONS + case 'm': + if (flags & (CHAR | SHORT | LONG | LONGDBL | MALLOC)) + goto match_failure; + init_m_ptr (); + flags |= MALLOC; + goto again; +#endif + + case L'0': + case L'1': + case L'2': + case L'3': + case L'4': + case L'5': + case L'6': + case L'7': + case L'8': + case L'9': + if (flags & (CHAR | SHORT | LONG | LONGDBL | MALLOC)) + goto match_failure; + width = width * 10 + c - L'0'; + goto again; + +#ifndef _NO_POS_ARGS + case L'$': + if (flags & (CHAR | SHORT | LONG | LONGDBL | SUPPRESS | MALLOC)) + goto match_failure; + if (width <= MAX_POS_ARGS) + { + N = width - 1; + is_pos_arg = 1; + width = 0; + goto again; + } + _REENT_ERRNO(rptr) = EINVAL; + goto input_failure; +#endif /* !_NO_POS_ARGS */ + + case L'd': + c = CT_INT; + ccfn = (unsigned long (*)CCFN_PARAMS)_wcstol_r; + base = 10; + break; + + case L'i': + c = CT_INT; + ccfn = (unsigned long (*)CCFN_PARAMS)_wcstol_r; + base = 0; + break; + + case L'o': + c = CT_INT; + ccfn = _wcstoul_r; + base = 8; + break; + + case L'u': + c = CT_INT; + ccfn = _wcstoul_r; + base = 10; + break; + + case L'X': + case L'x': + flags |= PFXOK; /* enable 0x prefixing */ + c = CT_INT; + ccfn = _wcstoul_r; + base = 16; + break; + +#ifdef FLOATING_POINT +# ifdef _WANT_IO_C99_FORMATS + case L'A': + case L'a': + case L'F': +# endif + case L'E': + case L'G': + case L'e': + case L'f': + case L'g': + c = CT_FLOAT; + break; +#endif + +#ifdef _WANT_IO_C99_FORMATS + case L'S': + flags |= LONG; + /* FALLTHROUGH */ +#endif + + case L's': + c = CT_STRING; + break; + + case L'[': + if (*fmt == '^') + { + cclcompl = 1; + ++fmt; + } + else + cclcompl = 0; + ccls = fmt; + if (*fmt == ']') + fmt++; + while (*fmt != '\0' && *fmt != ']') + fmt++; + ccle = fmt; + fmt++; + flags |= NOSKIP; + c = CT_CCL; + break; + +#ifdef _WANT_IO_C99_FORMATS + case 'C': + flags |= LONG; + /* FALLTHROUGH */ +#endif + + case 'c': + flags |= NOSKIP; + c = CT_CHAR; + break; + + case 'p': /* pointer format is like hex */ + flags |= POINTER | PFXOK; + c = CT_INT; + ccfn = _wcstoul_r; + base = 16; + break; + + case 'n': + if (flags & SUPPRESS) /* ??? */ + continue; +#ifdef _WANT_IO_C99_FORMATS + if (flags & CHAR) + { + cp = GET_ARG (N, ap, char *); + *cp = nread; + } + else +#endif + if (flags & SHORT) + { + sp = GET_ARG (N, ap, short *); + *sp = nread; + } + else if (flags & LONG) + { + lp = GET_ARG (N, ap, long *); + *lp = nread; + } +#ifndef _NO_LONGLONG + else if (flags & LONGDBL) + { + llp = GET_ARG (N, ap, long long*); + *llp = nread; + } +#endif + else + { + ip = GET_ARG (N, ap, int *); + *ip = nread; + } + continue; + + default: + goto match_failure; + } + + /* + * Consume leading white space, except for formats that + * suppress this. + */ + if ((flags & NOSKIP) == 0) + { + while ((wi = _fgetwc_r (rptr, fp)) != WEOF && iswspace (wi)) + nread++; + if (wi == WEOF) + goto input_failure; + _ungetwc_r (rptr, wi, fp); + } + + /* + * Do the conversion. + */ + switch (c) + { + + case CT_CHAR: + /* scan arbitrary characters (sets NOSKIP) */ + if (width == 0) + width = 1; + if (flags & LONG) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wchar_t **p_p = NULL; + wchar_t *p0 = NULL; + size_t p_siz = 0; +#endif + + if (flags & SUPPRESS) + ; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + p_siz = alloc_m_ptr (wchar_t, p, p0, p_p, 32); +#endif + else + p = GET_ARG(N, ap, wchar_t *); + n = 0; + while (width-- != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF) + { + if (!(flags & SUPPRESS)) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + /* Check before ++ because we never add a \0 */ + p_siz = realloc_m_ptr (wchar_t, p, p0, p_p, p_siz); +#endif + *p++ = (wchar_t) wi; + } + n++; + } + if (n == 0) + goto input_failure; + nread += n; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (wchar_t, p_p, p - p0, p_siz); +#endif + if (!(flags & SUPPRESS)) + nassigned++; + } + else + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + char **mbp_p = NULL; + char *mbp0 = NULL; + size_t mbp_siz = 0; +#endif + + if (flags & SUPPRESS) + mbp = mbbuf; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + mbp_siz = alloc_m_ptr (char, mbp, mbp0, mbp_p, 32); +#endif + else + mbp = GET_ARG(N, ap, char *); + n = 0; + memset ((void *)&mbs, '\0', sizeof (mbstate_t)); + while (width != 0 && (wi = _fgetwc_r (rptr, fp)) != WEOF) + { + nconv = _wcrtomb_r (rptr, mbp, wi, &mbs); + if (nconv == (size_t) -1) + goto input_failure; + /* Ignore high surrogate in width counting */ + if (nconv != 0 || mbs.__count != -4) + width--; + if (!(flags & SUPPRESS)) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + mbp_siz = realloc_m_ptr (char, mbp, mbp0, mbp_p, mbp_siz); +#endif + mbp += nconv; + } + n++; + } + if (n == 0) + goto input_failure; + nread += n; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (char, mbp_p, mbp - mbp0, mbp_siz); +#endif + if (!(flags & SUPPRESS)) + nassigned++; + } + break; + + case CT_CCL: + /* scan a (nonempty) character class (sets NOSKIP) */ + if (width == 0) + width = SIZE_MAX; /* `infinity' */ + /* take only those things in the class */ + if ((flags & SUPPRESS) && (flags & LONG)) + { + n = 0; + while ((wi = _fgetwc_r (rptr, fp)) != WEOF + && width-- != 0 && INCCL (wi)) + n++; + if (wi != WEOF) + _ungetwc_r (rptr, wi, fp); + if (n == 0) + goto match_failure; + } + else if (flags & LONG) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wchar_t **p_p = NULL; + size_t p_siz = 0; + + if (flags & MALLOC) + p_siz = alloc_m_ptr (wchar_t, p, p0, p_p, 32); + else +#endif + p0 = p = GET_ARG(N, ap, wchar_t *); + while ((wi = _fgetwc_r (rptr, fp)) != WEOF + && width-- != 0 && INCCL (wi)) + { + *p++ = (wchar_t) wi; +#ifdef _WANT_IO_POSIX_EXTENSIONS + p_siz = realloc_m_ptr (wchar_t, p, p0, p_p, p_siz); +#endif + } + if (wi != WEOF) + _ungetwc_r (rptr, wi, fp); + n = p - p0; + if (n == 0) + goto match_failure; + *p = L'\0'; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (wchar_t, p_p, n + 1, p_siz); +#endif + nassigned++; + } + else + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + char **mbp_p = NULL; + char *mbp0 = NULL; + size_t mbp_siz = 0; +#endif + + if (flags & SUPPRESS) + mbp = mbbuf; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + mbp_siz = alloc_m_ptr (char, mbp, mbp0, mbp_p, 32); +#endif + else + mbp = GET_ARG(N, ap, char *); + n = 0; + memset ((void *) &mbs, '\0', sizeof (mbstate_t)); + while ((wi = _fgetwc_r (rptr, fp)) != WEOF + && width != 0 && INCCL (wi)) + { + nconv = _wcrtomb_r (rptr, mbp, wi, &mbs); + if (nconv == (size_t) -1) + goto input_failure; + /* Ignore high surrogate in width counting */ + if (nconv != 0 || mbs.__count != -4) + width--; + if (!(flags & SUPPRESS)) + { + mbp += nconv; +#ifdef _WANT_IO_POSIX_EXTENSIONS + mbp_siz = realloc_m_ptr (char, mbp, mbp0, mbp_p, mbp_siz); +#endif + } + n++; + } + if (wi != WEOF) + _ungetwc_r (rptr, wi, fp); + if (!(flags & SUPPRESS)) + { + *mbp = 0; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (char, mbp_p, mbp - mbp0 + 1, mbp_siz); +#endif + nassigned++; + } + } + nread += n; + break; + + case CT_STRING: + /* like CCL, but zero-length string OK, & no NOSKIP */ + if (width == 0) + width = SIZE_MAX; + if ((flags & SUPPRESS) && (flags & LONG)) + { + while ((wi = _fgetwc_r (rptr, fp)) != WEOF + && width-- != 0 && !iswspace (wi)) + nread++; + if (wi != WEOF) + _ungetwc_r (rptr, wi, fp); + } + else if (flags & LONG) + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + wchar_t **p_p = NULL; + size_t p_siz = 0; + + if (flags & MALLOC) + p_siz = alloc_m_ptr (wchar_t, p, p0, p_p, 32); + else +#endif + p0 = p = GET_ARG(N, ap, wchar_t *); + while ((wi = _fgetwc_r (rptr, fp)) != WEOF + && width-- != 0 && !iswspace (wi)) + { + *p++ = (wchar_t) wi; +#ifdef _WANT_IO_POSIX_EXTENSIONS + p_siz = realloc_m_ptr (wchar_t, p, p0, p_p, p_siz); +#endif + nread++; + } + if (wi != WEOF) + _ungetwc_r (rptr, wi, fp); + *p = L'\0'; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (wchar_t, p_p, p - p0 + 1, p_siz); +#endif + nassigned++; + } + else + { +#ifdef _WANT_IO_POSIX_EXTENSIONS + char **mbp_p = NULL; + char *mbp0 = NULL; + size_t mbp_siz = 0; +#endif + + if (flags & SUPPRESS) + mbp = mbbuf; +#ifdef _WANT_IO_POSIX_EXTENSIONS + else if (flags & MALLOC) + mbp_siz = alloc_m_ptr (char, mbp, mbp0, mbp_p, 32); +#endif + else + mbp = GET_ARG(N, ap, char *); + memset ((void *) &mbs, '\0', sizeof (mbstate_t)); + while ((wi = _fgetwc_r (rptr, fp)) != WEOF + && width != 0 && !iswspace (wi)) + { + nconv = wcrtomb(mbp, wi, &mbs); + if (nconv == (size_t)-1) + goto input_failure; + /* Ignore high surrogate in width counting */ + if (nconv != 0 || mbs.__count != -4) + width--; + if (!(flags & SUPPRESS)) + { + mbp += nconv; +#ifdef _WANT_IO_POSIX_EXTENSIONS + mbp_siz = realloc_m_ptr (char, mbp, mbp0, mbp_p, mbp_siz); +#endif + } + nread++; + } + if (wi != WEOF) + _ungetwc_r (rptr, wi, fp); + if (!(flags & SUPPRESS)) + { + *mbp = 0; +#ifdef _WANT_IO_POSIX_EXTENSIONS + shrink_m_ptr (char, mbp_p, mbp - mbp0 + 1, mbp_siz); +#endif + nassigned++; + } + } + continue; + + case CT_INT: + { + /* scan an integer as if by wcstol/wcstoul */ + if (width == 0 || width > sizeof (buf) / sizeof (*buf) - 1) + width = sizeof(buf) / sizeof (*buf) - 1; + flags |= SIGNOK | NDIGITS | NZDIGITS; + for (p = buf; width; width--) + { + c = _fgetwc_r (rptr, fp); + /* + * Switch on the character; `goto ok' if we + * accept it as a part of number. + */ + switch (c) + { + /* + * The digit 0 is always legal, but is special. + * For %i conversions, if no digits (zero or nonzero) + * have been scanned (only signs), we will have base==0. + * In that case, we should set it to 8 and enable 0x + * prefixing. Also, if we have not scanned zero digits + * before this, do not turn off prefixing (someone else + * will turn it off if we have scanned any nonzero digits). + */ + case L'0': + if (base == 0) + { + base = 8; + flags |= PFXOK; + } + if (flags & NZDIGITS) + flags &= ~(SIGNOK | NZDIGITS | NDIGITS); + else + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* 1 through 7 always legal */ + case L'1': + case L'2': + case L'3': + case L'4': + case L'5': + case L'6': + case L'7': + base = basefix[base]; + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* digits 8 and 9 ok iff decimal or hex */ + case L'8': + case L'9': + base = basefix[base]; + if (base <= 8) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* letters ok iff hex */ + case L'A': + case L'B': + case L'C': + case L'D': + case L'E': + case L'F': + case L'a': + case L'b': + case L'c': + case L'd': + case L'e': + case L'f': + /* no need to fix base here */ + if (base <= 10) + break; /* not legal here */ + flags &= ~(SIGNOK | PFXOK | NDIGITS); + goto ok; + + /* sign ok only as first character */ + case L'+': + case L'-': + if (flags & SIGNOK) + { + flags &= ~SIGNOK; + flags |= HAVESIGN; + goto ok; + } + break; + + /* x ok iff flag still set & single 0 seen */ + case L'x': + case L'X': + if ((flags & PFXOK) && p == buf + 1 + !!(flags & HAVESIGN)) + { + base = 16;/* if %i */ + flags &= ~PFXOK; + goto ok; + } + break; + } + + /* + * If we got here, c is not a legal character + * for a number. Stop accumulating digits. + */ + if (c != WEOF) + _ungetwc_r (rptr, c, fp); + break; + ok: + /* + * c is legal: store it and look at the next. + */ + *p++ = (wchar_t) c; + } + /* + * If we had only a sign, it is no good; push back the sign. + * If the number ends in `x', it was [sign] '0' 'x', so push back + * the x and treat it as [sign] '0'. + * Use of ungetc here and below assumes ASCII encoding; we are only + * pushing back 7-bit characters, so casting to unsigned char is + * not necessary. + */ + if (flags & NDIGITS) + { + if (p > buf) + _ungetwc_r (rptr, *--p, fp); /* [-+xX] */ + goto match_failure; + } + c = p[-1]; + if (c == L'x' || c == L'X') + { + --p; + _ungetwc_r (rptr, c, fp); + } + if ((flags & SUPPRESS) == 0) + { + unsigned long res; + + *p = 0; + res = (*ccfn) (rptr, buf, (wchar_t **) NULL, base); + if (flags & POINTER) + { + void **vp = GET_ARG (N, ap, void **); +#ifndef _NO_LONGLONG + if (sizeof (uintptr_t) > sizeof (unsigned long)) + { + unsigned long long resll; + resll = _wcstoull_r (rptr, buf, (wchar_t **) NULL, base); + *vp = (void *) (uintptr_t) resll; + } + else +#endif /* !_NO_LONGLONG */ + *vp = (void *) (uintptr_t) res; + } +#ifdef _WANT_IO_C99_FORMATS + else if (flags & CHAR) + { + cp = GET_ARG (N, ap, char *); + *cp = res; + } +#endif + else if (flags & SHORT) + { + sp = GET_ARG (N, ap, short *); + *sp = res; + } + else if (flags & LONG) + { + lp = GET_ARG (N, ap, long *); + *lp = res; + } +#ifndef _NO_LONGLONG + else if (flags & LONGDBL) + { + unsigned long long resll; + if (ccfn == _wcstoul_r) + resll = _wcstoull_r (rptr, buf, (wchar_t **) NULL, base); + else + resll = _wcstoll_r (rptr, buf, (wchar_t **) NULL, base); + llp = GET_ARG (N, ap, long long*); + *llp = resll; + } +#endif + else + { + ip = GET_ARG (N, ap, int *); + *ip = res; + } + nassigned++; + } + nread += p - buf; + break; + } +#ifdef FLOATING_POINT + case CT_FLOAT: + { + /* scan a floating point number as if by wcstod */ + /* This code used to assume that the number of digits is reasonable. + However, ANSI / ISO C makes no such stipulation; we have to get + exact results even when there is an unreasonable amount of + leading zeroes. */ + long leading_zeroes = 0; + long zeroes, exp_adjust; + wchar_t *exp_start = NULL; + unsigned width_left = 0; + char nancount = 0; + char infcount = 0; +#ifdef hardway + if (width == 0 || width > sizeof (buf) / sizeof (*buf) - 1) +#else + /* size_t is unsigned, hence this optimisation */ + if (width - 1 > sizeof (buf) / sizeof (*buf) - 2) +#endif + { + width_left = width - (sizeof (buf) / sizeof (*buf) - 1); + width = sizeof (buf) / sizeof (*buf) - 1; + } + flags |= SIGNOK | NDIGITS | DPTOK | EXPOK; + zeroes = 0; + exp_adjust = 0; + for (p = buf; width; ) + { + c = _fgetwc_r (rptr, fp); + /* + * This code mimicks the integer conversion + * code, but is much simpler. + */ + switch (c) + { + case L'0': + if (flags & NDIGITS) + { + flags &= ~SIGNOK; + zeroes++; + if (width_left) + { + width_left--; + width++; + } + goto fskip; + } + /* Fall through. */ + case L'1': + case L'2': + case L'3': + case L'4': + case L'5': + case L'6': + case L'7': + case L'8': + case L'9': + if (nancount + infcount == 0) + { + flags &= ~(SIGNOK | NDIGITS); + goto fok; + } + break; + + case L'+': + case L'-': + if (flags & SIGNOK) + { + flags &= ~SIGNOK; + goto fok; + } + break; + case L'n': + case L'N': + if (nancount == 0 && zeroes == 0 + && (flags & (NDIGITS | DPTOK | EXPOK)) == + (NDIGITS | DPTOK | EXPOK)) + { + flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS); + nancount = 1; + goto fok; + } + if (nancount == 2) + { + nancount = 3; + goto fok; + } + if (infcount == 1 || infcount == 4) + { + infcount++; + goto fok; + } + break; + case L'a': + case L'A': + if (nancount == 1) + { + nancount = 2; + goto fok; + } + break; + case L'i': + if (infcount == 0 && zeroes == 0 + && (flags & (NDIGITS | DPTOK | EXPOK)) == + (NDIGITS | DPTOK | EXPOK)) + { + flags &= ~(SIGNOK | DPTOK | EXPOK | NDIGITS); + infcount = 1; + goto fok; + } + if (infcount == 3 || infcount == 5) + { + infcount++; + goto fok; + } + break; + case L'f': + case L'F': + if (infcount == 2) + { + infcount = 3; + goto fok; + } + break; + case L't': + case L'T': + if (infcount == 6) + { + infcount = 7; + goto fok; + } + break; + case L'y': + case L'Y': + if (infcount == 7) + { + infcount = 8; + goto fok; + } + break; + case L'e': + case L'E': + /* no exponent without some digits */ + if ((flags & (NDIGITS | EXPOK)) == EXPOK + || ((flags & EXPOK) && zeroes)) + { + if (! (flags & DPTOK)) + { + exp_adjust = zeroes - leading_zeroes; + exp_start = p; + } + flags = + (flags & ~(EXPOK | DPTOK)) | + SIGNOK | NDIGITS; + zeroes = 0; + goto fok; + } + break; + default: + if ((wchar_t) c == decpt && (flags & DPTOK)) + { + flags &= ~(SIGNOK | DPTOK); + leading_zeroes = zeroes; + goto fok; + } + break; + } + if (c != WEOF) + _ungetwc_r (rptr, c, fp); + break; + fok: + *p++ = c; + fskip: + width--; + ++nread; + } + if (zeroes) + flags &= ~NDIGITS; + /* We may have a 'N' or possibly even [sign] 'N' 'a' as the + start of 'NaN', only to run out of chars before it was + complete (or having encountered a non-matching char). So + check here if we have an outstanding nancount, and if so + put back the chars we did swallow and treat as a failed + match. + + FIXME - we still don't handle NAN([0xdigits]). */ + if (nancount - 1U < 2U) /* nancount && nancount < 3 */ + { + /* Newlib's ungetc works even if we called __srefill in + the middle of a partial parse, but POSIX does not + guarantee that in all implementations of ungetc. */ + while (p > buf) + { + _ungetwc_r (rptr, *--p, fp); /* [-+nNaA] */ + --nread; + } + goto match_failure; + } + /* Likewise for 'inf' and 'infinity'. But be careful that + 'infinite' consumes only 3 characters, leaving the stream + at the second 'i'. */ + if (infcount - 1U < 7U) /* infcount && infcount < 8 */ + { + if (infcount >= 3) /* valid 'inf', but short of 'infinity' */ + while (infcount-- > 3) + { + _ungetwc_r (rptr, *--p, fp); /* [iInNtT] */ + --nread; + } + else + { + while (p > buf) + { + _ungetwc_r (rptr, *--p, fp); /* [-+iInN] */ + --nread; + } + goto match_failure; + } + } + /* + * If no digits, might be missing exponent digits + * (just give back the exponent) or might be missing + * regular digits, but had sign and/or decimal point. + */ + if (flags & NDIGITS) + { + if (flags & EXPOK) + { + /* no digits at all */ + while (p > buf) + { + _ungetwc_r (rptr, *--p, fp); /* [-+.] */ + --nread; + } + goto match_failure; + } + /* just a bad exponent (e and maybe sign) */ + c = *--p; + --nread; + if (c != L'e' && c != L'E') + { + _ungetwc_r (rptr, c, fp); /* [-+] */ + c = *--p; + --nread; + } + _ungetwc_r (rptr, c, fp); /* [eE] */ + } + if ((flags & SUPPRESS) == 0) + { + double res = 0; +#ifdef _NO_LONGDBL +#define QUAD_RES res; +#else /* !_NO_LONG_DBL */ + long double qres = 0; +#define QUAD_RES qres; +#endif /* !_NO_LONG_DBL */ + long new_exp = 0; + + *p = 0; + if ((flags & (DPTOK | EXPOK)) == EXPOK) + { + exp_adjust = zeroes - leading_zeroes; + new_exp = -exp_adjust; + exp_start = p; + } + else if (exp_adjust) + new_exp = _wcstol_r (rptr, (exp_start + 1), NULL, 10) - exp_adjust; + if (exp_adjust) + { + + /* If there might not be enough space for the new exponent, + truncate some trailing digits to make room. */ + if (exp_start >= buf + sizeof (buf) / sizeof (*buf) + - MAX_LONG_LEN) + exp_start = buf + sizeof (buf) / sizeof (*buf) + - MAX_LONG_LEN - 1; + swprintf (exp_start, MAX_LONG_LEN, L"e%ld", new_exp); + } + + /* FIXME: We don't have wcstold yet. */ +#if 0//ndef _NO_LONGDBL /* !_NO_LONGDBL */ + if (flags & LONGDBL) + qres = _wcstold_r (rptr, buf, NULL); + else +#endif + res = _wcstod_r (rptr, buf, NULL); + + if (flags & LONG) + { + dp = GET_ARG (N, ap, double *); + *dp = res; + } + else if (flags & LONGDBL) + { + ldp = GET_ARG (N, ap, _LONG_DOUBLE *); + *ldp = QUAD_RES; + } + else + { + flp = GET_ARG (N, ap, float *); + if (isnan (res)) + *flp = nanf (""); + else + *flp = res; + } + nassigned++; + } + break; + } +#endif /* FLOATING_POINT */ + } + } +input_failure: + /* On read failure, return EOF failure regardless of matches; errno + should have been set prior to here. On EOF failure (including + invalid format string), return EOF if no matches yet, else number + of matches made prior to failure. */ + nassigned = nassigned && !(fp->_flags & __SERR) ? nassigned : EOF; +match_failure: +all_done: + /* Return number of matches, which can be 0 on match failure. */ + _newlib_flockfile_end (fp); +#ifdef _WANT_IO_POSIX_EXTENSIONS + free_m_ptr (); +#endif + return nassigned; +} + +#ifndef _NO_POS_ARGS +/* Process all intermediate arguments. Fortunately, with wscanf, all + intermediate arguments are sizeof(void*), so we don't need to scan + ahead in the format string. */ +static void * +get_arg (int n, va_list *ap, int *numargs_p, void **args) +{ + int numargs = *numargs_p; + while (n >= numargs) + args[numargs++] = va_arg (*ap, void *); + *numargs_p = numargs; + return args[n]; +} +#endif /* !_NO_POS_ARGS */ diff --git a/lib/stdio/viprintf.c b/lib/stdio/viprintf.c new file mode 100644 index 0000000..12b7b10 --- /dev/null +++ b/lib/stdio/viprintf.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>, <>, <>, <>---format argument list (integer only) + +INDEX + viprintf +INDEX + _viprintf_r +INDEX + vfiprintf +INDEX + _vfiprintf_r +INDEX + vsiprintf +INDEX + _vsiprintf_r +INDEX + vsniprintf +INDEX + _vsniprintf_r +INDEX + vasiprintf +INDEX + _vasiprintf_r +INDEX + vasniprintf +INDEX + _vasniprintf_r + +SYNOPSIS + #include + #include + int viprintf(const char *<[fmt]>, va_list <[list]>); + int vfiprintf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsiprintf(char *<[str]>, const char *<[fmt]>, va_list <[list]>); + int vsniprintf(char *<[str]>, size_t <[size]>, const char *<[fmt]>, + va_list <[list]>); + int vasiprintf(char **<[strp]>, const char *<[fmt]>, va_list <[list]>); + char *vasniprintf(char *<[str]>, size_t *<[size]>, const char *<[fmt]>, + va_list <[list]>); + + int _viprintf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfiprintf_r(struct _reent *<[reent]>, FILE *<[fp]>, + const char *<[fmt]>, va_list <[list]>); + int _vsiprintf_r(struct _reent *<[reent]>, char *<[str]>, + const char *<[fmt]>, va_list <[list]>); + int _vsniprintf_r(struct _reent *<[reent]>, char *<[str]>, + size_t <[size]>, const char *<[fmt]>, va_list <[list]>); + int _vasiprintf_r(struct _reent *<[reent]>, char **<[str]>, + const char *<[fmt]>, va_list <[list]>); + char *_vasniprintf_r(struct _reent *<[reent]>, char *<[str]>, + size_t *<[size]>, const char *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, <>, <>, +<>, and <> are (respectively) variants of +<>, <>, <>, <>, <>, +and <>. They differ only in allowing their caller to pass +the variable argument list as a <> object (initialized by +<>) rather than directly accepting a variable number of +arguments. The caller is responsible for calling <>. + +<<_viprintf_r>>, <<_vfiprintf_r>>, <<_vasiprintf_r>>, +<<_vsiprintf_r>>, <<_vsniprintf_r>>, and <<_vasniprintf_r>> are +reentrant versions of the above. + +RETURNS +The return values are consistent with the corresponding functions: + +PORTABILITY +All of these functions are newlib extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +viprintf (const char *fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return _vfiprintf_r (reent, _stdout_r (reent), fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_viprintf_r (struct _reent *ptr, + const char *fmt, + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return _vfiprintf_r (ptr, _stdout_r (ptr), fmt, ap); +} diff --git a/lib/stdio/viscanf.c b/lib/stdio/viscanf.c new file mode 100644 index 0000000..6cc16cd --- /dev/null +++ b/lib/stdio/viscanf.c @@ -0,0 +1,107 @@ +/*- + * Code created by modifying iscanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>, <>, <>---format argument list + +INDEX + viscanf +INDEX + _viscanf_r +INDEX + vfiscanf +INDEX + _vfiscanf_r +INDEX + vsiscanf +INDEX + _vsiscanf_r + +SYNOPSIS + #include + #include + int viscanf(const char *<[fmt]>, va_list <[list]>); + int vfiscanf(FILE *<[fp]>, const char *<[fmt]>, va_list <[list]>); + int vsiscanf(const char *<[str]>, const char *<[fmt]>, va_list <[list]>); + + int _viscanf_r(struct _reent *<[reent]>, const char *<[fmt]>, + va_list <[list]>); + int _vfiscanf_r(struct _reent *<[reent]>, FILE *<[fp]>, const char *<[fmt]>, + va_list <[list]>); + int _vsiscanf_r(struct _reent *<[reent]>, const char *<[str]>, + const char *<[fmt]>, va_list <[list]>); + +DESCRIPTION +<>, <>, and <> are (respectively) variants +of <>, <>, and <>. They differ only in +allowing their caller to pass the variable argument list as a +<> object (initialized by <>) rather than +directly accepting a variable number of arguments. + +RETURNS +The return values are consistent with the corresponding functions: +<> returns the number of input fields successfully scanned, +converted, and stored; the return value does not include scanned +fields which were not stored. + +If <> attempts to read at end-of-file, the return value +is <>. + +If no fields were stored, the return value is <<0>>. + +The routines <<_viscanf_r>>, <<_vfiscanf_f>>, and <<_vsiscanf_r>> are +reentrant versions which take an additional first parameter which points to the +reentrancy structure. + +PORTABILITY +These are newlib extensions. + +Supporting OS subroutines required: +*/ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +viscanf (const char *fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return __svfiscanf_r (reent, _stdin_r (reent), fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_viscanf_r (struct _reent *ptr, + const char *fmt, + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return __svfiscanf_r (ptr, _stdin_r (ptr), fmt, ap); +} + diff --git a/lib/stdio/vprintf.c b/lib/stdio/vprintf.c new file mode 100644 index 0000000..8e13cbb --- /dev/null +++ b/lib/stdio/vprintf.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in vfprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +vprintf (const char *fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return _vfprintf_r (reent, _stdout_r (reent), fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +viprintf (const char *, __VALIST) _ATTRIBUTE ((__alias__("vprintf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_vprintf_r (struct _reent *ptr, + const char *__restrict fmt, + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return _vfprintf_r (ptr, _stdout_r (ptr), fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +_viprintf_r (struct _reent *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vprintf_r"))); +#endif diff --git a/lib/stdio/vscanf.c b/lib/stdio/vscanf.c new file mode 100644 index 0000000..9e12357 --- /dev/null +++ b/lib/stdio/vscanf.c @@ -0,0 +1,58 @@ +/*- + * Code created by modifying scanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +vscanf (const char *fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return __svfscanf_r (reent, _stdin_r (reent), fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +viscanf (const char *, __VALIST) _ATTRIBUTE ((__alias__("vscanf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_vscanf_r (struct _reent *ptr, + const char *__restrict fmt, + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return __svfscanf_r (ptr, _stdin_r (ptr), fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +_viscanf_r (struct _reent *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vscanf_r"))); +#endif diff --git a/lib/stdio/vsiprintf.c b/lib/stdio/vsiprintf.c new file mode 100644 index 0000000..8128cb7 --- /dev/null +++ b/lib/stdio/vsiprintf.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in viprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include + +#include "local.h" + +#ifndef _REENT_ONLY + +int +vsiprintf (char *str, + const char *fmt, + va_list ap) +{ + return _vsiprintf_r (_REENT, str, fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vsiprintf_r (struct _reent *ptr, + char *str, + const char *fmt, + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + ret = _svfiprintf_r (ptr, &f, fmt, ap); + *f._p = 0; + return ret; +} diff --git a/lib/stdio/vsiscanf.c b/lib/stdio/vsiscanf.c new file mode 100644 index 0000000..d7135ef --- /dev/null +++ b/lib/stdio/vsiscanf.c @@ -0,0 +1,59 @@ +/* + * Code created by modifying iscanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +/* + * vsiscanf + */ + +#ifndef _REENT_ONLY + +int +vsiscanf (const char *str, + const char *fmt, + va_list ap) +{ + return _vsiscanf_r (_REENT, str, fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vsiscanf_r (struct _reent *ptr, + const char *str, + const char *fmt, + va_list ap) +{ + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + return __ssvfiscanf_r (ptr, &f, fmt, ap); +} diff --git a/lib/stdio/vsniprintf.c b/lib/stdio/vsniprintf.c new file mode 100644 index 0000000..e7625ff --- /dev/null +++ b/lib/stdio/vsniprintf.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in viprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include +#include + +#include "local.h" + +#ifndef _REENT_ONLY + +int +vsniprintf (char *str, + size_t size, + const char *fmt, + va_list ap) +{ + return _vsniprintf_r (_REENT, str, size, fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vsniprintf_r (struct _reent *ptr, + char *str, + size_t size, + const char *fmt, + va_list ap) +{ + int ret; + FILE f; + + if (size > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + ret = _svfiprintf_r (ptr, &f, fmt, ap); + if (ret < EOF) + _REENT_ERRNO(ptr) = EOVERFLOW; + if (size > 0) + *f._p = 0; + return ret; +} diff --git a/lib/stdio/vsnprintf.c b/lib/stdio/vsnprintf.c new file mode 100644 index 0000000..ecf82ea --- /dev/null +++ b/lib/stdio/vsnprintf.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in vfprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include +#include + +#include "local.h" + +#ifndef _REENT_ONLY + +int +vsnprintf (char *__restrict str, + size_t size, + const char *__restrict fmt, + va_list ap) +{ + return _vsnprintf_r (_REENT, str, size, fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +vsniprintf (char *, size_t, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vsnprintf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_vsnprintf_r (struct _reent *ptr, + char *__restrict str, + size_t size, + const char *__restrict fmt, + va_list ap) +{ + int ret; + FILE f; + + if (size > INT_MAX) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? size - 1 : 0); + f._file = -1; /* No file. */ + ret = _svfprintf_r (ptr, &f, fmt, ap); + if (ret < EOF) + _REENT_ERRNO(ptr) = EOVERFLOW; + if (size > 0) + *f._p = 0; + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +_vsniprintf_r (struct _reent *, char *, size_t, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vsnprintf_r"))); +#endif diff --git a/lib/stdio/vsprintf.c b/lib/stdio/vsprintf.c new file mode 100644 index 0000000..4d51fd0 --- /dev/null +++ b/lib/stdio/vsprintf.c @@ -0,0 +1,71 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in vfprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include + +#include "local.h" + +#ifndef _REENT_ONLY + +int +vsprintf (char *__restrict str, + const char *__restrict fmt, + va_list ap) +{ + return _vsprintf_r (_REENT, str, fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +vsiprintf (char *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vsprintf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_vsprintf_r (struct _reent *ptr, + char *__restrict str, + const char *__restrict fmt, + va_list ap) +{ + int ret; + FILE f; + + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = INT_MAX; + f._file = -1; /* No file. */ + ret = _svfprintf_r (ptr, &f, fmt, ap); + *f._p = 0; + return ret; +} + +#ifdef _NANO_FORMATTED_IO +int +_vsiprintf_r (struct _reent *, char *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vsprintf_r"))); +#endif diff --git a/lib/stdio/vsscanf.c b/lib/stdio/vsscanf.c new file mode 100644 index 0000000..e9e8408 --- /dev/null +++ b/lib/stdio/vsscanf.c @@ -0,0 +1,71 @@ +/* + * Code created by modifying scanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +/* + * vsscanf + */ + +#ifndef _REENT_ONLY + +int +vsscanf (const char *__restrict str, + const char *__restrict fmt, + va_list ap) +{ + return _vsscanf_r (_REENT, str, fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +vsiscanf (const char *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("vsscanf"))); +#endif + +#endif /* !_REENT_ONLY */ + +int +_vsscanf_r (struct _reent *ptr, + const char *__restrict str, + const char *__restrict fmt, + va_list ap) +{ + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = strlen (str); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._file = -1; /* No file. */ + return __ssvfscanf_r (ptr, &f, fmt, ap); +} + +#ifdef _NANO_FORMATTED_IO +int +_vsiscanf_r (struct _reent *, const char *, const char *, __VALIST) + _ATTRIBUTE ((__alias__("_vsscanf_r"))); +#endif diff --git a/lib/stdio/vswprintf.c b/lib/stdio/vswprintf.c new file mode 100644 index 0000000..08a8545 --- /dev/null +++ b/lib/stdio/vswprintf.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in vfwprintf.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include + +#include "local.h" + +int +_vswprintf_r (struct _reent *ptr, + wchar_t *str, + size_t size, + const wchar_t *fmt, + va_list ap) +{ + int ret; + FILE f; + + if (size > INT_MAX / sizeof (wchar_t)) + { + _REENT_ERRNO(ptr) = EOVERFLOW; /* POSIX extension */ + return EOF; + } + f._flags = __SWR | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._w = (size > 0 ? (size - 1) * sizeof (wchar_t) : 0); + f._file = -1; /* No file. */ + ret = _svfwprintf_r (ptr, &f, fmt, ap); + /* _svfwprintf_r() does not put in a terminating NUL, so add one if + * appropriate, which is whenever size is > 0. _svfwprintf_r() stops + * after n-1, so always just put at the end. */ + if (size > 0) { + *(wchar_t *)f._p = L'\0'; /* terminate the string */ + } + if(ret >= size) { + /* _svfwprintf_r() returns how many wide characters it would have printed + * if there were enough space. Return an error if too big to fit in str, + * unlike snprintf, which returns the size needed. */ + _REENT_ERRNO(ptr) = EOVERFLOW; /* POSIX extension */ + ret = -1; + } + return ret; +} + +#ifndef _REENT_ONLY + +int +vswprintf (wchar_t *__restrict str, + size_t size, + const wchar_t *__restrict fmt, + va_list ap) +{ + return _vswprintf_r (_REENT, str, size, fmt, ap); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdio/vswscanf.c b/lib/stdio/vswscanf.c new file mode 100644 index 0000000..415c98b --- /dev/null +++ b/lib/stdio/vswscanf.c @@ -0,0 +1,60 @@ +/* + * Code created by modifying scanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* Doc in vfwscanf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "local.h" + +/* + * vsscanf + */ + +#ifndef _REENT_ONLY + +int +vswscanf (const wchar_t *__restrict str, const wchar_t * __restrict fmt, + va_list ap) +{ + return _vswscanf_r (_REENT, str, fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vswscanf_r (struct _reent *ptr, const wchar_t *str, const wchar_t *fmt, + va_list ap) +{ + FILE f; + + f._flags = __SRD | __SSTR; + f._bf._base = f._p = (unsigned char *) str; + f._bf._size = f._r = wcslen (str) * sizeof (wchar_t); + f._read = __seofread; + f._ub._base = NULL; + f._lb._base = NULL; + f._flags2 = 0; + f._ur = 0; + f._file = -1; /* No file. */ + return __ssvfwscanf_r (ptr, &f, fmt, ap); +} diff --git a/lib/stdio/vwprintf.c b/lib/stdio/vwprintf.c new file mode 100644 index 0000000..358d876 --- /dev/null +++ b/lib/stdio/vwprintf.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in vfwprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +vwprintf (const wchar_t *__restrict fmt, + va_list ap) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return _vfwprintf_r (reent, _stdout_r (reent), fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vwprintf_r (struct _reent *ptr, + const wchar_t *fmt, + va_list ap) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return _vfwprintf_r (ptr, _stdout_r (ptr), fmt, ap); +} diff --git a/lib/stdio/vwscanf.c b/lib/stdio/vwscanf.c new file mode 100644 index 0000000..c994bad --- /dev/null +++ b/lib/stdio/vwscanf.c @@ -0,0 +1,47 @@ +/*- + * Code created by modifying scanf.c which has following copyright. + * + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* Doc in vfwscanf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +vwscanf (const wchar_t *__restrict fmt, va_list ap) +{ + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + return __svfwscanf_r (reent, _stdin_r (reent), fmt, ap); +} + +#endif /* !_REENT_ONLY */ + +int +_vwscanf_r (struct _reent *ptr, const wchar_t *fmt, va_list ap) +{ + _REENT_SMALL_CHECK_INIT (ptr); + return __svfwscanf_r (ptr, _stdin_r (ptr), fmt, ap); +} + diff --git a/lib/stdio/wbuf.c b/lib/stdio/wbuf.c new file mode 100644 index 0000000..2474903 --- /dev/null +++ b/lib/stdio/wbuf.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* No user fns here. Pesch 15apr92. */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include <_ansi.h> +#include +#include +#include "local.h" +#include "fvwrite.h" + +/* + * Write the given character into the (probably full) buffer for + * the given file. Flush the buffer out if it is or becomes full, + * or if c=='\n' and the file is line buffered. + */ + +int +__swbuf_r (struct _reent *ptr, + register int c, + register FILE *fp) +{ + register int n; + + /* Ensure stdio has been initialized. */ + + CHECK_INIT (ptr, fp); + + /* + * In case we cannot write, or longjmp takes us out early, + * make sure _w is 0 (if fully- or un-buffered) or -_bf._size + * (if line buffered) so that we will get called again. + * If we did not do this, a sufficient number of putc() + * calls might wrap _w from negative to positive. + */ + + fp->_w = fp->_lbfsize; + if (cantwrite (ptr, fp)) + return EOF; + c = (unsigned char) c; + + ORIENT (fp, -1); + + /* + * If it is completely full, flush it out. Then, in any case, + * stuff c into the buffer. If this causes the buffer to fill + * completely, or if c is '\n' and the file is line buffered, + * flush it (perhaps a second time). The second flush will always + * happen on unbuffered streams, where _bf._size==1; fflush() + * guarantees that putc() will always call wbuf() by setting _w + * to 0, so we need not do anything else. + */ + + n = fp->_p - fp->_bf._base; + if (n >= fp->_bf._size) + { + if (_fflush_r (ptr, fp)) + return EOF; + n = 0; + } + fp->_w--; + *fp->_p++ = c; + if (++n == fp->_bf._size || (fp->_flags & __SLBF && c == '\n')) + if (_fflush_r (ptr, fp)) + return EOF; + return c; +} + +/* This function isn't any longer declared in stdio.h, but it's + required for backward compatibility with applications built against + earlier dynamically built newlib libraries. */ +int +__swbuf (register int c, + register FILE *fp) +{ + return __swbuf_r (_REENT, c, fp); +} diff --git a/lib/stdio/wprintf.c b/lib/stdio/wprintf.c new file mode 100644 index 0000000..32be6f1 --- /dev/null +++ b/lib/stdio/wprintf.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ +/* doc in swprintf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +int +_wprintf_r (struct _reent *ptr, + const wchar_t *fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfwprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} + +#ifndef _REENT_ONLY + +int +wprintf (const wchar_t *__restrict fmt, ...) +{ + int ret; + va_list ap; + struct _reent *ptr = _REENT; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfwprintf_r (ptr, _stdout_r (ptr), fmt, ap); + va_end (ap); + return ret; +} + +#endif /* ! _REENT_ONLY */ diff --git a/lib/stdio/wscanf.c b/lib/stdio/wscanf.c new file mode 100644 index 0000000..4de7922 --- /dev/null +++ b/lib/stdio/wscanf.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + /* Doc in swscanf.c */ + +#include <_ansi.h> +#include +#include +#include +#include +#include "local.h" + +#ifndef _REENT_ONLY + +int +wscanf(const wchar_t *__restrict fmt, ...) +{ + int ret; + va_list ap; + struct _reent *reent = _REENT; + + _REENT_SMALL_CHECK_INIT (reent); + va_start (ap, fmt); + ret = _vfwscanf_r (reent, _stdin_r (reent), fmt, ap); + va_end (ap); + return ret; +} + +#endif /* !_REENT_ONLY */ + +int +_wscanf_r(struct _reent *ptr, const wchar_t *fmt, ...) +{ + int ret; + va_list ap; + + _REENT_SMALL_CHECK_INIT (ptr); + va_start (ap, fmt); + ret = _vfwscanf_r (ptr, _stdin_r (ptr), fmt, ap); + va_end (ap); + return (ret); +} + diff --git a/lib/stdio/wsetup.c b/lib/stdio/wsetup.c new file mode 100644 index 0000000..0fd9690 --- /dev/null +++ b/lib/stdio/wsetup.c @@ -0,0 +1,93 @@ +/* No user fns here. Pesch 15apr92. */ + +/* + * Copyright (c) 1990, 2007 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +/* + * Various output routines call wsetup to be sure it is safe to write, + * because either _flags does not include __SWR, or _buf is NULL. + * _wsetup returns 0 if OK to write, nonzero and set errno otherwise. + */ + +int +__swsetup_r (struct _reent *ptr, + register FILE * fp) +{ + /* Make sure stdio is set up. */ + + CHECK_INIT (_REENT, fp); + + /* + * If we are not writing, we had better be reading and writing. + */ + + if ((fp->_flags & __SWR) == 0) + { + if ((fp->_flags & __SRW) == 0) + { + _REENT_ERRNO(ptr) = EBADF; + fp->_flags |= __SERR; + return EOF; + } + if (fp->_flags & __SRD) + { + /* clobber any ungetc data */ + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_flags &= ~(__SRD | __SEOF); + fp->_r = 0; + fp->_p = fp->_bf._base; + } + fp->_flags |= __SWR; + } + + /* + * Make a buffer if necessary, then set _w. + * A string I/O file should not explicitly allocate a buffer + * unless asprintf is being used. + */ + if (fp->_bf._base == NULL + && (!(fp->_flags & __SSTR) || (fp->_flags & __SMBF))) + __smakebuf_r (ptr, fp); + + if (fp->_flags & __SLBF) + { + /* + * It is line buffered, so make _lbfsize be -_bufsize + * for the putc() macro. We will change _lbfsize back + * to 0 whenever we turn off __SWR. + */ + fp->_w = 0; + fp->_lbfsize = -fp->_bf._size; + } + else + fp->_w = fp->_flags & __SNBF ? 0 : fp->_bf._size; + + if (!fp->_bf._base && (fp->_flags & __SMBF)) + { + /* __smakebuf_r set errno, but not flag */ + fp->_flags |= __SERR; + return EOF; + } + return 0; +} diff --git a/lib/stdio64/Makefile.inc b/lib/stdio64/Makefile.inc new file mode 100644 index 0000000..8746c93 --- /dev/null +++ b/lib/stdio64/Makefile.inc @@ -0,0 +1,31 @@ +if HAVE_STDIO64_DIR + +## All interfaces are EL/IX level 2 +if !ELIX_LEVEL_1 +libc_a_SOURCES += \ + %D%/fdopen64.c \ + %D%/fgetpos64.c \ + %D%/fopen64.c \ + %D%/freopen64.c \ + %D%/fseeko64.c \ + %D%/fsetpos64.c \ + %D%/ftello64.c \ + %D%/stdio64.c \ + %D%/tmpfile64.c +endif + +libc_a_CPPFLAGS_%C% = -I$(srcdir)/%D%/../stdio + +endif + +LIBC_CHEWOUT_FILES += \ + %D%/fdopen64.def \ + %D%/fgetpos64.def \ + %D%/fopen64.def \ + %D%/freopen64.def \ + %D%/fseeko64.def \ + %D%/fsetpos64.def \ + %D%/ftello64.def \ + %D%/tmpfile64.def + +LIBC_CHAPTERS += %D%/stdio64.tex diff --git a/lib/stdio64/fdopen64.c b/lib/stdio64/fdopen64.c new file mode 100644 index 0000000..d93b3d4 --- /dev/null +++ b/lib/stdio64/fdopen64.c @@ -0,0 +1,116 @@ +/* +FUNCTION +<>---turn open large file into a stream + +INDEX + fdopen64 +INDEX + _fdopen64_r + +SYNOPSIS + #include + FILE *fdopen64(int <[fd]>, const char *<[mode]>); + FILE *_fdopen64_r(void *<[reent]>, + int <[fd]>, const char *<[mode]>); + +DESCRIPTION +<> produces a file descriptor of type <>, from a +descriptor for an already-open file (returned, for example, by the +system subroutine <> rather than by <>). +The <[mode]> argument has the same meanings as in <>. + +RETURNS +File pointer or <>, as for <>. +*/ + +#include +#include + +#include +#include +#include "local.h" +#include <_syslist.h> +#include + +extern int __sflags (); + +FILE * +_fdopen64_r (struct _reent *ptr, + int fd, + const char *mode) +{ + register FILE *fp; + int flags, oflags; +#ifdef HAVE_FCNTL + int fdflags, fdmode; +#endif + + if ((flags = __sflags (ptr, mode, &oflags)) == 0) + return 0; + + /* make sure the mode the user wants is a subset of the actual mode */ +#ifdef HAVE_FCNTL + if ((fdflags = _fcntl_r (ptr, fd, F_GETFL, 0)) < 0) + return 0; + fdmode = fdflags & O_ACCMODE; + if (fdmode != O_RDWR && (fdmode != (oflags & O_ACCMODE))) + { + _REENT_ERRNO(ptr) = EBADF; + return 0; + } +#endif + + if ((fp = __sfp (ptr)) == 0) + return 0; + + _newlib_flockfile_start(fp); + + fp->_flags = flags; + /* POSIX recommends setting the O_APPEND bit on fd to match append + streams. Someone may later clear O_APPEND on fileno(fp), but the + stream must still remain in append mode. Rely on __sflags + setting __SAPP properly. */ +#ifdef HAVE_FCNTL + if ((oflags & O_APPEND) && !(fdflags & O_APPEND)) + _fcntl_r (ptr, fd, F_SETFL, fdflags | O_APPEND); +#endif + fp->_file = fd; + fp->_cookie = (void *) fp; + +#undef _read +#undef _write +#undef _seek +#undef _close + + fp->_read = __sread; + fp->_write = __swrite64; + fp->_seek = __sseek; + fp->_seek64 = __sseek64; + fp->_close = __sclose; + +#ifdef __SCLE + /* Explicit given mode results in explicit setting mode on fd */ + if (oflags & O_BINARY) + setmode(fp->_file, O_BINARY); + else if (oflags & O_TEXT) + setmode(fp->_file, O_TEXT); + if (__stextmode(fp->_file)) + fp->_flags |= __SCLE; +#endif + + fp->_flags |= __SL64; + + _newlib_flockfile_end(fp); + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +fdopen64 (int fd, + const char *mode) +{ + return _fdopen64_r (_REENT, fd, mode); +} + +#endif diff --git a/lib/stdio64/fgetpos64.c b/lib/stdio64/fgetpos64.c new file mode 100644 index 0000000..52ead9d --- /dev/null +++ b/lib/stdio64/fgetpos64.c @@ -0,0 +1,72 @@ +/* +FUNCTION +<>---record position in a large stream or file + +INDEX + fgetpos64 +INDEX + _fgetpos64_r + +SYNOPSIS + #include + int fgetpos64(FILE *<[fp]>, _fpos64_t *<[pos]>); + int _fgetpos64_r(struct _reent *<[ptr]>, FILE *<[fp]>, + _fpos64_t *<[pos]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <> to report on the current position for a file +identified by <[fp]> that was opened by <>; <> will write +a value representing that position at <<*<[pos]>>>. Later, you can +use this value with <> to return the file to this +position. + +In the current implementation, <> simply uses a character +count to represent the file position; this is the same number that +would be returned by <>. + +RETURNS +<> returns <<0>> when successful. If <> fails, the +result is <<1>>. Failure occurs on streams that do not support +positioning or streams not opened via <>; the global <> +indicates these conditions with the value <>. + +PORTABILITY +<> is a glibc extension. + +No supporting OS subroutines are required. +*/ + +#include + +#ifdef __LARGE64_FILES + +int +_fgetpos64_r (struct _reent * ptr, + FILE * fp, + _fpos64_t * pos) +{ + *pos = (_fpos64_t)_ftello64_r (ptr, fp); + + if (*pos != -1) + { + return 0; + } + return 1; +} + +#ifndef _REENT_ONLY + +int +fgetpos64 (FILE * fp, + _fpos64_t * pos) +{ + return _fgetpos64_r (_REENT, fp, pos); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/fopen64.c b/lib/stdio64/fopen64.c new file mode 100644 index 0000000..75d2c2c --- /dev/null +++ b/lib/stdio64/fopen64.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---open a large file + +INDEX + fopen64 +INDEX + _fopen64_r + +SYNOPSIS + #include + FILE *fopen64(const char *<[file]>, const char *<[mode]>); + FILE *_fopen64_r(void *<[reent]>, + const char *<[file]>, const char *<[mode]>); + +DESCRIPTION +<> is identical to <> except it opens a large file that +is potentially >2GB in size. See <> for further details. + +RETURNS +<> return a file pointer which you can use for other file +operations, unless the file you requested could not be opened; in that +situation, the result is <>. If the reason for failure was an +invalid string at <[mode]>, <> is set to <>. + +PORTABILITY +<> is a glibc extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>. +*/ + +/* Copied from fopen.c */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include "local.h" +#ifdef __CYGWIN__ +#include +#endif +#include + +#ifdef __LARGE64_FILES + +FILE * +_fopen64_r (struct _reent *ptr, + const char *file, + const char *mode) +{ + register FILE *fp; + register int f; + int flags, oflags; + + if ((flags = __sflags (ptr, mode, &oflags)) == 0) + return NULL; + if ((fp = __sfp (ptr)) == NULL) + return NULL; + + if ((f = _open64_r (ptr, file, oflags, 0666)) < 0) + { + _newlib_sfp_lock_start (); + fp->_flags = 0; /* release */ +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + _newlib_sfp_lock_end (); + return NULL; + } + + _newlib_flockfile_start (fp); + + fp->_file = f; + fp->_flags = flags; + fp->_cookie = (void *) fp; + fp->_read = __sread; + fp->_write = __swrite64; + fp->_seek = __sseek; + fp->_seek64 = __sseek64; + fp->_close = __sclose; + + if (fp->_flags & __SAPP) + _fseeko64_r (ptr, fp, 0, SEEK_END); + +#ifdef __SCLE + if (__stextmode (fp->_file)) + fp->_flags |= __SCLE; +#endif + + fp->_flags |= __SL64; + + _newlib_flockfile_end (fp); + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +fopen64 (const char *file, + const char *mode) +{ + return _fopen64_r (_REENT, file, mode); +} + +#endif + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/freopen64.c b/lib/stdio64/freopen64.c new file mode 100644 index 0000000..4d1e9b7 --- /dev/null +++ b/lib/stdio64/freopen64.c @@ -0,0 +1,258 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---open a large file using an existing file descriptor + +INDEX + freopen64 +INDEX + _freopen64_r + +SYNOPSIS + #include + FILE *freopen64(const char *<[file]>, const char *<[mode]>, + FILE *<[fp]>); + FILE *_freopen64_r(struct _reent *<[ptr]>, const char *<[file]>, + const char *<[mode]>, FILE *<[fp]>); + +DESCRIPTION +Use this variant of <> if you wish to specify a particular file +descriptor <[fp]> (notably <>, <>, or <>) for +the file. + +If <[fp]> was associated with another file or stream, <> +closes that other file or stream (but ignores any errors while closing +it). + +<[file]> and <[mode]> are used just as in <>. + +If <[file]> is <>, the underlying stream is modified rather than +closed. The file cannot be given a more permissive access mode (for +example, a <[mode]> of "w" will fail on a read-only file descriptor), +but can change status such as append or binary mode. If modification +is not possible, failure occurs. + +RETURNS +If successful, the result is the same as the argument <[fp]>. If the +file cannot be opened as specified, the result is <>. + +PORTABILITY +<> is a glibc extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +/* + * Re-direct an existing, open (probably) file to some other file. + */ + +#ifdef __LARGE64_FILES + +FILE * +_freopen64_r (struct _reent *ptr, + const char *file, + const char *mode, + register FILE *fp) +{ + register int f; + int flags, oflags, oflags2; + int e = 0; + + + CHECK_INIT (ptr, fp); + + /* We can't use the _newlib_flockfile_XXX macros here due to the + interlocked locking with the sfp_lock. */ +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + int __oldcancel; + pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &__oldcancel); +#endif + oflags2 = fp->_flags2; + if (!(oflags2 & __SNLK)) + _flockfile (fp); + + if ((flags = __sflags (ptr, mode, &oflags)) == 0) + { + if (!(oflags2 & __SNLK)) + _funlockfile (fp); +#ifdef _STDIO_WITH_THREAD_CANCELLATION_SUPPORT + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + _fclose_r (ptr, fp); + return NULL; + } + + /* + * Remember whether the stream was open to begin with, and + * which file descriptor (if any) was associated with it. + * If it was attached to a descriptor, defer closing it, + * so that, e.g., freopen("/dev/stdin", "r", stdin) works. + * This is unnecessary if it was not a Unix file. + */ + + if (fp->_flags == 0) + fp->_flags = __SEOF; /* hold on to it */ + else + { + if (fp->_flags & __SWR) + _fflush_r (ptr, fp); + /* + * If close is NULL, closing is a no-op, hence pointless. + * If file is NULL, the file should not be closed. + */ + if (fp->_close != NULL && file != NULL) + fp->_close (ptr, fp->_cookie); + } + + /* + * Now get a new descriptor to refer to the new file, or reuse the + * existing file descriptor if file is NULL. + */ + + if (file != NULL) + { + f = _open64_r (ptr, (char *) file, oflags, 0666); + e = _REENT_ERRNO(ptr); + } + else + { +#ifdef HAVE_FCNTL + int oldflags; + /* + * Reuse the file descriptor, but only if the new access mode is + * equal or less permissive than the old. F_SETFL correctly + * ignores creation flags. + */ + f = fp->_file; + if ((oldflags = _fcntl_r (ptr, f, F_GETFL, 0)) == -1 + || ! ((oldflags & O_ACCMODE) == O_RDWR + || ((oldflags ^ oflags) & O_ACCMODE) == 0) + || _fcntl_r (ptr, f, F_SETFL, oflags) == -1) + f = -1; +#else + /* We cannot modify without fcntl support. */ + f = -1; +#endif + +#ifdef __SCLE + /* + * F_SETFL doesn't change textmode. Don't mess with modes of ttys. + */ + if (0 <= f && ! isatty (f) + && setmode (f, oflags & (O_BINARY | O_TEXT)) == -1) + f = -1; +#endif + + if (f < 0) + { + e = EBADF; + if (fp->_close != NULL) + fp->_close (ptr, fp->_cookie); + } + } + + /* + * Finish closing fp. Even if the open succeeded above, + * we cannot keep fp->_base: it may be the wrong size. + * This loses the effect of any setbuffer calls, + * but stdio has always done this before. + */ + + if (fp->_flags & __SMBF) + _free_r (ptr, (char *) fp->_bf._base); + fp->_w = 0; + fp->_r = 0; + fp->_p = NULL; + fp->_bf._base = NULL; + fp->_bf._size = 0; + fp->_lbfsize = 0; + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_ub._size = 0; + if (HASLB (fp)) + FREELB (ptr, fp); + fp->_lb._size = 0; + fp->_flags &= ~__SORD; + fp->_flags2 &= ~__SWID; + memset (&fp->_mbstate, 0, sizeof (_mbstate_t)); + + if (f < 0) + { /* did not get it after all */ + __sfp_lock_acquire (); + fp->_flags = 0; /* set it free */ + _REENT_ERRNO(ptr) = e; /* restore in case _close clobbered */ + if (!(oflags2 & __SNLK)) + _funlockfile (fp); +#ifndef __SINGLE_THREAD__ + __lock_close_recursive (fp->_lock); +#endif + __sfp_lock_release (); +#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS) + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + return NULL; + } + + fp->_flags = flags; + fp->_file = f; + fp->_cookie = (void *) fp; + fp->_read = __sread; + fp->_write = __swrite64; + fp->_seek = __sseek; + fp->_seek64 = __sseek64; + fp->_close = __sclose; + +#ifdef __SCLE + if (__stextmode(fp->_file)) + fp->_flags |= __SCLE; +#endif + + fp->_flags |= __SL64; + + if (!(oflags2 & __SNLK)) + _funlockfile (fp); +#if !defined (__SINGLE_THREAD__) && defined (_POSIX_THREADS) + pthread_setcancelstate (__oldcancel, &__oldcancel); +#endif + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +freopen64 (const char *file, + const char *mode, + register FILE *fp) +{ + return _freopen64_r (_REENT, file, mode, fp); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/fseeko64.c b/lib/stdio64/fseeko64.c new file mode 100644 index 0000000..c5b30ae --- /dev/null +++ b/lib/stdio64/fseeko64.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---set file position for large file + +INDEX + fseeko64 +INDEX + _fseeko64_r + +SYNOPSIS + #include + int fseeko64(FILE *<[fp]>, _off64_t <[offset]>, int <[whence]>); + int _fseeko64_r (struct _reent *<[ptr]>, FILE *<[fp]>, + _off64_t <[offset]>, int <[whence]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <> to set the position for the file identified by +<[fp]> that was opened via <>. The value of <[offset]> determines +the new position, in one of three ways selected by the value of <[whence]> +(defined as macros in `<>'): + +<>---<[offset]> is the absolute file position (an offset +from the beginning of the file) desired. <[offset]> must be positive. + +<>---<[offset]> is relative to the current file position. +<[offset]> can meaningfully be either positive or negative. + +<>---<[offset]> is relative to the current end of file. +<[offset]> can meaningfully be either positive (to increase the size +of the file) or negative. + +See <> to determine the current file position. + +RETURNS +<> returns <<0>> when successful. On failure, the +result is <>. The reason for failure is indicated in <>: +either <> (the stream identified by <[fp]> doesn't support +repositioning or wasn't opened via <>) or <> +(invalid file position). + +PORTABILITY +<> is a glibc extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +#define POS_ERR (-(_fpos64_t)1) + +#ifdef __LARGE64_FILES + +/* + * Seek the given file to the given offset. + * `Whence' must be one of the three SEEK_* macros. + */ + +_off64_t +_fseeko64_r (struct _reent *ptr, + register FILE *fp, + _off64_t offset, + int whence) +{ + _fpos64_t (*seekfn) (struct _reent *, void *, _fpos64_t, int); + _fpos64_t target, curoff; + size_t n; + + struct stat64 st; + int havepos; + + /* Only do 64-bit seek on large file. */ + if (!(fp->_flags & __SL64)) + { + if ((_off_t) offset != offset) + { + _REENT_ERRNO(ptr) = EOVERFLOW; + return EOF; + } + return (_off64_t) _fseeko_r (ptr, fp, offset, whence); + } + + /* Make sure stdio is set up. */ + + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start (fp); + + curoff = fp->_offset; + + /* If we've been doing some writing, and we're in append mode + then we don't really know where the filepos is. */ + + if (fp->_flags & __SAPP && fp->_flags & __SWR) + { + /* So flush the buffer and seek to the end. */ + _fflush_r (ptr, fp); + } + + /* Have to be able to seek. */ + + if ((seekfn = fp->_seek64) == NULL) + { + _REENT_ERRNO(ptr) = ESPIPE; /* ??? */ + _newlib_flockfile_exit(fp); + return EOF; + } + + /* + * Change any SEEK_CUR to SEEK_SET, and check `whence' argument. + * After this, whence is either SEEK_SET or SEEK_END. + */ + + switch (whence) + { + case SEEK_CUR: + /* + * In order to seek relative to the current stream offset, + * we have to first find the current stream offset a la + * ftell (see ftell for details). + */ + _fflush_r (ptr, fp); /* may adjust seek offset on append stream */ + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else + { + curoff = seekfn (ptr, fp->_cookie, (_fpos64_t) 0, SEEK_CUR); + if (curoff == -1L) + { + _newlib_flockfile_exit(fp); + return EOF; + } + } + if (fp->_flags & __SRD) + { + curoff -= fp->_r; + if (HASUB (fp)) + curoff -= fp->_ur; + } + else if (fp->_flags & __SWR && fp->_p != NULL) + curoff += fp->_p - fp->_bf._base; + + offset += curoff; + whence = SEEK_SET; + havepos = 1; + break; + + case SEEK_SET: + case SEEK_END: + havepos = 0; + break; + + default: + _REENT_ERRNO(ptr) = EINVAL; + _newlib_flockfile_exit(fp); + return (EOF); + } + + /* + * Can only optimise if: + * reading (and not reading-and-writing); + * not unbuffered; and + * this is a `regular' Unix file (and hence seekfn==__sseek). + * We must check __NBF first, because it is possible to have __NBF + * and __SOPT both set. + */ + + if (fp->_bf._base == NULL) + __smakebuf_r (ptr, fp); + +#if _FSEEK_OPTIMIZATION + if (fp->_flags & (__SWR | __SRW | __SNBF | __SNPT)) + goto dumb; + if ((fp->_flags & __SOPT) == 0) + { + if (seekfn != __sseek64 + || fp->_file < 0 + || _fstat64_r (ptr, fp->_file, &st) + || (st.st_mode & S_IFMT) != S_IFREG) + { + fp->_flags |= __SNPT; + goto dumb; + } +#ifdef HAVE_BLKSIZE + fp->_blksize = st.st_blksize; +#else + fp->_blksize = 1024; +#endif + fp->_flags |= __SOPT; + } + + /* + * We are reading; we can try to optimise. + * Figure out where we are going and where we are now. + */ + + if (whence == SEEK_SET) + target = offset; + else + { + if (_fstat64_r (ptr, fp->_file, &st)) + goto dumb; + target = st.st_size + offset; + } + + if (!havepos) + { + if (fp->_flags & __SOFF) + curoff = fp->_offset; + else + { + curoff = seekfn (ptr, fp->_cookie, (_fpos64_t)0, SEEK_CUR); + if (curoff == POS_ERR) + goto dumb; + } + curoff -= fp->_r; + if (HASUB (fp)) + curoff -= fp->_ur; + } + + /* + * Compute the number of bytes in the input buffer (pretending + * that any ungetc() input has been discarded). Adjust current + * offset backwards by this count so that it represents the + * file offset for the first byte in the current input buffer. + */ + + if (HASUB (fp)) + { + curoff += fp->_r; /* kill off ungetc */ + n = fp->_up - fp->_bf._base; + curoff -= n; + n += fp->_ur; + } + else + { + n = fp->_p - fp->_bf._base; + curoff -= n; + n += fp->_r; + } + + /* + * If the target offset is within the current buffer, + * simply adjust the pointers, clear EOF, undo ungetc(), + * and return. + */ + + if (target >= curoff && target < curoff + n) + { + register int o = target - curoff; + + fp->_p = fp->_bf._base + o; + fp->_r = n - o; + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_flags &= ~__SEOF; + _newlib_flockfile_exit(fp); + return 0; + } + + /* + * The place we want to get to is not within the current buffer, + * but we can still be kind to the kernel copyout mechanism. + * By aligning the file offset to a block boundary, we can let + * the kernel use the VM hardware to map pages instead of + * copying bytes laboriously. Using a block boundary also + * ensures that we only read one block, rather than two. + */ + + curoff = target & ~((_fpos64_t)(fp->_blksize - 1)); + if (seekfn (ptr, fp->_cookie, curoff, SEEK_SET) == POS_ERR) + goto dumb; + fp->_r = 0; + fp->_p = fp->_bf._base; + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_flags &= ~__SEOF; + n = target - curoff; + if (n) + { + if (__srefill_r (ptr, fp) || fp->_r < n) + goto dumb; + fp->_p += n; + fp->_r -= n; + } + _newlib_flockfile_end(fp); + return 0; + + /* + * We get here if we cannot optimise the seek ... just + * do it. Allow the seek function to change fp->_bf._base. + */ +#endif + +dumb: + if (_fflush_r (ptr, fp) + || seekfn (ptr, fp->_cookie, offset, whence) == POS_ERR) + { + _funlockfile(fp); + return EOF; + } + /* success: clear EOF indicator and discard ungetc() data */ + if (HASUB (fp)) + FREEUB (ptr, fp); + fp->_p = fp->_bf._base; + fp->_r = 0; + /* fp->_w = 0; *//* unnecessary (I think...) */ + fp->_flags &= ~__SEOF; + _funlockfile(fp); + return 0; +} + +#ifndef _REENT_ONLY + +_off64_t +fseeko64 (register FILE *fp, + _off64_t offset, + int whence) +{ + return _fseeko64_r (_REENT, fp, offset, whence); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/fsetpos64.c b/lib/stdio64/fsetpos64.c new file mode 100644 index 0000000..254eb53 --- /dev/null +++ b/lib/stdio64/fsetpos64.c @@ -0,0 +1,66 @@ +/* +FUNCTION +<>---restore position of a large stream or file + +INDEX + fsetpos64 +INDEX + _fsetpos64_r + +SYNOPSIS + #include + int fsetpos64(FILE *<[fp]>, const _fpos64_t *<[pos]>); + int _fsetpos64_r(struct _reent *<[ptr]>, FILE *<[fp]>, + const _fpos64_t *<[pos]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +You can use <> to return the large file identified by <[fp]> to a +previous position <<*<[pos]>>> (after first recording it with <>). + +See <> for a similar facility. + +RETURNS +<> returns <<0>> when successful. If <> fails, the +result is <<1>>. The reason for failure is indicated in <>: +either <> (the stream identified by <[fp]> doesn't support +64-bit repositioning) or <> (invalid file position). + +PORTABILITY +<> is a glibc extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include + +#ifdef __LARGE64_FILES + +int +_fsetpos64_r (struct _reent *ptr, + FILE * iop, + const _fpos64_t * pos) +{ + int x = _fseeko64_r (ptr, iop, (_off64_t)(*pos), SEEK_SET); + + if (x != 0) + return 1; + return 0; +} + +#ifndef _REENT_ONLY + +int +fsetpos64 (FILE * iop, + const _fpos64_t * pos) +{ + return _fsetpos64_r (_REENT, iop, pos); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/ftello64.c b/lib/stdio64/ftello64.c new file mode 100644 index 0000000..cd00def --- /dev/null +++ b/lib/stdio64/ftello64.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* +FUNCTION +<>---return position in a stream or file + +INDEX + ftello64 +INDEX + _ftello64_r + +SYNOPSIS + #include + _off64_t ftello64(FILE *<[fp]>); + _off64_t _ftello64_r(struct _reent *<[ptr]>, FILE *<[fp]>); + +DESCRIPTION +Objects of type <> can have a ``position'' that records how much +of the file your program has already read. Many of the <> functions +depend on this position, and many change it as a side effect. + +The result of <> is the current position for a large file +identified by <[fp]>. If you record this result, you can later +use it with <> to return the file to this +position. The difference between <> and <> is that +<> returns <> and <> is designed to work +for large files (>2GB) and returns <<_off64_t>>. + +In the current implementation, <> simply uses a character +count to represent the file position; this is the same number that +would be recorded by <>. + +The function exists only if the __LARGE64_FILES flag is defined. +An error occurs if the <[fp]> was not opened via <>. + +RETURNS +<> returns the file position, if possible. If it cannot do +this, it returns <<-1>>. Failure occurs on streams that do not support +positioning or not opened via <>; the global <> indicates +this condition with the value <>. + +PORTABILITY +<> is a glibc extension. + +No supporting OS subroutines are required. +*/ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "%W% (Berkeley) %G%"; +#endif /* LIBC_SCCS and not lint */ + +/* + * ftello64: return current offset. + */ + +#include +#include + +#include "local.h" + +#ifdef __LARGE64_FILES + +_off64_t +_ftello64_r (struct _reent *ptr, + register FILE * fp) +{ + _fpos64_t pos; + + /* Only do 64-bit tell on large file. */ + if (!(fp->_flags & __SL64)) + return (_off64_t) _ftello_r (ptr, fp); + + /* Ensure stdio is set up. */ + + CHECK_INIT (ptr, fp); + + _newlib_flockfile_start(fp); + + if (fp->_seek64 == NULL) + { + _REENT_ERRNO(ptr) = ESPIPE; + _newlib_flockfile_exit(fp); + return (_off64_t) -1; + } + + /* Find offset of underlying I/O object, then adjust for buffered bytes. */ + if (!(fp->_flags & __SRD) && (fp->_flags & __SWR) && + fp->_p != NULL && fp->_p - fp->_bf._base > 0 && + (fp->_flags & __SAPP)) + { + pos = fp->_seek64 (ptr, fp->_cookie, (_fpos64_t) 0, SEEK_END); + if (pos == (_fpos64_t) -1) + { + _newlib_flockfile_exit (fp); + return (_off64_t) -1; + } + } + else if (fp->_flags & __SOFF) + pos = fp->_offset; + else + { + pos = fp->_seek64 (ptr, fp->_cookie, (_fpos64_t) 0, SEEK_CUR); + if (pos == (_fpos64_t) -1) + { + _newlib_flockfile_exit(fp); + return (_off64_t) pos; + } + } + if (fp->_flags & __SRD) + { + /* + * Reading. Any unread characters (including + * those from ungetc) cause the position to be + * smaller than that in the underlying object. + */ + pos -= fp->_r; + if (HASUB (fp)) + pos -= fp->_ur; + } + else if (fp->_flags & __SWR && fp->_p != NULL) + { + /* + * Writing. Any buffered characters cause the + * position to be greater than that in the + * underlying object. + */ + pos += fp->_p - fp->_bf._base; + } + + _newlib_flockfile_end(fp); + return (_off64_t) pos; +} + +#ifndef _REENT_ONLY + +_off64_t +ftello64 (register FILE * fp) +{ + return _ftello64_r (_REENT, fp); +} + +#endif /* !_REENT_ONLY */ + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/stdio64.c b/lib/stdio64/stdio64.c new file mode 100644 index 0000000..95cb252 --- /dev/null +++ b/lib/stdio64/stdio64.c @@ -0,0 +1,79 @@ +/* No user fns here. Pesch 15apr92. */ + +/* + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * and/or other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include +#include +#include +#include +#include +#include "local.h" + +#ifdef __LARGE64_FILES +_fpos64_t +__sseek64 (struct _reent *ptr, + void *cookie, + _fpos64_t offset, + int whence) +{ + register FILE *fp = (FILE *) cookie; + register _off64_t ret; + + ret = _lseek64_r (ptr, fp->_file, (_off64_t) offset, whence); + if (ret == (_fpos64_t)-1L) + fp->_flags &= ~__SOFF; + else + { + fp->_flags |= __SOFF; + fp->_offset = ret; + } + return ret; +} + +_READ_WRITE_RETURN_TYPE +__swrite64 (struct _reent *ptr, + void *cookie, + char const *buf, + _READ_WRITE_BUFSIZE_TYPE n) +{ + register FILE *fp = (FILE *) cookie; + _READ_WRITE_RETURN_TYPE w; +#ifdef __SCLE + int oldmode=0; +#endif + + if (fp->_flags & __SAPP) + (void) _lseek64_r (ptr, fp->_file, (_off64_t)0, SEEK_END); + fp->_flags &= ~__SOFF; /* in case O_APPEND mode is set */ + +#ifdef __SCLE + if (fp->_flags & __SCLE) + oldmode = setmode(fp->_file, O_BINARY); +#endif + + w = _write_r (ptr, fp->_file, buf, n); + +#ifdef __SCLE + if (oldmode) + setmode(fp->_file, oldmode); +#endif + + return w; +} + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdio64/stdio64.tex b/lib/stdio64/stdio64.tex new file mode 100644 index 0000000..95f898f --- /dev/null +++ b/lib/stdio64/stdio64.tex @@ -0,0 +1,46 @@ +@node Stdio64 +@chapter Large File Input and Output (@file{stdio.h}) + +This chapter comprises additional functions to manage large files which +are potentially larger than 2GB. + +The underlying facilities for input and output depend on the host +system, but these functions provide a uniform interface. + +The corresponding declarations are in @file{stdio.h}. + +@menu +* fdopen64:: Turn open large file into a stream +* fopen64:: Open a large file +* freopen64:: Open a large file using an existing file descriptor +* fsetpos64:: Restore position of a large stream or file +* fgetpos64:: Get position of a large stream or file +* ftello64:: Return position in a large stream or file +* fseeko64:: Set large file position +* tmpfile64:: Create a temporary large file +@end menu + +@page +@include stdio64/fdopen64.def + +@page +@include stdio64/fopen64.def + +@page +@include stdio64/freopen64.def + +@page +@include stdio64/ftello64.def + +@page +@include stdio64/fseeko64.def + +@page +@include stdio64/fgetpos64.def + +@page +@include stdio64/fsetpos64.def + +@page +@include stdio64/tmpfile64.def + diff --git a/lib/stdio64/tmpfile64.c b/lib/stdio64/tmpfile64.c new file mode 100644 index 0000000..35b035c --- /dev/null +++ b/lib/stdio64/tmpfile64.c @@ -0,0 +1,93 @@ +/* +FUNCTION +<>---create a large temporary file + +INDEX + tmpfile64 +INDEX + _tmpfile64_r + +SYNOPSIS + #include + FILE *tmpfile64(void); + + FILE *_tmpfile64_r(void *<[reent]>); + +DESCRIPTION +Create a large temporary file (a file which will be deleted automatically), +using a name generated by <>. The temporary file is opened with +the mode <<"wb+">>, permitting you to read and write anywhere in it +as a binary file (without any data transformations the host system may +perform for text files). The file may be larger than 2GB. + +The alternate function <<_tmpfile64_r>> is a reentrant version. The +argument <[reent]> is a pointer to a reentrancy structure. + +Both <> and <<_tmpfile64_r>> are only defined if __LARGE64_FILES +is defined. + +RETURNS +<> normally returns a pointer to the temporary file. If no +temporary file could be created, the result is NULL, and <> +records the reason for failure. + +PORTABILITY +<> is a glibc extension. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>, <>, <>. + +<> also requires the global pointer <>. +*/ + +#include +#include +#include +#include +#include + +#ifndef O_BINARY +# define O_BINARY 0 +#endif + +#ifdef __LARGE64_FILES + +FILE * +_tmpfile64_r (struct _reent *ptr) +{ + FILE *fp; + int e; + char *f; + char buf[L_tmpnam]; + int fd; + + do + { + if ((f = _tmpnam_r (ptr, buf)) == NULL) + return NULL; + fd = _open64_r (ptr, f, O_RDWR | O_CREAT | O_EXCL | O_BINARY, + S_IRUSR | S_IWUSR); + } + while (fd < 0 && _REENT_ERRNO(ptr) == EEXIST); + if (fd < 0) + return NULL; + fp = _fdopen64_r (ptr, fd, "wb+"); + e = _REENT_ERRNO(ptr); + if (!fp) + _close_r (ptr, fd); + (void) _remove_r (ptr, f); + _REENT_ERRNO(ptr) = e; + return fp; +} + +#ifndef _REENT_ONLY + +FILE * +tmpfile64 (void) +{ + return _tmpfile64_r (_REENT); +} + +#endif + +#endif /* __LARGE64_FILES */ diff --git a/lib/stdlib/Makefile.inc b/lib/stdlib/Makefile.inc new file mode 100644 index 0000000..9812add --- /dev/null +++ b/lib/stdlib/Makefile.inc @@ -0,0 +1,247 @@ +libc_a_SOURCES += \ + %D%/__adjust.c \ + %D%/__atexit.c \ + %D%/__call_atexit.c \ + %D%/__exp10.c \ + %D%/__ten_mu.c \ + %D%/_Exit.c \ + %D%/abort.c \ + %D%/abs.c \ + %D%/aligned_alloc.c \ + %D%/assert.c \ + %D%/atexit.c \ + %D%/atof.c \ + %D%/atoff.c \ + %D%/atoi.c \ + %D%/atol.c \ + %D%/calloc.c \ + %D%/callocr.c \ + %D%/cfreer.c \ + %D%/div.c \ + %D%/dtoa.c \ + %D%/dtoastub.c \ + %D%/environ.c \ + %D%/envlock.c \ + %D%/eprintf.c \ + %D%/exit.c \ + %D%/freer.c \ + %D%/gdtoa-gethex.c \ + %D%/gdtoa-hexnan.c \ + %D%/getenv.c \ + %D%/getenv_r.c \ + %D%/imaxabs.c \ + %D%/imaxdiv.c \ + %D%/itoa.c \ + %D%/labs.c \ + %D%/ldiv.c \ + %D%/ldtoa.c \ + %D%/gdtoa-ldtoa.c \ + %D%/gdtoa-gdtoa.c \ + %D%/gdtoa-dmisc.c \ + %D%/gdtoa-gmisc.c \ + %D%/mallinfor.c \ + %D%/malloc.c \ + %D%/mallocr.c \ + %D%/mallstatsr.c \ + %D%/mblen.c \ + %D%/mblen_r.c \ + %D%/mbstowcs.c \ + %D%/mbstowcs_r.c \ + %D%/mbtowc.c \ + %D%/mbtowc_r.c \ + %D%/mlock.c \ + %D%/mprec.c \ + %D%/msizer.c \ + %D%/mstats.c \ + %D%/on_exit_args.c \ + %D%/quick_exit.c \ + %D%/rand.c \ + %D%/rand_r.c \ + %D%/random.c \ + %D%/realloc.c \ + %D%/reallocarray.c \ + %D%/reallocf.c \ + %D%/reallocr.c \ + %D%/sb_charsets.c \ + %D%/strtod.c \ + %D%/strtoimax.c \ + %D%/strtol.c \ + %D%/strtoul.c \ + %D%/strtoumax.c \ + %D%/utoa.c \ + %D%/wcstod.c \ + %D%/wcstoimax.c \ + %D%/wcstol.c \ + %D%/wcstoul.c \ + %D%/wcstoumax.c \ + %D%/wcstombs.c \ + %D%/wcstombs_r.c \ + %D%/wctomb.c \ + %D%/wctomb_r.c + +if HAVE_LONG_DOUBLE +libc_a_SOURCES += \ + %D%/strtodg.c \ + %D%/strtold.c \ + %D%/strtorx.c \ + %D%/wcstold.c +endif # HAVE_LONG_DOUBLE + +if NEWLIB_NANO_MALLOC +MALIGNR = nano-malignr +MALLOPTR = nano-malloptr +PVALLOCR = nano-pvallocr +VALLOCR = nano-vallocr +FREER = nano-freer +REALLOCR = nano-reallocr +CALLOCR = nano-callocr +CFREER = nano-cfreer +MALLINFOR = nano-mallinfor +MALLSTATSR = nano-mallstatsr +MSIZER = nano-msizer +MALLOCR = nano-mallocr +else +MALIGNR = malignr +MALLOPTR = malloptr +PVALLOCR = pvallocr +VALLOCR = vallocr +FREER = freer +REALLOCR = reallocr +CALLOCR = callocr +CFREER = cfreer +MALLINFOR = mallinfor +MALLSTATSR = mallstatsr +MSIZER = msizer +MALLOCR = mallocr +endif + +libc_a_SOURCES += \ + %D%/arc4random.c \ + %D%/arc4random_uniform.c \ + %D%/cxa_atexit.c \ + %D%/cxa_finalize.c \ + %D%/drand48.c \ + %D%/ecvtbuf.c \ + %D%/efgcvt.c \ + %D%/erand48.c \ + %D%/jrand48.c \ + %D%/lcong48.c \ + %D%/lrand48.c \ + %D%/mrand48.c \ + %D%/msize.c \ + %D%/mtrim.c \ + %D%/nrand48.c \ + %D%/rand48.c \ + %D%/seed48.c \ + %D%/srand48.c \ + %D%/strtoll.c \ + %D%/strtoll_r.c \ + %D%/strtoull.c \ + %D%/strtoull_r.c \ + %D%/wcstoll.c \ + %D%/wcstoll_r.c \ + %D%/wcstoull.c \ + %D%/wcstoull_r.c \ + %D%/atoll.c \ + %D%/llabs.c \ + %D%/lldiv.c + +%C%_ELIX_2_SOURCES = \ + %D%/a64l.c \ + %D%/btowc.c \ + %D%/getopt.c \ + %D%/getsubopt.c \ + %D%/l64a.c \ + %D%/malign.c \ + %D%/malignr.c \ + %D%/malloptr.c \ + %D%/mbrlen.c \ + %D%/mbrtowc.c \ + %D%/mbsinit.c \ + %D%/mbsnrtowcs.c \ + %D%/mbsrtowcs.c \ + %D%/on_exit.c \ + %D%/pvallocr.c \ + %D%/valloc.c \ + %D%/vallocr.c \ + %D%/wcrtomb.c \ + %D%/wcsnrtombs.c \ + %D%/wcsrtombs.c \ + %D%/wctob.c + +%C%_ELIX_3_SOURCES = \ + %D%/putenv.c \ + %D%/putenv_r.c \ + %D%/setenv.c \ + %D%/setenv_r.c + +%C%_ELIX_4_SOURCES = \ + %D%/rpmatch.c \ + %D%/system.c + +if ELIX_LEVEL_1 +%C%_ELIX_SOURCES = +else +if ELIX_LEVEL_2 +%C%_ELIX_SOURCES = $(%C%_ELIX_2_SOURCES) +else +if ELIX_LEVEL_3 +%C%_ELIX_SOURCES = $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_3_SOURCES) +else +%C%_ELIX_SOURCES = $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_3_SOURCES) $(%C%_ELIX_4_SOURCES) +endif +endif +endif +libc_a_SOURCES += $(%C%_ELIX_SOURCES) + +LIBC_CHEWOUT_FILES += \ + %D%/_Exit.def \ + %D%/a64l.def \ + %D%/abort.def \ + %D%/abs.def \ + %D%/assert.def \ + %D%/atexit.def \ + %D%/atof.def \ + %D%/atoi.def \ + %D%/atoll.def \ + %D%/calloc.def \ + %D%/div.def \ + %D%/ecvtbuf.def \ + %D%/efgcvt.def \ + %D%/envlock.def \ + %D%/exit.def \ + %D%/getenv.def \ + %D%/itoa.def \ + %D%/labs.def \ + %D%/ldiv.def \ + %D%/llabs.def \ + %D%/lldiv.def \ + %D%/malloc.def \ + %D%/mblen.def \ + %D%/mbsnrtowcs.def \ + %D%/mbstowcs.def \ + %D%/mbtowc.def \ + %D%/mlock.def \ + %D%/mstats.def \ + %D%/on_exit.def \ + %D%/rand.def \ + %D%/rand48.def \ + %D%/random.def \ + %D%/rpmatch.def \ + %D%/strtod.def \ + %D%/strtol.def \ + %D%/strtoll.def \ + %D%/strtoul.def \ + %D%/strtoull.def \ + %D%/utoa.def \ + %D%/wcsnrtombs.def \ + %D%/wcstod.def \ + %D%/wcstol.def \ + %D%/wcstoll.def \ + %D%/wcstoul.def \ + %D%/wcstoull.def \ + %D%/system.def \ + %D%/wcstombs.def \ + %D%/wctomb.def + +LIBC_CHAPTERS += %D%/stdlib.tex diff --git a/lib/stdlib/_Exit.c b/lib/stdlib/_Exit.c new file mode 100644 index 0000000..8e205a0 --- /dev/null +++ b/lib/stdlib/_Exit.c @@ -0,0 +1,40 @@ +/* +FUNCTION +<<_Exit>>---end program execution with no cleanup processing + +INDEX + _Exit + +SYNOPSIS + #include + void _Exit(int <[code]>); + +DESCRIPTION +Use <<_Exit>> to return control from a program to the host operating +environment. Use the argument <[code]> to pass an exit status to the +operating environment: two particular values, <> and +<>, are defined in `<>' to indicate success or +failure in a portable fashion. + +<<_Exit>> differs from <> in that it does not run any +application-defined cleanup functions registered with <> and +it does not clean up files and streams. It is identical to <<_exit>>. + +RETURNS +<<_Exit>> does not return to its caller. + +PORTABILITY +<<_Exit>> is defined by the C99 standard. + +Supporting OS subroutines required: <<_exit>>. +*/ + +#include +#include /* for _exit() declaration */ +#include + +void +_Exit (int code) +{ + _exit (code); +} diff --git a/lib/stdlib/__adjust.c b/lib/stdlib/__adjust.c new file mode 100644 index 0000000..ab6f125 --- /dev/null +++ b/lib/stdlib/__adjust.c @@ -0,0 +1,43 @@ +/* + * return (*acc) scaled by 10**dexp. + */ + +#include <_ansi.h> +#include +#include "std.h" + +#define abs(x) (((x) < 0) ? -(x) : (x)) + +double +__adjust (struct _reent *ptr, + double *acc, + int dexp, + int sign) + /* *acc the 64 bit accumulator */ + /* dexp decimal exponent */ + /* sign sign flag */ +{ + double r; + + if (dexp > MAXE) + { + _REENT_ERRNO(ptr) = ERANGE; + return (sign) ? -HUGE_VAL : HUGE_VAL; + } + else if (dexp < MINE) + { + _REENT_ERRNO(ptr) = ERANGE; + return 0.0; + } + + r = *acc; + if (sign) + r = -r; + if (dexp == 0) + return r; + + if (dexp < 0) + return r / __exp10 (abs (dexp)); + else + return r * __exp10 (dexp); +} diff --git a/lib/stdlib/__atexit.c b/lib/stdlib/__atexit.c new file mode 100644 index 0000000..e59f04c --- /dev/null +++ b/lib/stdlib/__atexit.c @@ -0,0 +1,154 @@ +/* + * Common routine to implement atexit-like functionality. + * + * This is also the key function to be configured as lite exit, a size-reduced + * implementation of exit that doesn't invoke clean-up functions such as _fini + * or global destructors. + * + * Default (without lite exit) call graph is like: + * _start -> atexit -> __register_exitproc + * _start -> __libc_init_array -> __cxa_atexit -> __register_exitproc + * on_exit -> __register_exitproc + * _start -> exit -> __call_exitprocs + * + * Here an -> means arrow tail invokes arrow head. All invocations here + * are non-weak reference in current newlib/libgloss. + * + * Lite exit makes some of above calls as weak reference, so that size expansive + * functions __register_exitproc and __call_exitprocs may not be linked. These + * calls are: + * _start w-> atexit + * __cxa_atexit w-> __register_exitproc + * exit w-> __call_exitprocs + * + * Lite exit also makes sure that __call_exitprocs will be referenced as non-weak + * whenever __register_exitproc is referenced as non-weak. + * + * Thus with lite exit libs, a program not explicitly calling atexit or on_exit + * will escape from the burden of cleaning up code. A program with atexit or on_exit + * will work consistently to normal libs. + * + * Lite exit is enabled with --enable-lite-exit, and is controlled with macro + * _LITE_EXIT. + */ + +#include +#include +#include +#include +#include "atexit.h" + +/* Make this a weak reference to avoid pulling in malloc. */ +#ifndef MALLOC_PROVIDED +void * malloc(size_t) _ATTRIBUTE((__weak__)); +#endif + +#ifdef _LITE_EXIT +/* As __call_exitprocs is weak reference in lite exit, make a + non-weak reference to it here. */ +const void * __atexit_dummy = &__call_exitprocs; +#endif + +#ifndef __SINGLE_THREAD__ +extern _LOCK_RECURSIVE_T __atexit_recursive_mutex; +#endif + +struct _atexit __atexit0 = _ATEXIT_INIT; + +/* + * Register a function to be performed at exit or on shared library unload. + */ + +int +__register_exitproc (int type, + void (*fn) (void), + void *arg, + void *d) +{ + struct _on_exit_args * args; + register struct _atexit *p; + +#ifndef __SINGLE_THREAD__ + __lock_acquire_recursive(__atexit_recursive_mutex); +#endif + + p = __atexit; + if (p == NULL) + { + __atexit = p = &__atexit0; +#ifdef _REENT_SMALL + extern struct _on_exit_args * const __on_exit_args _ATTRIBUTE ((weak)); + if (&__on_exit_args != NULL) + p->_on_exit_args_ptr = __on_exit_args; +#endif /* def _REENT_SMALL */ + } + if (p->_ind >= _ATEXIT_SIZE) + { +#if !defined (_ATEXIT_DYNAMIC_ALLOC) || !defined (MALLOC_PROVIDED) +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_recursive_mutex); +#endif + return -1; +#else + p = (struct _atexit *) malloc (sizeof *p); + if (p == NULL) + { +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_recursive_mutex); +#endif + return -1; + } + p->_ind = 0; + p->_next = __atexit; + __atexit = p; +#ifndef _REENT_SMALL + p->_on_exit_args._fntypes = 0; + p->_on_exit_args._is_cxa = 0; +#else + p->_on_exit_args_ptr = NULL; +#endif +#endif + } + + if (type != __et_atexit) + { +#ifdef _REENT_SMALL + args = p->_on_exit_args_ptr; + if (args == NULL) + { +#ifndef _ATEXIT_DYNAMIC_ALLOC +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_recursive_mutex); +#endif + return -1; +#else + if (malloc) + args = malloc (sizeof * p->_on_exit_args_ptr); + + if (args == NULL) + { +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_recursive_mutex); +#endif + return -1; + } + args->_fntypes = 0; + args->_is_cxa = 0; + p->_on_exit_args_ptr = args; +#endif + } +#else + args = &p->_on_exit_args; +#endif + args->_fnargs[p->_ind] = arg; + args->_fntypes |= (1 << p->_ind); + args->_dso_handle[p->_ind] = d; + if (type == __et_cxa) + args->_is_cxa |= (1 << p->_ind); + } + p->_fns[p->_ind++] = fn; +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_recursive_mutex); +#endif + return 0; +} diff --git a/lib/stdlib/__call_atexit.c b/lib/stdlib/__call_atexit.c new file mode 100644 index 0000000..7104403 --- /dev/null +++ b/lib/stdlib/__call_atexit.c @@ -0,0 +1,159 @@ +/* + * COmmon routine to call call registered atexit-like routines. + */ + + +#include +#include +#include +#include "atexit.h" + +/* Make this a weak reference to avoid pulling in free. */ +#ifndef MALLOC_PROVIDED +void free(void *) _ATTRIBUTE((__weak__)); +#endif + +#ifndef __SINGLE_THREAD__ +__LOCK_INIT_RECURSIVE(, __atexit_recursive_mutex); +#endif + +struct _atexit *__atexit = _NULL; + +#ifdef _WANT_REGISTER_FINI + +/* If "__libc_fini" is defined, finalizers (either + "__libc_fini_array", or "_fini", as appropriate) will be run after + all user-specified atexit handlers. For example, you can define + "__libc_fini" to "_fini" in your linker script if you want the C + library, rather than startup code, to register finalizers. If you + do that, then your startup code need not contain references to + "atexit" or "exit". As a result, only applications that reference + "exit" explicitly will pull in finalization code. + + The choice of whether to register finalizers from libc or from + startup code is deferred to link-time, rather than being a + configure-time option, so that the same C library binary can be + used with multiple BSPs, some of which register finalizers from + startup code, while others defer to the C library. */ +extern char __libc_fini __attribute__((weak)); + +/* Register the application finalization function with atexit. These + finalizers should run last. Therefore, we want to call atexit as + soon as possible. */ +static void +register_fini(void) __attribute__((constructor (0))); + +static void +register_fini(void) +{ + if (&__libc_fini) { +#ifdef _HAVE_INITFINI_ARRAY + extern void __libc_fini_array (void); + atexit (__libc_fini_array); +#else + extern void _fini (void); + atexit (_fini); +#endif + } +} + +#endif /* _WANT_REGISTER_FINI */ + +/* + * Call registered exit handlers. If D is null then all handlers are called, + * otherwise only the handlers from that DSO are called. + */ + +void +__call_exitprocs (int code, void *d) +{ + register struct _atexit *p; + struct _atexit **lastp; + register struct _on_exit_args * args; + register int n; + int i; + void (*fn) (void); + + +#ifndef __SINGLE_THREAD__ + __lock_acquire_recursive(__atexit_recursive_mutex); +#endif + + restart: + + p = __atexit; + lastp = &__atexit; + while (p) + { +#ifdef _REENT_SMALL + args = p->_on_exit_args_ptr; +#else + args = &p->_on_exit_args; +#endif + for (n = p->_ind - 1; n >= 0; n--) + { + int ind; + + i = 1 << n; + + /* Skip functions not from this dso. */ + if (d && (!args || args->_dso_handle[n] != d)) + continue; + + /* Remove the function now to protect against the + function calling exit recursively. */ + fn = p->_fns[n]; + if (n == p->_ind - 1) + p->_ind--; + else + p->_fns[n] = NULL; + + /* Skip functions that have already been called. */ + if (!fn) + continue; + + ind = p->_ind; + + /* Call the function. */ + if (!args || (args->_fntypes & i) == 0) + fn (); + else if ((args->_is_cxa & i) == 0) + (*((void (*)(int, void *)) fn))(code, args->_fnargs[n]); + else + (*((void (*)(void *)) fn))(args->_fnargs[n]); + + /* The function we called call atexit and registered another + function (or functions). Call these new functions before + continuing with the already registered functions. */ + if (ind != p->_ind || *lastp != p) + goto restart; + } + +#if !defined (_ATEXIT_DYNAMIC_ALLOC) || !defined (MALLOC_PROVIDED) + break; +#else + /* Move to the next block. Free empty blocks except the last one, + which is part of _GLOBAL_REENT. */ + if (p->_ind == 0 && p->_next) + { + /* Remove empty block from the list. */ + *lastp = p->_next; +#ifdef _REENT_SMALL + if (args) + free (args); +#endif + free (p); + p = *lastp; + } + else + { + lastp = &p->_next; + p = p->_next; + } +#endif + } +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_recursive_mutex); +#endif + +} diff --git a/lib/stdlib/__exp10.c b/lib/stdlib/__exp10.c new file mode 100644 index 0000000..cf22374 --- /dev/null +++ b/lib/stdlib/__exp10.c @@ -0,0 +1,29 @@ +/* + * compute 10**x by successive squaring. + */ + +#include <_ansi.h> +#include "std.h" + +double +__exp10 (unsigned x) +{ + static const double powtab[] = + {1.0, + 10.0, + 100.0, + 1000.0, + 10000.0}; + + if (x < (sizeof (powtab) / sizeof (double))) + return powtab[x]; + else if (x & 1) + { + return 10.0 * __exp10 (x - 1); + } + else + { + double n = __exp10 (x / 2); + return n * n; + } +} diff --git a/lib/stdlib/__ten_mu.c b/lib/stdlib/__ten_mu.c new file mode 100644 index 0000000..25af8d0 --- /dev/null +++ b/lib/stdlib/__ten_mu.c @@ -0,0 +1,23 @@ +/* + * [atw] multiply 64 bit accumulator by 10 and add digit. + * The KA/CA way to do this should be to use + * a 64-bit integer internally and use "adjust" to + * convert it to float at the end of processing. + */ + +#include <_ansi.h> +#include "std.h" + +int +__ten_mul (double *acc, + int digit) +{ + /* + * [atw] Crude, but effective (at least on a KB)... + */ + + *acc *= 10; + *acc += digit; + + return 0; /* no overflow */ +} diff --git a/lib/stdlib/_mallocr.c b/lib/stdlib/_mallocr.c new file mode 100644 index 0000000..1997b6d --- /dev/null +++ b/lib/stdlib/_mallocr.c @@ -0,0 +1,3721 @@ +#include +#ifdef MALLOC_PROVIDED +int _dummy_mallocr = 1; +#elif defined(_NANO_MALLOC) +# include "nano-mallocr.c" +#else +/* ---------- To make a malloc.h, start cutting here ------------ */ + +/* + A version of malloc/free/realloc written by Doug Lea and released to the + public domain. Send questions/comments/complaints/performance data + to dl@cs.oswego.edu + +* VERSION 2.6.5 Wed Jun 17 15:55:16 1998 Doug Lea (dl at gee) + + Note: There may be an updated version of this malloc obtainable at + ftp://g.oswego.edu/pub/misc/malloc.c + Check before installing! + + Note: This version differs from 2.6.4 only by correcting a + statement ordering error that could cause failures only + when calls to this malloc are interposed with calls to + other memory allocators. + +* Why use this malloc? + + This is not the fastest, most space-conserving, most portable, or + most tunable malloc ever written. However it is among the fastest + while also being among the most space-conserving, portable and tunable. + Consistent balance across these factors results in a good general-purpose + allocator. For a high-level description, see + http://g.oswego.edu/dl/html/malloc.html + +* Synopsis of public routines + + (Much fuller descriptions are contained in the program documentation below.) + + malloc(size_t n); + Return a pointer to a newly allocated chunk of at least n bytes, or null + if no space is available. + free(Void_t* p); + Release the chunk of memory pointed to by p, or no effect if p is null. + realloc(Void_t* p, size_t n); + Return a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. The returned pointer may or may not be + the same as p. If p is null, equivalent to malloc. Unless the + #define REALLOC_ZERO_BYTES_FREES below is set, realloc with a + size argument of zero (re)allocates a minimum-sized chunk. + memalign(size_t alignment, size_t n); + Return a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument, which must be a power of + two. + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system (or as near to this as can be figured out from + all the includes/defines below.) + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + calloc(size_t unit, size_t quantity); + Returns a pointer to quantity * unit bytes, with all locations + set to zero. + cfree(Void_t* p); + Equivalent to free(p). + malloc_trim(size_t pad); + Release all but pad bytes of freed top-most memory back + to the system. Return 1 if successful, else 0. + malloc_usable_size(Void_t* p); + Report the number usable allocated bytes associated with allocated + chunk p. This may or may not report more bytes than were requested, + due to alignment and minimum size constraints. + malloc_stats(); + Prints brief summary statistics on stderr. + mallinfo() + Returns (by copy) a struct containing various summary statistics. + mallopt(int parameter_number, int parameter_value) + Changes one of the tunable parameters described below. Returns + 1 if successful in changing the parameter, else 0. + +* Vital statistics: + + Alignment: 8-byte + 8 byte alignment is currently hardwired into the design. This + seems to suffice for all current machines and C compilers. + + Assumed pointer representation: 4 or 8 bytes + Code for 8-byte pointers is untested by me but has worked + reliably by Wolfram Gloger, who contributed most of the + changes supporting this. + + Assumed size_t representation: 4 or 8 bytes + Note that size_t is allowed to be 4 bytes even if pointers are 8. + + Minimum overhead per allocated chunk: 4 or 8 bytes + Each malloced chunk has a hidden overhead of 4 bytes holding size + and status information. + + Minimum allocated size: 4-byte ptrs: 16 bytes (including 4 overhead) + 8-byte ptrs: 24/32 bytes (including, 4/8 overhead) + + When a chunk is freed, 12 (for 4byte ptrs) or 20 (for 8 byte + ptrs but 4 byte size) or 24 (for 8/8) additional bytes are + needed; 4 (8) for a trailing size field + and 8 (16) bytes for free list pointers. Thus, the minimum + allocatable size is 16/24/32 bytes. + + Even a request for zero bytes (i.e., malloc(0)) returns a + pointer to something of the minimum allocatable size. + + Maximum allocated size: 4-byte size_t: 2^31 - 8 bytes + 8-byte size_t: 2^63 - 16 bytes + + It is assumed that (possibly signed) size_t bit values suffice to + represent chunk sizes. `Possibly signed' is due to the fact + that `size_t' may be defined on a system as either a signed or + an unsigned type. To be conservative, values that would appear + as negative numbers are avoided. + Requests for sizes with a negative sign bit will return a + minimum-sized chunk. + + Maximum overhead wastage per allocated chunk: normally 15 bytes + + Alignnment demands, plus the minimum allocatable size restriction + make the normal worst-case wastage 15 bytes (i.e., up to 15 + more bytes will be allocated than were requested in malloc), with + two exceptions: + 1. Because requests for zero bytes allocate non-zero space, + the worst case wastage for a request of zero bytes is 24 bytes. + 2. For requests >= mmap_threshold that are serviced via + mmap(), the worst case wastage is 8 bytes plus the remainder + from a system page (the minimal mmap unit); typically 4096 bytes. + +* Limitations + + Here are some features that are NOT currently supported + + * No user-definable hooks for callbacks and the like. + * No automated mechanism for fully checking that all accesses + to malloced memory stay within their bounds. + * No support for compaction. + +* Synopsis of compile-time options: + + People have reported using previous versions of this malloc on all + versions of Unix, sometimes by tweaking some of the defines + below. It has been tested most extensively on Solaris and + Linux. It is also reported to work on WIN32 platforms. + People have also reported adapting this malloc for use in + stand-alone embedded systems. + + The implementation is in straight, hand-tuned ANSI C. Among other + consequences, it uses a lot of macros. Because of this, to be at + all usable, this code should be compiled using an optimizing compiler + (for example gcc -O2) that can simplify expressions and control + paths. + + __STD_C (default: derived from C compiler defines) + Nonzero if using ANSI-standard C compiler, a C++ compiler, or + a C compiler sufficiently close to ANSI to get away with it. + DEBUG (default: NOT defined) + Define to enable debugging. Adds fairly extensive assertion-based + checking to help track down memory errors, but noticeably slows down + execution. + SEPARATE_OBJECTS (default: NOT defined) + Define this to compile into separate .o files. You must then + compile malloc.c several times, defining a DEFINE_* macro each + time. The list of DEFINE_* macros appears below. + MALLOC_LOCK (default: NOT defined) + MALLOC_UNLOCK (default: NOT defined) + Define these to C expressions which are run to lock and unlock + the malloc data structures. Calls may be nested; that is, + MALLOC_LOCK may be called more than once before the corresponding + MALLOC_UNLOCK calls. MALLOC_LOCK must avoid waiting for a lock + that it already holds. + MALLOC_ALIGNMENT (default: NOT defined) + Define this to 16 if you need 16 byte alignment instead of 8 byte alignment + which is the normal default. + REALLOC_ZERO_BYTES_FREES (default: NOT defined) + Define this if you think that realloc(p, 0) should be equivalent + to free(p). Otherwise, since malloc returns a unique pointer for + malloc(0), so does realloc(p, 0). + HAVE_MEMCPY (default: defined) + Define if you are not otherwise using ANSI STD C, but still + have memcpy and memset in your C library and want to use them. + Otherwise, simple internal versions are supplied. + USE_MEMCPY (default: 1 if HAVE_MEMCPY is defined, 0 otherwise) + Define as 1 if you want the C library versions of memset and + memcpy called in realloc and calloc (otherwise macro versions are used). + At least on some platforms, the simple macro versions usually + outperform libc versions. + HAVE_MMAP (default: defined as 1) + Define to non-zero to optionally make malloc() use mmap() to + allocate very large blocks. + HAVE_MREMAP (default: defined as 0 unless Linux libc set) + Define to non-zero to optionally make realloc() use mremap() to + reallocate very large blocks. + malloc_getpagesize (default: derived from system #includes) + Either a constant or routine call returning the system page size. + HAVE_USR_INCLUDE_MALLOC_H (default: NOT defined) + Optionally define if you are on a system with a /usr/include/malloc.h + that declares struct mallinfo. It is not at all necessary to + define this even if you do, but will ensure consistency. + INTERNAL_SIZE_T (default: size_t) + Define to a 32-bit type (probably `unsigned int') if you are on a + 64-bit machine, yet do not want or need to allow malloc requests of + greater than 2^31 to be handled. This saves space, especially for + very small chunks. + INTERNAL_LINUX_C_LIB (default: NOT defined) + Defined only when compiled as part of Linux libc. + Also note that there is some odd internal name-mangling via defines + (for example, internally, `malloc' is named `mALLOc') needed + when compiling in this case. These look funny but don't otherwise + affect anything. + _LIBC (default: NOT defined) + Defined only when compiled as part of the Cygnus newlib + distribution. + WIN32 (default: undefined) + Define this on MS win (95, nt) platforms to compile in sbrk emulation. + LACKS_UNISTD_H (default: undefined) + Define this if your system does not have a . + MORECORE (default: sbrk) + The name of the routine to call to obtain more memory from the system. + MORECORE_FAILURE (default: -1) + The value returned upon failure of MORECORE. + MORECORE_CLEARS (default 1) + True (1) if the routine mapped to MORECORE zeroes out memory (which + holds for sbrk). + DEFAULT_TRIM_THRESHOLD + DEFAULT_TOP_PAD + DEFAULT_MMAP_THRESHOLD + DEFAULT_MMAP_MAX + Default values of tunable parameters (described in detail below) + controlling interaction with host system routines (sbrk, mmap, etc). + These values may also be changed dynamically via mallopt(). The + preset defaults are those that give best performance for typical + programs/systems. + + +*/ + + + + +/* Preliminaries */ + +#ifndef __STD_C +#ifdef __STDC__ +#define __STD_C 1 +#else +#if __cplusplus +#define __STD_C 1 +#else +#define __STD_C 0 +#endif /*__cplusplus*/ +#endif /*__STDC__*/ +#endif /*__STD_C*/ + +#ifndef Void_t +#if __STD_C +#define Void_t void +#else +#define Void_t char +#endif +#endif /*Void_t*/ + +#if __STD_C +#include /* for size_t */ +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include /* needed for malloc_stats */ +#include /* needed for overflow checks */ +#include /* needed to set errno to ENOMEM */ + +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#endif + +/* + Compile-time options +*/ + + +/* + + Special defines for Cygnus newlib distribution. + + */ + +#ifdef _LIBC + +#include + +/* + In newlib, all the publically visible routines take a reentrancy + pointer. We don't currently do anything much with it, but we do + pass it to the lock routine. + */ + +#include + +#define POINTER_UINT unsigned _POINTER_INT +#define SEPARATE_OBJECTS +#define HAVE_MMAP 0 +#define MORECORE(size) _sbrk_r(reent_ptr, (size)) +#define MORECORE_CLEARS 0 +#define MALLOC_LOCK __malloc_lock(reent_ptr) +#define MALLOC_UNLOCK __malloc_unlock(reent_ptr) + +#ifdef __CYGWIN__ +# undef _WIN32 +# undef WIN32 +#endif + +#ifndef _WIN32 +#ifndef HAVE_SYSCONF_PAGESIZE +#ifdef SMALL_MEMORY +#define malloc_getpagesize (128) +#else +#define malloc_getpagesize (4096) +#endif +#endif +#endif + +#if __STD_C +extern void __malloc_lock(struct _reent *); +extern void __malloc_unlock(struct _reent *); +#else +extern void __malloc_lock(); +extern void __malloc_unlock(); +#endif + +#if __STD_C +#define RARG struct _reent *reent_ptr, +#define RONEARG struct _reent *reent_ptr +#else +#define RARG reent_ptr +#define RONEARG reent_ptr +#define RDECL struct _reent *reent_ptr; +#endif + +#define RERRNO reent_ptr->_errno +#define RCALL reent_ptr, +#define RONECALL reent_ptr + +#else /* ! _LIBC */ + +#define POINTER_UINT unsigned long +#define RARG +#define RONEARG +#define RDECL +#define RERRNO errno +#define RCALL +#define RONECALL + +#endif /* ! _LIBC */ + +/* + Debugging: + + Because freed chunks may be overwritten with link fields, this + malloc will often die when freed memory is overwritten by user + programs. This can be very effective (albeit in an annoying way) + in helping track down dangling pointers. + + If you compile with -DDEBUG, a number of assertion checks are + enabled that will catch more memory errors. You probably won't be + able to make much sense of the actual assertion errors, but they + should help you locate incorrectly overwritten memory. The + checking is fairly extensive, and will slow down execution + noticeably. Calling malloc_stats or mallinfo with DEBUG set will + attempt to check every non-mmapped allocated and free chunk in the + course of computing the summmaries. (By nature, mmapped regions + cannot be checked very much automatically.) + + Setting DEBUG may also be helpful if you are trying to modify + this code. The assertions in the check routines spell out in more + detail the assumptions and invariants underlying the algorithms. + +*/ + +#if DEBUG +#include +#else +#define assert(x) ((void)0) +#endif + + +/* + SEPARATE_OBJECTS should be defined if you want each function to go + into a separate .o file. You must then compile malloc.c once per + function, defining the appropriate DEFINE_ macro. See below for the + list of macros. + */ + +#ifndef SEPARATE_OBJECTS +#define DEFINE_MALLOC +#define DEFINE_FREE +#define DEFINE_REALLOC +#define DEFINE_CALLOC +#define DEFINE_CFREE +#define DEFINE_MEMALIGN +#define DEFINE_VALLOC +#define DEFINE_PVALLOC +#define DEFINE_MALLINFO +#define DEFINE_MALLOC_STATS +#define DEFINE_MALLOC_USABLE_SIZE +#define DEFINE_MALLOPT + +#define STATIC static +#else +#define STATIC +#endif + +/* + Define MALLOC_LOCK and MALLOC_UNLOCK to C expressions to run to + lock and unlock the malloc data structures. MALLOC_LOCK may be + called recursively. + */ + +#ifndef MALLOC_LOCK +#define MALLOC_LOCK +#endif + +#ifndef MALLOC_UNLOCK +#define MALLOC_UNLOCK +#endif + +/* + INTERNAL_SIZE_T is the word-size used for internal bookkeeping + of chunk sizes. On a 64-bit machine, you can reduce malloc + overhead by defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' + at the expense of not being able to handle requests greater than + 2^31. This limitation is hardly ever a concern; you are encouraged + to set this. However, the default version is the same as size_t. +*/ + +#ifndef INTERNAL_SIZE_T +#define INTERNAL_SIZE_T size_t +#endif + +/* + Following is needed on implementations whereby long > size_t. + The problem is caused because the code performs subtractions of + size_t values and stores the result in long values. In the case + where long > size_t and the first value is actually less than + the second value, the resultant value is positive. For example, + (long)(x - y) where x = 0 and y is 1 ends up being 0x00000000FFFFFFFF + which is 2*31 - 1 instead of 0xFFFFFFFFFFFFFFFF. This is due to the + fact that assignment from unsigned to signed won't sign extend. +*/ + +#define long_sub_size_t(x, y) \ + (sizeof (long) > sizeof (INTERNAL_SIZE_T) && x < y \ + ? -(long) (y - x) \ + : (long) (x - y)) + +/* + REALLOC_ZERO_BYTES_FREES should be set if a call to + realloc with zero bytes should be the same as a call to free. + Some people think it should. Otherwise, since this malloc + returns a unique pointer for malloc(0), so does realloc(p, 0). +*/ + + +/* #define REALLOC_ZERO_BYTES_FREES */ + + +/* + WIN32 causes an emulation of sbrk to be compiled in + mmap-based options are not currently supported in WIN32. +*/ + +/* #define WIN32 */ +#ifdef WIN32 +#define MORECORE wsbrk +#define HAVE_MMAP 0 +#endif + + +/* + HAVE_MEMCPY should be defined if you are not otherwise using + ANSI STD C, but still have memcpy and memset in your C library + and want to use them in calloc and realloc. Otherwise simple + macro versions are defined here. + + USE_MEMCPY should be defined as 1 if you actually want to + have memset and memcpy called. People report that the macro + versions are often enough faster than libc versions on many + systems that it is better to use them. + +*/ + +#define HAVE_MEMCPY + +/* Although the original macro is called USE_MEMCPY, newlib actually + uses memmove to handle cases whereby a platform's memcpy implementation + copies backwards and thus destructive overlap may occur in realloc + whereby we are reclaiming free memory prior to the old allocation. */ +#ifndef USE_MEMCPY +#ifdef HAVE_MEMCPY +#define USE_MEMCPY 1 +#else +#define USE_MEMCPY 0 +#endif +#endif + +#if (__STD_C || defined(HAVE_MEMCPY)) + +#if __STD_C +void* memset(void*, int, size_t); +void* memcpy(void*, const void*, size_t); +void* memmove(void*, const void*, size_t); +#else +Void_t* memset(); +Void_t* memcpy(); +Void_t* memmove(); +#endif +#endif + +#if USE_MEMCPY + +/* The following macros are only invoked with (2n+1)-multiples of + INTERNAL_SIZE_T units, with a positive integer n. This is exploited + for fast inline execution when n is small. */ + +#define MALLOC_ZERO(charp, nbytes) \ +do { \ + INTERNAL_SIZE_T mzsz = (nbytes); \ + if(mzsz <= 9*sizeof(mzsz)) { \ + INTERNAL_SIZE_T* mz = (INTERNAL_SIZE_T*) (charp); \ + if(mzsz >= 5*sizeof(mzsz)) { *mz++ = 0; \ + *mz++ = 0; \ + if(mzsz >= 7*sizeof(mzsz)) { *mz++ = 0; \ + *mz++ = 0; \ + if(mzsz >= 9*sizeof(mzsz)) { *mz++ = 0; \ + *mz++ = 0; }}} \ + *mz++ = 0; \ + *mz++ = 0; \ + *mz = 0; \ + } else memset((charp), 0, mzsz); \ +} while(0) + +#define MALLOC_COPY(dest,src,nbytes) \ +do { \ + INTERNAL_SIZE_T mcsz = (nbytes); \ + if(mcsz <= 9*sizeof(mcsz)) { \ + INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) (src); \ + INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) (dest); \ + if(mcsz >= 5*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; \ + if(mcsz >= 7*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; \ + if(mcsz >= 9*sizeof(mcsz)) { *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; }}} \ + *mcdst++ = *mcsrc++; \ + *mcdst++ = *mcsrc++; \ + *mcdst = *mcsrc ; \ + } else memmove(dest, src, mcsz); \ +} while(0) + +#else /* !USE_MEMCPY */ + +/* Use Duff's device for good zeroing/copying performance. */ + +#define MALLOC_ZERO(charp, nbytes) \ +do { \ + INTERNAL_SIZE_T* mzp = (INTERNAL_SIZE_T*)(charp); \ + long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn; \ + if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \ + switch (mctmp) { \ + case 0: for(;;) { *mzp++ = 0; \ + case 7: *mzp++ = 0; \ + case 6: *mzp++ = 0; \ + case 5: *mzp++ = 0; \ + case 4: *mzp++ = 0; \ + case 3: *mzp++ = 0; \ + case 2: *mzp++ = 0; \ + case 1: *mzp++ = 0; if(mcn <= 0) break; mcn--; } \ + } \ +} while(0) + +#define MALLOC_COPY(dest,src,nbytes) \ +do { \ + INTERNAL_SIZE_T* mcsrc = (INTERNAL_SIZE_T*) src; \ + INTERNAL_SIZE_T* mcdst = (INTERNAL_SIZE_T*) dest; \ + long mctmp = (nbytes)/sizeof(INTERNAL_SIZE_T), mcn; \ + if (mctmp < 8) mcn = 0; else { mcn = (mctmp-1)/8; mctmp %= 8; } \ + switch (mctmp) { \ + case 0: for(;;) { *mcdst++ = *mcsrc++; \ + case 7: *mcdst++ = *mcsrc++; \ + case 6: *mcdst++ = *mcsrc++; \ + case 5: *mcdst++ = *mcsrc++; \ + case 4: *mcdst++ = *mcsrc++; \ + case 3: *mcdst++ = *mcsrc++; \ + case 2: *mcdst++ = *mcsrc++; \ + case 1: *mcdst++ = *mcsrc++; if(mcn <= 0) break; mcn--; } \ + } \ +} while(0) + +#endif + + +/* + Define HAVE_MMAP to optionally make malloc() use mmap() to + allocate very large blocks. These will be returned to the + operating system immediately after a free(). +*/ + +#ifndef HAVE_MMAP +#define HAVE_MMAP 1 +#endif + +/* + Define HAVE_MREMAP to make realloc() use mremap() to re-allocate + large blocks. This is currently only possible on Linux with + kernel versions newer than 1.3.77. +*/ + +#ifndef HAVE_MREMAP +#ifdef INTERNAL_LINUX_C_LIB +#define HAVE_MREMAP 1 +#else +#define HAVE_MREMAP 0 +#endif +#endif + +#if HAVE_MMAP + +#include +#include +#include + +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif + +#endif /* HAVE_MMAP */ + +/* + Access to system page size. To the extent possible, this malloc + manages memory from the system in page-size units. + + The following mechanics for getpagesize were adapted from + bsd/gnu getpagesize.h +*/ + +#ifndef LACKS_UNISTD_H +# include +#endif + +#ifndef malloc_getpagesize +# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ +# ifndef _SC_PAGE_SIZE +# define _SC_PAGE_SIZE _SC_PAGESIZE +# endif +# endif +# ifdef _SC_PAGE_SIZE +# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) +# else +# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) + extern size_t getpagesize(); +# define malloc_getpagesize getpagesize() +# else +# include +# ifdef EXEC_PAGESIZE +# define malloc_getpagesize EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define malloc_getpagesize NBPG +# else +# define malloc_getpagesize (NBPG * CLSIZE) +# endif +# else +# ifdef NBPC +# define malloc_getpagesize NBPC +# else +# ifdef PAGESIZE +# define malloc_getpagesize PAGESIZE +# else +# define malloc_getpagesize (4096) /* just guess */ +# endif +# endif +# endif +# endif +# endif +# endif +#endif + + + +/* + + This version of malloc supports the standard SVID/XPG mallinfo + routine that returns a struct containing the same kind of + information you can get from malloc_stats. It should work on + any SVID/XPG compliant system that has a /usr/include/malloc.h + defining struct mallinfo. (If you'd like to install such a thing + yourself, cut out the preliminary declarations as described above + and below and save them in a malloc.h file. But there's no + compelling reason to bother to do this.) + + The main declaration needed is the mallinfo struct that is returned + (by-copy) by mallinfo(). The SVID/XPG malloinfo struct contains a + bunch of fields, most of which are not even meaningful in this + version of malloc. Some of these fields are are instead filled by + mallinfo() with other numbers that might possibly be of interest. + + HAVE_USR_INCLUDE_MALLOC_H should be set if you have a + /usr/include/malloc.h file that includes a declaration of struct + mallinfo. If so, it is included; else an SVID2/XPG2 compliant + version is declared below. These must be precisely the same for + mallinfo() to work. + +*/ + +/* #define HAVE_USR_INCLUDE_MALLOC_H */ + +#if HAVE_USR_INCLUDE_MALLOC_H +#include "/usr/include/malloc.h" +#else + +/* SVID2/XPG mallinfo structure */ + +struct mallinfo { + int arena; /* total space allocated from system */ + int ordblks; /* number of non-inuse chunks */ + int smblks; /* unused -- always zero */ + int hblks; /* number of mmapped regions */ + int hblkhd; /* total space in mmapped regions */ + int usmblks; /* unused -- always zero */ + int fsmblks; /* unused -- always zero */ + int uordblks; /* total allocated space */ + int fordblks; /* total non-inuse space */ + int keepcost; /* top-most, releasable (via malloc_trim) space */ +}; + +/* SVID2/XPG mallopt options */ + +#define M_MXFAST 1 /* UNUSED in this malloc */ +#define M_NLBLKS 2 /* UNUSED in this malloc */ +#define M_GRAIN 3 /* UNUSED in this malloc */ +#define M_KEEP 4 /* UNUSED in this malloc */ + +#endif + +/* mallopt options that actually do something */ + +#define M_TRIM_THRESHOLD -1 +#define M_TOP_PAD -2 +#define M_MMAP_THRESHOLD -3 +#define M_MMAP_MAX -4 + + + +#ifndef DEFAULT_TRIM_THRESHOLD +#define DEFAULT_TRIM_THRESHOLD (128L * 1024L) +#endif + +/* + M_TRIM_THRESHOLD is the maximum amount of unused top-most memory + to keep before releasing via malloc_trim in free(). + + Automatic trimming is mainly useful in long-lived programs. + Because trimming via sbrk can be slow on some systems, and can + sometimes be wasteful (in cases where programs immediately + afterward allocate more large chunks) the value should be high + enough so that your overall system performance would improve by + releasing. + + The trim threshold and the mmap control parameters (see below) + can be traded off with one another. Trimming and mmapping are + two different ways of releasing unused memory back to the + system. Between these two, it is often possible to keep + system-level demands of a long-lived program down to a bare + minimum. For example, in one test suite of sessions measuring + the XF86 X server on Linux, using a trim threshold of 128K and a + mmap threshold of 192K led to near-minimal long term resource + consumption. + + If you are using this malloc in a long-lived program, it should + pay to experiment with these values. As a rough guide, you + might set to a value close to the average size of a process + (program) running on your system. Releasing this much memory + would allow such a process to run in memory. Generally, it's + worth it to tune for trimming rather tham memory mapping when a + program undergoes phases where several large chunks are + allocated and released in ways that can reuse each other's + storage, perhaps mixed with phases where there are no such + chunks at all. And in well-behaved long-lived programs, + controlling release of large blocks via trimming versus mapping + is usually faster. + + However, in most programs, these parameters serve mainly as + protection against the system-level effects of carrying around + massive amounts of unneeded memory. Since frequent calls to + sbrk, mmap, and munmap otherwise degrade performance, the default + parameters are set to relatively high values that serve only as + safeguards. + + The default trim value is high enough to cause trimming only in + fairly extreme (by current memory consumption standards) cases. + It must be greater than page size to have any useful effect. To + disable trimming completely, you can set to (unsigned long)(-1); + + +*/ + + +#ifndef DEFAULT_TOP_PAD +#define DEFAULT_TOP_PAD (0) +#endif + +/* + M_TOP_PAD is the amount of extra `padding' space to allocate or + retain whenever sbrk is called. It is used in two ways internally: + + * When sbrk is called to extend the top of the arena to satisfy + a new malloc request, this much padding is added to the sbrk + request. + + * When malloc_trim is called automatically from free(), + it is used as the `pad' argument. + + In both cases, the actual amount of padding is rounded + so that the end of the arena is always a system page boundary. + + The main reason for using padding is to avoid calling sbrk so + often. Having even a small pad greatly reduces the likelihood + that nearly every malloc request during program start-up (or + after trimming) will invoke sbrk, which needlessly wastes + time. + + Automatic rounding-up to page-size units is normally sufficient + to avoid measurable overhead, so the default is 0. However, in + systems where sbrk is relatively slow, it can pay to increase + this value, at the expense of carrying around more memory than + the program needs. + +*/ + + +#ifndef DEFAULT_MMAP_THRESHOLD +#define DEFAULT_MMAP_THRESHOLD (128 * 1024) +#endif + +/* + + M_MMAP_THRESHOLD is the request size threshold for using mmap() + to service a request. Requests of at least this size that cannot + be allocated using already-existing space will be serviced via mmap. + (If enough normal freed space already exists it is used instead.) + + Using mmap segregates relatively large chunks of memory so that + they can be individually obtained and released from the host + system. A request serviced through mmap is never reused by any + other request (at least not directly; the system may just so + happen to remap successive requests to the same locations). + + Segregating space in this way has the benefit that mmapped space + can ALWAYS be individually released back to the system, which + helps keep the system level memory demands of a long-lived + program low. Mapped memory can never become `locked' between + other chunks, as can happen with normally allocated chunks, which + menas that even trimming via malloc_trim would not release them. + + However, it has the disadvantages that: + + 1. The space cannot be reclaimed, consolidated, and then + used to service later requests, as happens with normal chunks. + 2. It can lead to more wastage because of mmap page alignment + requirements + 3. It causes malloc performance to be more dependent on host + system memory management support routines which may vary in + implementation quality and may impose arbitrary + limitations. Generally, servicing a request via normal + malloc steps is faster than going through a system's mmap. + + All together, these considerations should lead you to use mmap + only for relatively large requests. + + +*/ + + + +#ifndef DEFAULT_MMAP_MAX +#if HAVE_MMAP +#define DEFAULT_MMAP_MAX (64) +#else +#define DEFAULT_MMAP_MAX (0) +#endif +#endif + +/* + M_MMAP_MAX is the maximum number of requests to simultaneously + service using mmap. This parameter exists because: + + 1. Some systems have a limited number of internal tables for + use by mmap. + 2. In most systems, overreliance on mmap can degrade overall + performance. + 3. If a program allocates many large regions, it is probably + better off using normal sbrk-based allocation routines that + can reclaim and reallocate normal heap memory. Using a + small value allows transition into this mode after the + first few allocations. + + Setting to 0 disables all use of mmap. If HAVE_MMAP is not set, + the default value is 0, and attempts to set it to non-zero values + in mallopt will fail. +*/ + + + + +/* + + Special defines for linux libc + + Except when compiled using these special defines for Linux libc + using weak aliases, this malloc is NOT designed to work in + multithreaded applications. No semaphores or other concurrency + control are provided to ensure that multiple malloc or free calls + don't run at the same time, which could be disasterous. A single + semaphore could be used across malloc, realloc, and free (which is + essentially the effect of the linux weak alias approach). It would + be hard to obtain finer granularity. + +*/ + + +#ifdef INTERNAL_LINUX_C_LIB + +#if __STD_C + +Void_t * __default_morecore_init (ptrdiff_t); +Void_t *(*__morecore)(ptrdiff_t) = __default_morecore_init; + +#else + +Void_t * __default_morecore_init (); +Void_t *(*__morecore)() = __default_morecore_init; + +#endif + +#define MORECORE (*__morecore) +#define MORECORE_FAILURE 0 +#define MORECORE_CLEARS 1 + +#else /* INTERNAL_LINUX_C_LIB */ + +#ifndef _LIBC +#if __STD_C +extern Void_t* sbrk(ptrdiff_t); +#else +extern Void_t* sbrk(); +#endif +#endif + +#ifndef MORECORE +#define MORECORE sbrk +#endif + +#ifndef MORECORE_FAILURE +#define MORECORE_FAILURE -1 +#endif + +#ifndef MORECORE_CLEARS +#define MORECORE_CLEARS 1 +#endif + +#endif /* INTERNAL_LINUX_C_LIB */ + +#if defined(INTERNAL_LINUX_C_LIB) && defined(__ELF__) + +#define cALLOc __libc_calloc +#define fREe __libc_free +#define mALLOc __libc_malloc +#define mEMALIGn __libc_memalign +#define rEALLOc __libc_realloc +#define vALLOc __libc_valloc +#define pvALLOc __libc_pvalloc +#define mALLINFo __libc_mallinfo +#define mALLOPt __libc_mallopt + +#pragma weak calloc = __libc_calloc +#pragma weak free = __libc_free +#pragma weak cfree = __libc_free +#pragma weak malloc = __libc_malloc +#pragma weak memalign = __libc_memalign +#pragma weak realloc = __libc_realloc +#pragma weak valloc = __libc_valloc +#pragma weak pvalloc = __libc_pvalloc +#pragma weak mallinfo = __libc_mallinfo +#pragma weak mallopt = __libc_mallopt + +#else + +#ifdef _LIBC + +#define cALLOc _calloc_r +#define fREe _free_r +#define mALLOc _malloc_r +#define mEMALIGn _memalign_r +#define rEALLOc _realloc_r +#define vALLOc _valloc_r +#define pvALLOc _pvalloc_r +#define mALLINFo _mallinfo_r +#define mALLOPt _mallopt_r + +#define malloc_stats _malloc_stats_r +#define malloc_trim _malloc_trim_r +#define malloc_usable_size _malloc_usable_size_r + +#define malloc_update_mallinfo __malloc_update_mallinfo + +#define malloc_av_ __malloc_av_ +#define malloc_current_mallinfo __malloc_current_mallinfo +#define malloc_max_sbrked_mem __malloc_max_sbrked_mem +#define malloc_max_total_mem __malloc_max_total_mem +#define malloc_sbrk_base __malloc_sbrk_base +#define malloc_top_pad __malloc_top_pad +#define malloc_trim_threshold __malloc_trim_threshold + +#else /* ! _LIBC */ + +#define cALLOc calloc +#define fREe free +#define mALLOc malloc +#define mEMALIGn memalign +#define rEALLOc realloc +#define vALLOc valloc +#define pvALLOc pvalloc +#define mALLINFo mallinfo +#define mALLOPt mallopt + +#endif /* ! _LIBC */ +#endif + +/* Public routines */ + +#if __STD_C + +Void_t* mALLOc(RARG size_t); +void fREe(RARG Void_t*); +Void_t* rEALLOc(RARG Void_t*, size_t); +Void_t* mEMALIGn(RARG size_t, size_t); +Void_t* vALLOc(RARG size_t); +Void_t* pvALLOc(RARG size_t); +Void_t* cALLOc(RARG size_t, size_t); +void cfree(Void_t*); +int malloc_trim(RARG size_t); +size_t malloc_usable_size(RARG Void_t*); +void malloc_stats(RONEARG); +int mALLOPt(RARG int, int); +struct mallinfo mALLINFo(RONEARG); +#else +Void_t* mALLOc(); +void fREe(); +Void_t* rEALLOc(); +Void_t* mEMALIGn(); +Void_t* vALLOc(); +Void_t* pvALLOc(); +Void_t* cALLOc(); +void cfree(); +int malloc_trim(); +size_t malloc_usable_size(); +void malloc_stats(); +int mALLOPt(); +struct mallinfo mALLINFo(); +#endif + + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif + +/* ---------- To make a malloc.h, end cutting here ------------ */ + + +/* + Emulation of sbrk for WIN32 + All code within the ifdef WIN32 is untested by me. +*/ + + +#ifdef WIN32 + +#define AlignPage(add) (((add) + (malloc_getpagesize-1)) & \ +~(malloc_getpagesize-1)) + +/* resrve 64MB to insure large contiguous space */ +#define RESERVED_SIZE (1024*1024*64) +#define NEXT_SIZE (2048*1024) +#define TOP_MEMORY ((unsigned long)2*1024*1024*1024) + +struct GmListElement; +typedef struct GmListElement GmListElement; + +struct GmListElement +{ + GmListElement* next; + void* base; +}; + +static GmListElement* head = 0; +static unsigned int gNextAddress = 0; +static unsigned int gAddressBase = 0; +static unsigned int gAllocatedSize = 0; + +static +GmListElement* makeGmListElement (void* bas) +{ + GmListElement* this; + this = (GmListElement*)(void*)LocalAlloc (0, sizeof (GmListElement)); + ASSERT (this); + if (this) + { + this->base = bas; + this->next = head; + head = this; + } + return this; +} + +void gcleanup () +{ + BOOL rval; + ASSERT ( (head == NULL) || (head->base == (void*)gAddressBase)); + if (gAddressBase && (gNextAddress - gAddressBase)) + { + rval = VirtualFree ((void*)gAddressBase, + gNextAddress - gAddressBase, + MEM_DECOMMIT); + ASSERT (rval); + } + while (head) + { + GmListElement* next = head->next; + rval = VirtualFree (head->base, 0, MEM_RELEASE); + ASSERT (rval); + LocalFree (head); + head = next; + } +} + +static +void* findRegion (void* start_address, unsigned long size) +{ + MEMORY_BASIC_INFORMATION info; + while ((unsigned long)start_address < TOP_MEMORY) + { + VirtualQuery (start_address, &info, sizeof (info)); + if (info.State != MEM_FREE) + start_address = (char*)info.BaseAddress + info.RegionSize; + else if (info.RegionSize >= size) + return start_address; + else + start_address = (char*)info.BaseAddress + info.RegionSize; + } + return NULL; + +} + + +void* wsbrk (long size) +{ + void* tmp; + if (size > 0) + { + if (gAddressBase == 0) + { + gAllocatedSize = max (RESERVED_SIZE, AlignPage (size)); + gNextAddress = gAddressBase = + (unsigned int)VirtualAlloc (NULL, gAllocatedSize, + MEM_RESERVE, PAGE_NOACCESS); + } else if (AlignPage (gNextAddress + size) > (gAddressBase + +gAllocatedSize)) + { + long new_size = max (NEXT_SIZE, AlignPage (size)); + void* new_address = (void*)(gAddressBase+gAllocatedSize); + do + { + new_address = findRegion (new_address, new_size); + + if (new_address == 0) + return (void*)-1; + + gAddressBase = gNextAddress = + (unsigned int)VirtualAlloc (new_address, new_size, + MEM_RESERVE, PAGE_NOACCESS); + // repeat in case of race condition + // The region that we found has been snagged + // by another thread + } + while (gAddressBase == 0); + + ASSERT (new_address == (void*)gAddressBase); + + gAllocatedSize = new_size; + + if (!makeGmListElement ((void*)gAddressBase)) + return (void*)-1; + } + if ((size + gNextAddress) > AlignPage (gNextAddress)) + { + void* res; + res = VirtualAlloc ((void*)AlignPage (gNextAddress), + (size + gNextAddress - + AlignPage (gNextAddress)), + MEM_COMMIT, PAGE_READWRITE); + if (res == 0) + return (void*)-1; + } + tmp = (void*)gNextAddress; + gNextAddress = (unsigned int)tmp + size; + return tmp; + } + else if (size < 0) + { + unsigned int alignedGoal = AlignPage (gNextAddress + size); + /* Trim by releasing the virtual memory */ + if (alignedGoal >= gAddressBase) + { + VirtualFree ((void*)alignedGoal, gNextAddress - alignedGoal, + MEM_DECOMMIT); + gNextAddress = gNextAddress + size; + return (void*)gNextAddress; + } + else + { + VirtualFree ((void*)gAddressBase, gNextAddress - gAddressBase, + MEM_DECOMMIT); + gNextAddress = gAddressBase; + return (void*)-1; + } + } + else + { + return (void*)gNextAddress; + } +} + +#endif + + + +/* + Type declarations +*/ + + +struct malloc_chunk +{ + INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */ + INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk* mchunkptr; + +/* + + malloc_chunk details: + + (The following includes lightly edited explanations by Colin Plumb.) + + Chunks of memory are maintained using a `boundary tag' method as + described in e.g., Knuth or Standish. (See the paper by Paul + Wilson ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a + survey of such techniques.) Sizes of free chunks are stored both + in the front of each chunk and at the end. This makes + consolidating fragmented chunks into bigger chunks very fast. The + size fields also hold bits representing whether chunks are free or + in use. + + An allocated chunk looks like this: + + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk, if allocated | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | User data starts here... . + . . + . (malloc_usable_space() bytes) . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + + Where "chunk" is the front of the chunk for the purpose of most of + the malloc code, but "mem" is the pointer that is returned to the + user. "Nextchunk" is the beginning of the next contiguous chunk. + + Chunks always begin on even word boundries, so the mem portion + (which is returned to the user) is also on an even word boundary, and + thus double-word aligned. + + Free chunks are stored in circular doubly-linked lists, and look like this: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space (may be 0 bytes long) . + . . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + The P (PREV_INUSE) bit, stored in the unused low-order bit of the + chunk size (which is always a multiple of two words), is an in-use + bit for the *previous* chunk. If that bit is *clear*, then the + word before the current chunk size contains the previous chunk + size, and can be used to find the front of the previous chunk. + (The very first chunk allocated always has this bit set, + preventing access to non-existent (or non-owned) memory.) + + Note that the `foot' of the current chunk is actually represented + as the prev_size of the NEXT chunk. (This makes it easier to + deal with alignments etc). + + The two exceptions to all this are + + 1. The special chunk `top', which doesn't bother using the + trailing size field since there is no + next contiguous chunk that would have to index off it. (After + initialization, `top' is forced to always exist. If it would + become less than MINSIZE bytes long, it is replenished via + malloc_extend_top.) + + 2. Chunks allocated via mmap, which have the second-lowest-order + bit (IS_MMAPPED) set in their size fields. Because they are + never merged or traversed from any other chunk, they have no + foot size or inuse information. + + Available chunks are kept in any of several places (all declared below): + + * `av': An array of chunks serving as bin headers for consolidated + chunks. Each bin is doubly linked. The bins are approximately + proportionally (log) spaced. There are a lot of these bins + (128). This may look excessive, but works very well in + practice. All procedures maintain the invariant that no + consolidated chunk physically borders another one. Chunks in + bins are kept in size order, with ties going to the + approximately least recently used chunk. + + The chunks in each bin are maintained in decreasing sorted order by + size. This is irrelevant for the small bins, which all contain + the same-sized chunks, but facilitates best-fit allocation for + larger chunks. (These lists are just sequential. Keeping them in + order almost never requires enough traversal to warrant using + fancier ordered data structures.) Chunks of the same size are + linked with the most recently freed at the front, and allocations + are taken from the back. This results in LRU or FIFO allocation + order, which tends to give each chunk an equal opportunity to be + consolidated with adjacent freed chunks, resulting in larger free + chunks and less fragmentation. + + * `top': The top-most available chunk (i.e., the one bordering the + end of available memory) is treated specially. It is never + included in any bin, is used only if no other chunk is + available, and is released back to the system if it is very + large (see M_TRIM_THRESHOLD). + + * `last_remainder': A bin holding only the remainder of the + most recently split (non-top) chunk. This bin is checked + before other non-fitting chunks, so as to provide better + locality for runs of sequentially allocated chunks. + + * Implicitly, through the host system's memory mapping tables. + If supported, requests greater than a threshold are usually + serviced via calls to mmap, and then later released via munmap. + +*/ + + + + + + +/* sizes, alignments */ + +#define SIZE_SZ (sizeof(INTERNAL_SIZE_T)) +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGN 8 +#define MALLOC_ALIGNMENT (SIZE_SZ < 4 ? 8 : (SIZE_SZ + SIZE_SZ)) +#else +#define MALLOC_ALIGN MALLOC_ALIGNMENT +#endif +#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1) +#define MINSIZE (sizeof(struct malloc_chunk)) + +/* conversion from malloc headers to user pointers, and back */ + +#define chunk2mem(p) ((Void_t*)((char*)(p) + 2*SIZE_SZ)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ)) + +/* pad request bytes into a usable size */ + +#define request2size(req) \ + (((unsigned long)((req) + (SIZE_SZ + MALLOC_ALIGN_MASK)) < \ + (unsigned long)(MINSIZE + MALLOC_ALIGN_MASK)) ? ((MINSIZE + MALLOC_ALIGN_MASK) & ~(MALLOC_ALIGN_MASK)) : \ + (((req) + (SIZE_SZ + MALLOC_ALIGN_MASK)) & ~(MALLOC_ALIGN_MASK))) + +/* Check if m has acceptable alignment */ + +#define aligned_OK(m) (((unsigned long)((m)) & (MALLOC_ALIGN_MASK)) == 0) + + + + +/* + Physical chunk operations +*/ + + +/* size field is or'ed with PREV_INUSE when previous adjacent chunk in use */ + +#define PREV_INUSE 0x1 + +/* size field is or'ed with IS_MMAPPED if the chunk was obtained with mmap() */ + +#define IS_MMAPPED 0x2 + +/* Bits to mask off when extracting size */ + +#define SIZE_BITS (PREV_INUSE|IS_MMAPPED) + + +/* Ptr to next physical malloc_chunk. */ + +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->size & ~PREV_INUSE) )) + +/* Ptr to previous physical malloc_chunk */ + +#define prev_chunk(p)\ + ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) )) + + +/* Treat space at ptr + offset as a chunk */ + +#define chunk_at_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) + + + + +/* + Dealing with use bits +*/ + +/* extract p's inuse bit */ + +#define inuse(p)\ +((((mchunkptr)(((char*)(p))+((p)->size & ~PREV_INUSE)))->size) & PREV_INUSE) + +/* extract inuse bit of previous chunk */ + +#define prev_inuse(p) ((p)->size & PREV_INUSE) + +/* check for mmap()'ed chunk */ + +#define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED) + +/* set/clear chunk as in use without otherwise disturbing */ + +#define set_inuse(p)\ +((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size |= PREV_INUSE + +#define clear_inuse(p)\ +((mchunkptr)(((char*)(p)) + ((p)->size & ~PREV_INUSE)))->size &= ~(PREV_INUSE) + +/* check/set/clear inuse bits in known places */ + +#define inuse_bit_at_offset(p, s)\ + (((mchunkptr)(((char*)(p)) + (s)))->size & PREV_INUSE) + +#define set_inuse_bit_at_offset(p, s)\ + (((mchunkptr)(((char*)(p)) + (s)))->size |= PREV_INUSE) + +#define clear_inuse_bit_at_offset(p, s)\ + (((mchunkptr)(((char*)(p)) + (s)))->size &= ~(PREV_INUSE)) + + + + +/* + Dealing with size fields +*/ + +/* Get size, ignoring use bits */ + +#define chunksize(p) ((p)->size & ~(SIZE_BITS)) + +/* Set size at head, without disturbing its use bit */ + +#define set_head_size(p, s) ((p)->size = (((p)->size & PREV_INUSE) | (s))) + +/* Set size/use ignoring previous bits in header */ + +#define set_head(p, s) ((p)->size = (s)) + +/* Set size at footer (only when chunk is not in use) */ + +#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_size = (s)) + + + + + +/* + Bins + + The bins, `av_' are an array of pairs of pointers serving as the + heads of (initially empty) doubly-linked lists of chunks, laid out + in a way so that each pair can be treated as if it were in a + malloc_chunk. (This way, the fd/bk offsets for linking bin heads + and chunks are the same). + + Bins for sizes < 512 bytes contain chunks of all the same size, spaced + 8 bytes apart. Larger bins are approximately logarithmically + spaced. (See the table below.) The `av_' array is never mentioned + directly in the code, but instead via bin access macros. + + Bin layout: + + 64 bins of size 8 + 32 bins of size 64 + 16 bins of size 512 + 8 bins of size 4096 + 4 bins of size 32768 + 2 bins of size 262144 + 1 bin of size what's left + + There is actually a little bit of slop in the numbers in bin_index + for the sake of speed. This makes no difference elsewhere. + + The special chunks `top' and `last_remainder' get their own bins, + (this is implemented via yet more trickery with the av_ array), + although `top' is never properly linked to its bin since it is + always handled specially. + +*/ + +#ifdef SEPARATE_OBJECTS +#define av_ malloc_av_ +#endif + +#define NAV 128 /* number of bins */ + +typedef struct malloc_chunk* mbinptr; + +/* access macros */ + +#define bin_at(i) ((mbinptr)((char*)&(av_[2*(i) + 2]) - 2*SIZE_SZ)) +#define next_bin(b) ((mbinptr)((char*)(b) + 2 * sizeof(mbinptr))) +#define prev_bin(b) ((mbinptr)((char*)(b) - 2 * sizeof(mbinptr))) + +/* + The first 2 bins are never indexed. The corresponding av_ cells are instead + used for bookkeeping. This is not to save space, but to simplify + indexing, maintain locality, and avoid some initialization tests. +*/ + +#define top (bin_at(0)->fd) /* The topmost chunk */ +#define last_remainder (bin_at(1)) /* remainder from last split */ + + +/* + Because top initially points to its own bin with initial + zero size, thus forcing extension on the first malloc request, + we avoid having any special code in malloc to check whether + it even exists yet. But we still need to in malloc_extend_top. +*/ + +#define initial_top ((mchunkptr)(bin_at(0))) + +/* Helper macro to initialize bins */ + +#define IAV(i) bin_at(i), bin_at(i) + +#ifdef DEFINE_MALLOC +STATIC mbinptr av_[NAV * 2 + 2] = { + 0, 0, + IAV(0), IAV(1), IAV(2), IAV(3), IAV(4), IAV(5), IAV(6), IAV(7), + IAV(8), IAV(9), IAV(10), IAV(11), IAV(12), IAV(13), IAV(14), IAV(15), + IAV(16), IAV(17), IAV(18), IAV(19), IAV(20), IAV(21), IAV(22), IAV(23), + IAV(24), IAV(25), IAV(26), IAV(27), IAV(28), IAV(29), IAV(30), IAV(31), + IAV(32), IAV(33), IAV(34), IAV(35), IAV(36), IAV(37), IAV(38), IAV(39), + IAV(40), IAV(41), IAV(42), IAV(43), IAV(44), IAV(45), IAV(46), IAV(47), + IAV(48), IAV(49), IAV(50), IAV(51), IAV(52), IAV(53), IAV(54), IAV(55), + IAV(56), IAV(57), IAV(58), IAV(59), IAV(60), IAV(61), IAV(62), IAV(63), + IAV(64), IAV(65), IAV(66), IAV(67), IAV(68), IAV(69), IAV(70), IAV(71), + IAV(72), IAV(73), IAV(74), IAV(75), IAV(76), IAV(77), IAV(78), IAV(79), + IAV(80), IAV(81), IAV(82), IAV(83), IAV(84), IAV(85), IAV(86), IAV(87), + IAV(88), IAV(89), IAV(90), IAV(91), IAV(92), IAV(93), IAV(94), IAV(95), + IAV(96), IAV(97), IAV(98), IAV(99), IAV(100), IAV(101), IAV(102), IAV(103), + IAV(104), IAV(105), IAV(106), IAV(107), IAV(108), IAV(109), IAV(110), IAV(111), + IAV(112), IAV(113), IAV(114), IAV(115), IAV(116), IAV(117), IAV(118), IAV(119), + IAV(120), IAV(121), IAV(122), IAV(123), IAV(124), IAV(125), IAV(126), IAV(127) +}; +#else +extern mbinptr av_[NAV * 2 + 2]; +#endif + + + +/* field-extraction macros */ + +#define first(b) ((b)->fd) +#define last(b) ((b)->bk) + +/* + Indexing into bins +*/ + +#define bin_index(sz) \ +(((((unsigned long)(sz)) >> 9) == 0) ? (((unsigned long)(sz)) >> 3): \ + ((((unsigned long)(sz)) >> 9) <= 4) ? 56 + (((unsigned long)(sz)) >> 6): \ + ((((unsigned long)(sz)) >> 9) <= 20) ? 91 + (((unsigned long)(sz)) >> 9): \ + ((((unsigned long)(sz)) >> 9) <= 84) ? 110 + (((unsigned long)(sz)) >> 12): \ + ((((unsigned long)(sz)) >> 9) <= 340) ? 119 + (((unsigned long)(sz)) >> 15): \ + ((((unsigned long)(sz)) >> 9) <= 1364) ? 124 + (((unsigned long)(sz)) >> 18): \ + 126) +/* + bins for chunks < 512 are all spaced SMALLBIN_WIDTH bytes apart, and hold + identically sized chunks. This is exploited in malloc. +*/ + +#define MAX_SMALLBIN_SIZE 512 +#define SMALLBIN_WIDTH 8 +#define SMALLBIN_WIDTH_BITS 3 +#define MAX_SMALLBIN (MAX_SMALLBIN_SIZE / SMALLBIN_WIDTH) - 1 + +#define smallbin_index(sz) (((unsigned long)(sz)) >> SMALLBIN_WIDTH_BITS) + +/* + Requests are `small' if both the corresponding and the next bin are small +*/ + +#define is_small_request(nb) (nb < MAX_SMALLBIN_SIZE - SMALLBIN_WIDTH) + + + +/* + To help compensate for the large number of bins, a one-level index + structure is used for bin-by-bin searching. `binblocks' is a + one-word bitvector recording whether groups of BINBLOCKWIDTH bins + have any (possibly) non-empty bins, so they can be skipped over + all at once during during traversals. The bits are NOT always + cleared as soon as all bins in a block are empty, but instead only + when all are noticed to be empty during traversal in malloc. +*/ + +#define BINBLOCKWIDTH 4 /* bins per block */ + +#define binblocks (bin_at(0)->size) /* bitvector of nonempty blocks */ + +/* bin<->block macros */ + +#define idx2binblock(ix) ((unsigned long)1 << (ix / BINBLOCKWIDTH)) +#define mark_binblock(ii) (binblocks |= idx2binblock(ii)) +#define clear_binblock(ii) (binblocks &= ~(idx2binblock(ii))) + + + + + +/* Other static bookkeeping data */ + +#ifdef SEPARATE_OBJECTS +#define trim_threshold malloc_trim_threshold +#define top_pad malloc_top_pad +#define n_mmaps_max malloc_n_mmaps_max +#define mmap_threshold malloc_mmap_threshold +#define sbrk_base malloc_sbrk_base +#define max_sbrked_mem malloc_max_sbrked_mem +#define max_total_mem malloc_max_total_mem +#define current_mallinfo malloc_current_mallinfo +#define n_mmaps malloc_n_mmaps +#define max_n_mmaps malloc_max_n_mmaps +#define mmapped_mem malloc_mmapped_mem +#define max_mmapped_mem malloc_max_mmapped_mem +#endif + +/* variables holding tunable values */ + +#ifdef DEFINE_MALLOC + +STATIC unsigned long trim_threshold = DEFAULT_TRIM_THRESHOLD; +STATIC unsigned long top_pad = DEFAULT_TOP_PAD; +#if HAVE_MMAP +STATIC unsigned int n_mmaps_max = DEFAULT_MMAP_MAX; +STATIC unsigned long mmap_threshold = DEFAULT_MMAP_THRESHOLD; +#endif + +/* The first value returned from sbrk */ +STATIC char* sbrk_base = (char*)(-1); + +/* The maximum memory obtained from system via sbrk */ +STATIC unsigned long max_sbrked_mem = 0; + +/* The maximum via either sbrk or mmap */ +STATIC unsigned long max_total_mem = 0; + +/* internal working copy of mallinfo */ +STATIC struct mallinfo current_mallinfo = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + +#if HAVE_MMAP + +/* Tracking mmaps */ + +STATIC unsigned int n_mmaps = 0; +STATIC unsigned int max_n_mmaps = 0; +STATIC unsigned long mmapped_mem = 0; +STATIC unsigned long max_mmapped_mem = 0; + +#endif + +#else /* ! DEFINE_MALLOC */ + +extern unsigned long trim_threshold; +extern unsigned long top_pad; +#if HAVE_MMAP +extern unsigned int n_mmaps_max; +extern unsigned long mmap_threshold; +#endif +extern char* sbrk_base; +extern unsigned long max_sbrked_mem; +extern unsigned long max_total_mem; +extern struct mallinfo current_mallinfo; +#if HAVE_MMAP +extern unsigned int n_mmaps; +extern unsigned int max_n_mmaps; +extern unsigned long mmapped_mem; +extern unsigned long max_mmapped_mem; +#endif + +#endif /* ! DEFINE_MALLOC */ + +/* The total memory obtained from system via sbrk */ +#define sbrked_mem (current_mallinfo.arena) + + + +/* + Debugging support +*/ + +#if DEBUG + + +/* + These routines make a number of assertions about the states + of data structures that should be true at all times. If any + are not true, it's very likely that a user program has somehow + trashed memory. (It's also possible that there is a coding error + in malloc. In which case, please report it!) +*/ + +#if __STD_C +static void do_check_chunk(mchunkptr p) +#else +static void do_check_chunk(p) mchunkptr p; +#endif +{ + INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE; + + /* No checkable chunk is mmapped */ + assert(!chunk_is_mmapped(p)); + + /* Check for legal address ... */ + assert((char*)p >= sbrk_base); + if (p != top) + assert((char*)p + sz <= (char*)top); + else + assert((char*)p + sz <= sbrk_base + sbrked_mem); + +} + + +#if __STD_C +static void do_check_free_chunk(mchunkptr p) +#else +static void do_check_free_chunk(p) mchunkptr p; +#endif +{ + INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE; + mchunkptr next = chunk_at_offset(p, sz); + + do_check_chunk(p); + + /* Check whether it claims to be free ... */ + assert(!inuse(p)); + + /* Unless a special marker, must have OK fields */ + if ((long)sz >= (long)MINSIZE) + { + assert((sz & MALLOC_ALIGN_MASK) == 0); + assert(aligned_OK(chunk2mem(p))); + /* ... matching footer field */ + assert(next->prev_size == sz); + /* ... and is fully consolidated */ + assert(prev_inuse(p)); + assert (next == top || inuse(next)); + + /* ... and has minimally sane links */ + assert(p->fd->bk == p); + assert(p->bk->fd == p); + } + else /* markers are always of size SIZE_SZ */ + assert(sz == SIZE_SZ); +} + +#if __STD_C +static void do_check_inuse_chunk(mchunkptr p) +#else +static void do_check_inuse_chunk(p) mchunkptr p; +#endif +{ + mchunkptr next = next_chunk(p); + do_check_chunk(p); + + /* Check whether it claims to be in use ... */ + assert(inuse(p)); + + /* ... and is surrounded by OK chunks. + Since more things can be checked with free chunks than inuse ones, + if an inuse chunk borders them and debug is on, it's worth doing them. + */ + if (!prev_inuse(p)) + { + mchunkptr prv = prev_chunk(p); + assert(next_chunk(prv) == p); + do_check_free_chunk(prv); + } + if (next == top) + { + assert(prev_inuse(next)); + assert(chunksize(next) >= MINSIZE); + } + else if (!inuse(next)) + do_check_free_chunk(next); + +} + +#if __STD_C +static void do_check_malloced_chunk(mchunkptr p, INTERNAL_SIZE_T s) +#else +static void do_check_malloced_chunk(p, s) mchunkptr p; INTERNAL_SIZE_T s; +#endif +{ + INTERNAL_SIZE_T sz = p->size & ~PREV_INUSE; + long room = long_sub_size_t(sz, s); + + do_check_inuse_chunk(p); + + /* Legal size ... */ + assert((long)sz >= (long)MINSIZE); + assert((sz & MALLOC_ALIGN_MASK) == 0); + assert(room >= 0); + assert(room < (long)MINSIZE); + + /* ... and alignment */ + assert(aligned_OK(chunk2mem(p))); + + + /* ... and was allocated at front of an available chunk */ + assert(prev_inuse(p)); + +} + + +#define check_free_chunk(P) do_check_free_chunk(P) +#define check_inuse_chunk(P) do_check_inuse_chunk(P) +#define check_chunk(P) do_check_chunk(P) +#define check_malloced_chunk(P,N) do_check_malloced_chunk(P,N) +#else +#define check_free_chunk(P) +#define check_inuse_chunk(P) +#define check_chunk(P) +#define check_malloced_chunk(P,N) +#endif + + + +/* + Macro-based internal utilities +*/ + + +/* + Linking chunks in bin lists. + Call these only with variables, not arbitrary expressions, as arguments. +*/ + +/* + Place chunk p of size s in its bin, in size order, + putting it ahead of others of same size. +*/ + + +#define frontlink(P, S, IDX, BK, FD) \ +{ \ + if (S < MAX_SMALLBIN_SIZE) \ + { \ + IDX = smallbin_index(S); \ + mark_binblock(IDX); \ + BK = bin_at(IDX); \ + FD = BK->fd; \ + P->bk = BK; \ + P->fd = FD; \ + FD->bk = BK->fd = P; \ + } \ + else \ + { \ + IDX = bin_index(S); \ + BK = bin_at(IDX); \ + FD = BK->fd; \ + if (FD == BK) mark_binblock(IDX); \ + else \ + { \ + while (FD != BK && S < chunksize(FD)) FD = FD->fd; \ + BK = FD->bk; \ + } \ + P->bk = BK; \ + P->fd = FD; \ + FD->bk = BK->fd = P; \ + } \ +} + + +/* take a chunk off a list */ + +#define unlink(P, BK, FD) \ +{ \ + BK = P->bk; \ + FD = P->fd; \ + FD->bk = BK; \ + BK->fd = FD; \ +} \ + +/* Place p as the last remainder */ + +#define link_last_remainder(P) \ +{ \ + last_remainder->fd = last_remainder->bk = P; \ + P->fd = P->bk = last_remainder; \ +} + +/* Clear the last_remainder bin */ + +#define clear_last_remainder \ + (last_remainder->fd = last_remainder->bk = last_remainder) + + + + + + +/* Routines dealing with mmap(). */ + +#if HAVE_MMAP + +#ifdef DEFINE_MALLOC + +#if __STD_C +static mchunkptr mmap_chunk(size_t size) +#else +static mchunkptr mmap_chunk(size) size_t size; +#endif +{ + size_t page_mask = malloc_getpagesize - 1; + mchunkptr p; + +#ifndef MAP_ANONYMOUS + static int fd = -1; +#endif + + if(n_mmaps >= n_mmaps_max) return 0; /* too many regions */ + + /* For mmapped chunks, the overhead is one SIZE_SZ unit larger, because + * there is no following chunk whose prev_size field could be used. + */ + size = (size + SIZE_SZ + page_mask) & ~page_mask; + +#ifdef MAP_ANONYMOUS + p = (mchunkptr)mmap(0, size, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); +#else /* !MAP_ANONYMOUS */ + if (fd < 0) + { + fd = open("/dev/zero", O_RDWR); + if(fd < 0) return 0; + } + p = (mchunkptr)mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); +#endif + + if(p == (mchunkptr)-1) return 0; + + n_mmaps++; + if (n_mmaps > max_n_mmaps) max_n_mmaps = n_mmaps; + + /* We demand that eight bytes into a page must be 8-byte aligned. */ + assert(aligned_OK(chunk2mem(p))); + + /* The offset to the start of the mmapped region is stored + * in the prev_size field of the chunk; normally it is zero, + * but that can be changed in memalign(). + */ + p->prev_size = 0; + set_head(p, size|IS_MMAPPED); + + mmapped_mem += size; + if ((unsigned long)mmapped_mem > (unsigned long)max_mmapped_mem) + max_mmapped_mem = mmapped_mem; + if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem) + max_total_mem = mmapped_mem + sbrked_mem; + return p; +} + +#endif /* DEFINE_MALLOC */ + +#ifdef SEPARATE_OBJECTS +#define munmap_chunk malloc_munmap_chunk +#endif + +#ifdef DEFINE_FREE + +#if __STD_C +STATIC void munmap_chunk(mchunkptr p) +#else +STATIC void munmap_chunk(p) mchunkptr p; +#endif +{ + INTERNAL_SIZE_T size = chunksize(p); + int ret; + + assert (chunk_is_mmapped(p)); + assert(! ((char*)p >= sbrk_base && (char*)p < sbrk_base + sbrked_mem)); + assert((n_mmaps > 0)); + assert(((p->prev_size + size) & (malloc_getpagesize-1)) == 0); + + n_mmaps--; + mmapped_mem -= (size + p->prev_size); + + ret = munmap((char *)p - p->prev_size, size + p->prev_size); + + /* munmap returns non-zero on failure */ + assert(ret == 0); +} + +#else /* ! DEFINE_FREE */ + +#if __STD_C +extern void munmap_chunk(mchunkptr); +#else +extern void munmap_chunk(); +#endif + +#endif /* ! DEFINE_FREE */ + +#if HAVE_MREMAP + +#ifdef DEFINE_REALLOC + +#if __STD_C +static mchunkptr mremap_chunk(mchunkptr p, size_t new_size) +#else +static mchunkptr mremap_chunk(p, new_size) mchunkptr p; size_t new_size; +#endif +{ + size_t page_mask = malloc_getpagesize - 1; + INTERNAL_SIZE_T offset = p->prev_size; + INTERNAL_SIZE_T size = chunksize(p); + char *cp; + + assert (chunk_is_mmapped(p)); + assert(! ((char*)p >= sbrk_base && (char*)p < sbrk_base + sbrked_mem)); + assert((n_mmaps > 0)); + assert(((size + offset) & (malloc_getpagesize-1)) == 0); + + /* Note the extra SIZE_SZ overhead as in mmap_chunk(). */ + new_size = (new_size + offset + SIZE_SZ + page_mask) & ~page_mask; + + cp = (char *)mremap((char *)p - offset, size + offset, new_size, 1); + + if (cp == (char *)-1) return 0; + + p = (mchunkptr)(cp + offset); + + assert(aligned_OK(chunk2mem(p))); + + assert((p->prev_size == offset)); + set_head(p, (new_size - offset)|IS_MMAPPED); + + mmapped_mem -= size + offset; + mmapped_mem += new_size; + if ((unsigned long)mmapped_mem > (unsigned long)max_mmapped_mem) + max_mmapped_mem = mmapped_mem; + if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem) + max_total_mem = mmapped_mem + sbrked_mem; + return p; +} + +#endif /* DEFINE_REALLOC */ + +#endif /* HAVE_MREMAP */ + +#endif /* HAVE_MMAP */ + + + + +#ifdef DEFINE_MALLOC + +/* + Extend the top-most chunk by obtaining memory from system. + Main interface to sbrk (but see also malloc_trim). +*/ + +#if __STD_C +static void malloc_extend_top(RARG INTERNAL_SIZE_T nb) +#else +static void malloc_extend_top(RARG nb) RDECL INTERNAL_SIZE_T nb; +#endif +{ + char* brk; /* return value from sbrk */ + INTERNAL_SIZE_T front_misalign; /* unusable bytes at front of sbrked space */ + INTERNAL_SIZE_T correction; /* bytes for 2nd sbrk call */ + int correction_failed = 0; /* whether we should relax the assertion */ + char* new_brk; /* return of 2nd sbrk call */ + INTERNAL_SIZE_T top_size; /* new size of top chunk */ + + mchunkptr old_top = top; /* Record state of old top */ + INTERNAL_SIZE_T old_top_size = chunksize(old_top); + char* old_end = (char*)(chunk_at_offset(old_top, old_top_size)); + + /* Pad request with top_pad plus minimal overhead */ + + INTERNAL_SIZE_T sbrk_size = nb + top_pad + MINSIZE; + unsigned long pagesz = malloc_getpagesize; + + /* If not the first time through, round to preserve page boundary */ + /* Otherwise, we need to correct to a page size below anyway. */ + /* (We also correct below if an intervening foreign sbrk call.) */ + + if (sbrk_base != (char*)(-1)) + sbrk_size = (sbrk_size + (pagesz - 1)) & ~(pagesz - 1); + + brk = (char*)(MORECORE (sbrk_size)); + + /* Fail if sbrk failed or if a foreign sbrk call killed our space */ + if (brk == (char*)(MORECORE_FAILURE) || + (brk < old_end && old_top != initial_top)) + return; + + sbrked_mem += sbrk_size; + + if (brk == old_end /* can just add bytes to current top, unless + previous correction failed */ + && ((POINTER_UINT)old_end & (pagesz - 1)) == 0) + { + top_size = sbrk_size + old_top_size; + set_head(top, top_size | PREV_INUSE); + } + else + { + if (sbrk_base == (char*)(-1)) /* First time through. Record base */ + sbrk_base = brk; + else /* Someone else called sbrk(). Count those bytes as sbrked_mem. */ + sbrked_mem += brk - (char*)old_end; + + /* Guarantee alignment of first new chunk made from this space */ + front_misalign = (POINTER_UINT)chunk2mem(brk) & MALLOC_ALIGN_MASK; + if (front_misalign > 0) + { + correction = (MALLOC_ALIGNMENT) - front_misalign; + brk += correction; + } + else + correction = 0; + + /* Guarantee the next brk will be at a page boundary */ + correction += pagesz - ((POINTER_UINT)(brk + sbrk_size) & (pagesz - 1)); + + /* To guarantee page boundary, correction should be less than pagesz */ + correction &= (pagesz - 1); + + /* Allocate correction */ + new_brk = (char*)(MORECORE (correction)); + if (new_brk == (char*)(MORECORE_FAILURE)) + { + correction = 0; + correction_failed = 1; + new_brk = brk + sbrk_size; + if (front_misalign > 0) + new_brk -= (MALLOC_ALIGNMENT) - front_misalign; + } + + sbrked_mem += correction; + + top = (mchunkptr)brk; + top_size = new_brk - brk + correction; + set_head(top, top_size | PREV_INUSE); + + if (old_top != initial_top) + { + + /* There must have been an intervening foreign sbrk call. */ + /* A double fencepost is necessary to prevent consolidation */ + + /* If not enough space to do this, then user did something very wrong */ + if (old_top_size < MINSIZE) + { + set_head(top, PREV_INUSE); /* will force null return from malloc */ + return; + } + + /* Also keep size a multiple of MALLOC_ALIGNMENT */ + old_top_size = (old_top_size - 3*SIZE_SZ) & ~MALLOC_ALIGN_MASK; + set_head_size(old_top, old_top_size); + chunk_at_offset(old_top, old_top_size )->size = + SIZE_SZ|PREV_INUSE; + chunk_at_offset(old_top, old_top_size + SIZE_SZ)->size = + SIZE_SZ|PREV_INUSE; + /* If possible, release the rest. */ + if (old_top_size >= MINSIZE) + fREe(RCALL chunk2mem(old_top)); + } + } + + if ((unsigned long)sbrked_mem > (unsigned long)max_sbrked_mem) + max_sbrked_mem = sbrked_mem; +#if HAVE_MMAP + if ((unsigned long)(mmapped_mem + sbrked_mem) > (unsigned long)max_total_mem) + max_total_mem = mmapped_mem + sbrked_mem; +#else + if ((unsigned long)(sbrked_mem) > (unsigned long)max_total_mem) + max_total_mem = sbrked_mem; +#endif + + /* We always land on a page boundary */ + assert(((unsigned long)((char*)top + top_size) & (pagesz - 1)) == 0 + || correction_failed); +} + +#endif /* DEFINE_MALLOC */ + + +/* Main public routines */ + +#ifdef DEFINE_MALLOC + +/* + Malloc Algorthim: + + The requested size is first converted into a usable form, `nb'. + This currently means to add 4 bytes overhead plus possibly more to + obtain 8-byte alignment and/or to obtain a size of at least + MINSIZE (currently 16 bytes), the smallest allocatable size. + (All fits are considered `exact' if they are within MINSIZE bytes.) + + From there, the first successful of the following steps is taken: + + 1. The bin corresponding to the request size is scanned, and if + a chunk of exactly the right size is found, it is taken. + + 2. The most recently remaindered chunk is used if it is big + enough. This is a form of (roving) first fit, used only in + the absence of exact fits. Runs of consecutive requests use + the remainder of the chunk used for the previous such request + whenever possible. This limited use of a first-fit style + allocation strategy tends to give contiguous chunks + coextensive lifetimes, which improves locality and can reduce + fragmentation in the long run. + + 3. Other bins are scanned in increasing size order, using a + chunk big enough to fulfill the request, and splitting off + any remainder. This search is strictly by best-fit; i.e., + the smallest (with ties going to approximately the least + recently used) chunk that fits is selected. + + 4. If large enough, the chunk bordering the end of memory + (`top') is split off. (This use of `top' is in accord with + the best-fit search rule. In effect, `top' is treated as + larger (and thus less well fitting) than any other available + chunk since it can be extended to be as large as necessary + (up to system limitations). + + 5. If the request size meets the mmap threshold and the + system supports mmap, and there are few enough currently + allocated mmapped regions, and a call to mmap succeeds, + the request is allocated via direct memory mapping. + + 6. Otherwise, the top of memory is extended by + obtaining more space from the system (normally using sbrk, + but definable to anything else via the MORECORE macro). + Memory is gathered from the system (in system page-sized + units) in a way that allows chunks obtained across different + sbrk calls to be consolidated, but does not require + contiguous memory. Thus, it should be safe to intersperse + mallocs with other sbrk calls. + + + All allocations are made from the the `lowest' part of any found + chunk. (The implementation invariant is that prev_inuse is + always true of any allocated chunk; i.e., that each allocated + chunk borders either a previously allocated and still in-use chunk, + or the base of its memory arena.) + +*/ + +#if __STD_C +Void_t* mALLOc(RARG size_t bytes) +#else +Void_t* mALLOc(RARG bytes) RDECL size_t bytes; +#endif +{ +#ifdef MALLOC_PROVIDED + + return malloc (bytes); // Make sure that the pointer returned by malloc is returned back. + +#else + + mchunkptr victim; /* inspected/selected chunk */ + INTERNAL_SIZE_T victim_size; /* its size */ + int idx; /* index for bin traversal */ + mbinptr bin; /* associated bin */ + mchunkptr remainder; /* remainder from a split */ + long remainder_size; /* its size */ + int remainder_index; /* its bin index */ + unsigned long block; /* block traverser bit */ + int startidx; /* first bin of a traversed block */ + mchunkptr fwd; /* misc temp for linking */ + mchunkptr bck; /* misc temp for linking */ + mbinptr q; /* misc temp */ + + INTERNAL_SIZE_T nb = request2size(bytes); /* padded request size; */ + + /* Check for overflow and just fail, if so. */ + if (nb > INT_MAX || nb < bytes) + { + RERRNO = ENOMEM; + return 0; + } + + MALLOC_LOCK; + + /* Check for exact match in a bin */ + + if (is_small_request(nb)) /* Faster version for small requests */ + { + idx = smallbin_index(nb); + + /* No traversal or size check necessary for small bins. */ + + q = bin_at(idx); + victim = last(q); + +#if MALLOC_ALIGN != 16 + /* Also scan the next one, since it would have a remainder < MINSIZE */ + if (victim == q) + { + q = next_bin(q); + victim = last(q); + } +#endif + if (victim != q) + { + victim_size = chunksize(victim); + unlink(victim, bck, fwd); + set_inuse_bit_at_offset(victim, victim_size); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + } + + idx += 2; /* Set for bin scan below. We've already scanned 2 bins. */ + + } + else + { + idx = bin_index(nb); + bin = bin_at(idx); + + for (victim = last(bin); victim != bin; victim = victim->bk) + { + victim_size = chunksize(victim); + remainder_size = long_sub_size_t(victim_size, nb); + + if (remainder_size >= (long)MINSIZE) /* too big */ + { + --idx; /* adjust to rescan below after checking last remainder */ + break; + } + + else if (remainder_size >= 0) /* exact fit */ + { + unlink(victim, bck, fwd); + set_inuse_bit_at_offset(victim, victim_size); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + } + } + + ++idx; + + } + + /* Try to use the last split-off remainder */ + + if ( (victim = last_remainder->fd) != last_remainder) + { + victim_size = chunksize(victim); + remainder_size = long_sub_size_t(victim_size, nb); + + if (remainder_size >= (long)MINSIZE) /* re-split */ + { + remainder = chunk_at_offset(victim, nb); + set_head(victim, nb | PREV_INUSE); + link_last_remainder(remainder); + set_head(remainder, remainder_size | PREV_INUSE); + set_foot(remainder, remainder_size); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + } + + clear_last_remainder; + + if (remainder_size >= 0) /* exhaust */ + { + set_inuse_bit_at_offset(victim, victim_size); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + } + + /* Else place in bin */ + + frontlink(victim, victim_size, remainder_index, bck, fwd); + } + + /* + If there are any possibly nonempty big-enough blocks, + search for best fitting chunk by scanning bins in blockwidth units. + */ + + if ( (block = idx2binblock(idx)) <= binblocks) + { + + /* Get to the first marked block */ + + if ( (block & binblocks) == 0) + { + /* force to an even block boundary */ + idx = (idx & ~(BINBLOCKWIDTH - 1)) + BINBLOCKWIDTH; + block <<= 1; + while ((block & binblocks) == 0) + { + idx += BINBLOCKWIDTH; + block <<= 1; + } + } + + /* For each possibly nonempty block ... */ + for (;;) + { + startidx = idx; /* (track incomplete blocks) */ + q = bin = bin_at(idx); + + /* For each bin in this block ... */ + do + { + /* Find and use first big enough chunk ... */ + + for (victim = last(bin); victim != bin; victim = victim->bk) + { + victim_size = chunksize(victim); + remainder_size = long_sub_size_t(victim_size, nb); + + if (remainder_size >= (long)MINSIZE) /* split */ + { + remainder = chunk_at_offset(victim, nb); + set_head(victim, nb | PREV_INUSE); + unlink(victim, bck, fwd); + link_last_remainder(remainder); + set_head(remainder, remainder_size | PREV_INUSE); + set_foot(remainder, remainder_size); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + } + + else if (remainder_size >= 0) /* take */ + { + set_inuse_bit_at_offset(victim, victim_size); + unlink(victim, bck, fwd); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + } + + } + + bin = next_bin(bin); + +#if MALLOC_ALIGN == 16 + if (idx < MAX_SMALLBIN) + { + bin = next_bin(bin); + ++idx; + } +#endif + } while ((++idx & (BINBLOCKWIDTH - 1)) != 0); + + /* Clear out the block bit. */ + + do /* Possibly backtrack to try to clear a partial block */ + { + if ((startidx & (BINBLOCKWIDTH - 1)) == 0) + { + binblocks &= ~block; + break; + } + --startidx; + q = prev_bin(q); + } while (first(q) == q); + + /* Get to the next possibly nonempty block */ + + if ( (block <<= 1) <= binblocks && (block != 0) ) + { + while ((block & binblocks) == 0) + { + idx += BINBLOCKWIDTH; + block <<= 1; + } + } + else + break; + } + } + + + /* Try to use top chunk */ + + /* Require that there be a remainder, ensuring top always exists */ + remainder_size = long_sub_size_t(chunksize(top), nb); + if (chunksize(top) < nb || remainder_size < (long)MINSIZE) + { + +#if HAVE_MMAP + /* If big and would otherwise need to extend, try to use mmap instead */ + if ((unsigned long)nb >= (unsigned long)mmap_threshold && + (victim = mmap_chunk(nb)) != 0) + { + MALLOC_UNLOCK; + return chunk2mem(victim); + } +#endif + + /* Try to extend */ + malloc_extend_top(RCALL nb); + remainder_size = long_sub_size_t(chunksize(top), nb); + if (chunksize(top) < nb || remainder_size < (long)MINSIZE) + { + MALLOC_UNLOCK; + return 0; /* propagate failure */ + } + } + + victim = top; + set_head(victim, nb | PREV_INUSE); + top = chunk_at_offset(victim, nb); + set_head(top, remainder_size | PREV_INUSE); + check_malloced_chunk(victim, nb); + MALLOC_UNLOCK; + return chunk2mem(victim); + +#endif /* MALLOC_PROVIDED */ +} + +#endif /* DEFINE_MALLOC */ + +#ifdef DEFINE_FREE + +/* + + free() algorithm : + + cases: + + 1. free(0) has no effect. + + 2. If the chunk was allocated via mmap, it is release via munmap(). + + 3. If a returned chunk borders the current high end of memory, + it is consolidated into the top, and if the total unused + topmost memory exceeds the trim threshold, malloc_trim is + called. + + 4. Other chunks are consolidated as they arrive, and + placed in corresponding bins. (This includes the case of + consolidating with the current `last_remainder'). + +*/ + + +#if __STD_C +void fREe(RARG Void_t* mem) +#else +void fREe(RARG mem) RDECL Void_t* mem; +#endif +{ +#ifdef MALLOC_PROVIDED + + free (mem); + +#else + + mchunkptr p; /* chunk corresponding to mem */ + INTERNAL_SIZE_T hd; /* its head field */ + INTERNAL_SIZE_T sz; /* its size */ + int idx; /* its bin index */ + mchunkptr next; /* next contiguous chunk */ + INTERNAL_SIZE_T nextsz; /* its size */ + INTERNAL_SIZE_T prevsz; /* size of previous contiguous chunk */ + mchunkptr bck; /* misc temp for linking */ + mchunkptr fwd; /* misc temp for linking */ + int islr; /* track whether merging with last_remainder */ + + if (mem == 0) /* free(0) has no effect */ + return; + + MALLOC_LOCK; + + p = mem2chunk(mem); + hd = p->size; + +#if HAVE_MMAP + if (hd & IS_MMAPPED) /* release mmapped memory. */ + { + munmap_chunk(p); + MALLOC_UNLOCK; + return; + } +#endif + + check_inuse_chunk(p); + + sz = hd & ~PREV_INUSE; + next = chunk_at_offset(p, sz); + nextsz = chunksize(next); + + if (next == top) /* merge with top */ + { + sz += nextsz; + + if (!(hd & PREV_INUSE)) /* consolidate backward */ + { + prevsz = p->prev_size; + p = chunk_at_offset(p, -prevsz); + sz += prevsz; + unlink(p, bck, fwd); + } + + set_head(p, sz | PREV_INUSE); + top = p; + if ((unsigned long)(sz) >= (unsigned long)trim_threshold) + malloc_trim(RCALL top_pad); + MALLOC_UNLOCK; + return; + } + + set_head(next, nextsz); /* clear inuse bit */ + + islr = 0; + + if (!(hd & PREV_INUSE)) /* consolidate backward */ + { + prevsz = p->prev_size; + p = chunk_at_offset(p, -prevsz); + sz += prevsz; + + if (p->fd == last_remainder) /* keep as last_remainder */ + islr = 1; + else + unlink(p, bck, fwd); + } + + if (!(inuse_bit_at_offset(next, nextsz))) /* consolidate forward */ + { + sz += nextsz; + + if (!islr && next->fd == last_remainder) /* re-insert last_remainder */ + { + islr = 1; + link_last_remainder(p); + } + else + unlink(next, bck, fwd); + } + + + set_head(p, sz | PREV_INUSE); + set_foot(p, sz); + if (!islr) + frontlink(p, sz, idx, bck, fwd); + + MALLOC_UNLOCK; + +#endif /* MALLOC_PROVIDED */ +} + +#endif /* DEFINE_FREE */ + +#ifdef DEFINE_REALLOC + +/* + + Realloc algorithm: + + Chunks that were obtained via mmap cannot be extended or shrunk + unless HAVE_MREMAP is defined, in which case mremap is used. + Otherwise, if their reallocation is for additional space, they are + copied. If for less, they are just left alone. + + Otherwise, if the reallocation is for additional space, and the + chunk can be extended, it is, else a malloc-copy-free sequence is + taken. There are several different ways that a chunk could be + extended. All are tried: + + * Extending forward into following adjacent free chunk. + * Shifting backwards, joining preceding adjacent space + * Both shifting backwards and extending forward. + * Extending into newly sbrked space + + Unless the #define REALLOC_ZERO_BYTES_FREES is set, realloc with a + size argument of zero (re)allocates a minimum-sized chunk. + + If the reallocation is for less space, and the new request is for + a `small' (<512 bytes) size, then the newly unused space is lopped + off and freed. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is no longer supported. + I don't know of any programs still relying on this feature, + and allowing it would also allow too many other incorrect + usages of realloc to be sensible. + + +*/ + + +#if __STD_C +Void_t* rEALLOc(RARG Void_t* oldmem, size_t bytes) +#else +Void_t* rEALLOc(RARG oldmem, bytes) RDECL Void_t* oldmem; size_t bytes; +#endif +{ +#ifdef MALLOC_PROVIDED + + realloc (oldmem, bytes); + +#else + + INTERNAL_SIZE_T nb; /* padded request size */ + + mchunkptr oldp; /* chunk corresponding to oldmem */ + INTERNAL_SIZE_T oldsize; /* its size */ + + mchunkptr newp; /* chunk to return */ + INTERNAL_SIZE_T newsize; /* its size */ + Void_t* newmem; /* corresponding user mem */ + + mchunkptr next; /* next contiguous chunk after oldp */ + INTERNAL_SIZE_T nextsize; /* its size */ + + mchunkptr prev; /* previous contiguous chunk before oldp */ + INTERNAL_SIZE_T prevsize; /* its size */ + + mchunkptr remainder; /* holds split off extra space from newp */ + INTERNAL_SIZE_T remainder_size; /* its size */ + + mchunkptr bck; /* misc temp for linking */ + mchunkptr fwd; /* misc temp for linking */ + +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { fREe(RCALL oldmem); return 0; } +#endif + + + /* realloc of null is supposed to be same as malloc */ + if (oldmem == 0) return mALLOc(RCALL bytes); + + MALLOC_LOCK; + + newp = oldp = mem2chunk(oldmem); + newsize = oldsize = chunksize(oldp); + + + nb = request2size(bytes); + + /* Check for overflow and just fail, if so. */ + if (nb > INT_MAX || nb < bytes) + { + RERRNO = ENOMEM; + return 0; + } + +#if HAVE_MMAP + if (chunk_is_mmapped(oldp)) + { +#if HAVE_MREMAP + newp = mremap_chunk(oldp, nb); + if(newp) + { + MALLOC_UNLOCK; + return chunk2mem(newp); + } +#endif + /* Note the extra SIZE_SZ overhead. */ + if(oldsize - SIZE_SZ >= nb) + { + MALLOC_UNLOCK; + return oldmem; /* do nothing */ + } + /* Must alloc, copy, free. */ + newmem = mALLOc(RCALL bytes); + if (newmem == 0) + { + MALLOC_UNLOCK; + return 0; /* propagate failure */ + } + MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ); + munmap_chunk(oldp); + MALLOC_UNLOCK; + return newmem; + } +#endif + + check_inuse_chunk(oldp); + + if ((long)(oldsize) < (long)(nb)) + { + + /* Try expanding forward */ + + next = chunk_at_offset(oldp, oldsize); + if (next == top || !inuse(next)) + { + nextsize = chunksize(next); + + /* Forward into top only if a remainder */ + if (next == top) + { + if ((long)(nextsize + newsize) >= (long)(nb + MINSIZE)) + { + newsize += nextsize; + top = chunk_at_offset(oldp, nb); + set_head(top, (newsize - nb) | PREV_INUSE); + set_head_size(oldp, nb); + MALLOC_UNLOCK; + return chunk2mem(oldp); + } + } + + /* Forward into next chunk */ + else if (((long)(nextsize + newsize) >= (long)(nb))) + { + unlink(next, bck, fwd); + newsize += nextsize; + goto split; + } + } + else + { + next = 0; + nextsize = 0; + } + + /* Try shifting backwards. */ + + if (!prev_inuse(oldp)) + { + prev = prev_chunk(oldp); + prevsize = chunksize(prev); + + /* try forward + backward first to save a later consolidation */ + + if (next != 0) + { + /* into top */ + if (next == top) + { + if ((long)(nextsize + prevsize + newsize) >= (long)(nb + MINSIZE)) + { + unlink(prev, bck, fwd); + newp = prev; + newsize += prevsize + nextsize; + newmem = chunk2mem(newp); + MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ); + top = chunk_at_offset(newp, nb); + set_head(top, (newsize - nb) | PREV_INUSE); + set_head_size(newp, nb); + MALLOC_UNLOCK; + return newmem; + } + } + + /* into next chunk */ + else if (((long)(nextsize + prevsize + newsize) >= (long)(nb))) + { + unlink(next, bck, fwd); + unlink(prev, bck, fwd); + newp = prev; + newsize += nextsize + prevsize; + newmem = chunk2mem(newp); + MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ); + goto split; + } + } + + /* backward only */ + if (prev != 0 && (long)(prevsize + newsize) >= (long)nb) + { + unlink(prev, bck, fwd); + newp = prev; + newsize += prevsize; + newmem = chunk2mem(newp); + MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ); + goto split; + } + } + + /* Must allocate */ + + newmem = mALLOc (RCALL bytes); + + if (newmem == 0) /* propagate failure */ + { + MALLOC_UNLOCK; + return 0; + } + + /* Avoid copy if newp is next chunk after oldp. */ + /* (This can only happen when new chunk is sbrk'ed.) */ + + if ( (newp = mem2chunk(newmem)) == next_chunk(oldp)) + { + newsize += chunksize(newp); + newp = oldp; + goto split; + } + + /* Otherwise copy, free, and exit */ + MALLOC_COPY(newmem, oldmem, oldsize - SIZE_SZ); + fREe(RCALL oldmem); + MALLOC_UNLOCK; + return newmem; + } + + + split: /* split off extra room in old or expanded chunk */ + + remainder_size = long_sub_size_t(newsize, nb); + + if (remainder_size >= (long)MINSIZE) /* split off remainder */ + { + remainder = chunk_at_offset(newp, nb); + set_head_size(newp, nb); + set_head(remainder, remainder_size | PREV_INUSE); + set_inuse_bit_at_offset(remainder, remainder_size); + fREe(RCALL chunk2mem(remainder)); /* let free() deal with it */ + } + else + { + set_head_size(newp, newsize); + set_inuse_bit_at_offset(newp, newsize); + } + + check_inuse_chunk(newp); + MALLOC_UNLOCK; + return chunk2mem(newp); + +#endif /* MALLOC_PROVIDED */ +} + +#endif /* DEFINE_REALLOC */ + +#ifdef DEFINE_MEMALIGN + +/* + + memalign algorithm: + + memalign requests more than enough space from malloc, finds a spot + within that chunk that meets the alignment request, and then + possibly frees the leading and trailing space. + + The alignment argument must be a power of two. This property is not + checked by memalign, so misuse may result in random runtime errors. + + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. + +*/ + + +#if __STD_C +Void_t* mEMALIGn(RARG size_t alignment, size_t bytes) +#else +Void_t* mEMALIGn(RARG alignment, bytes) RDECL size_t alignment; size_t bytes; +#endif +{ + INTERNAL_SIZE_T nb; /* padded request size */ + char* m; /* memory returned by malloc call */ + mchunkptr p; /* corresponding chunk */ + char* brk; /* alignment point within p */ + mchunkptr newp; /* chunk to return */ + INTERNAL_SIZE_T newsize; /* its size */ + INTERNAL_SIZE_T leadsize; /* leading space befor alignment point */ + mchunkptr remainder; /* spare room at end to split off */ + long remainder_size; /* its size */ + + /* If need less alignment than we give anyway, just relay to malloc */ + + if (alignment <= MALLOC_ALIGNMENT) return mALLOc(RCALL bytes); + + /* Otherwise, ensure that it is at least a minimum chunk size */ + + if (alignment < MINSIZE) alignment = MINSIZE; + + /* Call malloc with worst case padding to hit alignment. */ + + nb = request2size(bytes); + + /* Check for overflow. */ + if (nb > __SIZE_MAX__ - (alignment + MINSIZE) || nb < bytes) + { + RERRNO = ENOMEM; + return 0; + } + + m = (char*)(mALLOc(RCALL nb + alignment + MINSIZE)); + + if (m == 0) return 0; /* propagate failure */ + + MALLOC_LOCK; + + p = mem2chunk(m); + + if ((((unsigned long)(m)) % alignment) == 0) /* aligned */ + { +#if HAVE_MMAP + if(chunk_is_mmapped(p)) + { + MALLOC_UNLOCK; + return chunk2mem(p); /* nothing more to do */ + } +#endif + } + else /* misaligned */ + { + /* + Find an aligned spot inside chunk. + Since we need to give back leading space in a chunk of at + least MINSIZE, if the first calculation places us at + a spot with less than MINSIZE leader, we can move to the + next aligned spot -- we've allocated enough total room so that + this is always possible. + */ + + brk = (char*)mem2chunk(((unsigned long)(m + alignment - 1)) & -alignment); + if ((long)(brk - (char*)(p)) < (long)MINSIZE) brk = brk + alignment; + + newp = (mchunkptr)brk; + leadsize = brk - (char*)(p); + newsize = chunksize(p) - leadsize; + +#if HAVE_MMAP + if(chunk_is_mmapped(p)) + { + newp->prev_size = p->prev_size + leadsize; + set_head(newp, newsize|IS_MMAPPED); + MALLOC_UNLOCK; + return chunk2mem(newp); + } +#endif + + /* give back leader, use the rest */ + + set_head(newp, newsize | PREV_INUSE); + set_inuse_bit_at_offset(newp, newsize); + set_head_size(p, leadsize); + fREe(RCALL chunk2mem(p)); + p = newp; + + assert (newsize >= nb && (((unsigned long)(chunk2mem(p))) % alignment) == 0); + } + + /* Also give back spare room at the end */ + + remainder_size = long_sub_size_t(chunksize(p), nb); + + if (remainder_size >= (long)MINSIZE) + { + remainder = chunk_at_offset(p, nb); + set_head(remainder, remainder_size | PREV_INUSE); + set_head_size(p, nb); + fREe(RCALL chunk2mem(remainder)); + } + + check_inuse_chunk(p); + MALLOC_UNLOCK; + return chunk2mem(p); + +} + +#endif /* DEFINE_MEMALIGN */ + +#ifdef DEFINE_VALLOC + +/* + valloc just invokes memalign with alignment argument equal + to the page size of the system (or as near to this as can + be figured out from all the includes/defines above.) +*/ + +#if __STD_C +Void_t* vALLOc(RARG size_t bytes) +#else +Void_t* vALLOc(RARG bytes) RDECL size_t bytes; +#endif +{ + return mEMALIGn (RCALL malloc_getpagesize, bytes); +} + +#endif /* DEFINE_VALLOC */ + +#ifdef DEFINE_PVALLOC + +/* + pvalloc just invokes valloc for the nearest pagesize + that will accommodate request +*/ + + +#if __STD_C +Void_t* pvALLOc(RARG size_t bytes) +#else +Void_t* pvALLOc(RARG bytes) RDECL size_t bytes; +#endif +{ + size_t pagesize = malloc_getpagesize; + if (bytes > __SIZE_MAX__ - pagesize) + { + RERRNO = ENOMEM; + return 0; + } + return mEMALIGn (RCALL pagesize, (bytes + pagesize - 1) & ~(pagesize - 1)); +} + +#endif /* DEFINE_PVALLOC */ + +#ifdef DEFINE_CALLOC + +/* + + calloc calls malloc, then zeroes out the allocated chunk. + +*/ + +#if __STD_C +Void_t* cALLOc(RARG size_t n, size_t elem_size) +#else +Void_t* cALLOc(RARG n, elem_size) RDECL size_t n; size_t elem_size; +#endif +{ + mchunkptr p; + INTERNAL_SIZE_T csz; + + INTERNAL_SIZE_T sz; + +#if MORECORE_CLEARS + mchunkptr oldtop; + INTERNAL_SIZE_T oldtopsize; +#endif + Void_t* mem; + + if (__builtin_mul_overflow((INTERNAL_SIZE_T) n, (INTERNAL_SIZE_T) elem_size, &sz)) + { + errno = ENOMEM; + return 0; + } + + /* check if expand_top called, in which case don't need to clear */ +#if MORECORE_CLEARS + MALLOC_LOCK; + oldtop = top; + oldtopsize = chunksize(top); +#endif + + mem = mALLOc (RCALL sz); + + if (mem == 0) + { +#if MORECORE_CLEARS + MALLOC_UNLOCK; +#endif + return 0; + } + else + { + p = mem2chunk(mem); + + /* Two optional cases in which clearing not necessary */ + + +#if HAVE_MMAP + if (chunk_is_mmapped(p)) + { +#if MORECORE_CLEARS + MALLOC_UNLOCK; +#endif + return mem; + } +#endif + + csz = chunksize(p); + +#if MORECORE_CLEARS + if (p == oldtop && csz > oldtopsize) + { + /* clear only the bytes from non-freshly-sbrked memory */ + csz = oldtopsize; + } + MALLOC_UNLOCK; +#endif + + MALLOC_ZERO(mem, csz - SIZE_SZ); + return mem; + } +} + +#endif /* DEFINE_CALLOC */ + +#if defined(DEFINE_CFREE) && !defined(__CYGWIN__) + +/* + + cfree just calls free. It is needed/defined on some systems + that pair it with calloc, presumably for odd historical reasons. + +*/ + +#if !defined(INTERNAL_LINUX_C_LIB) || !defined(__ELF__) +#if !defined(_LIBC) || !defined(_REENT_ONLY) +#if __STD_C +void cfree(Void_t *mem) +#else +void cfree(mem) Void_t *mem; +#endif +{ +#ifdef _LIBC + fREe(_REENT, mem); +#else + fREe(mem); +#endif +} +#endif +#endif + +#endif /* DEFINE_CFREE */ + +#ifdef DEFINE_FREE + +/* + + Malloc_trim gives memory back to the system (via negative + arguments to sbrk) if there is unused memory at the `high' end of + the malloc pool. You can call this after freeing large blocks of + memory to potentially reduce the system-level memory requirements + of a program. However, it cannot guarantee to reduce memory. Under + some allocation patterns, some large free blocks of memory will be + locked between two used chunks, so they cannot be given back to + the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, + only the minimum amount of memory to maintain internal data + structures will be left (one page or less). Non-zero arguments + can be supplied to maintain enough trailing space to service + future expected allocations without having to re-obtain memory + from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. + +*/ + +#if __STD_C +int malloc_trim(RARG size_t pad) +#else +int malloc_trim(RARG pad) RDECL size_t pad; +#endif +{ + long top_size; /* Amount of top-most memory */ + long extra; /* Amount to release */ + char* current_brk; /* address returned by pre-check sbrk call */ + char* new_brk; /* address returned by negative sbrk call */ + + unsigned long pagesz = malloc_getpagesize; + + MALLOC_LOCK; + + top_size = chunksize(top); + extra = ((top_size - pad - MINSIZE + (pagesz-1)) / pagesz - 1) * pagesz; + + if (extra < (long)pagesz) /* Not enough memory to release */ + { + MALLOC_UNLOCK; + return 0; + } + + else + { + /* Test to make sure no one else called sbrk */ + current_brk = (char*)(MORECORE (0)); + if (current_brk != (char*)(top) + top_size) + { + MALLOC_UNLOCK; + return 0; /* Apparently we don't own memory; must fail */ + } + + else + { + new_brk = (char*)(MORECORE (-extra)); + + if (new_brk == (char*)(MORECORE_FAILURE)) /* sbrk failed? */ + { + /* Try to figure out what we have */ + current_brk = (char*)(MORECORE (0)); + top_size = current_brk - (char*)top; + if (top_size >= (long)MINSIZE) /* if not, we are very very dead! */ + { + sbrked_mem = current_brk - sbrk_base; + set_head(top, top_size | PREV_INUSE); + } + check_chunk(top); + MALLOC_UNLOCK; + return 0; + } + + else + { + /* Success. Adjust top accordingly. */ + set_head(top, (top_size - extra) | PREV_INUSE); + sbrked_mem -= extra; + check_chunk(top); + MALLOC_UNLOCK; + return 1; + } + } + } +} + +#endif /* DEFINE_FREE */ + +#ifdef DEFINE_MALLOC_USABLE_SIZE + +/* + malloc_usable_size: + + This routine tells you how many bytes you can actually use in an + allocated chunk, which may be more than you requested (although + often not). You can use this many bytes without worrying about + overwriting other allocated objects. Not a particularly great + programming practice, but still sometimes useful. + +*/ + +#if __STD_C +size_t malloc_usable_size(RARG Void_t* mem) +#else +size_t malloc_usable_size(RARG mem) RDECL Void_t* mem; +#endif +{ + mchunkptr p; + if (mem == 0) + return 0; + else + { + p = mem2chunk(mem); + if(!chunk_is_mmapped(p)) + { + if (!inuse(p)) return 0; +#if DEBUG + MALLOC_LOCK; + check_inuse_chunk(p); + MALLOC_UNLOCK; +#endif + return chunksize(p) - SIZE_SZ; + } + return chunksize(p) - 2*SIZE_SZ; + } +} + +#endif /* DEFINE_MALLOC_USABLE_SIZE */ + +#ifdef DEFINE_MALLINFO + +/* Utility to update current_mallinfo for malloc_stats and mallinfo() */ + +STATIC void malloc_update_mallinfo() +{ + int i; + mbinptr b; + mchunkptr p; +#if DEBUG + mchunkptr q; +#endif + + INTERNAL_SIZE_T avail = chunksize(top); + int navail = ((long)(avail) >= (long)MINSIZE)? 1 : 0; + + for (i = 1; i < NAV; ++i) + { + b = bin_at(i); + for (p = last(b); p != b; p = p->bk) + { +#if DEBUG + check_free_chunk(p); + for (q = next_chunk(p); + q < top && inuse(q) && (long)(chunksize(q)) >= (long)MINSIZE; + q = next_chunk(q)) + check_inuse_chunk(q); +#endif + avail += chunksize(p); + navail++; + } + } + + current_mallinfo.ordblks = navail; + current_mallinfo.uordblks = sbrked_mem - avail; + current_mallinfo.fordblks = avail; +#if HAVE_MMAP + current_mallinfo.hblks = n_mmaps; + current_mallinfo.hblkhd = mmapped_mem; +#endif + current_mallinfo.keepcost = chunksize(top); + +} + +#else /* ! DEFINE_MALLINFO */ + +#if __STD_C +extern void malloc_update_mallinfo(void); +#else +extern void malloc_update_mallinfo(); +#endif + +#endif /* ! DEFINE_MALLINFO */ + +#ifdef DEFINE_MALLOC_STATS + +/* + + malloc_stats: + + Prints on stderr the amount of space obtain from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), the maximum + number of simultaneous mmap regions used, and the current number + of bytes allocated via malloc (or realloc, etc) but not yet + freed. (Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead.) + +*/ + +#if __STD_C +void malloc_stats(RONEARG) +#else +void malloc_stats(RONEARG) RDECL +#endif +{ + unsigned long local_max_total_mem; + int local_sbrked_mem; + struct mallinfo local_mallinfo; +#if HAVE_MMAP + unsigned long local_mmapped_mem, local_max_n_mmaps; +#endif + FILE *fp; + + MALLOC_LOCK; + malloc_update_mallinfo(); + local_max_total_mem = max_total_mem; + local_sbrked_mem = sbrked_mem; + local_mallinfo = current_mallinfo; +#if HAVE_MMAP + local_mmapped_mem = mmapped_mem; + local_max_n_mmaps = max_n_mmaps; +#endif + MALLOC_UNLOCK; + +#ifdef _LIBC + _REENT_SMALL_CHECK_INIT(reent_ptr); + fp = _stderr_r(reent_ptr); +#define fprintf fiprintf +#else + fp = stderr; +#endif + + fprintf(fp, "max system bytes = %10u\n", + (unsigned int)(local_max_total_mem)); +#if HAVE_MMAP + fprintf(fp, "system bytes = %10u\n", + (unsigned int)(local_sbrked_mem + local_mmapped_mem)); + fprintf(fp, "in use bytes = %10u\n", + (unsigned int)(local_mallinfo.uordblks + local_mmapped_mem)); +#else + fprintf(fp, "system bytes = %10u\n", + (unsigned int)local_sbrked_mem); + fprintf(fp, "in use bytes = %10u\n", + (unsigned int)local_mallinfo.uordblks); +#endif +#if HAVE_MMAP + fprintf(fp, "max mmap regions = %10u\n", + (unsigned int)local_max_n_mmaps); +#endif +} + +#endif /* DEFINE_MALLOC_STATS */ + +#ifdef DEFINE_MALLINFO + +/* + mallinfo returns a copy of updated current mallinfo. +*/ + +#if __STD_C +struct mallinfo mALLINFo(RONEARG) +#else +struct mallinfo mALLINFo(RONEARG) RDECL +#endif +{ + struct mallinfo ret; + + MALLOC_LOCK; + malloc_update_mallinfo(); + ret = current_mallinfo; + MALLOC_UNLOCK; + return ret; +} + +#endif /* DEFINE_MALLINFO */ + +#ifdef DEFINE_MALLOPT + +/* + mallopt: + + mallopt is the general SVID/XPG interface to tunable parameters. + The format is to provide a (parameter-number, parameter-value) pair. + mallopt then sets the corresponding parameter to the argument + value if it can (i.e., so long as the value is meaningful), + and returns 1 if successful else 0. + + See descriptions of tunable parameters above. + +*/ + +#if __STD_C +int mALLOPt(RARG int param_number, int value) +#else +int mALLOPt(RARG param_number, value) RDECL int param_number; int value; +#endif +{ + MALLOC_LOCK; + switch(param_number) + { + case M_TRIM_THRESHOLD: + trim_threshold = value; MALLOC_UNLOCK; return 1; + case M_TOP_PAD: + top_pad = value; MALLOC_UNLOCK; return 1; + case M_MMAP_THRESHOLD: +#if HAVE_MMAP + mmap_threshold = value; +#endif + MALLOC_UNLOCK; + return 1; + case M_MMAP_MAX: +#if HAVE_MMAP + n_mmaps_max = value; MALLOC_UNLOCK; return 1; +#else + MALLOC_UNLOCK; return value == 0; +#endif + + default: + MALLOC_UNLOCK; + return 0; + } +} + +#endif /* DEFINE_MALLOPT */ + +/* + +History: + + V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) + * Fixed ordering problem with boundary-stamping + + V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) + * Added pvalloc, as recommended by H.J. Liu + * Added 64bit pointer support mainly from Wolfram Gloger + * Added anonymously donated WIN32 sbrk emulation + * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen + * malloc_extend_top: fix mask error that caused wastage after + foreign sbrks + * Add linux mremap support code from HJ Liu + + V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) + * Integrated most documentation with the code. + * Add support for mmap, with help from + Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Use last_remainder in more cases. + * Pack bins using idea from colin@nyx10.cs.du.edu + * Use ordered bins instead of best-fit threshhold + * Eliminate block-local decls to simplify tracing and debugging. + * Support another case of realloc via move into top + * Fix error occuring when initial sbrk_base not word-aligned. + * Rely on page size for units instead of SBRK_UNIT to + avoid surprises about sbrk alignment conventions. + * Add mallinfo, mallopt. Thanks to Raymond Nijssen + (raymond@es.ele.tue.nl) for the suggestion. + * Add `pad' argument to malloc_trim and top_pad mallopt parameter. + * More precautions for cases where other routines call sbrk, + courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Added macros etc., allowing use in linux libc from + H.J. Lu (hjl@gnu.ai.mit.edu) + * Inverted this history list + + V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) + * Re-tuned and fixed to behave more nicely with V2.6.0 changes. + * Removed all preallocation code since under current scheme + the work required to undo bad preallocations exceeds + the work saved in good cases for most test programs. + * No longer use return list or unconsolidated bins since + no scheme using them consistently outperforms those that don't + given above changes. + * Use best fit for very large chunks to prevent some worst-cases. + * Added some support for debugging + + V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) + * Removed footers when chunks are in use. Thanks to + Paul Wilson (wilson@cs.texas.edu) for the suggestion. + + V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) + * Added malloc_trim, with help from Wolfram Gloger + (wmglo@Dent.MED.Uni-Muenchen.DE). + + V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) + + V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) + * realloc: try to expand in both directions + * malloc: swap order of clean-bin strategy; + * realloc: only conditionally expand backwards + * Try not to scavenge used bins + * Use bin counts as a guide to preallocation + * Occasionally bin return list chunks in first scan + * Add a few optimizations from colin@nyx10.cs.du.edu + + V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) + * faster bin computation & slightly different binning + * merged all consolidations to one part of malloc proper + (eliminating old malloc_find_space & malloc_clean_bin) + * Scan 2 returns chunks (not just 1) + * Propagate failure in realloc if malloc returns 0 + * Add stuff to allow compilation on non-ANSI compilers + from kpv@research.att.com + + V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) + * removed potential for odd address access in prev_chunk + * removed dependency on getpagesize.h + * misc cosmetics and a bit more internal documentation + * anticosmetics: mangled names in macros to evade debugger strangeness + * tested on sparc, hp-700, dec-mips, rs6000 + with gcc & native cc (hp, dec only) allowing + Detlefs & Zorn comparison study (in SIGPLAN Notices.) + + Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) + * Based loosely on libg++-1.2X malloc. (It retains some of the overall + structure of old version, but most details differ.) + +*/ +#endif diff --git a/lib/stdlib/a64l.c b/lib/stdlib/a64l.c new file mode 100644 index 0000000..dcac2e0 --- /dev/null +++ b/lib/stdlib/a64l.c @@ -0,0 +1,188 @@ +/* +FUNCTION +<>, <>---convert between radix-64 ASCII string and long + +INDEX + a64l +INDEX + l64a + +SYNOPSIS + #include + long a64l(const char *<[input]>); + char *l64a(long <[input]>); + +DESCRIPTION +Conversion is performed between long and radix-64 characters. The +<> routine transforms up to 32 bits of input value starting from +least significant bits to the most significant bits. The input value +is split up into a maximum of 5 groups of 6 bits and possibly one +group of 2 bits (bits 31 and 30). + +Each group of 6 bits forms a value from 0--63 which is translated into +a character as follows: + +O+ +o 0 = '.' +o 1 = '/' +o 2--11 = '0' to '9' +o 12--37 = 'A' to 'Z' +o 38--63 = 'a' to 'z' +O- + +When the remaining bits are zero or all bits have been translated, a +null terminator is appended to the string. An input value of 0 +results in the empty string. + +The <> function performs the reverse translation. Each +character is used to generate a 6-bit value for up to 30 bits and then +a 2-bit value to complete a 32-bit result. The null terminator means +that the remaining digits are 0. An empty input string or NULL string +results in 0L. An invalid string results in undefined behavior. If +the size of a long is greater than 32 bits, the result is sign-extended. + +RETURNS +<> returns a null-terminated string of 0 to 6 characters. +<> returns the 32-bit translated value from the input character string. + +PORTABILITY +<> and <> are non-ANSI and are defined by the Single Unix Specification. + +Supporting OS subroutines required: None. +*/ + +#include <_ansi.h> +#include +#include + +long +a64l (const char *input) +{ + const char *ptr; + char ch; + int i, digit; + unsigned long result = 0; + + if (input == NULL) + return 0; + + ptr = input; + + /* it easiest to go from most significant digit to least so find end of input or up + to 6 characters worth */ + for (i = 0; i < 6; ++i) + { + if (*ptr) + ++ptr; + } + + while (ptr > input) + { + ch = *(--ptr); + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + if (ch >= 'a') + digit = (ch - 'a') + 38; + else if (ch >= 'A') + digit = (ch - 'A') + 12; + else if (ch >= '0') + digit = (ch - '0') + 2; + else if (ch == '/') + digit = 1; + else + digit = 0; +#else /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) */ + switch (ch) + { + case '/': + digit = 1; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + digit = (ch - '0') + 2; + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + digit = (ch - 'A') + 12; + break; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + digit = (ch - 'a') + 38; + break; + default: + digit = 0; + break; + } +#endif /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) */ + + result = (result << 6) + digit; + } + +#if LONG_MAX > 2147483647 + /* for implementations where long is > 32 bits, the result must be sign-extended */ + if (result & 0x80000000) + return (((long)-1 >> 32) << 32) + result; +#endif + + return result; +} + + + + diff --git a/lib/stdlib/abort.c b/lib/stdlib/abort.c new file mode 100644 index 0000000..065dee5 --- /dev/null +++ b/lib/stdlib/abort.c @@ -0,0 +1,63 @@ +/* NetWare can not use this implementation of abort. It provides its + own version of abort in clib.nlm. If we can not use clib.nlm, then + we must write abort in sys/netware. */ + +#ifdef ABORT_PROVIDED + +int _dummy_abort = 1; + +#else + +/* +FUNCTION +<>---abnormal termination of a program + +INDEX + abort + +SYNOPSIS + #include + void abort(void); + +DESCRIPTION +Use <> to signal that your program has detected a condition it +cannot deal with. Normally, <> ends your program's execution. + +Before terminating your program, <> raises the exception <> +(using `<>'). If you have used <> to register +an exception handler for this condition, that handler has the +opportunity to retain control, thereby avoiding program termination. + +In this implementation, <> does not perform any stream- or +file-related cleanup (the host environment may do so; if not, you can +arrange for your program to do its own cleanup with a <> +exception handler). + +RETURNS +<> does not return to its caller. + +PORTABILITY +ANSI C requires <>. + +Supporting OS subroutines required: <<_exit>> and optionally, <>. +*/ + +#include +#include +#include + +void +abort (void) +{ +#ifdef ABORT_MESSAGE + write (2, "Abort called\n", sizeof ("Abort called\n")-1); +#endif + + while (1) + { + raise (SIGABRT); + _exit (1); + } +} + +#endif diff --git a/lib/stdlib/abs.c b/lib/stdlib/abs.c new file mode 100644 index 0000000..85a3fec --- /dev/null +++ b/lib/stdlib/abs.c @@ -0,0 +1,38 @@ +/* +FUNCTION +<>---integer absolute value (magnitude) + +INDEX + abs + +SYNOPSIS + #include + int abs(int <[i]>); + +DESCRIPTION +<> returns +@tex +$|x|$, +@end tex +the absolute value of <[i]> (also called the magnitude +of <[i]>). That is, if <[i]> is negative, the result is the opposite +of <[i]>, but if <[i]> is nonnegative the result is <[i]>. + +The similar function <> uses and returns <> rather than <> values. + +RETURNS +The result is a nonnegative integer. + +PORTABILITY +<> is ANSI. + +No supporting OS subroutines are required. +*/ + +#include + +int +abs (int i) +{ + return (i < 0) ? -i : i; +} diff --git a/lib/stdlib/aligned_alloc.c b/lib/stdlib/aligned_alloc.c new file mode 100644 index 0000000..06b3883 --- /dev/null +++ b/lib/stdlib/aligned_alloc.c @@ -0,0 +1,37 @@ +/* C11 aligned_alloc + Copyright (c) 2020 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include +#include +#include + +void * +aligned_alloc (size_t align, size_t size) +{ + return _memalign_r (_REENT, align, size); +} diff --git a/lib/stdlib/arc4random.c b/lib/stdlib/arc4random.c new file mode 100644 index 0000000..09a134c --- /dev/null +++ b/lib/stdlib/arc4random.c @@ -0,0 +1,218 @@ +/* $OpenBSD: arc4random.c,v 1.58 2022/07/31 13:41:45 tb Exp $ */ + +/* + * Copyright (c) 1996, David Mazieres + * Copyright (c) 2008, Damien Miller + * Copyright (c) 2013, Markus Friedl + * Copyright (c) 2014, Theo de Raadt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * ChaCha based random number generator for OpenBSD. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KEYSTREAM_ONLY +#include "chacha_private.h" + +#define minimum(a, b) ((a) < (b) ? (a) : (b)) + +#if defined(__GNUC__) || defined(_MSC_VER) +#define inline __inline +#else /* __GNUC__ || _MSC_VER */ +#define inline +#endif /* !__GNUC__ && !_MSC_VER */ + +#define KEYSZ 32 +#define IVSZ 8 +#define BLOCKSZ 64 +#define RSBUFSZ (16*BLOCKSZ) + +#if SIZE_MAX <= 65535 +#define REKEY_BASE ( 32*1024) /* NB. should be a power of 2 */ +#elif SIZE_MAX <= 1048575 +#define REKEY_BASE ( 512*1024) /* NB. should be a power of 2 */ +#else +#define REKEY_BASE (1024*1024) /* NB. should be a power of 2 */ +#endif + +/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */ +static struct _rs { + size_t rs_have; /* valid bytes at end of rs_buf */ + size_t rs_count; /* bytes till reseed */ +} *rs; + +/* Maybe be preserved in fork children, if _rs_allocate() decides. */ +static struct _rsx { + chacha_ctx rs_chacha; /* chacha context for random keystream */ + u_char rs_buf[RSBUFSZ]; /* keystream blocks */ +} *rsx; + +static inline int _rs_allocate(struct _rs **, struct _rsx **); +static inline void _rs_forkdetect(void); +#include "arc4random.h" + +static inline void _rs_rekey(u_char *dat, size_t datlen); + +static inline void +_rs_init(u_char *buf, size_t n) +{ + if (n < KEYSZ + IVSZ) + return; + + if (rs == NULL) { + if (_rs_allocate(&rs, &rsx) == -1) + _exit(1); + } + + chacha_keysetup(&rsx->rs_chacha, buf, KEYSZ * 8); + chacha_ivsetup(&rsx->rs_chacha, buf + KEYSZ); +} + +static void +_rs_stir(void) +{ + u_char rnd[KEYSZ + IVSZ]; + uint32_t rekey_fuzz = 0; + + memset(rnd, 0, (KEYSZ + IVSZ) * sizeof(u_char)); + + if (getentropy(rnd, sizeof rnd) == -1) + _getentropy_fail(); + + if (!rs) + _rs_init(rnd, sizeof(rnd)); + else + _rs_rekey(rnd, sizeof(rnd)); + explicit_bzero(rnd, sizeof(rnd)); /* discard source seed */ + + /* invalidate rs_buf */ + rs->rs_have = 0; + memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf)); + + /* rekey interval should not be predictable */ + chacha_encrypt_bytes(&rsx->rs_chacha, (uint8_t *)&rekey_fuzz, + (uint8_t *)&rekey_fuzz, sizeof(rekey_fuzz)); + rs->rs_count = REKEY_BASE + (rekey_fuzz % REKEY_BASE); +} + +static inline void +_rs_stir_if_needed(size_t len) +{ + _rs_forkdetect(); + if (!rs || rs->rs_count <= len) + _rs_stir(); + if (rs->rs_count <= len) + rs->rs_count = 0; + else + rs->rs_count -= len; +} + +static inline void +_rs_rekey(u_char *dat, size_t datlen) +{ +#ifndef KEYSTREAM_ONLY + memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf)); +#endif + /* fill rs_buf with the keystream */ + chacha_encrypt_bytes(&rsx->rs_chacha, rsx->rs_buf, + rsx->rs_buf, sizeof(rsx->rs_buf)); + /* mix in optional user provided data */ + if (dat) { + size_t i, m; + + m = minimum(datlen, KEYSZ + IVSZ); + for (i = 0; i < m; i++) + rsx->rs_buf[i] ^= dat[i]; + } + /* immediately reinit for backtracking resistance */ + _rs_init(rsx->rs_buf, KEYSZ + IVSZ); + memset(rsx->rs_buf, 0, KEYSZ + IVSZ); + rs->rs_have = sizeof(rsx->rs_buf) - KEYSZ - IVSZ; +} + +static inline void +_rs_random_buf(void *_buf, size_t n) +{ + u_char *buf = (u_char *)_buf; + u_char *keystream; + size_t m; + + _rs_stir_if_needed(n); + while (n > 0) { + if (rs->rs_have > 0) { + m = minimum(n, rs->rs_have); + keystream = rsx->rs_buf + sizeof(rsx->rs_buf) + - rs->rs_have; + memcpy(buf, keystream, m); + memset(keystream, 0, m); + buf += m; + n -= m; + rs->rs_have -= m; + } + if (rs->rs_have == 0) + _rs_rekey(NULL, 0); + } +} + +static inline void +_rs_random_u32(uint32_t *val) +{ + u_char *keystream; + + _rs_stir_if_needed(sizeof(*val)); + if (rs->rs_have < sizeof(*val)) + _rs_rekey(NULL, 0); + keystream = rsx->rs_buf + sizeof(rsx->rs_buf) - rs->rs_have; + memcpy(val, keystream, sizeof(*val)); + memset(keystream, 0, sizeof(*val)); + rs->rs_have -= sizeof(*val); +} + +uint32_t +arc4random(void) +{ + uint32_t val; + +#ifndef __SINGLE_THREAD__ + _ARC4_LOCK(); +#endif + _rs_random_u32(&val); +#ifndef __SINGLE_THREAD__ + _ARC4_UNLOCK(); +#endif + return val; +} + +void +arc4random_buf(void *buf, size_t n) +{ +#ifndef __SINGLE_THREAD__ + _ARC4_LOCK(); +#endif + _rs_random_buf(buf, n); +#ifndef __SINGLE_THREAD__ + _ARC4_UNLOCK(); +#endif +} diff --git a/lib/stdlib/arc4random.h b/lib/stdlib/arc4random.h new file mode 100644 index 0000000..4b98553 --- /dev/null +++ b/lib/stdlib/arc4random.h @@ -0,0 +1,91 @@ +/*- + * Copyright (c) 2016 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Newlib ports may override the default implementations via the following + * define and macros + * o _ARC4RANDOM_DATA, + * o _ARC4RANDOM_GETENTROPY_FAIL(), + * o _ARC4RANDOM_ALLOCATE(rsp, rspx), and + * o _ARC4RANDOM_FORKDETECT(). + */ +#include + +#include +#include + +#ifndef _ARC4_LOCK_INIT + +#define _ARC4_LOCK_INIT __LOCK_INIT(static, __arc4random_mutex); + +#define _ARC4_LOCK() __lock_acquire(__arc4random_mutex) + +#define _ARC4_UNLOCK() __lock_release(__arc4random_mutex) + +#endif /* _ARC4_LOCK_INIT */ + +#ifndef __SINGLE_THREAD__ +_ARC4_LOCK_INIT +#endif + +#ifdef _ARC4RANDOM_DATA +_ARC4RANDOM_DATA +#else +static struct { + struct _rs rs; + struct _rsx rsx; +} _arc4random_data; +#endif + +static inline void +_getentropy_fail(void) +{ +#ifdef _ARC4RANDOM_GETENTROPY_FAIL + _ARC4RANDOM_GETENTROPY_FAIL(); +#else + raise(SIGKILL); +#endif +} + +static inline int +_rs_allocate(struct _rs **rsp, struct _rsx **rsxp) +{ +#ifdef _ARC4RANDOM_ALLOCATE + _ARC4RANDOM_ALLOCATE(rsp, rsxp); +#else + *rsp = &_arc4random_data.rs; + *rsxp = &_arc4random_data.rsx; + return (0); +#endif +} + +static inline void +_rs_forkdetect(void) +{ +#ifdef _ARC4RANDOM_FORKDETECT + _ARC4RANDOM_FORKDETECT(); +#endif +} diff --git a/lib/stdlib/arc4random_uniform.c b/lib/stdlib/arc4random_uniform.c new file mode 100644 index 0000000..2d22434 --- /dev/null +++ b/lib/stdlib/arc4random_uniform.c @@ -0,0 +1,56 @@ +/* $OpenBSD: arc4random_uniform.c,v 1.2 2015/09/13 08:31:47 guenther Exp $ */ + +/* + * Copyright (c) 2008, Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +/* + * Calculate a uniformly distributed random number less than upper_bound + * avoiding "modulo bias". + * + * Uniformity is achieved by generating new random numbers until the one + * returned is outside the range [0, 2**32 % upper_bound). This + * guarantees the selected random number will be inside + * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) + * after reduction modulo upper_bound. + */ +uint32_t +arc4random_uniform(uint32_t upper_bound) +{ + uint32_t r, min; + + if (upper_bound < 2) + return 0; + + /* 2**32 % x == (2**32 - x) % x */ + min = -upper_bound % upper_bound; + + /* + * This could theoretically loop forever but each retry has + * p > 0.5 (worst case, usually far better) of selecting a + * number inside the range we need, so it should rarely need + * to re-roll. + */ + for (;;) { + r = arc4random(); + if (r >= min) + break; + } + + return r % upper_bound; +} diff --git a/lib/stdlib/assert.c b/lib/stdlib/assert.c new file mode 100644 index 0000000..46ac92b --- /dev/null +++ b/lib/stdlib/assert.c @@ -0,0 +1,74 @@ +/* +FUNCTION +<>---macro for debugging diagnostics + +INDEX + assert + +SYNOPSIS + #include + void assert(int <[expression]>); + +DESCRIPTION + Use this macro to embed debuggging diagnostic statements in + your programs. The argument <[expression]> should be an + expression which evaluates to true (nonzero) when your program + is working as you intended. + + When <[expression]> evaluates to false (zero), <> + calls <>, after first printing a message showing what + failed and where: + +. Assertion failed: <[expression]>, file <[filename]>, line <[lineno]>, function: <[func]> + + If the name of the current function is not known (for example, + when using a C89 compiler that does not understand __func__), + the function location is omitted. + + The macro is defined to permit you to turn off all uses of + <> at compile time by defining <> as a + preprocessor variable. If you do this, the <> macro + expands to + +. (void(0)) + +RETURNS + <> does not return a value. + +PORTABILITY + The <> macro is required by ANSI, as is the behavior + when <> is defined. + +Supporting OS subroutines required (only if enabled): <>, <>, +<>, <>, <>, <>, <>, <>, <>. +*/ + +#include +#include +#include + +#ifndef HAVE_ASSERT_FUNC +/* func can be NULL, in which case no function information is given. */ +void +__assert_func (const char *file, + int line, + const char *func, + const char *failedexpr) +{ + fiprintf(stderr, + "assertion \"%s\" failed: file \"%s\", line %d%s%s\n", + failedexpr, file, line, + func ? ", function: " : "", func ? func : ""); + abort(); + /* NOTREACHED */ +} +#endif /* HAVE_ASSERT_FUNC */ + +void +__assert (const char *file, + int line, + const char *failedexpr) +{ + __assert_func (file, line, NULL, failedexpr); + /* NOTREACHED */ +} diff --git a/lib/stdlib/atexit.c b/lib/stdlib/atexit.c new file mode 100644 index 0000000..63617f8 --- /dev/null +++ b/lib/stdlib/atexit.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + */ + +/* +FUNCTION +<>---request execution of functions at program exit + +INDEX + atexit + +SYNOPSIS + #include + int atexit (void (*<[function]>)(void)); + +DESCRIPTION +You can use <> to enroll functions in a list of functions that +will be called when your program terminates normally. The argument is +a pointer to a user-defined function (which must not require arguments and +must not return a result). + +The functions are kept in a LIFO stack; that is, the last function +enrolled by <> will be the first to execute when your program +exits. + +There is no built-in limit to the number of functions you can enroll +in this list; however, after every group of 32 functions is enrolled, +<> will call <> to get space for the next part of the +list. The initial list of 32 functions is statically allocated, so +you can always count on at least that many slots available. + +RETURNS +<> returns <<0>> if it succeeds in enrolling your function, +<<-1>> if it fails (possible only if no space was available for +<> to extend the list of functions). + +PORTABILITY +<> is required by the ANSI standard, which also specifies that +implementations must support enrolling at least 32 functions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include +#include "atexit.h" + +/* + * Register a function to be performed at exit. + */ + +int +atexit (void (*fn) (void)) +{ + return __register_exitproc (__et_atexit, fn, NULL, NULL); +} diff --git a/lib/stdlib/atexit.h b/lib/stdlib/atexit.h new file mode 100644 index 0000000..df99963 --- /dev/null +++ b/lib/stdlib/atexit.h @@ -0,0 +1,14 @@ +/* + * Common definitions for atexit-like routines + */ + +enum __atexit_types +{ + __et_atexit, + __et_onexit, + __et_cxa +}; + +void __call_exitprocs (int, void *); +int __register_exitproc (int, void (*fn) (void), void *, void *); + diff --git a/lib/stdlib/atof.c b/lib/stdlib/atof.c new file mode 100644 index 0000000..17ba0fa --- /dev/null +++ b/lib/stdlib/atof.c @@ -0,0 +1,63 @@ +/* +FUNCTION + <>, <>---string to double or float + +INDEX + atof +INDEX + atoff + +SYNOPSIS + #include + double atof(const char *<[s]>); + float atoff(const char *<[s]>); + +DESCRIPTION +<> converts the initial portion of a string to a <>. +<> converts the initial portion of a string to a <>. + +The functions parse the character string <[s]>, +locating a substring which can be converted to a floating-point +value. The substring must match the format: +. [+|-]<[digits]>[.][<[digits]>][(e|E)[+|-]<[digits]>] +The substring converted is the longest initial +fragment of <[s]> that has the expected format, beginning with +the first non-whitespace character. The substring +is empty if <> is empty, consists entirely +of whitespace, or if the first non-whitespace character is +something other than <<+>>, <<->>, <<.>>, or a digit. + +<)>> is implemented as <, NULL)>>. +<)>> is implemented as <, NULL)>>. + +RETURNS +<> returns the converted substring value, if any, as a +<>; or <<0.0>>, if no conversion could be performed. +If the correct value is out of the range of representable values, plus +or minus <> is returned, and <> is stored in +<>. +If the correct value would cause underflow, <<0.0>> is returned +and <> is stored in <>. + +<> obeys the same rules as <>, except that it +returns a <>. + +PORTABILITY +<> is ANSI C. <>, <>, and <> are subsumed by <> +and <>, but are used extensively in existing code. These functions are +less reliable, but may be faster if the argument is verified to be in a valid +range. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + + +#include +#include <_ansi.h> + +double +atof (const char *s) +{ + return strtod (s, NULL); +} diff --git a/lib/stdlib/atoff.c b/lib/stdlib/atoff.c new file mode 100644 index 0000000..e25ff29 --- /dev/null +++ b/lib/stdlib/atoff.c @@ -0,0 +1,8 @@ +#include +#include <_ansi.h> + +float +atoff (const char *s) +{ + return strtof (s, NULL); +} diff --git a/lib/stdlib/atoi.c b/lib/stdlib/atoi.c new file mode 100644 index 0000000..4da53e8 --- /dev/null +++ b/lib/stdlib/atoi.c @@ -0,0 +1,62 @@ +/* +FUNCTION + <>, <>---string to integer + +INDEX + atoi +INDEX + atol +INDEX + _atoi_r +INDEX + _atol_r + +SYNOPSIS + #include + int atoi(const char *<[s]>); + long atol(const char *<[s]>); + int _atoi_r(struct _reent *<[ptr]>, const char *<[s]>); + long _atol_r(struct _reent *<[ptr]>, const char *<[s]>); + +DESCRIPTION + <> converts the initial portion of a string to an <>. + <> converts the initial portion of a string to a <>. + + <> is implemented as <<(int)strtol(s, NULL, 10).>> + <> is implemented as <> + + <<_atoi_r>> and <<_atol_r>> are reentrant versions of <> and + <> respectively, passing the reentrancy struct pointer. + +RETURNS + The functions return the converted value, if any. If no conversion was + made, <<0>> is returned. + +PORTABILITY +<>, <> are ANSI. + +No supporting OS subroutines are required. +*/ + +/* + * Andy Wilson, 2-Oct-89. + */ + +#include +#include <_ansi.h> + +#ifndef _REENT_ONLY +int +atoi (const char *s) +{ + return (int) strtol (s, NULL, 10); +} +#endif /* !_REENT_ONLY */ + +int +_atoi_r (struct _reent *ptr, + const char *s) +{ + return (int) _strtol_r (ptr, s, NULL, 10); +} + diff --git a/lib/stdlib/atol.c b/lib/stdlib/atol.c new file mode 100644 index 0000000..a5c8ee9 --- /dev/null +++ b/lib/stdlib/atol.c @@ -0,0 +1,21 @@ +/* + * Andy Wilson, 2-Oct-89. + */ + +#include +#include <_ansi.h> + +#ifndef _REENT_ONLY +long +atol (const char *s) +{ + return strtol (s, NULL, 10); +} +#endif /* !_REENT_ONLY */ + +long +_atol_r (struct _reent *ptr, const char *s) +{ + return _strtol_r (ptr, s, NULL, 10); +} + diff --git a/lib/stdlib/atoll.c b/lib/stdlib/atoll.c new file mode 100644 index 0000000..11edeae --- /dev/null +++ b/lib/stdlib/atoll.c @@ -0,0 +1,79 @@ +/* +FUNCTION +<>---convert a string to a long long integer + +INDEX + atoll +INDEX + _atoll_r + +SYNOPSIS + #include + long long atoll(const char *<[str]>); + long long _atoll_r(struct _reent *<[ptr]>, const char *<[str]>); + +DESCRIPTION +The function <> converts the initial portion of the string +pointed to by <<*<[str]>>> to a type <>. A call to +atoll(str) in this implementation is equivalent to +strtoll(str, (char **)NULL, 10) including behavior on error. + +The alternate function <<_atoll_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + + +RETURNS +The converted value. + +PORTABILITY +<> is ISO 9899 (C99) and POSIX 1003.1-2001 compatable. + +No supporting OS subroutines are required. +*/ + +/* + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifndef _REENT_ONLY +long long +atoll (const char *str) +{ + return strtoll(str, (char **)NULL, 10); +} +#endif /* !_REENT_ONLY */ + +long long +_atoll_r (struct _reent *ptr, + const char *str) +{ + return _strtoll_r(ptr, str, (char **)NULL, 10); +} diff --git a/lib/stdlib/btowc.c b/lib/stdlib/btowc.c new file mode 100644 index 0000000..7605ce6 --- /dev/null +++ b/lib/stdlib/btowc.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include "local.h" + +wint_t +btowc (int c) +{ + mbstate_t mbs; + int retval = 0; + wchar_t pwc; + unsigned char b; + + if (c == EOF) + return WEOF; + + b = (unsigned char)c; + + /* Put mbs in initial state. */ + memset (&mbs, '\0', sizeof (mbs)); + + _REENT_CHECK_MISC(_REENT); + + retval = __MBTOWC (_REENT, &pwc, (const char *) &b, 1, &mbs); + + if (retval != 0 && retval != 1) + return WEOF; + + return (wint_t)pwc; +} diff --git a/lib/stdlib/calloc.c b/lib/stdlib/calloc.c new file mode 100644 index 0000000..208e27e --- /dev/null +++ b/lib/stdlib/calloc.c @@ -0,0 +1,56 @@ +#ifdef MALLOC_PROVIDED +int _dummy_calloc = 1; +#else +/* +FUNCTION +<>---allocate space for arrays + +INDEX + calloc + +INDEX + _calloc_r + +SYNOPSIS + #include + void *calloc(size_t <[n]>, size_t <[s]>); + void *_calloc_r(void *<[reent]>, size_t <[n]>, size_t <[s]>); + +DESCRIPTION +Use <> to request a block of memory sufficient to hold an +array of <[n]> elements, each of which has size <[s]>. + +The memory allocated by <> comes out of the same memory pool +used by <>, but the memory block is initialized to all zero +bytes. (To avoid the overhead of initializing the space, use +<> instead.) + +The alternate function <<_calloc_r>> is reentrant. +The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +If successful, a pointer to the newly allocated space. + +If unsuccessful, <>. + +PORTABILITY +<> is ANSI. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include +#include + +#ifndef _REENT_ONLY + +void * +calloc (size_t n, + size_t size) +{ + return _calloc_r (_REENT, n, size); +} + +#endif +#endif /* MALLOC_PROVIDED */ diff --git a/lib/stdlib/callocr.c b/lib/stdlib/callocr.c new file mode 100644 index 0000000..80fee60 --- /dev/null +++ b/lib/stdlib/callocr.c @@ -0,0 +1,2 @@ +#define DEFINE_CALLOC +#include "_mallocr.c" diff --git a/lib/stdlib/cfreer.c b/lib/stdlib/cfreer.c new file mode 100644 index 0000000..a644664 --- /dev/null +++ b/lib/stdlib/cfreer.c @@ -0,0 +1,2 @@ +#define DEFINE_CFREE +#include "_mallocr.c" diff --git a/lib/stdlib/chacha_private.h b/lib/stdlib/chacha_private.h new file mode 100644 index 0000000..2ecf10b --- /dev/null +++ b/lib/stdlib/chacha_private.h @@ -0,0 +1,221 @@ +/* +chacha-merged.c version 20080118 +D. J. Bernstein +Public domain. +*/ + +/* $OpenBSD: chacha_private.h,v 1.3 2022/02/28 21:56:29 dtucker Exp $ */ + +#include + +typedef uint8_t u8; +typedef uint32_t u32; + +typedef struct +{ + u32 input[16]; /* could be compressed */ +} chacha_ctx; + +#define U8V(v) ((u8)(v)) +#define U32V(v) ((u32)(v)) + +#define ROTL32(v, n) \ + (U32V((v) << (n)) | ((v) >> (32 - (n)))) + +#define U8TO32_LITTLE(p) \ + (((u32)((p)[0]) ) | \ + ((u32)((p)[1]) << 8) | \ + ((u32)((p)[2]) << 16) | \ + ((u32)((p)[3]) << 24)) + +#define U32TO8_LITTLE(p, v) \ + do { \ + (p)[0] = U8V((v) ); \ + (p)[1] = U8V((v) >> 8); \ + (p)[2] = U8V((v) >> 16); \ + (p)[3] = U8V((v) >> 24); \ + } while (0) + +#define ROTATE(v,c) (ROTL32(v,c)) +#define XOR(v,w) ((v) ^ (w)) +#define PLUS(v,w) (U32V((v) + (w))) +#define PLUSONE(v) (PLUS((v),1)) + +#define QUARTERROUND(a,b,c,d) \ + a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \ + c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \ + a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \ + c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); + +static const char sigma[16] = "expand 32-byte k"; +static const char tau[16] = "expand 16-byte k"; + +static void +chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits) +{ + const char *constants; + + x->input[4] = U8TO32_LITTLE(k + 0); + x->input[5] = U8TO32_LITTLE(k + 4); + x->input[6] = U8TO32_LITTLE(k + 8); + x->input[7] = U8TO32_LITTLE(k + 12); + if (kbits == 256) { /* recommended */ + k += 16; + constants = sigma; + } else { /* kbits == 128 */ + constants = tau; + } + x->input[8] = U8TO32_LITTLE(k + 0); + x->input[9] = U8TO32_LITTLE(k + 4); + x->input[10] = U8TO32_LITTLE(k + 8); + x->input[11] = U8TO32_LITTLE(k + 12); + x->input[0] = U8TO32_LITTLE(constants + 0); + x->input[1] = U8TO32_LITTLE(constants + 4); + x->input[2] = U8TO32_LITTLE(constants + 8); + x->input[3] = U8TO32_LITTLE(constants + 12); +} + +static void +chacha_ivsetup(chacha_ctx *x,const u8 *iv) +{ + x->input[12] = 0; + x->input[13] = 0; + x->input[14] = U8TO32_LITTLE(iv + 0); + x->input[15] = U8TO32_LITTLE(iv + 4); +} + +static void +chacha_encrypt_bytes(chacha_ctx *x,const u8 *m,u8 *c,u32 bytes) +{ + u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15; + u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15; + u8 *ctarget = NULL; + u8 tmp[64]; + u_int i; + + if (!bytes) return; + + j0 = x->input[0]; + j1 = x->input[1]; + j2 = x->input[2]; + j3 = x->input[3]; + j4 = x->input[4]; + j5 = x->input[5]; + j6 = x->input[6]; + j7 = x->input[7]; + j8 = x->input[8]; + j9 = x->input[9]; + j10 = x->input[10]; + j11 = x->input[11]; + j12 = x->input[12]; + j13 = x->input[13]; + j14 = x->input[14]; + j15 = x->input[15]; + + for (;;) { + if (bytes < 64) { + for (i = 0;i < bytes;++i) tmp[i] = m[i]; + m = tmp; + ctarget = c; + c = tmp; + } + x0 = j0; + x1 = j1; + x2 = j2; + x3 = j3; + x4 = j4; + x5 = j5; + x6 = j6; + x7 = j7; + x8 = j8; + x9 = j9; + x10 = j10; + x11 = j11; + x12 = j12; + x13 = j13; + x14 = j14; + x15 = j15; + for (i = 20;i > 0;i -= 2) { + QUARTERROUND( x0, x4, x8,x12) + QUARTERROUND( x1, x5, x9,x13) + QUARTERROUND( x2, x6,x10,x14) + QUARTERROUND( x3, x7,x11,x15) + QUARTERROUND( x0, x5,x10,x15) + QUARTERROUND( x1, x6,x11,x12) + QUARTERROUND( x2, x7, x8,x13) + QUARTERROUND( x3, x4, x9,x14) + } + x0 = PLUS(x0,j0); + x1 = PLUS(x1,j1); + x2 = PLUS(x2,j2); + x3 = PLUS(x3,j3); + x4 = PLUS(x4,j4); + x5 = PLUS(x5,j5); + x6 = PLUS(x6,j6); + x7 = PLUS(x7,j7); + x8 = PLUS(x8,j8); + x9 = PLUS(x9,j9); + x10 = PLUS(x10,j10); + x11 = PLUS(x11,j11); + x12 = PLUS(x12,j12); + x13 = PLUS(x13,j13); + x14 = PLUS(x14,j14); + x15 = PLUS(x15,j15); + +#ifndef KEYSTREAM_ONLY + x0 = XOR(x0,U8TO32_LITTLE(m + 0)); + x1 = XOR(x1,U8TO32_LITTLE(m + 4)); + x2 = XOR(x2,U8TO32_LITTLE(m + 8)); + x3 = XOR(x3,U8TO32_LITTLE(m + 12)); + x4 = XOR(x4,U8TO32_LITTLE(m + 16)); + x5 = XOR(x5,U8TO32_LITTLE(m + 20)); + x6 = XOR(x6,U8TO32_LITTLE(m + 24)); + x7 = XOR(x7,U8TO32_LITTLE(m + 28)); + x8 = XOR(x8,U8TO32_LITTLE(m + 32)); + x9 = XOR(x9,U8TO32_LITTLE(m + 36)); + x10 = XOR(x10,U8TO32_LITTLE(m + 40)); + x11 = XOR(x11,U8TO32_LITTLE(m + 44)); + x12 = XOR(x12,U8TO32_LITTLE(m + 48)); + x13 = XOR(x13,U8TO32_LITTLE(m + 52)); + x14 = XOR(x14,U8TO32_LITTLE(m + 56)); + x15 = XOR(x15,U8TO32_LITTLE(m + 60)); +#endif + + j12 = PLUSONE(j12); + if (!j12) { + j13 = PLUSONE(j13); + /* stopping at 2^70 bytes per nonce is user's responsibility */ + } + + U32TO8_LITTLE(c + 0,x0); + U32TO8_LITTLE(c + 4,x1); + U32TO8_LITTLE(c + 8,x2); + U32TO8_LITTLE(c + 12,x3); + U32TO8_LITTLE(c + 16,x4); + U32TO8_LITTLE(c + 20,x5); + U32TO8_LITTLE(c + 24,x6); + U32TO8_LITTLE(c + 28,x7); + U32TO8_LITTLE(c + 32,x8); + U32TO8_LITTLE(c + 36,x9); + U32TO8_LITTLE(c + 40,x10); + U32TO8_LITTLE(c + 44,x11); + U32TO8_LITTLE(c + 48,x12); + U32TO8_LITTLE(c + 52,x13); + U32TO8_LITTLE(c + 56,x14); + U32TO8_LITTLE(c + 60,x15); + + if (bytes <= 64) { + if (bytes < 64) { + for (i = 0;i < bytes;++i) ctarget[i] = c[i]; + } + x->input[12] = j12; + x->input[13] = j13; + return; + } + bytes -= 64; + c += 64; +#ifndef KEYSTREAM_ONLY + m += 64; +#endif + } +} diff --git a/lib/stdlib/cxa_atexit.c b/lib/stdlib/cxa_atexit.c new file mode 100644 index 0000000..ae2d21a --- /dev/null +++ b/lib/stdlib/cxa_atexit.c @@ -0,0 +1,39 @@ +/* + * Implementation of __cxa_atexit. + */ + +#include +#include +#include +#include +#include "atexit.h" + +#ifdef _REENT_SMALL + +#include "on_exit_args.h" + +/* force linking of static instance of _on_exit_args */ +const void * const __cxa_atexit_dummy = &__on_exit_args; + +#endif /* def _REENT_SMALL */ + +/* + * Register a function to be performed at exit or DSO unload. + */ + +int +__cxa_atexit (void (*fn) (void *), + void *arg, + void *d) +{ +#ifdef _LITE_EXIT + /* Refer to comments in __atexit.c for more details of lite exit. */ + int __register_exitproc (int, void (*fn) (void), void *, void *) + __attribute__ ((weak)); + + if (!__register_exitproc) + return 0; + else +#endif + return __register_exitproc (__et_cxa, (void (*)(void)) fn, arg, d); +} diff --git a/lib/stdlib/cxa_finalize.c b/lib/stdlib/cxa_finalize.c new file mode 100644 index 0000000..4675328 --- /dev/null +++ b/lib/stdlib/cxa_finalize.c @@ -0,0 +1,19 @@ +/* + * Implementation if __cxa_finalize. + */ + + +#include +#include +#include "atexit.h" + +/* + * Call registered exit handlers. If D is null then all handlers are called, + * otherwise only the handlers from that DSO are called. + */ + +void +__cxa_finalize (void * d) +{ + __call_exitprocs (0, d); +} diff --git a/lib/stdlib/div.c b/lib/stdlib/div.c new file mode 100644 index 0000000..4868c6d --- /dev/null +++ b/lib/stdlib/div.c @@ -0,0 +1,122 @@ +/* +FUNCTION +<

>---divide two integers + +INDEX + div + +SYNOPSIS + #include + div_t div(int <[n]>, int <[d]>); + +DESCRIPTION +Divide +@tex +$n/d$, +@end tex +@ifnottex +<[n]>/<[d]>, +@end ifnottex +returning quotient and remainder as two integers in a structure <>. + +RETURNS +The result is represented with the structure + +. typedef struct +. { +. int quot; +. int rem; +. } div_t; + +where the <> field represents the quotient, and <> the +remainder. For nonzero <[d]>, if `<<<[r]> = div(<[n]>,<[d]>);>>' then +<[n]> equals `<<<[r]>.rem + <[d]>*<[r]>.quot>>'. + +To divide <> rather than <> values, use the similar +function <>. + +PORTABILITY +<
> is ANSI. + +No supporting OS subroutines are required. +*/ + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include /* div_t */ + +div_t +div (int num, + int denom) +{ + div_t r; + + r.quot = num / denom; + r.rem = num % denom; + /* + * The ANSI standard says that |r.quot| <= |n/d|, where + * n/d is to be computed in infinite precision. In other + * words, we should always truncate the quotient towards + * 0, never -infinity or +infinity. + * + * Machine division and remainer may work either way when + * one or both of n or d is negative. If only one is + * negative and r.quot has been truncated towards -inf, + * r.rem will have the same sign as denom and the opposite + * sign of num; if both are negative and r.quot has been + * truncated towards -inf, r.rem will be positive (will + * have the opposite sign of num). These are considered + * `wrong'. + * + * If both are num and denom are positive, r will always + * be positive. + * + * This all boils down to: + * if num >= 0, but r.rem < 0, we got the wrong answer. + * In that case, to get the right answer, add 1 to r.quot and + * subtract denom from r.rem. + * if num < 0, but r.rem > 0, we also have the wrong answer. + * In this case, to get the right answer, subtract 1 from r.quot and + * add denom to r.rem. + */ + if (num >= 0 && r.rem < 0) { + ++r.quot; + r.rem -= denom; + } + else if (num < 0 && r.rem > 0) { + --r.quot; + r.rem += denom; + } + return (r); +} diff --git a/lib/stdlib/drand48.c b/lib/stdlib/drand48.c new file mode 100644 index 0000000..0616894 --- /dev/null +++ b/lib/stdlib/drand48.c @@ -0,0 +1,29 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +double +_drand48_r (struct _reent *r) +{ + _REENT_CHECK_RAND48(r); + return _erand48_r(r, __rand48_seed); +} + +#ifndef _REENT_ONLY +double +drand48 (void) +{ + return _drand48_r (_REENT); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/dtoa.c b/lib/stdlib/dtoa.c new file mode 100644 index 0000000..198fa66 --- /dev/null +++ b/lib/stdlib/dtoa.c @@ -0,0 +1,863 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991 by AT&T. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Please send bug reports to + David M. Gay + AT&T Bell Laboratories, Room 2C-463 + 600 Mountain Avenue + Murray Hill, NJ 07974-2070 + U.S.A. + dmg@research.att.com or research!dmg + */ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local struct _Bigint *_tls_mp_result; +_Thread_local int _tls_mp_result_k; +#endif + +static int +quorem (_Bigint * b, _Bigint * S) +{ + int n; + __Long borrow, y; + __ULong carry, q, ys; + __ULong *bx, *bxe, *sx, *sxe; +#ifdef Pack_32 + __Long z; + __ULong si, zs; +#endif + + n = S->_wds; +#ifdef DEBUG + /*debug*/ if (b->_wds > n) + /*debug*/ Bug ("oversize b in quorem"); +#endif + if (b->_wds < n) + return 0; + sx = S->_x; + sxe = sx + --n; + bx = b->_x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug ("oversized quotient in quorem"); +#endif + if (q) + { + borrow = 0; + carry = 0; + do + { +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + z = (*bx >> 16) - (zs & 0xffff) + borrow; + borrow = z >> 16; + Sign_Extend (borrow, z); + Storeinc (bx, z, y); +#else + ys = *sx++ * q + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + *bx++ = y & 0xffff; +#endif + } + while (sx <= sxe); + if (!*bxe) + { + bx = b->_x; + while (--bxe > bx && !*bxe) + --n; + b->_wds = n; + } + } + if (cmp (b, S) >= 0) + { + q++; + borrow = 0; + carry = 0; + bx = b->_x; + sx = S->_x; + do + { +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + z = (*bx >> 16) - (zs & 0xffff) + borrow; + borrow = z >> 16; + Sign_Extend (borrow, z); + Storeinc (bx, z, y); +#else + ys = *sx++ + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + *bx++ = y & 0xffff; +#endif + } + while (sx <= sxe); + bx = b->_x; + bxe = bx + n; + if (!*bxe) + { + while (--bxe > bx && !*bxe) + --n; + b->_wds = n; + } + } + return q; +} + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the long + * calculation. + */ + + +char * +_dtoa_r (struct _reent *ptr, + double _d, + int mode, + int ndigits, + int *decpt, + int *sign, + char **rve) +{ + /* Arguments ndigits, decpt, sign are similar to those + of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4-9 should give the same return values as 2-3, i.e., + 4 <= mode <= 9 ==> same return as mode + 2 + (mode & 1). These modes are mainly for + debugging; often they run slower but sometimes + faster than modes 2-3. + 4,5,8,9 ==> left-to-right digit generation. + 6-9 ==> don't try fast floating-point estimate + (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0, + k_check, leftright, m2, m5, s2, s5, spec_case, try_quick; + union double_union d, d2, eps; + __Long L; +#ifndef Sudden_Underflow + int denorm; + __ULong x; +#endif + _Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S; + double ds; + char *s, *s0; + + d.d = _d; + + _REENT_CHECK_MP(ptr); + if (_REENT_MP_RESULT(ptr)) + { + _REENT_MP_RESULT(ptr)->_k = _REENT_MP_RESULT_K(ptr); + _REENT_MP_RESULT(ptr)->_maxwds = 1 << _REENT_MP_RESULT_K(ptr); + Bfree (ptr, _REENT_MP_RESULT(ptr)); + _REENT_MP_RESULT(ptr) = 0; + } + + if (word0 (d) & Sign_bit) + { + /* set sign for everything, including 0's and NaNs */ + *sign = 1; + word0 (d) &= ~Sign_bit; /* clear sign bit */ + } + else + *sign = 0; + +#if defined(IEEE_Arith) + defined(VAX) +#ifdef IEEE_Arith + if ((word0 (d) & Exp_mask) == Exp_mask) +#else + if (word0 (d) == 0x8000) +#endif + { + /* Infinity or NaN */ + *decpt = 9999; + s = +#ifdef IEEE_Arith + !word1 (d) && !(word0 (d) & 0xfffff) ? "Infinity" : +#endif + "NaN"; + if (rve) + *rve = +#ifdef IEEE_Arith + s[3] ? s + 8 : +#endif + s + 3; + return s; + } +#endif +#ifdef IBM + d.d += 0; /* normalize */ +#endif + if (!d.d) + { + *decpt = 1; + s = "0"; + if (rve) + *rve = s + 1; + return s; + } + + b = d2b (ptr, d.d, &be, &bbits); +#ifdef Sudden_Underflow + i = (int) (word0 (d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); +#else + if ((i = (int) (word0 (d) >> Exp_shift1 & (Exp_mask >> Exp_shift1))) != 0) + { +#endif + d2.d = d.d; + word0 (d2) &= Frac_mask1; + word0 (d2) |= Exp_11; +#ifdef IBM + if (j = 11 - hi0bits (word0 (d2) & Frac_mask)) + d2.d /= 1 << j; +#endif + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ + + i -= Bias; +#ifdef IBM + i <<= 2; + i += j; +#endif +#ifndef Sudden_Underflow + denorm = 0; + } + else + { + /* d is denormalized */ + + i = bbits + be + (Bias + (P - 1) - 1); +#if defined (_DOUBLE_IS_32BITS) + x = word0 (d) << (32 - i); +#else + x = (i > 32) ? (word0 (d) << (64 - i)) | (word1 (d) >> (i - 32)) + : (word1 (d) << (32 - i)); +#endif + d2.d = x; + word0 (d2) -= 31 * Exp_msk1; /* adjust exponent */ + i -= (Bias + (P - 1) - 1) + 1; + denorm = 1; + } +#endif +#if defined (_DOUBLE_IS_32BITS) + ds = (d2.d - 1.5) * 0.289529651 + 0.176091269 + i * 0.30103001; +#else + ds = (d2.d - 1.5) * 0.289529654602168 + 0.1760912590558 + i * 0.301029995663981; +#endif + k = (int) ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; + if (k >= 0 && k <= Ten_pmax) + { + if (d.d < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) + { + b2 = 0; + s2 = j; + } + else + { + b2 = -j; + s2 = 0; + } + if (k >= 0) + { + b5 = 0; + s5 = k; + s2 += k; + } + else + { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + try_quick = 1; + if (mode > 5) + { + mode -= 4; + try_quick = 0; + } + leftright = 1; + ilim = ilim1 = -1; + switch (mode) + { + case 0: + case 1: + i = 18; + ndigits = 0; + break; + case 2: + leftright = 0; + /* no break */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* no break */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + j = sizeof (__ULong); + for (_REENT_MP_RESULT_K(ptr) = 0; sizeof (_Bigint) - sizeof (__ULong) + j <= i; + j <<= 1) + _REENT_MP_RESULT_K(ptr)++; + _REENT_MP_RESULT(ptr) = eBalloc (ptr, _REENT_MP_RESULT_K(ptr)); + s = s0 = (char *) _REENT_MP_RESULT(ptr); + + if (ilim >= 0 && ilim <= Quick_max && try_quick) + { + /* Try to get by with floating-point arithmetic. */ + + i = 0; + d2.d = d.d; + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) + { + ds = tens[k & 0xf]; + j = k >> 4; + if (j & Bletch) + { + /* prevent overflows */ + j &= Bletch - 1; + d.d /= bigtens[n_bigtens - 1]; + ieps++; + } + for (; j; j >>= 1, i++) + if (j & 1) + { + ieps++; + ds *= bigtens[i]; + } + d.d /= ds; + } + else if ((j1 = -k) != 0) + { + d.d *= tens[j1 & 0xf]; + for (j = j1 >> 4; j; j >>= 1, i++) + if (j & 1) + { + ieps++; + d.d *= bigtens[i]; + } + } + if (k_check && d.d < 1. && ilim > 0) + { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + d.d *= 10.; + ieps++; + } + eps.d = ieps * d.d + 7.; + word0 (eps) -= (P - 1) * Exp_msk1; + if (ilim == 0) + { + S = mhi = 0; + d.d -= 5.; + if (d.d > eps.d) + goto one_digit; + if (d.d < -eps.d) + goto no_digits; + goto fast_failed; + } +#ifndef No_leftright + if (leftright) + { + /* Use Steele & White method of only + * generating digits needed. + */ + eps.d = 0.5 / tens[ilim - 1] - eps.d; + for (i = 0;;) + { + L = d.d; + d.d -= L; + *s++ = '0' + (int) L; + if (d.d < eps.d) + goto ret1; + if (1. - d.d < eps.d) + goto bump_up; + if (++i >= ilim) + break; + eps.d *= 10.; + d.d *= 10.; + } + } + else + { +#endif + /* Generate ilim digits, then fix them up. */ + eps.d *= tens[ilim - 1]; + for (i = 1;; i++, d.d *= 10.) + { + L = d.d; + d.d -= L; + *s++ = '0' + (int) L; + if (i == ilim) + { + if (d.d > 0.5 + eps.d) + goto bump_up; + else if (d.d < 0.5 - eps.d) + { + while (*--s == '0'); + s++; + goto ret1; + } + break; + } + } +#ifndef No_leftright + } +#endif + fast_failed: + s = s0; + d.d = d2.d; + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) + { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) + { + S = mhi = 0; + if (ilim < 0 || d.d <= 5 * ds) + goto no_digits; + goto one_digit; + } + for (i = 1;; i++) + { + L = d.d / ds; + d.d -= L * ds; +#ifdef Check_FLT_ROUNDS + /* If FLT_ROUNDS == 2, L will usually be high by 1 */ + if (d.d < 0) + { + L--; + d.d += ds; + } +#endif + *s++ = '0' + (int) L; + if (i == ilim) + { + d.d += d.d; + if ((d.d > ds) || ((d.d == ds) && (L & 1))) + { + bump_up: + while (*--s == '9') + if (s == s0) + { + k++; + *s = '0'; + break; + } + ++*s++; + } + break; + } + if (!(d.d *= 10.)) + break; + } + goto ret1; + } + + m2 = b2; + m5 = b5; + mhi = mlo = 0; + if (leftright) + { + if (mode < 2) + { + i = +#ifndef Sudden_Underflow + denorm ? be + (Bias + (P - 1) - 1 + 1) : +#endif +#ifdef IBM + 1 + 4 * P - 3 - bbits + ((bbits + be - 1) & 3); +#else + 1 + P - bbits; +#endif + } + else + { + j = ilim - 1; + if (m5 >= j) + m5 -= j; + else + { + s5 += j -= m5; + b5 += j; + m5 = 0; + } + if ((i = ilim) < 0) + { + m2 -= i; + i = 0; + } + } + b2 += i; + s2 += i; + mhi = i2b (ptr, 1); + } + if (m2 > 0 && s2 > 0) + { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) + { + if (leftright) + { + if (m5 > 0) + { + mhi = pow5mult (ptr, mhi, m5); + b1 = mult (ptr, mhi, b); + Bfree (ptr, b); + b = b1; + } + if ((j = b5 - m5) != 0) + b = pow5mult (ptr, b, j); + } + else + b = pow5mult (ptr, b, b5); + } + S = i2b (ptr, 1); + if (s5 > 0) + S = pow5mult (ptr, S, s5); + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if (mode < 2) + { + if (!word1 (d) && !(word0 (d) & Bndry_mask) +#ifndef Sudden_Underflow + && word0 (d) & Exp_mask +#endif + ) + { + /* The special case */ + b2 += Log2P; + s2 += Log2P; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ + +#ifdef Pack_32 + if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0x1f) != 0) + i = 32 - i; +#else + if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0xf) != 0) + i = 16 - i; +#endif + if (i > 4) + { + i -= 4; + b2 += i; + m2 += i; + s2 += i; + } + else if (i < 4) + { + i += 28; + b2 += i; + m2 += i; + s2 += i; + } + if (b2 > 0) + b = lshift (ptr, b, b2); + if (s2 > 0) + S = lshift (ptr, S, s2); + if (k_check) + { + if (cmp (b, S) < 0) + { + k--; + b = multadd (ptr, b, 10, 0); /* we botched the k estimate */ + if (leftright) + mhi = multadd (ptr, mhi, 10, 0); + ilim = ilim1; + } + } + if (ilim <= 0 && mode > 2) + { + if (ilim < 0 || cmp (b, S = multadd (ptr, S, 5, 0)) <= 0) + { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + goto ret; + } + one_digit: + *s++ = '1'; + k++; + goto ret; + } + if (leftright) + { + if (m2 > 0) + mhi = lshift (ptr, mhi, m2); + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) + { + mhi = eBalloc (ptr, mhi->_k); + Bcopy (mhi, mlo); + mhi = lshift (ptr, mhi, Log2P); + } + + for (i = 1;; i++) + { + dig = quorem (b, S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp (b, mlo); + delta = diff (ptr, S, mhi); + j1 = delta->_sign ? 1 : cmp (b, delta); + Bfree (ptr, delta); +#ifndef ROUND_BIASED + if (j1 == 0 && !mode && !(word1 (d) & 1)) + { + if (dig == '9') + goto round_9_up; + if (j > 0) + dig++; + *s++ = dig; + goto ret; + } +#endif + if ((j < 0) || ((j == 0) && !mode +#ifndef ROUND_BIASED + && !(word1 (d) & 1) +#endif + )) + { + if (j1 > 0) + { + b = lshift (ptr, b, 1); + j1 = cmp (b, S); + if (((j1 > 0) || ((j1 == 0) && (dig & 1))) + && dig++ == '9') + goto round_9_up; + } + *s++ = dig; + goto ret; + } + if (j1 > 0) + { + if (dig == '9') + { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + goto roundoff; + } + *s++ = dig + 1; + goto ret; + } + *s++ = dig; + if (i == ilim) + break; + b = multadd (ptr, b, 10, 0); + if (mlo == mhi) + mlo = mhi = multadd (ptr, mhi, 10, 0); + else + { + mlo = multadd (ptr, mlo, 10, 0); + mhi = multadd (ptr, mhi, 10, 0); + } + } + } + else + for (i = 1;; i++) + { + *s++ = dig = quorem (b, S) + '0'; + if (i >= ilim) + break; + b = multadd (ptr, b, 10, 0); + } + + /* Round off last digit */ + + b = lshift (ptr, b, 1); + j = cmp (b, S); + if ((j > 0) || ((j == 0) && (dig & 1))) + { + roundoff: + while (*--s == '9') + if (s == s0) + { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else + { + while (*--s == '0'); + s++; + } +ret: + Bfree (ptr, S); + if (mhi) + { + if (mlo && mlo != mhi) + Bfree (ptr, mlo); + Bfree (ptr, mhi); + } +ret1: + Bfree (ptr, b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + return s0; +} diff --git a/lib/stdlib/dtoastub.c b/lib/stdlib/dtoastub.c new file mode 100644 index 0000000..d1c8a67 --- /dev/null +++ b/lib/stdlib/dtoastub.c @@ -0,0 +1,21 @@ +#include <_ansi.h> +#include +#include +#include + +/* Nothing in newlib actually *calls* dtoa, they all call _dtoa_r, so this + is a safe way of providing it to the user. */ +#ifndef _REENT_ONLY + +char * +__dtoa (double d, + int mode, + int ndigits, + int *decpt, + int *sign, + char **rve) +{ + return _dtoa_r (_REENT, d, mode, ndigits, decpt, sign, rve); +} + +#endif diff --git a/lib/stdlib/ecvtbuf.c b/lib/stdlib/ecvtbuf.c new file mode 100644 index 0000000..5148966 --- /dev/null +++ b/lib/stdlib/ecvtbuf.c @@ -0,0 +1,451 @@ +/* +FUNCTION +<>, <>---double or float to string + +INDEX + ecvtbuf +INDEX + fcvtbuf + +SYNOPSIS + #include + + char *ecvtbuf(double <[val]>, int <[chars]>, int *<[decpt]>, + int *<[sgn]>, char *<[buf]>); + + char *fcvtbuf(double <[val]>, int <[decimals]>, int *<[decpt]>, + int *<[sgn]>, char *<[buf]>); + +DESCRIPTION + <> and <> produce (null-terminated) strings + of digits representating the <> number <[val]>. + + The only difference between <> and <> is the + interpretation of the second argument (<[chars]> or + <[decimals]>). For <>, the second argument <[chars]> + specifies the total number of characters to write (which is + also the number of significant digits in the formatted string, + since these two functions write only digits). For <>, + the second argument <[decimals]> specifies the number of + characters to write after the decimal point; all digits for + the integer part of <[val]> are always included. + + Since <> and <> write only digits in the + output string, they record the location of the decimal point + in <<*<[decpt]>>>, and the sign of the number in <<*<[sgn]>>>. + After formatting a number, <<*<[decpt]>>> contains the number + of digits to the left of the decimal point. <<*<[sgn]>>> + contains <<0>> if the number is positive, and <<1>> if it is + negative. For both functions, you supply a pointer <[buf]> to + an area of memory to hold the converted string. + +RETURNS + Both functions return a pointer to <[buf]>, the string + containing a character representation of <[val]>. + +PORTABILITY + Neither function is ANSI C. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" +#include "local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local char *_tls_cvtbuf; +_Thread_local int _tls_cvtlen; +#endif + +static void +print_f (struct _reent *ptr, + char *buf, + double invalue, + int ndigit, + char type, + int dot, + int mode) +{ + int decpt; + int sign; + char *p, *start, *end; + + start = p = _dtoa_r (ptr, invalue, mode, ndigit, &decpt, &sign, &end); + + if (decpt == 9999) + { + strcpy (buf, p); + return; + } + while (*p && decpt > 0) + { + *buf++ = *p++; + decpt--; + } + /* Even if not in buffer */ + while (decpt > 0) + { + *buf++ = '0'; + decpt--; + } + + if (dot || *p) + { + if (p == start) + *buf++ = '0'; + if (decpt < 0 && ndigit > 0) + *buf++ = '.'; + while (decpt < 0 && ndigit > 0) + { + *buf++ = '0'; + decpt++; + ndigit--; + } + + /* Print rest of stuff */ + while (*p && ndigit > 0) + { + *buf++ = *p++; + ndigit--; + } + /* And trailing zeros */ + while (ndigit > 0) + { + *buf++ = '0'; + ndigit--; + } + } + *buf++ = 0; +} + +/* Print number in e format with width chars after. + + TYPE is one of 'e' or 'E'. It may also be one of 'g' or 'G' indicating + that _gcvt is calling us and we should remove trailing zeroes. + + WIDTH is the number of digits of precision after the decimal point. */ + +static void +print_e (struct _reent *ptr, + char *buf, + double invalue, + int width, + char type, + int dot) +{ + int sign; + char *end; + char *p; + int decpt; + int top; + int ndigit = width; + + p = _dtoa_r (ptr, invalue, 2, width + 1, &decpt, &sign, &end); + + if (decpt == 9999) + { + strcpy (buf, p); + return; + } + + *buf++ = *p++; + if (ndigit > 0) + dot = 1; + + while (*p && ndigit > 0) + { + if (dot) { + *buf++ = '.'; + dot = 0; + } + *buf++ = *p++; + ndigit--; + } + + /* Add trailing zeroes to fill out to ndigits unless this is 'g' format. + Also, convert g/G to e/E. */ + + if (type == 'g') + type = 'e'; + else if (type == 'G') + type = 'E'; + else + { + while (ndigit > 0) + { + if (dot) { + *buf++ = '.'; + dot = 0; + } + *buf++ = '0'; + ndigit--; + } + } + + /* Add the exponent. */ + + *buf++ = type; + decpt--; + if (decpt < 0) + { + *buf++ = '-'; + decpt = -decpt; + } + else + { + *buf++ = '+'; + } + if (decpt > 99) + { + int top = decpt / 100; + *buf++ = top + '0'; + decpt -= top * 100; + } + top = decpt / 10; + *buf++ = top + '0'; + decpt -= top * 10; + *buf++ = decpt + '0'; + + *buf++ = 0; +} + +#ifndef _REENT_ONLY + +/* Undocumented behaviour: when given NULL as a buffer, return a + pointer to static space in the rent structure. This is only to + support ecvt and fcvt, which aren't ANSI anyway. */ + +char * +fcvtbuf (double invalue, + int ndigit, + int *decpt, + int *sign, + char *fcvt_buf) +{ + struct _reent *reent = _REENT; + char *save; + char *p; + char *end; + int done = 0; + + if (fcvt_buf == NULL) + { + if (_REENT_CVTLEN(reent) <= ndigit + 35) + { + if ((fcvt_buf = (char *) _realloc_r (reent, _REENT_CVTBUF(reent), + ndigit + 36)) == NULL) + return NULL; + _REENT_CVTLEN(reent) = ndigit + 36; + _REENT_CVTBUF(reent) = fcvt_buf; + } + + fcvt_buf = _REENT_CVTBUF(reent) ; + } + + save = fcvt_buf; + + p = _dtoa_r (reent, invalue, 3, ndigit, decpt, sign, &end); + + /* Now copy */ + + done = -*decpt; + while (p < end) + { + *fcvt_buf++ = *p++; + done++; + } + /* And unsuppress the trailing zeroes */ + while (done < ndigit) + { + *fcvt_buf++ = '0'; + done++; + } + *fcvt_buf++ = 0; + return save; +} + +char * +ecvtbuf (double invalue, + int ndigit, + int *decpt, + int *sign, + char *fcvt_buf) +{ + struct _reent *reent = _REENT; + char *save; + char *p; + char *end; + int done = 0; + + if (fcvt_buf == NULL) + { + if (_REENT_CVTLEN(reent) <= ndigit) + { + if ((fcvt_buf = (char *) _realloc_r (reent, _REENT_CVTBUF(reent), + ndigit + 1)) == NULL) + return NULL; + _REENT_CVTLEN(reent) = ndigit + 1; + _REENT_CVTBUF(reent) = fcvt_buf; + } + + fcvt_buf = _REENT_CVTBUF(reent) ; + } + + save = fcvt_buf; + + p = _dtoa_r (reent, invalue, 2, ndigit, decpt, sign, &end); + + /* Now copy */ + + while (p < end) + { + *fcvt_buf++ = *p++; + done++; + } + /* And unsuppress the trailing zeroes */ + while (done < ndigit) + { + *fcvt_buf++ = '0'; + done++; + } + *fcvt_buf++ = 0; + return save; +} + +#endif + +char * +_gcvt (struct _reent *ptr, + double invalue, + int ndigit, + char *buf, + char type, + int dot) +{ + char *save = buf; + + if (invalue < 0) + { + invalue = -invalue; + } + + if (invalue == 0) + { + *buf++ = '0'; + *buf = '\0'; + } + else + /* Which one to print ? + ANSI says that anything with more that 4 zeros after the . or more + than precision digits before is printed in e with the qualification + that trailing zeroes are removed from the fraction portion. */ + + if (0.0001 >= invalue || invalue >= _mprec_log10 (ndigit)) + { + /* We subtract 1 from ndigit because in the 'e' format the precision is + the number of digits after the . but in 'g' format it is the number + of significant digits. + + We defer changing type to e/E so that print_e() can know it's us + calling and thus should remove trailing zeroes. */ + + print_e (ptr, buf, invalue, ndigit - 1, type, dot); + } + else + { + int decpt; + int sign; + char *end; + char *p; + + /* We always want ndigits of precision, even if that means printing + * a bunch of leading zeros for numbers < 1.0 + */ + p = _dtoa_r (ptr, invalue, 2, ndigit, &decpt, &sign, &end); + + if (decpt == 9999) + { + strcpy (buf, p); + return save; + } + while (*p && decpt > 0) + { + *buf++ = *p++; + decpt--; + ndigit--; + } + /* Even if not in buffer */ + while (decpt > 0 && ndigit > 0) + { + *buf++ = '0'; + decpt--; + ndigit--; + } + + if (dot || *p) + { + if (buf == save) + *buf++ = '0'; + *buf++ = '.'; + + /* Leading zeros don't count towards 'ndigit' */ + while (decpt < 0) + { + *buf++ = '0'; + decpt++; + } + + /* Print rest of stuff */ + while (*p && ndigit > 0) + { + *buf++ = *p++; + ndigit--; + } + /* And trailing zeros */ + if (dot) + { + while (ndigit > 0) + { + *buf++ = '0'; + ndigit--; + } + } + } + *buf++ = 0; + } + + return save; +} + +char * +_dcvt (struct _reent *ptr, + char *buffer, + double invalue, + int precision, + int width, + char type, + int dot) +{ + switch (type) + { + case 'f': + case 'F': + print_f (ptr, buffer, invalue, precision, type, precision == 0 ? dot : 1, 3); + break; + case 'g': + case 'G': + if (precision == 0) + precision = 1; + _gcvt (ptr, invalue, precision, buffer, type, dot); + break; + case 'e': + case 'E': + print_e (ptr, buffer, invalue, precision, type, dot); + } + return buffer; +} diff --git a/lib/stdlib/efgcvt.c b/lib/stdlib/efgcvt.c new file mode 100644 index 0000000..3cdb9c4 --- /dev/null +++ b/lib/stdlib/efgcvt.c @@ -0,0 +1,168 @@ +/* +FUNCTION +<>, <>, <>, <>---double or float to string + +INDEX + ecvt +INDEX + ecvtf +INDEX + fcvt +INDEX + fcvtf + +SYNOPSIS + #include + + char *ecvt(double <[val]>, int <[chars]>, int *<[decpt]>, int *<[sgn]>); + char *ecvtf(float <[val]>, int <[chars]>, int *<[decpt]>, int *<[sgn]>); + + char *fcvt(double <[val]>, int <[decimals]>, + int *<[decpt]>, int *<[sgn]>); + char *fcvtf(float <[val]>, int <[decimals]>, + int *<[decpt]>, int *<[sgn]>); + +DESCRIPTION +<> and <> produce (null-terminated) strings of digits +representating the <> number <[val]>. +<> and <> produce the corresponding character +representations of <> numbers. + +(The <> functions <> and <> are reentrant +versions of <> and <>.) + +The only difference between <> and <> is the +interpretation of the second argument (<[chars]> or <[decimals]>). +For <>, the second argument <[chars]> specifies the total number +of characters to write (which is also the number of significant digits +in the formatted string, since these two functions write only digits). +For <>, the second argument <[decimals]> specifies the number of +characters to write after the decimal point; all digits for the integer +part of <[val]> are always included. + +Since <> and <> write only digits in the output string, +they record the location of the decimal point in <<*<[decpt]>>>, and +the sign of the number in <<*<[sgn]>>>. After formatting a number, +<<*<[decpt]>>> contains the number of digits to the left of the +decimal point. <<*<[sgn]>>> contains <<0>> if the number is positive, +and <<1>> if it is negative. + +RETURNS +All four functions return a pointer to the new string containing a +character representation of <[val]>. + +PORTABILITY +None of these functions are ANSI C. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. + +NEWPAGE +FUNCTION +<>, <>---format double or float as string + +INDEX + gcvt +INDEX + gcvtf + +SYNOPSIS + #include + + char *gcvt(double <[val]>, int <[precision]>, char *<[buf]>); + char *gcvtf(float <[val]>, int <[precision]>, char *<[buf]>); + +DESCRIPTION +<> writes a fully formatted number as a null-terminated +string in the buffer <<*<[buf]>>>. <> produces corresponding +character representations of <> numbers. + +<> uses the same rules as the <> format +`<<%.<[precision]>g>>'---only negative values are signed (with +`<<->>'), and either exponential or ordinary decimal-fraction format +is chosen depending on the number of significant digits (specified by +<[precision]>). + +RETURNS +The result is a pointer to the formatted representation of <[val]> +(the same as the argument <[buf]>). + +PORTABILITY +Neither function is ANSI C. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +#define _XOPEN_SOURCE +#define _XOPEN_SOURCE_EXTENDED +#include <_ansi.h> +#include +#include +#include +#include "local.h" + +char * ecvtbuf (double, int, int*, int*, char *); +char * fcvtbuf (double, int, int*, int*, char *); + +char * +fcvt (double d, + int ndigit, + int *decpt, + int *sign) +{ + return fcvtbuf (d, ndigit, decpt, sign, NULL); +} + +char * +fcvtf (float d, + int ndigit, + int *decpt, + int *sign) +{ + return fcvt ((float) d, ndigit, decpt, sign); +} + + +char * +gcvt (double d, + int ndigit, + char *buf) +{ + char *tbuf = buf; + if (d < 0) { + *buf = '-'; + buf++; + ndigit--; + } + return (_gcvt (_REENT, d, ndigit, buf, 'g', 0) ? tbuf : 0); +} + + +char * +gcvtf (float d, + int ndigit, + char *buf) +{ + double asd = d; + return gcvt (asd, ndigit, buf); +} + + +char * +ecvt (double d, + int ndigit, + int *decpt, + int *sign) +{ + return ecvtbuf (d, ndigit, decpt, sign, NULL); +} + +char * +ecvtf (float d, + int ndigit, + int *decpt, + int *sign) +{ + return ecvt ((double) d, ndigit, decpt, sign); +} diff --git a/lib/stdlib/environ.c b/lib/stdlib/environ.c new file mode 100644 index 0000000..8cc2392 --- /dev/null +++ b/lib/stdlib/environ.c @@ -0,0 +1,36 @@ +/* Copyright (c) 1995, 1996, 2002 Red Hat Incorporated. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * The name of Red Hat Incorporated may not be used to endorse + * or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Provide a definition of `environ' if crt0.o doesn't. */ + +static char *initial_env[] = { 0 }; + +/* Posix says `environ' is a pointer to a null terminated list of pointers. + Hence `environ' itself is never NULL. */ +char **environ = &initial_env[0]; diff --git a/lib/stdlib/envlock.c b/lib/stdlib/envlock.c new file mode 100644 index 0000000..3afe30e --- /dev/null +++ b/lib/stdlib/envlock.c @@ -0,0 +1,54 @@ +/* +FUNCTION +<<__env_lock>>, <<__env_unlock>>---lock environ variable + +INDEX + __env_lock +INDEX + __env_unlock + +SYNOPSIS + #include + void __env_lock (struct _reent *<[reent]>); + void __env_unlock (struct _reent *<[reent]>); + +DESCRIPTION +The <> family of routines call these functions when they need to +modify the environ variable. The version of these routines supplied in the +library use the lock API defined in sys/lock.h. If multiple threads of +execution can call <>, or if <> can be called reentrantly, +then you need to define your own versions of these functions in order to +safely lock the memory pool during a call. If you do not, the memory pool +may become corrupted. + +A call to <> may call <<__env_lock>> recursively; that is, +the sequence of calls may go <<__env_lock>>, <<__env_lock>>, +<<__env_unlock>>, <<__env_unlock>>. Any implementation of these +routines must be careful to avoid causing a thread to wait for a lock +that it already holds. +*/ + +#include "envlock.h" +#include + +#ifndef __SINGLE_THREAD__ +__LOCK_INIT_RECURSIVE(static, __env_recursive_mutex); +#endif + +void +__env_lock (ptr) + struct _reent *ptr; +{ +#ifndef __SINGLE_THREAD__ + __lock_acquire_recursive (__env_recursive_mutex); +#endif +} + +void +__env_unlock (ptr) + struct _reent *ptr; +{ +#ifndef __SINGLE_THREAD__ + __lock_release_recursive (__env_recursive_mutex); +#endif +} diff --git a/lib/stdlib/eprintf.c b/lib/stdlib/eprintf.c new file mode 100644 index 0000000..46cf810 --- /dev/null +++ b/lib/stdlib/eprintf.c @@ -0,0 +1,26 @@ +/* This is an implementation of the __eprintf function which is + compatible with the assert.h which is distributed with gcc. + + This function is provided because in some cases libgcc.a will not + provide __eprintf. This will happen if inhibit_libc is defined, + which is done because at the time that libgcc2.c is compiled, the + correct may not be available. newlib provides its own + copy of assert.h, which calls __assert, not __eprintf. However, in + some cases you may accidentally wind up compiling with the gcc + assert.h. In such a case, this __eprintf will be used if there + does not happen to be one in libgcc2.c. */ + +#include +#include + +void +__eprintf (format, file, line, expression) + const char *format; + const char *file; + unsigned int line; + const char *expression; +{ + (void) fiprintf (stderr, format, file, line, expression); + abort (); + /*NOTREACHED*/ +} diff --git a/lib/stdlib/erand48.c b/lib/stdlib/erand48.c new file mode 100644 index 0000000..1be4a95 --- /dev/null +++ b/lib/stdlib/erand48.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +double +_erand48_r (struct _reent *r, + unsigned short xseed[3]) +{ + __dorand48(r, xseed); + return ldexp((double) xseed[0], -48) + + ldexp((double) xseed[1], -32) + + ldexp((double) xseed[2], -16); +} + +#ifndef _REENT_ONLY +double +erand48 (unsigned short xseed[3]) +{ + return _erand48_r (_REENT, xseed); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/exit.c b/lib/stdlib/exit.c new file mode 100644 index 0000000..9b7bd51 --- /dev/null +++ b/lib/stdlib/exit.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + */ + +/* +FUNCTION +<>---end program execution + +INDEX + exit + +SYNOPSIS + #include + void exit(int <[code]>); + +DESCRIPTION +Use <> to return control from a program to the host operating +environment. Use the argument <[code]> to pass an exit status to the +operating environment: two particular values, <> and +<>, are defined in `<>' to indicate success or +failure in a portable fashion. + +<> does two kinds of cleanup before ending execution of your +program. First, it calls all application-defined cleanup functions +you have enrolled with <>. Second, files and streams are +cleaned up: any pending output is delivered to the host system, each +open file or stream is closed, and files created by <> are +deleted. + +RETURNS +<> does not return to its caller. + +PORTABILITY +ANSI C requires <>, and specifies that <> and +<> must be defined. + +Supporting OS subroutines required: <<_exit>>. +*/ + +#include +#include /* for _exit() declaration */ +#include +#include "atexit.h" + +/* + * Exit, flushing stdio buffers if necessary. + */ + +void +exit (int code) +{ +#ifdef _LITE_EXIT + /* Refer to comments in __atexit.c for more details of lite exit. */ + void __call_exitprocs (int, void *) __attribute__((weak)); + if (__call_exitprocs) +#endif + __call_exitprocs (code, NULL); + + if (__stdio_exit_handler != NULL) + (*__stdio_exit_handler) (); + + _exit (code); +} diff --git a/lib/stdlib/freer.c b/lib/stdlib/freer.c new file mode 100644 index 0000000..1418d0c --- /dev/null +++ b/lib/stdlib/freer.c @@ -0,0 +1,2 @@ +#define DEFINE_FREE +#include "_mallocr.c" diff --git a/lib/stdlib/gdtoa-dmisc.c b/lib/stdlib/gdtoa-dmisc.c new file mode 100644 index 0000000..332023d --- /dev/null +++ b/lib/stdlib/gdtoa-dmisc.c @@ -0,0 +1,230 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#include +#include + +#ifdef _USE_GDTOA +#include "gdtoaimp.h" + +#ifndef MULTIPLE_THREADS + char *dtoa_result; +#endif + + char * +#ifdef KR_headers +rv_alloc(ptr, i) struct _reent *ptr, int i; +#else +rv_alloc(struct _reent *ptr, int i) +#endif +{ + int j, k, *r; + + j = sizeof(ULong); + for(k = 0; + sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; + j <<= 1) + k++; + r = (int*)Balloc(ptr, k); + if (r == NULL) + return ( +#ifndef MULTIPLE_THREADS + dtoa_result = +#endif + NULL); + *r = k; + return +#ifndef MULTIPLE_THREADS + dtoa_result = +#endif + (char *)(r+1); + } + + char * +#ifdef KR_headers +nrv_alloc(ptr, s, rve, n) struct _reent *ptr, char *s, **rve; int n; +#else +nrv_alloc(struct _reent *ptr, char *s, char **rve, int n) +#endif +{ + char *rv, *t; + + t = rv = rv_alloc(ptr, n); + if (t == NULL) + return (NULL); + while((*t = *s++) !=0) + t++; + if (rve) + *rve = t; + return rv; + } + +/* freedtoa(s) must be used to free values s returned by dtoa + * when MULTIPLE_THREADS is #defined. It should be used in all cases, + * but for consistency with earlier versions of dtoa, it is optional + * when MULTIPLE_THREADS is not defined. + */ + + void +#ifdef KR_headers +freedtoa(ptr, s) struct _reent *ptr, char *s; +#else +freedtoa(struct _reent *ptr, char *s) +#endif +{ + Bigint *b = (Bigint *)((int *)s - 1); + b->_maxwds = 1 << (b->_k = *(int*)b); + Bfree(ptr, b); +#ifndef MULTIPLE_THREADS + if (s == dtoa_result) + dtoa_result = 0; +#endif + } +DEF_STRONG(freedtoa); + + int +quorem +#ifdef KR_headers + (b, S) Bigint *b, *S; +#else + (Bigint *b, Bigint *S) +#endif +{ + int n; + ULong *bx, *bxe, q, *sx, *sxe; +#ifdef ULLong + ULLong borrow, carry, y, ys; +#else + ULong borrow, carry, y, ys; +#ifdef Pack_32 + ULong si, z, zs; +#endif +#endif + + n = S->_wds; +#ifdef DEBUG + /*debug*/ if (b->_wds > n) + /*debug*/ Bug("oversize b in quorem"); +#endif + if (b->_wds < n) + return 0; + sx = S->_x; + sxe = sx + --n; + bx = b->_x; + bxe = bx + n; + q = *bxe / (*sxe + 1); /* ensure q <= true quotient */ +#ifdef DEBUG + /*debug*/ if (q > 9) + /*debug*/ Bug("oversized quotient in quorem"); +#endif + if (q) { + borrow = 0; + carry = 0; + do { +#ifdef ULLong + ys = *sx++ * (ULLong)q + carry; + carry = ys >> 32; + y = *bx - (ys & 0xffffffffUL) - borrow; + borrow = y >> 32 & 1UL; + *bx++ = y & 0xffffffffUL; +#else +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) * q + carry; + zs = (si >> 16) * q + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#else + ys = *sx++ * q + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + *bx++ = y & 0xffff; +#endif +#endif + } + while(sx <= sxe); + if (!*bxe) { + bx = b->_x; + while(--bxe > bx && !*bxe) + --n; + b->_wds = n; + } + } + if (cmp(b, S) >= 0) { + q++; + borrow = 0; + carry = 0; + bx = b->_x; + sx = S->_x; + do { +#ifdef ULLong + ys = *sx++ + carry; + carry = ys >> 32; + y = *bx - (ys & 0xffffffffUL) - borrow; + borrow = y >> 32 & 1UL; + *bx++ = y & 0xffffffffUL; +#else +#ifdef Pack_32 + si = *sx++; + ys = (si & 0xffff) + carry; + zs = (si >> 16) + (ys >> 16); + carry = zs >> 16; + y = (*bx & 0xffff) - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + z = (*bx >> 16) - (zs & 0xffff) - borrow; + borrow = (z & 0x10000) >> 16; + Storeinc(bx, z, y); +#else + ys = *sx++ + carry; + carry = ys >> 16; + y = *bx - (ys & 0xffff) - borrow; + borrow = (y & 0x10000) >> 16; + *bx++ = y & 0xffff; +#endif +#endif + } + while(sx <= sxe); + bx = b->_x; + bxe = bx + n; + if (!*bxe) { + while(--bxe > bx && !*bxe) + --n; + b->_wds = n; + } + } + return q; + } +#endif /* _USE_GDTOA */ diff --git a/lib/stdlib/gdtoa-gdtoa.c b/lib/stdlib/gdtoa-gdtoa.c new file mode 100644 index 0000000..da2338c --- /dev/null +++ b/lib/stdlib/gdtoa-gdtoa.c @@ -0,0 +1,837 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 1999 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#include +#include + +#ifdef _USE_GDTOA +#include "gdtoaimp.h" + + static Bigint * +#ifdef KR_headers +bitstob(ptr, bits, nbits, bbits) ULong *bits; +struct _reent ptr, int nbits; int *bbits; +#else +bitstob(struct _reent *ptr, ULong *bits, int nbits, int *bbits) +#endif +{ + int i, k; + Bigint *b; + ULong *be, *x, *x0; + + i = ULbits; + k = 0; + while(i < nbits) { + i <<= 1; + k++; + } +#ifndef Pack_32 + if (!k) + k = 1; +#endif + b = Balloc(ptr, k); + if (b == NULL) + return (NULL); + be = bits + ((nbits - 1) >> kshift); + x = x0 = b->_x; + do { + *x++ = *bits & ALL_ON; +#ifdef Pack_16 + *x++ = (*bits >> 16) & ALL_ON; +#endif + } while(++bits <= be); + i = x - x0; + while(!x0[--i]) + if (!i) { + b->_wds = 0; + *bbits = 0; + goto ret; + } + b->_wds = i + 1; + *bbits = i*ULbits + 32 - hi0bits(b->_x[i]); + ret: + return b; + } + +/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string. + * + * Inspired by "How to Print Floating-Point Numbers Accurately" by + * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * 1. Rather than iterating, we use a simple numeric overestimate + * to determine k = floor(log10(d)). We scale relevant + * quantities using O(log2(k)) rather than O(k) multiplications. + * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't + * try to generate digits strictly left to right. Instead, we + * compute with fewer bits and propagate the carry if necessary + * when rounding the final digit up. This is often faster. + * 3. Under the assumption that input will be rounded nearest, + * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22. + * That is, we allow equality in stopping tests when the + * round-nearest rule will give the same floating-point value + * as would satisfaction of the stopping test with strict + * inequality. + * 4. We remove common factors of powers of 2 from relevant + * quantities. + * 5. When converting floating-point integers less than 1e16, + * we use floating-point arithmetic rather than resorting + * to multiple-precision integers. + * 6. When asked to produce fewer than 15 digits, we first try + * to get by with floating-point arithmetic; we resort to + * multiple-precision integer arithmetic only if we cannot + * guarantee that the floating-point calculation has given + * the correctly rounded result. For k requested digits and + * "uniformly" distributed input, the probability is + * something like 10^(k-15) that we must resort to the Long + * calculation. + */ + + char * +gdtoa +#ifdef KR_headers + (ptr, fpi, be, bits, kindp, mode, ndigits, decpt, rve) + struct _reent *ptr, FPI *fpi; int be; ULong *bits; + int *kindp, mode, ndigits, *decpt; char **rve; +#else + (struct _reent *ptr, FPI *fpi, int be, ULong *bits, int *kindp, + int mode, int ndigits, int *decpt, char **rve) +#endif +{ + /* Arguments ndigits and decpt are similar to the second and third + arguments of ecvt and fcvt; trailing zeros are suppressed from + the returned string. If not null, *rve is set to point + to the end of the return value. If d is +-Infinity or NaN, + then *decpt is set to 9999. + be = exponent: value = (integer represented by bits) * (2 to the power of be). + + mode: + 0 ==> shortest string that yields d when read in + and rounded to nearest. + 1 ==> like 0, but with Steele & White stopping rule; + e.g. with IEEE P754 arithmetic , mode 0 gives + 1e23 whereas mode 1 gives 9.999999999999999e22. + 2 ==> max(1,ndigits) significant digits. This gives a + return value similar to that of ecvt, except + that trailing zeros are suppressed. + 3 ==> through ndigits past the decimal point. This + gives a return value similar to that from fcvt, + except that trailing zeros are suppressed, and + ndigits can be negative. + 4-9 should give the same return values as 2-3, i.e., + 4 <= mode <= 9 ==> same return as mode + 2 + (mode & 1). These modes are mainly for + debugging; often they run slower but sometimes + faster than modes 2-3. + 4,5,8,9 ==> left-to-right digit generation. + 6-9 ==> don't try fast floating-point estimate + (if applicable). + + Values of mode other than 0-9 are treated as mode 0. + + Sufficient space is allocated to the return value + to hold the suppressed trailing zeros. + */ + + int bbits, b2, b5, be0, dig, i, ieps, ilim, ilim0, ilim1, inex; + int j, j1, k, k0, k_check, kind, leftright, m2, m5, nbits; + int rdir, s2, s5, spec_case, try_quick; + Long L; + Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S; + double d2, ds; + char *s, *s0; + U d, eps; + +#ifndef MULTIPLE_THREADS + if (dtoa_result) { + freedtoa(ptr, dtoa_result); + dtoa_result = 0; + } +#endif + inex = 0; + kind = *kindp &= ~STRTOG_Inexact; + switch(kind & STRTOG_Retmask) { + case STRTOG_Zero: + goto ret_zero; + case STRTOG_Normal: + case STRTOG_Denormal: + break; + case STRTOG_Infinite: + *decpt = -32768; + return nrv_alloc(ptr, "Infinity", rve, 8); + case STRTOG_NaN: + *decpt = -32768; + return nrv_alloc(ptr, "NaN", rve, 3); + default: + return 0; + } + b = bitstob(ptr, bits, nbits = fpi->nbits, &bbits); + if (b == NULL) + return (NULL); + be0 = be; + if ( (i = trailz(b)) !=0) { + rshift(b, i); + be += i; + bbits -= i; + } + if (!b->_wds) { + Bfree(ptr, b); + ret_zero: + *decpt = 1; + return nrv_alloc(ptr, "0", rve, 1); + } + + dval(d) = b2d(b, &i); + i = be + bbits - 1; + word0(d) &= Frac_mask1; + word0(d) |= Exp_11; +#ifdef IBM + if ( (j = 11 - hi0bits(word0(d) & Frac_mask)) !=0) + dval(d) /= 1 << j; +#endif + + /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 + * log10(x) = log(x) / log(10) + * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10)) + * log10(&d) = (i-Bias)*log(2)/log(10) + log10(d2) + * + * This suggests computing an approximation k to log10(&d) by + * + * k = (i - Bias)*0.301029995663981 + * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 ); + * + * We want k to be too large rather than too small. + * The error in the first-order Taylor series approximation + * is in our favor, so we just round up the constant enough + * to compensate for any error in the multiplication of + * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077, + * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14, + * adding 1e-13 to the constant term more than suffices. + * Hence we adjust the constant term to 0.1760912590558. + * (We could get a more accurate k by invoking log10, + * but this is probably not worthwhile.) + */ +#ifdef IBM + i <<= 2; + i += j; +#endif + ds = (dval(d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; + + /* correct assumption about exponent range */ + if ((j = i) < 0) + j = -j; + if ((j -= 1077) > 0) + ds += j * 7e-17; + + k = (int)ds; + if (ds < 0. && ds != k) + k--; /* want k = floor(ds) */ + k_check = 1; +#ifdef IBM + j = be + bbits - 1; + if ( (j1 = j & 3) !=0) + dval(d) *= 1 << j1; + word0(d) += j << Exp_shift - 2 & Exp_mask; +#else + word0(d) += (be + bbits - 1) << Exp_shift; +#endif + if (k >= 0 && k <= Ten_pmax) { + if (dval(d) < tens[k]) + k--; + k_check = 0; + } + j = bbits - i - 1; + if (j >= 0) { + b2 = 0; + s2 = j; + } + else { + b2 = -j; + s2 = 0; + } + if (k >= 0) { + b5 = 0; + s5 = k; + s2 += k; + } + else { + b2 -= k; + b5 = -k; + s5 = 0; + } + if (mode < 0 || mode > 9) + mode = 0; + try_quick = 1; + if (mode > 5) { + mode -= 4; + try_quick = 0; + } + else if (i >= -4 - Emin || i < Emin) + try_quick = 0; + leftright = 1; + ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */ + /* silence erroneous "gcc -Wall" warning. */ + switch(mode) { + case 0: + case 1: + i = (int)(nbits * .30103) + 3; + ndigits = 0; + break; + case 2: + leftright = 0; + /* no break */ + case 4: + if (ndigits <= 0) + ndigits = 1; + ilim = ilim1 = i = ndigits; + break; + case 3: + leftright = 0; + /* no break */ + case 5: + i = ndigits + k + 1; + ilim = i; + ilim1 = i - 1; + if (i <= 0) + i = 1; + } + s = s0 = rv_alloc(ptr, i); + if (s == NULL) + return (NULL); + + if ( (rdir = fpi->rounding - 1) !=0) { + if (rdir < 0) + rdir = 2; + if (kind & STRTOG_Neg) + rdir = 3 - rdir; + } + + /* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */ + + if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir +#ifndef IMPRECISE_INEXACT + && k == 0 +#endif + ) { + + /* Try to get by with floating-point arithmetic. */ + + i = 0; + d2 = dval(d); +#ifdef IBM + if ( (j = 11 - hi0bits(word0(d) & Frac_mask)) !=0) + dval(d) /= 1 << j; +#endif + k0 = k; + ilim0 = ilim; + ieps = 2; /* conservative */ + if (k > 0) { + ds = tens[k&0xf]; + j = k >> 4; + if (j & Bletch) { + /* prevent overflows */ + j &= Bletch - 1; + dval(d) /= bigtens[n_bigtens-1]; + ieps++; + } + for(; j; j >>= 1, i++) + if (j & 1) { + ieps++; + ds *= bigtens[i]; + } + } + else { + ds = 1.; + if ( (j1 = -k) !=0) { + dval(d) *= tens[j1 & 0xf]; + for(j = j1 >> 4; j; j >>= 1, i++) + if (j & 1) { + ieps++; + dval(d) *= bigtens[i]; + } + } + } + if (k_check && dval(d) < 1. && ilim > 0) { + if (ilim1 <= 0) + goto fast_failed; + ilim = ilim1; + k--; + dval(d) *= 10.; + ieps++; + } + dval(eps) = ieps*dval(d) + 7.; + word0(eps) -= (P-1)*Exp_msk1; + if (ilim == 0) { + S = mhi = 0; + dval(d) -= 5.; + if (dval(d) > dval(eps)) + goto one_digit; + if (dval(d) < -dval(eps)) + goto no_digits; + goto fast_failed; + } +#ifndef No_leftright + if (leftright) { + /* Use Steele & White method of only + * generating digits needed. + */ + dval(eps) = ds*0.5/tens[ilim-1] - dval(eps); + for(i = 0;;) { + L = (Long)(dval(d)/ds); + dval(d) -= L*ds; + *s++ = '0' + (int)L; + if (dval(d) < dval(eps)) { + if (dval(d)) + inex = STRTOG_Inexlo; + goto ret1; + } + if (ds - dval(d) < dval(eps)) + goto bump_up; + if (++i >= ilim) + break; + dval(eps) *= 10.; + dval(d) *= 10.; + } + } + else { +#endif + /* Generate ilim digits, then fix them up. */ + dval(eps) *= tens[ilim-1]; + for(i = 1;; i++, dval(d) *= 10.) { + if ( (L = (Long)(dval(d)/ds)) !=0) + dval(d) -= L*ds; + *s++ = '0' + (int)L; + if (i == ilim) { + ds *= 0.5; + if (dval(d) > ds + dval(eps)) + goto bump_up; + else if (dval(d) < ds - dval(eps)) { + if (dval(d)) + inex = STRTOG_Inexlo; + goto clear_trailing0; + } + break; + } + } +#ifndef No_leftright + } +#endif + fast_failed: + s = s0; + dval(d) = d2; + k = k0; + ilim = ilim0; + } + + /* Do we have a "small" integer? */ + + if (be >= 0 && k <= Int_max) { + /* Yes. */ + ds = tens[k]; + if (ndigits < 0 && ilim <= 0) { + S = mhi = 0; + if (ilim < 0 || dval(d) <= 5*ds) + goto no_digits; + goto one_digit; + } + for(i = 1;; i++, dval(d) *= 10.) { + L = dval(d) / ds; + dval(d) -= L*ds; +#ifdef Check_FLT_ROUNDS + /* If FLT_ROUNDS == 2, L will usually be high by 1 */ + if (dval(d) < 0) { + L--; + dval(d) += ds; + } +#endif + *s++ = '0' + (int)L; + if (dval(d) == 0.) + break; + if (i == ilim) { + if (rdir) { + if (rdir == 1) + goto bump_up; + inex = STRTOG_Inexlo; + goto ret1; + } + dval(d) += dval(d); +#ifdef ROUND_BIASED + if (dval(d) >= ds) +#else + if (dval(d) > ds || (dval(d) == ds && L & 1)) +#endif + { + bump_up: + inex = STRTOG_Inexhi; + while(*--s == '9') + if (s == s0) { + k++; + *s = '0'; + break; + } + ++*s++; + } + else { + inex = STRTOG_Inexlo; + clear_trailing0: + while(*--s == '0'){} + ++s; + } + break; + } + } + goto ret1; + } + + m2 = b2; + m5 = b5; + mhi = mlo = 0; + if (leftright) { + i = nbits - bbits; + if (be - i++ < fpi->emin && mode != 3 && mode != 5) { + /* denormal */ + i = be - fpi->emin + 1; + if (mode >= 2 && ilim > 0 && ilim < i) + goto small_ilim; + } + else if (mode >= 2) { + small_ilim: + j = ilim - 1; + if (m5 >= j) + m5 -= j; + else { + s5 += j -= m5; + b5 += j; + m5 = 0; + } + if ((i = ilim) < 0) { + m2 -= i; + i = 0; + } + } + b2 += i; + s2 += i; + mhi = i2b(ptr, 1); + if (mhi == NULL) + return (NULL); + } + if (m2 > 0 && s2 > 0) { + i = m2 < s2 ? m2 : s2; + b2 -= i; + m2 -= i; + s2 -= i; + } + if (b5 > 0) { + if (leftright) { + if (m5 > 0) { + mhi = pow5mult(ptr, mhi, m5); + if (mhi == NULL) + return (NULL); + b1 = mult(ptr, mhi, b); + if (b1 == NULL) + return (NULL); + Bfree(ptr, b); + b = b1; + } + if ( (j = b5 - m5) !=0) { + b = pow5mult(ptr, b, j); + if (b == NULL) + return (NULL); + } + } + else { + b = pow5mult(ptr, b, b5); + if (b == NULL) + return (NULL); + } + } + S = i2b(ptr, 1); + if (S == NULL) + return (NULL); + if (s5 > 0) { + S = pow5mult(ptr, S, s5); + if (S == NULL) + return (NULL); + } + + /* Check for special case that d is a normalized power of 2. */ + + spec_case = 0; + if (mode < 2) { + if (bbits == 1 && be0 > fpi->emin + 1) { + /* The special case */ + b2++; + s2++; + spec_case = 1; + } + } + + /* Arrange for convenient computation of quotients: + * shift left if necessary so divisor has 4 leading 0 bits. + * + * Perhaps we should just compute leading 28 bits of S once + * and for all and pass them and a shift to quorem, so it + * can do shifts and ors to compute the numerator for q. + */ + i = ((s5 ? hi0bits(S->_x[S->_wds-1]) : ULbits - 1) - s2 - 4) & kmask; + m2 += i; + if ((b2 += i) > 0) { + b = lshift(ptr, b, b2); + if (b == NULL) + return (NULL); + } + if ((s2 += i) > 0) { + S = lshift(ptr, S, s2); + if (S == NULL) + return (NULL); + } + if (k_check) { + if (cmp(b,S) < 0) { + k--; + b = multadd(ptr, b, 10, 0); /* we botched the k estimate */ + if (b == NULL) + return (NULL); + if (leftright) { + mhi = multadd(ptr, mhi, 10, 0); + if (mhi == NULL) + return (NULL); + } + ilim = ilim1; + } + } + if (ilim <= 0 && mode > 2) { + S = multadd(ptr, S,5,0); + if (S == NULL) + return (NULL); + if (ilim < 0 || cmp(b,S) <= 0) { + /* no digits, fcvt style */ + no_digits: + k = -1 - ndigits; + inex = STRTOG_Inexlo; + goto ret; + } + one_digit: + inex = STRTOG_Inexhi; + *s++ = '1'; + k++; + goto ret; + } + if (leftright) { + if (m2 > 0) { + mhi = lshift(ptr, mhi, m2); + if (mhi == NULL) + return (NULL); + } + + /* Compute mlo -- check for special case + * that d is a normalized power of 2. + */ + + mlo = mhi; + if (spec_case) { + mhi = Balloc(ptr, mhi->_k); + if (mhi == NULL) + return (NULL); + Bcopy(mhi, mlo); + mhi = lshift(ptr, mhi, 1); + if (mhi == NULL) + return (NULL); + } + + for(i = 1;;i++) { + dig = quorem(b,S) + '0'; + /* Do we yet have the shortest decimal string + * that will round to d? + */ + j = cmp(b, mlo); + delta = diff(ptr, S, mhi); + if (delta == NULL) + return (NULL); + j1 = delta->_sign ? 1 : cmp(b, delta); + Bfree(ptr, delta); +#ifndef ROUND_BIASED + if (j1 == 0 && !mode && !(bits[0] & 1) && !rdir) { + if (dig == '9') + goto round_9_up; + if (j <= 0) { + if (b->_wds > 1 || b->_x[0]) + inex = STRTOG_Inexlo; + } + else { + dig++; + inex = STRTOG_Inexhi; + } + *s++ = dig; + goto ret; + } +#endif + if (j < 0 || (j == 0 && !mode +#ifndef ROUND_BIASED + && !(bits[0] & 1) +#endif + )) { + if (rdir && (b->_wds > 1 || b->_x[0])) { + if (rdir == 2) { + inex = STRTOG_Inexlo; + goto accept; + } + while (cmp(S,mhi) > 0) { + *s++ = dig; + mhi1 = multadd(ptr, mhi, 10, 0); + if (mhi1 == NULL) + return (NULL); + if (mlo == mhi) + mlo = mhi1; + mhi = mhi1; + b = multadd(ptr, b, 10, 0); + if (b == NULL) + return (NULL); + dig = quorem(b,S) + '0'; + } + if (dig++ == '9') + goto round_9_up; + inex = STRTOG_Inexhi; + goto accept; + } + if (j1 > 0) { + b = lshift(ptr, b, 1); + if (b == NULL) + return (NULL); + j1 = cmp(b, S); +#ifdef ROUND_BIASED + if (j1 >= 0 /*)*/ +#else + if ((j1 > 0 || (j1 == 0 && dig & 1)) +#endif + && dig++ == '9') + goto round_9_up; + inex = STRTOG_Inexhi; + } + if (b->_wds > 1 || b->_x[0]) + inex = STRTOG_Inexlo; + accept: + *s++ = dig; + goto ret; + } + if (j1 > 0 && rdir != 2) { + if (dig == '9') { /* possible if i == 1 */ + round_9_up: + *s++ = '9'; + inex = STRTOG_Inexhi; + goto roundoff; + } + inex = STRTOG_Inexhi; + *s++ = dig + 1; + goto ret; + } + *s++ = dig; + if (i == ilim) + break; + b = multadd(ptr, b, 10, 0); + if (b == NULL) + return (NULL); + if (mlo == mhi) { + mlo = mhi = multadd(ptr, mhi, 10, 0); + if (mlo == NULL) + return (NULL); + } + else { + mlo = multadd(ptr, mlo, 10, 0); + if (mlo == NULL) + return (NULL); + mhi = multadd(ptr, mhi, 10, 0); + if (mhi == NULL) + return (NULL); + } + } + } + else + for(i = 1;; i++) { + *s++ = dig = quorem(b,S) + '0'; + if (i >= ilim) + break; + b = multadd(ptr, b, 10, 0); + if (b == NULL) + return (NULL); + } + + /* Round off last digit */ + + if (rdir) { + if (rdir == 2 || (b->_wds <= 1 && !b->_x[0])) + goto chopzeros; + goto roundoff; + } + b = lshift(ptr, b, 1); + if (b == NULL) + return (NULL); + j = cmp(b, S); +#ifdef ROUND_BIASED + if (j >= 0) +#else + if (j > 0 || (j == 0 && dig & 1)) +#endif + { + roundoff: + inex = STRTOG_Inexhi; + while(*--s == '9') + if (s == s0) { + k++; + *s++ = '1'; + goto ret; + } + ++*s++; + } + else { + chopzeros: + if (b->_wds > 1 || b->_x[0]) + inex = STRTOG_Inexlo; + while(*--s == '0'){} + ++s; + } + ret: + Bfree(ptr, S); + if (mhi) { + if (mlo && mlo != mhi) + Bfree(ptr, mlo); + Bfree(ptr, mhi); + } + ret1: + Bfree(ptr, b); + *s = 0; + *decpt = k + 1; + if (rve) + *rve = s; + *kindp |= inex; + return s0; + } +DEF_STRONG(gdtoa); +#endif /* _USE_GDTOA */ diff --git a/lib/stdlib/gdtoa-gethex.c b/lib/stdlib/gdtoa-gethex.c new file mode 100644 index 0000000..74f30e6 --- /dev/null +++ b/lib/stdlib/gdtoa-gethex.c @@ -0,0 +1,359 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" +#include "gdtoa.h" + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) +const unsigned char __hexdig[256]= +{ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0, + 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; +#else /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */ +unsigned char +__hexdig_fun (unsigned char c) +{ + if(c>='0' && c<='9') return c-'0'+0x10; + else if(c>='a' && c<='f') return c-'a'+0x10+10; + else if(c>='A' && c<='F') return c-'A'+0x10+10; + else return 0; +} +#endif /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */ + +static void +rshift (_Bigint *b, + int k) +{ + __ULong *x, *x1, *xe, y; + int n; + + x = x1 = b->_x; + n = k >> kshift; + if (n < b->_wds) { + xe = x + b->_wds; + x += n; + if (k &= kmask) { + n = ULbits - k; + y = *x++ >> k; + while(x < xe) { + *x1++ = (y | (*x << n)) & ALL_ON; + y = *x++ >> k; + } + if ((*x1 = y) !=0) + x1++; + } + else + while(x < xe) + *x1++ = *x++; + } + if ((b->_wds = x1 - b->_x) == 0) + b->_x[0] = 0; +} + +static _Bigint * +increment (struct _reent *ptr, + _Bigint *b) +{ + __ULong *x, *xe; + _Bigint *b1; +#ifdef Pack_16 + __ULong carry = 1, y; +#endif + + x = b->_x; + xe = x + b->_wds; +#ifdef Pack_32 + do { + if (*x < (__ULong)0xffffffffL) { + ++*x; + return b; + } + *x++ = 0; + } while(x < xe); +#else + do { + y = *x + carry; + carry = y >> 16; + *x++ = y & 0xffff; + if (!carry) + return b; + } while(x < xe); + if (carry) +#endif + { + if (b->_wds >= b->_maxwds) { + b1 = eBalloc(ptr, b->_k+1); + Bcopy(b1, b); + Bfree(ptr, b); + b = b1; + } + b->_x[b->_wds++] = 1; + } + return b; +} + + +int +gethex (struct _reent *ptr, const char **sp, const FPI *fpi, + Long *exp, _Bigint **bp, int sign, locale_t loc) +{ + _Bigint *b; + const unsigned char *decpt, *s0, *s, *s1; + int esign, havedig, irv, k, n, nbits, up, zret; + __ULong L, lostbits, *x; + Long e, e1; +#ifdef __HAVE_LOCALE_INFO__ + const unsigned char *decimalpoint = (const unsigned char *) + __get_numeric_locale(loc)->decimal_point; + const size_t decp_len = strlen ((const char *) decimalpoint); + const unsigned char decp_end = decimalpoint[decp_len - 1]; +#else + const unsigned char *decimalpoint = (const unsigned char *) "."; + const size_t decp_len = 1; + const unsigned char decp_end = (unsigned char) '.'; +#endif + + havedig = 0; + s0 = *(const unsigned char **)sp + 2; + while(s0[havedig] == '0') + havedig++; + s0 += havedig; + s = s0; + decpt = 0; + zret = 0; + e = 0; + if (!__get_hexdig(*s)) { + zret = 1; + if (strncmp ((const char *) s, (const char *) decimalpoint, + decp_len) != 0) + goto pcheck; + decpt = (s += decp_len); + if (!__get_hexdig(*s)) + goto pcheck; + while(*s == '0') + s++; + if (__get_hexdig(*s)) + zret = 0; + havedig = 1; + s0 = s; + } + while(__get_hexdig(*s)) + s++; + if (strncmp ((const char *) s, (const char *) decimalpoint, + decp_len) == 0 + && !decpt) { + decpt = (s += decp_len); + while(__get_hexdig(*s)) + s++; + } + if (decpt) + e = -(((Long)(s-decpt)) << 2); + pcheck: + s1 = s; + switch(*s) { + case 'p': + case 'P': + esign = 0; + switch(*++s) { + case '-': + esign = 1; + /* no break */ + case '+': + s++; + } + if ((n = __get_hexdig(*s)) == 0 || n > 0x19) { + s = s1; + break; + } + e1 = n - 0x10; + while((n = __get_hexdig(*++s)) !=0 && n <= 0x19) + e1 = 10*e1 + n - 0x10; + if (esign) + e1 = -e1; + e += e1; + } + *sp = (char*)s; + if (zret) + return havedig ? STRTOG_Zero : STRTOG_NoNumber; + n = s1 - s0 - 1; + for(k = 0; n > 7; n >>= 1) + k++; + b = eBalloc(ptr, k); + x = b->_x; + n = 0; + L = 0; + while(s1 > s0) { + if (*--s1 == decp_end && s1 - decp_len + 1 >= s0 + && strncmp ((const char *) s1 - decp_len + 1, + (const char *) decimalpoint, decp_len) == 0) { + s1 -= decp_len - 1; /* Note the --s1 above! */ + continue; + } + if (n == 32) { + *x++ = L; + L = 0; + n = 0; + } + L |= (__get_hexdig(*s1) & 0x0f) << n; + n += 4; + } + *x++ = L; + b->_wds = n = x - b->_x; + n = 32*n - hi0bits(L); + nbits = fpi->nbits; + lostbits = 0; + x = b->_x; + if (n > nbits) { + n -= nbits; + if (any_on(b,n)) { + lostbits = 1; + k = n - 1; + if (x[k>>kshift] & 1 << (k & kmask)) { + lostbits = 2; + if (k > 1 && any_on(b,k-1)) + lostbits = 3; + } + } + rshift(b, n); + e += n; + } + else if (n < nbits) { + n = nbits - n; + b = lshift(ptr, b, n); + e -= n; + x = b->_x; + } + if (e > fpi->emax) { + ovfl: + Bfree(ptr, b); + *bp = 0; + return STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; + } + irv = STRTOG_Normal; + if (e < fpi->emin) { + irv = STRTOG_Denormal; + n = fpi->emin - e; + if (n >= nbits) { + switch (fpi->rounding) { + case FPI_Round_near: + if (n == nbits && (n < 2 || any_on(b,n-1))) + goto one_bit; + break; + case FPI_Round_up: + if (!sign) + goto one_bit; + break; + case FPI_Round_down: + if (sign) { + one_bit: + *exp = fpi->emin; + x[0] = b->_wds = 1; + *bp = b; + return STRTOG_Denormal | STRTOG_Inexhi + | STRTOG_Underflow; + } + } + Bfree(ptr, b); + *bp = 0; + return STRTOG_Zero | STRTOG_Inexlo | STRTOG_Underflow; + } + k = n - 1; + if (lostbits) + lostbits = 1; + else if (k > 0) + lostbits = any_on(b,k); + if (x[k>>kshift] & 1 << (k & kmask)) + lostbits |= 2; + nbits -= n; + rshift(b,n); + e = fpi->emin; + } + if (lostbits) { + up = 0; + switch(fpi->rounding) { + case FPI_Round_zero: + break; + case FPI_Round_near: + if ((lostbits & 2) + && ((lostbits & 1) | (x[0] & 1))) + up = 1; + break; + case FPI_Round_up: + up = 1 - sign; + break; + case FPI_Round_down: + up = sign; + } + if (up) { + k = b->_wds; + b = increment(ptr, b); + x = b->_x; + if (irv == STRTOG_Denormal) { + if (nbits == fpi->nbits - 1 + && x[nbits >> kshift] & 1 << (nbits & kmask)) + irv = STRTOG_Normal; + } + else if ((b->_wds > k) + || ((n = nbits & kmask) !=0 + && (hi0bits(x[k-1]) < 32-n))) { + rshift(b,1); + if (++e > fpi->emax) + goto ovfl; + } + irv |= STRTOG_Inexhi; + } + else + irv |= STRTOG_Inexlo; + } + *bp = b; + *exp = e; + return irv; +} + diff --git a/lib/stdlib/gdtoa-gmisc.c b/lib/stdlib/gdtoa-gmisc.c new file mode 100644 index 0000000..40c3c2d --- /dev/null +++ b/lib/stdlib/gdtoa-gmisc.c @@ -0,0 +1,91 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#include +#include + +#ifdef _USE_GDTOA +#include "gdtoaimp.h" + + void +#ifdef KR_headers +rshift(b, k) Bigint *b; int k; +#else +rshift(Bigint *b, int k) +#endif +{ + ULong *x, *x1, *xe, y; + int n; + + x = x1 = b->_x; + n = k >> kshift; + if (n < b->_wds) { + xe = x + b->_wds; + x += n; + if (k &= kmask) { + n = ULbits - k; + y = *x++ >> k; + while(x < xe) { + *x1++ = (y | (*x << n)) & ALL_ON; + y = *x++ >> k; + } + if ((*x1 = y) !=0) + x1++; + } + else + while(x < xe) + *x1++ = *x++; + } + if ((b->_wds = x1 - b->_x) == 0) + b->_x[0] = 0; + } + + int +#ifdef KR_headers +trailz(b) Bigint *b; +#else +trailz(Bigint *b) +#endif +{ + ULong L, *x, *xe; + int n = 0; + + x = b->_x; + xe = x + b->_wds; + for(n = 0; x < xe && !*x; x++) + n += ULbits; + if (x < xe) { + L = *x; + n += lo0bits(&L); + } + return n; + } +#endif /* _USE_GDTOA */ diff --git a/lib/stdlib/gdtoa-hexnan.c b/lib/stdlib/gdtoa-hexnan.c new file mode 100644 index 0000000..a17e5a6 --- /dev/null +++ b/lib/stdlib/gdtoa-hexnan.c @@ -0,0 +1,155 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to + David M. Gay + Bell Laboratories, Room 2C-463 + 600 Mountain Avenue + Murray Hill, NJ 07974-0636 + U.S.A. + dmg@bell-labs.com + */ + +/* Modified 06-21-2006 by Jeff Johnston to work with newlib. */ + +#include <_ansi.h> +#include +#include +#include "mprec.h" +#include "gdtoa.h" + +#ifdef INFNAN_CHECK +int +match (const char **sp, + char *t) +{ + int c, d; + const char *s = *sp; + + while( (d = *t++) !=0) { + if ((c = *++s) >= 'A' && c <= 'Z') + c += 'a' - 'A'; + if (c != d) + return 0; + } + *sp = s + 1; + return 1; +} + +static void +L_shift (__ULong *x, + __ULong *x1, + int i) +{ + int j; + + i = 8 - i; + i <<= 2; + j = ULbits - i; + do { + *x |= x[1] << j; + x[1] >>= i; + } while(++x < x1); +} + +int +hexnan (const char **sp, + const FPI *fpi, + __ULong *x0) +{ + __ULong c, h, *x, *x1, *xe; + const char *s; + int havedig, hd0, i, nbits; + + nbits = fpi->nbits; + x = x0 + (nbits >> kshift); + if (nbits & kmask) + x++; + *--x = 0; + x1 = xe = x; + havedig = hd0 = i = 0; + s = *sp; + while((c = *(const unsigned char*)++s)) { + if (!(h = __get_hexdig(c))) { + if (c <= ' ') { + if (hd0 < havedig) { + if (x < x1 && i < 8) + L_shift(x, x1, i); + if (x <= x0) { + i = 8; + continue; + } + hd0 = havedig; + *--x = 0; + x1 = x; + i = 0; + } + continue; + } + if (/*(*/ c == ')') { + *sp = s + 1; + break; + } + return STRTOG_NaN; + } + havedig++; + if (++i > 8) { + if (x <= x0) + continue; + i = 1; + *--x = 0; + } + *x = ((*x << 4) | (h & 0xf)); + } + if (!havedig) + return STRTOG_NaN; + if (x < x1 && i < 8) + L_shift(x, x1, i); + if (x > x0) { + x1 = x0; + do *x1++ = *x++; + while(x <= xe); + do *x1++ = 0; + while(x1 <= xe); + } + else { + /* truncate high-order word if necessary */ + if ( (i = nbits & (ULbits-1)) !=0) + *xe &= ((__ULong)0xffffffff) >> (ULbits - i); + } + for(x1 = xe;; --x1) { + if (*x1 != 0) + break; + if (x1 == x0) { + *x1 = 1; + break; + } + } + return STRTOG_NaNbits; +} +#endif /* INFNAN_CHECK */ diff --git a/lib/stdlib/gdtoa-ldtoa.c b/lib/stdlib/gdtoa-ldtoa.c new file mode 100644 index 0000000..14b9904 --- /dev/null +++ b/lib/stdlib/gdtoa-ldtoa.c @@ -0,0 +1,159 @@ +/* $OpenBSD: ldtoa.c,v 1.4 2016/03/09 16:28:47 deraadt Exp $ */ +/*- + * Copyright (c) 2003 David Schultz + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef _USE_GDTOA +#include +#include +#include +#include +#include +#include +#include +#include "gdtoaimp.h" + +#if (LDBL_MANT_DIG > DBL_MANT_DIG) + +/* + * ldtoa() is a wrapper for gdtoa() that makes it smell like dtoa(), + * except that the floating point argument is passed by reference. + * When dtoa() is passed a NaN or infinity, it sets expt to 9999. + * However, a long double could have a valid exponent of 9999, so we + * use INT_MAX in ldtoa() instead. + */ +char * +_ldtoa_r(struct _reent *ptr, + long double ld, int mode, int ndigits, int *decpt, int *sign, char **rve) +{ + FPI fpi = { + LDBL_MANT_DIG, /* nbits */ + LDBL_MIN_EXP - LDBL_MANT_DIG, /* emin */ + LDBL_MAX_EXP - LDBL_MANT_DIG, /* emax */ + FLT_ROUNDS, /* rounding */ +#ifdef Sudden_Underflow /* unused, but correct anyway */ + 1 +#else + 0 +#endif + }; + int be, kind; + char *ret; + struct ieee_ext *p = (struct ieee_ext *)&ld; + uint32_t bits[(LDBL_MANT_DIG + 31) / 32]; + void *vbits = bits; + + _REENT_CHECK_MP (ptr); + + /* reentrancy addition to use mprec storage pool */ + if (_REENT_MP_RESULT (ptr)) { + _REENT_MP_RESULT (ptr)->_k = _REENT_MP_RESULT_K (ptr); + _REENT_MP_RESULT (ptr)->_maxwds = 1 << _REENT_MP_RESULT_K (ptr); + Bfree (ptr, _REENT_MP_RESULT (ptr)); + _REENT_MP_RESULT (ptr) = 0; + } + + /* + * gdtoa doesn't know anything about the sign of the number, so + * if the number is negative, we need to swap rounding modes of + * 2 (upwards) and 3 (downwards). + */ + *sign = p->ext_sign; + fpi.rounding ^= (fpi.rounding >> 1) & p->ext_sign; + + be = p->ext_exp - (LDBL_MAX_EXP - 1) - (LDBL_MANT_DIG - 1); + EXT_TO_ARRAY32(p, bits); + + switch (fpclassify(ld)) { + case FP_NORMAL: + kind = STRTOG_Normal; +#ifdef EXT_IMPLICIT_NBIT + bits[LDBL_MANT_DIG / 32] |= 1 << ((LDBL_MANT_DIG - 1) % 32); +#endif /* EXT_IMPLICIT_NBIT */ + break; + case FP_ZERO: + kind = STRTOG_Zero; + break; + case FP_SUBNORMAL: + kind = STRTOG_Denormal; + be++; + break; + case FP_INFINITE: + kind = STRTOG_Infinite; + break; + case FP_NAN: + kind = STRTOG_NaN; + break; + default: + abort(); + } + + ret = gdtoa(ptr, &fpi, be, vbits, &kind, mode, ndigits, decpt, rve); + if (*decpt == -32768) + *decpt = INT_MAX; + return ret; +} +DEF_STRONG(_ldtoa_r); + +#else /* (LDBL_MANT_DIG == DBL_MANT_DIG) */ + +char * +_ldtoa_r(struct _reent *ptr, + long double ld, int mode, int ndigits, int *decpt, int *sign, + char **rve) +{ + char *ret; + + ret = _dtoa_r(ptr, (double)ld, mode, ndigits, decpt, sign, rve); + if (*decpt == 9999) + *decpt = INT_MAX; + return ret; +} +DEF_STRONG(_ldtoa_r); + +#endif /* (LDBL_MANT_DIG == DBL_MANT_DIG) */ + +/* Routine used to tell if long double is NaN or Infinity or regular number. + Returns: 0 = regular number + 1 = Nan + 2 = Infinity +*/ +int +_ldcheck (long double *d) +{ + switch (fpclassify(*d)) { + case FP_NAN: + return 1; + case FP_INFINITE: + return 2; + default: + return 0; + } +} + +#endif /* _USE_GDTOA */ diff --git a/lib/stdlib/gdtoa.h b/lib/stdlib/gdtoa.h new file mode 100644 index 0000000..f4d2a56 --- /dev/null +++ b/lib/stdlib/gdtoa.h @@ -0,0 +1,172 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#ifndef GDTOA_H_INCLUDED +#define GDTOA_H_INCLUDED + +#include /* for size_t */ +#include + +#define PROTO_NORMAL(x) +#define __BEGIN_HIDDEN_DECLS +#define __END_HIDDEN_DECLS +#define DEF_STRONG(x) + +#ifndef ULong +#define ULong __ULong +#endif + +#ifndef ANSI +#ifdef KR_headers +#define ANSI(x) () +#define Void /*nothing*/ +#else +#define ANSI(x) x +#define Void void +#endif +#endif /* ANSI */ + +#ifndef CONST +#ifdef KR_headers +#define CONST /* blank */ +#else +#define CONST const +#endif +#endif /* CONST */ + + enum { /* return values from strtodg */ + STRTOG_Zero = 0x000, + STRTOG_Normal = 0x001, + STRTOG_Denormal = 0x002, + STRTOG_Infinite = 0x003, + STRTOG_NaN = 0x004, + STRTOG_NaNbits = 0x005, + STRTOG_NoNumber = 0x006, + STRTOG_NoMemory = 0x007, + STRTOG_Retmask = 0x00f, + + /* The following may be or-ed into one of the above values. */ + + STRTOG_Inexlo = 0x010, /* returned result rounded toward zero */ + STRTOG_Inexhi = 0x020, /* returned result rounded away from zero */ + STRTOG_Inexact = 0x030, + STRTOG_Underflow= 0x040, + STRTOG_Overflow = 0x080, + STRTOG_Neg = 0x100 /* does not affect STRTOG_Inexlo or STRTOG_Inexhi */ + }; + + typedef struct +FPI { + int nbits; + int emin; + int emax; + int rounding; + int sudden_underflow; + } FPI; + +enum { /* FPI.rounding values: same as FLT_ROUNDS */ + FPI_Round_zero = 0, + FPI_Round_near = 1, + FPI_Round_up = 2, + FPI_Round_down = 3 + }; + +typedef unsigned short __UShort; +typedef struct _Bigint Bigint; + +#ifdef __cplusplus +extern "C" { +#endif + +extern char* __dtoa ANSI((struct _reent *ptr, + double d, int mode, int ndigits, int *decpt, + int *sign, char **rve)); +extern char* __gdtoa ANSI((struct _reent *ptr, + FPI *fpi, int be, ULong *bits, int *kindp, + int mode, int ndigits, int *decpt, char **rve)); +extern void __freedtoa ANSI((struct _reent *, char*)); +extern float strtof ANSI((CONST char *, char **)); +extern double strtod ANSI((CONST char *, char **)); +extern int __strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*)); +char *__hdtoa(double, const char *, int, int *, int *, char **); +char *__hldtoa(long double, const char *, int, int *, int *, char **); +char *__ldtoa(struct _reent *ptr, + long double *, int, int, int *, int *, char **); + +PROTO_NORMAL(__dtoa); +PROTO_NORMAL(__gdtoa); +PROTO_NORMAL(__freedtoa); +PROTO_NORMAL(__hdtoa); +PROTO_NORMAL(__hldtoa); +PROTO_NORMAL(__ldtoa); + +__BEGIN_HIDDEN_DECLS +extern char* __g_ddfmt ANSI((char*, double*, int, size_t)); +extern char* __g_dfmt ANSI((char*, double*, int, size_t)); +extern char* __g_ffmt ANSI((char*, float*, int, size_t)); +extern char* __g_Qfmt ANSI((char*, void*, int, size_t)); +extern char* __g_xfmt ANSI((char*, void*, int, size_t)); +extern char* __g_xLfmt ANSI((char*, void*, int, size_t)); + +extern int __strtoId ANSI((CONST char*, char**, double*, double*)); +extern int __strtoIdd ANSI((CONST char*, char**, double*, double*)); +extern int __strtoIf ANSI((CONST char*, char**, float*, float*)); +extern int __strtoIQ ANSI((CONST char*, char**, void*, void*)); +extern int __strtoIx ANSI((CONST char*, char**, void*, void*)); +extern int __strtoIxL ANSI((CONST char*, char**, void*, void*)); +extern int __strtord ANSI((CONST char*, char**, int, double*)); +extern int __strtordd ANSI((CONST char*, char**, int, double*)); +extern int __strtorf ANSI((CONST char*, char**, int, float*)); +extern int __strtorQ ANSI((CONST char*, char**, int, void*)); +extern int __strtorx ANSI((CONST char*, char**, int, void*)); +extern int __strtorxL ANSI((CONST char*, char**, int, void*)); +#if 1 +extern int __strtodI ANSI((CONST char*, char**, double*)); +extern int __strtopd ANSI((CONST char*, char**, double*)); +extern int __strtopdd ANSI((CONST char*, char**, double*)); +extern int __strtopf ANSI((CONST char*, char**, float*)); +extern int __strtopQ ANSI((CONST char*, char**, void*)); +extern int __strtopx ANSI((CONST char*, char**, void*)); +extern int __strtopxL ANSI((CONST char*, char**, void*)); +#else +#define __strtopd(s,se,x) strtord(s,se,1,x) +#define __strtopdd(s,se,x) strtordd(s,se,1,x) +#define __strtopf(s,se,x) strtorf(s,se,1,x) +#define __strtopQ(s,se,x) strtorQ(s,se,1,x) +#define __strtopx(s,se,x) strtorx(s,se,1,x) +#define __strtopxL(s,se,x) strtorxL(s,se,1,x) +#endif +__END_HIDDEN_DECLS + +#ifdef __cplusplus +} +#endif +#endif /* GDTOA_H_INCLUDED */ diff --git a/lib/stdlib/gdtoaimp.h b/lib/stdlib/gdtoaimp.h new file mode 100644 index 0000000..f2da3fc --- /dev/null +++ b/lib/stdlib/gdtoaimp.h @@ -0,0 +1,206 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998-2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* This is a variation on dtoa.c that converts arbitary binary + floating-point formats to and from decimal notation. It uses + double-precision arithmetic internally, so there are still + various #ifdefs that adapt the calculations to the native + double-precision arithmetic (any of IEEE, VAX D_floating, + or IBM mainframe arithmetic). + + Please send bug reports to David M. Gay (dmg at acm dot org, + with " at " changed at "@" and " dot " changed to "."). + */ + +/* On a machine with IEEE extended-precision registers, it is + * necessary to specify double-precision (53-bit) rounding precision + * before invoking strtod or dtoa. If the machine uses (the equivalent + * of) Intel 80x87 arithmetic, the call + * _control87(PC_53, MCW_PC); + * does this with many compilers. Whether this or another call is + * appropriate depends on the compiler; for this to work, it may be + * necessary to #include "float.h" or another system-dependent header + * file. + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* + * #define IEEE_8087 for IEEE-arithmetic machines where the least + * significant byte has the lowest address. + * #define IEEE_MC68k for IEEE-arithmetic machines where the most + * significant byte has the lowest address. + * #define Long int on machines with 32-bit ints and 64-bit longs. + * #define Sudden_Underflow for IEEE-format machines without gradual + * underflow (i.e., that flush to zero on underflow). + * #define IBM for IBM mainframe-style floating-point arithmetic. + * #define VAX for VAX-style floating-point arithmetic (D_floating). + * #define No_leftright to omit left-right logic in fast floating-point + * computation of dtoa and gdtoa. This will cause modes 4 and 5 to be + * treated the same as modes 2 and 3 for some inputs. + * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. + * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines + * that use extended-precision instructions to compute rounded + * products and quotients) with IBM. + * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic + * that rounds toward +Infinity. + * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased + * rounding when the underlying floating-point arithmetic uses + * unbiased rounding. This prevent using ordinary floating-point + * arithmetic when the result could be computed with one rounding error. + * #define Inaccurate_Divide for IEEE-format with correctly rounded + * products but inaccurate quotients, e.g., for Intel i860. + * #define NO_LONG_LONG on machines that do not have a "long long" + * integer type (of >= 64 bits). On such machines, you can + * #define Just_16 to store 16 bits per 32-bit Long when doing + * high-precision integer arithmetic. Whether this speeds things + * up or slows things down depends on the machine and the number + * being converted. If long long is available and the name is + * something other than "long long", #define Llong to be the name, + * and if "unsigned Llong" does not work as an unsigned version of + * Llong, #define #ULLong to be the corresponding unsigned type. + * #define KR_headers for old-style C function headers. + * #define Bad_float_h if your system lacks a float.h or if it does not + * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP, + * FLT_RADIX, FLT_ROUNDS, and DBL_MAX. + * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n) + * if memory is available and otherwise does something you deem + * appropriate. If MALLOC is undefined, malloc will be invoked + * directly -- and assumed always to succeed. Similarly, if you + * want something other than the system's free() to be called to + * recycle memory acquired from MALLOC, #define FREE to be the + * name of the alternate routine. (FREE or free is only called in + * pathological cases, e.g., in a gdtoa call after a gdtoa return in + * mode 3 with thousands of digits requested.) + * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making + * memory allocations from a private pool of memory when possible. + * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes, + * unless #defined to be a different length. This default length + * suffices to get rid of MALLOC calls except for unusual cases, + * such as decimal-to-binary conversion of a very long string of + * digits. When converting IEEE double precision values, the + * longest string gdtoa can return is about 751 bytes long. For + * conversions by strtod of strings of 800 digits and all gdtoa + * conversions of IEEE doubles in single-threaded executions with + * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with + * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate. + * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK + * #defined automatically on IEEE systems. On such systems, + * when INFNAN_CHECK is #defined, strtod checks + * for Infinity and NaN (case insensitively). + * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined, + * strtodg also accepts (case insensitively) strings of the form + * NaN(x), where x is a string of hexadecimal digits (optionally + * preceded by 0x or 0X) and spaces; if there is only one string + * of hexadecimal digits, it is taken for the fraction bits of the + * resulting NaN; if there are two or more strings of hexadecimal + * digits, each string is assigned to the next available sequence + * of 32-bit words of fractions bits (starting with the most + * significant), right-aligned in each sequence. + * Unless GDTOA_NON_PEDANTIC_NANCHECK is #defined, input "NaN(...)" + * is consumed even when ... has the wrong form (in which case the + * "(...)" is consumed but ignored). + * #define MULTIPLE_THREADS if the system offers preemptively scheduled + * multiple threads. In this case, you must provide (or suitably + * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed + * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed + * in pow5mult, ensures lazy evaluation of only one copy of high + * powers of 5; omitting this lock would introduce a small + * probability of wasting memory, but would otherwise be harmless.) + * You must also invoke freedtoa(s) to free the value s returned by + * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined. + * #define IMPRECISE_INEXACT if you do not care about the setting of + * the STRTOG_Inexact bits in the special case of doing IEEE double + * precision conversions (which could also be done by the strtod in + * dtoa.c). + * #define NO_HEX_FP to disable recognition of C9x's hexadecimal + * floating-point constants. + * #define -DNO_ERRNO to suppress setting errno (in strtod.c and + * strtodg.c). + * #define NO_STRING_H to use private versions of memcpy. + * On some K&R systems, it may also be necessary to + * #define DECLARE_SIZE_T in this case. + * #define USE_LOCALE to use the current locale's decimal_point value. + */ + +#ifndef GDTOAIMP_H_INCLUDED +#define GDTOAIMP_H_INCLUDED +#include "mprec.h" +#include "gdtoa.h" + +#ifndef __SINGLE_THREAD__ +#define MULTIPLE_THREADS +#endif + +#define dtoa __dtoa +#define gdtoa __gdtoa +#define freedtoa __freedtoa + +#define dtoa_result __dtoa_result_D2A +#define nrv_alloc __nrv_alloc_D2A +#define quorem __quorem_D2A +#define rshift __rshift_D2A +#define rv_alloc __rv_alloc_D2A +#define trailz __trailz_D2A + +extern char *dtoa_result; +extern char *nrv_alloc ANSI((struct _reent *, char*, char **, int)); +extern int quorem ANSI((Bigint*, Bigint*)); +extern void rshift ANSI((Bigint*, int)); +extern char *rv_alloc ANSI((struct _reent *, int)); +extern int trailz ANSI((Bigint*)); + +#endif /* GDTOAIMP_H_INCLUDED */ diff --git a/lib/stdlib/getenv.c b/lib/stdlib/getenv.c new file mode 100644 index 0000000..9ccb903 --- /dev/null +++ b/lib/stdlib/getenv.c @@ -0,0 +1,85 @@ +/* +FUNCTION +<>---look up environment variable + +INDEX + getenv +INDEX + environ + +SYNOPSIS + #include + char *getenv(const char *<[name]>); + +DESCRIPTION +<> searches the list of environment variable names and values +(using the global pointer ``<>'') for a variable whose +name matches the string at <[name]>. If a variable name matches, +<> returns a pointer to the associated value. + +RETURNS +A pointer to the (string) value of the environment variable, or +<> if there is no such environment variable. + +PORTABILITY +<> is ANSI, but the rules for properly forming names of environment +variables vary from one system to another. + +<> requires a global pointer <>. +*/ + +/* + * Copyright (c) 1987, 2000 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _REENT_ONLY + +#include +#include +#include + +/* + * _findenv -- + * Returns pointer to value associated with name, if any, else NULL. + * Sets offset to be the offset of the name/value combination in the + * environmental array, for use by setenv(3) and unsetenv(3). + * Explicitly removes '=' in argument name. + * + * This routine *should* be a static; don't use it. + */ + +char * +_findenv (register const char *name, + int *offset) +{ + return _findenv_r (_REENT, name, offset); +} + +/* + * getenv -- + * Returns ptr to value associated with name, if any, else NULL. + */ + +char * +getenv (const char *name) +{ + int offset; + + return _findenv_r (_REENT, name, &offset); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/getenv_r.c b/lib/stdlib/getenv_r.c new file mode 100644 index 0000000..6e51800 --- /dev/null +++ b/lib/stdlib/getenv_r.c @@ -0,0 +1,126 @@ +/* +FUNCTION +<<_getenv_r>>---look up environment variable + +INDEX + _getenv_r +INDEX + environ + +SYNOPSIS + #include + char *_getenv_r(struct _reent *<[reent_ptr]>, const char *<[name]>); + +DESCRIPTION +<<_getenv_r>> searches the list of environment variable names and values +(using the global pointer ``<>'') for a variable whose +name matches the string at <[name]>. If a variable name matches, +<<_getenv_r>> returns a pointer to the associated value. + +RETURNS +A pointer to the (string) value of the environment variable, or +<> if there is no such environment variable. + +PORTABILITY +<<_getenv_r>> is not ANSI; the rules for properly forming names of environment +variables vary from one system to another. This implementation does not +permit '=' to be in identifiers. + +<<_getenv_r>> requires a global pointer <>. +*/ + +/* This file may have been modified by DJ Delorie (Jan 1991). If so, +** these modifications are Copyright (C) 1991 DJ Delorie. +*/ + +/* + * Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include +#include +#include +#include "envlock.h" + +extern char **environ; + +/* Only deal with a pointer to environ, to work around subtle bugs with shared + libraries and/or small data systems where the user declares his own + 'environ'. */ +static char ***p_environ = &environ; + +/* + * _findenv -- + * Returns pointer to value associated with name, if any, else NULL. + * Sets offset to be the offset of the name/value combination in the + * environmental array, for use by setenv(3) and unsetenv(3). + * + * This routine *should* be a static; don't use it. + */ + +char * +_findenv_r (struct _reent *reent_ptr, + register const char *name, + int *offset) +{ + register int len; + register char **p; + const char *c; + + ENV_LOCK; + + /* In some embedded systems, this does not get set. This protects + newlib from dereferencing a bad pointer. */ + if (!*p_environ) + { + ENV_UNLOCK; + return NULL; + } + + c = name; + while (*c && *c != '=') c++; + + /* Identifiers may not contain an '=', so cannot match if does */ + if(*c != '=') + { + len = c - name; + for (p = *p_environ; *p; ++p) + if (!strncmp (*p, name, len)) + if (*(c = *p + len) == '=') + { + *offset = p - *p_environ; + ENV_UNLOCK; + return (char *) (++c); + } + } + ENV_UNLOCK; + return NULL; +} + +/* + * _getenv_r -- + * Returns ptr to value associated with name, if any, else NULL. + */ + +char * +_getenv_r (struct _reent *reent_ptr, + const char *name) +{ + int offset; + + return _findenv_r (reent_ptr, name, &offset); +} diff --git a/lib/stdlib/getopt.c b/lib/stdlib/getopt.c new file mode 100644 index 0000000..d4f225a --- /dev/null +++ b/lib/stdlib/getopt.c @@ -0,0 +1,526 @@ +/**************************************************************************** + +getopt.c - Read command line options + +AUTHOR: Gregory Pietsch +CREATED Fri Jan 10 21:13:05 1997 + +DESCRIPTION: + +The getopt() function parses the command line arguments. Its arguments argc +and argv are the argument count and array as passed to the main() function +on program invocation. The argument optstring is a list of available option +characters. If such a character is followed by a colon (`:'), the option +takes an argument, which is placed in optarg. If such a character is +followed by two colons, the option takes an optional argument, which is +placed in optarg. If the option does not take an argument, optarg is NULL. + +The external variable optind is the index of the next array element of argv +to be processed; it communicates from one call to the next which element to +process. + +The getopt_long() function works like getopt() except that it also accepts +long options started by two dashes `--'. If these take values, it is either +in the form + +--arg=value + + or + +--arg value + +It takes the additional arguments longopts which is a pointer to the first +element of an array of type struct option. The last element of the array +has to be filled with NULL for the name field. + +The longind pointer points to the index of the current long option relative +to longopts if it is non-NULL. + +The getopt() function returns the option character if the option was found +successfully, `:' if there was a missing parameter for one of the options, +`?' for an unknown option character, and EOF for the end of the option list. + +The getopt_long() function's return value is described in the header file. + +The function getopt_long_only() is identical to getopt_long(), except that a +plus sign `+' can introduce long options as well as `--'. + +The following describes how to deal with options that follow non-option +argv-elements. + +If the caller did not specify anything, the default is REQUIRE_ORDER if the +environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. + +REQUIRE_ORDER means don't recognize them as options; stop option processing +when the first non-option is seen. This is what Unix does. This mode of +operation is selected by either setting the environment variable +POSIXLY_CORRECT, or using `+' as the first character of the optstring +parameter. + +PERMUTE is the default. We permute the contents of ARGV as we scan, so that +eventually all the non-options are at the end. This allows options to be +given in any order, even with programs that were not written to expect this. + +RETURN_IN_ORDER is an option available to programs that were written to +expect options and other argv-elements in any order and that care about the +ordering of the two. We describe each non-option argv-element as if it were +the argument of an option with character code 1. Using `-' as the first +character of the optstring parameter selects this mode of operation. + +The special argument `--' forces an end of option-scanning regardless of the +value of ordering. In the case of RETURN_IN_ORDER, only `--' can cause +getopt() and friends to return EOF with optind != argc. + +2012-08-26: Tried to make the error handling more sus4-like. The functions +return a colon if getopt() and friends detect a missing argument and the +first character of shortopts/optstring starts with a colon (`:'). If getopt() +and friends detect a missing argument and shortopts/optstring does not start +with a colon, the function returns a question mark (`?'). If it was a missing +argument to a short option, optopt is set to the character in question. The +colon goes after the ordering character (`+' or `-'). + +COPYRIGHT NOTICE AND DISCLAIMER: + +Copyright (C) 1997 Gregory Pietsch + +This file and the accompanying getopt.h header file are hereby placed in the +public domain without restrictions. Just give the author credit, don't +claim you wrote it or prevent anyone else from using it. + +Gregory Pietsch's current e-mail address: +gpietsch@comcast.net +****************************************************************************/ + +#ifndef HAVE_GETOPT + +/* include files */ +#include +#include +#include +#define __need_getopt_newlib +#include + +/* macros */ + +/* types */ +typedef enum GETOPT_ORDERING_T +{ + PERMUTE, + RETURN_IN_ORDER, + REQUIRE_ORDER +} GETOPT_ORDERING_T; + +/* globally-defined variables */ +char *optarg = 0; +int optind = 0; +int opterr = 1; +int optopt = '?'; + +/* static variables */ +static int optwhere = 0; +static int permute_from = 0; +static int num_nonopts = 0; + +/* functions */ + +/* reverse_argv_elements: reverses num elements starting at argv */ +static void +reverse_argv_elements (char **argv, int num) +{ + int i; + char *tmp; + + for (i = 0; i < (num >> 1); i++) + { + tmp = argv[i]; + argv[i] = argv[num - i - 1]; + argv[num - i - 1] = tmp; + } +} + +/* permute: swap two blocks of argv-elements given their lengths */ +static void +permute (char *const argv[], int len1, int len2) +{ + reverse_argv_elements ((char **) argv, len1); + reverse_argv_elements ((char **) argv, len1 + len2); + reverse_argv_elements ((char **) argv, len2); +} + +/* is_option: is this argv-element an option or the end of the option list? */ +static int +is_option (char *argv_element, int only) +{ + return ((argv_element == 0) + || (argv_element[0] == '-') || (only && argv_element[0] == '+')); +} + +/* read_globals: read the values from the globals into a getopt_data + structure */ +static void +read_globals (struct getopt_data *data) +{ + data->optarg = optarg; + data->optind = optind; + data->opterr = opterr; + data->optopt = optopt; + data->optwhere = optwhere; + data->permute_from = permute_from; + data->num_nonopts = num_nonopts; +} + +/* write_globals: write the values into the globals from a getopt_data + structure */ +static void +write_globals (struct getopt_data *data) +{ + optarg = data->optarg; + optind = data->optind; + opterr = data->opterr; + optopt = data->optopt; + optwhere = data->optwhere; + permute_from = data->permute_from; + num_nonopts = data->num_nonopts; +} + +/* getopt_internal: the function that does all the dirty work + NOTE: to reduce the code and RAM footprint this function uses + fputs()/fputc() to do output to stderr instead of fprintf(). */ +static int +getopt_internal (int argc, char *const argv[], const char *shortopts, + const struct option *longopts, int *longind, int only, + struct getopt_data *data) +{ + GETOPT_ORDERING_T ordering = PERMUTE; + int optindex = 0; + size_t match_chars = 0; + char *possible_arg = 0; + int longopt_match = -1; + int has_arg = -1; + char *cp = 0; + int arg_next = 0; + int initial_colon = 0; + + /* first, deal with silly parameters and easy stuff */ + if (argc == 0 || argv == 0 || (shortopts == 0 && longopts == 0) + || data->optind >= argc || argv[data->optind] == 0) + return EOF; + if (strcmp (argv[data->optind], "--") == 0) + { + data->optind++; + return EOF; + } + + /* if this is our first time through */ + if (data->optind == 0) + { + data->optind = 1; + data->optwhere = 1; + data->permute_from = 0; + data->num_nonopts = 0; + } + + /* define ordering */ + if (shortopts != 0 && (*shortopts == '-' || *shortopts == '+')) + { + ordering = (*shortopts == '-') ? RETURN_IN_ORDER : REQUIRE_ORDER; + shortopts++; + } + else + ordering = (getenv ("POSIXLY_CORRECT") != 0) ? REQUIRE_ORDER : PERMUTE; + + /* check for initial colon in shortopts */ + if (shortopts != 0 && *shortopts == ':') + { + ++shortopts; + initial_colon = 1; + } + + /* + * based on ordering, find our next option, if we're at the beginning of + * one + */ + if (data->optwhere == 1) + { + switch (ordering) + { + default: /* shouldn't happen */ + case PERMUTE: + data->permute_from = data->optind; + data->num_nonopts = 0; + while (!is_option (argv[data->optind], only)) + { + data->optind++; + data->num_nonopts++; + } + if (argv[data->optind] == 0) + { + /* no more options */ + data->optind = data->permute_from; + return EOF; + } + else if (strcmp (argv[data->optind], "--") == 0) + { + /* no more options, but have to get `--' out of the way */ + permute (argv + data->permute_from, data->num_nonopts, 1); + data->optind = data->permute_from + 1; + return EOF; + } + break; + case RETURN_IN_ORDER: + if (!is_option (argv[data->optind], only)) + { + data->optarg = argv[data->optind++]; + return (data->optopt = 1); + } + break; + case REQUIRE_ORDER: + if (!is_option (argv[data->optind], only)) + return EOF; + break; + } + } + /* End of option list? */ + if (argv[data->optind] == 0) + return EOF; + + /* we've got an option, so parse it */ + + /* first, is it a long option? */ + if (longopts != 0 + && (memcmp (argv[data->optind], "--", 2) == 0 + || (only && argv[data->optind][0] == '+')) && data->optwhere == 1) + { + /* handle long options */ + if (memcmp (argv[data->optind], "--", 2) == 0) + data->optwhere = 2; + longopt_match = -1; + possible_arg = strchr (argv[data->optind] + data->optwhere, '='); + if (possible_arg == 0) + { + /* no =, so next argv might be arg */ + match_chars = strlen (argv[data->optind]); + possible_arg = argv[data->optind] + match_chars; + match_chars = match_chars - data->optwhere; + } + else + match_chars = (possible_arg - argv[data->optind]) - data->optwhere; + for (optindex = 0; longopts[optindex].name != 0; ++optindex) + { + if (memcmp + (argv[data->optind] + data->optwhere, longopts[optindex].name, + match_chars) == 0) + { + /* do we have an exact match? */ + if (match_chars == strlen (longopts[optindex].name)) + { + longopt_match = optindex; + break; + } + /* do any characters match? */ + else + { + if (longopt_match < 0) + longopt_match = optindex; + else + { + /* we have ambiguous options */ + if (data->opterr) + { + fputs (argv[0], stderr); + fputs (": option `", stderr); + fputs (argv[data->optind], stderr); + fputs ("' is ambiguous (could be `--", stderr); + fputs (longopts[longopt_match].name, stderr); + fputs ("' or `--", stderr); + fputs (longopts[optindex].name, stderr); + fputs ("')\n", stderr); + } + return (data->optopt = '?'); + } + } + } + } + if (longopt_match >= 0) + has_arg = longopts[longopt_match].has_arg; + } + + /* if we didn't find a long option, is it a short option? */ + if (longopt_match < 0 && shortopts != 0) + { + cp = strchr (shortopts, argv[data->optind][data->optwhere]); + if (cp == 0) + { + /* couldn't find option in shortopts */ + if (data->opterr) + { + fputs (argv[0], stderr); + fputs (": invalid option -- `-", stderr); + fputc (argv[data->optind][data->optwhere], stderr); + fputs ("'\n", stderr); + } + data->optwhere++; + if (argv[data->optind][data->optwhere] == '\0') + { + data->optind++; + data->optwhere = 1; + } + return (data->optopt = '?'); + } + has_arg = ((cp[1] == ':') + ? ((cp[2] == ':') ? OPTIONAL_ARG : REQUIRED_ARG) : NO_ARG); + possible_arg = argv[data->optind] + data->optwhere + 1; + data->optopt = *cp; + } + + /* get argument and reset data->optwhere */ + arg_next = 0; + switch (has_arg) + { + case OPTIONAL_ARG: + if (*possible_arg == '=') + possible_arg++; + data->optarg = (*possible_arg != '\0') ? possible_arg : 0; + data->optwhere = 1; + break; + case REQUIRED_ARG: + if (*possible_arg == '=') + possible_arg++; + if (*possible_arg != '\0') + { + data->optarg = possible_arg; + data->optwhere = 1; + } + else if (data->optind + 1 >= argc) + { + if (data->opterr) + { + fputs (argv[0], stderr); + fputs (": argument required for option `-", stderr); + if (longopt_match >= 0) + { + fputc ('-', stderr); + fputs (longopts[longopt_match].name, stderr); + data->optopt = initial_colon ? ':' : '\?'; + } + else + { + fputc (*cp, stderr); + data->optopt = *cp; + } + fputs ("'\n", stderr); + } + data->optind++; + return initial_colon ? ':' : '\?'; + } + else + { + data->optarg = argv[data->optind + 1]; + arg_next = 1; + data->optwhere = 1; + } + break; + default: /* shouldn't happen */ + case NO_ARG: + if (longopt_match < 0) + { + data->optwhere++; + if (argv[data->optind][data->optwhere] == '\0') + data->optwhere = 1; + } + else + data->optwhere = 1; + data->optarg = 0; + break; + } + + /* do we have to permute or otherwise modify data->optind? */ + if (ordering == PERMUTE && data->optwhere == 1 && data->num_nonopts != 0) + { + permute (argv + data->permute_from, data->num_nonopts, 1 + arg_next); + data->optind = data->permute_from + 1 + arg_next; + } + else if (data->optwhere == 1) + data->optind = data->optind + 1 + arg_next; + + /* finally return */ + if (longopt_match >= 0) + { + if (longind != 0) + *longind = longopt_match; + if (longopts[longopt_match].flag != 0) + { + *(longopts[longopt_match].flag) = longopts[longopt_match].val; + return 0; + } + else + return longopts[longopt_match].val; + } + else + return data->optopt; +} + +int +getopt (int argc, char *const argv[], const char *optstring) +{ + struct getopt_data data; + int r; + + read_globals (&data); + r = getopt_internal (argc, argv, optstring, 0, 0, 0, &data); + write_globals (&data); + return r; +} + +int +getopt_long (int argc, char *const argv[], const char *shortopts, + const struct option *longopts, int *longind) +{ + struct getopt_data data; + int r; + + read_globals (&data); + r = getopt_internal (argc, argv, shortopts, longopts, longind, 0, &data); + write_globals (&data); + return r; +} + +int +getopt_long_only (int argc, char *const argv[], const char *shortopts, + const struct option *longopts, int *longind) +{ + struct getopt_data data; + int r; + + read_globals (&data); + r = getopt_internal (argc, argv, shortopts, longopts, longind, 1, &data); + write_globals (&data); + return r; +} + +int +__getopt_r (int argc, char *const argv[], const char *optstring, + struct getopt_data *data) +{ + return getopt_internal (argc, argv, optstring, 0, 0, 0, data); +} + +int +__getopt_long_r (int argc, char *const argv[], const char *shortopts, + const struct option *longopts, int *longind, + struct getopt_data *data) +{ + return getopt_internal (argc, argv, shortopts, longopts, longind, 0, data); +} + +int +__getopt_long_only_r (int argc, char *const argv[], const char *shortopts, + const struct option *longopts, int *longind, + struct getopt_data *data) +{ + return getopt_internal (argc, argv, shortopts, longopts, longind, 1, data); +} + +#endif /* !HAVE_GETOPT */ + +/* end of file GETOPT.C */ diff --git a/lib/stdlib/getsubopt.3 b/lib/stdlib/getsubopt.3 new file mode 100644 index 0000000..cf33d25 --- /dev/null +++ b/lib/stdlib/getsubopt.3 @@ -0,0 +1,145 @@ +.\" Copyright (c) 1990, 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)getsubopt.3 8.1 (Berkeley) 6/9/93 +.\" $FreeBSD: src/lib/libc/stdlib/getsubopt.3,v 1.9 2001/09/07 14:46:35 asmodai Exp $ +.\" +.Dd June 9, 1993 +.Dt GETSUBOPT 3 +.Os +.Sh NAME +.Nm getsubopt +.Nd get sub options from an argument +.Sh LIBRARY +.Lb libc +.Sh SYNOPSIS +.In unistd.h +.Vt extern char *suboptarg ; +.Ft int +.Fn getsubopt "char **optionp" "char * const *tokens" "char **valuep" +.Sh DESCRIPTION +The +.Fn getsubopt +function +parses a string containing tokens delimited by one or more tab, space or +comma +.Pq Ql \&, +characters. +It is intended for use in parsing groups of option arguments provided +as part of a utility command line. +.Pp +The argument +.Fa optionp +is a pointer to a pointer to the string. +The argument +.Fa tokens +is a pointer to a +.Dv NULL Ns -terminated +array of pointers to strings. +.Pp +The +.Fn getsubopt +function +returns the zero-based offset of the pointer in the +.Fa tokens +array referencing a string which matches the first token +in the string, or, \-1 if the string contains no tokens or +.Fa tokens +does not contain a matching string. +.Pp +If the token is of the form ``name=value'', the location referenced by +.Fa valuep +will be set to point to the start of the ``value'' portion of the token. +.Pp +On return from +.Fn getsubopt , +.Fa optionp +will be set to point to the start of the next token in the string, +or the null at the end of the string if no more tokens are present. +The external variable +.Fa suboptarg +will be set to point to the start of the current token, or +.Dv NULL +if no +tokens were present. +The argument +.Fa valuep +will be set to point to the ``value'' portion of the token, or +.Dv NULL +if no ``value'' portion was present. +.Sh EXAMPLES +.Bd -literal -compact +char *tokens[] = { + #define ONE 0 + "one", + #define TWO 1 + "two", + NULL +}; + +\&... + +extern char *optarg, *suboptarg; +char *options, *value; + +while ((ch = getopt(argc, argv, "ab:")) != \-1) { + switch(ch) { + case 'a': + /* process ``a'' option */ + break; + case 'b': + options = optarg; + while (*options) { + switch(getsubopt(&options, tokens, &value)) { + case ONE: + /* process ``one'' sub option */ + break; + case TWO: + /* process ``two'' sub option */ + if (!value) + error("no value for two"); + i = atoi(value); + break; + case \-1: + if (suboptarg) + error("illegal sub option %s", + suboptarg); + else + error("missing sub option"); + break; + } + break; + } +.Ed +.Sh SEE ALSO +.Xr getopt 3 , +.Xr strsep 3 +.Sh HISTORY +The +.Fn getsubopt +function first appeared in +.Bx 4.4 . diff --git a/lib/stdlib/getsubopt.c b/lib/stdlib/getsubopt.c new file mode 100644 index 0000000..298624d --- /dev/null +++ b/lib/stdlib/getsubopt.c @@ -0,0 +1,97 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)getsubopt.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include + +#include +#include +#include + +/* + * The SVID interface to getsubopt provides no way of figuring out which + * part of the suboptions list wasn't matched. This makes error messages + * tricky... The extern variable suboptarg is a pointer to the token + * which didn't match. + */ +char *suboptarg; + +int +getsubopt(optionp, tokens, valuep) + char **optionp, **valuep; + char * const *tokens; +{ + int cnt; + char *p; + + suboptarg = *valuep = NULL; + + if (!optionp || !*optionp) + return(-1); + + /* skip leading white-space, commas */ + for (p = *optionp; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p); + + if (!*p) { + *optionp = p; + return(-1); + } + + /* save the start of the token, and skip the rest of the token. */ + for (suboptarg = p; + *++p && *p != ',' && *p != '=' && *p != ' ' && *p != '\t';); + + if (*p) { + /* + * If there's an equals sign, set the value pointer, and + * skip over the value part of the token. Terminate the + * token. + */ + if (*p == '=') { + *p = '\0'; + for (*valuep = ++p; + *p && *p != ',' && *p != ' ' && *p != '\t'; ++p); + if (*p) + *p++ = '\0'; + } else + *p++ = '\0'; + /* Skip any whitespace or commas after this token. */ + for (; *p && (*p == ',' || *p == ' ' || *p == '\t'); ++p); + } + + /* set optionp for next round. */ + *optionp = p; + + for (cnt = 0; *tokens; ++tokens, ++cnt) + if (!strcmp(suboptarg, *tokens)) + return(cnt); + return(-1); +} diff --git a/lib/stdlib/imaxabs.c b/lib/stdlib/imaxabs.c new file mode 100644 index 0000000..e438646 --- /dev/null +++ b/lib/stdlib/imaxabs.c @@ -0,0 +1,36 @@ +/*- + * Copyright (c) 2001 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD: head/lib/libc/stdlib/imaxabs.c 86368 2001-11-15 02:05:03Z mike $"); + +#include +#include +intmax_t +imaxabs(intmax_t j) +{ + return (j < 0 ? -j : j); +} diff --git a/lib/stdlib/imaxdiv.c b/lib/stdlib/imaxdiv.c new file mode 100644 index 0000000..eb3e99a --- /dev/null +++ b/lib/stdlib/imaxdiv.c @@ -0,0 +1,48 @@ +/*- + * Copyright (c) 2001 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD: head/lib/libc/stdlib/imaxdiv.c 301115 2016-06-01 10:14:25Z ache $"); + +#include +#include + +/* See comments in div.c for implementation details. */ +imaxdiv_t +imaxdiv(intmax_t numer, intmax_t denom) +{ + imaxdiv_t retval; + + retval.quot = numer / denom; + retval.rem = numer % denom; +#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) + if (numer >= 0 && retval.rem < 0) { + retval.quot++; + retval.rem -= denom; + } +#endif + return (retval); +} diff --git a/lib/stdlib/itoa.c b/lib/stdlib/itoa.c new file mode 100644 index 0000000..7a7daf0 --- /dev/null +++ b/lib/stdlib/itoa.c @@ -0,0 +1,67 @@ +/* +FUNCTION +<>---integer to string + +INDEX + itoa + +SYNOPSIS + #include + char *itoa(int <[value]>, char *<[str]>, int <[base]>); + char *__itoa(int <[value]>, char *<[str]>, int <[base]>); + +DESCRIPTION +<> converts the integer <[value]> to a null-terminated string +using the specified base, which must be between 2 and 36, inclusive. +If <[base]> is 10, <[value]> is treated as signed and the string will be +prefixed with '-' if negative. For all other bases, <[value]> is treated as +unsigned. <[str]> should be an array long enough to contain the converted +value, which in the worst case is sizeof(int)*8+1 bytes. + +RETURNS +A pointer to the string, <[str]>, or NULL if <[base]> is invalid. + +PORTABILITY +<> is non-ANSI. + +No supporting OS subroutine calls are required. +*/ + +#include + +char * +__itoa (int value, + char *str, + int base) +{ + unsigned uvalue; + int i = 0; + + /* Check base is supported. */ + if ((base < 2) || (base > 36)) + { + str[0] = '\0'; + return NULL; + } + + /* Negative numbers are only supported for decimal. + * Cast to unsigned to avoid overflow for maximum negative value. */ + if ((base == 10) && (value < 0)) + { + str[i++] = '-'; + uvalue = (unsigned)-value; + } + else + uvalue = (unsigned)value; + + __utoa (uvalue, &str[i], base); + return str; +} + +char * +itoa (int value, + char *str, + int base) +{ + return __itoa (value, str, base); +} diff --git a/lib/stdlib/jrand48.c b/lib/stdlib/jrand48.c new file mode 100644 index 0000000..185e0da --- /dev/null +++ b/lib/stdlib/jrand48.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +long +_jrand48_r (struct _reent *r, + unsigned short xseed[3]) +{ + __dorand48(r, xseed); + return ((long) xseed[2] << 16) + (long) xseed[1]; +} + +#ifndef _REENT_ONLY +long +jrand48 (unsigned short xseed[3]) +{ + return _jrand48_r (_REENT, xseed); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/l64a.c b/lib/stdlib/l64a.c new file mode 100644 index 0000000..6f12b61 --- /dev/null +++ b/lib/stdlib/l64a.c @@ -0,0 +1,66 @@ +/* l64a - convert long to radix-64 ascii string + * + * Conversion is performed on at most 32-bits of input value starting + * from least significant bits to the most significant bits. + * + * The routine splits the input value into groups of 6 bits for up to + * 32 bits of input. This means that the last group may be 2 bits + * (bits 30 and 31). + * + * Each group of 6 bits forms a value from 0-63 which is converted into + * a character as follows: + * 0 = '.' + * 1 = '/' + * 2-11 = '0' to '9' + * 12-37 = 'A' to 'Z' + * 38-63 = 'a' to 'z' + * + * When the remaining bits are zero or all 32 bits have been translated, + * a nul terminator is appended to the resulting string. An input value of + * 0 results in an empty string. + */ + +#include <_ansi.h> +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local char _tls_l64a_buf[8]; +#endif + +static const char R64_ARRAY[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +char * +l64a (long value) +{ + return _l64a_r (_REENT, value); +} + +char * +_l64a_r (struct _reent *rptr, + long value) +{ + char *ptr; + char *result; + int i, index; + unsigned long tmp = (unsigned long)value & 0xffffffff; + + _REENT_CHECK_MISC(rptr); + result = _REENT_L64A_BUF(rptr); + ptr = result; + + for (i = 0; i < 6; ++i) + { + if (tmp == 0) + { + *ptr = '\0'; + break; + } + + index = tmp & (64 - 1); + *ptr++ = R64_ARRAY[index]; + tmp >>= 6; + } + + return result; +} diff --git a/lib/stdlib/labs.c b/lib/stdlib/labs.c new file mode 100644 index 0000000..f6761d0 --- /dev/null +++ b/lib/stdlib/labs.c @@ -0,0 +1,43 @@ +/* +FUNCTION +<>---long integer absolute value + +INDEX + labs + +SYNOPSIS + #include + long labs(long <[i]>); + +DESCRIPTION +<> returns +@tex +$|x|$, +@end tex +the absolute value of <[i]> (also called the magnitude +of <[i]>). That is, if <[i]> is negative, the result is the opposite +of <[i]>, but if <[i]> is nonnegative the result is <[i]>. + +The similar function <> uses and returns <> rather than +<> values. + +RETURNS +The result is a nonnegative long integer. + +PORTABILITY +<> is ANSI. + +No supporting OS subroutine calls are required. +*/ + +#include + +long +labs (long x) +{ + if (x < 0) + { + x = -x; + } + return x; +} diff --git a/lib/stdlib/lcong48.c b/lib/stdlib/lcong48.c new file mode 100644 index 0000000..d1109f0 --- /dev/null +++ b/lib/stdlib/lcong48.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local unsigned short _tls_rand48_seed[3] = {_RAND48_SEED_0, _RAND48_SEED_1, + _RAND48_SEED_2}; +_Thread_local unsigned short _tls_rand48_mult[3] = {_RAND48_MULT_0, _RAND48_MULT_1, + _RAND48_MULT_2}; +_Thread_local unsigned short _tls_rand48_add = _RAND48_ADD; +#endif + +void +_lcong48_r (struct _reent *r, + unsigned short p[7]) +{ + _REENT_CHECK_RAND48(r); + __rand48_seed[0] = p[0]; + __rand48_seed[1] = p[1]; + __rand48_seed[2] = p[2]; + __rand48_mult[0] = p[3]; + __rand48_mult[1] = p[4]; + __rand48_mult[2] = p[5]; + __rand48_add = p[6]; +} + +#ifndef _REENT_ONLY +void +lcong48 (unsigned short p[7]) +{ + _lcong48_r (_REENT, p); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/ldiv.c b/lib/stdlib/ldiv.c new file mode 100644 index 0000000..39bb36e --- /dev/null +++ b/lib/stdlib/ldiv.c @@ -0,0 +1,99 @@ +/* +FUNCTION +<>---divide two long integers + +INDEX + ldiv + +SYNOPSIS + #include + ldiv_t ldiv(long <[n]>, long <[d]>); + +DESCRIPTION +Divide +@tex +$n/d$, +@end tex +@ifnottex +<[n]>/<[d]>, +@end ifnottex +returning quotient and remainder as two long integers in a structure <>. + +RETURNS +The result is represented with the structure + +. typedef struct +. { +. long quot; +. long rem; +. } ldiv_t; + +where the <> field represents the quotient, and <> the +remainder. For nonzero <[d]>, if `<<<[r]> = ldiv(<[n]>,<[d]>);>>' then +<[n]> equals `<<<[r]>.rem + <[d]>*<[r]>.quot>>'. + +To divide <> rather than <> values, use the similar +function <
>. + +PORTABILITY +<> is ANSI. + +No supporting OS subroutines are required. +*/ + + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include /* ldiv_t */ + +ldiv_t +ldiv (long num, + long denom) +{ + ldiv_t r; + + /* see div.c for comments */ + + r.quot = num / denom; + r.rem = num % denom; + if (num >= 0 && r.rem < 0) { + ++r.quot; + r.rem -= denom; + } + else if (num < 0 && r.rem > 0) { + --r.quot; + r.rem += denom; + } + return (r); +} diff --git a/lib/stdlib/ldtoa.c b/lib/stdlib/ldtoa.c new file mode 100644 index 0000000..36613fa --- /dev/null +++ b/lib/stdlib/ldtoa.c @@ -0,0 +1,3908 @@ + /* Extended precision arithmetic functions for long double I/O. + * This program has been placed in the public domain. + */ + +#include +#include + +#ifndef _USE_GDTOA +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" + +/* These are the externally visible entries. */ +/* linux name: long double _IO_strtold (char *, char **); */ +long double _strtold (char *, char **); +char *_ldtoa_r (struct _reent *, long double, int, int, int *, int *, + char **); +int _ldcheck (long double *); +#if 0 +void _IO_ldtostr (long double *, char *, int, int, char); +#endif + + /* Number of 16 bit words in external x type format */ +#define NE 10 + + /* Number of 16 bit words in internal format */ +#define NI (NE+3) + + /* Array offset to exponent */ +#define E 1 + + /* Array offset to high guard word */ +#define M 2 + + /* Number of bits of precision */ +#define NBITS ((NI-4)*16) + + /* Maximum number of decimal digits in ASCII conversion */ +#define NDEC 1023 + /* Use static stack buffer for up to 44 digits */ +#define NDEC_SML 44 + + /* The exponent of 1.0 */ +#define EXONE (0x3fff) + + /* Maximum exponent digits - base 10 */ +#define MAX_EXP_DIGITS 5 + +/* Control structure for long double conversion including rounding precision values. + * rndprc can be set to 80 (if NE=6), 64, 56, 53, or 24 bits. + */ +typedef struct +{ + int rlast; + int rndprc; + int rw; + int re; + int outexpon; + unsigned short rmsk; + unsigned short rmbit; + unsigned short rebit; + unsigned short rbit[NI]; + unsigned short equot[NI]; +} LDPARMS; + +static void esub (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, LDPARMS * ldp); +static void emul (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, LDPARMS * ldp); +static void ediv (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, LDPARMS * ldp); +static int ecmp (const short unsigned int *a, const short unsigned int *b); +static int enormlz (short unsigned int *x); +static int eshift (short unsigned int *x, int sc); +static void eshup1 (register short unsigned int *x); +static void eshup8 (register short unsigned int *x); +static void eshup6 (register short unsigned int *x); +static void eshdn1 (register short unsigned int *x); +static void eshdn8 (register short unsigned int *x); +static void eshdn6 (register short unsigned int *x); +static void eneg (short unsigned int *x); +static void emov (register const short unsigned int *a, + register short unsigned int *b); +static void eclear (register short unsigned int *x); +static void einfin (register short unsigned int *x, register LDPARMS * ldp); +static void efloor (short unsigned int *x, short unsigned int *y, + LDPARMS * ldp); +static void etoasc (short unsigned int *x, char *string, int ndec, int ndigs, + int outformat, LDPARMS * ldp); + +union uconv +{ + unsigned short pe; + long double d; +}; + +#if LDBL_MANT_DIG == 24 +static void e24toe (short unsigned int *pe, short unsigned int *y, + LDPARMS * ldp); +#elif LDBL_MANT_DIG == 53 +static void e53toe (short unsigned int *pe, short unsigned int *y, + LDPARMS * ldp); +#elif LDBL_MANT_DIG == 64 +static void e64toe (short unsigned int *pe, short unsigned int *y, + LDPARMS * ldp); +#else +static void e113toe (short unsigned int *pe, short unsigned int *y, + LDPARMS * ldp); +#endif + +/* econst.c */ +/* e type constants used by high precision check routines */ + +#if NE == 10 +/* 0.0 */ +static const unsigned short ezero[NE] = { 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +/* 1.0E0 */ +static const unsigned short eone[NE] = { 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff, +}; + +#else + +/* 0.0 */ +static const unsigned short ezero[NE] = { + 0, 0000000, 0000000, 0000000, 0000000, 0000000, +}; + +/* 1.0E0 */ +static const unsigned short eone[NE] = { + 0, 0000000, 0000000, 0000000, 0100000, 0x3fff, +}; + +#endif + +/* Debugging routine for displaying errors */ +#ifdef DEBUG +/* Notice: the order of appearance of the following + * messages is bound to the error codes defined + * in mconf.h. + */ +static const char *const ermsg[7] = { + "unknown", /* error code 0 */ + "domain", /* error code 1 */ + "singularity", /* et seq. */ + "overflow", + "underflow", + "total loss of precision", + "partial loss of precision" +}; + +#define mtherr(name, code) printf( "\n%s %s error\n", name, ermsg[code] ); +#else +#define mtherr(name, code) +#endif + +/* ieee.c + * + * Extended precision IEEE binary floating point arithmetic routines + * + * Numbers are stored in C language as arrays of 16-bit unsigned + * short integers. The arguments of the routines are pointers to + * the arrays. + * + * + * External e type data structure, simulates Intel 8087 chip + * temporary real format but possibly with a larger significand: + * + * NE-1 significand words (least significant word first, + * most significant bit is normally set) + * exponent (value = EXONE for 1.0, + * top bit is the sign) + * + * + * Internal data structure of a number (a "word" is 16 bits): + * + * ei[0] sign word (0 for positive, 0xffff for negative) + * ei[1] biased exponent (value = EXONE for the number 1.0) + * ei[2] high guard word (always zero after normalization) + * ei[3] + * to ei[NI-2] significand (NI-4 significand words, + * most significant word first, + * most significant bit is set) + * ei[NI-1] low guard word (0x8000 bit is rounding place) + * + * + * + * Routines for external format numbers + * + * asctoe( string, e ) ASCII string to extended double e type + * asctoe64( string, &d ) ASCII string to long double + * asctoe53( string, &d ) ASCII string to double + * asctoe24( string, &f ) ASCII string to single + * asctoeg( string, e, prec, ldp ) ASCII string to specified precision + * e24toe( &f, e, ldp ) IEEE single precision to e type + * e53toe( &d, e, ldp ) IEEE double precision to e type + * e64toe( &d, e, ldp ) IEEE long double precision to e type + * e113toe( &d, e, ldp ) IEEE long double precision to e type + * eabs(e) absolute value + * eadd( a, b, c ) c = b + a + * eclear(e) e = 0 + * ecmp (a, b) Returns 1 if a > b, 0 if a == b, + * -1 if a < b, -2 if either a or b is a NaN. + * ediv( a, b, c, ldp ) c = b / a + * efloor( a, b, ldp ) truncate to integer, toward -infinity + * efrexp( a, exp, s ) extract exponent and significand + * eifrac( e, &l, frac ) e to long integer and e type fraction + * euifrac( e, &l, frac ) e to unsigned long integer and e type fraction + * einfin( e, ldp ) set e to infinity, leaving its sign alone + * eldexp( a, n, b ) multiply by 2**n + * emov( a, b ) b = a + * emul( a, b, c, ldp ) c = b * a + * eneg(e) e = -e + * eround( a, b ) b = nearest integer value to a + * esub( a, b, c, ldp ) c = b - a + * e24toasc( &f, str, n ) single to ASCII string, n digits after decimal + * e53toasc( &d, str, n ) double to ASCII string, n digits after decimal + * e64toasc( &d, str, n ) long double to ASCII string + * etoasc(e,str,ndec,n,fmt,ldp)e to ASCII string, n digits after decimal + * etoe24( e, &f ) convert e type to IEEE single precision + * etoe53( e, &d ) convert e type to IEEE double precision + * etoe64( e, &d ) convert e type to IEEE long double precision + * ltoe( &l, e ) long (32 bit) integer to e type + * ultoe( &l, e ) unsigned long (32 bit) integer to e type + * eisneg( e ) 1 if sign bit of e != 0, else 0 + * eisinf( e ) 1 if e has maximum exponent (non-IEEE) + * or is infinite (IEEE) + * eisnan( e ) 1 if e is a NaN + * esqrt( a, b ) b = square root of a + * + * + * Routines for internal format numbers + * + * eaddm( ai, bi ) add significands, bi = bi + ai + * ecleaz(ei) ei = 0 + * ecleazs(ei) set ei = 0 but leave its sign alone + * ecmpm( ai, bi ) compare significands, return 1, 0, or -1 + * edivm( ai, bi, ldp ) divide significands, bi = bi / ai + * emdnorm(ai,l,s,exp,ldp) normalize and round off + * emovi( a, ai ) convert external a to internal ai + * emovo( ai, a, ldp ) convert internal ai to external a + * emovz( ai, bi ) bi = ai, low guard word of bi = 0 + * emulm( ai, bi, ldp ) multiply significands, bi = bi * ai + * enormlz(ei) left-justify the significand + * eshdn1( ai ) shift significand and guards down 1 bit + * eshdn8( ai ) shift down 8 bits + * eshdn6( ai ) shift down 16 bits + * eshift( ai, n ) shift ai n bits up (or down if n < 0) + * eshup1( ai ) shift significand and guards up 1 bit + * eshup8( ai ) shift up 8 bits + * eshup6( ai ) shift up 16 bits + * esubm( ai, bi ) subtract significands, bi = bi - ai + * + * + * The result is always normalized and rounded to NI-4 word precision + * after each arithmetic operation. + * + * Exception flags are NOT fully supported. + * + * Define USE_INFINITY in mconf.h for support of infinity; otherwise a + * saturation arithmetic is implemented. + * + * Define NANS for support of Not-a-Number items; otherwise the + * arithmetic will never produce a NaN output, and might be confused + * by a NaN input. + * If NaN's are supported, the output of ecmp(a,b) is -2 if + * either a or b is a NaN. This means asking if(ecmp(a,b) < 0) + * may not be legitimate. Use if(ecmp(a,b) == -1) for less-than + * if in doubt. + * Signaling NaN's are NOT supported; they are treated the same + * as quiet NaN's. + * + * Denormals are always supported here where appropriate (e.g., not + * for conversion to DEC numbers). + */ + +/* + * Revision history: + * + * 5 Jan 84 PDP-11 assembly language version + * 6 Dec 86 C language version + * 30 Aug 88 100 digit version, improved rounding + * 15 May 92 80-bit long double support + * 22 Nov 00 Revised to fit into newlib by Jeff Johnston + * + * Author: S. L. Moshier. + * + * Copyright (c) 1984,2000 S.L. Moshier + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + */ + +#include +/* #include "\usr\include\stdio.h" */ +/*#include "ehead.h"*/ +/*#include "mconf.h"*/ +/* mconf.h + * + * Common include file for math routines + * + * + * + * SYNOPSIS: + * + * #include "mconf.h" + * + * + * + * DESCRIPTION: + * + * This file contains definitions for error codes that are + * passed to the common error handling routine mtherr() + * (which see). + * + * The file also includes a conditional assembly definition + * for the type of computer arithmetic (IEEE, DEC, Motorola + * IEEE, or UNKnown). + * + * For Digital Equipment PDP-11 and VAX computers, certain + * IBM systems, and others that use numbers with a 56-bit + * significand, the symbol DEC should be defined. In this + * mode, most floating point constants are given as arrays + * of octal integers to eliminate decimal to binary conversion + * errors that might be introduced by the compiler. + * + * For computers, such as IBM PC, that follow the IEEE + * Standard for Binary Floating Point Arithmetic (ANSI/IEEE + * Std 754-1985), the symbol IBMPC should be defined. These + * numbers have 53-bit significands. In this mode, constants + * are provided as arrays of hexadecimal 16 bit integers. + * + * To accommodate other types of computer arithmetic, all + * constants are also provided in a normal decimal radix + * which one can hope are correctly converted to a suitable + * format by the available C language compiler. To invoke + * this mode, the symbol UNK is defined. + * + * An important difference among these modes is a predefined + * set of machine arithmetic constants for each. The numbers + * MACHEP (the machine roundoff error), MAXNUM (largest number + * represented), and several other parameters are preset by + * the configuration symbol. Check the file const.c to + * ensure that these values are correct for your computer. + * + * For ANSI C compatibility, define ANSIC equal to 1. Currently + * this affects only the atan2() function and others that use it. + */ + +/* Constant definitions for math error conditions + */ + +#define DOMAIN 1 /* argument domain error */ +#define SING 2 /* argument singularity */ +#define OVERFLOW 3 /* overflow range error */ +#define UNDERFLOW 4 /* underflow range error */ +#define TLOSS 5 /* total loss of precision */ +#define PLOSS 6 /* partial loss of precision */ + +#define EDOM 33 +#define ERANGE 34 + +typedef struct +{ + double r; + double i; +} cmplx; + +/* Type of computer arithmetic */ + +#ifndef DEC +#ifdef __IEEE_LITTLE_ENDIAN +#define IBMPC 1 +#else /* !__IEEE_LITTLE_ENDIAN */ +#define MIEEE 1 +#endif /* !__IEEE_LITTLE_ENDIAN */ +#endif /* !DEC */ + +/* Define 1 for ANSI C atan2() function + * See atan.c and clog.c. + */ +#define ANSIC 1 + +/*define VOLATILE volatile*/ +#define VOLATILE + +#define NANS +#define USE_INFINITY + +/* NaN's require infinity support. */ +#ifdef NANS +#ifndef INFINITY +#define USE_INFINITY +#endif +#endif + +/* This handles 64-bit long ints. */ +#define LONGBITS (8 * sizeof(long)) + + +static void eaddm (short unsigned int *x, short unsigned int *y); +static void esubm (short unsigned int *x, short unsigned int *y); +static void emdnorm (short unsigned int *s, int lost, int subflg, + long int exp, int rcntrl, LDPARMS * ldp); +#if 0 /* Broken, unusable implementation of strtold */ +static int asctoeg (char *ss, short unsigned int *y, int oprec, + LDPARMS * ldp); +#endif +static void enan (short unsigned int *nan, int size); +#if LDBL_MANT_DIG == 24 +static void toe24 (short unsigned int *x, short unsigned int *y); +#elif LDBL_MANT_DIG == 53 +static void toe53 (short unsigned int *x, short unsigned int *y); +#elif LDBL_MANT_DIG == 64 +static void toe64 (short unsigned int *a, short unsigned int *b); +#else +static void toe113 (short unsigned int *a, short unsigned int *b); +#endif +static void eiremain (short unsigned int *den, short unsigned int *num, + LDPARMS * ldp); +static int ecmpm (register short unsigned int *a, + register short unsigned int *b); +static int edivm (short unsigned int *den, short unsigned int *num, + LDPARMS * ldp); +static int emulm (short unsigned int *a, short unsigned int *b, + LDPARMS * ldp); +static int eisneg (const short unsigned int *x); +static int eisinf (const short unsigned int *x); +static void emovi (const short unsigned int *a, short unsigned int *b); +static void emovo (short unsigned int *a, short unsigned int *b, + LDPARMS * ldp); +static void emovz (register short unsigned int *a, + register short unsigned int *b); +static void ecleaz (register short unsigned int *xi); +static void eadd1 (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, int subflg, LDPARMS * ldp); +static int eisnan (const short unsigned int *x); +static int eiisnan (short unsigned int *x); + +#ifdef DEC +static void etodec (), todec (), dectoe (); +#endif + +/* +; Clear out entire external format number. +; +; unsigned short x[]; +; eclear( x ); +*/ + +static void +eclear (register short unsigned int *x) +{ + register int i; + + for (i = 0; i < NE; i++) + *x++ = 0; +} + + + +/* Move external format number from a to b. + * + * emov( a, b ); + */ + +static void +emov (register const short unsigned int *a, register short unsigned int *b) +{ + register int i; + + for (i = 0; i < NE; i++) + *b++ = *a++; +} + + +/* +; Negate external format number +; +; unsigned short x[NE]; +; eneg( x ); +*/ + +static void +eneg (short unsigned int *x) +{ + +#ifdef NANS + if (eisnan (x)) + return; +#endif + x[NE - 1] ^= 0x8000; /* Toggle the sign bit */ +} + + + +/* Return 1 if external format number is negative, + * else return zero. + */ +static int +eisneg (const short unsigned int *x) +{ + +#ifdef NANS + if (eisnan (x)) + return (0); +#endif + if (x[NE - 1] & 0x8000) + return (1); + else + return (0); +} + + +/* Return 1 if external format number has maximum possible exponent, + * else return zero. + */ +static int +eisinf (const short unsigned int *x) +{ + + if ((x[NE - 1] & 0x7fff) == 0x7fff) + { +#ifdef NANS + if (eisnan (x)) + return (0); +#endif + return (1); + } + else + return (0); +} + +/* Check if e-type number is not a number. + */ +static int +eisnan (const short unsigned int *x) +{ + +#ifdef NANS + int i; +/* NaN has maximum exponent */ + if ((x[NE - 1] & 0x7fff) != 0x7fff) + return (0); +/* ... and non-zero significand field. */ + for (i = 0; i < NE - 1; i++) + { + if (*x++ != 0) + return (1); + } +#endif + return (0); +} + +/* +; Fill entire number, including exponent and significand, with +; largest possible number. These programs implement a saturation +; value that is an ordinary, legal number. A special value +; "infinity" may also be implemented; this would require tests +; for that value and implementation of special rules for arithmetic +; operations involving inifinity. +*/ + +static void +einfin (register short unsigned int *x, register LDPARMS * ldp) +{ + register int i; + +#ifdef USE_INFINITY + for (i = 0; i < NE - 1; i++) + *x++ = 0; + *x |= 32767; + ldp = ldp; +#else + for (i = 0; i < NE - 1; i++) + *x++ = 0xffff; + *x |= 32766; + if (ldp->rndprc < NBITS) + { + if (ldp->rndprc == 113) + { + *(x - 9) = 0; + *(x - 8) = 0; + } + if (ldp->rndprc == 64) + { + *(x - 5) = 0; + } + if (ldp->rndprc == 53) + { + *(x - 4) = 0xf800; + } + else + { + *(x - 4) = 0; + *(x - 3) = 0; + *(x - 2) = 0xff00; + } + } +#endif +} + +/* Move in external format number, + * converting it to internal format. + */ +static void +emovi (const short unsigned int *a, short unsigned int *b) +{ + register const unsigned short *p; + register unsigned short *q; + int i; + + q = b; + p = a + (NE - 1); /* point to last word of external number */ +/* get the sign bit */ + if (*p & 0x8000) + *q++ = 0xffff; + else + *q++ = 0; +/* get the exponent */ + *q = *p--; + *q++ &= 0x7fff; /* delete the sign bit */ +#ifdef USE_INFINITY + if ((*(q - 1) & 0x7fff) == 0x7fff) + { +#ifdef NANS + if (eisnan (a)) + { + *q++ = 0; + for (i = 3; i < NI; i++) + *q++ = *p--; + return; + } +#endif + for (i = 2; i < NI; i++) + *q++ = 0; + return; + } +#endif +/* clear high guard word */ + *q++ = 0; +/* move in the significand */ + for (i = 0; i < NE - 1; i++) + *q++ = *p--; +/* clear low guard word */ + *q = 0; +} + + +/* Move internal format number out, + * converting it to external format. + */ +static void +emovo (short unsigned int *a, short unsigned int *b, LDPARMS * ldp) +{ + register unsigned short *p, *q; + unsigned short i; + + p = a; + q = b + (NE - 1); /* point to output exponent */ +/* combine sign and exponent */ + i = *p++; + if (i) + *q-- = *p++ | 0x8000; + else + *q-- = *p++; +#ifdef USE_INFINITY + if (*(p - 1) == 0x7fff) + { +#ifdef NANS + if (eiisnan (a)) + { + enan (b, NBITS); + return; + } +#endif + einfin (b, ldp); + return; + } +#endif +/* skip over guard word */ + ++p; +/* move the significand */ + for (i = 0; i < NE - 1; i++) + *q-- = *p++; +} + + +/* Clear out internal format number. + */ + +static void +ecleaz (register short unsigned int *xi) +{ + register int i; + + for (i = 0; i < NI; i++) + *xi++ = 0; +} + +/* same, but don't touch the sign. */ + +static void +ecleazs (register short unsigned int *xi) +{ + register int i; + + ++xi; + for (i = 0; i < NI - 1; i++) + *xi++ = 0; +} + + + + +/* Move internal format number from a to b. + */ +static void +emovz (register short unsigned int *a, register short unsigned int *b) +{ + register int i; + + for (i = 0; i < NI - 1; i++) + *b++ = *a++; +/* clear low guard word */ + *b = 0; +} + +/* Return nonzero if internal format number is a NaN. + */ + +static int +eiisnan (short unsigned int *x) +{ + int i; + + if ((x[E] & 0x7fff) == 0x7fff) + { + for (i = M + 1; i < NI; i++) + { + if (x[i] != 0) + return (1); + } + } + return (0); +} + +#if LDBL_MANT_DIG == 64 + +/* Return nonzero if internal format number is infinite. */ +static int +eiisinf (unsigned short x[]) +{ + +#ifdef NANS + if (eiisnan (x)) + return (0); +#endif + if ((x[E] & 0x7fff) == 0x7fff) + return (1); + return (0); +} +#endif /* LDBL_MANT_DIG == 64 */ + +/* +; Compare significands of numbers in internal format. +; Guard words are included in the comparison. +; +; unsigned short a[NI], b[NI]; +; cmpm( a, b ); +; +; for the significands: +; returns +1 if a > b +; 0 if a == b +; -1 if a < b +*/ +static int +ecmpm (register short unsigned int *a, register short unsigned int *b) +{ + int i; + + a += M; /* skip up to significand area */ + b += M; + for (i = M; i < NI; i++) + { + if (*a++ != *b++) + goto difrnt; + } + return (0); + +difrnt: + if (*(--a) > *(--b)) + return (1); + else + return (-1); +} + + +/* +; Shift significand down by 1 bit +*/ + +static void +eshdn1 (register short unsigned int *x) +{ + register unsigned short bits; + int i; + + x += M; /* point to significand area */ + + bits = 0; + for (i = M; i < NI; i++) + { + if (*x & 1) + bits |= 1; + *x >>= 1; + if (bits & 2) + *x |= 0x8000; + bits <<= 1; + ++x; + } +} + + + +/* +; Shift significand up by 1 bit +*/ + +static void +eshup1 (register short unsigned int *x) +{ + register unsigned short bits; + int i; + + x += NI - 1; + bits = 0; + + for (i = M; i < NI; i++) + { + if (*x & 0x8000) + bits |= 1; + *x <<= 1; + if (bits & 2) + *x |= 1; + bits <<= 1; + --x; + } +} + + + +/* +; Shift significand down by 8 bits +*/ + +static void +eshdn8 (register short unsigned int *x) +{ + register unsigned short newbyt, oldbyt; + int i; + + x += M; + oldbyt = 0; + for (i = M; i < NI; i++) + { + newbyt = *x << 8; + *x >>= 8; + *x |= oldbyt; + oldbyt = newbyt; + ++x; + } +} + +/* +; Shift significand up by 8 bits +*/ + +static void +eshup8 (register short unsigned int *x) +{ + int i; + register unsigned short newbyt, oldbyt; + + x += NI - 1; + oldbyt = 0; + + for (i = M; i < NI; i++) + { + newbyt = *x >> 8; + *x <<= 8; + *x |= oldbyt; + oldbyt = newbyt; + --x; + } +} + +/* +; Shift significand up by 16 bits +*/ + +static void +eshup6 (register short unsigned int *x) +{ + int i; + register unsigned short *p; + + p = x + M; + x += M + 1; + + for (i = M; i < NI - 1; i++) + *p++ = *x++; + + *p = 0; +} + +/* +; Shift significand down by 16 bits +*/ + +static void +eshdn6 (register short unsigned int *x) +{ + int i; + register unsigned short *p; + + x += NI - 1; + p = x + 1; + + for (i = M; i < NI - 1; i++) + *(--p) = *(--x); + + *(--p) = 0; +} + +/* +; Add significands +; x + y replaces y +*/ + +static void +eaddm (short unsigned int *x, short unsigned int *y) +{ + register unsigned long a; + int i; + unsigned int carry; + + x += NI - 1; + y += NI - 1; + carry = 0; + for (i = M; i < NI; i++) + { + a = (unsigned long) (*x) + (unsigned long) (*y) + carry; + if (a & 0x10000) + carry = 1; + else + carry = 0; + *y = (unsigned short) a; + --x; + --y; + } +} + +/* +; Subtract significands +; y - x replaces y +*/ + +static void +esubm (short unsigned int *x, short unsigned int *y) +{ + unsigned long a; + int i; + unsigned int carry; + + x += NI - 1; + y += NI - 1; + carry = 0; + for (i = M; i < NI; i++) + { + a = (unsigned long) (*y) - (unsigned long) (*x) - carry; + if (a & 0x10000) + carry = 1; + else + carry = 0; + *y = (unsigned short) a; + --x; + --y; + } +} + + +/* Divide significands */ + + +/* Multiply significand of e-type number b +by 16-bit quantity a, e-type result to c. */ + +static void +m16m (short unsigned int a, short unsigned int *b, short unsigned int *c) +{ + register unsigned short *pp; + register unsigned long carry; + unsigned short *ps; + unsigned short p[NI]; + unsigned long aa, m; + int i; + + aa = a; + pp = &p[NI - 2]; + *pp++ = 0; + *pp = 0; + ps = &b[NI - 1]; + + for (i = M + 1; i < NI; i++) + { + if (*ps == 0) + { + --ps; + --pp; + *(pp - 1) = 0; + } + else + { + m = (unsigned long) aa **ps--; + carry = (m & 0xffff) + *pp; + *pp-- = (unsigned short) carry; + carry = (carry >> 16) + (m >> 16) + *pp; + *pp = (unsigned short) carry; + *(pp - 1) = carry >> 16; + } + } + for (i = M; i < NI; i++) + c[i] = p[i]; +} + + +/* Divide significands. Neither the numerator nor the denominator +is permitted to have its high guard word nonzero. */ + + +static int +edivm (short unsigned int *den, short unsigned int *num, LDPARMS * ldp) +{ + int i; + register unsigned short *p; + unsigned long tnum; + unsigned short j, tdenm, tquot; + unsigned short tprod[NI + 1]; + unsigned short *equot = ldp->equot; + + p = &equot[0]; + *p++ = num[0]; + *p++ = num[1]; + + for (i = M; i < NI; i++) + { + *p++ = 0; + } + eshdn1 (num); + tdenm = den[M + 1]; + for (i = M; i < NI; i++) + { + /* Find trial quotient digit (the radix is 65536). */ + tnum = (((unsigned long) num[M]) << 16) + num[M + 1]; + + /* Do not execute the divide instruction if it will overflow. */ + if ((tdenm * 0xffffUL) < tnum) + tquot = 0xffff; + else + tquot = tnum / tdenm; + + /* Prove that the divide worked. */ +/* + tcheck = (unsigned long )tquot * tdenm; + if( tnum - tcheck > tdenm ) + tquot = 0xffff; +*/ + /* Multiply denominator by trial quotient digit. */ + m16m (tquot, den, tprod); + /* The quotient digit may have been overestimated. */ + if (ecmpm (tprod, num) > 0) + { + tquot -= 1; + esubm (den, tprod); + if (ecmpm (tprod, num) > 0) + { + tquot -= 1; + esubm (den, tprod); + } + } +/* + if( ecmpm( tprod, num ) > 0 ) + { + eshow( "tprod", tprod ); + eshow( "num ", num ); + printf( "tnum = %08lx, tden = %04x, tquot = %04x\n", + tnum, den[M+1], tquot ); + } +*/ + esubm (tprod, num); +/* + if( ecmpm( num, den ) >= 0 ) + { + eshow( "num ", num ); + eshow( "den ", den ); + printf( "tnum = %08lx, tden = %04x, tquot = %04x\n", + tnum, den[M+1], tquot ); + } +*/ + equot[i] = tquot; + eshup6 (num); + } +/* test for nonzero remainder after roundoff bit */ + p = &num[M]; + j = 0; + for (i = M; i < NI; i++) + { + j |= *p++; + } + if (j) + j = 1; + + for (i = 0; i < NI; i++) + num[i] = equot[i]; + + return ((int) j); +} + + + +/* Multiply significands */ +static int +emulm (short unsigned int *a, short unsigned int *b, LDPARMS * ldp) +{ + unsigned short *p, *q; + unsigned short pprod[NI]; + unsigned short j; + int i; + unsigned short *equot = ldp->equot; + + equot[0] = b[0]; + equot[1] = b[1]; + for (i = M; i < NI; i++) + equot[i] = 0; + + j = 0; + p = &a[NI - 1]; + q = &equot[NI - 1]; + for (i = M + 1; i < NI; i++) + { + if (*p == 0) + { + --p; + } + else + { + m16m (*p--, b, pprod); + eaddm (pprod, equot); + } + j |= *q; + eshdn6 (equot); + } + + for (i = 0; i < NI; i++) + b[i] = equot[i]; + +/* return flag for lost nonzero bits */ + return ((int) j); +} + + +/* +static void eshow(str, x) +char *str; +unsigned short *x; +{ +int i; + +printf( "%s ", str ); +for( i=0; i NBITS) + { + ecleazs (s); + return; + } +#endif + exp -= j; +#ifndef USE_INFINITY + if (exp >= 32767L) + goto overf; +#else + if ((j > NBITS) && (exp < 32767L)) + { + ecleazs (s); + return; + } +#endif + if (exp < 0L) + { + if (exp > (long) (-NBITS - 1)) + { + j = (int) exp; + i = eshift (s, j); + if (i) + lost = 1; + } + else + { + ecleazs (s); + return; + } + } +/* Round off, unless told not to by rcntrl. */ + if (rcntrl == 0) + goto mdfin; +/* Set up rounding parameters if the control register changed. */ + if (ldp->rndprc != ldp->rlast) + { + ecleaz (ldp->rbit); + switch (ldp->rndprc) + { + default: + case NBITS: + ldp->rw = NI - 1; /* low guard word */ + ldp->rmsk = 0xffff; + ldp->rmbit = 0x8000; + ldp->rebit = 1; + ldp->re = ldp->rw - 1; + break; + case 113: + ldp->rw = 10; + ldp->rmsk = 0x7fff; + ldp->rmbit = 0x4000; + ldp->rebit = 0x8000; + ldp->re = ldp->rw; + break; + case 64: + ldp->rw = 7; + ldp->rmsk = 0xffff; + ldp->rmbit = 0x8000; + ldp->rebit = 1; + ldp->re = ldp->rw - 1; + break; +/* For DEC arithmetic */ + case 56: + ldp->rw = 6; + ldp->rmsk = 0xff; + ldp->rmbit = 0x80; + ldp->rebit = 0x100; + ldp->re = ldp->rw; + break; + case 53: + ldp->rw = 6; + ldp->rmsk = 0x7ff; + ldp->rmbit = 0x0400; + ldp->rebit = 0x800; + ldp->re = ldp->rw; + break; + case 24: + ldp->rw = 4; + ldp->rmsk = 0xff; + ldp->rmbit = 0x80; + ldp->rebit = 0x100; + ldp->re = ldp->rw; + break; + } + ldp->rbit[ldp->re] = ldp->rebit; + ldp->rlast = ldp->rndprc; + } + +/* Shift down 1 temporarily if the data structure has an implied + * most significant bit and the number is denormal. + * For rndprc = 64 or NBITS, there is no implied bit. + * But Intel long double denormals lose one bit of significance even so. + */ +#if IBMPC + if ((exp <= 0) && (ldp->rndprc != NBITS)) +#else + if ((exp <= 0) && (ldp->rndprc != 64) && (ldp->rndprc != NBITS)) +#endif + { + lost |= s[NI - 1] & 1; + eshdn1 (s); + } +/* Clear out all bits below the rounding bit, + * remembering in r if any were nonzero. + */ + r = s[ldp->rw] & ldp->rmsk; + if (ldp->rndprc < NBITS) + { + i = ldp->rw + 1; + while (i < NI) + { + if (s[i]) + r |= 1; + s[i] = 0; + ++i; + } + } + s[ldp->rw] &= ~ldp->rmsk; + if ((r & ldp->rmbit) != 0) + { + if (r == ldp->rmbit) + { + if (lost == 0) + { /* round to even */ + if ((s[ldp->re] & ldp->rebit) == 0) + goto mddone; + } + else + { + if (subflg != 0) + goto mddone; + } + } + eaddm (ldp->rbit, s); + } +mddone: +#if IBMPC + if ((exp <= 0) && (ldp->rndprc != NBITS)) +#else + if ((exp <= 0) && (ldp->rndprc != 64) && (ldp->rndprc != NBITS)) +#endif + { + eshup1 (s); + } + if (s[2] != 0) + { /* overflow on roundoff */ + eshdn1 (s); + exp += 1; + } +mdfin: + s[NI - 1] = 0; + if (exp >= 32767L) + { +#ifndef USE_INFINITY + overf: +#endif +#ifdef USE_INFINITY + s[1] = 32767; + for (i = 2; i < NI - 1; i++) + s[i] = 0; +#else + s[1] = 32766; + s[2] = 0; + for (i = M + 1; i < NI - 1; i++) + s[i] = 0xffff; + s[NI - 1] = 0; + if ((ldp->rndprc < 64) || (ldp->rndprc == 113)) + { + s[ldp->rw] &= ~ldp->rmsk; + if (ldp->rndprc == 24) + { + s[5] = 0; + s[6] = 0; + } + } +#endif + return; + } + if (exp < 0) + s[1] = 0; + else + s[1] = (unsigned short) exp; +} + + + +/* +; Subtract external format numbers. +; +; unsigned short a[NE], b[NE], c[NE]; +; LDPARMS *ldp; +; esub( a, b, c, ldp ); c = b - a +*/ + +static void +esub (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, LDPARMS * ldp) +{ + +#ifdef NANS + if (eisnan (a)) + { + emov (a, c); + return; + } + if (eisnan (b)) + { + emov (b, c); + return; + } +/* Infinity minus infinity is a NaN. + * Test for subtracting infinities of the same sign. + */ + if (eisinf (a) && eisinf (b) && ((eisneg (a) ^ eisneg (b)) == 0)) + { + mtherr ("esub", DOMAIN); + enan (c, NBITS); + return; + } +#endif + eadd1 (a, b, c, 1, ldp); +} + + + +static void +eadd1 (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, int subflg, LDPARMS * ldp) +{ + unsigned short ai[NI], bi[NI], ci[NI]; + int i, lost, j, k; + long lt, lta, ltb; + +#ifdef USE_INFINITY + if (eisinf (a)) + { + emov (a, c); + if (subflg) + eneg (c); + return; + } + if (eisinf (b)) + { + emov (b, c); + return; + } +#endif + emovi (a, ai); + emovi (b, bi); + if (subflg) + ai[0] = ~ai[0]; + +/* compare exponents */ + lta = ai[E]; + ltb = bi[E]; + lt = lta - ltb; + if (lt > 0L) + { /* put the larger number in bi */ + emovz (bi, ci); + emovz (ai, bi); + emovz (ci, ai); + ltb = bi[E]; + lt = -lt; + } + lost = 0; + if (lt != 0L) + { + if (lt < (long) (-NBITS - 1)) + goto done; /* answer same as larger addend */ + k = (int) lt; + lost = eshift (ai, k); /* shift the smaller number down */ + } + else + { +/* exponents were the same, so must compare significands */ + i = ecmpm (ai, bi); + if (i == 0) + { /* the numbers are identical in magnitude */ + /* if different signs, result is zero */ + if (ai[0] != bi[0]) + { + eclear (c); + return; + } + /* if same sign, result is double */ + /* double denomalized tiny number */ + if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0)) + { + eshup1 (bi); + goto done; + } + /* add 1 to exponent unless both are zero! */ + for (j = 1; j < NI - 1; j++) + { + if (bi[j] != 0) + { +/* This could overflow, but let emovo take care of that. */ + ltb += 1; + break; + } + } + bi[E] = (unsigned short) ltb; + goto done; + } + if (i > 0) + { /* put the larger number in bi */ + emovz (bi, ci); + emovz (ai, bi); + emovz (ci, ai); + } + } + if (ai[0] == bi[0]) + { + eaddm (ai, bi); + subflg = 0; + } + else + { + esubm (ai, bi); + subflg = 1; + } + emdnorm (bi, lost, subflg, ltb, 64, ldp); + +done: + emovo (bi, c, ldp); +} + + + +/* +; Divide. +; +; unsigned short a[NE], b[NE], c[NE]; +; LDPARMS *ldp; +; ediv( a, b, c, ldp ); c = b / a +*/ +static void +ediv (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, LDPARMS * ldp) +{ + unsigned short ai[NI], bi[NI]; + int i; + long lt, lta, ltb; + +#ifdef NANS +/* Return any NaN input. */ + if (eisnan (a)) + { + emov (a, c); + return; + } + if (eisnan (b)) + { + emov (b, c); + return; + } +/* Zero over zero, or infinity over infinity, is a NaN. */ + if (((ecmp (a, ezero) == 0) && (ecmp (b, ezero) == 0)) + || (eisinf (a) && eisinf (b))) + { + mtherr ("ediv", DOMAIN); + enan (c, NBITS); + return; + } +#endif +/* Infinity over anything else is infinity. */ +#ifdef USE_INFINITY + if (eisinf (b)) + { + if (eisneg (a) ^ eisneg (b)) + *(c + (NE - 1)) = 0x8000; + else + *(c + (NE - 1)) = 0; + einfin (c, ldp); + return; + } + if (eisinf (a)) + { + eclear (c); + return; + } +#endif + emovi (a, ai); + emovi (b, bi); + lta = ai[E]; + ltb = bi[E]; + if (bi[E] == 0) + { /* See if numerator is zero. */ + for (i = 1; i < NI - 1; i++) + { + if (bi[i] != 0) + { + ltb -= enormlz (bi); + goto dnzro1; + } + } + eclear (c); + return; + } +dnzro1: + + if (ai[E] == 0) + { /* possible divide by zero */ + for (i = 1; i < NI - 1; i++) + { + if (ai[i] != 0) + { + lta -= enormlz (ai); + goto dnzro2; + } + } + if (ai[0] == bi[0]) + *(c + (NE - 1)) = 0; + else + *(c + (NE - 1)) = 0x8000; + einfin (c, ldp); + mtherr ("ediv", SING); + return; + } +dnzro2: + + i = edivm (ai, bi, ldp); +/* calculate exponent */ + lt = ltb - lta + EXONE; + emdnorm (bi, i, 0, lt, 64, ldp); +/* set the sign */ + if (ai[0] == bi[0]) + bi[0] = 0; + else + bi[0] = 0Xffff; + emovo (bi, c, ldp); +} + + + +/* +; Multiply. +; +; unsigned short a[NE], b[NE], c[NE]; +; LDPARMS *ldp +; emul( a, b, c, ldp ); c = b * a +*/ +static void +emul (const short unsigned int *a, const short unsigned int *b, + short unsigned int *c, LDPARMS * ldp) +{ + unsigned short ai[NI], bi[NI]; + int i, j; + long lt, lta, ltb; + +#ifdef NANS +/* NaN times anything is the same NaN. */ + if (eisnan (a)) + { + emov (a, c); + return; + } + if (eisnan (b)) + { + emov (b, c); + return; + } +/* Zero times infinity is a NaN. */ + if ((eisinf (a) && (ecmp (b, ezero) == 0)) + || (eisinf (b) && (ecmp (a, ezero) == 0))) + { + mtherr ("emul", DOMAIN); + enan (c, NBITS); + return; + } +#endif +/* Infinity times anything else is infinity. */ +#ifdef USE_INFINITY + if (eisinf (a) || eisinf (b)) + { + if (eisneg (a) ^ eisneg (b)) + *(c + (NE - 1)) = 0x8000; + else + *(c + (NE - 1)) = 0; + einfin (c, ldp); + return; + } +#endif + emovi (a, ai); + emovi (b, bi); + lta = ai[E]; + ltb = bi[E]; + if (ai[E] == 0) + { + for (i = 1; i < NI - 1; i++) + { + if (ai[i] != 0) + { + lta -= enormlz (ai); + goto mnzer1; + } + } + eclear (c); + return; + } +mnzer1: + + if (bi[E] == 0) + { + for (i = 1; i < NI - 1; i++) + { + if (bi[i] != 0) + { + ltb -= enormlz (bi); + goto mnzer2; + } + } + eclear (c); + return; + } +mnzer2: + +/* Multiply significands */ + j = emulm (ai, bi, ldp); +/* calculate exponent */ + lt = lta + ltb - (EXONE - 1); + emdnorm (bi, j, 0, lt, 64, ldp); +/* calculate sign of product */ + if (ai[0] == bi[0]) + bi[0] = 0; + else + bi[0] = 0xffff; + emovo (bi, c, ldp); +} + + + +#if LDBL_MANT_DIG > 64 +static void +e113toe (short unsigned int *pe, short unsigned int *y, LDPARMS * ldp) +{ + register unsigned short r; + unsigned short *e, *p; + unsigned short yy[NI]; + int denorm, i; + + e = pe; + denorm = 0; + ecleaz (yy); +#ifdef IBMPC + e += 7; +#endif + r = *e; + yy[0] = 0; + if (r & 0x8000) + yy[0] = 0xffff; + r &= 0x7fff; +#ifdef USE_INFINITY + if (r == 0x7fff) + { +#ifdef NANS +#ifdef IBMPC + for (i = 0; i < 7; i++) + { + if (pe[i] != 0) + { + enan (y, NBITS); + return; + } + } +#else /* !IBMPC */ + for (i = 1; i < 8; i++) + { + if (pe[i] != 0) + { + enan (y, NBITS); + return; + } + } +#endif /* !IBMPC */ +#endif /* NANS */ + eclear (y); + einfin (y, ldp); + if (*e & 0x8000) + eneg (y); + return; + } +#endif /* INFINITY */ + yy[E] = r; + p = &yy[M + 1]; +#ifdef IBMPC + for (i = 0; i < 7; i++) + *p++ = *(--e); +#else /* IBMPC */ + ++e; + for (i = 0; i < 7; i++) + *p++ = *e++; +#endif /* IBMPC */ +/* If denormal, remove the implied bit; else shift down 1. */ + if (r == 0) + { + yy[M] = 0; + } + else + { + yy[M] = 1; + eshift (yy, -1); + } + emovo (yy, y, ldp); +} + +/* move out internal format to ieee long double */ +static void +__attribute__ ((__unused__)) +toe113 (short unsigned int *a, short unsigned int *b) +{ + register unsigned short *p, *q; + unsigned short i; + +#ifdef NANS + if (eiisnan (a)) + { + enan (b, 113); + return; + } +#endif + p = a; +#ifdef MIEEE + q = b; +#else + q = b + 7; /* point to output exponent */ +#endif + +/* If not denormal, delete the implied bit. */ + if (a[E] != 0) + { + eshup1 (a); + } +/* combine sign and exponent */ + i = *p++; +#ifdef MIEEE + if (i) + *q++ = *p++ | 0x8000; + else + *q++ = *p++; +#else + if (i) + *q-- = *p++ | 0x8000; + else + *q-- = *p++; +#endif +/* skip over guard word */ + ++p; +/* move the significand */ +#ifdef MIEEE + for (i = 0; i < 7; i++) + *q++ = *p++; +#else + for (i = 0; i < 7; i++) + *q-- = *p++; +#endif +} +#endif /* LDBL_MANT_DIG > 64 */ + + +#if LDBL_MANT_DIG == 64 +static void +e64toe (short unsigned int *pe, short unsigned int *y, LDPARMS * ldp) +{ + unsigned short yy[NI]; + unsigned short *p, *q, *e; + int i; + + e = pe; + p = yy; + + for (i = 0; i < NE - 5; i++) + *p++ = 0; +#ifdef IBMPC + for (i = 0; i < 5; i++) + *p++ = *e++; +#endif +#ifdef DEC + for (i = 0; i < 5; i++) + *p++ = *e++; +#endif +#ifdef MIEEE + p = &yy[0] + (NE - 1); + *p-- = *e++; + ++e; /* MIEEE skips over 2nd short */ + for (i = 0; i < 4; i++) + *p-- = *e++; +#endif + +#ifdef IBMPC +/* For Intel long double, shift denormal significand up 1 + -- but only if the top significand bit is zero. */ + if ((yy[NE - 1] & 0x7fff) == 0 && (yy[NE - 2] & 0x8000) == 0) + { + unsigned short temp[NI + 1]; + emovi (yy, temp); + eshup1 (temp); + emovo (temp, y, ldp); + return; + } +#endif +#ifdef USE_INFINITY +/* Point to the exponent field. */ + p = &yy[NE - 1]; + if ((*p & 0x7fff) == 0x7fff) + { +#ifdef NANS +#ifdef IBMPC + for (i = 0; i < 4; i++) + { + if ((i != 3 && pe[i] != 0) + /* Check for Intel long double infinity pattern. */ + || (i == 3 && pe[i] != 0x8000)) + { + enan (y, NBITS); + return; + } + } +#endif +#ifdef MIEEE + for (i = 2; i <= 5; i++) + { + if (pe[i] != 0) + { + enan (y, NBITS); + return; + } + } +#endif +#endif /* NANS */ + eclear (y); + einfin (y, ldp); + if (*p & 0x8000) + eneg (y); + return; + } +#endif /* USE_INFINITY */ + p = yy; + q = y; + for (i = 0; i < NE; i++) + *q++ = *p++; +} + +/* move out internal format to ieee long double */ +static void +__attribute__ ((__unused__)) +toe64 (short unsigned int *a, short unsigned int *b) +{ + register unsigned short *p, *q; + unsigned short i; + +#ifdef NANS + if (eiisnan (a)) + { + enan (b, 64); + return; + } +#endif +#ifdef IBMPC +/* Shift Intel denormal significand down 1. */ + if (a[E] == 0) + eshdn1 (a); +#endif + p = a; +#ifdef MIEEE + q = b; +#else + q = b + 4; /* point to output exponent */ +/* NOTE: Intel data type is 96 bits wide, clear the last word here. */ + *(q + 1) = 0; +#endif + +/* combine sign and exponent */ + i = *p++; +#ifdef MIEEE + if (i) + *q++ = *p++ | 0x8000; + else + *q++ = *p++; + *q++ = 0; /* leave 2nd short blank */ +#else + if (i) + *q-- = *p++ | 0x8000; + else + *q-- = *p++; +#endif +/* skip over guard word */ + ++p; +/* move the significand */ +#ifdef MIEEE + for (i = 0; i < 4; i++) + *q++ = *p++; +#else +#ifdef USE_INFINITY +#ifdef IBMPC + if (eiisinf (a)) + { + /* Intel long double infinity. */ + *q-- = 0x8000; + *q-- = 0; + *q-- = 0; + *q = 0; + return; + } +#endif /* IBMPC */ +#endif /* USE_INFINITY */ + for (i = 0; i < 4; i++) + *q-- = *p++; +#endif +} + +#endif /* LDBL_MANT_DIG == 64 */ + +#if LDBL_MANT_DIG == 53 +/* +; Convert IEEE double precision to e type +; double d; +; unsigned short x[N+2]; +; e53toe( &d, x ); +*/ +static void +e53toe (short unsigned int *pe, short unsigned int *y, LDPARMS * ldp) +{ +#ifdef DEC + + dectoe (pe, y); /* see etodec.c */ + +#else + + register unsigned short r; + register unsigned short *p, *e; + unsigned short yy[NI]; + int denorm, k; + + e = pe; + denorm = 0; /* flag if denormalized number */ + ecleaz (yy); +#ifdef IBMPC + e += 3; +#endif +#ifdef DEC + e += 3; +#endif + r = *e; + yy[0] = 0; + if (r & 0x8000) + yy[0] = 0xffff; + yy[M] = (r & 0x0f) | 0x10; + r &= ~0x800f; /* strip sign and 4 significand bits */ +#ifdef USE_INFINITY + if (r == 0x7ff0) + { +#ifdef NANS +#ifdef IBMPC + if (((pe[3] & 0xf) != 0) || (pe[2] != 0) + || (pe[1] != 0) || (pe[0] != 0)) + { + enan (y, NBITS); + return; + } +#else /* !IBMPC */ + if (((pe[0] & 0xf) != 0) || (pe[1] != 0) + || (pe[2] != 0) || (pe[3] != 0)) + { + enan (y, NBITS); + return; + } +#endif /* !IBMPC */ +#endif /* NANS */ + eclear (y); + einfin (y, ldp); + if (yy[0]) + eneg (y); + return; + } +#endif + r >>= 4; +/* If zero exponent, then the significand is denormalized. + * So, take back the understood high significand bit. */ + if (r == 0) + { + denorm = 1; + yy[M] &= ~0x10; + } + r += EXONE - 01777; + yy[E] = r; + p = &yy[M + 1]; +#ifdef IBMPC + *p++ = *(--e); + *p++ = *(--e); + *p++ = *(--e); +#else /* !IBMPC */ + ++e; + *p++ = *e++; + *p++ = *e++; + *p++ = *e++; +#endif /* !IBMPC */ + (void) eshift (yy, -5); + if (denorm) + { /* if zero exponent, then normalize the significand */ + if ((k = enormlz (yy)) > NBITS) + ecleazs (yy); + else + yy[E] -= (unsigned short) (k - 1); + } + emovo (yy, y, ldp); +#endif /* !DEC */ +} + +/* +; e type to IEEE double precision +; double d; +; unsigned short x[NE]; +; etoe53( x, &d ); +*/ + +#ifdef DEC + +static void +etoe53 (x, e) + unsigned short *x, *e; +{ + etodec (x, e); /* see etodec.c */ +} + +static void +__attribute__ ((__unused__)) +toe53 (x, y) + unsigned short *x, *y; +{ + todec (x, y); +} + +#else + +static void +__attribute__ ((__unused__)) +toe53 (short unsigned int *x, short unsigned int *y) +{ + unsigned short i; + unsigned short *p; + + +#ifdef NANS + if (eiisnan (x)) + { + enan (y, 53); + return; + } +#endif + p = &x[0]; +#ifdef IBMPC + y += 3; +#endif +#ifdef DEC + y += 3; +#endif + *y = 0; /* output high order */ + if (*p++) + *y = 0x8000; /* output sign bit */ + + i = *p++; + if (i >= (unsigned int) 2047) + { /* Saturate at largest number less than infinity. */ +#ifdef USE_INFINITY + *y |= 0x7ff0; +#ifdef IBMPC + *(--y) = 0; + *(--y) = 0; + *(--y) = 0; +#else /* !IBMPC */ + ++y; + *y++ = 0; + *y++ = 0; + *y++ = 0; +#endif /* IBMPC */ +#else /* !USE_INFINITY */ + *y |= (unsigned short) 0x7fef; +#ifdef IBMPC + *(--y) = 0xffff; + *(--y) = 0xffff; + *(--y) = 0xffff; +#else /* !IBMPC */ + ++y; + *y++ = 0xffff; + *y++ = 0xffff; + *y++ = 0xffff; +#endif +#endif /* !USE_INFINITY */ + return; + } + if (i == 0) + { + (void) eshift (x, 4); + } + else + { + i <<= 4; + (void) eshift (x, 5); + } + i |= *p++ & (unsigned short) 0x0f; /* *p = xi[M] */ + *y |= (unsigned short) i; /* high order output already has sign bit set */ +#ifdef IBMPC + *(--y) = *p++; + *(--y) = *p++; + *(--y) = *p; +#else /* !IBMPC */ + ++y; + *y++ = *p++; + *y++ = *p++; + *y++ = *p++; +#endif /* !IBMPC */ +} + +#endif /* not DEC */ +#endif /* LDBL_MANT_DIG == 53 */ + +#if LDBL_MANT_DIG == 24 +/* +; Convert IEEE single precision to e type +; float d; +; unsigned short x[N+2]; +; dtox( &d, x ); +*/ +void +e24toe (short unsigned int *pe, short unsigned int *y, LDPARMS * ldp) +{ + register unsigned short r; + register unsigned short *p, *e; + unsigned short yy[NI]; + int denorm, k; + + e = pe; + denorm = 0; /* flag if denormalized number */ + ecleaz (yy); +#ifdef IBMPC + e += 1; +#endif +#ifdef DEC + e += 1; +#endif + r = *e; + yy[0] = 0; + if (r & 0x8000) + yy[0] = 0xffff; + yy[M] = (r & 0x7f) | 0200; + r &= ~0x807f; /* strip sign and 7 significand bits */ +#ifdef USE_INFINITY + if (r == 0x7f80) + { +#ifdef NANS +#ifdef MIEEE + if (((pe[0] & 0x7f) != 0) || (pe[1] != 0)) + { + enan (y, NBITS); + return; + } +#else /* !MIEEE */ + if (((pe[1] & 0x7f) != 0) || (pe[0] != 0)) + { + enan (y, NBITS); + return; + } +#endif /* !MIEEE */ +#endif /* NANS */ + eclear (y); + einfin (y, ldp); + if (yy[0]) + eneg (y); + return; + } +#endif + r >>= 7; +/* If zero exponent, then the significand is denormalized. + * So, take back the understood high significand bit. */ + if (r == 0) + { + denorm = 1; + yy[M] &= ~0200; + } + r += EXONE - 0177; + yy[E] = r; + p = &yy[M + 1]; +#ifdef IBMPC + *p++ = *(--e); +#endif +#ifdef DEC + *p++ = *(--e); +#endif +#ifdef MIEEE + ++e; + *p++ = *e++; +#endif + (void) eshift (yy, -8); + if (denorm) + { /* if zero exponent, then normalize the significand */ + if ((k = enormlz (yy)) > NBITS) + ecleazs (yy); + else + yy[E] -= (unsigned short) (k - 1); + } + emovo (yy, y, ldp); +} + +static void +__attribute__ ((__unused__)) +toe24 (short unsigned int *x, short unsigned int *y) +{ + unsigned short i; + unsigned short *p; + +#ifdef NANS + if (eiisnan (x)) + { + enan (y, 24); + return; + } +#endif + p = &x[0]; +#ifdef IBMPC + y += 1; +#endif +#ifdef DEC + y += 1; +#endif + *y = 0; /* output high order */ + if (*p++) + *y = 0x8000; /* output sign bit */ + + i = *p++; + if (i >= 255) + { /* Saturate at largest number less than infinity. */ +#ifdef USE_INFINITY + *y |= (unsigned short) 0x7f80; +#ifdef IBMPC + *(--y) = 0; +#endif +#ifdef DEC + *(--y) = 0; +#endif +#ifdef MIEEE + ++y; + *y = 0; +#endif +#else /* !USE_INFINITY */ + *y |= (unsigned short) 0x7f7f; +#ifdef IBMPC + *(--y) = 0xffff; +#endif +#ifdef DEC + *(--y) = 0xffff; +#endif +#ifdef MIEEE + ++y; + *y = 0xffff; +#endif +#endif /* !USE_INFINITY */ + return; + } + if (i == 0) + { + (void) eshift (x, 7); + } + else + { + i <<= 7; + (void) eshift (x, 8); + } + i |= *p++ & (unsigned short) 0x7f; /* *p = xi[M] */ + *y |= i; /* high order output already has sign bit set */ +#ifdef IBMPC + *(--y) = *p; +#endif +#ifdef DEC + *(--y) = *p; +#endif +#ifdef MIEEE + ++y; + *y = *p; +#endif +} +#endif /* LDBL_MANT_DIG == 24 */ + +/* Compare two e type numbers. + * + * unsigned short a[NE], b[NE]; + * ecmp( a, b ); + * + * returns +1 if a > b + * 0 if a == b + * -1 if a < b + * -2 if either a or b is a NaN. + */ +static int +ecmp (const short unsigned int *a, const short unsigned int *b) +{ + unsigned short ai[NI], bi[NI]; + register unsigned short *p, *q; + register int i; + int msign; + +#ifdef NANS + if (eisnan (a) || eisnan (b)) + return (-2); +#endif + emovi (a, ai); + p = ai; + emovi (b, bi); + q = bi; + + if (*p != *q) + { /* the signs are different */ +/* -0 equals + 0 */ + for (i = 1; i < NI - 1; i++) + { + if (ai[i] != 0) + goto nzro; + if (bi[i] != 0) + goto nzro; + } + return (0); + nzro: + if (*p == 0) + return (1); + else + return (-1); + } +/* both are the same sign */ + if (*p == 0) + msign = 1; + else + msign = -1; + i = NI - 1; + do + { + if (*p++ != *q++) + { + goto diff; + } + } + while (--i > 0); + + return (0); /* equality */ + + + +diff: + + if (*(--p) > *(--q)) + return (msign); /* p is bigger */ + else + return (-msign); /* p is littler */ +} + + +/* +; Shift significand +; +; Shifts significand area up or down by the number of bits +; given by the variable sc. +*/ +static int +eshift (short unsigned int *x, int sc) +{ + unsigned short lost; + unsigned short *p; + + if (sc == 0) + return (0); + + lost = 0; + p = x + NI - 1; + + if (sc < 0) + { + sc = -sc; + while (sc >= 16) + { + lost |= *p; /* remember lost bits */ + eshdn6 (x); + sc -= 16; + } + + while (sc >= 8) + { + lost |= *p & 0xff; + eshdn8 (x); + sc -= 8; + } + + while (sc > 0) + { + lost |= *p & 1; + eshdn1 (x); + sc -= 1; + } + } + else + { + while (sc >= 16) + { + eshup6 (x); + sc -= 16; + } + + while (sc >= 8) + { + eshup8 (x); + sc -= 8; + } + + while (sc > 0) + { + eshup1 (x); + sc -= 1; + } + } + if (lost) + lost = 1; + return ((int) lost); +} + + + +/* +; normalize +; +; Shift normalizes the significand area pointed to by argument +; shift count (up = positive) is returned. +*/ +static int +enormlz (short unsigned int *x) +{ + register unsigned short *p; + int sc; + + sc = 0; + p = &x[M]; + if (*p != 0) + goto normdn; + ++p; + if (*p & 0x8000) + return (0); /* already normalized */ + while (*p == 0) + { + eshup6 (x); + sc += 16; +/* With guard word, there are NBITS+16 bits available. + * return true if all are zero. + */ + if (sc > NBITS) + return (sc); + } +/* see if high byte is zero */ + while ((*p & 0xff00) == 0) + { + eshup8 (x); + sc += 8; + } +/* now shift 1 bit at a time */ + while ((*p & 0x8000) == 0) + { + eshup1 (x); + sc += 1; + if (sc > (NBITS + 16)) + { + mtherr ("enormlz", UNDERFLOW); + return (sc); + } + } + return (sc); + +/* Normalize by shifting down out of the high guard word + of the significand */ +normdn: + + if (*p & 0xff00) + { + eshdn8 (x); + sc -= 8; + } + while (*p != 0) + { + eshdn1 (x); + sc -= 1; + + if (sc < -NBITS) + { + mtherr ("enormlz", OVERFLOW); + return (sc); + } + } + return (sc); +} + + + + +/* Convert e type number to decimal format ASCII string. + * The constants are for 64 bit precision. + */ + +#define NTEN 12 +#define MAXP 4096 + +#if NE == 10 +static const unsigned short etens[NTEN + 1][NE] = { + {0x6576, 0x4a92, 0x804a, 0x153f, + 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */ + {0x6a32, 0xce52, 0x329a, 0x28ce, + 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */ + {0x526c, 0x50ce, 0xf18b, 0x3d28, + 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,}, + {0x9c66, 0x58f8, 0xbc50, 0x5c54, + 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,}, + {0x851e, 0xeab7, 0x98fe, 0x901b, + 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,}, + {0x0235, 0x0137, 0x36b1, 0x336c, + 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,}, + {0x50f8, 0x25fb, 0xc76b, 0x6b71, + 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,}, + {0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */ +}; + +static const unsigned short emtens[NTEN + 1][NE] = { + {0x2030, 0xcffc, 0xa1c3, 0x8123, + 0x2de3, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */ + {0x8264, 0xd2cb, 0xf2ea, 0x12d4, + 0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */ + {0xf53f, 0xf698, 0x6bd3, 0x0158, + 0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,}, + {0xe731, 0x04d4, 0xe3f2, 0xd332, + 0x7132, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,}, + {0xa23e, 0x5308, 0xfefb, 0x1155, + 0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,}, + {0xe26d, 0xdbde, 0xd05d, 0xb3f6, + 0xac7c, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,}, + {0x2a20, 0x6224, 0x47b3, 0x98d7, + 0x3f23, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,}, + {0x0b5b, 0x4af2, 0xa581, 0x18ed, + 0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,}, + {0xbf71, 0xa9b3, 0x7989, 0xbe68, + 0x4c2e, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,}, + {0x3d4d, 0x7c3d, 0x36ba, 0x0d2b, + 0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,}, + {0xc155, 0xa4a8, 0x404e, 0x6113, + 0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,}, + {0xd70a, 0x70a3, 0x0a3d, 0xa3d7, + 0x3d70, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,}, + {0xcccd, 0xcccc, 0xcccc, 0xcccc, + 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */ +}; +#else +static const unsigned short etens[NTEN + 1][NE] = { + {0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */ + {0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */ + {0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,}, + {0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,}, + {0xddbc, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,}, + {0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,}, + {0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,}, + {0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,}, + {0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,}, + {0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,}, + {0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,}, + {0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,}, + {0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */ +}; + +static const unsigned short emtens[NTEN + 1][NE] = { + {0x2de4, 0x9fde, 0xd2ce, 0x04c8, 0xa6dd, 0x0ad8,}, /* 10**-4096 */ + {0x4925, 0x2de4, 0x3436, 0x534f, 0xceae, 0x256b,}, /* 10**-2048 */ + {0x87a6, 0xc0bd, 0xda57, 0x82a5, 0xa2a6, 0x32b5,}, + {0x7133, 0xd21c, 0xdb23, 0xee32, 0x9049, 0x395a,}, + {0xfa91, 0x1939, 0x637a, 0x4325, 0xc031, 0x3cac,}, + {0xac7d, 0xe4a0, 0x64bc, 0x467c, 0xddd0, 0x3e55,}, + {0x3f24, 0xe9a5, 0xa539, 0xea27, 0xa87f, 0x3f2a,}, + {0x67de, 0x94ba, 0x4539, 0x1ead, 0xcfb1, 0x3f94,}, + {0x4c2f, 0xe15b, 0xc44d, 0x94be, 0xe695, 0x3fc9,}, + {0xfdc2, 0xcefc, 0x8461, 0x7711, 0xabcc, 0x3fe4,}, + {0xd3c3, 0x652b, 0xe219, 0x1758, 0xd1b7, 0x3ff1,}, + {0x3d71, 0xd70a, 0x70a3, 0x0a3d, 0xa3d7, 0x3ff8,}, + {0xcccd, 0xcccc, 0xcccc, 0xcccc, 0xcccc, 0x3ffb,}, /* 10**-1 */ +}; +#endif + + + +/* ASCII string outputs for unix */ + + +#if 0 +void +_IO_ldtostr (x, string, ndigs, flags, fmt) + long double *x; + char *string; + int ndigs; + int flags; + char fmt; +{ + unsigned short w[NI]; + char *t, *u; + LDPARMS rnd; + LDPARMS *ldp = &rnd; + + rnd.rlast = -1; + rnd.rndprc = NBITS; + + if (sizeof (long double) == 16) + e113toe ((unsigned short *) x, w, ldp); + else + e64toe ((unsigned short *) x, w, ldp); + + etoasc (w, string, ndigs, -1, ldp); + if (ndigs == 0 && flags == 0) + { + /* Delete the decimal point unless alternate format. */ + t = string; + while (*t != '.') + ++t; + u = t + 1; + while (*t != '\0') + *t++ = *u++; + } + if (*string == ' ') + { + t = string; + u = t + 1; + while (*t != '\0') + *t++ = *u++; + } + if (fmt == 'E') + { + t = string; + while (*t != 'e') + ++t; + *t = 'E'; + } +} + +#endif + +/* This routine will not return more than NDEC+1 digits. */ + +char * +_ldtoa_r (struct _reent *ptr, long double d, int mode, int ndigits, + int *decpt, int *sign, char **rve) +{ + unsigned short e[NI]; + char *s, *p; + int i, j, k; + int orig_ndigits; + LDPARMS rnd; + LDPARMS *ldp = &rnd; + char *outstr; + char outbuf_sml[NDEC_SML + MAX_EXP_DIGITS + 10]; + char *outbuf = outbuf_sml; + union uconv du; + du.d = d; + + orig_ndigits = ndigits; + rnd.rlast = -1; + rnd.rndprc = NBITS; + + _REENT_CHECK_MP (ptr); + +/* reentrancy addition to use mprec storage pool */ + if (_REENT_MP_RESULT (ptr)) + { + _REENT_MP_RESULT (ptr)->_k = _REENT_MP_RESULT_K (ptr); + _REENT_MP_RESULT (ptr)->_maxwds = 1 << _REENT_MP_RESULT_K (ptr); + Bfree (ptr, _REENT_MP_RESULT (ptr)); + _REENT_MP_RESULT (ptr) = 0; + } + +#if LDBL_MANT_DIG == 24 + e24toe (&du.pe, e, ldp); +#elif LDBL_MANT_DIG == 53 + e53toe (&du.pe, e, ldp); +#elif LDBL_MANT_DIG == 64 + e64toe (&du.pe, e, ldp); +#else + e113toe (&du.pe, e, ldp); +#endif + + if (eisneg (e)) + *sign = 1; + else + *sign = 0; +/* Mode 3 is "f" format. */ + if (mode != 3) + ndigits -= 1; +/* Mode 0 is for %.999 format, which is supposed to give a + minimum length string that will convert back to the same binary value. + For now, just ask for 20 digits which is enough but sometimes too many. */ + if (mode == 0) + ndigits = 20; + +/* This sanity limit must agree with the corresponding one in etoasc, to + keep straight the returned value of outexpon. Note that we use a dynamic + limit now, either ndec (<= NDEC) or NDEC_SML, depending on ndigits. */ + __int32_t ndec; + if (mode == 3) /* %f */ + { + __int32_t expon = (e[NE - 1] & 0x7fff) - (EXONE - 1); /* exponent part */ + /* log2(10) approximately 485/146 */ + ndec = expon * 146 / 485 + ndigits; + } + else /* %g/%e */ + ndec = ndigits; + if (ndec < 0) + ndec = 0; + if (ndec > NDEC) + ndec = NDEC; + + /* Allocate buffer if more than NDEC_SML digits are requested. */ + if (ndec > NDEC_SML) + { + outbuf = (char *) _malloc_r (ptr, ndec + MAX_EXP_DIGITS + 10); + if (!outbuf) + { + ndec = NDEC_SML; + outbuf = outbuf_sml; + } + } + + etoasc (e, outbuf, (int) ndec, ndigits, mode, ldp); + s = outbuf; + if (eisinf (e) || eisnan (e)) + { + *decpt = 9999; + goto stripspaces; + } + *decpt = ldp->outexpon + 1; + +/* Transform the string returned by etoasc into what the caller wants. */ + +/* Look for decimal point and delete it from the string. */ + s = outbuf; + while (*s != '\0') + { + if (*s == '.') + goto yesdecpt; + ++s; + } + goto nodecpt; + +yesdecpt: + +/* Delete the decimal point. */ + while (*s != '\0') + { + *s = *(s + 1); + ++s; + } + +nodecpt: + +/* Back up over the exponent field. */ + while (*s != 'E' && s > outbuf) + --s; + *s = '\0'; + +stripspaces: + +/* Strip leading spaces and sign. */ + p = outbuf; + while (*p == ' ' || *p == '-') + ++p; + +/* Find new end of string. */ + s = outbuf; + while ((*s++ = *p++) != '\0') + ; + --s; + +/* Strip trailing zeros. */ + if (mode == 2) + k = 1; + else if (ndigits > ldp->outexpon) + k = ndigits; + else + k = ldp->outexpon; + + while (*(s - 1) == '0' && ((s - outbuf) > k)) + *(--s) = '\0'; + +/* In f format, flush small off-scale values to zero. + Rounding has been taken care of by etoasc. */ + if (mode == 3 && ((ndigits + ldp->outexpon) < 0)) + { + s = outbuf; + *s = '\0'; + *decpt = 0; + } + +/* reentrancy addition to use mprec storage pool */ +/* we want to have enough space to hold the formatted result */ + + if (mode == 3) /* f format, account for sign + dec digits + decpt + frac */ + i = *decpt + orig_ndigits + 3; + else /* account for sign + max precision digs + E + exp sign + exponent */ + i = orig_ndigits + MAX_EXP_DIGITS + 4; + + j = sizeof (__ULong); + for (_REENT_MP_RESULT_K (ptr) = 0; + sizeof (_Bigint) - sizeof (__ULong) + j <= i; j <<= 1) + _REENT_MP_RESULT_K (ptr)++; + _REENT_MP_RESULT (ptr) = eBalloc (ptr, _REENT_MP_RESULT_K (ptr)); + +/* Copy from internal temporary buffer to permanent buffer. */ + outstr = (char *) _REENT_MP_RESULT (ptr); + strcpy (outstr, outbuf); + + if (rve) + *rve = outstr + (s - outbuf); + + if (outbuf != outbuf_sml) + _free_r (ptr, outbuf); + + return outstr; +} + +/* Routine used to tell if long double is NaN or Infinity or regular number. + Returns: 0 = regular number + 1 = Nan + 2 = Infinity +*/ +int +_ldcheck (long double *d) +{ + unsigned short e[NI]; + LDPARMS rnd; + LDPARMS *ldp = &rnd; + + union uconv du; + + rnd.rlast = -1; + rnd.rndprc = NBITS; + du.d = *d; +#if LDBL_MANT_DIG == 24 + e24toe (&du.pe, e, ldp); +#elif LDBL_MANT_DIG == 53 + e53toe (&du.pe, e, ldp); +#elif LDBL_MANT_DIG == 64 + e64toe (&du.pe, e, ldp); +#else + e113toe (&du.pe, e, ldp); +#endif + + if ((e[NE - 1] & 0x7fff) == 0x7fff) + { +#ifdef NANS + if (eisnan (e)) + return (1); +#endif + return (2); + } + else + return (0); +} /* _ldcheck */ + +static void +etoasc (short unsigned int *x, char *string, int ndec, int ndigits, + int outformat, LDPARMS * ldp) +{ + long digit; + unsigned short y[NI], t[NI], u[NI], w[NI]; + const unsigned short *p, *r, *ten; + unsigned short sign; + int i, j, k, expon, rndsav, ndigs; + char *s, *ss; + unsigned short m; + unsigned short *equot = ldp->equot; + + ndigs = ndigits; + rndsav = ldp->rndprc; +#ifdef NANS + if (eisnan (x)) + { + sprintf (string, " NaN "); + expon = 9999; + goto bxit; + } +#endif + ldp->rndprc = NBITS; /* set to full precision */ + emov (x, y); /* retain external format */ + if (y[NE - 1] & 0x8000) + { + sign = 0xffff; + y[NE - 1] &= 0x7fff; + } + else + { + sign = 0; + } + expon = 0; + ten = &etens[NTEN][0]; + emov (eone, t); +/* Test for zero exponent */ + if (y[NE - 1] == 0) + { + for (k = 0; k < NE - 1; k++) + { + if (y[k] != 0) + goto tnzro; /* denormalized number */ + } + goto isone; /* legal all zeros */ + } +tnzro: + +/* Test for infinity. + */ + if (y[NE - 1] == 0x7fff) + { + if (sign) + sprintf (string, " -Infinity "); + else + sprintf (string, " Infinity "); + expon = 9999; + goto bxit; + } + +/* Test for exponent nonzero but significand denormalized. + * This is an error condition. + */ + if ((y[NE - 1] != 0) && ((y[NE - 2] & 0x8000) == 0)) + { + mtherr ("etoasc", DOMAIN); + sprintf (string, "NaN"); + expon = 9999; + goto bxit; + } + +/* Compare to 1.0 */ + i = ecmp (eone, y); + if (i == 0) + goto isone; + + if (i < 0) + { /* Number is greater than 1 */ +/* Convert significand to an integer and strip trailing decimal zeros. */ + emov (y, u); + u[NE - 1] = EXONE + NBITS - 1; + + p = &etens[NTEN - 4][0]; + m = 16; + do + { + ediv (p, u, t, ldp); + efloor (t, w, ldp); + for (j = 0; j < NE - 1; j++) + { + if (t[j] != w[j]) + goto noint; + } + emov (t, u); + expon += (int) m; + noint: + p += NE; + m >>= 1; + } + while (m != 0); + +/* Rescale from integer significand */ + u[NE - 1] += y[NE - 1] - (unsigned int) (EXONE + NBITS - 1); + emov (u, y); +/* Find power of 10 */ + emov (eone, t); + m = MAXP; + p = &etens[0][0]; + while (ecmp (ten, u) <= 0) + { + if (ecmp (p, u) <= 0) + { + ediv (p, u, u, ldp); + emul (p, t, t, ldp); + expon += (int) m; + } + m >>= 1; + if (m == 0) + break; + p += NE; + } + } + else + { /* Number is less than 1.0 */ +/* Pad significand with trailing decimal zeros. */ + if (y[NE - 1] == 0) + { + while ((y[NE - 2] & 0x8000) == 0) + { + emul (ten, y, y, ldp); + expon -= 1; + } + } + else + { + emovi (y, w); + for (i = 0; i < ndec + 1; i++) + { + if ((w[NI - 1] & 0x7) != 0) + break; +/* multiply by 10 */ + emovz (w, u); + eshdn1 (u); + eshdn1 (u); + eaddm (w, u); + u[1] += 3; + while (u[2] != 0) + { + eshdn1 (u); + u[1] += 1; + } + if (u[NI - 1] != 0) + break; + if (eone[NE - 1] <= u[1]) + break; + emovz (u, w); + expon -= 1; + } + emovo (w, y, ldp); + } + k = -MAXP; + p = &emtens[0][0]; + r = &etens[0][0]; + emov (y, w); + emov (eone, t); + while (ecmp (eone, w) > 0) + { + if (ecmp (p, w) >= 0) + { + emul (r, w, w, ldp); + emul (r, t, t, ldp); + expon += k; + } + k /= 2; + if (k == 0) + break; + p += NE; + r += NE; + } + ediv (t, eone, t, ldp); + } +isone: +/* Find the first (leading) digit. */ + emovi (t, w); + emovz (w, t); + emovi (y, w); + emovz (w, y); + eiremain (t, y, ldp); + digit = equot[NI - 1]; + while ((digit == 0) && (ecmp (y, ezero) != 0)) + { + eshup1 (y); + emovz (y, u); + eshup1 (u); + eshup1 (u); + eaddm (u, y); + eiremain (t, y, ldp); + digit = equot[NI - 1]; + expon -= 1; + } + s = string; + if (sign) + *s++ = '-'; + else + *s++ = ' '; +/* Examine number of digits requested by caller. */ + if (outformat == 3) + ndigs += expon; +/* +else if( ndigs < 0 ) + ndigs = 0; +*/ + if (ndigs > ndec) + ndigs = ndec; + if (digit == 10) + { + *s++ = '1'; + *s++ = '.'; + if (ndigs > 0) + { + *s++ = '0'; + ndigs -= 1; + } + expon += 1; + if (ndigs < 0) + { + ss = s; + goto doexp; + } + } + else + { + *s++ = (char) digit + '0'; + *s++ = '.'; + } +/* Generate digits after the decimal point. */ + for (k = 0; k <= ndigs; k++) + { +/* multiply current number by 10, without normalizing */ + eshup1 (y); + emovz (y, u); + eshup1 (u); + eshup1 (u); + eaddm (u, y); + eiremain (t, y, ldp); + *s++ = (char) equot[NI - 1] + '0'; + } + digit = equot[NI - 1]; + --s; + ss = s; +/* round off the ASCII string */ + if (digit > 4) + { +/* Test for critical rounding case in ASCII output. */ + if (digit == 5) + { + emovo (y, t, ldp); + if (ecmp (t, ezero) != 0) + goto roun; /* round to nearest */ + if (ndigs < 0 || (*(s - 1 - (*(s - 1) == '.')) & 1) == 0) + goto doexp; /* round to even */ + } +/* Round up and propagate carry-outs */ + roun: + --s; + k = *s & 0x7f; +/* Carry out to most significant digit? */ + if (ndigs < 0) + { + /* This will print like "1E-6". */ + *s = '1'; + expon += 1; + goto doexp; + } + else if (k == '.') + { + --s; + k = *s; + k += 1; + *s = (char) k; +/* Most significant digit carries to 10? */ + if (k > '9') + { + expon += 1; + *s = '1'; + } + goto doexp; + } +/* Round up and carry out from less significant digits */ + k += 1; + *s = (char) k; + if (k > '9') + { + *s = '0'; + goto roun; + } + } +doexp: +#ifdef __GO32__ + if (expon >= 0) + sprintf (ss, "e+%02d", expon); + else + sprintf (ss, "e-%02d", -expon); +#else + sprintf (ss, "E%d", expon); +#endif +bxit: + ldp->rndprc = rndsav; + ldp->outexpon = expon; +} + + +#if 0 /* Broken, unusable implementation of strtold */ + +/* +; ASCTOQ +; ASCTOQ.MAC LATEST REV: 11 JAN 84 +; SLM, 3 JAN 78 +; +; Convert ASCII string to quadruple precision floating point +; +; Numeric input is free field decimal number +; with max of 15 digits with or without +; decimal point entered as ASCII from teletype. +; Entering E after the number followed by a second +; number causes the second number to be interpreted +; as a power of 10 to be multiplied by the first number +; (i.e., "scientific" notation). +; +; Usage: +; asctoq( string, q ); +*/ + +long double +_strtold (char *s, char **se) +{ + union uconv x; + LDPARMS rnd; + LDPARMS *ldp = &rnd; + int lenldstr; + + rnd.rlast = -1; + rnd.rndprc = NBITS; + + lenldstr = asctoeg (s, &x.pe, LDBL_MANT_DIG, ldp); + if (se) + *se = s + lenldstr; + return x.d; +} + +#define REASONABLE_LEN 200 + +static int +asctoeg (char *ss, short unsigned int *y, int oprec, LDPARMS * ldp) +{ + unsigned short yy[NI], xt[NI], tt[NI]; + int esign, decflg, sgnflg, nexp, exp, prec, lost; + int k, trail, c, rndsav; + long lexp; + unsigned short nsign; + const unsigned short *p; + char *sp, *s, *lstr; + int lenldstr; + int mflag = 0; + char tmpstr[REASONABLE_LEN]; + +/* Copy the input string. */ + c = strlen (ss) + 2; + if (c <= REASONABLE_LEN) + lstr = tmpstr; + else + { + lstr = (char *) calloc (c, 1); + mflag = 1; + } + s = ss; + lenldstr = 0; + while (*s == ' ') /* skip leading spaces */ + { + ++s; + ++lenldstr; + } + sp = lstr; + for (k = 0; k < c; k++) + { + if ((*sp++ = *s++) == '\0') + break; + } + *sp = '\0'; + s = lstr; + + rndsav = ldp->rndprc; + ldp->rndprc = NBITS; /* Set to full precision */ + lost = 0; + nsign = 0; + decflg = 0; + sgnflg = 0; + nexp = 0; + exp = 0; + prec = 0; + ecleaz (yy); + trail = 0; + +nxtcom: + k = *s - '0'; + if ((k >= 0) && (k <= 9)) + { +/* Ignore leading zeros */ + if ((prec == 0) && (decflg == 0) && (k == 0)) + goto donchr; +/* Identify and strip trailing zeros after the decimal point. */ + if ((trail == 0) && (decflg != 0)) + { + sp = s; + while ((*sp >= '0') && (*sp <= '9')) + ++sp; +/* Check for syntax error */ + c = *sp & 0x7f; + if ((c != 'e') && (c != 'E') && (c != '\0') + && (c != '\n') && (c != '\r') && (c != ' ') && (c != ',')) + goto error; + --sp; + while (*sp == '0') + *sp-- = 'z'; + trail = 1; + if (*s == 'z') + goto donchr; + } +/* If enough digits were given to more than fill up the yy register, + * continuing until overflow into the high guard word yy[2] + * guarantees that there will be a roundoff bit at the top + * of the low guard word after normalization. + */ + if (yy[2] == 0) + { + if (decflg) + nexp += 1; /* count digits after decimal point */ + eshup1 (yy); /* multiply current number by 10 */ + emovz (yy, xt); + eshup1 (xt); + eshup1 (xt); + eaddm (xt, yy); + ecleaz (xt); + xt[NI - 2] = (unsigned short) k; + eaddm (xt, yy); + } + else + { + /* Mark any lost non-zero digit. */ + lost |= k; + /* Count lost digits before the decimal point. */ + if (decflg == 0) + nexp -= 1; + } + prec += 1; + goto donchr; + } + + switch (*s) + { + case 'z': + break; + case 'E': + case 'e': + goto expnt; + case '.': /* decimal point */ + if (decflg) + goto error; + ++decflg; + break; + case '-': + nsign = 0xffff; + if (sgnflg) + goto error; + ++sgnflg; + break; + case '+': + if (sgnflg) + goto error; + ++sgnflg; + break; + case ',': + case ' ': + case '\0': + case '\n': + case '\r': + goto daldone; + case 'i': + case 'I': + goto infinite; + default: + error: +#ifdef NANS + enan (yy, NI * 16); +#else + mtherr ("asctoe", DOMAIN); + ecleaz (yy); +#endif + goto aexit; + } +donchr: + ++s; + goto nxtcom; + +/* Exponent interpretation */ +expnt: + + esign = 1; + exp = 0; + ++s; +/* check for + or - */ + if (*s == '-') + { + esign = -1; + ++s; + } + if (*s == '+') + ++s; + while ((*s >= '0') && (*s <= '9')) + { + exp *= 10; + exp += *s++ - '0'; + if (exp > 4977) + { + if (esign < 0) + goto zero; + else + goto infinite; + } + } + if (esign < 0) + exp = -exp; + if (exp > 4932) + { + infinite: + ecleaz (yy); + yy[E] = 0x7fff; /* infinity */ + goto aexit; + } + if (exp < -4977) + { + zero: + ecleaz (yy); + goto aexit; + } + +daldone: + nexp = exp - nexp; +/* Pad trailing zeros to minimize power of 10, per IEEE spec. */ + while ((nexp > 0) && (yy[2] == 0)) + { + emovz (yy, xt); + eshup1 (xt); + eshup1 (xt); + eaddm (yy, xt); + eshup1 (xt); + if (xt[2] != 0) + break; + nexp -= 1; + emovz (xt, yy); + } + if ((k = enormlz (yy)) > NBITS) + { + ecleaz (yy); + goto aexit; + } + lexp = (EXONE - 1 + NBITS) - k; + emdnorm (yy, lost, 0, lexp, 64, ldp); +/* convert to external format */ + + +/* Multiply by 10**nexp. If precision is 64 bits, + * the maximum relative error incurred in forming 10**n + * for 0 <= n <= 324 is 8.2e-20, at 10**180. + * For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947. + * For 0 >= n >= -999, it is -1.55e-19 at 10**-435. + */ + lexp = yy[E]; + if (nexp == 0) + { + k = 0; + goto expdon; + } + esign = 1; + if (nexp < 0) + { + nexp = -nexp; + esign = -1; + if (nexp > 4096) + { /* Punt. Can't handle this without 2 divides. */ + emovi (etens[0], tt); + lexp -= tt[E]; + k = edivm (tt, yy, ldp); + lexp += EXONE; + nexp -= 4096; + } + } + p = &etens[NTEN][0]; + emov (eone, xt); + exp = 1; + do + { + if (exp & nexp) + emul (p, xt, xt, ldp); + p -= NE; + exp = exp + exp; + } + while (exp <= MAXP); + + emovi (xt, tt); + if (esign < 0) + { + lexp -= tt[E]; + k = edivm (tt, yy, ldp); + lexp += EXONE; + } + else + { + lexp += tt[E]; + k = emulm (tt, yy, ldp); + lexp -= EXONE - 1; + } + +expdon: + +/* Round and convert directly to the destination type */ + if (oprec == 53) + lexp -= EXONE - 0x3ff; + else if (oprec == 24) + lexp -= EXONE - 0177; +#ifdef DEC + else if (oprec == 56) + lexp -= EXONE - 0201; +#endif + ldp->rndprc = oprec; + emdnorm (yy, k, 0, lexp, 64, ldp); + +aexit: + + ldp->rndprc = rndsav; + yy[0] = nsign; + switch (oprec) + { +#ifdef DEC + case 56: + todec (yy, y); /* see etodec.c */ + break; +#endif +#if LDBL_MANT_DIG == 53 + case 53: + toe53 (yy, y); + break; +#elif LDBL_MANT_DIG == 24 + case 24: + toe24 (yy, y); + break; +#elif LDBL_MANT_DIG == 64 + case 64: + toe64 (yy, y); + break; +#elif LDBL_MANT_DIG == 113 + case 113: + toe113 (yy, y); + break; +#else + case NBITS: + emovo (yy, y, ldp); + break; +#endif + } + lenldstr += s - lstr; + if (mflag) + free (lstr); + return lenldstr; +} + +#endif + +/* y = largest integer not greater than x + * (truncated toward minus infinity) + * + * unsigned short x[NE], y[NE] + * LDPARMS *ldp + * + * efloor( x, y, ldp ); + */ +static const unsigned short bmask[] = { + 0xffff, + 0xfffe, + 0xfffc, + 0xfff8, + 0xfff0, + 0xffe0, + 0xffc0, + 0xff80, + 0xff00, + 0xfe00, + 0xfc00, + 0xf800, + 0xf000, + 0xe000, + 0xc000, + 0x8000, + 0x0000, +}; + +static void +efloor (short unsigned int *x, short unsigned int *y, LDPARMS * ldp) +{ + register unsigned short *p; + int e, expon, i; + unsigned short f[NE]; + + emov (x, f); /* leave in external format */ + expon = (int) f[NE - 1]; + e = (expon & 0x7fff) - (EXONE - 1); + if (e <= 0) + { + eclear (y); + goto isitneg; + } +/* number of bits to clear out */ + e = NBITS - e; + emov (f, y); + if (e <= 0) + return; + + p = &y[0]; + while (e >= 16) + { + *p++ = 0; + e -= 16; + } +/* clear the remaining bits */ + *p &= bmask[e]; +/* truncate negatives toward minus infinity */ +isitneg: + + if ((unsigned short) expon & (unsigned short) 0x8000) + { + for (i = 0; i < NE - 1; i++) + { + if (f[i] != y[i]) + { + esub (eone, y, y, ldp); + break; + } + } + } +} + + + +static void +eiremain (short unsigned int *den, short unsigned int *num, LDPARMS * ldp) +{ + long ld, ln; + unsigned short j; + unsigned short *equot = ldp->equot; + + ld = den[E]; + ld -= enormlz (den); + ln = num[E]; + ln -= enormlz (num); + ecleaz (equot); + while (ln >= ld) + { + if (ecmpm (den, num) <= 0) + { + esubm (den, num); + j = 1; + } + else + { + j = 0; + } + eshup1 (equot); + equot[NI - 1] |= j; + eshup1 (num); + ln -= 1; + } + emdnorm (num, 0, 0, ln, 0, ldp); +} + +/* NaN bit patterns + */ +#ifdef MIEEE +#if !defined(__mips) +static const unsigned short nan113[8] = { + 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + +static const unsigned short nan64[6] = { + 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; +static const unsigned short nan53[4] = { 0x7fff, 0xffff, 0xffff, 0xffff }; +static const unsigned short nan24[2] = { 0x7fff, 0xffff }; +#elif defined(__mips_nan2008) /* __mips */ +static const unsigned short nan113[8] = { 0x7fff, 0x8000, 0, 0, 0, 0, 0, 0 }; +static const unsigned short nan64[6] = { 0x7fff, 0xc000, 0, 0, 0, 0 }; +static const unsigned short nan53[4] = { 0x7ff8, 0, 0, 0 }; +static const unsigned short nan24[2] = { 0x7fc0, 0 }; +#else /* __mips && !__mips_nan2008 */ +static const unsigned short nan113[8] = { + 0x7fff, 0x7fff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff +}; + +static const unsigned short nan64[6] = { + 0x7fff, 0xbfff, 0xffff, 0xffff, 0xffff, 0xffff +}; +static const unsigned short nan53[4] = { 0x7ff7, 0xffff, 0xffff, 0xffff }; +static const unsigned short nan24[2] = { 0x7fbf, 0xffff }; +#endif /* __mips && !__mips_nan2008 */ +#else /* !MIEEE */ +#if !defined(__mips) || defined(__mips_nan2008) +static const unsigned short nan113[8] = { 0, 0, 0, 0, 0, 0, 0x8000, 0x7fff }; +static const unsigned short nan64[6] = { 0, 0, 0, 0, 0xc000, 0x7fff }; +static const unsigned short nan53[4] = { 0, 0, 0, 0x7ff8 }; +static const unsigned short nan24[2] = { 0, 0x7fc0 }; +#else /* __mips && !__mips_nan2008 */ +static const unsigned short nan113[8] = { + 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x7fff, 0x7fff +}; + +static const unsigned short nan64[6] = { + 0xffff, 0xffff, 0xffff, 0xffff, 0xbfff, 0x7fff +}; +static const unsigned short nan53[4] = { 0xffff, 0xffff, 0xffff, 0x7ff7 }; +static const unsigned short nan24[2] = { 0xffff, 0x7fbf }; +#endif /* __mips && !__mips_nan2008 */ +#endif /* !MIEEE */ + + +static void +enan (short unsigned int *nan, int size) +{ + int i, n; + const unsigned short *p; + + switch (size) + { +#ifndef DEC + case 113: + n = 8; + p = nan113; + break; + + case 64: + n = 6; + p = nan64; + break; + + case 53: + n = 4; + p = nan53; + break; + + case 24: + n = 2; + p = nan24; + break; + + case NBITS: +#if !defined(__mips) || defined(__mips_nan2008) + for (i = 0; i < NE - 2; i++) + *nan++ = 0; + *nan++ = 0xc000; +#else /* __mips && !__mips_nan2008 */ + for (i = 0; i < NE - 2; i++) + *nan++ = 0xffff; + *nan++ = 0xbfff; +#endif /* __mips && !__mips_nan2008 */ + *nan++ = 0x7fff; + return; + + case NI * 16: + *nan++ = 0; + *nan++ = 0x7fff; + *nan++ = 0; +#if !defined(__mips) || defined(__mips_nan2008) + *nan++ = 0xc000; + for (i = 4; i < NI - 1; i++) + *nan++ = 0; +#else /* __mips && !__mips_nan2008 */ + *nan++ = 0xbfff; + for (i = 4; i < NI - 1; i++) + *nan++ = 0xffff; +#endif /* __mips && !__mips_nan2008 */ + *nan++ = 0; + return; +#endif + default: + mtherr ("enan", DOMAIN); + return; + } + for (i = 0; i < n; i++) + *nan++ = *p++; +} + +#endif /* !_USE_GDTOA */ diff --git a/lib/stdlib/llabs.c b/lib/stdlib/llabs.c new file mode 100644 index 0000000..a020dea --- /dev/null +++ b/lib/stdlib/llabs.c @@ -0,0 +1,60 @@ +/* +FUNCTION +<>---compute the absolute value of an long long integer. + +INDEX + llabs + +SYNOPSIS + #include + long long llabs(long long <[j]>); + +DESCRIPTION +The <> function computes the absolute value of the long long integer +argument <[j]> (also called the magnitude of <[j]>). + +The similar function <> uses and returns <> rather than +<> values. + +RETURNS +A nonnegative long long integer. + +PORTABILITY +<> is ISO 9899 (C99) compatable. + +No supporting OS subroutines are required. +*/ + +/*- + * Copyright (c) 2001 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +long long +llabs (long long j) +{ + return (j < 0 ? -j : j); +} diff --git a/lib/stdlib/lldiv.c b/lib/stdlib/lldiv.c new file mode 100644 index 0000000..2dadf0e --- /dev/null +++ b/lib/stdlib/lldiv.c @@ -0,0 +1,109 @@ +/* +FUNCTION +<>---divide two long long integers + +INDEX + lldiv + +SYNOPSIS + #include + lldiv_t lldiv(long long <[n]>, long long <[d]>); + +DESCRIPTION +Divide +@tex +$n/d$, +@end tex +@ifnottex +<[n]>/<[d]>, +@end ifnottex +returning quotient and remainder as two long long integers in a structure +<>. + +RETURNS +The result is represented with the structure + +. typedef struct +. { +. long long quot; +. long long rem; +. } lldiv_t; + +where the <> field represents the quotient, and <> the +remainder. For nonzero <[d]>, if `<<<[r]> = ldiv(<[n]>,<[d]>);>>' then +<[n]> equals `<<<[r]>.rem + <[d]>*<[r]>.quot>>'. + +To divide <> rather than <> values, use the similar +function <>. + +PORTABILITY +<> is ISO 9899 (C99) compatable. + +No supporting OS subroutines are required. +*/ + +/*- + * Copyright (c) 2001 Mike Barcroft + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +/* + * The ANSI standard says that |r.quot| <= |n/d|, where + * n/d is to be computed in infinite precision. In other + * words, we should always truncate the quotient towards + * 0, never -infinity. + * + * Machine division and remainer may work either way when + * one or both of n or d is negative. If only one is + * negative and r.quot has been truncated towards -inf, + * r.rem will have the same sign as denom and the opposite + * sign of num; if both are negative and r.quot has been + * truncated towards -inf, r.rem will be positive (will + * have the opposite sign of num). These are considered + * `wrong'. + * + * If both are num and denom are positive, r will always + * be positive. + * + * This all boils down to: + * if num >= 0, but r.rem < 0, we got the wrong answer. + * In that case, to get the right answer, add 1 to r.quot and + * subtract denom from r.rem. + */ +lldiv_t +lldiv (long long numer, long long denom) +{ + lldiv_t retval; + + retval.quot = numer / denom; + retval.rem = numer % denom; + if (numer >= 0 && retval.rem < 0) { + retval.quot++; + retval.rem -= denom; + } + return (retval); +} + diff --git a/lib/stdlib/local.h b/lib/stdlib/local.h new file mode 100644 index 0000000..26fd4f0 --- /dev/null +++ b/lib/stdlib/local.h @@ -0,0 +1,65 @@ +/* Misc. local definitions for libc/stdlib */ + +#ifndef _LOCAL_H_ +#define _LOCAL_H_ + +char * _gcvt (struct _reent *, double , int , char *, char, int); + +#include "../locale/setlocale.h" + +#ifndef __machine_mbstate_t_defined +#include +#endif + +typedef int wctomb_f (struct _reent *, char *, wchar_t, mbstate_t *); +typedef wctomb_f *wctomb_p; + +wctomb_f __ascii_wctomb; +#ifdef _MB_CAPABLE +wctomb_f __utf8_wctomb; +wctomb_f __sjis_wctomb; +wctomb_f __eucjp_wctomb; +wctomb_f __jis_wctomb; +wctomb_p __iso_wctomb (int val); +wctomb_p __cp_wctomb (int val); +#ifdef __CYGWIN__ +wctomb_f __gbk_wctomb; +wctomb_f __gb18030_wctomb; +wctomb_f __kr_wctomb; +wctomb_f __big5_wctomb; +#endif +#endif + +#define __WCTOMB (__get_current_locale ()->wctomb) + +typedef int mbtowc_f (struct _reent *, wchar_t *, const char *, size_t, + mbstate_t *); +typedef mbtowc_f *mbtowc_p; + +mbtowc_f __ascii_mbtowc; +#ifdef _MB_CAPABLE +mbtowc_f __utf8_mbtowc; +mbtowc_f __sjis_mbtowc; +mbtowc_f __eucjp_mbtowc; +mbtowc_f __jis_mbtowc; +mbtowc_p __iso_mbtowc (int val); +mbtowc_p __cp_mbtowc (int val); +#ifdef __CYGWIN__ +mbtowc_f __gbk_mbtowc; +mbtowc_f __gb18030_mbtowc; +mbtowc_f __kr_mbtowc; +mbtowc_f __big5_mbtowc; +#endif +#endif + +#define __MBTOWC (__get_current_locale ()->mbtowc) + +extern wchar_t __iso_8859_conv[14][0x60]; +int __iso_8859_val_index (int); +int __iso_8859_index (const char *); + +extern wchar_t __cp_conv[][0x80]; +int __cp_val_index (int); +int __cp_index (const char *); + +#endif diff --git a/lib/stdlib/lrand48.c b/lib/stdlib/lrand48.c new file mode 100644 index 0000000..a28284e --- /dev/null +++ b/lib/stdlib/lrand48.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +long +_lrand48_r (struct _reent *r) +{ + _REENT_CHECK_RAND48(r); + __dorand48(r, __rand48_seed); + return (long)((unsigned long) __rand48_seed[2] << 15) + + ((unsigned long) __rand48_seed[1] >> 1); +} + +#ifndef _REENT_ONLY +long +lrand48 (void) +{ + return _lrand48_r (_REENT); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/malign.c b/lib/stdlib/malign.c new file mode 100644 index 0000000..480060c --- /dev/null +++ b/lib/stdlib/malign.c @@ -0,0 +1,19 @@ +#ifndef MALLOC_PROVIDED +/* malign.c -- a wrapper for memalign_r. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +void * +memalign (size_t align, + size_t nbytes) +{ + return _memalign_r (_REENT, align, nbytes); +} + +#endif +#endif diff --git a/lib/stdlib/malignr.c b/lib/stdlib/malignr.c new file mode 100644 index 0000000..c48fbad --- /dev/null +++ b/lib/stdlib/malignr.c @@ -0,0 +1,2 @@ +#define DEFINE_MEMALIGN +#include "_mallocr.c" diff --git a/lib/stdlib/mallinfor.c b/lib/stdlib/mallinfor.c new file mode 100644 index 0000000..dc1a55d --- /dev/null +++ b/lib/stdlib/mallinfor.c @@ -0,0 +1,2 @@ +#define DEFINE_MALLINFO +#include "_mallocr.c" diff --git a/lib/stdlib/malloc.c b/lib/stdlib/malloc.c new file mode 100644 index 0000000..f5ac292 --- /dev/null +++ b/lib/stdlib/malloc.c @@ -0,0 +1,175 @@ +/* VxWorks provides its own version of malloc, and we can't use this + one because VxWorks does not provide sbrk. So we have a hook to + not compile this code. */ + +/* The routines here are simple cover fns to the routines that do the real + work (the reentrant versions). */ +/* FIXME: Does the warning below (see WARNINGS) about non-reentrancy still + apply? A first guess would be "no", but how about reentrancy in the *same* + thread? */ + +#ifdef MALLOC_PROVIDED + +int _dummy_malloc = 1; + +#else + +/* +FUNCTION +<>, <>, <>---manage memory + +INDEX + malloc +INDEX + realloc +INDEX + reallocf +INDEX + free +INDEX + memalign +INDEX + malloc_usable_size +INDEX + _malloc_r +INDEX + _realloc_r +INDEX + _reallocf_r +INDEX + _free_r +INDEX + _memalign_r +INDEX + _malloc_usable_size_r + +SYNOPSIS + #include + void *malloc(size_t <[nbytes]>); + void *realloc(void *<[aptr]>, size_t <[nbytes]>); + void *reallocf(void *<[aptr]>, size_t <[nbytes]>); + void free(void *<[aptr]>); + + void *memalign(size_t <[align]>, size_t <[nbytes]>); + + size_t malloc_usable_size(void *<[aptr]>); + + void *_malloc_r(void *<[reent]>, size_t <[nbytes]>); + void *_realloc_r(void *<[reent]>, + void *<[aptr]>, size_t <[nbytes]>); + void *_reallocf_r(void *<[reent]>, + void *<[aptr]>, size_t <[nbytes]>); + void _free_r(void *<[reent]>, void *<[aptr]>); + + void *_memalign_r(void *<[reent]>, + size_t <[align]>, size_t <[nbytes]>); + + size_t _malloc_usable_size_r(void *<[reent]>, void *<[aptr]>); + +DESCRIPTION +These functions manage a pool of system memory. + +Use <> to request allocation of an object with at least +<[nbytes]> bytes of storage available. If the space is available, +<> returns a pointer to a newly allocated block as its result. + +If you already have a block of storage allocated by <>, but +you no longer need all the space allocated to it, you can make it +smaller by calling <> with both the object pointer and the +new desired size as arguments. <> guarantees that the +contents of the smaller object match the beginning of the original object. + +Similarly, if you need more space for an object, use <> to +request the larger size; again, <> guarantees that the +beginning of the new, larger object matches the contents of the +original object. + +When you no longer need an object originally allocated by <> +or <> (or the related function <>), return it to the +memory storage pool by calling <> with the address of the object +as the argument. You can also use <> for this purpose by +calling it with <<0>> as the <[nbytes]> argument. + +The <> function behaves just like <> except if the +function is required to allocate new storage and this fails. In this +case <> will free the original object passed in whereas +<> will not. + +The <> function returns a block of size <[nbytes]> aligned +to a <[align]> boundary. The <[align]> argument must be a power of +two. + +The <> function takes a pointer to a block +allocated by <>. It returns the amount of space that is +available in the block. This may or may not be more than the size +requested from <>, due to alignment or minimum size +constraints. + +The alternate functions <<_malloc_r>>, <<_realloc_r>>, <<_reallocf_r>>, +<<_free_r>>, <<_memalign_r>>, and <<_malloc_usable_size_r>> are reentrant +versions. The extra argument <[reent]> is a pointer to a reentrancy structure. + +If you have multiple threads of execution which may call any of these +routines, or if any of these routines may be called reentrantly, then +you must provide implementations of the <<__malloc_lock>> and +<<__malloc_unlock>> functions for your system. See the documentation +for those functions. + +These functions operate by calling the function <<_sbrk_r>> or +<>, which allocates space. You may need to provide one of these +functions for your system. <<_sbrk_r>> is called with a positive +value to allocate more space, and with a negative value to release +previously allocated space if it is no longer required. +@xref{Stubs}. + +RETURNS +<> returns a pointer to the newly allocated space, if +successful; otherwise it returns <>. If your application needs +to generate empty objects, you may use <> for this purpose. + +<> returns a pointer to the new block of memory, or <> +if a new block could not be allocated. <> is also the result +when you use `<,0)>>' (which has the same effect as +`<)>>'). You should always check the result of +<>; successful reallocation is not guaranteed even when +you request a smaller object. + +<> does not return a result. + +<> returns a pointer to the newly allocated space. + +<> returns the usable size. + +PORTABILITY +<>, <>, and <> are specified by the ANSI C +standard, but other conforming implementations of <> may +behave differently when <[nbytes]> is zero. + +<> is part of SVR4. + +<> is not portable. + +Supporting OS subroutines required: <>. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +void * +malloc (size_t nbytes) /* get a block */ +{ + return _malloc_r (_REENT, nbytes); +} + +void +free (void *aptr) +{ + _free_r (_REENT, aptr); +} + +#endif + +#endif /* ! defined (MALLOC_PROVIDED) */ diff --git a/lib/stdlib/mallocr.c b/lib/stdlib/mallocr.c new file mode 100644 index 0000000..c2ab1ca --- /dev/null +++ b/lib/stdlib/mallocr.c @@ -0,0 +1,2 @@ +#define DEFINE_MALLOC +#include "_mallocr.c" diff --git a/lib/stdlib/malloptr.c b/lib/stdlib/malloptr.c new file mode 100644 index 0000000..f67be24 --- /dev/null +++ b/lib/stdlib/malloptr.c @@ -0,0 +1,2 @@ +#define DEFINE_MALLOPT +#include "_mallocr.c" diff --git a/lib/stdlib/mallstatsr.c b/lib/stdlib/mallstatsr.c new file mode 100644 index 0000000..15cd737 --- /dev/null +++ b/lib/stdlib/mallstatsr.c @@ -0,0 +1,2 @@ +#define DEFINE_MALLOC_STATS +#include "_mallocr.c" diff --git a/lib/stdlib/mbctype.h b/lib/stdlib/mbctype.h new file mode 100644 index 0000000..359c83c --- /dev/null +++ b/lib/stdlib/mbctype.h @@ -0,0 +1,21 @@ +#ifndef _MBCTYPE_H_ + +#define _MBCTYPE_H_ + +/* escape character used for JIS encoding */ +#define ESC_CHAR 0x1b + +/* functions used to support SHIFT_JIS, EUC-JP, and JIS multibyte encodings */ + +int _issjis1 (int c); +int _issjis2 (int c); +int _iseucjp (int c); +int _isjis (int c); + +#define _issjis1(c) (((c) >= 0x81 && (c) <= 0x9f) || ((c) >= 0xe0 && (c) <= 0xef)) +#define _issjis2(c) (((c) >= 0x40 && (c) <= 0x7e) || ((c) >= 0x80 && (c) <= 0xfc)) +#define _iseucjp1(c) ((c) == 0x8e || (c) == 0x8f || ((c) >= 0xa1 && (c) <= 0xfe)) +#define _iseucjp2(c) ((c) >= 0xa1 && (c) <= 0xfe) +#define _isjis(c) ((c) >= 0x21 && (c) <= 0x7e) + +#endif /* _MBCTYPE_H_ */ diff --git a/lib/stdlib/mblen.c b/lib/stdlib/mblen.c new file mode 100644 index 0000000..24df615 --- /dev/null +++ b/lib/stdlib/mblen.c @@ -0,0 +1,78 @@ +/* +FUNCTION +<>---minimal multibyte length function + +INDEX + mblen + +SYNOPSIS + #include + int mblen(const char *<[s]>, size_t <[n]>); + +DESCRIPTION +When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming +implementation of <>. In this case, the +only ``multi-byte character sequences'' recognized are single bytes, +and thus <<1>> is returned unless <[s]> is the null pointer or +has a length of 0 or is the empty string. + +When _MB_CAPABLE is defined, this routine calls <<_mbtowc_r>> to perform +the conversion, passing a state variable to allow state dependent +decoding. The result is based on the locale setting which may +be restricted to a defined set of locales. + +RETURNS +This implementation of <> returns <<0>> if +<[s]> is <> or the empty string; it returns <<1>> if not _MB_CAPABLE or +the character is a single-byte character; it returns <<-1>> +if the multi-byte character is invalid; otherwise it returns +the number of bytes in the multibyte character. + +PORTABILITY +<> is required in the ANSI C standard. However, the precise +effects vary with the locale. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include +#include +#include "local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_mblen_state; +#endif + +int +mblen (const char *s, + size_t n) +{ +#ifdef _MB_CAPABLE + int retval = 0; + struct _reent *reent = _REENT; + mbstate_t *state; + + _REENT_CHECK_MISC(reent); + state = &(_REENT_MBLEN_STATE(reent)); + retval = __MBTOWC (reent, NULL, s, n, state); + if (retval < 0) + { + state->__count = 0; + return -1; + } + else + return retval; + +#else /* not _MB_CAPABLE */ + if (s == NULL || *s == '\0') + return 0; + if (n == 0) + return -1; + return 1; +#endif /* not _MB_CAPABLE */ +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/mblen_r.c b/lib/stdlib/mblen_r.c new file mode 100644 index 0000000..ff17370 --- /dev/null +++ b/lib/stdlib/mblen_r.c @@ -0,0 +1,68 @@ +/* +FUNCTION +<<_mblen_r>>---reentrant minimal multibyte length function + +INDEX + _mblen_r + +SYNOPSIS + #include + int _mblen_r(struct _reent *<[r]>, const char *<[s]>, size_t <[n]>, int *<[state]>); + +DESCRIPTION +When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming +implementation of <<_mblen_r>>. In this case, the +only ``multi-byte character sequences'' recognized are single bytes, +and thus <<1>> is returned unless <[s]> is the null pointer or +has a length of 0 or is the empty string. + +When _MB_CAPABLE is defined, this routine calls <<_mbtowc_r>> to perform +the conversion, passing a state variable to allow state dependent +decoding. The result is based on the locale setting which may +be restricted to a defined set of locales. + +RETURNS +This implementation of <<_mblen_r>> returns <<0>> if +<[s]> is <> or the empty string; it returns <<1>> if not _MB_CAPABLE or +the character is a single-byte character; it returns <<-1>> +if the multi-byte character is invalid; otherwise it returns +the number of bytes in the multibyte character. + +PORTABILITY +<<_mblen>> is required in the ANSI C standard. However, the precise +effects vary with the locale. + +<<_mblen_r>> requires no supporting OS subroutines. +*/ + +#include +#include +#include +#include "local.h" + +int +_mblen_r (struct _reent *r, + const char *s, + size_t n, + mbstate_t *state) +{ +#ifdef _MB_CAPABLE + int retval; + retval = __MBTOWC (r, NULL, s, n, state); + + if (retval < 0) + { + state->__count = 0; + return -1; + } + + return retval; +#else /* not _MB_CAPABLE */ + if (s == NULL || *s == '\0') + return 0; + if (n == 0) + return -1; + return 1; +#endif /* not _MB_CAPABLE */ +} + diff --git a/lib/stdlib/mbrlen.c b/lib/stdlib/mbrlen.c new file mode 100644 index 0000000..39e175e --- /dev/null +++ b/lib/stdlib/mbrlen.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_mbrlen_state; +#endif + +size_t +mbrlen(const char *__restrict s, size_t n, mbstate_t *__restrict ps) +{ +#ifdef _MB_CAPABLE + if (ps == NULL) + { + struct _reent *reent = _REENT; + + _REENT_CHECK_MISC(reent); + ps = &(_REENT_MBRLEN_STATE(reent)); + } +#endif + + return mbrtowc(NULL, s, n, ps); +} diff --git a/lib/stdlib/mbrtowc.c b/lib/stdlib/mbrtowc.c new file mode 100644 index 0000000..e641b8c --- /dev/null +++ b/lib/stdlib/mbrtowc.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include +#include +#include +#include "local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_mbrtowc_state; +#endif + +size_t +_mbrtowc_r (struct _reent *ptr, + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *ps) +{ + int retval = 0; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(ptr); + ps = &(_REENT_MBRTOWC_STATE(ptr)); + } +#endif + + if (s == NULL) + retval = __MBTOWC (ptr, NULL, "", 1, ps); + else + retval = __MBTOWC (ptr, pwc, s, n, ps); + + if (retval == -1) + { + ps->__count = 0; + _REENT_ERRNO(ptr) = EILSEQ; + return (size_t)(-1); + } + else + return (size_t)retval; +} + +#ifndef _REENT_ONLY +size_t +mbrtowc (wchar_t *__restrict pwc, + const char *__restrict s, + size_t n, + mbstate_t *__restrict ps) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + return _mbrtowc_r (_REENT, pwc, s, n, ps); +#else + int retval = 0; + struct _reent *reent = _REENT; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(reent); + ps = &(_REENT_MBRTOWC_STATE(reent)); + } +#endif + + if (s == NULL) + retval = __MBTOWC (reent, NULL, "", 1, ps); + else + retval = __MBTOWC (reent, pwc, s, n, ps); + + if (retval == -1) + { + ps->__count = 0; + _REENT_ERRNO(reent) = EILSEQ; + return (size_t)(-1); + } + else + return (size_t)retval; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/mbsinit.c b/lib/stdlib/mbsinit.c new file mode 100644 index 0000000..e32369a --- /dev/null +++ b/lib/stdlib/mbsinit.c @@ -0,0 +1,14 @@ +#include +#include +#include +#include +#include + +int +mbsinit(const mbstate_t *ps) +{ + if (ps == NULL || ps->__count == 0) + return 1; + else + return 0; +} diff --git a/lib/stdlib/mbsnrtowcs.c b/lib/stdlib/mbsnrtowcs.c new file mode 100644 index 0000000..2effc50 --- /dev/null +++ b/lib/stdlib/mbsnrtowcs.c @@ -0,0 +1,151 @@ +/* +FUNCTION +<>, <>---convert a character string to a wide-character string + +INDEX + mbsrtowcs +INDEX + _mbsrtowcs_r +INDEX + mbsnrtowcs +INDEX + _mbsnrtowcs_r + +SYNOPSIS + #include + size_t mbsrtowcs(wchar_t *__restrict <[dst]>, + const char **__restrict <[src]>, + size_t <[len]>, + mbstate_t *__restrict <[ps]>); + + #include + size_t _mbsrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>, + const char **<[src]>, size_t <[len]>, + mbstate_t *<[ps]>); + + #include + size_t mbsnrtowcs(wchar_t *__ restrict <[dst]>, + const char **__restrict <[src]>, size_t <[nms]>, + size_t <[len]>, mbstate_t *__restrict <[ps]>); + + #include + size_t _mbsnrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>, + const char **<[src]>, size_t <[nms]>, + size_t <[len]>, mbstate_t *<[ps]>); + +DESCRIPTION +The <> function converts a sequence of multibyte characters +pointed to indirectly by <[src]> into a sequence of corresponding wide +characters and stores at most <[len]> of them in the wchar_t array pointed +to by <[dst]>, until it encounters a terminating null character ('\0'). + +If <[dst]> is NULL, no characters are stored. + +If <[dst]> is not NULL, the pointer pointed to by <[src]> is updated to point +to the character after the one that conversion stopped at. If conversion +stops because a null character is encountered, *<[src]> is set to NULL. + +The mbstate_t argument, <[ps]>, is used to keep track of the shift state. If +it is NULL, <> uses an internal, static mbstate_t object, which +is initialized to the initial conversion state at program startup. + +The <> function behaves identically to <>, except that +conversion stops after reading at most <[nms]> bytes from the buffer pointed +to by <[src]>. + +RETURNS +The <> and <> functions return the number of wide +characters stored in the array pointed to by <[dst]> if successful, otherwise +it returns (size_t)-1. + +PORTABILITY +<> is defined by the C99 standard. +<> is defined by the POSIX.1-2008 standard. +*/ + +#include +#include +#include +#include +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_mbsrtowcs_state; +#endif + +size_t +_mbsnrtowcs_r (struct _reent *r, + wchar_t *dst, + const char **src, + size_t nms, + size_t len, + mbstate_t *ps) +{ + wchar_t *ptr = dst; + const char *tmp_src; + size_t max; + size_t count = 0; + int bytes; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(r); + ps = &(_REENT_MBSRTOWCS_STATE(r)); + } +#endif + + if (dst == NULL) + { + /* Ignore original len value and do not alter src pointer if the + dst pointer is NULL. */ + len = (size_t)-1; + tmp_src = *src; + src = &tmp_src; + } + + max = len; + while (len > 0) + { + bytes = _mbrtowc_r (r, ptr, *src, nms, ps); + if (bytes > 0) + { + *src += bytes; + nms -= bytes; + ++count; + ptr = (dst == NULL) ? NULL : ptr + 1; + --len; + } + else if (bytes == -2) + { + *src += nms; + return count; + } + else if (bytes == 0) + { + *src = NULL; + return count; + } + else + { + ps->__count = 0; + _REENT_ERRNO(r) = EILSEQ; + return (size_t)-1; + } + } + + return (size_t)max; +} + +#ifndef _REENT_ONLY +size_t +mbsnrtowcs (wchar_t *__restrict dst, + const char **__restrict src, + size_t nms, + size_t len, + mbstate_t *__restrict ps) +{ + return _mbsnrtowcs_r (_REENT, dst, src, nms, len, ps); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/mbsrtowcs.c b/lib/stdlib/mbsrtowcs.c new file mode 100644 index 0000000..82589c6 --- /dev/null +++ b/lib/stdlib/mbsrtowcs.c @@ -0,0 +1,29 @@ +/* doc in mbsnrtowcs.c */ + +#include +#include +#include +#include +#include +#include + +size_t +_mbsrtowcs_r (struct _reent *r, + wchar_t *dst, + const char **src, + size_t len, + mbstate_t *ps) +{ + return _mbsnrtowcs_r (r, dst, src, (size_t) -1, len, ps); +} + +#ifndef _REENT_ONLY +size_t +mbsrtowcs (wchar_t *__restrict dst, + const char **__restrict src, + size_t len, + mbstate_t *__restrict ps) +{ + return _mbsnrtowcs_r (_REENT, dst, src, (size_t) -1, len, ps); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/mbstowcs.c b/lib/stdlib/mbstowcs.c new file mode 100644 index 0000000..253059c --- /dev/null +++ b/lib/stdlib/mbstowcs.c @@ -0,0 +1,75 @@ +/* +FUNCTION +<>---minimal multibyte string to wide char converter + +INDEX + mbstowcs + +SYNOPSIS + #include + int mbstowcs(wchar_t *restrict <[pwc]>, const char *restrict <[s]>, size_t <[n]>); + +DESCRIPTION +When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming +implementation of <>. In this case, the +only ``multi-byte character sequences'' recognized are single bytes, +and they are ``converted'' to wide-char versions simply by byte +extension. + +When _MB_CAPABLE is defined, this routine calls <<_mbstowcs_r>> to perform +the conversion, passing a state variable to allow state dependent +decoding. The result is based on the locale setting which may +be restricted to a defined set of locales. + +RETURNS +This implementation of <> returns <<0>> if +<[s]> is <> or is the empty string; +it returns <<-1>> if _MB_CAPABLE and one of the +multi-byte characters is invalid or incomplete; +otherwise it returns the minimum of: <> or the +number of multi-byte characters in <> plus 1 (to +compensate for the nul character). +If the return value is -1, the state of the <> string is +indeterminate. If the input has a length of 0, the output +string will be modified to contain a wchar_t nul terminator. + +PORTABILITY +<> is required in the ANSI C standard. However, the precise +effects vary with the locale. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include +#include + +size_t +mbstowcs (wchar_t *__restrict pwcs, + const char *__restrict s, + size_t n) +{ +#ifdef _MB_CAPABLE + mbstate_t state; + state.__count = 0; + + return _mbstowcs_r (_REENT, pwcs, s, n, &state); +#else /* not _MB_CAPABLE */ + + int count = 0; + + if (n != 0) { + do { + if ((*pwcs++ = (wchar_t) *s++) == 0) + break; + count++; + } while (--n != 0); + } + + return count; +#endif /* not _MB_CAPABLE */ +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/mbstowcs_r.c b/lib/stdlib/mbstowcs_r.c new file mode 100644 index 0000000..43aea2c --- /dev/null +++ b/lib/stdlib/mbstowcs_r.c @@ -0,0 +1,37 @@ +#include +#include +#include "local.h" + +size_t +_mbstowcs_r (struct _reent *r, + wchar_t *__restrict pwcs, + const char *__restrict s, + size_t n, + mbstate_t *state) +{ + size_t ret = 0; + char *t = (char *)s; + int bytes; + + if (!pwcs) + n = (size_t) 1; /* Value doesn't matter as long as it's not 0. */ + while (n > 0) + { + bytes = __MBTOWC (r, pwcs, t, MB_CUR_MAX, state); + if (bytes < 0) + { + state->__count = 0; + return -1; + } + else if (bytes == 0) + break; + t += bytes; + ++ret; + if (pwcs) + { + ++pwcs; + --n; + } + } + return ret; +} diff --git a/lib/stdlib/mbtowc.c b/lib/stdlib/mbtowc.c new file mode 100644 index 0000000..fbd8df6 --- /dev/null +++ b/lib/stdlib/mbtowc.c @@ -0,0 +1,92 @@ +/* +FUNCTION +<>---minimal multibyte to wide char converter + +INDEX + mbtowc + +SYNOPSIS + #include + int mbtowc(wchar_t *restrict <[pwc]>, const char *restrict <[s]>, size_t <[n]>); + +DESCRIPTION +When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming +implementation of <>. In this case, +only ``multi-byte character sequences'' recognized are single bytes, +and they are ``converted'' to themselves. +Each call to <> copies one character from <<*<[s]>>> to +<<*<[pwc]>>>, unless <[s]> is a null pointer. The argument n +is ignored. + +When _MB_CAPABLE is defined, this routine calls <<_mbtowc_r>> to perform +the conversion, passing a state variable to allow state dependent +decoding. The result is based on the locale setting which may +be restricted to a defined set of locales. + +RETURNS +This implementation of <> returns <<0>> if +<[s]> is <> or is the empty string; +it returns <<1>> if not _MB_CAPABLE or +the character is a single-byte character; it returns <<-1>> +if n is <<0>> or the multi-byte character is invalid; +otherwise it returns the number of bytes in the multibyte character. +If the return value is -1, no changes are made to the <> +output string. If the input is the empty string, a wchar_t nul +is placed in the output string and 0 is returned. If the input +has a length of 0, no changes are made to the <> output string. + +PORTABILITY +<> is required in the ANSI C standard. However, the precise +effects vary with the locale. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include +#include +#include "local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_mbtowc_state; +#endif + +int +mbtowc (wchar_t *__restrict pwc, + const char *__restrict s, + size_t n) +{ +#ifdef _MB_CAPABLE + int retval = 0; + struct _reent *reent = _REENT; + mbstate_t *ps; + + _REENT_CHECK_MISC(reent); + ps = &(_REENT_MBTOWC_STATE(reent)); + + retval = __MBTOWC (reent, pwc, s, n, ps); + + if (retval < 0) + { + ps->__count = 0; + return -1; + } + return retval; +#else /* not _MB_CAPABLE */ + if (s == NULL) + return 0; + if (n == 0) + return -1; + if (pwc) + *pwc = (wchar_t) *s; + return (*s != '\0'); +#endif /* not _MB_CAPABLE */ +} + +#endif /* !_REENT_ONLY */ + + + + diff --git a/lib/stdlib/mbtowc_r.c b/lib/stdlib/mbtowc_r.c new file mode 100644 index 0000000..01e596d --- /dev/null +++ b/lib/stdlib/mbtowc_r.c @@ -0,0 +1,976 @@ +#include +#include +#include +#include "mbctype.h" +#include +#include +#include +#include "local.h" + +int +_mbtowc_r (struct _reent *r, + wchar_t *__restrict pwc, + const char *__restrict s, + size_t n, + mbstate_t *state) +{ + return __MBTOWC (r, pwc, s, n, state); +} + +int +__ascii_mbtowc (struct _reent *r, + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + return 0; + + if (n == 0) + return -2; + +#ifdef __CYGWIN__ + if ((wchar_t)*t >= 0x80) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } +#endif + + *pwc = (wchar_t)*t; + + if (*t == '\0') + return 0; + + return 1; +} + +#ifdef _MB_CAPABLE +typedef enum __packed { ESCAPE, DOLLAR, BRACKET, AT, B, J, + NUL, JIS_CHAR, OTHER, JIS_C_NUM } JIS_CHAR_TYPE; +typedef enum __packed { ASCII, JIS, A_ESC, A_ESC_DL, JIS_1, J_ESC, J_ESC_BR, + INV, JIS_S_NUM } JIS_STATE; +typedef enum __packed { COPY_A, COPY_J1, COPY_J2, MAKE_A, NOOP, EMPTY, ERROR } JIS_ACTION; + +/************************************************************************************** + * state/action tables for processing JIS encoding + * Where possible, switches to JIS are grouped with proceding JIS characters and switches + * to ASCII are grouped with preceding JIS characters. Thus, maximum returned length + * is 2 (switch to JIS) + 2 (JIS characters) + 2 (switch back to ASCII) = 6. + *************************************************************************************/ + +#ifndef __CYGWIN__ +static JIS_STATE JIS_state_table[JIS_S_NUM][JIS_C_NUM] = { +/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER */ +/* ASCII */ { A_ESC, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII }, +/* JIS */ { J_ESC, JIS_1, JIS_1, JIS_1, JIS_1, JIS_1, INV, JIS_1, INV }, +/* A_ESC */ { ASCII, A_ESC_DL, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII }, +/* A_ESC_DL */{ ASCII, ASCII, ASCII, JIS, JIS, ASCII, ASCII, ASCII, ASCII }, +/* JIS_1 */ { INV, JIS, JIS, JIS, JIS, JIS, INV, JIS, INV }, +/* J_ESC */ { INV, INV, J_ESC_BR, INV, INV, INV, INV, INV, INV }, +/* J_ESC_BR */{ INV, INV, INV, INV, ASCII, ASCII, INV, INV, INV }, +}; + +static JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = { +/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER */ +/* ASCII */ { NOOP, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A, EMPTY, COPY_A, COPY_A}, +/* JIS */ { NOOP, COPY_J1, COPY_J1, COPY_J1, COPY_J1, COPY_J1, ERROR, COPY_J1, ERROR }, +/* A_ESC */ { COPY_A, NOOP, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A}, +/* A_ESC_DL */{ COPY_A, COPY_A, COPY_A, NOOP, NOOP, COPY_A, COPY_A, COPY_A, COPY_A}, +/* JIS_1 */ { ERROR, COPY_J2, COPY_J2, COPY_J2, COPY_J2, COPY_J2, ERROR, COPY_J2, ERROR }, +/* J_ESC */ { ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR }, +/* J_ESC_BR */{ ERROR, ERROR, ERROR, ERROR, MAKE_A, MAKE_A, ERROR, ERROR, ERROR }, +}; +#endif /* !__CYGWIN__ */ + +/* we override the mbstate_t __count field for more complex encodings and use it store a state value */ +#define __state __count + +#ifdef _MB_EXTENDED_CHARSETS_ISO +static int +___iso_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + int iso_idx, mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + return 0; + + if (n == 0) + return -2; + + if (*t >= 0xa0) + { + if (iso_idx >= 0) + { + *pwc = __iso_8859_conv[iso_idx][*t - 0xa0]; + if (*pwc == 0) /* Invalid character */ + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + return 1; + } + } + + *pwc = (wchar_t) *t; + + if (*t == '\0') + return 0; + + return 1; +} + +static int +__iso_8859_1_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, -1, state); +} + +static int +__iso_8859_2_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 0, state); +} + +static int +__iso_8859_3_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 1, state); +} + +static int +__iso_8859_4_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 2, state); +} + +static int +__iso_8859_5_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 3, state); +} + +static int +__iso_8859_6_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 4, state); +} + +static int +__iso_8859_7_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 5, state); +} + +static int +__iso_8859_8_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 6, state); +} + +static int +__iso_8859_9_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 7, state); +} + +static int +__iso_8859_10_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 8, state); +} + +static int +__iso_8859_11_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 9, state); +} + +static int +__iso_8859_13_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 10, state); +} + +static int +__iso_8859_14_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 11, state); +} + +static int +__iso_8859_15_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 12, state); +} + +static int +__iso_8859_16_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___iso_mbtowc (r, pwc, s, n, 13, state); +} + +static mbtowc_p __iso_8859_mbtowc[17] = { + NULL, + __iso_8859_1_mbtowc, + __iso_8859_2_mbtowc, + __iso_8859_3_mbtowc, + __iso_8859_4_mbtowc, + __iso_8859_5_mbtowc, + __iso_8859_6_mbtowc, + __iso_8859_7_mbtowc, + __iso_8859_8_mbtowc, + __iso_8859_9_mbtowc, + __iso_8859_10_mbtowc, + __iso_8859_11_mbtowc, + NULL, /* No ISO 8859-12 */ + __iso_8859_13_mbtowc, + __iso_8859_14_mbtowc, + __iso_8859_15_mbtowc, + __iso_8859_16_mbtowc +}; + +/* val *MUST* be valid! All checks for validity are supposed to be + performed before calling this function. */ +mbtowc_p +__iso_mbtowc (int val) +{ + return __iso_8859_mbtowc[val]; +} +#endif /* _MB_EXTENDED_CHARSETS_ISO */ + +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS +static int +___cp_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + int cp_idx, mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + return 0; + + if (n == 0) + return -2; + + if (*t >= 0x80) + { + if (cp_idx >= 0) + { + *pwc = __cp_conv[cp_idx][*t - 0x80]; + if (*pwc == 0) /* Invalid character */ + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + return 1; + } + } + + *pwc = (wchar_t)*t; + + if (*t == '\0') + return 0; + + return 1; +} + +static int +__cp_437_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 0, state); +} + +static int +__cp_720_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 1, state); +} + +static int +__cp_737_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 2, state); +} + +static int +__cp_775_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 3, state); +} + +static int +__cp_850_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 4, state); +} + +static int +__cp_852_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 5, state); +} + +static int +__cp_855_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 6, state); +} + +static int +__cp_857_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 7, state); +} + +static int +__cp_858_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 8, state); +} + +static int +__cp_862_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 9, state); +} + +static int +__cp_866_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 10, state); +} + +static int +__cp_874_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 11, state); +} + +static int +__cp_1125_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 12, state); +} + +static int +__cp_1250_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 13, state); +} + +static int +__cp_1251_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 14, state); +} + +static int +__cp_1252_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 15, state); +} + +static int +__cp_1253_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 16, state); +} + +static int +__cp_1254_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 17, state); +} + +static int +__cp_1255_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 18, state); +} + +static int +__cp_1256_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 19, state); +} + +static int +__cp_1257_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 20, state); +} + +static int +__cp_1258_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 21, state); +} + +static int +__cp_20866_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 22, state); +} + +static int +__cp_21866_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 23, state); +} + +static int +__cp_101_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 24, state); +} + +static int +__cp_102_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 25, state); +} + +static int +__cp_103_mbtowc (struct _reent *r, wchar_t *pwc, const char *s, size_t n, + mbstate_t *state) +{ + return ___cp_mbtowc (r, pwc, s, n, 26, state); +} + +static mbtowc_p __cp_xxx_mbtowc[27] = { + __cp_437_mbtowc, + __cp_720_mbtowc, + __cp_737_mbtowc, + __cp_775_mbtowc, + __cp_850_mbtowc, + __cp_852_mbtowc, + __cp_855_mbtowc, + __cp_857_mbtowc, + __cp_858_mbtowc, + __cp_862_mbtowc, + __cp_866_mbtowc, + __cp_874_mbtowc, + __cp_1125_mbtowc, + __cp_1250_mbtowc, + __cp_1251_mbtowc, + __cp_1252_mbtowc, + __cp_1253_mbtowc, + __cp_1254_mbtowc, + __cp_1255_mbtowc, + __cp_1256_mbtowc, + __cp_1257_mbtowc, + __cp_1258_mbtowc, + __cp_20866_mbtowc, + __cp_21866_mbtowc, + __cp_101_mbtowc, + __cp_102_mbtowc, + __cp_103_mbtowc, +}; + +/* val *MUST* be valid! All checks for validity are supposed to be + performed before calling this function. */ +mbtowc_p +__cp_mbtowc (int val) +{ + return __cp_xxx_mbtowc[__cp_val_index (val)]; +} +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + +int +__utf8_mbtowc (struct _reent *r, + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + int ch; + int i = 0; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + return 0; + + if (n == 0) + return -2; + + if (state->__count == 0) + ch = t[i++]; + else + ch = state->__value.__wchb[0]; + + if (ch == '\0') + { + *pwc = 0; + state->__count = 0; + return 0; /* s points to the null character */ + } + + if (ch <= 0x7f) + { + /* single-byte sequence */ + state->__count = 0; + *pwc = ch; + return 1; + } + if (ch >= 0xc0 && ch <= 0xdf) + { + /* two-byte sequence */ + state->__value.__wchb[0] = ch; + if (state->__count == 0) + state->__count = 1; + else if (n < (size_t)-1) + ++n; + if (n < 2) + return -2; + ch = t[i++]; + if (ch < 0x80 || ch > 0xbf) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + if (state->__value.__wchb[0] < 0xc2) + { + /* overlong UTF-8 sequence */ + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + state->__count = 0; + *pwc = (wchar_t)((state->__value.__wchb[0] & 0x1f) << 6) + | (wchar_t)(ch & 0x3f); + return i; + } + if (ch >= 0xe0 && ch <= 0xef) + { + /* three-byte sequence */ + wchar_t tmp; + state->__value.__wchb[0] = ch; + if (state->__count == 0) + state->__count = 1; + else if (n < (size_t)-1) + ++n; + if (n < 2) + return -2; + ch = (state->__count == 1) ? t[i++] : state->__value.__wchb[1]; + if (state->__value.__wchb[0] == 0xe0 && ch < 0xa0) + { + /* overlong UTF-8 sequence */ + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + if (ch < 0x80 || ch > 0xbf) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + state->__value.__wchb[1] = ch; + if (state->__count == 1) + state->__count = 2; + else if (n < (size_t)-1) + ++n; + if (n < 3) + return -2; + ch = t[i++]; + if (ch < 0x80 || ch > 0xbf) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + state->__count = 0; + tmp = (wchar_t)((state->__value.__wchb[0] & 0x0f) << 12) + | (wchar_t)((state->__value.__wchb[1] & 0x3f) << 6) + | (wchar_t)(ch & 0x3f); + *pwc = tmp; + return i; + } + if (ch >= 0xf0 && ch <= 0xf4) + { + /* four-byte sequence */ + wint_t tmp; + state->__value.__wchb[0] = ch; + if (state->__count == 0) + state->__count = 1; + else if (n < (size_t)-1) + ++n; + if (n < 2) + return -2; + ch = (state->__count == 1) ? t[i++] : state->__value.__wchb[1]; + if ((state->__value.__wchb[0] == 0xf0 && ch < 0x90) + || (state->__value.__wchb[0] == 0xf4 && ch >= 0x90)) + { + /* overlong UTF-8 sequence or result is > 0x10ffff */ + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + if (ch < 0x80 || ch > 0xbf) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + state->__value.__wchb[1] = ch; + if (state->__count == 1) + state->__count = 2; + else if (n < (size_t)-1) + ++n; + if (n < 3) + return -2; + ch = (state->__count == 2) ? t[i++] : state->__value.__wchb[2]; + if (ch < 0x80 || ch > 0xbf) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + state->__value.__wchb[2] = ch; + if (state->__count == 2) + state->__count = 3; + else if (n < (size_t)-1) + ++n; + if (state->__count == 3 && sizeof(wchar_t) == 2) + { + /* On systems which have wchar_t being UTF-16 values, the value + doesn't fit into a single wchar_t in this case. So what we + do here is to store the state with a special value of __count + and return the first half of a surrogate pair. The first + three bytes of a UTF-8 sequence are enough to generate the + first half of a UTF-16 surrogate pair. As return value we + choose to return the number of bytes actually read up to + here. + The second half of the surrogate pair is returned in case we + recognize the special __count value of four, and the next + byte is actually a valid value. See below. */ + tmp = (wint_t)((state->__value.__wchb[0] & 0x07) << 18) + | (wint_t)((state->__value.__wchb[1] & 0x3f) << 12) + | (wint_t)((state->__value.__wchb[2] & 0x3f) << 6); + state->__count = 4; + *pwc = 0xd800 | ((tmp - 0x10000) >> 10); + return i; + } + if (n < 4) + return -2; + ch = t[i++]; + if (ch < 0x80 || ch > 0xbf) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + tmp = (wint_t)((state->__value.__wchb[0] & 0x07) << 18) + | (wint_t)((state->__value.__wchb[1] & 0x3f) << 12) + | (wint_t)((state->__value.__wchb[2] & 0x3f) << 6) + | (wint_t)(ch & 0x3f); + if (state->__count == 4 && sizeof(wchar_t) == 2) + /* Create the second half of the surrogate pair for systems with + wchar_t == UTF-16 . */ + *pwc = 0xdc00 | (tmp & 0x3ff); + else + *pwc = tmp; + state->__count = 0; + return i; + } + + _REENT_ERRNO(r) = EILSEQ; + return -1; +} + +/* Cygwin defines its own doublebyte charset conversion functions + because the underlying OS requires wchar_t == UTF-16. */ +#ifndef __CYGWIN__ +int +__sjis_mbtowc (struct _reent *r, + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + int ch; + int i = 0; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + return 0; /* not state-dependent */ + + if (n == 0) + return -2; + + ch = t[i++]; + if (state->__count == 0) + { + if (_issjis1 (ch)) + { + state->__value.__wchb[0] = ch; + state->__count = 1; + if (n <= 1) + return -2; + ch = t[i++]; + } + } + if (state->__count == 1) + { + if (_issjis2 (ch)) + { + *pwc = (((wchar_t)state->__value.__wchb[0]) << 8) + (wchar_t)ch; + state->__count = 0; + return i; + } + else + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + + *pwc = (wchar_t)*t; + + if (*t == '\0') + return 0; + + return 1; +} + +int +__eucjp_mbtowc (struct _reent *r, + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + int ch; + int i = 0; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + return 0; + + if (n == 0) + return -2; + + ch = t[i++]; + if (state->__count == 0) + { + if (_iseucjp1 (ch)) + { + state->__value.__wchb[0] = ch; + state->__count = 1; + if (n <= 1) + return -2; + ch = t[i++]; + } + } + if (state->__count == 1) + { + if (_iseucjp2 (ch)) + { + if (state->__value.__wchb[0] == 0x8f) + { + state->__value.__wchb[1] = ch; + state->__count = 2; + if (n <= i) + return -2; + ch = t[i++]; + } + else + { + *pwc = (((wchar_t)state->__value.__wchb[0]) << 8) + (wchar_t)ch; + state->__count = 0; + return i; + } + } + else + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + if (state->__count == 2) + { + if (_iseucjp2 (ch)) + { + *pwc = (((wchar_t)state->__value.__wchb[1]) << 8) + + (wchar_t)(ch & 0x7f); + state->__count = 0; + return i; + } + else + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + + *pwc = (wchar_t)*t; + + if (*t == '\0') + return 0; + + return 1; +} + +int +__jis_mbtowc (struct _reent *r, + wchar_t *pwc, + const char *s, + size_t n, + mbstate_t *state) +{ + wchar_t dummy; + unsigned char *t = (unsigned char *)s; + JIS_STATE curr_state; + JIS_ACTION action; + JIS_CHAR_TYPE ch; + unsigned char *ptr; + unsigned int i; + int curr_ch; + + if (pwc == NULL) + pwc = &dummy; + + if (s == NULL) + { + state->__state = ASCII; + return 1; /* state-dependent */ + } + + if (n == 0) + return -2; + + curr_state = state->__state; + ptr = t; + + for (i = 0; i < n; ++i) + { + curr_ch = t[i]; + switch (curr_ch) + { + case ESC_CHAR: + ch = ESCAPE; + break; + case '$': + ch = DOLLAR; + break; + case '@': + ch = AT; + break; + case '(': + ch = BRACKET; + break; + case 'B': + ch = B; + break; + case 'J': + ch = J; + break; + case '\0': + ch = NUL; + break; + default: + if (_isjis (curr_ch)) + ch = JIS_CHAR; + else + ch = OTHER; + } + + action = JIS_action_table[curr_state][ch]; + curr_state = JIS_state_table[curr_state][ch]; + + switch (action) + { + case NOOP: + break; + case EMPTY: + state->__state = ASCII; + *pwc = (wchar_t)0; + return 0; + case COPY_A: + state->__state = ASCII; + *pwc = (wchar_t)*ptr; + return (i + 1); + case COPY_J1: + state->__value.__wchb[0] = t[i]; + break; + case COPY_J2: + state->__state = JIS; + *pwc = (((wchar_t)state->__value.__wchb[0]) << 8) + (wchar_t)(t[i]); + return (i + 1); + case MAKE_A: + ptr = (unsigned char *)(t + i + 1); + break; + case ERROR: + default: + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + + } + + state->__state = curr_state; + return -2; /* n < bytes needed */ +} +#endif /* !__CYGWIN__*/ +#endif /* _MB_CAPABLE */ diff --git a/lib/stdlib/mlock.c b/lib/stdlib/mlock.c new file mode 100644 index 0000000..23aa101 --- /dev/null +++ b/lib/stdlib/mlock.c @@ -0,0 +1,57 @@ +#ifndef MALLOC_PROVIDED +/* +FUNCTION +<<__malloc_lock>>, <<__malloc_unlock>>---lock malloc pool + +INDEX + __malloc_lock +INDEX + __malloc_unlock + +SYNOPSIS + #include + void __malloc_lock (struct _reent *<[reent]>); + void __malloc_unlock (struct _reent *<[reent]>); + +DESCRIPTION +The <> family of routines call these functions when they need to lock +the memory pool. The version of these routines supplied in the library use +the lock API defined in sys/lock.h. If multiple threads of execution can +call <>, or if <> can be called reentrantly, then you need to +define your own versions of these functions in order to safely lock the +memory pool during a call. If you do not, the memory pool may become +corrupted. + +A call to <> may call <<__malloc_lock>> recursively; that is, +the sequence of calls may go <<__malloc_lock>>, <<__malloc_lock>>, +<<__malloc_unlock>>, <<__malloc_unlock>>. Any implementation of these +routines must be careful to avoid causing a thread to wait for a lock +that it already holds. +*/ + +#include +#include + +#ifndef __SINGLE_THREAD__ +__LOCK_INIT_RECURSIVE(static, __malloc_recursive_mutex); +#endif + +void +__malloc_lock (ptr) + struct _reent *ptr; +{ +#ifndef __SINGLE_THREAD__ + __lock_acquire_recursive (__malloc_recursive_mutex); +#endif +} + +void +__malloc_unlock (ptr) + struct _reent *ptr; +{ +#ifndef __SINGLE_THREAD__ + __lock_release_recursive (__malloc_recursive_mutex); +#endif +} + +#endif diff --git a/lib/stdlib/mman.h b/lib/stdlib/mman.h new file mode 100644 index 0000000..c36687f --- /dev/null +++ b/lib/stdlib/mman.h @@ -0,0 +1,166 @@ +/* $OpenBSD: mman.h,v 1.35 2022/10/07 14:59:39 deraadt Exp $ */ +/* $NetBSD: mman.h,v 1.11 1995/03/26 20:24:23 jtc Exp $ */ + +/*- + * Copyright (c) 1982, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)mman.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _KERNEL +#include +#endif + +/* + * Protections are chosen from these bits, or-ed together + */ +#define PROT_NONE 0x00 /* no permissions */ +#define PROT_READ 0x01 /* pages can be read */ +#define PROT_WRITE 0x02 /* pages can be written */ +#define PROT_EXEC 0x04 /* pages can be executed */ + +/* + * Flags contain sharing type and options. + * Sharing types; choose one. + */ +#define MAP_SHARED 0x0001 /* share changes */ +#define MAP_PRIVATE 0x0002 /* changes are private */ + +/* + * Other flags + */ +#define MAP_FIXED 0x0010 /* map addr must be exactly as requested */ +#define __MAP_NOREPLACE 0x0800 /* fail if address not available */ +#define MAP_ANON 0x1000 /* allocated from memory, swap space */ +#define MAP_ANONYMOUS MAP_ANON /* alternate POSIX spelling */ +#define __MAP_NOFAULT 0x2000 +#define MAP_STACK 0x4000 /* mapping is used for a stack */ +#define MAP_CONCEAL 0x8000 /* omit from dumps */ + +#define MAP_FLAGMASK 0xfff7 + +#ifndef _KERNEL +/* + * Legacy defines for userland source compatibility. + * Can be removed once no longer needed in base and ports. + */ +#define MAP_COPY MAP_PRIVATE /* "copy" region at mmap time */ +#define MAP_FILE 0 /* map from file (default) */ +#define MAP_HASSEMAPHORE 0 /* region may contain semaphores */ +#define MAP_INHERIT 0 /* region is retained after exec */ +#define MAP_NOEXTEND 0 /* for MAP_FILE, don't change file size */ +#define MAP_NORESERVE 0 /* Sun: don't reserve needed swap area */ +#define MAP_RENAME 0 /* Sun: rename private pages to file */ +#define MAP_TRYFIXED 0 /* attempt hint address, even within heap */ +#endif + +/* + * Error return from mmap() + */ +#define MAP_FAILED ((void *)-1) + +/* + * POSIX memory advisory values. + * Note: keep consistent with the original definitions below. + */ +#define POSIX_MADV_NORMAL 0 /* no further special treatment */ +#define POSIX_MADV_RANDOM 1 /* expect random page references */ +#define POSIX_MADV_SEQUENTIAL 2 /* expect sequential page references */ +#define POSIX_MADV_WILLNEED 3 /* will need these pages */ +#define POSIX_MADV_DONTNEED 4 /* don't need these pages */ + +#if __BSD_VISIBLE +/* + * Original advice values, equivalent to POSIX definitions, + * and few implementation-specific ones. For in-kernel and historic use. + */ +#define MADV_NORMAL POSIX_MADV_NORMAL +#define MADV_RANDOM POSIX_MADV_RANDOM +#define MADV_SEQUENTIAL POSIX_MADV_SEQUENTIAL +#define MADV_WILLNEED POSIX_MADV_WILLNEED +#define MADV_DONTNEED POSIX_MADV_DONTNEED +#define MADV_SPACEAVAIL 5 /* insure that resources are reserved */ +#define MADV_FREE 6 /* pages are empty, free them */ +#endif + +/* + * Flags to minherit + */ +#define MAP_INHERIT_SHARE 0 /* share with child */ +#define MAP_INHERIT_COPY 1 /* copy into child */ +#define MAP_INHERIT_NONE 2 /* absent from child */ +#define MAP_INHERIT_ZERO 3 /* zero in child */ + +/* + * Flags to msync + */ +#define MS_ASYNC 0x01 /* perform asynchronous writes */ +#define MS_SYNC 0x02 /* perform synchronous writes */ +#define MS_INVALIDATE 0x04 /* invalidate cached data */ + +/* + * Flags to mlockall + */ +#define MCL_CURRENT 0x01 /* lock all pages currently mapped */ +#define MCL_FUTURE 0x02 /* lock all pages mapped in the future */ + +#ifndef _KERNEL +#include + +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef __size_t size_t; +#endif + +#ifndef _OFF_T_DEFINED_ +#define _OFF_T_DEFINED_ +typedef __off_t off_t; +#endif + +__BEGIN_DECLS +void * mmap(void *, size_t, int, int, int, off_t); +int mprotect(void *, size_t, int); +int munmap(void *, size_t); +int msync(void *, size_t, int); +int mlock(const void *, size_t); +int munlock(const void *, size_t); +int mlockall(int); +int munlockall(void); +#if __BSD_VISIBLE +int madvise(void *, size_t, int); +int minherit(void *, size_t, int); +int mimmutable(void *, size_t); +void * mquery(void *, size_t, int, int, int, off_t); +#endif +int posix_madvise(void *, size_t, int); +int shm_open(const char *, int, __mode_t); +int shm_unlink(const char *); +int shm_mkstemp(char *); +__END_DECLS + +#endif /* !_KERNEL */ diff --git a/lib/stdlib/mprec.c b/lib/stdlib/mprec.c new file mode 100644 index 0000000..1f534b0 --- /dev/null +++ b/lib/stdlib/mprec.c @@ -0,0 +1,1044 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991 by AT&T. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Please send bug reports to + David M. Gay + AT&T Bell Laboratories, Room 2C-463 + 600 Mountain Avenue + Murray Hill, NJ 07974-2070 + U.S.A. + dmg@research.att.com or research!dmg + */ + +/* strtod for IEEE-, VAX-, and IBM-arithmetic machines. + * + * This strtod returns a nearest machine number to the input decimal + * string (or sets errno to ERANGE). With IEEE arithmetic, ties are + * broken by the IEEE round-even rule. Otherwise ties are broken by + * biased rounding (add half and chop). + * + * Inspired loosely by William D. Clinger's paper "How to Read Floating + * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101]. + * + * Modifications: + * + * 1. We only require IEEE, IBM, or VAX double-precision + * arithmetic (not IEEE double-extended). + * 2. We get by with floating-point arithmetic in a case that + * Clinger missed -- when we're computing d * 10^n + * for a small integer d and the integer n is not too + * much larger than 22 (the maximum integer k for which + * we can represent 10^k exactly), we may be able to + * compute (d*10^k) * 10^(e-k) with just one roundoff. + * 3. Rather than a bit-at-a-time adjustment of the binary + * result in the hard case, we use floating-point + * arithmetic to determine the adjustment to within + * one bit; only in really hard cases do we need to + * compute a second residual. + * 4. Because of 3., we don't need a large table of powers of 10 + * for ten-to-e (just some small tables, e.g. of 10^k + * for 0 <= k <= 22). + */ + +/* + * #define IEEE_8087 for IEEE-arithmetic machines where the least + * significant byte has the lowest address. + * #define IEEE_MC68k for IEEE-arithmetic machines where the most + * significant byte has the lowest address. + * #define Sudden_Underflow for IEEE-format machines without gradual + * underflow (i.e., that flush to zero on underflow). + * #define IBM for IBM mainframe-style floating-point arithmetic. + * #define VAX for VAX-style floating-point arithmetic. + * #define Unsigned_Shifts if >> does treats its left operand as unsigned. + * #define No_leftright to omit left-right logic in fast floating-point + * computation of dtoa. + * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3. + * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines + * that use extended-precision instructions to compute rounded + * products and quotients) with IBM. + * #define ROUND_BIASED for IEEE-format with biased rounding. + * #define Inaccurate_Divide for IEEE-format with correctly rounded + * products but inaccurate quotients, e.g., for Intel i860. + * #define Just_16 to store 16 bits per 32-bit long when doing high-precision + * integer arithmetic. Whether this speeds things up or slows things + * down depends on the machine and the number being converted. + */ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local struct _Bigint *_tls_mp_p5s; +_Thread_local struct _Bigint **_tls_mp_freelist; +#endif + +/* This is defined in sys/reent.h as (sizeof (size_t) << 3) now, as in NetBSD. + The old value of 15 was wrong and made newlib vulnerable against buffer + overrun attacks (CVE-2009-0689), same as other implementations of gdtoa + based on BSD code. +#define _Kmax 15 +*/ + +_Bigint * +Balloc (struct _reent *ptr, int k) +{ + int x; + _Bigint *rv ; + + _REENT_CHECK_MP(ptr); + if (_REENT_MP_FREELIST(ptr) == NULL) + { + /* Allocate a list of pointers to the mprec objects */ + _REENT_MP_FREELIST(ptr) = (struct _Bigint **) _calloc_r (ptr, + sizeof (struct _Bigint *), + _Kmax + 1); + if (_REENT_MP_FREELIST(ptr) == NULL) + { + return NULL; + } + } + + if ((rv = _REENT_MP_FREELIST(ptr)[k]) != 0) + { + _REENT_MP_FREELIST(ptr)[k] = rv->_next; + } + else + { + x = 1 << k; + /* Allocate an mprec Bigint and stick in in the freelist */ + rv = (_Bigint *) _calloc_r (ptr, + 1, + sizeof (_Bigint) + + (x-1) * sizeof(rv->_x)); + if (rv == NULL) return NULL; + rv->_k = k; + rv->_maxwds = x; + } + rv->_sign = rv->_wds = 0; + return rv; +} + +void +Bfree (struct _reent *ptr, _Bigint * v) +{ + _REENT_CHECK_MP(ptr); + if (v) + { + v->_next = _REENT_MP_FREELIST(ptr)[v->_k]; + _REENT_MP_FREELIST(ptr)[v->_k] = v; + } +} + +_Bigint * +multadd (struct _reent *ptr, + _Bigint * b, + int m, + int a) +{ + int i, wds; + __ULong *x, y; +#ifdef Pack_32 + __ULong xi, z; +#endif + _Bigint *b1; + + wds = b->_wds; + x = b->_x; + i = 0; + do + { +#ifdef Pack_32 + xi = *x; + y = (xi & 0xffff) * m + a; + z = (xi >> 16) * m + (y >> 16); + a = (int) (z >> 16); + *x++ = (z << 16) + (y & 0xffff); +#else + y = *x * m + a; + a = (int) (y >> 16); + *x++ = y & 0xffff; +#endif + } + while (++i < wds); + if (a) + { + if (wds >= b->_maxwds) + { + b1 = eBalloc (ptr, b->_k + 1); + Bcopy (b1, b); + Bfree (ptr, b); + b = b1; + } + b->_x[wds++] = a; + b->_wds = wds; + } + return b; +} + +_Bigint * +s2b (struct _reent * ptr, + const char *s, + int nd0, + int nd, + __ULong y9) +{ + _Bigint *b; + int i, k; + __Long x, y; + + x = (nd + 8) / 9; + for (k = 0, y = 1; x > y; y <<= 1, k++); +#ifdef Pack_32 + b = eBalloc (ptr, k); + b->_x[0] = y9; + b->_wds = 1; +#else + b = eBalloc (ptr, k + 1); + b->_x[0] = y9 & 0xffff; + b->_wds = (b->_x[1] = y9 >> 16) ? 2 : 1; +#endif + + i = 9; + if (9 < nd0) + { + s += 9; + do + b = multadd (ptr, b, 10, *s++ - '0'); + while (++i < nd0); + s++; + } + else + s += 10; + for (; i < nd; i++) + b = multadd (ptr, b, 10, *s++ - '0'); + return b; +} + +int +hi0bits (register __ULong x) +{ + register int k = 0; + + if (!(x & 0xffff0000)) + { + k = 16; + x <<= 16; + } + if (!(x & 0xff000000)) + { + k += 8; + x <<= 8; + } + if (!(x & 0xf0000000)) + { + k += 4; + x <<= 4; + } + if (!(x & 0xc0000000)) + { + k += 2; + x <<= 2; + } + if (!(x & 0x80000000)) + { + k++; + if (!(x & 0x40000000)) + return 32; + } + return k; +} + +int +lo0bits (__ULong *y) +{ + register int k; + register __ULong x = *y; + + if (x & 7) + { + if (x & 1) + return 0; + if (x & 2) + { + *y = x >> 1; + return 1; + } + *y = x >> 2; + return 2; + } + k = 0; + if (!(x & 0xffff)) + { + k = 16; + x >>= 16; + } + if (!(x & 0xff)) + { + k += 8; + x >>= 8; + } + if (!(x & 0xf)) + { + k += 4; + x >>= 4; + } + if (!(x & 0x3)) + { + k += 2; + x >>= 2; + } + if (!(x & 1)) + { + k++; + x >>= 1; + if (!x & 1) + return 32; + } + *y = x; + return k; +} + +_Bigint * +i2b (struct _reent * ptr, int i) +{ + _Bigint *b; + + b = eBalloc (ptr, 1); + b->_x[0] = i; + b->_wds = 1; + return b; +} + +_Bigint * +mult (struct _reent * ptr, _Bigint * a, _Bigint * b) +{ + _Bigint *c; + int k, wa, wb, wc; + __ULong carry, y, z; + __ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; +#ifdef Pack_32 + __ULong z2; +#endif + + if (a->_wds < b->_wds) + { + c = a; + a = b; + b = c; + } + k = a->_k; + wa = a->_wds; + wb = b->_wds; + wc = wa + wb; + if (wc > a->_maxwds) + k++; + c = eBalloc (ptr, k); + for (x = c->_x, xa = x + wc; x < xa; x++) + *x = 0; + xa = a->_x; + xae = xa + wa; + xb = b->_x; + xbe = xb + wb; + xc0 = c->_x; +#ifdef Pack_32 + for (; xb < xbe; xb++, xc0++) + { + if ((y = *xb & 0xffff) != 0) + { + x = xa; + xc = xc0; + carry = 0; + do + { + z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; + carry = z >> 16; + z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; + carry = z2 >> 16; + Storeinc (xc, z2, z); + } + while (x < xae); + *xc = carry; + } + if ((y = *xb >> 16) != 0) + { + x = xa; + xc = xc0; + carry = 0; + z2 = *xc; + do + { + z = (*x & 0xffff) * y + (*xc >> 16) + carry; + carry = z >> 16; + Storeinc (xc, z, z2); + z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; + carry = z2 >> 16; + } + while (x < xae); + *xc = z2; + } + } +#else + for (; xb < xbe; xc0++) + { + if (y = *xb++) + { + x = xa; + xc = xc0; + carry = 0; + do + { + z = *x++ * y + *xc + carry; + carry = z >> 16; + *xc++ = z & 0xffff; + } + while (x < xae); + *xc = carry; + } + } +#endif + for (xc0 = c->_x, xc = xc0 + wc; wc > 0 && !*--xc; --wc); + c->_wds = wc; + return c; +} + +_Bigint * +pow5mult (struct _reent * ptr, _Bigint * b, int k) +{ + _Bigint *b1, *p5, *p51; + int i; + static const int p05[3] = {5, 25, 125}; + + if ((i = k & 3) != 0) + b = multadd (ptr, b, p05[i - 1], 0); + + if (!(k >>= 2)) + return b; + _REENT_CHECK_MP(ptr); + if (!(p5 = _REENT_MP_P5S(ptr))) + { + /* first time */ + p5 = _REENT_MP_P5S(ptr) = i2b (ptr, 625); + p5->_next = 0; + } + for (;;) + { + if (k & 1) + { + b1 = mult (ptr, b, p5); + Bfree (ptr, b); + b = b1; + } + if (!(k >>= 1)) + break; + if (!(p51 = p5->_next)) + { + p51 = p5->_next = mult (ptr, p5, p5); + p51->_next = 0; + } + p5 = p51; + } + return b; +} + +_Bigint * +lshift (struct _reent * ptr, _Bigint * b, int k) +{ + int i, k1, n, n1; + _Bigint *b1; + __ULong *x, *x1, *xe, z; + +#ifdef Pack_32 + n = k >> 5; +#else + n = k >> 4; +#endif + k1 = b->_k; + n1 = n + b->_wds + 1; + for (i = b->_maxwds; n1 > i; i <<= 1) + k1++; + b1 = eBalloc (ptr, k1); + x1 = b1->_x; + for (i = 0; i < n; i++) + *x1++ = 0; + x = b->_x; + xe = x + b->_wds; +#ifdef Pack_32 + if (k &= 0x1f) + { + k1 = 32 - k; + z = 0; + do + { + *x1++ = *x << k | z; + z = *x++ >> k1; + } + while (x < xe); + if ((*x1 = z) != 0) + ++n1; + } +#else + if (k &= 0xf) + { + k1 = 16 - k; + z = 0; + do + { + *x1++ = *x << k & 0xffff | z; + z = *x++ >> k1; + } + while (x < xe); + if (*x1 = z) + ++n1; + } +#endif + else + do + *x1++ = *x++; + while (x < xe); + b1->_wds = n1 - 1; + Bfree (ptr, b); + return b1; +} + +int +cmp (_Bigint * a, _Bigint * b) +{ + __ULong *xa, *xa0, *xb, *xb0; + int i, j; + + i = a->_wds; + j = b->_wds; +#ifdef DEBUG + if (i > 1 && !a->_x[i - 1]) + Bug ("cmp called with a->_x[a->_wds-1] == 0"); + if (j > 1 && !b->_x[j - 1]) + Bug ("cmp called with b->_x[b->_wds-1] == 0"); +#endif + if (i -= j) + return i; + xa0 = a->_x; + xa = xa0 + j; + xb0 = b->_x; + xb = xb0 + j; + for (;;) + { + if (*--xa != *--xb) + return *xa < *xb ? -1 : 1; + if (xa <= xa0) + break; + } + return 0; +} + +_Bigint * +diff (struct _reent * ptr, + _Bigint * a, _Bigint * b) +{ + _Bigint *c; + int i, wa, wb; + __Long borrow, y; /* We need signed shifts here. */ + __ULong *xa, *xae, *xb, *xbe, *xc; +#ifdef Pack_32 + __Long z; +#endif + + i = cmp (a, b); + if (!i) + { + c = eBalloc (ptr, 0); + c->_wds = 1; + c->_x[0] = 0; + return c; + } + if (i < 0) + { + c = a; + a = b; + b = c; + i = 1; + } + else + i = 0; + c = eBalloc (ptr, a->_k); + c->_sign = i; + wa = a->_wds; + xa = a->_x; + xae = xa + wa; + wb = b->_wds; + xb = b->_x; + xbe = xb + wb; + xc = c->_x; + borrow = 0; +#ifdef Pack_32 + do + { + y = (*xa & 0xffff) - (*xb & 0xffff) + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + z = (*xa++ >> 16) - (*xb++ >> 16) + borrow; + borrow = z >> 16; + Sign_Extend (borrow, z); + Storeinc (xc, z, y); + } + while (xb < xbe); + while (xa < xae) + { + y = (*xa & 0xffff) + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + z = (*xa++ >> 16) + borrow; + borrow = z >> 16; + Sign_Extend (borrow, z); + Storeinc (xc, z, y); + } +#else + do + { + y = *xa++ - *xb++ + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + *xc++ = y & 0xffff; + } + while (xb < xbe); + while (xa < xae) + { + y = *xa++ + borrow; + borrow = y >> 16; + Sign_Extend (borrow, y); + *xc++ = y & 0xffff; + } +#endif + while (!*--xc) + wa--; + c->_wds = wa; + return c; +} + +double +ulp (double _x) +{ + union double_union x, a; + register __Long L; + + x.d = _x; + + L = (word0 (x) & Exp_mask) - (P - 1) * Exp_msk1; +#ifndef Sudden_Underflow + if (L > 0) + { +#endif +#ifdef IBM + L |= Exp_msk1 >> 4; +#endif + word0 (a) = L; +#ifndef _DOUBLE_IS_32BITS + word1 (a) = 0; +#endif + +#ifndef Sudden_Underflow + } + else + { + L = -L >> Exp_shift; + if (L < Exp_shift) + { + word0 (a) = 0x80000 >> L; +#ifndef _DOUBLE_IS_32BITS + word1 (a) = 0; +#endif + } + else + { + word0 (a) = 0; + L -= Exp_shift; +#ifndef _DOUBLE_IS_32BITS + word1 (a) = L >= 31 ? 1 : 1 << (31 - L); +#endif + } + } +#endif + return a.d; +} + +double +b2d (_Bigint * a, int *e) +{ + __ULong *xa, *xa0, w, y, z; + int k; + union double_union d; +#ifdef VAX + __ULong d0, d1; +#else +#define d0 word0(d) +#define d1 word1(d) +#endif + + xa0 = a->_x; + xa = xa0 + a->_wds; + y = *--xa; +#ifdef DEBUG + if (!y) + Bug ("zero y in b2d"); +#endif + k = hi0bits (y); + *e = 32 - k; +#ifdef Pack_32 + if (k < Ebits) + { + d0 = Exp_1 | y >> (Ebits - k); + w = xa > xa0 ? *--xa : 0; +#ifndef _DOUBLE_IS_32BITS + d1 = y << ((32 - Ebits) + k) | w >> (Ebits - k); +#endif + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + if (k -= Ebits) + { + d0 = Exp_1 | y << k | z >> (32 - k); + y = xa > xa0 ? *--xa : 0; +#ifndef _DOUBLE_IS_32BITS + d1 = z << k | y >> (32 - k); +#endif + } + else + { + d0 = Exp_1 | y; +#ifndef _DOUBLE_IS_32BITS + d1 = z; +#endif + } +#else + if (k < Ebits + 16) + { + z = xa > xa0 ? *--xa : 0; + d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; + w = xa > xa0 ? *--xa : 0; + y = xa > xa0 ? *--xa : 0; + d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; + goto ret_d; + } + z = xa > xa0 ? *--xa : 0; + w = xa > xa0 ? *--xa : 0; + k -= Ebits + 16; + d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; + y = xa > xa0 ? *--xa : 0; + d1 = w << k + 16 | y << k; +#endif +ret_d: +#ifdef VAX + word0 (d) = d0 >> 16 | d0 << 16; + word1 (d) = d1 >> 16 | d1 << 16; +#else +#undef d0 +#undef d1 +#endif + return d.d; +} + +_Bigint * +d2b (struct _reent * ptr, + double _d, + int *e, + int *bits) + +{ + union double_union d; + _Bigint *b; + int de, i, k; + __ULong *x, y, z; +#ifdef VAX + __ULong d0, d1; +#endif + d.d = _d; +#ifdef VAX + d0 = word0 (d) >> 16 | word0 (d) << 16; + d1 = word1 (d) >> 16 | word1 (d) << 16; +#else +#define d0 word0(d) +#define d1 word1(d) + d.d = _d; +#endif + +#ifdef Pack_32 + b = eBalloc (ptr, 1); +#else + b = eBalloc (ptr, 2); +#endif + x = b->_x; + + z = d0 & Frac_mask; + d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ +#ifdef Sudden_Underflow + de = (int) (d0 >> Exp_shift); +#ifndef IBM + z |= Exp_msk11; +#endif +#else + if ((de = (int) (d0 >> Exp_shift)) != 0) + z |= Exp_msk1; +#endif +#ifdef Pack_32 +#ifndef _DOUBLE_IS_32BITS + if (d1) + { + y = d1; + k = lo0bits (&y); + if (k) + { + x[0] = y | z << (32 - k); + z >>= k; + } + else + x[0] = y; + i = b->_wds = (x[1] = z) ? 2 : 1; + } + else +#endif + { +#ifdef DEBUG + if (!z) + Bug ("Zero passed to d2b"); +#endif + k = lo0bits (&z); + x[0] = z; + i = b->_wds = 1; +#ifndef _DOUBLE_IS_32BITS + k += 32; +#endif + } +#else + if (d1) + { + y = d1; + k = lo0bits (&y); + if (k) + if (k >= 16) + { + x[0] = y | z << 32 - k & 0xffff; + x[1] = z >> k - 16 & 0xffff; + x[2] = z >> k; + i = 2; + } + else + { + x[0] = y & 0xffff; + x[1] = y >> 16 | z << 16 - k & 0xffff; + x[2] = z >> k & 0xffff; + x[3] = z >> k + 16; + i = 3; + } + else + { + x[0] = y & 0xffff; + x[1] = y >> 16; + x[2] = z & 0xffff; + x[3] = z >> 16; + i = 3; + } + } + else + { +#ifdef DEBUG + if (!z) + Bug ("Zero passed to d2b"); +#endif + k = lo0bits (&z); + if (k >= 16) + { + x[0] = z; + i = 0; + } + else + { + x[0] = z & 0xffff; + x[1] = z >> 16; + i = 1; + } + k += 32; + } + while (!x[i]) + --i; + b->_wds = i + 1; +#endif +#ifndef Sudden_Underflow + if (de) + { +#endif +#ifdef IBM + *e = (de - Bias - (P - 1) << 2) + k; + *bits = 4 * P + 8 - k - hi0bits (word0 (d) & Frac_mask); +#else + *e = de - Bias - (P - 1) + k; + *bits = P - k; +#endif +#ifndef Sudden_Underflow + } + else + { + *e = de - Bias - (P - 1) + 1 + k; +#ifdef Pack_32 + *bits = 32 * i - hi0bits (x[i - 1]); +#else + *bits = (i + 2) * 16 - hi0bits (x[i]); +#endif + } +#endif + return b; +} +#undef d0 +#undef d1 + +double +ratio (_Bigint * a, _Bigint * b) + +{ + union double_union da, db; + int k, ka, kb; + + da.d = b2d (a, &ka); + db.d = b2d (b, &kb); +#ifdef Pack_32 + k = ka - kb + 32 * (a->_wds - b->_wds); +#else + k = ka - kb + 16 * (a->_wds - b->_wds); +#endif +#ifdef IBM + if (k > 0) + { + word0 (da) += (k >> 2) * Exp_msk1; + if (k &= 3) + da.d *= 1 << k; + } + else + { + k = -k; + word0 (db) += (k >> 2) * Exp_msk1; + if (k &= 3) + db.d *= 1 << k; + } +#else + if (k > 0) + word0 (da) += k * Exp_msk1; + else + { + k = -k; + word0 (db) += k * Exp_msk1; + } +#endif + return da.d / db.d; +} + + +const double + tens[] = +{ + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, + 1e20, 1e21, 1e22, 1e23, 1e24 + +}; + +#if !defined(_DOUBLE_IS_32BITS) && !defined(__v800) +const double bigtens[] = +{1e16, 1e32, 1e64, 1e128, 1e256}; + +const double tinytens[] = +{1e-16, 1e-32, 1e-64, 1e-128, 1e-256}; +#else +const double bigtens[] = +{1e16, 1e32}; + +const double tinytens[] = +{1e-16, 1e-32}; +#endif + + +double +_mprec_log10 (int dig) +{ + double v = 1.0; + if (dig < 24) + return tens[dig]; + while (dig > 0) + { + v *= 10; + dig--; + } + return v; +} + +void +copybits (__ULong *c, + int n, + _Bigint *b) +{ + __ULong *ce, *x, *xe; +#ifdef Pack_16 + int nw, nw1; +#endif + + ce = c + ((n-1) >> kshift) + 1; + x = b->_x; +#ifdef Pack_32 + xe = x + b->_wds; + while(x < xe) + *c++ = *x++; +#else + nw = b->_wds; + nw1 = nw & 1; + for(xe = x + (nw - nw1); x < xe; x += 2) + Storeinc(c, x[1], x[0]); + if (nw1) + *c++ = *x; +#endif + while(c < ce) + *c++ = 0; +} + +__ULong +any_on (_Bigint *b, + int k) +{ + int n, nwds; + __ULong *x, *x0, x1, x2; + + x = b->_x; + nwds = b->_wds; + n = k >> kshift; + if (n > nwds) + n = nwds; + else if (n < nwds && (k &= kmask)) { + x1 = x2 = x[n]; + x1 >>= k; + x1 <<= k; + if (x1 != x2) + return 1; + } + x0 = x; + x += n; + while(x > x0) + if (*--x) + return 1; + return 0; +} + diff --git a/lib/stdlib/mprec.h b/lib/stdlib/mprec.h new file mode 100644 index 0000000..83de932 --- /dev/null +++ b/lib/stdlib/mprec.h @@ -0,0 +1,410 @@ +/**************************************************************** + * + * The author of this software is David M. Gay. + * + * Copyright (c) 1991 by AT&T. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software and in all copies of the supporting + * documentation for such software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY + * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY + * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + * + ***************************************************************/ + +/* Please send bug reports to + David M. Gay + AT&T Bell Laboratories, Room 2C-463 + 600 Mountain Avenue + Murray Hill, NJ 07974-2070 + U.S.A. + dmg@research.att.com or research!dmg + */ + +#include +#include +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +#ifdef __IEEE_LITTLE_ENDIAN +#define IEEE_8087 +#endif + +#ifdef __IEEE_BIG_ENDIAN +#define IEEE_MC68k +#endif + +#ifdef __Z8000__ +#define Just_16 +#endif + +#ifdef DEBUG +#include "stdio.h" +#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);} +#endif + +#ifdef Unsigned_Shifts +#define Sign_Extend(a,b) if (b < 0) a |= (__uint32_t)0xffff0000; +#else +#define Sign_Extend(a,b) /*no-op*/ +#endif + +#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1 +Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined. +#endif + +/* If we are going to examine or modify specific bits in a double using + the word0 and/or word1 macros, then we must wrap the double inside + a union. This is necessary to avoid undefined behavior according to + the ANSI C spec. */ +union double_union +{ + double d; + __uint32_t i[2]; +}; + +#ifdef IEEE_8087 +#define word0(x) (x.i[1]) +#define word1(x) (x.i[0]) +#else +#define word0(x) (x.i[0]) +#define word1(x) (x.i[1]) +#endif + +/* The following is taken from gdtoaimp.h for use with new strtod, but + adjusted to avoid invalid type-punning. */ +typedef __int32_t Long; + +/* Unfortunately, because __ULong might be a different type than + __uint32_t, we can't re-use union double_union as-is without + further edits in strtod.c. */ +typedef union { double d; __ULong i[2]; } U; + +#define dword0(x) word0(x) +#define dword1(x) word1(x) +#define dval(x) (x.d) + +#undef SI +#ifdef Sudden_Underflow +#define SI 1 +#else +#define SI 0 +#endif + +#define Storeinc(a,b,c) (*(a)++ = ((b) << 16) | ((c) & 0xffff)) + +/* #define P DBL_MANT_DIG */ +/* Ten_pmax = floor(P*log(2)/log(5)) */ +/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */ +/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */ +/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */ + +#if defined(IEEE_8087) + defined(IEEE_MC68k) +#if defined (_DOUBLE_IS_32BITS) +#define Exp_shift 23 +#define Exp_shift1 23 +#define Exp_msk1 ((__uint32_t)0x00800000L) +#define Exp_msk11 ((__uint32_t)0x00800000L) +#define Exp_mask ((__uint32_t)0x7f800000L) +#define P 24 +#define Bias 127 +#define NO_HEX_FP /* not supported in this case */ +#define IEEE_Arith +#define Emin (-126) +#define Exp_1 ((__uint32_t)0x3f800000L) +#define Exp_11 ((__uint32_t)0x3f800000L) +#define Ebits 8 +#define Frac_mask ((__uint32_t)0x007fffffL) +#define Frac_mask1 ((__uint32_t)0x007fffffL) +#define Ten_pmax 10 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Ten_pmax 10 +#define Bletch 2 +#define Bndry_mask ((__uint32_t)0x007fffffL) +#define Bndry_mask1 ((__uint32_t)0x007fffffL) +#define LSB 1 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 5 +#define Int_max 6 +#define Infinite(x) (word0(x) == ((__uint32_t)0x7f800000L)) +#undef word0 +#undef word1 +#undef dword0 +#undef dword1 + +#define word0(x) (x.i[0]) +#define word1(x) 0 +#define dword0(x) word0(x) +#define dword1(x) 0 +#else + +#define Exp_shift 20 +#define Exp_shift1 20 +#define Exp_msk1 ((__uint32_t)0x100000L) +#define Exp_msk11 ((__uint32_t)0x100000L) +#define Exp_mask ((__uint32_t)0x7ff00000L) +#define P 53 +#define Bias 1023 +#define IEEE_Arith +#define Emin (-1022) +#define Exp_1 ((__uint32_t)0x3ff00000L) +#define Exp_11 ((__uint32_t)0x3ff00000L) +#define Ebits 11 +#define Frac_mask ((__uint32_t)0xfffffL) +#define Frac_mask1 ((__uint32_t)0xfffffL) +#define Ten_pmax 22 +#define Bletch 0x10 +#define Bndry_mask ((__uint32_t)0xfffffL) +#define Bndry_mask1 ((__uint32_t)0xfffffL) +#define LSB 1 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Log2P 1 +#define Tiny0 0 +#define Tiny1 1 +#define Quick_max 14 +#define Int_max 14 +#define Infinite(x) (word0(x) == ((__uint32_t)0x7ff00000L)) /* sufficient test for here */ + +#endif /* !_DOUBLE_IS_32BITS */ + +#ifndef Flt_Rounds +#ifdef FLT_ROUNDS +#define Flt_Rounds FLT_ROUNDS +#else +#define Flt_Rounds 1 +#endif +#endif /*Flt_Rounds*/ + +#else /* !IEEE_8087 && !IEEE_MC68k */ +#undef Sudden_Underflow +#define Sudden_Underflow +#ifdef IBM +#define Flt_Rounds 0 +#define Exp_shift 24 +#define Exp_shift1 24 +#define Exp_msk1 ((__uint32_t)0x1000000L) +#define Exp_msk11 ((__uint32_t)0x1000000L) +#define Exp_mask ((__uint32_t)0x7f000000L) +#define P 14 +#define Bias 65 +#define Exp_1 ((__uint32_t)0x41000000L) +#define Exp_11 ((__uint32_t)0x41000000L) +#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */ +#define Frac_mask ((__uint32_t)0xffffffL) +#define Frac_mask1 ((__uint32_t)0xffffffL) +#define Bletch 4 +#define Ten_pmax 22 +#define Bndry_mask ((__uint32_t)0xefffffL) +#define Bndry_mask1 ((__uint32_t)0xffffffL) +#define LSB 1 +#define Sign_bit ((__uint32_t)0x80000000L) +#define Log2P 4 +#define Tiny0 ((__uint32_t)0x100000L) +#define Tiny1 0 +#define Quick_max 14 +#define Int_max 15 +#else /* VAX */ +#define Flt_Rounds 1 +#define Exp_shift 23 +#define Exp_shift1 7 +#define Exp_msk1 0x80 +#define Exp_msk11 ((__uint32_t)0x800000L) +#define Exp_mask ((__uint32_t)0x7f80L) +#define P 56 +#define Bias 129 +#define Exp_1 ((__uint32_t)0x40800000L) +#define Exp_11 ((__uint32_t)0x4080L) +#define Ebits 8 +#define Frac_mask ((__uint32_t)0x7fffffL) +#define Frac_mask1 ((__uint32_t)0xffff007fL) +#define Ten_pmax 24 +#define Bletch 2 +#define Bndry_mask ((__uint32_t)0xffff007fL) +#define Bndry_mask1 ((__uint32_t)0xffff007fL) +#define LSB ((__uint32_t)0x10000L) +#define Sign_bit ((__uint32_t)0x8000L) +#define Log2P 1 +#define Tiny0 0x80 +#define Tiny1 0 +#define Quick_max 15 +#define Int_max 15 +#endif +#endif + +#ifndef IEEE_Arith +#define ROUND_BIASED +#else +#define Scale_Bit 0x10 +#if defined(_DOUBLE_IS_32BITS) && defined(__v800) +#define n_bigtens 2 +#else +#define n_bigtens 5 +#endif +#endif + +#ifdef IBM +#define n_bigtens 3 +#endif + +#ifdef VAX +#define n_bigtens 2 +#endif + +#ifndef __NO_INFNAN_CHECK +#define INFNAN_CHECK +#endif + +#ifdef RND_PRODQUOT +#define rounded_product(a,b) a = rnd_prod(a, b) +#define rounded_quotient(a,b) a = rnd_quot(a, b) +#ifdef KR_headers +extern double rnd_prod(), rnd_quot(); +#else +extern double rnd_prod(double, double), rnd_quot(double, double); +#endif +#else +#define rounded_product(a,b) a *= b +#define rounded_quotient(a,b) a /= b +#endif + +#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) +#define Big1 ((__uint32_t)0xffffffffL) + +#ifndef Just_16 +/* When Pack_32 is not defined, we store 16 bits per 32-bit long. + * This makes some inner loops simpler and sometimes saves work + * during multiplications, but it often seems to make things slightly + * slower. Hence the default is now to store 32 bits per long. + */ + + #ifndef Pack_32 + #define Pack_32 + #endif +#else /* Just_16 */ + #ifndef Pack_16 + #define Pack_16 + #endif +#endif /* Just_16 */ + +#ifdef Pack_32 +#define ULbits 32 +#define kshift 5 +#define kmask 31 +#define ALL_ON 0xffffffff +#else +#define ULbits 16 +#define kshift 4 +#define kmask 15 +#define ALL_ON 0xffff +#endif + +#ifdef __cplusplus +extern "C" double strtod(const char *s00, char **se); +extern "C" char *dtoa(double d, int mode, int ndigits, + int *decpt, int *sign, char **rve); +#endif + + +typedef struct _Bigint _Bigint; + +#define Balloc _Balloc +#define Bfree _Bfree +#define multadd __multadd +#define s2b __s2b +#define lo0bits __lo0bits +#define hi0bits __hi0bits +#define i2b __i2b +#define mult __multiply +#define pow5mult __pow5mult +#define lshift __lshift +#define match __match +#define cmp __mcmp +#define diff __mdiff +#define ulp __ulp +#define b2d __b2d +#define d2b __d2b +#define ratio __ratio +#define any_on __any_on +#define gethex __gethex +#define copybits __copybits +#define hexnan __hexnan + +#define eBalloc(__reent_ptr, __len) ({ \ + void *__ptr = Balloc(__reent_ptr, __len); \ + if (__ptr == NULL) \ + __assert_func(__FILE__, __LINE__, (char *)0, "Balloc succeeded"); \ + __ptr; \ + }) + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) +#define __get_hexdig(x) __hexdig[x] /* NOTE: must evaluate arg only once */ +#else /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */ +#define __get_hexdig(x) __hexdig_fun(x) +#endif /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */ + +#define tens __mprec_tens +#define bigtens __mprec_bigtens +#define tinytens __mprec_tinytens + +struct _reent ; +struct FPI; +double ulp (double x); +double b2d (_Bigint *a , int *e); +_Bigint * Balloc (struct _reent *p, int k); +void Bfree (struct _reent *p, _Bigint *v); +_Bigint * multadd (struct _reent *p, _Bigint *, int, int); +_Bigint * s2b (struct _reent *, const char*, int, int, __ULong); +_Bigint * i2b (struct _reent *,int); +_Bigint * mult (struct _reent *, _Bigint *, _Bigint *); +_Bigint * pow5mult (struct _reent *, _Bigint *, int k); +int hi0bits (__ULong); +int lo0bits (__ULong *); +_Bigint * d2b (struct _reent *p, double d, int *e, int *bits); +_Bigint * lshift (struct _reent *p, _Bigint *b, int k); +int match (const char**, char*); +_Bigint * diff (struct _reent *p, _Bigint *a, _Bigint *b); +int cmp (_Bigint *a, _Bigint *b); +int gethex (struct _reent *p, const char **sp, const struct FPI *fpi, Long *exp, _Bigint **bp, int sign, locale_t loc); +double ratio (_Bigint *a, _Bigint *b); +__ULong any_on (_Bigint *b, int k); +void copybits (__ULong *c, int n, _Bigint *b); +double _strtod_l (struct _reent *ptr, const char *__restrict s00, + char **__restrict se, locale_t loc); +#if defined (_HAVE_LONG_DOUBLE) && !defined (_LDBL_EQ_DBL) +int _strtorx_l (struct _reent *, const char *, char **, int, + void *, locale_t); +int _strtodg_l (struct _reent *p, const char *s00, char **se, + struct FPI *fpi, Long *exp, __ULong *bits, + locale_t); +#endif /* _HAVE_LONG_DOUBLE && !_LDBL_EQ_DBL */ + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) || defined(_SMALL_HEXDIG) +unsigned char __hexdig_fun (unsigned char); +#endif /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */ +#ifdef INFNAN_CHECK +int hexnan (const char **sp, const struct FPI *fpi, __ULong *x0); +#endif + +#define Bcopy(x,y) memcpy((char *)&x->_sign, (char *)&y->_sign, y->_wds*sizeof(__Long) + 2*sizeof(int)) + +extern const double tinytens[]; +extern const double bigtens[]; +extern const double tens[]; +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) +extern const unsigned char __hexdig[]; +#endif /* !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) && !defined(_SMALL_HEXDIG) */ + + +double _mprec_log10 (int); diff --git a/lib/stdlib/mrand48.c b/lib/stdlib/mrand48.c new file mode 100644 index 0000000..bb1e454 --- /dev/null +++ b/lib/stdlib/mrand48.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +long +_mrand48_r (struct _reent *r) +{ + _REENT_CHECK_RAND48(r); + __dorand48(r, __rand48_seed); + return ((long) __rand48_seed[2] << 16) + (long) __rand48_seed[1]; +} + +#ifndef _REENT_ONLY +long +mrand48 (void) +{ + return _mrand48_r (_REENT); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/msize.c b/lib/stdlib/msize.c new file mode 100644 index 0000000..108550d --- /dev/null +++ b/lib/stdlib/msize.c @@ -0,0 +1,18 @@ +#ifndef MALLOC_PROVIDED +/* msize.c -- a wrapper for malloc_usable_size. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +size_t +malloc_usable_size (void *ptr) +{ + return _malloc_usable_size_r (_REENT, ptr); +} + +#endif +#endif diff --git a/lib/stdlib/msizer.c b/lib/stdlib/msizer.c new file mode 100644 index 0000000..1d683f4 --- /dev/null +++ b/lib/stdlib/msizer.c @@ -0,0 +1,2 @@ +#define DEFINE_MALLOC_USABLE_SIZE +#include "_mallocr.c" diff --git a/lib/stdlib/mstats.c b/lib/stdlib/mstats.c new file mode 100644 index 0000000..85c20f1 --- /dev/null +++ b/lib/stdlib/mstats.c @@ -0,0 +1,136 @@ +/* VxWorks provides its own version of malloc, and we can't use this + one because VxWorks does not provide sbrk. So we have a hook to + not compile this code. */ + +#ifdef MALLOC_PROVIDED + +int _dummy_mstats = 1; + +#else + +/* +FUNCTION +<>, <>, <>---malloc support + +INDEX + mallinfo +INDEX + malloc_stats +INDEX + mallopt +INDEX + _mallinfo_r +INDEX + _malloc_stats_r +INDEX + _mallopt_r + +SYNOPSIS + #include + struct mallinfo mallinfo(void); + void malloc_stats(void); + int mallopt(int <[parameter]>, <[value]>); + + struct mallinfo _mallinfo_r(void *<[reent]>); + void _malloc_stats_r(void *<[reent]>); + int _mallopt_r(void *<[reent]>, int <[parameter]>, <[value]>); + +DESCRIPTION +<> returns a structure describing the current state of +memory allocation. The structure is defined in malloc.h. The +following fields are defined: <> is the total amount of space +in the heap; <> is the number of chunks which are not in use; +<> is the total amount of space allocated by <>; +<> is the total amount of space not in use; <> is +the size of the top most memory block. + +<> print some statistics about memory allocation on +standard error. + +<> takes a parameter and a value. The parameters are defined +in malloc.h, and may be one of the following: <> +sets the maximum amount of unused space in the top most block before +releasing it back to the system in <> (the space is released by +calling <<_sbrk_r>> with a negative argument); <> is the +amount of padding to allocate whenever <<_sbrk_r>> is called to +allocate more space. + +The alternate functions <<_mallinfo_r>>, <<_malloc_stats_r>>, and +<<_mallopt_r>> are reentrant versions. The extra argument <[reent]> +is a pointer to a reentrancy structure. + +RETURNS +<> returns a mallinfo structure. The structure is defined +in malloc.h. + +<> does not return a result. + +<> returns zero if the parameter could not be set, or +non-zero if it could be set. + +PORTABILITY +<> and <> are provided by SVR4, but <> +takes different parameters on different systems. <> is +not portable. + +*/ + +#include <_ansi.h> +#include +#include +#include +#include + +#ifndef _REENT_ONLY + +struct mallinfo +mallinfo (void) +{ + return _mallinfo_r (_REENT); +} + +#if !defined (_ELIX_LEVEL) || _ELIX_LEVEL >= 2 +void +malloc_stats (void) +{ + _malloc_stats_r (_REENT); +} + +int +mallopt (int p, + int v) +{ + return _mallopt_r (_REENT, p, v); +} + +#endif /* !_ELIX_LEVEL || _ELIX_LEVEL >= 2 */ + +#endif + +#if !defined (_ELIX_LEVEL) || _ELIX_LEVEL >= 2 + +/* mstats is now compatibility code. It used to be real, for a + previous version of the malloc routines. It now just calls + malloc_stats. */ + +void +_mstats_r (struct _reent *ptr, + char *s) +{ + _REENT_SMALL_CHECK_INIT(ptr); + fiprintf (_stderr_r (ptr), "Memory allocation statistics %s\n", s); + _malloc_stats_r (ptr); +} + +#ifndef _REENT_ONLY +void +mstats (char *s) +{ + _mstats_r (_REENT, s); +} + +#endif + +#endif /* !_ELIX_LEVEL || _ELIX_LEVEL >= 2 */ + +#endif /* ! defined (MALLOC_PROVIDED) */ diff --git a/lib/stdlib/mtrim.c b/lib/stdlib/mtrim.c new file mode 100644 index 0000000..bf927fa --- /dev/null +++ b/lib/stdlib/mtrim.c @@ -0,0 +1,18 @@ +#ifndef MALLOC_PROVIDED +/* mtrim.c -- a wrapper for malloc_trim. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +int +malloc_trim (size_t pad) +{ + return _malloc_trim_r (_REENT, pad); +} + +#endif +#endif diff --git a/lib/stdlib/nano-mallocr.c b/lib/stdlib/nano-mallocr.c new file mode 100644 index 0000000..a2b50fa --- /dev/null +++ b/lib/stdlib/nano-mallocr.c @@ -0,0 +1,737 @@ +/* + * Copyright (c) 2012, 2013 ARM Ltd + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the company may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Implementation of <> <> <> <>, optional + * as to be reenterable. + * + * Interface documentation refer to malloc.c. + */ + +#include +#include +#include +#include +#include + +#if DEBUG +#include +#else +#undef assert +#define assert(x) ((void)0) +#endif + +#ifndef MAX +#define MAX(a,b) ((a) >= (b) ? (a) : (b)) +#endif + +#define _SBRK_R(X) _sbrk_r(X) + +#ifdef _LIBC + +#include +#include + +#define RARG struct _reent *reent_ptr, +#define RONEARG struct _reent *reent_ptr +#define RCALL reent_ptr, +#define RONECALL reent_ptr + +#define MALLOC_LOCK __malloc_lock(reent_ptr) +#define MALLOC_UNLOCK __malloc_unlock(reent_ptr) + +#define RERRNO reent_ptr->_errno + +#define nano_malloc _malloc_r +#define nano_free _free_r +#define nano_realloc _realloc_r +#define nano_memalign _memalign_r +#define nano_valloc _valloc_r +#define nano_pvalloc _pvalloc_r +#define nano_calloc _calloc_r +#define nano_cfree _cfree_r +#define nano_malloc_usable_size _malloc_usable_size_r +#define nano_malloc_stats _malloc_stats_r +#define nano_mallinfo _mallinfo_r +#define nano_mallopt _mallopt_r + +#else /* ! _LIBC */ + +#define RARG +#define RONEARG +#define RCALL +#define RONECALL +#define MALLOC_LOCK +#define MALLOC_UNLOCK +#define RERRNO errno + +#define nano_malloc malloc +#define nano_free free +#define nano_realloc realloc +#define nano_memalign memalign +#define nano_valloc valloc +#define nano_pvalloc pvalloc +#define nano_calloc calloc +#define nano_cfree cfree +#define nano_malloc_usable_size malloc_usable_size +#define nano_malloc_stats malloc_stats +#define nano_mallinfo mallinfo +#define nano_mallopt mallopt +#endif /* ! _LIBC */ + +/* Redefine names to avoid conflict with user names */ +#define free_list __malloc_free_list +#define sbrk_start __malloc_sbrk_start +#define current_mallinfo __malloc_current_mallinfo + +#define ALIGN_PTR(ptr, align) \ + (((ptr) + (align) - (intptr_t)1) & ~((align) - (intptr_t)1)) +#define ALIGN_SIZE(size, align) \ + (((size) + (align) - (size_t)1) & ~((align) - (size_t)1)) + +/* Alignment of allocated block */ +#define MALLOC_ALIGN (8U) +#define CHUNK_ALIGN (sizeof(void*)) +#define MALLOC_PADDING ((MAX(MALLOC_ALIGN, CHUNK_ALIGN)) - CHUNK_ALIGN) + +/* as well as the minimal allocation size + * to hold a free pointer */ +#define MALLOC_MINSIZE (sizeof(void *)) +#define MALLOC_PAGE_ALIGN (0x1000) +#define MAX_ALLOC_SIZE (0x80000000U) + +typedef size_t malloc_size_t; + +typedef struct malloc_chunk +{ + /* -------------------------------------- + * chunk->| size | + * -------------------------------------- + * | Padding for alignment | + * | This includes padding inserted by | + * | the compiler (to align fields) and | + * | explicit padding inserted by this | + * | implementation. If any explicit | + * | padding is being used then the | + * | sizeof (size) bytes at | + * | mem_ptr - CHUNK_OFFSET must be | + * | initialized with the negative | + * | offset to size. | + * -------------------------------------- + * mem_ptr->| When allocated: data | + * | When freed: pointer to next free | + * | chunk | + * -------------------------------------- + */ + /* size of the allocated payload area, including size before + CHUNK_OFFSET */ + long size; + + /* since here, the memory is either the next free block, or data load */ + struct malloc_chunk * next; +}chunk; + + +#define CHUNK_OFFSET ((malloc_size_t)(&(((struct malloc_chunk *)0)->next))) + +/* size of smallest possible chunk. A memory piece smaller than this size + * won't be able to create a chunk */ +#define MALLOC_MINCHUNK (CHUNK_OFFSET + MALLOC_PADDING + MALLOC_MINSIZE) + +/* Forward data declarations */ +extern chunk * free_list; +extern char * sbrk_start; +extern struct mallinfo current_mallinfo; + +/* Forward function declarations */ +extern void * nano_malloc(RARG malloc_size_t); +extern void nano_free (RARG void * free_p); +extern void nano_cfree(RARG void * ptr); +extern void * nano_calloc(RARG malloc_size_t n, malloc_size_t elem); +extern void nano_malloc_stats(RONEARG); +extern malloc_size_t nano_malloc_usable_size(RARG void * ptr); +extern void * nano_realloc(RARG void * ptr, malloc_size_t size); +extern void * nano_memalign(RARG size_t align, size_t s); +extern int nano_mallopt(RARG int parameter_number, int parameter_value); +extern void * nano_valloc(RARG size_t s); +extern void * nano_pvalloc(RARG size_t s); + +static inline chunk * get_chunk_from_ptr(void * ptr) +{ + /* Assume that there is no explicit padding in the + chunk, and that the chunk starts at ptr - CHUNK_OFFSET. */ + chunk * c = (chunk *)((char *)ptr - CHUNK_OFFSET); + + /* c->size being negative indicates that there is explicit padding in + the chunk. In which case, c->size is currently the negative offset to + the true size. */ + if (c->size < 0) c = (chunk *)((char *)c + c->size); + return c; +} + +#ifdef DEFINE_MALLOC +/* List list header of free blocks */ +chunk * free_list = NULL; + +/* Starting point of memory allocated from system */ +char * sbrk_start = NULL; + +/** Function sbrk_aligned + * Algorithm: + * Use sbrk() to obtain more memory and ensure it is CHUNK_ALIGN aligned + * Optimise for the case that it is already aligned - only ask for extra + * padding after we know we need it + */ +static void* sbrk_aligned(RARG malloc_size_t s) +{ + char *p, *align_p; + + if (sbrk_start == NULL) sbrk_start = _SBRK_R(RCALL 0); + + p = _SBRK_R(RCALL s); + + /* sbrk returns -1 if fail to allocate */ + if (p == (void *)-1) + return p; + + align_p = (char*)ALIGN_PTR((uintptr_t)p, CHUNK_ALIGN); + if (align_p != p) + { + /* p is not aligned, ask for a few more bytes so that we have s + * bytes reserved from align_p. */ + p = _SBRK_R(RCALL align_p - p); + if (p == (void *)-1) + return p; + } + return align_p; +} + +/** Function nano_malloc + * Algorithm: + * Walk through the free list to find the first match. If fails to find + * one, call sbrk to allocate a new chunk. + */ +void * nano_malloc(RARG malloc_size_t s) +{ + chunk *p, *r; + char * ptr, * align_ptr; + int offset; + + malloc_size_t alloc_size; + + alloc_size = ALIGN_SIZE(s, CHUNK_ALIGN); /* size of aligned data load */ + alloc_size += MALLOC_PADDING; /* padding */ + alloc_size += CHUNK_OFFSET; /* size of chunk head */ + alloc_size = MAX(alloc_size, MALLOC_MINCHUNK); + + if (alloc_size >= MAX_ALLOC_SIZE || alloc_size < s) + { + RERRNO = ENOMEM; + return NULL; + } + + MALLOC_LOCK; + + p = free_list; + r = p; + + while (r) + { + int rem = r->size - alloc_size; + if (rem >= 0) + { + if (rem >= MALLOC_MINCHUNK) + { + if (p == r) + { + /* First item in the list, break it into two chunks + * and return the first one */ + r->size = alloc_size; + free_list = (chunk *)((char *)r + alloc_size); + free_list->size = rem; + free_list->next = r->next; + } else { + /* Any other item in the list. Split and return + * the first one */ + r->size = alloc_size; + p->next = (chunk *)((char *)r + alloc_size); + p->next->size = rem; + p->next->next = r->next; + } + } + /* Find a chunk that is exactly the size or slightly bigger + * than requested size, just return this chunk */ + else if (p == r) + { + /* Now it implies p==r==free_list. Move the free_list + * to next chunk */ + free_list = r->next; + } + else + { + /* Normal case. Remove it from free_list */ + p->next = r->next; + } + break; + } + p=r; + r=r->next; + } + + /* Failed to find a appropriate chunk. Ask for more memory */ + if (r == NULL) + { + r = sbrk_aligned(RCALL alloc_size); + + /* sbrk returns -1 if fail to allocate */ + if (r == (void *)-1) + { + /* sbrk didn't have the requested amount. Let's check + * if the last item in the free list is adjacent to the + * current heap end (sbrk(0)). In that case, only ask + * for the difference in size and merge them */ + p = free_list; + r = p; + + while (r) + { + p=r; + r=r->next; + } + + if (p != NULL && (char *)p + p->size == (char *)_SBRK_R(RCALL 0)) + { + /* The last free item has the heap end as neighbour. + * Let's ask for a smaller amount and merge */ + alloc_size -= p->size; + + if (sbrk_aligned(RCALL alloc_size) != (void *)-1) + { + p->size += alloc_size; + + /* Remove chunk from free_list. Since p != NULL there is + at least one chunk */ + r = free_list; + if (r->next == NULL) + { + /* There is only a single chunk, remove it */ + free_list = NULL; + } + else + { + /* Search for the chunk before the one to be removed */ + while (p != r->next) + { + r = r->next; + } + r->next = NULL; + } + r = p; + } + else + { + RERRNO = ENOMEM; + MALLOC_UNLOCK; + return NULL; + } + } + else + { + RERRNO = ENOMEM; + MALLOC_UNLOCK; + return NULL; + } + } + else + { + r->size = alloc_size; + } + } + MALLOC_UNLOCK; + + ptr = (char *)r + CHUNK_OFFSET; + + align_ptr = (char *)ALIGN_PTR((uintptr_t)ptr, MALLOC_ALIGN); + offset = align_ptr - ptr; + + if (offset) + { + /* Initialize sizeof (malloc_chunk.size) bytes at + align_ptr - CHUNK_OFFSET with negative offset to the + size field (at the start of the chunk). + + The negative offset to size from align_ptr - CHUNK_OFFSET is + the size of any remaining padding minus CHUNK_OFFSET. This is + equivalent to the total size of the padding, because the size of + any remaining padding is the total size of the padding minus + CHUNK_OFFSET. + + Note that the size of the padding must be at least CHUNK_OFFSET. + + The rest of the padding is not initialized. */ + *(long *)((char *)r + offset) = -offset; + } + + assert(align_ptr + size <= (char *)r + alloc_size); + return align_ptr; +} +#endif /* DEFINE_MALLOC */ + +#ifdef DEFINE_FREE +#define MALLOC_CHECK_DOUBLE_FREE + +/** Function nano_free + * Implementation of libc free. + * Algorithm: + * Maintain a global free chunk single link list, headed by global + * variable free_list. + * When free, insert the to-be-freed chunk into free list. The place to + * insert should make sure all chunks are sorted by address from low to + * high. Then merge with neighbor chunks if adjacent. + */ +void nano_free (RARG void * free_p) +{ + chunk * p_to_free; + chunk * p, * q; + + if (free_p == NULL) return; + + p_to_free = get_chunk_from_ptr(free_p); + + MALLOC_LOCK; + if (free_list == NULL) + { + /* Set first free list element */ + p_to_free->next = free_list; + free_list = p_to_free; + MALLOC_UNLOCK; + return; + } + + if (p_to_free < free_list) + { + if ((char *)p_to_free + p_to_free->size == (char *)free_list) + { + /* Chunk to free is just before the first element of + * free list */ + p_to_free->size += free_list->size; + p_to_free->next = free_list->next; + } + else + { + /* Insert before current free_list */ + p_to_free->next = free_list; + } + free_list = p_to_free; + MALLOC_UNLOCK; + return; + } + + q = free_list; + /* Walk through the free list to find the place for insert. */ + do + { + p = q; + q = q->next; + } while (q && q <= p_to_free); + + /* Now p <= p_to_free and either q == NULL or q > p_to_free + * Try to merge with chunks immediately before/after it. */ + + if ((char *)p + p->size == (char *)p_to_free) + { + /* Chunk to be freed is adjacent + * to a free chunk before it */ + p->size += p_to_free->size; + /* If the merged chunk is also adjacent + * to the chunk after it, merge again */ + if ((char *)p + p->size == (char *) q) + { + p->size += q->size; + p->next = q->next; + } + } +#ifdef MALLOC_CHECK_DOUBLE_FREE + else if ((char *)p + p->size > (char *)p_to_free) + { + /* Report double free fault */ + RERRNO = ENOMEM; + MALLOC_UNLOCK; + return; + } +#endif + else if ((char *)p_to_free + p_to_free->size == (char *) q) + { + /* Chunk to be freed is adjacent + * to a free chunk after it */ + p_to_free->size += q->size; + p_to_free->next = q->next; + p->next = p_to_free; + } + else + { + /* Not adjacent to any chunk. Just insert it. Resulting + * a fragment. */ + p_to_free->next = q; + p->next = p_to_free; + } + MALLOC_UNLOCK; +} +#endif /* DEFINE_FREE */ + +#ifdef DEFINE_CFREE +void nano_cfree(RARG void * ptr) +{ + nano_free(RCALL ptr); +} +#endif /* DEFINE_CFREE */ + +#ifdef DEFINE_CALLOC +/* Function nano_calloc + * Implement calloc simply by calling malloc and set zero */ +void * nano_calloc(RARG malloc_size_t n, malloc_size_t elem) +{ + malloc_size_t bytes; + void * mem; + + if (__builtin_mul_overflow (n, elem, &bytes)) + { + RERRNO = ENOMEM; + return NULL; + } + mem = nano_malloc(RCALL bytes); + if (mem != NULL) memset(mem, 0, bytes); + return mem; +} +#endif /* DEFINE_CALLOC */ + +#ifdef DEFINE_REALLOC +/* Function nano_realloc + * Implement realloc by malloc + memcpy */ +void * nano_realloc(RARG void * ptr, malloc_size_t size) +{ + void * mem; + chunk * p_to_realloc; + malloc_size_t old_size; + + if (ptr == NULL) return nano_malloc(RCALL size); + + if (size == 0) + { + nano_free(RCALL ptr); + return NULL; + } + + old_size = nano_malloc_usable_size(RCALL ptr); + if (size <= old_size && (old_size >> 1) < size) + return ptr; + + mem = nano_malloc(RCALL size); + if (mem != NULL) + { + if (old_size > size) + old_size = size; + memcpy(mem, ptr, old_size); + nano_free(RCALL ptr); + } + return mem; +} +#endif /* DEFINE_REALLOC */ + +#ifdef DEFINE_MALLINFO +struct mallinfo current_mallinfo={0,0,0,0,0,0,0,0,0,0}; + +struct mallinfo nano_mallinfo(RONEARG) +{ + char * sbrk_now; + chunk * pf; + size_t free_size = 0; + size_t total_size; + + MALLOC_LOCK; + + if (sbrk_start == NULL) total_size = 0; + else { + sbrk_now = _SBRK_R(RCALL 0); + + if (sbrk_now == (void *)-1) + total_size = (size_t)-1; + else + total_size = (size_t) (sbrk_now - sbrk_start); + } + + for (pf = free_list; pf; pf = pf->next) + free_size += pf->size; + + current_mallinfo.arena = total_size; + current_mallinfo.fordblks = free_size; + current_mallinfo.uordblks = total_size - free_size; + + MALLOC_UNLOCK; + return current_mallinfo; +} +#endif /* DEFINE_MALLINFO */ + +#ifdef DEFINE_MALLOC_STATS +void nano_malloc_stats(RONEARG) +{ + nano_mallinfo(RONECALL); + fiprintf(stderr, "max system bytes = %10u\n", + current_mallinfo.arena); + fiprintf(stderr, "system bytes = %10u\n", + current_mallinfo.arena); + fiprintf(stderr, "in use bytes = %10u\n", + current_mallinfo.uordblks); +} +#endif /* DEFINE_MALLOC_STATS */ + +#ifdef DEFINE_MALLOC_USABLE_SIZE +malloc_size_t nano_malloc_usable_size(RARG void * ptr) +{ + chunk * c = (chunk *)((char *)ptr - CHUNK_OFFSET); + int size_or_offset = c->size; + + if (size_or_offset < 0) + { + /* Padding is used. Excluding the padding size */ + c = (chunk *)((char *)c + c->size); + return c->size - CHUNK_OFFSET + size_or_offset; + } + return c->size - CHUNK_OFFSET; +} +#endif /* DEFINE_MALLOC_USABLE_SIZE */ + +#ifdef DEFINE_MEMALIGN +/* Function nano_memalign + * Allocate memory block aligned at specific boundary. + * align: required alignment. Must be power of 2. Return NULL + * if not power of 2. Undefined behavior is bigger than + * pointer value range. + * s: required size. + * Return: allocated memory pointer aligned to align + * Algorithm: Malloc a big enough block, padding pointer to aligned + * address, then truncate and free the tail if too big. + * Record the offset of align pointer and original pointer + * in the padding area. + */ +void * nano_memalign(RARG size_t align, size_t s) +{ + chunk * chunk_p; + malloc_size_t size_allocated, offset, ma_size, size_with_padding; + char * allocated, * aligned_p; + + /* Return NULL if align isn't power of 2 */ + if ((align & (align-1)) != 0) return NULL; + + align = MAX(align, MALLOC_ALIGN); + + /* Make sure ma_size does not overflow */ + if (s > __SIZE_MAX__ - CHUNK_ALIGN) + { + RERRNO = ENOMEM; + return NULL; + } + ma_size = ALIGN_SIZE(MAX(s, MALLOC_MINSIZE), CHUNK_ALIGN); + + /* Make sure size_with_padding does not overflow */ + if (ma_size > __SIZE_MAX__ - (align - MALLOC_ALIGN)) + { + RERRNO = ENOMEM; + return NULL; + } + size_with_padding = ma_size + (align - MALLOC_ALIGN); + + allocated = nano_malloc(RCALL size_with_padding); + if (allocated == NULL) return NULL; + + chunk_p = get_chunk_from_ptr(allocated); + aligned_p = (char *)ALIGN_PTR( + (uintptr_t)((char *)chunk_p + CHUNK_OFFSET), + (uintptr_t)align); + offset = aligned_p - ((char *)chunk_p + CHUNK_OFFSET); + + if (offset) + { + if (offset >= MALLOC_MINCHUNK) + { + /* Padding is too large, free it */ + chunk * front_chunk = chunk_p; + chunk_p = (chunk *)((char *)chunk_p + offset); + chunk_p->size = front_chunk->size - offset; + front_chunk->size = offset; + nano_free(RCALL (char *)front_chunk + CHUNK_OFFSET); + } + else + { + /* Padding is used. Need to set a jump offset for aligned pointer + * to get back to chunk head */ + assert(offset >= sizeof(int)); + *(long *)((char *)chunk_p + offset) = -offset; + } + } + + size_allocated = chunk_p->size; + if ((char *)chunk_p + size_allocated > + (aligned_p + ma_size + MALLOC_MINCHUNK)) + { + /* allocated much more than what's required for padding, free + * tail part */ + chunk * tail_chunk = (chunk *)(aligned_p + ma_size); + chunk_p->size = aligned_p + ma_size - (char *)chunk_p; + tail_chunk->size = size_allocated - chunk_p->size; + nano_free(RCALL (char *)tail_chunk + CHUNK_OFFSET); + } + return aligned_p; +} +#endif /* DEFINE_MEMALIGN */ + +#ifdef DEFINE_MALLOPT +int nano_mallopt(RARG int parameter_number, int parameter_value) +{ + return 0; +} +#endif /* DEFINE_MALLOPT */ + +#ifdef DEFINE_VALLOC +void * nano_valloc(RARG size_t s) +{ + return nano_memalign(RCALL MALLOC_PAGE_ALIGN, s); +} +#endif /* DEFINE_VALLOC */ + +#ifdef DEFINE_PVALLOC +void * nano_pvalloc(RARG size_t s) +{ + /* Make sure size given to nano_valloc does not overflow */ + if (s > __SIZE_MAX__ - MALLOC_PAGE_ALIGN) + { + RERRNO = ENOMEM; + return NULL; + } + return nano_valloc(RCALL ALIGN_SIZE(s, MALLOC_PAGE_ALIGN)); +} +#endif /* DEFINE_PVALLOC */ diff --git a/lib/stdlib/nrand48.c b/lib/stdlib/nrand48.c new file mode 100644 index 0000000..cca0e5f --- /dev/null +++ b/lib/stdlib/nrand48.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +long +_nrand48_r (struct _reent *r, + unsigned short xseed[3]) +{ + __dorand48 (r, xseed); + return (long)((unsigned long) xseed[2] << 15) + + ((unsigned long) xseed[1] >> 1); +} + +#ifndef _REENT_ONLY +long +nrand48 (unsigned short xseed[3]) +{ + return _nrand48_r (_REENT, xseed); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/on_exit.c b/lib/stdlib/on_exit.c new file mode 100644 index 0000000..2eaf035 --- /dev/null +++ b/lib/stdlib/on_exit.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + * + * This function is a modified version of atexit.c + */ + +/* +FUNCTION +<>---request execution of function with argument at program exit + +INDEX + on_exit + +SYNOPSIS + #include + int on_exit (void (*<[function]>)(int, void *), void *<[arg]>); + +DESCRIPTION +You can use <> to enroll functions in a list of functions that +will be called when your program terminates normally. The argument is +a pointer to a user-defined function which takes two arguments. The +first is the status code passed to exit and the second argument is of type +pointer to void. The function must not return a result. The value +of <[arg]> is registered and passed as the argument to <[function]>. + +The functions are kept in a LIFO stack; that is, the last function +enrolled by <> or <> will be the first to execute when +your program exits. You can intermix functions using <> and +<>. + +There is no built-in limit to the number of functions you can enroll +in this list; however, after every group of 32 functions is enrolled, +<>/<> will call <> to get space for the next part +of the list. The initial list of 32 functions is statically allocated, so +you can always count on at least that many slots available. + +RETURNS +<> returns <<0>> if it succeeds in enrolling your function, +<<-1>> if it fails (possible only if no space was available for +<> to extend the list of functions). + +PORTABILITY +<> is a non-standard glibc extension + +Supporting OS subroutines required: None +*/ + +#include +#include +#include "atexit.h" + +#ifdef _REENT_SMALL + +#include "on_exit_args.h" + +/* force linking of static instance of _on_exit_args */ +const void * const __on_exit_dummy = &__on_exit_args; + +#endif /* def _REENT_SMALL */ + +/* + * Register a function to be performed at exit. + */ + +int +on_exit (void (*fn) (int, void *), + void *arg) +{ + return __register_exitproc (__et_onexit, (void (*)(void)) fn, arg, NULL); +} diff --git a/lib/stdlib/on_exit_args.c b/lib/stdlib/on_exit_args.c new file mode 100644 index 0000000..88f9ffd --- /dev/null +++ b/lib/stdlib/on_exit_args.c @@ -0,0 +1,30 @@ +/* + * Static instance of _on_exit_args struct. + * + * When _REENT_SMALL is used, _atexit struct only contains a pointer to + * _on_exit_args struct, so this was always allocated with malloc() - even for + * the first 32 calls of atexit()-like functions, which are guaranteed to + * succeed, but could fail because of "out of memory" error. This is even worse + * when _ATEXIT_DYNAMIC_ALLOC is _NOT_ defined, in which case malloc() is not + * used by internals of atexit()-like functions. In such configuration all calls + * to the functions that need _on_exit_args struct (on_exit() and + * __cxa_atexit()) would fail. + * + * Thats why a static instance of _on_exit_args struct is provided for + * _REENT_SMALL configuration. This way the first 32 calls to atexit()-like + * functions don't need malloc() and will always succeed. + * + * Because this struct is not needed for "normal" atexit(), it is used as a weak + * reference in __register_exitproc(), but any use of on_exit() or + * __cxa_atexit() will force it to be linked. + */ + +#include + +#ifdef _REENT_SMALL + +static struct _on_exit_args _on_exit_args_instance = {{_NULL}, {_NULL}, 0, 0}; + +struct _on_exit_args * const __on_exit_args = &_on_exit_args_instance; + +#endif /* def _REENT_SMALL */ diff --git a/lib/stdlib/on_exit_args.h b/lib/stdlib/on_exit_args.h new file mode 100644 index 0000000..c54ad1e --- /dev/null +++ b/lib/stdlib/on_exit_args.h @@ -0,0 +1,12 @@ +#ifndef NEWLIB_CYGWIN_NEWLIB_LIBC_STDLIB_ON_EXIT_ARGS_H_ +#define NEWLIB_CYGWIN_NEWLIB_LIBC_STDLIB_ON_EXIT_ARGS_H_ + +#include + +#ifdef _REENT_SMALL + +extern struct _on_exit_args * const __on_exit_args; + +#endif /* def _REENT_SMALL */ + +#endif /* def NEWLIB_CYGWIN_NEWLIB_LIBC_STDLIB_ON_EXIT_ARGS_H_ */ diff --git a/lib/stdlib/putenv.c b/lib/stdlib/putenv.c new file mode 100644 index 0000000..10b0657 --- /dev/null +++ b/lib/stdlib/putenv.c @@ -0,0 +1,30 @@ +/*- + * Copyright (c) 1988 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _REENT_ONLY + +#include +#include + +int +putenv (char *str) +{ + return _putenv_r (_REENT, str); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/putenv_r.c b/lib/stdlib/putenv_r.c new file mode 100644 index 0000000..459348b --- /dev/null +++ b/lib/stdlib/putenv_r.c @@ -0,0 +1,55 @@ +/* This file may have been modified by DJ Delorie (Jan 1991). If so, +** these modifications are Copyright (C) 1991 DJ Delorie. +*/ + +/*- + * Copyright (c) 1988 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include +#include +#include + +#include "envlock.h" + +/* _putenv_r - reentrant version of putenv that either adds + or replaces the environment variable "name" + with "value" which is specified by str as "name=value". */ +int +_putenv_r (struct _reent *reent_ptr, + char *str) +{ + register char *p, *equal; + int rval; + + p = _strdup_r (reent_ptr, str); + + if (!p) + return 1; + + if (!(equal = strchr (p, '='))) + { + (void) _free_r (reent_ptr, p); + return 1; + } + + *equal = '\0'; + rval = _setenv_r (reent_ptr, p, equal + 1, 1); + (void) _free_r (reent_ptr, p); + + return rval; +} diff --git a/lib/stdlib/pvallocr.c b/lib/stdlib/pvallocr.c new file mode 100644 index 0000000..afc2038 --- /dev/null +++ b/lib/stdlib/pvallocr.c @@ -0,0 +1,2 @@ +#define DEFINE_PVALLOC +#include "_mallocr.c" diff --git a/lib/stdlib/quick_exit.c b/lib/stdlib/quick_exit.c new file mode 100644 index 0000000..5ab2609 --- /dev/null +++ b/lib/stdlib/quick_exit.c @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2011 David Chisnall + * Copyright (c) 2015 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +#include +#include + +/** + * Linked list of quick exit handlers. This is simpler than the atexit() + * version, because it is not required to support C++ destructors or + * DSO-specific cleanups. + */ +struct quick_exit_handler { + struct quick_exit_handler *next; + void (*cleanup)(void); +}; + +/** + * Lock protecting the handlers list. + */ +#ifndef __SINGLE_THREAD__ +__LOCK_INIT(static, __at_quick_exit_mutex); +#endif +/** + * Stack of cleanup handlers. These will be invoked in reverse order when + */ +static struct quick_exit_handler *handlers; + +int +at_quick_exit(void (*func)(void)) +{ + struct quick_exit_handler *h; + + h = malloc(sizeof(*h)); + + if (NULL == h) + return (1); + h->cleanup = func; +#ifndef __SINGLE_THREAD__ + __lock_acquire(__at_quick_exit_mutex); +#endif + h->next = handlers; + handlers = h; +#ifndef __SINGLE_THREAD__ + __lock_release(__at_quick_exit_mutex); +#endif + return (0); +} + +void +quick_exit(int status) +{ + struct quick_exit_handler *h; + + /* + * XXX: The C++ spec requires us to call std::terminate if there is an + * exception here. + */ + for (h = handlers; NULL != h; h = h->next) + h->cleanup(); + _exit(status); +} diff --git a/lib/stdlib/rand.c b/lib/stdlib/rand.c new file mode 100644 index 0000000..ba9cc80 --- /dev/null +++ b/lib/stdlib/rand.c @@ -0,0 +1,88 @@ +/* +FUNCTION +<>, <>---pseudo-random numbers + +INDEX + rand +INDEX + srand +INDEX + rand_r + +SYNOPSIS + #include + int rand(void); + void srand(unsigned int <[seed]>); + int rand_r(unsigned int *<[seed]>); + +DESCRIPTION +<> returns a different integer each time it is called; each +integer is chosen by an algorithm designed to be unpredictable, so +that you can use <> when you require a random number. +The algorithm depends on a static variable called the ``random seed''; +starting with a given value of the random seed always produces the +same sequence of numbers in successive calls to <>. + +You can set the random seed using <>; it does nothing beyond +storing its argument in the static variable used by <>. You can +exploit this to make the pseudo-random sequence less predictable, if +you wish, by using some other unpredictable value (often the least +significant parts of a time-varying value) as the random seed before +beginning a sequence of calls to <>; or, if you wish to ensure +(for example, while debugging) that successive runs of your program +use the same ``random'' numbers, you can use <> to set the same +random seed at the outset. + +RETURNS +<> returns the next pseudo-random integer in sequence; it is a +number between <<0>> and <> (inclusive). + +<> does not return a result. + +NOTES +<> and <> are unsafe for multi-threaded applications. +<> is thread-safe and should be used instead. + + +PORTABILITY +<> is required by ANSI, but the algorithm for pseudo-random +number generation is not specified; therefore, even if you use +the same random seed, you cannot expect the same sequence of results +on two different systems. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local unsigned long long _tls_rand_next = 1; +#endif + +void +srand (unsigned int seed) +{ + struct _reent *reent = _REENT; + + _REENT_CHECK_RAND48(reent); + _REENT_RAND_NEXT(reent) = seed; +} + +int +rand (void) +{ + struct _reent *reent = _REENT; + + /* This multiplier was obtained from Knuth, D.E., "The Art of + Computer Programming," Vol 2, Seminumerical Algorithms, Third + Edition, Addison-Wesley, 1998, p. 106 (line 26) & p. 108 */ + _REENT_CHECK_RAND48(reent); + _REENT_RAND_NEXT(reent) = + _REENT_RAND_NEXT(reent) * __extension__ 6364136223846793005LL + 1; + return (int)((_REENT_RAND_NEXT(reent) >> 32) & RAND_MAX); +} + +#endif /* _REENT_ONLY */ diff --git a/lib/stdlib/rand48.c b/lib/stdlib/rand48.c new file mode 100644 index 0000000..626b3ef --- /dev/null +++ b/lib/stdlib/rand48.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +/* +FUNCTION + <>, <>, <>, <>, <>, <>, <>, <>, <>, <>---pseudo-random number generators and initialization routines + +INDEX + rand48 +INDEX + drand48 +INDEX + erand48 +INDEX + lrand48 +INDEX + nrand48 +INDEX + mrand48 +INDEX + jrand48 +INDEX + srand48 +INDEX + seed48 +INDEX + lcong48 + +SYNOPSIS + #include + double drand48(void); + double erand48(unsigned short <[xseed]>[3]); + long lrand48(void); + long nrand48(unsigned short <[xseed]>[3]); + long mrand48(void); + long jrand48(unsigned short <[xseed]>[3]); + void srand48(long <[seed]>); + unsigned short *seed48(unsigned short <[xseed]>[3]); + void lcong48(unsigned short <[p]>[7]); + +DESCRIPTION +The <> family of functions generates pseudo-random numbers +using a linear congruential algorithm working on integers 48 bits in size. +The particular formula employed is +r(n+1) = (a * r(n) + c) mod m +where the default values are +for the multiplicand a = 0xfdeece66d = 25214903917 and +the addend c = 0xb = 11. The modulo is always fixed at m = 2 ** 48. +r(n) is called the seed of the random number generator. + +For all the six generator routines described next, the first +computational step is to perform a single iteration of the algorithm. + +<> and <> +return values of type double. The full 48 bits of r(n+1) are +loaded into the mantissa of the returned value, with the exponent set +such that the values produced lie in the interval [0.0, 1.0]. + +<> and <> +return values of type long in the range +[0, 2**31-1]. The high-order (31) bits of +r(n+1) are loaded into the lower bits of the returned value, with +the topmost (sign) bit set to zero. + +<> and <> +return values of type long in the range +[-2**31, 2**31-1]. The high-order (32) bits of +r(n+1) are loaded into the returned value. + +<>, <>, and <> +use an internal buffer to store r(n). For these functions +the initial value of r(0) = 0x1234abcd330e = 20017429951246. + +On the other hand, <>, <>, and <> +use a user-supplied buffer to store the seed r(n), +which consists of an array of 3 shorts, where the zeroth member +holds the least significant bits. + +All functions share the same multiplicand and addend. + +<> is used to initialize the internal buffer r(n) of +<>, <>, and <> +such that the 32 bits of the seed value are copied into the upper 32 bits +of r(n), with the lower 16 bits of r(n) arbitrarily being set to 0x330e. +Additionally, the constant multiplicand and addend of the algorithm are +reset to the default values given above. + +<> also initializes the internal buffer r(n) of +<>, <>, and <>, +but here all 48 bits of the seed can be specified in an array of 3 shorts, +where the zeroth member specifies the lowest bits. Again, +the constant multiplicand and addend of the algorithm are +reset to the default values given above. +<> returns a pointer to an array of 3 shorts which contains +the old seed. +This array is statically allocated, thus its contents are lost after +each new call to <>. + +Finally, <> allows full control over the multiplicand and +addend used in <>, <>, <>, <>, +<>, and <>, +and the seed used in <>, <>, and <>. +An array of 7 shorts is passed as parameter; the first three shorts are +used to initialize the seed; the second three are used to initialize the +multiplicand; and the last short is used to initialize the addend. +It is thus not possible to use values greater than 0xffff as the addend. + +Note that all three methods of seeding the random number generator +always also set the multiplicand and addend for any of the six +generator calls. + +For a more powerful random number generator, see <>. + +PORTABILITY +SUS requires these functions. + +No supporting OS subroutines are required. +*/ + +#include "rand48.h" + +void +__dorand48 (struct _reent *r, + unsigned short xseed[3]) +{ + unsigned long accu; + unsigned short temp[2]; + + _REENT_CHECK_RAND48(r); + accu = (unsigned long) __rand48_mult[0] * (unsigned long) xseed[0] + + (unsigned long) __rand48_add; + temp[0] = (unsigned short) accu; /* lower 16 bits */ + accu >>= sizeof(unsigned short) * 8; + accu += (unsigned long) __rand48_mult[0] * (unsigned long) xseed[1] + + (unsigned long) __rand48_mult[1] * (unsigned long) xseed[0]; + temp[1] = (unsigned short) accu; /* middle 16 bits */ + accu >>= sizeof(unsigned short) * 8; + accu += __rand48_mult[0] * xseed[2] + __rand48_mult[1] * xseed[1] + __rand48_mult[2] * xseed[0]; + xseed[0] = temp[0]; + xseed[1] = temp[1]; + xseed[2] = (unsigned short) accu; +} diff --git a/lib/stdlib/rand48.h b/lib/stdlib/rand48.h new file mode 100644 index 0000000..26455e3 --- /dev/null +++ b/lib/stdlib/rand48.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#ifndef _RAND48_H_ +#define _RAND48_H_ + +#include +#include + +extern void __dorand48 (struct _reent *r, unsigned short[3]); +#define __rand48_seed _REENT_RAND48_SEED(r) +#define __rand48_mult _REENT_RAND48_MULT(r) +#define __rand48_add _REENT_RAND48_ADD(r) + +#if 0 +/* following values are defined in */ +#define RAND48_SEED_0 (0x330e) +#define RAND48_SEED_1 (0xabcd) +#define RAND48_SEED_2 (0x1234) +#define RAND48_MULT_0 (0xe66d) +#define RAND48_MULT_1 (0xdeec) +#define RAND48_MULT_2 (0x0005) +#define RAND48_ADD (0x000b) +#endif + +#endif /* _RAND48_H_ */ diff --git a/lib/stdlib/rand_r.c b/lib/stdlib/rand_r.c new file mode 100644 index 0000000..0670285 --- /dev/null +++ b/lib/stdlib/rand_r.c @@ -0,0 +1,37 @@ +#include + +/* Pseudo-random generator based on Minimal Standard by + Lewis, Goodman, and Miller in 1969. + + I[j+1] = a*I[j] (mod m) + + where a = 16807 + m = 2147483647 + + Using Schrage's algorithm, a*I[j] (mod m) can be rewritten as: + + a*(I[j] mod q) - r*{I[j]/q} if >= 0 + a*(I[j] mod q) - r*{I[j]/q} + m otherwise + + where: {} denotes integer division + q = {m/a} = 127773 + r = m (mod a) = 2836 + + note that the seed value of 0 cannot be used in the calculation as + it results in 0 itself +*/ + +int +rand_r (unsigned int *seed) +{ + long k; + long s = (long)(*seed); + if (s == 0) + s = 0x12345987; + k = s / 127773; + s = 16807 * (s - k * 127773) - 2836 * k; + if (s < 0) + s += 2147483647; + (*seed) = (unsigned int)s; + return (int)(s & RAND_MAX); +} diff --git a/lib/stdlib/random.c b/lib/stdlib/random.c new file mode 100644 index 0000000..131dc05 --- /dev/null +++ b/lib/stdlib/random.c @@ -0,0 +1,82 @@ +/* +FUNCTION +<>, <>---pseudo-random numbers + +INDEX + random +INDEX + srandom + +SYNOPSIS + #define _XOPEN_SOURCE 500 + #include + long int random(void); + void srandom(unsigned int <[seed]>); + + + +DESCRIPTION +<> returns a different integer each time it is called; each +integer is chosen by an algorithm designed to be unpredictable, so +that you can use <> when you require a random number. +The algorithm depends on a static variable called the ``random seed''; +starting with a given value of the random seed always produces the +same sequence of numbers in successive calls to <>. + +You can set the random seed using <>; it does nothing beyond +storing its argument in the static variable used by <>. You can +exploit this to make the pseudo-random sequence less predictable, if +you wish, by using some other unpredictable value (often the least +significant parts of a time-varying value) as the random seed before +beginning a sequence of calls to <>; or, if you wish to ensure +(for example, while debugging) that successive runs of your program +use the same ``random'' numbers, you can use <> to set the same +random seed at the outset. + +RETURNS +<> returns the next pseudo-random integer in sequence; it is a +number between <<0>> and <> (inclusive). + +<> does not return a result. + +NOTES +<> and <> are unsafe for multi-threaded applications. + +_XOPEN_SOURCE may be any value >= 500. + +PORTABILITY +<> is required by XSI. This implementation uses the same +algorithm as <>. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include + +void +srandom (unsigned int seed) +{ + struct _reent *reent = _REENT; + + _REENT_CHECK_RAND48(reent); + _REENT_RAND_NEXT(reent) = seed; +} + +long int +random (void) +{ + struct _reent *reent = _REENT; + + /* This multiplier was obtained from Knuth, D.E., "The Art of + Computer Programming," Vol 2, Seminumerical Algorithms, Third + Edition, Addison-Wesley, 1998, p. 106 (line 26) & p. 108 */ + _REENT_CHECK_RAND48(reent); + _REENT_RAND_NEXT(reent) = + _REENT_RAND_NEXT(reent) * __extension__ 6364136223846793005LL + 1; + return (long int)((_REENT_RAND_NEXT(reent) >> 32) & RAND_MAX); +} + +#endif /* _REENT_ONLY */ diff --git a/lib/stdlib/realloc.c b/lib/stdlib/realloc.c new file mode 100644 index 0000000..999e8e0 --- /dev/null +++ b/lib/stdlib/realloc.c @@ -0,0 +1,21 @@ +#ifdef MALLOC_PROVIDED +int _dummy_realloc = 1; +#else +/* realloc.c -- a wrapper for realloc_r. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +void * +realloc (void *ap, + size_t nbytes) +{ + return _realloc_r (_REENT, ap, nbytes); +} + +#endif +#endif /* MALLOC_PROVIDED */ diff --git a/lib/stdlib/reallocarray.c b/lib/stdlib/reallocarray.c new file mode 100644 index 0000000..d1f63c6 --- /dev/null +++ b/lib/stdlib/reallocarray.c @@ -0,0 +1,35 @@ +/* $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $ */ +/* + * Copyright (c) 2008 Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include + +void * +reallocarray(void *optr, size_t nmemb, size_t size) +{ + ptrdiff_t bytes; + + if (__builtin_mul_overflow (nmemb, size, &bytes)) + { + errno = ENOMEM; + return NULL; + } + return realloc(optr, bytes); +} diff --git a/lib/stdlib/reallocf.c b/lib/stdlib/reallocf.c new file mode 100644 index 0000000..d62752a --- /dev/null +++ b/lib/stdlib/reallocf.c @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 1998, M. Warner Losh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Documented in malloc.c. */ + +#include + +#include + +void * +_reallocf_r (struct _reent *reentptr, + void *ptr, + size_t size) +{ + void *nptr; + + nptr = _realloc_r(reentptr, ptr, size); + if (!nptr && ptr) + _free_r(reentptr, ptr); + return (nptr); +} + +#ifndef _REENT_ONLY +void * +reallocf (void *ptr, + size_t size) +{ + return _reallocf_r(_REENT, ptr, size); +} +#endif diff --git a/lib/stdlib/reallocr.c b/lib/stdlib/reallocr.c new file mode 100644 index 0000000..45c21d2 --- /dev/null +++ b/lib/stdlib/reallocr.c @@ -0,0 +1,2 @@ +#define DEFINE_REALLOC +#include "_mallocr.c" diff --git a/lib/stdlib/rpmatch.c b/lib/stdlib/rpmatch.c new file mode 100644 index 0000000..42a3513 --- /dev/null +++ b/lib/stdlib/rpmatch.c @@ -0,0 +1,82 @@ +/* +FUNCTION +<>---determine whether response to question is affirmative or negative + +INDEX + rpmatch + +SYNOPSIS + #include + int rpmatch(const char *<[response]>); + +DESCRIPTION +The <> function determines whether <[response]> is an affirmative +or negative response to a question according to the current locale. + +RETURNS +<> returns 1 if <[response]> is affirmative, 0 if negative, or -1 +if not recognized as either. + +PORTABILITY +<> is a BSD extension also found in glibc. + +NOTES +No supporting OS subroutines are required. +*/ + +/* This code is originally taken from FreeBSD. */ +/*- + * Copyright (c) 2004-2005 Tim J. Robbins. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include +#include + +int +rpmatch (const char *response) +{ + regex_t yes, no; + int ret; + + if (regcomp(&yes, nl_langinfo(YESEXPR), REG_EXTENDED|REG_NOSUB) != 0) + return (-1); + if (regcomp(&no, nl_langinfo(NOEXPR), REG_EXTENDED|REG_NOSUB) != 0) { + regfree(&yes); + return (-1); + } + if (regexec(&yes, response, 0, NULL, 0) == 0) + ret = 1; + else if (regexec(&no, response, 0, NULL, 0) == 0) + ret = 0; + else + ret = -1; + regfree(&yes); + regfree(&no); + return (ret); +} diff --git a/lib/stdlib/sb_charsets.c b/lib/stdlib/sb_charsets.c new file mode 100644 index 0000000..4984a2f --- /dev/null +++ b/lib/stdlib/sb_charsets.c @@ -0,0 +1,813 @@ +#include +#include + +#ifdef _MB_CAPABLE +#ifdef _MB_EXTENDED_CHARSETS_ISO +/* Tables for the ISO-8859-x to UTF conversion. The first index into the + table is a value computed from the value x (function __iso_8859_index), + the second index is the value of the incoming character - 0xa0. + Values < 0xa0 don't have to be converted anyway. */ +wchar_t __iso_8859_conv[14][0x60] = { + /* ISO-8859-2 */ + { 0xa0, 0x104, 0x2d8, 0x141, 0xa4, 0x13d, 0x15a, 0xa7, + 0xa8, 0x160, 0x15e, 0x164, 0x179, 0xad, 0x17d, 0x17b, + 0xb0, 0x105, 0x2db, 0x142, 0xb4, 0x13e, 0x15b, 0x2c7, + 0xb8, 0x161, 0x15f, 0x165, 0x17a, 0x2dd, 0x17e, 0x17c, + 0x154, 0xc1, 0xc2, 0x102, 0xc4, 0x139, 0x106, 0xc7, + 0x10c, 0xc9, 0x118, 0xcb, 0x11a, 0xcd, 0xce, 0x10e, + 0x110, 0x143, 0x147, 0xd3, 0xd4, 0x150, 0xd6, 0xd7, + 0x158, 0x16e, 0xda, 0x170, 0xdc, 0xdd, 0x162, 0xdf, + 0x155, 0xe1, 0xe2, 0x103, 0xe4, 0x13a, 0x107, 0xe7, + 0x10d, 0xe9, 0x119, 0xeb, 0x11b, 0xed, 0xee, 0x10f, + 0x111, 0x144, 0x148, 0xf3, 0xf4, 0x151, 0xf6, 0xf7, + 0x159, 0x16f, 0xfa, 0x171, 0xfc, 0xfd, 0x163, 0x2d9 }, + /* ISO-8859-3 */ + { 0xa0, 0x126, 0x2d8, 0xa3, 0xa4, 0xf7f5, 0x124, 0xa7, + 0xa8, 0x130, 0x15e, 0x11e, 0x134, 0xad, 0xf7f6, 0x17b, + 0xb0, 0x127, 0xb2, 0xb3, 0xb4, 0xb5, 0x125, 0xb7, + 0xb8, 0x131, 0x15f, 0x11f, 0x135, 0xbd, 0xf7f7, 0x17c, + 0xc0, 0xc1, 0xc2, 0xf7f8, 0xc4, 0x10a, 0x108, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xf7f9, 0xd1, 0xd2, 0xd3, 0xd4, 0x120, 0xd6, 0xd7, + 0x11c, 0xd9, 0xda, 0xdb, 0xdc, 0x16c, 0x15c, 0xdf, + 0xe0, 0xe1, 0xe2, 0xf7fa, 0xe4, 0x10b, 0x109, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf7fb, 0xf1, 0xf2, 0xf3, 0xf4, 0x121, 0xf6, 0xf7, + 0x11d, 0xf9, 0xfa, 0xfb, 0xfc, 0x16d, 0x15d, 0x2d9 }, + /* ISO-8859-4 */ + { 0xa0, 0x104, 0x138, 0x156, 0xa4, 0x128, 0x13b, 0xa7, + 0xa8, 0x160, 0x112, 0x122, 0x166, 0xad, 0x17d, 0xaf, + 0xb0, 0x105, 0x2db, 0x157, 0xb4, 0x129, 0x13c, 0x2c7, + 0xb8, 0x161, 0x113, 0x123, 0x167, 0x14a, 0x17e, 0x14b, + 0x100, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x12e, + 0x10c, 0xc9, 0x118, 0xcb, 0x116, 0xcd, 0xce, 0x12a, + 0x110, 0x145, 0x14c, 0x136, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0x172, 0xda, 0xdb, 0xdc, 0x168, 0x16a, 0xdf, + 0x101, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x12f, + 0x10d, 0xe9, 0x119, 0xeb, 0x117, 0xed, 0xee, 0x12b, + 0x111, 0x146, 0x14d, 0x137, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0x173, 0xfa, 0xfb, 0xfc, 0x169, 0x16b, 0x2d9 }, + /* ISO-8859-5 */ + { 0xa0, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, + 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0xad, 0x40e, 0x40f, + 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, + 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f, + 0x2116, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, + 0x458, 0x459, 0x45a, 0x45b, 0x45c, 0xa7, 0x45e, 0x45f }, + /* ISO-8859-6 */ + { 0xa0, 0xf7c8, 0xf7c9, 0xf7ca, 0xa4, 0xf7cb, 0xf7cc, 0xf7cd, + 0xf7ce, 0xf7cf, 0xf7d0, 0xf7d1, 0x60c, 0xad, 0xf7d2, 0xf7d3, + 0xf7d4, 0xf7d5, 0xf7d6, 0xf7d7, 0xf7d8, 0xf7d9, 0xf7da, 0xf7db, + 0xf7dc, 0xf7dd, 0xf7de, 0x61b, 0xf7df, 0xf7e0, 0xf7e1, 0x61f, + 0xf7e2, 0x621, 0x622, 0x623, 0x624, 0x625, 0x626, 0x627, + 0x628, 0x629, 0x62a, 0x62b, 0x62c, 0x62d, 0x62e, 0x62f, + 0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0x636, 0x637, + 0x638, 0x639, 0x63a, 0xf7e3, 0xf7e4, 0xf7e5, 0xf7e6, 0xf7e7, + 0x640, 0x641, 0x642, 0x643, 0x644, 0x645, 0x646, 0x647, + 0x648, 0x649, 0x64a, 0x64b, 0x64c, 0x64d, 0x64e, 0x64f, + 0x650, 0x651, 0x652, 0xf7e8, 0xf7e9, 0xf7ea, 0xf7eb, 0xf7ec, + 0xf7ed, 0xf7ee, 0xf7ef, 0xf7f0, 0xf7f1, 0xf7f2, 0xf7f3, 0xf7f4 }, + /* ISO-8859-7 */ + { 0xa0, 0x2bd, 0x2bc, 0xa3, 0xf7c2, 0xf7c3, 0xa6, 0xa7, + 0xa8, 0xa9, 0xf7c4, 0xab, 0xac, 0xad, 0xf7c5, 0x2015, + 0xb0, 0xb1, 0xb2, 0xb3, 0x384, 0x385, 0x386, 0xb7, + 0x388, 0x389, 0x38a, 0xbb, 0x38c, 0xbd, 0x38e, 0x38f, + 0x390, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, + 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f, + 0x3a0, 0x3a1, 0xf7c6, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7, + 0x3a8, 0x3a9, 0x3aa, 0x3ab, 0x3ac, 0x3ad, 0x3ae, 0x3af, + 0x3b0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7, + 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf, + 0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4, 0x3c5, 0x3c6, 0x3c7, + 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x3cc, 0x3cd, 0x3ce, 0xf7c7 }, + /* ISO-8859-8 */ + { 0xa0, 0xf79c, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xd7, 0xab, 0xac, 0xad, 0xae, 0x203e, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xf7, 0xbb, 0xbc, 0xbd, 0xbe, 0xf79d, + 0xf79e, 0xf79f, 0xf7a0, 0xf7a1, 0xf7a2, 0xf7a3, 0xf7a4, 0xf7a5, + 0xf7a6, 0xf7a7, 0xf7a8, 0xf7a9, 0xf7aa, 0xf7ab, 0xf7ac, 0xf7ad, + 0xf7ae, 0xf7af, 0xf7b0, 0xf7b1, 0xf7b2, 0xf7b3, 0xf7b4, 0xf7b5, + 0xf7b6, 0xf7b7, 0xf7b8, 0xf7b9, 0xf7ba, 0xf7bb, 0xf7bc, 0x2017, + 0x5d0, 0x5d1, 0x5d2, 0x5d3, 0x5d4, 0x5d5, 0x5d6, 0x5d7, + 0x5d8, 0x5d9, 0x5da, 0x5db, 0x5dc, 0x5dd, 0x5de, 0x5df, + 0x5e0, 0x5e1, 0x5e2, 0x5e3, 0x5e4, 0x5e5, 0x5e6, 0x5e7, + 0x5e8, 0x5e9, 0x5ea, 0xf7bd, 0xf7be, 0xf7bf, 0xf7c0, 0xf7c1 }, + /* ISO-8859-9 */ + { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0x11e, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x130, 0x15e, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0x11f, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x131, 0x15f, 0xff }, + /* ISO-8859-10 */ + { 0xa0, 0x104, 0x112, 0x122, 0x12a, 0x128, 0x136, 0xa7, + 0x13b, 0x110, 0x160, 0x166, 0x17d, 0xad, 0x16a, 0x14a, + 0xb0, 0x105, 0x113, 0x123, 0x12b, 0x129, 0x137, 0xb7, + 0x13c, 0x111, 0x161, 0x167, 0x17e, 0x2015, 0x16b, 0x14b, + 0x100, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x12e, + 0x10c, 0xc9, 0x118, 0xcb, 0x116, 0xcd, 0xce, 0xcf, + 0xd0, 0x145, 0x14c, 0xd3, 0xd4, 0xd5, 0xd6, 0x168, + 0xd8, 0x172, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0x101, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0x12f, + 0x10d, 0xe9, 0x119, 0xeb, 0x117, 0xed, 0xee, 0xef, + 0xf0, 0x146, 0x14d, 0xf3, 0xf4, 0xf5, 0xf6, 0x169, + 0xf8, 0x173, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x138 }, + /* ISO-8859-11 */ + { 0xa0, 0xe01, 0xe02, 0xe03, 0xe04, 0xe05, 0xe06, 0xe07, + 0xe08, 0xe09, 0xe0a, 0xe0b, 0xe0c, 0xe0d, 0xe0e, 0xe0f, + 0xe10, 0xe11, 0xe12, 0xe13, 0xe14, 0xe15, 0xe16, 0xe17, + 0xe18, 0xe19, 0xe1a, 0xe1b, 0xe1c, 0xe1d, 0xe1e, 0xe1f, + 0xe20, 0xe21, 0xe22, 0xe23, 0xe24, 0xe25, 0xe26, 0xe27, + 0xe28, 0xe29, 0xe2a, 0xe2b, 0xe2c, 0xe2d, 0xe2e, 0xe2f, + 0xe30, 0xe31, 0xe32, 0xe33, 0xe34, 0xe35, 0xe36, 0xe37, + 0xe38, 0xe39, 0xe3a, 0xdb, 0xdc, 0xdd, 0xde, 0xe3f, + 0xe40, 0xe41, 0xe42, 0xe43, 0xe44, 0xe45, 0xe46, 0xe47, + 0xe48, 0xe49, 0xe4a, 0xe4b, 0xe4c, 0xe4d, 0xe4e, 0xe4f, + 0xe50, 0xe51, 0xe52, 0xe53, 0xe54, 0xe55, 0xe56, 0xe57, + 0xe58, 0xe59, 0xe5a, 0xe5b, 0xe31, 0xe34, 0xe47, 0xff }, + /* ISO-8859-12 doesn't exist. The below code decrements the index + into the table by one for ISO numbers > 12. */ + /* ISO-8859-13 */ + { 0xa0, 0x201d, 0xa2, 0xa3, 0xa4, 0x201e, 0xa6, 0xa7, + 0xd8, 0xa9, 0x156, 0xab, 0xac, 0xad, 0xae, 0xc6, + 0xb0, 0xb1, 0xb2, 0xb3, 0x201c, 0xb5, 0xb6, 0xb7, + 0xf8, 0xb9, 0x157, 0xbb, 0xbc, 0xbd, 0xbe, 0xe6, + 0x104, 0x12e, 0x100, 0x106, 0xc4, 0xc5, 0x118, 0x112, + 0x10c, 0xc9, 0x179, 0x116, 0x122, 0x136, 0x12a, 0x13b, + 0x160, 0x143, 0x145, 0xd3, 0x14c, 0xd5, 0xd6, 0xd7, + 0x172, 0x141, 0x15a, 0x16a, 0xdc, 0x17b, 0x17d, 0xdf, + 0x105, 0x12f, 0x101, 0x107, 0xe4, 0xe5, 0x119, 0x113, + 0x10d, 0xe9, 0x17a, 0x117, 0x123, 0x137, 0x12b, 0x13c, + 0x161, 0x144, 0x146, 0xf3, 0x14d, 0xf5, 0xf6, 0xf7, + 0x173, 0x142, 0x15b, 0x16b, 0xfc, 0x17c, 0x17e, 0x2019 }, + /* ISO-8859-14 */ + { 0xa0, 0x1e02, 0x1e03, 0xa3, 0x10a, 0x10b, 0x1e0a, 0xa7, + 0x1e80, 0xa9, 0x1e82, 0x1e0b, 0x1ef2, 0xad, 0xae, 0x178, + 0x1e1e, 0x1e1f, 0x120, 0x121, 0x1e40, 0x1e41, 0xb6, 0x1e56, + 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0x174, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0x1e6a, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x176, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0x175, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0x1e6b, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0x177, 0xff }, + /* ISO-8859-15 */ + { 0xa0, 0xa1, 0xa2, 0xa3, 0x20ac, 0xa5, 0x160, 0xa7, + 0x161, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0x17d, 0xb5, 0xb6, 0xb7, + 0x17e, 0xb9, 0xba, 0xbb, 0x152, 0x153, 0x178, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, + /* ISO-8859-16 */ + { 0xa0, 0x104, 0x105, 0x141, 0x20ac, 0x201e, 0x160, 0xa7, + 0x161, 0xa9, 0x218, 0xab, 0x179, 0xad, 0x17a, 0x17b, + 0xb0, 0xb1, 0x10c, 0x142, 0x17d, 0x201d, 0xb6, 0xb7, + 0x17e, 0x10d, 0x219, 0xbb, 0x152, 0x153, 0x178, 0x17c, + 0xc0, 0xc1, 0xc2, 0x102, 0xc4, 0x106, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0x110, 0x143, 0xd2, 0xd3, 0xd4, 0x150, 0xd6, 0x15a, + 0x170, 0xd9, 0xda, 0xdb, 0xdc, 0x118, 0x21a, 0xdf, + 0xe0, 0xe1, 0xe2, 0x103, 0xe4, 0x107, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0x111, 0x144, 0xf2, 0xf3, 0xf4, 0x151, 0xf6, 0x15b, + 0x171, 0xf9, 0xfa, 0xfb, 0xfc, 0x119, 0x21b, 0xff } +}; +#endif /* _MB_EXTENDED_CHARSETS_ISO */ + +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS +/* Tables for the Windows default singlebyte ANSI codepage conversion. + The first index into the table is a value computed from the codepage + value (function __cp_index), the second index is the value of the + incoming character - 0x80. + Values < 0x80 don't have to be converted anyway. */ +wchar_t __cp_conv[27][0x80] = { + /* CP437 */ + { 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9, + 0xff, 0xd6, 0xdc, 0xa2, 0xa3, 0xa5, 0x20a7, 0x192, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, + 0xbf, 0x2310, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x3b1, 0xdf, 0x393, 0x3c0, 0x3a3, 0x3c3, 0xb5, 0x3c4, + 0x3a6, 0x398, 0x3a9, 0x3b4, 0x221e, 0x3c6, 0x3b5, 0x2229, + 0x2261, 0xb1, 0x2265, 0x2264, 0x2320, 0x2321, 0xf7, 0x2248, + 0xb0, 0x2219, 0xb7, 0x221a, 0x207f, 0xb2, 0x25a0, 0xa0 }, + /* CP720 */ + { 0x80, 0x81, 0xe9, 0xe2, 0x84, 0xe0, 0x86, 0xe7, + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0x8d, 0x8e, 0x8f, + 0x90, 0x651, 0x652, 0xf4, 0xa4, 0x640, 0xfb, 0xf9, + 0x621, 0x622, 0x623, 0x624, 0xa3, 0x625, 0x626, 0x627, + 0x628, 0x629, 0x62a, 0x62b, 0x62c, 0x62d, 0x62e, 0x62f, + 0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x636, 0x637, 0x638, 0x639, 0x63a, 0x641, 0xb5, 0x642, + 0x643, 0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0x64a, + 0x2261, 0x64b, 0x64c, 0x64d, 0x64e, 0x64f, 0x650, 0x2248, + 0xb0, 0x2219, 0xb7, 0x221a, 0x207f, 0xb2, 0x25a0, 0xa0 }, + /* CP737 */ + { 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, + 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f, 0x3a0, + 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7, 0x3a8, 0x3a9, + 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7, 0x3b8, + 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf, 0x3c0, + 0x3c1, 0x3c3, 0x3c2, 0x3c4, 0x3c5, 0x3c6, 0x3c7, 0x3c8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x3c9, 0x3ac, 0x3ad, 0x3ae, 0x3ca, 0x3af, 0x3cc, 0x3cd, + 0x3cb, 0x3ce, 0x386, 0x388, 0x389, 0x38a, 0x38c, 0x38e, + 0x38f, 0xb1, 0x2265, 0x2264, 0x3aa, 0x3ab, 0xf7, 0x2248, + 0xb0, 0x2219, 0xb7, 0x221a, 0x207f, 0xb2, 0x25a0, 0xa0 }, + /* CP775 */ + { 0x106, 0xfc, 0xe9, 0x101, 0xe4, 0x123, 0xe5, 0x107, + 0x142, 0x113, 0x156, 0x157, 0x12b, 0x179, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0x14d, 0xf6, 0x122, 0xa2, 0x15a, + 0x15b, 0xd6, 0xdc, 0xf8, 0xa3, 0xd8, 0xd7, 0xa4, + 0x100, 0x12a, 0xf3, 0x17b, 0x17c, 0x17a, 0x201d, 0xa6, + 0xa9, 0xae, 0xac, 0xbd, 0xbc, 0x141, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x104, 0x10c, 0x118, + 0x116, 0x2563, 0x2551, 0x2557, 0x255d, 0x12e, 0x160, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x172, 0x16a, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x17d, + 0x105, 0x10d, 0x119, 0x117, 0x12f, 0x161, 0x173, 0x16b, + 0x17e, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0xd3, 0xdf, 0x14c, 0x143, 0xf5, 0xd5, 0xb5, 0x144, + 0x136, 0x137, 0x13b, 0x13c, 0x146, 0x112, 0x145, 0x2019, + 0xad, 0xb1, 0x201c, 0xbe, 0xb6, 0xa7, 0xf7, 0x201e, + 0xb0, 0x2219, 0xb7, 0xb9, 0xb3, 0xb2, 0x25a0, 0xa0 }, + /* CP850 */ + { 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9, + 0xff, 0xd6, 0xdc, 0xf8, 0xa3, 0xd8, 0xd7, 0x192, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, + 0xbf, 0xae, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0xc1, 0xc2, 0xc0, + 0xa9, 0x2563, 0x2551, 0x2557, 0x255d, 0xa2, 0xa5, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0xe3, 0xc3, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0xa4, + 0xf0, 0xd0, 0xca, 0xcb, 0xc8, 0x131, 0xcd, 0xce, + 0xcf, 0x2518, 0x250c, 0x2588, 0x2584, 0xa6, 0xcc, 0x2580, + 0xd3, 0xdf, 0xd4, 0xd2, 0xf5, 0xd5, 0xb5, 0xfe, + 0xde, 0xda, 0xdb, 0xd9, 0xfd, 0xdd, 0xaf, 0xb4, + 0xad, 0xb1, 0x2017, 0xbe, 0xb6, 0xa7, 0xf7, 0xb8, + 0xb0, 0xa8, 0xb7, 0xb9, 0xb3, 0xb2, 0x25a0, 0xa0 }, + /* CP852 */ + { 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0x16f, 0x107, 0xe7, + 0x142, 0xeb, 0x150, 0x151, 0xee, 0x179, 0xc4, 0x106, + 0xc9, 0x139, 0x13a, 0xf4, 0xf6, 0x13d, 0x13e, 0x15a, + 0x15b, 0xd6, 0xdc, 0x164, 0x165, 0x141, 0xd7, 0x10d, + 0xe1, 0xed, 0xf3, 0xfa, 0x104, 0x105, 0x17d, 0x17e, + 0x118, 0x119, 0xac, 0x17a, 0x10c, 0x15f, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0xc1, 0xc2, 0x11a, + 0x15e, 0x2563, 0x2551, 0x2557, 0x255d, 0x17b, 0x17c, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x102, 0x103, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0xa4, + 0x111, 0x110, 0x10e, 0xcb, 0x10f, 0x147, 0xcd, 0xce, + 0x11b, 0x2518, 0x250c, 0x2588, 0x2584, 0x162, 0x16e, 0x2580, + 0xd3, 0xdf, 0xd4, 0x143, 0x144, 0x148, 0x160, 0x161, + 0x154, 0xda, 0x155, 0x170, 0xfd, 0xdd, 0x163, 0xb4, + 0xad, 0x2dd, 0x2db, 0x2c7, 0x2d8, 0xa7, 0xf7, 0xb8, + 0xb0, 0xa8, 0x2d9, 0x171, 0x158, 0x159, 0x25a0, 0xa0 }, + /* CP855 */ + { 0x452, 0x402, 0x453, 0x403, 0x451, 0x401, 0x454, 0x404, + 0x455, 0x405, 0x456, 0x406, 0x457, 0x407, 0x458, 0x408, + 0x459, 0x409, 0x45a, 0x40a, 0x45b, 0x40b, 0x45c, 0x40c, + 0x45e, 0x40e, 0x45f, 0x40f, 0x44e, 0x42e, 0x44a, 0x42a, + 0x430, 0x410, 0x431, 0x411, 0x446, 0x426, 0x434, 0x414, + 0x435, 0x415, 0x444, 0x424, 0x433, 0x413, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x445, 0x425, 0x438, + 0x418, 0x2563, 0x2551, 0x2557, 0x255d, 0x439, 0x419, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x43a, 0x41a, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0xa4, + 0x43b, 0x41b, 0x43c, 0x41c, 0x43d, 0x41d, 0x43e, 0x41e, + 0x43f, 0x2518, 0x250c, 0x2588, 0x2584, 0x41f, 0x44f, 0x2580, + 0x42f, 0x440, 0x420, 0x441, 0x421, 0x442, 0x422, 0x443, + 0x423, 0x436, 0x416, 0x432, 0x412, 0x44c, 0x42c, 0x2116, + 0xad, 0x44b, 0x42b, 0x437, 0x417, 0x448, 0x428, 0x44d, + 0x42d, 0x449, 0x429, 0x447, 0x427, 0xa7, 0x25a0, 0xa0 }, + /* CP857 */ + { 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0x131, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9, + 0x130, 0xd6, 0xdc, 0xf8, 0xa3, 0xd8, 0x15e, 0x15f, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0x11e, 0x11f, + 0xbf, 0xae, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0xc1, 0xc2, 0xc0, + 0xa9, 0x2563, 0x2551, 0x2557, 0x255d, 0xa2, 0xa5, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0xe3, 0xc3, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0xa4, + 0xba, 0xaa, 0xca, 0xcb, 0xc8, 0xf8bb, 0xcd, 0xce, + 0xcf, 0x2518, 0x250c, 0x2588, 0x2584, 0xa6, 0xcc, 0x2580, + 0xd3, 0xdf, 0xd4, 0xd2, 0xf5, 0xd5, 0xb5, 0xf8bc, + 0xd7, 0xda, 0xdb, 0xd9, 0xec, 0xff, 0xaf, 0xb4, + 0xad, 0xb1, 0xf8bd, 0xbe, 0xb6, 0xa7, 0xf7, 0xb8, + 0xb0, 0xa8, 0xb7, 0xb9, 0xb3, 0xb2, 0x25a0, 0xa0 }, + /* CP858 */ + { 0xc7, 0xfc, 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, + 0xea, 0xeb, 0xe8, 0xef, 0xee, 0xec, 0xc4, 0xc5, + 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2, 0xfb, 0xf9, + 0xff, 0xd6, 0xdc, 0xf8, 0xa3, 0xd8, 0xd7, 0x192, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, + 0xbf, 0xae, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0xc1, 0xc2, 0xc0, + 0xa9, 0x2563, 0x2551, 0x2557, 0x255d, 0xa2, 0xa5, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0xe3, 0xc3, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0xa4, + 0xf0, 0xd0, 0xca, 0xcb, 0xc8, 0x20ac, 0xcd, 0xce, + 0xcf, 0x2518, 0x250c, 0x2588, 0x2584, 0xa6, 0xcc, 0x2580, + 0xd3, 0xdf, 0xd4, 0xd2, 0xf5, 0xd5, 0xb5, 0xfe, + 0xde, 0xda, 0xdb, 0xd9, 0xfd, 0xdd, 0xaf, 0xb4, + 0xad, 0xb1, 0x2017, 0xbe, 0xb6, 0xa7, 0xf7, 0xb8, + 0xb0, 0xa8, 0xb7, 0xb9, 0xb3, 0xb2, 0x25a0, 0xa0 }, + /* CP862 */ + { 0x5d0, 0x5d1, 0x5d2, 0x5d3, 0x5d4, 0x5d5, 0x5d6, 0x5d7, + 0x5d8, 0x5d9, 0x5da, 0x5db, 0x5dc, 0x5dd, 0x5de, 0x5df, + 0x5e0, 0x5e1, 0x5e2, 0x5e3, 0x5e4, 0x5e5, 0x5e6, 0x5e7, + 0x5e8, 0x5e9, 0x5ea, 0xa2, 0xa3, 0xa5, 0x20a7, 0x192, + 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, + 0xbf, 0x2310, 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x3b1, 0xdf, 0x393, 0x3c0, 0x3a3, 0x3c3, 0xb5, 0x3c4, + 0x3a6, 0x398, 0x3a9, 0x3b4, 0x221e, 0x3c6, 0x3b5, 0x2229, + 0x2261, 0xb1, 0x2265, 0x2264, 0x2320, 0x2321, 0xf7, 0x2248, + 0xb0, 0x2219, 0xb7, 0x221a, 0x207f, 0xb2, 0x25a0, 0xa0 }, + /* CP866 */ + { 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f, + 0x401, 0x451, 0x404, 0x454, 0x407, 0x457, 0x40e, 0x45e, + 0xb0, 0x2219, 0xb7, 0x221a, 0x2116, 0xa4, 0x25a0, 0xa0 }, + /* CP874 */ + { 0x20ac, 0x81, 0x82, 0x83, 0x84, 0x2026, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xe01, 0xe02, 0xe03, 0xe04, 0xe05, 0xe06, 0xe07, + 0xe08, 0xe09, 0xe0a, 0xe0b, 0xe0c, 0xe0d, 0xe0e, 0xe0f, + 0xe10, 0xe11, 0xe12, 0xe13, 0xe14, 0xe15, 0xe16, 0xe17, + 0xe18, 0xe19, 0xe1a, 0xe1b, 0xe1c, 0xe1d, 0xe1e, 0xe1f, + 0xe20, 0xe21, 0xe22, 0xe23, 0xe24, 0xe25, 0xe26, 0xe27, + 0xe28, 0xe29, 0xe2a, 0xe2b, 0xe2c, 0xe2d, 0xe2e, 0xe2f, + 0xe30, 0xe31, 0xe32, 0xe33, 0xe34, 0xe35, 0xe36, 0xe37, + 0xe38, 0xe39, 0xe3a, 0xf8c1, 0xf8c2, 0xf8c3, 0xf8c4, 0xe3f, + 0xe40, 0xe41, 0xe42, 0xe43, 0xe44, 0xe45, 0xe46, 0xe47, + 0xe48, 0xe49, 0xe4a, 0xe4b, 0xe4c, 0xe4d, 0xe4e, 0xe4f, + 0xe50, 0xe51, 0xe52, 0xe53, 0xe54, 0xe55, 0xe56, 0xe57, + 0xe58, 0xe59, 0xe5a, 0xe5b, 0xf8c5, 0xf8c6, 0xf8c7, 0xf8c8 }, + /* CP1125 */ + { 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255d, 0x255c, 0x255b, 0x2510, + 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0x255e, 0x255f, + 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, + 0x256a, 0x2518, 0x250c, 0x2588, 0x2584, 0x258c, 0x2590, 0x2580, + 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f, + 0x401, 0x451, 0x490, 0x491, 0x404, 0x454, 0x406, 0x456, + 0x407, 0x457, 0xb7, 0x221a, 0x2116, 0xa4, 0x25a0, 0xa0 }, + /* CP1250 */ + { 0x20ac, 0x81, 0x201a, 0x83, 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x160, 0x2039, 0x15a, 0x164, 0x17d, 0x179, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x161, 0x203a, 0x15b, 0x165, 0x17e, 0x17a, + 0xa0, 0x2c7, 0x2d8, 0x141, 0xa4, 0x104, 0xa6, 0xa7, + 0xa8, 0xa9, 0x15e, 0xab, 0xac, 0xad, 0xae, 0x17b, + 0xb0, 0xb1, 0x2db, 0x142, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0x105, 0x15f, 0xbb, 0x13d, 0x2dd, 0x13e, 0x17c, + 0x154, 0xc1, 0xc2, 0x102, 0xc4, 0x139, 0x106, 0xc7, + 0x10c, 0xc9, 0x118, 0xcb, 0x11a, 0xcd, 0xce, 0x10e, + 0x110, 0x143, 0x147, 0xd3, 0xd4, 0x150, 0xd6, 0xd7, + 0x158, 0x16e, 0xda, 0x170, 0xdc, 0xdd, 0x162, 0xdf, + 0x155, 0xe1, 0xe2, 0x103, 0xe4, 0x13a, 0x107, 0xe7, + 0x10d, 0xe9, 0x119, 0xeb, 0x11b, 0xed, 0xee, 0x10f, + 0x111, 0x144, 0x148, 0xf3, 0xf4, 0x151, 0xf6, 0xf7, + 0x159, 0x16f, 0xfa, 0x171, 0xfc, 0xfd, 0x163, 0x2d9 }, + /* CP1251 */ + { 0x402, 0x403, 0x201a, 0x453, 0x201e, 0x2026, 0x2020, 0x2021, + 0x20ac, 0x2030, 0x409, 0x2039, 0x40a, 0x40c, 0x40b, 0x40f, + 0x452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x459, 0x203a, 0x45a, 0x45c, 0x45b, 0x45f, + 0xa0, 0x40e, 0x45e, 0x408, 0xa4, 0x490, 0xa6, 0xa7, + 0x401, 0xa9, 0x404, 0xab, 0xac, 0xad, 0xae, 0x407, + 0xb0, 0xb1, 0x406, 0x456, 0x491, 0xb5, 0xb6, 0xb7, + 0x451, 0x2116, 0x454, 0xbb, 0x458, 0x405, 0x455, 0x457, + 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, + 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f }, + /* CP1252 */ + { 0x20ac, 0x81, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x160, 0x2039, 0x152, 0x8d, 0x17d, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x161, 0x203a, 0x153, 0x9d, 0x17e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, + /* CP1253 */ + { 0x20ac, 0x81, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x8a, 0x2039, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x9a, 0x203a, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x385, 0x386, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xf8f9, 0xab, 0xac, 0xad, 0xae, 0x2015, + 0xb0, 0xb1, 0xb2, 0xb3, 0x384, 0xb5, 0xb6, 0xb7, + 0x388, 0x389, 0x38a, 0xbb, 0x38c, 0xbd, 0x38e, 0x38f, + 0x390, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, + 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f, + 0x3a0, 0x3a1, 0xf8fa, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7, + 0x3a8, 0x3a9, 0x3aa, 0x3ab, 0x3ac, 0x3ad, 0x3ae, 0x3af, + 0x3b0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7, + 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf, + 0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4, 0x3c5, 0x3c6, 0x3c7, + 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x3cc, 0x3cd, 0x3ce, 0xf8fb }, + /* CP1254 */ + { 0x20ac, 0x81, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x160, 0x2039, 0x152, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x161, 0x203a, 0x153, 0x9d, 0x9e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0x11e, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x130, 0x15e, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0x11f, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x131, 0x15f, 0xff }, + /* CP1255 */ + { 0x20ac, 0x81, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x8a, 0x2039, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x9a, 0x203a, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0x20aa, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xd7, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xf7, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0x5b0, 0x5b1, 0x5b2, 0x5b3, 0x5b4, 0x5b5, 0x5b6, 0x5b7, + 0x5b8, 0x5b9, 0x5ba, 0x5bb, 0x5bc, 0x5bd, 0x5be, 0x5bf, + 0x5c0, 0x5c1, 0x5c2, 0x5c3, 0x5f0, 0x5f1, 0x5f2, 0x5f3, + 0x5f4, 0xf88d, 0xf88e, 0xf88f, 0xf890, 0xf891, 0xf892, 0xf893, + 0x5d0, 0x5d1, 0x5d2, 0x5d3, 0x5d4, 0x5d5, 0x5d6, 0x5d7, + 0x5d8, 0x5d9, 0x5da, 0x5db, 0x5dc, 0x5dd, 0x5de, 0x5df, + 0x5e0, 0x5e1, 0x5e2, 0x5e3, 0x5e4, 0x5e5, 0x5e6, 0x5e7, + 0x5e8, 0x5e9, 0x5ea, 0xf894, 0xf895, 0x200e, 0x200f, 0xf896 }, + /* CP1256 */ + { 0x20ac, 0x67e, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x679, 0x2039, 0x152, 0x686, 0x698, 0x688, + 0x6af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x6a9, 0x2122, 0x691, 0x203a, 0x153, 0x200c, 0x200d, 0x6ba, + 0xa0, 0x60c, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0x6be, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0x61b, 0xbb, 0xbc, 0xbd, 0xbe, 0x61f, + 0x6c1, 0x621, 0x622, 0x623, 0x624, 0x625, 0x626, 0x627, + 0x628, 0x629, 0x62a, 0x62b, 0x62c, 0x62d, 0x62e, 0x62f, + 0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0x636, 0xd7, + 0x637, 0x638, 0x639, 0x63a, 0x640, 0x641, 0x642, 0x643, + 0xe0, 0x644, 0xe2, 0x645, 0x646, 0x647, 0x648, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0x649, 0x64a, 0xee, 0xef, + 0x64b, 0x64c, 0x64d, 0x64e, 0xf4, 0x64f, 0x650, 0xf7, + 0x651, 0xf9, 0x652, 0xfb, 0xfc, 0x200e, 0x200f, 0x6d2 }, + /* CP1257 */ + { 0x20ac, 0x81, 0x201a, 0x83, 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x8a, 0x2039, 0x8c, 0xa8, 0x2c7, 0xb8, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x9a, 0x203a, 0x9c, 0xaf, 0x2db, 0x9f, + 0xa0, 0xf8fc, 0xa2, 0xa3, 0xa4, 0xf8fd, 0xa6, 0xa7, + 0xd8, 0xa9, 0x156, 0xab, 0xac, 0xad, 0xae, 0xc6, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xf8, 0xb9, 0x157, 0xbb, 0xbc, 0xbd, 0xbe, 0xe6, + 0x104, 0x12e, 0x100, 0x106, 0xc4, 0xc5, 0x118, 0x112, + 0x10c, 0xc9, 0x179, 0x116, 0x122, 0x136, 0x12a, 0x13b, + 0x160, 0x143, 0x145, 0xd3, 0x14c, 0xd5, 0xd6, 0xd7, + 0x172, 0x141, 0x15a, 0x16a, 0xdc, 0x17b, 0x17d, 0xdf, + 0x105, 0x12f, 0x101, 0x107, 0xe4, 0xe5, 0x119, 0x113, + 0x10d, 0xe9, 0x17a, 0x117, 0x123, 0x137, 0x12b, 0x13c, + 0x161, 0x144, 0x146, 0xf3, 0x14d, 0xf5, 0xf6, 0xf7, + 0x173, 0x142, 0x15b, 0x16b, 0xfc, 0x17c, 0x17e, 0x2d9 }, + /* CP1258 */ + { 0x20ac, 0x81, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x8a, 0x2039, 0x152, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x9a, 0x203a, 0x153, 0x9d, 0x9e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0x102, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xca, 0xcb, 0x300, 0xcd, 0xce, 0xcf, + 0x110, 0xd1, 0x309, 0xd3, 0xd4, 0x1a0, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0x1af, 0x303, 0xdf, + 0xe0, 0xe1, 0xe2, 0x103, 0xe4, 0xe5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0x301, 0xed, 0xee, 0xef, + 0x111, 0xf1, 0x323, 0xf3, 0xf4, 0x1a1, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0x1b0, 0x20ab, 0xff }, + /* CP20866 (KOI8-R) */ + { 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, + 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, + 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, + 0x2264, 0x2265, 0xa0, 0x2321, 0xb0, 0xb2, 0xb7, 0xf7, + 0x2550, 0x2551, 0x2552, 0x451, 0x2553, 0x2554, 0x2555, 0x2556, + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x255c, 0x255d, 0x255e, + 0x255f, 0x2560, 0x2561, 0x401, 0x2562, 0x2563, 0x2564, 0x2565, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x256b, 0x256c, 0xa9, + 0x44e, 0x430, 0x431, 0x446, 0x434, 0x435, 0x444, 0x433, + 0x445, 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, + 0x43f, 0x44f, 0x440, 0x441, 0x442, 0x443, 0x436, 0x432, + 0x44c, 0x44b, 0x437, 0x448, 0x44d, 0x449, 0x447, 0x44a, + 0x42e, 0x410, 0x411, 0x426, 0x414, 0x415, 0x424, 0x413, + 0x425, 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, + 0x41f, 0x42f, 0x420, 0x421, 0x422, 0x423, 0x416, 0x412, + 0x42c, 0x42b, 0x417, 0x428, 0x42d, 0x429, 0x427, 0x42a }, + /* CP21866 (KOI8-U) */ + { 0x2500, 0x2502, 0x250c, 0x2510, 0x2514, 0x2518, 0x251c, 0x2524, + 0x252c, 0x2534, 0x253c, 0x2580, 0x2584, 0x2588, 0x258c, 0x2590, + 0x2591, 0x2592, 0x2593, 0x2320, 0x25a0, 0x2219, 0x221a, 0x2248, + 0x2264, 0x2265, 0xa0, 0x2321, 0xb0, 0xb2, 0xb7, 0xf7, + 0x2550, 0x2551, 0x2552, 0x451, 0x454, 0x2554, 0x456, 0x457, + 0x2557, 0x2558, 0x2559, 0x255a, 0x255b, 0x491, 0x45e, 0x255e, + 0x255f, 0x2560, 0x2561, 0x401, 0x404, 0x2563, 0x406, 0x407, + 0x2566, 0x2567, 0x2568, 0x2569, 0x256a, 0x490, 0x40e, 0xa9, + 0x44e, 0x430, 0x431, 0x446, 0x434, 0x435, 0x444, 0x433, + 0x445, 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, + 0x43f, 0x44f, 0x440, 0x441, 0x442, 0x443, 0x436, 0x432, + 0x44c, 0x44b, 0x437, 0x448, 0x44d, 0x449, 0x447, 0x44a, + 0x42e, 0x410, 0x411, 0x426, 0x414, 0x415, 0x424, 0x413, + 0x425, 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, + 0x41f, 0x42f, 0x420, 0x421, 0x422, 0x423, 0x416, 0x412, + 0x42c, 0x42b, 0x417, 0x428, 0x42d, 0x429, 0x427, 0x42a }, + /* The following are not valid Windows codepages, but they fit nicely here. + The CP numbers are only used internally and are guranteed not to clash + with valid Windows codepage identifier. */ + /* CP101 (GEORGIAN-PS) Georgian charset, used as the default charset in + the ka_GE locale (Georgian, Georgia). Apparently derived from Windows + CP1252. */ + { 0x80, 0x81, 0x201a, 0x192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x2c6, 0x2030, 0x160, 0x2039, 0x152, 0x8d, 0x8e, 0x8f, + 0x90, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x2dc, 0x2122, 0x161, 0x203a, 0x153, 0x9d, 0x9e, 0x178, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10f1, + 0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10f2, 0x10dd, + 0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10f3, 0x10e3, 0x10e4, + 0x10e5, 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, + 0x10ed, 0x10ee, 0x10f4, 0x10ef, 0x10f0, 0x10f5, 0xe6, 0xe7, + 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, + /* CP102 (PT154) Cyrillic-Asian charset, used as the default charset in + the kk_KZ locale (Kazakh, Kazakhstan). */ + { 0x496, 0x492, 0x4ee, 0x493, 0x201e, 0x2026, 0x4b6, 0x4ae, + 0x4b2, 0x4af, 0x4a0, 0x4e2, 0x4a2, 0x49a, 0x4ba, 0x4b8, + 0x497, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x4b3, 0x4b7, 0x4a1, 0x4e3, 0x4a3, 0x49b, 0x4bb, 0x4b9, + 0xa0, 0x40e, 0x45e, 0x408, 0x4e8, 0x498, 0x4b0, 0xa7, + 0x401, 0xa9, 0x4d8, 0xab, 0xac, 0x4ef, 0xae, 0x49c, + 0xb0, 0x4b1, 0x406, 0x456, 0x499, 0x4e9, 0xb6, 0xb7, + 0x451, 0x2116, 0x4d9, 0xbb, 0x458, 0x4aa, 0x4ab, 0x49d, + 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, + 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f, + 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, + 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f, + 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, + 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, + 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, + 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f }, + /* CP103 (KOI8-T) */ + { 0x049b, 0x0493, 0x201a, 0x0492, 0x201e, 0x2026, 0x2020, 0x2021, + 0x88, 0x2030, 0x04b3, 0x2039, 0x04b2, 0x04b7, 0x04b6, 0x8f, + 0x049a, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x98, 0x2122, 0x9a, 0x203a, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0x04ef, 0x04ee, 0x0451, 0xa4, 0x04e3, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0x401, 0xb4, 0x04e2, 0xb6, 0xb7, + 0xb8, 0x2116, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xa9, + 0x44e, 0x430, 0x431, 0x446, 0x434, 0x435, 0x444, 0x433, + 0x445, 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, + 0x43f, 0x44f, 0x440, 0x441, 0x442, 0x443, 0x436, 0x432, + 0x44c, 0x44b, 0x437, 0x448, 0x44d, 0x449, 0x447, 0x44a, + 0x42e, 0x410, 0x411, 0x426, 0x414, 0x415, 0x424, 0x413, + 0x425, 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, + 0x41f, 0x42f, 0x420, 0x421, 0x422, 0x423, 0x416, 0x412, + 0x42c, 0x42b, 0x417, 0x428, 0x42d, 0x429, 0x427, 0x42a }, +}; +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ + +/* Handle one to five decimal digits. Return -1 in any other case. */ +static int +__micro_atoi (const char *s) +{ + int ret = 0; + + if (!*s) + return -1; + while (*s) + { + if (*s < '0' || *s > '9' || ret >= 100000) + return -1; + ret = 10 * ret + (*s++ - '0'); + } + return ret; +} + +#ifdef _MB_EXTENDED_CHARSETS_ISO +int +__iso_8859_val_index (int val) +{ + if (val >= 2 && val <= 16) + { + val -= 2; + if (val > 10) + --val; + return (int) val; + } + return -1; +} + +int +__iso_8859_index (const char *charset_ext) +{ + return __iso_8859_val_index (__micro_atoi (charset_ext)); +} +#endif /* _MB_EXTENDED_CHARSETS_ISO */ + +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS +int +__cp_val_index (int val) +{ + int cp_idx; + switch (val) + { + case 437: + cp_idx = 0; + break; + case 720: + cp_idx = 1; + break; + case 737: + cp_idx = 2; + break; + case 775: + cp_idx = 3; + break; + case 850: + cp_idx = 4; + break; + case 852: + cp_idx = 5; + break; + case 855: + cp_idx = 6; + break; + case 857: + cp_idx = 7; + break; + case 858: + cp_idx = 8; + break; + case 862: + cp_idx = 9; + break; + case 866: + cp_idx = 10; + break; + case 874: + cp_idx = 11; + break; + case 1125: + cp_idx = 12; + break; + case 1250: + cp_idx = 13; + break; + case 1251: + cp_idx = 14; + break; + case 1252: + cp_idx = 15; + break; + case 1253: + cp_idx = 16; + break; + case 1254: + cp_idx = 17; + break; + case 1255: + cp_idx = 18; + break; + case 1256: + cp_idx = 19; + break; + case 1257: + cp_idx = 20; + break; + case 1258: + cp_idx = 21; + break; + case 20866: + cp_idx = 22; + break; + case 21866: + cp_idx = 23; + break; + case 101: + cp_idx = 24; + break; + case 102: + cp_idx = 25; + break; + case 103: + cp_idx = 26; + break; + default: + cp_idx = -1; + break; + } + return cp_idx; +} + +int +__cp_index (const char *charset_ext) +{ + return __cp_val_index (__micro_atoi (charset_ext)); +} + +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ +#endif /* _MB_CAPABLE */ diff --git a/lib/stdlib/seed48.c b/lib/stdlib/seed48.c new file mode 100644 index 0000000..25f0e50 --- /dev/null +++ b/lib/stdlib/seed48.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +unsigned short * +_seed48_r (struct _reent *r, + unsigned short xseed[3]) +{ + static unsigned short sseed[3]; + + _REENT_CHECK_RAND48(r); + sseed[0] = __rand48_seed[0]; + sseed[1] = __rand48_seed[1]; + sseed[2] = __rand48_seed[2]; + __rand48_seed[0] = xseed[0]; + __rand48_seed[1] = xseed[1]; + __rand48_seed[2] = xseed[2]; + __rand48_mult[0] = _RAND48_MULT_0; + __rand48_mult[1] = _RAND48_MULT_1; + __rand48_mult[2] = _RAND48_MULT_2; + __rand48_add = _RAND48_ADD; + return sseed; +} + +#ifndef _REENT_ONLY +unsigned short * +seed48 (unsigned short xseed[3]) +{ + return _seed48_r (_REENT, xseed); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/setenv.c b/lib/stdlib/setenv.c new file mode 100644 index 0000000..d8f5bfe --- /dev/null +++ b/lib/stdlib/setenv.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _REENT_ONLY + +#include +#include +#include + +extern int _unsetenv_r (struct _reent *, const char *); + +/* + * setenv -- + * Set the value of the environmental variable "name" to be + * "value". If rewrite is set, replace any current value. + */ + +int +setenv (const char *name, + const char *value, + int rewrite) +{ + return _setenv_r (_REENT, name, value, rewrite); +} + +/* + * unsetenv(name) -- + * Delete environmental variable "name". + */ +int +unsetenv (const char *name) +{ + return _unsetenv_r (_REENT, name); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/setenv_r.c b/lib/stdlib/setenv_r.c new file mode 100644 index 0000000..84d87a6 --- /dev/null +++ b/lib/stdlib/setenv_r.c @@ -0,0 +1,158 @@ +/* This file may have been modified by DJ Delorie (Jan 1991). If so, +** these modifications are Copyright (C) 1991 DJ Delorie. +*/ + +/* + * Copyright (c) 1987 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that: (1) source distributions retain this entire copyright + * notice and comment, and (2) distributions including binaries display + * the following acknowledgement: ``This product includes software + * developed by the University of California, Berkeley and its contributors'' + * in the documentation or other materials provided with the distribution. + * Neither the name of the University nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include + +#include +#include +#include +#include +#include +#include "envlock.h" + +extern char **environ; + +/* Only deal with a pointer to environ, to work around subtle bugs with shared + libraries and/or small data systems where the user declares his own + 'environ'. */ +static char ***p_environ = &environ; + +/* _findenv_r is defined in getenv_r.c. */ +extern char *_findenv_r (struct _reent *, const char *, int *); + +/* + * _setenv_r -- + * Set the value of the environmental variable "name" to be + * "value". If rewrite is set, replace any current value. + * If "name" contains equal sign, -1 is returned, and errno is + * set to EINVAL; + */ + +int +_setenv_r (struct _reent *reent_ptr, + const char *name, + const char *value, + int rewrite) +{ + static int alloced; /* if allocated space before */ + register char *C; + int l_value, offset; + + if (strchr(name, '=')) + { + errno = EINVAL; + return -1; + } + + ENV_LOCK; + + l_value = strlen (value); + if ((C = _findenv_r (reent_ptr, name, &offset))) + { /* find if already exists */ + if (!rewrite) + { + ENV_UNLOCK; + return 0; + } + if (strlen (C) >= l_value) + { /* old larger; copy over */ + while ((*C++ = *value++) != 0); + ENV_UNLOCK; + return 0; + } + } + else + { /* create new slot */ + register int cnt; + register char **P; + + for (P = *p_environ, cnt = 0; *P; ++P, ++cnt); + if (alloced) + { /* just increase size */ + *p_environ = (char **) _realloc_r (reent_ptr, (char *) environ, + (size_t) (sizeof (char *) * (cnt + 2))); + if (!*p_environ) + { + ENV_UNLOCK; + return -1; + } + } + else + { /* get new space */ + alloced = 1; /* copy old entries into it */ + P = (char **) _malloc_r (reent_ptr, (size_t) (sizeof (char *) * (cnt + 2))); + if (!P) + { + ENV_UNLOCK; + return (-1); + } + memcpy((char *) P,(char *) *p_environ, cnt * sizeof (char *)); + *p_environ = P; + } + (*p_environ)[cnt + 1] = NULL; + offset = cnt; + } + for (C = (char *) name; *C && *C != '='; ++C); /* no `=' in name */ + if (!((*p_environ)[offset] = /* name + `=' + value */ + _malloc_r (reent_ptr, (size_t) ((int) (C - name) + l_value + 2)))) + { + ENV_UNLOCK; + return -1; + } + for (C = (*p_environ)[offset]; (*C = *name++) && *C != '='; ++C); + for (*C++ = '='; (*C++ = *value++) != 0;); + + ENV_UNLOCK; + + return 0; +} + +/* + * _unsetenv_r(name) -- + * Delete environmental variable "name". + */ +int +_unsetenv_r (struct _reent *reent_ptr, + const char *name) +{ + register char **P; + int offset; + + /* Name cannot be NULL, empty, or contain an equal sign. */ + if (name == NULL || name[0] == '\0' || strchr(name, '=')) + { + errno = EINVAL; + return -1; + } + + ENV_LOCK; + + while (_findenv_r (reent_ptr, name, &offset)) /* if set multiple times */ + { + for (P = &(*p_environ)[offset];; ++P) + if (!(*P = *(P + 1))) + break; + } + + ENV_UNLOCK; + return 0; +} diff --git a/lib/stdlib/srand48.c b/lib/stdlib/srand48.c new file mode 100644 index 0000000..573f620 --- /dev/null +++ b/lib/stdlib/srand48.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 1993 Martin Birgmeier + * All rights reserved. + * + * You may redistribute unmodified or modified versions of this source + * code provided that the above copyright notice and this and the + * following conditions are retained. + * + * This software is provided ``as is'', and comes with no warranties + * of any kind. I shall in no event be liable for anything that happens + * to anyone/anything when using this software. + */ + +#include "rand48.h" + +void +_srand48_r (struct _reent *r, + long seed) +{ + _REENT_CHECK_RAND48(r); + __rand48_seed[0] = _RAND48_SEED_0; + __rand48_seed[1] = (unsigned short) seed; + __rand48_seed[2] = (unsigned short) ((unsigned long)seed >> 16); + __rand48_mult[0] = _RAND48_MULT_0; + __rand48_mult[1] = _RAND48_MULT_1; + __rand48_mult[2] = _RAND48_MULT_2; + __rand48_add = _RAND48_ADD; +} + +#ifndef _REENT_ONLY +void +srand48 (long seed) +{ + _srand48_r (_REENT, seed); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/std.h b/lib/stdlib/std.h new file mode 100644 index 0000000..c000a67 --- /dev/null +++ b/lib/stdlib/std.h @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include +#ifndef CYGNUS_NEC +#include +#endif + +#define Ise(c) ((c == 'e') || (c == 'E') || (c == 'd') || (c == 'D')) +#define Isdigit(c) ((c <= '9') && (c >= '0')) +#define Isspace(c) ((c == ' ') || (c == '\t') || (c=='\n') || (c=='\v') \ + || (c == '\r') || (c == '\f')) +#define Issign(c) ((c == '-') || (c == '+')) +#define Val(c) ((c - '0')) + +#define MAXE 308 +#define MINE (-308) + +/* flags */ +#define SIGN 0x01 +#define ESIGN 0x02 +#define DECP 0x04 + +int __ten_mul(double *acc, int digit); +double __adjust(struct _reent *ptr, double *acc, int dexp, int sign); +double __exp10(unsigned x); diff --git a/lib/stdlib/stdlib.tex b/lib/stdlib/stdlib.tex new file mode 100644 index 0000000..75d80f4 --- /dev/null +++ b/lib/stdlib/stdlib.tex @@ -0,0 +1,210 @@ +@node Stdlib +@chapter Standard Utility Functions (@file{stdlib.h}) + +This chapter groups utility functions useful in a variety of programs. +The corresponding declarations are in the header file @file{stdlib.h}. + +@menu +* _Exit:: End program execution without cleaning up +* a64l:: String to long long +* abort:: Abnormal termination of a program +* abs:: Integer absolute value (magnitude) +* assert:: Macro for Debugging Diagnostics +* atexit:: Request execution of functions at program exit +* atof:: String to double or float +* atoi:: String to integer +* atoll:: String to long long +* bsearch:: Binary search +* calloc:: Allocate space for arrays +* div:: Divide two integers +* ecvtbuf:: Double or float to string of digits +* ecvt:: Double or float to string of digits (malloc result) +* __env_lock:: Lock environment list for getenv and setenv +* gcvt:: Format double or float as string +* exit:: End program execution +* getenv:: Look up environment variable +* itoa:: Integer to string +* labs:: Long integer absolute value (magnitude) +* ldiv:: Divide two long integers +* llabs:: Long long integer absolute value (magnitude) +* lldiv:: Divide two long long integers +* malloc:: Allocate and manage memory (malloc, realloc, free) +* mallinfo:: Get information about allocated memory +* __malloc_lock:: Lock memory pool for malloc and free +* mbsrtowcs:: Convert a character string to a wide-character string +* mbstowcs:: Minimal multibyte string to wide string converter +* mblen:: Minimal multibyte length +* mbtowc:: Minimal multibyte to wide character converter +* on_exit:: Request execution of functions at program exit +* qsort:: Array sort +* rand:: Pseudo-random numbers +* random:: Pseudo-random numbers +* rand48:: Uniformly distributed pseudo-random numbers +* rpmatch:: Determine whether response is affirmative or negative +* strtod:: String to double or float +* strtol:: String to long +* strtoll:: String to long long +* strtoul:: String to unsigned long +* strtoull:: String to unsigned long long +* wcsrtombs:: Convert a wide-character string to a character string +* wcstod:: Wide string to double or float +* wcstol:: Wide string to long +* wcstoll:: Wide string to long long +* wcstoul:: Wide string to unsigned long +* wcstoull:: Wide string to unsigned long long +* system:: Execute command string +* utoa:: Unsigned integer to string +* wcstombs:: Minimal wide string to multibyte string converter +* wctomb:: Minimal wide character to multibyte converter +@end menu + +@page +@include stdlib/_Exit.def + +@page +@include stdlib/a64l.def + +@page +@include stdlib/abort.def + +@page +@include stdlib/abs.def + +@page +@include stdlib/assert.def + +@page +@include stdlib/atexit.def + +@page +@include stdlib/atof.def + +@page +@include stdlib/atoi.def + +@page +@include stdlib/atoll.def + +@page +@include search/bsearch.def + +@page +@include stdlib/calloc.def + +@page +@include stdlib/div.def + +@page +@include stdlib/efgcvt.def + +@page +@include stdlib/ecvtbuf.def + +@page +@include stdlib/envlock.def + +@page +@include stdlib/exit.def + +@page +@include stdlib/getenv.def + +@page +@include stdlib/itoa.def + +@page +@include stdlib/labs.def + +@page +@include stdlib/ldiv.def + +@page +@include stdlib/llabs.def + +@page +@include stdlib/lldiv.def + +@page +@include stdlib/malloc.def + +@page +@include stdlib/mstats.def + +@page +@include stdlib/mlock.def + +@page +@include stdlib/mblen.def + +@page +@include stdlib/mbsnrtowcs.def + +@page +@include stdlib/mbstowcs.def + +@page +@include stdlib/mbtowc.def + +@page +@include stdlib/on_exit.def + +@page +@include search/qsort.def + +@page +@include stdlib/rand.def + +@page +@include stdlib/random.def + +@page +@include stdlib/rand48.def + +@page +@include stdlib/rpmatch.def + +@page +@include stdlib/strtod.def + +@page +@include stdlib/strtol.def + +@page +@include stdlib/strtoll.def + +@page +@include stdlib/strtoul.def + +@page +@include stdlib/strtoull.def + +@page +@include stdlib/wcsnrtombs.def + +@page +@include stdlib/wcstod.def + +@page +@include stdlib/wcstol.def + +@page +@include stdlib/wcstoll.def + +@page +@include stdlib/wcstoul.def + +@page +@include stdlib/wcstoull.def + +@page +@include stdlib/system.def + +@page +@include stdlib/utoa.def + +@page +@include stdlib/wcstombs.def + +@page +@include stdlib/wctomb.def + diff --git a/lib/stdlib/strtod.c b/lib/stdlib/strtod.c new file mode 100644 index 0000000..9156ed7 --- /dev/null +++ b/lib/stdlib/strtod.c @@ -0,0 +1,1348 @@ +/* +FUNCTION + <>, <>, <>, <>, <>, <>---string to double or float + +INDEX + strtod + +INDEX + strtof + +INDEX + strtold + +INDEX + strtod_l + +INDEX + strtof_l + +INDEX + strtold_l + +INDEX + _strtod_r + +SYNOPSIS + #include + double strtod(const char *restrict <[str]>, char **restrict <[tail]>); + float strtof(const char *restrict <[str]>, char **restrict <[tail]>); + long double strtold(const char *restrict <[str]>, + char **restrict <[tail]>); + + #include + double strtod_l(const char *restrict <[str]>, char **restrict <[tail]>, + locale_t <[locale]>); + float strtof_l(const char *restrict <[str]>, char **restrict <[tail]>, + locale_t <[locale]>); + long double strtold_l(const char *restrict <[str]>, + char **restrict <[tail]>, + locale_t <[locale]>); + + double _strtod_r(void *<[reent]>, + const char *restrict <[str]>, char **restrict <[tail]>); + +DESCRIPTION + <>, <>, <> parse the character string + <[str]>, producing a substring which can be converted to a double, + float, or long double value, respectively. The substring converted + is the longest initial subsequence of <[str]>, beginning with the + first non-whitespace character, that has one of these formats: + .[+|-]<[digits]>[.[<[digits]>]][(e|E)[+|-]<[digits]>] + .[+|-].<[digits]>[(e|E)[+|-]<[digits]>] + .[+|-](i|I)(n|N)(f|F)[(i|I)(n|N)(i|I)(t|T)(y|Y)] + .[+|-](n|N)(a|A)(n|N)[<(>[<[hexdigits]>]<)>] + .[+|-]0(x|X)<[hexdigits]>[.[<[hexdigits]>]][(p|P)[+|-]<[digits]>] + .[+|-]0(x|X).<[hexdigits]>[(p|P)[+|-]<[digits]>] + The substring contains no characters if <[str]> is empty, consists + entirely of whitespace, or if the first non-whitespace + character is something other than <<+>>, <<->>, <<.>>, or a + digit, and cannot be parsed as infinity or NaN. If the platform + does not support NaN, then NaN is treated as an empty substring. + If the substring is empty, no conversion is done, and + the value of <[str]> is stored in <<*<[tail]>>>. Otherwise, + the substring is converted, and a pointer to the final string + (which will contain at least the terminating null character of + <[str]>) is stored in <<*<[tail]>>>. If you want no + assignment to <<*<[tail]>>>, pass a null pointer as <[tail]>. + + This implementation returns the nearest machine number to the + input decimal string. Ties are broken by using the IEEE + round-even rule. However, <> is currently subject to + double rounding errors. + + <>, <>, <> are like <>, + <>, <> but perform the conversion based on the + locale specified by the locale object locale. If <[locale]> is + LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is + undefined. + + The alternate function <<_strtod_r>> is a reentrant version. + The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS + These functions return the converted substring value, if any. If + no conversion could be performed, 0 is returned. If the correct + value is out of the range of representable values, plus or minus + <> (<>, <>) is returned, and + <> is stored in errno. If the correct value would cause + underflow, 0 is returned and <> is stored in errno. + +PORTABILITY +<> is ANSI. +<>, <> are C99. +<>, <>, <> are GNU extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998-2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +/* Original file gdtoa-strtod.c Modified 06-21-2006 by Jeff Johnston to work within newlib. */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" +#include "gdtoa.h" +#include "../locale/setlocale.h" + +/* #ifndef NO_FENV_H */ +/* #include */ +/* #endif */ + +#include "locale.h" + +#ifdef IEEE_Arith +#ifndef NO_IEEE_Scale +#define Avoid_Underflow +#undef tinytens +/* The factor of 2^106 in tinytens[4] helps us avoid setting the underflow */ +/* flag unnecessarily. It leads to a song and dance at the end of strtod. */ +static const double tinytens[] = { 1e-16, 1e-32, +#ifdef _DOUBLE_IS_32BITS + 0.0, 0.0, 0.0 +#else + 1e-64, 1e-128, + 9007199254740992. * 9007199254740992.e-256 +#endif + }; + +#endif +#endif + +#ifdef Honor_FLT_ROUNDS +#define Rounding rounding +#undef Check_FLT_ROUNDS +#define Check_FLT_ROUNDS +#else +#define Rounding Flt_Rounds +#endif + +#ifdef IEEE_MC68k +#define _0 0 +#define _1 1 +#else +#define _0 1 +#define _1 0 +#endif + +#ifdef Avoid_Underflow /*{*/ + static double +sulp (U x, + int scale) +{ + U u; + double rv; + int i; + + rv = ulp(dval(x)); + if (!scale || (i = 2*P + 1 - ((dword0(x) & Exp_mask) >> Exp_shift)) <= 0) + return rv; /* Is there an example where i <= 0 ? */ + dword0(u) = Exp_1 + ((__int32_t)i << Exp_shift); +#ifndef _DOUBLE_IS_32BITS + dword1(u) = 0; +#endif + return rv * u.d; + } +#endif /*}*/ + + +#ifndef NO_HEX_FP + +static void +ULtod (__ULong *L, + __ULong *bits, + Long exp, + int k) +{ + switch(k & STRTOG_Retmask) { + case STRTOG_NoNumber: + case STRTOG_Zero: + L[0] = L[1] = 0; + break; + + case STRTOG_Denormal: + L[_1] = bits[0]; + L[_0] = bits[1]; + break; + + case STRTOG_Normal: + case STRTOG_NaNbits: + L[_1] = bits[0]; + L[_0] = (bits[1] & ~0x100000) | ((exp + 0x3ff + 52) << 20); + break; + + case STRTOG_Infinite: + L[_0] = 0x7ff00000; + L[_1] = 0; + break; + + case STRTOG_NaN: + L[_0] = 0x7fffffff; + L[_1] = (__ULong)-1; + } + if (k & STRTOG_Neg) + L[_0] |= 0x80000000L; +} +#endif /* !NO_HEX_FP */ + +double +_strtod_l (struct _reent *ptr, const char *__restrict s00, char **__restrict se, + locale_t loc) +{ +#ifdef Avoid_Underflow + int scale; +#endif + int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign, + e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; + const char *s, *s0, *s1; + double aadj, adj; + U aadj1, rv, rv0; + Long L; + __ULong y, z; + _Bigint *bb = NULL, *bb1, *bd = NULL, *bd0, *bs = NULL, *delta = NULL; +#ifdef Avoid_Underflow + __ULong Lsb, Lsb1; +#endif +#ifdef SET_INEXACT + int inexact, oldinexact; +#endif +#ifdef Honor_FLT_ROUNDS + int rounding; +#endif +#ifdef __HAVE_LOCALE_INFO__ + const char *decimal_point = __get_numeric_locale(loc)->decimal_point; + const int dec_len = strlen (decimal_point); +#else + const char *decimal_point = "."; + const int dec_len = 1; +#endif + + delta = bs = bd = NULL; + sign = nz0 = nz = decpt = 0; + dval(rv) = 0.; + for(s = s00;;s++) switch(*s) { + case '-': + sign = 1; + /* no break */ + case '+': + if (*++s) + goto break2; + /* no break */ + case 0: + goto ret0; + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + case ' ': + continue; + default: + goto break2; + } + break2: + if (*s == '0') { +#ifndef NO_HEX_FP + { + static const FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI }; + Long exp; + __ULong bits[2]; + switch(s[1]) { + case 'x': + case 'X': + /* If the number is not hex, then the parse of + 0 is still valid. */ + s00 = s + 1; + { +#if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD) + FPI fpi1 = fpi; + switch(fegetround()) { + case FE_TOWARDZERO: fpi1.rounding = 0; break; + case FE_UPWARD: fpi1.rounding = 2; break; + case FE_DOWNWARD: fpi1.rounding = 3; + } +#else +#define fpi1 fpi +#endif + switch((i = gethex(ptr, &s, &fpi1, &exp, &bb, sign, loc)) & STRTOG_Retmask) { + case STRTOG_NoNumber: + s = s00; + sign = 0; + /* FALLTHROUGH */ + case STRTOG_Zero: + break; + default: + if (bb) { + copybits(bits, fpi.nbits, bb); + Bfree(ptr,bb); + } + ULtod(rv.i, bits, exp, i); +#ifndef NO_ERRNO + /* try to avoid the bug of testing an 8087 register value */ + if ((dword0(rv)&Exp_mask) == 0) + errno = ERANGE; +#endif + }} + goto ret; + } + } +#endif + nz0 = 1; + while(*++s == '0') ; + if (!*s) + goto ret; + } + s0 = s; + y = z = 0; + for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) + if (nd < 9) + y = 10*y + c - '0'; + else + z = 10*z + c - '0'; + nd0 = nd; + if (strncmp (s, decimal_point, dec_len) == 0) + { + decpt = 1; + c = *(s += dec_len); + if (!nd) { + for(; c == '0'; c = *++s) + nz++; + if (c > '0' && c <= '9') { + s0 = s; + nf += nz; + nz = 0; + goto have_dig; + } + goto dig_done; + } + for(; c >= '0' && c <= '9'; c = *++s) { + have_dig: + nz++; + if (c -= '0') { + nf += nz; + for(i = 1; i < nz; i++) + if (nd++ < 9) + y *= 10; + else if (nd <= DBL_DIG + 1) + z *= 10; + if (nd++ < 9) + y = 10*y + c; + else if (nd <= DBL_DIG + 1) + z = 10*z + c; + nz = 0; + } + } + } + dig_done: + e = 0; + if (c == 'e' || c == 'E') { + if (!nd && !nz && !nz0) { + goto ret0; + } + s00 = s; + esign = 0; + switch(c = *++s) { + case '-': + esign = 1; + case '+': + c = *++s; + } + if (c >= '0' && c <= '9') { + while(c == '0') + c = *++s; + if (c > '0' && c <= '9') { + L = c - '0'; + s1 = s; + while((c = *++s) >= '0' && c <= '9') + L = 10*L + c - '0'; + if (s - s1 > 8 || L > 19999) + /* Avoid confusion from exponents + * so large that e might overflow. + */ + e = 19999; /* safe for 16 bit ints */ + else + e = (int)L; + if (esign) + e = -e; + } + else + e = 0; + } + else + s = s00; + } + if (!nd) { + if (!nz && !nz0) { +#ifdef INFNAN_CHECK + /* Check for Nan and Infinity */ + __ULong bits[2]; + static const FPI fpinan = /* only 52 explicit bits */ + { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI }; + if (!decpt) + switch(c) { + case 'i': + case 'I': + if (match(&s,"nf")) { + --s; + if (!match(&s,"inity")) + ++s; + dword0(rv) = 0x7ff00000; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ + goto ret; + } + break; + case 'n': + case 'N': + if (match(&s, "an")) { +#ifndef No_Hex_NaN + if (*s == '(' /*)*/ + && hexnan(&s, &fpinan, bits) + == STRTOG_NaNbits) { + dword0(rv) = 0x7ff00000 | bits[1]; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = bits[0]; +#endif /*!_DOUBLE_IS_32BITS*/ + } + else { +#endif + dval(rv) = nan (""); +#ifndef No_Hex_NaN + } +#endif + goto ret; + } + } +#endif /* INFNAN_CHECK */ + ret0: + s = s00; + sign = 0; + } + goto ret; + } + e1 = e -= nf; + + /* Now we have nd0 digits, starting at s0, followed by a + * decimal point, followed by nd-nd0 digits. The number we're + * after is the integer represented by those digits times + * 10**e */ + + if (!nd0) + nd0 = nd; + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(rv) = y; + if (k > 9) { +#ifdef SET_INEXACT + if (k > DBL_DIG) + oldinexact = get_inexact(); +#endif + dval(rv) = tens[k - 9] * dval(rv) + z; + } + bd0 = 0; + if (nd <= DBL_DIG +#ifndef RND_PRODQUOT +#ifndef Honor_FLT_ROUNDS + && Flt_Rounds == 1 +#endif +#endif + ) { + if (!e) + goto ret; + if (e > 0) { + if (e <= Ten_pmax) { +#ifdef VAX + goto vax_ovfl_check; +#else +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + dval(rv) = -dval(rv); + sign = 0; + } +#endif + /* rv = */ rounded_product(dval(rv), tens[e]); + goto ret; +#endif + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + dval(rv) = -dval(rv); + sign = 0; + } +#endif + e -= i; + dval(rv) *= tens[i]; +#ifdef VAX + /* VAX exponent range is so narrow we must + * worry about overflow here... + */ + vax_ovfl_check: + dword0(rv) -= P*Exp_msk1; + /* rv = */ rounded_product(dval(rv), tens[e]); + if ((dword0(rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) + goto ovfl; + dword0(rv) += P*Exp_msk1; +#else + /* rv = */ rounded_product(dval(rv), tens[e]); +#endif + goto ret; + } + } +#ifndef Inaccurate_Divide + else if (e >= -Ten_pmax) { +#ifdef Honor_FLT_ROUNDS + /* round correctly FLT_ROUNDS = 2 or 3 */ + if (sign) { + dval(rv) = -dval(rv); + sign = 0; + } +#endif + /* rv = */ rounded_quotient(dval(rv), tens[-e]); + goto ret; + } +#endif + } + e1 += nd - k; + +#ifdef IEEE_Arith +#ifdef SET_INEXACT + inexact = 1; + if (k <= DBL_DIG) + oldinexact = get_inexact(); +#endif +#ifdef Avoid_Underflow + scale = 0; +#endif +#ifdef Honor_FLT_ROUNDS + if ((rounding = Flt_Rounds) >= 2) { + if (sign) + rounding = rounding == 2 ? 0 : 2; + else + if (rounding != 2) + rounding = 0; + } +#endif +#endif /*IEEE_Arith*/ + + /* Get starting approximation = rv * 10**e1 */ + + if (e1 > 0) { + if ( (i = e1 & 15) !=0) + dval(rv) *= tens[i]; + if (e1 &= ~15) { + if (e1 > DBL_MAX_10_EXP) { + ovfl: +#ifndef NO_ERRNO + _REENT_ERRNO(ptr) = ERANGE; +#endif + /* Can't trust HUGE_VAL */ +#ifdef IEEE_Arith +#ifdef Honor_FLT_ROUNDS + switch(rounding) { + case 0: /* toward 0 */ + case 3: /* toward -infinity */ + dword0(rv) = Big0; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = Big1; +#endif /*!_DOUBLE_IS_32BITS*/ + break; + default: + dword0(rv) = Exp_mask; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ + } +#else /*Honor_FLT_ROUNDS*/ + dword0(rv) = Exp_mask; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ +#endif /*Honor_FLT_ROUNDS*/ +#ifdef SET_INEXACT + /* set overflow bit */ + dval(rv0) = 1e300; + dval(rv0) *= dval(rv0); +#endif +#else /*IEEE_Arith*/ + dword0(rv) = Big0; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = Big1; +#endif /*!_DOUBLE_IS_32BITS*/ +#endif /*IEEE_Arith*/ + if (bd0) + goto retfree; + goto ret; + } + e1 >>= 4; + for(j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= bigtens[j]; + /* The last multiplication could overflow. */ + dword0(rv) -= P*Exp_msk1; + dval(rv) *= bigtens[j]; + if ((z = dword0(rv) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-P)) + goto ovfl; + if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) { + /* set to largest number */ + /* (Can't trust DBL_MAX) */ + dword0(rv) = Big0; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = Big1; +#endif /*!_DOUBLE_IS_32BITS*/ + } + else + dword0(rv) += P*Exp_msk1; + } + } + else if (e1 < 0) { + e1 = -e1; + if ( (i = e1 & 15) !=0) + dval(rv) /= tens[i]; + if (e1 >>= 4) { + if (e1 >= 1 << n_bigtens) + goto undfl; +#ifdef Avoid_Underflow + if (e1 & Scale_Bit) + scale = 2*P; + for(j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + if (scale && (j = 2*P + 1 - ((dword0(rv) & Exp_mask) + >> Exp_shift)) > 0) { + /* scaled rv is denormal; zap j low bits */ + if (j >= 32) { +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ + if (j >= 53) + dword0(rv) = (P+2)*Exp_msk1; + else + dword0(rv) &= 0xffffffff << (j-32); + } +#ifndef _DOUBLE_IS_32BITS + else + dword1(rv) &= 0xffffffff << j; +#endif /*!_DOUBLE_IS_32BITS*/ + } +#else + for(j = 0; e1 > 1; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + /* The last multiplication could underflow. */ + dval(rv0) = dval(rv); + dval(rv) *= tinytens[j]; + if (!dval(rv)) { + dval(rv) = 2.*dval(rv0); + dval(rv) *= tinytens[j]; +#endif + if (!dval(rv)) { + undfl: + dval(rv) = 0.; +#ifndef NO_ERRNO + _REENT_ERRNO(ptr) = ERANGE; +#endif + if (bd0) + goto retfree; + goto ret; + } +#ifndef Avoid_Underflow +#ifndef _DOUBLE_IS_32BITS + dword0(rv) = Tiny0; + dword1(rv) = Tiny1; +#else + dword0(rv) = Tiny1; +#endif /*_DOUBLE_IS_32BITS*/ + /* The refinement below will clean + * this approximation up. + */ + } +#endif + } + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bd0 = s2b(ptr, s0, nd0, nd, y); + if (bd0 == NULL) + goto ovfl; + + for(;;) { + bd = Balloc(ptr,bd0->_k); + if (bd == NULL) + goto ovfl; + Bcopy(bd, bd0); + bb = d2b(ptr,dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ + if (bb == NULL) + goto ovfl; + bs = i2b(ptr,1); + if (bs == NULL) + goto ovfl; + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; +#ifdef Honor_FLT_ROUNDS + if (rounding != 1) + bs2++; +#endif +#ifdef Avoid_Underflow + Lsb = LSB; + Lsb1 = 0; + j = bbe - scale; + i = j + bbbits - 1; /* logb(rv) */ + j = P + 1 - bbbits; + if (i < Emin) { /* denormal */ + i = Emin - i; + j -= i; + if (i < 32) + Lsb <<= i; + else + Lsb1 = Lsb << (i-32); + } +#else /*Avoid_Underflow*/ +#ifdef Sudden_Underflow +#ifdef IBM + j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3); +#else + j = P + 1 - bbbits; +#endif +#else /*Sudden_Underflow*/ + j = bbe; + i = j + bbbits - 1; /* logb(rv) */ + if (i < Emin) /* denormal */ + j += P - Emin; + else + j = P + 1 - bbbits; +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + bb2 += j; + bd2 += j; +#ifdef Avoid_Underflow + bd2 += scale; +#endif + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + if (bb5 > 0) { + bs = pow5mult(ptr, bs, bb5); + if (bs == NULL) + goto ovfl; + bb1 = mult(ptr, bs, bb); + if (bb1 == NULL) + goto ovfl; + Bfree(ptr, bb); + bb = bb1; + } + if (bb2 > 0) { + bb = lshift(ptr, bb, bb2); + if (bb == NULL) + goto ovfl; + } + if (bd5 > 0) { + bd = pow5mult(ptr, bd, bd5); + if (bd == NULL) + goto ovfl; + } + if (bd2 > 0) { + bd = lshift(ptr, bd, bd2); + if (bd == NULL) + goto ovfl; + } + if (bs2 > 0) { + bs = lshift(ptr, bs, bs2); + if (bs == NULL) + goto ovfl; + } + delta = diff(ptr, bb, bd); + if (delta == NULL) + goto ovfl; + dsign = delta->_sign; + delta->_sign = 0; + i = cmp(delta, bs); +#ifdef Honor_FLT_ROUNDS + if (rounding != 1) { + if (i < 0) { + /* Error is less than an ulp */ + if (!delta->_x[0] && delta->_wds <= 1) { + /* exact */ +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + if (rounding) { + if (dsign) { + adj = 1.; + goto apply_adj; + } + } + else if (!dsign) { + adj = -1.; + if (!dword1(rv) + && !(dword0(rv) & Frac_mask)) { + y = dword0(rv) & Exp_mask; +#ifdef Avoid_Underflow + if (!scale || y > 2*P*Exp_msk1) +#else + if (y) +#endif + { + delta = lshift(ptr, delta,Log2P); + if (cmp(delta, bs) <= 0) + adj = -0.5; + } + } + apply_adj: +#ifdef Avoid_Underflow + if (scale && (y = dword0(rv) & Exp_mask) + <= 2*P*Exp_msk1) + dword0(adj) += (2*P+1)*Exp_msk1 - y; +#else +#ifdef Sudden_Underflow + if ((dword0(rv) & Exp_mask) <= + P*Exp_msk1) { + dword0(rv) += P*Exp_msk1; + dval(rv) += adj*ulp(dval(rv)); + dword0(rv) -= P*Exp_msk1; + } + else +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + dval(rv) += adj*ulp(dval(rv)); + } + break; + } + adj = ratio(delta, bs); + if (adj < 1.) + adj = 1.; + if (adj <= 0x7ffffffe) { + /* adj = rounding ? ceil(adj) : floor(adj); */ + y = adj; + if (y != adj) { + if (!((rounding>>1) ^ dsign)) + y++; + adj = y; + } + } +#ifdef Avoid_Underflow + if (scale && (y = dword0(rv) & Exp_mask) <= 2*P*Exp_msk1) + dword0(adj) += (2*P+1)*Exp_msk1 - y; +#else +#ifdef Sudden_Underflow + if ((dword0(rv) & Exp_mask) <= P*Exp_msk1) { + dword0(rv) += P*Exp_msk1; + adj *= ulp(dval(rv)); + if (dsign) + dval(rv) += adj; + else + dval(rv) -= adj; + dword0(rv) -= P*Exp_msk1; + goto cont; + } +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + adj *= ulp(dval(rv)); + if (dsign) { + if (dword0(rv) == Big0 && dword1(rv) == Big1) + goto ovfl; + dval(rv) += adj; + else + dval(rv) -= adj; + goto cont; + } +#endif /*Honor_FLT_ROUNDS*/ + + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + if (dsign || dword1(rv) || dword0(rv) & Bndry_mask +#ifdef IEEE_Arith +#ifdef Avoid_Underflow + || (dword0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1 +#else + || (dword0(rv) & Exp_mask) <= Exp_msk1 +#endif +#endif + ) { +#ifdef SET_INEXACT + if (!delta->x[0] && delta->wds <= 1) + inexact = 0; +#endif + break; + } + if (!delta->_x[0] && delta->_wds <= 1) { + /* exact result */ +#ifdef SET_INEXACT + inexact = 0; +#endif + break; + } + delta = lshift(ptr,delta,Log2P); + if (cmp(delta, bs) > 0) + goto drop_down; + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if ((dword0(rv) & Bndry_mask1) == Bndry_mask1 + && dword1(rv) == ( +#ifdef Avoid_Underflow + (scale && (y = dword0(rv) & Exp_mask) <= 2*P*Exp_msk1) + ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) : +#endif + 0xffffffff)) { + /*boundary case -- increment exponent*/ + if (dword0(rv) == Big0 && dword1(rv) == Big1) + goto ovfl; + dword0(rv) = (dword0(rv) & Exp_mask) + + Exp_msk1 +#ifdef IBM + | Exp_msk1 >> 4 +#endif + ; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ +#ifdef Avoid_Underflow + dsign = 0; +#endif + break; + } + } + else if (!(dword0(rv) & Bndry_mask) && !dword1(rv)) { + drop_down: + /* boundary case -- decrement exponent */ +#ifdef Sudden_Underflow /*{{*/ + L = dword0(rv) & Exp_mask; +#ifdef IBM + if (L < Exp_msk1) +#else +#ifdef Avoid_Underflow + if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1)) +#else + if (L <= Exp_msk1) +#endif /*Avoid_Underflow*/ +#endif /*IBM*/ + goto undfl; + L -= Exp_msk1; +#else /*Sudden_Underflow}{*/ +#ifdef Avoid_Underflow + if (scale) { + L = dword0(rv) & Exp_mask; + if (L <= (2*P+1)*Exp_msk1) { + if (L > (P+2)*Exp_msk1) + /* round even ==> */ + /* accept rv */ + break; + /* rv = smallest denormal */ + goto undfl; + } + } +#endif /*Avoid_Underflow*/ + L = (dword0(rv) & Exp_mask) - Exp_msk1; +#endif /*Sudden_Underflow}*/ + dword0(rv) = L | Bndry_mask1; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = 0xffffffff; +#endif /*!_DOUBLE_IS_32BITS*/ +#ifdef IBM + goto cont; +#else + break; +#endif + } +#ifndef ROUND_BIASED +#ifdef Avoid_Underflow + if (Lsb1) { + if (!(dword0(rv) & Lsb1)) + break; + } + else if (!(dword1(rv) & Lsb)) + break; +#else + if (!(dword1(rv) & LSB)) + break; +#endif +#endif + if (dsign) +#ifdef Avoid_Underflow + dval(rv) += sulp(rv, scale); +#else + dval(rv) += ulp(dval(rv)); +#endif +#ifndef ROUND_BIASED + else { +#ifdef Avoid_Underflow + dval(rv) -= sulp(rv, scale); +#else + dval(rv) -= ulp(dval(rv)); +#endif +#ifndef Sudden_Underflow + if (!dval(rv)) + goto undfl; +#endif + } +#ifdef Avoid_Underflow + dsign = 1 - dsign; +#endif +#endif + break; + } + if ((aadj = ratio(delta, bs)) <= 2.) { + if (dsign) + aadj = dval(aadj1) = 1.; + else if (dword1(rv) || dword0(rv) & Bndry_mask) { +#ifndef Sudden_Underflow + if (dword1(rv) == Tiny1 && !dword0(rv)) + goto undfl; +#endif + aadj = 1.; + dval(aadj1) = -1.; + } + else { + /* special case -- power of FLT_RADIX to be */ + /* rounded down... */ + + if (aadj < 2./FLT_RADIX) + aadj = 1./FLT_RADIX; + else + aadj *= 0.5; + dval(aadj1) = -aadj; + } + } + else { + aadj *= 0.5; + dval(aadj1) = dsign ? aadj : -aadj; +#ifdef Check_FLT_ROUNDS + switch(Rounding) { + case 2: /* towards +infinity */ + dval(aadj1) -= 0.5; + break; + case 0: /* towards 0 */ + case 3: /* towards -infinity */ + dval(aadj1) += 0.5; + } +#else + if (Flt_Rounds == 0) + dval(aadj1) += 0.5; +#endif /*Check_FLT_ROUNDS*/ + } + y = dword0(rv) & Exp_mask; + + /* Check for overflow */ + + if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { + dval(rv0) = dval(rv); + dword0(rv) -= P*Exp_msk1; + adj = dval(aadj1) * ulp(dval(rv)); + dval(rv) += adj; + if ((dword0(rv) & Exp_mask) >= + Exp_msk1*(DBL_MAX_EXP+Bias-P)) { + if (dword0(rv0) == Big0 && dword1(rv0) == Big1) + goto ovfl; + dword0(rv) = Big0; +#ifndef _DOUBLE_IS_32BITS + dword1(rv) = Big1; +#endif /*!_DOUBLE_IS_32BITS*/ + goto cont; + } + else + dword0(rv) += P*Exp_msk1; + } + else { +#ifdef Avoid_Underflow + if (scale && y <= 2*P*Exp_msk1) { + if (aadj <= 0x7fffffff) { + if ((z = aadj) == 0) + z = 1; + aadj = z; + dval(aadj1) = dsign ? aadj : -aadj; + } + dword0(aadj1) += (2*P+1)*Exp_msk1 - y; + } + adj = dval(aadj1) * ulp(dval(rv)); + dval(rv) += adj; +#else +#ifdef Sudden_Underflow + if ((dword0(rv) & Exp_mask) <= P*Exp_msk1) { + dval(rv0) = dval(rv); + dword0(rv) += P*Exp_msk1; + adj = dval(aadj1) * ulp(dval(rv)); + dval(rv) += adj; +#ifdef IBM + if ((dword0(rv) & Exp_mask) < P*Exp_msk1) +#else + if ((dword0(rv) & Exp_mask) <= P*Exp_msk1) +#endif + { + if (dword0(rv0) == Tiny0 + && dword1(rv0) == Tiny1) + goto undfl; +#ifndef _DOUBLE_IS_32BITS + dword0(rv) = Tiny0; + dword1(rv) = Tiny1; +#else + dword0(rv) = Tiny1; +#endif /*_DOUBLE_IS_32BITS*/ + goto cont; + } + else + dword0(rv) -= P*Exp_msk1; + } + else { + adj = dval(aadj1) * ulp(dval(rv)); + dval(rv) += adj; + } +#else /*Sudden_Underflow*/ + /* Compute adj so that the IEEE rounding rules will + * correctly round rv + adj in some half-way cases. + * If rv * ulp(rv) is denormalized (i.e., + * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid + * trouble from bits lost to denormalization; + * example: 1.2e-307 . + */ + if (y <= (P-1)*Exp_msk1 && aadj > 1.) { + dval(aadj1) = (double)(int)(aadj + 0.5); + if (!dsign) + dval(aadj1) = -dval(aadj1); + } + adj = dval(aadj1) * ulp(dval(rv)); + dval(rv) += adj; +#endif /*Sudden_Underflow*/ +#endif /*Avoid_Underflow*/ + } + z = dword0(rv) & Exp_mask; +#ifndef SET_INEXACT +#ifdef Avoid_Underflow + if (!scale) +#endif + if (y == z) { + /* Can we stop now? */ +#ifndef _DOUBLE_IS_32BITS + /* If FE_INVALID floating point exceptions are + enabled, a conversion to a 32 bit value is + dangerous. A positive double value can result + in a negative 32 bit int, thus raising SIGFPE. + To avoid this, always convert into 64 bit here. */ + __int64_t L = (__int64_t)aadj; +#else + L = (Long)aadj; +#endif + aadj -= L; + /* The tolerances below are conservative. */ + if (dsign || dword1(rv) || dword0(rv) & Bndry_mask) { + if (aadj < .4999999 || aadj > .5000001) + break; + } + else if (aadj < .4999999/FLT_RADIX) + break; + } +#endif + cont: + Bfree(ptr,bb); + Bfree(ptr,bd); + Bfree(ptr,bs); + Bfree(ptr,delta); + } +#ifdef SET_INEXACT + if (inexact) { + if (!oldinexact) { + dword0(rv0) = Exp_1 + (70 << Exp_shift); +#ifndef _DOUBLE_IS_32BITS + dword1(rv0) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ + dval(rv0) += 1.; + } + } + else if (!oldinexact) + clear_inexact(); +#endif +#ifdef Avoid_Underflow + if (scale) { + dword0(rv0) = Exp_1 - 2*P*Exp_msk1; +#ifndef _DOUBLE_IS_32BITS + dword1(rv0) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ + dval(rv) *= dval(rv0); +#ifndef NO_ERRNO + /* try to avoid the bug of testing an 8087 register value */ + if ((dword0(rv) & Exp_mask) == 0) + _REENT_ERRNO(ptr) = ERANGE; +#endif + } +#endif /* Avoid_Underflow */ +#ifdef SET_INEXACT + if (inexact && !(dword0(rv) & Exp_mask)) { + /* set underflow bit */ + dval(rv0) = 1e-300; + dval(rv0) *= dval(rv0); + } +#endif + retfree: + Bfree(ptr,bb); + Bfree(ptr,bd); + Bfree(ptr,bs); + Bfree(ptr,bd0); + Bfree(ptr,delta); + ret: + if (se) + *se = (char *)s; + return sign ? -dval(rv) : dval(rv); +} + +double +_strtod_r (struct _reent *ptr, + const char *__restrict s00, + char **__restrict se) +{ + return _strtod_l (ptr, s00, se, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +double +strtod_l (const char *__restrict s00, char **__restrict se, locale_t loc) +{ + return _strtod_l (_REENT, s00, se, loc); +} + +double +strtod (const char *__restrict s00, char **__restrict se) +{ + return _strtod_l (_REENT, s00, se, __get_current_locale ()); +} + +float +strtof_l (const char *__restrict s00, char **__restrict se, locale_t loc) +{ + double val = _strtod_l (_REENT, s00, se, loc); + if (isnan (val)) + return signbit (val) ? -nanf ("") : nanf (""); + float retval = (float) val; +#ifndef NO_ERRNO + if (isinf (retval) && !isinf (val)) + _REENT_ERRNO(_REENT) = ERANGE; +#endif + return retval; +} + +/* + * These two functions are not quite correct as they return true for + * zero, however they are 'good enough' for the test in strtof below + * as we only need to know whether the double test is false when + * the float test is true. + */ +static inline int +isdenorm(double d) +{ + U u; + dval(u) = d; + return (dword0(u) & Exp_mask) == 0; +} + +static inline int +isdenormf(float f) +{ + union { float f; __uint32_t i; } u; + u.f = f; + return (u.i & 0x7f800000) == 0; +} + +float +strtof (const char *__restrict s00, + char **__restrict se) +{ + double val = _strtod_l (_REENT, s00, se, __get_current_locale ()); + if (isnan (val)) + return signbit (val) ? -nanf ("") : nanf (""); + float retval = (float) val; +#ifndef NO_ERRNO + if ((isinf (retval) && !isinf (val)) || (isdenormf(retval) && !isdenorm(val))) + _REENT_ERRNO(_REENT) = ERANGE; +#endif + return retval; +} + +#endif diff --git a/lib/stdlib/strtodg.c b/lib/stdlib/strtodg.c new file mode 100644 index 0000000..0b5af99 --- /dev/null +++ b/lib/stdlib/strtodg.c @@ -0,0 +1,1126 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998-2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" +#include "gdtoa.h" + +#include "locale.h" + +#if defined (_HAVE_LONG_DOUBLE) && !defined (_LDBL_EQ_DBL) + +#define USE_LOCALE + + static const int +fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21, + 24, 26, 28, 31, 33, 35, 38, 40, 42, 45, + 47, 49, 52 +#ifdef VAX + , 54, 56 +#endif + }; + +static _Bigint * +sum (struct _reent *p, _Bigint *a, _Bigint *b) +{ + _Bigint *c; + __ULong carry, *xc, *xa, *xb, *xe, y; +#ifdef Pack_32 + __ULong z; +#endif + + if (a->_wds < b->_wds) { + c = b; b = a; a = c; + } + c = eBalloc(p, a->_k); + c->_wds = a->_wds; + carry = 0; + xa = a->_x; + xb = b->_x; + xc = c->_x; + xe = xc + b->_wds; +#ifdef Pack_32 + do { + y = (*xa & 0xffff) + (*xb & 0xffff) + carry; + carry = (y & 0x10000) >> 16; + z = (*xa++ >> 16) + (*xb++ >> 16) + carry; + carry = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } + while(xc < xe); + xe += a->_wds - b->_wds; + while(xc < xe) { + y = (*xa & 0xffff) + carry; + carry = (y & 0x10000) >> 16; + z = (*xa++ >> 16) + carry; + carry = (z & 0x10000) >> 16; + Storeinc(xc, z, y); + } +#else + do { + y = *xa++ + *xb++ + carry; + carry = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } + while(xc < xe); + xe += a->_wds - b->_wds; + while(xc < xe) { + y = *xa++ + carry; + carry = (y & 0x10000) >> 16; + *xc++ = y & 0xffff; + } +#endif + if (carry) { + if (c->_wds == c->_maxwds) { + b = eBalloc(p, c->_k + 1); + Bcopy(b, c); + Bfree(p, c); + c = b; + } + c->_x[c->_wds++] = 1; + } + return c; + } + +static void +rshift (_Bigint *b, int k) +{ + __ULong *x, *x1, *xe, y; + int n; + + x = x1 = b->_x; + n = k >> kshift; + if (n < b->_wds) { + xe = x + b->_wds; + x += n; + if (k &= kmask) { + n = ULbits - k; + y = *x++ >> k; + while(x < xe) { + *x1++ = (y | (*x << n)) & ALL_ON; + y = *x++ >> k; + } + if ((*x1 = y) !=0) + x1++; + } + else + while(x < xe) + *x1++ = *x++; + } + if ((b->_wds = x1 - b->_x) == 0) + b->_x[0] = 0; + } + +static int +trailz (_Bigint *b) +{ + __ULong L, *x, *xe; + int n = 0; + + x = b->_x; + xe = x + b->_wds; + for(n = 0; x < xe && !*x; x++) + n += ULbits; + if (x < xe) { + L = *x; + n += lo0bits(&L); + } + return n; + } + +_Bigint * +increment (struct _reent *p, _Bigint *b) +{ + __ULong *x, *xe; + _Bigint *b1; +#ifdef Pack_16 + __ULong carry = 1, y; +#endif + + x = b->_x; + xe = x + b->_wds; +#ifdef Pack_32 + do { + if (*x < (__ULong)0xffffffffL) { + ++*x; + return b; + } + *x++ = 0; + } while(x < xe); +#else + do { + y = *x + carry; + carry = y >> 16; + *x++ = y & 0xffff; + if (!carry) + return b; + } while(x < xe); + if (carry) +#endif + { + if (b->_wds >= b->_maxwds) { + b1 = eBalloc(p,b->_k+1); + Bcopy(b1,b); + Bfree(p,b); + b = b1; + } + b->_x[b->_wds++] = 1; + } + return b; + } + +int +decrement (_Bigint *b) +{ + __ULong *x, *xe; +#ifdef Pack_16 + __ULong borrow = 1, y; +#endif + + x = b->_x; + xe = x + b->_wds; +#ifdef Pack_32 + do { + if (*x) { + --*x; + break; + } + *x++ = 0xffffffffL; + } + while(x < xe); +#else + do { + y = *x - borrow; + borrow = (y & 0x10000) >> 16; + *x++ = y & 0xffff; + } while(borrow && x < xe); +#endif + return STRTOG_Inexlo; + } + +static int +all_on (_Bigint *b, int n) +{ + __ULong *x, *xe; + + x = b->_x; + xe = x + (n >> kshift); + while(x < xe) + if ((*x++ & ALL_ON) != ALL_ON) + return 0; + if (n &= kmask) + return ((*x | (ALL_ON << n)) & ALL_ON) == ALL_ON; + return 1; + } + +_Bigint * +set_ones (struct _reent *p, _Bigint *b, int n) +{ + int k; + __ULong *x, *xe; + + k = (n + ((1 << kshift) - 1)) >> kshift; + if (b->_k < k) { + Bfree(p,b); + b = eBalloc(p,k); + } + k = n >> kshift; + if (n &= kmask) + k++; + b->_wds = k; + x = b->_x; + xe = x + k; + while(x < xe) + *x++ = ALL_ON; + if (n) + x[-1] >>= ULbits - n; + return b; + } + +static int +rvOK (struct _reent *p, double d, FPI *fpi, Long *exp, __ULong *bits, int exact, + int rd, int *irv) +{ + _Bigint *b; + __ULong carry, inex, lostbits; + int bdif, e, j, k, k1, nb, rv; + + carry = rv = 0; + b = d2b(p, d, &e, &bdif); + bdif -= nb = fpi->nbits; + e += bdif; + if (bdif <= 0) { + if (exact) + goto trunc; + goto ret; + } + if (P == nb) { + if ( +#ifndef IMPRECISE_INEXACT + exact && +#endif + fpi->rounding == +#ifdef RND_PRODQUOT + FPI_Round_near +#else + Flt_Rounds +#endif + ) goto trunc; + goto ret; + } + switch(rd) { + case 1: + goto trunc; + case 2: + break; + default: /* round near */ + k = bdif - 1; + if (k < 0) + goto trunc; + if (!k) { + if (!exact) + goto ret; + if (b->_x[0] & 2) + break; + goto trunc; + } + if (b->_x[k>>kshift] & ((__ULong)1 << (k & kmask))) + break; + goto trunc; + } + /* "break" cases: round up 1 bit, then truncate; bdif > 0 */ + carry = 1; + trunc: + inex = lostbits = 0; + if (bdif > 0) { + if ( (lostbits = any_on(b, bdif)) !=0) + inex = STRTOG_Inexlo; + rshift(b, bdif); + if (carry) { + inex = STRTOG_Inexhi; + b = increment(p, b); + if ( (j = nb & kmask) !=0) + j = ULbits - j; + if (hi0bits(b->_x[b->_wds - 1]) != j) { + if (!lostbits) + lostbits = b->_x[0] & 1; + rshift(b, 1); + e++; + } + } + } + else if (bdif < 0) + b = lshift(p, b, -bdif); + if (e < fpi->emin) { + k = fpi->emin - e; + e = fpi->emin; + if (k > nb || fpi->sudden_underflow) { + b->_wds = inex = 0; + *irv = STRTOG_Underflow | STRTOG_Inexlo; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + } + else { + k1 = k - 1; + if (k1 > 0 && !lostbits) + lostbits = any_on(b, k1); + if (!lostbits && !exact) + goto ret; + lostbits |= + carry = b->_x[k1>>kshift] & (1 << (k1 & kmask)); + rshift(b, k); + *irv = STRTOG_Denormal; + if (carry) { + b = increment(p, b); + inex = STRTOG_Inexhi | STRTOG_Underflow; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + } + else if (lostbits) + inex = STRTOG_Inexlo | STRTOG_Underflow; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + } + } + else if (e > fpi->emax) { + e = fpi->emax + 1; + *irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + b->_wds = inex = 0; + } + *exp = e; + copybits(bits, nb, b); + *irv |= inex; + rv = 1; + ret: + Bfree(p,b); + return rv; + } + +static int +mantbits (U d) +{ + __ULong L; +#ifdef VAX + L = word1(d) << 16 | word1(d) >> 16; + if (L) +#else + if ( (L = word1(d)) !=0) +#endif + return P - lo0bits(&L); +#ifdef VAX + L = word0(d) << 16 | word0(d) >> 16 | Exp_msk11; +#else + L = word0(d) | Exp_msk1; +#endif + return P - 32 - lo0bits(&L); + } + +int +_strtodg_l (struct _reent *p, const char *s00, char **se, FPI *fpi, Long *exp, + __ULong *bits, locale_t loc) +{ + int abe, abits, asub; + int bb0, bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, denorm; + int dsign, e, e1, e2, emin, esign, finished, i, inex, irv; + int j, k, nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign; + int sudden_underflow; + const char *s, *s0, *s1; + //double adj, adj0, rv, tol; + double adj0, tol; + U adj, rv; + Long L; + __ULong y, z; + _Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0; + const char *decimal_point = __get_numeric_locale(loc)->decimal_point; + int dec_len = strlen (decimal_point); + + irv = STRTOG_Zero; + denorm = sign = nz0 = nz = 0; + dval(rv) = 0.; + rvb = 0; + nbits = fpi->nbits; + for(s = s00;;s++) switch(*s) { + case '-': + sign = 1; + /* no break */ + case '+': + if (*++s) + goto break2; + /* no break */ + case 0: + sign = 0; + irv = STRTOG_NoNumber; + s = s00; + goto ret; + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + case ' ': + continue; + default: + goto break2; + } + break2: + if (*s == '0') { +#ifndef NO_HEX_FP + switch(s[1]) { + case 'x': + case 'X': + irv = gethex(p, &s, fpi, exp, &rvb, sign, loc); + if (irv == STRTOG_NoNumber) { + s = s00; + sign = 0; + } + goto ret; + } +#endif + nz0 = 1; + while(*++s == '0') ; + if (!*s) + goto ret; + } + sudden_underflow = fpi->sudden_underflow; + s0 = s; + y = z = 0; + for(decpt = nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++) + if (nd < 9) + y = 10*y + c - '0'; + else if (nd < 16) + z = 10*z + c - '0'; + nd0 = nd; +#ifdef USE_LOCALE + if (strncmp (s, decimal_point, dec_len) == 0) +#else + if (c == '.') +#endif + { + decpt = 1; +#ifdef USE_LOCALE + c = *(s += dec_len); +#else + c = *++s; +#endif + if (!nd) { + for(; c == '0'; c = *++s) + nz++; + if (c > '0' && c <= '9') { + s0 = s; + nf += nz; + nz = 0; + goto have_dig; + } + goto dig_done; + } + for(; c >= '0' && c <= '9'; c = *++s) { + have_dig: + nz++; + if (c -= '0') { + nf += nz; + for(i = 1; i < nz; i++) + if (nd++ < 9) + y *= 10; + else if (nd <= DBL_DIG + 1) + z *= 10; + if (nd++ < 9) + y = 10*y + c; + else if (nd <= DBL_DIG + 1) + z = 10*z + c; + nz = 0; + } + } + } + dig_done: + e = 0; + if (c == 'e' || c == 'E') { + if (!nd && !nz && !nz0) { + irv = STRTOG_NoNumber; + s = s00; + goto ret; + } + s00 = s; + esign = 0; + switch(c = *++s) { + case '-': + esign = 1; + case '+': + c = *++s; + } + if (c >= '0' && c <= '9') { + while(c == '0') + c = *++s; + if (c > '0' && c <= '9') { + L = c - '0'; + s1 = s; + while((c = *++s) >= '0' && c <= '9') + L = 10*L + c - '0'; + if (s - s1 > 8 || L > 19999) + /* Avoid confusion from exponents + * so large that e might overflow. + */ + e = 19999; /* safe for 16 bit ints */ + else + e = (int)L; + if (esign) + e = -e; + } + else + e = 0; + } + else + s = s00; + } + if (!nd) { + if (!nz && !nz0) { +#ifdef INFNAN_CHECK + /* Check for Nan and Infinity */ + if (!decpt) + switch(c) { + case 'i': + case 'I': + if (match(&s,"nf")) { + --s; + if (!match(&s,"inity")) + ++s; + irv = STRTOG_Infinite; + goto infnanexp; + } + break; + case 'n': + case 'N': + if (match(&s, "an")) { + irv = STRTOG_NaN; + *exp = fpi->emax + 1; +#ifndef No_Hex_NaN + if (*s == '(') /*)*/ + irv = hexnan(&s, fpi, bits); +#endif + goto infnanexp; + } + } +#endif /* INFNAN_CHECK */ + irv = STRTOG_NoNumber; + s = s00; + } + goto ret; + } + + irv = STRTOG_Normal; + e1 = e -= nf; + rd = 0; + switch(fpi->rounding & 3) { + case FPI_Round_up: + rd = 2 - sign; + break; + case FPI_Round_zero: + rd = 1; + break; + case FPI_Round_down: + rd = 1 + sign; + } + + /* Now we have nd0 digits, starting at s0, followed by a + * decimal point, followed by nd-nd0 digits. The number we're + * after is the integer represented by those digits times + * 10**e */ + + if (!nd0) + nd0 = nd; + k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; + dval(rv) = y; + if (k > 9) + dval(rv) = tens[k - 9] * dval(rv) + z; + bd0 = 0; + if (nbits <= P && nd <= DBL_DIG) { + if (!e) { + if (rvOK(p, dval(rv), fpi, exp, bits, 1, rd, &irv)) + goto ret; + } + else if (e > 0) { + if (e <= Ten_pmax) { +#ifdef VAX + goto vax_ovfl_check; +#else + i = fivesbits[e] + mantbits(rv) <= P; + /* rv = */ rounded_product(dval(rv), tens[e]); + if (rvOK(p, dval(rv), fpi, exp, bits, i, rd, &irv)) + goto ret; + e1 -= e; + goto rv_notOK; +#endif + } + i = DBL_DIG - nd; + if (e <= Ten_pmax + i) { + /* A fancier test would sometimes let us do + * this for larger i values. + */ + e2 = e - i; + e1 -= i; + dval(rv) *= tens[i]; +#ifdef VAX + /* VAX exponent range is so narrow we must + * worry about overflow here... + */ + vax_ovfl_check: + dval(adj) = dval(rv); + word0(adj) -= P*Exp_msk1; + /* adj = */ rounded_product(dval(adj), tens[e2]); + if ((word0(adj) & Exp_mask) + > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) + goto rv_notOK; + word0(adj) += P*Exp_msk1; + dval(rv) = dval(adj); +#else + /* rv = */ rounded_product(dval(rv), tens[e2]); +#endif + if (rvOK(p, dval(rv), fpi, exp, bits, 0, rd, &irv)) + goto ret; + e1 -= e2; + } + } +#ifndef Inaccurate_Divide + else if (e >= -Ten_pmax) { + /* rv = */ rounded_quotient(dval(rv), tens[-e]); + if (rvOK(p, dval(rv), fpi, exp, bits, 0, rd, &irv)) + goto ret; + e1 -= e; + } +#endif + } + rv_notOK: + e1 += nd - k; + + /* Get starting approximation = rv * 10**e1 */ + + e2 = 0; + if (e1 > 0) { + if ( (i = e1 & 15) !=0) + dval(rv) *= tens[i]; + if (e1 &= ~15) { + e1 >>= 4; + while(e1 >= (1 << (n_bigtens-1))) { + e2 += ((word0(rv) & Exp_mask) + >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + dval(rv) *= bigtens[n_bigtens-1]; + e1 -= 1 << (n_bigtens-1); + } + e2 += ((word0(rv) & Exp_mask) >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + for(j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= bigtens[j]; + } + } + else if (e1 < 0) { + e1 = -e1; + if ( (i = e1 & 15) !=0) + dval(rv) /= tens[i]; + if (e1 &= ~15) { + e1 >>= 4; + while(e1 >= (1 << (n_bigtens-1))) { + e2 += ((word0(rv) & Exp_mask) + >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + dval(rv) *= tinytens[n_bigtens-1]; + e1 -= 1 << (n_bigtens-1); + } + e2 += ((word0(rv) & Exp_mask) >> Exp_shift1) - Bias; + word0(rv) &= ~Exp_mask; + word0(rv) |= Bias << Exp_shift1; + for(j = 0; e1 > 0; j++, e1 >>= 1) + if (e1 & 1) + dval(rv) *= tinytens[j]; + } + } +#ifdef IBM + /* e2 is a correction to the (base 2) exponent of the return + * value, reflecting adjustments above to avoid overflow in the + * native arithmetic. For native IBM (base 16) arithmetic, we + * must multiply e2 by 4 to change from base 16 to 2. + */ + e2 <<= 2; +#endif + rvb = d2b(p, dval(rv), &rve, &rvbits); /* rv = rvb * 2^rve */ + rve += e2; + if ((j = rvbits - nbits) > 0) { + rshift(rvb, j); + rvbits = nbits; + rve += j; + } + bb0 = 0; /* trailing zero bits in rvb */ + e2 = rve + rvbits - nbits; + if (e2 > fpi->emax + 1) + goto huge; + rve1 = rve + rvbits - nbits; + if (e2 < (emin = fpi->emin)) { + denorm = 1; + j = rve - emin; + if (j > 0) { + rvb = lshift(p, rvb, j); + rvbits += j; + } + else if (j < 0) { + rvbits += j; + if (rvbits <= 0) { + if (rvbits < -1) { + ufl: + rvb->_wds = 0; + rvb->_x[0] = 0; + *exp = emin; + irv = STRTOG_Underflow | STRTOG_Inexlo; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + goto ret; + } + rvb->_x[0] = rvb->_wds = rvbits = 1; + } + else + rshift(rvb, -j); + } + rve = rve1 = emin; + if (sudden_underflow && e2 + 1 < emin) + goto ufl; + } + + /* Now the hard part -- adjusting rv to the correct value.*/ + + /* Put digits into bd: true value = bd * 10^e */ + + bd0 = s2b(p, s0, nd0, nd, y); + + for(;;) { + bd = eBalloc(p,bd0->_k); + Bcopy(bd, bd0); + bb = eBalloc(p,rvb->_k); + Bcopy(bb, rvb); + bbbits = rvbits - bb0; + bbe = rve + bb0; + bs = i2b(p, 1); + + if (e >= 0) { + bb2 = bb5 = 0; + bd2 = bd5 = e; + } + else { + bb2 = bb5 = -e; + bd2 = bd5 = 0; + } + if (bbe >= 0) + bb2 += bbe; + else + bd2 -= bbe; + bs2 = bb2; + j = nbits + 1 - bbbits; + i = bbe + bbbits - nbits; + if (i < emin) /* denormal */ + j += i - emin; + bb2 += j; + bd2 += j; + i = bb2 < bd2 ? bb2 : bd2; + if (i > bs2) + i = bs2; + if (i > 0) { + bb2 -= i; + bd2 -= i; + bs2 -= i; + } + if (bb5 > 0) { + bs = pow5mult(p, bs, bb5); + bb1 = mult(p, bs, bb); + Bfree(p,bb); + bb = bb1; + } + bb2 -= bb0; + if (bb2 > 0) + bb = lshift(p, bb, bb2); + else if (bb2 < 0) + rshift(bb, -bb2); + if (bd5 > 0) + bd = pow5mult(p, bd, bd5); + if (bd2 > 0) + bd = lshift(p, bd, bd2); + if (bs2 > 0) + bs = lshift(p, bs, bs2); + asub = 1; + inex = STRTOG_Inexhi; + delta = diff(p, bb, bd); + if (delta->_wds <= 1 && !delta->_x[0]) + break; + dsign = delta->_sign; + delta->_sign = finished = 0; + L = 0; + i = cmp(delta, bs); + if (rd && i <= 0) { + irv = STRTOG_Normal; + if ( (finished = dsign ^ (rd&1)) !=0) { + if (dsign != 0) { + irv |= STRTOG_Inexhi; + goto adj1; + } + irv |= STRTOG_Inexlo; + if (rve1 == emin) + goto adj1; + for(i = 0, j = nbits; j >= ULbits; + i++, j -= ULbits) { + if (rvb->_x[i] & ALL_ON) + goto adj1; + } + if (j > 1 && lo0bits(rvb->_x + i) < j - 1) + goto adj1; + rve = rve1 - 1; + rvb = set_ones(p, rvb, rvbits = nbits); + break; + } + irv |= dsign ? STRTOG_Inexlo : STRTOG_Inexhi; + break; + } + if (i < 0) { + /* Error is less than half an ulp -- check for + * special case of mantissa a power of two. + */ + irv = dsign + ? STRTOG_Normal | STRTOG_Inexlo + : STRTOG_Normal | STRTOG_Inexhi; + if (dsign || bbbits > 1 || denorm || rve1 == emin) + break; + delta = lshift(p, delta,1); + if (cmp(delta, bs) > 0) { + irv = STRTOG_Normal | STRTOG_Inexlo; + goto drop_down; + } + break; + } + if (i == 0) { + /* exactly half-way between */ + if (dsign) { + if (denorm && all_on(rvb, rvbits)) { + /*boundary case -- increment exponent*/ + rvb->_wds = 1; + rvb->_x[0] = 1; + rve = emin + nbits - (rvbits = 1); + irv = STRTOG_Normal | STRTOG_Inexhi; + denorm = 0; + break; + } + irv = STRTOG_Normal | STRTOG_Inexlo; + } + else if (bbbits == 1) { + irv = STRTOG_Normal; + drop_down: + /* boundary case -- decrement exponent */ + if (rve1 == emin) { + irv = STRTOG_Normal | STRTOG_Inexhi; + if (rvb->_wds == 1 && rvb->_x[0] == 1) + sudden_underflow = 1; + break; + } + rve -= nbits; + rvb = set_ones(p, rvb, rvbits = nbits); + break; + } + else + irv = STRTOG_Normal | STRTOG_Inexhi; + if ((bbbits < nbits && !denorm) || !(rvb->_x[0] & 1)) + break; + if (dsign) { + rvb = increment(p, rvb); + j = kmask & (ULbits - (rvbits & kmask)); + if (hi0bits(rvb->_x[rvb->_wds - 1]) != j) + rvbits++; + irv = STRTOG_Normal | STRTOG_Inexhi; + } + else { + if (bbbits == 1) + goto undfl; + decrement(rvb); + irv = STRTOG_Normal | STRTOG_Inexlo; + } + break; + } + if ((dval(adj) = ratio(delta, bs)) <= 2.) { + adj1: + inex = STRTOG_Inexlo; + if (dsign) { + asub = 0; + inex = STRTOG_Inexhi; + } + else if (denorm && bbbits <= 1) { + undfl: + rvb->_wds = 0; + rve = emin; + irv = STRTOG_Underflow | STRTOG_Inexlo; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + break; + } + adj0 = dval(adj) = 1.; + } + else { + adj0 = dval(adj) *= 0.5; + if (dsign) { + asub = 0; + inex = STRTOG_Inexlo; + } + if (dval(adj) < 2147483647.) { + L = adj0; + adj0 -= L; + switch(rd) { + case 0: + if (adj0 >= .5) + goto inc_L; + break; + case 1: + if (asub && adj0 > 0.) + goto inc_L; + break; + case 2: + if (!asub && adj0 > 0.) { + inc_L: + L++; + inex = STRTOG_Inexact - inex; + } + } + dval(adj) = L; + } + } + y = rve + rvbits; + + /* adj *= ulp(dval(rv)); */ + /* if (asub) rv -= adj; else rv += adj; */ + + if (!denorm && rvbits < nbits) { + rvb = lshift(p, rvb, j = nbits - rvbits); + rve -= j; + rvbits = nbits; + } + ab = d2b(p, dval(adj), &abe, &abits); + if (abe < 0) + rshift(ab, -abe); + else if (abe > 0) + ab = lshift(p, ab, abe); + rvb0 = rvb; + if (asub) { + /* rv -= adj; */ + j = hi0bits(rvb->_x[rvb->_wds-1]); + rvb = diff(p, rvb, ab); + k = rvb0->_wds - 1; + if (denorm) + /* do nothing */; + else if (rvb->_wds <= k + || hi0bits( rvb->_x[k]) > + hi0bits(rvb0->_x[k])) { + /* unlikely; can only have lost 1 high bit */ + if (rve1 == emin) { + --rvbits; + denorm = 1; + } + else { + rvb = lshift(p, rvb, 1); + --rve; + --rve1; + L = finished = 0; + } + } + } + else { + rvb = sum(p, rvb, ab); + k = rvb->_wds - 1; + if (k >= rvb0->_wds + || hi0bits(rvb->_x[k]) < hi0bits(rvb0->_x[k])) { + if (denorm) { + if (++rvbits == nbits) + denorm = 0; + } + else { + rshift(rvb, 1); + rve++; + rve1++; + L = 0; + } + } + } + Bfree(p,ab); + Bfree(p,rvb0); + if (finished) + break; + + z = rve + rvbits; + if (y == z && L) { + /* Can we stop now? */ + tol = dval(adj) * 5e-16; /* > max rel error */ + dval(adj) = adj0 - .5; + if (dval(adj) < -tol) { + if (adj0 > tol) { + irv |= inex; + break; + } + } + else if (dval(adj) > tol && adj0 < 1. - tol) { + irv |= inex; + break; + } + } + bb0 = denorm ? 0 : trailz(rvb); + Bfree(p,bb); + Bfree(p,bd); + Bfree(p,bs); + Bfree(p,delta); + } + if (!denorm && (j = nbits - rvbits)) { + if (j > 0) + rvb = lshift(p, rvb, j); + else + rshift(rvb, -j); + rve -= j; + } + *exp = rve; + Bfree(p,bb); + Bfree(p,bd); + Bfree(p,bs); + Bfree(p,bd0); + Bfree(p,delta); + if (rve > fpi->emax) { + huge: + rvb->_wds = 0; + irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + infnanexp: + *exp = fpi->emax + 1; + } + ret: + if (denorm) { + if (sudden_underflow) { + rvb->_wds = 0; + irv = STRTOG_Underflow | STRTOG_Inexlo; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + } + else { + irv = (irv & ~STRTOG_Retmask) | + (rvb->_wds > 0 ? STRTOG_Denormal : STRTOG_Zero); + if (irv & STRTOG_Inexact) + irv |= STRTOG_Underflow; +#ifndef NO_ERRNO + errno = ERANGE; +#endif + } + } + if (se) + *se = (char *)s; + if (sign) + irv |= STRTOG_Neg; + if (rvb) { + copybits(bits, nbits, rvb); + Bfree(p,rvb); + } + return irv; + } + +#endif /* _HAVE_LONG_DOUBLE && !_LDBL_EQ_DBL */ diff --git a/lib/stdlib/strtoimax.c b/lib/stdlib/strtoimax.c new file mode 100644 index 0000000..a64b7da --- /dev/null +++ b/lib/stdlib/strtoimax.c @@ -0,0 +1,172 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "from @(#)strtol.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include +__FBSDID("$FreeBSD: head/lib/libc/stdlib/strtoimax.c 251672 2013-06-13 00:19:30Z emaste $"); + +#include +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a string to an intmax_t integer. + * + * Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ + +/* + *Reentrant version of strtoimax. + */ +static intmax_t +_strtoimax_l(struct _reent *rptr, const char * __restrict nptr, + char ** __restrict endptr, int base, locale_t loc) +{ + const char *s = nptr; + uintmax_t acc = 0; + char c; + uintmax_t cutoff; + int neg = 0, any = 0, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (isspace_l(c, loc)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + if (base < 2 || base > 36) + goto noconv; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for intmax_t is + * [-9223372036854775808..9223372036854775807] and the input base + * is 10, cutoff will be set to 922337203685477580 and cutlim to + * either 7 (neg==0) or 8 (neg==1), meaning that if we have + * accumulated a value > 922337203685477580, or equal but the + * next digit is > 7 (or 8), the number is too big, and we will + * return a range error. + * + * Set 'any' if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(uintmax_t)INTMAX_MIN : INTMAX_MAX; + cutlim = cutoff % base; + cutoff /= base; + for ( ; ; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? INTMAX_MIN : INTMAX_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (!any) { +noconv: + _REENT_ERRNO(rptr) = EINVAL; + } else if (neg) + acc = -acc; + if (endptr != NULL) + *endptr = (char *)(any ? s - 1 : nptr); + return (acc); +} + +intmax_t +_strtoimax_r(struct _reent *rptr, const char *__restrict nptr, + char **__restrict endptr, int base) +{ + return _strtoimax_l(rptr, nptr, endptr, base, __get_current_locale()); +} + +#ifndef _REENT_ONLY + +intmax_t +strtoimax_l(const char * __restrict nptr, char ** __restrict endptr, int base, + locale_t loc) +{ + return _strtoimax_l(_REENT, nptr, endptr, base, loc); +} + +intmax_t +strtoimax(const char* __restrict nptr, char** __restrict endptr, int base) +{ + return _strtoimax_l(_REENT, nptr, endptr, base, __get_current_locale()); +} + +#endif diff --git a/lib/stdlib/strtol.c b/lib/stdlib/strtol.c new file mode 100644 index 0000000..09d4333 --- /dev/null +++ b/lib/stdlib/strtol.c @@ -0,0 +1,241 @@ +/* +FUNCTION + <>, <>---string to long + +INDEX + strtol + +INDEX + strtol_l + +INDEX + _strtol_r + +SYNOPSIS + #include + long strtol(const char *restrict <[s]>, char **restrict <[ptr]>, + int <[base]>); + + #include + long strtol_l(const char *restrict <[s]>, char **restrict <[ptr]>, + int <[base]>, locale_t <[locale]>); + + long _strtol_r(void *<[reent]>, const char *restrict <[s]>, + char **restrict <[ptr]>,int <[base]>); + +DESCRIPTION +The function <> converts the string <<*<[s]>>> to +a <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of characters resembling an integer in the radix specified by <[base]>; +and a trailing portion consisting of zero or more unparseable characters, +and always including the terminating null character. Then, it attempts +to convert the subject string into a <> and returns the +result. + +If the value of <[base]> is 0, the subject string is expected to look +like a normal C integer constant: an optional sign, a possible `<<0x>>' +indicating a hexadecimal base, and a number. If <[base]> is between +2 and 36, the expected form of the subject is a sequence of letters +and digits representing an integer in the radix specified by <[base]>, +with an optional plus or minus sign. The letters <>--<> (or, +equivalently, <>--<>) are used to signify values from 10 to 35; +only letters whose ascribed values are less than <[base]> are +permitted. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible letter or digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading 0 and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. If the subject string begins with +a minus sign, the value is negated. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (or not in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +The alternate function <<_strtol_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, 0 is returned. + +<>, <> return <> or <> if the +magnitude of the converted value is too large, and sets <> +to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +No supporting OS subroutines are required. +*/ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a string to a long integer. + */ +static long +_strtol_l (struct _reent *rptr, const char *__restrict nptr, + char **__restrict endptr, int base, locale_t loc) +{ + register const unsigned char *s = (const unsigned char *)nptr; + register unsigned long acc; + register int c; + register unsigned long cutoff; + register int neg = 0, any, cutlim; + + if (base < 0 || base == 1 || base > 36) { + errno = EINVAL; + return 0; + } + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (isspace_l(c, loc)); + if (c == '-') { + neg = 1; + c = *s++; + } else if (c == '+') + c = *s++; + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; + cutlim = cutoff % (unsigned long)base; + cutoff /= (unsigned long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + } else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LONG_MIN : LONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? (char *)s - 1 : nptr); + return (acc); +} + +long +_strtol_r (struct _reent *rptr, + const char *__restrict nptr, + char **__restrict endptr, + int base) +{ + return _strtol_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +long +strtol_l (const char *__restrict s, char **__restrict ptr, int base, + locale_t loc) +{ + return _strtol_l (_REENT, s, ptr, base, loc); +} + +long +strtol (const char *__restrict s, + char **__restrict ptr, + int base) +{ + return _strtol_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/strtold.c b/lib/stdlib/strtold.c new file mode 100644 index 0000000..6bd1c2c --- /dev/null +++ b/lib/stdlib/strtold.c @@ -0,0 +1,105 @@ +/* +(C) Copyright IBM Corp. 2009 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#include +#include "local.h" +#include "mprec.h" +#undef FLT_ROUNDS + +#ifdef _HAVE_LONG_DOUBLE + +/* Intel MCU has no x87 floating point unit */ +#if (defined (__x86_64__) || defined (__i386__)) && !defined (__iamcu__) +static const int map[] = { + 1, /* round to nearest */ + 3, /* round to zero */ + 2, /* round to negative infinity */ + 0 /* round to positive infinity */ +}; + +int +__flt_rounds(void) +{ + int x; + + /* Assume that the x87 and the SSE unit agree on the rounding mode. */ + __asm("fnstcw %0" : "=m" (x)); + return (map[(x >> 10) & 0x03]); +} +#define FLT_ROUNDS __flt_rounds() +#else +#define FLT_ROUNDS 0 +#endif + +long double +_strtold_r (struct _reent *ptr, const char *__restrict s00, + char **__restrict se) +{ +#ifdef _LDBL_EQ_DBL + /* On platforms where long double is as wide as double. */ + return _strtod_l (ptr, s00, se, __get_current_locale ()); +#else + long double result; + + _strtorx_l (ptr, s00, se, FLT_ROUNDS, &result, __get_current_locale ()); + return result; +#endif +} + +long double +strtold_l (const char *__restrict s00, char **__restrict se, locale_t loc) +{ +#ifdef _LDBL_EQ_DBL + /* On platforms where long double is as wide as double. */ + return _strtod_l (_REENT, s00, se, loc); +#else + long double result; + + _strtorx_l (_REENT, s00, se, FLT_ROUNDS, &result, loc); + return result; +#endif +} + +long double +strtold (const char *__restrict s00, char **__restrict se) +{ +#ifdef _LDBL_EQ_DBL + /* On platforms where long double is as wide as double. */ + return _strtod_l (_REENT, s00, se, __get_current_locale ()); +#else + long double result; + + _strtorx_l (_REENT, s00, se, FLT_ROUNDS, &result, __get_current_locale ()); + return result; +#endif +} + +#endif /* _HAVE_LONG_DOUBLE */ + diff --git a/lib/stdlib/strtoll.c b/lib/stdlib/strtoll.c new file mode 100644 index 0000000..0f2fa53 --- /dev/null +++ b/lib/stdlib/strtoll.c @@ -0,0 +1,238 @@ +/* +FUNCTION + <>, <>---string to long long + +INDEX + strtoll + +INDEX + strtoll_l + +INDEX + _strtoll_r + +SYNOPSIS + #include + long long strtoll(const char *restrict <[s]>, char **restrict <[ptr]>, + int <[base]>); + + #include + long long strtoll_l(const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>, + locale_t <[locale]>); + + long long _strtoll_r(void *<[reent]>, + const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the string <<*<[s]>>> to +a <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of characters resembling an integer in the radix specified by <[base]>; +and a trailing portion consisting of zero or more unparseable characters, +and always including the terminating null character. Then, it attempts +to convert the subject string into a <> and returns the +result. + +If the value of <[base]> is 0, the subject string is expected to look +like a normal C integer constant: an optional sign, a possible `<<0x>>' +indicating a hexadecimal base, and a number. If <[base]> is between +2 and 36, the expected form of the subject is a sequence of letters +and digits representing an integer in the radix specified by <[base]>, +with an optional plus or minus sign. The letters <>--<> (or, +equivalently, <>--<>) are used to signify values from 10 to 35; +only letters whose ascribed values are less than <[base]> are +permitted. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible letter or digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading 0 and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. If the subject string begins with +a minus sign, the value is negated. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (or not in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +The alternate function <<_strtoll_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, 0 is returned. + +<>, <> return <> or <> +if the magnitude of the converted value is too large, and sets <> +to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +No supporting OS subroutines are required. +*/ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a string to a long long integer. + */ +static long long +_strtoll_l (struct _reent *rptr, const char *__restrict nptr, + char **__restrict endptr, int base, locale_t loc) +{ + register const unsigned char *s = (const unsigned char *)nptr; + register unsigned long long acc; + register int c; + register unsigned long long cutoff; + register int neg = 0, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (isspace_l(c, loc)); + if (c == '-') { + neg = 1; + c = *s++; + } else if (c == '+') + c = *s++; + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(unsigned long long)LONG_LONG_MIN : LONG_LONG_MAX; + cutlim = cutoff % (unsigned long long)base; + cutoff /= (unsigned long long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LONG_LONG_MIN : LONG_LONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? (char *)s - 1 : nptr); + return (acc); +} + +long long +_strtoll_r (struct _reent *rptr, + const char *__restrict nptr, + char **__restrict endptr, + int base) +{ + return _strtoll_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +long long +strtoll_l (const char *__restrict s, char **__restrict ptr, int base, + locale_t loc) +{ + return _strtoll_l (_REENT, s, ptr, base, loc); +} + +long long +strtoll (const char *__restrict s, + char **__restrict ptr, + int base) +{ + return _strtoll_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/strtoll_r.c b/lib/stdlib/strtoll_r.c new file mode 100644 index 0000000..2997587 --- /dev/null +++ b/lib/stdlib/strtoll_r.c @@ -0,0 +1 @@ +/* dummy */ diff --git a/lib/stdlib/strtorx.c b/lib/stdlib/strtorx.c new file mode 100644 index 0000000..4faed85 --- /dev/null +++ b/lib/stdlib/strtorx.c @@ -0,0 +1,123 @@ +/**************************************************************** + +The author of this software is David M. Gay. + +Copyright (C) 1998, 2000 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +****************************************************************/ + +/* Please send bug reports to David M. Gay (dmg at acm dot org, + * with " at " changed at "@" and " dot " changed to "."). */ + +#include <_ansi.h> +#include +#include +#include +#include "mprec.h" +#include "gdtoa.h" + +#if defined (_HAVE_LONG_DOUBLE) && !defined (_LDBL_EQ_DBL) + +/* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ + +#ifdef IEEE_MC68k +#define _0 0 +#define _1 1 +#define _2 2 +#define _3 3 +#define _4 4 +#endif +#ifdef IEEE_8087 +#define _0 4 +#define _1 3 +#define _2 2 +#define _3 1 +#define _4 0 +#endif + + void +#ifdef KR_headers +ULtox(L, bits, exp, k) __UShort *L; __ULong *bits; Long exp; int k; +#else +ULtox(__UShort *L, __ULong *bits, Long exp, int k) +#endif +{ + switch(k & STRTOG_Retmask) { + case STRTOG_NoNumber: + case STRTOG_Zero: + L[0] = L[1] = L[2] = L[3] = L[4] = 0; + break; + + case STRTOG_Denormal: + L[_0] = 0; + goto normal_bits; + + case STRTOG_Normal: + case STRTOG_NaNbits: + L[_0] = exp + 0x3fff + 63; + normal_bits: + L[_4] = (__UShort)bits[0]; + L[_3] = (__UShort)(bits[0] >> 16); + L[_2] = (__UShort)bits[1]; + L[_1] = (__UShort)(bits[1] >> 16); + break; + + case STRTOG_Infinite: + L[_0] = 0x7fff; + L[_1] = 0x8000; + L[_2] = L[_3] = L[_4] = 0; + break; + + case STRTOG_NaN: + *((long double*)L) = __builtin_nanl (""); + } + if (k & STRTOG_Neg) + L[_0] |= 0x8000; + } + + int +#ifdef KR_headers +_strtorx_l(p, s, sp, rounding, L, loc) struct _reent *p; const char *s; char **sp; int rounding; void *L; locale_t loc; +#else +_strtorx_l(struct _reent *p, const char *s, char **sp, int rounding, void *L, + locale_t loc) +#endif +{ + static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; + FPI *fpi, fpi1; + __ULong bits[2]; + Long exp; + int k; + + fpi = &fpi0; + if (rounding != FPI_Round_near) { + fpi1 = fpi0; + fpi1.rounding = rounding; + fpi = &fpi1; + } + k = _strtodg_l(p, s, sp, fpi, &exp, bits, loc); + ULtox((__UShort*)L, bits, exp, k); + return k; + } + +#endif /* _HAVE_LONG_DOUBLE && !_LDBL_EQ_DBL */ diff --git a/lib/stdlib/strtoul.c b/lib/stdlib/strtoul.c new file mode 100644 index 0000000..d31bde5 --- /dev/null +++ b/lib/stdlib/strtoul.c @@ -0,0 +1,215 @@ +/* +FUNCTION + <>, <>---string to unsigned long + +INDEX + strtoul + +INDEX + strtoul_l + +INDEX + _strtoul_r + +SYNOPSIS + #include + unsigned long strtoul(const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>); + + #include + unsigned long strtoul_l(const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>, + locale_t <[locale]>); + + unsigned long _strtoul_r(void *<[reent]>, const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the string <<*<[s]>>> to +an <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of the digits meaningful in the radix specified by <[base]> +(for example, <<0>> through <<7>> if the value of <[base]> is 8); +and a trailing portion consisting of one or more unparseable characters, +which always includes the terminating null character. Then, it attempts +to convert the subject string into an unsigned long integer, and returns the +result. + +If the value of <[base]> is zero, the subject string is expected to look +like a normal C integer constant (save that no optional sign is permitted): +a possible <<0x>> indicating hexadecimal radix, and a number. +If <[base]> is between 2 and 36, the expected form of the subject is a +sequence of digits (which may include letters, depending on the +base) representing an integer in the radix specified by <[base]>. +The letters <>--<> (or <>--<>) are used as digits valued from +10 to 35. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading <<0>> and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (that is, if <<*>><[s]> does not start +with a substring in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +The alternate function <<_strtoul_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, <<0>> is returned. + +<>, <> return <> if the magnitude of the +converted value is too large, and sets <> to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +<> requires no supporting OS subroutines. +*/ + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a string to an unsigned long integer. + */ +static unsigned long +_strtoul_l (struct _reent *rptr, const char *__restrict nptr, + char **__restrict endptr, int base, locale_t loc) +{ + register const unsigned char *s = (const unsigned char *)nptr; + register unsigned long acc; + register int c; + register unsigned long cutoff; + register int neg = 0, any, cutlim; + + /* + * See strtol for comments as to the logic used. + */ + do { + c = *s++; + } while (isspace_l(c, loc)); + if (c == '-') { + neg = 1; + c = *s++; + } else if (c == '+') + c = *s++; + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; + cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = ULONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? (char *)s - 1 : nptr); + return (acc); +} + +unsigned long +_strtoul_r (struct _reent *rptr, + const char *__restrict nptr, + char **__restrict endptr, + int base) +{ + return _strtoul_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +unsigned long +strtoul_l (const char *__restrict s, char **__restrict ptr, int base, + locale_t loc) +{ + return _strtoul_l (_REENT, s, ptr, base, loc); +} + +unsigned long +strtoul (const char *__restrict s, + char **__restrict ptr, + int base) +{ + return _strtoul_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/strtoull.c b/lib/stdlib/strtoull.c new file mode 100644 index 0000000..943de6b --- /dev/null +++ b/lib/stdlib/strtoull.c @@ -0,0 +1,213 @@ +/* +FUNCTION + <>, <>---string to unsigned long long + +INDEX + strtoull + +INDEX + strtoull_l + +SYNOPSIS + #include + unsigned long long strtoull(const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>); + + #include + unsigned long long strtoull_l(const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>, + locale_t <[locale]>); + + unsigned long long _strtoull_r(void *<[reent]>, + const char *restrict <[s]>, + char **restrict <[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the string <<*<[s]>>> to +an <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of the digits meaningful in the radix specified by <[base]> +(for example, <<0>> through <<7>> if the value of <[base]> is 8); +and a trailing portion consisting of one or more unparseable characters, +which always includes the terminating null character. Then, it attempts +to convert the subject string into an unsigned long long integer, and returns the +result. + +If the value of <[base]> is zero, the subject string is expected to look +like a normal C integer constant (save that no optional sign is permitted): +a possible <<0x>> indicating hexadecimal radix, and a number. +If <[base]> is between 2 and 36, the expected form of the subject is a +sequence of digits (which may include letters, depending on the +base) representing an integer in the radix specified by <[base]>. +The letters <>--<> (or <>--<>) are used as digits valued from +10 to 35. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading <<0>> and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (that is, if <<*>><[s]> does not start +with a substring in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +The alternate function <<_strtoull_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, <<0>> is returned. + +<>, <> return <> if the magnitude +of the converted value is too large, and sets <> to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +<> requires no supporting OS subroutines. +*/ + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a string to an unsigned long long integer. + */ +static unsigned long long +_strtoull_l (struct _reent *rptr, const char *__restrict nptr, + char **__restrict endptr, int base, locale_t loc) +{ + register const unsigned char *s = (const unsigned char *)nptr; + register unsigned long long acc; + register int c; + register unsigned long long cutoff; + register int neg = 0, any, cutlim; + + /* + * See strtol for comments as to the logic used. + */ + do { + c = *s++; + } while (isspace_l(c, loc)); + if (c == '-') { + neg = 1; + c = *s++; + } else if (c == '+') + c = *s++; + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + cutoff = (unsigned long long)ULONG_LONG_MAX / (unsigned long long)base; + cutlim = (unsigned long long)ULONG_LONG_MAX % (unsigned long long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = ULONG_LONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (char *) (any ? (char *)s - 1 : nptr); + return (acc); +} + +unsigned long long +_strtoull_r (struct _reent *rptr, + const char *__restrict nptr, + char **__restrict endptr, + int base) +{ + return _strtoull_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +unsigned long long +strtoull_l (const char *__restrict s, char **__restrict ptr, int base, + locale_t loc) +{ + return _strtoull_l (_REENT, s, ptr, base, loc); +} + +unsigned long long +strtoull (const char *__restrict s, + char **__restrict ptr, + int base) +{ + return _strtoull_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/strtoull_r.c b/lib/stdlib/strtoull_r.c new file mode 100644 index 0000000..2997587 --- /dev/null +++ b/lib/stdlib/strtoull_r.c @@ -0,0 +1 @@ +/* dummy */ diff --git a/lib/stdlib/strtoumax.c b/lib/stdlib/strtoumax.c new file mode 100644 index 0000000..adcf2b3 --- /dev/null +++ b/lib/stdlib/strtoumax.c @@ -0,0 +1,151 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "from @(#)strtoul.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +#include +__FBSDID("$FreeBSD: head/lib/libc/stdlib/strtoumax.c 251672 2013-06-13 00:19:30Z emaste $"); + +#include +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a string to a uintmax_t integer. + * + * Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ + +/* + *Reentrant version of strtoumax. + */ +static uintmax_t +_strtoumax_l(struct _reent *rptr, const char * __restrict nptr, + char ** __restrict endptr, int base, locale_t loc) +{ + const char *s = nptr; + uintmax_t acc; + char c; + uintmax_t cutoff; + int neg = 0, any, cutlim; + + /* + * See strtoimax for comments as to the logic used. + */ + do { + c = *s++; + } while (isspace_l(c, loc)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + acc = any = 0; + if (base < 2 || base > 36) + goto noconv; + + cutoff = UINTMAX_MAX / base; + cutlim = UINTMAX_MAX % base; + for ( ; ; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = UINTMAX_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (!any) { +noconv: + _REENT_ERRNO(rptr) = EINVAL; + } else if (neg) + acc = -acc; + if (endptr != NULL) + *endptr = (char *)(any ? s - 1 : nptr); + return (acc); +} + +uintmax_t +_strtoumax_r(struct _reent *rptr, const char *__restrict nptr, + char **__restrict endptr, int base) +{ + return _strtoumax_l(rptr, nptr, endptr, base, __get_current_locale()); +} + +#ifndef _REENT_ONLY + +uintmax_t +strtoumax_l(const char * __restrict nptr, char ** __restrict endptr, int base, + locale_t loc) +{ + return _strtoumax_l(_REENT, nptr, endptr, base, loc); +} + +uintmax_t +strtoumax(const char* __restrict nptr, char** __restrict endptr, int base) +{ + return _strtoumax_l(_REENT, nptr, endptr, base, __get_current_locale()); +} + +#endif diff --git a/lib/stdlib/system.c b/lib/stdlib/system.c new file mode 100644 index 0000000..f30b7df --- /dev/null +++ b/lib/stdlib/system.c @@ -0,0 +1,178 @@ +/* +FUNCTION +<>---execute command string + +INDEX + system +INDEX + _system_r + +SYNOPSIS + #include + int system(char *<[s]>); + + int _system_r(void *<[reent]>, char *<[s]>); + +DESCRIPTION + +Use <> to pass a command string <<*<[s]>>> to <> on +your system, and wait for it to finish executing. + +Use ``<>'' to test whether your system has <> +available. + +The alternate function <<_system_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS +<> returns a non-zero value if <> is available, and +<<0>> if it is not. + +With a command argument, the result of <> is the exit status +returned by <>. + +PORTABILITY +ANSI C requires <>, but leaves the nature and effects of a +command processor undefined. ANSI C does, however, specify that +<> return zero or nonzero to report on the existence of +a command processor. + +POSIX.2 requires <>, and requires that it invoke a <>. +Where <> is found is left unspecified. + +Supporting OS subroutines required: <<_exit>>, <<_execve>>, <<_fork_r>>, +<<_wait_r>>. +*/ + +#include <_ansi.h> +#include +#include +#include +#include +#include <_syslist.h> +#include + +#if defined (unix) || defined (__CYGWIN__) +static int do_system (struct _reent *ptr, const char *s); +#endif + +int +_system_r (struct _reent *ptr, + const char *s) +{ +#if defined(HAVE_SYSTEM) + return _system (s); + ptr = ptr; +#elif defined(NO_EXEC) + if (s == NULL) + return 0; + errno = ENOSYS; + return -1; +#else + + /* ??? How to handle (s == NULL) here is not exactly clear. + If _fork_r fails, that's not really a justification for returning 0. + For now we always return 0 and leave it to each target to explicitly + handle otherwise (this can always be relaxed in the future). */ + +#if defined (unix) || defined (__CYGWIN__) + if (s == NULL) + return 1; + return do_system (ptr, s); +#else + if (s == NULL) + return 0; + errno = ENOSYS; + return -1; +#endif + +#endif +} + +#ifndef _REENT_ONLY + +int +system (const char *s) +{ + return _system_r (_REENT, s); +} + +#endif + +#if defined (unix) && !defined (__CYGWIN__) && !defined(__rtems__) +extern char **environ; + +/* Only deal with a pointer to environ, to work around subtle bugs with shared + libraries and/or small data systems where the user declares his own + 'environ'. */ +static char ***p_environ = &environ; + +static int +do_system (struct _reent *ptr, + const char *s) +{ + char *argv[4]; + int pid, status; + + argv[0] = "sh"; + argv[1] = "-c"; + argv[2] = (char *) s; + argv[3] = NULL; + + if ((pid = _fork_r (ptr)) == 0) + { + _execve ("/bin/sh", argv, *p_environ); + exit (100); + } + else if (pid == -1) + return -1; + else + { + int rc = _wait_r (ptr, &status); + if (rc == -1) + return -1; + status = (status >> 8) & 0xff; + return status; + } +} +#endif + +#if defined (__CYGWIN__) +static int +do_system (struct _reent *ptr, + const char *s) +{ + char *argv[4]; + int pid, status; + + argv[0] = "sh"; + argv[1] = "-c"; + argv[2] = (char *) s; + argv[3] = NULL; + + if ((pid = vfork ()) == 0) + { + /* ??? It's not clear what's the right path to take (pun intended :-). + There won't be an "sh" in any fixed location so we need each user + to be able to say where to find "sh". That suggests using an + environment variable, but after a few more such situations we may + have too many of them. */ + char *sh = getenv ("SH_PATH"); + if (sh == NULL) + sh = "/bin/sh"; + _execve (sh, argv, environ); + exit (100); + } + else if (pid == -1) + return -1; + else + { + extern int _wait (int *); + int rc = _wait (&status); + if (rc == -1) + return -1; + status = (status >> 8) & 0xff; + return status; + } +} +#endif diff --git a/lib/stdlib/utoa.c b/lib/stdlib/utoa.c new file mode 100644 index 0000000..5ef304c --- /dev/null +++ b/lib/stdlib/utoa.c @@ -0,0 +1,74 @@ +/* +FUNCTION +<>---unsigned integer to string + +INDEX + utoa + +SYNOPSIS + #include + char *utoa(unsigned <[value]>, char *<[str]>, int <[base]>); + char *__utoa(unsigned <[value]>, char *<[str]>, int <[base]>); + +DESCRIPTION +<> converts the unsigned integer [] to a null-terminated string +using the specified base, which must be between 2 and 36, inclusive. +<[str]> should be an array long enough to contain the converted +value, which in the worst case is sizeof(int)*8+1 bytes. + +RETURNS +A pointer to the string, <[str]>, or NULL if <[base]> is invalid. + +PORTABILITY +<> is non-ANSI. + +No supporting OS subroutine calls are required. +*/ + +#include + +char * +__utoa (unsigned value, + char *str, + int base) +{ + const char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; + int i, j; + unsigned remainder; + char c; + + /* Check base is supported. */ + if ((base < 2) || (base > 36)) + { + str[0] = '\0'; + return NULL; + } + + /* Convert to string. Digits are in reverse order. */ + i = 0; + do + { + remainder = value % base; + str[i++] = digits[remainder]; + value = value / base; + } while (value != 0); + str[i] = '\0'; + + /* Reverse string. */ + for (j = 0, i--; j < i; j++, i--) + { + c = str[j]; + str[j] = str[i]; + str[i] = c; + } + + return str; +} + +char * +utoa (unsigned value, + char *str, + int base) +{ + return __utoa (value, str, base); +} diff --git a/lib/stdlib/valloc.c b/lib/stdlib/valloc.c new file mode 100644 index 0000000..0253866 --- /dev/null +++ b/lib/stdlib/valloc.c @@ -0,0 +1,24 @@ +#ifndef MALLOC_PROVIDED +/* valloc.c -- a wrapper for valloc_r and pvalloc_r. */ + +#include <_ansi.h> +#include +#include +#include + +#ifndef _REENT_ONLY + +void * +valloc (size_t nbytes) +{ + return _valloc_r (_REENT, nbytes); +} + +void * +pvalloc (size_t nbytes) +{ + return _pvalloc_r (_REENT, nbytes); +} + +#endif +#endif diff --git a/lib/stdlib/vallocr.c b/lib/stdlib/vallocr.c new file mode 100644 index 0000000..9f05700 --- /dev/null +++ b/lib/stdlib/vallocr.c @@ -0,0 +1,2 @@ +#define DEFINE_VALLOC +#include "_mallocr.c" diff --git a/lib/stdlib/wcrtomb.c b/lib/stdlib/wcrtomb.c new file mode 100644 index 0000000..1b84720 --- /dev/null +++ b/lib/stdlib/wcrtomb.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include +#include "local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_wcrtomb_state; +#endif + +size_t +_wcrtomb_r (struct _reent *ptr, + char *s, + wchar_t wc, + mbstate_t *ps) +{ + int retval = 0; + char buf[10]; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(ptr); + ps = &(_REENT_WCRTOMB_STATE(ptr)); + } +#endif + + if (s == NULL) + retval = __WCTOMB (ptr, buf, L'\0', ps); + else + retval = __WCTOMB (ptr, s, wc, ps); + + if (retval == -1) + { + ps->__count = 0; + _REENT_ERRNO(ptr) = EILSEQ; + return (size_t)(-1); + } + else + return (size_t)retval; +} + +#ifndef _REENT_ONLY +size_t +wcrtomb (char *__restrict s, + wchar_t wc, + mbstate_t *__restrict ps) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + return _wcrtomb_r (_REENT, s, wc, ps); +#else + int retval = 0; + struct _reent *reent = _REENT; + char buf[10]; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(reent); + ps = &(_REENT_WCRTOMB_STATE(reent)); + } +#endif + + if (s == NULL) + retval = __WCTOMB (reent, buf, L'\0', ps); + else + retval = __WCTOMB (reent, s, wc, ps); + + if (retval == -1) + { + ps->__count = 0; + _REENT_ERRNO(reent) = EILSEQ; + return (size_t)(-1); + } + else + return (size_t)retval; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/wcsnrtombs.c b/lib/stdlib/wcsnrtombs.c new file mode 100644 index 0000000..abef7ac --- /dev/null +++ b/lib/stdlib/wcsnrtombs.c @@ -0,0 +1,167 @@ +/* +FUNCTION +<>, <>---convert a wide-character string to a character string + +INDEX + wcsrtombs +INDEX + _wcsrtombs_r +INDEX + wcsnrtombs +INDEX + _wcsnrtombs_r + +SYNOPSIS + #include + size_t wcsrtombs(char *__restrict <[dst]>, + const wchar_t **__restrict <[src]>, size_t <[len]>, + mbstate_t *__restrict <[ps]>); + + #include + size_t _wcsrtombs_r(struct _reent *<[ptr]>, char *<[dst]>, + const wchar_t **<[src]>, size_t <[len]>, + mbstate_t *<[ps]>); + + #include + size_t wcsnrtombs(char *__restrict <[dst]>, + const wchar_t **__restrict <[src]>, + size_t <[nwc]>, size_t <[len]>, + mbstate_t *__restrict <[ps]>); + + #include + size_t _wcsnrtombs_r(struct _reent *<[ptr]>, char *<[dst]>, + const wchar_t **<[src]>, size_t <[nwc]>, + size_t <[len]>, mbstate_t *<[ps]>); + +DESCRIPTION +The <> function converts a string of wide characters indirectly +pointed to by <[src]> to a corresponding multibyte character string stored in +the array pointed to by <[dst]>. No more than <[len]> bytes are written to +<[dst]>. + +If <[dst]> is NULL, no characters are stored. + +If <[dst]> is not NULL, the pointer pointed to by <[src]> is updated to point +to the character after the one that conversion stopped at. If conversion +stops because a null character is encountered, *<[src]> is set to NULL. + +The mbstate_t argument, <[ps]>, is used to keep track of the shift state. If +it is NULL, <> uses an internal, static mbstate_t object, which +is initialized to the initial conversion state at program startup. + +The <> function behaves identically to <>, except that +conversion stops after reading at most <[nwc]> characters from the buffer +pointed to by <[src]>. + +RETURNS +The <> and <> functions return the number of bytes +stored in the array pointed to by <[dst]> (not including any terminating +null), if successful, otherwise it returns (size_t)-1. + +PORTABILITY +<> is defined by C99 standard. +<> is defined by the POSIX.1-2008 standard. +*/ + +#include +#include +#include +#include +#include +#include +#include "local.h" +#include "../locale/setlocale.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_wcsrtombs_state; +#endif + +size_t +_wcsnrtombs_l (struct _reent *r, char *dst, const wchar_t **src, size_t nwc, + size_t len, mbstate_t *ps, struct __locale_t *loc) +{ + char *ptr = dst; + char buff[10]; + wchar_t *pwcs; + size_t n; + int i; + +#ifdef _MB_CAPABLE + if (ps == NULL) + { + _REENT_CHECK_MISC(r); + ps = &(_REENT_WCSRTOMBS_STATE(r)); + } +#endif + + /* If no dst pointer, treat len as maximum possible value. */ + if (dst == NULL) + len = (size_t)-1; + + n = 0; + pwcs = (wchar_t *)(*src); + + while (n < len && nwc-- > 0) + { + int count = ps->__count; + wint_t wch = ps->__value.__wch; + int bytes = loc->wctomb (r, buff, *pwcs, ps); + if (bytes == -1) + { + _REENT_ERRNO(r) = EILSEQ; + ps->__count = 0; + return (size_t)-1; + } + if (n + bytes <= len) + { + n += bytes; + if (dst) + { + for (i = 0; i < bytes; ++i) + *ptr++ = buff[i]; + ++(*src); + } + if (*pwcs++ == 0x00) + { + if (dst) + *src = NULL; + ps->__count = 0; + return n - 1; + } + } + else + { + /* not enough room, we must back up state to before __WCTOMB call */ + ps->__count = count; + ps->__value.__wch = wch; + len = 0; + } + } + + return n; +} + +size_t +_wcsnrtombs_r (struct _reent *r, + char *dst, + const wchar_t **src, + size_t nwc, + size_t len, + mbstate_t *ps) +{ + return _wcsnrtombs_l (_REENT, dst, src, nwc, len, ps, + __get_current_locale ()); +} + +#ifndef _REENT_ONLY +size_t +wcsnrtombs (char *__restrict dst, + const wchar_t **__restrict src, + size_t nwc, + size_t len, + mbstate_t *__restrict ps) +{ + return _wcsnrtombs_l (_REENT, dst, src, nwc, len, ps, + __get_current_locale ()); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/wcsrtombs.c b/lib/stdlib/wcsrtombs.c new file mode 100644 index 0000000..dc4807d --- /dev/null +++ b/lib/stdlib/wcsrtombs.c @@ -0,0 +1,26 @@ +/* Doc in wcsnrtombs.c */ + +#include +#include +#include + +size_t +_wcsrtombs_r (struct _reent *r, + char *dst, + const wchar_t **src, + size_t len, + mbstate_t *ps) +{ + return _wcsnrtombs_r (r, dst, src, (size_t) -1, len, ps); +} + +#ifndef _REENT_ONLY +size_t +wcsrtombs (char *__restrict dst, + const wchar_t **__restrict src, + size_t len, + mbstate_t *__restrict ps) +{ + return _wcsnrtombs_r (_REENT, dst, src, (size_t) -1, len, ps); +} +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/wcstod.c b/lib/stdlib/wcstod.c new file mode 100644 index 0000000..7b09834 --- /dev/null +++ b/lib/stdlib/wcstod.c @@ -0,0 +1,281 @@ +/* +FUNCTION + <>, <>, <>, <>, <>, <>---wide char string to double or float + +INDEX + wcstod + +INDEX + wcstof + +INDEX + wcstold + +INDEX + wcstod_l + +INDEX + wcstof_l + +INDEX + wcstold_l + +INDEX + _wcstod_r + +INDEX + _wcstof_r + +SYNOPSIS + #include + double wcstod(const wchar_t *__restrict <[str]>, + wchar_t **__restrict <[tail]>); + float wcstof(const wchar_t *__restrict <[str]>, + wchar_t **__restrict <[tail]>); + long double wcstold(const wchar_t *__restrict <[str]>, + wchar_t **__restrict <[tail]>); + + #include + double wcstod_l(const wchar_t *__restrict <[str]>, + wchar_t **__restrict <[tail]>, locale_t <[locale]>); + float wcstof_l(const wchar_t *__restrict <[str]>, + wchar_t **__restrict <[tail]>, locale_t <[locale]>); + long double wcstold_l(const wchar_t *__restrict <[str]>, + wchar_t **__restrict <[tail]>, + locale_t <[locale]>); + + double _wcstod_r(void *<[reent]>, + const wchar_t *<[str]>, wchar_t **<[tail]>); + float _wcstof_r(void *<[reent]>, + const wchar_t *<[str]>, wchar_t **<[tail]>); + +DESCRIPTION + <>, <>, <> parse the wide-character string + <[str]>, producing a substring which can be converted to a double, + float, or long double value. The substring converted is the longest + initial subsequence of <[str]>, beginning with the first non-whitespace + character, that has one of these formats: + .[+|-]<[digits]>[.[<[digits]>]][(e|E)[+|-]<[digits]>] + .[+|-].<[digits]>[(e|E)[+|-]<[digits]>] + .[+|-](i|I)(n|N)(f|F)[(i|I)(n|N)(i|I)(t|T)(y|Y)] + .[+|-](n|N)(a|A)(n|N)[<(>[<[hexdigits]>]<)>] + .[+|-]0(x|X)<[hexdigits]>[.[<[hexdigits]>]][(p|P)[+|-]<[digits]>] + .[+|-]0(x|X).<[hexdigits]>[(p|P)[+|-]<[digits]>] + The substring contains no characters if <[str]> is empty, consists + entirely of whitespace, or if the first non-whitespace + character is something other than <<+>>, <<->>, <<.>>, or a + digit, and cannot be parsed as infinity or NaN. If the platform + does not support NaN, then NaN is treated as an empty substring. + If the substring is empty, no conversion is done, and + the value of <[str]> is stored in <<*<[tail]>>>. Otherwise, + the substring is converted, and a pointer to the final string + (which will contain at least the terminating null character of + <[str]>) is stored in <<*<[tail]>>>. If you want no + assignment to <<*<[tail]>>>, pass a null pointer as <[tail]>. + + This implementation returns the nearest machine number to the + input decimal string. Ties are broken by using the IEEE + round-even rule. However, <> is currently subject to + double rounding errors. + + <>, <>, <> are like <>, + <>, <> but perform the conversion based on the + locale specified by the locale object locale. If <[locale]> is + LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is + undefined. + + The alternate functions <<_wcstod_r>> and <<_wcstof_r>> are + reentrant versions of <> and <>, respectively. + The extra argument <[reent]> is a pointer to a reentrancy structure. + +RETURNS + Return the converted substring value, if any. If + no conversion could be performed, 0 is returned. If the + correct value is out of the range of representable values, + plus or minus <> is returned, and <> is + stored in errno. If the correct value would cause underflow, 0 + is returned and <> is stored in errno. + +PORTABILITY +<> is ANSI. +<>, <> are C99. +<>, <>, <> are GNU extensions. + +Supporting OS subroutines required: <>, <>, <>, +<>, <>, <>, <>. +*/ + +/*- + * Copyright (c) 2002 Tim J. Robbins + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include +#include "mprec.h" + +double +_wcstod_l (struct _reent *ptr, const wchar_t *nptr, wchar_t **endptr, + locale_t loc) +{ + static const mbstate_t initial; + mbstate_t mbs; + double val; + char *buf, *end; + const wchar_t *wcp; + size_t len; + + while (iswspace_l(*nptr, loc)) + nptr++; + + /* + * Convert the supplied numeric wide char. string to multibyte. + * + * We could attempt to find the end of the numeric portion of the + * wide char. string to avoid converting unneeded characters but + * choose not to bother; optimising the uncommon case where + * the input string contains a lot of text after the number + * duplicates a lot of strtod()'s functionality and slows down the + * most common cases. + */ + wcp = nptr; + mbs = initial; + if ((len = _wcsnrtombs_l(ptr, NULL, &wcp, (size_t) -1, 0, &mbs, loc)) + == (size_t) -1) { + if (endptr != NULL) + *endptr = (wchar_t *)nptr; + return (0.0); + } + if ((buf = _malloc_r(ptr, len + 1)) == NULL) + return (0.0); + mbs = initial; + _wcsnrtombs_l(ptr, buf, &wcp, (size_t) -1, len + 1, &mbs, loc); + + /* Let strtod() do most of the work for us. */ + val = _strtod_l(ptr, buf, &end, loc); + + /* + * We only know where the number ended in the _multibyte_ + * representation of the string. If the caller wants to know + * where it ended, count multibyte characters to find the + * corresponding position in the wide char string. + */ + if (endptr != NULL) { + const char *decimal_point = __get_numeric_locale(loc)->decimal_point; + /* The only valid multibyte char in a float converted by + strtod/wcstod is the radix char. What we do here is, + figure out if the radix char was in the valid leading + float sequence in the incoming string. If so, the + multibyte float string is strlen(radix char) - 1 bytes + longer than the incoming wide char string has characters. + To fix endptr, reposition end as if the radix char was + just one byte long. The resulting difference (end - buf) + is then equivalent to the number of valid wide characters + in the input string. */ + len = strlen (decimal_point); + if (len > 1) { + char *d = strstr (buf, decimal_point); + if (d && d < end) + end -= len - 1; + } + *endptr = (wchar_t *)nptr + (end - buf); + } + + _free_r(ptr, buf); + + return (val); +} + +double +_wcstod_r (struct _reent *ptr, + const wchar_t *nptr, + wchar_t **endptr) +{ + return _wcstod_l (ptr, nptr, endptr, __get_current_locale ()); +} + +float +_wcstof_r (struct _reent *ptr, + const wchar_t *nptr, + wchar_t **endptr) +{ + double retval = _wcstod_l (ptr, nptr, endptr, __get_current_locale ()); + if (isnan (retval)) + return nanf (""); + return (float)retval; +} + +#ifndef _REENT_ONLY + +double +wcstod_l (const wchar_t *__restrict nptr, wchar_t **__restrict endptr, + locale_t loc) +{ + return _wcstod_l (_REENT, nptr, endptr, loc); +} + +double +wcstod (const wchar_t *__restrict nptr, wchar_t **__restrict endptr) +{ + return _wcstod_l (_REENT, nptr, endptr, __get_current_locale ()); +} + +float +wcstof_l (const wchar_t *__restrict nptr, wchar_t **__restrict endptr, + locale_t loc) +{ + double val = _wcstod_l (_REENT, nptr, endptr, loc); + if (isnan (val)) + return nanf (""); + float retval = (float) val; +#ifndef NO_ERRNO + if (isinf (retval) && !isinf (val)) + _REENT_ERRNO(_REENT) = ERANGE; +#endif + return retval; +} + +float +wcstof (const wchar_t *__restrict nptr, + wchar_t **__restrict endptr) +{ + double val = _wcstod_l (_REENT, nptr, endptr, __get_current_locale ()); + if (isnan (val)) + return nanf (""); + float retval = (float) val; +#ifndef NO_ERRNO + if (isinf (retval) && !isinf (val)) + _REENT_ERRNO(_REENT) = ERANGE; +#endif + + return retval; +} + +#endif diff --git a/lib/stdlib/wcstoimax.c b/lib/stdlib/wcstoimax.c new file mode 100644 index 0000000..0c939c9 --- /dev/null +++ b/lib/stdlib/wcstoimax.c @@ -0,0 +1,158 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "from @(#)strtol.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +__FBSDID("FreeBSD: src/lib/libc/stdlib/strtoimax.c,v 1.8 2002/09/06 11:23:59 tjr Exp "); +#endif +__FBSDID("$FreeBSD: head/lib/libc/locale/wcstoimax.c 314436 2017-02-28 23:42:47Z imp $"); + +#include +#include +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a wide character string to an intmax_t integer. + */ + +/* + *Reentrant version of wcstoimax. + */ +static intmax_t +_wcstoimax_l(struct _reent *rptr, const wchar_t * __restrict nptr, + wchar_t ** __restrict endptr, int base, locale_t loc) +{ + const wchar_t *s = nptr; + uintmax_t acc; + wchar_t c; + uintmax_t cutoff; + int neg = 0, any, cutlim; + + /* + * See strtoimax for comments as to the logic used. + */ + do { + c = *s++; + } while (iswspace_l(c, loc)); + if (c == L'-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == L'+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == L'0' && (*s == L'x' || *s == L'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == L'0' ? 8 : 10; + acc = any = 0; + if (base < 2 || base > 36) + goto noconv; + + cutoff = neg ? -(uintmax_t)INTMAX_MIN : INTMAX_MAX; + cutlim = cutoff % base; + cutoff /= base; + for ( ; ; c = *s++) { +#ifdef notyet + if (iswdigit_l(c, loc)) + c = digittoint_l(c, loc); + else +#endif + if (c >= L'0' && c <= L'9') + c -= L'0'; + else if (c >= L'A' && c <= L'Z') + c -= L'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= L'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? INTMAX_MIN : INTMAX_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (!any) { +noconv: + _REENT_ERRNO(rptr) = EINVAL; + } else if (neg) + acc = -acc; + if (endptr != NULL) + *endptr = (wchar_t *)(any ? s - 1 : nptr); + return (acc); +} + +intmax_t +_wcstoimax_r(struct _reent *rptr, const wchar_t *__restrict nptr, + wchar_t **__restrict endptr, int base) +{ + return _wcstoimax_l(rptr, nptr, endptr, base, __get_current_locale()); +} + +#ifndef _REENT_ONLY + +intmax_t +wcstoimax_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, + int base, locale_t loc) +{ + return _wcstoimax_l(_REENT, nptr, endptr, base, loc); +} + +intmax_t +wcstoimax(const wchar_t* __restrict nptr, wchar_t** __restrict endptr, int base) +{ + return _wcstoimax_l(_REENT, nptr, endptr, base, __get_current_locale()); +} + +#endif diff --git a/lib/stdlib/wcstol.c b/lib/stdlib/wcstol.c new file mode 100644 index 0000000..2a8c28f --- /dev/null +++ b/lib/stdlib/wcstol.c @@ -0,0 +1,237 @@ +/* +FUNCTION + <>, <>---wide string to long + +INDEX + wcstol + +INDEX + wcstol_l + +INDEX + _wcstol_r + +SYNOPSIS + #include + long wcstol(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, int <[base]>); + + #include + long wcstol_l(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, int <[base]>, + locale_t <[locale]>); + + long _wcstol_r(void *<[reent]>, const wchar_t *<[s]>, + wchar_t **<[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the wide string <<*<[s]>>> to +a <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of characters resembling an integer in the radix specified by <[base]>; +and a trailing portion consisting of zero or more unparseable characters, +and always including the terminating null character. Then, it attempts +to convert the subject string into a <> and returns the +result. + +If the value of <[base]> is 0, the subject string is expected to look +like a normal C integer constant: an optional sign, a possible `<<0x>>' +indicating a hexadecimal base, and a number. If <[base]> is between +2 and 36, the expected form of the subject is a sequence of letters +and digits representing an integer in the radix specified by <[base]>, +with an optional plus or minus sign. The letters <>--<> (or, +equivalently, <>--<>) are used to signify values from 10 to 35; +only letters whose ascribed values are less than <[base]> are +permitted. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible letter or digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading 0 and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. If the subject string begins with +a minus sign, the value is negated. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (or not in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +The alternate function <<_wcstol_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, 0 is returned. + +<>, <> return <> or <> if the +magnitude of the converted value is too large, and sets <> +to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +No supporting OS subroutines are required. +*/ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a wide string to a long integer. + */ +static long +_wcstol_l (struct _reent *rptr, const wchar_t *nptr, wchar_t **endptr, + int base, locale_t loc) +{ + register const wchar_t *s = nptr; + register unsigned long acc; + register int c; + register unsigned long cutoff; + register int neg = 0, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (iswspace_l(c, loc)); + if (c == L'-') { + neg = 1; + c = *s++; + } else if (c == L'+') + c = *s++; + if ((base == 0 || base == 16) && + c == L'0' && (*s == L'x' || *s == L'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == L'0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; + cutlim = cutoff % (unsigned long)base; + cutoff /= (unsigned long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= L'0' && c <= L'9') + c -= L'0'; + else if (c >= L'A' && c <= L'Z') + c -= L'A' - 10; + else if (c >= L'a' && c <= L'z') + c -= L'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LONG_MIN : LONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (wchar_t *) (any ? s - 1 : nptr); + return (acc); +} + +long +_wcstol_r (struct _reent *rptr, + const wchar_t *nptr, + wchar_t **endptr, + int base) +{ + return _wcstol_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +long +wcstol_l (const wchar_t *__restrict s, wchar_t **__restrict ptr, int base, + locale_t loc) +{ + return _wcstol_l (_REENT, s, ptr, base, loc); +} + +long +wcstol (const wchar_t *__restrict s, + wchar_t **__restrict ptr, + int base) +{ + return _wcstol_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/wcstold.c b/lib/stdlib/wcstold.c new file mode 100644 index 0000000..673d928 --- /dev/null +++ b/lib/stdlib/wcstold.c @@ -0,0 +1,124 @@ +/* +(C) Copyright IBM Corp. 2009 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +* Neither the name of IBM nor the names of its contributors may be +used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. +*/ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include "local.h" +#include "../locale/setlocale.h" + +long double +wcstold_l (const wchar_t *__restrict nptr, wchar_t **__restrict endptr, + locale_t loc) +{ +#ifdef _LDBL_EQ_DBL +/* On platforms where long double is as wide as double. */ + return wcstod_l(nptr, endptr, loc); + +#else /* This is a duplicate of the code in wcstod.c, but converted to long double. */ + + static const mbstate_t initial; + mbstate_t mbs; + long double val; + char *buf, *end; + const wchar_t *wcp; + size_t len; + + while (iswspace (*nptr)) + nptr++; + + /* Convert the supplied numeric wide char string to multibyte. */ + wcp = nptr; + mbs = initial; + if ((len = _wcsnrtombs_l (_REENT, NULL, &wcp, (size_t) -1, 0, &mbs, loc)) + == (size_t) -1) + { + if (endptr != NULL) + *endptr = (wchar_t *) nptr; + return 0.0L; + } + + if ((buf = malloc (len + 1)) == NULL) + return 0.0L; + + mbs = initial; + _wcsnrtombs_l (_REENT, buf, &wcp, (size_t) -1, len + 1, &mbs, loc); + + val = strtold_l (buf, &end, loc); + + /* We only know where the number ended in the _multibyte_ + representation of the string. If the caller wants to know + where it ended, count multibyte characters to find the + corresponding position in the wide char string. */ + + if (endptr != NULL) + { + const char *decimal_point = __get_numeric_locale(loc)->decimal_point; + /* The only valid multibyte char in a float converted by + strtold/wcstold is the radix char. What we do here is, + figure out if the radix char was in the valid leading + float sequence in the incoming string. If so, the + multibyte float string is strlen (radix char) - 1 bytes + longer than the incoming wide char string has characters. + To fix endptr, reposition end as if the radix char was + just one byte long. The resulting difference (end - buf) + is then equivalent to the number of valid wide characters + in the input string. */ + len = strlen (decimal_point); + if (len > 1) + { + char *d = strstr (buf, decimal_point); + + if (d && d < end) + end -= len - 1; + } + + *endptr = (wchar_t *) nptr + (end - buf); + } + + free (buf); + + return val; +#endif /* _LDBL_EQ_DBL */ +} + +long double +wcstold (const wchar_t *__restrict nptr, wchar_t **__restrict endptr) +{ +#ifdef _LDBL_EQ_DBL +/* On platforms where long double is as wide as double. */ + return wcstod_l(nptr, endptr, __get_current_locale ()); +#else + return wcstold_l(nptr, endptr, __get_current_locale ()); +#endif +} diff --git a/lib/stdlib/wcstoll.c b/lib/stdlib/wcstoll.c new file mode 100644 index 0000000..34a7e37 --- /dev/null +++ b/lib/stdlib/wcstoll.c @@ -0,0 +1,237 @@ +/* +FUNCTION + <>, <>---wide string to long long + +INDEX + wcstoll + +INDEX + wcstoll_l + +INDEX + _wcstoll_r + +SYNOPSIS + #include + long long wcstoll(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>,int <[base]>); + + #include + long long wcstoll_l(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, int <[base]>, + locale_t <[locale]>); + + long long _wcstoll_r(void *<[reent]>, const wchar_t *<[s]>, + wchar_t **<[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the wide string <<*<[s]>>> to +a <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of characters resembling an integer in the radix specified by <[base]>; +and a trailing portion consisting of zero or more unparseable characters, +and always including the terminating null character. Then, it attempts +to convert the subject string into a <> and returns the +result. + +If the value of <[base]> is 0, the subject string is expected to look +like a normal C integer constant: an optional sign, a possible `<<0x>>' +indicating a hexadecimal base, and a number. If <[base]> is between +2 and 36, the expected form of the subject is a sequence of letters +and digits representing an integer in the radix specified by <[base]>, +with an optional plus or minus sign. The letters <>--<> (or, +equivalently, <>--<>) are used to signify values from 10 to 35; +only letters whose ascribed values are less than <[base]> are +permitted. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible letter or digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading 0 and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. If the subject string begins with +a minus sign, the value is negated. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (or not in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +The alternate function <<_wcstoll_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, 0 is returned. + +<>, <> return <> or <> +if the magnitude of the converted value is too large, and sets <> +to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +No supporting OS subroutines are required. +*/ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a wide string to a long long integer. + */ +long long +_wcstoll_l (struct _reent *rptr, const wchar_t *nptr, wchar_t **endptr, + int base, locale_t loc) +{ + register const wchar_t *s = nptr; + register unsigned long long acc; + register int c; + register unsigned long long cutoff; + register int neg = 0, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (iswspace_l(c, loc)); + if (c == L'-') { + neg = 1; + c = *s++; + } else if (c == L'+') + c = *s++; + if ((base == 0 || base == 16) && + c == L'0' && (*s == L'x' || *s == L'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == L'0' ? 8 : 10; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(unsigned long long)LONG_LONG_MIN : LONG_LONG_MAX; + cutlim = cutoff % (unsigned long long)base; + cutoff /= (unsigned long long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= L'0' && c <= L'9') + c -= L'0'; + else if (c >= L'A' && c <= L'Z') + c -= L'A' - 10; + else if (c >= L'a' && c <= L'z') + c -= L'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LONG_LONG_MIN : LONG_LONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (wchar_t *) (any ? s - 1 : nptr); + return (acc); +} + +long long +_wcstoll_r (struct _reent *rptr, + const wchar_t *nptr, + wchar_t **endptr, + int base) +{ + return _wcstoll_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +long long +wcstoll_l (const wchar_t *__restrict s, wchar_t **__restrict ptr, int base, + locale_t loc) +{ + return _wcstoll_l (_REENT, s, ptr, base, loc); +} + +long long +wcstoll (const wchar_t *__restrict s, + wchar_t **__restrict ptr, + int base) +{ + return _wcstoll_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/wcstoll_r.c b/lib/stdlib/wcstoll_r.c new file mode 100644 index 0000000..2997587 --- /dev/null +++ b/lib/stdlib/wcstoll_r.c @@ -0,0 +1 @@ +/* dummy */ diff --git a/lib/stdlib/wcstombs.c b/lib/stdlib/wcstombs.c new file mode 100644 index 0000000..42be540 --- /dev/null +++ b/lib/stdlib/wcstombs.c @@ -0,0 +1,75 @@ +/* +FUNCTION +<>---minimal wide char string to multibyte string converter + +INDEX + wcstombs + +SYNOPSIS + #include + size_t wcstombs(char *restrict <[s]>, const wchar_t *restrict <[pwc]>, size_t <[n]>); + +DESCRIPTION +When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming +implementation of <>. In this case, +all wide-characters are expected to represent single bytes and so +are converted simply by casting to char. + +When _MB_CAPABLE is defined, this routine calls <<_wcstombs_r>> to perform +the conversion, passing a state variable to allow state dependent +decoding. The result is based on the locale setting which may +be restricted to a defined set of locales. + +RETURNS +This implementation of <> returns <<0>> if +<[s]> is <> or is the empty string; +it returns <<-1>> if _MB_CAPABLE and one of the +wide-char characters does not represent a valid multi-byte character; +otherwise it returns the minimum of: <> or the +number of bytes that are transferred to <>, not including the +nul terminator. + +If the return value is -1, the state of the <> string is +indeterminate. If the input has a length of 0, the output +string will be modified to contain a wchar_t nul terminator if +<> > 0. + +PORTABILITY +<> is required in the ANSI C standard. However, the precise +effects vary with the locale. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include +#include + +size_t +wcstombs (char *__restrict s, + const wchar_t *__restrict pwcs, + size_t n) +{ +#ifdef _MB_CAPABLE + mbstate_t state; + state.__count = 0; + + return _wcstombs_r (_REENT, s, pwcs, n, &state); +#else /* not _MB_CAPABLE */ + int count = 0; + + if (n != 0) { + do { + if ((*s++ = (char) *pwcs++) == 0) + break; + count++; + } while (--n != 0); + } + + return count; +#endif /* not _MB_CAPABLE */ +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/wcstombs_r.c b/lib/stdlib/wcstombs_r.c new file mode 100644 index 0000000..c6a06a3 --- /dev/null +++ b/lib/stdlib/wcstombs_r.c @@ -0,0 +1,47 @@ +#include +#include +#include "local.h" + +size_t +_wcstombs_r (struct _reent *r, + char *__restrict s, + const wchar_t *__restrict pwcs, + size_t n, + mbstate_t *state) +{ + char *ptr = s; + size_t max = n; + char buff[8]; + int i, bytes, num_to_copy; + + if (s == NULL) + { + size_t num_bytes = 0; + while (*pwcs != 0) + { + bytes = __WCTOMB (r, buff, *pwcs++, state); + if (bytes == -1) + return -1; + num_bytes += bytes; + } + return num_bytes; + } + else + { + while (n > 0) + { + bytes = __WCTOMB (r, buff, *pwcs, state); + if (bytes == -1) + return -1; + num_to_copy = (n > bytes ? bytes : (int)n); + for (i = 0; i < num_to_copy; ++i) + *ptr++ = buff[i]; + + if (*pwcs == 0x00) + return ptr - s - (n >= bytes); + ++pwcs; + n -= num_to_copy; + } + return max; + } +} diff --git a/lib/stdlib/wcstoul.c b/lib/stdlib/wcstoul.c new file mode 100644 index 0000000..9c78fc3 --- /dev/null +++ b/lib/stdlib/wcstoul.c @@ -0,0 +1,216 @@ +/* +FUNCTION + <>, <>---wide string to unsigned long + +INDEX + wcstoul + +INDEX + wcstoul_l + +INDEX + _wcstoul_r + +SYNOPSIS + #include + unsigned long wcstoul(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, int <[base]>); + + #include + unsigned long wcstoul_l(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, int <[base]>, + locale_t <[locale]>); + + unsigned long _wcstoul_r(void *<[reent]>, const wchar_t *<[s]>, + wchar_t **<[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the wide string <<*<[s]>>> to +an <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of the digits meaningful in the radix specified by <[base]> +(for example, <<0>> through <<7>> if the value of <[base]> is 8); +and a trailing portion consisting of one or more unparseable characters, +which always includes the terminating null character. Then, it attempts +to convert the subject string into an unsigned long integer, and returns the +result. + +If the value of <[base]> is zero, the subject string is expected to look +like a normal C integer constant (save that no optional sign is permitted): +a possible <<0x>> indicating hexadecimal radix, and a number. +If <[base]> is between 2 and 36, the expected form of the subject is a +sequence of digits (which may include letters, depending on the +base) representing an integer in the radix specified by <[base]>. +The letters <>--<> (or <>--<>) are used as digits valued from +10 to 35. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading <<0>> and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (that is, if <<*>><[s]> does not start +with a substring in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +The alternate function <<_wcstoul_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return the converted value, if any. If no +conversion was made, <<0>> is returned. + +<>, <> return <> if the magnitude of the +converted value is too large, and sets <> to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +<> requires no supporting OS subroutines. +*/ + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <_ansi.h> +#include +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a wide string to an unsigned long integer. + */ +unsigned long +_wcstoul_l (struct _reent *rptr, const wchar_t *nptr, wchar_t **endptr, + int base, locale_t loc) +{ + register const wchar_t *s = nptr; + register unsigned long acc; + register int c; + register unsigned long cutoff; + register int neg = 0, any, cutlim; + + /* + * See strtol for comments as to the logic used. + */ + do { + c = *s++; + } while (iswspace_l(c, loc)); + if (c == L'-') { + neg = 1; + c = *s++; + } else if (c == L'+') + c = *s++; + if ((base == 0 || base == 16) && + c == L'0' && (*s == L'x' || *s == L'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == L'0' ? 8 : 10; + cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; + cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= L'0' && c <= L'9') + c -= L'0'; + else if (c >= L'A' && c <= L'Z') + c -= L'A' - 10; + else if (c >= L'a' && c <= L'z') + c -= L'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = ULONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (wchar_t *) (any ? s - 1 : nptr); + return (acc); +} + +unsigned long +_wcstoul_r (struct _reent *rptr, + const wchar_t *nptr, + wchar_t **endptr, + int base) +{ + return _wcstoul_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +unsigned long +wcstoul_l (const wchar_t *__restrict s, wchar_t **__restrict ptr, int base, + locale_t loc) +{ + return _wcstoul_l (_REENT, s, ptr, base, loc); +} + +unsigned long +wcstoul (const wchar_t *__restrict s, + wchar_t **__restrict ptr, + int base) +{ + return _wcstoul_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/wcstoull.c b/lib/stdlib/wcstoull.c new file mode 100644 index 0000000..09422fa --- /dev/null +++ b/lib/stdlib/wcstoull.c @@ -0,0 +1,232 @@ +/* +FUNCTION + <>, <>---wide string to unsigned long long + +INDEX + wcstoull + +INDEX + wcstoull_l + +INDEX + _wcstoull_r + +SYNOPSIS + #include + unsigned long long wcstoull(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, + int <[base]>); + + #include + unsigned long long wcstoull_l(const wchar_t *__restrict <[s]>, + wchar_t **__restrict <[ptr]>, + int <[base]>, + locale_t <[locale]>); + + unsigned long long _wcstoull_r(void *<[reent]>, const wchar_t *<[s]>, + wchar_t **<[ptr]>, int <[base]>); + +DESCRIPTION +The function <> converts the wide string <<*<[s]>>> to +an <>. First, it breaks down the string into three parts: +leading whitespace, which is ignored; a subject string consisting +of the digits meaningful in the radix specified by <[base]> +(for example, <<0>> through <<7>> if the value of <[base]> is 8); +and a trailing portion consisting of one or more unparseable characters, +which always includes the terminating null character. Then, it attempts +to convert the subject string into an unsigned long long integer, and returns the +result. + +If the value of <[base]> is zero, the subject string is expected to look +like a normal C integer constant: an optional sign (<<+>> or <<->>), +a possible <<0x>> indicating hexadecimal radix or a possible <0> indicating +octal radix, and a number. +If <[base]> is between 2 and 36, the expected form of the subject is a +sequence of digits (which may include letters, depending on the +base) representing an integer in the radix specified by <[base]>. +The letters <>--<> (or <>--<>) are used as digits valued from +10 to 35. If <[base]> is 16, a leading <<0x>> is permitted. + +The subject sequence is the longest initial sequence of the input +string that has the expected form, starting with the first +non-whitespace character. If the string is empty or consists entirely +of whitespace, or if the first non-whitespace character is not a +permissible digit, the subject string is empty. + +If the subject string is acceptable, and the value of <[base]> is zero, +<> attempts to determine the radix from the input string. A +string with a leading <<0x>> is treated as a hexadecimal value; a string with +a leading <<0>> and no <> is treated as octal; all other strings are +treated as decimal. If <[base]> is between 2 and 36, it is used as the +conversion radix, as described above. Finally, a pointer to the first +character past the converted subject string is stored in <[ptr]>, if +<[ptr]> is not <>. + +If the subject string is empty (that is, if <<*>><[s]> does not start +with a substring in acceptable form), no conversion +is performed and the value of <[s]> is stored in <[ptr]> (if <[ptr]> is +not <>). + +The alternate function <<_wcstoull_r>> is a reentrant version. The +extra argument <[reent]> is a pointer to a reentrancy structure. + + +<> is like <> but performs the conversion based on the +locale specified by the locale object locale. If <[locale]> is +LC_GLOBAL_LOCALE or not a valid locale object, the behaviour is undefined. + +RETURNS +<>, <> return <<0>> and sets <> to <> +if the value of <[base]> is not supported. + +<>, <> return the converted value, if any. If no +conversion was made, <<0>> is returned. + +<>, <> return <> if the magnitude of +the converted value is too large, and sets <> to <>. + +PORTABILITY +<> is ANSI. +<> is a GNU extension. + +<> requires no supporting OS subroutines. +*/ + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define _GNU_SOURCE +#include <_ansi.h> +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* Make up for older non-compliant limits.h. (This is a C99/POSIX function, + * and both require ULLONG_MAX in limits.h.) */ +#if !defined(ULLONG_MAX) +# define ULLONG_MAX ULONG_LONG_MAX +#endif + +/* + * Convert a wide string to an unsigned long long integer. + */ +unsigned long long +_wcstoull_l (struct _reent *rptr, const wchar_t *nptr, wchar_t **endptr, + int base, locale_t loc) +{ + register const wchar_t *s = nptr; + register unsigned long long acc; + register int c; + register unsigned long long cutoff; + register int neg = 0, any, cutlim; + + if(base < 0 || base == 1 || base > 36) { + _REENT_ERRNO(rptr) = EINVAL; + return(0ULL); + } + /* + * See strtol for comments as to the logic used. + */ + do { + c = *s++; + } while (iswspace_l(c, loc)); + if (c == L'-') { + neg = 1; + c = *s++; + } else if (c == L'+') + c = *s++; + if ((base == 0 || base == 16) && + c == L'0' && (*s == L'x' || *s == L'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == L'0' ? 8 : 10; + cutoff = (unsigned long long)ULLONG_MAX / (unsigned long long)base; + cutlim = (unsigned long long)ULLONG_MAX % (unsigned long long)base; + for (acc = 0, any = 0;; c = *s++) { + if (c >= L'0' && c <= L'9') + c -= L'0'; + else if (c >= L'A' && c <= L'Z') + c -= L'A' - 10; + else if (c >= L'a' && c <= L'z') + c -= L'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = ULLONG_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (neg) + acc = -acc; + if (endptr != 0) + *endptr = (wchar_t *) (any ? s - 1 : nptr); + return (acc); +} + +unsigned long long +_wcstoull_r (struct _reent *rptr, + const wchar_t *nptr, + wchar_t **endptr, + int base) +{ + return _wcstoull_l (rptr, nptr, endptr, base, __get_current_locale ()); +} + +#ifndef _REENT_ONLY + +unsigned long long +wcstoull_l (const wchar_t *__restrict s, wchar_t **__restrict ptr, int base, + locale_t loc) +{ + return _wcstoull_l (_REENT, s, ptr, base, loc); +} + +unsigned long long +wcstoull (const wchar_t *__restrict s, + wchar_t **__restrict ptr, + int base) +{ + return _wcstoull_l (_REENT, s, ptr, base, __get_current_locale ()); +} + +#endif diff --git a/lib/stdlib/wcstoull_r.c b/lib/stdlib/wcstoull_r.c new file mode 100644 index 0000000..2997587 --- /dev/null +++ b/lib/stdlib/wcstoull_r.c @@ -0,0 +1 @@ +/* dummy */ diff --git a/lib/stdlib/wcstoumax.c b/lib/stdlib/wcstoumax.c new file mode 100644 index 0000000..623f5b9 --- /dev/null +++ b/lib/stdlib/wcstoumax.c @@ -0,0 +1,157 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if 0 +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "from @(#)strtoul.c 8.1 (Berkeley) 6/4/93"; +#endif /* LIBC_SCCS and not lint */ +__FBSDID("FreeBSD: src/lib/libc/stdlib/strtoumax.c,v 1.8 2002/09/06 11:23:59 tjr Exp "); +#endif +__FBSDID("$FreeBSD: head/lib/libc/locale/wcstoumax.c 314436 2017-02-28 23:42:47Z imp $"); + +#include +#include +#include +#include +#include +#include +#include +#include "../locale/setlocale.h" + +/* + * Convert a wide character string to a uintmax_t integer. + */ + +/* + *Reentrant version of wcstoumax. + */ +static uintmax_t +_wcstoumax_l(struct _reent *rptr,const wchar_t * __restrict nptr, + wchar_t ** __restrict endptr, int base, locale_t loc) +{ + const wchar_t *s = nptr; + uintmax_t acc; + wchar_t c; + uintmax_t cutoff; + int neg = 0, any, cutlim; + + /* + * See strtoimax for comments as to the logic used. + */ + do { + c = *s++; + } while (iswspace_l(c, loc)); + if (c == L'-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == L'+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == L'0' && (*s == L'x' || *s == L'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == L'0' ? 8 : 10; + acc = any = 0; + if (base < 2 || base > 36) + goto noconv; + + cutoff = UINTMAX_MAX / base; + cutlim = UINTMAX_MAX % base; + for ( ; ; c = *s++) { +#ifdef notyet + if (iswdigit_l(c, loc)) + c = digittoint_l(c, loc); + else +#endif + if (c >= L'0' && c <= L'9') + c -= L'0'; + else if (c >= L'A' && c <= L'Z') + c -= L'A' - 10; + else if (c >= L'a' && c <= L'z') + c -= L'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = UINTMAX_MAX; + _REENT_ERRNO(rptr) = ERANGE; + } else if (!any) { +noconv: + _REENT_ERRNO(rptr) = EINVAL; + } else if (neg) + acc = -acc; + if (endptr != NULL) + *endptr = (wchar_t *)(any ? s - 1 : nptr); + return (acc); +} + +uintmax_t +_wcstoumax_r(struct _reent *rptr, const wchar_t *__restrict nptr, + wchar_t **__restrict endptr, int base) +{ + return _wcstoumax_l(rptr, nptr, endptr, base, __get_current_locale()); +} + +#ifndef _REENT_ONLY + +uintmax_t +wcstoumax_l(const wchar_t * __restrict nptr, wchar_t ** __restrict endptr, + int base, locale_t loc) +{ + return _wcstoumax_l(_REENT, nptr, endptr, base, loc); +} + +uintmax_t +wcstoumax(const wchar_t* __restrict nptr, wchar_t** __restrict endptr, int base) +{ + return _wcstoumax_l(_REENT, nptr, endptr, base, __get_current_locale()); +} + +#endif diff --git a/lib/stdlib/wctob.c b/lib/stdlib/wctob.c new file mode 100644 index 0000000..61365a1 --- /dev/null +++ b/lib/stdlib/wctob.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include +#include "local.h" + +int +wctob (wint_t wc) +{ + struct _reent *reent; + mbstate_t mbs; + unsigned char pmb[MB_LEN_MAX]; + + if (wc == WEOF) + return EOF; + + /* Put mbs in initial state. */ + memset (&mbs, '\0', sizeof (mbs)); + + reent = _REENT; + _REENT_CHECK_MISC(reent); + + return __WCTOMB (reent, (char *) pmb, wc, &mbs) == 1 ? (int) pmb[0] : EOF; +} diff --git a/lib/stdlib/wctomb.c b/lib/stdlib/wctomb.c new file mode 100644 index 0000000..f56dccf --- /dev/null +++ b/lib/stdlib/wctomb.c @@ -0,0 +1,77 @@ +/* +FUNCTION +<>---minimal wide char to multibyte converter + +INDEX + wctomb + +SYNOPSIS + #include + int wctomb(char *<[s]>, wchar_t <[wchar]>); + +DESCRIPTION +When _MB_CAPABLE is not defined, this is a minimal ANSI-conforming +implementation of <>. The +only ``wide characters'' recognized are single bytes, +and they are ``converted'' to themselves. + +When _MB_CAPABLE is defined, this routine calls <<_wctomb_r>> to perform +the conversion, passing a state variable to allow state dependent +decoding. The result is based on the locale setting which may +be restricted to a defined set of locales. + +Each call to <> modifies <<*<[s]>>> unless <[s]> is a null +pointer or _MB_CAPABLE is defined and <[wchar]> is invalid. + +RETURNS +This implementation of <> returns <<0>> if +<[s]> is <>; it returns <<-1>> if _MB_CAPABLE is enabled +and the wchar is not a valid multi-byte character, it returns <<1>> +if _MB_CAPABLE is not defined or the wchar is in reality a single +byte character, otherwise it returns the number of bytes in the +multi-byte character. + +PORTABILITY +<> is required in the ANSI C standard. However, the precise +effects vary with the locale. + +<> requires no supporting OS subroutines. +*/ + +#ifndef _REENT_ONLY + +#include +#include +#include +#include "local.h" + +#ifdef _REENT_THREAD_LOCAL +_Thread_local _mbstate_t _tls_wctomb_state; +#endif + +int +wctomb (char *s, + wchar_t wchar) +{ +#ifdef _MB_CAPABLE + struct _reent *reent = _REENT; + + _REENT_CHECK_MISC(reent); + + return __WCTOMB (reent, s, wchar, &(_REENT_WCTOMB_STATE(reent))); +#else /* not _MB_CAPABLE */ + if (s == NULL) + return 0; + + /* Verify that wchar is a valid single-byte character. */ + if ((size_t)wchar >= 0x100) { + errno = EILSEQ; + return -1; + } + + *s = (char) wchar; + return 1; +#endif /* not _MB_CAPABLE */ +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/stdlib/wctomb_r.c b/lib/stdlib/wctomb_r.c new file mode 100644 index 0000000..3081e93 --- /dev/null +++ b/lib/stdlib/wctomb_r.c @@ -0,0 +1,658 @@ +#include +#include +#include +#include +#include +#include "mbctype.h" +#include "local.h" + +int +_wctomb_r (struct _reent *r, + char *s, + wchar_t _wchar, + mbstate_t *state) +{ + return __WCTOMB (r, s, _wchar, state); +} + +int +__ascii_wctomb (struct _reent *r, + char *s, + wchar_t _wchar, + mbstate_t *state) +{ + /* Avoids compiler warnings about comparisons that are always false + due to limited range when sizeof(wchar_t) is 2 but sizeof(wint_t) + is 4, as is the case on cygwin. */ + wint_t wchar = _wchar; + + if (s == NULL) + return 0; + +#ifdef __CYGWIN__ + if ((size_t)wchar >= 0x80) +#else + if ((size_t)wchar >= 0x100) +#endif + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + + *s = (char) wchar; + return 1; +} + +#ifdef _MB_CAPABLE +/* for some conversions, we use the __count field as a place to store a state value */ +#define __state __count + +int +__utf8_wctomb (struct _reent *r, + char *s, + wchar_t _wchar, + mbstate_t *state) +{ + wint_t wchar = _wchar; + int ret = 0; + + if (s == NULL) + return 0; /* UTF-8 encoding is not state-dependent */ + + if (sizeof (wchar_t) == 2 && state->__count == -4 + && (wchar < 0xdc00 || wchar > 0xdfff)) + { + /* There's a leftover lone high surrogate. Write out the CESU-8 value + of the surrogate and proceed to convert the given character. Note + to return extra 3 bytes. */ + wchar_t tmp; + tmp = (state->__value.__wchb[0] << 16 | state->__value.__wchb[1] << 8) + - (0x10000 >> 10 | 0xd80d); + *s++ = 0xe0 | ((tmp & 0xf000) >> 12); + *s++ = 0x80 | ((tmp & 0xfc0) >> 6); + *s++ = 0x80 | (tmp & 0x3f); + state->__count = 0; + ret = 3; + } + if (wchar <= 0x7f) + { + *s = wchar; + return ret + 1; + } + if (wchar >= 0x80 && wchar <= 0x7ff) + { + *s++ = 0xc0 | ((wchar & 0x7c0) >> 6); + *s = 0x80 | (wchar & 0x3f); + return ret + 2; + } + if (wchar >= 0x800 && wchar <= 0xffff) + { + /* No UTF-16 surrogate handling in UCS-4 */ + if (sizeof (wchar_t) == 2 && wchar >= 0xd800 && wchar <= 0xdfff) + { + wint_t tmp; + if (wchar <= 0xdbff) + { + /* First half of a surrogate pair. Store the state and + return ret + 0. */ + tmp = ((wchar & 0x3ff) << 10) + 0x10000; + state->__value.__wchb[0] = (tmp >> 16) & 0xff; + state->__value.__wchb[1] = (tmp >> 8) & 0xff; + state->__count = -4; + *s = (0xf0 | ((tmp & 0x1c0000) >> 18)); + return ret; + } + if (state->__count == -4) + { + /* Second half of a surrogate pair. Reconstruct the full + Unicode value and return the trailing three bytes of the + UTF-8 character. */ + tmp = (state->__value.__wchb[0] << 16) + | (state->__value.__wchb[1] << 8) + | (wchar & 0x3ff); + state->__count = 0; + *s++ = 0xf0 | ((tmp & 0x1c0000) >> 18); + *s++ = 0x80 | ((tmp & 0x3f000) >> 12); + *s++ = 0x80 | ((tmp & 0xfc0) >> 6); + *s = 0x80 | (tmp & 0x3f); + return 4; + } + /* Otherwise translate into CESU-8 value. */ + } + *s++ = 0xe0 | ((wchar & 0xf000) >> 12); + *s++ = 0x80 | ((wchar & 0xfc0) >> 6); + *s = 0x80 | (wchar & 0x3f); + return ret + 3; + } + if (wchar >= 0x10000 && wchar <= 0x10ffff) + { + *s++ = 0xf0 | ((wchar & 0x1c0000) >> 18); + *s++ = 0x80 | ((wchar & 0x3f000) >> 12); + *s++ = 0x80 | ((wchar & 0xfc0) >> 6); + *s = 0x80 | (wchar & 0x3f); + return 4; + } + + _REENT_ERRNO(r) = EILSEQ; + return -1; +} + +/* Cygwin defines its own doublebyte charset conversion functions + because the underlying OS requires wchar_t == UTF-16. */ +#ifndef __CYGWIN__ +int +__sjis_wctomb (struct _reent *r, + char *s, + wchar_t _wchar, + mbstate_t *state) +{ + wint_t wchar = _wchar; + + unsigned char char2 = (unsigned char)wchar; + unsigned char char1 = (unsigned char)(wchar >> 8); + + if (s == NULL) + return 0; /* not state-dependent */ + + if (char1 != 0x00) + { + /* first byte is non-zero..validate multi-byte char */ + if (_issjis1(char1) && _issjis2(char2)) + { + *s++ = (char)char1; + *s = (char)char2; + return 2; + } + else + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + *s = (char) wchar; + return 1; +} + +int +__eucjp_wctomb (struct _reent *r, + char *s, + wchar_t _wchar, + mbstate_t *state) +{ + wint_t wchar = _wchar; + unsigned char char2 = (unsigned char)wchar; + unsigned char char1 = (unsigned char)(wchar >> 8); + + if (s == NULL) + return 0; /* not state-dependent */ + + if (char1 != 0x00) + { + /* first byte is non-zero..validate multi-byte char */ + if (_iseucjp1 (char1) && _iseucjp2 (char2)) + { + *s++ = (char)char1; + *s = (char)char2; + return 2; + } + else if (_iseucjp2 (char1) && _iseucjp2 (char2 | 0x80)) + { + *s++ = (char)0x8f; + *s++ = (char)char1; + *s = (char)(char2 | 0x80); + return 3; + } + else + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + *s = (char) wchar; + return 1; +} + +int +__jis_wctomb (struct _reent *r, + char *s, + wchar_t _wchar, + mbstate_t *state) +{ + wint_t wchar = _wchar; + int cnt = 0; + unsigned char char2 = (unsigned char)wchar; + unsigned char char1 = (unsigned char)(wchar >> 8); + + if (s == NULL) + return 1; /* state-dependent */ + + if (char1 != 0x00) + { + /* first byte is non-zero..validate multi-byte char */ + if (_isjis (char1) && _isjis (char2)) + { + if (state->__state == 0) + { + /* must switch from ASCII to JIS state */ + state->__state = 1; + *s++ = ESC_CHAR; + *s++ = '$'; + *s++ = 'B'; + cnt = 3; + } + *s++ = (char)char1; + *s = (char)char2; + return cnt + 2; + } + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + if (state->__state != 0) + { + /* must switch from JIS to ASCII state */ + state->__state = 0; + *s++ = ESC_CHAR; + *s++ = '('; + *s++ = 'B'; + cnt = 3; + } + *s = (char)char2; + return cnt + 1; +} +#endif /* !__CYGWIN__ */ + +#ifdef _MB_EXTENDED_CHARSETS_ISO +static int +___iso_wctomb (struct _reent *r, char *s, wchar_t _wchar, int iso_idx, + mbstate_t *state) +{ + wint_t wchar = _wchar; + + if (s == NULL) + return 0; + + /* wchars <= 0x9f translate to all ISO charsets directly. */ + if (wchar >= 0xa0) + { + if (iso_idx >= 0) + { + unsigned char mb; + + for (mb = 0; mb < 0x60; ++mb) + if (__iso_8859_conv[iso_idx][mb] == wchar) + { + *s = (char) (mb + 0xa0); + return 1; + } + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + + if ((size_t)wchar >= 0x100) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + + *s = (char) wchar; + return 1; +} + +int __iso_8859_1_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, -1, state); +} + +int __iso_8859_2_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 0, state); +} + +int __iso_8859_3_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 1, state); +} + +int __iso_8859_4_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 2, state); +} + +int __iso_8859_5_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 3, state); +} + +int __iso_8859_6_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 4, state); +} + +int __iso_8859_7_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 5, state); +} + +int __iso_8859_8_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 6, state); +} + +int __iso_8859_9_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 7, state); +} + +int __iso_8859_10_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 8, state); +} + +int __iso_8859_11_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 9, state); +} + +int __iso_8859_13_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 10, state); +} + +int __iso_8859_14_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 11, state); +} + +int __iso_8859_15_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 12, state); +} + +int __iso_8859_16_wctomb (struct _reent *r, char *s, wchar_t _wchar, + mbstate_t *state) +{ + return ___iso_wctomb (r, s, _wchar, 13, state); +} + +static wctomb_p __iso_8859_wctomb[17] = { + NULL, + __iso_8859_1_wctomb, + __iso_8859_2_wctomb, + __iso_8859_3_wctomb, + __iso_8859_4_wctomb, + __iso_8859_5_wctomb, + __iso_8859_6_wctomb, + __iso_8859_7_wctomb, + __iso_8859_8_wctomb, + __iso_8859_9_wctomb, + __iso_8859_10_wctomb, + __iso_8859_11_wctomb, + NULL, /* No ISO 8859-12 */ + __iso_8859_13_wctomb, + __iso_8859_14_wctomb, + __iso_8859_15_wctomb, + __iso_8859_16_wctomb +}; + +/* val *MUST* be valid! All checks for validity are supposed to be + performed before calling this function. */ +wctomb_p +__iso_wctomb (int val) +{ + return __iso_8859_wctomb[val]; +} +#endif /* _MB_EXTENDED_CHARSETS_ISO */ + +#ifdef _MB_EXTENDED_CHARSETS_WINDOWS +static int +___cp_wctomb (struct _reent *r, char *s, wchar_t _wchar, int cp_idx, + mbstate_t *state) +{ + wint_t wchar = _wchar; + + if (s == NULL) + return 0; + + if (wchar >= 0x80) + { + if (cp_idx >= 0) + { + unsigned char mb; + + for (mb = 0; mb < 0x80; ++mb) + if (__cp_conv[cp_idx][mb] == wchar) + { + *s = (char) (mb + 0x80); + return 1; + } + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + } + + if ((size_t)wchar >= 0x100) + { + _REENT_ERRNO(r) = EILSEQ; + return -1; + } + + *s = (char) wchar; + return 1; +} + +static int +__cp_437_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 0, state); +} + +static int +__cp_720_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 1, state); +} + +static int +__cp_737_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 2, state); +} + +static int +__cp_775_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 3, state); +} + +static int +__cp_850_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 4, state); +} + +static int +__cp_852_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 5, state); +} + +static int +__cp_855_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 6, state); +} + +static int +__cp_857_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 7, state); +} + +static int +__cp_858_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 8, state); +} + +static int +__cp_862_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 9, state); +} + +static int +__cp_866_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 10, state); +} + +static int +__cp_874_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 11, state); +} + +static int +__cp_1125_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 12, state); +} + +static int +__cp_1250_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 13, state); +} + +static int +__cp_1251_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 14, state); +} + +static int +__cp_1252_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 15, state); +} + +static int +__cp_1253_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 16, state); +} + +static int +__cp_1254_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 17, state); +} + +static int +__cp_1255_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 18, state); +} + +static int +__cp_1256_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 19, state); +} + +static int +__cp_1257_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 20, state); +} + +static int +__cp_1258_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 21, state); +} + +static int +__cp_20866_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 22, state); +} + +static int +__cp_21866_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 23, state); +} + +static int +__cp_101_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 24, state); +} + +static int +__cp_102_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 25, state); +} + +static int +__cp_103_wctomb (struct _reent *r, char *s, wchar_t _wchar, mbstate_t *state) +{ + return ___cp_wctomb (r, s, _wchar, 26, state); +} + +static wctomb_p __cp_xxx_wctomb[27] = { + __cp_437_wctomb, + __cp_720_wctomb, + __cp_737_wctomb, + __cp_775_wctomb, + __cp_850_wctomb, + __cp_852_wctomb, + __cp_855_wctomb, + __cp_857_wctomb, + __cp_858_wctomb, + __cp_862_wctomb, + __cp_866_wctomb, + __cp_874_wctomb, + __cp_1125_wctomb, + __cp_1250_wctomb, + __cp_1251_wctomb, + __cp_1252_wctomb, + __cp_1253_wctomb, + __cp_1254_wctomb, + __cp_1255_wctomb, + __cp_1256_wctomb, + __cp_1257_wctomb, + __cp_1258_wctomb, + __cp_20866_wctomb, + __cp_21866_wctomb, + __cp_101_wctomb, + __cp_102_wctomb, + __cp_103_wctomb, +}; + +/* val *MUST* be valid! All checks for validity are supposed to be + performed before calling this function. */ +wctomb_p +__cp_wctomb (int val) +{ + return __cp_xxx_wctomb[__cp_val_index (val)]; +} +#endif /* _MB_EXTENDED_CHARSETS_WINDOWS */ +#endif /* _MB_CAPABLE */ diff --git a/lib/string/Makefile.inc b/lib/string/Makefile.inc new file mode 100644 index 0000000..a198aef --- /dev/null +++ b/lib/string/Makefile.inc @@ -0,0 +1,149 @@ +libc_a_SOURCES += \ + %D%/bcopy.c \ + %D%/bzero.c \ + %D%/explicit_bzero.c \ + %D%/ffsl.c \ + %D%/ffsll.c \ + %D%/fls.c \ + %D%/flsl.c \ + %D%/flsll.c \ + %D%/index.c \ + %D%/memchr.c \ + %D%/memcmp.c \ + %D%/memcpy.c \ + %D%/memmove.c \ + %D%/memset.c \ + %D%/rindex.c \ + %D%/strcasecmp.c \ + %D%/strcat.c \ + %D%/strchr.c \ + %D%/strcmp.c \ + %D%/strcoll.c \ + %D%/strcpy.c \ + %D%/strcspn.c \ + %D%/strdup.c \ + %D%/strdup_r.c \ + %D%/strerror.c \ + %D%/strerror_r.c \ + %D%/strlcat.c \ + %D%/strlcpy.c \ + %D%/strlen.c \ + %D%/strlwr.c \ + %D%/strncasecmp.c \ + %D%/strncat.c \ + %D%/strncmp.c \ + %D%/strncpy.c \ + %D%/strnlen.c \ + %D%/strnstr.c \ + %D%/strpbrk.c \ + %D%/strrchr.c \ + %D%/strsep.c \ + %D%/strsignal.c \ + %D%/strspn.c \ + %D%/strtok.c \ + %D%/strtok_r.c \ + %D%/strupr.c \ + %D%/strxfrm.c \ + %D%/strstr.c \ + %D%/swab.c \ + %D%/timingsafe_bcmp.c \ + %D%/timingsafe_memcmp.c \ + %D%/u_strerr.c \ + %D%/wcscat.c \ + %D%/wcschr.c \ + %D%/wcscmp.c \ + %D%/wcscoll.c \ + %D%/wcscpy.c \ + %D%/wcscspn.c \ + %D%/wcslcat.c \ + %D%/wcslcpy.c \ + %D%/wcslen.c \ + %D%/wcsncat.c \ + %D%/wcsncmp.c \ + %D%/wcsncpy.c \ + %D%/wcsnlen.c \ + %D%/wcspbrk.c \ + %D%/wcsrchr.c \ + %D%/wcsspn.c \ + %D%/wcsstr.c \ + %D%/wcstok.c \ + %D%/wcswidth.c \ + %D%/wcsxfrm.c \ + %D%/wcwidth.c \ + %D%/wmemchr.c \ + %D%/wmemcmp.c \ + %D%/wmemcpy.c \ + %D%/wmemmove.c \ + %D%/wmemset.c \ + %D%/xpg_strerror_r.c + +%C%_ELIX_2_SOURCES = +if ELIX_LEVEL_1 +else +%C%_ELIX_2_SOURCES += \ + %D%/bcmp.c \ + %D%/memccpy.c \ + %D%/mempcpy.c \ + %D%/stpcpy.c \ + %D%/stpncpy.c \ + %D%/strndup.c \ + %D%/strcasestr.c \ + %D%/strchrnul.c \ + %D%/strndup_r.c \ + %D%/wcpcpy.c \ + %D%/wcpncpy.c \ + %D%/wcsdup.c +endif !ELIX_LEVEL_1 + +%C%_ELIX_4_SOURCES = +if ELIX_LEVEL_1 +else +if ELIX_LEVEL_2 +else +if ELIX_LEVEL_3 +else +%C%_ELIX_4_SOURCES += \ + %D%/gnu_basename.c \ + %D%/memmem.c \ + %D%/memrchr.c \ + %D%/rawmemchr.c \ + %D%/strcasecmp_l.c \ + %D%/strcoll_l.c \ + %D%/strncasecmp_l.c \ + %D%/strverscmp.c \ + %D%/strxfrm_l.c \ + %D%/wcscasecmp.c \ + %D%/wcscasecmp_l.c \ + %D%/wcscoll_l.c \ + %D%/wcsncasecmp.c \ + %D%/wcsncasecmp_l.c \ + %D%/wcsxfrm_l.c \ + %D%/wmempcpy.c +endif !ELIX_LEVEL_3 +endif !ELIX_LEVEL_2 +endif !ELIX_LEVEL_1 + +libc_a_SOURCES += $(%C%_ELIX_2_SOURCES) $(%C%_ELIX_4_SOURCES) + +LIBC_CHEWOUT_FILES += \ + %D%/bcmp.def %D%/memcpy.def %D%/strcmp.def %D%/strncat.def %D%/strstr.def \ + %D%/bcopy.def %D%/memmove.def %D%/strcoll.def %D%/strncmp.def %D%/strtok.def \ + %D%/bzero.def %D%/memset.def %D%/strcpy.def %D%/strncpy.def %D%/strxfrm.def \ + %D%/index.def %D%/rindex.def %D%/strcspn.def %D%/strpbrk.def %D%/swab.def \ + %D%/memchr.def %D%/strcat.def %D%/strerror.def %D%/strerror_r.def %D%/strrchr.def \ + %D%/memcmp.def %D%/strchr.def %D%/strlen.def %D%/strnlen.def %D%/strspn.def \ + %D%/strcasecmp.def %D%/strncasecmp.def %D%/strcasestr.def %D%/strlwr.def %D%/strupr.def \ + %D%/memccpy.def %D%/mempcpy.def %D%/stpcpy.def %D%/stpncpy.def %D%/strsignal.def \ + %D%/wcscasecmp.def %D%/wcscat.def %D%/wcschr.def %D%/wcscmp.def %D%/wcscoll.def \ + %D%/wcscpy.def %D%/wcscspn.def %D%/wcpcpy.def %D%/wcpncpy.def %D%/wcsdup.def \ + %D%/wcslcat.def %D%/wcslcpy.def %D%/wcslen.def %D%/wcsncasecmp.def %D%/wcsncat.def \ + %D%/wcsncmp.def %D%/wcsncpy.def %D%/wcsnlen.def %D%/wcspbrk.def \ + %D%/wcsrchr.def %D%/wcsspn.def %D%/wcsstr.def %D%/wcstok.def \ + %D%/wcswidth.def %D%/wcsxfrm.def %D%/wcwidth.def %D%/wmemchr.def \ + %D%/wmemcmp.def %D%/wmemcpy.def %D%/wmemmove.def %D%/wmemset.def \ + %D%/memmem.def %D%/memrchr.def %D%/rawmemchr.def %D%/strchrnul.def \ + %D%/strcasecmp_l.def %D%/strcoll_l.def %D%/strncasecmp_l.def %D%/strxfrm_l.def \ + %D%/wcscasecmp_l.def %D%/wcscoll_l.def %D%/wcsncasecmp_l.def %D%/wcsxfrm_l.def \ + %D%/strverscmp.def %D%/strnstr.def %D%/wmempcpy.def + +LIBC_CHAPTERS += %D%/strings.tex %D%/wcstrings.tex diff --git a/lib/string/WIDTH-A b/lib/string/WIDTH-A new file mode 100644 index 0000000..51e8f23 --- /dev/null +++ b/lib/string/WIDTH-A @@ -0,0 +1,569 @@ +# UAX #11: East Asian Ambiguous + +# Plane 00 +# Rows Positions (Cells) + + 00 A1 A4 A7-A8 AA AD-AE B0-B4 B6-BA BC-BF C6 D0 D7-D8 DE-E1 E6 E8-EA + 00 EC-ED F0 F2-F3 F7-FA FC FE + 01 01 11 13 1B 26-27 2B 31-33 38 3F-42 44 48-4B 4D 52-53 66-67 6B + 01 CE D0 D2 D4 D6 D8 DA DC + 02 51 61 C4 C7 C9-CB CD D0 D8-DB DD DF + 03 00-6F 91-A1 A3-A9 B1-C1 C3-C9 + 04 01 10-4F 51 + 20 10 13-16 18-19 1C-1D 20-22 24-27 30 32-33 35 3B 3E 74 7F 81-84 + 20 AC + 21 03 05 09 13 16 21-22 26 2B 53-54 5B-5E 60-6B 70-79 89 90-99 B8-B9 + 21 D2 D4 E7 + 22 00 02-03 07-08 0B 0F 11 15 1A 1D-20 23 25 27-2C 2E 34-37 3C-3D + 22 48 4C 52 60-61 64-67 6A-6B 6E-6F 82-83 86-87 95 99 A5 BF + 23 12 + 24 60-E9 EB-FF + 25 00-4B 50-73 80-8F 92-95 A0-A1 A3-A9 B2-B3 B6-B7 BC-BD C0-C1 C6-C8 + 25 CB CE-D1 E2-E5 EF + 26 05-06 09 0E-0F 1C 1E 40 42 60-61 63-65 67-6A 6C-6D 6F 9E-9F BF + 26 C6-CD CF-D3 D5-E1 E3 E8-E9 EB-F1 F4 F6-F9 FB-FC FE-FF + 27 3D 76-7F + 2B 56-59 + 32 48-4F + E0 00-FF + E1 00-FF + E2 00-FF + E3 00-FF + E4 00-FF + E5 00-FF + E6 00-FF + E7 00-FF + E8 00-FF + E9 00-FF + EA 00-FF + EB 00-FF + EC 00-FF + ED 00-FF + EE 00-FF + EF 00-FF + F0 00-FF + F1 00-FF + F2 00-FF + F3 00-FF + F4 00-FF + F5 00-FF + F6 00-FF + F7 00-FF + F8 00-FF + FE 00-0F + FF FD + 1F1 00-0A 10-2D 30-69 70-8D 8F-90 9B-AC + E01 00-EF + F00 00-FF + F01 00-FF + F02 00-FF + F03 00-FF + F04 00-FF + F05 00-FF + F06 00-FF + F07 00-FF + F08 00-FF + F09 00-FF + F0A 00-FF + F0B 00-FF + F0C 00-FF + F0D 00-FF + F0E 00-FF + F0F 00-FF + F10 00-FF + F11 00-FF + F12 00-FF + F13 00-FF + F14 00-FF + F15 00-FF + F16 00-FF + F17 00-FF + F18 00-FF + F19 00-FF + F1A 00-FF + F1B 00-FF + F1C 00-FF + F1D 00-FF + F1E 00-FF + F1F 00-FF + F20 00-FF + F21 00-FF + F22 00-FF + F23 00-FF + F24 00-FF + F25 00-FF + F26 00-FF + F27 00-FF + F28 00-FF + F29 00-FF + F2A 00-FF + F2B 00-FF + F2C 00-FF + F2D 00-FF + F2E 00-FF + F2F 00-FF + F30 00-FF + F31 00-FF + F32 00-FF + F33 00-FF + F34 00-FF + F35 00-FF + F36 00-FF + F37 00-FF + F38 00-FF + F39 00-FF + F3A 00-FF + F3B 00-FF + F3C 00-FF + F3D 00-FF + F3E 00-FF + F3F 00-FF + F40 00-FF + F41 00-FF + F42 00-FF + F43 00-FF + F44 00-FF + F45 00-FF + F46 00-FF + F47 00-FF + F48 00-FF + F49 00-FF + F4A 00-FF + F4B 00-FF + F4C 00-FF + F4D 00-FF + F4E 00-FF + F4F 00-FF + F50 00-FF + F51 00-FF + F52 00-FF + F53 00-FF + F54 00-FF + F55 00-FF + F56 00-FF + F57 00-FF + F58 00-FF + F59 00-FF + F5A 00-FF + F5B 00-FF + F5C 00-FF + F5D 00-FF + F5E 00-FF + F5F 00-FF + F60 00-FF + F61 00-FF + F62 00-FF + F63 00-FF + F64 00-FF + F65 00-FF + F66 00-FF + F67 00-FF + F68 00-FF + F69 00-FF + F6A 00-FF + F6B 00-FF + F6C 00-FF + F6D 00-FF + F6E 00-FF + F6F 00-FF + F70 00-FF + F71 00-FF + F72 00-FF + F73 00-FF + F74 00-FF + F75 00-FF + F76 00-FF + F77 00-FF + F78 00-FF + F79 00-FF + F7A 00-FF + F7B 00-FF + F7C 00-FF + F7D 00-FF + F7E 00-FF + F7F 00-FF + F80 00-FF + F81 00-FF + F82 00-FF + F83 00-FF + F84 00-FF + F85 00-FF + F86 00-FF + F87 00-FF + F88 00-FF + F89 00-FF + F8A 00-FF + F8B 00-FF + F8C 00-FF + F8D 00-FF + F8E 00-FF + F8F 00-FF + F90 00-FF + F91 00-FF + F92 00-FF + F93 00-FF + F94 00-FF + F95 00-FF + F96 00-FF + F97 00-FF + F98 00-FF + F99 00-FF + F9A 00-FF + F9B 00-FF + F9C 00-FF + F9D 00-FF + F9E 00-FF + F9F 00-FF + FA0 00-FF + FA1 00-FF + FA2 00-FF + FA3 00-FF + FA4 00-FF + FA5 00-FF + FA6 00-FF + FA7 00-FF + FA8 00-FF + FA9 00-FF + FAA 00-FF + FAB 00-FF + FAC 00-FF + FAD 00-FF + FAE 00-FF + FAF 00-FF + FB0 00-FF + FB1 00-FF + FB2 00-FF + FB3 00-FF + FB4 00-FF + FB5 00-FF + FB6 00-FF + FB7 00-FF + FB8 00-FF + FB9 00-FF + FBA 00-FF + FBB 00-FF + FBC 00-FF + FBD 00-FF + FBE 00-FF + FBF 00-FF + FC0 00-FF + FC1 00-FF + FC2 00-FF + FC3 00-FF + FC4 00-FF + FC5 00-FF + FC6 00-FF + FC7 00-FF + FC8 00-FF + FC9 00-FF + FCA 00-FF + FCB 00-FF + FCC 00-FF + FCD 00-FF + FCE 00-FF + FCF 00-FF + FD0 00-FF + FD1 00-FF + FD2 00-FF + FD3 00-FF + FD4 00-FF + FD5 00-FF + FD6 00-FF + FD7 00-FF + FD8 00-FF + FD9 00-FF + FDA 00-FF + FDB 00-FF + FDC 00-FF + FDD 00-FF + FDE 00-FF + FDF 00-FF + FE0 00-FF + FE1 00-FF + FE2 00-FF + FE3 00-FF + FE4 00-FF + FE5 00-FF + FE6 00-FF + FE7 00-FF + FE8 00-FF + FE9 00-FF + FEA 00-FF + FEB 00-FF + FEC 00-FF + FED 00-FF + FEE 00-FF + FEF 00-FF + FF0 00-FF + FF1 00-FF + FF2 00-FF + FF3 00-FF + FF4 00-FF + FF5 00-FF + FF6 00-FF + FF7 00-FF + FF8 00-FF + FF9 00-FF + FFA 00-FF + FFB 00-FF + FFC 00-FF + FFD 00-FF + FFE 00-FF + FFF 00-FD + 1000 00-FF + 1001 00-FF + 1002 00-FF + 1003 00-FF + 1004 00-FF + 1005 00-FF + 1006 00-FF + 1007 00-FF + 1008 00-FF + 1009 00-FF + 100A 00-FF + 100B 00-FF + 100C 00-FF + 100D 00-FF + 100E 00-FF + 100F 00-FF + 1010 00-FF + 1011 00-FF + 1012 00-FF + 1013 00-FF + 1014 00-FF + 1015 00-FF + 1016 00-FF + 1017 00-FF + 1018 00-FF + 1019 00-FF + 101A 00-FF + 101B 00-FF + 101C 00-FF + 101D 00-FF + 101E 00-FF + 101F 00-FF + 1020 00-FF + 1021 00-FF + 1022 00-FF + 1023 00-FF + 1024 00-FF + 1025 00-FF + 1026 00-FF + 1027 00-FF + 1028 00-FF + 1029 00-FF + 102A 00-FF + 102B 00-FF + 102C 00-FF + 102D 00-FF + 102E 00-FF + 102F 00-FF + 1030 00-FF + 1031 00-FF + 1032 00-FF + 1033 00-FF + 1034 00-FF + 1035 00-FF + 1036 00-FF + 1037 00-FF + 1038 00-FF + 1039 00-FF + 103A 00-FF + 103B 00-FF + 103C 00-FF + 103D 00-FF + 103E 00-FF + 103F 00-FF + 1040 00-FF + 1041 00-FF + 1042 00-FF + 1043 00-FF + 1044 00-FF + 1045 00-FF + 1046 00-FF + 1047 00-FF + 1048 00-FF + 1049 00-FF + 104A 00-FF + 104B 00-FF + 104C 00-FF + 104D 00-FF + 104E 00-FF + 104F 00-FF + 1050 00-FF + 1051 00-FF + 1052 00-FF + 1053 00-FF + 1054 00-FF + 1055 00-FF + 1056 00-FF + 1057 00-FF + 1058 00-FF + 1059 00-FF + 105A 00-FF + 105B 00-FF + 105C 00-FF + 105D 00-FF + 105E 00-FF + 105F 00-FF + 1060 00-FF + 1061 00-FF + 1062 00-FF + 1063 00-FF + 1064 00-FF + 1065 00-FF + 1066 00-FF + 1067 00-FF + 1068 00-FF + 1069 00-FF + 106A 00-FF + 106B 00-FF + 106C 00-FF + 106D 00-FF + 106E 00-FF + 106F 00-FF + 1070 00-FF + 1071 00-FF + 1072 00-FF + 1073 00-FF + 1074 00-FF + 1075 00-FF + 1076 00-FF + 1077 00-FF + 1078 00-FF + 1079 00-FF + 107A 00-FF + 107B 00-FF + 107C 00-FF + 107D 00-FF + 107E 00-FF + 107F 00-FF + 1080 00-FF + 1081 00-FF + 1082 00-FF + 1083 00-FF + 1084 00-FF + 1085 00-FF + 1086 00-FF + 1087 00-FF + 1088 00-FF + 1089 00-FF + 108A 00-FF + 108B 00-FF + 108C 00-FF + 108D 00-FF + 108E 00-FF + 108F 00-FF + 1090 00-FF + 1091 00-FF + 1092 00-FF + 1093 00-FF + 1094 00-FF + 1095 00-FF + 1096 00-FF + 1097 00-FF + 1098 00-FF + 1099 00-FF + 109A 00-FF + 109B 00-FF + 109C 00-FF + 109D 00-FF + 109E 00-FF + 109F 00-FF + 10A0 00-FF + 10A1 00-FF + 10A2 00-FF + 10A3 00-FF + 10A4 00-FF + 10A5 00-FF + 10A6 00-FF + 10A7 00-FF + 10A8 00-FF + 10A9 00-FF + 10AA 00-FF + 10AB 00-FF + 10AC 00-FF + 10AD 00-FF + 10AE 00-FF + 10AF 00-FF + 10B0 00-FF + 10B1 00-FF + 10B2 00-FF + 10B3 00-FF + 10B4 00-FF + 10B5 00-FF + 10B6 00-FF + 10B7 00-FF + 10B8 00-FF + 10B9 00-FF + 10BA 00-FF + 10BB 00-FF + 10BC 00-FF + 10BD 00-FF + 10BE 00-FF + 10BF 00-FF + 10C0 00-FF + 10C1 00-FF + 10C2 00-FF + 10C3 00-FF + 10C4 00-FF + 10C5 00-FF + 10C6 00-FF + 10C7 00-FF + 10C8 00-FF + 10C9 00-FF + 10CA 00-FF + 10CB 00-FF + 10CC 00-FF + 10CD 00-FF + 10CE 00-FF + 10CF 00-FF + 10D0 00-FF + 10D1 00-FF + 10D2 00-FF + 10D3 00-FF + 10D4 00-FF + 10D5 00-FF + 10D6 00-FF + 10D7 00-FF + 10D8 00-FF + 10D9 00-FF + 10DA 00-FF + 10DB 00-FF + 10DC 00-FF + 10DD 00-FF + 10DE 00-FF + 10DF 00-FF + 10E0 00-FF + 10E1 00-FF + 10E2 00-FF + 10E3 00-FF + 10E4 00-FF + 10E5 00-FF + 10E6 00-FF + 10E7 00-FF + 10E8 00-FF + 10E9 00-FF + 10EA 00-FF + 10EB 00-FF + 10EC 00-FF + 10ED 00-FF + 10EE 00-FF + 10EF 00-FF + 10F0 00-FF + 10F1 00-FF + 10F2 00-FF + 10F3 00-FF + 10F4 00-FF + 10F5 00-FF + 10F6 00-FF + 10F7 00-FF + 10F8 00-FF + 10F9 00-FF + 10FA 00-FF + 10FB 00-FF + 10FC 00-FF + 10FD 00-FF + 10FE 00-FF + 10FF 00-FD + diff --git a/lib/string/ambiguous.t b/lib/string/ambiguous.t new file mode 100644 index 0000000..f8b7842 --- /dev/null +++ b/lib/string/ambiguous.t @@ -0,0 +1,61 @@ +{ + { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, + { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, + { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, + { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, + { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, + { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, + { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, + { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, + { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, + { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, + { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, + { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, + { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, + { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, + { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, + { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, + { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, + { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, + { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, + { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, + { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, + { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, + { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, + { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, + { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, + { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, + { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, + { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, + { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, + { 0x2189, 0x2189 }, { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, + { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, + { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, + { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, + { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, + { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, + { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, + { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, + { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, + { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, + { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, + { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, + { 0x24EB, 0x254B }, { 0x2550, 0x2573 }, { 0x2580, 0x258F }, + { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, + { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, + { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, + { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, + { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, + { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, + { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, + { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, + { 0x269E, 0x269F }, { 0x26BF, 0x26BF }, { 0x26C6, 0x26CD }, + { 0x26CF, 0x26D3 }, { 0x26D5, 0x26E1 }, { 0x26E3, 0x26E3 }, + { 0x26E8, 0x26E9 }, { 0x26EB, 0x26F1 }, { 0x26F4, 0x26F4 }, + { 0x26F6, 0x26F9 }, { 0x26FB, 0x26FC }, { 0x26FE, 0x26FF }, + { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0x2B56, 0x2B59 }, + { 0x3248, 0x324F }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD }, + { 0x1F100, 0x1F10A }, { 0x1F110, 0x1F12D }, { 0x1F130, 0x1F169 }, + { 0x1F170, 0x1F18D }, { 0x1F18F, 0x1F190 }, { 0x1F19B, 0x1F1AC }, + { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } +}; diff --git a/lib/string/bcmp.c b/lib/string/bcmp.c new file mode 100644 index 0000000..747f8af --- /dev/null +++ b/lib/string/bcmp.c @@ -0,0 +1,41 @@ +/* +FUNCTION + <>---compare two memory areas + +INDEX + bcmp + +SYNOPSIS + #include + int bcmp(const void *<[s1]>, const void *<[s2]>, size_t <[n]>); + +DESCRIPTION + This function compares not more than <[n]> bytes of the + object pointed to by <[s1]> with the object pointed to by <[s2]>. + + This function is identical to <>. + +RETURNS + The function returns an integer greater than, equal to or + less than zero according to whether the object pointed to by + <[s1]> is greater than, equal to or less than the object + pointed to by <[s2]>. + +PORTABILITY +<> requires no supporting OS subroutines. + +QUICKREF + bcmp ansi pure +*/ + +#include +#include + +int +bcmp (const void *m1, + const void *m2, + size_t n) + +{ + return memcmp (m1, m2, n); +} diff --git a/lib/string/bcopy.c b/lib/string/bcopy.c new file mode 100644 index 0000000..d8bdeb5 --- /dev/null +++ b/lib/string/bcopy.c @@ -0,0 +1,32 @@ +/* +FUNCTION + <>---copy memory regions + +SYNOPSIS + #include + void bcopy(const void *<[in]>, void *<[out]>, size_t <[n]>); + +DESCRIPTION + This function copies <[n]> bytes from the memory region + pointed to by <[in]> to the memory region pointed to by + <[out]>. + + This function is implemented in term of <>. + +PORTABILITY +<> requires no supporting OS subroutines. + +QUICKREF + bcopy - pure +*/ + +#include +#include + +void +bcopy (const void *b1, + void *b2, + size_t length) +{ + memmove (b2, b1, length); +} diff --git a/lib/string/bzero.c b/lib/string/bzero.c new file mode 100644 index 0000000..dc52170 --- /dev/null +++ b/lib/string/bzero.c @@ -0,0 +1,34 @@ +/* +FUNCTION +<>---initialize memory to zero + +INDEX + bzero + +SYNOPSIS + #include + void bzero(void *<[b]>, size_t <[length]>); + +DESCRIPTION +<> initializes <[length]> bytes of memory, starting at address +<[b]>, to zero. + +RETURNS +<> does not return a result. + +PORTABILITY +<> is in the Berkeley Software Distribution. +Neither ANSI C nor the System V Interface Definition (Issue 2) require +<>. + +<> requires no supporting OS subroutines. +*/ + +#include + +void +bzero(void *b, size_t length) +{ + + memset(b, 0, length); +} diff --git a/lib/string/combining.t b/lib/string/combining.t new file mode 100644 index 0000000..0d7345c --- /dev/null +++ b/lib/string/combining.t @@ -0,0 +1,122 @@ +{ + { 0x0300, 0x036F }, { 0x0483, 0x0489 }, { 0x0591, 0x05BD }, + { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, + { 0x05C7, 0x05C7 }, { 0x0600, 0x0605 }, { 0x0610, 0x061A }, + { 0x061C, 0x061C }, { 0x064B, 0x065F }, { 0x0670, 0x0670 }, + { 0x06D6, 0x06DD }, { 0x06DF, 0x06E4 }, { 0x06E7, 0x06E8 }, + { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, + { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, + { 0x07FD, 0x07FD }, { 0x0816, 0x0819 }, { 0x081B, 0x0823 }, + { 0x0825, 0x0827 }, { 0x0829, 0x082D }, { 0x0859, 0x085B }, + { 0x0890, 0x0891 }, { 0x0898, 0x089F }, { 0x08CA, 0x0902 }, + { 0x093A, 0x093A }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, + { 0x094D, 0x094D }, { 0x0951, 0x0957 }, { 0x0962, 0x0963 }, + { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, + { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x09FE, 0x09FE }, + { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, + { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A51, 0x0A51 }, + { 0x0A70, 0x0A71 }, { 0x0A75, 0x0A75 }, { 0x0A81, 0x0A82 }, + { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, + { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0AFA, 0x0AFF }, + { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, + { 0x0B41, 0x0B44 }, { 0x0B4D, 0x0B4D }, { 0x0B55, 0x0B56 }, + { 0x0B62, 0x0B63 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, + { 0x0BCD, 0x0BCD }, { 0x0C00, 0x0C00 }, { 0x0C04, 0x0C04 }, + { 0x0C3C, 0x0C3C }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, + { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0C62, 0x0C63 }, + { 0x0C81, 0x0C81 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, + { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 }, + { 0x0D00, 0x0D01 }, { 0x0D3B, 0x0D3C }, { 0x0D41, 0x0D44 }, + { 0x0D4D, 0x0D4D }, { 0x0D62, 0x0D63 }, { 0x0D81, 0x0D81 }, + { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, + { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, + { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EBC }, { 0x0EC8, 0x0ECE }, + { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, + { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, + { 0x0F86, 0x0F87 }, { 0x0F8D, 0x0F97 }, { 0x0F99, 0x0FBC }, + { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1037 }, + { 0x1039, 0x103A }, { 0x103D, 0x103E }, { 0x1058, 0x1059 }, + { 0x105E, 0x1060 }, { 0x1071, 0x1074 }, { 0x1082, 0x1082 }, + { 0x1085, 0x1086 }, { 0x108D, 0x108D }, { 0x109D, 0x109D }, + { 0x1160, 0x11FF }, { 0x135D, 0x135F }, { 0x1712, 0x1714 }, + { 0x1732, 0x1733 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, + { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, + { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180F }, + { 0x1885, 0x1886 }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, + { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, + { 0x1A17, 0x1A18 }, { 0x1A1B, 0x1A1B }, { 0x1A56, 0x1A56 }, + { 0x1A58, 0x1A5E }, { 0x1A60, 0x1A60 }, { 0x1A62, 0x1A62 }, + { 0x1A65, 0x1A6C }, { 0x1A73, 0x1A7C }, { 0x1A7F, 0x1A7F }, + { 0x1AB0, 0x1ACE }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, + { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, + { 0x1B6B, 0x1B73 }, { 0x1B80, 0x1B81 }, { 0x1BA2, 0x1BA5 }, + { 0x1BA8, 0x1BA9 }, { 0x1BAB, 0x1BAD }, { 0x1BE6, 0x1BE6 }, + { 0x1BE8, 0x1BE9 }, { 0x1BED, 0x1BED }, { 0x1BEF, 0x1BF1 }, + { 0x1C2C, 0x1C33 }, { 0x1C36, 0x1C37 }, { 0x1CD0, 0x1CD2 }, + { 0x1CD4, 0x1CE0 }, { 0x1CE2, 0x1CE8 }, { 0x1CED, 0x1CED }, + { 0x1CF4, 0x1CF4 }, { 0x1CF8, 0x1CF9 }, { 0x1DC0, 0x1DFF }, + { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2064 }, + { 0x2066, 0x206F }, { 0x20D0, 0x20F0 }, { 0x2CEF, 0x2CF1 }, + { 0x2D7F, 0x2D7F }, { 0x2DE0, 0x2DFF }, { 0x302A, 0x302D }, + { 0x3099, 0x309A }, { 0xA66F, 0xA672 }, { 0xA674, 0xA67D }, + { 0xA69E, 0xA69F }, { 0xA6F0, 0xA6F1 }, { 0xA802, 0xA802 }, + { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, + { 0xA82C, 0xA82C }, { 0xA8C4, 0xA8C5 }, { 0xA8E0, 0xA8F1 }, + { 0xA8FF, 0xA8FF }, { 0xA926, 0xA92D }, { 0xA947, 0xA951 }, + { 0xA980, 0xA982 }, { 0xA9B3, 0xA9B3 }, { 0xA9B6, 0xA9B9 }, + { 0xA9BC, 0xA9BD }, { 0xA9E5, 0xA9E5 }, { 0xAA29, 0xAA2E }, + { 0xAA31, 0xAA32 }, { 0xAA35, 0xAA36 }, { 0xAA43, 0xAA43 }, + { 0xAA4C, 0xAA4C }, { 0xAA7C, 0xAA7C }, { 0xAAB0, 0xAAB0 }, + { 0xAAB2, 0xAAB4 }, { 0xAAB7, 0xAAB8 }, { 0xAABE, 0xAABF }, + { 0xAAC1, 0xAAC1 }, { 0xAAEC, 0xAAED }, { 0xAAF6, 0xAAF6 }, + { 0xABE5, 0xABE5 }, { 0xABE8, 0xABE8 }, { 0xABED, 0xABED }, + { 0xD7B0, 0xD7C6 }, { 0xD7CB, 0xD7FB }, { 0xFB1E, 0xFB1E }, + { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE2F }, { 0xFEFF, 0xFEFF }, + { 0xFFF9, 0xFFFB }, { 0x101FD, 0x101FD }, { 0x102E0, 0x102E0 }, + { 0x10376, 0x1037A }, { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, + { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, + { 0x10AE5, 0x10AE6 }, { 0x10D24, 0x10D27 }, { 0x10EAB, 0x10EAC }, + { 0x10EFD, 0x10EFF }, { 0x10F46, 0x10F50 }, { 0x10F82, 0x10F85 }, + { 0x11001, 0x11001 }, { 0x11038, 0x11046 }, { 0x11070, 0x11070 }, + { 0x11073, 0x11074 }, { 0x1107F, 0x11081 }, { 0x110B3, 0x110B6 }, + { 0x110B9, 0x110BA }, { 0x110BD, 0x110BD }, { 0x110C2, 0x110C2 }, + { 0x110CD, 0x110CD }, { 0x11100, 0x11102 }, { 0x11127, 0x1112B }, + { 0x1112D, 0x11134 }, { 0x11173, 0x11173 }, { 0x11180, 0x11181 }, + { 0x111B6, 0x111BE }, { 0x111C9, 0x111CC }, { 0x111CF, 0x111CF }, + { 0x1122F, 0x11231 }, { 0x11234, 0x11234 }, { 0x11236, 0x11237 }, + { 0x1123E, 0x1123E }, { 0x11241, 0x11241 }, { 0x112DF, 0x112DF }, + { 0x112E3, 0x112EA }, { 0x11300, 0x11301 }, { 0x1133B, 0x1133C }, + { 0x11340, 0x11340 }, { 0x11366, 0x1136C }, { 0x11370, 0x11374 }, + { 0x11438, 0x1143F }, { 0x11442, 0x11444 }, { 0x11446, 0x11446 }, + { 0x1145E, 0x1145E }, { 0x114B3, 0x114B8 }, { 0x114BA, 0x114BA }, + { 0x114BF, 0x114C0 }, { 0x114C2, 0x114C3 }, { 0x115B2, 0x115B5 }, + { 0x115BC, 0x115BD }, { 0x115BF, 0x115C0 }, { 0x115DC, 0x115DD }, + { 0x11633, 0x1163A }, { 0x1163D, 0x1163D }, { 0x1163F, 0x11640 }, + { 0x116AB, 0x116AB }, { 0x116AD, 0x116AD }, { 0x116B0, 0x116B5 }, + { 0x116B7, 0x116B7 }, { 0x1171D, 0x1171F }, { 0x11722, 0x11725 }, + { 0x11727, 0x1172B }, { 0x1182F, 0x11837 }, { 0x11839, 0x1183A }, + { 0x1193B, 0x1193C }, { 0x1193E, 0x1193E }, { 0x11943, 0x11943 }, + { 0x119D4, 0x119D7 }, { 0x119DA, 0x119DB }, { 0x119E0, 0x119E0 }, + { 0x11A01, 0x11A0A }, { 0x11A33, 0x11A38 }, { 0x11A3B, 0x11A3E }, + { 0x11A47, 0x11A47 }, { 0x11A51, 0x11A56 }, { 0x11A59, 0x11A5B }, + { 0x11A8A, 0x11A96 }, { 0x11A98, 0x11A99 }, { 0x11C30, 0x11C36 }, + { 0x11C38, 0x11C3D }, { 0x11C3F, 0x11C3F }, { 0x11C92, 0x11CA7 }, + { 0x11CAA, 0x11CB0 }, { 0x11CB2, 0x11CB3 }, { 0x11CB5, 0x11CB6 }, + { 0x11D31, 0x11D36 }, { 0x11D3A, 0x11D3A }, { 0x11D3C, 0x11D3D }, + { 0x11D3F, 0x11D45 }, { 0x11D47, 0x11D47 }, { 0x11D90, 0x11D91 }, + { 0x11D95, 0x11D95 }, { 0x11D97, 0x11D97 }, { 0x11EF3, 0x11EF4 }, + { 0x11F00, 0x11F01 }, { 0x11F36, 0x11F3A }, { 0x11F40, 0x11F40 }, + { 0x11F42, 0x11F42 }, { 0x13430, 0x13440 }, { 0x13447, 0x13455 }, + { 0x16AF0, 0x16AF4 }, { 0x16B30, 0x16B36 }, { 0x16F4F, 0x16F4F }, + { 0x16F8F, 0x16F92 }, { 0x16FE4, 0x16FE4 }, { 0x1BC9D, 0x1BC9E }, + { 0x1BCA0, 0x1BCA3 }, { 0x1CF00, 0x1CF2D }, { 0x1CF30, 0x1CF46 }, + { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, + { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, { 0x1DA00, 0x1DA36 }, + { 0x1DA3B, 0x1DA6C }, { 0x1DA75, 0x1DA75 }, { 0x1DA84, 0x1DA84 }, + { 0x1DA9B, 0x1DA9F }, { 0x1DAA1, 0x1DAAF }, { 0x1E000, 0x1E006 }, + { 0x1E008, 0x1E018 }, { 0x1E01B, 0x1E021 }, { 0x1E023, 0x1E024 }, + { 0x1E026, 0x1E02A }, { 0x1E08F, 0x1E08F }, { 0x1E130, 0x1E136 }, + { 0x1E2AE, 0x1E2AE }, { 0x1E2EC, 0x1E2EF }, { 0x1E4EC, 0x1E4EF }, + { 0x1E8D0, 0x1E8D6 }, { 0x1E944, 0x1E94A }, { 0xE0001, 0xE0001 }, + { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF } +}; diff --git a/lib/string/explicit_bzero.c b/lib/string/explicit_bzero.c new file mode 100644 index 0000000..5124df2 --- /dev/null +++ b/lib/string/explicit_bzero.c @@ -0,0 +1,16 @@ +/* $OpenBSD: explicit_bzero.c,v 1.2 2014/06/10 04:17:37 deraadt Exp $ */ +/* + * Public domain. + * Written by Ted Unangst + */ + +#include + +/* + * explicit_bzero - don't let the compiler optimize away bzero + */ +void +explicit_bzero(void *p, size_t n) +{ + bzero(p, n); +} diff --git a/lib/string/ffsl.c b/lib/string/ffsl.c new file mode 100644 index 0000000..4b1d52d --- /dev/null +++ b/lib/string/ffsl.c @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2017 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +int +ffsl(long i) +{ + + return (__builtin_ffsl(i)); +} diff --git a/lib/string/ffsll.c b/lib/string/ffsll.c new file mode 100644 index 0000000..7172506 --- /dev/null +++ b/lib/string/ffsll.c @@ -0,0 +1,34 @@ +/*- + * Copyright (c) 2017 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +int +ffsll(long long i) +{ + + return (__builtin_ffsll(i)); +} diff --git a/lib/string/fls.c b/lib/string/fls.c new file mode 100644 index 0000000..a3e88d2 --- /dev/null +++ b/lib/string/fls.c @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2017 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int +fls(int i) +{ + + if (i == 0) + return 0; + + return (sizeof(i) * CHAR_BIT - __builtin_clz(i)); +} diff --git a/lib/string/flsl.c b/lib/string/flsl.c new file mode 100644 index 0000000..af6277d --- /dev/null +++ b/lib/string/flsl.c @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2017 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int +flsl(long i) +{ + + if (i == 0) + return 0; + + return (sizeof(i) * CHAR_BIT - __builtin_clzl(i)); +} diff --git a/lib/string/flsll.c b/lib/string/flsll.c new file mode 100644 index 0000000..3936184 --- /dev/null +++ b/lib/string/flsll.c @@ -0,0 +1,38 @@ +/*- + * Copyright (c) 2017 embedded brains GmbH + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int +flsll(long long i) +{ + + if (i == 0) + return 0; + + return (sizeof(i) * CHAR_BIT - __builtin_clzll(i)); +} diff --git a/lib/string/gnu_basename.c b/lib/string/gnu_basename.c new file mode 100644 index 0000000..c435425 --- /dev/null +++ b/lib/string/gnu_basename.c @@ -0,0 +1,25 @@ +#ifndef _NO_BASENAME +/* Copyright 2015 Red Hat, Inc. + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + +/* The differences with the POSIX version (unix/basename.c): + * - declared in (instead of ); + * - the argument is never modified, and therefore is marked const; + * - the empty string is returned if path is an empty string, "/", or ends + * with a trailing slash. + */ + +#include + +char * +__gnu_basename (const char *path) +{ + char *p; + if ((p = strrchr (path, '/'))) + return p + 1; + return (char *) path; +} + +#endif /* !_NO_BASENAME */ diff --git a/lib/string/index.c b/lib/string/index.c new file mode 100644 index 0000000..4a67885 --- /dev/null +++ b/lib/string/index.c @@ -0,0 +1,38 @@ +/* +FUNCTION + <>---search for character in string + +INDEX + index + +SYNOPSIS + #include + char * index(const char *<[string]>, int <[c]>); + +DESCRIPTION + This function finds the first occurence of <[c]> (converted to + a char) in the string pointed to by <[string]> (including the + terminating null character). + + This function is identical to <>. + +RETURNS + Returns a pointer to the located character, or a null pointer + if <[c]> does not occur in <[string]>. + +PORTABILITY +<> requires no supporting OS subroutines. + +QUICKREF + index - pure +*/ + +#include +#include + +char * +index (const char *s, + int c) +{ + return strchr (s, c); +} diff --git a/lib/string/local.h b/lib/string/local.h new file mode 100644 index 0000000..4cb5285 --- /dev/null +++ b/lib/string/local.h @@ -0,0 +1,18 @@ +#include <_ansi.h> +#include "../ctype/local.h" + +/* internal function to compute width of wide char. */ +int __wcwidth (wint_t); + +/* + Taken from glibc: + Add the compiler optimization to inhibit loop transformation to library + calls. This is used to avoid recursive calls in memset and memmove + default implementations. +*/ +#ifdef _HAVE_CC_INHIBIT_LOOP_TO_LIBCALL +# define __inhibit_loop_to_libcall \ + __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns"))) +#else +# define __inhibit_loop_to_libcall +#endif diff --git a/lib/string/memccpy.c b/lib/string/memccpy.c new file mode 100644 index 0000000..6757cb3 --- /dev/null +++ b/lib/string/memccpy.c @@ -0,0 +1,136 @@ +/* +FUNCTION + <>---copy memory regions with end-token check + +SYNOPSIS + #include + void* memccpy(void *restrict <[out]>, const void *restrict <[in]>, + int <[endchar]>, size_t <[n]>); + +DESCRIPTION + This function copies up to <[n]> bytes from the memory region + pointed to by <[in]> to the memory region pointed to by + <[out]>. If a byte matching the <[endchar]> is encountered, + the byte is copied and copying stops. + + If the regions overlap, the behavior is undefined. + +RETURNS + <> returns a pointer to the first byte following the + <[endchar]> in the <[out]> region. If no byte matching + <[endchar]> was copied, then <> is returned. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. + + */ + +#include <_ansi.h> +#include +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LITTLEBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < LITTLEBLOCKSIZE) + +/* Macros for detecting endchar */ +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + + +void * +memccpy (void *__restrict dst0, + const void *__restrict src0, + int endchar0, + size_t len0) +{ + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + void *ptr = NULL; + char *dst = (char *) dst0; + char *src = (char *) src0; + char endchar = endchar0 & 0xff; + + while (len0--) + { + if ((*dst++ = *src++) == endchar) + { + ptr = dst; + break; + } + } + + return ptr; +#else + void *ptr = NULL; + unsigned char *dst = dst0; + const unsigned char *src = src0; + long *aligned_dst; + const long *aligned_src; + unsigned char endchar = endchar0 & 0xff; + + /* If the size is small, or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL(len0) && !UNALIGNED (src, dst)) + { + unsigned int i; + unsigned long mask = 0; + + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* The fast code reads the ASCII one word at a time and only + performs the bytewise search on word-sized segments if they + contain the search character, which is detected by XORing + the word-sized segment with a word-sized block of the search + character and then detecting for the presence of NULL in the + result. */ + for (i = 0; i < LITTLEBLOCKSIZE; i++) + mask = (mask << 8) + endchar; + + + /* Copy one long word at a time if possible. */ + while (len0 >= LITTLEBLOCKSIZE) + { + unsigned long buffer = (unsigned long)(*aligned_src); + buffer ^= mask; + if (DETECTNULL (buffer)) + break; /* endchar is found, go byte by byte from here */ + *aligned_dst++ = *aligned_src++; + len0 -= LITTLEBLOCKSIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (len0--) + { + if ((*dst++ = *src++) == endchar) + { + ptr = dst; + break; + } + } + + return ptr; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/memchr.c b/lib/string/memchr.c new file mode 100644 index 0000000..21bc4d8 --- /dev/null +++ b/lib/string/memchr.c @@ -0,0 +1,126 @@ +/* +FUNCTION + <>---find character in memory + +INDEX + memchr + +SYNOPSIS + #include + void *memchr(const void *<[src]>, int <[c]>, size_t <[length]>); + +DESCRIPTION + This function searches memory starting at <<*<[src]>>> for the + character <[c]>. The search only ends with the first + occurrence of <[c]>, or after <[length]> characters; in + particular, <> does not terminate the search. + +RETURNS + If the character <[c]> is found within <[length]> characters + of <<*<[src]>>>, a pointer to the character is returned. If + <[c]> is not found, then <> is returned. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + memchr ansi pure +*/ + +#include <_ansi.h> +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X) ((long)X & (sizeof (long) - 1)) + +/* How many bytes are loaded each iteration of the word copy loop. */ +#define LBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the bytewise iterator. */ +#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +/* DETECTCHAR returns nonzero if (long)X contains the byte used + to fill (long)MASK. */ +#define DETECTCHAR(X,MASK) (DETECTNULL(X ^ MASK)) + +void * +memchr (const void *src_void, + int c, + size_t length) +{ + const unsigned char *src = (const unsigned char *) src_void; + unsigned char d = c; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + unsigned long *asrc; + unsigned long mask; + unsigned int i; + + while (UNALIGNED (src)) + { + if (!length--) + return NULL; + if (*src == d) + return (void *) src; + src++; + } + + if (!TOO_SMALL (length)) + { + /* If we get this far, we know that length is large and src is + word-aligned. */ + /* The fast code reads the source one word at a time and only + performs the bytewise search on word-sized segments if they + contain the search character, which is detected by XORing + the word-sized segment with a word-sized block of the search + character and then detecting for the presence of NUL in the + result. */ + asrc = (unsigned long *) src; + mask = d << 8 | d; + mask = mask << 16 | mask; + for (i = 32; i < LBLOCKSIZE * 8; i <<= 1) + mask = (mask << i) | mask; + + while (length >= LBLOCKSIZE) + { + if (DETECTCHAR (*asrc, mask)) + break; + length -= LBLOCKSIZE; + asrc++; + } + + /* If there are fewer than LBLOCKSIZE characters left, + then we resort to the bytewise loop. */ + + src = (unsigned char *) asrc; + } + +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (length--) + { + if (*src == d) + return (void *) src; + src++; + } + + return NULL; +} diff --git a/lib/string/memcmp.c b/lib/string/memcmp.c new file mode 100644 index 0000000..342fb9f --- /dev/null +++ b/lib/string/memcmp.c @@ -0,0 +1,105 @@ +/* +FUNCTION + <>---compare two memory areas + +INDEX + memcmp + +SYNOPSIS + #include + int memcmp(const void *<[s1]>, const void *<[s2]>, size_t <[n]>); + +DESCRIPTION + This function compares not more than <[n]> characters of the + object pointed to by <[s1]> with the object pointed to by <[s2]>. + + +RETURNS + The function returns an integer greater than, equal to or + less than zero according to whether the object pointed to by + <[s1]> is greater than, equal to or less than the object + pointed to by <[s2]>. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + memcmp ansi pure +*/ + +#include + + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE) + +int +memcmp (const void *m1, + const void *m2, + size_t n) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + unsigned char *s1 = (unsigned char *) m1; + unsigned char *s2 = (unsigned char *) m2; + + while (n--) + { + if (*s1 != *s2) + { + return *s1 - *s2; + } + s1++; + s2++; + } + return 0; +#else + unsigned char *s1 = (unsigned char *) m1; + unsigned char *s2 = (unsigned char *) m2; + unsigned long *a1; + unsigned long *a2; + + /* If the size is too small, or either pointer is unaligned, + then we punt to the byte compare loop. Hopefully this will + not turn up in inner loops. */ + if (!TOO_SMALL(n) && !UNALIGNED(s1,s2)) + { + /* Otherwise, load and compare the blocks of memory one + word at a time. */ + a1 = (unsigned long*) s1; + a2 = (unsigned long*) s2; + while (n >= LBLOCKSIZE) + { + if (*a1 != *a2) + break; + a1++; + a2++; + n -= LBLOCKSIZE; + } + + /* check m mod LBLOCKSIZE remaining characters */ + + s1 = (unsigned char*)a1; + s2 = (unsigned char*)a2; + } + + while (n--) + { + if (*s1 != *s2) + return *s1 - *s2; + s1++; + s2++; + } + + return 0; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} + diff --git a/lib/string/memcpy.c b/lib/string/memcpy.c new file mode 100644 index 0000000..52f716b --- /dev/null +++ b/lib/string/memcpy.c @@ -0,0 +1,105 @@ +/* +FUNCTION + <>---copy memory regions + +SYNOPSIS + #include + void* memcpy(void *restrict <[out]>, const void *restrict <[in]>, + size_t <[n]>); + +DESCRIPTION + This function copies <[n]> bytes from the memory region + pointed to by <[in]> to the memory region pointed to by + <[out]>. + + If the regions overlap, the behavior is undefined. + +RETURNS + <> returns a pointer to the first byte of the <[out]> + region. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + memcpy ansi pure + */ + +#include <_ansi.h> +#include +#include "local.h" + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the 4X unrolled loop. */ +#define BIGBLOCKSIZE (sizeof (long) << 2) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LITTLEBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) + +void * +__inhibit_loop_to_libcall +memcpy (void *__restrict dst0, + const void *__restrict src0, + size_t len0) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *dst = (char *) dst0; + char *src = (char *) src0; + + void *save = dst0; + + while (len0--) + { + *dst++ = *src++; + } + + return save; +#else + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + + /* If the size is small, or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL(len0) && !UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* Copy 4X long words at a time if possible. */ + while (len0 >= BIGBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + len0 -= BIGBLOCKSIZE; + } + + /* Copy one long word at a time if possible. */ + while (len0 >= LITTLEBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + len0 -= LITTLEBLOCKSIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (len0--) + *dst++ = *src++; + + return dst0; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/memmem.c b/lib/string/memmem.c new file mode 100644 index 0000000..65267b9 --- /dev/null +++ b/lib/string/memmem.c @@ -0,0 +1,187 @@ +/* Optimized memmem function. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* +FUNCTION + <>---find memory segment + +INDEX + memmem + +SYNOPSIS + #include + void *memmem(const void *<[s1]>, size_t <[l1]>, const void *<[s2]>, + size_t <[l2]>); + +DESCRIPTION + + Locates the first occurrence in the memory region pointed to + by <[s1]> with length <[l1]> of the sequence of bytes pointed + to by <[s2]> of length <[l2]>. If you already know the + lengths of your haystack and needle, <> is much faster + than <>. + +RETURNS + Returns a pointer to the located segment, or a null pointer if + <[s2]> is not found. If <[l2]> is 0, <[s1]> is returned. + +PORTABILITY +<> is a newlib extension. + +<> requires no supporting OS subroutines. + +QUICKREF + memmem pure +*/ + +#include +#include + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + +/* Small and efficient memmem implementation (quadratic worst-case). */ +void * +memmem (const void *haystack, size_t hs_len, const void *needle, size_t ne_len) +{ + const char *hs = haystack; + const char *ne = needle; + + if (ne_len == 0) + return (void *)hs; + int i; + int c = ne[0]; + const char *end = hs + hs_len - ne_len; + + for ( ; hs <= end; hs++) + { + if (hs[0] != c) + continue; + for (i = ne_len - 1; i != 0; i--) + if (hs[i] != ne[i]) + break; + if (i == 0) + return (void *)hs; + } + + return NULL; +} + +#else + +# define RETURN_TYPE void * +# define AVAILABLE(h, h_l, j, n_l) ((j) <= (h_l) - (n_l)) +# include "str-two-way.h" + +#define hash2(p) (((size_t)(p)[0] - ((size_t)(p)[-1] << 3)) % sizeof (shift)) + +/* Fast memmem algorithm with guaranteed linear-time performance. + Small needles up to size 2 use a dedicated linear search. Longer needles + up to size 256 use a novel modified Horspool algorithm. It hashes pairs + of characters to quickly skip past mismatches. The main search loop only + exits if the last 2 characters match, avoiding unnecessary calls to memcmp + and allowing for a larger skip if there is no match. A self-adapting + filtering check is used to quickly detect mismatches in long needles. + By limiting the needle length to 256, the shift table can be reduced to 8 + bits per entry, lowering preprocessing overhead and minimizing cache effects. + The limit also implies worst-case performance is linear. + Needles larger than 256 characters use the linear-time Two-Way algorithm. */ +void * +memmem (const void *haystack, size_t hs_len, const void *needle, size_t ne_len) +{ + const unsigned char *hs = haystack; + const unsigned char *ne = needle; + + if (ne_len == 0) + return (void *) hs; + if (ne_len == 1) + return (void *) memchr (hs, ne[0], hs_len); + + /* Ensure haystack length is >= needle length. */ + if (hs_len < ne_len) + return NULL; + + const unsigned char *end = hs + hs_len - ne_len; + + if (ne_len == 2) + { + uint32_t nw = ne[0] << 16 | ne[1], hw = hs[0] << 16 | hs[1]; + for (hs++; hs <= end && hw != nw; ) + hw = hw << 16 | *++hs; + return hw == nw ? (void *)(hs - 1) : NULL; + } + + /* Use Two-Way algorithm for very long needles. */ + if (__builtin_expect (ne_len > 256, 0)) + return two_way_long_needle (hs, hs_len, ne, ne_len); + + uint8_t shift[256]; + size_t tmp, shift1; + size_t m1 = ne_len - 1; + size_t offset = 0; + int i; + + /* Initialize bad character shift hash table. */ + memset (shift, 0, sizeof (shift)); + for (i = 1; i < m1; i++) + shift[hash2 (ne + i)] = i; + shift1 = m1 - shift[hash2 (ne + m1)]; + shift[hash2 (ne + m1)] = m1; + + for ( ; hs <= end; ) + { + /* Skip past character pairs not in the needle. */ + do + { + hs += m1; + tmp = shift[hash2 (hs)]; + } + while (hs <= end && tmp == 0); + + /* If the match is not at the end of the needle, shift to the end + and continue until we match the last 2 characters. */ + hs -= tmp; + if (tmp < m1) + continue; + + /* The last 2 characters match. If the needle is long, check a + fixed number of characters first to quickly filter out mismatches. */ + if (m1 <= 15 || memcmp (hs + offset, ne + offset, sizeof (long)) == 0) + { + if (memcmp (hs, ne, m1) == 0) + return (void *) hs; + + /* Adjust filter offset when it doesn't find the mismatch. */ + offset = (offset >= sizeof (long) ? offset : m1) - sizeof (long); + } + + /* Skip based on matching the last 2 characters. */ + hs += shift1; + } + return NULL; +} +#endif /* Compilation for speed. */ diff --git a/lib/string/memmove.c b/lib/string/memmove.c new file mode 100644 index 0000000..da5dfdb --- /dev/null +++ b/lib/string/memmove.c @@ -0,0 +1,136 @@ +/* +FUNCTION + <>---move possibly overlapping memory + +INDEX + memmove + +SYNOPSIS + #include + void *memmove(void *<[dst]>, const void *<[src]>, size_t <[length]>); + +DESCRIPTION + This function moves <[length]> characters from the block of + memory starting at <<*<[src]>>> to the memory starting at + <<*<[dst]>>>. <> reproduces the characters correctly + at <<*<[dst]>>> even if the two areas overlap. + + +RETURNS + The function returns <[dst]> as passed. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + memmove ansi pure +*/ + +#include +#include <_ansi.h> +#include +#include +#include "local.h" + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the 4X unrolled loop. */ +#define BIGBLOCKSIZE (sizeof (long) << 2) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LITTLEBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) + +/*SUPPRESS 20*/ +void * +__inhibit_loop_to_libcall +memmove (void *dst_void, + const void *src_void, + size_t length) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *dst = dst_void; + const char *src = src_void; + + if (src < dst && dst < src + length) + { + /* Have to copy backwards */ + src += length; + dst += length; + while (length--) + { + *--dst = *--src; + } + } + else + { + while (length--) + { + *dst++ = *src++; + } + } + + return dst_void; +#else + char *dst = dst_void; + const char *src = src_void; + long *aligned_dst; + const long *aligned_src; + + if (src < dst && dst < src + length) + { + /* Destructive overlap...have to copy backwards */ + src += length; + dst += length; + while (length--) + { + *--dst = *--src; + } + } + else + { + /* Use optimizing algorithm for a non-destructive copy to closely + match memcpy. If the size is small or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL(length) && !UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* Copy 4X long words at a time if possible. */ + while (length >= BIGBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + length -= BIGBLOCKSIZE; + } + + /* Copy one long word at a time if possible. */ + while (length >= LITTLEBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + length -= LITTLEBLOCKSIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (length--) + { + *dst++ = *src++; + } + } + + return dst_void; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/mempcpy.c b/lib/string/mempcpy.c new file mode 100644 index 0000000..1291656 --- /dev/null +++ b/lib/string/mempcpy.c @@ -0,0 +1,100 @@ +/* +FUNCTION + <>---copy memory regions and return end pointer + +SYNOPSIS + #include + void* mempcpy(void *<[out]>, const void *<[in]>, size_t <[n]>); + +DESCRIPTION + This function copies <[n]> bytes from the memory region + pointed to by <[in]> to the memory region pointed to by + <[out]>. + + If the regions overlap, the behavior is undefined. + +RETURNS + <> returns a pointer to the byte following the + last byte copied to the <[out]> region. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. + + */ + +#include <_ansi.h> +#include +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* How many bytes are copied each iteration of the 4X unrolled loop. */ +#define BIGBLOCKSIZE (sizeof (long) << 2) + +/* How many bytes are copied each iteration of the word copy loop. */ +#define LITTLEBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the byte copier. */ +#define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) + +void * +mempcpy (void *dst0, + const void *src0, + size_t len0) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *dst = (char *) dst0; + char *src = (char *) src0; + + while (len0--) + { + *dst++ = *src++; + } + + return dst; +#else + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + + /* If the size is small, or either SRC or DST is unaligned, + then punt into the byte copy loop. This should be rare. */ + if (!TOO_SMALL(len0) && !UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* Copy 4X long words at a time if possible. */ + while (len0 >= BIGBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + *aligned_dst++ = *aligned_src++; + len0 -= BIGBLOCKSIZE; + } + + /* Copy one long word at a time if possible. */ + while (len0 >= LITTLEBLOCKSIZE) + { + *aligned_dst++ = *aligned_src++; + len0 -= LITTLEBLOCKSIZE; + } + + /* Pick up any residual with a byte copier. */ + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (len0--) + *dst++ = *src++; + + return dst; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/memrchr.c b/lib/string/memrchr.c new file mode 100644 index 0000000..652efb3 --- /dev/null +++ b/lib/string/memrchr.c @@ -0,0 +1,126 @@ +/* +FUNCTION + <>---reverse search for character in memory + +INDEX + memrchr + +SYNOPSIS + #include + void *memrchr(const void *<[src]>, int <[c]>, size_t <[length]>); + +DESCRIPTION + This function searches memory starting at <[length]> bytes + beyond <<*<[src]>>> backwards for the character <[c]>. + The search only ends with the first occurrence of <[c]>; in + particular, <> does not terminate the search. + +RETURNS + If the character <[c]> is found within <[length]> characters + of <<*<[src]>>>, a pointer to the character is returned. If + <[c]> is not found, then <> is returned. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. + +QUICKREF + memrchr +*/ + +#include <_ansi.h> +#include +#include + +/* Nonzero if X is not aligned on a "long" boundary. */ +#define UNALIGNED(X) ((long)(X + 1) & (sizeof (long) - 1)) + +/* How many bytes are loaded each iteration of the word copy loop. */ +#define LBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the bytewise iterator. */ +#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +/* DETECTCHAR returns nonzero if (long)X contains the byte used + to fill (long)MASK. */ +#define DETECTCHAR(X,MASK) (DETECTNULL(X ^ MASK)) + +void * +memrchr (const void *src_void, + int c, + size_t length) +{ + const unsigned char *src = (const unsigned char *) src_void + length - 1; + unsigned char d = c; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + unsigned long *asrc; + unsigned long mask; + unsigned int i; + + while (UNALIGNED (src)) + { + if (!length--) + return NULL; + if (*src == d) + return (void *) src; + src--; + } + + if (!TOO_SMALL (length)) + { + /* If we get this far, we know that length is large and src is + word-aligned. */ + /* The fast code reads the source one word at a time and only + performs the bytewise search on word-sized segments if they + contain the search character, which is detected by XORing + the word-sized segment with a word-sized block of the search + character and then detecting for the presence of NUL in the + result. */ + asrc = (unsigned long *) (src - LBLOCKSIZE + 1); + mask = d << 8 | d; + mask = mask << 16 | mask; + for (i = 32; i < LBLOCKSIZE * 8; i <<= 1) + mask = (mask << i) | mask; + + while (length >= LBLOCKSIZE) + { + if (DETECTCHAR (*asrc, mask)) + break; + length -= LBLOCKSIZE; + asrc--; + } + + /* If there are fewer than LBLOCKSIZE characters left, + then we resort to the bytewise loop. */ + + src = (unsigned char *) asrc + LBLOCKSIZE - 1; + } + +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (length--) + { + if (*src == d) + return (void *) src; + src--; + } + + return NULL; +} diff --git a/lib/string/memset.c b/lib/string/memset.c new file mode 100644 index 0000000..e8e667a --- /dev/null +++ b/lib/string/memset.c @@ -0,0 +1,96 @@ +/* +FUNCTION + <>---set an area of memory + +INDEX + memset + +SYNOPSIS + #include + void *memset(void *<[dst]>, int <[c]>, size_t <[length]>); + +DESCRIPTION + This function converts the argument <[c]> into an unsigned + char and fills the first <[length]> characters of the array + pointed to by <[dst]> to the value. + +RETURNS + <> returns the value of <[dst]>. + +PORTABILITY +<> is ANSI C. + + <> requires no supporting OS subroutines. + +QUICKREF + memset ansi pure +*/ + +#include +#include "local.h" + +#define LBLOCKSIZE (sizeof(long)) +#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) +#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE) + +void * +__inhibit_loop_to_libcall +memset (void *m, + int c, + size_t n) +{ + char *s = (char *) m; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + unsigned int i; + unsigned long buffer; + unsigned long *aligned_addr; + unsigned int d = c & 0xff; /* To avoid sign extension, copy C to an + unsigned variable. */ + + while (UNALIGNED (s)) + { + if (n--) + *s++ = (char) c; + else + return m; + } + + if (!TOO_SMALL (n)) + { + /* If we get this far, we know that n is large and s is word-aligned. */ + aligned_addr = (unsigned long *) s; + + /* Store D into each char sized location in BUFFER so that + we can set large blocks quickly. */ + buffer = (d << 8) | d; + buffer |= (buffer << 16); + for (i = 32; i < LBLOCKSIZE * 8; i <<= 1) + buffer = (buffer << i) | buffer; + + /* Unroll the loop. */ + while (n >= LBLOCKSIZE*4) + { + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + *aligned_addr++ = buffer; + n -= 4*LBLOCKSIZE; + } + + while (n >= LBLOCKSIZE) + { + *aligned_addr++ = buffer; + n -= LBLOCKSIZE; + } + /* Pick up the remainder with a bytewise loop. */ + s = (char*)aligned_addr; + } + +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (n--) + *s++ = (char) c; + + return m; +} diff --git a/lib/string/mkunidata b/lib/string/mkunidata new file mode 100644 index 0000000..7b6135f --- /dev/null +++ b/lib/string/mkunidata @@ -0,0 +1,73 @@ +#! /bin/sh + +echo Generating Unicode width data for newlib/libc/string/wcwidth.c + +cd `dirname $0` +PATH="$PATH":. # ensure access to uniset tool + +############################################################################# +# checks and (with option -u) downloads + +case "$1" in +-h) echo "Usage: $0 [-h|-u|-i]" + echo "Generate width data tables ambiguous.t, combining.t, wide.t" + echo "from local Unicode files UnicodeData.txt, Blocks.txt, EastAsianWidth.txt." + echo "" + echo "Options:" + echo " -u download files from unicode.org first, download uniset tool" + echo " -i copy files from /usr/share/unicode/ucd first" + echo " -h show this" + exit + ;; +-u) + wget () { + ref=`basename $1` + ref=`ls "$ref" 2> /dev/null || echo 01-Jan-1970` + curl -R -O --connect-timeout 55 -z "$ref" "$1" + } + + echo downloading uniset tool + wget https://www.cl.cam.ac.uk/~mgk25/download/uniset.tar.gz + gzip -dc uniset.tar.gz | tar xvf - uniset + + echo downloading data from unicode.org + for data in UnicodeData.txt Blocks.txt EastAsianWidth.txt + do wget http://unicode.org/Public/UNIDATA/$data + done + ;; +-i) + echo copying data from /usr/share/unicode/ucd + for data in UnicodeData.txt Blocks.txt EastAsianWidth.txt + do cp /usr/share/unicode/ucd/$data . + done + ;; +esac + +echo checking uniset tool +type uniset || exit 9 + +echo checking Unicode data files +for data in UnicodeData.txt Blocks.txt EastAsianWidth.txt +do if [ -r $data ] + then true + else echo $data not available, skipping table generation + exit + fi +done + +echo generating from Unicode version `sed -e 's,[^.0-9],,g' -e 1q Blocks.txt` + +############################################################################# +# table generation + +echo generating combining characters table +uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B +D7B0-D7C6 +D7CB-D7FB c > combining.t + +echo generating ambiguous width characters table +sh ./mkwidthA && uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c > ambiguous.t + +echo generating wide characters table +sh ./mkwide + +############################################################################# +# end diff --git a/lib/string/mkwide b/lib/string/mkwide new file mode 100644 index 0000000..55a0bab --- /dev/null +++ b/lib/string/mkwide @@ -0,0 +1,49 @@ +#! /bin/sh + +# generate list of wide characters, with convex closure + +skipcheck=false + +if [ ! -r EastAsianWidth.txt ] +then ln -s /usr/share/unicode/ucd/EastAsianWidth.txt . || exit 1 +fi +if [ ! -r UnicodeData.txt ] +then ln -s /usr/share/unicode/ucd/UnicodeData.txt . || exit 1 +fi +if [ ! -r Blocks.txt ] +then ln -s /usr/share/unicode/ucd/Blocks.txt . || exit 1 +fi + +sed -e "s,^\([^;]*\);[NAH],\1," -e t -e d EastAsianWidth.txt > wide.na +sed -e "s,^\([^;]*\);[WF],\1," -e t -e d EastAsianWidth.txt > wide.fw + +PATH="$PATH:." # for uniset + +nrfw=`uniset +wide.fw nr | sed -e 's,.*:,,'` +echo FW $nrfw +nrna=`uniset +wide.na nr | sed -e 's,.*:,,'` +echo NAH $nrna + +extrablocks="2E80-303E" + +# check all blocks +includes () { + nr=`uniset +wide.$2 -$1 nr | sed -e 's,.*:,,'` + test $nr != $3 +} +echo "adding compact closure of wide ranges, this may take ~10min" +for b in $extrablocks `sed -e 's,^\([0-9A-F]*\)\.\.\([0-9A-F]*\).*,\1-\2,' -e t -e d Blocks.txt` +do range=$b + echo checking $range $* >&2 + if includes $range fw $nrfw && ! includes $range na $nrna + then echo $range + fi +done > wide.blocks + +( +sed -e "s,^,//," -e 1q EastAsianWidth.txt +sed -e "s,^,//," -e 1q Blocks.txt +uniset `sed -e 's,^,+,' wide.blocks` +wide.fw c +) > wide.t + +rm -f wide.na wide.fw wide.blocks diff --git a/lib/string/mkwidthA b/lib/string/mkwidthA new file mode 100644 index 0000000..343ab40 --- /dev/null +++ b/lib/string/mkwidthA @@ -0,0 +1,20 @@ +#! /bin/sh + +# generate WIDTH-A file, listing Unicode characters with width property +# Ambiguous, from EastAsianWidth.txt + +if [ ! -r EastAsianWidth.txt ] +then ln -s /usr/share/unicode/ucd/EastAsianWidth.txt . || exit 1 +fi +if [ ! -r UnicodeData.txt ] +then ln -s /usr/share/unicode/ucd/UnicodeData.txt . || exit 1 +fi +if [ ! -r Blocks.txt ] +then ln -s /usr/share/unicode/ucd/Blocks.txt . || exit 1 +fi + +sed -e "s,^\([^;]*\);A,\1," -e t -e d EastAsianWidth.txt > width-a-new +rm -f WIDTH-A +echo "# UAX #11: East Asian Ambiguous" > WIDTH-A +PATH="$PATH:." uniset +width-a-new compact >> WIDTH-A +rm -f width-a-new diff --git a/lib/string/rawmemchr.c b/lib/string/rawmemchr.c new file mode 100644 index 0000000..56e2b5e --- /dev/null +++ b/lib/string/rawmemchr.c @@ -0,0 +1,114 @@ +/* +FUNCTION + <>---find character in memory + +INDEX + rawmemchr + +SYNOPSIS + #include + void *rawmemchr(const void *<[src]>, int <[c]>); + +DESCRIPTION + This function searches memory starting at <<*<[src]>>> for the + character <[c]>. The search only ends with the first occurrence + of <[c]>; in particular, <> does not terminate the search. + No bounds checking is performed, so this function should only + be used when it is certain that the character <[c]> will be found. + +RETURNS + A pointer to the first occurance of character <[c]>. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. + +QUICKREF + rawmemchr +*/ + +#include <_ansi.h> +#include +#include + +/* Nonzero if X is not aligned on a "long" boundary. */ +#define UNALIGNED(X) ((long)X & (sizeof (long) - 1)) + +/* How many bytes are loaded each iteration of the word copy loop. */ +#define LBLOCKSIZE (sizeof (long)) + +/* Threshhold for punting to the bytewise iterator. */ +#define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +/* DETECTCHAR returns nonzero if (long)X contains the byte used + to fill (long)MASK. */ +#define DETECTCHAR(X,MASK) (DETECTNULL(X ^ MASK)) + +void * +rawmemchr (const void *src_void, + int c) +{ + const unsigned char *src = (const unsigned char *) src_void; + unsigned char d = c; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + unsigned long *asrc; + unsigned long mask; + unsigned int i; + + while (UNALIGNED (src)) + { + if (*src == d) + return (void *) src; + src++; + } + + /* If we get this far, we know that src is word-aligned. */ + /* The fast code reads the source one word at a time and only + performs the bytewise search on word-sized segments if they + contain the search character, which is detected by XORing + the word-sized segment with a word-sized block of the search + character and then detecting for the presence of NUL in the + result. */ + asrc = (unsigned long *) src; + mask = d << 8 | d; + mask = mask << 16 | mask; + for (i = 32; i < LBLOCKSIZE * 8; i <<= 1) + mask = (mask << i) | mask; + + while (1) + { + if (DETECTCHAR (*asrc, mask)) + break; + asrc++; + } + + /* We have the matching word, now we resort to a bytewise loop. */ + + src = (unsigned char *) asrc; + +#endif /* !PREFER_SIZE_OVER_SPEED && !__OPTIMIZE_SIZE__ */ + + while (1) + { + if (*src == d) + return (void *) src; + src++; + } +} diff --git a/lib/string/rindex.c b/lib/string/rindex.c new file mode 100644 index 0000000..39e5aa2 --- /dev/null +++ b/lib/string/rindex.c @@ -0,0 +1,38 @@ +/* +FUNCTION + <>---reverse search for character in string + +INDEX + rindex + +SYNOPSIS + #include + char * rindex(const char *<[string]>, int <[c]>); + +DESCRIPTION + This function finds the last occurence of <[c]> (converted to + a char) in the string pointed to by <[string]> (including the + terminating null character). + + This function is identical to <>. + +RETURNS + Returns a pointer to the located character, or a null pointer + if <[c]> does not occur in <[string]>. + +PORTABILITY +<> requires no supporting OS subroutines. + +QUICKREF + rindex - pure +*/ + +#include +#include + +char * +rindex (const char *s, + int c) +{ + return strrchr (s, c); +} diff --git a/lib/string/stpcpy.c b/lib/string/stpcpy.c new file mode 100644 index 0000000..4e2ae9f --- /dev/null +++ b/lib/string/stpcpy.c @@ -0,0 +1,84 @@ +/* +FUNCTION + <>---copy string returning a pointer to its end + +INDEX + stpcpy + +SYNOPSIS + #include + char *stpcpy(char *restrict <[dst]>, const char *restrict <[src]>); + +DESCRIPTION + <> copies the string pointed to by <[src]> + (including the terminating null character) to the array + pointed to by <[dst]>. + +RETURNS + This function returns a pointer to the end of the destination string, + thus pointing to the trailing '\0'. + +PORTABILITY +<> is a GNU extension, candidate for inclusion into POSIX/SUSv4. + +<> requires no supporting OS subroutines. + +QUICKREF + stpcpy gnu +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +char* +stpcpy (char *__restrict dst, + const char *__restrict src) +{ +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + long *aligned_dst; + const long *aligned_src; + + /* If SRC or DEST is unaligned, then copy bytes. */ + if (!UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (!DETECTNULL(*aligned_src)) + { + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while ((*dst++ = *src++)) + ; + return --dst; +} diff --git a/lib/string/stpncpy.c b/lib/string/stpncpy.c new file mode 100644 index 0000000..87fe268 --- /dev/null +++ b/lib/string/stpncpy.c @@ -0,0 +1,107 @@ +/* +FUNCTION + <>---counted copy string returning a pointer to its end + +INDEX + stpncpy + +SYNOPSIS + #include + char *stpncpy(char *restrict <[dst]>, const char *restrict <[src]>, + size_t <[length]>); + +DESCRIPTION + <> copies not more than <[length]> characters from the + the string pointed to by <[src]> (including the terminating + null character) to the array pointed to by <[dst]>. If the + string pointed to by <[src]> is shorter than <[length]> + characters, null characters are appended to the destination + array until a total of <[length]> characters have been + written. + +RETURNS + This function returns a pointer to the end of the destination string, + thus pointing to the trailing '\0', or, if the destination string is + not null-terminated, pointing to dst + n. + +PORTABILITY +<> is a GNU extension, candidate for inclusion into POSIX/SUSv4. + +<> requires no supporting OS subroutines. + +QUICKREF + stpncpy gnu +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +#define TOO_SMALL(LEN) ((LEN) < sizeof (long)) + +char * +stpncpy (char *__restrict dst, + const char *__restrict src, + size_t count) +{ + char *ret = NULL; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + long *aligned_dst; + const long *aligned_src; + + /* If SRC and DEST is aligned and count large enough, then copy words. */ + if (!UNALIGNED (src, dst) && !TOO_SMALL (count)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (count >= sizeof (long int) && !DETECTNULL(*aligned_src)) + { + count -= sizeof (long int); + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (count > 0) + { + --count; + if ((*dst++ = *src++) == '\0') + { + ret = dst - 1; + break; + } + } + + while (count-- > 0) + *dst++ = '\0'; + + return ret ? ret : dst; +} diff --git a/lib/string/str-two-way.h b/lib/string/str-two-way.h new file mode 100644 index 0000000..e13f949 --- /dev/null +++ b/lib/string/str-two-way.h @@ -0,0 +1,416 @@ +/* Byte-wise substring search, using the Two-Way algorithm. + * Copyright (C) 2008, 2010 Eric Blake + * Permission to use, copy, modify, and distribute this software + * is freely granted, provided that this notice is preserved. + */ + + +/* Before including this file, you need to include , and define: + RESULT_TYPE A macro that expands to the return type. + AVAILABLE(h, h_l, j, n_l) A macro that returns nonzero if there are + at least N_L bytes left starting at + H[J]. H is 'unsigned char *', H_L, J, + and N_L are 'size_t'; H_L is an + lvalue. For NUL-terminated searches, + H_L can be modified each iteration to + avoid having to compute the end of H + up front. + + For case-insensitivity, you may optionally define: + CMP_FUNC(p1, p2, l) A macro that returns 0 iff the first L + characters of P1 and P2 are equal. + CANON_ELEMENT(c) A macro that canonicalizes an element + right after it has been fetched from + one of the two strings. The argument + is an 'unsigned char'; the result must + be an 'unsigned char' as well. + + This file undefines the macros documented above, and defines + LONG_NEEDLE_THRESHOLD. +*/ + +#include +#include +#include <_ansi.h> + +/* We use the Two-Way string matching algorithm, which guarantees + linear complexity with constant space. Additionally, for long + needles, we also use a bad character shift table similar to the + Boyer-Moore algorithm to achieve improved (potentially sub-linear) + performance. + + See http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260 + and http://en.wikipedia.org/wiki/Boyer-Moore_string_search_algorithm +*/ + +/* Point at which computing a bad-byte shift table is likely to be + worthwhile. Small needles should not compute a table, since it + adds (1 << CHAR_BIT) + NEEDLE_LEN computations of preparation for a + speedup no greater than a factor of NEEDLE_LEN. The larger the + needle, the better the potential performance gain. On the other + hand, on non-POSIX systems with CHAR_BIT larger than eight, the + memory required for the table is prohibitive. */ +#if CHAR_BIT < 10 +# define LONG_NEEDLE_THRESHOLD 32U +#else +# define LONG_NEEDLE_THRESHOLD SIZE_MAX +#endif + +#define MAX(a, b) ((a < b) ? (b) : (a)) + +#ifndef CANON_ELEMENT +# define CANON_ELEMENT(c) c +#endif +#ifndef CMP_FUNC +# define CMP_FUNC memcmp +#endif + +/* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN. + Return the index of the first byte in the right half, and set + *PERIOD to the global period of the right half. + + The global period of a string is the smallest index (possibly its + length) at which all remaining bytes in the string are repetitions + of the prefix (the last repetition may be a subset of the prefix). + + When NEEDLE is factored into two halves, a local period is the + length of the smallest word that shares a suffix with the left half + and shares a prefix with the right half. All factorizations of a + non-empty NEEDLE have a local period of at least 1 and no greater + than NEEDLE_LEN. + + A critical factorization has the property that the local period + equals the global period. All strings have at least one critical + factorization with the left half smaller than the global period. + + Given an ordered alphabet, a critical factorization can be computed + in linear time, with 2 * NEEDLE_LEN comparisons, by computing the + larger of two ordered maximal suffixes. The ordered maximal + suffixes are determined by lexicographic comparison of + periodicity. */ +static size_t +critical_factorization (const unsigned char *needle, size_t needle_len, + size_t *period) +{ + /* Index of last byte of left half, or SIZE_MAX. */ + size_t max_suffix, max_suffix_rev; + size_t j; /* Index into NEEDLE for current candidate suffix. */ + size_t k; /* Offset into current period. */ + size_t p; /* Intermediate period. */ + unsigned char a, b; /* Current comparison bytes. */ + + /* Invariants: + 0 <= j < NEEDLE_LEN - 1 + -1 <= max_suffix{,_rev} < j (treating SIZE_MAX as if it were signed) + min(max_suffix, max_suffix_rev) < global period of NEEDLE + 1 <= p <= global period of NEEDLE + p == global period of the substring NEEDLE[max_suffix{,_rev}+1...j] + 1 <= k <= p + */ + + /* Perform lexicographic search. */ + max_suffix = SIZE_MAX; + j = 0; + k = p = 1; + while (j + k < needle_len) + { + a = CANON_ELEMENT (needle[j + k]); + b = CANON_ELEMENT (needle[(size_t)(max_suffix + k)]); + if (a < b) + { + /* Suffix is smaller, period is entire prefix so far. */ + j += k; + k = 1; + p = j - max_suffix; + } + else if (a == b) + { + /* Advance through repetition of the current period. */ + if (k != p) + ++k; + else + { + j += p; + k = 1; + } + } + else /* b < a */ + { + /* Suffix is larger, start over from current location. */ + max_suffix = j++; + k = p = 1; + } + } + *period = p; + + /* Perform reverse lexicographic search. */ + max_suffix_rev = SIZE_MAX; + j = 0; + k = p = 1; + while (j + k < needle_len) + { + a = CANON_ELEMENT (needle[j + k]); + b = CANON_ELEMENT (needle[max_suffix_rev + k]); + if (b < a) + { + /* Suffix is smaller, period is entire prefix so far. */ + j += k; + k = 1; + p = j - max_suffix_rev; + } + else if (a == b) + { + /* Advance through repetition of the current period. */ + if (k != p) + ++k; + else + { + j += p; + k = 1; + } + } + else /* a < b */ + { + /* Suffix is larger, start over from current location. */ + max_suffix_rev = j++; + k = p = 1; + } + } + + /* Choose the longer suffix. Return the first byte of the right + half, rather than the last byte of the left half. */ + if (max_suffix_rev + 1 < max_suffix + 1) + return max_suffix + 1; + *period = p; + return max_suffix_rev + 1; +} + +/* Return the first location of non-empty NEEDLE within HAYSTACK, or + NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This + method is optimized for NEEDLE_LEN < LONG_NEEDLE_THRESHOLD. + Performance is guaranteed to be linear, with an initialization cost + of 2 * NEEDLE_LEN comparisons. + + If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at + most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. + If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * + HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching. */ +static RETURN_TYPE __attribute__ ((__used__)) +two_way_short_needle (const unsigned char *haystack, size_t haystack_len, + const unsigned char *needle, size_t needle_len) +{ + size_t i; /* Index into current byte of NEEDLE. */ + size_t j; /* Index into current window of HAYSTACK. */ + size_t period; /* The period of the right half of needle. */ + size_t suffix; /* The index of the right half of needle. */ + + /* Factor the needle into two halves, such that the left half is + smaller than the global period, and the right half is + periodic (with a period as large as NEEDLE_LEN - suffix). */ + suffix = critical_factorization (needle, needle_len, &period); + + /* Perform the search. Each iteration compares the right half + first. */ + if (CMP_FUNC (needle, needle + period, suffix) == 0) + { + /* Entire needle is periodic; a mismatch can only advance by the + period, so use memory to avoid rescanning known occurrences + of the period. */ + size_t memory = 0; + j = 0; + while (AVAILABLE (haystack, haystack_len, j, needle_len)) + { + /* Scan for matches in right half. */ + i = MAX (suffix, memory); + while (i < needle_len && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + ++i; + if (needle_len <= i) + { + /* Scan for matches in left half. */ + i = suffix - 1; + while (memory < i + 1 && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + --i; + if (i + 1 < memory + 1) + return (RETURN_TYPE) (haystack + j); + /* No match, so remember how many repetitions of period + on the right half were scanned. */ + j += period; + memory = needle_len - period; + } + else + { + j += i - suffix + 1; + memory = 0; + } + } + } + else + { + /* The two halves of needle are distinct; no extra memory is + required, and any mismatch results in a maximal shift. */ + period = MAX (suffix, needle_len - suffix) + 1; + j = 0; + while (AVAILABLE (haystack, haystack_len, j, needle_len)) + { + /* Scan for matches in right half. */ + i = suffix; + while (i < needle_len && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + ++i; + if (needle_len <= i) + { + /* Scan for matches in left half. */ + i = suffix - 1; + while (i != SIZE_MAX && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + --i; + if (i == SIZE_MAX) + return (RETURN_TYPE) (haystack + j); + j += period; + } + else + j += i - suffix + 1; + } + } + return NULL; +} + +/* Return the first location of non-empty NEEDLE within HAYSTACK, or + NULL. HAYSTACK_LEN is the minimum known length of HAYSTACK. This + method is optimized for LONG_NEEDLE_THRESHOLD <= NEEDLE_LEN. + Performance is guaranteed to be linear, with an initialization cost + of 3 * NEEDLE_LEN + (1 << CHAR_BIT) operations. + + If AVAILABLE does not modify HAYSTACK_LEN (as in memmem), then at + most 2 * HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, + and sublinear performance O(HAYSTACK_LEN / NEEDLE_LEN) is possible. + If AVAILABLE modifies HAYSTACK_LEN (as in strstr), then at most 3 * + HAYSTACK_LEN - NEEDLE_LEN comparisons occur in searching, and + sublinear performance is not possible. */ +_NOINLINE_STATIC RETURN_TYPE __attribute__ ((__used__)) +two_way_long_needle (const unsigned char *haystack, size_t haystack_len, + const unsigned char *needle, size_t needle_len) +{ + size_t i; /* Index into current byte of NEEDLE. */ + size_t j; /* Index into current window of HAYSTACK. */ + size_t period; /* The period of the right half of needle. */ + size_t suffix; /* The index of the right half of needle. */ + size_t shift_table[1U << CHAR_BIT]; /* See below. */ + + /* Factor the needle into two halves, such that the left half is + smaller than the global period, and the right half is + periodic (with a period as large as NEEDLE_LEN - suffix). */ + suffix = critical_factorization (needle, needle_len, &period); + + /* Populate shift_table. For each possible byte value c, + shift_table[c] is the distance from the last occurrence of c to + the end of NEEDLE, or NEEDLE_LEN if c is absent from the NEEDLE. + shift_table[NEEDLE[NEEDLE_LEN - 1]] contains the only 0. */ + for (i = 0; i < 1U << CHAR_BIT; i++) + shift_table[i] = needle_len; + for (i = 0; i < needle_len; i++) + shift_table[CANON_ELEMENT (needle[i])] = needle_len - i - 1; + + /* Perform the search. Each iteration compares the right half + first. */ + if (CMP_FUNC (needle, needle + period, suffix) == 0) + { + /* Entire needle is periodic; a mismatch can only advance by the + period, so use memory to avoid rescanning known occurrences + of the period. */ + size_t memory = 0; + size_t shift; + j = 0; + while (AVAILABLE (haystack, haystack_len, j, needle_len)) + { + /* Check the last byte first; if it does not match, then + shift to the next possible match location. */ + shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; + if (0 < shift) + { + if (memory && shift < period) + { + /* Since needle is periodic, but the last period has + a byte out of place, there can be no match until + after the mismatch. */ + shift = needle_len - period; + } + memory = 0; + j += shift; + continue; + } + /* Scan for matches in right half. The last byte has + already been matched, by virtue of the shift table. */ + i = MAX (suffix, memory); + while (i < needle_len - 1 && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + ++i; + if (needle_len - 1 <= i) + { + /* Scan for matches in left half. */ + i = suffix - 1; + while (memory < i + 1 && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + --i; + if (i + 1 < memory + 1) + return (RETURN_TYPE) (haystack + j); + /* No match, so remember how many repetitions of period + on the right half were scanned. */ + j += period; + memory = needle_len - period; + } + else + { + j += i - suffix + 1; + memory = 0; + } + } + } + else + { + /* The two halves of needle are distinct; no extra memory is + required, and any mismatch results in a maximal shift. */ + size_t shift; + period = MAX (suffix, needle_len - suffix) + 1; + j = 0; + while (AVAILABLE (haystack, haystack_len, j, needle_len)) + { + /* Check the last byte first; if it does not match, then + shift to the next possible match location. */ + shift = shift_table[CANON_ELEMENT (haystack[j + needle_len - 1])]; + if (0 < shift) + { + j += shift; + continue; + } + /* Scan for matches in right half. The last byte has + already been matched, by virtue of the shift table. */ + i = suffix; + while (i < needle_len - 1 && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + ++i; + if (needle_len - 1 <= i) + { + /* Scan for matches in left half. */ + i = suffix - 1; + while (i != SIZE_MAX && (CANON_ELEMENT (needle[i]) + == CANON_ELEMENT (haystack[i + j]))) + --i; + if (i == SIZE_MAX) + return (RETURN_TYPE) (haystack + j); + j += period; + } + else + j += i - suffix + 1; + } + } + return NULL; +} + +#undef AVAILABLE +#undef CANON_ELEMENT +#undef CMP_FUNC +#undef MAX +#undef RETURN_TYPE diff --git a/lib/string/strcasecmp.c b/lib/string/strcasecmp.c new file mode 100644 index 0000000..c75a3e2 --- /dev/null +++ b/lib/string/strcasecmp.c @@ -0,0 +1,51 @@ +/* +FUNCTION + <>---case-insensitive character string compare + +INDEX + strcasecmp + +SYNOPSIS + #include + int strcasecmp(const char *<[a]>, const char *<[b]>); + +DESCRIPTION + <> compares the string at <[a]> to + the string at <[b]> in a case-insensitive manner. + +RETURNS + + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>> (after + both are converted to lowercase), <> returns a + number greater than zero. If the two strings match, + <> returns zero. If <<*<[a]>>> sorts + lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is in the Berkeley Software Distribution. + +<> requires no supporting OS subroutines. It uses +tolower() from elsewhere in this library. + +QUICKREF + strcasecmp +*/ + +#include +#include + +int +strcasecmp (const char *s1, + const char *s2) +{ + int d = 0; + for ( ; ; ) + { + const int c1 = tolower(*s1++); + const int c2 = tolower(*s2++); + if (((d = c1 - c2) != 0) || (c2 == '\0')) + break; + } + return d; +} diff --git a/lib/string/strcasecmp_l.c b/lib/string/strcasecmp_l.c new file mode 100644 index 0000000..587f56e --- /dev/null +++ b/lib/string/strcasecmp_l.c @@ -0,0 +1,54 @@ +/* +FUNCTION + <>---case-insensitive character string compare + +INDEX + strcasecmp_l + +SYNOPSIS + #include + int strcasecmp_l(const char *<[a]>, const char *<[b]>, + locale_t <[locale]>); + +DESCRIPTION + <> compares the string at <[a]> to + the string at <[b]> in a case-insensitive manner. + + if <[locale]> is LC_GLOBAL_LOCALE or not a valid locale object, the + behaviour is undefined. + +RETURNS + + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>> (after + both are converted to lowercase), <> returns a + number greater than zero. If the two strings match, + <> returns zero. If <<*<[a]>>> sorts + lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is POSIX-1.2008. + +<> requires no supporting OS subroutines. It uses +tolower_l() from elsewhere in this library. + +QUICKREF + strcasecmp_l +*/ + +#include +#include + +int +strcasecmp_l (const char *s1, const char *s2, struct __locale_t *locale) +{ + int d = 0; + for ( ; ; ) + { + const int c1 = tolower_l (*s1++, locale); + const int c2 = tolower_l (*s2++, locale); + if (((d = c1 - c2) != 0) || (c2 == '\0')) + break; + } + return d; +} diff --git a/lib/string/strcasestr.c b/lib/string/strcasestr.c new file mode 100644 index 0000000..36e1839 --- /dev/null +++ b/lib/string/strcasestr.c @@ -0,0 +1,146 @@ +/* +FUNCTION + <>---case-insensitive character string search + +INDEX + strcasestr + +SYNOPSIS + #include + char *strcasestr(const char *<[s]>, const char *<[find]>); + +DESCRIPTION + <> searchs the string <[s]> for + the first occurrence of the sequence <[find]>. <> + is identical to <> except the search is + case-insensitive. + +RETURNS + + A pointer to the first case-insensitive occurrence of the sequence + <[find]> or <> if no match was found. + +PORTABILITY +<> is in the Berkeley Software Distribution. + +<> requires no supporting OS subroutines. It uses +tolower() from elsewhere in this library. + +QUICKREF + strcasestr +*/ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * The quadratic code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* Linear algorithm Copyright (C) 2008 Eric Blake + * Permission to use, copy, modify, and distribute the linear portion of + * software is freely granted, provided that this notice is preserved. + */ + +#include + +#include +#include +#include + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) +# define RETURN_TYPE char * +# define AVAILABLE(h, h_l, j, n_l) \ + (!memchr ((h) + (h_l), '\0', (j) + (n_l) - (h_l)) \ + && ((h_l) = (j) + (n_l))) +# define CANON_ELEMENT(c) tolower (c) +#if __GNUC_PREREQ (4, 2) +/* strncasecmp uses signed char, CMP_FUNC is expected to use unsigned char. */ +#pragma GCC diagnostic ignored "-Wpointer-sign" +#endif +# define CMP_FUNC strncasecmp +# include "str-two-way.h" +#endif + +/* + * Find the first occurrence of find in s, ignore case. + */ +char * +strcasestr (const char *s, + const char *find) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + + /* Less code size, but quadratic performance in the worst case. */ + char c, sc; + size_t len; + + if ((c = *find++) != 0) { + c = tolower((unsigned char)c); + len = strlen(find); + do { + do { + if ((sc = *s++) == 0) + return (NULL); + } while ((char)tolower((unsigned char)sc) != c); + } while (strncasecmp(s, find, len) != 0); + s--; + } + return ((char *)s); + +#else /* compilation for speed */ + + /* Larger code size, but guaranteed linear performance. */ + const char *haystack = s; + const char *needle = find; + size_t needle_len; /* Length of NEEDLE. */ + size_t haystack_len; /* Known minimum length of HAYSTACK. */ + int ok = 1; /* True if NEEDLE is prefix of HAYSTACK. */ + + /* Determine length of NEEDLE, and in the process, make sure + HAYSTACK is at least as long (no point processing all of a long + NEEDLE if HAYSTACK is too short). */ + while (*haystack && *needle) + ok &= (tolower ((unsigned char) *haystack++) + == tolower ((unsigned char) *needle++)); + if (*needle) + return NULL; + if (ok) + return (char *) s; + needle_len = needle - find; + haystack = s + 1; + haystack_len = needle_len - 1; + + /* Perform the search. */ + if (needle_len < LONG_NEEDLE_THRESHOLD) + return two_way_short_needle ((const unsigned char *) haystack, + haystack_len, + (const unsigned char *) find, needle_len); + return two_way_long_needle ((const unsigned char *) haystack, haystack_len, + (const unsigned char *) find, needle_len); +#endif /* compilation for speed */ +} diff --git a/lib/string/strcat.c b/lib/string/strcat.c new file mode 100644 index 0000000..92313c4 --- /dev/null +++ b/lib/string/strcat.c @@ -0,0 +1,97 @@ +/* +FUNCTION + <>---concatenate strings + +INDEX + strcat + +SYNOPSIS + #include + char *strcat(char *restrict <[dst]>, const char *restrict <[src]>); + +DESCRIPTION + <> appends a copy of the string pointed to by <[src]> + (including the terminating null character) to the end of the + string pointed to by <[dst]>. The initial character of + <[src]> overwrites the null character at the end of <[dst]>. + +RETURNS + This function returns the initial value of <[dst]> + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strcat ansi pure +*/ + +#include +#include + +/* Nonzero if X is aligned on a "long" boundary. */ +#define ALIGNED(X) \ + (((long)X & (sizeof (long) - 1)) == 0) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +char * +strcat (char *__restrict s1, + const char *__restrict s2) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *s = s1; + + while (*s1) + s1++; + + while (*s1++ = *s2++) + ; + return s; +#else + char *s = s1; + + + /* Skip over the data in s1 as quickly as possible. */ + if (ALIGNED (s1)) + { + unsigned long *aligned_s1 = (unsigned long *)s1; + while (!DETECTNULL (*aligned_s1)) + aligned_s1++; + + s1 = (char *)aligned_s1; + } + + while (*s1) + s1++; + + /* s1 now points to the its trailing null character, we can + just use strcpy to do the work for us now. + + ?!? We might want to just include strcpy here. + Also, this will cause many more unaligned string copies because + s1 is much less likely to be aligned. I don't know if its worth + tweaking strcpy to handle this better. */ + strcpy (s1, s2); + + return s; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/strchr.c b/lib/string/strchr.c new file mode 100644 index 0000000..96f30be --- /dev/null +++ b/lib/string/strchr.c @@ -0,0 +1,116 @@ +/* +FUNCTION + <>---search for character in string + +INDEX + strchr + +SYNOPSIS + #include + char * strchr(const char *<[string]>, int <[c]>); + +DESCRIPTION + This function finds the first occurence of <[c]> (converted to + a char) in the string pointed to by <[string]> (including the + terminating null character). + +RETURNS + Returns a pointer to the located character, or a null pointer + if <[c]> does not occur in <[string]>. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strchr ansi pure +*/ + +#include +#include + +/* Nonzero if X is not aligned on a "long" boundary. */ +#define UNALIGNED(X) ((long)X & (sizeof (long) - 1)) + +/* How many bytes are loaded each iteration of the word copy loop. */ +#define LBLOCKSIZE (sizeof (long)) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +/* DETECTCHAR returns nonzero if (long)X contains the byte used + to fill (long)MASK. */ +#define DETECTCHAR(X,MASK) (DETECTNULL(X ^ MASK)) + +char * +strchr (const char *s1, + int i) +{ + const unsigned char *s = (const unsigned char *)s1; + unsigned char c = i; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + unsigned long mask,j; + unsigned long *aligned_addr; + + /* Special case for finding 0. */ + if (!c) + { + while (UNALIGNED (s)) + { + if (!*s) + return (char *) s; + s++; + } + /* Operate a word at a time. */ + aligned_addr = (unsigned long *) s; + while (!DETECTNULL (*aligned_addr)) + aligned_addr++; + /* Found the end of string. */ + s = (const unsigned char *) aligned_addr; + while (*s) + s++; + return (char *) s; + } + + /* All other bytes. Align the pointer, then search a long at a time. */ + while (UNALIGNED (s)) + { + if (!*s) + return NULL; + if (*s == c) + return (char *) s; + s++; + } + + mask = c; + for (j = 8; j < LBLOCKSIZE * 8; j <<= 1) + mask = (mask << j) | mask; + + aligned_addr = (unsigned long *) s; + while (!DETECTNULL (*aligned_addr) && !DETECTCHAR (*aligned_addr, mask)) + aligned_addr++; + + /* The block of bytes currently pointed to by aligned_addr + contains either a null or the target char, or both. We + catch it using the bytewise search. */ + + s = (unsigned char *) aligned_addr; + +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (*s && *s != c) + s++; + if (*s == c) + return (char *)s; + return NULL; +} diff --git a/lib/string/strchrnul.c b/lib/string/strchrnul.c new file mode 100644 index 0000000..f5c3eb2 --- /dev/null +++ b/lib/string/strchrnul.c @@ -0,0 +1,40 @@ +/* +FUNCTION + <>---search for character in string + +INDEX + strchrnul + +SYNOPSIS + #include + char * strchrnul(const char *<[string]>, int <[c]>); + +DESCRIPTION + This function finds the first occurence of <[c]> (converted to + a char) in the string pointed to by <[string]> (including the + terminating null character). + +RETURNS + Returns a pointer to the located character, or a pointer + to the concluding null byte if <[c]> does not occur in <[string]>. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. It uses +strchr() and strlen() from elsewhere in this library. + +QUICKREF + strchrnul +*/ + +#include + +char * +strchrnul (const char *s1, + int i) +{ + char *s = strchr(s1, i); + + return s ? s : (char *)s1 + strlen(s1); +} diff --git a/lib/string/strcmp.c b/lib/string/strcmp.c new file mode 100644 index 0000000..894424a --- /dev/null +++ b/lib/string/strcmp.c @@ -0,0 +1,99 @@ +/* +FUNCTION + <>---character string compare + +INDEX + strcmp + +SYNOPSIS + #include + int strcmp(const char *<[a]>, const char *<[b]>); + +DESCRIPTION + <> compares the string at <[a]> to + the string at <[b]>. + +RETURNS + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>>, + <> returns a number greater than zero. If the two + strings match, <> returns zero. If <<*<[a]>>> + sorts lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strcmp ansi pure +*/ + +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* DETECTNULL returns nonzero if (long)X contains a NULL byte. */ +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +int +strcmp (const char *s1, + const char *s2) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +#else + unsigned long *a1; + unsigned long *a2; + + /* If s1 or s2 are unaligned, then compare bytes. */ + if (!UNALIGNED (s1, s2)) + { + /* If s1 and s2 are word-aligned, compare them a word at a time. */ + a1 = (unsigned long*)s1; + a2 = (unsigned long*)s2; + while (*a1 == *a2) + { + /* To get here, *a1 == *a2, thus if we find a null in *a1, + then the strings must be equal, so return zero. */ + if (DETECTNULL (*a1)) + return 0; + + a1++; + a2++; + } + + /* A difference was detected in last few bytes of s1, so search bytewise */ + s1 = (char*)a1; + s2 = (char*)a2; + } + + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/strcoll.c b/lib/string/strcoll.c new file mode 100644 index 0000000..7fa8d13 --- /dev/null +++ b/lib/string/strcoll.c @@ -0,0 +1,44 @@ +/* +FUNCTION + <>---locale-specific character string compare + +INDEX + strcoll + +SYNOPSIS + #include + int strcoll(const char *<[stra]>, const char * <[strb]>); + +DESCRIPTION + <> compares the string pointed to by <[stra]> to + the string pointed to by <[strb]>, using an interpretation + appropriate to the current <> state. + + (NOT Cygwin:) The current implementation of <> simply + uses <> and does not support any language-specific sorting. + +RETURNS + If the first string is greater than the second string, + <> returns a number greater than zero. If the two + strings are equivalent, <> returns zero. If the first + string is less than the second string, <> returns a + number less than zero. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strcoll ansi pure +*/ + +#include + +int +strcoll (const char *a, + const char *b) + +{ + return strcmp (a, b); +} diff --git a/lib/string/strcoll_l.c b/lib/string/strcoll_l.c new file mode 100644 index 0000000..89a7d05 --- /dev/null +++ b/lib/string/strcoll_l.c @@ -0,0 +1,46 @@ +/* +FUNCTION + <>---locale-specific character string compare + +INDEX + strcoll_l + +SYNOPSIS + #include + int strcoll_l(const char *<[stra]>, const char * <[strb]>, + locale_t <[locale]>); + +DESCRIPTION + <> compares the string pointed to by <[stra]> to + the string pointed to by <[strb]>, using an interpretation + appropriate to the current <> state. + + (NOT Cygwin:) The current implementation of <> simply + uses <> and does not support any language-specific sorting. + + If <[locale]> is LC_GLOBAL_LOCALE or not a valid locale object, the + behaviour is undefined. + +RETURNS + If the first string is greater than the second string, + <> returns a number greater than zero. If the two + strings are equivalent, <> returns zero. If the first + string is less than the second string, <> returns a + number less than zero. + +PORTABILITY +<> is POSIX-1.2008. + +<> requires no supporting OS subroutines. + +QUICKREF + strcoll_l ansi pure +*/ + +#include + +int +strcoll_l (const char *a, const char *b, struct __locale_t *locale) +{ + return strcmp (a, b); +} diff --git a/lib/string/strcpy.c b/lib/string/strcpy.c new file mode 100644 index 0000000..94e16b5 --- /dev/null +++ b/lib/string/strcpy.c @@ -0,0 +1,92 @@ +/* +FUNCTION + <>---copy string + +INDEX + strcpy + +SYNOPSIS + #include + char *strcpy(char *<[dst]>, const char *<[src]>); + +DESCRIPTION + <> copies the string pointed to by <[src]> + (including the terminating null character) to the array + pointed to by <[dst]>. + +RETURNS + This function returns the initial value of <[dst]>. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strcpy ansi pure +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +char* +strcpy (char *dst0, + const char *src0) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *s = dst0; + + while (*dst0++ = *src0++) + ; + + return s; +#else + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + + /* If SRC or DEST is unaligned, then copy bytes. */ + if (!UNALIGNED (src, dst)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (!DETECTNULL(*aligned_src)) + { + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while ((*dst++ = *src++)) + ; + return dst0; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/strcspn.c b/lib/string/strcspn.c new file mode 100644 index 0000000..abaa93a --- /dev/null +++ b/lib/string/strcspn.c @@ -0,0 +1,48 @@ +/* +FUNCTION + <>---count characters not in string + +INDEX + strcspn + +SYNOPSIS + size_t strcspn(const char *<[s1]>, const char *<[s2]>); + +DESCRIPTION + This function computes the length of the initial part of + the string pointed to by <[s1]> which consists entirely of + characters <[NOT]> from the string pointed to by <[s2]> + (excluding the terminating null character). + +RETURNS + <> returns the length of the substring found. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + */ + +#include + +size_t +strcspn (const char *s1, + const char *s2) +{ + const char *s = s1; + const char *c; + + while (*s1) + { + for (c = s2; *c; c++) + { + if (*s1 == *c) + break; + } + if (*c) + break; + s1++; + } + + return s1 - s; +} diff --git a/lib/string/strdup.c b/lib/string/strdup.c new file mode 100644 index 0000000..3f2a026 --- /dev/null +++ b/lib/string/strdup.c @@ -0,0 +1,13 @@ +#ifndef _REENT_ONLY + +#include +#include +#include + +char * +strdup (const char *str) +{ + return _strdup_r (_REENT, str); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/string/strdup_r.c b/lib/string/strdup_r.c new file mode 100644 index 0000000..14c80f7 --- /dev/null +++ b/lib/string/strdup_r.c @@ -0,0 +1,16 @@ +#include +#include +#include + +char * +_strdup_r (struct _reent *reent_ptr, + const char *str) +{ + size_t len = strlen (str) + 1; + char *copy = _malloc_r (reent_ptr, len); + if (copy) + { + memcpy (copy, str, len); + } + return copy; +} diff --git a/lib/string/strerror.c b/lib/string/strerror.c new file mode 100644 index 0000000..8f961d3 --- /dev/null +++ b/lib/string/strerror.c @@ -0,0 +1,905 @@ +/*** +**** CAUTION!!! KEEP DOC CONSISTENT---if you change text of a message +**** here, change two places: +**** 1) the leading doc section (alphabetized by macro) +**** 2) the real text inside switch(errnum) +***/ + +/* +FUNCTION + <>, <>---convert error number to string + +INDEX + strerror + +INDEX + strerror_l + +SYNOPSIS + #include + char *strerror(int <[errnum]>); + char *strerror_l(int <[errnum]>, locale_t <[locale]>); + char *_strerror_r(struct _reent <[ptr]>, int <[errnum]>, + int <[internal]>, int *<[error]>); + +DESCRIPTION +<> converts the error number <[errnum]> into a +string. The value of <[errnum]> is usually a copy of <>. +If <> is not a known error number, the result points to an +empty string. + +<> is like <> but creates a string in a format +as expected in locale <[locale]>. If <[locale]> is LC_GLOBAL_LOCALE or +not a valid locale object, the behaviour is undefined. + +This implementation of <> prints out the following strings +for each of the values defined in `<>': + +o+ +o 0 +Success + +o E2BIG +Arg list too long + +o EACCES +Permission denied + +o EADDRINUSE +Address already in use + +o EADDRNOTAVAIL +Address not available + +o EADV +Advertise error + +o EAFNOSUPPORT +Address family not supported by protocol family + +o EAGAIN +No more processes + +o EALREADY +Socket already connected + +o EBADF +Bad file number + +o EBADMSG +Bad message + +o EBUSY +Device or resource busy + +o ECANCELED +Operation canceled + +o ECHILD +No children + +o ECOMM +Communication error + +o ECONNABORTED +Software caused connection abort + +o ECONNREFUSED +Connection refused + +o ECONNRESET +Connection reset by peer + +o EDEADLK +Deadlock + +o EDESTADDRREQ +Destination address required + +o EEXIST +File exists + +o EDOM +Mathematics argument out of domain of function + +o EFAULT +Bad address + +o EFBIG +File too large + +o EHOSTDOWN +Host is down + +o EHOSTUNREACH +Host is unreachable + +o EIDRM +Identifier removed + +o EILSEQ +Illegal byte sequence + +o EINPROGRESS +Connection already in progress + +o EINTR +Interrupted system call + +o EINVAL +Invalid argument + +o EIO +I/O error + +o EISCONN +Socket is already connected + +o EISDIR +Is a directory + +o ELIBACC +Cannot access a needed shared library + +o ELIBBAD +Accessing a corrupted shared library + +o ELIBEXEC +Cannot exec a shared library directly + +o ELIBMAX +Attempting to link in more shared libraries than system limit + +o ELIBSCN +<<.lib>> section in a.out corrupted + +o EMFILE +File descriptor value too large + +o EMLINK +Too many links + +o EMSGSIZE +Message too long + +o EMULTIHOP +Multihop attempted + +o ENAMETOOLONG +File or path name too long + +o ENETDOWN +Network interface is not configured + +o ENETRESET +Connection aborted by network + +o ENETUNREACH +Network is unreachable + +o ENFILE +Too many open files in system + +o ENOBUFS +No buffer space available + +o ENODATA +No data + +o ENODEV +No such device + +o ENOENT +No such file or directory + +o ENOEXEC +Exec format error + +o ENOLCK +No lock + +o ENOLINK +Virtual circuit is gone + +o ENOMEM +Not enough space + +o ENOMSG +No message of desired type + +o ENONET +Machine is not on the network + +o ENOPKG +No package + +o ENOPROTOOPT +Protocol not available + +o ENOSPC +No space left on device + +o ENOSR +No stream resources + +o ENOSTR +Not a stream + +o ENOSYS +Function not implemented + +o ENOTBLK +Block device required + +o ENOTCONN +Socket is not connected + +o ENOTDIR +Not a directory + +o ENOTEMPTY +Directory not empty + +o ENOTRECOVERABLE +State not recoverable + +o ENOTSOCK +Socket operation on non-socket + +o ENOTSUP +Not supported + +o ENOTTY +Not a character device + +o ENXIO +No such device or address + +o EOPNOTSUPP +Operation not supported on socket + +o EOVERFLOW +Value too large for defined data type + +o EOWNERDEAD +Previous owner died + +o EPERM +Not owner + +o EPIPE +Broken pipe + +o EPROTO +Protocol error + +o EPROTOTYPE +Protocol wrong type for socket + +o EPROTONOSUPPORT +Unknown protocol + +o ERANGE +Result too large + +o EREMOTE +Resource is remote + +o EROFS +Read-only file system + +o ESHUTDOWN +Can't send after socket shutdown + +o ESOCKTNOSUPPORT +Socket type not supported + +o ESPIPE +Illegal seek + +o ESRCH +No such process + +o ESRMNT +Srmount error + +o ESTRPIPE +Strings pipe error + +o ETIME +Stream ioctl timeout + +o ETIMEDOUT +Connection timed out + +o ETXTBSY +Text file busy + +o EWOULDBLOCK +Operation would block (usually same as EAGAIN) + +o EXDEV +Cross-device link + +o- + +<<_strerror_r>> is a reentrant version of the above. + +RETURNS +This function returns a pointer to a string. Your application must +not modify that string. + +PORTABILITY +ANSI C requires <>, but does not specify the strings used +for each error number. + +<> is POSIX-1.2008. + +Although this implementation of <> is reentrant (depending +on <<_user_strerror>>), ANSI C declares that subsequent calls to +<> may overwrite the result string; therefore portable +code cannot depend on the reentrancy of this subroutine. + +Although this implementation of <> guarantees a non-null +result with a NUL-terminator, some implementations return <> +on failure. Although POSIX allows <> to set <> +to EINVAL on failure, this implementation does not do so (unless +you provide <<_user_strerror>>). + +POSIX recommends that unknown <[errnum]> result in a message +including that value, however it is not a requirement and this +implementation does not provide that information (unless you +provide <<_user_strerror>>). + +This implementation of <> provides for user-defined +extensibility. <> defines <[__ELASTERROR]>, which can be +used as a base for user-defined error values. If the user supplies a +routine named <<_user_strerror>>, and <[errnum]> passed to +<> does not match any of the supported values, +<<_user_strerror>> is called with three arguments. The first is of +type <[int]>, and is the <[errnum]> value unknown to <>. +The second is of type <[int]>, and matches the <[internal]> argument +of <<_strerror_r>>; this should be zero if called from <> +and non-zero if called from any other function; <<_user_strerror>> can +use this information to satisfy the POSIX rule that no other +standardized function can overwrite a static buffer reused by +<>. The third is of type <[int *]>, and matches the +<[error]> argument of <<_strerror_r>>; if a non-zero value is stored +into that location (usually <[EINVAL]>), then <> will set +<> to that value, and the XPG variant of <> will +return that value instead of zero or <[ERANGE]>. <<_user_strerror>> +returns a <[char *]> value; returning <[NULL]> implies that the user +function did not choose to handle <[errnum]>. The default +<<_user_strerror>> returns <[NULL]> for all input values. Note that +<<_user_sterror>> must be thread-safe, and only denote errors via the +third argument rather than modifying <>, if <> and +<> are are to comply with POSIX. + +<> requires no supporting OS subroutines. + +QUICKREF + strerror ansi pure +*/ + +#include +#include + +char * +_strerror_r (struct _reent *ptr, + int errnum, + int internal, + int *errptr) +{ + char *error; + extern char *_user_strerror (int, int, int *); + + switch (errnum) + { + case 0: + error = "Success"; + break; +/* go32 defines EPERM as EACCES */ +#if defined (EPERM) && (!defined (EACCES) || (EPERM != EACCES)) + case EPERM: + error = "Not owner"; + break; +#endif +#ifdef ENOENT + case ENOENT: + error = "No such file or directory"; + break; +#endif +#ifdef ESRCH + case ESRCH: + error = "No such process"; + break; +#endif +#ifdef EINTR + case EINTR: + error = "Interrupted system call"; + break; +#endif +#ifdef EIO + case EIO: + error = "I/O error"; + break; +#endif +/* go32 defines ENXIO as ENODEV */ +#if defined (ENXIO) && (!defined (ENODEV) || (ENXIO != ENODEV)) + case ENXIO: + error = "No such device or address"; + break; +#endif +#ifdef E2BIG + case E2BIG: + error = "Arg list too long"; + break; +#endif +#ifdef ENOEXEC + case ENOEXEC: + error = "Exec format error"; + break; +#endif +#ifdef EALREADY + case EALREADY: + error = "Socket already connected"; + break; +#endif +#ifdef EBADF + case EBADF: + error = "Bad file number"; + break; +#endif +#ifdef ECHILD + case ECHILD: + error = "No children"; + break; +#endif +#ifdef EDESTADDRREQ + case EDESTADDRREQ: + error = "Destination address required"; + break; +#endif +#ifdef EAGAIN + case EAGAIN: + error = "No more processes"; + break; +#endif +#ifdef ENOMEM + case ENOMEM: + error = "Not enough space"; + break; +#endif +#ifdef EACCES + case EACCES: + error = "Permission denied"; + break; +#endif +#ifdef EFAULT + case EFAULT: + error = "Bad address"; + break; +#endif +#ifdef ENOTBLK + case ENOTBLK: + error = "Block device required"; + break; +#endif +#ifdef EBUSY + case EBUSY: + error = "Device or resource busy"; + break; +#endif +#ifdef EEXIST + case EEXIST: + error = "File exists"; + break; +#endif +#ifdef EXDEV + case EXDEV: + error = "Cross-device link"; + break; +#endif +#ifdef ENODEV + case ENODEV: + error = "No such device"; + break; +#endif +#ifdef ENOTDIR + case ENOTDIR: + error = "Not a directory"; + break; +#endif +#ifdef EHOSTDOWN + case EHOSTDOWN: + error = "Host is down"; + break; +#endif +#ifdef EINPROGRESS + case EINPROGRESS: + error = "Connection already in progress"; + break; +#endif +#ifdef EISDIR + case EISDIR: + error = "Is a directory"; + break; +#endif +#ifdef EINVAL + case EINVAL: + error = "Invalid argument"; + break; +#endif +#ifdef ENETDOWN + case ENETDOWN: + error = "Network interface is not configured"; + break; +#endif +#ifdef ENETRESET + case ENETRESET: + error = "Connection aborted by network"; + break; +#endif +#ifdef ENFILE + case ENFILE: + error = "Too many open files in system"; + break; +#endif +#ifdef EMFILE + case EMFILE: + error = "File descriptor value too large"; + break; +#endif +#ifdef ENOTTY + case ENOTTY: + error = "Not a character device"; + break; +#endif +#ifdef ETXTBSY + case ETXTBSY: + error = "Text file busy"; + break; +#endif +#ifdef EFBIG + case EFBIG: + error = "File too large"; + break; +#endif +#ifdef EHOSTUNREACH + case EHOSTUNREACH: + error = "Host is unreachable"; + break; +#endif +#ifdef ENOSPC + case ENOSPC: + error = "No space left on device"; + break; +#endif +#ifdef ENOTSUP + case ENOTSUP: + error = "Not supported"; + break; +#endif +#ifdef ESPIPE + case ESPIPE: + error = "Illegal seek"; + break; +#endif +#ifdef EROFS + case EROFS: + error = "Read-only file system"; + break; +#endif +#ifdef EMLINK + case EMLINK: + error = "Too many links"; + break; +#endif +#ifdef EPIPE + case EPIPE: + error = "Broken pipe"; + break; +#endif +#ifdef EDOM + case EDOM: + error = "Mathematics argument out of domain of function"; + break; +#endif +#ifdef ERANGE + case ERANGE: + error = "Result too large"; + break; +#endif +#ifdef ENOMSG + case ENOMSG: + error = "No message of desired type"; + break; +#endif +#ifdef EIDRM + case EIDRM: + error = "Identifier removed"; + break; +#endif +#ifdef EILSEQ + case EILSEQ: + error = "Illegal byte sequence"; + break; +#endif +#ifdef EDEADLK + case EDEADLK: + error = "Deadlock"; + break; +#endif +#ifdef ENETUNREACH + case ENETUNREACH: + error = "Network is unreachable"; + break; +#endif +#ifdef ENOLCK + case ENOLCK: + error = "No lock"; + break; +#endif +#ifdef ENOSTR + case ENOSTR: + error = "Not a stream"; + break; +#endif +#ifdef ETIME + case ETIME: + error = "Stream ioctl timeout"; + break; +#endif +#ifdef ENOSR + case ENOSR: + error = "No stream resources"; + break; +#endif +#ifdef ENONET + case ENONET: + error = "Machine is not on the network"; + break; +#endif +#ifdef ENOPKG + case ENOPKG: + error = "No package"; + break; +#endif +#ifdef EREMOTE + case EREMOTE: + error = "Resource is remote"; + break; +#endif +#ifdef ENOLINK + case ENOLINK: + error = "Virtual circuit is gone"; + break; +#endif +#ifdef EADV + case EADV: + error = "Advertise error"; + break; +#endif +#ifdef ESRMNT + case ESRMNT: + error = "Srmount error"; + break; +#endif +#ifdef ECOMM + case ECOMM: + error = "Communication error"; + break; +#endif +#ifdef EPROTO + case EPROTO: + error = "Protocol error"; + break; +#endif +#ifdef EPROTONOSUPPORT + case EPROTONOSUPPORT: + error = "Unknown protocol"; + break; +#endif +#ifdef EMULTIHOP + case EMULTIHOP: + error = "Multihop attempted"; + break; +#endif +#ifdef EBADMSG + case EBADMSG: + error = "Bad message"; + break; +#endif +#ifdef ELIBACC + case ELIBACC: + error = "Cannot access a needed shared library"; + break; +#endif +#ifdef ELIBBAD + case ELIBBAD: + error = "Accessing a corrupted shared library"; + break; +#endif +#ifdef ELIBSCN + case ELIBSCN: + error = ".lib section in a.out corrupted"; + break; +#endif +#ifdef ELIBMAX + case ELIBMAX: + error = "Attempting to link in more shared libraries than system limit"; + break; +#endif +#ifdef ELIBEXEC + case ELIBEXEC: + error = "Cannot exec a shared library directly"; + break; +#endif +#ifdef ENOSYS + case ENOSYS: + error = "Function not implemented"; + break; +#endif +#ifdef ENMFILE + case ENMFILE: + error = "No more files"; + break; +#endif +#ifdef ENOTEMPTY + case ENOTEMPTY: + error = "Directory not empty"; + break; +#endif +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + error = "File or path name too long"; + break; +#endif +#ifdef ELOOP + case ELOOP: + error = "Too many symbolic links"; + break; +#endif +#ifdef ENOBUFS + case ENOBUFS: + error = "No buffer space available"; + break; +#endif +#ifdef ENODATA + case ENODATA: + error = "No data"; + break; +#endif +#ifdef EAFNOSUPPORT + case EAFNOSUPPORT: + error = "Address family not supported by protocol family"; + break; +#endif +#ifdef EPROTOTYPE + case EPROTOTYPE: + error = "Protocol wrong type for socket"; + break; +#endif +#ifdef ENOTSOCK + case ENOTSOCK: + error = "Socket operation on non-socket"; + break; +#endif +#ifdef ENOPROTOOPT + case ENOPROTOOPT: + error = "Protocol not available"; + break; +#endif +#ifdef ESHUTDOWN + case ESHUTDOWN: + error = "Can't send after socket shutdown"; + break; +#endif +#ifdef ECONNREFUSED + case ECONNREFUSED: + error = "Connection refused"; + break; +#endif +#ifdef ECONNRESET + case ECONNRESET: + error = "Connection reset by peer"; + break; +#endif +#ifdef EADDRINUSE + case EADDRINUSE: + error = "Address already in use"; + break; +#endif +#ifdef EADDRNOTAVAIL + case EADDRNOTAVAIL: + error = "Address not available"; + break; +#endif +#ifdef ECONNABORTED + case ECONNABORTED: + error = "Software caused connection abort"; + break; +#endif +#if (defined(EWOULDBLOCK) && (!defined (EAGAIN) || (EWOULDBLOCK != EAGAIN))) + case EWOULDBLOCK: + error = "Operation would block"; + break; +#endif +#ifdef ENOTCONN + case ENOTCONN: + error = "Socket is not connected"; + break; +#endif +#ifdef ESOCKTNOSUPPORT + case ESOCKTNOSUPPORT: + error = "Socket type not supported"; + break; +#endif +#ifdef EISCONN + case EISCONN: + error = "Socket is already connected"; + break; +#endif +#ifdef ECANCELED + case ECANCELED: + error = "Operation canceled"; + break; +#endif +#ifdef ENOTRECOVERABLE + case ENOTRECOVERABLE: + error = "State not recoverable"; + break; +#endif +#ifdef EOWNERDEAD + case EOWNERDEAD: + error = "Previous owner died"; + break; +#endif +#ifdef ESTRPIPE + case ESTRPIPE: + error = "Streams pipe error"; + break; +#endif +#if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (ENOTSUP != EOPNOTSUPP)) + case EOPNOTSUPP: + error = "Operation not supported on socket"; + break; +#endif +#ifdef EOVERFLOW + case EOVERFLOW: + error = "Value too large for defined data type"; + break; +#endif +#ifdef EMSGSIZE + case EMSGSIZE: + error = "Message too long"; + break; +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: + error = "Connection timed out"; + break; +#endif + default: + if (!errptr) + errptr = &_REENT_ERRNO(ptr); + if ((error = _user_strerror (errnum, internal, errptr)) == 0) + error = ""; + break; + } + + return error; +} + +char * +strerror (int errnum) +{ + return _strerror_r (_REENT, errnum, 0, NULL); +} + +char * +strerror_l (int errnum, locale_t locale) +{ + /* We don't support per-locale error messages. */ + return _strerror_r (_REENT, errnum, 0, NULL); +} diff --git a/lib/string/strerror_r.c b/lib/string/strerror_r.c new file mode 100644 index 0000000..660fee8 --- /dev/null +++ b/lib/string/strerror_r.c @@ -0,0 +1,77 @@ +/* GNU variant of strerror_r. */ +/* +FUNCTION + <>---convert error number to string and copy to buffer + +INDEX + strerror_r + +SYNOPSIS + #include + #ifdef _GNU_SOURCE + char *strerror_r(int <[errnum]>, char *<[buffer]>, size_t <[n]>); + #else + int strerror_r(int <[errnum]>, char *<[buffer]>, size_t <[n]>); + #endif + +DESCRIPTION +<> converts the error number <[errnum]> into a +string and copies the result into the supplied <[buffer]> for +a length up to <[n]>, including the NUL terminator. The value of +<[errnum]> is usually a copy of <>. If <> is not a known +error number, the result is the empty string. + +See <> for how strings are mapped to <>. + +RETURNS +There are two variants: the GNU version always returns a NUL-terminated +string, which is <[buffer]> if all went well, but which is another +pointer if <[n]> was too small (leaving <[buffer]> untouched). If the +return is not <[buffer]>, your application must not modify that string. +The POSIX version returns 0 on success, <[EINVAL]> if <> was not +recognized, and <[ERANGE]> if <[n]> was too small. The variant chosen +depends on macros that you define before inclusion of <>. + +PORTABILITY +<> with a <[char *]> result is a GNU extension. +<> with an <[int]> result is required by POSIX 2001. +This function is compliant only if <<_user_strerror>> is not provided, +or if it is thread-safe and uses separate storage according to whether +the second argument of that function is non-zero. For more details +on <<_user_strerror>>, see the <> documentation. + +POSIX states that the contents of <[buf]> are unspecified on error, +although this implementation guarantees a NUL-terminated string for +all except <[n]> of 0. + +POSIX recommends that unknown <[errnum]> result in a message including +that value, however it is not a requirement and this implementation +provides only an empty string (unless you provide <<_user_strerror>>). +POSIX also recommends that unknown <[errnum]> fail with EINVAL even +when providing such a message, however it is not a requirement and +this implementation will return success if <<_user_strerror>> provided +a non-empty alternate string without assigning into its third argument. + +<> requires no supporting OS subroutines. + +*/ + +#undef __STRICT_ANSI__ +#define _GNU_SOURCE +#include +#include +#undef strerror_r + +/* For backwards-compatible linking, this must be the GNU signature; + see xpg_strerror_r.c for the POSIX version. */ +char * +strerror_r (int errnum, + char *buffer, + size_t n) +{ + char *error = _strerror_r (_REENT, errnum, 1, NULL); + + if (strlen (error) >= n) + return error; + return strcpy (buffer, error); +} diff --git a/lib/string/strings.tex b/lib/string/strings.tex new file mode 100644 index 0000000..6aec5fe --- /dev/null +++ b/lib/string/strings.tex @@ -0,0 +1,205 @@ +@node Strings +@chapter Strings and Memory (@file{string.h}) + +This chapter describes string-handling functions and functions for +managing areas of memory. The corresponding declarations are in +@file{string.h}. + +@menu +* bcmp:: Compare two memory areas +* bcopy:: Copy memory regions +* bzero:: Initialize memory to zero +* index:: Search for character in string +* memccpy:: Copy memory regions up to end-token +* memchr:: Find character in memory +* memcmp:: Compare two memory areas +* memcpy:: Copy memory regions +* memmem:: Find memory segment +* memmove:: Move possibly overlapping memory +* mempcpy:: Copy memory regions and locate end +* memrchr:: Reverse search for character in memory +* memset:: Set an area of memory +* rawmemchr:: Find character in memory +* rindex:: Reverse search for character in string +* stpcpy:: Copy string returning a pointer to its end +* stpncpy:: Counted copy string returning a pointer to its end +* strcasecmp:: Compare strings ignoring case +* strcasestr:: Find string segment ignoring case +* strcat:: Concatenate strings +* strchr:: Search for character in string +* strchrnul:: Search for character in string +* strcmp:: Character string compare +* strcoll:: Locale-specific character string compare +* strcpy:: Copy string +* strcspn:: Count chars not in string +* strerror:: Convert error number to string (strerror, strerror_l) +* strerror_r:: Convert error number to string +* strlen:: Character string length +* strlwr:: Convert string to lowercase +* strncasecmp:: Compare strings ignoring case +* strncat:: Concatenate strings +* strncmp:: Character string compare +* strncpy:: Counted copy string +* strnstr:: Find string segment +* strnlen:: Character string length +* strpbrk:: Find chars in string +* strrchr:: Reverse search for character in string +* strsignal:: Return signal message string +* strspn:: Find initial match +* strstr:: Find string segment +* strtok:: Get next token from a string +* strupr:: Convert string to upper case +* strverscmp:: Compare version strings +* strxfrm:: Transform string +* swab:: Swap adjacent bytes +* wcscasecmp:: Compare wide character strings ignoring case +* wcsdup:: Wide character string duplicate +* wcsncasecmp:: Compare wide character strings ignoring case +@end menu + +@page +@include string/bcmp.def + +@page +@include string/bcopy.def + +@page +@include string/bzero.def + +@page +@include string/index.def + +@page +@include string/memccpy.def + +@page +@include string/memchr.def + +@page +@include string/memcmp.def + +@page +@include string/memcpy.def + +@page +@include string/memmem.def + +@page +@include string/memmove.def + +@page +@include string/mempcpy.def + +@page +@include string/memrchr.def + +@page +@include string/memset.def + +@page +@include string/rawmemchr.def + +@page +@include string/rindex.def + +@page +@include string/stpcpy.def + +@page +@include string/stpncpy.def + +@page +@include string/strcasecmp.def + +@page +@include string/strcasestr.def + +@page +@include string/strcat.def + +@page +@include string/strchr.def + +@page +@include string/strchrnul.def + +@page +@include string/strcmp.def + +@page +@include string/strcoll.def + +@page +@include string/strcpy.def + +@page +@include string/strcspn.def + +@page +@include string/strerror.def + +@page +@include string/strerror_r.def + +@page +@include string/strlen.def + +@page +@include string/strlwr.def + +@page +@include string/strncasecmp.def + +@page +@include string/strncat.def + +@page +@include string/strncmp.def + +@page +@include string/strncpy.def + +@page +@include string/strnstr.def + +@page +@include string/strnlen.def + +@page +@include string/strpbrk.def + +@page +@include string/strrchr.def + +@page +@include string/strsignal.def + +@page +@include string/strspn.def + +@page +@include string/strstr.def + +@page +@include string/strtok.def + +@page +@include string/strupr.def + +@page +@include string/strverscmp.def + +@page +@include string/strxfrm.def + +@page +@include string/swab.def + +@page +@include string/wcscasecmp.def + +@page +@include string/wcsdup.def + +@page +@include string/wcsncasecmp.def diff --git a/lib/string/strlcat.c b/lib/string/strlcat.c new file mode 100644 index 0000000..f359779 --- /dev/null +++ b/lib/string/strlcat.c @@ -0,0 +1,57 @@ +/* $OpenBSD: strlcat.c,v 1.19 2019/01/25 00:19:25 millert Exp $ */ + +/* + * Copyright (c) 1998, 2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +/* + * Appends src to string dst of size dsize (unlike strncat, dsize is the + * full size of dst, not space left). At most dsize-1 characters + * will be copied. Always NUL terminates (unless dsize <= strlen(dst)). + * Returns strlen(src) + MIN(dsize, strlen(initial dst)). + * If retval >= dsize, truncation occurred. + */ +size_t +strlcat (char *dst, + const char *src, + size_t dsize) +{ + const char *odst = dst; + const char *osrc = src; + size_t n = dsize; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end. */ + while (n-- != 0 && *dst != '\0') + dst++; + dlen = dst - odst; + n = dsize - dlen; + + if (n-- == 0) + return(dlen + strlen(src)); + while (*src != '\0') { + if (n != 0) { + *dst++ = *src; + n--; + } + src++; + } + *dst = '\0'; + + return(dlen + (src - osrc)); /* count does not include NUL */ +} diff --git a/lib/string/strlcpy.c b/lib/string/strlcpy.c new file mode 100644 index 0000000..3df2e45 --- /dev/null +++ b/lib/string/strlcpy.c @@ -0,0 +1,52 @@ +/* $OpenBSD: strlcpy.c,v 1.16 2019/01/25 00:19:25 millert Exp $ */ + +/* + * Copyright (c) 1998, 2015 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +/* + * Copy string src to buffer dst of size dsize. At most dsize-1 + * chars will be copied. Always NUL terminates (unless dsize == 0). + * Returns strlen(src); if retval >= dsize, truncation occurred. + */ +size_t +strlcpy (char *dst, + const char *src, + size_t dsize) +{ + const char *osrc = src; + size_t nleft = dsize; + + /* Copy as many bytes as will fit. */ + if (nleft != 0) { + while (--nleft != 0) { + if ((*dst++ = *src++) == '\0') + break; + } + } + + /* Not enough room in dst, add NUL and traverse rest of src. */ + if (nleft == 0) { + if (dsize != 0) + *dst = '\0'; /* NUL-terminate dst */ + while (*src++) + ; + } + + return(src - osrc - 1); /* count does not include NUL */ +} diff --git a/lib/string/strlen.c b/lib/string/strlen.c new file mode 100644 index 0000000..acffa49 --- /dev/null +++ b/lib/string/strlen.c @@ -0,0 +1,82 @@ +/* +FUNCTION + <>---character string length + +INDEX + strlen + +SYNOPSIS + #include + size_t strlen(const char *<[str]>); + +DESCRIPTION + The <> function works out the length of the string + starting at <<*<[str]>>> by counting chararacters until it + reaches a <> character. + +RETURNS + <> returns the character count. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strlen ansi pure +*/ + +#include <_ansi.h> +#include +#include + +#define LBLOCKSIZE (sizeof (long)) +#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1)) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +size_t +strlen (const char *str) +{ + const char *start = str; + +#if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) + unsigned long *aligned_addr; + + /* Align the pointer, so we can search a word at a time. */ + while (UNALIGNED (str)) + { + if (!*str) + return str - start; + str++; + } + + /* If the string is word-aligned, we can check for the presence of + a null in each word-sized block. */ + aligned_addr = (unsigned long *)str; + while (!DETECTNULL (*aligned_addr)) + aligned_addr++; + + /* Once a null is detected, we check each byte in that block for a + precise position of the null. */ + str = (char *) aligned_addr; + +#endif /* not PREFER_SIZE_OVER_SPEED */ + + while (*str) + str++; + return str - start; +} diff --git a/lib/string/strlwr.c b/lib/string/strlwr.c new file mode 100644 index 0000000..7211c59 --- /dev/null +++ b/lib/string/strlwr.c @@ -0,0 +1,40 @@ +/* +FUNCTION + <>---force string to lowercase + +INDEX + strlwr + +SYNOPSIS + #include + char *strlwr(char *<[a]>); + +DESCRIPTION + <> converts each character in the string at <[a]> to + lowercase. + +RETURNS + <> returns its argument, <[a]>. + +PORTABILITY +<> is not widely portable. + +<> requires no supporting OS subroutines. + +QUICKREF + strlwr +*/ + +#include +#include + +char * +strlwr (char *s) +{ + unsigned char *ucs = (unsigned char *) s; + for ( ; *ucs != '\0'; ucs++) + { + *ucs = tolower(*ucs); + } + return s; +} diff --git a/lib/string/strncasecmp.c b/lib/string/strncasecmp.c new file mode 100644 index 0000000..09dd98b --- /dev/null +++ b/lib/string/strncasecmp.c @@ -0,0 +1,53 @@ +/* +FUNCTION + <>---case-insensitive character string compare + +INDEX + strncasecmp + +SYNOPSIS + #include + int strncasecmp(const char *<[a]>, const char * <[b]>, size_t <[length]>); + +DESCRIPTION + <> compares up to <[length]> characters + from the string at <[a]> to the string at <[b]> in a + case-insensitive manner. + +RETURNS + + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>> (after + both are converted to lowercase), <> returns a + number greater than zero. If the two strings are equivalent, + <> returns zero. If <<*<[a]>>> sorts + lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is in the Berkeley Software Distribution. + +<> requires no supporting OS subroutines. It uses +tolower() from elsewhere in this library. + +QUICKREF + strncasecmp +*/ + +#include +#include + +int +strncasecmp (const char *s1, + const char *s2, + size_t n) +{ + int d = 0; + for ( ; n != 0; n--) + { + const int c1 = tolower(*s1++); + const int c2 = tolower(*s2++); + if (((d = c1 - c2) != 0) || (c2 == '\0')) + break; + } + return d; +} diff --git a/lib/string/strncasecmp_l.c b/lib/string/strncasecmp_l.c new file mode 100644 index 0000000..b15c6c5 --- /dev/null +++ b/lib/string/strncasecmp_l.c @@ -0,0 +1,56 @@ +/* +FUNCTION + <>---case-insensitive character string compare + +INDEX + strncasecmp_l + +SYNOPSIS + #include + int strncasecmp_l(const char *<[a]>, const char * <[b]>, + size_t <[length]>, locale_t <[locale]>); + +DESCRIPTION + <> compares up to <[length]> characters + from the string at <[a]> to the string at <[b]> in a + case-insensitive manner. + + if <[locale]> is LC_GLOBAL_LOCALE or not a valid locale object, the + behaviour is undefined. + +RETURNS + + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>> (after + both are converted to lowercase), <> returns a + number greater than zero. If the two strings are equivalent, + <> returns zero. If <<*<[a]>>> sorts + lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is POSIX-1.2008. + +<> requires no supporting OS subroutines. It uses +tolower_l() from elsewhere in this library. + +QUICKREF + strncasecmp_l +*/ + +#include +#include + +int +strncasecmp_l (const char *s1, const char *s2, size_t n, + struct __locale_t *locale) +{ + int d = 0; + for ( ; n != 0; n--) + { + const int c1 = tolower_l (*s1++, locale); + const int c2 = tolower_l (*s2++, locale); + if (((d = c1 - c2) != 0) || (c2 == '\0')) + break; + } + return d; +} diff --git a/lib/string/strncat.c b/lib/string/strncat.c new file mode 100644 index 0000000..7351913 --- /dev/null +++ b/lib/string/strncat.c @@ -0,0 +1,107 @@ +/* +FUNCTION + <>---concatenate strings + +INDEX + strncat + +SYNOPSIS + #include + char *strncat(char *restrict <[dst]>, const char *restrict <[src]>, + size_t <[length]>); + +DESCRIPTION + <> appends not more than <[length]> characters from + the string pointed to by <[src]> (including the terminating + null character) to the end of the string pointed to by + <[dst]>. The initial character of <[src]> overwrites the null + character at the end of <[dst]>. A terminating null character + is always appended to the result + +WARNINGS + Note that a null is always appended, so that if the copy is + limited by the <[length]> argument, the number of characters + appended to <[dst]> is <>. + +RETURNS + This function returns the initial value of <[dst]> + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strncat ansi pure +*/ + +#include +#include + +/* Nonzero if X is aligned on a "long" boundary. */ +#define ALIGNED(X) \ + (((long)X & (sizeof (long) - 1)) == 0) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +char * +strncat (char *__restrict s1, + const char *__restrict s2, + size_t n) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *s = s1; + + while (*s1) + s1++; + while (n-- != 0 && (*s1++ = *s2++)) + { + if (n == 0) + *s1 = '\0'; + } + + return s; +#else + char *s = s1; + + /* Skip over the data in s1 as quickly as possible. */ + if (ALIGNED (s1)) + { + unsigned long *aligned_s1 = (unsigned long *)s1; + while (!DETECTNULL (*aligned_s1)) + aligned_s1++; + + s1 = (char *)aligned_s1; + } + + while (*s1) + s1++; + + /* s1 now points to the its trailing null character, now copy + up to N bytes from S2 into S1 stopping if a NULL is encountered + in S2. + + It is not safe to use strncpy here since it copies EXACTLY N + characters, NULL padding if necessary. */ + while (n-- != 0 && (*s1++ = *s2++)) + { + if (n == 0) + *s1 = '\0'; + } + + return s; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/strncmp.c b/lib/string/strncmp.c new file mode 100644 index 0000000..16f8a77 --- /dev/null +++ b/lib/string/strncmp.c @@ -0,0 +1,114 @@ +/* +FUNCTION + <>---character string compare + +INDEX + strncmp + +SYNOPSIS + #include + int strncmp(const char *<[a]>, const char * <[b]>, size_t <[length]>); + +DESCRIPTION + <> compares up to <[length]> characters + from the string at <[a]> to the string at <[b]>. + +RETURNS + If <<*<[a]>>> sorts lexicographically after <<*<[b]>>>, + <> returns a number greater than zero. If the two + strings are equivalent, <> returns zero. If <<*<[a]>>> + sorts lexicographically before <<*<[b]>>>, <> returns a + number less than zero. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strncmp ansi pure +*/ + +#include +#include + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +/* DETECTNULL returns nonzero if (long)X contains a NULL byte. */ +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +int +strncmp (const char *s1, + const char *s2, + size_t n) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + if (n == 0) + return 0; + + while (n-- != 0 && *s1 == *s2) + { + if (n == 0 || *s1 == '\0') + break; + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +#else + unsigned long *a1; + unsigned long *a2; + + if (n == 0) + return 0; + + /* If s1 or s2 are unaligned, then compare bytes. */ + if (!UNALIGNED (s1, s2)) + { + /* If s1 and s2 are word-aligned, compare them a word at a time. */ + a1 = (unsigned long*)s1; + a2 = (unsigned long*)s2; + while (n >= sizeof (long) && *a1 == *a2) + { + n -= sizeof (long); + + /* If we've run out of bytes or hit a null, return zero + since we already know *a1 == *a2. */ + if (n == 0 || DETECTNULL (*a1)) + return 0; + + a1++; + a2++; + } + + /* A difference was detected in last few bytes of s1, so search bytewise */ + s1 = (char*)a1; + s2 = (char*)a2; + } + + while (n-- > 0 && *s1 == *s2) + { + /* If we've run out of bytes or hit a null, return zero + since we already know *s1 == *s2. */ + if (n == 0 || *s1 == '\0') + return 0; + s1++; + s2++; + } + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/strncpy.c b/lib/string/strncpy.c new file mode 100644 index 0000000..e7eb34d --- /dev/null +++ b/lib/string/strncpy.c @@ -0,0 +1,118 @@ +/* +FUNCTION + <>---counted copy string + +INDEX + strncpy + +SYNOPSIS + #include + char *strncpy(char *restrict <[dst]>, const char *restrict <[src]>, + size_t <[length]>); + +DESCRIPTION + <> copies not more than <[length]> characters from the + the string pointed to by <[src]> (including the terminating + null character) to the array pointed to by <[dst]>. If the + string pointed to by <[src]> is shorter than <[length]> + characters, null characters are appended to the destination + array until a total of <[length]> characters have been + written. + +RETURNS + This function returns the initial value of <[dst]>. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strncpy ansi pure +*/ + +#include +#include + +/*SUPPRESS 560*/ +/*SUPPRESS 530*/ + +/* Nonzero if either X or Y is not aligned on a "long" boundary. */ +#define UNALIGNED(X, Y) \ + (((long)X & (sizeof (long) - 1)) | ((long)Y & (sizeof (long) - 1))) + +#if LONG_MAX == 2147483647L +#define DETECTNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080) +#else +#if LONG_MAX == 9223372036854775807L +/* Nonzero if X (a long int) contains a NULL byte. */ +#define DETECTNULL(X) (((X) - 0x0101010101010101) & ~(X) & 0x8080808080808080) +#else +#error long int is not a 32bit or 64bit type. +#endif +#endif + +#ifndef DETECTNULL +#error long int is not a 32bit or 64bit byte +#endif + +#define TOO_SMALL(LEN) ((LEN) < sizeof (long)) + +char * +strncpy (char *__restrict dst0, + const char *__restrict src0, + size_t count) +{ +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) + char *dscan; + const char *sscan; + + dscan = dst0; + sscan = src0; + while (count > 0) + { + --count; + if ((*dscan++ = *sscan++) == '\0') + break; + } + while (count-- > 0) + *dscan++ = '\0'; + + return dst0; +#else + char *dst = dst0; + const char *src = src0; + long *aligned_dst; + const long *aligned_src; + + /* If SRC and DEST is aligned and count large enough, then copy words. */ + if (!UNALIGNED (src, dst) && !TOO_SMALL (count)) + { + aligned_dst = (long*)dst; + aligned_src = (long*)src; + + /* SRC and DEST are both "long int" aligned, try to do "long int" + sized copies. */ + while (count >= sizeof (long int) && !DETECTNULL(*aligned_src)) + { + count -= sizeof (long int); + *aligned_dst++ = *aligned_src++; + } + + dst = (char*)aligned_dst; + src = (char*)aligned_src; + } + + while (count > 0) + { + --count; + if ((*dst++ = *src++) == '\0') + break; + } + + while (count-- > 0) + *dst++ = '\0'; + + return dst0; +#endif /* not PREFER_SIZE_OVER_SPEED */ +} diff --git a/lib/string/strndup.c b/lib/string/strndup.c new file mode 100644 index 0000000..3ac890a --- /dev/null +++ b/lib/string/strndup.c @@ -0,0 +1,15 @@ +#ifndef _REENT_ONLY + +#include <_ansi.h> +#include +#include +#include + +char * +strndup (const char *str, + size_t n) +{ + return _strndup_r (_REENT, str, n); +} + +#endif /* !_REENT_ONLY */ diff --git a/lib/string/strndup_r.c b/lib/string/strndup_r.c new file mode 100644 index 0000000..1b6cf84 --- /dev/null +++ b/lib/string/strndup_r.c @@ -0,0 +1,26 @@ +#include +#include +#include + +char * +_strndup_r (struct _reent *reent_ptr, + const char *str, + size_t n) +{ + const char *ptr = str; + size_t len; + char *copy; + + while (n-- > 0 && *ptr) + ptr++; + + len = ptr - str; + + copy = _malloc_r (reent_ptr, len + 1); + if (copy) + { + memcpy (copy, str, len); + copy[len] = '\0'; + } + return copy; +} diff --git a/lib/string/strnlen.c b/lib/string/strnlen.c new file mode 100644 index 0000000..3ee18d1 --- /dev/null +++ b/lib/string/strnlen.c @@ -0,0 +1,42 @@ +/* +FUNCTION + <>---character string length + +INDEX + strnlen + +SYNOPSIS + #include + size_t strnlen(const char *<[str]>, size_t <[n]>); + +DESCRIPTION + The <> function works out the length of the string + starting at <<*<[str]>>> by counting chararacters until it + reaches a NUL character or the maximum: <[n]> number of + characters have been inspected. + +RETURNS + <> returns the character count or <[n]>. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. + +*/ + +#undef __STRICT_ANSI__ +#include <_ansi.h> +#include + +size_t +strnlen (const char *str, + size_t n) +{ + const char *start = str; + + while (n-- > 0 && *str) + str++; + + return str - start; +} diff --git a/lib/string/strnstr.c b/lib/string/strnstr.c new file mode 100644 index 0000000..cb5f719 --- /dev/null +++ b/lib/string/strnstr.c @@ -0,0 +1,51 @@ +/* +FUNCTION + <>---find string segment + +INDEX + strnstr + +SYNOPSIS + #include + size_t strnstr(const char *<[s1]>, const char *<[s2]>, size_t <[n]>); + +DESCRIPTION + Locates the first occurrence in the string pointed to by <[s1]> of + the sequence of limited to the <[n]> characters in the string + pointed to by <[s2]> + +RETURNS + Returns a pointer to the located string segment, or a null + pointer if the string <[s2]> is not found. If <[s2]> points to + a string with zero length, <[s1]> is returned. + + +PORTABILITY +<> is a BSD extension. + +<> requires no supporting OS subroutines. + +QUICKREF + strnstr pure + +*/ + +#define _GNU_SOURCE +#include + +/* + * Find the first occurrence of find in s, where the search is limited to the + * first slen characters of s. + */ +char * +strnstr(const char *haystack, const char *needle, size_t haystack_len) +{ + size_t needle_len = strnlen(needle, haystack_len); + + if (needle_len < haystack_len || !needle[needle_len]) { + char *x = memmem(haystack, haystack_len, needle, needle_len); + if (x && !memchr(haystack, 0, x - haystack)) + return x; + } + return NULL; +} diff --git a/lib/string/strpbrk.c b/lib/string/strpbrk.c new file mode 100644 index 0000000..774db1e --- /dev/null +++ b/lib/string/strpbrk.c @@ -0,0 +1,51 @@ +/* +FUNCTION + <>---find characters in string + +INDEX + strpbrk + +SYNOPSIS + #include + char *strpbrk(const char *<[s1]>, const char *<[s2]>); + +DESCRIPTION + This function locates the first occurence in the string + pointed to by <[s1]> of any character in string pointed to by + <[s2]> (excluding the terminating null character). + +RETURNS + <> returns a pointer to the character found in <[s1]>, or a + null pointer if no character from <[s2]> occurs in <[s1]>. + +PORTABILITY +<> requires no supporting OS subroutines. +*/ + +#include + +char * +strpbrk (const char *s1, + const char *s2) +{ + const char *c = s2; + if (!*s1) + return (char *) NULL; + + while (*s1) + { + for (c = s2; *c; c++) + { + if (*s1 == *c) + break; + } + if (*c) + break; + s1++; + } + + if (*c == '\0') + s1 = NULL; + + return (char *) s1; +} diff --git a/lib/string/strrchr.c b/lib/string/strrchr.c new file mode 100644 index 0000000..35a7060 --- /dev/null +++ b/lib/string/strrchr.c @@ -0,0 +1,53 @@ +/* +FUNCTION + <>---reverse search for character in string + +INDEX + strrchr + +SYNOPSIS + #include + char * strrchr(const char *<[string]>, int <[c]>); + +DESCRIPTION + This function finds the last occurence of <[c]> (converted to + a char) in the string pointed to by <[string]> (including the + terminating null character). + +RETURNS + Returns a pointer to the located character, or a null pointer + if <[c]> does not occur in <[string]>. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strrchr ansi pure +*/ + +#include + +char * +strrchr (const char *s, + int i) +{ + const char *last = NULL; + char c = i; + + if (c) + { + while ((s=strchr(s, c))) + { + last = s; + s++; + } + } + else + { + last = strchr(s, c); + } + + return (char *) last; +} diff --git a/lib/string/strsep.c b/lib/string/strsep.c new file mode 100644 index 0000000..e1262ac --- /dev/null +++ b/lib/string/strsep.c @@ -0,0 +1,18 @@ +/* BSD strsep function */ + +/* Copyright 2002, Red Hat Inc. */ + +/* undef STRICT_ANSI so that strsep prototype will be defined */ +#undef __STRICT_ANSI__ +#include +#include <_ansi.h> +#include + +extern char *__strtok_r (char *, const char *, char **, int); + +char * +strsep (register char **source_ptr, + register const char *delim) +{ + return __strtok_r (*source_ptr, delim, source_ptr, 0); +} diff --git a/lib/string/strsignal.c b/lib/string/strsignal.c new file mode 100644 index 0000000..89d39fe --- /dev/null +++ b/lib/string/strsignal.c @@ -0,0 +1,253 @@ +/* +FUNCTION + <>---convert signal number to string + +INDEX + strsignal + +SYNOPSIS + #include + char *strsignal(int <[signal]>); + +DESCRIPTION +<> converts the signal number <[signal]> into a +string. If <[signal]> is not a known signal number, the result +will be of the form "Unknown signal NN" where NN is the <[signal]> +is a decimal number. + +RETURNS +This function returns a pointer to a string. Your application must +not modify that string. + +PORTABILITY +POSIX.1-2008 C requires <>, but does not specify the strings used +for each signal number. + +<> requires no supporting OS subroutines. + +QUICKREF + strsignal pure +*/ + +/* + * Written by Joel Sherrill . + * + * COPYRIGHT (c) 2010, 2017. + * On-Line Applications Research Corporation (OAR). + * + * Permission to use, copy, modify, and distribute this software for any + * purpose without fee is hereby granted, provided that this entire notice + * is included in all copies of any software which is or includes a copy + * or modification of this software. + * + * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION + * OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS + * SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. + */ + +#include +#include +#include +#include +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local char _tls_signal_buf[_REENT_SIGNAL_SIZE]; +#endif + +char * +strsignal (int signal) +{ + char *buffer; + struct _reent *ptr; + + ptr = _REENT; + + _REENT_CHECK_SIGNAL_BUF(ptr); + buffer = _REENT_SIGNAL_BUF(ptr); + +#if defined(SIGRTMIN) && defined(SIGRTMAX) + if ((signal >= SIGRTMIN) && (signal <= SIGRTMAX)) { + siprintf (buffer, "Real-time signal %d", signal - SIGRTMIN); + return buffer; + } +#endif + + switch (signal) { +#ifdef SIGHUP + case SIGHUP: + buffer = "Hangup"; + break; +#endif +#ifdef SIGINT + case SIGINT: + buffer = "Interrupt"; + break; +#endif +#ifdef SIGQUIT + case SIGQUIT: + buffer = "Quit"; + break; +#endif +#ifdef SIGILL + case SIGILL: + buffer = "Illegal instruction"; + break; +#endif +#ifdef SIGTRAP + case SIGTRAP: + buffer = "Trace/breakpoint trap"; + break; +#endif +#ifdef SIGIOT + #if defined(SIGABRT) && (SIGIOT != SIGABRT) + case SIGABRT: + #endif + case SIGIOT: + buffer = "IOT trap"; + break; +#endif +#ifdef SIGEMT + case SIGEMT: + buffer = "EMT trap"; + break; +#endif +#ifdef SIGFPE + case SIGFPE: + buffer = "Floating point exception"; + break; +#endif +#ifdef SIGKILL + case SIGKILL: + buffer = "Killed"; + break; +#endif +#ifdef SIGBUS + case SIGBUS: + buffer = "Bus error"; + break; +#endif +#ifdef SIGSEGV + case SIGSEGV: + buffer = "Segmentation fault"; + break; +#endif +#ifdef SIGSYS + case SIGSYS: + buffer = "Bad system call"; + break; +#endif +#ifdef SIGPIPE + case SIGPIPE: + buffer = "Broken pipe"; + break; +#endif +#ifdef SIGALRM + case SIGALRM: + buffer = "Alarm clock"; + break; +#endif +#ifdef SIGTERM + case SIGTERM: + buffer = "Terminated"; + break; +#endif +#ifdef SIGURG + case SIGURG: + buffer = "Urgent I/O condition"; + break; +#endif +#ifdef SIGSTOP + case SIGSTOP: + buffer = "Stopped (signal)"; + break; +#endif +#ifdef SIGTSTP + case SIGTSTP: + buffer = "Stopped"; + break; +#endif +#ifdef SIGCONT + case SIGCONT: + buffer = "Continued"; + break; +#endif +#ifdef SIGCHLD + #if defined(SIGCLD) && (SIGCHLD != SIGCLD) + case SIGCLD: + #endif + case SIGCHLD: + buffer = "Child exited"; + break; +#endif +#ifdef SIGTTIN + case SIGTTIN: + buffer = "Stopped (tty input)"; + break; +#endif +#ifdef SIGTTOUT + case SIGTTOUT: + buffer = "Stopped (tty output)"; + break; +#endif +#ifdef SIGIO + #if defined(SIGPOLL) && (SIGIO != SIGPOLL) + case SIGPOLL: + #endif + case SIGIO: + buffer = "I/O possible"; + break; +#endif +#ifdef SIGWINCH + case SIGWINCH: + buffer = "Window changed"; + break; +#endif +#ifdef SIGUSR1 + case SIGUSR1: + buffer = "User defined signal 1"; + break; +#endif +#ifdef SIGUSR2 + case SIGUSR2: + buffer = "User defined signal 2"; + break; +#endif +#ifdef SIGPWR + case SIGPWR: + buffer = "Power Failure"; + break; +#endif +#ifdef SIGXCPU + case SIGXCPU: + buffer = "CPU time limit exceeded"; + break; +#endif +#ifdef SIGXFSZ + case SIGXFSZ: + buffer = "File size limit exceeded"; + break; +#endif +#ifdef SIGVTALRM + case SIGVTALRM : + buffer = "Virtual timer expired"; + break; +#endif +#ifdef SIGPROF + case SIGPROF: + buffer = "Profiling timer expired"; + break; +#endif +#if defined(SIGLOST) && SIGLOST != SIGPWR + case SIGLOST: + buffer = "Resource lost"; + break; +#endif + default: + siprintf (buffer, "Unknown signal %d", signal); + break; + } + + return buffer; +} diff --git a/lib/string/strspn.c b/lib/string/strspn.c new file mode 100644 index 0000000..baf2399 --- /dev/null +++ b/lib/string/strspn.c @@ -0,0 +1,52 @@ +/* +FUNCTION + <>---find initial match + +INDEX + strspn + +SYNOPSIS + #include + size_t strspn(const char *<[s1]>, const char *<[s2]>); + +DESCRIPTION + This function computes the length of the initial segment of + the string pointed to by <[s1]> which consists entirely of + characters from the string pointed to by <[s2]> (excluding the + terminating null character). + +RETURNS + <> returns the length of the segment found. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strspn ansi pure +*/ + +#include + +size_t +strspn (const char *s1, + const char *s2) +{ + const char *s = s1; + const char *c; + + while (*s1) + { + for (c = s2; *c; c++) + { + if (*s1 == *c) + break; + } + if (*c == '\0') + break; + s1++; + } + + return s1 - s; +} diff --git a/lib/string/strstr.c b/lib/string/strstr.c new file mode 100644 index 0000000..84e4632 --- /dev/null +++ b/lib/string/strstr.c @@ -0,0 +1,204 @@ +/* Optimized strstr function. + Copyright (c) 2018 Arm Ltd. All rights reserved. + + SPDX-License-Identifier: BSD-3-Clause + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the company may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* +FUNCTION + <>---find string segment + +INDEX + strstr + +SYNOPSIS + #include + char *strstr(const char *<[s1]>, const char *<[s2]>); + +DESCRIPTION + Locates the first occurrence in the string pointed to by <[s1]> of + the sequence of characters in the string pointed to by <[s2]> + (excluding the terminating null character). + +RETURNS + Returns a pointer to the located string segment, or a null + pointer if the string <[s2]> is not found. If <[s2]> points to + a string with zero length, <[s1]> is returned. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strstr ansi pure +*/ + +#include +#include + +#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) \ + || CHAR_BIT > 8 + +/* Small and efficient strstr implementation. */ +char * +strstr (const char *hs, const char *ne) +{ + size_t i; + int c = ne[0]; + + if (c == 0) + return (char*)hs; + + for ( ; hs[0] != '\0'; hs++) + { + if (hs[0] != c) + continue; + for (i = 1; ne[i] != 0; i++) + if (hs[i] != ne[i]) + break; + if (ne[i] == '\0') + return (char*)hs; + } + + return NULL; +} + +#else /* compilation for speed */ + +# define RETURN_TYPE char * +# define AVAILABLE(h, h_l, j, n_l) (((j) <= (h_l) - (n_l)) \ + || ((h_l) += strnlen ((const char *) (h) + (h_l), (n_l) | 2048), ((j) <= (h_l) - (n_l)))) + +# include "str-two-way.h" + +/* Number of bits used to index shift table. */ +#define SHIFT_TABLE_BITS 6 + +static inline char * +strstr2 (const unsigned char *hs, const unsigned char *ne) +{ + uint32_t h1 = (ne[0] << 16) | ne[1]; + uint32_t h2 = 0; + int c; + for (c = hs[0]; h1 != h2 && c != 0; c = *++hs) + h2 = (h2 << 16) | c; + return h1 == h2 ? (char *)hs - 2 : NULL; +} + +static inline char * +strstr3 (const unsigned char *hs, const unsigned char *ne) +{ + uint32_t h1 = (ne[0] << 24) | (ne[1] << 16) | (ne[2] << 8); + uint32_t h2 = 0; + int c; + for (c = hs[0]; h1 != h2 && c != 0; c = *++hs) + h2 = (h2 | c) << 8; + return h1 == h2 ? (char *)hs - 3 : NULL; +} + +static inline char * +strstr4 (const unsigned char *hs, const unsigned char *ne) +{ + uint32_t h1 = (ne[0] << 24) | (ne[1] << 16) | (ne[2] << 8) | ne[3]; + uint32_t h2 = 0; + int c; + for (c = hs[0]; c != 0 && h1 != h2; c = *++hs) + h2 = (h2 << 8) | c; + return h1 == h2 ? (char *)hs - 4 : NULL; +} + +/* Extremely fast strstr algorithm with guaranteed linear-time performance. + Small needles up to size 4 use a dedicated linear search. Longer needles + up to size 254 use Sunday's Quick-Search algorithm. Due to its simplicity + it has the best average performance of string matching algorithms on almost + all inputs. It uses a bad-character shift table to skip past mismatches. + By limiting the needle length to 254, the shift table can be reduced to 8 + bits per entry, lowering preprocessing overhead and minimizing cache effects. + The limit also implies the worst-case performance is linear. + Even larger needles are processed by the linear-time Two-Way algorithm. +*/ +char * +strstr (const char *haystack, const char *needle) +{ + const unsigned char *hs = (const unsigned char *) haystack; + const unsigned char *ne = (const unsigned char *) needle; + int i; + + /* Handle short needle special cases first. */ + if (ne[0] == '\0') + return (char *) hs; + if (ne[1] == '\0') + return (char*)strchr ((const char *) hs, ne[0]); + if (ne[2] == '\0') + return strstr2 (hs, ne); + if (ne[3] == '\0') + return strstr3 (hs, ne); + if (ne[4] == '\0') + return strstr4 (hs, ne); + + size_t ne_len = strlen ((const char *) ne); + size_t hs_len = strnlen ((const char *) hs, ne_len | 512); + + /* Ensure haystack length is >= needle length. */ + if (hs_len < ne_len) + return NULL; + + /* Use the Quick-Search algorithm for needle lengths less than 255. */ + if (__builtin_expect (ne_len < 255, 1)) + { + uint8_t shift[1 << SHIFT_TABLE_BITS]; + const unsigned char *end = hs + hs_len - ne_len; + + /* Initialize bad character shift hash table. */ + memset (shift, ne_len + 1, sizeof (shift)); + for (i = 0; i < ne_len; i++) + shift[ne[i] % sizeof (shift)] = ne_len - i; + + do + { + hs--; + + /* Search by skipping past bad characters. */ + size_t tmp = shift[hs[ne_len] % sizeof (shift)]; + for (hs += tmp; hs <= end; hs += tmp) + { + tmp = shift[hs[ne_len] % sizeof (shift)]; + if (memcmp (hs, ne, ne_len) == 0) + return (char*) hs; + } + if (end[ne_len] == 0) + return NULL; + end += strnlen ((const char *) (end + ne_len), 2048); + } + while (hs <= end); + + return NULL; + } + + /* Use Two-Way algorithm for very long needles. */ + return two_way_long_needle (hs, hs_len, ne, ne_len); +} +#endif /* compilation for speed */ diff --git a/lib/string/strtok.c b/lib/string/strtok.c new file mode 100644 index 0000000..2a11c91 --- /dev/null +++ b/lib/string/strtok.c @@ -0,0 +1,94 @@ +/* +FUNCTION + <>, <>, <>---get next token from a string + +INDEX + strtok + +INDEX + strtok_r + +INDEX + strsep + +SYNOPSIS + #include + char *strtok(char *restrict <[source]>, + const char *restrict <[delimiters]>); + char *strtok_r(char *restrict <[source]>, + const char *restrict <[delimiters]>, + char **<[lasts]>); + char *strsep(char **<[source_ptr]>, const char *<[delimiters]>); + +DESCRIPTION + The <> function is used to isolate sequential tokens in a + null-terminated string, <<*<[source]>>>. These tokens are delimited + in the string by at least one of the characters in <<*<[delimiters]>>>. + The first time that <> is called, <<*<[source]>>> should be + specified; subsequent calls, wishing to obtain further tokens from + the same string, should pass a null pointer instead. The separator + string, <<*<[delimiters]>>>, must be supplied each time and may + change between calls. + + The <> function returns a pointer to the beginning of each + subsequent token in the string, after replacing the separator + character itself with a null character. When no more tokens remain, + a null pointer is returned. + + The <> function has the same behavior as <>, except + a pointer to placeholder <<*<[lasts]>>> must be supplied by the caller. + + The <> function is similar in behavior to <>, except + a pointer to the string pointer must be supplied <<<[source_ptr]>>> and + the function does not skip leading delimiters. When the string starts + with a delimiter, the delimiter is changed to the null character and + the empty string is returned. Like <> and <>, the + <<*<[source_ptr]>>> is updated to the next character following the + last delimiter found or NULL if the end of string is reached with + no more delimiters. + +RETURNS + <>, <>, and <> all return a pointer to the + next token, or <> if no more tokens can be found. For + <>, a token may be the empty string. + +NOTES + <> is unsafe for multi-threaded applications. <> + and <> are thread-safe and should be used instead. + +PORTABILITY +<> is ANSI C. +<> is POSIX. +<> is a BSD extension. + +<>, <>, and <> require no supporting OS subroutines. + +QUICKREF + strtok ansi impure +*/ + +/* undef STRICT_ANSI so that strtok_r prototype will be defined */ +#undef __STRICT_ANSI__ +#include +#include +#include <_ansi.h> +#include + +#ifdef _REENT_THREAD_LOCAL +_Thread_local char *_tls_strtok_last; +#endif + +#ifndef _REENT_ONLY + +extern char *__strtok_r (char *, const char *, char **, int); + +char * +strtok (register char *__restrict s, + register const char *__restrict delim) +{ + struct _reent *reent = _REENT; + + _REENT_CHECK_MISC(reent); + return __strtok_r (s, delim, &(_REENT_STRTOK_LAST(reent)), 1); +} +#endif diff --git a/lib/string/strtok_r.c b/lib/string/strtok_r.c new file mode 100644 index 0000000..d17fd69 --- /dev/null +++ b/lib/string/strtok_r.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1988 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +char * +__strtok_r (register char *s, + register const char *delim, + char **lasts, + int skip_leading_delim) +{ + register char *spanp; + register int c, sc; + char *tok; + + + if (s == NULL && (s = *lasts) == NULL) + return (NULL); + + /* + * Skip (span) leading delimiters (s += strspn(s, delim), sort of). + */ +cont: + c = *s++; + for (spanp = (char *)delim; (sc = *spanp++) != 0;) { + if (c == sc) { + if (skip_leading_delim) { + goto cont; + } + else { + *lasts = s; + s[-1] = 0; + return (s - 1); + } + } + } + + if (c == 0) { /* no non-delimiter characters */ + *lasts = NULL; + return (NULL); + } + tok = s - 1; + + /* + * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). + * Note that delim must have one NUL; we stop if we see that, too. + */ + for (;;) { + c = *s++; + spanp = (char *)delim; + do { + if ((sc = *spanp++) == c) { + if (c == 0) + s = NULL; + else + s[-1] = 0; + *lasts = s; + return (tok); + } + } while (sc != 0); + } + /* NOTREACHED */ +} + +char * +strtok_r (register char *__restrict s, + register const char *__restrict delim, + char **__restrict lasts) +{ + return __strtok_r (s, delim, lasts, 1); +} diff --git a/lib/string/strupr.c b/lib/string/strupr.c new file mode 100644 index 0000000..a175d5c --- /dev/null +++ b/lib/string/strupr.c @@ -0,0 +1,40 @@ +/* +FUNCTION + <>---force string to uppercase + +INDEX + strupr + +SYNOPSIS + #include + char *strupr(char *<[a]>); + +DESCRIPTION + <> converts each character in the string at <[a]> to + uppercase. + +RETURNS + <> returns its argument, <[a]>. + +PORTABILITY +<> is not widely portable. + +<> requires no supporting OS subroutines. + +QUICKREF + strupr +*/ + +#include +#include + +char * +strupr (char *s) +{ + unsigned char *ucs = (unsigned char *) s; + for ( ; *ucs != '\0'; ucs++) + { + *ucs = toupper(*ucs); + } + return s; +} diff --git a/lib/string/strverscmp.c b/lib/string/strverscmp.c new file mode 100644 index 0000000..04aa721 --- /dev/null +++ b/lib/string/strverscmp.c @@ -0,0 +1,92 @@ +/* +FUNCTION + <>---version string compare + +INDEX + strverscmp + +SYNOPSIS + #define _GNU_SOURCE + #include + int strverscmp(const char *<[a]>, const char *<[b]>); + +DESCRIPTION + <> compares the string at <[a]> to + the string at <[b]> in a version-logical order. + +RETURNS + + If <<*<[a]>>> version-sorts after <<*<[b]>>>, <> returns + a number greater than zero. If the two strings match, <> + returns zero. If <<*<[a]>>> version-sorts before <<*<[b]>>>, + <> returns a number less than zero. + +PORTABILITY +<> is a GNU extension. + +<> requires no supporting OS subroutines. It uses +isdigit() from elsewhere in this library. + +QUICKREF + strverscmp +*/ + +/* +From musl src/string/strverscmp.c + +Copyright © 2005-2014 Rich Felker, et al. + +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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#define _GNU_SOURCE +#include +#include + +int strverscmp(const char *l0, const char *r0) +{ + const unsigned char *l = (const void *)l0; + const unsigned char *r = (const void *)r0; + size_t i, dp, j; + int z = 1; + + /* Find maximal matching prefix and track its maximal digit + * suffix and whether those digits are all zeros. */ + for (dp=i=0; l[i]==r[i]; i++) { + int c = l[i]; + if (!c) return 0; + if (!isdigit(c)) dp=i+1, z=1; + else if (c!='0') z=0; + } + + if (l[dp]!='0' && r[dp]!='0') { + /* If we're not looking at a digit sequence that began + * with a zero, longest digit string is greater. */ + for (j=i; isdigit(l[j]); j++) + if (!isdigit(r[j])) return 1; + if (isdigit(r[j])) return -1; + } else if (z && dp>---transform string + +INDEX + strxfrm + +SYNOPSIS + #include + size_t strxfrm(char *restrict <[s1]>, const char *restrict <[s2]>, + size_t <[n]>); + +DESCRIPTION + This function transforms the string pointed to by <[s2]> and + places the resulting string into the array pointed to by + <[s1]>. The transformation is such that if the <> + function is applied to the two transformed strings, it returns + a value greater than, equal to, or less than zero, + correspoinding to the result of a <> function applied + to the same two original strings. + + No more than <[n]> characters are placed into the resulting + array pointed to by <[s1]>, including the terminating null + character. If <[n]> is zero, <[s1]> may be a null pointer. If + copying takes place between objects that overlap, the behavior + is undefined. + + (NOT Cygwin:) The current implementation of <> simply copies + the input and does not support any language-specific transformations. + +RETURNS + The <> function returns the length of the transformed string + (not including the terminating null character). If the value returned + is <[n]> or more, the contents of the array pointed to by + <[s1]> are indeterminate. + +PORTABILITY +<> is ANSI C. + +<> requires no supporting OS subroutines. + +QUICKREF + strxfrm ansi pure +*/ + +#include + +size_t +strxfrm (char *__restrict s1, + const char *__restrict s2, + size_t n) +{ + size_t res; + res = 0; + while (n-- > 0) + { + if ((*s1++ = *s2++) != '\0') + ++res; + else + return res; + } + while (*s2) + { + ++s2; + ++res; + } + + return res; +} diff --git a/lib/string/strxfrm_l.c b/lib/string/strxfrm_l.c new file mode 100644 index 0000000..0ac5243 --- /dev/null +++ b/lib/string/strxfrm_l.c @@ -0,0 +1,71 @@ +/* +FUNCTION + <>---transform string + +INDEX + strxfrm_l + +SYNOPSIS + #include + size_t strxfrm_l(char *restrict <[s1]>, const char *restrict <[s2]>, + size_t <[n]>, locale_t <[locale]>); + +DESCRIPTION + This function transforms the string pointed to by <[s2]> and + places the resulting string into the array pointed to by + <[s1]>. The transformation is such that if the <> + function is applied to the two transformed strings, it returns + a value greater than, equal to, or less than zero, + correspoinding to the result of a <> function applied + to the same two original strings. + + No more than <[n]> characters are placed into the resulting + array pointed to by <[s1]>, including the terminating null + character. If <[n]> is zero, <[s1]> may be a null pointer. If + copying takes place between objects that overlap, the behavior + is undefined. + + (NOT Cygwin:) The current implementation of <> simply copies + the input and does not support any language-specific transformations. + + If <[locale]> is LC_GLOBAL_LOCALE or not a valid locale object, the + behaviour is undefined. + +RETURNS + The <> function returns the length of the transformed string + (not including the terminating null character). If the value returned + is <[n]> or more, the contents of the array pointed to by + <[s1]> are indeterminate. + +PORTABILITY +<> is POSIX-1.2008. + +<> requires no supporting OS subroutines. + +QUICKREF + strxfrm_l ansi pure +*/ + +#include + +size_t +strxfrm_l (char *__restrict s1, const char *__restrict s2, size_t n, + struct __locale_t *locale) +{ + size_t res; + res = 0; + while (n-- > 0) + { + if ((*s1++ = *s2++) != '\0') + ++res; + else + return res; + } + while (*s2) + { + ++s2; + ++res; + } + + return res; +} diff --git a/lib/string/swab.c b/lib/string/swab.c new file mode 100644 index 0000000..28ab978 --- /dev/null +++ b/lib/string/swab.c @@ -0,0 +1,37 @@ +/* +FUNCTION + <>---swap adjacent bytes + +SYNOPSIS + #include + void swab(const void *<[in]>, void *<[out]>, ssize_t <[n]>); + +DESCRIPTION + This function copies <[n]> bytes from the memory region + pointed to by <[in]> to the memory region pointed to by + <[out]>, exchanging adjacent even and odd bytes. + +PORTABILITY +<> requires no supporting OS subroutines. +*/ + +#include + +void +swab (const void *b1, + void *b2, + ssize_t length) +{ + const char *from = b1; + char *to = b2; + ssize_t ptr; + for (ptr = 1; ptr < length; ptr += 2) + { + char p = from[ptr]; + char q = from[ptr-1]; + to[ptr-1] = p; + to[ptr ] = q; + } + if (ptr == length) /* I.e., if length is odd, */ + to[ptr-1] = 0; /* then pad with a NUL. */ +} diff --git a/lib/string/timingsafe_bcmp.c b/lib/string/timingsafe_bcmp.c new file mode 100644 index 0000000..0b73615 --- /dev/null +++ b/lib/string/timingsafe_bcmp.c @@ -0,0 +1,29 @@ +/* $OpenBSD: timingsafe_bcmp.c,v 1.2 2014/06/10 04:17:37 deraadt Exp $ */ +/* + * Copyright (c) 2010 Damien Miller. All rights reserved. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +int +timingsafe_bcmp(const void *b1, const void *b2, size_t n) +{ + const unsigned char *p1 = b1, *p2 = b2; + int ret = 0; + + for (; n > 0; n--) + ret |= *p1++ ^ *p2++; + return (ret != 0); +} diff --git a/lib/string/timingsafe_memcmp.c b/lib/string/timingsafe_memcmp.c new file mode 100644 index 0000000..04e2ac5 --- /dev/null +++ b/lib/string/timingsafe_memcmp.c @@ -0,0 +1,46 @@ +/* $OpenBSD: timingsafe_memcmp.c,v 1.1 2014/06/13 02:12:17 matthew Exp $ */ +/* + * Copyright (c) 2014 Google Inc. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +int +timingsafe_memcmp(const void *b1, const void *b2, size_t len) +{ + const unsigned char *p1 = b1, *p2 = b2; + size_t i; + int res = 0, done = 0; + + for (i = 0; i < len; i++) { + /* lt is -1 if p1[i] < p2[i]; else 0. */ + int lt = (p1[i] - p2[i]) >> CHAR_BIT; + + /* gt is -1 if p1[i] > p2[i]; else 0. */ + int gt = (p2[i] - p1[i]) >> CHAR_BIT; + + /* cmp is 1 if p1[i] > p2[i]; -1 if p1[i] < p2[i]; else 0. */ + int cmp = lt - gt; + + /* set res = cmp if !done. */ + res |= cmp & ~done; + + /* set done if p1[i] != p2[i]. */ + done |= lt | gt; + } + + return (res); +} diff --git a/lib/string/u_strerr.c b/lib/string/u_strerr.c new file mode 100644 index 0000000..cde05ad --- /dev/null +++ b/lib/string/u_strerr.c @@ -0,0 +1,14 @@ +#include <_ansi.h> + +char * +_user_strerror (int errnum, + int internal, + int *errptr) +{ + /* prevent warning about unused parameters */ + (void) errnum; + (void) internal; + (void) errptr; + + return 0; +} diff --git a/lib/string/uniset b/lib/string/uniset new file mode 100644 index 0000000..b118dd6 --- /dev/null +++ b/lib/string/uniset @@ -0,0 +1,697 @@ +#!/usr/bin/perl +# Uniset -- Unicode subset manager -- Markus Kuhn +# http://www.cl.cam.ac.uk/~mgk25/download/uniset.tar.gz + +require 5.014; +use open ':utf8'; +use FindBin qw($RealBin); # to find directory where this file is located + +binmode(STDOUT, ":utf8"); +binmode(STDIN, ":utf8"); + +my (%name, %invname, %category, %comment); + +print <. + +yyyy yyyy (optionally prefixed with 0x) is a Unicode character + belonging to the specified subset. + +yyyy-yyyy a range of Unicode characters belonging to +yyyy..yyyy the specified subset. + +xx yy yy yy-yy yy xx denotes a row (high-byte) and the yy specify + corresponding low bytes or with a hyphen also ranges of + low bytes in the Unicode values that belong to this + subset. This is also the format that is generated by + the compact command. +End +exit 1 if $#ARGV < 0; + + +# Subroutine to identify whether the ISO 10646/Unicode character code +# ucs belongs into the East Asian Wide (W) or East Asian FullWidth +# (F) category as defined in Unicode Technical Report #11. + +sub iswide ($) { + my $ucs = shift(@_); + + return ($ucs >= 0x1100 && + ($ucs <= 0x115f || # Hangul Jamo + $ucs == 0x2329 || $ucs == 0x232a || + ($ucs >= 0x2e80 && $ucs <= 0xa4cf && + $ucs != 0x303f) || # CJK .. Yi + ($ucs >= 0xac00 && $ucs <= 0xd7a3) || # Hangul Syllables + ($ucs >= 0xf900 && $ucs <= 0xfaff) || # CJK Comp. Ideographs + ($ucs >= 0xfe30 && $ucs <= 0xfe6f) || # CJK Comp. Forms + ($ucs >= 0xff00 && $ucs <= 0xff60) || # Fullwidth Forms + ($ucs >= 0xffe0 && $ucs <= 0xffe6) || + ($ucs >= 0x20000 && $ucs <= 0x2fffd) || + ($ucs >= 0x30000 && $ucs <= 0x3fffd))); +} + +# Return the Unicode name that belongs to a given character code + +# Jamo short names, see Unicode 3.0, table 4-4, page 86 + +my @lname = ('G', 'GG', 'N', 'D', 'DD', 'R', 'M', 'B', 'BB', 'S', 'SS', '', + 'J', 'JJ', 'C', 'K', 'T', 'P', 'H'); # 1100..1112 +my @vname = ('A', 'AE', 'YA', 'YAE', 'EO', 'E', 'YEO', 'YE', 'O', + 'WA', 'WAE', 'OE', 'YO', 'U', 'WEO', 'WE', 'WI', 'YU', + 'EU', 'YI', 'I'); # 1161..1175 +my @tname = ('G', 'GG', 'GS', 'N', 'NJ', 'NH', 'D', 'L', 'LG', 'LM', + 'LB', 'LS', 'LT', 'LP', 'LH', 'M', 'B', 'BS', 'S', 'SS', + 'NG', 'J', 'C', 'K', 'T', 'P', 'H'); # 11a8..11c2 + +sub name { + my $ucs = shift(@_); + + # The intervals used here reflect Unicode Version 3.2 + if (($ucs >= 0x3400 && $ucs <= 0x4db5) || + ($ucs >= 0x4e00 && $ucs <= 0x9fa5) || + ($ucs >= 0x20000 && $ucs <= 0x2a6d6)) { + return "CJK UNIFIED IDEOGRAPH-" . sprintf("%04X", $ucs); + } + + if ($ucs >= 0xac00 && $ucs <= 0xd7a3) { + my $s = $ucs - 0xac00; + my $l = 0x1100 + int($s / (21 * 28)); + my $v = 0x1161 + int(($s % (21 * 28)) / 28); + my $t = 0x11a7 + $s % 28; + return "HANGUL SYLLABLE " . + ($lname[int($s / (21 * 28))] . + $vname[int(($s % (21 * 28)) / 28)] . + $tname[$s % 28 - 1]); + } + + return $name{$ucs}; +} + +sub is_unicode { + my $ucs = shift(@_); + + # The intervals used here reflect Unicode Version 3.2 + if (($ucs >= 0x3400 && $ucs <= 0x4db5) || + ($ucs >= 0x4e00 && $ucs <= 0x9fa5) || + ($ucs >= 0xac00 && $ucs <= 0xd7a3) || + ($ucs >= 0x20000 && $ucs <= 0x2a6d6)) { + return 1; + } + + return exists $name{$ucs}; +} + +my @search_path = (); +if ($RealBin =~ m|^(.*)/bin\z| && -d "$1/share/uniset") { + push @search_path, "$1/share/uniset"; +} else { + push @search_path, $RealBin; +} + +sub search_open { + my ($mode, $fn) = @_; + my $file; + return $file if open($file, $mode, $fn); + return undef if $fn =~ m|/|; + for my $path (@search_path) { + return $file if open($file, $mode, "$path/$fn"); + } + return undef; +} + +my $html = 0; +my $image = 0; +my $adducs = 0; +my $unicodedata = "UnicodeData.txt"; +my $blockdata = "Blocks.txt"; + +# read list of all Unicode names +my $data = search_open('<', $unicodedata); +unless ($data) { + die ("Can't open Unicode database '$unicodedata':\n$!\n\n" . + "Please make sure that you have downloaded the file\n" . + "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n"); +} +while (<$data>) { + if (/^([0-9,A-F]{4,8});([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*)$/) { + next if $2 ne '' && substr($2, 0, 1) eq '<'; + $ucs = hex($1); + $name{$ucs} = $2; + $invname{$2} = $ucs; + $category{$ucs} = $3; + $comment{$ucs} = $12; + } else { + die("Syntax error in line '$_' in file '$unicodedata'\n"); + } +} +close($data); + +# read list of all Unicode blocks +$data = search_open('<', $blockdata); +unless ($data) { + die ("Can't open Unicode blockname list '$blockdata':\n$!\n\n" . + "Please make sure that you have downloaded the file\n" . + "http://www.unicode.org/Public/UNIDATA/Blocks.txt\n"); +} +my $blocks = 0; +my (@blockstart, @blockend, @blockname); +while (<$data>) { + if (/^\s*([0-9,A-F]{4,8})\s*\.\.\s*([0-9,A-F]{4,8})\s*;\s*(.*)$/) { + $blockstart[$blocks] = hex($1); + $blockend [$blocks] = hex($2); + $blockname [$blocks] = $3; + $blocks++; + } elsif (/^\s*\#/ || /^\s*$/) { + # ignore comments and empty lines + } else { + die("Syntax error in line '$_' in file '$blockdata'\n"); + } +} +close($data); +if ($blockend[$blocks-1] < 0x110000) { + $blockstart[$blocks] = 0x110000; + $blockend [$blocks] = 0x7FFFFFFF; + $blockname [$blocks] = "Beyond Plane 16"; + $blocks++; +} + +# process command line arguments +while ($_ = shift(@ARGV)) { + if (/^html$/) { + $html = 1; + } elsif (/^ucs$/) { + $adducs = 1; + } elsif (/^img$/) { + $html = 1; + $image = 1; + } elsif (/^template$/) { + $template = shift(@ARGV); + open(TEMPLATE, $template) || die("Can't open template file '$template': $!\n"); + while (